[frogr] Added API to FspSession to get the location for a picture.



commit 6ca319d605db05fb0ee44508eeb589d8095a576f
Author: Mario Sanchez Prada <msanchez igalia com>
Date:   Mon Apr 9 01:40:10 2012 +0200

    Added API to FspSession to get the location for a picture.
    
    At the moment, useful for testing purposes only.

 src/flicksoup/fsp-error.c   |   17 ++++++++
 src/flicksoup/fsp-error.h   |    4 +-
 src/flicksoup/fsp-parser.c  |   94 +++++++++++++++++++++++++++++++++++++++++--
 src/flicksoup/fsp-parser.h  |    6 +++
 src/flicksoup/fsp-session.c |   65 +++++++++++++++++++++++++++++
 src/flicksoup/fsp-session.h |   12 +++++
 6 files changed, 193 insertions(+), 5 deletions(-)
---
diff --git a/src/flicksoup/fsp-error.c b/src/flicksoup/fsp-error.c
index 5fb7e00..2efec74 100644
--- a/src/flicksoup/fsp-error.c
+++ b/src/flicksoup/fsp-error.c
@@ -141,6 +141,19 @@ static const FspError set_location_translations [N_SPECIFIC_ERRORS] = {
   FSP_ERROR_UNKNOWN,                    /* 9 */
 };
 
+static const FspError get_location_translations [N_SPECIFIC_ERRORS] = {
+  FSP_ERROR_UNKNOWN,                    /* 0 */
+  FSP_ERROR_PHOTO_NOT_FOUND,            /* 1 */
+  FSP_ERROR_LOCATION_NO_INFO,           /* 2 */
+  FSP_ERROR_UNKNOWN,                    /* 3 */
+  FSP_ERROR_UNKNOWN,                    /* 4 */
+  FSP_ERROR_UNKNOWN,                    /* 5 */
+  FSP_ERROR_UNKNOWN,                    /* 6 */
+  FSP_ERROR_UNKNOWN,                    /* 7 */
+  FSP_ERROR_UNKNOWN,                    /* 8 */
+  FSP_ERROR_UNKNOWN,                    /* 9 */
+};
+
 static const FspError general_translations [N_GENERAL_ERRORS] = {
   FSP_ERROR_UNKNOWN,                    /* 10 */
   FSP_ERROR_UNKNOWN,                    /* 11 */
@@ -309,6 +322,10 @@ fsp_error_get_from_response_code        (FspErrorMethod method, gint code)
           retval = set_location_translations[code];
           break;
 
+        case FSP_ERROR_METHOD_GET_LOCATION:
+          retval = get_location_translations[code];
+          break;
+
         default:
           retval = FSP_ERROR_UNKNOWN;
         }
diff --git a/src/flicksoup/fsp-error.h b/src/flicksoup/fsp-error.h
index a11a2f2..07b0733 100644
--- a/src/flicksoup/fsp-error.h
+++ b/src/flicksoup/fsp-error.h
@@ -67,6 +67,7 @@ typedef enum {
   FSP_ERROR_LOCATION_INVALID_LATITUDE,
   FSP_ERROR_LOCATION_INVALID_LONGITUDE,
   FSP_ERROR_LOCATION_INVALID_ACCURACY,
+  FSP_ERROR_LOCATION_NO_INFO,
 
   FSP_ERROR_USER_NOT_FOUND,
 
@@ -101,7 +102,8 @@ typedef enum {
   FSP_ERROR_METHOD_GROUP_ADD_PHOTO,
   FSP_ERROR_METHOD_TAG_GET_LIST,
   FSP_ERROR_METHOD_SET_LICENSE,
-  FSP_ERROR_METHOD_SET_LOCATION
+  FSP_ERROR_METHOD_SET_LOCATION,
+  FSP_ERROR_METHOD_GET_LOCATION
 } FspErrorMethod;
 
 FspError
diff --git a/src/flicksoup/fsp-parser.c b/src/flicksoup/fsp-parser.c
index f391eb2..b461593 100644
--- a/src/flicksoup/fsp-parser.c
+++ b/src/flicksoup/fsp-parser.c
@@ -104,8 +104,11 @@ static gpointer
 _set_license_parser                     (xmlDoc  *doc,
                                          GError **error);
 static gpointer
-_set_location_parser                     (xmlDoc  *doc,
-                                          GError **error);
+_set_location_parser                    (xmlDoc  *doc,
+                                         GError **error);
+static gpointer
+_get_location_parser                    (xmlDoc  *doc,
+                                         GError **error);
 
 static FspDataPhotoInfo *
 _get_photo_info_from_node               (xmlNode *node);
@@ -293,6 +296,8 @@ _get_error_method_from_parser           (gpointer (*body_parser)
     error_method = FSP_ERROR_METHOD_SET_LICENSE;
   else if (body_parser == _set_location_parser)
     error_method = FSP_ERROR_METHOD_SET_LOCATION;
+  else if (body_parser == _get_location_parser)
+    error_method = FSP_ERROR_METHOD_GET_LOCATION;
 
   return error_method;
 }
@@ -875,13 +880,75 @@ _set_license_parser                     (xmlDoc  *doc,
 }
 
 static gpointer
-_set_location_parser                     (xmlDoc  *doc,
+_set_location_parser                    (xmlDoc  *doc,
                                          GError **error)
 {
   /* Dummy parser, as there is no response for this method */
   return NULL;
 }
 
+static gpointer
+_get_location_parser                    (xmlDoc  *doc,
+                                         GError **error)
+{
+  xmlXPathContext *xpathCtx = NULL;
+  xmlXPathObject * xpathObj = NULL;
+  FspDataLocation *location = NULL;
+  GError *err = NULL;
+
+  g_return_val_if_fail (doc != NULL, NULL);
+
+  xpathCtx = xmlXPathNewContext (doc);
+  xpathObj = xmlXPathEvalExpression ((xmlChar *)"/rsp/photo/location", xpathCtx);
+
+  if ((xpathObj != NULL) && (xpathObj->nodesetval->nodeNr > 0))
+    {
+      /* Matching nodes found */
+      xmlNode *node = NULL;
+
+      location = FSP_DATA_LOCATION (fsp_data_new (FSP_LOCATION));
+      node = xpathObj->nodesetval->nodeTab[0];
+      if (node && !g_strcmp0 ((gchar *) node->name, "location"))
+        {
+          xmlChar *value = NULL;
+
+          value = xmlGetProp (node, (const xmlChar *) "latitude");
+          location->latitude = g_ascii_strtod ((gchar *) value, NULL);
+          xmlFree (value);
+
+          value = xmlGetProp (node, (const xmlChar *) "longitude");
+          location->longitude = g_ascii_strtod ((gchar *) value, NULL);
+          xmlFree (value);
+
+          value = xmlGetProp (node, (const xmlChar *) "accuracy");
+          location->accuracy = (gushort) g_ascii_strtoll ((gchar *) value, NULL, 10);
+          xmlFree (value);
+        }
+
+      if (!location->latitude || !location->longitude)
+        {
+          /* If we don't get enough information, return NULL */
+          fsp_data_free (FSP_DATA (location));
+          location = NULL;
+
+          err = g_error_new (FSP_ERROR, FSP_ERROR_MISSING_DATA,
+                             "No location data found in the response");
+        }
+    }
+  else
+    err = g_error_new (FSP_ERROR, FSP_ERROR_MISSING_DATA,
+                       "No 'location' node found in the response");
+  /* Free */
+  xmlXPathFreeObject (xpathObj);
+  xmlXPathFreeContext (xpathCtx);
+
+  /* Propagate error */
+  if (err != NULL)
+    g_propagate_error (error, err);
+
+  return location;
+}
+
 static FspDataPhotoInfo *
 _get_photo_info_from_node               (xmlNode *node)
 {
@@ -1258,7 +1325,6 @@ fsp_parser_check_token                  (FspParser  *self,
     FSP_DATA_AUTH_TOKEN (_process_xml_response (self, buffer, buf_size,
                                                 _check_token_parser,
                                                 error));
-
   /* Return value */
   return auth_token;
 }
@@ -1488,3 +1554,23 @@ fsp_parser_set_location                  (FspParser  *self,
   /* No return value for this method */
   return GINT_TO_POINTER ((gint)(*error == NULL));
 }
+
+FspDataLocation *
+fsp_parser_get_location                  (FspParser   *self,
+                                          const gchar *buffer,
+                                          gulong       buf_size,
+                                          GError     **error)
+{
+  FspDataLocation *location = NULL;
+
+  g_return_val_if_fail (FSP_IS_PARSER (self), NULL);
+  g_return_val_if_fail (buffer != NULL, NULL);
+
+  /* Process the response */
+  location =
+    FSP_DATA_LOCATION (_process_xml_response (self, buffer, buf_size,
+                                              _get_location_parser,
+                                              error));
+  /* Return value */
+  return location;
+}
diff --git a/src/flicksoup/fsp-parser.h b/src/flicksoup/fsp-parser.h
index f3fbd4b..244b125 100644
--- a/src/flicksoup/fsp-parser.h
+++ b/src/flicksoup/fsp-parser.h
@@ -156,6 +156,12 @@ fsp_parser_set_location                  (FspParser  *self,
                                           const gchar      *buffer,
                                           gulong            buf_size,
                                           GError          **error);
+
+FspDataLocation *
+fsp_parser_get_location                  (FspParser   *self,
+                                          const gchar *buffer,
+                                          gulong       buf_size,
+                                          GError     **error);
 G_END_DECLS
 
 #endif
diff --git a/src/flicksoup/fsp-session.c b/src/flicksoup/fsp-session.c
index 06ad430..c30d0a4 100644
--- a/src/flicksoup/fsp-session.c
+++ b/src/flicksoup/fsp-session.c
@@ -327,6 +327,11 @@ _set_location_soup_session_cb            (SoupSession *session,
                                           SoupMessage *msg,
                                           gpointer     data);
 
+static void
+_get_location_soup_session_cb            (SoupSession *session,
+                                          SoupMessage *msg,
+                                          gpointer     data);
+
 /* Private API */
 
 static void
@@ -1586,6 +1591,20 @@ _set_location_soup_session_cb            (SoupSession *session,
                          data);
 }
 
+static void
+_get_location_soup_session_cb            (SoupSession *session,
+                                          SoupMessage *msg,
+                                          gpointer     data)
+{
+  g_assert (SOUP_IS_MESSAGE (msg));
+  g_assert (data != NULL);
+
+  /* Handle message with the right parser */
+  _handle_soup_response (msg,
+                         (FspParserFunc) fsp_parser_get_location,
+                         data);
+}
+
 /* Public API */
 
 FspSession *
@@ -2592,3 +2611,49 @@ fsp_session_set_location_finish          (FspSession    *self,
 
   return result ? TRUE : FALSE;
 }
+
+void
+fsp_session_get_location_async           (FspSession          *self,
+                                          const gchar         *photo_id,
+                                          GCancellable        *cancellable,
+                                          GAsyncReadyCallback  callback,
+                                          gpointer             data)
+{
+  SoupSession *soup_session = NULL;
+  gchar *url = NULL;
+
+  g_return_if_fail (FSP_IS_SESSION (self));
+  g_return_if_fail (photo_id != NULL);
+
+  url = _get_signed_url (self,
+                         FLICKR_API_BASE_URL,
+                         AUTHORIZATION_METHOD_OAUTH_1,
+                         "method", "flickr.photos.geo.getLocation",
+                         "photo_id", photo_id,
+                         NULL);
+
+  /* Perform the async request */
+  soup_session = _get_soup_session (self);
+  _perform_async_request (soup_session, url,
+                          _get_location_soup_session_cb, G_OBJECT (self),
+                          cancellable, callback, fsp_session_get_location_async, data);
+
+  g_free (url);
+}
+
+FspDataLocation *
+fsp_session_get_location_finish          (FspSession    *self,
+                                          GAsyncResult  *res,
+                                          GError       **error)
+{
+  FspDataLocation *location = NULL;
+
+  g_return_val_if_fail (FSP_IS_SESSION (self), NULL);
+  g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL);
+
+  location =
+    FSP_DATA_LOCATION (_finish_async_request (G_OBJECT (self), res,
+                                              fsp_session_get_location_async,
+                                              error));
+  return location;
+}
diff --git a/src/flicksoup/fsp-session.h b/src/flicksoup/fsp-session.h
index 9c63fc3..1af4bf1 100644
--- a/src/flicksoup/fsp-session.h
+++ b/src/flicksoup/fsp-session.h
@@ -269,6 +269,18 @@ gboolean
 fsp_session_set_location_finish          (FspSession    *self,
                                           GAsyncResult  *res,
                                           GError       **error);
+
+void
+fsp_session_get_location_async           (FspSession          *self,
+                                          const gchar         *photo_id,
+                                          GCancellable        *cancellable,
+                                          GAsyncReadyCallback  callback,
+                                          gpointer             data);
+
+FspDataLocation *
+fsp_session_get_location_finish          (FspSession    *self,
+                                          GAsyncResult  *res,
+                                          GError       **error);
 G_END_DECLS
 
 #endif



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]