libpurple/soupcompat.h

changeset 41836
a560eef203e0
parent 41700
9f6a2c90800e
--- a/libpurple/soupcompat.h	Wed Oct 26 01:58:00 2022 -0500
+++ b/libpurple/soupcompat.h	Wed Oct 26 02:02:29 2022 -0500
@@ -101,6 +101,63 @@
 	                         data, length);
 }
 
+static inline void
+soup_session_send_and_read_async_cancel_cb(GCancellable *cancellable,
+                                           gpointer data)
+{
+	GTask *task = data;
+	SoupSession *session = g_task_get_source_object(task);
+	SoupMessage *msg = g_task_get_task_data(task);
+
+	soup_session_cancel_message(session, msg, SOUP_STATUS_CANCELLED);
+}
+
+static inline void
+soup_session_send_and_read_sync_cb(SoupSession *session, SoupMessage *msg,
+                                   gpointer data)
+{
+	GTask *task = data;
+
+	if(SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) {
+		GBytes *bytes = g_bytes_new(msg->response_body->data,
+		                            msg->response_body->length);
+		g_task_return_pointer(task, bytes, (GDestroyNotify)g_bytes_unref);
+	} else {
+		g_task_return_new_error(task, SOUP_HTTP_ERROR, msg->status_code,
+		                        "SoupMessage returned failure: (%d) %s",
+		                        msg->status_code, msg->reason_phrase);
+	}
+
+	g_object_unref(task);
+}
+
+static inline GBytes *
+soup_session_send_and_read_finish(SoupSession *session, GAsyncResult *result,
+                                  GError **error)
+{
+	g_return_val_if_fail(SOUP_IS_SESSION(session), NULL);
+
+	return g_task_propagate_pointer(G_TASK(result), error);
+}
+
+static inline void
+soup_session_send_and_read_async(SoupSession *session, SoupMessage *msg,
+                                 gint priority, GCancellable *cancellable,
+                                 GAsyncReadyCallback cb, gpointer data)
+{
+	GTask *task = NULL;
+
+	task = g_task_new(session, cancellable, cb, data);
+	g_task_set_priority(task, priority);
+	g_task_set_task_data(task, g_object_ref(msg), g_object_unref);
+	g_cancellable_connect(cancellable,
+	                      G_CALLBACK(soup_session_send_and_read_async_cancel_cb),
+	                      g_object_ref(task), g_object_unref);
+
+	soup_session_queue_message(session, msg,
+	                           soup_session_send_and_read_sync_cb, task);
+}
+
 #endif /* SOUP_MAJOR_VERSION < 3 */
 
 #endif /* PURPLE_SOUPCOMPAT_H */

mercurial