* add checks that session != NULL
[modest] / src / modest-tny-account.c
index 61e61c5..8b2f70d 100644 (file)
@@ -32,6 +32,7 @@
 #include <modest-tny-account-store.h>
 #include <modest-tny-local-folders-account.h>
 #include <modest-runtime.h>
+#include <modest-platform.h>
 #include <tny-simple-list.h>
 #include <modest-tny-folder.h>
 #include <modest-tny-outbox-account.h>
@@ -123,6 +124,34 @@ modest_tny_account_get_special_folder (TnyAccount *account,
        return special_folder;
 }
 
+static void
+on_connection_status_changed (TnyAccount *account, TnyConnectionStatus status, gpointer user_data)
+{
+       printf ("DEBUG: %s: status=%d\n", __FUNCTION__, status);
+       
+       if (status == TNY_CONNECTION_STATUS_DISCONNECTED) {
+               /* We are trying to use the network with an account, 
+                * 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:
+                */
+               modest_platform_connect_and_wait(NULL); 
+       } else if (status == TNY_CONNECTION_STATUS_CONNECTED_BROKEN) {
+               printf ("DEBUG: %s: Connection broken. Forcing TnyDevice offline.\n", 
+                       __FUNCTION__);
+                       
+               /* Something went wrong during some network operation.
+                * Stop trying to use the network now,
+                * by forcing accounts into offline mode:
+                * 
+                * When libconic reconnects, it will set the device back online again,
+                * regardless of it being forced offline before.
+                */
+               TnyDevice *device = modest_runtime_get_device ();
+               tny_device_force_offline (device);
+       }
+}
+
 /* Camel options: */
 
 /* These seem to be listed in 
@@ -216,6 +245,11 @@ modest_tny_account_new_from_server_account (ModestAccountMgr *account_mgr,
        }
        tny_account_set_id (tny_account, account_data->account_name);
 
+       /* 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",
+                       G_CALLBACK (on_connection_status_changed), NULL);
+
        /* Proto */
        const gchar* proto_name =
                modest_protocol_info_get_transport_store_protocol_name(account_data->proto);
@@ -377,6 +411,7 @@ modest_tny_account_new_from_account (ModestAccountMgr *account_mgr, const gchar
 
        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) {
@@ -448,6 +483,9 @@ typedef struct
        gpointer user_data;
 } GetMmcAccountNameData;
 
+
+
+
 /* Gets the memory card name: */
 static void 
 on_modest_file_system_info(HildonFileSystemInfoHandle *handle,
@@ -460,30 +498,23 @@ on_modest_file_system_info(HildonFileSystemInfoHandle *handle,
                g_warning ("%s: error=%s", __FUNCTION__, error->message);
        }
        
-       if (error) {
-/*             printf ("  DEBUG: %s: error=%s\n", __FUNCTION__, error->message); */
-       }
+       TnyAccount *account = TNY_ACCOUNT (callback_data->account);
+       
+       const gchar *previous_display_name = NULL;
        
        const gchar *display_name = NULL;
        if (!error && info) {
                display_name = hildon_file_system_info_get_display_name(info);
+               previous_display_name = tny_account_get_name (account);
        }
-       
-       TnyAccount *account = TNY_ACCOUNT (callback_data->account);
-       
-       const gchar * previous_display_name = tny_account_get_name (account);
-       
-       /* Use the new name if it is different: */
-       if (display_name && 
-               (previous_display_name && (strcmp (display_name, previous_display_name) != 0))) {
-               /* printf ("DEBUG: %s: display name=%s\n", __FUNCTION__,  display_name); */
-               tny_account_set_name (account, display_name);
+                
+       /* printf ("DEBUG: %s: display name=%s\n", __FUNCTION__,  display_name); */
+       tny_account_set_name (account, display_name);
                
-               /* Inform the application that the name is now ready: */
-               if (callback_data->callback)
-                       (*(callback_data->callback)) (callback_data->account, 
-                               callback_data->user_data);
-       }
+       /* Inform the application that the name is now ready: */
+       if (callback_data->callback)
+               (*(callback_data->callback)) (callback_data->account, 
+                       callback_data->user_data);
        
        g_object_unref (callback_data->account);
        g_slice_free (GetMmcAccountNameData, callback_data);
@@ -491,31 +522,54 @@ on_modest_file_system_info(HildonFileSystemInfoHandle *handle,
 
 void modest_tny_account_get_mmc_account_name (TnyStoreAccount* self, ModestTnyAccountGetMmcAccountNameCallback callback, gpointer user_data)
 {
+       /* Just use the hard-coded path for the single memory card,
+        * rather than try to figure out the path to the specific card by 
+        * looking at the maildir URI:
+        */
+       const gchar *uri_real = MODEST_MCC1_VOLUMEPATH_URI;
+
+       /*
        gchar* uri = tny_account_get_url_string (TNY_ACCOUNT (self));
        if (!uri)
                return;
+
+       TODO: This gets the name of the folder, but we want the name of the volume.
+       gchar *uri_real = NULL;
+       const gchar* prefix = "maildir://localhost/";
+       if ((strstr (uri, prefix) == uri) && (strlen(uri) > strlen(prefix)) )
+               uri_real = g_strconcat ("file:///", uri + strlen (prefix), NULL);
+       */
+
+       if (uri_real) {
+               //This is freed in the callback:
+               GetMmcAccountNameData * callback_data = g_slice_new0(GetMmcAccountNameData);
+               callback_data->account = self;
+               g_object_ref (callback_data->account); /* Unrefed when we destroy the struct. */
+               callback_data->callback = callback;
+               callback_data->user_data = user_data;
                
-       //This is freed in the callback:
-       GetMmcAccountNameData * callback_data = g_slice_new0(GetMmcAccountNameData);
-       callback_data->account = self;
-       g_object_ref (callback_data->account); /* Unrefed when we destroy the struct. */
-       callback_data->user_data = user_data;
-               
-       /* TODO: gnome_vfs_volume_get_display_name() does not return 
-        * the same string. But why not? Why does hildon needs its own 
-        * function for this?
-        */
-       hildon_file_system_info_async_new(uri, 
-               on_modest_file_system_info, callback_data /* user_data */);
+               /* TODO: gnome_vfs_volume_get_display_name() does not return 
+                * the same string. But why not? Why does hildon needs its own 
+                * function for this?
+                */
+               /* printf ("DEBUG: %s Calling hildon_file_system_info_async_new() with URI=%s\n", __FUNCTION__, uri_real); */
+               hildon_file_system_info_async_new(uri_real, 
+                       on_modest_file_system_info, callback_data /* user_data */);
+
+               /* g_free (uri_real); */
+       }
 
-       g_free (uri);
+       /* g_free (uri); */
 }
 
                                
 
 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);
 
@@ -524,6 +578,8 @@ modest_tny_account_new_for_local_folders (ModestAccountMgr *account_mgr, TnySess
        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 
@@ -609,10 +665,13 @@ modest_tny_account_new_for_local_folders (ModestAccountMgr *account_mgr, TnySess
 
 
 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,