diff --git a/src/data_transfer.cpp b/src/data_transfer.cpp index 5667528446b9d9c0bb157d1280c381276ac22888..924f1814bb5b72758c06f6e99658a8351fc23a5b 100644 --- a/src/data_transfer.cpp +++ b/src/data_transfer.cpp @@ -598,7 +598,6 @@ void DataTransferFacade::Impl::cancel(DataTransfer& transfer) { transfer.close(); - map_.erase(transfer.getId()); } std::shared_ptr<DataTransfer> @@ -773,15 +772,16 @@ DataTransferFacade::info(const DRing::DataTransferId& id, return DRing::DataTransferError::unknown; } -std::shared_ptr<Stream> -DataTransferFacade::onIncomingFileRequest(const DRing::DataTransferInfo& info) -{ - auto transfer = pimpl_->createIncomingFileTransfer(info); - auto filename = transfer->requestFilename(); - if (!filename.empty()) - if (transfer->start()) - return std::static_pointer_cast<Stream>(transfer); - return {}; +IncomingFileInfo +DataTransferFacade::onIncomingFileRequest(const DRing::DataTransferInfo &info) { + auto transfer = pimpl_->createIncomingFileTransfer(info); + if (!transfer) + return {}; + auto filename = transfer->requestFilename(); + if (!filename.empty()) + if (transfer->start()) + return {transfer->getId(), std::static_pointer_cast<Stream>(transfer)}; + return {transfer->getId(), nullptr}; } } // namespace jami diff --git a/src/data_transfer.h b/src/data_transfer.h index dfe8c2b9d5f31379fc9f8d98952534b0ff59ddaf..215ca53302918a4f568ba7fb4e75301a4635dbbd 100644 --- a/src/data_transfer.h +++ b/src/data_transfer.h @@ -29,6 +29,11 @@ namespace jami { class Stream; +struct IncomingFileInfo { + DRing::DataTransferId id; + std::shared_ptr<Stream> stream; +}; + /// Front-end to data transfer service class DataTransferFacade { @@ -61,7 +66,7 @@ public: /// Create an IncomingFileTransfer object. /// \return a shared pointer on created Stream object, or nullptr in case of error - std::shared_ptr<Stream> onIncomingFileRequest(const DRing::DataTransferInfo& info); + IncomingFileInfo onIncomingFileRequest(const DRing::DataTransferInfo &info); private: class Impl; diff --git a/src/ftp_server.cpp b/src/ftp_server.cpp index 1de9f40f5e44bfb25f2e30149611f0c4c1ca6cd3..aac997f3cd54aa81a02e503451214c42901df3f0 100644 --- a/src/ftp_server.cpp +++ b/src/ftp_server.cpp @@ -22,7 +22,6 @@ #include "logger.h" #include "string_utils.h" -#include "data_transfer.h" #include "manager.h" #include <algorithm> @@ -46,9 +45,8 @@ DRing::DataTransferId FtpServer::getId() const { // Because FtpServer is just the protocol on the top of a stream so the id - // of the stream is the id of out_. Because the output stream can be - // uninitialized, a FtpServer without a stream can have an id equal to 0. - return out_? out_->getId() : 0; + // of the stream is the id of out_. + return out_.id; } void @@ -70,21 +68,21 @@ FtpServer::startNewFile() info.bytesProgress = 0; rx_ = 0; out_ = Manager::instance().dataTransfers->onIncomingFileRequest(info); // we block here until answer from client - if (!out_) { + if (!out_.stream) { JAMI_DBG() << "[FTP] transfer aborted by client"; closed_ = true; // send NOK msg at next read() } else { go_ = true; } - return bool(out_); + return bool(out_.stream); } void FtpServer::closeCurrentFile() { - if (out_) { - out_->close(); - out_.reset(); + if (out_.stream) { + out_.stream->close(); + out_.stream.reset(); closed_ = true; } } @@ -92,7 +90,7 @@ FtpServer::closeCurrentFile() bool FtpServer::read(std::vector<uint8_t>& buffer) const { - if (!out_) { + if (!out_.stream) { if (closed_) { closed_ = false; if (rx_ < fileSize_) { @@ -134,8 +132,8 @@ FtpServer::write(const std::vector<uint8_t>& buffer) break; auto size_needed = fileSize_ - rx_; count = std::min(count, size_needed); - if (out_) - out_->write(reinterpret_cast<const uint8_t*>(&line_[0]), count); + if (out_.stream) + out_.stream->write(reinterpret_cast<const uint8_t*>(&line_[0]), count); rx_ += count; if (rx_ == fileSize_) { closeCurrentFile(); @@ -150,8 +148,8 @@ FtpServer::write(const std::vector<uint8_t>& buffer) case FtpState::READ_DATA: { - if (out_) - out_->write(&buffer[0], buffer.size()); + if (out_.stream) + out_.stream->write(&buffer[0], buffer.size()); auto size_needed = fileSize_ - rx_; auto read_size = std::min(buffer.size(), size_needed); rx_ += read_size; diff --git a/src/ftp_server.h b/src/ftp_server.h index 1225f0606765a2a1b17e7e822219c156652e383a..ccce004fb0e708e67704262677bf2568e3081e6d 100644 --- a/src/ftp_server.h +++ b/src/ftp_server.h @@ -20,6 +20,7 @@ #pragma once +#include "data_transfer.h" #include "peer_connection.h" #include <vector> @@ -53,7 +54,7 @@ private: const std::string accountId_; const std::string peerUri_; - std::shared_ptr<Stream> out_; + IncomingFileInfo out_ {0, nullptr}; std::size_t fileSize_ {0}; std::size_t rx_ {0}; std::stringstream headerStream_;