X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmaemo%2Fmodest-platform.c;h=e921c1c0e6974741cb4ccc6b50c419fe77e6a661;hb=aab537f6ce755830767baa7260d7879449ceeb38;hp=dc324493a36ca408a125291a23f555cf700b7ecd;hpb=1c8928c2d9bf74d0df67eacf38aaf4947800dfb5;p=modest diff --git a/src/maemo/modest-platform.c b/src/maemo/modest-platform.c index dc32449..e921c1c 100644 --- a/src/maemo/modest-platform.c +++ b/src/maemo/modest-platform.c @@ -181,31 +181,37 @@ const gchar* guess_mime_type_from_name (const gchar* name) { int i; - const gchar* ext; - const static gchar* octet_stream= "application/octet-stream"; + const static gchar* mime_type; const static gchar* mime_map[][2] = { - { "pdf", "application/pdf"}, - { "doc", "application/msword"}, - { "xls", "application/excel"}, - { "png", "image/png" }, - { "gif", "image/gif" }, - { "jpg", "image/jpeg"}, - { "jpeg", "image/jpeg"}, - { "mp3", "audio/mp3" } + { ".note.html", "text/note"}, /* for the osso_notes program */ + { ".deb", "application/x-deb"}, + { ".install", "application/x-install-instructions"}, + { ".html", "text/html"}, + { ".htm", "text/html"}, + { ".pdf", "application/pdf"}, + { ".doc", "application/msword"}, + { ".xls", "application/excel"}, + { ".png", "image/png" }, + { ".gif", "image/gif" }, + { ".jpg", "image/jpeg"}, + { ".jpeg", "image/jpeg"}, + { ".mp3", "audio/mp3" } }; - if (!name) - return octet_stream; - - ext = g_strrstr (name, "."); - if (!ext) - return octet_stream; - - for (i = 0; i != G_N_ELEMENTS(mime_map); ++i) { - if (!g_ascii_strcasecmp (mime_map[i][0], ext + 1)) /* +1: ignore '.'*/ - return mime_map[i][1]; + mime_type = "application/octet-stream"; + + if (name) { + gchar* lc_name = g_utf8_strdown (name, -1); + for (i = 0; i != G_N_ELEMENTS(mime_map); ++i) { + if (g_str_has_suffix (lc_name, mime_map[i][0])) { + mime_type = mime_map[i][1]; + break; + } + } + g_free (lc_name); } - return octet_stream; + + return mime_type; } @@ -224,11 +230,7 @@ modest_platform_get_file_icon_name (const gchar* name, const gchar* mime_type, g_string_ascii_down (mime_str); } -#ifdef MODEST_HAVE_OSSO_MIME - icons = osso_mime_get_icon_names (mime_str->str, NULL); -#else icons = hildon_mime_get_icon_names (mime_str->str, NULL); -#endif /*MODEST_HAVE_OSSO_MIME*/ for (cursor = icons; cursor; ++cursor) { if (!g_ascii_strcasecmp (*cursor, "gnome-mime-message") || !g_ascii_strcasecmp (*cursor, "gnome-mime-message-rfc822")) { @@ -250,51 +252,6 @@ modest_platform_get_file_icon_name (const gchar* name, const gchar* mime_type, } - - -#ifdef MODEST_HAVE_OSSO_MIME -gboolean -modest_platform_activate_uri (const gchar *uri) -{ - OssoURIAction *action; - gboolean result = FALSE; - GSList *actions, *iter = NULL; - const gchar *scheme; - - g_return_val_if_fail (uri, FALSE); - if (!uri) - return FALSE; - - /* the default action should be email */ - scheme = osso_uri_get_scheme_from_uri (uri, NULL); - actions = osso_uri_get_actions (scheme, NULL); - - for (iter = actions; iter; iter = g_slist_next (iter)) { - action = (OssoURIAction*) iter->data; - if (action && strcmp (osso_uri_action_get_name (action), "uri_link_compose_email") == 0) { - GError *err = NULL; - result = osso_uri_open (uri, action, &err); - if (!result && err) { - g_printerr ("modest: modest_platform_activate_uri : %s", - err->message ? err->message : "unknown error"); - g_error_free (err); - } - break; - } - } - - /* if we could open it with email, try something else */ - if (!result) - result = osso_uri_open (uri, NULL, NULL); - - - if (!result) - hildon_banner_show_information (NULL, NULL, _("mcen_ib_unsupported_link")); - return result; -} - -#else /* !MODEST_HAVE_OSSO_MIME*/ - gboolean modest_platform_activate_uri (const gchar *uri) { @@ -312,7 +269,8 @@ modest_platform_activate_uri (const gchar *uri) for (iter = actions; iter; iter = g_slist_next (iter)) { action = (HildonURIAction*) iter->data; - if (action && strcmp (hildon_uri_action_get_service (action), "com.nokia.modest") == 0) { + if (action && strcmp (hildon_uri_action_get_service (action), + "com.nokia.modest") == 0) { GError *err = NULL; result = hildon_uri_open (uri, action, &err); if (!result && err) { @@ -334,36 +292,23 @@ modest_platform_activate_uri (const gchar *uri) return result; } - -#endif /* MODEST_HAVE_OSSO_MIME*/ - gboolean modest_platform_activate_file (const gchar *path, const gchar *mime_type) { - gint result; + gint result = 0; DBusConnection *con; gchar *uri_path = NULL; - GString *mime_str = NULL; - - if (!mime_type || !g_ascii_strcasecmp (mime_type, "application/octet-stream")) - mime_str = g_string_new (guess_mime_type_from_name(path)); - else { - mime_str = g_string_new (mime_type); - g_string_ascii_down (mime_str); - } - uri_path = g_strconcat ("file://", path, NULL); - + uri_path = g_strconcat ("file://", path, NULL); 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); -#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 (mime_type) + result = hildon_mime_open_file_with_mime_type (con, uri_path, mime_type); + if (result != 1) + result = hildon_mime_open_file (con, uri_path); if (result != 1) modest_platform_run_information_dialog (NULL, _("mcen_ni_noregistered_viewer")); + return result != 1; } @@ -380,11 +325,8 @@ delete_uri_popup (GtkWidget *menu, ModestPlatformPopupInfo *popup_info = (ModestPlatformPopupInfo *) userdata; g_free (popup_info->uri); -#ifdef MODEST_HAVE_OSSO_MIME - osso_uri_free_actions (popup_info->actions); -#else hildon_uri_free_actions (popup_info->actions); -#endif /*MODEST_HAVE_OSSO_MIME*/ + return FALSE; } @@ -417,19 +359,11 @@ activate_uri_popup_item (GtkMenuItem *menu_item, /* now, the real uri-actions... */ for (node = popup_info->actions; node != NULL; node = g_slist_next (node)) { -#ifdef MODEST_HAVE_OSSO_MIME - OssoURIAction *action = (OssoURIAction *) node->data; - if (strcmp (action_name, osso_uri_action_get_name (action))==0) { - osso_uri_open (popup_info->uri, action, NULL); - break; - } -#else HildonURIAction *action = (HildonURIAction *) node->data; if (strcmp (action_name, hildon_uri_action_get_name (action))==0) { hildon_uri_open (popup_info->uri, action, NULL); break; } -#endif /*MODEST_HAVE_OSSO_MIME*/ } } @@ -442,13 +376,8 @@ modest_platform_show_uri_popup (const gchar *uri) if (uri == NULL) return FALSE; -#ifdef MODEST_HAVE_OSSO_MIME - scheme = osso_uri_get_scheme_from_uri (uri, NULL); - actions_list = osso_uri_get_actions (scheme, NULL); -#else scheme = hildon_uri_get_scheme_from_uri (uri, NULL); actions_list = hildon_uri_get_actions (scheme, NULL); -#endif /* MODEST_HAVE_OSSO_MIME */ if (actions_list != NULL) { GSList *node; GtkWidget *menu = gtk_menu_new (); @@ -461,22 +390,6 @@ modest_platform_show_uri_popup (const gchar *uri) GtkWidget *menu_item; const gchar *action_name; const gchar *translation_domain; -#ifdef MODEST_HAVE_OSSO_MIME - OssoURIAction *action = (OssoURIAction *) node->data; - action_name = osso_uri_action_get_name (action); - translation_domain = osso_uri_action_get_translation_domain (action); - menu_item = gtk_menu_item_new_with_label (dgettext(translation_domain,action_name)); - g_object_set_data (G_OBJECT(menu_item), HILDON_OSSO_URI_ACTION, (gpointer)action_name); - /* hack, we add it as a gobject property*/ - g_signal_connect (G_OBJECT (menu_item), "activate", G_CALLBACK (activate_uri_popup_item), - popup_info); - - if (osso_uri_is_default_action (action, NULL)) { - gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menu_item); - } else { - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); - } -#else HildonURIAction *action = (HildonURIAction *) node->data; action_name = hildon_uri_action_get_name (action); translation_domain = hildon_uri_action_get_translation_domain (action); @@ -490,7 +403,6 @@ modest_platform_show_uri_popup (const gchar *uri) } else { gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); } -#endif /*MODEST_HAVE_OSSO_MIME*/ gtk_widget_show (menu_item); } @@ -1149,10 +1061,11 @@ gboolean modest_platform_connect_and_wait (GtkWindow *parent_window, TnyAccount g_slice_free (UtilIdleData, data); - gboolean result = tny_device_is_online (device); + const gboolean result = tny_device_is_online (device); - if (result) + if (result) { set_account_to_online (account); + } return result; } @@ -1191,6 +1104,38 @@ gboolean modest_platform_connect_and_wait_if_network_folderstore (GtkWindow *par return result; } +gboolean modest_platform_is_network_folderstore (TnyFolderStore *folder_store) +{ + TnyAccount *account = NULL; + gboolean result = TRUE; + + g_return_val_if_fail(TNY_IS_FOLDER_STORE(folder_store), FALSE); + + if (TNY_IS_FOLDER (folder_store)) { + /* Get the folder's parent account: */ + account = tny_folder_get_account(TNY_FOLDER(folder_store)); + } else if (TNY_IS_ACCOUNT (folder_store)) { + account = TNY_ACCOUNT(folder_store); + g_object_ref(account); + } + + if (account != NULL) { + if (tny_account_get_account_type (account) == TNY_ACCOUNT_TYPE_STORE) { + if (!TNY_IS_CAMEL_POP_STORE_ACCOUNT (account) && + !TNY_IS_CAMEL_IMAP_STORE_ACCOUNT (account)) { + /* This must be a maildir account, which does + * not require a connection: */ + result = FALSE; + } + } + g_object_unref (account); + } else { + result = FALSE; + } + + return result; +} + void modest_platform_run_sort_dialog (GtkWindow *parent_window, ModestSortDialogType type) @@ -1310,18 +1255,29 @@ modest_platform_on_new_msg (void) #ifdef MODEST_HAVE_HILDON_NOTIFY HildonNotification *not; - /* Create a new notification. FIXME put the right values, need - some more specs */ + /* Create a new notification. TODO: per-mail data needed */ not = hildon_notification_new ("TODO: (new email) Summary", "TODO: (new email) Description", - "qgn_contact_group_chat_invitation", - "system.note.dialog"); - - /* Play sound SR-SND-18. TODO: play the right file */ - /* TODO: Where is this declared? hildon_notification_set_sound (not, "/usr/share/sounds/ui-new_email.wav"); */ + "qgn_list_messagin_mail_unread", + NULL); + + hildon_notification_add_dbus_action(not, + "default", + "Cancel", + MODEST_DBUS_SERVICE, + MODEST_DBUS_OBJECT, + MODEST_DBUS_IFACE, + MODEST_DBUS_METHOD_OPEN_DEFAULT_INBOX, + -1); + + /* Play sound SR-SND-18 */ + hildon_notification_set_sound (not, "/usr/share/sounds/ui-new_email.wav"); + notify_notification_set_hint_int32 (NOTIFY_NOTIFICATION (not), "dialog-type", 4); /* Set the led pattern */ - notify_notification_set_hint_int32 (NOTIFY_NOTIFICATION (not), "led-pattern", 3); + notify_notification_set_hint_string(NOTIFY_NOTIFICATION (not), + "led-pattern", + "PatternCommunicationEmail"); /* Notify. We need to do this in an idle because this function could be called from a thread */ @@ -1422,3 +1378,128 @@ modest_platform_animation_banner (GtkWidget *parent, return inf_note; } + +typedef struct +{ + GMainLoop* loop; + TnyAccount *account; + gboolean is_online; + gint count_tries; +} CheckAccountIdleData; + +#define NUMBER_OF_TRIES 10 /* Try approx every second, ten times. */ + +static gboolean +on_timeout_check_account_is_online(gpointer user_data) +{ + printf ("DEBUG: %s:\n", __FUNCTION__); + CheckAccountIdleData *data = (CheckAccountIdleData*)user_data; + + if (!data) { + g_warning ("%s: data is NULL.\n", __FUNCTION__); + } + + if (!(data->account)) { + g_warning ("%s: data->account is NULL.\n", __FUNCTION__); + } + + if (data && data->account) { + printf ("DEBUG: %s: tny_account_get_connection_status()==%d\n", __FUNCTION__, tny_account_get_connection_status (data->account)); + } + + gboolean stop_trying = FALSE; + if (data && data->account && + /* We want to wait until TNY_CONNECTION_STATUS_INIT has changed to something else, + * after which the account is likely to be usable, or never likely to be usable soon: */ + (tny_account_get_connection_status (data->account) != TNY_CONNECTION_STATUS_INIT) ) + { + data->is_online = TRUE; + + stop_trying = TRUE; + } + else { + /* Give up if we have tried too many times: */ + if (data->count_tries >= NUMBER_OF_TRIES) + { + stop_trying = TRUE; + } + else { + /* Wait for another timeout: */ + ++(data->count_tries); + } + } + + if (stop_trying) { + /* Allow the function that requested this idle callback to continue: */ + if (data->loop) + g_main_loop_quit (data->loop); + + if (data->account) + g_object_unref (data->account); + + return FALSE; /* Don't call this again. */ + } else { + return TRUE; /* Call this timeout callback again. */ + } +} + +/* Return TRUE immediately if the account is already online, + * otherwise check every second for NUMBER_OF_TRIES seconds and return TRUE as + * soon as the account is online, or FALSE if the account does + * not become online in the NUMBER_OF_TRIES seconds. + * This is useful when the D-Bus method was run immediately after + * the application was started (when using D-Bus activation), + * because the account usually takes a short time to go online. + * The return value is maybe not very useful. + */ +gboolean +modest_platform_check_and_wait_for_account_is_online(TnyAccount *account) +{ + g_return_val_if_fail (account, FALSE); + + printf ("DEBUG: %s: account id=%s\n", __FUNCTION__, tny_account_get_id (account)); + + if (!tny_device_is_online (modest_runtime_get_device())) { + printf ("DEBUG: %s: device is offline.\n", __FUNCTION__); + return FALSE; + } + + /* The local_folders account never seems to leave TNY_CONNECTION_STATUS_INIT, + * so we avoid wait unnecessarily: */ + if (!TNY_IS_CAMEL_POP_STORE_ACCOUNT (account) && + !TNY_IS_CAMEL_IMAP_STORE_ACCOUNT (account) ) { + return TRUE; + } + + printf ("DEBUG: %s: tny_account_get_connection_status()==%d\n", + __FUNCTION__, tny_account_get_connection_status (account)); + + /* The POP & IMAP store accounts seem to be TNY_CONNECTION_STATUS_DISCONNECTED, + * and that seems to be an OK time to use them. Maybe it's just TNY_CONNECTION_STATUS_INIT that + * we want to avoid. */ + if (tny_account_get_connection_status (account) != TNY_CONNECTION_STATUS_INIT) + return TRUE; + + /* This blocks on the result: */ + CheckAccountIdleData *data = g_slice_new0 (CheckAccountIdleData); + data->is_online = FALSE; + data->account = account; + g_object_ref (data->account); + data->count_tries = 0; + + GMainContext *context = NULL; /* g_main_context_new (); */ + data->loop = g_main_loop_new (context, FALSE /* not running */); + + g_timeout_add (1000, &on_timeout_check_account_is_online, data); + + /* This main loop will run until the idle handler has stopped it: */ + g_main_loop_run (data->loop); + + g_main_loop_unref (data->loop); + /* g_main_context_unref (context); */ + + g_slice_free (CheckAccountIdleData, data); + + return data->is_online; +} +