diff --git a/libretroshare/src/ft/ftcontroller.cc b/libretroshare/src/ft/ftcontroller.cc index 1dc0b1dad..b43139911 100644 --- a/libretroshare/src/ft/ftcontroller.cc +++ b/libretroshare/src/ft/ftcontroller.cc @@ -1541,6 +1541,11 @@ std::string ftController::getPartialsDirectory() return mPartialsPath; } +bool ftController::FileServerCancel(const RsFileHash& hash) +{ + RsStackMutex stack(ctrlMutex); /******* LOCKED ********/ + return mDataplex->deleteServer(hash); +} bool ftController::setDestinationDirectory(const RsFileHash& hash,const std::string& dest_dir) { RsStackMutex stack(ctrlMutex); /******* LOCKED ********/ diff --git a/libretroshare/src/ft/ftcontroller.h b/libretroshare/src/ft/ftcontroller.h index e890a83d6..854a3e3a1 100644 --- a/libretroshare/src/ft/ftcontroller.h +++ b/libretroshare/src/ft/ftcontroller.h @@ -157,6 +157,7 @@ public: bool getFileDownloadChunksDetails(const RsFileHash& hash,FileChunksInfo& info); bool setDestinationName(const RsFileHash& hash,const std::string& dest_name) ; bool setDestinationDirectory(const RsFileHash& hash,const std::string& dest_name) ; + bool FileServerCancel(const RsFileHash& hash); // Download speed bool getPriority(const RsFileHash& hash,DwlSpeed& p); diff --git a/libretroshare/src/ft/ftdatamultiplex.cc b/libretroshare/src/ft/ftdatamultiplex.cc index de8f1261c..f4b63be8b 100644 --- a/libretroshare/src/ft/ftdatamultiplex.cc +++ b/libretroshare/src/ft/ftdatamultiplex.cc @@ -1039,6 +1039,23 @@ void ftDataMultiplex::handlePendingCrcRequests() } } +bool ftDataMultiplex::deleteServer(const RsFileHash& hash) +{ + RsStackMutex stack(dataMtx); /******* LOCK MUTEX ******/ + + auto sit = mServers.find(hash); + + if(sit == mServers.end()) + return false; + + // We don't delete servers that are clients at the same time ! + if(dynamic_cast(sit->second) == NULL) + delete sit->second; + + mServers.erase(sit); + return true; +} + void ftDataMultiplex::deleteUnusedServers() { RsStackMutex stack(dataMtx); /******* LOCK MUTEX ******/ diff --git a/libretroshare/src/ft/ftdatamultiplex.h b/libretroshare/src/ft/ftdatamultiplex.h index 019940b63..6b15e7617 100644 --- a/libretroshare/src/ft/ftdatamultiplex.h +++ b/libretroshare/src/ft/ftdatamultiplex.h @@ -112,9 +112,9 @@ class ftDataMultiplex: public ftDataRecv, public RsQueueThread bool FileDownloads(std::list &hashs); bool FileDetails(const RsFileHash &hash, FileSearchFlags hintsflag, FileInfo &info); - void deleteUnusedServers() ; - void handlePendingCrcRequests() ; - + void deleteUnusedServers() ; + bool deleteServer(const RsFileHash& hash); // deletes FtServers for the given hash. Used when removing an extra file from shares. + void handlePendingCrcRequests() ; /*************** SEND INTERFACE (calls ftDataSend) *******************/ diff --git a/libretroshare/src/ft/ftserver.cc b/libretroshare/src/ft/ftserver.cc index 07a400acf..e8c7b504d 100644 --- a/libretroshare/src/ft/ftserver.cc +++ b/libretroshare/src/ft/ftserver.cc @@ -817,7 +817,10 @@ bool ftServer::ExtraFileAdd(std::string fname, const RsFileHash& hash, uint64_t } bool ftServer::ExtraFileRemove(const RsFileHash& hash) -{ return mFileDatabase->removeExtraFile(hash); } +{ + mFtController->FileServerCancel(hash); + return mFileDatabase->removeExtraFile(hash); +} bool ftServer::ExtraFileHash( std::string localpath, rstime_t period, TransferRequestFlags flags ) {