This patch includes a lot of work to refactor and reorganize the
[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         /* TODO implement confirmation dialog */
197         return response;
198 }
199
200 void
201 modest_platform_run_information_dialog (GtkWindow *parent_window,
202                                         const gchar *message)
203 {
204         GtkWidget *dialog;
205
206         dialog = gtk_message_dialog_new (parent_window,
207                                          GTK_DIALOG_MODAL,
208                                          GTK_MESSAGE_INFO,
209                                          GTK_BUTTONS_OK,
210                                          message);
211
212         gtk_dialog_run (GTK_DIALOG (dialog));
213         gtk_widget_destroy (dialog);
214         
215 }
216
217 gboolean modest_platform_connect_and_wait (GtkWindow *parent_window, TnyAccount *account)
218 {
219         /* TODO: Do something with network-manager? 
220            Otherwise, maybe it is safe to assume that we would already be online if we could be. */
221         return TRUE;
222 }
223
224 gboolean modest_platform_connect_and_wait_if_network_account (GtkWindow *parent_window, TnyAccount *account)
225 {
226         /* TODO: Do something with network-manager? 
227            Otherwise, maybe it is safe to assume that we would already be online if we could be. */
228         return TRUE;
229 }
230
231
232 void
233 modest_platform_connect_if_remote_and_perform (GtkWindow *parent_window, 
234                                                TnyFolderStore *folder_store, 
235                                                ModestConnectedPerformer callback, 
236                                                gpointer user_data)
237 {
238         TnyAccount *account = NULL;
239         
240         if (!folder_store) {
241                 /* We promise to instantly perform the callback, so ... */
242                 if (callback) {
243                         callback (FALSE, NULL, parent_window, NULL, user_data);
244                 }
245                 return; 
246                 
247                 /* Original comment: Maybe it is something local. */
248                 /* PVH's comment: maybe we should KNOW this in stead of assuming? */
249                 
250         } else if (TNY_IS_FOLDER (folder_store)) {
251                 /* Get the folder's parent account: */
252                 account = tny_folder_get_account(TNY_FOLDER (folder_store));
253         } else if (TNY_IS_ACCOUNT (folder_store)) {
254                 /* Use the folder store as an account: */
255                 account = TNY_ACCOUNT (folder_store);
256         }
257  
258         if (tny_account_get_account_type (account) == TNY_ACCOUNT_TYPE_STORE) {
259                 if (!TNY_IS_CAMEL_POP_STORE_ACCOUNT (account) &&
260                     !TNY_IS_CAMEL_IMAP_STORE_ACCOUNT (account)) {
261                         
262                         /* This IS a local account like a maildir account, which does not require 
263                          * a connection. (original comment had a vague assumption in its language
264                          * usage. There's no assuming needed, this IS what it IS: a local account), */
265  
266                         /* We promise to instantly perform the callback, so ... */
267                         if (callback) {
268                                 callback (FALSE, NULL, parent_window, account, user_data);
269                         }
270                         
271                         return;
272                 }
273         }
274  
275         modest_platform_connect_and_perform (parent_window, account, callback, user_data);
276  
277         return;
278 }
279
280
281 gboolean modest_platform_set_update_interval (guint minutes)
282 {
283         /* TODO. */
284         return FALSE;
285 }
286
287 void
288 modest_platform_run_sort_dialog (GtkWindow *parent_window,
289                                  ModestSortDialogType type)
290 {
291         /* TODO */
292 }
293
294 GtkWidget *
295 modest_platform_get_global_settings_dialog ()
296 {
297         return modest_gnome_global_settings_dialog_new ();
298 }
299
300
301 void 
302 modest_platform_on_new_headers_received (TnyList *header_list)
303 {
304         /* TODO: implement this */
305         g_print ("--------------- NEW MESSAGE ARRIVED ---------------\n");
306 }
307
308
309
310 void
311 modest_platform_show_help (GtkWindow *parent_window, const gchar *help_id)
312 {
313         return; /* TODO */
314 }
315
316 void 
317 modest_platform_information_banner (GtkWidget *widget,
318                                     const gchar *icon_name,
319                                     const gchar *text)
320 {
321         g_message ("NOT IMPLEMENTED");;
322 }
323
324 GtkWidget *
325 modest_platform_animation_banner (GtkWidget *widget,
326                                   const gchar *icon_name,
327                                   const gchar *text)
328 {
329         g_message ("NOT IMPLEMENTED");
330         return NULL;
331 }
332
333
334 void
335 modest_platform_show_search_messages (GtkWindow *parent_window)
336 {
337         g_message ("NOT IMPLEMENTED");;
338 }
339
340 GtkWidget *
341 modest_platform_create_folder_view (TnyFolderStoreQuery *query)
342 {
343         GtkWidget *widget = modest_folder_view_new (query);
344
345         /* Show all accounts by default */
346         modest_folder_view_set_style (MODEST_FOLDER_VIEW (widget),
347                                       MODEST_FOLDER_VIEW_STYLE_SHOW_ALL);
348
349         return widget;
350 }
351
352 gboolean
353 modest_platform_run_alert_dialog (const gchar* prompt, 
354                                   gboolean is_question)
355 {
356         /* TODO */
357         return TRUE;
358 }
359
360 void 
361 modest_platform_connect_and_perform (GtkWindow *parent_window, 
362                                      TnyAccount *account, 
363                                      ModestConnectedPerformer callback, 
364                                      gpointer user_data)
365 {
366         if (callback)
367                 callback (FALSE, NULL, parent_window, account, user_data);
368 }
369
370 void 
371 modest_platform_connect_and_perform_if_network_account (GtkWindow *parent_window, 
372                                                         TnyAccount *account,
373                                                         ModestConnectedPerformer callback, 
374                                                         gpointer user_data)
375 {
376         if (callback)
377                 callback (FALSE, NULL, parent_window, account, user_data);
378 }
379
380 void
381 modest_platform_connect_and_perform_if_network_folderstore (GtkWindow *parent_window, 
382                                                             TnyFolderStore *folder_store, 
383                                                             ModestConnectedPerformer callback, 
384                                                             gpointer user_data)
385 {
386         if (callback)
387                 callback (FALSE, NULL, parent_window, NULL, user_data);
388 }
389
390
391 void 
392 modest_platform_remove_new_mail_notifications (void)
393 {
394         g_message ("NOT IMPLEMENTED %s", __FUNCTION__);
395 }
396
397 gboolean 
398 modest_platform_check_and_wait_for_account_is_online(TnyAccount *account)
399 {
400         g_message ("NOT IMPLEMENTED %s", __FUNCTION__);
401         return TRUE;
402 }
403
404 gboolean 
405 modest_platform_run_certificate_confirmation_dialog (const gchar* server_name,
406                                                      const gchar *certificate)
407 {
408         g_message ("NOT IMPLEMENTED %s", __FUNCTION__);
409         return TRUE;
410 }
411
412 gint
413 modest_platform_run_rename_folder_dialog (GtkWindow *parent_window,
414                                           TnyFolderStore *parent_folder,
415                                           const gchar *suggested_name,
416                                           gchar **folder_name)
417 {
418         g_message ("NOT IMPLEMENTED %s", __FUNCTION__);
419         return GTK_RESPONSE_CANCEL;
420 }
421
422 void 
423 modest_platform_show_addressbook (GtkWindow *parent_window)
424 {
425         g_message ("NOT IMPLEMENTED %s", __FUNCTION__);
426 }
427
428 GtkWidget *
429 modest_platform_get_account_settings_dialog (ModestAccountSettings *settings)
430 {
431         GtkWidget *dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
432                                                     GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
433                                                     "NOT IMPLEMENTED");
434         return dialog;
435 }
436
437 GtkWidget *
438 modest_platform_get_account_settings_wizard ()
439 {
440         GtkWidget *dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
441                                                     GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
442                                                     "NOT IMPLEMENTED");
443         return dialog;
444 }