Fixes NB#143352, add a DBus API to request inmmediate Send&Receive (like manual send...
[modest] / src / dbus_api / modest-dbus-callbacks.c
index 61b7495..7450644 100644 (file)
@@ -38,6 +38,7 @@
 #include "modest-debug.h"
 #include "modest-search.h"
 #include "widgets/modest-msg-edit-window.h"
+#include "widgets/modest-window-mgr.h"
 #include "modest-tny-msg.h"
 #include "modest-platform.h"
 #include "modest-defs.h"
@@ -60,6 +61,7 @@
 #include <modest-accounts-window.h>
 #include <modest-folder-window.h>
 #include <modest-mailboxes-window.h>
+#include <modest-maemo-utils.h>
 #endif
 
 #include <tny-list.h>
@@ -627,7 +629,8 @@ on_open_message_performer (gboolean canceled,
                                        gtk_widget_show_all (GTK_WIDGET (msg_view));
                                }
                        }
-                       g_object_unref (account);
+                       if (account)
+                               g_object_unref (account);
 
                }
                on_find_msg_async_destroy (info);
@@ -919,10 +922,28 @@ on_delete_message (GArray *arguments, gpointer data, osso_rpc_t *retval)
        return OSSO_OK;
 }
 
+typedef struct _SendReceivePerformerData {
+       gchar *account_id;
+       gboolean manual;
+       ModestMailOperation *mail_op;
+} SendReceivePerformerData;
+
+static void send_receive_performer_data_free (SendReceivePerformerData *data)
+{
+       if (data->mail_op) {
+               g_object_unref (data->mail_op);
+       }
+       g_free (data->account_id);
+       g_slice_free (SendReceivePerformerData, data);
+}
+
 static gboolean
 on_idle_send_receive(gpointer user_data)
 {
        gboolean auto_update;
+       SendReceivePerformerData *data = (SendReceivePerformerData *) user_data;
+       ModestConnectedVia connect_when;
+       gboolean right_connection = FALSE;
 
        gdk_threads_enter (); /* CHECKED */
 
@@ -930,14 +951,37 @@ on_idle_send_receive(gpointer user_data)
        auto_update = modest_conf_get_bool (modest_runtime_get_conf (), 
                                            MODEST_CONF_AUTO_UPDATE, NULL);
 
-       if (auto_update)
+       if (auto_update) {
                /* Do send receive. Never set the current top window
                   as we always assume that DBus send/receive requests
                   are not user driven */
-               modest_ui_actions_do_send_receive_all (NULL, FALSE, FALSE, FALSE);
-       else
+
+               connect_when = modest_conf_get_int (modest_runtime_get_conf (), 
+                                                   MODEST_CONF_UPDATE_WHEN_CONNECTED_BY, NULL);
+               /* Perform a send and receive if the user selected to connect
+                  via any mean or if the current connection method is the
+                  same as the one specified by the user */
+               if (connect_when == MODEST_CONNECTED_VIA_ANY ||
+                   connect_when == modest_platform_get_current_connection ()) {
+                       right_connection = TRUE;
+               }
+       } else {
                /* Disable auto update */
                modest_platform_set_update_interval (0);
+       }
+
+       if ((auto_update && right_connection) || data->manual) {
+               if (data->account_id) {
+                       modest_ui_actions_do_send_receive (data->account_id, data->manual, FALSE, data->manual, NULL);
+               } else {
+                       modest_ui_actions_do_send_receive_all (NULL, data->manual, FALSE, data->manual);
+               }
+       }
+
+       modest_mail_operation_queue_remove (modest_runtime_get_mail_operation_queue (),
+                                           data->mail_op);
+
+       send_receive_performer_data_free (data);
 
        gdk_threads_leave (); /* CHECKED */
        
@@ -1144,25 +1188,23 @@ on_send_receive_performer(gboolean canceled,
                          TnyAccount *account,
                          gpointer user_data)
 {
-       ModestConnectedVia connect_when;
+       SendReceivePerformerData *data = (SendReceivePerformerData *) user_data;
 
-       if (err || canceled) {
+       if (err || canceled || data == NULL) {
                g_idle_add (notify_error_in_dbus_callback, NULL);
+               if (data) {
+                       send_receive_performer_data_free (data);
+               }
                return;
        }
 
-       connect_when = modest_conf_get_int (modest_runtime_get_conf (), 
-                                           MODEST_CONF_UPDATE_WHEN_CONNECTED_BY, NULL);
-
-       /* Perform a send and receive if the user selected to connect
-          via any mean or if the current connection method is the
-          same as the one specified by the user */
-       if (connect_when == MODEST_CONNECTED_VIA_ANY ||
-           connect_when == modest_platform_get_current_connection ()) {
-               g_idle_add (on_idle_send_receive, NULL);
+       data->mail_op = modest_mail_operation_new (NULL);
+       modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
+                                        data->mail_op);
+       if (data->manual) {
+               g_idle_add (on_idle_send_receive, data);
        } else {
-               /* We need this to allow modest to finish */
-               g_idle_add (notify_error_in_dbus_callback, NULL);
+               modest_heartbeat_add (on_idle_send_receive, data);
        }
 }
 
@@ -1171,11 +1213,49 @@ static gint
 on_send_receive(GArray *arguments, gpointer data, osso_rpc_t * retval)
 {
        TnyDevice *device = modest_runtime_get_device ();
+       SendReceivePerformerData *srp_data;
+
+       srp_data = g_slice_new0 (SendReceivePerformerData);
+       srp_data->account_id = NULL;
+       srp_data->manual = FALSE;
+       srp_data->mail_op = NULL;
 
        if (!tny_device_is_online (device))
-               modest_platform_connect_and_perform (NULL, FALSE, NULL, on_send_receive_performer, NULL);
+               modest_platform_connect_and_perform (NULL, FALSE, NULL, on_send_receive_performer, srp_data);
        else
-               on_send_receive_performer (FALSE, NULL, NULL, NULL, NULL);
+               on_send_receive_performer (FALSE, NULL, NULL, NULL, srp_data);
+
+       return OSSO_OK;
+}
+
+static gint
+on_send_receive_full (GArray *arguments, gpointer data, osso_rpc_t * retval)
+{
+       osso_rpc_t val;
+       gchar *account_id;
+       gboolean manual;
+       TnyDevice *device;
+       SendReceivePerformerData *srp_data;
+
+       val = g_array_index (arguments, osso_rpc_t, MODEST_DBUS_SEND_RECEIVE_FULL_ARG_ACCOUNT_ID);
+       account_id = g_strdup (val.value.s);
+       val = g_array_index (arguments, osso_rpc_t, MODEST_DBUS_SEND_RECEIVE_FULL_ARG_MANUAL);
+       manual = val.value.b;
+
+       srp_data = g_slice_new0 (SendReceivePerformerData);
+       srp_data->manual = manual;
+       if (account_id && account_id[0] != '\0') {
+               srp_data->account_id = account_id;
+       } else {
+               srp_data->account_id = NULL;
+               g_free (account_id);
+       }
+       srp_data->mail_op = NULL;
+       device = modest_runtime_get_device ();
+       if (!tny_device_is_online (device))
+               modest_platform_connect_and_perform (NULL, FALSE, NULL, on_send_receive_performer, srp_data);
+       else
+               on_send_receive_performer (FALSE, NULL, NULL, NULL, srp_data);
 
        return OSSO_OK;
 }
@@ -1206,32 +1286,30 @@ on_idle_open_account (gpointer user_data)
                top = modest_window_mgr_show_initial_window (mgr);
 
 #ifdef MODEST_TOOLKIT_HILDON2
-       if (MODEST_IS_ACCOUNTS_WINDOW (top)) {
-               GtkWidget *new_window;
-               ModestProtocolType store_protocol;
-               gboolean mailboxes_protocol;
-
-               store_protocol = modest_account_mgr_get_store_protocol (modest_runtime_get_account_mgr (), 
-                                                                       acc_name);
-               mailboxes_protocol = 
-                       modest_protocol_registry_protocol_type_has_tag (modest_runtime_get_protocol_registry (),
-                                                                       store_protocol,
-                                                                       MODEST_PROTOCOL_REGISTRY_MULTI_MAILBOX_PROVIDER_PROTOCOLS);
-
-               if (mailboxes_protocol) {
-                       new_window = GTK_WIDGET (modest_mailboxes_window_new (acc_name));
-               } else {
-                       new_window = GTK_WIDGET (modest_folder_window_new (NULL));
-                       modest_folder_window_set_account (MODEST_FOLDER_WINDOW (new_window),
-                                                         acc_name);
-               }
+       GtkWidget *new_window;
+       ModestProtocolType store_protocol;
+       gboolean mailboxes_protocol;
+
+       store_protocol = modest_account_mgr_get_store_protocol (modest_runtime_get_account_mgr (), 
+                                                               acc_name);
+       mailboxes_protocol = 
+               modest_protocol_registry_protocol_type_has_tag (modest_runtime_get_protocol_registry (),
+                                                               store_protocol,
+                                                               MODEST_PROTOCOL_REGISTRY_MULTI_MAILBOX_PROVIDER_PROTOCOLS);
+
+       if (mailboxes_protocol) {
+               new_window = GTK_WIDGET (modest_mailboxes_window_new (acc_name));
+       } else {
+               new_window = GTK_WIDGET (modest_folder_window_new (NULL));
+               modest_folder_window_set_account (MODEST_FOLDER_WINDOW (new_window),
+                                                 acc_name);
+       }
 
-               if (modest_window_mgr_register_window (mgr, MODEST_WINDOW (new_window), NULL)) {
-                       gtk_widget_show (new_window);
-               } else {
-                       gtk_widget_destroy (new_window);
-                       new_window = NULL;
-               }
+       if (modest_window_mgr_register_window (mgr, MODEST_WINDOW (new_window), NULL)) {
+               gtk_widget_show (new_window);
+       } else {
+               gtk_widget_destroy (new_window);
+               new_window = NULL;
        }
 #else
        if (MODEST_IS_MAIN_WINDOW (top)) {
@@ -1370,18 +1448,38 @@ on_idle_show_memory_low (gpointer user_data)
        return FALSE;
 }
 
+static gboolean
+on_idle_present_modal (gpointer user_data)
+{
+       gdk_threads_enter ();
+       gtk_window_present (user_data);
+       gdk_threads_leave ();
+
+       return FALSE;
+}
+
+
 /* Callback for normal D-BUS messages */
 gint
 modest_dbus_req_handler(const gchar * interface, const gchar * method,
                        GArray * arguments, gpointer data,
                        osso_rpc_t * retval)
 {
+       GtkWindow *dialog;
+
        /* Check memory low conditions */
        if (modest_platform_check_memory_low (NULL, FALSE)) {
                g_idle_add (on_idle_show_memory_low, NULL);
                goto param_error;
        }
 
+       /* Check if there is already a dialog or note open */
+       dialog = modest_window_mgr_get_modal (modest_runtime_get_window_mgr());
+       if (dialog) {
+               g_idle_add (on_idle_present_modal, dialog);
+               return OSSO_OK;
+       }
+
        if (g_ascii_strcasecmp (method, MODEST_DBUS_METHOD_MAIL_TO) == 0) {
                if (arguments->len != MODEST_DBUS_MAIL_TO_ARGS_COUNT)
                        goto param_error;
@@ -1401,6 +1499,10 @@ modest_dbus_req_handler(const gchar * interface, const gchar * method,
                if (arguments->len != 0)
                        goto param_error;
                return on_send_receive (arguments, data, retval);
+       } else if (g_ascii_strcasecmp (method, MODEST_DBUS_METHOD_SEND_RECEIVE_FULL) == 0) {
+               if (arguments->len != MODEST_DBUS_SEND_RECEIVE_FULL_ARGS_COUNT)
+                       goto param_error;
+               return on_send_receive_full (arguments, data, retval);
        } else if (g_ascii_strcasecmp (method, MODEST_DBUS_METHOD_COMPOSE_MAIL) == 0) {
                if (arguments->len != MODEST_DBUS_COMPOSE_MAIL_ARGS_COUNT)
                        goto param_error;
@@ -1432,7 +1534,7 @@ modest_dbus_req_handler(const gchar * interface, const gchar * method,
        g_idle_add (notify_error_in_dbus_callback, NULL);
        return OSSO_ERROR;
 }
-                                        
+
 /* A complex D-Bus type (like a struct),
  * used to return various information about a search hit.
  */