mirror of
https://github.com/RetroShare/RetroShare.git
synced 2024-10-01 02:35:48 -04:00
Fixed issue with lost downloads when RetroShare exits (or crashes) during the load of the file transfer items. The pending list was not saved.
git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@5153 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
e23f7e1055
commit
ec501c6d6a
@ -1987,14 +1987,7 @@ bool ftController::saveList(bool &cleanup, std::list<RsItem *>& saveData)
|
|||||||
rft->state = fit->second->mState;
|
rft->state = fit->second->mState;
|
||||||
fit->second->mTransfer->getFileSources(rft->allPeerIds.ids);
|
fit->second->mTransfer->getFileSources(rft->allPeerIds.ids);
|
||||||
|
|
||||||
// just avoid uninitialised memory reads
|
|
||||||
rft->in = 0 ;
|
|
||||||
rft->cPeerId = "" ;
|
|
||||||
rft->transferred = fit->second->mCreator->getRecvd();
|
rft->transferred = fit->second->mCreator->getRecvd();
|
||||||
rft->crate = 0 ;
|
|
||||||
rft->lrate = 0 ;
|
|
||||||
rft->trate = 0 ;
|
|
||||||
rft->ltransfer = 0 ;
|
|
||||||
|
|
||||||
// Remove turtle peers from sources, as they are not supposed to survive a reboot of RS, since they are dynamic sources.
|
// Remove turtle peers from sources, as they are not supposed to survive a reboot of RS, since they are dynamic sources.
|
||||||
// Otherwize, such sources are unknown from the turtle router, at restart, and never get removed.
|
// Otherwize, such sources are unknown from the turtle router, at restart, and never get removed.
|
||||||
@ -2016,6 +2009,49 @@ bool ftController::saveList(bool &cleanup, std::list<RsItem *>& saveData)
|
|||||||
saveData.push_back(rft);
|
saveData.push_back(rft);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
/* Save pending list of downloads */
|
||||||
|
RsStackMutex stack(ctrlMutex); /******* LOCKED ********/
|
||||||
|
|
||||||
|
std::list<ftPendingRequest>::iterator pit;
|
||||||
|
for (pit = mPendingRequests.begin(); pit != mPendingRequests.end(); ++pit)
|
||||||
|
{
|
||||||
|
/* make RsFileTransfer item for save list */
|
||||||
|
RsFileTransfer *rft = NULL;
|
||||||
|
|
||||||
|
std::map<std::string,RsFileTransfer*>::iterator rit = mPendingChunkMaps.find(pit->mHash);
|
||||||
|
if (rit != mPendingChunkMaps.end()) {
|
||||||
|
/* use item from the not loaded pending list */
|
||||||
|
rft = new RsFileTransfer(*(rit->second));
|
||||||
|
} else {
|
||||||
|
rft = new RsFileTransfer();
|
||||||
|
|
||||||
|
/* what data is important? */
|
||||||
|
|
||||||
|
rft->file.name = pit->mName;
|
||||||
|
rft->file.hash = pit->mHash;
|
||||||
|
rft->file.filesize = pit->mSize;
|
||||||
|
rft->file.path = RsDirUtil::removeTopDir(pit->mDest); /* remove fname */
|
||||||
|
rft->flags = pit->mFlags;
|
||||||
|
rft->allPeerIds.ids = pit->mSrcIds;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove turtle peers from sources, as they are not supposed to survive a reboot of RS, since they are dynamic sources.
|
||||||
|
// Otherwize, such sources are unknown from the turtle router, at restart, and never get removed.
|
||||||
|
//
|
||||||
|
for(std::list<std::string>::iterator sit(rft->allPeerIds.ids.begin());sit!=rft->allPeerIds.ids.end();)
|
||||||
|
if(mTurtle->isTurtlePeer(*sit))
|
||||||
|
{
|
||||||
|
std::list<std::string>::iterator sittmp(sit) ;
|
||||||
|
sit = rft->allPeerIds.ids.erase(sit) ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
++sit ;
|
||||||
|
|
||||||
|
saveData.push_back(rft);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* list completed! */
|
/* list completed! */
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -246,7 +246,15 @@ class RsFileTransfer: public RsItem
|
|||||||
public:
|
public:
|
||||||
RsFileTransfer() :RsItem(RS_PKT_VERSION1, RS_PKT_CLASS_CONFIG, RS_PKT_TYPE_FILE_CONFIG, RS_PKT_SUBTYPE_FILE_TRANSFER)
|
RsFileTransfer() :RsItem(RS_PKT_VERSION1, RS_PKT_CLASS_CONFIG, RS_PKT_TYPE_FILE_CONFIG, RS_PKT_SUBTYPE_FILE_TRANSFER)
|
||||||
{
|
{
|
||||||
return;
|
state = 0;
|
||||||
|
in = 0;
|
||||||
|
transferred = 0;
|
||||||
|
crate = 0;
|
||||||
|
trate = 0;
|
||||||
|
lrate = 0;
|
||||||
|
ltransfer = 0;
|
||||||
|
flags = 0;
|
||||||
|
chunk_strategy = 0;
|
||||||
}
|
}
|
||||||
virtual ~RsFileTransfer();
|
virtual ~RsFileTransfer();
|
||||||
virtual void clear();
|
virtual void clear();
|
||||||
|
Loading…
Reference in New Issue
Block a user