# HG changeset patch # User Mark Doliner # Date 1186385323 0 # Node ID 7a27e37296128b21319fd5c15939751f4b707998 # Parent 9f3a85a59939b355d697cb7a640607ba7ecac9bb Fetch icons all at once instead of one at a time. I tried pretty hard and couldn't get this to hit rate limiting, so I'm hoping it'll be ok. diff -r 9f3a85a59939 -r 7a27e3729612 libpurple/protocols/oscar/oscar.c --- a/libpurple/protocols/oscar/oscar.c Mon Aug 06 06:42:10 2007 +0000 +++ b/libpurple/protocols/oscar/oscar.c Mon Aug 06 07:28:43 2007 +0000 @@ -161,7 +161,6 @@ static int purple_conv_chat_info_update (OscarData *, FlapConnection *, FlapFrame *, ...); static int purple_conv_chat_incoming_msg(OscarData *, FlapConnection *, FlapFrame *, ...); static int purple_email_parseupdate(OscarData *, FlapConnection *, FlapFrame *, ...); -static int purple_icon_error (OscarData *, FlapConnection *, FlapFrame *, ...); static int purple_icon_parseicon (OscarData *, FlapConnection *, FlapFrame *, ...); static int oscar_icon_req (OscarData *, FlapConnection *, FlapFrame *, ...); static int purple_parse_msgack (OscarData *, FlapConnection *, FlapFrame *, ...); @@ -195,7 +194,7 @@ static int purple_ssi_authreply (OscarData *, FlapConnection *, FlapFrame *, ...); static int purple_ssi_gotadded (OscarData *, FlapConnection *, FlapFrame *, ...); -static gboolean purple_icon_timerfunc(gpointer data); +static void purple_icons_fetch(PurpleConnection *gc); static void recent_buddies_cb(const char *name, PurplePrefType type, gconstpointer value, gpointer data); void oscar_set_info(PurpleConnection *gc, const char *info); @@ -1156,8 +1155,7 @@ od->iconconnecting = FALSE; - if (od->icontimer == 0) - od->icontimer = purple_timeout_add(1, purple_icon_timerfunc, gc); + purple_icons_fetch(gc); } static int @@ -1203,7 +1201,6 @@ oscar_data_addhandler(od, SNAC_FAMILY_AUTH, 0x0003, purple_parse_auth_resp, 0); oscar_data_addhandler(od, SNAC_FAMILY_AUTH, 0x0007, purple_parse_login, 0); oscar_data_addhandler(od, SNAC_FAMILY_AUTH, SNAC_SUBTYPE_AUTH_SECURID_REQUEST, purple_parse_auth_securid_request, 0); - oscar_data_addhandler(od, SNAC_FAMILY_BART, SNAC_SUBTYPE_BART_ERROR, purple_icon_error, 0); oscar_data_addhandler(od, SNAC_FAMILY_BART, SNAC_SUBTYPE_BART_RESPONSE, purple_icon_parseicon, 0); oscar_data_addhandler(od, SNAC_FAMILY_BOS, 0x0001, purple_parse_genericerr, 0); oscar_data_addhandler(od, SNAC_FAMILY_BOS, 0x0003, purple_bosrights, 0); @@ -1876,9 +1873,9 @@ if (g_slist_find_custom(od->requesticon, info->sn, (GCompareFunc)aim_sncmp) == NULL) { - od->requesticon = g_slist_append(od->requesticon, g_strdup(purple_normalize(account, info->sn))); - if (od->icontimer == 0) - od->icontimer = purple_timeout_add(1, purple_icon_timerfunc, gc); + od->requesticon = g_slist_prepend(od->requesticon, + g_strdup(purple_normalize(account, info->sn))); + purple_icons_fetch(gc); } } g_free(b16); @@ -3236,24 +3233,8 @@ return 1; } -static int purple_icon_error(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { - PurpleConnection *gc = od->gc; - char *sn; - - sn = od->requesticon->data; - purple_debug_misc("oscar", "removing %s from hash table\n", sn); - od->requesticon = g_slist_remove(od->requesticon, sn); - g_free(sn); - - if (od->icontimer == 0) - od->icontimer = purple_timeout_add(1, purple_icon_timerfunc, gc); - - return 1; -} - static int purple_icon_parseicon(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { PurpleConnection *gc = od->gc; - GSList *cur; va_list ap; char *sn; guint8 iconcsumtype, *iconcsum, *icon; @@ -3279,25 +3260,12 @@ g_free(b16); } - cur = od->requesticon; - while (cur) { - char *cursn = cur->data; - if (!aim_sncmp(cursn, sn)) { - od->requesticon = g_slist_remove(od->requesticon, cursn); - g_free(cursn); - cur = od->requesticon; - } else - cur = cur->next; - } - - if (od->icontimer == 0) - od->icontimer = purple_timeout_add(1, purple_icon_timerfunc, gc); - return 1; } -static gboolean purple_icon_timerfunc(gpointer data) { - PurpleConnection *gc = data; +static void +purple_icons_fetch(PurpleConnection *gc) +{ OscarData *od = gc->proto_data; aim_userinfo_t *userinfo; FlapConnection *conn; @@ -3310,7 +3278,7 @@ aim_srv_requestnew(od, SNAC_FAMILY_BART); od->iconconnecting = TRUE; } - return FALSE; + return; } if (od->set_icon) { @@ -3321,32 +3289,24 @@ } else { purple_debug_info("oscar", "Uploading icon to icon server\n"); - aim_bart_upload(od, purple_imgstore_get_data(img), + aim_bart_upload(od, purple_imgstore_get_data(img), purple_imgstore_get_size(img)); purple_imgstore_unref(img); } od->set_icon = FALSE; } - if (!od->requesticon) { - purple_debug_misc("oscar", - "no more icons to request\n"); - return FALSE; - } - - userinfo = aim_locate_finduserinfo(od, (char *)od->requesticon->data); - if ((userinfo != NULL) && (userinfo->iconcsumlen > 0)) { - aim_bart_request(od, od->requesticon->data, userinfo->iconcsumtype, userinfo->iconcsum, userinfo->iconcsumlen); - return FALSE; - } else { - gchar *sn = od->requesticon->data; - od->requesticon = g_slist_remove(od->requesticon, sn); - g_free(sn); - } - - od->icontimer = purple_timeout_add(1, purple_icon_timerfunc, gc); - - return FALSE; + while (od->requesticon != NULL) + { + userinfo = aim_locate_finduserinfo(od, (char *)od->requesticon->data); + if ((userinfo != NULL) && (userinfo->iconcsumlen > 0)) + aim_bart_request(od, od->requesticon->data, userinfo->iconcsumtype, userinfo->iconcsum, userinfo->iconcsumlen); + + g_free(od->requesticon->data); + od->requesticon = g_slist_delete_link(od->requesticon, od->requesticon); + } + + purple_debug_misc("oscar", "no more icons to request\n"); } /* diff -r 9f3a85a59939 -r 7a27e3729612 libpurple/protocols/oscar/oscar.h --- a/libpurple/protocols/oscar/oscar.h Mon Aug 06 06:42:10 2007 +0000 +++ b/libpurple/protocols/oscar/oscar.h Mon Aug 06 07:28:43 2007 +0000 @@ -449,7 +449,6 @@ GSList *requesticon; gboolean icq; - guint icontimer; guint getblisttimer; guint getinfotimer;