diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index bbfcbb1c358be77d2e9889c28ec93c6dbd819d25..65d719e3d6b22b03aa5d48c0eabbd144a29f0642 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -1230,6 +1230,11 @@ static gboolean disconnectMe(void *data) { return FALSE; } +static gboolean pingTimeout(void *data) { + np->checkPing(); + return TRUE; +} + static void connection_report_disconnect(PurpleConnection *gc, PurpleConnectionError reason, const char *text){ PurpleAccount *account = purple_connection_get_account(gc); np->handleDisconnected(np->m_accounts[account], (int) reason, text ? text : ""); @@ -1960,6 +1965,7 @@ int main(int argc, char **argv) { m_sock = create_socket(host, port); purple_input_add(m_sock, PURPLE_INPUT_READ, &transportDataReceived, NULL); + purple_timeout_add_seconds(30, pingTimeout, NULL); np = new SpectrumNetworkPlugin(host, port); bool libev = KEYFILE_STRING("service", "eventloop") == "libev"; diff --git a/include/transport/networkplugin.h b/include/transport/networkplugin.h index 334fab8b3ec4e951a4e762d518a5dce02f9f3ffd..8bfbf22151d1115e45ae4e99d10dd47860efd643 100644 --- a/include/transport/networkplugin.h +++ b/include/transport/networkplugin.h @@ -214,7 +214,8 @@ class NetworkPlugin { virtual void handleExitRequest() { exit(1); } void handleDataRead(std::string &data); virtual void sendData(const std::string &string) {} - + + void checkPing(); private: void handleLoginPayload(const std::string &payload); diff --git a/plugin/src/networkplugin.cpp b/plugin/src/networkplugin.cpp index 82aa3bb45f4c640d1d5f7ecd609d6df7e77c5ef7..fb5d58fbf6d1cd6e24d9d87cab3470a8a527357e 100644 --- a/plugin/src/networkplugin.cpp +++ b/plugin/src/networkplugin.cpp @@ -553,6 +553,13 @@ void NetworkPlugin::send(const std::string &data) { sendData(std::string(header, 4) + data); } +void NetworkPlugin::checkPing() { + if (m_pingReceived == false) { + handleExitRequest(); + } + m_pingReceived = false; +} + void NetworkPlugin::sendPong() { m_pingReceived = true; std::string message;