X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-init.c;h=37016d40aab3258f8cc50c86969653d2635c78fe;hp=a9568d5b04708289d3ada2e2943fe150637164dd;hb=96d9a8c787c693406a0f26e3d3a00065c7236fe5;hpb=da78260d1ea50e18f9a307b2deb1a0adec2fc2c8 diff --git a/src/modest-init.c b/src/modest-init.c index a9568d5..37016d4 100644 --- a/src/modest-init.c +++ b/src/modest-init.c @@ -28,103 +28,192 @@ */ #include +#include +#include +#include +#include +#include +#include #include +#include #include #include #include +#include #include #include #include -#include -#include #include #include +#include +#include "widgets/modest-global-settings-dialog.h" +#include "modest-tny-msg.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); +static void init_device_name (ModestConf *conf); +/* + * defaults for the column headers + */ typedef struct { ModestHeaderViewColumn col; guint width; + gint sort; } 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} + {MODEST_HEADER_VIEW_COLUMN_MSGTYPE, 40, 0}, + {MODEST_HEADER_VIEW_COLUMN_ATTACH, 40, 0}, + {MODEST_HEADER_VIEW_COLUMN_FROM, 80, 0}, + {MODEST_HEADER_VIEW_COLUMN_SUBJECT, 80, 0}, + {MODEST_HEADER_VIEW_COLUMN_RECEIVED_DATE, 60, 0}, + {MODEST_HEADER_VIEW_COLUMN_SIZE, 50, 0} }; + 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} + {MODEST_HEADER_VIEW_COLUMN_COMPACT_FLAG, 40, 0}, + {MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_IN, 180, 0}, + {MODEST_HEADER_VIEW_COLUMN_COMPACT_RECEIVED_DATE, 240, -1} }; 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} + {MODEST_HEADER_VIEW_COLUMN_MSGTYPE, 40, 0}, + {MODEST_HEADER_VIEW_COLUMN_ATTACH, 40, 0}, + {MODEST_HEADER_VIEW_COLUMN_TO, 80, 0}, + {MODEST_HEADER_VIEW_COLUMN_SUBJECT, 80, 0}, + {MODEST_HEADER_VIEW_COLUMN_SENT_DATE, 80, 0}, + {MODEST_HEADER_VIEW_COLUMN_SIZE, 50, 0} }; + 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}, + {MODEST_HEADER_VIEW_COLUMN_COMPACT_FLAG, 40, 0}, + {MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_OUT,180, 0}, + {MODEST_HEADER_VIEW_COLUMN_STATUS, 240, 0} +}; + +static const FolderCols SENT_COLUMNS_TWOLINES[] = { + {MODEST_HEADER_VIEW_COLUMN_COMPACT_FLAG, 40, 0}, + {MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_OUT,180, 0}, + {MODEST_HEADER_VIEW_COLUMN_COMPACT_SENT_DATE, 240, -1} }; - + +#ifdef MODEST_PLATFORM_MAEMO static const TnyFolderType LOCAL_FOLDERS[] = { - TNY_FOLDER_TYPE_OUTBOX, +/* 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 */ + -static ModestTnyPlatformFactory* -get_platform_factory (void) +gboolean +modest_init_init_core (void) { - TnyPlatformFactory *fact = - modest_tny_platform_factory_get_instance (); + 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(); - if (!fact) { - g_printerr ("modest: cannot get platform factory instance\n"); - return NULL; + if (!g_thread_supported()) + 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; + } + + + /* do an initial guess for the device name */ + init_device_name (modest_runtime_get_conf()); + + if (!modest_platform_init()) { + modest_init_uninit (); + g_printerr ("modest: failed to run platform-specific initialization\n"); + return FALSE; } - return MODEST_TNY_PLATFORM_FACTORY(fact); + /* 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; } -static ModestConf* -get_modest_conf (void) +gboolean +modest_init_init_ui (gint argc, gchar** argv) { - ModestTnyPlatformFactory *fact = - get_platform_factory (); - ModestConf *conf = - modest_tny_platform_factory_get_conf_instance (fact); - if (!conf) { - g_printerr ("modest: cannot get modest conf instance\n"); - return NULL; + if (!gtk_init_check(&argc, &argv)) { + g_printerr ("modest: failed to initialize graphical ui\n"); + return FALSE; } - return conf; + + /* Set application name */ + g_set_application_name (modest_platform_get_app_name()); + /* g_message (modest_platform_get_app_name()); */ + + init_stock_icons (); + return TRUE; } -static ModestAccountMgr* -get_account_mgr (void) +gboolean +modest_init_uninit (void) { - ModestTnyPlatformFactory *fact = - get_platform_factory (); - ModestAccountMgr *acc_mgr = - modest_tny_platform_factory_get_account_mgr_instance (fact); - if (!acc_mgr) { - g_printerr ("modest: cannot get modest account mgr instance\n"); - return NULL; - } - return acc_mgr; + 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 @@ -153,8 +242,8 @@ save_header_settings (ModestConf *conf, TnyFolderType type, /* 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); + g_string_append_printf (str, "%d:%d:%d ", + cols[i].col, cols[i].width, cols[i].sort); modest_conf_set_string (conf, key, str->str, NULL); g_free (key); @@ -163,24 +252,24 @@ save_header_settings (ModestConf *conf, TnyFolderType type, return TRUE; } -/* we set the the defaults here for all folder types */ -gboolean -modest_init_header_columns (gboolean overwrite) +/** + * 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) { - ModestConf *conf; int folder_type; - - conf = get_modest_conf (); - if (!conf) { - g_printerr ("modest: cannot get modest conf\n"); - return FALSE; - } 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, @@ -190,6 +279,13 @@ modest_init_header_columns (gboolean overwrite) 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); @@ -211,32 +307,56 @@ modest_init_header_columns (gboolean overwrite) return TRUE; } -gboolean -modest_init_local_folders (void) +gboolean modest_init_one_local_folder (gchar *maildir_path) { - int i; - gchar *maildir_path; static const gchar* maildirs[] = { "cur", "new", "tmp" }; - maildir_path = modest_local_folder_info_get_maildir_path (); + int j; + for (j = 0; j != G_N_ELEMENTS(maildirs); ++j) { + gchar *dir = g_build_filename (maildir_path, + maildirs[j], + NULL); + if (g_mkdir_with_parents (dir, 0755) < 0) { + g_printerr ("modest: failed to create %s\n", dir); + g_free (dir); + return FALSE; + } + + g_free (dir); + } + + 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) +{ + gchar *maildir_path = modest_local_folder_info_get_maildir_path (); + /* Create each of the standard on-disk folders. + * Per-account outbox folders will be created when first needed. */ + int i; 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, + gchar *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); + NULL); + const gboolean created = modest_init_one_local_folder (dir); + g_free(dir); + + if (!created) { + g_free (maildir_path); + return FALSE; } } @@ -253,22 +373,25 @@ free_element (gpointer data, gpointer user_data) } -gboolean -modest_init_default_account_maybe (void) +/* TODO: This is a duplicate of modest_account_mgr_set_first_account_as_default(). */ +/** + * 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) { - ModestAccountMgr *acc_mgr; - GSList *all_accounts = NULL; gchar *default_account; gboolean retval = TRUE; - acc_mgr = get_account_mgr (); - if (!acc_mgr) { - g_printerr ("modest: cannot get modest account mgr\n"); - return FALSE; - } - - all_accounts = modest_account_mgr_account_names (acc_mgr, NULL); + all_accounts = modest_account_mgr_account_names (acc_mgr, TRUE /* enabled accounts only */); if (all_accounts) { /* if there are any accounts, there should be a default one */ default_account = modest_account_mgr_get_default_account (acc_mgr); @@ -289,3 +412,225 @@ modest_init_default_account_maybe (void) } 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) +{ + const gchar* gettext_package; + /* Setup gettext, to use our .po files: */ + /* GETTEXT_PACKAGE and MODEST_LOCALE_DIR are defined in config.h */ +#ifdef MODEST_HILDON_VERSION_0 + gettext_package = GETTEXT_PACKAGE; + bindtextdomain (gettext_package, MODEST_LOCALE_DIR); +#else + gettext_package = "osso-email"; /* HACK to use the localizations */ + bindtextdomain (gettext_package, "/usr/share/locale"); +#endif /*MODEST_HILDON_VERSION_0*/ + + 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); + + /* Global settings */ + if (!modest_conf_key_exists (conf, MODEST_CONF_AUTO_UPDATE, NULL)) + modest_conf_set_bool (conf, MODEST_CONF_AUTO_UPDATE, TRUE, NULL); + + if (!modest_conf_key_exists (conf, MODEST_CONF_UPDATE_WHEN_CONNECTED_BY, NULL)) + modest_conf_set_int (conf, MODEST_CONF_UPDATE_WHEN_CONNECTED_BY, MODEST_CONNECTED_VIA_WLAN, NULL); + + if (!modest_conf_key_exists (conf, MODEST_CONF_UPDATE_INTERVAL, NULL)) + modest_conf_set_int (conf, MODEST_CONF_UPDATE_INTERVAL, MODEST_UPDATE_INTERVAL_15_MIN, NULL); + + if (!modest_conf_key_exists (conf, MODEST_CONF_MSG_SIZE_LIMIT, NULL)) + modest_conf_set_int (conf, MODEST_CONF_MSG_SIZE_LIMIT, 1000, NULL); + + if (!modest_conf_key_exists (conf, MODEST_CONF_PLAY_SOUND_MSG_ARRIVE, NULL)) + modest_conf_set_bool (conf, MODEST_CONF_PLAY_SOUND_MSG_ARRIVE, FALSE, NULL); + + if (!modest_conf_key_exists (conf, MODEST_CONF_PREFER_FORMATTED_TEXT, NULL)) + modest_conf_set_bool (conf, MODEST_CONF_PREFER_FORMATTED_TEXT, TRUE, NULL); + + if (!modest_conf_key_exists (conf, MODEST_CONF_REPLY_TYPE, NULL)) + modest_conf_set_int (conf, MODEST_CONF_REPLY_TYPE, MODEST_TNY_MSG_REPLY_TYPE_QUOTE, NULL); +} + + +/* set the device name -- note this is an initial guess from /etc/hostname + * on maemo-device it will most probably be replaced with the Bluetooth device + * name later during starting (see maemo/modest-maemo-utils.[ch]) + */ +static void +init_device_name (ModestConf *conf) +{ + int len = 255; /* max len */ + gchar *devname = NULL; + + if (!g_file_get_contents("/etc/hostname", &devname, &len, NULL) || len < 2 || len > 254) { + g_printerr ("modest: failed to read hostname\n"); + modest_conf_set_string (conf, MODEST_CONF_DEVICE_NAME, + MODEST_LOCAL_FOLDERS_DEFAULT_DISPLAY_NAME, + NULL); + } else { + /* remove the \n at the end */ + if (devname[len-1] == '\n') + devname[len-1] = '\0'; + else + devname[len] = '\0'; + + GError *err = NULL; + if (!modest_conf_set_string (conf, MODEST_CONF_DEVICE_NAME,devname, &err)) { + g_printerr ("modest: error setting device name '%s': %s", + devname, err ? err->message: "?"); + g_error_free (err); + } + } + + g_free (devname); +}