experimental libpurple backend without boost service thread

This commit is contained in:
HanzZ 2011-10-13 21:46:11 +02:00
parent 26684d8ad9
commit 4503fd1ded
3 changed files with 58 additions and 17 deletions

View file

@ -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<std::string, std::string> unregistered = config.getUnregistered();
SpectrumEventLoop eventLoop(unregistered["service.eventloop"] == "libev");
np = new SpectrumNetworkPlugin(&config, &eventLoop, host, port);

View file

@ -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<Swift::SafeByteArray> data);
void _handleConnected(bool error);
void handleDisconnected();

View file

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