diff options
author | Dan Winship <danw@src.gnome.org> | 2003-03-15 03:58:36 +0800 |
---|---|---|
committer | Dan Winship <danw@src.gnome.org> | 2003-03-15 03:58:36 +0800 |
commit | 35ff6769cb500b826678ae64504befc1c9c4757e (patch) | |
tree | 8728b8b6a4092dede79f5591668867726af23ff6 /shell/e-corba-storage.c | |
parent | 238c20117fc8d3fdddb270e3ef197593e45e1a85 (diff) | |
download | gsoc2013-evolution-35ff6769cb500b826678ae64504befc1c9c4757e.tar gsoc2013-evolution-35ff6769cb500b826678ae64504befc1c9c4757e.tar.gz gsoc2013-evolution-35ff6769cb500b826678ae64504befc1c9c4757e.tar.bz2 gsoc2013-evolution-35ff6769cb500b826678ae64504befc1c9c4757e.tar.lz gsoc2013-evolution-35ff6769cb500b826678ae64504befc1c9c4757e.tar.xz gsoc2013-evolution-35ff6769cb500b826678ae64504befc1c9c4757e.tar.zst gsoc2013-evolution-35ff6769cb500b826678ae64504befc1c9c4757e.zip |
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
Diffstat (limited to 'shell/e-corba-storage.c')
-rw-r--r-- | shell/e-corba-storage.c | 44 |
1 files changed, 43 insertions, 1 deletions
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; |