[libgsf] odf: write meta data in key order.



commit 824b013bae2bed6be9e0d67ed13e8acc2bcca951
Author: Morten Welinder <terra gnome org>
Date:   Wed Nov 18 09:08:38 2009 -0500

    odf: write meta data in key order.

 ChangeLog               |    5 +++++
 NEWS                    |    1 +
 gsf/gsf-doc-meta-data.c |   39 ++++++++++++++++++++++++++++++++++++++-
 3 files changed, 44 insertions(+), 1 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index e62c0a9..d27acef 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2009-11-18  Morten Welinder  <terra gnome org>
+
+	* gsf/gsf-doc-meta-data.c (gsf_doc_meta_data_foreach): Sort the
+	key-value pairs.
+
 2009-11-17  Andreas J. Guelzow <aguelzow pyrshep ca>
 
 	* autogen.sh: allow dirs on PATH to have spaces withou causing warning
diff --git a/NEWS b/NEWS
index 07c773e..5bdc93f 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,7 @@ libgsf 1.14.17
 
 Morten:
 	* Fix xml parser crash.
+	* Write meta-data values in name order.
 
 --------------------------------------------------------------------------
 libgsf 1.14.16
diff --git a/gsf/gsf-doc-meta-data.c b/gsf/gsf-doc-meta-data.c
index 35a2a34..8331c9c 100644
--- a/gsf/gsf-doc-meta-data.c
+++ b/gsf/gsf-doc-meta-data.c
@@ -24,6 +24,8 @@
 #include <gsf/gsf-doc-meta-data.h>
 #include <gsf/gsf-docprop-vector.h>
 #include <gsf/gsf-impl-utils.h>
+#include <string.h>
+#include <stdlib.h>
 
 struct _GsfDocMetaData {
 	GObject	base;
@@ -167,6 +169,19 @@ gsf_doc_meta_data_store (GsfDocMetaData *meta, GsfDocProp *prop)
 	g_hash_table_replace (meta->table, prop->name, prop);
 }
 
+static void
+cb_collect_pairs (char *prop_name, GsfDocProp *prop, GPtrArray *pairs)
+{
+	g_ptr_array_add (pairs, prop_name);
+	g_ptr_array_add (pairs, prop);
+}
+
+static int
+deref_strcmp (const char **a, const char **b)
+{
+	return strcmp (*a, *b);
+}
+
 /**
  * gsf_doc_meta_data_foreach :
  * @meta : the collection
@@ -178,8 +193,30 @@ gsf_doc_meta_data_store (GsfDocMetaData *meta, GsfDocProp *prop)
 void
 gsf_doc_meta_data_foreach (GsfDocMetaData const *meta, GHFunc func, gpointer user_data)
 {
+	GPtrArray *pairs;
+	unsigned ui;
+
 	g_return_if_fail (IS_GSF_DOC_META_DATA (meta));
-	g_hash_table_foreach (meta->table, func, user_data);
+
+	if (g_hash_table_size (meta->table) == 0)
+		return;
+
+	/* Sort the pairs by property name in order to generate consistent
+	   files. */
+	pairs = g_ptr_array_new ();
+	g_hash_table_foreach (meta->table, (GHFunc)cb_collect_pairs, pairs);
+
+	qsort (&g_ptr_array_index (pairs, 0),
+	       pairs->len / 2,
+	       2 * sizeof (gpointer),
+	       (GCompareFunc)deref_strcmp);
+
+	for (ui = 0; ui < pairs->len; ui += 2)
+		func (g_ptr_array_index (pairs, ui),
+		      g_ptr_array_index (pairs, ui + 1),
+		      user_data);
+
+	g_ptr_array_free (pairs, TRUE);
 }
 
 /**



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]