diff options
author | Ettore Perazzoli <ettore@src.gnome.org> | 2000-05-23 18:15:30 +0800 |
---|---|---|
committer | Ettore Perazzoli <ettore@src.gnome.org> | 2000-05-23 18:15:30 +0800 |
commit | d00e525efc8be034cd2009100258680a62a87202 (patch) | |
tree | 7bd885b5dc38cc1ca530f400aa58943ef39a0211 | |
parent | 84844abe322120292b1d2e0e8978046e1c550bfe (diff) | |
download | gsoc2013-evolution-d00e525efc8be034cd2009100258680a62a87202.tar gsoc2013-evolution-d00e525efc8be034cd2009100258680a62a87202.tar.gz gsoc2013-evolution-d00e525efc8be034cd2009100258680a62a87202.tar.bz2 gsoc2013-evolution-d00e525efc8be034cd2009100258680a62a87202.tar.lz gsoc2013-evolution-d00e525efc8be034cd2009100258680a62a87202.tar.xz gsoc2013-evolution-d00e525efc8be034cd2009100258680a62a87202.tar.zst gsoc2013-evolution-d00e525efc8be034cd2009100258680a62a87202.zip |
Get rid of the old `evolution-service-repository' cruft and start
implementing new CORBA storage interfaces for the shell.
svn path=/trunk/; revision=3178
-rw-r--r-- | .cvsignore | 25 | ||||
-rw-r--r-- | mail/ChangeLog | 8 | ||||
-rw-r--r-- | mail/Makefile.am | 1 | ||||
-rw-r--r-- | mail/folder-browser-factory.c | 51 | ||||
-rw-r--r-- | shell/ChangeLog | 36 | ||||
-rw-r--r-- | shell/Evolution-Shell.idl | 18 | ||||
-rw-r--r-- | shell/Evolution-ShellComponent.idl | 17 | ||||
-rw-r--r-- | shell/Evolution-Storage.idl | 53 | ||||
-rw-r--r-- | shell/Evolution.idl | 13 | ||||
-rw-r--r-- | shell/Makefile.am | 18 | ||||
-rw-r--r-- | shell/e-corba-storage-registry.c | 236 | ||||
-rw-r--r-- | shell/e-corba-storage-registry.h | 73 | ||||
-rw-r--r-- | shell/e-corba-storage.c | 349 | ||||
-rw-r--r-- | shell/e-corba-storage.h | 76 | ||||
-rw-r--r-- | shell/e-folder-type-repository.c | 2 | ||||
-rw-r--r-- | shell/e-folder.c | 2 | ||||
-rw-r--r-- | shell/e-shell-view-menu.c | 2 | ||||
-rw-r--r-- | shell/e-shell.c | 113 | ||||
-rw-r--r-- | shell/e-shell.h | 22 | ||||
-rw-r--r-- | shell/e-storage-set.h | 3 | ||||
-rw-r--r-- | shell/e-storage.c | 36 | ||||
-rw-r--r-- | shell/e-storage.h | 13 | ||||
-rw-r--r-- | shell/evolution-service-repository.c | 279 | ||||
-rw-r--r-- | shell/evolution-service-repository.h | 66 | ||||
-rw-r--r-- | shell/evolution-service-repository.idl | 21 |
25 files changed, 1046 insertions, 487 deletions
diff --git a/.cvsignore b/.cvsignore index 2f7f5151f9..94e9b857b3 100644 --- a/.cvsignore +++ b/.cvsignore @@ -1,21 +1,24 @@ +ABOUT-NLS +Makefile Makefile.in aclocal.m4 -configure +config.cache config.guess -config.sub -ltconfig -ltmain.sh +config.h config.h.in config.log -config.h -config.cache -libtool config.status +config.sub +configure +install-sh +intl +libtool +ltconfig +ltmain.sh +missing +mkinstalldirs stamp-h -Makefile -stamp.h stamp-h.in +stamp.h xlibtool xltmain.sh -intl -ABOUT-NLS
\ No newline at end of file diff --git a/mail/ChangeLog b/mail/ChangeLog index d167dbc7b2..d795771850 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,11 @@ +2000-05-23 Ettore Perazzoli <ettore@helixcode.com> + + * Makefile.am: Don't link to `evolution-service-repository.o' + anymore. + + * folder-browser-factory.c: Don't use crufty service-repository + anymore. + 2000-05-21 Ettore Perazzoli <ettore@helixcode.com> * message-list.c (get_message_info): Made static. diff --git a/mail/Makefile.am b/mail/Makefile.am index 700fb60eb6..1fdb0d3e73 100644 --- a/mail/Makefile.am +++ b/mail/Makefile.am @@ -51,7 +51,6 @@ evolution_mail_LDADD = \ ../shell/Evolution-common.o \ ../shell/Evolution-stubs.o \ ../shell/Evolution-skels.o \ - ../shell/evolution-service-repository.o \ ../composer/libcomposer.la \ ../widgets/e-table/libetable.a \ ../widgets/e-text/libetext.a \ diff --git a/mail/folder-browser-factory.c b/mail/folder-browser-factory.c index e46e51df52..de9d9ff06e 100644 --- a/mail/folder-browser-factory.c +++ b/mail/folder-browser-factory.c @@ -18,7 +18,6 @@ #include "folder-browser.h" #include "mail.h" #include "shell/Evolution.h" -#include "shell/evolution-service-repository.h" #ifdef USING_OAF #define CONTROL_FACTORY_ID "OAFIID:control-factory:evolution-mail:25902062-543b-4f44-8702-d90145fcdbf2" @@ -27,49 +26,6 @@ #endif static void -folder_browser_set_shell (EvolutionServiceRepository *sr, - Evolution_Shell shell, - void *closure) -{ - FolderBrowser *folder_browser; - CORBA_Environment ev; - - g_return_if_fail (closure); - g_return_if_fail (IS_FOLDER_BROWSER (closure)); - g_return_if_fail (shell != CORBA_OBJECT_NIL); - - CORBA_exception_init (&ev); - - folder_browser = FOLDER_BROWSER (closure); - - folder_browser->shell = shell; - - /* test the component->shell registration */ - Evolution_Shell_register_service (shell, Evolution_Shell_MAIL_STORE, "a_service", &ev); - - CORBA_exception_free (&ev); -} - -static void -folder_browser_control_add_service_repository_interface (BonoboControl *control, - GtkWidget *folder_browser) -{ - EvolutionServiceRepository *sr; - - /* - * create an implementation for the Evolution::ServiceRepository - * interface - */ - sr = evolution_service_repository_new (folder_browser_set_shell, - (void *)folder_browser); - - /* add the interface to the control */ - bonobo_object_add_interface (BONOBO_OBJECT (control), - BONOBO_OBJECT (sr)); -} - - -static void random_cb (GtkWidget *button, gpointer user_data) { printf ("Yow! I am called back!\n"); @@ -204,13 +160,6 @@ folder_browser_factory (BonoboGenericFactory *factory, void *closure) bonobo_control_set_property_bag (control, FOLDER_BROWSER (folder_browser)->properties); - /* for the moment, the control has the ability to register - * some services itself, but this should not last. - * - * It's not the way to do it, but we don't have the - * correct infrastructure in the shell now. - */ - folder_browser_control_add_service_repository_interface (control, folder_browser); return BONOBO_OBJECT (control); } diff --git a/shell/ChangeLog b/shell/ChangeLog index 395510285b..cb23544111 100644 --- a/shell/ChangeLog +++ b/shell/ChangeLog @@ -1,3 +1,39 @@ +2000-05-23 Ettore Perazzoli <ettore@helixcode.com> + + * e-shell.c: New member `corba_storage_registry' in + `EShellPrivate'. + (init): Initialize it to NULL. + (destroy): Unref it if not NULL. + (setup_corba_storages): New function to set up the CORBA storage + registry and `bonobo_object_add_interface()' it to the shell. + (setup_storages): Call it from here. + + * e-shell.h, e-shell.c: Derive EShell from BonoboObject instead of + GtkObject. + + * e-storage.c (e_storage_remove_folder): Return value changed into + `gboolean'; return false if an error occurs, true otherwise. + (e_storage_new_folder): Likewise. + + * e-corba-storage-registry.c: New. + * e-corba-storage-registry.h: New. + + * e-corba-storage.c: New. + * e-corba-storage.h: New. + + * Evolution.idl: Include the new IDLs, but no + `evolution-service-repository.idl' anymore. + + * Evolution-Shell.idl: New. + * Evolution-ShellComponent.idl: New. + * Evolution-Storage.idl: New. + + * evolution-service-repository.idl: Removed. + * evolution-service-repository.c: Removed. + * evolution-service-repository.h: Removed. + + * e-folder-type-repository.c (folder_type_new): Free `icon_path'. + 2000-05-18 Dan Winship <danw@helixcode.com> * main.c (new_view_idle_cb): add development_warning (moved from diff --git a/shell/Evolution-Shell.idl b/shell/Evolution-Shell.idl new file mode 100644 index 0000000000..496fdd8a27 --- /dev/null +++ b/shell/Evolution-Shell.idl @@ -0,0 +1,18 @@ +/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Interface for the Evolution shell. + * + * Authors: + * Ettore Perazzoli <ettore@helixcode.com> + * + * Copyright (C) 2000 Helix Code, Inc. + */ + +#include <Bonobo.idl> + +module Evolution { + interface Shell : Bonobo::Unknown { + /* Nothing for now. */ + void dummy_method (); + }; +}; diff --git a/shell/Evolution-ShellComponent.idl b/shell/Evolution-ShellComponent.idl new file mode 100644 index 0000000000..9a4624010e --- /dev/null +++ b/shell/Evolution-ShellComponent.idl @@ -0,0 +1,17 @@ +/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Interface for the Evolution components. + * + * Authors: + * Ettore Perazzoli <ettore@helixcode.com> + * + * Copyright (C) 2000 Helix Code, Inc. + */ + +#include <Bonobo.h> + +module Evolution { + interface ShellComponent : Bonobo::Unknown { + void set_shell (in Shell shell); + }; +}; diff --git a/shell/Evolution-Storage.idl b/shell/Evolution-Storage.idl new file mode 100644 index 0000000000..d88db2f152 --- /dev/null +++ b/shell/Evolution-Storage.idl @@ -0,0 +1,53 @@ +/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Storage interface for the Evolution shell. + * + * Authors: + * Ettore Perazzoli <ettore@helixcode.com> + * + * Copyright (C) 2000 Helix Code, Inc. + */ + +#include <Bonobo.h> + +module Evolution { + struct Folder { + string type; + string description; + string name; + string physical_uri; + }; + + interface Storage; + interface StorageListener; + + interface Storage : Bonobo::Unknown { + attribute string name; + + void set_listener (in StorageListener storage_listener); + }; + + interface StorageListener { + exception Exists {}; + exception NotFound {}; + + void destroyed (); + + void new_folder (in string path, in Folder folder) + raises (Exists); + + void removed_folder (in string path) + raises (NotFound); + }; + + interface StorageRegistry : Bonobo::Unknown { + exception Exists {}; + exception NotFound {}; + + StorageListener register_storage (in Storage storage, in string name) + raises (Exists); + + void unregister_storage (in string name) + raises (NotFound); + }; +}; diff --git a/shell/Evolution.idl b/shell/Evolution.idl index c9026e2083..80a45eedc1 100644 --- a/shell/Evolution.idl +++ b/shell/Evolution.idl @@ -1,14 +1,15 @@ /* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - /* - * CORBA interface for the Evolution shell + * CORBA interface for the Evolution shell. * * Authors: - * Miguel de Icaza (miguel@kernel.org) + * Ettore Perazzoli <ettore@helixcode.com> * - * (C) 2000 Helix Code, Inc. + * Copyright (C) 2000 Helix Code, Inc. */ + #include <Bonobo.idl> -#include <Shell.idl> -#include <evolution-service-repository.idl> +#include <Evolution-Storage.idl> +#include <Evolution-Shell.idl> +#include <Evolution-ShellComponent.idl> diff --git a/shell/Makefile.am b/shell/Makefile.am index 607d827396..a62fb41abd 100644 --- a/shell/Makefile.am +++ b/shell/Makefile.am @@ -21,8 +21,18 @@ EVOLUTION_CORBA_GENERATED = \ CLEANFILES = $(EVOLUTION_CORBA_GENERATED) +IDLS = \ + Evolution.idl \ + Evolution-Shell.idl \ + Evolution-ShellComponent.idl \ + Evolution-Storage.idl + evolution_SOURCES = \ $(EVOLUTION_CORBA_GENERATED) \ + e-corba-storage.c \ + e-corba-storage.h \ + e-corba-storage-registry.c \ + e-corba-storage-registry.h \ e-folder-type-repository.c \ e-folder-type-repository.h \ e-folder.c \ @@ -54,13 +64,11 @@ evolution_SOURCES = \ e-storage-watcher.h \ e-storage.c \ e-storage.h \ - evolution-service-repository.c \ - evolution-service-repository.h \ main.c Evolution-impl.o: Evolution.h -$(EVOLUTION_CORBA_GENERATED): Evolution.idl evolution-service-repository.idl +$(EVOLUTION_CORBA_GENERATED): $(IDLS) $(ORBIT_IDL) -I$(datadir)/idl -I`$(GNOME_CONFIG) --datadir`/idl -I$(srcdir) $(srcdir)/Evolution.idl evolution_LDADD = \ @@ -70,9 +78,7 @@ evolution_LDADD = \ $(top_builddir)/e-util/libeutil.la \ $(BONOBO_GNOME_LIBS) -EXTRA_DIST = Evolution.idl \ - Shell.idl \ - evolution-service-repository.idl +EXTRA_DIST = $(IDLS) if ENABLE_PURIFY PLINK = $(LIBTOOL) --mode=link $(PURIFY) $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ diff --git a/shell/e-corba-storage-registry.c b/shell/e-corba-storage-registry.c new file mode 100644 index 0000000000..51f845ea38 --- /dev/null +++ b/shell/e-corba-storage-registry.c @@ -0,0 +1,236 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* e-corba-storage-registry.c + * + * Copyright (C) 2000 Helix Code, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Ettore Perazzoli + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "e-util/e-util.h" + +#include "e-corba-storage.h" + +#include "e-corba-storage-registry.h" + + +#define PARENT_TYPE BONOBO_OBJECT_TYPE +static BonoboObjectClass *parent_class = NULL; + +struct _ECorbaStorageRegistryPrivate { + EStorageSet *storage_set; +}; + + +/* CORBA interface implementation. */ + +static POA_Evolution_StorageRegistry__vepv storage_registry_vepv; + +static POA_Evolution_StorageRegistry * +create_servant (void) +{ + POA_Evolution_StorageRegistry *servant; + CORBA_Environment ev; + + servant = (POA_Evolution_StorageRegistry *) g_new0 (BonoboObjectServant, 1); + servant->vepv = &storage_registry_vepv; + + CORBA_exception_init (&ev); + + POA_Evolution_StorageRegistry__init ((PortableServer_Servant) servant, &ev); + if (ev._major != CORBA_NO_EXCEPTION) { + g_free (servant); + CORBA_exception_free (&ev); + return NULL; + } + + CORBA_exception_free (&ev); + + return servant; +} + +static Evolution_StorageListener +impl_StorageRegistry_register_storage (PortableServer_Servant servant, + const Evolution_Storage storage_interface, + const CORBA_char *name, + CORBA_Environment *ev) +{ + BonoboObject *bonobo_object; + ECorbaStorageRegistry *storage_registry; + ECorbaStorageRegistryPrivate *priv; + EStorage *storage; + Evolution_StorageListener listener_interface; + + bonobo_object = bonobo_object_from_servant (servant); + storage_registry = E_CORBA_STORAGE_REGISTRY (bonobo_object); + priv = storage_registry->priv; + + storage = e_corba_storage_new (storage_interface, name); + + /* FIXME check failure. */ + e_storage_set_add_storage (priv->storage_set, storage); + + listener_interface = CORBA_Object_duplicate (e_corba_storage_get_StorageListener + (E_CORBA_STORAGE (storage)), ev); + + return listener_interface; +} + +static void +impl_StorageRegistry_unregister_storage (PortableServer_Servant servant, + const CORBA_char *name, + CORBA_Environment *ev) +{ + BonoboObject *bonobo_object; + ECorbaStorageRegistry *storage_registry; + ECorbaStorageRegistryPrivate *priv; + EStorage *storage; + + bonobo_object = bonobo_object_from_servant (servant); + storage_registry = E_CORBA_STORAGE_REGISTRY (bonobo_object); + priv = storage_registry->priv; + + storage = e_storage_set_get_storage (priv->storage_set, name); + if (storage == NULL) { + CORBA_exception_set (ev, CORBA_USER_EXCEPTION, + ex_Evolution_StorageRegistry_NotFound, + NULL); + return; + } + + /* FIXME: Yucky to get the storage by name and then remove it. */ + /* FIXME: Check failure. */ + e_storage_set_remove_storage (priv->storage_set, storage); +} + + +/* GtkObject methods. */ + +static void +destroy (GtkObject *object) +{ + ECorbaStorageRegistry *corba_storage_registry; + ECorbaStorageRegistryPrivate *priv; + + corba_storage_registry = E_CORBA_STORAGE_REGISTRY (object); + priv = corba_storage_registry->priv; + + if (priv->storage_set != NULL) + gtk_object_unref (GTK_OBJECT (priv->storage_set)); + g_free (priv); + + (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); +} + + +/* Initialization. */ + +static void +corba_class_init (void) +{ + POA_Evolution_StorageRegistry__vepv *vepv; + POA_Evolution_StorageRegistry__epv *epv; + PortableServer_ServantBase__epv *base_epv; + + base_epv = g_new0 (PortableServer_ServantBase__epv, 1); + base_epv->_private = NULL; + base_epv->finalize = NULL; + base_epv->default_POA = NULL; + + epv = g_new0 (POA_Evolution_StorageRegistry__epv, 1); + epv->register_storage = impl_StorageRegistry_register_storage; + epv->unregister_storage = impl_StorageRegistry_unregister_storage; + + vepv = &storage_registry_vepv; + vepv->_base_epv = base_epv; + vepv->Evolution_StorageRegistry_epv = epv; +} + +static void +class_init (ECorbaStorageRegistryClass *klass) +{ + GtkObjectClass *object_class; + + object_class = GTK_OBJECT_CLASS (klass); + object_class->destroy = destroy; + + parent_class = gtk_type_class (PARENT_TYPE); + + corba_class_init (); +} + +static void +init (ECorbaStorageRegistry *corba_storage_registry) +{ + ECorbaStorageRegistryPrivate *priv; + + priv = g_new (ECorbaStorageRegistryPrivate, 1); + priv->storage_set = NULL; + + corba_storage_registry->priv = priv; +} + + +void +e_corba_storage_registry_construct (ECorbaStorageRegistry *corba_storage_registry, + Evolution_StorageRegistry corba_object, + EStorageSet *storage_set) +{ + ECorbaStorageRegistryPrivate *priv; + + g_return_if_fail (corba_storage_registry != NULL); + g_return_if_fail (E_IS_CORBA_STORAGE_REGISTRY (corba_storage_registry)); + g_return_if_fail (corba_object != CORBA_OBJECT_NIL); + + bonobo_object_construct (BONOBO_OBJECT (corba_storage_registry), corba_object); + + priv = corba_storage_registry->priv; + + gtk_object_ref (GTK_OBJECT (storage_set)); + priv->storage_set = storage_set; +} + +ECorbaStorageRegistry * +e_corba_storage_registry_new (EStorageSet *storage_set) +{ + ECorbaStorageRegistry *corba_storage_registry; + POA_Evolution_StorageRegistry *servant; + Evolution_StorageRegistry corba_object; + + g_return_val_if_fail (storage_set != NULL, NULL); + g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), NULL); + + servant = create_servant (); + if (servant == NULL) + return NULL; + + corba_storage_registry = gtk_type_new (e_corba_storage_registry_get_type ()); + + corba_object = bonobo_object_activate_servant (BONOBO_OBJECT (corba_storage_registry), + servant); + + e_corba_storage_registry_construct (corba_storage_registry, corba_object, storage_set); + + return corba_storage_registry; +} + + +E_MAKE_TYPE (e_corba_storage_registry, "ECorbaStorageRegistry", ECorbaStorageRegistry, class_init, init, PARENT_TYPE) diff --git a/shell/e-corba-storage-registry.h b/shell/e-corba-storage-registry.h new file mode 100644 index 0000000000..baf689c551 --- /dev/null +++ b/shell/e-corba-storage-registry.h @@ -0,0 +1,73 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* e-corba-storage-registry.h + * + * Copyright (C) 2000 Helix Code, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Ettore Perazzoli + */ + +#ifndef __E_CORBA_STORAGE_REGISTRY_H__ +#define __E_CORBA_STORAGE_REGISTRY_H__ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <bonobo/bonobo-object.h> + +#include "Evolution.h" +#include "e-storage-set.h" + +#ifdef __cplusplus +extern "C" { +#pragma } +#endif /* __cplusplus */ + +#define E_TYPE_CORBA_STORAGE_REGISTRY (e_corba_storage_registry_get_type ()) +#define E_CORBA_STORAGE_REGISTRY(obj) (GTK_CHECK_CAST ((obj), E_TYPE_CORBA_STORAGE_REGISTRY, ECorbaStorageRegistry)) +#define E_CORBA_STORAGE_REGISTRY_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_CORBA_STORAGE_REGISTRY, ECorbaStorageRegistryClass)) +#define E_IS_CORBA_STORAGE_REGISTRY(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_CORBA_STORAGE_REGISTRY)) +#define E_IS_CORBA_STORAGE_REGISTRY_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_CORBA_STORAGE_REGISTRY)) + + +typedef struct _ECorbaStorageRegistry ECorbaStorageRegistry; +typedef struct _ECorbaStorageRegistryPrivate ECorbaStorageRegistryPrivate; +typedef struct _ECorbaStorageRegistryClass ECorbaStorageRegistryClass; + +struct _ECorbaStorageRegistry { + BonoboObject parent; + + ECorbaStorageRegistryPrivate *priv; +}; + +struct _ECorbaStorageRegistryClass { + BonoboObjectClass parent_class; +}; + + +GtkType e_corba_storage_registry_get_type (void); +void e_corba_storage_registry_construct (ECorbaStorageRegistry *corba_storage_registry, + Evolution_StorageRegistry corba_object, + EStorageSet *storage_set); +ECorbaStorageRegistry *e_corba_storage_registry_new (EStorageSet *storage_set); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __E_CORBA_STORAGE_REGISTRY_H__ */ diff --git a/shell/e-corba-storage.c b/shell/e-corba-storage.c new file mode 100644 index 0000000000..4048a6d272 --- /dev/null +++ b/shell/e-corba-storage.c @@ -0,0 +1,349 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* e-corba-storage.c + * + * Copyright (C) 2000 Helix Code, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Ettore Perazzoli + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <bonobo.h> + +#include "e-util/e-util.h" + +#include "Evolution.h" + +#include "e-corba-storage.h" + + +#define PARENT_TYPE E_TYPE_STORAGE +static EStorageClass *parent_class = NULL; + +typedef struct _StorageListenerServant StorageListenerServant; + +struct _ECorbaStoragePrivate { + char *name; + + Evolution_Storage storage_interface; + + /* The Evolution::StorageListener interface we expose. */ + + Evolution_StorageListener storage_listener_interface; + StorageListenerServant *storage_listener_servant; +}; + + +/* Implementation of the CORBA Evolution::StorageListener interface. */ + +static POA_Evolution_StorageListener__vepv storage_listener_vepv; + +struct _StorageListenerServant { + POA_Evolution_StorageListener servant; + EStorage *storage; +}; + +static StorageListenerServant * +storage_listener_servant_new (ECorbaStorage *corba_storage) +{ + StorageListenerServant *servant; + + servant = g_new0 (StorageListenerServant, 1); + + servant->servant.vepv = &storage_listener_vepv; + + gtk_object_ref (GTK_OBJECT (corba_storage)); + servant->storage = E_STORAGE (corba_storage); + + return servant; +} + +static void +storage_listener_servant_free (StorageListenerServant *servant) +{ + gtk_object_unref (GTK_OBJECT (servant->storage)); + + g_free (servant); +} + +#if 0 +static void +impl_StorageListener_destroy (PortableServer_Servant servant, + CORBA_Environment *ev) +{ + /* FIXME */ +} +#endif + +static void +impl_StorageListener_new_folder (PortableServer_Servant servant, + const CORBA_char *path, + const Evolution_Folder *folder, + CORBA_Environment *ev) +{ + StorageListenerServant *storage_listener_servant; + EStorage *storage; + EFolder *e_folder; + + storage_listener_servant = (StorageListenerServant *) servant; + storage = storage_listener_servant->storage; + + e_folder = e_folder_new (folder->name, + folder->type, + folder->description); + + if (! e_storage_new_folder (storage, path, e_folder)) { + CORBA_exception_set (ev, + CORBA_USER_EXCEPTION, + ex_Evolution_StorageListener_Exists, + NULL); + gtk_object_unref (GTK_OBJECT (e_folder)); + } +} + +static void +impl_StorageListener_removed_folder (PortableServer_Servant servant, + const CORBA_char *path, + CORBA_Environment *ev) +{ + StorageListenerServant *storage_listener_servant; + EStorage *storage; + + storage_listener_servant = (StorageListenerServant *) servant; + storage = storage_listener_servant->storage; + + if (! e_storage_remove_folder (storage, path)) + CORBA_exception_set (ev, + CORBA_USER_EXCEPTION, + ex_Evolution_StorageListener_NotFound, + NULL); +} + + +static gboolean +setup_storage_listener (ECorbaStorage *corba_storage) +{ + StorageListenerServant *servant; + ECorbaStoragePrivate *priv; + Evolution_StorageListener storage_listener_interface; + CORBA_Environment ev; + + priv = corba_storage->priv; + + servant = storage_listener_servant_new (corba_storage); + + CORBA_exception_init (&ev); + + POA_Evolution_StorageListener__init (servant, &ev); + if (ev._major != CORBA_NO_EXCEPTION) + goto error; + + CORBA_free (PortableServer_POA_activate_object (bonobo_poa (), servant, &ev)); + if (ev._major != CORBA_NO_EXCEPTION) + goto error; + + storage_listener_interface = PortableServer_POA_servant_to_reference (bonobo_poa (), + servant, &ev); + if (ev._major != CORBA_NO_EXCEPTION) + goto error; + + priv->storage_listener_interface = storage_listener_interface; + priv->storage_listener_servant = servant; + + return TRUE; + + error: + storage_listener_servant_free (servant); + CORBA_exception_free (&ev); + return FALSE; +} + + +/* GtkObject methods. */ + +static void +destroy (GtkObject *object) +{ + CORBA_Environment ev; + ECorbaStorage *corba_storage; + ECorbaStoragePrivate *priv; + + corba_storage = E_CORBA_STORAGE (object); + priv = corba_storage->priv; + + g_free (priv->name); + + CORBA_exception_init (&ev); + + if (priv->storage_interface != CORBA_OBJECT_NIL) { + Bonobo_Unknown_unref (priv->storage_interface, &ev); + CORBA_Object_release (priv->storage_interface, &ev); + } + + if (priv->storage_listener_interface != CORBA_OBJECT_NIL) + CORBA_Object_release (priv->storage_listener_interface, &ev); + + if (priv->storage_listener_servant != NULL) { + PortableServer_ObjectId *object_id; + + object_id = PortableServer_POA_servant_to_id (bonobo_poa (), priv->storage_listener_servant, + &ev); + PortableServer_POA_deactivate_object (bonobo_poa (), object_id, &ev); + + POA_Evolution_StorageListener__fini (priv->storage_listener_servant, &ev); + CORBA_free (object_id); + } + + CORBA_exception_free (&ev); + + g_free (priv); + + (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); +} + + +/* EStorage methods. */ + +static const char * +get_name (EStorage *storage) +{ + ECorbaStorage *corba_storage; + ECorbaStoragePrivate *priv; + + corba_storage = E_CORBA_STORAGE (storage); + priv = corba_storage->priv; + + return priv->name; +} + + +static void +corba_class_init (void) +{ + POA_Evolution_StorageListener__vepv *vepv; + POA_Evolution_StorageListener__epv *epv; + PortableServer_ServantBase__epv *base_epv; + + base_epv = g_new0 (PortableServer_ServantBase__epv, 1); + base_epv->_private = NULL; + base_epv->finalize = NULL; + base_epv->default_POA = NULL; + + epv = g_new0 (POA_Evolution_StorageListener__epv, 1); + epv->new_folder = impl_StorageListener_new_folder; + epv->removed_folder = impl_StorageListener_removed_folder; + + vepv = &storage_listener_vepv; + vepv->_base_epv = base_epv; + vepv->Evolution_StorageListener_epv = epv; +} + +static void +class_init (ECorbaStorageClass *klass) +{ + GtkObjectClass *object_class; + EStorageClass *storage_class; + + object_class = GTK_OBJECT_CLASS (klass); + object_class->destroy = destroy; + + storage_class = E_STORAGE_CLASS (klass); + storage_class->get_name = get_name; + + corba_class_init (); + + parent_class = gtk_type_class (PARENT_TYPE); +} + +static void +init (ECorbaStorage *corba_storage) +{ + ECorbaStoragePrivate *priv; + + priv = g_new (ECorbaStoragePrivate, 1); + priv->name = NULL; + priv->storage_interface = CORBA_OBJECT_NIL; + + corba_storage->priv = priv; +} + + +/* FIXME: OK to have a boolean construct function? */ +void +e_corba_storage_construct (ECorbaStorage *corba_storage, + const Evolution_Storage storage_interface, + const char *name) +{ + ECorbaStoragePrivate *priv; + CORBA_Environment ev; + + g_return_if_fail (corba_storage != NULL); + g_return_if_fail (E_IS_CORBA_STORAGE (corba_storage)); + g_return_if_fail (storage_interface != CORBA_OBJECT_NIL); + g_return_if_fail (name != NULL); + + e_storage_construct (E_STORAGE (corba_storage)); + + priv = corba_storage->priv; + + priv->name = g_strdup (name); + + CORBA_exception_init (&ev); + + Bonobo_Unknown_ref (storage_interface, &ev); + if (ev._major != CORBA_NO_EXCEPTION) { + g_warning ("%s -- Cannot reference Bonobo object", __FUNCTION__); + } else { + priv->storage_interface = CORBA_Object_duplicate (storage_interface, &ev); + } + + CORBA_exception_free (&ev); + + setup_storage_listener (corba_storage); +} + +EStorage * +e_corba_storage_new (const Evolution_Storage storage_interface, + const char *name) +{ + EStorage *new; + + g_return_val_if_fail (storage_interface != CORBA_OBJECT_NIL, NULL); + g_return_val_if_fail (name != NULL, NULL); + + new = gtk_type_new (e_corba_storage_get_type ()); + + e_corba_storage_construct (E_CORBA_STORAGE (new), storage_interface, name); + + return new; +} + + +const Evolution_StorageListener +e_corba_storage_get_StorageListener (ECorbaStorage *corba_storage) +{ + g_return_val_if_fail (corba_storage != NULL, NULL); + g_return_val_if_fail (E_IS_CORBA_STORAGE (corba_storage), NULL); + + return corba_storage->priv->storage_listener_interface; +} + + +E_MAKE_TYPE (e_corba_storage, "ECorbaStorage", ECorbaStorage, class_init, init, PARENT_TYPE) diff --git a/shell/e-corba-storage.h b/shell/e-corba-storage.h new file mode 100644 index 0000000000..99ab23e97e --- /dev/null +++ b/shell/e-corba-storage.h @@ -0,0 +1,76 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* e-corba-storage.h + * + * Copyright (C) 2000 Helix Code, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Ettore Perazzoli + */ + +#ifndef __E_CORBA_STORAGE_H__ +#define __E_CORBA_STORAGE_H__ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "e-storage.h" + +#include "Evolution.h" + +#ifdef __cplusplus +extern "C" { +#pragma } +#endif /* __cplusplus */ + +#define E_TYPE_CORBA_STORAGE (e_corba_storage_get_type ()) +#define E_CORBA_STORAGE(obj) (GTK_CHECK_CAST ((obj), E_TYPE_CORBA_STORAGE, ECorbaStorage)) +#define E_CORBA_STORAGE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_CORBA_STORAGE, ECorbaStorageClass)) +#define E_IS_CORBA_STORAGE(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_CORBA_STORAGE)) +#define E_IS_CORBA_STORAGE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_CORBA_STORAGE)) + + +typedef struct _ECorbaStorage ECorbaStorage; +typedef struct _ECorbaStoragePrivate ECorbaStoragePrivate; +typedef struct _ECorbaStorageClass ECorbaStorageClass; + +struct _ECorbaStorage { + EStorage parent; + + ECorbaStoragePrivate *priv; +}; + +struct _ECorbaStorageClass { + EStorageClass parent_class; +}; + + +GtkType e_corba_storage_get_type (void); +void e_corba_storage_construct (ECorbaStorage *corba_storage, + const Evolution_Storage storage_interface, + const char *name); +EStorage *e_corba_storage_new (const Evolution_Storage storage_interface, + const char *name); + +/* FIXME: I don't like this call. */ +const Evolution_StorageListener e_corba_storage_get_StorageListener (ECorbaStorage *corba_storage); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __E_CORBA_STORAGE_H__ */ diff --git a/shell/e-folder-type-repository.c b/shell/e-folder-type-repository.c index 3170f3173e..a1892657de 100644 --- a/shell/e-folder-type-repository.c +++ b/shell/e-folder-type-repository.c @@ -89,6 +89,8 @@ folder_type_new (const char *name, else new->icon_pixbuf = gdk_pixbuf_new_from_file (icon_path); + g_free (icon_path); + icon_path = e_shell_get_icon_path (icon_name, TRUE); if (icon_path != NULL) { new->mini_icon_pixbuf = gdk_pixbuf_new_from_file (icon_path); diff --git a/shell/e-folder.c b/shell/e-folder.c index c5be881180..722e865499 100644 --- a/shell/e-folder.c +++ b/shell/e-folder.c @@ -83,7 +83,7 @@ remove (EFolder *folder) static const char * get_physical_uri (EFolder *folder) { - g_warning ("`%s' does not implement `EFolder::remove()'", + g_warning ("`%s' does not implement `EFolder::get_physical_uri()'", gtk_type_name (GTK_OBJECT_TYPE (folder))); return NULL; } diff --git a/shell/e-shell-view-menu.c b/shell/e-shell-view-menu.c index 42003a1e42..0bdb6e36f3 100644 --- a/shell/e-shell-view-menu.c +++ b/shell/e-shell-view-menu.c @@ -279,7 +279,7 @@ GnomeUIInfo e_shell_view_menu [] = { { GNOME_APP_UI_SUBTREE, N_("_Actions"), NULL, menu_actions }, GNOMEUIINFO_MENU_HELP_TREE (menu_help), -#warning Should provide a help menu here; Bonobo needs it + /* FIXME: Should provide a help menu here; Bonobo needs it. */ GNOMEUIINFO_END }; diff --git a/shell/e-shell.c b/shell/e-shell.c index a0851af27a..19cdcdc596 100644 --- a/shell/e-shell.c +++ b/shell/e-shell.c @@ -28,8 +28,11 @@ #include <gtk/gtkobject.h> #include <gtk/gtktypeutils.h> +#include "Evolution.h" + #include "e-util/e-util.h" +#include "e-corba-storage-registry.h" #include "e-folder-type-repository.h" #include "e-local-storage.h" #include "e-shell-view.h" @@ -39,8 +42,8 @@ #include "e-shell.h" -#define PARENT_TYPE GTK_TYPE_OBJECT -static GtkObjectClass *parent_class = NULL; +#define PARENT_TYPE BONOBO_OBJECT_TYPE +static BonoboObjectClass *parent_class = NULL; struct _EShellPrivate { char *local_directory; @@ -50,6 +53,8 @@ struct _EShellPrivate { EStorageSet *storage_set; EShortcuts *shortcuts; EFolderTypeRepository *folder_type_repository; + + ECorbaStorageRegistry *corba_storage_registry; }; #define SHORTCUTS_FILE_NAME "shortcuts.xml" @@ -63,9 +68,63 @@ enum { static guint signals[LAST_SIGNAL] = { 0 }; +/* CORBA interface implementation. */ + +static POA_Evolution_Shell__vepv shell_vepv; + +static POA_Evolution_Shell * +create_servant (void) +{ + POA_Evolution_Shell *servant; + CORBA_Environment ev; + + servant = (POA_Evolution_Shell *) g_new0 (BonoboObjectServant, 1); + servant->vepv = &shell_vepv; + + CORBA_exception_init (&ev); + + POA_Evolution_Shell__init ((PortableServer_Servant) servant, &ev); + if (ev._major != CORBA_NO_EXCEPTION) { + g_free (servant); + CORBA_exception_free (&ev); + return NULL; + } + + CORBA_exception_free (&ev); + + return servant; +} + +static void +impl_Shell_dummy_method (PortableServer_Servant servant, + CORBA_Environment *ev) +{ + g_print ("Evolution::Shell::dummy_method invoked!\n"); +} + + /* Initialization of the storages. */ static gboolean +setup_corba_storages (EShell *shell) +{ + EShellPrivate *priv; + + priv = shell->priv; + + g_assert (priv->storage_set != NULL); + priv->corba_storage_registry = e_corba_storage_registry_new (priv->storage_set); + + if (priv->corba_storage_registry == NULL) + return FALSE; + + bonobo_object_add_interface (BONOBO_OBJECT (shell), + BONOBO_OBJECT (priv->corba_storage_registry)); + + return TRUE; +} + +static gboolean setup_storages (EShell *shell) { EStorage *local_storage; @@ -89,7 +148,7 @@ setup_storages (EShell *shell) priv->storage_set = e_storage_set_new (shell->priv->folder_type_repository); e_storage_set_add_storage (priv->storage_set, local_storage); - return TRUE; + return setup_corba_storages (shell); } @@ -144,18 +203,43 @@ destroy (GtkObject *object) g_list_free (priv->views); + if (priv->corba_storage_registry != NULL) + bonobo_object_unref (BONOBO_OBJECT (priv->corba_storage_registry)); + g_free (priv); (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); } +/* Initialization. */ + +static void +corba_class_init (void) +{ + POA_Evolution_Shell__vepv *vepv; + POA_Evolution_Shell__epv *epv; + PortableServer_ServantBase__epv *base_epv; + + base_epv = g_new0 (PortableServer_ServantBase__epv, 1); + base_epv->_private = NULL; + base_epv->finalize = NULL; + base_epv->default_POA = NULL; + + epv = g_new0 (POA_Evolution_Shell__epv, 1); + epv->dummy_method = impl_Shell_dummy_method; + + vepv = &shell_vepv; + vepv->Bonobo_Unknown_epv = bonobo_object_get_epv (); + vepv->Evolution_Shell_epv = epv; +} + static void class_init (EShellClass *klass) { GtkObjectClass *object_class; - parent_class = gtk_type_class (gtk_object_get_type ()); + parent_class = gtk_type_class (PARENT_TYPE); object_class = GTK_OBJECT_CLASS (klass); object_class->destroy = destroy; @@ -169,6 +253,8 @@ class_init (EShellClass *klass) GTK_TYPE_NONE, 0); gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); + + corba_class_init (); } static void @@ -184,6 +270,7 @@ init (EShell *shell) priv->storage_set = NULL; priv->shortcuts = NULL; priv->folder_type_repository = NULL; + priv->corba_storage_registry = NULL; shell->priv = priv; } @@ -191,6 +278,7 @@ init (EShell *shell) void e_shell_construct (EShell *shell, + Evolution_Shell corba_object, const char *local_directory) { EShellPrivate *priv; @@ -201,12 +289,11 @@ e_shell_construct (EShell *shell, g_return_if_fail (local_directory != NULL); g_return_if_fail (g_path_is_absolute (local_directory)); - GTK_OBJECT_UNSET_FLAGS (shell, GTK_FLOATING); + bonobo_object_construct (BONOBO_OBJECT (shell), corba_object); priv = shell->priv; priv->local_directory = g_strdup (local_directory); - priv->folder_type_repository = e_folder_type_repository_new (); if (! setup_storages (shell)) @@ -231,14 +318,22 @@ e_shell_new (const char *local_directory) { EShell *new; EShellPrivate *priv; + Evolution_Shell corba_object; + POA_Evolution_Shell *servant; + + servant = create_servant (); + if (servant == NULL) + return NULL; new = gtk_type_new (e_shell_get_type ()); - e_shell_construct (new, local_directory); + + corba_object = bonobo_object_activate_servant (BONOBO_OBJECT (new), servant); + e_shell_construct (new, corba_object, local_directory); priv = new->priv; if (priv->shortcuts == NULL || priv->storage_set == NULL) { - gtk_object_unref (GTK_OBJECT (new)); + bonobo_object_unref (BONOBO_OBJECT (new)); return NULL; } @@ -303,7 +398,7 @@ e_shell_quit (EShell *shell) g_return_if_fail (shell != NULL); g_return_if_fail (E_IS_SHELL (shell)); - gtk_object_destroy (GTK_OBJECT (shell)); + bonobo_object_unref (BONOBO_OBJECT (shell)); } diff --git a/shell/e-shell.h b/shell/e-shell.h index 10b42f527d..503b056986 100644 --- a/shell/e-shell.h +++ b/shell/e-shell.h @@ -28,8 +28,9 @@ #include <config.h> #endif -#include <gtk/gtkobject.h> +#include <bonobo/bonobo-object.h> +#include "Evolution.h" #include "e-shortcuts.h" #ifdef __cplusplus @@ -49,25 +50,26 @@ typedef struct _EShellPrivate EShellPrivate; typedef struct _EShellClass EShellClass; struct _EShell { - GtkObject parent; + BonoboObject parent; EShellPrivate *priv; }; struct _EShellClass { - GtkObjectClass parent_class; + BonoboObjectClass parent_class; void (* no_views_left) (EShell *shell); }; -GtkType e_shell_get_type (void); -void e_shell_construct (EShell *shell, - const char *local_directory); -EShell *e_shell_new (const char *local_directory); - -GtkWidget *e_shell_new_view (EShell *shell, - const char *uri); +GtkType e_shell_get_type (void); +void e_shell_construct (EShell *shell, + Evolution_Shell corba_object, + const char *local_directory); +EShell *e_shell_new (const char *local_directory); + +GtkWidget *e_shell_new_view (EShell *shell, + const char *uri); EShortcuts *e_shell_get_shortcuts (EShell *shell); EStorageSet *e_shell_get_storage_set (EShell *shell); diff --git a/shell/e-storage-set.h b/shell/e-storage-set.h index fddf0f0ce9..da4687d642 100644 --- a/shell/e-storage-set.h +++ b/shell/e-storage-set.h @@ -28,8 +28,9 @@ #include <config.h> #endif -#include "e-folder-type-repository.h" +#include <gtk/gtkwidget.h> +#include "e-folder-type-repository.h" #include "e-storage.h" #ifdef __cplusplus diff --git a/shell/e-storage.c b/shell/e-storage.c index 5d5b1dd7a8..974626e7b8 100644 --- a/shell/e-storage.c +++ b/shell/e-storage.c @@ -400,7 +400,7 @@ e_storage_get_name (EStorage *storage) /* These functions are used by subclasses to add and remove folders from the state stored in the storage object. */ -void +gboolean e_storage_new_folder (EStorage *storage, const char *path, EFolder *e_folder) @@ -411,12 +411,12 @@ e_storage_new_folder (EStorage *storage, const char *name; char *full_path; - 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)); - g_return_if_fail (e_folder != NULL); - g_return_if_fail (E_IS_FOLDER (e_folder)); + 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); + g_return_val_if_fail (e_folder != NULL, FALSE); + g_return_val_if_fail (E_IS_FOLDER (e_folder), FALSE); priv = storage->priv; @@ -424,12 +424,12 @@ e_storage_new_folder (EStorage *storage, if (parent_folder == NULL) { g_warning ("%s: Trying to add a subfolder to a path that does not exist yet -- %s", __FUNCTION__, path); - return; + return FALSE; } name = e_folder_get_name (e_folder); g_assert (name != NULL); - g_return_if_fail (*name != G_DIR_SEPARATOR); + g_return_val_if_fail (*name != G_DIR_SEPARATOR, FALSE); full_path = g_concat_dir_and_file (path, name); @@ -437,36 +437,40 @@ e_storage_new_folder (EStorage *storage, if (folder != NULL) { g_warning ("%s: Trying to add a subfolder for a path that already exists -- %s", __FUNCTION__, full_path); - return; + return FALSE; } folder = folder_new (e_folder); folder_add_subfolder (parent_folder, folder); g_hash_table_insert (priv->path_to_folder, full_path, folder); + + return TRUE; } -void +gboolean e_storage_remove_folder (EStorage *storage, const char *path) { EStoragePrivate *priv; Folder *folder; - 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)); + 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; folder = g_hash_table_lookup (priv->path_to_folder, path); if (folder == NULL) { g_warning ("%s: Folder not found -- %s", __FUNCTION__, path); - return; + return FALSE; } folder_destroy (folder); + + return TRUE; } diff --git a/shell/e-storage.h b/shell/e-storage.h index 9c54f05eb8..2639497854 100644 --- a/shell/e-storage.h +++ b/shell/e-storage.h @@ -73,18 +73,15 @@ EStorage *e_storage_new (void); gboolean e_storage_path_is_relative (const char *path); gboolean e_storage_path_is_absolute (const char *path); -GList *e_storage_list_folders (EStorage *storage, - const char *path); -EStorageWatcher *e_storage_get_watcher_for_path (EStorage *storage, - const char *path); -EFolder *e_storage_get_folder (EStorage *storage, - const char *path); +GList *e_storage_list_folders (EStorage *storage, const char *path); +EStorageWatcher *e_storage_get_watcher_for_path (EStorage *storage, const char *path); +EFolder *e_storage_get_folder (EStorage *storage, const char *path); const char *e_storage_get_name (EStorage *storage); /* Protected. C++ anyone? */ -void e_storage_new_folder (EStorage *storage, const char *path, EFolder *folder); -void e_storage_remove_folder (EStorage *storage, const char *path); +gboolean e_storage_new_folder (EStorage *storage, const char *path, EFolder *folder); +gboolean e_storage_remove_folder (EStorage *storage, const char *path); #ifdef __cplusplus } diff --git a/shell/evolution-service-repository.c b/shell/evolution-service-repository.c deleted file mode 100644 index 3714ac5a62..0000000000 --- a/shell/evolution-service-repository.c +++ /dev/null @@ -1,279 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * Author: - * Bertrand Guiheneuf (bg@aful.org) - * - * Dumped from bonobo/bonobo-persist-stream.c - * - * (C) 2000 Helix Code, Inc. - */ - -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include <config.h> -#include <gtk/gtksignal.h> -#include <gtk/gtkmarshal.h> -#include "evolution-service-repository.h" - -/* Parent class */ -static BonoboObjectClass *evolution_service_repository_parent_class; - - -/* CORBA implementation Entry Point Vector */ -POA_Evolution_ServiceRepository__vepv evolution_service_repository_vepv; - - - - - -/* - *function assigned to the - * Evolution::ServiceRepository::set_shell - * method. - * This function calls the set_shell_fn in - * the EvolutionServiceRepository - */ -static void -impl_set_shell (PortableServer_Servant servant, - Evolution_Shell shell, - CORBA_Environment *ev) -{ - BonoboObject *object = bonobo_object_from_servant (servant); - EvolutionServiceRepository *sr = EVOLUTION_SERVICE_REPOSITORY (object); - - if (sr->set_shell_fn != NULL) { - (*sr->set_shell_fn)(sr, shell, sr->closure); - } else { - GtkObjectClass *oc = GTK_OBJECT (sr)->klass; - EvolutionServiceRepositoryClass *class = EVOLUTION_SERVICE_REPOSITORY_CLASS (oc); - (*class->set_shell)(sr, shell); - } - -} - -/** - * evolution_service_repository_get_epv: - * create and initialize the ServiceRepository - * epv. - */ -POA_Evolution_ServiceRepository__epv * -evolution_service_repository_get_epv (void) -{ - POA_Evolution_ServiceRepository__epv *epv; - - epv = g_new0 (POA_Evolution_ServiceRepository__epv, 1); - - epv->set_shell = impl_set_shell; - - return epv; -} - - -/* create the Evolution_ServiceRepository vepv */ -static void -init_service_repository_corba_class (void) -{ - /* create the Bonobo interface epv */ - evolution_service_repository_vepv.Bonobo_Unknown_epv = - bonobo_object_get_epv (); - - /* create the ServiceRepository interface epv. - * Defined above */ - evolution_service_repository_vepv.Evolution_ServiceRepository_epv = - evolution_service_repository_get_epv (); -} - - -/* default implementation for the ::set_shell method */ -static void -evolution_service_repository_set_shell_default (EvolutionServiceRepository *service_repository, - Evolution_Shell shell) -{ - /* do nothing */ -} - - - -static void -evolution_service_repository_destroy (GtkObject *object) -{ - GTK_OBJECT_CLASS (evolution_service_repository_parent_class)->destroy (object); -} - - -/* initialize the Gtk object class */ -static void -evolution_service_repository_class_init (EvolutionServiceRepositoryClass *klass) -{ - GtkObjectClass *object_class = (GtkObjectClass *) klass; - - evolution_service_repository_parent_class = gtk_type_class (bonobo_object_get_type ()); - - /* - * Override and initialize methods - */ - object_class->destroy = evolution_service_repository_destroy; - klass->set_shell = evolution_service_repository_set_shell_default; - - /* create the corba class */ - init_service_repository_corba_class (); -} - -static void -evolution_service_repository_init (EvolutionServiceRepository *service_repository) -{ -} - - -/** - * evolution_service_repository_get_type: - * - * Returns: the GtkType for the EvolutionServiceRepository class. - */ -GtkType -evolution_service_repository_get_type (void) -{ - static GtkType type = 0; - - if (!type){ - GtkTypeInfo info = { - "EvolutionServiceRepository", - sizeof (EvolutionServiceRepository), - sizeof (EvolutionServiceRepositoryClass), - (GtkClassInitFunc) evolution_service_repository_class_init, - (GtkObjectInitFunc) evolution_service_repository_init, - NULL, /* reserved 1 */ - NULL, /* reserved 2 */ - (GtkClassInitFunc) NULL - }; - - type = gtk_type_unique (bonobo_object_get_type (), &info); - } - - return type; -} - - - - -/** - * evolution_service_repository_construct: construct the object - * @sr: the gtk service repository object to construct - * @corba_service_repository: the corresponding corba object - * @set_shell_fn: the ::set_shell implementation for this object - * @closure: data to pass to the set_shell operation - * - * This construct an EvolutionServiceRepository object. - * The caller can give the function that will implement - * the Corba interface. If those methods are %NULL then the - * default class method will be called instead. - * - * Return value: The constructed service repository. - **/ -EvolutionServiceRepository * -evolution_service_repository_construct (EvolutionServiceRepository *sr, - Evolution_ServiceRepository corba_service_repository, - EvolutionServiceRepositorySetShellFn set_shell_fn, - void *closure) -{ - g_return_val_if_fail (sr != NULL, NULL); - g_return_val_if_fail (EVOLUTION_IS_SERVICE_REPOSITORY (sr), NULL); - g_return_val_if_fail (corba_service_repository != CORBA_OBJECT_NIL, NULL); - - bonobo_object_construct (BONOBO_OBJECT (sr), - corba_service_repository); - - sr->closure = closure; - sr->set_shell_fn = set_shell_fn; - - return sr; -} - - -/* - * construct the corba - * Evolution_ServiceRepository object - */ -static Evolution_ServiceRepository -create_evolution_service_repository (BonoboObject *object) -{ - POA_Evolution_ServiceRepository *servant; - CORBA_Environment ev; - - /* create a servant */ - servant = (POA_Evolution_ServiceRepository *) g_new0 (BonoboObjectServant, 1); - - /* initialize its virtual entry point vector */ - servant->vepv = &evolution_service_repository_vepv; - - CORBA_exception_init (&ev); - - /* initialise the servant */ - POA_Evolution_ServiceRepository__init ((PortableServer_Servant) servant, &ev); - if (ev._major != CORBA_NO_EXCEPTION){ - g_free (servant); - CORBA_exception_free (&ev); - return CORBA_OBJECT_NIL; - } - CORBA_exception_free (&ev); - - /* activate it and return */ - return (Evolution_ServiceRepository) bonobo_object_activate_servant (object, servant); -} - - - - - -/** - * evolution_service_repository_new: create a new EvolutionServiceRepository object - * @set_shell_fn: The ::set_shell method - * @closure: The data passed to the ::set_shell method - * - * Create a full EvolutionServiceRepository. Also create the correspoding - * servant. The ::set_shell method calls set_shell_fn unless set_shell_fn - * is %NULL, in which case, the class default method is called. - * - * Return value: The newly created EvolutionServiceRepository object - **/ -EvolutionServiceRepository * -evolution_service_repository_new (EvolutionServiceRepositorySetShellFn set_shell_fn, - void *closure) -{ - Evolution_ServiceRepository corba_sr; - EvolutionServiceRepository *sr; - - /* create the gtk object */ - sr = gtk_type_new (evolution_service_repository_get_type ()); - - /* create the Corba object */ - corba_sr = create_evolution_service_repository ( - BONOBO_OBJECT (sr)); - - /* check for an error in the creation of the corba object */ - if (corba_sr == CORBA_OBJECT_NIL){ - gtk_object_destroy (GTK_OBJECT (sr)); - return NULL; - } - - /* construct the object */ - evolution_service_repository_construct (sr, corba_sr, set_shell_fn, closure); - - return sr; -} diff --git a/shell/evolution-service-repository.h b/shell/evolution-service-repository.h deleted file mode 100644 index 88a0f621d7..0000000000 --- a/shell/evolution-service-repository.h +++ /dev/null @@ -1,66 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -#ifndef _EVOLUTION_SERVICE_REPOSITORY_H -#define _EVOLUTION_SERVICE_REPOSITORY_H 1 - -#include <bonobo/bonobo-object.h> -#include "Evolution.h" - -BEGIN_GNOME_DECLS - -#define EVOLUTION_SERVICE_REPOSITORY_TYPE (evolution_service_repository_get_type ()) -#define EVOLUTION_SERVICE_REPOSITORY(o) (GTK_CHECK_CAST ((o), EVOLUTION_SERVICE_REPOSITORY_TYPE, EvolutionServiceRepository)) -#define EVOLUTION_SERVICE_REPOSITORY_CLASS(k) (GTK_CHECK_CLASS_CAST((k), EVOLUTION_SERVICE_REPOSITORY_TYPE, EvolutionServiceRepositoryClass)) -#define EVOLUTION_IS_SERVICE_REPOSITORY(o) (GTK_CHECK_TYPE ((o), EVOLUTION_SERVICE_REPOSITORY_TYPE)) -#define EVOLUTION_IS_SERVICE_REPOSITORY_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), EVOLUTION_SERVICE_REPOSITORY_TYPE)) - -typedef struct _EvolutionServiceRepository EvolutionServiceRepositoryPrivate; -typedef struct _EvolutionServiceRepository EvolutionServiceRepository; - -typedef void (*EvolutionServiceRepositorySetShellFn) (EvolutionServiceRepository *sr, const Evolution_Shell shell, void *closure); - - -struct _EvolutionServiceRepository { - BonoboObject object; - - - EvolutionServiceRepositorySetShellFn set_shell_fn; - - void *closure; - - EvolutionServiceRepositoryPrivate *priv; - -}; - - - -typedef struct { - BonoboObjectClass parent_class; - - void (*set_shell) (EvolutionServiceRepository *sr, Evolution_Shell shell); - -} EvolutionServiceRepositoryClass; - - - -GtkType evolution_service_repository_get_type (void); - -EvolutionServiceRepository * evolution_service_repository_new ( - EvolutionServiceRepositorySetShellFn set_shell_fn, - void *closure); - -EvolutionServiceRepository * evolution_service_repository_construct ( - EvolutionServiceRepository *sr, - Evolution_ServiceRepository corba_service_repository, - EvolutionServiceRepositorySetShellFn set_shell_fn, - void *closure); - - -POA_Evolution_ServiceRepository__epv *evolution_service_repository_get_epv (void); - -extern POA_Evolution_ServiceRepository__vepv evolution_service_repository_vepv; - -END_GNOME_DECLS - - -#endif /* _EVOLUTION_SERVICE_REPOSITORY_H */ - diff --git a/shell/evolution-service-repository.idl b/shell/evolution-service-repository.idl deleted file mode 100644 index 809ccbdc21..0000000000 --- a/shell/evolution-service-repository.idl +++ /dev/null @@ -1,21 +0,0 @@ -/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * Component Interface - * - * Authors: - * Bertrand Guiheneuf (bg@aful.org) - * - * (C) 2000 Helix Code, Inc. - */ -#include <Bonobo.idl> - -module Evolution { - interface ServiceRepository : Bonobo::Unknown { - - void set_shell (in Shell shell); - - - }; -}; - |