X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmaemo%2Fmodest-platform.c;h=73d4c1f8e9812f662e4a84b2a41062932f852ee6;hp=174774ed0a1e3783ca8d39c7e9df544420472688;hb=362784ce756b3f0e31cd451d9ac5e69b909d4053;hpb=e6e3a7f147bca7c03f0cc4964b6ad141049bb1d5;ds=sidebyside diff --git a/src/maemo/modest-platform.c b/src/maemo/modest-platform.c index 174774e..73d4c1f 100644 --- a/src/maemo/modest-platform.c +++ b/src/maemo/modest-platform.c @@ -43,12 +43,14 @@ #include #include /* For alarm_event_add(), etc. */ #include +#include #include #include #include #include #include #include +#include #include @@ -57,11 +59,12 @@ static osso_context_t *osso_context = NULL; -static void folder_name_insensitive_press (GtkWidget *widget, ModestWindow *window); - static void -on_modest_conf_update_interval_changed (ModestConf* self, const gchar *key, - ModestConfEvent event, gpointer user_data) +on_modest_conf_update_interval_changed (ModestConf* self, + const gchar *key, + ModestConfEvent event, + ModestConfNotificationId id, + gpointer user_data) { if (strcmp (key, MODEST_CONF_UPDATE_INTERVAL) == 0) { const guint update_interval_minutes = @@ -140,7 +143,13 @@ modest_platform_init (int argc, char *argv[]) /* Make sure that the update interval is changed whenever its gconf key - * is changed: */ + * is changed */ + /* CAUTION: we're not using here the + modest_conf_listen_to_namespace because we know that there + are other parts of Modest listening for this namespace, so + we'll receive the notifications anyway. We basically do not + use it because there is no easy way to do the + modest_conf_forget_namespace */ ModestConf *conf = modest_runtime_get_conf (); g_signal_connect (G_OBJECT(conf), "key_changed", @@ -149,7 +158,7 @@ modest_platform_init (int argc, char *argv[]) /* Get the initial update interval from gconf: */ on_modest_conf_update_interval_changed(conf, MODEST_CONF_UPDATE_INTERVAL, - MODEST_CONF_EVENT_KEY_CHANGED, NULL); + MODEST_CONF_EVENT_KEY_CHANGED, 0, NULL); /* initialize the addressbook */ if (!osso_abook_init (&argc, &argv, osso_context)) { @@ -201,14 +210,11 @@ guess_mime_type_from_name (const gchar* name) gchar* modest_platform_get_file_icon_name (const gchar* name, const gchar* mime_type, - gchar **effective_mime_type) + gchar **effective_mime_type) { GString *mime_str = NULL; gchar *icon_name = NULL; gchar **icons, **cursor; - - - g_return_val_if_fail (name || mime_type, NULL); if (!mime_type || !g_ascii_strcasecmp (mime_type, "application/octet-stream")) mime_str = g_string_new (guess_mime_type_from_name(name)); @@ -350,20 +356,14 @@ modest_platform_activate_file (const gchar *path, const gchar *mime_type) con = osso_get_dbus_connection (osso_context); #ifdef MODEST_HAVE_OSSO_MIME result = osso_mime_open_file_with_mime_type (con, uri_path, mime_str->str); - g_string_free (mime_str, TRUE); - - if (result != 1) - hildon_banner_show_information (NULL, NULL, _("mcen_ni_noregistered_viewer")); - return result != 1; #else result = hildon_mime_open_file_with_mime_type (con, uri_path, mime_str->str); +#endif /*MODEST_HAVE_OSSO_MIME*/ g_string_free (mime_str, TRUE); if (result != 1) - hildon_banner_show_information (NULL, NULL, _("mcen_ni_noregistered_viewer")); + modest_platform_run_information_dialog (NULL, _("mcen_ni_noregistered_viewer")); return result != 1; -#endif /*MODEST_HAVE_OSSO_MIME*/ - } typedef struct { @@ -524,7 +524,8 @@ modest_platform_get_icon (const gchar *name) GtkIconTheme *current_theme = NULL; g_return_val_if_fail (name, NULL); - + +#if 0 /* do we still need this? */ if (g_str_has_suffix (name, ".png")) { /*FIXME: hack*/ pixbuf = gdk_pixbuf_new_from_file (name, &err); if (!pixbuf) { @@ -535,7 +536,7 @@ modest_platform_get_icon (const gchar *name) } return pixbuf; } - +#endif /* */ current_theme = gtk_icon_theme_get_default (); pixbuf = gtk_icon_theme_load_icon (current_theme, name, 26, GTK_ICON_LOOKUP_NO_SVG, @@ -565,25 +566,33 @@ entry_insert_text (GtkEditable *editable, gint chars_length; chars = gtk_editable_get_chars (editable, 0, -1); - chars_length = strlen (chars); + chars_length = g_utf8_strlen (chars, -1); /* Show WID-INF036 */ - if (chars_length == 20) { + if (chars_length >= 20) { hildon_banner_show_information (gtk_widget_get_parent (GTK_WIDGET (data)), NULL, - dgettext("hildon-common-strings", "ckdg_ib_maximum_characters_reached")); + _CS("ckdg_ib_maximum_characters_reached")); } else { - if (chars_length == 0) { - /* A blank space is not valid as first character */ - if (strcmp (text, " ")) { - GtkWidget *ok_button; - GList *buttons; - - /* Show OK button */ - buttons = gtk_container_get_children (GTK_CONTAINER (GTK_DIALOG (data)->action_area)); - ok_button = GTK_WIDGET (buttons->next->data); + gboolean is_valid = FALSE; + + if (!text) + is_valid = FALSE; + else if (strlen(text) == 0 && g_str_has_prefix (chars, " ")) + is_valid = FALSE; + else + is_valid = !g_str_has_prefix(text, " "); + + /* A blank space is not valid as first character */ + if (is_valid) { + GtkWidget *ok_button; + GList *buttons; + + /* Show OK button */ + buttons = gtk_container_get_children (GTK_CONTAINER (GTK_DIALOG (data)->action_area)); + ok_button = GTK_WIDGET (buttons->next->data); gtk_widget_set_sensitive (ok_button, TRUE); g_list_free (buttons); - } + } /* Write the text in the entry */ @@ -602,26 +611,28 @@ entry_changed (GtkEditable *editable, gpointer user_data) { gchar *chars; + GtkWidget *ok_button; + GList *buttons; + buttons = gtk_container_get_children (GTK_CONTAINER (GTK_DIALOG (user_data)->action_area)); + ok_button = GTK_WIDGET (buttons->next->data); + chars = gtk_editable_get_chars (editable, 0, -1); g_return_if_fail (chars != NULL); + /* Dimm OK button. Do not allow also the "/" */ - if (strlen (chars) == 0 || strchr (chars, '/')) { - GtkWidget *ok_button; - GList *buttons; - - buttons = gtk_container_get_children (GTK_CONTAINER (GTK_DIALOG (user_data)->action_area)); - ok_button = GTK_WIDGET (buttons->next->data); + if (strlen (chars) == 0 || strchr (chars, '/')) gtk_widget_set_sensitive (ok_button, FALSE); - - g_list_free (buttons); - } else if (strlen (chars) == 21) { + + else if (g_utf8_strlen (chars,-1) >= 21) hildon_banner_show_information (gtk_widget_get_parent (GTK_WIDGET (user_data)), NULL, - dgettext("hildon-common-strings", "ckdg_ib_maximum_characters_reached")); - } - + _CS("ckdg_ib_maximum_characters_reached")); + else /* explicitely enable it, because with a previous entry_changed, it might have been turned off */ + gtk_widget_set_sensitive (ok_button, TRUE); + /* Free */ + g_list_free (buttons); g_free (chars); } @@ -749,6 +760,9 @@ launch_sort_headers_dialog (GtkWindow *parent_window, modest_widget_memory_save (modest_runtime_get_conf (), G_OBJECT (header_view), MODEST_CONF_HEADER_VIEW_KEY); + while (gtk_events_pending ()) + gtk_main_iteration (); + /* free */ g_list_free(cols); } @@ -778,8 +792,6 @@ modest_platform_run_folder_name_dialog (GtkWindow *parent_window, /* Add accept button (with unsensitive handler) */ buttons = gtk_container_get_children (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area)); accept_btn = GTK_WIDGET (buttons->next->data); - g_signal_connect (G_OBJECT (accept_btn), "insensitive-press", G_CALLBACK (folder_name_insensitive_press), parent_window); - /* Create label and entry */ label = gtk_label_new (label_text); /* TODO: check that the suggested name does not exist */ @@ -820,13 +832,10 @@ modest_platform_run_folder_name_dialog (GtkWindow *parent_window, gtk_widget_destroy (dialog); - return result; -} + while (gtk_events_pending ()) + gtk_main_iteration (); -static void -folder_name_insensitive_press (GtkWidget *widget, ModestWindow *window) -{ - hildon_banner_show_information (NULL, NULL, _("(empty)")); + return result; } gint @@ -835,11 +844,62 @@ modest_platform_run_new_folder_dialog (GtkWindow *parent_window, gchar *suggested_name, gchar **folder_name) { - return modest_platform_run_folder_name_dialog (parent_window, - _("mcen_ti_new_folder"), - _("mcen_fi_new_folder_name"), - suggested_name, - folder_name); + gchar *real_suggested_name = NULL; + gint result; + + if(suggested_name == NULL) + { + const gchar *default_name = _("mcen_ia_default_folder_name"); + unsigned int i; + gchar num_str[3]; + + for(i = 0; i < 100; ++ i) + { + TnyList *list = tny_simple_list_new (); + TnyFolderStoreQuery *query = tny_folder_store_query_new (); + guint length; + + sprintf(num_str, "%.2u", i); + + if (i == 0) + real_suggested_name = g_strdup (default_name); + else + real_suggested_name = g_strdup_printf (_("mcen_ia_default_folder_name_s"), + num_str); + + tny_folder_store_query_add_item (query, real_suggested_name, + TNY_FOLDER_STORE_QUERY_OPTION_MATCH_ON_NAME); + + tny_folder_store_get_folders (parent_folder, list, query, NULL); + + length = tny_list_get_length (list); + g_object_unref (query); + g_object_unref (list); + + if (length == 0) + break; + + g_free (real_suggested_name); + } + + /* Didn't find a free number */ + if (i == 100) + real_suggested_name = g_strdup (default_name); + } + else + { + real_suggested_name = suggested_name; + } + + result = modest_platform_run_folder_name_dialog (parent_window, + _("mcen_ti_new_folder"), + _("mcen_fi_new_folder_name"), + real_suggested_name, + folder_name); + if (suggested_name == NULL) + g_free(real_suggested_name); + + return result; } gint @@ -869,6 +929,9 @@ modest_platform_run_confirmation_dialog (GtkWindow *parent_window, gtk_widget_destroy (GTK_WIDGET (dialog)); + while (gtk_events_pending ()) + gtk_main_iteration (); + return response; } @@ -889,6 +952,9 @@ modest_platform_run_yes_no_dialog (GtkWindow *parent_window, gtk_widget_destroy (GTK_WIDGET (dialog)); + while (gtk_events_pending ()) + gtk_main_iteration (); + return response; } @@ -968,8 +1034,34 @@ on_idle_wait_for_previous_connect_to_finish(gpointer user_data) return result; } +static void +set_account_to_online (TnyAccount *account) +{ + /* TODO: This is necessary to prevent a cancel of the password dialog + * from making a restart necessary to be asked the password again, + * but it causes a hang: + */ + #if 0 + if (account && TNY_IS_CAMEL_STORE_ACCOUNT (account)) { + /* Make sure that store accounts are online too, + * because tinymail sets accounts to offline if + * a password dialog is ever cancelled. + * We don't do this for transport accounts because + * a) They fundamentally need network access, so they can't really be offline. + * b) That might cause a transport connection to happen too early. + */ + GError *error = NULL; + tny_camel_account_set_online (TNY_CAMEL_ACCOUNT (account), TRUE, &error); + if (error) { + g_warning ("%s: tny_camel_account_set_online() returned a GError:\n %s\n", + __FUNCTION__, error->message); + g_error_free (error); + } + } + #endif +} -gboolean modest_platform_connect_and_wait (GtkWindow *parent_window) +gboolean modest_platform_connect_and_wait (GtkWindow *parent_window, TnyAccount *account) { if (connect_request_in_progress) return FALSE; @@ -979,6 +1071,7 @@ gboolean modest_platform_connect_and_wait (GtkWindow *parent_window) if (tny_device_is_online (device)) { printf ("DEBUG: %s: Already online.\n", __FUNCTION__); + set_account_to_online (account); return TRUE; } else { @@ -1016,8 +1109,13 @@ gboolean modest_platform_connect_and_wait (GtkWindow *parent_window) /* g_main_context_unref (context); */ g_slice_free (UtilIdleData, data); - - return tny_device_is_online (device); + + gboolean result = tny_device_is_online (device); + + if (result) + set_account_to_online (account); + + return result; } gboolean modest_platform_connect_and_wait_if_network_account (GtkWindow *parent_window, TnyAccount *account) @@ -1030,7 +1128,7 @@ gboolean modest_platform_connect_and_wait_if_network_account (GtkWindow *parent_ } } - return modest_platform_connect_and_wait (parent_window); + return modest_platform_connect_and_wait (parent_window, account); } gboolean modest_platform_connect_and_wait_if_network_folderstore (GtkWindow *parent_window, TnyFolderStore *folder_store) @@ -1042,8 +1140,10 @@ gboolean modest_platform_connect_and_wait_if_network_folderstore (GtkWindow *par if (TNY_IS_FOLDER (folder_store)) { /* Get the folder's parent account: */ TnyAccount *account = tny_folder_get_account(TNY_FOLDER (folder_store)); - result = modest_platform_connect_and_wait_if_network_account (NULL, account); - g_object_unref (account); + if (account != NULL) { + result = modest_platform_connect_and_wait_if_network_account (NULL, account); + g_object_unref (account); + } } else if (TNY_IS_ACCOUNT (folder_store)) { /* Use the folder store as an account: */ result = modest_platform_connect_and_wait_if_network_account (NULL, TNY_ACCOUNT (folder_store)); @@ -1099,17 +1199,13 @@ gboolean modest_platform_set_update_interval (guint minutes) /* Register alarm: */ - /* Get current time: */ - time_t time_now; - time (&time_now); - struct tm *st_time = localtime (&time_now); - - /* Add minutes to tm_min field: */ - st_time->tm_min += minutes; - - /* Set the time in alarm_event_t structure: */ + /* Set the interval in alarm_event_t structure: */ alarm_event_t *event = g_new0(alarm_event_t, 1); - event->alarm_time = mktime (st_time); + event->alarm_time = minutes * 60; /* seconds */ + + /* Set recurrence every few minutes: */ + event->recurrence = minutes; + event->recurrence_count = -1; /* Means infinite */ /* Specify what should happen when the alarm happens: * It should call this D-Bus method: */ @@ -1250,10 +1346,11 @@ modest_platform_create_folder_view (TnyFolderStoreQuery *query) { GtkWidget *widget = modest_folder_view_new (query); - /* Show all accounts by default */ + /* Show one account by default */ modest_folder_view_set_style (MODEST_FOLDER_VIEW (widget), MODEST_FOLDER_VIEW_STYLE_SHOW_ONE); + /* Restore settings */ modest_widget_memory_restore (modest_runtime_get_conf(), G_OBJECT (widget),