[gtranslator: 1/4] Port to libsoup-3.0




commit 2ef81ece61952e02d42fd6d0bc332a75a9ee31de
Author: Maximiliano Sandoval R <msandova gnome org>
Date:   Sun Mar 6 14:58:01 2022 +0100

    Port to libsoup-3.0

 meson.build            |   2 +-
 src/gtr-actions-file.c |  60 ++++++++++++++++++++-------
 src/gtr-dl-teams.c     | 107 ++++++++++++++++++++++++++++++++++++++-----------
 3 files changed, 129 insertions(+), 40 deletions(-)
---
diff --git a/meson.build b/meson.build
index 1a2a0ac7..0032de27 100644
--- a/meson.build
+++ b/meson.build
@@ -119,7 +119,7 @@ gtr_deps = [
   dependency('gthread-2.0', version: '>= 2.13.0'),
   dependency('gtksourceview-4', version: '>= 4.0.2'),
   dependency('libxml-2.0', version: '>= 2.4.12'),
-  dependency('libsoup-2.4'),
+  dependency('libsoup-3.0'),
   dependency('json-glib-1.0', version: '>= 1.2.0'),
   cc.find_library('gettextpo'),
 ]
diff --git a/src/gtr-actions-file.c b/src/gtr-actions-file.c
index bd5df10f..e61ebd5b 100644
--- a/src/gtr-actions-file.c
+++ b/src/gtr-actions-file.c
@@ -49,6 +49,10 @@
 static void load_file_list (GtrWindow * window, const GSList * uris);
 static GList * get_modified_documents (GtrWindow * window);
 
+typedef struct {
+  SoupMessage *msg;
+  GtkWidget   *dialog;
+} UserData;
 
 /*
  * The main file opening function. Checks that the file isn't already open,
@@ -343,22 +347,30 @@ confirm_overwrite_callback (GtkFileChooser * dialog, gpointer data)
 }
 
 static void
-_upload_file_callback (SoupSession *session,
-                       SoupMessage *msg,
-                       gpointer     user_data)
+_upload_file_callback (GObject      *object,
+                       GAsyncResult *result,
+                       gpointer      user_data)
 {
+  UserData *ud = user_data;
+  g_autoptr(GInputStream) stream = NULL;
   GtkWidget *dialog;
   GtkDialogFlags flags = GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL;
   GtrNotebook *active_notebook;
 
-  GtkWidget *upload_dialog = user_data;
+  GtkWidget *upload_dialog = ud->dialog;
   GtkWidget *window = gtr_upload_dialog_get_parent (GTR_UPLOAD_DIALOG (upload_dialog));
+  SoupSession *session = SOUP_SESSION (object);
+  SoupStatus status_code = soup_message_get_status (ud->msg);
+
+  GError *error = NULL;
+
+  stream = soup_session_send_finish (session, result, &error);
 
   active_notebook = gtr_window_get_notebook (GTR_WINDOW (window));
 
-  if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code))
+  if (error || !SOUP_STATUS_IS_SUCCESSFUL (status_code))
     {
-      if (msg->status_code == 403)
+      if (status_code == SOUP_STATUS_FORBIDDEN)
         {
           dialog = gtk_message_dialog_new (GTK_WINDOW (window),
                                            flags,
@@ -369,6 +381,18 @@ _upload_file_callback (SoupSession *session,
           goto end;
         }
 
+      g_autofree gchar *message = NULL;
+
+      if (error)
+        {
+          message = error->message;
+          g_clear_error (&error);
+        }
+      else
+        {
+          message = g_strdup (soup_status_get_phrase (status_code));
+        }
+
       dialog = gtk_message_dialog_new_with_markup (
         GTK_WINDOW (window),
         flags,
@@ -380,7 +404,7 @@ _upload_file_callback (SoupSession *session,
           "<b>token</b> correctly in your profile or you don't have "
           "permissions to upload this module."
         ),
-        soup_status_get_phrase (msg->status_code));
+        message);
       goto end;
     }
 
@@ -396,6 +420,7 @@ end:
   gtk_dialog_run (GTK_DIALOG (dialog));
   gtk_widget_destroy (dialog);
   gtk_widget_destroy (upload_dialog);
+  g_free (ud);
 }
 
 void
@@ -405,12 +430,12 @@ gtr_upload_file (GtkWidget *upload_dialog,
 {
   GtrTab *tab;
   GtrPo *po;
+  GBytes *bytes;
   GError *error = NULL;
   GtrProfileManager *pmanager = NULL;
   GtrProfile *profile;
   GtrHeader *header;
   g_autoptr (SoupMultipart) mpart = NULL;
-  g_autoptr (SoupBuffer) buffer = NULL;
 
   SoupMessage *msg = NULL;
   static SoupSession *session = NULL;
@@ -441,16 +466,18 @@ gtr_upload_file (GtkWidget *upload_dialog,
   /* Get file content */
   tab = gtr_window_get_active_tab (window);
   po = gtr_tab_get_po (tab);
+  filename = g_file_get_basename (gtr_po_get_location (po));
   g_file_load_contents (gtr_po_get_location (po), NULL, &content, &size, NULL,
                         &error);
   if (error != NULL) {
     g_warning ("Error opening file %s: %s", filename, (error)->message);
     g_error_free (error);
   }
+  bytes = g_bytes_new (content, size);
   header = gtr_po_get_header (po);
 
   /* Check mimetype */
-  mime_type = g_strdup (g_content_type_get_mime_type(content));
+  mime_type = g_strdup (g_content_type_get_mime_type (content));
 
   /* Get the authentication token from the user profile */
   pmanager = gtr_profile_manager_get_default ();
@@ -484,25 +511,28 @@ gtr_upload_file (GtkWidget *upload_dialog,
 
   /* Init multipart container */
   mpart = soup_multipart_new (SOUP_FORM_MIME_TYPE_MULTIPART);
-  buffer = soup_buffer_new (SOUP_MEMORY_COPY, content, size);
-  soup_multipart_append_form_file (mpart, "file", filename,
-                                   mime_type, buffer);
+  soup_multipart_append_form_file (mpart, "file", filename, mime_type, bytes);
   if (upload_comment)
     soup_multipart_append_form_string (mpart, "comment", upload_comment);
 
   /* Get the associated message */
-  msg = soup_form_request_new_from_multipart (upload_endpoint, mpart);
+  msg = soup_message_new_from_multipart (upload_endpoint, mpart);
   soup_message_set_flags (msg, SOUP_MESSAGE_NO_REDIRECT);
 
   /* Append the authentication header*/
-  soup_message_headers_append (msg->request_headers, "Authentication", auth);
+  soup_message_headers_append (soup_message_get_request_headers (msg),
+                               "Authentication", auth);
 
   gtr_upload_dialog_set_loading (GTR_UPLOAD_DIALOG (upload_dialog), TRUE);
 
   if (!session)
     session = soup_session_new ();
 
-  soup_session_queue_message (session, msg, _upload_file_callback, upload_dialog);
+  UserData *ud;
+  ud = g_new0 (UserData, 1);
+  ud->dialog = upload_dialog;
+  ud->msg = msg;
+  soup_session_send_async (session, msg, G_PRIORITY_DEFAULT, NULL, _upload_file_callback, ud);
 }
 
 /*
diff --git a/src/gtr-dl-teams.c b/src/gtr-dl-teams.c
index 8bf1b9f1..bd8efa2c 100644
--- a/src/gtr-dl-teams.c
+++ b/src/gtr-dl-teams.c
@@ -175,6 +175,8 @@ gtr_dl_teams_load_module_details_json (GtkWidget  *widget,
   JsonNode *branchesNode;
   JsonNode *domainsNode;
   GtkWidget *dialog;
+  SoupStatus status_code;
+  g_autoptr(GInputStream) stream = NULL;
 
   gtk_widget_hide (priv->file_label);
   gtk_widget_hide (priv->module_state_label);
@@ -193,16 +195,29 @@ gtr_dl_teams_load_module_details_json (GtkWidget  *widget,
   module_endpoint = g_strconcat ((const gchar *)API_URL, "modules/", priv->selected_module, NULL);
   msg = soup_message_new ("GET", module_endpoint);
   session = soup_session_new ();
-  soup_session_send_message (session, msg);
+  stream = soup_session_send (session, msg, NULL, &error);
+  status_code = soup_message_get_status (msg);
 
-  if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code))
+  if (error || !SOUP_STATUS_IS_SUCCESSFUL (status_code))
     {
+      g_autofree gchar *message = NULL;
+
+      if (error)
+        {
+          message = error->message;
+          g_clear_error (&error);
+        }
+      else
+        {
+          message = g_strdup (soup_message_get_reason_phrase (msg));
+        }
+
       dialog = gtk_message_dialog_new (GTK_WINDOW (priv->main_window),
                                        GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
                                        GTK_MESSAGE_WARNING,
                                        GTK_BUTTONS_CLOSE,
                                        "Error loading module info: %s",
-                                       soup_status_get_phrase (msg->status_code));
+                                       message);
       gtk_dialog_run (GTK_DIALOG (dialog));
       gtk_widget_destroy (dialog);
       return;
@@ -211,7 +226,7 @@ gtr_dl_teams_load_module_details_json (GtkWidget  *widget,
   parser = json_parser_new ();
 
   /* Load response body and fill branches and domains, then show widgets */
-  json_parser_load_from_data (parser, msg->response_body->data, msg->response_body->length, &error);
+  json_parser_load_from_stream (parser, stream, NULL, &error);
   node = json_parser_get_root (parser);
 
   object = json_node_get_object(node);
@@ -316,12 +331,12 @@ gtr_dl_teams_load_json (GtrDlTeams *self)
   /* Get team list JSON from DL */
   g_autoptr(SoupSession) session = soup_session_new ();
   g_autoptr(SoupMessage) message = soup_message_new ("GET", g_strconcat ((const gchar *)API_URL, "teams", 
NULL));
-  soup_session_send_async (session, message, NULL, gtr_dl_teams_parse_teams_json, self);
+  soup_session_send_async (session, message, G_PRIORITY_DEFAULT, NULL, gtr_dl_teams_parse_teams_json, self);
 
   /* Get module list JSON from DL */
   g_autoptr(SoupSession) session_modules = soup_session_new ();
   g_autoptr(SoupMessage) message_modules = soup_message_new ("GET", g_strconcat ((const gchar *)API_URL, 
"modules", NULL));
-  soup_session_send_async (session_modules, message_modules, NULL, gtr_dl_teams_parse_modules_json, self);
+  soup_session_send_async (session_modules, message_modules, G_PRIORITY_DEFAULT, NULL, 
gtr_dl_teams_parse_modules_json, self);
 }
 
 void gtr_dl_teams_verify_and_load (GtrDlTeams *self)
@@ -360,6 +375,8 @@ gtr_dl_teams_get_file_info (GtrDlTeams *self)
   char *markup;
   g_autofree char *module_state = NULL;
   GtkWidget *dialog;
+  SoupStatus status_code;
+  g_autoptr(GInputStream) stream = NULL;
 
   /* API endpoint: modules/[module]/branches/[branch]/domains/[domain]/languages/[team] */
   stats_endpoint = g_strconcat ((const gchar *)API_URL,
@@ -375,16 +392,29 @@ gtr_dl_teams_get_file_info (GtrDlTeams *self)
 
   msg = soup_message_new ("GET", stats_endpoint);
   session = soup_session_new ();
-  soup_session_send_message (session, msg);
+  stream = soup_session_send (session, msg, NULL, &error);
+  status_code = soup_message_get_status (msg);
 
-  if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code))
+  if (error || !SOUP_STATUS_IS_SUCCESSFUL (status_code))
     {
+      g_autofree gchar *message = NULL;
+
+      if (error)
+        {
+          message = error->message;
+          g_clear_error (&error);
+        }
+      else
+        {
+          message = g_strdup (soup_message_get_reason_phrase (msg));
+        }
+
       dialog = gtk_message_dialog_new (GTK_WINDOW (priv->main_window),
                                        GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
                                        GTK_MESSAGE_WARNING,
                                        GTK_BUTTONS_CLOSE,
                                        "Error loading file info: %s",
-                                       soup_status_get_phrase (msg->status_code));
+                                       message);
       gtk_dialog_run (GTK_DIALOG (dialog));
       gtk_widget_destroy (dialog);
       return;
@@ -393,7 +423,7 @@ gtr_dl_teams_get_file_info (GtrDlTeams *self)
   parser = json_parser_new ();
 
   /* Load response body and get path to PO file */
-  json_parser_load_from_data (parser, msg->response_body->data, msg->response_body->length, &error);
+  json_parser_load_from_stream (parser, stream, NULL, &error);
   node = json_parser_get_root (parser);
 
   object = json_node_get_object(node);
@@ -462,7 +492,6 @@ gtr_dl_teams_load_po_file (GtkButton *button, GtrDlTeams *self)
   GFile *tmp_file = NULL;
   GFileIOStream *iostream = NULL;
   GOutputStream *output = NULL;
-  gsize bytes = 0;
   GtkWidget *dialog;
   gboolean ret = FALSE;
   int file_index = 0;
@@ -472,6 +501,8 @@ gtr_dl_teams_load_po_file (GtkButton *button, GtrDlTeams *self)
   g_autofree char *file_path = NULL;
   g_autoptr(GFile) dest_file = NULL;
   gboolean reserve_first = FALSE;
+  SoupStatus status_code;
+  GBytes *bytes;
 
   // reserve for translation first
   reserve_first = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
@@ -493,16 +524,29 @@ gtr_dl_teams_load_po_file (GtkButton *button, GtrDlTeams *self)
   /* Load the file, save as temp; path to file is https://l10n.gnome.org/[priv->file_path] */
   session = soup_session_new ();
   msg = soup_message_new ("GET", g_strconcat (DL_SERVER, g_strcompress(priv->file_path), NULL));
-  soup_session_send_message (session, msg);
+  bytes = soup_session_send_and_read (session, msg, NULL, &error);
+  status_code = soup_message_get_status (msg);
 
-  if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code))
+  if (error || !SOUP_STATUS_IS_SUCCESSFUL (status_code))
     {
+      g_autofree gchar *message = NULL;
+
+      if (error)
+        {
+          message = error->message;
+          g_clear_error (&error);
+        }
+      else
+        {
+          message = g_strdup (soup_message_get_reason_phrase (msg));
+        }
+
       dialog = gtk_message_dialog_new (GTK_WINDOW (priv->main_window),
                                        GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
                                        GTK_MESSAGE_WARNING,
                                        GTK_BUTTONS_CLOSE,
                                        "Error loading file: %s",
-                                       soup_status_get_phrase (msg->status_code));
+                                       message);
       gtk_dialog_run (GTK_DIALOG (dialog));
       gtk_widget_destroy (dialog);
       return;
@@ -525,12 +569,10 @@ gtr_dl_teams_load_po_file (GtkButton *button, GtrDlTeams *self)
     }
 
   output = g_io_stream_get_output_stream (G_IO_STREAM (iostream));
-  g_output_stream_write_all (output,
-                             msg->response_body->data,
-                             msg->response_body->length,
-                             &bytes,
-                             NULL,
-                             &error);
+  g_output_stream_write_bytes (output,
+                               bytes,
+                               NULL,
+                               &error);
 
   if (error != NULL)
     {
@@ -615,6 +657,9 @@ gtr_dl_teams_reserve_for_translation (GtkWidget *button, GtrDlTeams *self)
   const char *auth_token = NULL;
   g_autofree char *auth = NULL;
   g_autofree gchar *reserve_endpoint = NULL;
+  SoupStatus status_code;
+  g_autoptr(GInputStream) stream = NULL;
+  GError *error = NULL;
 
   pmanager = gtr_profile_manager_get_default ();
   profile = gtr_profile_manager_get_active_profile (pmanager);
@@ -631,12 +676,26 @@ gtr_dl_teams_reserve_for_translation (GtkWidget *button, GtrDlTeams *self)
 
   msg = soup_message_new ("POST", reserve_endpoint);
   soup_message_set_flags (msg, SOUP_MESSAGE_NO_REDIRECT);
-  soup_message_headers_append (msg->request_headers, "Authentication", auth);
+  soup_message_headers_append (soup_message_get_request_headers (msg),
+                               "Authentication", auth);
   session = soup_session_new ();
-  soup_session_send_message (session, msg);
+  stream = soup_session_send (session, msg, NULL, &error);
+  status_code = soup_message_get_status (msg);
 
-  if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code))
+  if (error || !SOUP_STATUS_IS_SUCCESSFUL (status_code))
   {
+    g_autofree gchar *message = NULL;
+
+    if (error)
+      {
+        message = error->message;
+        g_clear_error (&error);
+      }
+    else
+      {
+        message = g_strdup (soup_message_get_reason_phrase (msg));
+      }
+
     dialog = gtk_message_dialog_new_with_markup (
       GTK_WINDOW (priv->main_window),
       GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
@@ -648,7 +707,7 @@ gtr_dl_teams_reserve_for_translation (GtkWidget *button, GtrDlTeams *self)
         "<b>token</b> correctly in your profile or you don't have "
         "permissions to reserve this module."
       ),
-      soup_status_get_phrase (msg->status_code));
+      message);
     gtk_dialog_run (GTK_DIALOG (dialog));
     gtk_widget_destroy (dialog);
     return FALSE;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]