diff --git a/ChangeLog b/ChangeLog index 866241b8b153568cb9d8ca7f4361c17c65f20620..fb307edf080ef6f90b7570d496e7bafe9de8dd6d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2009-07-07 jeromeg +Use libsoup instead of XMLRPC-C. + +Add libsoup as a dependency, remove the XMLRPC-C stuff. Factorize the +xmlrpc calls in lib/screenshooter-zimagez.c and add some additional +error checking. + +2009-07-07 jeromeg + Use integers instead of strings to identify the information fields. 2009-07-05 jeromeg diff --git a/configure.ac.in b/configure.ac.in index f9519c0a28a32f1454d3f758970a9034b5dfae08..c6e2d349cefa7e1c913c497555954bd1c5233b34 100644 --- a/configure.ac.in +++ b/configure.ac.in @@ -56,34 +56,7 @@ XDT_CHECK_PACKAGE([LIBXFCEGUI4], [libxfcegui4-1.0], [4.4.0]) XDT_CHECK_PACKAGE([GTHREAD], [gthread-2.0], [2.16.0]) XDT_CHECK_PACKAGE([GTK], [gtk+-2.0], [2.12.0]) XDT_CHECK_PACKAGE([GLIB], [glib-2.0], [2.16.0]) - -dnl ************************************ -dnl *** Check for optional packages *** -dnl ************************************ - -XDT_CHECK_OPTIONAL_PACKAGE([CURL], [libcurl], [7]) - -dnl ************************** -dnl *** Check for xmlrpc-c *** -dnl ************************** - -XMLRPC_LIBS="" -XMLRPC_CFLAGS="" -AC_PATH_PROG([XMLRPC_CONFIG], [xmlrpc-c-config], [no]) -if test x"$XMLRPC_CONFIG" != x"no"; then - AC_MSG_CHECKING([XMLRPC_CFLAGS]) - XMLRPC_CFLAGS="`$XMLRPC_CONFIG --cflags client`" - AC_MSG_RESULT([$XMLRPC_CFLAGS]) - - AC_MSG_CHECKING([XMLRPC_LIBS]) - XMLRPC_LIBS="`$XMLRPC_CONFIG --libs client`" - AC_MSG_RESULT([$XMLRPC_LIBS]) - - AC_DEFINE([HAVE_XMLRPC], [1], [Xmlrpc-c was found on the system]) -fi -AM_CONDITIONAL([HAVE_XMLRPC], [test x"$XMLRPC_CONFIG" != x"no"]) -AC_SUBST([XMLRPC_CFLAGS]) -AC_SUBST([XMLRPC_LIBS]) +XDT_CHECK_PACKAGE([SOUP], [libsoup-2.4], [2.26.0]) dnl ************************** dnl *** Check for xsltproc *** @@ -164,15 +137,6 @@ echo "Build Configuration:" echo "" echo " * Debugging support: $enable_debug" -if test x"$CURL_FOUND" = x"yes"; then - if test x"$XMLRPC_CONFIG" != x"no"; then - echo " * ZimageZ support: yes" - else - echo " * ZimageZ support: no" - fi -else - echo " * ZimageZ support: no" -fi echo "" echo "Maintainer Configuration:" diff --git a/lib/Makefile.am b/lib/Makefile.am index 4bf7a4e5ecd0ee59a37be39d8b7f54ba4d090fd2..a058df112ea84c6c0b8f4fe73981c0af5b3f8607 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -3,12 +3,19 @@ noinst_LTLIBRARIES = \ libscreenshooter_la_SOURCES = \ $(libscreenshooter_built_sources) \ + exo-job.c exo-job.h \ + exo-simple-job.c exo-simple-job.h \ + katze-throbber.c katze-throbber.h \ libscreenshooter.h \ + sexy-url-label.c sexy-url-label.h \ screenshooter-actions.c screenshooter-actions.h \ screenshooter-capture.c screenshooter-capture.h \ screenshooter-dialogs.c screenshooter-dialogs.h \ screenshooter-global.h \ - screenshooter-utils.c screenshooter-utils.h + screenshooter-job.c screenshooter-job.h \ + screenshooter-simple-job.c screenshooter-simple-job.h \ + screenshooter-utils.c screenshooter-utils.h \ + screenshooter-zimagez.c screenshooter-zimagez.h libscreenshooter_la_CFLAGS = \ -I$(top_srcdir) \ @@ -16,36 +23,19 @@ libscreenshooter_la_CFLAGS = \ @GLIB_CFLAGS@ \ @LIBXFCE4UTIL_CFLAGS@ \ @LIBXFCEGUI4_CFLAGS@ \ + @SOUP_CFLAGS@ \ -DPACKAGE_LOCALE_DIR=\"$(localedir)\" libscreenshooter_la_LIBADD = \ @GTK_LIBS@ \ @LIBXFCE4UTIL_LIBS@ \ @LIBXFCEGUI4_LIBS@ \ - @GLIB_LIBS@ - -if HAVE_XMLRPC -if HAVE_CURL + @GLIB_LIBS@ \ + @SOUP_LIBS@ libscreenshooter_built_sources = \ screenshooter-marshal.c screenshooter-marshal.h -libscreenshooter_la_SOURCES += \ - $(libscreenshooter_built_sources) \ - exo-job.c exo-job.h \ - exo-simple-job.c exo-simple-job.h \ - katze-throbber.c katze-throbber.h \ - screenshooter-job.c screenshooter-job.h \ - screenshooter-simple-job.c screenshooter-simple-job.h \ - screenshooter-zimagez.c screenshooter-zimagez.h \ - sexy-url-label.c sexy-url-label.h - -libscreenshooter_la_CFLAGS += \ - $(XMLRPC_CFLAGS) - -libscreenshooter_la_LIBADD += \ - $(XMLRPC_LIBS) -lxmlrpc_client - ## ## Rules to auto-generate built sources ## @@ -84,6 +74,3 @@ screenshooter-marshal.c: screenshooter-marshal.list Makefile EXTRA_DIST = \ screenshooter-marshal.list - -endif -endif diff --git a/lib/screenshooter-actions.c b/lib/screenshooter-actions.c index 40ba990c32b6527d4b44d24615c11d11c6a3b637..b48d2f544f8d798fb654ddd15110b8f4984e1c0b 100644 --- a/lib/screenshooter-actions.c +++ b/lib/screenshooter-actions.c @@ -110,14 +110,10 @@ gboolean screenshooter_take_and_output_screenshot (ScreenshotData *sd) { screenshooter_open_screenshot (screenshot_path, sd->app); } -#ifdef HAVE_XMLRPC -#ifdef HAVE_CURL else { screenshooter_upload_to_zimagez (screenshot_path, sd->last_user); } -#endif -#endif } g_object_unref (temp_dir); diff --git a/lib/screenshooter-actions.h b/lib/screenshooter-actions.h index 08737d57c15001b25d1d71efe4f29584bdbeecd4..a846693c762f0a6de512488b3a64a10f751cd86e 100644 --- a/lib/screenshooter-actions.h +++ b/lib/screenshooter-actions.h @@ -24,12 +24,7 @@ #include "screenshooter-capture.h" #include "screenshooter-global.h" #include "screenshooter-dialogs.h" - -#ifdef HAVE_XMLRPC -#ifdef HAVE_CURL #include "screenshooter-zimagez.h" -#endif -#endif gboolean screenshooter_take_and_output_screenshot (ScreenshotData *sd); diff --git a/lib/screenshooter-dialogs.c b/lib/screenshooter-dialogs.c index 98dd4cc434ea3fd676a5e7a6010354e39328b7ed..e915d352a52fc1e2ebe353b09e795088e9970470 100644 --- a/lib/screenshooter-dialogs.c +++ b/lib/screenshooter-dialogs.c @@ -50,13 +50,9 @@ cb_open_toggled (GtkToggleButton *tb, static void cb_clipboard_toggled (GtkToggleButton *tb, ScreenshotData *sd); -#ifdef HAVE_XMLRPC -#ifdef HAVE_CURL static void cb_zimagez_toggled (GtkToggleButton *tb, ScreenshotData *sd); -#endif -#endif static void cb_show_save_dialog_toggled (GtkToggleButton *tb, ScreenshotData *sd); @@ -207,8 +203,6 @@ static void cb_clipboard_toggled (GtkToggleButton *tb, ScreenshotData *sd) -#ifdef HAVE_XMLRPC -#ifdef HAVE_CURL static void cb_zimagez_toggled (GtkToggleButton *tb, ScreenshotData *sd) { if (gtk_toggle_button_get_active (tb)) @@ -216,8 +210,7 @@ static void cb_zimagez_toggled (GtkToggleButton *tb, ScreenshotData *sd) sd->action = UPLOAD; } } -#endif -#endif + /* Set sd->show_save_dialog when the button is toggled */ @@ -700,16 +693,9 @@ GtkWidget *screenshooter_dialog_new (ScreenshotData *sd, gboolean plugin) GtkWidget *save_checkbox; GtkWidget *actions_main_box, *actions_label, *actions_alignment; - GtkWidget *save_radio_button, *dir_chooser; - GtkWidget *clipboard_radio_button, *open_with_radio_button; - -#ifdef HAVE_XMLRPC -#ifdef HAVE_CURL GtkWidget *zimagez_radio_button; -#endif -#endif GtkListStore *liststore; GtkWidget *combobox; @@ -1195,11 +1181,9 @@ GtkWidget *screenshooter_dialog_new (ScreenshotData *sd, gboolean plugin) cb_toggle_set_sensi (GTK_TOGGLE_BUTTON (open_with_radio_button), combobox); /* Upload to zimagez radio button */ -#ifdef HAVE_XMLRPC -#ifdef HAVE_CURL - zimagez_radio_button = + zimagez_radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (save_radio_button), - _("Host on ZimageZ")); + _("Host on ZimageZ")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (zimagez_radio_button), (sd->action == UPLOAD)); @@ -1215,8 +1199,6 @@ GtkWidget *screenshooter_dialog_new (ScreenshotData *sd, gboolean plugin) 0, 1, 3, 4); gtk_widget_show (zimagez_radio_button); -#endif -#endif return dlg; } @@ -1237,7 +1219,7 @@ gchar gchar *savename = NULL; if (show_save_dialog) - { + { GdkPixbuf *thumbnail; GtkWidget *preview; @@ -1290,12 +1272,12 @@ gchar dialog_response = gtk_dialog_run (GTK_DIALOG (chooser)); /* The user pressed the save button */ - if (G_LIKELY (dialog_response == GTK_RESPONSE_ACCEPT)) - { + if (G_LIKELY (dialog_response == GTK_RESPONSE_ACCEPT)) + { save_uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (chooser)); } - gtk_widget_destroy (chooser); + gtk_widget_destroy (chooser); if (G_LIKELY (save_uri != NULL)) { @@ -1303,10 +1285,10 @@ gchar g_free (save_uri); } - } - else - { - /* Else, we just save the file in the default folder */ + } + else + { + /* Else, we just save the file in the default folder */ gchar *save_uri = g_build_filename (default_dir, filename, NULL); savename = save_screenshot_to (screenshot, save_uri); diff --git a/lib/screenshooter-global.h b/lib/screenshooter-global.h index 5a1f8ffcf68c709f3082672539545571ec72b10f..0fd793c1b65bb2b84a0e6194df11a3499a894865 100644 --- a/lib/screenshooter-global.h +++ b/lib/screenshooter-global.h @@ -32,11 +32,7 @@ enum { SAVE, CLIPBOARD, OPEN, -#ifdef HAVE_XMLRPC -#ifdef HAVE_CURL UPLOAD, -#endif -#endif }; @@ -52,11 +48,7 @@ typedef struct gint close; gchar *screenshot_dir; gchar *app; -#ifdef HAVE_XMLRPC -#ifdef HAVE_CURL gchar *last_user; -#endif -#endif gboolean cli; } ScreenshotData; diff --git a/lib/screenshooter-utils.c b/lib/screenshooter-utils.c index cdf857b5ffb604bbf677b995aad46b92611f9f42..bfc203896e182795bf9a7f9da3c7e0ab1736fb7c 100644 --- a/lib/screenshooter-utils.c +++ b/lib/screenshooter-utils.c @@ -65,11 +65,7 @@ screenshooter_read_rc_file (const gchar *file, ScreenshotData *sd) gint close_app = 1; gchar *screenshot_dir = g_strdup (home_uri); gchar *app = g_strdup ("none"); -#ifdef HAVE_XMLRPC -#ifdef HAVE_CURL gchar *last_user = g_strdup (""); -#endif -#endif if (G_LIKELY (file != NULL)) { @@ -91,12 +87,8 @@ screenshooter_read_rc_file (const gchar *file, ScreenshotData *sd) g_free (app); app = g_strdup (xfce_rc_read_entry (rc, "app", "none")); -#ifdef HAVE_XMLRPC -#ifdef HAVE_CURL g_free (last_user); last_user = g_strdup (xfce_rc_read_entry (rc, "last_user", "")); -#endif -#endif g_free (screenshot_dir); screenshot_dir = @@ -119,11 +111,7 @@ screenshooter_read_rc_file (const gchar *file, ScreenshotData *sd) sd->close = close_app; sd->screenshot_dir = screenshot_dir; sd->app = app; -#ifdef HAVE_XMLRPC -#ifdef HAVE_CURL sd->last_user = last_user; -#endif -#endif } @@ -155,14 +143,9 @@ screenshooter_write_rc_file (const gchar *file, ScreenshotData *sd) xfce_rc_write_int_entry (rc, "close", sd->close); xfce_rc_write_entry (rc, "screenshot_dir", sd->screenshot_dir); xfce_rc_write_entry (rc, "app", sd->app); -#ifdef HAVE_XMLRPC -#ifdef HAVE_CURL xfce_rc_write_entry (rc, "last_user", sd->last_user); -#endif -#endif TRACE ("Flush and close the rc file"); - xfce_rc_flush (rc); xfce_rc_close (rc); } diff --git a/lib/screenshooter-zimagez.c b/lib/screenshooter-zimagez.c index 787a31831a69adb1acb265a08d6b8aab4c15aba7..5545e6d4a663b14be4f9f882904829a8ba6e9156 100644 --- a/lib/screenshooter-zimagez.c +++ b/lib/screenshooter-zimagez.c @@ -54,6 +54,12 @@ typedef enum static void open_url_hook (SexyUrlLabel *url_label, gchar *url, gpointer user_data); +static gboolean do_xmlrpc (SoupSession *session, + const gchar *uri, + const gchar *method, + GError **error, + GValue *retval, + ...); static gboolean has_empty_field (GtkListStore *liststore); static ScreenshooterJob *zimagez_upload_to_zimagez (const gchar *file_name, gchar *last_user); @@ -99,12 +105,95 @@ open_url_hook (SexyUrlLabel *url_label, gchar *url, gpointer user_data) +static gboolean +do_xmlrpc (SoupSession *session, const gchar *uri, const gchar *method, + GError **error, GValue *retval, ...) +{ + SoupMessage *msg; + va_list args; + GValueArray *params; + GError *err = NULL; + char *body; + + va_start (args, retval); + params = soup_value_array_from_args (args); + va_end (args); + + body = + soup_xmlrpc_build_method_call (method, params->values, + params->n_values); + g_value_array_free (params); + + if (!body) + { + err = g_error_new (SOUP_XMLRPC_FAULT, + SOUP_XMLRPC_FAULT_APPLICATION_ERROR, + _("An error occured when creating the XMLRPC" + " request.")); + g_propagate_error (error, err); + + return FALSE; + } + + msg = soup_message_new ("POST", uri); + soup_message_set_request (msg, "text/xml", SOUP_MEMORY_TAKE, + body, strlen (body)); + soup_session_send_message (session, msg); + + if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) + { + TRACE ("Error during the XMLRPC exchange: %d %s\n", + msg->status_code, msg->reason_phrase); + + err = g_error_new (SOUP_XMLRPC_FAULT, + SOUP_XMLRPC_FAULT_TRANSPORT_ERROR, + _("An error occured when transfering the data" + " to ZimageZ.")); + g_propagate_error (error, err); + g_object_unref (msg); + + return FALSE; + } + + if (!soup_xmlrpc_parse_method_response (msg->response_body->data, + msg->response_body->length, + retval, &err)) + { + if (err) + { + TRACE ("Fault when parsing the response: %d %s\n", + err->code, err->message); + + g_propagate_error (error, err); + } + else + { + TRACE ("Unable to parse the response, and no error..."); + + err = g_error_new (SOUP_XMLRPC_FAULT, + SOUP_XMLRPC_FAULT_APPLICATION_ERROR, + _("An error occured when parsing the response" + " from ZimageZ.")); + g_propagate_error (error, err); + } + + g_object_unref (msg); + return FALSE; + } + + g_object_unref (msg); + + return TRUE; +} + + + static gboolean has_empty_field (GtkListStore *liststore) { GtkTreeIter iter; gboolean result = FALSE; - + gtk_tree_model_get_iter_first (GTK_TREE_MODEL (liststore), &iter); do @@ -132,9 +221,6 @@ zimagez_upload_job (ScreenshooterJob *job, GValueArray *param_values, GError **e gchar *comment = g_strdup (""); gchar *data = NULL; gchar *encoded_password = NULL; - gchar *escaped_file_name; - gchar *escaped_title; - gchar *escaped_comment; gchar *file_name = NULL; gchar *login_response = NULL; gchar *online_file_name = NULL; @@ -143,18 +229,18 @@ zimagez_upload_job (ScreenshooterJob *job, GValueArray *param_values, GError **e gchar *user; gsize data_length; + gboolean response = FALSE; - xmlrpc_env env; - xmlrpc_value *resultP = NULL; - xmlrpc_bool response = 0; - - const gchar * const serverurl = "http://www.zimagez.com/apiXml.php"; - const gchar * const method_login = "apiXml.xmlrpcLogin"; - const gchar * const method_logout = "apiXml.xmlrpcLogout"; - const gchar * const method_upload = "apiXml.xmlrpcUpload"; + const gchar *serverurl = g_strdup ("http://www.zimagez.com/apiXml.php"); + const gchar *method_login = g_strdup ("apiXml.xmlrpcLogin"); + const gchar *method_logout = g_strdup ("apiXml.xmlrpcLogout"); + const gchar *method_upload = g_strdup ("apiXml.xmlrpcUpload"); + SoupSession *session; + GError *tmp_error; GtkTreeIter iter; GtkListStore *liststore; + GValue response_value; g_return_val_if_fail (SCREENSHOOTER_IS_JOB (job), FALSE); g_return_val_if_fail (param_values != NULL, FALSE); @@ -179,37 +265,15 @@ zimagez_upload_job (ScreenshooterJob *job, GValueArray *param_values, GError **e user = g_strdup (""); } - g_object_set_data_full (G_OBJECT (job), "user", + g_object_set_data_full (G_OBJECT (job), "user", g_strdup (user), (GDestroyNotify) g_free); /* Get the path of the image that is to be uploaded */ image_path = g_value_get_string (g_value_array_get_nth (param_values, 0)); - /* Start the user XML RPC session */ + /* Start the user soup session */ exo_job_info_message (EXO_JOB (job), _("Initialize the connection...")); - - TRACE ("Initialize the RPC environment"); - xmlrpc_env_init(&env); - - TRACE ("Initialize the RPC client"); - xmlrpc_client_init2 (&env, XMLRPC_CLIENT_NO_FLAGS, PACKAGE_NAME, PACKAGE_VERSION, - NULL, 0); - - if (env.fault_occurred) - { - GError *tmp_error = - g_error_new (G_IO_ERROR, G_IO_ERROR_FAILED, - _("An error occurred during the XML exchange: %s (%d).\n " - "The screenshot could not be uploaded."), - env.fault_string, env.fault_code); - - xmlrpc_env_clean (&env); - xmlrpc_client_cleanup (); - - g_propagate_error (error, tmp_error); - - return FALSE; - } + session = soup_session_sync_new (); TRACE ("Get the information liststore ready."); liststore = gtk_list_store_new (2, G_TYPE_INT, G_TYPE_STRING); @@ -262,10 +326,10 @@ zimagez_upload_job (ScreenshooterJob *job, GValueArray *param_values, GError **e switch (field_index) { - case USER: + case USER: user = g_strdup (field_value); break; - case PASSWORD: + case PASSWORD: password = g_strdup (field_value); break; case TITLE: @@ -286,8 +350,8 @@ zimagez_upload_job (ScreenshooterJob *job, GValueArray *param_values, GError **e { if (exo_job_set_error_if_cancelled (EXO_JOB (job), error)) { - xmlrpc_env_clean (&env); - xmlrpc_client_cleanup (); + soup_session_abort (session); + g_object_unref (session); g_free (user); g_free (password); @@ -317,97 +381,69 @@ zimagez_upload_job (ScreenshooterJob *job, GValueArray *param_values, GError **e encoded_password = g_strdup (g_strreverse (rot13 (password))); TRACE ("User: %s", user); + TRACE ("Encoded password: %s", encoded_password); /* Start the user session */ TRACE ("Call the login method"); exo_job_info_message (EXO_JOB (job), _("Login on ZimageZ...")); - resultP = xmlrpc_client_call (&env, serverurl, method_login, - "(ss)", user, encoded_password); - - if (env.fault_occurred) + if (!do_xmlrpc (session, serverurl, method_login, + &tmp_error, &response_value, + G_TYPE_STRING, user, + G_TYPE_STRING, encoded_password, + G_TYPE_INVALID)) { - GError *tmp_error = - g_error_new (G_IO_ERROR, G_IO_ERROR_FAILED, - _("An error occurred during the XML exchange: %s (%d).\n " - "The screenshot could not be uploaded."), - env.fault_string, env.fault_code); - - xmlrpc_env_clean (&env); - xmlrpc_client_cleanup (); + g_propagate_error (error, tmp_error); + soup_session_abort (session); + g_object_unref (session); - g_free (user); g_free (password); g_free (title); g_free (comment); g_free (encoded_password); - g_propagate_error (error, tmp_error); - return FALSE; } TRACE ("Read the login response"); /* If the response is a boolean, there was an error */ - if (xmlrpc_value_type (resultP) == XMLRPC_TYPE_BOOL) + if (G_VALUE_HOLDS_BOOLEAN (&response_value)) { - xmlrpc_read_bool (&env, resultP, &response); - - if (env.fault_occurred) - { - GError *tmp_error = - g_error_new (G_IO_ERROR, G_IO_ERROR_FAILED, - _("An error occurred during the XML exchange: %s (%d).\n " - "The screenshot could not be uploaded."), - env.fault_string, env.fault_code); - - xmlrpc_env_clean (&env); - xmlrpc_client_cleanup (); - - g_free (user); - g_free (password); - g_free (title); - g_free (comment); - g_free (encoded_password); - - g_propagate_error (error, tmp_error); - - return FALSE; - } + response = g_value_get_boolean (&response_value); } /* Else we read the string response to get the session ID */ - else + else if (G_VALUE_HOLDS_STRING (&response_value)) { TRACE ("Read the session ID"); - xmlrpc_read_string (&env, resultP, (const gchar ** const)&login_response); - - if (env.fault_occurred) - { - GError *tmp_error = - g_error_new (G_IO_ERROR, G_IO_ERROR_FAILED, - _("An error occurred during the XML exchange: %s (%d).\n " - "The screenshot could not be uploaded."), - env.fault_string, env.fault_code); - - xmlrpc_env_clean (&env); - xmlrpc_client_cleanup (); - - g_free (user); - g_free (password); - g_free (title); - g_free (comment); - g_free (encoded_password); + login_response = g_strdup (g_value_get_string (&response_value)); + response = TRUE; + } + /* We received an unexpected reply */ + else + { + GError *tmp_err = + g_error_new (SOUP_XMLRPC_FAULT, + SOUP_XMLRPC_FAULT_PARSE_ERROR_NOT_WELL_FORMED, + "%s", _("An unexpected reply from ZimageZ was received." + " The upload of the screenshot failed.")); + soup_session_abort (session); + g_object_unref (session); - g_propagate_error (error, tmp_error); + g_free (user); + g_free (password); + g_free (title); + g_free (comment); + g_free (encoded_password); - return FALSE; - } + g_propagate_error (error, tmp_err); - response = 1; + return FALSE; } + g_value_unset (&response_value); + if (!response) { /* Login failed, erase the password and ask for the correct on to the @@ -470,9 +506,7 @@ zimagez_upload_job (ScreenshooterJob *job, GValueArray *param_values, GError **e } } - xmlrpc_DECREF (resultP); - - g_object_set_data_full (G_OBJECT (job), "user", + g_object_set_data_full (G_OBJECT (job), "user", g_strdup (user), (GDestroyNotify) g_free); g_free (user); @@ -489,36 +523,26 @@ zimagez_upload_job (ScreenshooterJob *job, GValueArray *param_values, GError **e /* Get the basename of the image path */ file_name = g_path_get_basename (image_path); - /* Escape the strings before passing them to xmlrpc-c */ - escaped_file_name = g_markup_escape_text (file_name, -1); - escaped_title = g_markup_escape_text (title, -1); - escaped_comment = g_markup_escape_text (comment, -1); - exo_job_info_message (EXO_JOB (job), _("Upload the screenshot...")); TRACE ("Call the upload method"); - resultP = xmlrpc_client_call (&env, serverurl, method_upload, - "(sssss)", encoded_data, escaped_file_name, - escaped_title, escaped_comment, - login_response); - - g_free (escaped_file_name); - g_free (escaped_title); - g_free (escaped_comment); + do_xmlrpc (session, serverurl, method_upload, + &tmp_error, &response_value, + G_TYPE_STRING, encoded_data, + G_TYPE_STRING, file_name, + G_TYPE_STRING, title, + G_TYPE_STRING, comment, + G_TYPE_STRING, login_response, + G_TYPE_INVALID); + g_free (title); g_free (comment); g_free (file_name); - if (env.fault_occurred) + if (tmp_error) { - GError *tmp_error = - g_error_new (G_IO_ERROR, G_IO_ERROR_FAILED, - _("An error occurred during the XML exchange: %s (%d).\n " - "The screenshot could not be uploaded."), - env.fault_string, env.fault_code); - - xmlrpc_env_clean (&env); - xmlrpc_client_cleanup (); + soup_session_abort (session); + g_object_unref (session); g_propagate_error (error, tmp_error); @@ -526,79 +550,63 @@ zimagez_upload_job (ScreenshooterJob *job, GValueArray *param_values, GError **e } /* If the response is a boolean, there was an error */ - if (xmlrpc_value_type (resultP) == XMLRPC_TYPE_BOOL) + if (G_VALUE_HOLDS_BOOLEAN (&response_value)) { - xmlrpc_bool response_upload; - - xmlrpc_read_bool (&env, resultP, &response_upload); - - if (env.fault_occurred) + if (!g_value_get_boolean (&response_value)) { - GError *tmp_error = - g_error_new (G_IO_ERROR, G_IO_ERROR_FAILED, - _("An error occurred during the XML exchange: %s (%d).\n " - "The screenshot could not be uploaded."), - env.fault_string, env.fault_code); - - xmlrpc_env_clean (&env); - xmlrpc_client_cleanup (); - - g_propagate_error (error, tmp_error); - - return FALSE; - } - - if (!response_upload) - { - GError *tmp_error = + GError *tmp_err = g_error_new (G_IO_ERROR, G_IO_ERROR_FAILED, _("An error occurred while uploading the screenshot.")); - xmlrpc_env_clean (&env); - xmlrpc_client_cleanup (); - - g_propagate_error (error, tmp_error); + soup_session_abort (session); + g_object_unref (session); + g_propagate_error (error, tmp_err); return FALSE; } } /* Else we get the file name */ - else + else if (G_VALUE_HOLDS_STRING (&response_value)) { - xmlrpc_read_string (&env, resultP, (const char **)&online_file_name); - TRACE ("The screenshot has been uploaded, get the file name."); + online_file_name = g_strdup (g_value_get_string (&response_value)); + } + /* We received un unexpected reply */ + else + { + GError *tmp_err = + g_error_new (SOUP_XMLRPC_FAULT, + SOUP_XMLRPC_FAULT_PARSE_ERROR_NOT_WELL_FORMED, + "%s", _("An unexpected reply from ZimageZ was received." + " The upload of the screenshot failed.")); + soup_session_abort (session); + g_object_unref (session); + g_propagate_error (error, tmp_err); - if (env.fault_occurred) - { - GError *tmp_error = - g_error_new (G_IO_ERROR, G_IO_ERROR_FAILED, - _("An error occurred during the XML exchange: %s (%d).\n " - "The screenshot could not be uploaded."), - env.fault_string, env.fault_code); - - xmlrpc_env_clean (&env); - xmlrpc_client_cleanup (); - - g_propagate_error (error, tmp_error); - - return FALSE; - } + return FALSE; } - xmlrpc_DECREF (resultP); + g_value_unset (&response_value); /* End the user session */ - exo_job_info_message (EXO_JOB (job), _("Close the session on ZimageZ...")); TRACE ("Closing the user session"); - xmlrpc_client_call (&env, serverurl, method_logout, "(s)", login_response); + do_xmlrpc (session, serverurl, method_logout, + &tmp_error, &response_value, + G_TYPE_STRING, login_response, + G_TYPE_INVALID); + + if (tmp_error) + g_error_free (tmp_error); - TRACE ("Cleanup the XMLRPC session"); - xmlrpc_env_clean (&env); - xmlrpc_client_cleanup (); + g_value_unset (&response_value); + + /* Clean the soup session */ + soup_session_abort (session); + g_object_unref (session); + g_free (login_response); screenshooter_job_image_uploaded (job, online_file_name); @@ -775,7 +783,7 @@ cb_ask_for_information (ScreenshooterJob *job, default: break; } - + g_free (field_value); } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (liststore), &iter)); @@ -882,7 +890,7 @@ static void cb_image_uploaded (ScreenshooterJob *job, gchar *upload_name, gchar last_user_temp = g_strdup (""); last_user = g_strdup (last_user_temp); - + /* Dialog */ dialog = xfce_titled_dialog_new_with_buttons (_("My screenshot on ZimageZ"), @@ -910,7 +918,7 @@ static void cb_image_uploaded (ScreenshooterJob *job, gchar *upload_name, gchar /* Links bold label */ link_label = gtk_label_new (""); - gtk_label_set_markup (GTK_LABEL (link_label), + gtk_label_set_markup (GTK_LABEL (link_label), _("<span weight=\"bold\" stretch=\"semiexpanded\">" "Links</span>")); gtk_misc_set_alignment (GTK_MISC (link_label), 0, 0); @@ -955,7 +963,7 @@ static void cb_image_uploaded (ScreenshooterJob *job, gchar *upload_name, gchar /* Examples bold label */ example_label = gtk_label_new (""); - gtk_label_set_markup (GTK_LABEL (example_label), + gtk_label_set_markup (GTK_LABEL (example_label), _("<span weight=\"bold\" stretch=\"semiexpanded\">" "Code for a thumbnail pointing to the full size image</span>")); gtk_misc_set_alignment (GTK_MISC (example_label), 0, 0); @@ -1028,7 +1036,7 @@ static void cb_error (ExoJob *job, GError *error, gpointer unused) { g_return_if_fail (error != NULL); - screenshooter_error ("%s", error->message); + screenshooter_error ("%s", error->message); } diff --git a/lib/screenshooter-zimagez.h b/lib/screenshooter-zimagez.h index 0b20cddf72871b3bfa5ce558cc933b72a5f31f52..d2d422ef925af743dd8ab57460bfe159d0e12dc1 100644 --- a/lib/screenshooter-zimagez.h +++ b/lib/screenshooter-zimagez.h @@ -26,9 +26,7 @@ #include <glib.h> #include <glib/gstdio.h> - -#include <xmlrpc-c/base.h> -#include <xmlrpc-c/client.h> +#include <libsoup/soup.h> #include "screenshooter-utils.h" #include "screenshooter-simple-job.h" diff --git a/panel-plugin/Makefile.am b/panel-plugin/Makefile.am index 99163e842bcfe9ab4442a862eace743cbd2e4113..0d1f3f8e0eb1710b9f928504b9f0ae0a544701b6 100644 --- a/panel-plugin/Makefile.am +++ b/panel-plugin/Makefile.am @@ -6,12 +6,14 @@ xfce4_screenshooter_plugin_CFLAGS = \ -I$(top_srcdir) \ -I$(top_srcdir)/lib \ @LIBXFCE4PANEL_CFLAGS@ \ - @GTHREAD_CFLAGS@ + @GTHREAD_CFLAGS@ \ + @SOUP_CFLAGS@ xfce4_screenshooter_plugin_LDFLAGS = \ + $(top_builddir)/lib/libscreenshooter.la \ @LIBXFCE4PANEL_LIBS@ \ @GTHREAD_LIBS@ \ - $(top_builddir)/lib/libscreenshooter.la + @SOUP_LIBS@ xfce4_screenshooter_plugin_SOURCES = \ screenshooter-plugin.c diff --git a/src/Makefile.am b/src/Makefile.am index 4d964238d1faa9f2efab256dcc75b29207c274c3..48272b768189c65257ce0eb7cbbc82d0bd4f519c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -7,6 +7,7 @@ xfce4_screenshooter_CFLAGS = \ @LIBXFCE4UTIL_CFLAGS@ \ @LIBXFCEGUI4_CFLAGS@ \ @GTHREAD_CFLAGS@ \ + @SOUP_CFLAGS@ \ -DPACKAGE_LOCALE_DIR=\"$(localedir)\" xfce4_screenshooter_LDFLAGS = \ @@ -14,6 +15,7 @@ xfce4_screenshooter_LDFLAGS = \ @GTK_LIBS@ \ @GLIB_LIBS@ \ @GTHREAD_LIBS@ \ + @SOUP_LIBS@ \ @LIBXFCE4UTIL_LIBS@ \ @LIBXFCEGUI4_LIBS@ diff --git a/src/main.c b/src/main.c index 85077f58b0a7a6ab578d813f5da01e230273f7e8..e6df156c2a427ff73c7c5b42ee627d6ad82c5c5b 100644 --- a/src/main.c +++ b/src/main.c @@ -34,11 +34,7 @@ gboolean region = FALSE; gboolean fullscreen = FALSE; gboolean no_save_dialog = FALSE; gboolean hide_mouse = FALSE; -#ifdef HAVE_XMLRPC -#ifdef HAVE_CURL gboolean upload = FALSE; -#endif -#endif gchar *screenshot_dir; gchar *application; gint delay = 0; @@ -85,15 +81,11 @@ static GOptionEntry entries[] = N_("Directory where the screenshot will be saved"), NULL }, -#ifdef HAVE_XMLRPC -#ifdef HAVE_CURL { "upload", 'u', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &upload, N_("Host the screenshot on ZimageZ, a free online image hosting service"), NULL }, -#endif -#endif { "version", 'V', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &version, N_("Version information"), @@ -204,15 +196,11 @@ int main (int argc, char **argv) sd->app = application; sd->action = OPEN; } -#ifdef HAVE_XMLRPC -#ifdef HAVE_CURL else if (upload) { sd->app = g_strdup ("none"); sd->action = UPLOAD; } -#endif -#endif else { sd->app = g_strdup ("none"); @@ -262,8 +250,6 @@ int main (int argc, char **argv) if (preferences_file != NULL) screenshooter_write_rc_file (preferences_file, sd); } -#ifdef HAVE_XMLRPC -#ifdef HAVE_CURL else if (sd->action == UPLOAD) { const gchar *preferences_file = @@ -287,16 +273,10 @@ int main (int argc, char **argv) } } } -#endif -#endif g_free (sd->screenshot_dir); g_free (sd->app); -#ifdef HAVE_XMLRPC -#ifdef HAVE_CURL g_free (sd->last_user); -#endif -#endif g_free (sd); TRACE ("Ciao");