diff options
author | Wilmer van der Gaast <wilmer@gaast.net> | 2012-09-16 18:40:44 +0100 |
---|---|---|
committer | Wilmer van der Gaast <wilmer@gaast.net> | 2012-09-16 18:40:44 +0100 |
commit | 79bb7e412d28e8afe734762e8bd3e4c488a53562 (patch) | |
tree | 4829e4a160c9f3110e19e45fd5608525d393a4cf | |
parent | 080c43a862bca535e51682423afc9d0f75ea1d02 (diff) |
Online status should be read properly now.
-rw-r--r-- | protocols/msn/msn.h | 5 | ||||
-rw-r--r-- | protocols/msn/msn_util.c | 10 | ||||
-rw-r--r-- | protocols/msn/ns.c | 70 | ||||
-rw-r--r-- | protocols/msn/sb.c | 4 |
4 files changed, 43 insertions, 46 deletions
diff --git a/protocols/msn/msn.h b/protocols/msn/msn.h index ed6db6f0..7c23f282 100644 --- a/protocols/msn/msn.h +++ b/protocols/msn/msn.h @@ -1,7 +1,7 @@ /********************************************************************\ * BitlBee -- An IRC to other IM-networks gateway * * * - * Copyright 2002-2010 Wilmer van der Gaast and others * + * Copyright 2002-2012 Wilmer van der Gaast and others * \********************************************************************/ /* MSN module */ @@ -252,6 +252,7 @@ gint msn_domaintree_cmp( gconstpointer a_, gconstpointer b_ ); struct msn_group *msn_group_by_name( struct im_connection *ic, const char *name ); struct msn_group *msn_group_by_id( struct im_connection *ic, const char *id ); int msn_ns_set_display_name( struct im_connection *ic, const char *value ); +const char *msn_normalize_handle( const char *handle ); /* tables.c */ const struct msn_away_state *msn_away_state_by_number( int number ); @@ -262,7 +263,7 @@ const struct msn_status_code *msn_status_by_number( int number ); /* sb.c */ int msn_sb_write( struct msn_switchboard *sb, const char *fmt, ... ) G_GNUC_PRINTF( 2, 3 );; struct msn_switchboard *msn_sb_create( struct im_connection *ic, char *host, int port, char *key, int session ); -struct msn_switchboard *msn_sb_by_handle( struct im_connection *ic, char *handle ); +struct msn_switchboard *msn_sb_by_handle( struct im_connection *ic, const char *handle ); struct msn_switchboard *msn_sb_by_chat( struct groupchat *c ); struct msn_switchboard *msn_sb_spare( struct im_connection *ic ); int msn_sb_sendmessage( struct msn_switchboard *sb, char *text ); diff --git a/protocols/msn/msn_util.c b/protocols/msn/msn_util.c index d5a74a47..f2f67eb3 100644 --- a/protocols/msn/msn_util.c +++ b/protocols/msn/msn_util.c @@ -1,7 +1,7 @@ /********************************************************************\ * BitlBee -- An IRC to other IM-networks gateway * * * - * Copyright 2002-2010 Wilmer van der Gaast and others * + * Copyright 2002-2012 Wilmer van der Gaast and others * \********************************************************************/ /* MSN module - Miscellaneous utilities */ @@ -536,3 +536,11 @@ int msn_ns_set_display_name( struct im_connection *ic, const char *value ) and won't give proper feedback yet if it doesn't. */ return msn_ns_write( ic, -1, "PRP %d MFN %s\r\n", ++md->trId, fn ); } + +const char *msn_normalize_handle( const char *handle ) +{ + if( strncmp( handle, "1:", 2 ) == 0 ) + return handle + 2; + else + return handle; +} diff --git a/protocols/msn/ns.c b/protocols/msn/ns.c index f8f18c80..4f80f490 100644 --- a/protocols/msn/ns.c +++ b/protocols/msn/ns.c @@ -371,9 +371,11 @@ static int msn_ns_command( struct msn_handler_data *handler, char **cmd, int num g_free( resp ); return st; } - else if( strcmp( cmd[0], "ILN" ) == 0 ) + else if( strcmp( cmd[0], "ILN" ) == 0 || strcmp( cmd[0], "NLN" ) == 0 ) { const struct msn_away_state *st; + const char *handle; + int cap = 0; if( num_parts < 6 ) { @@ -381,59 +383,45 @@ static int msn_ns_command( struct msn_handler_data *handler, char **cmd, int num imc_logout( ic, TRUE ); return( 0 ); } + /* ILN and NLN are more or less the same, except ILN has a trId + at the start, and NLN has a capability field at the end. + Does ILN still exist BTW? */ + if( cmd[0][1] == 'I' ) + cmd ++; + else + cap = atoi( cmd[4] ); + + handle = msn_normalize_handle( cmd[2] ); + if( strcmp( handle, ic->acc->user ) == 0 ) + return 1; /* That's me! */ - http_decode( cmd[5] ); - imcb_rename_buddy( ic, cmd[3], cmd[5] ); + http_decode( cmd[3] ); + imcb_rename_buddy( ic, handle, cmd[3] ); - st = msn_away_state_by_code( cmd[2] ); + st = msn_away_state_by_code( cmd[1] ); if( !st ) { /* FIXME: Warn/Bomb about unknown away state? */ st = msn_away_state_list + 1; } - imcb_buddy_status( ic, cmd[3], OPT_LOGGED_IN | - ( st != msn_away_state_list ? OPT_AWAY : 0 ), + imcb_buddy_status( ic, handle, OPT_LOGGED_IN | + ( st != msn_away_state_list ? OPT_AWAY : 0 ) | + ( cap & 1 ? OPT_MOBILE : 0 ), st->name, NULL ); + + msn_sb_stop_keepalives( msn_sb_by_handle( ic, handle ) ); } else if( strcmp( cmd[0], "FLN" ) == 0 ) { + const char *handle; + 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 ) - { - const struct msn_away_state *st; - int cap; - - if( num_parts < 6 ) - { - imcb_error( ic, "Syntax error" ); - imc_logout( ic, TRUE ); - return( 0 ); - } - - http_decode( cmd[4] ); - cap = atoi( cmd[5] ); - imcb_rename_buddy( ic, cmd[2], cmd[4] ); - - st = msn_away_state_by_code( cmd[1] ); - if( !st ) - { - /* FIXME: Warn/Bomb about unknown away state? */ - st = msn_away_state_list + 1; - } - - imcb_buddy_status( ic, cmd[2], OPT_LOGGED_IN | - ( st != msn_away_state_list ? OPT_AWAY : 0 ) | - ( cap & 1 ? OPT_MOBILE : 0 ), - st->name, NULL ); - - msn_sb_stop_keepalives( msn_sb_by_handle( ic, cmd[2] ) ); + handle = msn_normalize_handle( cmd[1] ); + imcb_buddy_status( ic, handle, 0, NULL, NULL ); + msn_sb_start_keepalives( msn_sb_by_handle( ic, handle ), TRUE ); } else if( strcmp( cmd[0], "RNG" ) == 0 ) { @@ -480,7 +468,7 @@ static int msn_ns_command( struct msn_handler_data *handler, char **cmd, int num } else { - sb->who = g_strdup( cmd[5] ); + sb->who = g_strdup( msn_normalize_handle( cmd[5] ) ); } } else if( strcmp( cmd[0], "OUT" ) == 0 ) @@ -706,7 +694,7 @@ static int msn_ns_message( struct msn_handler_data *handler, char *msg, int msgl ( psm = xt_find_node( ubx->children, "PSM" ) ) ) psm_text = psm->text; - imcb_buddy_status_msg( ic, cmd[1], psm_text ); + imcb_buddy_status_msg( ic, msn_normalize_handle( cmd[1] ), psm_text ); xt_free_node( ubx ); } else if( strcmp( cmd[0], "ADL" ) == 0 ) diff --git a/protocols/msn/sb.c b/protocols/msn/sb.c index c8e97433..a1e07b73 100644 --- a/protocols/msn/sb.c +++ b/protocols/msn/sb.c @@ -1,7 +1,7 @@ /********************************************************************\ * BitlBee -- An IRC to other IM-networks gateway * * * - * Copyright 2002-2010 Wilmer van der Gaast and others * + * Copyright 2002-2012 Wilmer van der Gaast and others * \********************************************************************/ /* MSN module - Switchboard server callbacks and utilities */ @@ -121,7 +121,7 @@ struct msn_switchboard *msn_sb_create( struct im_connection *ic, char *host, int return( sb ); } -struct msn_switchboard *msn_sb_by_handle( struct im_connection *ic, char *handle ) +struct msn_switchboard *msn_sb_by_handle( struct im_connection *ic, const char *handle ) { struct msn_data *md = ic->proto_data; struct msn_switchboard *sb; |