diff options
44 files changed, 1040 insertions, 358 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog index 7e5b0db773..7c210ad656 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,5 +1,74 @@ 2000-02-08 Federico Mena Quintero <federico@helixcode.com> + * evolution-calendar.idl (Cal): Added get_uids() method to get a + list of UIDs based on object types. + + * cal-backend.c (cal_backend_get_uids): Implemented get_uids() in + the backend. + + * cal.c (Cal_get_uids): Implemented get_uids() method. + + * cal-client.c (cal_client_get_uids): Implemented client-side + function. + + * cal-util.c (cal_obj_instance_list_free): Doh. Free the list, + not the last link. + (cal_obj_uid_list_free): New function to free a list of UIDs. + + * GnomeCal.idl (Repository): Removed unused method + get_object_by_id_list(). This is just for cleanup purposes and to + remind me exactly of what needs to be moved over to + evolution-calendar.idl. + (Repository): Removed unused get_objects() method. + + * corba-cal.c (init_calendar_repo_class): Removed the unused + get_objects method. + + * calobj.h (CalObjFindStatus): New status value enumeration for + the find function. + + * calobj.c (ical_object_find_in_string): New function to parse a + complete calendar and find a calendar object in it. This should + be used instead ical_object_new_from_string() in the future. + + * evolution-calendar.idl (CalObjInstance): Added an uid field. + Now the idea is that whenever calendar object strings are passed + around, their UIDs are passed along with them so that the actual + object can be pulled from the whole VCAL object using its UID to + identify it. + + * cal-util.h (CalObjInstance): Added uid field. + + * cal-util.c (cal_obj_instance_list_free): Free the UIDs. + + * cal-backend.c (build_event_list): Store the object's UID in the + instance structure. + + * cal.c (Cal_get_events_in_range): Copy the UID field to the CORBA + structure. + + * cal-client.c (cal_client_get_events_in_range): Copy the UID + field from the CORBA structure. + + * main.c (gnome_cal_file_menu): Removed unfinished html-month stuff. + + * Makefile.am (gnomecal_SOURCES): Removed html-month.c. + + * gnome-cal.c: #include "alarm.h" + (mail_notify): Made static. + + * alarm.h: #include "calobj.h" + + * corba-cal-factory.h (init_corba_server): Fixed prototype. + + * quick-view.c (create_items_for_event): Made static. + + * gncal-todo.c (column_resized): Made static. + + * layout.c (find_index): Made static. + +2000-02-08 Federico Mena Quintero <federico@helixcode.com> + * evolution-calendar.idl (CalObjInstance): New struct to wrap instances of calendar objects for recurrencies and alarms. (Cal::get_events_in_range): New method to get ocurring and diff --git a/calendar/GnomeCal.idl b/calendar/GnomeCal.idl index 1e426fae36..3838c7c0bc 100644 --- a/calendar/GnomeCal.idl +++ b/calendar/GnomeCal.idl @@ -20,18 +20,6 @@ module GNOME { raises (NotFound); /* - * get_objects_by_id_list: - * @uid_list: a sequence of Unique Identifiers - * - * Returns a vCalendar object for the objects - * that matches the given UID list @uid_list; - * NotFound is raised if any of the given UIDs - * were not found. - */ - string get_objects_by_id_list (in String_Sequence uid) - raises (NotFound); - - /* * get_object_by_pilot_id: * @pilot_id: the pilot id * @@ -75,15 +63,6 @@ module GNOME { raises (NotFound); /* - * get_objects: - * - * Danger Will Robinson : This can result in a - * huge string, namely the size of all your entries. - * Returns a vCalendar with all the objects - */ - string get_objects (); - - /* * get_object_id_list * * Returns a sequence of the UID's of the entries diff --git a/calendar/Makefile.am b/calendar/Makefile.am index 5fa18ba0dd..23bc461141 100644 --- a/calendar/Makefile.am +++ b/calendar/Makefile.am @@ -90,7 +90,6 @@ gnomecal_SOURCES = \ gnome-month-item.h \ gnome-cal.c \ gnome-cal.h \ - html-month.c \ goto.c \ layout.c \ layout.h \ diff --git a/calendar/alarm.h b/calendar/alarm.h index 81710bda5e..2dc77e623b 100644 --- a/calendar/alarm.h +++ b/calendar/alarm.h @@ -2,6 +2,7 @@ #define ALARM_H #include <time.h> +#include "calobj.h" typedef void (*AlarmFunction)(time_t time, CalendarAlarm *which, void *closuse); diff --git a/calendar/cal-backend.c b/calendar/cal-backend.c index 2039c9c400..17148cb048 100644 --- a/calendar/cal-backend.c +++ b/calendar/cal-backend.c @@ -521,6 +521,74 @@ cal_backend_get_object (CalBackend *backend, const char *uid) return retval; } +struct get_uids_closure { + CalObjType type; + GList *uid_list; +}; + +/* Builds a list of UIDs for objects that match the sought type. Called from + * g_hash_table_foreach(). + */ +static void +build_uids_list (gpointer key, gpointer value, gpointer data) +{ + iCalObject *ico; + struct get_uids_closure *c; + gboolean store; + + ico = value; + c = data; + + store = FALSE; + + if (c->type & CALOBJ_TYPE_ANY) + store = TRUE; + else if (ico->type == ICAL_EVENT) + store = (c->type & CALOBJ_TYPE_EVENT) ? TRUE : FALSE; + else if (ico->type == ICAL_TODO) + store = (c->type & CALOBJ_TYPE_TODO) ? TRUE : FALSE; + else if (ico->type == ICAL_JOURNAL) + store = (c->type & CALOBJ_TYPE_JOURNAL) ? TRUE : FALSE; + else + store = (c->type & CALOBJ_TYPE_OTHER) ? TRUE : FALSE; + + if (store) + c->uid_list = g_list_prepend (c->uid_list, g_strdup (ico->uid)); +} + +/** + * cal_backend_get_uids: + * @backend: A calendar backend. + * @type: Bitmask with types of objects to return. + * + * Builds a list of unique identifiers corresponding to calendar objects whose + * type matches one of the types specified in the @type flags. + * + * Return value: A list of strings that are the sought UIDs. + **/ +GList * +cal_backend_get_uids (CalBackend *backend, CalObjType type) +{ + CalBackendPrivate *priv; + struct get_uids_closure c; + + g_return_val_if_fail (backend != NULL, NULL); + g_return_val_if_fail (IS_CAL_BACKEND (backend), NULL); + + priv = backend->priv; + g_return_val_if_fail (priv->loaded, NULL); + + /* We go through the hash table instead of the lists of particular + * object types so that we can pick up CALOBJ_TYPE_OTHER objects. + */ + + c.type = type; + c.uid_list = NULL; + g_hash_table_foreach (priv->object_hash, build_uids_list, &c); + + return c.uid_list; +} + struct build_event_list_closure { CalBackend *backend; GList *event_list; @@ -538,6 +606,9 @@ build_event_list (iCalObject *ico, time_t start, time_t end, void *data) c = data; icoi = g_new (CalObjInstance, 1); + + g_assert (ico->uid != NULL); + icoi->uid = g_strdup (ico->uid); icoi->calobj = string_from_ical_object (c->backend, ico); icoi->start = start; icoi->end = end; diff --git a/calendar/cal-backend.h b/calendar/cal-backend.h index aa54a3339d..55c414d5f7 100644 --- a/calendar/cal-backend.h +++ b/calendar/cal-backend.h @@ -70,6 +70,8 @@ CalBackendLoadStatus cal_backend_load (CalBackend *backend, GnomeVFSURI *uri); char *cal_backend_get_object (CalBackend *backend, const char *uid); +GList *cal_backend_get_uids (CalBackend *backend, CalObjType type); + GList *cal_backend_get_events_in_range (CalBackend *backend, time_t start, time_t end); diff --git a/calendar/cal-client.c b/calendar/cal-client.c index af8b83db34..3e0659357d 100644 --- a/calendar/cal-client.c +++ b/calendar/cal-client.c @@ -473,6 +473,60 @@ cal_client_get_object (CalClient *client, const char *uid) } GList * +cal_client_get_uids (CalClient *client, CalObjType type) +{ + CalClientPrivate *priv; + CORBA_Environment ev; + Evolution_Calendar_CalObjUIDSeq *seq; + int t; + GList *uids; + int i; + + g_return_val_if_fail (client != NULL, NULL); + g_return_val_if_fail (IS_CAL_CLIENT (client), NULL); + + priv = client->priv; + g_return_val_if_fail (priv->load_state == LOAD_STATE_LOADED, NULL); + + t = (((type & CALOBJ_TYPE_EVENT) ? Evolution_Calendar_TYPE_EVENT : 0) + | ((type & CALOBJ_TYPE_TODO) ? Evolution_Calendar_TYPE_TODO : 0) + | ((type & CALOBJ_TYPE_JOURNAL) ? Evolution_Calendar_TYPE_JOURNAL : 0) + | ((type & CALOBJ_TYPE_OTHER) ? Evolution_Calendar_TYPE_OTHER : 0) + | ((type & CALOBJ_TYPE_ANY) ? Evolution_Calendar_TYPE_ANY : 0)); + + CORBA_exception_init (&ev); + + seq = Evolution_Calendar_Cal_get_uids (priv->cal, t, &ev); + if (ev._major != CORBA_NO_EXCEPTION) { + g_message ("cal_client_get_uids(): could not get the list of UIDs"); + CORBA_exception_free (&ev); + return NULL; + } + + /* Create the list */ + + uids = NULL; + + for (i = 0; i < seq->_length; i++) + uids = g_list_prepend (uids, g_strdup (seq->_buffer[i])); + + CORBA_free (seq); + + return uids; +} + +/** + * cal_client_get_events_in_range: + * @client: A calendar client. + * @start: Start time for query. + * @end: End time for query. + * + * Queries a calendar for the events that occur or recur in the specified range + * of time. + * + * Return value: A list of #CalObjInstance structures. + **/ +GList * cal_client_get_events_in_range (CalClient *client, time_t start, time_t end) { CalClientPrivate *priv; @@ -513,6 +567,7 @@ cal_client_get_events_in_range (CalClient *client, time_t start, time_t end) corba_icoi = &seq->_buffer[i]; icoi = g_new (CalObjInstance, 1); + icoi->uid = g_strdup (corba_icoi->uid); icoi->calobj = g_strdup (corba_icoi->calobj); icoi->start = corba_icoi->start; icoi->end = corba_icoi->end; diff --git a/calendar/cal-client.h b/calendar/cal-client.h index e81ec8c13a..738d013f35 100644 --- a/calendar/cal-client.h +++ b/calendar/cal-client.h @@ -74,6 +74,8 @@ gboolean cal_client_load_calendar (CalClient *client, const char *str_uri); char *cal_client_get_object (CalClient *client, const char *uid); +GList *cal_client_get_uids (CalClient *client, CalObjType type); + GList *cal_client_get_events_in_range (CalClient *client, time_t start, time_t end); diff --git a/calendar/cal-client/cal-client.c b/calendar/cal-client/cal-client.c index af8b83db34..3e0659357d 100644 --- a/calendar/cal-client/cal-client.c +++ b/calendar/cal-client/cal-client.c @@ -473,6 +473,60 @@ cal_client_get_object (CalClient *client, const char *uid) } GList * +cal_client_get_uids (CalClient *client, CalObjType type) +{ + CalClientPrivate *priv; + CORBA_Environment ev; + Evolution_Calendar_CalObjUIDSeq *seq; + int t; + GList *uids; + int i; + + g_return_val_if_fail (client != NULL, NULL); + g_return_val_if_fail (IS_CAL_CLIENT (client), NULL); + + priv = client->priv; + g_return_val_if_fail (priv->load_state == LOAD_STATE_LOADED, NULL); + + t = (((type & CALOBJ_TYPE_EVENT) ? Evolution_Calendar_TYPE_EVENT : 0) + | ((type & CALOBJ_TYPE_TODO) ? Evolution_Calendar_TYPE_TODO : 0) + | ((type & CALOBJ_TYPE_JOURNAL) ? Evolution_Calendar_TYPE_JOURNAL : 0) + | ((type & CALOBJ_TYPE_OTHER) ? Evolution_Calendar_TYPE_OTHER : 0) + | ((type & CALOBJ_TYPE_ANY) ? Evolution_Calendar_TYPE_ANY : 0)); + + CORBA_exception_init (&ev); + + seq = Evolution_Calendar_Cal_get_uids (priv->cal, t, &ev); + if (ev._major != CORBA_NO_EXCEPTION) { + g_message ("cal_client_get_uids(): could not get the list of UIDs"); + CORBA_exception_free (&ev); + return NULL; + } + + /* Create the list */ + + uids = NULL; + + for (i = 0; i < seq->_length; i++) + uids = g_list_prepend (uids, g_strdup (seq->_buffer[i])); + + CORBA_free (seq); + + return uids; +} + +/** + * cal_client_get_events_in_range: + * @client: A calendar client. + * @start: Start time for query. + * @end: End time for query. + * + * Queries a calendar for the events that occur or recur in the specified range + * of time. + * + * Return value: A list of #CalObjInstance structures. + **/ +GList * cal_client_get_events_in_range (CalClient *client, time_t start, time_t end) { CalClientPrivate *priv; @@ -513,6 +567,7 @@ cal_client_get_events_in_range (CalClient *client, time_t start, time_t end) corba_icoi = &seq->_buffer[i]; icoi = g_new (CalObjInstance, 1); + icoi->uid = g_strdup (corba_icoi->uid); icoi->calobj = g_strdup (corba_icoi->calobj); icoi->start = corba_icoi->start; icoi->end = corba_icoi->end; diff --git a/calendar/cal-client/cal-client.h b/calendar/cal-client/cal-client.h index e81ec8c13a..738d013f35 100644 --- a/calendar/cal-client/cal-client.h +++ b/calendar/cal-client/cal-client.h @@ -74,6 +74,8 @@ gboolean cal_client_load_calendar (CalClient *client, const char *str_uri); char *cal_client_get_object (CalClient *client, const char *uid); +GList *cal_client_get_uids (CalClient *client, CalObjType type); + GList *cal_client_get_events_in_range (CalClient *client, time_t start, time_t end); diff --git a/calendar/cal-client/cal-util.c b/calendar/cal-client/cal-util.c index 97f4724ed0..f3054af958 100644 --- a/calendar/cal-client/cal-util.c +++ b/calendar/cal-client/cal-util.c @@ -41,11 +41,34 @@ cal_obj_instance_list_free (GList *list) i = l->data; g_assert (i != NULL); + g_assert (i->uid != NULL); g_assert (i->calobj != NULL); + g_free (i->uid); g_free (i->calobj); g_free (i); } - g_list_free (l); + g_list_free (list); +} + +/** + * cal_obj_uid_list_free: + * @list: List of strings with unique identifiers. + * + * Frees a list of unique identifiers for calendar objects. + **/ +void +cal_obj_uid_list_free (GList *list) +{ + GList *l; + + for (l = list; l; l = l->next) { + char *uid; + + uid = l->data; + g_free (uid); + } + + g_list_free (list); } diff --git a/calendar/cal-client/cal-util.h b/calendar/cal-client/cal-util.h index 3d83890d0e..45be343a28 100644 --- a/calendar/cal-client/cal-util.h +++ b/calendar/cal-client/cal-util.h @@ -25,6 +25,7 @@ #include <libgnome/gnome-defs.h> #include <time.h> #include <glib.h> +#include "calobj.h" BEGIN_GNOME_DECLS @@ -34,6 +35,7 @@ BEGIN_GNOME_DECLS * recurrence, or an alarm trigger of a `real' calendar object. */ typedef struct { + char *uid; /* Identifier for the object wrapped in calobj */ char *calobj; /* String representation of calendar object */ time_t start; /* Start time of instance */ time_t end; /* End time of instance */ @@ -41,6 +43,16 @@ typedef struct { void cal_obj_instance_list_free (GList *list); +/* Used for multiple UID queries */ +typedef enum { + CALOBJ_TYPE_EVENT = 1 << 0, + CALOBJ_TYPE_TODO = 1 << 1, + CALOBJ_TYPE_JOURNAL = 1 << 2, + CALOBJ_TYPE_OTHER = 1 << 3, + CALOBJ_TYPE_ANY = 0x0f +} CalObjType; + +void cal_obj_uid_list_free (GList *list); diff --git a/calendar/cal-util.c b/calendar/cal-util.c index 97f4724ed0..f3054af958 100644 --- a/calendar/cal-util.c +++ b/calendar/cal-util.c @@ -41,11 +41,34 @@ cal_obj_instance_list_free (GList *list) i = l->data; g_assert (i != NULL); + g_assert (i->uid != NULL); g_assert (i->calobj != NULL); + g_free (i->uid); g_free (i->calobj); g_free (i); } - g_list_free (l); + g_list_free (list); +} + +/** + * cal_obj_uid_list_free: + * @list: List of strings with unique identifiers. + * + * Frees a list of unique identifiers for calendar objects. + **/ +void +cal_obj_uid_list_free (GList *list) +{ + GList *l; + + for (l = list; l; l = l->next) { + char *uid; + + uid = l->data; + g_free (uid); + } + + g_list_free (list); } diff --git a/calendar/cal-util.h b/calendar/cal-util.h index 3d83890d0e..45be343a28 100644 --- a/calendar/cal-util.h +++ b/calendar/cal-util.h @@ -25,6 +25,7 @@ #include <libgnome/gnome-defs.h> #include <time.h> #include <glib.h> +#include "calobj.h" BEGIN_GNOME_DECLS @@ -34,6 +35,7 @@ BEGIN_GNOME_DECLS * recurrence, or an alarm trigger of a `real' calendar object. */ typedef struct { + char *uid; /* Identifier for the object wrapped in calobj */ char *calobj; /* String representation of calendar object */ time_t start; /* Start time of instance */ time_t end; /* End time of instance */ @@ -41,6 +43,16 @@ typedef struct { void cal_obj_instance_list_free (GList *list); +/* Used for multiple UID queries */ +typedef enum { + CALOBJ_TYPE_EVENT = 1 << 0, + CALOBJ_TYPE_TODO = 1 << 1, + CALOBJ_TYPE_JOURNAL = 1 << 2, + CALOBJ_TYPE_OTHER = 1 << 3, + CALOBJ_TYPE_ANY = 0x0f +} CalObjType; + +void cal_obj_uid_list_free (GList *list); diff --git a/calendar/cal-util/calobj.c b/calendar/cal-util/calobj.c index f3004ddb13..8d3e68edcc 100644 --- a/calendar/cal-util/calobj.c +++ b/calendar/cal-util/calobj.c @@ -23,10 +23,10 @@ ical_gen_uid (void) static char *hostname; time_t t = time (NULL); static int serial; - + if (!hostname){ char buffer [128]; - + if ((gethostname (buffer, sizeof (buffer)-1) == 0) && (buffer [0] != 0)) hostname = g_strdup (buffer); @@ -50,14 +50,14 @@ ical_object_new (void) iCalObject *ico; ico = g_new0 (iCalObject, 1); - + ico->seq = -1; ico->dtstamp = time (NULL); ico->uid = ical_gen_uid (); ico->pilot_id = 0; ico->pilot_status = ICAL_PILOT_SYNC_MOD; - + return ico; } @@ -91,7 +91,7 @@ ical_new (char *comment, char *organizer, char *summary) default_alarm (ico, &ico->palarm, organizer, ALARM_PROGRAM); default_alarm (ico, &ico->malarm, organizer, ALARM_MAIL); default_alarm (ico, &ico->aalarm, organizer, ALARM_AUDIO); - + return ico; } @@ -144,10 +144,10 @@ set_list (char *str) { GList *list = 0; char *s; - + for (s = strtok (str, ";"); s; s = strtok (NULL, ";")) list = g_list_prepend (list, g_strdup (s)); - + return list; } @@ -224,7 +224,7 @@ weekdaylist (iCalObject *o, char **str) } } } while (isalpha (**str)); - + if (o->recur->weekday == 0){ struct tm tm = *localtime (&o->dtstart); @@ -266,22 +266,24 @@ static void ocurrencelist (iCalObject *o, char **str) { char *p; - + ignore_space (str); p = *str; if (!isdigit (*p)) return; - + if (!(*p >= '1' && *p <= '5')) return; if (!(*(p+1) == '+' || *(p+1) == '-')) return; - + o->recur->u.month_pos = (*p-'0') * (*(p+1) == '+' ? 1 : -1); *str += 2; } +#if 0 + static void daynumber (iCalObject *o, char **str) { @@ -294,7 +296,7 @@ daynumber (iCalObject *o, char **str) *str += 2; return; } - + if (!(isdigit (*p))) return; @@ -311,12 +313,14 @@ daynumber (iCalObject *o, char **str) o->recur->u.month_day = val; } +#endif + static void daynumberlist (iCalObject *o, char **str) { int first = 0; int val = 0; - + ignore_space (str); while (**str){ @@ -332,7 +336,7 @@ daynumberlist (iCalObject *o, char **str) */ if (val == 0){ struct tm day = *localtime (&o->dtstart); - + val = day.tm_mday; } o->recur->u.month_day = val; @@ -385,7 +389,7 @@ static void duration (iCalObject *o, char **str) { unsigned int duration = 0; - + ignore_space (str); if (**str != '#') return; @@ -412,17 +416,17 @@ load_recurrence (iCalObject *o, char *str) { enum RecurType type; int interval = 0; - + type = -1; switch (*str++){ case 'D': type = RECUR_DAILY; break; - + case 'W': type = RECUR_WEEKLY; break; - + case 'M': if (*str == 'P') type = RECUR_MONTHLY_BY_POS; @@ -430,7 +434,7 @@ load_recurrence (iCalObject *o, char *str) type = RECUR_MONTHLY_BY_DAY; str++; break; - + case 'Y': if (*str == 'M') type = RECUR_YEARLY_BY_MONTH; @@ -452,14 +456,14 @@ load_recurrence (iCalObject *o, char *str) if (interval == 0) interval = 1; - + o->recur->interval = interval; /* this is the default per the spec */ o->recur->duration = 2; - + ignore_space (&str); - + switch (type){ case RECUR_DAILY: break; @@ -514,7 +518,7 @@ setup_alarm_at (iCalObject *ico, CalendarAlarm *alarm, char *iso_time, VObject * int d = difftime (base, alarm_time); VObject *a; char *the_str; - + alarm->enabled = 1; if (d > HOURS (2)){ if (d > HOURS (48)){ @@ -548,7 +552,9 @@ ical_object_duplicate (iCalObject *o) { VObject *vo; iCalObject *new; - + + /* FIXME!!!!! The UID needs to change!!! */ + vo = ical_object_to_vobject (o); switch (o->type){ case ICAL_EVENT: @@ -564,7 +570,7 @@ ical_object_duplicate (iCalObject *o) cleanVObject (vo); return new; } - + /* FIXME: we need to load the recurrence properties */ iCalObject * ical_object_create_from_vobject (VObject *o, const char *object_name) @@ -576,7 +582,7 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) char *the_str; ical = g_new0 (iCalObject, 1); - + if (strcmp (object_name, VCEventProp) == 0) ical->type = ICAL_EVENT; else if (strcmp (object_name, VCTodoProp) == 0) @@ -600,7 +606,7 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) free (the_str); } else ical->seq = 0; - + /* dtstart */ if (has (o, VCDTstartProp)){ ical->dtstart = time_from_isodate (str_val (vo)); @@ -614,26 +620,26 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) if (has (o, VCDTendProp)){ ical->dtend = time_from_isodate (str_val (vo)); free (the_str); - } + } } else if (ical->type == ICAL_TODO){ if (has (o, VCDueProp)){ ical->dtend = time_from_isodate (str_val (vo)); free (the_str); - } + } } - + /* dcreated */ if (has (o, VCDCreatedProp)){ ical->created = time_from_isodate (str_val (vo)); free (the_str); } - + /* completed */ if (has (o, VCCompletedProp)){ ical->completed = time_from_isodate (str_val (vo)); free (the_str); } - + /* last_mod */ if (has (o, VCLastModifiedProp)){ ical->last_mod = time_from_isodate (str_val (vo)); @@ -652,7 +658,7 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) ical->comment = g_strdup (str_val (vo)); free (the_str); } - + /* summary */ if (has (o, VCSummaryProp)){ ical->summary = g_strdup (str_val (vo)); @@ -678,19 +684,19 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) ical->categories = set_list (str_val (vo)); free (the_str); } - + /* resources */ if (has (o, VCResourcesProp)){ ical->resources = set_list (str_val (vo)); free (the_str); } - + /* priority */ if (has (o, VCPriorityProp)){ ical->priority = atoi (str_val (vo)); free (the_str); } - + /* tranparency */ if (has (o, VCTranspProp)){ ical->transp = atoi (str_val (vo)) ? ICAL_TRANSPARENT : ICAL_OPAQUE; @@ -702,13 +708,13 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) ical->organizer = g_strdup (str_val (vo)); free (the_str); } - + /* related */ if (has (o, VCRelatedToProp)){ ical->related = set_list (str_val (vo)); free (the_str); } - + /* attach */ initPropIterator (&i, o); while (moreIteration (&i)){ @@ -724,7 +730,7 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) ical->url = g_strdup (str_val (vo)); free (the_str); } - + /* dalarm */ ical->dalarm.type = ALARM_DISPLAY; ical->dalarm.enabled = 0; @@ -734,7 +740,7 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) free (the_str); } } - + /* aalarm */ ical->aalarm.type = ALARM_AUDIO; ical->aalarm.enabled = 0; @@ -770,7 +776,7 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) if ((a = is_a_prop_of (vo, VCRunTimeProp))){ setup_alarm_at (ical, &ical->malarm, str_val (a), vo); free (the_str); - + if ((a = is_a_prop_of (vo, VCEmailAddressProp))){ ical->malarm.data = g_strdup (str_val (a)); free (the_str); @@ -802,7 +808,7 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) free (the_str); } else ical->pilot_status = ICAL_PILOT_SYNC_MOD; - + return ical; } @@ -824,7 +830,7 @@ store_list (VObject *o, char *prop, GList *values) GList *l; int len; char *result, *p; - + for (len = 0, l = values; l; l = l->next) len += strlen (l->data) + 1; @@ -832,7 +838,7 @@ store_list (VObject *o, char *prop, GList *values) for (p = result, l = values; l; l = l->next) { int len = strlen (l->data); - + strcpy (p, l->data); if (l->next) { @@ -880,7 +886,7 @@ save_alarm (VObject *o, CalendarAlarm *alarm, iCalObject *ical) VObject *alarm_object; struct tm tm; time_t alarm_time; - + if (!alarm->enabled) return NULL; tm = *localtime (&ical->dtstart); @@ -888,16 +894,16 @@ save_alarm (VObject *o, CalendarAlarm *alarm, iCalObject *ical) case ALARM_MINUTES: tm.tm_min -= alarm->count; break; - + case ALARM_HOURS: tm.tm_hour -= alarm->count; break; - + case ALARM_DAYS: tm.tm_mday -= alarm->count; break; } - + alarm_time = mktime (&tm); alarm_object = addProp (o, alarm_names [alarm->type]); addPropValue (alarm_object, VCRunTimeProp, isodate_from_time_t (alarm_time)); @@ -913,7 +919,7 @@ save_alarm (VObject *o, CalendarAlarm *alarm, iCalObject *ical) sprintf (buf, "%d", alarm->snooze_repeat); addPropValue (alarm_object, VCRepeatCountProp, buf); } else - addPropValue (alarm_object, VCRepeatCountProp, ""); + addPropValue (alarm_object, VCRepeatCountProp, ""); return alarm_object; } @@ -922,7 +928,7 @@ ical_object_to_vobject (iCalObject *ical) { VObject *o, *alarm, *s; GList *l; - + if (ical->type == ICAL_EVENT) o = newVObject (VCEventProp); else @@ -974,7 +980,7 @@ ical_object_to_vobject (iCalObject *ical) } else { addPropValue (o, VCSummaryProp, _("Appointment")); } - + /* status */ addPropValue (o, VCStatusProp, ical->status); @@ -998,7 +1004,7 @@ ical_object_to_vobject (iCalObject *ical) /* Owenr/organizer */ if (ical->organizer) addPropValue (o, VCOrgNameProp, ical->organizer); - + /* related */ if (ical->related) store_list (o, VCRelatedToProp, ical->related); @@ -1015,12 +1021,12 @@ ical_object_to_vobject (iCalObject *ical) char result [256]; char buffer [80]; int i; - + sprintf (result, "%s%d ", recur_type_name [ical->recur->type], ical->recur->interval); switch (ical->recur->type){ case RECUR_DAILY: break; - + case RECUR_WEEKLY: for (i = 0; i < 7; i++){ if (ical->recur->weekday & (1 << i)){ @@ -1029,27 +1035,27 @@ ical_object_to_vobject (iCalObject *ical) } } break; - + case RECUR_MONTHLY_BY_POS: { int nega = ical->recur->u.month_pos < 0; - + sprintf (buffer, "%d%s ", nega ? -ical->recur->u.month_pos : ical->recur->u.month_pos, nega ? "-" : "+"); strcat (result, buffer); /* the gui is set up for a single day, not a set here in this case */ - sprintf (buffer, "%s ", recur_day_list [ical->recur->weekday]); + sprintf (buffer, "%s ", recur_day_list [ical->recur->weekday]); strcat (result, buffer); } break; - + case RECUR_MONTHLY_BY_DAY: sprintf (buffer, "%d ", ical->recur->u.month_pos); strcat (result, buffer); break; - + case RECUR_YEARLY_BY_MONTH: break; - + case RECUR_YEARLY_BY_DAY: break; } @@ -1060,10 +1066,10 @@ ical_object_to_vobject (iCalObject *ical) strcat (result, buffer); addPropValue (o, VCRRuleProp, result); } - + save_alarm (o, &ical->aalarm, ical); save_alarm (o, &ical->dalarm, ical); - + if ((alarm = save_alarm (o, &ical->palarm, ical))) addPropValue (alarm, VCProcedureNameProp, ical->palarm.data); if ((alarm = save_alarm (o, &ical->malarm, ical))) @@ -1072,13 +1078,13 @@ ical_object_to_vobject (iCalObject *ical) /* Pilot */ { char buffer [20]; - + sprintf (buffer, "%d", ical->pilot_id); addPropValue (o, XPilotIdProp, buffer); sprintf (buffer, "%d", ical->pilot_status); addPropValue (o, XPilotStatusProp, buffer); } - + return o; } @@ -1087,7 +1093,7 @@ ical_foreach (GList *events, calendarfn fn, void *closure) { for (; events; events = events->next){ iCalObject *ical = events->data; - + (*fn) (ical, ical->dtstart, ical->dtend, closure); } } @@ -1096,10 +1102,10 @@ static int is_date_in_list (GList *list, struct tm *date) { struct tm tm; - + for (; list; list = list->next){ time_t *timep = list->data; - + tm = *localtime (timep); if (date->tm_mday == tm.tm_mday && date->tm_mon == tm.tm_mon && @@ -1141,7 +1147,7 @@ generate (iCalObject *ico, time_t reference, calendarfn cb, void *closure) if (ico->exdate && is_date_in_list (ico->exdate, &dt_start)) return 1; - + e_t = mktime (&dt_end); if ((s_t == -1) || (e_t == -1)) { @@ -1230,7 +1236,7 @@ ical_object_generate_events (iCalObject *ico, time_t start, time_t end, calendar } while ((current < end) || (end == 0)); break; - + case RECUR_WEEKLY: do { struct tm tm; @@ -1299,7 +1305,7 @@ ical_object_generate_events (iCalObject *ico, time_t start, time_t end, calendar current = mktime (&tm); continue; } - + switch( tm.tm_mon ) { case 3: @@ -1316,11 +1322,11 @@ ical_object_generate_events (iCalObject *ico, time_t start, time_t end, calendar break; case 1: if( ((tm.tm_year+1900)%4) == 0 - && ((tm.tm_year+1900)%400) != 100 - && ((tm.tm_year+1900)%400) != 200 + && ((tm.tm_year+1900)%400) != 100 + && ((tm.tm_year+1900)%400) != 200 && ((tm.tm_year+1900)%400) != 300 ) { - + if( tm.tm_mday > 29 ) { tm.tm_mday = 1; @@ -1341,7 +1347,7 @@ ical_object_generate_events (iCalObject *ico, time_t start, time_t end, calendar } break; } - + t = mktime (&tm); if (time_in_range (t, start, end) && recur_in_range (current, ico->recur)) @@ -1351,7 +1357,7 @@ ical_object_generate_events (iCalObject *ico, time_t start, time_t end, calendar /* Advance by the appropriate number of months */ current = mktime (&tm); - + tm.tm_mday = 1; tm.tm_mon += ico->recur->interval; current = mktime (&tm); @@ -1392,7 +1398,7 @@ ical_object_generate_events (iCalObject *ico, time_t start, time_t end, calendar } while (current < end || (end == 0)); break; - + case RECUR_YEARLY_BY_MONTH: case RECUR_YEARLY_BY_DAY: do { @@ -1466,7 +1472,7 @@ ical_object_new_from_string (const char *vcal_string) VObject *cal, *event; VObjectIterator i; const char *object_name; - + cal = Parse_MIME (vcal_string, strlen (vcal_string)); initPropIterator (&i, cal); @@ -1475,7 +1481,7 @@ ical_object_new_from_string (const char *vcal_string) event = nextVObject (&i); object_name = vObjectName (event); - + if (strcmp (object_name, VCEventProp) == 0){ ical = ical_object_create_from_vobject (event, object_name); break; @@ -1488,3 +1494,74 @@ ical_object_new_from_string (const char *vcal_string) return ical; } +/** + * ical_object_find_in_string: + * @uid: Unique identifier of the sought object. + * @vcalobj: String representation of a complete calendar object. + * @ico: The resulting #iCalObject is stored here. + * + * Parses a complete vCalendar object string and tries to find the calendar + * object that matches the specified @uid. If found, it stores the resulting + * #iCalObject in the @ico parameter. + * + * Return value: A result code depending on whether the parse and search were + * successful. + **/ +CalObjFindStatus +ical_object_find_in_string (const char *uid, const char *vcalobj, iCalObject **ico) +{ + VObject *vcal; + VObjectIterator i; + CalObjFindStatus status; + + g_return_val_if_fail (uid != NULL, CAL_OBJ_FIND_SYNTAX_ERROR); + g_return_val_if_fail (vcalobj != NULL, CAL_OBJ_FIND_SYNTAX_ERROR); + g_return_val_if_fail (ico != NULL, CAL_OBJ_FIND_SYNTAX_ERROR); + + *ico = NULL; + status = CAL_OBJ_FIND_NOT_FOUND; + + vcal = Parse_MIME (vcalobj, strlen (vcalobj)); + + if (!vcal) + return CAL_OBJ_FIND_SYNTAX_ERROR; + + initPropIterator (&i, vcal); + + while (moreIteration (&i)) { + VObject *vobj; + VObject *uid_prop; + char *the_str; + + vobj = nextVObject (&i); + + uid_prop = isAPropertyOf (vobj, VCUniqueStringProp); + if (!uid_prop) + continue; + + /* str_val() sets the_str to the string representation of the + * property. + */ + str_val (uid_prop); + + if (strcmp (the_str, uid) == 0) { + const char *object_name; + + object_name = vObjectName (vobj); + *ico = ical_object_create_from_vobject (vobj, object_name); + + if (*ico) + status = CAL_OBJ_FIND_SUCCESS; + } + + free (the_str); + + if (status == CAL_OBJ_FIND_SUCCESS) + break; + } + + cleanVObject (vcal); + cleanStrTbl (); + + return status; +} diff --git a/calendar/cal-util/calobj.h b/calendar/cal-util/calobj.h index fbc92a41c5..dabbc36c2d 100644 --- a/calendar/cal-util/calobj.h +++ b/calendar/cal-util/calobj.h @@ -201,6 +201,15 @@ void ical_object_add_exdate (iCalObject *o, time_t t); /* Computes the enddate field of the recurrence based on the duration */ void ical_object_compute_end (iCalObject *ico); +typedef enum { + CAL_OBJ_FIND_SUCCESS, + CAL_OBJ_FIND_SYNTAX_ERROR, + CAL_OBJ_FIND_NOT_FOUND +} CalObjFindStatus; + +CalObjFindStatus ical_object_find_in_string (const char *uid, const char *vcalobj, iCalObject **ico); + + /* Returns the first toggled day in a weekday mask -- we do this because we do not support multiple * days on a monthly-by-pos recurrence. If no days are toggled, it returns -1. */ diff --git a/calendar/cal.c b/calendar/cal.c index 664d9ef416..74badc7013 100644 --- a/calendar/cal.c +++ b/calendar/cal.c @@ -196,6 +196,54 @@ Cal_get_object (PortableServer_Servant servant, } } +/* Cal::get_uids method */ +static Evolution_Calendar_CalObjUIDSeq * +Cal_get_uids (PortableServer_Servant servant, + const Evolution_Calendar_CalObjType type, + CORBA_Environment *ev) +{ + Cal *cal; + CalPrivate *priv; + GList *uids, *l; + Evolution_Calendar_CalObjUIDSeq *seq; + int t; + int n, i; + + cal = CAL (bonobo_object_from_servant (servant)); + priv = cal->priv; + + /* Translate the CORBA flags to our own flags */ + + t = (((type & Evolution_Calendar_TYPE_EVENT) ? CALOBJ_TYPE_EVENT : 0) + | ((type & Evolution_Calendar_TYPE_TODO) ? CALOBJ_TYPE_TODO : 0) + | ((type & Evolution_Calendar_TYPE_JOURNAL) ? CALOBJ_TYPE_JOURNAL : 0) + | ((type & Evolution_Calendar_TYPE_OTHER) ? CALOBJ_TYPE_OTHER : 0) + | ((type & Evolution_Calendar_TYPE_ANY) ? CALOBJ_TYPE_ANY : 0)); + + uids = cal_backend_get_uids (priv->backend, t); + n = g_list_length (uids); + + seq = Evolution_Calendar_CalObjUIDSeq__alloc (); + seq->_length = n; + seq->_buffer = CORBA_sequence_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); + } + + /* Done */ + + cal_obj_uid_list_free (uids); + + return seq; +} + /* Cal::get_events_in_range method */ static Evolution_Calendar_CalObjInstanceSeq * Cal_get_events_in_range (PortableServer_Servant servant, @@ -234,13 +282,14 @@ Cal_get_events_in_range (PortableServer_Servant servant, /* Fill the sequence */ - for (i = 0, l = elist; i < n; i++, l = l->next) { + for (i = 0, l = elist; l; i++, l = l->next) { CalObjInstance *icoi; Evolution_Calendar_CalObjInstance *corba_icoi; icoi = l->data; corba_icoi = &seq->_buffer[i]; + corba_icoi->uid = CORBA_string_dup (icoi->uid); corba_icoi->calobj = CORBA_string_dup (icoi->calobj); corba_icoi->start = icoi->start; corba_icoi->end = icoi->end; @@ -269,6 +318,7 @@ cal_get_epv (void) epv = g_new0 (POA_Evolution_Calendar_Cal__epv, 1); epv->_get_uri = Cal_get_uri; epv->get_object = Cal_get_object; + epv->get_uids = Cal_get_uids; epv->get_events_in_range = Cal_get_events_in_range; return epv; diff --git a/calendar/calobj.c b/calendar/calobj.c index f3004ddb13..8d3e68edcc 100644 --- a/calendar/calobj.c +++ b/calendar/calobj.c @@ -23,10 +23,10 @@ ical_gen_uid (void) static char *hostname; time_t t = time (NULL); static int serial; - + if (!hostname){ char buffer [128]; - + if ((gethostname (buffer, sizeof (buffer)-1) == 0) && (buffer [0] != 0)) hostname = g_strdup (buffer); @@ -50,14 +50,14 @@ ical_object_new (void) iCalObject *ico; ico = g_new0 (iCalObject, 1); - + ico->seq = -1; ico->dtstamp = time (NULL); ico->uid = ical_gen_uid (); ico->pilot_id = 0; ico->pilot_status = ICAL_PILOT_SYNC_MOD; - + return ico; } @@ -91,7 +91,7 @@ ical_new (char *comment, char *organizer, char *summary) default_alarm (ico, &ico->palarm, organizer, ALARM_PROGRAM); default_alarm (ico, &ico->malarm, organizer, ALARM_MAIL); default_alarm (ico, &ico->aalarm, organizer, ALARM_AUDIO); - + return ico; } @@ -144,10 +144,10 @@ set_list (char *str) { GList *list = 0; char *s; - + for (s = strtok (str, ";"); s; s = strtok (NULL, ";")) list = g_list_prepend (list, g_strdup (s)); - + return list; } @@ -224,7 +224,7 @@ weekdaylist (iCalObject *o, char **str) } } } while (isalpha (**str)); - + if (o->recur->weekday == 0){ struct tm tm = *localtime (&o->dtstart); @@ -266,22 +266,24 @@ static void ocurrencelist (iCalObject *o, char **str) { char *p; - + ignore_space (str); p = *str; if (!isdigit (*p)) return; - + if (!(*p >= '1' && *p <= '5')) return; if (!(*(p+1) == '+' || *(p+1) == '-')) return; - + o->recur->u.month_pos = (*p-'0') * (*(p+1) == '+' ? 1 : -1); *str += 2; } +#if 0 + static void daynumber (iCalObject *o, char **str) { @@ -294,7 +296,7 @@ daynumber (iCalObject *o, char **str) *str += 2; return; } - + if (!(isdigit (*p))) return; @@ -311,12 +313,14 @@ daynumber (iCalObject *o, char **str) o->recur->u.month_day = val; } +#endif + static void daynumberlist (iCalObject *o, char **str) { int first = 0; int val = 0; - + ignore_space (str); while (**str){ @@ -332,7 +336,7 @@ daynumberlist (iCalObject *o, char **str) */ if (val == 0){ struct tm day = *localtime (&o->dtstart); - + val = day.tm_mday; } o->recur->u.month_day = val; @@ -385,7 +389,7 @@ static void duration (iCalObject *o, char **str) { unsigned int duration = 0; - + ignore_space (str); if (**str != '#') return; @@ -412,17 +416,17 @@ load_recurrence (iCalObject *o, char *str) { enum RecurType type; int interval = 0; - + type = -1; switch (*str++){ case 'D': type = RECUR_DAILY; break; - + case 'W': type = RECUR_WEEKLY; break; - + case 'M': if (*str == 'P') type = RECUR_MONTHLY_BY_POS; @@ -430,7 +434,7 @@ load_recurrence (iCalObject *o, char *str) type = RECUR_MONTHLY_BY_DAY; str++; break; - + case 'Y': if (*str == 'M') type = RECUR_YEARLY_BY_MONTH; @@ -452,14 +456,14 @@ load_recurrence (iCalObject *o, char *str) if (interval == 0) interval = 1; - + o->recur->interval = interval; /* this is the default per the spec */ o->recur->duration = 2; - + ignore_space (&str); - + switch (type){ case RECUR_DAILY: break; @@ -514,7 +518,7 @@ setup_alarm_at (iCalObject *ico, CalendarAlarm *alarm, char *iso_time, VObject * int d = difftime (base, alarm_time); VObject *a; char *the_str; - + alarm->enabled = 1; if (d > HOURS (2)){ if (d > HOURS (48)){ @@ -548,7 +552,9 @@ ical_object_duplicate (iCalObject *o) { VObject *vo; iCalObject *new; - + + /* FIXME!!!!! The UID needs to change!!! */ + vo = ical_object_to_vobject (o); switch (o->type){ case ICAL_EVENT: @@ -564,7 +570,7 @@ ical_object_duplicate (iCalObject *o) cleanVObject (vo); return new; } - + /* FIXME: we need to load the recurrence properties */ iCalObject * ical_object_create_from_vobject (VObject *o, const char *object_name) @@ -576,7 +582,7 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) char *the_str; ical = g_new0 (iCalObject, 1); - + if (strcmp (object_name, VCEventProp) == 0) ical->type = ICAL_EVENT; else if (strcmp (object_name, VCTodoProp) == 0) @@ -600,7 +606,7 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) free (the_str); } else ical->seq = 0; - + /* dtstart */ if (has (o, VCDTstartProp)){ ical->dtstart = time_from_isodate (str_val (vo)); @@ -614,26 +620,26 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) if (has (o, VCDTendProp)){ ical->dtend = time_from_isodate (str_val (vo)); free (the_str); - } + } } else if (ical->type == ICAL_TODO){ if (has (o, VCDueProp)){ ical->dtend = time_from_isodate (str_val (vo)); free (the_str); - } + } } - + /* dcreated */ if (has (o, VCDCreatedProp)){ ical->created = time_from_isodate (str_val (vo)); free (the_str); } - + /* completed */ if (has (o, VCCompletedProp)){ ical->completed = time_from_isodate (str_val (vo)); free (the_str); } - + /* last_mod */ if (has (o, VCLastModifiedProp)){ ical->last_mod = time_from_isodate (str_val (vo)); @@ -652,7 +658,7 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) ical->comment = g_strdup (str_val (vo)); free (the_str); } - + /* summary */ if (has (o, VCSummaryProp)){ ical->summary = g_strdup (str_val (vo)); @@ -678,19 +684,19 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) ical->categories = set_list (str_val (vo)); free (the_str); } - + /* resources */ if (has (o, VCResourcesProp)){ ical->resources = set_list (str_val (vo)); free (the_str); } - + /* priority */ if (has (o, VCPriorityProp)){ ical->priority = atoi (str_val (vo)); free (the_str); } - + /* tranparency */ if (has (o, VCTranspProp)){ ical->transp = atoi (str_val (vo)) ? ICAL_TRANSPARENT : ICAL_OPAQUE; @@ -702,13 +708,13 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) ical->organizer = g_strdup (str_val (vo)); free (the_str); } - + /* related */ if (has (o, VCRelatedToProp)){ ical->related = set_list (str_val (vo)); free (the_str); } - + /* attach */ initPropIterator (&i, o); while (moreIteration (&i)){ @@ -724,7 +730,7 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) ical->url = g_strdup (str_val (vo)); free (the_str); } - + /* dalarm */ ical->dalarm.type = ALARM_DISPLAY; ical->dalarm.enabled = 0; @@ -734,7 +740,7 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) free (the_str); } } - + /* aalarm */ ical->aalarm.type = ALARM_AUDIO; ical->aalarm.enabled = 0; @@ -770,7 +776,7 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) if ((a = is_a_prop_of (vo, VCRunTimeProp))){ setup_alarm_at (ical, &ical->malarm, str_val (a), vo); free (the_str); - + if ((a = is_a_prop_of (vo, VCEmailAddressProp))){ ical->malarm.data = g_strdup (str_val (a)); free (the_str); @@ -802,7 +808,7 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) free (the_str); } else ical->pilot_status = ICAL_PILOT_SYNC_MOD; - + return ical; } @@ -824,7 +830,7 @@ store_list (VObject *o, char *prop, GList *values) GList *l; int len; char *result, *p; - + for (len = 0, l = values; l; l = l->next) len += strlen (l->data) + 1; @@ -832,7 +838,7 @@ store_list (VObject *o, char *prop, GList *values) for (p = result, l = values; l; l = l->next) { int len = strlen (l->data); - + strcpy (p, l->data); if (l->next) { @@ -880,7 +886,7 @@ save_alarm (VObject *o, CalendarAlarm *alarm, iCalObject *ical) VObject *alarm_object; struct tm tm; time_t alarm_time; - + if (!alarm->enabled) return NULL; tm = *localtime (&ical->dtstart); @@ -888,16 +894,16 @@ save_alarm (VObject *o, CalendarAlarm *alarm, iCalObject *ical) case ALARM_MINUTES: tm.tm_min -= alarm->count; break; - + case ALARM_HOURS: tm.tm_hour -= alarm->count; break; - + case ALARM_DAYS: tm.tm_mday -= alarm->count; break; } - + alarm_time = mktime (&tm); alarm_object = addProp (o, alarm_names [alarm->type]); addPropValue (alarm_object, VCRunTimeProp, isodate_from_time_t (alarm_time)); @@ -913,7 +919,7 @@ save_alarm (VObject *o, CalendarAlarm *alarm, iCalObject *ical) sprintf (buf, "%d", alarm->snooze_repeat); addPropValue (alarm_object, VCRepeatCountProp, buf); } else - addPropValue (alarm_object, VCRepeatCountProp, ""); + addPropValue (alarm_object, VCRepeatCountProp, ""); return alarm_object; } @@ -922,7 +928,7 @@ ical_object_to_vobject (iCalObject *ical) { VObject *o, *alarm, *s; GList *l; - + if (ical->type == ICAL_EVENT) o = newVObject (VCEventProp); else @@ -974,7 +980,7 @@ ical_object_to_vobject (iCalObject *ical) } else { addPropValue (o, VCSummaryProp, _("Appointment")); } - + /* status */ addPropValue (o, VCStatusProp, ical->status); @@ -998,7 +1004,7 @@ ical_object_to_vobject (iCalObject *ical) /* Owenr/organizer */ if (ical->organizer) addPropValue (o, VCOrgNameProp, ical->organizer); - + /* related */ if (ical->related) store_list (o, VCRelatedToProp, ical->related); @@ -1015,12 +1021,12 @@ ical_object_to_vobject (iCalObject *ical) char result [256]; char buffer [80]; int i; - + sprintf (result, "%s%d ", recur_type_name [ical->recur->type], ical->recur->interval); switch (ical->recur->type){ case RECUR_DAILY: break; - + case RECUR_WEEKLY: for (i = 0; i < 7; i++){ if (ical->recur->weekday & (1 << i)){ @@ -1029,27 +1035,27 @@ ical_object_to_vobject (iCalObject *ical) } } break; - + case RECUR_MONTHLY_BY_POS: { int nega = ical->recur->u.month_pos < 0; - + sprintf (buffer, "%d%s ", nega ? -ical->recur->u.month_pos : ical->recur->u.month_pos, nega ? "-" : "+"); strcat (result, buffer); /* the gui is set up for a single day, not a set here in this case */ - sprintf (buffer, "%s ", recur_day_list [ical->recur->weekday]); + sprintf (buffer, "%s ", recur_day_list [ical->recur->weekday]); strcat (result, buffer); } break; - + case RECUR_MONTHLY_BY_DAY: sprintf (buffer, "%d ", ical->recur->u.month_pos); strcat (result, buffer); break; - + case RECUR_YEARLY_BY_MONTH: break; - + case RECUR_YEARLY_BY_DAY: break; } @@ -1060,10 +1066,10 @@ ical_object_to_vobject (iCalObject *ical) strcat (result, buffer); addPropValue (o, VCRRuleProp, result); } - + save_alarm (o, &ical->aalarm, ical); save_alarm (o, &ical->dalarm, ical); - + if ((alarm = save_alarm (o, &ical->palarm, ical))) addPropValue (alarm, VCProcedureNameProp, ical->palarm.data); if ((alarm = save_alarm (o, &ical->malarm, ical))) @@ -1072,13 +1078,13 @@ ical_object_to_vobject (iCalObject *ical) /* Pilot */ { char buffer [20]; - + sprintf (buffer, "%d", ical->pilot_id); addPropValue (o, XPilotIdProp, buffer); sprintf (buffer, "%d", ical->pilot_status); addPropValue (o, XPilotStatusProp, buffer); } - + return o; } @@ -1087,7 +1093,7 @@ ical_foreach (GList *events, calendarfn fn, void *closure) { for (; events; events = events->next){ iCalObject *ical = events->data; - + (*fn) (ical, ical->dtstart, ical->dtend, closure); } } @@ -1096,10 +1102,10 @@ static int is_date_in_list (GList *list, struct tm *date) { struct tm tm; - + for (; list; list = list->next){ time_t *timep = list->data; - + tm = *localtime (timep); if (date->tm_mday == tm.tm_mday && date->tm_mon == tm.tm_mon && @@ -1141,7 +1147,7 @@ generate (iCalObject *ico, time_t reference, calendarfn cb, void *closure) if (ico->exdate && is_date_in_list (ico->exdate, &dt_start)) return 1; - + e_t = mktime (&dt_end); if ((s_t == -1) || (e_t == -1)) { @@ -1230,7 +1236,7 @@ ical_object_generate_events (iCalObject *ico, time_t start, time_t end, calendar } while ((current < end) || (end == 0)); break; - + case RECUR_WEEKLY: do { struct tm tm; @@ -1299,7 +1305,7 @@ ical_object_generate_events (iCalObject *ico, time_t start, time_t end, calendar current = mktime (&tm); continue; } - + switch( tm.tm_mon ) { case 3: @@ -1316,11 +1322,11 @@ ical_object_generate_events (iCalObject *ico, time_t start, time_t end, calendar break; case 1: if( ((tm.tm_year+1900)%4) == 0 - && ((tm.tm_year+1900)%400) != 100 - && ((tm.tm_year+1900)%400) != 200 + && ((tm.tm_year+1900)%400) != 100 + && ((tm.tm_year+1900)%400) != 200 && ((tm.tm_year+1900)%400) != 300 ) { - + if( tm.tm_mday > 29 ) { tm.tm_mday = 1; @@ -1341,7 +1347,7 @@ ical_object_generate_events (iCalObject *ico, time_t start, time_t end, calendar } break; } - + t = mktime (&tm); if (time_in_range (t, start, end) && recur_in_range (current, ico->recur)) @@ -1351,7 +1357,7 @@ ical_object_generate_events (iCalObject *ico, time_t start, time_t end, calendar /* Advance by the appropriate number of months */ current = mktime (&tm); - + tm.tm_mday = 1; tm.tm_mon += ico->recur->interval; current = mktime (&tm); @@ -1392,7 +1398,7 @@ ical_object_generate_events (iCalObject *ico, time_t start, time_t end, calendar } while (current < end || (end == 0)); break; - + case RECUR_YEARLY_BY_MONTH: case RECUR_YEARLY_BY_DAY: do { @@ -1466,7 +1472,7 @@ ical_object_new_from_string (const char *vcal_string) VObject *cal, *event; VObjectIterator i; const char *object_name; - + cal = Parse_MIME (vcal_string, strlen (vcal_string)); initPropIterator (&i, cal); @@ -1475,7 +1481,7 @@ ical_object_new_from_string (const char *vcal_string) event = nextVObject (&i); object_name = vObjectName (event); - + if (strcmp (object_name, VCEventProp) == 0){ ical = ical_object_create_from_vobject (event, object_name); break; @@ -1488,3 +1494,74 @@ ical_object_new_from_string (const char *vcal_string) return ical; } +/** + * ical_object_find_in_string: + * @uid: Unique identifier of the sought object. + * @vcalobj: String representation of a complete calendar object. + * @ico: The resulting #iCalObject is stored here. + * + * Parses a complete vCalendar object string and tries to find the calendar + * object that matches the specified @uid. If found, it stores the resulting + * #iCalObject in the @ico parameter. + * + * Return value: A result code depending on whether the parse and search were + * successful. + **/ +CalObjFindStatus +ical_object_find_in_string (const char *uid, const char *vcalobj, iCalObject **ico) +{ + VObject *vcal; + VObjectIterator i; + CalObjFindStatus status; + + g_return_val_if_fail (uid != NULL, CAL_OBJ_FIND_SYNTAX_ERROR); + g_return_val_if_fail (vcalobj != NULL, CAL_OBJ_FIND_SYNTAX_ERROR); + g_return_val_if_fail (ico != NULL, CAL_OBJ_FIND_SYNTAX_ERROR); + + *ico = NULL; + status = CAL_OBJ_FIND_NOT_FOUND; + + vcal = Parse_MIME (vcalobj, strlen (vcalobj)); + + if (!vcal) + return CAL_OBJ_FIND_SYNTAX_ERROR; + + initPropIterator (&i, vcal); + + while (moreIteration (&i)) { + VObject *vobj; + VObject *uid_prop; + char *the_str; + + vobj = nextVObject (&i); + + uid_prop = isAPropertyOf (vobj, VCUniqueStringProp); + if (!uid_prop) + continue; + + /* str_val() sets the_str to the string representation of the + * property. + */ + str_val (uid_prop); + + if (strcmp (the_str, uid) == 0) { + const char *object_name; + + object_name = vObjectName (vobj); + *ico = ical_object_create_from_vobject (vobj, object_name); + + if (*ico) + status = CAL_OBJ_FIND_SUCCESS; + } + + free (the_str); + + if (status == CAL_OBJ_FIND_SUCCESS) + break; + } + + cleanVObject (vcal); + cleanStrTbl (); + + return status; +} diff --git a/calendar/calobj.h b/calendar/calobj.h index fbc92a41c5..dabbc36c2d 100644 --- a/calendar/calobj.h +++ b/calendar/calobj.h @@ -201,6 +201,15 @@ void ical_object_add_exdate (iCalObject *o, time_t t); /* Computes the enddate field of the recurrence based on the duration */ void ical_object_compute_end (iCalObject *ico); +typedef enum { + CAL_OBJ_FIND_SUCCESS, + CAL_OBJ_FIND_SYNTAX_ERROR, + CAL_OBJ_FIND_NOT_FOUND +} CalObjFindStatus; + +CalObjFindStatus ical_object_find_in_string (const char *uid, const char *vcalobj, iCalObject **ico); + + /* Returns the first toggled day in a weekday mask -- we do this because we do not support multiple * days on a monthly-by-pos recurrence. If no days are toggled, it returns -1. */ diff --git a/calendar/corba-cal-factory.h b/calendar/corba-cal-factory.h index 5d3bcb3140..096baef012 100644 --- a/calendar/corba-cal-factory.h +++ b/calendar/corba-cal-factory.h @@ -5,7 +5,7 @@ CORBA_ORB orb; PortableServer_POA poa; -void corba_server_init (void); +void init_corba_server (void); void unregister_calendar_services (void); #endif /* _CORBA_CAL_FACTORY_H_ */ diff --git a/calendar/corba-cal.c b/calendar/corba-cal.c index 7b9878f875..6d848ddb87 100644 --- a/calendar/corba-cal.c +++ b/calendar/corba-cal.c @@ -193,23 +193,6 @@ cal_repo_update_pilot_id (PortableServer_Servant servant, obj->pilot_status = pilot_status; } -static CORBA_char * -cal_repo_get_objects (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - GnomeCalendar *gcal = gnomecal_from_servant (servant); - char *str; - CORBA_char *res; - - str = calendar_get_as_vcal_string (gcal->cal); - g_message("length of result is %d",strlen(str)); - res = CORBA_string_dup (str); - free(str); /* ...get_as_vcal calls writeMemVObject, which uses realloc to - allocate this string */ - - return res; -} - static CORBA_long cal_repo_get_number_of_objects (PortableServer_Servant servant, GNOME_Calendar_Repository_RecordStatus record_status, @@ -318,7 +301,6 @@ init_calendar_repo_class (void) 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.get_objects = cal_repo_get_objects; calendar_repository_epv.get_number_of_objects = cal_repo_get_number_of_objects; calendar_repository_epv.get_updated_objects = cal_repo_get_updated_objects; calendar_repository_epv.update_pilot_id = cal_repo_update_pilot_id; diff --git a/calendar/evolution-calendar.idl b/calendar/evolution-calendar.idl index 8b9878d78e..d2ada802d5 100644 --- a/calendar/evolution-calendar.idl +++ b/calendar/evolution-calendar.idl @@ -23,6 +23,17 @@ module Calendar { /* An unique identifier for a calendar object */ typedef string CalObjUID; + /* Sequence of unique identifiers */ + typedef sequence<CalObjUID> CalObjUIDSeq; + + /* Flags for getting UID sequences */ + typedef long CalObjType; + const CalObjType TYPE_EVENT = 1 << 0; + const CalObjType TYPE_TODO = 1 << 1; + const CalObjType TYPE_JOURNAL = 1 << 2; + const CalObjType TYPE_OTHER = 1 << 3; + const CalObjType TYPE_ANY = 0x0f; + /* Used to store a time_t */ typedef unsigned long Time_t; @@ -33,6 +44,7 @@ module Calendar { * trigger. */ struct CalObjInstance { + CalObjUID uid; CalObj calobj; Time_t start; Time_t end; @@ -54,6 +66,9 @@ module Calendar { CalObj get_object (in CalObjUID uid) raises (NotFound); + /* Gets a list of UIDs based on object type */ + CalObjUIDSeq get_uids (in CalObjType type); + /* Gets the events that occur or recur in the specified time range */ CalObjInstanceSeq get_events_in_range (in Time_t start, in Time_t end) raises (InvalidRange); diff --git a/calendar/gncal-todo.c b/calendar/gncal-todo.c index 3be3ac4517..64ea8d0638 100644 --- a/calendar/gncal-todo.c +++ b/calendar/gncal-todo.c @@ -354,7 +354,7 @@ clist_row_selected (GtkCList *clist, gint row, gint column, GdkEventButton *even * once we get a call back stating that a column * has been resized never ever automatically resize again */ -void +static void column_resized (GtkWidget *widget, GncalTodo *todo) { /* disabling autoresize of columns */ diff --git a/calendar/gnome-cal.c b/calendar/gnome-cal.c index 387d46a31c..d54c4e98df 100644 --- a/calendar/gnome-cal.c +++ b/calendar/gnome-cal.c @@ -10,6 +10,7 @@ #include <signal.h> #include <sys/wait.h> #include <fcntl.h> +#include "alarm.h" #include "calendar.h" #include "gnome-cal.h" #include "gncal-day-panel.h" @@ -357,7 +358,7 @@ execute (char *command, int close_standard) sigaction (SIGQUIT, &save_quit, NULL); } -void +static void mail_notify (char *mail_address, char *text, time_t app_time) { pid_t pid; diff --git a/calendar/gui/GnomeCal.idl b/calendar/gui/GnomeCal.idl index 1e426fae36..3838c7c0bc 100644 --- a/calendar/gui/GnomeCal.idl +++ b/calendar/gui/GnomeCal.idl @@ -20,18 +20,6 @@ module GNOME { raises (NotFound); /* - * get_objects_by_id_list: - * @uid_list: a sequence of Unique Identifiers - * - * Returns a vCalendar object for the objects - * that matches the given UID list @uid_list; - * NotFound is raised if any of the given UIDs - * were not found. - */ - string get_objects_by_id_list (in String_Sequence uid) - raises (NotFound); - - /* * get_object_by_pilot_id: * @pilot_id: the pilot id * @@ -75,15 +63,6 @@ module GNOME { raises (NotFound); /* - * get_objects: - * - * Danger Will Robinson : This can result in a - * huge string, namely the size of all your entries. - * Returns a vCalendar with all the objects - */ - string get_objects (); - - /* * get_object_id_list * * Returns a sequence of the UID's of the entries diff --git a/calendar/gui/Makefile.am b/calendar/gui/Makefile.am index 5fa18ba0dd..23bc461141 100644 --- a/calendar/gui/Makefile.am +++ b/calendar/gui/Makefile.am @@ -90,7 +90,6 @@ gnomecal_SOURCES = \ gnome-month-item.h \ gnome-cal.c \ gnome-cal.h \ - html-month.c \ goto.c \ layout.c \ layout.h \ diff --git a/calendar/gui/alarm-notify/alarm.h b/calendar/gui/alarm-notify/alarm.h index 81710bda5e..2dc77e623b 100644 --- a/calendar/gui/alarm-notify/alarm.h +++ b/calendar/gui/alarm-notify/alarm.h @@ -2,6 +2,7 @@ #define ALARM_H #include <time.h> +#include "calobj.h" typedef void (*AlarmFunction)(time_t time, CalendarAlarm *which, void *closuse); diff --git a/calendar/gui/alarm.h b/calendar/gui/alarm.h index 81710bda5e..2dc77e623b 100644 --- a/calendar/gui/alarm.h +++ b/calendar/gui/alarm.h @@ -2,6 +2,7 @@ #define ALARM_H #include <time.h> +#include "calobj.h" typedef void (*AlarmFunction)(time_t time, CalendarAlarm *which, void *closuse); diff --git a/calendar/gui/corba-cal-factory.h b/calendar/gui/corba-cal-factory.h index 5d3bcb3140..096baef012 100644 --- a/calendar/gui/corba-cal-factory.h +++ b/calendar/gui/corba-cal-factory.h @@ -5,7 +5,7 @@ CORBA_ORB orb; PortableServer_POA poa; -void corba_server_init (void); +void init_corba_server (void); void unregister_calendar_services (void); #endif /* _CORBA_CAL_FACTORY_H_ */ diff --git a/calendar/gui/corba-cal.c b/calendar/gui/corba-cal.c index 7b9878f875..6d848ddb87 100644 --- a/calendar/gui/corba-cal.c +++ b/calendar/gui/corba-cal.c @@ -193,23 +193,6 @@ cal_repo_update_pilot_id (PortableServer_Servant servant, obj->pilot_status = pilot_status; } -static CORBA_char * -cal_repo_get_objects (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - GnomeCalendar *gcal = gnomecal_from_servant (servant); - char *str; - CORBA_char *res; - - str = calendar_get_as_vcal_string (gcal->cal); - g_message("length of result is %d",strlen(str)); - res = CORBA_string_dup (str); - free(str); /* ...get_as_vcal calls writeMemVObject, which uses realloc to - allocate this string */ - - return res; -} - static CORBA_long cal_repo_get_number_of_objects (PortableServer_Servant servant, GNOME_Calendar_Repository_RecordStatus record_status, @@ -318,7 +301,6 @@ init_calendar_repo_class (void) 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.get_objects = cal_repo_get_objects; calendar_repository_epv.get_number_of_objects = cal_repo_get_number_of_objects; calendar_repository_epv.get_updated_objects = cal_repo_get_updated_objects; calendar_repository_epv.update_pilot_id = cal_repo_update_pilot_id; diff --git a/calendar/gui/gncal-todo.c b/calendar/gui/gncal-todo.c index 3be3ac4517..64ea8d0638 100644 --- a/calendar/gui/gncal-todo.c +++ b/calendar/gui/gncal-todo.c @@ -354,7 +354,7 @@ clist_row_selected (GtkCList *clist, gint row, gint column, GdkEventButton *even * once we get a call back stating that a column * has been resized never ever automatically resize again */ -void +static void column_resized (GtkWidget *widget, GncalTodo *todo) { /* disabling autoresize of columns */ diff --git a/calendar/gui/gnome-cal.c b/calendar/gui/gnome-cal.c index 387d46a31c..d54c4e98df 100644 --- a/calendar/gui/gnome-cal.c +++ b/calendar/gui/gnome-cal.c @@ -10,6 +10,7 @@ #include <signal.h> #include <sys/wait.h> #include <fcntl.h> +#include "alarm.h" #include "calendar.h" #include "gnome-cal.h" #include "gncal-day-panel.h" @@ -357,7 +358,7 @@ execute (char *command, int close_standard) sigaction (SIGQUIT, &save_quit, NULL); } -void +static void mail_notify (char *mail_address, char *text, time_t app_time) { pid_t pid; diff --git a/calendar/gui/layout.c b/calendar/gui/layout.c index 1367ae3f8f..7042071056 100644 --- a/calendar/gui/layout.c +++ b/calendar/gui/layout.c @@ -93,7 +93,7 @@ build_partition (struct layout_info *li) } /* Returns the index of the element in the partition that corresponds to the specified time */ -int +static int find_index (struct layout_info *li, time_t t) { int i; diff --git a/calendar/gui/main.c b/calendar/gui/main.c index 9dead6b92e..ee4111b03e 100644 --- a/calendar/gui/main.c +++ b/calendar/gui/main.c @@ -576,14 +576,6 @@ save_default_calendar (GnomeCalendar *gcal) save_calendar_cmd (NULL, gcal); } -#if 0 -static void -make_html_cmd (GtkWidget *widget, GtkWidget *gcal) -{ - make_month_html (gcal, "output.html"); -} -#endif - static GnomeUIInfo gnome_cal_file_menu [] = { GNOMEUIINFO_MENU_NEW_ITEM(N_("_New calendar"), N_("Create a new calendar"), @@ -597,13 +589,6 @@ static GnomeUIInfo gnome_cal_file_menu [] = { GNOMEUIINFO_SEPARATOR, -#if 0 - GNOMEUIINFO_ITEM(N_("Create HTML for this month"), - N_("Creates an HTML version of this month's appointments"), - make_html_cmd, NULL); -#endif - GNOMEUIINFO_SEPARATOR, - GNOMEUIINFO_MENU_CLOSE_ITEM(close_cmd, NULL), GNOMEUIINFO_MENU_EXIT_ITEM(quit_cmd, NULL), diff --git a/calendar/gui/quick-view.c b/calendar/gui/quick-view.c index c23ed612c0..42da747259 100644 --- a/calendar/gui/quick-view.c +++ b/calendar/gui/quick-view.c @@ -105,7 +105,7 @@ quick_view_map_event (GtkWidget *widget, GdkEventAny *event) * items to create and returns the y position of the next item to create. Also takes in the current * maximum width for items and returns the new maximum width. */ -void +static void create_items_for_event (QuickView *qv, CalendarObject *co, double *y, double *max_width) { GnomeCanvas *canvas; diff --git a/calendar/idl/evolution-calendar.idl b/calendar/idl/evolution-calendar.idl index 8b9878d78e..d2ada802d5 100644 --- a/calendar/idl/evolution-calendar.idl +++ b/calendar/idl/evolution-calendar.idl @@ -23,6 +23,17 @@ module Calendar { /* An unique identifier for a calendar object */ typedef string CalObjUID; + /* Sequence of unique identifiers */ + typedef sequence<CalObjUID> CalObjUIDSeq; + + /* Flags for getting UID sequences */ + typedef long CalObjType; + const CalObjType TYPE_EVENT = 1 << 0; + const CalObjType TYPE_TODO = 1 << 1; + const CalObjType TYPE_JOURNAL = 1 << 2; + const CalObjType TYPE_OTHER = 1 << 3; + const CalObjType TYPE_ANY = 0x0f; + /* Used to store a time_t */ typedef unsigned long Time_t; @@ -33,6 +44,7 @@ module Calendar { * trigger. */ struct CalObjInstance { + CalObjUID uid; CalObj calobj; Time_t start; Time_t end; @@ -54,6 +66,9 @@ module Calendar { CalObj get_object (in CalObjUID uid) raises (NotFound); + /* Gets a list of UIDs based on object type */ + CalObjUIDSeq get_uids (in CalObjType type); + /* Gets the events that occur or recur in the specified time range */ CalObjInstanceSeq get_events_in_range (in Time_t start, in Time_t end) raises (InvalidRange); diff --git a/calendar/layout.c b/calendar/layout.c index 1367ae3f8f..7042071056 100644 --- a/calendar/layout.c +++ b/calendar/layout.c @@ -93,7 +93,7 @@ build_partition (struct layout_info *li) } /* Returns the index of the element in the partition that corresponds to the specified time */ -int +static int find_index (struct layout_info *li, time_t t) { int i; diff --git a/calendar/main.c b/calendar/main.c index 9dead6b92e..ee4111b03e 100644 --- a/calendar/main.c +++ b/calendar/main.c @@ -576,14 +576,6 @@ save_default_calendar (GnomeCalendar *gcal) save_calendar_cmd (NULL, gcal); } -#if 0 -static void -make_html_cmd (GtkWidget *widget, GtkWidget *gcal) -{ - make_month_html (gcal, "output.html"); -} -#endif - static GnomeUIInfo gnome_cal_file_menu [] = { GNOMEUIINFO_MENU_NEW_ITEM(N_("_New calendar"), N_("Create a new calendar"), @@ -597,13 +589,6 @@ static GnomeUIInfo gnome_cal_file_menu [] = { GNOMEUIINFO_SEPARATOR, -#if 0 - GNOMEUIINFO_ITEM(N_("Create HTML for this month"), - N_("Creates an HTML version of this month's appointments"), - make_html_cmd, NULL); -#endif - GNOMEUIINFO_SEPARATOR, - GNOMEUIINFO_MENU_CLOSE_ITEM(close_cmd, NULL), GNOMEUIINFO_MENU_EXIT_ITEM(quit_cmd, NULL), diff --git a/calendar/pcs/cal-backend.c b/calendar/pcs/cal-backend.c index 2039c9c400..17148cb048 100644 --- a/calendar/pcs/cal-backend.c +++ b/calendar/pcs/cal-backend.c @@ -521,6 +521,74 @@ cal_backend_get_object (CalBackend *backend, const char *uid) return retval; } +struct get_uids_closure { + CalObjType type; + GList *uid_list; +}; + +/* Builds a list of UIDs for objects that match the sought type. Called from + * g_hash_table_foreach(). + */ +static void +build_uids_list (gpointer key, gpointer value, gpointer data) +{ + iCalObject *ico; + struct get_uids_closure *c; + gboolean store; + + ico = value; + c = data; + + store = FALSE; + + if (c->type & CALOBJ_TYPE_ANY) + store = TRUE; + else if (ico->type == ICAL_EVENT) + store = (c->type & CALOBJ_TYPE_EVENT) ? TRUE : FALSE; + else if (ico->type == ICAL_TODO) + store = (c->type & CALOBJ_TYPE_TODO) ? TRUE : FALSE; + else if (ico->type == ICAL_JOURNAL) + store = (c->type & CALOBJ_TYPE_JOURNAL) ? TRUE : FALSE; + else + store = (c->type & CALOBJ_TYPE_OTHER) ? TRUE : FALSE; + + if (store) + c->uid_list = g_list_prepend (c->uid_list, g_strdup (ico->uid)); +} + +/** + * cal_backend_get_uids: + * @backend: A calendar backend. + * @type: Bitmask with types of objects to return. + * + * Builds a list of unique identifiers corresponding to calendar objects whose + * type matches one of the types specified in the @type flags. + * + * Return value: A list of strings that are the sought UIDs. + **/ +GList * +cal_backend_get_uids (CalBackend *backend, CalObjType type) +{ + CalBackendPrivate *priv; + struct get_uids_closure c; + + g_return_val_if_fail (backend != NULL, NULL); + g_return_val_if_fail (IS_CAL_BACKEND (backend), NULL); + + priv = backend->priv; + g_return_val_if_fail (priv->loaded, NULL); + + /* We go through the hash table instead of the lists of particular + * object types so that we can pick up CALOBJ_TYPE_OTHER objects. + */ + + c.type = type; + c.uid_list = NULL; + g_hash_table_foreach (priv->object_hash, build_uids_list, &c); + + return c.uid_list; +} + struct build_event_list_closure { CalBackend *backend; GList *event_list; @@ -538,6 +606,9 @@ build_event_list (iCalObject *ico, time_t start, time_t end, void *data) c = data; icoi = g_new (CalObjInstance, 1); + + g_assert (ico->uid != NULL); + icoi->uid = g_strdup (ico->uid); icoi->calobj = string_from_ical_object (c->backend, ico); icoi->start = start; icoi->end = end; diff --git a/calendar/pcs/cal-backend.h b/calendar/pcs/cal-backend.h index aa54a3339d..55c414d5f7 100644 --- a/calendar/pcs/cal-backend.h +++ b/calendar/pcs/cal-backend.h @@ -70,6 +70,8 @@ CalBackendLoadStatus cal_backend_load (CalBackend *backend, GnomeVFSURI *uri); char *cal_backend_get_object (CalBackend *backend, const char *uid); +GList *cal_backend_get_uids (CalBackend *backend, CalObjType type); + GList *cal_backend_get_events_in_range (CalBackend *backend, time_t start, time_t end); diff --git a/calendar/pcs/cal.c b/calendar/pcs/cal.c index 664d9ef416..74badc7013 100644 --- a/calendar/pcs/cal.c +++ b/calendar/pcs/cal.c @@ -196,6 +196,54 @@ Cal_get_object (PortableServer_Servant servant, } } +/* Cal::get_uids method */ +static Evolution_Calendar_CalObjUIDSeq * +Cal_get_uids (PortableServer_Servant servant, + const Evolution_Calendar_CalObjType type, + CORBA_Environment *ev) +{ + Cal *cal; + CalPrivate *priv; + GList *uids, *l; + Evolution_Calendar_CalObjUIDSeq *seq; + int t; + int n, i; + + cal = CAL (bonobo_object_from_servant (servant)); + priv = cal->priv; + + /* Translate the CORBA flags to our own flags */ + + t = (((type & Evolution_Calendar_TYPE_EVENT) ? CALOBJ_TYPE_EVENT : 0) + | ((type & Evolution_Calendar_TYPE_TODO) ? CALOBJ_TYPE_TODO : 0) + | ((type & Evolution_Calendar_TYPE_JOURNAL) ? CALOBJ_TYPE_JOURNAL : 0) + | ((type & Evolution_Calendar_TYPE_OTHER) ? CALOBJ_TYPE_OTHER : 0) + | ((type & Evolution_Calendar_TYPE_ANY) ? CALOBJ_TYPE_ANY : 0)); + + uids = cal_backend_get_uids (priv->backend, t); + n = g_list_length (uids); + + seq = Evolution_Calendar_CalObjUIDSeq__alloc (); + seq->_length = n; + seq->_buffer = CORBA_sequence_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); + } + + /* Done */ + + cal_obj_uid_list_free (uids); + + return seq; +} + /* Cal::get_events_in_range method */ static Evolution_Calendar_CalObjInstanceSeq * Cal_get_events_in_range (PortableServer_Servant servant, @@ -234,13 +282,14 @@ Cal_get_events_in_range (PortableServer_Servant servant, /* Fill the sequence */ - for (i = 0, l = elist; i < n; i++, l = l->next) { + for (i = 0, l = elist; l; i++, l = l->next) { CalObjInstance *icoi; Evolution_Calendar_CalObjInstance *corba_icoi; icoi = l->data; corba_icoi = &seq->_buffer[i]; + corba_icoi->uid = CORBA_string_dup (icoi->uid); corba_icoi->calobj = CORBA_string_dup (icoi->calobj); corba_icoi->start = icoi->start; corba_icoi->end = icoi->end; @@ -269,6 +318,7 @@ cal_get_epv (void) epv = g_new0 (POA_Evolution_Calendar_Cal__epv, 1); epv->_get_uri = Cal_get_uri; epv->get_object = Cal_get_object; + epv->get_uids = Cal_get_uids; epv->get_events_in_range = Cal_get_events_in_range; return epv; diff --git a/calendar/pcs/calobj.c b/calendar/pcs/calobj.c index f3004ddb13..8d3e68edcc 100644 --- a/calendar/pcs/calobj.c +++ b/calendar/pcs/calobj.c @@ -23,10 +23,10 @@ ical_gen_uid (void) static char *hostname; time_t t = time (NULL); static int serial; - + if (!hostname){ char buffer [128]; - + if ((gethostname (buffer, sizeof (buffer)-1) == 0) && (buffer [0] != 0)) hostname = g_strdup (buffer); @@ -50,14 +50,14 @@ ical_object_new (void) iCalObject *ico; ico = g_new0 (iCalObject, 1); - + ico->seq = -1; ico->dtstamp = time (NULL); ico->uid = ical_gen_uid (); ico->pilot_id = 0; ico->pilot_status = ICAL_PILOT_SYNC_MOD; - + return ico; } @@ -91,7 +91,7 @@ ical_new (char *comment, char *organizer, char *summary) default_alarm (ico, &ico->palarm, organizer, ALARM_PROGRAM); default_alarm (ico, &ico->malarm, organizer, ALARM_MAIL); default_alarm (ico, &ico->aalarm, organizer, ALARM_AUDIO); - + return ico; } @@ -144,10 +144,10 @@ set_list (char *str) { GList *list = 0; char *s; - + for (s = strtok (str, ";"); s; s = strtok (NULL, ";")) list = g_list_prepend (list, g_strdup (s)); - + return list; } @@ -224,7 +224,7 @@ weekdaylist (iCalObject *o, char **str) } } } while (isalpha (**str)); - + if (o->recur->weekday == 0){ struct tm tm = *localtime (&o->dtstart); @@ -266,22 +266,24 @@ static void ocurrencelist (iCalObject *o, char **str) { char *p; - + ignore_space (str); p = *str; if (!isdigit (*p)) return; - + if (!(*p >= '1' && *p <= '5')) return; if (!(*(p+1) == '+' || *(p+1) == '-')) return; - + o->recur->u.month_pos = (*p-'0') * (*(p+1) == '+' ? 1 : -1); *str += 2; } +#if 0 + static void daynumber (iCalObject *o, char **str) { @@ -294,7 +296,7 @@ daynumber (iCalObject *o, char **str) *str += 2; return; } - + if (!(isdigit (*p))) return; @@ -311,12 +313,14 @@ daynumber (iCalObject *o, char **str) o->recur->u.month_day = val; } +#endif + static void daynumberlist (iCalObject *o, char **str) { int first = 0; int val = 0; - + ignore_space (str); while (**str){ @@ -332,7 +336,7 @@ daynumberlist (iCalObject *o, char **str) */ if (val == 0){ struct tm day = *localtime (&o->dtstart); - + val = day.tm_mday; } o->recur->u.month_day = val; @@ -385,7 +389,7 @@ static void duration (iCalObject *o, char **str) { unsigned int duration = 0; - + ignore_space (str); if (**str != '#') return; @@ -412,17 +416,17 @@ load_recurrence (iCalObject *o, char *str) { enum RecurType type; int interval = 0; - + type = -1; switch (*str++){ case 'D': type = RECUR_DAILY; break; - + case 'W': type = RECUR_WEEKLY; break; - + case 'M': if (*str == 'P') type = RECUR_MONTHLY_BY_POS; @@ -430,7 +434,7 @@ load_recurrence (iCalObject *o, char *str) type = RECUR_MONTHLY_BY_DAY; str++; break; - + case 'Y': if (*str == 'M') type = RECUR_YEARLY_BY_MONTH; @@ -452,14 +456,14 @@ load_recurrence (iCalObject *o, char *str) if (interval == 0) interval = 1; - + o->recur->interval = interval; /* this is the default per the spec */ o->recur->duration = 2; - + ignore_space (&str); - + switch (type){ case RECUR_DAILY: break; @@ -514,7 +518,7 @@ setup_alarm_at (iCalObject *ico, CalendarAlarm *alarm, char *iso_time, VObject * int d = difftime (base, alarm_time); VObject *a; char *the_str; - + alarm->enabled = 1; if (d > HOURS (2)){ if (d > HOURS (48)){ @@ -548,7 +552,9 @@ ical_object_duplicate (iCalObject *o) { VObject *vo; iCalObject *new; - + + /* FIXME!!!!! The UID needs to change!!! */ + vo = ical_object_to_vobject (o); switch (o->type){ case ICAL_EVENT: @@ -564,7 +570,7 @@ ical_object_duplicate (iCalObject *o) cleanVObject (vo); return new; } - + /* FIXME: we need to load the recurrence properties */ iCalObject * ical_object_create_from_vobject (VObject *o, const char *object_name) @@ -576,7 +582,7 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) char *the_str; ical = g_new0 (iCalObject, 1); - + if (strcmp (object_name, VCEventProp) == 0) ical->type = ICAL_EVENT; else if (strcmp (object_name, VCTodoProp) == 0) @@ -600,7 +606,7 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) free (the_str); } else ical->seq = 0; - + /* dtstart */ if (has (o, VCDTstartProp)){ ical->dtstart = time_from_isodate (str_val (vo)); @@ -614,26 +620,26 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) if (has (o, VCDTendProp)){ ical->dtend = time_from_isodate (str_val (vo)); free (the_str); - } + } } else if (ical->type == ICAL_TODO){ if (has (o, VCDueProp)){ ical->dtend = time_from_isodate (str_val (vo)); free (the_str); - } + } } - + /* dcreated */ if (has (o, VCDCreatedProp)){ ical->created = time_from_isodate (str_val (vo)); free (the_str); } - + /* completed */ if (has (o, VCCompletedProp)){ ical->completed = time_from_isodate (str_val (vo)); free (the_str); } - + /* last_mod */ if (has (o, VCLastModifiedProp)){ ical->last_mod = time_from_isodate (str_val (vo)); @@ -652,7 +658,7 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) ical->comment = g_strdup (str_val (vo)); free (the_str); } - + /* summary */ if (has (o, VCSummaryProp)){ ical->summary = g_strdup (str_val (vo)); @@ -678,19 +684,19 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) ical->categories = set_list (str_val (vo)); free (the_str); } - + /* resources */ if (has (o, VCResourcesProp)){ ical->resources = set_list (str_val (vo)); free (the_str); } - + /* priority */ if (has (o, VCPriorityProp)){ ical->priority = atoi (str_val (vo)); free (the_str); } - + /* tranparency */ if (has (o, VCTranspProp)){ ical->transp = atoi (str_val (vo)) ? ICAL_TRANSPARENT : ICAL_OPAQUE; @@ -702,13 +708,13 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) ical->organizer = g_strdup (str_val (vo)); free (the_str); } - + /* related */ if (has (o, VCRelatedToProp)){ ical->related = set_list (str_val (vo)); free (the_str); } - + /* attach */ initPropIterator (&i, o); while (moreIteration (&i)){ @@ -724,7 +730,7 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) ical->url = g_strdup (str_val (vo)); free (the_str); } - + /* dalarm */ ical->dalarm.type = ALARM_DISPLAY; ical->dalarm.enabled = 0; @@ -734,7 +740,7 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) free (the_str); } } - + /* aalarm */ ical->aalarm.type = ALARM_AUDIO; ical->aalarm.enabled = 0; @@ -770,7 +776,7 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) if ((a = is_a_prop_of (vo, VCRunTimeProp))){ setup_alarm_at (ical, &ical->malarm, str_val (a), vo); free (the_str); - + if ((a = is_a_prop_of (vo, VCEmailAddressProp))){ ical->malarm.data = g_strdup (str_val (a)); free (the_str); @@ -802,7 +808,7 @@ ical_object_create_from_vobject (VObject *o, const char *object_name) free (the_str); } else ical->pilot_status = ICAL_PILOT_SYNC_MOD; - + return ical; } @@ -824,7 +830,7 @@ store_list (VObject *o, char *prop, GList *values) GList *l; int len; char *result, *p; - + for (len = 0, l = values; l; l = l->next) len += strlen (l->data) + 1; @@ -832,7 +838,7 @@ store_list (VObject *o, char *prop, GList *values) for (p = result, l = values; l; l = l->next) { int len = strlen (l->data); - + strcpy (p, l->data); if (l->next) { @@ -880,7 +886,7 @@ save_alarm (VObject *o, CalendarAlarm *alarm, iCalObject *ical) VObject *alarm_object; struct tm tm; time_t alarm_time; - + if (!alarm->enabled) return NULL; tm = *localtime (&ical->dtstart); @@ -888,16 +894,16 @@ save_alarm (VObject *o, CalendarAlarm *alarm, iCalObject *ical) case ALARM_MINUTES: tm.tm_min -= alarm->count; break; - + case ALARM_HOURS: tm.tm_hour -= alarm->count; break; - + case ALARM_DAYS: tm.tm_mday -= alarm->count; break; } - + alarm_time = mktime (&tm); alarm_object = addProp (o, alarm_names [alarm->type]); addPropValue (alarm_object, VCRunTimeProp, isodate_from_time_t (alarm_time)); @@ -913,7 +919,7 @@ save_alarm (VObject *o, CalendarAlarm *alarm, iCalObject *ical) sprintf (buf, "%d", alarm->snooze_repeat); addPropValue (alarm_object, VCRepeatCountProp, buf); } else - addPropValue (alarm_object, VCRepeatCountProp, ""); + addPropValue (alarm_object, VCRepeatCountProp, ""); return alarm_object; } @@ -922,7 +928,7 @@ ical_object_to_vobject (iCalObject *ical) { VObject *o, *alarm, *s; GList *l; - + if (ical->type == ICAL_EVENT) o = newVObject (VCEventProp); else @@ -974,7 +980,7 @@ ical_object_to_vobject (iCalObject *ical) } else { addPropValue (o, VCSummaryProp, _("Appointment")); } - + /* status */ addPropValue (o, VCStatusProp, ical->status); @@ -998,7 +1004,7 @@ ical_object_to_vobject (iCalObject *ical) /* Owenr/organizer */ if (ical->organizer) addPropValue (o, VCOrgNameProp, ical->organizer); - + /* related */ if (ical->related) store_list (o, VCRelatedToProp, ical->related); @@ -1015,12 +1021,12 @@ ical_object_to_vobject (iCalObject *ical) char result [256]; char buffer [80]; int i; - + sprintf (result, "%s%d ", recur_type_name [ical->recur->type], ical->recur->interval); switch (ical->recur->type){ case RECUR_DAILY: break; - + case RECUR_WEEKLY: for (i = 0; i < 7; i++){ if (ical->recur->weekday & (1 << i)){ @@ -1029,27 +1035,27 @@ ical_object_to_vobject (iCalObject *ical) } } break; - + case RECUR_MONTHLY_BY_POS: { int nega = ical->recur->u.month_pos < 0; - + sprintf (buffer, "%d%s ", nega ? -ical->recur->u.month_pos : ical->recur->u.month_pos, nega ? "-" : "+"); strcat (result, buffer); /* the gui is set up for a single day, not a set here in this case */ - sprintf (buffer, "%s ", recur_day_list [ical->recur->weekday]); + sprintf (buffer, "%s ", recur_day_list [ical->recur->weekday]); strcat (result, buffer); } break; - + case RECUR_MONTHLY_BY_DAY: sprintf (buffer, "%d ", ical->recur->u.month_pos); strcat (result, buffer); break; - + case RECUR_YEARLY_BY_MONTH: break; - + case RECUR_YEARLY_BY_DAY: break; } @@ -1060,10 +1066,10 @@ ical_object_to_vobject (iCalObject *ical) strcat (result, buffer); addPropValue (o, VCRRuleProp, result); } - + save_alarm (o, &ical->aalarm, ical); save_alarm (o, &ical->dalarm, ical); - + if ((alarm = save_alarm (o, &ical->palarm, ical))) addPropValue (alarm, VCProcedureNameProp, ical->palarm.data); if ((alarm = save_alarm (o, &ical->malarm, ical))) @@ -1072,13 +1078,13 @@ ical_object_to_vobject (iCalObject *ical) /* Pilot */ { char buffer [20]; - + sprintf (buffer, "%d", ical->pilot_id); addPropValue (o, XPilotIdProp, buffer); sprintf (buffer, "%d", ical->pilot_status); addPropValue (o, XPilotStatusProp, buffer); } - + return o; } @@ -1087,7 +1093,7 @@ ical_foreach (GList *events, calendarfn fn, void *closure) { for (; events; events = events->next){ iCalObject *ical = events->data; - + (*fn) (ical, ical->dtstart, ical->dtend, closure); } } @@ -1096,10 +1102,10 @@ static int is_date_in_list (GList *list, struct tm *date) { struct tm tm; - + for (; list; list = list->next){ time_t *timep = list->data; - + tm = *localtime (timep); if (date->tm_mday == tm.tm_mday && date->tm_mon == tm.tm_mon && @@ -1141,7 +1147,7 @@ generate (iCalObject *ico, time_t reference, calendarfn cb, void *closure) if (ico->exdate && is_date_in_list (ico->exdate, &dt_start)) return 1; - + e_t = mktime (&dt_end); if ((s_t == -1) || (e_t == -1)) { @@ -1230,7 +1236,7 @@ ical_object_generate_events (iCalObject *ico, time_t start, time_t end, calendar } while ((current < end) || (end == 0)); break; - + case RECUR_WEEKLY: do { struct tm tm; @@ -1299,7 +1305,7 @@ ical_object_generate_events (iCalObject *ico, time_t start, time_t end, calendar current = mktime (&tm); continue; } - + switch( tm.tm_mon ) { case 3: @@ -1316,11 +1322,11 @@ ical_object_generate_events (iCalObject *ico, time_t start, time_t end, calendar break; case 1: if( ((tm.tm_year+1900)%4) == 0 - && ((tm.tm_year+1900)%400) != 100 - && ((tm.tm_year+1900)%400) != 200 + && ((tm.tm_year+1900)%400) != 100 + && ((tm.tm_year+1900)%400) != 200 && ((tm.tm_year+1900)%400) != 300 ) { - + if( tm.tm_mday > 29 ) { tm.tm_mday = 1; @@ -1341,7 +1347,7 @@ ical_object_generate_events (iCalObject *ico, time_t start, time_t end, calendar } break; } - + t = mktime (&tm); if (time_in_range (t, start, end) && recur_in_range (current, ico->recur)) @@ -1351,7 +1357,7 @@ ical_object_generate_events (iCalObject *ico, time_t start, time_t end, calendar /* Advance by the appropriate number of months */ current = mktime (&tm); - + tm.tm_mday = 1; tm.tm_mon += ico->recur->interval; current = mktime (&tm); @@ -1392,7 +1398,7 @@ ical_object_generate_events (iCalObject *ico, time_t start, time_t end, calendar } while (current < end || (end == 0)); break; - + case RECUR_YEARLY_BY_MONTH: case RECUR_YEARLY_BY_DAY: do { @@ -1466,7 +1472,7 @@ ical_object_new_from_string (const char *vcal_string) VObject *cal, *event; VObjectIterator i; const char *object_name; - + cal = Parse_MIME (vcal_string, strlen (vcal_string)); initPropIterator (&i, cal); @@ -1475,7 +1481,7 @@ ical_object_new_from_string (const char *vcal_string) event = nextVObject (&i); object_name = vObjectName (event); - + if (strcmp (object_name, VCEventProp) == 0){ ical = ical_object_create_from_vobject (event, object_name); break; @@ -1488,3 +1494,74 @@ ical_object_new_from_string (const char *vcal_string) return ical; } +/** + * ical_object_find_in_string: + * @uid: Unique identifier of the sought object. + * @vcalobj: String representation of a complete calendar object. + * @ico: The resulting #iCalObject is stored here. + * + * Parses a complete vCalendar object string and tries to find the calendar + * object that matches the specified @uid. If found, it stores the resulting + * #iCalObject in the @ico parameter. + * + * Return value: A result code depending on whether the parse and search were + * successful. + **/ +CalObjFindStatus +ical_object_find_in_string (const char *uid, const char *vcalobj, iCalObject **ico) +{ + VObject *vcal; + VObjectIterator i; + CalObjFindStatus status; + + g_return_val_if_fail (uid != NULL, CAL_OBJ_FIND_SYNTAX_ERROR); + g_return_val_if_fail (vcalobj != NULL, CAL_OBJ_FIND_SYNTAX_ERROR); + g_return_val_if_fail (ico != NULL, CAL_OBJ_FIND_SYNTAX_ERROR); + + *ico = NULL; + status = CAL_OBJ_FIND_NOT_FOUND; + + vcal = Parse_MIME (vcalobj, strlen (vcalobj)); + + if (!vcal) + return CAL_OBJ_FIND_SYNTAX_ERROR; + + initPropIterator (&i, vcal); + + while (moreIteration (&i)) { + VObject *vobj; + VObject *uid_prop; + char *the_str; + + vobj = nextVObject (&i); + + uid_prop = isAPropertyOf (vobj, VCUniqueStringProp); + if (!uid_prop) + continue; + + /* str_val() sets the_str to the string representation of the + * property. + */ + str_val (uid_prop); + + if (strcmp (the_str, uid) == 0) { + const char *object_name; + + object_name = vObjectName (vobj); + *ico = ical_object_create_from_vobject (vobj, object_name); + + if (*ico) + status = CAL_OBJ_FIND_SUCCESS; + } + + free (the_str); + + if (status == CAL_OBJ_FIND_SUCCESS) + break; + } + + cleanVObject (vcal); + cleanStrTbl (); + + return status; +} diff --git a/calendar/pcs/calobj.h b/calendar/pcs/calobj.h index fbc92a41c5..dabbc36c2d 100644 --- a/calendar/pcs/calobj.h +++ b/calendar/pcs/calobj.h @@ -201,6 +201,15 @@ void ical_object_add_exdate (iCalObject *o, time_t t); /* Computes the enddate field of the recurrence based on the duration */ void ical_object_compute_end (iCalObject *ico); +typedef enum { + CAL_OBJ_FIND_SUCCESS, + CAL_OBJ_FIND_SYNTAX_ERROR, + CAL_OBJ_FIND_NOT_FOUND +} CalObjFindStatus; + +CalObjFindStatus ical_object_find_in_string (const char *uid, const char *vcalobj, iCalObject **ico); + + /* Returns the first toggled day in a weekday mask -- we do this because we do not support multiple * days on a monthly-by-pos recurrence. If no days are toggled, it returns -1. */ diff --git a/calendar/quick-view.c b/calendar/quick-view.c index c23ed612c0..42da747259 100644 --- a/calendar/quick-view.c +++ b/calendar/quick-view.c @@ -105,7 +105,7 @@ quick_view_map_event (GtkWidget *widget, GdkEventAny *event) * items to create and returns the y position of the next item to create. Also takes in the current * maximum width for items and returns the new maximum width. */ -void +static void create_items_for_event (QuickView *qv, CalendarObject *co, double *y, double *max_width) { GnomeCanvas *canvas; |