aboutsummaryrefslogtreecommitdiff
path: root/lib/experiment-reader
diff options
context:
space:
mode:
Diffstat (limited to 'lib/experiment-reader')
-rw-r--r--lib/experiment-reader/experiment-reader.c39
-rw-r--r--lib/experiment-reader/experiment-reader.h2
-rw-r--r--lib/experiment-reader/tests/unit-tests.c2
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();