* modest-main:
[modest] / src / modest-main.c
1 /* Copyright (c) 2006, Nokia Corporation
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  * * Redistributions of source code must retain the above copyright
9  *   notice, this list of conditions and the following disclaimer.
10  * * Redistributions in binary form must reproduce the above copyright
11  *   notice, this list of conditions and the following disclaimer in the
12  *   documentation and/or other materials provided with the distribution.
13  * * Neither the name of the Nokia Corporation nor the names of its
14  *   contributors may be used to endorse or promote products derived from
15  *   this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
18  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30
31 #include <glib.h>
32 #include <glib/gi18n.h>
33 #include <gtk/gtkwidget.h>
34 #include <tny-list.h>
35 #include <tny-transport-account.h>
36 #include <tny-account-store.h>
37 #include <tny-list.h>
38 #include <tny-simple-list.h>
39
40 #include <config.h>
41 #include <modest-conf.h>
42 #include <modest-account-mgr.h>
43 #include <modest-ui.h>
44 #include <modest-debug.h>
45 #include <modest-icon-factory.h>
46 #include <modest-tny-account-store.h>
47 #include <modest-tny-platform-factory.h>
48 #include <modest-mail-operation.h>
49
50 #include <camel/camel-url.h>
51
52 #if MODEST_PLATFORM_ID==2 /* maemo */
53 #include <libosso.h>
54 #endif /* MODEST_PLATFORM==2 */
55
56 /* return values */
57 #define MODEST_ERR_NONE    0
58 #define MODEST_ERR_OPTIONS 1
59 #define MODEST_ERR_CONF    2
60 #define MODEST_ERR_UI      3
61 #define MODEST_ERR_HILDON  4
62 #define MODEST_ERR_RUN     5
63 #define MODEST_ERR_SEND    6
64
65 static gboolean hildon_init (); /* NOP if HILDON is not defined */
66 static int start_ui (const gchar* mailto, const gchar *cc,
67                      const gchar *bcc, const gchar* subject, const gchar *body,
68                      TnyAccountStore *account_store);
69
70 static int send_mail (const gchar* mailto, const gchar *cc, const gchar *bcc,
71                       const gchar* subject, const gchar *body);
72
73 int
74 main (int argc, char *argv[])
75 {
76         GOptionContext     *context       = NULL;
77         TnyPlatformFactory *fact          = NULL;
78         TnyAccountStore    *account_store = NULL;
79         ModestConf         *modest_conf   = NULL;
80         
81         GError *err = NULL;
82         int retval  = MODEST_ERR_NONE;
83                 
84         static gboolean batch=FALSE, factory_settings=FALSE;
85         static gchar    *mailto, *subject, *bcc, *cc, *body, *account;
86
87         static GOptionEntry options[] = {
88                 { "mailto", 'm', 0, G_OPTION_ARG_STRING, &mailto,
89                   N_("New email to <addresses> (comma-separated)"), NULL},
90                 { "subject", 's', 0, G_OPTION_ARG_STRING, &subject,
91                   N_("Subject for a new mail"), NULL},
92                 { "body", 'b', 0, G_OPTION_ARG_STRING, &body,
93                   N_("Body for a new email"), NULL},
94                 { "cc",  'c', 0, G_OPTION_ARG_STRING, &cc,
95                   N_("Cc: addresses for a new mail (comma-separated)"), NULL},
96                 { "bcc", 'x', 0, G_OPTION_ARG_STRING, &bcc,
97                   N_("Bcc: addresses for a new mail (comma-separated)"), NULL},
98                 { "account", 'a', 0, G_OPTION_ARG_STRING, &account,
99                   N_("Account to use (if specified, default account is used)"), NULL},
100                 { "batch", 'y', 0, G_OPTION_ARG_NONE, &batch,
101                   N_("Run in batch mode (don't show UI)"), NULL},
102                 { "factory-settings", 0, 0, G_OPTION_ARG_NONE, &factory_settings,
103                   N_("return to factory settings"), NULL},
104                 { NULL, 0, 0, 0, NULL, NULL, NULL }
105         };
106
107         bindtextdomain (GETTEXT_PACKAGE, MODEST_LOCALEDIR);
108         bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
109         textdomain (GETTEXT_PACKAGE);
110
111         modest_debug_g_type_init  ();           
112         modest_debug_logging_init ();
113
114         g_thread_init (NULL);
115         
116         context = g_option_context_new (NULL);
117         g_option_context_add_main_entries (context, options, NULL);
118         
119         if (!g_option_context_parse (context, &argc, &argv, &err)) {
120                 g_printerr ("modest: error in command line parameter(s): '%s', exiting\n",
121                             err ? err->message : "");
122                 g_error_free (err);
123                 retval = MODEST_ERR_OPTIONS;
124                 goto cleanup;
125         }
126         g_option_context_free (context);
127
128         /* Get platform factory */      
129         fact = modest_tny_platform_factory_get_instance ();
130
131         /* Check modest conf */
132         modest_conf = modest_tny_platform_factory_get_conf_instance
133                 (MODEST_TNY_PLATFORM_FACTORY(fact));
134         if (!modest_conf) {
135                 g_printerr ("modest: failed to initialize config system, exiting\n");
136                 retval = MODEST_ERR_CONF;
137                 goto cleanup;
138         }
139         
140         /* Get the account store */
141         account_store = tny_platform_factory_new_account_store (fact);
142         if (!account_store) {
143                 g_printerr ("modest: could not initialize a ModestTnyAccountStore instance\n");
144                 retval = MODEST_ERR_RUN;
145                 goto cleanup;
146         }
147
148         
149         if (!getenv("DISPLAY"))
150                 batch = TRUE; 
151         
152         if (!batch) {
153                 gdk_threads_init ();
154                 gtk_init (&argc, &argv);
155                 modest_init_header_columns (factory_settings);
156                 
157                 retval = start_ui (mailto, cc, bcc, subject, body, account_store);
158         } else 
159                 retval = send_mail (mailto, cc, bcc, subject, body);
160         
161 cleanup:
162         if (fact)
163                 g_object_unref (G_OBJECT(fact));
164         /* this will clean up account_store as well */
165         
166         return retval;
167 }
168
169
170 static int
171 start_ui (const gchar* mailto, const gchar *cc, const gchar *bcc,
172           const gchar* subject, const gchar *body,
173           TnyAccountStore *account_store)
174 {
175         ModestUI *modest_ui;
176         ModestWindow *win;
177         gint retval = 0;
178         
179         modest_ui = MODEST_UI(modest_ui_new (account_store));
180         if (!modest_ui) {
181                 g_printerr ("modest: failed to initialize ui, exiting\n");
182                 retval = MODEST_ERR_UI;
183                 goto cleanup;
184         }
185         
186         modest_icon_factory_init ();    
187
188         if (!hildon_init ()) { /* NOP  if hildon is not defined */
189                 g_printerr ("modest: failed to initialize hildon, exiting\n");
190                 retval = MODEST_ERR_HILDON;
191                 goto cleanup;
192         }
193
194         if (mailto||cc||bcc||subject||body) {
195
196 /*              ok = modest_ui_new_edit_window (modest_ui, */
197 /*                                              mailto,  /\* to *\/ */
198 /*                                              cc,      /\* cc *\/ */
199 /*                                              bcc,     /\* bcc *\/ */
200 /*                                              subject,    /\* subject *\/ */
201 /*                                              body,    /\* body *\/ */
202 /*                                              NULL);   /\* attachments *\/ */
203         } else 
204                 win = modest_ui_main_window (modest_ui);
205         
206         if (win) {
207                 TnyDevice *device;
208
209                 gtk_widget_show (GTK_WIDGET (win));
210         
211                 /* Go online */
212                 device = tny_account_store_get_device (account_store);
213                 tny_device_force_online (device);
214                 g_object_unref (G_OBJECT (device));
215
216                 gtk_main();
217         }
218 cleanup:
219         if (modest_ui)
220                 g_object_unref (modest_ui);
221
222         modest_icon_factory_uninit ();
223         return retval;
224 }
225         
226
227 static gboolean
228 hildon_init ()
229 {
230 #if MODEST_PLATFORM_ID==2 
231         
232         osso_context_t *osso_context =
233                 osso_initialize(PACKAGE, PACKAGE_VERSION,
234                                 TRUE, NULL);    
235         if (!osso_context) {
236                 g_printerr ("modest: failed to acquire osso context\n");
237                 return FALSE;
238         }
239         
240 #endif /* MODEST_PLATFORM_ID==2 */
241
242         return TRUE;
243 }
244
245
246
247 static int
248 send_mail (const gchar* mailto, const gchar *cc, const gchar *bcc,
249            const gchar* subject, const gchar *body)
250 {
251         ModestAccountMgr *acc_mgr = NULL;
252         TnyPlatformFactory *fact = NULL;
253         TnyAccountStore *acc_store = NULL;
254         ModestMailOperation *mail_operation = NULL;
255
256         TnyList *accounts = NULL;
257         TnyIterator *iter = NULL;
258         TnyTransportAccount *account = NULL;    
259         int retval;
260
261         fact = modest_tny_platform_factory_get_instance ();
262         acc_mgr = modest_tny_platform_factory_get_account_mgr_instance
263                 (MODEST_TNY_PLATFORM_FACTORY(fact));
264         acc_store = tny_platform_factory_new_account_store (fact);      
265
266         accounts = TNY_LIST(tny_simple_list_new ());
267         tny_account_store_get_accounts (TNY_ACCOUNT_STORE(acc_store), accounts,
268                                               TNY_ACCOUNT_STORE_TRANSPORT_ACCOUNTS);
269
270         iter = tny_list_create_iterator(accounts);
271         tny_iterator_first (iter);
272         if (tny_iterator_is_done (iter)) {
273                 g_printerr("modest: no transport accounts defined\n");
274                 retval = MODEST_ERR_SEND;
275                 goto cleanup;
276         }
277
278         account = TNY_TRANSPORT_ACCOUNT (tny_iterator_get_current(iter));
279
280         mail_operation = modest_mail_operation_new ();
281
282         modest_mail_operation_send_new_mail (mail_operation,
283                                              account, "test@example.com",
284                                              mailto, cc, bcc, 
285                                              subject, body, NULL);
286         
287         
288         if (modest_mail_operation_get_status (mail_operation) == 
289             MODEST_MAIL_OPERATION_STATUS_FAILED) {
290                 retval = MODEST_ERR_SEND;
291                 goto cleanup;
292         } else
293                 retval = MODEST_ERR_NONE; /* hurray! */
294
295 cleanup:
296         if (iter)
297                 g_object_unref (G_OBJECT (iter));
298         if (accounts)
299                 g_object_unref (G_OBJECT (accounts));
300         if (mail_operation)
301                 g_object_unref (G_OBJECT (mail_operation));
302
303         return retval;
304 }
305