aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2010-04-10 02:05:39 +0100
committerWilmer van der Gaast <wilmer@gaast.net>2010-04-10 02:05:39 +0100
commitbb839e8ae5b6228f9dcd8dda96b4e3ac5c0f63ba (patch)
tree009de5eb7fa9e3e495ab0b3f13b97eee9b0d9ac8
parent9bf248155cb870be9dce921d58c905f5a5c1dad3 (diff)
Be more clever with keepalives; detect when a switchboard is opened with
someone who's offline already. Still a hack but it eases the pain a little bit.
-rw-r--r--protocols/msn/msn.h3
-rw-r--r--protocols/msn/ns.c17
-rw-r--r--protocols/msn/sb.c33
3 files changed, 36 insertions, 17 deletions
diff --git a/protocols/msn/msn.h b/protocols/msn/msn.h
index 68ca32f8..61101546 100644
--- a/protocols/msn/msn.h
+++ b/protocols/msn/msn.h
@@ -184,6 +184,7 @@ struct groupchat *msn_sb_to_chat( struct msn_switchboard *sb );
void msn_sb_destroy( struct msn_switchboard *sb );
gboolean msn_sb_connected( gpointer data, gint source, b_input_condition cond );
int msn_sb_write_msg( struct im_connection *ic, struct msn_message *m );
-gboolean msn_sb_keepalive( gpointer data, gint source, b_input_condition cond );
+void msn_sb_start_keepalives( struct msn_switchboard *sb, gboolean initial );
+void msn_sb_stop_keepalives( struct msn_switchboard *sb );
#endif //_MSN_H
diff --git a/protocols/msn/ns.c b/protocols/msn/ns.c
index 1f6f8c74..4056bad7 100644
--- a/protocols/msn/ns.c
+++ b/protocols/msn/ns.c
@@ -435,25 +435,16 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )
}
else if( strcmp( cmd[0], "FLN" ) == 0 )
{
- struct msn_switchboard *sb;
-
if( cmd[1] == NULL )
return 1;
imcb_buddy_status( ic, cmd[1], 0, NULL, NULL );
- if( ( sb = msn_sb_by_handle( ic, cmd[1] ) ) &&
- set_getbool( &ic->acc->set, "switchboard_keepalives" ) &&
- sb->keepalive == 0 )
- {
- msn_sb_keepalive( sb, 0, 0 );
- sb->keepalive = b_timeout_add( 20000, msn_sb_keepalive, sb );
- }
+ msn_sb_start_keepalives( msn_sb_by_handle( ic, cmd[1] ), TRUE );
}
else if( strcmp( cmd[0], "NLN" ) == 0 )
{
const struct msn_away_state *st;
- struct msn_switchboard *sb;
if( num_parts != 5 )
{
@@ -476,11 +467,7 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )
( st != msn_away_state_list ? OPT_AWAY : 0 ),
st->name, NULL );
- if( ( sb = msn_sb_by_handle( ic, cmd[1] ) ) && sb->keepalive > 0 )
- {
- b_event_remove( sb->keepalive );
- sb->keepalive = 0;
- }
+ msn_sb_stop_keepalives( msn_sb_by_handle( ic, cmd[2] ) );
}
else if( strcmp( cmd[0], "RNG" ) == 0 )
{
diff --git a/protocols/msn/sb.c b/protocols/msn/sb.c
index b4686e80..e2ee8570 100644
--- a/protocols/msn/sb.c
+++ b/protocols/msn/sb.c
@@ -254,6 +254,7 @@ void msn_sb_destroy( struct msn_switchboard *sb )
debug( "Destroying switchboard: %s", sb->who ? sb->who : sb->key ? sb->key : "" );
msn_msgq_purge( ic, &sb->msgq );
+ msn_sb_stop_keepalives( sb );
if( sb->key ) g_free( sb->key );
if( sb->who ) g_free( sb->who );
@@ -475,6 +476,8 @@ static int msn_sb_command( gpointer data, char **cmd, int num_parts )
}
sb->ready = 1;
+
+ msn_sb_start_keepalives( sb, FALSE );
}
else if( strcmp( cmd[0], "CAL" ) == 0 )
{
@@ -524,6 +527,8 @@ static int msn_sb_command( gpointer data, char **cmd, int num_parts )
sb->msgq = g_slist_remove( sb->msgq, m );
}
+ msn_sb_start_keepalives( sb, FALSE );
+
return( st );
}
else if( sb->who )
@@ -585,6 +590,8 @@ static int msn_sb_command( gpointer data, char **cmd, int num_parts )
if( sb->who )
{
+ msn_sb_stop_keepalives( sb );
+
/* This is a single-person chat, and the other person is leaving. */
g_free( sb->who );
sb->who = NULL;
@@ -769,8 +776,32 @@ static int msn_sb_message( gpointer data, char *msg, int msglen, char **cmd, int
return( 1 );
}
-gboolean msn_sb_keepalive( gpointer data, gint source, b_input_condition cond )
+static gboolean msn_sb_keepalive( gpointer data, gint source, b_input_condition cond )
{
struct msn_switchboard *sb = data;
return sb->ready && msn_sb_sendmessage( sb, SB_KEEPALIVE_MESSAGE );
}
+
+void msn_sb_start_keepalives( struct msn_switchboard *sb, gboolean initial )
+{
+ struct buddy *b;
+
+ if( sb && sb->who && sb->keepalive == 0 &&
+ ( b = imcb_find_buddy( sb->ic, sb->who ) ) && !b->present &&
+ set_getbool( &sb->ic->acc->set, "switchboard_keepalives" ) )
+ {
+ if( initial )
+ msn_sb_keepalive( sb, 0, 0 );
+
+ sb->keepalive = b_timeout_add( 20000, msn_sb_keepalive, sb );
+ }
+}
+
+void msn_sb_stop_keepalives( struct msn_switchboard *sb )
+{
+ if( sb && sb->keepalive > 0 )
+ {
+ b_event_remove( sb->keepalive );
+ sb->keepalive = 0;
+ }
+}