diff options
Diffstat (limited to 'calendar/pcs/cal.c')
-rw-r--r-- | calendar/pcs/cal.c | 1251 |
1 files changed, 774 insertions, 477 deletions
diff --git a/calendar/pcs/cal.c b/calendar/pcs/cal.c index 0f20d88186..a88e9a146c 100644 --- a/calendar/pcs/cal.c +++ b/calendar/pcs/cal.c @@ -25,10 +25,10 @@ #endif #include <libical/ical.h> +#include <bonobo/bonobo-main.h> #include <bonobo/bonobo-exception.h> -#include "cal.h" #include "cal-backend.h" -#include "query.h" +#include "cal.h" #define PARENT_TYPE BONOBO_TYPE_OBJECT @@ -43,7 +43,6 @@ struct _CalPrivate { GNOME_Evolution_Calendar_Listener listener; }; - /* Cal::get_uri method */ static CORBA_char * impl_Cal_get_uri (PortableServer_Servant servant, @@ -63,8 +62,35 @@ impl_Cal_get_uri (PortableServer_Servant servant, return str_uri_copy; } +static void +impl_Cal_open (PortableServer_Servant servant, + CORBA_boolean only_if_exists, + CORBA_Environment *ev) +{ + Cal *cal; + CalPrivate *priv; + + cal = CAL (bonobo_object_from_servant (servant)); + priv = cal->priv; + + cal_backend_open (priv->backend, cal, only_if_exists); +} + +static void +impl_Cal_remove (PortableServer_Servant servant, + CORBA_Environment *ev) +{ + Cal *cal; + CalPrivate *priv; + + cal = CAL (bonobo_object_from_servant (servant)); + priv = cal->priv; + + cal_backend_remove (priv->backend, cal); +} + /* Cal::isReadOnly method */ -static CORBA_boolean +static void impl_Cal_isReadOnly (PortableServer_Servant servant, CORBA_Environment *ev) { @@ -74,109 +100,63 @@ impl_Cal_isReadOnly (PortableServer_Servant servant, cal = CAL (bonobo_object_from_servant (servant)); priv = cal->priv; - return cal_backend_is_read_only (priv->backend); + cal_backend_is_read_only (priv->backend, cal); } /* Cal::getEmailAddress method */ -static CORBA_char * +static void impl_Cal_getCalAddress (PortableServer_Servant servant, - CORBA_Environment *ev) + CORBA_Environment *ev) { Cal *cal; CalPrivate *priv; - const char *str_cal_address; - CORBA_char *str_cal_address_copy; cal = CAL (bonobo_object_from_servant (servant)); priv = cal->priv; - str_cal_address = cal_backend_get_cal_address (priv->backend); - if (str_cal_address == NULL) { - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_Cal_NotFound); - return CORBA_OBJECT_NIL; - } - - str_cal_address_copy = CORBA_string_dup (str_cal_address); - - return str_cal_address_copy; + cal_backend_get_cal_address (priv->backend, cal); } /* Cal::get_alarm_email_address method */ -static CORBA_char * +static void impl_Cal_getAlarmEmailAddress (PortableServer_Servant servant, CORBA_Environment *ev) { Cal *cal; CalPrivate *priv; - const char *str_email_address; - CORBA_char *str_email_address_copy; - + cal = CAL (bonobo_object_from_servant (servant)); priv = cal->priv; - - str_email_address = cal_backend_get_alarm_email_address (priv->backend); - if (str_email_address == NULL) { - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_Cal_NotFound); - return CORBA_OBJECT_NIL; - } - - str_email_address_copy = CORBA_string_dup (str_email_address); - return str_email_address_copy; + cal_backend_get_alarm_email_address (priv->backend, cal); } /* Cal::get_ldap_attribute method */ -static CORBA_char * +static void impl_Cal_getLdapAttribute (PortableServer_Servant servant, CORBA_Environment *ev) { Cal *cal; CalPrivate *priv; - const char *str_ldap_attr; - CORBA_char *str_ldap_attr_copy; cal = CAL (bonobo_object_from_servant (servant)); priv = cal->priv; - str_ldap_attr = cal_backend_get_ldap_attribute (priv->backend); - if (str_ldap_attr == NULL) { - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_Cal_NotFound); - return CORBA_OBJECT_NIL; - } - - str_ldap_attr_copy = CORBA_string_dup (str_ldap_attr); - - return str_ldap_attr_copy; + cal_backend_get_ldap_attribute (priv->backend, cal); } /* Cal::getSchedulingInformation method */ -static CORBA_char * +static void impl_Cal_getStaticCapabilities (PortableServer_Servant servant, CORBA_Environment *ev) { Cal *cal; CalPrivate *priv; - const char *cap; - CORBA_char *cap_copy; cal = CAL (bonobo_object_from_servant (servant)); priv = cal->priv; - cap = cal_backend_get_static_capabilities (priv->backend); - cap_copy = CORBA_string_dup (cap == NULL ? "" : cap); - - return cap_copy; -} - -/* Converts a calendar object type from its CORBA representation to our own - * representation. - */ -static CalObjType -uncorba_obj_type (GNOME_Evolution_Calendar_CalObjType type) -{ - return (((type & GNOME_Evolution_Calendar_TYPE_EVENT) ? CALOBJ_TYPE_EVENT : 0) - | ((type & GNOME_Evolution_Calendar_TYPE_TODO) ? CALOBJ_TYPE_TODO : 0) - | ((type & GNOME_Evolution_Calendar_TYPE_JOURNAL) ? CALOBJ_TYPE_JOURNAL : 0)); + cal_backend_get_static_capabilities (priv->backend, cal); } /* Cal::setMode method */ @@ -194,208 +174,68 @@ impl_Cal_setMode (PortableServer_Servant servant, cal_backend_set_mode (priv->backend, mode); } -/* Cal::countObjects method */ -static CORBA_long -impl_Cal_countObjects (PortableServer_Servant servant, - GNOME_Evolution_Calendar_CalObjType type, - CORBA_Environment *ev) -{ - Cal *cal; - CalPrivate *priv; - int t; - int n; - - cal = CAL (bonobo_object_from_servant (servant)); - priv = cal->priv; - - t = uncorba_obj_type (type); - n = cal_backend_get_n_objects (priv->backend, t); - return n; -} - -static GNOME_Evolution_Calendar_CalObj +static void impl_Cal_getDefaultObject (PortableServer_Servant servant, - GNOME_Evolution_Calendar_CalObjType type, - CORBA_Environment *ev) + CORBA_Environment *ev) { Cal *cal; CalPrivate *priv; - GNOME_Evolution_Calendar_CalObj calobj_copy; - char *calobj; - cal = CAL (bonobo_object_from_servant (servant)); priv = cal->priv; - calobj = cal_backend_get_default_object (priv->backend, type); - calobj_copy = CORBA_string_dup (calobj); - g_free (calobj); - - return calobj_copy; + cal_backend_get_default_object (priv->backend, cal); } /* Cal::getObject method */ -static GNOME_Evolution_Calendar_CalObj +static void impl_Cal_getObject (PortableServer_Servant servant, const CORBA_char *uid, + const CORBA_char *rid, CORBA_Environment *ev) { Cal *cal; CalPrivate *priv; - char *calobj; cal = CAL (bonobo_object_from_servant (servant)); priv = cal->priv; - calobj = cal_backend_get_object (priv->backend, uid); - - if (calobj) { - CORBA_char *calobj_copy; - - calobj_copy = CORBA_string_dup (calobj); - g_free (calobj); - return calobj_copy; - } else { - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_Cal_NotFound); - - return NULL; - } -} - -static GNOME_Evolution_Calendar_CalObjUIDSeq * -build_uid_seq (GList *uids) -{ - GNOME_Evolution_Calendar_CalObjUIDSeq *seq; - GList *l; - int n, i; - - n = g_list_length (uids); - - seq = GNOME_Evolution_Calendar_CalObjUIDSeq__alloc (); - CORBA_sequence_set_release (seq, TRUE); - seq->_length = n; - seq->_buffer = CORBA_sequence_GNOME_Evolution_Calendar_CalObjUID_allocbuf (n); - - /* Fill the sequence */ - - for (i = 0, l = uids; l; i++, l = l->next) { - char *uid; - - uid = l->data; - seq->_buffer[i] = CORBA_string_dup (uid); - } - - return seq; + cal_backend_get_object (priv->backend, cal, uid, rid); } -/* Cal::getUIDs method */ -static GNOME_Evolution_Calendar_CalObjUIDSeq * -impl_Cal_getUIDs (PortableServer_Servant servant, - GNOME_Evolution_Calendar_CalObjType type, - CORBA_Environment *ev) +/* Cal::getObjectsInRange method */ +static void +impl_Cal_getObjectList (PortableServer_Servant servant, + const CORBA_char *query, + CORBA_Environment *ev) { Cal *cal; CalPrivate *priv; - GList *uids; - GNOME_Evolution_Calendar_CalObjUIDSeq *seq; - int t; - + cal = CAL (bonobo_object_from_servant (servant)); priv = cal->priv; - t = uncorba_obj_type (type); - - uids = cal_backend_get_uids (priv->backend, t); - seq = build_uid_seq (uids); - - cal_obj_uid_list_free (uids); - - return seq; + cal_backend_get_object_list (priv->backend, cal, query); } /* Cal::getChanges method */ -static GNOME_Evolution_Calendar_CalObjChangeSeq * +static void impl_Cal_getChanges (PortableServer_Servant servant, GNOME_Evolution_Calendar_CalObjType type, const CORBA_char *change_id, CORBA_Environment *ev) { - Cal *cal; - CalPrivate *priv; - int t; - - cal = CAL (bonobo_object_from_servant (servant)); - priv = cal->priv; - - t = uncorba_obj_type (type); - - return cal_backend_get_changes (priv->backend, t, change_id); -} - -/* Cal::getObjectsInRange method */ -static GNOME_Evolution_Calendar_CalObjUIDSeq * -impl_Cal_getObjectsInRange (PortableServer_Servant servant, - GNOME_Evolution_Calendar_CalObjType type, - GNOME_Evolution_Calendar_Time_t start, - GNOME_Evolution_Calendar_Time_t end, - CORBA_Environment *ev) -{ - Cal *cal; - CalPrivate *priv; - int t; - time_t t_start, t_end; - GNOME_Evolution_Calendar_CalObjUIDSeq *seq; - GList *uids; - - cal = CAL (bonobo_object_from_servant (servant)); - priv = cal->priv; - - t = uncorba_obj_type (type); - t_start = (time_t) start; - t_end = (time_t) end; - - if (t_start > t_end || t_start == -1 || t_end == -1) { - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_Cal_InvalidRange); - return NULL; - } - - uids = cal_backend_get_objects_in_range (priv->backend, t, t_start, t_end); - seq = build_uid_seq (uids); - - cal_obj_uid_list_free (uids); - - return seq; -} - -static GNOME_Evolution_Calendar_CalObjSeq * -build_fb_seq (GList *obj_list) -{ - GNOME_Evolution_Calendar_CalObjSeq *seq; - GList *l; - int n, i; - - n = g_list_length (obj_list); - - seq = GNOME_Evolution_Calendar_CalObjSeq__alloc (); - CORBA_sequence_set_release (seq, TRUE); - seq->_maximum = n; - seq->_length = n; - seq->_buffer = CORBA_sequence_GNOME_Evolution_Calendar_CalObj_allocbuf (n); + Cal *cal; + CalPrivate *priv; - /* Fill the sequence */ + cal = CAL (bonobo_object_from_servant (servant)); + priv = cal->priv; - for (i = 0, l = obj_list; l; i++, l = l->next) { - char *calobj; - - calobj = l->data; - seq->_buffer[i] = CORBA_string_dup (calobj); - } - - return seq; + cal_backend_get_changes (priv->backend, cal, type, change_id); } /* Cal::getFreeBusy method */ -static GNOME_Evolution_Calendar_CalObjSeq * +static void impl_Cal_getFreeBusy (PortableServer_Servant servant, const GNOME_Evolution_Calendar_UserList *user_list, const GNOME_Evolution_Calendar_Time_t start, @@ -404,22 +244,11 @@ impl_Cal_getFreeBusy (PortableServer_Servant servant, { Cal *cal; CalPrivate *priv; - time_t t_start, t_end; GList *users = NULL; - GList *obj_list; - GNOME_Evolution_Calendar_CalObjSeq *seq; cal = CAL (bonobo_object_from_servant (servant)); priv = cal->priv; - t_start = (time_t) start; - t_end = (time_t) end; - - if (t_start > t_end || t_start == -1 || t_end == -1) { - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_Cal_InvalidRange); - return build_fb_seq (NULL); - } - /* convert the CORBA user list to a GList */ if (user_list) { int i; @@ -429,297 +258,181 @@ impl_Cal_getFreeBusy (PortableServer_Servant servant, } /* call the backend's get_free_busy method */ - obj_list = cal_backend_get_free_busy (priv->backend, users, t_start, t_end); - seq = build_fb_seq (obj_list); - g_list_free (users); - - if (obj_list == NULL) - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_Cal_NotFound); - - return seq; + cal_backend_get_free_busy (priv->backend, cal, users, start, end); } -/* Cal::getAlarmsInRange method */ -static GNOME_Evolution_Calendar_CalComponentAlarmsSeq * -impl_Cal_getAlarmsInRange (PortableServer_Servant servant, - GNOME_Evolution_Calendar_Time_t start, - GNOME_Evolution_Calendar_Time_t end, - CORBA_Environment *ev) +/* Cal::discardAlarm method */ +static void +impl_Cal_discardAlarm (PortableServer_Servant servant, + const CORBA_char *uid, + const CORBA_char *auid, + CORBA_Environment *ev) { Cal *cal; CalPrivate *priv; - time_t t_start, t_end; - gboolean valid_range; - GNOME_Evolution_Calendar_CalComponentAlarmsSeq *seq; cal = CAL (bonobo_object_from_servant (servant)); priv = cal->priv; - t_start = (time_t) start; - t_end = (time_t) end; - - seq = cal_backend_get_alarms_in_range (priv->backend, t_start, t_end, &valid_range); - if (!valid_range) { - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_Cal_InvalidRange); - return NULL; - } - - if (!seq) { - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_Cal_NotFound); - return NULL; - } - - return seq; + cal_backend_discard_alarm (priv->backend, cal, uid, auid); } -/* Cal::getAlarmsForObject method */ -static GNOME_Evolution_Calendar_CalComponentAlarms * -impl_Cal_getAlarmsForObject (PortableServer_Servant servant, - const CORBA_char *uid, - GNOME_Evolution_Calendar_Time_t start, - GNOME_Evolution_Calendar_Time_t end, - CORBA_Environment * ev) +static void +impl_Cal_createObject (PortableServer_Servant servant, + const CORBA_char *calobj, + CORBA_Environment *ev) { Cal *cal; CalPrivate *priv; - time_t t_start, t_end; - GNOME_Evolution_Calendar_CalComponentAlarms *alarms; - CalBackendGetAlarmsForObjectResult result; cal = CAL (bonobo_object_from_servant (servant)); priv = cal->priv; - t_start = (time_t) start; - t_end = (time_t) end; - - alarms = cal_backend_get_alarms_for_object (priv->backend, uid, t_start, t_end, &result); - - switch (result) { - case CAL_BACKEND_GET_ALARMS_SUCCESS: - return alarms; - - case CAL_BACKEND_GET_ALARMS_NOT_FOUND: - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_Cal_NotFound); - return NULL; - - case CAL_BACKEND_GET_ALARMS_INVALID_RANGE: - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_Cal_InvalidRange); - return NULL; - - default: - g_assert_not_reached (); - return NULL; - } + cal_backend_create_object (priv->backend, cal, calobj); } -/* Cal::discardAlarm method */ static void -impl_Cal_discardAlarm (PortableServer_Servant servant, - const CORBA_char *uid, - const CORBA_char *auid, +impl_Cal_modifyObject (PortableServer_Servant servant, + const CORBA_char *calobj, + const GNOME_Evolution_Calendar_CalObjModType mod, CORBA_Environment *ev) { Cal *cal; CalPrivate *priv; - CalBackendResult result; cal = CAL (bonobo_object_from_servant (servant)); priv = cal->priv; - result = cal_backend_discard_alarm (priv->backend, uid, auid); - if (result == CAL_BACKEND_RESULT_NOT_FOUND) - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_Cal_NotFound); + cal_backend_modify_object (priv->backend, cal, calobj, mod); } -/* Cal::updateObjects method */ +/* Cal::removeObject method */ static void -impl_Cal_updateObjects (PortableServer_Servant servant, - const CORBA_char *calobj, - const GNOME_Evolution_Calendar_CalObjModType mod, - CORBA_Environment *ev) +impl_Cal_removeObject (PortableServer_Servant servant, + const CORBA_char *uid, + const CORBA_char *rid, + const GNOME_Evolution_Calendar_CalObjModType mod, + CORBA_Environment *ev) { Cal *cal; CalPrivate *priv; - CalBackendResult result; cal = CAL (bonobo_object_from_servant (servant)); priv = cal->priv; - result = cal_backend_update_objects (priv->backend, calobj, mod); - switch (result) { - case CAL_BACKEND_RESULT_INVALID_OBJECT : - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_Cal_InvalidObject); - break; - case CAL_BACKEND_RESULT_NOT_FOUND : - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_Cal_NotFound); - break; - case CAL_BACKEND_RESULT_PERMISSION_DENIED : - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_Cal_PermissionDenied); - break; - default : - break; - } + cal_backend_remove_object (priv->backend, cal, uid, rid, mod); } -/* Cal::removeObject method */ static void -impl_Cal_removeObject (PortableServer_Servant servant, - const CORBA_char *uid, - const GNOME_Evolution_Calendar_CalObjModType mod, - CORBA_Environment *ev) +impl_Cal_receiveObjects (PortableServer_Servant servant, const CORBA_char *calobj, CORBA_Environment *ev) { Cal *cal; CalPrivate *priv; - CalBackendResult result; cal = CAL (bonobo_object_from_servant (servant)); priv = cal->priv; - result = cal_backend_remove_object (priv->backend, uid, mod); - switch (result) { - case CAL_BACKEND_RESULT_INVALID_OBJECT : - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_Cal_InvalidObject); - break; - case CAL_BACKEND_RESULT_NOT_FOUND : - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_Cal_NotFound); - break; - case CAL_BACKEND_RESULT_PERMISSION_DENIED : - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_Cal_PermissionDenied); - break; - default : - break; - } + cal_backend_receive_objects (priv->backend, cal, calobj); } -/* Cal::sendObject method */ -static GNOME_Evolution_Calendar_CalObj -impl_Cal_sendObject (PortableServer_Servant servant, - const CORBA_char *calobj, - GNOME_Evolution_Calendar_UserList **user_list, - CORBA_Environment *ev) +static void +impl_Cal_sendObjects (PortableServer_Servant servant, const CORBA_char *calobj, CORBA_Environment *ev) { Cal *cal; CalPrivate *priv; - CORBA_char *calobj_copy; - char *new_calobj; - GNOME_Evolution_Calendar_Cal_Busy *err; - CalBackendSendResult result; - char error_msg[256]; - + cal = CAL (bonobo_object_from_servant (servant)); priv = cal->priv; - result = cal_backend_send_object (priv->backend, calobj, &new_calobj, user_list, error_msg); - switch (result) { - case CAL_BACKEND_SEND_SUCCESS: - calobj_copy = CORBA_string_dup (new_calobj); - g_free (new_calobj); - - return calobj_copy; - - case CAL_BACKEND_SEND_INVALID_OBJECT: - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_Cal_InvalidObject); - break; - - case CAL_BACKEND_SEND_BUSY: - err = GNOME_Evolution_Calendar_Cal_Busy__alloc (); - err->errorMsg = CORBA_string_dup (error_msg); - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, ex_GNOME_Evolution_Calendar_Cal_Busy, err); - break; - - case CAL_BACKEND_SEND_PERMISSION_DENIED: - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_Cal_PermissionDenied); - break; - - default : - g_assert_not_reached (); - } - - return NULL; + cal_backend_send_objects (priv->backend, cal, calobj); } /* Cal::getQuery implementation */ -static GNOME_Evolution_Calendar_Query +static void impl_Cal_getQuery (PortableServer_Servant servant, const CORBA_char *sexp, GNOME_Evolution_Calendar_QueryListener ql, CORBA_Environment *ev) { + Cal *cal; CalPrivate *priv; Query *query; - CORBA_Environment ev2; - GNOME_Evolution_Calendar_Query query_copy; - + CalBackendObjectSExp *obj_sexp; + cal = CAL (bonobo_object_from_servant (servant)); priv = cal->priv; - query = cal_backend_get_query (priv->backend, ql, sexp); - if (!query) { - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_Cal_CouldNotCreate); - return CORBA_OBJECT_NIL; + /* we handle this entirely here, since it doesn't require any + backend involvement now that we have pas_book_view_start to + actually kick off the search. */ + + obj_sexp = cal_backend_object_sexp_new (sexp); + if (!obj_sexp) { + cal_notify_query (cal, GNOME_Evolution_Calendar_InvalidQuery, NULL); + + return; } - CORBA_exception_init (&ev2); - query_copy = CORBA_Object_duplicate (BONOBO_OBJREF (query), &ev2); - if (BONOBO_EX (&ev2)) { - bonobo_object_unref (query); - CORBA_exception_free (&ev2); - g_message ("Cal_get_query(): Could not duplicate the query reference"); - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_Cal_CouldNotCreate); - return CORBA_OBJECT_NIL; + query = query_new (priv->backend, ql, obj_sexp); + if (!query) { + g_object_unref (obj_sexp); + cal_notify_query (cal, GNOME_Evolution_Calendar_OtherError, NULL); + + return; } - CORBA_exception_free (&ev2); + cal_backend_add_query (priv->backend, query); + + cal_notify_query (cal, GNOME_Evolution_Calendar_Success, query); - return query_copy; + g_object_unref (query); } -/* Cal::setDefaultTimezone method */ + +/* Cal::getTimezone method */ static void -impl_Cal_setDefaultTimezone (PortableServer_Servant servant, - const CORBA_char *tzid, - CORBA_Environment *ev) +impl_Cal_getTimezone (PortableServer_Servant servant, + const CORBA_char *tzid, + CORBA_Environment *ev) { Cal *cal; CalPrivate *priv; - gboolean zone_set; cal = CAL (bonobo_object_from_servant (servant)); priv = cal->priv; - zone_set = cal_backend_set_default_timezone (priv->backend, tzid); - - if (!zone_set) { - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_Cal_NotFound); - } + cal_backend_get_timezone (priv->backend, cal, tzid); } -/* Cal::getTimezoneObject method */ -static GNOME_Evolution_Calendar_CalObj -impl_Cal_getTimezoneObject (PortableServer_Servant servant, - const CORBA_char *tzid, - CORBA_Environment *ev) +/* Cal::addTimezone method */ +static void +impl_Cal_addTimezone (PortableServer_Servant servant, + const CORBA_char *tz, + CORBA_Environment *ev) { Cal *cal; CalPrivate *priv; - char *calobj; cal = CAL (bonobo_object_from_servant (servant)); priv = cal->priv; - calobj = cal_backend_get_timezone_object (priv->backend, tzid); + cal_backend_add_timezone (priv->backend, cal, tz); +} - if (calobj) { - CORBA_char *calobj_copy; +/* Cal::setDefaultTimezone method */ +static void +impl_Cal_setDefaultTimezone (PortableServer_Servant servant, + const CORBA_char *tzid, + CORBA_Environment *ev) +{ + Cal *cal; + CalPrivate *priv; - calobj_copy = CORBA_string_dup (calobj); - g_free (calobj); - return calobj_copy; - } else { - bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_Cal_NotFound); - return NULL; - } + cal = CAL (bonobo_object_from_servant (servant)); + priv = cal->priv; + + cal_backend_set_default_timezone (priv->backend, cal, tzid); } /** @@ -762,7 +475,7 @@ cal_construct (Cal *cal, CORBA_exception_free (&ev); priv->backend = backend; - + return cal; } @@ -778,18 +491,20 @@ cal_construct (Cal *cal, * if its corresponding CORBA object could not be created. **/ Cal * -cal_new (CalBackend *backend, GNOME_Evolution_Calendar_Listener listener) +cal_new (CalBackend *backend, const char *uri, GNOME_Evolution_Calendar_Listener listener) { Cal *cal, *retval; g_return_val_if_fail (backend != NULL, NULL); g_return_val_if_fail (IS_CAL_BACKEND (backend), NULL); - cal = CAL (g_object_new (CAL_TYPE, NULL)); + cal = CAL (g_object_new (CAL_TYPE, + "poa", bonobo_poa_get_threaded (ORBIT_THREAD_HINT_PER_REQUEST, NULL), + NULL)); retval = cal_construct (cal, backend, listener); if (!retval) { - g_message ("cal_new(): could not construct the calendar client interface"); + g_message (G_STRLOC ": could not construct the calendar client interface"); bonobo_object_unref (BONOBO_OBJECT (cal)); return NULL; } @@ -797,6 +512,24 @@ cal_new (CalBackend *backend, GNOME_Evolution_Calendar_Listener listener) return retval; } +CalBackend * +cal_get_backend (Cal *cal) +{ + g_return_val_if_fail (cal != NULL, NULL); + g_return_val_if_fail (IS_CAL (cal), NULL); + + return cal->priv->backend; +} + +GNOME_Evolution_Calendar_Listener +cal_get_listener (Cal *cal) +{ + g_return_val_if_fail (cal != NULL, NULL); + g_return_val_if_fail (IS_CAL (cal), NULL); + + return cal->priv->listener; +} + /* Destroy handler for the calendar */ static void cal_finalize (GObject *object) @@ -812,11 +545,11 @@ cal_finalize (GObject *object) priv = cal->priv; priv->backend = NULL; - + CORBA_exception_init (&ev); bonobo_object_release_unref (priv->listener, &ev); if (BONOBO_EX (&ev)) - g_message ("cal_destroy(): could not release the listener"); + g_message (G_STRLOC ": could not release the listener"); priv->listener = NULL; CORBA_exception_free (&ev); @@ -843,27 +576,28 @@ cal_class_init (CalClass *klass) /* Epv methods */ epv->_get_uri = impl_Cal_get_uri; + epv->open = impl_Cal_open; + epv->remove = impl_Cal_remove; epv->isReadOnly = impl_Cal_isReadOnly; epv->getCalAddress = impl_Cal_getCalAddress; epv->getAlarmEmailAddress = impl_Cal_getAlarmEmailAddress; epv->getLdapAttribute = impl_Cal_getLdapAttribute; epv->getStaticCapabilities = impl_Cal_getStaticCapabilities; epv->setMode = impl_Cal_setMode; - epv->countObjects = impl_Cal_countObjects; epv->getDefaultObject = impl_Cal_getDefaultObject; epv->getObject = impl_Cal_getObject; + epv->getTimezone = impl_Cal_getTimezone; + epv->addTimezone = impl_Cal_addTimezone; epv->setDefaultTimezone = impl_Cal_setDefaultTimezone; - epv->getTimezoneObject = impl_Cal_getTimezoneObject; - epv->getUIDs = impl_Cal_getUIDs; + epv->getObjectList = impl_Cal_getObjectList; epv->getChanges = impl_Cal_getChanges; - epv->getObjectsInRange = impl_Cal_getObjectsInRange; epv->getFreeBusy = impl_Cal_getFreeBusy; - epv->getAlarmsInRange = impl_Cal_getAlarmsInRange; - epv->getAlarmsForObject = impl_Cal_getAlarmsForObject; epv->discardAlarm = impl_Cal_discardAlarm; - epv->updateObjects = impl_Cal_updateObjects; + epv->createObject = impl_Cal_createObject; + epv->modifyObject = impl_Cal_modifyObject; epv->removeObject = impl_Cal_removeObject; - epv->sendObject = impl_Cal_sendObject; + epv->receiveObjects = impl_Cal_receiveObjects; + epv->sendObjects = impl_Cal_sendObjects; epv->getQuery = impl_Cal_getQuery; } @@ -882,18 +616,50 @@ cal_init (Cal *cal, CalClass *klass) BONOBO_TYPE_FUNC_FULL (Cal, GNOME_Evolution_Calendar_Cal, PARENT_TYPE, cal); -/** - * cal_notify_mode: - * @cal: A calendar client interface. - * @status: Status of the mode set. - * @mode: The current mode. - * - * Notifys the listener of the results of a setMode call. - **/ +void +cal_notify_read_only (Cal *cal, GNOME_Evolution_Calendar_CallStatus status, gboolean read_only) +{ + CalPrivate *priv; + CORBA_Environment ev; + + g_return_if_fail (cal != NULL); + g_return_if_fail (IS_CAL (cal)); + + priv = cal->priv; + g_return_if_fail (priv->listener != CORBA_OBJECT_NIL); + + CORBA_exception_init (&ev); + GNOME_Evolution_Calendar_Listener_notifyReadOnly (priv->listener, status, read_only, &ev); + + if (BONOBO_EX (&ev)) + g_message (G_STRLOC ": could not notify the listener of read only"); + + CORBA_exception_free (&ev); +} + +void +cal_notify_cal_address (Cal *cal, GNOME_Evolution_Calendar_CallStatus status, const char *address) +{ + CalPrivate *priv; + CORBA_Environment ev; + + g_return_if_fail (cal != NULL); + g_return_if_fail (IS_CAL (cal)); + + priv = cal->priv; + g_return_if_fail (priv->listener != CORBA_OBJECT_NIL); + + CORBA_exception_init (&ev); + GNOME_Evolution_Calendar_Listener_notifyCalAddress (priv->listener, status, address ? address : "", &ev); + + if (BONOBO_EX (&ev)) + g_message (G_STRLOC ": could not notify the listener of cal address"); + + CORBA_exception_free (&ev); +} + void -cal_notify_mode (Cal *cal, - GNOME_Evolution_Calendar_Listener_SetModeStatus status, - GNOME_Evolution_Calendar_CalMode mode) +cal_notify_alarm_email_address (Cal *cal, GNOME_Evolution_Calendar_CallStatus status, const char *address) { CalPrivate *priv; CORBA_Environment ev; @@ -905,75 +671,606 @@ cal_notify_mode (Cal *cal, g_return_if_fail (priv->listener != CORBA_OBJECT_NIL); CORBA_exception_init (&ev); - GNOME_Evolution_Calendar_Listener_notifyCalSetMode (priv->listener, status, mode, &ev); + GNOME_Evolution_Calendar_Listener_notifyAlarmEmailAddress (priv->listener, status, address ? address : "", &ev); if (BONOBO_EX (&ev)) - g_message ("cal_notify_mode(): could not notify the listener " - "about a mode change"); + g_message (G_STRLOC ": could not notify the listener of alarm address"); + + CORBA_exception_free (&ev); +} + +void +cal_notify_ldap_attribute (Cal *cal, GNOME_Evolution_Calendar_CallStatus status, const char *attribute) +{ + CalPrivate *priv; + CORBA_Environment ev; + + g_return_if_fail (cal != NULL); + g_return_if_fail (IS_CAL (cal)); + + priv = cal->priv; + g_return_if_fail (priv->listener != CORBA_OBJECT_NIL); + + CORBA_exception_init (&ev); + GNOME_Evolution_Calendar_Listener_notifyLDAPAttribute (priv->listener, status, attribute ? attribute : "", &ev); + + if (BONOBO_EX (&ev)) + g_message (G_STRLOC ": could not notify the listener of ldap attribute"); + + CORBA_exception_free (&ev); +} + +void +cal_notify_static_capabilities (Cal *cal, GNOME_Evolution_Calendar_CallStatus status, const char *capabilities) +{ + CalPrivate *priv; + CORBA_Environment ev; + + g_return_if_fail (cal != NULL); + g_return_if_fail (IS_CAL (cal)); + + priv = cal->priv; + g_return_if_fail (priv->listener != CORBA_OBJECT_NIL); + + CORBA_exception_init (&ev); + GNOME_Evolution_Calendar_Listener_notifyStaticCapabilities (priv->listener, status, + capabilities ? capabilities : "", &ev); + + if (BONOBO_EX (&ev)) + g_message (G_STRLOC ": could not notify the listener of static capabilities"); + + CORBA_exception_free (&ev); +} + +void +cal_notify_open (Cal *cal, GNOME_Evolution_Calendar_CallStatus status) +{ + CalPrivate *priv; + CORBA_Environment ev; + + g_return_if_fail (cal != NULL); + g_return_if_fail (IS_CAL (cal)); + + priv = cal->priv; + g_return_if_fail (priv->listener != CORBA_OBJECT_NIL); + + CORBA_exception_init (&ev); + GNOME_Evolution_Calendar_Listener_notifyCalOpened (priv->listener, status, &ev); + + if (BONOBO_EX (&ev)) + g_message (G_STRLOC ": could not notify the listener of open"); + + CORBA_exception_free (&ev); +} + +void +cal_notify_remove (Cal *cal, GNOME_Evolution_Calendar_CallStatus status) +{ + CalPrivate *priv; + CORBA_Environment ev; + + g_return_if_fail (cal != NULL); + g_return_if_fail (IS_CAL (cal)); + + priv = cal->priv; + g_return_if_fail (priv->listener != CORBA_OBJECT_NIL); + + CORBA_exception_init (&ev); + GNOME_Evolution_Calendar_Listener_notifyCalRemoved (priv->listener, status, &ev); + + if (BONOBO_EX (&ev)) + g_message (G_STRLOC ": could not notify the listener of remove"); + + CORBA_exception_free (&ev); +} + +void +cal_notify_object_created (Cal *cal, GNOME_Evolution_Calendar_CallStatus status, + const char *uid, const char *object) +{ + CalPrivate *priv; + EList *queries; + EIterator *iter; + CORBA_Environment ev; + + g_return_if_fail (cal != NULL); + g_return_if_fail (IS_CAL (cal)); + + priv = cal->priv; + g_return_if_fail (priv->listener != CORBA_OBJECT_NIL); + + queries = cal_backend_get_queries (priv->backend); + iter = e_list_get_iterator (queries); + + while (e_iterator_is_valid (iter)) { + Query *query = QUERY (e_iterator_get (iter)); + + bonobo_object_dup_ref (BONOBO_OBJREF (query), NULL); + + if (!query_object_matches (query, object)) + continue; + + query_notify_objects_added_1 (query, object); + + bonobo_object_release_unref (BONOBO_OBJREF (query), NULL); + + e_iterator_next (iter); + } + g_object_unref (iter); + g_object_unref (queries); + + CORBA_exception_init (&ev); + GNOME_Evolution_Calendar_Listener_notifyObjectCreated (priv->listener, status, uid ? uid : "", &ev); + + if (BONOBO_EX (&ev)) + g_message (G_STRLOC ": could not notify the listener of object creation"); + + CORBA_exception_free (&ev); +} + +void +cal_notify_object_modified (Cal *cal, GNOME_Evolution_Calendar_CallStatus status, + const char *old_object, const char *object) +{ + CalPrivate *priv; + EList *queries; + EIterator *iter; + CORBA_Environment ev; + + g_return_if_fail (cal != NULL); + g_return_if_fail (IS_CAL (cal)); + + priv = cal->priv; + g_return_if_fail (priv->listener != CORBA_OBJECT_NIL); + + queries = cal_backend_get_queries (priv->backend); + iter = e_list_get_iterator (queries); + + while (e_iterator_is_valid (iter)) { + Query *query = QUERY (e_iterator_get (iter)); + gboolean old_match, new_match; + + bonobo_object_dup_ref (BONOBO_OBJREF (query), NULL); + + old_match = query_object_matches (query, old_object); + new_match = query_object_matches (query, object); + if (old_match && new_match) + query_notify_objects_modified_1 (query, object); + else if (new_match) + query_notify_objects_added_1 (query, object); + else /* if (old_match) */ { + icalcomponent *comp; + + comp = icalcomponent_new_from_string ((char *)old_object); + query_notify_objects_removed_1 (query, icalcomponent_get_uid (comp)); + icalcomponent_free (comp); + } + query_notify_query_done (query, GNOME_Evolution_Calendar_Success); + + bonobo_object_release_unref (BONOBO_OBJREF (query), NULL); + + e_iterator_next (iter); + } + g_object_unref (iter); + g_object_unref (queries); + + CORBA_exception_init (&ev); + GNOME_Evolution_Calendar_Listener_notifyObjectModified (priv->listener, status, &ev); + + if (BONOBO_EX (&ev)) + g_message (G_STRLOC ": could not notify the listener of object creation"); + + CORBA_exception_free (&ev); +} + +void +cal_notify_object_removed (Cal *cal, GNOME_Evolution_Calendar_CallStatus status, + const char *uid, const char *object) +{ + CalPrivate *priv; + EList *queries; + EIterator *iter; + CORBA_Environment ev; + + g_return_if_fail (cal != NULL); + g_return_if_fail (IS_CAL (cal)); + + priv = cal->priv; + g_return_if_fail (priv->listener != CORBA_OBJECT_NIL); + + queries = cal_backend_get_queries (priv->backend); + iter = e_list_get_iterator (queries); + + while (e_iterator_is_valid (iter)) { + Query *query = QUERY (e_iterator_get (iter)); + + bonobo_object_dup_ref (BONOBO_OBJREF (query), NULL); + + if (!query_object_matches (query, object)) + continue; + + query_notify_objects_removed_1 (query, uid); + + bonobo_object_release_unref (BONOBO_OBJREF (query), NULL); + + e_iterator_next (iter); + } + g_object_unref (iter); + g_object_unref (queries); + + CORBA_exception_init (&ev); + GNOME_Evolution_Calendar_Listener_notifyObjectRemoved (priv->listener, status, &ev); + + if (BONOBO_EX (&ev)) + g_message (G_STRLOC ": could not notify the listener of object removal"); + + CORBA_exception_free (&ev); +} + +void +cal_notify_objects_received (Cal *cal, GNOME_Evolution_Calendar_CallStatus status, + GList *created, GList *modified, GList *removed) +{ + CalPrivate *priv; + EList *queries; + EIterator *iter; + CORBA_Environment ev; + + g_return_if_fail (cal != NULL); + g_return_if_fail (IS_CAL (cal)); + + priv = cal->priv; + g_return_if_fail (priv->listener != CORBA_OBJECT_NIL); + + queries = cal_backend_get_queries (priv->backend); + iter = e_list_get_iterator (queries); + + while (e_iterator_is_valid (iter)) { + Query *query = QUERY (e_iterator_get (iter)); + + bonobo_object_dup_ref (BONOBO_OBJREF (query), NULL); + + query_notify_objects_added (query, created); + query_notify_objects_modified (query, modified); + query_notify_objects_removed (query, removed); + + bonobo_object_release_unref (BONOBO_OBJREF (query), NULL); + + e_iterator_next (iter); + } + g_object_unref (iter); + g_object_unref (queries); + + CORBA_exception_init (&ev); + GNOME_Evolution_Calendar_Listener_notifyObjectsReceived (priv->listener, status, &ev); + + if (BONOBO_EX (&ev)) + g_message (G_STRLOC ": could not notify the listener of objects received"); + + CORBA_exception_free (&ev); +} + +void +cal_notify_alarm_discarded (Cal *cal, GNOME_Evolution_Calendar_CallStatus status) +{ + CalPrivate *priv; + CORBA_Environment ev; + + g_return_if_fail (cal != NULL); + g_return_if_fail (IS_CAL (cal)); + + priv = cal->priv; + g_return_if_fail (priv->listener != CORBA_OBJECT_NIL); + + CORBA_exception_init (&ev); + GNOME_Evolution_Calendar_Listener_notifyAlarmDiscarded (priv->listener, status, &ev); + + if (BONOBO_EX (&ev)) + g_message (G_STRLOC ": could not notify the listener of alarm discarded"); CORBA_exception_free (&ev); } -/** - * cal_notify_update: - * @cal: A calendar client interface. - * @uid: UID of object that was updated. - * - * Notifies a listener attached to a calendar client interface object about an - * update to a calendar object. - **/ void -cal_notify_update (Cal *cal, const char *uid) +cal_notify_objects_sent (Cal *cal, GNOME_Evolution_Calendar_CallStatus status) { CalPrivate *priv; CORBA_Environment ev; g_return_if_fail (cal != NULL); g_return_if_fail (IS_CAL (cal)); - g_return_if_fail (uid != NULL); priv = cal->priv; g_return_if_fail (priv->listener != CORBA_OBJECT_NIL); CORBA_exception_init (&ev); - GNOME_Evolution_Calendar_Listener_notifyObjUpdated (priv->listener, (char *) uid, &ev); + GNOME_Evolution_Calendar_Listener_notifyObjectsSent (priv->listener, status, &ev); if (BONOBO_EX (&ev)) - g_message ("cal_notify_update(): could not notify the listener " - "about an updated object"); + g_message (G_STRLOC ": could not notify the listener of objects sent"); + + CORBA_exception_free (&ev); +} + +void +cal_notify_default_object (Cal *cal, GNOME_Evolution_Calendar_CallStatus status, char *object) +{ + CalPrivate *priv; + CORBA_Environment ev; + + g_return_if_fail (cal != NULL); + g_return_if_fail (IS_CAL (cal)); + + priv = cal->priv; + g_return_if_fail (priv->listener != CORBA_OBJECT_NIL); + + CORBA_exception_init (&ev); + + GNOME_Evolution_Calendar_Listener_notifyDefaultObjectRequested (priv->listener, status, + object ? object : "", &ev); + + if (BONOBO_EX (&ev)) + g_message (G_STRLOC ": could not notify the listener of default object"); + + CORBA_exception_free (&ev); +} + +void +cal_notify_object (Cal *cal, GNOME_Evolution_Calendar_CallStatus status, char *object) +{ + CalPrivate *priv; + CORBA_Environment ev; + + g_return_if_fail (cal != NULL); + g_return_if_fail (IS_CAL (cal)); + + priv = cal->priv; + g_return_if_fail (priv->listener != CORBA_OBJECT_NIL); + + CORBA_exception_init (&ev); + + GNOME_Evolution_Calendar_Listener_notifyObjectRequested (priv->listener, status, + object ? object : "", &ev); + + if (BONOBO_EX (&ev)) + g_message (G_STRLOC ": could not notify the listener of object"); + + CORBA_exception_free (&ev); +} + +void +cal_notify_object_list (Cal *cal, GNOME_Evolution_Calendar_CallStatus status, GList *objects) +{ + CalPrivate *priv; + CORBA_Environment ev; + GNOME_Evolution_Calendar_stringlist seq; + GList *l; + int i; + + g_return_if_fail (cal != NULL); + g_return_if_fail (IS_CAL (cal)); + + priv = cal->priv; + g_return_if_fail (priv->listener != CORBA_OBJECT_NIL); + + CORBA_exception_init (&ev); + + seq._maximum = g_list_length (objects); + seq._length = 0; + seq._buffer = GNOME_Evolution_Calendar_stringlist_allocbuf (seq._maximum); + + for (l = objects, i = 0; l; l = l->next, i++) { + seq._buffer[i] = CORBA_string_dup (l->data); + seq._length++; + } + + GNOME_Evolution_Calendar_Listener_notifyObjectListRequested (priv->listener, status, &seq, &ev); + + if (BONOBO_EX (&ev)) + g_message (G_STRLOC ": could not notify the listener of object list"); + + CORBA_exception_free (&ev); + + CORBA_free(seq._buffer); +} + +void +cal_notify_query (Cal *cal, GNOME_Evolution_Calendar_CallStatus status, Query *query) +{ + CalPrivate *priv; + CORBA_Environment ev; + + g_return_if_fail (cal != NULL); + g_return_if_fail (IS_CAL (cal)); + + priv = cal->priv; + g_return_if_fail (priv->listener != CORBA_OBJECT_NIL); + + CORBA_exception_init (&ev); + GNOME_Evolution_Calendar_Listener_notifyQuery (priv->listener, status, BONOBO_OBJREF (query), &ev); + + if (BONOBO_EX (&ev)) + g_message (G_STRLOC ": could not notify the listener of query"); + + CORBA_exception_free (&ev); +} + +void +cal_notify_timezone_requested (Cal *cal, GNOME_Evolution_Calendar_CallStatus status, const char *object) +{ + CalPrivate *priv; + CORBA_Environment ev; + + g_return_if_fail (IS_CAL (cal)); + + priv = cal->priv; + g_return_if_fail (priv->listener != CORBA_OBJECT_NIL); + + CORBA_exception_init (&ev); + GNOME_Evolution_Calendar_Listener_notifyTimezoneRequested (priv->listener, status, object ? object : "", &ev); + + if (BONOBO_EX (&ev)) + g_warning (G_STRLOC ": could not notify the listener of timezone requested"); + + CORBA_exception_free (&ev); +} + +void +cal_notify_timezone_added (Cal *cal, GNOME_Evolution_Calendar_CallStatus status, const char *tzid) +{ + CalPrivate *priv; + CORBA_Environment ev; + + g_return_if_fail (IS_CAL (cal)); + + priv = cal->priv; + g_return_if_fail (priv->listener != CORBA_OBJECT_NIL); + + CORBA_exception_init (&ev); + GNOME_Evolution_Calendar_Listener_notifyTimezoneAdded (priv->listener, status, tzid, &ev); + + if (BONOBO_EX (&ev)) + g_warning (G_STRLOC ": could not notify the listener of timezone added"); + + CORBA_exception_free (&ev); +} + +void +cal_notify_default_timezone_set (Cal *cal, GNOME_Evolution_Calendar_CallStatus status) +{ + CalPrivate *priv; + CORBA_Environment ev; + + g_return_if_fail (IS_CAL (cal)); + + priv = cal->priv; + g_return_if_fail (priv->listener != CORBA_OBJECT_NIL); + + CORBA_exception_init (&ev); + GNOME_Evolution_Calendar_Listener_notifyDefaultTimezoneSet (priv->listener, status, &ev); + + if (BONOBO_EX (&ev)) + g_warning (G_STRLOC ": could not notify the listener of default timezone set"); + + CORBA_exception_free (&ev); +} + +void +cal_notify_changes (Cal *cal, GNOME_Evolution_Calendar_CallStatus status, + GList *adds, GList *modifies, GList *deletes) +{ + CalPrivate *priv; + CORBA_Environment ev; + GNOME_Evolution_Calendar_CalObjChangeSeq seq; + GList *l; + int n, i; + + g_return_if_fail (IS_CAL (cal)); + + priv = cal->priv; + g_return_if_fail (priv->listener != CORBA_OBJECT_NIL); + + n = g_list_length (adds) + g_list_length (modifies) + g_list_length (deletes); + seq._maximum = n; + seq._length = n; + seq._buffer = CORBA_sequence_GNOME_Evolution_Calendar_CalObjChange_allocbuf (n); + + i = 0; + for (l = adds; l; i++, l = l->next) { + GNOME_Evolution_Calendar_CalObjChange *change = &seq._buffer[i]; + + change->calobj = CORBA_string_dup (l->data); + change->type = GNOME_Evolution_Calendar_ADDED; + } + + for (l = modifies; l; i++, l = l->next) { + GNOME_Evolution_Calendar_CalObjChange *change = &seq._buffer[i]; + + change->calobj = CORBA_string_dup (l->data); + change->type = GNOME_Evolution_Calendar_MODIFIED; + } + + for (l = deletes; l; i++, l = l->next) { + GNOME_Evolution_Calendar_CalObjChange *change = &seq._buffer[i]; + + change->calobj = CORBA_string_dup (l->data); + change->type = GNOME_Evolution_Calendar_DELETED; + } + + CORBA_exception_init (&ev); + GNOME_Evolution_Calendar_Listener_notifyDefaultTimezoneSet (priv->listener, status, &ev); + + CORBA_free (seq._buffer); + + if (BONOBO_EX (&ev)) + g_warning (G_STRLOC ": could not notify the listener of default timezone set"); + + CORBA_exception_free (&ev); +} + +void +cal_notify_free_busy (Cal *cal, GNOME_Evolution_Calendar_CallStatus status, GList *freebusy) +{ + CalPrivate *priv; + CORBA_Environment ev; + GNOME_Evolution_Calendar_CalObjSeq seq; + GList *l; + int n, i; + + g_return_if_fail (IS_CAL (cal)); + + priv = cal->priv; + g_return_if_fail (priv->listener != CORBA_OBJECT_NIL); + + n = g_list_length (freebusy); + seq._maximum = n; + seq._length = n; + seq._buffer = CORBA_sequence_GNOME_Evolution_Calendar_CalObj_allocbuf (n); + + for (i = 0, l = freebusy; l; i++, l = l->next) + seq._buffer[i] = CORBA_string_dup (l->data); + + CORBA_exception_init (&ev); + GNOME_Evolution_Calendar_Listener_notifyDefaultTimezoneSet (priv->listener, status, &ev); + + CORBA_free (seq._buffer); + + if (BONOBO_EX (&ev)) + g_warning (G_STRLOC ": could not notify the listener of freebusy"); CORBA_exception_free (&ev); } /** - * cal_notify_remove: + * cal_notify_mode: * @cal: A calendar client interface. - * @uid: UID of object that was removed. + * @status: Status of the mode set. + * @mode: The current mode. * - * Notifies a listener attached to a calendar client interface object about a - * calendar object that was removed. + * Notifys the listener of the results of a setMode call. **/ void -cal_notify_remove (Cal *cal, const char *uid) +cal_notify_mode (Cal *cal, + GNOME_Evolution_Calendar_Listener_SetModeStatus status, + GNOME_Evolution_Calendar_CalMode mode) { CalPrivate *priv; CORBA_Environment ev; g_return_if_fail (cal != NULL); g_return_if_fail (IS_CAL (cal)); - g_return_if_fail (uid != NULL); priv = cal->priv; g_return_if_fail (priv->listener != CORBA_OBJECT_NIL); CORBA_exception_init (&ev); - GNOME_Evolution_Calendar_Listener_notifyObjRemoved (priv->listener, (char *) uid, &ev); + GNOME_Evolution_Calendar_Listener_notifyCalSetMode (priv->listener, status, mode, &ev); if (BONOBO_EX (&ev)) - g_message ("cal_notify_remove(): could not notify the listener " - "about a removed object"); + g_message ("cal_notify_mode(): could not notify the listener " + "about a mode change"); - CORBA_exception_free (&ev); + CORBA_exception_free (&ev); } /** |