From 2626035bc26c7f61024f8c79fbec0f4b6fee7505 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Mon, 14 Nov 2011 20:29:57 +0100 Subject: [PATCH] Disconnect if ping is not received for 30 seconds --- backends/libpurple/main.cpp | 6 ++++++ include/transport/networkplugin.h | 3 ++- plugin/src/networkplugin.cpp | 7 +++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index bbfcbb1c..65d719e3 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 334fab8b..8bfbf221 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 82aa3bb4..fb5d58fb 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;