# HG changeset patch # User mikael # Date 1114364328 0 # Node ID edb5591e2e64ffdc6d34fbe1acce853581f1bacc # Parent d896962c16fa14d1e6983ce67216122ad43c127b [/trunk] Changeset 126 by mikael * Fix keepalive. diff -r d896962c16fa -r edb5591e2e64 mcabber/connwrap/connwrap.c --- a/mcabber/connwrap/connwrap.c Sat Apr 23 21:12:36 2005 +0000 +++ b/mcabber/connwrap/connwrap.c Sun Apr 24 17:38:48 2005 +0000 @@ -7,6 +7,7 @@ #include #include #include +#include #define PROXY_TIMEOUT 10 // HTTP proxy timeout in seconds (for the CONNECT method) diff -r d896962c16fa -r edb5591e2e64 mcabber/src/TODO --- a/mcabber/src/TODO Sat Apr 23 21:12:36 2005 +0000 +++ b/mcabber/src/TODO Sun Apr 24 17:38:48 2005 +0000 @@ -3,6 +3,7 @@ * Should not stay on buddy buffer when one moves to a group * Pending message not displayed if buddy outside Contact window +* Check keepalive TODO: diff -r d896962c16fa -r edb5591e2e64 mcabber/src/jabglue.c --- a/mcabber/src/jabglue.c Sat Apr 23 21:12:36 2005 +0000 +++ b/mcabber/src/jabglue.c Sun Apr 24 17:38:48 2005 +0000 @@ -31,8 +31,11 @@ #define JABBERSSLPORT 5223 jconn jc; +time_t LastPingTime; +unsigned int KeepaliveDelay; static int s_id = 1; // FIXME which use?? static int regmode, regdone; +unsigned char online; char imstatus2char[imstatus_size] = { '_', 'o', 'i', 'f', 'd', 'c', 'n', 'a' @@ -116,7 +119,7 @@ jab_state_handler(jc, &statehandler); if (jc->user) { - //fonline = TRUE; + online = TRUE; jstate = STATE_CONNECTING; statehandler(0, -1); jab_start(jc); @@ -130,12 +133,24 @@ statehandler(jc, JCONN_STATE_OFF); } +inline void jb_reset_keepalive() +{ + time(&LastPingTime); +} + void jb_keepalive() { if (jc) { // XXX Only if connected... - jab_send_raw(jc, " "); + jab_send_raw(jc, " \t "); + scr_LogPrint("Sent keepalive"); } + jb_reset_keepalive(); +} + +void jb_set_keepalive_delay(unsigned int delay) +{ + KeepaliveDelay = delay; } void jb_main() @@ -143,6 +158,8 @@ xmlnode x, z; char *cid; + if (!online) + return; if (jc && jc->state == JCONN_STATE_CONNECTING) { jab_start(jc); return; @@ -167,7 +184,7 @@ if (!jc || jc->state == JCONN_STATE_OFF) { scr_LogPrint("Unable to connect to the server"); - // fonline = FALSE; + online = FALSE; } } @@ -176,6 +193,14 @@ } else if (jc->state == JCONN_STATE_OFF || jc->fd == -1) { statehandler(jc, JCONN_STATE_OFF); } + + // Keepalive + if (KeepaliveDelay) { + time_t now; + time(&now); + if (now > LastPingTime + KeepaliveDelay) + jb_keepalive(); + } } void setjabberstatus(enum imstatus st, char *msg) @@ -362,7 +387,7 @@ switch(state) { case JCONN_STATE_OFF: - /* jhook.flogged = jhook.fonline = FALSE; */ + online = FALSE; if (previous_state != JCONN_STATE_OFF) { scr_LogPrint("+ JCONN_STATE_OFF"); @@ -383,7 +408,7 @@ case JCONN_STATE_ON: scr_LogPrint("+ JCONN_STATE_ON"); - // if (regmode) jhook.fonline = TRUE; + online = TRUE; break; case JCONN_STATE_CONNECTING: @@ -407,6 +432,7 @@ enum imstatus ust; // int npos; + jb_reset_keepalive(); // reset keepalive delay jpacket_reset(packet); p = xmlnode_get_attrib(packet->x, "from"); if (p) from = p; diff -r d896962c16fa -r edb5591e2e64 mcabber/src/jabglue.h --- a/mcabber/src/jabglue.h Sat Apr 23 21:12:36 2005 +0000 +++ b/mcabber/src/jabglue.h Sun Apr 24 17:38:48 2005 +0000 @@ -29,8 +29,10 @@ jconn jb_connect(const char *jid, unsigned int port, int ssl, const char *pass); void jb_disconnect(void); -void jb_keepalive(); void jb_main(); void jb_send_msg(const char *, const char *); +void jb_keepalive(); +inline void jb_reset_keepalive(); +void jb_set_keepalive_delay(unsigned int delay); #endif /* __JABGLUE_H__ */ diff -r d896962c16fa -r edb5591e2e64 mcabber/src/main.c --- a/mcabber/src/main.c Sat Apr 23 21:12:36 2005 +0000 +++ b/mcabber/src/main.c Sun Apr 24 17:38:48 2005 +0000 @@ -18,21 +18,14 @@ void sig_handler(int signum) { - switch (signum) { - case SIGALRM: - jb_keepalive(); - break; - - case SIGTERM: + if (signum == SIGTERM) { // bud_TerminateBuddies(); scr_TerminateCurses(); jb_disconnect(); printf("Killed by SIGTERM\nBye!\n"); exit(EXIT_SUCCESS); - break; - } - signal(SIGALRM, sig_handler); + ut_WriteLog("Caught signal: %d\n", signum); } ssize_t my_getpass (char **passstr, size_t *n) @@ -177,15 +170,12 @@ return -2; } - ping = 20; + ping = 40; if (cfg_read("pinginterval")) ping = (unsigned int) atoi(cfg_read("pinginterval")); - + jb_set_keepalive_delay(ping); ut_WriteLog("Ping interval stablished: %d secs\n", ping); - ut_WriteLog("Entering into main loop...\n\n"); - ut_WriteLog("Ready to send/receive messages...\n"); - optstring = cfg_read("hide_offline_buddies"); if (optstring && (atoi(optstring) > 0)) buddylist_hide_offline_buddies(TRUE); @@ -193,9 +183,12 @@ /* Initialize commands system */ cmd_init(); + ut_WriteLog("Entering into main loop...\n\n"); + ut_WriteLog("Ready to send/receive messages...\n"); + + jb_reset_keepalive(); keypad(scr_GetInputWindow(), TRUE); while (ret != 255) { - alarm(ping); key = scr_Getch(); if (key != ERR) ret = process_key(key);