char * gth_tags_file_to_data (GthTagsFile *tags, gsize *len, GError **data_error) { DomDocument *doc; DomElement *root; char *data; GList *scan; doc = dom_document_new (); root = dom_document_create_element (doc, "tags", "version", FILE_FORMAT, NULL); dom_element_append_child (DOM_ELEMENT (doc), root); for (scan = tags->items; scan; scan = scan->next) { const char *tag_value = scan->data; dom_element_append_child (root, dom_document_create_element (doc, "tag", "value", tag_value, NULL)); } data = dom_document_dump (doc, len); g_object_unref (doc); return data; }
GList * facebook_accounts_load_from_file (void) { GList *accounts = NULL; char *filename; char *buffer; gsize len; DomDocument *doc; filename = gth_user_dir_get_file (GTH_DIR_CONFIG, GTHUMB_DIR, "accounts", "facebook.xml", NULL); if (! g_file_get_contents (filename, &buffer, &len, NULL)) { g_free (filename); return NULL; } doc = dom_document_new (); if (dom_document_load (doc, buffer, len, NULL)) { DomElement *node; node = DOM_ELEMENT (doc)->first_child; if ((node != NULL) && (g_strcmp0 (node->tag_name, "accounts") == 0)) { DomElement *child; for (child = node->first_child; child != NULL; child = child->next_sibling) { if (strcmp (child->tag_name, "account") == 0) { FacebookAccount *account; account = facebook_account_new (); dom_domizable_load_from_element (DOM_DOMIZABLE (account), child); accounts = g_list_prepend (accounts, account); } } accounts = g_list_reverse (accounts); } } g_object_unref (doc); g_free (buffer); g_free (filename); return accounts; }
gboolean gth_tags_file_load_from_data (GthTagsFile *tags, const char *data, gsize length, GError **error) { DomDocument *doc; gboolean success; _g_string_list_free (tags->items); tags->items = NULL; doc = dom_document_new (); success = dom_document_load (doc, data, length, error); if (success) { DomElement *tags_node; DomElement *child; tags_node = DOM_ELEMENT (doc)->first_child; if ((tags_node != NULL) && (g_strcmp0 (tags_node->tag_name, "tags") == 0)) { for (child = tags_node->first_child; child != NULL; child = child->next_sibling) { if (strcmp (child->tag_name, "tag") == 0) { const char *tag_value; tag_value = dom_element_get_attribute (child, "value"); if (tag_value != NULL) tags->items = g_list_prepend (tags->items, g_strdup (tag_value)); } } tags->items = g_list_reverse (tags->items); } } g_object_unref (doc); return success; }
void picasa_web_service_create_album (PicasaWebService *self, PicasaWebAlbum *album, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { OAuthAccount *account; DomDocument *doc; DomElement *entry; char *buffer; gsize len; char *url; SoupMessage *msg; account = web_service_get_current_account (WEB_SERVICE (self)); g_return_if_fail (account != NULL); gth_task_progress (GTH_TASK (self), _("Creating the new album"), NULL, TRUE, 0.0); doc = dom_document_new (); entry = dom_domizable_create_element (DOM_DOMIZABLE (album), doc); dom_element_append_child (DOM_ELEMENT (doc), entry); buffer = dom_document_dump (doc, &len); url = g_strconcat ("https://picasaweb.google.com/data/feed/api/user/", account->id, NULL); msg = soup_message_new ("POST", url); soup_message_set_request (msg, ATOM_ENTRY_MIME_TYPE, SOUP_MEMORY_TAKE, buffer, len); _picasa_web_service_add_headers (self, msg); _web_service_send_message (WEB_SERVICE (self), msg, cancellable, callback, user_data, picasa_web_service_create_album, create_album_ready_cb, self); g_free (url); g_object_unref (doc); }
static void create_album_ready_cb (SoupSession *session, SoupMessage *msg, gpointer user_data) { PicasaWebService *self = user_data; GSimpleAsyncResult *result; SoupBuffer *body; DomDocument *doc; GError *error = NULL; result = _web_service_get_result (WEB_SERVICE (self)); if (msg->status_code != 201) { g_simple_async_result_set_error (result, SOUP_HTTP_ERROR, msg->status_code, "%s", soup_status_get_phrase (msg->status_code)); g_simple_async_result_complete_in_idle (result); return; } body = soup_message_body_flatten (msg->response_body); doc = dom_document_new (); if (dom_document_load (doc, body->data, body->length, &error)) { PicasaWebAlbum *album; album = picasa_web_album_new (); dom_domizable_load_from_element (DOM_DOMIZABLE (album), DOM_ELEMENT (doc)->first_child); g_simple_async_result_set_op_res_gpointer (result, album, (GDestroyNotify) g_object_unref); } else { g_simple_async_result_set_from_error (result, error); g_error_free (error); } g_simple_async_result_complete_in_idle (result); g_object_unref (doc); soup_buffer_free (body); }
void facebook_accounts_save_to_file (GList *accounts, FacebookAccount *default_account) { DomDocument *doc; DomElement *root; GList *scan; char *buffer; gsize len; char *filename; GFile *file; doc = dom_document_new (); root = dom_document_create_element (doc, "accounts", NULL); dom_element_append_child (DOM_ELEMENT (doc), root); for (scan = accounts; scan; scan = scan->next) { FacebookAccount *account = scan->data; DomElement *node; if ((default_account != NULL) && g_strcmp0 (account->username, default_account->username) == 0) account->is_default = TRUE; else account->is_default = FALSE; node = dom_domizable_create_element (DOM_DOMIZABLE (account), doc); dom_element_append_child (root, node); } gth_user_dir_make_dir_for_file (GTH_DIR_CONFIG, GTHUMB_DIR, "accounts", "facebook.xml", NULL); filename = gth_user_dir_get_file (GTH_DIR_CONFIG, GTHUMB_DIR, "accounts", "facebook.xml", NULL); file = g_file_new_for_path (filename); buffer = dom_document_dump (doc, &len); g_write_file (file, FALSE, G_FILE_CREATE_PRIVATE | G_FILE_CREATE_REPLACE_DESTINATION, buffer, len, NULL, NULL); g_free (buffer); g_object_unref (file); g_free (filename); g_object_unref (doc); }
gboolean flickr_utils_parse_response (SoupBuffer *body, DomDocument **doc_p, GError **error) { DomDocument *doc; DomElement *node; doc = dom_document_new (); if (! dom_document_load (doc, body->data, body->length, error)) { g_object_unref (doc); return FALSE; } for (node = DOM_ELEMENT (doc)->first_child; node; node = node->next_sibling) { if (g_strcmp0 (node->tag_name, "rsp") == 0) { if (g_strcmp0 (dom_element_get_attribute (node, "stat"), "ok") != 0) { DomElement *child; for (child = node->first_child; child; child = child->next_sibling) { if (g_strcmp0 (child->tag_name, "err") == 0) { *error = g_error_new_literal (WEB_SERVICE_ERROR, atoi (dom_element_get_attribute (child, "code")), dom_element_get_attribute (child, "msg")); } } g_object_unref (doc); return FALSE; } } } *doc_p = doc; return TRUE; }
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 list_albums_ready_cb (SoupSession *session, SoupMessage *msg, gpointer user_data) { PicasaWebService *self = user_data; GSimpleAsyncResult *result; SoupBuffer *body; DomDocument *doc; GError *error = NULL; result = _web_service_get_result (WEB_SERVICE (self)); if (msg->status_code != 200) { g_simple_async_result_set_error (result, SOUP_HTTP_ERROR, msg->status_code, "%s", soup_status_get_phrase (msg->status_code)); g_simple_async_result_complete_in_idle (result); return; } body = soup_message_body_flatten (msg->response_body); doc = dom_document_new (); if (dom_document_load (doc, body->data, body->length, &error)) { DomElement *feed_node; GList *albums = NULL; feed_node = DOM_ELEMENT (doc)->first_child; while ((feed_node != NULL) && g_strcmp0 (feed_node->tag_name, "feed") != 0) feed_node = feed_node->next_sibling; if (feed_node != NULL) { DomElement *node; PicasaWebAlbum *album; album = NULL; for (node = feed_node->first_child; node != NULL; node = node->next_sibling) { if (g_strcmp0 (node->tag_name, "entry") == 0) { /* read the album data */ if (album != NULL) albums = g_list_prepend (albums, album); album = picasa_web_album_new (); dom_domizable_load_from_element (DOM_DOMIZABLE (album), node); } else if (g_strcmp0 (node->tag_name, "gphoto:quotalimit") == 0) { self->priv->quota_limit = g_ascii_strtoull (dom_element_get_inner_text (node), NULL, 10); } else if (g_strcmp0 (node->tag_name, "gphoto:quotacurrent") == 0) { self->priv->quota_used = g_ascii_strtoull (dom_element_get_inner_text (node), NULL, 10); } } if (album != NULL) albums = g_list_prepend (albums, album); } albums = g_list_reverse (albums); g_simple_async_result_set_op_res_gpointer (result, albums, (GDestroyNotify) _g_object_list_unref); } else { g_simple_async_result_set_from_error (result, error); g_error_free (error); } g_simple_async_result_complete_in_idle (result); g_object_unref (doc); soup_buffer_free (body); }
static void list_photos_ready_cb (SoupSession *session, SoupMessage *msg, gpointer user_data) { PicasaWebService *self = user_data; GSimpleAsyncResult *result; SoupBuffer *body; DomDocument *doc; GError *error = NULL; result = _web_service_get_result (WEB_SERVICE (self)); if (msg->status_code != 200) { g_simple_async_result_set_error (result, SOUP_HTTP_ERROR, msg->status_code, "%s", soup_status_get_phrase (msg->status_code)); g_simple_async_result_complete_in_idle (result); return; } body = soup_message_body_flatten (msg->response_body); doc = dom_document_new (); if (dom_document_load (doc, body->data, body->length, &error)) { DomElement *feed_node; GList *photos = NULL; feed_node = DOM_ELEMENT (doc)->first_child; while ((feed_node != NULL) && g_strcmp0 (feed_node->tag_name, "feed") != 0) feed_node = feed_node->next_sibling; if (feed_node != NULL) { DomElement *node; PicasaWebPhoto *photo; photo = NULL; for (node = feed_node->first_child; node != NULL; node = node->next_sibling) { if (g_strcmp0 (node->tag_name, "entry") == 0) { /* read the photo data */ if (photo != NULL) photos = g_list_prepend (photos, photo); photo = picasa_web_photo_new (); dom_domizable_load_from_element (DOM_DOMIZABLE (photo), node); } } if (photo != NULL) photos = g_list_prepend (photos, photo); } photos = g_list_reverse (photos); g_simple_async_result_set_op_res_gpointer (result, photos, (GDestroyNotify) _g_object_list_unref); } else { g_simple_async_result_set_from_error (result, error); g_error_free (error); } g_simple_async_result_complete_in_idle (result); g_object_unref (doc); soup_buffer_free (body); }