* Added "queue-empty" signal to the mail operation queue
[modest] / src / modest-runtime.c
index f67db37..66e34b2 100644 (file)
 #include <modest-account-mgr.h>
 #include <modest-account-mgr-helpers.h>
 #include <modest-icon-names.h>
+#include <modest-ui-actions.h>
 
-static ModestSingletons *_singletons = NULL;
+static ModestSingletons       *_singletons    = NULL;
+
+// we get the account store here instead of in Singletons
+// as it leads to various chicken & problems with initialization
+static ModestTnyAccountStore  *_account_store  = NULL;
+
+/* Signal handlers for the send queues */
+static GSList *_sig_handlers = NULL;
 
 /*
  * private functions declared in modest-runtime-priv.h -
@@ -66,7 +74,7 @@ modest_runtime_init (void)
                g_printerr ("modest: failed to create singletons\n");
                return FALSE;
        }
-
+       
        return TRUE;
 }
 
@@ -77,10 +85,22 @@ modest_runtime_uninit (void)
                return TRUE;    /* uninit maybe called if runtime_init failed */
        
        g_return_val_if_fail (MODEST_IS_SINGLETONS(_singletons), FALSE);
+       modest_runtime_verify_object_last_ref(_singletons,"");
        g_object_unref(G_OBJECT(_singletons));
-       modest_runtime_verify_object_death(_singletons,"");
        _singletons = NULL;
-               
+
+       if (_account_store) {
+               modest_runtime_verify_object_last_ref(_account_store,"");
+               g_object_unref(G_OBJECT(_account_store));
+               _account_store = NULL;
+       }
+
+       
+       if (_sig_handlers) {
+               modest_signal_mgr_disconnect_all_and_destroy (_sig_handlers);
+               _sig_handlers = NULL;
+       }
+       
        return TRUE;
 }
 /*-----------------------------------------------------------------------------*/
@@ -93,12 +113,28 @@ modest_runtime_get_account_mgr   (void)
        return modest_singletons_get_account_mgr (_singletons);
 }
 
-ModestTnyAccountStore*
-modest_runtime_get_account_store   (void)
+ModestEmailClipboard*
+modest_runtime_get_email_clipboard   (void)
 {
        g_return_val_if_fail (_singletons, NULL);
-       return modest_singletons_get_account_store (_singletons);
+       return modest_singletons_get_email_clipboard (_singletons);
+}
 
+ModestTnyAccountStore*
+modest_runtime_get_account_store   (void)
+{
+       // we get the account store here instead of in Singletons
+        // as it leads to various chicken & problems with initialization
+       g_return_val_if_fail (_singletons, NULL);       
+       if (!_account_store) {
+               _account_store  = modest_tny_account_store_new (modest_runtime_get_account_mgr(),
+                                                               modest_runtime_get_device());
+               if (!_account_store) {
+                       g_printerr ("modest: cannot create modest tny account store instance\n");
+                       return NULL;
+               }
+       }
+       return _account_store;
 }
 
 ModestConf*
@@ -155,14 +191,45 @@ modest_runtime_get_send_queue  (TnyTransportAccount *account)
        send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
                                                       MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
 
+       /* Each modest account has its own send queue.
+        * Note that each modest account will have its own outbox folder, 
+        * returned by TnySendQueue::get_outbox_func().
+        */
        if (!g_hash_table_lookup_extended (send_queue_cache, account, &orig_key, &send_queue)) {
+               /* Note that this send queue will start sending messages from its outbox 
+                * as soon as it is instantiated: */
                send_queue = (gpointer)modest_tny_send_queue_new (TNY_CAMEL_TRANSPORT_ACCOUNT(account));
-               g_hash_table_insert (send_queue_cache, account, send_queue);
+
+               _sig_handlers = 
+                       modest_signal_mgr_connect (_sig_handlers, 
+                                                  send_queue, 
+                                                  "error_happened",
+                                                  G_CALLBACK (modest_ui_actions_on_send_queue_error_happened), 
+                                                  NULL);
+
+               _sig_handlers = 
+                       modest_signal_mgr_connect (_sig_handlers, 
+                                                  send_queue, 
+                                                  "status_changed",
+                                                  G_CALLBACK (modest_ui_actions_on_send_queue_status_changed), 
+                                                  NULL);
+
+
+               g_hash_table_insert (send_queue_cache, 
+                                    g_object_ref (account), 
+                                    g_object_ref (send_queue));
        }
 
        return MODEST_TNY_SEND_QUEUE(send_queue);
 }
 
+void modest_runtime_remove_all_send_queues ()
+{
+       ModestCacheMgr *cache_mgr = modest_singletons_get_cache_mgr (_singletons);
+       
+       modest_cache_mgr_flush (cache_mgr, MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
+}
+
 ModestWindowMgr *
 modest_runtime_get_window_mgr (void)
 {