diff options
| author | Wilmer van der Gaast <wilmer@gaast.net> | 2010-04-10 02:05:39 +0100 | 
|---|---|---|
| committer | Wilmer van der Gaast <wilmer@gaast.net> | 2010-04-10 02:05:39 +0100 | 
| commit | bb839e8ae5b6228f9dcd8dda96b4e3ac5c0f63ba (patch) | |
| tree | 009de5eb7fa9e3e495ab0b3f13b97eee9b0d9ac8 /protocols | |
| parent | 9bf248155cb870be9dce921d58c905f5a5c1dad3 (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.
Diffstat (limited to 'protocols')
| -rw-r--r-- | protocols/msn/msn.h | 3 | ||||
| -rw-r--r-- | protocols/msn/ns.c | 17 | ||||
| -rw-r--r-- | protocols/msn/sb.c | 33 | 
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; +	} +} | 
