diff options
Diffstat (limited to 'src/bookmarks/ephy-bookmarks-export.c')
-rw-r--r-- | src/bookmarks/ephy-bookmarks-export.c | 220 |
1 files changed, 163 insertions, 57 deletions
diff --git a/src/bookmarks/ephy-bookmarks-export.c b/src/bookmarks/ephy-bookmarks-export.c index be9b97ea7..b0ac4bc56 100644 --- a/src/bookmarks/ephy-bookmarks-export.c +++ b/src/bookmarks/ephy-bookmarks-export.c @@ -1,5 +1,6 @@ /* * Copyright (C) 2003 Marco Pesenti Gritti + * Copyright (C) 2003 Christian Persch * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -14,24 +15,29 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Id$ */ -#include <libxml/tree.h> -#include <libgnomevfs/gnome-vfs-uri.h> -#include <libgnomevfs/gnome-vfs-utils.h> - #include "ephy-bookmarks-export.h" #include "ephy-node-common.h" #include "ephy-file-helpers.h" #include "ephy-debug.h" -static void -add_topics_list (EphyNode *topics, EphyNode *bmk, - xmlNodePtr parent, xmlNsPtr dc_ns) +#include <libxml/tree.h> +#include <libxml/xmlwriter.h> +#include <libgnomevfs/gnome-vfs-uri.h> +#include <libgnomevfs/gnome-vfs-utils.h> + +static int +write_topics_list (EphyNode *topics, + EphyNode *bmk, + xmlTextWriterPtr writer) { GPtrArray *children; + GList *keywords = NULL, *l; int i; - GList *bmks = NULL, *l; + int ret = 0; children = ephy_node_get_children (topics); for (i = 0; i < children->len; i++) @@ -47,26 +53,27 @@ add_topics_list (EphyNode *topics, EphyNode *bmk, if (priority == EPHY_NODE_NORMAL_PRIORITY && ephy_node_has_child (kid, bmk)) { - bmks = g_list_append (bmks, kid); + keywords = g_list_prepend (keywords, kid); } } ephy_node_thaw (topics); - if (bmks == NULL) return; - - for (l = bmks; l != NULL; l = l->next) + for (l = keywords; l != NULL; l = l->next) { - const char *name; EphyNode *node = l->data; - xmlNodePtr item_node; + const char *name; name = ephy_node_get_property_string (node, EPHY_NODE_KEYWORD_PROP_NAME); - item_node = xmlNewChild (parent, dc_ns, "subject", NULL); - xmlNodeSetContent (item_node, name); + + ret = xmlTextWriterWriteElementNS + (writer, "dc", "subject", NULL, name); + if (ret < 0) break; } - g_list_free (bmks); + g_list_free (keywords); + + return ret >= 0 ? 0 : -1; } void @@ -74,50 +81,128 @@ ephy_bookmarks_export_rdf (EphyBookmarks *bookmarks, const char *filename) { EphyNode *bmks, *topics, *smart_bmks; - xmlDocPtr doc; - xmlNodePtr root, xml_node, channel_node, channel_seq_node; - xmlNsPtr ephy_ns, rdf_ns, dc_ns; + xmlTextWriterPtr writer; + char *tmp_file; GPtrArray *children; char *file_uri; - int i; + int i, ret; + + LOG ("Exporting as RDF to %s", filename) + + START_PROFILER ("Exporting as RDF") + + tmp_file = g_strconcat (filename, ".tmp", NULL); + + /* FIXME: do we want to turn on compression here? */ + writer = xmlNewTextWriterFilename (tmp_file, 0); + if (writer == NULL) return; - LOG ("Exporting to rdf") + ret = xmlTextWriterStartDocument (writer, "1.0", NULL, NULL); + if (ret < 0) goto out; - xmlIndentTreeOutput = TRUE; - doc = xmlNewDoc ("1.0"); + ret = xmlTextWriterStartElementNS + (writer, "rdf", "RDF", "http://www.w3.org/1999/02/22-rdf-syntax-ns#"); + if (ret < 0) goto out; - root = xmlNewDocNode (doc, NULL, "rdf:RDF", NULL); - xmlDocSetRootElement (doc, root); - rdf_ns = xmlNewNs (root, "http://www.w3.org/1999/02/22-rdf-syntax-ns#", "rdf"); - xmlNewNs (root, "http://purl.org/rss/1.0/", NULL); - dc_ns = xmlNewNs (root, "http://purl.org/dc/elements/1.1/", "dc"); - ephy_ns = xmlNewNs (root, "http://gnome.org/ns/epiphany#", "ephy"); - channel_node = xmlNewChild (root, NULL, "channel", NULL); + ret = xmlTextWriterWriteAttribute (writer, "xmlns", "http://purl.org/rss/1.0/"); + if (ret < 0) goto out; + + ret = xmlTextWriterWriteAttributeNS + (writer, "xmlns", "dc", NULL, "http://purl.org/dc/elements/1.1/"); + if (ret < 0) goto out; + + ret = xmlTextWriterWriteAttributeNS + (writer, "xmlns", "ephy", NULL, "http://gnome.org/ns/epiphany#"); + if (ret < 0) goto out; + + ret = xmlTextWriterStartElement (writer, "channel"); + if (ret < 0) goto out; + + /* FIXME is this UTF-8 ? */ file_uri = gnome_vfs_get_uri_from_local_path (filename); - xmlSetProp (channel_node, "rdf:about", file_uri); + ret = xmlTextWriterWriteAttributeNS (writer, "rdf", "about", NULL, file_uri); g_free (file_uri); + if (ret < 0) goto out; - xml_node = xmlNewChild (channel_node, NULL, "title", NULL); - xmlNodeSetContent (xml_node, "Epiphany bookmarks"); + ret = xmlTextWriterWriteElement (writer, "title", "Epiphany bookmarks"); + if (ret < 0) goto out; - xml_node = xmlNewChild (channel_node, NULL, "link", NULL); - xmlNodeSetContent (xml_node, "http://epiphany.mozdev.org"); + ret = xmlTextWriterWriteElement + (writer, "link", "http://www.gnome.org/projects/epiphany/"); + if (ret < 0) goto out; - xml_node = xmlNewChild (channel_node, NULL, "items", NULL); + ret = xmlTextWriterStartElement (writer, "items"); + if (ret < 0) goto out; - channel_seq_node = xmlNewChild (xml_node, rdf_ns, "Seq", NULL); + ret = xmlTextWriterStartElementNS (writer, "rdf", "Seq", NULL); + if (ret < 0) goto out; bmks = ephy_bookmarks_get_bookmarks (bookmarks); topics = ephy_bookmarks_get_keywords (bookmarks); smart_bmks = ephy_bookmarks_get_smart_bookmarks (bookmarks); children = ephy_node_get_children (bmks); - for (i = 0; i < children->len; i++) + for (i=0; i < children->len; i++) + { + EphyNode *kid; + const char *url; + char *link = NULL; + gboolean smart_url; + + kid = g_ptr_array_index (children, i); + + smart_url = ephy_node_has_child (smart_bmks, kid); + url = ephy_node_get_property_string + (kid, EPHY_NODE_BMK_PROP_LOCATION); + if (smart_url) + { + GnomeVFSURI *uri; + + uri = gnome_vfs_uri_new (url); + + if (uri) + { + link = g_strconcat (gnome_vfs_uri_get_scheme (uri), + "://", + gnome_vfs_uri_get_host_name (uri), + NULL); + + gnome_vfs_uri_unref (uri); + } + } + + if (link == NULL) + { + link = g_strdup (url); + } + + ret = xmlTextWriterStartElementNS (writer, "rdf", "li", NULL); + if (ret < 0) break; + + ret = xmlTextWriterWriteAttributeNS + (writer, "rdf", "about", NULL, link); + if (ret < 0) break; + + ret = xmlTextWriterEndElement (writer); /* rdf:li */ + if (ret < 0) break; + } + ephy_node_thaw (bmks); + if (ret < 0) goto out; + + ret = xmlTextWriterEndElement (writer); /* rdf:Seq */ + if (ret < 0) goto out; + + ret = xmlTextWriterEndElement (writer); /* items */ + if (ret < 0) goto out; + + ret = xmlTextWriterEndElement (writer); /* channel */ + if (ret < 0) goto out; + + children = ephy_node_get_children (bmks); + for (i=0; i < children->len; i++) { EphyNode *kid; const char *url, *title; - xmlNodePtr item_node; - xmlChar *encoded_link; char *link = NULL; gboolean smart_url; @@ -151,33 +236,54 @@ ephy_bookmarks_export_rdf (EphyBookmarks *bookmarks, link = g_strdup (url); } - encoded_link = xmlEncodeEntitiesReentrant (doc, link); - - item_node = xmlNewChild (channel_seq_node, rdf_ns, "li", NULL); - xmlSetNsProp (item_node, rdf_ns, "about", link); + ret = xmlTextWriterStartElement (writer, "item"); + if (ret < 0) break; - item_node = xmlNewChild (root, NULL, "item", NULL); - xmlSetNsProp (item_node, rdf_ns, "about", link); + ret = xmlTextWriterWriteAttributeNS + (writer, "rdf", "about", NULL, link); + if (ret < 0) break; - xml_node = xmlNewChild (item_node, NULL, "title", title); + ret = xmlTextWriterWriteElement (writer, "title", title); + if (ret < 0) break; - xml_node = xmlNewChild (item_node, NULL, "link", encoded_link); + ret = xmlTextWriterWriteElement (writer, "link", link); + if (ret < 0) break; if (smart_url) { - xmlChar *encoded_url; - encoded_url = xmlEncodeEntitiesReentrant (doc, url); - xml_node = xmlNewChild (item_node, ephy_ns, "smartlink", encoded_url); - xmlFree (encoded_url); + ret = xmlTextWriterWriteElementNS (writer, "ephy", "smartlink", NULL, url); + if (ret < 0) break; } - add_topics_list (topics, kid, item_node, dc_ns); + ret = write_topics_list (topics, kid, writer); + if (ret < 0) break; + + ret = xmlTextWriterEndElement (writer); /* item */ - xmlFree (encoded_link); g_free (link); + + i++; } ephy_node_thaw (bmks); + if (ret < 0) goto out; + + ret = xmlTextWriterEndElement (writer); /* rdf:RDF */ + if (ret < 0) goto out; + + ret = xmlTextWriterEndDocument (writer); + +out: + xmlFreeTextWriter (writer); + + if (ret >= 0) + { + if (ephy_file_switch_temp_file (filename, tmp_file) == FALSE) + { + ret = -1; + } + } + + STOP_PROFILER ("Exporting as RDF") - ephy_file_save_xml (filename, doc); - xmlFreeDoc(doc); + LOG ("Exporting as RDF %s.", ret >= 0 ? "succeeded" : "FAILED") } |