From 941bba0427feec0560afda0f2ae7ed846a4adbc5 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Fri, 30 Sep 2011 10:00:44 +0200 Subject: [PATCH] Fixed compilation with latest swiften --- CMakeLists.txt | 2 +- backends/libpurple/main.cpp | 8 +++- include/transport/filetransfer.h | 49 -------------------- include/transport/networkpluginserver.h | 30 +++++++++++++ include/transport/transport.h | 4 +- include/transport/user.h | 6 +++ include/transport/usermanager.h | 26 +++++++++++ src/filetransfer.cpp | 59 ------------------------- src/networkpluginserver.cpp | 29 +++++++++++- src/transport.cpp | 2 - src/user.cpp | 15 +++++++ src/usermanager.cpp | 18 ++++++++ 12 files changed, 130 insertions(+), 118 deletions(-) delete mode 100644 include/transport/filetransfer.h delete mode 100644 src/filetransfer.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index aa939f41..cc976737 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -108,7 +108,7 @@ else() endif() if(CMAKE_BUILD_TYPE MATCHES Debug) - ADD_DEFINITIONS(-O3) + ADD_DEFINITIONS(-O0) ADD_DEFINITIONS(-ggdb) ADD_DEFINITIONS(-DDEBUG) ADD_DEFINITIONS(-Wall) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index 3cf395cb..b597c6a4 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -1340,8 +1340,12 @@ static void newXfer(PurpleXfer *xfer) { PurpleAccount *account = purple_xfer_get_account(xfer); std::string filename(xfer ? purple_xfer_get_filename(xfer) : ""); purple_xfer_ref(xfer); - np->m_xfers[np->m_accounts[account] + filename + xfer->who] = xfer; - np->handleFTStart(np->m_accounts[account], xfer->who, filename, purple_xfer_get_size(xfer)); + std::string w = xfer->who; + size_t pos = w.find("/"); + if (pos != std::string::npos) + w.erase((int) pos, w.length() - (int) pos); + np->m_xfers[np->m_accounts[account] + filename + w] = xfer; + np->handleFTStart(np->m_accounts[account], w, filename, purple_xfer_get_size(xfer)); } static void XferReceiveComplete(PurpleXfer *xfer) { diff --git a/include/transport/filetransfer.h b/include/transport/filetransfer.h deleted file mode 100644 index 3c78ef48..00000000 --- a/include/transport/filetransfer.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - * XMPP - libpurple transport - * - * Copyright (C) 2009, Jan Kaluza - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA - */ - -#pragma once - -#include -#include -#include -#include -#include -#include "Swiften/Swiften.h" -// #include "rosterstorage.h" - -namespace Transport { - -class Component; -class User; - -class FileTransfer { - public: - FileTransfer(User *user, Component *component, const Swift::JID &from); - - /// Destructor. - virtual ~FileTransfer(); - - private: - Swift::FileTransferManager* m_ftManager; - Component *m_component; - User *m_user; -}; - -} diff --git a/include/transport/networkpluginserver.h b/include/transport/networkpluginserver.h index 0c05bcb9..b7ca5f29 100644 --- a/include/transport/networkpluginserver.h +++ b/include/transport/networkpluginserver.h @@ -41,6 +41,35 @@ class VCardResponder; class RosterResponder; class BlockResponder; +class DummyReadBytestream : public Swift::ReadBytestream { + public: + DummyReadBytestream() {m_finished = false;} + virtual ~DummyReadBytestream() {} + void appendData(const std::string &data) { + m_data += data; + onDataAvailable(); + } + + virtual std::vector read(size_t size) { + if (m_data.empty()) { + return std::vector(); + } + + if (m_data.size() < size) { + m_finished = true; + return std::vector(m_data.begin(), m_data.end()); + } + std::string ret = m_data.substr(0, size); + m_data.erase(m_data.begin(), m_data.begin() + size); + return std::vector(ret.begin(), ret.end()); + } + virtual bool isFinished() const { return m_finished; } + + private: + bool m_finished; + std::string m_data; +}; + class NetworkPluginServer { public: struct Backend { @@ -129,6 +158,7 @@ class NetworkPluginServer { Component *m_component; std::list m_waitingUsers; bool m_isNextLongRun; + std::map > m_bytestreams; }; } diff --git a/include/transport/transport.h b/include/transport/transport.h index bb7df43a..40442dcc 100644 --- a/include/transport/transport.h +++ b/include/transport/transport.h @@ -94,8 +94,6 @@ namespace Transport { /// \return Swift::PresenceOracle associated with this Transport::Component. Swift::PresenceOracle *getPresenceOracle(); - Swift::JingleSessionManager *getJingleSessionManager() { return m_jingleSessionManager; } - /// Returns True if the component is in server mode. /// \return True if the component is in server mode. @@ -184,7 +182,7 @@ namespace Transport { Swift::PresenceOracle *m_presenceOracle; Swift::StanzaChannel *m_stanzaChannel; Swift::IQRouter *m_iqRouter; - Swift::JingleSessionManager *m_jingleSessionManager; + Transport::UserRegistry *m_userRegistry; StorageBackend *m_storageBackend; DiscoInfoResponder *m_discoInfoResponder; diff --git a/include/transport/user.h b/include/transport/user.h index ade960d0..76cf5df6 100644 --- a/include/transport/user.h +++ b/include/transport/user.h @@ -26,6 +26,7 @@ #include "Swiften/Disco/EntityCapsManager.h" #include "Swiften/Disco/EntityCapsProvider.h" #include "storagebackend.h" +#include namespace Transport { @@ -108,14 +109,18 @@ class User : public Swift::EntityCapsProvider { return m_connected; } + void sendFile(const Swift::JID& from, boost::shared_ptr byteStream, const Swift::StreamInitiationFileInfo &info, unsigned long id); + boost::signal onReadyToConnect; boost::signal onPresenceChanged; boost::signal onRoomJoined; boost::signal onRoomLeft; boost::signal onDisconnected; + boost::signal onFTAccepted; private: void onConnectingTimeout(); + void handleFTStateChanged(Swift::FileTransfer::State state, const std::string &buddyName, const std::string &fileName, unsigned long size, unsigned long id); Swift::JID m_jid; Component *m_component; @@ -133,6 +138,7 @@ class User : public Swift::EntityCapsProvider { boost::shared_ptr connection; time_t m_lastActivity; std::map m_legacyCaps; + std::vector > m_filetransfers; }; } diff --git a/include/transport/usermanager.h b/include/transport/usermanager.h index cd02aade..ae26dd57 100644 --- a/include/transport/usermanager.h +++ b/include/transport/usermanager.h @@ -25,6 +25,17 @@ #include "Swiften/Swiften.h" #include "transport/userregistry.h" +// FT STUFF TODO: move me +#include +#include +#include +#include +#include +#include +#include +#include +#include + namespace Transport { class User; @@ -112,6 +123,10 @@ class UserManager : public Swift::EntityCapsProvider { /// \param user JID of user. void disconnectUser(const Swift::JID &user); + Swift::CombinedOutgoingFileTransferManager *getOutgoingFileTransferManager() { + return m_outgoingFTManager; + } + private: void handlePresence(Swift::Presence::ref presence); void handleMessageReceived(Swift::Message::ref message); @@ -131,6 +146,17 @@ class UserManager : public Swift::EntityCapsProvider { UserRegistry *m_userRegistry; Swift::Timer::ref m_removeTimer; friend class RosterResponder; + + // FT stuff TODO: move to separate class once we will now what will be here + Swift::CombinedOutgoingFileTransferManager* m_outgoingFTManager; + Swift::RemoteJingleTransportCandidateSelectorFactory* m_remoteCandidateSelectorFactory; + Swift::LocalJingleTransportCandidateGeneratorFactory* m_localCandidateGeneratorFactory; + Swift::JingleSessionManager *m_jingleSessionManager; + Swift::SOCKS5BytestreamRegistry* m_bytestreamRegistry; + Swift::SOCKS5BytestreamServer* m_bytestreamServer; + Swift::SOCKS5BytestreamProxy* m_bytestreamProxy; + Swift::SOCKS5BytestreamServer *bytestreamServer; + Swift::ConnectivityManager* m_connectivityManager; }; } diff --git a/src/filetransfer.cpp b/src/filetransfer.cpp deleted file mode 100644 index 7b01db7d..00000000 --- a/src/filetransfer.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/** - * XMPP - libpurple transport - * - * Copyright (C) 2009, Jan Kaluza - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA - */ - -#include "transport/filetransfer.h" -#include "transport/usermanager.h" -#include "transport/transport.h" -#include "transport/user.h" -#include "Swiften/Roster/SetRosterRequest.h" -#include "Swiften/Elements/RosterPayload.h" -#include "Swiften/Elements/RosterItemPayload.h" -#include "Swiften/Elements/RosterItemExchangePayload.h" -#include "Swiften/FileTransfer/FileTransferManagerImpl.h" -#include "log4cxx/logger.h" -#include - -#include -#include - -using namespace log4cxx; - -namespace Transport { - -static LoggerPtr logger = Logger::getLogger("FileTransfer"); - -FileTransfer::FileTransfer(User *user, Component *component, const Swift::JID &from) { - m_user = user; - m_component = component; - m_ftManager = new Swift::FileTransferManagerImpl(from, m_component->getJingleSessionManager(), m_component->getIQRouter(), - user, m_component->getPresenceOracle(), - m_component->getNetworkFactories()->getConnectionFactory(), - m_component->getNetworkFactories()->getConnectionServerFactory(), - m_component->getNetworkFactories()->getTimerFactory(), - m_component->getNetworkFactories()->getNATTraverser()); - LOG4CXX_INFO(logger, "FileTransfer " << this << " from '" << from.toString() << "' to '" << user->getJID().toString() << "' created"); -} - -FileTransfer::~FileTransfer() { - LOG4CXX_INFO(logger, "FileTransfer " << this << " destroyed"); - delete m_ftManager; -} - -} diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 43ce5fe2..69edf1a3 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -41,6 +41,9 @@ #include "pbnetwork.pb.h" #include "log4cxx/logger.h" +#include +#include + #ifdef _WIN32 #include "windows.h" #else @@ -54,6 +57,7 @@ using namespace log4cxx; namespace Transport { static unsigned long backend_id; +static unsigned long bytestream_id; static LoggerPtr logger = Logger::getLogger("NetworkPluginServer"); @@ -583,8 +587,26 @@ void NetworkPluginServer::handleFTStartPayload(const std::string &data) { if (!user) return; - LOG4CXX_INFO(logger, "handleFTStartPayload " << payload.filename()); - handleFTAccepted(user, payload.buddyname(), payload.filename(), payload.size(), 255); + LOG4CXX_INFO(logger, "handleFTStartPayload " << payload.filename() << " " << payload.buddyname()); + + LocalBuddy *buddy = (LocalBuddy *) user->getRosterManager()->getBuddy(payload.buddyname()); + if (!buddy) { + // TODO: escape? reject? + return; + } + + Swift::StreamInitiationFileInfo fileInfo; + fileInfo.setSize(payload.size()); + fileInfo.setName(payload.filename()); + + boost::shared_ptr bytestream(new DummyReadBytestream()); + + LOG4CXX_INFO(logger, "jid=" << buddy->getJID()); + + m_bytestreams[++bytestream_id] = bytestream; + + user->sendFile(buddy->getJID(), bytestream, fileInfo, bytestream_id); +// handleFTAccepted(user, payload.buddyname(), payload.filename(), payload.size()); } void NetworkPluginServer::handleFTDataPayload(const std::string &data) { @@ -598,6 +620,8 @@ void NetworkPluginServer::handleFTDataPayload(const std::string &data) { // if (!user) // return; + m_bytestreams[payload.ftid()]->appendData(payload.data()); + LOG4CXX_INFO(logger, "handleFTDataPayload size=" << payload.data().size()); } @@ -839,6 +863,7 @@ void NetworkPluginServer::handleUserCreated(User *user) { user->onPresenceChanged.connect(boost::bind(&NetworkPluginServer::handleUserPresenceChanged, this, user, _1)); user->onRoomJoined.connect(boost::bind(&NetworkPluginServer::handleRoomJoined, this, user, _1, _2, _3)); user->onRoomLeft.connect(boost::bind(&NetworkPluginServer::handleRoomLeft, this, user, _1)); + user->onFTAccepted.connect(boost::bind(&NetworkPluginServer::handleFTAccepted, this, user, _1, _2, _3, _4)); } void NetworkPluginServer::handleUserReadyToConnect(User *user) { diff --git a/src/transport.cpp b/src/transport.cpp index a8143f9e..0e63ac8a 100644 --- a/src/transport.cpp +++ b/src/transport.cpp @@ -125,8 +125,6 @@ Component::Component(Swift::EventLoop *loop, Swift::NetworkFactories *factories, m_discoItemsResponder = new DiscoItemsResponder(m_iqRouter); m_discoItemsResponder->start(); - m_jingleSessionManager = new Swift::JingleSessionManager(m_iqRouter); - // // m_registerHandler = new SpectrumRegisterHandler(m_component); // m_registerHandler->start(); diff --git a/src/user.cpp b/src/user.cpp index 2cf74cbd..5e66268a 100644 --- a/src/user.cpp +++ b/src/user.cpp @@ -309,4 +309,19 @@ void User::handleDisconnected(const std::string &error) { } } +void User::handleFTStateChanged(Swift::FileTransfer::State state, const std::string &buddyName, const std::string &fileName, unsigned long size, unsigned long id) { + if (state.state == Swift::FileTransfer::State::Transferring) { + onFTAccepted(buddyName, fileName, size, id); + } +} + +void User::sendFile(const Swift::JID& from, boost::shared_ptr byteStream, const Swift::StreamInitiationFileInfo &info, unsigned long id) { + boost::shared_ptr ft = m_userManager->getOutgoingFileTransferManager()->createOutgoingFileTransfer(from, m_jid, byteStream, info); + if (ft) { + m_filetransfers.push_back(ft); + ft->onStateChange.connect(boost::bind(&User::handleFTStateChanged, this, _1, Buddy::JIDToLegacyName(from), info.getName(), info.getSize(), id)); + ft->start(); + } +} + } diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 6110c45e..2b21cb46 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -61,6 +61,24 @@ UserManager::UserManager(Component *component, UserRegistry *userRegistry, Stora m_userRegistry->onDisconnectUser.connect(bind(&UserManager::disconnectUser, this, _1)); m_removeTimer = m_component->getNetworkFactories()->getTimerFactory()->createTimer(1); + + // FT STUFF + m_jingleSessionManager = new Swift::JingleSessionManager(m_component->getIQRouter()); + m_connectivityManager = new Swift::ConnectivityManager(m_component->getNetworkFactories()->getNATTraverser()); + m_bytestreamRegistry = new Swift::SOCKS5BytestreamRegistry(); + m_bytestreamProxy = new Swift::SOCKS5BytestreamProxy(m_component->getNetworkFactories()->getConnectionFactory(), m_component->getNetworkFactories()->getTimerFactory()); + + m_localCandidateGeneratorFactory = new Swift::DefaultLocalJingleTransportCandidateGeneratorFactory(m_connectivityManager, m_bytestreamRegistry, m_bytestreamProxy, "thishouldnotbeused"); + m_remoteCandidateSelectorFactory = new Swift::DefaultRemoteJingleTransportCandidateSelectorFactory(m_component->getNetworkFactories()->getConnectionFactory(), m_component->getNetworkFactories()->getTimerFactory()); + + boost::shared_ptr server = m_component->getNetworkFactories()->getConnectionServerFactory()->createConnectionServer(19645); + server->start(); + bytestreamServer = new Swift::SOCKS5BytestreamServer(server, m_bytestreamRegistry); + bytestreamServer->start(); + + m_outgoingFTManager = new Swift::CombinedOutgoingFileTransferManager(m_jingleSessionManager, m_component->getIQRouter(), this, m_remoteCandidateSelectorFactory, m_localCandidateGeneratorFactory, m_bytestreamRegistry, m_bytestreamProxy, m_component->getPresenceOracle(), bytestreamServer); + +// m_connectivityManager->addListeningPort(19645); } UserManager::~UserManager(){