summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Chalupa <mchalupa@redhat.com>2013-05-03 17:35:26 +0200
committerJuan A. Suarez Romero <jasuarez@igalia.com>2013-05-06 02:14:03 +0200
commit2b97310957ded00aa98c84779e6572e577a926fa (patch)
tree80edcb6b8e38229283cd9faa3223f2280072bd19
parent3929f808c6c51a136b1fcb0a7626975b27a1ce26 (diff)
flickr: use GOA to get user's accounts
When compiled with --enable-goa, flickr will try to find additional configuration in GOA. When GOA is enabled the behavoiur is following: If no cofig is passed to the plugin -> create public source and personal sources from GOA (if at least one personal source is present) Otherwise use given config and then create personal sources from GOA too. https://bugzilla.gnome.org/show_bug.cgi?id=697565
-rw-r--r--configure.ac8
-rw-r--r--src/flickr/grl-flickr.c156
2 files changed, 155 insertions, 9 deletions
diff --git a/configure.ac b/configure.ac
index f847c5f..bb88250 100644
--- a/configure.ac
+++ b/configure.ac
@@ -511,8 +511,16 @@ AC_SUBST(FLICKR_PLUGIN_ID)
AC_DEFINE_UNQUOTED([FLICKR_PLUGIN_ID], ["$FLICKR_PLUGIN_ID"], [Flickr plugin ID])
DEPS_FLICKR_CFLAGS="$DEPS_CFLAGS $XML_CFLAGS $GRLNET_CFLAGS $OAUTH_CFLAGS"
+if test "x$enable_goa" = "xyes"; then
+ DEPS_FLICKR_CFLAGS="$DEPS_FLICKR_CFLAGS $GOA_CFLAGS"
+fi
AC_SUBST(DEPS_FLICKR_CFLAGS)
+
+
DEPS_FLICKR_LIBS="$DEPS_LIBS $XML_LIBS $GRLNET_LIBS $OAUTH_LIBS"
+if test "x$enable_goa" = "xyes"; then
+ DEPS_FLICKR_LIBS="$DEPS_FLICKR_LIBS $GOA_LIBS"
+fi
AC_SUBST(DEPS_FLICKR_LIBS)
# ----------------------------------------------------------
diff --git a/src/flickr/grl-flickr.c b/src/flickr/grl-flickr.c
index 8aaf6a8..8c52a58 100644
--- a/src/flickr/grl-flickr.c
+++ b/src/flickr/grl-flickr.c
@@ -33,12 +33,17 @@
#include <string.h>
#include <stdlib.h>
+#ifdef GOA_ENABLED
+#define GOA_API_IS_SUBJECT_TO_CHANGE
+#include <goa/goa.h>
+#endif
+
#include "grl-flickr.h"
#include "gflickr.h"
-#define GRL_FLICKR_SOURCE_GET_PRIVATE(object) \
- (G_TYPE_INSTANCE_GET_PRIVATE((object), \
- GRL_FLICKR_SOURCE_TYPE, \
+#define GRL_FLICKR_SOURCE_GET_PRIVATE(object) \
+ (G_TYPE_INSTANCE_GET_PRIVATE((object), \
+ GRL_FLICKR_SOURCE_TYPE, \
GrlFlickrSourcePrivate))
/* --------- Logging -------- */
@@ -112,6 +117,10 @@ static void grl_flickr_source_resolve (GrlSource *source,
static void grl_flickr_source_search (GrlSource *source,
GrlSourceSearchSpec *ss);
+#ifdef GOA_ENABLED
+static GList *grl_flickr_get_goa_multiple_config (GrlPlugin *plugin, gboolean public);
+#endif
+
/* =================== Flickr Plugin =============== */
gboolean
@@ -119,26 +128,51 @@ grl_flickr_plugin_init (GrlRegistry *registry,
GrlPlugin *plugin,
GList *configs)
{
- gchar *flickr_key;
- gchar *flickr_secret;
- gchar *flickr_token;
- gchar *flickr_token_secret;
+ gchar *flickr_key = NULL;
+ gchar *flickr_secret = NULL;
+ gchar *flickr_token = NULL;
+ gchar *flickr_token_secret = NULL;
GrlConfig *config;
gboolean public_source_created = FALSE;
GRL_LOG_DOMAIN_INIT (flickr_log_domain, "flickr");
+#ifdef GOA_ENABLED
+ GRL_DEBUG ("GOA enabled");
+ gboolean create_public_from_goa = FALSE;
+#endif
+
GRL_DEBUG ("flickr_plugin_init");
/* Initialize i18n */
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
- if (!configs) {
+ if (configs == NULL) {
+#ifdef GOA_ENABLED
+ GRL_DEBUG ("No user config passed.");
+ create_public_from_goa = TRUE;
+#else
GRL_INFO ("Configuration not provided! Plugin not loaded");
return FALSE;
+#endif /* GOA_ENABLED */
+ }
+
+#ifdef GOA_ENABLED
+ /* When is GOA enabled, add all configs from GOA too */
+ GList *goa_config = grl_flickr_get_goa_multiple_config (plugin,
+ create_public_from_goa);
+
+ if (goa_config == NULL)
+ {
+ GRL_WARNING ("Cannot get flickr sources from GOA.");
}
+ else
+ {
+ configs = g_list_concat (configs, goa_config);
+ }
+#endif /* GOA_ENABLED */
while (configs) {
config = GRL_CONFIG (configs->data);
@@ -175,6 +209,8 @@ grl_flickr_plugin_init (GrlRegistry *registry,
g_free (flickr_token);
if (flickr_secret != NULL)
g_free (flickr_secret);
+ if (flickr_token_secret != NULL)
+ g_free (flickr_token_secret);
configs = g_list_next (configs);
}
@@ -196,7 +232,7 @@ grl_flickr_source_public_new (const gchar *flickr_api_key,
{
GrlFlickrSource *source;
- GRL_DEBUG ("grl_flickr_source_new");
+ GRL_DEBUG ("grl_flickr_public_source_new");
source = g_object_new (GRL_FLICKR_SOURCE_TYPE,
"source-id", PUBLIC_SOURCE_ID,
@@ -219,6 +255,8 @@ grl_flickr_source_personal_new (GrlPlugin *plugin,
{
GFlickr *f;
+ GRL_DEBUG ("grl_flickr_personal_source_new");
+
f = g_flickr_new (flickr_api_key, flickr_secret,
flickr_token, flickr_token_secret);
@@ -601,6 +639,106 @@ gettags_cb (GFlickr *f, GList *taglist, gpointer user_data)
}
}
+#ifdef GOA_ENABLED
+static GList *
+grl_flickr_get_goa_multiple_config (GrlPlugin *plugin, gboolean public)
+{
+ GList *tmp;
+ GList *list = NULL;
+ GError *error = NULL;
+ GrlConfig *conf = NULL;
+ GList *configs = NULL;
+
+ gchar *access_token;
+ gchar *token_secret;
+
+ gboolean public_created = FALSE;
+
+ GoaAccount *acc = NULL;
+ GoaOAuthBased *oauth = NULL;
+ GoaClient *cl = goa_client_new_sync (NULL, &error);
+
+ if (error != NULL)
+ {
+ GRL_ERROR ("%s\n", error->message);
+ return NULL;
+ }
+
+ list = goa_client_get_accounts (cl);
+ tmp = g_list_first (list);
+
+ /* find flickr one's and get tokens */
+ while (tmp != NULL)
+ {
+ acc = goa_object_peek_account (tmp->data);
+
+ if (strcmp (goa_account_get_provider_type (acc), "flickr") == 0)
+ {
+ oauth = goa_object_peek_oauth_based (tmp->data);
+
+ if (oauth != NULL)
+ {
+ conf = grl_config_new (grl_plugin_get_id (plugin),
+ NULL);
+
+ /* Consumer data */
+ grl_config_set_api_key (conf,
+ goa_oauth_based_get_consumer_key (oauth));
+ grl_config_set_api_secret (conf,
+ goa_oauth_based_get_consumer_secret (oauth));
+
+ /* if public == TRUE, create one public source */
+ if (public == TRUE && public_created == FALSE)
+ {
+ configs = g_list_append (configs, conf);
+ public_created = TRUE;
+
+ continue; /* Use this personal source again, but this time with tokens */
+ }
+
+ /* Get Access Token */
+ if (! goa_oauth_based_call_get_access_token_sync (oauth,
+ &access_token,
+ &token_secret,
+ NULL, NULL,
+ &error))
+ {
+
+ /* No access token doesn't mean error */
+ GRL_INFO ("Access token: %s\n", error->message);
+ g_error_free (error);
+ }
+ else
+ {
+ grl_config_set_api_token (conf, access_token);
+ grl_config_set_api_token_secret (conf, token_secret);
+
+ if (access_token != NULL)
+ {
+ g_free(access_token);
+ access_token = NULL;
+ }
+
+ if (token_secret != NULL)
+ {
+ g_free(token_secret);
+ token_secret = NULL;
+ }
+ }
+
+ configs = g_list_append (configs, conf);
+ }
+ }
+ tmp = g_list_next (tmp);
+ }
+
+ g_object_unref (cl);
+ g_list_free_full (list, g_object_unref);
+
+ return configs;
+}
+#endif /* FLICKR_GOA_ENABLED */
+
/* ================== API Implementation ================ */
static const GList *