diff options
-rw-r--r-- | shell/ChangeLog | 18 | ||||
-rw-r--r-- | shell/Evolution-Storage.idl | 9 | ||||
-rw-r--r-- | shell/evolution-storage.c | 81 |
3 files changed, 101 insertions, 7 deletions
diff --git a/shell/ChangeLog b/shell/ChangeLog index 10af81fa5d..6a5bda5196 100644 --- a/shell/ChangeLog +++ b/shell/ChangeLog @@ -1,3 +1,21 @@ +2000-10-02 Ettore Perazzoli <ettore@helixcode.com> + + * evolution-storage.c (find_listener_in_list): New helper + function. + (impl_Storage_remove_listener): New, implementation for + `Storage::remove_listener'. + (remove_listener): Helper function for + `impl_Storage_remove_listener'. + (evolution_storage_get_epv): Install the implementation for + `::remove_listener'. + (add_listener): Return a boolean indicating success or failure. + Reject multiple additions of the same listener. + (impl_Storage_add_listener): Updated accordingly: raise an + exception if `add_listener' fails. + + * Evolution-Storage.idl: Added `Storage::remove_listener'. Added + exception `AlreadyListening' for `::add_listener'. + 2000-09-29 Ettore Perazzoli <ettore@helixcode.com> * e-shell-view.c (popup_storage_set_view_button_clicked): Renamed diff --git a/shell/Evolution-Storage.idl b/shell/Evolution-Storage.idl index 0a2402a773..42fc043047 100644 --- a/shell/Evolution-Storage.idl +++ b/shell/Evolution-Storage.idl @@ -22,11 +22,16 @@ module Evolution { interface StorageListener; interface Storage : Bonobo::Unknown { + exception AlreadyListening {}; + exception NotFound {}; + attribute string name; - void add_listener (in StorageListener listener); + void add_listener (in StorageListener listener) + raises (AlreadyListening); - /* FIXME remove_listener? */ + void remove_listener (in StorageListener listener) + raises (NotFound); }; interface StorageListener { diff --git a/shell/evolution-storage.c b/shell/evolution-storage.c index 1561c48242..4d271cefa8 100644 --- a/shell/evolution-storage.c +++ b/shell/evolution-storage.c @@ -86,7 +86,30 @@ list_through_listener (EvolutionStorage *storage, listener); } -static void +static GList * +find_listener_in_list (const Evolution_StorageListener listener, + GList *list) +{ + CORBA_Environment ev; + GList *p; + + CORBA_exception_init (&ev); + + for (p = list; p != NULL; p = p->next) { + Evolution_StorageListener listener_item; + + listener_item = (Evolution_StorageListener) p->data; + + if (CORBA_Object_is_equivalent (listener_item, listener, &ev) && ev._major == CORBA_NO_EXCEPTION) + return p; + } + + CORBA_exception_free (&ev); + + return NULL; +} + +static gboolean add_listener (EvolutionStorage *storage, const Evolution_StorageListener listener) { @@ -96,6 +119,9 @@ add_listener (EvolutionStorage *storage, priv = storage->priv; + if (find_listener_in_list (listener, priv->corba_storage_listeners) != NULL) + return FALSE; + CORBA_exception_init (&ev); listener_copy = CORBA_Object_duplicate (listener, &ev); @@ -103,7 +129,10 @@ add_listener (EvolutionStorage *storage, /* Panic. */ g_warning ("EvolutionStorage -- Cannot duplicate listener."); CORBA_exception_free (&ev); - return; + + /* FIXME this will cause the ::add_listener implementation to + incorrectly raise `AlreadyListening' */ + return FALSE; } priv->corba_storage_listeners = g_list_prepend (priv->corba_storage_listeners, @@ -112,6 +141,31 @@ add_listener (EvolutionStorage *storage, list_through_listener (storage, listener_copy, &ev); CORBA_exception_free (&ev); + + return TRUE; +} + +static gboolean +remove_listener (EvolutionStorage *storage, + const Evolution_StorageListener listener) +{ + EvolutionStoragePrivate *priv; + CORBA_Environment ev; + GList *p; + + priv = storage->priv; + + p = find_listener_in_list (listener, priv->corba_storage_listeners); + if (p == NULL) + return FALSE; + + CORBA_exception_init (&ev); + CORBA_Object_release ((CORBA_Object) p->data, &ev); + CORBA_exception_free (&ev); + + priv->corba_storage_listeners = g_list_remove_link (priv->corba_storage_listeners, p); + + return TRUE; } @@ -183,7 +237,23 @@ impl_Storage_add_listener (PortableServer_Servant servant, bonobo_object = bonobo_object_from_servant (servant); storage = EVOLUTION_STORAGE (bonobo_object); - add_listener (storage, listener); + if (! add_listener (storage, listener)) + CORBA_exception_set (ev, CORBA_USER_EXCEPTION, ex_Evolution_Storage_AlreadyListening, NULL); +} + +static void +impl_Storage_remove_listener (PortableServer_Servant servant, + const Evolution_StorageListener listener, + CORBA_Environment *ev) +{ + BonoboObject *bonobo_object; + EvolutionStorage *storage; + + bonobo_object = bonobo_object_from_servant (servant); + storage = EVOLUTION_STORAGE (bonobo_object); + + if (! remove_listener (storage, listener)) + CORBA_exception_set (ev, CORBA_USER_EXCEPTION, ex_Evolution_Storage_NotFound, NULL); } @@ -278,8 +348,9 @@ evolution_storage_get_epv (void) POA_Evolution_Storage__epv *epv; epv = g_new0 (POA_Evolution_Storage__epv, 1); - epv->_get_name = impl_Storage__get_name; - epv->add_listener = impl_Storage_add_listener; + epv->_get_name = impl_Storage__get_name; + epv->add_listener = impl_Storage_add_listener; + epv->remove_listener = impl_Storage_remove_listener; return epv; } |