aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--protocols/msn/msn.c2
-rw-r--r--protocols/msn/msn.h7
-rw-r--r--protocols/msn/ns.c23
-rw-r--r--protocols/msn/sb.c25
4 files changed, 48 insertions, 9 deletions
diff --git a/protocols/msn/msn.c b/protocols/msn/msn.c
index 8930847d..2132f3d8 100644
--- a/protocols/msn/msn.c
+++ b/protocols/msn/msn.c
@@ -40,6 +40,8 @@ static void msn_init( account_t *acc )
s->flags |= ACC_SET_NOSAVE | ACC_SET_ONLINE_ONLY;
s = set_add( &acc->set, "mail_notifications", "false", set_eval_bool, acc );
+
+ s = 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 84914bc3..68ca32f8 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;
@@ -178,5 +184,6 @@ 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 );
#endif //_MSN_H
diff --git a/protocols/msn/ns.c b/protocols/msn/ns.c
index d78d753a..1f6f8c74 100644
--- a/protocols/msn/ns.c
+++ b/protocols/msn/ns.c
@@ -435,12 +435,25 @@ 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 );
+ 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 );
+ }
}
else if( strcmp( cmd[0], "NLN" ) == 0 )
{
const struct msn_away_state *st;
+ struct msn_switchboard *sb;
if( num_parts != 5 )
{
@@ -462,6 +475,12 @@ 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 );
+
+ if( ( sb = msn_sb_by_handle( ic, cmd[1] ) ) && sb->keepalive > 0 )
+ {
+ b_event_remove( sb->keepalive );
+ sb->keepalive = 0;
+ }
}
else if( strcmp( cmd[0], "RNG" ) == 0 )
{
diff --git a/protocols/msn/sb.c b/protocols/msn/sb.c
index e9526234..b4686e80 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 );
@@ -763,3 +768,9 @@ 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 )
+{
+ struct msn_switchboard *sb = data;
+ return sb->ready && msn_sb_sendmessage( sb, SB_KEEPALIVE_MESSAGE );
+}