Author: post
Date: 2010-09-19 13:08:06 +0200 (Sun, 19 Sep 2010)
New Revision: 3528

Modified:
   trunk/plugins/output-picasa/rs-picasa-client.c
   trunk/plugins/output-picasa/rs-picasa-client.h
Log:
Make Picasa uploader handle expired login tokens more gracefully (allow 
login/re-try the operation).

Modified: trunk/plugins/output-picasa/rs-picasa-client.c
===================================================================
--- trunk/plugins/output-picasa/rs-picasa-client.c      2010-09-12 16:42:21 UTC 
(rev 3527)
+++ trunk/plugins/output-picasa/rs-picasa-client.c      2010-09-19 11:08:06 UTC 
(rev 3528)
@@ -26,33 +26,52 @@
        PICASA_ALBUM_ID
 } PicasaAlbum;
 
-static gboolean
-picasa_error(gint code, const GString *data, GError **error)
+static gint
+picasa_error(PicasaClient *picasa_client, gint code, const GString *data, 
GError **error)
 {
-        gchar *error_msg = NULL;
+       gchar *error_msg = NULL;
 
        switch(code)
        {
-       case 200:
-       case 201:
+               case 200:
+               case 201:
+                       break;
+               case 404:
+                       error_msg = g_strdup(data->str);
+                       break;
+               case 403:
+               case 401:
+               {
+                       picasa_client->auth_token = NULL;
+                       while (!rs_picasa_client_auth(picasa_client))
+                       {
+                               if (!rs_picasa_client_auth_popup(picasa_client))
+                               {
+                                       /* Cancel pressed, or no info entered */
+                                       g_set_error(error, 
g_quark_from_static_string("rawstudio_facebook_client_error"), code, "Cannot 
log in");
+                                       return PICASA_CLIENT_ERROR;
+                               }
+                       }
+                       /* Save information */
+                       rs_conf_set_string(CONF_PICASA_CLIENT_AUTH_TOKEN, 
picasa_client->auth_token);
+                       rs_conf_set_string(CONF_PICASA_CLIENT_USERNAME, 
picasa_client->username);
+                       return PICASA_CLIENT_RETRY;
+               }
                break;
-       case 404:
-               error_msg = g_strdup(data->str);
-               break;
        default:
-               error_msg = g_strdup_printf("Error not caught, please submit 
this as a bugreport:\n%s", data->str);
+               error_msg = g_strdup_printf("Error %d not caught, please submit 
this as a bugreport:\n%s", code, data->str);
                break;
        }
 
-        if (error_msg)
+       if (error_msg)
        {
                g_set_error(error, 
g_quark_from_static_string("rawstudio_facebook_client_error"), code, "%s", 
error_msg);
                g_free(error_msg);
-               return FALSE;
+               return PICASA_CLIENT_ERROR;
        }
        else
        {
-               return TRUE;
+               return PICASA_CLIENT_OK;
        }
 }
 
@@ -281,6 +300,7 @@
 GtkListStore *
 rs_picasa_client_get_album_list(PicasaClient *picasa_client, GError **error)
 {
+       gint ret;
        g_assert(picasa_client->auth_token != NULL);
        g_assert(picasa_client->username != NULL);
 
@@ -309,15 +329,18 @@
 
        glong response_code;
        curl_easy_getinfo(picasa_client->curl, CURLINFO_RESPONSE_CODE, 
&response_code);
-       if (picasa_error(response_code, data, error))
+       ret = picasa_error(picasa_client, response_code, data, error);
+       if (PICASA_CLIENT_OK == ret)
                return xml_album_list_response(data);
-       else
-               return NULL;
+       else if (PICASA_CLIENT_RETRY == ret)
+               return rs_picasa_client_get_album_list(picasa_client, error);
+       return NULL;
 }
 
 gchar *
 rs_picasa_client_create_album(PicasaClient *picasa_client, const gchar *name, 
GError **error)
 {
+       gint ret;
        gchar *body = g_strdup_printf("<entry 
xmlns='http://www.w3.org/2005/Atom' xmlns:media='http://search.yahoo.com/mrss/' 
xmlns:gphoto='http://schemas.google.com/photos/2007'> <title 
type='text'>%s</title><summary 
type='text'></summary><gphoto:location></gphoto:location><gphoto:access>private</gphoto:access><gphoto:commentingEnabled>true</gphoto:commentingEnabled><gphoto:timestamp>%d000</gphoto:timestamp><category
 scheme='http://schemas.google.com/g/2005#kind' 
term='http://schemas.google.com/photos/2007#album'></category></entry>", name, 
(int) time(NULL));
 
        g_assert(picasa_client->auth_token != NULL);
@@ -347,20 +370,23 @@
         curl_easy_setopt(picasa_client->curl, CURLOPT_VERBOSE, TRUE);
 #endif
 
-        CURLcode result = curl_easy_perform(picasa_client->curl);
+       CURLcode result = curl_easy_perform(picasa_client->curl);
        handle_curl_code(result);
 
        glong response_code;
        curl_easy_getinfo(picasa_client->curl, CURLINFO_RESPONSE_CODE, 
&response_code);
-       if (picasa_error(response_code, data, error))
+       ret = picasa_error(picasa_client, response_code, data, error);
+       if (PICASA_CLIENT_OK == ret)
                return xml_album_create_response(data);
-       else
-               return NULL;
+       else if (PICASA_CLIENT_RETRY == ret)
+               return rs_picasa_client_create_album(picasa_client, name, 
error);
+       return NULL;
 }
 
 gboolean
 rs_picasa_client_upload_photo(PicasaClient *picasa_client, gchar *photo, gchar 
*albumid, GError **error)
 {
+       gint ret;
        g_assert(picasa_client->auth_token != NULL);
        g_assert(picasa_client->username != NULL);
 
@@ -398,7 +424,14 @@
 
        glong response_code;
        curl_easy_getinfo(picasa_client->curl, CURLINFO_RESPONSE_CODE, 
&response_code);
-       return picasa_error(response_code, data, error);
+
+       ret = picasa_error(picasa_client, response_code, data, error);
+       if (PICASA_CLIENT_OK == ret)
+               return TRUE;
+       else if (PICASA_CLIENT_RETRY == ret)
+               return rs_picasa_client_upload_photo(picasa_client, photo, 
albumid, error);
+
+       return FALSE;
 }
 
 PicasaClient *

Modified: trunk/plugins/output-picasa/rs-picasa-client.h
===================================================================
--- trunk/plugins/output-picasa/rs-picasa-client.h      2010-09-12 16:42:21 UTC 
(rev 3527)
+++ trunk/plugins/output-picasa/rs-picasa-client.h      2010-09-19 11:08:06 UTC 
(rev 3528)
@@ -13,6 +13,12 @@
        gchar *captcha_url;
 } PicasaClient;
 
+enum {
+       PICASA_CLIENT_OK,
+       PICASA_CLIENT_ERROR,
+       PICASA_CLIENT_RETRY
+};
+
 gboolean rs_picasa_client_auth_popup(PicasaClient *picasa_client);
 gboolean rs_picasa_client_auth(PicasaClient *picasa_client);
 GtkListStore * rs_picasa_client_get_album_list(PicasaClient *picasa_client, 
GError **error);


_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit

Reply via email to