aboutsummaryrefslogtreecommitdiffstats
path: root/shell/e-corba-storage.c
diff options
context:
space:
mode:
authorDan Winship <danw@src.gnome.org>2003-03-15 03:58:36 +0800
committerDan Winship <danw@src.gnome.org>2003-03-15 03:58:36 +0800
commit35ff6769cb500b826678ae64504befc1c9c4757e (patch)
tree8728b8b6a4092dede79f5591668867726af23ff6 /shell/e-corba-storage.c
parent238c20117fc8d3fdddb270e3ef197593e45e1a85 (diff)
downloadgsoc2013-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.c44
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;