gint main (gint argc, gchar **argv) { EShell *shell; GSettings *settings; #ifdef DEVELOPMENT gboolean skip_warning_dialog; #endif GError *error = NULL; #ifdef G_OS_WIN32 gchar *path; /* Reduce risks */ { typedef BOOL (WINAPI *t_SetDllDirectoryA) (LPCSTR lpPathName); t_SetDllDirectoryA p_SetDllDirectoryA; p_SetDllDirectoryA = GetProcAddress ( GetModuleHandle ("kernel32.dll"), "SetDllDirectoryA"); if (p_SetDllDirectoryA) (*p_SetDllDirectoryA) (""); } #ifndef _WIN64 { typedef BOOL (WINAPI *t_SetProcessDEPPolicy) (DWORD dwFlags); t_SetProcessDEPPolicy p_SetProcessDEPPolicy; p_SetProcessDEPPolicy = GetProcAddress ( GetModuleHandle ("kernel32.dll"), "SetProcessDEPPolicy"); if (p_SetProcessDEPPolicy) (*p_SetProcessDEPPolicy) ( PROCESS_DEP_ENABLE | PROCESS_DEP_DISABLE_ATL_THUNK_EMULATION); } #endif if (fileno (stdout) != -1 && _get_osfhandle (fileno (stdout)) != -1) { /* stdout is fine, presumably redirected to a file or pipe */ } else { typedef BOOL (* WINAPI AttachConsole_t) (DWORD); AttachConsole_t p_AttachConsole = (AttachConsole_t) GetProcAddress ( GetModuleHandle ("kernel32.dll"), "AttachConsole"); if (p_AttachConsole && p_AttachConsole (ATTACH_PARENT_PROCESS)) { freopen ("CONOUT$", "w", stdout); dup2 (fileno (stdout), 1); freopen ("CONOUT$", "w", stderr); dup2 (fileno (stderr), 2); } } #endif /* Make ElectricFence work. */ free (malloc (10)); bindtextdomain (GETTEXT_PACKAGE, EVOLUTION_LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); /* do not require Gtk+ for --force-shutdown */ if (argc == 2 && argv[1] && g_str_equal (argv[1], "--force-shutdown")) { shell_force_shutdown (); return 0; } /* The contact maps feature uses clutter-gtk. */ #ifdef WITH_CONTACT_MAPS /* XXX This function is declared in gtk-clutter-util.h with an * unnecessary G_GNUC_WARN_UNUSED_RESULT attribute. But we * don't need the returned error code because we're checking * the GError directly. Just ignore this warning. */ gtk_clutter_init_with_args ( &argc, &argv, _("- The Evolution PIM and Email Client"), entries, (gchar *) GETTEXT_PACKAGE, &error); #else gtk_init_with_args ( &argc, &argv, _("- The Evolution PIM and Email Client"), entries, (gchar *) GETTEXT_PACKAGE, &error); #endif /* WITH_CONTACT_MAPS */ if (error != NULL) { g_printerr ("%s\n", error->message); g_error_free (error); exit (1); } #ifdef HAVE_ICAL_UNKNOWN_TOKEN_HANDLING ical_set_unknown_token_handling_setting (ICAL_DISCARD_TOKEN); #endif e_gdbus_templates_init_main_thread (); #ifdef G_OS_WIN32 path = g_build_path (";", _e_get_bindir (), g_getenv ("PATH"), NULL); if (!g_setenv ("PATH", path, TRUE)) g_warning ("Could not set PATH for Evolution and its child processes"); g_free (path); if (register_handlers || reinstall || show_icons) { _e_win32_register_mailer (); _e_win32_register_addressbook (); } if (register_handlers) exit (0); if (reinstall) { _e_win32_set_default_mailer (); exit (0); } if (show_icons) { _e_win32_set_default_mailer (); exit (0); } if (hide_icons) { _e_win32_unset_default_mailer (); exit (0); } if (unregister_handlers) { _e_win32_unregister_mailer (); _e_win32_unregister_addressbook (); exit (0); } if (strcmp (gettext (""), "") == 0) { /* No message catalog installed for the current locale * language, so don't bother with the localisations * provided by other things then either. Reset thread * locale to "en-US" and C library locale to "C". */ SetThreadLocale ( MAKELCID (MAKELANGID (LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT)); setlocale (LC_ALL, "C"); } #endif if (start_online && start_offline) { g_printerr ( _("%s: --online and --offline cannot be used " "together.\n Run '%s --help' for more " "information.\n"), argv[0], argv[0]); exit (1); } else if (force_online && start_offline) { g_printerr ( _("%s: --force-online and --offline cannot be used " "together.\n Run '%s --help' for more " "information.\n"), argv[0], argv[0]); exit (1); } if (force_shutdown) shell_force_shutdown (); if (disable_preview) { settings = g_settings_new ("org.gnome.evolution.mail"); g_settings_set_boolean (settings, "safe-list", TRUE); g_object_unref (settings); settings = g_settings_new ("org.gnome.evolution.addressbook"); g_settings_set_boolean (settings, "show-preview", FALSE); g_object_unref (settings); settings = g_settings_new ("org.gnome.evolution.calendar"); g_settings_set_boolean (settings, "show-memo-preview", FALSE); g_settings_set_boolean (settings, "show-task-preview", FALSE); g_object_unref (settings); } #ifdef G_OS_UNIX g_unix_signal_add_full ( G_PRIORITY_DEFAULT, SIGTERM, handle_term_signal, NULL, NULL); #endif e_passwords_init (); gtk_window_set_default_icon_name ("evolution"); if (setup_only) exit (0); categories_icon_theme_hack (); gtk_accel_map_load (e_get_accels_filename ()); #ifdef DEVELOPMENT settings = g_settings_new ("org.gnome.evolution.shell"); skip_warning_dialog = g_settings_get_boolean ( settings, "skip-warning-dialog"); if (!skip_warning_dialog && !getenv ("EVOLVE_ME_HARDER")) g_settings_set_boolean ( settings, "skip-warning-dialog", show_development_warning ()); g_object_unref (settings); #endif /* Workaround https://bugzilla.gnome.org/show_bug.cgi?id=683548 */ if (!quit) g_type_ensure (WEBKIT_TYPE_WEB_VIEW); shell = create_default_shell (); if (!shell) return 1; if (quit) { e_shell_quit (shell, E_SHELL_QUIT_OPTION); goto exit; } /* This routine converts the local mail store from mbox format to * Maildir format as needed. The reason the code is here and not * in the mail module is because we inform the user at startup of * the impending mail conversion by displaying a popup dialog and * waiting for confirmation before proceeding. * * This has to be done before we load modules because some of the * EShellBackends immediately add GMainContext sources that would * otherwise get dispatched during gtk_dialog_run(), and we don't * want them dispatched until after the conversion is complete. * * Addendum: We need to perform the XDG Base Directory migration * before converting the local mail store, because the * conversion is triggered by checking for certain key * files and directories under XDG_DATA_HOME. Without * this the mail conversion will not trigger for users * upgrading from Evolution 2.30 or older. */ e_migrate_base_dirs (shell); e_convert_local_mail (shell); e_shell_load_modules (shell); if (!disable_eplugin) { /* Register built-in plugin hook types. */ g_type_ensure (E_TYPE_IMPORT_HOOK); g_type_ensure (E_TYPE_PLUGIN_UI_HOOK); /* All EPlugin and EPluginHook subclasses should be * registered in GType now, so load plugins now. */ e_plugin_load_plugins (); } /* Attempt migration -after- loading all modules and plugins, * as both shell backends and certain plugins hook into this. */ e_shell_migrate_attempt (shell); e_shell_event (shell, "ready-to-start", NULL); g_idle_add ((GSourceFunc) idle_cb, remaining_args); gtk_main (); exit: /* Drop what should be the last reference to the shell. * That will cause e_shell_get_default() to henceforth * return NULL. Use that to check for reference leaks. */ g_object_unref (shell); if (e_shell_get_default () != NULL) g_warning ("Shell not finalized on exit"); gtk_accel_map_save (e_get_accels_filename ()); return 0; }
int main (int argc, char **argv) { #ifdef G_OS_WIN32 extern void link_shutdown (void); #endif GConfClient *client; #if DEVELOPMENT gboolean skip_warning_dialog; #endif GnomeProgram *program; GnomeClient *master_client; GOptionContext *context; char *filename; /* Make ElectricFence work. */ free (malloc (10)); bindtextdomain (GETTEXT_PACKAGE, EVOLUTION_LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); context = g_option_context_new (_("- The Evolution PIM and Email Client")); g_option_context_add_main_entries (context, options, GETTEXT_PACKAGE); g_option_context_set_translation_domain(context, GETTEXT_PACKAGE); #ifdef G_OS_WIN32 set_paths (); #endif program = gnome_program_init (PACKAGE, VERSION, LIBGNOMEUI_MODULE, argc, argv, GNOME_PROGRAM_STANDARD_PROPERTIES, GNOME_PARAM_GOPTION_CONTEXT, context, GNOME_PARAM_HUMAN_READABLE_NAME, _("Evolution"), NULL); #ifdef G_OS_WIN32 if (strcmp (_(""), "") == 0) { /* No message catalog installed for the current locale language, * so don't bother with the localisations provided by other things then * either. Reset thread locale to "en-US" and C library locale to "C". */ SetThreadLocale (MAKELCID (MAKELANGID (LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT)); setlocale (LC_ALL, "C"); } #endif if (start_online && start_offline) { fprintf (stderr, _("%s: --online and --offline cannot be used together.\n Use %s --help for more information.\n"), argv[0], argv[0]); exit (1); } if (killev) { filename = g_build_filename (EVOLUTION_TOOLSDIR, "killev", NULL); execl (filename, "killev", NULL); /* Not reached */ exit (0); } client = gconf_client_get_default (); #if DEVELOPMENT if (force_migrate) { destroy_config (client); } #endif if (disable_preview) { gconf_client_set_bool (client, "/apps/evolution/mail/display/show_preview", FALSE, NULL); gconf_client_set_bool (client, "/apps/evolution/mail/display/safe_list", TRUE, NULL); gconf_client_set_bool (client, "/apps/evolution/addressbook/display/show_preview", FALSE, NULL); gconf_client_set_bool (client, "/apps/evolution/calendar/display/show_task_preview", FALSE, NULL); } setup_segv_redirect (); if (evolution_debug_log) { int fd; fd = g_open (evolution_debug_log, O_WRONLY | O_CREAT | O_TRUNC, 0600); if (fd != -1) { dup2 (fd, STDOUT_FILENO); dup2 (fd, STDERR_FILENO); close (fd); } else g_warning ("Could not set up debugging output file."); } master_client = gnome_master_client (); g_signal_connect (G_OBJECT (master_client), "save_yourself", G_CALLBACK (gnome_master_client_save_yourself_cb), NULL); g_signal_connect (G_OBJECT (master_client), "die", G_CALLBACK (gnome_master_client_die_cb), NULL); glade_init (); e_cursors_init (); e_icon_factory_init (); e_passwords_init(); gtk_window_set_default_icon_name ("evolution"); if (setup_only) exit (0); gnome_sound_init ("localhost"); if (!disable_eplugin) { e_plugin_register_type(e_plugin_lib_get_type()); e_plugin_hook_register_type(es_menu_hook_get_type()); e_plugin_hook_register_type(es_event_hook_get_type()); #ifdef ENABLE_PROFILING e_plugin_hook_register_type(e_profile_event_hook_get_type()); #endif e_plugin_hook_register_type(e_plugin_type_hook_get_type()); e_plugin_hook_register_type(e_import_hook_get_type()); e_plugin_hook_register_type(E_TYPE_PLUGIN_UI_HOOK); e_plugin_load_plugins(); } #if DEVELOPMENT skip_warning_dialog = gconf_client_get_bool ( client, SKIP_WARNING_DIALOG_KEY, NULL); if (!skip_warning_dialog && !getenv ("EVOLVE_ME_HARDER")) gconf_client_set_bool ( client, SKIP_WARNING_DIALOG_KEY, show_development_warning (), NULL); else g_idle_add ((GSourceFunc) idle_cb, remaining_args); #else g_idle_add ((GSourceFunc) idle_cb, remaining_args); #endif g_object_unref (client); bonobo_main (); e_icon_factory_shutdown (); g_object_unref (program); gnome_sound_shutdown (); e_cursors_shutdown (); #ifdef G_OS_WIN32 link_shutdown (); #endif return 0; }