diff options
Diffstat (limited to 'protocols/msn/ns.c')
| -rw-r--r-- | protocols/msn/ns.c | 131 | 
1 files changed, 111 insertions, 20 deletions
| diff --git a/protocols/msn/ns.c b/protocols/msn/ns.c index f9c8ab29..40c4cdec 100644 --- a/protocols/msn/ns.c +++ b/protocols/msn/ns.c @@ -34,6 +34,7 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts );  static int msn_ns_message( gpointer data, char *msg, int msglen, char **cmd, int num_parts );  static void msn_auth_got_passport_token( struct msn_auth_data *mad ); +static gboolean msn_ns_got_display_name( struct im_connection *ic, char *name );  gboolean msn_ns_connected( gpointer data, gint source, b_input_condition cond )  { @@ -74,7 +75,7 @@ gboolean msn_ns_connected( gpointer data, gint source, b_input_condition cond )  	g_snprintf( s, sizeof( s ), "VER %d MSNP8 CVR0\r\n", ++md->trId );  	if( msn_write( ic, s, strlen( s ) ) )  	{ -		ic->inpa = b_input_add( md->fd, GAIM_INPUT_READ, msn_ns_callback, ic ); +		ic->inpa = b_input_add( md->fd, B_EV_IO_READ, msn_ns_callback, ic );  		imcb_log( ic, "Connected to server, waiting for reply" );  	} @@ -230,25 +231,10 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )  		}  		else if( num_parts >= 7 && strcmp( cmd[2], "OK" ) == 0 )  		{ -			set_t *s; -			  			if( num_parts == 7 ) -			{ -				http_decode( cmd[4] ); -				 -				strncpy( ic->displayname, cmd[4], sizeof( ic->displayname ) ); -				ic->displayname[sizeof(ic->displayname)-1] = 0; -				 -				if( ( s = set_find( &ic->acc->set, "display_name" ) ) ) -				{ -					g_free( s->value ); -					s->value = g_strdup( cmd[4] ); -				} -			} +				msn_ns_got_display_name( ic, cmd[4] );  			else -			{  				imcb_log( ic, "Warning: Friendly name in server response was corrupted" ); -			}  			imcb_log( ic, "Authenticated, getting buddy list" ); @@ -435,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 )  	{ @@ -462,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 )  	{ @@ -540,8 +532,14 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )  		}  		else if( num_parts >= 6 && strcmp( cmd[2], "FL" ) == 0 )  		{ +			const char *group = NULL; +			int num; +			 +			if( cmd[6] != NULL && sscanf( cmd[6], "%d", &num ) == 1 && num < md->groupcount ) +				group = md->grouplist[num]; +			  			http_decode( cmd[5] ); -			imcb_add_buddy( ic, cmd[4], NULL ); +			imcb_add_buddy( ic, cmd[4], group );  			imcb_rename_buddy( ic, cmd[4], cmd[5] );  		}  	} @@ -566,6 +564,9 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )  		imc_logout( ic, allow_reconnect );  		return( 0 );  	} +#if 0 +	/* Discard this one completely for now since I don't care about the ack +	   and since MSN servers can apparently screw up the formatting. */  	else if( strcmp( cmd[0], "REA" ) == 0 )  	{  		if( num_parts != 5 ) @@ -596,6 +597,7 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )  			imcb_rename_buddy( ic, cmd[3], cmd[4] );  		}  	} +#endif  	else if( strcmp( cmd[0], "IPG" ) == 0 )  	{  		imcb_error( ic, "Received IPG command, we don't handle them yet." ); @@ -609,6 +611,50 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )  			return( 0 );  		}  	} +	else if( strcmp( cmd[0], "ADG" ) == 0 ) +	{ +		char *group = g_strdup( cmd[3] ); +		int groupnum, i; +		GSList *l, *next; +		 +		http_decode( group ); +		if( sscanf( cmd[4], "%d", &groupnum ) == 1 ) +		{ +			if( groupnum >= md->groupcount ) +			{ +				md->grouplist = g_renew( char *, md->grouplist, groupnum + 1 ); +				for( i = md->groupcount; i <= groupnum; i ++ ) +					md->grouplist[i] = NULL; +				md->groupcount = groupnum + 1; +			} +			g_free( md->grouplist[groupnum] ); +			md->grouplist[groupnum] = group; +		} +		else +		{ +			/* Shouldn't happen, but if it does, give up on the group. */ +			g_free( group ); +			imcb_error( ic, "Syntax error" ); +			imc_logout( ic, TRUE ); +			return 0; +		} +		 +		for( l = md->grpq; l; l = next ) +		{ +			struct msn_groupadd *ga = l->data; +			next = l->next; +			if( g_strcasecmp( ga->group, group ) == 0 ) +			{ +				if( !msn_buddy_list_add( ic, "FL", ga->who, ga->who, group ) ) +					return 0; +				 +				g_free( ga->group ); +				g_free( ga->who ); +				g_free( ga ); +				md->grpq = g_slist_remove( md->grpq, ga ); +			} +		} +	}  	else if( isdigit( cmd[0][0] ) )  	{  		int num = atoi( cmd[0] ); @@ -747,3 +793,48 @@ static void msn_auth_got_passport_token( struct msn_auth_data *mad )  		imc_logout( ic, TRUE );  	}  } + +static gboolean msn_ns_got_display_name( struct im_connection *ic, char *name ) +{ +	set_t *s; +	 +	if( ( s = set_find( &ic->acc->set, "display_name" ) ) == NULL ) +		return FALSE; /* Shouldn't happen.. */ +	 +	http_decode( name ); +	 +	if( s->value && strcmp( s->value, name ) == 0 ) +	{ +		return TRUE; +		/* The names match, nothing to worry about. */ +	} +	else if( s->value != NULL && +	         ( strcmp( name, ic->acc->user ) == 0 || +	           set_getbool( &ic->acc->set, "local_display_name" ) ) ) +	{ +		/* The server thinks our display name is our e-mail address +		   which is probably wrong, or the user *wants* us to do this: +		   Always use the locally set display_name. */ +		return msn_set_display_name( ic, s->value ); +	} +	else +	{ +		if( s->value && *s->value ) +			imcb_log( ic, "BitlBee thinks your display name is `%s' but " +			              "the MSN server says it's `%s'. Using the MSN " +			              "server's name. Set local_display_name to true " +			              "to use the local name.", s->value, name ); +		 +		if( g_utf8_validate( name, -1, NULL ) ) +		{ +			g_free( s->value ); +			s->value = g_strdup( name ); +		} +		else +		{ +			imcb_log( ic, "Warning: Friendly name in server response was corrupted" ); +		} +		 +		return TRUE; +	} +} | 
