Fixed compilation with latest swiften

This commit is contained in:
HanzZ 2011-09-30 10:00:44 +02:00
parent 052c4ac633
commit 941bba0427
12 changed files with 130 additions and 118 deletions

View file

@ -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)

View file

@ -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) {

View file

@ -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;
};
}

View file

@ -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;
};
}

View file

@ -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;

View file

@ -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;
};
}

View file

@ -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;
};
}

View file

@ -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;
}
}

View file

@ -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) {

View file

@ -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();

View file

@ -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();
}
}
}

View file

@ -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(){