diff options
Diffstat (limited to 'calendar/gui/alarm-notify')
-rw-r--r-- | calendar/gui/alarm-notify/.cvsignore | 2 | ||||
-rw-r--r-- | calendar/gui/alarm-notify/GNOME_Evolution_Calendar_AlarmNotify.oaf.in | 24 | ||||
-rw-r--r-- | calendar/gui/alarm-notify/Makefile.am | 10 | ||||
-rw-r--r-- | calendar/gui/alarm-notify/alarm-notify.c | 107 | ||||
-rw-r--r-- | calendar/gui/alarm-notify/alarm-queue.c | 12 |
5 files changed, 129 insertions, 26 deletions
diff --git a/calendar/gui/alarm-notify/.cvsignore b/calendar/gui/alarm-notify/.cvsignore index fa1c1f7c87..1f2b546c7c 100644 --- a/calendar/gui/alarm-notify/.cvsignore +++ b/calendar/gui/alarm-notify/.cvsignore @@ -6,3 +6,5 @@ evolution-calendar-stubs.c evolution-calendar-skels.c evolution-calendar-common.c evolution-calendar.h +evolution-alarm-notify +GNOME_Evolution_Calendar_AlarmNotify.oaf diff --git a/calendar/gui/alarm-notify/GNOME_Evolution_Calendar_AlarmNotify.oaf.in b/calendar/gui/alarm-notify/GNOME_Evolution_Calendar_AlarmNotify.oaf.in new file mode 100644 index 0000000000..86f5c71493 --- /dev/null +++ b/calendar/gui/alarm-notify/GNOME_Evolution_Calendar_AlarmNotify.oaf.in @@ -0,0 +1,24 @@ +<oaf_info> + +<oaf_server iid="OAFIID:GNOME_Evolution_Calendar_AlarmNotify_Factory" + type="exe" + location="evolution-alarm-notify"> + + <oaf_attribute name="repo_ids" type="stringv"> + <item value="IDL:GNOME/ObjectFactory:1.0"/> + </oaf_attribute> + + <oaf_attribute name="description" type="string" + _value="Factory for the alarm notification service"/> + +</oaf_server> + +<oaf_server iid="OAFIID:GNOME_Evolution_Calendar_AlarmNotify" + type="factory" + location="OAFIID:GNOME_Evolution_Calendar_AlarmNotify_Factory"> + + <oaf_attribute name="description" type="string" + _value="Alarm notification service"/> +</oaf_server> + +</oaf_info> diff --git a/calendar/gui/alarm-notify/Makefile.am b/calendar/gui/alarm-notify/Makefile.am index 5df0b3c234..3201f062f6 100644 --- a/calendar/gui/alarm-notify/Makefile.am +++ b/calendar/gui/alarm-notify/Makefile.am @@ -47,10 +47,16 @@ evolution_alarm_notify_LDADD = \ $(INTLLIBS) oafdir = $(datadir)/oaf -oaf_DATA = GNOME_Evolution_Calendar_AlarmNotify.oafinfo +oaf_in_files = \ + GNOME_Evolution_Calendar_AlarmNotify.oaf.in + +oaf_DATA = $(oaf_in_files:.oaf.in=.oaf) + +@XML_I18N_MERGE_OAF_RULE@ EXTRA_DIST = \ - $(oaf_DATA) + $(oaf_DATA) \ + $(oaf_in_files) BUILT_SOURCES = $(CORBA_GENERATED) CLEANFILES += $(BUILT_SOURCES) diff --git a/calendar/gui/alarm-notify/alarm-notify.c b/calendar/gui/alarm-notify/alarm-notify.c index 9d64bfd4a8..fa70a1d236 100644 --- a/calendar/gui/alarm-notify/alarm-notify.c +++ b/calendar/gui/alarm-notify/alarm-notify.c @@ -27,12 +27,29 @@ #include <libgnomevfs/gnome-vfs.h> #include <cal-client/cal-client.h> #include "alarm-notify.h" +#include "alarm-queue.h" +/* A loaded client */ +typedef struct { + /* The actual client */ + CalClient *client; + + /* The URI of the client in gnome-vfs's format. This *is* the key that + * is stored in the uri_client_hash hash table below. + */ + GnomeVFSURI *uri; + + /* Number of times clients have requested this URI to be added to the + * alarm notification system. + */ + int refcount; +} LoadedClient; + /* Private part of the AlarmNotify structure */ struct _AlarmNotifyPrivate { - /* Mapping from GnomeVFSURIs to loaded clients */ + /* Mapping from GnomeVFSURIs to LoadedClient structures */ GHashTable *uri_client_hash; }; @@ -114,6 +131,19 @@ alarm_notify_init (AlarmNotify *an) priv->uri_client_hash = g_hash_table_new (gnome_vfs_uri_hash, gnome_vfs_uri_hequal); } +/* Callback used from g_hash-table_forach(), used to destroy a loade client */ +static void +destroy_loaded_client_cb (gpointer key, gpointer value, gpointer data) +{ + LoadedClient *lc; + + lc = value; + + gtk_object_unref (GTK_OBJECT (lc->client)); + gnome_vfs_uri_unref (lc->uri); + g_free (lc); +} + /* Destroy handler for the alarm notify system */ static void alarm_notify_destroy (GtkObject *object) @@ -127,7 +157,7 @@ alarm_notify_destroy (GtkObject *object) an = ALARM_NOTIFY (object); priv = an->priv; - /* FIXME */ + g_hash_table_foreach (priv->uri_client_hash, destroy_loaded_client_cb, NULL); g_hash_table_destroy (priv->uri_client_hash); priv->uri_client_hash = NULL; @@ -153,6 +183,7 @@ AlarmNotify_addCalendar (PortableServer_Servant servant, AlarmNotifyPrivate *priv; GnomeVFSURI *uri; CalClient *client; + LoadedClient *lc; an = ALARM_NOTIFY (bonobo_object_from_servant (servant)); priv = an->priv; @@ -165,26 +196,33 @@ AlarmNotify_addCalendar (PortableServer_Servant servant, return; } - client = g_hash_table_lookup (priv->uri_client_hash, uri); + lc = g_hash_table_lookup (priv->uri_client_hash, uri); - if (client) { + if (lc) { gnome_vfs_uri_unref (uri); - - gtk_object_ref (GTK_OBJECT (client)); + g_assert (lc->refcount > 0); + lc->refcount++; 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)) { + if (cal_client_open_calendar (client, str_uri, FALSE)) { + lc = g_new (LoadedClient, 1); + lc->client = client; + lc->uri = uri; + lc->refcount = 1; + g_hash_table_insert (priv->uri_client_hash, uri, lc); + + alarm_queue_add_client (client); + } else { gtk_object_unref (GTK_OBJECT (client)); client = NULL; } - } else { + } + + if (!client) { gnome_vfs_uri_unref (uri); CORBA_exception_set (ev, CORBA_USER_EXCEPTION, @@ -197,26 +235,59 @@ AlarmNotify_addCalendar (PortableServer_Servant servant, /* AlarmNotify::removeCalendar method */ static void AlarmNotify_removeCalendar (PortableServer_Servant servant, - const CORBA_char *uri, + const CORBA_char *str_uri, CORBA_Environment *ev) { AlarmNotify *an; AlarmNotifyPrivate *priv; - CalClient *client; - char *orig_uri; + LoadedClient *lc; + GnomeVFSURI *uri; an = ALARM_NOTIFY (bonobo_object_from_servant (servant)); priv = an->priv; - if (!g_hash_table_lookup_extended (priv->uri_client_hash, uri, &orig_uri, &client)) { + uri = gnome_vfs_uri_new (str_uri); + if (!uri) { CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_Calendar_AlarmNotify_NotFound); + ex_GNOME_Evolution_Calendar_AlarmNotify_InvalidURI, + NULL); return; } - gtk_object_unref (client); + lc = g_hash_table_lookup (priv->uri_client_hash, uri); + gnome_vfs_uri_unref (uri); + + if (!lc) { + CORBA_exception_set (ev, CORBA_USER_EXCEPTION, + ex_GNOME_Evolution_Calendar_AlarmNotify_NotFound, + NULL); + return; + } - /* FIXME: do we need to do anything else? */ + g_assert (lc->refcount > 0); + + lc->refcount--; + if (lc->refcount > 0) + return; + + g_hash_table_remove (priv->uri_client_hash, lc->uri); + + gtk_object_unref (GTK_OBJECT (lc->client)); + gnome_vfs_uri_unref (lc->uri); + g_free (lc); +} + +static void +AlarmNotify_die (PortableServer_Servant servant, + CORBA_Environment *ev) +{ + AlarmNotify *an; + AlarmNotifyPrivate *priv; + + an = ALARM_NOTIFY (bonobo_object_from_servant (servant)); + priv = an->priv; + + /* FIXME */ } /** diff --git a/calendar/gui/alarm-notify/alarm-queue.c b/calendar/gui/alarm-notify/alarm-queue.c index e2f2ae88db..1e235c116d 100644 --- a/calendar/gui/alarm-notify/alarm-queue.c +++ b/calendar/gui/alarm-notify/alarm-queue.c @@ -286,13 +286,13 @@ load_alarms (ClientAlarms *ca) /* Called when a calendar client finished loading; we load its alarms */ static void -cal_loaded_cb (CalClient *client, CalClientLoadStatus status, gpointer data) +cal_opened_cb (CalClient *client, CalClientOpenStatus status, gpointer data) { ClientAlarms *ca; ca = data; - if (status != CAL_CLIENT_LOAD_SUCCESS) + if (status != CAL_CLIENT_OPEN_SUCCESS) return; load_alarms (ca); @@ -463,16 +463,16 @@ alarm_queue_add_client (CalClient *client) ca->uid_alarms_hash = g_hash_table_new (g_str_hash, g_str_equal); - if (!cal_client_is_loaded (client)) - gtk_signal_connect (GTK_OBJECT (client), "cal_loaded", - GTK_SIGNAL_FUNC (cal_loaded_cb), ca); + if (cal_client_get_load_state (client) != CAL_CLIENT_LOAD_LOADED) + gtk_signal_connect (GTK_OBJECT (client), "cal_opened", + GTK_SIGNAL_FUNC (cal_opened_cb), ca); gtk_signal_connect (GTK_OBJECT (client), "obj_updated", GTK_SIGNAL_FUNC (obj_updated_cb), ca); gtk_signal_connect (GTK_OBJECT (client), "obj_removed", GTK_SIGNAL_FUNC (obj_removed_cb), ca); - if (cal_client_is_loaded (client)) + if (cal_client_get_load_state (client) == CAL_CLIENT_LOAD_LOADED) load_alarms (ca); } |