Forward FT data from backend to spectrum2 process

This commit is contained in:
HanzZ 2011-09-28 19:59:58 +02:00
parent b3725b47c4
commit 715efadbdf
5 changed files with 55 additions and 4 deletions

View file

@ -820,11 +820,24 @@ class SpectrumNetworkPlugin : public NetworkPlugin {
}
}
void readyForData() {
if (m_waitingXfers.empty())
return;
std::vector<PurpleXfer *> tmp;
tmp.swap(m_waitingXfers);
LOG4CXX_INFO(logger, "readyForData " << tmp.size());
BOOST_FOREACH(PurpleXfer *xfer, tmp) {
purple_xfer_ui_ready(xfer);
}
}
std::map<std::string, PurpleAccount *> m_sessions;
std::map<PurpleAccount *, std::string> m_accounts;
std::map<std::string, unsigned int> m_vcards;
std::map<std::string, authRequest *> m_authRequests;
std::map<std::string, PurpleXfer *> m_xfers;
std::vector<PurpleXfer *> 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");

View file

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

View file

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

View file

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

View file

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