diff options
| -rw-r--r-- | protocols/msn/msn.c | 1 | ||||
| -rw-r--r-- | protocols/msn/msn.h | 8 | ||||
| -rw-r--r-- | protocols/msn/ns.c | 10 | ||||
| -rw-r--r-- | protocols/msn/sb.c | 56 | 
4 files changed, 66 insertions, 9 deletions
| diff --git a/protocols/msn/msn.c b/protocols/msn/msn.c index 37f6e1be..7dbdb9d6 100644 --- a/protocols/msn/msn.c +++ b/protocols/msn/msn.c @@ -37,6 +37,7 @@ static void msn_init( account_t *acc )  	set_add( &acc->set, "display_name", NULL, set_eval_display_name, acc );  	set_add( &acc->set, "local_display_name", "false", set_eval_bool, acc );  	set_add( &acc->set, "mail_notifications", "false", set_eval_bool, acc ); +	set_add( &acc->set, "switchboard_keepalives", "false", set_eval_bool, acc );  }  static void msn_login( account_t *acc ) diff --git a/protocols/msn/msn.h b/protocols/msn/msn.h index 02d180b6..83a080a3 100644 --- a/protocols/msn/msn.h +++ b/protocols/msn/msn.h @@ -30,6 +30,7 @@   */  #define TYPING_NOTIFICATION_MESSAGE "\r\r\rBEWARE, ME R TYPINK MESSAGE!!!!\r\r\r"  #define GROUPCHAT_SWITCHBOARD_MESSAGE "\r\r\rME WANT TALK TO MANY PEOPLE\r\r\r" +#define SB_KEEPALIVE_MESSAGE "\r\r\rDONT HANG UP ON ME!\r\r\r"  #ifdef DEBUG_MSN  #define debug( text... ) imcb_log( ic, text ); @@ -53,6 +54,10 @@                             "TypingUser: %s\r\n" \                             "\r\n\r\n" +#define SB_KEEPALIVE_HEADERS "MIME-Version: 1.0\r\n" \ +                             "Content-Type: text/x-ping\r\n" \ +                             "\r\n\r\n" +  #define PROFILE_URL "http://members.msn.com/"  struct msn_data @@ -82,6 +87,7 @@ struct msn_switchboard  	int fd;  	gint inp;  	struct msn_handler_data *handler; +	gint keepalive;  	int trId;  	int ready; @@ -179,5 +185,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 ); +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 8181c1af..2f656ea5 100644 --- a/protocols/msn/ns.c +++ b/protocols/msn/ns.c @@ -421,8 +421,12 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )  	}  	else if( strcmp( cmd[0], "FLN" ) == 0 )  	{ -		if( cmd[1] ) -			imcb_buddy_status( ic, cmd[1], 0, NULL, NULL ); +		if( cmd[1] == NULL ) +			return 1; +		 +		imcb_buddy_status( ic, cmd[1], 0, NULL, NULL ); +		 +		msn_sb_start_keepalives( msn_sb_by_handle( ic, cmd[1] ), TRUE );  	}  	else if( strcmp( cmd[0], "NLN" ) == 0 )  	{ @@ -448,6 +452,8 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )  		imcb_buddy_status( ic, cmd[2], OPT_LOGGED_IN |   		                   ( st != msn_away_state_list ? OPT_AWAY : 0 ),  		                   st->name, NULL ); +		 +		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 e9526234..e2ee8570 100644 --- a/protocols/msn/sb.c +++ b/protocols/msn/sb.c @@ -167,7 +167,18 @@ int msn_sb_sendmessage( struct msn_switchboard *sb, char *text )  		int i, j;  		/* Build the message. Convert LF to CR-LF for normal messages. */ -		if( strcmp( text, TYPING_NOTIFICATION_MESSAGE ) != 0 ) +		if( strcmp( text, TYPING_NOTIFICATION_MESSAGE ) == 0 ) +		{ +			i = strlen( MSN_TYPING_HEADERS ) + strlen( sb->ic->acc->user ); +			buf = g_new0( char, i ); +			i = g_snprintf( buf, i, MSN_TYPING_HEADERS, sb->ic->acc->user ); +		} +		else if( strcmp( text, SB_KEEPALIVE_MESSAGE ) == 0 ) +		{ +			buf = g_strdup( SB_KEEPALIVE_HEADERS ); +			i = strlen( buf ); +		} +		else  		{  			buf = g_new0( char, sizeof( MSN_MESSAGE_HEADERS ) + strlen( text ) * 2 + 1 );  			i = strlen( MSN_MESSAGE_HEADERS ); @@ -181,12 +192,6 @@ int msn_sb_sendmessage( struct msn_switchboard *sb, char *text )  				buf[i++] = text[j];  			}  		} -		else -		{ -			i = strlen( MSN_TYPING_HEADERS ) + strlen( sb->ic->acc->user ); -			buf = g_new0( char, i ); -			i = g_snprintf( buf, i, MSN_TYPING_HEADERS, sb->ic->acc->user ); -		}  		/* Build the final packet (MSG command + the message). */  		packet = g_strdup_printf( "MSG %d N %d\r\n%s", ++sb->trId, i, buf ); @@ -249,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 ); @@ -470,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 )  	{ @@ -519,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 ) @@ -580,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; @@ -763,3 +775,33 @@ static int msn_sb_message( gpointer data, char *msg, int msglen, char **cmd, int  	return( 1 );  } + +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; +	} +} | 
