static void do_md5_test_libsoup (const char *uri, const char *contents, gsize length, const char *md5) { SoupMultipart *multipart; SoupBuffer *buffer; SoupMessage *msg; SoupSession *session; debug_printf (1, " via libsoup: "); multipart = soup_multipart_new (SOUP_FORM_MIME_TYPE_MULTIPART); buffer = soup_buffer_new (SOUP_MEMORY_COPY, contents, length); soup_multipart_append_form_file (multipart, "file", MD5_TEST_FILE_BASENAME, MD5_TEST_FILE_MIME_TYPE, buffer); soup_buffer_free (buffer); soup_multipart_append_form_string (multipart, "fmt", "text"); msg = soup_form_request_new_from_multipart (uri, multipart); soup_multipart_free (multipart); session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC, NULL); soup_session_send_message (session, msg); if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) { debug_printf (1, "ERROR: Unexpected status %d %s\n", msg->status_code, msg->reason_phrase); errors++; } else if (strcmp (msg->response_body->data, md5) != 0) { debug_printf (1, "ERROR: Incorrect response: expected '%s' got '%s'\n", md5, msg->response_body->data); errors++; } else debug_printf (1, "OK!\n"); g_object_unref (msg); soup_test_session_abort_unref (session); }
static void post_photo_file_buffer_ready_cb (void **buffer, gsize count, GError *error, gpointer user_data) { PicasaWebService *self = user_data; OAuthAccount *account; GthFileData *file_data; SoupMultipart *multipart; const char *filename; char *value; GObject *metadata; DomDocument *doc; DomElement *entry; char *entry_buffer; gsize entry_len; SoupMessageHeaders *headers; SoupBuffer *body; void *resized_buffer; gsize resized_count; char *url; SoupMessage *msg; if (error != NULL) { post_photos_done (self, error); return; } account = web_service_get_current_account (WEB_SERVICE (self)); file_data = self->priv->post_photos->current->data; multipart = soup_multipart_new ("multipart/related"); /* the metadata part */ doc = dom_document_new (); entry = dom_document_create_element (doc, "entry", "xmlns", "http://www.w3.org/2005/Atom", "xmlns:gphoto", "http://schemas.google.com/photos/2007", "xmlns:media", "http://search.yahoo.com/mrss/", NULL); filename = g_file_info_get_display_name (file_data->info); dom_element_append_child (entry, dom_document_create_element_with_text (doc, filename, "title", NULL)); value = gth_file_data_get_attribute_as_string (file_data, "general::description"); if (value == NULL) value = gth_file_data_get_attribute_as_string (file_data, "general::title"); dom_element_append_child (entry, dom_document_create_element_with_text (doc, value, "summary", NULL)); value = gth_file_data_get_attribute_as_string (file_data, "general::location"); if (value != NULL) dom_element_append_child (entry, dom_document_create_element_with_text (doc, value, "gphoto:location", NULL)); metadata = g_file_info_get_attribute_object (file_data->info, "general::tags"); if (metadata != NULL) value = gth_string_list_join (GTH_STRING_LIST (gth_metadata_get_string_list (GTH_METADATA (metadata))), ", "); if (value != NULL) { DomElement *group; group = dom_document_create_element (doc, "media:group", NULL); dom_element_append_child (group, dom_document_create_element_with_text (doc, value, "media:keywords", NULL)); dom_element_append_child (entry, group); g_free (value); } dom_element_append_child (entry, dom_document_create_element (doc, "category", "scheme", "http://schemas.google.com/g/2005#kind", "term", "http://schemas.google.com/photos/2007#photo", NULL)); dom_element_append_child (DOM_ELEMENT (doc), entry); entry_buffer = dom_document_dump (doc, &entry_len); headers = soup_message_headers_new (SOUP_MESSAGE_HEADERS_REQUEST); soup_message_headers_append (headers, "Content-Type", "application/atom+xml"); body = soup_buffer_new (SOUP_MEMORY_TAKE, entry_buffer, entry_len); soup_multipart_append_part (multipart, headers, body); soup_buffer_free (body); soup_message_headers_free (headers); g_object_unref (doc); /* the file part */ if (_g_buffer_resize_image (*buffer, count, file_data, self->priv->post_photos->max_width, self->priv->post_photos->max_height, &resized_buffer, &resized_count, self->priv->post_photos->cancellable, &error)) { body = soup_buffer_new (SOUP_MEMORY_TAKE, resized_buffer, resized_count); } else if (error == NULL) { body = soup_buffer_new (SOUP_MEMORY_TEMPORARY, *buffer, count); } else { soup_multipart_free (multipart); post_photos_done (self, error); return; } soup_multipart_append_form_file (multipart, "file", NULL, gth_file_data_get_mime_type (file_data), body); soup_buffer_free (body); /* send the file */ self->priv->post_photos->wrote_body_data_size = 0; url = g_strconcat ("https://picasaweb.google.com/data/feed/api/user/", account->id, "/albumid/", self->priv->post_photos->album->id, NULL); msg = soup_form_request_new_from_multipart (url, multipart); g_signal_connect (msg, "wrote-body-data", (GCallback) upload_photo_wrote_body_data_cb, self); _picasa_web_service_add_headers (self, msg); _web_service_send_message (WEB_SERVICE (self), msg, self->priv->post_photos->cancellable, self->priv->post_photos->callback, self->priv->post_photos->user_data, picasa_web_service_post_photos, post_photo_ready_cb, self); g_free (url); soup_multipart_free (multipart); }
static void upload_photo_file_buffer_ready_cb (void **buffer, gsize count, GError *error, gpointer user_data) { FacebookService *self = user_data; GthFileData *file_data; SoupMultipart *multipart; char *uri; SoupBuffer *body; SoupMessage *msg; if (error != NULL) { upload_photos_done (self, error); return; } file_data = self->priv->post_photos->current->data; multipart = soup_multipart_new ("multipart/form-data"); /* the metadata part */ { GHashTable *data_set; char *title; char *description; GList *keys; GList *scan; data_set = g_hash_table_new (g_str_hash, g_str_equal); g_hash_table_insert (data_set, "method", "facebook.photos.upload"); title = gth_file_data_get_attribute_as_string (file_data, "general::title"); description = gth_file_data_get_attribute_as_string (file_data, "general::description"); if (description != NULL) g_hash_table_insert (data_set, "caption", description); else if (title != NULL) g_hash_table_insert (data_set, "caption", title); if (self->priv->post_photos->album != NULL) g_hash_table_insert (data_set, "aid", self->priv->post_photos->album->id); facebook_connection_add_api_sig (self->priv->conn, data_set); keys = g_hash_table_get_keys (data_set); for (scan = keys; scan; scan = scan->next) { char *key = scan->data; soup_multipart_append_form_string (multipart, key, g_hash_table_lookup (data_set, key)); } g_list_free (keys); g_hash_table_unref (data_set); } /* the file part */ uri = g_file_get_uri (file_data->file); body = soup_buffer_new (SOUP_MEMORY_TEMPORARY, *buffer, count); soup_multipart_append_form_file (multipart, NULL, _g_uri_get_basename (uri), gth_file_data_get_mime_type (file_data), body); soup_buffer_free (body); g_free (uri); /* send the file */ { char *details; /* Translators: %s is a filename */ details = g_strdup_printf (_("Uploading '%s'"), g_file_info_get_display_name (file_data->info)); gth_task_progress (GTH_TASK (self->priv->conn), NULL, details, FALSE, (double) (self->priv->post_photos->uploaded_size + (g_file_info_get_size (file_data->info) / 2.0)) / self->priv->post_photos->total_size); g_free (details); } msg = soup_form_request_new_from_multipart (FACEBOOK_HTTPS_REST_SERVER, multipart); facebook_connection_send_message (self->priv->conn, msg, self->priv->post_photos->cancellable, self->priv->post_photos->callback, self->priv->post_photos->user_data, facebook_service_upload_photos, upload_photo_ready_cb, self); soup_multipart_free (multipart); }