experimental libpurple backend without boost service thread
This commit is contained in:
parent
26684d8ad9
commit
4503fd1ded
3 changed files with 58 additions and 17 deletions
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue