-#include <glib/gi18n.h>
-#include <gtk/gtkwidget.h>
-
-#include <tny-list.h>
-#include <tny-transport-account.h>
-#include <tny-account-store.h>
-#include <tny-list.h>
-#include <tny-simple-list.h>
-
-#include <modest-runtime.h>
-#include <modest-defs.h>
-#include <modest-tny-account-store.h>
-#include <modest-tny-platform-factory.h>
-#include <modest-mail-operation.h>
-#include <modest-tny-account.h>
-#include <modest-tny-msg.h>
-#include <modest-account-mgr.h>
-#include <modest-account-mgr-helpers.h>
-
-#include <widgets/modest-main-window.h>
-#include <widgets/modest-msg-edit-window.h>
-
-typedef enum {
- MODEST_ERR_NONE = 0, /* no error */
- MODEST_ERR_OPTIONS = 1, /* error in the options */
- MODEST_ERR_CONF = 2, /* error getting confuration db */
- MODEST_ERR_UI = 3, /* error in the UI */
- MODEST_ERR_HILDON = 4, /* error with Hildon (maemo-only) */
- MODEST_ERR_RUN = 5, /* error running */
- MODEST_ERR_SEND = 6, /* error sending mail */
- MODEST_ERR_PARAM = 7, /* error in one or more of the parameters */
- MODEST_ERR_INIT = 8 /* error in initialization */
-} ModestErrorCode;
-
-static gchar* check_account (const gchar *account);
-
-static ModestErrorCode start_ui (const gchar *account,
- const gchar* mailto, const gchar *cc,
- const gchar *bcc, const gchar* subject, const gchar *body);
-
-static ModestErrorCode send_mail (const gchar* account,
- const gchar* mailto, const gchar *cc, const gchar *bcc,
- const gchar* subject, const gchar *body);
+#include "modest-runtime.h"
+#include "modest-init.h"
+#include "modest-platform.h"
+#include "modest-ui-actions.h"
+
+static gboolean show_ui = FALSE;
+static gint shutdown_timeout = 0;
+static GOptionEntry option_entries [] =
+{
+ { "show-ui", 's', 0, G_OPTION_ARG_NONE, &show_ui, "Show UI immediately, so no wait for DBUS activation", NULL },
+ { "shutdown-timeout", 't', 0, G_OPTION_ARG_INT, &shutdown_timeout, "Timeout in minutes for running Modest in prestart mode", NULL },
+ { NULL }
+};
+
+static guint shutdown_timeout_id = 0;
+
+typedef struct {
+ gulong queue_handler;
+ gulong window_list_handler;
+ gulong get_password_handler;
+} MainSignalHandlers;
+
+static gboolean
+on_idle_exit_modest (gpointer data)
+{
+ MainSignalHandlers *handlers;
+ ModestMailOperationQueue *mail_op_queue;
+
+ /* Protect the Gtk calls */
+ gdk_threads_enter ();
+ mail_op_queue = modest_runtime_get_mail_operation_queue ();
+
+ if (modest_mail_operation_queue_running_shutdown (mail_op_queue)) {
+
+ /* Disconnect signals. Will be freed by the destroy notify */
+ handlers = (MainSignalHandlers *) data;
+ g_signal_handler_disconnect (modest_runtime_get_mail_operation_queue (),
+ handlers->queue_handler);
+ g_signal_handler_disconnect (modest_runtime_get_window_mgr (),
+ handlers->window_list_handler);
+ g_signal_handler_disconnect (modest_runtime_get_account_store (),
+ handlers->get_password_handler);
+ g_free (handlers);
+
+ /* Wait for remaining tasks */
+ while (gtk_events_pending ())
+ gtk_main_iteration ();
+
+ gtk_main_quit ();
+ } else {
+ ModestMailOperation *mail_op;
+ mail_op = modest_mail_operation_new (NULL);
+ modest_mail_operation_queue_add (mail_op_queue, mail_op);
+ modest_mail_operation_shutdown (mail_op, modest_runtime_get_account_store ());
+ g_object_unref (mail_op);
+ }
+
+ gdk_threads_leave ();
+
+ return FALSE;
+}
+
+static void
+on_queue_empty (ModestMailOperationQueue *queue,
+ gpointer user_data)
+{
+ ModestWindowMgr *mgr = modest_runtime_get_window_mgr ();
+
+ if (!modest_runtime_get_allow_shutdown ())
+ return;
+
+ /* Exit if the queue is empty and there are no more
+ windows. We can exit as well if the main window is hidden
+ and it's the only one */
+ if (modest_window_mgr_get_num_windows (mgr) == 0)
+ g_idle_add_full (G_PRIORITY_LOW, on_idle_exit_modest, user_data, NULL);
+}
+
+static void
+on_window_list_empty (ModestWindowMgr *window_mgr,
+ gpointer user_data)
+{
+ ModestMailOperationQueue *queue = modest_runtime_get_mail_operation_queue ();
+
+ if (!modest_runtime_get_allow_shutdown ())
+ return;
+
+ /* Exit if there are no more windows and the queue is empty */
+ if (modest_mail_operation_queue_num_elements (queue) == 0)
+ g_idle_add_full (G_PRIORITY_LOW, on_idle_exit_modest, user_data, NULL);
+}
+
+static gboolean
+shutdown_timeout_handler (gpointer userdata)
+{
+ modest_runtime_set_allow_shutdown (TRUE);
+ return FALSE;
+}
+