* cleanup: moved init stuff to modest-init.[ch]
authorDirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>
Sat, 21 Apr 2007 08:59:01 +0000 (08:59 +0000)
committerDirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>
Sat, 21 Apr 2007 08:59:01 +0000 (08:59 +0000)
* cleanup: removed the tny test account stuff; it's not needed anymore
  as the account setup works
* add some sanity checks to make sure runtime/init/singletons are really only
  started once
* fixed the appname problem: g_set_application_name should be called *after* gtk_init
* made appname platform specific; for product we will call it "Email", otherwise it will be knows as "modest"

pmo-trunk-r1623

12 files changed:
src/Makefile.am
src/gnome/modest-platform.c
src/maemo/modest-main-window.c
src/maemo/modest-platform.c
src/modest-init.c [new file with mode: 0644]
src/modest-init.h [new file with mode: 0644]
src/modest-main.c
src/modest-platform.h
src/modest-runtime-priv.h [new file with mode: 0644]
src/modest-runtime.c
src/modest-runtime.h
src/modest-singletons.c

index 6ac9aed..c0203f1 100644 (file)
@@ -1,6 +1,6 @@
 #
 # Makefile.am
-# Time-stamp: <2007-04-10 10:58:05 (djcb)>
+# Time-stamp: <2007-04-21 11:15:36 (djcb)>
 SUBDIRS=$(MODEST_PLATFORM) widgets dbus_api
 DIST_SUBDIRS = widgets gnome maemo
 
@@ -43,6 +43,8 @@ modest_SOURCES=\
        modest-error.h \
        modest-formatter.c \
        modest-formatter.h \
+       modest-init.c \
+       modest-init.h \
        modest-local-folder-info.c \
        modest-local-folder-info.h \
        modest-mail-operation-queue.c \
@@ -61,6 +63,7 @@ modest_SOURCES=\
        modest-protocol-info.h\
        modest-runtime.c\
        modest-runtime.h\
+       modest-runtime-priv.h\
        modest-singletons.c\
        modest-singletons.h\
        modest-text-utils.c\
index d925ac3..e6bab3a 100644 (file)
@@ -111,3 +111,10 @@ modest_platform_get_icon (const gchar *name)
        
        return pixbuf;
 }
+
+
+const gchar*
+modest_platform_get_app_name (void)
+{
+       return ("modest");
+}
index 1183f0a..b797d40 100644 (file)
@@ -445,7 +445,7 @@ modest_main_window_new (void)
        /* Set window icon */
        window_icon = modest_platform_get_icon (MODEST_APP_ICON);
        gtk_window_set_icon (GTK_WINDOW (self), window_icon);
-
+       
        /* Connect signals */
        connect_signals (self);
 
@@ -455,9 +455,8 @@ modest_main_window_new (void)
        g_idle_add ((GSourceFunc)sync_accounts_cb, self);
        /* do send & receive when we are idle */        
 
-       g_message ("online? %s",
-                  tny_device_is_online (modest_runtime_get_device()) ? "yes" : "no");
-               
+       
+       
        return MODEST_WINDOW(self);
 }
 
index fc7caa5..2753090 100644 (file)
@@ -312,3 +312,9 @@ modest_platform_get_icon (const gchar *name)
        
        return pixbuf;
 }
+
+const gchar*
+modest_platform_get_app_name (void)
+{
+       return _("mcen_ap_name");
+}
diff --git a/src/modest-init.c b/src/modest-init.c
new file mode 100644 (file)
index 0000000..6fc3f80
--- /dev/null
@@ -0,0 +1,548 @@
+/* Copyright (c) 2006, Nokia Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * * Neither the name of the Nokia Corporation nor the names of its
+ *   contributors may be used to endorse or promote products derived from
+ *   this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <config.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <glib/gstdio.h>
+#include <modest-runtime.h>
+#include <modest-runtime-priv.h>
+#include <modest-init.h>
+#include <modest-defs.h>
+#include <modest-singletons.h>
+#include <widgets/modest-header-view.h>
+#include <widgets/modest-folder-view.h>
+#include <modest-tny-platform-factory.h>
+#include <modest-platform.h>
+#include <modest-widget-memory.h>
+#include <modest-widget-memory-priv.h>
+#include <modest-local-folder-info.h>
+#include <modest-account-mgr.h>
+#include <modest-account-mgr-helpers.h>
+#include <modest-icon-names.h>
+
+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_default_settings (ModestConf *conf);
+
+/*
+ * defaults for the column headers
+ */
+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_COMPACT_FLAG, 40},
+       {MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_IN, 180},
+       {MODEST_HEADER_VIEW_COLUMN_COMPACT_RECEIVED_DATE, 240}
+};
+
+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_COMPACT_FLAG, 40},
+       {MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_OUT,180},
+       {MODEST_HEADER_VIEW_COLUMN_STATUS, 240}
+};
+
+static const FolderCols SENT_COLUMNS_TWOLINES[] = {
+       {MODEST_HEADER_VIEW_COLUMN_COMPACT_FLAG, 40},
+       {MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_OUT,180},
+       {MODEST_HEADER_VIEW_COLUMN_COMPACT_SENT_DATE, 240}
+};
+
+#ifdef MODEST_PLATFORM_MAEMO
+static const TnyFolderType LOCAL_FOLDERS[] = {
+       TNY_FOLDER_TYPE_OUTBOX,
+       TNY_FOLDER_TYPE_DRAFTS,
+       TNY_FOLDER_TYPE_SENT
+};
+#else
+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 
+};
+#endif /* MODEST_PLATFORM_MAEMO */
+
+
+gboolean
+modest_init_init_core (void)
+{
+       gboolean reset;
+       static gboolean invoked = FALSE;
+
+       if (invoked) {
+               g_printerr ("modest: modest_init_init_core may only be invoked once\n");
+               g_assert (!invoked); /* abort */
+               return FALSE;
+       } else
+               invoked = TRUE;
+       
+       init_i18n();
+       init_debug_g_type();
+       init_debug_logging();
+
+       g_thread_init(NULL);
+       gdk_threads_init ();
+       
+       if (!modest_runtime_init()) {
+               modest_init_uninit ();
+               g_printerr ("modest: failed to initialize the modest runtime\n");
+               return FALSE;
+       }
+
+       if (!modest_platform_init()) {
+               modest_init_uninit ();
+               g_printerr ("modest: failed to run platform-specific initialization\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_runtime_get_conf(), reset)) {
+               modest_init_uninit ();
+               g_printerr ("modest: failed to init header columns\n");
+               return FALSE;
+       }
+
+       init_default_settings (modest_runtime_get_conf ());
+       
+       if (!init_local_folders()) {
+               modest_init_uninit ();
+               g_printerr ("modest: failed to init local folders\n");
+               return FALSE;
+       }
+       
+       if (!init_default_account_maybe(modest_runtime_get_account_mgr ())) {
+               modest_init_uninit ();
+               g_printerr ("modest: failed to init default account\n");
+               return FALSE;
+       }
+       
+       return TRUE;
+}
+
+
+gboolean
+modest_init_init_ui (gint argc, gchar** argv)
+{
+       if (!gtk_init_check(&argc, &argv)) {
+               g_printerr ("modest: failed to initialize graphical ui\n");
+               return FALSE;
+       }
+
+       /* Set application name */
+       g_set_application_name (modest_platform_get_app_name());
+       g_warning (modest_platform_get_app_name());
+
+       init_stock_icons ();
+       return TRUE;
+}
+
+
+gboolean
+modest_init_uninit (void)
+{
+       if (!modest_runtime_uninit())
+               g_printerr ("modest: failed to uninit runtime\n");
+               
+       return TRUE;
+}
+
+
+
+
+/* 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_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,
+                                     SENT_COLUMNS_TWOLINES,
+                                     G_N_ELEMENTS(SENT_COLUMNS_TWOLINES),
+                                     overwrite);
+               break;
+               case TNY_FOLDER_TYPE_OUTBOX:
+               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;
+       ModestInitDebugFlags mflags;
+       
+       gflags = 0;
+       mflags = modest_runtime_get_debug_flags ();
+
+       if (mflags & MODEST_INIT_DEBUG_DEBUG_OBJECTS)
+               gflags |= G_TYPE_DEBUG_OBJECTS;
+       if (mflags & MODEST_INIT_DEBUG_DEBUG_SIGNALS)
+               gflags |= G_TYPE_DEBUG_SIGNALS;
+
+       g_type_init_with_debug_flags (gflags);
+}
+
+static void
+init_debug_logging (void)
+{
+       ModestInitDebugFlags mflags;
+       mflags = modest_runtime_get_debug_flags ();
+       
+       if (mflags & MODEST_INIT_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)
+{
+       /* Setup gettext, to use our .po files: */
+       /* GETTEXT_PACKAGE and MODEST_LOCALE_DIR are defined in config.h */
+       bindtextdomain (GETTEXT_PACKAGE, MODEST_LOCALE_DIR);
+       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) {
+               GtkIconTheme *current_theme;
+               GdkPixbuf *pixbuf;
+               GtkIconFactory *factory;
+               gint i;
+
+               static GtkStockItem items[] = {
+#ifdef MODEST_PLATFORM_MAEMO
+                       { MODEST_STOCK_SPLIT_VIEW, "split view", 0, 0, NULL },
+                       { MODEST_STOCK_SORT, "sort mail", 0, 0, NULL },
+                       { MODEST_STOCK_REFRESH, "refresh mail", 0, 0, NULL },
+#endif /*MODEST_PLATFORM_MAEMO*/
+                       { 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 [] = {
+#ifdef MODEST_PLATFORM_MAEMO
+                       MODEST_TOOLBAR_ICON_SPLIT_VIEW,
+                       MODEST_TOOLBAR_ICON_SORT,
+                       MODEST_TOOLBAR_ICON_REFRESH,
+#endif /*MODEST_PLATFORM_MAEMO*/
+                       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 */
+                       MODEST_TOOLBAR_ICON_FORMAT_BULLETS,
+               };
+
+               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);
+
+               current_theme = gtk_icon_theme_get_default ();
+
+               /* Register icons to accompany stock items */
+               for (i = 0; i < G_N_ELEMENTS (items); i++) {
+
+#ifdef MODEST_PLATFORM_MAEMO  /* MODES_PLATFORM_ID: 1 ==> gnome, 2==> maemo */ 
+                       pixbuf = gtk_icon_theme_load_icon (current_theme,
+                                                          items_names[i],
+                                                          26,
+                                                          GTK_ICON_LOOKUP_NO_SVG,
+                                                          NULL);
+#else
+                       pixbuf = gdk_pixbuf_new_from_file (items_names[i], NULL);
+#endif
+
+                       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_default_settings (ModestConf *conf)
+{
+       if (!modest_conf_key_exists (conf, MODEST_CONF_SHOW_TOOLBAR, NULL))
+               modest_conf_set_bool (conf, MODEST_CONF_SHOW_TOOLBAR, TRUE, NULL);
+
+       if (!modest_conf_key_exists (conf, MODEST_CONF_SHOW_TOOLBAR_FULLSCREEN, NULL))
+               modest_conf_set_bool (conf, MODEST_CONF_SHOW_TOOLBAR_FULLSCREEN, TRUE, NULL);
+       
+       if (!modest_conf_key_exists (conf, MODEST_CONF_SHOW_CC, NULL))
+               modest_conf_set_bool (conf, MODEST_CONF_SHOW_CC, TRUE, NULL);
+
+       if (!modest_conf_key_exists (conf, MODEST_CONF_SHOW_BCC, NULL))
+               modest_conf_set_bool (conf, MODEST_CONF_SHOW_BCC, FALSE, NULL);
+
+       if (!modest_conf_key_exists (conf, MODEST_CONF_CONNECT_AT_STARTUP, NULL))
+               modest_conf_set_bool (conf, MODEST_CONF_CONNECT_AT_STARTUP, TRUE, NULL);
+
+}
diff --git a/src/modest-init.h b/src/modest-init.h
new file mode 100644 (file)
index 0000000..9fbd18c
--- /dev/null
@@ -0,0 +1,85 @@
+/* Copyright (c) 2006, 2007 Nokia Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * * Neither the name of the Nokia Corporation nor the names of its
+ *   contributors may be used to endorse or promote products derived from
+ *   this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __MODEST_INIT_H__
+#define __MODEST_INIT_H__
+
+#include <glib.h>
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define MODEST_DEBUG "MODEST_DEBUG"
+
+typedef enum {
+       MODEST_INIT_DEBUG_ABORT_ON_WARNING      = 1 << 0,
+       MODEST_INIT_DEBUG_LOG_ACTIONS           = 1 << 1, /* not in use atm */
+       MODEST_INIT_DEBUG_DEBUG_OBJECTS         = 1 << 2, /* for g_type_init */
+       MODEST_INIT_DEBUG_DEBUG_SIGNALS         = 1 << 3, /* for g_type_init */
+       MODEST_INIT_DEBUG_FACTORY_SETTINGS      = 1 << 4  /* reset to factory defaults */
+} ModestInitDebugFlags;
+
+/**
+ * modest_init_init_core:
+ *
+ * initialize the modest runtime system (which sets up the
+ * environment, instantiates singletons and so on)
+ * modest_runtime_init should only be called once, and
+ * when done with it, modest_runtime_uninit should be called
+ *  
+ * TRUE if this succeeded, FALSE otherwise.
+ */
+gboolean modest_init_init_core (void);
+
+
+/**
+ * modest_init_init_ui:
+ * @argc: the #argc argument to the main function
+ * @argv: the #argv argument to the main function
+ * 
+ * initialize the modest UI; this replaces the call to
+ * gtk_init
+ *  
+ * TRUE if this succeeded, FALSE otherwise.
+ */
+gboolean modest_init_init_ui (gint argc, gchar** argv);
+
+/**
+ * modest_init_uninit:
+ *
+ * uninitialize the modest runtime system; free all the
+ * resources and so on.
+ *
+ * TRUE if this succeeded, FALSE otherwise
+ */
+gboolean modest_init_uninit (void);
+
+G_END_DECLS
+
+#endif /*__MODEST_INIT_H__*/
index 87dbf0d..7327119 100644 (file)
@@ -40,6 +40,8 @@
 #include <tny-simple-list.h>
 
 #include <modest-runtime.h>
+#include <modest-init.h>
+
 #include <modest-defs.h>
 #include <modest-tny-account-store.h>
 #include <modest-tny-platform-factory.h>
@@ -116,8 +118,8 @@ main (int argc, char *argv[])
        }
        g_option_context_free (context);
        
-       if (!modest_runtime_init ()) {
-               g_printerr ("modest: cannot init runtime\n");
+       if (!modest_init_init_core ()) {
+               g_printerr ("modest: cannot init modest core\n");
                return MODEST_ERR_INIT;
                
        }
@@ -126,8 +128,8 @@ main (int argc, char *argv[])
        g_free (account);
        
        if (!batch) {
-               if (!modest_runtime_init_ui (argc, argv)) {
-                       g_printerr ("modest: cannot start ui\n");
+               if (!modest_init_init_ui (argc, argv)) {
+                       g_printerr ("modest: cannot init modest ui\n");
                        retval = MODEST_ERR_UI;
                        goto cleanup;
                } else {
@@ -155,9 +157,9 @@ cleanup:
        g_free (cc);
        g_free (body);
        g_free (account);
-
-       if (!modest_runtime_uninit ()) 
-               g_printerr ("modest: modest_runtime_uninit failed\n");
+       
+       if (!modest_init_uninit ()) 
+               g_printerr ("modest: modest_init_uninit failed\n");
 
        return retval;
 }
index a309314..2748f7b 100644 (file)
@@ -34,6 +34,8 @@
 #include <gtk/gtk.h>
 #include <tny-device.h>
 
+G_BEGIN_DECLS
+
 /**
  * modest_platform_platform_init:
  *
@@ -101,4 +103,14 @@ gboolean modest_platform_show_uri_popup (const gchar *uri);
  */
 GdkPixbuf* modest_platform_get_icon (const gchar *name);
 
+
+/**
+ * modest_platform_get_application_name:
+ *
+ * this function returns the name of the application. Do not modify.
+ */
+const gchar* modest_platform_get_app_name (void);
+
+G_END_DECLS
+
 #endif /* __MODEST_PLATFORM_UTILS_H__ */
diff --git a/src/modest-runtime-priv.h b/src/modest-runtime-priv.h
new file mode 100644 (file)
index 0000000..13362bd
--- /dev/null
@@ -0,0 +1,70 @@
+/* Copyright (c) 2006,2007 Nokia Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * * Neither the name of the Nokia Corporation nor the names of its
+ *   contributors may be used to endorse or promote products derived from
+ *   this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <config.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <modest-singletons.h>
+
+#ifndef __MODEST_RUNTIME_PRIV_H__
+#define __MODEST_RUNTIME_PRIV_H__
+
+G_BEGIN_DECLS
+
+/*
+ * private functions - only to be called from modest-init.c 
+ */
+
+/**
+ * modest_runtime_init:
+ * @singletons: the settings singleton
+ *
+ * initialize the runtime system;
+ * don't use this function unless you
+ * are modest-init
+ * 
+ * Returns: %TRUE if successful, %FALSE if not.
+ */
+gboolean modest_runtime_init (void);
+
+/**
+ * modest_runtime_uninit:
+ * 
+ * uninitialize the runtime system
+ * don't use this function unless you
+ * are modest-init
+ * 
+ * 
+ * Returns: %TRUE if successful, %FALSE if not.
+ */
+gboolean modest_runtime_uninit (void);
+
+G_BEGIN_DECLS
+
+#endif /*__MODEST_RUNTIME_PRIV_H__*/
index 9c6d626..f67db37 100644 (file)
@@ -32,6 +32,7 @@
 #include <glib-object.h>
 #include <glib/gstdio.h>
 #include <modest-runtime.h>
+#include <modest-runtime-priv.h>
 #include <modest-defs.h>
 #include <modest-singletons.h>
 #include <widgets/modest-header-view.h>
 #include <modest-account-mgr-helpers.h>
 #include <modest-icon-names.h>
 
-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 void     init_default_settings (ModestConf *conf);
-
-
 static ModestSingletons *_singletons = 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_COMPACT_FLAG, 40},
-       {MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_IN, 180},
-       {MODEST_HEADER_VIEW_COLUMN_COMPACT_RECEIVED_DATE, 240}
-};
-
-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_COMPACT_FLAG, 40},
-       {MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_OUT,180},
-       {MODEST_HEADER_VIEW_COLUMN_STATUS, 240}
-};
-
-static const FolderCols SENT_COLUMNS_TWOLINES[] = {
-       {MODEST_HEADER_VIEW_COLUMN_COMPACT_FLAG, 40},
-       {MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_OUT,180},
-       {MODEST_HEADER_VIEW_COLUMN_COMPACT_SENT_DATE, 240}
-};
-
-#ifdef MODEST_PLATFORM_MAEMO
-static const TnyFolderType LOCAL_FOLDERS[] = {
-       TNY_FOLDER_TYPE_OUTBOX,
-       TNY_FOLDER_TYPE_DRAFTS,
-       TNY_FOLDER_TYPE_SENT
-};
-#else
-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 
-};
-#endif /* MODEST_PLATFORM_MAEMO */
-
-
-
+/*-----------------------------------------------------------------------------*/
 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 ();
-
-       /* Set application name */
-       g_set_application_name (_("FIXME Modest"));
-
-       my_singletons = modest_singletons_new ();
-       if (!my_singletons) {
-               g_printerr ("modest: failed to initialize singletons\n");
-               return FALSE;
-       }
-       
-       if (!modest_platform_init()) {
-               modest_runtime_uninit ();
-               g_printerr ("modest: failed to run platform-specific initialization\n");
+               g_printerr ("modest: modest_runtime_init can only be run once\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;
-       }
-
-       init_default_settings (modest_singletons_get_conf (my_singletons));
-       
-       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)
-{
-       if (!gtk_init_check(&argc, &argv)) {
-               g_printerr ("modest: failed to initialize graphical ui\n");
+       _singletons = modest_singletons_new ();
+       if (!_singletons) {
+               g_printerr ("modest: failed to create singletons\n");
                return FALSE;
        }
 
-       init_stock_icons ();
        return TRUE;
 }
 
-
 gboolean
 modest_runtime_uninit (void)
 {
-       if (_singletons) {
-               g_object_unref (G_OBJECT(_singletons));
-               _singletons = NULL;
-       }
-       modest_runtime_verify_object_death (_singletons, "_singletons");
+       if (!_singletons)
+               return TRUE;    /* uninit maybe called if runtime_init failed */
        
+       g_return_val_if_fail (MODEST_IS_SINGLETONS(_singletons), FALSE);
+       g_object_unref(G_OBJECT(_singletons));
+       modest_runtime_verify_object_death(_singletons,"");
+       _singletons = NULL;
+               
        return TRUE;
 }
-
+/*-----------------------------------------------------------------------------*/
+       
 
 ModestAccountMgr*
 modest_runtime_get_account_mgr   (void)
@@ -309,8 +179,7 @@ modest_runtime_get_debug_flags ()
                { "log-actions",        MODEST_RUNTIME_DEBUG_LOG_ACTIONS },
                { "debug-objects",      MODEST_RUNTIME_DEBUG_DEBUG_OBJECTS },
                { "debug-signals",      MODEST_RUNTIME_DEBUG_DEBUG_SIGNALS },
-               { "factory-settings",   MODEST_RUNTIME_DEBUG_FACTORY_SETTINGS},
-               { "tiny-test-accounts", MODEST_RUNTIME_DEBUG_TINY_TEST_ACCOUNTS}
+               { "factory-settings",   MODEST_RUNTIME_DEBUG_FACTORY_SETTINGS}
        };
        const gchar *str;
        static ModestRuntimeDebugFlags debug_flags = -1;
@@ -331,383 +200,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_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,
-                                     SENT_COLUMNS_TWOLINES,
-                                     G_N_ELEMENTS(SENT_COLUMNS_TWOLINES),
-                                     overwrite);
-               break;
-               case TNY_FOLDER_TYPE_OUTBOX:
-               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)
-{
-       /* Setup gettext, to use our .po files: */
-       /* GETTEXT_PACKAGE and MODEST_LOCALE_DIR are defined in config.h */
-       bindtextdomain (GETTEXT_PACKAGE, MODEST_LOCALE_DIR);
-       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) {
-               GtkIconTheme *current_theme;
-               GdkPixbuf *pixbuf;
-               GtkIconFactory *factory;
-               gint i;
-
-               static GtkStockItem items[] = {
-#ifdef MODEST_PLATFORM_MAEMO
-                       { MODEST_STOCK_SPLIT_VIEW, "split view", 0, 0, NULL },
-                       { MODEST_STOCK_SORT, "sort mail", 0, 0, NULL },
-                       { MODEST_STOCK_REFRESH, "refresh mail", 0, 0, NULL },
-#endif /*MODEST_PLATFORM_MAEMO*/
-                       { 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 [] = {
-#ifdef MODEST_PLATFORM_MAEMO
-                       MODEST_TOOLBAR_ICON_SPLIT_VIEW,
-                       MODEST_TOOLBAR_ICON_SORT,
-                       MODEST_TOOLBAR_ICON_REFRESH,
-#endif /*MODEST_PLATFORM_MAEMO*/
-                       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 */
-                       MODEST_TOOLBAR_ICON_FORMAT_BULLETS,
-               };
-
-               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);
-
-               current_theme = gtk_icon_theme_get_default ();
-
-               /* Register icons to accompany stock items */
-               for (i = 0; i < G_N_ELEMENTS (items); i++) {
-
-#ifdef MODEST_PLATFORM_MAEMO  /* MODES_PLATFORM_ID: 1 ==> gnome, 2==> maemo */ 
-                       pixbuf = gtk_icon_theme_load_icon (current_theme,
-                                                          items_names[i],
-                                                          26,
-                                                          GTK_ICON_LOOKUP_NO_SVG,
-                                                          NULL);
-#else
-                       pixbuf = gdk_pixbuf_new_from_file (items_names[i], NULL);
-#endif
-
-                       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);
-}
-
-
-static void
-init_default_settings (ModestConf *conf)
-{
-       if (!modest_conf_key_exists (conf, MODEST_CONF_SHOW_TOOLBAR, NULL))
-               modest_conf_set_bool (conf, MODEST_CONF_SHOW_TOOLBAR, TRUE, NULL);
-
-       if (!modest_conf_key_exists (conf, MODEST_CONF_SHOW_TOOLBAR_FULLSCREEN, NULL))
-               modest_conf_set_bool (conf, MODEST_CONF_SHOW_TOOLBAR_FULLSCREEN, TRUE, NULL);
-       
-       if (!modest_conf_key_exists (conf, MODEST_CONF_SHOW_CC, NULL))
-               modest_conf_set_bool (conf, MODEST_CONF_SHOW_CC, TRUE, NULL);
-
-       if (!modest_conf_key_exists (conf, MODEST_CONF_SHOW_BCC, NULL))
-               modest_conf_set_bool (conf, MODEST_CONF_SHOW_BCC, FALSE, NULL);
-
-       if (!modest_conf_key_exists (conf, MODEST_CONF_CONNECT_AT_STARTUP, NULL))
-               modest_conf_set_bool (conf, MODEST_CONF_CONNECT_AT_STARTUP, TRUE, NULL);
-
-}
index eade560..8fef29b 100644 (file)
@@ -50,8 +50,7 @@ typedef enum {
        MODEST_RUNTIME_DEBUG_LOG_ACTIONS           = 1 << 1, /* not in use atm */
        MODEST_RUNTIME_DEBUG_DEBUG_OBJECTS         = 1 << 2, /* for g_type_init */
        MODEST_RUNTIME_DEBUG_DEBUG_SIGNALS         = 1 << 3, /* for g_type_init */
-       MODEST_RUNTIME_DEBUG_FACTORY_SETTINGS      = 1 << 4, /* reset to factory defaults */
-       MODEST_RUNTIME_DEBUG_TINY_TEST_ACCOUNTS    = 1 << 5
+       MODEST_RUNTIME_DEBUG_FACTORY_SETTINGS      = 1 << 4  /* reset to factory defaults */
 } ModestRuntimeDebugFlags;
 
 /**
index 11fb9e0..44653fe 100644 (file)
@@ -215,18 +215,26 @@ modest_singletons_new (void)
 {
        ModestSingletonsPrivate *priv;
        ModestSingletons *self;
+       static gboolean invoked = FALSE;
+
+       if (invoked) {
+               g_printerr ("modest: modest_singletons_new may only be called once\n");
+               g_assert (!invoked); /* abort */
+               return NULL; /* g_assert may be NOP */
+       }
        
        self = MODEST_SINGLETONS(g_object_new(MODEST_TYPE_SINGLETONS, NULL));
        priv = MODEST_SINGLETONS_GET_PRIVATE(self);
-
+       
        /* widget_factory will still be NULL, as it is initialized lazily */
        if (!(priv->conf && priv->account_mgr && priv->account_store &&
              priv->cache_mgr && priv->mail_op_queue && priv->device && priv->platform_fact)) {
-               g_printerr ("modest: failed to create singletons instance\n");
+               g_printerr ("modest: failed to create singletons object\n");
                g_object_unref (G_OBJECT(self));
                self = NULL;
        }
-       
+
+       invoked = TRUE;
        return self;
 }