diff options
author | JP Rosevear <jpr@src.gnome.org> | 2003-11-07 13:52:24 +0800 |
---|---|---|
committer | JP Rosevear <jpr@src.gnome.org> | 2003-11-07 13:52:24 +0800 |
commit | 200606f92810d3de322e5ee96f8326e1a656f8bb (patch) | |
tree | da0dc27f5311128dcb6e7eb6400931e45743372e /calendar/pcs/cal-factory.c | |
parent | e5472b4cc9a4bb80b89437a16f8b77943ea35555 (diff) | |
download | gsoc2013-evolution-200606f92810d3de322e5ee96f8326e1a656f8bb.tar gsoc2013-evolution-200606f92810d3de322e5ee96f8326e1a656f8bb.tar.gz gsoc2013-evolution-200606f92810d3de322e5ee96f8326e1a656f8bb.tar.bz2 gsoc2013-evolution-200606f92810d3de322e5ee96f8326e1a656f8bb.tar.lz gsoc2013-evolution-200606f92810d3de322e5ee96f8326e1a656f8bb.tar.xz gsoc2013-evolution-200606f92810d3de322e5ee96f8326e1a656f8bb.tar.zst gsoc2013-evolution-200606f92810d3de322e5ee96f8326e1a656f8bb.zip |
Various changes to merge in evolution-data-server reliance.
svn path=/trunk/; revision=23206
Diffstat (limited to 'calendar/pcs/cal-factory.c')
-rw-r--r-- | calendar/pcs/cal-factory.c | 482 |
1 files changed, 0 insertions, 482 deletions
diff --git a/calendar/pcs/cal-factory.c b/calendar/pcs/cal-factory.c deleted file mode 100644 index 2f72ec5911..0000000000 --- a/calendar/pcs/cal-factory.c +++ /dev/null @@ -1,482 +0,0 @@ -/* Evolution calendar factory - * - * Copyright (C) 2000-2003 Ximian, Inc. - * - * Authors: - * Federico Mena-Quintero <federico@ximian.com> - * JP Rosevear <jpr@ximian.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <bonobo-activation/bonobo-activation.h> -#include <bonobo/bonobo-exception.h> -#include <bonobo/bonobo-main.h> -#include "e-util/e-url.h" -#include "evolution-calendar.h" -#include "cal-backend.h" -#include "cal.h" -#include "cal-factory.h" - -#define PARENT_TYPE BONOBO_TYPE_OBJECT -#define DEFAULT_CAL_FACTORY_OAF_ID "OAFIID:GNOME_Evolution_Wombat_CalendarFactory" - -static BonoboObjectClass *parent_class; - -/* Private part of the CalFactory structure */ -struct _CalFactoryPrivate { - /* Hash table from URI method strings to GType * for backend class types */ - GHashTable *methods; - - /* Hash table from GnomeVFSURI structures to CalBackend objects */ - GHashTable *backends; - - /* OAFIID of the factory */ - char *iid; - - /* Whether we have been registered with OAF yet */ - guint registered : 1; -}; - -/* Signal IDs */ -enum SIGNALS { - LAST_CALENDAR_GONE, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL]; - -/* Opening calendars */ -static icalcomponent_kind -calobjtype_to_icalkind (const GNOME_Evolution_Calendar_CalObjType type) -{ - switch (type){ - case GNOME_Evolution_Calendar_TYPE_EVENT: - return ICAL_VEVENT_COMPONENT; - case GNOME_Evolution_Calendar_TYPE_TODO: - return ICAL_VTODO_COMPONENT; - case GNOME_Evolution_Calendar_TYPE_JOURNAL: - return ICAL_VJOURNAL_COMPONENT; - } - - return ICAL_NO_COMPONENT; -} - -static GType -get_backend_type (GHashTable *methods, const char *method, icalcomponent_kind kind) -{ - GHashTable *kinds; - GType type; - - kinds = g_hash_table_lookup (methods, method); - if (!kinds) - return 0; - - type = GPOINTER_TO_INT (g_hash_table_lookup (kinds, GINT_TO_POINTER (kind))); - - return type; -} - -/* Looks up a calendar backend in a factory's hash table of uri->cal. If - * *non-NULL, orig_uri_return will be set to point to the original key in the - * *hash table. - */ -static CalBackend * -lookup_backend (CalFactory *factory, const char *uristr) -{ - CalFactoryPrivate *priv; - EUri *uri; - CalBackend *backend; - char *tmp; - - priv = factory->priv; - - uri = e_uri_new (uristr); - if (!uri) - return NULL; - - tmp = e_uri_to_string (uri, FALSE); - backend = g_hash_table_lookup (priv->backends, tmp); - g_free (tmp); - e_uri_free (uri); - - return backend; -} - -/* Callback used when a backend loses its last connected client */ -static void -backend_last_client_gone_cb (CalBackend *backend, gpointer data) -{ - CalFactory *factory; - CalFactoryPrivate *priv; - CalBackend *ret_backend; - const char *uristr; - - fprintf (stderr, "backend_last_client_gone_cb() called!\n"); - - factory = CAL_FACTORY (data); - priv = factory->priv; - - /* Remove the backend from the hash table */ - - uristr = cal_backend_get_uri (backend); - g_assert (uristr != NULL); - - ret_backend = lookup_backend (factory, uristr); - g_assert (ret_backend != NULL); - g_assert (ret_backend == backend); - - g_hash_table_remove (priv->backends, uristr); - - /* Notify upstream if there are no more backends */ - - if (g_hash_table_size (priv->backends) == 0) - g_signal_emit (G_OBJECT (factory), signals[LAST_CALENDAR_GONE], 0); -} - - - -static GNOME_Evolution_Calendar_Cal -impl_CalFactory_getCal (PortableServer_Servant servant, - const CORBA_char *str_uri, - const GNOME_Evolution_Calendar_CalObjType type, - const GNOME_Evolution_Calendar_Listener listener, - CORBA_Environment *ev) -{ - CalFactory *factory; - CalFactoryPrivate *priv; - Cal *cal = CORBA_OBJECT_NIL; - CalBackend *backend; - CORBA_Environment ev2; - GNOME_Evolution_Calendar_Listener listener_copy; - GType backend_type; - EUri *uri; - char *uri_string; - - factory = CAL_FACTORY (bonobo_object_from_servant (servant)); - priv = factory->priv; - - /* Parse the uri */ - uri = e_uri_new (str_uri); - if (!uri) { - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_CalFactory_InvalidURI); - - return CORBA_OBJECT_NIL; - } - uri_string = e_uri_to_string (uri, FALSE); - - /* Find the associated backend type (if any) */ - backend_type = get_backend_type (priv->methods, uri->protocol, calobjtype_to_icalkind (type)); - if (!backend_type) { - /* FIXME Distinguish between method and kind failures? */ - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_CalFactory_UnsupportedMethod); - goto cleanup; - } - - /* Duplicate the listener object */ - CORBA_exception_init (&ev2); - listener_copy = CORBA_Object_duplicate (listener, &ev2); - - if (BONOBO_EX (&ev2)) { - g_warning (G_STRLOC ": could not duplicate the listener"); - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_CalFactory_NilListener); - CORBA_exception_free (&ev2); - goto cleanup; - } - CORBA_exception_free (&ev2); - - /* Look for an existing backend */ - backend = lookup_backend (factory, uri_string); - if (!backend) { - /* There was no existing backend, create a new one */ - backend = g_object_new (backend_type, "uri", uri_string, "kind", calobjtype_to_icalkind (type), NULL); - if (!backend) { - g_warning (G_STRLOC ": could not instantiate backend"); - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_CalFactory_UnsupportedMethod); - goto cleanup; - } - - /* Track the backend */ - g_hash_table_insert (priv->backends, g_strdup (uri_string), backend); - - g_signal_connect (G_OBJECT (backend), "last_client_gone", - G_CALLBACK (backend_last_client_gone_cb), - factory); - } - - /* Create the corba calendar */ - cal = cal_new (backend, uri_string, listener); - if (!cal) { - g_warning (G_STRLOC ": could not create the corba calendar"); - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_CalFactory_UnsupportedMethod); - goto cleanup; - } - - /* Let the backend know about its clients corba clients */ - cal_backend_add_client (backend, cal); - - cleanup: - e_uri_free (uri); - g_free (uri_string); - - return CORBA_Object_duplicate (BONOBO_OBJREF (cal), ev); -} - - - -/** - * cal_factory_new: - * @void: - * - * Creates a new #CalFactory object. - * - * Return value: A newly-created #CalFactory, or NULL if its corresponding CORBA - * object could not be created. - **/ -CalFactory * -cal_factory_new (void) -{ - CalFactory *factory; - - factory = g_object_new (CAL_FACTORY_TYPE, - "poa", bonobo_poa_get_threaded (ORBIT_THREAD_HINT_PER_REQUEST, NULL), - NULL); - - return factory; -} - -/* Destroy handler for the calendar */ -static void -cal_factory_finalize (GObject *object) -{ - CalFactory *factory; - CalFactoryPrivate *priv; - - g_return_if_fail (object != NULL); - g_return_if_fail (IS_CAL_FACTORY (object)); - - factory = CAL_FACTORY (object); - priv = factory->priv; - - g_hash_table_destroy (priv->methods); - priv->methods = NULL; - - /* Should we assert that there are no more backends? */ - g_hash_table_destroy (priv->backends); - priv->backends = NULL; - - if (priv->registered) { - bonobo_activation_active_server_unregister (priv->iid, BONOBO_OBJREF (factory)); - priv->registered = FALSE; - } - g_free (priv->iid); - - g_free (priv); - factory->priv = NULL; - - if (G_OBJECT_CLASS (parent_class)->finalize) - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - -/* Class initialization function for the calendar factory */ -static void -cal_factory_class_init (CalFactoryClass *klass) -{ - GObjectClass *object_class = (GObjectClass *) klass; - POA_GNOME_Evolution_Calendar_CalFactory__epv *epv = &klass->epv; - - parent_class = g_type_class_peek_parent (klass); - - signals[LAST_CALENDAR_GONE] = - g_signal_new ("last_calendar_gone", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (CalFactoryClass, last_calendar_gone), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - /* Class method overrides */ - object_class->finalize = cal_factory_finalize; - - /* Epv methods */ - epv->getCal = impl_CalFactory_getCal; -} - -/* Object initialization function for the calendar factory */ -static void -cal_factory_init (CalFactory *factory, CalFactoryClass *klass) -{ - CalFactoryPrivate *priv; - - priv = g_new0 (CalFactoryPrivate, 1); - factory->priv = priv; - - priv->methods = g_hash_table_new_full (g_str_hash, g_str_equal, - (GDestroyNotify) g_free, (GDestroyNotify) g_hash_table_destroy); - priv->backends = g_hash_table_new_full (g_str_hash, g_str_equal, - (GDestroyNotify) g_free, (GDestroyNotify) g_object_unref); - priv->registered = FALSE; -} - -BONOBO_TYPE_FUNC_FULL (CalFactory, - GNOME_Evolution_Calendar_CalFactory, - PARENT_TYPE, - cal_factory); - -/** - * cal_factory_register_storage: - * @factory: A calendar factory. - * @iid: OAFIID for the factory to be registered. - * - * Registers a calendar factory with the OAF object activation daemon. This - * function must be called before any clients can activate the factory. - * - * Return value: TRUE on success, FALSE otherwise. - **/ -gboolean -cal_factory_register_storage (CalFactory *factory, const char *iid) -{ - CalFactoryPrivate *priv; - Bonobo_RegistrationResult result; - char *tmp_iid; - - g_return_val_if_fail (factory != NULL, FALSE); - g_return_val_if_fail (IS_CAL_FACTORY (factory), FALSE); - - priv = factory->priv; - - g_return_val_if_fail (!priv->registered, FALSE); - - /* if iid is NULL, use the default factory OAFIID */ - if (iid) - tmp_iid = g_strdup (iid); - else - tmp_iid = g_strdup (DEFAULT_CAL_FACTORY_OAF_ID); - - result = bonobo_activation_active_server_register (tmp_iid, BONOBO_OBJREF (factory)); - - switch (result) { - case Bonobo_ACTIVATION_REG_SUCCESS: - priv->registered = TRUE; - priv->iid = tmp_iid; - return TRUE; - - case Bonobo_ACTIVATION_REG_NOT_LISTED: - g_warning (G_STRLOC ": cannot register the calendar factory (not listed)"); - break; - - case Bonobo_ACTIVATION_REG_ALREADY_ACTIVE: - g_warning (G_STRLOC ": cannot register the calendar factory (already active)"); - break; - - case Bonobo_ACTIVATION_REG_ERROR: - default: - g_warning (G_STRLOC ": cannot register the calendar factory (generic error)"); - break; - } - - g_free (tmp_iid); - - return FALSE; -} - -/** - * cal_factory_register_method: - * @factory: A calendar factory. - * @method: Method for the URI, i.e. "http", "file", etc. - * @backend_type: Class type of the backend to create for this @method. - * - * Registers the type of a #CalBackend subclass that will be used to handle URIs - * with a particular method. When the factory is asked to open a particular - * URI, it will look in its list of registered methods and create a backend of - * the appropriate type. - **/ -void -cal_factory_register_method (CalFactory *factory, const char *method, icalcomponent_kind kind, GType backend_type) -{ - CalFactoryPrivate *priv; - char *method_str; - GHashTable *kinds; - GType type; - - g_return_if_fail (factory != NULL); - g_return_if_fail (IS_CAL_FACTORY (factory)); - g_return_if_fail (method != NULL); - g_return_if_fail (backend_type != 0); - g_return_if_fail (g_type_is_a (backend_type, CAL_BACKEND_TYPE)); - - priv = factory->priv; - - method_str = g_ascii_strdown (method, -1); - - kinds = g_hash_table_lookup (priv->methods, method_str); - if (kinds) { - type = GPOINTER_TO_INT (g_hash_table_lookup (kinds, GINT_TO_POINTER (kind))); - if (type) { - g_warning (G_STRLOC ": method `%s' already registered", method_str); - g_free (method_str); - - return; - } - } else { - kinds = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, NULL); - g_hash_table_insert (priv->methods, method_str, kinds); - } - - g_hash_table_insert (kinds, GINT_TO_POINTER (kind), GINT_TO_POINTER (backend_type)); -} - -/** - * cal_factory_get_n_backends - * @factory: A calendar factory. - * - * Get the number of backends currently active in the given factory. - * - * Returns: the number of backends. - */ -int -cal_factory_get_n_backends (CalFactory *factory) -{ - CalFactoryPrivate *priv; - - g_return_val_if_fail (IS_CAL_FACTORY (factory), 0); - - priv = factory->priv; - return g_hash_table_size (priv->backends); -} - -/* Frees a uri/backend pair from the backends hash table */ -static void -dump_backend (gpointer key, gpointer value, gpointer data) -{ - char *uri; - CalBackend *backend; - - uri = key; - backend = value; - - g_message (" %s: %p", uri, backend); -} - -void -cal_factory_dump_active_backends (CalFactory *factory) -{ - CalFactoryPrivate *priv; - - g_message ("Active PCS backends"); - - priv = factory->priv; - g_hash_table_foreach (priv->backends, dump_backend, NULL); -} |