[frogr] Added API to FspSession to get the location for a picture.
- From: Mario Sanchez Prada <msanchez src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [frogr] Added API to FspSession to get the location for a picture.
- Date: Mon, 9 Apr 2012 00:01:17 +0000 (UTC)
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]