From 35ff6769cb500b826678ae64504befc1c9c4757e Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Fri, 14 Mar 2003 19:58:36 +0000 Subject: Add (e_storage_declare_has_subfolders): Rename from * e-storage.c (e_storage_get_has_subfolders): Add (e_storage_declare_has_subfolders): Rename from e_storage_has_subfolders to make it clearer that this is a setter, not a getter. (Can't call it e_storage_set_has_subfolders because that sounds like it belongs in e-storage-set.) * e-corba-storage.c (impl_StorageListener_notifyHasSubfolders): update for e_storage_declare_has_subfolders name change (get_folder): Override the default EStorage implementation: if asked for a folder under a not-yet-expanded folder, attempt to force the parent(s) to expand so that the child is available. Fixes part of #30415 svn path=/trunk/; revision=20302 --- shell/ChangeLog | 15 +++++++++++++++ shell/e-corba-storage.c | 44 +++++++++++++++++++++++++++++++++++++++++++- shell/e-storage.c | 28 +++++++++++++++++++++++++--- shell/e-storage.h | 14 +++++++++++--- 4 files changed, 94 insertions(+), 7 deletions(-) (limited to 'shell') diff --git a/shell/ChangeLog b/shell/ChangeLog index 7994f32b12..aa83239acb 100644 --- a/shell/ChangeLog +++ b/shell/ChangeLog @@ -1,3 +1,18 @@ +2003-03-14 Dan Winship + + * e-storage.c (e_storage_get_has_subfolders): Add + (e_storage_declare_has_subfolders): Rename from + e_storage_has_subfolders to make it clearer that this is a setter, + not a getter. (Can't call it e_storage_set_has_subfolders because + that sounds like it belongs in e-storage-set.) + + * e-corba-storage.c (impl_StorageListener_notifyHasSubfolders): + update for e_storage_declare_has_subfolders name change + (get_folder): Override the default EStorage implementation: if + asked for a folder under a not-yet-expanded folder, attempt to + force the parent(s) to expand so that the child is available. + Fixes part of #30415 + 2003-03-14 Dan Winship * Evolution-Storage.idl (asyncOpenFolder): add a Bonobo::Listener diff --git a/shell/e-corba-storage.c b/shell/e-corba-storage.c index 05c90bfcd7..8cef8f1064 100644 --- a/shell/e-corba-storage.c +++ b/shell/e-corba-storage.c @@ -187,7 +187,7 @@ impl_StorageListener_notifyHasSubfolders (PortableServer_Servant servant, storage_listener_servant = (StorageListenerServant *) servant; storage = storage_listener_servant->storage; - if (! e_storage_has_subfolders (storage, path, message)) { + if (! e_storage_declare_has_subfolders (storage, path, message)) { g_warning ("Cannot register subfolder tree -- %s\n", path); CORBA_exception_set (ev, CORBA_USER_EXCEPTION, @@ -293,6 +293,47 @@ impl_finalize (GObject *object) /* EStorage methods. */ +static void +get_folder_cb (EStorage *storage, EStorageResult result, + const char *path, gpointer data) +{ + gboolean *done = data; + + *done = TRUE; +} + +static EFolder * +get_folder (EStorage *storage, const char *path) +{ + EFolder *folder; + char *path_dup, *p; + + folder = (* E_STORAGE_CLASS (parent_class)->get_folder) (storage, path); + if (folder) + return folder; + + /* If @path points to a part of the storage that hasn't been + * opened yet, do that. + */ + path_dup = g_strdup (path); + p = strchr (path_dup + 1, '/'); + while (p) { + *p = '\0'; + if (e_storage_get_has_subfolders (storage, path_dup)) { + gboolean done = FALSE; + + e_storage_async_open_folder (storage, path_dup, + get_folder_cb, &done); + while (!done) + gtk_main_iteration (TRUE); + } + *p = '/'; + p = strchr (p + 1, '/'); + } + + return (* E_STORAGE_CLASS (parent_class)->get_folder) (storage, path); +} + struct async_folder_closure { EStorageResultCallback callback; EStorage *storage; @@ -714,6 +755,7 @@ class_init (ECorbaStorageClass *klass) object_class->finalize = impl_finalize; storage_class = E_STORAGE_CLASS (klass); + storage_class->get_folder = get_folder; storage_class->async_create_folder = async_create_folder; storage_class->async_remove_folder = async_remove_folder; storage_class->async_xfer_folder = async_xfer_folder; diff --git a/shell/e-storage.c b/shell/e-storage.c index 6825485f9d..1f54ee5afa 100644 --- a/shell/e-storage.c +++ b/shell/e-storage.c @@ -720,10 +720,16 @@ e_storage_new_folder (EStorage *storage, return TRUE; } +/* This really should be called e_storage_set_has_subfolders, but then + * it would look like it was an EStorageSet function. (Fact o' the + * day: The word "set" has more distinct meanings than any other word + * in the English language.) Anyway, we now return you to your + * regularly scheduled source code, already in progress. + */ gboolean -e_storage_has_subfolders (EStorage *storage, - const char *path, - const char *message) +e_storage_declare_has_subfolders (EStorage *storage, + const char *path, + const char *message) { EStoragePrivate *priv; GList *subfolders, *f; @@ -761,6 +767,22 @@ e_storage_has_subfolders (EStorage *storage, return e_storage_new_folder (storage, pseudofolder_path, pseudofolder); } +gboolean +e_storage_get_has_subfolders (EStorage *storage, + const char *path) +{ + EStoragePrivate *priv; + + g_return_val_if_fail (storage != NULL, FALSE); + g_return_val_if_fail (E_IS_STORAGE (storage), FALSE); + g_return_val_if_fail (path != NULL, FALSE); + g_return_val_if_fail (g_path_is_absolute (path), FALSE); + + priv = storage->priv; + + return g_hash_table_lookup (priv->pseudofolders, path) != NULL; +} + gboolean e_storage_removed_folder (EStorage *storage, const char *path) diff --git a/shell/e-storage.h b/shell/e-storage.h index e7793b8c90..bd0cc5da22 100644 --- a/shell/e-storage.h +++ b/shell/e-storage.h @@ -195,9 +195,17 @@ char *e_storage_get_path_for_physical_uri (EStorage *storage, const char *physical_uri); /* Protected. C++ anyone? */ -gboolean e_storage_new_folder (EStorage *storage, const char *path, EFolder *folder); -gboolean e_storage_has_subfolders (EStorage *storage, const char *path, const char *message); -gboolean e_storage_removed_folder (EStorage *storage, const char *path); +gboolean e_storage_new_folder (EStorage *storage, + const char *path, + EFolder *folder); +gboolean e_storage_removed_folder (EStorage *storage, + const char *path); + +gboolean e_storage_declare_has_subfolders (EStorage *storage, + const char *path, + const char *message); +gboolean e_storage_get_has_subfolders (EStorage *storage, + const char *path); #ifdef __cplusplus } -- cgit v1.2.3