static void modest_tny_account_store_forget_password_in_memory (ModestTnyAccountStore *self,
const gchar *server_account_name);
-static void add_connection_specific_transport_accounts (ModestTnyAccountStore *self,
- const gchar *account_name);
+static void add_connection_specific_transport_accounts (ModestTnyAccountStore *self);
/* list my signals */
enum {
TnyList *store_accounts;
TnyList *transport_accounts;
TnyList *store_accounts_outboxes;
+
+ /* Matches transport accounts and outbox folder */
+ GHashTable *outbox_of_transport;
};
#define MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
priv->session = NULL;
priv->device = NULL;
+ priv->outbox_of_transport =
+ g_hash_table_new_full (g_direct_hash,
+ g_direct_equal,
+ NULL,
+ NULL);
+
/* An in-memory store of passwords,
* for passwords that are not remembered in the configuration,
* so they need to be asked for from the user once in each session:
* so we can avoid showing the account settings twice for the same modest account: */
priv->account_settings_dialog_hash = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, NULL);
-
+
/* 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. */
priv->password_hash = NULL;
}
+ if (priv->account_settings_dialog_hash) {
+ g_hash_table_destroy (priv->account_settings_dialog_hash);
+ priv->account_settings_dialog_hash = NULL;
+ }
+
+ if (priv->outbox_of_transport) {
+ g_hash_table_destroy (priv->outbox_of_transport);
+ priv->outbox_of_transport = NULL;
+ }
+
+
/* Disconnect VFS signals */
volume_monitor = gnome_vfs_get_volume_monitor ();
if (g_signal_handler_is_connected (volume_monitor,
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,
/* Create the memory card account if the card is mounted: */
/* This is a singleton, so it does not need to be unrefed. */
- GnomeVFSVolumeMonitor* monitor = gnome_vfs_get_volume_monitor();
- GnomeVFSVolume *volume = gnome_vfs_volume_monitor_get_volume_for_path (monitor,
- MODEST_MCC1_VOLUMEPATH);
- if (volume) {
+ if (volume_path_is_mounted (MODEST_MCC1_VOLUMEPATH)) {
/* It is mounted: */
-
- /* TODO: Reneable this. Apaprently it causes a hang: */
- #if 0
add_mmc_account (MODEST_TNY_ACCOUNT_STORE (obj), FALSE /* don't emit the insert signal. */);
- #endif
- gnome_vfs_volume_unref(volume);
}
return MODEST_TNY_ACCOUNT_STORE(obj);
case TNY_ACCOUNT_ERROR_TRY_CONNECT_AUTHENTICATION_NOT_SUPPORTED:
g_debug ("%s: Handling GError domain=%d, code=%d (authentication not supported), message=%s",
__FUNCTION__, error->domain, error->code, error->message);
- /* TODO: This needs a logical ID for the string: */
+ /*
+ A more helpful error message than what the UI spec wants
prompt = g_strdup_printf(
_("Incorrect Account Settings:\nThe secure authentication method is not supported.\n%s"),
error->message);
+ */
+
+ /* This is "Secure connection failed", even though the logical ID has _certificate_ in the name: */
+ prompt = g_strdup (_("mail_ni_ssl_certificate_error"));
+
break;
case TNY_ACCOUNT_ERROR_TRY_CONNECT_CERTIFICATE:
g_debug ("%s: Handling GError domain=%d, code=%d (certificatae), message=%s",
__FUNCTION__, error->domain, error->code, error->message);
+
+ /* TODO: This needs a logical ID and/or some specified way to ask the different certificate questions: */
prompt = g_strdup_printf(
_("Certificate Problem:\n%s"),
error->message);
/* TODO: Remove the internal error message for the real release.
* This is just so the testers can give us more information: */
+ /* However, I haven't seen this for a few weeks, so maybe the users
+ * will never see it. murrayc. */
/* prompt = _("Modest account not yet fully configured."); */
prompt = g_strdup_printf(
"%s\n (Internal error message, often very misleading):\n%s",
static TnyAccount*
get_smtp_specific_transport_account_for_open_connection (ModestTnyAccountStore *self,
- const gchar *account_name)
+ const gchar *account_name)
{
/* Get the current connection: */
TnyDevice *device = modest_runtime_get_device ();
return NULL;
g_return_val_if_fail (self, NULL);
- g_return_val_if_fail (account_name, NULL);
#ifdef MODEST_PLATFORM_MAEMO
/* 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);
+ connection_name);
/* printf ("DEBUG: %s: server_account_name=%s\n", __FUNCTION__, server_account_name); */
if (!server_account_name) {
tny_list_append (priv->transport_accounts, G_OBJECT (transport_account));
/* Add connection-specific transport accounts */
- add_connection_specific_transport_accounts (self, account);
+ add_connection_specific_transport_accounts (self);
/* Create per account local outbox */
account_outbox =
folders = tny_simple_list_new ();
tny_folder_store_get_folders (TNY_FOLDER_STORE (account_outbox),
folders, NULL, NULL);
- g_assert (tny_list_get_length (folders) == 1);
+ if (tny_list_get_length (folders) != 1)
+ g_warning ("%s: there should be only one outbox folder, but found %d!",
+ __FUNCTION__, tny_list_get_length (folders));
iter_folders = tny_list_create_iterator (folders);
per_account_outbox = TNY_FOLDER (tny_iterator_get_current (iter_folders));
g_object_unref (iter_folders);
+ g_object_unref (folders);
g_object_unref (account_outbox);
/* Add the outbox of the new per-account-local-outbox
local_account = modest_tny_account_store_get_local_folders_account (MODEST_TNY_ACCOUNT_STORE (self));
modest_tny_local_folders_account_add_folder_to_outbox (MODEST_TNY_LOCAL_FOLDERS_ACCOUNT (local_account),
per_account_outbox);
+ /* Add the pair to the hash table */
+ g_hash_table_insert (priv->outbox_of_transport,
+ transport_account,
+ per_account_outbox);
+
+ /* Notify that the local folders account chaned */
+ if (notify)
+ g_signal_emit (G_OBJECT (self), signals [ACCOUNT_CHANGED_SIGNAL], 0, local_account);
+
g_object_unref (local_account);
g_object_unref (per_account_outbox);
/* If there was any problem creating the account, for example,
with the configuration system this could not exist */
if (transport_account) {
+ TnyAccount *local_account = NULL;
+ TnyFolder *outbox = NULL;
+ ModestTnyAccountStorePrivate *priv = NULL;
+
+ /* Remove the OUTBOX of the account from the global outbox */
+ priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
+ outbox = g_hash_table_lookup (priv->outbox_of_transport, transport_account);
+
+ if (TNY_IS_FOLDER (outbox)) {
+ local_account = modest_tny_account_store_get_local_folders_account (self);
+ modest_tny_local_folders_account_remove_folder_from_outbox (MODEST_TNY_LOCAL_FOLDERS_ACCOUNT (local_account),
+ outbox);
+ g_hash_table_remove (priv->outbox_of_transport, transport_account);
+
+ /* Notify the change in the local account */
+ g_signal_emit (G_OBJECT (self), signals [ACCOUNT_CHANGED_SIGNAL], 0, local_account);
+ g_object_unref (local_account);
+ } else {
+ g_warning ("Removing a transport account that has no outbox");
+ }
+
/* Notify the observers */
g_signal_emit (G_OBJECT (self), signals [ACCOUNT_REMOVED_SIGNAL], 0, transport_account);
g_object_unref (transport_account);
}
static void
-add_connection_specific_transport_accounts (ModestTnyAccountStore *self,
- const gchar *account_name)
+add_connection_specific_transport_accounts (ModestTnyAccountStore *self)
{
ModestTnyAccountStorePrivate *priv = NULL;
GSList *list_specifics = NULL, *iter = NULL;
priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
- list_specifics = modest_account_mgr_get_list (priv->account_mgr,
- account_name,
- MODEST_ACCOUNT_CONNECTION_SPECIFIC_SMTP_LIST,
- MODEST_CONF_VALUE_STRING, FALSE);
+ ModestConf *conf = modest_runtime_get_conf ();
+
+ GError *err = NULL;
+ list_specifics = modest_conf_get_list (conf,
+ MODEST_CONF_CONNECTION_SPECIFIC_SMTP_LIST,
+ MODEST_CONF_VALUE_STRING, &err);
+ if (err) {
+ g_printerr ("modest: %s: error getting list: %s\n.", __FUNCTION__, err->message);
+ g_error_free (err);
+ err = NULL;
+ }
/* Look at each connection-specific transport account for the
* modest account: */
priv->session,
transport_account_name);
if (tny_account) {
- modest_tny_account_set_parent_modest_account_name_for_server_account (tny_account,
- account_name);
g_object_set_data (G_OBJECT(tny_account),
"account_store",
(gpointer)self);