diff options
Diffstat (limited to 'protocols/msn/ns.c')
| -rw-r--r-- | protocols/msn/ns.c | 74 | 
1 files changed, 44 insertions, 30 deletions
| diff --git a/protocols/msn/ns.c b/protocols/msn/ns.c index fe48f96d..d78d753a 100644 --- a/protocols/msn/ns.c +++ b/protocols/msn/ns.c @@ -228,19 +228,26 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )  				return( 0 );  			}  		} -		else if( num_parts == 7 && strcmp( cmd[2], "OK" ) == 0 ) +		else if( num_parts >= 7 && strcmp( cmd[2], "OK" ) == 0 )  		{  			set_t *s; -			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" ) ) ) +			if( num_parts == 7 )  			{ -				g_free( s->value ); -				s->value = g_strdup( cmd[4] ); +				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] ); +				} +			} +			else +			{ +				imcb_log( ic, "Warning: Friendly name in server response was corrupted" );  			}  			imcb_log( ic, "Authenticated, getting buddy list" ); @@ -419,11 +426,12 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )  		if( !st )  		{  			/* FIXME: Warn/Bomb about unknown away state? */ -			st = msn_away_state_list; +			st = msn_away_state_list + 1;  		} -		imcb_buddy_status( ic, cmd[3], OPT_LOGGED_IN | -		                   ( st->number ? OPT_AWAY : 0 ), st->name, NULL ); +		imcb_buddy_status( ic, cmd[3], OPT_LOGGED_IN |  +		                   ( st != msn_away_state_list ? OPT_AWAY : 0 ), +		                   st->name, NULL );  	}  	else if( strcmp( cmd[0], "FLN" ) == 0 )  	{ @@ -448,11 +456,12 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )  		if( !st )  		{  			/* FIXME: Warn/Bomb about unknown away state? */ -			st = msn_away_state_list; +			st = msn_away_state_list + 1;  		} -		imcb_buddy_status( ic, cmd[2], OPT_LOGGED_IN | -		                   ( st->number ? OPT_AWAY : 0 ), st->name, NULL ); +		imcb_buddy_status( ic, cmd[2], OPT_LOGGED_IN |  +		                   ( st != msn_away_state_list ? OPT_AWAY : 0 ), +		                   st->name, NULL );  	}  	else if( strcmp( cmd[0], "RNG" ) == 0 )  	{ @@ -662,8 +671,8 @@ static int msn_ns_message( gpointer data, char *msg, int msglen, char **cmd, int  						imcb_log( ic, "The server is going down for maintenance in %s minutes.", arg1 );  				} -				if( arg1 ) g_free( arg1 ); -				if( mtype ) g_free( mtype ); +				g_free( arg1 ); +				g_free( mtype );  			}  			else if( g_strncasecmp( ct, "text/x-msmsgsprofile", 20 ) == 0 )  			{ @@ -671,25 +680,30 @@ static int msn_ns_message( gpointer data, char *msg, int msglen, char **cmd, int  			}  			else if( g_strncasecmp( ct, "text/x-msmsgsinitialemailnotification", 37 ) == 0 )  			{ -				char *inbox = msn_findheader( body, "Inbox-Unread:", blen ); -				char *folders = msn_findheader( body, "Folders-Unread:", blen ); -				 -				if( inbox && folders && set_getbool( &ic->acc->set, "mail_notifications" ) ) +				if( set_getbool( &ic->acc->set, "mail_notifications" ) )  				{ -					imcb_log( ic, "INBOX contains %s new messages, plus %s messages in other folders.", inbox, folders ); +					char *inbox = msn_findheader( body, "Inbox-Unread:", blen ); +					char *folders = msn_findheader( body, "Folders-Unread:", blen ); + +					if( inbox && folders ) +						imcb_log( ic, "INBOX contains %s new messages, plus %s messages in other folders.", inbox, folders ); +					 +					g_free( inbox ); +					g_free( folders );  				} -				 -				g_free( inbox ); -				g_free( folders );  			}  			else if( g_strncasecmp( ct, "text/x-msmsgsemailnotification", 30 ) == 0 )  			{ -				char *from = msn_findheader( body, "From-Addr:", blen ); -				char *fromname = msn_findheader( body, "From:", blen ); -				 -				if( from && fromname && set_getbool( &ic->acc->set, "mail_notifications" ) ) +				if( set_getbool( &ic->acc->set, "mail_notifications" ) )  				{ -					imcb_log( ic, "Received an e-mail message from %s <%s>.", fromname, from ); +					char *from = msn_findheader( body, "From-Addr:", blen ); +					char *fromname = msn_findheader( body, "From:", blen ); +					 +					if( from && fromname ) +						imcb_log( ic, "Received an e-mail message from %s <%s>.", fromname, from ); + +					g_free( from ); +					g_free( fromname );  				}  			}  			else if( g_strncasecmp( ct, "text/x-msmsgsactivemailnotification", 35 ) == 0 ) | 
