diff options
Diffstat (limited to 'protocols/yahoo')
| -rw-r--r-- | protocols/yahoo/libyahoo2.c | 56 | ||||
| -rw-r--r-- | protocols/yahoo/yahoo.c | 41 | 
2 files changed, 42 insertions, 55 deletions
| diff --git a/protocols/yahoo/libyahoo2.c b/protocols/yahoo/libyahoo2.c index a1755cc9..721f4b7c 100644 --- a/protocols/yahoo/libyahoo2.c +++ b/protocols/yahoo/libyahoo2.c @@ -1529,12 +1529,19 @@ static void yahoo_process_buddy_list(struct yahoo_input_data *yid, struct yahoo_  		case 7:  			newbud = y_new0(struct yahoo_buddy, 1);  			newbud->id = strdup(pair->value); -			if(cur_group) +			if (cur_group) {  				newbud->group = strdup(cur_group); -			else { -				struct yahoo_buddy *lastbud = (struct yahoo_buddy *)y_list_nth( -								yd->buddies, y_list_length(yd->buddies)-1)->data; -				newbud->group = strdup(lastbud->group); +			} else { +				YList *last; +				struct yahoo_buddy *lastbud; +				 +				for (last = yd->buddies; last && last->next; last = last->next); +				if (last) { +					lastbud = last->data; +					newbud->group = strdup(lastbud->group); +				} else { +					newbud->group = strdup("Buddies"); +				}  			}  			yd->buddies = y_list_append(yd->buddies, newbud); @@ -2392,10 +2399,16 @@ static void yahoo_https_auth_token_init(struct yahoo_https_auth_data *had)  static void yahoo_https_auth_token_finish(struct http_request *req)  {  	struct yahoo_https_auth_data *had = req->data; -	struct yahoo_input_data *yid = had->yid; -	struct yahoo_data *yd = yid->yd; +	struct yahoo_input_data *yid; +	struct yahoo_data *yd;  	int st; +	if (y_list_find(inputs, had->yid) == NULL) +		return; +	 +	yid = had->yid; +	yd = yid->yd; +	  	if (req->status_code != 200) {  		YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, 2000 + req->status_code, NULL);  		goto fail; @@ -2435,12 +2448,18 @@ static void yahoo_https_auth_init(struct yahoo_https_auth_data *had)  static void yahoo_https_auth_finish(struct http_request *req)  {  	struct yahoo_https_auth_data *had = req->data; -	struct yahoo_input_data *yid = had->yid; -	struct yahoo_data *yd = yid->yd; +	struct yahoo_input_data *yid; +	struct yahoo_data *yd;  	struct yahoo_packet *pack; -	char *crumb; +	char *crumb = NULL;  	int st; +	if (y_list_find(inputs, had->yid) == NULL) +		return; +	 +	yid = had->yid; +	yd = yid->yd; +	  	md5_byte_t result[16];  	md5_state_t ctx; @@ -4079,14 +4098,8 @@ void yahoo_set_away(int id, enum yahoo_status state, const char *msg, int away)  		return;  	yd = yid->yd; -  	old_status = yd->current_status; - -	if (msg && strncmp(msg,"Invisible",9)) { -		yd->current_status = YAHOO_STATUS_CUSTOM; -	} else { -		yd->current_status = state; -	} +	yd->current_status = state;  	/* Thank you libpurple :) */  	if (yd->current_status == YAHOO_STATUS_INVISIBLE) { @@ -4101,15 +4114,8 @@ void yahoo_set_away(int id, enum yahoo_status state, const char *msg, int away)  	pkt = yahoo_packet_new(YAHOO_SERVICE_Y6_STATUS_UPDATE, yd->current_status, yd->session_id);  	snprintf(s, sizeof(s), "%d", yd->current_status);  	yahoo_packet_hash(pkt, 10, s); -	  -	if (yd->current_status == YAHOO_STATUS_CUSTOM) { -		yahoo_packet_hash(pkt, 19, msg); -	} else { -		yahoo_packet_hash(pkt, 19, ""); -	} -	 +	yahoo_packet_hash(pkt, 19, msg && state == YAHOO_STATUS_CUSTOM ? msg : "");  	yahoo_packet_hash(pkt, 47, (away == 2)? "2": (away) ?"1":"0"); -  	yahoo_send_packet(yid, pkt, 0);  	yahoo_packet_free(pkt); diff --git a/protocols/yahoo/yahoo.c b/protocols/yahoo/yahoo.c index ac57d4b6..a47de966 100644 --- a/protocols/yahoo/yahoo.c +++ b/protocols/yahoo/yahoo.c @@ -129,6 +129,8 @@ static char *byahoo_strip( const char *in )  static void byahoo_init( account_t *acc )  {  	set_add( &acc->set, "mail_notifications", "false", set_eval_bool, acc ); +	 +	acc->flags |= ACC_FLAG_AWAY_MESSAGE | ACC_FLAG_STATUS_MESSAGE;  }  static void byahoo_login( account_t *acc ) @@ -196,29 +198,12 @@ static int byahoo_send_typing( struct im_connection *ic, char *who, int typing )  static void byahoo_set_away( struct im_connection *ic, char *state, char *msg )  {  	struct byahoo_data *yd = (struct byahoo_data *) ic->proto_data; -	char *away; -	 -	away = NULL; -	if( state && msg && g_strcasecmp( state, msg ) != 0 ) -	{ -		yd->current_status = YAHOO_STATUS_CUSTOM; -		away = ""; -	} -	else if( state ) +	if( state && msg == NULL )  	{ -		/* Set msg to NULL since (if it isn't NULL already) it's equal -		   to state. msg must be empty if we want to use an existing -		   away state. */ -		msg = NULL; -		 -		away = ""; -		if( g_strcasecmp( state, "Available" ) == 0 ) -		{ -			yd->current_status = YAHOO_STATUS_AVAILABLE; -			away = NULL; -		} -		else if( g_strcasecmp( state, "Be Right Back" ) == 0 ) +		/* Use these states only if msg doesn't contain additional +		   info since away messages are only supported with CUSTOM. */ +		if( g_strcasecmp( state, "Be Right Back" ) == 0 )  			yd->current_status = YAHOO_STATUS_BRB;  		else if( g_strcasecmp( state, "Busy" ) == 0 )  			yd->current_status = YAHOO_STATUS_BUSY; @@ -238,17 +223,15 @@ static void byahoo_set_away( struct im_connection *ic, char *state, char *msg )  			yd->current_status = YAHOO_STATUS_STEPPEDOUT;  		else if( g_strcasecmp( state, "Invisible" ) == 0 )  			yd->current_status = YAHOO_STATUS_INVISIBLE; -		else if( g_strcasecmp( state, GAIM_AWAY_CUSTOM ) == 0 ) -		{ -			yd->current_status = YAHOO_STATUS_AVAILABLE; -			 -			away = NULL; -		} +		else +			yd->current_status = YAHOO_STATUS_CUSTOM;  	} +	else if( state ) +		yd->current_status = YAHOO_STATUS_CUSTOM;  	else  		yd->current_status = YAHOO_STATUS_AVAILABLE; -	yahoo_set_away( yd->y2_id, yd->current_status, msg, away != NULL ? 2 : 0 ); +	yahoo_set_away( yd->y2_id, yd->current_status, msg, state ? 2 : 0 );  }  static GList *byahoo_away_states( struct im_connection *ic ) @@ -257,7 +240,6 @@ static GList *byahoo_away_states( struct im_connection *ic )  	if( m == NULL )  	{ -		m = g_list_append( m, "Available" );  		m = g_list_append( m, "Be Right Back" );  		m = g_list_append( m, "Busy" );  		m = g_list_append( m, "Not At Home" ); @@ -268,7 +250,6 @@ static GList *byahoo_away_states( struct im_connection *ic )  		m = g_list_append( m, "Out To Lunch" );  		m = g_list_append( m, "Stepped Out" );  		m = g_list_append( m, "Invisible" ); -		m = g_list_append( m, GAIM_AWAY_CUSTOM );  	}  	return m; | 
