From b55ba07e93d34e6173597e03988d07c51548e575 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Mon, 3 Oct 2011 11:35:32 +0200 Subject: [PATCH] Handle FT cancelation --- backends/libpurple/main.cpp | 17 ++++++++----- .../FileTransfer/MyOutgoingSIFileTransfer.cpp | 15 ++++++++++++ .../FileTransfer/MyOutgoingSIFileTransfer.h | 2 +- include/transport/memoryreadbytestream.h | 5 +++- include/transport/networkplugin.h | 1 + include/transport/networkpluginserver.h | 1 + src/memoryreadbytestream.cpp | 10 +++++++- src/networkplugin.cpp | 18 ++++++++++++++ src/networkpluginserver.cpp | 24 ++++++++++++++++++- 9 files changed, 83 insertions(+), 10 deletions(-) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index 59ffe4c9..616d2325 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -1344,11 +1344,17 @@ static void XferDestroyed(PurpleXfer *xfer) { } static void xferCanceled(PurpleXfer *xfer) { -// FiletransferRepeater *repeater = (FiletransferRepeater *) xfer->ui_data; -// if (!repeater) -// return; -// GlooxMessageHandler::instance()->ftManager->removeSID(repeater->getSID()); -// repeater->handleXferCanceled(); + PurpleAccount *account = purple_xfer_get_account(xfer); + std::string filename(xfer ? purple_xfer_get_filename(xfer) : ""); + purple_xfer_ref(xfer); + std::string w = xfer->who; + size_t pos = w.find("/"); + if (pos != std::string::npos) + w.erase((int) pos, w.length() - (int) pos); + + FTData *ftdata = (FTData *) xfer->ui_data; + + np->handleFTFinish(np->m_accounts[account], w, filename, purple_xfer_get_size(xfer), ftdata ? ftdata->id : 0); purple_xfer_unref(xfer); } @@ -1369,7 +1375,6 @@ static void fileRecvStart(PurpleXfer *xfer) { } static void newXfer(PurpleXfer *xfer) { -// GlooxMessageHandler::instance()->ftManager->handleXferFileReceiveRequest(xfer); PurpleAccount *account = purple_xfer_get_account(xfer); std::string filename(xfer ? purple_xfer_get_filename(xfer) : ""); purple_xfer_ref(xfer); diff --git a/include/Swiften/FileTransfer/MyOutgoingSIFileTransfer.cpp b/include/Swiften/FileTransfer/MyOutgoingSIFileTransfer.cpp index 2d094d38..90516981 100644 --- a/include/Swiften/FileTransfer/MyOutgoingSIFileTransfer.cpp +++ b/include/Swiften/FileTransfer/MyOutgoingSIFileTransfer.cpp @@ -33,6 +33,21 @@ void MyOutgoingSIFileTransfer::start() { void MyOutgoingSIFileTransfer::stop() { } +void MyOutgoingSIFileTransfer::cancel() { + // TODO +// session->sendTerminate(JinglePayload::Reason::Cancel); + + if (ibbSession) { + ibbSession->stop(); + } + SOCKS5BytestreamServerSession *serverSession = registry->getConnectedSession(SOCKS5BytestreamRegistry::getHostname(id, from, to)); + if (serverSession) { + serverSession->stop(); + } + + onStateChange(FileTransfer::State(FileTransfer::State::Canceled)); +} + void MyOutgoingSIFileTransfer::handleStreamInitiationRequestResponse(StreamInitiation::ref response, ErrorPayload::ref error) { if (error) { finish(FileTransferError()); diff --git a/include/Swiften/FileTransfer/MyOutgoingSIFileTransfer.h b/include/Swiften/FileTransfer/MyOutgoingSIFileTransfer.h index 8ab87243..8fa88ea6 100644 --- a/include/Swiften/FileTransfer/MyOutgoingSIFileTransfer.h +++ b/include/Swiften/FileTransfer/MyOutgoingSIFileTransfer.h @@ -30,7 +30,7 @@ namespace Swift { virtual void start(); virtual void stop(); - virtual void cancel() {} + virtual void cancel(); boost::signal&)> onFinished; diff --git a/include/transport/memoryreadbytestream.h b/include/transport/memoryreadbytestream.h index 0454b512..0f423a55 100644 --- a/include/transport/memoryreadbytestream.h +++ b/include/transport/memoryreadbytestream.h @@ -28,13 +28,14 @@ namespace Transport { class MemoryReadBytestream : public Swift::ReadBytestream { public: - MemoryReadBytestream(); + MemoryReadBytestream(unsigned long size); virtual ~MemoryReadBytestream(); unsigned long appendData(const std::string &data); virtual boost::shared_ptr > read(size_t size); + void setFinished() { m_finished = true; } bool isFinished() const; boost::signal onDataNeeded; @@ -43,6 +44,8 @@ class MemoryReadBytestream : public Swift::ReadBytestream { bool m_finished; std::string m_data; bool neededData; + unsigned long m_sent; + unsigned long m_size; }; } diff --git a/include/transport/networkplugin.h b/include/transport/networkplugin.h index 487a9e9a..69e7c343 100644 --- a/include/transport/networkplugin.h +++ b/include/transport/networkplugin.h @@ -145,6 +145,7 @@ class NetworkPlugin { void handleAttention(const std::string &user, const std::string &buddyName, const std::string &message); void handleFTStart(const std::string &user, const std::string &buddyName, const std::string fileName, unsigned long size); + void handleFTFinish(const std::string &user, const std::string &buddyName, const std::string fileName, unsigned long size, unsigned long ftid); void handleFTData(unsigned long ftID, const std::string &data); diff --git a/include/transport/networkpluginserver.h b/include/transport/networkpluginserver.h index 4b170625..a678c247 100644 --- a/include/transport/networkpluginserver.h +++ b/include/transport/networkpluginserver.h @@ -92,6 +92,7 @@ class NetworkPluginServer { void handleAttentionPayload(const std::string &payload); void handleStatsPayload(Backend *c, const std::string &payload); void handleFTStartPayload(const std::string &payload); + void handleFTFinishPayload(const std::string &payload); void handleFTDataPayload(Backend *b ,const std::string &payload); void handleUserCreated(User *user); diff --git a/src/memoryreadbytestream.cpp b/src/memoryreadbytestream.cpp index 6c3f0588..5e373191 100644 --- a/src/memoryreadbytestream.cpp +++ b/src/memoryreadbytestream.cpp @@ -27,9 +27,11 @@ using namespace log4cxx; namespace Transport { -MemoryReadBytestream::MemoryReadBytestream() { +MemoryReadBytestream::MemoryReadBytestream(unsigned long size) { neededData = false; m_finished = false; + m_sent = 0; + m_size = size; } MemoryReadBytestream::~MemoryReadBytestream() { @@ -51,12 +53,18 @@ boost::shared_ptr > MemoryReadBytestream::read(size_t if (m_data.size() < size) { boost::shared_ptr > ptr(new std::vector(m_data.begin(), m_data.end())); + m_sent += m_data.size(); m_data.clear(); + if (m_sent == m_size) + m_finished = true; onDataNeeded(); return ptr; } boost::shared_ptr > ptr(new std::vector(m_data.begin(), m_data.begin() + size)); m_data.erase(m_data.begin(), m_data.begin() + size); + m_sent += size; + if (m_sent == m_size) + m_finished = true; if (m_data.size() < 500000 && !neededData) { neededData = true; onDataNeeded(); diff --git a/src/networkplugin.cpp b/src/networkplugin.cpp index 3284b992..be138b51 100644 --- a/src/networkplugin.cpp +++ b/src/networkplugin.cpp @@ -279,6 +279,24 @@ void NetworkPlugin::handleFTStart(const std::string &user, const std::string &bu send(message); } +void NetworkPlugin::handleFTFinish(const std::string &user, const std::string &buddyName, const std::string fileName, unsigned long size, unsigned long ftid) { + pbnetwork::File room; + room.set_username(user); + room.set_buddyname(buddyName); + room.set_filename(fileName); + room.set_size(size); + if (ftid) { + room.set_ftid(ftid); + } + + std::string message; + room.SerializeToString(&message); + + WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_FT_FINISH); + + send(message); +} + void NetworkPlugin::handleFTData(unsigned long ftID, const std::string &data) { pbnetwork::FileTransferData d; d.set_ftid(ftID); diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 1e1a8cce..59247d20 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -601,7 +601,7 @@ void NetworkPluginServer::handleFTStartPayload(const std::string &data) { fileInfo.setName(payload.filename()); Backend *c = (Backend *) user->getData(); - boost::shared_ptr bytestream(new MemoryReadBytestream()); + boost::shared_ptr bytestream(new MemoryReadBytestream(payload.size())); bytestream->onDataNeeded.connect(boost::bind(&NetworkPluginServer::handleFTDataNeeded, this, c, bytestream_id + 1)); LOG4CXX_INFO(logger, "jid=" << buddy->getJID()); @@ -617,6 +617,25 @@ void NetworkPluginServer::handleFTStartPayload(const std::string &data) { transfer.ft->start(); } +void NetworkPluginServer::handleFTFinishPayload(const std::string &data) { + pbnetwork::File payload; + if (payload.ParseFromString(data) == false) { + // TODO: ERROR + return; + } + + if (payload.has_ftid()) { + if (m_filetransfers.find(payload.ftid()) != m_filetransfers.end()) { + FileTransferManager::Transfer &transfer = m_filetransfers[payload.ftid()]; + transfer.ft->cancel(); + } + else { + LOG4CXX_ERROR(logger, "FTFinishPayload for unknown ftid=" << payload.ftid()); + } + } + +} + void NetworkPluginServer::handleFTDataPayload(Backend *b, const std::string &data) { pbnetwork::FileTransferData payload; if (payload.ParseFromString(data) == false) { @@ -740,6 +759,9 @@ void NetworkPluginServer::handleDataRead(Backend *c, boost::shared_ptr