diff options
author | Elliott Sales de Andrade <quantum.analyst@gmail.com> | 2022-10-26 02:05:37 -0500 |
---|---|---|
committer | Elliott Sales de Andrade <quantum.analyst@gmail.com> | 2022-10-26 02:05:37 -0500 |
commit | ae839464ff813222bd9a2f8d8d682fa143dfc299 (patch) | |
tree | faaf85887bff40fc1df8061136aeea18bf0f569f /finch | |
parent | 571de196c3a9a4ee432064902ebfa02a129b39eb (diff) | |
download | pidgin-ae839464ff813222bd9a2f8d8d682fa143dfc299.tar.gz |
Port gnttinyurl plugin to libsoup3
This covers both adding the `SoupMessage` to an existing callback data structure, _and_ using `SoupMessage` as the callback data with "real" callback data attached to it.
Testing Done:
Compiled against libsoup2 and libsoup3.
Reviewed at https://reviews.imfreedom.org/r/1961/
Diffstat (limited to 'finch')
-rw-r--r-- | finch/plugins/gnttinyurl/gnttinyurl.c | 93 |
1 files changed, 56 insertions, 37 deletions
diff --git a/finch/plugins/gnttinyurl/gnttinyurl.c b/finch/plugins/gnttinyurl/gnttinyurl.c index 7f1730b133..ada793823f 100644 --- a/finch/plugins/gnttinyurl/gnttinyurl.c +++ b/finch/plugins/gnttinyurl/gnttinyurl.c @@ -38,8 +38,8 @@ static int tag_num = 0; static SoupSession *session = NULL; static GHashTable *tinyurl_cache = NULL; -typedef struct -{ +typedef struct { + SoupMessage *msg; gchar *original_url; PurpleConversation *conv; gchar *tag; @@ -194,21 +194,32 @@ static GList *extract_urls(const char *text) } static void -url_fetched(G_GNUC_UNUSED SoupSession *session, SoupMessage *msg, - gpointer _data) -{ - CbInfo *data = (CbInfo *)_data; +url_fetched(GObject *source, GAsyncResult *result, gpointer user_data) { + CbInfo *data = (CbInfo *)user_data; PurpleConversation *conv = data->conv; PurpleConversationManager *manager; GList *convs; + GBytes *response_body = NULL; const gchar *url; manager = purple_conversation_manager_get_default(); convs = purple_conversation_manager_get_all(manager); - if (SOUP_STATUS_IS_SUCCESSFUL(soup_message_get_status(msg))) { - url = msg->response_body->data; - g_hash_table_insert(tinyurl_cache, data->original_url, g_strdup(url)); + if(SOUP_STATUS_IS_SUCCESSFUL(soup_message_get_status(data->msg))) { + response_body = soup_session_send_and_read_finish(SOUP_SESSION(source), + result, NULL); + } + if (response_body != NULL) { + gchar *tmp = NULL; + gsize size = 0; + + /* Ensure URL is NUL-terminated. */ + url = g_bytes_get_data(response_body, &size); + tmp = g_strndup(url, size); + url = tmp; + + g_hash_table_insert(tinyurl_cache, data->original_url, tmp); + g_bytes_unref(response_body); } else { url = _("Error while querying TinyURL"); g_free(data->original_url); @@ -349,8 +360,9 @@ process_urls(PurpleConversation *conv, GList *urls) url = g_strdup_printf("%s%s", tinyurl_prefix, purple_url_encode(original_url)); } - msg = soup_message_new("GET", url); - soup_session_queue_message(session, msg, url_fetched, cbdata); + cbdata->msg = msg = soup_message_new("GET", url); + soup_session_send_and_read_async(session, msg, G_PRIORITY_DEFAULT, + NULL, url_fetched, cbdata); gnt_text_view_append_text_with_tag((tv), _("\nFetching TinyURL..."), GNT_TEXT_FLAG_DIM, cbdata->tag); if (i == 0) @@ -381,33 +393,34 @@ tinyurl_notify_tinyuri(GntWidget *win, const gchar *url) } static void -cancel_notify_fetch(GntWidget *win, SoupMessage *msg) +tinyurl_notify_fetch_cb(GObject *source, GAsyncResult *result, gpointer data) { - soup_session_cancel_message(session, msg, SOUP_STATUS_CANCELLED); -} - -static void -tinyurl_notify_fetch_cb(G_GNUC_UNUSED SoupSession *session, SoupMessage *msg, - gpointer _win) -{ - GntWidget *win = _win; - const gchar *url; - const gchar *original_url; + SoupMessage *msg = data; + GntWidget *win = NULL; + GBytes *response_body = NULL; + const gchar *tmp = NULL; + gsize size = 0; + gchar *url = NULL; + const gchar *original_url = NULL; + + if(SOUP_STATUS_IS_SUCCESSFUL(soup_message_get_status(msg))) { + response_body = soup_session_send_and_read_finish(SOUP_SESSION(source), + result, NULL); + } - if (!SOUP_STATUS_IS_SUCCESSFUL(soup_message_get_status(msg))) { + if (response_body == NULL) { return; } - original_url = g_object_get_data(G_OBJECT(win), "gnttinyurl-original"); - url = msg->response_body->data; - g_hash_table_insert(tinyurl_cache, - g_strdup(original_url), g_strdup(url)); + win = g_object_get_data(G_OBJECT(msg), "gnttinyurl-window"); + original_url = g_object_get_data(G_OBJECT(msg), "gnttinyurl-original"); + tmp = g_bytes_get_data(response_body, &size); + url = g_strndup(tmp, size); + g_hash_table_insert(tinyurl_cache, g_strdup(original_url), url); tinyurl_notify_tinyuri(win, url); - g_signal_handlers_disconnect_matched(G_OBJECT(win), G_SIGNAL_MATCH_FUNC, 0, - 0, NULL, - G_CALLBACK(cancel_notify_fetch), NULL); + g_bytes_unref(response_body); } static void * @@ -415,6 +428,7 @@ tinyurl_notify_uri(const char *uri) { char *fullurl = NULL; GntWidget *win; + GCancellable *cancellable = NULL; SoupMessage *msg; const gchar *tiny_url; GSettings *settings = NULL; @@ -449,16 +463,21 @@ tinyurl_notify_uri(const char *uri) g_free(tinyurl_prefix); - g_object_set_data_full(G_OBJECT(win), "gnttinyurl-original", g_strdup(uri), g_free); - - /* Store the SoupMessage and cancel that when the window is destroyed, - * so that the callback does not try to use a non-existent window. + /* Make a cancellable and cancel it when the window is destroyed, so that + * the callback does not try to use a non-existent window. */ + cancellable = g_cancellable_new(); msg = soup_message_new("GET", fullurl); - soup_session_queue_message(session, msg, tinyurl_notify_fetch_cb, win); + g_object_set_data(G_OBJECT(msg), "gnttinyurl-window", win); + g_object_set_data_full(G_OBJECT(msg), "gnttinyurl-original", g_strdup(uri), + g_free); + + soup_session_send_and_read_async(session, msg, G_PRIORITY_DEFAULT, + cancellable, tinyurl_notify_fetch_cb, win); + g_signal_connect_object(win, "destroy", G_CALLBACK(g_cancellable_cancel), + cancellable, G_CONNECT_SWAPPED); g_free(fullurl); - g_signal_connect(G_OBJECT(win), "destroy", G_CALLBACK(cancel_notify_fetch), - msg); + g_object_unref(cancellable); return win; } |