[PATCH 10/18] flickr: Add helper function to check a token
- From: "Juan A. Suarez Romero" <jasuarez igalia com>
- To: grilo-list gnome org
- Subject: [PATCH 10/18] flickr: Add helper function to check a token
- Date: Wed, 7 Jul 2010 18:20:05 +0200
---
src/flickr/gflickr.c | 89 ++++++++++++++++++++++++++++++++++++++++++
src/flickr/gflickr.h | 8 ++++
src/flickr/grl-flickr-auth.c | 40 +++++++++++++++++++
src/flickr/grl-flickr-auth.h | 4 ++
4 files changed, 141 insertions(+), 0 deletions(-)
diff --git a/src/flickr/gflickr.c b/src/flickr/gflickr.c
index a73eac3..1ee274d 100644
--- a/src/flickr/gflickr.c
+++ b/src/flickr/gflickr.c
@@ -24,6 +24,7 @@
#define FLICKR_TAGS_GETHOTLIST_METHOD "flickr.tags.getHotList"
#define FLICKR_AUTH_GETFROB_METHOD "flickr.auth.getFrob"
#define FLICKR_AUTH_GETTOKEN_METHOD "flickr.auth.getToken"
+#define FLICKR_AUTH_CHECKTOKEN_METHOD "flickr.auth.checkToken"
#define FLICKR_PHOTOS_SEARCH \
FLICKR_ENDPOINT \
@@ -66,6 +67,13 @@
"&method=" FLICKR_AUTH_GETTOKEN_METHOD \
"&frob=%s"
+#define FLICKR_AUTH_CHECKTOKEN \
+ FLICKR_ENDPOINT \
+ "api_key=%s" \
+ "&api_sig=%s" \
+ "&method=" FLICKR_AUTH_CHECKTOKEN_METHOD \
+ "&auth_token=%s"
+
#define FLICKR_AUTH_LOGINLINK \
FLICKR_AUTHPOINT \
"api_key=%s" \
@@ -293,6 +301,26 @@ get_tag (xmlNodePtr node)
}
}
+static GHashTable *
+get_token_info (xmlNodePtr node)
+{
+ GHashTable *token = g_hash_table_new_full (g_str_hash,
+ g_str_equal,
+ g_free,
+ g_free);
+ node = node->xmlChildrenNode;
+
+ while (node) {
+ g_hash_table_insert (token,
+ g_strdup ((const gchar *) node->name),
+ (gchar *) xmlNodeGetContent (node));
+ add_node (node, token);
+ node = node->next;
+ }
+
+ return token;
+}
+
static void
process_photo_result (const gchar *xml_result, gpointer user_data)
{
@@ -386,6 +414,32 @@ process_taglist_result (const gchar *xml_result, gpointer user_data)
}
static void
+process_token_result (const gchar *xml_result, gpointer user_data)
+{
+ xmlDocPtr doc;
+ xmlNodePtr node;
+ GFlickrData *data = (GFlickrData *) user_data;
+ GHashTable *token;
+
+ doc = xmlReadMemory (xml_result, xmlStrlen ((xmlChar*) xml_result), NULL,
+ NULL, XML_PARSE_RECOVER | XML_PARSE_NOBLANKS);
+ node = xmlDocGetRootElement (doc);
+
+ /* Check if result is OK */
+ if (!node || !result_is_correct (node)) {
+ data->hashtable_cb (NULL, NULL, data->user_data);
+ } else {
+ node = node->xmlChildrenNode;
+ token = get_token_info (node);
+ data->hashtable_cb (NULL, token, data->user_data);
+ g_hash_table_unref (token);
+ }
+
+ g_slice_free (GFlickrData, data);
+ xmlFreeDoc (doc);
+}
+
+static void
read_done_cb (GObject *source_object,
GAsyncResult *res,
gpointer user_data)
@@ -757,3 +811,38 @@ g_flickr_auth_getToken (GFlickr *f,
return token;
}
+
+void
+g_flickr_auth_checkToken (GFlickr *f,
+ const gchar *token,
+ GFlickrHashTableCb callback,
+ gpointer user_data)
+{
+ gchar *api_sig;
+ gchar *request;
+
+ g_return_if_fail (G_IS_FLICKR (f));
+ g_return_if_fail (token);
+ g_return_if_fail (callback);
+
+ api_sig = get_api_sig (f->priv->auth_secret,
+ "method", FLICKR_AUTH_CHECKTOKEN_METHOD,
+ "api_key", f->priv->api_key,
+ "auth_token", token,
+ NULL);
+
+ /* Build request */
+ request = g_strdup_printf (FLICKR_AUTH_CHECKTOKEN,
+ f->priv->api_key,
+ api_sig,
+ token);
+ g_free (api_sig);
+
+ GFlickrData *gfd = g_slice_new (GFlickrData);
+ gfd->parse_xml = process_token_result;
+ gfd->hashtable_cb = callback;
+ gfd->user_data = user_data;
+
+ read_url_async (request, gfd);
+ g_free (request);
+}
diff --git a/src/flickr/gflickr.h b/src/flickr/gflickr.h
index a4b9a4f..b161f4d 100644
--- a/src/flickr/gflickr.h
+++ b/src/flickr/gflickr.h
@@ -77,6 +77,8 @@ typedef void (*GFlickrHashTableCb) (GFlickr *f, GHashTable *result, gpointer use
typedef void (*GFlickrListCb) (GFlickr *f, GList *result, gpointer user_data);
+typedef void (*GFlickrCheckToken) (GFlickr *f, GHashTable *tokeninfo, gpointer user_data);
+
GType g_flickr_get_type (void);
GFlickr *g_flickr_new (const gchar *api_key, const gchar *auth_secret, const gchar *auth_token);
@@ -121,4 +123,10 @@ gchar *
g_flickr_auth_getToken (GFlickr *f,
const gchar *frob);
+void
+g_flickr_auth_checkToken (GFlickr *f,
+ const gchar *token,
+ GFlickrHashTableCb callback,
+ gpointer user_data);
+
#endif /* _G_FLICKR_H_ */
diff --git a/src/flickr/grl-flickr-auth.c b/src/flickr/grl-flickr-auth.c
index a197719..5927494 100644
--- a/src/flickr/grl-flickr-auth.c
+++ b/src/flickr/grl-flickr-auth.c
@@ -1,6 +1,16 @@
#include "grl-flickr-auth.h"
#include "gflickr.h"
+static void
+check_token_cb (GFlickr *f,
+ GHashTable *result,
+ gpointer user_data)
+{
+ gint *token_is_valid = (gint *) user_data;
+
+ *token_is_valid = (result != NULL);
+}
+
gchar *
grl_flickr_get_frob (const gchar *api_key,
const gchar *secret)
@@ -57,3 +67,33 @@ grl_flickr_get_token (const gchar *api_key,
return token;
}
+
+gboolean
+grl_flickr_check_token (const gchar *api_key,
+ const gchar *secret,
+ const gchar *token)
+{
+ GFlickr *f;
+ GMainContext *mainloop_ctx;
+ GMainLoop *mainloop;
+ gint token_is_valid = -1;
+
+ f = g_flickr_new (api_key, secret, NULL);
+ if (!f) {
+ return FALSE;
+ }
+
+ g_flickr_auth_checkToken (f, token, check_token_cb, &token_is_valid);
+
+ mainloop = g_main_loop_new (NULL, TRUE);
+ mainloop_ctx = g_main_loop_get_context (mainloop);
+
+ while (token_is_valid == -1) {
+ g_main_context_iteration (mainloop_ctx, TRUE);
+ }
+
+ g_main_loop_unref (mainloop);
+ g_object_unref (f);
+
+ return token_is_valid;
+}
diff --git a/src/flickr/grl-flickr-auth.h b/src/flickr/grl-flickr-auth.h
index 3649109..d61f9b7 100644
--- a/src/flickr/grl-flickr-auth.h
+++ b/src/flickr/grl-flickr-auth.h
@@ -39,4 +39,8 @@ gchar *grl_flickr_get_token (const gchar *api_key,
const gchar *secret,
const gchar *frob);
+gboolean grl_flickr_check_token (const gchar *api_key,
+ const gchar *secret,
+ const gchar *token);
+
#endif /* _GRL_FLICKR_AUTH_SOURCE_H_ */
--
1.7.0.4
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]