diff --git a/retroshare-gui/src/gui/GeneralMsgDialog.cpp b/retroshare-gui/src/gui/GeneralMsgDialog.cpp index d96f03731..4d34fb7ad 100644 --- a/retroshare-gui/src/gui/GeneralMsgDialog.cpp +++ b/retroshare-gui/src/gui/GeneralMsgDialog.cpp @@ -36,7 +36,7 @@ /** Constructor */ GeneralMsgDialog::GeneralMsgDialog(QWidget *parent, uint32_t type) -: QDialog (parent) +: QDialog (parent), mCheckAttachment(true) { /* Invoke the Qt Designer generated object setup routine */ setupUi(this); @@ -234,12 +234,12 @@ void GeneralMsgDialog::parseRsFileListAttachments(std::string attachList) std::cerr << "Item Ok" << std::endl; if (source == "Local") { - addAttachment(hash, fname, size); + addAttachment(hash, fname, size, true, ""); } else { // TEMP NOT ALLOWED UNTIL FT WORKING. - //addAttachment(hash, fname, size); + addAttachment(hash, fname, size, false, source); } } @@ -252,21 +252,38 @@ void GeneralMsgDialog::parseRsFileListAttachments(std::string attachList) } -void GeneralMsgDialog::addAttachment(std::string hash, std::string fname, uint64_t size) +void GeneralMsgDialog::addAttachment(std::string hash, std::string fname, uint64_t size, bool local, std::string srcId) { /* add a SubFileItem to the attachment section */ std::cerr << "GeneralMsgDialog::addAttachment()"; std::cerr << std::endl; /* add widget in for new destination */ - SubFileItem *file = new SubFileItem(hash, fname, size); + + uint32_t flags = SFI_TYPE_ATTACH; + if (local) + { + flags |= SFI_STATE_LOCAL; + } + else + { + flags |= SFI_STATE_REMOTE; + // TMP REMOVED REMOTE ADD FOR DEMONSTRATOR + return; + } + + SubFileItem *file = new SubFileItem(hash, fname, size, flags, srcId); mAttachments.push_back(file); QLayout *layout = fileFrame->layout(); layout->addWidget(file); - return; + if (mCheckAttachment) + { + checkAttachmentReady(); + } + return; } @@ -277,16 +294,54 @@ void GeneralMsgDialog::addAttachment(std::string path) std::cerr << std::endl; /* add widget in for new destination */ - SubFileItem *file = new SubFileItem("unknownHash", path, 12000); + SubFileItem *file = new SubFileItem(path); mAttachments.push_back(file); QLayout *layout = fileFrame->layout(); layout->addWidget(file); + if (mCheckAttachment) + { + checkAttachmentReady(); + } + return; } +void GeneralMsgDialog::checkAttachmentReady() +{ + std::list::iterator fit; + + mCheckAttachment = false; + + for(fit = mAttachments.begin(); fit != mAttachments.end(); fit++) + { + if (!(*fit)->isHidden()) + { + if (!(*fit)->ready()) + { + /* + */ + buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); + break; + + + return; + } + } + } + + if (fit == mAttachments.end()) + { + buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true); + } + + /* repeat... */ + int msec_rate = 1000; + QTimer::singleShot( msec_rate, this, SLOT(checkAttachmentReady(void))); +} + void GeneralMsgDialog::cancelMsg() { @@ -475,6 +530,16 @@ void GeneralMsgDialog::sendMsg() fi.size = (*fit)->FileSize(); files.push_back(fi); + + /* commence downloads - if we don't have the file */ + if (!(*fit)->done()) + { + if ((*fit)->ready()) + { + (*fit)->download(); + } + // Skips unhashed files. + } } } diff --git a/retroshare-gui/src/gui/GeneralMsgDialog.h b/retroshare-gui/src/gui/GeneralMsgDialog.h index 8bb5ca224..8a345c6bc 100644 --- a/retroshare-gui/src/gui/GeneralMsgDialog.h +++ b/retroshare-gui/src/gui/GeneralMsgDialog.h @@ -43,7 +43,8 @@ public: /** Default Destructor */ void addAttachment(std::string path); - void addAttachment(std::string hash, std::string fname, uint64_t size); + void addAttachment(std::string hash, std::string fname, uint64_t size, + bool local, std::string srcId); void addDestination(uint32_t type, std::string grpId, std::string inReplyTo); void setMsgType(uint32_t type); @@ -53,6 +54,7 @@ virtual void dragEnterEvent(QDragEnterEvent *event); virtual void dropEvent(QDropEvent *event); private slots: + void checkAttachmentReady(); void updateGroupId(); void newDestination(); void cancelMsg(); @@ -69,6 +71,8 @@ void sendMessage(uint32_t type, std::string grpId, std::string inReplyTo, /* maps of files and destinations */ std::list mDestinations; std::list mAttachments; + + bool mCheckAttachment; }; diff --git a/retroshare-gui/src/gui/PeersFeed.cpp b/retroshare-gui/src/gui/PeersFeed.cpp index 6a0e96985..7fa0c0a3c 100644 --- a/retroshare-gui/src/gui/PeersFeed.cpp +++ b/retroshare-gui/src/gui/PeersFeed.cpp @@ -30,8 +30,9 @@ #include "GeneralMsgDialog.h" const uint32_t PEERSFEED_MODE_FRIENDS = 0x0000; -const uint32_t PEERSFEED_MODE_FOF = 0x0001; -const uint32_t PEERSFEED_MODE_ALL = 0x0002; +const uint32_t PEERSFEED_MODE_ONLINE = 0x0001; +const uint32_t PEERSFEED_MODE_FOF = 0x0002; +const uint32_t PEERSFEED_MODE_ALL = 0x0003; /** Constructor */ PeersFeed::PeersFeed(QWidget *parent) @@ -127,6 +128,10 @@ void PeersFeed::updatePeers() { rsPeers->getFriendList(peers); } + else if (mMode == PEERSFEED_MODE_ONLINE) + { + rsPeers->getOnlineList(peers); + } else if (mMode == PEERSFEED_MODE_ALL) { rsPeers->getOthersList(peers); diff --git a/retroshare-gui/src/gui/PeersFeed.ui b/retroshare-gui/src/gui/PeersFeed.ui index 6b61cf0f7..149dbd693 100644 --- a/retroshare-gui/src/gui/PeersFeed.ui +++ b/retroshare-gui/src/gui/PeersFeed.ui @@ -60,7 +60,12 @@ - Friends Only + Friends + + + + + Online Friends diff --git a/retroshare-gui/src/gui/TransferFeed.cpp b/retroshare-gui/src/gui/TransferFeed.cpp index 2bc7f3bf0..0df10763b 100644 --- a/retroshare-gui/src/gui/TransferFeed.cpp +++ b/retroshare-gui/src/gui/TransferFeed.cpp @@ -202,9 +202,17 @@ void TransferFeed::updateDownloads() /* add in new ones */ for(it = toAdd.begin(); it != toAdd.end(); it++) { - SubFileItem *fi = new SubFileItem(*it, "FileName", 123498); - mDownloads[*it] = fi; - mDownloadsLayout->addWidget(fi); + FileInfo fi; + uint32_t hintflags = RS_FILE_HINTS_DOWNLOAD + | RS_FILE_HINTS_SPEC_ONLY; + + if (rsFiles->FileDetails(*it, hintflags, fi)) + { + SubFileItem *sfi = new SubFileItem(*it, fi.fname, + fi.size, SFI_STATE_DOWNLOAD, fi.source); + mDownloads[*it] = sfi; + mDownloadsLayout->addWidget(sfi); + } } } @@ -284,9 +292,17 @@ void TransferFeed::updateUploads() /* add in new ones */ for(it = toAdd.begin(); it != toAdd.end(); it++) { - SubFileItem *fi = new SubFileItem(*it, "FileName", 123498); - mUploads[*it] = fi; - mUploadsLayout->addWidget(fi); + FileInfo fi; + uint32_t hintflags = RS_FILE_HINTS_UPLOAD + | RS_FILE_HINTS_SPEC_ONLY; + + if (rsFiles->FileDetails(*it, hintflags, fi)) + { + SubFileItem *sfi = new SubFileItem(*it, fi.fname, + fi.size, SFI_STATE_UPLOAD, fi.source); + mUploads[*it] = sfi; + mUploadsLayout->addWidget(sfi); + } } } diff --git a/retroshare-gui/src/gui/feeds/BlogMsgItem.cpp b/retroshare-gui/src/gui/feeds/BlogMsgItem.cpp index 02aa779c3..3c039e1bc 100644 --- a/retroshare-gui/src/gui/feeds/BlogMsgItem.cpp +++ b/retroshare-gui/src/gui/feeds/BlogMsgItem.cpp @@ -59,9 +59,9 @@ void BlogMsgItem::updateItemStatic() std::cerr << std::endl; #endif - msgLabel->setText("FFFFFFFFFFF AAAAAAAAAAAAAAA \n HHHHHHHHHHH HHHHHHHHHHHHHHHHH"); - titleLabel->setText("Channel Feed: Best Channel Ever"); - subjectLabel->setText("Brand new exciting Ever"); + msgLabel->setText("What did you expect? \nThe Blogs will be up and running shortly!"); + titleLabel->setText("Blog Feed: Jacki @ Friday"); + subjectLabel->setText("Brand new exciting Blog stuff"); /* add Files */ int total = (int) (10.0 * (rand() / (RAND_MAX + 1.0))); @@ -70,7 +70,7 @@ void BlogMsgItem::updateItemStatic() for(i = 0; i < total; i++) { /* add file */ - SubFileItem *fi = new SubFileItem("dummyHash", "dummyFileName", 1283918); + SubFileItem *fi = new SubFileItem("dummyHash", "dummy_File", 1283918, SFI_STATE_REMOTE, mPeerId); mFileItems.push_back(fi); QLayout *layout = expandFrame->layout(); diff --git a/retroshare-gui/src/gui/feeds/ChanMsgItem.cpp b/retroshare-gui/src/gui/feeds/ChanMsgItem.cpp index e93180a9a..c9d53562c 100644 --- a/retroshare-gui/src/gui/feeds/ChanMsgItem.cpp +++ b/retroshare-gui/src/gui/feeds/ChanMsgItem.cpp @@ -94,7 +94,8 @@ void ChanMsgItem::updateItemStatic() for(it = cmi.files.begin(); it != cmi.files.end(); it++) { /* add file */ - SubFileItem *fi = new SubFileItem(it->hash, it->fname, it->size); + SubFileItem *fi = new SubFileItem(it->hash, it->fname, it->size, + SFI_STATE_REMOTE | SFI_TYPE_CHANNEL, ""); mFileItems.push_back(fi); QLayout *layout = expandFrame->layout(); diff --git a/retroshare-gui/src/gui/feeds/MsgItem.cpp b/retroshare-gui/src/gui/feeds/MsgItem.cpp index 7d4d878dd..609ecba87 100644 --- a/retroshare-gui/src/gui/feeds/MsgItem.cpp +++ b/retroshare-gui/src/gui/feeds/MsgItem.cpp @@ -125,7 +125,7 @@ void MsgItem::updateItemStatic() for(it = mi.files.begin(); it != mi.files.end(); it++) { /* add file */ - SubFileItem *fi = new SubFileItem(it->hash, it->fname, it->size); + SubFileItem *fi = new SubFileItem(it->hash, it->fname, it->size, SFI_STATE_REMOTE, mi.srcId); mFileItems.push_back(fi); QLayout *layout = expandFrame->layout(); diff --git a/retroshare-gui/src/gui/feeds/SubFileItem.cpp b/retroshare-gui/src/gui/feeds/SubFileItem.cpp index 376460b1b..350ac7ab8 100644 --- a/retroshare-gui/src/gui/feeds/SubFileItem.cpp +++ b/retroshare-gui/src/gui/feeds/SubFileItem.cpp @@ -22,26 +22,129 @@ #include "SubFileItem.h" +#include "rsiface/rsfiles.h" + #include #define DEBUG_ITEM 1 +/******************************************************************* + * SubFileItem fully controls the file transfer from the gui side + * + * Display: (In order) + * + * 1) HASHING + * 2) REMOTE / DOWNLOAD + * 3) LOCAL + * 4) LOCAL / UPLOAD + * + * Behaviours: + * a) Addition to General Dialog (1), (2), (3) + * (i) (1), request Hash -> (3). + * (ii) (2), download complete -> (3) + * (iii) (3) + * + * b) Message/Blog/Channel (2), (3) + * (i) (2), download complete -> (3) + * (ii) (3) + * + * c) Transfers (2), (4) + * (i) (2) + * (ii) (3) + * + * + */ + + + +const uint32_t SFI_DEFAULT_PERIOD = (30 * 3600 * 24); /* 30 Days */ + /** Constructor */ -SubFileItem::SubFileItem(std::string hash, std::string name, uint64_t size) -:QWidget(NULL), mFileHash(hash), mFileName(name), mFileSize(size) +SubFileItem::SubFileItem(std::string hash, std::string name, uint64_t size, + uint32_t flags, std::string srcId) +:QWidget(NULL), mFileHash(hash), mFileName(name), mFileSize(size), mSrcId(srcId) { - /* Invoke the Qt Designer generated object setup routine */ - setupUi(this); + /* Invoke the Qt Designer generated object setup routine */ + setupUi(this); + mMode = flags & SFI_MASK_STATE; + mType = flags & SFI_MASK_TYPE; + + if (mMode == SFI_STATE_EXTRA) + { + mMode = SFI_STATE_ERROR; + } + /* all other states are possible */ + + if (!rsFiles) + { + mMode = SFI_STATE_ERROR; + } + + Setup(); +} + +/** Constructor */ +SubFileItem::SubFileItem(std::string path) +:QWidget(NULL), mPath(path), mFileSize(0) +{ + /* Invoke the Qt Designer generated object setup routine */ + setupUi(this); + + mMode = SFI_STATE_EXTRA; + mType = SFI_TYPE_ATTACH; + + /* ask for Files to hash/prepare it for us */ + if ((!rsFiles) || (rsFiles->ExtraFileHash(path, SFI_DEFAULT_PERIOD, 0))) + { + mMode = SFI_STATE_ERROR; + } + + Setup(); +} + + +void SubFileItem::Setup() +{ connect( expandButton, SIGNAL( clicked( void ) ), this, SLOT( toggle ( void ) ) ); - connect( cancelButton, SIGNAL( clicked( void ) ), this, SLOT( cancel ( void ) ) ); connect( playButton, SIGNAL( clicked( void ) ), this, SLOT( play ( void ) ) ); + connect( downloadButton, SIGNAL( clicked( void ) ), this, SLOT( download ( void ) ) ); + connect( cancelButton, SIGNAL( clicked( void ) ), this, SLOT( cancel ( void ) ) ); + connect( saveButton, SIGNAL( clicked( void ) ), this, SLOT( save ( void ) ) ); - amountDone = 1000; + /* once off check - if remote, check if we have it + * NB: This check might be expensive - and it'll happen often! + */ + if (mMode == SFI_STATE_REMOTE) + { + FileInfo fi; + uint32_t hintflags = RS_FILE_HINTS_EXTRA | RS_FILE_HINTS_LOCAL + | RS_FILE_HINTS_SPEC_ONLY; + + /* look up path */ + if (rsFiles->FileDetails(mFileHash, hintflags, fi)) + { + mMode = SFI_STATE_LOCAL; + mPath = fi.path; + } + } small(); updateItemStatic(); updateItem(); + + +} + + +bool SubFileItem::done() +{ + return (mMode >= SFI_STATE_LOCAL); +} + +bool SubFileItem::ready() +{ + return (mMode >= SFI_STATE_REMOTE); } void SubFileItem::updateItemStatic() @@ -52,34 +155,162 @@ void SubFileItem::updateItemStatic() std::cerr << std::endl; #endif - QString filename = "Biggest_File.txt"; - fileLabel->setText(filename); - fileLabel->setToolTip(filename); - - playButton->setEnabled(false); + QString filename = QString::fromStdString(mFileName); + mDivisor = 1; if (mFileSize > 10000000) /* 10 Mb */ { progressBar->setRange(0, mFileSize / 1000000); progressBar->setFormat("%v MB"); + mDivisor = 1000000; } else if (mFileSize > 10000) /* 10 Kb */ { progressBar->setRange(0, mFileSize / 1000); progressBar->setFormat("%v kB"); + mDivisor = 1000; } else { progressBar->setRange(0, mFileSize); progressBar->setFormat("%v B"); + mDivisor = 1; } -} -bool SubFileItem::done() -{ - return (amountDone >= mFileSize); -} + /* get full path for local file */ + // TMP DISABLED FOR DEMONSTRATOR.... XXX +#if 0 + if ((mMode == SFI_STATE_LOCAL) || (mMode == SFI_STATE_UPLOAD)) + { + if (mPath == "") + { + FileInfo fi; + uint32_t hintflags = RS_FILE_HINTS_UPLOAD | RS_FILE_HINTS_LOCAL + | RS_FILE_HINTS_SPEC_ONLY; + /* look up path */ + if (!rsFiles->FileDetails(mFileHash, hintflags, fi)) + { + mMode = SFI_STATE_ERROR; + } + else + { + // XXX CHECK VALID PATH! + mPath = fi.path; + } + } + } +#endif + + /* do buttons + display */ + switch (mMode) + { + case SFI_STATE_ERROR: + progressBar->setRange(0, 100); + progressBar->setFormat("ERROR"); + + playButton->setEnabled(false); + downloadButton->setEnabled(false); + cancelButton->setEnabled(false); + expandButton->setEnabled(false); + + progressBar->setValue(0); + filename = "[ERROR] " + filename; + + break; + + case SFI_STATE_EXTRA: + filename = QString::fromStdString(mPath); + + progressBar->setRange(0, 100); + progressBar->setFormat("HASHING"); + + playButton->setEnabled(false); + downloadButton->setEnabled(false); + cancelButton->setEnabled(false); + expandButton->setEnabled(false); + + progressBar->setValue(0); + filename = "[EXTRA] " + filename; + + break; + + case SFI_STATE_REMOTE: + playButton->setEnabled(false); + downloadButton->setEnabled(true); + cancelButton->setEnabled(false); + expandButton->setEnabled(false); + + progressBar->setValue(0); + filename = "[REMOTE] " + filename; + + break; + + case SFI_STATE_DOWNLOAD: + playButton->setEnabled(false); + downloadButton->setEnabled(false); + cancelButton->setEnabled(true); + expandButton->setEnabled(true); + filename = "[DOWNLOAD] " + filename; + + break; + + case SFI_STATE_LOCAL: + playButton->setEnabled(true); + downloadButton->setEnabled(false); + cancelButton->setEnabled(false); + expandButton->setEnabled(false); + + progressBar->setValue(mFileSize / mDivisor); + filename = "[LOCAL] " + filename; + + break; + + case SFI_STATE_UPLOAD: + playButton->setEnabled(true); + downloadButton->setEnabled(false); + cancelButton->setEnabled(false); + expandButton->setEnabled(true); + filename = "[UPLOAD] " + filename; + + break; + } + + saveButton->hide(); + + switch(mType) + { + case SFI_TYPE_CHANNEL: + { + saveButton->show(); + if (mMode == SFI_STATE_LOCAL) + { + saveButton->setEnabled(true); + } + else + { + saveButton->setEnabled(false); + } + } + break; + case SFI_TYPE_ATTACH: + { + playButton->hide(); + downloadButton->hide(); + cancelButton->setEnabled(true); + cancelButton->setToolTip("Remove Attachment"); + expandButton->hide(); + } + break; + default: + break; + } + + + fileLabel->setText(filename); + fileLabel->setToolTip(filename); + +} void SubFileItem::updateItem() { @@ -88,36 +319,148 @@ void SubFileItem::updateItem() std::cerr << "SubFileItem::updateItem()"; std::cerr << std::endl; #endif + + /* Extract File Details */ + /* Update State if necessary */ + + FileInfo fi; + bool stateChanged = false; int msec_rate = 1000; - uint64_t divisor = 1; - if (mFileSize > 10000000) /* 10 Mb */ + if ((mMode == SFI_STATE_ERROR) || (mMode == SFI_STATE_LOCAL)) { - divisor = 1000000; + /* ignore - dead file, or done */ } - else if (mFileSize > 10000) /* 10 Kb */ + else if (mMode == SFI_STATE_EXTRA) { - divisor = 1000; - } + /* check for file status */ + if (rsFiles->ExtraFileStatus(mPath, fi)) + { + mMode = SFI_STATE_LOCAL; - if (amountDone < mFileSize) - { - amountDone *= 1.1; + /* fill in file details */ + mFileName = fi.fname; + mFileSize = fi.size; + mFileHash = fi.hash; - progressBar->setValue(amountDone / divisor); - QTimer::singleShot( msec_rate, this, SLOT(updateItem( void ) )); + /* have path already! */ + + stateChanged = true; + } } else { - /* complete! */ - amountDone = mFileSize + 1; - progressBar->setValue(mFileSize / divisor); - playButton->setEnabled(true); + uint32_t hintflags = 0; + switch(mMode) + { + case SFI_STATE_REMOTE: + hintflags = RS_FILE_HINTS_DOWNLOAD | RS_FILE_HINTS_SPEC_ONLY; + break; + case SFI_STATE_DOWNLOAD: + hintflags = RS_FILE_HINTS_DOWNLOAD | RS_FILE_HINTS_SPEC_ONLY; + break; + case SFI_STATE_UPLOAD: + hintflags = RS_FILE_HINTS_UPLOAD | RS_FILE_HINTS_SPEC_ONLY; + break; + } + + bool detailsOk = rsFiles->FileDetails(mFileHash, hintflags, fi); + + /* have details - see if state has changed */ + switch(mMode) + { + case SFI_STATE_REMOTE: + /* is it downloading? */ + if (detailsOk) + { + /* downloading */ + mMode = SFI_STATE_DOWNLOAD; + stateChanged = true; + } + break; + case SFI_STATE_DOWNLOAD: + + if (!detailsOk) + { + mMode = SFI_STATE_REMOTE; + stateChanged = true; + } + else + { + /* has it completed? */ + if (fi.avail == mFileSize) + { + /* save path */ + /* update progress */ + mMode = SFI_STATE_LOCAL; + mPath = fi.path; + stateChanged = true; + } + progressBar->setValue(fi.avail / mDivisor); + } + break; + case SFI_STATE_UPLOAD: + + if (detailsOk) + { + progressBar->setValue(fi.avail / mDivisor); + } + + /* update progress */ + break; + } + } - + + /****** update based on new state ******/ + if (stateChanged) + { + updateItemStatic(); + } + + uint32_t repeat = 0; + switch (mMode) + { + case SFI_STATE_ERROR: + repeat = 0; + break; + + case SFI_STATE_EXTRA: + repeat = 1; + msec_rate = 5000; /* slow */ + break; + + case SFI_STATE_REMOTE: + repeat = 1; + msec_rate = 30000; /* very slow */ + break; + + case SFI_STATE_DOWNLOAD: + repeat = 1; + msec_rate = 2000; /* should be download rate dependent */ + break; + + case SFI_STATE_LOCAL: + repeat = 0; + break; + + case SFI_STATE_UPLOAD: + repeat = 1; + msec_rate = 2000; /* should be download rate dependent */ + break; + } + + + if (repeat) + { + QTimer::singleShot( msec_rate, this, SLOT(updateItem( void ) )); + } + } + + void SubFileItem::small() { #ifdef DEBUG_ITEM @@ -150,6 +493,15 @@ void SubFileItem::cancel() std::cerr << "SubFileItem::cancel()"; std::cerr << std::endl; #endif + /* Only occurs - if it is downloading */ + if (mType == SFI_TYPE_ATTACH) + { + hide(); + } + else + { + rsFiles->FileCancel(mFileHash); + } } @@ -158,6 +510,40 @@ void SubFileItem::play() #ifdef DEBUG_ITEM std::cerr << "SubFileItem::play()"; std::cerr << std::endl; +#endif + /* Only occurs - if it is local / uploading (have mPath set) */ + rsFiles->FileCancel(mFileHash); +} + +void SubFileItem::download() +{ +#ifdef DEBUG_ITEM + std::cerr << "SubFileItem::download()"; + std::cerr << std::endl; +#endif + + if (mType == SFI_TYPE_CHANNEL) + { + /* send request via rsChannels -> as it knows how to do it properly */ + //std::string grpId = mSrcId; + //rsChannels->FileRequest(mFileName, mFileHash, mFileSize, grpId); + } + else + { + //rsFile->FileRequest(mFileName, mFileHash, mFileSize, "", 0, mSrcId); + } + + // TEMP + rsFiles->FileRequest(mFileName, mFileHash, mFileSize, "", 0); + +} + + +void SubFileItem::save() +{ +#ifdef DEBUG_ITEM + std::cerr << "SubFileItem::save()"; + std::cerr << std::endl; #endif } diff --git a/retroshare-gui/src/gui/feeds/SubFileItem.h b/retroshare-gui/src/gui/feeds/SubFileItem.h index 9afe0f09a..7e75467b3 100644 --- a/retroshare-gui/src/gui/feeds/SubFileItem.h +++ b/retroshare-gui/src/gui/feeds/SubFileItem.h @@ -26,37 +26,70 @@ #include +const uint32_t SFI_MASK_STATE = 0x000f; +const uint32_t SFI_MASK_TYPE = 0x00f0; +const uint32_t SFI_MASK_FT = 0x0f00; + +const uint32_t SFI_STATE_ERROR = 0x0001; +const uint32_t SFI_STATE_EXTRA = 0x0002; +const uint32_t SFI_STATE_REMOTE = 0x0003; +const uint32_t SFI_STATE_DOWNLOAD = 0x0004; +const uint32_t SFI_STATE_LOCAL = 0x0005; +const uint32_t SFI_STATE_UPLOAD = 0x0006; + +const uint32_t SFI_TYPE_CHANNEL = 0x0010; +const uint32_t SFI_TYPE_ATTACH = 0x0020; + class SubFileItem : public QWidget, private Ui::SubFileItem { Q_OBJECT public: /** Default Constructor */ - SubFileItem(std::string hash, std::string name, uint64_t size); + SubFileItem(std::string localpath); + SubFileItem(std::string hash, std::string name, uint64_t size, + uint32_t flags, std::string srcId); /** Default Destructor */ void small(); - bool done(); std::string FileHash() { return mFileHash; } std::string FileName() { return mFileName; } uint64_t FileSize() { return mFileSize; } + std::string FilePath() { return mPath; } -void updateItemStatic(); + void updateItemStatic(); + + bool done(); + bool ready(); + +public slots: + void download(); private slots: - /* default stuff */ + void toggle(); + void cancel(); void play(); - void toggle(); + void save(); void updateItem(); private: + + void Setup(); + + + std::string mPath; std::string mFileHash; std::string mFileName; uint64_t mFileSize; + std::string mSrcId; + + uint32_t mMode; + uint32_t mType; + uint64_t mDivisor; /* for display purposes */ float amountDone; diff --git a/retroshare-gui/src/gui/feeds/SubFileItem.ui b/retroshare-gui/src/gui/feeds/SubFileItem.ui index 951dc2c6d..56b84a2a6 100644 --- a/retroshare-gui/src/gui/feeds/SubFileItem.ui +++ b/retroshare-gui/src/gui/feeds/SubFileItem.ui @@ -144,25 +144,6 @@ - - - - - 0 - 0 - - - - Delete FeedItem - - - - - - :/images/close-down.png - - - @@ -182,6 +163,63 @@ + + + + + 0 + 0 + + + + Save File + + + + + + :/images/save24.png + + + + + + + + 0 + 0 + + + + Cancel Download + + + + + + :/images/delete.png + + + + + + + + 0 + 0 + + + + Download File + + + + + + :/images/download.png + + + @@ -191,7 +229,7 @@ - Delete FeedItem + Play File diff --git a/retroshare-gui/src/rsiface/rsfiles.h b/retroshare-gui/src/rsiface/rsfiles.h index 0a7d0b640..936f2e4de 100644 --- a/retroshare-gui/src/rsiface/rsfiles.h +++ b/retroshare-gui/src/rsiface/rsfiles.h @@ -49,6 +49,23 @@ const uint32_t RS_FILE_CTRL_STREAM_AUDIO = 0x0005; const uint32_t RS_FILE_CTRL_STREAM_VIDEO = 0x0006; +/************************************ + * Used To indicate where to search. + */ + +const uint32_t RS_FILE_HINTS_MASK = 0x00ff; + +const uint32_t RS_FILE_HINTS_CACHE = 0x0001; +const uint32_t RS_FILE_HINTS_EXTRA = 0x0002; +const uint32_t RS_FILE_HINTS_LOCAL = 0x0004; +const uint32_t RS_FILE_HINTS_REMOTE = 0x0008; +const uint32_t RS_FILE_HINTS_DOWNLOAD = 0x0010; +const uint32_t RS_FILE_HINTS_UPLOAD = 0x0020; + +const uint32_t RS_FILE_HINTS_SPEC_ONLY = 0x1000; + + + const uint32_t RS_FILE_EXTRA_DELETE = 0x0010; diff --git a/retroshare-gui/src/rsiface/rstypes.h b/retroshare-gui/src/rsiface/rstypes.h index 5e3d3aa95..c350e4441 100644 --- a/retroshare-gui/src/rsiface/rstypes.h +++ b/retroshare-gui/src/rsiface/rstypes.h @@ -83,6 +83,20 @@ static const int kRsFiStatusDone = 2; double tfRate; /* kbytes */ bool download; int downloadStatus; /* 0 = Err, 1 = Ok, 2 = Done */ + + /* ENTRIES USED BY SFI *** + * + * path, + * fname, + * hash, + * size, + * avail, + * + * source? + * + */ + + }; class FileTransferInfo: public FileInfo