aboutsummaryrefslogtreecommitdiff
path: root/libsylph/sylmain.c
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2009-06-10 08:11:08 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2009-06-10 08:11:08 +0000
commitca06cd994b09cbb500b35af30c8bd75dc3e0e5b7 (patch)
tree3474db42cb4b1c42007cfb84ec24ca8331b50dba /libsylph/sylmain.c
parent81f0f7394f9c47a30314f2884be6d4bdae302673 (diff)
merged plugin-test branch into trunk.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@2164 ee746299-78ed-0310-b773-934348b2243d
Diffstat (limited to 'libsylph/sylmain.c')
-rw-r--r--libsylph/sylmain.c327
1 files changed, 327 insertions, 0 deletions
diff --git a/libsylph/sylmain.c b/libsylph/sylmain.c
new file mode 100644
index 00000000..649c4d3a
--- /dev/null
+++ b/libsylph/sylmain.c
@@ -0,0 +1,327 @@
+/*
+ * LibSylph -- E-Mail client library
+ * Copyright (C) 1999-2009 Hiroyuki Yamamoto
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "defs.h"
+
+#include <glib.h>
+#include <glib/gi18n.h>
+
+#ifdef G_OS_UNIX
+# include <signal.h>
+#endif
+
+#if HAVE_LOCALE_H
+# include <locale.h>
+#endif
+
+#include "sylmain.h"
+#include "syl-marshal.h"
+#include "prefs_common.h"
+#include "account.h"
+#include "filter.h"
+#include "folder.h"
+#include "socket.h"
+#include "codeconv.h"
+#include "utils.h"
+
+#if USE_SSL
+# include "ssl.h"
+#endif
+
+#ifndef PACKAGE
+# define PACKAGE GETTEXT_PACKAGE
+#endif
+
+G_DEFINE_TYPE(SylApp, syl_app, G_TYPE_OBJECT);
+
+enum {
+ INIT_DONE,
+ APP_EXIT,
+ ADD_MSG,
+ REMOVE_MSG,
+ REMOVE_ALL_MSG,
+ REMOVE_FOLDER,
+ MOVE_FOLDER,
+ FOLDERLIST_UPDATED,
+ LAST_SIGNAL
+};
+
+static guint app_signals[LAST_SIGNAL] = { 0 };
+
+static GObject *app = NULL;
+
+
+static void syl_app_init(SylApp *self)
+{
+}
+
+static void syl_app_class_init(SylAppClass *klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
+
+ app_signals[INIT_DONE] =
+ g_signal_new("init-done",
+ G_TYPE_FROM_CLASS(gobject_class),
+ G_SIGNAL_RUN_FIRST,
+ 0,
+ NULL, NULL,
+ syl_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+ app_signals[APP_EXIT] =
+ g_signal_new("app-exit",
+ G_TYPE_FROM_CLASS(gobject_class),
+ G_SIGNAL_RUN_FIRST,
+ 0,
+ NULL, NULL,
+ syl_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+ app_signals[ADD_MSG] =
+ g_signal_new("add-msg",
+ G_TYPE_FROM_CLASS(gobject_class),
+ G_SIGNAL_RUN_FIRST,
+ 0,
+ NULL, NULL,
+ syl_marshal_VOID__POINTER_STRING_UINT,
+ G_TYPE_NONE,
+ 3,
+ G_TYPE_POINTER,
+ G_TYPE_STRING,
+ G_TYPE_UINT);
+ app_signals[REMOVE_MSG] =
+ g_signal_new("remove-msg",
+ G_TYPE_FROM_CLASS(gobject_class),
+ G_SIGNAL_RUN_FIRST,
+ 0,
+ NULL, NULL,
+ syl_marshal_VOID__POINTER_STRING_UINT,
+ G_TYPE_NONE,
+ 3,
+ G_TYPE_POINTER,
+ G_TYPE_STRING,
+ G_TYPE_UINT);
+ app_signals[REMOVE_ALL_MSG] =
+ g_signal_new("remove-all-msg",
+ G_TYPE_FROM_CLASS(gobject_class),
+ G_SIGNAL_RUN_FIRST,
+ 0,
+ NULL, NULL,
+ syl_marshal_VOID__POINTER,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_POINTER);
+ app_signals[REMOVE_FOLDER] =
+ g_signal_new("remove-folder",
+ G_TYPE_FROM_CLASS(gobject_class),
+ G_SIGNAL_RUN_FIRST,
+ 0,
+ NULL, NULL,
+ syl_marshal_VOID__POINTER,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_POINTER);
+ app_signals[MOVE_FOLDER] =
+ g_signal_new("move-folder",
+ G_TYPE_FROM_CLASS(gobject_class),
+ G_SIGNAL_RUN_FIRST,
+ 0,
+ NULL, NULL,
+ syl_marshal_VOID__POINTER_STRING_STRING,
+ G_TYPE_NONE,
+ 3,
+ G_TYPE_POINTER,
+ G_TYPE_STRING,
+ G_TYPE_STRING);
+ app_signals[FOLDERLIST_UPDATED] =
+ g_signal_new("folderlist-updated",
+ G_TYPE_FROM_CLASS(gobject_class),
+ G_SIGNAL_RUN_FIRST,
+ 0,
+ NULL, NULL,
+ syl_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+}
+
+GObject *syl_app_create(void)
+{
+ if (!app)
+ app = g_object_new(SYL_TYPE_APP, NULL);
+ return app;
+}
+
+GObject *syl_app_get(void)
+{
+ return app;
+}
+
+void syl_init(void)
+{
+#ifdef G_OS_WIN32
+ gchar *newpath;
+ const gchar *lang_env;
+
+ /* disable locale variable such as "LANG=1041" */
+
+#define DISABLE_DIGIT_LOCALE(envstr) \
+{ \
+ lang_env = g_getenv(envstr); \
+ if (lang_env && g_ascii_isdigit(lang_env[0])) \
+ g_unsetenv(envstr); \
+}
+
+ DISABLE_DIGIT_LOCALE("LC_ALL");
+ DISABLE_DIGIT_LOCALE("LANG");
+ DISABLE_DIGIT_LOCALE("LC_CTYPE");
+ DISABLE_DIGIT_LOCALE("LC_MESSAGES");
+
+#undef DISABLE_DIGIT_LOCALE
+
+ g_unsetenv("LANGUAGE");
+#endif /* G_OS_WIN32 */
+
+#ifdef HAVE_LOCALE_H
+ setlocale(LC_ALL, "");
+#endif
+
+ set_startup_dir();
+
+#ifdef G_OS_WIN32
+ /* include startup directory into %PATH% for GSpawn */
+ newpath = g_strconcat(get_startup_dir(), ";", g_getenv("PATH"), NULL);
+ g_setenv("PATH", newpath, TRUE);
+ g_free(newpath);
+#endif
+
+#ifdef ENABLE_NLS
+ syl_init_gettext(PACKAGE, LOCALEDIR);
+ textdomain(PACKAGE);
+#endif
+
+ sock_init();
+#if USE_SSL
+ ssl_init();
+#endif
+
+#ifdef G_OS_UNIX
+ /* ignore SIGPIPE signal for preventing sudden death of program */
+ signal(SIGPIPE, SIG_IGN);
+#endif
+}
+
+#define MAKE_DIR_IF_NOT_EXIST(dir) \
+{ \
+ if (!is_dir_exist(dir)) { \
+ if (is_file_exist(dir)) { \
+ g_warning("File '%s' already exists. " \
+ "Can't create folder.", dir); \
+ return -1; \
+ } \
+ if (make_dir(dir) < 0) \
+ return -1; \
+ } \
+}
+
+void syl_init_gettext(const gchar *package, const gchar *dirname)
+{
+#ifdef ENABLE_NLS
+ if (g_path_is_absolute(dirname))
+ bindtextdomain(package, dirname);
+ else {
+ gchar *locale_dir;
+
+ locale_dir = g_strconcat(get_startup_dir(), G_DIR_SEPARATOR_S,
+ dirname, NULL);
+#ifdef G_OS_WIN32
+ {
+ gchar *locale_dir_;
+
+ locale_dir_ = g_locale_from_utf8(locale_dir, -1,
+ NULL, NULL, NULL);
+ if (locale_dir_) {
+ g_free(locale_dir);
+ locale_dir = locale_dir_;
+ }
+ }
+#endif /* G_OS_WIN32 */
+ bindtextdomain(package, locale_dir);
+ g_free(locale_dir);
+ }
+
+ bind_textdomain_codeset(package, CS_UTF_8);
+#endif /* ENABLE_NLS */
+}
+
+gint syl_setup_rc_dir(void)
+{
+ if (!is_dir_exist(get_rc_dir())) {
+ if (make_dir_hier(get_rc_dir()) < 0)
+ return -1;
+ }
+
+ MAKE_DIR_IF_NOT_EXIST(get_mail_base_dir());
+
+ CHDIR_RETURN_VAL_IF_FAIL(get_rc_dir(), -1);
+
+ MAKE_DIR_IF_NOT_EXIST(get_imap_cache_dir());
+ MAKE_DIR_IF_NOT_EXIST(get_news_cache_dir());
+ MAKE_DIR_IF_NOT_EXIST(get_mime_tmp_dir());
+ MAKE_DIR_IF_NOT_EXIST(get_tmp_dir());
+ MAKE_DIR_IF_NOT_EXIST(UIDL_DIR);
+
+ /* remove temporary files */
+ remove_all_files(get_tmp_dir());
+ remove_all_files(get_mime_tmp_dir());
+
+ return 0;
+}
+
+void syl_save_all_state(void)
+{
+ folder_write_list();
+ prefs_common_write_config();
+ filter_write_config();
+ account_write_config_all();
+}
+
+void syl_cleanup(void)
+{
+ /* remove temporary files */
+ remove_all_files(get_tmp_dir());
+ remove_all_files(get_mime_tmp_dir());
+#if GLIB_CHECK_VERSION(2, 6, 0)
+ g_log_set_default_handler(g_log_default_handler, NULL);
+#endif
+ close_log_file();
+
+#if USE_SSL
+ ssl_done();
+#endif
+ sock_cleanup();
+
+ if (app) {
+ g_object_unref(app);
+ app = NULL;
+ }
+}