diff options
-rw-r--r-- | divelist.c | 31 | ||||
-rw-r--r-- | file.c | 2 | ||||
-rw-r--r-- | file.h | 1 | ||||
-rw-r--r-- | webservice.c | 39 | ||||
-rw-r--r-- | webservice.h | 1 |
5 files changed, 53 insertions, 21 deletions
diff --git a/divelist.c b/divelist.c index 6751d548c..7e371d281 100644 --- a/divelist.c +++ b/divelist.c @@ -29,6 +29,7 @@ #include "dive.h" #include "display.h" #include "display-gtk.h" +#include "webservice.h" #include <gdk-pixbuf/gdk-pixdata.h> #include "satellite.h" @@ -1992,7 +1993,6 @@ static void export_selected_dives_cb(GtkWidget *menuitem, GtkTreePath *path) * Creating a temporary .DLD file to be eventually uploaded to * divelogs.de. I wonder if this could be done in-memory. */ - tempfile = g_build_filename(tmpdir, "export.DLD-XXXXXX", NULL); int fd = g_mkstemp(tempfile); if (fd != -1) @@ -2032,7 +2032,6 @@ static void export_selected_dives_cb(GtkWidget *menuitem, GtkTreePath *path) * transform it to divelogs.de format, finally dumping * the XML into a character buffer. */ - doc = xmlReadMemory(membuf, strlen(membuf), "divelog", NULL, 0); if (!doc) continue; @@ -2050,27 +2049,19 @@ static void export_selected_dives_cb(GtkWidget *menuitem, GtkTreePath *path) /* * Save the XML document into a zip file. */ - snprintf(filename, PATH_MAX, "%d.xml", i + 1); - if ((s[i]=zip_source_buffer(zip, membuf, streamsize, 0)) == NULL || zip_add(zip, filename, s[i]) == -1) - fprintf(stderr, "failed to include dive %d\n", i); - if (membuf) - free((void *)membuf); + s[i] = zip_source_buffer(zip, membuf, streamsize, 1); + if (s[i]) { + zip_int64_t ret = zip_add(zip, filename, s[i]); + if (ret == -1) + fprintf(stderr, "failed to include dive %d\n", i); + } } zip_close(zip); - - /* - * divelogs.de upload functionality should get rid of this - * message and use proper dialog to inform user of the success - * or failure of the upload - */ - fprintf(stderr, "Created .DLD file %s\n", tempfile); - - /* TODO: the file needs to be deleted after the upload - - g_unlink(tempfile); - - */ + if (divelogde_upload(tempfile)) + g_unlink(tempfile); + else + fprintf(stderr,"upload of %s failed\n", tempfile); g_free(tempfile); } #endif @@ -14,7 +14,7 @@ #define O_BINARY 0 #endif -static int readfile(const char *filename, struct memblock *mem) +int readfile(const char *filename, struct memblock *mem) { int ret, fd; struct stat st; @@ -7,5 +7,6 @@ struct memblock { }; extern int try_to_open_cochran(const char *filename, struct memblock *mem, GError **error); +extern int readfile(const char *filename, struct memblock *mem); #endif diff --git a/webservice.c b/webservice.c index 9cdd75ced..615405fc5 100644 --- a/webservice.c +++ b/webservice.c @@ -6,6 +6,7 @@ #include "dive.h" #include "divelist.h" #include "display-gtk.h" +#include "file.h" struct dive_table gps_location_table; static gboolean merge_locations_into_dives(void); @@ -306,3 +307,41 @@ void webservice_download_dialog(void) if (has_previous_uid) free((void *)current_uid); } + +int divelogde_upload(char *fn) +{ + SoupMessage *msg; + SoupMultipart *multipart; + SoupSession *session; + SoupBuffer *sbuf; + gboolean ret = FALSE; + gchar url[256] = "http://divelogs.de/DivelogsDirectImport.php"; + struct memblock mem; + + if (readfile(fn, &mem) < 0) + return ret; + + sbuf = soup_buffer_new(SOUP_MEMORY_STATIC, mem.buffer, mem.size); + session = soup_session_async_new(); + multipart = soup_multipart_new(SOUP_FORM_MIME_TYPE_MULTIPART); + + /* this needs to come from a dialog box and be stored in the user config */ + soup_multipart_append_form_string(multipart, "user", "subsurfacetest"); + soup_multipart_append_form_string(multipart, "pass", "geheim"); + + soup_multipart_append_form_file(multipart, "userfile", fn, NULL, sbuf); + msg = soup_form_request_new_from_multipart(url, multipart); + 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); + ret = TRUE; + } + soup_session_abort(session); + g_object_unref(G_OBJECT(msg)); + g_object_unref(G_OBJECT(session)); + return ret; +} diff --git a/webservice.h b/webservice.h index ea74885c1..bb3a71f3b 100644 --- a/webservice.h +++ b/webservice.h @@ -1,2 +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); |