From 1fd17793c2ba64b1aedb8fec1a168064f0a5365c Mon Sep 17 00:00:00 2001 From: Cosimo Cecchi Date: Mon, 30 Jun 2008 22:06:41 +0200 Subject: [PATCH] Refactor a bit the serialize funcs and implement hit_collection_serialize (). --- src/mm-string-utils.c | 116 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 87 insertions(+), 29 deletions(-) diff --git a/src/mm-string-utils.c b/src/mm-string-utils.c index bd16a8c..c8d7c30 100644 --- a/src/mm-string-utils.c +++ b/src/mm-string-utils.c @@ -25,6 +25,7 @@ #include #include "mm-string-utils.h" #include "mm-utils.h" +#include "mm-hit.h" typedef struct { MMComparisionOperator op; @@ -41,8 +42,8 @@ static OperatorGrid operator_grid[] = { MM_COMP_NONE, "" } }; -static xmlChar * -value_to_string (GValue *v) +static void +serialize_value (xmlTextWriterPtr writer, GValue *v) { xmlChar *safe; char *ret = NULL; @@ -77,39 +78,40 @@ value_to_string (GValue *v) ret = g_strdup_printf ("%c", g_value_get_uchar (v)); } else { g_warning ("Can't convert the value to string: unhandled type"); - return NULL; + return; } safe = xmlCharStrdup (ret); g_free (ret); - return safe; + + xmlTextWriterWriteElement (writer, BAD_CAST ("value"), safe); + g_free (safe); } -static xmlChar * -op_to_string (MMComparisionOperator op) +static void +serialize_op (xmlTextWriterPtr writer, MMComparisionOperator op) { int idx; + xmlChar *str = NULL; for (idx = 0; idx < G_N_ELEMENTS (operator_grid); idx++) { if (op == operator_grid[idx].op) { - return xmlCharStrdup (operator_grid[idx].string); + str = xmlCharStrdup (operator_grid[idx].string); } } - return NULL; + if (str) { + xmlTextWriterWriteElement (writer, BAD_CAST ("op"), str); + g_free (str); + } } static void -add_filter_param_to_xml (MMFilterParam *fp, - xmlTextWriterPtr writer) +serialize_attribute (xmlTextWriterPtr writer, + MMAttribute *attribute) { - MMAttribute *attribute; xmlChar *safe_str; - attribute = mm_filter_param_get_attribute (fp); - - xmlTextWriterStartElement (writer, BAD_CAST ("filter-param")); - xmlTextWriterStartElement (writer, BAD_CAST ("attribute")); safe_str = xmlCharStrdup (mm_attribute_get_id (attribute)); xmlTextWriterWriteAttribute (writer, BAD_CAST ("id"), safe_str); @@ -123,15 +125,26 @@ add_filter_param_to_xml (MMFilterParam *fp, xmlTextWriterWriteAttribute (writer, BAD_CAST ("type"), BAD_CAST (g_type_name (mm_attribute_get_value_type (attribute)))); /* close "attribute" */ xmlTextWriterEndElement (writer); +} - safe_str = value_to_string (mm_filter_param_get_value (fp)); - xmlTextWriterWriteElement (writer, BAD_CAST ("value"), safe_str); - g_free (safe_str); +static void +add_filter_param_to_xml (MMFilterParam *fp, + xmlTextWriterPtr writer) +{ + MMAttribute *attribute; + GValue *val; + MMComparisionOperator op; + + attribute = mm_filter_param_get_attribute (fp); + val = mm_filter_param_get_value (fp); + op = mm_filter_param_get_operator (fp); + + xmlTextWriterStartElement (writer, BAD_CAST ("filter-param")); + + serialize_attribute (writer, attribute); + serialize_value (writer, val); + serialize_op (writer, op); - safe_str = op_to_string (mm_filter_param_get_operator (fp)); - xmlTextWriterWriteElement (writer, BAD_CAST ("op"), safe_str); - g_free (safe_str); - /* close "filter-param" */ xmlTextWriterEndElement (writer); } @@ -335,6 +348,22 @@ unserialize_filter_param (xmlTextReaderPtr reader) return fp; } +static void +serialize_pair (gpointer _attr, + gpointer _val, + gpointer _writer) +{ + MMAttribute *attr = _attr; + GValue *val = _val; + xmlTextWriterPtr writer = _writer; + + xmlTextWriterStartElement (writer, BAD_CAST ("pair")); + serialize_attribute (writer, attr); + serialize_value (writer, val); + /* end "pair" */ + xmlTextWriterEndElement (writer); +} + /* public functions */ char * mm_filter_serialize (MMFilter *filter) @@ -364,6 +393,42 @@ mm_filter_serialize (MMFilter *filter) return serialized; } +char * +mm_hit_collection_serialize (MMHitCollection *hc) +{ + char *serialized; + xmlBufferPtr buffer; + xmlTextWriterPtr writer; + MMHit *hit; + GHashTable *attrs_and_values; + + buffer = xmlBufferCreate (); + writer = xmlNewTextWriterMemory (buffer, 0); + + xmlTextWriterStartDocument (writer, NULL, NULL, NULL); + + xmlTextWriterStartElement (writer, BAD_CAST ("hit-collection")); + while ((hit = mm_hit_collection_get_next_hit (hc)) != NULL) { + xmlTextWriterStartElement (writer, BAD_CAST ("hit")); + attrs_and_values = mm_hit_get_all_values (hit); + g_hash_table_foreach (attrs_and_values, + (GHFunc) serialize_pair, + writer); + /* close "hit" */ + xmlTextWriterEndElement (writer); + } + + /* close "hit-collection" */ + xmlTextWriterEndElement (writer); + xmlTextWriterEndDocument (writer); + + xmlFreeTextWriter (writer); + serialized = g_strdup ((char *) xmlBufferContent (buffer)); + xmlBufferFree (buffer); + + return serialized; +} + MMFilter * mm_filter_unserialize (const char *s) { @@ -405,13 +470,6 @@ mm_filter_unserialize (const char *s) return f; } -char * -mm_hit_collection_serialize (MMHitCollection *hc) -{ - /* TODO: implement */ - return NULL; -} - MMHitCollection * mm_hit_collection_unserialize (const char *s) { -- 2.11.4.GIT