39297de08cf7f0a37f2620c3c9c6fe7be1852159
[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 #include "widgets/modest-account-settings-dialog.h"
42 #include "gnome/modest-account-assistant.h"
43 #include "gnome/modest-gnome-sort-dialog.h"
44 #include "widgets/modest-details-dialog.h"
45
46 gboolean
47 modest_platform_init (int argc, char *argv[])
48 {       
49         return TRUE; /* nothing to do */
50 }
51
52
53 gboolean modest_platform_uninit (void)
54 {
55         return TRUE; /*nothing to do */
56 }
57
58
59 TnyDevice*
60 modest_platform_get_new_device (void)
61 {
62         return TNY_DEVICE (tny_gnome_device_new ());
63 }
64
65
66 gchar*
67 modest_platform_get_file_icon_name (const gchar* name, const gchar* mime_type,
68                                           gchar **effective_mime_type)
69 {
70         GString *mime_str = NULL;
71         gchar *icon_name  = NULL;
72         gchar *uri;
73         const static gchar* octet_stream = "application/octet-stream";
74         
75         g_return_val_if_fail (name || mime_type, NULL);
76
77         if (!mime_type || g_ascii_strcasecmp (mime_type, octet_stream)) 
78                 mime_str = g_string_new(gnome_vfs_mime_type_from_name_or_default
79                                         (name, "application/octet-stream"));
80         else {
81                 mime_str = g_string_new (mime_type);
82                 g_string_ascii_down (mime_str);
83         }
84
85         uri = g_strconcat ("file:///", name ? name : "dummy", NULL);
86         icon_name  = gnome_icon_lookup (gtk_icon_theme_get_default(), NULL,
87                                         uri, NULL, NULL, mime_str->str, 0, 0);
88         g_free (uri);
89
90         if (effective_mime_type)
91                 *effective_mime_type = g_string_free (mime_str, FALSE);
92         else
93                 g_string_free (mime_str, TRUE);
94
95         return icon_name;
96 }
97
98 gboolean 
99 modest_platform_activate_uri (const gchar *uri)
100 {
101         g_message ("NOT IMPLEMENTED");;
102         return FALSE;
103 }
104
105 gboolean 
106 modest_platform_activate_file (const gchar *path, const gchar *mime_type)
107 {
108         g_message ("NOT IMPLEMENTED");;
109         return FALSE;
110 }
111
112 gboolean 
113 modest_platform_show_uri_popup (const gchar *uri)
114 {
115         g_message ("NOT IMPLEMENTED");;
116         return FALSE;
117 }
118
119 GdkPixbuf*
120 modest_platform_get_icon (const gchar *name, guint icon_size)
121 {
122         GError *err = NULL;
123         GdkPixbuf* pixbuf;
124
125         g_return_val_if_fail (name, NULL);
126
127         pixbuf = gdk_pixbuf_new_from_file (name, &err);
128
129         if (!pixbuf) {
130 /*              g_printerr ("modest: error while loading icon '%s': %s\n", */
131 /*                          name, err->message); */
132                 g_error_free (err);
133                 err = NULL;
134
135                 pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (), name, icon_size, 0, &err);
136                 if (!pixbuf) {
137                         g_error_free (err);
138                 }
139         }
140         
141         return pixbuf;
142 }
143
144
145 const gchar*
146 modest_platform_get_app_name (void)
147 {
148         return ("Modest");
149 }
150
151 gint 
152 modest_platform_run_new_folder_dialog (GtkWindow *parent_window,
153                                        TnyFolderStore *suggested_parent,
154                                        gchar *suggested_name,
155                                        gchar **folder_name,
156                                        TnyFolderStore **parent_folder)
157 {
158         GtkWidget *dialog, *entry;
159         gint result;
160
161         /* Ask the user for the folder name */
162         dialog = gtk_dialog_new_with_buttons (_("New Folder Name"),
163                                               parent_window,
164                                               GTK_DIALOG_MODAL,
165                                               GTK_STOCK_CANCEL,
166                                               GTK_RESPONSE_REJECT,
167                                               GTK_STOCK_OK,
168                                               GTK_RESPONSE_ACCEPT,
169                                               NULL);
170         gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), 
171                             gtk_label_new (_("Please enter a name for the new folder")),
172                             FALSE, FALSE, 0);
173                 
174         entry = gtk_entry_new_with_max_length (40);
175         gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), 
176                             entry,
177                             TRUE, FALSE, 0);
178         
179         gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
180
181         result = gtk_dialog_run (GTK_DIALOG(dialog));
182         if (result == GTK_RESPONSE_ACCEPT)
183                 *folder_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
184
185         gtk_widget_destroy (dialog);
186
187         if (parent_folder != NULL) {
188                 parent_folder = suggested_parent?g_object_ref (suggested_parent): NULL;
189         }
190
191         return result;
192 }
193
194
195 gint
196 modest_platform_run_confirmation_dialog (GtkWindow *parent_window,
197                                          const gchar *msg)
198 {
199         gint response;
200         GtkWidget *dialog;
201
202         dialog = gtk_message_dialog_new (parent_window,
203                                          GTK_DIALOG_MODAL,
204                                          GTK_MESSAGE_QUESTION,
205                                          GTK_BUTTONS_OK_CANCEL,
206                                          msg);
207
208         response = gtk_dialog_run (GTK_DIALOG(dialog));
209         gtk_widget_destroy (dialog);
210         
211         return response;
212 }
213
214 gint
215 modest_platform_run_confirmation_dialog_with_buttons (GtkWindow *parent_window,
216                                                       const gchar *message,
217                                                       const gchar *button_accept,
218                                                       const gchar *button_cancel)
219 {
220         gint response;
221         GtkWidget *dialog;
222
223         dialog = gtk_dialog_new_with_buttons (message,
224                                               parent_window,
225                                               GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
226                                               button_accept,
227                                               GTK_RESPONSE_ACCEPT,
228                                               button_cancel,
229                                               GTK_RESPONSE_CANCEL,
230                                               NULL);
231
232         response = gtk_dialog_run (GTK_DIALOG(dialog));
233         gtk_widget_destroy (dialog);
234         
235         return response;
236 }
237
238 void
239 modest_platform_run_information_dialog (GtkWindow *parent_window,
240                                         const gchar *message,
241                                         gboolean block)
242 {
243         GtkWidget *dialog;
244
245         dialog = gtk_message_dialog_new (parent_window,
246                                          GTK_DIALOG_MODAL,
247                                          GTK_MESSAGE_INFO,
248                                          GTK_BUTTONS_OK,
249                                          message);
250
251         gtk_dialog_run (GTK_DIALOG (dialog));
252         gtk_widget_destroy (dialog);
253         
254 }
255
256 gboolean modest_platform_connect_and_wait (GtkWindow *parent_window, TnyAccount *account)
257 {
258         /* TODO: Do something with network-manager? 
259            Otherwise, maybe it is safe to assume that we would already be online if we could be. */
260         return TRUE;
261 }
262
263 gboolean modest_platform_connect_and_wait_if_network_account (GtkWindow *parent_window, TnyAccount *account)
264 {
265         /* TODO: Do something with network-manager? 
266            Otherwise, maybe it is safe to assume that we would already be online if we could be. */
267         return TRUE;
268 }
269
270
271 void
272 modest_platform_connect_if_remote_and_perform (GtkWindow *parent_window, 
273                                                gboolean force,
274                                                TnyFolderStore *folder_store, 
275                                                ModestConnectedPerformer callback, 
276                                                gpointer user_data)
277 {
278         TnyAccount *account = NULL;
279         
280         if (!folder_store) {
281                 /* We promise to instantly perform the callback, so ... */
282                 if (callback) {
283                         callback (FALSE, NULL, parent_window, NULL, user_data);
284                 }
285                 return; 
286                 
287                 /* Original comment: Maybe it is something local. */
288                 /* PVH's comment: maybe we should KNOW this in stead of assuming? */
289                 
290         } else if (TNY_IS_FOLDER (folder_store)) {
291                 /* Get the folder's parent account: */
292                 account = tny_folder_get_account(TNY_FOLDER (folder_store));
293         } else if (TNY_IS_ACCOUNT (folder_store)) {
294                 /* Use the folder store as an account: */
295                 account = TNY_ACCOUNT (folder_store);
296         }
297  
298         if (tny_account_get_account_type (account) == TNY_ACCOUNT_TYPE_STORE) {
299                 if (!TNY_IS_CAMEL_POP_STORE_ACCOUNT (account) &&
300                     !TNY_IS_CAMEL_IMAP_STORE_ACCOUNT (account)) {
301                         
302                         /* This IS a local account like a maildir account, which does not require 
303                          * a connection. (original comment had a vague assumption in its language
304                          * usage. There's no assuming needed, this IS what it IS: a local account), */
305  
306                         /* We promise to instantly perform the callback, so ... */
307                         if (callback) {
308                                 callback (FALSE, NULL, parent_window, account, user_data);
309                         }
310                         
311                         return;
312                 }
313         }
314  
315         modest_platform_connect_and_perform (parent_window, force, account, callback, user_data);
316  
317         return;
318 }
319
320
321 gboolean modest_platform_set_update_interval (guint minutes)
322 {
323         /* TODO. */
324         return FALSE;
325 }
326
327 GtkWidget *
328 modest_platform_create_sort_dialog (GtkWindow *parent_window)
329 {
330         return modest_gnome_sort_dialog_new (parent_window);
331 }
332
333 GtkWidget *
334 modest_platform_get_global_settings_dialog ()
335 {
336         return modest_gnome_global_settings_dialog_new ();
337 }
338
339 void
340 modest_platform_push_email_notification(void)
341 {
342         /* TODO: implement this */
343         g_print ("--------------- NEW MESSAGE ARRIVED ---------------\n");
344 }
345
346 void 
347 modest_platform_on_new_headers_received (TnyList *header_list,
348                                          gboolean show_visual)
349 {
350         /* TODO: implement this */
351         g_print ("--------------- NEW MESSAGE ARRIVED ---------------\n");
352 }
353
354
355
356 void
357 modest_platform_show_help (GtkWindow *parent_window, const gchar *help_id)
358 {
359         return; /* TODO */
360 }
361
362 void 
363 modest_platform_information_banner (GtkWidget *widget,
364                                     const gchar *icon_name,
365                                     const gchar *text)
366 {
367         g_message ("NOT IMPLEMENTED");;
368 }
369
370 void
371 modest_platform_information_banner_with_timeout (GtkWidget *widget,
372                                                  const gchar *icon_name,
373                                                  const gchar *text,
374                                                  gint timeout)
375 {
376         g_message ("NOT IMPLEMENTED");;
377 }
378
379 GtkWidget *
380 modest_platform_animation_banner (GtkWidget *widget,
381                                   const gchar *icon_name,
382                                   const gchar *text)
383 {
384         g_message ("NOT IMPLEMENTED");
385         return NULL;
386 }
387
388
389 void
390 modest_platform_show_search_messages (GtkWindow *parent_window)
391 {
392         g_message ("NOT IMPLEMENTED");;
393 }
394
395 GtkWidget *
396 modest_platform_create_folder_view (TnyFolderStoreQuery *query)
397 {
398         GtkWidget *widget = modest_folder_view_new (query);
399
400         gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (widget), FALSE);
401         /* Show all accounts by default */
402         modest_folder_view_set_style (MODEST_FOLDER_VIEW (widget),
403                                       MODEST_FOLDER_VIEW_STYLE_SHOW_ALL);
404
405         return widget;
406 }
407
408 gboolean
409 modest_platform_run_alert_dialog (const gchar* prompt, 
410                                   gboolean is_question)
411 {
412         /* TODO */
413         return TRUE;
414 }
415
416 void 
417 modest_platform_connect_and_perform (GtkWindow *parent_window, 
418                                      gboolean force,
419                                      TnyAccount *account, 
420                                      ModestConnectedPerformer callback, 
421                                      gpointer user_data)
422 {
423         if (callback)
424                 callback (FALSE, NULL, parent_window, account, user_data);
425 }
426
427 void 
428 modest_platform_double_connect_and_perform (GtkWindow *parent_window, 
429                                             gboolean force,
430                                             TnyFolderStore *folder_store,
431                                             DoubleConnectionInfo *connect_info)
432 {
433         if (connect_info->callback)
434                 connect_info->callback (FALSE, NULL, parent_window, TNY_ACCOUNT (folder_store), connect_info->data);
435 }
436
437 void 
438 modest_platform_connect_and_perform_if_network_account (GtkWindow *parent_window, 
439                                                         gboolean force,
440                                                         TnyAccount *account,
441                                                         ModestConnectedPerformer callback, 
442                                                         gpointer user_data)
443 {
444         if (callback)
445                 callback (FALSE, NULL, parent_window, account, user_data);
446 }
447
448 void
449 modest_platform_connect_and_perform_if_network_folderstore (GtkWindow *parent_window, 
450                                                             TnyFolderStore *folder_store, 
451                                                             ModestConnectedPerformer callback, 
452                                                             gpointer user_data)
453 {
454         if (callback)
455                 callback (FALSE, NULL, parent_window, NULL, user_data);
456 }
457
458
459 void 
460 modest_platform_remove_new_mail_notifications (gboolean only_visuals)
461 {
462         g_message ("NOT IMPLEMENTED %s", __FUNCTION__);
463 }
464
465 gboolean 
466 modest_platform_check_and_wait_for_account_is_online(TnyAccount *account)
467 {
468         g_message ("NOT IMPLEMENTED %s", __FUNCTION__);
469         return TRUE;
470 }
471
472 gboolean 
473 modest_platform_run_certificate_confirmation_dialog (const gchar* server_name,
474                                                      const gchar *certificate)
475 {
476         g_message ("NOT IMPLEMENTED %s", __FUNCTION__);
477         return TRUE;
478 }
479
480 gint
481 modest_platform_run_rename_folder_dialog (GtkWindow *parent_window,
482                                           TnyFolderStore *parent_folder,
483                                           const gchar *suggested_name,
484                                           gchar **folder_name)
485 {
486         g_message ("NOT IMPLEMENTED %s", __FUNCTION__);
487         return GTK_RESPONSE_CANCEL;
488 }
489
490 void 
491 modest_platform_show_addressbook (GtkWindow *parent_window)
492 {
493         g_message ("NOT IMPLEMENTED %s", __FUNCTION__);
494 }
495
496 GtkWidget *
497 modest_platform_get_account_settings_dialog (ModestAccountSettings *settings)
498 {
499         ModestAccountSettingsDialog *dialog = modest_account_settings_dialog_new ();
500
501         modest_account_settings_dialog_set_account (dialog, settings);
502         return GTK_WIDGET (dialog);
503 }
504
505 GtkWidget *
506 modest_platform_get_account_settings_wizard (void)
507 {
508         GtkWidget *widget = modest_account_assistant_new (modest_runtime_get_account_mgr ());
509         return widget;
510 }
511
512
513
514 gboolean modest_platform_check_memory_low (ModestWindow *win,
515                                            gboolean visuals)
516 {
517         g_debug ("%s not implemented", __FUNCTION__);
518         return FALSE;
519 }
520
521 void 
522 modest_platform_run_folder_details_dialog (GtkWindow *parent_window,
523                                            TnyFolder *folder)
524 {
525         GtkWidget *dialog;
526         
527         /* Create dialog */
528         dialog = modest_details_dialog_new_with_folder (parent_window, folder);
529
530         /* Run dialog */
531         modest_window_mgr_set_modal (modest_runtime_get_window_mgr (), 
532                                      GTK_WINDOW (dialog), 
533                                      parent_window);
534         gtk_widget_show_all (dialog);
535
536         g_signal_connect_swapped (dialog, "response", 
537                                   G_CALLBACK (gtk_widget_destroy),
538                                   dialog);
539 }
540
541 void
542 modest_platform_run_header_details_dialog (GtkWindow *parent_window,
543                                            TnyHeader *header)
544 {
545         GtkWidget *dialog;
546         
547         /* Create dialog */
548         dialog = modest_details_dialog_new_with_header (parent_window, header);
549
550         /* Run dialog */
551         modest_window_mgr_set_modal (modest_runtime_get_window_mgr (), 
552                                      GTK_WINDOW (dialog),
553                                      parent_window);
554         gtk_widget_show_all (dialog);
555
556         g_signal_connect_swapped (dialog, "response", 
557                                   G_CALLBACK (gtk_widget_destroy),
558                                   dialog);
559 }
560
561 GtkWidget* 
562 modest_platform_create_move_to_dialog (GtkWindow *parent_window,
563                                        GtkWidget **folder_view)
564 {
565         GtkWidget *dialog, *folder_view_container;
566
567         dialog = gtk_dialog_new_with_buttons (_("mcen_ti_moveto_folders_title"),
568                                               GTK_WINDOW (parent_window),
569                                               GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR |
570                                               GTK_DIALOG_DESTROY_WITH_PARENT,
571                                               _("mcen_bd_dialog_ok"), GTK_RESPONSE_OK,
572                                               _("mcen_bd_new"), MODEST_GTK_RESPONSE_NEW_FOLDER,
573                                               _("mcen_bd_dialog_cancel"), GTK_RESPONSE_CANCEL,
574                                               NULL);
575
576         /* Create folder view */
577         *folder_view = modest_platform_create_folder_view (NULL);
578
579         /* Create pannable and add it to the dialog */
580         folder_view_container = gtk_scrolled_window_new (NULL, NULL);
581         gtk_scrolled_window_set_policy  (GTK_SCROLLED_WINDOW (*folder_view_container),
582                                          GTK_POLICY_AUTOMATIC,
583                                          GTK_POLICY_AUTOMATIC);
584         gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), folder_view_container);
585         gtk_container_add (GTK_CONTAINER (folder_view_container), *folder_view);
586
587         gtk_window_set_default_size (GTK_WINDOW (dialog), 300, 300);
588
589         return dialog;
590 }