X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-runtime.c;h=2097db50c4e6cc8c8201c95287b2d894aa66f439;hp=17347e811a34256fdb3a05cd4fb48c3581eb87f4;hb=e45958deaf9701399c552ea0d84c2447efacd4ca;hpb=3e7a3b4e5759d63285d8795435b2ceedaf63b216 diff --git a/src/modest-runtime.c b/src/modest-runtime.c index 17347e8..2097db5 100644 --- a/src/modest-runtime.c +++ b/src/modest-runtime.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -44,154 +45,79 @@ #include #include #include +#include +#include -static gboolean init_header_columns (ModestConf *conf, gboolean overwrite); -static gboolean init_local_folders (void); -static gboolean init_default_account_maybe (ModestAccountMgr *acc_mgr); -static void init_i18n (void); -static void init_stock_icons (void); -static void init_debug_g_type (void); -static void init_debug_logging (void); -static void init_test_accounts (ModestAccountMgr *acc_mgr); +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; -static ModestSingletons *_singletons = NULL; - +/* Signal handlers for the send queues */ +static GSList *_sig_handlers = NULL; /* - * defaults for the column headers + * private functions declared in modest-runtime-priv.h - + * only to be called from modest-init.c */ -typedef struct { - ModestHeaderViewColumn col; - guint width; -} FolderCols; - -static const FolderCols INBOX_COLUMNS_DETAILS[] = { - {MODEST_HEADER_VIEW_COLUMN_MSGTYPE, 40}, - {MODEST_HEADER_VIEW_COLUMN_ATTACH, 40}, - {MODEST_HEADER_VIEW_COLUMN_FROM, 80}, - {MODEST_HEADER_VIEW_COLUMN_SUBJECT, 80}, - {MODEST_HEADER_VIEW_COLUMN_RECEIVED_DATE, 60}, - {MODEST_HEADER_VIEW_COLUMN_SIZE, 50} -}; -static const FolderCols INBOX_COLUMNS_TWOLINES[] = { - {MODEST_HEADER_VIEW_COLUMN_MSGTYPE, 40}, - {MODEST_HEADER_VIEW_COLUMN_ATTACH, 40}, - {MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_IN, 200} -}; - -static const FolderCols OUTBOX_COLUMNS_DETAILS[] = { - {MODEST_HEADER_VIEW_COLUMN_MSGTYPE, 40}, - {MODEST_HEADER_VIEW_COLUMN_ATTACH, 40}, - {MODEST_HEADER_VIEW_COLUMN_TO, 80}, - {MODEST_HEADER_VIEW_COLUMN_SUBJECT, 80}, - {MODEST_HEADER_VIEW_COLUMN_SENT_DATE, 80}, - {MODEST_HEADER_VIEW_COLUMN_SIZE, 50} -}; -static const FolderCols OUTBOX_COLUMNS_TWOLINES[] = { - {MODEST_HEADER_VIEW_COLUMN_MSGTYPE, 40}, - {MODEST_HEADER_VIEW_COLUMN_ATTACH, 40}, - {MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_OUT,200}, -}; - -static const TnyFolderType LOCAL_FOLDERS[] = { - TNY_FOLDER_TYPE_OUTBOX, - TNY_FOLDER_TYPE_DRAFTS, - TNY_FOLDER_TYPE_SENT, - TNY_FOLDER_TYPE_TRASH, - TNY_FOLDER_TYPE_ARCHIVE -}; - - +/*-----------------------------------------------------------------------------*/ gboolean modest_runtime_init (void) { - ModestSingletons *my_singletons; - gboolean reset; - if (_singletons) { - g_printerr ("modest: modest_runtime_init can only be called once\n"); - return FALSE; - } - - init_i18n(); - init_debug_g_type(); - init_debug_logging(); - - g_thread_init(NULL); - gdk_threads_init (); - - my_singletons = modest_singletons_new (); - if (!my_singletons) { - g_printerr ("modest: failed to initialize singletons\n"); + g_printerr ("modest: modest_runtime_init can only be run once\n"); return FALSE; } - if (!modest_platform_init()) { - modest_runtime_uninit (); - g_printerr ("modest: failed to run platform-specific initialization\n"); + _singletons = modest_singletons_new (); + if (!_singletons) { + g_printerr ("modest: failed to create singletons\n"); return FALSE; } - - /* based on the debug settings, we decide whether to overwrite old settings */ - reset = modest_runtime_get_debug_flags () & MODEST_RUNTIME_DEBUG_FACTORY_SETTINGS; - if (!init_header_columns(modest_singletons_get_conf (my_singletons), reset)) { - modest_runtime_uninit (); - g_printerr ("modest: failed to init header columns\n"); - return FALSE; - } - - if (!init_local_folders()) { - modest_runtime_uninit (); - g_printerr ("modest: failed to init local folders\n"); - return FALSE; - } - - if (!init_default_account_maybe(modest_singletons_get_account_mgr (my_singletons))) { - modest_runtime_uninit (); - g_printerr ("modest: failed to init default account\n"); - return FALSE; - } - - /* create the test accounts if the debug flag for that is set */ - if (modest_runtime_get_debug_flags () & MODEST_RUNTIME_DEBUG_TINY_TEST_ACCOUNTS) - init_test_accounts (modest_singletons_get_account_mgr (my_singletons)); - - /* don't initialize _singletons before all the other init stuff - * is done; thus, using any of the singleton stuff before - * runtime is fully init'ed is avoided - */ - _singletons = my_singletons; return TRUE; } - gboolean -modest_runtime_init_ui (gint argc, gchar** argv) +modest_runtime_uninit (void) { - if (!gtk_init_check(&argc, &argv)) { - g_printerr ("modest: failed to initialize graphical ui\n"); - return FALSE; + if (!_singletons) + return TRUE; /* uninit maybe called if runtime_init failed */ + + g_return_val_if_fail (MODEST_IS_SINGLETONS(_singletons), FALSE); + + g_debug ("%s: cleaning up", __FUNCTION__); + + if (_sig_handlers) { + modest_signal_mgr_disconnect_all_and_destroy (_sig_handlers); + _sig_handlers = NULL; } - init_stock_icons (); - return TRUE; -} + g_debug ("%s: cleaned up signal manager", __FUNCTION__); + MODEST_DEBUG_VERIFY_OBJECT_LAST_REF(_singletons,""); + g_object_unref(_singletons); + _singletons = NULL; -gboolean -modest_runtime_uninit (void) -{ - if (_singletons) { - g_object_unref (G_OBJECT(_singletons)); - _singletons = NULL; + g_debug ("%s: cleaned up singletons", __FUNCTION__); + + if (_account_store) { + MODEST_DEBUG_VERIFY_OBJECT_LAST_REF(_account_store,""); + g_object_unref(_account_store); + _account_store = NULL; } - modest_runtime_verify_object_death (_singletons, "_singletons"); + + g_debug ("%s: cleaned up the account store", __FUNCTION__); + + + g_debug ("%s: all cleaned up", __FUNCTION__); + return TRUE; } - +/*-----------------------------------------------------------------------------*/ + ModestAccountMgr* modest_runtime_get_account_mgr (void) @@ -200,12 +126,35 @@ modest_runtime_get_account_mgr (void) return modest_singletons_get_account_mgr (_singletons); } -ModestTnyAccountStore* -modest_runtime_get_account_store (void) +TnyStreamCache* +modest_runtime_get_images_cache (void) { g_return_val_if_fail (_singletons, NULL); - return modest_singletons_get_account_store (_singletons); + return modest_singletons_get_images_cache (_singletons); +} +ModestEmailClipboard* +modest_runtime_get_email_clipboard (void) +{ + g_return_val_if_fail (_singletons, NULL); + 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* @@ -248,15 +197,13 @@ modest_runtime_get_platform_factory (void) return modest_singletons_get_platform_factory (_singletons); } - - - ModestTnySendQueue* -modest_runtime_get_send_queue (TnyTransportAccount *account) +modest_runtime_get_send_queue (TnyTransportAccount *account, + gboolean create) { ModestCacheMgr *cache_mgr; GHashTable *send_queue_cache; - gpointer orig_key, send_queue; + gpointer orig_key = NULL, send_queue = NULL; g_return_val_if_fail (_singletons, NULL); g_return_val_if_fail (TNY_IS_TRANSPORT_ACCOUNT(account), NULL); @@ -265,16 +212,85 @@ modest_runtime_get_send_queue (TnyTransportAccount *account) send_queue_cache = modest_cache_mgr_get_cache (cache_mgr, MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE); - if (!g_hash_table_lookup_extended (send_queue_cache, account, &orig_key, &send_queue)) { - send_queue = (gpointer)modest_tny_send_queue_new (TNY_CAMEL_TRANSPORT_ACCOUNT(account)); - g_hash_table_insert (send_queue_cache, account, 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) && + create) { + /* Note that this send queue will start sending messages from its outbox + * as soon as it is instantiated: */ + send_queue = modest_tny_send_queue_new (TNY_CAMEL_TRANSPORT_ACCOUNT(account)); + + if (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), + send_queue); + } } - return MODEST_TNY_SEND_QUEUE(send_queue); + return (send_queue) ? MODEST_TNY_SEND_QUEUE(send_queue) : NULL; } +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); +} + +void +modest_runtime_remove_send_queue (TnyTransportAccount *account) +{ + ModestCacheMgr *cache_mgr; + GHashTable *send_queue_cache; + + g_return_if_fail (TNY_IS_TRANSPORT_ACCOUNT (account)); + g_return_if_fail (_singletons); + cache_mgr = modest_singletons_get_cache_mgr (_singletons); + send_queue_cache = modest_cache_mgr_get_cache (cache_mgr, + MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE); + + if (g_hash_table_lookup (send_queue_cache, account)) + g_hash_table_remove (send_queue_cache, account); +} + +ModestWindowMgr * +modest_runtime_get_window_mgr (void) +{ + g_return_val_if_fail (_singletons, NULL); + return modest_singletons_get_window_mgr (_singletons); +} + +ModestPluginFactory * +modest_runtime_get_plugin_factory (void) +{ + g_return_val_if_fail (_singletons, NULL); + return modest_singletons_get_plugin_factory (_singletons); +} + +ModestProtocolRegistry * +modest_runtime_get_protocol_registry (void) +{ + g_return_val_if_fail (_singletons, NULL); + return modest_singletons_get_protocol_registry (_singletons); +} /* http://primates.ximian.com/~federico/news-2006-04.html#memory-debugging-infrastructure*/ ModestRuntimeDebugFlags @@ -283,10 +299,10 @@ modest_runtime_get_debug_flags () static const GDebugKey debug_keys[] = { { "abort-on-warning", MODEST_RUNTIME_DEBUG_ABORT_ON_WARNING }, { "log-actions", MODEST_RUNTIME_DEBUG_LOG_ACTIONS }, - { "debug-objects", MODEST_RUNTIME_DEBUG_DEBUG_OBJECTS }, - { "debug-signals", MODEST_RUNTIME_DEBUG_DEBUG_SIGNALS }, + { "debug-objects", MODEST_RUNTIME_DEBUG_OBJECTS }, + { "debug-signals", MODEST_RUNTIME_DEBUG_SIGNALS }, { "factory-settings", MODEST_RUNTIME_DEBUG_FACTORY_SETTINGS}, - { "tiny-test-accounts", MODEST_RUNTIME_DEBUG_TINY_TEST_ACCOUNTS} + { "debug-code", MODEST_RUNTIME_DEBUG_CODE} }; const gchar *str; static ModestRuntimeDebugFlags debug_flags = -1; @@ -307,334 +323,3 @@ modest_runtime_get_debug_flags () - -/* NOTE: the exact details of this format are important, as they - * are also used in modest-widget-memory. FIXME: make a shared function - * for this with widget-memory - */ -static gboolean -save_header_settings (ModestConf *conf, TnyFolderType type, - ModestHeaderViewStyle style, const FolderCols* cols, - guint col_num, gboolean overwrite) -{ - int i; - gchar *key; - GString *str; - - g_return_val_if_fail (cols, FALSE); - - key = _modest_widget_memory_get_keyname_with_double_type ("header-view", - type, style, - MODEST_WIDGET_MEMORY_PARAM_COLUMN_WIDTH); - /* if we're not in overwrite mode, only write stuff it - * there was nothing before */ - if (!overwrite && modest_conf_key_exists(conf, key, NULL)) { - g_free (key); - return TRUE; - } - - /* the format is necessarily the same as the one in modest-widget-memory */ - str = g_string_new (NULL); - for (i = 0; i != col_num; ++i) - g_string_append_printf (str, "%d:%d ", - cols[i].col, cols[i].width); - - modest_conf_set_string (conf, key, str->str, NULL); - g_free (key); - g_string_free (str, TRUE); - - return TRUE; -} - -/** - * modest_init_header_columns: - * @overwrite: write the setting, even if it already exists - * - * will set defaults for the columns to show for folder, - * if there are no such settings yet (in ModestWidgetMemory) - * - * Returns: TRUE if succeeded, FALSE in case of error - */ -static gboolean -init_header_columns (ModestConf *conf, gboolean overwrite) -{ - int folder_type; - - for (folder_type = TNY_FOLDER_TYPE_UNKNOWN; - folder_type <= TNY_FOLDER_TYPE_CALENDAR; ++folder_type) { - - switch (folder_type) { - case TNY_FOLDER_TYPE_OUTBOX: - case TNY_FOLDER_TYPE_SENT: - case TNY_FOLDER_TYPE_DRAFTS: - save_header_settings (conf, folder_type, - MODEST_HEADER_VIEW_STYLE_DETAILS, - OUTBOX_COLUMNS_DETAILS, - G_N_ELEMENTS(OUTBOX_COLUMNS_DETAILS), - overwrite); - save_header_settings (conf, folder_type, - MODEST_HEADER_VIEW_STYLE_TWOLINES, - OUTBOX_COLUMNS_TWOLINES, - G_N_ELEMENTS(OUTBOX_COLUMNS_TWOLINES), - overwrite); - break; - - default: - save_header_settings (conf, folder_type, - MODEST_HEADER_VIEW_STYLE_DETAILS, - INBOX_COLUMNS_DETAILS, - G_N_ELEMENTS(INBOX_COLUMNS_DETAILS), - overwrite); - save_header_settings (conf, folder_type, - MODEST_HEADER_VIEW_STYLE_TWOLINES, - INBOX_COLUMNS_TWOLINES, - G_N_ELEMENTS(INBOX_COLUMNS_TWOLINES), - overwrite); - }; - } - return TRUE; -} - -/** - * init_local_folders: - * - * create the Local Folders folder under cache, if they - * do not exist yet. - * - * Returns: TRUE if the folder were already there, or - * they were created, FALSE otherwise - */ -static gboolean -init_local_folders (void) -{ - int i; - gchar *maildir_path; - static const gchar* maildirs[] = { - "cur", "new", "tmp" - }; - - maildir_path = modest_local_folder_info_get_maildir_path (); - - for (i = 0; i != G_N_ELEMENTS(LOCAL_FOLDERS); ++i) { - int j; - for (j = 0; j != G_N_ELEMENTS(maildirs); ++j) { - gchar *dir; - dir = g_build_filename (maildir_path, - modest_local_folder_info_get_type_name(LOCAL_FOLDERS[i]), - maildirs[j], - NULL); - if (g_mkdir_with_parents (dir, 0755) < 0) { - g_printerr ("modest: failed to create %s\n", dir); - g_free (dir); - g_free (maildir_path); - return FALSE; - } - g_free(dir); - } - } - - g_free (maildir_path); - return TRUE; -} - - - -static void -free_element (gpointer data, gpointer user_data) -{ - g_free (data); -} - - - -/** - * init_default_account_maybe: - * - * if there are accounts defined, but there is no default account, - * it will be defined. - * - * Returns: TRUE if there was a default account already, - * or one has been created or there are no accounts yet, - * returns FALSE in case of error - */ -static gboolean -init_default_account_maybe (ModestAccountMgr *acc_mgr) -{ - GSList *all_accounts = NULL; - gchar *default_account; - gboolean retval = TRUE; - - all_accounts = modest_account_mgr_account_names (acc_mgr); - if (all_accounts) { /* if there are any accounts, there should be a default one */ - default_account = - modest_account_mgr_get_default_account (acc_mgr); - if (!default_account) { - gchar *first_account; - g_printerr ("modest: no default account defined\n"); - first_account = (gchar*)all_accounts->data; - if ((retval = modest_account_mgr_set_default_account (acc_mgr, first_account))) - g_printerr ("modest: set '%s' as the default account\n", - first_account); - else - g_printerr ("modest: failed to set '%s' as the default account\n", - first_account); - g_free (default_account); - } - g_slist_foreach (all_accounts, free_element, NULL); - g_slist_free (all_accounts); - } - return retval; -} - - - -static void -init_debug_g_type (void) -{ - GTypeDebugFlags gflags; - ModestRuntimeDebugFlags mflags; - - gflags = 0; - mflags = modest_runtime_get_debug_flags (); - - if (mflags & MODEST_RUNTIME_DEBUG_DEBUG_OBJECTS) - gflags |= G_TYPE_DEBUG_OBJECTS; - if (mflags & MODEST_RUNTIME_DEBUG_DEBUG_SIGNALS) - gflags |= G_TYPE_DEBUG_SIGNALS; - - g_type_init_with_debug_flags (gflags); -} - -static void -init_debug_logging (void) -{ - ModestRuntimeDebugFlags mflags; - mflags = modest_runtime_get_debug_flags (); - - if (mflags & MODEST_RUNTIME_DEBUG_ABORT_ON_WARNING) - g_log_set_always_fatal (G_LOG_LEVEL_ERROR | - G_LOG_LEVEL_CRITICAL | - G_LOG_LEVEL_WARNING); -} - - -static void -init_i18n (void) -{ - bindtextdomain (GETTEXT_PACKAGE, MODEST_LOCALEDIR); - bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); - textdomain (GETTEXT_PACKAGE); - -} - - -/* - * This function registers our custom toolbar icons, so they can be - * themed. The idea of this function was taken from the gtk-demo - */ -static void -init_stock_icons (void) -{ - static gboolean registered = FALSE; - - if (!registered) { - GdkPixbuf *pixbuf; - GtkIconFactory *factory; - gint i; - - static GtkStockItem items[] = { - { MODEST_STOCK_MAIL_SEND, "send mail", 0, 0, NULL }, - { MODEST_STOCK_NEW_MAIL, "new mail", 0, 0, NULL }, -/* { MODEST_STOCK_SEND_RECEIVE, "send receive", 0, 0, NULL }, */ - { MODEST_STOCK_REPLY, "reply", 0, 0, NULL }, - { MODEST_STOCK_REPLY_ALL, "reply all", 0, 0, NULL }, - { MODEST_STOCK_FORWARD, "forward", 0, 0, NULL }, - { MODEST_STOCK_DELETE, "delete", 0, 0, NULL }, -/* { MODEST_STOCK_NEXT, "next", 0, 0, NULL }, */ -/* { MODEST_STOCK_PREV, "prev", 0, 0, NULL }, */ -/* { MODEST_STOCK_STOP, "stop", 0, 0, NULL } */ - }; - - static gchar *items_names [] = { - MODEST_TOOLBAR_ICON_MAIL_SEND, - MODEST_TOOLBAR_ICON_NEW_MAIL, -/* MODEST_TOOLBAR_ICON_SEND_RECEIVE, */ - MODEST_TOOLBAR_ICON_REPLY, - MODEST_TOOLBAR_ICON_REPLY_ALL, - MODEST_TOOLBAR_ICON_FORWARD, - MODEST_TOOLBAR_ICON_DELETE, -/* MODEST_TOOLBAR_ICON_NEXT, */ -/* MODEST_TOOLBAR_ICON_PREV, */ -/* MODEST_TOOLBAR_ICON_STOP */ - }; - - registered = TRUE; - - /* Register our stock items */ - gtk_stock_add (items, G_N_ELEMENTS (items)); - - /* Add our custom icon factory to the list of defaults */ - factory = gtk_icon_factory_new (); - gtk_icon_factory_add_default (factory); - - /* Register icons to accompany stock items */ - for (i = 0; i < G_N_ELEMENTS (items); i++) { - pixbuf = NULL; - pixbuf = gdk_pixbuf_new_from_file (items_names[i], NULL); - - if (pixbuf != NULL) { - GtkIconSet *icon_set; - GdkPixbuf *transparent; - - transparent = gdk_pixbuf_add_alpha (pixbuf, TRUE, 0xff, 0xff, 0xff); - - icon_set = gtk_icon_set_new_from_pixbuf (transparent); - gtk_icon_factory_add (factory, items[i].stock_id, icon_set); - gtk_icon_set_unref (icon_set); - g_object_unref (pixbuf); - g_object_unref (transparent); - } - else - g_warning ("failed to load %s icon", items_names[i]); - } - /* Drop our reference to the factory, GTK will hold a reference. */ - g_object_unref (factory); - } -} - - -static void -init_test_accounts (ModestAccountMgr *acc_mgr) -{ - const gchar *imap_test = "TnyImapTest"; - const gchar *pop_test = "TnyPopTest"; - const gchar *smtp_test = "TnySmtpTest"; - - if (!modest_account_mgr_account_exists (acc_mgr, imap_test, FALSE)) - modest_account_mgr_add_server_account (acc_mgr, - imap_test, - "imap2.tinymail.org", - "tnytest", "tnytest", - MODEST_PROTOCOL_STORE_IMAP, - MODEST_PROTOCOL_SECURITY_NONE, - MODEST_PROTOCOL_AUTH_NONE); - if (!modest_account_mgr_account_exists (acc_mgr, pop_test, FALSE)) - modest_account_mgr_add_server_account (acc_mgr, - pop_test, - "imap2.tinymail.org", - "tnytest", "tnytest", - MODEST_PROTOCOL_STORE_POP, - MODEST_PROTOCOL_SECURITY_NONE, - MODEST_PROTOCOL_AUTH_NONE); - if (!modest_account_mgr_account_exists (acc_mgr, smtp_test, FALSE)) - modest_account_mgr_add_server_account (acc_mgr, - smtp_test, - "127.0.0.1", - NULL,NULL, - MODEST_PROTOCOL_TRANSPORT_SMTP, - MODEST_PROTOCOL_SECURITY_NONE, - MODEST_PROTOCOL_AUTH_NONE); - - modest_account_mgr_add_account (acc_mgr, imap_test, imap_test, smtp_test); - modest_account_mgr_add_account (acc_mgr, pop_test, pop_test, smtp_test); -}