+ ULOG_DEBUG_L ("sharing_plugin_interface_send, gallery2");
+
+ SharingPluginInterfaceSendResult ret = SHARING_SEND_SUCCESS;
+
+ SharingEntry *entry = sharing_transfer_get_entry (transfer);
+ SharingAccount *account = sharing_entry_get_account (entry);
+
+ gchar* urlbase = sharing_account_get_param (account, "urlbase");
+ gchar* albumname = sharing_account_get_param (account, "albumname");
+
+ GHashTable* cookies = 0;
+ gchar* auth = 0;
+
+ gchar* album = 0;
+
+ /* Login to the target service */
+
+ sharing_transfer_set_progress (transfer, 0.0);
+ *dead_mans_switch = FALSE;
+
+ SharingPluginInterfaceAccountValidateResult login_ret = SHARING_ACCOUNT_VALIDATE_FAILED;
+
+ if (urlbase)
+ {
+ gchar* user = sharing_account_get_username (account);
+ gchar* pass = sharing_account_get_password (account);
+ if (user && pass)
+ login_ret = gallery2_login (con,
+ urlbase, user, pass,
+ &cookies, &auth);
+ g_free (user);
+ g_free (pass);
+ }
+
+ if (login_ret != SHARING_ACCOUNT_VALIDATE_SUCCESS || !sharing_transfer_continue (transfer))
+ {
+ if (cookies) g_hash_table_unref (cookies);
+ g_free (auth);
+ g_free (urlbase);
+ g_free (albumname);
+ if (!sharing_transfer_continue (transfer))
+ return SHARING_SEND_CANCELLED;
+ else if (login_ret == SHARING_ACCOUNT_VALIDATE_ERROR_CONNECTION)
+ return SHARING_SEND_ERROR_CONNECTION;
+ else
+ return SHARING_SEND_ERROR_AUTH;
+ }
+
+ /* Look up the album */
+
+ sharing_transfer_set_progress (transfer, 0.05);
+ *dead_mans_switch = FALSE;
+
+ login_ret = gallery2_lookup_album (con, urlbase, albumname, &album, cookies, auth);
+ g_free (albumname);
+ albumname = 0;
+
+ if (login_ret != SHARING_ACCOUNT_VALIDATE_SUCCESS || !album || !sharing_transfer_continue (transfer))
+ {
+ if (cookies) g_hash_table_unref (cookies);
+ g_free (auth);
+ g_free (urlbase);
+ g_free (album); /* just in case... */
+ if (!sharing_transfer_continue (transfer))
+ return SHARING_SEND_CANCELLED;
+ else if (login_ret == SHARING_ACCOUNT_VALIDATE_ERROR_CONNECTION)
+ return SHARING_SEND_ERROR_CONNECTION;
+ else
+ return SHARING_SEND_ERROR_UNKNOWN;
+ }
+
+ /* Start sending items */
+
+ sharing_transfer_set_progress (transfer, 0.1);
+ *dead_mans_switch = FALSE;
+
+ guint64 total_bytes = 0;
+
+ for (GSList* p = sharing_entry_get_media (entry); p; p = g_slist_next (p))
+ {
+ SharingEntryMedia* media = p->data;
+ if (!sharing_entry_media_get_sent (media))
+ total_bytes += sharing_entry_media_get_size (media);
+ }
+
+ if (!total_bytes) total_bytes = 1; /* just in case... */
+
+ guint64 sent_bytes = 0;
+
+ for (GSList* p = sharing_entry_get_media (entry); p; p = g_slist_next (p))
+ {
+ SharingEntryMedia* media = p->data;
+ if (sharing_entry_media_get_sent (media))
+ continue;
+
+ if (!sharing_transfer_continue (transfer))
+ {
+ ret = SHARING_SEND_CANCELLED;
+ break;
+ }
+
+ guint64 media_size = sharing_entry_media_get_size (media);
+
+ gdouble progress_start = 1.0 - 0.9*((total_bytes - sent_bytes) / (gdouble)total_bytes);
+ gdouble progress_end = 1.0 - 0.9*((total_bytes - (sent_bytes + media_size)) / (gdouble)total_bytes);
+
+ sharing_transfer_set_progress (transfer, progress_start);
+ *dead_mans_switch = FALSE;
+
+ SharingPluginInterfaceSendResult mret = gallery2_send (con,
+ transfer, progress_start, progress_end, dead_mans_switch,
+ media,
+ urlbase, album, cookies, auth);
+
+ if (mret == SHARING_SEND_SUCCESS)
+ sharing_entry_media_set_sent (media, TRUE);
+ else
+ ret = mret; /* propagate last error */
+ }
+
+ sharing_transfer_set_progress (transfer, 1.0);
+ *dead_mans_switch = FALSE;
+
+ if (cookies) g_hash_table_unref (cookies);
+ g_free (auth);
+ g_free (urlbase);
+ g_free (album);
+
+ return ret;