return special_folder;
}
+typedef struct
+{
+ GSourceFunc func;
+ GMainLoop* loop;
+} UtilIdleData;
+
+static gboolean util_on_idle(gpointer user_data)
+{
+ /* We are now in the main thread,
+ * so we can call the function:
+ */
+ UtilIdleData *idle_data = (UtilIdleData*)user_data;
+ if (idle_data && idle_data->func)
+ (*(idle_data->func))(NULL);
+
+ /* Stop the main loop so that the caller can continue: */
+ if (idle_data->loop)
+ g_main_loop_quit (idle_data->loop);
+
+ return FALSE; /* Stop calling this callback. */
+}
+
+static void
+util_run_in_main_thread_and_wait(GSourceFunc function)
+{
+ UtilIdleData *data = g_slice_new0 (UtilIdleData);
+ data->func = function;
+ data->loop = g_main_loop_new (NULL, FALSE /* not running */);
+
+ /* Cause the function to be run in an idle-handler, which is always
+ * in the main thread:
+ */
+ g_idle_add (util_on_idle, &data);
+
+ /* This main loop will run until the idle handler has stopped it: */
+ g_main_loop_run (data->loop);
+ g_main_loop_unref (data->loop);
+
+ g_slice_free (UtilIdleData, data);
+}
+
+static gboolean
+connect_and_wait(gpointer user_data)
+{
+ modest_platform_connect_and_wait(NULL);
+ return TRUE; /* Ignored */
+}
+
static void
on_connection_status_changed (TnyAccount *account, TnyConnectionStatus status, gpointer user_data)
{
* but the accounts are set as offline, because our TnyDevice is offline,
* because libconic says we are offline.
* So ask the user to go online:
+ *
+ * We make sure that this UI is shown in the main thread, to avoid races,
+ * because tinymail does not guarantee that this signal handler will be called
+ * in the main thread.
*/
- modest_platform_connect_and_wait(NULL);
+ util_run_in_main_thread_and_wait (&connect_and_wait);
} else if (status == TNY_CONNECTION_STATUS_CONNECTED_BROKEN) {
printf ("DEBUG: %s: Connection broken. Forcing TnyDevice offline.\n",
__FUNCTION__);
/**
* modest_tny_account_new_from_server_account:
* @account_mgr: a valid account mgr instance
- * @account_name: the server account name for which to create a corresponding tny account
+ * @session: A valid TnySessionCamel instance.
+ * @account_data: the server account for which to create a corresponding tny account
* @type: the type of account to create (TNY_ACCOUNT_TYPE_STORE or TNY_ACCOUNT_TYPE_TRANSPORT)
*
* get a tnyaccount corresponding to the server_accounts (store or transport) for this account.
*/
static TnyAccount*
modest_tny_account_new_from_server_account (ModestAccountMgr *account_mgr,
+ TnySessionCamel *session,
ModestServerAccountData *account_data)
{
gchar *url = NULL;
g_return_val_if_fail (account_mgr, NULL);
+ g_return_val_if_fail (session, NULL);
g_return_val_if_fail (account_data, NULL);
/* sanity checks */
}
tny_account_set_id (tny_account, account_data->account_name);
+ /* This must be set quite early, or other set() functions will fail. */
+ tny_camel_account_set_session (TNY_CAMEL_ACCOUNT (tny_account), session);
+
/* Handle connection requests:
* This (badly-named) signal will be called when we try to use an offline account. */
g_signal_connect (G_OBJECT (tny_account), "connection-status-changed",
TnyAccount*
modest_tny_account_new_from_server_account_name (ModestAccountMgr *account_mgr,
- const gchar *server_account_name)
+ TnySessionCamel *session,
+ const gchar *server_account_name)
{
ModestServerAccountData *account_data =
modest_account_mgr_get_server_account_data (account_mgr,
return NULL;
TnyAccount *result = modest_tny_account_new_from_server_account (
- account_mgr, account_data);
+ account_mgr, session, account_data);
modest_account_mgr_free_server_account_data (account_mgr, account_data);
g_return_val_if_fail (account_mgr, NULL);
g_return_val_if_fail (account_name, NULL);
+ g_return_val_if_fail (session, NULL);
account_data = modest_account_mgr_get_account_data (account_mgr, account_name);
if (!account_data) {
return NULL;
}
- tny_account = modest_tny_account_new_from_server_account (account_mgr, server_data);
+ tny_account = modest_tny_account_new_from_server_account (account_mgr, session, server_data);
if (!tny_account) {
g_printerr ("modest: failed to create tny account for %s (%s)\n",
account_data->account_name, server_data->account_name);
return NULL;
}
- tny_camel_account_set_session (TNY_CAMEL_ACCOUNT(tny_account), session);
tny_account_set_forget_pass_func (tny_account,
forget_pass_func ? forget_pass_func : forget_pass_dummy);
tny_account_set_pass_func (tny_account,
TnyAccount*
-modest_tny_account_new_for_local_folders (ModestAccountMgr *account_mgr, TnySessionCamel *session, const gchar* location_filepath)
+modest_tny_account_new_for_local_folders (ModestAccountMgr *account_mgr, TnySessionCamel *session,
+ const gchar* location_filepath)
{
+
+
/* Make sure that the directories exist: */
modest_init_local_folders (location_filepath);
gchar *maildir, *url_string;
g_return_val_if_fail (account_mgr, NULL);
+ g_return_val_if_fail (session, NULL);
+
if (!location_filepath) {
/* A NULL filepath means that this is the special local-folders maildir
TnyAccount*
-modest_tny_account_new_for_per_account_local_outbox_folder (ModestAccountMgr *account_mgr, const gchar* account_name, TnySessionCamel *session)
+modest_tny_account_new_for_per_account_local_outbox_folder (ModestAccountMgr *account_mgr,
+ const gchar* account_name,
+ TnySessionCamel *session)
{
g_return_val_if_fail (account_mgr, NULL);
g_return_val_if_fail (account_name, NULL);
+ g_return_val_if_fail (session, NULL);
/* Notice that we create a ModestTnyOutboxAccount here,
* instead of just a TnyCamelStoreAccount,