From 0f75c9693668acf8e5a1f8ca3e7aa3cd2cd0d399 Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Fri, 14 Mar 2003 18:13:58 +0000 Subject: add a Bonobo::Listener to this like the other async interfaces, rather * Evolution-Storage.idl (asyncOpenFolder): add a Bonobo::Listener to this like the other async interfaces, rather than having a hacky way to signal failure. * evolution-storage.c (impl_Storage_asyncOpenFolder): Update to take a listener and emit it as part of the signal (evolution_storage_class_init): update OPEN_FOLDER signal prototype. * e-shell-marshal.list (NONE:POINTER,STRING): add, for changed EvolutionStorage open_folder signal * e-storage.c (e_storage_async_open_folder): add a callback arg (impl_async_open_folder): call the callback with NOTIMPLEMENTED. (class_init): remove the CLOSE_FOLDER signal (e_storage_has_subfolders): Don't emit CLOSE_FOLDER since it doesn't exist any more, and this function is used for that side effect any more anyway. * e-corba-storage.c (async_open_folder): add the callback arg and create a proper closure. (async_open_folder_idle): Call the callback in case of error. Create a listener and pass that to the CORBA call. (async_open_cb): Listener callback. * e-storage-set.c (storage_set_view_folder_opened): Pass a callback to e_storage_async_open_folder. (async_open_cb): emit CLOSE_FOLDER if the open failed (storage_close_folder_cb): Remove this since the signal no longer exists. svn path=/trunk/; revision=20297 --- shell/ChangeLog | 33 ++++++++++++++++++ shell/Evolution-Storage.idl | 3 +- shell/e-corba-storage.c | 81 +++++++++++++++++++++++++++++++++------------ shell/e-shell-marshal.list | 1 + shell/e-storage-set.c | 33 +++++++++--------- shell/e-storage.c | 28 ++++++---------- shell/e-storage.h | 10 ++++-- shell/evolution-storage.c | 10 ++++-- shell/evolution-storage.h | 1 + 9 files changed, 137 insertions(+), 63 deletions(-) (limited to 'shell') diff --git a/shell/ChangeLog b/shell/ChangeLog index 88f6c8df16..7994f32b12 100644 --- a/shell/ChangeLog +++ b/shell/ChangeLog @@ -1,3 +1,36 @@ +2003-03-14 Dan Winship + + * Evolution-Storage.idl (asyncOpenFolder): add a Bonobo::Listener + to this like the other async interfaces, rather than having a + hacky way to signal failure. + + * evolution-storage.c (impl_Storage_asyncOpenFolder): Update to + take a listener and emit it as part of the signal + (evolution_storage_class_init): update OPEN_FOLDER signal + prototype. + + * e-shell-marshal.list (NONE:POINTER,STRING): add, for changed + EvolutionStorage open_folder signal + + * e-storage.c (e_storage_async_open_folder): add a callback arg + (impl_async_open_folder): call the callback with NOTIMPLEMENTED. + (class_init): remove the CLOSE_FOLDER signal + (e_storage_has_subfolders): Don't emit CLOSE_FOLDER since it + doesn't exist any more, and this function is used for that side + effect any more anyway. + + * e-corba-storage.c (async_open_folder): add the callback arg and + create a proper closure. + (async_open_folder_idle): Call the callback in case of error. + Create a listener and pass that to the CORBA call. + (async_open_cb): Listener callback. + + * e-storage-set.c (storage_set_view_folder_opened): Pass a + callback to e_storage_async_open_folder. + (async_open_cb): emit CLOSE_FOLDER if the open failed + (storage_close_folder_cb): Remove this since the signal no longer + exists. + 2003-03-11 Dan Winship * e-shell-startup-wizard.c (start_wizard): If the wizard factory diff --git a/shell/Evolution-Storage.idl b/shell/Evolution-Storage.idl index 26313b6825..2d6928938b 100644 --- a/shell/Evolution-Storage.idl +++ b/shell/Evolution-Storage.idl @@ -82,7 +82,8 @@ module Evolution { in Bonobo::Listener listener); /* Open remote nodes. */ - void asyncOpenFolder (in string path); + void asyncOpenFolder (in string path, + in Bonobo::Listener listener); /* Set unread count. */ void updateFolder (in string path, diff --git a/shell/e-corba-storage.c b/shell/e-corba-storage.c index 1aee5e7091..05c90bfcd7 100644 --- a/shell/e-corba-storage.c +++ b/shell/e-corba-storage.c @@ -458,44 +458,83 @@ async_xfer_folder (EStorage *storage, CORBA_exception_free (&ev); } -static gboolean -async_open_folder_idle (gpointer data) +struct async_open_closure { + EStorageDiscoveryCallback callback; + EStorage *storage; + void *data; + char *path; +}; + +static void +async_open_cb (BonoboListener *listener, const char *event_name, + const CORBA_any *any, CORBA_Environment *ev, + gpointer user_data) { - gpointer *pair = data; + struct async_open_closure *closure = user_data; + GNOME_Evolution_Storage_Result *corba_result; + EStorageResult result; + + corba_result = any->_value; + result = e_corba_storage_corba_result_to_storage_result (*corba_result); + + (* closure->callback) (closure->storage, result, closure->path, closure->data); - EStorage *storage = pair[0]; - char *path = pair[1]; + bonobo_object_unref (BONOBO_OBJECT (listener)); + g_free (closure->path); + g_free (closure); +} +static gboolean +async_open_folder_idle (gpointer data) +{ + struct async_open_closure *closure = data; + EStorage *storage = closure->storage; ECorbaStorage *corba_storage; + BonoboListener *listener; + Bonobo_Listener corba_listener; CORBA_Environment ev; corba_storage = E_CORBA_STORAGE (storage); - - if (corba_storage->priv != NULL) { - - CORBA_exception_init (&ev); - GNOME_Evolution_Storage_asyncOpenFolder (corba_storage->priv->storage_interface, - path, &ev); - CORBA_exception_free (&ev); + if (corba_storage->priv == NULL) { + (* closure->callback) (storage, E_STORAGE_GENERICERROR, + closure->path, closure->data); + g_free (closure->path); + g_free (closure); + return FALSE; } - g_object_unref (storage); - g_free (path); - g_free (pair); + listener = bonobo_listener_new (async_open_cb, closure); + corba_listener = bonobo_object_corba_objref (BONOBO_OBJECT (listener)); + CORBA_exception_init (&ev); + GNOME_Evolution_Storage_asyncOpenFolder (corba_storage->priv->storage_interface, + closure->path, corba_listener, &ev); + if (ev._major != CORBA_NO_EXCEPTION) { + (* closure->callback) (storage, E_STORAGE_GENERICERROR, + closure->path, closure->data); + bonobo_object_unref (BONOBO_OBJECT (listener)); + g_free (closure->path); + g_free (closure); + } + CORBA_exception_free (&ev); return FALSE; } static void async_open_folder (EStorage *storage, - const char *path) + const char *path, + EStorageDiscoveryCallback callback, + void *data) { - gpointer *pair = g_new (gpointer, 2); - pair[0] = storage; - g_object_ref (storage); - pair[1] = g_strdup (path); + struct async_open_closure *closure; + + closure = g_new (struct async_open_closure, 1); + closure->callback = callback; + closure->storage = storage; + closure->data = data; + closure->path = g_strdup (path); - g_idle_add (async_open_folder_idle, pair); + g_idle_add (async_open_folder_idle, closure); } diff --git a/shell/e-shell-marshal.list b/shell/e-shell-marshal.list index 6ff6579189..027a53e725 100644 --- a/shell/e-shell-marshal.list +++ b/shell/e-shell-marshal.list @@ -12,6 +12,7 @@ NONE:POINTER,POINTER,POINTER NONE:POINTER,POINTER,POINTER,BOOL NONE:POINTER,POINTER,POINTER,POINTER NONE:POINTER,POINTER,POINTER,POINTER,POINTER +NONE:POINTER,STRING NONE:POINTER,STRING,BOOL NONE:POINTER,STRING,STRING NONE:POINTER,STRING,STRING,BOOL diff --git a/shell/e-storage-set.c b/shell/e-storage-set.c index ffc8755bf5..2978ea7572 100644 --- a/shell/e-storage-set.c +++ b/shell/e-storage-set.c @@ -246,21 +246,6 @@ storage_removed_folder_cb (EStorage *storage, g_free (full_path); } -static void -storage_close_folder_cb (EStorage *storage, - const char *path, - void *data) -{ - EStorageSet *storage_set; - char *full_path; - - storage_set = E_STORAGE_SET (data); - - full_path = make_full_path (storage, path); - g_signal_emit (storage_set, signals[CLOSE_FOLDER], 0, full_path); - g_free (full_path); -} - static EStorage * get_storage_for_path (EStorageSet *storage_set, @@ -549,8 +534,6 @@ e_storage_set_add_storage (EStorageSet *storage_set, G_CALLBACK (storage_updated_folder_cb), storage_set); g_signal_connect (storage, "removed_folder", G_CALLBACK (storage_removed_folder_cb), storage_set); - g_signal_connect (storage, "close_folder", - G_CALLBACK (storage_close_folder_cb), storage_set); priv->storages = g_list_append (priv->storages, storage); @@ -663,6 +646,19 @@ e_storage_set_get_folder (EStorageSet *storage_set, } +static void +async_open_cb (EStorage *storage, EStorageResult result, + const char *path, gpointer storage_set) +{ + if (result != E_STORAGE_OK) { + char *full_path; + + full_path = make_full_path (storage, path); + g_signal_emit (storage_set, signals[CLOSE_FOLDER], 0, full_path); + g_free (full_path); + } +} + static void storage_set_view_folder_opened (EStorageSetView *storage_set_view, const char *path, @@ -675,7 +671,8 @@ storage_set_view_folder_opened (EStorageSetView *storage_set_view, if (storage == NULL) return; - e_storage_async_open_folder (storage, subpath); + e_storage_async_open_folder (storage, subpath, + async_open_cb, storage_set); } GtkWidget * diff --git a/shell/e-storage.c b/shell/e-storage.c index d311135fe1..6825485f9d 100644 --- a/shell/e-storage.c +++ b/shell/e-storage.c @@ -64,7 +64,6 @@ enum { NEW_FOLDER, UPDATED_FOLDER, REMOVED_FOLDER, - CLOSE_FOLDER, LAST_SIGNAL }; @@ -229,9 +228,11 @@ impl_async_xfer_folder (EStorage *storage, static void impl_async_open_folder (EStorage *storage, - const char *path) + const char *path, + EStorageDiscoveryCallback callback, + void *data) { - ; + (*callback) (storage, E_STORAGE_NOTIMPLEMENTED, path, data); } static gboolean @@ -311,15 +312,6 @@ class_init (EStorageClass *class) e_shell_marshal_NONE__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); - signals[CLOSE_FOLDER] = - g_signal_new ("close_folder", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EStorageClass, close_folder), - NULL, NULL, - e_shell_marshal_NONE__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); } static void @@ -498,17 +490,21 @@ e_storage_async_xfer_folder (EStorage *storage, void e_storage_async_open_folder (EStorage *storage, - const char *path) + const char *path, + EStorageDiscoveryCallback callback, + void *data) { g_return_if_fail (storage != NULL); g_return_if_fail (E_IS_STORAGE (storage)); g_return_if_fail (path != NULL); g_return_if_fail (g_path_is_absolute (path)); - if (g_hash_table_lookup (storage->priv->pseudofolders, path) == NULL) + if (g_hash_table_lookup (storage->priv->pseudofolders, path) == NULL) { + (* callback) (storage, E_STORAGE_OK, path, data); return; + } - (* ES_CLASS (storage)->async_open_folder) (storage, path); + (* ES_CLASS (storage)->async_open_folder) (storage, path, callback, data); } @@ -742,8 +738,6 @@ e_storage_has_subfolders (EStorage *storage, priv = storage->priv; - g_signal_emit (storage, signals[CLOSE_FOLDER], 0, path); - if (g_hash_table_lookup (priv->pseudofolders, path)) return TRUE; diff --git a/shell/e-storage.h b/shell/e-storage.h index 31d2ff7c1a..e7793b8c90 100644 --- a/shell/e-storage.h +++ b/shell/e-storage.h @@ -112,7 +112,9 @@ struct _EStorageClass { void *data); void (* async_open_folder) (EStorage *storage, - const char *path); + const char *path, + EStorageDiscoveryCallback callback, + void *data); gboolean (* supports_shared_folders) (EStorage *storage); void (* async_discover_shared_folder) (EStorage *storage, @@ -165,8 +167,10 @@ void e_storage_async_xfer_folder (EStorage *storage, const gboolean remove_source, EStorageResultCallback callback, void *data); -void e_storage_async_open_folder (EStorage *storage, - const char *path); +void e_storage_async_open_folder (EStorage *storage, + const char *path, + EStorageDiscoveryCallback callback, + void *data); const char *e_storage_result_to_string (EStorageResult result); diff --git a/shell/evolution-storage.c b/shell/evolution-storage.c index 0b349e6319..aa11130911 100644 --- a/shell/evolution-storage.c +++ b/shell/evolution-storage.c @@ -453,16 +453,19 @@ impl_Storage_updateFolder (PortableServer_Servant servant, static void impl_Storage_asyncOpenFolder (PortableServer_Servant servant, const CORBA_char *path, + Bonobo_Listener listener, CORBA_Environment *ev) { BonoboObject *bonobo_object; EvolutionStorage *storage; + CORBA_Object obj_dup; bonobo_object = bonobo_object_from_servant (servant); storage = EVOLUTION_STORAGE (bonobo_object); + obj_dup = CORBA_Object_duplicate (listener, ev); g_signal_emit (storage, signals[OPEN_FOLDER], 0, - path); + obj_dup, path); } static void @@ -762,8 +765,9 @@ evolution_storage_class_init (EvolutionStorageClass *klass) G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (EvolutionStorageClass, open_folder), NULL, NULL, - e_shell_marshal_NONE__STRING, - G_TYPE_NONE, 1, + e_shell_marshal_NONE__POINTER_STRING, + G_TYPE_NONE, 2, + G_TYPE_POINTER, G_TYPE_STRING); signals[DISCOVER_SHARED_FOLDER] diff --git a/shell/evolution-storage.h b/shell/evolution-storage.h index 6d9fa78330..209f43a339 100644 --- a/shell/evolution-storage.h +++ b/shell/evolution-storage.h @@ -104,6 +104,7 @@ struct _EvolutionStorageClass { gboolean remove_source); void (*open_folder) (EvolutionStorage *storage, + const Bonobo_Listener listener, const char *path); void (*update_folder) (EvolutionStorage *storage, -- cgit v1.2.3