From 24316ebf63212f185e7f6bf70a0e04f3f52e0fa4 Mon Sep 17 00:00:00 2001 From: Jose Dapena Paz Date: Mon, 8 Jun 2009 13:18:33 +0200 Subject: [PATCH] Add method to get the folder without accessing network. --- src/dbus_api/modest-dbus-callbacks.c | 12 +++++++--- src/hildon2/modest-hildon2-window-mgr.c | 5 ++-- src/hildon2/modest-msg-view-window.c | 17 ++++++------- src/maemo/modest-msg-view-window.c | 26 +++++++++++++------- src/modest-mail-operation.c | 5 ++-- src/modest-tny-folder.c | 40 +++++++++++++++++++++++++++++++ src/modest-tny-folder.h | 13 ++++++++++ src/widgets/modest-window-mgr.c | 13 +++++----- 8 files changed, 99 insertions(+), 32 deletions(-) diff --git a/src/dbus_api/modest-dbus-callbacks.c b/src/dbus_api/modest-dbus-callbacks.c index cab4e71..adf3f5a 100644 --- a/src/dbus_api/modest-dbus-callbacks.c +++ b/src/dbus_api/modest-dbus-callbacks.c @@ -586,7 +586,8 @@ on_open_message_performer (gboolean canceled, info = (OpenMsgPerformerInfo *) user_data; if (canceled || err) { - modest_platform_run_information_dialog (NULL, _("mail_ni_ui_folder_get_msg_folder_error"), TRUE); + if (!canceled) + modest_platform_run_information_dialog (NULL, _("mail_ni_ui_folder_get_msg_folder_error"), TRUE); g_idle_add (notify_error_in_dbus_callback, NULL); on_find_msg_async_destroy (info); return; @@ -706,15 +707,20 @@ on_open_message (GArray * arguments, gpointer data, osso_rpc_t * retval) /* Try to get the message, if it's already downloaded we don't need to connect */ if (account) { - if (TNY_ACCOUNT (local_folders_account) == account) { + TnyDevice *device; + gboolean device_online; + + device = modest_runtime_get_device (); + device_online = tny_device_is_online (device); + if (!device_online || TNY_ACCOUNT (local_folders_account) == account) { folder = tny_store_account_find_folder (TNY_STORE_ACCOUNT (account), uri, NULL); } else { folder = NULL; - info->connect = TRUE; } } else { folder = modest_tny_local_folders_account_get_merged_outbox (local_folders_account); g_object_unref (local_folders_account); + info->connect = FALSE; } if (folder) { TnyMsg *msg = tny_folder_find_msg (folder, uri, NULL); diff --git a/src/hildon2/modest-hildon2-window-mgr.c b/src/hildon2/modest-hildon2-window-mgr.c index b55ce9d..6dd7bb9 100644 --- a/src/hildon2/modest-hildon2-window-mgr.c +++ b/src/hildon2/modest-hildon2-window-mgr.c @@ -497,14 +497,15 @@ modest_hildon2_window_mgr_register_window (ModestWindowMgr *self, return FALSE; } g_free (uid); - } else { + } else if (header) { if (g_list_find_custom (priv->window_list, header, (GCompareFunc) compare_headers)) { g_debug ("%s found another view window showing the same header", __FUNCTION__); g_object_unref (header); return FALSE; } } - g_object_unref (header); + if (header) + g_object_unref (header); } /* Do not go backwards */ diff --git a/src/hildon2/modest-msg-view-window.c b/src/hildon2/modest-msg-view-window.c index d5926f6..c61d739 100644 --- a/src/hildon2/modest-msg-view-window.c +++ b/src/hildon2/modest-msg-view-window.c @@ -959,7 +959,7 @@ modest_msg_view_window_new_from_uid (const gchar *modest_account_name, /* Try to get the message, if it's already downloaded we don't need to connect */ if (account) { - folder = tny_store_account_find_folder (TNY_STORE_ACCOUNT (account), msg_uid, NULL); + folder = modest_tny_folder_store_find_folder_from_uri (TNY_FOLDER_STORE (account), msg_uid); } else { ModestTnyAccountStore *account_store; ModestTnyLocalFoldersAccount *local_folders_account; @@ -982,6 +982,7 @@ modest_msg_view_window_new_from_uid (const gchar *modest_account_name, TnyMsg *msg = tny_folder_find_msg (folder, msg_uid, NULL); if (msg) { tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg); + update_window_title (MODEST_MSG_VIEW_WINDOW (window)); update_branding (MODEST_MSG_VIEW_WINDOW (window)); g_object_unref (msg); } else { @@ -1919,7 +1920,8 @@ message_reader_performer (gboolean canceled, } /* Register the header - it'll be unregistered in the callback */ - modest_window_mgr_register_header (modest_runtime_get_window_mgr (), info->header, NULL); + if (info->header) + modest_window_mgr_register_header (modest_runtime_get_window_mgr (), info->header, NULL); /* New mail operation */ mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT(parent_window), @@ -1976,6 +1978,9 @@ message_reader (ModestMsgViewWindow *window, tny_header_view_set_header (TNY_HEADER_VIEW (priv->msg_view), header); gtk_window_set_title (GTK_WINDOW (window), _CS("ckdg_pb_updating")); + if (folder) + g_object_ref (folder); + mgr = modest_runtime_get_window_mgr (); /* Msg download completed */ if (!header || !(tny_header_get_flags (header) & TNY_HEADER_FLAG_CACHED)) { @@ -1994,8 +1999,6 @@ message_reader (ModestMsgViewWindow *window, if (header) { folder = tny_header_get_folder (header); - } else { - g_object_ref (folder); } info = g_slice_new (MsgReaderInfo); info->msg_uid = g_strdup (msg_uid); @@ -2026,17 +2029,15 @@ message_reader (ModestMsgViewWindow *window, if (header) { folder = tny_header_get_folder (header); - } else { - g_object_ref (folder); } account = tny_folder_get_account (folder); info = g_slice_new (MsgReaderInfo); info->msg_uid = g_strdup (msg_uid); - if (info->folder) + if (folder) info->folder = g_object_ref (folder); else info->folder = NULL; - if (info->header) + if (header) info->header = g_object_ref (header); else info->header = NULL; diff --git a/src/maemo/modest-msg-view-window.c b/src/maemo/modest-msg-view-window.c index 2114334..81412f0 100644 --- a/src/maemo/modest-msg-view-window.c +++ b/src/maemo/modest-msg-view-window.c @@ -1916,7 +1916,8 @@ message_reader_performer (gboolean canceled, } /* Register the header - it'll be unregistered in the callback */ - modest_window_mgr_register_header (modest_runtime_get_window_mgr (), info->header, NULL); + if (info->header) + modest_window_mgr_register_header (modest_runtime_get_window_mgr (), info->header, NULL); /* New mail operation */ mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT(parent_window), @@ -1937,7 +1938,10 @@ message_reader_performer (gboolean canceled, frees: /* Frees. The row_reference will be freed by the view_msg_cb callback */ g_free (info->uid); - g_object_unref (info->header); + if (info->header) + g_object_unref (info->header); + if (info->folder) + g_object_unref (info->folder); g_slice_free (MsgReaderInfo, info); } @@ -1969,7 +1973,7 @@ message_reader (ModestMsgViewWindow *window, MsgReaderInfo *info; mgr = modest_runtime_get_window_mgr (); - already_showing = modest_window_mgr_find_registered_header (mgr, header, &msg_window); + already_showing = header && modest_window_mgr_find_registered_header (mgr, header, &msg_window); if (already_showing && (msg_window != MODEST_WINDOW (window))) { gboolean retval; if (msg_window) @@ -1978,6 +1982,10 @@ message_reader (ModestMsgViewWindow *window, return TRUE; } + if (folder) + g_object_ref (folder); + + /* Msg download completed */ if (!header || !(tny_header_get_flags (header) & TNY_HEADER_FLAG_CACHED)) { /* Ask the user if he wants to download the message if @@ -1990,10 +1998,10 @@ message_reader (ModestMsgViewWindow *window, if (response == GTK_RESPONSE_CANCEL) return FALSE; - if (header) + if (header) { + if (folder) g_object_unref (folder); folder = tny_header_get_folder (header); - else - g_object_ref (folder); + } info = g_slice_new (MsgReaderInfo); info->msg_uid = g_strdup (msg_uid); if (header) @@ -2016,10 +2024,10 @@ message_reader (ModestMsgViewWindow *window, } } - if (header) + if (header) { + if (folder) g_object_unref (folder); folder = tny_header_get_folder (header); - else - g_object_ref (folder); + } account = tny_folder_get_account (folder); info = g_slice_new (MsgReaderInfo); info->msg_uid = g_strdup (msg_uid); diff --git a/src/modest-mail-operation.c b/src/modest-mail-operation.c index f74f11e..49e1818 100644 --- a/src/modest-mail-operation.c +++ b/src/modest-mail-operation.c @@ -2555,8 +2555,6 @@ modest_mail_operation_find_msg (ModestMailOperation *self, g_slice_free (ModestMailOperationState, state); tny_folder_find_msg_async (folder, msg_uid, get_msg_async_cb, get_msg_status_cb, helper); - - g_object_unref (G_OBJECT (folder)); } void @@ -2712,7 +2710,8 @@ get_msg_async_cb (TnyFolder *folder, /* Clean */ if (info->more_msgs) g_object_unref (info->more_msgs); - g_object_unref (info->header); + if (info->header) + g_object_unref (info->header); g_object_unref (info->mail_op); g_slice_free (GetMsgInfo, info); } else if (info->more_msgs) { diff --git a/src/modest-tny-folder.c b/src/modest-tny-folder.c index 2441711..f654a40 100644 --- a/src/modest-tny-folder.c +++ b/src/modest-tny-folder.c @@ -528,3 +528,43 @@ modest_tny_folder_get_display_name (TnyFolder *folder) return fname; } + +TnyFolder * +modest_tny_folder_store_find_folder_from_uri (TnyFolderStore *folder_store, const gchar *uri) +{ + TnyList *children; + TnyIterator *iterator; + TnyFolder *result; + + result = NULL; + children = TNY_LIST (tny_simple_list_new ()); + tny_folder_store_get_folders (folder_store, children, NULL, FALSE, NULL); + + for (iterator = tny_list_create_iterator (children); + !tny_iterator_is_done (iterator) && (result == NULL); + tny_iterator_next (iterator)) { + TnyFolderStore *child; + + child = TNY_FOLDER_STORE (tny_iterator_get_current (iterator)); + + if (TNY_IS_FOLDER (child)) { + gchar *folder_url; + + folder_url = tny_folder_get_url_string (TNY_FOLDER (child)); + if (g_str_has_prefix (uri, folder_url)) + result = g_object_ref (child); + g_free (folder_url); + } + + if ((child == NULL) && TNY_IS_FOLDER_STORE (child)) { + result = modest_tny_folder_store_find_folder_from_uri (child, uri); + } + + g_object_unref (child); + } + + g_object_unref (iterator); + g_object_unref (children); + + return result; +} diff --git a/src/modest-tny-folder.h b/src/modest-tny-folder.h index c11f3a7..cdfccf3 100644 --- a/src/modest-tny-folder.h +++ b/src/modest-tny-folder.h @@ -204,6 +204,19 @@ gboolean modest_tny_folder_is_ancestor (TnyFolder *folder, TnyFolderStore *ancestor); /** + * modest_tny_folder_store_find_folder_from_uri: + * @folder_store: a #TnyFolderStore + * @uri: a string + * + * This method tries to find a folder in @folder_store. The idea is + * being as fast as possible being synchronous. This is accomplished + * avoiding network access. + * + * Returns: %NULL if folder is not found, or a #TnyFolder. + */ +TnyFolder *modest_tny_folder_store_find_folder_from_uri (TnyFolderStore *folder_store, const gchar *uri); + +/** * modest_tny_folder_get_display_name: * @folder: a #TnyFolder * diff --git a/src/widgets/modest-window-mgr.c b/src/widgets/modest-window-mgr.c index a410589..6000886 100644 --- a/src/widgets/modest-window-mgr.c +++ b/src/widgets/modest-window-mgr.c @@ -571,15 +571,14 @@ modest_window_mgr_register_window_default (ModestWindowMgr *self, const gchar *uid = modest_msg_view_window_get_message_uid (MODEST_MSG_VIEW_WINDOW (window)); - if (!has_uid (priv->preregistered_uids, uid)) - g_debug ("weird: no uid for window (%s)", uid); - MODEST_DEBUG_BLOCK(g_debug ("registering window for %s", uid ? uid : "");); - priv->preregistered_uids = - remove_uid (priv->preregistered_uids, - modest_msg_view_window_get_message_uid - (MODEST_MSG_VIEW_WINDOW (window))); + if (has_uid (priv->preregistered_uids, uid)) { + priv->preregistered_uids = + remove_uid (priv->preregistered_uids, + modest_msg_view_window_get_message_uid + (MODEST_MSG_VIEW_WINDOW (window))); + } } else if (MODEST_IS_MSG_EDIT_WINDOW(window)) { const gchar *uid = modest_msg_edit_window_get_message_uid (MODEST_MSG_EDIT_WINDOW (window)); -- 1.7.9.5