Fixed compilation with latest swiften
This commit is contained in:
parent
052c4ac633
commit
941bba0427
12 changed files with 130 additions and 118 deletions
|
@ -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)
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -1,49 +0,0 @@
|
|||
/**
|
||||
* XMPP - libpurple transport
|
||||
*
|
||||
* Copyright (C) 2009, Jan Kaluza <hanzz@soc.pidgin.im>
|
||||
*
|
||||
* 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 <string>
|
||||
#include <algorithm>
|
||||
#include <map>
|
||||
#include <boost/pool/pool_alloc.hpp>
|
||||
#include <boost/pool/object_pool.hpp>
|
||||
#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;
|
||||
};
|
||||
|
||||
}
|
|
@ -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<unsigned char> read(size_t size) {
|
||||
if (m_data.empty()) {
|
||||
return std::vector<unsigned char>();
|
||||
}
|
||||
|
||||
if (m_data.size() < size) {
|
||||
m_finished = true;
|
||||
return std::vector<unsigned char>(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<unsigned char>(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<User *> m_waitingUsers;
|
||||
bool m_isNextLongRun;
|
||||
std::map<unsigned long, boost::shared_ptr<DummyReadBytestream> > m_bytestreams;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include "Swiften/Disco/EntityCapsManager.h"
|
||||
#include "Swiften/Disco/EntityCapsProvider.h"
|
||||
#include "storagebackend.h"
|
||||
#include <Swiften/FileTransfer/OutgoingFileTransfer.h>
|
||||
|
||||
namespace Transport {
|
||||
|
||||
|
@ -108,14 +109,18 @@ class User : public Swift::EntityCapsProvider {
|
|||
return m_connected;
|
||||
}
|
||||
|
||||
void sendFile(const Swift::JID& from, boost::shared_ptr<Swift::ReadBytestream> byteStream, const Swift::StreamInitiationFileInfo &info, unsigned long id);
|
||||
|
||||
boost::signal<void ()> onReadyToConnect;
|
||||
boost::signal<void (Swift::Presence::ref presence)> onPresenceChanged;
|
||||
boost::signal<void (const std::string &room, const std::string &nickname, const std::string &password)> onRoomJoined;
|
||||
boost::signal<void (const std::string &room)> onRoomLeft;
|
||||
boost::signal<void ()> onDisconnected;
|
||||
boost::signal<void (const std::string &buddyName, const std::string &fileName, unsigned long size, unsigned long id)> 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<Swift::Connection> connection;
|
||||
time_t m_lastActivity;
|
||||
std::map<Swift::JID, Swift::DiscoInfo::ref> m_legacyCaps;
|
||||
std::vector<boost::shared_ptr<Swift::OutgoingFileTransfer> > m_filetransfers;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -25,6 +25,17 @@
|
|||
#include "Swiften/Swiften.h"
|
||||
#include "transport/userregistry.h"
|
||||
|
||||
// FT STUFF TODO: move me
|
||||
#include <Swiften/Elements/StreamInitiationFileInfo.h>
|
||||
#include <Swiften/FileTransfer/ConnectivityManager.h>
|
||||
#include <Swiften/FileTransfer/CombinedOutgoingFileTransferManager.h>
|
||||
#include <Swiften/FileTransfer/IncomingFileTransferManager.h>
|
||||
#include <Swiften/FileTransfer/DefaultLocalJingleTransportCandidateGeneratorFactory.h>
|
||||
#include <Swiften/FileTransfer/DefaultRemoteJingleTransportCandidateSelectorFactory.h>
|
||||
#include <Swiften/FileTransfer/SOCKS5BytestreamRegistry.h>
|
||||
#include <Swiften/FileTransfer/SOCKS5BytestreamServer.h>
|
||||
#include <Swiften/FileTransfer/SOCKS5BytestreamProxy.h>
|
||||
|
||||
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;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -1,59 +0,0 @@
|
|||
/**
|
||||
* XMPP - libpurple transport
|
||||
*
|
||||
* Copyright (C) 2009, Jan Kaluza <hanzz@soc.pidgin.im>
|
||||
*
|
||||
* 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 <boost/foreach.hpp>
|
||||
|
||||
#include <map>
|
||||
#include <iterator>
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
|
@ -41,6 +41,9 @@
|
|||
#include "pbnetwork.pb.h"
|
||||
#include "log4cxx/logger.h"
|
||||
|
||||
#include <Swiften/FileTransfer/ReadBytestream.h>
|
||||
#include <Swiften/Elements/StreamInitiationFileInfo.h>
|
||||
|
||||
#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<DummyReadBytestream> 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) {
|
||||
|
|
|
@ -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();
|
||||
|
|
15
src/user.cpp
15
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<Swift::ReadBytestream> byteStream, const Swift::StreamInitiationFileInfo &info, unsigned long id) {
|
||||
boost::shared_ptr<Swift::OutgoingFileTransfer> 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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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<Swift::ConnectionServer> 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(){
|
||||
|
|
Loading…
Add table
Reference in a new issue