void ical_property_RECURRENCE_ID(struct exchange2ical *exchange2ical) { struct icaltimetype icaltime; icalproperty *prop; icalparameter *tzid; struct GlobalObjectId *GlbObjId; if (exchange2ical->ExceptionReplaceTime){ /*if parent has an all day event*/ if (exchange2ical->apptSubType && (*exchange2ical->apptSubType == 0x1)) { icaltime = get_icaldate_from_FILETIME(exchange2ical->ExceptionReplaceTime); prop = icalproperty_new_recurrenceid(icaltime); icalcomponent_add_property(exchange2ical->vevent, prop); } else { if (exchange2ical->TimeZoneDesc) { icaltime=get_icaltime_from_FILETIME(exchange2ical->ExceptionReplaceTime); prop = icalproperty_new_recurrenceid(icaltime); icalcomponent_add_property(exchange2ical->vevent, prop); tzid = icalparameter_new_tzid(exchange2ical->TimeZoneDesc); icalproperty_add_parameter(prop, tzid); } else { icaltime = get_icaltime_from_FILETIME_UTC(exchange2ical->ExceptionReplaceTime); prop = icalproperty_new_recurrenceid(icaltime); icalcomponent_add_property(exchange2ical->vevent, prop); } } } else if (exchange2ical->GlobalObjectId){ GlbObjId = get_GlobalObjectId(exchange2ical->mem_ctx, exchange2ical->GlobalObjectId); if(GlbObjId){ icaltime=get_icaldate_from_GlobalObjectId(GlbObjId); prop = icalproperty_new_recurrenceid(icaltime); icalcomponent_add_property(exchange2ical->vevent, prop); talloc_free(GlbObjId); } } }
icalcomponent *icalbdbsetiter_to_next(icalset *set, icalsetiter *i) { icalcomponent *comp = NULL; struct icaltimetype start, next; icalproperty *dtstart, *rrule, *prop, *due; struct icalrecurrencetype recur; icaltimezone *u_zone; int g = 0; int orig_time_was_utc = 0; _unused(set); do { /* no pending occurrence, read the next component */ if (i->last_component == NULL) { comp = icalcompiter_next(&(i->iter)); } else { comp = i->last_component; } /* no next component, simply return */ if (comp == 0) { return NULL; } if (i->gauge == 0) { return comp; } /* finding the next matched component and return it to the caller */ rrule = icalcomponent_get_first_property(comp, ICAL_RRULE_PROPERTY); g = icalgauge_get_expand(i->gauge); /* a recurring component with expand query */ if (rrule != 0 && g == 1) { u_zone = icaltimezone_get_builtin_timezone(i->tzid); /* use UTC, if that's all we have. */ if (!u_zone) { u_zone = icaltimezone_get_utc_timezone(); } recur = icalproperty_get_rrule(rrule); start = icaltime_from_timet(time(0), 0); if (icalcomponent_isa(comp) == ICAL_VEVENT_COMPONENT) { dtstart = icalcomponent_get_first_property(comp, ICAL_DTSTART_PROPERTY); if (dtstart) { start = icalproperty_get_dtstart(dtstart); } } else if (icalcomponent_isa(comp) == ICAL_VTODO_COMPONENT) { due = icalcomponent_get_first_property(comp, ICAL_DUE_PROPERTY); if (due) { start = icalproperty_get_due(due); } } /* Convert to the user's timezone in order to be able to compare * the results from the rrule iterator. */ if (icaltime_is_utc(start)) { start = icaltime_convert_to_zone(start, u_zone); orig_time_was_utc = 1; } if (i->ritr == NULL) { i->ritr = icalrecur_iterator_new(recur, start); next = icalrecur_iterator_next(i->ritr); i->last_component = comp; } else { next = icalrecur_iterator_next(i->ritr); if (icaltime_is_null_time(next)) { i->last_component = NULL; icalrecur_iterator_free(i->ritr); i->ritr = NULL; /* no more occurrence, should go to get next component */ continue; } else { i->last_component = comp; } } /* if it is excluded, do next one */ if (icalproperty_recurrence_is_excluded(comp, &start, &next)) { next = icalrecur_iterator_next(i->ritr); continue; } /* set recurrence-id value to the property if the property already exist; * add the recurrence id property and the value if the property does not exist */ prop = icalcomponent_get_first_property(comp, ICAL_RECURRENCEID_PROPERTY); if (prop == 0) { icalcomponent_add_property(comp, icalproperty_new_recurrenceid(next)); } else { icalproperty_set_recurrenceid(prop, next); } if (orig_time_was_utc) { next = icaltime_convert_to_zone(next, icaltimezone_get_utc_timezone()); } } /* end of recurring event with expand query */ if (comp != 0 && (i->gauge == 0 || icalgauge_compare(i->gauge, comp) == 1)) { /* found a matched, return it */ return comp; } } while (comp != 0); return NULL; /*unreachable */ }
icalcomponent *icalbdbset_form_a_matched_recurrence_component(icalsetiter *itr) { icalcomponent *comp = NULL; struct icaltimetype start, next; icalproperty *dtstart, *rrule, *prop, *due; struct icalrecurrencetype recur; icaltimezone *u_zone; int orig_time_was_utc = 0; comp = itr->last_component; if (comp == NULL || itr->gauge == NULL) { return NULL; } rrule = icalcomponent_get_first_property(comp, ICAL_RRULE_PROPERTY); /* if there is no RRULE, simply return to the caller */ if (rrule == NULL) { return NULL; } u_zone = icaltimezone_get_builtin_timezone(itr->tzid); /* use UTC, if that's all we have. */ if (!u_zone) { u_zone = icaltimezone_get_utc_timezone(); } recur = icalproperty_get_rrule(rrule); start = icaltime_from_timet(time(0), 0); if (icalcomponent_isa(comp) == ICAL_VEVENT_COMPONENT) { dtstart = icalcomponent_get_first_property(comp, ICAL_DTSTART_PROPERTY); if (dtstart) { start = icalproperty_get_dtstart(dtstart); } } else if (icalcomponent_isa(comp) == ICAL_VTODO_COMPONENT) { due = icalcomponent_get_first_property(comp, ICAL_DUE_PROPERTY); if (due) { start = icalproperty_get_due(due); } } /* Convert to the user's timezone in order to be able to compare the results * from the rrule iterator. */ if (icaltime_is_utc(start)) { start = icaltime_convert_to_zone(start, u_zone); orig_time_was_utc = 1; } if (itr->ritr == NULL) { itr->ritr = icalrecur_iterator_new(recur, start); next = icalrecur_iterator_next(itr->ritr); itr->last_component = comp; } else { next = icalrecur_iterator_next(itr->ritr); if (icaltime_is_null_time(next)) { /* no more recurrence, returns */ itr->last_component = NULL; icalrecur_iterator_free(itr->ritr); itr->ritr = NULL; /* no more pending matched occurrence, * all the pending matched occurrences have been returned */ return NULL; } else { itr->last_component = comp; } } /* if it is excluded, return NULL to the caller */ if (icalproperty_recurrence_is_excluded(comp, &start, &next)) { (void)icalrecur_iterator_next(itr->ritr); return NULL; } /* set recurrence-id value to the property if the property already exist; * add the recurrence id property and the value if the property does not exist */ prop = icalcomponent_get_first_property(comp, ICAL_RECURRENCEID_PROPERTY); if (prop == 0) { icalcomponent_add_property(comp, icalproperty_new_recurrenceid(next)); } else { icalproperty_set_recurrenceid(prop, next); } if (orig_time_was_utc) { next = icaltime_convert_to_zone(next, icaltimezone_get_utc_timezone()); } if (itr->gauge == 0 || icalgauge_compare(itr->gauge, comp) == 1) { /* find a matched and return it */ return comp; } /* not matched */ return NULL; }
icalsetiter icalbdbset_begin_component(icalset *set, icalcomponent_kind kind, icalgauge *gauge, const char *tzid) { icalsetiter itr = icalsetiter_null; icalcomponent *comp = NULL; icalcompiter citr; icalbdbset *bset; struct icaltimetype start, next; icalproperty *dtstart, *rrule, *prop, *due; struct icalrecurrencetype recur; icaltimezone *u_zone; int g = 0; int orig_time_was_utc = 0; icalerror_check_arg_re((set != 0), "set", icalsetiter_null); bset = (icalbdbset *) set; itr.gauge = gauge; itr.tzid = tzid; citr = icalcomponent_begin_component(bset->cluster, kind); comp = icalcompiter_deref(&citr); if (gauge == 0) { itr.iter = citr; return itr; } /* if there is a gauge, the first matched component is returned */ while (comp != 0) { /* check if it is a recurring component and with guage expand, if so * we need to add recurrence-id property to the given component */ rrule = icalcomponent_get_first_property(comp, ICAL_RRULE_PROPERTY); g = icalgauge_get_expand(gauge); if (rrule != 0 && g == 1) { /* it is a recurring event */ u_zone = icaltimezone_get_builtin_timezone(itr.tzid); /* use UTC, if that's all we have. */ if (!u_zone) { u_zone = icaltimezone_get_utc_timezone(); } recur = icalproperty_get_rrule(rrule); start = icaltime_from_timet(time(0), 0); if (icalcomponent_isa(comp) == ICAL_VEVENT_COMPONENT) { dtstart = icalcomponent_get_first_property(comp, ICAL_DTSTART_PROPERTY); if (dtstart) { start = icalproperty_get_dtstart(dtstart); } } else if (icalcomponent_isa(comp) == ICAL_VTODO_COMPONENT) { due = icalcomponent_get_first_property(comp, ICAL_DUE_PROPERTY); if (due) { start = icalproperty_get_due(due); } } /* Convert to the user's timezone in order to be able to compare * the results from the rrule iterator. */ if (icaltime_is_utc(start)) { start = icaltime_convert_to_zone(start, u_zone); orig_time_was_utc = 1; } if (itr.last_component == NULL) { itr.ritr = icalrecur_iterator_new(recur, start); next = icalrecur_iterator_next(itr.ritr); itr.last_component = comp; } else { next = icalrecur_iterator_next(itr.ritr); if (icaltime_is_null_time(next)) { itr.last_component = NULL; icalrecur_iterator_free(itr.ritr); itr.ritr = NULL; /* no matched occurrence */ goto getNextComp; } else { itr.last_component = comp; } } /* if it is excluded, do next one */ if (icalproperty_recurrence_is_excluded(comp, &start, &next)) { next = icalrecur_iterator_next(itr.ritr); continue; } /* add recurrence-id value to the property if the property already exist; * add the recurrence id property and the value if the property does not exist */ prop = icalcomponent_get_first_property(comp, ICAL_RECURRENCEID_PROPERTY); if (prop == 0) { icalcomponent_add_property(comp, icalproperty_new_recurrenceid(next)); } else { icalproperty_set_recurrenceid(prop, next); } /* convert the next recurrence time into the user's timezone */ if (orig_time_was_utc) { next = icaltime_convert_to_zone(next, icaltimezone_get_utc_timezone()); } } /* end of a recurring event */ if (gauge == 0 || icalgauge_compare(itr.gauge, comp) == 1) { /* find a matched and return it */ itr.iter = citr; return itr; } /* if it is a recurring but no matched occurrence has been found OR * it is not a recurring and no matched component has been found, * read the next component to find out */ getNextComp: if ((rrule != NULL && itr.last_component == NULL) || (rrule == NULL)) { (void)icalcompiter_next(&citr); comp = icalcompiter_deref(&citr); } } /* while */ /* no matched component has found */ return icalsetiter_null; }
static uint8_t exchange2ical_exception_from_ExceptionInfo(struct exchange2ical *exchange2ical, struct exchange2ical_check *exchange2ical_check) { uint32_t i; icalproperty *prop; icalparameter *param; icaltimetype icaltime; /*sanity checks*/ if(!exchange2ical->AppointmentRecurrencePattern) return 1; if(!exchange2ical->AppointmentRecurrencePattern->ExceptionInfo) return 1; if(!exchange2ical->AppointmentRecurrencePattern->ExceptionCount) return 1; for(i=0; i<exchange2ical->AppointmentRecurrencePattern->ExceptionCount; i++) { /*Check to see if event is acceptable*/ struct tm apptStart=get_tm_from_minutes_UTC(exchange2ical->AppointmentRecurrencePattern->ExceptionInfo->StartDateTime); if (!checkEvent(exchange2ical, exchange2ical_check, &apptStart)){ return 0; } /*Create a new vevent*/ exchange2ical->vevent = icalcomponent_new_vevent(); if ( ! (exchange2ical->vevent) ) { return 1; } icalcomponent_add_component(exchange2ical->vcalendar, exchange2ical->vevent); /*dtstart from StartDateTime*/ if (exchange2ical->apptSubType && (*exchange2ical->apptSubType == 0x1)) { struct tm tm; tm = get_tm_from_minutes_UTC(exchange2ical->AppointmentRecurrencePattern->ExceptionInfo->StartDateTime); icaltime= get_icaldate_from_tm(&tm); prop = icalproperty_new_dtstart(icaltime); icalcomponent_add_property(exchange2ical->vevent, prop); }else { if(exchange2ical->TimeZoneDesc){ struct tm tm; tm = get_tm_from_minutes(exchange2ical->AppointmentRecurrencePattern->ExceptionInfo->StartDateTime); icaltime= get_icaldate_from_tm(&tm); prop = icalproperty_new_dtstart(icaltime); icalcomponent_add_property(exchange2ical->vevent, prop); param = icalparameter_new_tzid(exchange2ical->TimeZoneDesc); icalproperty_add_parameter(prop, param); } else { struct tm tm; tm = get_tm_from_minutes_UTC(exchange2ical->AppointmentRecurrencePattern->ExceptionInfo->StartDateTime); icaltime= get_icaldate_from_tm(&tm); prop = icalproperty_new_dtstart(icaltime); icalcomponent_add_property(exchange2ical->vevent, prop); } } /*dtend from EndDateTime*/ if (exchange2ical->apptSubType && (*exchange2ical->apptSubType == 0x1)) { struct tm tm; tm = get_tm_from_minutes_UTC(exchange2ical->AppointmentRecurrencePattern->ExceptionInfo->EndDateTime); icaltime= get_icaldate_from_tm(&tm); prop = icalproperty_new_dtend(icaltime); icalcomponent_add_property(exchange2ical->vevent, prop); }else { if(exchange2ical->TimeZoneDesc){ struct tm tm; tm = get_tm_from_minutes(exchange2ical->AppointmentRecurrencePattern->ExceptionInfo->EndDateTime); icaltime= get_icaldate_from_tm(&tm); prop = icalproperty_new_dtend(icaltime); icalcomponent_add_property(exchange2ical->vevent, prop); param = icalparameter_new_tzid(exchange2ical->TimeZoneDesc); icalproperty_add_parameter(prop, param); } else { struct tm tm; tm = get_tm_from_minutes_UTC(exchange2ical->AppointmentRecurrencePattern->ExceptionInfo->EndDateTime); icaltime= get_icaldate_from_tm(&tm); prop = icalproperty_new_dtend(icaltime); icalcomponent_add_property(exchange2ical->vevent, prop); } } /*recurrence-id from OriginalStartDate*/ if (exchange2ical->apptSubType && (*exchange2ical->apptSubType == 0x1)) { struct tm tm; tm = get_tm_from_minutes_UTC(exchange2ical->AppointmentRecurrencePattern->ExceptionInfo->OriginalStartDate); icaltime= get_icaldate_from_tm(&tm); prop = icalproperty_new_recurrenceid(icaltime); icalcomponent_add_property(exchange2ical->vevent, prop); }else { if(exchange2ical->TimeZoneDesc){ struct tm tm; tm = get_tm_from_minutes(exchange2ical->AppointmentRecurrencePattern->ExceptionInfo->OriginalStartDate); icaltime= get_icaldate_from_tm(&tm); prop = icalproperty_new_recurrenceid(icaltime); icalcomponent_add_property(exchange2ical->vevent, prop); param = icalparameter_new_tzid(exchange2ical->TimeZoneDesc); icalproperty_add_parameter(prop, param); } else { struct tm tm; tm = get_tm_from_minutes_UTC(exchange2ical->AppointmentRecurrencePattern->ExceptionInfo->OriginalStartDate); icaltime= get_icaldate_from_tm(&tm); prop = icalproperty_new_recurrenceid(icaltime); icalcomponent_add_property(exchange2ical->vevent, prop); } } /*summary from Subject if subject is set*/ if (exchange2ical->AppointmentRecurrencePattern->ExceptionInfo->OverrideFlags & 0x0001) { exchange2ical->Subject=(const char *) &exchange2ical->AppointmentRecurrencePattern->ExceptionInfo->Subject.subjectMsg.msg; ical_property_SUMMARY(exchange2ical); } /*Valarm*/ /*ReminderSet*/ if(exchange2ical->AppointmentRecurrencePattern->ExceptionInfo->OverrideFlags & 0x0008){ exchange2ical->ReminderSet=(uint8_t *) &exchange2ical->AppointmentRecurrencePattern->ExceptionInfo->ReminderDelta.rSet; /*Reminder Delta*/ if(exchange2ical->AppointmentRecurrencePattern->ExceptionInfo->OverrideFlags & 0x0004){ exchange2ical->ReminderDelta=&exchange2ical->AppointmentRecurrencePattern->ExceptionInfo->ReminderDelta.rDelta; } else { exchange2ical->ReminderDelta=NULL; } ical_component_VALARM(exchange2ical); } /*Location*/ if(exchange2ical->AppointmentRecurrencePattern->ExceptionInfo->OverrideFlags & 0x0010){ exchange2ical->Location=(const char *) &exchange2ical->AppointmentRecurrencePattern->ExceptionInfo->Location.locationMsg.msg; ical_property_LOCATION(exchange2ical); } /*Busy Status*/ if(exchange2ical->AppointmentRecurrencePattern->ExceptionInfo->OverrideFlags & 0x0020){ exchange2ical->BusyStatus=&exchange2ical->AppointmentRecurrencePattern->ExceptionInfo->BusyStatus.bStatus; ical_property_X_MICROSOFT_CDO_BUSYSTATUS(exchange2ical); } } return 0; }