* src/gnome/modest-account-view-window.c:
[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, guint icon_size)
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                                                gboolean force,
258                                                TnyFolderStore *folder_store, 
259                                                ModestConnectedPerformer callback, 
260                                                gpointer user_data)
261 {
262         TnyAccount *account = NULL;
263         
264         if (!folder_store) {
265                 /* We promise to instantly perform the callback, so ... */
266                 if (callback) {
267                         callback (FALSE, NULL, parent_window, NULL, user_data);
268                 }
269                 return; 
270                 
271                 /* Original comment: Maybe it is something local. */
272                 /* PVH's comment: maybe we should KNOW this in stead of assuming? */
273                 
274         } else if (TNY_IS_FOLDER (folder_store)) {
275                 /* Get the folder's parent account: */
276                 account = tny_folder_get_account(TNY_FOLDER (folder_store));
277         } else if (TNY_IS_ACCOUNT (folder_store)) {
278                 /* Use the folder store as an account: */
279                 account = TNY_ACCOUNT (folder_store);
280         }
281  
282         if (tny_account_get_account_type (account) == TNY_ACCOUNT_TYPE_STORE) {
283                 if (!TNY_IS_CAMEL_POP_STORE_ACCOUNT (account) &&
284                     !TNY_IS_CAMEL_IMAP_STORE_ACCOUNT (account)) {
285                         
286                         /* This IS a local account like a maildir account, which does not require 
287                          * a connection. (original comment had a vague assumption in its language
288                          * usage. There's no assuming needed, this IS what it IS: a local account), */
289  
290                         /* We promise to instantly perform the callback, so ... */
291                         if (callback) {
292                                 callback (FALSE, NULL, parent_window, account, user_data);
293                         }
294                         
295                         return;
296                 }
297         }
298  
299         modest_platform_connect_and_perform (parent_window, force, account, callback, user_data);
300  
301         return;
302 }
303
304
305 gboolean modest_platform_set_update_interval (guint minutes)
306 {
307         /* TODO. */
308         return FALSE;
309 }
310
311 void
312 modest_platform_run_sort_dialog (GtkWindow *parent_window,
313                                  ModestSortDialogType type)
314 {
315         /* TODO */
316 }
317
318 GtkWidget *
319 modest_platform_get_global_settings_dialog ()
320 {
321         return modest_gnome_global_settings_dialog_new ();
322 }
323
324 void
325 modest_platform_push_email_notification(void)
326 {
327         /* TODO: implement this */
328         g_print ("--------------- NEW MESSAGE ARRIVED ---------------\n");
329 }
330
331 void 
332 modest_platform_on_new_headers_received (TnyList *header_list,
333                                          gboolean show_visual)
334 {
335         /* TODO: implement this */
336         g_print ("--------------- NEW MESSAGE ARRIVED ---------------\n");
337 }
338
339
340
341 void
342 modest_platform_show_help (GtkWindow *parent_window, const gchar *help_id)
343 {
344         return; /* TODO */
345 }
346
347 void 
348 modest_platform_information_banner (GtkWidget *widget,
349                                     const gchar *icon_name,
350                                     const gchar *text)
351 {
352         g_message ("NOT IMPLEMENTED");;
353 }
354
355 void
356 modest_platform_information_banner_with_timeout (GtkWidget *widget,
357                                                  const gchar *icon_name,
358                                                  const gchar *text,
359                                                  gint timeout)
360 {
361         g_message ("NOT IMPLEMENTED");;
362 }
363
364 GtkWidget *
365 modest_platform_animation_banner (GtkWidget *widget,
366                                   const gchar *icon_name,
367                                   const gchar *text)
368 {
369         g_message ("NOT IMPLEMENTED");
370         return NULL;
371 }
372
373
374 void
375 modest_platform_show_search_messages (GtkWindow *parent_window)
376 {
377         g_message ("NOT IMPLEMENTED");;
378 }
379
380 GtkWidget *
381 modest_platform_create_folder_view (TnyFolderStoreQuery *query)
382 {
383         GtkWidget *widget = modest_folder_view_new (query);
384
385         gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (widget), FALSE);
386         /* Show all accounts by default */
387         modest_folder_view_set_style (MODEST_FOLDER_VIEW (widget),
388                                       MODEST_FOLDER_VIEW_STYLE_SHOW_ALL);
389
390         return widget;
391 }
392
393 gboolean
394 modest_platform_run_alert_dialog (const gchar* prompt, 
395                                   gboolean is_question)
396 {
397         /* TODO */
398         return TRUE;
399 }
400
401 void 
402 modest_platform_connect_and_perform (GtkWindow *parent_window, 
403                                      gboolean force,
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_double_connect_and_perform (GtkWindow *parent_window, 
414                                             gboolean force,
415                                             TnyFolderStore *folder_store,
416                                             DoubleConnectionInfo *connect_info)
417 {
418         if (connect_info->callback)
419                 connect_info->callback (FALSE, NULL, parent_window, folder_store, connect_info->data);
420 }
421
422 void 
423 modest_platform_connect_and_perform_if_network_account (GtkWindow *parent_window, 
424                                                         gboolean force,
425                                                         TnyAccount *account,
426                                                         ModestConnectedPerformer callback, 
427                                                         gpointer user_data)
428 {
429         if (callback)
430                 callback (FALSE, NULL, parent_window, account, user_data);
431 }
432
433 void
434 modest_platform_connect_and_perform_if_network_folderstore (GtkWindow *parent_window, 
435                                                             TnyFolderStore *folder_store, 
436                                                             ModestConnectedPerformer callback, 
437                                                             gpointer user_data)
438 {
439         if (callback)
440                 callback (FALSE, NULL, parent_window, NULL, user_data);
441 }
442
443
444 void 
445 modest_platform_remove_new_mail_notifications (gboolean only_visuals)
446 {
447         g_message ("NOT IMPLEMENTED %s", __FUNCTION__);
448 }
449
450 gboolean 
451 modest_platform_check_and_wait_for_account_is_online(TnyAccount *account)
452 {
453         g_message ("NOT IMPLEMENTED %s", __FUNCTION__);
454         return TRUE;
455 }
456
457 gboolean 
458 modest_platform_run_certificate_confirmation_dialog (const gchar* server_name,
459                                                      const gchar *certificate)
460 {
461         g_message ("NOT IMPLEMENTED %s", __FUNCTION__);
462         return TRUE;
463 }
464
465 gint
466 modest_platform_run_rename_folder_dialog (GtkWindow *parent_window,
467                                           TnyFolderStore *parent_folder,
468                                           const gchar *suggested_name,
469                                           gchar **folder_name)
470 {
471         g_message ("NOT IMPLEMENTED %s", __FUNCTION__);
472         return GTK_RESPONSE_CANCEL;
473 }
474
475 void 
476 modest_platform_show_addressbook (GtkWindow *parent_window)
477 {
478         g_message ("NOT IMPLEMENTED %s", __FUNCTION__);
479 }
480
481 GtkWidget *
482 modest_platform_get_account_settings_dialog (ModestAccountSettings *settings)
483 {
484         GtkWidget *dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
485                                                     GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
486                                                     "NOT IMPLEMENTED");
487         return dialog;
488 }
489
490 GtkWidget *
491 modest_platform_get_account_settings_wizard ()
492 {
493         GtkWidget *dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
494                                                     GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
495                                                     "NOT IMPLEMENTED");
496         return dialog;
497 }