Movie Info Provider: Sending movie list
authorSimón Pena <spenap@gmail.com>
Sun, 16 May 2010 22:13:19 +0000 (00:13 +0200)
committerSimón Pena <spenap@gmail.com>
Mon, 17 May 2010 00:02:39 +0000 (02:02 +0200)
The "response-received" signal now carries a list containing
the results read from the web service.

src/mvs-minfo-provider.c
src/mvs-minfo-provider.h

index 9b22675..f98f47b 100644 (file)
@@ -21,6 +21,8 @@
 #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"
@@ -110,14 +112,14 @@ mvs_minfo_provider_class_init (MvsMInfoProviderClass *klass)
                                       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
@@ -133,35 +135,48 @@ mvs_minfo_provider_new (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,
@@ -176,20 +191,23 @@ parse_xml (const char *xml_data, goffset length)
         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) {
@@ -201,11 +219,11 @@ response_callback (SoupSession *session, SoupMessage *message,
                 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 *
@@ -240,7 +258,7 @@ mvs_minfo_provider_query (MvsMInfoProvider *self,
 
         if (message) {
                 soup_session_queue_message (session, message,
-                                response_callback, self);
+                                process_response, self);
                 message_queued = TRUE;
         }
 
index 2d0a3e1..896c0f2 100644 (file)
@@ -47,6 +47,9 @@ typedef struct {
 
 typedef struct {
         GObjectClass parent_class;
+
+        /*< private >*/
+        void (*response_callback) (MvsMInfoProvider *self, GList *list);
 } MvsMInfoProviderClass;
 
 GType mvs_minfo_provider_get_type (void);