* src/modest-tny-account-store.c
[modest] / src / modest-tny-account-store.c
index a1e31dd..e46ca55 100644 (file)
@@ -290,6 +290,7 @@ modest_tny_account_store_instance_init (ModestTnyAccountStore *obj)
                                                              
        /* 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), 
@@ -324,6 +325,32 @@ foreach_account_append_to_list (gpointer data,
 /********************************************************************/
 /*           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, 
@@ -341,21 +368,9 @@ on_vfs_volume_mounted(GnomeVFSVolumeMonitor *volume_monitor,
        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);
 }
 
@@ -835,6 +850,58 @@ modest_tny_account_store_finalize (GObject *obj)
        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, 
@@ -881,11 +948,20 @@ 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);
 }
 
@@ -1337,6 +1413,12 @@ get_smtp_specific_transport_account_for_open_connection (ModestTnyAccountStore *
        
        /*  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);
 
@@ -1373,6 +1455,7 @@ modest_tny_account_store_get_transport_account_for_open_connection (ModestTnyAcc
                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);
                        
@@ -1382,11 +1465,14 @@ modest_tny_account_store_get_transport_account_for_open_connection (ModestTnyAcc
                /* 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;
 }