26struct icalclassify_parts {
29 icalproperty_method method;
31 icalparameter_partstat reply_partstat;
35 struct icaltimetype dtstamp;
36 struct icaltimetype recurrence_id;
39char *icalclassify_lowercase(
const char *str)
53 for (p = xnew; *p != 0; p++) {
54 *p = tolower((
int)*p);
67 icalcomponent *return_set;
69 struct icaltime_span compspan;
89 if (compspan.start < span.end && compspan.end > span.start) {
104icalproperty *icalclassify_find_attendee(
const icalcomponent *c,
const char *attendee)
107 icalcomponent *inner;
115 lattendee = icalclassify_lowercase(attendee);
119 upn = strchr(lattendee,
':');
132 const char *this_upn;
133 char *this_attendee = icalclassify_lowercase(icalproperty_get_attendee(p));
135 if (!this_attendee) {
139 this_upn = strchr(this_attendee,
':');
148 if (strcmp(this_upn, upn) == 0) {
161void icalssutil_free_parts(
struct icalclassify_parts *parts)
167 if (parts->organizer != 0) {
168 free(parts->organizer);
171 if (parts->uid != 0) {
175 if (parts->reply_attendee) {
176 free(parts->reply_attendee);
180void icalssutil_get_parts(icalcomponent *c,
struct icalclassify_parts *parts)
183 icalcomponent *inner;
185 memset(parts, 0,
sizeof(
struct icalclassify_parts));
187 parts->method = ICAL_METHOD_NONE;
189 parts->reply_partstat = ICAL_PARTSTAT_NONE;
199 parts->method = icalproperty_get_method(p);
208 const char *p_organizer = icalproperty_get_organizer(p);
210 if (p_organizer != 0) {
211 parts->organizer = strdup(p_organizer);
217 parts->sequence = icalproperty_get_sequence(p);
222 const char *p_uid = icalproperty_get_uid(p);
225 parts->uid = strdup(p_uid);
231 parts->recurrence_id = icalproperty_get_recurrenceid(p);
236 parts->dtstamp = icalproperty_get_dtstamp(p);
239 if (parts->method == ICAL_METHOD_REPLY) {
243 const char *attendee = 0;
247 parts->reply_partstat = icalparameter_get_partstat(param);
249 attendee = icalproperty_get_attendee(p);
251 parts->reply_attendee = strdup(attendee);
257static bool icalssutil_is_rescheduled(
const icalcomponent *a,
const icalcomponent *b)
259 icalcomponent *i1, *i2;
260 const char *temp1, *temp2;
263 icalproperty_kind kind_array[] = {
264 ICAL_DTSTART_PROPERTY,
266 ICAL_DURATION_PROPERTY,
270 ICAL_EXRULE_PROPERTY,
271 ICAL_EXDATE_PROPERTY,
277 for (i = 0; kind_array[i] != ICAL_NO_PROPERTY; i++) {
283 if ((p1 != 0) ^ (p2 != 0)) {
287 }
else if (!p1 && !p2) {
293 cmp = strcmp(temp1, temp2);
297 if (p1 && cmp != 0) {
305#define icalclassify_pre \
308#define icalclassify_post \
311int icalclassify_publish_new(
const struct icalclassify_parts *comp,
312 const struct icalclassify_parts *match,
const char *user)
317 if (comp->method == ICAL_METHOD_PUBLISH &&
325int icalclassify_publish_update(
const struct icalclassify_parts *comp,
326 const struct icalclassify_parts *match,
const char *user)
331 if (comp->method == ICAL_METHOD_PUBLISH &&
339int icalclassify_publish_freebusy(
const struct icalclassify_parts *comp,
340 const struct icalclassify_parts *match,
const char *user)
353int icalclassify_request_new(
const struct icalclassify_parts *comp,
354 const struct icalclassify_parts *match,
const char *user)
358 icalclassify_pre _unused(user);
360 if (match->c == 0 && comp->method == ICAL_METHOD_REQUEST) {
367int icalclassify_request_update(
const struct icalclassify_parts *comp,
368 const struct icalclassify_parts *match,
const char *user)
373 icalclassify_pre _unused(user);
376 comp->sequence >= match->sequence && !icalssutil_is_rescheduled(comp->c, match->c)) {
383int icalclassify_request_reschedule(
const struct icalclassify_parts *comp,
384 const struct icalclassify_parts *match,
const char *user)
388 icalclassify_pre _unused(user);
391 comp->sequence > match->sequence && icalssutil_is_rescheduled(comp->c, match->c)) {
398int icalclassify_request_delegate(
const struct icalclassify_parts *comp,
399 const struct icalclassify_parts *match,
const char *user)
401 icalproperty *attendee;
402 const icalparameter *param;
407 attendee = icalclassify_find_attendee(comp->c, user);
422int icalclassify_request_new_organizer(
const struct icalclassify_parts *comp,
423 const struct icalclassify_parts *match,
const char *user)
426 icalclassify_pre _unused(comp);
434int icalclassify_request_status(
const struct icalclassify_parts *comp,
435 const struct icalclassify_parts *match,
const char *user)
437 icalclassify_pre _unused(comp);
445int icalclassify_request_forward(
const struct icalclassify_parts *comp,
446 const struct icalclassify_parts *match,
const char *user)
448 icalclassify_pre _unused(comp);
456int icalclassify_request_freebusy(
const struct icalclassify_parts *comp,
457 const struct icalclassify_parts *match,
const char *user)
459 icalclassify_pre _unused(comp);
467int icalclassify_reply_accept(
const struct icalclassify_parts *comp,
468 const struct icalclassify_parts *match,
const char *user)
470 const icalproperty *attendee;
475 attendee = icalclassify_find_attendee(match->c, comp->reply_attendee);
477 if (attendee != 0 && comp->reply_partstat == ICAL_PARTSTAT_ACCEPTED) {
484int icalclassify_reply_decline(
const struct icalclassify_parts *comp,
485 const struct icalclassify_parts *match,
const char *user)
487 const icalproperty *attendee;
492 attendee = icalclassify_find_attendee(match->c, comp->reply_attendee);
494 if (attendee != 0 && comp->reply_partstat == ICAL_PARTSTAT_DECLINED) {
500int icalclassify_reply_delegate(
const struct icalclassify_parts *comp,
501 const struct icalclassify_parts *match,
const char *user)
503 const icalproperty *attendee;
508 attendee = icalclassify_find_attendee(match->c, comp->reply_attendee);
510 if (attendee != 0 && comp->reply_partstat == ICAL_PARTSTAT_DELEGATED) {
516int icalclassify_reply_crasher_accept(
const struct icalclassify_parts *comp,
517 const struct icalclassify_parts *match,
const char *user)
519 const icalproperty *attendee;
524 attendee = icalclassify_find_attendee(match->c, comp->reply_attendee);
526 if (attendee == 0 && comp->reply_partstat == ICAL_PARTSTAT_ACCEPTED) {
532int icalclassify_reply_crasher_decline(
const struct icalclassify_parts *comp,
533 const struct icalclassify_parts *match,
const char *user)
535 const icalproperty *attendee;
540 attendee = icalclassify_find_attendee(match->c, comp->reply_attendee);
542 if (attendee == 0 && comp->reply_partstat == ICAL_PARTSTAT_DECLINED) {
548int icalclassify_add_instance(
const struct icalclassify_parts *comp,
549 const struct icalclassify_parts *match,
const char *user)
551 icalclassify_pre _unused(match);
554 if (comp->method == ICAL_METHOD_ADD) {
560int icalclassify_cancel_event(
const struct icalclassify_parts *comp,
561 const struct icalclassify_parts *match,
const char *user)
563 icalclassify_pre _unused(match);
565 if (comp->method == ICAL_METHOD_CANCEL) {
571int icalclassify_cancel_instance(
const struct icalclassify_parts *comp,
572 const struct icalclassify_parts *match,
const char *user)
574 icalclassify_pre _unused(match);
576 if (comp->method == ICAL_METHOD_CANCEL) {
582int icalclassify_cancel_all(
const struct icalclassify_parts *comp,
583 const struct icalclassify_parts *match,
const char *user)
585 icalclassify_pre _unused(match);
587 if (comp->method == ICAL_METHOD_CANCEL) {
593int icalclassify_refesh(
const struct icalclassify_parts *comp,
594 const struct icalclassify_parts *match,
const char *user)
596 icalclassify_pre _unused(match);
598 if (comp->method == ICAL_METHOD_REFRESH) {
604int icalclassify_counter(
const struct icalclassify_parts *comp,
605 const struct icalclassify_parts *match,
const char *user)
607 icalclassify_pre _unused(match);
609 if (comp->method == ICAL_METHOD_COUNTER) {
615int icalclassify_delinecounter(
const struct icalclassify_parts *comp,
616 const struct icalclassify_parts *match,
const char *user)
618 icalclassify_pre _unused(match);
621 if (comp->method == ICAL_METHOD_DECLINECOUNTER) {
628static const struct icalclassify_map {
629 icalproperty_method method;
630 int (*fn)(
const struct icalclassify_parts *comp,
const struct icalclassify_parts *match,
632 icalproperty_xlicclass
class;
633} icalclassify_map[] = {
634 {ICAL_METHOD_PUBLISH, icalclassify_publish_new, ICAL_XLICCLASS_PUBLISHNEW},
635 {ICAL_METHOD_PUBLISH, icalclassify_publish_update, ICAL_XLICCLASS_PUBLISHUPDATE},
636 {ICAL_METHOD_PUBLISH, icalclassify_publish_freebusy, ICAL_XLICCLASS_PUBLISHFREEBUSY},
637 {ICAL_METHOD_REQUEST, icalclassify_request_delegate, ICAL_XLICCLASS_REQUESTDELEGATE},
638 {ICAL_METHOD_REQUEST, icalclassify_request_new, ICAL_XLICCLASS_REQUESTNEW},
639 {ICAL_METHOD_REQUEST, icalclassify_request_update, ICAL_XLICCLASS_REQUESTUPDATE},
640 {ICAL_METHOD_REQUEST, icalclassify_request_reschedule, ICAL_XLICCLASS_REQUESTRESCHEDULE},
641 {ICAL_METHOD_REQUEST, icalclassify_request_new_organizer, ICAL_XLICCLASS_REQUESTNEWORGANIZER},
642 {ICAL_METHOD_REQUEST, icalclassify_request_forward, ICAL_XLICCLASS_REQUESTFORWARD},
643 {ICAL_METHOD_REQUEST, icalclassify_request_status, ICAL_XLICCLASS_REQUESTSTATUS},
644 {ICAL_METHOD_REQUEST, icalclassify_request_freebusy, ICAL_XLICCLASS_REQUESTFREEBUSY},
645 {ICAL_METHOD_REPLY, icalclassify_reply_accept, ICAL_XLICCLASS_REPLYACCEPT},
646 {ICAL_METHOD_REPLY, icalclassify_reply_decline, ICAL_XLICCLASS_REPLYDECLINE},
647 {ICAL_METHOD_REPLY, icalclassify_reply_delegate, ICAL_XLICCLASS_REPLYDELEGATE},
648 {ICAL_METHOD_REPLY, icalclassify_reply_crasher_accept, ICAL_XLICCLASS_REPLYCRASHERACCEPT},
649 {ICAL_METHOD_REPLY, icalclassify_reply_crasher_decline, ICAL_XLICCLASS_REPLYCRASHERDECLINE},
650 {ICAL_METHOD_ADD, icalclassify_add_instance, ICAL_XLICCLASS_ADDINSTANCE},
651 {ICAL_METHOD_CANCEL, icalclassify_cancel_event, ICAL_XLICCLASS_CANCELEVENT},
652 {ICAL_METHOD_CANCEL, icalclassify_cancel_instance, ICAL_XLICCLASS_CANCELINSTANCE},
653 {ICAL_METHOD_CANCEL, icalclassify_cancel_all, ICAL_XLICCLASS_CANCELALL},
654 {ICAL_METHOD_REFRESH, icalclassify_refesh, ICAL_XLICCLASS_REFRESH},
655 {ICAL_METHOD_COUNTER, icalclassify_counter, ICAL_XLICCLASS_COUNTER},
656 {ICAL_METHOD_DECLINECOUNTER, icalclassify_delinecounter, ICAL_XLICCLASS_DECLINECOUNTER},
657 {ICAL_METHOD_NONE, NULL, ICAL_XLICCLASS_NONE}};
659icalproperty_xlicclass icalclassify(icalcomponent *c, icalcomponent *match,
const char *user)
661 const icalcomponent *inner;
663 icalproperty_method method;
664 icalproperty_xlicclass
class = ICAL_XLICCLASS_UNKNOWN;
668 struct icalclassify_parts comp_parts;
669 struct icalclassify_parts match_parts;
674 return ICAL_XLICCLASS_NONE;
677 icalssutil_get_parts(c, &comp_parts);
678 icalssutil_get_parts(match, &match_parts);
681 if (match != 0 && (comp_parts.method == ICAL_METHOD_REQUEST)) {
685 if (comp_parts.sequence < match_parts.sequence &&
688 class = ICAL_XLICCLASS_MISSEQUENCED;
692 if ((comp_parts.sequence < match_parts.sequence) ||
693 (comp_parts.sequence == match_parts.sequence &&
695 class = ICAL_XLICCLASS_OBSOLETE;
702 class = ICAL_XLICCLASS_UNKNOWN;
705 method = icalproperty_get_method(p);
707 for (i = 0; icalclassify_map[i].method != ICAL_METHOD_NONE; i++) {
708 if (icalclassify_map[i].method == method) {
709 if ((*(icalclassify_map[i].fn))(&comp_parts, &match_parts, user) == 1) {
710 class = icalclassify_map[i].class;
717 icalssutil_free_parts(&comp_parts);
718 icalssutil_free_parts(&match_parts);
icalcomponent * icalclassify_find_overlaps(icalset *set, icalcomponent *comp)
Defines functions for classification.
icalproperty * icalcomponent_get_first_property(icalcomponent *c, icalproperty_kind kind)
icalcomponent * icalcomponent_new(icalcomponent_kind kind)
icaltime_span icalcomponent_get_span(icalcomponent *comp)
icalcomponent * icalcomponent_get_first_real_component(const icalcomponent *c)
icalcomponent * icalcomponent_clone(const icalcomponent *old)
icalcomponent_kind icalcomponent_isa(const icalcomponent *component)
void icalcomponent_free(icalcomponent *c)
void icalcomponent_add_component(icalcomponent *parent, icalcomponent *child)
icalproperty * icalcomponent_get_next_property(icalcomponent *c, icalproperty_kind kind)
int icalcomponent_count_components(icalcomponent *component, icalcomponent_kind kind)
@ ICAL_VFREEBUSY_COMPONENT
void icalerror_set_errno(icalerrorenum x)
Sets the icalerrno to a given error.
void icalerror_clear_errno(void)
Resets icalerrno to ICAL_NO_ERROR.
Error handling for libical.
@ ICAL_UNIMPLEMENTED_ERROR
#define icalerrno
Access the current icalerrno value.
void icalmemory_free_buffer(void *buf)
Releases a buffer.
Common memory management routines.
char * icalproperty_as_ical_string_r(icalproperty *prop)
icalparameter * icalproperty_get_first_parameter(icalproperty *p, icalparameter_kind kind)
icalcomponent * icalset_get_first_component(icalset *set)
icalcomponent * icalset_get_next_component(icalset *set)
bool icaltime_is_utc(const struct icaltimetype t)
int icaltime_compare(const struct icaltimetype a_in, const struct icaltimetype b_in)