[libgsf] Fix gsf_opendoc_metadata_subtree #581530
- From: Andreas J. Guelzow <guelzow src gnome org>
- To: svn-commits-list gnome org
- Subject: [libgsf] Fix gsf_opendoc_metadata_subtree #581530
- Date: Wed, 6 May 2009 17:20:12 -0400 (EDT)
commit 8601d1c3db114ffb659f479bdb761038f9dee8ff
Author: Andreas J. Guelzow <aguelzow pyrshep ca>
Date: Wed May 6 15:19:32 2009 -0600
Fix gsf_opendoc_metadata_subtree #581530
2009-05-06 Andreas J. Guelzow <aguelzow pyrshep ca>
Fixes #581530
* gsf/gsf-opendoc-utils.c (gsf_opendoc_meta_dtd): split into
gsf_opendoc_meta_dtd and gsf_opendoc_meta_st_dtd
(gsf_opendoc_metadata_subtree_free): free the state not the doc
(gsf_opendoc_metadata_subtree): use your own dtd
(gsf_opendoc_metadata_subtree_internal): new
---
ChangeLog | 9 ++++
NEWS | 3 +
gsf/gsf-opendoc-utils.c | 94 ++++++++++++++++++++++++++++++++++-------------
3 files changed, 80 insertions(+), 26 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index efff3c8..ecb8c75 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2009-05-06 Andreas J. Guelzow <aguelzow pyrshep ca>
+
+ Fixes #581530
+ * gsf/gsf-opendoc-utils.c (gsf_opendoc_meta_dtd): split into
+ gsf_opendoc_meta_dtd and gsf_opendoc_meta_st_dtd
+ (gsf_opendoc_metadata_subtree_free): free the state not the doc
+ (gsf_opendoc_metadata_subtree): use your own dtd
+ (gsf_opendoc_metadata_subtree_internal): new
+
2009-04-28 Emmanuel Pacaud <emmanuel gnome org>
Add doap file.
diff --git a/NEWS b/NEWS
index dac9dd8..09ef357 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,8 @@
libgsf 1.14.13
+Andreas:
+ * Fix gsf_opendoc_metadata_subtree [#581530]
+
--------------------------------------------------------------------------
libgsf 1.14.12
diff --git a/gsf/gsf-opendoc-utils.c b/gsf/gsf-opendoc-utils.c
index 267d208..ecd044b 100644
--- a/gsf/gsf-opendoc-utils.c
+++ b/gsf/gsf-opendoc-utils.c
@@ -180,9 +180,8 @@ hl_behavior
doc_stats
#endif
-static GsfXMLInNode const gsf_opendoc_meta_dtd[] = {
- GSF_XML_IN_NODE_FULL (START, START, -1, NULL, FALSE, FALSE, TRUE, NULL, NULL, 0),
- GSF_XML_IN_NODE (START, META, OO_NS_OFFICE, "meta", FALSE, NULL, NULL),
+static GsfXMLInNode const gsf_opendoc_meta_st_dtd[] = {
+ GSF_XML_IN_NODE (META, META, OO_NS_OFFICE, "meta", FALSE, NULL, NULL),
/* OpenDocument TAGS */
GSF_XML_IN_NODE (META, META_GENERATOR, OO_NS_META, "generator", TRUE, NULL, &od_meta_generator),
GSF_XML_IN_NODE (META, META_TITLE, OO_NS_DC, "title", TRUE, NULL, &od_meta_title),
@@ -195,17 +194,80 @@ static GsfXMLInNode const gsf_opendoc_meta_dtd[] = {
GSF_XML_IN_NODE (META, META_CREATION_DATE, OO_NS_META, "creation-date", TRUE, NULL, &od_meta_date_created),
GSF_XML_IN_NODE (META, META_DATE_MOD, OO_NS_DC, "date", TRUE, NULL, &od_meta_date_modified),
GSF_XML_IN_NODE (META, META_PRINT_DATE, OO_NS_META, "print-date", TRUE, NULL, &od_meta_print_date),
-
GSF_XML_IN_NODE (META, META_TEMPLATE, OO_NS_META, "template", FALSE, NULL, NULL),
GSF_XML_IN_NODE (META, META_AUTO_RELOAD, OO_NS_META, "auto-reload", FALSE, NULL, NULL),
GSF_XML_IN_NODE (META, META_HL_BEHAVIOUR, OO_NS_META, "hyperlink-behaviour", FALSE, NULL, NULL),
GSF_XML_IN_NODE (META, META_DOCUMENT_STATS, OO_NS_META, "document-statistic", FALSE, NULL, NULL),
GSF_XML_IN_NODE (META, META_LANGUAGE, OO_NS_DC, "language", TRUE, NULL, &od_meta_language),
-
GSF_XML_IN_NODE (META, META_EDITING_CYCLES, OO_NS_META, "editing-cycles", TRUE, NULL, &od_meta_editing_cycles),
GSF_XML_IN_NODE (META, META_EDITING_DURATION, OO_NS_META, "editing-duration", TRUE, NULL, &od_meta_editing_duration),
+ GSF_XML_IN_NODE (META, META_USER_DEFINED, OO_NS_META, "user-defined", GSF_XML_CONTENT, &od_meta_user_defined, &od_meta_user_defined_end),
+ GSF_XML_IN_NODE_END
+};
+
+
+static void
+gsf_opendoc_metadata_subtree_free (G_GNUC_UNUSED GsfXMLIn *xin, gpointer old_state)
+{
+ GsfOOMetaIn *state = old_state;
+
+ if (state->keywords) {
+ GValue *val = g_new0 (GValue, 1);
+ g_value_init (val, GSF_DOCPROP_VECTOR_TYPE);
+ g_value_set_object (val, state->keywords);
+ gsf_doc_meta_data_insert (state->md,
+ g_strdup (GSF_META_NAME_KEYWORDS), val);
+ g_object_unref (state->keywords);
+ }
+
+ g_object_unref (G_OBJECT (state->md));
+ g_free (state);
+}
+
+static GsfXMLInDoc *doc_subtree = NULL;
+
+/**
+ * gsf_opendoc_metadata_subtree :
+ * @doc : #GsfXMLInDoc
+ * @md : #GsfDocMetaData
+ *
+ * Extend @xin so that it can parse a subtree in OpenDoc metadata format
+ **/
+void
+gsf_opendoc_metadata_subtree (GsfXMLIn *xin, GsfDocMetaData *md)
+{
+ GsfOOMetaIn *state = NULL;
+
+ g_return_if_fail (md != NULL);
+
+ if (NULL == doc_subtree)
+ doc_subtree = gsf_xml_in_doc_new (gsf_opendoc_meta_st_dtd, gsf_ooo_ns);
- GSF_XML_IN_NODE (META, META_USER_DEFINED, OO_NS_META, "user-defined", GSF_XML_CONTENT, &od_meta_user_defined, &od_meta_user_defined_end),
+ state = g_new0 (GsfOOMetaIn, 1);
+ state->md = md;
+ g_object_ref (G_OBJECT (md));
+ gsf_xml_in_push_state (xin, doc_subtree, state, gsf_opendoc_metadata_subtree_free, NULL);
+}
+
+/**
+ * gsf_opendoc_metadata_subtree_internal :
+ * @doc : #GsfXMLInDoc
+ *
+ * Extend @xin so that it can parse a subtree in OpenDoc metadata format
+ * The current user_state must be a GsfOOMetaIn!
+ **/
+static void
+gsf_opendoc_metadata_subtree_internal (GsfXMLIn *xin, G_GNUC_UNUSED xmlChar const **attrs)
+{
+ if (NULL == doc_subtree)
+ doc_subtree = gsf_xml_in_doc_new (gsf_opendoc_meta_st_dtd, gsf_ooo_ns);
+
+ gsf_xml_in_push_state (xin, doc_subtree, NULL, NULL, NULL);
+}
+
+static GsfXMLInNode const gsf_opendoc_meta_dtd[] = {
+ GSF_XML_IN_NODE_FULL (START, START, -1, NULL, FALSE, FALSE, TRUE, NULL, NULL, 0),
+ GSF_XML_IN_NODE (START, META, OO_NS_OFFICE, "meta", FALSE, &gsf_opendoc_metadata_subtree_internal, NULL),
GSF_XML_IN_NODE_END
};
@@ -246,26 +308,6 @@ gsf_opendoc_metadata_read (GsfInput *input, GsfDocMetaData *md)
return state.err;
}
-static void
-gsf_opendoc_metadata_subtree_free (GsfXMLIn *xin, G_GNUC_UNUSED gpointer old_state)
-{
- gsf_xml_in_doc_free (xin->user_state);
-}
-
-/**
- * gsf_opendoc_metadata_subtree :
- * @doc : #GsfXMLInDoc
- * @md : #GsfDocMetaData
- *
- * Extend @xin so that it can parse a subtree in OpenDoc metadata format
- **/
-void
-gsf_opendoc_metadata_subtree (GsfXMLIn *xin, GsfDocMetaData *md)
-{
- GsfXMLInDoc *doc = gsf_xml_in_doc_new (gsf_opendoc_meta_dtd+1, gsf_ooo_ns);
- gsf_xml_in_push_state (xin, doc, md, &gsf_opendoc_metadata_subtree_free,
- NULL);
-}
static char const *
od_map_prop_name (char const *name)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]