[PATCH] Display divelogs.de upload status to the user

Miika Turkia miika.turkia at gmail.com
Sat Apr 27 06:10:26 PDT 2013


This shows a dialog indicating the success or failure of divelogs.de
upload. Currently the raw XML returned from the SOAP request is
also displayed.

Signed-off-by: Miika Turkia <miika.turkia at gmail.com>
---
 divelist-gtk.c |   53 +++++++++++++++++++++++++++++++++++++++++++++++++----
 webservice.c   |    7 ++-----
 webservice.h   |    2 +-
 3 files changed, 52 insertions(+), 10 deletions(-)

diff --git a/divelist-gtk.c b/divelist-gtk.c
index f523805..8bc8365 100644
--- a/divelist-gtk.c
+++ b/divelist-gtk.c
@@ -1366,6 +1366,30 @@ static void delete_dive_cb(GtkWidget *menuitem, GtkTreePath *path)
 	mark_divelist_changed(TRUE);
 }
 
+void divelogs_status_dialog(char *error, GtkMessageType type)
+{
+	GtkWidget *dialog, *vbox, *label;
+
+	dialog = gtk_message_dialog_new(
+			GTK_WINDOW(main_window),
+			GTK_DIALOG_DESTROY_WITH_PARENT,
+			type,
+			GTK_BUTTONS_OK,
+			_("%s: Response from divelogs.de"), type == GTK_MESSAGE_INFO ? _("Info") : _("Error")
+			);
+
+	vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
+
+	label = create_label("%s", error);
+	gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
+
+	gtk_widget_show_all(dialog);
+	gtk_dialog_run(GTK_DIALOG(dialog));
+
+	gtk_widget_destroy(dialog);
+
+}
+
 #if defined(LIBZIP) && defined(XSLT)
 static void upload_dives_divelogs(const gboolean selected)
 {
@@ -1381,6 +1405,8 @@ static void upload_dives_divelogs(const gboolean selected)
 	struct zip_source *s[dive_table.nr];
 	struct zip *zip;
 	const gchar *tmpdir = g_get_tmp_dir();
+	GtkMessageType type;
+	char *error = NULL;
 
 	/*
 	 * Creating a temporary .DLD file to be eventually uploaded to
@@ -1451,10 +1477,29 @@ static void upload_dives_divelogs(const gboolean selected)
 		}
 	}
 	zip_close(zip);
-	if (divelogde_upload(tempfile))
-		g_unlink(tempfile);
-	else
-		fprintf(stderr,"upload of %s failed\n", tempfile);
+	if (!divelogde_upload(tempfile, &error)) {
+		error = strdup(_("Communication error with divelogs.de"));
+		type = GTK_MESSAGE_ERROR;
+	} else {
+		/* The upload status XML message should be parsed
+		 * properly and displayed in a sensible manner. But just
+		 * displaying the raw message is better than nothing.
+		 * And at least the dialog is customized to indicate
+		 * error or success.
+		 */
+		if (strstr(error, "failed"))
+			type = GTK_MESSAGE_ERROR;
+		else
+			type = GTK_MESSAGE_INFO;
+	}
+
+
+	if (error) {
+		divelogs_status_dialog(error, type);
+		free(error);
+	}
+
+	g_unlink(tempfile);
 	g_free(tempfile);
 }
 
diff --git a/webservice.c b/webservice.c
index f11dc37..c01b1a8 100644
--- a/webservice.c
+++ b/webservice.c
@@ -359,7 +359,7 @@ static gboolean divelogde_dialog(const char **user, const char **pass)
 	return ret;
 }
 
-int divelogde_upload(char *fn)
+int divelogde_upload(char *fn, char **error)
 {
 	SoupMessage *msg;
 	SoupMultipart *multipart;
@@ -386,10 +386,7 @@ int divelogde_upload(char *fn)
 	soup_message_headers_append(msg->request_headers, "Accept", "text/xml");
 	soup_session_send_message(session, msg);
 	if (SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) {
-		/* we should really check if the XML returned indicates that
-		 * the profiles were successfully uploaded...
-		 */
-		fprintf(stderr, "%s\n", (gchar *)msg->response_body->data);
+		*error = strdup(msg->response_body->data);
 		ret = TRUE;
 	}
 	soup_session_abort(session);
diff --git a/webservice.h b/webservice.h
index bb3a71f..e1eb0ce 100644
--- a/webservice.h
+++ b/webservice.h
@@ -1,3 +1,3 @@
 extern void webservice_download_dialog(void);
 extern gboolean webservice_request_user_xml(const gchar *, gchar **, guint *, guint *);
-extern int divelogde_upload(char *fn);
+extern int divelogde_upload(char *fn, char **error);
-- 
1.7.9.5



More information about the subsurface mailing list