From 32d5cd4c5a8ceb7f898a92d5dbb50ed6a3f0610e Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Sat, 12 Oct 2019 00:05:55 -0400 Subject: Remove manual queuing of GG avatar fetching. This is handled by the libsoup session, so we don't need to do it ourselves. --- libpurple/protocols/gg/avatar.c | 144 +++++++++------------------------------- libpurple/protocols/gg/avatar.h | 4 -- 2 files changed, 31 insertions(+), 117 deletions(-) diff --git a/libpurple/protocols/gg/avatar.c b/libpurple/protocols/gg/avatar.c index 9e3de09e05..4de9c93143 100644 --- a/libpurple/protocols/gg/avatar.c +++ b/libpurple/protocols/gg/avatar.c @@ -48,13 +48,9 @@ typedef struct { uin_t uin; time_t timestamp; - PurpleConnection *gc; - SoupMessage *request; } ggp_avatar_buddy_update_req; -static gboolean ggp_avatar_buddy_update_next(PurpleConnection *gc); - #define GGP_AVATAR_BUDDY_URL "http://avatars.gg.pl/%u/s,big" /* Own avatar setting */ @@ -77,87 +73,24 @@ ggp_avatar_get_avdata(PurpleConnection *gc) return &accdata->avatar_data; } -static gboolean -ggp_avatar_timer_cb(gpointer _gc) -{ - PurpleConnection *gc = _gc; - ggp_avatar_session_data *avdata; - - PURPLE_ASSERT_CONNECTION_IS_VALID(gc); - - avdata = ggp_avatar_get_avdata(gc); - if (avdata->current_update != NULL) { - if (purple_debug_is_verbose()) { - purple_debug_misc("gg", - "ggp_avatar_timer_cb(%p): there is already an " - "update running", - gc); - } - return TRUE; - } - - while (!ggp_avatar_buddy_update_next(gc)) - ; - - return TRUE; -} - void ggp_avatar_setup(PurpleConnection *gc) { ggp_avatar_session_data *avdata = ggp_avatar_get_avdata(gc); - avdata->pending_updates = NULL; - avdata->current_update = NULL; avdata->own_data = g_new0(ggp_avatar_own_data, 1); - - avdata->timer = g_timeout_add_seconds(1, ggp_avatar_timer_cb, gc); } void ggp_avatar_cleanup(PurpleConnection *gc) { - GGPInfo *info = purple_connection_get_protocol_data(gc); ggp_avatar_session_data *avdata = ggp_avatar_get_avdata(gc); - g_source_remove(avdata->timer); - - if (avdata->current_update != NULL) { - ggp_avatar_buddy_update_req *current_update = - avdata->current_update; - - soup_session_cancel_message(info->http, current_update->request, - SOUP_STATUS_CANCELLED); - g_free(current_update); - } - avdata->current_update = NULL; - g_free(avdata->own_data); - - g_list_free_full(avdata->pending_updates, &g_free); - avdata->pending_updates = NULL; } /******************************************************************************* * Buddy avatars updating. ******************************************************************************/ -void ggp_avatar_buddy_update(PurpleConnection *gc, uin_t uin, time_t timestamp) -{ - ggp_avatar_session_data *avdata = ggp_avatar_get_avdata(gc); - ggp_avatar_buddy_update_req *pending_update = - g_new(ggp_avatar_buddy_update_req, 1); /* TODO: leak? */ - - if (purple_debug_is_verbose()) { - purple_debug_misc("gg", "ggp_avatar_buddy_update(%p, %u, %lu)\n", gc, - uin, timestamp); - } - - pending_update->uin = uin; - pending_update->timestamp = timestamp; - - avdata->pending_updates = g_list_append(avdata->pending_updates, - pending_update); -} - void ggp_avatar_buddy_remove(PurpleConnection *gc, uin_t uin) { if (purple_debug_is_verbose()) { @@ -176,18 +109,12 @@ ggp_avatar_buddy_update_received(G_GNUC_UNUSED SoupSession *session, PurpleBuddy *buddy; PurpleAccount *account; PurpleConnection *gc = pending_update->gc; - ggp_avatar_session_data *avdata; gchar timestamp_str[20]; const gchar *got_data; size_t got_len; PURPLE_ASSERT_CONNECTION_IS_VALID(gc); - avdata = ggp_avatar_get_avdata(gc); - g_assert(pending_update == avdata->current_update); - avdata->current_update = NULL; - pending_update->request = NULL; - if (!SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) { purple_debug_error("gg", "ggp_avatar_buddy_update_received: bad response " @@ -224,74 +151,68 @@ ggp_avatar_buddy_update_received(G_GNUC_UNUSED SoupSession *session, g_free(pending_update); } -/* return TRUE if avatar update was performed or there is no new requests, - FALSE if we can request another one immediately */ -static gboolean ggp_avatar_buddy_update_next(PurpleConnection *gc) +void +ggp_avatar_buddy_update(PurpleConnection *gc, uin_t uin, time_t timestamp) { GGPInfo *info = purple_connection_get_protocol_data(gc); gchar *url; SoupMessage *req; - ggp_avatar_session_data *avdata = ggp_avatar_get_avdata(gc); - GList *pending_update_it; ggp_avatar_buddy_update_req *pending_update; PurpleBuddy *buddy; PurpleAccount *account = purple_connection_get_account(gc); time_t old_timestamp; const char *old_timestamp_str; - pending_update_it = g_list_first(avdata->pending_updates); - if (pending_update_it == NULL) - return TRUE; + if (purple_debug_is_verbose()) { + purple_debug_misc("gg", "ggp_avatar_buddy_update(%p, %u, %lu)", gc, uin, + timestamp); + } - pending_update = pending_update_it->data; - avdata->pending_updates = g_list_remove(avdata->pending_updates, - pending_update); - buddy = purple_blist_find_buddy(account, ggp_uin_to_str(pending_update->uin)); + buddy = purple_blist_find_buddy(account, ggp_uin_to_str(uin)); if (!buddy) { - if (ggp_str_to_uin(purple_account_get_username(account)) == - pending_update->uin) - { - purple_debug_misc("gg", - "ggp_avatar_buddy_update_next(%p): own " - "avatar update requested, but we don't have " - "ourselves on buddy list\n", gc); + if (ggp_str_to_uin(purple_account_get_username(account)) == uin) { + purple_debug_misc( + "gg", + "ggp_avatar_buddy_update(%p): own avatar update requested, " + "but we don't have ourselves on buddy list", + gc); } else { purple_debug_warning("gg", - "ggp_avatar_buddy_update_next(%p): " - "%u update requested, but he's not on buddy " - "list\n", gc, pending_update->uin); + "ggp_avatar_buddy_update(%p): %u update " + "requested, but he's not on buddy list", + gc, uin); } - return FALSE; + return; } old_timestamp_str = purple_buddy_icons_get_checksum_for_user(buddy); old_timestamp = old_timestamp_str ? g_ascii_strtoull( old_timestamp_str, NULL, 10) : 0; - if (old_timestamp == pending_update->timestamp) { + if (old_timestamp == timestamp) { if (purple_debug_is_verbose()) { purple_debug_misc("gg", - "ggp_avatar_buddy_update_next(%p): " - "%u have up to date avatar with ts=%lu\n", gc, - pending_update->uin, pending_update->timestamp); + "ggp_avatar_buddy_update(%p): %u have up to date " + "avatar with ts=%lu", + gc, uin, timestamp); } - return FALSE; + return; } - if (old_timestamp > pending_update->timestamp) { + if (old_timestamp > timestamp) { purple_debug_warning("gg", - "ggp_avatar_buddy_update_next(%p): " - "saved timestamp for %u is newer than received " - "(%lu > %lu)\n", gc, pending_update->uin, old_timestamp, - pending_update->timestamp); + "ggp_avatar_buddy_update(%p): saved timestamp for " + "%u is newer than received (%lu > %lu)", + gc, uin, old_timestamp, timestamp); } purple_debug_info("gg", - "ggp_avatar_buddy_update_next(%p): " - "updating %u with ts=%lu...\n", gc, pending_update->uin, - pending_update->timestamp); + "ggp_avatar_buddy_update(%p): updating %u with ts=%lu...", + gc, uin, timestamp); + pending_update = g_new(ggp_avatar_buddy_update_req, 1); + pending_update->uin = uin; + pending_update->timestamp = timestamp; pending_update->gc = gc; - avdata->current_update = pending_update; url = g_strdup_printf(GGP_AVATAR_BUDDY_URL, pending_update->uin); req = soup_message_new("GET", url); @@ -301,9 +222,6 @@ static gboolean ggp_avatar_buddy_update_next(PurpleConnection *gc) // purple_http_request_set_max_len(req, GGP_AVATAR_SIZE_MAX); soup_session_queue_message( info->http, req, ggp_avatar_buddy_update_received, pending_update); - pending_update->request = req; - - return TRUE; } /******************************************************************************* diff --git a/libpurple/protocols/gg/avatar.h b/libpurple/protocols/gg/avatar.h index ca4300b279..f29a7e3f5e 100644 --- a/libpurple/protocols/gg/avatar.h +++ b/libpurple/protocols/gg/avatar.h @@ -35,10 +35,6 @@ typedef struct { - guint timer; - GList *pending_updates; - - gpointer current_update; gpointer own_data; } ggp_avatar_session_data; -- cgit v1.2.1