* all:
[modest] / src / modest-main.c
index 06b627f..6dd8fa5 100644 (file)
 
 #include <modest-runtime.h>
 #include <modest-defs.h>
-#include <modest-ui.h>
-#include <modest-icon-factory.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>
 
-static gchar*  check_account (ModestAccountMgr* account_mgr, const gchar *account);
-TnyAccount*    get_transport_account (ModestAccountMgr *account_mgr,
-                                     ModestAccountData *account_data,
-                                     const gchar *account);
-
-static int     start_ui (const gchar* mailto, const gchar *cc, const gchar *bcc,
-                        const gchar* subject, const gchar *body);
-static int     send_mail (const gchar* account,
-                         const gchar* mailto, const gchar *cc, const gchar *bcc,
-                         const gchar* subject, const gchar *body);
+#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);
 int
 main (int argc, char *argv[])
 {
@@ -68,8 +83,8 @@ main (int argc, char *argv[])
                
        static gboolean batch = FALSE;
        static gchar    *mailto=NULL, *subject=NULL, *bcc=NULL,
-                       *cc=NULL, *body=NULL, *account=NULL;
-
+               *cc=NULL, *body=NULL, *account=NULL;
+       gchar *account_or_default;
        static GOptionEntry options[] = {
                { "mailto", 'm', 0, G_OPTION_ARG_STRING, &mailto,
                  N_("New email to <addresses> (comma-separated)"), NULL},
@@ -88,11 +103,6 @@ main (int argc, char *argv[])
                { NULL, 0, 0, 0, NULL, NULL, NULL }
        };
 
-       if (!modest_runtime_init ()) {
-               g_printerr ("modest: cannot init runtime\n");
-               return MODEST_ERR_INIT;
-       }
-       
        context = g_option_context_new (NULL);
        g_option_context_add_main_entries (context, options, NULL);
        
@@ -105,17 +115,33 @@ main (int argc, char *argv[])
                goto cleanup;
        }
        g_option_context_free (context);
+       
+       if (!modest_runtime_init ()) {
+               g_printerr ("modest: cannot init runtime\n");
+               return MODEST_ERR_INIT;
+       }
+       
 
+       account_or_default = check_account (account);
+       g_free (account);
        
        if (!batch) {
                if (!modest_runtime_init_ui (argc, argv)) {
-                       g_printerr ("modest: cannot start UI\n");
+                       g_printerr ("modest: cannot start ui\n");
                        retval = MODEST_ERR_UI;
                        goto cleanup;
                } else
-                       retval = start_ui (mailto, cc, bcc, subject, body);
-       } else 
-               retval = send_mail (account, mailto, cc, bcc, subject, body);
+                       retval = start_ui (account_or_default,
+                                          mailto, cc, bcc, subject, body);
+       } else {
+               if (!account_or_default) {
+                       g_printerr ("modest: no account has been defined yet\n");
+                       retval = MODEST_ERR_CONF;
+                       goto cleanup;
+               }
+               retval = send_mail (account_or_default,
+                                   mailto, cc, bcc, subject, body);
+       }
        
 cleanup:
        g_free (mailto);
@@ -132,147 +158,133 @@ cleanup:
 }
 
 
-static int
-start_ui (const gchar* mailto, const gchar *cc, const gchar *bcc,
+static ModestErrorCode 
+start_ui (const gchar *account_name, const gchar* mailto, const gchar *cc, const gchar *bcc,
          const gchar* subject, const gchar *body)
 {
        ModestWindow *win = NULL;
-       ModestUI *modest_ui = NULL;
-       
-       gint retval = 0;
-       modest_ui = modest_ui_new ();
 
-       if (mailto||cc||bcc||subject||body) {
-               g_warning ("FIXME: implement this");
-/*             ok = modest_ui_new_edit_window (modest_ui, */
-/*                                             mailto,  /\* to *\/ */
-/*                                             cc,      /\* cc *\/ */
-/*                                             bcc,     /\* bcc *\/ */
-/*                                             subject,    /\* subject *\/ */
-/*                                             body,    /\* body *\/ */
-/*                                             NULL);   /\* attachments *\/ */
+       if (mailto||cc||bcc||subject||body) {           
+               gchar *from;
+               TnyMsg     *msg;
+               TnyFolder  *folder;
+               TnyAccount *account;
+               
+               if (!account_name) {
+                       g_printerr ("modest: no valid account provided, "
+                                   "nor is default one available\n");
+                       return MODEST_ERR_PARAM;
+               }
+               from = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(),
+                                                          account_name);
+               msg  = modest_tny_msg_new (mailto,from,cc,bcc,subject,body,NULL);
+               if (!msg) {
+                       g_printerr ("modest: failed to create message\n");
+                       g_free (from);
+                       return MODEST_ERR_SEND;
+               }
+
+               account = modest_tny_account_store_get_tny_account_by_account (
+                       modest_runtime_get_account_store(), account_name,
+                       TNY_ACCOUNT_TYPE_TRANSPORT);
+               if (!account) {
+                       g_printerr ("modest: failed to get tny account folder\n");
+                       g_free (from);
+                       g_object_unref (G_OBJECT(msg));
+                       return MODEST_ERR_SEND;
+               }
+               
+               folder = modest_tny_account_get_special_folder (account,
+                                                               TNY_FOLDER_TYPE_DRAFTS);
+               if (!folder) {
+                       g_printerr ("modest: failed to find Drafts folder\n");
+                       g_free (from);
+                       g_object_unref (G_OBJECT(msg));
+                       g_object_unref (G_OBJECT(account));
+                       return MODEST_ERR_SEND;
+               }
+               tny_folder_add_msg (folder, msg, NULL); /* FIXME: check err */
+
+               win = modest_msg_edit_window_new (msg, account_name);
+               
+               g_object_unref (G_OBJECT(msg));
+               g_object_unref (G_OBJECT(account));
+               g_object_unref (G_OBJECT(folder));
+               g_free (from);
        } else 
-               win = modest_ui_main_window (modest_ui);
-       
-       if (win) {
-               gtk_widget_show_all (GTK_WIDGET (win));
-               gtk_main();
+               win = modest_main_window_new ();
+
+       if (!win) {
+               g_printerr ("modest: failed to create window\n");
+               return MODEST_ERR_UI;
        }
-       if (modest_ui)
-               g_object_unref (G_OBJECT(modest_ui));
        
-       return retval;
+       gtk_widget_show_all (GTK_WIDGET (win));
+       gtk_main();
+       
+       return MODEST_ERR_NONE;
 }
 
+static gchar*
+check_account (const gchar* account)
+{
+       gchar *retval;
+       ModestAccountMgr *account_mgr;
+       
+       account_mgr = modest_runtime_get_account_mgr();
+       
+       if (!account)
+               retval = modest_account_mgr_get_default_account (account_mgr);
+       else
+               retval = g_strdup (account);
+
+       /* sanity check */
+       if (!account || !modest_account_mgr_account_exists (account_mgr, account, FALSE)) {
+               g_free (retval);
+               retval = NULL;
+       }
+       return retval;
+}
 
-static int
-send_mail (const gchar* account_,
+static ModestErrorCode
+send_mail (const gchar* account_name,
           const gchar* mailto, const gchar *cc, const gchar *bcc,
           const gchar* subject, const gchar *body)
 {
-       ModestAccountMgr *account_mgr;
-       ModestMailOperation *mail_operation = NULL;
-       TnyTransportAccount *account = NULL;
-       ModestAccountData *account_data;
-       gchar *account_name = NULL, *sender_name = NULL;
        int retval;
-
-       account_mgr = modest_runtime_get_account_mgr ();
+       TnyTransportAccount *account;
+       ModestMailOperation *mail_operation = NULL;
+       gchar               *from_string;
        
-       account_name = check_account (account_mgr, account_);   
-       if (!account_name) 
-               return MODEST_ERR_SEND;
+       g_return_val_if_fail (account_name, MODEST_ERR_SEND);
 
-       account_data = modest_account_mgr_get_account_data (account_mgr, account_name);
-       if (!account_data) {
-               g_printerr ("modest: cannot get account data for %s\n", account_name);
-               g_free (account_name);
-               return MODEST_ERR_SEND;
-       }
-       account = TNY_TRANSPORT_ACCOUNT(get_transport_account (account_mgr, account_data,
-                                                              account_name));
+       account = TNY_TRANSPORT_ACCOUNT (modest_tny_account_store_get_tny_account_by_account
+                                        (modest_runtime_get_account_store(), account_name,
+                                         TNY_ACCOUNT_TYPE_TRANSPORT));
        if (!account) {
-               g_printerr ("modest: cannot get transport account for %s\n", account_name);
-               g_free (account_name);
-               modest_account_mgr_free_account_data (account_mgr, account_data);
+               g_printerr ("modest: no transport defined account for %s\n",
+                           account_name);
                return MODEST_ERR_SEND;
        }
-
-       sender_name = g_strdup_printf ("%s <%s>",
-                                      account_data->fullname ?  account_data->fullname : "",
-                                      account_data->email    ?  account_data->email : "");
+       from_string = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(),
+                                                         account_name);
 
        mail_operation = modest_mail_operation_new ();
-       modest_mail_operation_send_new_mail (mail_operation,
-                                            account,
-                                            sender_name,
-                                            mailto,
+       modest_mail_operation_send_new_mail (mail_operation, account,
+                                            from_string, mailto,
                                             cc, bcc, subject, body,
                                             NULL);
-
        if (modest_mail_operation_get_status (mail_operation) == 
            MODEST_MAIL_OPERATION_STATUS_FAILED) {
                retval = MODEST_ERR_SEND;
        } else
                retval = MODEST_ERR_NONE; /* hurray! */
-
-       g_free (sender_name);
-       g_free (account_name);
-       modest_account_mgr_free_account_data (account_mgr, account_data);
-                       
-       return retval;
-}
-
-
-
-               
-static gchar*
-check_account (ModestAccountMgr* account_mgr, const gchar *account)
-{
-       gchar *account_or_default;
-
-       if (account)
-               account_or_default = g_strdup(account);
-       else {
-               account_or_default = modest_account_mgr_get_default_account (account_mgr);
-               if (!account_or_default) {
-                       g_printerr ("modest: no default account has been defined\n");
-                       return NULL;
-               }
-       }               
-
-       if (!modest_account_mgr_account_exists (account_mgr, account_or_default, FALSE, NULL)) {
-               g_printerr ("modest: account %s is undefined\n", account_or_default);
-               return NULL;
-       }
-
-       return account_or_default;
-}
-
-
-TnyAccount*
-get_transport_account (ModestAccountMgr *account_mgr,
-                      ModestAccountData *account_data,
-                      const gchar *account_name)
-{
-       TnyAccount *account;
        
-       if (!account_data->transport_account || !account_data->transport_account->account_name) {
-               g_printerr ("modest: no transport account defined for %s\n", account_name);
-               return NULL;
-       }
-
-       account = (modest_tny_account_store_get_tny_account_from_server_account (
-                          modest_runtime_get_account_store(),
-                          account_data->transport_account->account_name));
+       g_object_unref (G_OBJECT(account));
+       g_object_unref (G_OBJECT(mail_operation));
+       g_free (from_string);
        
-       if (!TNY_IS_TRANSPORT_ACCOUNT(account)) {
-               g_printerr ("modest: no valid transport account defined for %s\n", account_name);
-               g_object_unref (G_OBJECT(account));
-               return NULL;
-       }
-
-       return account;
+       return retval;
 }