diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index e8a1f83f..ee97701d 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -31,6 +31,7 @@ using namespace log4cxx; static LoggerPtr logger_libpurple = Logger::getLogger("backend.libpurple"); static LoggerPtr logger = Logger::getLogger("backend"); +int m_sock; using namespace Transport; @@ -865,6 +866,10 @@ class SpectrumNetworkPlugin : public NetworkPlugin { purple_xfer_ui_ready(xfer); } + void sendData(const std::string &string) { + write(m_sock, string.c_str(), string.size()); + } + void readyForData() { if (m_waitingXfers.empty()) return; @@ -1672,6 +1677,14 @@ static void spectrum_sigchld_handler(int sig) } } +static void transportDataReceived(gpointer data, gint source, PurpleInputCondition cond) { + char buffer[65535]; + char *ptr = buffer; + ssize_t n = read(source, ptr, sizeof(buffer)); + Swift::SafeByteArray d = Swift::createSafeByteArray(buffer, n); + np->handleDataRead(d); +} + int main(int argc, char **argv) { Swift::logging = true; GError *error = NULL; @@ -1757,6 +1770,33 @@ int main(int argc, char **argv) { initPurple(config); + int portno = port; + struct sockaddr_in serv_addr; + + m_sock = socket(AF_INET, SOCK_STREAM, 0); + memset((char *) &serv_addr, 0, sizeof(serv_addr)); + serv_addr.sin_family = AF_INET; + serv_addr.sin_port = htons(portno); + + hostent *hos; // Resolve name + if ((hos = gethostbyname(host)) == NULL) { + // strerror() will not work for gethostbyname() and hstrerror() + // is supposedly obsolete + exit(1); + } + serv_addr.sin_addr.s_addr = *((unsigned long *) hos->h_addr_list[0]); + + if (connect(m_sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { + close(m_sock); + m_sock = 0; + } + + int flags = fcntl(m_sock, F_GETFL); + flags |= O_NONBLOCK; + fcntl(m_sock, F_SETFL, flags); + + purple_input_add(m_sock, PURPLE_INPUT_READ, &transportDataReceived, NULL); + std::map unregistered = config.getUnregistered(); SpectrumEventLoop eventLoop(unregistered["service.eventloop"] == "libev"); np = new SpectrumNetworkPlugin(&config, &eventLoop, host, port); diff --git a/include/transport/networkplugin.h b/include/transport/networkplugin.h index d844821e..386b80f9 100644 --- a/include/transport/networkplugin.h +++ b/include/transport/networkplugin.h @@ -222,6 +222,8 @@ class NetworkPlugin { virtual void handleFTContinueRequest(unsigned long ftID) {} virtual void handleExit() { std::cout << "EXITING\n"; exit(1); } + void handleDataRead(Swift::SafeByteArray &data); + virtual void sendData(const std::string &string) {} private: @@ -241,7 +243,6 @@ class NetworkPlugin { void handleFTFinishPayload(const std::string &payload); void handleFTPausePayload(const std::string &payload); void handleFTContinuePayload(const std::string &payload); - void handleDataRead(boost::shared_ptr data); void _handleConnected(bool error); void handleDisconnected(); diff --git a/src/networkplugin.cpp b/src/networkplugin.cpp index 1cba9184..4ec9bbe7 100644 --- a/src/networkplugin.cpp +++ b/src/networkplugin.cpp @@ -45,19 +45,19 @@ namespace Transport { wrap.SerializeToString(&MESSAGE); NetworkPlugin::NetworkPlugin(Swift::EventLoop *loop, const std::string &host, int port) { - m_factories = new Swift::BoostNetworkFactories(loop); +// m_factories = new Swift::BoostNetworkFactories(loop); m_host = host; m_port = port; m_pingReceived = false; 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)); +// 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)); - m_pingTimer = m_factories->getTimerFactory()->createTimer(30000); - m_pingTimer->onTick.connect(boost::bind(&NetworkPlugin::pingTimeout, this)); +// m_pingTimer = m_factories->getTimerFactory()->createTimer(30000); +// m_pingTimer->onTick.connect(boost::bind(&NetworkPlugin::pingTimeout, this)); connect(); double shared; @@ -313,24 +313,24 @@ void NetworkPlugin::handleFTData(unsigned long ftID, const std::string &data) { void NetworkPlugin::_handleConnected(bool error) { if (error) { // LOG4CXX_ERROR(logger, "Connecting error. Exiting"); - m_pingTimer->stop(); +// m_pingTimer->stop(); handleExit(); } else { // LOG4CXX_INFO(logger, "Connected to NetworkPluginServer"); - m_pingTimer->start(); +// m_pingTimer->start(); } } void NetworkPlugin::handleDisconnected() { // LOG4CXX_INFO(logger, "Disconnected from NetworkPluginServer. Exiting."); - m_pingTimer->stop(); +// m_pingTimer->stop(); handleExit(); } void NetworkPlugin::connect() { LOG4CXX_INFO(logger, "Connecting NetworkPluginServer host " << m_host << " port " << m_port); - m_conn->connect(Swift::HostAddressPort(Swift::HostAddress(m_host), m_port)); +// m_conn->connect(Swift::HostAddressPort(Swift::HostAddress(m_host), m_port)); } void NetworkPlugin::handleLoginPayload(const std::string &data) { @@ -502,8 +502,8 @@ void NetworkPlugin::handleChatStatePayload(const std::string &data, Swift::ChatS } } -void NetworkPlugin::handleDataRead(boost::shared_ptr data) { - m_data.insert(m_data.end(), data->begin(), data->end()); +void NetworkPlugin::handleDataRead(Swift::SafeByteArray &data) { + m_data.insert(m_data.end(), data.begin(), data.end()); while (m_data.size() != 0) { unsigned int expected_size; @@ -590,7 +590,7 @@ void NetworkPlugin::handleDataRead(boost::shared_ptr data) void NetworkPlugin::send(const std::string &data) { char header[4]; *((int*)(header)) = htonl(data.size()); - m_conn->write(Swift::createSafeByteArray(std::string(header, 4) + data)); + sendData(std::string(header, 4) + data); } void NetworkPlugin::sendPong() { @@ -631,7 +631,7 @@ void NetworkPlugin::pingTimeout() { handleExit(); } m_pingReceived = false; - m_pingTimer->start(); +// m_pingTimer->start(); } }