From 715efadbdf98f720cbd58f0fb42a60f8529c9811 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 28 Sep 2011 19:59:58 +0200 Subject: [PATCH] Forward FT data from backend to spectrum2 process --- backends/libpurple/main.cpp | 23 +++++++++++++++++++---- include/transport/networkplugin.h | 4 ++++ include/transport/networkpluginserver.h | 1 + src/networkplugin.cpp | 14 ++++++++++++++ src/networkpluginserver.cpp | 17 +++++++++++++++++ 5 files changed, 55 insertions(+), 4 deletions(-) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index e3d9f975..3cf395cb 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -820,11 +820,24 @@ class SpectrumNetworkPlugin : public NetworkPlugin { } } + void readyForData() { + if (m_waitingXfers.empty()) + return; + std::vector tmp; + tmp.swap(m_waitingXfers); + + LOG4CXX_INFO(logger, "readyForData " << tmp.size()); + BOOST_FOREACH(PurpleXfer *xfer, tmp) { + purple_xfer_ui_ready(xfer); + } + } + std::map m_sessions; std::map m_accounts; std::map m_vcards; std::map m_authRequests; std::map m_xfers; + std::vector m_waitingXfers; Config *config; }; @@ -1345,10 +1358,11 @@ static void XferSendComplete(PurpleXfer *xfer) { } static gssize XferWrite(PurpleXfer *xfer, const guchar *buffer, gssize size) { -// FiletransferRepeater *repeater = (FiletransferRepeater *) xfer->ui_data; -// return repeater->handleLibpurpleData(buffer, size); - std::cout << "DATA " << std::string((const char *) buffer, (size_t) size) << "\n"; - purple_xfer_ui_ready(xfer); + LOG4CXX_INFO(logger, "before_xfer_write " << size); + std::string data((const char *) buffer, (size_t) size); + np->m_waitingXfers.push_back(xfer); + np->handleFTData((unsigned long) xfer->ui_data, data); + LOG4CXX_INFO(logger, "xfer_write " << size); return size; } @@ -1559,6 +1573,7 @@ static void spectrum_sigchld_handler(int sig) } int main(int argc, char **argv) { + Swift::logging = true; GError *error = NULL; GOptionContext *context; context = g_option_context_new("config_file_name or profile name"); diff --git a/include/transport/networkplugin.h b/include/transport/networkplugin.h index acac95af..150f4d94 100644 --- a/include/transport/networkplugin.h +++ b/include/transport/networkplugin.h @@ -50,6 +50,8 @@ class NetworkPlugin { /// Destructor. virtual ~NetworkPlugin(); + + virtual void readyForData() {} /// Call this function when legacy network buddy changed. /// \param user XMPP JID of user for which this event occurs. You can get it from NetworkPlugin::handleLoginRequest(). (eg. "user%gmail.com@xmpp.domain.tld") @@ -144,6 +146,8 @@ class NetworkPlugin { void handleFTStart(const std::string &user, const std::string &buddyName, const std::string fileName, unsigned long size); + void handleFTData(unsigned long ftID, const std::string &data); + /// Called when XMPP user wants to connect legacy network. /// You should connect him to legacy network and call handleConnected or handleDisconnected function later. /// \param user XMPP JID of user for which this event occurs. diff --git a/include/transport/networkpluginserver.h b/include/transport/networkpluginserver.h index 25c7e8b6..13e3df75 100644 --- a/include/transport/networkpluginserver.h +++ b/include/transport/networkpluginserver.h @@ -90,6 +90,7 @@ class NetworkPluginServer { void handleAttentionPayload(const std::string &payload); void handleStatsPayload(Backend *c, const std::string &payload); void handleFTStartPayload(const std::string &payload); + void handleFTDataPayload(const std::string &payload); void handleUserCreated(User *user); void handleRoomJoined(User *user, const std::string &room, const std::string &nickname, const std::string &password); diff --git a/src/networkplugin.cpp b/src/networkplugin.cpp index 117895f3..f002072e 100644 --- a/src/networkplugin.cpp +++ b/src/networkplugin.cpp @@ -52,6 +52,7 @@ NetworkPlugin::NetworkPlugin(Swift::EventLoop *loop, const std::string &host, in m_loop = loop; m_conn = m_factories->getConnectionFactory()->createConnection(); m_conn->onDataRead.connect(boost::bind(&NetworkPlugin::handleDataRead, this, _1)); + m_conn->onDataWritten.connect(boost::bind(&NetworkPlugin::readyForData, this)); m_conn->onConnectFinished.connect(boost::bind(&NetworkPlugin::_handleConnected, this, _1)); m_conn->onDisconnected.connect(boost::bind(&NetworkPlugin::handleDisconnected, this)); @@ -278,6 +279,19 @@ void NetworkPlugin::handleFTStart(const std::string &user, const std::string &bu send(message); } +void NetworkPlugin::handleFTData(unsigned long ftID, const std::string &data) { + pbnetwork::FileTransferData d; + d.set_ftid(ftID); + d.set_data(data); + + std::string message; + d.SerializeToString(&message); + + WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_FT_DATA); + + send(message); +} + void NetworkPlugin::_handleConnected(bool error) { if (error) { // LOG4CXX_ERROR(logger, "Connecting error. Exiting"); diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index d1b8406e..840fcc89 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -587,6 +587,20 @@ void NetworkPluginServer::handleFTStartPayload(const std::string &data) { handleFTAccepted(user, payload.buddyname(), payload.filename(), payload.size(), 255); } +void NetworkPluginServer::handleFTDataPayload(const std::string &data) { + pbnetwork::FileTransferData payload; + if (payload.ParseFromString(data) == false) { + // TODO: ERROR + return; + } + +// User *user = m_userManager->getUser(payload.username()); +// if (!user) +// return; + + LOG4CXX_INFO(logger, "handleFTDataPayload size=" << payload.data().size()); +} + void NetworkPluginServer::handleDataRead(Backend *c, const Swift::SafeByteArray &data) { // Append data to buffer c->data.insert(c->data.end(), data.begin(), data.end()); @@ -669,6 +683,9 @@ void NetworkPluginServer::handleDataRead(Backend *c, const Swift::SafeByteArray case pbnetwork::WrapperMessage_Type_TYPE_FT_START: handleFTStartPayload(wrapper.payload()); break; + case pbnetwork::WrapperMessage_Type_TYPE_FT_DATA: + handleFTDataPayload(wrapper.payload()); + break; default: return; }