#include <libxml/parser.h>
#include <libxml/xpath.h>
+#include "mvs-tmdb-movie.h"
+
#define TMDB_API_KEY "249e1a42df9bee09fac5e92d3a51396b"
#define TMDB_LANGUAGE "en"
#define TMDB_FORMAT "xml"
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
signals[RESPONSE_RECEIVED] = g_signal_new ("response-received", MVS_TYPE_MINFO_PROVIDER,
- G_SIGNAL_RUN_LAST,
- 0,
+ G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
+ G_STRUCT_OFFSET (MvsMInfoProviderClass, response_callback),
NULL,
NULL,
- g_cclosure_marshal_VOID__VOID,
+ g_cclosure_marshal_VOID__POINTER,
G_TYPE_NONE,
- 0,
- NULL);
+ 1,
+ G_TYPE_POINTER);
}
static void
return g_object_new (MVS_TYPE_MINFO_PROVIDER, NULL);
}
-static void
-display_movie_info (xmlNodePtr node)
+static MvsTmdbMovie*
+generate_movie_info (xmlNodePtr node)
{
xmlNodePtr cur_node = NULL;
+ MvsTmdbMovie *movie_info = mvs_tmdb_movie_new ();
for (cur_node = node; cur_node; cur_node = cur_node->next) {
if (cur_node->type == XML_ELEMENT_NODE) {
gchar *value = xmlNodeGetContent (cur_node);
- g_print ("[%s] = %s\n", cur_node->name, value);
+
+ g_object_set (movie_info, cur_node->name, value, NULL);
}
}
+ return movie_info;
}
-static void
-iterate_list (xmlNodeSetPtr node_set)
+static GList*
+generate_list (xmlNodeSetPtr node_set)
{
int i = 0;
+ GList *list = NULL;
for (i = 0; i < node_set->nodeNr; i++) {
xmlNodePtr node = node_set->nodeTab[i];
if (node->type == XML_ELEMENT_NODE) {
- display_movie_info (node->children);
+ MvsTmdbMovie *movie_info =
+ generate_movie_info (node->children);
+ if (movie_info)
+ list = g_list_prepend (list, movie_info);
}
}
+
+ if (list)
+ list = g_list_reverse (list);
+
+ return list;
}
-static void
+static GList*
parse_xml (const char *xml_data, goffset length)
{
+ GList *list = NULL;
xmlDocPtr document = xmlReadMemory (xml_data, length,
NULL,
NULL,
xmlNodeSetPtr nodeset = xpath_obj->nodesetval;
if (nodeset->nodeNr > 0) {
- iterate_list (nodeset);
+ list = generate_list (nodeset);
}
xmlXPathFreeNodeSetList (xpath_obj);
xmlXPathFreeContext (context_ptr);
xmlFreeDoc (document);
+
+ return list;
}
static void
-response_callback (SoupSession *session, SoupMessage *message,
+process_response (SoupSession *session, SoupMessage *message,
gpointer user_data)
{
MvsMInfoProvider *self = MVS_MINFO_PROVIDER (user_data);
const gchar *mime = NULL;
+ GList *list = NULL;
if (!SOUP_STATUS_IS_SUCCESSFUL (message->status_code) ||
message->response_body->length <= 0) {
mime = soup_message_headers_get_content_type
(message->response_headers, NULL);
- parse_xml (message->response_body->data,
- message->response_body->length);
+ list = parse_xml (message->response_body->data,
+ message->response_body->length);
}
- g_signal_emit (self, signals[RESPONSE_RECEIVED], 0);
+ g_signal_emit (self, signals[RESPONSE_RECEIVED], 0, list);
}
static gchar *
if (message) {
soup_session_queue_message (session, message,
- response_callback, self);
+ process_response, self);
message_queued = TRUE;
}