diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-05-11 12:42:15 +0200 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-05-11 14:43:25 +0200 |
commit | 1158b01c310b4fc0bad169cabe94778e6f6f27f3 (patch) | |
tree | d23f48cdf6f05d5c9e3476f0b52e6c18bb3c951b /lib | |
parent | 021c5ac6eceaeaf4e28d8278722a195a06afca65 (diff) | |
download | experiment-player-1158b01c310b4fc0bad169cabe94778e6f6f27f3.tar.gz |
implemented libexperiment-reader functions that will be required by gtk-experiment-navigator
Diffstat (limited to 'lib')
-rw-r--r-- | lib/experiment-reader/experiment-reader.c | 152 | ||||
-rw-r--r-- | lib/experiment-reader/experiment-reader.h | 25 |
2 files changed, 171 insertions, 6 deletions
diff --git a/lib/experiment-reader/experiment-reader.c b/lib/experiment-reader/experiment-reader.c index fc22378..d651c54 100644 --- a/lib/experiment-reader/experiment-reader.c +++ b/lib/experiment-reader/experiment-reader.c @@ -18,6 +18,11 @@ static void experiment_reader_class_init(ExperimentReaderClass *klass); static void experiment_reader_init(ExperimentReader *klass); static void experiment_reader_finalize(GObject *gobject); +static gint64 get_timepoint_by_ref(xmlDoc *doc, xmlChar *ref); +static gboolean generic_foreach_topic(xmlDoc *doc, xmlNodeSet *nodes, + ExperimentReaderTopicCallback callback, + gpointer data); + #define EXPERIMENT_READER_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), EXPERIMENT_TYPE_READER, ExperimentReaderPrivate)) @@ -81,6 +86,66 @@ experiment_reader_finalize(GObject *gobject) //G_OBJECT_CLASS(experiment_reader_parent_class)->finalize(gobject); } +static gint64 +get_timepoint_by_ref(xmlDoc *doc, xmlChar *ref) +{ + xmlChar expr[255]; + + xmlXPathContext *xpathCtx; + xmlXPathObject *xpathObj; + + double value; + + xpathCtx = xmlXPathNewContext(doc); + assert(xpathCtx != NULL); + + xmlStrPrintf(expr, sizeof(expr), + (const xmlChar *)"/session/timeline/" + "timepoint[@timepoint-id = '%s']/" + "@absolute-time", ref); + + xpathObj = xmlXPathEvalExpression(expr, xpathCtx); + assert(xpathObj != NULL); + + value = xmlXPathCastToNumber(xpathObj); + + xmlXPathFreeObject(xpathObj); + xmlXPathFreeContext(xpathCtx); + + return (gint64)(value*1000.); +} + +static gboolean +generic_foreach_topic(xmlDoc *doc, xmlNodeSet *nodes, + ExperimentReaderTopicCallback callback, gpointer data) +{ + if (nodes == NULL) + return TRUE; + + for (int i = 0; i < nodes->nodeNr; i++) { + xmlNode *cur = nodes->nodeTab[i]; + xmlNode *contrib = cur->children; + assert(cur != NULL && cur->type == XML_ELEMENT_NODE); + + xmlChar *topic_id = xmlGetProp(cur, (const xmlChar *)"id"); + gint64 start_time = -1; + + if (contrib != NULL) { + xmlChar *contrib_start_ref; + + contrib_start_ref = xmlGetProp(contrib, (const xmlChar *)"start-reference"); + start_time = get_timepoint_by_ref(doc, contrib_start_ref); + xmlFree(contrib_start_ref); + } + + callback((const gchar *)topic_id, start_time, data); + + xmlFree(topic_id); + } + + return FALSE; +} + /* * API */ @@ -102,12 +167,89 @@ experiment_reader_new(const gchar *filename) return reader; } -#if 0 void -experiment_reader_greeting_foreach_topic(ExperimentReader *reader, - ExperimentReaderTopicCb cb, +experiment_reader_foreach_greeting_topic(ExperimentReader *reader, + ExperimentReaderTopicCallback callback, + gpointer data) +{ + xmlXPathContext *xpathCtx; + xmlXPathObject *xpathObj; + + xpathCtx = xmlXPathNewContext(reader->priv->doc); + xpathObj = xmlXPathEvalExpression((const xmlChar *)"/session/greeting/topic", + xpathCtx); + + generic_foreach_topic(reader->priv->doc, xpathObj->nodesetval, + callback, data); + + xmlXPathFreeObject(xpathObj); + xmlXPathFreeContext(xpathCtx); +} + +void +experiment_reader_foreach_exp_initial_narrative_topic(reader, callback, data) + ExperimentReader *reader; + ExperimentReaderTopicCallback callback; + gpointer data; +{ + xmlXPathContext *xpathCtx; + xmlXPathObject *xpathObj; + + xpathCtx = xmlXPathNewContext(reader->priv->doc); + xpathObj = xmlXPathEvalExpression((const xmlChar *)"/session/experiment/" + "initial-narrative/topic", + xpathCtx); + + generic_foreach_topic(reader->priv->doc, xpathObj->nodesetval, + callback, data); + + xmlXPathFreeObject(xpathObj); + xmlXPathFreeContext(xpathCtx); +} + +void +experiment_reader_foreach_exp_last_minute_phase_topic(reader, phase, callback, data) + ExperimentReader *reader; + gint phase; + ExperimentReaderTopicCallback callback; + gpointer data; +{ + xmlXPathContext *xpathCtx; + xmlXPathObject *xpathObj; + + xmlChar expr[255]; + + xpathCtx = xmlXPathNewContext(reader->priv->doc); + + /* Evaluate xpath expression */ + xmlStrPrintf(expr, sizeof(expr), + (const xmlChar *)"/session/experiment/last-minute/" + "phase[%d]/topic", + phase); + xpathObj = xmlXPathEvalExpression(expr, xpathCtx); + + generic_foreach_topic(reader->priv->doc, xpathObj->nodesetval, + callback, data); + + xmlXPathFreeObject(xpathObj); + xmlXPathFreeContext(xpathCtx); +} + +void +experiment_reader_foreach_farewell_topic(ExperimentReader *reader, + ExperimentReaderTopicCallback callback, gpointer data) { - + xmlXPathContext *xpathCtx; + xmlXPathObject *xpathObj; + + xpathCtx = xmlXPathNewContext(reader->priv->doc); + xpathObj = xmlXPathEvalExpression((const xmlChar *)"/session/farewell/topic", + xpathCtx); + + generic_foreach_topic(reader->priv->doc, xpathObj->nodesetval, + callback, data); + + xmlXPathFreeObject(xpathObj); + xmlXPathFreeContext(xpathCtx); } -#endif
\ No newline at end of file diff --git a/lib/experiment-reader/experiment-reader.h b/lib/experiment-reader/experiment-reader.h index 2558799..6a0cc85 100644 --- a/lib/experiment-reader/experiment-reader.h +++ b/lib/experiment-reader/experiment-reader.h @@ -34,11 +34,34 @@ typedef struct _ExperimentReaderClass { GType experiment_reader_get_type(void); /* + * Callbacks + */ +typedef void (*ExperimentReaderTopicCallback)(const gchar *topic_id, + gint64 start_time, + gpointer data); + +/* * API */ ExperimentReader *experiment_reader_new(const gchar *filename); - +void experiment_reader_foreach_greeting_topic( + ExperimentReader *reader, + ExperimentReaderTopicCallback callback, + gpointer data); +void experiment_reader_foreach_exp_initial_narrative_topic( + ExperimentReader *reader, + ExperimentReaderTopicCallback callback, + gpointer data); +void experiment_reader_foreach_exp_last_minute_phase_topic( + ExperimentReader *reader, + gint phase, + ExperimentReaderTopicCallback callback, + gpointer data); +void experiment_reader_foreach_farewell_topic( + ExperimentReader *reader, + ExperimentReaderTopicCallback callback, + gpointer data); G_END_DECLS |