* Offer the account creation in the MailTo DBUS handler
[modest] / src / dbus_api / modest-dbus-callbacks.c
index 51cc6d1..52c874c 100644 (file)
@@ -182,14 +182,17 @@ on_idle_mail_to(gpointer user_data)
 {
        gchar *uri = (gchar*)user_data;
        GSList *list_names_and_values = NULL;
-
+       gchar *to = NULL;
        const gchar *cc = NULL;
        const gchar *bcc = NULL;
        const gchar *subject = NULL;
        const gchar *body = NULL;
+       if (!check_and_offer_account_creation ()) {
+               goto cleanup;
+       }
 
        /* Get the relevant items from the list: */
-       gchar *to = uri_parse_mailto (uri, &list_names_and_values);
+       to = uri_parse_mailto (uri, &list_names_and_values);
        GSList *list = list_names_and_values;
        while (list) {
                GSList *list_value = g_slist_next (list);
@@ -209,15 +212,11 @@ on_idle_mail_to(gpointer user_data)
                list = g_slist_next (list_value);
        }
 
-       ComposeMailIdleData *idle_data = g_new0(ComposeMailIdleData, 1); /* Freed in the idle callback. */
-
-       idle_data->to = g_strdup (to);
-       idle_data->cc = g_strdup (cc);
-       idle_data->bcc = g_strdup (bcc);
-       idle_data->subject = g_strdup (subject);
-       idle_data->body = g_strdup (body);
-       idle_data->attachments = NULL;
+       gdk_threads_enter (); /* CHECKED */
+       modest_ui_actions_compose_msg(NULL, to, cc, bcc, subject, body, NULL);
+       gdk_threads_leave (); /* CHECKED */
 
+cleanup:
        /* Free the to: and the list, as required by uri_parse_mailto() */
        g_free(to);
        g_slist_foreach (list_names_and_values, (GFunc)g_free, NULL);
@@ -225,8 +224,6 @@ on_idle_mail_to(gpointer user_data)
 
        g_free(uri);
 
-       on_idle_compose_mail((gpointer)idle_data);
-
        return FALSE; /* Do not call this callback again. */
 }
 
@@ -254,133 +251,43 @@ on_mail_to(GArray * arguments, gpointer data, osso_rpc_t * retval)
 static gboolean
 on_idle_compose_mail(gpointer user_data)
 {
-       if (!check_and_offer_account_creation ())
-               return FALSE;
-       
+       GSList *attachments = NULL;
        ComposeMailIdleData *idle_data = (ComposeMailIdleData*)user_data;
-       gchar **list = NULL;
-       gint i = 0;
-
-       /* Get the TnyTransportAccount so we can instantiate a mail operation: */
-       ModestAccountMgr *account_mgr = modest_runtime_get_account_mgr();
-       gchar *account_name = modest_account_mgr_get_default_account (account_mgr);
-       if (!account_name) {
-               g_printerr ("modest: no account found.\n");
-               
-               /* TODO: If the call to this D-Bus method caused the application to start
-                * then the new-account wizard will now be shown, and we need to wait 
-                * until the account exists instead of just failing.
-                */
-       }
-       
-       TnyAccount *account = NULL;
-       if (account_name && account_mgr) {
-               account = modest_tny_account_store_get_transport_account_for_open_connection (
-                       modest_runtime_get_account_store(), account_name);
+       if (!check_and_offer_account_creation ()) {
+               goto cleanup;
        }
-       
-       if (!account) {
-               g_printerr ("modest: failed to get tny account folder'%s'\n", account_name);
-       } else {
-               gchar * from = modest_account_mgr_get_from_string (account_mgr,
-                                                                 account_name);
-               if (!from) {
-                       g_printerr ("modest: no from address for account '%s'\n", account_name);
-               } else {
-                       /* Get the signature. 
-                        * TODO: This, like much of this function is copy/pasted from 
-                        * modest_ui_actions_on_new_msg(): */
-                       gboolean use_signature = FALSE;
-                       gchar *signature = modest_account_mgr_get_signature (modest_runtime_get_account_mgr (), account_name, &use_signature);
-               
-                       gchar* blank_and_signature = NULL;
-                       if (use_signature) {
-                               blank_and_signature = g_strconcat ("\n", signature, NULL);
-                       } else {
-                               blank_and_signature = g_strdup ("");
-                       }
-                       g_free (signature);
-                       
-                       /* Add it to the body. */
-                       gchar *body_with_sig = NULL;
-                       if (!(idle_data->body))
-                               body_with_sig = g_strdup (blank_and_signature);
-                       else {
-                               body_with_sig = g_strconcat (idle_data->body, blank_and_signature, NULL);
-                       }
-                               
-                       /* Create the message: */
-                       TnyMsg *msg  = modest_tny_msg_new (idle_data->to, from, 
-                               idle_data->cc, idle_data->bcc, idle_data->subject, body_with_sig, 
-                               NULL); /* NULL because m_t_m_n doesn't use it */
-                               
-                       g_free (body_with_sig);
-                       g_free (blank_and_signature);
-                               
-                       if (!msg) {
-                               g_printerr ("modest: failed to create message\n");
-                       } else
-                       {
-                               /* Add the message to a folder and show its UI for editing: */
-                               TnyFolder *folder = modest_tny_account_get_special_folder (account,
-                                                                       TNY_FOLDER_TYPE_DRAFTS);
-                               if (!folder) {
-                                       g_printerr ("modest: failed to find Drafts folder\n");
-                               } else {
-                       
-                                       tny_folder_add_msg (folder, msg, NULL); /* TODO: check err */
 
-                                       /* This is a GDK lock because we are an idle callback and
-                                        * the code below is or does Gtk+ code */
-
-                                       gdk_threads_enter (); /* CHECKED */
-       
-                                       ModestWindow *win = modest_msg_edit_window_new (msg, account_name, FALSE);
-
-                                       /* it seems Sketch at least sends a leading ',' -- take that into account,
-                                        * ie strip that ,*/
-                                       if (idle_data->attachments && idle_data->attachments[0]==',') {
-                                               gchar *tmp = g_strdup (idle_data->attachments + 1);
-                                               g_free(idle_data->attachments);
-                                               idle_data->attachments = tmp;
-                                       }
-
-                                       if (idle_data->attachments != NULL) {
-                                               list = g_strsplit(idle_data->attachments, ",", 0);
-                                               for (i=0; list[i] != NULL; i++) {
-                                                       modest_msg_edit_window_attach_file_one(
-                                                               (ModestMsgEditWindow *)win, list[i]);
-                                               }
-                                               g_strfreev(list);
-                                       }
-
-                                       modest_window_mgr_register_window (modest_runtime_get_window_mgr (), win);
-                                       gtk_widget_show_all (GTK_WIDGET (win));
-
-                                       gdk_threads_leave (); /* CHECKED */
-                               
-                                       g_object_unref (G_OBJECT(folder));
-                                       g_object_unref (win);
-                               }
-                       
-                               g_object_unref (G_OBJECT(msg));
-                       }
-                       
-                       g_object_unref (G_OBJECT(account));
+       /* it seems Sketch at least sends a leading ',' -- take that into account,
+        * ie strip that ,*/
+       if (idle_data->attachments && idle_data->attachments[0]==',') {
+               gchar *tmp = g_strdup (idle_data->attachments + 1);
+               g_free(idle_data->attachments);
+               idle_data->attachments = tmp;
+       }
+       if (idle_data->attachments != NULL) {
+               gchar **list = g_strsplit(idle_data->attachments, ",", 0);
+               gint i = 0;
+               for (i=0; list[i] != NULL; i++) {
+                       attachments = g_slist_append(attachments, g_strdup(list[i]));
                }
-       }
-
-       /* Free the idle data: */
+               g_strfreev(list);
+       }
+       gdk_threads_enter (); /* CHECKED */
+       modest_ui_actions_compose_msg(NULL, idle_data->to, idle_data->cc,
+                                     idle_data->bcc, idle_data->subject,
+                                     idle_data->body, attachments);
+       gdk_threads_leave (); /* CHECKED */
+cleanup:
+       g_slist_foreach(attachments, (GFunc)g_free, NULL);
+       g_slist_free(attachments);
        g_free (idle_data->to);
        g_free (idle_data->cc);
        g_free (idle_data->bcc);
        g_free (idle_data->subject);
        g_free (idle_data->body);
        g_free (idle_data->attachments);
-       g_free (idle_data);
-       
-       g_free (account_name);
-       
+       g_free(idle_data);
+
        return FALSE; /* Do not call this callback again. */
 }
 
@@ -790,11 +697,6 @@ on_idle_send_receive(gpointer user_data)
        /* Pick the main window if it exists */
        win = modest_window_mgr_get_main_window (modest_runtime_get_window_mgr ());
 
-       /* This seems to be necessary to show new messages in the current window.
-        * I would expect this to be after the send_receive, but maybe 
-        * this makes a connection too. murrayc. */
-       modest_do_refresh_current_folder (win);
-
        /* Send & receive all if "Update automatically" is set */
        /* TODO: check the auto-update parameter in the configuration */
        modest_ui_actions_do_send_receive_all (win);