Libical API Documentation 4.0 STABLE VERSION [Visit the v3.0 documentation]
Loading...
Searching...
No Matches
icalclassify.c
Go to the documentation of this file.
1/*======================================================================
2 FILE: icalclassify.c
3 CREATOR: ebusboom 23 aug 2000
4
5 SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
6 SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
7======================================================================*/
8
13
14#ifdef HAVE_CONFIG_H
15#include <config.h>
16#endif
17
18#include "icalclassify.h"
19#include "icalerror.h"
20#include "icalmemory.h"
21
22#include <assert.h>
23#include <ctype.h>
24#include <stdlib.h>
25
26struct icalclassify_parts {
27 icalcomponent *c;
28 icalcomponent_kind inner_kind;
30 char *organizer;
31 icalparameter_partstat reply_partstat;
32 char *reply_attendee;
33 char *uid;
34 int sequence;
35 struct icaltimetype dtstamp;
36 struct icaltimetype recurrence_id;
37};
38
39char *icalclassify_lowercase(const char *str)
40{
41 char *p = 0;
42 char *xnew;
43
44 if (str == 0) {
45 return 0;
46 }
47
48 xnew = strdup(str);
49 if (!xnew) {
51 return 0;
52 }
53 for (p = xnew; *p != 0; p++) {
54 *p = tolower((int)*p);
55 }
56
57 return xnew;
58}
59
64
65icalcomponent *icalclassify_find_overlaps(icalset *set, icalcomponent *comp)
66{
67 icalcomponent *return_set;
68 icalcomponent *c;
69 struct icaltime_span compspan;
70
72 compspan = icalcomponent_get_span(comp);
73
74 if (icalerrno != ICAL_NO_ERROR) {
75 return 0;
76 }
77
79
80 for (c = icalset_get_first_component(set); c != 0; c = icalset_get_next_component(set)) {
82
83 struct icaltime_span span = icalcomponent_get_span(c);
84
85 if (icalerrno != ICAL_NO_ERROR) {
86 continue;
87 }
88
89 if (compspan.start < span.end && compspan.end > span.start) {
90 icalcomponent *clone = icalcomponent_clone(c);
91
92 icalcomponent_add_component(return_set, clone);
93 }
94 }
95
97 return return_set;
98 } else {
99 icalcomponent_free(return_set);
100 return 0;
101 }
102}
103
104icalproperty *icalclassify_find_attendee(const icalcomponent *c, const char *attendee)
105{
106 icalproperty *p;
107 icalcomponent *inner;
108 char *lattendee;
109 const char *upn;
110
111 if (!c || !attendee) {
112 return 0;
113 }
114
115 lattendee = icalclassify_lowercase(attendee);
116 if (!lattendee) {
117 return 0;
118 }
119 upn = strchr(lattendee, ':');
120
121 if (upn == 0) {
122 upn = lattendee;
123 } else {
124 upn++; /* skip the ";" */
125 }
126
128
130 p != 0;
132 const char *this_upn;
133 char *this_attendee = icalclassify_lowercase(icalproperty_get_attendee(p));
134
135 if (!this_attendee) {
136 continue;
137 }
138
139 this_upn = strchr(this_attendee, ':');
140
141 if (this_upn == 0) {
142 free(this_attendee);
143 continue;
144 } else {
145 this_upn++;
146 }
147
148 if (strcmp(this_upn, upn) == 0) {
149 free(lattendee);
150 free(this_attendee);
151 return p;
152 }
153
154 free(this_attendee);
155 }
156 free(lattendee);
157
158 return 0;
159}
160
161void icalssutil_free_parts(struct icalclassify_parts *parts)
162{
163 if (parts == 0) {
164 return;
165 }
166
167 if (parts->organizer != 0) {
168 free(parts->organizer);
169 }
170
171 if (parts->uid != 0) {
172 free(parts->uid);
173 }
174
175 if (parts->reply_attendee) {
176 free(parts->reply_attendee);
177 }
178}
179
180void icalssutil_get_parts(icalcomponent *c, struct icalclassify_parts *parts)
181{
182 icalproperty *p;
183 icalcomponent *inner;
184
185 memset(parts, 0, sizeof(struct icalclassify_parts));
186
187 parts->method = ICAL_METHOD_NONE;
188 parts->sequence = 0;
189 parts->reply_partstat = ICAL_PARTSTAT_NONE;
190 parts->c = c;
191
192 if (c == 0) {
193 return;
194 }
195
197 if (p != 0) {
198 parts->method = icalproperty_get_method(p);
199 }
200
202
203 parts->inner_kind = icalcomponent_isa(inner);
204
206 if (p != 0) {
207 const char *p_organizer = icalproperty_get_organizer(p);
208
209 if (p_organizer != 0) {
210 parts->organizer = strdup(p_organizer);
211 }
212 }
213
215 if (p != 0) {
216 parts->sequence = icalproperty_get_sequence(p);
217 }
218
220 if (p != 0) {
221 const char *p_uid = icalproperty_get_uid(p);
222
223 if (p_uid != 0) {
224 parts->uid = strdup(p_uid);
225 }
226 }
227
229 if (p != 0) {
230 parts->recurrence_id = icalproperty_get_recurrenceid(p);
231 }
232
234 if (p != 0) {
235 parts->dtstamp = icalproperty_get_dtstamp(p);
236 }
237
238 if (parts->method == ICAL_METHOD_REPLY) {
240
241 if (p != 0) {
242 const char *attendee = 0;
243
245 if (param != 0) {
246 parts->reply_partstat = icalparameter_get_partstat(param);
247 }
248 attendee = icalproperty_get_attendee(p);
249 if (attendee) {
250 parts->reply_attendee = strdup(attendee);
251 }
252 }
253 }
254}
255
256static bool icalssutil_is_rescheduled(const icalcomponent *a, const icalcomponent *b)
257{
258 icalcomponent *i1, *i2;
259 const char *temp1, *temp2;
260 int i;
261
262 icalproperty_kind kind_array[] = {
272
275
276 for (i = 0; kind_array[i] != ICAL_NO_PROPERTY; i++) {
277 int cmp;
278
279 icalproperty *p1 = icalcomponent_get_first_property(i1, kind_array[i]);
280 icalproperty *p2 = icalcomponent_get_first_property(i2, kind_array[i]);
281
282 if ((p1 != 0) ^ (p2 != 0)) {
283 /* Return true if the property exists in one component and not
284 the other */
285 return true;
286 } else if (!p1 && !p2) {
287 continue;
288 }
289
292 cmp = strcmp(temp1, temp2);
293 icalmemory_free_buffer((char *)temp1);
294 icalmemory_free_buffer((char *)temp2);
295
296 if (p1 && cmp != 0) {
297 return true;
298 }
299 }
300
301 return false;
302}
303
304#define icalclassify_pre \
305 int rtrn = 0;
306
307#define icalclassify_post \
308 return rtrn;
309
310int icalclassify_publish_new(const struct icalclassify_parts *comp,
311 const struct icalclassify_parts *match, const char *user)
312{
314 _unused(user);
315
316 if (comp->method == ICAL_METHOD_PUBLISH &&
317 match == 0 && comp->inner_kind != ICAL_VFREEBUSY_COMPONENT) {
318 rtrn = 1;
319 }
320
322}
323
324int icalclassify_publish_update(const struct icalclassify_parts *comp,
325 const struct icalclassify_parts *match, const char *user)
326{
328 _unused(user);
329
330 if (comp->method == ICAL_METHOD_PUBLISH &&
331 match != 0 && comp->inner_kind != ICAL_VFREEBUSY_COMPONENT) {
332 rtrn = 1;
333 }
334
336}
337
338int icalclassify_publish_freebusy(const struct icalclassify_parts *comp,
339 const struct icalclassify_parts *match, const char *user)
340{
342
343 _unused(match);
344 _unused(user);
345 if (comp->method == ICAL_METHOD_PUBLISH && comp->inner_kind == ICAL_VFREEBUSY_COMPONENT) {
346 rtrn = 1;
347 }
348
350}
351
352int icalclassify_request_new(const struct icalclassify_parts *comp,
353 const struct icalclassify_parts *match, const char *user)
354{
355 /* Method is REQUEST, and there is no match */
356
357 icalclassify_pre _unused(user);
358
359 if (match->c == 0 && comp->method == ICAL_METHOD_REQUEST) {
360 rtrn = 1;
361 }
362
364}
365
366int icalclassify_request_update(const struct icalclassify_parts *comp,
367 const struct icalclassify_parts *match, const char *user)
368{
369 /* REQUEST method, Higher SEQUENCE than match, and all
370 time-related properties are unchanged */
371
372 icalclassify_pre _unused(user);
373
374 if (match != 0 &&
375 comp->sequence >= match->sequence && !icalssutil_is_rescheduled(comp->c, match->c)) {
376 rtrn = 1;
377 }
378
380}
381
382int icalclassify_request_reschedule(const struct icalclassify_parts *comp,
383 const struct icalclassify_parts *match, const char *user)
384{
385 /* REQUEST method, Higher SEQUENCE than match, and one or more
386 time-related properties are changed */
387 icalclassify_pre _unused(user);
388
389 if (match->c != 0 &&
390 comp->sequence > match->sequence && icalssutil_is_rescheduled(comp->c, match->c)) {
391 rtrn = 1;
392 }
393
395}
396
397int icalclassify_request_delegate(const struct icalclassify_parts *comp,
398 const struct icalclassify_parts *match, const char *user)
399{
400 icalproperty *attendee;
401 const icalparameter *param;
402
404 _unused(match);
405
406 attendee = icalclassify_find_attendee(comp->c, user);
407
408 if (attendee == 0) {
409 return 0;
410 }
411
413
414 if (param != 0) {
415 rtrn = 1;
416 }
417
419}
420
421int icalclassify_request_new_organizer(const struct icalclassify_parts *comp,
422 const struct icalclassify_parts *match, const char *user)
423{
424 /* Organizer has changed between match and component */
425 icalclassify_pre _unused(comp);
426 _unused(match);
427 _unused(user);
428
431}
432
433int icalclassify_request_status(const struct icalclassify_parts *comp,
434 const struct icalclassify_parts *match, const char *user)
435{
436 icalclassify_pre _unused(comp);
437 _unused(match);
438 _unused(user);
439
442}
443
444int icalclassify_request_forward(const struct icalclassify_parts *comp,
445 const struct icalclassify_parts *match, const char *user)
446{
447 icalclassify_pre _unused(comp);
448 _unused(match);
449 _unused(user);
450
453}
454
455int icalclassify_request_freebusy(const struct icalclassify_parts *comp,
456 const struct icalclassify_parts *match, const char *user)
457{
458 icalclassify_pre _unused(comp);
459 _unused(match);
460 _unused(user);
461
464}
465
466int icalclassify_reply_accept(const struct icalclassify_parts *comp,
467 const struct icalclassify_parts *match, const char *user)
468{
469 const icalproperty *attendee;
470
472 _unused(user);
473
474 attendee = icalclassify_find_attendee(match->c, comp->reply_attendee);
475
476 if (attendee != 0 && comp->reply_partstat == ICAL_PARTSTAT_ACCEPTED) {
477 rtrn = 1;
478 }
479
481}
482
483int icalclassify_reply_decline(const struct icalclassify_parts *comp,
484 const struct icalclassify_parts *match, const char *user)
485{
486 const icalproperty *attendee;
487
489 _unused(user);
490
491 attendee = icalclassify_find_attendee(match->c, comp->reply_attendee);
492
493 if (attendee != 0 && comp->reply_partstat == ICAL_PARTSTAT_DECLINED) {
494 rtrn = 1;
495 }
497}
498
499int icalclassify_reply_delegate(const struct icalclassify_parts *comp,
500 const struct icalclassify_parts *match, const char *user)
501{
502 const icalproperty *attendee;
503
505 _unused(user);
506
507 attendee = icalclassify_find_attendee(match->c, comp->reply_attendee);
508
509 if (attendee != 0 && comp->reply_partstat == ICAL_PARTSTAT_DELEGATED) {
510 rtrn = 1;
511 }
513}
514
515int icalclassify_reply_crasher_accept(const struct icalclassify_parts *comp,
516 const struct icalclassify_parts *match, const char *user)
517{
518 const icalproperty *attendee;
519
521 _unused(user);
522
523 attendee = icalclassify_find_attendee(match->c, comp->reply_attendee);
524
525 if (attendee == 0 && comp->reply_partstat == ICAL_PARTSTAT_ACCEPTED) {
526 rtrn = 1;
527 }
529}
530
531int icalclassify_reply_crasher_decline(const struct icalclassify_parts *comp,
532 const struct icalclassify_parts *match, const char *user)
533{
534 const icalproperty *attendee;
535
537 _unused(user);
538
539 attendee = icalclassify_find_attendee(match->c, comp->reply_attendee);
540
541 if (attendee == 0 && comp->reply_partstat == ICAL_PARTSTAT_DECLINED) {
542 rtrn = 1;
543 }
545}
546
547int icalclassify_add_instance(const struct icalclassify_parts *comp,
548 const struct icalclassify_parts *match, const char *user)
549{
550 icalclassify_pre _unused(match);
551 _unused(user);
552
553 if (comp->method == ICAL_METHOD_ADD) {
554 rtrn = 1;
555 }
557}
558
559int icalclassify_cancel_event(const struct icalclassify_parts *comp,
560 const struct icalclassify_parts *match, const char *user)
561{
562 icalclassify_pre _unused(match);
563 _unused(user);
564 if (comp->method == ICAL_METHOD_CANCEL) {
565 rtrn = 1;
566 }
568}
569
570int icalclassify_cancel_instance(const struct icalclassify_parts *comp,
571 const struct icalclassify_parts *match, const char *user)
572{
573 icalclassify_pre _unused(match);
574 _unused(user);
575 if (comp->method == ICAL_METHOD_CANCEL) {
576 rtrn = 1;
577 }
579}
580
581int icalclassify_cancel_all(const struct icalclassify_parts *comp,
582 const struct icalclassify_parts *match, const char *user)
583{
584 icalclassify_pre _unused(match);
585 _unused(user);
586 if (comp->method == ICAL_METHOD_CANCEL) {
587 rtrn = 1;
588 }
590}
591
592int icalclassify_refesh(const struct icalclassify_parts *comp,
593 const struct icalclassify_parts *match, const char *user)
594{
595 icalclassify_pre _unused(match);
596 _unused(user);
597 if (comp->method == ICAL_METHOD_REFRESH) {
598 rtrn = 1;
599 }
601}
602
603int icalclassify_counter(const struct icalclassify_parts *comp,
604 const struct icalclassify_parts *match, const char *user)
605{
606 icalclassify_pre _unused(match);
607 _unused(user);
608 if (comp->method == ICAL_METHOD_COUNTER) {
609 rtrn = 1;
610 }
612}
613
614int icalclassify_delinecounter(const struct icalclassify_parts *comp,
615 const struct icalclassify_parts *match, const char *user)
616{
617 icalclassify_pre _unused(match);
618 _unused(user);
619
620 if (comp->method == ICAL_METHOD_DECLINECOUNTER) {
621 rtrn = 1;
622 }
623
625}
626
627static const struct icalclassify_map { //NOLINT(clang-analyzer-optin.performance.Padding) too much work to change all the initialization
628 icalproperty_method method;
629 int (*fn)(const struct icalclassify_parts *comp, const struct icalclassify_parts *match,
630 const char *user);
632} icalclassify_map[] = {
657
658icalproperty_xlicclass icalclassify(icalcomponent *c, icalcomponent *match, const char *user)
659{
660 const icalcomponent *inner;
661 icalproperty *p;
662 icalproperty_method method;
664
665 int i;
666
667 struct icalclassify_parts comp_parts;
668 struct icalclassify_parts match_parts;
669
671
672 if (inner == 0) {
673 return ICAL_XLICCLASS_NONE;
674 }
675
676 icalssutil_get_parts(c, &comp_parts);
677 icalssutil_get_parts(match, &match_parts);
678
679 /* Determine if the incoming component is obsoleted by the match */
680 if (match != 0 && (comp_parts.method == ICAL_METHOD_REQUEST)) {
681 assert(!((icaltime_is_utc(comp_parts.dtstamp) == 1) ^
682 (icaltime_is_utc(match_parts.dtstamp) == 1)));
683
684 if (comp_parts.sequence < match_parts.sequence &&
685 icaltime_compare(comp_parts.dtstamp, match_parts.dtstamp) > 0) {
686 /* comp has a smaller sequence and a later DTSTAMP */
688 goto CLEANUP;
689 }
690
691 if ((comp_parts.sequence < match_parts.sequence) ||
692 (comp_parts.sequence == match_parts.sequence &&
693 icaltime_compare(comp_parts.dtstamp, match_parts.dtstamp) <= 0)) {
695 goto CLEANUP;
696 }
697 }
698
700 if (p == 0) {
702 goto CLEANUP;
703 }
704 method = icalproperty_get_method(p);
705
706 for (i = 0; icalclassify_map[i].method != ICAL_METHOD_NONE; i++) {
707 if (icalclassify_map[i].method == method) {
708 if ((*(icalclassify_map[i].fn))(&comp_parts, &match_parts, user) == 1) {
709 class = icalclassify_map[i].class;
710 break;
711 }
712 }
713 }
714
715CLEANUP:
716 icalssutil_free_parts(&comp_parts);
717 icalssutil_free_parts(&match_parts);
718
719 return class;
720}
icalcomponent * icalclassify_find_overlaps(icalset *set, icalcomponent *comp)
int icalclassify_reply_accept(const struct icalclassify_parts *comp, const struct icalclassify_parts *match, const char *user)
icalproperty_xlicclass icalclassify(icalcomponent *c, icalcomponent *match, const char *user)
int icalclassify_add_instance(const struct icalclassify_parts *comp, const struct icalclassify_parts *match, const char *user)
int icalclassify_reply_crasher_decline(const struct icalclassify_parts *comp, const struct icalclassify_parts *match, const char *user)
int icalclassify_request_freebusy(const struct icalclassify_parts *comp, const struct icalclassify_parts *match, const char *user)
int icalclassify_cancel_instance(const struct icalclassify_parts *comp, const struct icalclassify_parts *match, const char *user)
int icalclassify_request_forward(const struct icalclassify_parts *comp, const struct icalclassify_parts *match, const char *user)
icalproperty * icalclassify_find_attendee(const icalcomponent *c, const char *attendee)
int icalclassify_counter(const struct icalclassify_parts *comp, const struct icalclassify_parts *match, const char *user)
int icalclassify_request_new_organizer(const struct icalclassify_parts *comp, const struct icalclassify_parts *match, const char *user)
int icalclassify_publish_freebusy(const struct icalclassify_parts *comp, const struct icalclassify_parts *match, const char *user)
int icalclassify_cancel_all(const struct icalclassify_parts *comp, const struct icalclassify_parts *match, const char *user)
int icalclassify_refesh(const struct icalclassify_parts *comp, const struct icalclassify_parts *match, const char *user)
void icalssutil_get_parts(icalcomponent *c, struct icalclassify_parts *parts)
#define icalclassify_pre
char * icalclassify_lowercase(const char *str)
int icalclassify_delinecounter(const struct icalclassify_parts *comp, const struct icalclassify_parts *match, const char *user)
int icalclassify_publish_new(const struct icalclassify_parts *comp, const struct icalclassify_parts *match, const char *user)
#define icalclassify_post
int icalclassify_request_status(const struct icalclassify_parts *comp, const struct icalclassify_parts *match, const char *user)
int icalclassify_request_delegate(const struct icalclassify_parts *comp, const struct icalclassify_parts *match, const char *user)
int icalclassify_reply_decline(const struct icalclassify_parts *comp, const struct icalclassify_parts *match, const char *user)
int icalclassify_reply_crasher_accept(const struct icalclassify_parts *comp, const struct icalclassify_parts *match, const char *user)
void icalssutil_free_parts(struct icalclassify_parts *parts)
int icalclassify_reply_delegate(const struct icalclassify_parts *comp, const struct icalclassify_parts *match, const char *user)
int icalclassify_request_update(const struct icalclassify_parts *comp, const struct icalclassify_parts *match, const char *user)
int icalclassify_publish_update(const struct icalclassify_parts *comp, const struct icalclassify_parts *match, const char *user)
int icalclassify_request_reschedule(const struct icalclassify_parts *comp, const struct icalclassify_parts *match, const char *user)
int icalclassify_cancel_event(const struct icalclassify_parts *comp, const struct icalclassify_parts *match, const char *user)
int icalclassify_request_new(const struct icalclassify_parts *comp, const struct icalclassify_parts *match, const char *user)
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_PARTSTAT_PARAMETER
@ ICAL_DELEGATEDFROM_PARAMETER
icalparameter_partstat
@ ICAL_PARTSTAT_NONE
@ ICAL_PARTSTAT_DECLINED
@ ICAL_PARTSTAT_ACCEPTED
@ ICAL_PARTSTAT_DELEGATED
struct icalparameter_impl icalparameter
icalparameter_partstat icalparameter_get_partstat(const icalparameter *value)
const char * icalproperty_get_uid(const icalproperty *prop)
int icalproperty_get_sequence(const icalproperty *prop)
struct icaltimetype icalproperty_get_dtstamp(const icalproperty *prop)
const char * icalproperty_get_organizer(const icalproperty *prop)
struct icaltimetype icalproperty_get_recurrenceid(const icalproperty *prop)
enum icalproperty_method icalproperty_get_method(const icalproperty *prop)
const char * icalproperty_get_attendee(const icalproperty *prop)
icalproperty_kind
@ ICAL_ATTENDEE_PROPERTY
@ ICAL_UID_PROPERTY
@ ICAL_RRULE_PROPERTY
@ ICAL_RDATE_PROPERTY
@ ICAL_DURATION_PROPERTY
@ ICAL_EXRULE_PROPERTY
@ ICAL_SEQUENCE_PROPERTY
@ ICAL_RECURRENCEID_PROPERTY
@ ICAL_EXDATE_PROPERTY
@ ICAL_METHOD_PROPERTY
@ ICAL_DUE_PROPERTY
@ ICAL_DTSTAMP_PROPERTY
@ ICAL_DTEND_PROPERTY
@ ICAL_DTSTART_PROPERTY
@ ICAL_ORGANIZER_PROPERTY
@ ICAL_NO_PROPERTY
icalproperty_method
@ ICAL_METHOD_REFRESH
@ ICAL_METHOD_DECLINECOUNTER
@ ICAL_METHOD_NONE
@ ICAL_METHOD_REPLY
@ ICAL_METHOD_REQUEST
@ ICAL_METHOD_CANCEL
@ ICAL_METHOD_COUNTER
@ ICAL_METHOD_ADD
@ ICAL_METHOD_PUBLISH
icalproperty_xlicclass
@ ICAL_XLICCLASS_REQUESTNEWORGANIZER
@ ICAL_XLICCLASS_REFRESH
@ ICAL_XLICCLASS_REQUESTRESCHEDULE
@ ICAL_XLICCLASS_COUNTER
@ ICAL_XLICCLASS_PUBLISHFREEBUSY
@ ICAL_XLICCLASS_OBSOLETE
@ ICAL_XLICCLASS_CANCELINSTANCE
@ ICAL_XLICCLASS_REPLYDECLINE
@ ICAL_XLICCLASS_REQUESTUPDATE
@ ICAL_XLICCLASS_CANCELEVENT
@ ICAL_XLICCLASS_REPLYCRASHERDECLINE
@ ICAL_XLICCLASS_UNKNOWN
@ ICAL_XLICCLASS_ADDINSTANCE
@ ICAL_XLICCLASS_MISSEQUENCED
@ ICAL_XLICCLASS_REQUESTSTATUS
@ ICAL_XLICCLASS_REQUESTDELEGATE
@ ICAL_XLICCLASS_REQUESTFREEBUSY
@ ICAL_XLICCLASS_PUBLISHUPDATE
@ ICAL_XLICCLASS_REQUESTNEW
@ ICAL_XLICCLASS_CANCELALL
@ ICAL_XLICCLASS_REPLYACCEPT
@ ICAL_XLICCLASS_DECLINECOUNTER
@ ICAL_XLICCLASS_REPLYCRASHERACCEPT
@ ICAL_XLICCLASS_PUBLISHNEW
@ ICAL_XLICCLASS_REQUESTFORWARD
@ ICAL_XLICCLASS_REPLYDELEGATE
@ ICAL_XLICCLASS_NONE
const char * str
Definition icalenums.c:29
icalcomponent_kind
Definition icalenums.h:29
@ ICAL_XROOT_COMPONENT
Definition icalenums.h:32
@ ICAL_VFREEBUSY_COMPONENT
Definition icalenums.h:39
@ ICAL_ANY_COMPONENT
Definition icalenums.h:31
void icalerror_set_errno(icalerrorenum x)
Sets the icalerrno to a given error.
Definition icalerror.c:90
void icalerror_clear_errno(void)
Resets icalerrno to ICAL_NO_ERROR.
Definition icalerror.c:85
Error handling for libical.
@ ICAL_NEWFAILED_ERROR
Definition icalerror.h:50
@ ICAL_NO_ERROR
Definition icalerror.h:44
@ ICAL_UNIMPLEMENTED_ERROR
Definition icalerror.h:74
#define icalerrno
Access the current icalerrno value.
Definition icalerror.h:133
void icalmemory_free_buffer(void *buf)
Releases a buffer.
Definition icalmemory.c:355
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)
Definition icalset.c:403
icalcomponent * icalset_get_next_component(icalset *set)
Definition icalset.c:408
bool icaltime_is_utc(const struct icaltimetype t)
Definition icaltime.c:639
int icaltime_compare(const struct icaltimetype a_in, const struct icaltimetype b_in)
Definition icaltime.c:653