aboutsummaryrefslogtreecommitdiffstats
path: root/protocols/yahoo
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/yahoo')
-rw-r--r--protocols/yahoo/libyahoo2.c56
-rw-r--r--protocols/yahoo/yahoo.c41
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;