diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-06-17 14:56:31 +0200 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-06-17 14:56:31 +0200 |
commit | d4dfc2f4546a837824b872ad05b67531a795bd8d (patch) | |
tree | 21930f78036e499ee19a3dcdbd57d6b8beb68374 /lib/experiment-reader | |
parent | 9e6187887614ce39a0b0d34fa2b7cebd07a08e7e (diff) | |
download | experiment-player-d4dfc2f4546a837824b872ad05b67531a795bd8d.tar.gz |
extended libexperiment-reader API: pass topic end times to callback
Diffstat (limited to 'lib/experiment-reader')
-rw-r--r-- | lib/experiment-reader/experiment-reader.c | 39 | ||||
-rw-r--r-- | lib/experiment-reader/experiment-reader.h | 2 | ||||
-rw-r--r-- | lib/experiment-reader/tests/unit-tests.c | 2 |
3 files changed, 38 insertions, 5 deletions
diff --git a/lib/experiment-reader/experiment-reader.c b/lib/experiment-reader/experiment-reader.c index 9f00e7e..aca1d97 100644 --- a/lib/experiment-reader/experiment-reader.c +++ b/lib/experiment-reader/experiment-reader.c @@ -44,6 +44,8 @@ static void experiment_reader_finalize(GObject *gobject); static gint64 get_timepoint_by_ref(xmlDoc *doc, xmlChar *ref); static xmlNode *get_first_element(xmlNode *children, const gchar *name); +static xmlNode *get_last_element(xmlNode *children, const gchar *name); + static gboolean generic_foreach_topic(ExperimentReader *reader, xmlNodeSet *nodes, ExperimentReaderTopicCallback callback, gpointer data); @@ -146,6 +148,19 @@ get_first_element(xmlNode *children, const gchar *name) return NULL; } +static xmlNode * +get_last_element(xmlNode *children, const gchar *name) +{ + xmlNode *ret = NULL; + + for (xmlNode *cur = children; cur != NULL; cur = cur->next) + if (cur->type == XML_ELEMENT_NODE && + !g_strcmp0((const gchar *)cur->name, name)) + ret = cur; + + return ret; +} + static gboolean generic_foreach_topic(ExperimentReader *reader, xmlNodeSet *nodes, ExperimentReaderTopicCallback callback, gpointer data) @@ -155,24 +170,38 @@ generic_foreach_topic(ExperimentReader *reader, xmlNodeSet *nodes, for (int i = 0; i < nodes->nodeNr; i++) { xmlNode *cur = nodes->nodeTab[i]; - xmlNode *contrib = get_first_element(cur->children, - "contribution"); assert(cur != NULL && cur->type == XML_ELEMENT_NODE); + xmlNode *first_contrib = get_first_element(cur->children, + "contribution"); + xmlNode *last_contrib = get_last_element(cur->children, + "contribution"); + xmlChar *topic_id = xmlGetProp(cur, XML_CHAR("id")); gint64 start_time = -1; + gint64 end_time = -1; - if (contrib != NULL) { + if (first_contrib != NULL) { xmlChar *contrib_start_ref; - contrib_start_ref = xmlGetProp(contrib, + contrib_start_ref = xmlGetProp(first_contrib, XML_CHAR("start-reference")); start_time = get_timepoint_by_ref(reader->priv->doc, contrib_start_ref); xmlFree(contrib_start_ref); } + if (last_contrib != NULL) { + xmlChar *contrib_end_ref; + + contrib_end_ref = xmlGetProp(last_contrib, + XML_CHAR("end-reference")); + end_time = get_timepoint_by_ref(reader->priv->doc, + contrib_end_ref); + xmlFree(contrib_end_ref); + } - callback(reader, (const gchar *)topic_id, start_time, data); + callback(reader, (const gchar *)topic_id, + start_time, end_time, data); xmlFree(topic_id); } diff --git a/lib/experiment-reader/experiment-reader.h b/lib/experiment-reader/experiment-reader.h index 13492bf..6df8b77 100644 --- a/lib/experiment-reader/experiment-reader.h +++ b/lib/experiment-reader/experiment-reader.h @@ -78,12 +78,14 @@ GType experiment_reader_get_type(void); * @param reader \e ExperimentReader the information refers to * @param topic_id Symbolic identifier of experiment \b topic * @param start_time Beginning of first \b contribution in \e topic (milliseconds) + * @param end_time End of last \b contribution in \e topic (milliseconds) * @param data Callback user data */ /** @todo Perhaps we should use CClosures */ typedef void (*ExperimentReaderTopicCallback)(ExperimentReader *reader, const gchar *topic_id, gint64 start_time, + gint64 end_time, gpointer data); /** diff --git a/lib/experiment-reader/tests/unit-tests.c b/lib/experiment-reader/tests/unit-tests.c index 17c9f94..4c51a31 100644 --- a/lib/experiment-reader/tests/unit-tests.c +++ b/lib/experiment-reader/tests/unit-tests.c @@ -49,6 +49,7 @@ static void test_foreach_greeting_topic_values_cb(ExperimentReader *reader, const gchar *topic_id, gint64 start_time, + gint64 end_time, gpointer data) { gint *i = (gint *)data; @@ -60,6 +61,7 @@ test_foreach_greeting_topic_values_cb(ExperimentReader *reader, case 0: g_assert_cmpstr(topic_id, ==, "bz_2"); g_assert_cmpint(start_time, ==, 13648); + g_assert_cmpint(end_time, ==, 36908); break; default: g_assert_not_reached(); |