Changeset - 4503fd1dede8
[Not reviewed]
0 3 0
HanzZ - 14 years ago 2011-10-13 21:46:11
hanzz.k@gmail.com
experimental libpurple backend without boost service thread
3 files changed with 59 insertions and 18 deletions:
0 comments (0 inline, 0 general)
backends/libpurple/main.cpp
Show inline comments
 
@@ -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);
include/transport/networkplugin.h
Show inline comments
 
@@ -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();
 

	
src/networkplugin.cpp
Show inline comments
 
@@ -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_pingTimer = m_factories->getTimerFactory()->createTimer(30000);
 
	m_pingTimer->onTick.connect(boost::bind(&NetworkPlugin::pingTimeout, 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)); 
 
	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();
 
}
 

	
 
}
0 comments (0 inline, 0 general)