Movie Info Provider: Added response-received signal
[maevies] / src / mvs-minfo-provider.c
index 98bb1f8..5e4289f 100644 (file)
 
 #include "mvs-minfo-provider.h"
 
+#define TMDB_API_KEY "249e1a42df9bee09fac5e92d3a51396b"
+#define TMDB_LANGUAGE "en"
+#define TMDB_FORMAT "xml"
+#define TMDB_METHOD "Movie.search"
+#define TMDB_BASE_URL "http://api.themoviedb.org/2.1/%s/%s/%s/%s/%s"
+
 G_DEFINE_TYPE (MvsMInfoProvider, mvs_minfo_provider, G_TYPE_OBJECT)
 
 enum {
         PROP_0,
-        PROP_QUERY,
+        PROP_FORMAT,
 };
 
 #define GET_PRIVATE(o) \
   (G_TYPE_INSTANCE_GET_PRIVATE ((o), MVS_TYPE_MINFO_PROVIDER, MvsMInfoProviderPrivate))
 
 struct _MvsMInfoProviderPrivate {
-        gchar *query;
+        gchar *format;
 };
 
+enum {
+        RESPONSE_RECEIVED,
+        LAST_SIGNAL
+};
+
+static guint
+signals[LAST_SIGNAL] = { 0 };
+
+
 static void
 mvs_minfo_provider_get_property (GObject *object, guint property_id,
                          GValue *value, GParamSpec *pspec)
@@ -39,9 +54,9 @@ mvs_minfo_provider_get_property (GObject *object, guint property_id,
         MvsMInfoProvider *self = MVS_MINFO_PROVIDER (object);
 
         switch (property_id) {
-        /*case PROP_QUERY:
-                g_value_set_string (value, self->priv->query);
-                break;*/
+        case PROP_FORMAT:
+                g_value_set_string (value, self->priv->format);
+                break;
         default:
                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
         }
@@ -54,6 +69,10 @@ mvs_minfo_provider_set_property (GObject *object, guint property_id,
         MvsMInfoProvider *self = MVS_MINFO_PROVIDER (object);
 
         switch (property_id) {
+        case PROP_FORMAT:
+                mvs_minfo_provider_set_format (self,
+                                g_value_get_string (value));
+                break;
         default:
                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
         }
@@ -63,7 +82,8 @@ static void
 mvs_minfo_provider_finalize (GObject *object)
 {
         MvsMInfoProvider *self = MVS_MINFO_PROVIDER (object);
-        g_free (self->priv->query);
+
+        g_free (self->priv->format);
 
         G_OBJECT_CLASS (mvs_minfo_provider_parent_class)->finalize (object);
 }
@@ -79,19 +99,28 @@ mvs_minfo_provider_class_init (MvsMInfoProviderClass *klass)
         object_class->set_property = mvs_minfo_provider_set_property;
         object_class->finalize = mvs_minfo_provider_finalize;
 
-        /* g_object_class_install_property
-                (object_class, PROP_QUERY,
-                 g_param_spec_string ("query", "The query", "The query",
-                                      NULL,
+        g_object_class_install_property
+                (object_class, PROP_FORMAT,
+                 g_param_spec_string ("format", "The format", "The format",
+                                      TMDB_FORMAT,
                                       G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
-                                      */
+
+        signals[RESPONSE_RECEIVED] = g_signal_new ("response-received", MVS_TYPE_MINFO_PROVIDER,
+                        G_SIGNAL_RUN_LAST,
+                        0,
+                        NULL,
+                        NULL,
+                        g_cclosure_marshal_VOID__VOID,
+                        G_TYPE_NONE,
+                        0,
+                        NULL);
 }
 
 static void
 mvs_minfo_provider_init (MvsMInfoProvider *self)
 {
         self->priv = GET_PRIVATE (self);
-        self->priv->query = NULL;
+        self->priv->format = NULL;
 }
 
 MvsMInfoProvider*
@@ -100,9 +129,80 @@ mvs_minfo_provider_new (void)
         return g_object_new (MVS_TYPE_MINFO_PROVIDER, NULL);
 }
 
+static void
+parse_response (SoupSession *session, SoupMessage *message,
+                    gpointer user_data)
+{
+        MvsMInfoProvider *self = MVS_MINFO_PROVIDER (user_data);
+        const gchar *mime = NULL;
+
+        if (!SOUP_STATUS_IS_SUCCESSFUL (message->status_code) ||
+                        message->response_body->length <= 0) {
+
+                g_print ("%s\n", message->reason_phrase);
+        }
+        else {
+
+                mime = soup_message_headers_get_content_type
+                                (message->response_headers, NULL);
+
+                g_print ("Response OK. Mime type: %s\n", mime);
+                g_print ("Content:\n%s\n", message->response_body->data);
+        }
+
+        g_signal_emit (self, signals[RESPONSE_RECEIVED], 0);
+}
+
+static gchar *
+get_query_uri (MvsMInfoProvider *self, const char *query)
+{
+        /* METHOD/LANGUAGE/FORMAT/APIKEY/MOVIENAME */
+        gchar *uri = g_strdup_printf (TMDB_BASE_URL, TMDB_METHOD,
+                        TMDB_LANGUAGE,
+                        self->priv->format,
+                        TMDB_API_KEY,
+                        query);
+
+        return uri;
+}
+
 gboolean
 mvs_minfo_provider_query (MvsMInfoProvider *self,
                           const gchar *query)
 {
-        return FALSE;
+        g_return_val_if_fail (MVS_IS_MINFO_PROVIDER (self), FALSE);
+
+        SoupSession *session = NULL;
+        SoupMessage *message = NULL;
+        gboolean message_queued = FALSE;
+
+        gchar *uri = get_query_uri (self, query);
+
+        g_return_val_if_fail (uri, FALSE);
+
+        session = soup_session_async_new ();
+        message = soup_message_new ("GET", uri);
+
+        if (message) {
+                soup_session_queue_message (session, message,
+                                parse_response, self);
+                message_queued = TRUE;
+        }
+
+        g_free (uri);
+
+        return message_queued;
+}
+
+gboolean
+mvs_minfo_provider_set_format (MvsMInfoProvider *self,
+                               const gchar *format)
+{
+        g_return_val_if_fail (MVS_IS_MINFO_PROVIDER (self), FALSE);
+
+        g_free (self->priv->format);
+
+        self->priv->format = g_strdup (format);
+
+        return TRUE;
 }