[gtranslator: 1/4] Port to libsoup-3.0
- From: Daniel Garcia Moreno <danigm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtranslator: 1/4] Port to libsoup-3.0
- Date: Thu, 17 Mar 2022 13:10:05 +0000 (UTC)
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]