aboutsummaryrefslogtreecommitdiff
path: root/lib/experiment-reader/experiment-reader.c
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2012-06-17 14:56:31 +0200
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2012-06-17 14:56:31 +0200
commitd4dfc2f4546a837824b872ad05b67531a795bd8d (patch)
tree21930f78036e499ee19a3dcdbd57d6b8beb68374 /lib/experiment-reader/experiment-reader.c
parent9e6187887614ce39a0b0d34fa2b7cebd07a08e7e (diff)
downloadgtk-vlc-player-d4dfc2f4546a837824b872ad05b67531a795bd8d.tar.gz
extended libexperiment-reader API: pass topic end times to callback
Diffstat (limited to 'lib/experiment-reader/experiment-reader.c')
-rw-r--r--lib/experiment-reader/experiment-reader.c39
1 files changed, 34 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);
}