a38b5c533f7aca97ee5030a4a4309727f0bba497
[modest] / src / gnome / modest-platform.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 #include <libgnomevfs/gnome-vfs-mime.h>
31 #include <libgnomeui/gnome-icon-lookup.h>
32 #include <tny-gnome-device.h>
33 #include <tny-camel-imap-store-account.h>
34 #include <tny-camel-pop-store-account.h>
35
36 #include "modest-platform.h"
37 #include "modest-mail-operation-queue.h"
38 #include "modest-runtime.h"
39
40 #include "gnome/modest-gnome-global-settings-dialog.h"
41
42 gboolean
43 modest_platform_init (int argc, char *argv[])
44 {       
45         return TRUE; /* nothing to do */
46 }
47
48
49 gboolean modest_platform_uninit (void)
50 {
51         return TRUE; /*nothing to do */
52 }
53
54
55 TnyDevice*
56 modest_platform_get_new_device (void)
57 {
58         return TNY_DEVICE (tny_gnome_device_new ());
59 }
60
61
62 gchar*
63 modest_platform_get_file_icon_name (const gchar* name, const gchar* mime_type,
64                                           gchar **effective_mime_type)
65 {
66         GString *mime_str = NULL;
67         gchar *icon_name  = NULL;
68         gchar *uri;
69         const static gchar* octet_stream = "application/octet-stream";
70         
71         g_return_val_if_fail (name || mime_type, NULL);
72
73         if (!mime_type || g_ascii_strcasecmp (mime_type, octet_stream)) 
74                 mime_str = g_string_new(gnome_vfs_mime_type_from_name_or_default
75                                         (name, "application/octet-stream"));
76         else {
77                 mime_str = g_string_new (mime_type);
78                 g_string_ascii_down (mime_str);
79         }
80
81         uri = g_strconcat ("file:///", name ? name : "dummy", NULL);
82         icon_name  = gnome_icon_lookup (gtk_icon_theme_get_default(), NULL,
83                                         uri, NULL, NULL, mime_str->str, 0, 0);
84         g_free (uri);
85
86         if (effective_mime_type)
87                 *effective_mime_type = g_string_free (mime_str, FALSE);
88         else
89                 g_string_free (mime_str, TRUE);
90
91         return icon_name;
92 }
93
94 gboolean 
95 modest_platform_activate_uri (const gchar *uri)
96 {
97         g_message ("NOT IMPLEMENTED");;
98         return FALSE;
99 }
100
101 gboolean 
102 modest_platform_activate_file (const gchar *path, const gchar *mime_type)
103 {
104         g_message ("NOT IMPLEMENTED");;
105         return FALSE;
106 }
107
108 gboolean 
109 modest_platform_show_uri_popup (const gchar *uri)
110 {
111         g_message ("NOT IMPLEMENTED");;
112         return FALSE;
113 }
114
115 GdkPixbuf*
116 modest_platform_get_icon (const gchar *name)
117 {
118         GError *err = NULL;
119         GdkPixbuf* pixbuf;
120
121         g_return_val_if_fail (name, NULL);
122
123         pixbuf = gdk_pixbuf_new_from_file (name, &err);
124
125         if (!pixbuf) {
126                 g_printerr ("modest: error while loading icon '%s': %s\n",
127                             name, err->message);
128                 g_error_free (err);
129         }
130         
131         return pixbuf;
132 }
133
134
135 const gchar*
136 modest_platform_get_app_name (void)
137 {
138         return ("Modest");
139 }
140
141 gint 
142 modest_platform_run_new_folder_dialog (GtkWindow *parent_window,
143                                        TnyFolderStore *parent_folder,
144                                        gchar *suggested_name,
145                                        gchar **folder_name)
146 {
147         GtkWidget *dialog, *entry;
148         gint result;
149
150         /* Ask the user for the folder name */
151         dialog = gtk_dialog_new_with_buttons (_("New Folder Name"),
152                                               parent_window,
153                                               GTK_DIALOG_MODAL,
154                                               GTK_STOCK_CANCEL,
155                                               GTK_RESPONSE_REJECT,
156                                               GTK_STOCK_OK,
157                                               GTK_RESPONSE_ACCEPT,
158                                               NULL);
159         gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), 
160                             gtk_label_new (_("Please enter a name for the new folder")),
161                             FALSE, FALSE, 0);
162                 
163         entry = gtk_entry_new_with_max_length (40);
164         gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), 
165                             entry,
166                             TRUE, FALSE, 0);
167         
168         gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
169
170         result = gtk_dialog_run (GTK_DIALOG(dialog));
171         if (result == GTK_RESPONSE_ACCEPT)
172                 *folder_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
173
174         gtk_widget_destroy (dialog);
175
176         return result;
177 }
178
179
180 gint
181 modest_platform_run_confirmation_dialog (GtkWindow *parent_window,
182                                          const gchar *msg)
183 {
184         gint response;
185         GtkWidget *dialog;
186
187         dialog = gtk_message_dialog_new (parent_window,
188                                          GTK_DIALOG_MODAL,
189                                          GTK_MESSAGE_QUESTION,
190                                          GTK_BUTTONS_OK_CANCEL,
191                                          msg);
192
193         response = gtk_dialog_run (GTK_DIALOG(dialog));
194         gtk_widget_destroy (dialog);
195         
196         return response;
197 }
198
199 gint
200 modest_platform_run_confirmation_dialog_with_buttons (GtkWindow *parent_window,
201                                                       const gchar *message,
202                                                       const gchar *button_accept,
203                                                       const gchar *button_cancel)
204 {
205         gint response;
206         GtkWidget *dialog;
207
208         dialog = gtk_dialog_new_with_buttons (message,
209                                               parent_window,
210                                               GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
211                                               button_accept,
212                                               GTK_RESPONSE_ACCEPT,
213                                               button_cancel,
214                                               GTK_RESPONSE_CANCEL,
215                                               NULL);
216
217         response = gtk_dialog_run (GTK_DIALOG(dialog));
218         gtk_widget_destroy (dialog);
219         
220         return response;
221 }
222
223 void
224 modest_platform_run_information_dialog (GtkWindow *parent_window,
225                                         const gchar *message)
226 {
227         GtkWidget *dialog;
228
229         dialog = gtk_message_dialog_new (parent_window,
230                                          GTK_DIALOG_MODAL,
231                                          GTK_MESSAGE_INFO,
232                                          GTK_BUTTONS_OK,
233                                          message);
234
235         gtk_dialog_run (GTK_DIALOG (dialog));
236         gtk_widget_destroy (dialog);
237         
238 }
239
240 gboolean modest_platform_connect_and_wait (GtkWindow *parent_window, TnyAccount *account)
241 {
242         /* TODO: Do something with network-manager? 
243            Otherwise, maybe it is safe to assume that we would already be online if we could be. */
244         return TRUE;
245 }
246
247 gboolean modest_platform_connect_and_wait_if_network_account (GtkWindow *parent_window, TnyAccount *account)
248 {
249         /* TODO: Do something with network-manager? 
250            Otherwise, maybe it is safe to assume that we would already be online if we could be. */
251         return TRUE;
252 }
253
254
255 void
256 modest_platform_connect_if_remote_and_perform (GtkWindow *parent_window, 
257                                                TnyFolderStore *folder_store, 
258                                                ModestConnectedPerformer callback, 
259                                                gpointer user_data)
260 {
261         TnyAccount *account = NULL;
262         
263         if (!folder_store) {
264                 /* We promise to instantly perform the callback, so ... */
265                 if (callback) {
266                         callback (FALSE, NULL, parent_window, NULL, user_data);
267                 }
268                 return; 
269                 
270                 /* Original comment: Maybe it is something local. */
271                 /* PVH's comment: maybe we should KNOW this in stead of assuming? */
272                 
273         } else if (TNY_IS_FOLDER (folder_store)) {
274                 /* Get the folder's parent account: */
275                 account = tny_folder_get_account(TNY_FOLDER (folder_store));
276         } else if (TNY_IS_ACCOUNT (folder_store)) {
277                 /* Use the folder store as an account: */
278                 account = TNY_ACCOUNT (folder_store);
279         }
280  
281         if (tny_account_get_account_type (account) == TNY_ACCOUNT_TYPE_STORE) {
282                 if (!TNY_IS_CAMEL_POP_STORE_ACCOUNT (account) &&
283                     !TNY_IS_CAMEL_IMAP_STORE_ACCOUNT (account)) {
284                         
285                         /* This IS a local account like a maildir account, which does not require 
286                          * a connection. (original comment had a vague assumption in its language
287                          * usage. There's no assuming needed, this IS what it IS: a local account), */
288  
289                         /* We promise to instantly perform the callback, so ... */
290                         if (callback) {
291                                 callback (FALSE, NULL, parent_window, account, user_data);
292                         }
293                         
294                         return;
295                 }
296         }
297  
298         modest_platform_connect_and_perform (parent_window, account, callback, user_data);
299  
300         return;
301 }
302
303
304 gboolean modest_platform_set_update_interval (guint minutes)
305 {
306         /* TODO. */
307         return FALSE;
308 }
309
310 void
311 modest_platform_run_sort_dialog (GtkWindow *parent_window,
312                                  ModestSortDialogType type)
313 {
314         /* TODO */
315 }
316
317 GtkWidget *
318 modest_platform_get_global_settings_dialog ()
319 {
320         return modest_gnome_global_settings_dialog_new ();
321 }
322
323
324 void 
325 modest_platform_on_new_headers_received (TnyList *header_list)
326 {
327         /* TODO: implement this */
328         g_print ("--------------- NEW MESSAGE ARRIVED ---------------\n");
329 }
330
331
332
333 void
334 modest_platform_show_help (GtkWindow *parent_window, const gchar *help_id)
335 {
336         return; /* TODO */
337 }
338
339 void 
340 modest_platform_information_banner (GtkWidget *widget,
341                                     const gchar *icon_name,
342                                     const gchar *text)
343 {
344         g_message ("NOT IMPLEMENTED");;
345 }
346
347 void
348 modest_platform_information_banner_with_timeout (GtkWidget *widget,
349                                                  const gchar *icon_name,
350                                                  const gchar *text,
351                                                  gint timeout)
352 {
353         g_message ("NOT IMPLEMENTED");;
354 }
355
356 GtkWidget *
357 modest_platform_animation_banner (GtkWidget *widget,
358                                   const gchar *icon_name,
359                                   const gchar *text)
360 {
361         g_message ("NOT IMPLEMENTED");
362         return NULL;
363 }
364
365
366 void
367 modest_platform_show_search_messages (GtkWindow *parent_window)
368 {
369         g_message ("NOT IMPLEMENTED");;
370 }
371
372 GtkWidget *
373 modest_platform_create_folder_view (TnyFolderStoreQuery *query)
374 {
375         GtkWidget *widget = modest_folder_view_new (query);
376
377         /* Show all accounts by default */
378         modest_folder_view_set_style (MODEST_FOLDER_VIEW (widget),
379                                       MODEST_FOLDER_VIEW_STYLE_SHOW_ALL);
380
381         return widget;
382 }
383
384 gboolean
385 modest_platform_run_alert_dialog (const gchar* prompt, 
386                                   gboolean is_question)
387 {
388         /* TODO */
389         return TRUE;
390 }
391
392 void 
393 modest_platform_connect_and_perform (GtkWindow *parent_window, 
394                                      TnyAccount *account, 
395                                      ModestConnectedPerformer callback, 
396                                      gpointer user_data)
397 {
398         if (callback)
399                 callback (FALSE, NULL, parent_window, account, user_data);
400 }
401
402 void 
403 modest_platform_connect_and_perform_if_network_account (GtkWindow *parent_window, 
404                                                         TnyAccount *account,
405                                                         ModestConnectedPerformer callback, 
406                                                         gpointer user_data)
407 {
408         if (callback)
409                 callback (FALSE, NULL, parent_window, account, user_data);
410 }
411
412 void
413 modest_platform_connect_and_perform_if_network_folderstore (GtkWindow *parent_window, 
414                                                             TnyFolderStore *folder_store, 
415                                                             ModestConnectedPerformer callback, 
416                                                             gpointer user_data)
417 {
418         if (callback)
419                 callback (FALSE, NULL, parent_window, NULL, user_data);
420 }
421
422
423 void 
424 modest_platform_remove_new_mail_notifications (void)
425 {
426         g_message ("NOT IMPLEMENTED %s", __FUNCTION__);
427 }
428
429 gboolean 
430 modest_platform_check_and_wait_for_account_is_online(TnyAccount *account)
431 {
432         g_message ("NOT IMPLEMENTED %s", __FUNCTION__);
433         return TRUE;
434 }
435
436 gboolean 
437 modest_platform_run_certificate_confirmation_dialog (const gchar* server_name,
438                                                      const gchar *certificate)
439 {
440         g_message ("NOT IMPLEMENTED %s", __FUNCTION__);
441         return TRUE;
442 }
443
444 gint
445 modest_platform_run_rename_folder_dialog (GtkWindow *parent_window,
446                                           TnyFolderStore *parent_folder,
447                                           const gchar *suggested_name,
448                                           gchar **folder_name)
449 {
450         g_message ("NOT IMPLEMENTED %s", __FUNCTION__);
451         return GTK_RESPONSE_CANCEL;
452 }
453
454 void 
455 modest_platform_show_addressbook (GtkWindow *parent_window)
456 {
457         g_message ("NOT IMPLEMENTED %s", __FUNCTION__);
458 }
459
460 GtkWidget *
461 modest_platform_get_account_settings_dialog (ModestAccountSettings *settings)
462 {
463         GtkWidget *dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
464                                                     GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
465                                                     "NOT IMPLEMENTED");
466         return dialog;
467 }
468
469 GtkWidget *
470 modest_platform_get_account_settings_wizard ()
471 {
472         GtkWidget *dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
473                                                     GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
474                                                     "NOT IMPLEMENTED");
475         return dialog;
476 }