diff options
Diffstat (limited to 'calendar/gui/corba-cal.c')
-rw-r--r-- | calendar/gui/corba-cal.c | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/calendar/gui/corba-cal.c b/calendar/gui/corba-cal.c new file mode 100644 index 0000000000..d78685bf90 --- /dev/null +++ b/calendar/gui/corba-cal.c @@ -0,0 +1,209 @@ +/* + * corba-cal.c: Service that provides access to the calendar repository + * + * Author: + * Miguel de Icaza (miguel@gnu.org) + */ + +#include <config.h> +#include <stdio.h> +#include <unistd.h> +#include <sys/stat.h> +#include "calendar.h" +#include "gnome-cal.h" +#include "alarm.h" +#include "timeutil.h" +#include "../libversit/vcc.h" +#include <libgnorba/gnome-factory.h> +#include "GnomeCal.h" +#include "corba-cal-factory.h" +#include "corba-cal.h" + +typedef struct { + POA_GNOME_Calendar_Repository servant; + GnomeCalendar *calendar; +} CalendarServant; + +/* + * Vectors + */ +static POA_GNOME_Calendar_Repository__epv calendar_repository_epv; +static POA_GNOME_Calendar_Repository__vepv calendar_repository_vepv; + +/* + * Servant and Object Factory + */ +static POA_GNOME_Calendar_Repository calendar_repository_servant; + +static inline GnomeCalendar * +gnomecal_from_servant (PortableServer_Servant servant) +{ + CalendarServant *cs = (CalendarServant *) servant; + + return cs->calendar; +} + +static CORBA_char * +cal_repo_get_object (PortableServer_Servant servant, + CORBA_char *uid, + CORBA_Environment *ev) +{ + GnomeCalendar *gcal = gnomecal_from_servant (servant); + iCalObject *obj; + char *buffer; + CORBA_char *ret; + + obj = calendar_object_find_event (gcal->cal, uid); + if (obj == NULL){ + CORBA_exception_set ( + ev, + CORBA_USER_EXCEPTION, + ex_GNOME_Calendar_Repository_NotFound, + ""); + return NULL; + } + + buffer = calendar_string_from_object (obj); + ret = CORBA_string_dup (buffer); + free (buffer); + + return ret; +} + +static CORBA_char * +cal_repo_get_object_by_pilot_id (PortableServer_Servant servant, + CORBA_long pilot_id, + CORBA_Environment *ev) +{ + GnomeCalendar *gcal = gnomecal_from_servant (servant); + iCalObject *obj; + char *buffer; + CORBA_char *ret; + + obj = calendar_object_find_by_pilot (gcal->cal, pilot_id); + if (obj == NULL){ + CORBA_exception_set (ev, + CORBA_USER_EXCEPTION, + ex_GNOME_Calendar_Repository_NotFound, ""); + return NULL; + } + + buffer = calendar_string_from_object (obj); + ret = CORBA_string_dup (buffer); + free (buffer); + + return ret; + +} + +static CORBA_char * +cal_repo_get_id_from_pilot_id (PortableServer_Servant servant, + CORBA_long pilot_id, + CORBA_Environment *ev) +{ + GnomeCalendar *gcal = gnomecal_from_servant (servant); + iCalObject *obj; + + obj = calendar_object_find_by_pilot (gcal->cal, pilot_id); + if (obj == NULL){ + CORBA_exception_set (ev, + CORBA_USER_EXCEPTION, + ex_GNOME_Calendar_Repository_NotFound, ""); + return NULL; + } + + return CORBA_string_dup (obj->uid); +} + +static void +cal_repo_delete_object (PortableServer_Servant servant, + CORBA_char *uid, + CORBA_Environment *ev) +{ + GnomeCalendar *gcal = gnomecal_from_servant (servant); + iCalObject *obj; + + obj = calendar_object_find_event (gcal->cal, uid); + if (obj == NULL){ + CORBA_exception_set (ev, + CORBA_USER_EXCEPTION, + ex_GNOME_Calendar_Repository_NotFound, NULL); + return; + } + + gnome_calendar_remove_object (gcal, obj); +} + +static void +cal_repo_update_object (PortableServer_Servant servant, + CORBA_char *uid, + CORBA_char *vcalendar_object, + CORBA_Environment *ev) +{ + GnomeCalendar *gcal = gnomecal_from_servant (servant); + iCalObject *obj; + iCalObject *new_object; + + new_object = ical_object_new_from_string (vcalendar_object); + + obj = calendar_object_find_event (gcal->cal, uid); + if (obj != NULL){ + calendar_remove_object (gcal->cal, obj); + } + + calendar_add_object (gcal->cal, new_object); +} + +static void +cal_repo_done (PortableServer_Servant servant, + CORBA_Environment *ev) +{ + GnomeCalendar *gcal = gnomecal_from_servant (servant); + + calendar_save (gcal->cal, NULL); +} + +static void +init_calendar_repo_class (void) +{ + calendar_repository_epv.get_object = cal_repo_get_object; + calendar_repository_epv.get_object_by_pilot_id = cal_repo_get_object_by_pilot_id; + calendar_repository_epv.get_id_from_pilot_id = cal_repo_get_id_from_pilot_id; + calendar_repository_epv.delete_object = cal_repo_delete_object; + calendar_repository_epv.update_object = cal_repo_update_object; + calendar_repository_epv.done = cal_repo_done; + + calendar_repository_vepv.GNOME_Calendar_Repository_epv = + &calendar_repository_epv; + + calendar_repository_servant.vepv = &calendar_repository_vepv; +} + +/* + * Initializes the CORBA parts of the @calendar object + */ +void +gnome_calendar_create_corba_server (GnomeCalendar *calendar) +{ + static gboolean class_inited = FALSE; + CalendarServant *calendar_servant; + CORBA_Environment ev; + + if (!class_inited){ + init_calendar_repo_class (); + class_inited = TRUE; + } + + calendar_servant = g_new0 (CalendarServant, 1); + calendar_servant->servant.vepv = &calendar_repository_vepv; + calendar_servant->calendar = calendar; + + CORBA_exception_init (&ev); + POA_GNOME_Calendar_Repository__init ((PortableServer_Servant) calendar_servant, &ev); + CORBA_free ( + PortableServer_POA_activate_object (poa, calendar_servant, &ev)); + calendar->cal->corba_server = PortableServer_POA_servant_to_reference ( + poa, calendar_servant, &ev); + CORBA_exception_free (&ev); +} + |