diff options
-rw-r--r-- | calendar/ChangeLog | 8 | ||||
-rw-r--r-- | calendar/gui/alarm-notify/Makefile.am | 6 | ||||
-rw-r--r-- | calendar/gui/alarm-notify/alarm-notify.c | 55 | ||||
-rw-r--r-- | calendar/idl/evolution-calendar.idl | 13 | ||||
-rw-r--r-- | calendar/pcs/cal-factory.c | 67 | ||||
-rw-r--r-- | calendar/pcs/cal-factory.h | 5 |
6 files changed, 149 insertions, 5 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog index 9e37386e7d..acdead7cf6 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,3 +1,11 @@ +2001-02-16 Federico Mena Quintero <federico@ximian.com> + + * pcs/cal-factory.c (CalFactoryPrivate): Added a `registered' + field. + (cal_factory_oaf_register): New function; now the factory performs + its own registration with OAF. + (cal_factory_destroy): Unregister from OAF if appropriate. + 2001-02-19 JP Rosevear <jpr@ximian.com> * conduits/todo/Makefile.am: Remove PISOCK_LIBDIR diff --git a/calendar/gui/alarm-notify/Makefile.am b/calendar/gui/alarm-notify/Makefile.am index 2bfdfa38df..5df0b3c234 100644 --- a/calendar/gui/alarm-notify/Makefile.am +++ b/calendar/gui/alarm-notify/Makefile.am @@ -30,6 +30,12 @@ INCLUDES = \ gladedir = $(datadir)/evolution/glade evolution_alarm_notify_SOURCES = \ + alarm.c \ + alarm.h \ + alarm-notify.c \ + alarm-notify.h \ + alarm-queue.c \ + alarm-queue.h \ notify-main.c evolution_alarm_notify_LDADD = \ diff --git a/calendar/gui/alarm-notify/alarm-notify.c b/calendar/gui/alarm-notify/alarm-notify.c index 60346ba801..9d64bfd4a8 100644 --- a/calendar/gui/alarm-notify/alarm-notify.c +++ b/calendar/gui/alarm-notify/alarm-notify.c @@ -24,6 +24,8 @@ #include "config.h" #endif +#include <libgnomevfs/gnome-vfs.h> +#include <cal-client/cal-client.h> #include "alarm-notify.h" @@ -109,7 +111,7 @@ alarm_notify_init (AlarmNotify *an) priv = g_new0 (AlarmNotifyPrivate, 1); an->priv = priv; - /* FIXME */ + priv->uri_client_hash = g_hash_table_new (gnome_vfs_uri_hash, gnome_vfs_uri_hequal); } /* Destroy handler for the alarm notify system */ @@ -127,6 +129,9 @@ alarm_notify_destroy (GtkObject *object) /* FIXME */ + g_hash_table_destroy (priv->uri_client_hash); + priv->uri_client_hash = NULL; + g_free (priv); an->priv = NULL; @@ -145,13 +150,47 @@ AlarmNotify_addCalendar (PortableServer_Servant servant, CORBA_Environment *ev) { AlarmNotify *an; + AlarmNotifyPrivate *priv; GnomeVFSURI *uri; CalClient *client; an = ALARM_NOTIFY (bonobo_object_from_servant (servant)); + priv = an->priv; uri = gnome_vfs_uri_new (str_uri); if (!uri) { + CORBA_exception_set (ev, CORBA_USER_EXCEPTION, + ex_GNOME_Evolution_Calendar_AlarmNotify_InvalidURI, + NULL); + return; + } + + client = g_hash_table_lookup (priv->uri_client_hash, uri); + + if (client) { + gnome_vfs_uri_unref (uri); + + gtk_object_ref (GTK_OBJECT (client)); + return; + } + + client = cal_client_new (); + + if (client) { + g_hash_table_insert (priv->uri_client_hash, uri); + alarm_queue_add_client (client); + + if (!cal_client_open_calendar (client, str_uri, FALSE)) { + gtk_object_unref (GTK_OBJECT (client)); + client = NULL; + } + } else { + gnome_vfs_uri_unref (uri); + + CORBA_exception_set (ev, CORBA_USER_EXCEPTION, + ex_GNOME_Evolution_Calendar_AlarmNotify_BackendContactError, + NULL); + return; } } @@ -162,10 +201,22 @@ AlarmNotify_removeCalendar (PortableServer_Servant servant, CORBA_Environment *ev) { AlarmNotify *an; + AlarmNotifyPrivate *priv; + CalClient *client; + char *orig_uri; an = ALARM_NOTIFY (bonobo_object_from_servant (servant)); + priv = an->priv; - /* FIXME */ + if (!g_hash_table_lookup_extended (priv->uri_client_hash, uri, &orig_uri, &client)) { + CORBA_exception_set (ev, CORBA_USER_EXCEPTION, + ex_GNOME_Evolution_Calendar_AlarmNotify_NotFound); + return; + } + + gtk_object_unref (client); + + /* FIXME: do we need to do anything else? */ } /** diff --git a/calendar/idl/evolution-calendar.idl b/calendar/idl/evolution-calendar.idl index 571d514370..c3de81e41f 100644 --- a/calendar/idl/evolution-calendar.idl +++ b/calendar/idl/evolution-calendar.idl @@ -188,11 +188,20 @@ module Calendar { /* Interface to the alarm notification service */ interface AlarmNotify : Bonobo::Unknown { + exception InvalidURI {}; + exception BackendContactError {}; + exception NotFound {}; + /* Adds a calendar to the alarm notification system */ - void addCalendar (in string uri); + void addCalendar (in string uri) + raises (InvalidURI, BackendContactError); /* Removes a calendar from the alarm notification system */ - void removeCalendar (in string uri); + void removeCalendar (in string uri) + raises (NotFound); + + /* Makes the alarm notification daemon unconditionally exit */ + void die (); }; }; diff --git a/calendar/pcs/cal-factory.c b/calendar/pcs/cal-factory.c index 40ffd2b735..d0bbd278d1 100644 --- a/calendar/pcs/cal-factory.c +++ b/calendar/pcs/cal-factory.c @@ -24,6 +24,7 @@ #include <ctype.h> #include <stdio.h> #include <gtk/gtksignal.h> +#include <liboaf/liboaf.h> #include "cal.h" #include "cal-backend.h" #include "cal-factory.h" @@ -31,6 +32,9 @@ +/* OAF ID for registration */ +#define CAL_FACTORY_OAF_ID "OAFIID:GNOME_Evolution_Wombat_CalendarFactory" + /* Private part of the CalFactory structure */ struct _CalFactoryPrivate { /* Hash table from URI method strings to GtkType * for backend class types */ @@ -38,6 +42,9 @@ struct _CalFactoryPrivate { /* Hash table from GnomeVFSURI structures to CalBackend objects */ GHashTable *backends; + + /* Whether we have been registered with OAF yet */ + guint registered : 1; }; @@ -136,6 +143,7 @@ cal_factory_init (CalFactory *factory) priv->methods = g_hash_table_new (g_str_hash, g_str_equal); priv->backends = g_hash_table_new (gnome_vfs_uri_hash, gnome_vfs_uri_hequal); + priv->registered = FALSE; } /* Frees a method/GtkType * pair from the methods hash table */ @@ -189,6 +197,14 @@ cal_factory_destroy (GtkObject *object) g_hash_table_destroy (priv->backends); priv->backends = NULL; + if (priv->registered) { + CORBA_Object obj; + + obj = bonobo_object_corba_objref (BONOBO_OBJECT (factory)); + oaf_active_server_unregister (CAL_FACTORY_OAF_ID, obj); + priv->registered = FALSE; + } + g_free (priv); factory->priv = NULL; @@ -670,6 +686,57 @@ str_tolower (const char *s) } /** + * cal_factory_oaf_register: + * @factory: A calendar factory. + * + * 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_oaf_register (CalFactory *factory) +{ + CalFactoryPrivate *priv; + OAF_RegistrationResult result; + CORBA_Object obj; + + 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); + + obj = bonobo_object_corba_objref (BONOBO_OBJECT (factory)); + result = oaf_active_server_register (CAL_FACTORY_OAF_ID, obj); + + switch (result) { + case OAF_REG_SUCCESS: + priv->registered = TRUE; + return TRUE; + + case OAF_REG_NOT_LISTED: + g_message ("cal_factory_oaf_register(): Cannot register the calendar factory: " + "not listed"); + break; + + case OAF_REG_ALREADY_ACTIVE: + g_message ("cal_factory_oaf_register(): Cannot register the calendar factory: " + "already active"); + break; + + case OAF_REG_ERROR: + default: + g_message ("cal_factory_oaf_register(): Cannot register the calendar factory: " + "generic error"); + break; + } + + return FALSE; +} + +/** * cal_factory_register_method: * @factory: A calendar factory. * @method: Method for the URI, i.e. "http", "file", etc. diff --git a/calendar/pcs/cal-factory.h b/calendar/pcs/cal-factory.h index 4bdf9bf52f..ac28a5935b 100644 --- a/calendar/pcs/cal-factory.h +++ b/calendar/pcs/cal-factory.h @@ -60,11 +60,14 @@ struct _CalFactoryClass { GtkType cal_factory_get_type (void); -CalFactory *cal_factory_construct (CalFactory *factory, GNOME_Evolution_Calendar_CalFactory corba_factory); +CalFactory *cal_factory_construct (CalFactory *factory, + GNOME_Evolution_Calendar_CalFactory corba_factory); GNOME_Evolution_Calendar_CalFactory cal_factory_corba_object_create (BonoboObject *object); CalFactory *cal_factory_new (void); +gboolean cal_factory_oaf_register (CalFactory *factory); + void cal_factory_register_method (CalFactory *factory, const char *method, GtkType backend_type); int cal_factory_get_n_backends (CalFactory *factory); |