/* Respond to volume mounts and unmounts, such
* as the insertion/removal of the memory card: */
+ /* This is a singleton, so it does not need to be unrefed. */
monitor = gnome_vfs_get_volume_monitor();
priv->volume_mounted_handler = g_signal_connect (G_OBJECT(monitor),
/********************************************************************/
/* Control the state of the MMC local account */
/********************************************************************/
+
+/** Only call this if the memory card is really mounted.
+ */
+static void
+add_mmc_account(ModestTnyAccountStore *self, gboolean emit_insert_signal)
+{
+ ModestTnyAccountStorePrivate *priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
+ g_return_if_fail (priv->session);
+
+ TnyAccount *mmc_account = modest_tny_account_new_for_local_folders (priv->account_mgr,
+ priv->session,
+ MODEST_MCC1_VOLUMEPATH);
+
+ /* Add to the list of store accounts */
+ tny_list_append (priv->store_accounts, G_OBJECT (mmc_account));
+
+ if (emit_insert_signal) {
+ g_signal_emit (G_OBJECT (self),
+ signals [ACCOUNT_INSERTED_SIGNAL],
+ 0, mmc_account);
+ }
+
+ /* Free */
+ g_object_unref (mmc_account);
+}
+
static void
on_vfs_volume_mounted(GnomeVFSVolumeMonitor *volume_monitor,
GnomeVFSVolume *volume,
uri = gnome_vfs_volume_get_activation_uri (volume);
if (uri && (!strcmp (uri, MODEST_MCC1_VOLUMEPATH_URI))) {
- TnyAccount *mmc_account;
-
- mmc_account = modest_tny_account_new_for_local_folders (priv->account_mgr,
- priv->session,
- MODEST_MCC1_VOLUMEPATH);
-
- /* Add to the list of store accounts */
- tny_list_append (priv->store_accounts, G_OBJECT (mmc_account));
-
- g_signal_emit (G_OBJECT (self),
- signals [ACCOUNT_INSERTED_SIGNAL],
- 0, mmc_account);
- /* Free */
- g_object_unref (mmc_account);
+ add_mmc_account (self, TRUE /* emit the insert signal. */);
}
+
g_free (uri);
}
g_hash_table_remove (priv->account_settings_dialog_hash, modest_account_name);
}
-static gboolean
-on_idle_wrong_password_warning_only (gpointer user_data)
+static void
+show_password_warning_only ()
{
- gdk_threads_enter();
-
ModestWindow *main_window =
modest_window_mgr_get_main_window (modest_runtime_get_window_mgr ());
/* Show an explanatory temporary banner: */
hildon_banner_show_information (
GTK_WIDGET(main_window), NULL, _("mcen_ib_username_pw_incorrect"));
-
- gdk_threads_leave();
-
- return FALSE; /* Don't show again. */
}
-static gboolean
-on_idle_wrong_password (gpointer user_data)
+static void
+show_wrong_password_dialog (TnyAccount *account)
{
- TnyAccount *account = (TnyAccount*)user_data;
/* This is easier than using a struct for the user_data: */
ModestTnyAccountStore *self = modest_runtime_get_account_store();
ModestTnyAccountStorePrivate *priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
if (!modest_account_name) {
g_warning ("%s: modest_tny_account_get_parent_modest_account_name_for_server_account() failed.\n",
__FUNCTION__);
-
- g_object_unref (account);
- return FALSE;
}
-
/* Check whether this window is already open,
* for instance because of a previous get_password() call:
*/
ModestWindow *main_window =
modest_window_mgr_get_main_window (modest_runtime_get_window_mgr ());
- gdk_threads_enter ();
gboolean created_dialog = FALSE;
if (!found || !dialog) {
dialog = modest_account_settings_dialog_new ();
* though it is probably open already: */
gtk_window_present (GTK_WINDOW (dialog));
}
-
- g_object_unref (account);
- gdk_threads_leave ();
-
- return FALSE; /* Dont' call this again. */
}
-typedef struct
-{
- GMainLoop *loop;
- ModestTnyAccountStore* account_store;
- const gchar* server_account_id;
- gchar **username;
- gchar **password;
- gboolean *cancel;
- gboolean *remember;
-} IdlePasswordRequest;
-
-static gboolean
-on_idle_request_password (gpointer user_data)
-{
- gdk_threads_enter();
-
- IdlePasswordRequest* info = (IdlePasswordRequest*)user_data;
- g_signal_emit (G_OBJECT(info->account_store), signals[PASSWORD_REQUESTED_SIGNAL], 0,
- info->server_account_id, /* server_account_name */
- info->username, info->password, info->cancel, info->remember);
-
- if (info->loop)
- g_main_loop_quit (info->loop);
-
- gdk_threads_leave();
-
- return FALSE; /* Don't call again. */
-}
+
static void
-request_password_in_main_loop_and_wait (ModestTnyAccountStore *account_store,
+request_password_and_wait (ModestTnyAccountStore *account_store,
const gchar* server_account_id,
gchar **username,
gchar **password,
gboolean *cancel,
gboolean *remember)
{
- IdlePasswordRequest *data = g_slice_new0 (IdlePasswordRequest);
- data->account_store = account_store;
- data->server_account_id = server_account_id;
- data->username = username;
- data->password = password;
- data->cancel = cancel;
- data->remember = remember;
-
- 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 (&on_idle_request_password, data);
-
- /* This main loop will run until the idle handler has stopped it: */
- printf ("DEBUG: %s: before g_main_loop_run()\n", __FUNCTION__);
- GDK_THREADS_LEAVE();
- g_main_loop_run (data->loop);
- GDK_THREADS_ENTER();
- printf ("DEBUG: %s: after g_main_loop_run()\n", __FUNCTION__);
- printf ("DEBUG: %s: Finished\n", __FUNCTION__);
- g_main_loop_unref (data->loop);
-
- g_slice_free (IdlePasswordRequest, data);
+ g_signal_emit (G_OBJECT(account_store), signals[PASSWORD_REQUESTED_SIGNAL], 0,
+ server_account_id, /* server_account_name */
+ username, password, cancel, remember);
}
/* This callback will be called by Tinymail when it needs the password
modest_server_account_get_has_password (priv->account_mgr, server_account_name);
printf ("DEBUG: modest: %s: settings_have_password=%d\n", __FUNCTION__, settings_have_password);
if (settings_have_password) {
-
-
/* The password must be wrong, so show the account settings dialog so it can be corrected: */
- /* We show it in the main loop, because this function might not be in the main loop. */
- g_object_ref (account); /* unrefed in the idle handler. */
- g_idle_add (on_idle_wrong_password, account);
+ show_wrong_password_dialog (account);
if (cancel)
*cancel = TRUE;
if (already_asked) {
/* Show an info banner, before we show the protected password dialog: */
- g_idle_add (on_idle_wrong_password_warning_only, NULL);
+ show_password_warning_only();
}
- request_password_in_main_loop_and_wait (self, account_id,
+ request_password_and_wait (self, account_id,
&username, &pwd, cancel, &remember);
if (!*cancel) {
G_OBJECT_CLASS(parent_class)->finalize (obj);
}
+gboolean volume_path_is_mounted (const gchar* path)
+{
+ g_return_val_if_fail (path, FALSE);
+
+ gboolean result = FALSE;
+ gchar * path_as_uri = g_filename_to_uri (path, NULL, NULL);
+ g_return_val_if_fail (path_as_uri, FALSE);
+
+ /* Get the monitor singleton: */
+ GnomeVFSVolumeMonitor *monitor = gnome_vfs_get_volume_monitor();
+
+ /* This seems like a simpler way to do this, but it returns a
+ * GnomeVFSVolume even if the drive is not mounted: */
+ /*
+ GnomeVFSVolume *volume = gnome_vfs_volume_monitor_get_volume_for_path (monitor,
+ MODEST_MCC1_VOLUMEPATH);
+ if (volume) {
+ gnome_vfs_volume_unref(volume);
+ }
+ */
+
+ /* Get the mounted volumes from the monitor: */
+ GList *list = gnome_vfs_volume_monitor_get_mounted_volumes (monitor);
+ GList *iter = list;
+ for (iter = list; iter; iter = g_list_next (iter)) {
+ GnomeVFSVolume *volume = (GnomeVFSVolume*)iter->data;
+ if (volume) {
+ /*
+ char *display_name =
+ gnome_vfs_volume_get_display_name (volume);
+ printf ("volume display name=%s\n", display_name);
+ g_free (display_name);
+ */
+
+ char *uri =
+ gnome_vfs_volume_get_activation_uri (volume);
+ /* printf (" uri=%s\n", uri); */
+ if (uri && (strcmp (uri, path_as_uri) == 0))
+ result = TRUE;
+
+ g_free (uri);
+
+ gnome_vfs_volume_unref (volume);
+ }
+ }
+
+ g_list_free (list);
+
+ g_free (path_as_uri);
+
+ return result;
+}
ModestTnyAccountStore*
modest_tny_account_store_new (ModestAccountMgr *account_mgr,
tny_list_append (priv->store_accounts, G_OBJECT(local_account));
g_object_unref (local_account);
- /* Add the other remote accounts. Do this before adding the
+ /* Add the other remote accounts. Do this after adding the
local account, because we need to add our outboxes to the
global OUTBOX hosted in the local account */
add_existing_accounts (MODEST_TNY_ACCOUNT_STORE (obj));
-
+
+
+ /* Create the memory card account if the card is mounted: */
+
+ /* This is a singleton, so it does not need to be unrefed. */
+ if (volume_path_is_mounted (MODEST_MCC1_VOLUMEPATH)) {
+ /* It is mounted: */
+ add_mmc_account (MODEST_TNY_ACCOUNT_STORE (obj), FALSE /* don't emit the insert signal. */);
+ }
+
return MODEST_TNY_ACCOUNT_STORE(obj);
}
* Obviously, we need tinymail to use more specific error codes instead,
* so we know what buttons to show. */
- /* TODO: Do this in the main context: */
GtkWidget *dialog = GTK_WIDGET (hildon_note_new_confirmation (GTK_WINDOW (main_window),
prompt));
const int response = gtk_dialog_run (GTK_DIALOG (dialog));
} else {
/* Just show the error text and use the default response: */
- modest_maemo_show_information_note_in_main_context_and_forget (GTK_WINDOW (main_window),
+ modest_maemo_show_information_note_and_forget(GTK_WINDOW (main_window),
prompt);
}
/* Get the connection-specific transport acccount, if any: */
ModestAccountMgr *account_manager = modest_runtime_get_account_mgr ();
+
+ /* Check if this account has connection-specific SMTP enabled */
+ if (!modest_account_mgr_get_use_connection_specific_smtp (account_manager, account_name)) {
+ return NULL;
+ }
+
gchar* server_account_name = modest_account_mgr_get_connection_specific_smtp (account_manager,
account_name, connection_name);
return NULL;
/* Get the connection-specific transport acccount, if any: */
+ /* Note: This gives us a reference: */
TnyAccount *account =
get_smtp_specific_transport_account_for_open_connection (self, account_name);
/* The special local folders don't have transport accounts. */
if (strcmp (account_name, MODEST_LOCAL_FOLDERS_ACCOUNT_ID) == 0)
account = NULL;
- else
+ else {
+ /* Note: This gives us a reference: */
account = modest_tny_account_store_get_server_account (self, account_name,
TNY_ACCOUNT_TYPE_TRANSPORT);
+ }
}
-
+
+ /* returns a reference. */
return account;
}