Enabled new File Transfer Code in libretroshare.

NB: This is not yet working. so SVN is now officially broken :(
Hope to have the bugs ironed out soon.



git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@782 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
drbob 2008-11-02 11:38:11 +00:00
parent 9f68fc5393
commit 0d96b43d34
29 changed files with 567 additions and 117 deletions

View file

@ -27,11 +27,15 @@
* #define FT_DEBUG 1
******/
#define FT_DEBUG 1
#include "fttransfermodule.h"
ftTransferModule::ftTransferModule(ftFileCreator *fc, ftDataMultiplex *dm, ftController *c)
:mFileCreator(fc), mMultiplexor(dm), mFtController(c), mFlag(0)
{
RsStackMutex stack(tfMtx); /******* STACK LOCKED ******/
mHash = mFileCreator->getHash();
mSize = mFileCreator->getFileSize();
mFileStatus.hash = mHash;
@ -45,8 +49,11 @@ ftTransferModule::ftTransferModule(ftFileCreator *fc, ftDataMultiplex *dm, ftCon
ftTransferModule::~ftTransferModule()
{}
bool ftTransferModule::setFileSources(std::list<std::string> peerIds)
{
RsStackMutex stack(tfMtx); /******* STACK LOCKED ******/
mFileSources.clear();
#ifdef FT_DEBUG
@ -73,8 +80,20 @@ bool ftTransferModule::setFileSources(std::list<std::string> peerIds)
return true;
}
bool ftTransferModule::getFileSources(std::list<std::string> &peerIds)
{
RsStackMutex stack(tfMtx); /******* STACK LOCKED ******/
std::map<std::string,peerInfo>::iterator it;
for(it = mFileSources.begin(); it != mFileSources.end(); it++)
{
peerIds.push_back(it->first);
}
return true;
}
bool ftTransferModule::setPeerState(std::string peerId,uint32_t state,uint32_t maxRate)
{
RsStackMutex stack(tfMtx); /******* STACK LOCKED ******/
#ifdef FT_DEBUG
std::cerr << "ftTransferModule::setPeerState()";
std::cerr << " peerId: " << peerId;
@ -108,8 +127,30 @@ bool ftTransferModule::setPeerState(std::string peerId,uint32_t state,uint32_t m
return true;
}
bool ftTransferModule::getPeerState(std::string peerId,uint32_t &state,uint32_t &tfRate)
{
RsStackMutex stack(tfMtx); /******* STACK LOCKED ******/
std::map<std::string,peerInfo>::iterator mit;
mit = mFileSources.find(peerId);
if (mit == mFileSources.end()) return false;
state = (mit->second).state;
tfRate = (uint32_t) (mit->second).actualRate;
#ifdef FT_DEBUG
std::cerr << "ftTransferModule::getPeerState()";
std::cerr << " peerId: " << peerId;
std::cerr << " state: " << state;
std::cerr << " tfRate: " << tfRate << std::endl;
#endif
return true;
}
uint32_t ftTransferModule::getDataRate(std::string peerId)
{
RsStackMutex stack(tfMtx); /******* STACK LOCKED ******/
std::map<std::string,peerInfo>::iterator mit;
mit = mFileSources.find(peerId);
if (mit == mFileSources.end())
@ -139,6 +180,9 @@ bool ftTransferModule::recvFileData(std::string peerId, uint64_t offset,
std::cerr << std::endl;
#endif
{
RsStackMutex stack(tfMtx); /******* STACK LOCKED ******/
std::map<std::string,peerInfo>::iterator mit;
mit = mFileSources.find(peerId);
@ -176,7 +220,7 @@ bool ftTransferModule::recvFileData(std::string peerId, uint64_t offset,
(mit->second).receivedSize += chunk_size;
(mit->second).state = PQIPEER_IDLE;
} /***** STACK MUTEX END ****/
return storeData(offset, chunk_size, data);
}
@ -246,6 +290,10 @@ bool ftTransferModule::storeData(uint64_t offset, uint32_t chunk_size,void *data
bool ftTransferModule::queryInactive()
{
/* NB: Not sure about this lock... might cause deadlock.
*/
RsStackMutex stack(tfMtx); /******* STACK LOCKED ******/
#ifdef FT_DEBUG
std::cerr << "ftTransferModule::queryInactive()" << std::endl;
#endif
@ -291,12 +339,20 @@ bool ftTransferModule::queryInactive()
//file response received or peer side is just ready for download
case PQIPEER_IDLE:
pInfo->actualRate = pInfo->chunkSize/(ts-(pInfo->lastTS));
if (pInfo->actualRate < pInfo->desiredRate/2)
{
req_size = pInfo->chunkSize * 2 ;
if (pInfo->actualRate < pInfo->desiredRate)
{
if (pInfo->actualRate < pInfo->desiredRate/2)
{
req_size = pInfo->chunkSize * 2 ;
}
else
{
req_size = (uint32_t ) (pInfo->chunkSize * 1.1) ;
}
}
else
{
else
{
req_size = (uint32_t ) (pInfo->chunkSize * 0.9) ;
}
@ -336,6 +392,8 @@ bool ftTransferModule::queryInactive()
bool ftTransferModule::pauseTransfer()
{
RsStackMutex stack(tfMtx); /******* STACK LOCKED ******/
/*
std::map<std::string,peerInfo>::iterator mit;
for(mit = mOnlinePeers.begin(); mit != mOnlinePeers.end(); mit++)
@ -350,6 +408,7 @@ bool ftTransferModule::pauseTransfer()
bool ftTransferModule::resumeTransfer()
{
RsStackMutex stack(tfMtx); /******* STACK LOCKED ******/
/*
std::map<std::string,peerInfo>::iterator mit;
for(mit = mOnlinePeers.begin(); mit != mOnlinePeers.end(); mit++)
@ -364,6 +423,7 @@ bool ftTransferModule::resumeTransfer()
bool ftTransferModule::cancelTransfer()
{
RsStackMutex stack(tfMtx); /******* STACK LOCKED ******/
mFileStatus.stat=ftFileStatus::PQIFILE_FAIL_CANCEL;
return 1;
@ -388,7 +448,14 @@ int ftTransferModule::tick()
#endif
queryInactive();
switch (mFlag)
uint32_t flags = 0;
{
RsStackMutex stack(tfMtx); /******* STACK LOCKED ******/
flags = mFlag;
}
switch (flags)
{
case 0:
adjustSpeed();
@ -409,12 +476,30 @@ int ftTransferModule::tick()
void ftTransferModule::adjustSpeed()
{
RsStackMutex stack(tfMtx); /******* STACK LOCKED ******/
std::map<std::string,peerInfo>::iterator mit;
#ifdef FT_DEBUG
std::cerr << "ftTransferModule::adjustSpeed()";
std::cerr << " Initial Desired Rate: " << desiredRate << " Actual Rate: " << actualRate;
std::cerr << std::endl;
#endif
for(mit = mFileSources.begin(); mit != mFileSources.end(); mit++)
{
if (((mit->second).state == PQIPEER_DOWNLOADING)
|| ((mit->second).state == PQIPEER_IDLE))
{
#ifdef FT_DEBUG
std::cerr << "ftTransferModule::adjustSpeed()";
std::cerr << "\t" << mit->first << " Desired Rate: " << desiredRate << " Actual Rate: " << actualRate;
std::cerr << std::endl;
#endif
if ((actualRate < desiredRate) && ((mit->second).actualRate >= (mit->second).desiredRate))
{
(mit->second).desiredRate *= 1.1;
@ -426,6 +511,11 @@ void ftTransferModule::adjustSpeed()
}
}
}
#ifdef FT_DEBUG
std::cerr << "ftTransferModule::adjustSpeed()";
std::cerr << " Initial Desired Rate: " << desiredRate << " Actual Rate: " << actualRate;
std::cerr << std::endl;
#endif
return;
}