[libgsf] odf: write meta data in key order.
- From: Morten Welinder <mortenw src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [libgsf] odf: write meta data in key order.
- Date: Wed, 18 Nov 2009 14:08:59 +0000 (UTC)
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]