diff options
Diffstat (limited to 'libical')
202 files changed, 0 insertions, 52559 deletions
diff --git a/libical/.cvsignore b/libical/.cvsignore deleted file mode 100644 index 41f3513f40..0000000000 --- a/libical/.cvsignore +++ /dev/null @@ -1,19 +0,0 @@ -*.la -*.lo -.libs -Makefile -Makefile.in -aclocal.m4 -config.cache -config.guess -config.h -config.h.in -config.log -config.status -config.sub -configure -libtool -ltconfig -ltmain.sh -stamp-h -stamp-h.in diff --git a/libical/AUTHORS b/libical/AUTHORS deleted file mode 100644 index 659288c31d..0000000000 --- a/libical/AUTHORS +++ /dev/null @@ -1 +0,0 @@ -Eric Busboom <eric@softwarestudio.org> diff --git a/libical/COPYING b/libical/COPYING deleted file mode 100644 index e69de29bb2..0000000000 --- a/libical/COPYING +++ /dev/null diff --git a/libical/ChangeLog b/libical/ChangeLog deleted file mode 100644 index 611087459e..0000000000 --- a/libical/ChangeLog +++ /dev/null @@ -1,709 +0,0 @@ -2001-05-16 JP Rosevear <jpr@ximian.com> - - * src/libical/Makefile.am: Fixes to make it make dist and make - distcheck. Kind of kludgy but they seem to work. Time will tell. - -2001-05-10 JP Roseveaer <jpr@ximian.com> - - * src/libical/icaltime.c (set_tz, unset_tz): plug leak - (icaltime_as_timet): use altered functions - (icaltime_utc_offset): ditto - (icaltime_from_day_of_year): ditto - -2001-05-02 JP Rosevear <jpr@ximian.com> - - * src/libical/icalparser.c (icalparser_new): initialize - "continuation_line" to 0 - -2001-04-18 Ettore Perazzoli <ettore@ximian.com> - - * src/Makefile.am (SUBDIRS): Don't compile the Python stuff nor - the tests for now; they are broken. - -2001-04-18 Ettore Perazzoli <ettore@ximian.com> - - * src/libicalss/Makefile.am (COMBINEDHEADERS): All of these have - to come from the srcdir: prepend `$(srcdir)'. - -2001-04-18 Ettore Perazzoli <ettore@ximian.com> - - * src/libical/Makefile.am (COMBINEDHEADERS): Shouldn't prepend - `$(top_builddir)/src/libical' to `icalderivedvalue.h', - `icalderivedparameter.h', `icalderivedproperty.h' here, that - confuses the dependencies for make. - - * src/libical/Makefile.am (ical.h): Depend on - `$(COMBINEDHEADERS)', not `$(BUILT_SOURCES)'. - -2001-04-01 Eric Busboom <eric@softwarestudio.org> - - * icalcomponent.h Changed meaning of - icalcomponent_new_from_string. It used to create a new component - given the text name of the component type to create. Now it calls - icalparser_parse_string to create a new component from the - complete iCalendar text representation of the component. - -2001-03-31 Eric Busboom <eric@softwarestudio.org> - - * icalvalue Changed ACTION properties to take an ACTION value - instead of TEXT. The ACTION value is enumerated. - -2001-03-26 Eric Busboom <eric@softwarestudio.org> - - * icalparameter.h icalparameter_rsvp_* routines now take, return - ICAL_RSVP_TRUE and ICAL_RSVP_FALSE, not 0 and 1 - -2001-03-25 Eric Busboom <eric@softwarestudio.org> - - * icalrecur.c Many changes to get YEARLY rules working and fix - other errors. Recurrences are stil broken, but more types of rue - now work. - -2001-03-16 Eric Busboom <eric@softwarestudio.org> - - * icalparameter.c Changed icalparameter_new_from_string() to - icalparameter_new_from_value_string(). Created new - icalparameter_new_from_string() that takes strings of - form"PARAMNAME=PARAMVALUE" - - * *_XNAME changes all _XNAME enumerations to _X - - * derived props, values, parameters. Seperated out derived - proeprties, parameters and values into their own files. This makes - it easier to auto generate all of the enumerations for values, - parameters and proeprties. - - * icalenum.h Major changes to icalenum. Movel all of the - icalenum_* values to other modules, and changed the names. Look - for #defines in icalenum.h tying the old name to the new - name. Also moved all of the enumerations into other files. - - - -2001-02-26 Eric Busboom <eric@softwarestudio.org> - - * src/libical/icalproperty.c Added - icalproperty_set_parameter_from_string and - icalproperty_set_value_from_string to aid in binding to Python - -2001-02-15 Eric Busboom <eric@softwarestudio.org> - - * design-data/prop-to-value.txt Made a new CSV file, - properties.cvs That collects property-to-value and default value - information - - * src/libical/icalproperty.{c,h}.in Moved auto generated code into - icalderivedproperty.{c,h} and created icalderivedproperty.{c,h}.in - - - -2001-02-14 JP Rosevear <jpr@ximian.com> - - * src/libical/Makefile.am: Sigh, automake is dumber than i thought - -2001-02-12 JP Rosevear <jpr@ximian.com> - - * src/test/Makefile.am: link with the static versions - - * src/python/Makefile.am: use include dir discovered in configure checks - - * src/python/.cvsignore: shush - - * src/libical/icalrestriction.c: remove autogenerated file - - * src/libical/Makefile.am: the generated files are now disted so - look for them in the source dir rather than the build dir - - * src/Makefile.am: Only build the python dir if all the configure - stuff checked out - - * configure.in: Remove shared library disabling and add a python - check and allow for the python bindings to not be built - -2001-02-11 Eric Busboom <eric@softwarestudio.org> - - * src/python/Makefile.am Tweaked makefile to use automake more, - but it stil isn't quie right. - -2001-02-09 JP Rosevear <jpr@ximian.com> - - * Shush cvs - -2001-02-09 JP Rosevear <jpr@ximian.com> - - * src/libical/Makefile.am: Slightly over zealous during the merge - -2001-02-09 JP Rosevear <jpr@ximian.com> - - * src/libical/Makefile.am: Correct typo - - * Removal of more auto generated files - -2001-02-09 JP Rosevear <jpr@ximian.com> - - * Removal of various auto generated files - -2001-02-09 JP Rosevear <jpr@ximian.com> - - * src/libical/icalparameter.c.in (icalparameter_new_from_string): - its NEEDS-ACTION rather than NEEDSACTION - (icalparameter_as_ical_string): ditto - -2001-02-09 Eric Busboom <eric@softwarestudio.org> - - * python Added src/python directory. Inserted SWIG wrapper files, - and a simple interface to Component, Time, Duration, Period and - Store. - - * icallangbind.c More experimental work - - * icalduration.{c,h}, icalperiod.{c,h} Broke out period and - duration types into their own files - -2001-02-06 Christopher James Lahey <clahey@ximian.com> - - * src/libical/icallangbind.c: Added a missing #include here. - - * src/libical/icalrecur.c (icalrecur_add_bydayrules): Copy the - passed in const vals since we change it. - -2001-02-06 Eric Busboom <eric@softwarestudio.org> - - * icaltime.c Changed icaltime_from_day_of_year to run mktime in - the UTC timezone. This fixed a bug where it would return one day - eariler for some timezones. - -2001-02-05 Ettore Perazzoli <ettore@ximian.com> - - * src/libical/Makefile.am (COMBINEDHEADERS): `icalvalue.h', - `icalparameter.h', `icalproperty.h' and `icalrestriction.h' are - created in the builddir so they shouldn't be prefixed with - `$(top_builddir)/src/libical'. - -2001-01-26 Eric Busboom <eric@softwarestudio.org> - - * icalproperty.c.in Improved icalproperty_as_ical_string() to - eliminate the possibility of having a VALUE parameter that does - not match the actual kind of value. - - * icalvalue.c.in made icalvalue_*_trigger() and - icalvalue_*_datetimeperiod non-autogenerated. These routines were - for combined value type -- non standard values that can have more - than on standard value type. These non-standard types now delegate - to stadard types. - -2001-01-24 Dan Winship <danw@helixcode.com> - - * src/libical/icaltime.c: Remove unused "extern long timezone". - -2001-01-24 Eric Busboom <eric@softwarestudio.org> - - * icalfileset.c fixed icalfileset_read-from_file so it will handle - lines longer than 80 char properly. - -2001-01-23 JP Rosevear <jpr@ximian.com> - - * configure.in: Don't AC_INIT on an autogenerated file that does not - exist beforehand - -2001-01-23 Eric Busboom <eric@softwarestudio.org> - - * icltime.c Removed all of the _local_ routines and simplified - icaltime_utc_offset and icaltime_as_timet - - * regression.c Added tests for triggers and improvements to icaltime.c - - * icaltypes.c Addedd icaltriggertype_from_string and changed - icaltriggertype to be a struct - -2001-01-22 Eric Busboom <eric@softwarestudio.org> - - * icaltime.c implemented icaldurationtype_from_string to parse the - string it self, rather than use lex/yacc - -2001-01-15 Eric Busboom <eric@softwarestudio.org> - - * icalfileset.c Many improvements. File locking now works, and so - does searching with icalfileset_select() - -2001-01-08 Eric Busboom <eric@softwarestudio.org> - - * Makefile.am Remove spaces after -I in several - Makefile.am routines. - - * icalset.c removed return statements from some void functions. - - * icalparameter.c.in Added break to default: case that had no - body. Compilers on Solaris and Tru64 UNIX complained. - -2001-01-02 Eric Busboom <eric@softwarestudio.org> - - * icaltime.c Changed icaldurationtype_from_time and _as_timet to - _from_int and _as_int. This is a change interface that may break - some code. - - * icalgauge.c icalgaugeimpl.h, icalgauge.h., Rewrote gauge code to - use pvl-lists directly, instead of trying to reuse icalcomponent. - -2000-12-15 Ettore Perazzoli <ettore@helixcode.com> - - * src/libical/Makefile.am: Build `libical-static.la'. - -2000-12-14 Ettore Perazzoli <ettore@helixcode.com> - - * src/libical/Makefile.am (ical.h): - -2000-12-13 Federico Mena Quintero <federico@helixcode.com> - - * src/libical/icaltime.c (icaltime_from_timet): Use gmtime() - unconditionally, since we want an UTC broken-down representation. - (icaltime_as_timet): Add the offset only if the time was supposed - to be in UTC; that way mktime() will get a proper localtime as - source data. - -2000-12-13 Federico Mena Quintero <federico@helixcode.com> - - * src/libical/icaltime.c (icaltime_from_timet): time_t values - *are* in UTC by definition, so the is_utc argument is useless. - Removed the conversion to UTC and made the icaltimetype.is_utc be - TRUE always. This breaks libical's owne internal use of this - function, but since we do not use any of the functions that use it - that way, we can ignore this. This is basically a temporary - measure until libical does the right thing. - -2000-12-12 Eric Busboom <eric@softwarestudio.org> - - * icalparser.c Addedd support for x-parameters. - - * icalenum.c Fixed icalenum_parameter_type_to_string and - icalenum_property_type_to_string to property identify X- parameers - and properties. - - * icalparameter.c Fixed icalparameter_as_ical_string to property - write out X-Parameters. - - -2000-12-13 Christopher James Lahey <clahey@helixcode.com> - - * src/libical/icalerror.h: Added a name to the parameter to - icalerror_set_errno. - -2000-12-12 Eric Busboom <eric@softwarestudio.org> - - * icalparser.c Addedd support for x-parameters. - - * icalenum.c Fixed icalenum_parameter_type_to_string and - icalenum_property_type_to_string to property identify X- parameers - and properties. - - * icalparameter.c Fixed icalparameter_as_ical_string to property - write out X-Parameters. - - -2000-12-11 Eric Busboom <eric@softwarestudio.org> - - * icalcstp.c added empty bodies to prep_* routines so that shared - libraries would build. - -2000-12-13 Federico Mena Quintero <federico@helixcode.com> - - * src/libical/Makefile.am (COMBINEDHEADERS): Removed the explicit - paths. Why it did *not* work on my original try when they were - not there, well, now I don't know. - -2000-12-13 Ettore Perazzoli <ettore@helixcode.com> - - * src/libicalvcal/Makefile.am (INCLUDES): Add - `$(top_builddir)/src/libical' to the include directory list. - - * src/libical/Makefile.am (icalparameter.h): Use `$(srcdir)'. - (icalparameter.c): Likewise. - (icalproperty.h): Likewise. - (icalproperty.c): Likewise. - (icalvalue.h): Likewise. - (icalvalue.c): Likewise. - (icalrestriction.c): Likewise. - (CLEANFILES): Add `icalparameter.h', `icalparameter.c', - `icalproperty.h', `icalproperty.c', `icalrestriction.c', - `icalvalue.h', `icalvalue.c'. - (COMBINEDHEADERS): `icalvalue.h', `icalparameter.h' and - `icalproperty.h' are in builddir, not srcdir, so fix the list to - use `$(top_builddir)' instead of `$(top_srcdir)'. - (all): Removed. - (BUILT_SOURCES): Move `ical.h' here instead. - (ical.h): Don't depend on `(BUILT_SOURCES)'; this a built source - itself. - -2000-12-12 Joe Shaw <joe@helixcode.com> - - * src/libical/icalrecur.c: #if 0ed out some #if 1ed test code that - was breaking my build by #including ical.h. No cookie! - -2000-12-12 Dan Winship <danw@helixcode.com> - - * configure.in: Add a check for "extern int timezone;" vs struct - tm tm_gmtoff, stolen from Evolution's configure.in. - - * src/libical/icaltime.c (icaltime_utc_offset, - icaltime_local_utc_offset): Use HAVE_TIMEZONE, add tm_gmtoff - support. - - * src/libical/icallexer.l: Remove ical_yy_scan_buffer, ..._string, - and ..._bytes prototypes, since it compiles fine without them on - Linux, and bombs out due to prototype mismatch on my NetBSD box. - -2000-12-11 Federico Mena Quintero <federico@helixcode.com> - - * Makefile.am: - * configure.in: Disable compilation of the examples directory - until libicalss is fixed. - - * configure.in: Make AC_INIT() check for a file that is not - autogenerated! - - * configure.in: Added check for Perl. - -2000-12-11 Federico Mena Quintero <federico@helixcode.com> - - * configure.in (AC_OUTPUT): Fixed order of generated files to make - "make distcheck" work. Turn on AM_MAINTAINER_MODE. - - * src/libical/Makefile.am (EXTRA_DIST): Add icalversion.h.in. - (COMBINEDHEADERS): Added paths to make "make distcheck" work. - (libical_la_SOURCES): Added headers for distribution in our weird - setup. - -2000-12-11 JP Rosevear <jpr@helixcode.com> - - * src/libical/icaltime.c (icaltime_compare_date_only): New - function that compares only the dates, not the times as well. - - * src/libical/icaltime.h: Add prototype for the function above. - - * src/libical/icalrecur.h (struct icalrecurrencetype): Correct - header documentation. - - * src/libical/icaltypes.c: No longer include <limits.h>. - - * src/libical/icalrecur.c: Likewise. - - * src/libical/icalvalue.c.in: Likewise. - - * src/libical/icalyacc.y: Likewise. - -2000-12-06 Eric Busboom <eric@softwarestudio.org> - - * icaltime.c added icaltime_as_local to convert a UTC time to a - local time - - * icaltime.h icaltime.c Removed is_utc argument from - icaltime_from_timet - - -2000-11-29 Eric Busboom <eric@softwarestudio.org> - - * icalrecur.c More testing and bug fixes. Many more of the rules - in recur.txt work correctly. - -2000-11-28 Eric Busboom <eric@softwarestudio.org> - - * icalrecur.c Several changes to extract icalrecur.c from - libical. I'd like to make it into a reference impl for recurrence - rules. CHanges include moving all of the recurrence type and - recurrence enums from icalenum and icaltypes into icalrecur, and - adding code to parse recurrence rule strings. - - * icaltime.c Changed icaltime_from_string to parse the string - directly. Now icaltime.c has no dependency on icalvalue.c - -2000-11-21 Eric Busboom <eric@softwarestudio.org> - - * icalrecur.c Fixed a bug in the increment_* routines that made - incrementing by more then 1 insensible. Thanks to Martin Neimeier - -2000-11-20 Eric Busboom <eric@softwarestudio.org> - - * icalmessage.c Many routines to create new ical messages. - - * icalspanlist.c Code to generate a list of the busy time f the - VEVENTS in a set. Also includes routiens to generate free and busy - lists from the spanlist, and to find the next free time after a - given time. - - * icalvalue.c The STATUS property now has its own value type, - STATUS, which holds the enumeration icalproperty_status. - - * icalrestriction.c Added more restrictions. Now handles mutual - and exclusive consitions, and checks for the reight values in - STATUS properties - - -2000-11-10 Eric Busboom <eric@softwarestudio.org> - - * icaltypes.c Added routine to create durationtype from string: - icaldurationtype_from_string - -2000-11-09 Eric Busboom <eric@softwarestudio.org> - - * icalcomponet.c Add sever get/set convienience routines to access - and manipulate common component propoerties from the component - interface. This eliminates the need to create a lot of temporary - variables if you just want to change the start time of and event. - -2000-11-06 Eric Busboom <eric@softwarestudio.org> - - * icalcomponent.c Added new routines to icalcomponent: - _get_span -- returns the start and end times of the event in UTC - _get_first_real_component -- return ref to VTODO, VEVENT or VJOURNAL - - * icalspanlist.c Added new class, icalspanlist, that generates a - list of alternating busy and free times from an icalset. The class - includes routines to gnerate rfc2445 busy and free lists, and to - get the next avaliable busy or free time after a given time. - -2000-11-06 Federico Mena Quintero <federico@helixcode.com> - - * src/libical/icalvalue.c (icalvalue_recur_as_ical_string): Handle - both the position and weekday in the by_day field. - -2000-10-20 Jesse Pavel <jpavel@helixcode.com> - - * src/libical/icalproperty.c: added support for the - icalproperty_remove_parameter() function. - -2000-10-20 Eric Busboom <eric@agony.busboom.org> - - * Const correctness. Added 'const' all over everywhere. - -2000-10-19 Eric Busboom <eric@agony.busboom.org> - - * icalproperty, icalparameter, icalvalue .c, .h Changed most - instances of char* to const char* - - * icalclassify.h Added multiple include protection - - * icalset.h and others, got rid of parameter named "new" - -2000-10-15 Eric Busboom <eric@softwarestudio.org> - - * icalcomponent Added convienience functions for constructing - components: icalcomponent_new_vcalendar(), etc. - - * Makefile.am Incorporated build system patch from Federico - Quintero. Misc small fixes and cleanup - - * scripts Incorporated auto-gen patch from Frederico. Generated - code in libical now uses icalproperty.c.in (etc) instead of - editing file icalparoperty.c in place. - - * libical. Changed flex/bison to use the -P/-p options to set - ical_yy as a prefix. Removed prefix redefinition from icalyacc.y - -2000-10-12 Eric Busboom <eric@softwarestudio.org> - - * icalproperty.c Fixed icalproperty_get_{first,next}_parameter to - honor the parameter kind argument - - * icalparameter.c Added, but did not complete, a new version of - icalparameters_from_string that does not use the hairy nested - case/switch statements of the previous version - -2000-10-11 Damon Chaplin <damon@helixcode.com> - - * src/libical/icalparameter.c (icalparameter_as_ical_string): - (icalparameter_new_from_string): - * src/libical/icalparser.c (icalparser_add_line): add support for - 'X-' parameters. - -2000-10-07 Dan Winship <danw@helixcode.com> - - * src/libical/icalyacc.y (weekday_list): Fix the semicolons in - this rule. Noticed by x-virge. - - * src/test/Makefile.in: While I'm here, remove this from CVS, as - it's a generated file. - -2000-10-02 Eric Busboom <eric@softwarestudio.org> - - * ical.h ical.h and icalss.h now are concatenations of all of the - public headers for their respective libraries. Thus, only ical.h, - icalss.h and icalvcal.h need to be installed. - -2000-09-12 Ettore Perazzoli <ettore@helixcode.com> - - * configure.in: AC_OUTPUT the Makefile in `src' before the stuff - in its subdirs. - -2000-09-12 JP Rosevear <jpr@helixcode.com> - - * test-data/stresstest.ics: Merge missing file for distcheck - - * src/libicalss/icalcstp.h: ditto - - * src/libicalss/icalcsdb.h: ditto - -2000-09-11 Eric Busboom <eric@softwarestudio.org> - - * icalvcal.c Added more comments - -2000-09-01 JP Rosevear <jpr@helixcode.com> - - * configure.in: We don't need AC_PROG_RANLIB and - AM_PROG_LIBTOOL - - * src/libical/icalyacc.y (clear_recur): Explicitly - set the week_start to the Monday default in case the - recurrence rule does not. - -2000-08-31 JP Rosevear <jpr@helixcode.com> - - * Kill off more old, dead files - -2000-08-31 JP Rosevear <jpr@helixcode.com> - - * MacOS: This dir is not in 0.19 - -2000-08-31 JP Rosevear <jpr@helixcode.com> - - * src/libical/CHANGES: This file is not in 0.19 - -2000-08-31 JP Rosevear <jpr@helixcode.com> - - * src/libical/.gdb_history: Kill file - - * src/libical/.gdb_history: Kill file - -2000-08-31 JP Rosevear <jpr@helixcode.com> - - * src/pvl/Makefile: Kill old file - - * src/test/usecases.c: Kill old file - - * src/test/.cvsignore: Update - - * src/libicalvcal/.cvsignore: Update - - * examples/.cvsignore: Shut up - -2000-08-31 JP Rosevear <jpr@helixcode.com> - - * configure.in: Don't list config.h in AC_OUTPUT - -2000-08-26 Ettore Perazzoli <ettore@helixcode.com> - - * examples/Makefile.am (INCLUDES): More `$(srcdir)' loving. - - * src/libicalvcal/Makefile.am (INCLUDES): Add `-I - $(srcdir)/../libical' for builddir != srcdir loving. - -2000-08-25 Christopher James Lahey <clahey@helixcode.com> - - * examples/access_properties_and_parameters.c, - src/libicalvcal/vcc.y: Got rid of some warnings. - - * src/libicalvcal/vcc.c: Checking in generated C file. - -2000-08-25 Christopher James Lahey <clahey@helixcode.com> - - * src/libical/icalcomponent.c: Fixed an incorrect struct name. - -2000-08-25 Peter Williams <peterw@helixcode.com> - - * src/libical/icalcomponent.c (icalcomponent_end_component): Compile fix; - use icalerror_check_arg_re so we can return an valid icalcompiter. - (icalcomponent_begin_component): Same. - -2000-08-24 JP Rosevear <jpr@helixcode.com> - - * src/libical/icalvcal.h: Remove this duplicate file to fix build - -2000-08-24 Federico Mena Quintero <federico@helixcode.com> - - * src/test/Makefile.am: Make it work. - -2000-08-04 Eric Busboom <eric@softwarestudio.org> - - * stow.c Changed stow to write data to a file ( icalfileset) not a - calendar. Also added MIME parsing capability - - * sspm.c Core of the mime processor. Now handles quoted-printable - and base64 encodings - - * icalmime.h New file that parses mime data and returns an - icalcomponent that includes all of the parts. - - -2000-07-26 Eric Busboom <eric@softwarestudio.org> - - * icaldirset.h misc bug fixes to get deleting components to work - - * icalcomponent.h Eliminated internal use of _get_first_component - and _get_next_component, since these will reset the interal - iterators. - -2000-07-23 Eric Busboom <eric@softwarestudio.org> - - * icalcomponent.h Added external iterators to icalcomponent for - subcomponents: icalcompiter. These are still experimental, but they - seem to work OK and have a nice syntax - -2000-07-18 Eric Busboom <eric@softwarestudio.org> - - * icalset This is a new "superclass" for icalstore, icalcluster, - and others. It merges the interfaces of the old icalstore and - icalcluster - - * icalstore.{c,h} CHanged name to icaldirset - - * icalcluster.{c,h} Changed name to icalfileset - - -2000-06-12 Eric Busboom <eric@softwarestudio.org> - - * icalstow.c misc improvements and bug fixes to make it useful. - -2000-06-09 Eric Busboom <eric@softwarestudio.org> - - * icalrecur.c More extensive code changes for recurrence rule. - - * icalyacc.y Added support for integers in by day lists - -2000-06-08 Ettore Perazzoli <ettore@helixcode.com> - - * src/test/Makefile.am (INCLUDES): Likewise. - - * src/libicalss/Makefile.am (INCLUDES): Use $(srcdir) to allow - builddir != srcdir. - -2000-06-01 Eric Busboom <eric@softwarestudio.org> - - * icalrecur.c moved recur code into new files - -2000-05-30 Eric Busboom <eric@softwarestudio.org> - - * icaltypes.c Extensive work on code to expand recurences - - * icaltypes.h Changed signature icaltimetype_from_timet to include - is_utc flag. - - -2000-03-17 Eric Busboom <eric@softwarestudio.org> - - * icalstore.c Vastly improved icalstore_test. - -2000-03-16 Eric Busboom <eric@softwarestudio.org> - - * icalcluster.c Added compile flag (ICAL_SAFESAVES) to switch how - icalcluster saves files during commits. When the flag is define, - it will write the data to a temorar file and rename the file to - the target file. - - * storage.c Added seterate test suite for sotage components - - * icalparser.c Created parser object, implemented line-oriented - parsering, and made message oriented parsing work in terms f line - oriented parsing. - - * icalparser.c Fixed icalparser_get_line to remove \r in input. - - diff --git a/libical/INSTALL b/libical/INSTALL deleted file mode 100644 index b3f195d679..0000000000 --- a/libical/INSTALL +++ /dev/null @@ -1,24 +0,0 @@ -Building the library --------------------- - -This distribution is developed on Red Hat Linux 6.0 and usually -compiles on SunOS 5.6 and FreeBSD 2.27. I have reports of success of -previous version on MacOS ( with CodeWarrior ) and on UnixWare, but I -don't know about any other systems. - -The library is configured with automake. From the root directory, run - - ./configure - -To build all of the Makefiles for your system. If you will be installing the library, you may want to use the --prefix flag to set the directory where the library and header files will be installed. - - ./configure --prefix=/proj/local/ - -If configure runs fine, run "make" to build the library and -"make install" to install it. - -The current version of libical focuses on creating and -manipulating iCal objects. With it, you can parse text representations -of iCal components, add and remove sub-components, properties, -parameters and values, and print the components back out as strings. - diff --git a/libical/Makefile.am b/libical/Makefile.am deleted file mode 100644 index a71157bed4..0000000000 --- a/libical/Makefile.am +++ /dev/null @@ -1,12 +0,0 @@ - -EXTRA_DIST = \ - ChangeLog \ - README \ - TEST \ - TODO - -SUBDIRS = design-data doc scripts test-data src - -# Disabled examples until it builds -#SUBDIRS = design-data doc scripts test-data src examples - diff --git a/libical/NEWS b/libical/NEWS deleted file mode 100644 index 16a7924645..0000000000 --- a/libical/NEWS +++ /dev/null @@ -1,447 +0,0 @@ -Version 0.23, 26 Mar 01 ( cvs tag libical-0-23 ) ------------------------------------------------- - -**** Incompatibilities with previous versions **** - -icalparameter_new_rsvp -icalparameter_get_rsvp -icalparameter_set_rsvp - - These routines now take and return ICAL_RSVP_TRUE and - ICAL_RSVP_FALSE instead of 0 and 1 - -icalenum_*_to_* - - These routines have been moved to icalproperty, icalparameter - or icalvalue - - - -Python interface: An alpha level python interface is available in -src/python. - -Perl interface: A pre-alpha level interface is available in -src/Net-ICal-Libical - -Code Autogeneration: Converted all of the important files in -design-data/ to .csv files and improved the code that is generated -from them. Now all of the enumerations for property, parameters and -values are generated from thes files, as are the string -representations for the enumerations. You can add a new property or -parameter to the system simply by adding a line to the appropriate -file in design-data/ - -Recurrences: Improved the recurrence code by fixing bugs in MONTHLY -recurrences and completely re-implementing expand_year_days() for -YEARLY recurrences. Hubert V's aided in testing. - -Build system: JP Rosevear made several improvements to the build -system. Now checking out the code from cvs should give to a complete -but minimal distribution, without any of the autognerated files. - -Interface changes: Nearly all of the icalenum routines for converting -between strings and enumerations have been moved out of icalenum into -icalproperty, icalparameter and icalvalue. This means that their names -have changed, although #defines have been added to icalenum.h to map -back to the old names. - -Added src/libical/icllangbind.c that has some functions to make it -easier to bind libical to other languages. - - -Version 0.22, 15 Jan 01 ( cvs tag libical-0-22) ----------------------------------------------- - -Many improvements to the time routines in icaltime.c. I think that -they actually make sense now. Note that there is an interface change -with icaltime_from_timet() -- I removed the is_utc parameter, since -all timet values are in UTC. Use icaltime_from_int() if you really -want the old interface - -Major improvements to icalfileset. icalfileset_select now works and so -does file locking. - -Minor revision to the documentation, but it does include a new section -on file storage ( icalfileset ) and time ( icaltime.c) - -Lots of bug fixes and small patches. - -I improved the regression test in src/test/regression.c. It now have -command line switches to select specific tests ( undocumentated, of -course ) and more of the tests include asserts, so you can just run it -without looking at the output. If the test runs without crashing, it -is mostly OK. - - - -Version 0.21, 20 Nov 00 ( cvs tag libical-0-21) ----------------------------------------------- - - * icalmessage.c Many routines to create new ical messages. - - * icalspanlist.c Code to generate a list of the busy time f the - VEVENTS in a set. Also includes routiens to generate free and busy - lists from the spanlist, and to find the next free time after a - given time. - - * icalvalue.c The STATUS property now has its own value type, - STATUS, which holds the enumeration icalproperty_status. - - * icalrestriction.c Added more restrictions. Now handles mutual - and exclusive consitions, and checks for the reight values in - STATUS properties - - * icaltypes.c Added routine to create durationtype from string: - icaldurationtype_from_string - - - * icalcomponet.c Add sever get/set convienience routines to access - and manipulate common component propoerties from the component - interface. This eliminates the need to create a lot of temporary - variables if you just want to change the start time of and event. - - - * icalcomponent.c Added new routines to icalcomponent: - _get_span -- returns the start and end times of the event in UTC - _get_first_real_component -- return ref to VTODO, VEVENT or VJOURNAL - - * icalspanlist.c Added new class, icalspanlist, that generates a - list of alternating busy and free times from an icalset. The class - includes routines to gnerate rfc2445 busy and free lists, and to - get the next avaliable busy or free time after a given time. - - -Version 0.20D 3 Nov 00 ------------------------ - -Many miscelaneous tweaks to the build system - -More work to icalclassify. - -Aded routines to icaltime.c to convert to and from specific timezones -in Olsen format ("America/Los_Angeles") - - -Version 0.20 7 Sept 00 (cvs tag libical-0-20 ) ----------------------------------------------- - -Addedd icalclassify() which looks at a message and determine how to -process it. - -Misc bug fixes and tweaks. - -Version 0.19 6 August 00 (cvs tag libical-0-19) ------------------------------------------------ - -Created a MIME parser in icalmime.c. This will take any complex MIME -encapsulated message and return an icalcomponent with the same -structure. Each MIME part is represented by a component of type -X-LIC-MIMEPART. - -Added MIME partsing to stow.c - -Added external iterators to icalcomponent. See test_iterators() in -test/regression.c - -Refactored icalcluster and icalstore into icalset, icalfileset and -icaldirset, which have a pseudo inheritance relationship between them. - -Fixed more memory leaks. - -Version 0.18a 10 June 00 ( cvs tag libical-0-18a ) ------------------------------------------------ - -Did the final tweaks to stow.c, a program to recieve and store iMIP -messages. - - -Version 0.18 10 June 00 ( cvs tag libical-0-18 ) ------------------------------------------------ - -Added libicalvcal, which includes the Versit code for parsing vCal -files and a routine (icalvcal_convert() ) that converts a vCal object -to an iCal object. The test program is src/test/testvcal. - -Added marginally functional recurrence code. The curent code does not -handle all of the examples in rfc2445 ( which are extracted in -test-data/recur.txt ) but it can do all of the obvious cases. See the -test program in src/test/recur.c for an example. In particular, the -code cannot handle the integer values in BYDAY, nor negative integers -in BYMONTH or BYMONTHDAY. It also cannot handle BYSETPOS. - -Moved some code to the examples directory and improved the comments. - -Did a little more work on the documentation in the doc directory. The -documentation is in LyX source, but there is a text version in -UsingLibical.txt - - -Version 0.17 15 May 00 (cvs tag libical-0-17 ) ---------------------------------------------- - -Fixed two bugs that added extraneous '/' to test values - -Fixed type in internal string for the COUNTER method - -Eliminated a memory leak in icalparser.c - - -Version 0.16a 29 April 00 ----------------------------------------------- - -Fixed bug in icalvalue_new_from_string that caused METHOD value to -choke on non standard input. - -Fixed a memory leak in icalparser_add_line -- failed to free 'line' - - -Version 0.16 5 April 00 ( cvs tag libical-0-16) ----------------------------------------------- - -Now using automake. - -Substantial changes to the parser. New interfaces let you parser -multiple components from a single stream by feading the parser object -one line at a time. - -Added a STRING value type. this type is like TEXT, but does not -backslash magic characters. It is used in PRODID and REQUEST-STATUS, -where the '/' and ';' are literal. - -Added several convience functions for REQUEST-STATUS to icalenums.c - -Addedd a routine to icalcomponent to convert X-LIC errors to -REQUEST-STATUS return values. - -Version 0.15a 5 Mar 00 (cvs tag libical-0-15a) ---------------------- - -Experimented with CVS - -Fixed icalvalue_set_text to convert escaped characters into the proper -values. - -Other minor code tweaks. - - -Version 0.15 7 Feb 00 ---------------------- - -Split the storage classess ( icalstore, icalcluster, icalcalendar ) -into a seperate library, libicalss - -Implemented restriction checking in file icalrestrictions.c. The -checking is not complete, but can handle the bulk of the restrictions -described in RFC 2446. - -Created a new value type, METHOD. Changed METHOD property to use the -new value. The METHOD value uses an enumeration. - - -Version 0.14b -------------- - -Implemented parsing of RECUR values, although it does not handle BYDAY -specs with numbers. - -Fixed error in icalparser_next_line that mangled lines longer than the -temp buffer (1024 chars.) The temp buffer is now 80 chars, and it can -handle (apparently) arbitrary length lines - -Fixed severe brokenness in a value, but I forgot which one. - -Cleaned cruft out of the distribution, so the tarfile is smaller. - - -Version 0.14a 14 Jan 00 ------------------------ - -Fixed bug in ROLE parameter -- missing '-' in the text of allowed values - -Fixed bug in X-parameters - -Version 0.14 11 Jan 00 ----------------------- - -Fixed wrong value type for TRIGGER property - -Added Calendar object. Calendar is an aggregate of two stores and two -clusters, and can store all of the inforamation associated with a -calendar. - -icalcomponent_add_property and icalcomponent_add_component will -complain if you try to add a component or property that is already -part of an other component. The *_free routines wil complain if you try -to free a linked component or property. - -More improvements to error handling. - -Parser is much more robust. - -Minor memory enhancements. - -Regression test runs without memory leaks. - -Version 0.13d 21Dec99 ---------------------- - -Seperated perl interface and library - -Added autoconf support - -Scripts that generate derived properties, values and parameters now -change source and header files inline. - -Changed icalstore to cluster all components with DTSTART in a month -into a single file. This should reduce number of file accesses by a -factor of 60. - -Ran code through Purify and fixed memory leaks. - - -Version 0.13 16Nov99 ---------------------- - -Yet more bug fixes! Yeah! - -Added better error handling. The Parser inserts X-LIC-*ERROR -properties to warn of parsing errors. - -The imip source/sink programs in /src/imip is demonstrably functional. - -Version 0.12b 17Oct99 ---------------------- - -More bug fixes, particularily in parse from string routines - -ICal::Store is mostly functional - -This is version is a checkpoint, not a release. - -Version 0.12a 10Oct99 ---------------------- - -Expanded perl interface: - Added 1/2 of Store module - Fixed bugs - Implemeted get_{first,next}_property - -Extended C interface - Made get_{first,next}_property work properly - Fixed bugs - - -This is version is a checkpoint, not a release. - -Version 0.12 27Aug99 --------------------- - -Added a rudimentatry perl interface - -This is version is a checkpoint, not a release. - - -Version 0.11 11Aug99 --------------------- - -Eliminated most use of flex/bison -- all parsing, except for the -values, is done in C. - -Cleaned up memory leaks. Purify claims that I got them all. - -Moved all derived component/prop/param/value code ( in .inc / .h -files) into main files ( icalcomponent.{c,h}, icalproperty.{c,h}, etc/ -) - -Implemented *_clone routines. - -Fixed a lot of bugs. - -Implemented more value types. Still unimplemeneted are BINARY and RECUR - -Included MacOS/Code Warior files from Graham Davison - - -Version 0.10 8Jul99 -------------------- - -Eliminated shift/reduce and reduce/reduce conflicts in the parser. -This version is almost feature complete -- it has the basic structure -for all of the library's functionality, and it will only require -implementing procedure shells and fixing bugs. I think that all of the -hard work is done... - -Version 0.09a,b 3,7 Jul99 -------------------------- - -Various improvements to the parser, added some functionality. The parser code -is mostly complete, and should be fully functional, except for a horde of -bugs. Also added support for X-Properties. - -Version 0.09 25Jun99 --------------------- - -Added a parser in files src/comp/icalitip.{y,l} The lexer is mostly -functional, but the parser is not. - - -Version 0.08 2Jun99 --------------------- - -All files now have MPL licensing - -Implement enough of the code to perform some rudimentary testing - - -Version 0.07 14May99 --------------------- - -Remove all interfaces that construct object from a string - -Moved most code back into comp directory - -Implemented C files for most headers -- usecases.c now links. - -Many improvements to generation scripts. - - - -Version 0.06 25Apr99 --------------------- - -Expanded distribution to include: - Directory structure that can accomodate future expansion - Several levels of Makefiles - This CHANGES file - -Added headers for irip and parse modules - -Added several files with design information - -Added scripts that I had used to generate much of the ical header code. - -Split C headers from CC headers - -Added data for iTIP and iCAL component restrictions in restrictions.csv - -Version 0.05 11Apr99 ----------------------- - -Changes to ical headers - - Added derived Property classes. - - Improved the interface to the derived property and parameter classes - - Added derived component classes. - - Created usecases.c and ccusecases.cc to demonstrate use - - C++ interface compile - - -Version 0.04 5Apr99 -------------------- - -Version 0.02 30Mar99 --------------------- diff --git a/libical/README b/libical/README deleted file mode 100644 index 92b2ff6e86..0000000000 --- a/libical/README +++ /dev/null @@ -1,100 +0,0 @@ - -LIBICAL -- An implementation of basic iCAL protocols - -The code and datafiles in this distribution are licensed under the -Mozilla Public License. See http://www.mozilla.org/NPL/MPL-1.0.html -for a copy of the license. Alternately, you may use libical under the -terms of the GNU Library General Public License. See -http://www.fsf.org/copyleft/lesser.html for a copy of the LGPL. - -This dual license ensures that the library can be incorporated into -both proprietary code and GPL'd programs, and will benefit from -improvements made by programmers in both realms. I will only accept -changes into my version of the library if they are similarly -dual-licensed. - -The code in this distribution implements the iCal protocols as -described in RFC2445 and RFC2446. The code is in very early stages of -development. - -Portions of this distribution are (C) Copyright 1996 Apple Computer, -Inc., AT&T Corp., International Business Machines Corporation and -Siemens Rolm Communications Inc. See src/libicalvcal/README.TXT for -details. - -This code is under active development. If you would like to contribute -to the project, you can contact me, Eric Busboom, at -eric@softwarestudio.org. The project has a webpage at - - http://softwarestudio.org/libical/index.html - -and a mailing list that you can join by sending the following mail: - - ------------ - To: minimalist@softwarestudio.org - Subject: subscribe libical - ------------ - - -Building the library --------------------- - -This distribution is developed on Red Hat Linux 6.0 and usually -compiles on SunOS 5.6 and FreeBSD 2.27. I have reports of success of -previous version on MacOS ( with CodeWarrior ) and on UnixWare, but I -don't know about any other systems. - -The library is configured with automake. From the root directory, run - - ./configure - -To build all of the Makefiles for your system. If you will be installing the library, you may want to use the --prefix flag to set the directory where the library and header files will be installed. - - ./configure --prefix=/proj/local/ - -If configure runs fine, run "make" to build the library and -"make install" to install it. - -Although the distribution uses libtool to generate libraries, it has -shared libraries turned off by default. To create and install shared -libraries use: - - ./configure --enable-shared - -The current version of libical focuses on creating and -manipulating iCal objects. With it, you can parse text representations -of iCal components, add and remove sub-components, properties, -parameters and values, and print the components back out as strings. - - -Notes for Libical Developers -------------------- - -If you don't want to use gcc as the compiler, and you got the sources -from CVS, you should set the CC variable to the path to the compiler -and run "automake --include-deps" to keep automake from using -gcc-specific automatic dependancy tracking. - - > CC=/pkg/SUNWspro/bin/cc; export CC - > automake --include-deps - > ./configure --prefix=/proj/local/ - > make - -You will not need to re-run automake unless you got the sources from CVS. - -Using the Library ------------------ - -There is rudimentary, unfinished documentation in the /doc directory, -and annotated examples in /examples. - - -Perl Library ------------- - -There is a perl language binding of this library, LIBICAL. -It is available from http://www.softwarestudio.org/libical - - -Eric Busboom -eric@softwarestudio.org diff --git a/libical/TEST b/libical/TEST deleted file mode 100644 index 90c3473b31..0000000000 --- a/libical/TEST +++ /dev/null @@ -1,4 +0,0 @@ - -Parser Tests ------------- -Use iCAL keywords as first words of unquoted strings
\ No newline at end of file diff --git a/libical/THANKS b/libical/THANKS deleted file mode 100644 index a56bca9365..0000000000 --- a/libical/THANKS +++ /dev/null @@ -1,54 +0,0 @@ -Thanks to: - -Allan Clark <allanc@atlas.platypus.bc.ca> for testing libical against -UnixWare. - -Graham Davison <g.m.davison@computer.org> for MacOS support and -miscelaneous code bits - -Seth Alves <alves@hungry.com> for the first cut at the Makefile.am -files and various utility functions. - -Russ Steinthal <rms39@columbia.edu> for several utility functions and -comments. - -Ola Lundqvist <olalu526@student.liu.se> for the vCal test data file. - -Colin DuPlantis <colin@cp.net> for new functions in icalparser.c - -Holger Schmidt <hschmidt@chronolabs.de> for all of icalcstp.c, The -CSTP protocol implementation, and modifications to icalcstp.h - -Gisle Hannemyr <gisle@oslonett.no> The decode*() functions in sspm.c -are based on the decode() routine in the mimelite program, Copyright -(c) 1994 Gisle Hannemyr. - -The Evolution team at Helixcode ( Federico Mena Quintero -<federico@helixcode.com>, JP Rosevear <jpr@helixcode.com>, Ettore -Perazzoli <ettore@helixcode.com>, Christopher James Lahey -<clahey@helixcode.com>, Peter Williams <peterw@helixcode.com>) for -miscelaneous patches and adjustments to the build system. - -Cornelius Schumacher <schumacher@kde.org> for many insightful -suggestions and a few patches. - -Mark D. Anderson <mda@discerning.com> for discussions and ideas. - -Martin Neimeier <nei@ibn.de> for correcting bugs in icalrecur.c - -Tom Leitner <tom@radar.tu-graz.ac.at> For several bug fixes in -compiling on Tru64 UNIX. - -Patrick Lewis <plewis@inetarena.com> for several bug reports and -contributions to the Python bindings - -Larry W. Virden <lvirden@cas.org> for several bug reports in compiling -on Solaris. - -Bryan Bartone <bsb@mesasys.com> for code changes based on porting -libical to Windows. - -Hubert V <hubertv@bigfoot.com> for checking and analyzing the output -of the recurrence rule system. - -Jonathan Yue <jonathan.yue@cp.net> for icalproperty_get_name() diff --git a/libical/TODO b/libical/TODO deleted file mode 100644 index eb52fb7a25..0000000000 --- a/libical/TODO +++ /dev/null @@ -1,39 +0,0 @@ - -TODOs for libical-0.16 ---------------------- - -libical treats properties with multiple values incorrecty -- it always -seperates multiple values into multiple properties. This is not -acceptable for CATEGORIES and RESOURCES. - -Some TEXT valued properties, like METHOD, have a limited set of valid -values. The code should check that the values of these properites are -valid. ( Although METHOD now uses enums, and is not really TEXT valued ) - -Finish implementing values - ATTACH/BINARY - content_type - language - -Check for buffer overflow on external input. - -Error Handling - - Dates and times: the parser will accept many illegal date time - values - -RECUR values ignore integers in BYDAY clauses, ie 'FREQ=MONTHLY;BYDAY=-1SU' - -Restrictions code does not catch lack of DTEND or DURATION - -For some value types, if there illegal characters in the value ( like -4.56 in an integer value), the parser will output the characters to -stdout. - -Check all uses of strcpy and sprinf for buffer overflows - -Make the mime parsing code in sspm grow the list of parts as needed, -rather than having a hard limit. - -in sspm.c, and unrecognized content-transfer-encoding values must -force a content type of application/octet-stream. diff --git a/libical/acconfig.h b/libical/acconfig.h deleted file mode 100644 index f4909b0c46..0000000000 --- a/libical/acconfig.h +++ /dev/null @@ -1,20 +0,0 @@ -/* Define to make icalerror_* calls abort instead of internally - signalling an error */ -#undef ICAL_ERRORS_ARE_FATAL - -/* Define to make icalcluster_commit() save to a temp file and mv to - the original file instead of writing to the orig file directly */ -#undef ICAL_SAFESAVES - -/* Define to terminate lines with "\n" instead of "\r\n" */ -#undef ICAL_UNIX_NEWLINE - -/* Define if your libc defines a "timezone" variable */ -#undef HAVE_TIMEZONE - -/* Define if your libc defines a struct tm containing a "tm_gmtoff" member */ -#undef HAVE_TM_GMTOFF - -/* Define to 1 if your compile does not like lines like: struct - something foo[]*/ -#undef ICAL_NO_EMPTY_ARRAY_DECL diff --git a/libical/autogen.sh b/libical/autogen.sh deleted file mode 100755 index e15e4e33a8..0000000000 --- a/libical/autogen.sh +++ /dev/null @@ -1,80 +0,0 @@ -#!/bin/sh -# Run this to generate all the initial makefiles, etc. - -srcdir=`dirname $0` -test -z "$srcdir" && srcdir=. - -ORIGDIR=`pwd` -cd $srcdir -PROJECT=libical -TEST_TYPE=-d -FILE=src - -DIE=0 - -(autoconf --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have autoconf installed to compile $PROJECT." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -(automake --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have automake installed to compile $PROJECT." - echo "Get ftp://ftp.cygnus.com/pub/home/tromey/automake-1.2d.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 -} - -if test "$DIE" -eq 1; then - exit 1 -fi - -test $TEST_TYPE $FILE || { - echo "You must run this script in the top-level $PROJECT directory" - exit 1 -} - -if test -z "$*"; then - echo "I am going to run ./configure with no arguments - if you wish " - echo "to pass any to it, please specify them on the $0 command line." -fi - -case $CC in -*xlc | *xlc\ * | *lcc | *lcc\ *) am_opt=--include-deps;; -esac - -if test -z "$ACLOCAL_FLAGS"; then - - acdir=`aclocal --print-ac-dir` - m4list="glib.m4" - - for file in $m4list - do - if [ ! -f "$acdir/$file" ]; then - echo "WARNING: aclocal's directory is $acdir, but..." - echo " no file $acdir/$file" - echo " You may see fatal macro warnings below." - echo " If these files are installed in /some/dir, set the ACLOCAL_FLAGS " - echo " environment variable to \"-I /some/dir\", or install" - echo " $acdir/$file." - echo "" - fi - done -fi - -aclocal $ACLOCAL_FLAGS - -# optionally feature autoheader -(autoheader --version) < /dev/null > /dev/null 2>&1 && autoheader - -automake -a $am_opt -autoconf -cd $ORIGDIR - -$srcdir/configure "$@" - -echo -echo "Now type 'make' to compile $PROJECT." diff --git a/libical/configure.in b/libical/configure.in deleted file mode 100644 index 3b69f4d5ee..0000000000 --- a/libical/configure.in +++ /dev/null @@ -1,103 +0,0 @@ -dnl Process this file with autoconf to produce a configure script. -AC_INIT(src) -AM_INIT_AUTOMAKE(libical,0.23a) -AM_CONFIG_HEADER(config.h) - -dnl Initialize maintainer mode -AM_MAINTAINER_MODE - -dnl Checks for programs. -AC_PROG_YACC -AC_PROG_CC -AM_PROG_LEX -AC_PROG_LN_S -AC_PROG_INSTALL - -dnl Initialize libtool -AM_PROG_LIBTOOL - -AC_SUBST(AR) - -AC_CHECK_PROGS(AR, ar aal, ar) -AC_CHECK_PROGS(PERL, perl5 perl) - -AC_DEFINE(ICAL_ERRORS_ARE_FATAL,1) -AC_DEFINE(ICAL_SAFESAVES,1) -AC_DEFINE(ICAL_UNIX_NEWLINE,1) -dnl AC_DEFINE(ICAL_NO_EMPTY_ARRAY_DECL) - -dnl Checks for libraries. -dnl Replace `main' with a function in -lical: -dnl AC_CHECK_LIB(ical, main) - -dnl Checks for header files. -AC_HEADER_STDC -AC_CHECK_HEADERS(time.h sys/types.h assert.h) - -dnl Checks for typedefs, structures, and compiler characteristics. -AC_C_CONST -AC_TYPE_SIZE_T -AC_STRUCT_TM - -dnl Checks for library functions. -AC_CHECK_FUNCS(strdup) - -dnl ************************************************** -dnl * Check for Python -dnl ************************************************** -python_val=false -AC_ARG_ENABLE(python-bindings, -[ --enable-python-bindings=[yes/no] Enable python bindings],,enable_python_bindings=yes) -if test "x$enable_python_bindings" = "xyes"; then - python_val=true -else - python_val=false -fi - -if $python_val; then - AC_CHECK_PROG(python_val, python, true, false) -fi -if $python_val; then - AC_CHECK_PROG(python_val, swig, true, false) -fi - -if $python_val; then - PY_PREFIX=`python -c 'import sys ; print sys.prefix'` - PY_EXEC_PREFIX=`python -c 'import sys ; print sys.exec_prefix'` - changequote(<<, >>)dnl - PY_VERSION=`python -c 'import sys ; print sys.version[0:3]'` - changequote([, ])dnl - if test -f $PY_PREFIX/include/python$PY_VERSION/Python.h; then - PY_LIBS="python$PY_VERSION" - PY_LIB_LOC="-L$PY_EXEC_PREFIX/lib/python$PY_VERSION/config" - PY_CFLAGS="-I$PY_PREFIX/include/python$PY_VERSION" - PY_MAKEFILE="$PY_EXEC_PREFIX/lib/python$PY_VERSION/config/Makefile" - PY_LOCALMODLIBS=`sed -n -e 's/^LOCALMODLIBS=\(.*\)/\1/p' $PY_MAKEFILE` - PY_BASEMODLIBS=`sed -n -e 's/^BASEMODLIBS=\(.*\)/\1/p' $PY_MAKEFILE` - PY_OTHER_LIBS=`sed -n -e 's/^LIBS=\(.*\)/\1/p' $PY_MAKEFILE` - PY_EXTRA_LIBS="$PY_LOCALMODLIBS $PY_BASEMODLIBS $PY_OTHER_LIBS" - AC_SUBST(PY_LIBS) - AC_SUBST(PY_LIB_LOC) - AC_SUBST(PY_CFLAGS) - AC_SUBST(PY_EXTRA_LIBS) - else - python_val=false - fi -fi -AM_CONDITIONAL(WITH_PYTHON, $python_val) - -AC_OUTPUT([ -Makefile -design-data/Makefile -doc/Makefile -scripts/Makefile -src/Makefile -src/libical/Makefile -src/libical/icalversion.h -src/libicalss/Makefile -src/libicalvcal/Makefile -src/python/Makefile -src/test/Makefile -test-data/Makefile -]) - diff --git a/libical/design-data/.cvsignore b/libical/design-data/.cvsignore deleted file mode 100644 index 3dda72986f..0000000000 --- a/libical/design-data/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -Makefile.in -Makefile diff --git a/libical/design-data/Makefile.am b/libical/design-data/Makefile.am deleted file mode 100644 index 8f27cd6ce0..0000000000 --- a/libical/design-data/Makefile.am +++ /dev/null @@ -1,6 +0,0 @@ -EXTRA_DIST =\ - properties.csv \ - parameters.csv \ - restrictions.csv \ - status.txt \ - value-types.csv diff --git a/libical/design-data/components.txt b/libical/design-data/components.txt deleted file mode 100644 index ae5cc976ad..0000000000 --- a/libical/design-data/components.txt +++ /dev/null @@ -1,22 +0,0 @@ -VCALENDAR -VEVENT -VTODO -VJOURNAL -VFREEBUSY -VTIMEZONE -XSTANDARDTIME -XDAYLIGHTSAVINGSTIME -VALARM -XAUDIOALARM -XDISPLAYALARM -XEMAILALARM -XPROCEDUREALARM -X -VSCHEDULE -VQUERY -VCAR -VCOMMAND -XLICINVALID -XMIMEPART -ANY - diff --git a/libical/design-data/param-c-types.txt b/libical/design-data/param-c-types.txt deleted file mode 100644 index 3f690fa0dc..0000000000 --- a/libical/design-data/param-c-types.txt +++ /dev/null @@ -1,23 +0,0 @@ -ALTREP const char* -CN const char* -CUTYPE icalparameter_cutype -DELEGATED-FROM const char* -DELEGATED-TO const char* -DIR const char* -ENCODING icalparameter_encoding -FBTYPE icalparameter_fbtype -FMTTYPE const char* -LANGUAGE const char* -MEMBER const char* -PARTSTAT icalparameter_partstat -RANGE icalparameter_range -RELATED icalparameter_related -RELTYPE icalparameter_reltype -ROLE icalparameter_role -RSVP int -SENT-BY const char* -TZID const char* -VALUE icalparameter_value -X const char* -X-LIC-ERRORTYPE icalparameter_xlicerrortype -X-LIC-COMPARETYPE icalparameter_xliccomparetype diff --git a/libical/design-data/parameters.csv b/libical/design-data/parameters.csv deleted file mode 100644 index c71eb115eb..0000000000 --- a/libical/design-data/parameters.csv +++ /dev/null @@ -1,24 +0,0 @@ -"#Name ","C Type","Enumeration Values" -"ALTREP","const char*", -"CN","const char*", -"CUTYPE","icalparameter_cutype","INDIVIDUAL;GROUP;RESOURCE;ROOM;UNKNOWN" -"DELEGATED-FROM","const char*", -"DELEGATED-TO","const char*", -"DIR","const char*", -"ENCODING","icalparameter_encoding","8BIT;BASE64" -"FBTYPE","icalparameter_fbtype","FREE;BUSY;BUSYUNAVAILABLE;BUSYTENTATIVE" -"FMTTYPE","const char*", -"LANGUAGE","const char*", -"MEMBER","const char*", -"PARTSTAT","icalparameter_partstat","NEEDS-ACTION;ACCEPTED;DECLINED;TENTATIVE;DELEGATED;COMPLETED;INPROCESS" -"RANGE","icalparameter_range","THISANDPRIOR;THISANDFUTURE" -"RELATED","icalparameter_related","START;END " -"RELTYPE","icalparameter_reltype","PARENT;CHILD;SIBLING" -"ROLE","icalparameter_role","CHAIR;REQ-PARTICIPANT;OPT-PARTICIPANT;NON-PARTICIPANT" -"RSVP","icalparameter_rsvp","TRUE;FALSE" -"SENT-BY","const char*", -"TZID","const char*", -"VALUE","icalparameter_value","BINARY;BOOLEAN;DATE;DURATION;FLOAT;INTEGER;PERIOD;RECUR;TEXT;TIME;URI;ERROR;DATE-TIME;UTC-OFFSET;CAL-ADDRESS" -"X","const char*", -"X-LIC-ERRORTYPE","icalparameter_xlicerrortype","COMPONENT-PARSE-ERROR;PROPERTY-PARSE-ERROR;PARAMETER-NAME-PARSE-ERROR;PARAMETER-VALUE-PARSE-ERROR;VALUE-PARSE-ERROR;INVALID-ITIP;UNKNOWN-VCAL-PROP-ERROR;MIME-PARSE-ERROR" -"X-LIC-COMPARETYPE","icalparameter_xliccomparetype","EQUAL;NOTEQUAL;LESS;GREATER;LESSEQUAL;GREATEREQUAL;REGEX" diff --git a/libical/design-data/params-in-prop.txt b/libical/design-data/params-in-prop.txt deleted file mode 100644 index 4d4e133fc3..0000000000 --- a/libical/design-data/params-in-prop.txt +++ /dev/null @@ -1,55 +0,0 @@ -ACTION VALUE X -ATTACH FMTTYPE ENCODING VALUE X -ATTENDEE CN CUTYPE DELEGATED-FROM DELEGATED-TO DIR LANGUAGE MEMBER PARTSTAT ROLE RSVP SENT-BY X -CALSCALE X -CATEGORIES LANGUAGE X -CLASS X -COMMENT ALTREP LANGUAGE X -COMPLETED X -CONTACT ALTREP LANGUAGE X -CREATED X -DESCRIPTION ALTREP LANGUAGE X -DTEND VALUE TZID X -DTSTAMP X -DTSTART VALUE TZID X -DUE VALUE TZID X -DURATION X -EXDATE VALUE TZID X -EXRULE X -FREEBUSY FBTYPE X -GEO X -LAST-MODIFIED X -LOCATION ALTREP LANGUAGE X -METHOD X -ORGANIZER CN DIR LANGUAGE SENT-BY X -PERCENT-COMPLETE X -PRIORITY X -PRODID X -RDATE VALUE TZID X -RECURRENCE-ID VALUE RANGE TZID X -RELATED-TO RELTYPE X -REPEAT X -REQUEST-STATUS LANGUAGE X -RESOURCES ALTREP LANGUAGE X -RRULE X -SEQUENCE X -STATUS X -SUMMARY ALTREP LANGUAGE X -TRANSP X -TRIGGER VALUE RELATED X -TZID X -TZNAME LANGUAGE X -TZOFFSETFROM X -TZOFFSETTO X -TZURL X -UID X -URL X -VERSION X -XPROP LANGUAGE X -X-LIC-ERROR XLICEERRORTYPE X -SCOPE X -MAXRESULTS X -MAXRESULTSSIZE X -QUERY X -QUERYNAME X -TARGET X
\ No newline at end of file diff --git a/libical/design-data/prop-to-value.txt b/libical/design-data/prop-to-value.txt deleted file mode 100644 index a7d0c1f772..0000000000 --- a/libical/design-data/prop-to-value.txt +++ /dev/null @@ -1,57 +0,0 @@ -CALSCALE TEXT -METHOD METHOD # Non-std. RFC2445 specifies TEXT -PRODID TEXT -VERSION TEXT -CATEGORIES TEXT -CLASS TEXT -COMMENT TEXT -DESCRIPTION TEXT -LOCATION TEXT -PERCENT-COMPLETE INTEGER -PRIORITY INTEGER -RESOURCES TEXT -STATUS STATUS -SUMMARY TEXT -COMPLETED DATE-TIME -FREEBUSY PERIOD -TRANSP TEXT -TZNAME TEXT -TZOFFSETFROM UTC-OFFSET -TZOFFSETTO UTC-OFFSET -TZURL URI -TZID TEXT -ATTENDEE CAL-ADDRESS -CONTACT TEXT -ORGANIZER CAL-ADDRESS -RELATED-TO TEXT -URL URI -UID TEXT -EXRULE RECUR -RRULE RECUR -ACTION TEXT -REPEAT INTEGER -CREATED DATE-TIME -DTSTAMP DATE-TIME -LAST-MODIFIED DATE-TIME -SEQUENCE INTEGER -X TEXT -REQUEST-STATUS STRING -ATTACH ATTACH # Non-std: URI or BINARY -GEO GEO # Non-std: Two FLOATS -DTEND DATE-TIME # Non-std: DATE-TIME or DATE -DUE DATE-TIME # Non-std: DATE-TIME or DATE -DTSTART DATE-TIME # Non-std: DATE-TIME or DATE -RECURRENCE-ID DATE-TIME # Non-std: DATE-TIME or DATE -EXDATE DATE-TIME # Non-std: DATE-TIME or DATE -RDATE DATE-TIME-PERIOD # Non-std: DATE-TIME or DATE or PERIOD -TRIGGER TRIGGER # Non-std: DURATION or DATE-TIME -DURATION DURATION -QUERY QUERY -X-LIC-ERROR TEXT -X-LIC-CLUSTERCOUNT INTEGER -X-LIC-MIMECONTENTTYPE STRING -X-LIC-MIMECHARSET STRING -X-LIC-MIMEENCODING STRING -X-LIC-MIMEOPTINFO STRING -X-LIC-MIMECID STRING -X-LIC-MIMEFILENAME STRING diff --git a/libical/design-data/properties.csv b/libical/design-data/properties.csv deleted file mode 100644 index dca6810d8f..0000000000 --- a/libical/design-data/properties.csv +++ /dev/null @@ -1,66 +0,0 @@ -,, -"#Property Name","libical Value type","iCalendar default value" -"ACTION","ACTION","ACTION" -"ATTACH","ATTACH","URI" -"ATTENDEE","CAL-ADDRESS","CAL-ADDRESS" -"CALSCALE","TEXT","TEXT" -"CATEGORIES","TEXT","TEXT" -"CLASS","TEXT","TEXT" -"COMMENT","TEXT","TEXT" -"COMPLETED","DATE-TIME","DATE-TIME" -"CONTACT","TEXT","TEXT" -"CREATED","DATE-TIME","DATE-TIME" -"DESCRIPTION","TEXT","TEXT" -"DTEND","DATE-TIME","DATE-TIME" -"DTSTAMP","DATE-TIME","DATE-TIME" -"DTSTART","DATE-TIME","DATE-TIME" -"DUE","DATE-TIME","DATE-TIME" -"DURATION","DURATION","DURATION" -"EXDATE","DATE-TIME","DATE-TIME" -"EXRULE","RECUR","RECUR" -"FREEBUSY","PERIOD","PERIOD" -"GEO","GEO","GEO" -"LAST-MODIFIED","DATE-TIME","DATE-TIME" -"LOCATION","TEXT","TEXT" -"METHOD","METHOD","METHOD" -"ORGANIZER","CAL-ADDRESS","CAL-ADDRESS" -"PERCENT-COMPLETE","INTEGER","INTEGER" -"PRIORITY","INTEGER","INTEGER" -"PRODID","TEXT","TEXT" -"RDATE","DATE-TIME-PERIOD","DATE-TIME" -"RECURRENCE-ID","DATE-TIME","DATE-TIME" -"RELATED-TO","TEXT","TEXT" -"REPEAT","INTEGER","INTEGER" -"REQUEST-STATUS","STRING","STRING" -"RESOURCES","TEXT","TEXT" -"RRULE","RECUR","RECUR" -"SEQUENCE","INTEGER","INTEGER" -"STATUS","STATUS","STATUS" -"SUMMARY","TEXT","TEXT" -"TRANSP","TEXT","TEXT" -"TRIGGER","TRIGGER","DURATION" -"TZID","TEXT","TEXT" -"TZNAME","TEXT","TEXT" -"TZOFFSETFROM","UTC-OFFSET","UTC-OFFSET" -"TZOFFSETTO","UTC-OFFSET","UTC-OFFSET" -"TZURL","URI","URI" -"UID","TEXT","TEXT" -"URL","URI","URI" -"VERSION","TEXT","TEXT" -"X","TEXT","TEXT" -"SCOPE","TEXT","TEXT" -"MAXRESULTS","INTEGER","INTEGER" -"MAXRESULTSSIZE","INTEGER","INTEGER" -"QUERY","QUERY","QUERY" -"QUERYNAME","TEXT","TEXT" -"TARGET","CAL-ADDRESS","CAL-ADDRESS" -"X-LIC-ERROR","TEXT","TEXT" -"X-LIC-CLUSTERCOUNT","STRING","STRING" -"X-LIC-MIMECONTENTTYPE","STRING","STRING" -"X-LIC-MIMECHARSET","STRING","STRING" -"X-LIC-MIMEENCODING","STRING","STRING" -"X-LIC-MIMEOPTINFO","STRING","STRING" -"X-LIC-MIMECID","STRING","STRING" -"X-LIC-MIMEFILENAME","STRING","STRING" -"ANY","NO","NO" -"NO","NO","NO" diff --git a/libical/design-data/property-tokens.txt b/libical/design-data/property-tokens.txt deleted file mode 100644 index f8a95861c4..0000000000 --- a/libical/design-data/property-tokens.txt +++ /dev/null @@ -1,65 +0,0 @@ -8BIT -ACCEPTED -ADD -AUDIO -BASE64 -BINARY -BOOLEAN -BUSY -BUSY-TENTATIVE -BUSY-UNAVAILABLE -CAL-ADDRESS -CANCEL -CANCELLED -CHAIR -CHILD -COMPLETED -CONFIDENTIAL -CONFIRMED -COUNTER -DATE -DATE-TIME -DECLINECOUNTER -DECLINED -DELEGATED -DISPLAY -DRAFT -DURATION -EMAIL -END -FINAL -FLOAT -FREE -GREGORIAN -GROUP -INDIVIDUAL -IN-PROCESS -INTEGER -NEEDS-ACTION -NON-PARTICIPANT -OPAQUE -OPT-PARTICIPANT -PARENT -PERIOD -PRIVATE -PROCEDURE -PUBLIC -PUBLISH -RECUR -REFRESH -REPLY -REQ-PARTICIPANT -REQUEST -RESOURCE -ROOM -SIBLING -START -TENTATIVE -TEXT -THISANDFUTURE -THISANDPRIOR -TIME -TRANSPAENT -UNKNOWN -UTCOFFSET -XNAME diff --git a/libical/design-data/restrictions.csv b/libical/design-data/restrictions.csv deleted file mode 100644 index 1c62e2a8b4..0000000000 --- a/libical/design-data/restrictions.csv +++ /dev/null @@ -1,1348 +0,0 @@ -# Method, Target component, Property, Sub-component, Restriction -PUBLISH,VEVENT,NONE,NONE,ONEPLUS -PUBLISH,VEVENT,DTSTAMP,NONE,ONE -PUBLISH,VEVENT,DTSTART,NONE,ONE -PUBLISH,VEVENT,ORGANIZER,NONE,ONE -PUBLISH,VEVENT,SUMMARY,NONE,ONE -PUBLISH,VEVENT,UID,NONE,ONE -PUBLISH,VEVENT,RECURRENCEID,NONE,ZEROORONE,must_be_recurring -PUBLISH,VEVENT,SEQUENCE,NONE,ZEROORONE -PUBLISH,VEVENT,ATTACH,NONE,ZEROPLUS -PUBLISH,VEVENT,CATEGORIES,NONE,ZEROPLUS #Non-standard -PUBLISH,VEVENT,CLASS,NONE,ZEROORONE -PUBLISH,VEVENT,COMMENT,NONE,ZEROORONE -PUBLISH,VEVENT,CONTACT,NONE,ZEROPLUS -PUBLISH,VEVENT,CREATED,NONE,ZEROORONE -PUBLISH,VEVENT,DESCRIPTION,NONE,ZEROORONE -PUBLISH,VEVENT,DTEND,NONE,ZEROORONE -PUBLISH,VEVENT,DURATION,NONE,ZEROORONE -PUBLISH,VEVENT,EXDATE,NONE,ZEROPLUS -PUBLISH,VEVENT,EXRULE,NONE,ZEROPLUS -PUBLISH,VEVENT,GEO,NONE,ZEROORONE -PUBLISH,VEVENT,LASTMODIFIED,NONE,ZEROORONE -PUBLISH,VEVENT,LOCATION,NONE,ZEROORONE -PUBLISH,VEVENT,PRIORITY,NONE,ZEROORONE -PUBLISH,VEVENT,RDATE,NONE,ZEROPLUS -PUBLISH,VEVENT,RELATEDTO,NONE,ZEROPLUS -PUBLISH,VEVENT,RESOURCES,NONE,ZEROORONE -PUBLISH,VEVENT,RRULE,NONE,ZEROPLUS -PUBLISH,VEVENT,STATUS,NONE,ZEROORONE,may_be_tent_conf_cancel -PUBLISH,VEVENT,TRANSP,NONE,ZEROORONE -PUBLISH,VEVENT,URL,NONE,ZEROORONE -PUBLISH,VEVENT,X,NONE,ZEROPLUS -PUBLISH,VEVENT,ATTENDEE,NONE,ZERO -PUBLISH,VEVENT,REQUESTSTATUS,NONE,ZERO -PUBLISH,VEVENT,NONE,VALARM,ZEROPLUS -PUBLISH,VEVENT,NONE,VFREEBUSY,ZERO -PUBLISH,VEVENT,NONE,VJOURNAL,ZERO -PUBLISH,VEVENT,NONE,VTODO,ZERO -PUBLISH,VEVENT,NONE,VTIMEZONE,ZEROPLUS,must_if_tz_ref -PUBLISH,VEVENT,NONE,X,ZEROPLUS -REQUEST,VEVENT,NONE,NONE,ONEPLUS -REQUEST,VEVENT,ATTENDEE,NONE,ONEPLUS -REQUEST,VEVENT,DTSTAMP,NONE,ONE -REQUEST,VEVENT,DTSTART,NONE,ONE -REQUEST,VEVENT,ORGANIZER,NONE,ONE -REQUEST,VEVENT,SEQUENCE,NONE,ZEROORONE -REQUEST,VEVENT,SUMMARY,NONE,ONE -REQUEST,VEVENT,UID,NONE,ONE -REQUEST,VEVENT,ATTACH,NONE,ZEROPLUS -REQUEST,VEVENT,CATEGORIES,NONE,ZEROPLUS #Non-standard -REQUEST,VEVENT,CLASS,NONE,ZEROORONE -REQUEST,VEVENT,COMMENT,NONE,ZEROORONE -REQUEST,VEVENT,CONTACT,NONE,ZEROPLUS -REQUEST,VEVENT,CREATED,NONE,ZEROORONE -REQUEST,VEVENT,DESCRIPTION,NONE,ZEROORONE -REQUEST,VEVENT,DTEND,NONE,ONEEXCLUSIVE,no_duration -REQUEST,VEVENT,DURATION,NONE,ONEEXCLUSIVE,no_dtend -REQUEST,VEVENT,EXDATE,NONE,ZEROPLUS -REQUEST,VEVENT,EXRULE,NONE,ZEROPLUS -REQUEST,VEVENT,GEO,NONE,ZEROORONE -REQUEST,VEVENT,LASTMODIFIED,NONE,ZEROORONE -REQUEST,VEVENT,LOCATION,NONE,ZEROORONE -REQUEST,VEVENT,PRIORITY,NONE,ZEROORONE -REQUEST,VEVENT,RDATE,NONE,ZEROPLUS -REQUEST,VEVENT,RECURRENCEID,NONE,ZEROORONE,must_be_recurring -REQUEST,VEVENT,RELATEDTO,NONE,ZEROPLUS -REQUEST,VEVENT,REQUESTSTATUS,NONE,ZEROPLUS -REQUEST,VEVENT,RESOURCES,NONE,ZEROORONE -REQUEST,VEVENT,RRULE,NONE,ZEROPLUS -REQUEST,VEVENT,STATUS,NONE,ZEROORONE,may_be_tent_conf -REQUEST,VEVENT,TRANSP,NONE,ZEROORONE -REQUEST,VEVENT,URL,NONE,ZEROORONE -REQUEST,VEVENT,X,NONE,ZEROPLUS -REQUEST,VEVENT,NONE,VALARM,ZEROPLUS -REQUEST,VEVENT,NONE,VTIMEZONE,ZEROPLUS,must_if_tz_ref -REQUEST,VEVENT,NONE,X,ZEROPLUS -REQUEST,VEVENT,NONE,VFREEBUSY,ZERO -REQUEST,VEVENT,NONE,VJOURNAL,ZERO -REQUEST,VEVENT,NONE,VTODO,ZERO -REPLY,VEVENT,NONE,NONE,ONEPLUS -REPLY,VEVENT,ATTENDEE,NONE,ONE -REPLY,VEVENT,DTSTAMP,NONE,ONE -REPLY,VEVENT,ORGANIZER,NONE,ONE -REPLY,VEVENT,RECURRENCEID,NONE,ZEROORONE,must_be_recurring -REPLY,VEVENT,UID,NONE,ONE -REPLY,VEVENT,SEQUENCE,NONE,ZEROORONE -REPLY,VEVENT,ATTACH,NONE,ZEROPLUS -REPLY,VEVENT,CATEGORIES,NONE,ZEROPLUS #Non-standard -REPLY,VEVENT,CLASS,NONE,ZEROORONE -REPLY,VEVENT,COMMENT,NONE,ZEROORONE -REPLY,VEVENT,CONTACT,NONE,ZEROPLUS -REPLY,VEVENT,CREATED,NONE,ZEROORONE -REPLY,VEVENT,DESCRIPTION,NONE,ZEROORONE -REPLY,VEVENT,DTEND,NONE,ONEEXCLUSIVE,no_duration -REPLY,VEVENT,DTSTART,NONE,ZEROORONE -REPLY,VEVENT,DURATION,NONE,ONEEXCLUSIVE,no_dtend -REPLY,VEVENT,EXDATE,NONE,ZEROPLUS -REPLY,VEVENT,EXRULE,NONE,ZEROPLUS -REPLY,VEVENT,GEO,NONE,ZEROORONE -REPLY,VEVENT,LASTMODIFIED,NONE,ZEROORONE -REPLY,VEVENT,LOCATION,NONE,ZEROORONE -REPLY,VEVENT,PRIORITY,NONE,ZEROORONE -REPLY,VEVENT,RDATE,NONE,ZEROPLUS -REPLY,VEVENT,RELATEDTO,NONE,ZEROPLUS -REPLY,VEVENT,RESOURCES,NONE,ZEROORONE -REPLY,VEVENT,REQUESTSTATUS,NONE,ZEROPLUS -REPLY,VEVENT,RRULE,NONE,ZEROPLUS -REPLY,VEVENT,STATUS,NONE,ZEROORONE -REPLY,VEVENT,SUMMARY,NONE,ZEROORONE -REPLY,VEVENT,TRANSP,NONE,ZEROORONE -REPLY,VEVENT,URL,NONE,ZEROORONE -REPLY,VEVENT,X,NONE,ZEROPLUS -REPLY,VEVENT,NONE,VTIMEZONE,ZEROORONE,must_if_tz_ref -REPLY,VEVENT,NONE,X,ZEROPLUS -REPLY,VEVENT,NONE,VALARM,ZERO -REPLY,VEVENT,NONE,VFREEBUSY,ZERO -REPLY,VEVENT,NONE,VJOURNAL,ZERO -REPLY,VEVENT,NONE,VTODO,ZERO -ADD,VEVENT,NONE,NONE,ONE -ADD,VEVENT,DTSTAMP,NONE,ONE -ADD,VEVENT,DTSTART,NONE,ONE -ADD,VEVENT,ORGANIZER,NONE,ONE -ADD,VEVENT,SEQUENCE,NONE,ONE -ADD,VEVENT,SUMMARY,NONE,ONE -ADD,VEVENT,UID,NONE,ONE -ADD,VEVENT,ATTACH,NONE,ZEROPLUS -ADD,VEVENT,ATTENDEE,NONE,ZEROPLUS -ADD,VEVENT,CATEGORIES,NONE,ZEROPLUS #Non-standard -ADD,VEVENT,CLASS,NONE,ZEROORONE -ADD,VEVENT,COMMENT,NONE,ZEROORONE -ADD,VEVENT,CONTACT,NONE,ZEROPLUS -ADD,VEVENT,CREATED,NONE,ZEROORONE -ADD,VEVENT,DESCRIPTION,NONE,ZEROORONE -ADD,VEVENT,DTEND,NONE,ONEEXCLUSIVE,no_duration -ADD,VEVENT,DURATION,NONE,ONEEXCLUSIVE,no_duration -ADD,VEVENT,EXDATE,NONE,ZEROPLUS -ADD,VEVENT,EXRULE,NONE,ZEROPLUS -ADD,VEVENT,GEO,NONE,ZEROORONE -ADD,VEVENT,LASTMODIFIED,NONE,ZEROORONE -ADD,VEVENT,LOCATION,NONE,ZEROORONE -ADD,VEVENT,PRIORITY,NONE,ZEROORONE -ADD,VEVENT,RDATE,NONE,ZEROPLUS -ADD,VEVENT,RELATEDTO,NONE,ZEROPLUS -ADD,VEVENT,RESOURCES,NONE,ZEROORONE -ADD,VEVENT,RRULE,NONE,ZEROPLUS -ADD,VEVENT,STATUS,NONE,ZEROORONE,may_be_tent_conf -ADD,VEVENT,TRANSP,NONE,ZEROORONE -ADD,VEVENT,URL,NONE,ZEROORONE -ADD,VEVENT,X,NONE,ZEROPLUS -ADD,VEVENT,RECURRENCEID,NONE,ZERO,must_be_recurring -ADD,VEVENT,REQUESTSTATUS,NONE,ZERO -ADD,VEVENT,NONE,VALARM,ZEROPLUS -ADD,VEVENT,NONE,VTIMEZONE,ZEROPLUS,must_if_tz_ref -ADD,VEVENT,NONE,X,ZEROPLUS -ADD,VEVENT,NONE,VFREEBUSY,ZERO -ADD,VEVENT,NONE,VTODO,ZERO -ADD,VEVENT,NONE,VJOURNAL,ZERO -CANCEL,VEVENT,NONE,NONE,ONEPLUS -CANCEL,VEVENT,ATTENDEE,NONE,ZEROPLUS -CANCEL,VEVENT,DTSTAMP,NONE,ONE -CANCEL,VEVENT,ORGANIZER,NONE,ONE -CANCEL,VEVENT,SEQUENCE,NONE,ONE -CANCEL,VEVENT,UID,NONE,ONE -CANCEL,VEVENT,COMMENT,NONE,ZEROORONE -CANCEL,VEVENT,ATTACH,NONE,ZEROPLUS -CANCEL,VEVENT,CATEGORIES,NONE,ZEROPLUS #Non-standard -CANCEL,VEVENT,CLASS,NONE,ZEROORONE -CANCEL,VEVENT,CONTACT,NONE,ZEROPLUS -CANCEL,VEVENT,CREATED,NONE,ZEROORONE -CANCEL,VEVENT,DESCRIPTION,NONE,ZEROORONE -CANCEL,VEVENT,DTEND,NONE,ONEEXCLUSIVE ,no_duration -CANCEL,VEVENT,DTSTART,NONE,ZEROORONE -CANCEL,VEVENT,DURATION,NONE,ONEEXCLUSIVE,no_duration -CANCEL,VEVENT,EXDATE,NONE,ZEROPLUS -CANCEL,VEVENT,EXRULE,NONE,ZEROPLUS -CANCEL,VEVENT,GEO,NONE,ZEROORONE -CANCEL,VEVENT,LASTMODIFIED,NONE,ZEROORONE -CANCEL,VEVENT,LOCATION,NONE,ZEROORONE -CANCEL,VEVENT,PRIORITY,NONE,ZEROORONE -CANCEL,VEVENT,RDATE,NONE,ZEROPLUS -CANCEL,VEVENT,RECURRENCEID,NONE,ZEROORONE,must_be_recurring -CANCEL,VEVENT,RELATEDTO,NONE,ZEROPLUS -CANCEL,VEVENT,RESOURCES,NONE,ZEROORONE -CANCEL,VEVENT,RRULE,NONE,ZEROPLUS -CANCEL,VEVENT,STATUS,NONE,ZEROORONE,must_be_canceled_no_attendee -CANCEL,VEVENT,SUMMARY,NONE,ZEROORONE -CANCEL,VEVENT,TRANSP,NONE,ZEROORONE -CANCEL,VEVENT,URL,NONE,ZEROORONE -CANCEL,VEVENT,X,NONE,ZEROPLUS -CANCEL,VEVENT,REQUESTSTATUS,NONE,ZERO -CANCEL,VEVENT,NONE,VTIMEZONE,ZEROPLUS,must_if_tz_ref -CANCEL,VEVENT,NONE,X,ZEROPLUS -CANCEL,VEVENT,NONE,VTODO,ZERO -CANCEL,VEVENT,NONE,VJOURNAL,ZERO -CANCEL,VEVENT,NONE,VFREEBUSY,ZERO -CANCEL,VEVENT,NONE,VALARM,ZERO -REFRESH,VEVENT,NONE,NONE,ONE -REFRESH,VEVENT,ATTENDEE,NONE,ONE -REFRESH,VEVENT,DTSTAMP,NONE,ONE -REFRESH,VEVENT,ORGANIZER,NONE,ONE -REFRESH,VEVENT,UID,NONE,ONE -REFRESH,VEVENT,COMMENT,NONE,ZEROORONE -REFRESH,VEVENT,RECURRENCEID,NONE,ZEROORONE,must_be_recurring -REFRESH,VEVENT,X,NONE,ZEROPLUS -REFRESH,VEVENT,ATTACH,NONE,ZERO -REFRESH,VEVENT,CATEGORIES,NONE,ZERO -REFRESH,VEVENT,CLASS,NONE,ZERO -REFRESH,VEVENT,CONTACT,NONE,ZERO -REFRESH,VEVENT,CREATED,NONE,ZERO -REFRESH,VEVENT,DESCRIPTION,NONE,ZERO -REFRESH,VEVENT,DTEND,NONE,ZERO -REFRESH,VEVENT,DTSTART,NONE,ZERO -REFRESH,VEVENT,DURATION,NONE,ZERO -REFRESH,VEVENT,EXDATE,NONE,ZERO -REFRESH,VEVENT,EXRULE,NONE,ZERO -REFRESH,VEVENT,GEO,NONE,ZERO -REFRESH,VEVENT,LASTMODIFIED,NONE,ZERO -REFRESH,VEVENT,LOCATION,NONE,ZERO -REFRESH,VEVENT,PRIORITY,NONE,ZERO -REFRESH,VEVENT,RDATE,NONE,ZERO -REFRESH,VEVENT,RELATEDTO,NONE,ZERO -REFRESH,VEVENT,REQUESTSTATUS,NONE,ZERO -REFRESH,VEVENT,RESOURCES,NONE,ZERO -REFRESH,VEVENT,RRULE,NONE,ZERO -REFRESH,VEVENT,SEQUENCE,NONE,ZERO -REFRESH,VEVENT,STATUS,NONE,ZERO -REFRESH,VEVENT,SUMMARY,NONE,ZERO -REFRESH,VEVENT,TRANSP,NONE,ZERO -REFRESH,VEVENT,URL,NONE,ZERO -REFRESH,VEVENT,NONE,X,ZEROPLUS -REFRESH,VEVENT,NONE,VTODO,ZERO -REFRESH,VEVENT,NONE,VJOURNAL,ZERO -REFRESH,VEVENT,NONE,VFREEBUSY,ZERO -REFRESH,VEVENT,NONE,VTIMEZONE,ZERO,must_if_tz_ref -REFRESH,VEVENT,NONE,VALARM,ZERO -COUNTER,VEVENT,NONE,NONE,ONE -COUNTER,VEVENT,DTSTAMP,NONE,ONE -COUNTER,VEVENT,DTSTART,NONE,ONE -COUNTER,VEVENT,ORGANIZER,NONE,ONE -COUNTER,VEVENT,SEQUENCE,NONE,ONE -COUNTER,VEVENT,SUMMARY,NONE,ONE -COUNTER,VEVENT,UID,NONE,ONE -COUNTER,VEVENT,ATTACH,NONE,ZEROPLUS -COUNTER,VEVENT,ATTENDEE,NONE,ZEROPLUS -COUNTER,VEVENT,CATEGORIES,NONE,ZEROPLUS #Non-standard -COUNTER,VEVENT,CLASS,NONE,ZEROORONE -COUNTER,VEVENT,COMMENT,NONE,ZEROORONE -COUNTER,VEVENT,CONTACT,NONE,ZEROPLUS -COUNTER,VEVENT,CREATED,NONE,ZEROORONE -COUNTER,VEVENT,DESCRIPTION,NONE,ZEROORONE -COUNTER,VEVENT,DTEND,NONE,ONEEXCLUSIVE,no_duration -COUNTER,VEVENT,DURATION,NONE,ONEEXCLUSIVE,no_duration -COUNTER,VEVENT,EXDATE,NONE,ZEROPLUS -COUNTER,VEVENT,EXRULE,NONE,ZEROPLUS -COUNTER,VEVENT,GEO,NONE,ZEROORONE -COUNTER,VEVENT,LASTMODIFIED,NONE,ZEROORONE -COUNTER,VEVENT,LOCATION,NONE,ZEROORONE -COUNTER,VEVENT,PRIORITY,NONE,ZEROORONE -COUNTER,VEVENT,RDATE,NONE,ZEROPLUS -COUNTER,VEVENT,RECURRENCEID,NONE,ZEROORONE,must_be_recurring -COUNTER,VEVENT,RELATEDTO,NONE,ZEROPLUS -COUNTER,VEVENT,REQUESTSTATUS,NONE,ZEROPLUS -COUNTER,VEVENT,RESOURCES,NONE,ZEROORONE -COUNTER,VEVENT,RRULE,NONE,ZEROPLUS -COUNTER,VEVENT,STATUS,NONE,ZEROORONE,may_be_tent_conf_cancel -COUNTER,VEVENT,TRANSP,NONE,ZEROORONE -COUNTER,VEVENT,URL,NONE,ZEROORONE -COUNTER,VEVENT,X,NONE,ZEROPLUS -COUNTER,VEVENT,NONE,VALARM,ZEROPLUS -COUNTER,VEVENT,NONE,VTIMEZONE,ZEROPLUS,must_if_tz_ref -COUNTER,VEVENT,NONE,X,ZEROPLUS -COUNTER,VEVENT,NONE,VTODO,ZERO -COUNTER,VEVENT,NONE,VJOURNAL,ZERO -COUNTER,VEVENT,NONE,VFREEBUSY,ZERO -DECLINECOUNTER,VEVENT,NONE,NONE,ONE -DECLINECOUNTER,VEVENT,DTSTAMP,NONE,ONE -DECLINECOUNTER,VEVENT,ORGANIZER,NONE,ONE -DECLINECOUNTER,VEVENT,UID,NONE,ONE -DECLINECOUNTER,VEVENT,COMMENT,NONE,ZEROORONE -DECLINECOUNTER,VEVENT,RECURRENCEID,NONE,ZEROORONE,must_be_recurring -DECLINECOUNTER,VEVENT,REQUESTSTATUS,NONE,ZEROPLUS -DECLINECOUNTER,VEVENT,SEQUENCE,NONE,ZERO -DECLINECOUNTER,VEVENT,X,NONE,ZEROPLUS -DECLINECOUNTER,VEVENT,ATTACH,NONE,ZERO -DECLINECOUNTER,VEVENT,ATTENDEE,NONE,ZERO -DECLINECOUNTER,VEVENT,CATEGORIES,NONE,ZERO -DECLINECOUNTER,VEVENT,CLASS,NONE,ZERO -DECLINECOUNTER,VEVENT,CONTACT,NONE,ZERO -DECLINECOUNTER,VEVENT,CREATED,NONE,ZERO -DECLINECOUNTER,VEVENT,DESCRIPTION,NONE,ZERO -DECLINECOUNTER,VEVENT,DTEND,NONE,ZERO -DECLINECOUNTER,VEVENT,DTSTART,NONE,ZERO -DECLINECOUNTER,VEVENT,DURATION,NONE,ZERO -DECLINECOUNTER,VEVENT,EXDATE,NONE,ZERO -DECLINECOUNTER,VEVENT,EXRULE,NONE,ZERO -DECLINECOUNTER,VEVENT,GEO,NONE,ZERO -DECLINECOUNTER,VEVENT,LASTMODIFIED,NONE,ZERO -DECLINECOUNTER,VEVENT,LOCATION,NONE,ZERO -DECLINECOUNTER,VEVENT,PRIORITY,NONE,ZERO -DECLINECOUNTER,VEVENT,RDATE,NONE,ZERO -DECLINECOUNTER,VEVENT,RELATEDTO,NONE,ZERO -DECLINECOUNTER,VEVENT,RESOURCES,NONE,ZERO -DECLINECOUNTER,VEVENT,RRULE,NONE,ZERO -DECLINECOUNTER,VEVENT,STATUS,NONE,ZERO -DECLINECOUNTER,VEVENT,SUMMARY,NONE,ZERO -DECLINECOUNTER,VEVENT,TRANSP,NONE,ZERO -DECLINECOUNTER,VEVENT,URL,NONE,ZERO -DECLINECOUNTER,VEVENT,NONE,X,ZEROPLUS -DECLINECOUNTER,VEVENT,NONE,VTODO,ZERO -DECLINECOUNTER,VEVENT,NONE,VJOURNAL,ZERO -DECLINECOUNTER,VEVENT,NONE,VFREEBUSY,ZERO -DECLINECOUNTER,VEVENT,NONE,VTIMEZONE,ZERO,must_if_tz_ref -DECLINECOUNTER,VEVENT,NONE,VALARM,ZERO -PUBLISH,VFREEBUSY,NONE,NONE,ONEPLUS -PUBLISH,VFREEBUSY,DTSTAMP,NONE,ONE -PUBLISH,VFREEBUSY,DTSTART,NONE,ONE -PUBLISH,VFREEBUSY,DTEND,NONE,ONE -PUBLISH,VFREEBUSY,FREEBUSY,NONE,ONEPLUS -PUBLISH,VFREEBUSY,ORGANIZER,NONE,ONE -PUBLISH,VFREEBUSY,COMMENT,NONE,ZEROORONE -PUBLISH,VFREEBUSY,CONTACT,NONE,ZEROPLUS -PUBLISH,VFREEBUSY,X,NONE,ZEROPLUS -PUBLISH,VFREEBUSY,URL,NONE,ZEROORONE -PUBLISH,VFREEBUSY,ATTENDEE,NONE,ZERO -PUBLISH,VFREEBUSY,DURATION,NONE,ZERO -PUBLISH,VFREEBUSY,REQUESTSTATUS,NONE,ZERO -PUBLISH,VFREEBUSY,UID,NONE,ZERO -PUBLISH,VFREEBUSY,NONE,X,ZEROPLUS -PUBLISH,VFREEBUSY,NONE,VEVENT,ZERO -PUBLISH,VFREEBUSY,NONE,VTODO,ZERO -PUBLISH,VFREEBUSY,NONE,VJOURNAL,ZERO -PUBLISH,VFREEBUSY,NONE,VTIMEZONE,ZERO,must_if_tz_ref -PUBLISH,VFREEBUSY,NONE,VALARM,ZERO -REQUEST,VFREEBUSY,NONE,NONE,ONE -REQUEST,VFREEBUSY,ATTENDEE,NONE,ONEPLUS -REQUEST,VFREEBUSY,DTEND,NONE,ONE -REQUEST,VFREEBUSY,DTSTAMP,NONE,ONE -REQUEST,VFREEBUSY,DTSTART,NONE,ONE -REQUEST,VFREEBUSY,ORGANIZER,NONE,ONE -REQUEST,VFREEBUSY,UID,NONE,ONE -REQUEST,VFREEBUSY,COMMENT,NONE,ZEROORONE -REQUEST,VFREEBUSY,CONTACT,NONE,ZEROPLUS -REQUEST,VFREEBUSY,X,NONE,ZEROPLUS -REQUEST,VFREEBUSY,FREEBUSY,NONE,ZERO -REQUEST,VFREEBUSY,DURATION,NONE,ZERO -REQUEST,VFREEBUSY,REQUESTSTATUS,NONE,ZERO -REQUEST,VFREEBUSY,URL,NONE,ZERO -REQUEST,VFREEBUSY,NONE,X,ZEROPLUS -REQUEST,VFREEBUSY,NONE,VALARM,ZERO -REQUEST,VFREEBUSY,NONE,VEVENT,ZERO -REQUEST,VFREEBUSY,NONE,VTODO,ZERO -REQUEST,VFREEBUSY,NONE,VJOURNAL,ZERO -REQUEST,VFREEBUSY,NONE,VTIMEZONE,ZERO -REPLY,VFREEBUSY,NONE,NONE,ONE -REPLY,VFREEBUSY,ATTENDEE,NONE,ONE -REPLY,VFREEBUSY,DTSTAMP,NONE,ONE -REPLY,VFREEBUSY,DTEND,NONE,ONE -REPLY,VFREEBUSY,DTSTART,NONE,ONE -REPLY,VFREEBUSY,FREEBUSY,NONE,ONEPLUS -REPLY,VFREEBUSY,ORGANIZER,NONE,ONE -REPLY,VFREEBUSY,UID,NONE,ONE -REPLY,VFREEBUSY,COMMENT,NONE,ZEROORONE -REPLY,VFREEBUSY,CONTACT,NONE,ZEROPLUS -REPLY,VFREEBUSY,REQUESTSTATUS,NONE,ZEROPLUS -REPLY,VFREEBUSY,URL,NONE,ZEROORONE -REPLY,VFREEBUSY,X,NONE,ZEROPLUS -REPLY,VFREEBUSY,DURATION,NONE,ZERO -REPLY,VFREEBUSY,SEQUENCE,NONE,ZERO -REPLY,VFREEBUSY,NONE,X,ZEROPLUS -REPLY,VFREEBUSY,NONE,VALARM,ZERO -REPLY,VFREEBUSY,NONE,VEVENT,ZERO -REPLY,VFREEBUSY,NONE,VTODO,ZERO -REPLY,VFREEBUSY,NONE,VJOURNAL,ZERO -REPLY,VFREEBUSY,NONE,VTIMEZONE,ZERO -PUBLISH,VTODO,NONE,NONE,ONEPLUS -PUBLISH,VTODO,DTSTAMP,NONE,ONE -PUBLISH,VTODO,DTSTART,NONE,ONE -PUBLISH,VTODO,ORGANIZER,NONE,ONE -PUBLISH,VTODO,PRIORITY,NONE,ONE -PUBLISH,VTODO,SEQUENCE,NONE,ZEROORONE -PUBLISH,VTODO,SUMMARY,NONE,ONE -PUBLISH,VTODO,UID,NONE,ONE -PUBLISH,VTODO,ATTACH,NONE,ZEROPLUS -PUBLISH,VTODO,CATEGORIES,NONE,ZEROPLUS #Non-Standard -PUBLISH,VTODO,CLASS,NONE,ZEROORONE -PUBLISH,VTODO,COMMENT,NONE,ZEROORONE -PUBLISH,VTODO,CONTACT,NONE,ZEROPLUS -PUBLISH,VTODO,CREATED,NONE,ZEROORONE -PUBLISH,VTODO,DESCRIPTION,NONE,ZEROORONE -PUBLISH,VTODO,DUE,NONE,ZEROORONE -PUBLISH,VTODO,DURATION,NONE,ZEROORONE -PUBLISH,VTODO,EXDATE,NONE,ZEROPLUS -PUBLISH,VTODO,EXRULE,NONE,ZEROPLUS -PUBLISH,VTODO,GEO,NONE,ZEROORONE -PUBLISH,VTODO,LASTMODIFIED,NONE,ZEROORONE -PUBLISH,VTODO,LOCATION,NONE,ZEROORONE -PUBLISH,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE -PUBLISH,VTODO,RDATE,NONE,ZEROPLUS -PUBLISH,VTODO,RECURRENCEID,NONE,ZEROORONE,must_be_recurring -PUBLISH,VTODO,RELATEDTO,NONE,ZEROPLUS -PUBLISH,VTODO,RESOURCES,NONE,ZEROORONE -PUBLISH,VTODO,RRULE,NONE,ZEROPLUS -PUBLISH,VTODO,STATUS,NONE,ZEROORONE -PUBLISH,VTODO,URL,NONE,ZEROORONE -PUBLISH,VTODO,X,NONE,ZEROPLUS -PUBLISH,VTODO,ATTENDEE,NONE,ZERO -PUBLISH,VTODO,REQUESTSTATUS,NONE,ZERO -PUBLISH,VTODO,NONE,VTIMEZONE,ZEROPLUS -PUBLISH,VTODO,NONE,VALARM,ZEROPLUS -PUBLISH,VTODO,NONE,X,ZEROPLUS -PUBLISH,VTODO,NONE,VFREEBUSY,ZERO -PUBLISH,VTODO,NONE,VEVENT,ZERO -PUBLISH,VTODO,NONE,VJOURNAL,ZERO -REQUEST,VTODO,NONE,NONE,ONEPLUS -REQUEST,VTODO,ATTENDEE,NONE,ONEPLUS -REQUEST,VTODO,DTSTAMP,NONE,ONE -REQUEST,VTODO,DTSTART,NONE,ONE -REQUEST,VTODO,ORGANIZER,NONE,ONE -REQUEST,VTODO,PRIORITY,NONE,ONE -REQUEST,VTODO,SEQUENCE,NONE,ZEROORONE -REQUEST,VTODO,SUMMARY,NONE,ONE -REQUEST,VTODO,UID,NONE,ONE -REQUEST,VTODO,ATTACH,NONE,ZEROPLUS -REQUEST,VTODO,CATEGORIES,NONE,ZEROPLUS #Non-Standard -REQUEST,VTODO,CLASS,NONE,ZEROORONE -REQUEST,VTODO,COMMENT,NONE,ZEROORONE -REQUEST,VTODO,CONTACT,NONE,ZEROPLUS -REQUEST,VTODO,CREATED,NONE,ZEROORONE -REQUEST,VTODO,DESCRIPTION,NONE,ZEROORONE -REQUEST,VTODO,DUE,NONE,ZEROORONE -REQUEST,VTODO,DURATION,NONE,ZEROORONE -REQUEST,VTODO,EXDATE,NONE,ZEROPLUS -REQUEST,VTODO,EXRULE,NONE,ZEROPLUS -REQUEST,VTODO,GEO,NONE,ZEROORONE -REQUEST,VTODO,LASTMODIFIED,NONE,ZEROORONE -REQUEST,VTODO,LOCATION,NONE,ZEROORONE -REQUEST,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE -REQUEST,VTODO,RDATE,NONE,ZEROPLUS -REQUEST,VTODO,RECURRENCEID,NONE,ZEROORONE,must_be_recurring -REQUEST,VTODO,RELATEDTO,NONE,ZEROPLUS -REQUEST,VTODO,RESOURCES,NONE,ZEROORONE -REQUEST,VTODO,RRULE,NONE,ZEROPLUS -REQUEST,VTODO,STATUS,NONE,ZEROORONE,may_be_comp_need_process -REQUEST,VTODO,URL,NONE,ZEROORONE -REQUEST,VTODO,X,NONE,ZEROPLUS -REQUEST,VTODO,REQUESTSTATUS,NONE,ZERO -REQUEST,VTODO,NONE,VALARM,ZEROPLUS -REQUEST,VTODO,NONE,VTIMEZONE,ZEROPLUS -REQUEST,VTODO,NONE,X,ZEROPLUS -REQUEST,VTODO,NONE,VEVENT,ZERO -REQUEST,VTODO,NONE,VFREEBUSY,ZERO -REQUEST,VTODO,NONE,VJOURNAL,ZERO -REPLY,VTODO,NONE,NONE,ONEPLUS -REPLY,VTODO,ATTENDEE,NONE,ONEPLUS -REPLY,VTODO,DTSTAMP,NONE,ONE -REPLY,VTODO,ORGANIZER,NONE,ONE -REPLY,VTODO,REQUESTSTATUS,NONE,ONEPLUS -REPLY,VTODO,UID,NONE,ONE -REPLY,VTODO,ATTACH,NONE,ZEROPLUS -REPLY,VTODO,CATEGORIES,NONE,ZEROPLUS #Non-Standard -REPLY,VTODO,CLASS,NONE,ZEROORONE -REPLY,VTODO,COMMENT,NONE,ZEROORONE -REPLY,VTODO,CONTACT,NONE,ZEROPLUS -REPLY,VTODO,CREATED,NONE,ZEROORONE -REPLY,VTODO,DESCRIPTION,NONE,ZEROORONE -REPLY,VTODO,DTSTART,NONE,ZEROORONE -REPLY,VTODO,DUE,NONE,ZEROORONE -REPLY,VTODO,DURATION,NONE,ZEROORONE -REPLY,VTODO,EXDATE,NONE,ZEROPLUS -REPLY,VTODO,EXRULE,NONE,ZEROPLUS -REPLY,VTODO,GEO,NONE,ZEROORONE -REPLY,VTODO,LASTMODIFIED,NONE,ZEROORONE -REPLY,VTODO,LOCATION,NONE,ZEROORONE -REPLY,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE -REPLY,VTODO,PRIORITY,NONE,ZEROORONE -REPLY,VTODO,RDATE,NONE,ZEROPLUS -REPLY,VTODO,RELATEDTO,NONE,ZEROPLUS -REPLY,VTODO,RESOURCES,NONE,ZEROORONE -REPLY,VTODO,RRULE,NONE,ZEROPLUS -REPLY,VTODO,RECURRENCEID,NONE,ZEROORONE,must_be_recurring -REPLY,VTODO,SEQUENCE,NONE,ZEROORONE -REPLY,VTODO,STATUS,NONE,ZEROORONE -REPLY,VTODO,SUMMARY,NONE,ZEROORONE -REPLY,VTODO,URL,NONE,ZEROORONE -REPLY,VTODO,X,NONE,ZEROPLUS -REPLY,VTODO,NONE,VTIMEZONE,ZEROORONE -REPLY,VTODO,NONE,X,ZEROPLUS -REPLY,VTODO,NONE,VALARM,ZERO -REPLY,VTODO,NONE,VEVENT,ZERO -REPLY,VTODO,NONE,VFREEBUSY,ZERO -ADD,VTODO,NONE,NONE,ONE -ADD,VTODO,DTSTAMP,NONE,ONE -ADD,VTODO,ORGANIZER,NONE,ONE -ADD,VTODO,PRIORITY,NONE,ONE -ADD,VTODO,SEQUENCE,NONE,ONE -ADD,VTODO,SUMMARY,NONE,ONE -ADD,VTODO,UID,NONE,ONE -ADD,VTODO,ATTACH,NONE,ZEROPLUS -ADD,VTODO,ATTENDEE,NONE,ZEROPLUS -ADD,VTODO,CATEGORIES,NONE,ZEROPLUS -ADD,VTODO,CLASS,NONE,ZEROORONE -ADD,VTODO,COMMENT,NONE,ZEROORONE -ADD,VTODO,CONTACT,NONE,ZEROPLUS -ADD,VTODO,CREATED,NONE,ZEROORONE -ADD,VTODO,DESCRIPTION,NONE,ZEROORONE -ADD,VTODO,DTSTART,NONE,ZEROORONE -ADD,VTODO,DUE,NONE,ZEROORONE -ADD,VTODO,DURATION,NONE,ZEROORONE -ADD,VTODO,EXDATE,NONE,ZEROPLUS -ADD,VTODO,EXRULE,NONE,ZEROPLUS -ADD,VTODO,GEO,NONE,ZEROORONE -ADD,VTODO,LASTMODIFIED,NONE,ZEROORONE -ADD,VTODO,LOCATION,NONE,ZEROORONE -ADD,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE -ADD,VTODO,RDATE,NONE,ZEROPLUS -ADD,VTODO,RELATEDTO,NONE,ZEROPLUS -ADD,VTODO,RESOURCES,NONE,ZEROORONE -ADD,VTODO,RRULE,NONE,ZEROPLUS -ADD,VTODO,STATUS,NONE,ZEROORONE,may_be_comp_need_process -ADD,VTODO,URL,NONE,ZEROORONE -ADD,VTODO,X,NONE,ZEROPLUS -ADD,VTODO,RECURRENCEID,NONE,ZERO,must_be_recurring -ADD,VTODO,REQUESTSTATUS,NONE,ZERO -ADD,VTODO,NONE,VALARM,ZEROPLUS -ADD,VTODO,NONE,VTIMEZONE,ZEROPLUS -ADD,VTODO,NONE,X,ZEROPLUS -ADD,VTODO,NONE,VEVENT,ZERO -ADD,VTODO,NONE,VJOURNAL,ZERO -ADD,VTODO,NONE,VFREEBUSY,ZERO -CANCEL,VTODO,NONE,NONE,ONE -CANCEL,VTODO,ATTENDEE,NONE,ZEROPLUS -CANCEL,VTODO,UID,NONE,ONE -CANCEL,VTODO,DTSTAMP,NONE,ONE -CANCEL,VTODO,ORGANIZER,NONE,ONE -CANCEL,VTODO,SEQUENCE,NONE,ONE -CANCEL,VTODO,ATTACH,NONE,ZEROPLUS -CANCEL,VTODO,CATEGORIES,NONE,ZEROPLUS #Non-Standard -CANCEL,VTODO,CLASS,NONE,ZEROORONE -CANCEL,VTODO,COMMENT,NONE,ZEROORONE -CANCEL,VTODO,CONTACT,NONE,ZEROPLUS -CANCEL,VTODO,CREATED,NONE,ZEROORONE -CANCEL,VTODO,DESCRIPTION,NONE,ZEROORONE -CANCEL,VTODO,DTSTART,NONE,ZEROORONE -CANCEL,VTODO,DUE,NONE,ZEROORONE -CANCEL,VTODO,DURATION,NONE,ZEROORONE -CANCEL,VTODO,EXDATE,NONE,ZEROPLUS -CANCEL,VTODO,EXRULE,NONE,ZEROPLUS -CANCEL,VTODO,GEO,NONE,ZEROORONE -CANCEL,VTODO,LASTMODIFIED,NONE,ZEROORONE -CANCEL,VTODO,LOCATION,NONE,ZEROORONE -CANCEL,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE -CANCEL,VTODO,RDATE,NONE,ZEROPLUS -CANCEL,VTODO,RECURRENCEID,NONE,ZEROORONE,must_be_recurring -CANCEL,VTODO,RELATEDTO,NONE,ZEROPLUS -CANCEL,VTODO,RESOURCES,NONE,ZEROORONE -CANCEL,VTODO,RRULE,NONE,ZEROPLUS -CANCEL,VTODO,PRIORITY,NONE,ZEROORONE -CANCEL,VTODO,STATUS,NONE,ZEROORONE,must_be_canceled_no_attendee -CANCEL,VTODO,URL,NONE,ZEROORONE -CANCEL,VTODO,X,NONE,ZEROPLUS -CANCEL,VTODO,REQUESTSTATUS,NONE,ZERO -CANCEL,VTODO,NONE,VTIMEZONE,ZEROORONE -CANCEL,VTODO,NONE,X,ZEROPLUS -CANCEL,VTODO,NONE,VALARM,ZERO -CANCEL,VTODO,NONE,VEVENT,ZERO -CANCEL,VTODO,NONE,VFREEBUSY,ZERO -REFRESH,VTODO,NONE,NONE,ONE -REFRESH,VTODO,ATTENDEE,NONE,ONE -REFRESH,VTODO,DTSTAMP,NONE,ONE -REFRESH,VTODO,UID,NONE,ONE -REFRESH,VTODO,RECURRENCEID,NONE,ZEROORONE,must_be_recurring -REFRESH,VTODO,X,NONE,ZEROPLUS -REFRESH,VTODO,ATTACH,NONE,ZERO -REFRESH,VTODO,CATEGORIES,NONE,ZERO -REFRESH,VTODO,CLASS,NONE,ZERO -REFRESH,VTODO,COMMENT,NONE,ZERO -REFRESH,VTODO,CONTACT,NONE,ZERO -REFRESH,VTODO,CREATED,NONE,ZERO -REFRESH,VTODO,DESCRIPTION,NONE,ZERO -REFRESH,VTODO,DTSTART,NONE,ZERO -REFRESH,VTODO,DUE,NONE,ZERO -REFRESH,VTODO,DURATION,NONE,ZERO -REFRESH,VTODO,EXDATE,NONE,ZERO -REFRESH,VTODO,EXRULE,NONE,ZERO -REFRESH,VTODO,GEO,NONE,ZERO -REFRESH,VTODO,LASTMODIFIED,NONE,ZERO -REFRESH,VTODO,LOCATION,NONE,ZERO -REFRESH,VTODO,ORGANIZER,NONE,ZERO -REFRESH,VTODO,PERCENTCOMPLETE,NONE,ZERO -REFRESH,VTODO,PRIORITY,NONE,ZERO -REFRESH,VTODO,RDATE,NONE,ZERO -REFRESH,VTODO,RELATEDTO,NONE,ZERO -REFRESH,VTODO,REQUESTSTATUS,NONE,ZERO -REFRESH,VTODO,RESOURCES,NONE,ZERO -REFRESH,VTODO,RRULE,NONE,ZERO -REFRESH,VTODO,SEQUENCE,NONE,ZERO -REFRESH,VTODO,STATUS,NONE,ZERO -REFRESH,VTODO,URL,NONE,ZERO -REFRESH,VTODO,NONE,X,ZEROPLUS -REFRESH,VTODO,NONE,VALARM,ZERO -REFRESH,VTODO,NONE,VEVENT,ZERO -REFRESH,VTODO,NONE,VFREEBUSY,ZERO -REFRESH,VTODO,NONE,VTIMEZONE,ZERO -COUNTER,VTODO,NONE,NONE,ONE -COUNTER,VTODO,ATTENDEE,NONE,ONEPLUS -COUNTER,VTODO,DTSTAMP,NONE,ONE -COUNTER,VTODO,ORGANIZER,NONE,ONE -COUNTER,VTODO,PRIORITY,NONE,ONE -COUNTER,VTODO,SUMMARY,NONE,ONE -COUNTER,VTODO,UID,NONE,ONE -COUNTER,VTODO,ATTACH,NONE,ZEROPLUS -COUNTER,VTODO,CATEGORIES,NONE,ZEROPLUS #Non-standard -COUNTER,VTODO,CLASS,NONE,ZEROORONE -COUNTER,VTODO,COMMENT,NONE,ZEROORONE -COUNTER,VTODO,CONTACT,NONE,ZEROPLUS -COUNTER,VTODO,CREATED,NONE,ZEROORONE -COUNTER,VTODO,DESCRIPTION,NONE,ZEROORONE -COUNTER,VTODO,DTSTART,NONE,ZEROORONE -COUNTER,VTODO,DUE,NONE,ZEROORONE -COUNTER,VTODO,DURATION,NONE,ZEROORONE -COUNTER,VTODO,EXDATE,NONE,ZEROPLUS -COUNTER,VTODO,EXRULE,NONE,ZEROPLUS -COUNTER,VTODO,GEO,NONE,ZEROORONE -COUNTER,VTODO,LASTMODIFIED,NONE,ZEROORONE -COUNTER,VTODO,LOCATION,NONE,ZEROORONE -COUNTER,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE -COUNTER,VTODO,RDATE,NONE,ZEROPLUS -COUNTER,VTODO,RECURRENCEID,NONE,ZEROORONE,must_be_recurring -COUNTER,VTODO,RELATEDTO,NONE,ZEROPLUS -COUNTER,VTODO,REQUESTSTATUS,NONE,ZEROPLUS -COUNTER,VTODO,RESOURCES,NONE,ZEROORONE -COUNTER,VTODO,RRULE,NONE,ZEROORONE -COUNTER,VTODO,SEQUENCE,NONE,ZEROORONE -COUNTER,VTODO,STATUS,NONE,ZEROORONE,may_be_comp_need_process -COUNTER,VTODO,URL,NONE,ZEROORONE -COUNTER,VTODO,X,NONE,ZEROPLUS -COUNTER,VTODO,NONE,VALARM,ZEROPLUS -COUNTER,VTODO,NONE,VTIMEZONE,ZEROORONE -COUNTER,VTODO,NONE,X,ZEROPLUS -COUNTER,VTODO,NONE,VEVENT,ZERO -COUNTER,VTODO,NONE,VFREEBUSY,ZERO -DECLINECOUNTER,VTODO,NONE,NONE,ONE -DECLINECOUNTER,VTODO,ATTENDEE,NONE,ONEPLUS -DECLINECOUNTER,VTODO,DTSTAMP,NONE,ONE -DECLINECOUNTER,VTODO,ORGANIZER,NONE,ONE -DECLINECOUNTER,VTODO,SEQUENCE,NONE,ONE -DECLINECOUNTER,VTODO,UID,NONE,ONE -DECLINECOUNTER,VTODO,ATTACH,NONE,ZEROPLUS -DECLINECOUNTER,VTODO,CATEGORIES,NONE,ZEROPLUS #Non-standard -DECLINECOUNTER,VTODO,CLASS,NONE,ZEROORONE -DECLINECOUNTER,VTODO,COMMENT,NONE,ZEROORONE -DECLINECOUNTER,VTODO,CONTACT,NONE,ZEROPLUS -DECLINECOUNTER,VTODO,CREATED,NONE,ZEROORONE -DECLINECOUNTER,VTODO,DESCRIPTION,NONE,ZEROORONE -DECLINECOUNTER,VTODO,DTSTART,NONE,ZEROORONE -DECLINECOUNTER,VTODO,DUE,NONE,ZEROORONE -DECLINECOUNTER,VTODO,DURATION,NONE,ZEROORONE -DECLINECOUNTER,VTODO,EXDATE,NONE,ZEROPLUS -DECLINECOUNTER,VTODO,EXRULE,NONE,ZEROPLUS -DECLINECOUNTER,VTODO,GEO,NONE,ZEROORONE -DECLINECOUNTER,VTODO,LASTMODIFIED,NONE,ZEROORONE -DECLINECOUNTER,VTODO,LOCATION,NONE,ZEROORONE -DECLINECOUNTER,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE -DECLINECOUNTER,VTODO,PRIORITY,NONE,ZEROORONE -DECLINECOUNTER,VTODO,RDATE,NONE,ZEROPLUS -DECLINECOUNTER,VTODO,RECURRENCEID,NONE,ZEROORONE,must_be_recurring -DECLINECOUNTER,VTODO,RELATEDTO,NONE,ZEROPLUS -DECLINECOUNTER,VTODO,REQUESTSTATUS,NONE,ZEROPLUS -DECLINECOUNTER,VTODO,RESOURCES,NONE,ZEROORONE -DECLINECOUNTER,VTODO,RRULE,NONE,ZEROPLUS -DECLINECOUNTER,VTODO,STATUS,NONE,ZEROORONE -DECLINECOUNTER,VTODO,URL,NONE,ZEROORONE -DECLINECOUNTER,VTODO,X,NONE,ZEROPLUS -DECLINECOUNTER,VTODO,NONE,VTIMEZONE,ZEROPLUS -DECLINECOUNTER,VTODO,NONE,X,ZEROPLUS -DECLINECOUNTER,VTODO,NONE,VALARM,ZERO -DECLINECOUNTER,VTODO,NONE,VEVENT,ZERO -DECLINECOUNTER,VTODO,NONE,VFREEBUSY,ZERO -PUBLISH,VJOURNAL,NONE,NONE,ONEPLUS -PUBLISH,VJOURNAL,DESCRIPTION,NONE,ONE -PUBLISH,VJOURNAL,DTSTAMP,NONE,ONE -PUBLISH,VJOURNAL,DTSTART,NONE,ONE -PUBLISH,VJOURNAL,ORGANIZER,NONE,ONE -PUBLISH,VJOURNAL,UID,NONE,ONE -PUBLISH,VJOURNAL,ATTACH,NONE,ZEROPLUS -PUBLISH,VJOURNAL,CATEGORIES,NONE,ZEROPLUS #Non-standard -PUBLISH,VJOURNAL,CLASS,NONE,ZEROORONE -PUBLISH,VJOURNAL,COMMENT,NONE,ZEROORONE -PUBLISH,VJOURNAL,CONTACT,NONE,ZEROPLUS -PUBLISH,VJOURNAL,CREATED,NONE,ZEROORONE -PUBLISH,VJOURNAL,EXDATE,NONE,ZEROPLUS -PUBLISH,VJOURNAL,EXRULE,NONE,ZEROPLUS -PUBLISH,VJOURNAL,LASTMODIFIED,NONE,ZEROORONE -PUBLISH,VJOURNAL,RDATE,NONE,ZEROPLUS -PUBLISH,VJOURNAL,RECURRENCEID,NONE,ZEROORONE,must_be_recurring -PUBLISH,VJOURNAL,RELATEDTO,NONE,ZEROPLUS -PUBLISH,VJOURNAL,RRULE,NONE,ZEROPLUS -PUBLISH,VJOURNAL,SEQUENCE,NONE,ZEROORONE -PUBLISH,VJOURNAL,STATUS,NONE,ZEROORONE,may_be_draft_final_canceled -PUBLISH,VJOURNAL,SUMMARY,NONE,ZEROORONE -PUBLISH,VJOURNAL,URL,NONE,ZEROORONE -PUBLISH,VJOURNAL,X,NONE,ZEROPLUS -PUBLISH,VJOURNAL,ATTENDEE,NONE,ZERO -PUBLISH,VJOURNAL,NONE,VALARM,ZEROPLUS -PUBLISH,VJOURNAL,NONE,VTIMEZONE,ZEROPLUS -PUBLISH,VJOURNAL,NONE,X,ZEROPLUS -PUBLISH,VJOURNAL,NONE,VEVENT,ZERO -PUBLISH,VJOURNAL,NONE,VFREEBUSY,ZERO -PUBLISH,VJOURNAL,NONE,VTODO,ZERO -ADD,VJOURNAL,NONE,NONE,ONE -ADD,VJOURNAL,DESCRIPTION,NONE,ONE -ADD,VJOURNAL,DTSTAMP,NONE,ONE -ADD,VJOURNAL,DTSTART,NONE,ONE -ADD,VJOURNAL,ORGANIZER,NONE,ONE -ADD,VJOURNAL,SEQUENCE,NONE,ONE -ADD,VJOURNAL,UID,NONE,ONE -ADD,VJOURNAL,ATTACH,NONE,ZEROPLUS -ADD,VJOURNAL,CATEGORIES,NONE,ZEROPLUS #Non-standard -ADD,VJOURNAL,CLASS,NONE,ZEROORONE -ADD,VJOURNAL,COMMENT,NONE,ZEROORONE -ADD,VJOURNAL,CONTACT,NONE,ZEROPLUS -ADD,VJOURNAL,CREATED,NONE,ZEROORONE -ADD,VJOURNAL,EXDATE,NONE,ZEROPLUS -ADD,VJOURNAL,EXRULE,NONE,ZEROPLUS -ADD,VJOURNAL,LASTMODIFIED,NONE,ZEROORONE -ADD,VJOURNAL,RDATE,NONE,ZEROPLUS -ADD,VJOURNAL,RELATEDTO,NONE,ZEROPLUS -ADD,VJOURNAL,RRULE,NONE,ZEROPLUS -ADD,VJOURNAL,STATUS,NONE,ZEROORONE -ADD,VJOURNAL,SUMMARY,NONE,ZEROORONE -ADD,VJOURNAL,URL,NONE,ZEROORONE -ADD,VJOURNAL,X,NONE,ZEROPLUS -ADD,VJOURNAL,ATTENDEE,NONE,ZERO -ADD,VJOURNAL,RECURRENCEID,NONE,ZERO -ADD,VJOURNAL,NONE,VALARM,ZEROPLUS -ADD,VJOURNAL,NONE,VTIMEZONE,ZEROORONE -ADD,VJOURNAL,NONE,X,ZEROPLUS -ADD,VJOURNAL,NONE,VEVENT,ZERO -ADD,VJOURNAL,NONE,VFREEBUSY,ZERO -ADD,VJOURNAL,NONE,VTODO,ZERO -CANCEL,VJOURNAL,NONE,NONE,ONEPLUS -CANCEL,VJOURNAL,DTSTAMP,NONE,ONE -CANCEL,VJOURNAL,ORGANIZER,NONE,ONE -CANCEL,VJOURNAL,SEQUENCE,NONE,ONE -CANCEL,VJOURNAL,UID,NONE,ONE -CANCEL,VJOURNAL,ATTACH,NONE,ZEROPLUS -CANCEL,VJOURNAL,ATTENDEE,NONE,ZEROPLUS -CANCEL,VJOURNAL,CATEGORIES,NONE,ZEROPLUS #Non-standard -CANCEL,VJOURNAL,CLASS,NONE,ZEROORONE -CANCEL,VJOURNAL,COMMENT,NONE,ZEROORONE -CANCEL,VJOURNAL,CONTACT,NONE,ZEROPLUS -CANCEL,VJOURNAL,CREATED,NONE,ZEROORONE -CANCEL,VJOURNAL,DESCRIPTION,NONE,ZEROORONE -CANCEL,VJOURNAL,DTSTART,NONE,ZEROORONE -CANCEL,VJOURNAL,EXDATE,NONE,ZEROPLUS -CANCEL,VJOURNAL,EXRULE,NONE,ZEROPLUS -CANCEL,VJOURNAL,LASTMODIFIED,NONE,ZEROORONE -CANCEL,VJOURNAL,RDATE,NONE,ZEROPLUS -CANCEL,VJOURNAL,RECURRENCEID,NONE,ZEROORONE,must_be_recurring -CANCEL,VJOURNAL,RELATEDTO,NONE,ZEROPLUS -CANCEL,VJOURNAL,RRULE,NONE,ZEROPLUS -CANCEL,VJOURNAL,STATUS,NONE,ZEROORONE,must_be_cancel_if_present -CANCEL,VJOURNAL,SUMMARY,NONE,ZEROORONE -CANCEL,VJOURNAL,URL,NONE,ZEROORONE -CANCEL,VJOURNAL,X,NONE,ZEROPLUS -CANCEL,VJOURNAL,REQUESTSTATUS,NONE,ZERO -CANCEL,VJOURNAL,NONE,VTIMEZONE,ZEROPLUS -CANCEL,VJOURNAL,NONE,X,ZEROPLUS -CANCEL,VJOURNAL,NONE,VALARM,ZERO -CANCEL,VJOURNAL,NONE,VEVENT,ZERO -CANCEL,VJOURNAL,NONE,VFREEBUSY,ZERO -CANCEL,VJOURNAL,NONE,VTODO,ZERO -NONE,VCALENDAR,ACTION,NONE,ZERO -NONE,VCALENDAR,ATTACH,NONE,ZERO -NONE,VCALENDAR,ATTENDEE,NONE,ZERO -NONE,VCALENDAR,CALSCALE,NONE,ZEROORONE -NONE,VCALENDAR,CATEGORIES,NONE,ZERO -NONE,VCALENDAR,CLASS,NONE,ZERO -NONE,VCALENDAR,COMMENT,NONE,ZERO -NONE,VCALENDAR,COMPLETED,NONE,ZERO -NONE,VCALENDAR,CONTACT,NONE,ZERO -NONE,VCALENDAR,CREATED,NONE,ZERO -NONE,VCALENDAR,DESCRIPTION,NONE,ZERO -NONE,VCALENDAR,DTEND,NONE,ZERO -NONE,VCALENDAR,DTSTAMP,NONE,ZERO -NONE,VCALENDAR,DTSTART,NONE,ZERO -NONE,VCALENDAR,DUE,NONE,ZERO -NONE,VCALENDAR,DURATION,NONE,ZERO -NONE,VCALENDAR,EXDATE,NONE,ZERO -NONE,VCALENDAR,EXRULE,NONE,ZERO -NONE,VCALENDAR,FREEBUSY,NONE,ZERO -NONE,VCALENDAR,GEO,NONE,ZERO -NONE,VCALENDAR,LASTMODIFIED,NONE,ZERO -NONE,VCALENDAR,LOCATION,NONE,ZERO -NONE,VCALENDAR,METHOD,NONE,ZEROORONE -NONE,VCALENDAR,ORGANIZER,NONE,ZERO -NONE,VCALENDAR,PERCENTCOMPLETE,NONE,ZERO -NONE,VCALENDAR,PRIORITY,NONE,ZERO -NONE,VCALENDAR,PRODID,NONE,ONE -NONE,VCALENDAR,RDATE,NONE,ZERO -NONE,VCALENDAR,RECURRENCEID,NONE,ZERO -NONE,VCALENDAR,RELATEDTO,NONE,ZERO -NONE,VCALENDAR,REPEAT,NONE,ZERO -NONE,VCALENDAR,REQUESTSTATUS,NONE,ZERO -NONE,VCALENDAR,RESOURCES,NONE,ZERO -NONE,VCALENDAR,RRULE,NONE,ZERO -NONE,VCALENDAR,SEQUENCE,NONE,ZERO -NONE,VCALENDAR,STATUS,NONE,ZERO -NONE,VCALENDAR,SUMMARY,NONE,ZERO -NONE,VCALENDAR,TRANSP,NONE,ZERO -NONE,VCALENDAR,TRIGGER,NONE,ZERO -NONE,VCALENDAR,TZID,NONE,ZERO -NONE,VCALENDAR,TZNAME,NONE,ZERO -NONE,VCALENDAR,TZOFFSETFROM,NONE,ZERO -NONE,VCALENDAR,TZOFFSETTO,NONE,ZERO -NONE,VCALENDAR,TZURL,NONE,ZERO -NONE,VCALENDAR,UID,NONE,ZERO -NONE,VCALENDAR,URL,NONE,ZERO -NONE,VCALENDAR,VERSION,NONE,ONE -NONE,VCALENDAR,X,NONE,ZEROPLUS -NONE,VEVENT,ACTION,NONE,ZERO -NONE,VEVENT,ATTACH,NONE,ZEROPLUS -NONE,VEVENT,ATTENDEE,NONE,ZEROPLUS -NONE,VEVENT,CALSCALE,NONE,ZERO -NONE,VEVENT,CATEGORIES,NONE,ZEROPLUS -NONE,VEVENT,CLASS,NONE,ZEROORONE -NONE,VEVENT,COMMENT,NONE,ZEROPLUS -NONE,VEVENT,COMPLETED,NONE,ZERO -NONE,VEVENT,CONTACT,NONE,ZEROPLUS -NONE,VEVENT,CREATED,NONE,ZEROORONE -NONE,VEVENT,DESCRIPTION,NONE,ZEROORONE -NONE,VEVENT,DTEND,NONE,ONEEXCLUSIVE,no_duration -NONE,VEVENT,DTSTAMP,NONE,ZEROORONE -NONE,VEVENT,DTSTART,NONE,ZEROORONE -NONE,VEVENT,DUE,NONE,ZERO -NONE,VEVENT,DURATION,NONE,ONEEXCLUSIVE,no_duration -NONE,VEVENT,EXDATE,NONE,ZEROPLUS -NONE,VEVENT,EXRULE,NONE,ZEROPLUS -NONE,VEVENT,FREEBUSY,NONE,ZERO -NONE,VEVENT,GEO,NONE,ZEROORONE -NONE,VEVENT,LASTMODIFIED,NONE,ZEROORONE -NONE,VEVENT,LOCATION,NONE,ZEROORONE -NONE,VEVENT,METHOD,NONE,ZERO -NONE,VEVENT,ORGANIZER,NONE,ZEROORONE -NONE,VEVENT,PERCENTCOMPLETE,NONE,ZERO -NONE,VEVENT,PRIORITY,NONE,ZEROORONE -NONE,VEVENT,PRODID,NONE,ZERO -NONE,VEVENT,RDATE,NONE,ZEROPLUS -NONE,VEVENT,RECURRENCEID,NONE,ZEROORONE,must_be_recurring -NONE,VEVENT,RELATEDTO,NONE,ZEROPLUS -NONE,VEVENT,REPEAT,NONE,ZERO -NONE,VEVENT,REQUESTSTATUS,NONE,ZEROPLUS -NONE,VEVENT,RESOURCES,NONE,ZEROPLUS -NONE,VEVENT,RRULE,NONE,ZEROPLUS -NONE,VEVENT,SEQUENCE,NONE,ZEROORONE -NONE,VEVENT,STATUS,NONE,ZEROORONE -NONE,VEVENT,SUMMARY,NONE,ZEROORONE -NONE,VEVENT,TRANSP,NONE,ZEROORONE -NONE,VEVENT,TRIGGER,NONE,ZERO -NONE,VEVENT,TZID,NONE,ZERO -NONE,VEVENT,TZNAME,NONE,ZERO -NONE,VEVENT,TZOFFSETFROM,NONE,ZERO -NONE,VEVENT,TZOFFSETTO,NONE,ZERO -NONE,VEVENT,TZURL,NONE,ZERO -NONE,VEVENT,UID,NONE,ZEROORONE -NONE,VEVENT,URL,NONE,ZEROORONE -NONE,VEVENT,VERSION,NONE,ZERO -NONE,VEVENT,X,NONE,ZEROPLUS -NONE,VTODO,ACTION,NONE,ZERO -NONE,VTODO,ATTACH,NONE,ZEROPLUS -NONE,VTODO,ATTENDEE,NONE,ZEROPLUS -NONE,VTODO,CALSCALE,NONE,ZERO -NONE,VTODO,CATEGORIES,NONE,ZEROPLUS -NONE,VTODO,CLASS,NONE,ZEROORONE -NONE,VTODO,COMMENT,NONE,ZEROPLUS -NONE,VTODO,COMPLETED,NONE,ZEROORONE -NONE,VTODO,CONTACT,NONE,ZEROPLUS -NONE,VTODO,CREATED,NONE,ZEROORONE -NONE,VTODO,DESCRIPTION,NONE,ZEROORONE -NONE,VTODO,DTEND,NONE,ZERO -NONE,VTODO,DTSTAMP,NONE,ZEROORONE -NONE,VTODO,DTSTART,NONE,ZEROORONE -NONE,VTODO,DUE,NONE,ONEEXCLUSIVE -NONE,VTODO,DURATION,NONE,ONEEXCLUSIVE -NONE,VTODO,EXDATE,NONE,ZEROPLUS -NONE,VTODO,EXRULE,NONE,ZEROPLUS -NONE,VTODO,FREEBUSY,NONE,ZERO -NONE,VTODO,GEO,NONE,ZEROORONE -NONE,VTODO,LASTMODIFIED,NONE,ZEROORONE -NONE,VTODO,LOCATION,NONE,ZEROORONE -NONE,VTODO,METHOD,NONE,ZERO -NONE,VTODO,ORGANIZER,NONE,ZEROORONE -NONE,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE -NONE,VTODO,PRIORITY,NONE,ZEROORONE -NONE,VTODO,PRODID,NONE,ZERO -NONE,VTODO,RDATE,NONE,ZEROPLUS -NONE,VTODO,RECURRENCEID,NONE,ZEROORONE,must_be_recurring -NONE,VTODO,RELATEDTO,NONE,ZEROPLUS -NONE,VTODO,REPEAT,NONE,ZERO -NONE,VTODO,REQUESTSTATUS,NONE,ZEROPLUS -NONE,VTODO,RESOURCES,NONE,ZEROPLUS -NONE,VTODO,RRULE,NONE,ZEROPLUS -NONE,VTODO,SEQUENCE,NONE,ZEROORONE -NONE,VTODO,STATUS,NONE,ZEROORONE -NONE,VTODO,SUMMARY,NONE,ZEROORONE -NONE,VTODO,TRANSP,NONE,ZERO -NONE,VTODO,TRIGGER,NONE,ZERO -NONE,VTODO,TZID,NONE,ZERO -NONE,VTODO,TZNAME,NONE,ZERO -NONE,VTODO,TZOFFSETFROM,NONE,ZERO -NONE,VTODO,TZOFFSETTO,NONE,ZERO -NONE,VTODO,TZURL,NONE,ZERO -NONE,VTODO,UID,NONE,ZEROORONE -NONE,VTODO,URL,NONE,ZEROORONE -NONE,VTODO,VERSION,NONE,ZERO -NONE,VTODO,X,NONE,ZEROPLUS -NONE,VJOURNAL,ACTION,NONE,ZERO -NONE,VJOURNAL,ATTACH,NONE,ZEROPLUS -NONE,VJOURNAL,ATTENDEE,NONE,ZEROPLUS -NONE,VJOURNAL,CALSCALE,NONE,ZERO -NONE,VJOURNAL,CATEGORIES,NONE,ZEROPLUS -NONE,VJOURNAL,CLASS,NONE,ZEROORONE -NONE,VJOURNAL,COMMENT,NONE,ZEROPLUS -NONE,VJOURNAL,COMPLETED,NONE,ZERO -NONE,VJOURNAL,CONTACT,NONE,ZEROPLUS -NONE,VJOURNAL,CREATED,NONE,ZEROORONE -NONE,VJOURNAL,DESCRIPTION,NONE,ZEROORONE -NONE,VJOURNAL,DTEND,NONE,ZERO -NONE,VJOURNAL,DTSTAMP,NONE,ZEROORONE -NONE,VJOURNAL,DTSTART,NONE,ZEROORONE -NONE,VJOURNAL,DUE,NONE,ONEEXCLUSIVE -NONE,VJOURNAL,DURATION,NONE,ONEEXCLUSIVE -NONE,VJOURNAL,EXDATE,NONE,ZEROPLUS -NONE,VJOURNAL,EXRULE,NONE,ZEROPLUS -NONE,VJOURNAL,FREEBUSY,NONE,ZERO -NONE,VJOURNAL,GEO,NONE,ZERO -NONE,VJOURNAL,LASTMODIFIED,NONE,ZEROORONE -NONE,VJOURNAL,LOCATION,NONE,ZERO -NONE,VJOURNAL,METHOD,NONE,ZERO -NONE,VJOURNAL,ORGANIZER,NONE,ZEROORONE -NONE,VJOURNAL,PERCENTCOMPLETE,NONE,ZERO -NONE,VJOURNAL,PRIORITY,NONE,ZERO -NONE,VJOURNAL,PRODID,NONE,ZERO -NONE,VJOURNAL,RDATE,NONE,ZEROPLUS -NONE,VJOURNAL,RECURRENCEID,NONE,ZEROORONE,must_be_recurring -NONE,VJOURNAL,RELATEDTO,NONE,ZEROPLUS -NONE,VJOURNAL,REPEAT,NONE,ZERO -NONE,VJOURNAL,REQUESTSTATUS,NONE,ZEROPLUS -NONE,VJOURNAL,RESOURCES,NONE,ZERO -NONE,VJOURNAL,RRULE,NONE,ZEROPLUS -NONE,VJOURNAL,SEQUENCE,NONE,ZEROORONE -NONE,VJOURNAL,STATUS,NONE,ZEROORONE -NONE,VJOURNAL,SUMMARY,NONE,ZEROORONE -NONE,VJOURNAL,TRANSP,NONE,ZERO -NONE,VJOURNAL,TRIGGER,NONE,ZERO -NONE,VJOURNAL,TZID,NONE,ZERO -NONE,VJOURNAL,TZNAME,NONE,ZERO -NONE,VJOURNAL,TZOFFSETFROM,NONE,ZERO -NONE,VJOURNAL,TZOFFSETTO,NONE,ZERO -NONE,VJOURNAL,TZURL,NONE,ZERO -NONE,VJOURNAL,UID,NONE,ZEROORONE -NONE,VJOURNAL,URL,NONE,ZEROORONE -NONE,VJOURNAL,VERSION,NONE,ZERO -NONE,VJOURNAL,X,NONE,ZEROPLUS -NONE,VFREEBUSY,ACTION,NONE,ZERO -NONE,VFREEBUSY,ATTACH,NONE,ZERO -NONE,VFREEBUSY,ATTENDEE,NONE,ZEROPLUS -NONE,VFREEBUSY,CALSCALE,NONE,ZERO -NONE,VFREEBUSY,CATEGORIES,NONE,ZERO -NONE,VFREEBUSY,CLASS,NONE,ZERO -NONE,VFREEBUSY,COMMENT,NONE,ZEROPLUS -NONE,VFREEBUSY,COMPLETED,NONE,ZERO -NONE,VFREEBUSY,CONTACT,NONE,ZEROORONE -NONE,VFREEBUSY,CREATED,NONE,ZERO -NONE,VFREEBUSY,DESCRIPTION,NONE,ZERO -NONE,VFREEBUSY,DTEND,NONE,ZEROORONE -NONE,VFREEBUSY,DTSTAMP,NONE,ZERO -NONE,VFREEBUSY,DTSTART,NONE,ZEROORONE -NONE,VFREEBUSY,DUE,NONE,ZERO -NONE,VFREEBUSY,DURATION,NONE,ZEROORONE -NONE,VFREEBUSY,EXDATE,NONE,ZERO -NONE,VFREEBUSY,EXRULE,NONE,ZERO -NONE,VFREEBUSY,FREEBUSY,NONE,ZEROPLUS -NONE,VFREEBUSY,GEO,NONE,ZERO -NONE,VFREEBUSY,LASTMODIFIED,NONE,ZERO -NONE,VFREEBUSY,LOCATION,NONE,ZERO -NONE,VFREEBUSY,METHOD,NONE,ZERO -NONE,VFREEBUSY,ORGANIZER,NONE,ZEROORONE -NONE,VFREEBUSY,PERCENTCOMPLETE,NONE,ZERO -NONE,VFREEBUSY,PRIORITY,NONE,ZERO -NONE,VFREEBUSY,PRODID,NONE,ZERO -NONE,VFREEBUSY,RDATE,NONE,ZERO -NONE,VFREEBUSY,RECURRENCEID,NONE,ZERO -NONE,VFREEBUSY,RELATEDTO,NONE,ZERO -NONE,VFREEBUSY,REPEAT,NONE,ZERO -NONE,VFREEBUSY,REQUESTSTATUS,NONE,ZEROPLUS -NONE,VFREEBUSY,RESOURCES,NONE,ZERO -NONE,VFREEBUSY,RRULE,NONE,ZERO -NONE,VFREEBUSY,SEQUENCE,NONE,ZERO -NONE,VFREEBUSY,STATUS,NONE,ZERO -NONE,VFREEBUSY,SUMMARY,NONE,ZERO -NONE,VFREEBUSY,TRANSP,NONE,ZERO -NONE,VFREEBUSY,TRIGGER,NONE,ZERO -NONE,VFREEBUSY,TZID,NONE,ZERO -NONE,VFREEBUSY,TZNAME,NONE,ZERO -NONE,VFREEBUSY,TZOFFSETFROM,NONE,ZERO -NONE,VFREEBUSY,TZOFFSETTO,NONE,ZERO -NONE,VFREEBUSY,TZURL,NONE,ZERO -NONE,VFREEBUSY,UID,NONE,ZEROORONE -NONE,VFREEBUSY,URL,NONE,ZEROORONE -NONE,VFREEBUSY,VERSION,NONE,ZERO -NONE,VFREEBUSY,X,NONE,ZEROPLUS -NONE,VTIMEZONE,ACTION,NONE,ZERO -NONE,VTIMEZONE,ATTACH,NONE,ZERO -NONE,VTIMEZONE,ATTENDEE,NONE,ZERO -NONE,VTIMEZONE,CALSCALE,NONE,ZERO -NONE,VTIMEZONE,CATEGORIES,NONE,ZERO -NONE,VTIMEZONE,CLASS,NONE,ZERO -NONE,VTIMEZONE,COMMENT,NONE,ZERO -NONE,VTIMEZONE,COMPLETED,NONE,ZERO -NONE,VTIMEZONE,CONTACT,NONE,ZERO -NONE,VTIMEZONE,CREATED,NONE,ZERO -NONE,VTIMEZONE,DESCRIPTION,NONE,ZERO -NONE,VTIMEZONE,DTEND,NONE,ZERO -NONE,VTIMEZONE,DTSTAMP,NONE,ZERO -NONE,VTIMEZONE,DTSTART,NONE,ZERO -NONE,VTIMEZONE,DUE,NONE,ZERO -NONE,VTIMEZONE,DURATION,NONE,ZERO -NONE,VTIMEZONE,EXDATE,NONE,ZERO -NONE,VTIMEZONE,EXRULE,NONE,ZERO -NONE,VTIMEZONE,FREEBUSY,NONE,ZERO -NONE,VTIMEZONE,GEO,NONE,ZERO -NONE,VTIMEZONE,LASTMODIFIED,NONE,ZEROORONE -NONE,VTIMEZONE,LOCATION,NONE,ZERO -NONE,VTIMEZONE,METHOD,NONE,ZERO -NONE,VTIMEZONE,ORGANIZER,NONE,ZERO -NONE,VTIMEZONE,PERCENTCOMPLETE,NONE,ZERO -NONE,VTIMEZONE,PRIORITY,NONE,ZERO -NONE,VTIMEZONE,PRODID,NONE,ZERO -NONE,VTIMEZONE,RDATE,NONE,ZERO -NONE,VTIMEZONE,RECURRENCEID,NONE,ZERO -NONE,VTIMEZONE,RELATEDTO,NONE,ZERO -NONE,VTIMEZONE,REPEAT,NONE,ZERO -NONE,VTIMEZONE,REQUESTSTATUS,NONE,ZERO -NONE,VTIMEZONE,RESOURCES,NONE,ZERO -NONE,VTIMEZONE,RRULE,NONE,ZERO -NONE,VTIMEZONE,SEQUENCE,NONE,ZERO -NONE,VTIMEZONE,STATUS,NONE,ZERO -NONE,VTIMEZONE,SUMMARY,NONE,ZERO -NONE,VTIMEZONE,TRANSP,NONE,ZERO -NONE,VTIMEZONE,TRIGGER,NONE,ZERO -NONE,VTIMEZONE,TZID,NONE,ONE -NONE,VTIMEZONE,TZNAME,NONE,ZERO -NONE,VTIMEZONE,TZOFFSETFROM,NONE,ZERO -NONE,VTIMEZONE,TZOFFSETTO,NONE,ZERO -NONE,VTIMEZONE,TZURL,NONE,ZEROPLUS -NONE,VTIMEZONE,UID,NONE,ZERO -NONE,VTIMEZONE,URL,NONE,ZERO -NONE,VTIMEZONE,VERSION,NONE,ZERO -NONE,VTIMEZONE,X,NONE,ZEROORONE -NONE,XSTANDARD,ACTION,NONE,ZERO -NONE,XSTANDARD,ATTACH,NONE,ZERO -NONE,XSTANDARD,ATTENDEE,NONE,ZERO -NONE,XSTANDARD,CALSCALE,NONE,ZERO -NONE,XSTANDARD,CATEGORIES,NONE,ZERO -NONE,XSTANDARD,CLASS,NONE,ZERO -NONE,XSTANDARD,COMMENT,NONE,ZEROPLUS -NONE,XSTANDARD,COMPLETED,NONE,ZERO -NONE,XSTANDARD,CONTACT,NONE,ZERO -NONE,XSTANDARD,CREATED,NONE,ZERO -NONE,XSTANDARD,DESCRIPTION,NONE,ZERO -NONE,XSTANDARD,DTEND,NONE,ZERO -NONE,XSTANDARD,DTSTAMP,NONE,ZERO -NONE,XSTANDARD,DTSTART,NONE,ONE -NONE,XSTANDARD,DUE,NONE,ZERO -NONE,XSTANDARD,DURATION,NONE,ZERO -NONE,XSTANDARD,EXDATE,NONE,ZERO -NONE,XSTANDARD,EXRULE,NONE,ZERO -NONE,XSTANDARD,FREEBUSY,NONE,ZERO -NONE,XSTANDARD,GEO,NONE,ZERO -NONE,XSTANDARD,LASTMODIFIED,NONE,ZERO -NONE,XSTANDARD,LOCATION,NONE,ZERO -NONE,XSTANDARD,METHOD,NONE,ZERO -NONE,XSTANDARD,ORGANIZER,NONE,ZERO -NONE,XSTANDARD,PERCENTCOMPLETE,NONE,ZERO -NONE,XSTANDARD,PRIORITY,NONE,ZERO -NONE,XSTANDARD,PRODID,NONE,ZERO -NONE,XSTANDARD,RDATE,NONE,ZEROPLUS -NONE,XSTANDARD,RECURRENCEID,NONE,ZERO -NONE,XSTANDARD,RELATEDTO,NONE,ZERO -NONE,XSTANDARD,REPEAT,NONE,ZERO -NONE,XSTANDARD,REQUESTSTATUS,NONE,ZERO -NONE,XSTANDARD,RESOURCES,NONE,ZERO -NONE,XSTANDARD,RRULE,NONE,ZEROPLUS -NONE,XSTANDARD,SEQUENCE,NONE,ZERO -NONE,XSTANDARD,STATUS,NONE,ZERO -NONE,XSTANDARD,SUMMARY,NONE,ZERO -NONE,XSTANDARD,TRANSP,NONE,ZERO -NONE,XSTANDARD,TRIGGER,NONE,ZERO -NONE,XSTANDARD,TZID,NONE,ZERO -NONE,XSTANDARD,TZNAME,NONE,ZEROPLUS -NONE,XSTANDARD,TZOFFSETFROM,NONE,ONE -NONE,XSTANDARD,TZOFFSETTO,NONE,ONE -NONE,XSTANDARD,TZURL,NONE,ZERO -NONE,XSTANDARD,UID,NONE,ZERO -NONE,XSTANDARD,URL,NONE,ZERO -NONE,XSTANDARD,VERSION,NONE,ZERO -NONE,XSTANDARD,X,NONE,ZEROPLUS -NONE,XDAYLIGHT,ACTION,NONE,ZERO -NONE,XDAYLIGHT,ATTACH,NONE,ZERO -NONE,XDAYLIGHT,ATTENDEE,NONE,ZERO -NONE,XDAYLIGHT,CALSCALE,NONE,ZERO -NONE,XDAYLIGHT,CATEGORIES,NONE,ZERO -NONE,XDAYLIGHT,CLASS,NONE,ZERO -NONE,XDAYLIGHT,COMMENT,NONE,ZEROPLUS -NONE,XDAYLIGHT,COMPLETED,NONE,ZERO -NONE,XDAYLIGHT,CONTACT,NONE,ZERO -NONE,XDAYLIGHT,CREATED,NONE,ZERO -NONE,XDAYLIGHT,DESCRIPTION,NONE,ZERO -NONE,XDAYLIGHT,DTEND,NONE,ZERO -NONE,XDAYLIGHT,DTSTAMP,NONE,ZERO -NONE,XDAYLIGHT,DTSTART,NONE,ONE -NONE,XDAYLIGHT,DUE,NONE,ZERO -NONE,XDAYLIGHT,DURATION,NONE,ZERO -NONE,XDAYLIGHT,EXDATE,NONE,ZERO -NONE,XDAYLIGHT,EXRULE,NONE,ZERO -NONE,XDAYLIGHT,FREEBUSY,NONE,ZERO -NONE,XDAYLIGHT,GEO,NONE,ZERO -NONE,XDAYLIGHT,LASTMODIFIED,NONE,ZERO -NONE,XDAYLIGHT,LOCATION,NONE,ZERO -NONE,XDAYLIGHT,METHOD,NONE,ZERO -NONE,XDAYLIGHT,ORGANIZER,NONE,ZERO -NONE,XDAYLIGHT,PERCENTCOMPLETE,NONE,ZERO -NONE,XDAYLIGHT,PRIORITY,NONE,ZERO -NONE,XDAYLIGHT,PRODID,NONE,ZERO -NONE,XDAYLIGHT,RDATE,NONE,ZEROPLUS -NONE,XDAYLIGHT,RECURRENCEID,NONE,ZERO -NONE,XDAYLIGHT,RELATEDTO,NONE,ZERO -NONE,XDAYLIGHT,REPEAT,NONE,ZERO -NONE,XDAYLIGHT,REQUESTSTATUS,NONE,ZERO -NONE,XDAYLIGHT,RESOURCES,NONE,ZERO -NONE,XDAYLIGHT,RRULE,NONE,ZEROPLUS -NONE,XDAYLIGHT,SEQUENCE,NONE,ZERO -NONE,XDAYLIGHT,STATUS,NONE,ZERO -NONE,XDAYLIGHT,SUMMARY,NONE,ZERO -NONE,XDAYLIGHT,TRANSP,NONE,ZERO -NONE,XDAYLIGHT,TRIGGER,NONE,ZERO -NONE,XDAYLIGHT,TZID,NONE,ZERO -NONE,XDAYLIGHT,TZNAME,NONE,ZEROPLUS -NONE,XDAYLIGHT,TZOFFSETFROM,NONE,ONE -NONE,XDAYLIGHT,TZOFFSETTO,NONE,ONE -NONE,XDAYLIGHT,TZURL,NONE,ZERO -NONE,XDAYLIGHT,UID,NONE,ZERO -NONE,XDAYLIGHT,URL,NONE,ZERO -NONE,XDAYLIGHT,VERSION,NONE,ZERO -NONE,XDAYLIGHT,X,NONE,ZEROPLUS -NONE,XAUDIOALARM,ACTION,NONE,ONE -NONE,XAUDIOALARM,ATTACH,NONE,ZEROORONE -NONE,XAUDIOALARM,ATTENDEE,NONE,ZERO -NONE,XAUDIOALARM,CALSCALE,NONE,ZERO -NONE,XAUDIOALARM,CATEGORIES,NONE,ZERO -NONE,XAUDIOALARM,CLASS,NONE,ZERO -NONE,XAUDIOALARM,COMMENT,NONE,ZERO -NONE,XAUDIOALARM,COMPLETED,NONE,ZERO -NONE,XAUDIOALARM,CONTACT,NONE,ZERO -NONE,XAUDIOALARM,CREATED,NONE,ZERO -NONE,XAUDIOALARM,DESCRIPTION,NONE,ZERO -NONE,XAUDIOALARM,DTEND,NONE,ZERO -NONE,XAUDIOALARM,DTSTAMP,NONE,ZERO -NONE,XAUDIOALARM,DTSTART,NONE,ZERO -NONE,XAUDIOALARM,DUE,NONE,ZERO -NONE,XAUDIOALARM,DURATION,NONE,ONEMUTUAL,must_have_repeat -NONE,XAUDIOALARM,REPEAT,NONE,ONEMUTUAL,must_have_duration -NONE,XAUDIOALARM,EXDATE,NONE,ZERO -NONE,XAUDIOALARM,EXRULE,NONE,ZERO -NONE,XAUDIOALARM,FREEBUSY,NONE,ZERO -NONE,XAUDIOALARM,GEO,NONE,ZERO -NONE,XAUDIOALARM,LASTMODIFIED,NONE,ZERO -NONE,XAUDIOALARM,LOCATION,NONE,ZERO -NONE,XAUDIOALARM,METHOD,NONE,ZERO -NONE,XAUDIOALARM,ORGANIZER,NONE,ZERO -NONE,XAUDIOALARM,PERCENTCOMPLETE,NONE,ZERO -NONE,XAUDIOALARM,PRIORITY,NONE,ZERO -NONE,XAUDIOALARM,PRODID,NONE,ZERO -NONE,XAUDIOALARM,RDATE,NONE,ZERO -NONE,XAUDIOALARM,RECURRENCEID,NONE,ZERO -NONE,XAUDIOALARM,RELATEDTO,NONE,ZERO -NONE,XAUDIOALARM,REQUESTSTATUS,NONE,ZERO -NONE,XAUDIOALARM,RESOURCES,NONE,ZERO -NONE,XAUDIOALARM,RRULE,NONE,ZERO -NONE,XAUDIOALARM,SEQUENCE,NONE,ZERO -NONE,XAUDIOALARM,STATUS,NONE,ZERO -NONE,XAUDIOALARM,SUMMARY,NONE,ZERO -NONE,XAUDIOALARM,TRANSP,NONE,ZERO -NONE,XAUDIOALARM,TRIGGER,NONE,ONE -NONE,XAUDIOALARM,TZID,NONE,ZERO -NONE,XAUDIOALARM,TZNAME,NONE,ZERO -NONE,XAUDIOALARM,TZOFFSETFROM,NONE,ZERO -NONE,XAUDIOALARM,TZOFFSETTO,NONE,ZERO -NONE,XAUDIOALARM,TZURL,NONE,ZERO -NONE,XAUDIOALARM,UID,NONE,ZERO -NONE,XAUDIOALARM,URL,NONE,ZERO -NONE,XAUDIOALARM,VERSION,NONE,ZERO -NONE,XAUDIOALARM,X,NONE,ZEROPLUS -NONE,XDISPLAYALARM,ACTION,NONE,ONE -NONE,XDISPLAYALARM,ATTACH,NONE,ZERO -NONE,XDISPLAYALARM,ATTENDEE,NONE,ZERO -NONE,XDISPLAYALARM,CALSCALE,NONE,ZERO -NONE,XDISPLAYALARM,CATEGORIES,NONE,ZERO -NONE,XDISPLAYALARM,CLASS,NONE,ZERO -NONE,XDISPLAYALARM,COMMENT,NONE,ZERO -NONE,XDISPLAYALARM,COMPLETED,NONE,ZERO -NONE,XDISPLAYALARM,CONTACT,NONE,ZERO -NONE,XDISPLAYALARM,CREATED,NONE,ZERO -NONE,XDISPLAYALARM,DESCRIPTION,NONE,ONE -NONE,XDISPLAYALARM,DTEND,NONE,ZERO -NONE,XDISPLAYALARM,DTSTAMP,NONE,ZERO -NONE,XDISPLAYALARM,DTSTART,NONE,ZERO -NONE,XDISPLAYALARM,DUE,NONE,ZERO -NONE,XDISPLAYALARM,DURATION,NONE,ONEMUTUAL,must_have_repeat -NONE,XDISPLAYALARM,REPEAT,NONE,ONEMUTUAL,must_have_duration -NONE,XDISPLAYALARM,EXDATE,NONE,ZERO -NONE,XDISPLAYALARM,EXRULE,NONE,ZERO -NONE,XDISPLAYALARM,FREEBUSY,NONE,ZERO -NONE,XDISPLAYALARM,GEO,NONE,ZERO -NONE,XDISPLAYALARM,LASTMODIFIED,NONE,ZERO -NONE,XDISPLAYALARM,LOCATION,NONE,ZERO -NONE,XDISPLAYALARM,METHOD,NONE,ZERO -NONE,XDISPLAYALARM,ORGANIZER,NONE,ZERO -NONE,XDISPLAYALARM,PERCENTCOMPLETE,NONE,ZERO -NONE,XDISPLAYALARM,PRIORITY,NONE,ZERO -NONE,XDISPLAYALARM,PRODID,NONE,ZERO -NONE,XDISPLAYALARM,RDATE,NONE,ZERO -NONE,XDISPLAYALARM,RECURRENCEID,NONE,ZERO -NONE,XDISPLAYALARM,RELATEDTO,NONE,ZERO -NONE,XDISPLAYALARM,REQUESTSTATUS,NONE,ZERO -NONE,XDISPLAYALARM,RESOURCES,NONE,ZERO -NONE,XDISPLAYALARM,RRULE,NONE,ZERO -NONE,XDISPLAYALARM,SEQUENCE,NONE,ZERO -NONE,XDISPLAYALARM,STATUS,NONE,ZERO -NONE,XDISPLAYALARM,SUMMARY,NONE,ZERO -NONE,XDISPLAYALARM,TRANSP,NONE,ZERO -NONE,XDISPLAYALARM,TRIGGER,NONE,ONE -NONE,XDISPLAYALARM,TZID,NONE,ZERO -NONE,XDISPLAYALARM,TZNAME,NONE,ZERO -NONE,XDISPLAYALARM,TZOFFSETFROM,NONE,ZERO -NONE,XDISPLAYALARM,TZOFFSETTO,NONE,ZERO -NONE,XDISPLAYALARM,TZURL,NONE,ZERO -NONE,XDISPLAYALARM,UID,NONE,ZERO -NONE,XDISPLAYALARM,URL,NONE,ZERO -NONE,XDISPLAYALARM,VERSION,NONE,ZERO -NONE,XDISPLAYALARM,X,NONE,ZEROPLUS -NONE,XEMAILALARM,ACTION,NONE,ONE -NONE,XEMAILALARM,ATTACH,NONE,ZEROPLUS -NONE,XEMAILALARM,ATTENDEE,NONE,ONEPLUS -NONE,XEMAILALARM,CALSCALE,NONE,ZERO -NONE,XEMAILALARM,CATEGORIES,NONE,ZERO -NONE,XEMAILALARM,CLASS,NONE,ZERO -NONE,XEMAILALARM,COMMENT,NONE,ZERO -NONE,XEMAILALARM,COMPLETED,NONE,ZERO -NONE,XEMAILALARM,CONTACT,NONE,ZERO -NONE,XEMAILALARM,CREATED,NONE,ZERO -NONE,XEMAILALARM,DESCRIPTION,NONE,ONE -NONE,XEMAILALARM,DTEND,NONE,ZERO -NONE,XEMAILALARM,DTSTAMP,NONE,ZERO -NONE,XEMAILALARM,DTSTART,NONE,ZERO -NONE,XEMAILALARM,DUE,NONE,ZERO -NONE,XEMAILALARM,DURATION,NONE,ONEMUTUAL,must_have_repeat -NONE,XEMAILALARM,REPEAT,NONE,ONEMUTUAL,must_have_duration -NONE,XEMAILALARM,EXDATE,NONE,ZERO -NONE,XEMAILALARM,EXRULE,NONE,ZERO -NONE,XEMAILALARM,FREEBUSY,NONE,ZERO -NONE,XEMAILALARM,GEO,NONE,ZERO -NONE,XEMAILALARM,LASTMODIFIED,NONE,ZERO -NONE,XEMAILALARM,LOCATION,NONE,ZERO -NONE,XEMAILALARM,METHOD,NONE,ZERO -NONE,XEMAILALARM,ORGANIZER,NONE,ZERO -NONE,XEMAILALARM,PERCENTCOMPLETE,NONE,ZERO -NONE,XEMAILALARM,PRIORITY,NONE,ZERO -NONE,XEMAILALARM,PRODID,NONE,ZERO -NONE,XEMAILALARM,RDATE,NONE,ZERO -NONE,XEMAILALARM,RECURRENCEID,NONE,ZERO -NONE,XEMAILALARM,RELATEDTO,NONE,ZERO -NONE,XEMAILALARM,REQUESTSTATUS,NONE,ZERO -NONE,XEMAILALARM,RESOURCES,NONE,ZERO -NONE,XEMAILALARM,RRULE,NONE,ZERO -NONE,XEMAILALARM,SEQUENCE,NONE,ZERO -NONE,XEMAILALARM,STATUS,NONE,ZERO -NONE,XEMAILALARM,SUMMARY,NONE,ONE -NONE,XEMAILALARM,TRANSP,NONE,ZERO -NONE,XEMAILALARM,TRIGGER,NONE,ONE -NONE,XEMAILALARM,TZID,NONE,ZERO -NONE,XEMAILALARM,TZNAME,NONE,ZERO -NONE,XEMAILALARM,TZOFFSETFROM,NONE,ZERO -NONE,XEMAILALARM,TZOFFSETTO,NONE,ZERO -NONE,XEMAILALARM,TZURL,NONE,ZERO -NONE,XEMAILALARM,UID,NONE,ZERO -NONE,XEMAILALARM,URL,NONE,ZERO -NONE,XEMAILALARM,VERSION,NONE,ZERO -NONE,XEMAILALARM,X,NONE,ZEROPLUS -NONE,XPROCEDUREALARM,ACTION,NONE,ONE -NONE,XPROCEDUREALARM,ATTACH,NONE,ZEROORONE -NONE,XPROCEDUREALARM,ATTENDEE,NONE,ZERO -NONE,XPROCEDUREALARM,CALSCALE,NONE,ZERO -NONE,XPROCEDUREALARM,CATEGORIES,NONE,ZERO -NONE,XPROCEDUREALARM,CLASS,NONE,ZERO -NONE,XPROCEDUREALARM,COMMENT,NONE,ZERO -NONE,XPROCEDUREALARM,COMPLETED,NONE,ZERO -NONE,XPROCEDUREALARM,CONTACT,NONE,ZERO -NONE,XPROCEDUREALARM,CREATED,NONE,ZERO -NONE,XPROCEDUREALARM,DESCRIPTION,NONE,ZEROORONE -NONE,XPROCEDUREALARM,DTEND,NONE,ZERO -NONE,XPROCEDUREALARM,DTSTAMP,NONE,ZERO -NONE,XPROCEDUREALARM,DTSTART,NONE,ZERO -NONE,XPROCEDUREALARM,DUE,NONE,ZERO -NONE,XPROCEDUREALARM,DURATION,NONE,ONEMUTUAL,must_have_repeat -NONE,XPROCEDUREALARM,REPEAT,NONE,ONEMUTUAL,must_have_duration -NONE,XPROCEDUREALARM,EXDATE,NONE,ZERO -NONE,XPROCEDUREALARM,EXRULE,NONE,ZERO -NONE,XPROCEDUREALARM,FREEBUSY,NONE,ZERO -NONE,XPROCEDUREALARM,GEO,NONE,ZERO -NONE,XPROCEDUREALARM,LASTMODIFIED,NONE,ZERO -NONE,XPROCEDUREALARM,LOCATION,NONE,ZERO -NONE,XPROCEDUREALARM,METHOD,NONE,ZERO -NONE,XPROCEDUREALARM,ORGANIZER,NONE,ZERO -NONE,XPROCEDUREALARM,PERCENTCOMPLETE,NONE,ZERO -NONE,XPROCEDUREALARM,PRIORITY,NONE,ZERO -NONE,XPROCEDUREALARM,PRODID,NONE,ZERO -NONE,XPROCEDUREALARM,RDATE,NONE,ZERO -NONE,XPROCEDUREALARM,RECURRENCEID,NONE,ZERO -NONE,XPROCEDUREALARM,RELATEDTO,NONE,ZERO -NONE,XPROCEDUREALARM,REQUESTSTATUS,NONE,ZERO -NONE,XPROCEDUREALARM,RESOURCES,NONE,ZERO -NONE,XPROCEDUREALARM,RRULE,NONE,ZERO -NONE,XPROCEDUREALARM,SEQUENCE,NONE,ZERO -NONE,XPROCEDUREALARM,STATUS,NONE,ZERO -NONE,XPROCEDUREALARM,SUMMARY,NONE,ZERO -NONE,XPROCEDUREALARM,TRANSP,NONE,ZERO -NONE,XPROCEDUREALARM,TRIGGER,NONE,ONE -NONE,XPROCEDUREALARM,TZID,NONE,ZERO -NONE,XPROCEDUREALARM,TZNAME,NONE,ZERO -NONE,XPROCEDUREALARM,TZOFFSETFROM,NONE,ZERO -NONE,XPROCEDUREALARM,TZOFFSETTO,NONE,ZERO -NONE,XPROCEDUREALARM,TZURL,NONE,ZERO -NONE,XPROCEDUREALARM,UID,NONE,ZERO -NONE,XPROCEDUREALARM,URL,NONE,ZERO -NONE,XPROCEDUREALARM,VERSION,NONE,ZERO -NONE,XPROCEDUREALARM,X,NONE,ZEROPLUS diff --git a/libical/design-data/status.txt b/libical/design-data/status.txt deleted file mode 100644 index 9e7bbf83a7..0000000000 --- a/libical/design-data/status.txt +++ /dev/null @@ -1,56 +0,0 @@ -2.0 STATOK Operation was successfully performed. -2.0.1 STARTSENDATA Start ICAL input; end with <CRLF>.<CRLF> -2.0.11 OKDATAFOLLOWS The request was processed successfully. Reply data follows on the next line and terminates with <CRLF>.<CRLF> -2.0.2 REPLYPENDING A timeout has occurred. The server is still working on the reply. Use CONTINUE to continue waiting for the reply or ABORT to terminate the command. -2.0.3 ABORTED The command currently underway was successsfully aborted. -2.0.4 WILLATTEMPT The specified Calendar is not here but an attempt will be made to deliver the request or reply to the Calendar anyway. -2.0.5 TRUSTEDWILLQUEUE The request or reply will be queued and delivered to the target calendar when its iRIP server contacts this server and issues the SWITCH command. -2.0.6 WILLATTEMPT The specified Calendar is not here but an attempt will be made to deliver the request or reply to the Calendar anyway. -2.0.7 QUEUED The message has been queued for delivery. -2.0.8 QUEUEEMPTY There are no more queued messages. -2.1 FALLBACK Success. Fallback taken on one or more property values. -2.2 NOCOMMANDINPROGRESS An ABORT or CONTINUE was received when no command was in progress -2.2 IGPROP Success. Invalid property ignored. -2.3 IGPARAM Success. invalid property parameter ignored. -2.4 IGXPROP Success. Unknown non-standard property ignored. -2.5 IGXPARAM Success. Unknown non standard property value ignored. -2.6 IGCOMP Success. Invalid calendar component ignored. -2.7 FORWARD Success. Request forwarded to Calendar User. -2.8 ONEEVENT Success. Repeating event ignored. Scheduled as a single component. -2.9 TRUNC Success. Truncated end date time to date boundary. -2.10 ONETODO Success. Repeating VTODO ignored. Scheduled as a single VTODO. -2.11 TRUNCRRULE Success. Unbounded RRULE clipped at some finite number of instances -3.0 INVPROPNAME Invalid property name. -3.1 INVPROPVAL Invalid property value. -3.2 INVPARAM Invalid property parameter. -3.3 INVPARAMVAL Invalid property parameter value. -3.4 INVCOMP Invalid calendar component sequence. -3.5 INVTIME Invalid date or time. -3.6 INVRULE Invalid rule. -3.7 INVCU Invalid Calendar User. -3.8 NOAUTH No authority. -3.9 BADVERSION Unsupported version. -3.10 TOOBIG Request entity too large. -3.11 MISSREQCOMP Required component or property missing. -3.12 UNKCOMP Unknown component or property found. -3.13 BADCOMP Unsupported component or property found -3.14 NOCAP Unsupported capability. -4.0 BUSY Event conflict. Date/time is busy. -5.0 MAYBE Request MAY supported. -5.1 UNAVAIL Service unavailable. -5.2 NOSERVICE Invalid calendar service. -5.3 NOSCHED No scheduling support for user. -6.1 AUTHENTICATEFAILURE Unsupported authentication mechanism, credentials rejected -6.2 AUTHENTICATIONABORTED Sender aborted authentication, authentication exchange cancelled -8.0 GENERALFAILURE A failure has occurred in the Receiver that prevents the operation from succeeding. -8.1 SERVERTOOBUSY The iRIP Receiver is too busy. -8.2 ICALOBJECTTOOBIG Object has exceeded the server's size limit. -8.3 DATETOOLARGE A DATETIME value was too far in the future to be represented on this Calendar. -8.4 DATETOOSMALL A DATETIME value was too far in the past to be represented on this Calendar. -9.0 INVALIDIRIPCOMMAND An unrecongnized command was received. -9.1 UNEXPECTEDCOMMAND The command is not allowed for the server's current state. -10.1 REFERRAL Accompanied by an alternate address. -10.2 SERVERSHUTDOWN The server is shutting down. -10.3 SERVERSTOPPING FLOOD 2 -10.4 EXCEEDEDQUOTAS The operation would cause a resource to exceed the allocated quota -10.5 QUEUEDTOOLONG The ITIP message has been queued too long. Delivery has been aborted. diff --git a/libical/design-data/value-c-types.txt b/libical/design-data/value-c-types.txt deleted file mode 100644 index a171b31171..0000000000 --- a/libical/design-data/value-c-types.txt +++ /dev/null @@ -1,23 +0,0 @@ -ATTACH autogen struct icalattachtype # Non-std -BINARY autogen const char* -BOOLEAN autogen int -CAL-ADDRESS autogen const char* -DATE autogen struct icaltimetype -DATE-TIME autogen struct icaltimetype -DATE-TIME-DATE autogen struct icaltimetype # Non-std -DATE-TIME-PERIOD nogen struct icaldatetimeperiodtype # Non-std -DURATION autogen struct icaldurationtype -FLOAT autogen float -GEO autogen struct icalgeotype # Non-std -INTEGER autogen int -METHOD autogen icalproperty_method # Non-std -PERIOD autogen struct icalperiodtype -RECUR nogen struct icalrecurrencetype -STRING autogen const char* # Non-std -TEXT autogen const char* -TIME autogen struct icaltimetype -TRIGGER nogen struct icaltriggertype # Non-std -URI autogen const char* -UTC-OFFSET autogen int -QUERY autogen const char* -STATUS autogen icalproperty_status #Non-std diff --git a/libical/design-data/value-mem-semantics.txt b/libical/design-data/value-mem-semantics.txt deleted file mode 100644 index 5948e244f6..0000000000 --- a/libical/design-data/value-mem-semantics.txt +++ /dev/null @@ -1,19 +0,0 @@ -ATTACH struct icalattachtype -BINARY char* -BOOLEAN int -CAL-ADDRESS char* -DATE time_t -DATE-TIME time_t -DATE-TIME-DATE time_t -DATE-TIME-PERIOD struct icalperiodtype -DURATION struct icaldurationtype -FLOAT float -GEO struct icalgeotype -INTEGER int -PERIOD struct icalperiodtype -RECUR struct icalrecurrencetype -TEXT char* -TIME time_t -TRIGGER struct icaltriggertimetype -URI char* -UTC-OFFSET int diff --git a/libical/design-data/value-types.csv b/libical/design-data/value-types.csv deleted file mode 100644 index cbe6bd9969..0000000000 --- a/libical/design-data/value-types.csv +++ /dev/null @@ -1,31 +0,0 @@ -"#Name","C type& gen flag","Python","Component Values","Enum Values" -"BINARY","(a)const char*","file","unitary", -"BOOLEAN","(a)int","integer","unitary", -"CAL-ADDRESS","(a)const char*","string","unitary", -"DATE","(a)struct icaltimetype","Time","unitary", -"DATE-TIME","(a)struct icaltimetype","Time","unitary", -"DURATION","(a)struct icaldurationtype","Duration","unitary", -"FLOAT","(a)float","float","unitary", -"INTEGER","(a)int","integer","unitary", -"PERIOD","(a)struct icalperiodtype","Period","unitary", -"RECUR","(m)struct icalrecurrencetype","RecurrenceSet","unitary", -"TEXT","(a)const char*","string","unitary", -"TIME","(a)struct icaltimetype","Time","unitary", -"URI","(a)const char*","string","unitary", -"UTC-OFFSET","(a)int","integer","unitary", -"QUERY","(a)const char*","string","unitary", -"#Non-standard multi-valued types",,,, -"ATTACH","(a)struct icalattachtype","none","URI;BINARY", -"DATE-TIME-DATE","(a)struct icaltimetype","none","DATE-TIME;DATE", -"DATE-TIME-PERIOD","(m)struct icaldatetimeperiodtype","none","DATE-TIME;PERIOD", -"TRIGGER","(m)struct icaltriggertype","string","DURATION;DATE-TIME", -"#Non-standard property enumeration types",,,, -"METHOD","(a)enum icalproperty_method","string","unitary","PUBLISH;REQUEST;REPLY;ADD;CANCEL;REFRESH;COUNTER;DECLINECOUNTER;CREATE;READ;RESPONSE;MOVE;MODIFY;GENERATEUID;DELETE" -"ACTION","(a)enum icalproperty_action","string","unitary","AUDIO;DISPLAY;EMAIL;PROCEDURE" -"STATUS","(a)enum icalproperty_status","string","unitary","TENTATIVE;CONFIRMED;COMPLETED;NEEDS-ACTION;CANCELLED;IN-PROCESS;DRAFT;FINAL" -"TRANSP","(a)enum icalproperty_transp","string","unitary","OPAQUE;TRANSPARENT" -"CLASS","(a)enum icalproperty_class","string","unitary","PUBLIC;PRIVATE;CONFIDENTIAL" -"#Other non-standard",,,, -"GEO","(a)struct icalgeotype","tuple","unitary", -"STRING","(a)const char*","string","unitary", -"X","(m)const char*","string","unitary", diff --git a/libical/doc/.cvsignore b/libical/doc/.cvsignore deleted file mode 100644 index 3dda72986f..0000000000 --- a/libical/doc/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -Makefile.in -Makefile diff --git a/libical/doc/Makefile.am b/libical/doc/Makefile.am deleted file mode 100644 index 70b008a369..0000000000 --- a/libical/doc/Makefile.am +++ /dev/null @@ -1 +0,0 @@ -EXTRA_DIST = UsingLibical.lyx UsingLibical.ps UsingLibical.txt diff --git a/libical/doc/UsingLibical.lyx b/libical/doc/UsingLibical.lyx deleted file mode 100644 index cef199bea5..0000000000 --- a/libical/doc/UsingLibical.lyx +++ /dev/null @@ -1,2578 +0,0 @@ -#LyX 1.1 created this file. For more info see http://www.lyx.org/ -\lyxformat 2.16 -\textclass article -\language default -\inputencoding latin1 -\fontscheme default -\graphics default -\paperfontsize default -\spacing single -\papersize Default -\paperpackage a4 -\use_geometry 0 -\use_amsmath 0 -\paperorientation portrait -\secnumdepth 3 -\tocdepth 3 -\paragraph_separation indent -\defskip medskip -\quotes_language english -\quotes_times 2 -\papercolumns 1 -\papersides 1 -\paperpagestyle default - -\layout Title - -Using Libical -\layout Author - -Eric Busboom (eric@softwarestudio.org) -\layout Date - -January 2001 -\layout Standard - - -\begin_inset LatexCommand \tableofcontents{} - -\end_inset - - -\layout Section - -Introduction -\layout Standard - -Libical is an Open Source implementation of the iCalendar protocols and - protocol data units. - The iCalendar specification describes how calendar clients can communicate - with calendar servers so users can store their calendar data and arrange - meetings with other users. - -\layout Standard - -Libical implements RFC2445, RFC2446 and some of RFC2447 and the CAP draft. - -\layout Standard - -This documentation assumes that you are familiar with the iCalendar standards - RFC2445 and RFC2446. - these specifications are online on the CALSCH webpage at: -\layout LyX-Code - -http://www.imc.org/ietf-calendar/ -\layout Subsection - -The libical project -\layout Standard - -This code is under active development. - If you would like to contribute to the project, you can contact me, Eric - Busboom, at eric@softwarestudio.org. - The project has a webpage at -\layout LyX-Code - -http://softwarestudio.org/libical/index.html -\layout Standard - -and a mailing list that you can join by sending the following mail: -\layout LyX-Code - -To: minimalist@softwarestudio.org -\layout LyX-Code - -Subject: subscribe libical -\layout Subsection - -License -\layout Standard - -The code and datafiles in this distribution are licensed under the Mozilla - Public License. - See http://www.mozilla.org/NPL/MPL-1.0.html for a copy of the license. - Alternately, you may use libical under the terms of the GNU Library General - Public License. - See http://www.fsf.org/copyleft/lesser.html for a copy of the LGPL. -\layout Standard - -This dual license ensures that the library can be incorporated into both - proprietary code and GPL'd programs, and will benefit from improvements - made by programmers in both realms. - I will only accept changes into my version of the library if they are similarly - dual-licensed. -\layout Subsection - -Example Code -\layout Standard - -A lot of the documentation for this library is in the form of example code. - These examples are in the -\begin_inset Quotes eld -\end_inset - -examples -\begin_inset Quotes erd -\end_inset - - directory of the distribution. - Also look in -\begin_inset Quotes eld -\end_inset - -src/test -\begin_inset Quotes erd -\end_inset - - for additional annotated examples. - -\layout Section - -Building nas Installing the Library -\layout Standard - -Libical uses autoconf to generate makefiles. - It should built with no adjustments on Linux, FreeBSD and Solaris under - gcc. - Some version have been successfully been build on MacOS, Solaris, UnixWare, - And Tru64 UNIX without gcc, but you may run into problems with a particular - later version. - -\layout Standard - -For a more complete guide to building the library, see the README file in - the distribution. - -\layout Standard - - -\begin_inset Quotes eld -\end_inset - -make install -\begin_inset Quotes erd -\end_inset - - will install the libraries and header files for three modules: libical, - libicalss. - and libicalvcal. - If you build shared objects, then these files will be installed: -\layout Itemize - -ical.h -\layout Itemize - -libical.a -\layout Itemize - -libical.so -\layout Itemize - -icalss.h -\layout Itemize - -libicalss.a -\layout Itemize - -libicalss.so -\layout Itemize - -icalvcal.h -\layout Itemize - -libicalvcal.a -\layout Itemize - -libicalvcal.so -\layout Standard - -The header files ical.h and icalss.h are combined header files, generated - by concatenating together all of the header files in src/libical and src/libica -lss respectively. - -\layout Section - -Structure -\layout Standard - -The iCal calendar model is based on four types of objects: components, propertie -s, values and parameters. - -\layout Standard - -Properties are the fundamental unit of information in iCal, and they work - a bit like a hash entry, with a constant key and a variable value. - Properties may also have modifiers, called parameters. - In the iCal content line -\layout LyX-Code - -ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com -\layout Standard - -The property name is -\begin_inset Quotes eld -\end_inset - -ORGANIZER, -\begin_inset Quotes erd -\end_inset - - the value of the property is -\begin_inset Quotes eld -\end_inset - -mrbig@host.com -\begin_inset Quotes erd -\end_inset - - and the -\begin_inset Quotes eld -\end_inset - -ROLE -\begin_inset Quotes erd -\end_inset - - parameter specifies that Mr Big is the chair of the meetings associated - with this property. - -\layout Standard - -Components are groups of properties that represent the core objects of a - calendar system, such as events or timezones. - Components are delimited by -\begin_inset Quotes eld -\end_inset - -BEGIN -\begin_inset Quotes erd -\end_inset - - and -\begin_inset Quotes eld -\end_inset - -END -\begin_inset Quotes erd -\end_inset - - tags. - -\layout Standard -\added_space_bottom 0.3cm -When a component is sent across a network, if it is un-encrypted, it will - look something like: -\layout LyX-Code - -BEGIN:VCALENDAR -\layout LyX-Code - -METHOD:REQUEST -\layout LyX-Code - -PRODID: -//hacksw/handcal//NONSGML v1.0//EN -\layout LyX-Code - -BEGIN:VEVENT -\layout LyX-Code - -DTSTAMP:19980309T231000Z -\layout LyX-Code - -UID:guid-1.host1.com -\layout LyX-Code - -ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com -\layout LyX-Code - -ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP: -\layout LyX-Code - - MAILTO:employee-A@host.com -\layout LyX-Code - -DESCRIPTION:Project XYZ Review Meeting -\layout LyX-Code - -CATEGORIES:MEETING -\layout LyX-Code - -CLASS:PUBLIC -\layout LyX-Code - -CREATED:19980309T130000Z -\layout LyX-Code - -SUMMARY:XYZ Project Review -\layout LyX-Code - -DTSTART;TZID=US-Eastern:19980312T083000 -\layout LyX-Code - -DTEND;TZID=US-Eastern:19980312T093000 -\layout LyX-Code - -LOCATION:1CP Conference Room 4350 -\layout LyX-Code - -END:VEVENT -\layout LyX-Code - -END:VCALENDAR -\layout Standard - -Note that components can be nested; this example has both a VCALENDAR and - a VEVENT component, one nested inside the other. - -\layout Standard - -The main goal of Libical is to offer a structured, type-safe to create, - access and manipulate components and their properties, values and parameters. - -\layout Subsection - -Core iCal classes -\layout Standard - -Libical is an object-based, data-oriented library. - There are no real-objects, but the way the routines are named and organized - results in the same sort of encapsulations and abstraction that are major - features of Object-Orieted languages. - Nearly all of the routines in the library are associated with an opaque - data types and perform some operation on that data type. - For instnace, a Property is declared as: -\layout LyX-Code - -icalproperty *prop; -\layout Standard - -Icalproperty is typedef'd to void, so the only way to manipulate it is through - the accessor routines, all of which have a form similar to: -\layout LyX-Code - -char* icalproperty_as_ical_string(icalproperty* prop); -\layout Standard - -That is, the name of the 'class' is the first word in the routine name, - and the first parameter is a pointer to the 'object.' -\layout Standard - -Although the library does not actually have classes, we will use those terms - since the behavior of these associations of data and routines is very similar - to a class. - -\layout Subsubsection - -Properties -\layout LyX-Code - -icalproperty *prop; -\layout Standard - -Properties are represented with the icalproperty class and its many -\begin_inset Quotes eld -\end_inset - -derived -\begin_inset Quotes erd -\end_inset - - classes with on -\begin_inset Quotes eld -\end_inset - -derived -\begin_inset Quotes erd -\end_inset - - class per property type in RFC2445. - Again, there is no actual inheritance relations, but there are clusters - of routines that make this term useful. - A property is a container for a single value and a set of parameters. - -\layout Subsubsection - -Components -\layout LyX-Code - -icalcomponent *comp; -\layout Standard - -In libical, components are represented with the icalcomponent class. - Icalcomponent is a container for a set of other components and properties. -\layout Subsubsection - -Values -\layout LyX-Code - -icalvalue *value; -\layout Standard - -Values are represented in a similar way to properties; a base class and - many -\begin_inset Quotes eld -\end_inset - -derived -\begin_inset Quotes eld -\end_inset - - classes. - A value is essentially a abstract handle on a single fundamental type, - a structure or a union. - You probably will never use a value directly, since for most operations - you can get to its data through the property that holds it. - -\layout Subsubsection - -Parameters -\layout LyX-Code - -icalparameter *param; -\layout Standard - -Parameters are represetned in a similar way to properties, except that they - contain only one value -\layout Subsection - -Other elements of libical -\layout Standard - -In addition to the core iCal classes, libical has many other types, structures, - classes that aid in creating and using iCal components. - -\layout Subsubsection - -Enumerations and types -\layout Standard - -Libical is strongly typed, so every component, property, parameter, and - value type has an enumeration, and some have an associated structure or - union. - -\layout Subsubsection - -The parser -\layout Standard - -The libical parser offers a variety of ways to convert RFC2445 text into - a libical iinsteral component structure. - the parser can parse blocks of text as a string, or it can parse lin-by-line. -\layout Subsubsection - -Error objects -\layout Standard - -Libical has a substantial error reporting system for both programming errors - and component usage errors. - -\layout Subsubsection - -Memory Management -\layout Standard - -Since many of libicals interfaces return strings, the library has its own - memory management system to elimiate the need to free every string returned - from the libraru. - -\layout Subsubsection - -Storage classes -\layout Standard - -The library also offers several classes to store components to flies, memory - or databases. - -\layout Section - -Differences From RFCs -\layout Standard - -Libical has been designed to follow the standards as closely as possible, - so that the key objects in the standards are also key objects in the library. - However, there are a few areas where the specifications are (arguably) - irregular, and following them exactly would result in an unfriendly interface. - These deviations make libical easier to use by maintaining a self-similar - interface. - -\layout Subsection - -Pseudo Components -\layout Standard - -Libical defines components for groups of properties that look and act like - components, but are not defined as components in the specification. - XDAYLIGHT and XSTANDARD are notable examples. - These pseudo components group properties within the VTIMEZONE components. - For instanace, the timezone properties associated with daylight savings - time starts with -\begin_inset Quotes eld -\end_inset - -BEGIN:DAYLIGHT -\begin_inset Quotes erd -\end_inset - - and ends with -\begin_inset Quotes eld -\end_inset - -END:DAYLIGHT, just like other components, but is not defined as a component - in RFC2445. - ( See RFC2445, page 61 ) In Libical,this grouping is represented by the - XDAYLIGHT component. - Standard iCAL components all start with the letter -\begin_inset Quotes eld -\end_inset - -V, -\begin_inset Quotes erd -\end_inset - - while pseudo components start with -\begin_inset Quotes erd -\end_inset - -X. -\begin_inset Quotes erd -\end_inset - - -\layout Standard - -There are also pseudo components that are conceptually derived classes of - VALARM. - RFC2446 defines what properties may be included in each component, and - for VALARM, the set of properties it may have depends on the value of the - ACTION property. - -\layout Standard - -For instance, if a VALARM component has an ACTION property with the value - of -\begin_inset Quotes eld -\end_inset - -AUDIO, -\begin_inset Quotes erd -\end_inset - - the component must also have an -\begin_inset Quotes eld -\end_inset - -ATTACH -\begin_inset Quotes erd -\end_inset - - property. - However, if the ACTION value is -\begin_inset Quotes eld -\end_inset - -DISPLAY, -\begin_inset Quotes erd -\end_inset - - the component must have a DESCRIPTION property. - -\layout Standard - -To handle these various, complex restrictions, libical has pseudo components - for each type of alarm: XAUDIOALARM, XDISPLAYALARM, XEMAILALARM and XPROCEDUREA -LARM. - -\layout Subsection - -Combined Values -\layout Standard - -Many values can take more than one type. - TRIGGER, for instance, can have a value type of with DURATION or of DATE-TIME. - These multiple types make it difficult to create routines to return the - value associated with a property. - -\layout Standard - -It is natural to have interfaces that would return the value of a property, - but it is cumbersome for a single routine to return multiple types. - So, in libical, properties that can have multiple types are given a single - type that is the union of their RFC2445 types. - For instance, in libical, the value of the TRIGGER property resolves to - struct icaltriggertype. - This type is a union of a DURATION and a DATE-TIME. - -\layout Subsection - -Multi-Valued Properties -\layout Standard - -Some properties, such as CATEGORIES have only one value type, but each CATEGORIE -S property can have multiple value instances. - This also results in a cumbersome interface -- CATEGORIES accessors would - have to return a list while all other accessors returned a single value. - In libical, all properties have a single value, and multi-valued properties - are broken down into multiple single valued properties during parsing. - That is, an input line like, -\layout LyX-Code - -CATEGORIES: work, home -\layout Standard - -becomes in libical's internal representation -\layout LyX-Code - -CATEGORIES: work -\layout LyX-Code - -CATEGORIES: home -\layout Standard - -Oddly, RFC2445 allows some multi-valued properties ( like FREEBUSY ) to - exist as both a multi-values property and as multiple single value properties, - while others ( like CATEGORIES ) can only exist as single multi-valued - properties. - This makes the internal representation for CATEGORIES illegal. - However when you convert a component to a string, the library will collect - all of the CATEGORIES properties into one. - -\layout Section - -Using libical -\layout Subsection - -Creating Components -\layout Standard - -There are three ways to create components in Libical: -\layout Itemize - -Create individual components, properties and parameters and assemble them - into structures -\layout Itemize - -Build complete components with nested vaargs calls -\layout Itemize - -Parse bits of text -\layout Itemize - -Parse entire files -\layout Subsubsection - -Constructor Interfaces -\layout Standard - -Using constructor interfaces, you create each of the objects separately - and then assemble them in to components: -\layout LyX-Code - -icalcomponent *event; -\layout LyX-Code - -icalproperty *prop; -\layout LyX-Code - -icalparameter *param; -\layout LyX-Code - -struct icaltimetype atime; -\layout LyX-Code - -\layout LyX-Code - -event = icalcomponent_new(ICAL_VEVENT_COMPONENT); -\layout LyX-Code - -prop = icalproperty_new_dtstamp(atime); -\layout LyX-Code - -icalcomponent_add_property(event, prop); -\layout LyX-Code - -\layout LyX-Code - -prop = icalproperty_new_uid(''guid-1.host1.com'') ); -\layout LyX-Code - -icalcomponent_add_property(event,prop); -\layout LyX-Code - -\layout LyX-Code - -prop=icalproperty_new_organizer(''mrbig@host.com''); -\layout LyX-Code - -param = icalparameter_new_role(ICAL_ROLE_CHAIR) -\layout LyX-Code - -icalproperty_add_parameter(prop, param); -\layout LyX-Code - -\layout LyX-Code - -icalcomponent_add_property(event,prop); -\layout Standard - -Notice that libical uses a semi-object-oriented style of interface. - Most things you work with are objects, that are instantiated with a constructor - that has -\begin_inset Quotes eld -\end_inset - -new -\begin_inset Quotes erd -\end_inset - - in the name. - Also note that, other than the object reference, most structure data is - passed in to libical routines by value. - Libical has some complex but very regular memory handling rules. - These are detailed in section -\begin_inset LatexCommand \ref{sec:memory} - -\end_inset - -. -\layout Standard - -If any of the constructors fail, they will return 0. - If you try to insert 0 into a property or component, or use a zero-valued - object reference, libical will either silently ignore the error or will - abort with an error message. - This behavior is controlled by a compile time flag (ICAL_ERRORS_ARE_FATAL), - and will abort by default. - -\layout Subsubsection - -vaargs Constructors -\layout Standard - -There is another way to create complex components, which is arguably more - elegant, if you are not horrified by varargs. - The varargs constructor interface allows you to create intricate components - in a single block of code. - Here is the previous examples in the vaargs style. - -\layout LyX-Code - - calendar = -\layout LyX-Code - - icalcomponent_vanew( -\layout LyX-Code - - ICAL_VCALENDAR_COMPONENT, -\layout LyX-Code - - icalproperty_new_version(''2.0''), -\layout LyX-Code - - icalproperty_new_prodid( -\layout LyX-Code - - ''-//RDU Software//NONSGML HandCal//EN''), -\layout LyX-Code - - icalcomponent_vanew( -\layout LyX-Code - - ICAL_VEVENT_COMPONENT, -\layout LyX-Code - - icalproperty_new_dtstamp(atime), -\layout LyX-Code - - icalproperty_new_uid(''guid-1.host1.com''), -\layout LyX-Code - - icalproperty_vanew_organizer( -\layout LyX-Code - - ''mrbig@host.com''), -\layout LyX-Code - - icalparameter_new_role(ICAL_ROLE_CHAIR), -\layout LyX-Code - - 0 -\layout LyX-Code - - ), -\layout LyX-Code - - icalproperty_vanew_attendee( -\layout LyX-Code - - ''employee-A@host.com'', -\layout LyX-Code - - icalparameter_new_role( -\layout LyX-Code - - ICAL_ROLE_REQPARTICIPANT), -\layout LyX-Code - - icalparameter_new_rsvp(1), -\layout LyX-Code - - icalparameter_new_cutype(ICAL_CUTYPE_GROUP), -\layout LyX-Code - - 0 -\layout LyX-Code - - ), -\layout LyX-Code - - icalproperty_new_location( -\layout LyX-Code - - "1CP Conference Room 4350"), -\layout LyX-Code - - 0 -\layout LyX-Code - - ), -\layout LyX-Code - - 0 -\layout LyX-Code - - ); -\layout Standard - -This form is similar to the constructor form , except that the constructors - have -\begin_inset Quotes eld -\end_inset - -vanew -\begin_inset Quotes erd -\end_inset - - instead of -\begin_inset Quotes eld -\end_inset - -new -\begin_inset Quotes erd -\end_inset - - in the name. - The arguments are similar too, except that the component constructor can - have a list of properties, and the property constructor can have a list - of parameters. - Be sure to terminate every list with a '0', or your code will crash, if - you are lucky. - -\layout Subsubsection - -Parsing Text -\layout Standard - -Several routines are available for generating objects from text. - For properties, use: -\layout LyX-Code - -icalproperty* p; -\layout LyX-Code - -p = icalproperty_new_from_string("DTSTART:19970101T120000Z -\backslash -n"); -\layout Standard - -For parameters, use: -\layout LyX-Code - -icalparameter *param -\layout LyX-Code - -param = icalparameter_new_from_string("PARTSTAT=ACCEPTED"); -\layout Standard - -The final way to create components will probably be the most common; you - can create components from RFC2445 compliant text. - If you have the string in memory, use -\layout LyX-Code - -icalcomponent* icalcomponent_new_from_string(char* str); -\layout Standard - -If the string contains only one component, the routine will return the component - in libical form. - If the string contains multiple components, the multiple components will - be returned as the children of an ICAL_XROOT_COMPONENT component. - This routine is identical to ( and actually uses ) icalparser_parse_string(char -* str). -\layout Standard - -Parsing a whole string may seem wasteful if you want to pull a large component - off of the network or from a file; you may prefer to parse the component - line by line. - This is possible too by using: -\layout LyX-Code - -icalparser* icalparser_new(); -\layout LyX-Code - -void icalparser_free(icalparser* parser); -\layout LyX-Code - -icalparser_get_line(parser,read_stream); -\layout LyX-Code - -icalparser_add_line(parser,line); -\layout LyX-Code - -icalparser_set_gen_data(parser,stream) -\layout Standard - -These routines will construct a parser object to which you can add lines - of input and retrieve any components that the parser creates from the input. - These routines work by specifing an adaptor routine to get string data - from a source. - For an example: -\layout LyX-Code - -char* read_stream(char *s, size_t size, void *d) -\layout LyX-Code - -{ -\layout LyX-Code - - char *c = fgets(s,size, (FILE*)d); -\layout LyX-Code - - return c; -\layout LyX-Code - -} -\layout LyX-Code - -main() { -\layout LyX-Code - - char* line; -\layout LyX-Code - - icalcomponent *c; -\layout LyX-Code - - icalparser *parser = icalparser_new(); -\layout LyX-Code - - FILE* stream = fopen(argv[1],"r"); -\layout LyX-Code - - icalparser_set_gen_data(parser,stream); -\layout LyX-Code - - do{ -\layout LyX-Code - - line = icalparser_get_line(parser,read_stream); -\layout LyX-Code - - c = icalparser_add_line(parser,line); -\layout LyX-Code - - if (c != 0){ -\layout LyX-Code - - printf("%s",icalcomponent_as_ical_string(c)); -\layout LyX-Code - - icalparser_claim(parser); -\layout LyX-Code - - printf(" -\backslash -n--------------- -\backslash -n"); -\layout LyX-Code - - icalcomponent_free(c); -\layout LyX-Code - - } -\layout LyX-Code - - } while ( line != 0); -\layout LyX-Code - -} -\layout Standard - -The parser object parameterizes the routine used to get input lines with - icalparser_set_gen_data() and -\emph on - -\emph default -icalparser_get_line(). - In this example, the routine read_stream() will fetch the next line from - a stream, with the stream passed in as the void* parameter d. - The parser calls read_stream() from icalparser_get_line(), but it also - needs to know what stream to use. - This is set by the call to icalparser_set_gen_data(). - By using a different routine for read_stream or passing in different data - with icalparser_set_gen_data, you can connect to any data source. - -\layout Standard - -Using the same mechanism, other implementations could read from memory buffers, - sockets or other interfaces. - -\layout Standard - -Since the example code is a very common way to use the parser, there is - a convenience routine; -\layout LyX-Code - -icalcomponent* icalparser_parse(icalparser *parser, -\layout LyX-Code - - char* (*line_gen_func)(char *s, size_t size, void* d)) -\layout Standard - -To use this routine, you still must construct the parser object and pass - in a reference to a line reading routine. - If the parser can create a single component from the input, it will return - a pointer to the newly constructed component. - If the parser can construct multiple components from the input, it will - return a reference to an XROOT component ( of type ICAL_XROOT_COMPONENT.) - This XROOT component will hold all of the components constructed from the - input as children. - -\layout Subsection - -Accessing Components -\layout Standard - -Given a reference to a component, you probably will want to access the propertie -s, parameters and values inside. - Libical interfaces let you find sub-components, add and remove sub-components, - and do the same three operations on properties. - -\layout Subsubsection - -Finding Components -\layout Standard - -To find a sub-component of a component, use: -\layout LyX-Code - -icalcomponent* icalcomponent_get_first_component( -\layout LyX-Code - - icalcomponent* component, -\layout LyX-Code - - icalcomponent_kind kind); -\layout Standard - -This routine will return a reference to the first component of the type - 'kind.' The key kind values, listed in icalenums.h are: -\layout LyX-Code - -ICAL_ANY_COMPONENT -\layout LyX-Code - -ICAL_VEVENT_COMPONENT -\layout LyX-Code - -ICAL_VTODO_COMPONENT -\layout LyX-Code - -ICAL_VJOURNAL_COMPONENT -\layout LyX-Code - -ICAL_VCALENDAR_COMPONENT -\layout LyX-Code - -ICAL_VFREEBUSY_COMPONENT -\layout LyX-Code - -ICAL_VALARM_COMPONENT -\layout Standard - -These are only the most common components; there are many more listed in - icalenums.h. -\layout Standard - -As you might guess, if there is more than one subcomponent of the type you - have chosen, this routine will return only the first. - to get at the others, you need to iterate through the component. - -\layout Subsubsection - -Iterating Through Components -\layout Standard - -Iteration requires a second routine to get the next subcomponent after the - first: -\layout LyX-Code - -icalcomponent* icalcomponent_get_next_component( -\layout LyX-Code - - icalcomponent* component, -\layout LyX-Code - - icalcomponent_kind kind); -\layout Standard - -With the 'first' and 'next' routines, you can create a for loop to iterate - through all of a components subcomponents -\layout LyX-Code - - for(c = icalcomponent_get_first_component(comp,ICAL_ANY_COMPONENT); -\layout LyX-Code - - c != 0; -\layout LyX-Code - - c = icalcomponent_get_next_component(comp,ICAL_ANY_COMPONENT)) -\layout LyX-Code - -{ -\layout LyX-Code - - do_something(c); -\layout LyX-Code - -} -\layout Standard - -This code bit wil iterate through all of the subcomponents in 'comp' but - you can select a specific type of component by changing ICAL_ANY_COMPONENT - to another component type. -\layout Subsubsection - -Using Component Iterators -\layout Standard - -The iteration model in the previous section requires the component to keep - the state of the iteration. - So, you could not use this model to perform a sorting operations, since - you'd need two iterators and there is only space for one. - If you ever call icalcomponent_get_first_component() when an iteration - is in progress, the pointer will be reset to the beginning. - -\layout Standard - -To solve this problem, there are also external iterators for components. - The routines associated with these external iterators are: -\layout LyX-Code - -icalcompiter icalcomponent_begin_component(icalcomponent* component, icalcompone -nt_kind kind); -\layout LyX-Code - -icalcompiter icalcomponent_end_component(icalcomponent* component, icalcomponent -_kind kind); -\layout LyX-Code - -icalcomponent* icalcompiter_next(icalcompiter* i); -\layout LyX-Code - -icalcomponent* icalcompiter_prior(icalcompiter* i); -\layout LyX-Code - -icalcomponent* icalcompiter_deref(icalcompiter* i); -\layout Standard - -The _begin_() and _end_() routines return a new iterator that points to - the beginning and ending of the list of subcomponent for the given component, - and the kind argument works like the kind argument for internal iterators. - -\layout Standard - -After creating an iterators, use _next_() and _prior_() to step forward - and backward through the list and get the component that the iterator points - to, and use _deref() to return the component that the iterator points to - without moving the iterator. - All routines will return 0 when they move to point off the end of the list. - -\layout Standard - -Here is an example of a loop using these routines: -\layout LyX-Code - -for( -\layout LyX-Code - - i = icalcomponent_begin_component(impl->cluster,ICAL_ANY_COMPONENT); - -\layout LyX-Code - - icalcompiter_deref(&i)!= 0; -\layout LyX-Code - - icalcompiter_next(&i) -\layout LyX-Code - -) { -\layout LyX-Code - - icalcomponent *this = icalcompiter_deref(&i); -\layout LyX-Code - -} -\layout Subsubsection - -Removing Components -\layout Standard - -Removing an element from a list while iterating through the list with the - internal iterators can cause problems, since you will probably be removing - the element that the internal iterator points to. - The _remove() routine will keep the iterator valid by moving it to the - next component, but in a normal loop, this will result in two advances - per iteration, and you will remove only every other component. - To avoid the problem, you will need to step the iterator ahead of the - element you are going to remove, like this: -\layout LyX-Code - -for(c = icalcomponent_get_first_component(parent_comp,ICAL_ANY_COMPONENT); - -\layout LyX-Code - - c != 0; -\layout LyX-Code - - c = next -\layout LyX-Code - -{ -\layout LyX-Code - - next = icalcomponent_get_next_component(parent_comp,ICAL_ANY_COMPONENT); -\layout LyX-Code - - icalcomponent_remove_component(parent_comp,c); -\layout LyX-Code - -} -\layout Standard - -Another way to remove components is to rely on the side effect of icalcomponent_ -remove_component: if component iterator in the parent component is pointing - to the child that will be removed, it will move the iterator to the component - after the child. - The following code will exploit this behavior: -\layout LyX-Code - -icalcomponent_get_first_component(parent_comp,ICAL_VEVENT_COMPONENT); -\layout LyX-Code - -while((c=icalcomponent_get_current_component(c)) != 0 ){ -\layout LyX-Code - - if(icalcomponent_isa(c) == ICAL_VEVENT_COMPONENT){ -\layout LyX-Code - - icalcomponent_remove_component(parent_comp,inner); -\layout LyX-Code - - } else { -\layout LyX-Code - - icalcomponent_get_next_component(parent_comp,ICAL_VEVENT_COMPONENT); - -\layout LyX-Code - - } -\layout LyX-Code - -} -\layout Subsubsection - -Working with properties and parameters -\layout Standard - -Finding, iterating and removing properties works the same as it does for - components, using the property-specific or parameter-specific interfaces: - -\layout LyX-Code - -icalproperty* icalcomponent_get_first_property( -\layout LyX-Code - - icalcomponent* component, -\layout LyX-Code - - icalproperty_kind kind); -\layout LyX-Code - -icalproperty* icalcomponent_get_next_property( -\layout LyX-Code - - icalcomponent* component, -\layout LyX-Code - - icalproperty_kind kind); -\layout LyX-Code - -void icalcomponent_add_property( -\layout LyX-Code - - icalcomponent* component, -\layout LyX-Code - - icalproperty* property); -\layout LyX-Code - -void icalcomponent_remove_property( -\layout LyX-Code - - icalcomponent* component, -\layout LyX-Code - - icalproperty* property); -\layout Standard - -For parameters: -\layout LyX-Code - -icalparameter* icalproperty_get_first_parameter( -\layout LyX-Code - - icalproperty* prop, -\layout LyX-Code - - icalparameter_kind kind); -\layout LyX-Code - -icalparameter* icalproperty_get_next_parameter( -\layout LyX-Code - - icalproperty* prop, -\layout LyX-Code - - icalparameter_kind kind); -\layout LyX-Code - -void icalproperty_add_parameter( -\layout LyX-Code - - icalproperty* prop, -\layout LyX-Code - - icalparameter* parameter); -\layout LyX-Code - -void icalproperty_remove_parameter( -\layout LyX-Code - - icalproperty* prop, -\layout LyX-Code - - icalparameter_kind kind); -\layout Standard - -Note that since there should be only one parameter of each type in a property, - you will rarely need to use icalparameter_get_nect_paameter. -\layout Subsubsection - -Working with values -\layout Standard - -Values are typically part of a property, although they can exist on their - own. - You can manipulate them either as part of the property or independently. -\layout Standard - -The most common way to work with values to is to manipulate them from they - properties that contain them. - This involves fewer routine calls and intermediate variables than working - with them independently, and it is type-safe. - -\layout Standard - -For each property, there are a _get_ and a _set_ routine that access the - internal value. - For instanace, for the UID property, the routines are: -\layout LyX-Code - -void icalproperty_set_uid(icalproperty* prop, const char* v) -\layout LyX-Code - -const char* icalproperty_get_uid(icalproperty* prop) -\layout Standard - -For multi-valued properties, like ATTACH, the value type is usually a struct - or union that holds both possible types. - -\layout Standard - -If you want to work with the underlying value object, you can get and set - it with: -\layout LyX-Code - -icalvalue* icalproperty_get_value (icalproperty* prop) -\layout LyX-Code - -void icalproperty_set_value(icalproperty* prop, icalvalue* value); -\layout Standard - -Icalproperty_get_value() will return a reference that you can manipulate - with other icalvalue routines. - Most of the time, you will have to know what the type of the value is. - For instance, if you know that the value is a DATETIME type, you can manipulate - it with: -\layout LyX-Code - -struct icaltimetype icalvalue_get_datetime(icalvalue* value); -\layout LyX-Code - -void icalvalue_set_datetime(icalvalue* value, struct icaltimetype v); -\layout Standard - -When working with an extension property or value (and X-PROPERTY or a property - that has the parameter VALUE=x-name ) the value type is always a string. - To get and set the value, use: -\layout LyX-Code - -void icalproperty_set_x(icalproperty* prop, char* v); -\layout LyX-Code - -char* icalproperty_get_x(icalproperty* prop); -\layout Standard - -All X properties have the type of ICAL_X_PROPERTY, so you will need these - routines to get and set the name of the property: -\layout LyX-Code - -char* icalproperty_get_x_name(icalproperty* prop) -\layout LyX-Code - -void icalproperty_set_x_name(icalproperty* prop, char* name); -\layout Subsubsection - -Checking Component Validity -\layout Standard - -RFC 2446 defines rules for what properties must exist in a component to - be used for transferring scheduling data. - Most of these rules relate to the existence of properties relative to the - METHOD property, which declares what operation a remote receiver should - use to process a component. - For instance, if the METHOD is REQUEST and the component is a VEVENT, the - sender is probably asking the receiver to join in a meeting. - In this case, RFC2446 says that the component must specify a start time - (DTSTART) and list the receiver as an attendee (ATTENDEE). - -\layout Standard - -Libical can check these restrictions with the routine: -\layout LyX-Code - -int icalrestriction_check(icalcomponent* comp); -\layout Standard - -This routine returns 0 if the component does not pass RFC2446 restrictions, - or if the component is malformed. - The component you pass in -\emph on -must -\emph default - be a VCALENDAR, with one or more children, like the examples in RFC2446. - -\layout Standard - -When this routine runs, it will insert new properties into the component - to indicate any errors it finds. - See section 6.5.3, X-LIC-ERROR for more information about these error properties. - -\layout Subsubsection - -Converting Components to Text -\layout Standard - -To create an RFC2445 compliant text representation of an object, use one - of the *_as_ical_string() routines: -\layout LyX-Code - -char* icalcomponent_as_ical_string (icalcomponent* component) -\layout LyX-Code - -char* icalproperty_as_ical_string (icalproperty* property) -\layout LyX-Code - -char* icalparameter_as_ical_string (icalparameter* parameter) -\layout LyX-Code - -char* icalvalue_as_ical_string (icalvalue* value) -\layout Standard - -In most cases, you will only use icalcomponent_as_ical_string (), since - it will cascade and convert all of the parameters, properties and values - that are attached to the root component. -\layout Standard - -Icalproperty_as_ical_string() will terminate each line with the RFC2445 - specified line terminator -\begin_inset Quotes eld -\end_inset - - -\backslash - -\backslash -n -\begin_inset Quotes erd -\end_inset - - However, if you compile with the symbol ICAL_UNIX_NEWLINE undefined, ( - it is defined by default) it will terminate lines with -\begin_inset Quotes eld -\end_inset - - -\backslash - -\backslash -n -\backslash - -\backslash -r -\begin_inset Quotes erd -\end_inset - - -\layout Standard - -Remember that the string returned by these routines is owned by the library, - and will eventually be re-written. - You should copy it if you want to preserve it. - -\layout Subsection - -Time -\layout Subsubsection - -Time structure -\layout Standard - -LIbical defines it's own time structure for storing all dates and times. - It would have been nice to re-use the C library's -\emph on -struct tm, -\emph default -but that structure does not differentiate between dates and times, and between - local time and UTC. - The libical structure is: -\layout LyX-Code - -struct icaltimetype { -\layout LyX-Code - - int year; -\layout LyX-Code - - int month; -\layout LyX-Code - - int day; -\layout LyX-Code - - int hour; -\layout LyX-Code - - int minute; -\layout LyX-Code - - int second; -\layout LyX-Code - - int is_utc; /* 1-> time is in UTC timezone */ -\layout LyX-Code - - int is_date; /* 1 -> interpret this as date. - */ }; -\layout Standard - -The year, month, day, hour, minute and second fields hold the broken-out - time values. - The is_utc field distinguishes between times in UTC and a local time zone. - The is_date field indicates if the time should be interpreted only as a - date. - If it is a date, the hour, minute and second fields are assumed to be zero, - regardless of their actual vaules. - -\layout Subsubsection - -Creating time structures -\layout Standard - -There are several ways to create a new icaltimetype structure: -\layout LyX-Code - -struct icaltimetype icaltime_from_string(const char* str); -\layout LyX-Code - -struct icaltimetype icaltime_from_timet(time_t v, int is_date); -\layout LyX-Code - -\layout Standard - -Icaltime_from_string takes any RFC2445 compliant time string: -\layout LyX-Code - -struct icaltimetype tt = icaltime_from_string("19970101T103000"); -\layout Standard - -Icaltime_from_timet takes a timet value, representing seconds past the POSIX - epoch, and a flag to indicate if the time is a date. - Dates have an identical structure to a time, but the time portion ( hours, - minuts and seconds ) is always 00:00:00. - Dates act differently in sorting an comparision, and they have a different - string representation in RFC2445. - -\layout Subsubsection - -Time manipulating routines -\layout Standard - -The null time value is used to indicate that the data in the structure is - not a valid time. -\layout LyX-Code - -struct icaltimetype icaltime_null_time(void); -\layout LyX-Code - -int icaltime_is_null_time(struct icaltimetype t); -\layout Standard - -It is sensible for the broken-out time fields to contain values that are - not permitted in an ISO compliant time string. - For instance, the seconds field can hold values greater than 59, and the - hours field can hold values larger than 24. - The excessive values will be rolled over into the next larger field when - the structure is normalized. - -\layout LyX-Code - -struct icaltimetype icaltime_normalize(struct icaltimetype t); -\layout Standard - -Normalizing allows you to do arithmetic operations on time values. - -\layout LyX-Code - -struct icaltimetype tt = icaltime_from_string( -\begin_inset Quotes eld -\end_inset - -19970101T103000 -\begin_inset Quotes erd -\end_inset - -); -\layout LyX-Code - -tt.days +=3 -\layout LyX-Code - -tt.second += 70; -\layout LyX-Code - -tt = icaltime_normalize(tt); -\layout Standard - -There are several routines to get the day of the week or month, etc, from - a time structure. -\layout LyX-Code - -short icaltime_day_of_year(struct icaltimetype t); -\layout LyX-Code - -struct icaltimetype icaltime_from_day_of_year(short doy, short year); -\layout LyX-Code - -short icaltime_day_of_week(struct icaltimetype t); -\layout LyX-Code - -short icaltime_start_doy_of_week(struct icaltimetype t); -\layout LyX-Code - -short icaltime_week_number(short day_of_month, short month, short year); -\layout LyX-Code - -struct icaltimetype icaltime_from_week_number(short week_number, short year); -\layout LyX-Code - -short icaltime_days_in_month(short month,short year); -\layout Standard - -Two routines convert time structures to and from the number of seconds since - the POSIX epoch. - The is_date field indicates whether or not the hour, minute and second - fields should be used in the conversion. -\layout LyX-Code - -struct icaltimetype icaltime_from_timet(time_t v, int is_date); -\layout LyX-Code - -time_t icaltime_as_timet(struct icaltimetype); -\layout Standard - -The compare routine works exactly like strcmp, but on time structures. - -\layout LyX-Code - -int icaltime_compare(struct icaltimetype a,struct icaltimetype b); -\layout Standard - -The following routines convert between UTC and a named timezone. - The tzid field must be a timezone name from the Olsen database, such as - -\begin_inset Quotes eld -\end_inset - -America/Los_Angeles. -\begin_inset Quotes erd -\end_inset - - -\layout Standard - -The utc_offset routine returns the offset of the named time zone from UTC, - in seconds. - -\layout Standard - -The tt parameter in the following routines indicates the date on which the - conversion should be made. - The tt parameter is necessary because timezones have many different rules - for when daylight savings time is used, and these rules can change over - time. - So, for a single timezone one year may have daylight savings time on March - 15, but for other years March 15 may be standard time, and some years may - have standard time all year. - -\layout LyX-Code - -int icaltime_utc_offset(struct icaltimetype tt, char* tzid); -\layout LyX-Code - -int icaltime_local_utc_offset(); -\layout LyX-Code - -struct icaltimetype icaltime_as_utc(struct icaltimetype tt,char* tzid); -\layout LyX-Code - -struct icaltimetype icaltime_as_zone(struct icaltimetype tt,char* tzid); -\layout LyX-Code - -struct icaltimetype icaltime_as_local(struct icaltimetype tt); -\layout Subsection - -Storing Objects -\layout Standard - -The libical distribution includes a separate library, libicalss, that allows - you to store iCal component data to disk in a variety of ways. - This library also includes code to implement the CSTP protocol of CAP and - has some routines for deciphering incomming messages. - -\layout Standard - -The file storage routines are organized in an inheritance heirarchy that - is rooted in icalset, with the derived class icalfileset and icaldirset. - Icalfileset stores components to a file, while icaldirset stores components - to multiple files, one per month based on DTSTAMP. - Other storages classess, for storage to a heap or a mysql database are - planned for the future. - -\layout Standard - -All of the icalset derived classes have the same interface: -\layout LyX-Code - -\layout LyX-Code - -icaldirset* icaldirset_new(const char* path); -\layout LyX-Code - -void icaldirset_free(icaldirset* store); -\layout LyX-Code - -const char* icaldirset_path(icaldirset* store); -\layout LyX-Code - -void icaldirset_mark(icaldirset* store); -\layout LyX-Code - -icalerrorenum icaldirset_commit(icaldirset* store); -\layout LyX-Code - -icalerrorenum icaldirset_add_component(icaldirset* store, icalcomponent* - comp); -\layout LyX-Code - -icalerrorenum icaldirset_remove_component(icaldirset* store, icalcomponent* - comp); -\layout LyX-Code - -int icaldirset_count_components(icaldirset* store, icalcomponent_kind kind); -\layout LyX-Code - -icalerrorenum icaldirset_select(icaldirset* store, icalcomponent* gauge); -\layout LyX-Code - -void icaldirset_clear(icaldirset* store); -\layout LyX-Code - -icalcomponent* icaldirset_fetch(icaldirset* store, const char* uid); -\layout LyX-Code - -int icaldirset_has_uid(icaldirset* store, const char* uid); -\layout LyX-Code - -icalcomponent* icaldirset_fetch_match(icaldirset* set, icalcomponent *c); -\layout LyX-Code - -icalerrorenum icaldirset_modify(icaldirset* store, icalcomponent *oldc, - icalcomponent *newc); -\layout LyX-Code - -icalcomponent* icaldirset_get_current_component(icaldirset* store); -\layout LyX-Code - -icalcomponent* icaldirset_get_first_component(icaldirset* store); -\layout LyX-Code - -icalcomponent* icaldirset_get_next_component(icaldirset* store); -\layout Subsubsection - -Creating a new set -\layout Standard - -You can create a new set from either the base class or the direved class. - From the base class use one of: -\layout LyX-Code - -icalset* icalset_new_file(const char* path); -\layout LyX-Code - -icalset* icalset_new_dir(const char* path); -\layout LyX-Code - -icalset* icalset_new_heap(void); -\layout LyX-Code - -icalset* icalset_new_mysql(const char* path); -\layout Standard - -You can also create a new set based on the derived class, For instance, - with icalfileset: -\layout LyX-Code - -icalfileset* icalfileset_new(const char* path); -\layout LyX-Code - -icalfileset* icalfileset_new_open(const char* path, int flags, mode_t mode); -\layout Standard - -Icaset_new_file is identical to icalfileset_new. - BOth routines will open an existing file for readinga and writing, or create - a new file if it does not exist. - Icalfilset_new_open takes the same arguments as the open() system routine - and behaves in the same way. - -\layout Standard - -The icalset and icalfilset objects are somewhat interchangable -- you can - use an icalfileset* as an argument to any of the icalset routines. -\layout Standard - -The following examples will all use icalfileset routines; using the other - icalset derived classess will be similar. - -\layout Subsubsection - -Adding, Finding and Removing Components -\layout Standard - -To add components to a set, use: -\layout LyX-Code - -icalerrorenum icalfileset_add_component(icalfileset* cluster, icalcomponent* - child); -\layout Standard - -The fileset keeps an inmemory copy of the components, and this set must - be written back to the file ocassionally. - There are two routines to manage this: -\layout LyX-Code - -void icalfileset_mark(icalfileset* cluster); -\layout LyX-Code - -icalerrorenum icalfileset_commit(icalfileset* cluster); -\layout Standard - -Icalfileset_mark indicates that the in-memory components have changed. - Calling the _add_component routine will call _mark automatically, but you - may need to call it yourself if you have made a change to an existing component. - The _commit routine writes the data base to disk, but only if it is marked. - The _commit routine is called automatically when the icalfileset is freed. - -\layout Standard - -To iterate through the components in a set, use: -\layout LyX-Code - -icalcomponent* icalfileset_get_first_component(icalfileset* cluster); -\layout LyX-Code - -icalcomponent* icalfileset_get_next_component(icalfileset* cluster); -\layout LyX-Code - -icalcomponent* icalfileset_get_current_component (icalfileset* cluster); - -\layout Standard - -These routines work like the corresponding routines from icalcomponent, - except that their output is filtered through a gauge. - A gauge is a test for the properties within a components; only components - that pass the test are returned. - A gauge can be constructed from a MINSQL string with: -\layout LyX-Code - -icalgauge* icalgauge_new_from_sql(char* sql); -\layout Standard - -Then, you can add the gauge to the set with : -\layout LyX-Code - -icalerrorenum icalfileset_select(icalfileset* store, icalgauge* gauge); -\layout Standard - -Here is an example that puts all of these routines together: -\layout LyX-Code - - -\latex no_latex -void test_fileset() -\layout LyX-Code - - -\latex no_latex -{ -\layout LyX-Code - - -\latex no_latex - icalfileset *fs; -\layout LyX-Code - - -\latex no_latex - icalcomponent *c; -\layout LyX-Code - - -\latex no_latex - int i; -\layout LyX-Code - - -\latex no_latex - char *path = "test_fileset.ics"; -\layout LyX-Code - - -\latex no_latex - icalgauge *g = icalgauge_new_from_sql( -\layout LyX-Code - - -\latex no_latex - "SELECT * FROM VEVENT WHERE DTSTART > '20000103T120000Z' AND DTSTART - <= '20000106T120000Z'"); -\layout LyX-Code - - -\latex no_latex - -\layout LyX-Code - - -\latex no_latex -fs = icalfileset_new(path); -\layout LyX-Code - - -\layout LyX-Code - - -\latex no_latex -for (i = 0; i!= 10; i++){ -\layout LyX-Code - - -\latex no_latex - c = make_component(i); -\latex default - /* Make a new component where DTSTART has month of i */ -\layout LyX-Code - - -\latex no_latex - icalfileset_add_component(fs,c); -\layout LyX-Code - - -\latex no_latex - } -\layout LyX-Code - -\layout LyX-Code - - -\latex no_latex - icalfileset_commit(fs); -\latex default - /* Write to disk */ -\layout LyX-Code - -\layout LyX-Code - - -\latex no_latex - icalfileset_select(fs,g); -\latex default - /* Set the gauge to filter components */ -\layout LyX-Code - - -\latex no_latex - -\layout LyX-Code - - -\latex no_latex - for (c = icalfileset_get_first_component(fs); -\layout LyX-Code - - -\latex no_latex - c != 0; -\layout LyX-Code - - -\latex no_latex - c = icalfileset_get_next_component(fs)){ -\layout LyX-Code - - -\latex no_latex - struct icaltimetype t = icalcomponent_get_dtstart(c); -\layout LyX-Code - - -\latex no_latex - -\layout LyX-Code - - -\latex no_latex - printf("%s -\backslash -n",icaltime_as_ctime(t)); -\layout LyX-Code - - -\latex no_latex - } -\layout LyX-Code - - -\latex no_latex -icalfileset_free(fs); -\layout LyX-Code - - -\latex no_latex -} -\layout Subsubsection - -Other routines -\layout Standard - -There are several other routines in the icalset interface, but they not - fully implemented yet. - -\layout Subsection - - -\begin_inset LatexCommand \label{sec:memory} - -\end_inset - -Memory Management -\layout Standard - -Libical relies heavily on dynamic allocation for both the core objects and - for the strings used to hold values. - Some of this memory the library caller owns and must free, and some of - the memory is managed by the library. - Here is a summary of the memory rules. - -\layout Description - -1) If the function name has "new" in it, the caller gets control of the - memory. - ( such as icalcomponent_new(), or icalproperty_new_clone() ) -\layout Description - -2) If you got the memory from a routine with new in it, you must call the - corresponding *_free routine to free the memory. - ( Use icalcomponent_free() to free objects created with icalcomponent_new()) - -\layout Description - -3) If the function name has "add" in it, the caller is transferring control - of the memory to the routine. - ( icalproperty_add_parameter() ) -\layout Description - -4) If the function name has "remove" in it, the caller passes in a pointer - to an object and after the call returns, the caller owns the object. - So, before you call icalcomponent_remove_property(comp,foo), you do not - own "foo" and after the call returns, you do. - -\layout Description - -5) If the routine returns a string, libical owns the memory and will put - it on a ring buffer to reclaim later. - For example, icalcomponent_as_ical_string(). - You'd better strdup() it if you want to keep it, and you don't have to - delete it. - -\layout Subsection - -Error Handling -\layout Standard - -Libical has several error handling mechanisms for the various types of programmi -ng, semantic and syntactic errors you may encounter. -\layout Subsubsection - -Return values -\layout Standard - -Many library routines signal errors through their return values. - All routines that return a pointer, such as icalcomponent_new(), will return - 0 ( zero ) on a fatal error. - Some routines will return a value of enum icalerrorenum. - -\layout Subsubsection - -icalerrno -\layout Standard - -Most routines will set the global error value icalerrno on errors. - This variable is an enumeration; permissible values can be found in libical/ica -lerror.h. - If the routine returns an enum icalerrorenum, then the return value will - be the same as icalerrno. - You can use icalerror_strerror() to get a string that describes the error. - The enumerations are: -\layout Standard -\added_space_top 0.3cm \added_space_bottom 0.3cm \align center \LyXTable -multicol5 -12 2 0 0 -1 -1 -1 -1 -1 1 0 0 -1 0 0 0 -1 0 0 0 -1 0 0 0 -1 0 0 0 -1 0 0 0 -1 0 0 0 -1 0 0 0 -1 0 0 0 -1 0 0 0 -1 0 0 0 -1 1 0 0 -2 1 0 "" "" -2 1 1 "" "" -0 8 1 0 0 0 0 "" "" -0 8 1 0 0 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 0 0 0 "" "" - - -\newline - -\newline -ICAL_BADARG_ERROR -\newline -One of the argument to a routine was bad. - Typically for a null pointer. -\newline -ICAL_NEWFAILED_ERROR -\newline -A new() or malloc() failed -\newline -ICAL_MALFORMEDDATA_ERROR -\newline -An input string was not in the correct format -\newline -ICAL_PARSE_ERROR -\newline -the parser failed to parse an incomming component -\newline -ICAL_INTERNAL_ERROR -\newline -Largely equivalent to an assert; it indicates a bug in the libical code -\newline -ICAL_FILE_ERROR -\newline -A file operation failed. - Check errno for more detai -\newline -ICAL_ALLOCATION_ERROR -\newline - -\newline -ICAL_NO_ERROR -\newline -No error has occured -\newline -ICAL_TIMEDOUT_ERROR -\newline -Failed to acquire a lock on a file, or the CSTP protocol timed out. - -\newline -ICAL_MULTIPLEINCLUSION_ERROR -\newline - -\newline -ICAL_UNKNOWN_ERROR -\newline - -\layout Subsubsection - -X-LIC-ERROR and X-LIC-INVALID-COMPONENT -\layout Standard - -The library handles semantic and syntactic errors in components by inserting - errors properties into the components. - If the parser cannot parse incoming text ( a syntactic error ) or if the - icalrestriction_check() routine indicates that the component does not meet - the requirements of RFC2446 ( a semantic error) the library will insert - properties of the type X-LIC-ERROR to describe the error. - Here is an example of the error property: -\layout LyX-Code - -X-LIC-ERROR;X-LIC-ERRORTYPE=INVALID_ITIP :Failed iTIP restrictions for property - DTSTART. - -\layout LyX-Code - -Expected 1 instances of the property and got 0 -\layout Standard - -This error resulted from a call to icalrestriction_check(), which discovered - that the component does not have a DTSTART property, as required by RFC2445. - -\layout Standard - -There are a few routines to manipulate error properties: -\layout Standard -\LyXTable -multicol5 -10 2 0 0 -1 -1 -1 -1 -1 1 0 0 -0 0 0 0 -0 1 1 0 -0 0 0 0 -0 1 1 0 -0 1 0 0 -0 1 1 0 -0 1 0 0 -0 1 1 0 -0 1 1 0 -2 1 1 "" "" -2 1 1 "3in" "" -0 2 1 1 0 0 0 "" "" -0 8 1 0 0 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 1 0 1 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 0 0 1 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 1 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 1 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 1 1 0 1 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 1 1 0 1 "" "" -0 2 1 0 0 0 0 "" "" -0 2 1 1 0 0 1 "" "" - -Routine -\newline -Purpose -\newline -void icalrestriction_check() -\newline -Check a component against RFC2446 and insert -\newline - -\newline -error properties to indicate non compliance -\newline -int icalcomponent_count_errors() -\newline -Return the number of error properties -\newline - -\newline -in a component -\newline -void icalcomponent_strip_errors() -\newline -Remove all error properties in as -\newline - -\newline -component -\newline -void icalcomponent_convert_errors() -\newline -Convert some error properties into -\newline - -\newline -REQUESTS-STATUS proprties to indicate the inability to -\newline - -\newline -process the component as an iTIP request. - -\layout Standard - -The types of errors are listed in icalerror.h. - They are: -\layout LyX-Code - -ICAL_XLICERRORTYPE_COMPONENTPARSEERROR -\layout LyX-Code - -ICAL_XLICERRORTYPE_PARAMETERVALUEPARSEERROR -\layout LyX-Code - -ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR -\layout LyX-Code - -ICAL_XLICERRORTYPE_PROPERTYPARSEERROR -\layout LyX-Code - -ICAL_XLICERRORTYPE_VALUEPARSEERROR -\layout LyX-Code - -ICAL_XLICERRORTYPE_UNKVCALPROP -\layout LyX-Code - -ICAL_XLICERRORTYPE_INVALIDITIP -\layout Standard - -The libical parser will generate the error that end in PARSEERROR when it - encounters garbage in the input steam. - ICAL_XLICERRORTYPE_INVALIDITIP is inserted by icalrestriction_check(), - and ICAL_XLICERRORTYPE_UNKVCALPROP is generated by icalvcal_convert() when - it encounters a vCal property that it cannot convert or does not know about. - -\layout Standard - -Icalcomponent_convert_errors() converts some of the error properties in - a component into REQUEST-STATUS properties that indicate a failure. - As of libical version0.18, this routine only convert *PARSEERROR errors - and it always generates a 3.x ( failure ) code. - This makes it more of a good idea than a really useful bit of code. - -\layout Subsubsection - -ICAL_ERRORS_ARE_FATAL and icalerror_errors_are_fatal -\layout Standard - -If the global variable icalerror_errors_are_fatal is set to 1, then any - error condition will cause the program to abort. - The abort occurs in icalerror_set_errno(), and is done with an assert(0) - if NDEBUG is undefined, and with icalerror_crash_here if NDEBUG is defined. - The default value of icalerror_errors_are_fatal is 1 when ICAL_ERRORS_ARE_FATAL - is defined, and 0 otherwise. - Since ICAL_ERRORS_ARE_FATAL is defined by default, icalerror_errors_are_fatal - is also defined by default. - -\layout Subsection - -Naming Standard -\layout Standard - -Structures that you access with the -\begin_inset Quotes eld -\end_inset - -struct -\begin_inset Quotes erd -\end_inset - - keyword, such as -\begin_inset Quotes eld -\end_inset - -struct icaltimetype -\begin_inset Quotes erd -\end_inset - - are things that you are allowed to see inside and poke at. - -\layout Standard - -Structures that you access though a typedef, such as -\begin_inset Quotes eld -\end_inset - -icalcomponent -\begin_inset Quotes erd -\end_inset - - are things where all of the data is hidden. - -\layout Standard - -Component names that start with -\begin_inset Quotes eld -\end_inset - -V -\begin_inset Quotes erd -\end_inset - - are part of RFC 2445 or another iCal standard. - Component names that start with -\begin_inset Quotes eld -\end_inset - -X -\begin_inset Quotes erd -\end_inset - - are also part of the spec, but they are not actually components in the - spec. - However, they look and act like components, so they are components in libical. - Names that start with -\begin_inset Quotes eld -\end_inset - -XLIC -\begin_inset Quotes erd -\end_inset - - or -\begin_inset Quotes eld -\end_inset - -X-LIC -\begin_inset Quotes erd -\end_inset - - are not part of any iCal spec. - They are used internally by libical. - -\layout Standard - -Enums that identify a component, property, value or parameter end with -\begin_inset Quotes eld -\end_inset - -_COMPONENT, -\begin_inset Quotes erd -\end_inset - - -\begin_inset Quotes eld -\end_inset - -_PROPERTY, -\begin_inset Quotes erd -\end_inset - - -\begin_inset Quotes eld -\end_inset - -_VALUE, -\begin_inset Quotes erd -\end_inset - - or -\begin_inset Quotes eld -\end_inset - -_PARAMETER -\begin_inset Quotes erd -\end_inset - -s -\layout Standard - -Enums that identify a parameter value have the name of the parameter as - the second word. - For instance: ICAL_ROLE_REQPARTICIPANT or ICAL_PARTSTAT_ACCEPTED. -\layout Standard - -The enums for the parts of a recurarance rule and request statuses are irregular. - -\layout Section - -Hacks and Bugs -\layout Standard - -There are a lot of hacks in the library -- bits of code that I am not proud - of and should probably be changed. - These are marked with the comment string -\begin_inset Quotes eld -\end_inset - -HACK. -\begin_inset Quotes erd -\end_inset - - -\the_end diff --git a/libical/doc/UsingLibical.ps b/libical/doc/UsingLibical.ps deleted file mode 100644 index 6223144e3a..0000000000 --- a/libical/doc/UsingLibical.ps +++ /dev/null @@ -1,2327 +0,0 @@ -%!PS-Adobe-2.0 -%%Creator: dvips(k) 5.86 Copyright 1999 Radical Eye Software -%%Title: UsingLibical.dvi -%%Pages: 22 -%%PageOrder: Ascend -%%BoundingBox: 0 0 612 792 -%%EndComments -%DVIPSWebPage: (www.radicaleye.com) -%DVIPSCommandLine: dvips -t letter -o -%+ /usr/local/home/eric/proj/FreeAssociation/libical/doc/UsingLibical.ps -%+ UsingLibical.dvi -%DVIPSParameters: dpi=600, compressed -%DVIPSSource: TeX output 2001.01.09:0928 -%%BeginProcSet: texc.pro -%! -/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S -N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 -mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 -0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ -landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize -mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ -matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round -exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ -statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] -N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin -/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array -/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 -array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N -df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A -definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get -}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} -B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr -1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3 -1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx -0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx -sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{ -rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp -gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B -/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{ -/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{ -A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy -get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse} -ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp -fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17 -{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add -chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{ -1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop} -forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn -/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put -}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ -bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A -mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ -SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ -userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X -1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 -index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N -/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ -/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) -(LaserWriter 16/600)]{A length product length le{A length product exch 0 -exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse -end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask -grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} -imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round -exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto -fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p -delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} -B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ -p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S -rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end - -%%EndProcSet -TeXDict begin 40258431 52099146 1000 600 600 (UsingLibical.dvi) -@start -%DVIPSBitmapFont: Fa ecti1000 10 7 -/Fa 7 118 df<EA03C0EA07F0120F121F13F8A313F0EA07B0EA003013701360A213E013 -C01201EA038013005A120E5A5A5A5A5A0D197A8819>44 D<147F903803FFC090380FC1E0 -90381F0070017E13784913383901F801F83803F003120713E0120FD81FC013F091C7FC48 -5AA2127F90C8FCA35A5AA45AA3153015381578007C14F0007EEB01E0003EEB03C0EC0F80 -6CEB3E00380F81F83803FFE0C690C7FC1D2677A426>99 D<D801E001FEEB07F03C07F803 -FF801FFC3C0E3C0F07C0783E3C1E3E3C03E1E01F261C1F78D9F3C013803C383FF001F780 -0F02E01400007801C013FE007018C002805B4A4848EB1F80EAF07FD8E07E5CA200000207 -143F01FE1700495CA2030F5C0001177E495C18FE031F5C120349DA8001131C18F8033F15 -3C00070403133849020013F0A24B1570000F17E049017E15F019E003FEECE1C0001FEE01 -E34949903800FF000007C70038143C3E2679A444>109 D<3903C003F0390FF01FFC391E -783C0F381C7C703A3C3EE03F8038383FC0EB7F800078150000701300151CD8F07E90C7FC -EAE0FE5BA2120012015BA312035BA312075BA3120F5BA3121F5BA3123F90C9FC120E2126 -79A423>114 D<14FE903807FF8090380F83C090383E00E04913F00178137001F813F000 -01130313F0A215E00003EB01C06DC7FC7FEBFFC06C13F814FE6C7F6D13807F010F13C013 -00143F141F140F123E127E00FE1480A348EB1F0012E06C133E00705B6C5B381E03E06CB4 -5AD801FEC7FC1C267AA422>I<EB0380EB07C0130FA4131F1480A3133F1400A35B137E00 -7FB5FCA2B6FC3800FC00A312015BA312035BA312075BA3120F5BA3121FEB801CA2143C00 -3F1338EB0078147014F014E0EB01C0EA3E03381F0780380F0F00EA07FCEA01F0183579B3 -1C>I<13F8D803FEEB01C0D8078FEB03E0390E0F8007121E121C0038140F131F007815C0 -1270013F131F00F0130000E015805BD8007E133FA201FE14005B5D120149137EA215FE12 -0349EBFC0EA20201131E161C15F813E0163CD9F003133814070001ECF07091381EF8F03A -00F83C78E090393FF03FC090390FC00F00272679A42D>I E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fb ecbx1200 12 42 -/Fb 42 122 df<B612F8A91D097F9A25>45 D<EA07C0EA1FF0EA3FF8EA7FFCEAFFFEA7EA -7FFCEA3FF8EA1FF0EA07C00F0F788E1F>I<EC03C01407141F147FEB03FF133FB6FCA413 -C3EA0003B3B3ADB712FCA5264177C038>49 D<ECFFE0010F13FE013F6D7E90B612E00003 -15F82607FC0313FE3A0FE0007FFFD81F806D138048C7000F13C0488001C015E001F07F00 -FF6E13F07F17F881A46C5A6C5A6C5AC9FC17F05DA217E05D17C04B13804B1300A2ED1FFC -4B5A5E4B5A4B5A4A90C7FC4A5A4A5AEC0FF04A5AEC3F804AC7127814FE495A494814F8D9 -07E014F0495A495A49C8FC017C140149140348B7FC4816E05A5A5A5A5AB8FC17C0A42D41 -7BC038>I<ECFFF0010713FF011F14C0017F14F049C66C7ED803F8EB3FFED807E06D7E81 -D80FF86D138013FE001F16C07FA66C5A6C4815806C485BC814005D5E4B5A4B5A4B5A4A5B -020F1380902607FFFEC7FC15F815FF16C090C713F0ED3FFCED0FFEEEFF80816F13C017E0 -A26F13F0A217F8A3EA0FC0EA3FF0487EA2487EA217F0A25D17E06C5A494913C05BD83F80 -491380D81FF0491300D80FFEEBFFFE6CB612F800015D6C6C14C0011F49C7FC010113E02D -427BC038>I<163FA25E5E5D5DA25D5D5D5DA25D92B5FCEC01F7EC03E7140715C7EC0F87 -EC1F07143E147E147C14F8EB01F0EB03E0130714C0EB0F80EB1F00133E5BA25B485A485A -485A120F5B48C7FC123E5A12FCB91280A5C8000F90C7FCAC027FB61280A531417DC038> -I<0007150301E0143F01FFEB07FF91B6FC5E5E5E5E5E16804BC7FC5D15E092C8FC01C0C9 -FCAAEC3FF001C1B5FC01C714C001DF14F09039FFE03FFC9138000FFE01FC6D7E01F06D13 -804915C0497F6C4815E0C8FC6F13F0A317F8A4EA0F80EA3FE0487E12FF7FA317F05B5D6C -4815E05B007EC74813C0123E003F4A1380D81FC0491300D80FF0495AD807FEEBFFFC6CB6 -12F0C65D013F1480010F01FCC7FC010113C02D427BC038>I<4AB47E021F13F0027F13FC -49B6FC01079038807F8090390FFC001FD93FF014C04948137F4948EBFFE048495A5A1400 -485A120FA248486D13C0EE7F80EE1E00003F92C7FCA25B127FA2EC07FC91381FFF8000FF -017F13E091B512F89039F9F01FFC9039FBC007FE9039FF8003FF17804A6C13C05B6F13E0 -A24915F0A317F85BA4127FA5123FA217F07F121FA2000F4A13E0A26C6C15C06D4913806C -018014006C6D485A6C9038E01FFC6DB55A011F5C010714C0010191C7FC9038003FF02D42 -7BC038>I<121E121F13FC90B712FEA45A17FC17F817F017E017C0A2481680007EC8EA3F -00007C157E5E00785D15014B5A00F84A5A484A5A5E151FC848C7FC157E5DA24A5A14035D -14074A5AA2141F5D143FA2147F5D14FFA25BA35B92C8FCA35BA55BAA6D5A6D5A6D5A2F44 -7AC238>I<EE1F80A24C7EA24C7EA34C7EA24B7FA34B7FA24B7FA34B7F169F031F80161F -82033F80ED3E07037E80157C8203FC804B7E02018115F0820203814B137F0207815D173F -020F814B7F021F8292C77EA24A82023E80027E82027FB7FCA291B87EA2498302F0C8FCA2 -0103834A157F0107834A153FA249488284011F8491C97E4984133E017E82B6020FB612F0 -A54C457CC455>65 D<DCFFF01470031F01FF14F04AB6EAE0010207EDF803023FEDFE0791 -B539E001FF0F4949C7EA3F9F010701F0EC0FFF4901C0804990C87E494881494881494816 -7F4849163F4849161F5A4A160F485B19074890CAFC19035A5BA2007F1801A34994C7FC12 -FFAE127F7F1AF0A2123FA27F6C18011AE06C7F19036C6D17C06E16077E6C6DEE0F806C6D -EE1F006D6C5E6D6C167E6D6C6C5D6D6D4A5A6D01F0EC07F0010101FEEC1FE06D903AFFF0 -01FF80023F90B6C7FC020715FC020115F0DA001F1480030001F8C8FC44467AC451>67 -D<BA12F8A485D8001F90C71201EF003F180F180318011800A2197E193EA3191EA21778A2 -85A405F890C7FCA316011603161F92B5FCA5ED001F160316011600A2F101E01778A2F103 -C0A494C7FC1907A21A80A2190FA2191FA2193FF17F0061601807181F4DB5FCBBFC61A443 -447DC34A>69 D<B7D88003B612FEA526003FFEC9EBF800B3A791B9FCA54AC9FCB3AAB7D8 -8003B612FEA54F447CC358>72 D<B712F0A526003FFECAFCB3B1F00780A4180F1900A460 -A360A2187EA218FE170117031707171F177FEE03FFB95AA539447CC343>76 -D<B500FE067FB512806E95B6FCA26F5EA2D8003F50C7FC013D6DEE03DFA2013C6DEE079F -A26E6CEE0F1FA26E6C161EA26E6C163CA36E6C1678A26E6C16F0A26E6DEC01E0A26E6DEC -03C0A36E6DEC0780A26F6CEC0F00A26F6C141EA26F6C5CA36F6C5CA26F6C5CA26F6D485A -A26F6D485AA26F6D485AA3706C48C7FCA293383FF81EA2706C5AA2706C5AA3706C5AA270 -5BA2705BA2705BA2B6057FB6128071C7FCA2173E171C61447CC36A>I<B64BB512FE8181 -A281D8003F6D91C7EA780081013D7F81133C6E7E6E7F6E7F6E7F6E7F82806E7F6E7F6F7E -6F7F83816F7F6F7F6F7F6F7F6F7F8382707F707F707F707F8482707F707F717E71138071 -13C019E0837113F07113F87113FC7113FE19FF847213F884848484A28484197F193F191F -A2190F1907B61603190119001A78A24F447CC358>I<923807FFC092B512FE0207ECFFC0 -021F15F091267FFE0013FC902601FFF0EB1FFF01070180010313C04990C76C7FD91FFC6E -6C7E49486F7E49486F7E01FF8348496F7E48496F1380A248496F13C0A24890C96C13E0A2 -4819F04982003F19F8A3007F19FC49177FA400FF19FEAD007F19FC6D17FFA3003F19F8A2 -6D5E6C19F0A26E5D6C19E0A26C6D4B13C06C19806E5D6C6D4B13006C6D4B5A6D6C4B5A6D -6C4B5A6D6C4A5B6D01C001075B6D01F0011F5B010101FE90B5C7FC6D90B65A023F15F802 -0715C002004AC8FC030713C047467AC454>I<B9FC18F018FE727E19E0D8001F90C7000F -7F05017F716C7E727E727E721380A21AC084A21AE0A91AC0A24E1380A21A00604E5A4E5A -4D485A050F5B92B712C096C7FC18FC18C092CBFCB3A7B712E0A543447DC34D>I<DAFFE0 -131C010701FE133C013F9038FF807C90B6EAE0FC4815F9489038801FFF3907FC00014848 -EB007F4848143F4848140F491407007F15035B1601160012FF177CA27FA26D153C7F7F6D -92C7FC6C7EEBFFE014FE6CEBFFF015FF6C15E016FC6C816C6F7E6C826C826C6C81011F81 -0107811300020F80140003077FED007F82040F1380828212F082A282A27EA218007EA26C -5D6C5E6D14036D5D6D140701F84A5A01FFEC3FF002F8EBFFE0486CB65AD8FC1F92C7FCD8 -F80714FC48C614F0480107138031467AC43E>83 D<003FBA12E0A59026FE000FEB8003D8 -7FE09338003FF049171F90C71607A2007E1803007C1801A300781800A400F819F8481978 -A5C81700B3B3A20107B8FCA545437CC24E>I<B792B6FCA526003FFECAEAFC00806D606F -15016D608119036D606F15076D606F150F6D6081191F6D6D93C7FC61027F163E6F157E02 -3F167C8119FC6E6D5C18016E5E7013036E5E8218076E6D5C180F6E5E70131F6E93C8FC70 -5B037F143E82187E033F147C7013FC6F5C17816F5C17C117C36F5C17E76F5C17FF6F5CA3 -6F91C9FCA2705AA2705AA3705AA2705AA2705AA250457EC355>86 -D<903801FFE0011F13FE017F6D7E48B612E03A03FE007FF84848EB1FFC6D6D7E486C6D7E -A26F7FA36F7F6C5A6C5AEA00F090C7FCA40203B5FC91B6FC1307013F13F19038FFFC0100 -0313E0481380381FFE00485A5B127F5B12FF5BA35DA26D5B6C6C5B4B13F0D83FFE013EEB -FFC03A1FFF80FC7F0007EBFFF86CECE01FC66CEB8007D90FFCC9FC322F7DAD36>97 -D<EB7FC0B5FCA512037EB1ED0FF892B57E02C314E002CF14F89139DFC03FFC9139FF000F -FE02FCEB03FF4A6D13804A15C04A6D13E05CEF7FF0A218F8173FA318FCAC18F8A2177F18 -F0A3EFFFE06E15C06E5B6E491380027C491300496C495A903AFC1FC07FFC496CB512F0D9 -F00314C049C691C7FCC8EA1FF036467DC43E>I<EC3FFC49B512C0010F14F0013F14FC90 -397FF003FE9039FFC001FF0003495A48494813805B120F485AA2485A6F1300007F6E5AED -00784991C7FCA212FFAC6C7EA3123F6DEC03C0A26C6C1407000F16806D140F6C6DEB1F00 -6C6D133E6C01F05B3A007FFC03F86DB55A010F14C0010391C7FC9038003FF82A2F7CAD32 ->I<EE03FEED07FFA5ED001F160FB1EC3FE0903803FFFC010FEBFF8F013F14CF9039FFF8 -07FF48EBC00148903880007F4890C7123F4848141F49140F121F485AA3127F5BA212FFAC -127FA37F123FA26C6C141FA26C6C143F0007157F6C6C91B5FC6CD9C00314FC6C9038F01F -EF6DB5128F011FEBFE0F010713F89026007FC0EBF80036467CC43E>I<EC3FF80103B57E -010F14E0013F8090397FF83FF89039FFC007FC48496C7E48496C7E48486D1380485A001F -ED7FC05B003FED3FE0A2127F5B17F0161F12FFA290B7FCA401F0C9FCA5127FA27FA2123F -17F06C7E16016C6C15E06C6C14036C6DEB07C06C6DEB0F806C01F0EB3F0090397FFE01FE -011FB55A010714F0010114C09026001FFEC7FC2C2F7DAD33>I<EDFF80020F13E0027F13 -F049B512F849EB8FFC90390FFE0FFE90381FFC1F14F8133FEB7FF0A2ED0FFCEBFFE0ED03 -F0ED00C01600ABB612F8A5C601E0C7FCB3B0007FEBFFE0A527467DC522>I<DAFFE0137E -010F9039FE03FF80013FEBFF8F90B812C048D9C07F133F489038001FF84848EB0FFC4848 -903907FE1F80001F9238FF0F00496D90C7FCA2003F82A8001F93C7FCA26D5B000F5D6C6C -495A6C6C495A6C9038C07FF04890B55A1680D8078F49C8FC018013E0000F90CAFCA47F7F -7F90B612C016FC6CEDFF8017E06C826C16FC7E000382000F82D81FF0C77ED83FC0140748 -48020113808248C9FC177FA46D15FF007F17006D5C6C6C4A5A6C6C4A5AD80FFEEC3FF83B -07FFC001FFF0000190B612C06C6C92C7FC010F14F8D9007F90C8FC32427DAC38>I<EB7F -C0B5FCA512037EB1ED07FE92383FFF8092B512E002C114F89139C7F03FFC9138CF801F91 -39DF000FFE14DE14FC4A6D7E5CA25CA35CB3A7B60083B512FEA537457CC43E>I<137C48 -B4FC4813804813C0A24813E0A56C13C0A26C13806C1300EA007C90C7FCAAEB7FC0EA7FFF -A512037EB3AFB6FCA518467CC520>I<EC03E0EC0FF8EC1FFCEC3FFEA2EC7FFFA5EC3FFE -A2EC1FFCEC0FF8EC03E091C7FCAAEC01FF0103B5FCA5EB000F80B3B3A7EA1F80EA3FC0EA -7FE0EAFFF0EC0FFEA215FC141F01E013F8007FEB3FF0393FC0FFE06CB512806C14000003 -13FCC613C0205A86C522>I<EB7FC0B5FCA512037EB3B3B3A3B61280A519457CC420>108 -D<90277F8007FEEC0FFCB590263FFFC090387FFF8092B5D8F001B512E002816E4880913D -87F01FFC0FE03FF8913D8FC00FFE1F801FFC0003D99F009026FF3E007F6C019E6D013C13 -0F02BC5D02F86D496D7EA24A5D4A5DA34A5DB3A7B60081B60003B512FEA5572D7CAC5E> -I<90397F8007FEB590383FFF8092B512E0028114F8913987F03FFC91388F801F00039039 -9F000FFE6C139E14BC02F86D7E5CA25CA35CB3A7B60083B512FEA5372D7CAC3E>I<EC1F -FC49B512C0010714F0011F14FC90397FF80FFF9026FFC0017F48496C7F4848C7EA3FE000 -078248486E7E49140F001F82A2003F82491407007F82A400FF1780AA007F1700A46C6C4A -5AA2001F5E6D141F000F5E6C6C4A5AA26C6C6CEBFFE06C6D485B27007FF80F90C7FC6DB5 -5A010F14F8010114C09026001FFCC8FC312F7DAD38>I<90397FC00FF8B590B57E02C314 -E002CF14F89139DFC03FFC9139FF001FFE000301FCEB07FF6C496D13804A15C04A6D13E0 -5C7013F0A2EF7FF8A4EF3FFCACEF7FF8A318F017FFA24C13E06E15C06E5B6E4913806E49 -13006E495A9139DFC07FFC02CFB512F002C314C002C091C7FCED1FF092C9FCADB67EA536 -407DAC3E>I<90387F807FB53881FFE0028313F0028F13F8ED8FFC91389F1FFE000313BE -6C13BC14F8A214F0ED0FFC9138E007F8ED01E092C7FCA35CB3A5B612E0A5272D7DAC2E> -114 D<90391FFC038090B51287000314FF120F381FF003383FC00049133F48C7121F127E -00FE140FA215077EA27F01E090C7FC13FE387FFFF014FF6C14C015F06C14FC6C80000380 -6C15806C7E010F14C0EB003F020313E0140000F0143FA26C141F150FA27EA26C15C06C14 -1FA26DEB3F8001E0EB7F009038F803FE90B55A00FC5CD8F03F13E026E007FEC7FC232F7C -AD2C>I<EB01E0A51303A41307A2130FA2131FA2133F137F13FF1203000F90B51280B7FC -A4C601E0C7FCB3A3ED01E0A9150302F013C0137F150790393FF80F8090391FFC1F006DB5 -FC6D13FC01015B9038003FE023407EBE2C>I<D97FC049B4FCB50103B5FCA50003EC000F -6C81B3A85EA25EA25E7E6E491380017FD901F713FE9138F807E76DB512C7010F14070103 -13FE9026007FF0EBFC00372E7CAC3E>I<B500FE90383FFFF0A5C601F0903803E0006D6C -495A6D6C495A011F4AC7FC6E5B6D6C137E6DEB807C6D6D5A6DEBC1F0EDE3E06DEBF7C06E -B45A806E90C8FC5D6E7E6E7F6E7FA24A7F4A7F8291381F3FFCEC3E1F027C7F4A6C7E4948 -6C7F01036D7F49487E02C08049486C7F49C76C7E013E6E7E017E141FB500E090B512FCA5 -362C7EAB3B>120 D<B6903803FFFCA5000101E09038003E006C163C80017F5D8017F801 -3F5D6E1301011F5D6E1303010F5D6E13076D5DED800F6D92C7FC15C05E6DEBE01E163E6D -143CEDF07C027F1378EDF8F8023F5B15FD021F5B15FF6E5BA36E5BA26E90C8FCA26E5AA2 -6E5AA21578A215F85D14015D001F1303D83F805B387FC007D8FFE05B140F92C9FC5C143E -495A387FC1F8EB07F06CB45A6C5B000790CAFCEA01FC36407EAB3B>I -E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fc ectt1000 10 78 -/Fc 78 123 df<121FEA3F80EA7FC0EAFFE0B0EA7FC0AEEA1F00C7FCA7121FEA3F80EA7F -C0EAFFE0A5EA7FC0EA3F80EA1F000B3470B32C>33 D<003C131E007F137F481480A66C14 -00A6007E7FA6003E133EA3003C131E001C131C191977B32C>I<EA0F80EA1FE0EA3FF012 -7F13F8A213FCA2123F121F120FEA007CA313FC13F8A2120113F01203EA07E0A2EA0FC0EA -3F80127FEAFF005A12F812700E1D71B22C>39 D<143814FC13011303EB07F8EB0FF0EB1F -C0EB3F80EB7F0013FE485A485A5B12075B120F5B485AA2123F90C7FCA25A127EA312FE5A -AC7E127EA3127F7EA27F121FA26C7E7F12077F12037F6C7E6C7E137FEB3F80EB1FC0EB0F -F0EB07F8EB03FC130113001438164272B92C>I<127012FC7E7E6C7E6C7EEA0FE06C7E6C -7E6C7E6C7E137F7F1480131F14C0130FEB07E0A214F01303A214F81301A314FC1300AC13 -0114F8A3130314F0A2130714E0A2EB0FC0131F1480133F14005B13FE485A485A485A485A -EA3FC0485A48C7FC5A5A1270164279B92C>I<EB0380497EA60020140800F8143E00FE14 -FE00FF13C1EBC7C7EBE7CF003FB512F8000F14E0000314806C140038007FFCA248B5FC48 -1480000F14E0003F14F839FFE7CFFEEBC7C7EB07C100FE13C000F8143E00201408000014 -00A66D5A1F247AAA2C>I<147014F8AF003FB612E0B712F8A4C700F8C7FCB0147025267D -AB2C>I<EA0F80EA1FE0EA3FF0EA7FF8A213FCA3123F121F120F120013F8A21201EA03F0 -1207EA1FE0EA7FC0EAFF80130012FC12700E17718A2C>I<007FB512F0B612F8A36C14F0 -1D0579942C>I<121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F000B0B708A2C>I<1507 -ED0F80A2151F16005D153E157E157CA215FC5D14015D14035D14075D140F5D141F92C7FC -5C143EA2147E147C14FC5C13015C13035C13075C130F5C131F91C8FC5B133EA2137E137C -13FC5B12015B12035B12075B120F5B121F90C9FCA25A123E127E127C12FC5AA212702141 -7BB92C>I<EB03F8EB0FFE90383FFF80497F90B57E3901FE0FF03903F803F848486C7EEB -E0004848137EA248487FA248C7EA1F80A2003E140F007E15C0A3007C140700FC15E0AC6C -140F007E15C0A46CEC1F80A36C6CEB3F00A26C6C137E6D13FE00075CEBF0016C6C485A39 -01FE0FF06CB55A6D5B6D5BD90FFEC7FCEB03F823357CB32C>I<1307497EA2131FA2133F -137F13FF5A1207127FB5FC13DF139FEA7C1F1200B3AE007FB512E0B612F0A36C14E01C34 -77B32C>I<EB0FF890387FFF8048B512E00007804814FC391FF80FFE393FE001FF903880 -007F48C7EA3F80007E141F00FE15C0150F6C15E01507A3127E123CC8FCA2150F16C0151F -1680153F16005D15FE4A5A14034A5A4A5A4A5A4A5AECFF804948C7FC495A495A495AEB3F -E0EB7F8049C8FC485A4848EB03C04848EB07E0EA1FE0485A48B6FCB7FCA36C15C023347C -B32C>I<EB0FFC90387FFF8048B512E0000714F84880391FF807FEEBC0004848137F6D7F -1680151FA26C5A6CC7FCC8FC153F16005D15FE14014A5AEC1FF890381FFFF0495BA215F8 -6D7F90380007FEEC00FF81ED3F80ED1FC0150FA216E01507A2123C127EB4FC150F16C0A2 -48141F007FEC3F806DEB7F006C6C5B391FF807FE6CB55A6C5C6C14E0C66C1380D90FFCC7 -FC23357CB32C>I<EC07F04A7E141F143FA2147EA214FCEB01F8A2EB03F0EB07E0A2EB0F -C0EB1F80A2EB3F00137EA25B485AA2485A5B1207485AA2485A48C7FCA2127E5AB712FC16 -FEA36C15FCC8EAF800AA91387FFFF091B512F8A36E13F027347EB32C>I<000FB512FE48 -80A35D0180C8FCADEB83FE90389FFF8090B512E015F8819038FE03FE9038F000FF01C07F -49EB3F8090C7121F6C15C0C8120FA2ED07E0A4123C127EB4FC150F16C0A248141F007EEC -3F80007FEC7F006C6C5B6D485A391FF80FFC6CB55A6C5C000114C06C6C90C7FCEB0FF823 -347CB22C>I<EC3FC0903801FFF801077F011F7F497F90387FE07F9039FF003F80484813 -7FEA03F8485A5B000FEC3F004848131E4990C7FC123F90C9FCA25A127EEB03FE90381FFF -80D8FC7F13E000FDB57EB67E9038FE07FC9038F001FE9038C0007F49EB3F8090C7121F16 -C048140F16E01507A3127EA47E150F6D14C0001F141F6D1480000F143F6DEB7F003907F8 -01FE3903FE07FC6CB55A6C5C6D5B011F1380D907FCC7FC23357CB32C>I<1278B712C016 -E0A316C000FCC7EA3F80ED7F0015FE00785CC712014A5A4A5A5D140F5D4A5A143F92C7FC -5C147E14FE5C13015CA2495AA213075CA3495AA4495AA5133F91C8FCAA131E23357CB32C ->I<EB07FC90383FFF8090B512E0000314F84880390FFC07FE391FF001FF9038C0007F48 -48EB3F8090C7121F4815C0007E140FA56CEC1F80A26C6CEB3F006D5B390FF001FE3903FC -07F86CB55A6C6C13C0D907FCC7FC90387FFFC048B512F03903FC07F8390FF001FE391FC0 -007F497F48C7EA1F80007EEC0FC0A248EC07E0A7007EEC0FC0A2007F141F6C6CEB3F806C -6CEB7F009038F001FF390FFC07FE6CB55A6C5CC614E0013F1380D907FCC7FC23357CB32C ->I<EB07FCEB3FFF90B512C0488048803907FC07F8390FF001FC48486C7ED83F80137E15 -7F48C77E007EEC1F8012FE5AED0FC0A416E0A37E127E007F141F7E6D133F6C6C137F390F -F001FF3807FC0F6CB6FC6C14F76C14C7013F130FD90FF813C090C7FCA2151F1680153F16 -00000F5C486C137E486C13FE4A5A4A5A14079038801FF0391FE07FE090B55A6C91C7FC6C -5B000113F838007FC023357CB32C>I<121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F -00C7FCAE121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F000B2470A32C>I<EA0F80EA -1FC0EA3FE0EA7FF0A5EA3FE0EA1FC0EA0F80C7FCAEEA0F80EA1FE0EA3FF0EA7FF8A213FC -A3123F121F120F120013F8A21201EA03F01207EA1FE0EA7FC0EAFF80130012FC12700E30 -71A32C>I<007FB612F0B712F8A36C15F0CAFCA8007FB612F0B712F8A36C15F025127DA1 -2C>61 D<EC7F80903803FFE0010F7F013F7F497F9038FFC0FE3901FE007FD803F87F4848 -EB1F809038E00FCF390FC03FFF48484813C091B5FCEA3F01393E03F87F903907F03FE000 -7EEBE01F397C0FC00FEC8007A2EAFC1F00F8EB0003A900FCEB8007D87C0F14C0A2ECC00F -3A7E07E01F80003EEBF03F903903F87F00393F01FFFED81F805B6E5A6C6C6C5A3907E00F -C09039F00007C06C6CEB0FE0D801FE131F3900FFC0FF6DB512C06D1480010FEBFE000103 -13F89038007FC023337CB22C>64 D<14FE497EA4497FA214EFA2130781A214C7A2010F7F -A314C390381F83F0A590383F01F8A490387E00FCA549137E90B512FEA34880A29038F800 -3FA34848EB1F80A4000715C049130FD87FFEEBFFFC6D5AB514FE6C15FC497E27347EB32C ->I<007FB512E015F8B612FE6C8016C03903F0003FED0FE0ED07F01503A2ED01F8A6ED03 -F0A21507ED0FE0ED1FC0EDFF8090B612005D5D15FF16C09039F0001FE0ED07F0ED03F815 -01ED00FCA216FE167EA616FE16FC1501ED03F8150FED3FF0007FB612E016C0B712806CEC -FE0015F027337FB22C>I<02FF13700107EBE0F84913F9013F13FD4913FFEBFF813901FE -007F4848131FD807F0130F1507485A491303485A150148C7FCA25A007EEC00F01600A212 -FE5AAB7E127EA3007F15F06CEC01F8A26C7EA26C6C13036D14F06C6C130716E0D803FC13 -1F6C6CEB3FC03A00FF81FF806DB512006D5B010F5B6D13F00100138025357DB32C>I<00 -7FB5FCB612C015F0816C803907E003FEEC00FFED7F80153FED1FC0ED0FE0A2150716F015 -0316F81501A4ED00FCACED01F8A3150316F0A2150716E0150FED1FC0153FED7F80EDFF00 -EC03FE007FB55AB65A5D15C06C91C7FC26337EB22C>I<007FB612F0B712F8A37E3903F0 -0001A7ED00F01600A4EC01E04A7EA490B5FCA5EBF003A46E5A91C8FCA5163C167EA8007F -B612FEB7FCA36C15FC27337EB22C>I<007FB612F8B712FCA37ED803F0C7FCA716781600 -A515F04A7EA490B5FCA5EBF001A46E5A92C7FCAD387FFFE0B5FC805C7E26337EB22C>I< -903901FC038090390FFF87C04913EF017F13FF90B6FC4813073803FC01497E4848137F48 -48133F49131F121F5B003F140F90C7FCA2127EED078092C7FCA212FE5AA8913803FFF84A -13FCA27E007E6D13F89138000FC0A36C141FA27F121F6D133F120F6D137F6C7E6C6C13FF -6D5A3801FF076C90B5FC6D13EF011F13CF6DEB0780D901FCC7FC26357DB32C>I<D87FFE -EBFFFCB54813FEA36C486C13FCD807E0EB0FC0B190B6FCA59038E0000FB3D87FFEEBFFFC -B54813FEA36C486C13FC27337EB22C>I<007FB512F8B612FCA36C14F839000FC000B3B3 -A5007FB512F8B612FCA36C14F81E3379B22C>I<0107B512804914C0A36D148090390003 -F000B3AF1218127EA2B4FCA24A5A48130F007F131F9038C07FC06CB55A6C91C7FC6C5B00 -0313F838007FC022347BB22C>I<D87FFCEB7FF8486CEBFFFCA36C48EB7FF8D807C0EB1F -80153FED7F00157E5D4A5A14034A5A5D4A5A4A5A143F4AC7FC147E5CEBC1F813C3EBC7FC -A2EBCFFEEBDFBEEBFFBF141F01FE7F496C7E13F86E7EEBF00301E07FEBC001816E7EA215 -7E153E153F811680ED0FC0A2ED07E0D87FFCEB1FFC486CEB3FFEA36C48EB1FFC27337EB2 -2C>I<387FFFE0B57EA36C5BD803F0C8FCB3AE16F0ED01F8A8007FB6FCB7FCA36C15F025 -337DB22C>I<D87FE0EB0FFC486CEB1FFEA26D133F007F15FC000F15E001BC137BA4019E -13F3A3EB9F01A2018F13E3A21483A2018713C314C7A201831383A214EFA201811303A214 -FFEB80FEA3147C14381400ACD87FF0EB1FFC486CEB3FFEA36C48EB1FFC27337EB22C>I< -D87FF0EB7FFC486CEBFFFEA27F007FEC7FFCD807FEEB07C013DEA213DF13CFA2148013C7 -14C0A213C314E0A213C114F0A213C014F8A2147CA3143EA2141E141FA2140F1587A21407 -15C7A2140315E71401A215F71400A215FFD87FFC137F487E153FA26C48EB1F8027337EB2 -2C>I<EB7FFF0003B512E0000F14F848804880EBE003EB800048C7127FA2007E80A300FE -158048141FB3A86C143FA2007E1500A3007F5CA26C6C13FEEBF00790B5FC6C5C6C5C0003 -14E0C66C90C7FC21357BB32C>I<007FB512C0B612F88115FF6C15802603F00013C0153F -ED0FE0ED07F0A2150316F81501A6150316F01507A2ED0FE0ED3FC015FF90B61280160015 -FC5D15C001F0C8FCB0387FFF80B57EA36C5B25337EB22C>I<EB7FFF0003B512E0000F14 -F848804880EBF007EB800048C7127FA2007E80A300FE158048141FB3A7EB01F0EB03F800 -FE143F267E01FC1300A2EB00FE007F5C147FD83F8013FEEBF03F90B5FC6C5C6C5C000314 -E0C67E90380007F0A26E7EA26E7EA26E7EA2157FA2153E21407BB32C>I<387FFFFCB67E -15E015F86C803907E007FE1401EC007F6F7E151FA26F7EA64B5AA2153F4BC7FCEC01FE14 -0790B55A5D15E081819038E007FCEC01FE1400157F81A8160FEE1F80A5D87FFEEB1FBFB5 -ECFF00815E6C486D5AC8EA01F029347EB22C>I<90381FF80790B5EA0F804814CF000714 -FF5A381FF01F383FC003497E48C7FC007E147F00FE143F5A151FA46CEC0F00007E91C7FC -127F7FEA3FE0EA1FFCEBFFC06C13FC0003EBFFC06C14F06C6C7F01077F9038007FFEEC07 -FF02001380153FED1FC0A2ED0FE0A20078140712FCA56CEC0FC0A26CEC1F806D133F01E0 -EB7F009038FE01FF90B55A5D00F914F0D8F83F13C0D8700790C7FC23357CB32C>I<007F -B612FCB712FEA43AFC007E007EA70078153CC71400B3AF90383FFFFCA2497F6D5BA22733 -7EB22C>I<3B7FFF803FFFC0B56C4813E0A36C496C13C03B03F00001F800B3AF6D130300 -015DA26D130700005D6D130F017F495A6D6C485AECE0FF6DB5C7FC6D5B010313F86D5B90 -38003F802B3480B22C>I<D87FFCEB7FFC486CEBFFFEA36C48EB7FFCD80FC0EB07E06D13 -0F000715C0A36D131F00031580A36D133F00011500A36D5B0000147EA4017E5BA46D485A -A490381F83F0A4010F5B14C7A301075BA214EFA201035BA214FFA26D90C7FCA46D5A2734 -7EB22C>I<D87FF0EB07FF486C491380A36C486D1300001FC8127CA46C6C5CA76C6C495A -A4143E147FA33A03E0FF83E0A214F7A201E113C3A3000101E35BA201F113C701F313E7A3 -14C1A200005DA201F713F71480A301FF13FF017F91C7FC4A7EA4013E133E29347FB22C> -I<3A3FFF03FFE0484913F0148714076C6D13E03A01F800FE007F0000495A13FE017E5BEB -7F03013F5B1487011F5B14CF010F5B14FF6D5BA26D90C7FCA26D5AA26D5AA2497EA2497E -A2497F81EB0FCF81EB1FC7EC87F0EB3F83EC03F8EB7F01017E7FEBFE00497F0001147E49 -137F000380491480151FD87FFEEBFFFC6D5AB514FE6C15FC497E27337EB22C>I<D87FFC -EB7FFC486CEBFFFEA36C48EB7FFCD807F0EB0FC0151F000315806D133F12016DEB7F0012 -006D137E017E13FE017F5BEB3F01EC81F8131FEC83F0EB0FC314C7903807E7E0A201035B -14EF6DB45AA292C7FC7F5C147EB0903807FFE0497FA36D5B27337EB22C>I<003FB612C0 -4815E0A4007EC7EA1FC0ED3F80A2ED7F00157E15FE4A5A003C5CC712034A5AA24A5A4A5A -A24A5A4AC7FCA214FE495AA2495A495AA2495A495AA2495A49C8FCA213FE485AA24848EB -03C049EB07E01207485A5B121F485AA248C7FCB7FCA46C15C023337CB22C>I<007FB6FC -B71280A46C150021067B7D2C>95 D<3801FFF0000713FE001F6D7E15E048809038C01FF8 -1407EC01FC381F80000006C77EC8127EA3ECFFFE131F90B5FC1203120F48EB807E383FF8 -00EA7FC090C7FC12FE5AA47E007F14FEEB8003383FE01F6CB612FC6C15FE6C14BF0001EB -FE1F3A003FF007FC27247CA32C>97 D<EA7FF0487EA3127F1201AAEC1FE0ECFFF801FB13 -FE90B6FC16809138F07FC09138801FE091380007F049EB03F85BED01FC491300A216FE16 -7EA816FE6D14FCA2ED01F86D13036DEB07F0150F9138801FE09138E07FC091B512801600 -01FB5B01F813F83900F03FC027337FB22C>I<903803FFE0011F13F8017F13FE48B5FC48 -804848C6FCEA0FF0485A49137E4848131890C9FC5A127EA25AA8127EA2127F6C140F6DEB -1F806C7E6D133F6C6CEB7F003907FE03FF6CB55A6C5C6C6C5B011F13E0010390C7FC2124 -7AA32C>I<EC0FFE4A7EA380EC003FAAEB07F8EB3FFE90B512BF4814FF5A3807FC0F380F -F00348487E497E48487F90C7FC007E80A212FE5AA87E007E5CA2007F5C6C7E5C6C6C5A38 -0FF0073807FC1F6CB612FC6CECBFFE6C143FEB3FFC90390FF01FFC27337DB22C>I<EB03 -FE90381FFFC0017F13F048B57E48803907FE03FE390FF800FFD81FE0EB3F805B4848EB1F -C090C7120F5A007E15E015075AB7FCA416C000FCC9FC7E127EA2127F6CEC03C06DEB07E0 -6C7ED80FF0130F6C6CEB3FC001FF13FF000190B512806C1500013F13FC010F13F0010113 -8023247CA32C>I<EC0FF8EC3FFE91B5FC4914805B903807FC7F14F090390FE03F0014C0 -92C7FCA6007FB512FEB7FCA36C5C26000FC0C7FCB3A8003FB512F04880A36C5C21337DB2 -2C>I<ED03F8903907F80FFC90391FFE3FFE017FB6FC48B7FC48ECFE7F9038FC0FF82607 -F003133E3A0FE001FC1CD9C0001300001F8049137EA66D13FE000F5CEBE0016C6C485A39 -03FC0FF048B5FC5D481480D99FFEC7FCEB87F80180C8FCA37F6C7E90B512F06C14FE48EC -FF804815E04815F03A3FC0001FF848C7EA03FC007E1400007C157C00FC157E48153EA46C -157E007E15FCD87F801303D83FE0EB0FF8D81FFCEB7FF06CB612E0000315806C1500D800 -3F13F8010713C028387EA42C>I<EA7FF0487EA3127F1201AAEC1FE0EC7FFC9038F9FFFE -01FB7F90B6FC9138F03F80ECC01F02807FEC000F5B5BA25BB3267FFFE0B5FCB500F11480 -A36C01E0140029337FB22C>I<1307EB1FC0A2497EA36D5AA20107C7FC90C8FCA7387FFF -C080B5FC7EA2EA0007B3A8007FB512FCB612FEA36C14FC1F3479B32C>I<140EEC3F80A2 -EC7FC0A3EC3F80A2EC0E0091C7FCA748B512804814C0A37EC7120FB3B3A2141F003C1480 -007E133FB414005CEB01FEEBFFFC6C5B5C001F5B000790C7FC1A467CB32C>I<EA7FE048 -7EA3127F1201AA91381FFFF04A13F8A36E13F0913800FE004A5A4A5A4A5A4A5A4A5A4A5A -4AC7FC14FEEBF1FC13F3EBF7FE90B5FCA2EC9F80EC0FC001FE7FEBFC07496C7E496C7E81 -1400157E811680151F3A7FFFC0FFFCB500E113FEA36C01C013FC27337EB22C>I<387FFF -E0B57EA37EEA0003B3B3A5007FB61280B712C0A36C158022337BB22C>I<3A7F83F007E0 -9039CFFC1FF83AFFDFFE3FFCD87FFF13FF91B57E3A07FE1FFC3E01FCEBF83F496C487E01 -F013E001E013C0A301C01380B33B7FFC3FF87FF0027F13FFD8FFFE6D13F8D87FFC4913F0 -023F137F2D2481A32C>I<397FF01FE039FFF87FFC9038F9FFFE01FB7F6CB6FC00019038 -F03F80ECC01F02807FEC000F5B5BA25BB3267FFFE0B5FCB500F11480A36C01E014002924 -7FA32C>I<EB07FCEB1FFF017F13C048B512F048803907FC07FC390FF001FE48486C7E01 -80133F003F158090C7121F007EEC0FC0A348EC07E0A76C140F007E15C0A2007F141F6C15 -806D133F6C6CEB7F006D5B6C6C485A3907FC07FC6CB55A6C5C6C6C13C0011F90C7FCEB07 -FC23247CA32C>I<397FF01FE039FFF8FFF801FB13FE90B6FC6C158000019038F07FC091 -38801FE091380007F049EB03F85BED01FC491300A216FE167EA816FE6D14FCA2ED01F86D -13036DEB07F0150F9138801FE09138E07FC091B51280160001FB5B01F813F8EC3FC091C8 -FCAD387FFFE0B57EA36C5B27367FA32C>I<903903FC078090391FFF0FC0017F13CF48B5 -12EF4814FF3807FE07380FF00148487E49137F4848133F90C7FC48141F127E150F5AA87E -007E141FA26C143F7F6C6C137F6D13FF380FF0033807FC0F6CB6FC6C14EF6C6C138F6D13 -0FEB07F890C7FCAD0203B5FC4A1480A36E140029367DA32C>I<D87FFEEB3FC0B53801FF -F0020713F8021F13FC6C5B39003F7FE1ECFF019138FC00F84A13704A13005CA25C5CA391 -C8FCAF007FB512E0B67EA36C5C26247EA32C>I<90387FF8700003B512F8120F5A5A387F -C00F387E00034813015AA36CEB00F0007F140013F0383FFFC06C13FE6CEBFF80000314E0 -C66C13F8010113FCEB0007EC00FE0078147F00FC143F151F7EA26C143F6D133E6D13FE90 -38F007FC90B5FC15F815E000F8148039701FFC0020247AA32C>I<131E133FA9007FB6FC -B71280A36C1500D8003FC8FCB1ED03C0ED07E0A5EC800F011FEB1FC0ECE07F6DB5128016 -0001035B6D13F89038003FE0232E7EAD2C>I<3A7FF003FF80486C487FA3007F7F0001EB -000FB3A3151FA2153F6D137F3900FE03FF90B7FC6D15807F6D13CF902603FE0713002924 -7FA32C>I<3A7FFF01FFFCB514FE148314016C15FC3A03E0000F80A26D131F00011500A2 -6D5B0000143EA26D137E017C137CA2017E13FC013E5BA2EB3F01011F5BA21483010F5BA2 -14C701075BA214EF01035BA214FF6D90C7FCA26D5A147C27247EA32C>I<D87FFFEB7FFF -6EB5FCB515806C16004A7ED807C0EB01F0A66C6C495AA3143E147FA2D801F0495AECFF87 -A214F7A201F113C700005D9038F9E3CFA201FB13EFA3D97BC190C7FC017F13FFA21480A2 -013F5B90381F007C29247FA32C>I<3A3FFF03FFF048018713F8A36C010313F03A00FC00 -7E005D90387E01F8013F5BEB1F83EC87E090380FCFC0903807EF80EB03FF6D90C7FC5C6D -5A147C14FE130180903803EF80903807CFC0EB0FC7EC83E090381F01F0013F7FEB7E0001 -7C137C49137E0001803A7FFF01FFFC1483B514FE6C15FC140127247EA32C>I<3A7FFF01 -FFFCB5008113FE148314816C010113FC3A03E0000F806C7E151F6D140012005D6D133E13 -7C017E137E013E137CA2013F13FC6D5BA2EB0F815DA2EB07C1ECC3E0A2EB03E3ECE7C013 -0114F75DEB00FFA292C7FC80A2143EA2147E147CA214FC5CA2EA0C01003F5BEA7F83EB87 -E0EA7E0F495A387FFF806C90C8FC6C5A6C5AEA07E027367EA32C>I<003FB612E04815F0 -A4007EC7EA1FE0ED3FC0ED7F80EDFF004A5A003C495AC7485A4A5A4A5A4A5A4A5A4AC7FC -EB01FC495AEB0FF0495A495A495A49C8FC4848EB01E04848EB03F0485A485A485A485A48 -5AB7FCA46C15E024247DA32C>I E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fd ecbx1000 10 57 -/Fd 57 122 df<913A03FF8007FE027F9039F07FFF800103B500FDB512E0010F903A00FF -FE0FF0D93FF8ECF81F90267FE0019038F03FF849485A4816E014804816C00200ED1FF081 -F007C06F91C7FCA8B912E0A4000390C701C0C7FCB3ABB5D8FC3FEBFF80A43D3A7EB938> -27 D<12E07E127C7E7E7F6C7E6C7E12037F6C7E7F12007F137E137FA2EB3F80A214C013 -1F14E0A2130F14F0A4EB07F8A514FCB114F8A5EB0FF0A414E0131FA214C0133F1480A2EB -7F00A2137E13FE5B12015B485A5B1207485A485A90C7FC123E5A12F05A16537BBD25>41 -D<EA0F80EA3FE0EA7FF0A2EAFFF8A213FCA3127FA2123FEA0F9CEA001C133C1338A31378 -137013F0EA01E0A2EA03C0EA0780EA0F005A121C12180E1D798C1B>44 -D<B61280A819087F9620>I<EA0F80EA3FE0EA7FF0A2EAFFF8A5EA7FF0A2EA3FE0EA0F80 -0D0D798C1B>I<141E143E14FE1307137FB5FCA3138FEA000FB3B3A5007FB61280A42136 -79B530>49 D<EB0FFE90387FFFC048B512F0000714FC390FE03FFF261F800F1380263F00 -0313C0D87F8014E0EBE00100FF6D13F07FA2ED7FF8A46C5A6C5A0006C7FCC8FCEDFFF0A2 -16E05C16C04A138016004A5A4A5AEC1FF05D4A5A4AC7FC14FE495AD903F01378495A495A -495A49C712F8017C14F05B49130148B6FC5A5A5A5A5A4815E0B7FCA425367BB530>I<EB -03FF011F13F0017F13FC3901FC07FF2603F003138048486C13C0496C13E0EA0FF86D14F0 -487EA66C4814E06C5A6C485AC714C04A138016004A5A4A5AEC3FF090380FFFC05D15F090 -380007FE913801FF806E13C016E0ED7FF016F8ED3FFCA216FEEA1FC0487E487E487EA416 -FCA249137F007F15F801C0EBFFF06C5A6C6C4813E0260FFC0713806CB61200000114FC6C -6C13F0010790C7FC27377CB530>I<ED07C0150FA2151F153F157F15FF5CA25C5C5C5C14 -3E143C5C5C1301495A5C495A495A5B133E5B13785B485A1203485A5B48C7FC121E5A127C -5AB81280A4C70001EBC000AA0103B61280A429367DB530>I<001C15C0D81F80130701F8 -137F90B61280A216005D5D15F05D15804AC7FC14F090C9FCA7EB03FE90381FFFE0017F13 -F89038FE07FC9038F003FFD9C0011380496C13C090C7FC000E15E0C8127F16F0A216F8A3 -121FEA3FC0487E12FF7FA316F05B15FFD87F8014E0007EC713C0003E5B003F4913806C6C -481300390FF01FFE6CB512F8000114E06C6C1380D90FF8C7FC25377BB530>I<EC0FF8EC -FFFE0103EBFF8090390FF80FC090393FE003E090397F8001F09038FF000F48EC1FF84848 -133F485A120F5B121FA2003FEC1FF0ED0FE0484890C7FCA31408EC7FF039FFF1FFFC01F3 -13FFD9F78013809039FF007FC049EB3FE04914F0ED1FF85B16FCA34914FEA4127FA5123F -16FCA26C7E16F8000F143F6D14F0000715E06C6CEB7FC03A01FF81FF806C90B51200013F -13FC010F13F00101138027377CB530>I<123C123EEA3FE090B71280A41700485D5E5E5E -5EA2007CC7EA0FC000784A5A4BC7FC00F8147E485C5D14014A5AC7485A4A5AA24A5A143F -4AC8FCA214FEA213015C1303A21307A2130F5CA2131FA5133FA96D5A6D5A6D5A29397BB7 -30>I<49B47E010F13F0013F13FC9038FE01FF3A01F8007F804848EB3FC04848EB1FE015 -0F484814F01507121FA27F7F7F6D130F01FF14E014C09138E01FC06CEBF83F9138FE7F80 -6C9038FFFE005D6C14F06C14FC6C14FF6D14806D14C090B612E0D803FD14F02607F07F13 -F848487E261FC00F13FC383F8003007F010013FE90C7127F151F00FE140715031501A215 -00A216FC7E6C14016D14F86C6C13036DEB07F06C6CEB0FE0D80FFEEB7FC00003B61200C6 -14FC013F13F00103138027377CB530>I<ED03E04B7EA24B7EA34B7EA24B7EA34B7EA292 -B57EA34A8015F302038015E1A202078015C0020F80ED807FA2021F80ED003F4A80023E13 -1FA2027E80027C7F02FC814A7FA20101824A7F49B77EA3498202C0C7FC010F824A147FA2 -011F8291C8123F4982013E151FA2017E82017C8101FE83B500F80107B61280A4413A7DB9 -48>65 D<B812C017FC17FF18C028007FF000037F04007F717E717E171F84A2717EA74D5A -A260173F4D5A4D5A4C13C0040F5B91B600FCC7FCA2EFFF8002F0C713F0EF3FF8717E717E -717E19807113C0A319E0A719C0A25F4D138019005FEF7FFE4C485AB912F018C095C7FC17 -F03B397DB844>I<DB3FFCEB01C00203B5EAC003021FECF00791B6EAFC0F01039039FC00 -FF3F4901C0EB1FFFD91FFEC77E49481403D97FF080494880485B48177F4849153F4890C9 -FC181F485A180F123F5B1807127FA24993C7FC12FFAD127F7FF003C0123FA27F001F1707 -A26C6C1780180F6C6D16006C6D5D6C173E6C6D157ED97FF85D6D6C4A5A6DB44A5A010701 -C0EB0FE06D01FCEBFF80010090B548C7FC021F14F8020314E09126003FFEC8FC3A3B7BB9 -45>I<B87E17F817FF18C028007FF8000713F09338007FF8EF1FFE717E050313807113C0 -A27113E0F07FF0A2F03FF8A219FC181FA219FEA419FFAC19FEA419FC183FA219F8187F19 -F0F0FFE0A24D13C04D13804D1300EF1FFEEF7FFC933807FFF0B912C095C7FC17FC178040 -397DB849>I<B912F0A426007FF8C7FCEF1FF8170717031701A21700A21878A3043C137C -183CA41800167CA216FC150391B5FCA4ECF8031500167CA2163C180FA3181EA293C7FCA2 -183EA2183C187CA218FCA2EF01F81703170F173FEE01FFB9FC18F0A338397DB83F>I<B9 -12C0A43A007FF800039338007FE0171F170F1707A21703A21701A318F0EE7800A41800A2 -16F8A21501150791B5FCA4ECF80715011500A21678A693C8FCADB7FCA434397DB83C>I< -B6D8FC03B612F0A426007FF8C70001EBE000B3A391B8FCA402F8C71201B3A6B6D8FC03B6 -12F0A444397DB84B>72 D<B612FCA439007FF800B3B3ADB612FCA41E397DB824>I<B7FC -A426007FF8C9FCB3ACEF0780A5170F1800A35FA25FA25F5F5E5EEE0FFE167FB8FCA43139 -7DB839>76 D<B500F80403B512F06E5EA26E5ED8007FF1E000A2D97BFF161EA201796D5D -A201786D5DA26E6C5DA36E6C4A5AA26E6C4A5AA26E6C4A5AA26E6C4A5AA26E6C141EA36E -6D5BA26E6D5BA26F6C5BA26F6C485AA36F6C485AA26F6C485AA26F6C48C7FCA2923803FF -1EA36F13BCA26F13F8A2705AA2705AA213FCB500FC6D4848B612F0A2EE0F80EE07005439 -7DB85B>I<B500FC0203B512F0A28080C66C6D90390003F0006F6E5A81017B7F13798101 -787F6E7E6E7E6E7F6E7FA26E7F6E7F6E7F6E7F6F7E153F826F13806F13C06F13E06F13F0 -6F13F88117FCEE7FFEEE3FFF7013817013C17013E18218F17013F97013FDEF7FFF8383A2 -8383838383187FA2183F181F01FC160FB500FC150718031801A244397DB84B>I<EDFFF8 -020FEBFF80027F14F0903A01FFC01FFC010790380007FFD91FFC010113C0D93FF06D6C7E -49486E7E49486E7E48496E7E48834890C86C7EA248486F1380A248486F13C0A2003F18E0 -A348486F13F0A400FF18F8AC007F18F06D5DA3003F18E0A26D5D001F18C0A26C6C4B1380 -6C18006E5C6C6D4A5A6C5F6C6D4A5A6D6C4A5AD93FFC49485A6DB401075B0107D9C01F90 -C7FC010190B512FC6D6C14F0020F1480020001F8C8FC3D3B7BB948>I<B8FC17F017FEEF -FF8028007FF8000F13C0040113E07013F0EF7FF8EF3FFCA2EF1FFEA218FFA818FEA2EF3F -FCA2EF7FF8EFFFF04C13E0040F13C091B7120017FC17E002F8C9FCB3A4B612FCA438397D -B841>I<B712FCEEFFE017FC17FF28007FF8000F13C004017F707F717E717EA2717EA284 -A760A24D5A604D5A4D5A04035B041F90C8FC91B612FC17E0839139F8003FFCEE0FFF707F -707F8284A2707FA584A51A601AF084177F1901DD3FFE13E0B600FC011F130394390FFF87 -C071EBFF8005011400CBEA1FFC443A7DB848>82 D<D907FF130E013FEBE01E90B5EAF83E -0003ECFE7E3A07FC01FFFE390FF0001F4848130F48481303491301007F140090C8FC167E -5A163EA27F161E7F7F6D91C7FC13FC387FFFE014FEECFFF06C14FE6F7E6C816C15F06C81 -6C81C681133F010F801301D9000F1480EC007F030F13C01503818100F0157FA3163FA27E -17807E167F6C16007E6D14FE01E0495A01F813039039FF801FF800FC90B512E0D8F83F5C -D8F00749C7FC39E0007FF02A3B7BB935>I<003FB91280A4D9F800EBF003D87FC0923800 -7FC049161F007EC7150FA2007C1707A200781703A400F818E0481701A4C892C7FCB3AE01 -0FB7FCA43B387DB742>I<B600FC011FB512C0A426007FF8C8381FC000725AB3B3181F01 -3F94C7FC8060011F163E6D6C157E187C6D6C15FC6D6D495A6D6DEB07F06D01F0EB1FE0DA -7FFEEBFFC0021FB6C8FC02075C020014F0030F1380423A7DB849>I<B600F00103B512E0 -A4C601F0C83807F0006E5E017F5F6E150FA2013F5F6E151F011F94C7FC6E5D6D163E6F14 -7E6D167CA26F14FC6D5E6F13016D5E6F13036D5E811707027F5D6F130F023F5D6F131F02 -1F92C8FC815F6E143EEE807E6E147CEEC0FC6E5C16E016E16E5C16F36E5C16FF6F5BA36F -5BA26F90C9FCA26F5AA36F5AA26F5AA26F5A433A7EB848>I<B6D8E01FB500FC90383FFF -FCA4000101F0C7D83FFCC8EA7E006C71153C171F6E197C017F701578836E7014F8013F6F -5E6E1801011F4B6D5CA26E18036D4B6D5CA26D6D496D495A173C6F170F6D037C6D91C7FC -EF787F6F5F6D4B6C6C131E816D02016E5BEFE01F03F8177C027F01036E13784D7E03FCEE -80F8023F49486C5C15FE021F010FEDC1E04D7E03FF16C36E49EDE3C0041E7F049E15F76E -01BC6D5C04FC15FF6E95C8FC4C80A26E5F4C143F6E5F4C141FA2037F5E4C140FA26F486E -5AA2031F5E93C812036F5E5E3A7EB863>I<007FB5D8F803B512F8A4C66C48C7D80FF0C7 -FC6D6C5D6D5E6F495A6D6D49C8FC7F6D6D137E6F5B6DEBF8016D5D6F485A6E6C485A023F -130FDA1FFF5BEE9F806E01FFC9FC805E6E5B6E5B80826F7E153F826F7F5D4B7F92B57EA2 -DA01F97FDA03F17F03F07F913807E07FDA0FC07F021F6D7E4B7E4A486C7F027E8102FE6D -7F4A7F49488149486D7F0107804A6E7E49488149486E7E013F81017F83B60107B61280A4 -41397DB848>I<EB3FFE0003B512E0000F14F8391FF00FFE003FEB03FF6D6C7F6E7FA26F -7EA26C5A6C5AEA0380C8FCA2EC3FFF010FB5FC137F3901FFF87F00071380380FFE00EA3F -F85B485A12FF5BA415FF6D5A127F263FF00713F83B1FFC1FBFFFC0390FFFFE1F0003EBF8 -0F39003FE0032A257DA42E>97 D<13FFB5FCA412077EAF4AB47E020F13F0023F13FC9138 -FE03FFDAF00013804AEB7FC00280EB3FE091C713F0EE1FF8A217FC160FA217FEAA17FCA3 -EE1FF8A217F06E133F6EEB7FE06E14C0903AFDF001FF80903AF8FC07FE009039F03FFFF8 -D9E00F13E0D9C00390C7FC2F3A7EB935>I<903801FFC0010F13FC017F13FFD9FF801380 -2603FE0013C048485AEA0FF8121F13F0123F6E13804848EB7F00151C92C7FC12FFA9127F -A27F123FED01E06C7E15036C6CEB07C06C6C14806C6C131FC69038C07E006DB45A010F13 -F00101138023257DA42A>I<EE7F80ED7FFFA4150381AF903801FF81010F13F1013F13FD -9038FFC07F0003EB001FD807FC1307000F8048487F5B123FA2485AA312FFAA127FA27F12 -3FA26C6C5B000F5C6C6C5B6C6C4913C02701FF80FD13FE39007FFFF9011F13E101011301 -2F3A7DB935>I<903803FF80011F13F0017F13FC3901FF83FE3A03FE007F804848133F48 -4814C0001FEC1FE05B003FEC0FF0A2485A16F8150712FFA290B6FCA301E0C8FCA4127FA3 -6C7E1678121F6C6C14F86D14F000071403D801FFEB0FE06C9038C07FC06DB51200010F13 -FC010113E025257DA42C>I<EC1FF0903801FFFC010713FF90391FF87F8090383FE0FFD9 -FFC113C0A2481381A24813016E1380A2ED3E0092C7FCA8B6FCA4000390C8FCB3ABB512FE -A4223A7DB91D>I<161FD907FEEBFFC090387FFFE348B6EAEFE02607FE07138F260FF801 -131F48486C138F003F15CF4990387FC7C0EEC000007F81A6003F5DA26D13FF001F5D6C6C -4890C7FC3907FE07FE48B512F86D13E0261E07FEC8FC90CAFCA2123E123F7F6C7E90B512 -F8EDFF8016E06C15F86C816C815A001F81393FC0000F48C8138048157F5A163FA36C157F -6C16006D5C6C6C495AD81FF0EB07FCD807FEEB3FF00001B612C06C6C91C7FC010713F02B -377DA530>I<13FFB5FCA412077EAFED7FC0913803FFF8020F13FE91381F03FFDA3C0113 -8014784A7E4A14C05CA25CA291C7FCB3A3B5D8FC3F13FFA4303A7DB935>I<EA01F0EA07 -FC487EA2487EA56C5AA26C5AEA01F0C8FCA913FF127FA412077EB3A9B512F8A4153B7DBA -1B>I<141FEC7FC0ECFFE0A24913F0A56D13E0A2EC7FC0EC1F0091C7FCA9EC0FF0EB0FFF -A4EB007F143FB3B0121FEA3F80EA7FC0EAFFE0EC7FE0A215C014FF6C481380903883FE00 -6CB45A000F13F0000113801C4B86BA1D>I<13FFB5FCA412077EAF92380FFFE0A4923803 -FC0016F0ED0FE0ED1F804BC7FC157E5DEC03F8EC07E04A5A141FEC7FE04A7E8181A2ECCF -FEEC0FFF496C7F806E7F6E7F82157F6F7E6F7E82150F82B5D8F83F13F8A42D3A7EB932> -I<13FFB5FCA412077EB3B3ACB512FCA4163A7DB91B>I<01FED97FE0EB0FFC00FF902601 -FFFC90383FFF80020701FF90B512E0DA1F81903983F03FF0DA3C00903887801F000749DA -CF007F00034914DE6D48D97FFC6D7E4A5CA24A5CA291C75BB3A3B5D8FC1FB50083B512F0 -A44C257DA451>I<01FEEB7FC000FF903803FFF8020F13FE91381F03FFDA3C0113800007 -13780003497E6D4814C05CA25CA291C7FCB3A3B5D8FC3F13FFA430257DA435>I<903801 -FFC0010F13F8017F13FFD9FF807F3A03FE003FE048486D7E48486D7E48486D7EA2003F81 -491303007F81A300FF1680A9007F1600A3003F5D6D1307001F5DA26C6C495A6C6C495A6C -6C495A6C6C6CB45A6C6CB5C7FC011F13FC010113C029257DA430>I<9039FF01FF80B500 -0F13F0023F13FC9138FE07FFDAF00113800003496C13C00280EB7FE091C713F0EE3FF8A2 -EE1FFCA3EE0FFEAA17FC161FA217F8163F17F06E137F6E14E06EEBFFC0DAF00313809139 -FC07FE0091383FFFF8020F13E0020390C7FC91C9FCACB512FCA42F357EA435>I<9038FE -03F000FFEB0FFEEC3FFF91387C7F809138F8FFC000075B6C6C5A5CA29138807F80ED3F00 -150C92C7FC91C8FCB3A2B512FEA422257EA427>114 D<90383FF0383903FFFEF8000F13 -FF381FC00F383F0003007E1301007C130012FC15787E7E6D130013FCEBFFE06C13FCECFF -806C14C06C14F06C14F81203C614FC131F9038007FFE140700F0130114007E157E7E157C -6C14FC6C14F8EB80019038F007F090B512C000F8140038E01FF81F257DA426>I<130FA5 -5BA45BA25B5BA25A1207001FEBFFE0B6FCA3000390C7FCB21578A815F86CEB80F014816C -EBC3E090383FFFC06D1380903803FE001D357EB425>I<01FFEC3FC0B5EB3FFFA4000714 -016C80B3A35DA25DA26C5C6E4813E06CD9C03E13FF90387FFFFC011F13F0010313803025 -7DA435>I<B539F001FFF8A4000390C7EA1F00161E6E133E6C153C6E137C6C15786E13F8 -017F5CECF001013F5C14F8011F495AA2ECFC07010F5CECFE0F010791C7FC6E5A6D131E15 -BE6D13BC15FC6D5BA36E5AA26E5AA26E5AA26E5AA22D257EA432>I<B500F1B538803FFF -A43D07FE000FF80003E06C6C010715C082028015076C6E6C148015076C01C0ED0F00826E -485C017FED801E5D90273FF01E7F5B17C0DAF83E147C011F90393C3FE078037C14F8903B -0FFC781FF0F0A29139FEF00FF10107EDF9E002FF14FB6D496CB45AA24B7E6D5EA26D496C -90C7FCA292C7FC6E5CA2023E147C023C143C40257EA445>I<B539F01FFFF0A400039039 -8003F8006C01C013E06C1407D97FE05B6D6C485A6E48C7FC90381FFC3E010F5B903807FE -FC6D6C5A5D6D5B6D5B6E7E6E7E814A7EA24A7E903801F3FFD903E37FD907C17FEB0FC049 -486C7E4A6C7E013E80496D7E49130F00016E7EB590383FFFF8A42D257EA432>I<B539F0 -01FFF8A4000390C7EA1F00161E6E133E6C153C6E137C6C15786E13F8017F5CECF001013F -5C14F8011F495AA2ECFC07010F5CECFE0F010791C7FC6E5A6D131E15BE6D13BC15FC6D5B -A36E5AA26E5AA26E5AA26E5AA292C8FCA25C141E003F133E387F803C38FFC07C147814F8 -EBC1F0EBC3E06C485A387D1F80D83FFFC9FCEA1FFCEA07F02D357EA432>I -E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fe ecbx1440 14.4 35 -/Fe 35 122 df<DC7FFEECFFC0031FB5D8801F13F092B6D8E07F13FC020703F9B57E021F -D9C007B5EAC1FF91277FFE000102071380DAFFF8010713FC010301E049494813C0495B49 -494913F04990C7FC19E0495A741380017F17C04A6E6E130071EC00FC98C7FCAEBB12FEA5 -26007FFCC7000701C0C8FCB3B3A7007FB5D8FC07B612F0A552547DD34D>27 -D<151E153E15FE1403140F147FEB07FF0003B5FCB6FCA3EBF87FEAFC00C7FCB3B3B3A600 -7FB712FCA52E4E76CD42>49 D<EC1FFE49B512F0010F14FC013FECFF804915E02701FF80 -3F7F2703FC000713FCD807F001017F48486D7FD81F806E138048C87E7013C0D87FE016E0 -01F8806D16F000FF817F7013F8A56C5AA26C5A6C5AEA0380C914F05EA218E05E18C05E18 -804C13005F4C5A4C5A5F4B5B4B5B4B5B94C7FCED0FFC4B5A4B5AED7FC04B5A4A90C8FCEC -03FC4A5A4A4814F84A5A4A5A4AC8FC02FEEC01F0495A495A495A5CD90F80140349C8FC01 -3E1507017FB7FC90B812E05A5A5A5A5A5A5AB9FC18C0A4354E7ACD42>I<913807FFC002 -7F13FC0103B67E010F15E090261FF80313F890267FC0007F01FEC7EA3FFE48488148486E -138013FE486C6C6D13C0804817E080A66C5B18C06C5B6C90C75AD80038168090C8FC4C13 -00A24C5A5F4C5A4B5B4B13C0030F5BDB7FFEC7FC91387FFFF816C016FCEEFF80DA000313 -E09238007FF8EE3FFE707E70138018C07013E018F07013F8A218FC82A218FEA3EA03C0EA -0FF0EA3FFC487EA2B5FCA218FCA25E18F8A26C4816F0495C4916E0D83FE04A13C06C485C -D80FF04A1380D807FE91387FFE003B03FFE003FFFC6C90B65A6C6C15E0010F92C7FC0101 -14FCD9001F1380374F7BCD42>I<17FC1601A216031607160FA2161F163F167FA216FF5D -5DA25D5D5D167F153E157E15FC15F8EC01F01403EC07E015C0EC0F80141FEC3F00143E5C -14FC495A5C495A1307495A5C49C7FC5B137E137C5B1201485A5B485A120F485A90C8FC12 -3E127E5ABA1280A5C901FCC7FCAF021FB71280A5394F7CCE42>I<486C150601F0153E01 -FEEC01FED9FFF0133F91B65A5F5F5F5F5F94C7FC16FC5E16E093C8FC15FC01F0138091CA -FCAC913807FF80023F13F891B512FE01F36E7E9026FFFC0113E09139E0007FF891C76C7E -496E7E01F86E7E5B7013804916C0C9FC18E08218F0A418F8A31203EA0FE0EA3FF8487EA2 -12FF7FA218F0A25B5E6C4816E05B01C016C06CC85A18806C6C4A13007FD80FF04A5A6C6C -ECFFFCD803FE4913F02701FFE00F5B6C6CB612806D92C7FC010F14F8010114C09026003F -FCC8FC354F7ACD42>I<ED07FE92B512C0020314F0021F14FC91397FFC01FE9139FFE000 -7F01030180EB3F804990C7121F4948EC7FC0494814FF4948010313E0495A49485B5A485B -A2485BA2486F13C091C7FC4803001300177E94C7FC5AA25B127FA2ED3FF04AB5FC020714 -C000FF4914F091391F807FF891393E001FFE02786D7E4A6D13807013C06D5A4A6D13E018 -F05C7013F8A291C813FCA44916FEA3127FA6123FA37F6C17FCA36C17F85E7E6E15F06C17 -E06C6D5B6E15C06C4B13806D6C491300D93FFC495A6DB4EBFFFC010790B512F06D5D0100 -1580021F01FCC7FC020313C0374F7BCD42>I<B912FEF0FFF019FE737E1AE0D8000F01C0 -C7001F7F06037F727F726C7E867313807313C0A27313E0A37313F0A94F13E0A34F13C01B -80614F1300624F5A06035B4E13E0063F5B92B8C7FC19F8A2F1FF8003C0C7001F13E00601 -13F89538007FFE737E070F13C01BE07313F0851BF87313FCA27313FEA31BFFA91BFEA261 -1BFCA2614F13F81BF0614F13E0077F13C04EB51280060FEBFE00BB5A1AF01AC04FC7FC19 -C050527BD15D>66 D<932603FFF01407047F01FF140F0307B600E0131F033F03F8133F92 -B700FE137F02039126C003FF13FF020F01F8C7EA3FC1023F01C0EC0FE391B5C80003B5FC -4901FC814949814901E082011F498249498292CA7E4948834948835A4A83485B4885A248 -49187FA2485B1B3FA2485B1B1FA25AA21B0091CDFCA2B5FCAE7EA280A36C1A1FA36C7FA2 -1B3F6C7F1B3E6C7F1B7E6C6D187C6C1AFC6E18F86C19016D6CEF03F06D7E6FEE07E06D6D -EE0FC001076DEE1F806D01F8EE3F006D6D16FE6D01FF4B5A023F01C0EC07F8020F01FCEC -3FF00203903AFFC001FFC0020091B6C7FC033F15FC030715F0DB007F1480040301F0C8FC -505479D25F>I<BAFC19F819FF1AE01AF8D8000701F0C7001F13FE06017FDE003F13C007 -0F7F07037F737F737F747E747E747F86747F8886888688A2747FA3881B7FA288A51D80AF -1D00A564A21BFF64A3505BA2505BA2505BA2505B505B99C7FC505A1A7F4F485A4F13F007 -0F5B073F5B4EB55A061F49C8FCBB12F81AE097C9FC19F896CAFC59527CD165>I<BB12FC -A5D8000701F0C7000F7F1800191F190F19071903190119001A7E1A7F86A386A51B80DD03 -E0130FA497C7FCA31707A3170F171F173FEE01FF92B6FCA5EDF001EE003F171F170F1707 -A31703A794CAFCB3A2B812F0A549527CD153>70 D<B8D88007B712FCA5D8000701F0C900 -3FEB8000B3AE92BAFCA503F0C9123FB3B1B8D88007B712FCA55E527CD167>72 -D<B81280A5D8000701F0C7FCB3B3B3B2B81280A529527DD130>I<B812E0A5D8000F01E0 -CAFCB3B3A91AF8A419011AF0A51903A31907A2190F1AE0191FA2193F197F19FF60180760 -187F0503B5FCBB12C0A545527CD14F>76 D<B912E018FF19F019FE737ED8000701F0C714 -E0060F7F060313FC06007F737E737F8587737FA28785A287A863A261636361634F90C8FC -4F5A4F5A06035B060F13E095B5128092B748C9FC19F019C019F09226F0000713FC050013 -FF063F7F727F727F727F727FA2727FA28486A886A71D707513F8A2851C017301C013F0A2 -73EBE003B86C6D9038F007E0739038FC1FC0070190B51280736C1400080F5BCE13F85D53 -7CD162>82 D<DA0FFE141C91B500F0133C010702FC137C011F02FF13FC017F15C19026FF -F00113E148903980001FFB4890C7EA07FFD807FC14014848804848153F171F4848150FA2 -007F1607491503A2170112FFA217007FA26D167CA27F7F6D93C7FC6C7E14C014F8ECFF80 -6C14F8EDFFC06C15FC6CEDFF8017F06C16FC6C826C707E6C836D82011F8201078213016D -6C81020781EC007F030380ED003F040314801600173F837113C0838312F883A3837EA319 -807EA26C5E19007F6D4B5A7F6D4B5A01FC4B5A6D151FD9FFC04A5AD97FF8ECFFE028FE1F -FF80075B010790B6C7FCD8FC0115FC486C6C14F048010F14C0489026007FFCC8FC3A5479 -D249>I<B700FE4AB612F0A5D8000F01E0CA387FC000091FC7FCB3B3B26D611B3E811B7E -6D197CA26D6D17FC636D6D1601027F4D5A6F4C5A023F170F6E6C4C5A6E6D4B5A6E01E003 -FFC8FC6E01F8EC03FE020001FEEC1FFC923B7FFFE001FFF8031F90B612E0030716800300 -4BC9FC041F14F0040091CAFC5C537CD165>85 D<EC3FFE0107B512E0011F14FC017F14FF -2701FFC00F13C02703FE00037F486C01007F6E6D7E486D80707EA2707EA3707F6C5B6C90 -C7FC6C5AC9FCA60307B5FC0203B6FC147F0103B7FC011FEBF00F017F1300EBFFFC000313 -F04813C0485B4890C7FC5A5B485AF081F012FF5BA35EA26D5C127F6D5C003F03F713C36D -D901E314E06CD9C00714FF00079026F01F8114C06C90B5C61480C602FC6D1300011F01F0 -EB3FFC01010180EB07F03C387CB642>97 D<EB3FF8B5FCA51203C6FCB3A4EE7FF00307B5 -FC031F14C0037F14F0913AF9FF007FFCDAFFF8EB1FFF03E001077F03806D7F92C76C7F4A -6E7F5C4A6F7E85183F85A38584A31A80AD1A00A36061A261187F616E15FF616E4A5B6E4A -5B6F495BDACFE04990C7FCDA87F0EB3FFE913A01FE01FFF8496CB65A49013F14C0490107 -49C8FC90C813E041547DD249>I<913803FFE0023F13FE91B67E010315E0010F9038003F -F8D93FFCEB07FC4948497E4948131F4849497E485B485BA24890C7FC5A5B003F6F5A705A -705A007F92C8FC5BA312FFAD127F7FA3123F7F6CEE0F80A26C6D141F18006C6D5C6C6D14 -3E6C6D147E6C6D5C6D6C495A6DB4EB07F0010F9038C01FE06D90B5128001014AC7FCD900 -3F13F80203138031387CB63A>I<943803FF80040FB5FCA5EE003F170FB3A4913803FF80 -023F13F849B512FE0107ECFF8F011F9038C03FEF90273FFE0007B5FCD97FF8130149487F -484980484980484980488291C8FC5A5B123FA2127F5BA312FFAD127FA37F123FA3121F7F -6C5E6C6D5C5F6C6D91B5FC6C6D5B6C6D4914E0D97FFCD90FEFEBFF80D91FFFEB7F8F0107 -90B5120F010114FC6D6C13E00207010049C7FC41547CD249>I<913807FF80027F13F849 -B512FE01076E7E011F010313E0903A3FFC007FF0D97FF06D7E49486D7E4849130F48496D -7E48824890C77E1880485A82003F17C0A3485A18E082A212FFA290B8FCA401FCCAFCA612 -7FA37F123FA2EF03E06C7E17076C17C06C6D140F18806C6D141F6C6DEC3F006C6D147ED9 -7FFC495AD91FFFEB07F86D9038E03FF0010390B512C001005D023F01FCC7FC020113E033 -387CB63C>I<DA1FFE14FE49B539E007FF80010FDAFC1F13C0013FDAFF7F13E090267FF8 -07EBFF072701FFE001EBF07F48497E484990387FF83F91C7003F14C048EEFC1F489338FE -070049021F90C7FCA2003F82A9001F5EA26D143F6C5E6C5E6E137F6C6D495A6C6D485B6C -D9F80713804890B6C8FCD803EF14FC01C114E02707C01FFEC9FC49CBFCA2487EA37FA27F -13FC90B612FE6CEDFFF017FCEFFF806C8318F06C836C837F48B87E1207D80FFCC700037F -4848EC003F4848150F48486F138083485A83A56D5D007F18006D5D003F5F6C6C4B5A01FE -153FD807FFED7FF06C01C049485AC601FC011F1380013FB648C7FC010F15F8010115C0D9 -000F01F8C8FC3B4F7CB542>103 D<EB3FF8B5FCA51203C6FCB3A4EE1FFC93B57E030314 -E0030F14F892391FC07FFC92397E003FFE03F86D7EECF9F04B6D7FECFBC0ECFF8092C76C -7FA25CA25CA45CB3ACB6D8F807B612C0A542537CD249>I<133FEBFFC0487F487FA2487F -A66C5BA26C5B6C5B013FC7FC90C8FCAEEB1FF8B5FCA512017EB3B3A6B612F0A51C547CD3 -24>I<EB3FF8B5FCA51203C6FCB3A50407B512F0A59339007FF000EF3FC04D5A4DC7FCEE -01FC4C5AEE0FF04C5A4C5A4CC8FC16FEED03FC4B5A4B5A4B5A4B7E4B7EECF9FF02FB7F91 -B57EA28203BF7F031F7F14FE4A6C7FDAF0077F6F7FA26F7F6F7F167F83707F707FA2707F -707F707FA2707F707F84B6D8F00F14FEA53F537DD245>107 D<EB3FF8B5FCA51203C6FC -B3B3B3B1B612F8A51D537CD224>I<D93FF0D91FF84AB47EB591B56C010F13F8030302E0 -013F13FE030F6E90B6FCDB3F809027F803F80F7F922A7E007FFC07E0077F000302F89028 -3FFE0F80037FC6D9F1F0011F49487EDAF3E0DAFF3E814B153CDAF7805D92C76C496D7F14 -FF4A5EA24A5EA34A5EB3ADB6D8F80FB66CB612F8A565367BB56E>I<D93FF0EB1FFCB591 -B57E030314E0030F14F892391FC07FFC92397E003FFE000302F86D7EC6EBF1F04B6D7FEC -F3C0ECF78092C76C7F14FF5CA25CA45CB3ACB6D8F807B612C0A542367CB549>I<913801 -FFC0023F13FE91B67E010315E0010F018013F8903A3FFC001FFED97FF0EB07FF49486D7F -48496D7F48496D7F91C8127F4883488349153F001F83A2003F8349151FA2007F83A400FF -1880AC007F1800A3003F5F6D153FA2001F5FA26C6C4B5AA26C6D4A5A6C5F6C6D495B6C6D -495B6D6C4990C7FCD93FFCEB1FFE6DB46CB45A010790B512F0010115C0D9003F49C8FC02 -0313E039387CB642>I<90393FF001FCB590380FFF804B13E0037F13F09238FE1FF89138 -F1F83F00019138F07FFC6CEBF3E015C0ECF780A2ECFF00EE3FF84AEB1FF0EE0FE093C7FC -5CA45CB3ABB612FEA52E367DB535>114 D<903903FFC00E011FEBFC1E90B6127E000315 -FE3907FE003FD80FF0130F4848130348481301491300127F90C8127EA248153EA27FA27F -01F091C7FC13FCEBFF806C13FEECFFF06C14FE6F7E6C15E06C816C15FC6C81C681133F01 -0F15801301D9000F14C0EC003F030713E0150100F880167F6C153FA2161F7EA217C07E6D -143F17807F6DEC7F0001F85C6DEB03FE9039FF801FFC486CB512F0D8F81F14C0D8F00791 -C7FC39E0007FF02B387CB634>I<147CA614FCA41301A31303A21307A2130F131F133F13 -7F13FF1203000F90B512FEB7FCA426007FFCC8FCB3A9EE0F80ABEE1F006D7EA2011F143E -806D6D5A6DEBC1F86DEBFFF001005C023F1380DA03FEC7FC294D7ECB33>I<D93FF89138 -01FFC0B50207B5FCA50003ED001FC61607B3AE5FA35FA25F137F5F6D6C14F7DC01E713F0 -6D6CD907C7EBFFC0903A0FFF801F876D90B51207010114FC6D6C13F0020701C091C7FC42 -377CB549>I<B600E090381FFFFCA5000101F8C7000113006CEE007C6E15FC017F5E6E14 -01013F5E8017036D6D5C17076D5E6F130F6D5E6F131F6D93C7FC815F6D6D133E177E6D15 -7C6F13FC027F5C811601DA3FFF5B16036E5C16876E5C16CF6E5C16EF16FF6E91C8FCA26E -5BA26E5BA26F5AA36F5AA26F5AA26F5AA35E151F93C9FC5D153E157ED81FC0137C487E48 -6C13FC486C5B14015D4A5A14074A5A6C48485A4948CAFC495A383F81FC6CB45A6C5B0003 -13C0C648CBFC3E4D7DB445>121 D E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Ff ecrm1000 10 81 -/Ff 81 123 df<B81280A2290280962A>21 D<DA0FF813FC91397FFF07FF903B01F807DF -83C0903A07E001FF0F903B1F8007FE1FE090393F000FFC137E16F85B9338F00780484801 -0790C7FC1503ACB812F8A32801F80003F0C7FCB3AB486C497E267FFFE0B512F0A3333B7F -BA30>27 D<EC0FF8EC7FFE903901F80780903907E001C090391F8000E090383F0007017E -497EA25BA2485A6F5AED018092C8FCA9ED03F0B7FCA33901F8000F1503B3AA486C497E26 -7FFFE0B512C0A32A3B7FBA2E>I<EC0FFC91387FFF70903901F803F0903807E00790381F -800FEB3F00137EA25B150748481303ADB7FCA33901F80003B3AB486C497E267FFFE0B512 -C0A32A3B7FBA2E>I<DA0FF0EB1FF0DA7FFEEBFFFC903B01F80F83F00F903C07E001CFC0 -0380903C1F8000FF0001C090273F0007FE130F017E4948497EA2495CA248485C03076E5A -03030203C7FC95C8FCA9F007E0BAFCA33C01F80003F0001F1807B3AA486C496C497E267F -FFE0B500C1B51280A3413B7FBA45>I<007C137C00FE13FEEAFF01A3EAFE00A7007E13FC -007C137CA8003C137800381338A700181330171E77BA2A>34 D<121C127FEAFF80A213C0 -A3127F121C1200A412011380A2120313005A1206120E5A5A5A12600A1979B917>39 -D<146014E0EB01C0EB0380EB0700130E131E5B5BA25B485AA2485AA212075B120F90C7FC -A25A121EA2123EA35AA65AB2127CA67EA3121EA2121F7EA27F12077F1203A26C7EA26C7E -1378A27F7F130E7FEB0380EB01C0EB00E01460135278BD20>I<12C07E12707E7E7E120F -6C7E6C7EA26C7E6C7EA21378A2137C133C133E131EA2131F7FA21480A3EB07C0A6EB03E0 -B2EB07C0A6EB0F80A31400A25B131EA2133E133C137C1378A25BA2485A485AA2485A48C7 -FC120E5A5A5A5A5A13527CBD20>I<EB0380497EA7397803803C00FC147E00FE14FE397F -8383FC393FC387F8390FE38FE03903FBBF803900FFFE00EB3FF8EB0FE0A2EB3FF8EBFFFE -3903FBBF80390FE38FE0393FC387F8397F8383FC39FE0380FE00FC147E0078143C390007 -C000A76D5A1F247BBD2A>I<121C127FEAFF80A213C0A3127F121C1200A412011380A212 -0313005A1206120E5A5A5A12600A19798817>44 D<B512FCA516057F941C>I<121C127F -EAFF80A5EA7F00121C0909798817>I<1506A2150E150CA2151C151815381530A2157015 -60A215E015C0A214011580A2140315005C1406A2140E140CA2141C1418A214381430A214 -70146014E05CA213015CA2130391C7FCA25B1306A2130E130C131C1318A213381330A213 -701360A213E05BA212015B120390C8FCA25A1206A2120E120CA2121C1218A21238123012 -701260A212E05AA21F537BBD2A>I<EB03F8EB1FFF90387E0FC09038F803E03901E000F0 -484813780007147C48487FA248C77EA2481580A3007EEC0FC0A500FE15E0B3007E15C0A4 -007F141F6C1580A36C1500A26C6C133EA26C6C5B6C6C5BEBF0013900F803E090387E0FC0 -D91FFFC7FCEB03F823397DB62A>I<EB01C013031307131F13FFB5FCA2131F1200B3B3A7 -497E007FB512F0A31C3779B62A>I<EB0FF0EB7FFE48B57E3903E03FE0390F000FF0001E -6D7E001C6D7E486D7E5A6E7E126012FE6CEC7F807FA56CC7FC121CC8FCEDFF00A25D1401 -5D14035D4A5A4A5A5D4A5A4AC7FC147E5C495A14E0495A495A49C8FC011EEB01805B5B49 -130348481400485A485A90C75A48B6FC5A5A485CB6FCA321377CB62A>I<EB07F8EB3FFF -90B512C03901F80FF03903C007F848486C7E390E0001FEEA0F80391FE000FF7FA56C5A6C -5AC7485AA25D14035D4A5A5DEC0F80027FC7FCEB1FFCECFF809038000FE06E7EEC01FC81 -6E7EED7F80A216C0A2153F16E0A2121EEA7F80A2487EA316C0157F491480007EC7FC0070 -ECFF006C495A121E390F8003F83907F00FF00001B512C06C6C90C7FCEB0FF823397DB62A ->I<1538A2157815F8A2140114031407A2140F141F141B14331473146314C313011483EB -030313071306130C131C131813301370136013C01201EA038013005A120E120C5A123812 -305A12E0B712F8A3C73803F800AA4A7E0103B512F8A325387EB72A>I<0006140CD80780 -133C9038F003F890B5FC5D5D158092C7FC14FC38067FE090C9FCAAEB07F8EB1FFE903878 -0F809038E007E03907C003F0496C7E130000066D7E81C8FC8181A21680A4121C127F5A7F -A390C713005D12FC00605C12704A5A6C5C6C1303001E495A6C6C485A3907E03F800001B5 -C7FC38007FFCEB1FE021397CB62A>I<EC3FC0903801FFF0010713FC90380FE03E90383F -800790387E001F49EB3F804848137F485A12075B000FEC3F0049131E001F91C7FC5B123F -A3127F90C9FCEB01FC903807FF8039FF1E07E090383801F0496C7E01607F01E0137E497F -16805BED1FC0A390C713E0A57EA47F123F16C0A2001FEC3F807F000F15006D5B000714FE -6C6C5B6C6C485A3900FE07F090387FFFC0011F90C7FCEB03FC23397DB62A>I<12301238 -123E003FB612E0A316C05A168016000070C712060060140E5D5D00E014304814705D5DC7 -12014A5A4AC7FC1406140E5CA25C1478147014F05C1301A213035C1307A2130FA3131F5C -A2133FA5137FA96DC8FC131E233A7BB72A>I<EB03F8EB1FFF017F13C09038FC07F03901 -E001F83903C0007C4848133C90C7123E48141E000E141F001E80A3121FA26D5B6D131E7F -D80FF85B6D137C01FF13786C6D5A6CEBE3E0ECF780C601FFC7FC6D5A6D6C7E010F13E001 -3F7F01F97F3901E07FFE48486C7E380F800F48486C1380001E010113C0487F007C143F00 -78EC1FE0150F00F81407481403A21501A36C15C0A200781403007C15806C14076CEC0F00 -6C6C131ED807E0137C3903F803F0C6B55A013F1380D907FCC7FC23397DB62A>I<EB03F8 -EB1FFF017F13C03901FC07E048486C7E3907E001F8000F6D7E4848137E5B003F80A248C7 -1380A25AED1FC0A516E0A56C143FA36C7E157F121F6C6C13FF6C6C13DF000313013901F0 -039F3900FC0F1FD93FFC13C0EB07F090C7FCA2153F1680A216005D120F486C137E486C5B -A24A5A4A5A49485A381F000F001CEB1F80260F807FC7FC3807FFFE000113F838003FC023 -397DB62A>I<121C127FEAFF80A5EA7F00121CC7FCB2121C127FEAFF80A5EA7F00121C09 -2479A317>I<121C127FEAFF80A5EA7F00121CC7FCB2121C127FEAFF80A213C0A3127F12 -1C1200A412011380A2120313005A1206120E5A5A5A12600A3479A317>I<007FB812F8B9 -12FCCCFCB0B912FC6C17F836147B9E41>61 D<EC03FF021F13E09138FC00FCD901E0131E -D90780EB0780011EC7EA01E00138EC00704981498148488148488190C97E48D901FC1480 -000ED907FFEB01C0000C90391F03C000001C90267E00E013E000184901701360263801F8 -6D13700030496D13300103EC0FE0267007E00107133800601718495AA200E0171C484848 -150CAA6C6C7E1260A26D6C151C00701718263003F0130F0101141F00386D013F13382618 -00FC01771330001C017E9038E3F070000C90261F03C113E0000E903A07FF00FFC06CD901 -FCEB3F006C90CAFC7F6C7E6C7E13706D167C011EED03FCD90780EC1FF0D901E0ECFF80D9 -00FC90383FFC00021FB51280020301E0C7FC363C7BBA41>64 D<1538A3157CA315FEA34A -7EA34A6C7EA202077FEC063FA2020E7FEC0C1FA2021C7FEC180FA202387FEC3007A20270 -7FEC6003A202C07F1501A2D901807F81A249C77F167FA20106810107B6FCA24981010CC7 -121FA2496E7EA3496E7EA3496E7EA213E0707E1201486C81D80FFC02071380B56C90B512 -FEA3373C7DBB3E>I<B712E016FC16FF0001903980007FC06C90C7EA1FE0707E707E707E -A2707EA283A75F16035F4C5A4C5A4C5A4C5AEEFF8091B500FCC7FCA291C7EA7F80EE1FE0 -EE07F0707E707E83707EA21880177F18C0A7188017FFA24C13005F16034C5AEE1FF8486D -EB7FF0B812C094C7FC16F832397DB83B>I<913A01FF800180020FEBE003027F13F8903A -01FF807E07903A03FC000F0FD90FF0EB039F4948EB01DFD93F80EB00FF49C8127F01FE15 -3F12014848151F4848150FA248481507A2485A1703123F5B007F1601A35B00FF93C7FCAD -127F6DED0180A3123F7F001F160318006C7E5F6C7E17066C6C150E6C6C5D00001618017F -15386D6C5CD91FE05C6D6CEB03C0D903FCEB0F80902701FF803FC7FC9039007FFFFC020F -13F002011380313D7BBA3C>I<B712C016F816FE000190398001FF806C90C7EA3FE0EE0F -F0EE03F8707E707E177FA2EF3F8018C0171F18E0170F18F0A3EF07F8A418FCAC18F8A4EF -0FF0A218E0A2171F18C0EF3F80A2EF7F0017FE4C5A4C5AEE0FF0EE3FE0486DEBFF80B8C7 -FC16F816C036397DB83F>I<B812FEA3000190388000076C90C8FC173F838383A383A318 -80170116C0A394C7FCA31501A21503150F91B5FCA3EC000F15031501A21500A21860A318 -E093C712C0A41701A3EF0380A21707A2170F173F177F486D903807FF00B9FCA333397EB8 -38>I<B812F8A30001903880001F6C90C71201EE00FC177C173C171CA2170CA4170E1706 -A2ED0180A21700A41503A21507151F91B5FCA3EC001F15071503A21501A692C8FCAD4813 -C0B612C0A32F397DB836>I<DBFF8013C0020FEBF001023F13FC9139FF803F03903A03FC -000787D90FF0EB03CF4948EB00EF4948147F4948143F49C8121F485A4848150F48481507 -A248481503A2485A1701123F5B007F1600A448481600AB93B6FCA26C7E9338007FE0EF3F -C0A2123F7F121FA26C7EA26C7EA26C7E6C7E6C6C157F6D7E6D6C14FF6D6C14EFD90FF8EB -03C7D903FEEB0783903A00FFC03F0191393FFFFC00020F01F0130002001380383D7CBA41 ->I<B648B512FEA30001902680000313006C90C76C5AB3A491B6FCA391C71201B3A6486D -497EB648B512FEA337397DB83E>I<B612C0A3C6EBC0006D5AB3B3AD497EB612C0A31A39 -7EB81E>I<013FB512E0A39039001FFC00EC07F8B3B3A3123FEA7F80EAFFC0A44A5A1380 -D87F005B0070131F6C5C6C495A6C49C7FC380781FC3801FFF038007F80233B7DB82B>I< -B649B5FCA3000101809038007FF06C90C8EA3F80053EC7FC173C17385F5F4C5A4C5A4CC8 -FC160E5E5E5E5E4B5AED0780030EC9FC5D153E157E15FF5C4A7F4A6C7E140E4A6C7E4A6C -7E14704A6C7E4A6C7E14804A6C7E6F7EA26F7F707EA2707E707EA2707EA2707E707EA270 -7E707F8484486D497FB6011FEBFF80A339397DB841>I<B612E0A3000101C0C8FC6C90C9 -FCB3AD1718A517381730A31770A317F0A216011603160FEE1FE0486D13FFB8FCA32D397D -B834>I<B5933807FFF86E5DA20001F0FC002600DFC0ED1BF8A2D9CFE01533A3D9C7F015 -63A3D9C3F815C3A2D9C1FCEC0183A3D9C0FEEC0303A2027F1406A36E6C130CA36E6C1318 -A26E6C1330A36E6C1360A26E6C13C0A3913901FC0180A3913900FE0300A2ED7F06A3ED3F -8CA2ED1FD8A3ED0FF0A3486C6D5A487ED80FFC6D48497EB500C00203B512F8A2ED018045 -397DB84C>I<B5913807FFFE8080C69238007FE06EEC1F80D9DFF0EC0F001706EBCFF8EB -C7FCA2EBC3FEEBC1FFA201C07F6E7EA26E7E6E7E81140F6E7E8114036E7E168080ED7FC0 -16E0153FED1FF0ED0FF8A2ED07FCED03FEA2ED01FF6F1386A2EE7FC6EE3FE6A2EE1FF6EE -0FFEA216071603A216011600A2177E486C153E487ED80FFC151EB500C0140EA217063739 -7DB83E>I<EC03FF021F13E09138FE01FC903901F8007ED907E0EB1F8049486D7ED93F80 -EB07F049C76C7E01FE6E7E48486E7E49157E0003167F4848ED3F80A24848ED1FC0A2001F -17E049150F003F17F0A3007F17F8491507A300FF17FCAC007F17F86D150FA3003F17F0A2 -6C6CED1FE0A36C6CED3FC0000717806D157F000317006C6C15FEA26C6C4A5A017F4A5A6D -6C495A6D6C495AD907E0EB1F80D903F8017FC7FC903900FE01FC91381FFFE0020390C8FC -363D7BBA41>I<B712C016FC16FF0001D9800013C06C90C7EA1FE0707EEE03F883707EA2 -707EA21880A71800A24C5AA24C5A5FEE0FF04C5AEEFF8091B548C7FC16F091CAFCB3A548 -7FB6FCA331397EB838>I<EC03FF021F13E09138FE01FC903901F8007ED907E0EB1F8049 -486D7ED93F80EB07F049C76C7E01FE6E7E48486E7EA24848157F0007178049153F000F17 -C049151F001F17E0A24848ED0FF0A3007F17F8A2491507A200FF17FCAC007F17F8A26D15 -0FA2003F17F0A26C6CED1FE0A36C6CED3FC00007027C14804AB4FC3C03F80383807F003B -01FC0701C0FEEC0E002600FE0CEBE1FC017FEC63F8D93F8CEB77F0D91FCCEB3FE0D907EE -14806DB449C7FC0100D981FC130CEC1FFF0203131C91C7001E131C161F183CEF807CEFC0 -F8EE0FFFA318F08218E07013C07013809338007E00364B7BBA41>I<B612FEEDFFE016F8 -000190388007FE6C90C76C7EEE3FC0707E707E707EA2707EA283A65FA24C5AA24C5A4C5A -EE3F8004FFC8FCED07FC91B512E05E9138000FF0ED03F8ED00FE82707E707EA2161F83A5 -83A6F00180A217F8160F1803486D01071400B66D6C5A04011306933800FE0ECAEA3FFCEF -07F0393B7DB83D>I<D90FF813C090383FFE0190B512813903F807E33907E000F7484813 -7F4848133F48C7121F003E140F007E1407A2007C140312FC1501A36C1400A37E6D14006C -7E7F13F86CB47E6C13F8ECFF806C14E06C14F86C14FEC680013F1480010714C0EB007F02 -0713E0EC007FED3FF0151F150FED07F8A200C01403A21501A37EA216F07E15036C15E06C -14076C15C06C140F6DEB1F80D8FBF0EB3F00D8F0FE13FE39E03FFFF8010F13E0D8C00190 -C7FC253D7CBA2E>I<003FB812E0A3D9C003EB001F273E0001FE130348EE01F000781600 -00701770A300601730A400E01738481718A4C71600B3B0913807FF80011FB612E0A33539 -7DB83C>I<B6903807FFFEA3000101809038007FE06C90C8EA1F80EF0F001706B3B2170E -6D150C80171C133F17186D6C14385F6D6C14F06D6C5C6D6C495A6D6CEB07806D6C49C7FC -91387F807E91381FFFF8020713E09138007F80373B7DB83E>I<B500FC91387FFF80A300 -03018091380FFC006C90C8EA07E0715A6C705A6E1403017F93C7FCA280013F1506A26E14 -0E011F150C80010F5DA28001075DA26E147001031560A26D6C5CA2806D4A5AA2ED800302 -7F91C8FCA291383FC006A215E0021F5BA2EDF01C020F1318A26E6C5AA215FC02035BA2ED -FEE002015BA26E6C5AA36FC9FCA3153EA2151CA3393B7EB83E>I<B5D8FC07B5D8F001B5 -FCA30007902780001FFEC7EA1FF86C48C7D80FF8EC07E000010307ED03C01B807F6C6F6C -1500A26E5F017F6E6C1406A280013F4A6C5CA280011F4A6D5BEE067FA26D6C010E6D5BEE -0C3FA26D6C011C6D5BEE181FA26D6C6F5BEE300FA26D6C6F485AEE6007A26D6C4CC7FC93 -38C003FCA203805D913B7F818001FE06A203C1150EDA3FC3C7EAFF0CA203E3151CDA1FE6 -EC7F98A215F6DA0FFCEC3FF0A302075E4B141FA202035E4B140FA202015E4B1407A20200 -93C8FC4B80503B7EB855>I<007FB590383FFFFCA3C601F801071380D97FE0D903FCC7FC -013FEC01F06D6C5C5F6D6C5C6D6C13034CC8FC6D6C1306160E6D6C5B6DEB801816389138 -7FC0306E6C5A16E06E6C5A91380FF18015FB6EB4C9FC5D14036E7EA26E7F6F7EA24B7E15 -DF9138019FF09138038FF8150F91380607FC91380E03FE140C4A6C7EEC38000230804A6D -7E14E04A6D7E49486D7E130391C76C7E01066E7E130E010C6E7E011C1401013C8101FE82 -2607FF80010713E0B500E0013FEBFF80A339397EB83E>I<B500FE91383FFFE0A3000301 -E0913807FE00C649EC03F0017F6F5A606D6C5D6D6C140395C7FC6D6C1406A26D6C5C6D6C -141C17186D6C143817306D6D5B6E6C13E05F91383FE0015F91381FF003DA0FF890C8FC16 -06913807FC0E160C913803FE1C913801FF185E6E13B016E0157F6F5AB3A24B7E023FB512 -C0A33B397FB83E>I<003FB7FCA39039FC0001FE01C0130349495A003EC7FC003C4A5A5E -0038141F00784A5A12704B5A5E006014FF4A90C7FCA24A5A5DC712074A5AA24A5A5D143F -4A5AA24A5A92C8FC5B495AA2495A5C130F4948EB0180A2495A5C137F495A16034890C7FC -5B1203485AEE0700485A495C001F5D48485C5E4848495A49130FB8FCA329397BB833>I< -007FB81280B912C0A26C17803204797041>95 D<EB1FE0EBFFFC3803E03F3907000F8039 -0F8007E0486C6C7E13E06E7EA26E7E6C5A6C5AC8FCA4147FEB07FFEB3FE0EBFE00EA03F8 -EA0FF0EA1FC0123F485A90C7FC160C12FEA31401A26C13036CEB077C903980063E18383F -C01E3A0FE0781FF03A03FFF00FE03A007F8007C026277DA52A>97 -D<EA03F012FFA3120F1203B0EC1FE0EC7FF89038F1E03E9039F3801F809039F7000FC001 -FEEB07E049EB03F049EB01F85BED00FCA216FEA2167E167FAA167E16FEA216FC15016D14 -F8ED03F07F01EEEB07E001C6EB0FC09039C7801F00903881E07E903800FFF8C7EA1FC028 -3B7EB92E>I<EB03FC90381FFF8090387E03E03901F80070484813F83907E001FC380FC0 -03A2EA1F80123F90380001F848EB00F01500A2127E12FEAA127E127FA26C14067F001F14 -0E6D130C000F141C6C6C13386C6C13706C6C13E039007C07C090381FFF00EB07F81F277D -A525>I<ED0FC0EC03FFA3EC003F150FB0EB03F8EB1FFF90387E078F9038F801EF3903F0 -007F4848133F4848131FA24848130F123F90C7FC5AA2127E12FEAA127E127FA27EA26C6C -131FA26C6C133F6C6C137F6C6CEBEFF03A01F801CFFF39007C078F90381FFE0FD907F813 -C0283B7DB92E>I<EB07F8EB1FFF90387C0FC03901F803E03903F001F0D807E013F8380F -C0004848137CA248C7127E153E5A153F127E12FEA3B7FCA248C8FCA5127EA2127FA26C14 -037F001F14076C6C13060007140E6D131CD801F013386C6C137090387E03E090381FFF80 -903803FC0020277EA525>I<147E903803FF8090380FC1E0EB1F8790383F0FF0137EA213 -FCA23901F803C091C7FCADB512FCA3D801F8C7FCB3AB487E387FFFF8A31C3B7FBA19>I< -ED03F090390FF00FF890393FFC3C3C9039F81F707C3901F00FE03903E007C03A07C003E0 -10000FECF000A248486C7EA86C6C485AA200075C6C6C485A6D485A6D48C7FC38073FFC38 -060FF0000EC9FCA4120FA213C06CB512C015F86C14FE6CECFF804815C03A0F80007FE048 -C7EA0FF0003E140348140116F8481400A56C1401007C15F06CEC03E0003F1407D80F80EB -0F80D807E0EB3F003901FC01FC39007FFFF0010790C7FC26387EA52A>I<EA03F012FFA3 -120F1203B0EC0FF0EC3FFCECF03F9039F1C01F809039F3800FC0EBF70013FE496D7EA25B -A35BB3A3486C497EB500C1B51280A3293A7EB92E>I<EA0380EA0FE0487EA56C5AEA0380 -C8FCAAEA03F012FFA312071203B3AA487EB512C0A312387EB717>I<EB01C0EB07F0EB0F -F8A5EB07F0EB01C090C7FCAAEB01F813FFA313071301B3B3A2123C127E00FF13F01303A2 -14E038FE07C0127C383C0F00EA0FFEEA03F8154984B719>I<EA03F012FFA3120F1203B1 -913801FFFCA39138007FC01600157C15705D4A5A4A5A4AC7FC141E1438147814FC13F1EB -F3FEEBF73F01FE7FEBF81F496C7E8114076E7E6E7E811400157E157F811680ED1FC0486C -EB3FF0B500C0B5FCA3283A7EB92C>I<EA03F012FFA3120F1203B3B3AD487EB512C0A312 -3A7EB917>I<2703F00FF0EB1FE000FFD93FFCEB7FF8913AF03F01E07E903BF1C01F8380 -3F3D0FF3800FC7001F802603F70013CE01FE14DC49D907F8EB0FC0A2495CA3495CB3A348 -6C496CEB1FE0B500C1B50083B5FCA340257EA445>I<3903F00FF000FFEB3FFCECF03F90 -39F1C01F803A0FF3800FC03803F70013FE496D7EA25BA35BB3A3486C497EB500C1B51280 -A329257EA42E>I<EB03FE90380FFF8090383E03E09038F800F84848137C48487F48487F -4848EB0F80001F15C090C712074815E0A2007EEC03F0A400FE15F8A9007E15F0A2007F14 -076C15E0A26C6CEB0FC0000F15806D131F6C6CEB3F006C6C137EC66C13F890387E03F090 -381FFFC0D903FEC7FC25277EA52A>I<3903F01FE000FFEB7FF89038F1E07E9039F3801F -803A07F7000FC0D803FEEB07E049EB03F04914F849130116FC150016FEA3167FAA16FEA3 -ED01FCA26DEB03F816F06D13076DEB0FE001F614C09039F7803F009038F1E07E9038F0FF -F8EC1FC091C8FCAB487EB512C0A328357EA42E>I<D903F813C090381FFE0190387E0781 -9038FC01C33903F000E3000714774848133749133F001F141F485A150F48C7FCA312FEAA -127FA37E6D131F121F6D133F120F6C6C137F6C6C13EF3901F801CF39007E078F90381FFE -0FEB07F890C7FCABED1FE00203B5FCA328357DA42C>I<3807E01F00FFEB7FC09038E1E3 -E09038E387F0380FE707EA03E613EE9038EC03E09038FC0080491300A45BB3A2487EB512 -F0A31C257EA421>I<EBFF03000313E7380F80FF381E003F487F487F00707F12F0A2807E -A27EB490C7FCEA7FE013FF6C13E06C13F86C7F00037FC67F01071380EB007F141F00C0EB -0FC01407A26C1303A37E15806C13077EEC0F00B4131E38F3C07C38E1FFF038C03F801A27 -7DA521>I<1318A51338A31378A313F8120112031207001FB5FCB6FCA2D801F8C7FCB215 -C0A93800FC011580EB7C03017E13006D5AEB0FFEEB01F81A347FB220>I<D803F0EB07E0 -00FFEB01FFA3000FEB001F00031407B3A4150FA3151F12016D133F0000EC77F86D9038E7 -FF8090383F03C790381FFF87903A03FC07E00029267EA42E>I<B538803FFEA33A0FF800 -0FF06C48EB07E00003EC03C06D148000011500A26C6C1306A26D130E017E130CA26D5BA2 -EC8038011F1330A26D6C5AA214E001075BA2903803F180A3D901FBC7FCA214FF6D5AA214 -7CA31438A227257EA32C>I<B53A1FFFE03FFEA3260FF8009038000FF86C48017EEB03E0 -18C00003023EEB0180A26C6C013FEB0300A36C6CEC8006156FA2017E9038EFC00C15C717 -1CD93F01EBE01815830281EBF038D91F831430150102C3EBF87090260FC6001360A2D907 -E66D5A02EC137CA2D903FCEB7F804A133FA2010192C7FC4A7FA20100141E4A130E026013 -0C37257EA33C>I<B538807FFFA33A03FE003FF00001EC1F80000092C7FC017E131C6D13 -186D6C5AECC070010F5B6D6C5AECF180EB03FB6DB4C8FC6D5AA2147F804A7E8114CF9038 -01C7E090380383F090380703F8EB0601496C7E011C137E49137F01787F496D7E486C8000 -0FEC3FF0D8FFFE90B51280A329247FA32C>I<B538803FFEA33A0FF8000FF06C48EB07C0 -0003EC03806C7E16007F00001406A2017E5BA2137F6D5BA26D6C5AA2ECC070010F1360A2 -6D6C5AA214F101035BA2D901FBC7FCA214FF6D5AA2147CA31438A21430A214701460A25C -A2EA7C0100FE5B130391C8FC1306EAFC0EEA701C6C5AEA1FF0EA0FC027357EA32C>I<00 -3FB512FCA2EB8003D83E0013F8003CEB07F00038EB0FE012300070EB1FC0EC3F80006013 -7F150014FE495AA2C6485A495AA2495A495A495AA290387F000613FEA2485A485A000714 -0E5B4848130C4848131CA24848133C48C7127C48EB03FC90B5FCA21F247EA325>I -E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fg ecss2074 20.74 10 -/Fg 10 116 df<EAFFC0B3B3B3B3B3B390B912FCA83E7570F456>76 -D<D8FFC0F03FF0B3B3B3B3AD6C6CF07FE0A46C6CF0FFC0A36D5F001F1A80A26C6C4D1300 -A26C6C4D5A6D170F6C616E161F6C6D4C5A6C6D4C5A6E16FF6D6C4B5B6D6C4B5B6D6C4B5B -6D6C6C021F90C7FC6D01E0EC7FFE6D01F849485A6D9026FF801F5B6D91B65A6E5E021F16 -8002074BC8FC020115F86E6C14E0030F91C9FC030013F04C7770F46D>85 -D<91380FFF8049B512F0010F14FC017F14FF48B712C0000782001F824882DAE0007F49C7 -EA3FFE01F8140FD81FC06E7E90C86C1380121E00186F13C0001081CAFCEF7FE0A318F017 -3FAD93B5FC157F0207B6FC143F49B7FC1307011F153F017FEBF80090B512804801F8C7FC -4813C04890C8FCEA0FFC485A485A5B485A5BA248C9FCA5177FA26D15FFA26C6C5C6D5C6D -140F6C6C5C01FF91B5FC6CEBE00791B612BF6CEDFE3F16FC6C15F06C15C06CECFE006C6C -13F0D91FFCC9FC344C77CA4C>97 D<EAFFC0B3B3ADED0FFC92B57E020714E0021F80027F -14FC91B67E01C38101C7829026CFFE0080D9DFF0131FD9FFC001037F4A6D7F49C86C7E49 -153F496F7E170F496F7E5B717E4981A2711380A2187FA219C0183FA419E0181FAD183F19 -C0A3187FA2198018FFA24D1300A25F6D5E17076D4B5A6D151F4D5A6D4B5A6D15FF6D0203 -5B6E495BD9DFE0013F5B9026CFFC01B5C7FC01C7B65A01C35D01C15D01C05D023F14C002 -0F5C020301FCC8FCC8EA3FE03B7C72FA52>I<ED3FFF4AB512F8020F14FF023F15C04A15 -F049B712FC4916FF49178049EBE0004990C7120FD93FFC02011300D97FF06E7E4948151F -0280814890C912034894C7FC5B485A5B120F5B121F5B123F5BA3485AA548CCFCAD6C7EA4 -7F123FA27F121F7FA26C7EA26C6C17806D1601000317036C6C160F6E151F6C01E0ED7FC0 -6D6CEC01FFD93FFC14076DB4143F6DD9E003B512806D90B6EAFE006D5E6D16F06D6C5D6E -1580020F02FCC7FC020114E09126003FFCC8FC3A4C78CA47>I<DB1FE04AB4FC912601FF -FE143F02079026FF8003B5FC4AECC01F023F02F0B6FC4A02FB158091BAFC49EBE01F49D9 -000302FCC7FC49486D01F8C8FC02F89038007F8049486E7E49486E7E4A140F013F824A14 -07A249C86C7EA401FE6F7EAA017F4B5AA46D6C4A5AA26E140F011F5E6E141F6D6C4A5A6D -6C4A5A02FEEB01FF496C4990C9FC499038E01FFE92B55A495D02BF5C020F14C0496C5CD9 -7E0149CAFC9138001FE001FE90CCFCA67FA27F8080EB3FF091B612FE6DEDFFF818FF6D17 -C019F0013F17FC498390BA7E48854801E0C71203480180DA001F7F4848C900037F484816 -0049EF3FF84848171F49717E127F4917078648481703A76D1707007F616D170F003F616D -171FD81FFCEF7FF06C6C4D5A6D5E6C01C003075B6C01F8033F5BC601FF4AB448C7FC6D01 -F0011F5B6D90B75A010F17E00103178001004CC8FC021F15F002031580DA000F01E0C9FC -496D7CC950>103 D<EAFFE0ABC7FCB3A9EA7FE0B3B3B3B30B6F74EE25>105 -D<EAFFC0B3B3B3B3B3B3AF0A7B73FA25>108 D<ED1FF826FFC001B57E020714E0021F14 -F8027F8091B67E01C18101C316809038C7FE00D9CFF0011F13C0D9DFE0010713E0D9FF80 -130191C8FC18F049157F5B173F4916F8A249151FA35BA45BB3B3AC354A72C952>110 -D<91380FFFC091B512FE0107ECFFC0011F15F8017F15FE90B812804817C05A489038F000 -3F4890C70003138049EC007FD81FF8151F491507003F16014992C7FCA2485AA77FA26C7E -7F7F6CB4FC6C13C014F86CEBFF806C14FC6CECFFE06C15FC6D14FF6D15C0010F81010315 -F8010081020F80DA007F7F03071480DB003F13C0160F040313E01600EF7FF0173FA2EF1F -F8A2170FA7EF1FF0A20070163F127C007FEE7FE001C015FF01F0020313C0B5020F138002 -F0137F91B712006C5E001F5E000716F0C65E011F1580010302FCC7FCD9000F13C0354C7C -CA3D>115 D E -%EndDVIPSBitmapFont -end -%%EndProlog -%%BeginSetup -%%Feature: *Resolution 600dpi -TeXDict begin -%%BeginPaperSize: Letter -letter -%%EndPaperSize - -%%EndSetup -%%Page: 1 1 -1 0 bop 0 201 a Fg(Using)54 b(Libical)p 0 315 3900 24 -v 0 428 a Ff(Eric)28 b(Busb)r(o)r(om)f(\(eric@soft)n(w)n -(arestudio.org\))1948 b(Jan)n(uary)26 b(2001)0 1072 y -Fe(Con)l(ten)l(ts)0 1312 y Fd(1)77 b(In)m(tro)s(duction)3201 -b(2)125 1468 y Ff(1.1)83 b(The)28 b(libical)f(pro)5 b(ject)67 -b(.)41 b(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.) -f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h -(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)134 b(3)125 1625 y(1.2)83 -b(License)22 b(.)41 b(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f -(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.) -f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h -(.)134 b(3)125 1781 y(1.3)83 b(Example)28 b(Co)r(de)78 -b(.)41 b(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.) -f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h -(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)134 b(3)0 2021 -y Fd(2)77 b(Building)30 b(the)h(Library)2865 b(3)0 2260 -y(3)77 b(Structure)3330 b(3)125 2417 y Ff(3.1)83 b(Core)27 -b(iCal)g(classes)62 b(.)42 b(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) -h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h -(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)134 -b(4)315 2573 y(3.1.1)94 b(Prop)r(erties)34 b(.)42 b(.)f(.)h(.)g(.)f(.)h -(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.) -h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f -(.)h(.)134 b(4)315 2730 y(3.1.2)94 b(Comp)r(onen)n(ts)84 -b(.)42 b(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.) -h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g -(.)f(.)h(.)f(.)h(.)f(.)h(.)134 b(5)315 2886 y(3.1.3)94 -b(V)-7 b(alues)108 b(.)41 b(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f -(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.) -h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)134 -b(5)315 3043 y(3.1.4)94 b(P)n(arameters)61 b(.)41 b(.)h(.)g(.)f(.)h(.)f -(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.) -f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h -(.)134 b(5)125 3199 y(3.2)83 b(Other)27 b(elemen)n(ts)h(of)f(libical)42 -b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f -(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.) -f(.)h(.)f(.)h(.)134 b(5)315 3356 y(3.2.1)94 b(En)n(umerations)27 -b(and)g(t)n(yp)r(es)42 b(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.) -g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f -(.)h(.)f(.)h(.)f(.)h(.)134 b(5)315 3512 y(3.2.2)94 b(The)28 -b(parser)78 b(.)41 b(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.) -h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f -(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)134 b(5)315 -3669 y(3.2.3)94 b(Error)26 b(ob)5 b(jects)57 b(.)42 b(.)g(.)f(.)h(.)f -(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.) -f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h -(.)134 b(5)315 3825 y(3.2.4)94 b(Memory)27 b(Managemen)n(t)65 -b(.)42 b(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.) -h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f -(.)h(.)134 b(5)315 3981 y(3.2.5)94 b(Storage)26 b(classes)64 -b(.)42 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.) -g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f -(.)h(.)f(.)h(.)f(.)h(.)134 b(5)0 4221 y Fd(4)77 b(Di\033erences)30 -b(F)-8 b(rom)31 b(RF)m(Cs)2750 b(6)125 4377 y Ff(4.1)83 -b(Pseudo)28 b(Comp)r(onen)n(ts)62 b(.)42 b(.)g(.)f(.)h(.)f(.)h(.)f(.)h -(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.) -f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)134 -b(6)125 4534 y(4.2)83 b(Com)n(bined)28 b(V)-7 b(alues)108 -b(.)41 b(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.) -f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h -(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)134 b(6)125 4690 y(4.3)83 -b(Multi-V)-7 b(alued)28 b(Prop)r(erties)54 b(.)41 b(.)h(.)f(.)h(.)f(.)h -(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.) -f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)134 -b(6)0 4930 y Fd(5)77 b(Using)31 b(libical)3208 b(7)125 -5086 y Ff(5.1)83 b(Creating)27 b(Comp)r(onen)n(ts)73 -b(.)42 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.) -g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f -(.)h(.)f(.)h(.)f(.)h(.)134 b(7)315 5243 y(5.1.1)94 b(Constructor)26 -b(In)n(terfaces)48 b(.)42 b(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h -(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.) -f(.)h(.)f(.)h(.)f(.)h(.)134 b(7)315 5399 y(5.1.2)94 b(v)-5 -b(aargs)26 b(Constructors)70 b(.)41 b(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h -(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.) -h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)134 b(8)p eop -%%Page: 2 2 -2 1 bop 0 -167 3900 5 v 0 -200 a Fd(1.)73 b(In)m(tro)s(duction)3184 -b Ff(2)315 162 y(5.1.3)94 b(P)n(arsing)26 b(T)-7 b(ext)28 -b(Files)68 b(.)42 b(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h -(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.) -f(.)h(.)f(.)h(.)f(.)h(.)134 b(8)125 318 y(5.2)83 b(A)n(ccessing)27 -b(Comp)r(onen)n(ts)105 b(.)41 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h -(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.) -h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 b(10)315 475 -y(5.2.1)h(Finding)28 b(Comp)r(onen)n(ts)99 b(.)42 b(.)f(.)h(.)f(.)h(.)g -(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.) -h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 b(10)315 -631 y(5.2.2)h(Iterating)27 b(Through)f(Comp)r(onen)n(ts)45 -b(.)d(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h -(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 -b(10)315 788 y(5.2.3)h(Using)27 b(Comp)r(onen)n(t)h(Iterators)59 -b(.)41 b(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.) -g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 -b(11)315 944 y(5.2.4)h(Remo)n(ving)27 b(Comp)r(onen)n(ts)83 -b(.)41 b(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.) -f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h -(.)93 b(12)315 1101 y(5.2.5)h(W)-7 b(orking)27 b(with)h(prop)r(erties)e -(and)i(parameters)e(.)41 b(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h -(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 -b(12)315 1257 y(5.2.6)h(W)-7 b(orking)27 b(with)h(v)-5 -b(alues)52 b(.)41 b(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g -(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.) -h(.)f(.)h(.)f(.)h(.)93 b(13)315 1413 y(5.2.7)h(Chec)n(king)27 -b(Comp)r(onen)n(t)g(V)-7 b(alidit)n(y)25 b(.)42 b(.)g(.)f(.)h(.)f(.)h -(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) -h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 b(14)315 1570 y(5.2.8)h(Con)n(v)n -(erting)26 b(Comp)r(onen)n(ts)h(to)g(T)-7 b(ext)74 b(.)41 -b(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h -(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 b(14)125 -1726 y(5.3)83 b(Time)33 b(.)42 b(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.) -g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f -(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.) -f(.)h(.)f(.)h(.)93 b(15)315 1883 y(5.3.1)h(Time)28 b(structure)56 -b(.)42 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.) -g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f -(.)h(.)f(.)h(.)f(.)h(.)93 b(15)315 2039 y(5.3.2)h(Creating)26 -b(time)j(structures)j(.)41 b(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.) -g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f -(.)h(.)f(.)h(.)f(.)h(.)93 b(15)315 2196 y(5.3.3)h(Time)28 -b(manipulating)f(routines)38 b(.)j(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g -(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.) -h(.)f(.)h(.)f(.)h(.)93 b(15)125 2352 y(5.4)83 b(Storing)27 -b(Ob)5 b(jects)39 b(.)i(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h -(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.) -f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 -b(17)315 2509 y(5.4.1)h(Creating)26 b(a)i(new)f(set)48 -b(.)42 b(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.) -h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f -(.)h(.)f(.)h(.)93 b(17)315 2665 y(5.4.2)h(A)n(dding,)28 -b(Finding)f(and)h(Remo)n(ving)e(Comp)r(onen)n(ts)76 b(.)41 -b(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h -(.)f(.)h(.)f(.)h(.)93 b(18)315 2822 y(5.4.3)h(Other)27 -b(routines)70 b(.)42 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f -(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.) -f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 b(19)125 2978 -y(5.5)83 b(Memory)27 b(Managemen)n(t)73 b(.)42 b(.)f(.)h(.)f(.)h(.)f(.) -h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g -(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 -b(19)125 3135 y(5.6)83 b(Error)27 b(Handling)56 b(.)41 -b(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h -(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) -h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 b(20)315 3291 y(5.6.1)h(Return)28 -b(v)-5 b(alues)34 b(.)42 b(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f -(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.) -f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 b(20)315 -3448 y(5.6.2)h(icalerrno)28 b(.)41 b(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.) -f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h -(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 -b(20)315 3604 y(5.6.3)h(X-LIC-ERR)n(OR)27 b(and)g(X-LIC-INV)-9 -b(ALID-COMPONENT)70 b(.)42 b(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.) -f(.)h(.)f(.)h(.)f(.)h(.)93 b(20)125 3760 y(5.7)83 b(Naming)28 -b(Standard)h(.)42 b(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f -(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.) -f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 b(21)0 -4000 y Fd(6)77 b(Hac)m(ks)32 b(and)g(Bugs)3009 b(22)0 -4338 y Fe(1)131 b(In)l(tro)t(duction)0 4577 y Ff(Libical)23 -b(is)f(an)h(Op)r(en)g(Source)f(implemen)n(tation)h(of)g(the)g -(iCalendar)f(proto)r(cols)f(and)i(proto)r(col)e(data)i(units.)35 -b(The)23 b(iCalendar)0 4691 y(sp)r(eci\034cation)29 b(describ)r(es)f -(ho)n(w)h(calendar)f(clien)n(ts)h(can)f(comm)n(unicate)h(with)h -(calendar)d(serv)n(ers)g(so)i(users)f(can)h(store)f(their)0 -4804 y(calendar)e(data)h(and)h(arrange)d(meetings)i(with)h(other)f -(users.)0 4961 y(Libical)g(implemen)n(ts)h(RF)n(C2445,)e(RF)n(C2446)f -(and)j(some)f(of)g(RF)n(C2447)f(and)h(the)h(CAP)g(draft.)0 -5117 y(This)k(do)r(cumen)n(tation)g(assumes)g(that)g(y)n(ou)g(are)f -(familiar)h(with)h(the)f(iCalendar)f(standards)g(RF)n(C2445)g(and)h(RF) -n(C2446.)0 5231 y(these)c(sp)r(eci\034cations)e(are)h(online)g(on)h -(the)g(CALSCH)g(w)n(ebpage)e(at:)p eop -%%Page: 3 3 -3 2 bop 0 -167 3900 5 v 0 -200 a Fd(2.)73 b(Building)31 -b(the)g(Library)2847 b Ff(3)0 162 y Fc(http://www.imc.o)o(rg)o(/ie)o -(tf)o(-c)o(ale)o(nd)o(ar)o(/)0 453 y Fb(1.1)112 b(The)38 -b(libical)c(pro)6 b(ject)0 663 y Ff(This)29 b(co)r(de)g(is)g(under)g -(activ)n(e)f(dev)n(elopmen)n(t.)40 b(If)30 b(y)n(ou)e(w)n(ould)h(lik)n -(e)f(to)h(con)n(tribute)g(to)g(the)g(pro)5 b(ject,)29 -b(y)n(ou)f(can)h(con)n(tact)f(me,)0 777 y(Eric)g(Busb)r(o)r(om,)f(at)g -(eric@soft)n(w)n(arestudio.org.)33 b(The)27 b(pro)5 b(ject)27 -b(has)g(a)g(w)n(ebpage)g(at)0 1016 y Fc(http://softwares)o(tu)o(dio)o -(.o)o(rg)o(/li)o(bi)o(ca)o(l/i)o(nd)o(ex)o(.ht)o(ml)0 -1256 y Ff(and)g(a)h(mailing)f(list)g(that)h(y)n(ou)f(can)g(join)h(b)n -(y)f(sending)g(the)h(follo)n(wing)f(mail:)0 1495 y Fc(To:)42 -b(minimalist@softwa)o(re)o(st)o(udi)o(o.)o(or)o(g)0 1609 -y(Subject:)e(subscribe)g(libical)0 1900 y Fb(1.2)112 -b(License)0 2111 y Ff(The)60 b(co)r(de)f(and)h(data\034les)f(in)h(this) -g(distribution)g(are)e(licensed)i(under)g(the)g(Mozilla)f(Public)h -(License.)133 b(See)0 2224 y(h)n(ttp://www.mozilla.org/NPL/MPL-1.0.h)n -(tml)37 b(for)j(a)h(cop)n(y)f(of)g(the)i(license.)76 -b(Alternately)-7 b(,)44 b(y)n(ou)c(ma)n(y)g(use)g(libical)0 -2338 y(under)32 b(the)g(terms)g(of)g(the)g(GNU)h(Library)d(General)h -(Public)i(License.)50 b(See)32 b(h)n(ttp://www.fsf.org/cop)n -(yleft/lesser.h)n(tml)0 2451 y(for)27 b(a)g(cop)n(y)g(of)g(the)h(LGPL.) -0 2608 y(This)j(dual)g(license)f(ensures)h(that)g(the)g(library)f(can)g -(b)r(e)i(incorp)r(orated)d(in)n(to)i(b)r(oth)g(proprietary)e(co)r(de)i -(and)f(GPL'd)i(pro-)0 2721 y(grams,)23 b(and)h(will)h(b)r(ene\034t)g -(from)f(impro)n(v)n(emen)n(ts)e(made)i(b)n(y)g(programmers)e(in)i(b)r -(oth)h(realms.)34 b(I)25 b(will)f(only)g(accept)g(c)n(hanges)0 -2835 y(in)n(to)j(m)n(y)h(v)n(ersion)e(of)h(the)h(library)e(if)i(they)g -(are)f(similarly)f(dual-licensed.)0 3126 y Fb(1.3)112 -b(Example)37 b(Co)s(de)0 3336 y Ff(A)h(lot)f(of)h(the)g(do)r(cumen)n -(tation)f(for)g(this)h(library)e(is)i(in)g(the)g(form)f(of)g(example)g -(co)r(de.)67 b(These)37 b(examples)g(are)g(in)h(the)0 -3450 y("examples")26 b(directory)g(of)i(the)g(distribution.)36 -b(Also)28 b(lo)r(ok)e(in)i("src/test")e(for)h(additional)g(annotated)g -(examples.)0 3788 y Fe(2)131 b(Building)46 b(the)e(Library)0 -4027 y Ff(Libical)33 b(uses)h(auto)r(conf)f(to)h(generate)e(mak)n -(e\034les.)55 b(It)34 b(should)g(built)g(with)g(no)g(adjustmen)n(ts)g -(on)f(Lin)n(ux,)j(F)-7 b(reeBSD)33 b(and)0 4141 y(Solaris)22 -b(under)i(gcc.)34 b(Some)24 b(v)n(ersion)e(ha)n(v)n(e)g(b)r(een)i -(successfully)f(b)r(een)h(build)g(on)f(MacOS,)g(Solaris,)g(UnixW)-7 -b(are,)24 b(And)g(T)-7 b(ru64)0 4254 y(UNIX)28 b(without)g(gcc,)f(but)i -(y)n(ou)d(ma)n(y)h(run)h(in)n(to)f(problems)g(with)h(a)f(particular)f -(later)h(v)n(ersion.)0 4411 y(F)-7 b(or)27 b(a)g(more)g(complete)g -(guide)h(to)f(building)h(the)g(library)-7 b(,)26 b(see)h(the)h(README)i -(\034le)e(in)f(the)h(distribution.)0 4749 y Fe(3)131 -b(Structure)0 4988 y Ff(The)28 b(iCal)f(calendar)f(mo)r(del)i(is)f -(based)g(on)h(four)f(t)n(yp)r(es)g(of)h(ob)5 b(jects:)36 -b(comp)r(onen)n(ts,)27 b(prop)r(erties,)g(v)-5 b(alues)27 -b(and)g(parameters.)0 5144 y(Prop)r(erties)32 b(are)f(the)i(fundamen)n -(tal)f(unit)i(of)e(information)g(in)g(iCal,)i(and)e(they)g(w)n(ork)f(a) -h(bit)h(lik)n(e)f(a)g(hash)g(en)n(try)-7 b(,)34 b(with)e(a)0 -5258 y(constan)n(t)21 b(k)n(ey)h(and)g(a)f(v)-5 b(ariable)21 -b(v)-5 b(alue.)35 b(Prop)r(erties)21 b(ma)n(y)h(also)f(ha)n(v)n(e)g(mo) -r(di\034ers,)h(called)g(parameters.)33 b(In)22 b(the)h(iCal)f(con)n -(ten)n(t)0 5371 y(line)p eop -%%Page: 4 4 -4 3 bop 0 -167 3900 5 v 0 -200 a Fd(3.)73 b(Structure)3313 -b Ff(4)0 162 y Fc(ORGANIZER;ROLE=C)o(HA)o(IR:)o(MA)o(IL)o(TO:)o(mr)o -(bi)o(g@h)o(os)o(t.)o(com)0 401 y Ff(The)34 b(prop)r(ert)n(y)f(name)h -(is)g("OR)n(GANIZER,")g(the)g(v)-5 b(alue)34 b(of)h(the)f(prop)r(ert)n -(y)f(is)h("mrbig@host.com")e(and)i(the)g("R)n(OLE")0 -515 y(parameter)26 b(sp)r(eci\034es)h(that)h(Mr)g(Big)f(is)g(the)h(c)n -(hair)e(of)i(the)g(meetings)f(asso)r(ciated)f(with)i(this)g(prop)r(ert) -n(y)-7 b(.)0 671 y(Comp)r(onen)n(ts)26 b(are)f(groups)g(of)h(prop)r -(erties)f(that)i(represen)n(t)e(the)i(core)e(ob)5 b(jects)26 -b(of)g(a)g(calendar)f(system,)h(suc)n(h)g(as)g(ev)n(en)n(ts)f(or)0 -785 y(timezones.)36 b(Comp)r(onen)n(ts)27 b(are)g(delimited)h(b)n(y)g -("BEGIN")f(and)g("END")h(tags.)0 941 y(When)g(a)f(comp)r(onen)n(t)g(is) -h(sen)n(t)f(across)f(a)h(net)n(w)n(ork,)f(if)i(it)g(is)g(un-encrypted,) -f(it)h(will)g(lo)r(ok)f(something)g(lik)n(e:)0 1181 y -Fc(BEGIN:VCALENDAR)0 1294 y(METHOD:REQUEST)0 1408 y(PRODID:)41 -b(-//hacksw/handc)o(al)o(//N)o(ON)o(SG)o(ML)c(v1.0//EN)0 -1521 y(BEGIN:VEVENT)0 1635 y(DTSTAMP:19980309)o(T2)o(310)o(00)o(Z)0 -1749 y(UID:guid-1.host1)o(.c)o(om)0 1862 y(ORGANIZER;ROLE=C)o(HA)o(IR:) -o(MA)o(IL)o(TO:)o(mr)o(bi)o(g@h)o(os)o(t.)o(com)0 1976 -y(ATTENDEE;RSVP=TR)o(UE)o(;RO)o(LE)o(=R)o(EQ-)o(PA)o(RT)o(ICI)o(PA)o -(NT)o(;CU)o(TY)o(PE)o(=GR)o(OU)o(P:)87 2089 y(MAILTO:employee-)o(A@h)o -(os)o(t.)o(com)0 2203 y(DESCRIPTION:Proj)o(ec)o(t)h(XYZ)k(Review)f -(Meeting)0 2317 y(CATEGORIES:MEETI)o(NG)0 2430 y(CLASS:PUBLIC)0 -2544 y(CREATED:19980309)o(T1)o(300)o(00)o(Z)0 2657 y(SUMMARY:XYZ)e -(Project)i(Review)0 2771 y(DTSTART;TZID=US-)o(Ea)o(ste)o(rn)o(:1)o(998) -o(03)o(12)o(T08)o(30)o(00)0 2884 y(DTEND;TZID=US-Ea)o(st)o(ern)o(:1)o -(99)o(803)o(12)o(T0)o(930)o(00)0 2998 y(LOCATION:1CP)d(Conference)i -(Room)i(4350)0 3112 y(END:VEVENT)0 3225 y(END:VCALENDAR)0 -3465 y Ff(Note)28 b(that)h(comp)r(onen)n(ts)f(can)g(b)r(e)h(nested;)g -(this)g(example)e(has)h(b)r(oth)h(a)f(V)n(CALEND)n(AR)i(and)e(a)g -(VEVENT)i(comp)r(onen)n(t,)0 3578 y(one)d(nested)h(inside)f(the)h -(other.)0 3870 y Fb(3.1)112 b(Core)37 b(iCal)f(classes)0 -4080 y Ff(Libical)25 b(is)h(an)g(ob)5 b(ject-based,)25 -b(data-orien)n(ted)f(library)-7 b(.)34 b(Nearly)25 b(all)h(of)g(the)g -(routines)f(in)h(the)g(library)e(are)h(asso)r(ciated)g(with)0 -4193 y(an)e(opaque)g(data)f(t)n(yp)r(es)i(and)f(p)r(erform)g(some)g(op) -r(eration)f(on)h(that)h(data)e(t)n(yp)r(e.)36 b(Although)24 -b(the)f(library)f(do)r(es)h(not)h(actually)0 4307 y(ha)n(v)n(e)32 -b(classes,)h(w)n(e)g(will)g(use)g(those)g(terms)f(since)h(the)h(b)r -(eha)n(vior)d(of)i(these)g(asso)r(ciations)e(of)j(data)e(and)h -(routines)f(is)h(v)n(ery)0 4420 y(similar)27 b(to)g(a)g(class.)0 -4693 y Fd(3.1.1)94 b(Prop)s(erties)0 4903 y Ff(Prop)r(erties)23 -b(are)g(represen)n(ted)f(with)j(the)f(icalprop)r(ert)n(y)e(class)h(and) -g(its)h(man)n(y)f("deriv)n(ed")f(classes)g(with)j(on)e("deriv)n(ed")f -(class)0 5017 y(p)r(er)35 b(prop)r(ert)n(y)g(t)n(yp)r(e)g(in)h(RF)n -(C2445.)59 b(Again,)37 b(there)e(is)h(no)f(actual)g(inheritance)g -(relations,)h(but)g(there)g(are)e(clusters)h(of)0 5130 -y(routines)27 b(that)h(mak)n(e)e(this)i(term)g(useful.)37 -b(A)28 b(prop)r(ert)n(y)e(is)i(a)f(con)n(tainer)f(for)h(a)g(single)g(v) --5 b(alue)28 b(and)f(a)g(set)h(of)f(parameters.)p eop -%%Page: 5 5 -5 4 bop 0 -167 3900 5 v 0 -200 a Fd(3.)73 b(Structure)3313 -b Ff(5)0 162 y Fd(3.1.2)94 b(Comp)s(onen)m(ts)0 372 y -Ff(In)29 b(libical,)f(comp)r(onen)n(ts)g(are)g(represen)n(ted)f(with)i -(the)g(icalcomp)r(onen)n(t)e(class.)39 b(Icalcomp)r(onen)n(t)27 -b(is)i(a)f(con)n(tainer)f(for)h(a)g(set)0 485 y(of)g(other)e(comp)r -(onen)n(ts)h(and)h(prop)r(erties.)0 758 y Fd(3.1.3)94 -b(V)-8 b(alues)0 968 y Ff(V)h(alues)29 b(are)g(represen)n(ted)f(in)i(a) -f(similar)f(w)n(a)n(y)g(to)i(prop)r(erties;)f(a)g(base)g(class)g(and)g -(man)n(y)g("deriv)n(ed)f(")h(classes.)41 b(A)30 b(v)-5 -b(alue)29 b(is)0 1082 y(essen)n(tially)d(a)i(abstract)e(handle)i(on)f -(a)g(single)g(fundamen)n(tal)h(t)n(yp)r(e,)f(a)h(structure)f(or)f(a)h -(union.)0 1354 y Fd(3.1.4)94 b(P)m(arameters)0 1564 y -Ff(P)n(arameters)26 b(are)g(represetned)h(in)h(a)f(similar)g(w)n(a)n(y) -f(to)i(prop)r(erties,)e(except)i(that)g(they)f(con)n(tain)g(only)g(one) -g(v)-5 b(alue)0 1856 y Fb(3.2)112 b(Other)37 b(elemen)m(ts)g(of)g -(libical)0 2066 y Ff(In)26 b(addition)f(to)h(the)g(core)e(iCal)h -(classes,)g(libical)g(has)g(man)n(y)g(other)g(t)n(yp)r(es,)h -(structures,)g(classes)e(that)i(aid)f(in)h(creating)e(and)0 -2179 y(using)j(iCal)g(comp)r(onen)n(ts.)0 2452 y Fd(3.2.1)94 -b(En)m(umerations)30 b(and)i(t)m(yp)s(es)0 2662 y Ff(Libical)h(is)f -(strongly)g(t)n(yp)r(ed,)i(so)r(o)e(ev)n(ery)g(comp)r(onen)n(t,)i(prop) -r(ert)n(y)-7 b(,)33 b(parameter,)g(and)f(v)-5 b(alue)33 -b(t)n(yp)r(e)g(has)g(an)f(en)n(umeration,)0 2776 y(and)27 -b(some)g(ha)n(v)n(e)g(an)g(asso)r(ciated)f(structure)h(or)g(union.)0 -3048 y Fd(3.2.2)94 b(The)32 b(parser)0 3258 y Ff(The)20 -b(libical)f(parser)f(o\033ers)h(a)g(v)-5 b(ariet)n(y)19 -b(of)h(w)n(a)n(ys)e(to)h(con)n(v)n(ert)f(RF)n(C2445)g(text)i(in)n(to)g -(a)f(libical)g(iinsteral)g(comp)r(onen)n(t)h(structure.)0 -3372 y(the)28 b(parser)e(can)h(parse)f(blo)r(c)n(ks)h(of)h(text)g(as)f -(a)g(string,)g(or)f(it)i(can)g(parse)e(lin-b)n(y-line.)0 -3645 y Fd(3.2.3)94 b(Error)32 b(ob)5 b(jects)0 3855 y -Ff(Libical)27 b(has)g(a)g(substan)n(tial)g(error)f(rep)r(orting)g -(system)i(for)f(b)r(oth)h(programming)d(errors)g(and)j(comp)r(onen)n(t) -f(usage)f(errors.)0 4127 y Fd(3.2.4)94 b(Memory)30 b(Managemen)m(t)0 -4337 y Ff(Since)38 b(man)n(y)g(of)h(libicals)e(in)n(terfaces)h(return)g -(strings,)i(the)e(library)f(has)h(its)h(o)n(wn)e(memory)h(managemen)n -(t)f(system)h(to)0 4451 y(elimiate)28 b(the)g(need)f(to)h(free)f(ev)n -(ery)f(string)h(returned)g(from)g(the)h(libraru.)0 4724 -y Fd(3.2.5)94 b(Storage)32 b(classes)0 4934 y Ff(The)c(library)e(also)g -(o\033ers)h(sev)n(eral)f(classes)g(to)h(store)g(comp)r(onen)n(ts)g(to)g -(\035ies,)h(memory)f(or)f(databases.)p eop -%%Page: 6 6 -6 5 bop 0 -167 3900 5 v 0 -200 a Fd(4.)73 b(Di\033erences)31 -b(F)-8 b(rom)31 b(RF)m(Cs)2732 b Ff(6)0 162 y Fe(4)131 -b(Di\033erences)44 b(F)-11 b(rom)43 b(RF)l(Cs)0 400 y -Ff(Libical)c(has)f(b)r(een)h(designed)g(to)f(follo)n(w)h(the)g -(standards)e(as)i(closely)f(as)g(p)r(ossible,)j(so)e(that)g(the)g(k)n -(ey)f(ob)5 b(jects)39 b(in)g(the)0 514 y(standards)32 -b(are)g(also)g(k)n(ey)g(ob)5 b(jects)33 b(in)g(the)h(library)-7 -b(.)52 b(Ho)n(w)n(ev)n(er,)32 b(there)h(are)f(a)h(few)g(areas)f(where)g -(the)i(sp)r(eci\034cations)e(are)0 628 y(\(arguably\))e(irregular,)h -(and)g(follo)n(wing)g(them)h(exactly)f(w)n(ould)g(result)h(in)g(an)f -(unfriendly)h(in)n(terface.)49 b(These)31 b(deviations)0 -741 y(mak)n(e)c(libical)g(easier)f(to)i(use)f(b)n(y)h(main)n(taining)e -(a)h(self-similar)g(in)n(terface.)0 1033 y Fb(4.1)112 -b(Pseudo)38 b(Comp)s(onen)m(ts)0 1243 y Ff(Libical)29 -b(de\034nes)g(comp)r(onen)n(ts)g(for)g(groups)f(of)h(prop)r(erties)f -(that)i(lo)r(ok)f(and)g(act)g(lik)n(e)g(comp)r(onen)n(ts,)g(but)h(are)e -(not)i(de\034ned)0 1356 y(as)e(comp)r(onen)n(ts)h(in)g(the)g(sp)r -(eci\034cation.)41 b(XD)n(A)-7 b(YLIGHT)30 b(and)f(XST)-7 -b(AND)n(ARD)30 b(are)e(notable)h(examples.)40 b(These)29 -b(pseudo)0 1470 y(comp)r(onen)n(ts)d(group)f(prop)r(erties)g(within)i -(the)g(VTIMEZONE)g(comp)r(onen)n(ts.)36 b(F)-7 b(or)25 -b(instanace,)h(the)h(timezone)f(prop)r(erties)0 1583 -y(asso)r(ciated)f(with)i(da)n(yligh)n(t)e(sa)n(vings)g(time)i(starts)e -(with)i("BEGIN:D)n(A)-7 b(YLIGHT")27 b(and)f(ends)h(with)f("END:D)n(A) --7 b(YLIGHT,)0 1697 y(just)32 b(lik)n(e)g(other)f(comp)r(onen)n(ts,)h -(but)g(is)g(not)g(de\034ned)g(as)f(a)g(comp)r(onen)n(t)g(in)h(RF)n -(C2445.)48 b(\()32 b(See)f(RF)n(C2445,)g(page)g(61)g(\))h(In)0 -1811 y(Libical,this)d(grouping)e(is)i(represen)n(ted)e(b)n(y)i(the)g -(XD)n(A)-7 b(YLIGHT)30 b(comp)r(onen)n(t.)41 b(Standard)28 -b(iCAL)h(comp)r(onen)n(ts)f(all)h(start)0 1924 y(with)f(the)g(letter)g -("V,")f(while)g(pseudo)g(comp)r(onen)n(ts)g(start)g(with"X.")0 -2081 y(There)22 b(are)g(also)g(pseudo)h(comp)r(onen)n(ts)f(that)h(are)f -(conceptually)g(deriv)n(ed)g(classes)g(of)h(V)-9 b(ALARM.)23 -b(RF)n(C2446)e(de\034nes)i(what)0 2194 y(prop)r(erties)g(ma)n(y)h(b)r -(e)g(included)h(in)f(eac)n(h)g(comp)r(onen)n(t,)g(and)g(for)g(V)-9 -b(ALARM,)25 b(the)f(set)g(of)h(prop)r(erties)e(it)h(ma)n(y)g(ha)n(v)n -(e)f(dep)r(ends)0 2308 y(on)k(the)h(v)-5 b(alue)28 b(of)f(the)h(A)n -(CTION)f(prop)r(ert)n(y)-7 b(.)0 2464 y(F)g(or)19 b(instance,)j(if)e(a) -g(V)-9 b(ALARM)20 b(comp)r(onen)n(t)g(has)f(an)h(A)n(CTION)g(prop)r -(ert)n(y)e(with)j(the)f(v)-5 b(alue)20 b(of)g("A)n(UDIO,")f(the)h(comp) -r(onen)n(t)0 2578 y(m)n(ust)h(also)g(ha)n(v)n(e)f(an)h("A)-7 -b(TT)g(A)n(CH")21 b(prop)r(ert)n(y)-7 b(.)34 b(Ho)n(w)n(ev)n(er,)20 -b(if)i(the)g(A)n(CTION)f(v)-5 b(alue)21 b(is)g("DISPLA)-7 -b(Y,")22 b(the)g(comp)r(onen)n(t)f(m)n(ust)0 2691 y(ha)n(v)n(e)26 -b(a)i(DESCRIPTION)g(prop)r(ert)n(y)-7 b(.)0 2848 y(T)g(o)28 -b(handle)g(these)g(v)-5 b(arious,)27 b(complex)h(restrictions,)f -(libical)h(has)g(pseudo)g(comp)r(onen)n(ts)f(for)h(eac)n(h)f(t)n(yp)r -(e)i(of)f(alarm:)37 b(XA)n(U-)0 2961 y(DIO)n(ALARM,)28 -b(XDISPLA)-7 b(Y)g(ALARM,)30 b(XEMAILALARM)f(and)f(XPR)n(OCEDUREALARM.) -0 3253 y Fb(4.2)112 b(Com)m(bined)37 b(V)-9 b(alues)0 -3463 y Ff(Man)n(y)34 b(v)-5 b(alues)34 b(can)g(tak)n(e)g(more)g(than)g -(one)h(t)n(yp)r(e.)58 b(TRIGGER,)35 b(for)f(instance,)i(can)e(ha)n(v)n -(e)g(a)g(v)-5 b(alue)34 b(t)n(yp)r(e)h(of)g(with)g(DU-)0 -3577 y(RA)-7 b(TION)32 b(or)f(of)h(D)n(A)-7 b(TE-TIME.)33 -b(These)f(m)n(ultiple)g(t)n(yp)r(es)g(mak)n(e)f(it)i(di\036cult)g(to)e -(create)g(routines)h(to)f(return)h(the)g(v)-5 b(alue)0 -3690 y(asso)r(ciated)26 b(with)i(a)f(prop)r(ert)n(y)-7 -b(.)0 3847 y(It)29 b(is)g(natural)f(to)h(ha)n(v)n(e)f(in)n(terfaces)g -(that)h(w)n(ould)f(return)h(the)g(v)-5 b(alue)29 b(of)f(a)h(prop)r(ert) -n(y)-7 b(,)28 b(but)i(it)f(is)g(cum)n(b)r(ersome)f(for)g(a)h(single)0 -3960 y(routine)j(to)g(return)g(m)n(ultiple)h(t)n(yp)r(es.)51 -b(So,)33 b(in)g(libical,)g(prop)r(erties)e(that)i(can)f(ha)n(v)n(e)f(m) -n(ultiple)i(t)n(yp)r(es)f(are)f(giv)n(en)h(a)g(single)0 -4074 y(t)n(yp)r(e)26 b(that)g(is)g(the)g(union)g(of)g(their)g(RF)n -(C2445)e(t)n(yp)r(es.)36 b(F)-7 b(or)26 b(instance,)g(in)g(libical,)g -(the)g(v)-5 b(alue)26 b(of)g(the)g(TRIGGER)h(prop)r(ert)n(y)0 -4187 y(resolv)n(es)e(to)j(struct)f(icaltriggert)n(yp)r(e.)35 -b(This)28 b(t)n(yp)r(e)f(is)h(a)f(union)h(of)f(a)g(DURA)-7 -b(TION)29 b(and)e(a)g(D)n(A)-7 b(TE-TIME.)0 4479 y Fb(4.3)112 -b(Multi-V)-9 b(alued)36 b(Prop)s(erties)0 4689 y Ff(Some)31 -b(prop)r(erties,)h(suc)n(h)f(as)g(CA)-7 b(TEGORIES)33 -b(ha)n(v)n(e)d(only)h(one)g(v)-5 b(alue)32 b(t)n(yp)r(e,)h(but)f(eac)n -(h)e(CA)-7 b(TEGORIES)33 b(prop)r(ert)n(y)d(can)0 4803 -y(ha)n(v)n(e)24 b(m)n(ultiple)h(v)-5 b(alue)25 b(instances.)35 -b(This)25 b(also)f(results)g(in)h(a)g(cum)n(b)r(ersome)f(in)n(terface)g -(\025)g(CA)-7 b(TEGORIES)26 b(accessors)d(w)n(ould)0 -4916 y(ha)n(v)n(e)k(to)i(return)f(a)g(list)g(while)h(all)f(other)g -(accessors)e(returned)i(a)g(single)g(v)-5 b(alue.)39 -b(In)29 b(libical,)g(all)f(prop)r(erties)f(ha)n(v)n(e)h(a)g(single)0 -5030 y(v)-5 b(alue,)35 b(and)e(m)n(ulti-v)-5 b(alued)33 -b(prop)r(erties)f(are)h(brok)n(en)f(do)n(wn)g(in)n(to)h(m)n(ultiple)h -(single)f(v)-5 b(alued)33 b(prop)r(erties)g(during)f(parsing.)0 -5143 y(That)c(is,)f(an)g(input)i(line)e(lik)n(e,)0 5383 -y Fc(CATEGORIES:)39 b(work,)i(home)p eop -%%Page: 7 7 -7 6 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32 -b(libical)3190 b Ff(7)0 162 y(b)r(ecomes)27 b(in)h(libical's)f(in)n -(ternal)g(represen)n(tation)0 401 y Fc(CATEGORIES:)39 -b(work)0 515 y(CATEGORIES:)g(home)0 754 y Ff(Oddly)-7 -b(,)34 b(RF)n(C2445)d(allo)n(ws)g(some)h(m)n(ulti-v)-5 -b(alued)33 b(prop)r(erties)f(\()h(lik)n(e)g(FREEBUSY)h(\))f(to)g(exist) -g(as)f(b)r(oth)h(a)f(m)n(ulti-v)-5 b(alues)0 868 y(prop)r(ert)n(y)24 -b(and)h(as)f(m)n(ultiple)h(single)g(v)-5 b(alue)24 b(prop)r(erties,)h -(while)g(others)f(\()i(lik)n(e)e(CA)-7 b(TEGORIES)26 -b(\))f(can)g(only)g(exist)f(as)h(single)0 981 y(m)n(ulti-v)-5 -b(alued)32 b(prop)r(erties.)48 b(This)31 b(mak)n(es)g(the)h(in)n -(ternal)f(represen)n(tation)e(for)i(CA)-7 b(TEGORIES)33 -b(illegal.)48 b(Ho)n(w)n(ev)n(er)30 b(when)0 1095 y(y)n(ou)d(con)n(v)n -(ert)f(a)h(comp)r(onen)n(t)g(to)h(a)f(string,)g(the)h(library)e(will)i -(collect)f(all)g(of)h(the)g(CA)-7 b(TEGORIES)28 b(prop)r(erties)f(in)n -(to)g(one.)0 1433 y Fe(5)131 b(Using)44 b(libical)0 1691 -y Fb(5.1)112 b(Creating)37 b(Comp)s(onen)m(ts)0 1901 -y Ff(There)e(are)g(three)h(w)n(a)n(ys)e(to)i(create)e(comp)r(onen)n(ts) -i(in)g(Libical:)53 b(creating)34 b(individual)i(ob)5 -b(jects)35 b(and)h(assem)n(bling)e(them,)0 2015 y(building)28 -b(en)n(tire)f(ob)5 b(jects)27 b(in)h(massiv)n(e)e(v)-5 -b(aargs)26 b(calls,)h(and)g(parsing)f(a)h(text)h(\034le)g(con)n -(taining)e(iCalendar)h(data.)0 2287 y Fd(5.1.1)94 b(Constructor)32 -b(In)m(terfaces)0 2497 y Ff(Using)e(constructor)f(in)n(terfaces,)i(y)n -(ou)f(create)f(eac)n(h)h(of)h(the)g(ob)5 b(jects)30 b(separately)f(and) -i(then)g(assem)n(ble)e(them)i(in)g(to)g(com-)0 2611 y(p)r(onen)n(ts:)0 -2850 y Fc(icalcomponent)38 b(*event;)0 2964 y(icalproperty)g(*prop;)0 -3077 y(icalparameter)g(*param;)0 3191 y(struct)j(icaltimetype)e(atime;) -0 3305 y(event)i(=)j(icalcomponent_n)o(ew)o(\(IC)o(AL)o(_V)o(EVE)o(NT)o -(_C)o(OMP)o(ON)o(EN)o(T\);)0 3418 y(prop)e(=)h(icalproperty_new)o(_d)o -(tst)o(am)o(p\()o(ati)o(me)o(\))37 b(;)0 3532 y(icalcomponent_ad)o(d_)o -(pro)o(pe)o(rt)o(y\(e)o(ve)o(nt)o(,)h(prop\);)0 3645 -y(prop)k(=)h(icalproperty_new)o(_u)o(id\()o('')o(gu)o(id-)o(1.)o(ho)o -(st1)o(.c)o(om)o(''\))37 b(\);)0 3759 y(icalcomponent_ad)o(d_)o(pro)o -(pe)o(rt)o(y\(e)o(ve)o(nt)o(,pr)o(op)o(\);)0 3872 y(prop=icalpropert)o -(y_)o(new)o(_o)o(rg)o(ani)o(ze)o(r\()o(''m)o(rb)o(ig)o(@ho)o(st)o(.c)o -(om')o('\))o(;)0 3986 y(param)k(=)j(icalparameter_n)o(ew)o(_ro)o(le)o -(\(I)o(CAL)o(_R)o(OL)o(E_C)o(HA)o(IR)o(\))0 4100 y(icalproperty_add)o -(_p)o(ara)o(me)o(te)o(r\(p)o(ro)o(p,)37 b(param\);)0 -4213 y(icalcomponent_ad)o(d_)o(pro)o(pe)o(rt)o(y\(e)o(ve)o(nt)o(,pr)o -(op)o(\);)0 4453 y Ff(Notice)e(that)g(libical)g(uses)f(a)h(semi-ob)5 -b(ject-orien)n(ted)32 b(st)n(yle)j(of)g(in)n(terface.)58 -b(Most)34 b(things)h(y)n(ou)f(w)n(ork)f(with)j(are)e(ob)5 -b(jects,)0 4566 y(that)28 b(are)e(instan)n(tiated)h(with)h(a)f -(constructor)f(that)i(has)f("new")g(in)g(the)h(name.)37 -b(Also)27 b(note)g(that,)h(other)f(than)g(the)h(ob)5 -b(ject)0 4680 y(reference,)30 b(most)g(structure)f(data)h(is)g(passed)f -(in)h(to)g(libical)g(routines)f(b)n(y)h(v)-5 b(alue.)44 -b(Libical)30 b(has)g(some)f(complex)h(but)g(v)n(ery)0 -4793 y(regular)c(memory)g(handling)i(rules.)36 b(These)27 -b(are)g(detailed)g(in)h(section)f(5.5)g(\(\).)0 4950 -y(If)33 b(an)n(y)e(of)h(the)h(constructors)d(fail,)k(they)f(will)f -(return)g(0.)50 b(If)33 b(y)n(ou)f(try)g(to)g(insert)g(0)f(in)n(to)h(a) -g(prop)r(ert)n(y)f(or)h(comp)r(onen)n(t,)h(or)0 5063 -y(use)j(a)g(zero-v)-5 b(alued)34 b(ob)5 b(ject)36 b(reference,)h -(libical)f(will)h(either)f(silen)n(tly)f(ignore)g(the)i(error)d(or)h -(will)h(ab)r(ort)g(with)g(an)g(error)0 5177 y(message.)61 -b(This)36 b(b)r(eha)n(vior)e(is)i(con)n(trolled)f(b)n(y)g(a)h(compile)g -(time)g(\035ag)f(\(ICAL_ERR)n(ORS_ARE_F)-9 b(A)i(T)g(AL\),)37 -b(and)f(will)0 5291 y(ab)r(ort)27 b(b)n(y)g(default.)p -eop -%%Page: 8 8 -8 7 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32 -b(libical)3190 b Ff(8)0 162 y Fd(5.1.2)94 b(v)-5 b(aargs)32 -b(Constructors)0 372 y Ff(There)24 b(is)g(another)g(w)n(a)n(y)f(to)i -(create)e(complex)h(comp)r(onen)n(ts,)h(whic)n(h)f(is)h(arguably)d -(more)i(elegan)n(t,)g(if)h(y)n(ou)f(are)g(not)g(horri\034ed)0 -485 y(b)n(y)k(v)-5 b(arargs.)35 b(The)28 b(v)-5 b(arargs)26 -b(constructor)g(in)n(terface)i(allo)n(ws)e(y)n(ou)i(to)f(create)h(in)n -(tricate)f(comp)r(onen)n(ts)g(in)i(a)e(single)h(blo)r(c)n(k)f(of)0 -599 y(co)r(de.)37 b(Here)27 b(is)g(the)h(previous)f(examples)f(in)i -(the)g(v)-5 b(aargs)26 b(st)n(yle.)174 830 y Fc(calendar)40 -b(=)349 943 y(icalcomponent_v)o(an)o(ew\()523 1057 y(ICAL_VCALENDAR_C)o -(OM)o(PO)o(NEN)o(T,)523 1171 y(icalproperty_new)o(_v)o(er)o(sio)o(n\()o -('')o(2.0)o('')o(\),)523 1284 y(icalproperty_new)o(_p)o(ro)o(did)o(\() -741 1398 y(''-//RDU)g(Software//NONSGM)o(L)d(HandCal//EN''\),)523 -1511 y(icalcomponent_va)o(ne)o(w\()697 1625 y(ICAL_VEVENT_COMP)o(ONE)o -(NT)o(,)697 1738 y(icalproperty_new)o(_dt)o(st)o(am)o(p\(a)o(ti)o(me)o -(\),)697 1852 y(icalproperty_new)o(_ui)o(d\()o('')o(gui)o(d-)o(1.)o -(hos)o(t1)o(.co)o(m')o('\))o(,)697 1966 y(icalproperty_van)o(ew_)o(or)o -(ga)o(niz)o(er)o(\()872 2079 y(''mrbig@host.co)o(m')o('\))o(,)872 -2193 y(icalparameter_n)o(ew)o(_r)o(ole)o(\(I)o(CA)o(L_R)o(OL)o(E_C)o -(HA)o(IR)o(\),)872 2306 y(0)872 2420 y(\),)697 2533 y(icalproperty_van) -o(ew_)o(at)o(te)o(nde)o(e\()872 2647 y(''employee-A@ho)o(st)o(.c)o(om') -o(',)872 2761 y(icalparameter_n)o(ew)o(_r)o(ole)o(\()1046 -2874 y(ICAL_ROLE_REQPA)o(RTI)o(CI)o(PA)o(NT\))o(,)872 -2988 y(icalparameter_n)o(ew)o(_r)o(svp)o(\(1)o(\),)872 -3101 y(icalparameter_n)o(ew)o(_c)o(uty)o(pe)o(\(I)o(CAL)o(_C)o(UTY)o -(PE)o(_G)o(ROU)o(P\))o(,)872 3215 y(0)872 3328 y(\),)697 -3442 y(icalproperty_new)o(_lo)o(ca)o(ti)o(on\()828 3556 -y(1CP)42 b(Conference)e(Room)h(4350\),)697 3669 y(0)697 -3783 y(\),)523 3896 y(0)523 4010 y(\);)0 4241 y Ff(This)30 -b(form)f(is)h(similar)f(to)h(the)g(constructor)f(form)g(,)i(except)f -(that)g(the)g(constructors)e(ha)n(v)n(e)h("v)-5 b(anew")29 -b(instead)g(of)h("new")0 4354 y(in)38 b(the)f(name.)66 -b(The)37 b(argumen)n(ts)f(are)h(similar)f(to)r(o,)k(except)d(that)g -(the)h(comp)r(onen)n(t)f(constructor)f(can)h(ha)n(v)n(e)f(a)h(list)g -(of)0 4468 y(prop)r(erties,)26 b(and)i(the)f(prop)r(ert)n(y)g -(constructor)e(can)i(ha)n(v)n(e)g(a)g(list)g(of)h(parameters.)35 -b(Be)27 b(sure)f(to)i(terminate)f(ev)n(ery)f(list)i(with)0 -4582 y(a)f('0',)h(or)e(y)n(our)g(co)r(de)i(will)g(crash,)e(if)i(y)n(ou) -f(are)g(luc)n(ky)-7 b(.)0 4853 y Fd(5.1.3)94 b(P)m(arsing)32 -b(T)-8 b(ext)32 b(Files)0 5063 y Ff(The)g(\034nal)g(w)n(a)n(y)f(to)h -(create)f(comp)r(onen)n(ts)h(will)g(probably)f(b)r(e)h(the)h(most)f -(common;)i(y)n(ou)d(can)h(create)f(comp)r(onen)n(ts)g(from)0 -5176 y(RF)n(C2445)26 b(complian)n(t)h(text.)37 b(If)28 -b(y)n(ou)f(ha)n(v)n(e)f(the)i(string)f(in)h(memory)-7 -b(,)26 b(use)0 5407 y Fc(icalcomponent*)38 b(icalparser_pars)o(e_)o -(str)o(in)o(g\()o(cha)o(r*)f(str\);)p eop -%%Page: 9 9 -9 8 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32 -b(libical)3190 b Ff(9)0 162 y(If)38 b(the)g(string)f(con)n(tains)f -(only)h(one)h(comp)r(onen)n(t,)h(the)f(parser)e(will)i(return)f(the)h -(comp)r(onen)n(t)f(in)h(libical)f(form.)67 b(If)38 b(the)0 -275 y(string)45 b(con)n(tains)g(m)n(ultiple)h(comp)r(onen)n(ts,)k(the)c -(m)n(ultiple)g(comp)r(onen)n(ts)f(will)h(b)r(e)g(returned)f(as)g(the)h -(c)n(hildren)g(of)f(an)0 389 y(ICAL_XR)n(OOT_COMPONENT)26 -b(comp)r(onen)n(t.)0 545 y(P)n(arsing)h(a)h(whole)g(string)f(ma)n(y)h -(seem)g(w)n(asteful)f(if)i(y)n(ou)f(w)n(an)n(t)f(to)h(pull)h(a)f(large) -e(comp)r(onen)n(t)i(o\033)h(of)f(the)g(net)n(w)n(ork)f(or)g(from)0 -659 y(a)g(\034le;)h(y)n(ou)f(ma)n(y)g(prefer)g(to)g(parse)f(the)i(comp) -r(onen)n(t)g(line)f(b)n(y)h(line.)37 b(This)27 b(is)h(p)r(ossible)f(to) -r(o)g(b)n(y)g(using:)0 898 y Fc(icalparser*)39 b(icalparser_new\(\))o -(;)0 1012 y(void)j(icalparser_free\()o(ic)o(al)o(par)o(se)o(r*)37 -b(parser\);)0 1125 y(icalparser_get_l)o(in)o(e\(p)o(ar)o(se)o(r,r)o(ea) -o(d_)o(str)o(ea)o(m\))o(;)0 1239 y(icalparser_add_l)o(in)o(e\(p)o(ar)o -(se)o(r,l)o(in)o(e\))o(;)0 1353 y(icalparser_set_g)o(en)o(_da)o(ta)o -(\(p)o(ars)o(er)o(,s)o(tre)o(am)o(\))0 1592 y Ff(These)21 -b(routines)f(will)i(construct)f(a)f(parser)g(ob)5 b(ject)21 -b(to)g(whic)n(h)g(y)n(ou)g(can)g(add)g(lines)g(of)g(input)h(and)f -(retriev)n(e)f(an)n(y)h(comp)r(onen)n(ts)0 1705 y(that)32 -b(the)g(parser)f(creates)f(from)i(the)g(input.)51 b(These)31 -b(routines)g(w)n(ork)g(b)n(y)g(sp)r(eci\034ng)h(an)g(adaptor)e(routine) -h(to)h(get)g(string)0 1819 y(data)27 b(from)g(a)g(source.)36 -b(F)-7 b(or)27 b(an)g(example:)0 2058 y Fc(char*)41 b -(read_stream\(char)c(*s,)43 b(size_t)e(size,)g(void)h(*d\))87 -2286 y(char)g(*c)h(=)g(fgets\(s,size,)38 b(\(FILE*\)d\);)87 -2399 y(return)j(c;)0 2626 y(main\(\))87 2740 y(char*)h(line;)87 -2853 y(icalcomponent)c(*c;)87 2967 y(icalparser)h(*parser)i(=)i -(icalparser_new\(\))o(;)87 3081 y(FILE*)f(stream)f(=)i -(fopen\(argv1,r\);)87 3194 y(icalparser_set_g)o(en_)o(da)o(ta)o(\(pa)o -(rs)o(er)o(,st)o(re)o(am)o(\);)87 3308 y(do)174 3421 -y(line)f(=)h(icalparser_get_li)o(ne)o(\(p)o(ars)o(er)o(,r)o(ead)o(_s)o -(tr)o(eam)o(\);)174 3535 y(c)g(=)h(icalparser_add_)o(li)o(ne\()o(pa)o -(rs)o(er,)o(li)o(ne)o(\);)174 3648 y(if)f(\(c)g(!=)f(0\))218 -3762 y(printf\(s,icalcom)o(po)o(ne)o(nt_)o(as)o(_i)o(cal)o(_s)o(tr)o -(ing)o(\(c)o(\)\))o(;)218 3876 y(icalparser_claim)o(\(p)o(ar)o(ser)o -(\);)218 3989 y(printf\(n--------)o(--)o(--)o(---)o(n\))o(;)218 -4103 y(icalcomponent_fr)o(ee)o(\(c)o(\);)131 4330 y(while)f(\()i(line)f -(!=)h(0\);)0 4569 y Ff(The)48 b(parser)f(ob)5 b(ject)48 -b(parameterizes)f(the)i(routine)f(used)g(to)g(get)h(input)g(lines)f -(with)h(icalparser_set_gen_data\(\))0 4683 y -(andicalparser_get_line\(\).)81 b(In)44 b(this)f(example,)k(the)d -(routine)f(read_stream\(\))e(will)j(fetc)n(h)g(the)f(next)h(line)g -(from)e(a)0 4796 y(stream,)51 b(with)d(the)f(stream)g(passed)f(in)h(as) -g(the)g(v)n(oid*)f(parameter)f(d.)96 b(The)47 b(parser)f(calls)g -(read_stream\(\))f(from)0 4910 y(icalparser_get_line\(\),)e(but)g(it)g -(also)e(needs)h(to)h(kno)n(w)e(what)h(stream)g(to)g(use.)81 -b(This)42 b(is)h(set)f(b)n(y)g(the)h(call)f(to)g(ical-)0 -5024 y(parser_set_gen_data\(\).)64 b(By)37 b(using)g(a)h(di\033eren)n -(t)f(routine)h(for)f(read_stream)e(or)i(passing)g(in)h(di\033eren)n(t)f -(data)h(with)0 5137 y(icalparser_set_gen_data,)23 b(y)n(ou)k(can)g -(connect)g(to)h(an)n(y)e(data)i(source.)0 5294 y(Using)g(the)h(same)e -(mec)n(hanism,)h(other)g(implemen)n(tations)g(could)g(read)f(from)h -(memory)g(bu\033ers,)g(so)r(c)n(k)n(ets)f(or)g(other)h(in)n(ter-)0 -5407 y(faces.)p eop -%%Page: 10 10 -10 9 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32 -b(libical)3149 b Ff(10)0 162 y(Since)28 b(the)g(example)f(co)r(de)g(is) -h(a)f(v)n(ery)f(common)h(w)n(a)n(y)f(to)i(use)f(the)h(parser,)e(there)i -(is)f(a)g(con)n(v)n(enience)f(routine;)0 401 y Fc(icalcomponent*)38 -b(icalparser_pars)o(e\()o(ica)o(lp)o(ar)o(ser)f(*parser,)654 -515 y(char*)k(\(*line_gen_func\))o(\(c)o(har)c(*s,)42 -b(size_t)f(size,)85 b(void*)42 b(d\)\))0 754 y Ff(T)-7 -b(o)36 b(use)h(this)g(routine,)i(y)n(ou)d(still)h(m)n(ust)g(construct)f -(the)h(parser)f(ob)5 b(ject)36 b(and)h(pass)f(in)h(a)f(reference)g(to)h -(a)f(line)h(reading)0 868 y(routine.)50 b(If)33 b(the)f(parser)f(can)h -(create)f(a)h(single)f(comp)r(onen)n(t)h(from)g(the)g(input,)i(it)f -(will)f(return)g(a)g(p)r(oin)n(ter)g(to)g(the)g(newly)0 -981 y(constructed)h(comp)r(onen)n(t.)54 b(If)34 b(the)g(parser)e(can)h -(construct)f(m)n(ultiple)i(comp)r(onen)n(ts)f(from)g(the)h(input,)i(it) -e(will)g(return)e(a)0 1095 y(reference)c(to)h(an)g(XR)n(OOT)g(comp)r -(onen)n(t)g(\()h(of)f(t)n(yp)r(e)g(ICAL_XR)n(OOT_COMPONENT.\))g(This)g -(XR)n(OOT)f(comp)r(onen)n(t)0 1209 y(will)g(hold)f(all)h(of)f(the)h -(comp)r(onen)n(ts)f(constructed)g(from)g(the)h(input)g(as)f(c)n -(hildren.)0 1500 y Fb(5.2)112 b(A)m(ccessing)37 b(Comp)s(onen)m(ts)0 -1710 y Ff(Giv)n(en)30 b(a)g(reference)f(to)i(a)e(comp)r(onen)n(t,)i(y)n -(ou)f(probably)f(will)h(w)n(an)n(t)g(to)g(access)f(the)i(prop)r -(erties,)f(parameters)e(and)j(v)-5 b(alues)0 1824 y(inside.)56 -b(Libical)34 b(in)n(terfaces)f(let)i(y)n(ou)e(\034nd)i(sub-comp)r(onen) -n(t,)g(add)e(and)h(remo)n(v)n(e)f(sub-comp)r(onen)n(ts,)i(and)e(do)h -(the)h(same)0 1937 y(three)27 b(op)r(erations)g(on)g(prop)r(erties.)0 -2210 y Fd(5.2.1)94 b(Finding)30 b(Comp)s(onen)m(ts)0 -2420 y Ff(T)-7 b(o)27 b(\034nd)h(a)f(sub-comp)r(onen)n(t)g(of)h(a)f -(comp)r(onen)n(t,)g(use:)0 2659 y Fc(icalcomponent*)38 -b(icalcomponent_g)o(et)o(_fi)o(rs)o(t_)o(com)o(po)o(ne)o(nt\()1525 -2773 y(icalcomponent*)g(component,)1525 2887 y(icalcomponent_ki)o(nd)f -(kind\);)0 3126 y Ff(This)27 b(routine)g(will)h(return)f(a)g(reference) -g(to)g(the)h(\034rst)f(comp)r(onen)n(t)g(of)h(the)f(t)n(yp)r(e)h -('kind.')37 b(The)28 b(k)n(ey)e(kind)i(v)-5 b(alues,)27 -b(listed)h(in)0 3240 y(icalen)n(ums.h)f(are:)0 3479 y -Fc(ICAL_ANY_COMPONE)o(NT)0 3593 y(ICAL_VEVENT_COMP)o(ON)o(ENT)0 -3706 y(ICAL_VTODO_COMPO)o(NE)o(NT)0 3820 y(ICAL_VJOURNAL_CO)o(MP)o(ONE) -o(NT)0 3933 y(ICAL_VCALENDAR_C)o(OM)o(PON)o(EN)o(T)0 -4047 y(ICAL_VFREEBUSY_C)o(OM)o(PON)o(EN)o(T)0 4161 y(ICAL_VALARM_COMP)o -(ON)o(ENT)0 4400 y Ff(These)g(are)g(only)g(the)h(most)f(common)g(comp)r -(onen)n(ts;)g(there)h(are)e(man)n(y)h(more)g(listed)h(in)g(icalen)n -(ums.h.)0 4557 y(As)h(y)n(ou)f(migh)n(t)h(guess,)g(if)g(there)g(is)g -(more)f(than)h(one)f(sub)r(comp)r(onen)n(t)h(of)g(the)h(t)n(yp)r(e)f(y) -n(ou)f(ha)n(v)n(e)g(c)n(hosen,)g(this)h(routine)g(will)0 -4670 y(return)e(only)g(the)h(\034rst.)37 b(to)27 b(get)h(at)f(the)h -(others,)f(y)n(ou)f(need)i(to)g(iterate)f(through)f(the)i(comp)r(onen)n -(t.)0 4943 y Fd(5.2.2)94 b(Iterating)32 b(Through)g(Comp)s(onen)m(ts)0 -5153 y Ff(Iteration)27 b(requires)f(a)h(second)g(routine)g(to)h(get)f -(the)h(next)g(sub)r(comp)r(onen)n(t)f(after)g(the)h(\034rst:)p -eop -%%Page: 11 11 -11 10 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32 -b(libical)3149 b Ff(11)0 162 y Fc(icalcomponent*)38 b(icalcomponent_g)o -(et)o(_ne)o(xt)o(_c)o(omp)o(on)o(en)o(t\()654 275 y(icalcomponent*)f -(component,)654 389 y(icalcomponent_k)o(in)o(d)h(kind\);)0 -610 y Ff(With)25 b(the)g('\034rst')f(and)g('next')h(routines,)g(y)n(ou) -e(can)h(create)g(a)g(for)f(lo)r(op)h(to)h(iterate)f(through)f(all)h(of) -h(a)f(comp)r(onen)n(ts)g(sub)r(com-)0 723 y(p)r(onen)n(ts)87 -944 y Fc(for\(c)42 b(=)h(icalcomponent_g)o(et_)o(fi)o(rs)o(t_c)o(om)o -(po)o(nen)o(t\()o(co)o(mp,)o(IC)o(AL_)o(AN)o(Y_)o(COM)o(PO)o(NE)o(NT\)) -o(;)392 1058 y(c)g(!=)g(0;)44 1171 y(c)g(=)g(icalcomponent_ge)o(t_)o -(ne)o(xt_)o(co)o(mp)o(one)o(nt)o(\(c)o(omp)o(,I)o(CA)o(L_A)o(NY)o(_CO)o -(MP)o(ON)o(ENT)o(\)\))261 1398 y(do_something\(c\);)0 -1619 y Ff(This)32 b(co)r(de)f(bit)h(wil)g(iterate)g(through)f(all)g(of) -h(the)g(sub)r(comp)r(onen)n(ts)f(in)h('comp')g(but)g(y)n(ou)f(can)g -(select)h(a)f(sp)r(eci\034c)h(t)n(yp)r(e)g(of)0 1733 -y(comp)r(onen)n(t)27 b(b)n(y)h(c)n(hanging)e(ICAL_ANY_COMPONENT)i(to)f -(another)g(comp)r(onen)n(t)g(t)n(yp)r(e.)0 2002 y Fd(5.2.3)94 -b(Using)31 b(Comp)s(onen)m(t)f(Iterators)0 2212 y Ff(The)h(iteration)f -(mo)r(del)h(in)h(the)f(previous)f(section)g(requires)g(the)h(comp)r -(onen)n(t)g(to)g(k)n(eep)f(the)i(state)f(of)g(the)g(iteration.)46 -b(So,)0 2326 y(y)n(ou)32 b(could)g(not)h(use)f(this)h(mo)r(del)g(to)f -(p)r(erform)g(a)g(sorting)f(op)r(erations,)i(since)f(y)n(ou'd)g(need)h -(t)n(w)n(o)f(iterators)f(and)h(there)g(is)0 2440 y(only)26 -b(space)h(for)f(one.)36 b(If)27 b(y)n(ou)f(ev)n(er)g(call)h(icalcomp)r -(onen)n(t_get_\034rst_comp)r(onen)n(t\(\))d(when)j(an)f(iteration)h(is) -f(in)h(progress,)0 2553 y(the)h(p)r(oin)n(ter)f(will)h(b)r(e)g(reset)f -(to)g(the)h(b)r(eginning.)0 2710 y(T)-7 b(o)28 b(solv)n(e)g(this)h -(problem,)g(there)f(are)g(also)g(external)f(iterators)h(for)g(comp)r -(onen)n(ts.)40 b(The)28 b(routines)g(asso)r(ciated)g(with)h(these)0 -2823 y(external)e(iterators)f(are:)0 3044 y Fc(icalcompiter)38 -b(icalcomponent_beg)o(in)o(_co)o(mp)o(on)o(ent)o(\(i)o(ca)o(lco)o(mp)o -(one)o(nt)o(*)f(component,)j(icalcomponent_k)o(ind)d(kind\);)0 -3158 y(icalcompiter)h(icalcomponent_end)o(_c)o(omp)o(on)o(en)o(t\(i)o -(ca)o(lc)o(omp)o(on)o(ent)o(*)f(component,)j(icalcomponent_k)o(in)o(d)e -(kind\);)0 3271 y(icalcomponent*)g(icalcompiter_ne)o(xt)o(\(ic)o(al)o -(co)o(mpi)o(te)o(r*)f(i\);)0 3385 y(icalcomponent*)h(icalcompiter_pr)o -(io)o(r\(i)o(ca)o(lc)o(omp)o(it)o(er)o(*)g(i\);)0 3498 -y(icalcomponent*)g(icalcompiter_de)o(re)o(f\(i)o(ca)o(lc)o(omp)o(it)o -(er)o(*)g(i\);)0 3719 y Ff(The)27 b(_b)r(egin_\(\))g(and)g(_end_\(\))g -(routines)g(return)g(a)g(new)g(iterator)f(that)h(p)r(oin)n(ts)g(to)h -(the)f(b)r(eginning)g(and)g(ending)h(of)f(the)0 3833 -y(list)36 b(of)f(sub)r(comp)r(onen)n(t)h(for)f(the)h(giv)n(en)f(comp)r -(onen)n(t,)i(and)e(the)h(kind)g(argumen)n(t)e(w)n(orks)g(lik)n(e)h(the) -h(kind)g(argumen)n(t)f(for)0 3946 y(in)n(ternal)27 b(iterators.)0 -4103 y(After)f(creating)e(an)h(iterators,)g(use)g(_next_\(\))g(and)h -(_prior_\(\))e(to)h(step)h(forw)n(ard)d(and)j(bac)n(kw)n(ard)d(through) -i(the)h(list)f(and)0 4216 y(get)30 b(the)g(comp)r(onen)n(t)g(that)g -(the)g(iterator)e(p)r(oin)n(ts)i(to,)h(and)e(use)h(_deref\(\))g(to)g -(return)f(the)h(comp)r(onen)n(t)g(that)g(the)g(iterator)0 -4330 y(p)r(oin)n(ts)c(to)g(without)h(mo)n(ving)e(the)i(iterator.)35 -b(All)27 b(routines)f(will)g(return)g(0)g(when)g(they)h(mo)n(v)n(e)e -(to)h(p)r(oin)n(t)h(o\033)f(the)h(end)f(of)h(the)0 4444 -y(list.)0 4600 y(Here)g(is)h(an)f(example)g(of)h(a)f(lo)r(op)g(using)g -(these)h(routines:)0 4821 y Fc(for\()131 4934 y(i)43 -b(=)g(icalcomponent_be)o(gi)o(n_c)o(om)o(po)o(nen)o(t\()o(im)o(pl-)o -(cl)o(us)o(ter)o(,I)o(CAL)o(_A)o(NY)o(_CO)o(MP)o(ON)o(ENT)o(\);)131 -5048 y(icalcompiter_de)o(ref)o(\(i)o(\)!)o(=)38 b(0;)131 -5162 y(icalcompiter_ne)o(xt\()o(i\))0 5275 y(\))261 5389 -y(icalcomponent)h(*this)i(=)i(icalcompiter_der)o(ef)o(\(i\))o(;)p -eop -%%Page: 12 12 -12 11 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32 -b(libical)3149 b Ff(12)0 162 y Fd(5.2.4)94 b(Remo)m(ving)29 -b(Comp)s(onen)m(ts)0 372 y Ff(Remo)n(ving)40 b(an)h(elemen)n(t)g(from)g -(a)g(list)g(while)h(iterating)e(through)h(the)g(list)h(with)f(the)h(in) -n(ternal)e(iterators)g(can)h(cause)0 485 y(problems,)20 -b(since)e(y)n(ou)g(will)h(probably)e(b)r(e)i(remo)n(ving)e(the)i -(elemen)n(t)g(that)g(the)g(in)n(ternal)f(iterator)f(p)r(oin)n(ts)h(to.) -34 b(The)19 b(_remo)n(v)n(e\(\))0 599 y(routine)24 b(will)g(k)n(eep)f -(the)i(iterator)d(v)-5 b(alid)24 b(b)n(y)g(mo)n(ving)f(it)h(to)g(the)h -(next)f(comp)r(onen)n(t,)g(but)h(in)f(a)g(normal)f(lo)r(op,)h(this)g -(will)g(result)0 712 y(in)k(t)n(w)n(o)f(adv)-5 b(ances)26 -b(p)r(er)i(iteration,)e(and)i(y)n(ou)f(will)g(remo)n(v)n(e)f(only)h(ev) -n(ery)f(other)h(comp)r(onen)n(t.)37 b(T)-7 b(o)27 b(a)n(v)n(oid)f(the)i -(problem,)f(y)n(ou)0 826 y(will)h(need)f(to)h(step)g(the)g(iterator)e -(ahead)h(of)g(the)h(elemen)n(t)g(y)n(ou)e(are)h(going)f(to)i(remo)n(v)n -(e,)e(lik)n(e)h(this:)0 1066 y Fc(for\(c)41 b(=)j(icalcomponent_g)o(et) -o(_fi)o(rs)o(t_)o(com)o(po)o(ne)o(nt\()o(pa)o(re)o(nt_)o(co)o(mp,)o(IC) -o(AL)o(_AN)o(Y_)o(CO)o(MPO)o(NE)o(NT)o(\);)305 1179 y(c)f(!=)g(0;)305 -1293 y(c)g(=)g(next)174 1520 y(next)f(=)h(icalcomponent_get)o(_n)o(ex)o -(t_c)o(om)o(po)o(nen)o(t\()o(pa)o(ren)o(t_)o(com)o(p,)o(IC)o(AL_)o(AN)o -(Y_)o(COM)o(PO)o(NE)o(NT\))o(;)174 1633 y(icalcomponent_rem)o(ov)o(e_)o -(com)o(po)o(ne)o(nt\()o(pa)o(re)o(nt_)o(co)o(mp)o(,c\))o(;)0 -1873 y Ff(Another)32 b(w)n(a)n(y)e(to)i(remo)n(v)n(e)e(comp)r(onen)n -(ts)i(is)g(to)f(rely)h(on)f(the)i(side)f(e\033ect)g(of)g(icalcomp)r -(onen)n(t_remo)n(v)n(e_comp)r(onen)n(t:)42 b(if)0 1986 -y(comp)r(onen)n(t)28 b(iterator)g(in)h(the)g(paren)n(t)f(comp)r(onen)n -(t)h(is)f(p)r(oin)n(ting)h(to)g(the)g(c)n(hild)g(that)g(will)g(b)r(e)g -(remo)n(v)n(ed,)f(it)h(will)g(mo)n(v)n(e)f(the)0 2100 -y(iterator)e(to)i(the)g(comp)r(onen)n(t)f(after)g(the)h(c)n(hild.)37 -b(The)27 b(follo)n(wing)g(co)r(de)g(will)h(exploit)f(this)h(b)r(eha)n -(vior:)0 2340 y Fc(icalcomponent_ge)o(t_)o(fir)o(st)o(_c)o(omp)o(on)o -(en)o(t\(p)o(ar)o(en)o(t_c)o(om)o(p,)o(ICA)o(L_)o(VEV)o(EN)o(T_)o(COM)o -(PO)o(NE)o(NT\))o(;)0 2453 y(while\(\(c=icalcom)o(po)o(nen)o(t_)o(ge)o -(t_c)o(ur)o(re)o(nt_)o(co)o(mp)o(one)o(nt)o(\(c)o(\)\))37 -b(!=)43 b(0)g(\))131 2567 y(if\(icalcomponen)o(t_i)o(sa)o(\(c)o(\))38 -b(==)k(ICAL_VEVENT_COMP)o(ONE)o(NT)o(\))261 2680 y(icalcomponent_rem)o -(ov)o(e_c)o(om)o(po)o(nen)o(t\()o(pa)o(ren)o(t_)o(co)o(mp,)o(in)o(ner)o -(\);)174 2794 y(else)261 2907 y(icalcomponent_get)o(_n)o(ext)o(_c)o(om) -o(pon)o(en)o(t\()o(par)o(en)o(t_)o(com)o(p,)o(ICA)o(L_)o(VE)o(VEN)o(T_) -o(CO)o(MPO)o(NE)o(NT)o(\);)0 3294 y Fd(5.2.5)94 b(W)-8 -b(orking)31 b(with)g(prop)s(erties)g(and)h(parameters)0 -3504 y Ff(Finding,)g(iterating)f(and)g(remo)n(ving)e(prop)r(erties)h(w) -n(orks)g(the)h(same)g(as)f(it)i(do)r(es)e(for)h(comp)r(onen)n(ts,)g -(using)g(the)h(prop)r(ert)n(y-)0 3617 y(sp)r(eci\034c)c(or)e -(parameter-sp)r(eci\034c)g(in)n(terfaces:)0 3857 y Fc(icalproperty*)38 -b(icalcomponent_ge)o(t_)o(fir)o(st)o(_p)o(rop)o(er)o(ty)o(\()218 -3970 y(icalcomponent*)g(component,)218 4084 y(icalproperty_kin)o(d)f -(kind\);)0 4197 y(icalproperty*)h(icalcomponent_ge)o(t_)o(nex)o(t_)o -(pr)o(ope)o(rt)o(y\()218 4311 y(icalcomponent*)g(component,)218 -4425 y(icalproperty_kin)o(d)f(kind\);)0 4538 y(void)42 -b(icalcomponent_ad)o(d_)o(pr)o(ope)o(rt)o(y\()218 4652 -y(icalcomponent*)c(component,)218 4765 y(icalproperty*)g(property\);)0 -4879 y(void)k(icalcomponent_re)o(mo)o(ve)o(_pr)o(op)o(er)o(ty\()218 -4992 y(icalcomponent*)c(component,)218 5106 y(icalproperty*)g -(property\);)0 5346 y Ff(F)-7 b(or)27 b(parameters:)p -eop -%%Page: 13 13 -13 12 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32 -b(libical)3149 b Ff(13)0 162 y Fc(icalparameter*)38 b(icalproperty_ge)o -(t_)o(fir)o(st)o(_p)o(ara)o(me)o(te)o(r\()218 275 y(icalproperty*)g -(prop,)218 389 y(icalparameter_ki)o(nd)f(kind\);)0 502 -y(icalparameter*)h(icalproperty_ge)o(t_)o(nex)o(t_)o(pa)o(ram)o(et)o -(er)o(\()218 616 y(icalproperty*)g(prop,)218 730 y(icalparameter_ki)o -(nd)f(kind\);)0 843 y(void)42 b(icalproperty_add)o(_p)o(ar)o(ame)o(te)o -(r\()218 957 y(icalproperty*)c(prop,)218 1070 y(icalparameter*)g -(parameter\);)0 1184 y(void)k(icalproperty_rem)o(ov)o(e_)o(par)o(am)o -(et)o(er\()218 1297 y(icalproperty*)c(prop,)218 1411 -y(icalparameter_ki)o(nd)f(kind\);)0 1650 y Ff(Note)30 -b(that)g(since)f(there)h(should)f(b)r(e)i(only)e(one)g(parameter)f(of)i -(eac)n(h)f(t)n(yp)r(e)h(in)g(a)f(prop)r(ert)n(y)-7 b(,)30 -b(y)n(ou)f(will)h(rarely)e(need)i(to)f(use)0 1764 y -(icalparameter_get_nect_paameter.)0 2037 y Fd(5.2.6)94 -b(W)-8 b(orking)31 b(with)g(v)-5 b(alues)0 2247 y Ff(V)e(alues)33 -b(are)g(t)n(ypically)g(part)h(of)f(a)h(prop)r(ert)n(y)-7 -b(,)34 b(although)f(they)h(can)f(exist)h(on)f(their)h(o)n(wn.)55 -b(Y)-7 b(ou)34 b(can)f(manipulate)h(them)0 2360 y(either)27 -b(as)g(part)g(of)h(the)g(prop)r(ert)n(y)e(or)h(indep)r(enden)n(tly)-7 -b(.)0 2517 y(The)36 b(most)f(common)g(w)n(a)n(y)f(to)h(w)n(ork)f(with)i -(v)-5 b(alues)35 b(to)h(is)f(to)g(manipulate)h(them)g(from)f(they)h -(prop)r(erties)e(that)i(con)n(tain)0 2630 y(them.)46 -b(This)31 b(in)n(v)n(olv)n(es)d(few)n(er)i(routine)g(calls)g(and)h(in)n -(termediate)f(v)-5 b(ariables)29 b(than)h(w)n(orking)f(with)i(them)g -(indep)r(enden)n(tly)-7 b(,)0 2744 y(and)27 b(it)h(is)g(t)n(yp)r -(e-safe.)0 2900 y(F)-7 b(or)26 b(eac)n(h)g(prop)r(ert)n(y)-7 -b(,)26 b(there)h(are)f(a)g(_get_)g(and)h(a)f(_set_)g(routine)h(that)g -(access)e(the)j(in)n(ternal)e(v)-5 b(alue.)36 b(F)-7 -b(or)26 b(instanace,)h(for)0 3014 y(the)h(UID)g(prop)r(ert)n(y)-7 -b(,)27 b(the)h(routines)f(are:)0 3253 y Fc(void)42 b(icalproperty_set)o -(_u)o(id)o(\(ic)o(al)o(pr)o(ope)o(rt)o(y*)37 b(prop,)k(const)h(char*)f -(v\))0 3367 y(const)g(char*)h(icalproperty_get)o(_u)o(id)o(\(ic)o(al)o -(pr)o(ope)o(rt)o(y*)37 b(prop\))0 3607 y Ff(F)-7 b(or)19 -b(m)n(ulti-v)-5 b(alued)20 b(prop)r(erties,)h(lik)n(e)f(A)-7 -b(TT)g(A)n(CH,)20 b(the)h(v)-5 b(alue)20 b(t)n(yp)r(e)g(is)g(usually)f -(a)h(struct)g(or)f(union)h(that)g(holds)g(b)r(oth)g(p)r(ossible)0 -3720 y(t)n(yp)r(es.)0 3877 y(If)28 b(y)n(ou)f(w)n(an)n(t)g(to)g(w)n -(ork)f(with)i(the)g(underlying)f(v)-5 b(alue)28 b(ob)5 -b(ject,)27 b(y)n(ou)g(can)g(get)g(and)h(set)f(it)h(with:)0 -4116 y Fc(icalvalue*)39 b(icalproperty_get_)o(va)o(lu)o(e)f -(\(icalproperty*)f(prop\))0 4230 y(void)42 b(icalproperty_set)o(_v)o -(al)o(ue\()o(ic)o(al)o(pro)o(pe)o(rt)o(y*)37 b(prop,)42 -b(icalvalue*)d(value\);)0 4469 y Ff(Icalprop)r(ert)n(y_get_v)-5 -b(alue\(\))36 b(will)i(return)g(a)g(reference)f(that)h(y)n(ou)g(can)g -(manipulate)g(with)h(other)e(icalv)-5 b(alue)38 b(routines.)0 -4583 y(Most)30 b(of)h(the)g(time,)g(y)n(ou)f(will)h(ha)n(v)n(e)e(to)i -(kno)n(w)e(what)i(the)g(t)n(yp)r(e)f(of)h(the)g(v)-5 -b(alue)30 b(is.)46 b(F)-7 b(or)30 b(instance,)g(if)i(y)n(ou)d(kno)n(w)h -(that)h(the)0 4696 y(v)-5 b(alue)27 b(is)h(a)f(D)n(A)-7 -b(TETIME)29 b(t)n(yp)r(e,)f(y)n(ou)f(can)g(manipulate)g(it)h(with:)0 -4936 y Fc(struct)41 b(icaltimetype)e(icalvalue_get_d)o(at)o(et)o(ime)o -(\(i)o(ca)o(lva)o(lu)o(e*)e(value\);)0 5049 y(void)42 -b(icalvalue_set_da)o(te)o(ti)o(me\()o(ic)o(al)o(val)o(ue)o(*)37 -b(value,)k(struct)h(icaltimetype)c(v\);)0 5289 y Ff(When)21 -b(w)n(orking)e(with)i(an)f(extension)g(prop)r(ert)n(y)f(or)h(v)-5 -b(alue)20 b(\(and)h(X-PR)n(OPER)-7 b(TY)21 b(or)f(a)g(prop)r(ert)n(y)f -(that)i(has)f(the)h(parameter)0 5402 y(V)-9 b(ALUE=x-name)27 -b(\))h(the)g(v)-5 b(alue)28 b(t)n(yp)r(e)f(is)h(alw)n(a)n(ys)d(a)j -(string.)36 b(T)-7 b(o)27 b(get)g(and)h(set)f(the)h(v)-5 -b(alue,)28 b(use:)p eop -%%Page: 14 14 -14 13 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32 -b(libical)3149 b Ff(14)0 162 y Fc(void)42 b(icalproperty_set)o(_x)o -(\(i)o(cal)o(pr)o(op)o(ert)o(y*)37 b(prop,)k(char*)h(v\);)0 -275 y(char*)f(icalproperty_get_)o(x\()o(ica)o(lp)o(ro)o(per)o(ty)o(*)c -(prop\);)0 515 y Ff(All)26 b(X)g(prop)r(erties)f(ha)n(v)n(e)f(the)i(t)n -(yp)r(e)g(of)g(ICAL_X_PR)n(OPER)-7 b(TY,)26 b(so)f(y)n(ou)g(will)h -(need)g(these)g(routines)f(to)g(get)h(and)f(set)h(the)0 -628 y(name)h(of)h(the)g(prop)r(ert)n(y:)0 868 y Fc(char*)41 -b(icalproperty_get_)o(x_)o(nam)o(e\()o(ic)o(alp)o(ro)o(pe)o(rty)o(*)c -(prop\))0 981 y(void)42 b(icalproperty_set)o(_x)o(_n)o(ame)o(\(i)o(ca)o -(lpr)o(op)o(er)o(ty*)37 b(prop,)k(char*)h(name\);)0 1254 -y Fd(5.2.7)94 b(Chec)m(king)32 b(Comp)s(onen)m(t)d(V)-8 -b(alidit)m(y)0 1464 y Ff(RF)n(C)25 b(2446)e(de\034nes)j(rules)e(for)h -(what)g(prop)r(erties)f(m)n(ust)h(exist)g(in)h(a)e(comp)r(onen)n(t)h -(to)g(b)r(e)h(used)f(for)f(transferring)g(sc)n(heduling)0 -1578 y(data.)58 b(Most)35 b(of)g(these)g(rules)f(relate)g(to)h(the)g -(existence)f(of)h(prop)r(erties)f(relativ)n(e)g(to)h(the)g(METHOD)h -(prop)r(ert)n(y)-7 b(,)35 b(whic)n(h)0 1691 y(declares)22 -b(what)h(op)r(eration)f(a)h(remote)g(receiv)n(er)f(should)h(use)g(to)g -(pro)r(cess)f(a)h(comp)r(onen)n(t.)35 b(F)-7 b(or)23 -b(instance,)h(if)g(the)f(METHOD)0 1805 y(is)36 b(REQUEST)h(and)e(the)i -(comp)r(onen)n(t)e(is)h(a)f(VEVENT,)j(the)e(sender)f(is)h(probably)f -(asking)f(the)j(receiv)n(er)d(to)h(join)h(in)g(a)0 1918 -y(meeting.)g(In)25 b(this)g(case,)g(RF)n(C2446)d(sa)n(ys)i(that)h(the)g -(comp)r(onen)n(t)g(m)n(ust)g(sp)r(ecify)g(a)f(start)g(time)i(\(DTST)-7 -b(AR)g(T\))26 b(and)f(list)g(the)0 2032 y(receiv)n(er)h(as)h(an)g -(attendee)h(\(A)-7 b(TTENDEE\).)0 2188 y(Libical)27 b(can)g(c)n(hec)n -(k)g(these)h(restrictions)e(with)i(the)g(routine:)0 2428 -y Fc(int)42 b(icalrestriction_c)o(he)o(ck)o(\(ic)o(al)o(co)o(mpo)o(ne)o -(nt)o(*)c(comp\);)0 2667 y Ff(This)19 b(routine)f(returns)g(0)h(if)g -(the)g(comp)r(onen)n(t)g(do)r(es)f(not)h(pass)f(RF)n(C2446)f -(restrictions,)i(or)f(if)h(the)g(comp)r(onen)n(t)g(is)g(malformed.)0 -2781 y(The)38 b(comp)r(onen)n(t)g(y)n(ou)f(pass)g(in)h -Fa(must)45 b Ff(b)r(e)38 b(a)g(V)n(CALEND)n(AR,)h(with)g(one)e(or)g -(more)h(c)n(hildren,)i(lik)n(e)d(the)i(examples)e(in)0 -2895 y(RF)n(C2446.)0 3051 y(When)28 b(this)f(routine)g(runs,)f(it)i -(will)f(insert)g(new)g(prop)r(erties)f(in)n(to)h(the)h(comp)r(onen)n(t) -e(to)h(indicate)h(an)n(y)e(errors)f(it)i(\034nds.)37 -b(See)0 3165 y(section)27 b(6.5.3,)f(X-LIC-ERR)n(OR)i(for)f(more)f -(information)h(ab)r(out)h(these)f(error)f(prop)r(erties.)0 -3437 y Fd(5.2.8)94 b(Con)m(v)m(erting)32 b(Comp)s(onen)m(ts)d(to)j(T)-8 -b(ext)0 3647 y Ff(T)h(o)19 b(create)g(an)h(RF)n(C2445)e(complian)n(t)h -(text)h(represen)n(tation)e(of)i(an)f(ob)5 b(ject,)21 -b(use)f(one)f(of)h(the)g(*_as_ical_string\(\))d(routines:)0 -3887 y Fc(char*)41 b(icalcomponent_as_)o(ic)o(al_)o(st)o(ri)o(ng)c -(\(icalcomponent*)g(component\))0 4000 y(char*)k(icalproperty_as_i)o -(ca)o(l_s)o(tr)o(in)o(g)d(\(icalproperty*)f(property\))0 -4114 y(char*)k(icalparameter_as_)o(ic)o(al_)o(st)o(ri)o(ng)c -(\(icalparameter*)g(parameter\))0 4227 y(char*)k(icalvalue_as_ical)o -(_s)o(tri)o(ng)c(\(icalvalue*)i(value\))0 4467 y Ff(In)32 -b(most)h(cases,)f(y)n(ou)f(will)i(only)f(use)g(icalcomp)r(onen)n -(t_as_ical_string)c(\(\),)34 b(since)e(it)h(will)f(cascade)f(and)h(con) -n(v)n(ert)f(all)h(of)0 4581 y(the)c(parameters,)e(prop)r(erties)g(and)i -(v)-5 b(alues)27 b(that)h(are)e(attac)n(hed)h(to)h(the)g(ro)r(ot)e -(comp)r(onen)n(t.)0 4737 y(Icalprop)r(ert)n(y_as_ical_string\(\))37 -b(will)k(terminate)g(eac)n(h)g(line)g(with)h(the)f(RF)n(C2445)f(sp)r -(eci\034ed)h(line)h(terminator)e("n")0 4851 y(Ho)n(w)n(ev)n(er,)27 -b(if)h(y)n(ou)g(compile)g(with)h(the)f(sym)n(b)r(ol)g -(ICAL_UNIX_NEWLINE)i(unde\034ned,)f(\()g(it)g(is)f(de\034ned)h(b)n(y)f -(default\))h(it)0 4964 y(will)f(terminate)f(lines)h(with)g("nr")0 -5121 y(Remem)n(b)r(er)35 b(that)h(the)f(string)g(returned)f(b)n(y)h -(these)h(routines)e(is)h(o)n(wned)g(b)n(y)g(the)h(library)-7 -b(,)36 b(and)f(will)g(ev)n(en)n(tually)f(b)r(e)i(re-)0 -5234 y(written.)h(Y)-7 b(ou)28 b(should)f(cop)n(y)g(it)h(if)g(y)n(ou)e -(w)n(an)n(t)h(to)h(preserv)n(e)e(it.)p eop -%%Page: 15 15 -15 14 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32 -b(libical)3149 b Ff(15)0 162 y Fb(5.3)112 b(Time)0 372 -y Fd(5.3.1)94 b(Time)30 b(structure)0 582 y Ff(LIbical)d(de\034nes)g -(it's)g(o)n(wn)f(time)i(structure)e(for)h(storing)f(all)h(dates)f(and)h -(times.)37 b(It)28 b(w)n(ould)e(ha)n(v)n(e)g(b)r(een)i(nice)f(to)g -(re-use)f(the)0 695 y(C)j(library's)e Fa(struct)j(tm,)h -Ff(but)e(that)h(structure)e(do)r(es)g(not)h(di\033eren)n(tiate)g(b)r -(et)n(w)n(een)g(dates)f(and)h(times,)g(and)g(b)r(et)n(w)n(een)g(lo)r -(cal)0 809 y(time)f(and)f(UTC.)h(The)g(libical)f(structure)g(is:)0 -1031 y Fc(struct)41 b(icaltimetype)87 1144 y(int)h(year;)87 -1258 y(int)g(month;)87 1371 y(int)g(day;)87 1485 y(int)g(hour;)87 -1599 y(int)g(minute;)87 1712 y(int)g(second;)87 1826 -y(int)g(is_utc;)f(/*)i(1-)g(time)e(is)i(in)g(UTC)f(timezone)e(*/)87 -1939 y(int)i(is_date;)f(/*)h(1)i(-)f(interpret)c(this)j(as)h(date.)e -(*/)i(;)0 2161 y Ff(The)35 b(y)n(ear,)h(mon)n(th,)g(da)n(y)-7 -b(,)37 b(hour,)f(min)n(ute)f(and)g(second)g(\034elds)g(ho)n(w)f(the)h -(brok)n(en-out)f(time)h(v)-5 b(alues.)59 b(The)35 b(is_utc)g(\034eld)0 -2275 y(distinguishes)30 b(b)r(et)n(w)n(een)h(times)g(UTC)g(and)g(a)f -(lo)r(cal)g(time)i(zone.)45 b(The)31 b(is_date)f(\034eld)h(indicates)g -(if)g(the)g(in)n(tra-da)n(y)e(\034elds)0 2388 y(hold)e(v)-5 -b(alid)28 b(data.)0 2658 y Fd(5.3.2)94 b(Creating)31 -b(time)f(structures)0 2868 y Ff(There)d(are)g(sev)n(eral)e(w)n(a)n(ys)h -(to)i(create)e(a)i(new)f(icaltimet)n(yp)r(e)h(structure:)0 -3089 y Fc(struct)41 b(icaltimetype)e(icaltime_from_s)o(tr)o(in)o(g\(c)o -(on)o(st)e(char*)42 b(str\);)0 3203 y(struct)f(icaltimetype)e -(icaltime_from_t)o(im)o(et)o(\(ti)o(me)o(_t)e(v,)43 b(int)f(is_date\);) -0 3317 y(struct)f(icaltimetype)e(icaltime_from_i)o(nt)o(\(i)o(nt)e(v,) -43 b(int)f(is_date,)e(int)j(is_utc\);)0 3538 y Ff(Icaltime_from_string) -25 b(tak)n(es)i(an)n(y)g(RF)n(C2445)e(complian)n(t)i(time)h(string:)0 -3760 y Fc(struct)41 b(icaltimetype)e(tt)j(=)h(icaltime_from_str)o(in)o -(g\()o(199)o(70)o(101)o(T1)o(03)o(000)o(\);)0 3982 y -Ff(Icaltime_from_timet)22 b(tak)n(es)g(a)h(timet)g(v)-5 -b(alue,)24 b(represen)n(ting)e(seconds)g(past)g(the)i(POSIX)f(ep)r(o)r -(c)n(h,)h(and)f(a)f(\035ag)g(to)h(indicate)0 4095 y(if)k(the)f(time)g -(is)g(a)g(date.)36 b(Dates)26 b(ha)n(v)n(e)f(an)h(iden)n(tical)f -(structure)h(to)g(a)f(time,)i(but)g(they)f(time)h(p)r(ortion)e(\()i -(hours,)e(min)n(uts)h(and)0 4209 y(seconds)d(\))i(is)g(alw)n(a)n(ys)d -(00:00:00.)33 b(Dates)24 b(act)h(di\033eren)n(tly)f(in)h(sorting)e(an)h -(comparision,)f(and)i(they)f(ha)n(v)n(e)f(a)h(di\033eren)n(t)h(string)0 -4322 y(represen)n(tation)h(in)i(RF)n(C2445.)0 4479 y(The)20 -b(icaltime_from_in)n(t)e(is)h(lik)n(e)g(icaltime_from_timet,)i(but)f -(with)g(an)f(arbitrary)f(ep)r(o)r(c)n(h.)34 b(This)19 -b(routine)g(w)n(as)g(a)g(mistak)n(e)0 4592 y(and)27 b(is)h(deprecated.) -0 4862 y Fd(5.3.3)94 b(Time)30 b(manipulating)f(routines)0 -5072 y Ff(The)f(n)n(ull)f(time)h(v)-5 b(alue)28 b(is)f(used)h(to)f -(indicate)h(that)g(the)g(data)f(in)g(the)h(structure)f(is)h(not)f(a)h -(v)-5 b(alid)27 b(time.)0 5294 y Fc(struct)41 b(icaltimetype)e -(icaltime_null_t)o(im)o(e\()o(voi)o(d\))o(;)0 5407 y(int)j -(icaltime_is_null_)o(ti)o(me)o(\(st)o(ru)o(ct)37 b(icaltimetype)h(t\);) -p eop -%%Page: 16 16 -16 15 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32 -b(libical)3149 b Ff(16)0 162 y(It)33 b(is)g(sensible)g(for)g(the)g -(brok)n(en-out)f(time)h(\034elds)g(to)g(con)n(tain)g(v)-5 -b(alues)32 b(that)i(are)e(not)h(p)r(ermitted)h(in)f(an)g(ISO)g -(complian)n(t)0 275 y(time)g(string.)53 b(F)-7 b(or)32 -b(instance,)i(the)g(seconds)e(\034eld)h(can)g(hold)g(v)-5 -b(alues)32 b(greater)f(than)j(59,)f(and)g(the)g(hours)f(\034eld)i(can)e -(hold)0 389 y(v)-5 b(alues)29 b(larger)e(than)j(24.)41 -b(The)29 b(excessiv)n(e)f(v)-5 b(alues)29 b(will)g(b)r(e)h(rolled)e(o)n -(v)n(er)g(in)n(to)h(the)g(next)h(larger)d(\034eld)j(when)f(the)h -(structure)0 502 y(is)d(normalized.)0 712 y Fc(struct)41 -b(icaltimetype)e(icaltime_normal)o(iz)o(e\()o(str)o(uc)o(t)e -(icaltimetype)i(t\);)0 921 y Ff(Normalizing)26 b(allo)n(ws)g(y)n(ou)h -(to)h(do)f(arithmetic)g(op)r(erations)g(on)g(time)h(v)-5 -b(alues.)0 1130 y Fc(struct)41 b(icaltimetype)e(tt)j(=)h -(icaltime_from_str)o(in)o(g\()o("19)o(97)o(010)o(1T)o(10)o(300)o(0")o -(\);)0 1244 y(tt.days)e(+=3)0 1357 y(tt.second)f(+=)i(70;)0 -1471 y(tt)h(=)g(icaltime_normali)o(ze)o(\(t)o(t\);)0 -1680 y Ff(There)27 b(are)g(sev)n(eral)e(routines)i(to)h(get)f(the)h(da) -n(y)f(of)g(the)h(w)n(eek)f(or)g(mon)n(th,)g(etc,)h(from)f(a)h(time)g -(structure.)0 1889 y Fc(short)41 b(icaltime_day_of_y)o(ea)o(r\(s)o(tr)o -(uc)o(t)d(icaltimetype)g(t\);)0 2003 y(struct)j(icaltimetype)e -(icaltime_from_d)o(ay)o(_o)o(f_y)o(ea)o(r\()o(sho)o(rt)e(doy,)42 -b(short)f(year\);)0 2117 y(short)g(icaltime_day_of_w)o(ee)o(k\(s)o(tr)o -(uc)o(t)d(icaltimetype)g(t\);)0 2230 y(short)j(icaltime_start_do)o(y_)o -(of_)o(we)o(ek)o(\(st)o(ru)o(ct)c(icaltimetype)i(t\);)0 -2344 y(short)i(icaltime_week_num)o(be)o(r\(s)o(ho)o(rt)c(day_of_month,) -h(short)k(month,)f(short)g(year\);)0 2457 y(struct)g(icaltimetype)e -(icaltime_from_w)o(ee)o(k_)o(num)o(be)o(r\()o(sho)o(rt)e(week_number,)h -(short)k(year\);)0 2571 y(short)f(icaltime_days_in_)o(mo)o(nth)o(\(s)o -(ho)o(rt)c(month,short)i(year\);)0 2780 y Ff(T)-7 b(w)n(o)37 -b(routines)g(con)n(v)n(ert)g(time)h(structures)f(to)h(and)f(from)h(the) -g(n)n(um)n(b)r(er)g(of)f(seconds)g(since)h(the)g(POSIX)g(ep)r(o)r(c)n -(h.)68 b(The)0 2894 y(is_date)27 b(\034eld)h(indicates)f(whether)g(or)g -(not)h(the)g(hour,)e(min)n(ute)i(and)g(second)f(\034elds)g(should)h(b)r -(e)g(used)f(in)h(the)g(con)n(v)n(ersion.)0 3103 y Fc(struct)41 -b(icaltimetype)e(icaltime_from_t)o(im)o(et)o(\(ti)o(me)o(_t)e(v,)43 -b(int)f(is_date\);)0 3217 y(time_t)f(icaltime_as_time)o(t\()o(str)o(uc) -o(t)c(icaltimetype\);)0 3426 y Ff(The)28 b(compare)e(routine)h(w)n -(orks)f(exactly)h(lik)n(e)g(strcmp,)g(but)h(on)g(time)g(structures.)0 -3635 y Fc(int)42 b(icaltime_compare\()o(st)o(ru)o(ct)37 -b(icaltimetype)i(a,struct)h(icaltimetype)e(b\);)0 3844 -y Ff(The)d(follo)n(wing)e(routines)h(con)n(v)n(ert)g(b)r(et)n(w)n(een)g -(UTC)h(and)g(a)f(named)h(timezone.)58 b(The)35 b(tzid)g(\034eld)g(m)n -(ust)g(b)r(e)g(a)f(timezone)0 3958 y(name)27 b(from)h(the)f(Olsen)h -(database,)e(suc)n(h)h(as)g("America/Los_Angeles.")0 -4114 y(The)h(utc_o\033set)f(routine)g(returns)g(the)h(o\033set)f(of)h -(the)g(named)f(time)h(zone)f(from)h(UTC,)f(in)h(seconds.)0 -4271 y(The)f(tt)g(parameter)e(in)i(the)g(follo)n(wing)e(routines)h -(indicates)h(the)g(date)f(on)h(whic)n(h)f(the)h(con)n(v)n(ersion)d -(should)j(b)r(e)g(made.)36 b(The)0 4384 y(tt)23 b(parameter)e(is)h -(necessary)f(b)r(ecause)h(timezones)g(ha)n(v)n(e)f(man)n(y)g -(di\033eren)n(t)i(rules)f(for)g(when)g(da)n(yligh)n(t)f(sa)n(vings)g -(time)i(is)f(used,)0 4498 y(and)27 b(these)h(rules)f(can)g(c)n(hange)f -(o)n(v)n(er)g(time.)37 b(So,)27 b(for)g(a)g(single)g(timezone)g(one)g -(y)n(ear)f(ma)n(y)h(ha)n(v)n(e)f(da)n(yligh)n(t)h(sa)n(vings)e(time)j -(on)0 4612 y(Marc)n(h)f(15,)f(but)j(for)e(other)g(y)n(ears)f(Marc)n(h)g -(15)h(ma)n(y)g(b)r(e)h(standard)f(time,)h(and)f(some)g(y)n(ears)f(ma)n -(y)h(ha)n(v)n(e)g(standard)f(time)i(all)0 4725 y(y)n(ear.)0 -4934 y Fc(int)42 b(icaltime_utc_offs)o(et)o(\(s)o(tru)o(ct)37 -b(icaltimetype)h(tt,)43 b(char*)e(tzid\);)0 5048 y(int)h -(icaltime_local_ut)o(c_)o(of)o(fse)o(t\()o(\);)0 5162 -y(struct)f(icaltimetype)e(icaltime_as_utc)o(\(s)o(tr)o(uct)e -(icaltimetype)h(tt,char*)i(tzid\);)0 5275 y(struct)h(icaltimetype)e -(icaltime_as_zon)o(e\()o(st)o(ruc)o(t)e(icaltimetype)i(tt,char*)h -(tzid\);)0 5389 y(struct)h(icaltimetype)e(icaltime_as_loc)o(al)o(\(s)o -(tru)o(ct)e(icaltimetype)h(tt\);)p eop -%%Page: 17 17 -17 16 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32 -b(libical)3149 b Ff(17)0 162 y Fb(5.4)112 b(Storing)37 -b(Ob)6 b(jects)0 372 y Ff(The)31 b(libical)f(distribution)h(includes)g -(a)f(separate)f(library)-7 b(,)30 b(libicalss,)h(that)g(allo)n(ws)e(y)n -(ou)h(to)g(store)g(iCal)g(comp)r(onen)n(t)h(data)0 485 -y(to)f(disk)g(in)h(a)f(v)-5 b(ariet)n(y)29 b(of)i(w)n(a)n(ys.)43 -b(This)30 b(library)f(also)h(includes)g(co)r(de)g(to)g(implemen)n(t)h -(the)g(CSTP)g(proto)r(col)e(of)h(CAP)h(and)0 599 y(has)c(some)g -(routines)g(for)g(deciphering)g(incomming)g(messages.)0 -755 y(The)f(\034le)h(storage)e(routines)g(are)h(organized)e(in)j(an)f -(inheritance)g(heirarc)n(h)n(y)f(that)h(is)h(ro)r(oted)e(in)i(icalset,) -f(with)h(the)g(deriv)n(ed)0 869 y(class)k(ical\034leset)g(and)h -(icaldirset.)48 b(Ical\034leset)32 b(stores)e(comp)r(onen)n(ts)h(to)h -(a)g(\034le,)h(while)f(icaldirset)e(stores)h(comp)r(onen)n(ts)g(to)0 -983 y(m)n(ultiple)c(\034les,)f(one)g(p)r(er)g(mon)n(th)g(based)g(on)g -(DTST)-7 b(AMP)g(.)28 b(Other)e(storages)e(classess,)h(for)g(storage)g -(to)h(a)g(heap)g(or)f(a)h(m)n(ysql)0 1096 y(database)g(are)h(planned)g -(for)g(the)h(future.)0 1253 y(All)g(of)g(the)g(icalset)f(deriv)n(ed)f -(classes)h(ha)n(v)n(e)f(the)i(same)f(in)n(terface:)0 -1579 y Fc(icaldirset*)39 b(icaldirset_new\(c)o(on)o(st)e(char*)k -(path\);)0 1693 y(void)h(icaldirset_free\()o(ic)o(al)o(dir)o(se)o(t*)37 -b(store\);)0 1806 y(const)k(char*)h(icaldirset_path\()o(ic)o(al)o(dir)o -(se)o(t*)37 b(store\);)0 1920 y(void)42 b(icaldirset_mark\()o(ic)o(al)o -(dir)o(se)o(t*)37 b(store\);)0 2033 y(icalerrorenum)h(icaldirset_commi) -o(t\()o(ica)o(ld)o(ir)o(set)o(*)f(store\);)0 2147 y(icalerrorenum)h -(icaldirset_add_c)o(om)o(pon)o(en)o(t\()o(ica)o(ld)o(ir)o(set)o(*)f -(store,)k(icalcomponent*)d(comp\);)0 2260 y(icalerrorenum)g -(icaldirset_remov)o(e_)o(com)o(po)o(ne)o(nt\()o(ic)o(al)o(dir)o(se)o -(t*)f(store,)k(icalcomponent*)d(comp\);)0 2374 y(int)k -(icaldirset_count_)o(co)o(mp)o(one)o(nt)o(s\()o(ica)o(ld)o(ir)o(set)o -(*)37 b(store,)k(icalcomponent_kin)o(d)c(kind\);)0 2488 -y(icalerrorenum)h(icaldirset_selec)o(t\()o(ica)o(ld)o(ir)o(set)o(*)f -(store,)k(icalcomponent*)d(gauge\);)0 2601 y(void)k(icaldirset_clear)o -(\(i)o(ca)o(ldi)o(rs)o(et)o(*)c(store\);)0 2715 y(icalcomponent*)g -(icaldirset_fetc)o(h\()o(ica)o(ld)o(ir)o(set)o(*)f(store,)k(const)h -(char*)f(uid\);)0 2828 y(int)h(icaldirset_has_ui)o(d\()o(ic)o(ald)o(ir) -o(se)o(t*)37 b(store,)k(const)h(char*)f(uid\);)0 2942 -y(icalcomponent*)d(icaldirset_fetc)o(h_)o(mat)o(ch)o(\(i)o(cal)o(di)o -(rs)o(et*)f(set,)42 b(icalcomponent)c(*c\);)0 3055 y(icalerrorenum)g -(icaldirset_modif)o(y\()o(ica)o(ld)o(ir)o(set)o(*)f(store,)k -(icalcomponent)d(*oldc,)j(icalcomponent)e(*newc\);)0 -3169 y(icalcomponent*)f(icaldirset_get_)o(cu)o(rre)o(nt)o(_c)o(omp)o -(on)o(en)o(t\(i)o(ca)o(ldi)o(rs)o(et)o(*)g(store\);)0 -3283 y(icalcomponent*)g(icaldirset_get_)o(fi)o(rst)o(_c)o(om)o(pon)o -(en)o(t\()o(ica)o(ld)o(irs)o(et)o(*)f(store\);)0 3396 -y(icalcomponent*)h(icaldirset_get_)o(ne)o(xt_)o(co)o(mp)o(one)o(nt)o -(\(i)o(cal)o(di)o(rse)o(t*)f(store\);)0 3664 y Fd(5.4.1)94 -b(Creating)31 b(a)h(new)g(set)0 3874 y Ff(Y)-7 b(ou)28 -b(can)f(create)f(a)i(new)f(set)h(from)f(either)g(the)h(base)f(class)g -(or)g(the)g(direv)n(ed)g(class.)36 b(F)-7 b(rom)27 b(the)h(base)f -(class)g(use)g(one)g(of:)0 4087 y Fc(icalset*)40 b(icalset_new_file)o -(\(co)o(ns)o(t)d(char*)42 b(path\);)0 4201 y(icalset*)e -(icalset_new_dir\()o(con)o(st)d(char*)k(path\);)0 4314 -y(icalset*)f(icalset_new_heap)o(\(vo)o(id)o(\);)0 4428 -y(icalset*)g(icalset_new_mysq)o(l\(c)o(on)o(st)d(char*)k(path\);)0 -4641 y Ff(Y)-7 b(ou)28 b(can)f(also)f(create)h(a)g(new)h(set)f(based)g -(on)h(the)f(deriv)n(ed)g(class,)g(F)-7 b(or)27 b(instance,)g(with)h -(ical\034leset:)0 4854 y Fc(icalfileset*)38 b(icalfileset_new\(c)o(on)o -(st)f(char*)42 b(path\);)0 4967 y(icalfileset*)c(icalfileset_new_o)o -(pe)o(n\(c)o(on)o(st)f(char*)k(path,)h(int)g(flags,)f(mode_t)g(mode\);) -0 5180 y Ff(Icaset_new_\034le)33 b(is)h(iden)n(tical)g(to)g -(ical\034leset_new.)55 b(BOth)34 b(routines)g(will)g(op)r(en)g(an)g -(existing)g(\034le)g(for)g(readinga)e(and)0 5294 y(writing,)24 -b(or)e(create)g(a)h(new)g(\034le)g(if)h(it)f(do)r(es)g(not)g(exist.)35 -b(Ical\034lset_new_op)r(en)22 b(tak)n(es)g(the)h(same)g(argumen)n(ts)f -(as)g(the)i(op)r(en\(\))0 5407 y(system)j(routine)g(and)h(b)r(eha)n(v)n -(es)e(in)i(the)g(same)f(w)n(a)n(y)-7 b(.)p eop -%%Page: 18 18 -18 17 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32 -b(libical)3149 b Ff(18)0 162 y(The)29 b(icalset)g(and)g(ical\034lset)g -(ob)5 b(jects)29 b(are)f(somewhat)h(in)n(terc)n(hangable)e(\025)i(y)n -(ou)f(can)h(use)g(an)g(ical\034leset*)g(as)f(an)h(argumen)n(t)0 -275 y(to)e(an)n(y)g(of)h(the)g(icalset)f(routines.)0 -432 y(The)d(follo)n(wing)f(examples)h(will)g(all)g(use)g(ical\034leset) -g(routines;)g(using)g(the)h(other)e(icalset)h(deriv)n(ed)f(classess)g -(will)h(b)r(e)h(similar.)0 704 y Fd(5.4.2)94 b(A)m(dding,)31 -b(Finding)g(and)h(Remo)m(ving)d(Comp)s(onen)m(ts)0 914 -y Ff(T)-7 b(o)27 b(add)h(comp)r(onen)n(ts)f(to)g(a)g(set,)h(use:)0 -1154 y Fc(icalerrorenum)38 b(icalfileset_add_)o(co)o(mpo)o(ne)o(nt)o -(\(ic)o(al)o(fi)o(les)o(et)o(*)g(cluster,)i(icalcomponent*)d(child\);)0 -1393 y Ff(The)k(\034leset)h(k)n(eeps)e(an)h(inmemory)g(cop)n(y)f(of)h -(the)h(comp)r(onen)n(ts,)i(and)d(this)g(set)h(m)n(ust)f(b)r(e)g -(written)h(bac)n(k)e(to)h(the)h(\034le)0 1507 y(o)r(cassionally)-7 -b(.)35 b(There)27 b(are)f(t)n(w)n(o)h(routines)g(to)g(manage)g(this:)0 -1746 y Fc(void)42 b(icalfileset_mark)o(\(i)o(ca)o(lfi)o(le)o(se)o(t*)37 -b(cluster\);)0 1860 y(icalerrorenum)h(icalfileset_comm)o(it)o(\(ic)o -(al)o(fi)o(les)o(et)o(*)f(cluster\);)0 2099 y Ff(Ical\034leset_mark)d -(indicates)i(that)h(the)g(in-memory)e(comp)r(onen)n(ts)h(ha)n(v)n(e)f -(c)n(hanged.)62 b(Calling)36 b(the)h(_add_comp)r(onen)n(t)0 -2212 y(routine)32 b(will)h(call)f(_mark)f(automatically)-7 -b(,)33 b(but)g(y)n(ou)f(ma)n(y)g(need)h(to)f(call)h(it)g(y)n(ourself)e -(if)i(y)n(ou)f(ha)n(v)n(e)f(made)i(a)f(c)n(hange)f(to)0 -2326 y(an)g(existing)h(comp)r(onen)n(t.)49 b(The)32 b(_commit)f -(routine)g(writes)h(the)g(data)f(base)g(to)h(disk,)g(but)h(only)e(if)h -(it)g(is)g(mark)n(ed.)48 b(The)0 2440 y(_commit)27 b(routine)g(is)h -(called)f(automatically)f(when)i(the)g(ical\034leset)f(is)h(freed.)0 -2596 y(T)-7 b(o)27 b(iterate)g(through)g(the)h(comp)r(onen)n(ts)f(in)h -(a)f(set,)h(use:)0 2835 y Fc(icalcomponent*)38 b(icalfileset_get)o(_f)o -(irs)o(t_)o(co)o(mpo)o(ne)o(nt)o(\(ic)o(al)o(fil)o(es)o(et)o(*)g -(cluster\);)0 2949 y(icalcomponent*)g(icalfileset_get)o(_n)o(ext)o(_c)o -(om)o(pon)o(en)o(t\()o(ica)o(lf)o(ile)o(se)o(t*)f(cluster\);)0 -3063 y(icalcomponent*)h(icalfileset_get)o(_c)o(urr)o(en)o(t_)o(com)o -(po)o(ne)o(nt)f(\(icalfileset*)h(cluster\);)0 3302 y -Ff(These)25 b(routines)g(w)n(ork)g(lik)n(e)g(the)h(corresp)r(onding)e -(routines)h(from)g(icalcomp)r(onen)n(t,)g(except)h(that)g(their)f -(output)i(is)e(\034ltered)0 3415 y(through)j(a)h(gauge.)39 -b(A)29 b(gauge)f(is)h(a)f(test)h(for)g(the)g(prop)r(erties)f(within)h -(a)g(comp)r(onen)n(ts;)g(only)f(comp)r(onen)n(ts)g(that)i(pass)e(the)0 -3529 y(test)g(are)e(returned.)37 b(A)28 b(gauge)e(can)h(b)r(e)h -(constructed)f(from)g(a)g(MINSQL)h(string)f(with:)0 3768 -y Fc(icalgauge*)39 b(icalgauge_new_fro)o(m_)o(sq)o(l\(c)o(ha)o(r*)e -(sql\);)0 4008 y Ff(Then,)28 b(y)n(ou)f(can)g(add)g(the)h(gauge)e(to)i -(the)g(set)f(with)h(:)0 4247 y Fc(icalerrorenum)38 b(icalfileset_sele)o -(ct)o(\(ic)o(al)o(fi)o(les)o(et)o(*)f(store,)42 b(icalgauge*)d -(gauge\);)0 4486 y Ff(Here)27 b(is)h(an)f(example)g(that)h(puts)g(all)f -(of)h(these)f(routines)g(together:)0 4726 y Fc(void)42 -b(test_fileset\(\))174 4953 y(icalfileset)d(*fs;)174 -5066 y(icalcomponent)f(*c;)174 5180 y(int)43 b(i;)174 -5294 y(char)f(*path)g(=)h(test_fileset.ic)o(s;)174 5407 -y(icalgauge)84 b(*g)42 b(=)i(icalgauge_new_f)o(ro)o(m_)o(sql)o(\()p -eop -%%Page: 19 19 -19 18 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32 -b(libical)3149 b Ff(19)349 162 y Fc(SELECT)41 b(*)i(FROM)f(VEVENT)f -(WHERE)g(DTSTART)84 b('20000103T120000Z)o(')37 b(AND)43 -b(DTSTART)d(=)j('20000106T120000Z)o('\))o(;)174 389 y(fs)g(=)g -(icalfileset_new\()o(pat)o(h\))o(;)174 616 y(for)g(\(i)f(=)h(0;)g(i!=)g -(10;)f(i++\))349 730 y(c)h(=)g(make_component\(i)o(\);)37 -b(/*)43 b(Make)e(a)j(new)e(component)e(where)h(DTSTART)g(has)h(month)f -(of)i(i)g(*/)349 843 y(icalfileset_add)o(_c)o(omp)o(on)o(en)o(t\(f)o -(s,)o(c\))o(;)174 1184 y(icalfileset_commi)o(t\()o(fs)o(\);)37 -b(/*)43 b(Write)e(to)i(disk)f(*/)174 1411 y(icalfileset_selec)o(t\()o -(fs)o(,g\))o(;)37 b(/*)43 b(Set)f(the)h(gauge)e(to)i(filter)e -(components)e(*/)174 1638 y(for)k(\(c)f(=)h(icalfileset_get_f)o(ir)o -(st_)o(co)o(mp)o(one)o(nt)o(\(f)o(s\);)392 1752 y(c)g(!=)g(0;)392 -1865 y(c)g(=)g(icalfileset_get_n)o(ex)o(t_c)o(om)o(po)o(nen)o(t\()o(fs) -o(\)\))349 1979 y(struct)e(icaltimetype)d(t)43 b(=)g(icalcomponent_get) -o(_d)o(tst)o(ar)o(t\()o(c\);)349 2206 y(printf\(sn,icalt)o(im)o(e_a)o -(s_)o(ct)o(ime)o(\(t)o(\)\))o(;)174 2433 y(icalfileset_free\()o(fs)o -(\);)0 2706 y Fd(5.4.3)94 b(Other)31 b(routines)0 2916 -y Ff(There)c(are)g(sev)n(eral)e(other)i(routines)g(in)h(the)g(icalset)f -(in)n(terface,)g(but)h(they)g(not)f(fully)h(implemen)n(ted)h(y)n(et.)0 -3207 y Fb(5.5)112 b(Memory)37 b(Managemen)m(t)0 3417 -y Ff(Libical)25 b(relies)f(hea)n(vily)g(on)h(dynamic)g(allo)r(cation)f -(for)h(b)r(oth)h(the)f(core)f(ob)5 b(jects)25 b(and)g(for)f(the)i -(strings)e(used)h(to)g(hold)g(v)-5 b(alues.)0 3531 y(Some)34 -b(of)f(this)h(memory)f(the)h(library)f(caller)g(o)n(wns)g(and)g(m)n -(ust)h(free,)h(and)f(some)f(of)h(the)g(memory)f(is)h(managed)e(b)n(y)i -(the)0 3645 y(library)-7 b(.)36 b(Here)27 b(is)g(a)g(summary)g(of)h -(the)g(memory)e(rules.)0 3884 y Fd(1\))208 4031 y Ff(If)40 -b(the)h(function)g(name)g(has)f(new)g(in)h(it,)j(the)d(caller)e(gets)h -(con)n(trol)f(of)i(the)g(memory)-7 b(.)75 b(\()40 b(suc)n(h)h(as)e -(icalcomp)r(o-)208 4144 y(nen)n(t_new\(\),)27 b(or)g(icalprop)r(ert)n -(y_new_clone\(\))e(\))0 4324 y Fd(2\))208 4471 y Ff(If)j(y)n(ou)g(got)g -(the)h(memory)f(from)g(a)g(routine)g(with)h(new)f(in)h(it,)g(y)n(ou)f -(m)n(ust)h(call)f(the)h(corresp)r(onding)d(*_free)i(routine)208 -4585 y(to)f(free)g(the)h(memory)-7 b(.)36 b(\()28 b(Use)g(icalcomp)r -(onen)n(t_free\(\))e(to)i(free)f(ob)5 b(jects)27 b(created)g(with)h -(icalcomp)r(onen)n(t_new\(\)\))0 4765 y Fd(3\))208 4912 -y Ff(If)j(the)h(function)f(name)g(has)g(add)g(in)g(it,)i(the)f(caller)e -(is)h(transferring)e(con)n(trol)h(of)h(the)h(memory)e(to)h(the)h -(routine.)47 b(\()208 5025 y(icalprop)r(ert)n(y_add_parameter\(\))23 -b(\))0 5205 y Fd(4\))p eop -%%Page: 20 20 -20 19 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32 -b(libical)3149 b Ff(20)208 162 y(If)34 b(the)g(function)g(name)g(has)f -(remo)n(v)n(e)f(in)i(it,)i(the)e(caller)f(passes)f(in)i(a)g(p)r(oin)n -(ter)f(to)g(an)h(ob)5 b(ject)33 b(and)h(after)f(the)h(call)208 -275 y(returns,)e(the)h(caller)e(o)n(wns)g(the)h(ob)5 -b(ject.)50 b(So,)33 b(b)r(efore)f(y)n(ou)f(call)h(icalcomp)r(onen)n -(t_remo)n(v)n(e_prop)r(ert)n(y\(comp,fo)r(o\),)208 389 -y(y)n(ou)26 b(do)i(not)f(o)n(wn)g(fo)r(o)g(and)h(after)f(the)h(call)f -(returns,)g(y)n(ou)g(do.)0 561 y Fd(5\))208 703 y Ff(If)d(the)g -(routine)f(returns)g(a)g(string,)h(libical)g(o)n(wns)f(the)h(memory)f -(and)g(will)h(put)g(it)h(on)e(a)g(ring)g(bu\033er)h(to)g(reclaim)f -(later.)208 817 y(F)-7 b(or)32 b(example,)i(icalcomp)r(onen)n -(t_as_ical_string\(\).)50 b(Y)-7 b(ou'd)33 b(b)r(etter)g(strdup\(\))h -(it)g(if)f(y)n(ou)f(w)n(an)n(t)h(to)g(k)n(eep)f(it,)j(and)208 -931 y(y)n(ou)26 b(don't)i(ha)n(v)n(e)e(to)i(delete)g(it.)0 -1219 y Fb(5.6)112 b(Error)36 b(Handling)0 1429 y Ff(Libical)25 -b(has)g(sev)n(eral)e(error)h(handling)h(mec)n(hanisms)f(for)h(the)h(v) --5 b(arious)24 b(t)n(yp)r(es)h(of)g(programming,)f(seman)n(tic)h(and)g -(syn)n(tactic)0 1542 y(errors)g(y)n(ou)i(ma)n(y)g(encoun)n(ter.)0 -1811 y Fd(5.6.1)94 b(Return)31 b(v)-5 b(alues)0 2022 -y Ff(Man)n(y)29 b(library)f(routines)g(signal)h(errors)e(through)h -(their)h(return)g(v)-5 b(alues.)42 b(All)30 b(routines)e(that)i(return) -f(a)f(p)r(oin)n(ter,)i(suc)n(h)f(as)0 2135 y(icalcomp)r(onen)n -(t_new\(\),)36 b(will)f(return)f(0)g(\()h(zero)f(\))h(on)f(a)g(fatal)h -(error.)56 b(Some)35 b(routines)f(will)g(return)h(a)f(v)-5 -b(alue)34 b(of)h(en)n(um)0 2249 y(icalerroren)n(um.)0 -2518 y Fd(5.6.2)94 b(icalerrno)0 2728 y Ff(Most)24 b(routines)f(will)i -(set)f(the)g(global)f(error)f(v)-5 b(alue)24 b(icalerrno)f(on)h -(errors.)33 b(This)24 b(v)-5 b(ariable)23 b(is)h(an)g(en)n(umeration;)g -(p)r(ermissible)0 2841 y(v)-5 b(alues)35 b(can)f(b)r(e)h(found)h(in)f -(libical/icalerror.h.)56 b(If)35 b(the)g(routine)g(returns)f(an)h(en)n -(um)g(icalerroren)n(um,)f(then)h(the)h(return)0 2955 -y(v)-5 b(alue)27 b(will)h(b)r(e)f(the)h(same)f(as)f(icalerrno.)35 -b(Y)-7 b(ou)27 b(can)g(use)g(icalerror_strerror\(\))c(to)k(get)g(a)g -(string)f(that)i(describ)r(es)e(the)i(error)0 3224 y -Fd(5.6.3)94 b(X-LIC-ERR)m(OR)30 b(and)j(X-LIC-INV)-11 -b(ALID-COMPONENT)0 3434 y Ff(The)38 b(library)f(handles)g(seman)n(tic)g -(and)h(syn)n(tactic)f(errors)f(in)i(comp)r(onen)n(ts)g(b)n(y)f -(inserting)g(errors)f(prop)r(erties)h(in)n(to)h(the)0 -3548 y(comp)r(onen)n(ts.)k(If)30 b(the)g(parser)d(cannot)i(parse)g -(incoming)g(text)g(\()h(a)f(syn)n(tactic)g(error)e(\))j(or)f(if)h(the)g -(icalrestriction_c)n(hec)n(k\(\))0 3661 y(routine)h(indicates)g(that)h -(the)f(comp)r(onen)n(t)g(do)r(es)g(not)h(meet)f(the)h(requiremen)n(ts)e -(of)h(RF)n(C2446)f(\()h(a)g(seman)n(tic)g(error\))f(the)0 -3775 y(library)i(will)h(insert)g(prop)r(erties)f(of)h(the)h(t)n(yp)r(e) -f(X-LIC-ERR)n(OR)g(to)g(describ)r(e)g(the)g(error.)52 -b(Here)33 b(is)g(an)g(example)g(of)g(the)0 3889 y(error)26 -b(prop)r(ert)n(y:)0 4108 y Fc(X-LIC-ERROR;X-LI)o(C-)o(ERR)o(OR)o(TY)o -(PE=)o(IN)o(VA)o(LID)o(_I)o(TI)o(P)38 b(:Failed)i(iTIP)i(restrictions)d -(for)j(property)e(DTSTART.)0 4221 y(Expected)g(1)j(instances)d(of)j -(the)f(property)e(and)j(got)f(0)0 4441 y Ff(This)35 b(error)f(resulted) -h(from)g(a)g(call)g(to)h(icalrestriction_c)n(hec)n(k\(\),)f(whic)n(h)g -(disco)n(v)n(ered)e(that)j(the)g(comp)r(onen)n(t)f(do)r(es)g(not)0 -4554 y(ha)n(v)n(e)26 b(a)i(DTST)-7 b(AR)g(T)28 b(prop)r(ert)n(y)-7 -b(,)27 b(as)g(required)f(b)n(y)h(RF)n(C2445.)0 4711 y(There)g(are)g(a)g -(few)h(routines)e(to)i(manipulate)f(error)f(prop)r(erties:)0 -4867 y(The)35 b(follo)n(wing)g(data)g(is)g(supp)r(osed)g(to)g(b)r(e)h -(in)g(a)f(table.)60 b(It)36 b(lo)r(oks)e(OK)h(in)h(LyX,)f(but)h(do)r -(es)f(not)g(format)g(prop)r(ertly)g(in)0 4981 y(output.)0 -5137 y(Routine)28 b(Purp)r(ose)f(v)n(oid)g(icalrestriction_c)n(hec)n -(k\(\))e(Chec)n(k)i(a)g(comp)r(onen)n(t)g(against)g(RF)n(C2446)e(and)j -(insert)0 5294 y(error)g(prop)r(erties)g(to)i(indicate)f(non)g -(compliance)g(in)n(t)h(icalcomp)r(onen)n(t_coun)n(t_errors\(\))c -(Return)j(the)h(n)n(um)n(b)r(er)g(of)f(error)0 5407 y(prop)r(erties)p -eop -%%Page: 21 21 -21 20 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32 -b(libical)3149 b Ff(21)0 162 y(in)28 b(a)f(comp)r(onen)n(t)g(v)n(oid)g -(icalcomp)r(onen)n(t_strip_errors\(\))d(Remo)n(v)n(e)i(all)i(error)d -(prop)r(erties)i(in)h(as)0 318 y(comp)r(onen)n(t)f(v)n(oid)g(icalcomp)r -(onen)n(t_con)n(v)n(ert_errors\(\))c(Con)n(v)n(ert)j(some)h(error)e -(prop)r(erties)i(in)n(to)0 475 y(REQUESTS-ST)-7 b(A)g(TUS)29 -b(proprties)e(to)g(indicate)h(the)g(inabilit)n(y)f(to)0 -631 y(pro)r(cess)f(the)i(comp)r(onen)n(t)g(as)e(an)i(iTIP)g(request.)0 -788 y(The)g(t)n(yp)r(es)f(of)h(errors)d(are)i(listed)g(in)h -(icalerror.h.)35 b(They)27 b(are:)0 1027 y Fc(ICAL_XLICERRORTY)o(PE)o -(_CO)o(MP)o(ON)o(ENT)o(PA)o(RS)o(EER)o(RO)o(R)0 1141 -y(ICAL_XLICERRORTY)o(PE)o(_PA)o(RA)o(ME)o(TER)o(VA)o(LU)o(EPA)o(RS)o -(EE)o(RRO)o(R)0 1254 y(ICAL_XLICERRORTY)o(PE)o(_PA)o(RA)o(ME)o(TER)o -(NA)o(ME)o(PAR)o(SE)o(ER)o(ROR)0 1368 y(ICAL_XLICERRORTY)o(PE)o(_PR)o -(OP)o(ER)o(TYP)o(AR)o(SE)o(ERR)o(OR)0 1481 y(ICAL_XLICERRORTY)o(PE)o -(_VA)o(LU)o(EP)o(ARS)o(EE)o(RR)o(OR)0 1595 y(ICAL_XLICERRORTY)o(PE)o -(_UN)o(KV)o(CA)o(LPR)o(OP)0 1709 y(ICAL_XLICERRORTY)o(PE)o(_IN)o(VA)o -(LI)o(DIT)o(IP)0 1948 y Ff(The)46 b(libical)f(parser)f(will)i(generate) -e(the)i(error)d(that)j(end)g(in)g(P)-7 b(ARSEERR)n(OR)47 -b(when)e(it)h(encoun)n(ters)f(garbage)e(in)0 2062 y(the)d(input)g -(steam.)72 b(ICAL_XLICERR)n(OR)-7 b(TYPE_INV)e(ALIDITIP)42 -b(is)d(inserted)g(b)n(y)g(icalrestriction_c)n(hec)n(k\(\),)h(and)0 -2175 y(ICAL_XLICERR)n(OR)-7 b(TYPE_UNKV)n(CALPR)n(OP)21 -b(is)e(generated)f(b)n(y)i(icalv)n(cal_con)n(v)n(ert\(\))c(when)k(it)g -(encoun)n(ters)f(a)g(vCal)0 2289 y(prop)r(ert)n(y)26 -b(that)i(it)g(cannot)f(con)n(v)n(ert)f(or)h(do)r(es)g(not)h(kno)n(w)f -(ab)r(out.)0 2445 y(Icalcomp)r(onen)n(t_con)n(v)n(ert_errors\(\))33 -b(con)n(v)n(erts)k(some)g(of)i(the)f(error)f(prop)r(erties)g(in)h(a)g -(comp)r(onen)n(t)g(in)n(to)g(REQUEST-)0 2559 y(ST)-7 -b(A)g(TUS)29 b(prop)r(erties)e(that)h(indicate)g(a)g(failure.)38 -b(As)28 b(of)g(libical)g(v)n(ersion0.18,)e(this)i(routine)g(only)f(con) -n(v)n(ert)g(*P)-7 b(ARSEER-)0 2672 y(R)n(OR)29 b(errors)d(and)j(it)h -(alw)n(a)n(ys)d(generates)h(a)g(3.x)h(\()g(failure)g(\))g(co)r(de.)42 -b(This)29 b(mak)n(es)f(it)h(more)f(of)h(a)g(go)r(o)r(d)g(idea)f(than)h -(a)g(really)0 2786 y(useful)f(bit)g(of)g(co)r(de.)0 3077 -y Fb(5.7)112 b(Naming)36 b(Standard)0 3288 y Ff(Structures)26 -b(that)i(y)n(ou)e(access)f(with)j(the)f("struct")f(k)n(eyw)n(ord,)f -(suc)n(h)h(as)h("struct)f(icaltimet)n(yp)r(e")g(are)g(things)h(that)g -(y)n(ou)f(are)0 3401 y(allo)n(w)n(ed)g(to)i(see)f(inside)g(and)h(p)r -(ok)n(e)f(at.)0 3558 y(Structures)33 b(that)h(y)n(ou)e(access)g(though) -i(a)f(t)n(yp)r(edef,)i(suc)n(h)e(as)g("icalcomp)r(onen)n(t")e(are)i -(things)g(where)g(all)g(of)h(the)f(data)g(is)0 3671 y(hidden.)0 -3828 y(Comp)r(onen)n(t)28 b(names)g(that)h(start)f(with)h("V")f(are)f -(part)h(of)h(RF)n(C)f(2445)f(or)g(another)h(iCal)g(standard.)38 -b(Comp)r(onen)n(t)29 b(names)0 3941 y(that)h(start)f(with)i("X")e(are)g -(also)g(part)g(of)h(the)g(sp)r(ec,)g(but)h(they)f(are)f(not)h(actually) -f(comp)r(onen)n(ts)g(in)h(the)g(sp)r(ec.)44 b(Ho)n(w)n(ev)n(er,)0 -4055 y(they)34 b(lo)r(ok)f(and)g(act)h(lik)n(e)f(comp)r(onen)n(ts,)h -(so)f(they)h(are)f(comp)r(onen)n(ts)g(in)h(libical.)55 -b(Names)33 b(that)h(start)f(with)h("XLIC")f(or)0 4168 -y("X-LIC")26 b(are)h(not)h(part)f(of)g(an)n(y)g(iCal)g(sp)r(ec.)37 -b(They)27 b(are)g(used)h(in)n(ternally)e(b)n(y)i(libical.)0 -4325 y(En)n(ums)34 b(that)h(iden)n(tify)f(a)g(comp)r(onen)n(t,)h(prop)r -(ert)n(y)-7 b(,)35 b(v)-5 b(alue)33 b(or)h(parameter)e(end)i(with)h -("_COMPONENT,")e("_PR)n(OP-)0 4438 y(ER)-7 b(TY,")28 -b("_V)-9 b(ALUE,")27 b(or)g("_P)-7 b(ARAMETER"s)0 4595 -y(En)n(ums)31 b(that)f(iden)n(tify)h(a)f(parameter)f(v)-5 -b(alue)30 b(ha)n(v)n(e)f(the)i(name)f(of)h(the)f(parameter)f(as)h(the)h -(second)e(w)n(ord.)45 b(F)-7 b(or)29 b(instance:)0 4708 -y(ICAL_R)n(OLE_REQP)-7 b(AR)g(TICIP)g(ANT)29 b(or)d(ICAL_P)-7 -b(AR)g(TST)g(A)g(T_A)n(CCEPTED.)0 4865 y(The)28 b(en)n(ums)f(for)g(the) -h(parts)f(of)g(a)g(recurarance)e(rule)j(and)f(request)g(statuses)g(are) -f(irregular.)p eop -%%Page: 22 22 -22 21 bop 0 -167 3900 5 v 0 -200 a Fd(6.)73 b(Hac)m(ks)33 -b(and)f(Bugs)2997 b Ff(22)0 162 y Fe(6)131 b(Hac)l(ks)45 -b(and)e(Bugs)0 400 y Ff(There)24 b(are)f(a)g(lot)h(of)g(hac)n(ks)f(in)i -(the)f(library)f(\025)h(bits)g(of)g(co)r(de)g(that)g(I)g(am)g(not)g -(proud)g(of)g(and)g(should)g(probably)f(b)r(e)h(c)n(hanged.)0 -514 y(These)j(are)g(mark)n(ed)f(with)i(the)g(commen)n(t)g(string)e("HA) -n(CK.")p eop -%%Trailer -end -userdict /end-hook known{end-hook}if -%%EOF diff --git a/libical/doc/UsingLibical.txt b/libical/doc/UsingLibical.txt deleted file mode 100644 index 6b203d43d2..0000000000 --- a/libical/doc/UsingLibical.txt +++ /dev/null @@ -1,1384 +0,0 @@ - - -Using Libical - -Eric Busboom (eric@softwarestudio.org) - -January 2001 - - - -1 Introduction - -Libical is an Open Source implementation of the iCalendar protocols -and protocol data units. The iCalendar specification describes how -calendar clients can communicate with calendar servers so users can -store their calendar data and arrange meetings with other users. - -Libical implements RFC2445, RFC2446 and some of RFC2447 and the CAP -draft. - -This documentation assumes that you are familiar with the iCalendar -standards RFC2445 and RFC2446. these specifications are online on -the CALSCH webpage at: - -http://www.imc.org/ietf-calendar/ - -1.1 The libical project - -This code is under active development. If you would like to contribute -to the project, you can contact me, Eric Busboom, at eric@softwarestudio.org. -The project has a webpage at - -http://softwarestudio.org/libical/index.html - -and a mailing list that you can join by sending the following mail: - -To: minimalist@softwarestudio.org - -Subject: subscribe libical - -1.2 License - -The code and datafiles in this distribution are licensed under the -Mozilla Public License. See http://www.mozilla.org/NPL/MPL-1.0.html -for a copy of the license. Alternately, you may use libical under -the terms of the GNU Library General Public License. See http://www.fsf.org/copyleft/lesser.html -for a copy of the LGPL. - -This dual license ensures that the library can be incorporated into -both proprietary code and GPL'd programs, and will benefit from improvements -made by programmers in both realms. I will only accept changes into -my version of the library if they are similarly dual-licensed. - -1.3 Example Code - -A lot of the documentation for this library is in the form of example -code. These examples are in the "examples" directory of the distribution. -Also look in "src/test" for additional annotated examples. - -2 Building the Library - -Libical uses autoconf to generate makefiles. It should built with no -adjustments on Linux, FreeBSD and Solaris under gcc. Some version -have been successfully been build on MacOS, Solaris, UnixWare, And -Tru64 UNIX without gcc, but you may run into problems with a particular -later version. - -For a more complete guide to building the library, see the README file -in the distribution. - -3 Structure - -The iCal calendar model is based on four types of objects: components, -properties, values and parameters. - -Properties are the fundamental unit of information in iCal, and they -work a bit like a hash entry, with a constant key and a variable value. -Properties may also have modifiers, called parameters. In the iCal -content line - -ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com - -The property name is "ORGANIZER," the value of the property is "mrbig@host.com" -and the "ROLE" parameter specifies that Mr Big is the chair of the -meetings associated with this property. - -Components are groups of properties that represent the core objects -of a calendar system, such as events or timezones. Components are -delimited by "BEGIN" and "END" tags. - -When a component is sent across a network, if it is un-encrypted, it -will look something like: - -BEGIN:VCALENDAR - -METHOD:REQUEST - -PRODID: -//hacksw/handcal//NONSGML v1.0//EN - -BEGIN:VEVENT - -DTSTAMP:19980309T231000Z - -UID:guid-1.host1.com - -ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com - -ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP: - - MAILTO:employee-A@host.com - -DESCRIPTION:Project XYZ Review Meeting - -CATEGORIES:MEETING - -CLASS:PUBLIC - -CREATED:19980309T130000Z - -SUMMARY:XYZ Project Review - -DTSTART;TZID=US-Eastern:19980312T083000 - -DTEND;TZID=US-Eastern:19980312T093000 - -LOCATION:1CP Conference Room 4350 - -END:VEVENT - -END:VCALENDAR - -Note that components can be nested; this example has both a VCALENDAR -and a VEVENT component, one nested inside the other. - -3.1 Core iCal classes - -Libical is an object-based, data-oriented library. Nearly all of the -routines in the library are associated with an opaque data types and -perform some operation on that data type. Although the library does -not actually have classes, we will use those terms since the behavior -of these associations of data and routines is very similar to a class. - -3.1.1 Properties - -Properties are represented with the icalproperty class and its many -"derived" classes with on "derived" class per property type in RFC2445. -Again, there is no actual inheritance relations, but there are clusters -of routines that make this term useful. A property is a container -for a single value and a set of parameters. - -3.1.2 Components - -In libical, components are represented with the icalcomponent class. -Icalcomponent is a container for a set of other components and properties. - -3.1.3 Values - -Values are represented in a similar way to properties; a base class -and many "derived " classes. A value is essentially a abstract handle -on a single fundamental type, a structure or a union. - -3.1.4 Parameters - -Parameters are represetned in a similar way to properties, except that -they contain only one value - -3.2 Other elements of libical - -In addition to the core iCal classes, libical has many other types, -structures, classes that aid in creating and using iCal components. - -3.2.1 Enumerations and types - -Libical is strongly typed, soo every component, property, parameter, -and value type has an enumeration, and some have an associated structure -or union. - -3.2.2 The parser - -The libical parser offers a variety of ways to convert RFC2445 text -into a libical iinsteral component structure. the parser can parse -blocks of text as a string, or it can parse lin-by-line. - -3.2.3 Error objects - -Libical has a substantial error reporting system for both programming -errors and component usage errors. - -3.2.4 Memory Management - -Since many of libicals interfaces return strings, the library has its -own memory management system to elimiate the need to free every string -returned from the libraru. - -3.2.5 Storage classes - -The library also offers several classes to store components to flies, -memory or databases. - -4 Differences From RFCs - -Libical has been designed to follow the standards as closely as possible, -so that the key objects in the standards are also key objects in the -library. However, there are a few areas where the specifications are -(arguably) irregular, and following them exactly would result in an -unfriendly interface. These deviations make libical easier to use -by maintaining a self-similar interface. - -4.1 Pseudo Components - -Libical defines components for groups of properties that look and act -like components, but are not defined as components in the specification. -XDAYLIGHT and XSTANDARD are notable examples. These pseudo components -group properties within the VTIMEZONE components. For instanace, the -timezone properties associated with daylight savings time starts with -"BEGIN:DAYLIGHT" and ends with "END:DAYLIGHT, just like other components, -but is not defined as a component in RFC2445. ( See RFC2445, page -61 ) In Libical,this grouping is represented by the XDAYLIGHT component. -Standard iCAL components all start with the letter "V," while pseudo -components start with"X." - -There are also pseudo components that are conceptually derived classes -of VALARM. RFC2446 defines what properties may be included in each -component, and for VALARM, the set of properties it may have depends -on the value of the ACTION property. - -For instance, if a VALARM component has an ACTION property with the -value of "AUDIO," the component must also have an "ATTACH" property. -However, if the ACTION value is "DISPLAY," the component must have -a DESCRIPTION property. - -To handle these various, complex restrictions, libical has pseudo components -for each type of alarm: XAUDIOALARM, XDISPLAYALARM, XEMAILALARM and -XPROCEDUREALARM. - -4.2 Combined Values - -Many values can take more than one type. TRIGGER, for instance, can -have a value type of with DURATION or of DATE-TIME. These multiple -types make it difficult to create routines to return the value associated -with a property. - -It is natural to have interfaces that would return the value of a property, -but it is cumbersome for a single routine to return multiple types. -So, in libical, properties that can have multiple types are given -a single type that is the union of their RFC2445 types. For instance, -in libical, the value of the TRIGGER property resolves to struct icaltriggertype. -This type is a union of a DURATION and a DATE-TIME. - -4.3 Multi-Valued Properties - -Some properties, such as CATEGORIES have only one value type, but each -CATEGORIES property can have multiple value instances. This also results -in a cumbersome interface -- CATEGORIES accessors would have to return -a list while all other accessors returned a single value. In libical, -all properties have a single value, and multi-valued properties are -broken down into multiple single valued properties during parsing. -That is, an input line like, - -CATEGORIES: work, home - -becomes in libical's internal representation - -CATEGORIES: work - -CATEGORIES: home - -Oddly, RFC2445 allows some multi-valued properties ( like FREEBUSY -) to exist as both a multi-values property and as multiple single -value properties, while others ( like CATEGORIES ) can only exist -as single multi-valued properties. This makes the internal representation -for CATEGORIES illegal. However when you convert a component to a -string, the library will collect all of the CATEGORIES properties -into one. - -5 Using libical - -5.1 Creating Components - -There are three ways to create components in Libical: creating individual -objects and assembling them, building entire objects in massive vaargs -calls, and parsing a text file containing iCalendar data. - -5.1.1 Constructor Interfaces - -Using constructor interfaces, you create each of the objects separately -and then assemble them in to components: - -icalcomponent *event; - -icalproperty *prop; - -icalparameter *param; - -struct icaltimetype atime; - -event = icalcomponent_new(ICAL_VEVENT_COMPONENT); - -prop = icalproperty_new_dtstamp(atime) ; - -icalcomponent_add_property(event, prop); - -prop = icalproperty_new_uid(''guid-1.host1.com'') ); - -icalcomponent_add_property(event,prop); - -prop=icalproperty_new_organizer(''mrbig@host.com''); - -param = icalparameter_new_role(ICAL_ROLE_CHAIR) - -icalproperty_add_parameter(prop, param); - -icalcomponent_add_property(event,prop); - -Notice that libical uses a semi-object-oriented style of interface. -Most things you work with are objects, that are instantiated with -a constructor that has "new" in the name. Also note that, other than -the object reference, most structure data is passed in to libical -routines by value. Libical has some complex but very regular memory -handling rules. These are detailed in section [sec:memory]. - -If any of the constructors fail, they will return 0. If you try to -insert 0 into a property or component, or use a zero-valued object -reference, libical will either silently ignore the error or will abort -with an error message. This behavior is controlled by a compile time -flag (ICAL_ERRORS_ARE_FATAL), and will abort by default. - -5.1.2 vaargs Constructors - -There is another way to create complex components, which is arguably -more elegant, if you are not horrified by varargs. The varargs constructor -interface allows you to create intricate components in a single block -of code. Here is the previous examples in the vaargs style. - - calendar = - - icalcomponent_vanew( - - ICAL_VCALENDAR_COMPONENT, - - icalproperty_new_version(''2.0''), - - icalproperty_new_prodid( - - ''-//RDU Software//NONSGML HandCal//EN''), - - icalcomponent_vanew( - - ICAL_VEVENT_COMPONENT, - - icalproperty_new_dtstamp(atime), - - icalproperty_new_uid(''guid-1.host1.com''), - - icalproperty_vanew_organizer( - - ''mrbig@host.com''), - - icalparameter_new_role(ICAL_ROLE_CHAIR), - - 0 - - ), - - icalproperty_vanew_attendee( - - ''employee-A@host.com'', - - icalparameter_new_role( - - ICAL_ROLE_REQPARTICIPANT), - - icalparameter_new_rsvp(1), - - icalparameter_new_cutype(ICAL_CUTYPE_GROUP), - - 0 - - ), - - icalproperty_new_location( - - "1CP Conference Room 4350"), - - 0 - - ), - - 0 - - ); - -This form is similar to the constructor form , except that the constructors -have "vanew" instead of "new" in the name. The arguments are similar -too, except that the component constructor can have a list of properties, -and the property constructor can have a list of parameters. Be sure -to terminate every list with a '0', or your code will crash, if you -are lucky. - -5.1.3 Parsing Text Files - -The final way to create components will probably be the most common; -you can create components from RFC2445 compliant text. If you have -the string in memory, use - -icalcomponent* icalparser_parse_string(char* str); - -If the string contains only one component, the parser will return the -component in libical form. If the string contains multiple components, -the multiple components will be returned as the children of an ICAL_XROOT_COMPONENT -component. - -Parsing a whole string may seem wasteful if you want to pull a large -component off of the network or from a file; you may prefer to parse -the component line by line. This is possible too by using: - -icalparser* icalparser_new(); - -void icalparser_free(icalparser* parser); - -icalparser_get_line(parser,read_stream); - -icalparser_add_line(parser,line); - -icalparser_set_gen_data(parser,stream) - -These routines will construct a parser object to which you can add -lines of input and retrieve any components that the parser creates -from the input. These routines work by specifing an adaptor routine -to get string data from a source. For an example: - -char* read_stream(char *s, size_t size, void *d) - -{ - - char *c = fgets(s,size, (FILE*)d); - - return c; - -} - -main() { - - char* line; - - icalcomponent *c; - - icalparser *parser = icalparser_new(); - - FILE* stream = fopen(argv[1],"r"); - - icalparser_set_gen_data(parser,stream); - - do{ - - line = icalparser_get_line(parser,read_stream); - - c = icalparser_add_line(parser,line); - - if (c != 0){ - - printf("%s",icalcomponent_as_ical_string(c)); - - icalparser_claim(parser); - - printf("\n---------------\n"); - - icalcomponent_free(c); - - } - - } while ( line != 0); - -} - -The parser object parameterizes the routine used to get input lines -with icalparser_set_gen_data() and icalparser_get_line(). In this -example, the routine read_stream() will fetch the next line from a -stream, with the stream passed in as the void* parameter d. The parser -calls read_stream() from icalparser_get_line(), but it also needs -to know what stream to use. This is set by the call to icalparser_set_gen_data(). -By using a different routine for read_stream or passing in different -data with icalparser_set_gen_data, you can connect to any data source. - -Using the same mechanism, other implementations could read from memory -buffers, sockets or other interfaces. - -Since the example code is a very common way to use the parser, there -is a convenience routine; - -icalcomponent* icalparser_parse(icalparser *parser, - - char* (*line_gen_func)(char *s, size_t size, void* -d)) - -To use this routine, you still must construct the parser object and -pass in a reference to a line reading routine. If the parser can create -a single component from the input, it will return a pointer to the -newly constructed component. If the parser can construct multiple -components from the input, it will return a reference to an XROOT -component ( of type ICAL_XROOT_COMPONENT.) This XROOT component will -hold all of the components constructed from the input as children. - -5.2 Accessing Components - -Given a reference to a component, you probably will want to access -the properties, parameters and values inside. Libical interfaces let -you find sub-component, add and remove sub-components, and do the -same three operations on properties. - -5.2.1 Finding Components - -To find a sub-component of a component, use: - -icalcomponent* icalcomponent_get_first_component( - - icalcomponent* component, - - icalcomponent_kind kind); - -This routine will return a reference to the first component of the -type 'kind.' The key kind values, listed in icalenums.h are: - -ICAL_ANY_COMPONENT - -ICAL_VEVENT_COMPONENT - -ICAL_VTODO_COMPONENT - -ICAL_VJOURNAL_COMPONENT - -ICAL_VCALENDAR_COMPONENT - -ICAL_VFREEBUSY_COMPONENT - -ICAL_VALARM_COMPONENT - -These are only the most common components; there are many more listed -in icalenums.h. - -As you might guess, if there is more than one subcomponent of the type -you have chosen, this routine will return only the first. to get at -the others, you need to iterate through the component. - -5.2.2 Iterating Through Components - -Iteration requires a second routine to get the next subcomponent after -the first: - -icalcomponent* icalcomponent_get_next_component( - - icalcomponent* component, - - icalcomponent_kind kind); - -With the 'first' and 'next' routines, you can create a for loop to -iterate through all of a components subcomponents - - for(c = icalcomponent_get_first_component(comp,ICAL_ANY_COMPONENT); - - c != 0; - - c = icalcomponent_get_next_component(comp,ICAL_ANY_COMPONENT)) - -{ - - do_something(c); - -} - -This code bit wil iterate through all of the subcomponents in 'comp' -but you can select a specific type of component by changing ICAL_ANY_COMPONENT -to another component type. - -5.2.3 Using Component Iterators - -The iteration model in the previous section requires the component -to keep the state of the iteration. So, you could not use this model -to perform a sorting operations, since you'd need two iterators and -there is only space for one. If you ever call icalcomponent_get_first_component() -when an iteration is in progress, the pointer will be reset to the -beginning. - -To solve this problem, there are also external iterators for components. -The routines associated with these external iterators are: - -icalcompiter icalcomponent_begin_component(icalcomponent* component, -icalcomponent_kind kind); - -icalcompiter icalcomponent_end_component(icalcomponent* component, -icalcomponent_kind kind); - -icalcomponent* icalcompiter_next(icalcompiter* i); - -icalcomponent* icalcompiter_prior(icalcompiter* i); - -icalcomponent* icalcompiter_deref(icalcompiter* i); - -The _begin_() and _end_() routines return a new iterator that points -to the beginning and ending of the list of subcomponent for the given -component, and the kind argument works like the kind argument for -internal iterators. - -After creating an iterators, use _next_() and _prior_() to step forward -and backward through the list and get the component that the iterator -points to, and use _deref() to return the component that the iterator -points to without moving the iterator. All routines will return 0 -when they move to point off the end of the list. - -Here is an example of a loop using these routines: - -for( - - i = icalcomponent_begin_component(impl->cluster,ICAL_ANY_COMPONENT); - - icalcompiter_deref(&i)!= 0; - - icalcompiter_next(&i) - -) { - - icalcomponent *this = icalcompiter_deref(&i); - -} - -5.2.4 Removing Components - -Removing an element from a list while iterating through the list with -the internal iterators can cause problems, since you will probably -be removing the element that the internal iterator points to. The -_remove() routine will keep the iterator valid by moving it to the -next component, but in a normal loop, this will result in two advances -per iteration, and you will remove only every other component. To -avoid the problem, you will need to step the iterator ahead of the -element you are going to remove, like this: - -for(c = icalcomponent_get_first_component(parent_comp,ICAL_ANY_COMPONENT); - - c != 0; - - c = next - -{ - - next = icalcomponent_get_next_component(parent_comp,ICAL_ANY_COMPONENT); - - icalcomponent_remove_component(parent_comp,c); - -} - -Another way to remove components is to rely on the side effect of icalcomponent_remove_component: -if component iterator in the parent component is pointing to the child -that will be removed, it will move the iterator to the component after -the child. The following code will exploit this behavior: - -icalcomponent_get_first_component(parent_comp,ICAL_VEVENT_COMPONENT); - -while((c=icalcomponent_get_current_component(c)) != 0 ){ - - if(icalcomponent_isa(c) == ICAL_VEVENT_COMPONENT){ - - icalcomponent_remove_component(parent_comp,inner); - - } else { - - icalcomponent_get_next_component(parent_comp,ICAL_VEVENT_COMPONENT); - - } - -} - -5.2.5 Working with properties and parameters - -Finding, iterating and removing properties works the same as it does -for components, using the property-specific or parameter-specific -interfaces: - -icalproperty* icalcomponent_get_first_property( - - icalcomponent* component, - - icalproperty_kind kind); - -icalproperty* icalcomponent_get_next_property( - - icalcomponent* component, - - icalproperty_kind kind); - -void icalcomponent_add_property( - - icalcomponent* component, - - icalproperty* property); - -void icalcomponent_remove_property( - - icalcomponent* component, - - icalproperty* property); - -For parameters: - -icalparameter* icalproperty_get_first_parameter( - - icalproperty* prop, - - icalparameter_kind kind); - -icalparameter* icalproperty_get_next_parameter( - - icalproperty* prop, - - icalparameter_kind kind); - -void icalproperty_add_parameter( - - icalproperty* prop, - - icalparameter* parameter); - -void icalproperty_remove_parameter( - - icalproperty* prop, - - icalparameter_kind kind); - -Note that since there should be only one parameter of each type in -a property, you will rarely need to use icalparameter_get_nect_paameter. - -5.2.6 Working with values - -Values are typically part of a property, although they can exist on -their own. You can manipulate them either as part of the property -or independently. - -The most common way to work with values to is to manipulate them from -they properties that contain them. This involves fewer routine calls -and intermediate variables than working with them independently, and -it is type-safe. - -For each property, there are a _get_ and a _set_ routine that access -the internal value. For instanace, for the UID property, the routines -are: - -void icalproperty_set_uid(icalproperty* prop, const char* v) - -const char* icalproperty_get_uid(icalproperty* prop) - -For multi-valued properties, like ATTACH, the value type is usually -a struct or union that holds both possible types. - -If you want to work with the underlying value object, you can get and -set it with: - -icalvalue* icalproperty_get_value (icalproperty* prop) - -void icalproperty_set_value(icalproperty* prop, icalvalue* value); - -Icalproperty_get_value() will return a reference that you can manipulate -with other icalvalue routines. Most of the time, you will have to -know what the type of the value is. For instance, if you know that -the value is a DATETIME type, you can manipulate it with: - -struct icaltimetype icalvalue_get_datetime(icalvalue* value); - -void icalvalue_set_datetime(icalvalue* value, struct icaltimetype v); - -When working with an extension property or value (and X-PROPERTY or -a property that has the parameter VALUE=x-name ) the value type is -always a string. To get and set the value, use: - -void icalproperty_set_x(icalproperty* prop, char* v); - -char* icalproperty_get_x(icalproperty* prop); - -All X properties have the type of ICAL_X_PROPERTY, so you will need -these routines to get and set the name of the property: - -char* icalproperty_get_x_name(icalproperty* prop) - -void icalproperty_set_x_name(icalproperty* prop, char* name); - -5.2.7 Checking Component Validity - -RFC 2446 defines rules for what properties must exist in a component -to be used for transferring scheduling data. Most of these rules relate -to the existence of properties relative to the METHOD property, which -declares what operation a remote receiver should use to process a -component. For instance, if the METHOD is REQUEST and the component -is a VEVENT, the sender is probably asking the receiver to join in -a meeting. In this case, RFC2446 says that the component must specify -a start time (DTSTART) and list the receiver as an attendee (ATTENDEE). - -Libical can check these restrictions with the routine: - -int icalrestriction_check(icalcomponent* comp); - -This routine returns 0 if the component does not pass RFC2446 restrictions, -or if the component is malformed. The component you pass in must be -a VCALENDAR, with one or more children, like the examples in RFC2446. - -When this routine runs, it will insert new properties into the component -to indicate any errors it finds. See section 6.5.3, X-LIC-ERROR for -more information about these error properties. - -5.2.8 Converting Components to Text - -To create an RFC2445 compliant text representation of an object, use -one of the *_as_ical_string() routines: - -char* icalcomponent_as_ical_string (icalcomponent* component) - -char* icalproperty_as_ical_string (icalproperty* property) - -char* icalparameter_as_ical_string (icalparameter* parameter) - -char* icalvalue_as_ical_string (icalvalue* value) - -In most cases, you will only use icalcomponent_as_ical_string (), since -it will cascade and convert all of the parameters, properties and -values that are attached to the root component. - -Icalproperty_as_ical_string() will terminate each line with the RFC2445 -specified line terminator "\\n" However, if you compile with the symbol -ICAL_UNIX_NEWLINE undefined, ( it is defined by default) it will terminate -lines with "\\n\\r" - -Remember that the string returned by these routines is owned by the -library, and will eventually be re-written. You should copy it if -you want to preserve it. - -5.3 Time - -5.3.1 Time structure - -LIbical defines it's own time structure for storing all dates and times. -It would have been nice to re-use the C library's struct tm, but that -structure does not differentiate between dates and times, and between -local time and UTC. The libical structure is: - -struct icaltimetype { - - int year; - - int month; - - int day; - - int hour; - - int minute; - - int second; - - int is_utc; /* 1-> time is in UTC timezone */ - - int is_date; /* 1 -> interpret this as date. */ }; - -The year, month, day, hour, minute and second fields hold the broken-out -time values. The is_utc field distinguishes between times in UTC and -a local time zone. The is_date field indicates if the time should -be interpreted only as a date. If it is a date, the hour, minute and -second fields are assumed to be zero, regardless of their actual vaules. - -5.3.2 Creating time structures - -There are several ways to create a new icaltimetype structure: - -struct icaltimetype icaltime_from_string(const char* str); - -struct icaltimetype icaltime_from_timet(time_t v, int is_date); - -struct icaltimetype icaltime_from_int(int v, int is_date, int is_utc); - -Icaltime_from_string takes any RFC2445 compliant time string: - -struct icaltimetype tt = icaltime_from_string("19970101T103000"); - -Icaltime_from_timet takes a timet value, representing seconds past -the POSIX epoch, and a flag to indicate if the time is a date. Dates -have an identical structure to a time, but the time portion ( hours, -minuts and seconds ) is always 00:00:00. Dates act differently in -sorting an comparision, and they have a different string representation -in RFC2445. - -The icaltime_from_int is like icaltime_from_timet, but with an arbitrary -epoch. This routine was a mistake and is deprecated. - -5.3.3 Time manipulating routines - -The null time value is used to indicate that the data in the structure -is not a valid time. - -struct icaltimetype icaltime_null_time(void); - -int icaltime_is_null_time(struct icaltimetype t); - -It is sensible for the broken-out time fields to contain values that -are not permitted in an ISO compliant time string. For instance, the -seconds field can hold values greater than 59, and the hours field -can hold values larger than 24. The excessive values will be rolled -over into the next larger field when the structure is normalized. - -struct icaltimetype icaltime_normalize(struct icaltimetype t); - -Normalizing allows you to do arithmetic operations on time values. - -struct icaltimetype tt = icaltime_from_string("19970101T103000"); - -tt.days +=3 - -tt.second += 70; - -tt = icaltime_normalize(tt); - -There are several routines to get the day of the week or month, etc, -from a time structure. - -short icaltime_day_of_year(struct icaltimetype t); - -struct icaltimetype icaltime_from_day_of_year(short doy, short year); - -short icaltime_day_of_week(struct icaltimetype t); - -short icaltime_start_doy_of_week(struct icaltimetype t); - -short icaltime_week_number(short day_of_month, short month, short year); - -struct icaltimetype icaltime_from_week_number(short week_number, short -year); - -short icaltime_days_in_month(short month,short year); - -Two routines convert time structures to and from the number of seconds -since the POSIX epoch. The is_date field indicates whether or not -the hour, minute and second fields should be used in the conversion. - -struct icaltimetype icaltime_from_timet(time_t v, int is_date); - -time_t icaltime_as_timet(struct icaltimetype); - -The compare routine works exactly like strcmp, but on time structures. - -int icaltime_compare(struct icaltimetype a,struct icaltimetype b); - -The following routines convert between UTC and a named timezone. The -tzid field must be a timezone name from the Olsen database, such as -"America/Los_Angeles." - -The utc_offset routine returns the offset of the named time zone from -UTC, in seconds. - -The tt parameter in the following routines indicates the date on which -the conversion should be made. The tt parameter is necessary because -timezones have many different rules for when daylight savings time -is used, and these rules can change over time. So, for a single timezone -one year may have daylight savings time on March 15, but for other -years March 15 may be standard time, and some years may have standard -time all year. - -int icaltime_utc_offset(struct icaltimetype tt, char* tzid); - -int icaltime_local_utc_offset(); - -struct icaltimetype icaltime_as_utc(struct icaltimetype tt,char* tzid); - -struct icaltimetype icaltime_as_zone(struct icaltimetype tt,char* tzid); - -struct icaltimetype icaltime_as_local(struct icaltimetype tt); - -5.4 Storing Objects - -The libical distribution includes a separate library, libicalss, that -allows you to store iCal component data to disk in a variety of ways. -This library also includes code to implement the CSTP protocol of -CAP and has some routines for deciphering incomming messages. - -The file storage routines are organized in an inheritance heirarchy -that is rooted in icalset, with the derived class icalfileset and -icaldirset. Icalfileset stores components to a file, while icaldirset -stores components to multiple files, one per month based on DTSTAMP. -Other storages classess, for storage to a heap or a mysql database -are planned for the future. - -All of the icalset derived classes have the same interface: - -icaldirset* icaldirset_new(const char* path); - -void icaldirset_free(icaldirset* store); - -const char* icaldirset_path(icaldirset* store); - -void icaldirset_mark(icaldirset* store); - -icalerrorenum icaldirset_commit(icaldirset* store); - -icalerrorenum icaldirset_add_component(icaldirset* store, icalcomponent* -comp); - -icalerrorenum icaldirset_remove_component(icaldirset* store, icalcomponent* -comp); - -int icaldirset_count_components(icaldirset* store, icalcomponent_kind -kind); - -icalerrorenum icaldirset_select(icaldirset* store, icalcomponent* gauge); - -void icaldirset_clear(icaldirset* store); - -icalcomponent* icaldirset_fetch(icaldirset* store, const char* uid); - -int icaldirset_has_uid(icaldirset* store, const char* uid); - -icalcomponent* icaldirset_fetch_match(icaldirset* set, icalcomponent -*c); - -icalerrorenum icaldirset_modify(icaldirset* store, icalcomponent *oldc, -icalcomponent *newc); - -icalcomponent* icaldirset_get_current_component(icaldirset* store); - -icalcomponent* icaldirset_get_first_component(icaldirset* store); - -icalcomponent* icaldirset_get_next_component(icaldirset* store); - -5.4.1 Creating a new set - -You can create a new set from either the base class or the direved -class. From the base class use one of: - -icalset* icalset_new_file(const char* path); - -icalset* icalset_new_dir(const char* path); - -icalset* icalset_new_heap(void); - -icalset* icalset_new_mysql(const char* path); - -You can also create a new set based on the derived class, For instance, -with icalfileset: - -icalfileset* icalfileset_new(const char* path); - -icalfileset* icalfileset_new_open(const char* path, int flags, mode_t -mode); - -Icaset_new_file is identical to icalfileset_new. BOth routines will -open an existing file for readinga and writing, or create a new file -if it does not exist. Icalfilset_new_open takes the same arguments -as the open() system routine and behaves in the same way. - -The icalset and icalfilset objects are somewhat interchangable -- you -can use an icalfileset* as an argument to any of the icalset routines. - -The following examples will all use icalfileset routines; using the -other icalset derived classess will be similar. - -5.4.2 Adding, Finding and Removing Components - -To add components to a set, use: - -icalerrorenum icalfileset_add_component(icalfileset* cluster, icalcomponent* -child); - -The fileset keeps an inmemory copy of the components, and this set -must be written back to the file ocassionally. There are two routines -to manage this: - -void icalfileset_mark(icalfileset* cluster); - -icalerrorenum icalfileset_commit(icalfileset* cluster); - -Icalfileset_mark indicates that the in-memory components have changed. -Calling the _add_component routine will call _mark automatically, -but you may need to call it yourself if you have made a change to -an existing component. The _commit routine writes the data base to -disk, but only if it is marked. The _commit routine is called automatically -when the icalfileset is freed. - -To iterate through the components in a set, use: - -icalcomponent* icalfileset_get_first_component(icalfileset* cluster); - -icalcomponent* icalfileset_get_next_component(icalfileset* cluster); - -icalcomponent* icalfileset_get_current_component (icalfileset* cluster); - -These routines work like the corresponding routines from icalcomponent, -except that their output is filtered through a gauge. A gauge is a -test for the properties within a components; only components that -pass the test are returned. A gauge can be constructed from a MINSQL -string with: - -icalgauge* icalgauge_new_from_sql(char* sql); - -Then, you can add the gauge to the set with : - -icalerrorenum icalfileset_select(icalfileset* store, icalgauge* gauge); - -Here is an example that puts all of these routines together: - -void test_fileset() - -{ - - icalfileset *fs; - - icalcomponent *c; - - int i; - - char *path = "test_fileset.ics"; - - icalgauge *g = icalgauge_new_from_sql( - - "SELECT * FROM VEVENT WHERE DTSTART > '20000103T120000Z' AND -DTSTART <= '20000106T120000Z'"); - - - - fs = icalfileset_new(path); - - - - for (i = 0; i!= 10; i++){ - - c = make_component(i); /* Make a new component where DTSTART -has month of i */ - - icalfileset_add_component(fs,c); - - } - - icalfileset_commit(fs); /* Write to disk */ - - icalfileset_select(fs,g); /* Set the gauge to filter components -*/ - - - - for (c = icalfileset_get_first_component(fs); - - c != 0; - - c = icalfileset_get_next_component(fs)){ - - struct icaltimetype t = icalcomponent_get_dtstart(c); - - - - printf("%s\n",icaltime_as_ctime(t)); - - } - - icalfileset_free(fs); - -} - -5.4.3 Other routines - -There are several other routines in the icalset interface, but they -not fully implemented yet. - -5.5 <sec:memory>Memory Management - -Libical relies heavily on dynamic allocation for both the core objects -and for the strings used to hold values. Some of this memory the library -caller owns and must free, and some of the memory is managed by the -library. Here is a summary of the memory rules. - -1) If the function name has "new" in it, the caller gets control - of the memory. ( such as icalcomponent_new(), or icalproperty_new_clone() - ) - -2) If you got the memory from a routine with new in it, you must - call the corresponding *_free routine to free the memory. ( Use - icalcomponent_free() to free objects created with icalcomponent_new()) - -3) If the function name has "add" in it, the caller is transferring - control of the memory to the routine. ( icalproperty_add_parameter() ) - -4) If the function name has "remove" in it, the caller passes in - a pointer to an object and after the call returns, the caller owns - the object. So, before you call icalcomponent_remove_property(comp,foo), - you do not own "foo" and after the call returns, you do. - -5) If the routine returns a string, libical owns the memory and will - put it on a ring buffer to reclaim later. For example, icalcomponent_as_ical_string(). - You'd better strdup() it if you want to keep it, and you don't have - to delete it. - -5.6 Error Handling - -Libical has several error handling mechanisms for the various types -of programming, semantic and syntactic errors you may encounter. - -5.6.1 Return values - -Many library routines signal errors through their return values. All -routines that return a pointer, such as icalcomponent_new(), will -return 0 ( zero ) on a fatal error. Some routines will return a value -of enum icalerrorenum. - -5.6.2 icalerrno - -Most routines will set the global error value icalerrno on errors. -This variable is an enumeration; permissible values can be found in -libical/icalerror.h. If the routine returns an enum icalerrorenum, -then the return value will be the same as icalerrno. You can use icalerror_strerror() -to get a string that describes the error. The enumerations are: - -* ICAL_BADARG_ERROR -- One of the argument to a routine was bad. Typically - for a null pointer. - -* ICAL_NEWFAILED_ERROR -- A new() or malloc() failed - -* ICAL_MALFORMEDDATA_ERROR -- An input string was not in the correct - format - -* ICAL_PARSE_ERROR -- The parser failed to parse an incomming component - -* ICAL_INTERNAL_ERROR -- Largely equivalent to an assert - -* ICAL_FILE_ERROR -- A file operation failed. Check errno for more - detail. - -* ICAL_ALLOCATION_ERROR -- ? - -* ICAL_USAGE_ERROR -- ? - -* ICAL_NO_ERROR -- No error - -* ICAL_MULTIPLEINCLUSION_ERROR -- ? - -* ICAL_TIMEDOUT_ERROR -- For CSTP and acquiring locks - -* ICAL_UNKNOWN_ERROR -- ? - -5.6.3 X-LIC-ERROR and X-LIC-INVALID-COMPONENT - -The library handles semantic and syntactic errors in components by -inserting errors properties into the components. If the parser cannot -parse incoming text ( a syntactic error ) or if the icalrestriction_check() -routine indicates that the component does not meet the requirements -of RFC2446 ( a semantic error) the library will insert properties -of the type X-LIC-ERROR to describe the error. Here is an example -of the error property: - -X-LIC-ERROR;X-LIC-ERRORTYPE=INVALID_ITIP :Failed iTIP restrictions -for property DTSTART. - -Expected 1 instances of the property and got 0 - -This error resulted from a call to icalrestriction_check(), which discovered -that the component does not have a DTSTART property, as required by -RFC2445. - -There are a few routines to manipulate error properties: - -[ The following data is supposed to be in a table. It looks OK in LyX, -but does not format propertly in output. ] - -+-------------------------------------+---------------------------------------------------------+ -| Routine | Purpose | -+-------------------------------------+---------------------------------------------------------+ -| void icalrestriction_check() | Check a component against RFC2446 and insert | -+-------------------------------------+---------------------------------------------------------+ -| | error properties to indicate non compliance | -+-------------------------------------+---------------------------------------------------------+ -| int icalcomponent_count_errors() | Return the number of error properties | -+-------------------------------------+---------------------------------------------------------+ -| | in a component | -+-------------------------------------+---------------------------------------------------------+ -| void icalcomponent_strip_errors() | Remove all error properties in as | -+-------------------------------------+---------------------------------------------------------+ -| | component | -+-------------------------------------+---------------------------------------------------------+ -| void icalcomponent_convert_errors() | Convert some error properties into | -+-------------------------------------+---------------------------------------------------------+ -| | REQUESTS-STATUS proprties to indicate the inability to | -+-------------------------------------+---------------------------------------------------------+ -| | process the component as an iTIP request. | -+-------------------------------------+---------------------------------------------------------+ - - -The types of errors are listed in icalerror.h. They are: - -ICAL_XLICERRORTYPE_COMPONENTPARSEERROR - -ICAL_XLICERRORTYPE_PARAMETERVALUEPARSEERROR - -ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR - -ICAL_XLICERRORTYPE_PROPERTYPARSEERROR - -ICAL_XLICERRORTYPE_VALUEPARSEERROR - -ICAL_XLICERRORTYPE_UNKVCALPROP - -ICAL_XLICERRORTYPE_INVALIDITIP - -The libical parser will generate the error that end in PARSEERROR when -it encounters garbage in the input steam. ICAL_XLICERRORTYPE_INVALIDITIP -is inserted by icalrestriction_check(), and ICAL_XLICERRORTYPE_UNKVCALPROP -is generated by icalvcal_convert() when it encounters a vCal property -that it cannot convert or does not know about. - -Icalcomponent_convert_errors() converts some of the error properties -in a component into REQUEST-STATUS properties that indicate a failure. -As of libical version0.18, this routine only convert *PARSEERROR errors -and it always generates a 3.x ( failure ) code. This makes it more -of a good idea than a really useful bit of code. - -5.6.4 ICAL_ERRORS_ARE_FATAL and icalerror_errors_are_fatal - -If the global variable icalerror_errors_are_fatal is set to 1, then -any error condition will cause the program to abort. The abort occurs -in icalerror_set_errno(), and is done with an assert(0) if NDEBUG -is undefined, and with icalerror_crash_here if NDEBUG is defined. -The default value of icalerror_errors_are_fatal is 1 when ICAL_ERRORS_ARE_FATAL -is defined, and 0 otherwise. Since ICAL_ERRORS_ARE_FATAL is defined -by default, icalerror_errors_are_fatal is also defined by default. - -5.7 Naming Standard - -Structures that you access with the "struct" keyword, such as "struct -icaltimetype" are things that you are allowed to see inside and poke -at. - -Structures that you access though a typedef, such as "icalcomponent" -are things where all of the data is hidden. - -Component names that start with "V" are part of RFC 2445 or another -iCal standard. Component names that start with "X" are also part of -the spec, but they are not actually components in the spec. However, -they look and act like components, so they are components in libical. -Names that start with "XLIC" or "X-LIC" are not part of any iCal spec. -They are used internally by libical. - -Enums that identify a component, property, value or parameter end with -"_COMPONENT," "_PROPERTY," "_VALUE," or "_PARAMETER"s - -Enums that identify a parameter value have the name of the parameter -as the second word. For instance: ICAL_ROLE_REQPARTICIPANT or ICAL_PARTSTAT_ACCEPTED. - -The enums for the parts of a recurarance rule and request statuses -are irregular. - -6 Hacks and Bugs - -There are a lot of hacks in the library -- bits of code that I am not -proud of and should probably be changed. These are marked with the -comment string "HACK." - -7 Library Reference - -7.1 Manipulating struct icaltimetype - -7.1.1 Struct icaltimetype - -struct icaltimetype - -{ - - int year; - - int month; - - int day; - - int hour; - - int minute; - - int second; - - int is_utc; - - int is_date; - - const char* zone; - -}; diff --git a/libical/examples/.cvsignore b/libical/examples/.cvsignore deleted file mode 100644 index 29ef3ef4c8..0000000000 --- a/libical/examples/.cvsignore +++ /dev/null @@ -1,5 +0,0 @@ -.libs -.deps -Makefile -Makefile.in -doesnothing diff --git a/libical/examples/Makefile.am b/libical/examples/Makefile.am deleted file mode 100644 index 99e33d3400..0000000000 --- a/libical/examples/Makefile.am +++ /dev/null @@ -1,15 +0,0 @@ - -noinst_PROGRAMS = doesnothing - -LDADD = ../src/libical/libical.a ../src/libicalss/libicalss.la ../src/libicalvcal/libicalvcal.la -INCLUDES = -I . -I../src/libical -I$(srcdir)/../src/libical -I../src/libicalss -I../src/libicalvcal - -INCLUDES = -I. -I../src/libical -I$(srcdir)/../src/libical -I../src/libicalss -I../src/libicalvcal - -doesnothing_SOURCES = \ - access_components.c \ - access_properties_and_parameters.c \ - errors.c \ - main.c \ - parse_text.c - diff --git a/libical/examples/access_components.c b/libical/examples/access_components.c deleted file mode 100644 index cc5a33d6d2..0000000000 --- a/libical/examples/access_components.c +++ /dev/null @@ -1,319 +0,0 @@ -/* Access_component.c */ - -#include "ical.h" - -#include <assert.h> -#include <string.h> /* for strdup */ -#include <stdlib.h> /* for malloc */ -#include <stdio.h> /* for printf */ -#include <time.h> /* for time() */ -#include "icalmemory.h" - -void do_something(icalcomponent *c); - -/* Creating iCal Components - - There are two ways to create new component in libical. You can - build the component from primitive parts, or you can create it - from a string. - - There are two variations of the API for building the component from - primitive parts. In the first variation, you add each parameter and - value to a property, and then add each property to a - component. This results in a long series of function calls. This - style is show in create_new_component() - - The second variation uses vargs lists to nest many primitive part - constructors, resulting in a compact, neatly formated way to create - components. This style is shown in create_new_component_with_va_args() - - - -*/ - -icalcomponent* create_new_component() -{ - - /* variable definitions */ - icalcomponent* calendar; - icalcomponent* event; - struct icaltimetype atime = icaltime_from_timet( time(0),0); - struct icalperiodtype rtime; - icalproperty* property; - - /* Define a time type that will use as data later. */ - rtime.start = icaltime_from_timet( time(0),0); - rtime.end = icaltime_from_timet( time(0),0); - rtime.end.hour++; - - /* Create calendar and add properties */ - - calendar = icalcomponent_new(ICAL_VCALENDAR_COMPONENT); - - /* Nearly every libical function call has the same general - form. The first part of the name defines the 'class' for the - function, and the first argument will be a pointer to a struct - of that class. So, icalcomponent_ functions will all take - icalcomponent* as their first argument. */ - - /* The next call creates a new proeprty and immediately adds it to the - 'calendar' component. */ - - icalcomponent_add_property( - calendar, - icalproperty_new_version("2.0") - ); - - - /* Here is the short version of the memory rules: - - If the routine name has "new" in it: - Caller owns the returned memory. - If you pass in a string, the routine takes the memory. - - If the routine name has "add" in it: - The routine takes control of the component, property, - parameter or value memory. - - If the routine returns a string ( "get" and "as_ical_string" ) - The library owns the returned memory. - - There are more rules, so refer to the documentation for more - details. - - */ - - icalcomponent_add_property( - calendar, - icalproperty_new_prodid("-//RDU Software//NONSGML HandCal//EN") - ); - - /* Add an event */ - - event = icalcomponent_new(ICAL_VEVENT_COMPONENT); - - icalcomponent_add_property( - event, - icalproperty_new_dtstamp(atime) - ); - - /* In the previous call, atime is a struct, and it is passed in by value. - This is how all compound types of values are handled. */ - - icalcomponent_add_property( - event, - icalproperty_new_uid("guid-1.host1.com") - ); - - /* add a property that has parameters */ - property = icalproperty_new_organizer("mailto:mrbig@host.com"); - - icalproperty_add_parameter( - property, - icalparameter_new_role(ICAL_ROLE_CHAIR) - ); - - icalcomponent_add_property(event,property); - - /* In this style of component creation, you need to use an extra - call to add parameters to properties, but the form of this - operation is the same as adding a property to a component */ - - /* add another property that has parameters */ - property = icalproperty_new_attendee("mailto:employee-A@host.com"); - - icalproperty_add_parameter( - property, - icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT) - ); - - icalproperty_add_parameter( - property, - icalparameter_new_rsvp(1) - ); - - icalproperty_add_parameter( - property, - icalparameter_new_cutype(ICAL_CUTYPE_GROUP) - ); - - icalcomponent_add_property(event,property); - - - /* more properties */ - - icalcomponent_add_property( - event, - icalproperty_new_description("Project XYZ Review Meeting") - ); - - icalcomponent_add_property( - event, - icalproperty_new_categories("MEETING") - ); - - icalcomponent_add_property( - event, - icalproperty_new_class("PUBLIC") - ); - - icalcomponent_add_property( - event, - icalproperty_new_created(atime) - ); - - icalcomponent_add_property( - event, - icalproperty_new_summary("XYZ Project Review") - ); - - property = icalproperty_new_dtstart(atime); - - icalproperty_add_parameter( - property, - icalparameter_new_tzid("US-Eastern") - ); - - icalcomponent_add_property(event,property); - - - property = icalproperty_new_dtend(atime); - - icalproperty_add_parameter( - property, - icalparameter_new_tzid("US-Eastern") - ); - - icalcomponent_add_property(event,property); - - icalcomponent_add_property( - event, - icalproperty_new_location("1CP Conference Room 4350") - ); - - icalcomponent_add_component(calendar,event); - - return calendar; -} - - -/* Now, create the same component as in the previous routine, but use -the constructor style. */ - -icalcomponent* create_new_component_with_va_args() -{ - - /* This is a similar set up to the last routine */ - icalcomponent* calendar; - struct icaltimetype atime = icaltime_from_timet( time(0),0); - struct icalperiodtype rtime; - - rtime.start = icaltime_from_timet( time(0),0); - rtime.end = icaltime_from_timet( time(0),0); - rtime.end.hour++; - - /* Some of these routines are the same as those in the previous - routine, but we've also added several 'vanew' routines. These - 'vanew' routines take a list of properties, parameters or - values and add each of them to the parent property or - component. */ - - calendar = - icalcomponent_vanew( - ICAL_VCALENDAR_COMPONENT, - icalproperty_new_version("2.0"), - icalproperty_new_prodid("-//RDU Software//NONSGML HandCal//EN"), - icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_new_dtstamp(atime), - icalproperty_new_uid("guid-1.host1.com"), - icalproperty_vanew_organizer( - "mailto:mrbig@host.com", - icalparameter_new_role(ICAL_ROLE_CHAIR), - 0 - ), - icalproperty_vanew_attendee( - "mailto:employee-A@host.com", - icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT), - icalparameter_new_rsvp(1), - icalparameter_new_cutype(ICAL_CUTYPE_GROUP), - 0 - ), - icalproperty_new_description("Project XYZ Review Meeting"), - - icalproperty_new_categories("MEETING"), - icalproperty_new_class("PUBLIC"), - icalproperty_new_created(atime), - icalproperty_new_summary("XYZ Project Review"), - icalproperty_vanew_dtstart( - atime, - icalparameter_new_tzid("US-Eastern"), - 0 - ), - icalproperty_vanew_dtend( - atime, - icalparameter_new_tzid("US-Eastern"), - 0 - ), - icalproperty_new_location("1CP Conference Room 4350"), - 0 - ), - 0 - ); - - - /* Note that properties with no parameters can use the regular - 'new' constructor, while those with parameters use the 'vanew' - constructor. And, be sure that the last argument in the 'vanew' - call is a zero. Without, your program will probably crash. */ - - return calendar; -} - - -void find_sub_components(icalcomponent* comp) -{ - icalcomponent *c; - - /* The second parameter to icalcomponent_get_first_component - indicates the type of component to search for. This will - iterate through all sub-components */ - for(c = icalcomponent_get_first_component(comp,ICAL_ANY_COMPONENT); - c != 0; - c = icalcomponent_get_next_component(comp,ICAL_ANY_COMPONENT)){ - - do_something(c); - } - - /* This will iterate only though VEVENT sub-components */ - - for(c = icalcomponent_get_first_component(comp,ICAL_VEVENT_COMPONENT); - c != 0; - c = icalcomponent_get_next_component(comp,ICAL_VEVENT_COMPONENT)){ - - do_something(c); - } - -} - -/* Ical components only have one internal iterator, so removing the - object that the iterator points to can cause problems. Here is the - right way to remove components */ - -void remove_vevent_sub_components(icalcomponent* comp){ - - icalcomponent *c, *next; - - for( c = icalcomponent_get_first_component(comp,ICAL_VEVENT_COMPONENT); - c != 0; - c = next) - { - next = icalcomponent_get_next_component(comp,ICAL_VEVENT_COMPONENT); - - icalcomponent_remove_component(comp,c); - - do_something(c); - } - -} - diff --git a/libical/examples/access_properties_and_parameters.c b/libical/examples/access_properties_and_parameters.c deleted file mode 100644 index ba3d7fcc0b..0000000000 --- a/libical/examples/access_properties_and_parameters.c +++ /dev/null @@ -1,144 +0,0 @@ -/* access_properties_and_parameters.c */ - -#include "ical.h" -#include <string.h> - -/* Get a particular parameter out of a component. This routine will - return a list of strings of all attendees who are required. Note - that this routine assumes that the component that we pass in is a - VEVENT. */ - -void get_required_attendees(icalcomponent* event) -{ - icalproperty* p; - icalparameter* parameter; - - assert(event != 0); - assert(icalcomponent_isa(event) == ICAL_VEVENT_COMPONENT); - - /* This loop iterates over all of the ATTENDEE properties in the - event */ - - /* The iteration routines save their state in the event - struct, so the are not thread safe unless you lock the whole - component. */ - - for( - p = icalcomponent_get_first_property(event,ICAL_ATTENDEE_PROPERTY); - p != 0; - p = icalcomponent_get_next_property(event,ICAL_ATTENDEE_PROPERTY) - ) { - - /* Get the first ROLE parameter in the property. There should - only be one, so we won't bother to iterate over them. But, - you can iterate over parameters just like with properties */ - - parameter = icalproperty_get_first_parameter(p,ICAL_ROLE_PARAMETER); - - /* If the parameter indicates the participant is required, get - the attendees name and stick a copy of it into the output - array */ - - if ( icalparameter_get_role(parameter) == ICAL_ROLE_REQPARTICIPANT) - { - /* Remember, the caller does not own this string, so you - should strdup it if you want to change it. */ - const char *attendee = icalproperty_get_attendee(p); - } - } - -} - -/* Here is a similar example. If an attendee has a PARTSTAT of - NEEDSACTION or has no PARTSTAT parameter, change it to - TENTATIVE. */ - -void update_attendees(icalcomponent* event) -{ - icalproperty* p; - icalparameter* parameter; - - assert(event != 0); - assert(icalcomponent_isa(event) == ICAL_VEVENT_COMPONENT); - - for( - p = icalcomponent_get_first_property(event,ICAL_ATTENDEE_PROPERTY); - p != 0; - p = icalcomponent_get_next_property(event,ICAL_ATTENDEE_PROPERTY) - ) { - - parameter = icalproperty_get_first_parameter(p,ICAL_PARTSTAT_PARAMETER); - - if (parameter == 0) { - - /* There was no PARTSTAT parameter, so add one. */ - icalproperty_add_parameter( - p, - icalparameter_new_partstat(ICAL_PARTSTAT_TENTATIVE) - ); - - } else if (icalparameter_get_partstat(parameter) == ICAL_PARTSTAT_NEEDSACTION) { - /* Remove the NEEDSACTION parameter and replace it with - TENTATIVE */ - - icalproperty_remove_parameter(p,ICAL_PARTSTAT_PARAMETER); - - /* Don't forget to free it */ - icalparameter_free(parameter); - - /* Add a new one */ - icalproperty_add_parameter( - p, - icalparameter_new_partstat(ICAL_PARTSTAT_TENTATIVE) - ); - } - - } -} - -/* Here are some examples of manipulating properties */ - -void test_properties() -{ - icalproperty *prop; - icalparameter *param; - icalvalue *value; - - icalproperty *clone; - - /* Create a new property */ - prop = icalproperty_vanew_comment( - "Another Comment", - icalparameter_new_cn("A Common Name 1"), - icalparameter_new_cn("A Common Name 2"), - icalparameter_new_cn("A Common Name 3"), - icalparameter_new_cn("A Common Name 4"), - 0); - - /* Iterate through all of the parameters in the property */ - for(param = icalproperty_get_first_parameter(prop,ICAL_ANY_PARAMETER); - param != 0; - param = icalproperty_get_next_parameter(prop,ICAL_ANY_PARAMETER)) { - - printf("Prop parameter: %s\n",icalparameter_get_cn(param)); - } - - /* Get a string representation of the property's value */ - printf("Prop value: %s\n",icalproperty_get_comment(prop)); - - /* Spit out the property in its RFC 2445 representation */ - printf("As iCAL string:\n %s\n",icalproperty_as_ical_string(prop)); - - /* Make a copy of the property. Caller owns the memory */ - clone = icalproperty_new_clone(prop); - - /* Get a reference to the value within the clone property */ - value = icalproperty_get_value(clone); - - printf("Value: %s",icalvalue_as_ical_string(value)); - - /* Free the original and the clone */ - icalproperty_free(clone); - icalproperty_free(prop); - -} diff --git a/libical/examples/errors.c b/libical/examples/errors.c deleted file mode 100644 index 86d963bd75..0000000000 --- a/libical/examples/errors.c +++ /dev/null @@ -1,70 +0,0 @@ -/* errors.c */ - -#include "ical.h" -#include <stdio.h> - -void program_errors() -{ - /*Most routines will set icalerrno on errors. This is an - enumeration defined in icalerror.h */ - - icalcomponent *c; - - icalerror_clear_errno(); - - c = icalcomponent_new(ICAL_VEVENT_COMPONENT); - - if (icalerrno != ICAL_NO_ERROR){ - - fprintf(stderr,"Horrible libical error: %s\n", - icalerror_strerror(icalerrno)); - - } - -} - -void component_errors(icalcomponent *comp) -{ - int errors; - icalproperty *p; - - /* presume that we just got this component from the parser */ - - errors = icalcomponent_count_errors(comp); - - printf("This component has %d parsing errors\n", errors); - - /* Print out all of the parsing errors. This is not strictly - correct, because it does not descend into any sub-components, - as icalcomponent_count_errors() does. */ - - for(p = icalcomponent_get_first_property(comp,ICAL_XLICERROR_PROPERTY); - p != 0; - p = icalcomponent_get_next_property(comp,ICAL_XLICERROR_PROPERTY)) - { - - printf("-- The error is %s:\n",icalproperty_get_xlicerror(p)); - } - - - - /* Check the component for iTIP compilance, and add more - X-LIC-ERROR properties if it is non-compilant. */ - icalrestriction_check(comp); - - - /* Count the new errors. */ - if(errors != icalcomponent_count_errors(comp)){ - printf(" -- The component also has iTIP restriction errors \n"); - } - - /* Since there are iTIP restriction errors, it may be impossible - to process this component as an iTIP request. In this case, the - X-LIC-ERROR proeprties should be expressed as REQUEST-STATUS - properties in the reply. This following routine makes this - conversion */ - - - icalcomponent_convert_errors(comp); - -} diff --git a/libical/examples/main.c b/libical/examples/main.c deleted file mode 100644 index 1be2de5c9e..0000000000 --- a/libical/examples/main.c +++ /dev/null @@ -1,12 +0,0 @@ -/* This is just to make the code in the example directory link properly. */ -#include "ical.h" - -int main() -{ - - return 1; -} - - -void do_something(icalcomponent* comp){ -} diff --git a/libical/examples/parse_text.c b/libical/examples/parse_text.c deleted file mode 100644 index b7eba43b8a..0000000000 --- a/libical/examples/parse_text.c +++ /dev/null @@ -1,68 +0,0 @@ -/* parse_text.c - - */ -#include <stdio.h> -#include <errno.h> -#include <stdio.h> -#include <string.h> -#include "ical.h" - -#include <stdlib.h> - -/* The icalparser_get_line routine will create a single *content* line -out of one or more input lines. The content line is all of the -properties and values for a single property, and it can span several -input lines. So, icalparser_get_line will need to be able to get more -data on its own. Read_string is a routine that does this. You can -write your own version of read stream to get data from other types of -files, sockets, etc. */ - -char* read_stream(char *s, size_t size, void *d) -{ - char *c = fgets(s,size, (FILE*)d); - - return c; - -} - -void parse_text(int argc, char* argv[]) -{ - - char* line; - FILE* stream; - icalcomponent *c; - - /* Create a new parser object */ - icalparser *parser = icalparser_new(); - - stream = fopen(argv[1],"r"); - - assert(stream != 0); - - /* Tell the parser what input routie it should use. */ - icalparser_set_gen_data(parser,stream); - - do{ - - /* Get a single content line by making one or more calls to - read_stream()*/ - line = icalparser_get_line(parser,read_stream); - - /* Now, add that line into the parser object. If that line - completes a component, c will be non-zero */ - c = icalparser_add_line(parser,line); - - - if (c != 0){ - printf("%s",icalcomponent_as_ical_string(c)); - - printf("\n---------------\n"); - - icalcomponent_free(c); - } - - } while ( line != 0); - - - icalparser_free(parser); -} diff --git a/libical/scripts/.cvsignore b/libical/scripts/.cvsignore deleted file mode 100644 index b840c21800..0000000000 --- a/libical/scripts/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -Makefile.in -Makefile
\ No newline at end of file diff --git a/libical/scripts/Makefile.am b/libical/scripts/Makefile.am deleted file mode 100644 index c61eaefdce..0000000000 --- a/libical/scripts/Makefile.am +++ /dev/null @@ -1,9 +0,0 @@ -EXTRA_DIST = \ -mkderivedcomponents.pl \ -mkderivedparameters.pl \ -mkderivedproperties.pl \ -mkderivedvalues.pl \ -mkparameterrestrictions.pl \ -mkrestrictionrecords.pl \ -mkrestrictiontable.pl \ -readvaluesfile.pl diff --git a/libical/scripts/mkderivedcomponents.pl b/libical/scripts/mkderivedcomponents.pl deleted file mode 100755 index ac4e472250..0000000000 --- a/libical/scripts/mkderivedcomponents.pl +++ /dev/null @@ -1,170 +0,0 @@ -#!/usr/local/bin/perl - -use Getopt::Std; -getopts('chspi:'); - - -# ARG 0 is components.txt -open(PV,"$ARGV[0]") || die "Can't open components file $ARGV[0]:$!"; - -my @components; - -while (<PV>){ - - s/#.*//; - - chop; - - push(@components,$_); - -} - -close PV; - -# Write the file inline by copying everything before a demarcation -# line, and putting the generated data after the demarcation - -if ($opt_i) { - - open(IN,$opt_i) || die "Can't open input file \"$opt_i\""; - - while(<IN>){ - - if (/Do not edit/){ - last; - } - - print; - - } - - if($opt_i){ - print "# Everything below this line is machine generated. Do not edit. \n"; - } else { - print "/* Everything below this line is machine generated. Do not edit. */\n"; - } - -} - -if ($opt_c or $opt_h and !$opt_i){ - -print <<EOM; -/* -*- Mode: C -*- - ====================================================================== - FILE: icalderivedproperties.{c,h} - CREATOR: eric 09 May 1999 - - \044Id:\044 - - (C) COPYRIGHT 1999 Eric Busboom - http://www.softwarestudio.org - - The contents of this file are subject to the Mozilla Public License - Version 1.0 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and - limitations under the License. - - - ======================================================================*/ - -/* - * THIS FILE IS MACHINE GENERATED DO NOT EDIT - */ - -#include <stdarg.h> /* for va_arg functions */ - -EOM - -} - -if ($opt_p and !$opt_i){ - -print <<EOM; - -EOM - -} - - -foreach $comp (@components) { - - next if !$comp; - - my $ucf = join("",map {ucfirst(lc($_));} split(/-/,$comp)); - my $lc = lc($ucf); - my $uc = uc($lc); - - if($opt_c) { # Make C source - print<<EOM; - -/* $comp */ - -icalcomponent* icalcomponent_new_${lc}() -{ - return (icalcomponent*)icalcomponent_new_impl(ICAL_${uc}_COMPONENT); -} - -icalcomponent* icalcomponent_vanew_${lc}(...) -{ - va_list args; - struct icalcomponent_impl *impl = icalcomponent_new_impl(ICAL_${uc}_component); - - va_start(args,v); - icalcomponent_add_properties(impl, args); - va_end(args); - - return (icalcomponent*)impl; -} - -EOM - - - } elsif ($opt_h) { # Make a C header - print<<EOM; - -/* $comp */ -icalcomponent* icalcomponent_new_${lc}(); -icalcomponent* icalcomponent_vanew_${lc}(...); -EOM - -} elsif ($opt_s) { # Make something for a switch statement - -print <<EOM; -case ICAL_${uc}_PROPERTY: -EOM - -} elsif ($opt_p) { # make perl source - -print <<EOM; - -# $comp -package Net::ICal::Component::${ucf}; -\@ISA=qw(Net::ICal::Component); - -sub new -{ - my \$package = shift; - my \$c = Net::ICal::icalcomponent_new(\$Net::ICal::ICAL_${uc}_COMPONENT); - - my \$self = Net::ICal::Component::new_from_ref(\$c); - Net::ICal::Component::_add_elements(\$self,\\\@_); - - # Self is blessed in new_from_ref - - return \$self; - -} -EOM - -} - - - -} - - diff --git a/libical/scripts/mkderivedparameters.pl b/libical/scripts/mkderivedparameters.pl deleted file mode 100755 index 5772065ec4..0000000000 --- a/libical/scripts/mkderivedparameters.pl +++ /dev/null @@ -1,321 +0,0 @@ -#!/usr/local/bin/perl - -require "readvaluesfile.pl"; - -use Getopt::Std; -getopts('chspi:'); - -%no_xname = (RELATED=>1,RANGE=>1,RSVP=>1,XLICERRORTYPE=>1,XLICCOMPARETYPE=>1); - -%params = read_parameters_file($ARGV[0]); - - -# Write the file inline by copying everything before a demarcation -# line, and putting the generated data after the demarcation - -if ($opt_i) { - - open(IN,$opt_i) || die "Can't open input file $opt_i"; - - while(<IN>){ - - if (/Do not edit/){ - last; - } - - print; - - } - - if($opt_p){ - print "# Everything below this line is machine generated. Do not edit. \n"; - } else { - print "/* Everything below this line is machine generated. Do not edit. */\n"; - } - -} - - -# Write parameter string map -if ($opt_c){ -} - -# Write parameter enumerations and datatypes - -if($opt_h){ - print "typedef enum icalparameter_kind {\n ICAL_ANY_PARAMETER = 0,\n"; - foreach $param (sort keys %params) { - - next if !$param; - - next if $param eq 'NO' or $param eq 'ANY'; - - my $uc = join("",map {uc($_);} split(/-/,$param)); - - my @enums = @{$params{$param}->{'enums'}}; - - print " ICAL_${uc}_PARAMETER, \n"; - - } - print " ICAL_NO_PARAMETER\n} icalparameter_kind;\n\n"; - - # Now create enumerations for parameter values - $idx = 20000; - - print "#define ICALPARAMETER_FIRST_ENUM $idx\n\n"; - - foreach $param (sort keys %params) { - - next if !$param; - - next if $param eq 'NO' or $prop eq 'ANY'; - - my $type = $params{$param}->{"C"}; - my $ucv = join("",map {uc(lc($_));} split(/-/,$param)); - my @enums = @{$params{$param}->{'enums'}}; - - if(@enums){ - - print "typedef enum $type {\n"; - my $first = 1; - - unshift(@enums,"X"); - - push(@enums,"NONE"); - - foreach $e (@enums) { - if (!$first){ - print ",\n"; - } else { - $first = 0; - } - - my $uce = join("",map {uc(lc($_));} split(/-/,$e)); - - print " ICAL_${ucv}_${uce} = $idx"; - - $idx++; - } - $c_type =~ s/enum //; - - print "\n} $type;\n\n"; - } - } - - print "#define ICALPARAMETER_LAST_ENUM $idx\n\n"; - -} - -if ($opt_c){ - - # Create the icalparameter_value to icalvalue_kind conversion table - print "struct icalparameter_value_kind_map value_kind_map[] = {\n"; - - foreach $enum (@{$params{'VALUE'}->{'enums'}}){ - next if $enum eq 'NO' or $enum eq 'ERROR'; - $uc = join("",map {uc(lc($_));} split(/-/,$enum)); - print " {ICAL_VALUE_${uc},ICAL_${uc}_VALUE},\n"; - } - - print " {ICAL_VALUE_X,ICAL_X_VALUE},\n"; - print " {ICAL_VALUE_NONE,ICAL_NO_VALUE}\n};\n\n"; - - #Create the parameter Name map - print "static struct icalparameter_kind_map parameter_map[] = { \n"; - - foreach $param (sort keys %params) { - - next if !$param; - - next if $param eq 'NO' or $prop eq 'ANY'; - - my $lc = join("",map {lc($_);} split(/-/,$param)); - my $uc = join("",map {uc(lc($_));} split(/-/,$param)); - - - print " {ICAL_${uc}_PARAMETER,\"$param\"},\n"; - - } - - print " { ICAL_NO_PARAMETER, \"\"}\n};\n\n"; - - # Create the parameter value map - - print "static struct icalparameter_map icalparameter_map[] = {\n"; - print "{ICAL_ANY_PARAMETER,0,\"\"},\n"; - - foreach $param (sort keys %params) { - - next if !$param; - - next if $param eq 'NO' or $prop eq 'ANY'; - - my $type = $params{$param}->{"C"}; - my $uc = join("",map {uc(lc($_));} split(/-/,$param)); - my @enums = @{$params{$param}->{'enums'}}; - - if(@enums){ - - foreach $e (@enums){ - my $uce = join("",map {uc(lc($_));} split(/-/,$e)); - - print " {ICAL_${uc}_PARAMETER,ICAL_${uc}_${uce},\"$e\"},\n"; - } - - } - } - - print " {ICAL_NO_PARAMETER,0,\"\"}};\n\n"; - -} - -foreach $param (keys %params){ - - my $type = $params{$param}->{'C'}; - - my $ucf = join("",map {ucfirst(lc($_));} split(/-/,$param)); - - my $lc = lc($ucf); - my $uc = uc($lc); - - my $charorenum; - my $set_code; - my $pointer_check; - my $pointer_check_v; - my $xrange; - - if ($type=~/char/ ) { - - $charorenum = " icalerror_check_arg_rz( (param!=0), \"param\");\n return ($type)((struct icalparameter_impl*)param)->string;"; - - $set_code = "((struct icalparameter_impl*)param)->string = icalmemory_strdup(v);"; - - $pointer_check = "icalerror_check_arg_rz( (v!=0),\"v\");"; - $pointer_check_v = "icalerror_check_arg_rv( (v!=0),\"v\");"; - - } else { - - $xrange =" if ( ((struct icalparameter_impl*)param)->string != 0){\n return ICAL_${uc}_X;\n }\n" if !exists $no_xname{$uc}; - - $charorenum= "icalerror_check_arg( (param!=0), \"param\");\n$xrange\nreturn ($type)((struct icalparameter_impl*)param)->data;"; - - $pointer_check = "icalerror_check_arg_rz(v >= ICAL_${uc}_X,\"v\");\n icalerror_check_arg_rz(v < ICAL_${uc}_NONE,\"v\");"; - - $pointer_check_v = "icalerror_check_arg_rv(v >= ICAL_${uc}_X,\"v\");\n icalerror_check_arg_rv(v < ICAL_${uc}_NONE,\"v\");"; - - $set_code = "((struct icalparameter_impl*)param)->data = (int)v;"; - - } - - - - if ($opt_c) { - - print <<EOM; -/* $param */ -icalparameter* icalparameter_new_${lc}($type v) -{ - struct icalparameter_impl *impl; - icalerror_clear_errno(); - $pointer_check - impl = icalparameter_new_impl(ICAL_${uc}_PARAMETER); - if (impl == 0) { - return 0; - } - - icalparameter_set_${lc}((icalparameter*) impl,v); - if (icalerrno != ICAL_NO_ERROR) { - icalparameter_free((icalparameter*) impl); - return 0; - } - - return (icalparameter*) impl; -} - -${type} icalparameter_get_${lc}(icalparameter* param) -{ - icalerror_clear_errno(); -$charorenum -} - -void icalparameter_set_${lc}(icalparameter* param, ${type} v) -{ - $pointer_check_v - icalerror_check_arg_rv( (param!=0), "param"); - icalerror_clear_errno(); - - $set_code -} - -EOM - - } elsif( $opt_h) { - - print <<EOM; -/* $param */ -icalparameter* icalparameter_new_${lc}($type v); -${type} icalparameter_get_${lc}(icalparameter* value); -void icalparameter_set_${lc}(icalparameter* value, ${type} v); - -EOM - -} - -if ($opt_p) { - - print <<EOM; - -# $param - -package Net::ICal::Parameter::${ucf}; -\@ISA=qw(Net::ICal::Parameter); - -sub new -{ - my \$self = []; - my \$package = shift; - my \$value = shift; - - bless \$self, \$package; - - my \$p; - - if (\$value) { - \$p = Net::ICal::icalparameter_new_from_string(\$Net::ICal::ICAL_${uc}_PARAMETER,\$value); - } else { - \$p = Net::ICal::icalparameter_new(\$Net::ICal::ICAL_${uc}_PARAMETER); - } - - \$self->[0] = \$p; - - return \$self; -} - -sub get -{ - my \$self = shift; - my \$impl = \$self->_impl(); - - return Net::ICal::icalparameter_as_ical_string(\$impl); - -} - -sub set -{ - # This is hard to implement, so I've punted for now. - die "Set is not implemented"; -} - -EOM - -} - -} - -if ($opt_h){ - -print <<EOM; -#endif /*ICALPARAMETER_H*/ - -EOM -} diff --git a/libical/scripts/mkderivedproperties.pl b/libical/scripts/mkderivedproperties.pl deleted file mode 100755 index 4e011e112e..0000000000 --- a/libical/scripts/mkderivedproperties.pl +++ /dev/null @@ -1,217 +0,0 @@ -#!/usr/local/bin/perl - -require "readvaluesfile.pl"; - -use Getopt::Std; -getopts('chspmi:'); - -# ARG 0 is properties.csv -%propmap = read_properties_file($ARGV[0]); - -# ARG 1 is value-types.txt -%valuemap = read_values_file($ARGV[1]); - - -# Write the file inline by copying everything before a demarcation -# line, and putting the generated data after the demarcation - -if ($opt_i) { - - open(IN,$opt_i) || die "Can't open input file $opt_i"; - - while(<IN>){ - - if (/Do not edit/){ - last; - } - - print; - - } - - print "/* Everything below this line is machine generated. Do not edit. */\n"; - - -} - -sub fudge_data { - my $prop = shift; - - my $value = $propmap{$prop}->{'lic_value'}; - - if (!$value){ - die "Can't find value for property \"$prop\"\n"; - } - my $ucf = join("",map {ucfirst(lc($_));} split(/-/,$prop)); - my $lc = lc($ucf); - my $uc = uc($lc); - - my $ucfvalue = join("",map {ucfirst(lc($_));} split(/-/,$value)); - my $lcvalue = lc($ucfvalue); - my $ucvalue = uc($lcvalue); - - my $type = $valuemap{$value}->{C}->[1]; - - return ($uc,$lc,$lcvalue,$ucvalue,$type); - -} - -# Create the property map data -if($opt_c){ - - print "static struct icalproperty_map property_map[] = {\n"; - - foreach $prop (sort keys %propmap) { - - next if !$prop; - - next if $prop eq 'NO'; - - my ($uc,$lc,$lcvalue,$ucvalue,$type) = fudge_data($prop); - - print "{ICAL_${uc}_PROPERTY,\"$prop\",ICAL_${ucvalue}_VALUE},\n"; - - } - - $prop = "NO"; - - my ($uc,$lc,$lcvalue,$ucvalue,$type) = fudge_data($prop); - - print "{ICAL_${uc}_PROPERTY,\"\",ICAL_NO_VALUE}};\n\n"; - - - print "static struct icalproperty_enum_map enum_map[] = {\n"; - - $idx = 10000; - - foreach $value (sort keys %valuemap) { - - next if !$value; - next if $value eq 'NO' or $prop eq 'ANY'; - - my $ucv = join("",map {uc(lc($_));} split(/-/,$value)); - my @enums = @{$valuemap{$value}->{'enums'}}; - - if(@enums){ - - my ($c_autogen,$c_type) = @{$valuemap{$value}->{'C'}}; - - unshift(@enums,"X"); - push(@enums,"NONE"); - - foreach $e (@enums) { - - my $uce = join("",map {uc(lc($_));} split(/-/,$e)); - - if($e ne "X" and $e ne "NONE"){ - $str = $e; - } else { - $str = ""; - } - - print " {ICAL_${ucv}_PROPERTY,ICAL_${ucv}_${uce},\"$str\" }, /*$idx*/\n"; - - $idx++; - } - - } - } - print " {ICAL_NO_PROPERTY,0,\"\"}\n};\n\n"; - - -} - - -if($opt_h){ - - # Create the property enumerations list - print "typedef enum icalproperty_kind {\n ICAL_ANY_PROPERTY = 0,\n"; - foreach $prop (sort keys %propmap) { - - next if !$prop; - - next if $prop eq 'NO' or $prop eq 'ANY'; - - my ($uc,$lc,$lcvalue,$ucvalue,$type) = fudge_data($prop); - - print " ICAL_${uc}_PROPERTY, \n"; - - } - print " ICAL_NO_PROPERTY\n} icalproperty_kind;\n\n"; - - -} - - -foreach $prop (sort keys %propmap) { - - next if !$prop; - - next if $prop eq 'NO' or $prop eq 'ANY'; - - my ($uc,$lc,$lcvalue,$ucvalue,$type) = fudge_data($prop); - - - my $pointer_check; - if ($type =~ /\*/){ - $pointer_check = "icalerror_check_arg_rz( (v!=0),\"v\");\n" if $type =~ /\*/; - } elsif ( $type eq "void" ){ - $pointer_check = "icalerror_check_arg_rv( (v!=0),\"v\");\n" if $type =~ /\*/; - - } - - my $set_pointer_check = "icalerror_check_arg_rv( (v!=0),\"v\");\n" if $type =~ /\*/; - - if($opt_c) { # Generate C source - print<<EOM; -/* $prop */ -icalproperty* icalproperty_new_${lc}($type v) { - struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_${uc}_PROPERTY); $pointer_check - icalproperty_set_${lc}((icalproperty*)impl,v); - return (icalproperty*)impl; -} -icalproperty* icalproperty_vanew_${lc}($type v, ...){ - va_list args; - struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_${uc}_PROPERTY); $pointer_check - icalproperty_set_${lc}((icalproperty*)impl,v); - va_start(args,v); - icalproperty_add_parameters(impl, args); - va_end(args); - return (icalproperty*)impl; -} -void icalproperty_set_${lc}(icalproperty* prop, $type v){ - icalvalue *value; - $set_pointer_check - icalerror_check_arg_rv( (prop!=0),"prop"); - value = icalvalue_new_${lcvalue}(v); - icalproperty_set_value(prop,value); -} -$type icalproperty_get_${lc}(icalproperty* prop){ - icalvalue *value; - icalerror_check_arg( (prop!=0),"prop"); - value = icalproperty_get_value(prop); - return icalvalue_get_${lcvalue}(value); -} -EOM - - - } elsif ($opt_h) { # Generate C Header file - print "\ -/* $prop */\ -icalproperty* icalproperty_new_${lc}($type v);\ -icalproperty* icalproperty_vanew_${lc}($type v, ...);\ -void icalproperty_set_${lc}(icalproperty* prop, $type v);\ -$type icalproperty_get_${lc}(icalproperty* prop);"; - -} - - -} # This brace terminates the main loop - - - -if ($opt_h){ - -print "\n\n#endif /*ICALPROPERTY_H*/\n" -} - diff --git a/libical/scripts/mkderivedvalues.pl b/libical/scripts/mkderivedvalues.pl deleted file mode 100755 index e7ede34ae7..0000000000 --- a/libical/scripts/mkderivedvalues.pl +++ /dev/null @@ -1,223 +0,0 @@ -#!/usr/bin/perl - -use lib '.'; - -require 'readvaluesfile.pl'; - -use Getopt::Std; -getopts('chi:'); - - #Options - # c -> generate c code file - # h-> generate header file - - # Open with value-types.txt - -my %h = read_values_file($ARGV[0]); - - - # Write the file inline by copying everything before a demarcation - # line, and putting the generated data after the demarcation - -if ($opt_i) { - - open(IN,$opt_i) || die "Can't open input file $opt_i"; - - while(<IN>){ - print; - } -} - - - # Map type names to the value in the icalvalue_impl data union */ - -%union_map = ( - BOOLEAN => 'int', - CALADDRESS=>'string', - DATE=>'time', - DATETIME=>'time', - DATETIMEDATE=>'time', - DATETIMEPERIOD=>'period', - DURATION=>'duration', - INTEGER=>'int', - TEXT=>'string', - URI=>'string', - UTCOFFSET=>'int', - QUERY=>'string', - BINARY=>'string', - X=>'string' - ); - - -if($opt_h){ - - # First print out the value enumerations - $idx = 5000; - print "typedef enum icalvalue_kind {\n"; - print " ICAL_ANY_VALUE=$idx,\n"; - - foreach $value (keys %h) { - - $idx++; - my $ucv = join("",map {uc(lc($_));} split(/-/,$value)); - - next if $value eq "NO"; - - print " ICAL_${ucv}_VALUE=$idx,\n"; - } - - $idx++; - print " ICAL_NO_VALUE=$idx\n} icalvalue_kind ;\n\n"; - - # Now create enumerations for property values - $idx = 10000; - - print "#define ICALPROPERTY_FIRST_ENUM $idx\n\n"; - - foreach $value (sort keys %h) { - - next if !$value; - - next if $value eq 'NO' or $prop eq 'ANY'; - - my $ucv = join("",map {uc(lc($_));} split(/-/,$value)); - my @enums = @{$h{$value}->{'enums'}}; - - if(@enums){ - - my ($c_autogen,$c_type) = @{$h{$value}->{'C'}}; - print "typedef $c_type {\n"; - my $first = 1; - - unshift(@enums,"X"); - - push(@enums,"NONE"); - - foreach $e (@enums) { - if (!$first){ - print ",\n"; - } else { - $first = 0; - } - - my $uce = join("",map {uc(lc($_));} split(/-/,$e)); - - print " ICAL_${ucv}_${uce} = $idx"; - - $idx++; - } - - $c_type =~ s/enum //; - - print "\n} $c_type;\n\n"; - } - } - - print "#define ICALPROPERTY_LAST_ENUM $idx\n\n"; - -} - - -if($opt_c){ - - # print out the value to string map - - print "static struct icalvalue_kind_map value_map[]={\n"; - - foreach $value (keys %h) { - - $idx++; - my $ucv = join("",map {uc(lc($_));} split(/-/,$value)); - - next if $value eq "NO"; - - print " {ICAL_${ucv}_VALUE,\"$value\"},\n"; - } - - - print " {ICAL_NO_VALUE,\"\"}\n};"; - -} - - -foreach $value (keys %h) { - - my $autogen = $h{$value}->{C}->[0]; - my $type = $h{$value}->{C}->[1]; - - my $ucf = join("",map {ucfirst(lc($_));} split(/-/,$value)); - - my $lc = lc($ucf); - my $uc = uc($lc); - - my $pointer_check = "icalerror_check_arg_rz( (v!=0),\"v\");\n" if $type =~ /\*/; - my $pointer_check_rv = "icalerror_check_arg_rv( (v!=0),\"v\");\n" if $type =~ /\*/; - - my $assign; - - if ($type =~ /char/){ - $assign = "icalmemory_strdup(v);\n\n if (impl->data.v_string == 0){\n errno = ENOMEM;\n }\n"; - } else { - $assign = "v;"; - } - - my $union_data; - - if(@{$h{$value}->{'enums'}}){ - $union_data = 'enum'; - - } elsif (exists $union_map{$uc} ){ - $union_data=$union_map{$uc}; - } else { - $union_data = $lc; - } - - if ($opt_c && $autogen) { - - print "\n\n\ -icalvalue* icalvalue_new_${lc} ($type v){\ - struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_${uc}_VALUE);\ - $pointer_check\ - icalvalue_set_${lc}((icalvalue*)impl,v);\ - return (icalvalue*)impl;\ -}\ -void icalvalue_set_${lc}(icalvalue* value, $type v) {\ - struct icalvalue_impl* impl; \ - icalerror_check_arg_rv( (value!=0),\"value\");\ - $pointer_check_rv\ - icalerror_check_value_type(value, ICAL_${uc}_VALUE);\ - impl = (struct icalvalue_impl*)value;\n"; - - if( $union_data eq 'string') { - - print " if(impl->data.v_${union_data}!=0) {free((void*)impl->data.v_${union_data});}\n"; - } - - - print "\n impl->data.v_$union_data = $assign \n }\n"; - - print "$type\ icalvalue_get_${lc}(icalvalue* value)\ {\n\ - icalerror_check_arg( (value!=0),\"value\");\ - icalerror_check_value_type(value, ICAL_${uc}_VALUE);\ - return ((struct icalvalue_impl*)value)->data.v_${union_data};\n}\n"; - - - } elsif($opt_h && $autogen) { - - print "\n /* $value */ \ -icalvalue* icalvalue_new_${lc}($type v); \ -$type icalvalue_get_${lc}(icalvalue* value); \ -void icalvalue_set_${lc}(icalvalue* value, ${type} v);\n\n"; - - } - -} - - -if ($opt_h){ - print "#endif /*ICALVALUE_H*/\n"; - } - - - __END__ - diff --git a/libical/scripts/mkparameterrestrictions.pl b/libical/scripts/mkparameterrestrictions.pl deleted file mode 100755 index 2c57eb4ca5..0000000000 --- a/libical/scripts/mkparameterrestrictions.pl +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/perl - -# Version: 1.0 -# Script last updated: 30May1999 GMD -# Change log: -# <none> - - -# usually open params-in-prop.txt -open(F,"$ARGV[0]") || die "Can't open restriction file $ARGV[0]:$!"; - -print <<EOM; -/* - ====================================================================== - File: parameterrestrictions.c - - (C) COPYRIGHT 1999 Graham Davison - mailto:g.m.davison\@computer.org - - The contents of this file are subject to the Mozilla Public License - Version 1.0 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and - limitations under the License. - - - ======================================================================*/ - -/* - * THIS FILE IS MACHINE GENERATED DO NOT EDIT - */ - - -int icalrestriction_is_parameter_allowed(icalproperty_kind prop,icalparameter_kind param) -{ - switch (prop) - { -EOM - -while(<F>) -{ - chop; - - # split line by whitespace - my @v = split(/\s+/,$_); - # property is first item on line - my $prop = shift @v; - my $prop_name = $prop; - if (substr($prop,0,1) eq "X") { $prop = "X"; } - $prop = join("",split(/-/,$prop)); - -print <<EOM; - - /* ${prop_name} */ - case ICAL_${prop}_PROPERTY: - switch (param) - { -EOM - - foreach $param (@v) - { - $param = join("",split(/-/,$param)); - print "\t\t\t\tcase ICAL_${param}_PARAMETER:\n"; - } - -print <<EOM; - return 1; - default: - return 0; - } - -EOM - -} - -print <<EOM; - } - - return 0; -} -EOM diff --git a/libical/scripts/mkrestrictionrecords.pl b/libical/scripts/mkrestrictionrecords.pl deleted file mode 100755 index e2c62ae748..0000000000 --- a/libical/scripts/mkrestrictionrecords.pl +++ /dev/null @@ -1,109 +0,0 @@ -#!/usr/bin/perl - -# Version: 1.0 -# Script last updated: 30May1999 GMD -# Change log: -# <none> - -# usually open restrictions.csv -open(F,"$ARGV[0]") || die "Can't open restriction file $ARGV[0]:$!"; - -print <<EOM; -/* - ====================================================================== - File: restrictionrecords.c - - (C) COPYRIGHT 1999 Graham Davison - mailto:g.m.davison\@computer.org - - The contents of this file are subject to the Mozilla Public License - Version 1.0 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and - limitations under the License. - - - ======================================================================*/ - - -/* - * THIS FILE IS MACHINE GENERATED DO NOT EDIT - */ - - -typedef struct icalrestriction_record { - icalproperty_method method; - icalcomponent_kind component; - icalproperty_kind property; - icalcomponent_kind subcomponent; - icalrestriction_kind restriction; -} icalrestriction_record; - - -icalrestriction_record icalrestriction_records[] = -{ -EOM - -my $last_method = ""; -my $last_component = ""; -my $last_property = ""; -my $need_header = 0; - -while(<F>) -{ - chop; - - # split line at commas - my ($method,$component,$property,$subcomponent,$restriction)=split(/\,/,$_); - - # - #put in code to generate comments here! - # - if ($method ne $last_method) - { - $need_header = 1; - $last_method = $method; - } - if ($component ne $last_component) - { - $need_header = 1; - $last_component = $component; - } - - if ($need_header) - { - print "\n\t/* METHOD: ${method}, COMPONENT: ${component} */\n"; - $need_header = 0; - } - - foreach $item ($component,$property,$subcomponent,$restriction) - { - # handle special cases. - if ($item eq "NONE") - { $item = "NO"; } - else { if (substr($item,0,1) eq "X") - { $item = "X"; }} - - # strip out dashes - $item = join("",split(/-/,$item)); - } - # strip leading V from component names - $component =~ s/^(V?)(\w+?)((SAVINGS)?)((TIME)?)$/$2/; - $subcomponent =~ s/^V(\w+)/$1/; - - print "\t\{ICAL_METHOD_${method},ICAL_${component}_COMPONENT,"; - print "ICAL_${property}_PROPERTY,ICAL_${subcomponent}_COMPONENT,"; - print "ICAL_RESTRICTION_${restriction}\},\n"; - -} - -print <<EOM; - - /* END */ - {ICAL_METHOD_NONE,ICAL_NO_COMPONENT,ICAL_NO_PROPERTY,ICAL_NO_COMPONENT,ICAL_RESTRICTION_NONE} -}; -EOM diff --git a/libical/scripts/mkrestrictiontable.pl b/libical/scripts/mkrestrictiontable.pl deleted file mode 100755 index e1e1a0ca53..0000000000 --- a/libical/scripts/mkrestrictiontable.pl +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/perl - -use Getopt::Std; -getopts('i:'); - -# the argument should be the path to the restriction datafile, usually -# design-data/restrictions.csv -open(F,"$ARGV[0]") || die "Can't open restriction data file $ARGV[0]:$!"; - -# Write the file inline by copying everything before a demarcation -# line, and putting the generated data after the demarcation - -if ($opt_i) { - - open(IN,$opt_i) || die "Can't open input file $opt_i"; - - while(<IN>){ - - if (/Do not edit/){ - last; - } - - print; - - } - - print "/* Everything below this line is machine generated. Do not edit. */\n"; - - - close IN; -} - -# First build the property restriction table -print "icalrestriction_property_record icalrestriction_property_records[] = {\n"; - -while(<F>) -{ - - chop; - - s/\#.*$//; - - my($method,$targetcomp,$prop,$subcomp,$restr,$sub) = split(/,/,$_); - - next if !$method; - - if(!$sub) { - $sub = "0"; - } else { - $sub = "icalrestriction_".$sub; - } - - if($prop ne "NONE"){ - print(" \{ICAL_METHOD_${method},ICAL_${targetcomp}_COMPONENT,ICAL_${prop}_PROPERTY,ICAL_RESTRICTION_${restr},$sub},\n"); - } - -} - - -# Print the terminating line -print " {ICAL_METHOD_NONE,ICAL_NO_COMPONENT,ICAL_NO_PROPERTY,ICAL_RESTRICTION_NONE}\n"; - -print "};\n"; - -print "icalrestriction_component_record icalrestriction_component_records[] = {\n"; - - -# Go back through the entire file and build the component restriction table -close(F); -open(F,"$ARGV[0]") || die "Can't open restriction data file $ARGV[0]:$!"; - -while(<F>) -{ - - chop; - - s/\#.*$//; - - my($method,$targetcomp,$prop,$subcomp,$restr,$sub) = split(/,/,$_); - - next if !$method; - - if(!$sub) { - $sub = "0"; - } else { - $sub = "icalrestriction_".$sub; - } - - - if($subcomp ne "NONE"){ - print(" \{ICAL_METHOD_${method},ICAL_${targetcomp}_COMPONENT,ICAL_${subcomp}_COMPONENT,ICAL_RESTRICTION_${restr},$sub\},\n"); - } - -} - -# print the terminating line -print " {ICAL_METHOD_NONE,ICAL_NO_COMPONENT,ICAL_NO_COMPONENT,ICAL_RESTRICTION_NONE}\n"; -print "};\n"; diff --git a/libical/scripts/readvaluesfile.pl b/libical/scripts/readvaluesfile.pl deleted file mode 100644 index d5e2d36fd8..0000000000 --- a/libical/scripts/readvaluesfile.pl +++ /dev/null @@ -1,130 +0,0 @@ - - -sub read_values_file { - - my $path = shift; - my %h; - - open(F,$path) || die "Can't open values file $path"; - - while(<F>){ - - chop; - - s/#.*$//g; - s/\"//g; - - next if ! $_; - - @column = split(/,/,$_); - - my $value_name = $column[0]; - - my $c_type_str = $column[1]; - my $c_autogen = ($c_type_str =~ /\(a\)/); - - my $c_type = $c_type_str; - $c_type =~ s/\(.\)//; - - my $python_type = $column[2]; - my $components = $column[3]; - my $enum_values = $column[4]; - - my @components; - if($components ne "unitary"){ - @components = split(/;/,$components); - } else { - @components = (); - } - - my @enums; - if($enum_values) { - @enums = split(/;/,$enum_values); - - } else { - @enums = (); - } - - $h{$value_name} = { C => [$c_autogen,$c_type], - perl => $perl_type, - python => $python_type, - components=>[@components], - enums=>[@enums] - }; - } - - return %h; -} - -sub read_properties_file { - - my $path = shift; - my %h; - - open(F,$path) || die "Can't open properties file $path"; - - while(<F>){ - - chop; - - s/#.*$//g; - s/\"//g; - - next if ! $_; - - @column = split(/,/,$_); - - my $property_name = $column[0]; - - my $lic_value = $column[1]; - my $default_value = $column[2]; - - $h{$property_name} = { lic_value => $lic_value, - default_value => $default_value - }; - } - - return %h; -} - -sub read_parameters_file { - - my $path = shift; - my %h; - - open(F,$path) || die "Can't open parameters file $path"; - - while(<F>){ - - chop; - - s/#.*$//g; - s/\"//g; - - next if ! $_; - - @column = split(/\,/,$_); - - my $parameter_name = $column[0]; - - my $data_type = $column[1]; - my $enum_string = $column[2]; - - my @enums; - if($enum_string){ - @enums = split(/;/,$enum_string); - } - - $h{$parameter_name} = { C => $data_type, - enums => [@enums] - }; - } - - close(F); - - return %h; -} - - - -1; diff --git a/libical/src/.cvsignore b/libical/src/.cvsignore deleted file mode 100644 index c038ed7864..0000000000 --- a/libical/src/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -Makefile -Makefile.in
\ No newline at end of file diff --git a/libical/src/Makefile.am b/libical/src/Makefile.am deleted file mode 100644 index d6ba22c548..0000000000 --- a/libical/src/Makefile.am +++ /dev/null @@ -1,7 +0,0 @@ -if WITH_PYTHON -PYTHON_DIR = python -else -PYTHON_DIR = -endif - -SUBDIRS = libical libicalss libicalvcal # $(PYTHON_DIR) test diff --git a/libical/src/libical/.cvsignore b/libical/src/libical/.cvsignore deleted file mode 100644 index ef04480fde..0000000000 --- a/libical/src/libical/.cvsignore +++ /dev/null @@ -1,22 +0,0 @@ -Makefile -Makefile.in -icalitipy.c -icalitipy.h -icalitipl.c -icallexer.c -icalyacc.c -icalyacc.h -y.output -*.lo -*.la -.libs -.deps -icalversion.h -ical.h -icalderivedparameter.c -icalderivedparameter.h -icalderivedproperty.c -icalderivedproperty.h -icalderivedvalue.h -icalderivedvalue.c -icalrestriction.c diff --git a/libical/src/libical/Makefile.am b/libical/src/libical/Makefile.am deleted file mode 100644 index 5c2200c7f0..0000000000 --- a/libical/src/libical/Makefile.am +++ /dev/null @@ -1,229 +0,0 @@ -#====================================================================== -# FILE: Makefile.am -# CREATOR: eric -# -# $Id: Makefile.am,v 1.29 2001/05/16 07:16:31 jpr Exp $ -# -# -# (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of either: -# -# The LGPL as published by the Free Software Foundation, version -# 2.1, available at: http://www.fsf.org/copyleft/lesser.html -# -# Or: -# -# The Mozilla Public License Version 1.0. You may obtain a copy of -# the License at http://www.mozilla.org/MPL/ -# -# The original code is icalcomponent.c -# -#====================================================================== - - -DESIGNDATA = $(top_srcdir)/design-data -ICALSCRIPTS = $(top_srcdir)/scripts - -lib_LTLIBRARIES = libical.la - -noinst_LTLIBRARIES = libical-static.la -libical_static_la_SOURCES = $(libical_la_SOURCES) -libical_static_la_LDFLAGS = --all-static - -YFLAGS = -d -v -t -pical_yy -LFLAGS = -Pical_yy -LEX_OUTPUT_ROOT = lex.ical_yy - -all: ical.h - -INCLUDES = \ - -I$(top_builddir) \ - -I$(top_srcdir)/src \ - -I$(top_builddir)/src \ - -I$(srcdir) - -libical_la_LDFLAGS = -version-info 0:0:0 - -libical_la_SOURCES = \ - $(BUILT_SOURCES) \ - icalattendee.h \ - icalattendee.c \ - icalcomponent.c \ - icalcomponent.h \ - icalenums.c \ - icalenums.h \ - icalerror.c \ - icalerror.h \ - icallexer.l \ - icalmemory.c \ - icalmemory.h \ - icalmime.c \ - icalmime.h \ - icalparameter.c \ - icalparameter.h \ - icalparameterimpl.h \ - icalparser.c \ - icalparser.h \ - icalproperty.c \ - icalproperty.h \ - icalrecur.c \ - icalrecur.h \ - icalrestriction.h \ - icaltime.c \ - icaltime.h \ - icalduration.h \ - icalduration.c \ - icalperiod.h \ - icalperiod.c \ - icaltypes.c \ - icaltypes.h \ - icalvalue.c \ - icalvalue.h \ - icalvalueimpl.h \ - icalyacc.h \ - icalyacc.y \ - pvl.c \ - pvl.h \ - sspm.c \ - sspm.h \ - vsnprintf.c \ - icallangbind.h \ - icallangbind.c - -libicalincludedir = $(includedir) - -libicalinclude_HEADERS = ical.h - -# ORDERING OF HEADERS IS SIGNIFICANT. Don't change this ordering. It -# is required to make the combined header ical.h properly -COMBINEDHEADERS = \ - $(top_builddir)/src/libical/icalversion.h \ - $(top_srcdir)/src/libical/icaltime.h \ - $(top_srcdir)/src/libical/icalduration.h \ - $(top_srcdir)/src/libical/icalperiod.h \ - $(top_srcdir)/src/libical/icalenums.h \ - $(top_srcdir)/src/libical/icaltypes.h \ - $(top_srcdir)/src/libical/icalrecur.h \ - icalderivedvalue.h \ - icalderivedparameter.h \ - $(top_srcdir)/src/libical/icalvalue.h \ - $(top_srcdir)/src/libical/icalparameter.h \ - icalderivedproperty.h \ - $(top_srcdir)/src/libical/icalproperty.h \ - $(top_srcdir)/src/libical/icalattendee.h \ - $(top_srcdir)/src/libical/pvl.h \ - $(top_srcdir)/src/libical/icalcomponent.h \ - $(top_srcdir)/src/libical/icalparser.h \ - $(top_srcdir)/src/libical/icalmemory.h \ - $(top_srcdir)/src/libical/icalerror.h \ - $(top_srcdir)/src/libical/icalrestriction.h \ - $(top_srcdir)/src/libical/sspm.h \ - $(top_srcdir)/src/libical/icalmime.h \ - $(top_srcdir)/src/libical/icallangbind.h - -BUILT_COMBINEDHEADERS = \ - icalderivedparameter.h \ - icalderivedproperty.h \ - icalderivedvalue.h - -BUILT_SOURCES = \ - $(BUILT_COMBINEDHEADERS)\ - icalderivedparameter.c \ - icalderivedproperty.c \ - icalrestriction.c \ - icalderivedvalue.c - -ical.h: $(COMBINEDHEADERS) - cat $(COMBINEDHEADERS) \ - | egrep -v "#include.*\"ical" \ - | egrep -v "#include.*\"pvl\.h\"" > ical.h - -icallexer.c : icalyacc.h - - -# parameters - -PARAMETERDEPS = \ - $(ICALSCRIPTS)/mkderivedparameters.pl \ - $(DESIGNDATA)/parameters.csv \ - icalderivedparameter.c.in \ - icalderivedparameter.h.in - -icalderivedparameter.h: $(PARAMETERDEPS) - $(PERL) -I $(ICALSCRIPTS) $(ICALSCRIPTS)/mkderivedparameters.pl -i $(srcdir)/icalderivedparameter.h.in -h $(DESIGNDATA)/parameters.csv > icalderivedparameter.h - -icalderivedparameter.c: $(PARAMETERDEPS) $(BUILT_COMBINEDHEADERS) - $(PERL) -I $(ICALSCRIPTS) $(ICALSCRIPTS)/mkderivedparameters.pl -i $(srcdir)/icalderivedparameter.c.in -c $(DESIGNDATA)/parameters.csv > icalderivedparameter.c - -# properties - -PROPERTYDEPS = \ - $(ICALSCRIPTS)/mkderivedproperties.pl \ - $(DESIGNDATA)/properties.csv \ - $(DESIGNDATA)/value-types.csv \ - icalderivedproperty.c.in \ - icalderivedproperty.h.in - - -icalderivedproperty.h: $(PROPERTYDEPS) - $(PERL) -I$(ICALSCRIPTS) $(ICALSCRIPTS)/mkderivedproperties.pl \ - -i $(srcdir)/icalderivedproperty.h.in -h $(DESIGNDATA)/properties.csv\ - ${DESIGNDATA}/value-types.csv > icalderivedproperty.h - -icalderivedproperty.c: $(PROPERTYDEPS) $(BUILT_COMBINEDHEADERS) - $(PERL) -I$(ICALSCRIPTS) $(ICALSCRIPTS)/mkderivedproperties.pl \ - -i $(srcdir)/icalderivedproperty.c.in -c $(DESIGNDATA)/properties.csv \ - ${DESIGNDATA}/value-types.csv > icalderivedproperty.c - -# restrictions - -RESTRICTIONDEPS = \ - $(ICALSCRIPTS)/mkrestrictiontable.pl \ - $(DESIGNDATA)/restrictions.csv \ - icalrestriction.c.in - -icalrestriction.c: $(RESTRICTIONDEPS) - $(PERL) $(ICALSCRIPTS)/mkrestrictiontable.pl -i $(srcdir)/icalrestriction.c.in \ - $(DESIGNDATA)/restrictions.csv > icalrestriction.c - -# values - -VALUEDEPS = \ - $(ICALSCRIPTS)/mkderivedvalues.pl \ - $(DESIGNDATA)/value-types.csv \ - icalderivedvalue.c.in \ - icalderivedvalue.h.in - -icalderivedvalue.h: $(VALUEDEPS) - $(PERL) -I$(ICALSCRIPTS) $(ICALSCRIPTS)/mkderivedvalues.pl \ - -i $(srcdir)/icalderivedvalue.h.in -h $(DESIGNDATA)/value-types.csv > icalderivedvalue.h - -icalderivedvalue.c: $(VALUEDEPS) $(BUILT_COMBINEDHEADERS) - $(PERL) -I$(ICALSCRIPTS) $(ICALSCRIPTS)/mkderivedvalues.pl \ - -i $(srcdir)/icalderivedvalue.c.in -c $(DESIGNDATA)/value-types.csv > icalderivedvalue.c - - - -# housekeeping -CONFIG_CLEAN_FILES = y.output - -CLEANFILES += $(BUILT_SOURCES) - -dist-hook: - cd $(distdir); rm -f $(BUILT_SOURCES) - cd $(distdir); rm -f ical.h - -EXTRA_DIST = \ - icalderivedparameter.c.in \ - icalderivedparameter.h.in \ - icalderivedproperty.c.in \ - icalderivedproperty.h.in \ - icalrestriction.c.in \ - icalderivedvalue.c.in \ - icalderivedvalue.h.in \ - icalversion.h.in \ - icallexer.c \ - icalyacc.c - diff --git a/libical/src/libical/icalattendee.c b/libical/src/libical/icalattendee.c deleted file mode 100644 index 30cb949c40..0000000000 --- a/libical/src/libical/icalattendee.c +++ /dev/null @@ -1,30 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: icalattendee.c - CREATOR: eric 08 Mar 01 - - $Id$ - $Locker$ - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icaltypes.c - - ======================================================================*/ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "icalattendee.h" diff --git a/libical/src/libical/icalattendee.h b/libical/src/libical/icalattendee.h deleted file mode 100644 index 023b30734c..0000000000 --- a/libical/src/libical/icalattendee.h +++ /dev/null @@ -1,68 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalattendee.h - CREATOR: eric 8 Mar 01 - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icaltypes.h - -======================================================================*/ - -#ifndef ICALATTENDEE_H -#define ICALATTENDEE_H - -#include <time.h> -#include "icalenums.h" -#include "icaltime.h" -#include "icalduration.h" -#include "icalperiod.h" -#include "icalderivedparameter.h" -#include "icalderivedvalue.h" - -struct icalorganizertype { - const char* value; - const char* common_name; - const char* dir; - const char* sentby; - const char* language; - -}; - -/* Create a copy of the given organizer. Libical will not own the - memory for the strings in the copy; the call must free them */ -struct icalorganizertype icalorganizertype_new_clone(struct icalorganizertype a); - - -struct icalattendeetype { - const char* cuid; /* Cal user id, contents of the property value */ - /*icalparameter_cutype cutype;*/ - const char* member; - /*icalparameter_role role;*/ - int rsvp; - const char* delto; - const char* delfrom; - const char* sentby; - const char* cn; - const char* dir; - const char* language; -}; - -/* Create a copy of the given attendee. Libical will not own the - memory for the strings in the copy; the call must free them */ -struct icalattendeetype icalattendeetype_new_clone(struct icalattendeetype a); - - -#endif /* !ICALATTENDEE_H */ diff --git a/libical/src/libical/icalcomponent.c b/libical/src/libical/icalcomponent.c deleted file mode 100644 index c28c972007..0000000000 --- a/libical/src/libical/icalcomponent.c +++ /dev/null @@ -1,1487 +0,0 @@ -/*====================================================================== - FILE: icalcomponent.c - CREATOR: eric 28 April 1999 - - $Id$ - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icalcomponent.c - -======================================================================*/ - - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "icalcomponent.h" -#include "pvl.h" /* "Pointer-to-void list" */ -#include "icalerror.h" -#include "icalmemory.h" -#include "icalenums.h" -#include "icaltime.h" -#include "icalduration.h" -#include "icalperiod.h" -#include "icalparser.h" - -#include <stdlib.h> /* for malloc */ -#include <stdarg.h> /* for va_list, etc */ -#include <errno.h> -#include <assert.h> -#include <stdio.h> /* for fprintf */ - -#define MAX_TMP 1024 - -struct icalcomponent_impl -{ - char id[5]; - icalcomponent_kind kind; - char* x_name; - pvl_list properties; - pvl_elem property_iterator; - pvl_list components; - pvl_elem component_iterator; - icalcomponent* parent; -}; - -/* icalproperty functions that only components get to use */ -void icalproperty_set_parent(icalproperty* property, - icalcomponent* component); -icalcomponent* icalproperty_get_parent(icalproperty* property); -void icalcomponent_add_children(struct icalcomponent_impl *impl,va_list args); -icalcomponent* icalcomponent_new_impl (icalcomponent_kind kind); -int icalcomponent_property_sorter(void *a, void *b); - - -void icalcomponent_add_children(struct icalcomponent_impl *impl,va_list args) -{ - void* vp; - - while((vp = va_arg(args, void*)) != 0) { - - assert (icalcomponent_isa_component(vp) != 0 || - icalproperty_isa_property(vp) != 0 ) ; - - if (icalcomponent_isa_component(vp) != 0 ){ - - icalcomponent_add_component((icalcomponent*)impl, - (icalcomponent*)vp); - - } else if (icalproperty_isa_property(vp) != 0 ){ - - icalcomponent_add_property((icalcomponent*)impl, - (icalproperty*)vp); - } - } -} - -icalcomponent* -icalcomponent_new_impl (icalcomponent_kind kind) -{ - struct icalcomponent_impl* comp; - - if ( ( comp = (struct icalcomponent_impl*) - malloc(sizeof(struct icalcomponent_impl))) == 0) { - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - strcpy(comp->id,"comp"); - - comp->kind = kind; - comp->properties = pvl_newlist(); - comp->property_iterator = 0; - comp->components = pvl_newlist(); - comp->component_iterator = 0; - comp->x_name = 0; - comp->parent = 0; - - return comp; -} - -icalcomponent* -icalcomponent_new (icalcomponent_kind kind) -{ - return (icalcomponent*)icalcomponent_new_impl(kind); -} - -icalcomponent* -icalcomponent_vanew (icalcomponent_kind kind, ...) -{ - va_list args; - - struct icalcomponent_impl *impl = icalcomponent_new_impl(kind); - - if (impl == 0){ - return 0; - } - - va_start(args,kind); - icalcomponent_add_children(impl, args); - va_end(args); - - return (icalcomponent*) impl; -} - -icalcomponent* icalcomponent_new_from_string(char* str) -{ - return icalparser_parse_string(str); -} - -icalcomponent* icalcomponent_new_clone(icalcomponent* component) -{ - struct icalcomponent_impl *old = (struct icalcomponent_impl*)component; - struct icalcomponent_impl *new; - icalproperty *p; - icalcomponent *c; - pvl_elem itr; - - icalerror_check_arg_rz( (component!=0), "component"); - - new = icalcomponent_new_impl(old->kind); - - if (new == 0){ - return 0; - } - - - for( itr = pvl_head(old->properties); - itr != 0; - itr = pvl_next(itr)) - { - p = (icalproperty*)pvl_data(itr); - icalcomponent_add_property(new,icalproperty_new_clone(p)); - } - - - for( itr = pvl_head(old->components); - itr != 0; - itr = pvl_next(itr)) - { - c = (icalcomponent*)pvl_data(itr); - icalcomponent_add_component(new,icalcomponent_new_clone(c)); - } - - return new; - -} - - -void -icalcomponent_free (icalcomponent* component) -{ - icalproperty* prop; - icalcomponent* comp; - struct icalcomponent_impl *c = (struct icalcomponent_impl*)component; - - icalerror_check_arg_rv( (component!=0), "component"); - -#ifdef ICAL_FREE_ON_LIST_IS_ERROR - icalerror_assert( (c->parent ==0),"Tried to free a component that is still attached to a parent component"); -#else - if(c->parent != 0){ - return; - } -#endif - - if(component != 0 ){ - - while( (prop=pvl_pop(c->properties)) != 0){ - assert(prop != 0); - icalproperty_set_parent(prop,0); - icalproperty_free(prop); - } - - pvl_free(c->properties); - - while( (comp=pvl_data(pvl_head(c->components))) != 0){ - assert(comp!=0); - icalcomponent_remove_component(component,comp); - icalcomponent_free(comp); - } - - pvl_free(c->components); - - if (c->x_name != 0) { - free(c->x_name); - } - - c->kind = ICAL_NO_COMPONENT; - c->properties = 0; - c->property_iterator = 0; - c->components = 0; - c->component_iterator = 0; - c->x_name = 0; - c->id[0] = 'X'; - - free(c); - } -} - -char* -icalcomponent_as_ical_string (icalcomponent* component) -{ - char* buf, *out_buf; - char* tmp_buf; - size_t buf_size = 1024; - char* buf_ptr = 0; - pvl_elem itr; - struct icalcomponent_impl *impl = (struct icalcomponent_impl*)component; - -#ifdef ICAL_UNIX_NEWLINE - char newline[] = "\n"; -#else - char newline[] = "\r\n"; -#endif - - icalcomponent *c; - icalproperty *p; - icalcomponent_kind kind = icalcomponent_isa(component); - - const char* kind_string; - - buf = icalmemory_new_buffer(buf_size); - buf_ptr = buf; - - icalerror_check_arg_rz( (component!=0), "component"); - icalerror_check_arg_rz( (kind!=ICAL_NO_COMPONENT), "component kind is ICAL_NO_COMPONENT"); - - kind_string = icalenum_component_kind_to_string(kind); - - icalerror_check_arg_rz( (kind_string!=0),"Unknown kind of component"); - - icalmemory_append_string(&buf, &buf_ptr, &buf_size, "BEGIN:"); - icalmemory_append_string(&buf, &buf_ptr, &buf_size, kind_string); - icalmemory_append_string(&buf, &buf_ptr, &buf_size, newline); - - - - for( itr = pvl_head(impl->properties); - itr != 0; - itr = pvl_next(itr)) - { - p = (icalproperty*)pvl_data(itr); - - icalerror_assert((p!=0),"Got a null property"); - tmp_buf = icalproperty_as_ical_string(p); - - icalmemory_append_string(&buf, &buf_ptr, &buf_size, tmp_buf); - } - - - for( itr = pvl_head(impl->components); - itr != 0; - itr = pvl_next(itr)) - { - c = (icalcomponent*)pvl_data(itr); - - tmp_buf = icalcomponent_as_ical_string(c); - - icalmemory_append_string(&buf, &buf_ptr, &buf_size, tmp_buf); - - } - - icalmemory_append_string(&buf, &buf_ptr, &buf_size, "END:"); - icalmemory_append_string(&buf, &buf_ptr, &buf_size, - icalenum_component_kind_to_string(kind)); - icalmemory_append_string(&buf, &buf_ptr, &buf_size, newline); - - out_buf = icalmemory_tmp_copy(buf); - free(buf); - - return out_buf; -} - - -int -icalcomponent_is_valid (icalcomponent* component) -{ - struct icalcomponent_impl *impl = (struct icalcomponent_impl *)component; - - - if ( (strcmp(impl->id,"comp") == 0) && - impl->kind != ICAL_NO_COMPONENT){ - return 1; - } else { - return 0; - } - -} - - -icalcomponent_kind -icalcomponent_isa (icalcomponent* component) -{ - struct icalcomponent_impl *impl = (struct icalcomponent_impl *)component; - icalerror_check_arg_rz( (component!=0), "component"); - - if(component != 0) - { - return impl->kind; - } - - return ICAL_NO_COMPONENT; -} - - -int -icalcomponent_isa_component (void* component) -{ - struct icalcomponent_impl *impl = (struct icalcomponent_impl *)component; - - icalerror_check_arg_rz( (component!=0), "component"); - - if (strcmp(impl->id,"comp") == 0) { - return 1; - } else { - return 0; - } - -} - -int icalcomponent_property_sorter(void *a, void *b) -{ - icalproperty_kind kinda, kindb; - const char *ksa, *ksb; - - kinda = icalproperty_isa((icalproperty*)a); - kindb = icalproperty_isa((icalproperty*)b); - - ksa = icalenum_property_kind_to_string(kinda); - ksb = icalenum_property_kind_to_string(kindb); - - return strcmp(ksa,ksb); -} - - -void -icalcomponent_add_property (icalcomponent* component, icalproperty* property) -{ - struct icalcomponent_impl *impl; - - icalerror_check_arg_rv( (component!=0), "component"); - icalerror_check_arg_rv( (property!=0), "property"); - - impl = (struct icalcomponent_impl*)component; - - icalerror_assert( (!icalproperty_get_parent(property)),"The property has already been added to a component. Remove the property with icalcomponent_remove_property before calling icalcomponent_add_property"); - - icalproperty_set_parent(property,component); - -#ifdef ICAL_INSERT_ORDERED - pvl_insert_ordered(impl->properties, - icalcomponent_property_sorter,property); -#else - pvl_push(impl->properties,property); -#endif - -} - - -void -icalcomponent_remove_property (icalcomponent* component, icalproperty* property) -{ - struct icalcomponent_impl *impl; - pvl_elem itr, next_itr; - struct icalproperty_impl *pimpl; - - icalerror_check_arg_rv( (component!=0), "component"); - icalerror_check_arg_rv( (property!=0), "property"); - - impl = (struct icalcomponent_impl*)component; - - pimpl = (struct icalproperty_impl*)property; - - icalerror_assert( (icalproperty_get_parent(property)),"The property is not a member of a component"); - - - for( itr = pvl_head(impl->properties); - itr != 0; - itr = next_itr) - { - next_itr = pvl_next(itr); - - if( pvl_data(itr) == (void*)property ){ - - if (impl->property_iterator == itr){ - impl->property_iterator = pvl_next(itr); - } - - pvl_remove( impl->properties, itr); - icalproperty_set_parent(property,0); - } - } -} - -int -icalcomponent_count_properties (icalcomponent* component, - icalproperty_kind kind) -{ - int count=0; - pvl_elem itr; - struct icalcomponent_impl *impl = (struct icalcomponent_impl*)component; - - icalerror_check_arg_rz( (component!=0), "component"); - - for( itr = pvl_head(impl->properties); - itr != 0; - itr = pvl_next(itr)) - { - if(kind == icalproperty_isa((icalproperty*)pvl_data(itr)) || - kind == ICAL_ANY_PROPERTY){ - count++; - } - } - - - return count; - -} - -icalproperty* icalcomponent_get_current_property (icalcomponent* component) -{ - - struct icalcomponent_impl *c = (struct icalcomponent_impl*)component; - icalerror_check_arg_rz( (component!=0),"component"); - - if ((c->property_iterator==0)){ - return 0; - } - - return (icalproperty*) pvl_data(c->property_iterator); - -} - -icalproperty* -icalcomponent_get_first_property (icalcomponent* component, icalproperty_kind kind) -{ - struct icalcomponent_impl *c = (struct icalcomponent_impl*)component; - icalerror_check_arg_rz( (component!=0),"component"); - - for( c->property_iterator = pvl_head(c->properties); - c->property_iterator != 0; - c->property_iterator = pvl_next(c->property_iterator)) { - - icalproperty *p = (icalproperty*) pvl_data(c->property_iterator); - - if (icalproperty_isa(p) == kind || kind == ICAL_ANY_PROPERTY) { - - return p; - } - } - return 0; -} - -icalproperty* -icalcomponent_get_next_property (icalcomponent* component, icalproperty_kind kind) -{ - struct icalcomponent_impl *c = (struct icalcomponent_impl*)component; - icalerror_check_arg_rz( (component!=0),"component"); - - if (c->property_iterator == 0){ - return 0; - } - - for( c->property_iterator = pvl_next(c->property_iterator); - c->property_iterator != 0; - c->property_iterator = pvl_next(c->property_iterator)) { - - icalproperty *p = (icalproperty*) pvl_data(c->property_iterator); - - if (icalproperty_isa(p) == kind || kind == ICAL_ANY_PROPERTY) { - - return p; - } - } - - return 0; -} - - -icalproperty** -icalcomponent_get_properties (icalcomponent* component, icalproperty_kind kind); - - -void -icalcomponent_add_component (icalcomponent* parent, icalcomponent* child) -{ - struct icalcomponent_impl *impl, *cimpl; - - icalerror_check_arg_rv( (parent!=0), "parent"); - icalerror_check_arg_rv( (child!=0), "child"); - - impl = (struct icalcomponent_impl*)parent; - cimpl = (struct icalcomponent_impl*)child; - - icalerror_assert( (cimpl->parent ==0),"The child component has already been added to a parent component. Remove the component with icalcomponent_remove_component before calling icalcomponent_add_component"); - - cimpl->parent = parent; - - pvl_push(impl->components,child); -} - - -void -icalcomponent_remove_component (icalcomponent* parent, icalcomponent* child) -{ - struct icalcomponent_impl *impl,*cimpl; - pvl_elem itr, next_itr; - - icalerror_check_arg_rv( (parent!=0), "parent"); - icalerror_check_arg_rv( (child!=0), "child"); - - impl = (struct icalcomponent_impl*)parent; - cimpl = (struct icalcomponent_impl*)child; - - for( itr = pvl_head(impl->components); - itr != 0; - itr = next_itr) - { - next_itr = pvl_next(itr); - - if( pvl_data(itr) == (void*)child ){ - - if (impl->component_iterator == itr){ - /* Don't let the current iterator become invalid */ - - /* HACK. The semantics for this are troubling. */ - impl->component_iterator = - pvl_next(impl->component_iterator); - - } - pvl_remove( impl->components, itr); - cimpl->parent = 0; - break; - } - } -} - - -int -icalcomponent_count_components (icalcomponent* component, - icalcomponent_kind kind) -{ - int count=0; - pvl_elem itr; - struct icalcomponent_impl *impl = (struct icalcomponent_impl*)component; - - icalerror_check_arg_rz( (component!=0), "component"); - - for( itr = pvl_head(impl->components); - itr != 0; - itr = pvl_next(itr)) - { - if(kind == icalcomponent_isa((icalcomponent*)pvl_data(itr)) || - kind == ICAL_ANY_COMPONENT){ - count++; - } - } - - return count; -} - -icalcomponent* -icalcomponent_get_current_component(icalcomponent* component) -{ - struct icalcomponent_impl *c = (struct icalcomponent_impl*)component; - - icalerror_check_arg_rz( (component!=0),"component"); - - if (c->component_iterator == 0){ - return 0; - } - - return (icalcomponent*) pvl_data(c->component_iterator); -} - -icalcomponent* -icalcomponent_get_first_component (icalcomponent* component, - icalcomponent_kind kind) -{ - struct icalcomponent_impl *c = (struct icalcomponent_impl*)component; - - icalerror_check_arg_rz( (component!=0),"component"); - - for( c->component_iterator = pvl_head(c->components); - c->component_iterator != 0; - c->component_iterator = pvl_next(c->component_iterator)) { - - icalcomponent *p = (icalcomponent*) pvl_data(c->component_iterator); - - if (icalcomponent_isa(p) == kind || kind == ICAL_ANY_COMPONENT) { - - return p; - } - } - - return 0; -} - - -icalcomponent* -icalcomponent_get_next_component (icalcomponent* component, icalcomponent_kind kind) -{ - struct icalcomponent_impl *c = (struct icalcomponent_impl*)component; - - icalerror_check_arg_rz( (component!=0),"component"); - - if (c->component_iterator == 0){ - return 0; - } - - for( c->component_iterator = pvl_next(c->component_iterator); - c->component_iterator != 0; - c->component_iterator = pvl_next(c->component_iterator)) { - - icalcomponent *p = (icalcomponent*) pvl_data(c->component_iterator); - - if (icalcomponent_isa(p) == kind || kind == ICAL_ANY_COMPONENT) { - - return p; - } - } - - return 0; -} - -icalcomponent* icalcomponent_get_first_real_component(icalcomponent *c) -{ - icalcomponent *comp; - - for(comp = icalcomponent_get_first_component(c,ICAL_ANY_COMPONENT); - comp != 0; - comp = icalcomponent_get_next_component(c,ICAL_ANY_COMPONENT)){ - - icalcomponent_kind kind = icalcomponent_isa(comp); - - if(kind == ICAL_VEVENT_COMPONENT || - kind == ICAL_VTODO_COMPONENT || - kind == ICAL_VJOURNAL_COMPONENT ){ - return comp; - } - } - return 0; -} - -time_t icalcomponent_convert_time(icalproperty *p) -{ - struct icaltimetype sict; - time_t convt; - icalproperty *tzp; - - - /* Though it says _dtstart, it will work for dtend too */ - sict = icalproperty_get_dtstart(p); - - tzp = icalproperty_get_first_parameter(p,ICAL_TZID_PARAMETER); - - if (sict.is_utc == 1 && tzp != 0){ - icalerror_warn("icalcomponent_get_span: component has a UTC DTSTART with a timezone specified "); - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - return 0; - } - - if(sict.is_utc == 1){ - /* _as_timet will use gmtime() to do the conversion */ - convt = icaltime_as_timet(sict); - -#ifdef TEST_CONVERT_TIME - printf("convert time: use as_timet:\n %s\n %s", - icalproperty_as_ical_string(p), ctime(&convt)); -#endif - - } else if (sict.is_utc == 0 && tzp == 0 ) { - time_t offset; - - /* _as_timet will use localtime() to do the conversion */ - convt = icaltime_as_timet(sict); - offset = icaltime_utc_offset(sict,0); - convt += offset; - -#ifdef TEST_CONVERT_TIME - printf("convert time: use as_timet and adjust:\n %s\n %s", - icalproperty_as_ical_string(p), ctime(&convt)); -#endif - } else { - /* Convert the time to UTC for the named timezone*/ - const char* timezone = icalparameter_get_tzid(tzp); - convt = icaltime_as_timet(icaltime_as_utc(sict,timezone)); - -#ifdef TEST_CONVERT_TIME - printf("convert time: use _as_utc:\n %s\n %s", - icalproperty_as_ical_string(p), ctime(&convt)); -#endif - } - - return convt; -} -struct icaltime_span icalcomponent_get_span(icalcomponent* comp) -{ - icalcomponent *inner; - icalproperty *p, *duration; - icalcomponent_kind kind; - struct icaltime_span span; - struct icaltimetype start; - - span.start = 0; - span.end = 0; - span.is_busy= 1; - - /* initial Error checking */ - -/* icalerror_check_arg_rz( (comp!=0),"comp");*/ - - kind = icalcomponent_isa(comp); - - if(kind == ICAL_VCALENDAR_COMPONENT){ - inner = icalcomponent_get_first_real_component(comp); - - /* Maybe there is a VTIMEZONE in there */ - if (inner == 0){ - inner = icalcomponent_get_first_component(comp, - ICAL_VTIMEZONE_COMPONENT); - } - - } else { - inner = comp; - } - - if (inner == 0){ - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - /*icalerror_warn("icalcomponent_get_span: no component specified, or empty VCALENDAR component");*/ - return span; - } - - kind = icalcomponent_isa(inner); - - if( !( kind == ICAL_VEVENT_COMPONENT || - kind == ICAL_VJOURNAL_COMPONENT || - kind == ICAL_VTODO_COMPONENT || - kind == ICAL_VFREEBUSY_COMPONENT )) { - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - /*icalerror_warn("icalcomponent_get_span: no component specified, or empty VCALENDAR component");*/ - return span; - - } - - - - /* Get to work. starting with DTSTART */ - - p = icalcomponent_get_first_property(inner, ICAL_DTSTART_PROPERTY); - - if (p ==0 ) { - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - /*icalerror_warn("icalcomponent_get_span: component has no DTSTART time");*/ - return span; - } - - - start = icalproperty_get_dtstart(p); - - icalerror_clear_errno(); - - span.start = icalcomponent_convert_time(p); - -#ifdef TEST_CONVERT_TIME - printf("convert time:\n %s %s", - icalproperty_as_ical_string(p), ctime(&span.start)); -#endif - - if(icalerrno != ICAL_NO_ERROR){ - span.start = 0; - return span; - } - - /* The end time could be specified as either a DTEND or a DURATION */ - p = icalcomponent_get_first_property(inner, ICAL_DTEND_PROPERTY); - duration = icalcomponent_get_first_property(inner, ICAL_DURATION_PROPERTY); - - if (p==0 && duration == 0 && start.is_date != 1) { - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - /*icalerror_warn("icalcomponent_get_span: component has neither DTEND nor DURATION time");*/ - span.start = 0; - return span; - } - - if (p!=0){ - span.end = icalcomponent_convert_time(p); - } else if (start.is_date == 1) { - /* Duration is all day */ - span.end = span.start + 60*60*24; - } else { - /* Use the duration */ - struct icaldurationtype dur; - time_t durt; - - - dur = icalproperty_get_duration(duration); - - durt = icaldurationtype_as_int(dur); - span.end = span.start+durt; - } - - return span; - -} - - -int icalcomponent_count_errors(icalcomponent* component) -{ - int errors = 0; - icalproperty *p; - icalcomponent *c; - pvl_elem itr; - struct icalcomponent_impl *impl = (struct icalcomponent_impl*)component; - - for( itr = pvl_head(impl->properties); - itr != 0; - itr = pvl_next(itr)) - { - p = (icalproperty*)pvl_data(itr); - - if(icalproperty_isa(p) == ICAL_XLICERROR_PROPERTY) - { - errors++; - } - } - - - for( itr = pvl_head(impl->components); - itr != 0; - itr = pvl_next(itr)) - { - c = (icalcomponent*)pvl_data(itr); - - errors += icalcomponent_count_errors(c); - - } - - return errors; -} - - -void icalcomponent_strip_errors(icalcomponent* component) -{ - icalproperty *p; - icalcomponent *c; - pvl_elem itr, next_itr; - struct icalcomponent_impl *impl = (struct icalcomponent_impl*)component; - - for( itr = pvl_head(impl->properties); - itr != 0; - itr = next_itr) - { - p = (icalproperty*)pvl_data(itr); - next_itr = pvl_next(itr); - - if(icalproperty_isa(p) == ICAL_XLICERROR_PROPERTY) - { - icalcomponent_remove_property(component,p); - } - } - - for( itr = pvl_head(impl->components); - itr != 0; - itr = pvl_next(itr)) - { - c = (icalcomponent*)pvl_data(itr); - icalcomponent_strip_errors(c); - } -} - -/* Hack. This will change the state of the iterators */ -void icalcomponent_convert_errors(icalcomponent* component) -{ - icalproperty *p, *next_p; - icalcomponent *c; - - for(p = icalcomponent_get_first_property(component,ICAL_ANY_PROPERTY); - p != 0; - p = next_p){ - - next_p = icalcomponent_get_next_property(component,ICAL_ANY_PROPERTY); - - if(icalproperty_isa(p) == ICAL_XLICERROR_PROPERTY) - { - struct icalreqstattype rst; - icalparameter *param = icalproperty_get_first_parameter - (p,ICAL_XLICERRORTYPE_PARAMETER); - - rst.code = ICAL_UNKNOWN_STATUS; - rst.desc = 0; - - switch(icalparameter_get_xlicerrortype(param)){ - - case ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR: { - rst.code = ICAL_3_2_INVPARAM_STATUS; - break; - } - case ICAL_XLICERRORTYPE_PARAMETERVALUEPARSEERROR: { - rst.code = ICAL_3_3_INVPARAMVAL_STATUS; - break; - } - case ICAL_XLICERRORTYPE_PROPERTYPARSEERROR: { - rst.code = ICAL_3_0_INVPROPNAME_STATUS; - break; - } - case ICAL_XLICERRORTYPE_VALUEPARSEERROR: { - rst.code = ICAL_3_1_INVPROPVAL_STATUS; - break; - } - case ICAL_XLICERRORTYPE_COMPONENTPARSEERROR: { - rst.code = ICAL_3_4_INVCOMP_STATUS; - break; - } - - default: { - } - } - if (rst.code != ICAL_UNKNOWN_STATUS){ - - rst.debug = icalproperty_get_xlicerror(p); - icalcomponent_add_property(component, - icalproperty_new_requeststatus( - icalreqstattype_as_string(rst) - ) - ); - - icalcomponent_remove_property(component,p); - } - } - } - - for(c = icalcomponent_get_first_component(component,ICAL_ANY_COMPONENT); - c != 0; - c = icalcomponent_get_next_component(component,ICAL_ANY_COMPONENT)){ - - icalcomponent_convert_errors(c); - } -} - - -icalcomponent* icalcomponent_get_parent(icalcomponent* component) -{ - struct icalcomponent_impl *c = (struct icalcomponent_impl*)component; - - return c->parent; -} - -void icalcomponent_set_parent(icalcomponent* component, icalcomponent* parent) -{ - struct icalcomponent_impl *c = (struct icalcomponent_impl*)component; - - c->parent = parent; -} - -icalcompiter icalcompiter_null = {ICAL_NO_COMPONENT,0}; - - -struct icalcomponent_kind_map { - icalcomponent_kind kind; - char name[20]; -}; - - - -static struct icalcomponent_kind_map component_map[] = -{ - { ICAL_VEVENT_COMPONENT, "VEVENT" }, - { ICAL_VTODO_COMPONENT, "VTODO" }, - { ICAL_VJOURNAL_COMPONENT, "VJOURNAL" }, - { ICAL_VCALENDAR_COMPONENT, "VCALENDAR" }, - { ICAL_VFREEBUSY_COMPONENT, "VFREEBUSY" }, - { ICAL_VTIMEZONE_COMPONENT, "VTIMEZONE" }, - { ICAL_VALARM_COMPONENT, "VALARM" }, - { ICAL_XSTANDARD_COMPONENT, "STANDARD" }, /*These are part of RFC2445 */ - { ICAL_XDAYLIGHT_COMPONENT, "DAYLIGHT" }, /*but are not really components*/ - { ICAL_X_COMPONENT, "X" }, - { ICAL_VSCHEDULE_COMPONENT, "SCHEDULE" }, - - /* CAP components */ - { ICAL_VQUERY_COMPONENT, "VQUERY" }, - { ICAL_VCAR_COMPONENT, "VCAR" }, - { ICAL_VCOMMAND_COMPONENT, "VCOMMAND" }, - - /* libical private components */ - { ICAL_XLICINVALID_COMPONENT, "X-LIC-UNKNOWN" }, - { ICAL_XLICMIMEPART_COMPONENT, "X-LIC-MIME-PART" }, - { ICAL_ANY_COMPONENT, "ANY" }, - { ICAL_XROOT_COMPONENT, "XROOT" }, - - /* End of list */ - { ICAL_NO_COMPONENT, "" }, -}; - - - -const char* icalcomponent_kind_to_string(icalcomponent_kind kind) -{ - int i; - - for (i=0; component_map[i].kind != ICAL_NO_COMPONENT; i++) { - if (component_map[i].kind == kind) { - return component_map[i].name; - } - } - - return 0; - -} - -icalcomponent_kind icalcomponent_string_to_kind(const char* string) -{ - int i; - - if (string ==0 ) { - return ICAL_NO_COMPONENT; - } - - for (i=0; component_map[i].kind != ICAL_NO_COMPONENT; i++) { - if (strcmp(component_map[i].name, string) == 0) { - return component_map[i].kind; - } - } - - return ICAL_NO_COMPONENT; -} - - - -icalcompiter -icalcomponent_begin_component(icalcomponent* component,icalcomponent_kind kind) -{ - struct icalcomponent_impl *impl = (struct icalcomponent_impl*)component; - icalcompiter itr; - pvl_elem i; - - itr.kind = kind; - - icalerror_check_arg_re( (component!=0),"component",icalcompiter_null); - - for( i = pvl_head(impl->components); i != 0; i = pvl_next(itr.iter)) { - - icalcomponent *c = (icalcomponent*) pvl_data(i); - - if (icalcomponent_isa(c) == kind || kind == ICAL_ANY_COMPONENT) { - - itr.iter = i; - - return itr; - } - } - - return icalcompiter_null; -} - -icalcompiter -icalcomponent_end_component(icalcomponent* component,icalcomponent_kind kind) -{ - struct icalcomponent_impl *impl = (struct icalcomponent_impl*)component; - icalcompiter itr; - pvl_elem i; - - itr.kind = kind; - - icalerror_check_arg_re( (component!=0),"component",icalcompiter_null); - - for( i = pvl_tail(impl->components); i != 0; i = pvl_prior(i)) { - - icalcomponent *c = (icalcomponent*) pvl_data(i); - - if (icalcomponent_isa(c) == kind || kind == ICAL_ANY_COMPONENT) { - - itr.iter = pvl_next(i); - - return itr; - } - } - - return icalcompiter_null;; -} - - -icalcomponent* icalcompiter_next(icalcompiter* i) -{ - if (i->iter == 0){ - return 0; - } - - icalerror_check_arg_rz( (i!=0),"i"); - - for( i->iter = pvl_next(i->iter); - i->iter != 0; - i->iter = pvl_next(i->iter)) { - - icalcomponent *c = (icalcomponent*) pvl_data(i->iter); - - if (icalcomponent_isa(c) == i->kind - || i->kind == ICAL_ANY_COMPONENT) { - - return icalcompiter_deref(i);; - } - } - - return 0; - -} - -icalcomponent* icalcompiter_prior(icalcompiter* i) -{ - if (i->iter == 0){ - return 0; - } - - for( i->iter = pvl_prior(i->iter); - i->iter != 0; - i->iter = pvl_prior(i->iter)) { - - icalcomponent *c = (icalcomponent*) pvl_data(i->iter); - - if (icalcomponent_isa(c) == i->kind - || i->kind == ICAL_ANY_COMPONENT) { - - return icalcompiter_deref(i);; - } - } - - return 0; - -} -icalcomponent* icalcompiter_deref(icalcompiter* i) -{ - if(i->iter ==0){ - return 0; - } - - return pvl_data(i->iter); -} - -icalcomponent* icalcomponent_get_inner(icalcomponent* comp) -{ - if (icalcomponent_isa(comp) == ICAL_VCALENDAR_COMPONENT){ - return icalcomponent_get_first_real_component(comp); - } else { - return comp; - } -} - - -void icalcomponent_set_dtstart(icalcomponent* comp, struct icaltimetype v) -{ - - icalcomponent *inner = icalcomponent_get_inner(comp); - icalproperty *prop - = icalcomponent_get_first_property(inner, ICAL_DTSTART_PROPERTY); - - - if (prop == 0){ - prop = icalproperty_new_dtstart(v); - icalcomponent_add_property(inner, prop); - } - - icalproperty_set_dtstart(prop,v); - -} - - -struct icaltimetype icalcomponent_get_dtstart(icalcomponent* comp) -{ - icalcomponent *inner = icalcomponent_get_inner(comp); - icalproperty *prop - = icalcomponent_get_first_property(inner,ICAL_DTSTART_PROPERTY); - - if (prop == 0){ - return icaltime_null_time(); - } - - return icalproperty_get_dtstart(prop); -} - - -struct icaltimetype icalcomponent_get_dtend(icalcomponent* comp) -{ - icalcomponent *inner = icalcomponent_get_inner(comp); - - icalproperty *end_prop - = icalcomponent_get_first_property(inner,ICAL_DTEND_PROPERTY); - - icalproperty *dur_prop - = icalcomponent_get_first_property(inner, ICAL_DURATION_PROPERTY); - - - if( end_prop == 0 && dur_prop == 0){ - return icaltime_null_time(); - } else if ( end_prop != 0) { - return icalproperty_get_dtend(end_prop); - } else if ( dur_prop != 0) { - - struct icaltimetype start = - icalcomponent_get_dtstart(inner); - struct icaldurationtype duration = - icalproperty_get_duration(dur_prop); - - struct icaltimetype end = icaltime_add(start,duration); - - return end; - - } else { - /* Error, both duration and dtend have been specified */ - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - return icaltime_null_time(); - - } - -} - - -void icalcomponent_set_dtend(icalcomponent* comp, struct icaltimetype v) -{ - icalcomponent *inner = icalcomponent_get_inner(comp); - - icalproperty *end_prop - = icalcomponent_get_first_property(inner,ICAL_DTEND_PROPERTY); - - icalproperty *dur_prop - = icalcomponent_get_first_property(inner,ICAL_DURATION_PROPERTY); - - - if( end_prop == 0 && dur_prop == 0){ - end_prop = icalproperty_new_dtend(v); - icalcomponent_add_property(inner,end_prop); - } else if ( end_prop != 0) { - icalproperty_set_dtend(end_prop,v); - } else if ( dur_prop != 0) { - struct icaltimetype start = - icalcomponent_get_dtstart(inner); - - struct icaltimetype end = - icalcomponent_get_dtend(inner); - - struct icaldurationtype dur - = icaltime_subtract(end,start); - - icalproperty_set_duration(dur_prop,dur); - - } else { - /* Error, both duration and dtend have been specified */ - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - } -} - -void icalcomponent_set_duration(icalcomponent* comp, - struct icaldurationtype v) -{ - icalcomponent *inner = icalcomponent_get_inner(comp); - - icalproperty *end_prop - = icalcomponent_get_first_property(inner,ICAL_DTEND_PROPERTY); - - icalproperty *dur_prop - = icalcomponent_get_first_property(inner,ICAL_DURATION_PROPERTY); - - - if( end_prop == 0 && dur_prop == 0){ - dur_prop = icalproperty_new_duration(v); - icalcomponent_add_property(inner, dur_prop); - } else if ( end_prop != 0) { - struct icaltimetype start = - icalcomponent_get_dtstart(inner); - - struct icaltimetype new_end = icaltime_add(start,v); - - icalproperty_set_dtend(end_prop,new_end); - - } else if ( dur_prop != 0) { - icalproperty_set_duration(dur_prop,v); - } else { - /* Error, both duration and dtend have been specified */ - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - } -} - -struct icaldurationtype icalcomponent_get_duration(icalcomponent* comp) -{ - icalcomponent *inner = icalcomponent_get_inner(comp); - - icalproperty *end_prop - = icalcomponent_get_first_property(inner,ICAL_DTEND_PROPERTY); - - icalproperty *dur_prop - = icalcomponent_get_first_property(inner,ICAL_DURATION_PROPERTY); - - struct icaldurationtype null_duration; - memset(&null_duration,0,sizeof(struct icaldurationtype)); - - - if( end_prop == 0 && dur_prop == 0){ - return null_duration; - } else if ( end_prop != 0) { - struct icaltimetype start = - icalcomponent_get_dtstart(inner); - time_t startt = icaltime_as_timet(start); - - struct icaltimetype end = - icalcomponent_get_dtend(inner); - time_t endt = icaltime_as_timet(end); - - return icaldurationtype_from_int(endt-startt); - } else if ( dur_prop != 0) { - return icalproperty_get_duration(dur_prop); - } else { - /* Error, both duration and dtend have been specified */ - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - return null_duration; - } -} - -void icalcomponent_set_method(icalcomponent* comp, icalproperty_method method) -{ - icalproperty *prop - = icalcomponent_get_first_property(comp, ICAL_METHOD_PROPERTY); - - - if (prop == 0){ - prop = icalproperty_new_method(method); - icalcomponent_add_property(comp, prop); - } - - icalproperty_set_method(prop,method); - -} - -icalproperty_method icalcomponent_get_method(icalcomponent* comp) -{ - icalproperty *prop - = icalcomponent_get_first_property(comp,ICAL_METHOD_PROPERTY); - - if (prop == 0){ - return ICAL_METHOD_NONE; - } - - return icalproperty_get_method(prop); -} - -void icalcomponent_set_dtstamp(icalcomponent* comp, struct icaltimetype v) -{ - - icalcomponent *inner = icalcomponent_get_inner(comp); - icalproperty *prop - = icalcomponent_get_first_property(inner, ICAL_DTSTAMP_PROPERTY); - - - if (prop == 0){ - prop = icalproperty_new_dtstamp(v); - icalcomponent_add_property(inner, prop); - } - - icalproperty_set_dtstamp(prop,v); - -} - - -struct icaltimetype icalcomponent_get_dtstamp(icalcomponent* comp) -{ - icalcomponent *inner = icalcomponent_get_inner(comp); - icalproperty *prop - = icalcomponent_get_first_property(inner,ICAL_DTSTAMP_PROPERTY); - - if (prop == 0){ - return icaltime_null_time(); - } - - return icalproperty_get_dtstamp(prop); -} - - -void icalcomponent_set_summary(icalcomponent* comp, const char* v) -{ - icalcomponent *inner = icalcomponent_get_inner(comp); - icalproperty *prop - = icalcomponent_get_first_property(inner, ICAL_SUMMARY_PROPERTY); - - if (prop == 0){ - prop = icalproperty_new_summary(v); - icalcomponent_add_property(inner, prop); - } - - icalproperty_set_summary(prop,v); -} - - -const char* icalcomponent_get_summary(icalcomponent* comp) -{ - icalcomponent *inner = icalcomponent_get_inner(comp); - icalproperty *prop - = icalcomponent_get_first_property(inner,ICAL_SUMMARY_PROPERTY); - - if (prop == 0){ - return 0; - } - - return icalproperty_get_summary(prop); - -} - -void icalcomponent_set_comment(icalcomponent* comp, const char* v); -const char* icalcomponent_get_comment(icalcomponent* comp); - -void icalcomponent_set_uid(icalcomponent* comp, const char* v); -const char* icalcomponent_get_uid(icalcomponent* comp); - -void icalcomponent_set_recurrenceid(icalcomponent* comp, - struct icaltimetype v); -struct icaltimetype icalcomponent_get_recurrenceid(icalcomponent* comp); - - - - -icalcomponent* icalcomponent_new_vcalendar() -{ - return icalcomponent_new(ICAL_VCALENDAR_COMPONENT); -} -icalcomponent* icalcomponent_new_vevent() -{ - return icalcomponent_new(ICAL_VEVENT_COMPONENT); -} -icalcomponent* icalcomponent_new_vtodo() -{ - return icalcomponent_new(ICAL_VTODO_COMPONENT); -} -icalcomponent* icalcomponent_new_vjournal() -{ - return icalcomponent_new(ICAL_VJOURNAL_COMPONENT); -} -icalcomponent* icalcomponent_new_valarm() -{ - return icalcomponent_new(ICAL_VALARM_COMPONENT); -} -icalcomponent* icalcomponent_new_vfreebusy() -{ - return icalcomponent_new(ICAL_VFREEBUSY_COMPONENT); -} -icalcomponent* icalcomponent_new_vtimezone() -{ - return icalcomponent_new(ICAL_VTIMEZONE_COMPONENT); -} -icalcomponent* icalcomponent_new_xstandard() -{ - return icalcomponent_new(ICAL_XSTANDARD_COMPONENT); -} -icalcomponent* icalcomponent_new_xdaylight() -{ - return icalcomponent_new(ICAL_XDAYLIGHT_COMPONENT); -} diff --git a/libical/src/libical/icalcomponent.h b/libical/src/libical/icalcomponent.h deleted file mode 100644 index 6046bbee1e..0000000000 --- a/libical/src/libical/icalcomponent.h +++ /dev/null @@ -1,240 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalcomponent.h - CREATOR: eric 20 March 1999 - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icalcomponent.h - -======================================================================*/ - -#ifndef ICALCOMPONENT_H -#define ICALCOMPONENT_H - -#include "icalproperty.h" -#include "icalvalue.h" -#include "icalenums.h" /* defines icalcomponent_kind */ -#include "icalattendee.h" -#include "pvl.h" - -typedef void icalcomponent; - -/* This is exposed so that callers will not have to allocate and - deallocate iterators. Pretend that you can't see it. */ -typedef struct icalcompiter -{ - icalcomponent_kind kind; - pvl_elem iter; - -} icalcompiter; - -icalcomponent* icalcomponent_new(icalcomponent_kind kind); -icalcomponent* icalcomponent_new_clone(icalcomponent* component); -icalcomponent* icalcomponent_new_from_string(char* str); -icalcomponent* icalcomponent_vanew(icalcomponent_kind kind, ...); -void icalcomponent_free(icalcomponent* component); - -char* icalcomponent_as_ical_string(icalcomponent* component); - -int icalcomponent_is_valid(icalcomponent* component); - -icalcomponent_kind icalcomponent_isa(icalcomponent* component); - -int icalcomponent_isa_component (void* component); - -/* - * Working with properties - */ - -void icalcomponent_add_property(icalcomponent* component, - icalproperty* property); - -void icalcomponent_remove_property(icalcomponent* component, - icalproperty* property); - -int icalcomponent_count_properties(icalcomponent* component, - icalproperty_kind kind); - -/* Iterate through the properties */ -icalproperty* icalcomponent_get_current_property(icalcomponent* component); - -icalproperty* icalcomponent_get_first_property(icalcomponent* component, - icalproperty_kind kind); -icalproperty* icalcomponent_get_next_property(icalcomponent* component, - icalproperty_kind kind); - - -/* - * Working with components - */ - - -/* Return the first VEVENT, VTODO or VJOURNAL sub-component of cop, or - comp if it is one of those types */ - -icalcomponent* icalcomponent_get_inner(icalcomponent* comp); - - -void icalcomponent_add_component(icalcomponent* parent, - icalcomponent* child); - -void icalcomponent_remove_component(icalcomponent* parent, - icalcomponent* child); - -int icalcomponent_count_components(icalcomponent* component, - icalcomponent_kind kind); - -/* Iteration Routines. There are two forms of iterators, internal and -external. The internal ones came first, and are almost completely -sufficient, but they fail badly when you want to construct a loop that -removes components from the container.*/ - - -/* Iterate through components */ -icalcomponent* icalcomponent_get_current_component (icalcomponent* component); - -icalcomponent* icalcomponent_get_first_component(icalcomponent* component, - icalcomponent_kind kind); -icalcomponent* icalcomponent_get_next_component(icalcomponent* component, - icalcomponent_kind kind); - -/* Using external iterators */ -icalcompiter icalcomponent_begin_component(icalcomponent* component, - icalcomponent_kind kind); -icalcompiter icalcomponent_end_component(icalcomponent* component, - icalcomponent_kind kind); -icalcomponent* icalcompiter_next(icalcompiter* i); -icalcomponent* icalcompiter_prior(icalcompiter* i); -icalcomponent* icalcompiter_deref(icalcompiter* i); - - - - -/* Working with embedded error properties */ - -int icalcomponent_count_errors(icalcomponent* component); - -/* Remove all X-LIC-ERROR properties*/ -void icalcomponent_strip_errors(icalcomponent* component); - -/* Convert some X-LIC-ERROR properties into RETURN-STATUS properties*/ -void icalcomponent_convert_errors(icalcomponent* component); - -/* Internal operations. They are private, and you should not be using them. */ -icalcomponent* icalcomponent_get_parent(icalcomponent* component); -void icalcomponent_set_parent(icalcomponent* component, - icalcomponent* parent); - -/* Kind conversion routiens */ - -icalcomponent_kind icalcomponent_string_to_kind(const char* string); - -const char* icalcomponent_kind_to_string(icalcomponent_kind kind); - - -/************* Derived class methods. **************************** - -If the code was in an OO language, the remaining routines would be -members of classes derived from icalcomponent. Don't call them on the -wrong component subtypes. */ - -/* For VCOMPONENT: Return a reference to the first VEVENT, VTODO or - VJOURNAL */ -icalcomponent* icalcomponent_get_first_real_component(icalcomponent *c); - -/* For VEVENT, VTODO, VJOURNAL and VTIMEZONE: report the start and end - times of an event in UTC */ -struct icaltime_span icalcomponent_get_span(icalcomponent* comp); - -/******************** Convienience routines **********************/ - -void icalcomponent_set_dtstart(icalcomponent* comp, struct icaltimetype v); -struct icaltimetype icalcomponent_get_dtstart(icalcomponent* comp); - -/* For the icalcomponent routines only, dtend and duration are tied - together. If you call the set routine for one and the other exists, - the routine will calculate the change to the other. That is, if - there is a DTEND and you call set_duration, the routine will modify - DTEND to be the sum of DTSTART and the duration. If you call a get - routine for one and the other exists, the routine will calculate - the return value. If you call a set routine and neither exists, the - routine will create the apcompriate comperty */ - - -struct icaltimetype icalcomponent_get_dtend(icalcomponent* comp); -void icalcomponent_set_dtend(icalcomponent* comp, struct icaltimetype v); - -void icalcomponent_set_duration(icalcomponent* comp, - struct icaldurationtype v); -struct icaldurationtype icalcomponent_get_duration(icalcomponent* comp); - -void icalcomponent_set_method(icalcomponent* comp, icalproperty_method method); -icalproperty_method icalcomponent_get_method(icalcomponent* comp); - -struct icaltimetype icalcomponent_get_dtstamp(icalcomponent* comp); -void icalcomponent_set_dtstamp(icalcomponent* comp, struct icaltimetype v); - - -void icalcomponent_set_summary(icalcomponent* comp, const char* v); -const char* icalcomponent_get_summary(icalcomponent* comp); - -void icalcomponent_set_comment(icalcomponent* comp, const char* v); -const char* icalcomponent_get_comment(icalcomponent* comp); - -void icalcomponent_set_uid(icalcomponent* comp, const char* v); -const char* icalcomponent_get_uid(icalcomponent* comp); - -void icalcomponent_set_recurrenceid(icalcomponent* comp, - struct icaltimetype v); -struct icaltimetype icalcomponent_get_recurrenceid(icalcomponent* comp); - - -void icalcomponent_set_organizer(icalcomponent* comp, - struct icalorganizertype org); - struct icalorganizertype icalcomponent_get_organizer(icalcomponent* comp); - - -void icalcomponent_add_attendee(icalcomponent *comp, - struct icalattendeetype attendee); - -int icalcomponent_remove_attendee(icalcomponent *comp, char* cuid); - -/* Get the Nth attendee. Out of range indices return an attendee - with cuid == 0 */ -struct icalattendeetype icalcomponent_get_attendee(icalcomponent *comp, - int index); - - - - -/*************** Type Specific routines ***************/ - -icalcomponent* icalcomponent_new_vcalendar(); -icalcomponent* icalcomponent_new_vevent(); -icalcomponent* icalcomponent_new_vtodo(); -icalcomponent* icalcomponent_new_vjournal(); -icalcomponent* icalcomponent_new_valarm(); -icalcomponent* icalcomponent_new_vfreebusy(); -icalcomponent* icalcomponent_new_vtimezone(); -icalcomponent* icalcomponent_new_xstandard(); -icalcomponent* icalcomponent_new_xdaylight(); - - - -#endif /* !ICALCOMPONENT_H */ - - - diff --git a/libical/src/libical/icalderivedparameter.c.in b/libical/src/libical/icalderivedparameter.c.in deleted file mode 100644 index 4af6e95c0e..0000000000 --- a/libical/src/libical/icalderivedparameter.c.in +++ /dev/null @@ -1,211 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: icalderivedparameters.{c,h} - CREATOR: eric 09 May 1999 - - $Id: icalderivedparameter.c.in,v 1.1 2001/04/17 17:23:17 jpr Exp $ - $Locker: $ - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icalderivedparameters.{c,h} - - Contributions from: - Graham Davison (g.m.davison@computer.org) - - ======================================================================*/ -/*#line 29 "icalparameter.c.in"*/ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - - -#include "icalparameter.h" -#include "icalparameterimpl.h" - -#include "icalproperty.h" -#include "icalerror.h" -#include "icalmemory.h" - -#include <stdlib.h> /* for malloc() */ -#include <errno.h> -#include <string.h> /* for memset() */ - -icalvalue_kind icalparameter_value_to_value_kind(icalparameter_value value); - -struct icalparameter_impl* icalparameter_new_impl(icalparameter_kind kind); - -/* This map associates each of the parameters with the string - representation of the paramter's name */ -struct icalparameter_kind_map { - icalparameter_kind kind; - char *name; - -}; - -extern struct icalparameter_kind_map parameter_map[]; - - -const char* icalparameter_kind_to_string(icalparameter_kind kind) -{ - int i; - - for (i=0; parameter_map[i].kind != ICAL_NO_PARAMETER; i++) { - if (parameter_map[i].kind == kind) { - return parameter_map[i].name; - } - } - - return 0; - -} - -icalparameter_kind icalparameter_string_to_kind(const char* string) -{ - int i; - - if (string ==0 ) { - return ICAL_NO_PARAMETER; - } - - for (i=0; parameter_map[i].kind != ICAL_NO_PARAMETER; i++) { - - if (strcmp(parameter_map[i].name, string) == 0) { - return parameter_map[i].kind; - } - } - - if(strncmp(string,"X-",2)==0){ - return ICAL_X_PARAMETER; - } - - return ICAL_NO_PARAMETER; -} - -/* This map associates the enumerations for the VALUE parameter with - the kinds of VALUEs. */ - -struct icalparameter_value_kind_map { - icalparameter_value value; - icalvalue_kind kind; -}; - -extern struct icalparameter_value_kind_map value_kind_map[]; - - -icalvalue_kind icalparameter_value_to_value_kind(icalparameter_value value) -{ - int i; - - for (i=0; value_kind_map[i].kind != ICAL_NO_VALUE; i++) { - - if (value_kind_map[i].value == value) { - return value_kind_map[i].kind; - } - } - - return ICAL_NO_VALUE; -} - - -/* This map associates the parameter enumerations with a specific parameter and the string representation of the enumeration */ - -struct icalparameter_map { - icalparameter_kind kind; - int enumeration; - const char* str; -}; - - -extern struct icalparameter_map icalparameter_map[]; - - -const char* icalparameter_enum_to_string(int e) -{ - int i; - - icalerror_check_arg_rz(e >= ICALPARAMETER_FIRST_ENUM,"e"); - icalerror_check_arg_rz(e <= ICALPARAMETER_LAST_ENUM,"e"); - - for (i=0; icalparameter_map[i].kind != ICAL_NO_PARAMETER; i++){ - if(e == icalparameter_map[i].enumeration){ - return icalparameter_map[i].str; - } - } - - return 0; -} - -int icalparameter_string_to_enum(const char* str) -{ - int i; - - icalerror_check_arg_rz(str != 0,"str"); - - for (i=0; icalparameter_map[i].kind != ICAL_NO_PARAMETER; i++){ - if(strcmp(str,icalparameter_map[i].str) == 0) { - return icalparameter_map[i].enumeration; - } - } - - return 0; -} - -icalparameter* icalparameter_new_from_value_string(icalparameter_kind kind,const char* val) -{ - - struct icalparameter_impl* param=0; - int found_kind = 0; - int i; - - icalerror_check_arg_rz((val!=0),"val"); - - /* Search through the parameter map to find a matching kind */ - - param = icalparameter_new_impl(kind); - - for (i=0; icalparameter_map[i].kind != ICAL_NO_PARAMETER; i++){ - if(kind == icalparameter_map[i].kind) { - found_kind = 1; - if(strcmp(val,icalparameter_map[i].str) == 0) { - - param->data = (int)icalparameter_map[i].enumeration; - return param; - } - } - } - - if(found_kind == 1){ - /* The kind was in the parameter map, but the string did not - match, so assume that it is an alternate value, like an - X-value.*/ - - icalparameter_set_xvalue(param, val); - - } else { - - /* If the kind was not found, then it must be a string type */ - - ((struct icalparameter_impl*)param)->string = icalmemory_strdup(val); - - } - - return param; -} - - - - -/* Everything below this line is machine generated. Do not edit. */ diff --git a/libical/src/libical/icalderivedparameter.h.in b/libical/src/libical/icalderivedparameter.h.in deleted file mode 100644 index e9fdd19fa7..0000000000 --- a/libical/src/libical/icalderivedparameter.h.in +++ /dev/null @@ -1,37 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalparam.h - CREATOR: eric 20 March 1999 - - - $Id: icalderivedparameter.h.in,v 1.1 2001/04/17 17:23:17 jpr Exp $ - $Locker: $ - - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icalparam.h - - ======================================================================*/ - -#ifndef ICALDERIVEDPARAMETER_H -#define ICALDERIVEDPARAMETER_H - - -typedef void icalparameter; - -const char* icalparameter_enum_to_string(int e); -int icalparameter_string_to_enum(const char* str); - diff --git a/libical/src/libical/icalderivedproperty.c.in b/libical/src/libical/icalderivedproperty.c.in deleted file mode 100644 index ceec0b797d..0000000000 --- a/libical/src/libical/icalderivedproperty.c.in +++ /dev/null @@ -1,250 +0,0 @@ -/* -*- Mode: C -*- */ - -/*====================================================================== - FILE: icalderivedproperty.c - CREATOR: eric 15 Feb 2001 - - $Id: icalderivedproperty.c.in,v 1.1 2001/04/17 17:23:17 jpr Exp $ - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icalproperty.c - -======================================================================*/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "icalproperty.h" -#include "icalcomponent.h" -#include "pvl.h" -#include "icalenums.h" -#include "icalerror.h" -#include "icalmemory.h" -#include "icalparser.h" - -#include <string.h> /* For icalmemory_strdup, rindex */ -#include <assert.h> -#include <stdlib.h> -#include <errno.h> -#include <stdio.h> /* for printf */ -#include <stdarg.h> /* for va_list, va_start, etc. */ - -#define TMP_BUF_SIZE 1024 - -struct icalproperty_impl* -icalproperty_new_impl (icalproperty_kind kind); - -/* This map associates the property kinds with the string - representation of the property name and the kind of VALUE that the - property uses as a default */ - -struct icalproperty_map { - icalproperty_kind kind; - const char *name; - icalvalue_kind value; - -}; - -extern struct icalproperty_map property_map[]; - -const char* icalproperty_kind_to_string(icalproperty_kind kind) -{ - int i; - - for (i=0; property_map[i].kind != ICAL_NO_PROPERTY; i++) { - if (property_map[i].kind == kind) { - return property_map[i].name; - } - } - - return 0; - -} - - -icalproperty_kind icalproperty_string_to_kind(const char* string) -{ - int i; - - if (string ==0 ) { - return ICAL_NO_PROPERTY; - } - - - for (i=0; property_map[i].kind != ICAL_NO_PROPERTY; i++) { - if (strcmp(property_map[i].name, string) == 0) { - return property_map[i].kind; - } - } - - if(strncmp(string,"X-",2)==0){ - return ICAL_X_PROPERTY; - } - - - return ICAL_NO_PROPERTY; -} - - -icalvalue_kind icalproperty_value_kind_to_kind(icalvalue_kind kind) -{ - int i; - - for (i=0; property_map[i].kind != ICAL_NO_PROPERTY; i++) { - if ( property_map[i].value == kind ) { - return property_map[i].kind; - } - } - - return ICAL_NO_VALUE; -} - - - -icalvalue_kind icalproperty_kind_to_value_kind(icalproperty_kind kind) -{ - int i; - - for (i=0; property_map[i].kind != ICAL_NO_PROPERTY; i++) { - if ( property_map[i].kind == kind ) { - return property_map[i].value; - } - } - - return ICAL_NO_VALUE; -} - - -/* This map associates the property enumerations with the king of - property that they are used in and the string representation of the - enumeration */ - -struct icalproperty_enum_map { - icalproperty_kind prop; - int prop_enum; - const char* str; -}; - -extern struct icalproperty_enum_map enum_map[]; - - -const char* icalproperty_enum_to_string(int e) -{ - icalerror_check_arg_rz(e >= ICALPROPERTY_FIRST_ENUM,"e"); - icalerror_check_arg_rz(e <= ICALPROPERTY_LAST_ENUM,"e"); - - return enum_map[e-ICALPROPERTY_FIRST_ENUM].str; -} - -int icalproperty_string_to_enum(const char* str) -{ - int i; - - icalerror_check_arg_rz(str!=0,"str") - - while(*str == ' '){ - str++; - } - - for (i=ICALPROPERTY_FIRST_ENUM; i != ICALPROPERTY_LAST_ENUM; i++) { - if ( strcmp(enum_map[i-ICALPROPERTY_FIRST_ENUM].str, str) == 0) { - return enum_map[i-ICALPROPERTY_FIRST_ENUM].prop_enum; - } - } - - return 0; -} - -int icalproperty_enum_belongs_to_property(icalproperty_kind kind, int e) -{ - int i; - - - for (i=ICALPROPERTY_FIRST_ENUM; i != ICALPROPERTY_LAST_ENUM; i++) { - if(enum_map[i-ICALPROPERTY_FIRST_ENUM].prop_enum == e && - enum_map[i-ICALPROPERTY_FIRST_ENUM].prop == kind ){ - return 1; - } - } - - return 0; -} - - -const char* icalproperty_method_to_string(icalproperty_method method) -{ - icalerror_check_arg_rz(method >= ICAL_METHOD_X,"method"); - icalerror_check_arg_rz(method <= ICAL_METHOD_NONE,"method"); - - return enum_map[method-ICALPROPERTY_FIRST_ENUM].str; -} - -icalproperty_method icalproperty_string_to_method(const char* str) -{ - int i; - - icalerror_check_arg_rx(str!=0,"str",ICAL_METHOD_NONE) - - while(*str == ' '){ - str++; - } - - for (i=ICAL_METHOD_X-ICALPROPERTY_FIRST_ENUM; - i != ICAL_METHOD_NONE-ICALPROPERTY_FIRST_ENUM; - i++) { - if ( strcmp(enum_map[i].str, str) == 0) { - return (icalproperty_method)enum_map[i].prop_enum; - } - } - - return ICAL_METHOD_NONE; -} - - -const char* icalenum_status_to_string(icalproperty_status status) -{ - icalerror_check_arg_rz(status >= ICAL_STATUS_X,"status"); - icalerror_check_arg_rz(status <= ICAL_STATUS_NONE,"status"); - - return enum_map[status-ICALPROPERTY_FIRST_ENUM].str; -} - -icalproperty_status icalenum_string_to_status(const char* str) -{ - int i; - - icalerror_check_arg_rx(str!=0,"str",ICAL_STATUS_NONE) - - while(*str == ' '){ - str++; - } - - for (i=ICAL_STATUS_X-ICALPROPERTY_FIRST_ENUM; - i != ICAL_STATUS_NONE-ICALPROPERTY_FIRST_ENUM; - i++) { - if ( strcmp(enum_map[i].str, str) == 0) { - return (icalproperty_method)enum_map[i].prop_enum; - } - } - - return ICAL_STATUS_NONE; - -} - - - -/* Everything below this line is machine generated. Do not edit. */ diff --git a/libical/src/libical/icalderivedproperty.h.in b/libical/src/libical/icalderivedproperty.h.in deleted file mode 100644 index 6ce34afafb..0000000000 --- a/libical/src/libical/icalderivedproperty.h.in +++ /dev/null @@ -1,23 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: icalderivedproperties.{c,h} - CREATOR: eric 09 May 1999 - - $Id: icalderivedproperty.h.in,v 1.1 2001/04/17 17:23:17 jpr Exp $ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - ======================================================================*/ - - -#ifndef ICALDERIVEDPROPERTY_H -#define ICALDERIVEDPROPERTY_H - -#include <time.h> -#include "icalparameter.h" -#include "icalderivedvalue.h" -#include "icalrecur.h" - -typedef void icalproperty; - - -/* Everything below this line is machine generated. Do not edit. */ diff --git a/libical/src/libical/icalderivedvalue.c.in b/libical/src/libical/icalderivedvalue.c.in deleted file mode 100644 index 420ffb9ef0..0000000000 --- a/libical/src/libical/icalderivedvalue.c.in +++ /dev/null @@ -1,299 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalvalue.c - CREATOR: eric 02 May 1999 - - $Id: icalderivedvalue.c.in,v 1.1 2001/04/17 17:23:17 jpr Exp $ - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icalvalue.c - - Contributions from: - Graham Davison (g.m.davison@computer.org) - - -======================================================================*/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "icalerror.h" -#include "icalmemory.h" -#include "icalparser.h" -#include "icalenums.h" - -#include "icalvalueimpl.h" - -#include <stdlib.h> /* for malloc */ -#include <stdio.h> /* for sprintf */ -#include <string.h> /* For memset, others */ -#include <stddef.h> /* For offsetof() macro */ -#include <errno.h> -#include <time.h> /* for mktime */ -#include <stdlib.h> /* for atoi and atof */ -#include <limits.h> /* for SHRT_MAX */ - - - -#define TMP_BUF_SIZE 1024 - -struct icalvalue_impl* icalvalue_new_impl(icalvalue_kind kind); - -/* This map associates each of the value types with its string - representation */ -struct icalvalue_kind_map { - icalvalue_kind kind; - char name[20]; -}; - -extern struct icalvalue_kind_map value_map[]; - -const char* icalvalue_kind_to_string(icalvalue_kind kind) -{ - int i; - - for (i=0; value_map[i].kind != ICAL_NO_VALUE; i++) { - if (value_map[i].kind == kind) { - return value_map[i].name; - } - } - - return 0; -} - -icalvalue_kind icalvalue_string_to_kind(const char* str) -{ - int i; - - for (i=0; value_map[i].kind != ICAL_NO_VALUE; i++) { - if (strcmp(value_map[i].name,str) == 0) { - return value_map[i].kind; - } - } - - return value_map[i].kind; - -} - -icalvalue* icalvalue_new_x (const char* v){ - struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_X_VALUE); - icalerror_check_arg_rz( (v!=0),"v"); - - icalvalue_set_x((icalvalue*)impl,v); - return (icalvalue*)impl; -} -void icalvalue_set_x(icalvalue* value, const char* v) { - struct icalvalue_impl* impl; - icalerror_check_arg_rv( (value!=0),"value"); - icalerror_check_arg_rv( (v!=0),"v"); - - impl = (struct icalvalue_impl*)value; - if(impl->x_value!=0) {free((void*)impl->x_value);} - - impl->x_value = icalmemory_strdup(v); - - if (impl->x_value == 0){ - errno = ENOMEM; - } - - } -const char* icalvalue_get_x(icalvalue* value) { - - icalerror_check_arg( (value!=0),"value"); - icalerror_check_value_type(value, ICAL_X_VALUE); - return ((struct icalvalue_impl*)value)->x_value; -} - -/* Recur is a special case, so it is not auto generated. */ -icalvalue* -icalvalue_new_recur (struct icalrecurrencetype v) -{ - struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_RECUR_VALUE); - - icalvalue_set_recur((icalvalue*)impl,v); - - return (icalvalue*)impl; -} - -void -icalvalue_set_recur(icalvalue* value, struct icalrecurrencetype v) -{ - struct icalvalue_impl* impl; - - icalerror_check_arg_rv( (value!=0),"value"); - icalerror_check_value_type(value, ICAL_RECUR_VALUE); - - impl = (struct icalvalue_impl*)value; - - if (impl->data.v_recur != 0){ - free(impl->data.v_recur); - impl->data.v_recur = 0; - } - - impl->data.v_recur = malloc(sizeof(struct icalrecurrencetype)); - - if (impl->data.v_recur == 0){ - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return; - } else { - memcpy(impl->data.v_recur, &v, sizeof(struct icalrecurrencetype)); - } - -} - -struct icalrecurrencetype -icalvalue_get_recur(icalvalue* value) -{ - icalerror_check_arg( (value!=0),"value"); - icalerror_check_value_type(value, ICAL_RECUR_VALUE); - - return *(((struct icalvalue_impl*)value)->data.v_recur); -} - - - - -icalvalue* -icalvalue_new_trigger (struct icaltriggertype v) -{ - struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_TRIGGER_VALUE); - - icalvalue_set_trigger((icalvalue*)impl,v); - - return (icalvalue*)impl; -} - -void -icalvalue_set_trigger(icalvalue* value, struct icaltriggertype v) -{ - struct icalvalue_impl* impl; - - icalerror_check_arg_rv( (value!=0),"value"); - - impl = (struct icalvalue_impl*)value; - - if(!icaltime_is_null_time(v.time)){ - icalvalue_set_datetime((icalvalue*)impl,v.time); - impl->kind = ICAL_DATETIME_VALUE; - } else { - icalvalue_set_duration((icalvalue*)impl,v.duration); - impl->kind = ICAL_DURATION_VALUE; - } - -} - -struct icaltriggertype -icalvalue_get_trigger(icalvalue* value) -{ - struct icalvalue_impl *impl = (struct icalvalue_impl*)value; - struct icaltriggertype tr; - - icalerror_check_arg( (value!=0),"value"); - icalerror_check_arg( (value!=0),"value"); - - if(impl->kind == ICAL_DATETIME_VALUE){ - tr.duration = icaldurationtype_from_int(0); - tr.time = impl->data.v_time; - } else if(impl->kind == ICAL_DURATION_VALUE){ - tr.time = icaltime_null_time(); - tr.duration = impl->data.v_duration; - } else { - tr.duration = icaldurationtype_from_int(0); - tr.time = icaltime_null_time(); - icalerror_set_errno(ICAL_BADARG_ERROR); - } - - return tr; -} - -/* DATE-TIME-PERIOD is a special case, and is not auto generated */ - -icalvalue* -icalvalue_new_datetimeperiod (struct icaldatetimeperiodtype v) -{ - struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_DATETIMEPERIOD_VALUE); - - icalvalue_set_datetimeperiod((icalvalue*)impl,v); - - return (icalvalue*)impl; -} - -void -icalvalue_set_datetimeperiod(icalvalue* value, struct icaldatetimeperiodtype v) -{ - struct icalvalue_impl* impl = (struct icalvalue_impl*)value; - - icalerror_check_arg_rv( (value!=0),"value"); - - icalerror_check_value_type(value, ICAL_DATETIMEPERIOD_VALUE); - - if(!icaltime_is_null_time(v.time)){ - if(!icaltime_is_valid_time(v.time)){ - icalerror_set_errno(ICAL_BADARG_ERROR); - return; - } - impl->kind = ICAL_DATETIME_VALUE; - icalvalue_set_datetime(impl,v.time); - } else if (!icalperiodtype_is_null_period(v.period)) { - if(!icalperiodtype_is_valid_period(v.period)){ - icalerror_set_errno(ICAL_BADARG_ERROR); - return; - } - impl->kind = ICAL_PERIOD_VALUE; - icalvalue_set_period(impl,v.period); - } else { - icalerror_set_errno(ICAL_BADARG_ERROR); - } -} - -struct icaldatetimeperiodtype -icalvalue_get_datetimeperiod(icalvalue* value) -{ - struct icaldatetimeperiodtype dtp; - - struct icalvalue_impl* impl = (struct icalvalue_impl*)value; - icalerror_check_arg( (value!=0),"value"); - icalerror_check_value_type(value, ICAL_DATETIMEPERIOD_VALUE); - - if(impl->kind == ICAL_DATETIME_VALUE){ - dtp.period = icalperiodtype_null_period(); - dtp.time = impl->data.v_time; - } else if(impl->kind == ICAL_PERIOD_VALUE) { - dtp.period = impl->data.v_period; - dtp.time = icaltime_null_time(); - } else { - dtp.period = icalperiodtype_null_period(); - dtp.time = icaltime_null_time(); - icalerror_set_errno(ICAL_BADARG_ERROR); - } - - return dtp; -} - - - - - - - - - -/* The remaining interfaces are 'new', 'set' and 'get' for each of the value - types */ - - -/* Everything below this line is machine generated. Do not edit. */ diff --git a/libical/src/libical/icalderivedvalue.h.in b/libical/src/libical/icalderivedvalue.h.in deleted file mode 100644 index 640dd86821..0000000000 --- a/libical/src/libical/icalderivedvalue.h.in +++ /dev/null @@ -1,58 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalvalue.h - CREATOR: eric 20 March 1999 - - - $Id: icalderivedvalue.h.in,v 1.1 2001/04/17 17:23:17 jpr Exp $ - $Locker: $ - - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icalvalue.h - - ======================================================================*/ - -#ifndef ICALDERIVEDVALUE_H -#define ICALDERIVEDVALUE_H - -#include "icaltypes.h" -#include "icalrecur.h" -#include "icaltime.h" -#include "icalduration.h" -#include "icalperiod.h" - -typedef void icalvalue; - - - -void icalvalue_set_x(icalvalue* value, const char* v); -icalvalue* icalvalue_new_x(const char* v); -const char* icalvalue_get_x(icalvalue* value); - -icalvalue* icalvalue_new_recur (struct icalrecurrencetype v); -void icalvalue_set_recur(icalvalue* value, struct icalrecurrencetype v); -struct icalrecurrencetype icalvalue_get_recur(icalvalue* value); - -icalvalue* icalvalue_new_trigger (struct icaltriggertype v); -void icalvalue_set_trigger(icalvalue* value, struct icaltriggertype v); -struct icaltriggertype icalvalue_get_trigger(icalvalue* value); - -icalvalue* icalvalue_new_datetimeperiod (struct icaldatetimeperiodtype v); -void icalvalue_set_datetimeperiod(icalvalue* value, struct icaldatetimeperiodtype v); -struct icaldatetimeperiodtype icalvalue_get_datetimeperiod(icalvalue* value); - -/* Everything below this line is machine generated. Do not edit. */ diff --git a/libical/src/libical/icalduration.c b/libical/src/libical/icalduration.c deleted file mode 100644 index 18a74396f5..0000000000 --- a/libical/src/libical/icalduration.c +++ /dev/null @@ -1,320 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: icaltime.c - CREATOR: eric 02 June 2000 - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The Original Code is eric. The Initial Developer of the Original - Code is Eric Busboom - - - ======================================================================*/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "icalduration.h" - -#include <assert.h> -#include <string.h> -#include <stdlib.h> -#include <stdio.h> - -#ifdef ICAL_NO_LIBICAL -#define icalerror_set_errno(x) -#define icalerror_check_arg_rv(x,y) -#define icalerror_check_arg_re(x,y,z) -#else -#include "icalerror.h" -#include "icalmemory.h" -#endif - - - - -/* From Seth Alves, <alves@hungry.com> */ -struct icaldurationtype icaldurationtype_from_int(int t) -{ - struct icaldurationtype dur; - int used = 0; - - dur = icaldurationtype_null_duration(); - - if(t < 0){ - dur.is_neg = 1; - t = -t; - } - - dur.weeks = (t - used) / (60 * 60 * 24 * 7); - used += dur.weeks * (60 * 60 * 24 * 7); - dur.days = (t - used) / (60 * 60 * 24); - used += dur.days * (60 * 60 * 24); - dur.hours = (t - used) / (60 * 60); - used += dur.hours * (60 * 60); - dur.minutes = (t - used) / (60); - used += dur.minutes * (60); - dur.seconds = (t - used); - - return dur; -} - -#ifndef ICAL_NO_LIBICAL -#include "icalvalue.h" -struct icaldurationtype icaldurationtype_from_string(const char* str) -{ - - int i; - int begin_flag = 0; - int time_flag = 0; - int date_flag = 0; - int week_flag = 0; - int digits=-1; - int scan_size = -1; - int size = strlen(str); - char p; - struct icaldurationtype d; - - memset(&d, 0, sizeof(struct icaldurationtype)); - - for(i=0;i != size;i++){ - p = str[i]; - - switch(p) - { - case '-': { - if(i != 0 || begin_flag == 1) goto error; - - d.is_neg = 1; - break; - } - - case 'P': { - if (i != 0 && i !=1 ) goto error; - begin_flag = 1; - break; - } - - case 'T': { - time_flag = 1; - break; - } - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - { - - /* HACK. Skip any more digits if the l;ast one - read has not been assigned */ - if(digits != -1){ - break; - } - - if (begin_flag == 0) goto error; - /* Get all of the digits, not one at a time */ - scan_size = sscanf((char*)(str+i),"%d",&digits); - if(scan_size == 0) goto error; - break; - } - - case 'H': { - if (time_flag == 0||week_flag == 1||d.hours !=0||digits ==-1) - goto error; - d.hours = digits; digits = -1; - break; - } - case 'M': { - if (time_flag == 0||week_flag==1||d.minutes != 0||digits ==-1) - goto error; - d.minutes = digits; digits = -1; - break; - } - case 'S': { - if (time_flag == 0||week_flag==1||d.seconds!=0||digits ==-1) - goto error; - d.seconds = digits; digits = -1; - break; - } - case 'W': { - if (time_flag==1||date_flag==1||d.weeks!=0||digits ==-1) - goto error; - week_flag = 1; - d.weeks = digits; digits = -1; - break; - } - case 'D': { - if (time_flag==1||week_flag==1||d.days!=0||digits ==-1) - goto error; - date_flag = 1; - d.days = digits; digits = -1; - break; - } - default: { - goto error; - } - - } - } - - return d; - - - error: - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - memset(&d, 0, sizeof(struct icaldurationtype)); - return d; - -} - -#define TMP_BUF_SIZE 1024 -void append_duration_segment(char** buf, char** buf_ptr, size_t* buf_size, - char* sep, unsigned int value) { - - char temp[TMP_BUF_SIZE]; - - sprintf(temp,"%d",value); - - icalmemory_append_string(buf, buf_ptr, buf_size, temp); - icalmemory_append_string(buf, buf_ptr, buf_size, sep); - -} - -char* icaldurationtype_as_ical_string(struct icaldurationtype d) -{ - - char *buf, *output_line; - size_t buf_size = 256; - char* buf_ptr = 0; - int seconds; - - buf = (char*)icalmemory_new_buffer(buf_size); - buf_ptr = buf; - - - seconds = icaldurationtype_as_int(d); - - if(seconds !=0){ - - if(d.is_neg == 1){ - icalmemory_append_char(&buf, &buf_ptr, &buf_size, '-'); - } - - icalmemory_append_char(&buf, &buf_ptr, &buf_size, 'P'); - - if (d.weeks != 0 ) { - append_duration_segment(&buf, &buf_ptr, &buf_size, "W", d.weeks); - } - - if (d.days != 0 ) { - append_duration_segment(&buf, &buf_ptr, &buf_size, "D", d.days); - } - - if (d.hours != 0 || d.minutes != 0 || d.seconds != 0) { - - icalmemory_append_string(&buf, &buf_ptr, &buf_size, "T"); - - if (d.hours != 0 ) { - append_duration_segment(&buf, &buf_ptr, &buf_size, "H", d.hours); - } - if (d.minutes != 0 ) { - append_duration_segment(&buf, &buf_ptr, &buf_size, "M", - d.minutes); - } - if (d.seconds != 0 ) { - append_duration_segment(&buf, &buf_ptr, &buf_size, "S", - d.seconds); - } - - } - } else { - icalmemory_append_string(&buf, &buf_ptr, &buf_size, "PTS0"); - } - - output_line = icalmemory_tmp_copy(buf); - icalmemory_free_buffer(buf); - - return output_line; - -} - -#endif - - -/* From Russel Steinthal */ -int icaldurationtype_as_int(struct icaldurationtype dur) -{ - return (int)( (dur.seconds + - (60 * dur.minutes) + - (60 * 60 * dur.hours) + - (60 * 60 * 24 * dur.days) + - (60 * 60 * 24 * 7 * dur.weeks)) - * (dur.is_neg==1? -1 : 1) ) ; -} - -struct icaldurationtype icaldurationtype_null_duration() -{ - struct icaldurationtype d; - - memset(&d,0,sizeof(struct icaldurationtype)); - - return d; -} - -int icaldurationtype_is_null_duration(struct icaldurationtype d) -{ - if(icaldurationtype_as_int(d) == 0){ - return 1; - } else { - return 0; - } -} - - - -struct icaltimetype icaltime_add(struct icaltimetype t, - struct icaldurationtype d) -{ - int dt = icaldurationtype_as_int(d); - - t.second += dt; - - t = icaltime_normalize(t); - - return t; -} - -struct icaldurationtype icaltime_subtract(struct icaltimetype t1, - struct icaltimetype t2) -{ - - time_t t1t = icaltime_as_timet(t1); - time_t t2t = icaltime_as_timet(t2); - - return icaldurationtype_from_int(t1t-t2t); - - -} - diff --git a/libical/src/libical/icalduration.h b/libical/src/libical/icalduration.h deleted file mode 100644 index dd6e311f47..0000000000 --- a/libical/src/libical/icalduration.h +++ /dev/null @@ -1,60 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalduration.h - CREATOR: eric 26 Jan 2001 - - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The Original Code is eric. The Initial Developer of the Original - Code is Eric Busboom - - -======================================================================*/ - -#ifndef ICALDURATION_H -#define ICALDURATION_H - -#include "icaltime.h" - -struct icaldurationtype -{ - int is_neg; - unsigned int days; - unsigned int weeks; - unsigned int hours; - unsigned int minutes; - unsigned int seconds; -}; - -struct icaldurationtype icaldurationtype_from_int(int t); -struct icaldurationtype icaldurationtype_from_string(const char*); -int icaldurationtype_as_int(struct icaldurationtype duration); -char* icaldurationtype_as_ical_string(struct icaldurationtype d); -struct icaldurationtype icaldurationtype_null_duration(); -int icaldurationtype_is_null_duration(struct icaldurationtype d); - -struct icaltimetype icaltime_add(struct icaltimetype t, - struct icaldurationtype d); - -struct icaldurationtype icaltime_subtract(struct icaltimetype t1, - struct icaltimetype t2); - -#endif /* !ICALDURATION_H */ - - - diff --git a/libical/src/libical/icalenums.c b/libical/src/libical/icalenums.c deleted file mode 100644 index 6751933c3e..0000000000 --- a/libical/src/libical/icalenums.c +++ /dev/null @@ -1,135 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalenum.c - CREATOR: eric 29 April 1999 - - $Id$ - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icalenum.c - - ======================================================================*/ - - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "icalenums.h" - -#include <stdio.h> /* For fprintf */ -#include <stdio.h> /* For stderr */ -#include <string.h> /* For strncmp */ -#include <assert.h> - - - -struct { - enum icalrequeststatus kind; - int major; - int minor; - const char* str; -} request_status_map[] = { - {ICAL_2_0_SUCCESS_STATUS, 2,0,"Success."}, - {ICAL_2_1_FALLBACK_STATUS, 2,1,"Success but fallback taken on one or more property values."}, - {ICAL_2_2_IGPROP_STATUS, 2,2,"Success, invalid property ignored."}, - {ICAL_2_3_IGPARAM_STATUS, 2,3,"Success, invalid property parameter ignored."}, - {ICAL_2_4_IGXPROP_STATUS, 2,4,"Success, unknown non-standard property ignored."}, - {ICAL_2_5_IGXPARAM_STATUS, 2,5,"Success, unknown non standard property value ignored."}, - {ICAL_2_6_IGCOMP_STATUS, 2,6,"Success, invalid calendar component ignored."}, - {ICAL_2_7_FORWARD_STATUS, 2,7,"Success, request forwarded to Calendar User."}, - {ICAL_2_8_ONEEVENT_STATUS, 2,8,"Success, repeating event ignored. Scheduled as a single component."}, - {ICAL_2_9_TRUNC_STATUS, 2,9,"Success, truncated end date time to date boundary."}, - {ICAL_2_10_ONETODO_STATUS, 2,10,"Success, repeating VTODO ignored. Scheduled as a single VTODO."}, - {ICAL_2_11_TRUNCRRULE_STATUS, 2,11,"Success, unbounded RRULE clipped at some finite number of instances "}, - {ICAL_3_0_INVPROPNAME_STATUS, 3,0,"Invalid property name."}, - {ICAL_3_1_INVPROPVAL_STATUS, 3,1,"Invalid property value."}, - {ICAL_3_2_INVPARAM_STATUS, 3,2,"Invalid property parameter."}, - {ICAL_3_3_INVPARAMVAL_STATUS, 3,3,"Invalid property parameter value."}, - {ICAL_3_4_INVCOMP_STATUS, 3,4,"Invalid calendar component."}, - {ICAL_3_5_INVTIME_STATUS, 3,5,"Invalid date or time."}, - {ICAL_3_6_INVRULE_STATUS, 3,6,"Invalid rule."}, - {ICAL_3_7_INVCU_STATUS, 3,7,"Invalid Calendar User."}, - {ICAL_3_8_NOAUTH_STATUS, 3,8,"No authority."}, - {ICAL_3_9_BADVERSION_STATUS, 3,9,"Unsupported version."}, - {ICAL_3_10_TOOBIG_STATUS, 3,10,"Request entity too large."}, - {ICAL_3_11_MISSREQCOMP_STATUS, 3,11,"Required component or property missing."}, - {ICAL_3_12_UNKCOMP_STATUS, 3,12,"Unknown component or property found."}, - {ICAL_3_13_BADCOMP_STATUS, 3,13,"Unsupported component or property found"}, - {ICAL_3_14_NOCAP_STATUS, 3,14,"Unsupported capability."}, - {ICAL_4_0_BUSY_STATUS, 4,0,"Event conflict. Date/time is busy."}, - {ICAL_5_0_MAYBE_STATUS, 5,0,"Request MAY supported."}, - {ICAL_5_1_UNAVAIL_STATUS, 5,1,"Service unavailable."}, - {ICAL_5_2_NOSERVICE_STATUS, 5,2,"Invalid calendar service."}, - {ICAL_5_3_NOSCHED_STATUS, 5,3,"No scheduling support for user."}, - {ICAL_UNKNOWN_STATUS, 0,0,"Error: Unknown request status"} -}; - - -const char* icalenum_reqstat_desc(icalrequeststatus stat) -{ - - int i; - - for (i=0; request_status_map[i].kind != ICAL_UNKNOWN_STATUS; i++) { - if ( request_status_map[i].kind == stat) { - return request_status_map[i].str; - } - } - - return 0; -} - - -short icalenum_reqstat_major(icalrequeststatus stat) -{ - int i; - - for (i=0; request_status_map[i].kind != ICAL_UNKNOWN_STATUS; i++) { - if ( request_status_map[i].kind == stat) { - return request_status_map[i].major; - } - } - return -1; -} - -short icalenum_reqstat_minor(icalrequeststatus stat) -{ - int i; - - for (i=0; request_status_map[i].kind != ICAL_UNKNOWN_STATUS; i++) { - if ( request_status_map[i].kind == stat) { - return request_status_map[i].minor; - } - } - return -1; -} - - -icalrequeststatus icalenum_num_to_reqstat(short major, short minor) -{ - int i; - - for (i=0; request_status_map[i].kind != ICAL_UNKNOWN_STATUS; i++) { - if ( request_status_map[i].major == major && request_status_map[i].minor == minor) { - return request_status_map[i].kind; - } - } - return 0; -} - - - diff --git a/libical/src/libical/icalenums.h b/libical/src/libical/icalenums.h deleted file mode 100644 index 21031dd20e..0000000000 --- a/libical/src/libical/icalenums.h +++ /dev/null @@ -1,157 +0,0 @@ - -/* -*- Mode: C -*-*/ -/*====================================================================== - FILE: icalenums.h - - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icalenums.h - - Contributions from: - Graham Davison (g.m.davison@computer.org) - -======================================================================*/ - -#ifndef ICALENUMS_H -#define ICALENUMS_H - - - -/*********************************************************************** - * Component enumerations -**********************************************************************/ - -typedef enum icalcomponent_kind { - ICAL_NO_COMPONENT, - ICAL_ANY_COMPONENT, /* Used to select all components*/ - ICAL_XROOT_COMPONENT, - ICAL_XATTACH_COMPONENT, /* MIME attached data, returned by parser. */ - ICAL_VEVENT_COMPONENT, - ICAL_VTODO_COMPONENT, - ICAL_VJOURNAL_COMPONENT, - ICAL_VCALENDAR_COMPONENT, - ICAL_VFREEBUSY_COMPONENT, - ICAL_VALARM_COMPONENT, - ICAL_XAUDIOALARM_COMPONENT, - ICAL_XDISPLAYALARM_COMPONENT, - ICAL_XEMAILALARM_COMPONENT, - ICAL_XPROCEDUREALARM_COMPONENT, - ICAL_VTIMEZONE_COMPONENT, - ICAL_XSTANDARD_COMPONENT, - ICAL_XDAYLIGHT_COMPONENT, - ICAL_X_COMPONENT, - ICAL_VSCHEDULE_COMPONENT, - ICAL_VQUERY_COMPONENT, - ICAL_VCAR_COMPONENT, - ICAL_VCOMMAND_COMPONENT, - ICAL_XLICINVALID_COMPONENT, - ICAL_XLICMIMEPART_COMPONENT /* a non-stardard component that mirrors - structure of MIME data */ - -} icalcomponent_kind; - - - -/*********************************************************************** - * Request Status codes - **********************************************************************/ - -typedef enum icalrequeststatus { - ICAL_UNKNOWN_STATUS, - ICAL_2_0_SUCCESS_STATUS, - ICAL_2_1_FALLBACK_STATUS, - ICAL_2_2_IGPROP_STATUS, - ICAL_2_3_IGPARAM_STATUS, - ICAL_2_4_IGXPROP_STATUS, - ICAL_2_5_IGXPARAM_STATUS, - ICAL_2_6_IGCOMP_STATUS, - ICAL_2_7_FORWARD_STATUS, - ICAL_2_8_ONEEVENT_STATUS, - ICAL_2_9_TRUNC_STATUS, - ICAL_2_10_ONETODO_STATUS, - ICAL_2_11_TRUNCRRULE_STATUS, - ICAL_3_0_INVPROPNAME_STATUS, - ICAL_3_1_INVPROPVAL_STATUS, - ICAL_3_2_INVPARAM_STATUS, - ICAL_3_3_INVPARAMVAL_STATUS, - ICAL_3_4_INVCOMP_STATUS, - ICAL_3_5_INVTIME_STATUS, - ICAL_3_6_INVRULE_STATUS, - ICAL_3_7_INVCU_STATUS, - ICAL_3_8_NOAUTH_STATUS, - ICAL_3_9_BADVERSION_STATUS, - ICAL_3_10_TOOBIG_STATUS, - ICAL_3_11_MISSREQCOMP_STATUS, - ICAL_3_12_UNKCOMP_STATUS, - ICAL_3_13_BADCOMP_STATUS, - ICAL_3_14_NOCAP_STATUS, - ICAL_4_0_BUSY_STATUS, - ICAL_5_0_MAYBE_STATUS, - ICAL_5_1_UNAVAIL_STATUS, - ICAL_5_2_NOSERVICE_STATUS, - ICAL_5_3_NOSCHED_STATUS -} icalrequeststatus; - - -const char* icalenum_reqstat_desc(icalrequeststatus stat); -short icalenum_reqstat_major(icalrequeststatus stat); -short icalenum_reqstat_minor(icalrequeststatus stat); -icalrequeststatus icalenum_num_to_reqstat(short major, short minor); - -/*********************************************************************** - * Conversion functions -**********************************************************************/ - - -/* Thse routines used to be in icalenums.c, but were moved into the - icalproperty, icalparameter, icalvalue, or icalcomponent modules. */ - -/* const char* icalproperty_kind_to_string(icalproperty_kind kind);*/ -#define icalenum_property_kind_to_string(x) icalproperty_kind_to_string(x) - -/*icalproperty_kind icalproperty_string_to_kind(const char* string)*/ -#define icalenum_string_to_property_kind(x) icalproperty_string_to_kind(x) - -/*icalvalue_kind icalproperty_kind_to_value_kind(icalproperty_kind kind);*/ -#define icalenum_property_kind_to_value_kind(x) icalproperty_kind_to_value_kind(x) - -/*const char* icalenum_method_to_string(icalproperty_method);*/ -#define icalenum_method_to_string(x) icalproperty_method_to_string(x) - -/*icalproperty_method icalenum_string_to_method(const char* string);*/ -#define icalenum_string_to_method(x) icalproperty_string_to_method(x) - -/*const char* icalenum_status_to_string(icalproperty_status);*/ -#define icalenum_status_to_string(x) icalproperty_status_to_string(x) - -/*icalproperty_status icalenum_string_to_status(const char* string);*/ -#define icalenum_string_to_status(x) icalproperty_string_to_status(x) - -/*icalvalue_kind icalenum_string_to_value_kind(const char* str);*/ -#define icalenum_string_to_value_kind(x) icalvalue_string_to_kind(x) - -/*const char* icalenum_value_kind_to_string(icalvalue_kind kind);*/ -#define icalenum_value_kind_to_string(x) icalvalue_kind_to_string(x) - -/*const char* icalenum_component_kind_to_string(icalcomponent_kind kind);*/ -#define icalenum_component_kind_to_string(x) icalcomponent_kind_to_string(x) - -/*icalcomponent_kind icalenum_string_to_component_kind(const char* string);*/ -#define icalenum_string_to_component_kind(x) icalcomponent_string_to_kind(x) - - -#endif /* !ICALENUMS_H */ - diff --git a/libical/src/libical/icalerror.c b/libical/src/libical/icalerror.c deleted file mode 100644 index 05191defb9..0000000000 --- a/libical/src/libical/icalerror.c +++ /dev/null @@ -1,194 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: icalerror.c - CREATOR: eric 16 May 1999 - - $Id$ - $Locker$ - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icalerror.c - - ======================================================================*/ - - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "icalerror.h" - -icalerrorenum icalerrno; - -int foo; -void icalerror_stop_here(void) -{ - foo++; /* Keep optimizers from removing routine */ -} - -void icalerror_crash_here(void) -{ - int *p=0; - *p = 1; - - assert( *p); -} - - -void icalerror_clear_errno() { - - icalerrno = ICAL_NO_ERROR; -} - -#ifdef ICAL_ERRORS_ARE_FATAL -int icalerror_errors_are_fatal = 1; -#else -int icalerror_errors_are_fatal = 0; -#endif - -struct icalerror_state { - icalerrorenum error; - icalerrorstate state; -}; - -struct icalerror_state error_state_map[] = -{ - { ICAL_BADARG_ERROR,ICAL_ERROR_DEFAULT}, - { ICAL_NEWFAILED_ERROR,ICAL_ERROR_DEFAULT}, - { ICAL_MALFORMEDDATA_ERROR,ICAL_ERROR_DEFAULT}, - { ICAL_PARSE_ERROR,ICAL_ERROR_DEFAULT}, - { ICAL_INTERNAL_ERROR,ICAL_ERROR_DEFAULT}, - { ICAL_FILE_ERROR,ICAL_ERROR_DEFAULT}, - { ICAL_USAGE_ERROR,ICAL_ERROR_DEFAULT}, - { ICAL_UNIMPLEMENTED_ERROR,ICAL_ERROR_DEFAULT}, - { ICAL_UNKNOWN_ERROR,ICAL_ERROR_DEFAULT}, - { ICAL_NO_ERROR,ICAL_ERROR_DEFAULT} - -}; - -struct icalerror_string_map { - const char* str; - icalerrorenum error; - char name[160]; -}; - -static struct icalerror_string_map string_map[] = -{ - {"BADARG",ICAL_BADARG_ERROR,"BADARG: Bad argument to function"}, - { "NEWFAILED",ICAL_NEWFAILED_ERROR,"NEWFAILED: Failed to create a new object via a *_new() routine"}, - {"MALFORMEDDATA",ICAL_MALFORMEDDATA_ERROR,"MALFORMEDDATA: An input string was not correctly formed or a component has missing or extra properties"}, - { "PARSE",ICAL_PARSE_ERROR,"PARSE: Failed to parse a part of an iCal component"}, - {"INTERNAL",ICAL_INTERNAL_ERROR,"INTERNAL: Random internal error. This indicates an error in the library code, not an error in use"}, - { "FILE",ICAL_FILE_ERROR,"FILE: An operation on a file failed. Check errno for more detail."}, - { "USAGE",ICAL_USAGE_ERROR,"USAGE: Failed to propertyl sequence calls to a set of interfaces"}, - { "UNIMPLEMENTED",ICAL_UNIMPLEMENTED_ERROR,"UNIMPLEMENTED: This feature has not been implemented"}, - { "NO",ICAL_NO_ERROR,"NO: No error"}, - {"UNKNOWN",ICAL_UNKNOWN_ERROR,"UNKNOWN: Unknown error type -- icalerror_strerror() was probably given bad input"} -}; - - -icalerrorenum icalerror_error_from_string(const char* str){ - - icalerrorenum e; - int i = 0; - - for( i = 0; string_map[i].error != ICAL_NO_ERROR; i++){ - if (strcmp(string_map[i].str,str) == 0){ - e = string_map[i].error; - } - } - - return e; -} - -icalerrorstate icalerror_supress(const char* error){ - - icalerrorenum e = icalerror_error_from_string(error); - icalerrorstate es; - - if (e == ICAL_NO_ERROR){ - return ICAL_ERROR_UNKNOWN; - } - - - es = icalerror_get_error_state(e); - icalerror_set_error_state(e,ICAL_ERROR_NONFATAL); - - return es; -} - -char* icalerror_perror() -{ - return icalerror_strerror(icalerrno); -} - -void icalerror_restore(const char* error, icalerrorstate es){ - - - icalerrorenum e = icalerror_error_from_string(error); - - if (e != ICAL_NO_ERROR){ - icalerror_set_error_state(e,es); - } - -} - - - -void icalerror_set_error_state( icalerrorenum error, - icalerrorstate state) -{ - int i; - - for(i = ICAL_BADARG_ERROR; error_state_map[i].error!= ICAL_NO_ERROR;i++){ - if(error_state_map[i].error == error){ - error_state_map[i].state = state; - } - } -} - -icalerrorstate icalerror_get_error_state( icalerrorenum error) -{ - int i; - - for(i = ICAL_BADARG_ERROR; error_state_map[i].error!= ICAL_NO_ERROR;i++){ - if(error_state_map[i].error == error){ - return error_state_map[i].state; - } - } - - return ICAL_ERROR_UNKNOWN; -} - - - - -char* icalerror_strerror(icalerrorenum e) { - - int i; - - for (i=0; string_map[i].error != ICAL_UNKNOWN_ERROR; i++) { - if (string_map[i].error == e) { - return string_map[i].name; - } - } - - return string_map[i].name; /* Return string for ICAL_UNKNOWN_ERROR*/ - -} - - - diff --git a/libical/src/libical/icalerror.h b/libical/src/libical/icalerror.h deleted file mode 100644 index 790fa90f22..0000000000 --- a/libical/src/libical/icalerror.h +++ /dev/null @@ -1,153 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalerror.h - CREATOR: eric 09 May 1999 - - $Id$ - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icalerror.h - -======================================================================*/ - - -#ifndef ICALERROR_H -#define ICALERROR_H - -#include <assert.h> -#include <stdio.h> /* For icalerror_warn() */ - - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - - -/* This routine is called before any error is triggered. It is called - by icalerror_set_errno, so it does not appear in all of the macros - below */ -void icalerror_stop_here(void); - -void icalerror_crash_here(void); - -typedef enum icalerrorenum { - - ICAL_BADARG_ERROR, - ICAL_NEWFAILED_ERROR, - ICAL_ALLOCATION_ERROR, - ICAL_MALFORMEDDATA_ERROR, - ICAL_PARSE_ERROR, - ICAL_INTERNAL_ERROR, /* Like assert --internal consist. prob */ - ICAL_FILE_ERROR, - ICAL_USAGE_ERROR, - ICAL_UNIMPLEMENTED_ERROR, - ICAL_UNKNOWN_ERROR, /* Used for problems in input to icalerror_strerror()*/ - ICAL_NO_ERROR - -} icalerrorenum; - -/* The libical error enumeration, like errno*/ -extern icalerrorenum icalerrno; - -/* If true, libicl aborts after a call to icalerror_set_error*/ -extern int icalerror_errors_are_fatal; - -/* Warning messages */ - -#ifdef __GNUC__ca -#define icalerror_warn(message) {fprintf(stderr,"%s(), %s:%d: %s\n",__FUNCTION__,__FILE__,__LINE__,message);} -#else /* __GNU_C__ */ -#define icalerror_warn(message) {fprintf(stderr,"%s:%d: %s\n",__FILE__,__LINE__,message);} -#endif /* __GNU_C__ */ - - -void icalerror_clear_errno(void); -void _icalerror_set_errno(icalerrorenum); - -/* Make an individual error fatal or non-fatal. */ -typedef enum icalerrorstate { - ICAL_ERROR_FATAL, /* Not fata */ - ICAL_ERROR_NONFATAL, /* Fatal */ - ICAL_ERROR_DEFAULT, /* Use the value of icalerror_errors_are_fatal*/ - ICAL_ERROR_UNKNOWN /* Asked state for an unknown error type */ -} icalerrorstate ; - -char* icalerror_strerror(icalerrorenum e); -char* icalerror_perror(); -void icalerror_set_error_state( icalerrorenum error, icalerrorstate); -icalerrorstate icalerror_get_error_state( icalerrorenum error); - - -#define icalerror_set_errno(x) \ -icalerrno = x; \ -if(icalerror_get_error_state(x)==ICAL_ERROR_FATAL || \ - (icalerror_get_error_state(x)==ICAL_ERROR_DEFAULT && \ - icalerror_errors_are_fatal == 1 )){ \ - icalerror_warn(icalerror_strerror(x)); \ - assert(0); \ -} - - -#ifdef ICAL_ERRORS_ARE_FATAL -#undef NDEBUG -#endif - -#define icalerror_check_value_type(value,type); -#define icalerror_check_property_type(value,type); -#define icalerror_check_parameter_type(value,type); -#define icalerror_check_component_type(value,type); - -/* Assert with a message */ -#ifdef ICAL_ERRORS_ARE_FATAL - -#ifdef __GNUC__ -#define icalerror_assert(test,message) if(!(test)){fprintf(stderr,"%s(), %s:%d: %s\n",__FUNCTION__,__FILE__,__LINE__,message);icalerror_stop_here(); abort();} -#else /*__GNUC__*/ -#define icalerror_assert(test,message) if(!(test)){fprintf(stderr,"%s:%d: %s\n",__FILE__,__LINE__,message);icalerror_stop_here(); abort();} -#endif /*__GNUC__*/ - -#else /* ICAL_ERRORS_ARE_FATAL */ -#define icalerror_assert(test,message) -#endif /* ICAL_ERRORS_ARE_FATAL */ - -/* Check & abort if check fails */ -#define icalerror_check_arg(test,arg) if(!(test)) { icalerror_set_errno(ICAL_BADARG_ERROR); } - -/* Check & return void if check fails*/ -#define icalerror_check_arg_rv(test,arg) if(!(test)) {icalerror_set_errno(ICAL_BADARG_ERROR); return; } - -/* Check & return 0 if check fails*/ -#define icalerror_check_arg_rz(test,arg) if(!(test)) { icalerror_set_errno(ICAL_BADARG_ERROR); return 0;} - -/* Check & return an error if check fails*/ -#define icalerror_check_arg_re(test,arg,error) if(!(test)) { icalerror_stop_here(); assert(0); return error;} - -/* Check & return something*/ -#define icalerror_check_arg_rx(test,arg,x) if(!(test)) { icalerror_set_errno(ICAL_BADARG_ERROR); return x;} - - - -/* String interfaces to set an error to NONFATAL and restore it to its - original value */ - -icalerrorstate icalerror_supress(const char* error); -void icalerror_restore(const char* error, icalerrorstate es); - - -#endif /* !ICALERROR_H */ - - - diff --git a/libical/src/libical/icallangbind.c b/libical/src/libical/icallangbind.c deleted file mode 100644 index 866eb700cc..0000000000 --- a/libical/src/libical/icallangbind.c +++ /dev/null @@ -1,272 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: icallangbind.c - CREATOR: eric 15 dec 2000 - - DESCRIPTION: - - $Id$ - $Locker$ - - (C) COPYRIGHT 1999 Eric Busboom - http://www.softwarestudio.org - - This package is free software and is provided "as is" without - express or implied warranty. It may be used, redistributed and/or - modified under the same terms as perl itself. ( Either the Artistic - License or the GPL. ) - - ======================================================================*/ - -#include "icalcomponent.h" -#include "icalproperty.h" -#include "icalerror.h" -#include "icalmemory.h" -#include <malloc.h> -#include <string.h> - -int* icallangbind_new_array(int size){ - int* p = (int*)malloc(size*sizeof(int)); - return p; /* Caller handles failures */ -} - -void icallangbind_free_array(int* array){ - free(array); -} - -int icallangbind_access_array(int* array, int index) { - return array[index]; -} - - - -/* LIke icalcomponent_get_first_component, buut takes a string for the - kind and can iterate over X properties as if each X name was a - seperate kind */ -icalproperty* icallangbind_get_first_property(icalcomponent *c, - const char* prop) -{ - icalproperty_kind kind = icalproperty_string_to_kind(prop); - icalproperty *p; - - if (kind == ICAL_NO_PROPERTY){ - return 0; - } - - if(kind == ICAL_X_PROPERTY){ - for(p = icalcomponent_get_first_property(c,kind); - p !=0; - p = icalcomponent_get_next_property(c,kind)){ - - if(strcmp(icalproperty_get_x_name(p),prop) == 0){ - return p; - } - } - } else { - p=icalcomponent_get_first_property(c,kind); - - return p; - } - - return 0; - -} - -icalproperty* icallangbind_get_next_property(icalcomponent *c, - const char* prop) -{ - icalproperty_kind kind = icalenum_string_to_property_kind(prop); - icalproperty *p; - - if (kind == ICAL_NO_PROPERTY){ - return 0; - } - - if(kind == ICAL_X_PROPERTY){ - for(p = icalcomponent_get_next_property(c,kind); - p !=0; - p = icalcomponent_get_next_property(c,kind)){ - - if(strcmp(icalproperty_get_x_name(p),prop) == 0){ - return p; - } - } - } else { - p=icalcomponent_get_next_property(c,kind); - - return p; - } - - return 0; - -} - - -icalcomponent* icallangbind_get_first_component(icalcomponent *c, - const char* comp) -{ - icalcomponent_kind kind = icalenum_string_to_component_kind(comp); - - if (kind == ICAL_NO_COMPONENT){ - return 0; - } - return icalcomponent_get_first_component(c,kind); -} - -icalcomponent* icallangbind_get_next_component(icalcomponent *c, - const char* comp) -{ - icalcomponent_kind kind = icalenum_string_to_component_kind(comp); - - if (kind == ICAL_NO_COMPONENT){ - return 0; - } - return icalcomponent_get_next_component(c,kind); -} - - -#define APPENDS(x) icalmemory_append_string(&buf, &buf_ptr, &buf_size, x); - -#define APPENDC(x) icalmemory_append_char(&buf, &buf_ptr, &buf_size, x); - -const char* icallangbind_property_eval_string(icalproperty* prop, char* sep) -{ - char tmp[25]; - size_t buf_size = 1024; - char* buf = icalmemory_new_buffer(buf_size); - char* buf_ptr = buf; - icalparameter *param; - - icalvalue* value; - - if( prop == 0){ - return 0; - } - - APPENDS("{ "); - - value = icalproperty_get_value(prop); - - APPENDS(" 'name' "); - APPENDS(sep); - APPENDC('\''); - APPENDS(icalenum_property_kind_to_string(icalproperty_isa(prop))); - APPENDC('\''); - - if(value){ - APPENDS(", 'value_type' "); - APPENDS(sep); - APPENDC('\''); - APPENDS(icalenum_value_kind_to_string(icalvalue_isa(value))); - APPENDC('\''); - } - - APPENDS(", 'pid' "); - APPENDS(sep); - APPENDC('\''); - snprintf(tmp,25,"%p",prop); - APPENDS(tmp); - APPENDC('\''); - - - if(value){ - switch (icalvalue_isa(value)){ - - case ICAL_ATTACH_VALUE: - case ICAL_BINARY_VALUE: - case ICAL_NO_VALUE: { - icalerror_set_errno(ICAL_INTERNAL_ERROR); - break; - } - - default: - { - const char* str = icalvalue_as_ical_string(value); - char* copy = (char*) malloc(strlen(str)+1); - - const char *i; - char *j; - - if(copy ==0){ - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - break; - } - /* Remove any newlines */ - - for(j=copy, i = str; *i != 0; j++,i++){ - if(*i=='\n'){ - i++; - } - *j = *i; - } - - *j = 0; - - APPENDS(", 'value'"); - APPENDS(sep); - APPENDC('\''); - APPENDS(copy); - APPENDC('\''); - - free(copy); - break; - - } - } - } - - /* Add Parameters */ - - for(param = icalproperty_get_first_parameter(prop,ICAL_ANY_PARAMETER); - param != 0; - param = icalproperty_get_next_parameter(prop,ICAL_ANY_PARAMETER)){ - - const char* str = icalparameter_as_ical_string(param); - char *copy = icalmemory_tmp_copy(str); - char *v; - - if(copy == 0){ - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - continue; - } - - v = strchr(copy,'='); - - - if(v == 0){ - continue; - } - - *v = 0; - - v++; - - APPENDS(", "); - APPENDC('\''); - APPENDS(copy); - APPENDC('\''); - APPENDS(sep); - APPENDC('\''); - APPENDS(v); - APPENDC('\''); - - } - - - APPENDC('}'); - - icalmemory_add_tmp_buffer(buf); - return buf; - -} - -#include "fcntl.h" -int icallangbind_string_to_open_flag(const char* str) -{ - if (strcmp(str,"r") == 0) {return O_RDONLY;} - else if (strcmp(str,"r+") == 0) {return O_RDWR;} - else if (strcmp(str,"w") == 0) {return O_WRONLY;} - else if (strcmp(str,"a") == 0) {return O_WRONLY|O_APPEND;} - else return -1; -} - diff --git a/libical/src/libical/icallangbind.h b/libical/src/libical/icallangbind.h deleted file mode 100644 index 2ed50038eb..0000000000 --- a/libical/src/libical/icallangbind.h +++ /dev/null @@ -1,49 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: icallangbind.h - CREATOR: eric 25 jan 2001 - - DESCRIPTION: - - $Id$ - $Locker$ - - (C) COPYRIGHT 1999 Eric Busboom - http://www.softwarestudio.org - - This package is free software and is provided "as is" without - express or implied warranty. It may be used, redistributed and/or - modified under the same terms as perl itself. ( Either the Artistic - License or the GPL. ) - - ======================================================================*/ - -#ifndef __ICALLANGBIND_H__ -#define __ICALLANGBIND_H__ - -int* icallangbind_new_array(int size); -void icallangbind_free_array(int* array); -int icallangbind_access_array(int* array, int index); -icalproperty* icallangbind_get_property(icalcomponent *c, int n, const char* prop); -const char* icallangbind_get_property_val(icalproperty* p); -const char* icallangbind_get_parameter(icalproperty *p, const char* parameter); -icalcomponent* icallangbind_get_component(icalcomponent *c, const char* comp); - -icalproperty* icallangbind_get_first_property(icalcomponent *c, - const char* prop); - -icalproperty* icallangbind_get_next_property(icalcomponent *c, - const char* prop); - -icalcomponent* icallangbind_get_first_component(icalcomponent *c, - const char* comp); - -icalcomponent* icallangbind_get_next_component(icalcomponent *c, - const char* comp); - - -const char* icallangbind_property_eval_string(icalproperty* prop, char* sep); - - -int icallangbind_string_to_open_flag(const char* str); -#endif /*__ICALLANGBIND_H__*/ diff --git a/libical/src/libical/icallexer.l b/libical/src/libical/icallexer.l deleted file mode 100644 index d76a7938e3..0000000000 --- a/libical/src/libical/icallexer.l +++ /dev/null @@ -1,161 +0,0 @@ -%{ -/* -*- Mode: C -*- - ====================================================================== - FILE: icallexer.l - CREATOR: eric 10 June 1999 - - DESCRIPTION: - - $Id: icallexer.l,v 1.8 2001/01/23 20:22:33 jpr Exp $ - $Locker: $ - - (C) COPYRIGHT 1999 Eric Busboom - http://www.softwarestudio.org - - The contents of this file are subject to the Mozilla Public License - Version 1.0 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and - limitations under the License. - - The original author is Eric Busboom - The original code is icalitip.y - - - - ======================================================================*/ -#include "icalparser.h" -#include "icalenums.h" -#include "icalmemory.h" -#include "assert.h" -#include "icalyacc.h" - -#include <string.h> /* For strdup() */ - -int icalparser_flex_input(char* buf, int max_size); -void icalparser_clear_flex_input(void); - - -#define ICAL_MAX_STR_CONST 1024 - -#undef YY_INPUT -#define YY_INPUT(b,r,ms) ( r= icalparser_flex_input(b,ms)) -#undef yywrap - -#undef YY_FATAL_ERROR -#define YY_FATAL_ERROR(msg) ical_yyerror(msg) - -icalvalue_kind value_kind=ICAL_NO_VALUE; -void set_parser_value_state(icalvalue_kind kind); -extern int yydebug; - -void ical_yyerror(char *s); - -void init_str_buf(void); - -int last_state; - -char *str_buf; -char *str_buf_p; -size_t buf_sz; /* = ICAL_MAX_STR_CONST;*/ - -%} - -crlf \x0D?\x0A -space [ ] -qsafechar [^\x00-\x1F\"] -safechar [^\x00-\x1F\"\:\;\,] -tsafechar [\x20-\x21\x23-\x2B\x2D-\x39\x3C-\x5B\x5D-\x7E] -valuechar [^\x00-\x08\x10-\x1F] -xname X-[a-zA-Z0-9\-]+ -xname2 [a-zA-Z0-9\-\ ] -paramtext {safechar}+ -value {valuechar}+ -quotedstring \"{qsafechar}+\" -digit [0-9] - -%array /* Make yytext an array. Slow, but handy. HACK */ - -%option caseless - -%s quoted_string -%s binary_value boolean_value uri_value time_value duration_value number_value period_value recur_value text_value utcoffset_value -%s enum_param_value string_param_value stringlist_param_value keyword line_start component seperator parameter end_of_value paramtext - - - -%% - -%{ -%} - - -<time_value>{ -{digit}+ { ical_yylval.v_string =icalmemory_tmp_copy(yytext) ; - return DIGITS; } -T { return TIME_CHAR; } -Z { return UTC_CHAR; } -[\/\+\-PWHMSD] { return yytext[0]; } -{crlf} { return EOL;} - -} - -<utcoffset_value>{ -{crlf} { return EOL;} -\-|\+ { return yytext[0]; } -{digit}{digit} { ical_yylval.v_int=atoi(yytext); return INTNUMBER; } - -} - -<enum_param_value>{ -. { return CHARACTER; } -{crlf} { return EOL;} - -} - -<seperator>{ -, { BEGIN(last_state); return COMMA; } -} - - -%% - -int yywrap() -{ - return 1; -} - - -void set_parser_value_state(icalvalue_kind kind) -{ - - switch (kind){ - - case ICAL_UTCOFFSET_VALUE: - {BEGIN(utcoffset_value);break;} - - case ICAL_DATETIMEPERIOD_VALUE: - case ICAL_DURATION_VALUE: - case ICAL_PERIOD_VALUE: - {BEGIN(time_value);break;} - - default: - { - assert(1==0); - } - } -} - -void init_str_buf(void) -{ - str_buf = icalmemory_tmp_buffer(ICAL_MAX_STR_CONST); - str_buf_p = str_buf; - buf_sz = ICAL_MAX_STR_CONST; - - -} - diff --git a/libical/src/libical/icalmemory.c b/libical/src/libical/icalmemory.c deleted file mode 100644 index 297ead8826..0000000000 --- a/libical/src/libical/icalmemory.c +++ /dev/null @@ -1,287 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: icalmemory.c - CREATOR: eric 30 June 1999 - - $Id$ - $Locker$ - - The contents of this file are subject to the Mozilla Public License - Version 1.0 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and - limitations under the License. - - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The Original Code is icalmemory.h - - ======================================================================*/ - -/* libical often passes strings back to the caller. To make these - * interfaces simple, I did not want the caller to have to pass in a - * memory buffer, but having libical pass out newly allocated memory - * makes it difficult to de-allocate the memory. - * - * The ring buffer in this scheme makes it possible for libical to pass - * out references to memory which the caller does not own, and be able - * to de-allocate the memory later. The ring allows libical to have - * several buffers active simultaneously, which is handy when creating - * string representations of components. */ - -#define ICALMEMORY_C - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#ifdef DMALLOC -#include "dmalloc.h" -#endif - -#include "icalmemory.h" -#include "icalerror.h" - -#include <stdio.h> /* for printf (debugging) */ -#include <stdlib.h> /* for malloc, realloc */ -#include <string.h> /* for memset(), strdup */ - -#define BUFFER_RING_SIZE 25 -#define MIN_BUFFER_SIZE 200 - -void icalmemory_free_tmp_buffer (void* buf); - - -/* HACK. Not threadsafe */ -void* buffer_ring[BUFFER_RING_SIZE]; -int buffer_pos = -1; -int initialized = 0; - -/* Add an existing buffer to the buffer ring */ -void icalmemory_add_tmp_buffer(void* buf) -{ - /* I don't think I need this -- I think static arrays are - initialized to 0 as a standard part of C, but I am not sure. */ - if (initialized == 0){ - int i; - for(i=0; i<BUFFER_RING_SIZE; i++){ - buffer_ring[i] = 0; - } - initialized = 1; - } - - /* Wrap around the ring */ - if(++buffer_pos == BUFFER_RING_SIZE){ - buffer_pos = 0; - } - - /* Free buffers as their slots are overwritten */ - if ( buffer_ring[buffer_pos] != 0){ - free( buffer_ring[buffer_pos]); - buffer_ring[buffer_pos] = 0; - } - - /* Assign the buffer to a slot */ - buffer_ring[buffer_pos] = buf; -} - -/* Create a new temporary buffer on the ring. Libical owns these and - wil deallocate them. */ -void* -icalmemory_tmp_buffer (size_t size) -{ - char *buf; - - if (size < MIN_BUFFER_SIZE){ - size = MIN_BUFFER_SIZE; - } - - buf = (void*)malloc(size); - - if( buf == 0){ - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - memset(buf,0,size); - - icalmemory_add_tmp_buffer(buf); - - return buf; -} - -void icalmemory_free_ring() -{ - - int i; - for(i=0; i<BUFFER_RING_SIZE; i++){ - if ( buffer_ring[i] != 0){ - free( buffer_ring[i]); - } - buffer_ring[i] = 0; - } - - initialized = 1; - -} - - - -/* Like strdup, but the buffer is on the ring. */ -char* -icalmemory_tmp_copy(const char* str) -{ - char* b = icalmemory_tmp_buffer(strlen(str)+1); - - strcpy(b,str); - - return b; -} - - -char* icalmemory_strdup(const char *s) -{ - return strdup(s); -} - -void -icalmemory_free_tmp_buffer (void* buf) -{ - if(buf == 0) - { - return; - } - - free(buf); -} - - -/* These buffer routines create memory the old fashioned way -- so the - caller will have to delocate the new memory */ - -void* icalmemory_new_buffer(size_t size) -{ - void *b = malloc(size); - - if( b == 0){ - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - memset(b,0,size); - - return b; -} - -void* icalmemory_resize_buffer(void* buf, size_t size) -{ - void *b = realloc(buf, size); - - if( b == 0){ - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - return b; -} - -void icalmemory_free_buffer(void* buf) -{ - free(buf); -} - -void -icalmemory_append_string(char** buf, char** pos, size_t* buf_size, - const char* string) -{ - char *new_buf; - char *new_pos; - - size_t data_length, final_length, string_length; - -#ifndef ICAL_NO_INTERNAL_DEBUG - icalerror_check_arg_rv( (buf!=0),"buf"); - icalerror_check_arg_rv( (*buf!=0),"*buf"); - icalerror_check_arg_rv( (pos!=0),"pos"); - icalerror_check_arg_rv( (*pos!=0),"*pos"); - icalerror_check_arg_rv( (buf_size!=0),"buf_size"); - icalerror_check_arg_rv( (*buf_size!=0),"*buf_size"); - icalerror_check_arg_rv( (string!=0),"string"); -#endif - - string_length = strlen(string); - data_length = (size_t)*pos - (size_t)*buf; - final_length = data_length + string_length; - - if ( final_length >= (size_t) *buf_size) { - - - *buf_size = (*buf_size) * 2 + final_length; - - new_buf = realloc(*buf,*buf_size); - - new_pos = (void*)((size_t)new_buf + data_length); - - *pos = new_pos; - *buf = new_buf; - } - - strcpy(*pos, string); - - *pos += string_length; -} - - -void -icalmemory_append_char(char** buf, char** pos, size_t* buf_size, - char ch) -{ - char *new_buf; - char *new_pos; - - size_t data_length, final_length; - -#ifndef ICAL_NO_INTERNAL_DEBUG - icalerror_check_arg_rv( (buf!=0),"buf"); - icalerror_check_arg_rv( (*buf!=0),"*buf"); - icalerror_check_arg_rv( (pos!=0),"pos"); - icalerror_check_arg_rv( (*pos!=0),"*pos"); - icalerror_check_arg_rv( (buf_size!=0),"buf_size"); - icalerror_check_arg_rv( (*buf_size!=0),"*buf_size"); -#endif - - data_length = (size_t)*pos - (size_t)*buf; - - final_length = data_length + 2; - - if ( final_length > (size_t) *buf_size ) { - - - *buf_size = (*buf_size) * 2 + final_length +1; - - new_buf = realloc(*buf,*buf_size); - - new_pos = (void*)((size_t)new_buf + data_length); - - *pos = new_pos; - *buf = new_buf; - } - - **pos = ch; - *pos += 1; - **pos = 0; -} diff --git a/libical/src/libical/icalmemory.h b/libical/src/libical/icalmemory.h deleted file mode 100644 index 52364e289f..0000000000 --- a/libical/src/libical/icalmemory.h +++ /dev/null @@ -1,80 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalmemory.h - CREATOR: eric 30 June 1999 - - - $Id$ - $Locker$ - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The Initial Developer of the Original Code is Eric Busboom - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org -======================================================================*/ - -#ifndef ICALMEMORY_H -#define ICALMEMORY_H - -#include <sys/types.h> /* for size_t */ - - -/* Tmp buffers are managed by ical. References can be returned to the - caller, although the caller will not own the memory. */ - -void* icalmemory_tmp_buffer(size_t size); -char* icalmemory_tmp_copy(const char* str); - -/* Add an externally allocated buffer to the ring. */ -void icalmemory_add_tmp_buffer(void*); - - -/* Free all memory used in the ring */ -void icalmemory_free_ring(void); - -/* Non-tmp buffers must be freed. These are mostly wrappers around - * malloc, etc, but are used so the caller can change the memory - * allocators in a future version of the library */ - -void* icalmemory_new_buffer(size_t size); -void* icalmemory_resize_buffer(void* buf, size_t size); -void icalmemory_free_buffer(void* buf); - -/* icalmemory_append_string will copy the string 'string' to the - buffer 'buf' starting at position 'pos', reallocing 'buf' if it is - too small. 'buf_size' is the size of 'buf' and will be changed if - 'buf' is reallocated. 'pos' will point to the last byte of the new - string in 'buf', usually a '\0' */ - -/* THESE ROUTINES CAN NOT BE USED ON TMP BUFFERS. Only use them on - normally allocated memory, or on buffers created from - icalmemory_new_buffer, never with buffers created by - icalmemory_tmp_buffer. If icalmemory_append_string has to resize a - buffer on the ring, the ring will loose track of it an you will - have memory problems. */ - -void icalmemory_append_string(char** buf, char** pos, size_t* buf_size, - const char* string); - -/* icalmemory_append_char is similar, but is appends a character instead of a string */ -void icalmemory_append_char(char** buf, char** pos, size_t* buf_size, - char ch); - -/* A wrapper around strdup. Partly to trap calls to strdup, partly - because in -ansi, gcc on Red Hat claims that strudup is undeclared */ -char* icalmemory_strdup(const char *s); - -#endif /* !ICALMEMORY_H */ - - - diff --git a/libical/src/libical/icalmime.c b/libical/src/libical/icalmime.c deleted file mode 100644 index 6e11e9e326..0000000000 --- a/libical/src/libical/icalmime.c +++ /dev/null @@ -1,386 +0,0 @@ -/* -*- Mode: C -*-*/ -/*====================================================================== - FILE: icalmime.c - CREATOR: eric 26 July 2000 - - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The Original Code is eric. The Initial Developer of the Original - Code is Eric Busboom - - -======================================================================*/ - -#include "icalmime.h" -#include "icalerror.h" -#include "icalmemory.h" -#include "sspm.h" -#include "stdlib.h" -#include <string.h> /* For strdup */ -#include <stdio.h> /* for snprintf*/ - -#ifdef DMALLOC -#include "dmalloc.h" -#endif - - -/* These *_part routines are called by the MIME parser via the - local_action_map */ - -struct text_part -{ - char* buf; - char* buf_pos; - size_t buf_size; -}; - -void* icalmime_text_new_part() -{ - -#define BUF_SIZE 2048 - - struct text_part* impl; - - if ( ( impl = (struct text_part*) - malloc(sizeof(struct text_part))) == 0) { - return 0; - } - - impl->buf = icalmemory_new_buffer(BUF_SIZE); - impl->buf_pos = impl->buf; - impl->buf_size = BUF_SIZE; - - return impl; -} -void icalmime_text_add_line(void *part, - struct sspm_header *header, - char* line, size_t size) -{ - struct text_part* impl = (struct text_part*) part; - - icalmemory_append_string(&(impl->buf),&(impl->buf_pos), - &(impl->buf_size),line); - -} - -void* icalmime_textcalendar_end_part(void* part) -{ - - struct text_part* impl = (struct text_part*) part; - icalcomponent *c = icalparser_parse_string(impl->buf); - - icalmemory_free_buffer(impl->buf); - free(impl); - - return c; - -} - -void* icalmime_text_end_part(void* part) -{ - struct text_part* impl = ( struct text_part*) part; - - icalmemory_add_tmp_buffer(impl->buf); - free(impl); - - return impl->buf; -} - -void icalmime_text_free_part(void *part) -{ - part = part; -} - - -/* Ignore Attachments for now */ - -void* icalmime_attachment_new_part() -{ - return 0; -} -void icalmime_attachment_add_line(void *part, struct sspm_header *header, - char* line, size_t size) -{ - part = part; - header = header; - line = line; - size = size; -} - -void* icalmime_attachment_end_part(void* part) -{ - return 0; -} - -void icalmime_attachment_free_part(void *part) -{ -} - - - - -struct sspm_action_map icalmime_local_action_map[] = -{ - {SSPM_TEXT_MAJOR_TYPE,SSPM_CALENDAR_MINOR_TYPE,icalmime_text_new_part,icalmime_text_add_line,icalmime_textcalendar_end_part,icalmime_text_free_part}, - {SSPM_TEXT_MAJOR_TYPE,SSPM_ANY_MINOR_TYPE,icalmime_text_new_part,icalmime_text_add_line,icalmime_text_end_part,icalmime_text_free_part}, - {SSPM_TEXT_MAJOR_TYPE,SSPM_PLAIN_MINOR_TYPE,icalmime_text_new_part,icalmime_text_add_line,icalmime_text_end_part,icalmime_text_free_part}, - {SSPM_APPLICATION_MAJOR_TYPE,SSPM_CALENDAR_MINOR_TYPE,icalmime_attachment_new_part,icalmime_attachment_add_line,icalmime_attachment_end_part,icalmime_attachment_free_part}, - {SSPM_IMAGE_MAJOR_TYPE,SSPM_CALENDAR_MINOR_TYPE,icalmime_attachment_new_part,icalmime_attachment_add_line,icalmime_attachment_end_part,icalmime_attachment_free_part}, - {SSPM_AUDIO_MAJOR_TYPE,SSPM_CALENDAR_MINOR_TYPE,icalmime_attachment_new_part,icalmime_attachment_add_line,icalmime_attachment_end_part,icalmime_attachment_free_part}, - {SSPM_IMAGE_MAJOR_TYPE,SSPM_CALENDAR_MINOR_TYPE,icalmime_attachment_new_part,icalmime_attachment_add_line,icalmime_attachment_end_part,icalmime_attachment_free_part}, - {SSPM_UNKNOWN_MAJOR_TYPE,SSPM_UNKNOWN_MINOR_TYPE,0,0,0,0} -}; - -#define NUM_PARTS 100 /* HACK. Hard Limit */ - - - -struct sspm_part* icalmime_make_part(icalcomponent* comp) -{ - comp = comp; - return 0; -} - -char* icalmime_as_mime_string(char* icalcomponent); - -icalcomponent* icalmime_parse(char* (*get_string)(char *s, size_t size, - void *d), - void *data) -{ - struct sspm_part *parts; - int i, last_level=0; - icalcomponent *root=0, *parent=0, *comp=0, *last = 0; - - if ( (parts = (struct sspm_part *) - malloc(NUM_PARTS*sizeof(struct sspm_part)))==0) { - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - memset(parts,0,sizeof(parts)); - - sspm_parse_mime(parts, - NUM_PARTS, /* Max parts */ - icalmime_local_action_map, /* Actions */ - get_string, - data, /* data for get_string*/ - 0 /* First header */); - - - - for(i = 0; i <NUM_PARTS && parts[i].header.major != SSPM_NO_MAJOR_TYPE ; i++){ - -#define TMPSZ 1024 - char mimetype[TMPSZ]; - char* major = sspm_major_type_string(parts[i].header.major); - char* minor = sspm_minor_type_string(parts[i].header.minor); - - if(parts[i].header.minor == SSPM_UNKNOWN_MINOR_TYPE ){ - assert(parts[i].header.minor_text !=0); - minor = parts[i].header.minor_text; - } - - sprintf(mimetype,"%s/%s",major,minor); - - comp = icalcomponent_new(ICAL_XLICMIMEPART_COMPONENT); - - if(comp == 0){ - /* HACK Handle Error */ - assert(0); - } - - if(parts[i].header.error!=SSPM_NO_ERROR){ - char *str; - char* temp[256]; - - if(parts[i].header.error==SSPM_UNEXPECTED_BOUNDARY_ERROR){ - str = "Got an unexpected boundary, possibly due to a MIME header for a MULTIPART part that is missing the Content-Type line"; - } - - if(parts[i].header.error==SSPM_WRONG_BOUNDARY_ERROR){ - str = "Got the wrong boundary for the opening of a MULTIPART part."; - } - - if(parts[i].header.error==SSPM_NO_BOUNDARY_ERROR){ - str = "Got a multipart header that did not specify a boundary"; - } - - if(parts[i].header.error==SSPM_NO_HEADER_ERROR){ - str = "Did not get a header for the part. Is there a blank\ -line between the header and the previous boundary\?"; - - } - - if(parts[i].header.error_text != 0){ - snprintf((char*)temp,256, - "%s: %s",str,parts[i].header.error_text); - } else { - strcpy((char*)temp,str); - } - - icalcomponent_add_property - (comp, - icalproperty_vanew_xlicerror( - (char*)temp, - icalparameter_new_xlicerrortype( - ICAL_XLICERRORTYPE_MIMEPARSEERROR), - 0)); - } - - if(parts[i].header.major != SSPM_NO_MAJOR_TYPE && - parts[i].header.major != SSPM_UNKNOWN_MAJOR_TYPE){ - - icalcomponent_add_property(comp, - icalproperty_new_xlicmimecontenttype((char*) - icalmemory_strdup(mimetype))); - - } - - if (parts[i].header.encoding != SSPM_NO_ENCODING){ - - icalcomponent_add_property(comp, - icalproperty_new_xlicmimeencoding( - sspm_encoding_string(parts[i].header.encoding))); - } - - if (parts[i].header.filename != 0){ - icalcomponent_add_property(comp, - icalproperty_new_xlicmimefilename(parts[i].header.filename)); - } - - if (parts[i].header.content_id != 0){ - icalcomponent_add_property(comp, - icalproperty_new_xlicmimecid(parts[i].header.content_id)); - } - - if (parts[i].header.charset != 0){ - icalcomponent_add_property(comp, - icalproperty_new_xlicmimecharset(parts[i].header.charset)); - } - - /* Add iCal components as children of the component */ - if(parts[i].header.major == SSPM_TEXT_MAJOR_TYPE && - parts[i].header.minor == SSPM_CALENDAR_MINOR_TYPE && - parts[i].data != 0){ - - icalcomponent_add_component(comp, - (icalcomponent*)parts[i].data); - parts[i].data = 0; - - } else if(parts[i].header.major == SSPM_TEXT_MAJOR_TYPE && - parts[i].header.minor != SSPM_CALENDAR_MINOR_TYPE && - parts[i].data != 0){ - - /* Add other text components as "DESCRIPTION" properties */ - - icalcomponent_add_property(comp, - icalproperty_new_description( - (char*)icalmemory_strdup((char*)parts[i].data))); - - parts[i].data = 0; - } - - - if(root!= 0 && parts[i].level == 0){ - /* We've already assigned the root, but there is another - part at the root level. This is probably a parse - error*/ - icalcomponent_free(comp); - continue; - } - - if(parts[i].level == last_level && last_level != 0){ - icalerror_assert(parent!=0,"No parent for adding component"); - - icalcomponent_add_component(parent,comp); - - } else if (parts[i].level == last_level && last_level == 0 && - root == 0) { - - root = comp; - parent = comp; - - } else if (parts[i].level > last_level){ - - parent = last; - icalcomponent_add_component(parent,comp); - - last_level = parts[i].level; - - } else if (parts[i].level < last_level){ - - parent = icalcomponent_get_parent(parent); - icalcomponent_add_component(parent,comp); - - last_level = parts[i].level; - } else { - assert(0); - } - - last = comp; - last_level = parts[i].level; - assert(parts[i].data == 0); - } - - sspm_free_parts(parts,NUM_PARTS); - free(parts); - - return root; -} - - - -int icalmime_test(char* (*get_string)(char *s, size_t size, void *d), - void *data) -{ - char *out; - struct sspm_part *parts; - int i; - - if ( (parts = (struct sspm_part *) - malloc(NUM_PARTS*sizeof(struct sspm_part)))==0) { - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - memset(parts,0,sizeof(parts)); - - sspm_parse_mime(parts, - NUM_PARTS, /* Max parts */ - icalmime_local_action_map, /* Actions */ - get_string, - data, /* data for get_string*/ - 0 /* First header */); - - for(i = 0; i <NUM_PARTS && parts[i].header.major != SSPM_NO_MAJOR_TYPE ; - i++){ - if(parts[i].header.minor == SSPM_CALENDAR_MINOR_TYPE){ - parts[i].data = icalmemory_strdup( - icalcomponent_as_ical_string((icalcomponent*)parts[i].data)); - } - } - - sspm_write_mime(parts,NUM_PARTS,&out,"To: bob@bob.org"); - - printf("%s\n",out); - - return 0; - -} - - diff --git a/libical/src/libical/icalmime.h b/libical/src/libical/icalmime.h deleted file mode 100644 index b22288842d..0000000000 --- a/libical/src/libical/icalmime.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalmime.h - CREATOR: eric 26 July 2000 - - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - -======================================================================*/ - -#ifndef ICALMIME_H -#define ICALMIME_H - -#include "icalcomponent.h" -#include "icalparser.h" - -icalcomponent* icalmime_parse( char* (*line_gen_func)(char *s, size_t size, - void *d), - void *data); - -/* The inverse of icalmime_parse, not implemented yet. Use sspm.h directly. */ -char* icalmime_as_mime_string(char* component); - - - -#endif /* !ICALMIME_H */ - - - diff --git a/libical/src/libical/icalparameter.c b/libical/src/libical/icalparameter.c deleted file mode 100644 index 156ecdb04b..0000000000 --- a/libical/src/libical/icalparameter.c +++ /dev/null @@ -1,382 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: icalderivedparameters.{c,h} - CREATOR: eric 09 May 1999 - - $Id$ - $Locker$ - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icalderivedparameters.{c,h} - - Contributions from: - Graham Davison (g.m.davison@computer.org) - - ======================================================================*/ -/*#line 29 "icalparameter.c.in"*/ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - - -#include "icalparameter.h" -#include "icalproperty.h" -#include "icalerror.h" -#include "icalmemory.h" -#include "icalparameterimpl.h" - -#include <stdlib.h> /* for malloc() */ -#include <errno.h> -#include <string.h> /* for memset() */ - -/* In icalderivedparameter */ -icalparameter* icalparameter_new_from_value_string(icalparameter_kind kind,const char* val); - - -struct icalparameter_impl* icalparameter_new_impl(icalparameter_kind kind) -{ - struct icalparameter_impl* v; - - if ( ( v = (struct icalparameter_impl*) - malloc(sizeof(struct icalparameter_impl))) == 0) { - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - strcpy(v->id,"para"); - - v->kind = kind; - v->size = 0; - v->string = 0; - v->x_name = 0; - v->parent = 0; - v->data = 0; - - return v; -} - -icalparameter* -icalparameter_new (icalparameter_kind kind) -{ - struct icalparameter_impl* v = icalparameter_new_impl(kind); - - return (icalparameter*) v; - -} - -void -icalparameter_free (icalparameter* parameter) -{ - struct icalparameter_impl * impl; - - impl = (struct icalparameter_impl*)parameter; - -/* HACK. This always triggers, even when parameter is non-zero - icalerror_check_arg_rv((parameter==0),"parameter");*/ - - -#ifdef ICAL_FREE_ON_LIST_IS_ERROR - icalerror_assert( (impl->parent ==0),"Tried to free a parameter that is still attached to a component. "); - -#else - if(impl->parent !=0){ - return; - } -#endif - - - if (impl->string != 0){ - free ((void*)impl->string); - } - - if (impl->x_name != 0){ - free ((void*)impl->x_name); - } - - memset(impl,0,sizeof(impl)); - - impl->parent = 0; - impl->id[0] = 'X'; - free(impl); -} - - - -icalparameter* -icalparameter_new_clone(icalparameter* param) -{ - struct icalparameter_impl *old; - struct icalparameter_impl *new; - - old = (struct icalparameter_impl *)param; - new = icalparameter_new_impl(old->kind); - - icalerror_check_arg_rz((param!=0),"param"); - - if (new == 0){ - return 0; - } - - memcpy(new,old,sizeof(struct icalparameter_impl)); - - if (old->string != 0){ - new->string = icalmemory_strdup(old->string); - if (new->string == 0){ - icalparameter_free(new); - return 0; - } - } - - if (old->x_name != 0){ - new->x_name = icalmemory_strdup(old->x_name); - if (new->x_name == 0){ - icalparameter_free(new); - return 0; - } - } - - return new; -} - -icalparameter* icalparameter_new_from_string(const char *str) -{ - char* eq; - char* cpy; - icalparameter_kind kind; - icalparameter *param; - - icalerror_check_arg_rz(str != 0,"str"); - - cpy = icalmemory_strdup(str); - - if (cpy == 0){ - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - eq = strchr(cpy,'='); - - if(eq == 0){ - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - return 0; - } - - *eq = '\0'; - - eq++; - - kind = icalparameter_string_to_kind(cpy); - - if(kind == ICAL_NO_PARAMETER){ - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - return 0; - } - - param = icalparameter_new_from_value_string(kind,eq); - - if(kind == ICAL_X_PARAMETER){ - icalparameter_set_xname(param,cpy); - } - - free(cpy); - - return param; - -} - -char* -icalparameter_as_ical_string (icalparameter* parameter) -{ - struct icalparameter_impl* impl; - size_t buf_size = 1024; - char* buf; - char* buf_ptr; - char *out_buf; - const char *kind_string; - - icalerror_check_arg_rz( (parameter!=0), "parameter"); - - /* Create new buffer that we can append names, parameters and a - value to, and reallocate as needed. Later, this buffer will be - copied to a icalmemory_tmp_buffer, which is managed internally - by libical, so it can be given to the caller without fear of - the caller forgetting to free it */ - - buf = icalmemory_new_buffer(buf_size); - buf_ptr = buf; - impl = (struct icalparameter_impl*)parameter; - - if(impl->kind == ICAL_X_PARAMETER) { - - icalmemory_append_string(&buf, &buf_ptr, &buf_size, - icalparameter_get_xname(impl)); - - } else { - - kind_string = icalparameter_kind_to_string(impl->kind); - - if (impl->kind == ICAL_NO_PARAMETER || - impl->kind == ICAL_ANY_PARAMETER || - kind_string == 0) - { - icalerror_set_errno(ICAL_BADARG_ERROR); - return 0; - } - - - /* Put the parameter name into the string */ - icalmemory_append_string(&buf, &buf_ptr, &buf_size, kind_string); - - } - - icalmemory_append_string(&buf, &buf_ptr, &buf_size, "="); - - if(impl->string !=0){ - icalmemory_append_string(&buf, &buf_ptr, &buf_size, impl->string); - } else if (impl->data != 0){ - const char* str = icalparameter_enum_to_string(impl->data); - icalmemory_append_string(&buf, &buf_ptr, &buf_size, str); - } else { - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - return 0; - } - - /* Now, copy the buffer to a tmp_buffer, which is safe to give to - the caller without worring about de-allocating it. */ - - out_buf = icalmemory_tmp_buffer(strlen(buf)); - strcpy(out_buf, buf); - - icalmemory_free_buffer(buf); - - return out_buf; - -} - - -int -icalparameter_is_valid (icalparameter* parameter); - - -icalparameter_kind -icalparameter_isa (icalparameter* parameter) -{ - if(parameter == 0){ - return ICAL_NO_PARAMETER; - } - - return ((struct icalparameter_impl *)parameter)->kind; -} - - -int -icalparameter_isa_parameter (void* parameter) -{ - struct icalparameter_impl *impl = (struct icalparameter_impl *)parameter; - - if (parameter == 0){ - return 0; - } - - if (strcmp(impl->id,"para") == 0) { - return 1; - } else { - return 0; - } -} - - -void -icalparameter_set_xname (icalparameter* param, const char* v) -{ - struct icalparameter_impl *impl = (struct icalparameter_impl*)param; - icalerror_check_arg_rv( (param!=0),"param"); - icalerror_check_arg_rv( (v!=0),"v"); - - if (impl->x_name != 0){ - free((void*)impl->x_name); - } - - impl->x_name = icalmemory_strdup(v); - - if (impl->x_name == 0){ - errno = ENOMEM; - } - -} - -const char* -icalparameter_get_xname (icalparameter* param) -{ - struct icalparameter_impl *impl = (struct icalparameter_impl*)param; - icalerror_check_arg_rz( (param!=0),"param"); - - return impl->x_name; -} - -void -icalparameter_set_xvalue (icalparameter* param, const char* v) -{ - struct icalparameter_impl *impl = (struct icalparameter_impl*)param; - - icalerror_check_arg_rv( (param!=0),"param"); - icalerror_check_arg_rv( (v!=0),"v"); - - if (impl->string != 0){ - free((void*)impl->string); - } - - impl->string = icalmemory_strdup(v); - - if (impl->string == 0){ - errno = ENOMEM; - } - -} - -const char* -icalparameter_get_xvalue (icalparameter* param) -{ - struct icalparameter_impl *impl = (struct icalparameter_impl*)param; - - icalerror_check_arg_rz( (param!=0),"param"); - - return impl->string; - -} - -void icalparameter_set_parent(icalparameter* param, - icalproperty* property) -{ - struct icalparameter_impl *impl = (struct icalparameter_impl*)param; - - icalerror_check_arg_rv( (param!=0),"param"); - - impl->parent = property; -} - -icalproperty* icalparameter_get_parent(icalparameter* param) -{ - struct icalparameter_impl *impl = (struct icalparameter_impl*)param; - - icalerror_check_arg_rz( (param!=0),"param"); - - return impl->parent; -} - - -/* Everything below this line is machine generated. Do not edit. */ -/* ALTREP */ diff --git a/libical/src/libical/icalparameter.h b/libical/src/libical/icalparameter.h deleted file mode 100644 index 3f3b59f049..0000000000 --- a/libical/src/libical/icalparameter.h +++ /dev/null @@ -1,69 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalparam.h - CREATOR: eric 20 March 1999 - - - $Id$ - $Locker$ - - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icalparam.h - - ======================================================================*/ - -#ifndef ICALPARAM_H -#define ICALPARAM_H - -#include "icalderivedparameter.h" - -/* Declared in icalderivedparameter.h */ -/*typedef void icalparameter;*/ - -icalparameter* icalparameter_new(icalparameter_kind kind); -icalparameter* icalparameter_new_clone(icalparameter* p); - -/* Create from string of form "PARAMNAME=VALUE" */ -icalparameter* icalparameter_new_from_string(const char* value); - -/* Create from just the value, the part after the "=" */ -icalparameter* icalparameter_new_from_value_string(icalparameter_kind kind, const char* value); - -void icalparameter_free(icalparameter* parameter); - -char* icalparameter_as_ical_string(icalparameter* parameter); - -int icalparameter_is_valid(icalparameter* parameter); - -icalparameter_kind icalparameter_isa(icalparameter* parameter); - -int icalparameter_isa_parameter(void* param); - -/* Acess the name of an X parameer */ -void icalparameter_set_xname (icalparameter* param, const char* v); -const char* icalparameter_get_xname(icalparameter* param); -void icalparameter_set_xvalue (icalparameter* param, const char* v); -const char* icalparameter_get_xvalue(icalparameter* param); - -/* Convert enumerations */ - -const char* icalparameter_kind_to_string(icalparameter_kind kind); -icalparameter_kind icalparameter_string_to_kind(const char* string); - - - -#endif diff --git a/libical/src/libical/icalparameterimpl.h b/libical/src/libical/icalparameterimpl.h deleted file mode 100644 index 2d0fdd642d..0000000000 --- a/libical/src/libical/icalparameterimpl.h +++ /dev/null @@ -1,52 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: icalparameterimpl.h - CREATOR: eric 09 May 1999 - - $Id$ - $Locker$ - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icalderivedparameters.{c,h} - - Contributions from: - Graham Davison (g.m.davison@computer.org) - - ======================================================================*/ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#ifndef ICALPARAMETER_IMPL -#define ICALPARAMETER_IMPL - -#include "icalparameter.h" -#include "icalproperty.h" - -struct icalparameter_impl -{ - icalparameter_kind kind; - char id[5]; - int size; - const char* string; - const char* x_name; - icalproperty* parent; - - int data; -}; - - -#endif /*ICALPARAMETER_IMPL*/ diff --git a/libical/src/libical/icalparser.c b/libical/src/libical/icalparser.c deleted file mode 100644 index 7cd2929788..0000000000 --- a/libical/src/libical/icalparser.c +++ /dev/null @@ -1,1110 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: icalparser.c - CREATOR: eric 04 August 1999 - - $Id$ - $Locker$ - - The contents of this file are subject to the Mozilla Public License - Version 1.0 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and - limitations under the License. - - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The Initial Developer of the Original Code is Eric Busboom - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - ======================================================================*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - - -#include "icalparser.h" -#include "pvl.h" -#include "icalmemory.h" -#include "icalerror.h" -#include "icalvalue.h" -#include "icalderivedparameter.h" -#include "icalparameter.h" -#include "icalproperty.h" -#include "icalcomponent.h" - -#include <string.h> /* For strncpy & size_t */ -#include <stdio.h> /* For FILE and fgets and sprintf */ -#include <stdlib.h> /* for free */ - - -extern icalvalue* icalparser_yy_value; -void set_parser_value_state(icalvalue_kind kind); -int ical_yyparse(void); - -char* icalparser_get_next_char(char c, char *str); -char* icalparser_get_next_parameter(char* line,char** end); -char* icalparser_get_next_value(char* line, char **end, icalvalue_kind kind); -char* icalparser_get_prop_name(char* line, char** end); -char* icalparser_get_param_name(char* line, char **end); - -#define TMP_BUF_SIZE 80 - -struct icalparser_impl -{ - int buffer_full; /* flag indicates that temp is smaller that - data being read into it*/ - int continuation_line; /* last line read was a continuation line */ - size_t tmp_buf_size; - char temp[TMP_BUF_SIZE]; - icalcomponent *root_component; - int version; - int level; - int lineno; - icalparser_state state; - pvl_list components; - - void *line_gen_data; - -}; - - -icalparser* icalparser_new(void) -{ - struct icalparser_impl* impl = 0; - if ( ( impl = (struct icalparser_impl*) - malloc(sizeof(struct icalparser_impl))) == 0) { - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - impl->root_component = 0; - impl->components = pvl_newlist(); - impl->level = 0; - impl->state = ICALPARSER_SUCCESS; - - impl->tmp_buf_size = TMP_BUF_SIZE; - impl->buffer_full = 0; - impl->continuation_line = 0; - impl->lineno = 0; - - memset(impl->temp,0, TMP_BUF_SIZE); - - return (icalparser*)impl; -} - - -void icalparser_free(icalparser* parser) -{ - struct icalparser_impl* impl = (struct icalparser_impl*)parser; - icalcomponent *c; - - if (impl->root_component != 0){ - icalcomponent_free(impl->root_component); - } - - while( (c=pvl_pop(impl->components)) != 0){ - icalcomponent_free(c); - } - - pvl_free(impl->components); - - free(impl); -} - -void icalparser_set_gen_data(icalparser* parser, void* data) -{ - struct icalparser_impl* impl = (struct icalparser_impl*)parser; - - impl->line_gen_data = data; -} - - -icalvalue* icalvalue_new_From_string_with_error(icalvalue_kind kind, - char* str, - icalproperty **error); - - - -char* icalparser_get_next_char(char c, char *str) -{ - int quote_mode = 0; - char* p; - - - for(p=str; *p!=0; p++){ - - if ( quote_mode == 0 && *p=='"' && *(p-1) != '\\' ){ - quote_mode =1; - continue; - } - - if ( quote_mode == 1 && *p=='"' && *(p-1) != '\\' ){ - quote_mode =0; - continue; - } - - if (quote_mode == 0 && *p== c && *(p-1) != '\\' ){ - return p; - } - - } - - return 0; -} - -/* make a new tmp buffer out of a substring */ -char* make_segment(char* start, char* end) -{ - char *buf; - size_t size = (size_t)end - (size_t)start; - - buf = icalmemory_tmp_buffer(size+1); - - - strncpy(buf,start,size); - *(buf+size) = 0; - - return buf; - -} - -const char* input_buffer; -const char* input_buffer_p; -#define min(a,b) ((a) < (b) ? (a) : (b)) - -int icalparser_flex_input(char* buf, int max_size) -{ - int n = min(max_size,strlen(input_buffer_p)); - - if (n > 0){ - memcpy(buf, input_buffer_p, n); - input_buffer_p += n; - return n; - } else { - return 0; - } -} - -void icalparser_clear_flex_input(void) -{ - input_buffer_p = input_buffer+strlen(input_buffer); -} - -/* Call the flex/bison parser to parse a complex value */ - -icalvalue* icalparser_parse_value(icalvalue_kind kind, - const char* str, icalproperty** error) -{ - int r; - input_buffer_p = input_buffer = str; - - set_parser_value_state(kind); - icalparser_yy_value = 0; - - r = ical_yyparse(); - - /* Error. Parse failed */ - if( icalparser_yy_value == 0 || r != 0){ - - if(icalparser_yy_value !=0){ - icalvalue_free(icalparser_yy_value); - icalparser_yy_value = 0; - } - - return 0; - } - - if (error != 0){ - *error = 0; - } - - return icalparser_yy_value; -} - -char* icalparser_get_prop_name(char* line, char** end) -{ - char* p; - char* v; - char *str; - - p = icalparser_get_next_char(';',line); - v = icalparser_get_next_char(':',line); - if (p== 0 && v == 0) { - return 0; - } - - /* There is no ';' or, it is after the ';' that marks the beginning of - the value */ - if (v!=0 && ( p == 0 || p > v)){ - str = make_segment(line,v); - *end = v+1; - } else { - str = make_segment(line,p); - *end = p+1; - } - - return str; -} - -char* icalparser_get_param_name(char* line, char **end) -{ - - char* next; - char *str; - - next = icalparser_get_next_char('=',line); - - if (next == 0) { - return 0; - } - - str = make_segment(line,next); - *end = next+1; - return str; - -} - -char* icalparser_get_next_paramvalue(char* line, char **end) -{ - - char* next; - char *str; - - next = icalparser_get_next_char(',',line); - - if (next == 0){ - next = (char*)(size_t)line+(size_t)strlen(line);\ - } - - if (next == line){ - return 0; - } else { - str = make_segment(line,next); - *end = next+1; - return str; - } - -} - -/* A property may have multiple values, if the values are seperated by - commas in the content line. This routine will look for the next - comma after line and will set the next place to start searching in - end. */ - -char* icalparser_get_next_value(char* line, char **end, icalvalue_kind kind) -{ - - char* next; - char *p; - char *str; - size_t length = strlen(line); - - p = line; - while(1){ - - next = icalparser_get_next_char(',',p); - - /* Unforunately, RFC2445 says that for the RECUR value, COMMA - can both seperate digits in a list, and it can seperate - multiple recurrence specifications. This is not a friendly - part of the spec. This weirdness tries to - distinguish the two uses. it is probably a HACK*/ - - if( kind == ICAL_RECUR_VALUE ) { - if ( next != 0 && - (*end+length) > next+5 && - strncmp(next,"FREQ",4) == 0 - ) { - /* The COMMA was followed by 'FREQ', is it a real seperator*/ - /* Fall through */ - } else if (next != 0){ - /* Not real, get the next COMMA */ - p = next+1; - next = 0; - continue; - } - } - - /* If the comma is preceeded by a '\', then it is a literal and - not a value seperator*/ - - if ( (next!=0 && *(next-1) == '\\') || - (next!=0 && *(next-3) == '\\') - ) - /*second clause for '/' is on prev line. HACK may be out of bounds */ - { - p = next+1; - } else { - break; - } - - } - - if (next == 0){ - next = (char*)(size_t)line+length; - *end = next; - } else { - *end = next+1; - } - - if (next == line){ - return 0; - } - - - str = make_segment(line,next); - return str; - -} - -char* icalparser_get_next_parameter(char* line,char** end) -{ - char *next; - char *v; - char *str; - - v = icalparser_get_next_char(':',line); - next = icalparser_get_next_char(';', line); - - /* There is no ';' or, it is after the ':' that marks the beginning of - the value */ - - if (next == 0 || next > v) { - next = icalparser_get_next_char(':', line); - } - - if (next != 0) { - str = make_segment(line,next); - *end = next+1; - return str; - } else { - *end = line; - return 0; - } -} - -/* Get a single property line, from the property name through the - final new line, and include any continuation lines */ - -char* icalparser_get_line(icalparser *parser, - char* (*line_gen_func)(char *s, size_t size, void *d)) -{ - char *line; - char *line_p; - struct icalparser_impl* impl = (struct icalparser_impl*)parser; - size_t buf_size = impl->tmp_buf_size; - - - line_p = line = icalmemory_new_buffer(buf_size); - line[0] = '\0'; - - /* Read lines by calling line_gen_func and putting the data into - impl->temp. If the line is a continuation line ( begins with a - space after a newline ) then append the data onto line and read - again. Otherwise, exit the loop. */ - - while(1) { - - /* The first part of the loop deals with the temp buffer, - which was read on he last pass through the loop. The - routine is split like this because it has to read lone line - ahead to determine if a line is a continuation line. */ - - - /* The tmp buffer is not clear, so transfer the data in it to the - output. This may be left over from a previous call */ - if (impl->temp[0] != '\0' ) { - - /* If the last position in the temp buffer is occupied, - mark the buffer as full. The means we will do another - read later, because the line is not finished */ - if (impl->temp[impl->tmp_buf_size-1] == 0 && - impl->temp[impl->tmp_buf_size-2] != '\n'&& - impl->temp[impl->tmp_buf_size-2] != 0 ){ - impl->buffer_full = 1; - } else { - impl->buffer_full = 0; - } - - /* Copy the temp to the output and clear the temp buffer. */ - if(impl->continuation_line==1){ - /* back up the pointer to erase the continuation characters */ - impl->continuation_line = 0; - line_p--; - - if ( *(line_p-1) == '\r'){ - line_p--; - } - - /* copy one space up to eliminate the leading space*/ - icalmemory_append_string(&line,&line_p,&buf_size, - impl->temp+1); - - } else { - icalmemory_append_string(&line,&line_p,&buf_size,impl->temp); - } - - impl->temp[0] = '\0' ; - } - - impl->temp[impl->tmp_buf_size-1] = 1; /* Mark end of buffer */ - - /****** Here is where the routine gets string data ******************/ - if ((*line_gen_func)(impl->temp,impl->tmp_buf_size,impl->line_gen_data) - ==0){/* Get more data */ - - /* If the first position is clear, it means we didn't get - any more data from the last call to line_ge_func*/ - if (impl->temp[0] == '\0'){ - - if(line[0] != '\0'){ - /* There is data in the output, so fall trhough and process it*/ - break; - } else { - /* No data in output; return and signal that there - is no more input*/ - free(line); - return 0; - } - } - } - - - /* If the output line ends in a '\n' and the temp buffer - begins with a ' ', then the buffer holds a continuation - line, so keep reading. */ - - if ( line_p > line+1 && *(line_p-1) == '\n' && impl->temp[0] == ' ') { - - impl->continuation_line = 1; - - } else if ( impl->buffer_full == 1 ) { - - /* The buffer was filled on the last read, so read again */ - - } else { - - /* Looks like the end of this content line, so break */ - break; - } - - - } - - /* Erase the final newline and/or carriage return*/ - if ( line_p > line+1 && *(line_p-1) == '\n') { - *(line_p-1) = '\0'; - if ( *(line_p-2) == '\r'){ - *(line_p-2) = '\0'; - } - - } else { - *(line_p) = '\0'; - } - - return line; - -} - -void insert_error(icalcomponent* comp, char* text, - char* message, icalparameter_xlicerrortype type) -{ - char temp[1024]; - - if (text == 0){ - snprintf(temp,1024,"%s:",message); - } else { - snprintf(temp,1024,"%s: %s",message,text); - } - - icalcomponent_add_property - (comp, - icalproperty_vanew_xlicerror( - temp, - icalparameter_new_xlicerrortype(type), - 0)); -} - -int line_is_blank(char* line){ - int i=0; - - for(i=0; *(line+i)!=0; i++){ - char c = *(line+i); - - if(c != ' ' && c != '\n' && c != '\t'){ - return 0; - } - } - - return 1; -} - -icalcomponent* icalparser_parse(icalparser *parser, - char* (*line_gen_func)(char *s, size_t size, - void* d)) -{ - - char* line; - icalcomponent *c=0; - icalcomponent *root=0; - struct icalparser_impl *impl = (struct icalparser_impl*)parser; - icalerrorstate es = icalerror_get_error_state(ICAL_MALFORMEDDATA_ERROR); - - icalerror_check_arg_rz((parser !=0),"parser"); - - icalerror_set_error_state(ICAL_MALFORMEDDATA_ERROR,ICAL_ERROR_NONFATAL); - - do{ - line = icalparser_get_line(parser, line_gen_func); - - if ((c = icalparser_add_line(parser,line)) != 0){ - - if(icalcomponent_get_parent(c) !=0){ - /* This is bad news... assert? */ - } - - assert(impl->root_component == 0); - assert(pvl_count(impl->components) ==0); - - if (root == 0){ - /* Just one component */ - root = c; - } else if(icalcomponent_isa(root) != ICAL_XROOT_COMPONENT) { - /*Got a second component, so move the two components under - an XROOT container */ - icalcomponent *tempc = icalcomponent_new(ICAL_XROOT_COMPONENT); - icalcomponent_add_component(tempc, root); - icalcomponent_add_component(tempc, c); - root = tempc; - } else if(icalcomponent_isa(root) == ICAL_XROOT_COMPONENT) { - /* Already have an XROOT container, so add the component - to it*/ - icalcomponent_add_component(root, c); - - } else { - /* Badness */ - assert(0); - } - - c = 0; - - } - if(line != 0){ - free(line); - } - } while ( line != 0); - - icalerror_set_error_state(ICAL_MALFORMEDDATA_ERROR,es); - - return root; - -} - - -icalcomponent* icalparser_add_line(icalparser* parser, - char* line) -{ - char *p; - char *str; - char *end; - int vcount = 0; - icalproperty *prop; - icalproperty_kind prop_kind; - icalvalue *value; - icalvalue_kind value_kind = ICAL_NO_VALUE; - - - struct icalparser_impl *impl = (struct icalparser_impl*)parser; - icalerror_check_arg_rz((parser != 0),"parser"); - - - if (line == 0) - { - impl->state = ICALPARSER_ERROR; - return 0; - } - - if(line_is_blank(line) == 1){ - return 0; - } - - /* Begin by getting the property name at the start of the line. The - property name may end up being "BEGIN" or "END" in which case it - is not really a property, but the marker for the start or end of - a component */ - - end = 0; - str = icalparser_get_prop_name(line, &end); - - if (str == 0 || strlen(str) == 0 ){ - /* Could not get a property name */ - icalcomponent *tail = pvl_data(pvl_tail(impl->components)); - - if (tail){ - insert_error(tail,line, - "Got a data line, but could not find a property name or component begin tag", - ICAL_XLICERRORTYPE_COMPONENTPARSEERROR); - } - tail = 0; - impl->state = ICALPARSER_ERROR; - return 0; - } - - /********************************************************************** - * Handle begin and end of components - **********************************************************************/ - /* If the property name is BEGIN or END, we are actually - starting or ending a new component */ - - if(strcmp(str,"BEGIN") == 0){ - icalcomponent *c; - icalcomponent_kind comp_kind; - - impl->level++; - str = icalparser_get_next_value(end,&end, value_kind); - - - comp_kind = icalenum_string_to_component_kind(str); - - if (comp_kind == ICAL_NO_COMPONENT){ - c = icalcomponent_new(ICAL_XLICINVALID_COMPONENT); - insert_error(c,str,"Parse error in component name", - ICAL_XLICERRORTYPE_COMPONENTPARSEERROR); - } - - c = icalcomponent_new(comp_kind); - - if (c == 0){ - c = icalcomponent_new(ICAL_XLICINVALID_COMPONENT); - insert_error(c,str,"Parse error in component name", - ICAL_XLICERRORTYPE_COMPONENTPARSEERROR); - } - - pvl_push(impl->components,c); - - impl->state = ICALPARSER_BEGIN_COMP; - return 0; - - } else if (strcmp(str,"END") == 0 ) { - icalcomponent* tail; - - impl->level--; - str = icalparser_get_next_value(end,&end, value_kind); - - /* Pop last component off of list and add it to the second-to-last*/ - impl->root_component = pvl_pop(impl->components); - - tail = pvl_data(pvl_tail(impl->components)); - - if(tail != 0){ - icalcomponent_add_component(tail,impl->root_component); - } - - tail = 0; - - /* Return the component if we are back to the 0th level */ - if (impl->level == 0){ - icalcomponent *rtrn; - - if(pvl_count(impl->components) != 0){ - /* There are still components on the stack -- this means - that one of them did not have a proper "END" */ - pvl_push(impl->components,impl->root_component); - icalparser_clean(parser); /* may reset impl->root_component*/ - } - - assert(pvl_count(impl->components) == 0); - - impl->state = ICALPARSER_SUCCESS; - rtrn = impl->root_component; - impl->root_component = 0; - return rtrn; - - } else { - impl->state = ICALPARSER_END_COMP; - return 0; - } - } - - - /* There is no point in continuing if we have not seen a - component yet */ - - if(pvl_data(pvl_tail(impl->components)) == 0){ - impl->state = ICALPARSER_ERROR; - return 0; - } - - - /********************************************************************** - * Handle property names - **********************************************************************/ - - /* At this point, the property name really is a property name, - (Not a component name) so make a new property and add it to - the component */ - - - prop_kind = icalproperty_string_to_kind(str); - - prop = icalproperty_new(prop_kind); - - if (prop != 0){ - icalcomponent *tail = pvl_data(pvl_tail(impl->components)); - - if(prop_kind==ICAL_X_PROPERTY){ - icalproperty_set_x_name(prop,str); - } - - icalcomponent_add_property(tail, prop); - - /* Set the value kind for the default for this type of - property. This may be re-set by a VALUE parameter */ - value_kind = icalproperty_kind_to_value_kind(icalproperty_isa(prop)); - - } else { - icalcomponent* tail = pvl_data(pvl_tail(impl->components)); - - insert_error(tail,str,"Parse error in property name", - ICAL_XLICERRORTYPE_PROPERTYPARSEERROR); - - tail = 0; - impl->state = ICALPARSER_ERROR; - return 0; - } - - /********************************************************************** - * Handle parameter values - **********************************************************************/ - - /* Now, add any parameters to the last property */ - - p = 0; - while(1) { - - if (*(end-1) == ':'){ - /* if the last seperator was a ":" and the value is a - URL, icalparser_get_next_parameter will find the - ':' in the URL, so better break now. */ - break; - } - - str = icalparser_get_next_parameter(end,&end); - - if (str != 0){ - char* name; - char* pvalue; - - icalparameter *param = 0; - icalparameter_kind kind; - icalcomponent *tail = pvl_data(pvl_tail(impl->components)); - - name = icalparser_get_param_name(str,&pvalue); - - if (name == 0){ - /* 'tail' defined above */ - insert_error(tail, str, "Cant parse parameter name", - ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR); - tail = 0; - break; - } - - kind = icalparameter_string_to_kind(name); - - if(kind == ICAL_X_PARAMETER){ - param = icalparameter_new(ICAL_X_PARAMETER); - - if(param != 0){ - icalparameter_set_xname(param,name); - icalparameter_set_xvalue(param,pvalue); - } - - - } else if (kind != ICAL_NO_PARAMETER){ - param = icalparameter_new_from_value_string(kind,pvalue); - } else { - /* Error. Failed to parse the parameter*/ - /* 'tail' defined above */ - insert_error(tail, str, "Cant parse parameter name", - ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR); - tail = 0; - impl->state = ICALPARSER_ERROR; - return 0; - } - - if (param == 0){ - /* 'tail' defined above */ - insert_error(tail,str,"Cant parse parameter value", - ICAL_XLICERRORTYPE_PARAMETERVALUEPARSEERROR); - - tail = 0; - impl->state = ICALPARSER_ERROR; - continue; - } - - /* If it is a VALUE parameter, set the kind of value*/ - if (icalparameter_isa(param)==ICAL_VALUE_PARAMETER){ - - value_kind = (icalvalue_kind) - icalparameter_value_to_value_kind( - icalparameter_get_value(param) - ); - - if (value_kind == ICAL_NO_VALUE){ - - /* Ooops, could not parse the value of the - parameter ( it was not one of the defined - values ), so reset the value_kind */ - - insert_error( - tail, str, - "Got a VALUE parameter with an unknown type", - ICAL_XLICERRORTYPE_PARAMETERVALUEPARSEERROR); - icalparameter_free(param); - - value_kind = - icalproperty_kind_to_value_kind( - icalproperty_isa(prop)); - - icalparameter_free(param); - tail = 0; - impl->state = ICALPARSER_ERROR; - return 0; - } - } - - /* Everything is OK, so add the parameter */ - icalproperty_add_parameter(prop,param); - tail = 0; - - } else { /* if ( str != 0) */ - /* If we did not get a param string, go on to looking - for a value */ - break; - } /* if ( str != 0) */ - - } /* while(1) */ - - /********************************************************************** - * Handle values - **********************************************************************/ - - /* Look for values. If there are ',' characters in the values, - then there are multiple values, so clone the current - parameter and add one part of the value to each clone */ - - vcount=0; - while(1) { - str = icalparser_get_next_value(end,&end, value_kind); - - if (str != 0){ - - if (vcount > 0){ - /* Actually, only clone after the second value */ - icalproperty* clone = icalproperty_new_clone(prop); - icalcomponent* tail = pvl_data(pvl_tail(impl->components)); - - icalcomponent_add_property(tail, clone); - prop = clone; - tail = 0; - } - - value = icalvalue_new_from_string(value_kind, str); - - /* Don't add properties without value */ - if (value == 0){ - char temp[200]; /* HACK */ - - icalproperty_kind prop_kind = icalproperty_isa(prop); - icalcomponent* tail = pvl_data(pvl_tail(impl->components)); - - sprintf(temp,"Cant parse as %s value in %s property. Removing entire property", - icalvalue_kind_to_string(value_kind), - icalproperty_kind_to_string(prop_kind)); - - insert_error(tail, str, temp, - ICAL_XLICERRORTYPE_VALUEPARSEERROR); - - /* Remove the troublesome property */ - icalcomponent_remove_property(tail,prop); - icalproperty_free(prop); - prop = 0; - tail = 0; - impl->state = ICALPARSER_ERROR; - return 0; - - } else { - vcount++; - icalproperty_set_value(prop, value); - } - - - } else { - if (vcount == 0){ - char temp[200]; /* HACK */ - - icalproperty_kind prop_kind = icalproperty_isa(prop); - icalcomponent *tail = pvl_data(pvl_tail(impl->components)); - - sprintf(temp,"No value for %s property. Removing entire property", - icalproperty_kind_to_string(prop_kind)); - - insert_error(tail, str, temp, - ICAL_XLICERRORTYPE_VALUEPARSEERROR); - - /* Remove the troublesome property */ - icalcomponent_remove_property(tail,prop); - icalproperty_free(prop); - prop = 0; - tail = 0; - impl->state = ICALPARSER_ERROR; - return 0; - } else { - - break; - } - } - } - - /**************************************************************** - * End of component parsing. - *****************************************************************/ - - if (pvl_data(pvl_tail(impl->components)) == 0 && - impl->level == 0){ - /* HACK. Does this clause ever get executed? */ - impl->state = ICALPARSER_SUCCESS; - assert(0); - return impl->root_component; - } else { - impl->state = ICALPARSER_IN_PROGRESS; - return 0; - } - -} - -icalparser_state icalparser_get_state(icalparser* parser) -{ - struct icalparser_impl* impl = (struct icalparser_impl*) parser; - return impl->state; - -} - -icalcomponent* icalparser_clean(icalparser* parser) -{ - struct icalparser_impl* impl = (struct icalparser_impl*) parser; - icalcomponent *tail; - - icalerror_check_arg_rz((parser != 0 ),"parser"); - - /* We won't get a clean exit if some components did not have an - "END" tag. Clear off any component that may be left in the list */ - - while((tail=pvl_data(pvl_tail(impl->components))) != 0){ - - insert_error(tail," ", - "Missing END tag for this component. Closing component at end of input.", - ICAL_XLICERRORTYPE_COMPONENTPARSEERROR); - - - impl->root_component = pvl_pop(impl->components); - tail=pvl_data(pvl_tail(impl->components)); - - if(tail != 0){ - if(icalcomponent_get_parent(impl->root_component)!=0){ - icalerror_warn("icalparser_clean is trying to attach a component for the second time"); - } else { - icalcomponent_add_component(tail,impl->root_component); - } - } - - } - - return impl->root_component; - -} - -struct slg_data { - const char* pos; - const char* str; -}; - -char* string_line_generator(char *out, size_t buf_size, void *d) -{ - char *n; - size_t size; - struct slg_data* data = (struct slg_data*)d; - - if(data->pos==0){ - data->pos=data->str; - } - - /* If the pointer is at the end of the string, we are done */ - if (*(data->pos)==0){ - return 0; - } - - n = strchr(data->pos,'\n'); - - if (n == 0){ - size = strlen(data->pos); - } else { - n++; /* include newline in output */ - size = (n-data->pos); - } - - if (size > buf_size-1){ - size = buf_size-1; - } - - - strncpy(out,data->pos,size); - - *(out+size) = '\0'; - - data->pos += size; - - return out; -} - -icalcomponent* icalparser_parse_string(const char* str) -{ - icalcomponent *c; - struct slg_data d; - icalparser *p; - - icalerrorstate es = icalerror_get_error_state(ICAL_PARSE_ERROR); - - d.pos = 0; - d.str = str; - - p = icalparser_new(); - icalparser_set_gen_data(p,&d); - - icalerror_set_error_state(ICAL_PARSE_ERROR,ICAL_ERROR_NONFATAL); - - c = icalparser_parse(p,string_line_generator); - - icalerror_set_error_state(ICAL_PARSE_ERROR,es); - - icalparser_free(p); - - return c; - -} diff --git a/libical/src/libical/icalparser.h b/libical/src/libical/icalparser.h deleted file mode 100644 index 5e1c88ffc0..0000000000 --- a/libical/src/libical/icalparser.h +++ /dev/null @@ -1,93 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalparser.h - CREATOR: eric 20 April 1999 - - $Id$ - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icalparser.h - -======================================================================*/ - - -#ifndef ICALPARSER_H -#define ICALPARSER_H - -#include "icalenums.h" -#include "icaltypes.h" -#include"icalcomponent.h" - -#include <stdio.h> /* For FILE* */ - -typedef void* icalparser; - - -/*********************************************************************** - * Line-oriented parsing. - * - * Create a new parser via icalparse_new_parser, then add ines one at - * a time with icalparse_add_line(). icalparser_add_line() will return - * non-zero when it has finished with a component. - ***********************************************************************/ - -typedef enum icalparser_state { - ICALPARSER_ERROR, - ICALPARSER_SUCCESS, - ICALPARSER_BEGIN_COMP, - ICALPARSER_END_COMP, - ICALPARSER_IN_PROGRESS -} icalparser_state; - -icalparser* icalparser_new(void); -icalcomponent* icalparser_add_line(icalparser* parser, char* str ); -icalcomponent* icalparser_clean(icalparser* parser); -icalparser_state icalparser_get_state(icalparser* parser); -void icalparser_free(icalparser* parser); - - -/*********************************************************************** - * Message oriented parsing. icalparser_parse takes a string that - * holds the text ( in RFC 2445 format ) and returns a pointer to an - * icalcomponent. The caller owns the memory. line_gen_func is a - * pointer to a function that returns one content line per invocation - **********************************************************************/ - -icalcomponent* icalparser_parse(icalparser *parser, - char* (*line_gen_func)(char *s, size_t size, void *d)); - -/* Set the data that icalparser_parse will give to the line_gen_func - as the parameter 'd'*/ -void icalparser_set_gen_data(icalparser* parser, void* data); - - -icalcomponent* icalparser_parse_string(const char* str); - - -/*********************************************************************** - * Parser support functions - ***********************************************************************/ - -/* Use the flex/bison parser to turn a string into a value type */ -icalvalue* icalparser_parse_value(icalvalue_kind kind, - const char* str, icalcomponent** errors); - -/* Given a line generator function, return a single iCal content line.*/ -char* icalparser_get_line(icalparser* parser, char* (*line_gen_func)(char *s, size_t size, void *d)); - -char* string_line_generator(char *out, size_t buf_size, void *d); - -#endif /* !ICALPARSE_H */ diff --git a/libical/src/libical/icalperiod.c b/libical/src/libical/icalperiod.c deleted file mode 100644 index c74c157eff..0000000000 --- a/libical/src/libical/icalperiod.c +++ /dev/null @@ -1,170 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: icalperiod.c - CREATOR: eric 02 June 2000 - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The Original Code is eric. The Initial Developer of the Original - Code is Eric Busboom - - - ======================================================================*/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "icalperiod.h" - -#include <assert.h> -#include <string.h> -#include <stdlib.h> -#include <stdio.h> - -#ifdef ICAL_NO_LIBICAL -#define icalerror_set_errno(x) -#define icalerror_check_arg_rv(x,y) -#define icalerror_check_arg_re(x,y,z) -#else -#include "icalerror.h" -#include "icalmemory.h" -#endif - - - - -struct icalperiodtype icalperiodtype_from_string (const char* str) -{ - - struct icalperiodtype p, null_p; - char *s = icalmemory_strdup(str); - char *start, *end = s; - icalerrorstate es; - - /* Errors are normally generated in the following code, so save - the error state for resoration later */ - - icalerrorenum e = icalerrno; - - p.start = p.end = icaltime_null_time(); - p.duration = icaldurationtype_from_int(0); - - null_p = p; - - if(s == 0) goto error; - - start = s; - end = strchr(s, '/'); - - if(end == 0) goto error; - - *end = 0; - end++; - - p.start = icaltime_from_string(start); - - if (icaltime_is_null_time(p.start)) goto error; - - es = icalerror_get_error_state(ICAL_MALFORMEDDATA_ERROR); - icalerror_set_error_state(ICAL_MALFORMEDDATA_ERROR,ICAL_ERROR_NONFATAL); - - p.end = icaltime_from_string(end); - - icalerror_set_error_state(ICAL_MALFORMEDDATA_ERROR,es); - - - if (icaltime_is_null_time(p.end)){ - - p.duration = icaldurationtype_from_string(end); - - if(icaldurationtype_as_int(p.duration) == 0) goto error; - } - - icalerrno = e; - - return p; - - error: - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - return null_p; -} - - -const char* icalperiodtype_as_ical_string(struct icalperiodtype p) -{ - - const char* start; - const char* end; - - char *buf; - size_t buf_size = 40; - char* buf_ptr = 0; - - buf = (char*)icalmemory_new_buffer(buf_size); - buf_ptr = buf; - - - start = icaltime_as_ical_string(p.start); - - icalmemory_append_string(&buf, &buf_ptr, &buf_size, start); - - if(!icaltime_is_null_time(p.end)){ - end = icaltime_as_ical_string(p.end); - } else { - end = icaldurationtype_as_ical_string(p.duration); - } - - icalmemory_append_char(&buf, &buf_ptr, &buf_size, '/'); - - icalmemory_append_string(&buf, &buf_ptr, &buf_size, end); - - - return buf; -} - - - -struct icalperiodtype icalperiodtype_null_period() { - struct icalperiodtype p; - p.start = icaltime_null_time(); - p.end = icaltime_null_time(); - p.duration = icaldurationtype_null_duration(); - - return p; -} -int icalperiodtype_is_null_period(struct icalperiodtype p){ - - if(icaltime_is_null_time(p.start) && - icaltime_is_null_time(p.end) && - icaldurationtype_is_null_duration(p.duration)){ - return 1; - } else { - return 0; - } -} - -int icalperiodtype_is_valid_period(struct icalperiodtype p){ - if(icaltime_is_valid_time(p.start) && - (icaltime_is_valid_time(p.end) || icaltime_is_null_time(p.end)) ) - { - return 1; - } - - return 0; -} - diff --git a/libical/src/libical/icalperiod.h b/libical/src/libical/icalperiod.h deleted file mode 100644 index 64d53237ad..0000000000 --- a/libical/src/libical/icalperiod.h +++ /dev/null @@ -1,55 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalperiod.h - CREATOR: eric 26 Jan 2001 - - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The Original Code is eric. The Initial Developer of the Original - Code is Eric Busboom - - -======================================================================*/ - -#ifndef ICALPERIOD_H -#define ICALPERIOD_H - -#include "icaltime.h" -#include "icalduration.h" - -struct icalperiodtype -{ - struct icaltimetype start; - struct icaltimetype end; - struct icaldurationtype duration; -}; - -struct icalperiodtype icalperiodtype_from_string (const char* str); - -const char* icalperiodtype_as_ical_string(struct icalperiodtype p); -struct icalperiodtype icalperiodtype_null_period(); -int icalperiodtype_is_null_period(struct icalperiodtype p); -int icalperiodtype_is_valid_period(struct icalperiodtype p); - - - - -#endif /* !ICALTIME_H */ - - - diff --git a/libical/src/libical/icalproperty.c b/libical/src/libical/icalproperty.c deleted file mode 100644 index c5638827e5..0000000000 --- a/libical/src/libical/icalproperty.c +++ /dev/null @@ -1,808 +0,0 @@ -/* -*- Mode: C -*- */ - -/*====================================================================== - FILE: icalproperty.c - CREATOR: eric 28 April 1999 - - $Id$ - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icalproperty.c - -======================================================================*/ -/*#line 27 "icalproperty.c.in"*/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "icalproperty.h" -#include "icalparameter.h" -#include "icalcomponent.h" -#include "pvl.h" -#include "icalenums.h" -#include "icalerror.h" -#include "icalmemory.h" -#include "icalparser.h" - -#include <string.h> /* For icalmemory_strdup, rindex */ -#include <assert.h> -#include <stdlib.h> -#include <errno.h> -#include <stdio.h> /* for printf */ -#include <stdarg.h> /* for va_list, va_start, etc. */ - -#define TMP_BUF_SIZE 1024 - -/* Private routines for icalproperty */ -void icalvalue_set_parent(icalvalue* value, - icalproperty* property); -icalproperty* icalvalue_get_parent(icalvalue* value); - -void icalparameter_set_parent(icalparameter* param, - icalproperty* property); -icalproperty* icalparameter_get_parent(icalparameter* value); - - -void icalproperty_set_x_name(icalproperty* prop, char* name); - -struct icalproperty_impl -{ - char id[5]; - icalproperty_kind kind; - char* x_name; - pvl_list parameters; - pvl_elem parameter_iterator; - icalvalue* value; - icalcomponent *parent; -}; - -void icalproperty_add_parameters(struct icalproperty_impl *prop,va_list args) -{ - - void* vp; - - struct icalproperty_impl *impl = (struct icalproperty_impl*)prop; - - while((vp = va_arg(args, void*)) != 0) { - - if (icalvalue_isa_value(vp) != 0 ){ - } else if (icalparameter_isa_parameter(vp) != 0 ){ - - icalproperty_add_parameter((icalproperty*)impl, - (icalparameter*)vp); - } else { - assert(0); - } - - } - - -} - - -struct icalproperty_impl* -icalproperty_new_impl (icalproperty_kind kind) -{ - struct icalproperty_impl* prop; - - if ( ( prop = (struct icalproperty_impl*) - malloc(sizeof(struct icalproperty_impl))) == 0) { - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - strcpy(prop->id,"prop"); - - prop->kind = kind; - prop->parameters = pvl_newlist(); - prop->parameter_iterator = 0; - prop->value = 0; - prop->x_name = 0; - prop->parent = 0; - - return prop; -} - - -icalproperty* -icalproperty_new (icalproperty_kind kind) -{ - if(kind == ICAL_NO_PROPERTY){ - return 0; - } - - return (icalproperty*)icalproperty_new_impl(kind); -} - - -icalproperty* -icalproperty_new_clone(icalproperty* prop) -{ - struct icalproperty_impl *old = (struct icalproperty_impl*)prop; - struct icalproperty_impl *new = icalproperty_new_impl(old->kind); - pvl_elem p; - - icalerror_check_arg_rz((prop!=0),"Prop"); - icalerror_check_arg_rz((old!=0),"old"); - icalerror_check_arg_rz((new!=0),"new"); - - if (old->value !=0) { - new->value = icalvalue_new_clone(old->value); - } - - if (old->x_name != 0) { - - new->x_name = icalmemory_strdup(old->x_name); - - if (new->x_name == 0) { - icalproperty_free(new); - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - } - - for(p=pvl_head(old->parameters);p != 0; p = pvl_next(p)){ - icalparameter *param = icalparameter_new_clone(pvl_data(p)); - - if (param == 0){ - icalproperty_free(new); - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - pvl_push(new->parameters,param); - - } - - return new; - -} - -icalproperty* icalproperty_new_from_string(char* str) -{ - - size_t buf_size = 1024; - char* buf = icalmemory_new_buffer(buf_size); - char* buf_ptr = buf; - icalproperty *prop; - icalcomponent *comp; - int errors = 0; - - icalerror_check_arg_rz( (str!=0),"str"); - - /* Is this a HACK or a crafty reuse of code? */ - - icalmemory_append_string(&buf, &buf_ptr, &buf_size, "BEGIN:VCALENDAR\n"); - icalmemory_append_string(&buf, &buf_ptr, &buf_size, str); - icalmemory_append_string(&buf, &buf_ptr, &buf_size, "\n"); - icalmemory_append_string(&buf, &buf_ptr, &buf_size, "END:VCALENDAR\n"); - - comp = icalparser_parse_string(buf); - - if(comp == 0){ - icalerror_set_errno(ICAL_PARSE_ERROR); - return 0; - } - - errors = icalcomponent_count_errors(comp); - - prop = icalcomponent_get_first_property(comp,ICAL_ANY_PROPERTY); - - icalcomponent_remove_property(comp,prop); - - icalcomponent_free(comp); - free(buf); - - if(errors > 0){ - icalproperty_free(prop); - return 0; - } else { - return prop; - } - -} - -void -icalproperty_free (icalproperty* prop) -{ - struct icalproperty_impl *p; - - icalparameter* param; - - icalerror_check_arg_rv((prop!=0),"prop"); - - p = (struct icalproperty_impl*)prop; - -#ifdef ICAL_FREE_ON_LIST_IS_ERROR - icalerror_assert( (p->parent ==0),"Tried to free a property that is still attached to a component. "); - -#else - if(p->parent !=0){ - return; - } -#endif - - if (p->value != 0){ - icalvalue_set_parent(p->value,0); - icalvalue_free(p->value); - } - - while( (param = pvl_pop(p->parameters)) != 0){ - icalparameter_free(param); - } - - pvl_free(p->parameters); - - if (p->x_name != 0) { - free(p->x_name); - } - - p->kind = ICAL_NO_PROPERTY; - p->parameters = 0; - p->parameter_iterator = 0; - p->value = 0; - p->x_name = 0; - p->id[0] = 'X'; - - free(p); - -} - - -char* -icalproperty_as_ical_string (icalproperty* prop) -{ - icalparameter *param; - - /* Create new buffer that we can append names, parameters and a - value to, and reallocate as needed. Later, this buffer will be - copied to a icalmemory_tmp_buffer, which is managed internally - by libical, so it can be given to the caller without fear of - the caller forgetting to free it */ - - const char* property_name = 0; - size_t buf_size = 1024; - char* buf = icalmemory_new_buffer(buf_size); - char* buf_ptr = buf; - icalvalue* value; - char *out_buf; - - char newline[] = "\n"; - - struct icalproperty_impl *impl = (struct icalproperty_impl*)prop; - - icalerror_check_arg_rz( (prop!=0),"prop"); - - - /* Append property name */ - - if (impl->kind == ICAL_X_PROPERTY && impl->x_name != 0){ - property_name = impl->x_name; - } else { - property_name = icalproperty_kind_to_string(impl->kind); - } - - if (property_name == 0 ) { - icalerror_warn("Got a property of an unknown kind."); - icalmemory_free_buffer(buf); - return 0; - - } - - - icalmemory_append_string(&buf, &buf_ptr, &buf_size, property_name); - icalmemory_append_string(&buf, &buf_ptr, &buf_size, newline); - - - - /* Determine what VALUE parameter to include. The VALUE parameters - are ignored in the normal parameter printing ( the block after - this one, so we need to do it here */ - { - const char* kind_string = 0; - - icalparameter *orig_val_param - = icalproperty_get_first_parameter(prop,ICAL_VALUE_PARAMETER); - - icalvalue *value = icalproperty_get_value(impl); - - icalvalue_kind orig_kind = ICAL_NO_VALUE; - - icalvalue_kind this_kind = ICAL_NO_VALUE; - - icalvalue_kind default_kind - = icalproperty_kind_to_value_kind(impl->kind); - - if(orig_val_param){ - orig_kind = (icalvalue_kind)icalparameter_get_value(orig_val_param); - } - - if(value != 0){ - this_kind = icalvalue_isa(value); - } - - - if(this_kind == default_kind && - orig_kind != ICAL_NO_VALUE){ - /* The kind is the default, so it does not need to be - included, but do it anyway, since it was explicit in - the property. But, use the default, not the one - specified in the property */ - - kind_string = icalvalue_kind_to_string(default_kind); - - } else if (this_kind != default_kind && this_kind != ICAL_NO_VALUE){ - /* Not the default, so it must be specified */ - kind_string = icalvalue_kind_to_string(this_kind); - } else { - /* Don'tinclude the VALUE parameter at all */ - } - - if(kind_string!=0){ - icalmemory_append_string(&buf, &buf_ptr, &buf_size, " ;"); - icalmemory_append_string(&buf, &buf_ptr, &buf_size, "VALUE="); - icalmemory_append_string(&buf, &buf_ptr, &buf_size, kind_string); - icalmemory_append_string(&buf, &buf_ptr, &buf_size, newline); - } - - - } - - /* Append parameters */ - for(param = icalproperty_get_first_parameter(prop,ICAL_ANY_PARAMETER); - param != 0; - param = icalproperty_get_next_parameter(prop,ICAL_ANY_PARAMETER)) { - - char* kind_string = icalparameter_as_ical_string(param); - icalparameter_kind kind = icalparameter_isa(param); - - if(kind==ICAL_VALUE_PARAMETER){ - continue; - } - - if (kind_string == 0 ) { - char temp[TMP_BUF_SIZE]; - snprintf(temp, TMP_BUF_SIZE,"Got a parameter of unknown kind in %s property",property_name); - icalerror_warn(temp); - continue; - } - - icalmemory_append_string(&buf, &buf_ptr, &buf_size, " ;"); - icalmemory_append_string(&buf, &buf_ptr, &buf_size, kind_string); - icalmemory_append_string(&buf, &buf_ptr, &buf_size, newline); - - } - - /* Append value */ - - icalmemory_append_string(&buf, &buf_ptr, &buf_size, " :"); - - value = icalproperty_get_value(prop); - - if (value != 0){ - const char *str = icalvalue_as_ical_string(value); - icalerror_assert((str !=0),"Could not get string representation of a value"); - icalmemory_append_string(&buf, &buf_ptr, &buf_size, str); - } else { - icalmemory_append_string(&buf, &buf_ptr, &buf_size,"ERROR: No Value"); - - } - - icalmemory_append_string(&buf, &buf_ptr, &buf_size, newline); - - /* Now, copy the buffer to a tmp_buffer, which is safe to give to - the caller without worring about de-allocating it. */ - - - out_buf = icalmemory_tmp_buffer(strlen(buf)+1); - strcpy(out_buf, buf); - - icalmemory_free_buffer(buf); - - return out_buf; -} - - - -icalproperty_kind -icalproperty_isa (icalproperty* property) -{ - struct icalproperty_impl *p = (struct icalproperty_impl*)property; - - if(property != 0){ - return p->kind; - } - - return ICAL_NO_PROPERTY; -} - -int -icalproperty_isa_property (void* property) -{ - struct icalproperty_impl *impl = (struct icalproperty_impl*)property; - - icalerror_check_arg_rz( (property!=0), "property"); - - if (strcmp(impl->id,"prop") == 0) { - return 1; - } else { - return 0; - } -} - - -void -icalproperty_add_parameter (icalproperty* prop,icalparameter* parameter) -{ - struct icalproperty_impl *p = (struct icalproperty_impl*)prop; - - icalerror_check_arg_rv( (prop!=0),"prop"); - icalerror_check_arg_rv( (parameter!=0),"parameter"); - - pvl_push(p->parameters, parameter); - -} - -void -icalproperty_set_parameter (icalproperty* prop,icalparameter* parameter) -{ - icalparameter_kind kind; - - icalerror_check_arg_rv( (prop!=0),"prop"); - icalerror_check_arg_rv( (parameter!=0),"parameter"); - - kind = icalparameter_isa(parameter); - - icalproperty_remove_parameter(prop,kind); - - icalproperty_add_parameter(prop,parameter); -} - -void icalproperty_set_parameter_from_string(icalproperty* prop, - const char* name, const char* value) -{ - - icalparameter_kind kind; - icalparameter *param; - - icalerror_check_arg_rv( (prop!=0),"prop"); - icalerror_check_arg_rv( (name!=0),"name"); - icalerror_check_arg_rv( (value!=0),"value"); - - kind = icalparameter_string_to_kind(name); - - if(kind == ICAL_NO_PARAMETER){ - icalerror_set_errno(ICAL_BADARG_ERROR); - return; - } - - param = icalparameter_new_from_value_string(kind,value); - - if (param == 0){ - icalerror_set_errno(ICAL_BADARG_ERROR); - return; - } - - icalproperty_set_parameter(prop,param); - -} - -const char* icalproperty_get_parameter_as_string(icalproperty* prop, - const char* name) -{ - icalparameter_kind kind; - icalparameter *param; - char* str; - char* pv; - - icalerror_check_arg_rz( (prop!=0),"prop"); - icalerror_check_arg_rz( (name!=0),"name"); - - kind = icalparameter_string_to_kind(name); - - if(kind == ICAL_NO_PROPERTY){ - /* icalenum_string_to_parameter_kind will set icalerrno */ - return 0; - } - - param = icalproperty_get_first_parameter(prop,kind); - - if (param == 0){ - return 0; - } - - str = icalparameter_as_ical_string(param); - - pv = strchr(str,'='); - - if(pv == 0){ - icalerror_set_errno(ICAL_INTERNAL_ERROR); - return 0; - } - - return pv+1; - -} - -void -icalproperty_remove_parameter (icalproperty* prop, icalparameter_kind kind) -{ - pvl_elem p; - struct icalproperty_impl *impl = (struct icalproperty_impl*)prop; - - icalerror_check_arg_rv((prop!=0),"prop"); - - for(p=pvl_head(impl->parameters);p != 0; p = pvl_next(p)){ - icalparameter* param = (icalparameter *)pvl_data (p); - if (icalparameter_isa(param) == kind) { - pvl_remove (impl->parameters, p); - icalparameter_free (param); - break; - } - } -} - - -int -icalproperty_count_parameters (icalproperty* prop) -{ - struct icalproperty_impl *p = (struct icalproperty_impl*)prop; - - if(prop != 0){ - return pvl_count(p->parameters); - } - - icalerror_set_errno(ICAL_USAGE_ERROR); - return -1; -} - - -icalparameter* -icalproperty_get_first_parameter (icalproperty* prop, icalparameter_kind kind) -{ - struct icalproperty_impl *p = (struct icalproperty_impl*)prop; - - icalerror_check_arg_rz( (prop!=0),"prop"); - - p->parameter_iterator = pvl_head(p->parameters); - - if (p->parameter_iterator == 0) { - return 0; - } - - for( p->parameter_iterator = pvl_head(p->parameters); - p->parameter_iterator !=0; - p->parameter_iterator = pvl_next(p->parameter_iterator)){ - - icalparameter *param = (icalparameter*)pvl_data(p->parameter_iterator); - - if(icalparameter_isa(param) == kind || kind == ICAL_ANY_PARAMETER){ - return param; - } - } - - return 0; -} - - -icalparameter* -icalproperty_get_next_parameter (icalproperty* prop, icalparameter_kind kind) -{ - struct icalproperty_impl *p = (struct icalproperty_impl*)prop; - - icalerror_check_arg_rz( (prop!=0),"prop"); - - if (p->parameter_iterator == 0) { - return 0; - } - - for( p->parameter_iterator = pvl_next(p->parameter_iterator); - p->parameter_iterator !=0; - p->parameter_iterator = pvl_next(p->parameter_iterator)){ - - icalparameter *param = (icalparameter*)pvl_data(p->parameter_iterator); - - if(icalparameter_isa(param) == kind || kind == ICAL_ANY_PARAMETER){ - return param; - } - } - - return 0; - -} - -void -icalproperty_set_value (icalproperty* prop, icalvalue* value) -{ - struct icalproperty_impl *p = (struct icalproperty_impl*)prop; - - icalerror_check_arg_rv((prop !=0),"prop"); - icalerror_check_arg_rv((value !=0),"value"); - - if (p->value != 0){ - icalvalue_set_parent(p->value,0); - icalvalue_free(p->value); - p->value = 0; - } - - p->value = value; - - icalvalue_set_parent(value,prop); -} - - -void icalproperty_set_value_from_string(icalproperty* prop,const char* str, - const char* type) -{ - icalvalue *oval,*nval; - icalvalue_kind kind = ICAL_NO_VALUE; - - icalerror_check_arg_rv( (prop!=0),"prop"); - icalerror_check_arg_rv( (str!=0),"str"); - icalerror_check_arg_rv( (type!=0),"type"); - - if(strcmp(type,"NO")==0){ - /* Get the type from the value the property already has, if it exists */ - oval = icalproperty_get_value(prop); - if(oval != 0){ - /* Use the existing value kind */ - kind = icalvalue_isa(oval); - } else { - /* Use the default kind for the property */ - kind = icalproperty_kind_to_value_kind(icalproperty_isa(prop)); - } - } else { - /* Use the given kind string */ - kind = icalvalue_string_to_kind(type); - } - - if(kind == ICAL_NO_VALUE){ - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - return; - } - - nval = icalvalue_new_from_string(kind, str); - - if(nval == 0){ - /* icalvalue_new_from_string sets errno */ - assert(icalerrno != ICAL_NO_ERROR); - return; - } - - icalproperty_set_value(prop,nval); - - -} - -icalvalue* -icalproperty_get_value (icalproperty* prop) -{ - struct icalproperty_impl *p = (struct icalproperty_impl*)prop; - - icalerror_check_arg_rz( (prop!=0),"prop"); - - return p->value; -} - -const char* icalproperty_get_value_as_string(icalproperty* prop) -{ - icalvalue *value; - - struct icalproperty_impl *impl = (struct icalproperty_impl*)prop; - - icalerror_check_arg_rz( (prop!=0),"prop"); - - value = impl->value; - - return icalvalue_as_ical_string(value); -} - - -void icalproperty_set_x_name(icalproperty* prop, char* name) -{ - struct icalproperty_impl *impl = (struct icalproperty_impl*)prop; - - icalerror_check_arg_rv( (name!=0),"name"); - icalerror_check_arg_rv( (prop!=0),"prop"); - - if (impl->x_name != 0) { - free(impl->x_name); - } - - impl->x_name = icalmemory_strdup(name); - - if(impl->x_name == 0){ - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - } - -} - -char* icalproperty_get_x_name(icalproperty* prop){ - - struct icalproperty_impl *impl = (struct icalproperty_impl*)prop; - - icalerror_check_arg_rz( (prop!=0),"prop"); - - return impl->x_name; -} - - -/* From Jonathan Yue <jonathan.yue@cp.net> */ -char* icalproperty_get_name (icalproperty* prop) -{ - - const char* property_name = 0; - size_t buf_size = 256; - char* buf = icalmemory_new_buffer(buf_size); - char* buf_ptr = buf; - - struct icalproperty_impl *impl = (struct icalproperty_impl*)prop; - - icalerror_check_arg_rz( (prop!=0),"prop"); - - if (impl->kind == ICAL_X_PROPERTY && impl->x_name != 0){ - property_name = impl->x_name; - } else { - property_name = icalproperty_kind_to_string(impl->kind); - } - - if (property_name == 0 ) { - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - return 0; - - } else { - /* _append_string will automatically grow the buffer if - property_name is longer than the initial buffer size */ - icalmemory_append_string(&buf, &buf_ptr, &buf_size, property_name); - } - - /* Add the buffer to the temporary buffer ring -- the caller will - not have to free the memory. */ - icalmemory_add_tmp_buffer(buf); - - return buf; -} - - - - -void icalproperty_set_parent(icalproperty* property, - icalcomponent* component) -{ - struct icalproperty_impl *impl = (struct icalproperty_impl*)property; - - icalerror_check_arg_rv( (property!=0),"property"); - - impl->parent = component; -} - -icalcomponent* icalproperty_get_parent(icalproperty* property) -{ - struct icalproperty_impl *impl = (struct icalproperty_impl*)property; - - icalerror_check_arg_rz( (property!=0),"property"); - - return impl->parent; -} - - - - - - - -/* Everything below this line is machine generated. Do not edit. */ diff --git a/libical/src/libical/icalproperty.h b/libical/src/libical/icalproperty.h deleted file mode 100644 index 6f5f1bfaef..0000000000 --- a/libical/src/libical/icalproperty.h +++ /dev/null @@ -1,116 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalproperty.h - CREATOR: eric 20 March 1999 - - - $Id$ - $Locker$ - - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icalparam.h - - ======================================================================*/ - - -#ifndef ICALPROPERTY_H -#define ICALPROPERTY_H - -#include <time.h> - - -#include "icalderivedparameter.h" - -#include "icalvalue.h" -#include "icalrecur.h" - -/* Actually in icalderivedproperty.h: - typedef void icalproperty; */ - -#include "icalderivedproperty.h" /* To get icalproperty_kind enumerations */ - -icalproperty* icalproperty_new(icalproperty_kind kind); - -icalproperty* icalproperty_new_clone(icalproperty * prop); - -icalproperty* icalproperty_new_from_string(char* str); - -char* icalproperty_as_ical_string(icalproperty* prop); - -void icalproperty_free(icalproperty* prop); - -icalproperty_kind icalproperty_isa(icalproperty* property); -int icalproperty_isa_property(void* property); - -void icalproperty_add_parameter(icalproperty* prop,icalparameter* parameter); -void icalproperty_set_parameter(icalproperty* prop,icalparameter* parameter); -void icalproperty_set_parameter_from_string(icalproperty* prop, - const char* name, const char* value); -const char* icalproperty_get_parameter_as_string(icalproperty* prop, - const char* name); - -void icalproperty_remove_parameter(icalproperty* prop, - icalparameter_kind kind); - -int icalproperty_count_parameters(icalproperty* prop); - -/* Iterate through the parameters */ -icalparameter* icalproperty_get_first_parameter(icalproperty* prop, - icalparameter_kind kind); -icalparameter* icalproperty_get_next_parameter(icalproperty* prop, - icalparameter_kind kind); -/* Access the value of the property */ -void icalproperty_set_value(icalproperty* prop, icalvalue* value); -void icalproperty_set_value_from_string(icalproperty* prop,const char* value, const char* kind); - -icalvalue* icalproperty_get_value(icalproperty* prop); -const char* icalproperty_get_value_as_string(icalproperty* prop); - -/* Deal with X properties */ - -void icalproperty_set_x_name(icalproperty* prop, char* name); -char* icalproperty_get_x_name(icalproperty* prop); - -/* Return the name of the property -- the type name converted to a - string, or the value of _get_x_name if the type is and X property */ -char* icalproperty_get_name (icalproperty* prop); - -icalvalue_kind icalparameter_value_to_value_kind(icalparameter_value value); - -/* Convert kinds to string and get default value type */ - -icalvalue_kind icalproperty_kind_to_value_kind(icalproperty_kind kind); -icalvalue_kind icalproperty_value_kind_to_kind(icalvalue_kind kind); -const char* icalproperty_kind_to_string(icalproperty_kind kind); -icalproperty_kind icalproperty_string_to_kind(const char* string); - -icalproperty_method icalproperty_string_to_method(const char* str); -const char* icalproperty_method_to_string(icalproperty_method method); - - -const char* icalproperty_enum_to_string(int e); -int icalproperty_string_to_enum(const char* str); - -const char* icalproperty_status_to_string(icalproperty_status); -icalproperty_status icalproperty_string_to_status(const char* string); - -int icalproperty_enum_belongs_to_property(icalproperty_kind kind, int e); - - - - -#endif /*ICALPROPERTY_H*/ diff --git a/libical/src/libical/icalrecur.c b/libical/src/libical/icalrecur.c deleted file mode 100644 index 51fdf63a79..0000000000 --- a/libical/src/libical/icalrecur.c +++ /dev/null @@ -1,2258 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: icalrecur.c - CREATOR: eric 16 May 2000 - - $Id$ - $Locker$ - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - - How this code works: - - Processing starts when the caller generates a new recurrence - iterator via icalrecur_iterator_new(). This routine copies the - recurrence rule into the iterator and extracts things like start and - end dates. Then, it checks if the rule is legal, using some logic - from RFC2445 and some logic that probably should be in RFC2445. - - Then, icalrecur_iterator_new() re-writes some of the BY* - arrays. This involves ( via a call to setup_defaults() ) : - - 1) For BY rule parts with no data ( ie BYSECOND was not specified ) - copy the corresponding time part from DTSTART into the BY array. ( - So impl->by_ptrs[BY_SECOND] will then have one element if is - originally had none ) This only happens if the BY* rule part data - would expand the number of occurrences in the occurrence set. This - lets the code ignore DTSTART later on and still use it to get the - time parts that were not specified in any other way. - - 2) For the by rule part that are not the same interval as the - frequency -- for HOURLY anything but BYHOUR, for instance -- copy the - first data element from the rule part into the first occurrence. For - example, for "INTERVAL=MONTHLY and BYHOUR=10,30", initialize the - first time to be returned to have an hour of 10. - - Finally, for INTERVAL=YEARLY, the routine expands the rule to get - all of the days specified in the rule. The code will do this for - each new year, and this is the first expansion. This is a special - case for the yearly interval; no other frequency gets expanded this - way. The yearly interval is the most complex, so some special - processing is required. - - After creating a new iterator, the caller will make successive calls - to icalrecur_iterator_next() to get the next time specified by the - rule. The main part of this routine is a switch on the frequency of - the rule. Each different frequency is handled by a different - routine. - - For example, next_hour handles the case of INTERVAL=HOURLY, and it - is called by other routines to get the next hour. First, the routine - tries to get the next minute part of a time with a call to - next_minute(). If next_minute() returns 1, it has reached the end of - its data, usually the last element of the BYMINUTE array. Then, if - there is data in the BYHOUR array, the routine changes the hour to - the next one in the array. If INTERVAL=HOURLY, the routine advances - the hour by the interval. - - If the routine used the last hour in the BYHOUR array, and the - INTERVAL=HOURLY, then the routine calls increment_monthday() to set - the next month day. The increment_* routines may call higher routine - to increment the month or year also. - - The code for INTERVAL=DAILY is handled by next_day(). First, the - routine tries to get the next hour part of a time with a call to - next_hour. If next_hour() returns 1, it has reached the end of its - data, usually the last element of the BYHOUR array. This means that - next_day() should increment the time to the next day. If FREQUENCY==DAILY, - the routine increments the day by the interval; otherwise, it - increments the day by 1. - - Next_day() differs from next_hour because it does not use the BYDAY - array to select an appropriate day. Instead, it returns every day ( - incrementing by 1 if the frequency is not DAILY with INTERVAL!=1) - Any days that are not specified in an non-empty BYDAY array are - filtered out later. - - Generally, the flow of these routine is for a next_* call a next_* - routine of a lower interval ( next_day calls next_hour) and then to - possibly call an increment_* routine of an equal or higher - interval. ( next_day calls increment_monthday() ) - - When the call to the original next_* routine returns, - icalrecur_iterator_next() will check the returned data against other - BYrule parts to determine if is should be excluded by calling - check_contracting_rules. Generally, a contracting rule is any with a - larger time span than the interval. For instance, if - INTERVAL=DAILY, BYMONTH is a contracting rule part. - - Check_contracting_rules() uses icalrecur_check_rulepart() to do its - work. icalrecur_check_rulepart() uses expand_map[] to determine if a rule - is contracting, and if it is, and if the BY rule part has some data, - then the routine checks if the value of a component of the time is - part of the byrule part. For instance, for "INTERVAL=DAILY; - BYMONTH=6,10", icalrecur_check_rulepart() would check that the time value - given to it has a month of either 6 or 10. - - Finally, icalrecur_iterator_next() does a few other checks on the - time value, and if it passes, it returns the time. - - A note about the end_of_data flag. The flag indicates that the - routine is at the end of its data -- the last BY rule if the routine - is using by rules, or the last day of the week/month/year/etc if - not. - - This flag is usually set early in a next_* routine and returned in - the end. The way it is used allows the next_* routine to set the - last time back to the first element in a BYxx rule, and then signal - to the higer level routine to increment the next higher level. For - instance. WITH FREQ=MONTHLY;BYDAY=TU,FR, After next_weekday_by_month - runs though both TU and FR, it sets the week day back to TU and sets - end_of_data to 1x. This signals next_month to increment the month. - - - ======================================================================*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "icalrecur.h" - -#ifdef ICAL_NO_LIBICAL -#define icalerror_set_errno(x) -#define icalerror_check_arg_rv(x,y) -#else -#include "icalerror.h" -#include "icalmemory.h" -#endif - -#include <stdlib.h> /* for malloc */ -#include <errno.h> /* for errno */ -#include <string.h> /* for strdup and strchr*/ -#include <assert.h> -#include <stddef.h> /* For offsetof() macro */ - -#include "pvl.h" - -#define TEMP_MAX 1024 - - -#define BYDAYIDX impl->by_indices[BY_DAY] -#define BYDAYPTR impl->by_ptrs[BY_DAY] - -#define BYMONIDX impl->by_indices[BY_MONTH] -#define BYMONPTR impl->by_ptrs[BY_MONTH] - -#define BYMDIDX impl->by_indices[BY_MONTH_DAY] -#define BYMDPTR impl->by_ptrs[BY_MONTH_DAY] - -#define BYWEEKIDX impl->by_indices[BY_WEEK_NO] -#define BYWEEKPTR impl->by_ptrs[BY_WEEK_NO] - -const char* icalrecur_freq_to_string(icalrecurrencetype_frequency kind); -icalrecurrencetype_frequency icalrecur_string_to_freq(const char* str); - -const char* icalrecur_weekday_to_string(icalrecurrencetype_weekday kind); -icalrecurrencetype_weekday icalrecur_string_to_weekday(const char* str); - - - -/*********************** Rule parsing routines ************************/ - -struct icalrecur_parser { - const char* rule; - char* copy; - char* this_clause; - char* next_clause; - - struct icalrecurrencetype rt; -}; - -const char* icalrecur_first_clause(struct icalrecur_parser *parser) -{ - char *idx; - parser->this_clause = parser->copy; - - idx = strchr(parser->this_clause,';'); - - if (idx == 0){ - parser->next_clause = 0; - return 0; - } - - *idx = 0; - idx++; - parser->next_clause = idx; - - return parser->this_clause; - -} - -const char* icalrecur_next_clause(struct icalrecur_parser *parser) -{ - char* idx; - - parser->this_clause = parser->next_clause; - - if(parser->this_clause == 0){ - return 0; - } - - idx = strchr(parser->this_clause,';'); - - if (idx == 0){ - parser->next_clause = 0; - } else { - - *idx = 0; - idx++; - parser->next_clause = idx; - } - - return parser->this_clause; - -} - -void icalrecur_clause_name_and_value(struct icalrecur_parser *parser, - char** name, char** value) -{ - char *idx; - - *name = parser->this_clause; - - idx = strchr(parser->this_clause,'='); - - if (idx == 0){ - *name = 0; - *value = 0; - return; - } - - *idx = 0; - idx++; - *value = idx; -} - -void icalrecur_add_byrules(struct icalrecur_parser *parser, short *array, - int size, char* vals) -{ - char *t, *n; - int i=0; - int sign = 1; - short v; - - n = vals; - - while(n != 0){ - - if(i == size){ - return; - } - - t = n; - - n = strchr(t,','); - - if(n != 0){ - *n = 0; - n++; - } - - /* Get optional sign. HACK. sign is not allowed for all BYxxx - rule parts */ - if( *t == '-'){ - sign = -1; - t++; - } else if (*t == '+'){ - sign = 1; - t++; - } - - v = atoi(t) * sign ; - - - array[i++] = v; - array[i] = ICAL_RECURRENCE_ARRAY_MAX; - - } - -} - -void icalrecur_add_bydayrules(struct icalrecur_parser *parser, const char* vals) -{ - - char *t, *n; - int i=0; - int sign = 1; - int weekno = 0; - icalrecurrencetype_weekday wd; - short *array = parser->rt.by_day; - char* end; - char* vals_copy; - - vals_copy = icalmemory_strdup(vals); - - end = (char*)vals_copy+strlen(vals_copy); - n = vals_copy; - - while(n != 0){ - - - t = n; - - n = strchr(t,','); - - if(n != 0){ - *n = 0; - n++; - } - - /* Get optional sign. */ - if( *t == '-'){ - sign = -1; - t++; - } else if (*t == '+'){ - sign = 1; - t++; - } else { - sign = 1; - } - - weekno = 0; - /* Get Optional weekno */ - if( sscanf(t,"%d",&weekno) != 0){ - if (n != 0){ - int weeknolen = (n-t)-3; /* 3 -> one for \0, 2 for day name */ - /* could use abs(log10(weekno))+1, but that needs libm */ - t += weeknolen; - } else { - t = end -2; - } - } - - wd = icalrecur_string_to_weekday(t); - - array[i++] = sign* ((int)wd + 8*weekno); - array[i] = ICAL_RECURRENCE_ARRAY_MAX; - - } - - free(vals_copy); - -} - - -struct icalrecurrencetype icalrecurrencetype_from_string(const char* str) -{ - struct icalrecur_parser parser; - - memset(&parser,0,sizeof(parser)); - icalrecurrencetype_clear(&parser.rt); - - icalerror_check_arg_re(str!=0,"str",parser.rt); - - - /* Set up the parser struct */ - parser.rule = str; - parser.copy = icalmemory_strdup(parser.rule); - parser.this_clause = parser.copy; - - if(parser.copy == 0){ - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return parser.rt; - } - - /* Loop through all of the clauses */ - for(icalrecur_first_clause(&parser); - parser.this_clause != 0; - icalrecur_next_clause(&parser)) - { - char *name, *value; - icalrecur_clause_name_and_value(&parser,&name,&value); - - if(name == 0){ - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - icalrecurrencetype_clear(&parser.rt); - return parser.rt; - } - - if (strcmp(name,"FREQ") == 0){ - parser.rt.freq = icalrecur_string_to_freq(value); - } else if (strcmp(name,"COUNT") == 0){ - parser.rt.count = atoi(value); - } else if (strcmp(name,"UNTIL") == 0){ - parser.rt.until = icaltime_from_string(value); - } else if (strcmp(name,"INTERVAL") == 0){ - parser.rt.interval = atoi(value); - } else if (strcmp(name,"WKST") == 0){ - parser.rt.week_start = icalrecur_string_to_weekday(value); - } else if (strcmp(name,"BYSECOND") == 0){ - icalrecur_add_byrules(&parser,parser.rt.by_second, - ICAL_BY_SECOND_SIZE,value); - } else if (strcmp(name,"BYMINUTE") == 0){ - icalrecur_add_byrules(&parser,parser.rt.by_minute, - ICAL_BY_MINUTE_SIZE,value); - } else if (strcmp(name,"BYHOUR") == 0){ - icalrecur_add_byrules(&parser,parser.rt.by_hour, - ICAL_BY_HOUR_SIZE,value); - } else if (strcmp(name,"BYDAY") == 0){ - icalrecur_add_bydayrules(&parser,value); - } else if (strcmp(name,"BYMONTHDAY") == 0){ - icalrecur_add_byrules(&parser,parser.rt.by_month_day, - ICAL_BY_MONTHDAY_SIZE,value); - } else if (strcmp(name,"BYYEARDAY") == 0){ - icalrecur_add_byrules(&parser,parser.rt.by_year_day, - ICAL_BY_YEARDAY_SIZE,value); - } else if (strcmp(name,"BYWEEKNO") == 0){ - icalrecur_add_byrules(&parser,parser.rt.by_week_no, - ICAL_BY_WEEKNO_SIZE,value); - } else if (strcmp(name,"BYMONTH") == 0){ - icalrecur_add_byrules(&parser,parser.rt.by_month, - ICAL_BY_MONTH_SIZE,value); - } else if (strcmp(name,"BYSETPOS") == 0){ - icalrecur_add_byrules(&parser,parser.rt.by_set_pos, - ICAL_BY_SETPOS_SIZE,value); - } else { - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - icalrecurrencetype_clear(&parser.rt); - return parser.rt; - } - - } - - free(parser.copy); - - return parser.rt; - -} - -#ifndef ICAL_NO_LIBICAL - -struct { char* str;size_t offset; short limit; } recurmap[] = -{ - {";BYSECOND=",offsetof(struct icalrecurrencetype,by_second),60}, - {";BYMINUTE=",offsetof(struct icalrecurrencetype,by_minute),60}, - {";BYHOUR=",offsetof(struct icalrecurrencetype,by_hour),24}, - {";BYDAY=",offsetof(struct icalrecurrencetype,by_day),7}, - {";BYMONTHDAY=",offsetof(struct icalrecurrencetype,by_month_day),31}, - {";BYYEARDAY=",offsetof(struct icalrecurrencetype,by_year_day),366}, - {";BYWEEKNO=",offsetof(struct icalrecurrencetype,by_week_no),52}, - {";BYMONTH=",offsetof(struct icalrecurrencetype,by_month),12}, - {";BYSETPOS=",offsetof(struct icalrecurrencetype,by_set_pos),366}, - {0,0,0}, -}; - -/* A private routine in icalvalue.c */ -void print_datetime_to_string(char* str, struct icaltimetype *data); - -char* icalrecurrencetype_as_string(struct icalrecurrencetype *recur) -{ - char* str; - char *str_p; - size_t buf_sz = 200; - char temp[20]; - int i,j; - - if(recur->freq == ICAL_NO_RECURRENCE){ - return 0; - } - - str = (char*)icalmemory_tmp_buffer(buf_sz); - str_p = str; - - icalmemory_append_string(&str,&str_p,&buf_sz,"FREQ="); - icalmemory_append_string(&str,&str_p,&buf_sz, - icalrecur_freq_to_string(recur->freq)); - - if(recur->until.year != 0){ - - temp[0] = 0; - print_datetime_to_string(temp,&(recur->until)); - - icalmemory_append_string(&str,&str_p,&buf_sz,";UNTIL="); - icalmemory_append_string(&str,&str_p,&buf_sz, temp); - } - - if(recur->count != 0){ - sprintf(temp,"%d",recur->count); - icalmemory_append_string(&str,&str_p,&buf_sz,";COUNT="); - icalmemory_append_string(&str,&str_p,&buf_sz, temp); - } - - if(recur->interval != 0){ - sprintf(temp,"%d",recur->interval); - icalmemory_append_string(&str,&str_p,&buf_sz,";INTERVAL="); - icalmemory_append_string(&str,&str_p,&buf_sz, temp); - } - - for(j =0; recurmap[j].str != 0; j++){ - short* array = (short*)(recurmap[j].offset+ (size_t)recur); - short limit = recurmap[j].limit; - - /* Skip unused arrays */ - if( array[0] != ICAL_RECURRENCE_ARRAY_MAX ) { - - icalmemory_append_string(&str,&str_p,&buf_sz,recurmap[j].str); - - for(i=0; - i< limit && array[i] != ICAL_RECURRENCE_ARRAY_MAX; - i++){ - if (j == 3) { /* BYDAY */ - short dow = icalrecurrencetype_day_day_of_week(array[i]); - const char *daystr = icalrecur_weekday_to_string(dow); - short pos; - - pos = icalrecurrencetype_day_position(array[i]); - - if (pos == 0) - icalmemory_append_string(&str,&str_p,&buf_sz,daystr); - else { - sprintf(temp,"%d%s",pos,daystr); - icalmemory_append_string(&str,&str_p,&buf_sz,temp); - } - - } else { - sprintf(temp,"%d",array[i]); - icalmemory_append_string(&str,&str_p,&buf_sz, temp); - } - - if( (i+1)<limit &&array[i+1] - != ICAL_RECURRENCE_ARRAY_MAX){ - icalmemory_append_char(&str,&str_p,&buf_sz,','); - } - } - } - } - - return str; -} -#endif - - - -/************************* occurrence iteration routiens ******************/ - -enum byrule { - NO_CONTRACTION = -1, - BY_SECOND = 0, - BY_MINUTE = 1, - BY_HOUR = 2, - BY_DAY = 3, - BY_MONTH_DAY = 4, - BY_YEAR_DAY = 5, - BY_WEEK_NO = 6, - BY_MONTH = 7, - BY_SET_POS -}; - - - -struct icalrecur_iterator_impl { - - struct icaltimetype dtstart; /* Hack. Make into time_t */ - struct icaltimetype last; /* last time return from _iterator_next*/ - int occurrence_no; /* number of step made on t iterator */ - struct icalrecurrencetype rule; - - short days[366]; - short days_index; - - enum byrule byrule; - short by_indices[9]; - short orig_data[9]; /* 1 if there was data in the byrule */ - - - short *by_ptrs[9]; /* Pointers into the by_* array elements of the rule */ - -}; - -int icalrecur_iterator_sizeof_byarray(short* byarray) -{ - int array_itr; - - for(array_itr = 0; - byarray[array_itr] != ICAL_RECURRENCE_ARRAY_MAX; - array_itr++){ - } - - return array_itr; -} - -enum expand_table { - UNKNOWN = 0, - CONTRACT = 1, - EXPAND =2, - ILLEGAL=3 -}; - -/* The split map indicates, for a particular interval, wether a BY_* - rule part expands the number of instances in the occcurrence set or - contracts it. 1=> contract, 2=>expand, and 3 means the pairing is - not allowed. */ -struct expand_split_map_struct -{ - icalrecurrencetype_frequency frequency; - - /* Elements of the 'map' array correspond to the BYxxx rules: - Second,Minute,Hour,Day,Month Day,Year Day,Week No,Month*/ - - short map[8]; -}; - -struct expand_split_map_struct expand_map[] = -{ - {ICAL_SECONDLY_RECURRENCE,{1,1,1,1,1,1,1,1}}, - {ICAL_MINUTELY_RECURRENCE,{2,1,1,1,1,1,1,1}}, - {ICAL_HOURLY_RECURRENCE, {2,2,1,1,1,1,1,1}}, - {ICAL_DAILY_RECURRENCE, {2,2,2,1,1,1,1,1}}, - {ICAL_WEEKLY_RECURRENCE, {2,2,2,2,3,3,1,1}}, - {ICAL_MONTHLY_RECURRENCE, {2,2,2,2,2,3,3,1}}, - {ICAL_YEARLY_RECURRENCE, {2,2,2,2,2,2,2,2}}, - {ICAL_NO_RECURRENCE, {0,0,0,0,0,0,0,0}} - -}; - - - -/* Check that the rule has only the two given interday byrule parts. */ -int icalrecur_two_byrule(struct icalrecur_iterator_impl* impl, - enum byrule one,enum byrule two) -{ - short test_array[9]; - enum byrule itr; - int passes = 0; - - memset(test_array,0,9); - - test_array[one] = 1; - test_array[two] = 1; - - for(itr = BY_DAY; itr != BY_SET_POS; itr++){ - - if( (test_array[itr] == 0 && - impl->by_ptrs[itr][0] != ICAL_RECURRENCE_ARRAY_MAX - ) || - (test_array[itr] == 1 && - impl->by_ptrs[itr][0] == ICAL_RECURRENCE_ARRAY_MAX - ) - ) { - /* test failed */ - passes = 0; - } - } - - return passes; - -} - -/* Check that the rule has only the one given interdat byrule parts. */ -int icalrecur_one_byrule(struct icalrecur_iterator_impl* impl,enum byrule one) -{ - int passes = 1; - enum byrule itr; - - for(itr = BY_DAY; itr != BY_SET_POS; itr++){ - - if ((itr==one && impl->by_ptrs[itr][0] == ICAL_RECURRENCE_ARRAY_MAX) || - (itr!=one && impl->by_ptrs[itr][0] != ICAL_RECURRENCE_ARRAY_MAX)) { - passes = 0; - } - } - - return passes; -} - -int count_byrules(struct icalrecur_iterator_impl* impl) -{ - int count = 0; - enum byrule itr; - - for(itr = BY_DAY; itr <= BY_SET_POS; itr++){ - if(impl->by_ptrs[itr][0] != ICAL_RECURRENCE_ARRAY_MAX){ - count++; - } - } - - return count; -} - - -void setup_defaults(struct icalrecur_iterator_impl* impl, - enum byrule byrule, icalrecurrencetype_frequency req, - short deftime, int *timepart) -{ - - icalrecurrencetype_frequency freq; - freq = impl->rule.freq; - - /* Re-write the BY rule arrays with data from the DTSTART time so - we don't have to explicitly deal with DTSTART */ - - if(impl->by_ptrs[byrule][0] == ICAL_RECURRENCE_ARRAY_MAX && - expand_map[freq].map[byrule] != CONTRACT){ - impl->by_ptrs[byrule][0] = deftime; - } - - /* Initialize the first occurence */ - if( freq != req && expand_map[freq].map[byrule] != CONTRACT){ - *timepart = impl->by_ptrs[byrule][0]; - } - - -} - -int has_by_data(struct icalrecur_iterator_impl* impl, enum byrule byrule){ - - return (impl->orig_data[byrule] == 1); -} - - -int expand_year_days(struct icalrecur_iterator_impl* impl,short year); - - -icalrecur_iterator* icalrecur_iterator_new(struct icalrecurrencetype rule, - struct icaltimetype dtstart) -{ - struct icalrecur_iterator_impl* impl; - icalrecurrencetype_frequency freq; - - short days_in_month; - - if ( ( impl = (struct icalrecur_iterator_impl *) - malloc(sizeof(struct icalrecur_iterator_impl))) == 0) { - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - memset(impl,0,sizeof(struct icalrecur_iterator_impl)); - - impl->rule = rule; - impl->last = dtstart; - impl->dtstart = dtstart; - impl->days_index =0; - impl->occurrence_no = 0; - freq = impl->rule.freq; - - /* Set up convienience pointers to make the code simpler. Allows - us to iterate through all of the BY* arrays in the rule. */ - - impl->by_ptrs[BY_MONTH]=impl->rule.by_month; - impl->by_ptrs[BY_WEEK_NO]=impl->rule.by_week_no; - impl->by_ptrs[BY_YEAR_DAY]=impl->rule.by_year_day; - impl->by_ptrs[BY_MONTH_DAY]=impl->rule.by_month_day; - impl->by_ptrs[BY_DAY]=impl->rule.by_day; - impl->by_ptrs[BY_HOUR]=impl->rule.by_hour; - impl->by_ptrs[BY_MINUTE]=impl->rule.by_minute; - impl->by_ptrs[BY_SECOND]=impl->rule.by_second; - impl->by_ptrs[BY_SET_POS]=impl->rule.by_set_pos; - - memset(impl->orig_data,0,9); - - /* Note which by rules had data in them when the iterator was - created. We can't use the actuall by_x arrays, because the - empty ones will be given default values later in this - routine. The orig_data array will be used later in has_by_data */ - - impl->orig_data[BY_MONTH] - = (impl->rule.by_month[0]!=ICAL_RECURRENCE_ARRAY_MAX); - impl->orig_data[BY_WEEK_NO] - =(impl->rule.by_week_no[0]!=ICAL_RECURRENCE_ARRAY_MAX); - impl->orig_data[BY_YEAR_DAY] - =(impl->rule.by_year_day[0]!=ICAL_RECURRENCE_ARRAY_MAX); - impl->orig_data[BY_MONTH_DAY] - =(impl->rule.by_month_day[0]!=ICAL_RECURRENCE_ARRAY_MAX); - impl->orig_data[BY_DAY] - = (impl->rule.by_day[0]!=ICAL_RECURRENCE_ARRAY_MAX); - impl->orig_data[BY_HOUR] - = (impl->rule.by_hour[0]!=ICAL_RECURRENCE_ARRAY_MAX); - impl->orig_data[BY_MINUTE] - = (impl->rule.by_minute[0]!=ICAL_RECURRENCE_ARRAY_MAX); - impl->orig_data[BY_SECOND] - = (impl->rule.by_second[0]!=ICAL_RECURRENCE_ARRAY_MAX); - impl->orig_data[BY_SET_POS] - = (impl->rule.by_set_pos[0]!=ICAL_RECURRENCE_ARRAY_MAX); - - - /* Check if the recurrence rule is legal */ - - /* If the BYYEARDAY appears, no other date rule part may appear. */ - - if(icalrecur_two_byrule(impl,BY_YEAR_DAY,BY_MONTH) || - icalrecur_two_byrule(impl,BY_YEAR_DAY,BY_WEEK_NO) || - icalrecur_two_byrule(impl,BY_YEAR_DAY,BY_MONTH_DAY) || - icalrecur_two_byrule(impl,BY_YEAR_DAY,BY_DAY) ){ - - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - - return 0; - } - - /* BYWEEKNO and BYMONTH rule parts may not both appear.*/ - - if(icalrecur_two_byrule(impl,BY_WEEK_NO,BY_MONTH)){ - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - return 0; - } - - /* BYWEEKNO and BYMONTHDAY rule parts may not both appear.*/ - - if(icalrecur_two_byrule(impl,BY_WEEK_NO,BY_MONTH_DAY)){ - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - return 0; - } - - - /*For MONTHLY recurrences (FREQ=MONTHLY) neither BYYEARDAY nor - BYWEEKNO may appear. */ - - if(freq == ICAL_MONTHLY_RECURRENCE && - icalrecur_one_byrule(impl,BY_WEEK_NO)){ - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - return 0; - } - - - /*For WEEKLY recurrences (FREQ=WEEKLY) neither BYMONTHDAY nor - BYYEARDAY may appear. */ - - if(freq == ICAL_WEEKLY_RECURRENCE && - icalrecur_one_byrule(impl,BY_MONTH_DAY )) { - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - return 0; - } - - /* BYYEARDAY may only appear in YEARLY rules */ - if(freq != ICAL_YEARLY_RECURRENCE && - icalrecur_one_byrule(impl,BY_YEAR_DAY )) { - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - return 0; - } - - /* Rewrite some of the rules and set up defaults to make later - processing easier. Primarily, t involves copying an element - from the start time into the coresponding BY_* array when the - BY_* array is empty */ - - - setup_defaults(impl,BY_SECOND,ICAL_SECONDLY_RECURRENCE,impl->dtstart.second, - &(impl->last.second)); - - setup_defaults(impl,BY_MINUTE,ICAL_MINUTELY_RECURRENCE,impl->dtstart.minute, - &(impl->last.minute)); - - setup_defaults(impl,BY_HOUR,ICAL_HOURLY_RECURRENCE,impl->dtstart.hour, - &(impl->last.hour)); - - setup_defaults(impl,BY_MONTH_DAY,ICAL_DAILY_RECURRENCE,impl->dtstart.day, - &(impl->last.day)); - - setup_defaults(impl,BY_MONTH,ICAL_MONTHLY_RECURRENCE,impl->dtstart.month, - &(impl->last.month)); - - - if(impl->rule.freq == ICAL_WEEKLY_RECURRENCE ){ - - if(impl->by_ptrs[BY_DAY][0] == ICAL_RECURRENCE_ARRAY_MAX){ - - /* Weekly recurrences with no BY_DAY data should occur on the - same day of the week as the start time . */ - impl->by_ptrs[BY_DAY][0] = icaltime_day_of_week(impl->dtstart); - - } else { - /* If there is BY_DAY data, then we need to move the initial - time to the start of the BY_DAY data. That is if the - start time is on a Wednesday, and the rule has - BYDAY=MO,WE,FR, move the initial time back to - monday. Otherwise, jumping to the next week ( jumping 7 - days ahead ) will skip over some occurrences in the - second week. */ - - /* This is probably a HACK. There should be some more - general way to solve this problem */ - - short dow = impl->by_ptrs[BY_DAY][0]-icaltime_day_of_week(impl->last); - - if(dow < 0) { - /* initial time is after first day of BY_DAY data */ - - impl->last.day += dow; - impl->last = icaltime_normalize(impl->last); - } - } - - - } - - /* For YEARLY rule, begin by setting up the year days array */ - - if(impl->rule.freq == ICAL_YEARLY_RECURRENCE){ - expand_year_days(impl,impl->last.year); - } - - - /* If this is a monthly interval with by day data, then we need to - set the last value to the appropriate day of the month */ - - if(impl->rule.freq == ICAL_MONTHLY_RECURRENCE && - has_by_data(impl,BY_DAY)) { - - short dow = icalrecurrencetype_day_day_of_week( - impl->by_ptrs[BY_DAY][impl->by_indices[BY_DAY]]); - short pos = icalrecurrencetype_day_position( - impl->by_ptrs[BY_DAY][impl->by_indices[BY_DAY]]); - - short poscount = 0; - days_in_month = - icaltime_days_in_month(impl->last.month, impl->last.year); - - if(pos >= 0){ - /* Count up from the first day pf the month to find the - pos'th weekday of dow ( like the second monday. ) */ - - for(impl->last.day = 1; - impl->last.day <= days_in_month; - impl->last.day++){ - - if(icaltime_day_of_week(impl->last) == dow){ - if(++poscount == pos || pos == 0){ - break; - } - } - } - } else { - /* Count down from the last day pf the month to find the - pos'th weekday of dow ( like the second to last monday. ) */ - pos = -pos; - for(impl->last.day = days_in_month; - impl->last.day != 0; - impl->last.day--){ - - if(icaltime_day_of_week(impl->last) == dow){ - if(++poscount == pos ){ - break; - } - } - } - } - - - if(impl->last.day > days_in_month || impl->last.day == 0){ - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - return 0; - } - - } - - - - return impl; -} - - -void icalrecur_iterator_free(icalrecur_iterator* i) -{ - - struct icalrecur_iterator_impl* impl = - (struct icalrecur_iterator_impl*)i; - - icalerror_check_arg_rv((impl!=0),"impl"); - - free(impl); - -} - - -void increment_year(struct icalrecur_iterator_impl* impl, int inc) -{ - impl->last.year+=inc; -} - -/* Increment month is different that the other incement_* routines -- - it figures out the interval for itself, and uses BYMONTH data if - available. */ -void increment_month(struct icalrecur_iterator_impl* impl) -{ - int years; - - if(has_by_data(impl,BY_MONTH) ){ - /* Ignore the frequency and use the byrule data */ - - impl->by_indices[BY_MONTH]++; - - if (impl->by_ptrs[BY_MONTH][impl->by_indices[BY_MONTH]] - ==ICAL_RECURRENCE_ARRAY_MAX){ - impl->by_indices[BY_MONTH] = 0; - - increment_year(impl,1); - - } - - impl->last.month = - impl->by_ptrs[BY_MONTH][impl->by_indices[BY_MONTH]]; - - } else { - - int inc; - - if(impl->rule.freq == ICAL_MONTHLY_RECURRENCE){ - inc = impl->rule.interval; - } else { - inc = 1; - } - - impl->last.month+=inc; - - /* Months are offset by one */ - impl->last.month--; - - years = impl->last.month / 12; - - impl->last.month = impl->last.month % 12; - - impl->last.month++; - - if (years != 0){ - increment_year(impl,years); - } - } -} - -void increment_monthday(struct icalrecur_iterator_impl* impl, int inc) -{ - int i; - - for(i=0; i<inc; i++){ - - short days_in_month = - icaltime_days_in_month(impl->last.month,impl->last.year); - - impl->last.day++; - - if (impl->last.day > days_in_month){ - impl->last.day = impl->last.day-days_in_month; - increment_month(impl); - } - } -} - - -void increment_hour(struct icalrecur_iterator_impl* impl, int inc) -{ - short days; - - impl->last.hour+=inc; - - days = impl->last.hour / 24; - impl->last.hour = impl->last.hour % 24; - - if (impl->days != 0){ - increment_monthday(impl,days); - } -} - -void increment_minute(struct icalrecur_iterator_impl* impl, int inc) -{ - short hours; - - impl->last.minute+=inc; - - hours = impl->last.minute / 60; - impl->last.minute = impl->last.minute % 60; - - if (hours != 0){ - increment_hour(impl,hours); - } - -} - -void increment_second(struct icalrecur_iterator_impl* impl, int inc) -{ - short minutes; - - impl->last.second+=inc; - - minutes = impl->last.second / 60; - impl->last.second = impl->last.second % 60; - - if (minutes != 0) - { - increment_minute(impl, minutes); - } -} - -#if 0 -#include "ical.h" -void test_increment() -{ - struct icalrecur_iterator_impl impl; - - impl.last = icaltime_from_string("20000101T000000Z"); - - printf("Orig: %s\n",icaltime_as_ctime(impl.last)); - - increment_second(&impl,5); - printf("+ 5 sec : %s\n",icaltime_as_ctime(impl.last)); - - increment_second(&impl,355); - printf("+ 355 sec : %s\n",icaltime_as_ctime(impl.last)); - - increment_minute(&impl,5); - printf("+ 5 min : %s\n",icaltime_as_ctime(impl.last)); - - increment_minute(&impl,360); - printf("+ 360 min : %s\n",icaltime_as_ctime(impl.last)); - increment_hour(&impl,5); - printf("+ 5 hours : %s\n",icaltime_as_ctime(impl.last)); - increment_hour(&impl,43); - printf("+ 43 hours : %s\n",icaltime_as_ctime(impl.last)); - increment_monthday(&impl,3); - printf("+ 3 days : %s\n",icaltime_as_ctime(impl.last)); - increment_monthday(&impl,600); - printf("+ 600 days : %s\n",icaltime_as_ctime(impl.last)); - -} - -#endif - -short next_second(struct icalrecur_iterator_impl* impl) -{ - - short has_by_data = (impl->by_ptrs[BY_SECOND][0]!=ICAL_RECURRENCE_ARRAY_MAX); - short this_frequency = (impl->rule.freq == ICAL_SECONDLY_RECURRENCE); - - short end_of_data = 0; - - assert(has_by_data || this_frequency); - - if( has_by_data ){ - /* Ignore the frequency and use the byrule data */ - - impl->by_indices[BY_SECOND]++; - - if (impl->by_ptrs[BY_SECOND][impl->by_indices[BY_SECOND]] - ==ICAL_RECURRENCE_ARRAY_MAX){ - impl->by_indices[BY_SECOND] = 0; - - end_of_data = 1; - } - - - impl->last.second = - impl->by_ptrs[BY_SECOND][impl->by_indices[BY_SECOND]]; - - - } else if( !has_by_data && this_frequency ){ - /* Compute the next value from the last time and the frequency interval*/ - increment_second(impl, impl->rule.interval); - - } - - /* If we have gone through all of the seconds on the BY list, then we - need to move to the next minute */ - - if(has_by_data && end_of_data && this_frequency ){ - increment_minute(impl,1); - } - - return end_of_data; - -} - -int next_minute(struct icalrecur_iterator_impl* impl) -{ - - short has_by_data = (impl->by_ptrs[BY_MINUTE][0]!=ICAL_RECURRENCE_ARRAY_MAX); - short this_frequency = (impl->rule.freq == ICAL_MINUTELY_RECURRENCE); - - short end_of_data = 0; - - assert(has_by_data || this_frequency); - - - if (next_second(impl) == 0){ - return 0; - } - - if( has_by_data ){ - /* Ignore the frequency and use the byrule data */ - - impl->by_indices[BY_MINUTE]++; - - if (impl->by_ptrs[BY_MINUTE][impl->by_indices[BY_MINUTE]] - ==ICAL_RECURRENCE_ARRAY_MAX){ - - impl->by_indices[BY_MINUTE] = 0; - - end_of_data = 1; - } - - impl->last.minute = - impl->by_ptrs[BY_MINUTE][impl->by_indices[BY_MINUTE]]; - - } else if( !has_by_data && this_frequency ){ - /* Compute the next value from the last time and the frequency interval*/ - increment_minute(impl,impl->rule.interval); - } - -/* If we have gone through all of the minutes on the BY list, then we - need to move to the next hour */ - - if(has_by_data && end_of_data && this_frequency ){ - increment_hour(impl,1); - } - - return end_of_data; -} - -int next_hour(struct icalrecur_iterator_impl* impl) -{ - - short has_by_data = (impl->by_ptrs[BY_HOUR][0]!=ICAL_RECURRENCE_ARRAY_MAX); - short this_frequency = (impl->rule.freq == ICAL_HOURLY_RECURRENCE); - - short end_of_data = 0; - - assert(has_by_data || this_frequency); - - if (next_minute(impl) == 0){ - return 0; - } - - if( has_by_data ){ - /* Ignore the frequency and use the byrule data */ - - impl->by_indices[BY_HOUR]++; - - if (impl->by_ptrs[BY_HOUR][impl->by_indices[BY_HOUR]] - ==ICAL_RECURRENCE_ARRAY_MAX){ - impl->by_indices[BY_HOUR] = 0; - - end_of_data = 1; - } - - impl->last.hour = - impl->by_ptrs[BY_HOUR][impl->by_indices[BY_HOUR]]; - - } else if( !has_by_data && this_frequency ){ - /* Compute the next value from the last time and the frequency interval*/ - increment_hour(impl,impl->rule.interval); - - } - - /* If we have gone through all of the hours on the BY list, then we - need to move to the next day */ - - if(has_by_data && end_of_data && this_frequency ){ - increment_monthday(impl,1); - } - - return end_of_data; - -} - -int next_day(struct icalrecur_iterator_impl* impl) -{ - - short has_by_data = (impl->by_ptrs[BY_DAY][0]!=ICAL_RECURRENCE_ARRAY_MAX); - short this_frequency = (impl->rule.freq == ICAL_DAILY_RECURRENCE); - - assert(has_by_data || this_frequency); - - if (next_hour(impl) == 0){ - return 0; - } - - /* Always increment through the interval, since this routine is not - called by any other next_* routine, and the days that are - excluded will be taken care of by restriction filtering */ - - if(this_frequency){ - increment_monthday(impl,impl->rule.interval); - } else { - increment_monthday(impl,1); - } - - - return 0; - -} - - -int next_yearday(struct icalrecur_iterator_impl* impl) -{ - - short has_by_data = (impl->by_ptrs[BY_YEAR_DAY][0]!=ICAL_RECURRENCE_ARRAY_MAX); - - short end_of_data = 0; - - assert(has_by_data ); - - if (next_hour(impl) == 0){ - return 0; - } - - impl->by_indices[BY_YEAR_DAY]++; - - if (impl->by_ptrs[BY_YEAR_DAY][impl->by_indices[BY_YEAR_DAY]] - ==ICAL_RECURRENCE_ARRAY_MAX){ - impl->by_indices[BY_YEAR_DAY] = 0; - - end_of_data = 1; - } - - impl->last.day = - impl->by_ptrs[BY_YEAR_DAY][impl->by_indices[BY_YEAR_DAY]]; - - if(has_by_data && end_of_data){ - increment_year(impl,1); - } - - return end_of_data; - -} - -/* This routine is only called by next_week. It is certain that BY_DAY -has data */ - -int next_weekday_by_week(struct icalrecur_iterator_impl* impl) -{ - - short end_of_data = 0; - short start_of_week, dow; - struct icaltimetype next; - - if (next_hour(impl) == 0){ - return 0; - } - - assert( impl->by_ptrs[BY_DAY][0]!=ICAL_RECURRENCE_ARRAY_MAX); - - while(1) { - - impl->by_indices[BY_DAY]++; /* Look at next elem in BYDAY array */ - - /* Are we at the end of the BYDAY array? */ - if (impl->by_ptrs[BY_DAY][impl->by_indices[BY_DAY]] - ==ICAL_RECURRENCE_ARRAY_MAX){ - - impl->by_indices[BY_DAY] = 0; /* Reset to 0 */ - end_of_data = 1; /* Signal that we're at the end */ - } - - /* Add the day of week offset to to the start of this week, and use - that to get the next day */ - dow = impl->by_ptrs[BY_DAY][impl->by_indices[BY_DAY]]; - start_of_week = icaltime_start_doy_of_week(impl->last); - - dow--; /*Sun is 1, not 0 */ - - if(dow+start_of_week <1 && !end_of_data){ - /* The selected date is in the previous year. */ - continue; - } - - next = icaltime_from_day_of_year(start_of_week + dow,impl->last.year); - - impl->last.day = next.day; - impl->last.month = next.month; - impl->last.year = next.year; - - return end_of_data; - } - -} - -int nth_weekday(short dow, short pos, struct icaltimetype t){ - - short days_in_month = icaltime_days_in_month(t.month,t.year); - short end_dow, start_dow; - short wd; - - if(pos >= 0){ - t.day = 1; - start_dow = icaltime_day_of_week(t); - - if (pos != 0) { - pos--; - } - - /* find month day of first occurrence of dow -- such as the - month day of the first monday */ - - wd = dow-start_dow+1; - - if (wd <= 0){ - wd = wd + 7; - } - - wd = wd + pos * 7; - - } else { - t.day = days_in_month; - end_dow = icaltime_day_of_week(t); - - pos++; - - /* find month day of last occurrence of dow -- such as the - month day of the last monday */ - - wd = (end_dow - dow); - - if (wd < 0){ - wd = wd+ 7; - } - - wd = days_in_month - wd; - - wd = wd + pos * 7; - } - - return wd; -} - - -int next_month(struct icalrecur_iterator_impl* impl) -{ - int data_valid = 1; - - short this_frequency = (impl->rule.freq == ICAL_MONTHLY_RECURRENCE); - - assert( has_by_data(impl,BY_MONTH) || this_frequency); - - /* Iterate through the occurrences within a day. If we don't get to - the end of the intra-day data, don't bother going to the next - month */ - - if (next_hour(impl) == 0){ - return data_valid; /* Signal that the data is valid */ - } - - - /* Now iterate through the occurrences within a month -- by days, - weeks or weekdays. */ - - if(has_by_data(impl,BY_DAY) && has_by_data(impl,BY_MONTH_DAY)){ - /* Cases like: FREQ=MONTHLY;INTERVAL=1;BYDAY=FR;BYMONTHDAY=13 */ - short day, idx,j; - short days_in_month = icaltime_days_in_month(impl->last.month, - impl->last.year); - /* Iterate through the remaining days in the month and check if - each day is listed in the BY_DAY array and in the BY_MONTHDAY - array. This seems very inneficient, but I think it is the - simplest way to account for both BYDAY=1FR (First friday in - month) and BYDAY=FR ( every friday in month ) */ - - for(day = impl->last.day+1; day <= days_in_month; day++){ - for(idx = 0; BYDAYPTR[idx] != ICAL_RECURRENCE_ARRAY_MAX; idx++){ - for(j = 0; BYMDPTR[j]!=ICAL_RECURRENCE_ARRAY_MAX; j++){ - short dow = - icalrecurrencetype_day_day_of_week(BYDAYPTR[idx]); - short pos = icalrecurrencetype_day_position(BYDAYPTR[idx]); - short mday = BYMDPTR[j]; - short this_dow; - - impl->last.day = day; - this_dow = icaltime_day_of_week(impl->last); - - if( (pos == 0 && dow == this_dow && mday == day) || - (nth_weekday(dow,pos,impl->last) == day && mday==day)){ - goto MDEND; - } - } - } - } - - MDEND: - - if ( day > days_in_month){ - impl->last.day = 1; - increment_month(impl); - data_valid = 0; /* signal that impl->last is invalid */ - } - - - } else if(has_by_data(impl,BY_DAY)){ - /* Cases like: FREQ=MONTHLY;INTERVAL=1;BYDAY=FR */ - /* For this case, the weekdays are relative to the - month. BYDAY=FR -> First Friday in month, etc. */ - - short day, idx; - short days_in_month = icaltime_days_in_month(impl->last.month, - impl->last.year); - - assert( BYDAYPTR[0]!=ICAL_RECURRENCE_ARRAY_MAX); - - /* Iterate through the remaining days in the month and check if - each day is listed in the BY_DAY array. This seems very - inneficient, but I think it is the simplest way to account - for both BYDAY=1FR (First friday in month) and BYDAY=FR ( - every friday in month ) */ - - for(day = impl->last.day+1; day <= days_in_month; day++){ - for(idx = 0; BYDAYPTR[idx] != ICAL_RECURRENCE_ARRAY_MAX; idx++){ - short dow = icalrecurrencetype_day_day_of_week(BYDAYPTR[idx]); - short pos = icalrecurrencetype_day_position(BYDAYPTR[idx]); - short this_dow; - - impl->last.day = day; - this_dow = icaltime_day_of_week(impl->last); - - if( (pos == 0 && dow == this_dow ) || - (nth_weekday(dow,pos,impl->last) == day)){ - goto DEND; - } - } - } - - DEND: - - if ( day > days_in_month){ - impl->last.day = 1; - increment_month(impl); - data_valid = 0; /* signal that impl->last is invalid */ - } - - } else if (has_by_data(impl,BY_MONTH_DAY)) { - /* Cases like: FREQ=MONTHLY;COUNT=10;BYMONTHDAY=-3 */ - short day; - - assert( BYMDPTR[0]!=ICAL_RECURRENCE_ARRAY_MAX); - - BYMDIDX++; - - /* Are we at the end of the BYDAY array? */ - if (BYMDPTR[BYMDIDX] ==ICAL_RECURRENCE_ARRAY_MAX){ - - BYMDIDX = 0; /* Reset to 0 */ - increment_month(impl); - } - - day = BYMDPTR[BYMDIDX]; - - if (day < 0) { - day = icaltime_days_in_month(impl->last.month,impl->last.year)+ - day + 1; - } - - impl->last.day = day; - - } else { - increment_month(impl); - } - - return data_valid; /* Signal that the data is valid */ - -} - - -int next_week(struct icalrecur_iterator_impl* impl) -{ - short has_by_data = (impl->by_ptrs[BY_WEEK_NO][0]!=ICAL_RECURRENCE_ARRAY_MAX); - short this_frequency = (impl->rule.freq == ICAL_WEEKLY_RECURRENCE); - short end_of_data = 0; - - - /* Increment to the next week day */ - if (next_weekday_by_week(impl) == 0){ - return 0; /* Have not reached end of week yet */ - } - - /* If we get here, we have incremented through the entire week, and - can increment to the next week */ - - - if( has_by_data){ - /* Use the Week Number byrule data */ - int week_no; - struct icaltimetype t; - - impl->by_indices[BY_WEEK_NO]++; - - if (impl->by_ptrs[BY_WEEK_NO][impl->by_indices[BY_WEEK_NO]] - ==ICAL_RECURRENCE_ARRAY_MAX){ - impl->by_indices[BY_WEEK_NO] = 0; - - end_of_data = 1; - } - - t = impl->last; - t.month=1; /* HACK, should be setting to the date of the first week of year*/ - t.day=1; - - week_no = impl->by_ptrs[BY_WEEK_NO][impl->by_indices[BY_WEEK_NO]]; - - impl->last.day += week_no*7; - - impl->last = icaltime_normalize(impl->last); - - } else if( !has_by_data && this_frequency ){ - /* If there is no BY_WEEK_NO data, just jump forward 7 days. */ - increment_monthday(impl,7*impl->rule.interval); - } - - - if(has_by_data && end_of_data && this_frequency ){ - increment_year(impl,1); - } - - return end_of_data; - -} - - -pvl_list expand_by_day(struct icalrecur_iterator_impl* impl,short year) -{ - /* Try to calculate each of the occurrences. */ - int i; - pvl_list days_list = pvl_newlist(); - - short start_dow, end_dow, end_year_day, start_doy; - struct icaltimetype tmp = impl->last; - - tmp.year= year; - tmp.month = 1; - tmp.day = 1; - tmp.is_date = 1; - - start_dow = icaltime_day_of_week(tmp); - start_doy = icaltime_start_doy_of_week(tmp); - - /* Get the last day of the year*/ - tmp.year++; - tmp = icaltime_normalize(tmp); - tmp.day--; - tmp = icaltime_normalize(tmp); - - end_dow = icaltime_day_of_week(tmp); - end_year_day = icaltime_day_of_year(tmp); - - for(i = 0; BYDAYPTR[i] != ICAL_RECURRENCE_ARRAY_MAX; i++){ - short dow = - icalrecurrencetype_day_day_of_week(BYDAYPTR[i]); - short pos = icalrecurrencetype_day_position(BYDAYPTR[i]); - - if(pos == 0){ - /* add all of the days of the year with this day-of-week*/ - int week; - for(week = 0; week < 52 ; week ++){ - short doy = start_doy + (week * 7) + dow-1; - - if(doy > end_year_day){ - break; - } else { - pvl_push(days_list,(void*)(int)doy); - } - } - - } else if ( pos > 0) { - int first; - /* First occurrence of dow in year */ - if( dow >= start_dow) { - first = dow - start_dow + 1; - } else { - first = dow - start_dow + 8; - } - - pvl_push(days_list,(void*)(first+ (pos-1) * 7)); - - } else { /* pos < 0 */ - assert(0); - } - } - - return days_list; -} - - -/* For INTERVAL=YEARLY, set up the days[] array in the iterator to - list all of the days of the current year that are specified in this - rule. */ - -int expand_year_days(struct icalrecur_iterator_impl* impl,short year) -{ - int j,k; - int days_index=0; - struct icaltimetype t; - int flags; - -#define HBD(x) has_by_data(impl,x) - - t.is_date = 1; /* Needed to make day_of_year routines work property */ - - memset(&t,0,sizeof(t)); - memset(impl->days,ICAL_RECURRENCE_ARRAY_MAX_BYTE,sizeof(impl->days)); - - flags = (HBD(BY_DAY) ? 1<<BY_DAY : 0) + - (HBD(BY_WEEK_NO) ? 1<<BY_WEEK_NO : 0) + - (HBD(BY_MONTH_DAY) ? 1<<BY_MONTH_DAY : 0) + - (HBD(BY_MONTH) ? 1<<BY_MONTH : 0) + - (HBD(BY_YEAR_DAY) ? 1<<BY_YEAR_DAY : 0); - - - switch(flags) { - - case 0: { - /* FREQ=YEARLY; */ - - break; - } - case 1<<BY_MONTH: { - /* FREQ=YEARLY; BYMONTH=3,11*/ - - for(j=0;impl->by_ptrs[BY_MONTH][j]!=ICAL_RECURRENCE_ARRAY_MAX;j++){ - struct icaltimetype t; - short month = impl->by_ptrs[BY_MONTH][j]; - short doy; - - t = impl->dtstart; - t.year = year; - t.month = month; - t.is_date = 1; - - doy = icaltime_day_of_year(t); - - impl->days[days_index++] = doy; - - } - break; - } - - case 1<<BY_MONTH_DAY: { - /* FREQ=YEARLY; BYMONTHDAY=1,15*/ - assert(0); - break; - } - - case (1<<BY_MONTH_DAY) + (1<<BY_MONTH): { - /* FREQ=YEARLY; BYMONTHDAY=1,15; BYMONTH=10 */ - - for(j=0;impl->by_ptrs[BY_MONTH][j]!=ICAL_RECURRENCE_ARRAY_MAX;j++){ - for(k=0;impl->by_ptrs[BY_MONTH_DAY][k]!=ICAL_RECURRENCE_ARRAY_MAX;k++) - { - short month = impl->by_ptrs[BY_MONTH][j]; - short month_day = impl->by_ptrs[BY_MONTH_DAY][k]; - short doy; - - t.day = month_day; - t.month = month; - t.year = year; - t.is_date = 1; - - doy = icaltime_day_of_year(t); - - impl->days[days_index++] = doy; - - } - } - - break; - } - - case 1<<BY_WEEK_NO: { - /* FREQ=YEARLY; BYWEEKNO=20,50 */ - - struct icaltimetype t; - short dow; - - t.day = impl->dtstart.day; - t.month = impl->dtstart.month; - t.year = year; - t.is_date = 1; - - dow = icaltime_day_of_week(t); - /* HACK Not finished */ - - break; - } - - case (1<<BY_WEEK_NO) + (1<<BY_MONTH_DAY): { - /*FREQ=YEARLY; WEEKNO=20,50; BYMONTH= 6,11 */ - assert(0); - break; - } - - case 1<<BY_DAY: { - /*FREQ=YEARLY; BYDAY=TH,20MO,-10FR*/ - int days_index = 0; - pvl_elem i; - pvl_list days = expand_by_day(impl,year); - - - for(i=pvl_head(days);i!=0;i=pvl_next(i)){ - short day = (short)(int)pvl_data(i); - impl->days[days_index++] = day; - } - - break; - } - - case (1<<BY_DAY)+(1<<BY_MONTH): { - /*FREQ=YEARLY; BYDAY=TH,20MO,-10FR; BYMONTH = 12*/ - - - for(j=0;impl->by_ptrs[BY_MONTH][j]!=ICAL_RECURRENCE_ARRAY_MAX;j++){ - short month = impl->by_ptrs[BY_MONTH][j]; - short days_in_month = icaltime_days_in_month(month,year); - - struct icaltimetype t; - memset(&t,0,sizeof(struct icaltimetype)); - t.day = 1; - t.year = year; - t.month = month; - t.is_date = 1; - - for(t.day = 1; t.day <=days_in_month; t.day++){ - - short current_dow = icaltime_day_of_week(t); - - for(k=0;impl->by_ptrs[BY_DAY][k]!=ICAL_RECURRENCE_ARRAY_MAX;k++){ - - enum icalrecurrencetype_weekday dow = - icalrecurrencetype_day_day_of_week(impl->by_ptrs[BY_DAY][k]); - - if(current_dow == dow){ - short doy = icaltime_day_of_year(t); - /* HACK, incomplete Nth day of week handling */ - impl->days[days_index++] = doy; - - } - } - } - } - break; - } - - case (1<<BY_DAY) + (1<<BY_MONTH_DAY) : { - /*FREQ=YEARLY; BYDAY=TH,20MO,-10FR; BYMONTHDAY=1,15*/ - assert(0); - break; - } - - case (1<<BY_DAY) + (1<<BY_MONTH_DAY) + (1<<BY_MONTH): { - /*FREQ=YEARLY; BYDAY=TH,20MO,-10FR; BYMONTHDAY=10; MYMONTH=6,11*/ - - int days_index = 0; - pvl_elem itr; - pvl_list days = expand_by_day(impl,year); - - for(itr=pvl_head(days);itr!=0;itr=pvl_next(itr)){ - short day = (short)(int)pvl_data(itr); - struct icaltimetype tt; - short i,j; - - tt = icaltime_from_day_of_year(day,year); - - for(i = 0; BYMONPTR[i] != ICAL_RECURRENCE_ARRAY_MAX; i++){ - for(j = 0; BYMDPTR[j]!=ICAL_RECURRENCE_ARRAY_MAX; j++){ - short mday = BYMDPTR[j]; - short month = BYMONPTR[i]; - - if(tt.month == month && tt.day == mday){ - impl->days[days_index++] = day; - } - } - } - - } - - break; - - } - - case (1<<BY_DAY) + (1<<BY_WEEK_NO) : { - /*FREQ=YEARLY; BYDAY=TH,20MO,-10FR; WEEKNO=20,50*/ - - int days_index = 0; - pvl_elem itr; - pvl_list days = expand_by_day(impl,year); - - for(itr=pvl_head(days);itr!=0;itr=pvl_next(itr)){ - short day = (short)(int)pvl_data(itr); - struct icaltimetype tt; - short i; - - tt = icaltime_from_day_of_year(day,year); - - for(i = 0; BYWEEKPTR[i] != ICAL_RECURRENCE_ARRAY_MAX; i++){ - short weekno = BYWEEKPTR[i]; - - if(weekno== icaltime_week_number(tt)){ - impl->days[days_index++] = day; - } - } - - } - break; - } - - case (1<<BY_DAY) + (1<<BY_WEEK_NO) + (1<<BY_MONTH_DAY): { - /*FREQ=YEARLY; BYDAY=TH,20MO,-10FR; WEEKNO=20,50; BYMONTHDAY=1,15*/ - assert(0); - break; - } - - case 1<<BY_YEAR_DAY: { - for(j=0;impl->by_ptrs[BY_YEAR_DAY][j]!=ICAL_RECURRENCE_ARRAY_MAX;j++){ - short doy = impl->by_ptrs[BY_YEAR_DAY][j]; - impl->days[days_index++] = doy; - } - break; - } - - default: { - assert(0); - break; - } - - } - - return 0; -} - - -int next_year(struct icalrecur_iterator_impl* impl) -{ - struct icaltimetype next; - - if (next_hour(impl) == 0){ - return 0; - } - - if (impl->days[++impl->days_index] == ICAL_RECURRENCE_ARRAY_MAX){ - impl->days_index = 0; - increment_year(impl,impl->rule.interval); - expand_year_days(impl,impl->last.year); - } - - next = icaltime_from_day_of_year(impl->days[impl->days_index],impl->last.year); - - impl->last.day = next.day; - impl->last.month = next.month; - - return 1; -} - -int icalrecur_check_rulepart(struct icalrecur_iterator_impl* impl, - short v, enum byrule byrule) -{ - int itr; - - if(impl->by_ptrs[byrule][0]!=ICAL_RECURRENCE_ARRAY_MAX){ - for(itr=0; impl->by_ptrs[byrule][itr]!=ICAL_RECURRENCE_ARRAY_MAX;itr++){ - if(impl->by_ptrs[byrule][itr] == v){ - return 1; - } - } - } - - return 0; -} - -int check_contract_restriction(struct icalrecur_iterator_impl* impl, - enum byrule byrule, short v) -{ - int pass = 0; - int itr; - icalrecurrencetype_frequency freq = impl->rule.freq; - - if(impl->by_ptrs[byrule][0]!=ICAL_RECURRENCE_ARRAY_MAX && - expand_map[freq].map[byrule] == CONTRACT){ - for(itr=0; impl->by_ptrs[byrule][itr]!=ICAL_RECURRENCE_ARRAY_MAX;itr++){ - if(impl->by_ptrs[byrule][itr] == v){ - pass=1; - break; - } - } - - return pass; - } else { - /* This is not a contracting byrule, or it has no data, so the - test passes*/ - return 1; - } -} - - -int check_contracting_rules(struct icalrecur_iterator_impl* impl) -{ - - int day_of_week=0; - int week_no=0; - int year_day=0; - - if ( - check_contract_restriction(impl,BY_SECOND,impl->last.second) && - check_contract_restriction(impl,BY_MINUTE,impl->last.minute) && - check_contract_restriction(impl,BY_HOUR,impl->last.hour) && - check_contract_restriction(impl,BY_DAY,day_of_week) && - check_contract_restriction(impl,BY_WEEK_NO,week_no) && - check_contract_restriction(impl,BY_MONTH_DAY,impl->last.day) && - check_contract_restriction(impl,BY_MONTH,impl->last.month) && - check_contract_restriction(impl,BY_YEAR_DAY,year_day) ) - { - - return 1; - } else { - return 0; - } -} - -struct icaltimetype icalrecur_iterator_next(icalrecur_iterator *itr) -{ - int valid = 1; - struct icalrecur_iterator_impl* impl = - (struct icalrecur_iterator_impl*)itr; - - if( (impl->rule.count!=0 &&impl->occurrence_no >= impl->rule.count) || - (!icaltime_is_null_time(impl->rule.until) && - icaltime_compare(impl->last,impl->rule.until) > 0)) { - return icaltime_null_time(); - } - - if(impl->occurrence_no == 0 - && icaltime_compare(impl->last,impl->dtstart) >= 0){ - - impl->occurrence_no++; - return impl->last; - } - - do { - valid = 1; - switch(impl->rule.freq){ - - case ICAL_SECONDLY_RECURRENCE: { - next_second(impl); - break; - } - case ICAL_MINUTELY_RECURRENCE: { - next_minute(impl); - break; - } - case ICAL_HOURLY_RECURRENCE: { - next_hour(impl); - break; - } - case ICAL_DAILY_RECURRENCE: { - next_day(impl); - break; - } - case ICAL_WEEKLY_RECURRENCE: { - next_week(impl); - break; - } - case ICAL_MONTHLY_RECURRENCE: { - valid = next_month(impl); - break; - } - case ICAL_YEARLY_RECURRENCE:{ - next_year(impl); - break; - } - default:{ - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - return icaltime_null_time(); - } - } - - if(impl->last.year >= 2038 ){ - /* HACK */ - return icaltime_null_time(); - } - - } while(!check_contracting_rules(impl) - || icaltime_compare(impl->last,impl->dtstart) < 0 - || valid == 0); - - -/* Ignore null times and times that are after the until time */ - if( !icaltime_is_null_time(impl->rule.until) && - icaltime_compare(impl->last,impl->rule.until) > 0 ) { - return icaltime_null_time(); - } - - impl->occurrence_no++; - - return impl->last; -} - - -/************************** Type Routines **********************/ - - -void icalrecurrencetype_clear(struct icalrecurrencetype *recur) -{ - memset(recur,ICAL_RECURRENCE_ARRAY_MAX_BYTE, - sizeof(struct icalrecurrencetype)); - - recur->week_start = ICAL_MONDAY_WEEKDAY; - recur->freq = ICAL_NO_RECURRENCE; - recur->interval = 1; - memset(&(recur->until),0,sizeof(struct icaltimetype)); - recur->count = 0; -} - -/* The 'day' element of icalrecurrencetype_weekday is encoded to allow -reporesentation of both the day of the week ( Monday, Tueday), but -also the Nth day of the week ( First tuesday of the month, last -thursday of the year) These routines decode the day values. - -The day's position in the period ( Nth-ness) and the numerical value -of the day are encoded together as: pos*7 + dow - -A position of 0 means 'any' or 'every' - - */ - -enum icalrecurrencetype_weekday icalrecurrencetype_day_day_of_week(short day) -{ - return abs(day)%8; -} - -short icalrecurrencetype_day_position(short day) -{ - short wd, pos; - - wd = icalrecurrencetype_day_day_of_week(day); - - pos = (abs(day)-wd)/8 * ((day<0)?-1:1); - - - return pos; -} - - -/****************** Enumeration Routines ******************/ - -struct {icalrecurrencetype_weekday wd; const char * str; } -wd_map[] = { - {ICAL_SUNDAY_WEEKDAY,"SU"}, - {ICAL_MONDAY_WEEKDAY,"MO"}, - {ICAL_TUESDAY_WEEKDAY,"TU"}, - {ICAL_WEDNESDAY_WEEKDAY,"WE"}, - {ICAL_THURSDAY_WEEKDAY,"TH"}, - {ICAL_FRIDAY_WEEKDAY,"FR"}, - {ICAL_SATURDAY_WEEKDAY,"SA"}, - {ICAL_NO_WEEKDAY,0} -}; - -const char* icalrecur_weekday_to_string(icalrecurrencetype_weekday kind) -{ - int i; - - for (i=0; wd_map[i].wd != ICAL_NO_WEEKDAY; i++) { - if ( wd_map[i].wd == kind) { - return wd_map[i].str; - } - } - - return 0; -} - -icalrecurrencetype_weekday icalrecur_string_to_weekday(const char* str) -{ - int i; - - for (i=0; wd_map[i].wd != ICAL_NO_WEEKDAY; i++) { - if ( strcmp(str,wd_map[i].str) == 0){ - return wd_map[i].wd; - } - } - - return ICAL_NO_WEEKDAY; -} - - - -struct { - icalrecurrencetype_frequency kind; - const char* str; -} freq_map[] = { - {ICAL_SECONDLY_RECURRENCE,"SECONDLY"}, - {ICAL_MINUTELY_RECURRENCE,"MINUTELY"}, - {ICAL_HOURLY_RECURRENCE,"HOURLY"}, - {ICAL_DAILY_RECURRENCE,"DAILY"}, - {ICAL_WEEKLY_RECURRENCE,"WEEKLY"}, - {ICAL_MONTHLY_RECURRENCE,"MONTHLY"}, - {ICAL_YEARLY_RECURRENCE,"YEARLY"}, - {ICAL_NO_RECURRENCE,0} -}; - -const char* icalrecur_freq_to_string(icalrecurrencetype_frequency kind) -{ - int i; - - for (i=0; freq_map[i].kind != ICAL_NO_RECURRENCE ; i++) { - if ( freq_map[i].kind == kind ) { - return freq_map[i].str; - } - } - return 0; -} - -icalrecurrencetype_frequency icalrecur_string_to_freq(const char* str) -{ - int i; - - for (i=0; freq_map[i].kind != ICAL_NO_RECURRENCE ; i++) { - if ( strcmp(str,freq_map[i].str) == 0){ - return freq_map[i].kind; - } - } - return ICAL_NO_RECURRENCE; -} - -/* Fill an array with the 'count' number of occurrences generated by - the rrule. Note that the times are returned in UTC, but the times - are calculated in local time. YOu will have to convert the results - back into local time before using them. */ - -int icalrecur_expand_recurrence(char* rule, time_t start, - int count, time_t* array) -{ - struct icalrecurrencetype recur; - icalrecur_iterator* ritr; - time_t tt; - struct icaltimetype icstart, next; - int i = 0; - - memset(array, 0, count*sizeof(time_t)); - - icstart = icaltime_from_timet(start,0); - - recur = icalrecurrencetype_from_string(rule); - - for(ritr = icalrecur_iterator_new(recur,icstart), - next = icalrecur_iterator_next(ritr); - !icaltime_is_null_time(next) && i < count; - next = icalrecur_iterator_next(ritr)){ - - tt = icaltime_as_timet(next); - - if (tt >= start ){ - array[i++] = tt; - } - - } - - icalrecur_iterator_free(ritr); - - return 1; -} diff --git a/libical/src/libical/icalrecur.h b/libical/src/libical/icalrecur.h deleted file mode 100644 index 5fcdc15a8c..0000000000 --- a/libical/src/libical/icalrecur.h +++ /dev/null @@ -1,189 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalrecur.h - CREATOR: eric 20 March 2000 - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - -How to use: - -1) Get a rule and a start time from a component - icalproperty rrule; - struct icalrecurrencetype recur; - struct icaltimetype dtstart; - - rrule = icalcomponent_get_first_property(comp,ICAL_RRULE_PROPERTY); - recur = icalproperty_get_rrule(rrule); - start = icalproperty_get_dtstart(dtstart); - -Or, just make them up: - recur = icalrecurrencetype_from_string("FREQ=YEARLY;BYDAY=SU,WE"); - dtstart = icaltime_from_string("19970101T123000") - -2) Create an iterator - icalrecur_iterator* ritr; - ritr = icalrecur_iterator_new(recur,start); - -3) Iterator over the occurrences - struct icaltimetype next; - while (next = icalrecur_iterator_next(ritr) - && !icaltime_is_null_time(next){ - Do something with next - } - -Note that that the time returned by icalrecur_iterator_next is in -whatever timezone that dtstart is in. - -======================================================================*/ - -#ifndef ICALRECUR_H -#define ICALRECUR_H - -#include <time.h> -#include "icaltime.h" - -/*********************************************************************** - * Recurrance enumerations -**********************************************************************/ - -typedef enum icalrecurrencetype_frequency -{ - /* These enums are used to index an array, so don't change the - order or the integers */ - - ICAL_SECONDLY_RECURRENCE=0, - ICAL_MINUTELY_RECURRENCE=1, - ICAL_HOURLY_RECURRENCE=2, - ICAL_DAILY_RECURRENCE=3, - ICAL_WEEKLY_RECURRENCE=4, - ICAL_MONTHLY_RECURRENCE=5, - ICAL_YEARLY_RECURRENCE=6, - ICAL_NO_RECURRENCE=7 - -} icalrecurrencetype_frequency; - -typedef enum icalrecurrencetype_weekday -{ - ICAL_NO_WEEKDAY, - ICAL_SUNDAY_WEEKDAY, - ICAL_MONDAY_WEEKDAY, - ICAL_TUESDAY_WEEKDAY, - ICAL_WEDNESDAY_WEEKDAY, - ICAL_THURSDAY_WEEKDAY, - ICAL_FRIDAY_WEEKDAY, - ICAL_SATURDAY_WEEKDAY -} icalrecurrencetype_weekday; - -enum { - ICAL_RECURRENCE_ARRAY_MAX = 0x7f7f, - ICAL_RECURRENCE_ARRAY_MAX_BYTE = 0x7f -}; - - - -/********************** Recurrence type routines **************/ - -/* See RFC 2445 Section 4.3.10, RECUR Value, for an explaination of - the values and fields in struct icalrecurrencetype */ - -#define ICAL_BY_SECOND_SIZE 61 -#define ICAL_BY_MINUTE_SIZE 61 -#define ICAL_BY_HOUR_SIZE 25 -#define ICAL_BY_DAY_SIZE 364 /* 7 days * 52 weeks */ -#define ICAL_BY_MONTHDAY_SIZE 32 -#define ICAL_BY_YEARDAY_SIZE 367 -#define ICAL_BY_WEEKNO_SIZE 54 -#define ICAL_BY_MONTH_SIZE 13 -#define ICAL_BY_SETPOS_SIZE 367 - -/* Main struct for holding digested recurrence rules */ -struct icalrecurrencetype -{ - icalrecurrencetype_frequency freq; - - - /* until and count are mutually exclusive. */ - struct icaltimetype until; - int count; - - short interval; - - icalrecurrencetype_weekday week_start; - - /* The BY* parameters can each take a list of values. Here I - * assume that the list of values will not be larger than the - * range of the value -- that is, the client will not name a - * value more than once. - - * Each of the lists is terminated with the value - * ICAL_RECURRENCE_ARRAY_MAX unless the the list is full. - */ - - short by_second[ICAL_BY_SECOND_SIZE]; - short by_minute[ICAL_BY_MINUTE_SIZE]; - short by_hour[ICAL_BY_HOUR_SIZE]; - short by_day[ICAL_BY_DAY_SIZE]; /* Encoded value, see below */ - short by_month_day[ICAL_BY_MONTHDAY_SIZE]; - short by_year_day[ ICAL_BY_YEARDAY_SIZE]; - short by_week_no[ICAL_BY_WEEKNO_SIZE]; - short by_month[ICAL_BY_MONTH_SIZE]; - short by_set_pos[ICAL_BY_SETPOS_SIZE]; -}; - - -void icalrecurrencetype_clear(struct icalrecurrencetype *r); - -/* The 'day' element of the by_day array is encoded to allow -representation of both the day of the week ( Monday, Tueday), but also -the Nth day of the week ( First tuesday of the month, last thursday of -the year) These routines decode the day values */ - -/* 1 == Monday, etc. */ -enum icalrecurrencetype_weekday icalrecurrencetype_day_day_of_week(short day); - -/* 0 == any of day of week. 1 == first, 2 = second, -2 == second to last, etc */ -short icalrecurrencetype_day_position(short day); - - -/*********************************************************************** - * Recurrance rule parser -**********************************************************************/ - -/* Convert between strings ans recurrencetype structures. */ -struct icalrecurrencetype icalrecurrencetype_from_string(const char* str); -char* icalrecurrencetype_as_string(struct icalrecurrencetype *recur); - - -/********** recurrence iteration routines ********************/ - -typedef void icalrecur_iterator; - -/* Create a new recurrence rule iterator */ -icalrecur_iterator* icalrecur_iterator_new(struct icalrecurrencetype rule, - struct icaltimetype dtstart); - -/* Get the next occurrence from an iterator */ -struct icaltimetype icalrecur_iterator_next(icalrecur_iterator*); - -/* Free the iterator */ -void icalrecur_iterator_free(icalrecur_iterator*); - -/* Fills array up with at most 'count' time_t values, each - representing an occurrence time in seconds past the POSIX epoch */ -int icalrecur_expand_recurrence(char* rule, time_t start, - int count, time_t* array); - - -#endif diff --git a/libical/src/libical/icalrestriction.c.in b/libical/src/libical/icalrestriction.c.in deleted file mode 100644 index 454442531f..0000000000 --- a/libical/src/libical/icalrestriction.c.in +++ /dev/null @@ -1,447 +0,0 @@ -/* -*- Mode: C -*- */ -/* ====================================================================== - File: icalrestriction.c - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - ======================================================================*/ -/*#line 7 "icalrestriction.c.in"*/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "icalrestriction.h" -#include "icalenums.h" -#include "icalerror.h" - -#include <assert.h> -#include <stdio.h> /* For snprintf */ - -#define TMP_BUF_SIZE 1024 - - -/* Define the structs for the restrictions. these data are filled out -in machine generated code below */ - -struct icalrestriction_property_record; - -typedef char* (*restriction_func)(struct icalrestriction_property_record* rec,icalcomponent* comp,icalproperty* prop); - - -typedef struct icalrestriction_property_record { - icalproperty_method method; - icalcomponent_kind component; - icalproperty_kind property; - icalrestriction_kind restriction; - restriction_func function; -} icalrestriction_property_record; - - -typedef struct icalrestriction_component_record { - icalproperty_method method; - icalcomponent_kind component; - icalcomponent_kind subcomponent; - icalrestriction_kind restriction; - restriction_func function; -} icalrestriction_component_record; - -icalrestriction_property_record* -icalrestriction_get_property_restriction(icalproperty_method method, - icalcomponent_kind component, - icalproperty_kind property); -icalrestriction_component_record* -icalrestriction_get_component_restriction(icalproperty_method method, - icalcomponent_kind component, - icalcomponent_kind subcomponent); - -icalrestriction_component_record icalrestriction_component_records[]; -icalrestriction_property_record icalrestriction_property_records[]; - -icalrestriction_property_record null_prop_record = {ICAL_METHOD_NONE,ICAL_NO_COMPONENT,ICAL_NO_PROPERTY,ICAL_RESTRICTION_UNKNOWN,0}; -icalrestriction_component_record null_comp_record = {ICAL_METHOD_NONE,ICAL_NO_COMPONENT,ICAL_NO_COMPONENT,ICAL_RESTRICTION_UNKNOWN,0}; - - -/* The each row gives the result of comparing a restriction against a - count. The columns in each row represent 0,1,2+. '-1' indicates - 'invalid, 'don't care' or 'needs more analysis' So, for - ICAL_RESTRICTION_ONE, if there is 1 of a property with that - restriction, it passes, but if there are 0 or 2+, it fails. */ - -char compare_map[ICAL_RESTRICTION_UNKNOWN+1][3] = { - { 1, 1, 1},/*ICAL_RESTRICTION_NONE*/ - { 1, 0, 0},/*ICAL_RESTRICTION_ZERO*/ - { 0, 1, 0},/*ICAL_RESTRICTION_ONE*/ - { 1, 1, 1},/*ICAL_RESTRICTION_ZEROPLUS*/ - { 0, 1, 1},/*ICAL_RESTRICTION_ONEPLUS*/ - { 1, 1, 0},/*ICAL_RESTRICTION_ZEROORONE*/ - { 1, 1, 0},/*ICAL_RESTRICTION_ONEEXCLUSIVE*/ - { 1, 1, 0},/*ICAL_RESTRICTION_ONEMUTUAL*/ - { 1, 1, 1} /*ICAL_RESTRICTION_UNKNOWN*/ -}; - -char restr_string_map[ICAL_RESTRICTION_UNKNOWN+1][60] = { - "unknown number",/*ICAL_RESTRICTION_NONE*/ - "0",/*ICAL_RESTRICTION_ZERO*/ - "1",/*ICAL_RESTRICTION_ONE*/ - "zero or more",/*ICAL_RESTRICTION_ZEROPLUS*/ - "one or more" ,/*ICAL_RESTRICTION_ONEPLUS*/ - "zero or one",/*ICAL_RESTRICTION_ZEROORONE*/ - "zero or one, exclusive with another property",/*ICAL_RESTRICTION_ONEEXCLUSIVE*/ - "zero or one, mutual with another property",/*ICAL_RESTRICTION_ONEMUTUAL*/ - "unknown number" /*ICAL_RESTRICTION_UNKNOWN*/ -}; - - -int -icalrestriction_compare(icalrestriction_kind restr, int count){ - - if ( restr < ICAL_RESTRICTION_NONE || restr > ICAL_RESTRICTION_UNKNOWN - || count < 0){ - return -1; - } - - if (count > 2) { - count = 2; - } - - return compare_map[restr][count]; - -} - -/* Special case routines */ - -char* icalrestriction_may_be_draft_final_canceled( - icalrestriction_property_record *rec, - icalcomponent* comp, - icalproperty* prop) -{ - - icalproperty_status stat = icalproperty_get_status(prop); - - if( !( stat == ICAL_STATUS_DRAFT || - stat == ICAL_STATUS_FINAL || - stat == ICAL_STATUS_CANCELLED )){ - - return "Failed iTIP restrictions for STATUS property. Value must be one of DRAFT, FINAL, or CANCELED"; - - } - - return 0; -} - -char* icalrestriction_may_be_comp_need_process( - icalrestriction_property_record *rec, - icalcomponent* comp, - icalproperty* prop) -{ - icalproperty_status stat = icalproperty_get_status(prop); - - if( !( stat == ICAL_STATUS_COMPLETED || - stat == ICAL_STATUS_NEEDSACTION || - stat == ICAL_STATUS_INPROCESS )){ - - return "Failed iTIP restrictions for STATUS property. Value must be one of COMPLETED, NEEDS-ACTION or IN-PROCESS"; - - } - - return 0; -} -char* icalrestriction_may_be_tent_conf(icalrestriction_property_record *rec, - icalcomponent* comp, - icalproperty* prop){ - icalproperty_status stat = icalproperty_get_status(prop); - - if( !( stat == ICAL_STATUS_TENTATIVE || - stat == ICAL_STATUS_CONFIRMED )){ - - return "Failed iTIP restrictions for STATUS property. Value must be one of TENTATIVE or CONFIRMED"; - - } - - return 0; -} -char* icalrestriction_may_be_tent_conf_cancel( - icalrestriction_property_record *rec, - icalcomponent* comp, - icalproperty* prop) -{ - icalproperty_status stat = icalproperty_get_status(prop); - - if( !( stat == ICAL_STATUS_TENTATIVE || - stat == ICAL_STATUS_CONFIRMED || - stat == ICAL_STATUS_CANCELLED )){ - - return "Failed iTIP restrictions for STATUS property. Value must be one of TENTATIVE, CONFIRMED or CANCELED"; - - } - - return 0; -} - -char* icalrestriction_must_be_cancel_if_present( - icalrestriction_property_record *rec, - icalcomponent* comp, - icalproperty* prop) -{ - /* This routine will not be called if prop == 0 */ - icalproperty_status stat = icalproperty_get_status(prop); - - if( stat != ICAL_STATUS_CANCELLED) - { - return "Failed iTIP restrictions for STATUS property. Value must be CANCELLED"; - - } - - - return 0; -} - -char* icalrestriction_must_be_canceled_no_attendee( - icalrestriction_property_record *rec, - icalcomponent* comp, - icalproperty* prop) -{ - - /* Hack. see rfc2446, 3.2.5 CANCEL for porperty STATUS. I don't - understand the note */ - - return 0; -} -char* icalrestriction_must_be_recurring(icalrestriction_property_record *rec, - icalcomponent* comp, - icalproperty* prop){ - /* Hack */ - return 0; -} -char* icalrestriction_must_have_duration(icalrestriction_property_record *rec, - icalcomponent* comp, - icalproperty* prop){ - - if( !icalcomponent_get_first_property(comp,ICAL_DURATION_PROPERTY)){ - - return "Failed iTIP restrictions for STATUS property. This component must have a DURATION property"; - - } - - return 0; -} -char* icalrestriction_must_have_repeat(icalrestriction_property_record *rec, - icalcomponent* comp, - icalproperty* prop){ - if( !icalcomponent_get_first_property(comp,ICAL_REPEAT_PROPERTY)){ - - return "Failed iTIP restrictions for STATUS property. This component must have a REPEAT property"; - - } - - return 0; -} -char* icalrestriction_must_if_tz_ref(icalrestriction_property_record *rec, - icalcomponent* comp, - icalproperty* prop){ - - /* Hack */ - return 0; -} -char* icalrestriction_no_dtend(icalrestriction_property_record *rec, - icalcomponent* comp, - icalproperty* prop){ - - if( !icalcomponent_get_first_property(comp,ICAL_DTEND_PROPERTY)){ - - return "Failed iTIP restrictions for STATUS property. The component must not have both DURATION and DTEND"; - - } - - return 0; -} -char* icalrestriction_no_duration(icalrestriction_property_record *rec, - icalcomponent* comp, - icalproperty* prop){ - - /* _no_dtend takes care of this one */ - return 0; -} - - -int icalrestriction_check_component(icalproperty_method method, - icalcomponent* comp) -{ - icalproperty_kind kind; - icalcomponent_kind comp_kind; - icalrestriction_kind restr; - icalrestriction_property_record *prop_record; - icalrestriction_component_record *comp_record; - char* funcr = 0; - icalproperty *prop; - - int count; - int compare; - int valid = 1; - - comp_kind = icalcomponent_isa(comp); - - /* Check all of the properties in this component */ - - for(kind = ICAL_ANY_PROPERTY+1; kind != ICAL_NO_PROPERTY; kind++){ - count = icalcomponent_count_properties(comp, kind); - - prop_record = icalrestriction_get_property_restriction(method, - comp_kind, - kind); - - restr = prop_record->restriction; - - if(restr == ICAL_RESTRICTION_ONEEXCLUSIVE || - restr == ICAL_RESTRICTION_ONEMUTUAL) { - - /* First treat is as a 0/1 restriction */ - restr = ICAL_RESTRICTION_ZEROORONE; - compare = icalrestriction_compare(restr,count); - - } else { - - compare = icalrestriction_compare(restr,count); - } - - assert(compare != -1); - - if (compare == 0){ - char temp[TMP_BUF_SIZE]; - - snprintf(temp, TMP_BUF_SIZE,"Failed iTIP restrictions for %s property. Expected %s instances of the property and got %d", - icalenum_property_kind_to_string(kind), - restr_string_map[restr], count); - - icalcomponent_add_property - (comp, - icalproperty_vanew_xlicerror( - temp, - icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_INVALIDITIP), - 0)); - } - - - prop = icalcomponent_get_first_property(comp, kind); - - if (prop != 0 && prop_record->function !=0 ){ - funcr = prop_record->function(prop_record,comp,prop); - } - - if(funcr !=0){ - icalcomponent_add_property - (comp, - icalproperty_vanew_xlicerror( - funcr, - icalparameter_new_xlicerrortype( - ICAL_XLICERRORTYPE_INVALIDITIP), - 0)); - - compare = 0; - } - - valid = valid && compare; - } - - - - return valid; - - -} - -int icalrestriction_check(icalcomponent* outer_comp) -{ - icalcomponent_kind comp_kind; - icalproperty_method method; - icalcomponent* inner_comp; - icalproperty *method_prop; - int valid; - - icalerror_check_arg_rz( (outer_comp!=0), "outer comp"); - - - /* Get the Method value from the outer component */ - - comp_kind = icalcomponent_isa(outer_comp); - - if (comp_kind != ICAL_VCALENDAR_COMPONENT){ - icalerror_set_errno(ICAL_BADARG_ERROR); - return 0; - } - - method_prop = icalcomponent_get_first_property(outer_comp, - ICAL_METHOD_PROPERTY); - - if (method_prop == 0){ - method = ICAL_METHOD_NONE; - } else { - method = icalproperty_get_method(method_prop); - } - - - /* Check the VCALENDAR wrapper */ - valid = icalrestriction_check_component(ICAL_METHOD_NONE,outer_comp); - - - /* Now check the inner components */ - - for(inner_comp= icalcomponent_get_first_component(outer_comp, - ICAL_ANY_COMPONENT); - inner_comp != 0; - inner_comp= icalcomponent_get_next_component(outer_comp, - ICAL_ANY_COMPONENT)){ - - valid = valid && icalrestriction_check_component(method,inner_comp); - - } - - - return valid; - -} - -icalrestriction_property_record* -icalrestriction_get_property_restriction(icalproperty_method method, - icalcomponent_kind component, - icalproperty_kind property) -{ - int i; - - for(i = 0; - icalrestriction_property_records[i].restriction != ICAL_RESTRICTION_NONE; - i++){ - - if (method == icalrestriction_property_records[i].method && - component == icalrestriction_property_records[i].component && - property == icalrestriction_property_records[i].property ){ - return &icalrestriction_property_records[i]; - } - } - - return &null_prop_record; -} - - -icalrestriction_component_record* -icalrestriction_get_component_restriction(icalproperty_method method, - icalcomponent_kind component, - icalcomponent_kind subcomponent) -{ - - int i; - - for(i = 0; - icalrestriction_component_records[i].restriction != ICAL_RESTRICTION_NONE; - i++){ - - if (method == icalrestriction_component_records[i].method && - component == icalrestriction_component_records[i].component && - subcomponent == icalrestriction_component_records[i].subcomponent ){ - return &icalrestriction_component_records[i]; - } - } - - return &null_comp_record; -} - diff --git a/libical/src/libical/icalrestriction.h b/libical/src/libical/icalrestriction.h deleted file mode 100644 index 6d414db4af..0000000000 --- a/libical/src/libical/icalrestriction.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalrestriction.h - CREATOR: eric 24 April 1999 - - $Id$ - - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icalrestriction.h - - Contributions from: - Graham Davison (g.m.davison@computer.org) - - -======================================================================*/ - -#include "icalproperty.h" -#include "icalcomponent.h" - -#ifndef ICALRESTRICTION_H -#define ICALRESTRICTION_H - -/* These must stay in this order for icalrestriction_compare to work */ -typedef enum icalrestriction_kind { - ICAL_RESTRICTION_NONE=0, /* 0 */ - ICAL_RESTRICTION_ZERO, /* 1 */ - ICAL_RESTRICTION_ONE, /* 2 */ - ICAL_RESTRICTION_ZEROPLUS, /* 3 */ - ICAL_RESTRICTION_ONEPLUS, /* 4 */ - ICAL_RESTRICTION_ZEROORONE, /* 5 */ - ICAL_RESTRICTION_ONEEXCLUSIVE, /* 6 */ - ICAL_RESTRICTION_ONEMUTUAL, /* 7 */ - ICAL_RESTRICTION_UNKNOWN /* 8 */ -} icalrestriction_kind; - -int -icalrestriction_compare(icalrestriction_kind restr, int count); - - -int -icalrestriction_is_parameter_allowed(icalproperty_kind property, - icalparameter_kind parameter); - -int icalrestriction_check(icalcomponent* comp); - - -#endif /* !ICALRESTRICTION_H */ - - - diff --git a/libical/src/libical/icaltime.c b/libical/src/libical/icaltime.c deleted file mode 100644 index d5b228b089..0000000000 --- a/libical/src/libical/icaltime.c +++ /dev/null @@ -1,566 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: icaltime.c - CREATOR: eric 02 June 2000 - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The Original Code is eric. The Initial Developer of the Original - Code is Eric Busboom - - - ======================================================================*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "icaltime.h" -#include <assert.h> -#include <string.h> -#include <stdlib.h> -#include <stdio.h> - -#ifdef ICAL_NO_LIBICAL -#define icalerror_set_errno(x) -#define icalerror_check_arg_rv(x,y) -#define icalerror_check_arg_re(x,y,z) -#else -#include "icalerror.h" -#include "icalmemory.h" -#endif - - - - -struct icaltimetype -icaltime_from_timet(time_t tm, int is_date) -{ - struct icaltimetype tt = icaltime_null_time(); - struct tm t; - - t = *(gmtime(&tm)); - - if(is_date == 0){ - tt.second = t.tm_sec; - tt.minute = t.tm_min; - tt.hour = t.tm_hour; - } else { - tt.second = tt.minute =tt.hour = 0 ; - } - - tt.day = t.tm_mday; - tt.month = t.tm_mon + 1; - tt.year = t.tm_year+ 1900; - - tt.is_utc = 1; - tt.is_date = is_date; - - return tt; -} - -/* Structure used by set_tz to hold an old value of TZ, and the new - value, which is in memory we will have to free in unset_tz */ -/* This will hold the last "TZ=XXX" string we used with putenv(). After we - call putenv() again to set a new TZ string, we can free the previous one. - As far as I know, no libc implementations actually free the memory used in - the environment variables (how could they know if it is a static string or - a malloc'ed string?), so we have to free it ourselves. */ -static char* saved_tz = NULL; - - -/* If you use set_tz(), you must call unset_tz() some time later to restore the - original TZ. Pass unset_tz() the string that set_tz() returns. */ -char* set_tz(const char* tzid) -{ - char *old_tz, *old_tz_copy = NULL, *new_tz; - - /* Get the old TZ setting and save a copy of it to return. */ - old_tz = getenv("TZ"); - if(old_tz){ - old_tz_copy = (char*)malloc(strlen (old_tz) + 4); - - if(old_tz_copy == 0){ - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - strcpy (old_tz_copy, "TZ="); - strcpy (old_tz_copy + 3, old_tz); - } - - /* Create the new TZ string. */ - new_tz = (char*)malloc(strlen (tzid) + 4); - - if(new_tz == 0){ - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - strcpy (new_tz, "TZ="); - strcpy (new_tz + 3, tzid); - - /* Add the new TZ to the environment. */ - putenv(new_tz); - - /* Free any previous TZ environment string we have used. */ - if (saved_tz) - free (saved_tz); - - /* Save a pointer to the TZ string we just set, so we can free it later. */ - saved_tz = new_tz; - - return old_tz_copy; /* This will be zero if the TZ env var was not set */ -} - -void unset_tz(char *tzstr) -{ - /* restore the original environment */ - - if(tzstr!=0){ - putenv(tzstr); - } else { - putenv("TZ"); /* Delete from environment */ - } - - /* Free any previous TZ environment string we have used. */ - if (saved_tz) - free (saved_tz); - - /* Save a pointer to the TZ string we just set, so we can free it later. - (This can possibly be NULL if there was no TZ to restore.) */ - saved_tz = tzstr; -} - -time_t icaltime_as_timet(struct icaltimetype tt) -{ - struct tm stm; - time_t t; - - memset(&stm,0,sizeof( struct tm)); - - if(icaltime_is_null_time(tt)) { - return 0; - } - - stm.tm_sec = tt.second; - stm.tm_min = tt.minute; - stm.tm_hour = tt.hour; - stm.tm_mday = tt.day; - stm.tm_mon = tt.month-1; - stm.tm_year = tt.year-1900; - stm.tm_isdst = -1; - - if(tt.is_utc == 1 || tt.is_date == 1){ - char *old_tz = set_tz("UTC"); - t = mktime(&stm); - unset_tz(old_tz); - } else { - t = mktime(&stm); - } - - return t; - -} - -char* icaltime_as_ical_string(struct icaltimetype tt) -{ - size_t size = 17; - char* buf = icalmemory_new_buffer(size); - - if(tt.is_date){ - snprintf(buf, size,"%04d%02d%02d",tt.year,tt.month,tt.day); - } else { - char* fmt; - if(tt.is_utc){ - fmt = "%04d%02d%02dT%02d%02d%02dZ"; - } else { - fmt = "%04d%02d%02dT%02d%02d%02d"; - } - snprintf(buf, size,fmt,tt.year,tt.month,tt.day, - tt.hour,tt.minute,tt.second); - } - - icalmemory_add_tmp_buffer(buf); - - return buf; - -} - - -/* convert tt, of timezone tzid, into a utc time */ -struct icaltimetype icaltime_as_utc(struct icaltimetype tt,const char* tzid) -{ - int tzid_offset; - - if(tt.is_utc == 1 || tt.is_date == 1){ - return tt; - } - - tzid_offset = icaltime_utc_offset(tt,tzid); - - tt.second -= tzid_offset; - - tt.is_utc = 1; - - return icaltime_normalize(tt); -} - -/* convert tt, a time in UTC, into a time in timezone tzid */ -struct icaltimetype icaltime_as_zone(struct icaltimetype tt,const char* tzid) -{ - int tzid_offset; - - tzid_offset = icaltime_utc_offset(tt,tzid); - - tt.second += tzid_offset; - - tt.is_utc = 0; - - return icaltime_normalize(tt); - -} - - -/* Return the offset of the named zone as seconds. tt is a time - indicating the date for which you want the offset */ -int icaltime_utc_offset(struct icaltimetype ictt, const char* tzid) -{ - - time_t tt = icaltime_as_timet(ictt); - time_t offset_tt; - struct tm gtm; - - char *tz_str = 0; - - if(tzid != 0){ - tz_str = set_tz(tzid); - } - - /* Mis-interpret a UTC broken out time as local time */ - gtm = *(gmtime(&tt)); - gtm.tm_isdst = localtime(&tt)->tm_isdst; - offset_tt = mktime(>m); - - if(tzid != 0){ - unset_tz(tz_str); - } - - return tt-offset_tt; -} - - - -/* Normalize by converting from localtime to utc and back to local - time. This uses localtime because localtime and mktime are inverses - of each other */ - -struct icaltimetype icaltime_normalize(struct icaltimetype tt) -{ - struct tm stm; - time_t tut; - - memset(&stm,0,sizeof( struct tm)); - - stm.tm_sec = tt.second; - stm.tm_min = tt.minute; - stm.tm_hour = tt.hour; - stm.tm_mday = tt.day; - stm.tm_mon = tt.month-1; - stm.tm_year = tt.year-1900; - stm.tm_isdst = -1; /* prevents mktime from changing hour based on - daylight savings */ - - tut = mktime(&stm); - - stm = *(localtime(&tut)); - - tt.second = stm.tm_sec; - tt.minute = stm.tm_min; - tt.hour = stm.tm_hour; - tt.day = stm.tm_mday; - tt.month = stm.tm_mon +1; - tt.year = stm.tm_year+1900; - - return tt; -} - - -#ifndef ICAL_NO_LIBICAL -#include "icalvalue.h" - -struct icaltimetype icaltime_from_string(const char* str) -{ - struct icaltimetype tt = icaltime_null_time(); - int size; - - icalerror_check_arg_re(str!=0,"str",icaltime_null_time()); - - size = strlen(str); - - if(size == 15) { /* floating time */ - tt.is_utc = 0; - tt.is_date = 0; - } else if (size == 16) { /* UTC time, ends in 'Z'*/ - tt.is_utc = 1; - tt.is_date = 0; - - if(str[15] != 'Z'){ - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - return icaltime_null_time(); - } - - } else if (size == 8) { /* A DATE */ - tt.is_utc = 1; - tt.is_date = 1; - } else { /* error */ - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - return icaltime_null_time(); - } - - if(tt.is_date == 1){ - sscanf(str,"%04d%02d%02d",&tt.year,&tt.month,&tt.day); - } else { - char tsep; - sscanf(str,"%04d%02d%02d%c%02d%02d%02d",&tt.year,&tt.month,&tt.day, - &tsep,&tt.hour,&tt.minute,&tt.second); - - if(tsep != 'T'){ - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - return icaltime_null_time(); - } - - } - - return tt; -} -#endif - -char ctime_str[20]; -char* icaltime_as_ctime(struct icaltimetype t) -{ - time_t tt; - - tt = icaltime_as_timet(t); - sprintf(ctime_str,"%s",ctime(&tt)); - - ctime_str[strlen(ctime_str)-1] = 0; - - return ctime_str; -} - - -short days_in_month[] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; - -short icaltime_days_in_month(short month,short year) -{ - - int is_leap =0; - int days = days_in_month[month]; - - assert(month > 0); - assert(month <= 12); - - if( (year % 4 == 0 && year % 100 != 0) || - year % 400 == 0){ - is_leap =1; - } - - if( month == 2){ - days += is_leap; - } - - return days; -} - -/* 1-> Sunday, 7->Saturday */ -short icaltime_day_of_week(struct icaltimetype t){ - - time_t tt = icaltime_as_timet(t); - struct tm *tm; - - if(t.is_utc == 1){ - tm = gmtime(&tt); - } else { - tm = localtime(&tt); - } - - return tm->tm_wday+1; -} - -/* Day of the year that the first day of the week (Sunday) is on */ -short icaltime_start_doy_of_week(struct icaltimetype t){ - time_t tt = icaltime_as_timet(t); - time_t start_tt; - struct tm *stm; - int syear; - - stm = gmtime(&tt); - syear = stm->tm_year; - - start_tt = tt - stm->tm_wday*(60*60*24); - - stm = gmtime(&start_tt); - - if(syear == stm->tm_year){ - return stm->tm_yday+1; - } else { - /* return negative to indicate that start of week is in - previous year. */ - int is_leap = 0; - int year = stm->tm_year; - - if( (year % 4 == 0 && year % 100 != 0) || - year % 400 == 0){ - is_leap =1; - } - - return (stm->tm_yday+1)-(365+is_leap); - } - -} - -short icaltime_week_number(struct icaltimetype ictt) -{ - char str[5]; - time_t t = icaltime_as_timet(ictt); - int week_no; - - strftime(str,5,"%V", gmtime(&t)); - - week_no = atoi(str); - - return week_no; - -} - - -short icaltime_day_of_year(struct icaltimetype t){ - time_t tt = icaltime_as_timet(t); - struct tm *stm; - - if(t.is_utc==1){ - stm = gmtime(&tt); - } else { - stm = localtime(&tt); - } - - return stm->tm_yday+1; - -} - -/* Jan 1 is day #1, not 0 */ -struct icaltimetype icaltime_from_day_of_year(short doy, short year) -{ - struct tm stm; - time_t tt; - char *old_tz = set_tz("UTC"); - - /* Get the time of january 1 of this year*/ - memset(&stm,0,sizeof(struct tm)); - stm.tm_year = year-1900; - stm.tm_mday = 1; - - tt = mktime(&stm); - unset_tz(old_tz); - - - /* Now add in the days */ - - doy--; - tt += doy *60*60*24; - - return icaltime_from_timet(tt, 1); -} - -struct icaltimetype icaltime_null_time() -{ - struct icaltimetype t; - memset(&t,0,sizeof(struct icaltimetype)); - - return t; -} - - -int icaltime_is_valid_time(struct icaltimetype t){ - if(t.is_utc > 1 || t.is_utc < 0 || - t.year < 0 || t.year > 3000 || - t.is_date > 1 || t.is_date < 0){ - return 0; - } else { - return 1; - } - -} - -int icaltime_is_null_time(struct icaltimetype t) -{ - if (t.second +t.minute+t.hour+t.day+t.month+t.year == 0){ - return 1; - } - - return 0; - -} - -int icaltime_compare(struct icaltimetype a,struct icaltimetype b) -{ - time_t t1 = icaltime_as_timet(a); - time_t t2 = icaltime_as_timet(b); - - if (t1 > t2) { - return 1; - } else if (t1 < t2) { - return -1; - } else { - return 0; - } - -} - -int -icaltime_compare_date_only (struct icaltimetype a, struct icaltimetype b) -{ - time_t t1; - time_t t2; - - if (a.year == b.year && a.month == b.month && a.day == b.day) - return 0; - - t1 = icaltime_as_timet (a); - t2 = icaltime_as_timet (b); - - if (t1 > t2) - return 1; - else if (t1 < t2) - return -1; - else { - /* not reached */ - assert (0); - return 0; - } -} - -/* These are defined in icalduration.c: -struct icaltimetype icaltime_add(struct icaltimetype t, - struct icaldurationtype d) -struct icaldurationtype icaltime_subtract(struct icaltimetype t1, - struct icaltimetype t2) -*/ - - - diff --git a/libical/src/libical/icaltime.h b/libical/src/libical/icaltime.h deleted file mode 100644 index 0f0379b76e..0000000000 --- a/libical/src/libical/icaltime.h +++ /dev/null @@ -1,145 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icaltime.h - CREATOR: eric 02 June 2000 - - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The Original Code is eric. The Initial Developer of the Original - Code is Eric Busboom - - -======================================================================*/ - -#ifndef ICALTIME_H -#define ICALTIME_H - -#include <time.h> - -/* icaltime_span is returned by icalcomponent_get_span() */ -struct icaltime_span { - time_t start; /* in UTC */ - time_t end; /* in UTC */ - int is_busy; /* 1->busy time, 0-> free time */ -}; - - -struct icaltimetype -{ - int year; - int month; - int day; - int hour; - int minute; - int second; - - int is_utc; /* 1-> time is in UTC timezone */ - - int is_date; /* 1 -> interpret this as date. */ - - const char* zone; /*Ptr to Olsen placename. Libical does not own mem*/ -}; - -/* Convert seconds past UNIX epoch to a timetype*/ -struct icaltimetype icaltime_from_timet(time_t v, int is_date); - -/* Return the time as seconds past the UNIX epoch */ -time_t icaltime_as_timet(struct icaltimetype); - -/* Return a string represention of the time, in RFC2445 format. The - string is owned by libical */ -char* icaltime_as_ical_string(struct icaltimetype tt); - -/* Like icaltime_from_timet(), except that the input may be in seconds - past the epoch in floating time. This routine is deprecated */ -struct icaltimetype icaltime_from_int(int v, int is_date, int is_utc); - -/* Like icaltime_as_timet, but in a floating epoch. This routine is deprecated */ -int icaltime_as_int(struct icaltimetype); - -/* create a time from an ISO format string */ -struct icaltimetype icaltime_from_string(const char* str); - -/* Routines for handling timezones */ -/* Return the offset of the named zone as seconds. tt is a time - indicating the date for which you want the offset */ -int icaltime_utc_offset(struct icaltimetype tt, const char* tzid); - -/* convert tt, of timezone tzid, into a utc time. Does nothing if the - time is already UTC. */ -struct icaltimetype icaltime_as_utc(struct icaltimetype tt, - const char* tzid); - -/* convert tt, a time in UTC, into a time in timezone tzid */ -struct icaltimetype icaltime_as_zone(struct icaltimetype tt, - const char* tzid); - -/* Return a null time, which indicates no time has been set. This time represent the beginning of the epoch */ -struct icaltimetype icaltime_null_time(void); - -/* Return true of the time is null. */ -int icaltime_is_null_time(struct icaltimetype t); - -/* Returns false if the time is clearly invalid, but is not null. This - is usually the result of creating a new time type buy not clearing - it, or setting one of the flags to an illegal value. */ -int icaltime_is_valid_time(struct icaltimetype t); - -/* Reset all of the time components to be in their normal ranges. For - instance, given a time with minutes=70, the minutes will be reduces - to 10, and the hour incremented. This allows the caller to do - arithmetic on times without worrying about overflow or - underflow. */ -struct icaltimetype icaltime_normalize(struct icaltimetype t); - -/* Return the day of the year of the given time */ -short icaltime_day_of_year(struct icaltimetype t); - -/* Create a new time, given a day of year and a year. */ -struct icaltimetype icaltime_from_day_of_year(short doy, short year); - -/* Return the day of the week of the given time. Sunday is 1 */ -short icaltime_day_of_week(struct icaltimetype t); - -/* Return the day of the year for the Sunday of the week that the - given time is within. */ -short icaltime_start_doy_of_week(struct icaltimetype t); - -/* Return a string with the time represented in the same format as ctime(). THe string is owned by libical */ -char* icaltime_as_ctime(struct icaltimetype); - -/* Return the week number for the week the given time is within */ -short icaltime_week_number(struct icaltimetype t); - -/* Create a new time from a weeknumber and a year. */ -struct icaltimetype icaltime_from_week_number(short week_number, short year); - -/* Return -1, 0, or 1 to indicate that a<b, a==b or a>b */ -int icaltime_compare(struct icaltimetype a,struct icaltimetype b); - -/* like icaltime_compare, but only use the date parts. */ -int icaltime_compare_date_only(struct icaltimetype a, struct icaltimetype b); - -/* Return the number of days in the given month */ -short icaltime_days_in_month(short month,short year); - - -#endif /* !ICALTIME_H */ - - - diff --git a/libical/src/libical/icaltypes.c b/libical/src/libical/icaltypes.c deleted file mode 100644 index c6c388a978..0000000000 --- a/libical/src/libical/icaltypes.c +++ /dev/null @@ -1,263 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: icaltypes.c - CREATOR: eric 16 May 1999 - - $Id$ - $Locker$ - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icaltypes.c - - ======================================================================*/ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "icaltypes.h" -#include "icalerror.h" -#include "icalmemory.h" -#include <stdlib.h> /* for malloc and abs() */ -#include <errno.h> /* for errno */ -#include <string.h> /* for icalmemory_strdup */ -#include <assert.h> - -#define TEMP_MAX 1024 - -void* -icalattachtype_get_data (struct icalattachtype* type); - -struct icalattachtype* -icalattachtype_new() -{ - struct icalattachtype* v; - - if ( ( v = (struct icalattachtype*) - malloc(sizeof(struct icalattachtype))) == 0) { - errno = ENOMEM; - return 0; - } - - v->refcount = 1; - - v->binary = 0; - v->owns_binary = 0; - - v->base64 = 0; - v->owns_base64 = 0; - - v->url = 0; - - return v; -} - - -void -icalattachtype_free(struct icalattachtype* v) -{ - icalerror_check_arg( (v!=0),"v"); - - v->refcount--; - - if (v->refcount <= 0){ - - if (v->base64 != 0 && v->owns_base64 != 0){ - free(v->base64); - } - - if (v->binary != 0 && v->owns_binary != 0){ - free(v->binary); - } - - if (v->url != 0){ - free(v->url); - } - - free(v); - } -} - -void icalattachtype_add_reference(struct icalattachtype* v) -{ - icalerror_check_arg( (v!=0),"v"); - v->refcount++; -} - -void icalattachtype_set_url(struct icalattachtype* v, char* url) -{ - icalerror_check_arg( (v!=0),"v"); - - if (v->url != 0){ - free (v->url); - } - - v->url = icalmemory_strdup(url); - - /* HACK This routine should do something if icalmemory_strdup returns NULL */ - -} - -char* icalattachtype_get_url(struct icalattachtype* v) -{ - icalerror_check_arg( (v!=0),"v"); - return v->url; -} - -void icalattachtype_set_base64(struct icalattachtype* v, char* base64, - int owns) -{ - icalerror_check_arg( (v!=0),"v"); - - v->base64 = base64; - v->owns_base64 = !(owns != 0 ); - -} - -char* icalattachtype_get_base64(struct icalattachtype* v) -{ - icalerror_check_arg( (v!=0),"v"); - return v->base64; -} - -void icalattachtype_set_binary(struct icalattachtype* v, char* binary, - int owns) -{ - icalerror_check_arg( (v!=0),"v"); - - v->binary = binary; - v->owns_binary = !(owns != 0 ); - -} - -void* icalattachtype_get_binary(struct icalattachtype* v) -{ - icalerror_check_arg( (v!=0),"v"); - return v->binary; -} - - -struct icaltriggertype icaltriggertype_from_string(const char* str) -{ - - - struct icaltriggertype tr, null_tr; - int old_ieaf = icalerror_errors_are_fatal; - - tr.time= icaltime_null_time(); - tr.duration = icaldurationtype_from_int(0); - - null_tr = tr; - - if(str == 0) goto error; - - - icalerror_errors_are_fatal = 0; - - tr.time = icaltime_from_string(str); - - icalerror_errors_are_fatal = old_ieaf; - - if (icaltime_is_null_time(tr.time)){ - - tr.duration = icaldurationtype_from_string(str); - - if(icaldurationtype_as_int(tr.duration) == 0) goto error; - } - - return tr; - - error: - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - return null_tr; - -} - - -struct icalreqstattype icalreqstattype_from_string(char* str) -{ - char *p1,*p2; - struct icalreqstattype stat; - int major, minor; - - icalerror_check_arg((str != 0),"str"); - - stat.code = ICAL_UNKNOWN_STATUS; - stat.debug = 0; - stat.desc = 0; - - /* Get the status numbers */ - - sscanf(str, "%d.%d",&major, &minor); - - if (major <= 0 || minor < 0){ - icalerror_set_errno(ICAL_BADARG_ERROR); - return stat; - } - - stat.code = icalenum_num_to_reqstat(major, minor); - - if (stat.code == ICAL_UNKNOWN_STATUS){ - icalerror_set_errno(ICAL_BADARG_ERROR); - return stat; - } - - - p1 = strchr(str,';'); - - if (p1 == 0){ -/* icalerror_set_errno(ICAL_BADARG_ERROR);*/ - return stat; - } - - /* Just ignore the second clause; it will be taken from inside the library - */ - - - - p2 = strchr(p1+1,';'); - if (p2 != 0 && *p2 != 0){ - stat.debug = p2+1; - } - - return stat; - -} - -char* icalreqstattype_as_string(struct icalreqstattype stat) -{ - char *temp; - - temp = (char*)icalmemory_tmp_buffer(TEMP_MAX); - - icalerror_check_arg_rz((stat.code != ICAL_UNKNOWN_STATUS),"Status"); - - if (stat.desc == 0){ - stat.desc = icalenum_reqstat_desc(stat.code); - } - - if(stat.debug != 0){ - snprintf(temp,TEMP_MAX,"%d.%d;%s;%s", icalenum_reqstat_major(stat.code), - icalenum_reqstat_minor(stat.code), - stat.desc, stat.debug); - - } else { - snprintf(temp,TEMP_MAX,"%d.%d;%s", icalenum_reqstat_major(stat.code), - icalenum_reqstat_minor(stat.code), - stat.desc); - } - - return temp; -} diff --git a/libical/src/libical/icaltypes.h b/libical/src/libical/icaltypes.h deleted file mode 100644 index 04e04c9dc3..0000000000 --- a/libical/src/libical/icaltypes.h +++ /dev/null @@ -1,136 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icaltypes.h - CREATOR: eric 20 March 1999 - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icaltypes.h - -======================================================================*/ - -#ifndef ICALTYPES_H -#define ICALTYPES_H - -#include <time.h> -#include "icalenums.h" -#include "icaltime.h" -#include "icalduration.h" -#include "icalperiod.h" - - -/* This type type should probably be an opaque type... */ -struct icalattachtype -{ - void* binary; - int owns_binary; - - char* base64; - int owns_base64; - - char* url; - - int refcount; - -}; - -/* converts base64 to binary, fetches url and stores as binary, or - just returns data */ - -struct icalattachtype* icalattachtype_new(void); -void icalattachtype_add_reference(struct icalattachtype* v); -void icalattachtype_free(struct icalattachtype* v); - -void icalattachtype_set_url(struct icalattachtype* v, char* url); -char* icalattachtype_get_url(struct icalattachtype* v); - -void icalattachtype_set_base64(struct icalattachtype* v, char* base64, - int owns); -char* icalattachtype_get_base64(struct icalattachtype* v); - -void icalattachtype_set_binary(struct icalattachtype* v, char* binary, - int owns); -void* icalattachtype_get_binary(struct icalattachtype* v); - -struct icalgeotype -{ - float lat; - float lon; -}; - - -struct icaldatetimeperiodtype -{ - struct icaltimetype time; - struct icalperiodtype period; -}; - - -struct icaltriggertype -{ - struct icaltimetype time; - struct icaldurationtype duration; -}; - -struct icaltriggertype icaltriggertype_from_string(const char* str); - -/* struct icalreqstattype. This struct contains two string pointers, -but don't try to free either of them. The "desc" string is a pointer -to a static table inside the library. Don't try to free it. The -"debug" string is a pointer into the string that the called passed -into to icalreqstattype_from_string. Don't try to free it either, and -don't use it after the original string has been freed. - -BTW, you would get that original string from -*icalproperty_get_requeststatus() or icalvalue_get_text(), when -operating on a the value of a request_status property. */ - -struct icalreqstattype { - - icalrequeststatus code; - const char* desc; - const char* debug; -}; - -struct icalreqstattype icalreqstattype_from_string(char* str); -char* icalreqstattype_as_string(struct icalreqstattype); - - - -struct icaltimezonephase { - const char* tzname; - int is_stdandard; /* 1 = standard tme, 0 = daylight savings time */ - struct icaltimetype dtstart; - int offsetto; - int tzoffsetfrom; - const char* comment; - struct icaldatetimeperiodtype rdate; - const char* rrule; -}; - - -struct icaltimezonetype { - const char* tzid; - struct icaltimetype last_mod; - const char* tzurl; - - /* Array of phases. The end of the array is a phase with tzname == 0 */ - struct icaltimezonephase *phases; -}; - -void icaltimezonetype_free(struct icaltimezonetype tzt); - - -#endif /* !ICALTYPES_H */ diff --git a/libical/src/libical/icalvalue.c b/libical/src/libical/icalvalue.c deleted file mode 100644 index e7054bb80d..0000000000 --- a/libical/src/libical/icalvalue.c +++ /dev/null @@ -1,1197 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalvalue.c - CREATOR: eric 02 May 1999 - - $Id$ - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icalvalue.c - - Contributions from: - Graham Davison (g.m.davison@computer.org) - - -======================================================================*/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "icalerror.h" -#include "icalmemory.h" -#include "icalparser.h" -#include "icalenums.h" -#include "icalvalueimpl.h" - -#include <stdlib.h> /* for malloc */ -#include <stdio.h> /* for sprintf */ -#include <string.h> /* For memset, others */ -#include <stddef.h> /* For offsetof() macro */ -#include <errno.h> -#include <time.h> /* for mktime */ -#include <stdlib.h> /* for atoi and atof */ -#include <limits.h> /* for SHRT_MAX */ - -#if _MAC_OS_ -#include "icalmemory_strdup.h" -#endif - -#define TMP_BUF_SIZE 1024 - -void print_datetime_to_string(char* str, struct icaltimetype *data); -void print_date_to_string(char* str, struct icaltimetype *data); -void print_time_to_string(char* str, struct icaltimetype *data); -void print_recur_to_string(char* str, struct icaltimetype *data); - - -struct icalvalue_impl* icalvalue_new_impl(icalvalue_kind kind){ - - struct icalvalue_impl* v; - - if ( ( v = (struct icalvalue_impl*) - malloc(sizeof(struct icalvalue_impl))) == 0) { - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - strcpy(v->id,"val"); - - v->kind = kind; - v->size = 0; - v->parent = 0; - v->x_value = 0; - memset(&(v->data),0,sizeof(v->data)); - - return v; - -} - - - -icalvalue* -icalvalue_new (icalvalue_kind kind) -{ - return (icalvalue*)icalvalue_new_impl(kind); -} - -icalvalue* icalvalue_new_clone(icalvalue* value){ - - struct icalvalue_impl* new; - struct icalvalue_impl* old = (struct icalvalue_impl*)value; - - new = icalvalue_new_impl(old->kind); - - if (new == 0){ - return 0; - } - - - strcpy(new->id, old->id); - new->kind = old->kind; - new->size = old->size; - - switch (new->kind){ - - /* The contents of the attach value may or may not be owned by the - * library. */ - case ICAL_ATTACH_VALUE: - case ICAL_BINARY_VALUE: - { - /* HACK ugh. I don't feel like impleenting this */ - } - - case ICAL_STRING_VALUE: - case ICAL_TEXT_VALUE: - case ICAL_CALADDRESS_VALUE: - case ICAL_URI_VALUE: - { - if (old->data.v_string != 0) { - new->data.v_string=icalmemory_strdup(old->data.v_string); - - if ( new->data.v_string == 0 ) { - return 0; - } - - } - break; - } - case ICAL_RECUR_VALUE: - { - if(old->data.v_recur != 0){ - new->data.v_recur = malloc(sizeof(struct icalrecurrencetype)); - - if(new->data.v_recur == 0){ - return 0; - } - - memcpy( new->data.v_recur, old->data.v_recur, - sizeof(struct icalrecurrencetype)); - } - break; - } - - default: - { - /* all of the other types are stored as values, not - pointers, so we can just copy the whole structure. */ - - new->data = old->data; - } - } - - return new; -} - -char* icalmemory_strdup_and_dequote(const char* str) -{ - const char* p; - char* out = (char*)malloc(sizeof(char) * strlen(str) +1); - char* pout; - - if (out == 0){ - return 0; - } - - pout = out; - - for (p = str; *p!=0; p++){ - - if( *p == '\\') - { - p++; - switch(*p){ - case 0: - { - *pout = '\0'; - break; - - } - case 'n': - { - *pout = '\n'; - break; - } - case 'N': - { - *pout = '\n'; - break; - } - case '\\': - case ',': - case ';': - { - *pout = *p; - break; - } - default: - { - *pout = ' '; - } - } - } else { - *pout = *p; - } - - pout++; - - } - - *pout = '\0'; - - return out; -} - -icalvalue* icalvalue_new_enum(icalvalue_kind kind, int x_type, const char* str) -{ - int e = icalproperty_string_to_enum(str); - struct icalvalue_impl *value; - - if(e != 0 && icalproperty_enum_belongs_to_property( - icalproperty_value_kind_to_kind(kind),e)) { - - value = icalvalue_new_impl(kind); - value->data.v_enum = e; - } else { - /* Make it an X value */ - value = icalvalue_new_impl(kind); - value->data.v_enum = x_type; - icalvalue_set_x(value,str); - } - - return value; -} - - -icalvalue* icalvalue_new_from_string_with_error(icalvalue_kind kind,const char* str,icalproperty** error) -{ - - struct icalvalue_impl *value = 0; - - icalerror_check_arg_rz(str!=0,"str"); - - if (error != 0){ - *error = 0; - } - - switch (kind){ - - case ICAL_ATTACH_VALUE: - case ICAL_BINARY_VALUE: - case ICAL_BOOLEAN_VALUE: - { - /* HACK */ - value = 0; - - if (error != 0){ - char temp[TMP_BUF_SIZE]; - sprintf(temp,"%s Values are not implemented", - icalparameter_kind_to_string(kind)); - *error = icalproperty_vanew_xlicerror( - temp, - icalparameter_new_xlicerrortype( - ICAL_XLICERRORTYPE_VALUEPARSEERROR), - 0); - } - break; - } - - - case ICAL_TRANSP_VALUE: - value = icalvalue_new_enum(kind, ICAL_TRANSP_X,str); - break; - case ICAL_METHOD_VALUE: - value = icalvalue_new_enum(kind, ICAL_METHOD_X,str); - break; - case ICAL_STATUS_VALUE: - value = icalvalue_new_enum(kind, ICAL_STATUS_X,str); - break; - case ICAL_ACTION_VALUE: - value = icalvalue_new_enum(kind, ICAL_ACTION_X,str); - break; - case ICAL_CLASS_VALUE: - value = icalvalue_new_enum(kind, ICAL_CLASS_X,str); - break; - - - case ICAL_INTEGER_VALUE: - { - value = icalvalue_new_integer(atoi(str)); - break; - } - - case ICAL_FLOAT_VALUE: - { - value = icalvalue_new_float(atof(str)); - break; - } - - case ICAL_UTCOFFSET_VALUE: - { - value = icalparser_parse_value(kind,str,(icalcomponent*)0); - break; - } - - case ICAL_TEXT_VALUE: - { - char* dequoted_str = icalmemory_strdup_and_dequote(str); - value = icalvalue_new_text(dequoted_str); - free(dequoted_str); - break; - } - - - case ICAL_STRING_VALUE: - { - value = icalvalue_new_string(str); - break; - } - - case ICAL_CALADDRESS_VALUE: - { - value = icalvalue_new_caladdress(str); - break; - } - - case ICAL_URI_VALUE: - { - value = icalvalue_new_uri(str); - break; - } - - - case ICAL_GEO_VALUE: - { - value = 0; - /* HACK */ - - if (error != 0){ - char temp[TMP_BUF_SIZE]; - sprintf(temp,"GEO Values are not implemented"); - *error = icalproperty_vanew_xlicerror( - temp, - icalparameter_new_xlicerrortype( - ICAL_XLICERRORTYPE_VALUEPARSEERROR), - 0); - } - - /*icalerror_warn("Parsing GEO properties is unimplmeneted");*/ - - break; - } - - case ICAL_RECUR_VALUE: - { - struct icalrecurrencetype rt; - rt = icalrecurrencetype_from_string(str); - value = icalvalue_new_recur(rt); - break; - } - - case ICAL_TIME_VALUE: - case ICAL_DATE_VALUE: - case ICAL_DATETIME_VALUE: - case ICAL_DATETIMEDATE_VALUE: - { - struct icaltimetype tt; - tt = icaltime_from_string(str); - if(!icaltime_is_null_time(tt)){ - value = icalvalue_new_impl(kind); - value->data.v_time = tt; - } - break; - } - - case ICAL_DATETIMEPERIOD_VALUE: - { - struct icaltimetype tt; - struct icalperiodtype p; - tt = icaltime_from_string(str); - p = icalperiodtype_from_string(str); - - if(!icaltime_is_null_time(tt)){ - value = icalvalue_new_datetime(tt); - } else if (!icalperiodtype_is_null_period(p)){ - value = icalvalue_new_period(p); - } - - break; - } - - case ICAL_DURATION_VALUE: - { - struct icaldurationtype dur = icaldurationtype_from_string(str); - - if(icaldurationtype_is_null_duration(dur)){ - value = 0; - } else { - value = icalvalue_new_duration(dur); - } - - break; - } - - case ICAL_PERIOD_VALUE: - { - struct icalperiodtype p; - p = icalperiodtype_from_string(str); - - if(!icalperiodtype_is_null_period(p)){ - value = icalvalue_new_period(p); - } - break; - } - - case ICAL_TRIGGER_VALUE: - { - struct icaltriggertype tr = icaltriggertype_from_string(str); - value = icalvalue_new_trigger(tr); - break; - } - - default: - { - - if (error != 0 ){ - char temp[TMP_BUF_SIZE]; - - snprintf(temp,TMP_BUF_SIZE,"Unknown type for \'%s\'",str); - - *error = icalproperty_vanew_xlicerror( - temp, - icalparameter_new_xlicerrortype( - ICAL_XLICERRORTYPE_VALUEPARSEERROR), - 0); - } - - icalerror_warn("icalvalue_new_from_string got an unknown value type"); - value=0; - } - } - - - if (error != 0 && *error == 0 && value == 0){ - char temp[TMP_BUF_SIZE]; - - snprintf(temp,TMP_BUF_SIZE,"Failed to parse value: \'%s\'",str); - - *error = icalproperty_vanew_xlicerror( - temp, - icalparameter_new_xlicerrortype( - ICAL_XLICERRORTYPE_VALUEPARSEERROR), - 0); - } - - - return value; - -} - -icalvalue* icalvalue_new_from_string(icalvalue_kind kind,const char* str) -{ - return icalvalue_new_from_string_with_error(kind,str,(icalproperty*)0); -} - - - -void -icalvalue_free (icalvalue* value) -{ - struct icalvalue_impl* v = (struct icalvalue_impl*)value; - - icalerror_check_arg_rv((value != 0),"value"); - -#ifdef ICAL_FREE_ON_LIST_IS_ERROR - icalerror_assert( (v->parent ==0),"This value is still attached to a property"); - -#else - if(v->parent !=0){ - return; - } -#endif - - if(v->x_value != 0){ - free(v->x_value); - } - - switch (v->kind){ - case ICAL_BINARY_VALUE: - case ICAL_ATTACH_VALUE: { - /* HACK ugh. This will be tough to implement */ - } - case ICAL_TEXT_VALUE: - case ICAL_CALADDRESS_VALUE: - case ICAL_URI_VALUE: - { - if (v->data.v_string != 0) { - free((void*)v->data.v_string); - v->data.v_string = 0; - } - break; - } - case ICAL_RECUR_VALUE: - { - if(v->data.v_recur != 0){ - free((void*)v->data.v_recur); - v->data.v_recur = 0; - } - break; - } - - default: - { - /* Nothing to do */ - } - } - - v->kind = ICAL_NO_VALUE; - v->size = 0; - v->parent = 0; - memset(&(v->data),0,sizeof(v->data)); - v->id[0] = 'X'; - free(v); -} - -int -icalvalue_is_valid (icalvalue* value) -{ - /*struct icalvalue_impl* v = (struct icalvalue_impl*)value;*/ - - if(value == 0){ - return 0; - } - - return 1; -} - -char* icalvalue_binary_as_ical_string(icalvalue* value) { - - const char* data; - char* str; - icalerror_check_arg_rz( (value!=0),"value"); - - data = icalvalue_get_binary(value); - - str = (char*)icalmemory_tmp_buffer(60); - sprintf(str,"icalvalue_binary_as_ical_string is not implemented yet"); - - return str; -} - - -#define MAX_INT_DIGITS 12 /* Enough for 2^32 + sign*/ -char* icalvalue_int_as_ical_string(icalvalue* value) { - - int data; - char* str = (char*)icalmemory_tmp_buffer(MAX_INT_DIGITS); - - icalerror_check_arg_rz( (value!=0),"value"); - - data = icalvalue_get_integer(value); - - snprintf(str,MAX_INT_DIGITS,"%d",data); - - return str; -} - -char* icalvalue_utcoffset_as_ical_string(icalvalue* value) -{ - int data,h,m,s; - char sign; - char* str = (char*)icalmemory_tmp_buffer(9); - - icalerror_check_arg_rz( (value!=0),"value"); - - data = icalvalue_get_utcoffset(value); - - if (abs(data) == data){ - sign = '+'; - } else { - sign = '-'; - } - - h = data/3600; - m = (data - (h*3600))/ 60; - s = (data - (h*3600) - (m*60)); - - sprintf(str,"%c%02d%02d%02d",sign,abs(h),abs(m),abs(s)); - - return str; -} - -char* icalvalue_string_as_ical_string(icalvalue* value) { - - const char* data; - char* str = 0; - icalerror_check_arg_rz( (value!=0),"value"); - data = ((struct icalvalue_impl*)value)->data.v_string; - - str = (char*)icalmemory_tmp_buffer(strlen(data)+1); - - strcpy(str,data); - - return str; -} - - -char* icalvalue_recur_as_ical_string(icalvalue* value) -{ - struct icalvalue_impl *impl = (struct icalvalue_impl*)value; - struct icalrecurrencetype *recur = impl->data.v_recur; - - return icalrecurrencetype_as_string(recur); -} - -char* icalvalue_text_as_ical_string(icalvalue* value) { - - char *str; - char *str_p; - char *rtrn; - const char *p; - size_t buf_sz; - int line_length; - - line_length = 0; - - buf_sz = strlen(((struct icalvalue_impl*)value)->data.v_string)+1; - - str_p = str = (char*)icalmemory_new_buffer(buf_sz); - - if (str_p == 0){ - return 0; - } - - for(p=((struct icalvalue_impl*)value)->data.v_string; *p!=0; p++){ - - switch(*p){ - case '\n': { - icalmemory_append_string(&str,&str_p,&buf_sz,"\\n"); - line_length+=3; - break; - } - - case '\t': { - icalmemory_append_string(&str,&str_p,&buf_sz,"\\t"); - line_length+=3; - break; - } - case '\r': { - icalmemory_append_string(&str,&str_p,&buf_sz,"\\r"); - line_length+=3; - break; - } - case '\b': { - icalmemory_append_string(&str,&str_p,&buf_sz,"\\b"); - line_length+=3; - break; - } - case '\f': { - icalmemory_append_string(&str,&str_p,&buf_sz,"\\f"); - line_length+=3; - break; - } - - case ';': - case ',':{ - icalmemory_append_char(&str,&str_p,&buf_sz,'\\'); - icalmemory_append_char(&str,&str_p,&buf_sz,*p); - line_length+=3; - break; - } - - case '"':{ - icalmemory_append_char(&str,&str_p,&buf_sz,'\\'); - icalmemory_append_char(&str,&str_p,&buf_sz,*p); - line_length+=3; - break; - } - - default: { - icalmemory_append_char(&str,&str_p,&buf_sz,*p); - line_length++; - } - } - - if (line_length > 65 && *p == ' '){ - icalmemory_append_string(&str,&str_p,&buf_sz,"\n "); - line_length=0; - } - - - if (line_length > 75){ - icalmemory_append_string(&str,&str_p,&buf_sz,"\n "); - line_length=0; - } - - } - - /* Assume the last character is not a '\0' and add one. We could - check *str_p != 0, but that would be an uninitialized memory - read. */ - - - icalmemory_append_char(&str,&str_p,&buf_sz,'\0'); - - rtrn = icalmemory_tmp_copy(str); - - icalmemory_free_buffer(str); - - return rtrn; -} - - -char* icalvalue_attach_as_ical_string(icalvalue* value) { - - struct icalattachtype a; - char * str; - - icalerror_check_arg_rz( (value!=0),"value"); - - a = icalvalue_get_attach(value); - - if (a.binary != 0) { - return icalvalue_binary_as_ical_string(value); - } else if (a.base64 != 0) { - str = (char*)icalmemory_tmp_buffer(strlen(a.base64)+1); - strcpy(str,a.base64); - return str; - } else if (a.url != 0){ - return icalvalue_string_as_ical_string(value); - } else { - icalerrno = ICAL_MALFORMEDDATA_ERROR; - return 0; - } -} - - -char* icalvalue_duration_as_ical_string(icalvalue* value) { - - struct icaldurationtype data; - - icalerror_check_arg_rz( (value!=0),"value"); - data = icalvalue_get_duration(value); - - return icaldurationtype_as_ical_string(data); -} - -void print_time_to_string(char* str, struct icaltimetype *data) -{ - char temp[20]; - - if (data->is_utc == 1){ - sprintf(temp,"%02d%02d%02dZ",data->hour,data->minute,data->second); - } else { - sprintf(temp,"%02d%02d%02d",data->hour,data->minute,data->second); - } - - strcat(str,temp); -} - - -char* icalvalue_time_as_ical_string(icalvalue* value) { - - struct icaltimetype data; - char* str; - icalerror_check_arg_rz( (value!=0),"value"); - data = icalvalue_get_time(value); - - str = (char*)icalmemory_tmp_buffer(8); - - str[0] = 0; - print_time_to_string(str,&data); - - return str; -} - -void print_date_to_string(char* str, struct icaltimetype *data) -{ - char temp[20]; - - sprintf(temp,"%04d%02d%02d",data->year,data->month,data->day); - - strcat(str,temp); -} - -char* icalvalue_date_as_ical_string(icalvalue* value) { - - struct icaltimetype data; - char* str; - icalerror_check_arg_rz( (value!=0),"value"); - data = icalvalue_get_date(value); - - str = (char*)icalmemory_tmp_buffer(9); - - str[0] = 0; - print_date_to_string(str,&data); - - return str; -} - -void print_datetime_to_string(char* str, struct icaltimetype *data) -{ - print_date_to_string(str,data); - strcat(str,"T"); - print_time_to_string(str,data); - -} - -const char* icalvalue_datetime_as_ical_string(icalvalue* value) { - - struct icaltimetype data; - char* str; - icalvalue_kind kind = icalvalue_isa(value); - - icalerror_check_arg_rz( (value!=0),"value"); - - - if( !(kind == ICAL_DATETIMEDATE_VALUE || - kind == ICAL_DATE_VALUE || - kind == ICAL_DATETIME_VALUE || - kind == ICAL_TIME_VALUE)) - { - icalerror_set_errno(ICAL_BADARG_ERROR); - return 0; - } - - data = icalvalue_get_datetime(value); - - str = (char*)icalmemory_tmp_buffer(20); - - str[0] = 0; - - print_datetime_to_string(str,&data); - - return str; - -} - - -const char* icalvalue_datetimedate_as_ical_string(icalvalue* value) { - - struct icaltimetype data; - icalerror_check_arg_rz( (value!=0),"value"); - data = icalvalue_get_datetime(value); - - if (data.is_date == 1){ - return icalvalue_date_as_ical_string(value); - } else { - return icalvalue_datetime_as_ical_string(value); - } -} - - -char* icalvalue_float_as_ical_string(icalvalue* value) { - - float data; - char* str; - icalerror_check_arg_rz( (value!=0),"value"); - data = icalvalue_get_float(value); - - str = (char*)icalmemory_tmp_buffer(15); - - sprintf(str,"%f",data); - - return str; -} - -char* icalvalue_geo_as_ical_string(icalvalue* value) { - - struct icalgeotype data; - char* str; - icalerror_check_arg_rz( (value!=0),"value"); - - data = icalvalue_get_geo(value); - - str = (char*)icalmemory_tmp_buffer(25); - - sprintf(str,"%f;%f",data.lat,data.lon); - - return str; -} - -const char* icalvalue_datetimeperiod_as_ical_string(icalvalue* value) { - struct icaldatetimeperiodtype dtp = icalvalue_get_datetimeperiod(value); - - icalerror_check_arg_rz( (value!=0),"value"); - - if(!icaltime_is_null_time(dtp.time)){ - return icaltime_as_ical_string(dtp.time); - } else { - return icalperiodtype_as_ical_string(dtp.period); - } -} - -const char* icalvalue_period_as_ical_string(icalvalue* value) { - struct icalperiodtype data; - icalerror_check_arg_rz( (value!=0),"value"); - data = icalvalue_get_period(value); - - return icalperiodtype_as_ical_string(data); - -} - -char* icalvalue_trigger_as_ical_string(icalvalue* value) { - - struct icaltriggertype data; - - icalerror_check_arg_rz( (value!=0),"value"); - data = icalvalue_get_trigger(value); - - if(!icaltime_is_null_time(data.time)){ - return icaltime_as_ical_string(data.time); - } else { - return icaldurationtype_as_ical_string(data.duration); - } - -} - -const char* -icalvalue_as_ical_string (icalvalue* value) -{ - struct icalvalue_impl* v = (struct icalvalue_impl*)value; - - v=v; - - if(value == 0){ - return 0; - } - - switch (v->kind){ - - case ICAL_ATTACH_VALUE: - return icalvalue_attach_as_ical_string(value); - - case ICAL_BINARY_VALUE: - return icalvalue_binary_as_ical_string(value); - - case ICAL_BOOLEAN_VALUE: - case ICAL_INTEGER_VALUE: - return icalvalue_int_as_ical_string(value); - - case ICAL_UTCOFFSET_VALUE: - return icalvalue_utcoffset_as_ical_string(value); - - case ICAL_TEXT_VALUE: - return icalvalue_text_as_ical_string(value); - - case ICAL_STRING_VALUE: - case ICAL_URI_VALUE: - case ICAL_CALADDRESS_VALUE: - return icalvalue_string_as_ical_string(value); - - case ICAL_DATE_VALUE: - return icalvalue_date_as_ical_string(value); - case ICAL_DATETIME_VALUE: - return icalvalue_datetime_as_ical_string(value); - case ICAL_DATETIMEDATE_VALUE: - return icalvalue_datetimedate_as_ical_string(value); - case ICAL_DURATION_VALUE: - return icalvalue_duration_as_ical_string(value); - case ICAL_TIME_VALUE: - return icalvalue_time_as_ical_string(value); - - case ICAL_PERIOD_VALUE: - return icalvalue_period_as_ical_string(value); - case ICAL_DATETIMEPERIOD_VALUE: - return icalvalue_datetimeperiod_as_ical_string(value); - - case ICAL_FLOAT_VALUE: - return icalvalue_float_as_ical_string(value); - - case ICAL_GEO_VALUE: - return icalvalue_geo_as_ical_string(value); - - case ICAL_RECUR_VALUE: - return icalvalue_recur_as_ical_string(value); - - case ICAL_TRIGGER_VALUE: - return icalvalue_trigger_as_ical_string(value); - - case ICAL_ACTION_VALUE: - case ICAL_METHOD_VALUE: - case ICAL_STATUS_VALUE: - case ICAL_TRANSP_VALUE: - case ICAL_CLASS_VALUE: - if(v->x_value !=0){ - return icalmemory_tmp_copy(v->x_value); - } - - return icalproperty_enum_to_string(v->data.v_enum); - - case ICAL_X_VALUE: - return icalmemory_tmp_copy(v->x_value); - - case ICAL_NO_VALUE: - default: - { - return 0; - } - } -} - - -icalvalue_kind -icalvalue_isa (icalvalue* value) -{ - struct icalvalue_impl* v = (struct icalvalue_impl*)value; - - if(value == 0){ - return ICAL_NO_VALUE; - } - - return v->kind; -} - - -int -icalvalue_isa_value (void* value) -{ - struct icalvalue_impl *impl = (struct icalvalue_impl *)value; - - icalerror_check_arg_rz( (value!=0), "value"); - - if (strcmp(impl->id,"val") == 0) { - return 1; - } else { - return 0; - } -} - - -int icalvalue_is_time(icalvalue* a) { - icalvalue_kind kind = icalvalue_isa(a); - - if(kind == ICAL_DATETIMEDATE_VALUE || - kind == ICAL_DATETIME_VALUE || - kind == ICAL_DATE_VALUE || - kind == ICAL_TIME_VALUE ){ - return 1; - } - - return 0; - -} - -icalparameter_xliccomparetype -icalvalue_compare(icalvalue* a, icalvalue *b) -{ - struct icalvalue_impl *impla = (struct icalvalue_impl *)a; - struct icalvalue_impl *implb = (struct icalvalue_impl *)b; - - icalerror_check_arg_rz( (a!=0), "a"); - icalerror_check_arg_rz( (b!=0), "b"); - - /* Not the same type; they can only be unequal */ - if( ! (icalvalue_is_time(a) && icalvalue_is_time(b)) && - icalvalue_isa(a) != icalvalue_isa(b)){ - return ICAL_XLICCOMPARETYPE_NOTEQUAL; - } - - switch (icalvalue_isa(a)){ - - case ICAL_ATTACH_VALUE: - case ICAL_BINARY_VALUE: - - case ICAL_BOOLEAN_VALUE: - { - if (icalvalue_get_boolean(a) == icalvalue_get_boolean(b)){ - return ICAL_XLICCOMPARETYPE_EQUAL; - } else { - return ICAL_XLICCOMPARETYPE_NOTEQUAL; - } - } - - case ICAL_FLOAT_VALUE: - { - if (impla->data.v_float > implb->data.v_float){ - return ICAL_XLICCOMPARETYPE_GREATER; - } else if (impla->data.v_float < implb->data.v_float){ - return ICAL_XLICCOMPARETYPE_LESS; - } else { - return ICAL_XLICCOMPARETYPE_EQUAL; - } - } - - case ICAL_INTEGER_VALUE: - case ICAL_UTCOFFSET_VALUE: - { - if (impla->data.v_int > implb->data.v_int){ - return ICAL_XLICCOMPARETYPE_GREATER; - } else if (impla->data.v_int < implb->data.v_int){ - return ICAL_XLICCOMPARETYPE_LESS; - } else { - return ICAL_XLICCOMPARETYPE_EQUAL; - } - } - - case ICAL_DURATION_VALUE: - { - int a = icaldurationtype_as_int(impla->data.v_duration); - int b = icaldurationtype_as_int(implb->data.v_duration); - - if (a > b){ - return ICAL_XLICCOMPARETYPE_GREATER; - } else if (a < b){ - return ICAL_XLICCOMPARETYPE_LESS; - } else { - return ICAL_XLICCOMPARETYPE_EQUAL; - } - } - - - case ICAL_TEXT_VALUE: - case ICAL_URI_VALUE: - case ICAL_CALADDRESS_VALUE: - case ICAL_TRIGGER_VALUE: - case ICAL_DATE_VALUE: - case ICAL_DATETIME_VALUE: - case ICAL_DATETIMEDATE_VALUE: - case ICAL_TIME_VALUE: - case ICAL_DATETIMEPERIOD_VALUE: - { - int r; - - r = strcmp(icalvalue_as_ical_string(a), - icalvalue_as_ical_string(b)); - - if (r > 0) { - return ICAL_XLICCOMPARETYPE_GREATER; - } else if (r < 0){ - return ICAL_XLICCOMPARETYPE_LESS; - } else { - return ICAL_XLICCOMPARETYPE_EQUAL; - } - - - } - - case ICAL_METHOD_VALUE: - { - if (icalvalue_get_method(a) == icalvalue_get_method(b)){ - return ICAL_XLICCOMPARETYPE_EQUAL; - } else { - return ICAL_XLICCOMPARETYPE_NOTEQUAL; - } - - } - - case ICAL_STATUS_VALUE: - { - if (icalvalue_get_status(a) == icalvalue_get_status(b)){ - return ICAL_XLICCOMPARETYPE_EQUAL; - } else { - return ICAL_XLICCOMPARETYPE_NOTEQUAL; - } - - } - - case ICAL_PERIOD_VALUE: - case ICAL_GEO_VALUE: - case ICAL_RECUR_VALUE: - case ICAL_NO_VALUE: - default: - { - icalerror_warn("Comparison not implemented for value type"); - return ICAL_XLICCOMPARETYPE_REGEX+1; /* HACK */ - } - } - -} - -void icalvalue_set_parent(icalvalue* value, - icalproperty* property) -{ - struct icalvalue_impl* v = (struct icalvalue_impl*)value; - - v->parent = property; - -} - -icalproperty* icalvalue_get_parent(icalvalue* value) -{ - struct icalvalue_impl* v = (struct icalvalue_impl*)value; - - - return v->parent; -} - - - -/* The remaining interfaces are 'new', 'set' and 'get' for each of the value - types */ - - -/* Everything below this line is machine generated. Do not edit. */ diff --git a/libical/src/libical/icalvalue.h b/libical/src/libical/icalvalue.h deleted file mode 100644 index 6983c23275..0000000000 --- a/libical/src/libical/icalvalue.h +++ /dev/null @@ -1,85 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalvalue.h - CREATOR: eric 20 March 1999 - - - $Id$ - $Locker$ - - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icalvalue.h - - ======================================================================*/ - -#ifndef ICALVALUE_H -#define ICALVALUE_H - -#include <time.h> -#include "icalenums.h" -#include "icaltypes.h" -#include "icalrecur.h" -#include "icalduration.h" -#include "icalperiod.h" -#include "icalderivedproperty.h" /* For icalproperty_method, etc. */ -#include "icalderivedparameter.h" -#include "icalderivedvalue.h" - -/* Defined in icalderivedvalue.h */ -/*typedef void icalvalue;*/ - -icalvalue* icalvalue_new(icalvalue_kind kind); - -icalvalue* icalvalue_new_clone(icalvalue* value); - -icalvalue* icalvalue_new_from_string(icalvalue_kind kind, const char* str); - -void icalvalue_free(icalvalue* value); - -int icalvalue_is_valid(icalvalue* value); - -const char* icalvalue_as_ical_string(icalvalue* value); - -icalvalue_kind icalvalue_isa(icalvalue* value); - -int icalvalue_isa_value(void*); - -icalparameter_xliccomparetype icalvalue_compare(icalvalue* a, icalvalue *b); - - -/* Special, non autogenerated value accessors */ - -icalvalue* icalvalue_new_recur (struct icalrecurrencetype v); -void icalvalue_set_recur(icalvalue* value, struct icalrecurrencetype v); -struct icalrecurrencetype icalvalue_get_recur(icalvalue* value); - -icalvalue* icalvalue_new_trigger (struct icaltriggertype v); -void icalvalue_set_trigger(icalvalue* value, struct icaltriggertype v); -struct icaltriggertype icalvalue_get_trigger(icalvalue* value); - -icalvalue* icalvalue_new_datetimeperiod (struct icaldatetimeperiodtype v); -void icalvalue_set_datetimeperiod(icalvalue* value, - struct icaldatetimeperiodtype v); -struct icaldatetimeperiodtype icalvalue_get_datetimeperiod(icalvalue* value); - -/* Convert enumerations */ - -icalvalue_kind icalvalue_string_to_kind(const char* str); -const char* icalvalue_kind_to_string(icalvalue_kind kind); - - -#endif /*ICALVALUE_H*/ diff --git a/libical/src/libical/icalvalueimpl.h b/libical/src/libical/icalvalueimpl.h deleted file mode 100644 index b103c9cb3f..0000000000 --- a/libical/src/libical/icalvalueimpl.h +++ /dev/null @@ -1,91 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalvalue.c - CREATOR: eric 02 May 1999 - - $Id$ - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icalvalue.c - - Contributions from: - Graham Davison (g.m.davison@computer.org) - - -======================================================================*/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#ifndef ICALVALUEIMPL_H -#define ICALVALUEIMPL_H - -#include "icalenums.h" - - -struct icalvalue_impl { - icalvalue_kind kind; /*this is the kind that is visible from the outside*/ - - char id[5]; - int size; - icalproperty* parent; - const char* x_value; - - union data { - struct icalattachtype v_attach; - /* void *v_binary; */ /* use v_attach */ - const char *v_string; - /*char *v_text;*/ - /*char *v_caladdress;*/ - /*char *v_uri;*/ - float v_float; - int v_int; - /*int v_boolean;*/ - /*int v_integer;*/ - struct icaldurationtype v_duration; - /*int v_utcoffset;*/ - - struct icalperiodtype v_period; - /*struct icalperiodtype v_datetimeperiod;*/ - struct icalgeotype v_geo; - /*time_t v_time;*/ - struct icaltimetype v_time; - /*struct icaltimetype v_date;*/ - /*struct icaltimetype v_datetime;*/ - /*struct icaltimetype v_datetimedate;*/ - - /* struct icalrecurrencetype was once included - directly ( not referenced ) in this union, but it - contributes 2000 bytes to every value, so now it is - a reference*/ - - struct icalrecurrencetype *v_recur; - struct icaltriggertype v_trigger; - - int v_enum; - /* v_enum takes care of several enumerated types including: - icalproperty_method v_method; - icalproperty_status v_status; - icalproperty_action v_action; - icalproperty_class v_class; - icalproperty_transp v_transp; - */ - - } data; -}; - -#endif diff --git a/libical/src/libical/icalversion.h.in b/libical/src/libical/icalversion.h.in deleted file mode 100644 index 5d213693e5..0000000000 --- a/libical/src/libical/icalversion.h.in +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef ICAL_VERSION_H -#define ICAL_VERSION_H - -#define ICAL_PACKAGE "@PACKAGE@" -#define ICAL_VERSION "@VERSION@" - -#endif diff --git a/libical/src/libical/icalyacc.y b/libical/src/libical/icalyacc.y deleted file mode 100644 index 982682d331..0000000000 --- a/libical/src/libical/icalyacc.y +++ /dev/null @@ -1,404 +0,0 @@ -%{ -/* -*- Mode: C -*- - ====================================================================== - FILE: icalitip.y - CREATOR: eric 10 June 1999 - - DESCRIPTION: - - $Id: icalyacc.y,v 1.11 2001/01/23 20:22:33 jpr Exp $ - $Locker: $ - - (C) COPYRIGHT 1999 Eric Busboom - http://www.softwarestudio.org - - The contents of this file are subject to the Mozilla Public License - Version 1.0 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and - limitations under the License. - - The original author is Eric Busboom - The original code is icalitip.y - - - - =======================================================================*/ - -#include <stdlib.h> -#include <string.h> /* for strdup() */ -#include "icalparser.h" -#include "pvl.h" - -icalvalue *icalparser_yy_value; /* Current Value */ - -void ical_yyerror(char* s); -void icalparser_clear_flex_input(); -int ical_yy_lex(void); - -/* Globals for UTCOFFSET values */ -int utc; -int utc_b; -int utcsign; - -/* Globals for DURATION values */ -struct icaldurationtype duration; - -/* Globals for TRIGGER values */ -struct icaltriggertype trigger; - -void copy_list(short* array, size_t size); -void add_prop(icalproperty_kind); -void icalparser_fill_date(struct tm* t, char* dstr); -void icalparser_fill_time(struct tm* t, char* tstr); -void set_value_type(icalvalue_kind kind); -void set_parser_value_state(); -struct icaltimetype fill_datetime(char* d, char* t); -void ical_yy_error(char *s); /* Don't know why I need this.... */ -int yylex(void); /* Or this. */ - - - -/* Set the state of the lexer so it will interpret values ( iCAL - VALUEs, that is, ) correctly. */ - -%} - -%union { - float v_float; - int v_int; - char* v_string; -} - - - /* Renaming hack */ - -/* -#define yymaxdepth ical_yy_maxdepth -#define yyparse ical_yy_parse -#define yyerror ical_yy_error -#define yylval ical_yy_lval -#define yychar ical_yy_char -#define yydebug ical_yy_debug -#define yypact ical_yy_pact -#define yyr1 ical_yy_r1 -#define yyr2 ical_yy_r2 -#define yydef ical_yy_def -#define yychk ical_yy_chk -#define yypgo ical_yy_pgo -#define yyact ical_yy_act -#define yyexca ical_yy_exca -#define yyerrflag ical_yy_errflag -#define yynerrs ical_yy_nerrs -#define yyps ical_yy_ps -#define yypv ical_yy_pv -#define yys ical_yy_s -#define yy_yys ical_yy_yys -#define yystate ical_yy_state -#define yytmp ical_yy_tmp -#define yyv ical_yy_v -#define yy_yyv ical_yy_yyv -#define yyval ical_yy_val -#define yylloc ical_yy_lloc -#define yyreds ical_yy_reds -#define yytoks ical_yy_toks -#define yylhs ical_yy_yylhs -#define yylen ical_yy_yylen -#define yydefred ical_yy_yydefred -#define yydgoto ical_yy_yydgoto -#define yydefred ical_yy_yydefred -#define yydgoto ical_yy_yydgoto -#define yysindex ical_yy_yysindex -#define yyrindex ical_yy_yyrindex -#define yygindex ical_yy_yygindex -#define yytable ical_yy_yytable -#define yycheck ical_yy_yycheck -#define yyname ical_yy_yyname -#define yyrule ical_yy_yyrule -#define yy_scan_bytes ical_yy_scan_bytes -#define yy_scan_string ical_yy_scan_string -#define yy_scan_buffer ical_yy_scan_buffer -*/ - -/* These are redefined with the -P option to flex */ -/* -#define yy_create_buffer ical_yy_create_buffer -#define yy_delete_buffer ical_yy_delete_buffer -#define yy_flex_debug ical_yy_flex_debug -#define yy_init_buffer ical_yy_init_buffer -#define yy_flush_buffer ical_yy_flush_buffer -#define yy_load_buffer_state ical_yy_load_buffer_state -#define yy_switch_to_buffer ical_yy_switch_to_buffer -#define yyin ical_yyin -#define yyleng ical_yyleng -#define yylex ical_yylex -#define yylineno ical_yylineno -#define yyout ical_yyout -#define yyrestart ical_yyrestart -#define yytext ical_yytext -#define yywrap ical_yywrap -*/ - - -%token <v_string> DIGITS -%token <v_int> INTNUMBER -%token <v_float> FLOATNUMBER -%token <v_string> STRING -%token EOL EQUALS CHARACTER COLON COMMA SEMICOLON MINUS TIMESEPERATOR - -%token TRUE FALSE - -%token FREQ BYDAY BYHOUR BYMINUTE BYMONTH BYMONTHDAY BYSECOND BYSETPOS BYWEEKNO -%token BYYEARDAY DAILY MINUTELY MONTHLY SECONDLY WEEKLY HOURLY YEARLY -%token INTERVAL COUNT UNTIL WKST MO SA SU TU WE TH FR - -%token BIT8 ACCEPTED ADD AUDIO BASE64 BINARY BOOLEAN BUSY BUSYTENTATIVE -%token BUSYUNAVAILABLE CALADDRESS CANCEL CANCELLED CHAIR CHILD COMPLETED -%token CONFIDENTIAL CONFIRMED COUNTER DATE DATETIME DECLINECOUNTER DECLINED -%token DELEGATED DISPLAY DRAFT DURATION EMAIL END FINAL FLOAT FREE GREGORIAN -%token GROUP INDIVIDUAL INPROCESS INTEGER NEEDSACTION NONPARTICIPANT -%token OPAQUE OPTPARTICIPANT PARENT PERIOD PRIVATE PROCEDURE PUBLIC PUBLISH -%token RECUR REFRESH REPLY REQPARTICIPANT REQUEST RESOURCE ROOM SIBLING -%token START TENTATIVE TEXT THISANDFUTURE THISANDPRIOR TIME TRANSPAENT -%token UNKNOWN UTCOFFSET XNAME - -%token ALTREP CN CUTYPE DAYLIGHT DIR ENCODING EVENT FBTYPE FMTTYPE LANGUAGE -%token MEMBER PARTSTAT RANGE RELATED RELTYPE ROLE RSVP SENTBY STANDARD URI - -%token TIME_CHAR UTC_CHAR - - -%% - -value: - date_value - | datetime_value - | duration_value - | period_value - | utcoffset_value - | error { - icalparser_yy_value = 0; - icalparser_clear_flex_input(); - yyclearin; - } - - -date_value: DIGITS - { - struct icaltimetype stm; - - stm = fill_datetime($1,0); - - stm.hour = -1; - stm.minute = -1; - stm.second = -1; - stm.is_utc = 0; - stm.is_date = 1; - - icalparser_yy_value = icalvalue_new_date(stm); - } - -utc_char: - /*empty*/ {utc = 0;} - | UTC_CHAR {utc = 1;} - -/* This is used in the period_value, where there may be two utc characters per rule. */ -utc_char_b: - /*empty*/ {utc_b = 0;} - | UTC_CHAR {utc_b = 1;} - -datetime_value: - DIGITS TIME_CHAR DIGITS utc_char - { - struct icaltimetype stm; - stm = fill_datetime($1, $3); - stm.is_utc = utc; - stm.is_date = 0; - - icalparser_yy_value = - icalvalue_new_datetime(stm); - } - - -/* Duration */ - - -dur_date: dur_day - | dur_day dur_time - -dur_week: DIGITS 'W' - { - duration.weeks = atoi($1); - } - -dur_time: TIME_CHAR dur_hour - { - } - | TIME_CHAR dur_minute - { - } - | TIME_CHAR dur_second - { - } - -dur_hour: DIGITS 'H' - { - duration.hours = atoi($1); - } - | DIGITS 'H' dur_minute - { - duration.hours = atoi($1); - } - -dur_minute: DIGITS 'M' - { - duration.minutes = atoi($1); - } - | DIGITS 'M' dur_second - { - duration.minutes = atoi($1); - } - -dur_second: DIGITS 'S' - { - duration.seconds = atoi($1); - } - -dur_day: DIGITS 'D' - { - duration.days = atoi($1); - } - -dur_prefix: /* empty */ - { - duration.is_neg = 0; - } - | '+' - { - duration.is_neg = 0; - } - | '-' - { - duration.is_neg = 1; - } - -duration_value: dur_prefix 'P' dur_date - { - icalparser_yy_value = icalvalue_new_duration(duration); - memset(&duration,0, sizeof(duration)); - } - | dur_prefix 'P' dur_time - { - icalparser_yy_value = icalvalue_new_duration(duration); - memset(&duration,0, sizeof(duration)); - } - | dur_prefix 'P' dur_week - { - icalparser_yy_value = icalvalue_new_duration(duration); - memset(&duration,0, sizeof(duration)); - } - - -/* Period */ - -period_value: DIGITS TIME_CHAR DIGITS utc_char '/' DIGITS TIME_CHAR DIGITS utc_char_b - { - struct icalperiodtype p; - - p.start = fill_datetime($1,$3); - p.start.is_utc = utc; - p.start.is_date = 0; - - - p.end = fill_datetime($6,$8); - p.end.is_utc = utc_b; - p.end.is_date = 0; - - p.duration.days = -1; - p.duration.weeks = -1; - p.duration.hours = -1; - p.duration.minutes = -1; - p.duration.seconds = -1; - - icalparser_yy_value = icalvalue_new_period(p); - } - | DIGITS TIME_CHAR DIGITS utc_char '/' duration_value - { - struct icalperiodtype p; - - p.start = fill_datetime($1,$3); - p.start.is_utc = utc; - p.start.is_date = 0; - - p.end.year = -1; - p.end.month = -1; - p.end.day = -1; - p.end.hour = -1; - p.end.minute = -1; - p.end.second = -1; - - /* The duration_value rule setes the global 'duration' - variable, but it also creates a new value in - icalparser_yy_value. So, free that, then copy - 'duration' into the icalperiodtype struct. */ - - p.duration = icalvalue_get_duration(icalparser_yy_value); - icalvalue_free(icalparser_yy_value); - icalparser_yy_value = 0; - - icalparser_yy_value = icalvalue_new_period(p); - - } - - -trigger: - - - -/* UTC Offset */ - -plusminus: '+' { utcsign = 1; } - | '-' { utcsign = -1; } - -utcoffset_value: - plusminus INTNUMBER INTNUMBER - { - icalparser_yy_value = icalvalue_new_utcoffset( utcsign * ($2*3600) + ($3*60) ); - } - - | plusminus INTNUMBER INTNUMBER INTNUMBER - { - icalparser_yy_value = icalvalue_new_utcoffset(utcsign * ($2*3600) + ($3*60) +($4)); - } - -%% - -struct icaltimetype fill_datetime(char* datestr, char* timestr) -{ - struct icaltimetype stm; - - memset(&stm,0,sizeof(stm)); - - if (datestr != 0){ - sscanf(datestr,"%4d%2d%2d",&(stm.year), &(stm.month), - &(stm.day)); - } - - if (timestr != 0){ - sscanf(timestr,"%2d%2d%2d", &(stm.hour), &(stm.minute), - &(stm.second)); - } - - return stm; - -} - -void ical_yyerror(char* s) -{ - /*fprintf(stderr,"Parse error \'%s\'\n", s);*/ -} - diff --git a/libical/src/libical/pvl.c b/libical/src/libical/pvl.c deleted file mode 100644 index 2a733e8aa9..0000000000 --- a/libical/src/libical/pvl.c +++ /dev/null @@ -1,761 +0,0 @@ -/*====================================================================== - FILE: pvl.c - CREATOR: eric November, 1995 - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org -======================================================================*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "pvl.h" -#include <errno.h> -#include <assert.h> -#include <stdlib.h> - - - -/* - struct pvl_list_t - - The list structure. This is the hanlde for the entire list - - This type is also private. Use pvl_list instead - - */ - -typedef struct pvl_list_t -{ - int MAGIC; /* Magic Identifier */ - struct pvl_elem_t *head; /* Head of list */ - struct pvl_elem_t *tail; /* Tail of list */ - int count; /* Number of items in the list */ - struct pvl_elem_t *p; /* Pointer used for iterators */ -} pvl_list_t; - - - - -/* This global is incremented for each call to pvl_new_element(); it gives each - * list a unique identifer */ - -int pvl_elem_count = 0; -int pvl_list_count = 0; - - -/*---------------------------------------------------------------------- - Function: pvl_list pvl_newlist() - - Purpose: - - Creates a new list, clears the pointers and assigns a magic number - - Returns: - - Pointer to the new list - 0 if there is no available memory. - *----------------------------------------------------------------------*/ - -pvl_list -pvl_newlist() -{ - struct pvl_list_t *L; - - if ( ( L = (struct pvl_list_t*)malloc(sizeof(struct pvl_list_t))) == 0) - { - errno = ENOMEM; - return 0; - } - - L->MAGIC = pvl_list_count; - pvl_list_count++; - L->head = 0; - L->tail = 0; - L->count = 0; - L->p = 0; - - return L; -} - -void -pvl_free(pvl_list l) -{ - struct pvl_list_t *L = (struct pvl_list_t *)l; - - pvl_clear(l); - - free(L); -} - -/*---------------------------------------------------------------------- - Function: pvl_new_element(void *d, struct pvl_elem_t *next,struct pvl_elem_t *prior) - - Purpose: - Creates a new list element, assigns a magic number, and assigns - the next and previous pointers. - - Passing in the next and previous points may seem odd, but it allos the user - to set them while keeping the internal data hidden. In nearly all cases, - the user is the pvl library itself. - - Parameters: - - d The data item to be stored in the list - next Pointer value to assign to the member "next" - prior Pointer value to assign to the member "prior" - - Returns: - - A pointer to the new element. - 0 if there is no memory available. - - *----------------------------------------------------------------------*/ - -pvl_elem -pvl_new_element(void *d, pvl_elem next,pvl_elem prior) -{ - struct pvl_elem_t *E; - - if ( ( E = (struct pvl_elem_t*)malloc(sizeof(struct pvl_elem_t))) == 0) - { - errno = ENOMEM; - return 0; - } - - E->MAGIC = pvl_elem_count++; - E->d = d; - E->next = next; - E->prior = prior; - - return (pvl_elem)E; -} - -/*---------------------------------------------------------------------- - Function: pvl_unshift(pvl_list l,void *d) - - Purpose: - - Add a new element to the from of the list - - Parameters: - - l The list to add the item to - d Pointer to the item to add - - Returns: - *----------------------------------------------------------------------*/ - -void -pvl_unshift(pvl_list l,void *d) -{ - struct pvl_list_t *L = (struct pvl_list_t *)l; - struct pvl_elem_t *E = pvl_new_element(d,L->head,0); - - if (E->next != 0) - { - /* Link the head node to it */ - E->next->prior = E; - } - - /* move the head */ - L->head = E; - - /* maybe move the tail */ - - if (L->tail == 0) - { - L->tail = E; - } - - L->count++; -} - -/*---------------------------------------------------------------------- - Function: pvl_shift(pvl_list l) - - Purpose: - - Remove an element from the front of the list - - Parameters: - - l The list to operate on - - Returns: - *----------------------------------------------------------------------*/ - -void* -pvl_shift(pvl_list l) -{ - struct pvl_list_t *L = (struct pvl_list_t *)l; - - if (L->head == 0) - { - return 0; - } - - return pvl_remove(l,(void*)L->head); - -} - -/*---------------------------------------------------------------------- - Function: void pvl_push(pvl_list l,void *d) - - Purpose: - - Add a new item to the tail of the list - - Paramters: - - l The list to operate on - d Pointer to the item to add - - Returns: - *----------------------------------------------------------------------*/ - -void -pvl_push(pvl_list l,void *d) -{ - struct pvl_list_t *L = (struct pvl_list_t *)l; - struct pvl_elem_t *E = pvl_new_element(d,0,L->tail); - - /* These are done in pvl_new_element - E->next = 0; - E->prior = L->tail; - */ - - if (L->tail != 0) - { - L->tail->next = E; - } - - if (L->head == 0) - { - L->head = E; - } - - L->tail = E; - - L->count++; - -} - -/*---------------------------------------------------------------------- - Function: void* pvl_pop(pvl_list l) - - Purpose: - - Remove an element from the tail of the list - - Paramters: - - l The list to operate on - - Returns: - *----------------------------------------------------------------------*/ - -void* -pvl_pop(pvl_list l) -{ - - struct pvl_list_t *L = (struct pvl_list_t *)l; - - if ( L->tail == 0) - { - return 0; - } - - return pvl_remove(l,(void*) L->tail);; - -} - - -/*---------------------------------------------------------------------- - Function: void pvl_insert_ordered(pvl_list l,pvl_comparef f,void *d) - - Purpose: - - Add a new item to a list that is ordered by a comparison function. - This routine assumes that the list is properly ordered. - - l The list to operate on - f Pointer to a comparison function - d Pointer to data to pass to the comparison function - - Returns: - - void - - *----------------------------------------------------------------------*/ - -void -pvl_insert_ordered(pvl_list l,pvl_comparef f,void *d) -{ - struct pvl_list_t *L = (struct pvl_list_t *)l; - - struct pvl_elem_t *P; - - L->count++; - - /* Empty list, add to head */ - - if(L->head == 0) - { - pvl_unshift(l,d); - return; - } - - /* smaller than head, add to head */ - - if ( ((*f)(d,L->head->d)) <= 0) - { - pvl_unshift(l,d); - return; - } - - /* larger than tail, add to tail */ - if ( (*f)(d,L->tail->d) >= 0) - { - pvl_push(l,d); - return; - } - - - /* Search for the first element that is smaller, and add before it */ - - for (P=L->head; P != 0; P = P->next) - { - if ( (*f)(P->d,d) >= 0) - { - pvl_insert_before(l,P,d); - return; - } - } - - /* badness, choke */ - - assert(0); - -} - -/*---------------------------------------------------------------------- - Function: void pvl_insert_after(pvl_list l,pvl_elem p,void *d) - - Purpose: - - Add a new item after the referenced element. - - Parameters: - - l The list to operate on - p The list element to add the item after - d Pointer to the item to add. - - Returns: - - void - - *----------------------------------------------------------------------*/ - -void -pvl_insert_after(pvl_list l,pvl_elem p,void *d) -{ - struct pvl_list_t *L = (struct pvl_list_t *)l; - struct pvl_elem_t *P = (struct pvl_elem_t *)p; - struct pvl_elem_t *E = 0; - - L->count++; - - if (P == 0) - { - pvl_unshift(l,d); - return; - } - - if ( P == L->tail) - { - E = pvl_new_element(d,0,P); - L->tail = E; - E->prior->next = E; - } - else - { - E = pvl_new_element(d,P->next,P); - E->next->prior = E; - E->prior->next = E; - } -} - -/*---------------------------------------------------------------------- - Function: void pvl_insert_before(pvl_list l,pvl_elem p,void *d) - - Purpose: - - Add an item after a referenced item - - Parameters: - - l The list to operate on - p The list element to add the item before - d Pointer to the data to be added. - - Returns: - *----------------------------------------------------------------------*/ - -void -pvl_insert_before(pvl_list l,pvl_elem p,void *d) -{ - struct pvl_list_t *L = (struct pvl_list_t *)l; - struct pvl_elem_t *P = (struct pvl_elem_t *)p; - struct pvl_elem_t *E = 0; - - L->count++; - - if (P == 0) - { - pvl_unshift(l,d); - return; - } - - if ( P == L->head) - { - E = pvl_new_element(d,P,0); - E->next->prior = E; - L->head = E; - } - else - { - E = pvl_new_element(d,P,P->prior); - E->prior->next = E; - E->next->prior = E; - } -} - -/*---------------------------------------------------------------------- - Function: void pvl_remove(pvl_list l,pvl_elem e) - - Purpose: - - Remove the referenced item from the list - - This routine will free the element, but not the data item that the - element contains. - - Parameters: - - l The list to operate on - e The element to remove. - - Returns: - *----------------------------------------------------------------------*/ - -void* -pvl_remove(pvl_list l,pvl_elem e) -{ - struct pvl_list_t *L = (struct pvl_list_t *)l; - struct pvl_elem_t *E = (struct pvl_elem_t *)e; - void* data; - - if (E == L->head) - { - if (E->next != 0) - { - E->next->prior = 0; - L->head = E->next; - } else { - /* E Also points to tail -> only one element in list */ - L->tail = 0; - L->head = 0; - } - } - else if (E == L->tail) - { - if (E->prior != 0) - { - E->prior->next = 0; - L->tail = E->prior; - } else { - /* E points to the head, so it was the last element */ - /* This case should be taken care of in the previous clause */ - L->head = 0; - L->tail = 0; - } - } - else - { - E->prior->next = E->next; - E->next->prior = E->prior; - } - - - L->count--; - - data = E->d; - - E->prior = 0; - E->next = 0; - E->d = 0; - - free(E); - - return data; - -} - -/*---------------------------------------------------------------------- - Function: pvl_elem pvl_find(pvl_list l,pvl_findf f,void* v) - - Purpose: - - Return a pointer to data that satisfies a function - - This routine will interate through the entire list and call the - find function for each item. It will break and return a pointer to the - data that causes the find function to return 1. - - Parameters: - - l The list to operate on - f Pointer to the find function - v Pointer to constant data to pass into the function - - Returns: - - Pointer to the element that the find function found. - - *----------------------------------------------------------------------*/ - -pvl_elem -pvl_find(pvl_list l,pvl_findf f,void* v) -{ - pvl_elem e; - - for (e=pvl_head(l); e!= 0; e = pvl_next(e)) - { - if ( (*f)(((struct pvl_elem_t *)e)->d,v) == 1) - { - /* Save this elem for a call to find_next */ - ((struct pvl_list_t *)l)->p = e; - return e; - } - } - - return 0; - -} -/*---------------------------------------------------------------------- - Function: void* pvl_find_next(pvl_list l,pvl_findf f,void* v) - - Purpose: - - Like pvl_find(), but continues the search where the last find() or - find_next() left off - - Parameters: - - l The list to operate on - f Pointer to the find function - v Pointer to constant data to pass into the function - - Returns: - - Pointer to the element that the find function found. - - *----------------------------------------------------------------------*/ - -pvl_elem -pvl_find_next(pvl_list l,pvl_findf f,void* v) -{ - - pvl_elem e; - - for (e=pvl_head(l); e!= 0; e = pvl_next(e)) - { - if ( (*f)(((struct pvl_elem_t *)e)->d,v) == 1) - { - /* Save this elem for a call to find_next */ - ((struct pvl_list_t *)l)->p = e; - return e; - } - } - - return 0; - -} - -/*---------------------------------------------------------------------- - Function: void pvl_clear(pvl_list l) - - Purpose: - - Remove the all the elements in the list. The does not free the data items - the elements hold. - - - Returns: - *----------------------------------------------------------------------*/ - -void -pvl_clear(pvl_list l) -{ - pvl_elem e = pvl_head(l); - pvl_elem next; - - if (e == 0) { - return; - } - - while(e != 0) - { - next = pvl_next(e); - pvl_remove(l,e); - e = next; - } -} - -/*---------------------------------------------------------------------- - Function: int pvl_count(pvl_list l) - - Purpose: - - Returns the number of items in the list. - - Returns: - *----------------------------------------------------------------------*/ - -int -pvl_count(pvl_list l) -{ - struct pvl_list_t *L = (struct pvl_list_t *)l; - - return L->count; -} - - -/*---------------------------------------------------------------------- - Function: pvl_elem pvl_next(pvl_elem e) - - Purpose: - Returns a pointer to the given element - - Returns: - *----------------------------------------------------------------------*/ - -pvl_elem -pvl_next(pvl_elem e) -{ - struct pvl_elem_t *E = (struct pvl_elem_t *)e; - - if (E == 0){ - return 0; - } - - return (pvl_elem)E->next; -} - -/*---------------------------------------------------------------------- - Function: pvl_elem pvl_prior(pvl_elem e) - - Purpose: - - Returns a pointer to the element previous to the element given. - - Returns: - *----------------------------------------------------------------------*/ - -pvl_elem -pvl_prior(pvl_elem e) -{ - struct pvl_elem_t *E = (struct pvl_elem_t *)e; - - return (pvl_elem)E->prior; -} - -/*---------------------------------------------------------------------- - Function: pvl_elem pvl_head(pvl_list l ) - - Purpose: - - Returns a pointer to the first item in the list. - - Returns: - *----------------------------------------------------------------------*/ -pvl_elem -pvl_head(pvl_list l ) -{ - struct pvl_list_t *L = (struct pvl_list_t *)l; - - return (pvl_elem)L->head; -} - -/*---------------------------------------------------------------------- - Function: pvl_elem pvl_tail(pvl_list l) - - Purpose: - - Returns a pointer to the last item in the list. - - Returns: - *----------------------------------------------------------------------*/ -pvl_elem -pvl_tail(pvl_list l) -{ - struct pvl_list_t *L = (struct pvl_list_t *)l; - return (pvl_elem)L->tail; -} - -/*---------------------------------------------------------------------- - Function: - - - Purpose: - - - Returns: - *----------------------------------------------------------------------*/ - -#ifndef PVL_USE_MACROS -void* -pvl_data(pvl_elem e) -{ - struct pvl_elem_t *E = (struct pvl_elem_t *)e; - - if ( e == 0){ - return 0; - } - - return E->d; -} -#endif - -/*---------------------------------------------------------------------- - Function: void pvl_apply(pvl_list l,pvl_applyf f, void *v) - - Purpose: - - Call a function for every item in the list. - - Paramters: - - l The list to operate on - f Pointer to the function to call - v Data to pass to the function on every iteration - - Returns: - - void - *----------------------------------------------------------------------*/ - -void -pvl_apply(pvl_list l,pvl_applyf f, void *v) -{ - pvl_elem e; - - for (e=pvl_head(l); e!= 0; e = pvl_next(e)) - { - (*f)(((struct pvl_elem_t *)e)->d,v); - } - -} diff --git a/libical/src/libical/pvl.h b/libical/src/libical/pvl.h deleted file mode 100644 index 14a15a15eb..0000000000 --- a/libical/src/libical/pvl.h +++ /dev/null @@ -1,94 +0,0 @@ -/*====================================================================== - FILE: pvl.h - CREATOR: eric November, 1995 - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org -======================================================================*/ - - -#ifndef __PVL_H__ -#define __PVL_H__ - -typedef void* pvl_list; -typedef void* pvl_elem; - -/* - struct pvl_elem_t - - This type is private. Always use pvl_elem instead. The struct would - not even appear in this header except to make code in the USE_MACROS - blocks work - - */ -typedef struct pvl_elem_t -{ - int MAGIC; /* Magic Identifier */ - void *d; /* Pointer to data user is storing */ - struct pvl_elem_t *next; /* Next element */ - struct pvl_elem_t *prior; /* prior element */ -} pvl_elem_t; - - - -/* This global is incremented for each call to pvl_new_element(); it gives each - * list a unique identifer */ - -extern int pvl_elem_count; -extern int pvl_list_count; - -/* Create new lists or elements */ -pvl_elem pvl_new_element(void* d, pvl_elem next,pvl_elem prior); -pvl_list pvl_newlist(void); -void pvl_free(pvl_list); - -/* Add, remove, or get the head of the list */ -void pvl_unshift(pvl_list l,void *d); -void* pvl_shift(pvl_list l); -pvl_elem pvl_head(pvl_list); - -/* Add, remove or get the tail of the list */ -void pvl_push(pvl_list l,void *d); -void* pvl_pop(pvl_list l); -pvl_elem pvl_tail(pvl_list); - -/* Insert elements in random places */ -typedef int (*pvl_comparef)(void* a, void* b); /* a, b are of the data type*/ -void pvl_insert_ordered(pvl_list l,pvl_comparef f,void *d); -void pvl_insert_after(pvl_list l,pvl_elem e,void *d); -void pvl_insert_before(pvl_list l,pvl_elem e,void *d); - -/* Remove an element, or clear the entire list */ -void* pvl_remove(pvl_list,pvl_elem); /* Remove element, return data */ -void pvl_clear(pvl_list); /* Remove all elements, de-allocate all data */ - -int pvl_count(pvl_list); - -/* Navagate the list */ -pvl_elem pvl_next(pvl_elem e); -pvl_elem pvl_prior(pvl_elem e); - -/* get the data in the list */ -#ifndef PVL_USE_MACROS -void* pvl_data(pvl_elem); -#else -#define pvl_data(x) x==0 ? 0 : ((struct pvl_elem_t *)x)->d; -#endif - - -/* Find an element for which a function returns true */ -typedef int (*pvl_findf)(void* a, void* b); /*a is list elem, b is other data*/ -pvl_elem pvl_find(pvl_list l,pvl_findf f,void* v); -pvl_elem pvl_find_next(pvl_list l,pvl_findf f,void* v); - -/* Pass each element in the list to a function */ -typedef void (*pvl_applyf)(void* a, void* b); /*a is list elem, b is other data*/ -void pvl_apply(pvl_list l,pvl_applyf f, void *v); - - -#endif /* __PVL_H__ */ - - - - - diff --git a/libical/src/libical/sspm.c b/libical/src/libical/sspm.c deleted file mode 100644 index 311747c8f5..0000000000 --- a/libical/src/libical/sspm.c +++ /dev/null @@ -1,1613 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: sspm.c Parse Mime - CREATOR: eric 25 June 2000 - - $Id$ - $Locker$ - - The contents of this file are subject to the Mozilla Public License - Version 1.0 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and - limitations under the License. - - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The Initial Developer of the Original Code is Eric Busboom - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - ======================================================================*/ - -#include <stdio.h> -#include <string.h> -#include "sspm.h" -#include <assert.h> -#include <ctype.h> /* for tolower */ -#include <stdlib.h> /* for malloc, free */ -#include <string.h> /* for strcasecmp */ - -#ifdef DMALLOC -#include "dmalloc.h" -#endif - -#define TMP_BUF_SIZE 1024 - - -enum mime_state { - UNKNOWN_STATE, - IN_HEADER, - END_OF_HEADER, - IN_BODY, - OPENING_PART, - END_OF_PART, - TERMINAL_END_OF_PART, - END_OF_INPUT -}; - -struct mime_impl{ - struct sspm_part *parts; - size_t max_parts; - int part_no; - int level; - struct sspm_action_map *actions; - char* (*get_string)(char *s, size_t size, void* data); - void* get_string_data; - char temp[TMP_BUF_SIZE]; - enum mime_state state; -}; - -void sspm_free_header(struct sspm_header *header); -void* sspm_make_multipart_part(struct mime_impl *impl,struct sspm_header *header); -void sspm_read_header(struct mime_impl *impl,struct sspm_header *header); - -char* sspm_strdup(char* str){ - - char* s; - - s = strdup(str); - - return s; -} - - -struct major_content_type_map -{ - enum sspm_major_type type; - char* str; - -} major_content_type_map[] = -{ - {SSPM_MULTIPART_MAJOR_TYPE,"multipart" }, - {SSPM_TEXT_MAJOR_TYPE,"text" }, - {SSPM_TEXT_MAJOR_TYPE,"text" }, - {SSPM_IMAGE_MAJOR_TYPE,"image" }, - {SSPM_AUDIO_MAJOR_TYPE,"audio" }, - {SSPM_VIDEO_MAJOR_TYPE,"video" }, - {SSPM_APPLICATION_MAJOR_TYPE,"application" }, - {SSPM_MULTIPART_MAJOR_TYPE,"multipart" }, - {SSPM_MESSAGE_MAJOR_TYPE,"message" }, - {SSPM_UNKNOWN_MAJOR_TYPE,"" }, -}; - -struct minor_content_type_map -{ - enum sspm_minor_type type; - char* str; - -} minor_content_type_map[] = -{ - {SSPM_ANY_MINOR_TYPE,"*" }, - {SSPM_PLAIN_MINOR_TYPE,"plain" }, - {SSPM_RFC822_MINOR_TYPE,"rfc822" }, - {SSPM_DIGEST_MINOR_TYPE,"digest" }, - {SSPM_CALENDAR_MINOR_TYPE,"calendar" }, - {SSPM_MIXED_MINOR_TYPE,"mixed" }, - {SSPM_RELATED_MINOR_TYPE,"related" }, - {SSPM_ALTERNATIVE_MINOR_TYPE,"alternative" }, - {SSPM_PARALLEL_MINOR_TYPE, "parallel" }, - {SSPM_UNKNOWN_MINOR_TYPE,"" } -}; - - - -struct encoding_map { - enum sspm_encoding encoding; - char* str; -} sspm_encoding_map[] = -{ - {SSPM_NO_ENCODING,""}, - {SSPM_QUOTED_PRINTABLE_ENCODING,"quoted-printable"}, - {SSPM_8BIT_ENCODING,"8bit"}, - {SSPM_7BIT_ENCODING,"7bit"}, - {SSPM_BINARY_ENCODING,"binary"}, - {SSPM_BASE64_ENCODING,"base64"}, - {SSPM_UNKNOWN_ENCODING,""} - -}; - - -char* sspm_get_parameter(char* line, char* parameter) -{ - char *p,*s,*q; - static char name[1024]; - - /* Find where the parameter name is in the line */ - p = strstr(line,parameter); - - if( p == 0){ - return 0; - } - - /* skip over the parameter name, the '=' and any blank spaces */ - - p+=strlen(parameter); - - while(*p==' ' || *p == '='){ - p++; - } - - /*now find the next semicolon*/ - - s = strchr(p,';'); - - /* Strip of leading quote */ - q = strchr(p,'\"'); - - if(q !=0){ - p = q+1; - } - - if(s != 0){ - strncpy(name,p,(size_t)s-(size_t)p); - } else { - strcpy(name,p); - } - - /* Strip off trailing quote, if it exists */ - - q = strrchr(name,'\"'); - - if (q != 0){ - *q='\0'; - } - - return name; -} - -char* sspm_property_name(char* line) -{ - static char name[1024]; - char *c = strchr(line,':'); - - if(c != 0){ - strncpy(name,line,(size_t)c-(size_t)line); - name[(size_t)c-(size_t)line] = '\0'; - return name; - } else { - return 0; - } -} - -char* sspm_value(char* line) -{ - static char value[1024]; - - char *c,*s, *p; - - /* Find the first colon and the next semicolon */ - - c = strchr(line,':'); - s = strchr(c,';'); - - /* Skip the colon */ - c++; - - if (s == 0){ - s = c+strlen(line); - } - - for(p=value; c != s; c++){ - if(*c!=' ' && *c!='\n'){ - *(p++) = *c; - } - } - - *p='\0'; - - return value; - -} - -char *mime_headers[] = { - "Content-Type", - "Content-Transfer-Encoding", - "Content-Disposition", - "Content-Id", - "Mime-Version", - 0 -}; - - -void* sspm_default_new_part() -{ - return 0; -} -void sspm_default_add_line(void *part, struct sspm_header *header, - char* line, size_t size) -{ -} - -void* sspm_default_end_part(void* part) -{ - return 0; -} - -void sspm_default_free_part(void *part) -{ -} - - - -struct sspm_action_map sspm_action_map[] = -{ - {SSPM_UNKNOWN_MAJOR_TYPE,SSPM_UNKNOWN_MINOR_TYPE,sspm_default_new_part,sspm_default_add_line,sspm_default_end_part,sspm_default_free_part}, -}; - -int sspm_is_mime_header(char *line) -{ - char *name = sspm_property_name(line); - int i; - - if(name == 0){ - return 0; - } - - for(i = 0; mime_headers[i] != 0; i++){ - if(strcasecmp(name, mime_headers[i]) == 0) - return 1; - } - - return 0; -} - -int sspm_is_mail_header(char* line) -{ - char *name = sspm_property_name(line); - - if (name != 0){ - return 1; - } - - return 0; - -} - -int sspm_is_blank(char* line) -{ - char *p; - char c =0; - - for(p=line; *p!=0; p++){ - if( ! (*p == ' '|| *p == '\t' || *p=='\n') ){ - c++; - } - } - - if (c==0){ - return 1; - } - - return 0; - -} - -int sspm_is_continuation_line(char* line) -{ - if (line[0] == ' '|| line[0] == '\t' ) { - return 1; - } - - return 0; -} - -int sspm_is_mime_boundary(char *line) -{ - if( line[0] == '-' && line[1] == '-') { - return 1; - } - - return 0; -} - -int sspm_is_mime_terminating_boundary(char *line) -{ - - - if (sspm_is_mime_boundary(line) && - strstr(line,"--\n")){ - return 1; - } - - return 0; -} - -enum line_type { - EMPTY, - BLANK, - MIME_HEADER, - MAIL_HEADER, - HEADER_CONTINUATION, - BOUNDARY, - TERMINATING_BOUNDARY, - UNKNOWN_TYPE -}; - - -enum line_type get_line_type(char* line){ - - if (line == 0){ - return EMPTY; - } else if(sspm_is_blank(line)){ - return BLANK; - } else if (sspm_is_mime_header(line)){ - return MIME_HEADER; - } else if (sspm_is_mail_header(line)){ - return MAIL_HEADER; - } else if (sspm_is_continuation_line(line)){ - return HEADER_CONTINUATION; - } else if (sspm_is_mime_terminating_boundary(line)){ - return TERMINATING_BOUNDARY; - } else if (sspm_is_mime_boundary(line)) { - return BOUNDARY; - } else { - return UNKNOWN_TYPE; - } - - -} - - -struct sspm_action_map get_action(struct mime_impl *impl, - enum sspm_major_type major, - enum sspm_minor_type minor) -{ - int i; - - /* Read caller suppled action map */ - - if (impl->actions != 0){ - for(i=0; impl->actions[i].major != SSPM_UNKNOWN_MAJOR_TYPE; i++){ - if((major == impl->actions[i].major && - minor == impl->actions[i].minor) || - (major == impl->actions[i].major && - minor == SSPM_ANY_MINOR_TYPE)){ - return impl->actions[i]; - } - } - } - - /* Else, read default action map */ - - for(i=0; sspm_action_map[i].major != SSPM_UNKNOWN_MAJOR_TYPE; i++){ - if((major == sspm_action_map[i].major && - minor == sspm_action_map[i].minor) || - (major == sspm_action_map[i].major && - minor == SSPM_ANY_MINOR_TYPE)){ - break; - } - } - - return sspm_action_map[i]; -} - - -char* sspm_lowercase(char* str) -{ - char* p = 0; - char* new = sspm_strdup(str); - - if(str ==0){ - return 0; - } - - for(p = new; *p!=0; p++){ - *p = tolower(*p); - } - - return new; -} - -enum sspm_major_type sspm_find_major_content_type(char* type) -{ - int i; - - char* ltype = sspm_lowercase(type); - - for (i=0; major_content_type_map[i].type != SSPM_UNKNOWN_MINOR_TYPE; i++){ - if(strncmp(ltype, major_content_type_map[i].str, - strlen(major_content_type_map[i].str))==0){ - free(ltype); - return major_content_type_map[i].type; - } - } - free(ltype); - return major_content_type_map[i].type; /* Should return SSPM_UNKNOWN_MINOR_TYPE */ -} - -enum sspm_minor_type sspm_find_minor_content_type(char* type) -{ - int i; - char* ltype = sspm_lowercase(type); - - char *p = strchr(ltype,'/'); - - if (p==0){ - return SSPM_UNKNOWN_MINOR_TYPE; - } - - p++; /* Skip the '/' */ - - for (i=0; minor_content_type_map[i].type != SSPM_UNKNOWN_MINOR_TYPE; i++){ - if(strncmp(p, minor_content_type_map[i].str, - strlen(minor_content_type_map[i].str))==0){ - free(ltype); - return minor_content_type_map[i].type; - } - } - - free(ltype); - return minor_content_type_map[i].type; /* Should return SSPM_UNKNOWN_MINOR_TYPE */ -} - -char* sspm_major_type_string(enum sspm_major_type type) -{ - int i; - - for (i=0; major_content_type_map[i].type != SSPM_UNKNOWN_MINOR_TYPE; - i++){ - - if(type == major_content_type_map[i].type){ - return major_content_type_map[i].str; - } - } - - return major_content_type_map[i].str; /* Should return SSPM_UNKNOWN_MINOR_TYPE */ -} - -char* sspm_minor_type_string(enum sspm_minor_type type) -{ - int i; - for (i=0; minor_content_type_map[i].type != SSPM_UNKNOWN_MINOR_TYPE; - i++){ - if(type == minor_content_type_map[i].type){ - return minor_content_type_map[i].str; - } - } - - return minor_content_type_map[i].str; /* Should return SSPM_UNKNOWN_MINOR_TYPE */ -} - - -char* sspm_encoding_string(enum sspm_encoding type) -{ - int i; - for (i=0; sspm_encoding_map[i].encoding != SSPM_UNKNOWN_ENCODING; - i++){ - if(type == sspm_encoding_map[i].encoding){ - return sspm_encoding_map[i].str; - } - } - - return sspm_encoding_map[i].str; /* Should return SSPM_UNKNOWN_MINOR_TYPE */ -} - -/* Interpret a header line and add its data to the header - structure. */ -void sspm_build_header(struct sspm_header *header, char* line) -{ - char *prop; - char *val; - - val = sspm_strdup(sspm_value(line)); - prop = sspm_strdup(sspm_property_name(line)); - - if(strcmp(prop,"Content-Type") == 0){ - - /* Create a new mime_header, fill in content-type - and possibly boundary */ - - char* boundary= sspm_get_parameter(line,"boundary"); - - header->def = 0; - header->major = sspm_find_major_content_type(val); - header->minor = sspm_find_minor_content_type(val); - - if(header->minor == SSPM_UNKNOWN_MINOR_TYPE){ - char *p = strchr(val,'/'); - - if (p != 0){ - p++; /* Skip the '/' */ - - header->minor_text = sspm_strdup(p); - } else { - /* Error, malformed content type */ - header->minor_text = sspm_strdup("unknown"); - } - } - if (boundary != 0){ - header->boundary = sspm_strdup(boundary); - } - - } else if(strcmp(prop,"Content-Transfer-Encoding")==0){ - char* encoding = sspm_value(line); - char* lencoding = sspm_lowercase(encoding); - - if(strcmp(lencoding,"base64")==0){ - header->encoding = SSPM_BASE64_ENCODING; - } else if(strcmp(lencoding,"quoted-printable")==0){ - header->encoding = SSPM_QUOTED_PRINTABLE_ENCODING; - } else if(strcmp(lencoding,"binary")==0){ - header->encoding = SSPM_BINARY_ENCODING; - } else if(strcmp(lencoding,"7bit")==0){ - header->encoding = SSPM_7BIT_ENCODING; - } else if(strcmp(lencoding,"8bit")==0){ - header->encoding = SSPM_8BIT_ENCODING; - } else { - header->encoding = SSPM_UNKNOWN_ENCODING; - } - - - free(lencoding); - - header->def = 0; - - } else if(strcmp(prop,"Content-Id")==0){ - char* cid = sspm_value(line); - header->content_id = sspm_strdup(cid); - header->def = 0; - - } - free(val); - free(prop); -} - -char* sspm_get_next_line(struct mime_impl *impl) -{ - char* s; - s = impl->get_string(impl->temp,TMP_BUF_SIZE,impl->get_string_data); - - if(s == 0){ - impl->state = END_OF_INPUT; - } - return s; -} - - -void sspm_store_part(struct mime_impl *impl, struct sspm_header header, - int level, void *part, size_t size) -{ - - impl->parts[impl->part_no].header = header; - impl->parts[impl->part_no].level = level; - impl->parts[impl->part_no].data = part; - impl->parts[impl->part_no].data_size = size; - impl->part_no++; -} - -void sspm_set_error(struct sspm_header* header, enum sspm_error error, - char* message) -{ - header->error = error; - - if(header->error_text!=0){ - free(header->error_text); - } - - header->def = 0; - - if(message != 0){ - header->error_text = sspm_strdup(message); - } else { - header->error_text = 0; - } - -} - -void* sspm_make_part(struct mime_impl *impl, - struct sspm_header *header, - struct sspm_header *parent_header, - void **end_part, - size_t *size) -{ - - /* For a single part type, read to the boundary, if there is a - boundary. Otherwise, read until the end of input. This routine - assumes that the caller has read the header and has left the input - at the first blank line */ - - char *line; - void *part; - int end = 0; - - struct sspm_action_map action = get_action( - impl, - header->major, - header->minor); - - *size = 0; - part =action.new_part(); - - impl->state = IN_BODY; - - while(end == 0 && (line = sspm_get_next_line(impl)) != 0){ - - if(sspm_is_mime_boundary(line)){ - - /* If there is a boundary, then this must be a multipart - part, so there must be a parent_header. */ - if(parent_header == 0){ - char* boundary; - end = 1; - *end_part = 0; - - sspm_set_error(header,SSPM_UNEXPECTED_BOUNDARY_ERROR,line); - - /* Read until the paired terminating boundary */ - if((boundary = (char*)malloc(strlen(line)+5)) == 0){ - fprintf(stderr,"Out of memory"); - abort(); - } - strcpy(boundary,line); - strcat(boundary,"--"); - while((line = sspm_get_next_line(impl)) != 0){ - /*printf("Error: %s\n",line);*/ - if(strcmp(boundary,line)==0){ - break; - } - } - free(boundary); - - break; - } - - if(strncmp((line+2),parent_header->boundary, - sizeof(parent_header->boundary)) == 0){ - *end_part = action.end_part(part); - - if(sspm_is_mime_boundary(line)){ - impl->state = END_OF_PART; - } else if ( sspm_is_mime_terminating_boundary(line)){ - impl->state = TERMINAL_END_OF_PART; - } - end = 1; - } else { - /* Error, this is not the correct terminating boundary*/ - - /* read and discard until we get the right boundary. */ - char* boundary; - char msg[256]; - - snprintf(msg,256, - "Expected: %s--. Got: %s", - parent_header->boundary,line); - - sspm_set_error(parent_header, - SSPM_WRONG_BOUNDARY_ERROR,msg); - - /* Read until the paired terminating boundary */ - if((boundary = (char*)malloc(strlen(line)+5)) == 0){ - fprintf(stderr,"Out of memory"); - abort(); - } - strcpy(boundary,line); - strcat(boundary,"--"); - while((line = sspm_get_next_line(impl)) != 0){ - if(strcmp(boundary,line)==0){ - break; - } - } - free(boundary); - - } - } else { - char* data=0; - char* rtrn=0; - *size = strlen(line); - - data = (char*)malloc(*size+2); - assert(data != 0); - if (header->encoding == SSPM_BASE64_ENCODING){ - rtrn = decode_base64(data,line,size); - } else if(header->encoding == SSPM_QUOTED_PRINTABLE_ENCODING){ - rtrn = decode_quoted_printable(data,line,size); - } - - if(rtrn == 0){ - strcpy(data,line); - } - - /* add a end-of-string after the data, just in case binary - data from decode64 gets passed to a tring handling - routine in add_line */ - data[*size+1]='\0'; - - action.add_line(part,header,data,*size); - - free(data); - } - } - - if (end == 0){ - /* End the part if the input is exhausted */ - *end_part = action.end_part(part); - } - - return end_part; -} - - -void* sspm_make_multipart_subpart(struct mime_impl *impl, - struct sspm_header *parent_header) -{ - struct sspm_header header; - char *line; - void* part; - size_t size; - - if(parent_header->boundary == 0){ - /* Error. Multipart headers must have a boundary*/ - - sspm_set_error(parent_header,SSPM_NO_BOUNDARY_ERROR,0); - /* read all of the reamining lines */ - while((line = sspm_get_next_line(impl)) != 0){ - } - - return 0; - } - - - /* Step 1: Read the opening boundary */ - - if(get_line_type(impl->temp) != BOUNDARY){ - while((line=sspm_get_next_line(impl)) != 0 ){ - if(sspm_is_mime_boundary(line)){ - - assert(parent_header != 0); - - /* Check if it is the right boundary */ - if(!sspm_is_mime_terminating_boundary(line) && - strncmp((line+2),parent_header->boundary, - sizeof(parent_header->boundary)) - == 0){ - /* The +2 in strncmp skips over the leading "--" */ - - break; - } else { - /* Got the wrong boundary, so read and discard - until we get the right boundary. */ - char* boundary; - char msg[256]; - - snprintf(msg,256, - "Expected: %s. Got: %s", - parent_header->boundary,line); - - sspm_set_error(parent_header, - SSPM_WRONG_BOUNDARY_ERROR,msg); - - /* Read until the paired terminating boundary */ - if((boundary = (char*)malloc(strlen(line)+5)) == 0){ - fprintf(stderr,"Out of memory"); - abort(); - } - strcpy(boundary,line); - strcat(boundary,"--"); - while((line = sspm_get_next_line(impl)) != 0){ - if(strcmp(boundary,line)==0){ - break; - } - } - free(boundary); - - return 0; - } - } - } - } - - /* Step 2: Get the part header */ - sspm_read_header(impl,&header); - - /* If the header is still listed as default, there was probably an - error */ - if(header.def == 1 && header.error != SSPM_NO_ERROR){ - sspm_set_error(&header,SSPM_NO_HEADER_ERROR,0); - return 0; - } - - if(header.error!= SSPM_NO_ERROR){ - sspm_store_part(impl,header,impl->level,0,0); - return 0; - } - - /* Step 3: read the body */ - - if(header.major == SSPM_MULTIPART_MAJOR_TYPE){ - struct sspm_header *child_header; - child_header = &(impl->parts[impl->part_no].header); - - /* Store the multipart part */ - sspm_store_part(impl,header,impl->level,0,0); - - /* now get all of the sub-parts */ - part = sspm_make_multipart_part(impl,child_header); - - if(get_line_type(impl->temp) != TERMINATING_BOUNDARY){ - - sspm_set_error(child_header,SSPM_NO_BOUNDARY_ERROR,impl->temp); - return 0; - } - - sspm_get_next_line(impl); /* Step past the terminating boundary */ - - } else { - sspm_make_part(impl, &header,parent_header,&part,&size); - - memset(&(impl->parts[impl->part_no]), 0, sizeof(struct sspm_part)); - - sspm_store_part(impl,header,impl->level,part,size); - - } - - return part; -} - -void* sspm_make_multipart_part(struct mime_impl *impl,struct sspm_header *header) -{ - void *part=0; - - /* Now descend a level into each of the children of this part */ - impl->level++; - - /* Now we are working on the CHILD */ - memset(&(impl->parts[impl->part_no]), 0, sizeof(struct sspm_part)); - - do{ - part = sspm_make_multipart_subpart(impl,header); - - if (part==0){ - /* Clean up the part in progress */ - impl->parts[impl->part_no].header.major - = SSPM_NO_MAJOR_TYPE; - impl->parts[impl->part_no].header.minor - = SSPM_NO_MINOR_TYPE; - - } - - - } while (get_line_type(impl->temp) != TERMINATING_BOUNDARY && - impl->state != END_OF_INPUT); - - impl->level--; - - return 0; -} - - -void sspm_read_header(struct mime_impl *impl,struct sspm_header *header) -{ -#define BUF_SIZE 1024 -#define MAX_HEADER_LINES 25 - - char *buf; - char header_lines[MAX_HEADER_LINES][BUF_SIZE]; /* HACK, hard limits */ - int current_line = -1; - int end = 0; - - memset(header_lines,0,sizeof(header_lines)); - memset(header,0,sizeof(struct sspm_header)); - - /* Set up default header */ - header->def = 1; - header->major = SSPM_TEXT_MAJOR_TYPE; - header->minor = SSPM_PLAIN_MINOR_TYPE; - header->error = SSPM_NO_ERROR; - header->error_text = 0; - - /* Read all of the lines into memory */ - while(end==0&& (buf=sspm_get_next_line(impl)) != 0){ - - enum line_type line_type = get_line_type(buf); - - switch(line_type){ - case BLANK: { - end = 1; - impl->state = END_OF_HEADER; - break; - } - - case MAIL_HEADER: - case MIME_HEADER: { - impl->state = IN_HEADER; - current_line++; - - assert(strlen(buf) < BUF_SIZE); - - strcpy(header_lines[current_line],buf); - - break; - } - - case HEADER_CONTINUATION: { - char* last_line, *end; - char *buf_start; - - if(current_line < 0){ - /* This is not really a continuation line, since - we have not see any header line yet */ - sspm_set_error(header,SSPM_MALFORMED_HEADER_ERROR,buf); - return; - } - - last_line = header_lines[current_line]; - end = (char*) ( (size_t)strlen(last_line)+ - (size_t)last_line); - - impl->state = IN_HEADER; - - - /* skip over the spaces in buf start, and remove the new - line at the end of the lat line */ - if (last_line[strlen(last_line)-1] == '\n'){ - last_line[strlen(last_line)-1] = '\0'; - } - buf_start = buf; - while(*buf_start == ' ' ||*buf_start == '\t' ){ - buf_start++; - } - - assert( strlen(buf_start) + strlen(last_line) < BUF_SIZE); - - strcat(last_line,buf_start); - - break; - } - - default: { - sspm_set_error(header,SSPM_MALFORMED_HEADER_ERROR,buf); - return; - } - } - } - - - for(current_line = 0; - current_line < MAX_HEADER_LINES && header_lines[current_line][0] != 0; - current_line++){ - - sspm_build_header(header,header_lines[current_line]); - } - - -} - -/* Root routine for parsing mime entries*/ -int sspm_parse_mime(struct sspm_part *parts, - size_t max_parts, - struct sspm_action_map *actions, - char* (*get_string)(char *s, size_t size, void* data), - void *get_string_data, - struct sspm_header *first_header - ) -{ - struct mime_impl impl; - struct sspm_header header; - void *part; - int i; - - /* Initialize all of the data */ - memset(&impl,0,sizeof(struct mime_impl)); - memset(&header,0,sizeof(struct sspm_header)); - - for(i = 0; i<(int)max_parts; i++){ - parts[i].header.major = SSPM_NO_MAJOR_TYPE; - parts[i].header.minor = SSPM_NO_MINOR_TYPE; - } - - impl.parts = parts; - impl.max_parts = max_parts; - impl.part_no = 0; - impl.actions = actions; - impl.get_string = get_string; - impl.get_string_data = get_string_data; - - /* Read the header of the message. This will be the email header, - unless first_header is specified. But ( HACK) that var is not - currently being used */ - sspm_read_header(&impl,&header); - - if(header.major == SSPM_MULTIPART_MAJOR_TYPE){ - struct sspm_header *child_header; - child_header = &(impl.parts[impl.part_no].header); - - sspm_store_part(&impl,header,impl.level,0,0); - - part = sspm_make_multipart_part(&impl,child_header); - - } else { - void *part; - size_t size; - sspm_make_part(&impl, &header, 0,&part,&size); - - memset(&(impl.parts[impl.part_no]), 0, sizeof(struct sspm_part)); - - sspm_store_part(&impl,header,impl.level,part,size); - } - - return 0; -} - -void sspm_free_parts(struct sspm_part *parts, size_t max_parts) -{ - int i; - - for(i = 0; i<(int)max_parts && parts[i].header.major != SSPM_NO_MAJOR_TYPE; - i++){ - sspm_free_header(&(parts[i].header)); - } -} - -void sspm_free_header(struct sspm_header *header) -{ - if(header->boundary!=0){ - free(header->boundary); - } - if(header->minor_text!=0){ - free(header->minor_text); - } - if(header->charset!=0){ - free(header->charset); - } - if(header->filename!=0){ - free(header->filename); - } - if(header->content_id!=0){ - free(header->content_id); - } - if(header->error_text!=0){ - free(header->error_text); - } -} - -/*********************************************************************** -The remaining code is beased on code from the mimelite distribution, -which has the following notice: - -| Authorship: -| Copyright (c) 1994 Gisle Hannemyr. -| Permission is granted to hack, make and distribute copies of this -| program as long as this copyright notice is not removed. -| Flames, bug reports, comments and improvements to: -| snail: Gisle Hannemyr, Brageveien 3A, 0452 Oslo, Norway -| email: Inet: gisle@oslonett.no - -The code is heavily modified by Eric Busboom. - -***********************************************************************/ - -char *decode_quoted_printable(char *dest, - char *src, - size_t *size) -{ - int cc; - size_t i=0; - - while (*src != 0 && i < *size) { - if (*src == '=') { - - src++; - if (!*src) { - break; - } - - /* remove soft line breaks*/ - if ((*src == '\n') || (*src == '\r')){ - src++; - if ((*src == '\n') || (*src == '\r')){ - src++; - } - continue; - } - - cc = isdigit(*src) ? (*src - '0') : (*src - 55); - cc *= 0x10; - src++; - if (!*src) { - break; - } - cc += isdigit(*src) ? (*src - '0') : (*src - 55); - - *dest = cc; - - } else { - *dest = *src; - } - - dest++; - src++; - i++; - } - - *dest = '\0'; - - *size = i; - return(dest); -} - -char *decode_base64(char *dest, - char *src, - size_t *size) -{ - int cc; - char buf[4] = {0,0,0,0}; - int p = 0; - int valid_data = 0; - size_t size_out=0; - - while (*src && p<(int)*size && (cc!= -1)) { - - /* convert a character into the Base64 alphabet */ - cc = *src++; - - if ((cc >= 'A') && (cc <= 'Z')) cc = cc - 'A'; - else if ((cc >= 'a') && (cc <= 'z')) cc = cc - 'a' + 26; - else if ((cc >= '0') && (cc <= '9')) cc = cc - '0' + 52; - else if (cc == '/') cc = 63; - else if (cc == '+') cc = 62; - else cc = -1; - - assert(cc<64); - - /* If we've reached the end, fill the remaining slots in - the bucket and do a final conversion */ - if(cc== -1){ - if(valid_data == 0){ - return 0; - } - - while(p%4!=3){ - p++; - buf[p%4] = 0; - } - } else { - buf[p%4] = cc; - size_out++; - valid_data = 1; - } - - - /* When we have 4 base64 letters, convert them into three - bytes */ - if (p%4 == 3) { - *dest++ =(buf[0]<< 2)|((buf[1] & 0x30) >> 4); - *dest++ =((buf[1] & 0x0F) << 4)|((buf[2] & 0x3C) >> 2); - *dest++ =((buf[2] & 0x03) << 6)|(buf[3] & 0x3F); - - memset(buf,0,4); - } - - p++; - - } - /* Calculate the size of the converted data*/ - *size = ((int)(size_out/4))*3; - if(size_out%4 == 2) *size+=1; - if(size_out%4 == 3) *size+=2; - - return(dest); -} - - -/*********************************************************************** - - Routines to output MIME - -**********************************************************************/ - - -struct sspm_buffer { - char* buffer; - char* pos; - size_t buf_size; - int line_pos; -}; - -void sspm_append_string(struct sspm_buffer* buf, char* string); -void sspm_write_part(struct sspm_buffer *buf,struct sspm_part *part, int *part_num); - -void sspm_append_hex(struct sspm_buffer* buf, char ch) -{ - char tmp[3]; - - sprintf(tmp,"=%02X",ch); - - sspm_append_string(buf,tmp); -} - -/* a copy of icalmemory_append_char */ -void sspm_append_char(struct sspm_buffer* buf, char ch) -{ - char *new_buf; - char *new_pos; - - size_t data_length, final_length; - - data_length = (size_t)buf->pos - (size_t)buf->buffer; - - final_length = data_length + 2; - - if ( final_length > (size_t) buf->buf_size ) { - - buf->buf_size = (buf->buf_size) * 2 + final_length +1; - - new_buf = realloc(buf->buffer,buf->buf_size); - - new_pos = (void*)((size_t)new_buf + data_length); - - buf->pos = new_pos; - buf->buffer = new_buf; - } - - *(buf->pos) = ch; - buf->pos += 1; - *(buf->pos) = 0; -} -/* A copy of icalmemory_append_string */ -void sspm_append_string(struct sspm_buffer* buf, char* string) -{ - char *new_buf; - char *new_pos; - - size_t data_length, final_length, string_length; - - string_length = strlen(string); - data_length = (size_t)buf->pos - (size_t)buf->buffer; - final_length = data_length + string_length; - - if ( final_length >= (size_t) buf->buf_size) { - - - buf->buf_size = (buf->buf_size) * 2 + final_length; - - new_buf = realloc(buf->buffer,buf->buf_size); - - new_pos = (void*)((size_t)new_buf + data_length); - - buf->pos = new_pos; - buf->buffer = new_buf; - } - - strcpy(buf->pos, string); - - buf->pos += string_length; -} - - - -static int sspm_is_printable(char c) -{ - return (c >= 33) && (c <= 126) && (c != '='); - -} - - -void sspm_encode_quoted_printable(struct sspm_buffer *buf, char* data) -{ - char *p; - int lpos = 0; - - for(p = data; *p != 0; p++){ - - if(sspm_is_printable(*p)){ - /* plain characters can represent themselves */ - /* RFC2045 Rule #2 */ - sspm_append_char(buf,*p); - lpos++; - } else if ( *p == '\t' || *p == ' ' ) { - - /* For tabs and spaces, only encode if they appear at the - end of the line */ - /* RFC2045 Rule #3 */ - - char n = *(p+1); - - if( n == '\n' || n == '\r'){ - sspm_append_hex(buf,*p); - lpos += 3; - } else { - sspm_append_char(buf,*p); - lpos++; - } - - } else if( *p == '\n' || *p == '\r'){ - sspm_append_char(buf,*p); - - lpos=0; - - } else { - /* All others need to be encoded */ - sspm_append_hex(buf,*p); - lpos+=3; - } - - - /* Add line breaks */ - if (lpos > 72){ - lpos = 0; - sspm_append_string(buf,"=\n"); - } - } -} - -static char BaseTable[64] = { - 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P', - 'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f', - 'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v', - 'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/' -}; - -void sspm_write_base64(struct sspm_buffer *buf, char* inbuf,int size ) -{ - - char outbuf[4]; - int i; - - outbuf[0] = outbuf[1] = outbuf[2] = outbuf[3] = 65; - - switch(size){ - - case 4: - outbuf[3] = inbuf[2] & 0x3F; - - case 3: - outbuf[2] = ((inbuf[1] & 0x0F) << 2) | ((inbuf[2] & 0xC0) >> 6); - - case 2: - outbuf[0] = (inbuf[0] & 0xFC) >> 2; - outbuf[1] = ((inbuf[0] & 0x03) << 4) | ((inbuf[1] & 0xF0) >> 4); - break; - - default: - assert(0); - } - - for(i = 0; i < 4; i++){ - - if(outbuf[i] == 65){ - sspm_append_char(buf,'='); - } else { - sspm_append_char(buf,BaseTable[(int)outbuf[i]]); - } - } -} - -void sspm_encode_base64(struct sspm_buffer *buf, char* data, size_t size) -{ - - char *p; - char inbuf[3]; - int i = 0; - int first = 1; - int lpos = 0; - - inbuf[0] = inbuf[1] = inbuf[2] = 0; - - for (p = data; *p !=0; p++){ - - if (i%3 == 0 && first == 0){ - - sspm_write_base64(buf, inbuf, 4); - lpos+=4; - - inbuf[0] = inbuf[1] = inbuf[2] = 0; - } - - assert(lpos%4 == 0); - - if (lpos == 72){ - sspm_append_string(buf,"\n"); - lpos = 0; - } - - inbuf[i%3] = *p; - - i++; - first = 0; - - } - - - /* If the inbuf was not exactly filled on the last byte, we need - to spit out the odd bytes that did get in -- either one or - two. This will result in an output of two bytes and '==' or - three bytes and '=', respectively */ - - if (i%3 == 1 && first == 0){ - sspm_write_base64(buf, inbuf, 2); - } else if (i%3 == 2 && first == 0){ - sspm_write_base64(buf, inbuf, 3); - } - -} - -void sspm_write_header(struct sspm_buffer *buf,struct sspm_header *header) -{ - - int i; - char temp[TMP_BUF_SIZE]; - char* major; - char* minor; - - /* Content-type */ - - major = sspm_major_type_string(header->major); - minor = sspm_minor_type_string(header->minor); - - if(header->minor == SSPM_UNKNOWN_MINOR_TYPE ){ - assert(header->minor_text !=0); - minor = header->minor_text; - } - - sprintf(temp,"Content-Type: %s/%s",major,minor); - - sspm_append_string(buf,temp); - - if(header->boundary != 0){ - sprintf(temp,";boundary=\"%s\"",header->boundary); - sspm_append_string(buf,temp); - } - - /* Append any content type parameters */ - if(header->content_type_params != 0){ - for(i=0; *(header->content_type_params[i])!= 0;i++){ - sprintf(temp,header->content_type_params[i]); - sspm_append_char(buf,';'); - sspm_append_string(buf,temp); - } - } - - sspm_append_char(buf,'\n'); - - /*Content-Transfer-Encoding */ - - if(header->encoding != SSPM_UNKNOWN_ENCODING && - header->encoding != SSPM_NO_ENCODING){ - sprintf(temp,"Content-Transfer-Encoding: %s\n", - sspm_encoding_string(header->encoding)); - } - - sspm_append_char(buf,'\n'); - -} - -void sspm_write_multipart_part(struct sspm_buffer *buf, - struct sspm_part *parts, - int* part_num) -{ - - int parent_level, level; - struct sspm_header *header = &(parts[*part_num].header); - /* Write the header for the multipart part */ - sspm_write_header(buf,header); - - parent_level = parts[*part_num].level; - - (*part_num)++; - - level = parts[*part_num].level; - - while(parts[*part_num].header.major != SSPM_NO_MAJOR_TYPE && - level == parent_level+1){ - - assert(header->boundary); - sspm_append_string(buf,header->boundary); - sspm_append_char(buf,'\n'); - - if (parts[*part_num].header.major == SSPM_MULTIPART_MAJOR_TYPE){ - sspm_write_multipart_part(buf,parts,part_num); - } else { - sspm_write_part(buf, &(parts[*part_num]), part_num); - } - - (*part_num)++; - level = parts[*part_num].level; - } - - sspm_append_string(buf,"\n\n--"); - sspm_append_string(buf,header->boundary); - sspm_append_string(buf,"\n"); - - (*part_num)--; /* undo last, spurious, increment */ -} - -void sspm_write_part(struct sspm_buffer *buf,struct sspm_part *part,int *part_num) -{ - - /* Write header */ - sspm_write_header(buf,&(part->header)); - - /* Write part data */ - - if(part->data == 0){ - return; - } - - if(part->header.encoding == SSPM_BASE64_ENCODING) { - assert(part->data_size != 0); - sspm_encode_base64(buf,part->data,part->data_size); - } else if(part->header.encoding == SSPM_QUOTED_PRINTABLE_ENCODING) { - sspm_encode_quoted_printable(buf,part->data); - } else { - sspm_append_string(buf,part->data); - } - - sspm_append_string(buf,"\n\n"); -} - -int sspm_write_mime(struct sspm_part *parts,size_t num_parts, - char **output_string, char* header) -{ - struct sspm_buffer buf; - int part_num =0; - - buf.buffer = malloc(4096); - buf.pos = buf.buffer; - buf.buf_size = 10; - buf.line_pos = 0; - - /* write caller's header */ - if(header != 0){ - sspm_append_string(&buf,header); - } - - if(buf.buffer[strlen(buf.buffer)-1] != '\n'){ - sspm_append_char(&buf,'\n'); - } - - /* write mime-version header */ - sspm_append_string(&buf,"Mime-Version: 1.0\n"); - - /* End of header */ - - /* Write body parts */ - while(parts[part_num].header.major != SSPM_NO_MAJOR_TYPE){ - if (parts[part_num].header.major == SSPM_MULTIPART_MAJOR_TYPE){ - sspm_write_multipart_part(&buf,parts,&part_num); - } else { - sspm_write_part(&buf, &(parts[part_num]), &part_num); - } - - part_num++; - } - - - *output_string = buf.buffer; - - return 0; -} - diff --git a/libical/src/libical/sspm.h b/libical/src/libical/sspm.h deleted file mode 100644 index 864a23a36f..0000000000 --- a/libical/src/libical/sspm.h +++ /dev/null @@ -1,143 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: sspm.h Mime Parser - CREATOR: eric 25 June 2000 - - $Id$ - $Locker$ - - The contents of this file are subject to the Mozilla Public License - Version 1.0 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and - limitations under the License. - - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The Initial Developer of the Original Code is Eric Busboom - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - ======================================================================*/ - -#ifndef SSPM_H -#define SSPM_H - -enum sspm_major_type { - SSPM_NO_MAJOR_TYPE, - SSPM_TEXT_MAJOR_TYPE, - SSPM_IMAGE_MAJOR_TYPE, - SSPM_AUDIO_MAJOR_TYPE, - SSPM_VIDEO_MAJOR_TYPE, - SSPM_APPLICATION_MAJOR_TYPE, - SSPM_MULTIPART_MAJOR_TYPE, - SSPM_MESSAGE_MAJOR_TYPE, - SSPM_UNKNOWN_MAJOR_TYPE -}; - -enum sspm_minor_type { - SSPM_NO_MINOR_TYPE, - SSPM_ANY_MINOR_TYPE, - SSPM_PLAIN_MINOR_TYPE, - SSPM_RFC822_MINOR_TYPE, - SSPM_DIGEST_MINOR_TYPE, - SSPM_CALENDAR_MINOR_TYPE, - SSPM_MIXED_MINOR_TYPE, - SSPM_RELATED_MINOR_TYPE, - SSPM_ALTERNATIVE_MINOR_TYPE, - SSPM_PARALLEL_MINOR_TYPE, - SSPM_UNKNOWN_MINOR_TYPE -}; - -enum sspm_encoding { - SSPM_NO_ENCODING, - SSPM_QUOTED_PRINTABLE_ENCODING, - SSPM_8BIT_ENCODING, - SSPM_7BIT_ENCODING, - SSPM_BINARY_ENCODING, - SSPM_BASE64_ENCODING, - SSPM_UNKNOWN_ENCODING -}; - -enum sspm_error{ - SSPM_NO_ERROR, - SSPM_UNEXPECTED_BOUNDARY_ERROR, - SSPM_WRONG_BOUNDARY_ERROR, - SSPM_NO_BOUNDARY_ERROR, - SSPM_NO_HEADER_ERROR, - SSPM_MALFORMED_HEADER_ERROR -}; - - -struct sspm_header -{ - int def; - char* boundary; - enum sspm_major_type major; - enum sspm_minor_type minor; - char *minor_text; - char ** content_type_params; - char* charset; - enum sspm_encoding encoding; - char* filename; - char* content_id; - enum sspm_error error; - char* error_text; -}; - -struct sspm_part { - struct sspm_header header; - int level; - size_t data_size; - void *data; -}; - -struct sspm_action_map { - enum sspm_major_type major; - enum sspm_minor_type minor; - void* (*new_part)(); - void (*add_line)(void *part, struct sspm_header *header, - char* line, size_t size); - void* (*end_part)(void* part); - void (*free_part)(void *part); -}; - -char* sspm_major_type_string(enum sspm_major_type type); -char* sspm_minor_type_string(enum sspm_minor_type type); -char* sspm_encoding_string(enum sspm_encoding type); - -int sspm_parse_mime(struct sspm_part *parts, - size_t max_parts, - struct sspm_action_map *actions, - char* (*get_string)(char *s, size_t size, void* data), - void *get_string_data, - struct sspm_header *first_header - ); - -void sspm_free_parts(struct sspm_part *parts, size_t max_parts); - -char *decode_quoted_printable(char *dest, - char *src, - size_t *size); -char *decode_base64(char *dest, - char *src, - size_t *size); - - -int sspm_write_mime(struct sspm_part *parts,size_t num_parts, - char **output_string, char* header); - -#endif /*SSPM_H*/ diff --git a/libical/src/libical/vsnprintf.c b/libical/src/libical/vsnprintf.c deleted file mode 100644 index 6339183dd4..0000000000 --- a/libical/src/libical/vsnprintf.c +++ /dev/null @@ -1,167 +0,0 @@ -#ifdef __osf__ -/* - * Revision 12: http://theos.com/~deraadt/snprintf.c - * - * Copyright (c) 1997 Theo de Raadt - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/param.h> -#include <sys/types.h> -#include <sys/mman.h> -#include <signal.h> -#include <stdio.h> -#include <unistd.h> -#include <string.h> -#if __STDC__ -#include <stdarg.h> -#include <stdlib.h> -#else -#include <varargs.h> -#endif -#include <setjmp.h> - -#ifndef roundup -#define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) -#endif - -static int pgsize; -static char *curobj; -static sigjmp_buf bail; - -#define EXTRABYTES 2 /* XXX: why 2? you don't want to know */ - -static char * -msetup(str, n) - char *str; - size_t n; -{ - char *e; - - if (n == 0) - return NULL; - if (pgsize == 0) - pgsize = getpagesize(); - curobj = (char *)malloc(n + EXTRABYTES + pgsize * 2); - if (curobj == NULL) - return NULL; - e = curobj + n + EXTRABYTES; - e = (char *)roundup((unsigned long)e, pgsize); - if (mprotect(e, pgsize, PROT_NONE) == -1) { - free(curobj); - curobj = NULL; - return NULL; - } - e = e - n - EXTRABYTES; - *e = '\0'; - return (e); -} - -static void -mcatch(int i) -{ - siglongjmp(bail, 1); -} - -static void -mcleanup(str, n, p) - char *str; - size_t n; - char *p; -{ - strncpy(str, p, n-1); - str[n-1] = '\0'; - if (mprotect((caddr_t)(p + n + EXTRABYTES), pgsize, - PROT_READ|PROT_WRITE|PROT_EXEC) == -1) - mprotect((caddr_t)(p + n + EXTRABYTES), pgsize, - PROT_READ|PROT_WRITE); - free(curobj); -} - -int -#if __STDC__ -vsnprintf(char *str, size_t n, char const *fmt, va_list ap) -#else -vsnprintf(str, n, fmt, ap) - char *str; - size_t n; - char *fmt; - char *ap; -#endif -{ - struct sigaction osa, nsa; - char *p; - int ret = n + 1; /* if we bail, indicated we overflowed */ - - memset(&nsa, 0, sizeof nsa); - nsa.sa_handler = mcatch; - sigemptyset(&nsa.sa_mask); - - p = msetup(str, n); - if (p == NULL) { - *str = '\0'; - return 0; - } - if (sigsetjmp(bail, 1) == 0) { - if (sigaction(SIGSEGV, &nsa, &osa) == -1) { - mcleanup(str, n, p); - return (0); - } - ret = vsprintf(p, fmt, ap); - } - mcleanup(str, n, p); - (void) sigaction(SIGSEGV, &osa, NULL); - return (ret); -} - -int -#if __STDC__ -snprintf(char *str, size_t n, char const *fmt, ...) -#else -snprintf(str, n, fmt, va_alist) - char *str; - size_t n; - char *fmt; - va_dcl -#endif -{ - va_list ap; -#if __STDC__ - va_start(ap, fmt); -#else - va_start(ap); -#endif - - return (vsnprintf(str, n, fmt, ap)); - va_end(ap); -} - - -#else - -/* ANSI C forbids an empty source file... */ - -static void vsnprintf_dummy_func() { - vsnprintf_dummy_func(); -} - -#endif diff --git a/libical/src/libicalss/.cvsignore b/libical/src/libicalss/.cvsignore deleted file mode 100644 index 04a3e1b036..0000000000 --- a/libical/src/libicalss/.cvsignore +++ /dev/null @@ -1,10 +0,0 @@ -Makefile -.deps -Makefile.in -*.lo -*.la -.libs -y.output -icalsslexer.c -icalssyacc.c -icalss.h diff --git a/libical/src/libicalss/Makefile.am b/libical/src/libicalss/Makefile.am deleted file mode 100644 index 8ab867a206..0000000000 --- a/libical/src/libicalss/Makefile.am +++ /dev/null @@ -1,63 +0,0 @@ -lib_LTLIBRARIES = libicalss.la - -YFLAGS =-d -v -p ss -LFLAGS = -Pss -LEX_OUTPUT_ROOT = lex.ss - -all: icalss.h - -INCLUDES = \ - -I$(top_srcdir)/src \ - -I$(top_builddir)/src \ - -I$(top_srcdir)/src/libical \ - -I$(top_builddir)/src/libical - -libicalss_la_LDFLAGS = -version-info 0:0:0 - -libicalss_la_SOURCES = \ - icalclassify.c \ - icalgauge.c \ - icalgaugeimpl.h \ - icaldirset.c \ - icaldirsetimpl.h \ - icalfileset.c \ - icalfilesetimpl.h \ - icalset.c \ - icalsslexer.l \ - icalssyacc.h \ - icalssyacc.y \ - icalspanlist.c \ - icalmessage.c \ - icalcstpclient.c \ - icalcstpclient.h \ - icalcstpserver.c \ - icalcstpserver.h \ - icalcstp.c - -libicalssincludedir = $(includedir) - -COMBINEDHEADERS = \ - $(srcdir)/icalgauge.h \ - $(srcdir)/icalset.h \ - $(srcdir)/icalfileset.h \ - $(srcdir)/icaldirset.h \ - $(srcdir)/icalcalendar.h \ - $(srcdir)/icalclassify.h \ - $(srcdir)/icalspanlist.h \ - $(srcdir)/icalmessage.h \ - $(srcdir)/icalcstp.h \ - $(srcdir)/icalcstpclient.h \ - $(srcdir)/icalcstpserver.h - - -icalss.h: $(COMBINEDHEADERS) - cat $(COMBINEDHEADERS) | egrep -v "#include.*\"ical" \ - | egrep -v "#include.*\"pvl\.h\"" > icalss.h - - -libicalssinclude_HEADERS = icalss.h - -CONFIG_CLEAN_FILES = y.output - -EXTRA_DIST = \ - $(COMBINEDHEADERS) \ diff --git a/libical/src/libicalss/icalcalendar.c b/libical/src/libicalss/icalcalendar.c deleted file mode 100644 index e63b5330ad..0000000000 --- a/libical/src/libicalss/icalcalendar.c +++ /dev/null @@ -1,265 +0,0 @@ -/*====================================================================== - FILE: icalcalendar.c - CREATOR: eric 23 December 1999 - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - ======================================================================*/ - - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - - -#include "icalcalendar.h" -#include "icalset.h" -#include "icalfileset.h" -#include "icaldirset.h" -#include <limits.h> -#include <sys/stat.h> /* For mkdir, stat */ -#include <sys/types.h> /* For mkdir */ -#include <fcntl.h> /* For mkdir */ -#include <unistd.h> /* For mkdir, stat */ -#include <stdlib.h> /* for malloc */ -#include <string.h> /* for strcat */ -#include <errno.h> - -#define BOOKED_DIR "booked" -#define INCOMING_FILE "incoming.ics" -#define PROP_FILE "properties.ics" -#define FBLIST_FILE "freebusy.ics" - -struct icalcalendar_impl -{ - char* dir; - icalcomponent* freebusy; - icalcomponent* properties; - icalset* booked; - icalset* incoming; -}; - -struct icalcalendar_impl* icalcalendar_new_impl() -{ - struct icalcalendar_impl* impl; - - if ( ( impl = (struct icalcalendar_impl*) - malloc(sizeof(struct icalcalendar_impl))) == 0) { - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - return impl; -} - - -icalerrorenum icalcalendar_create(struct icalcalendar_impl* impl) -{ - char path[PATH_MAX]; - struct stat sbuf; - int r; - - icalerror_check_arg_re((impl != 0),"impl",ICAL_BADARG_ERROR); - - path[0] = '\0'; - strcpy(path,impl->dir); - strcat(path,"/"); - strcat(path,BOOKED_DIR); - - r = stat(path,&sbuf); - - if( r != 0 && errno == ENOENT){ - - if(mkdir(path,0777)!=0){ - icalerror_set_errno(ICAL_FILE_ERROR); - return ICAL_FILE_ERROR; - } - } - - return ICAL_NO_ERROR; -} - -icalcalendar* icalcalendar_new(char* dir) -{ - struct icalcalendar_impl* impl; - - icalerror_check_arg_rz((dir != 0),"dir"); - - impl = icalcalendar_new_impl(); - - if (impl == 0){ - return 0; - } - - impl->dir = (char*)strdup(dir); - impl->freebusy = 0; - impl->properties = 0; - impl->booked = 0; - impl->incoming = 0; - - if (icalcalendar_create(impl) != ICAL_NO_ERROR){ - free(impl); - return 0; - } - - return impl; -} - -void icalcalendar_free(icalcalendar* calendar) -{ - - struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar; - - if (impl->dir !=0){ - free(impl->dir); - } - - if (impl->freebusy !=0){ - icalfileset_free(impl->freebusy); - } - - if (impl->properties !=0){ - icalfileset_free(impl->properties); - } - - if (impl->booked !=0){ - icaldirset_free(impl->booked); - } - - if (impl->incoming !=0){ - icaldirset_free(impl->incoming); - } - - impl->dir = 0; - impl->freebusy = 0; - impl->properties = 0; - impl->booked = 0; - impl->incoming = 0; - - - free(impl); -} - - -int icalcalendar_lock(icalcalendar* calendar) -{ - struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar; - icalerror_check_arg_rz((impl != 0),"impl"); - return 0; -} - -int icalcalendar_unlock(icalcalendar* calendar) -{ - struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar; - icalerror_check_arg_rz((impl != 0),"impl"); - return 0; -} - -int icalcalendar_islocked(icalcalendar* calendar) -{ - struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar; - icalerror_check_arg_rz((impl != 0),"impl"); - return 0; -} - -int icalcalendar_ownlock(icalcalendar* calendar) -{ - struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar; - icalerror_check_arg_rz((impl != 0),"impl"); - return 0; -} - -icalset* icalcalendar_get_booked(icalcalendar* calendar) -{ - struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar; - char dir[PATH_MAX]; - - icalerror_check_arg_rz((impl != 0),"impl"); - - dir[0] = '\0'; - strcpy(dir,impl->dir); - strcat(dir,"/"); - strcat(dir,BOOKED_DIR); - - if (impl->booked == 0){ - icalerror_clear_errno(); - impl->booked = icaldirset_new(dir); - assert(icalerrno == ICAL_NO_ERROR); - } - - return impl->booked; - -} - -icalset* icalcalendar_get_incoming(icalcalendar* calendar) -{ - char path[PATH_MAX]; - struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar; - icalerror_check_arg_rz((impl != 0),"impl"); - - path[0] = '\0'; - strcpy(path,impl->dir); - strcat(path,"/"); - strcat(path,INCOMING_FILE); - - if (impl->properties == 0){ - impl->properties = icalfileset_new(path); - } - - return impl->properties; -} - -icalset* icalcalendar_get_properties(icalcalendar* calendar) -{ - char path[PATH_MAX]; - struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar; - icalerror_check_arg_rz((impl != 0),"impl"); - - path[0] = '\0'; - strcpy(path,impl->dir); - strcat(path,"/"); - strcat(path,PROP_FILE); - - if (impl->properties == 0){ - impl->properties = icalfileset_new(path); - } - - return impl->properties; -} - -icalset* icalcalendar_get_freebusy(icalcalendar* calendar) -{ - char path[PATH_MAX]; - struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar; - icalerror_check_arg_rz((impl != 0),"impl"); - - path[0] = '\0'; - strcpy(path,impl->dir); - strcat(path,"/"); - strcat(path,FBLIST_FILE); - - - if (impl->freebusy == 0){ - impl->freebusy = icalfileset_new(path); - } - - return impl->freebusy; -} - - - - diff --git a/libical/src/libicalss/icalcalendar.h b/libical/src/libicalss/icalcalendar.h deleted file mode 100644 index f07457c60d..0000000000 --- a/libical/src/libicalss/icalcalendar.h +++ /dev/null @@ -1,67 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalcalendar.h - CREATOR: eric 23 December 1999 - - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The Original Code is eric. The Initial Developer of the Original - Code is Eric Busboom - - -======================================================================*/ - -#ifndef ICALCALENDAR_H -#define ICALCALENDAR_H - -#include "ical.h" -#include "icalset.h" - -/* icalcalendar - * Routines for storing calendar data in a file system. The calendar - * has two icaldirsets, one for incoming components and one for booked - * components. It also has interfaces to access the free/busy list - * and a list of calendar properties */ - -typedef void icalcalendar; - -icalcalendar* icalcalendar_new(char* dir); - -void icalcalendar_free(icalcalendar* calendar); - -int icalcalendar_lock(icalcalendar* calendar); - -int icalcalendar_unlock(icalcalendar* calendar); - -int icalcalendar_islocked(icalcalendar* calendar); - -int icalcalendar_ownlock(icalcalendar* calendar); - -icalset* icalcalendar_get_booked(icalcalendar* calendar); - -icalset* icalcalendar_get_incoming(icalcalendar* calendar); - -icalset* icalcalendar_get_properties(icalcalendar* calendar); - -icalset* icalcalendar_get_freebusy(icalcalendar* calendar); - - -#endif /* !ICALCALENDAR_H */ - - - diff --git a/libical/src/libicalss/icalclassify.c b/libical/src/libicalss/icalclassify.c deleted file mode 100644 index ad2d6d6fd8..0000000000 --- a/libical/src/libicalss/icalclassify.c +++ /dev/null @@ -1,696 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: icalclassify.c - CREATOR: ebusboom 23 aug 2000 - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - - ======================================================================*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "ical.h" -#include "icalclassify.h" -#include "icalmemory.h" -#include <ctype.h> /* For tolower() */ -#include <string.h> /* for index() */ -#include <stdlib.h> /* for malloc and free */ - - - -struct icalclassify_parts { - icalcomponent *c; - icalproperty_method method; - char* organizer; - icalparameter_partstat reply_partstat; - char* reply_attendee; - char* uid; - int sequence; - struct icaltimetype dtstamp; - struct icaltimetype recurrence_id; -}; - - -char* icalclassify_lowercase(const char* str) -{ - char* p = 0; - char* new = icalmemory_strdup(str); - - if(str ==0){ - return 0; - } - - for(p = new; *p!=0; p++){ - *p = tolower(*p); - } - - return new; -} - -/* Return a set of components that intersect in time with comp. For -component X and Y to intersect: - X.DTSTART < Y.DTEND && X.DTEND > Y.DTSTART -*/ - - -icalcomponent* icalclassify_find_overlaps(icalset* set, icalcomponent* comp) -{ - icalcomponent *return_set; - icalcomponent *c; - struct icaltime_span span,compspan; - - icalerror_clear_errno(); - compspan = icalcomponent_get_span(comp); - - if(icalerrno != ICAL_NO_ERROR){ - return 0; - } - - - return_set = icalcomponent_new(ICAL_XROOT_COMPONENT); - - for(c = icalset_get_first_component(set); - c != 0; - c = icalset_get_next_component(set)){ - - icalerror_clear_errno(); - - span = icalcomponent_get_span(c); - - if(icalerrno != ICAL_NO_ERROR){ - continue; - } - - if (compspan.start < span.end && - compspan.end > span.start){ - - icalcomponent *clone = icalcomponent_new_clone(c); - - icalcomponent_add_component(return_set,clone); - } - } - - if(icalcomponent_count_components(return_set,ICAL_ANY_COMPONENT) !=0){ - return return_set; - } else { - icalcomponent_free(return_set); - return 0; - } -} - - - -icalproperty* icalclassify_find_attendee(icalcomponent *c, - const char* attendee) -{ - icalproperty *p; - char* lattendee = icalclassify_lowercase(attendee); - char* upn = strchr(lattendee,':'); - icalcomponent *inner = icalcomponent_get_first_real_component(c); - - for(p = icalcomponent_get_first_property(inner,ICAL_ATTENDEE_PROPERTY); - p != 0; - p = icalcomponent_get_next_property(inner,ICAL_ATTENDEE_PROPERTY)) - { - const char* this_attendee - = icalclassify_lowercase(icalproperty_get_attendee(p)); - char* this_upn = strchr(this_attendee,':'); - - if(this_upn == 0){ - continue; - } - - if(strcmp(this_upn,upn)==0){ - return p; - } - - } - - return 0; - -} - -void icalssutil_free_parts(struct icalclassify_parts *parts) -{ - if(parts == 0){ - return; - } - - if(parts->organizer != 0){ - free(parts->organizer); - } - - if(parts->uid != 0){ - free(parts->uid); - } - - if(parts->reply_attendee){ - free(parts->reply_attendee); - } -} - -void icalssutil_get_parts(icalcomponent* c, - struct icalclassify_parts* parts) -{ - icalproperty *p; - icalcomponent *inner; - - memset(parts,0,sizeof(struct icalclassify_parts)); - - parts->method = ICAL_METHOD_NONE; - parts->sequence = 0; - parts->reply_partstat = ICAL_PARTSTAT_NONE; - - if(c == 0){ - return; - } - - parts->c = c; - - p = icalcomponent_get_first_property(c,ICAL_METHOD_PROPERTY); - if(p!=0){ - parts->method = icalproperty_get_method(p); - } - - inner = icalcomponent_get_first_real_component(c); - - p = icalcomponent_get_first_property(inner,ICAL_ORGANIZER_PROPERTY); - if(p!=0){ - parts->organizer = strdup(icalproperty_get_organizer(p)); - } - - p = icalcomponent_get_first_property(inner,ICAL_SEQUENCE_PROPERTY); - if(p!=0){ - parts->sequence = icalproperty_get_sequence(p); - } - - p = icalcomponent_get_first_property(inner,ICAL_UID_PROPERTY); - if(p!=0){ - parts->uid = strdup(icalproperty_get_uid(p)); - } - - p = icalcomponent_get_first_property(inner,ICAL_RECURRENCEID_PROPERTY); - if(p!=0){ - parts->recurrence_id = icalproperty_get_recurrenceid(p); - } - - p = icalcomponent_get_first_property(inner,ICAL_DTSTAMP_PROPERTY); - if(p!=0){ - parts->dtstamp = icalproperty_get_dtstamp(p); - } - - if(parts->method==ICAL_METHOD_REPLY){ - icalparameter *param; - p = icalcomponent_get_first_property(inner,ICAL_ATTENDEE_PROPERTY); - - if(p!=0){ - - param = icalproperty_get_first_parameter(p,ICAL_PARTSTAT_PARAMETER); - - if(param != 0){ - parts->reply_partstat = - icalparameter_get_partstat(param); - } - - parts->reply_attendee = strdup(icalproperty_get_attendee(p)); - } - - } - - -} - - -int icalssutil_is_rescheduled(icalcomponent* a,icalcomponent* b) -{ - icalproperty *p1,*p2; - icalcomponent *i1,*i2; - int i; - - icalproperty_kind kind_array[] = { - ICAL_DTSTART_PROPERTY, - ICAL_DTEND_PROPERTY, - ICAL_DURATION_PROPERTY, - ICAL_DUE_PROPERTY, - ICAL_RRULE_PROPERTY, - ICAL_RDATE_PROPERTY, - ICAL_EXRULE_PROPERTY, - ICAL_EXDATE_PROPERTY, - ICAL_NO_PROPERTY - }; - - i1 = icalcomponent_get_first_real_component(a); - i2 = icalcomponent_get_first_real_component(b); - - for(i =0; kind_array[i] != ICAL_NO_PROPERTY; i++){ - p1 = icalcomponent_get_first_property(i1,kind_array[i]); - p2 = icalcomponent_get_first_property(i2,kind_array[i]); - - if( (p1!=0)^(p1!=0) ){ - /* Return true if the property exists in one component and not - the other */ - return 1; - } - - if(p1 && strcmp(icalproperty_as_ical_string(p1), - icalproperty_as_ical_string(p2)) != 0){ - return 1; - } - } - - return 0; - -} - -#define icalclassify_pre \ - int rtrn =0; - -#define icalclassify_post \ - return rtrn; - - -int icalclassify_publish_new(struct icalclassify_parts *comp, - struct icalclassify_parts *match, - const char* user) -{ - icalclassify_pre; - - if(comp->method == ICAL_METHOD_PUBLISH && - match == 0){ - rtrn = 1; - } - - icalclassify_post; - -} - -int icalclassify_publish_update(struct icalclassify_parts *comp, - struct icalclassify_parts *match, - const char* user) -{ - icalclassify_pre; - - if(comp->method == ICAL_METHOD_PUBLISH && - match !=0 ){ - rtrn = 1; - } - - icalclassify_post; - -} - -int icalclassify_publish_freebusy(struct icalclassify_parts *comp, - struct icalclassify_parts *match, - const char* user) -{ - icalclassify_pre; - - if(comp->method == ICAL_METHOD_PUBLISH && - match == 0){ - rtrn = 1; - } - - icalclassify_post; - -} - - -int icalclassify_request_new(struct icalclassify_parts *comp, - struct icalclassify_parts *match, - const char* user) -{ - /* Method is REQUEST, and there is no match */ - - icalclassify_pre - - if(match->c==0 && comp->method == ICAL_METHOD_REQUEST){ - rtrn = 1; - } - - icalclassify_post - -} - -int icalclassify_request_update( - struct icalclassify_parts *comp, - struct icalclassify_parts *match, - const char* user) -{ - /* REQUEST method, Higher SEQUENCE than match, and all - time-related properties are unchanged */ - - icalclassify_pre - - if (match != 0 && - comp->sequence >= match->sequence && - !icalssutil_is_rescheduled(comp->c,match->c)){ - rtrn = 1; - } - - icalclassify_post - -} - -int icalclassify_request_reschedule( - struct icalclassify_parts *comp, - struct icalclassify_parts *match, - const char* user) -{ - /* REQUEST method, Higher SEQUENCE than match, and one or more - time-related properties are changed */ - icalclassify_pre - - if (match->c != 0 && - comp->sequence > match->sequence && - icalssutil_is_rescheduled(comp->c,match->c)){ - rtrn = 1; - } - - icalclassify_post - -} - -int icalclassify_request_delegate( - struct icalclassify_parts *comp, - struct icalclassify_parts *match, - const char* user) -{ - icalclassify_pre - - if (match->c != 0 && - comp->sequence > match->sequence && - icalssutil_is_rescheduled(comp->c,match->c)){ - rtrn = 1; - } - - icalclassify_post - -} - -int icalclassify_request_new_organizer( - struct icalclassify_parts *comp, - struct icalclassify_parts *match, - const char* user) -{ - /* Organizer has changed between match and component */ - icalclassify_pre - - icalclassify_post - -} - -int icalclassify_request_status( - struct icalclassify_parts *comp, - struct icalclassify_parts *match, - const char* user) -{ - icalclassify_pre - icalclassify_post -} - -int icalclassify_request_forward( - struct icalclassify_parts *comp, - struct icalclassify_parts *match, - const char* user) -{ - icalclassify_pre - icalclassify_post -} - -int icalclassify_request_freebusy( - struct icalclassify_parts *comp, - struct icalclassify_parts *match, - const char* user) -{ - icalclassify_pre - icalclassify_post -} - -int icalclassify_reply_accept( - struct icalclassify_parts *comp, - struct icalclassify_parts *match, - const char* user) -{ - icalproperty* attendee; - icalclassify_pre; - - attendee = icalclassify_find_attendee(match->c,comp->reply_attendee); - - if(attendee != 0&& - comp->reply_partstat == ICAL_PARTSTAT_ACCEPTED){ - rtrn = 1; - } - - icalclassify_post -} -int icalclassify_reply_decline( - struct icalclassify_parts *comp, - struct icalclassify_parts *match, - const char* user) -{ - icalproperty* attendee; - icalclassify_pre; - - attendee = icalclassify_find_attendee(match->c,comp->reply_attendee); - - - if( attendee != 0 && - comp->reply_partstat == ICAL_PARTSTAT_DECLINED){ - rtrn = 1; - } - icalclassify_post -} -int icalclassify_reply_crasher_accept( - struct icalclassify_parts *comp, - struct icalclassify_parts *match, - const char* user) -{ - icalproperty* attendee; - icalclassify_pre; - - attendee= icalclassify_find_attendee(match->c,comp->reply_attendee); - - if(attendee == 0 && - comp->reply_partstat == ICAL_PARTSTAT_ACCEPTED){ - rtrn = 1; - } - icalclassify_post -} -int icalclassify_reply_crasher_decline( - struct icalclassify_parts *comp, - struct icalclassify_parts *match, - const char* user) -{ - icalparameter_partstat partstat; - icalproperty* attendee; - icalclassify_pre; - - - attendee = icalclassify_find_attendee(match->c,comp->reply_attendee); - - if(attendee == 0 && - comp->reply_partstat == ICAL_PARTSTAT_DECLINED){ - rtrn = 1; - } - icalclassify_post -} -int icalclassify_add_instance( - struct icalclassify_parts *comp, - struct icalclassify_parts *match, - const char* user) -{ - icalclassify_pre - if(comp->method == ICAL_METHOD_ADD){ - rtrn = 1; - } - icalclassify_post -} -int icalclassify_cancel_event( - struct icalclassify_parts *comp, - struct icalclassify_parts *match, - const char* user) -{ - icalclassify_pre - if(comp->method == ICAL_METHOD_CANCEL){ - rtrn = 1; - } - icalclassify_post -} -int icalclassify_cancel_instance( - struct icalclassify_parts *comp, - struct icalclassify_parts *match, - const char* user) -{ - icalclassify_pre - if(comp->method == ICAL_METHOD_CANCEL){ - rtrn = 1; - } - icalclassify_post -} -int icalclassify_cancel_all( - struct icalclassify_parts *comp, - struct icalclassify_parts *match, - const char* user) -{ - icalclassify_pre - if(comp->method == ICAL_METHOD_CANCEL){ - rtrn = 1; - } - icalclassify_post -} -int icalclassify_refesh( - struct icalclassify_parts *comp, - struct icalclassify_parts *match, - const char* user) -{ - icalclassify_pre - if(comp->method == ICAL_METHOD_REFRESH){ - rtrn = 1; - } - icalclassify_post -} -int icalclassify_counter( - struct icalclassify_parts *comp, - struct icalclassify_parts *match, - const char* user) -{ - icalclassify_pre - if(comp->method == ICAL_METHOD_COUNTER){ - rtrn = 1; - } - icalclassify_post -} -int icalclassify_delinecounter( - struct icalclassify_parts *comp, - struct icalclassify_parts *match, - const char* user) -{ - icalclassify_pre - - if(comp->method == ICAL_METHOD_DECLINECOUNTER){ - rtrn = 1; - } - - icalclassify_post -} - -struct icalclassify_map { - icalproperty_method method; - int (*fn)(struct icalclassify_parts *comp,struct icalclassify_parts *match, const char* user); - ical_class class; -} icalclassify_map[] = -{ {ICAL_METHOD_PUBLISH,icalclassify_publish_new,ICAL_PUBLISH_NEW_CLASS}, - {ICAL_METHOD_PUBLISH,icalclassify_publish_update,ICAL_PUBLISH_UPDATE_CLASS}, - {ICAL_METHOD_PUBLISH,icalclassify_publish_freebusy,ICAL_PUBLISH_FREEBUSY_CLASS}, - {ICAL_METHOD_REQUEST,icalclassify_request_new,ICAL_REQUEST_NEW_CLASS}, - {ICAL_METHOD_REQUEST,icalclassify_request_update,ICAL_REQUEST_UPDATE_CLASS}, - {ICAL_METHOD_REQUEST,icalclassify_request_reschedule,ICAL_REQUEST_RESCHEDULE_CLASS}, - {ICAL_METHOD_REQUEST,icalclassify_request_delegate,ICAL_REQUEST_DELEGATE_CLASS}, - {ICAL_METHOD_REQUEST,icalclassify_request_new_organizer,ICAL_REQUEST_NEW_ORGANIZER_CLASS}, - {ICAL_METHOD_REQUEST,icalclassify_request_forward,ICAL_REQUEST_FORWARD_CLASS}, - {ICAL_METHOD_REQUEST,icalclassify_request_status,ICAL_REQUEST_STATUS_CLASS}, - {ICAL_METHOD_REQUEST,icalclassify_request_freebusy,ICAL_REQUEST_FREEBUSY_CLASS}, - - {ICAL_METHOD_REPLY,icalclassify_reply_accept,ICAL_REPLY_ACCEPT_CLASS}, - {ICAL_METHOD_REPLY,icalclassify_reply_decline,ICAL_REPLY_DECLINE_CLASS}, - {ICAL_METHOD_REPLY,icalclassify_reply_crasher_accept,ICAL_REPLY_CRASHER_ACCEPT_CLASS}, - {ICAL_METHOD_REPLY,icalclassify_reply_crasher_decline,ICAL_REPLY_CRASHER_DECLINE_CLASS}, - - {ICAL_METHOD_ADD,icalclassify_add_instance,ICAL_ADD_INSTANCE_CLASS}, - - {ICAL_METHOD_CANCEL,icalclassify_cancel_event,ICAL_CANCEL_EVENT_CLASS}, - {ICAL_METHOD_CANCEL,icalclassify_cancel_instance,ICAL_CANCEL_INSTANCE_CLASS}, - {ICAL_METHOD_CANCEL,icalclassify_cancel_all,ICAL_CANCEL_ALL_CLASS}, - - {ICAL_METHOD_REFRESH,icalclassify_refesh,ICAL_REFRESH_CLASS}, - {ICAL_METHOD_COUNTER,icalclassify_counter,ICAL_COUNTER_CLASS}, - {ICAL_METHOD_DECLINECOUNTER,icalclassify_delinecounter,ICAL_DECLINECOUNTER_CLASS}, - {ICAL_METHOD_NONE,0,ICAL_NO_CLASS} -}; - - -ical_class icalclassify(icalcomponent* c,icalcomponent* match, - const char* user) -{ - icalcomponent *inner; - icalproperty *p; - icalproperty_method method; - ical_class class = ICAL_UNKNOWN_CLASS; - - int i; - - struct icalclassify_parts comp_parts; - struct icalclassify_parts match_parts; - - inner = icalcomponent_get_first_real_component(c); - - if (inner == 0) { - return ICAL_NO_CLASS; - } - - icalssutil_get_parts(c,&comp_parts); - icalssutil_get_parts(match,&match_parts); - - /* Determine if the incoming component is obsoleted by the match */ - if(match != 0 && ( - comp_parts.method == ICAL_METHOD_REQUEST - )){ - assert ( ! ((comp_parts.dtstamp.is_utc==1)^ - (match_parts.dtstamp.is_utc==1))); - - if( comp_parts.sequence<match_parts.sequence && - icaltime_compare(comp_parts.dtstamp,match_parts.dtstamp)>0) - { - /* comp has a smaller sequence and a later DTSTAMP */ - return ICAL_MISSEQUENCED_CLASS; - } - - if( (comp_parts.sequence<match_parts.sequence ) - /*&&icaltime_compare(comp_parts.dtstamp,match_parts.dtstamp)<=0*/ - || - ( comp_parts.sequence == match_parts.sequence && - icaltime_compare(comp_parts.dtstamp,match_parts.dtstamp)<=0)){ - - return ICAL_OBSOLETE_CLASS; - } - - } - - p = icalcomponent_get_first_property(c,ICAL_METHOD_PROPERTY); - if (p == 0) { - return ICAL_UNKNOWN_CLASS; - } - method = icalproperty_get_method(p); - - for (i =0; icalclassify_map[i].method != ICAL_METHOD_NONE; i++){ - if(icalclassify_map[i].method == method){ - if( (*(icalclassify_map[i].fn))(&comp_parts,&match_parts,user)==1){ - class = icalclassify_map[i].class; - break; - } - } - } - - icalssutil_free_parts(&comp_parts); - icalssutil_free_parts(&match_parts); - - return class; - -} diff --git a/libical/src/libicalss/icalclassify.h b/libical/src/libicalss/icalclassify.h deleted file mode 100644 index ae76434378..0000000000 --- a/libical/src/libicalss/icalclassify.h +++ /dev/null @@ -1,73 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalclassify.h - CREATOR: eric 21 Aug 2000 - - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - - =========================================================================*/ - -#ifndef ICALCLASSIFY_H -#define ICALCLASSIFY_H - -#include "ical.h" -#include "icalset.h" - - -typedef enum icalclass { - ICAL_NO_CLASS, - ICAL_PUBLISH_NEW_CLASS, - ICAL_PUBLISH_UPDATE_CLASS, - ICAL_PUBLISH_FREEBUSY_CLASS, - ICAL_REQUEST_NEW_CLASS, - ICAL_REQUEST_UPDATE_CLASS, - ICAL_REQUEST_RESCHEDULE_CLASS, - ICAL_REQUEST_DELEGATE_CLASS, - ICAL_REQUEST_NEW_ORGANIZER_CLASS, - ICAL_REQUEST_FORWARD_CLASS, - ICAL_REQUEST_STATUS_CLASS, - ICAL_REQUEST_FREEBUSY_CLASS, - ICAL_REPLY_ACCEPT_CLASS, - ICAL_REPLY_DECLINE_CLASS, - ICAL_REPLY_CRASHER_ACCEPT_CLASS, - ICAL_REPLY_CRASHER_DECLINE_CLASS, - ICAL_ADD_INSTANCE_CLASS, - ICAL_CANCEL_EVENT_CLASS, - ICAL_CANCEL_INSTANCE_CLASS, - ICAL_CANCEL_ALL_CLASS, - ICAL_REFRESH_CLASS, - ICAL_COUNTER_CLASS, - ICAL_DECLINECOUNTER_CLASS, - ICAL_MALFORMED_CLASS, - ICAL_OBSOLETE_CLASS, /* 21 */ - ICAL_MISSEQUENCED_CLASS, /* 22 */ - ICAL_UNKNOWN_CLASS /* 23 */ -} ical_class; - -ical_class icalclassify(icalcomponent* c,icalcomponent* match, - const char* user); - -icalcomponent* icalclassify_find_overlaps(icalset* set, icalcomponent* comp); - -#endif /* ICALCLASSIFY_H*/ - - - - - diff --git a/libical/src/libicalss/icalcomponent.h b/libical/src/libicalss/icalcomponent.h deleted file mode 100644 index 9e0e9f5a9f..0000000000 --- a/libical/src/libicalss/icalcomponent.h +++ /dev/null @@ -1,115 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalcomponent.h - CREATOR: eric 20 March 1999 - - - (C) COPYRIGHT 1999 Eric Busboom - http://www.softwarestudio.org - - The contents of this file are subject to the Mozilla Public License - Version 1.0 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and - limitations under the License. - - The original author is Eric Busboom - The original code is icalcomponent.h - -======================================================================*/ - -#ifndef ICALCOMPONENT_H -#define ICALCOMPONENT_H - -#include "icalproperty.h" -#include "icalvalue.h" -#include "icalenums.h" /* defines icalcomponent_kind */ - -typedef void icalcomponent; - -icalcomponent* icalcomponent_new(icalcomponent_kind kind); -icalcomponent* icalcomponent_new_clone(icalcomponent* component); -icalcomponent* icalcomponent_new_from_string(char* str); -icalcomponent* icalcomponent_vanew(icalcomponent_kind kind, ...); -void icalcomponent_free(icalcomponent* component); - -char* icalcomponent_as_ical_string(icalcomponent* component); - -int icalcomponent_is_valid(icalcomponent* component); - -icalcomponent_kind icalcomponent_isa(icalcomponent* component); - -int icalcomponent_isa_component (void* component); - -/* - * Working with properties - */ - -void icalcomponent_add_property(icalcomponent* component, - icalproperty* property); - -void icalcomponent_remove_property(icalcomponent* component, - icalproperty* property); - -int icalcomponent_count_properties(icalcomponent* component, - icalproperty_kind kind); - -/* Iterate through the properties */ -icalproperty* icalcomponent_get_current_property(icalcomponent* component); - -icalproperty* icalcomponent_get_first_property(icalcomponent* component, - icalproperty_kind kind); -icalproperty* icalcomponent_get_next_property(icalcomponent* component, - icalproperty_kind kind); - -/* Return a null-terminated array of icalproperties*/ - -icalproperty** icalcomponent_get_properties(icalcomponent* component, - icalproperty_kind kind); - - -/* - * Working with components - */ - - -void icalcomponent_add_component(icalcomponent* parent, - icalcomponent* child); - -void icalcomponent_remove_component(icalcomponent* parent, - icalcomponent* child); - -int icalcomponent_count_components(icalcomponent* component, - icalcomponent_kind kind); - -/* Iterate through components */ -icalcomponent* icalcomponent_get_current_component (icalcomponent* component); - -icalcomponent* icalcomponent_get_first_component(icalcomponent* component, - icalcomponent_kind kind); -icalcomponent* icalcomponent_get_next_component(icalcomponent* component, - icalcomponent_kind kind); - -/* Return a null-terminated array of icalproperties*/ -icalproperty** icalcomponent_get_component(icalcomponent* component, - icalproperty_kind kind); - -/* Working with embedded error properties */ - -int icalcomponent_count_errors(icalcomponent* component); -void icalcomponent_strip_errors(icalcomponent* component); - - -/* Internal operations. You don't see these... */ -icalcomponent* icalcomponent_get_parent(icalcomponent* component); -void icalcomponent_set_parent(icalcomponent* component, - icalcomponent* parent); - -#endif /* !ICALCOMPONENT_H */ - - - diff --git a/libical/src/libicalss/icalcsdb.h b/libical/src/libicalss/icalcsdb.h deleted file mode 100644 index 4619b94fd0..0000000000 --- a/libical/src/libicalss/icalcsdb.h +++ /dev/null @@ -1,67 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalcsdb.h Calendar Server Database - CREATOR: eric 23 December 1999 - - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - -======================================================================*/ - -#ifndef ICALCSDB_H -#define ICALCSDB_H - -#include "ical.h" - -typedef void icalcsdb; - -icalcsdb* icalcsdb_new(char* path); - -void icalcsdb_free(icalcsdb* csdb); - -icalerrorenum icalcsdb_create(icalcsdb* db, char* calid); - -icalerrorenum icalcsdb_delete(icalcsdb* db, char* calid); - -icalerrorenum icalcsdb_move(icalcsdb* db, char* oldcalid, char* newcalid); - -icalerrorenum icalcsdb_noop(icalcsdb* db); - -char* icalcsdb_generateuid(icalcsdb* db); - -icalcomponent* icalcsdb_expand_upn(icalcsdb* db, char* upn); -icalcomponent* icalcsdb_expand_calid(icalcsdb* db, char* calid); - -icalerrorenum icalcsbd_senddata(icalcsdb* db, icalcomponent* comp); - -icalset* icalcsdb_get_calendar(icalcsdb* db, char* calid, - icalcomponent *gauge); - -icalset* icalcsdb_get_vcars(icalcsdb* db); - -icalset* icalcsdb_get_properties(icalcsdb* db); - -icalset* icalcsdb_get_capabilities(icalcsdb* db); - -icalset* icalcsdb_get_timezones(icalcsdb* db); - - -#endif /* !ICALCSDB_H */ - - - diff --git a/libical/src/libicalss/icalcstp.c b/libical/src/libicalss/icalcstp.c deleted file mode 100644 index 3b212b424a..0000000000 --- a/libical/src/libicalss/icalcstp.c +++ /dev/null @@ -1,116 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: icalcstps.c - CREATOR: ebusboom 23 Jun 2000 - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - - ======================================================================*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "ical.h" -#include "icalcstp.h" -#include "pvl.h" - -#include <sys/types.h> /* For send(), others */ -#include <sys/socket.h> /* For send(), others. */ -#include <unistd.h> /* For alarm */ -#include <errno.h> -#include <stdlib.h> /* for malloc */ -#include <string.h> - - -struct command_map { - enum icalcstp_command command; - char *str; -} command_map[] = -{ - {ICAL_ABORT_COMMAND,"ABORT"}, - {ICAL_AUTHENTICATE_COMMAND,"AUTHENTICATE"}, - {ICAL_CAPABILITY_COMMAND,"CAPABILITY"}, - {ICAL_CONTINUE_COMMAND,"CONTINUE"}, - {ICAL_CALIDEXPAND_COMMAND,"CALIDEXPAND"}, - {ICAL_IDENTIFY_COMMAND,"IDENTIFY"}, - {ICAL_DISCONNECT_COMMAND,"DISCONNECT"}, - {ICAL_SENDDATA_COMMAND,"SENDDATA"}, - {ICAL_STARTTLS_COMMAND,"STARTTLS"}, - {ICAL_UPNEXPAND_COMMAND,"UPNEXPAND"}, - {ICAL_UNKNOWN_COMMAND,"UNKNOWN"} -}; - - -icalcstp_command icalcstp_line_command(char* line) -{ - int i; - - for(i = 0; command_map[i].command != ICAL_UNKNOWN_COMMAND; i++){ - size_t l = strlen(command_map[i].str); - - if(strncmp(line, command_map[i].str, l) == 0){ - return command_map[i].command; - } - - } - - return ICAL_UNKNOWN_COMMAND; -} - -icalrequeststatus icalcstp_line_response_code(char* line) -{ - struct icalreqstattype rs; - - rs = icalreqstattype_from_string(line); - - return rs.code; -} - -int icalcstp_line_is_endofdata(char* line) -{ - if(line[0] == '.' && line[1] == '\n'){ - return 1; - } - - return 0; - -} - -int icalcstp_line_is_mime(char* line) -{ -} - - -const char* icalcstp_command_to_string(icalcstp_command command){ - - int i; - - for(i = 0; command_map[i].command != ICAL_UNKNOWN_COMMAND; i++){ - size_t l = strlen(command_map[i].str); - - if(command_map[i].command == command){ - return command_map[i].str; - } - - } - - return command_map[i].str; - -} - diff --git a/libical/src/libicalss/icalcstp.h b/libical/src/libicalss/icalcstp.h deleted file mode 100644 index dfc361830e..0000000000 --- a/libical/src/libicalss/icalcstp.h +++ /dev/null @@ -1,79 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalcstp.h - CREATOR: eric 20 April 1999 - - $Id$ - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icalcstp.h - -======================================================================*/ - - -#ifndef ICALCSTP_H -#define ICALCSTP_H - -#include "ical.h" - - -/* Connection state, from the state machine in RFC2445 */ -enum cstps_state { - NO_STATE, - CONNECTED, - AUTHENTICATED, - IDENTIFIED, - DISCONNECTED, - RECEIVE -}; - -/* CSTP Commands that a client can issue to a server */ -typedef enum icalcstp_command { - ICAL_ABORT_COMMAND, - ICAL_AUTHENTICATE_COMMAND, - ICAL_CAPABILITY_COMMAND, - ICAL_CONTINUE_COMMAND, - ICAL_CALIDEXPAND_COMMAND, - ICAL_IDENTIFY_COMMAND, - ICAL_DISCONNECT_COMMAND, - ICAL_SENDDATA_COMMAND, - ICAL_STARTTLS_COMMAND, - ICAL_UPNEXPAND_COMMAND, - ICAL_COMPLETE_COMMAND, - ICAL_UNKNOWN_COMMAND -} icalcstp_command; - - - -/* A statement is a combination of command or response code and a - component that the server and client exchage with each other. */ -struct icalcstp_statement { - icalcstp_command command; - char* str_data; /* If non-NUll use as arguments to command */ - int int_data; /* If non-NULL use as arguments to command */ - - icalrequeststatus code; - - icalcomponent* data; -}; - -const char* icalcstp_command_to_string(icalcstp_command command); -icalcstp_command icalcstp_string_to_command(const char* str); - -#endif /* !ICALCSTP_H */ - - - diff --git a/libical/src/libicalss/icalcstpclient.c b/libical/src/libicalss/icalcstpclient.c deleted file mode 100644 index d53d53f568..0000000000 --- a/libical/src/libicalss/icalcstpclient.c +++ /dev/null @@ -1,343 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: icalcstps.c - CREATOR: ebusboom 23 Jun 2000 - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - - ======================================================================*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "ical.h" -#include "icalcstp.h" -#include "icalcstpclient.h" -#include "pvl.h" - -#include <sys/types.h> /* For send(), others */ -#include <sys/socket.h> /* For send(), others. */ -#include <unistd.h> /* For alarm */ -#include <errno.h> -#include <stdlib.h> /* for malloc */ -#include <string.h> - -#define EOL "\n" - - -/* Client state machine */ - -typedef enum icalcstpc_line_type { - ICALCSTPC_RESPONSE_CODE_LINE, - ICALCSTPC_TERMINATOR_LINE, - ICALCSTPC_APPLICATION_DATA_LINE -} icalcstpc_line_type; - -typedef enum icalcstpc_state { - ICALCSTPC_SEND_STATE, - ICALCSTPC_RESPONSE_CODE_STATE, - ICALCSTPC_RESPONSE_DATA_STATE -} icalcstpc_state; - - - -struct icalcstpc_impl { - int timeout; - icalparser *parser; - icalcstp_command command; - icalcstpc_state state; - char* next_output; - char* next_input; -}; - -icalcstpc* icalcstpc_new() -{ - struct icalcstpc_impl *impl; - - impl = malloc(sizeof(struct icalcstpc_impl)); - - if(impl == 0){ - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - memset(impl,0,sizeof(struct icalcstpc_impl)); - - return impl; -} - -void icalcstpc_free(icalcstpc* cstpc) -{ - struct icalcstpc_impl *impl = (struct icalcstpc_impl *)cstpc; - - if(impl->next_output != 0){ - free(impl->next_output); - } - - if(impl->next_input != 0){ - free(impl->next_input); - } - - - if(impl->parser != 0){ - icalparser_free(impl->parser); - } -} - -/* Get the next string to send to the server */ -char* icalcstpc_next_output(icalcstpc* cstp, char * line) -{ - char* out; - struct icalcstpc_impl *impl = (struct icalcstpc_impl *)cstp; - - if(impl->next_output == 0){ - return 0; - } - - out = impl->next_output; - - impl->next_output = 0; - - icalmemory_add_tmp_buffer(out); - - return out; -} - -/* process the next string sent by the server */ -int icalcstpc_next_input(icalcstpc* cstp, char* line) -{ - struct icalcstpc_impl *impl = (struct icalcstpc_impl *)cstp; - icalcstpc_line_type line_type; - - if(icalcstp_line_is_endofdata(line) || line == 0){ - return 0; - } - - switch (impl->command){ - case ICAL_ABORT_COMMAND:{ - break; - } - case ICAL_AUTHENTICATE_COMMAND:{ - break; - } - case ICAL_CAPABILITY_COMMAND:{ - break; - } - case ICAL_CONTINUE_COMMAND:{ - break; - } - case ICAL_CALIDEXPAND_COMMAND:{ - break; - } - case ICAL_IDENTIFY_COMMAND:{ - break; - } - case ICAL_DISCONNECT_COMMAND:{ - break; - } - case ICAL_SENDDATA_COMMAND:{ - break; - } - case ICAL_STARTTLS_COMMAND:{ - break; - } - case ICAL_UPNEXPAND_COMMAND:{ - break; - } - case ICAL_COMPLETE_COMMAND:{ - break; - } - case ICAL_UNKNOWN_COMMAND:{ - break; - } - default: - break; - } -} - -/* After icalcstpc_next_input returns a 0, there are responses - ready. use these to get them */ -icalcstpc_response icalcstpc_first_response(icalcstpc* cstp) -{ - struct icalcstpc_impl *impl = (struct icalcstpc_impl *)cstp; - -} - - -icalcstpc_response icalcstpc_next_response(icalcstpc* cstp) -{ - struct icalcstpc_impl *impl = (struct icalcstpc_impl *)cstp; -} - - -int icalcstpc_set_timeout(icalcstpc* cstp, int sec) -{ - struct icalcstpc_impl *impl = (struct icalcstpc_impl *)cstp; -} - -icalerrorenum icalcstpc_abort(icalcstpc* cstp) -{ - struct icalcstpc_impl* impl = (struct icalcstpc_impl*)cstp; - - icalerror_check_arg_re(cstp!=0,"cstp",ICAL_BADARG_ERROR); - - impl->next_output = "ABORT\n"; - - return ICAL_NO_ERROR; -} - -icalerrorenum icalcstpclient_setup_output(icalcstpc* cstp, size_t sz) -{ - struct icalcstpc_impl *impl = (struct icalcstpc_impl *)cstp; - - if(impl->next_output != 0){ - icalerror_set_errno(ICAL_USAGE_ERROR); - return ICAL_USAGE_ERROR; - } - - impl->next_output = malloc(sz); - - if(impl->next_output == 0){ - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return ICAL_NEWFAILED_ERROR; - } - - return ICAL_NO_ERROR; - -} - -icalerrorenum icalcstpc_authenticate(icalcstpc* cstp, char* mechanism, - char* data, char* f(char*)) -{ - struct icalcstpc_impl *impl = (struct icalcstpc_impl *)cstp; - char* command_str; - icalerrorenum error; - size_t sz; - - icalerror_check_arg_re(cstp!=0,"cstp",ICAL_BADARG_ERROR); - icalerror_check_arg_re(mechanism!=0,"mechanism",ICAL_BADARG_ERROR); - icalerror_check_arg_re(data!=0,"data",ICAL_BADARG_ERROR); - icalerror_check_arg_re(f!=0,"f",ICAL_BADARG_ERROR); - - impl->command = ICAL_AUTHENTICATE_COMMAND; - - command_str = icalcstp_command_to_string(impl->command); - - sz = strlen(command_str) + strlen(mechanism) + strlen(data) + 4; - - if((error=icalcstpclient_setup_output(cstp,sz)) != ICAL_NO_ERROR){ - return error; - } - - sprintf(impl->next_output,"%s %s %s%s",command_str,mechanism,data,EOL); - - return ICAL_NO_ERROR; -} - -icalerrorenum icalcstpc_capability(icalcstpc* cstp) -{ - struct icalcstpc_impl *impl = (struct icalcstpc_impl *)cstp; - char* command_str; - icalerrorenum error; - size_t sz; - - icalerror_check_arg_re(cstp!=0,"cstp",ICAL_BADARG_ERROR); - - impl->command = ICAL_CAPABILITY_COMMAND; - - command_str = icalcstp_command_to_string(impl->command); - - sz = strlen(command_str); - - if((error=icalcstpclient_setup_output(cstp,sz)) != ICAL_NO_ERROR){ - return error; - } - - return ICAL_NO_ERROR; -} - -icalerrorenum icalcstpc_calidexpand(icalcstpc* cstp,char* calid) -{ - struct icalcstpc_impl *impl = (struct icalcstpc_impl *)cstp; - - impl->command = ICAL_CALIDEXPAND_COMMAND; - return ICAL_NO_ERROR; -} - -icalerrorenum icalcstpc_continue(icalcstpc* cstp, unsigned int time) -{ - struct icalcstpc_impl *impl = (struct icalcstpc_impl *)cstp; - - impl->command = ICAL_CONTINUE_COMMAND; - return ICAL_NO_ERROR; -} - -icalerrorenum icalcstpc_disconnect(icalcstpc* cstp) -{ - struct icalcstpc_impl *impl = (struct icalcstpc_impl *)cstp; - - - impl->command = ICAL_DISCONNECT_COMMAND; - - return ICAL_NO_ERROR; -} - -icalerrorenum icalcstpc_identify(icalcstpc* cstp, char* id) -{ - struct icalcstpc_impl *impl = (struct icalcstpc_impl *)cstp; - - - impl->command = ICAL_IDENTIFY_COMMAND; - - return ICAL_NO_ERROR; -} - -icalerrorenum icalcstpc_starttls(icalcstpc* cstp, char* command, - char* data, char * f(char*)) -{ - struct icalcstpc_impl *impl = (struct icalcstpc_impl *)cstp; - - impl->command = ICAL_STARTTLS_COMMAND; - - return ICAL_NO_ERROR; -} - -icalerrorenum icalcstpc_upnexpand(icalcstpc* cstp,char* calid) -{ - struct icalcstpc_impl *impl = (struct icalcstpc_impl *)cstp; - - - impl->command = ICAL_UPNEXPAND_COMMAND; - - return ICAL_NO_ERROR; -} - -icalerrorenum icalcstpc_sendata(icalcstpc* cstp, unsigned int time, - icalcomponent *comp) -{ - struct icalcstpc_impl *impl = (struct icalcstpc_impl *)cstp; - - impl->command = ICAL_SENDDATA_COMMAND; - - return ICAL_NO_ERROR; -} - - - - diff --git a/libical/src/libicalss/icalcstpclient.h b/libical/src/libicalss/icalcstpclient.h deleted file mode 100644 index 8d9d0c904c..0000000000 --- a/libical/src/libicalss/icalcstpclient.h +++ /dev/null @@ -1,100 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalcstpclient.h - CREATOR: eric 4 Feb 01 - - $Id$ - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icalcstp.h - -======================================================================*/ - - -#ifndef ICALCSTPC_H -#define ICALCSTPC_H - -#include "ical.h" -#include "icalcstp.h" - -/********************** Client (Sender) Interfaces **************************/ - -/* How to use: - - 1) Construct a new icalcstpc - 2) Issue a command by calling one of the command routines. - 3) Repeat until both call icalcstpc_next_output and - icalcstpc_next_input return 0: - 3a) Call icalcstpc_next_output. Send string to server. - 3b) Get string from server, & give to icalcstp_next_input() - 4) Iterate with icalcstpc_first_response & icalcstp_next_response to - get the servers responses - 5) Repeat at #2 -*/ - - -typedef void icalcstpc; - -/* Response code sent by the server. */ -typedef struct icalcstpc_response { - icalrequeststatus code; - char *arg; /* These strings are owned by libical */ - char *debug_text; - char *more_text; - void* result; -} icalcstpc_response; - - -icalcstpc* icalcstpc_new(); - -void icalcstpc_free(icalcstpc* cstpc); - -int icalcstpc_set_timeout(icalcstpc* cstp, int sec); - - -/* Get the next string to send to the server */ -char* icalcstpc_next_output(icalcstpc* cstp, char* line); - -/* process the next string from the server */ -int icalcstpc_next_input(icalcstpc* cstp, char * line); - -/* After icalcstpc_next_input returns a 0, there are responses - ready. use these to get them */ -icalcstpc_response icalcstpc_first_response(icalcstpc* cstp); -icalcstpc_response icalcstpc_next_response(icalcstpc* cstp); - -/* Issue a command */ -icalerrorenum icalcstpc_abort(icalcstpc* cstp); -icalerrorenum icalcstpc_authenticate(icalcstpc* cstp, char* mechanism, - char* init_data, char* f(char*) ); -icalerrorenum icalcstpc_capability(icalcstpc* cstp); -icalerrorenum icalcstpc_calidexpand(icalcstpc* cstp,char* calid); -icalerrorenum icalcstpc_continue(icalcstpc* cstp, unsigned int time); -icalerrorenum icalcstpc_disconnect(icalcstpc* cstp); -icalerrorenum icalcstpc_identify(icalcstpc* cstp, char* id); -icalerrorenum icalcstpc_starttls(icalcstpc* cstp, char* command, - char* init_data, char* f(char*)); -icalerrorenum icalcstpc_senddata(icalcstpc* cstp, unsigned int time, - icalcomponent *comp); -icalerrorenum icalcstpc_upnexpand(icalcstpc* cstp,char* calid); -icalerrorenum icalcstpc_sendata(icalcstpc* cstp, unsigned int time, - icalcomponent *comp); - - -#endif /* !ICALCSTPC_H */ - - - diff --git a/libical/src/libicalss/icalcstpserver.c b/libical/src/libicalss/icalcstpserver.c deleted file mode 100644 index 1a6ed7b976..0000000000 --- a/libical/src/libicalss/icalcstpserver.c +++ /dev/null @@ -1,278 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: icalcstpserver.c - CREATOR: ebusboom 13 Feb 01 - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - - ======================================================================*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "ical.h" -#include "icalcstp.h" -#include "icalcstpserver.h" -#include "pvl.h" - -#include <sys/types.h> /* For send(), others */ -#include <sys/socket.h> /* For send(), others. */ -#include <unistd.h> /* For alarm */ -#include <errno.h> -#include <stdlib.h> /* for malloc */ -#include <string.h> - - - -struct icalcstps_impl { - int timeout; - icalparser *parser; - enum cstps_state major_state; - struct icalcstps_commandfp commandfp; -}; - - - - -/* This state machine is a Mealy-type: actions occur on the - transitions, not in the states. - - Here is the state machine diagram from the CAP draft: - - - STARTTLS / - CAPABILITY - +-------+ - | | +---------------+ - | +-----------+ AUTHENTICATE | | - +-->| Connected |-------------->| Authenticated | - +-----------+ | | - | +---------------+ - | | - | | - | | - | | +-----+ STARTTLS / - | V | | CAPABILITY / - | +---------------+ | IDENTIFY - | | |<-+ - | | Identified |<----+ - | +--------| | | - | | +---------------+ | command - | | | | completes - V |DISCONNECT | | - +--------------+ | |SENDDATA | - | Disconnected |<--+ | | - +--------------+ | | ABORT - A | | - | V | - | DISCONNECT +---------------+ | - +--------------------| Receive |--+ - | |<--+ - +---------------+ | - | | CONTINUTE - +----+ - - In this implmenetation, the transition from CONNECTED to IDENTIFIED - is non-standard. The spec specifies that on the ATHENTICATE - command, the machine transitions from CONNECTED to AUTHENTICATED, - and then immediately goes to IDENTIFIED. This makes AUTHENTICATED a - useless state, so I removed it */ - -struct state_table { - enum cstps_state major_state; - enum icalcstp_command command; - void (*action)(); - enum cstps_state next_state; - -} server_state_table[] = -{ - { CONNECTED, ICAL_CAPABILITY_COMMAND , 0, CONNECTED}, - { CONNECTED, ICAL_AUTHENTICATE_COMMAND , 0, IDENTIFIED}, /* Non-standard */ - { IDENTIFIED, ICAL_STARTTLS_COMMAND, 0, IDENTIFIED}, - { IDENTIFIED, ICAL_IDENTIFY_COMMAND, 0, IDENTIFIED}, - { IDENTIFIED, ICAL_CAPABILITY_COMMAND, 0, IDENTIFIED}, - { IDENTIFIED, ICAL_SENDDATA_COMMAND, 0, RECEIVE}, - { IDENTIFIED, ICAL_DISCONNECT_COMMAND, 0, DISCONNECTED}, - { DISCONNECTED, 0, 0, 0}, - { RECEIVE, ICAL_DISCONNECT_COMMAND, 0, DISCONNECTED}, - { RECEIVE, ICAL_CONTINUE_COMMAND, 0, RECEIVE}, - { RECEIVE, ICAL_ABORT_COMMAND , 0, IDENTIFIED}, - { RECEIVE, ICAL_COMPLETE_COMMAND , 0, IDENTIFIED} -}; - - -/**********************************************************************/ - - - -icalcstps* icalcstps_new(struct icalcstps_commandfp cfp) -{ - struct icalcstps_impl* impl; - - if ( ( impl = (struct icalcstps_impl*) - malloc(sizeof(struct icalcstps_impl))) == 0) { - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - impl->commandfp = cfp; - impl->timeout = 10; - - return (icalcstps*)impl; - -} - -void icalcstps_free(icalcstps* cstp); - -int icalcstps_set_timeout(icalcstps* cstp, int sec) -{ - struct icalcstps_impl *impl = (struct icalcstps_impl *) cstp; - - icalerror_check_arg_rz( (cstp!=0), "cstp"); - - impl->timeout = sec; - - return sec; -} - -typedef struct icalcstps_response { - icalrequeststatus code; - char caluid[1024]; - void* result; -} icalcstps_response; - - -icalerrorenum prep_abort(struct icalcstps_impl* impl, char* data) -{ - return ICAL_NO_ERROR; -} -icalerrorenum prep_authenticate(struct icalcstps_impl* impl, char* data) -{ return ICAL_NO_ERROR; -} -icalerrorenum prep_capability(struct icalcstps_impl* impl, char* data) -{ return ICAL_NO_ERROR; -} -icalerrorenum prep_calidexpand(struct icalcstps_impl* impl, char* data) -{ - return ICAL_NO_ERROR; -} -icalerrorenum prep_continue(struct icalcstps_impl* impl, char* data) -{ - return ICAL_NO_ERROR; -} -icalerrorenum prep_disconnect(struct icalcstps_impl* impl, char* data) -{ - return ICAL_NO_ERROR; -} -icalerrorenum prep_identify(struct icalcstps_impl* impl, char* data) -{ - return ICAL_NO_ERROR; -} -icalerrorenum prep_starttls(struct icalcstps_impl* impl, char* data) -{ - return ICAL_NO_ERROR; -} -icalerrorenum prep_upnexpand(struct icalcstps_impl* impl, char* data) -{ - return ICAL_NO_ERROR; -} -icalerrorenum prep_sendata(struct icalcstps_impl* impl, char* data) -{ return ICAL_NO_ERROR; -} - -char* icalcstps_process_incoming(icalcstps* cstp, char* input) -{ - struct icalcstps_impl *impl = (struct icalcstps_impl *) cstp; - char *i; - char *cmd_or_resp; - char *data; - char *input_cpy; - icalerrorenum error; - - icalerror_check_arg_rz(cstp !=0,"cstp"); - icalerror_check_arg_rz(input !=0,"input"); - - if ((input_cpy = (char*)strdup(input)) == 0){ - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - i = (char*)strstr(" ",input_cpy); - - cmd_or_resp = input_cpy; - - if (i != 0){ - *i = '\0'; - data = ++i; - } else { - data = 0; - } - - printf("cmd: %s\n",cmd_or_resp); - printf("data: %s\n",data); - - /* extract the command, look up in the state table, and dispatch - to the proper handler */ - - if(strcmp(cmd_or_resp,"ABORT") == 0){ - error = prep_abort(impl,data); - } else if(strcmp(cmd_or_resp,"AUTHENTICATE") == 0){ - error = prep_authenticate(impl,data); - } else if(strcmp(cmd_or_resp,"CAPABILITY") == 0){ - error = prep_capability(impl,data); - } else if(strcmp(cmd_or_resp,"CALIDEXPAND") == 0){ - error = prep_calidexpand(impl,data); - } else if(strcmp(cmd_or_resp,"CONTINUE") == 0){ - error = prep_continue(impl,data); - } else if(strcmp(cmd_or_resp,"DISCONNECT") == 0){ - error = prep_disconnect(impl,data); - } else if(strcmp(cmd_or_resp,"IDENTIFY") == 0){ - error = prep_identify(impl,data); - } else if(strcmp(cmd_or_resp,"STARTTLS") == 0){ - error = prep_starttls(impl,data); - } else if(strcmp(cmd_or_resp,"UPNEXPAND") == 0){ - error = prep_upnexpand(impl,data); - } else if(strcmp(cmd_or_resp,"SENDDATA") == 0){ - error = prep_sendata(impl,data); - } - - return 0; -} - - /* Read data until we get a end of data marker */ - - - -struct icalcstps_server_stubs { - icalerrorenum (*abort)(icalcstps* cstp); - icalerrorenum (*authenticate)(icalcstps* cstp, char* mechanism, - char* data); - icalerrorenum (*calidexpand)(icalcstps* cstp, char* calid); - icalerrorenum (*capability)(icalcstps* cstp); - icalerrorenum (*cont)(icalcstps* cstp, unsigned int time); - icalerrorenum (*identify)(icalcstps* cstp, char* id); - icalerrorenum (*disconnect)(icalcstps* cstp); - icalerrorenum (*sendata)(icalcstps* cstp, unsigned int time, - icalcomponent *comp); - icalerrorenum (*starttls)(icalcstps* cstp, char* command, - char* data); - icalerrorenum (*upnexpand)(icalcstps* cstp, char* upn); - icalerrorenum (*unknown)(icalcstps* cstp, char* command, char* data); -}; - diff --git a/libical/src/libicalss/icalcstpserver.h b/libical/src/libicalss/icalcstpserver.h deleted file mode 100644 index 6fa2254b2e..0000000000 --- a/libical/src/libicalss/icalcstpserver.h +++ /dev/null @@ -1,101 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalcstpserver.h - CREATOR: eric 13 Feb 01 - - $Id$ - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icalcstp.h - -======================================================================*/ - - -#ifndef ICALCSTPS_H -#define ICALCSTPS_H - -#include "ical.h" - - -/********************** Server (Reciever) Interfaces *************************/ - -/* On the server side, the caller will recieve data from the incoming - socket and pass it to icalcstps_next_input. The caller then takes - the return from icalcstps_next_outpu and sends it out through the - socket. This gives the caller a point of control. If the cstp code - connected to the socket itself, it would be hard for the caller to - do anything else after the cstp code was started. - - All of the server and client command routines will generate - response codes. On the server side, these responses will be turned - into text and sent to the client. On the client side, the reponse - is the one sent from the server. - - Since each command can return multiple responses, the responses are - stored in the icalcstps object and are accesses by - icalcstps_first_response() and icalcstps_next_response() - - How to use: - - 1) Construct a new icalcstps, bound to your code via stubs - 2) Repeat forever: - 2a) Get string from client & give to icalcstps_next_input() - 2b) Repeat until icalcstp_next_output returns 0: - 2b1) Call icalcstps_next_output. - 2b2) Send string to client. -*/ - - - -typedef void icalcstps; - -/* Pointers to the rountines that - icalcstps_process_incoming will call when it recognizes a CSTP - command in the data. BTW, the CONTINUE command is named 'cont' - because 'continue' is a C keyword */ - -struct icalcstps_commandfp { - icalerrorenum (*abort)(icalcstps* cstp); - icalerrorenum (*authenticate)(icalcstps* cstp, char* mechanism, - char* data); - icalerrorenum (*calidexpand)(icalcstps* cstp, char* calid); - icalerrorenum (*capability)(icalcstps* cstp); - icalerrorenum (*cont)(icalcstps* cstp, unsigned int time); - icalerrorenum (*identify)(icalcstps* cstp, char* id); - icalerrorenum (*disconnect)(icalcstps* cstp); - icalerrorenum (*sendata)(icalcstps* cstp, unsigned int time, - icalcomponent *comp); - icalerrorenum (*starttls)(icalcstps* cstp, char* command, - char* data); - icalerrorenum (*upnexpand)(icalcstps* cstp, char* upn); - icalerrorenum (*unknown)(icalcstps* cstp, char* command, char* data); -}; - - - -icalcstps* icalcstps_new(struct icalcstps_commandfp stubs); - -void icalcstps_free(icalcstps* cstp); - -int icalcstps_set_timeout(icalcstps* cstp, int sec); - -/* Get the next string to send to the client */ -char* icalcstps_next_output(icalcstps* cstp); - -/* process the next string from the client */ -int icalcstps_next_input(icalcstps* cstp); - -#endif /* ICALCSTPS */ diff --git a/libical/src/libicalss/icaldirset.c b/libical/src/libicalss/icaldirset.c deleted file mode 100644 index 3a7b9cfdd9..0000000000 --- a/libical/src/libicalss/icaldirset.c +++ /dev/null @@ -1,753 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: icaldirset.c - CREATOR: eric 28 November 1999 - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The Original Code is eric. The Initial Developer of the Original - Code is Eric Busboom - - - ======================================================================*/ - - -/* - - icaldirset manages a database of ical components and offers - interfaces for reading, writting and searching for components. - - icaldirset groups components in to clusters based on their DTSTAMP - time -- all components that start in the same month are grouped - together in a single file. All files in a sotre are kept in a single - directory. - - The primary interfaces are icaldirset_first and icaldirset_next. These - routine iterate through all of the components in the store, subject - to the current gauge. A gauge is an icalcomponent that is tested - against other componets for a match. If a gauge has been set with - icaldirset_select, icaldirset_first and icaldirset_next will only - return componentes that match the gauge. - - The Store generated UIDs for all objects that are stored if they do - not already have a UID. The UID is the name of the cluster (month & - year as MMYYYY) plus a unique serial number. The serial number is - stored as a property of the cluster. - -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - - -#include "ical.h" -#include "icaldirset.h" -#include "pvl.h" -#include "icalerror.h" -#include "icalparser.h" -#include "icaldirset.h" -#include "icalfileset.h" -#include "icalfilesetimpl.h" -#include "icalgauge.h" - -#include <limits.h> /* For PATH_MAX */ -#include <dirent.h> /* for opendir() */ -#include <errno.h> -#include <sys/types.h> /* for opendir() */ -#include <sys/stat.h> /* for stat */ -#include <unistd.h> /* for stat, getpid */ -#include <time.h> /* for clock() */ -#include <stdlib.h> /* for rand(), srand() */ -#include <sys/utsname.h> /* for uname */ -#include <string.h> /* for strdup */ -#include "icaldirsetimpl.h" - - -struct icaldirset_impl* icaldirset_new_impl() -{ - struct icaldirset_impl* impl; - - if ( ( impl = (struct icaldirset_impl*) - malloc(sizeof(struct icaldirset_impl))) == 0) { - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - strcpy(impl->id,ICALDIRSET_ID); - - return impl; -} - -const char* icaldirset_path(icaldirset* cluster) -{ - struct icaldirset_impl *impl = icaldirset_new_impl(); - - return impl->dir; - -} - -void icaldirset_mark(icaldirset* store) -{ - struct icaldirset_impl *impl = (struct icaldirset_impl*)store; - - icalfileset_mark(impl->cluster); -} - - -icalerrorenum icaldirset_commit(icaldirset* store) -{ - struct icaldirset_impl *impl = (struct icaldirset_impl*)store; - - return icalfileset_commit(impl->cluster); - -} - -void icaldirset_lock(const char* dir) -{ -} - - -void icaldirset_unlock(const char* dir) -{ -} - -/* Load the contents of the store directory into the store's internal directory list*/ -icalerrorenum icaldirset_read_directory(struct icaldirset_impl* impl) -{ - struct dirent *de; - DIR* dp; - char *str; - - dp = opendir(impl->dir); - - if ( dp == 0) { - icalerror_set_errno(ICAL_FILE_ERROR); - return ICAL_FILE_ERROR; - } - - /* clear contents of directory list */ - while((str = pvl_pop(impl->directory))){ - free(str); - } - - /* load all of the cluster names in the directory list */ - for(de = readdir(dp); - de != 0; - de = readdir(dp)){ - - /* Remove known directory names '.' and '..'*/ - if (strcmp(de->d_name,".") == 0 || - strcmp(de->d_name,"..") == 0 ){ - continue; - } - - pvl_push(impl->directory, (void*)strdup(de->d_name)); - } - - closedir(dp); - - return ICAL_NO_ERROR; -} - -icaldirset* icaldirset_new(const char* dir) -{ - struct icaldirset_impl *impl = icaldirset_new_impl(); - struct stat sbuf; - - if (impl == 0){ - return 0; - } - - icalerror_check_arg_rz( (dir!=0), "dir"); - - if (stat(dir,&sbuf) != 0){ - icalerror_set_errno(ICAL_FILE_ERROR); - return 0; - } - - /* dir is not the name of a direectory*/ - if (!S_ISDIR(sbuf.st_mode)){ - icalerror_set_errno(ICAL_USAGE_ERROR); - return 0; - } - - icaldirset_lock(dir); - - impl = icaldirset_new_impl(); - - if (impl ==0){ - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - impl->directory = pvl_newlist(); - impl->directory_iterator = 0; - impl->dir = (char*)strdup(dir); - impl->gauge = 0; - impl->first_component = 0; - impl->cluster = 0; - - icaldirset_read_directory(impl); - - return (icaldirset*) impl; -} - -void icaldirset_free(icaldirset* s) -{ - struct icaldirset_impl *impl = (struct icaldirset_impl*)s; - char* str; - - icaldirset_unlock(impl->dir); - - if(impl->dir !=0){ - free(impl->dir); - } - - if(impl->gauge !=0){ - icalcomponent_free(impl->gauge); - } - - if(impl->cluster !=0){ - icalfileset_free(impl->cluster); - } - - while(impl->directory !=0 && (str=pvl_pop(impl->directory)) != 0){ - free(str); - } - - if(impl->directory != 0){ - pvl_free(impl->directory); - } - - impl->directory = 0; - impl->directory_iterator = 0; - impl->dir = 0; - impl->gauge = 0; - impl->first_component = 0; - - free(impl); - -} - -/* icaldirset_next_uid_number updates a serial number in the Store - directory in a file called SEQUENCE */ - -int icaldirset_next_uid_number(icaldirset* store) -{ - struct icaldirset_impl *impl = (struct icaldirset_impl*)store; - char sequence = 0; - char temp[128]; - char filename[ICAL_PATH_MAX]; - char *r; - FILE *f; - struct stat sbuf; - - icalerror_check_arg_rz( (store!=0), "store"); - - sprintf(filename,"%s/%s",impl->dir,"SEQUENCE"); - - /* Create the file if it does not exist.*/ - if (stat(filename,&sbuf) == -1 || !S_ISREG(sbuf.st_mode)){ - - f = fopen(filename,"w"); - if (f != 0){ - fprintf(f,"0"); - fclose(f); - } else { - icalerror_warn("Can't create SEQUENCE file in icaldirset_next_uid_number"); - return 0; - } - - } - - if ( (f = fopen(filename,"r+")) != 0){ - - rewind(f); - r = fgets(temp,128,f); - - if (r == 0){ - sequence = 1; - } else { - sequence = atoi(temp)+1; - } - - rewind(f); - - fprintf(f,"%d",sequence); - - fclose(f); - - return sequence; - - } else { - icalerror_warn("Can't create SEQUENCE file in icaldirset_next_uid_number"); - return 0; - } - -} - -icalerrorenum icaldirset_next_cluster(icaldirset* store) -{ - struct icaldirset_impl *impl = (struct icaldirset_impl*)store; - char path[ICAL_PATH_MAX]; - - if (impl->directory_iterator == 0){ - icalerror_set_errno(ICAL_INTERNAL_ERROR); - return ICAL_INTERNAL_ERROR; - } - impl->directory_iterator = pvl_next(impl->directory_iterator); - - if (impl->directory_iterator == 0){ - /* There are no more clusters */ - if(impl->cluster != 0){ - icalfileset_free(impl->cluster); - impl->cluster = 0; - } - return ICAL_NO_ERROR; - } - - sprintf(path,"%s/%s",impl->dir,(char*)pvl_data(impl->directory_iterator)); - - icalfileset_free(impl->cluster); - - impl->cluster = icalfileset_new(path); - - return icalerrno; -} - -void icaldirset_add_uid(icaldirset* store, icaldirset* comp) -{ - char uidstring[ICAL_PATH_MAX]; - icalproperty *uid; - struct utsname unamebuf; - - icalerror_check_arg_rv( (store!=0), "store"); - icalerror_check_arg_rv( (comp!=0), "comp"); - - uid = icalcomponent_get_first_property(comp,ICAL_UID_PROPERTY); - - if (uid == 0) { - - uname(&unamebuf); - - sprintf(uidstring,"%d-%s",(int)getpid(),unamebuf.nodename); - - uid = icalproperty_new_uid(uidstring); - icalcomponent_add_property(comp,uid); - } else { - - strcpy(uidstring,icalproperty_get_uid(uid)); - } -} - - -/* This assumes that the top level component is a VCALENDAR, and there - is an inner component of type VEVENT, VTODO or VJOURNAL. The inner - component must have a DTAMP property */ - -icalerrorenum icaldirset_add_component(icaldirset* store, icaldirset* comp) -{ - struct icaldirset_impl *impl; - char clustername[ICAL_PATH_MAX]; - icalproperty *dt; - icalvalue *v; - struct icaltimetype tm; - icalerrorenum error = ICAL_NO_ERROR; - icalcomponent *inner; - - impl = (struct icaldirset_impl*)store; - icalerror_check_arg_rz( (store!=0), "store"); - icalerror_check_arg_rz( (comp!=0), "comp"); - - errno = 0; - - icaldirset_add_uid(store,comp); - - /* Determine which cluster this object belongs in. This is a HACK */ - - for(inner = icalcomponent_get_first_component(comp,ICAL_ANY_COMPONENT); - inner != 0; - inner = icalcomponent_get_next_component(comp,ICAL_ANY_COMPONENT)){ - - dt = icalcomponent_get_first_property(inner,ICAL_DTSTAMP_PROPERTY); - - if (dt != 0){ - break; - } - } - - if (dt == 0){ - - for(inner = icalcomponent_get_first_component(comp,ICAL_ANY_COMPONENT); - inner != 0; - inner = icalcomponent_get_next_component(comp,ICAL_ANY_COMPONENT)){ - - dt = icalcomponent_get_first_property(inner,ICAL_DTSTART_PROPERTY); - - if (dt != 0){ - break; - } - } - - } - - if (dt == 0){ - - - icalerror_warn("The component does not have a DTSTAMP or DTSTART property, so it cannot be added to the store"); - icalerror_set_errno(ICAL_BADARG_ERROR); - return ICAL_BADARG_ERROR; - } - - v = icalproperty_get_value(dt); - - tm = icalvalue_get_datetime(v); - - snprintf(clustername,ICAL_PATH_MAX,"%s/%04d%02d",impl->dir,tm.year,tm.month); - - /* Load the cluster and insert the object */ - - if(impl->cluster != 0 && - strcmp(clustername,icalfileset_path(impl->cluster)) != 0 ){ - icalfileset_free(impl->cluster); - impl->cluster = 0; - } - - if (impl->cluster == 0){ - impl->cluster = icalfileset_new(clustername); - - if (impl->cluster == 0){ - error = icalerrno; - } - } - - if (error != ICAL_NO_ERROR){ - icalerror_set_errno(error); - return error; - } - - /* Add the component to the cluster */ - - icalfileset_add_component(impl->cluster,comp); - - icalfileset_mark(impl->cluster); - - return ICAL_NO_ERROR; -} - -/* Remove a component in the current cluster. HACK. This routine is a - "friend" of icalfileset, and breaks its encapsulation. It was - either do it this way, or add several layers of interfaces that had - no other use. */ -icalerrorenum icaldirset_remove_component(icaldirset* store, icaldirset* comp) -{ - struct icaldirset_impl *impl = (struct icaldirset_impl*)store; - - struct icalfileset_impl *filesetimpl = - (struct icalfileset_impl*)impl->cluster; - - icalcomponent *filecomp = filesetimpl->cluster; - - icalcompiter i; - int found = 0; - - icalerror_check_arg_re((store!=0),"store",ICAL_BADARG_ERROR); - icalerror_check_arg_re((comp!=0),"comp",ICAL_BADARG_ERROR); - icalerror_check_arg_re((impl->cluster!=0),"Cluster pointer",ICAL_USAGE_ERROR); - - for(i = icalcomponent_begin_component(filecomp,ICAL_ANY_COMPONENT); - icalcompiter_deref(&i)!= 0; icalcompiter_next(&i)){ - - icalcomponent *this = icalcompiter_deref(&i); - - if (this == comp){ - found = 1; - break; - } - } - - if (found != 1){ - icalerror_warn("icaldirset_remove_component: component is not part of current cluster"); - icalerror_set_errno(ICAL_USAGE_ERROR); - return ICAL_USAGE_ERROR; - } - - icalfileset_remove_component(impl->cluster,comp); - - icalfileset_mark(impl->cluster); - - /* If the removal emptied the fileset, get the next fileset */ - if( icalfileset_count_components(impl->cluster,ICAL_ANY_COMPONENT)==0){ - - icalerrorenum error = icaldirset_next_cluster(store); - - if(impl->cluster != 0 && error == ICAL_NO_ERROR){ - icalfileset_get_first_component(impl->cluster); - } else { - /* HACK. Not strictly correct for impl->cluster==0 */ - return error; - } - } else { - /* Do nothing */ - } - - return ICAL_NO_ERROR; -} - - - -int icaldirset_count_components(icaldirset* store, - icalcomponent_kind kind) -{ - /* HACK, not implemented */ - - assert(0); - - return 0; -} - - -icalcomponent* icaldirset_fetch_match(icaldirset* set, icalcomponent *c) -{ - fprintf(stderr," icaldirset_fetch_match is not implemented\n"); - assert(0); -} - - -icalcomponent* icaldirset_fetch(icaldirset* store, const char* uid) -{ - icalcomponent *gauge; - icalcomponent *old_gauge; - icalcomponent *c; - struct icaldirset_impl *impl = (struct icaldirset_impl*)store; - - icalerror_check_arg_rz( (store!=0), "store"); - icalerror_check_arg_rz( (uid!=0), "uid"); - - gauge = - icalcomponent_vanew( - ICAL_VCALENDAR_COMPONENT, - icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_vanew_uid( - uid, - icalparameter_new_xliccomparetype( - ICAL_XLICCOMPARETYPE_EQUAL), - 0), - 0), - 0); - - old_gauge = impl->gauge; - impl->gauge = gauge; - - c= icaldirset_get_first_component(store); - - impl->gauge = old_gauge; - - icalcomponent_free(gauge); - - return c; -} - - -int icaldirset_has_uid(icaldirset* store, const char* uid) -{ - icalcomponent *c; - - icalerror_check_arg_rz( (store!=0), "store"); - icalerror_check_arg_rz( (uid!=0), "uid"); - - /* HACK. This is a temporary implementation. _has_uid should use a - database, and _fetch should use _has_uid, not the other way - around */ - c = icaldirset_fetch(store,uid); - - return c!=0; - -} - - -icalerrorenum icaldirset_select(icaldirset* store, icalcomponent* gauge) - { - struct icaldirset_impl *impl = (struct icaldirset_impl*)store; - - icalerror_check_arg_re( (store!=0), "store",ICAL_BADARG_ERROR); - icalerror_check_arg_re( (gauge!=0), "gauge",ICAL_BADARG_ERROR); - - if (!icalcomponent_is_valid(gauge)){ - return ICAL_BADARG_ERROR; - } - - impl->gauge = gauge; - - return ICAL_NO_ERROR; -} - - -icalerrorenum icaldirset_modify(icaldirset* store, icalcomponent *old, - icalcomponent *new) -{ - assert(0); - return ICAL_NO_ERROR; /* HACK, not implemented */ - -} - - -void icaldirset_clear(icaldirset* store) -{ - - assert(0); - return; - /* HACK, not implemented */ -} - -icalcomponent* icaldirset_get_current_component(icaldirset* store) -{ - struct icaldirset_impl *impl = (struct icaldirset_impl*)store; - - if(impl->cluster == 0){ - icaldirset_get_first_component(store); - } - - return icalfileset_get_current_component(impl->cluster); - -} - - -icalcomponent* icaldirset_get_first_component(icaldirset* store) -{ - struct icaldirset_impl *impl = (struct icaldirset_impl*)store; - icalerrorenum error; - char path[ICAL_PATH_MAX]; - - error = icaldirset_read_directory(impl); - - if (error != ICAL_NO_ERROR){ - icalerror_set_errno(error); - return 0; - } - - impl->directory_iterator = pvl_head(impl->directory); - - if (impl->directory_iterator == 0){ - icalerror_set_errno(error); - return 0; - } - - snprintf(path,ICAL_PATH_MAX,"%s/%s",impl->dir,(char*)pvl_data(impl->directory_iterator)); - - /* If the next cluster we need is different than the current cluster, - delete the current one and get a new one */ - - if(impl->cluster != 0 && strcmp(path,icalfileset_path(impl->cluster)) != 0 ){ - icalfileset_free(impl->cluster); - impl->cluster = 0; - } - - if (impl->cluster == 0){ - impl->cluster = icalfileset_new(path); - - if (impl->cluster == 0){ - error = icalerrno; - } - } - - if (error != ICAL_NO_ERROR){ - icalerror_set_errno(error); - return 0; - } - - impl->first_component = 1; - - return icaldirset_get_next_component(store); -} - -icalcomponent* icaldirset_get_next_component(icaldirset* store) -{ - struct icaldirset_impl *impl; - icalcomponent *c; - icalerrorenum error; - - icalerror_check_arg_rz( (store!=0), "store"); - - impl = (struct icaldirset_impl*)store; - - if(impl->cluster == 0){ - - icalerror_warn("icaldirset_get_next_component called with a NULL cluster (Caller must call icaldirset_get_first_component first"); - icalerror_set_errno(ICAL_USAGE_ERROR); - return 0; - - } - - /* Set the component iterator for the following for loop */ - if (impl->first_component == 1){ - icalfileset_get_first_component(impl->cluster); - impl->first_component = 0; - } else { - icalfileset_get_next_component(impl->cluster); - } - - - while(1){ - /* Iterate through all of the objects in the cluster*/ - for( c = icalfileset_get_current_component(impl->cluster); - c != 0; - c = icalfileset_get_next_component(impl->cluster)){ - - /* If there is a gauge defined and the component does not - pass the gauge, skip the rest of the loop */ - -#if 0 /* HACK */ - if (impl->gauge != 0 && icalgauge_test(c,impl->gauge) == 0){ - continue; - } -#else - assert(0); /* icalgauge_test needs to be fixed */ -#endif - /* Either there is no gauge, or the component passed the - gauge, so return it*/ - - return c; - } - - /* Fell through the loop, so the component we want is not - in this cluster. Load a new cluster and try again.*/ - - error = icaldirset_next_cluster(store); - - if(impl->cluster == 0 || error != ICAL_NO_ERROR){ - /* No more clusters */ - return 0; - } else { - c = icalfileset_get_first_component(impl->cluster); - - return c; - } - - } - - return 0; /* Should never get here */ -} - - - - - - - diff --git a/libical/src/libicalss/icaldirset.h b/libical/src/libicalss/icaldirset.h deleted file mode 100644 index 7d205ecf0a..0000000000 --- a/libical/src/libicalss/icaldirset.h +++ /dev/null @@ -1,82 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icaldirset.h - CREATOR: eric 28 November 1999 - - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The Original Code is eric. The Initial Developer of the Original - Code is Eric Busboom - - -======================================================================*/ - -#ifndef ICALDIRSET_H -#define ICALDIRSET_H - -#include "ical.h" - -/* icaldirset Routines for storing, fetching, and searching for ical - * objects in a database */ - -typedef void icaldirset; - - -icaldirset* icaldirset_new(const char* path); - -void icaldirset_free(icaldirset* store); - -const char* icaldirset_path(icaldirset* store); - -/* Mark the cluster as changed, so it will be written to disk when it - is freed. Commit writes to disk immediately*/ -void icaldirset_mark(icaldirset* store); -icalerrorenum icaldirset_commit(icaldirset* store); - -icalerrorenum icaldirset_add_component(icaldirset* store, icalcomponent* comp); -icalerrorenum icaldirset_remove_component(icaldirset* store, icalcomponent* comp); - -int icaldirset_count_components(icaldirset* store, - icalcomponent_kind kind); - -/* Restrict the component returned by icaldirset_first, _next to those - that pass the gauge. _clear removes the gauge. */ -icalerrorenum icaldirset_select(icaldirset* store, icalcomponent* gauge); -void icaldirset_clear(icaldirset* store); - -/* Get a component by uid */ -icalcomponent* icaldirset_fetch(icaldirset* store, const char* uid); -int icaldirset_has_uid(icaldirset* store, const char* uid); -icalcomponent* icaldirset_fetch_match(icaldirset* set, icalcomponent *c); - -/* Modify components according to the MODIFY method of CAP. Works on - the currently selected components. */ -icalerrorenum icaldirset_modify(icaldirset* store, icalcomponent *oldc, - icalcomponent *newc); - -/* Iterate through the components. If a guage has been defined, these - will skip over components that do not pass the gauge */ - -icalcomponent* icaldirset_get_current_component(icaldirset* store); -icalcomponent* icaldirset_get_first_component(icaldirset* store); -icalcomponent* icaldirset_get_next_component(icaldirset* store); - -#endif /* !ICALDIRSET_H */ - - - diff --git a/libical/src/libicalss/icaldirsetimpl.h b/libical/src/libicalss/icaldirsetimpl.h deleted file mode 100644 index 0e69ba2f2e..0000000000 --- a/libical/src/libicalss/icaldirsetimpl.h +++ /dev/null @@ -1,47 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: icaldirsetimpl.h - CREATOR: eric 21 Aug 2000 - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The Original Code is eric. The Initial Developer of the Original - Code is Eric Busboom - - - ======================================================================*/ - - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -/* This definition is in its own file so it can be kept out of the - main header file, but used by "friend classes" like icalset*/ - -#define ICALDIRSET_ID "dset" - -struct icaldirset_impl -{ - char id[5]; /* "dset" */ - char* dir; - icalcomponent* gauge; - icaldirset* cluster; - int first_component; - pvl_list directory; - pvl_elem directory_iterator; -}; diff --git a/libical/src/libicalss/icalfileset.c b/libical/src/libicalss/icalfileset.c deleted file mode 100644 index b6e3430f7d..0000000000 --- a/libical/src/libicalss/icalfileset.c +++ /dev/null @@ -1,637 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: icalfileset.c - CREATOR: eric 23 December 1999 - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The Original Code is eric. The Initial Developer of the Original - Code is Eric Busboom - - - ======================================================================*/ - - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "icalfileset.h" -#include "icalgauge.h" -#include <errno.h> -#include <sys/stat.h> /* for stat */ -#include <unistd.h> /* for stat, getpid */ -#include <stdlib.h> -#include <string.h> -#include <fcntl.h> /* for fcntl */ -#include <unistd.h> /* for fcntl */ -#include "icalfilesetimpl.h" - -extern int errno; - -int icalfileset_lock(icalfileset *cluster); -int icalfileset_unlock(icalfileset *cluster); -icalerrorenum icalfileset_read_file(icalfileset* cluster, mode_t mode); -int icalfileset_filesize(icalfileset* cluster); - -icalerrorenum icalfileset_create_cluster(const char *path); - -icalfileset* icalfileset_new_impl() -{ - struct icalfileset_impl* impl; - - if ( ( impl = (struct icalfileset_impl*) - malloc(sizeof(struct icalfileset_impl))) == 0) { - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - errno = ENOMEM; - return 0; - } - - memset(impl,0,sizeof(struct icalfileset_impl)); - - strcpy(impl->id,ICALFILESET_ID); - - return impl; -} - - -icalfileset* icalfileset_new(const char* path) -{ - return icalfileset_new_open(path, O_RDWR|O_CREAT, 0664); -} - -icalfileset* icalfileset_new_open(const char* path, int flags, mode_t mode) -{ - struct icalfileset_impl *impl = icalfileset_new_impl(); - struct icaltimetype tt; - off_t cluster_file_size; - - memset(&tt,0,sizeof(struct icaltimetype)); - - icalerror_clear_errno(); - icalerror_check_arg_rz( (path!=0), "path"); - - if (impl == 0){ - return 0; - } - - impl->path = strdup(path); - - cluster_file_size = icalfileset_filesize(impl); - - if(cluster_file_size < 0){ - icalfileset_free(impl); - return 0; - } - - impl->fd = open(impl->path,flags, mode); - - if (impl->fd < 0){ - icalerror_set_errno(ICAL_FILE_ERROR); - icalfileset_free(impl); - return 0; - } - - icalfileset_lock(impl); - - if(cluster_file_size > 0 ){ - icalerrorenum error; - if((error = icalfileset_read_file(impl,mode))!= ICAL_NO_ERROR){ - icalfileset_free(impl); - return 0; - } - } - - if(impl->cluster == 0){ - impl->cluster = icalcomponent_new(ICAL_XROOT_COMPONENT); - } - - return impl; -} - -char* icalfileset_read_from_file(char *s, size_t size, void *d) -{ - - char* p = s; - int fd = (int)d; - - /* Simulate fgets -- read single characters and stop at '\n' */ - - for(p=s; p<s+size-1;p++){ - - if(read(fd,p,1) != 1 || *p=='\n'){ - p++; - break; - } - } - - *p = '\0'; - - if(*s == 0){ - return 0; - } else { - return s; - } - -} - - -icalerrorenum icalfileset_read_file(icalfileset* cluster,mode_t mode) -{ - - icalparser *parser; - - struct icalfileset_impl *impl = (struct icalfileset_impl*)cluster; - - parser = icalparser_new(); - icalparser_set_gen_data(parser,(void*)impl->fd); - impl->cluster = icalparser_parse(parser,icalfileset_read_from_file); - icalparser_free(parser); - - if (impl->cluster == 0 || icalerrno != ICAL_NO_ERROR){ - icalerror_set_errno(ICAL_PARSE_ERROR); - return ICAL_PARSE_ERROR; - } - - if (icalcomponent_isa(impl->cluster) != ICAL_XROOT_COMPONENT){ - /* The parser got a single component, so it did not put it in - an XROOT. */ - icalcomponent *cl = impl->cluster; - impl->cluster = icalcomponent_new(ICAL_XROOT_COMPONENT); - icalcomponent_add_component(impl->cluster,cl); - } - - return ICAL_NO_ERROR; - -} - -int icalfileset_filesize(icalfileset* cluster) -{ - struct icalfileset_impl *impl = (struct icalfileset_impl*)cluster; - int cluster_file_size; - struct stat sbuf; - - if (stat(impl->path,&sbuf) != 0){ - - /* A file by the given name does not exist, or there was - another error */ - cluster_file_size = 0; - if (errno == ENOENT) { - /* It was because the file does not exist */ - return 0; - } else { - /* It was because of another error */ - icalerror_set_errno(ICAL_FILE_ERROR); - return -1; - } - } else { - /* A file by the given name exists, but is it a regular file? */ - - if (!S_ISREG(sbuf.st_mode)){ - /* Nope, not a regular file */ - icalerror_set_errno(ICAL_FILE_ERROR); - return -1; - } else { - /* Lets assume that it is a file of the right type */ - return sbuf.st_size; - } - } - - /*return -1; not reached*/ -} - -void icalfileset_free(icalfileset* cluster) -{ - struct icalfileset_impl *impl = (struct icalfileset_impl*)cluster; - - icalerror_check_arg_rv((cluster!=0),"cluster"); - - if (impl->cluster != 0){ - icalfileset_commit(cluster); - icalcomponent_free(impl->cluster); - impl->cluster=0; - } - - if(impl->fd > 0){ - icalfileset_unlock(impl); - close(impl->fd); - impl->fd = -1; - } - - if(impl->path != 0){ - free(impl->path); - impl->path = 0; - } - - free(impl); -} - -const char* icalfileset_path(icalfileset* cluster) -{ - struct icalfileset_impl *impl = (struct icalfileset_impl*)cluster; - icalerror_check_arg_rz((cluster!=0),"cluster"); - - return impl->path; -} - - -int icalfileset_lock(icalfileset *cluster) -{ - struct icalfileset_impl *impl = (struct icalfileset_impl*)cluster; - struct flock lock; - int rtrn; - - icalerror_check_arg_rz((impl->fd>0),"impl->fd"); - errno = 0; - lock.l_type = F_WRLCK; /* F_RDLCK, F_WRLCK, F_UNLCK */ - lock.l_start = 0; /* byte offset relative to l_whence */ - lock.l_whence = SEEK_SET; /* SEEK_SET, SEEK_CUR, SEEK_END */ - lock.l_len = 0; /* #bytes (0 means to EOF) */ - - rtrn = fcntl(impl->fd, F_SETLKW, &lock); - - return rtrn; -} - -int icalfileset_unlock(icalfileset *cluster) -{ - struct icalfileset_impl *impl = (struct icalfileset_impl*)cluster; - struct flock lock; - icalerror_check_arg_rz((impl->fd>0),"impl->fd"); - - lock.l_type = F_WRLCK; /* F_RDLCK, F_WRLCK, F_UNLCK */ - lock.l_start = 0; /* byte offset relative to l_whence */ - lock.l_whence = SEEK_SET; /* SEEK_SET, SEEK_CUR, SEEK_END */ - lock.l_len = 0; /* #bytes (0 means to EOF) */ - - return (fcntl(impl->fd, F_UNLCK, &lock)); - -} - -#ifdef ICAL_SAFESAVES -int icalfileset_safe_saves=1; -#else -int icalfileset_safe_saves=0; -#endif - -icalerrorenum icalfileset_commit(icalfileset* cluster) -{ - char tmp[ICAL_PATH_MAX]; - char *str; - icalcomponent *c; - off_t write_size=0; - - struct icalfileset_impl *impl = (struct icalfileset_impl*)cluster; - - icalerror_check_arg_re((impl!=0),"cluster",ICAL_BADARG_ERROR); - - icalerror_check_arg_re((impl->fd>0),"impl->fd is invalid", - ICAL_INTERNAL_ERROR) ; - - if (impl->changed == 0 ){ - return ICAL_NO_ERROR; - } - - if(icalfileset_safe_saves == 1){ - snprintf(tmp,ICAL_PATH_MAX,"cp %s %s.bak",impl->path,impl->path); - - if(system(tmp) < 0){ - icalerror_set_errno(ICAL_FILE_ERROR); - return ICAL_FILE_ERROR; - } - } - - if(lseek(impl->fd,SEEK_SET,0) < 0){ - icalerror_set_errno(ICAL_FILE_ERROR); - return ICAL_FILE_ERROR; - } - - for(c = icalcomponent_get_first_component(impl->cluster,ICAL_ANY_COMPONENT); - c != 0; - c = icalcomponent_get_next_component(impl->cluster,ICAL_ANY_COMPONENT)){ - int sz; - - str = icalcomponent_as_ical_string(c); - - sz=write(impl->fd,str,strlen(str)); - - if ( sz != strlen(str)){ - perror("write"); - icalerror_set_errno(ICAL_FILE_ERROR); - return ICAL_FILE_ERROR; - } - - write_size += sz; - } - - impl->changed = 0; - - if(ftruncate(impl->fd,write_size) < 0){ - return ICAL_FILE_ERROR; - } - - return ICAL_NO_ERROR; - -} - -void icalfileset_mark(icalfileset* cluster){ - - struct icalfileset_impl *impl = (struct icalfileset_impl*)cluster; - - icalerror_check_arg_rv((impl!=0),"cluster"); - - impl->changed = 1; - -} - -icalcomponent* icalfileset_get_component(icalfileset* cluster){ - struct icalfileset_impl *impl = (struct icalfileset_impl*)cluster; - - icalerror_check_arg_re((impl!=0),"cluster",ICAL_BADARG_ERROR); - - return impl->cluster; -} - - -/* manipulate the components in the cluster */ - -icalerrorenum icalfileset_add_component(icalfileset *cluster, - icalcomponent* child) -{ - struct icalfileset_impl* impl = (struct icalfileset_impl*)cluster; - - icalerror_check_arg_re((cluster!=0),"cluster", ICAL_BADARG_ERROR); - icalerror_check_arg_re((child!=0),"child",ICAL_BADARG_ERROR); - - icalcomponent_add_component(impl->cluster,child); - - icalfileset_mark(cluster); - - return ICAL_NO_ERROR; - -} - -icalerrorenum icalfileset_remove_component(icalfileset *cluster, - icalcomponent* child) -{ - struct icalfileset_impl* impl = (struct icalfileset_impl*)cluster; - - icalerror_check_arg_re((cluster!=0),"cluster",ICAL_BADARG_ERROR); - icalerror_check_arg_re((child!=0),"child",ICAL_BADARG_ERROR); - - icalcomponent_remove_component(impl->cluster,child); - - icalfileset_mark(cluster); - - return ICAL_NO_ERROR; -} - -int icalfileset_count_components(icalfileset *cluster, - icalcomponent_kind kind) -{ - struct icalfileset_impl* impl = (struct icalfileset_impl*)cluster; - - if(cluster == 0){ - icalerror_set_errno(ICAL_BADARG_ERROR); - return -1; - } - - return icalcomponent_count_components(impl->cluster,kind); -} - -icalerrorenum icalfileset_select(icalfileset* set, icalgauge* gauge) -{ - struct icalfileset_impl* impl = (struct icalfileset_impl*)set; - - icalerror_check_arg_re(gauge!=0,"guage",ICAL_BADARG_ERROR); - - impl->gauge = gauge; - - return ICAL_NO_ERROR; -} - -void icalfileset_clear(icalfileset* gauge) -{ - struct icalfileset_impl* impl = (struct icalfileset_impl*)gauge; - - impl->gauge = 0; - -} - -icalcomponent* icalfileset_fetch(icalfileset* store,const char* uid) -{ - icalcompiter i; - struct icalfileset_impl* impl = (struct icalfileset_impl*)store; - - for(i = icalcomponent_begin_component(impl->cluster,ICAL_ANY_COMPONENT); - icalcompiter_deref(&i)!= 0; icalcompiter_next(&i)){ - - icalcomponent *this = icalcompiter_deref(&i); - icalcomponent *inner = icalcomponent_get_first_real_component(this); - icalcomponent *p; - const char *this_uid; - - if(inner != 0){ - p = icalcomponent_get_first_property(inner,ICAL_UID_PROPERTY); - this_uid = icalproperty_get_uid(p); - - if(this_uid==0){ - icalerror_warn("icalfileset_fetch found a component with no UID"); - continue; - } - - if (strcmp(uid,this_uid)==0){ - return this; - } - } - } - - return 0; -} - -int icalfileset_has_uid(icalfileset* store,const char* uid) -{ - assert(0); /* HACK, not implemented */ - return 0; -} - -/******* support routines for icalfileset_fetch_match *********/ - -struct icalfileset_id{ - char* uid; - char* recurrence_id; - int sequence; -}; - -void icalfileset_id_free(struct icalfileset_id *id) -{ - if(id->recurrence_id != 0){ - free(id->recurrence_id); - } - - if(id->uid != 0){ - free(id->uid); - } - -} - -struct icalfileset_id icalfileset_get_id(icalcomponent* comp) -{ - - icalcomponent *inner; - struct icalfileset_id id; - icalproperty *p; - - inner = icalcomponent_get_first_real_component(comp); - - p = icalcomponent_get_first_property(inner, ICAL_UID_PROPERTY); - - assert(p!= 0); - - id.uid = strdup(icalproperty_get_uid(p)); - - p = icalcomponent_get_first_property(inner, ICAL_SEQUENCE_PROPERTY); - - if(p == 0) { - id.sequence = 0; - } else { - id.sequence = icalproperty_get_sequence(p); - } - - p = icalcomponent_get_first_property(inner, ICAL_RECURRENCEID_PROPERTY); - - if (p == 0){ - id.recurrence_id = 0; - } else { - icalvalue *v; - v = icalproperty_get_value(p); - id.recurrence_id = strdup(icalvalue_as_ical_string(v)); - - assert(id.recurrence_id != 0); - } - - return id; -} - -/* Find the component that is related to the given - component. Currently, it just matches based on UID and - RECURRENCE-ID */ -icalcomponent* icalfileset_fetch_match(icalfileset* set, icalcomponent *comp) -{ - struct icalfileset_impl* impl = (struct icalfileset_impl*)set; - icalcompiter i; - - struct icalfileset_id comp_id, match_id; - - comp_id = icalfileset_get_id(comp); - - for(i = icalcomponent_begin_component(impl->cluster,ICAL_ANY_COMPONENT); - icalcompiter_deref(&i)!= 0; icalcompiter_next(&i)){ - - icalcomponent *match = icalcompiter_deref(&i); - - match_id = icalfileset_get_id(match); - - if(strcmp(comp_id.uid, match_id.uid) == 0 && - ( comp_id.recurrence_id ==0 || - strcmp(comp_id.recurrence_id, match_id.recurrence_id) ==0 )){ - - /* HACK. What to do with SEQUENCE? */ - - icalfileset_id_free(&match_id); - icalfileset_id_free(&comp_id); - return match; - - } - - icalfileset_id_free(&match_id); - } - - icalfileset_id_free(&comp_id); - return 0; - -} - - -icalerrorenum icalfileset_modify(icalfileset* store, icalcomponent *old, - icalcomponent *new) -{ - assert(0); /* HACK, not implemented */ - return ICAL_NO_ERROR; -} - - -/* Iterate through components */ -icalcomponent* icalfileset_get_current_component (icalfileset* cluster) -{ - struct icalfileset_impl* impl = (struct icalfileset_impl*)cluster; - - icalerror_check_arg_rz((cluster!=0),"cluster"); - - return icalcomponent_get_current_component(impl->cluster); -} - - -icalcomponent* icalfileset_get_first_component(icalfileset* cluster) -{ - struct icalfileset_impl* impl = (struct icalfileset_impl*)cluster; - icalcomponent *c=0; - - icalerror_check_arg_rz((cluster!=0),"cluster"); - - do { - if (c == 0){ - c = icalcomponent_get_first_component(impl->cluster, - ICAL_ANY_COMPONENT); - } else { - c = icalcomponent_get_next_component(impl->cluster, - ICAL_ANY_COMPONENT); - } - - if(c != 0 && (impl->gauge == 0 || - icalgauge_compare(impl->gauge,c) == 1)){ - return c; - } - - } while(c != 0); - - - return 0; -} - -icalcomponent* icalfileset_get_next_component(icalfileset* cluster) -{ - struct icalfileset_impl* impl = (struct icalfileset_impl*)cluster; - icalcomponent *c; - - icalerror_check_arg_rz((cluster!=0),"cluster"); - - do { - c = icalcomponent_get_next_component(impl->cluster, - ICAL_ANY_COMPONENT); - - if(c != 0 && (impl->gauge == 0 || - icalgauge_compare(impl->gauge,c) == 1)){ - return c; - } - - } while(c != 0); - - - return 0; -} - diff --git a/libical/src/libicalss/icalfileset.h b/libical/src/libicalss/icalfileset.h deleted file mode 100644 index c785921463..0000000000 --- a/libical/src/libicalss/icalfileset.h +++ /dev/null @@ -1,105 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalfileset.h - CREATOR: eric 23 December 1999 - - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The Original Code is eric. The Initial Developer of the Original - Code is Eric Busboom - - -======================================================================*/ - -#ifndef ICALFILESET_H -#define ICALFILESET_H - -#include "ical.h" -#include "icalset.h" -#include "icalgauge.h" -#include <sys/types.h> /* For open() flags and mode */ -#include <sys/stat.h> /* For open() flags and mode */ -#include <fcntl.h> /* For open() flags and mode */ - -extern int icalfileset_safe_saves; - -typedef void icalfileset; - - -/* icalfileset - icalfilesetfile - icalfilesetdir -*/ - - -icalfileset* icalfileset_new(const char* path); - -/* Like _new, but takes open() flags for opening the file */ -icalfileset* icalfileset_new_open(const char* path, - int flags, mode_t mode); - -void icalfileset_free(icalfileset* cluster); - -const char* icalfileset_path(icalfileset* cluster); - -/* Mark the cluster as changed, so it will be written to disk when it - is freed. Commit writes to disk immediately. */ -void icalfileset_mark(icalfileset* cluster); -icalerrorenum icalfileset_commit(icalfileset* cluster); - -icalerrorenum icalfileset_add_component(icalfileset* cluster, - icalcomponent* child); - -icalerrorenum icalfileset_remove_component(icalfileset* cluster, - icalcomponent* child); - -int icalfileset_count_components(icalfileset* cluster, - icalcomponent_kind kind); - -/* Restrict the component returned by icalfileset_first, _next to those - that pass the gauge. _clear removes the gauge */ -icalerrorenum icalfileset_select(icalfileset* store, icalgauge* gauge); -void icalfileset_clear(icalfileset* store); - -/* Get and search for a component by uid */ -icalcomponent* icalfileset_fetch(icalfileset* cluster, const char* uid); -int icalfileset_has_uid(icalfileset* cluster, const char* uid); -icalcomponent* icalfileset_fetch_match(icalfileset* set, icalcomponent *c); - - -/* Modify components according to the MODIFY method of CAP. Works on - the currently selected components. */ -icalerrorenum icalfileset_modify(icalfileset* store, icalcomponent *oldcomp, - icalcomponent *newcomp); - -/* Iterate through components. If a guage has been defined, these - will skip over components that do not pass the gauge */ - -icalcomponent* icalfileset_get_current_component (icalfileset* cluster); -icalcomponent* icalfileset_get_first_component(icalfileset* cluster); -icalcomponent* icalfileset_get_next_component(icalfileset* cluster); -/* Return a reference to the internal component. You probably should - not be using this. */ - -icalcomponent* icalfileset_get_component(icalfileset* cluster); - - -#endif /* !ICALFILESET_H */ - - - diff --git a/libical/src/libicalss/icalfilesetimpl.h b/libical/src/libicalss/icalfilesetimpl.h deleted file mode 100644 index fcd3415121..0000000000 --- a/libical/src/libicalss/icalfilesetimpl.h +++ /dev/null @@ -1,49 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: icalfilesetimpl.h - CREATOR: eric 23 December 1999 - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The Original Code is eric. The Initial Developer of the Original - Code is Eric Busboom - - - ======================================================================*/ - - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "icalgauge.h" - -/* This definition is in its own file so it can be kept out of the - main header file, but used by "friend classes" like icaldirset*/ - -#define ICALFILESET_ID "fset" - -struct icalfileset_impl { - - char id[5]; /*fset*/ - char *path; - icalcomponent* cluster; - icalgauge* gauge; - int changed; - int fd; /* file descriptor */ -}; - diff --git a/libical/src/libicalss/icalgauge.c b/libical/src/libicalss/icalgauge.c deleted file mode 100644 index b958ecfc9d..0000000000 --- a/libical/src/libicalss/icalgauge.c +++ /dev/null @@ -1,447 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalgauge.c - CREATOR: eric 23 December 1999 - - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The Original Code is eric. The Initial Developer of the Original - Code is Eric Busboom - - -======================================================================*/ - -#include "ical.h" -#include "icalgauge.h" -#include "icalgaugeimpl.h" -#include <stdlib.h> - -extern char* input_buffer; -extern char* input_buffer_p; -int ssparse(void); - -struct icalgauge_impl *icalss_yy_gauge; - -icalgauge* icalgauge_new_from_sql(char* sql) -{ - struct icalgauge_impl *impl; - - int r; - - if ( ( impl = (struct icalgauge_impl*) - malloc(sizeof(struct icalgauge_impl))) == 0) { - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - impl->select = pvl_newlist(); - impl->from = pvl_newlist(); - impl->where = pvl_newlist(); - - icalss_yy_gauge = impl; - - input_buffer_p = input_buffer = sql; - r = ssparse(); - - return impl; -} - - -void icalgauge_free(icalgauge* gauge) -{ - struct icalgauge_impl *impl = (struct icalgauge_impl*)gauge; - struct icalgauge_where *w; - - assert(impl->select != 0); - assert(impl->where != 0); - assert(impl->from != 0); - - if(impl->select){ - while( (w=pvl_pop(impl->select)) != 0){ - if(w->value != 0){ - free(w->value); - } - free(w); - } - pvl_free(impl->select); - } - - if(impl->where){ - while( (w=pvl_pop(impl->where)) != 0){ - - if(w->value != 0){ - free(w->value); - } - free(w); - } - pvl_free(impl->where); - } - - if(impl->from){ - pvl_free(impl->from); - } - -} - -/* Convert a VQUERY component into a gauge */ -icalcomponent* icalgauge_make_gauge(icalcomponent* query); - -/* icaldirset_test compares a component against a gauge, and returns - true if the component passes the test - - The gauge is a VCALENDAR component that specifies how to test the - target components. The guage holds a collection of VEVENT, VTODO or - VJOURNAL sub-components. Each of the sub-components has a - collection of properties that are compared to corresponding - properties in the target component, according to the - X-LIC-COMPARETYPE parameters to the gauge's properties. - - When a gauge has several sub-components, the results of testing the - target against each of them is ORed together - the target - component will pass if it matches any of the sub-components in the - gauge. However, the results of matching the properties in a - sub-component are ANDed -- the target must match every property in - a gauge sub-component to match the sub-component. - - Here is an example: - - BEGIN:XROOT - DTSTART;X-LIC-COMPARETYPE=LESS:19981025T020000 - ORGANIZER;X-LIC-COMPARETYPE=EQUAL:mrbig@host.com - END:XROOT - BEGIN:XROOT - LOCATION;X-LIC-COMPARETYPE=EQUAL:McNary's Pub - END:XROOT - - This gauge has two sub-components; one which will match a VEVENT - based on start time, and organizer, and another that matches based - on LOCATION. A target component will pass the test if it matched - either of the sub-components. - - */ - - -int icalgauge_compare_recurse(icalcomponent* comp, icalcomponent* gauge) -{ - int pass = 1,localpass = 0; - icalproperty *p; - icalcomponent *child,*subgauge; - icalcomponent_kind gaugekind, compkind; - - icalerror_check_arg_rz( (comp!=0), "comp"); - icalerror_check_arg_rz( (gauge!=0), "gauge"); - - gaugekind = icalcomponent_isa(gauge); - compkind = icalcomponent_isa(comp); - - if( ! (gaugekind == compkind || gaugekind == ICAL_ANY_COMPONENT) ){ - return 0; - } - - /* Test properties. For each property in the gauge, search through - the component for a similar property. If one is found, compare - the two properties value with the comparison specified in the - gauge with the X-LIC-COMPARETYPE parameter */ - - for(p = icalcomponent_get_first_property(gauge,ICAL_ANY_PROPERTY); - p != 0; - p = icalcomponent_get_next_property(gauge,ICAL_ANY_PROPERTY)){ - - icalproperty* targetprop; - icalparameter* compareparam; - icalparameter_xliccomparetype compare; - int rel; /* The relationship between the gauge and target values.*/ - - /* Extract the comparison type from the gauge. If there is no - comparison type, assume that it is "EQUAL" */ - - compareparam = icalproperty_get_first_parameter( - p, - ICAL_XLICCOMPARETYPE_PARAMETER); - - if (compareparam!=0){ - compare = icalparameter_get_xliccomparetype(compareparam); - } else { - compare = ICAL_XLICCOMPARETYPE_EQUAL; - } - - /* Find a property in the component that has the same type - as the gauge property. HACK -- multiples of a single - property type in the gauge will match only the first - instance in the component */ - - targetprop = icalcomponent_get_first_property(comp, - icalproperty_isa(p)); - - if(targetprop != 0){ - - /* Compare the values of the gauge property and the target - property */ - - rel = icalvalue_compare(icalproperty_get_value(p), - icalproperty_get_value(targetprop)); - - /* Now see if the comparison is equavalent to the comparison - specified in the gauge */ - - if (rel == compare){ - localpass++; - } else if (compare == ICAL_XLICCOMPARETYPE_LESSEQUAL && - ( rel == ICAL_XLICCOMPARETYPE_LESS || - rel == ICAL_XLICCOMPARETYPE_EQUAL)) { - localpass++; - } else if (compare == ICAL_XLICCOMPARETYPE_GREATEREQUAL && - ( rel == ICAL_XLICCOMPARETYPE_GREATER || - rel == ICAL_XLICCOMPARETYPE_EQUAL)) { - localpass++; - } else if (compare == ICAL_XLICCOMPARETYPE_NOTEQUAL && - ( rel == ICAL_XLICCOMPARETYPE_GREATER || - rel == ICAL_XLICCOMPARETYPE_LESS)) { - localpass++; - } else { - localpass = 0; - } - - pass = pass && (localpass>0); - } - } - - /* Test subcomponents. Look for a child component that has a - counterpart in the gauge. If one is found, recursively call - icaldirset_test */ - - for(subgauge = icalcomponent_get_first_component(gauge,ICAL_ANY_COMPONENT); - subgauge != 0; - subgauge = icalcomponent_get_next_component(gauge,ICAL_ANY_COMPONENT)){ - - gaugekind = icalcomponent_isa(subgauge); - - if (gaugekind == ICAL_ANY_COMPONENT){ - child = icalcomponent_get_first_component(comp,ICAL_ANY_COMPONENT); - } else { - child = icalcomponent_get_first_component(comp,gaugekind); - } - - if(child !=0){ - localpass = icalgauge_compare_recurse(child,subgauge); - pass = pass && localpass; - } else { - pass = 0; - } - } - - return pass; -} - - -int icalgauge_compare(icalgauge* gauge,icalcomponent* comp) -{ - - struct icalgauge_impl *impl = (struct icalgauge_impl*)gauge; - icalcomponent *inner; - int local_pass = 0; - int last_clause = 1, this_clause = 1; - pvl_elem e; - - icalerror_check_arg_rz( (comp!=0), "comp"); - icalerror_check_arg_rz( (gauge!=0), "gauge"); - - inner = icalcomponent_get_first_real_component(comp); - - if(inner == 0){ - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - return 0; - } - - - /* Check that this component is one of the FROM types */ - local_pass = 0; - for(e = pvl_head(impl->from);e!=0;e=pvl_next(e)){ - icalcomponent_kind k = (icalcomponent_kind)pvl_data(e); - - if(k == icalcomponent_isa(inner)){ - local_pass=1; - } - } - - if(local_pass == 0){ - return 0; - } - - - /* Check each where clause against the component */ - for(e = pvl_head(impl->where);e!=0;e=pvl_next(e)){ - struct icalgauge_where *w = pvl_data(e); - icalcomponent *sub_comp; - icalvalue *v; - icalproperty *prop; - icalvalue_kind vk; - - if(w->prop == ICAL_NO_PROPERTY || w->value == 0){ - icalerror_set_errno(ICAL_INTERNAL_ERROR); - return 0; - } - - /* First, create a value from the gauge */ - vk = icalenum_property_kind_to_value_kind(w->prop); - - if(vk == ICAL_NO_VALUE){ - icalerror_set_errno(ICAL_INTERNAL_ERROR); - return 0; - } - - v = icalvalue_new_from_string(vk,w->value); - - if (v == 0){ - /* Keep error set by icalvalue_from-string*/ - return 0; - } - - /* Now find the corresponding property in the component, - descending into a sub-component if necessary */ - - if(w->comp == ICAL_NO_COMPONENT){ - sub_comp = inner; - } else { - sub_comp = icalcomponent_get_first_component(inner,w->comp); - if(sub_comp == 0){ - return 0; - } - } - - this_clause = 0; - local_pass = 0; - for(prop = icalcomponent_get_first_property(sub_comp,w->prop); - prop != 0; - prop = icalcomponent_get_next_property(sub_comp,w->prop)){ - icalvalue* prop_value; - icalgaugecompare relation; - - prop_value = icalproperty_get_value(prop); - - relation = (icalgaugecompare)icalvalue_compare(prop_value,v); - - if (relation == w->compare){ - local_pass++; - } else if (w->compare == ICALGAUGECOMPARE_LESSEQUAL && - ( relation == ICALGAUGECOMPARE_LESS || - relation == ICALGAUGECOMPARE_EQUAL)) { - local_pass++; - } else if (w->compare == ICALGAUGECOMPARE_GREATEREQUAL && - ( relation == ICALGAUGECOMPARE_GREATER || - relation == ICALGAUGECOMPARE_EQUAL)) { - local_pass++; - } else if (w->compare == ICALGAUGECOMPARE_NOTEQUAL && - ( relation == ICALGAUGECOMPARE_GREATER || - relation == ICALGAUGECOMPARE_LESS)) { - local_pass++; - } else { - local_pass = 0; - } - } - - this_clause = local_pass > 0 ? 1 : 0; - - /* Now look at the logic operator for this clause to see how - the value should be merge with the previous clause */ - - if(w->logic == ICALGAUGELOGIC_AND){ - last_clause = this_clause && last_clause; - } else if(w->logic == ICALGAUGELOGIC_AND) { - last_clause = this_clause || last_clause; - } else { - last_clause = this_clause; - } - } - - return last_clause; - -} - - -void icalgauge_dump(icalcomponent* gauge) -{ - - pvl_elem *p; - struct icalgauge_impl *impl = (struct icalgauge_impl*)gauge; - - - printf("--- Select ---\n"); - for(p = pvl_head(impl->select);p!=0;p=pvl_next(p)){ - struct icalgauge_where *w = pvl_data(p); - - if(w->comp != ICAL_NO_COMPONENT){ - printf("%s ",icalenum_component_kind_to_string(w->comp)); - } - - if(w->prop != ICAL_NO_PROPERTY){ - printf("%s ",icalenum_property_kind_to_string(w->prop)); - } - - if (w->compare != ICALGAUGECOMPARE_NONE){ - printf("%d ",w->compare); - } - - - if (w->value!=0){ - printf("%s",w->value); - } - - - printf("\n"); - } - - printf("--- From ---\n"); - for(p = pvl_head(impl->from);p!=0;p=pvl_next(p)){ - icalcomponent_kind k = (icalcomponent_kind)pvl_data(p); - - printf("%s\n",icalenum_component_kind_to_string(k)); - } - - printf("--- Where ---\n"); - for(p = pvl_head(impl->where);p!=0;p=pvl_next(p)){ - struct icalgauge_where *w = pvl_data(p); - - if(w->logic != ICALGAUGELOGIC_NONE){ - printf("%d ",w->logic); - } - - if(w->comp != ICAL_NO_COMPONENT){ - printf("%s ",icalenum_component_kind_to_string(w->comp)); - } - - if(w->prop != ICAL_NO_PROPERTY){ - printf("%s ",icalenum_property_kind_to_string(w->prop)); - } - - if (w->compare != ICALGAUGECOMPARE_NONE){ - printf("%d ",w->compare); - } - - - if (w->value!=0){ - printf("%s",w->value); - } - - - printf("\n"); - } - - -} - diff --git a/libical/src/libicalss/icalgauge.h b/libical/src/libicalss/icalgauge.h deleted file mode 100644 index 1caf0ac7d1..0000000000 --- a/libical/src/libicalss/icalgauge.h +++ /dev/null @@ -1,51 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalgauge.h - CREATOR: eric 23 December 1999 - - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The Original Code is eric. The Initial Developer of the Original - Code is Eric Busboom - - -======================================================================*/ - -#ifndef ICALGAUGE_H -#define ICALGAUGE_H - -typedef void icalgauge; - -icalgauge* icalgauge_new_from_sql(char* sql); - -void icalgauge_free(icalgauge* gauge); - -char* icalgauge_as_sql(icalcomponent* gauge); - -void icalgauge_dump(icalcomponent* gauge); - -/* Return true is comp matches the gauge. The component must be in - cannonical form -- a VCALENDAR with one VEVENT, VTODO or VJOURNAL - sub component */ -int icalgauge_compare(icalgauge* g, icalcomponent* comp); - -/* Clone the component, but only return the properties specified in - the gauge */ -icalcomponent* icalgauge_new_clone(icalgauge* g, icalcomponent* comp); - -#endif /* ICALGAUGE_H*/ diff --git a/libical/src/libicalss/icalgaugeimpl.h b/libical/src/libicalss/icalgaugeimpl.h deleted file mode 100644 index 73a2813242..0000000000 --- a/libical/src/libicalss/icalgaugeimpl.h +++ /dev/null @@ -1,63 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalgaugeimpl.h - CREATOR: eric 09 Aug 2000 - - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - -======================================================================*/ - -#include "ical.h" - -#include "pvl.h" - -typedef enum icalgaugecompare { - ICALGAUGECOMPARE_EQUAL=ICAL_XLICCOMPARETYPE_EQUAL, - ICALGAUGECOMPARE_LESS=ICAL_XLICCOMPARETYPE_LESS, - ICALGAUGECOMPARE_LESSEQUAL=ICAL_XLICCOMPARETYPE_LESSEQUAL, - ICALGAUGECOMPARE_GREATER=ICAL_XLICCOMPARETYPE_GREATER, - ICALGAUGECOMPARE_GREATEREQUAL=ICAL_XLICCOMPARETYPE_GREATEREQUAL, - ICALGAUGECOMPARE_NOTEQUAL=ICAL_XLICCOMPARETYPE_NOTEQUAL, - ICALGAUGECOMPARE_REGEX=ICAL_XLICCOMPARETYPE_REGEX, - ICALGAUGECOMPARE_NONE=0 -} icalgaugecompare; - -typedef enum icalgaugelogic { - ICALGAUGELOGIC_NONE, - ICALGAUGELOGIC_AND, - ICALGAUGELOGIC_OR -} icalgaugelogic; - - -struct icalgauge_where { - icalgaugelogic logic; - icalcomponent_kind comp; - icalproperty_kind prop; - icalgaugecompare compare; - char* value; -}; - -struct icalgauge_impl -{ - - pvl_list select; /*Of icalgaugecompare, using only prop and comp fields*/ - pvl_list from; /* List of component_kinds, as integers */ - pvl_list where; /* List of icalgaugecompare */ -}; - - diff --git a/libical/src/libicalss/icalmessage.c b/libical/src/libicalss/icalmessage.c deleted file mode 100644 index e1e8d8015c..0000000000 --- a/libical/src/libicalss/icalmessage.c +++ /dev/null @@ -1,376 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: icalmessage.c - CREATOR: ebusboom 07 Nov 2000 - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - - ======================================================================*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "icalmessage.h" -#include "icalenums.h" -#include <ctype.h> /* for tolower()*/ -#include <string.h> /* for strstr */ -#include <stdlib.h> /* for free(), malloc() */ -icalcomponent* icalmessage_get_inner(icalcomponent* comp) -{ - if (icalcomponent_isa(comp) == ICAL_VCALENDAR_COMPONENT){ - return icalcomponent_get_first_real_component(comp); - } else { - return comp; - } -} - -char* lowercase(const char* str) -{ - char* p = 0; - char* n = icalmemory_strdup(str); - - if(str ==0){ - return 0; - } - - for(p = n; *p!=0; p++){ - *p = tolower(*p); - } - - return n; -} - -icalproperty* icalmessage_find_attendee(icalcomponent* comp, const char* user) -{ - icalcomponent *inner = icalmessage_get_inner(comp); - icalproperty *p,*attendee = 0; - char* luser = lowercase(user); - - for(p = icalcomponent_get_first_property(inner, ICAL_ATTENDEE_PROPERTY); - p != 0; - p = icalcomponent_get_next_property(inner, ICAL_ATTENDEE_PROPERTY) - ){ - - char* lattendee; - - lattendee = lowercase(icalproperty_get_attendee(p)); - - if (strstr(lattendee,user) != 0){ - attendee = p; - break; - } - - free(lattendee); - - } - - free(luser); - - return attendee; - -} - -void icalmessage_copy_properties(icalcomponent* to, icalcomponent* from, - icalproperty_kind kind) -{ - icalcomponent *to_inner = icalmessage_get_inner(to); - icalcomponent *from_inner = icalmessage_get_inner(from); - - if (to_inner == 0 && from_inner == 0){ - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - return; - } - - if(!icalcomponent_get_first_property(from_inner,kind)){ - return; - } - - icalcomponent_add_property(to_inner, - icalproperty_new_clone( - icalcomponent_get_first_property( - from_inner, - kind) - ) - ); -} - -icalcomponent *icalmessage_new_reply_base(icalcomponent* c, - const char* user, - const char* msg) -{ - icalproperty *attendee; - char tmp[45]; - - icalcomponent *reply = icalcomponent_vanew( - ICAL_VCALENDAR_COMPONENT, - icalproperty_new_method(ICAL_METHOD_REPLY), - icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_new_dtstamp(icaltime_from_timet(time(0),0)), - 0), - 0); - - icalcomponent *inner = icalmessage_get_inner(reply); - - icalerror_check_arg_rz(c,"c"); - - icalmessage_copy_properties(reply,c,ICAL_UID_PROPERTY); - icalmessage_copy_properties(reply,c,ICAL_ORGANIZER_PROPERTY); - icalmessage_copy_properties(reply,c,ICAL_RECURRENCEID_PROPERTY); - icalmessage_copy_properties(reply,c,ICAL_SUMMARY_PROPERTY); - icalmessage_copy_properties(reply,c,ICAL_SEQUENCE_PROPERTY); - - icalcomponent_set_dtstamp(reply,icaltime_from_timet(time(0),0)); - - if(msg != 0){ - icalcomponent_add_property(inner,icalproperty_new_comment(msg)); - } - - /* Copy this user's attendee property */ - - attendee = icalmessage_find_attendee(c,user); - - if (attendee == 0){ - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - icalcomponent_free(reply); - return 0; - } - - icalcomponent_add_property(inner,icalproperty_new_clone(attendee)); - - /* Add PRODID and VERSION */ - - icalcomponent_add_property(reply,icalproperty_new_version("2.0")); - - sprintf(tmp, - "-//SoftwareStudio//NONSGML %s %s //EN",PACKAGE,VERSION); - icalcomponent_add_property(reply,icalproperty_new_prodid(tmp)); - - return reply; - -} - -icalcomponent* icalmessage_new_accept_reply(icalcomponent* c, - const char* user, - const char* msg) -{ - - icalcomponent *reply; - icalproperty *attendee; - icalcomponent *inner; - - icalerror_check_arg_rz(c,"c"); - - reply = icalmessage_new_reply_base(c,user,msg); - - if(reply == 0){ - return 0; - } - - inner = icalmessage_get_inner(reply); - - attendee = icalcomponent_get_first_property(inner, - ICAL_ATTENDEE_PROPERTY); - - icalproperty_set_parameter(attendee, - icalparameter_new_partstat(ICAL_PARTSTAT_ACCEPTED)); - - return reply; -} - -icalcomponent* icalmessage_new_decline_reply(icalcomponent* c, - const char* user, - const char* msg) -{ - icalcomponent *reply; - icalproperty *attendee; - icalcomponent *inner; - - icalerror_check_arg_rz(c,"c"); - - reply = icalmessage_new_reply_base(c,user,msg); - inner = icalmessage_get_inner(reply); - if(reply == 0){ - return 0; - } - - attendee = icalcomponent_get_first_property(inner, - ICAL_ATTENDEE_PROPERTY); - - icalproperty_set_parameter(attendee, - icalparameter_new_partstat(ICAL_PARTSTAT_DECLINED)); - - return reply; -} - -/* New is modified version of old */ -icalcomponent* icalmessage_new_counterpropose_reply(icalcomponent* oldc, - icalcomponent* newc, - const char* user, - const char* msg) -{ - icalcomponent *reply; - - icalerror_check_arg_rz(oldc,"oldc"); - icalerror_check_arg_rz(newc,"newc"); - - reply = icalcomponent_new_clone(newc); - - icalcomponent_set_method(reply,ICAL_METHOD_COUNTER); - - return newc; - -} - - -icalcomponent* icalmessage_new_delegate_reply(icalcomponent* c, - const char* user, - const char* delegatee, - const char* msg) -{ - - icalcomponent *reply; - icalproperty *attendee; - icalcomponent *inner; - - icalerror_check_arg_rz(c,"c"); - - reply = icalmessage_new_reply_base(c,user,msg); - inner = icalmessage_get_inner(reply); - if(reply == 0){ - return 0; - } - - attendee = icalcomponent_get_first_property(inner, - ICAL_ATTENDEE_PROPERTY); - - icalproperty_set_parameter(attendee, - icalparameter_new_partstat(ICAL_PARTSTAT_DELEGATED)); - - icalproperty_set_parameter(attendee, - icalparameter_new_delegatedto(delegatee)); - - return reply; - -} - -icalcomponent* icalmessage_new_delegate_request(icalcomponent* c, - const char* user, - const char* delegatee, - const char* msg) -{ - - icalcomponent *reply; - icalproperty *attendee; - icalcomponent *inner; - - icalerror_check_arg_rz(c,"c"); - - reply = icalmessage_new_reply_base(c,user,msg); - inner = icalmessage_get_inner(reply); - - if(reply == 0){ - return 0; - } - - icalcomponent_set_method(reply,ICAL_METHOD_REQUEST); - - attendee = icalcomponent_get_first_property(inner, - ICAL_ATTENDEE_PROPERTY); - - icalproperty_set_parameter(attendee, - icalparameter_new_partstat(ICAL_PARTSTAT_DELEGATED)); - - icalproperty_set_parameter(attendee, - icalparameter_new_delegatedto(delegatee)); - - icalcomponent_add_property( - inner, - icalproperty_vanew_attendee( - delegatee, - icalparameter_new_delegatedfrom( - icalproperty_get_attendee(attendee) - ), - 0 - ) - ); - - - return reply; - -} - - -icalcomponent* icalmessage_new_cancel_event(icalcomponent* c, - const char* user, - const char* msg); -icalcomponent* icalmessage_new_cancel_instance(icalcomponent* c, - const char* user, - const char* msg); -icalcomponent* icalmessage_new_cancel_all(icalcomponent* c, - const char* user, - const char* msg); - - - -icalcomponent* icalmessage_new_error_reply(icalcomponent* c, - const char* user, - const char* msg, - const char* debug, - icalrequeststatus code) -{ - icalcomponent *reply; - icalcomponent *inner, *cinner; - struct icalreqstattype rs; - - icalerror_check_arg_rz(c,"c"); - - reply = icalmessage_new_reply_base(c,user,msg); - inner = icalmessage_get_inner(reply); - cinner = icalmessage_get_inner(c); - if(reply == 0){ - return 0; - } - - if( code != ICAL_UNKNOWN_STATUS){ - rs.code = code; - rs.debug = debug; - - icalcomponent_add_property(inner, - icalproperty_new_requeststatus( - icalreqstattype_as_string(rs) - ) - ); - } else { /* code == ICAL_UNKNOWN_STATUS */ - - /* Copy all of the request status properties */ - icalproperty *p; - for(p = icalcomponent_get_first_property(cinner, - ICAL_REQUESTSTATUS_PROPERTY); - p != 0; - p = icalcomponent_get_next_property(cinner, - ICAL_REQUESTSTATUS_PROPERTY)){ - - - icalcomponent_add_property(inner,icalproperty_new_clone(p)); - } - } - - return reply; -} diff --git a/libical/src/libicalss/icalmessage.h b/libical/src/libicalss/icalmessage.h deleted file mode 100644 index 24f1c9f243..0000000000 --- a/libical/src/libicalss/icalmessage.h +++ /dev/null @@ -1,71 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalmessage.h - CREATOR: eric 07 Nov 2000 - - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - - =========================================================================*/ - -#include "ical.h" - -#ifndef ICALMESSAGE_H -#define ICALMESSAGE_H - - -icalcomponent* icalmessage_new_accept_reply(icalcomponent* c, - const char* user, - const char* msg); - -icalcomponent* icalmessage_new_decline_reply(icalcomponent* c, - const char* user, - const char* msg); - -/* New is modified version of old */ -icalcomponent* icalmessage_new_counterpropose_reply(icalcomponent* oldc, - icalcomponent* newc, - const char* user, - const char* msg); - - -icalcomponent* icalmessage_new_delegate_reply(icalcomponent* c, - const char* user, - const char* delegatee, - const char* msg); - - -icalcomponent* icalmessage_new_cancel_event(icalcomponent* c, - const char* user, - const char* msg); -icalcomponent* icalmessage_new_cancel_instance(icalcomponent* c, - const char* user, - const char* msg); -icalcomponent* icalmessage_new_cancel_all(icalcomponent* c, - const char* user, - const char* msg); - - -icalcomponent* icalmessage_new_error_reply(icalcomponent* c, - const char* user, - const char* msg, - const char* debug, - icalrequeststatus rs); - - -#endif /* ICALMESSAGE_H*/ diff --git a/libical/src/libicalss/icalset.c b/libical/src/libicalss/icalset.c deleted file mode 100644 index 2120609928..0000000000 --- a/libical/src/libicalss/icalset.c +++ /dev/null @@ -1,367 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalset.c - CREATOR: eric 17 Jul 2000 - - - Icalset is the "base class" for representations of a collection of - iCal components. Derived classes (actually delegates) include: - - icalfileset Store components in a single file - icaldirset Store components in multiple files in a directory - icalheapset Store components on the heap - icalmysqlset Store components in a mysql database. - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The Original Code is eric. The Initial Developer of the Original - Code is Eric Busboom - - -======================================================================*/ - -#include "ical.h" -#include "icalset.h" -#include "icalfileset.h" -#include "icalfilesetimpl.h" -#include "icaldirset.h" -#include "icaldirsetimpl.h" -#include <stdlib.h> -/*#include "icalheapset.h"*/ -/*#include "icalmysqlset.h"*/ - -#define ICALSET_ID "set " - -struct icalset_fp { - void (*free)(icalset* set); - const char* (*path)(icalset* set); - void (*mark)(icalset* set); - icalerrorenum (*commit)(icalset* set); - icalerrorenum (*add_component)(icalset* set, icalcomponent* comp); - icalerrorenum (*remove_component)(icalset* set, icalcomponent* comp); - int (*count_components)(icalset* set, - icalcomponent_kind kind); - icalerrorenum (*select)(icalset* set, icalcomponent* gauge); - void (*clear)(icalset* set); - icalcomponent* (*fetch)(icalset* set, const char* uid); - icalcomponent* (*fetch_match)(icalset* set, icalcomponent *comp); - int (*has_uid)(icalset* set, const char* uid); - icalerrorenum (*modify)(icalset* set, icalcomponent *old, - icalcomponent *new); - icalcomponent* (*get_current_component)(icalset* set); - icalcomponent* (*get_first_component)(icalset* set); - icalcomponent* (*get_next_component)(icalset* set); -}; - -struct icalset_fp icalset_dirset_fp = { - icaldirset_free, - icaldirset_path, - icaldirset_mark, - icaldirset_commit, - icaldirset_add_component, - icaldirset_remove_component, - icaldirset_count_components, - icaldirset_select, - icaldirset_clear, - icaldirset_fetch, - icaldirset_fetch_match, - icaldirset_has_uid, - icaldirset_modify, - icaldirset_get_current_component, - icaldirset_get_first_component, - icaldirset_get_next_component -}; - - -struct icalset_fp icalset_fileset_fp = { - icalfileset_free, - icalfileset_path, - icalfileset_mark, - icalfileset_commit, - icalfileset_add_component, - icalfileset_remove_component, - icalfileset_count_components, - icalfileset_select, - icalfileset_clear, - icalfileset_fetch, - icalfileset_fetch_match, - icalfileset_has_uid, - icalfileset_modify, - icalfileset_get_current_component, - icalfileset_get_first_component, - icalfileset_get_next_component -}; - -struct icalset_impl { - - char id[5]; /* "set " */ - - void *derived_impl; - struct icalset_fp *fp; -}; - -/* Figure out what was actually passed in as the set. This could be a - set or and of the derived types such as dirset or fileset. Note - this routine returns a value, not a reference, to avoid memory - leaks in the methods */ -struct icalset_impl icalset_get_impl(icalset* set) -{ - struct icalset_impl impl; - - memset(&impl,0,sizeof(impl)); - icalerror_check_arg_re( (set!=0),"set",impl); - - if(strcmp((char*)set,ICALSET_ID)==0) { - /* It is actually a set, so just sent the reference back out. */ - return *(struct icalset_impl*)set; - } else if(strcmp((char*)set,ICALFILESET_ID)==0) { - /* Make a new set from the fileset */ - impl.fp = &icalset_fileset_fp; - impl.derived_impl = set; - strcpy(impl.id,ICALFILESET_ID);/* HACK. Is this necessary? */ - return impl; - } else if(strcmp((char*)set,ICALDIRSET_ID)==0) { - /* Make a new set from the dirset */ - impl.fp = &icalset_dirset_fp; - impl.derived_impl = set; - strcpy(impl.id,ICALDIRSET_ID);/* HACK. Is this necessary? */ - return impl; - } else { - /* The type of set is unknown, so throw an error */ - icalerror_assert((0),"Unknown set type"); - return impl; - } -} - - -struct icalset_impl* icalset_new_impl() -{ - - struct icalset_impl* impl; - - if ( ( impl = (struct icalset_impl*) - malloc(sizeof(struct icalset_impl))) == 0) { - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - strcpy(impl->id,ICALSET_ID); - - impl->derived_impl = 0; - impl->fp = 0; - - return impl; -} - -struct icalset_impl* icalset_new_file_from_ref(icalfileset *fset) -{ - struct icalset_impl *impl = icalset_new_impl(); - - icalerror_check_arg_rz( (fset!=0),"fset"); - - if(impl == 0){ - free(impl); - return 0; - } - - impl->derived_impl = fset; - - if (impl->derived_impl == 0){ - free(impl); - return 0; - } - - impl->fp = &icalset_fileset_fp; - - return (struct icalset_impl*)impl; -} - -icalset* icalset_new_file(const char* path) -{ - icalfileset *fset = icalfileset_new(path); - - if(fset == 0){ - return 0; - } - - return (icalset*)icalset_new_file_from_ref(fset); -} - -icalset* icalset_new_dir_from_ref(icaldirset *dset) -{ - - struct icalset_impl *impl = icalset_new_impl(); - - icalerror_check_arg_rz( (dset!=0),"dset"); - - if(impl == 0){ - return 0; - } - - impl->derived_impl = dset; - - if (impl->derived_impl == 0){ - free(impl); - return 0; - } - - impl->fp = &icalset_dirset_fp; - - return impl; -} - -icalset* icalset_new_dir(const char* path) -{ - icaldirset *dset = icaldirset_new(path); - - if(dset == 0){ - return 0; - } - - return icalset_new_dir_from_ref(dset); -} - -icalset* icalset_new_heap(void) -{ - struct icalset_impl *impl = icalset_new_impl(); - - - if(impl == 0){ - free(impl); - return 0; - } - - return 0; -} - -icalset* icalset_new_mysql(const char* path) -{ - struct icalset_impl *impl = icalset_new_impl(); - - if(impl == 0){ - free(impl); - return 0; - } - - return 0; -} - -void icalset_free(icalset* set) -{ - struct icalset_impl impl = icalset_get_impl(set); - (*(impl.fp->free))(impl.derived_impl); - - if(strcmp((char*)set,ICALSET_ID)) { - free(set); - } -} - -const char* icalset_path(icalset* set) -{ - struct icalset_impl impl = icalset_get_impl(set); - return (*(impl.fp->path))(impl.derived_impl); -} - -void icalset_mark(icalset* set) -{ - struct icalset_impl impl = icalset_get_impl(set); - (*(impl.fp->mark))(impl.derived_impl); -} - -icalerrorenum icalset_commit(icalset* set) -{ - struct icalset_impl impl = icalset_get_impl(set); - return (*(impl.fp->commit))(impl.derived_impl); -} - -icalerrorenum icalset_add_component(icalset* set, icalcomponent* comp) -{ - struct icalset_impl impl = icalset_get_impl(set); - return (*(impl.fp->add_component))(impl.derived_impl,comp); -} - -icalerrorenum icalset_remove_component(icalset* set, icalcomponent* comp) -{ - struct icalset_impl impl = icalset_get_impl(set); - return (*(impl.fp->remove_component))(impl.derived_impl,comp); -} - -int icalset_count_components(icalset* set,icalcomponent_kind kind) -{ - struct icalset_impl impl = icalset_get_impl(set); - return (*(impl.fp->count_components))(impl.derived_impl,kind); -} - -icalerrorenum icalset_select(icalset* set, icalcomponent* gauge) -{ - struct icalset_impl impl = icalset_get_impl(set); - return (*(impl.fp->select))(impl.derived_impl,gauge); -} - -void icalset_clear(icalset* set) -{ - struct icalset_impl impl = icalset_get_impl(set); - (*(impl.fp->clear))(impl.derived_impl); -} - -icalcomponent* icalset_fetch(icalset* set, const char* uid) -{ - struct icalset_impl impl = icalset_get_impl(set); - return (*(impl.fp->fetch))(impl.derived_impl,uid); -} - -icalcomponent* icalset_fetch_match(icalset* set, icalcomponent *comp) -{ - struct icalset_impl impl = icalset_get_impl(set); - return (*(impl.fp->fetch_match))(impl.derived_impl,comp); -} - - -int icalset_has_uid(icalset* set, const char* uid) -{ - struct icalset_impl impl = icalset_get_impl(set); - return (*(impl.fp->has_uid))(impl.derived_impl,uid); -} - -icalerrorenum icalset_modify(icalset* set, icalcomponent *old, - icalcomponent *new) -{ - struct icalset_impl impl = icalset_get_impl(set); - return (*(impl.fp->modify))(impl.derived_impl,old,new); -} - -icalcomponent* icalset_get_current_component(icalset* set) -{ - struct icalset_impl impl = icalset_get_impl(set); - return (*(impl.fp->get_current_component))(impl.derived_impl); -} - -icalcomponent* icalset_get_first_component(icalset* set) -{ - struct icalset_impl impl = icalset_get_impl(set); - return (*(impl.fp->get_first_component))(impl.derived_impl); -} - -icalcomponent* icalset_get_next_component(icalset* set) -{ - struct icalset_impl impl = icalset_get_impl(set); - return (*(impl.fp->get_next_component))(impl.derived_impl); -} - - - - diff --git a/libical/src/libicalss/icalset.h b/libical/src/libicalss/icalset.h deleted file mode 100644 index 7b083dae24..0000000000 --- a/libical/src/libicalss/icalset.h +++ /dev/null @@ -1,111 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalset.h - CREATOR: eric 28 November 1999 - - - Icalset is the "base class" for representations of a collection of - iCal components. Derived classes (actually delegatees) include: - - icalfileset Store componetns in a single file - icaldirset Store components in multiple files in a directory - icalheapset Store components on the heap - icalmysqlset Store components in a mysql database. - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The Original Code is eric. The Initial Developer of the Original - Code is Eric Busboom - - -======================================================================*/ - -#ifndef ICALSET_H -#define ICALSET_H - -#include <limits.h> /* For PATH_MAX */ -#include "ical.h" -#include "icalerror.h" - -#ifdef PATH_MAX -#define ICAL_PATH_MAX PATH_MAX -#else -#define ICAL_PATH_MAX 1024 -#endif - - - - -typedef void icalset; - -typedef enum icalset_kind { - ICAL_FILE_SET, - ICAL_DIR_SET, - ICAL_HEAP_SET, - ICAL_MYSQL_SET, - ICAL_CAP_SET -} icalset_kind; - - -/* Create a specific derived type of set */ -icalset* icalset_new_file(const char* path); -icalset* icalset_new_dir(const char* path); -icalset* icalset_new_heap(void); -icalset* icalset_new_mysql(const char* path); -/*icalset* icalset_new_cap(icalcstp* cstp);*/ - -void icalset_free(icalset* set); - -const char* icalset_path(icalset* set); - -/* Mark the cluster as changed, so it will be written to disk when it - is freed. Commit writes to disk immediately*/ -void icalset_mark(icalset* set); -icalerrorenum icalset_commit(icalset* set); - -icalerrorenum icalset_add_component(icalset* set, icalcomponent* comp); -icalerrorenum icalset_remove_component(icalset* set, icalcomponent* comp); - -int icalset_count_components(icalset* set, - icalcomponent_kind kind); - -/* Restrict the component returned by icalset_first, _next to those - that pass the gauge. _clear removes the gauge. */ -icalerrorenum icalset_select(icalset* set, icalcomponent* gauge); -void icalset_clear_select(icalset* set); - -/* Get a component by uid */ -icalcomponent* icalset_fetch(icalset* set, const char* uid); -int icalset_has_uid(icalset* set, const char* uid); -icalcomponent* icalset_fetch_match(icalset* set, icalcomponent *c); - -/* Modify components according to the MODIFY method of CAP. Works on - the currently selected components. */ -icalerrorenum icalset_modify(icalset* set, icalcomponent *oldc, - icalcomponent *newc); - -/* Iterate through the components. If a guage has been defined, these - will skip over components that do not pass the gauge */ - -icalcomponent* icalset_get_current_component(icalset* set); -icalcomponent* icalset_get_first_component(icalset* set); -icalcomponent* icalset_get_next_component(icalset* set); - -#endif /* !ICALSET_H */ - - - diff --git a/libical/src/libicalss/icalspanlist.c b/libical/src/libicalss/icalspanlist.c deleted file mode 100644 index cab6a81c68..0000000000 --- a/libical/src/libicalss/icalspanlist.c +++ /dev/null @@ -1,309 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: icalspanlist.c - CREATOR: ebusboom 23 aug 2000 - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - - ======================================================================*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "ical.h" -#include "icalspanlist.h" -#include "pvl.h" -#include <stdlib.h> /* for free and malloc */ - -struct icalspanlist_impl { - pvl_list spans; -}; - -int compare_span(void* a, void* b) -{ - struct icaltime_span *span_a = (struct icaltime_span *)a ; - struct icaltime_span *span_b = (struct icaltime_span *)b ; - - if(span_a->start == span_b->start){ - return 0; - } else if(span_a->start < span_b->start){ - return -1; - } else { /*if(span_a->start > span->b.start)*/ - return 1; - } -} - -icalcomponent* icalspanlist_get_inner(icalcomponent* comp) -{ - if (icalcomponent_isa(comp) == ICAL_VCALENDAR_COMPONENT){ - return icalcomponent_get_first_real_component(comp); - } else { - return comp; - } -} - - -void print_span(int c, struct icaltime_span span ); - - -/* Make a free list from a set of component */ -icalspanlist* icalspanlist_new(icalset *set, - struct icaltimetype start, - struct icaltimetype end) -{ - struct icaltime_span range; - pvl_elem itr; - icalcomponent *c,*inner; - icalcomponent_kind kind, inner_kind; - struct icalspanlist_impl *sl; - struct icaltime_span *freetime; - - if ( ( sl = (struct icalspanlist_impl*) - malloc(sizeof(struct icalspanlist_impl))) == 0) { - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - sl->spans = pvl_newlist(); - - range.start = icaltime_as_timet(start); - range.end = icaltime_as_timet(end); - - printf("Range start: %s",ctime(&range.start)); - printf("Range end : %s",ctime(&range.end)); - - - /* Get a list of spans of busy time from the events in the set - and order the spans based on the start time */ - - for(c = icalset_get_first_component(set); - c != 0; - c = icalset_get_next_component(set)){ - - struct icaltime_span span; - - kind = icalcomponent_isa(c); - inner = icalcomponent_get_inner(c); - - if(!inner){ - continue; - } - - inner_kind = icalcomponent_isa(inner); - - if( kind != ICAL_VEVENT_COMPONENT && - inner_kind != ICAL_VEVENT_COMPONENT){ - continue; - } - - icalerror_clear_errno(); - - span = icalcomponent_get_span(c); - span.is_busy = 1; - - if(icalerrno != ICAL_NO_ERROR){ - continue; - } - - if ((range.start < span.end && icaltime_is_null_time(end)) || - (range.start < span.end && range.end > span.start )){ - - struct icaltime_span *s; - - if ((s=(struct icaltime_span *) - malloc(sizeof(struct icaltime_span))) == 0){ - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - memcpy(s,&span,sizeof(span)); - - pvl_insert_ordered(sl->spans,compare_span,(void*)s); - - } - } - - /* Now Fill in the free time spans. loop through the spans. if the - start of the range is not within the span, create a free entry - that runs from the start of the range to the start of the - span. */ - - for( itr = pvl_head(sl->spans); - itr != 0; - itr = pvl_next(itr)) - { - struct icaltime_span *s = (icalproperty*)pvl_data(itr); - - if ((freetime=(struct icaltime_span *) - malloc(sizeof(struct icaltime_span))) == 0){ - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - if(range.start < s->start){ - freetime->start = range.start; - freetime->end = s->start; - - freetime->is_busy = 0; - - - pvl_insert_ordered(sl->spans,compare_span,(void*)freetime); - } else { - free(freetime); - } - - range.start = s->end; - } - - /* If the end of the range is null, then assume that everything - after the last item in the calendar is open and add a span - that indicates this */ - - if( icaltime_is_null_time(end)){ - struct icaltime_span* last_span; - - last_span = pvl_data(pvl_tail(sl->spans)); - - if (last_span != 0){ - - if ((freetime=(struct icaltime_span *) - malloc(sizeof(struct icaltime_span))) == 0){ - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - freetime->is_busy = 0; - freetime->start = last_span->end; - freetime->end = freetime->start; - pvl_insert_ordered(sl->spans,compare_span,(void*)freetime); - } - } - - - return sl; - -} - -void icalspanlist_free(icalspanlist* s) -{ - struct icaltime_span *span; - struct icalspanlist_impl* impl = (struct icalspanlist_impl*)s; - - while( (span=pvl_pop(impl->spans)) != 0){ - free(span); - } - - pvl_free(impl->spans); - - impl->spans = 0; -} - - -void icalspanlist_dump(icalspanlist* s){ - - int i = 0; - struct icalspanlist_impl* sl = (struct icalspanlist_impl*)s; - pvl_elem itr; - - for( itr = pvl_head(sl->spans); - itr != 0; - itr = pvl_next(itr)) - { - struct icaltime_span *s = (icalproperty*)pvl_data(itr); - - printf("#%02d %d start: %s",++i,s->is_busy,ctime(&s->start)); - printf(" end : %s",ctime(&s->end)); - - } -} - -icalcomponent* icalspanlist_make_free_list(icalspanlist* sl); -icalcomponent* icalspanlist_make_busy_list(icalspanlist* sl); - -struct icalperiodtype icalspanlist_next_free_time(icalspanlist* sl, - struct icaltimetype t) -{ - struct icalspanlist_impl* impl = (struct icalspanlist_impl*)sl; - pvl_elem itr; - struct icalperiodtype period; - struct icaltime_span *s; - - time_t rangett= icaltime_as_timet(t); - - period.start = icaltime_null_time(); - period.end = icaltime_null_time(); - - /* Is the reference time before the first span? If so, assume - that the reference time is free */ - itr = pvl_head(impl->spans); - s = (icalproperty*)pvl_data(itr); - - if (s == 0){ - /* No elements in span */ - return period; - } - - if(rangett <s->start ){ - /* End of period is start of first span if span is busy, end - of the span if it is free */ - period.start = t; - - if (s->is_busy == 0){ - period.end = icaltime_from_timet(s->start,0); - } else { - period.end = icaltime_from_timet(s->end,0); - } - - return period; - } - - /* Otherwise, find the first free span that contains the - reference time. */ - - for( itr = pvl_head(impl->spans); - itr != 0; - itr = pvl_next(itr)) - { - s = (icalproperty*)pvl_data(itr); - - if(s->is_busy == 0 && s->start >= rangett && - ( rangett < s->end || s->end == s->start)){ - - if (rangett < s->start){ - period.start = icaltime_from_timet(s->start,0); - } else { - period.start = icaltime_from_timet(rangett,0); - } - - period.end = icaltime_from_timet(s->end,0); - - return period; - } - - } - - period.start = icaltime_null_time(); - period.end = icaltime_null_time(); - - return period; -} - -struct icalperiodtype icalspanlist_next_busy_time(icalspanlist* sl, - struct icaltimetype t); - diff --git a/libical/src/libicalss/icalspanlist.h b/libical/src/libicalss/icalspanlist.h deleted file mode 100644 index 83cb1c8a6d..0000000000 --- a/libical/src/libicalss/icalspanlist.h +++ /dev/null @@ -1,54 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalspanlist.h - CREATOR: eric 21 Aug 2000 - - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - - =========================================================================*/ -#ifndef ICALSPANLIST_H -#define ICALSPANLIST_H - -#include "ical.h" -#include "icalset.h" - -typedef void icalspanlist; - -/* Make a free list from a set of component. Start and end should be in UTC */ -icalspanlist* icalspanlist_new(icalset *set, - struct icaltimetype start, - struct icaltimetype end); - -void icalspanlist_free(icalspanlist* spl); - -icalcomponent* icalspanlist_make_free_list(icalspanlist* sl); -icalcomponent* icalspanlist_make_busy_list(icalspanlist* sl); - -/* Get first free or busy time after time t. all times are in UTC */ -struct icalperiodtype icalspanlist_next_free_time(icalspanlist* sl, - struct icaltimetype t); -struct icalperiodtype icalspanlist_next_busy_time(icalspanlist* sl, - struct icaltimetype t); - -void icalspanlist_dump(icalspanlist* s); - -#endif - - - diff --git a/libical/src/libicalss/icalsslexer.l b/libical/src/libicalss/icalsslexer.l deleted file mode 100644 index 848a9bc74f..0000000000 --- a/libical/src/libicalss/icalsslexer.l +++ /dev/null @@ -1,113 +0,0 @@ -%{ -/* -*- Mode: C -*- - ====================================================================== - FILE: icalsslexer.l - CREATOR: eric 8 Aug 2000 - - DESCRIPTION: - - $Id: icalsslexer.l,v 1.1.1.2 2001/01/23 19:20:41 jpr Exp $ - $Locker: $ - -(C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The Original Code is eric. The Initial Developer of the Original - Code is Eric Busboom - - ======================================================================*/ - -#include "icalssyacc.h" -#include "icalgaugeimpl.h" -#include "assert.h" - -#include <string.h> /* For strdup() */ - -int icalparser_flex_input(char* buf, int max_size); -void icalparser_clear_flex_input(); - -#undef YY_INPUT -#define YY_INPUT(b,r,ms) ( r= icalparser_flex_input(b,ms)) - -#undef SS_FATAL_ERROR -#define SS_FATAL_ERROR(msg) sserror(msg) - - -%} - -crlf \x0D?\x0A -space [ ] -qsafechar [^\x00-\x1F\"] -safechar [^\x00-\x1F\"\:\;\,] -tsafechar [\x20-\x21\x23-\x2B\x2D-\x39\x3C-\x5B\x5D-\x7E] -valuechar [^\x00-\x08\x10-\x1F] -xname X-[a-zA-Z0-9\-]+ -xname2 [a-zA-Z0-9\-\ ] -paramtext {safechar}+ -value {valuechar}+ -quotedstring \"{qsafechar}+\" -digit [0-9] - -%array /* Make yytext an array. Slow, but handy. HACK */ - -%option caseless - -%s sql string_value - - - -%% - -%{ -%} - - -SELECT { return SELECT; } -FROM { return FROM; } -WHERE { return WHERE; } -, { return COMMA; } -"=" { return EQUALS; } -"!=" { return NOTEQUALS; } -"<" { return LESS; } -">" { return GREATER; } -"<=" { return LESSEQUALS; } -">=" { return GREATEREQUALS; } -AND { return AND; } -OR { return OR; } -\' { return QUOTE; } -[ \t\n\r]+ ; -; { return EOL; } -\'[\*A-Za-z0-9\-\.]+\' { - int c = input(); - unput(c); - if(c!='\''){ - sslval.v_string= icalmemory_tmp_copy(sstext); - return STRING; - } else { - /*ssmore();*/ - } -} - -[\*A-Za-z0-9\-\.]+ { sslval.v_string= icalmemory_tmp_copy(sstext); - return STRING; } - - -. { return yytext[0]; } - -%% - -int sswrap() -{ - return 1; -} - diff --git a/libical/src/libicalss/icalssutil.c b/libical/src/libicalss/icalssutil.c deleted file mode 100644 index 8db141d41d..0000000000 --- a/libical/src/libicalss/icalssutil.c +++ /dev/null @@ -1,29 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: icalssutil.c - CREATOR: ebusboom 23 aug 2000 - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - - ======================================================================*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - - diff --git a/libical/src/libicalss/icalssutil.h b/libical/src/libicalss/icalssutil.h deleted file mode 100644 index 3890da6a11..0000000000 --- a/libical/src/libicalss/icalssutil.h +++ /dev/null @@ -1,27 +0,0 @@ -/* -*- Mode: C -*- */ -/*====================================================================== - FILE: icalssutil.h - CREATOR: eric 21 Aug 2000 - - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - - =========================================================================*/ - -#include "ical.h" - diff --git a/libical/src/libicalss/icalssyacc.h b/libical/src/libicalss/icalssyacc.h deleted file mode 100644 index 9a933dc735..0000000000 --- a/libical/src/libicalss/icalssyacc.h +++ /dev/null @@ -1,22 +0,0 @@ -typedef union { - char* v_string; -} YYSTYPE; -#define STRING 257 -#define SELECT 258 -#define FROM 259 -#define WHERE 260 -#define COMMA 261 -#define QUOTE 262 -#define EQUALS 263 -#define NOTEQUALS 264 -#define LESS 265 -#define GREATER 266 -#define LESSEQUALS 267 -#define GREATEREQUALS 268 -#define AND 269 -#define OR 270 -#define EOL 271 -#define END 272 - - -extern YYSTYPE sslval; diff --git a/libical/src/libicalss/icalssyacc.y b/libical/src/libicalss/icalssyacc.y deleted file mode 100644 index 047b158e93..0000000000 --- a/libical/src/libicalss/icalssyacc.y +++ /dev/null @@ -1,245 +0,0 @@ -%{ -/* -*- Mode: C -*- - ====================================================================== - FILE: icalssyacc.y - CREATOR: eric 08 Aug 2000 - - DESCRIPTION: - - $Id: icalssyacc.y,v 1.1.1.2 2001/01/23 19:20:41 jpr Exp $ - $Locker: $ - -(C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The Original Code is eric. The Initial Developer of the Original - Code is Eric Busboom - - ======================================================================*/ - -#include <stdlib.h> -#include <string.h> /* for strdup() */ -#include <limits.h> /* for SHRT_MAX*/ -#include "ical.h" -#include "pvl.h" -#include "icalgauge.h" -#include "icalgaugeimpl.h" - - -extern struct icalgauge_impl *icalss_yy_gauge; - -void ssyacc_add_where(struct icalgauge_impl* impl, char* prop, - icalgaugecompare compare , char* value); -void ssyacc_add_select(struct icalgauge_impl* impl, char* str1); -void ssyacc_add_from(struct icalgauge_impl* impl, char* str1); -void set_logic(struct icalgauge_impl* impl,icalgaugelogic l); -void sserror(char *s); /* Don't know why I need this.... */ - - - -%} - -%union { - char* v_string; -} - - -%token <v_string> STRING -%token SELECT FROM WHERE COMMA QUOTE EQUALS NOTEQUALS LESS GREATER LESSEQUALS -%token GREATEREQUALS AND OR EOL END - -%% - -query_min: SELECT select_list FROM from_list WHERE where_list - | error { - icalparser_clear_flex_input(); - yyclearin; - } - ; - -select_list: - STRING {ssyacc_add_select(icalss_yy_gauge,$1);} - | select_list COMMA STRING {ssyacc_add_select(icalss_yy_gauge,$3);} - ; - - -from_list: - STRING {ssyacc_add_from(icalss_yy_gauge,$1);} - | from_list COMMA STRING {ssyacc_add_from(icalss_yy_gauge,$3);} - ; - -where_clause: - /* Empty */ - | STRING EQUALS STRING {ssyacc_add_where(icalss_yy_gauge,$1,ICALGAUGECOMPARE_EQUAL,$3); } - - | STRING NOTEQUALS STRING {ssyacc_add_where(icalss_yy_gauge,$1,ICALGAUGECOMPARE_NOTEQUAL,$3); } - | STRING LESS STRING {ssyacc_add_where(icalss_yy_gauge,$1,ICALGAUGECOMPARE_LESS,$3); } - | STRING GREATER STRING {ssyacc_add_where(icalss_yy_gauge,$1,ICALGAUGECOMPARE_GREATER,$3); } - | STRING LESSEQUALS STRING {ssyacc_add_where(icalss_yy_gauge,$1,ICALGAUGECOMPARE_LESSEQUAL,$3); } - | STRING GREATEREQUALS STRING {ssyacc_add_where(icalss_yy_gauge,$1,ICALGAUGECOMPARE_GREATEREQUAL,$3); } - ; - -where_list: - where_clause {set_logic(icalss_yy_gauge,ICALGAUGELOGIC_NONE);} - | where_list AND where_clause {set_logic(icalss_yy_gauge,ICALGAUGELOGIC_AND);} - | where_list OR where_clause {set_logic(icalss_yy_gauge,ICALGAUGELOGIC_OR);} - ; - - -%% - -void ssyacc_add_where(struct icalgauge_impl* impl, char* str1, - icalgaugecompare compare , char* value_str) -{ - - struct icalgauge_where *where; - char *compstr, *propstr, *c, *s,*l; - - if ( (where = malloc(sizeof(struct icalgauge_where))) ==0){ - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return; - } - - memset(where,0,sizeof(struct icalgauge_where)); - where->logic = ICALGAUGELOGIC_NONE; - where->compare = ICALGAUGECOMPARE_NONE; - where->comp = ICAL_NO_COMPONENT; - where->prop = ICAL_NO_PROPERTY; - - /* remove enclosing quotes */ - s = value_str; - if(*s == '\''){ - s++; - } - l = s+strlen(s)-1; - if(*l == '\''){ - *l=0; - } - - where->value = strdup(s); - - /* Is there a period in str1 ? If so, the string specified both a - component and a property*/ - if( (c = strrchr(str1,'.')) != 0){ - compstr = str1; - propstr = c+1; - *c = '\0'; - } else { - compstr = 0; - propstr = str1; - } - - - /* Handle the case where a component was specified */ - if(compstr != 0){ - where->comp = icalenum_string_to_component_kind(compstr); - } else { - where->comp = ICAL_NO_COMPONENT; - } - - where->prop = icalenum_string_to_property_kind(propstr); - - where->compare = compare; - - if(where->value == 0){ - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - free(where->value); - return; - } - - pvl_push(impl->where,where); -} - -void set_logic(struct icalgauge_impl* impl,icalgaugelogic l) -{ - pvl_elem e = pvl_tail(impl->where); - struct icalgauge_where *where = pvl_data(e); - - where->logic = l; - -} - - - -void ssyacc_add_select(struct icalgauge_impl* impl, char* str1) -{ - char *c, *compstr, *propstr; - struct icalgauge_where *where; - - /* Uses only the prop and comp fields of the where structure */ - if ( (where = malloc(sizeof(struct icalgauge_where))) ==0){ - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return; - } - - memset(where,0,sizeof(struct icalgauge_where)); - where->logic = ICALGAUGELOGIC_NONE; - where->compare = ICALGAUGECOMPARE_NONE; - where->comp = ICAL_NO_COMPONENT; - where->prop = ICAL_NO_PROPERTY; - - /* Is there a period in str1 ? If so, the string specified both a - component and a property*/ - if( (c = strrchr(str1,'.')) != 0){ - compstr = str1; - propstr = c+1; - *c = '\0'; - } else { - compstr = 0; - propstr = str1; - } - - - /* Handle the case where a component was specified */ - if(compstr != 0){ - where->comp = icalenum_string_to_component_kind(compstr); - } else { - where->comp = ICAL_NO_COMPONENT; - } - - - /* If the property was '*', then accept all properties */ - if(strcmp("*",propstr) == 0) { - where->prop = ICAL_ANY_PROPERTY; - } else { - where->prop = icalenum_string_to_property_kind(propstr); - } - - - if(where->prop == ICAL_NO_PROPERTY){ - icalgauge_free(where); - icalerror_set_errno(ICAL_BADARG_ERROR); - return; - } - - pvl_push(impl->select,where); -} - -void ssyacc_add_from(struct icalgauge_impl* impl, char* str1) -{ - icalcomponent_kind ckind; - - ckind = icalenum_string_to_component_kind(str1); - - if(ckind == ICAL_NO_COMPONENT){ - assert(0); - } - - pvl_push(impl->from,(void*)ckind); - -} - - -void sserror(char *s){ - fprintf(stderr,"Parse error \'%s\'\n", s); -} diff --git a/libical/src/libicalvcal/.cvsignore b/libical/src/libicalvcal/.cvsignore deleted file mode 100644 index 533caa2f3d..0000000000 --- a/libical/src/libicalvcal/.cvsignore +++ /dev/null @@ -1,12 +0,0 @@ -*.la -*.lo -.libs -.deps -Makefile -Makefile.in -libtool -ltconfig -ltmain.sh -stamp-h -stamp-h.in -vcc.c
\ No newline at end of file diff --git a/libical/src/libicalvcal/Makefile.am b/libical/src/libicalvcal/Makefile.am deleted file mode 100644 index c409347d14..0000000000 --- a/libical/src/libicalvcal/Makefile.am +++ /dev/null @@ -1,29 +0,0 @@ -lib_LTLIBRARIES = libicalvcal.la - -INCLUDES = \ - -I$(top_builddir) \ - -I$(top_srcdir)/src/libical \ - -I$(top_builddir)/src/libical \ - -I$(top_srcdir)/src/libicalss - -libicalvcal_la_LDFLAGS = -version-info 0:0:0 - -libicalvcal_la_SOURCES = \ - icalvcal.c \ - vcc.y \ - vobject.c \ - vcaltmp.c - -libicalvcalincludedir = $(includedir)/libicalvcal - -libicalvcalinclude_HEADERS = \ - icalvcal.h \ - port.h \ - vcc.h \ - vobject.h \ - vcaltmp.h - -EXTRA_DIST = \ - README.TXT \ - vcaltest.c \ - vctest.c diff --git a/libical/src/libicalvcal/README.TXT b/libical/src/libicalvcal/README.TXT deleted file mode 100644 index c8ce8b0979..0000000000 --- a/libical/src/libicalvcal/README.TXT +++ /dev/null @@ -1,951 +0,0 @@ -NOTE: If you used the earlier APIs released by Versit
-then you will want to look at the document "migrate.doc"
-included with this package. It contains a discussion of
-the differences between the old API and this one.
-
-----------------------------------------------------------------
-
-The vCard/vCalendar C interface is implemented in the set
-of files as follows:
-
-vcc.y, yacc source, and vcc.c, the yacc output you will use
-implements the core parser
-
-vobject.c implements an API that insulates the caller from
-the parser and changes in the vCard/vCalendar BNF
-
-port.h defines compilation environment dependent stuff
-
-vcc.h and vobject.h are header files for their .c counterparts
-
-vcaltmp.h and vcaltmp.c implement vCalendar "macro" functions
-which you may find useful.
-
-test.c is a standalone test driver that exercises some of
-the features of the APIs provided. Invoke test.exe on a
-VCARD/VCALENDAR input text file and you will see the pretty
-print output of the internal representation (this pretty print
-output should give you a good idea of how the internal
-representation looks like -- there is one such output in the
-following too). Also, a file with the .out suffix is generated
-to show that the internal representation can be written back
-in the original text format.
-
------------------------------------------------------------------
-
-
- VObject for VCard/VCalendar
-
-Table of Contents
-=================
-1. VObject
-2. Internal Representations of VCard/VCalendar
-3. Iterating Through VObject's Properties or Values
-4. Pretty Printing a VObject Tree
-5. Building A VObject Representation of A VCard/VCalendar
-6. Converting A VObject Representation Into Its Textual Representation
-7. Miscellaneous Notes On VObject APIs usages
-8. Brief descriptions of each APIs
-9. Additional Programming Notes.
-
-This document is mainly about the VObject and its APIs. The main
-use of a VObject is to represent a VCard or a VCalendar inside
-a program. However, its use is not limited to aforemention as it
-can represent an arbitrary information that makes up of a tree or
-forest of properties/values.
-
-1. VObject
- =======
-A VObject can have a name (id) and a list of associated properties and
-a value. Each property is itself a VObject.
-
-2. Internal Representations of VCard/VCalendar
- ===========================================
-A list of VCard or a VCalendar is represented by a list of VObjects.
-The name (id) of the VObjects in the list is either VCCardProp or
-VCCalProp. Each of these VObjects can have a list of properties.
-Since a property is represented as a VObject, each of these properties
-can have a name, a list of properties, and a value.
-
-For example, the input file "vobject.vcf":
-
-BEGIN:VCARD
-N:Alden;Roland
-FN:Roland H. Alden
-ORG:AT&T;Versit Project Office
-TITLE:Consultant
-EMAIL;WORK;PREF;INTERNET:sf!rincon!ralden@alden.attmail.com
-EMAIL;INTERNET:ralden@sfgate.com
-EMAIL;MCIMail:242-2200
-LABEL;DOM;POSTAL;PARCEL;HOME;WORK;QUOTED-PRINTABLE:Roland H. Alden=0A=
-Suite 2208=0A=
-One Pine Street=0A=
-San Francisco, CA 94111
-LABEL;POSTAL;PARCEL;HOME;WORK;QUOTED-PRINTABLE:Roland H. Alden=0A=
-Suite 2208=0A=
-One Pine Street=0A=
-San Francisco, CA 94111=0A=
-U.S.A.
-TEL;WORK;PREF;MSG:+1 415 296 9106
-TEL;WORK;FAX:+1 415 296 9016
-TEL;MSG;CELL:+1 415 608 5981
-ADR:;Suite 2208;One Pine Street;San Francisco;CA;94111;U.S.A.
-SOUND:ROW-LAND H ALL-DIN
-LOGO;GIF;BASE64:
- R0lGODdhpgBOAMQAAP///+/v797e3s7Ozr29va2trZycnIyMjHt7e2NjY1JSUkJC
- QjExMSEhIRAQEO///87v9973/73n95zW71K13jGl1nvG50Kt3iGc1gCMzq3e94zO
- 7xCU1nO952O15wAAACwAAAAApgBOAAAF/yAgjmRpnmiqrmzrvnAsz3Rt33iu73zv
- /8CgcEj8QTaeywWTyWCUno2kSK0KI5tLc8vtNi+WiHVMlj0mFK96nalsxOW4fPSw
- cNj4tQc+7xcjGh4WExJTJYUTFkp3eU0eEH6RkpOUlTARhRoWm5ydFpCWoS0QEqAu
- ARKaHRcVjV0borEoFl0cSre4Sq67FA+yvwAeTU8XHZ7HmxS6u2wVfMCVpAE3pJoW
- ylrMptDcOqSF4OHg3eQ5pInInb7lcc86mNbLzBXsZbRfUOn6ucyNHvVWJHCpQFDf
- MWwEEzLqx2YCQCqF3OnItClJNmYcJD7cSAKTuI/gtnEcOQKkyVIk6/+ds5CkFcMM
- 61LiENikwi1jBnNyuvUSjwWZOS5uIZarqNFcNl32XMMB6I06GgoJ+bZp1ZKeDl8E
- +MC1K1cBIhZ4HUu2LAsCZdOWRQDt20lxIlccSHsgrNq7Xc/ixcsWmNu34WKyYJCW
- gQjCe9XqTZy2L4pv04gg2sSKSc8OLgTcBSuWsdkVaD2TdXyiQxebFyjo1Gnx6tJm
- LuaqrdtZtNfFtruSNmF5IKujwIsmJbjwtRqNJhrcNVw79wcRAgogmE4ArIjQzj/s
- JvHAGCFDQR4UqigPK4sBe62XwO51OwADiMcqUG+iOdcFAL+hW20BfAoEexlwAnu6
- mZDAXQ1EVh//WfhxJB5gIbHgwFgOTOiVAgOuVQKAfKFg3weGwSBYFZMp4hpDGKyA
- 3lgJKECWgiMQyBVpW+0V4oJjNfhCNkR1IgWEb21QlRK9GdfFCgeOZYBsXgm4noYj
- GEBhAQHYh0J8XenoQnFGdrkUciJY6FUAK15ogozakcBhliKsyZWHDMZQ0wWC/Aim
- DB6h01KRr/lXQgFxAqDcWDACgCZpUnrVQJtjwTnWjS6MWAYqqfDnSaEkJOlVXQBo
- 2pWTMUJ53WgAuPncCR9q6VQMAYjZlXWJmknCoSUM2p4BC+SaKwG88hoZlvfFMM4f
- hQh5TXkv+RklWYtC91mopJIAKFkJlDAW/wF25ShnLbeo5gmQ+1FGkJdrKCuCi2OR
- BuwHBcwqKgABrMtVAgpem61XkLbAJ7n8uiIpvGVhO4KpH1QLbbpqLheZvQCkGoNL
- thSzSTg2UGVBBzbtaxwKsYrmgLvRAlCmWgwMAADD66rKAgR3XlGspcdkZYK8ibU7
- asgEl+XAyB8I7PCqMWiWncGGimpfAgO4ypXSPpOVLwsRCDJxRD2AoyeRRv5kApO5
- fXwzwvfOKLKtaTWtbQxccmGLTZy8xYlVSvXbhbk0M2YzrYfJJ0K8m+V9NgxpyC04
- UycI/aiuiH9Y8NftDUwWp1Wm5UABnAUKwwRsPFGBt4Oc9PZvGvNLwf8JOZt8Arpe
- eY23yDovwIDiBX74NAsPVLDJj3Hh4JEExsKcjrlKf9DsCVx3ZfLqAKBuG1s/A90C
- z2KjYHjjyPOdG1spz6BBUr+BcUxUb1nDCTa/VZD2Uv+YkLPAKJC9dNEh7628WgqI
- ybzlaA+ufxMa6bxC6ciLUQLcx5UGIAAsAkDA6wQkOxrcY39yo4cQMNWCAPTKV1R4
- wPkgaBxzOc8FtMiF1NoGoXBRJjgoPApmPsjCFlbMdzCM4TFy50IXxI2DPcHAv2rY
- gghsEIeu8CAPW6ABIPYEFkOsAeaMyIz0JfGJUExBBGRIRX0IMYovWCIT1eBELNpA
- i1vcgta8iANPCIQOghzQABl30J0tXqBla4wjFLFQxZzAUY42CIAd5OYBCuKxB2c4
- I0b28EcrQKADgmSKB9RYyDhA4BqCxIBqrtjIMTwoFeCjYSU3KZMQAAA7
-
-BEGIN:VCALENDAR
-DCREATED:19960523T100522
-PRODID:-//Alden Roland/Hand Crafted In North Carolina//NONSGML Made By Hand//EN
-VERSION:0.3
-BEGIN:VEVENT
-START:19960523T120000
-END:19960523T130000
-SUBTYPE:PHONE CALL
-SUMMARY:VERSIT PDI PR Teleconference/Interview
-DESCRIPTION:VERSIT PDI PR Teleconference/Interview With Tom Streeter and Alden Roland
-END:VEVENT
-BEGIN:VEVENT
-START:19960523T113000
-END:19960523T115500
-SUBTYPE:LUNCH
-SUMMARY:Eat in the cafeteria today
-END:VEVENT
-END:VCALENDAR
-
-END:VCARD
-
-
-will conceptually be be represented as
- vcard
- VCNameProp
- VCFamilyNameProp=Alden
- VCGivenNameProp=Roland
- VCFullNameProp=Roland H.Alden
- ....
-
-note that
- EMAIL;WORK;PREF;INTERNET:sf!rincon!ralden@alden.attmail.com
-will be represented as:
- VCEmailAddress=sf!rincon!ralden@alden.attmail.com
- VCWork
- VCPreferred
- VCInternet
-where the lower level properties are properties of the property
-VCEmailAddress.
-
-Groupings are flattened out in the VObject representation such
-that:
- a.b:blah
- a.c:blahblah
-are represented as:
- b=blah
- VCGrouping=a
- c=blahblah
- VCGrouping=a
-i.e. one can read the above as:
- the property "b" has value "blah" and property "VCGrouping"
- with the value "a".
- the property "c" has value "blahblah" and property "VCGrouping"
- with the value "a".
-likewise, multi-level groupings are flatten similarly. e.g.
- a.b.c:blah
- a.b.e:blahblah
--->
- c=blah
- VCGrouping=b
- VCGrouping=a
- e=blahblah
- VCGrouping=b
- VCGrouping=a
-which read:
- the property "c" has value "blah" and property "VCGrouping"
- with the value "b" which has property "VCGrouping"
- with value "a".
- the property "e" has value "blahblah" and property "VCGrouping"
- with the value "b" which has property "VCGrouping"
- with value "a".
-
-3. Iterating Through VObject's Properties or Values
- ================================================
-The following is a skeletal form of iterating through
-all properties of a vobject, o:
-
- // assume the object of interest, o, is of type VObject
- VObjectIterator i;
- initPropIterator(&i,o);
- while (moreIteration(&i)) {
- VObject *each = nextVObject(&i);
- // ... do something with "each" property
- }
-
-Use the API vObjectName() to access a VObject's name.
-Use the API vObjectValueType() to determine if a VObject has
- a value. For VCard/VCalendar application, you
- should not need this function as practically
- all values are either of type VCVT_USTRINGZ or
- VCVT_RAW (i.e set by setVObjectUStringZValue and
- setVObjectAnyValue APIs respectively), and the
- value returned by calls to vObjectUStringZValue
- and vObjectAnyValue are 0 if a VObject has no
- value. (There is a minor exception where VObject with
- VCDataSizeProp has value that is set by
- setVObjectLongValue).
-Use the APIs vObject???Value() to access a VObject's value.
- where ??? is the expected type.
-Use the APIs setvObject???Value() to set or modify a VObject's value.
- where ??? is the expected type.
-Use the API isAPropertyOf() to query if a name match the name of
- a property of a VObject. Since isAPropertyOf() return
- the matching property, we can use that to retrieve
- a property and subsequently the value of the property.
-
-4. Pretty Printing a VObject Tree
- ==============================
-VObject tree can be pretty printed with the printVObject() function.
-The output of pretty printing a VObject representation of the input
-test file "vobject.vcf" is shown below. Note that the indentation
-indicates the tree hirerarchy where the immediate children nodes
-of a parent node is all at the same indentation level and the
-immediate children nodes are the immediate properties of the
-associated parent nodes. In the following, {N,FN,ORG,TITLE,...}
-are immediate properties of VCARD. {F and G} are properties of N
-with value {"Alden" and "Roland"} respectively; FN has no property
-but has the value "Roland H. Alden"; EMAIL has value and
-the properties WORK, PREF, and INTERNET.
-
-
-VCARD
- N
- F="Alden"
- G="Roland"
- FN="Roland H. Alden"
- ORG
- ORGNAME="AT&T"
- OUN="Versit Project Office"
- TITLE="Consultant"
- EMAIL="sf!rincon!ralden@alden.attmail.com"
- WORK
- PREF
- INTERNET
- EMAIL="ralden@sfgate.com"
- INTERNET
- EMAIL="242-2200"
- MCIMail
- LABEL="Roland H. Alden
- Suite 2208
- One Pine Street
- San Francisco, CA 94111"
- DOM
- POSTAL
- PARCEL
- HOME
- WORK
- QP
- LABEL="Roland H. Alden
- Suite 2208
- One Pine Street
- San Francisco, CA 94111
- U.S.A."
- POSTAL
- PARCEL
- HOME
- WORK
- QP
- TEL="+1 415 296 9106"
- WORK
- PREF
- MSG
- TEL="+1 415 296 9016"
- WORK
- FAX
- TEL="+1 415 608 5981"
- MSG
- CELL
- ADR
- EXT ADD="Suite 2208"
- STREET="One Pine Street"
- L="San Francisco"
- R="CA"
- PC="94111"
- C="U.S.A."
- SOUND="ROW-LAND H ALL-DIN"
- LOGO=[raw data]
- GIF
- BASE64
- DataSize=1482
-VCALENDAR
- DCREATED="19960523T100522"
- PRODID="-//Alden Roland/Hand Crafted In North Carolina//NONSGML Made By Hand//EN"
- VERSION="0.3"
- VEVENT
- START="19960523T120000"
- END="19960523T130000"
- SUBTYPE="PHONE CALL"
- SUMMARY="VERSIT PDI PR Teleconference/Interview"
- DESCRIPTION="VERSIT PDI PR Teleconference/Interview With Tom Streeter and Alden Roland"
- VEVENT
- START="19960523T113000"
- END="19960523T115500"
- SUBTYPE="LUNCH"
- SUMMARY="Eat in the cafeteria today"
-
-5. Building A VObject Representation of A VCard/VCalendar
- ======================================================
-The parser in vcc.y converts an input file with one or more
-VCard/VCalendar that is in their textual representation
-into their corresponding VObject representation.
-
-VObject representation of a VCard/VCalendar can also be built
-directly with calls to the VObject building APIs. e.g.
-
- VObject *prop;
- VObject *vcard = newVObject(VCCardProp);
- prop = addProp(vcard,VCNameProp);
- addPropValue(prop,VCFamilyNameProp,"Alden");
- addPropValue(prop,VCGivenNameProp,"Roland");
- addPropValue(vcard,VCFullNameProp,"Roland H. Alden");
- ....
-
-6. Converting A VObject Representation Into Its Textual Representation
- ===================================================================
-The VObject representation can be converted back to its textual
-representation via the call to writeVObject() or writeMemVObject()
-API. e.g.
- a. to write to a file:
- // assume vcard is of type VObject
- FILE *fp = fopen("alden.vcf","w");
- writeVObject(fp,vcard);
- a. to write to memory, and let the API allocate the required memory.
- char* clipboard = writeVObject(0,0,vcard);
- ... do something to clipboard
- free(clipboard);
- b. to write to a user allocated buffer:
- char clipboard[16384];
- int len = 16384;
- char *buf = writeVObject(clipboard,&len,vcard);
- ... buf will be equal to clipboard if the write
- is successful otherwise 0.
-
-In the case of writing to memory, the memory buffer can be either
-allocated by the API or the user. If the user allocate the
-memory for the buffer, then the length of the buffer needs to be
-communicated to the API via a variable. The variable passed as
-the length argument will be overwritten with the actual size
-of the text output. A 0 return value from writeMemVObject()
-indicates an error which could be caused by overflowing the
-size of the buffer or lack of heap memory.
-
-7. Miscellaneous Notes On VObject APIs usages
- ==========================================
-a. vcc.h -- contains basic interfaces to the parser:
- VObject* Parse_MIME(const char *input, unsigned long len);
- VObject* Parse_MIME_FromFile(FILE *file);
- -- both of this return a null-terminated list of
- VObject that is either a VCARD or VCALENDAR.
- To iterate through this list, do
- VObject *t, *v;
- v = Parse_Mime_FromFile(fp);
- while (v) {
- // ... do something to v.
- t = v;
- v = nextVObjectInList(v);
- cleanVObject(t);
- }
- note that call to cleanVObject will release
- resource used to represent the VObject.
-
-b. vobject.h -- contains basic interfaces to the VObject APIs.
- see the header for more details.
- The structure of VObject is purposely (hiddened) not exposed
- to the user. Every access has to be done via
- the APIs. This way, if we need to change the
- structure or implementation, the client need not
- recompile as long as the interfaces remain the
- same.
-
-c. values of a property is determined by the property definition
- itself. The vobject APIs does not attempt to enforce
- any of such definition. It is the consumer responsibility
- to know what value is expected from a property. e.g
- most properties have unicode string value, so to access
- the value of these type of properties, you will use
- the vObjectUStringZValue() to read the value and
- setVObjectUStringZValue() to set or modify the value.
- Refer to the VCard and VCalendar specifications for
- the definition of each property.
-
-d. properties name (id) are case incensitive.
-
-8. Brief descriptions of each APIs
- ===============================
- * the predefined properties' names (id) are listed under vobject.h
- each is of the form VC*Prop. e.g.
- #define VC7bitProp "7BIT"
- #define VCAAlarmProp "AALARM"
- ....
-
- * consumer of a VObject can only define pointers to VObject.
-
- * a variable of type VObjectIterator, say "i", can be used to iterate
- through a VObject's properties, say "o". The APIs related to
- VObjectIterator are:
- void initPropIterator(VObjectIterator *i, VObject *o);
- -- e.g. usage
- initPropIterator(&i,o);
- int moreIteration(VObjectIterator *i);
- -- e.g. usage
- while (moreIteration(&i)) { ... }
- VObject* nextVObject(VObjectIterator *i);
- -- e.g. usage
- while (moreIteration(&i)) {
- VObject *each = nextVObject(&i);
- }
-
- * VObject can be chained together to form a list. e.g. of such
- use is in the parser where the return value of the parser is
- a link list of VObject. A link list of VObject can be
- built by:
- void addList(VObject **o, VObject *p);
- and iterated by
- VObject* nextVObjectInList(VObject *o);
- -- next VObjectInList return 0 if the list
- is exhausted.
-
- * the following APIs are mainly used to construct a VObject tree:
- VObject* newVObject(const char *id);
- -- used extensively internally by VObject APIs but when
- used externally, its use is mainly limited to the
- construction of top level object (e.g. an object
- with VCCardProp or VCCalendarProp id).
-
- void deleteVObject(VObject *p);
- -- to deallocate single VObject, for most user, use
- cleanVObject(VObject *o) instead for freeing all
- resources associated with the VObject.
-
- char* dupStr(const char *s, unsigned int size);
- -- duplicate a string s. If size is 0, the string is
- assume to be a null-terminated.
-
- void deleteStr(const char *p);
- -- used to deallocate a string allocated by dupStr();
-
- void setVObjectName(VObject *o, const char* id);
- -- set the id of VObject o. This function is not
- normally used by the user. The setting of id
- is normally done as part of other APIs (e.g.
- addProp()).
-
- void setVObjectStringZValue(VObject *o, const char *s);
- -- set a string value of a VObject.
-
- void setVObjectUStringZValue(VObject *o, const wchar_t *s);
- -- set a Unicode string value of a VObject.
-
- void setVObjectIntegerValue(VObject *o, unsigned int i);
- -- set an integer value of a VObject.
-
- void setVObjectLongValue(VObject *o, unsigned long l);
- -- set an long integer value of a VObject.
-
- void setVObjectAnyValue(VObject *o, void *t);
- -- set any value of a VObject. The value type is
- unspecified.
-
- VObject* setValueWithSize(VObject *prop, void *val, unsigned int size);
- -- set a raw data (stream of bytes) value of a VObject
- whose size is size. The internal VObject representation
- is
- this object = val
- VCDataSizeProp=size
- i.e. the value val will be attached to the VObject prop
- and a property of VCDataSize whose value is size
- is also added to the object.
-
- void setVObjectVObjectValue(VObject *o, VObject *p);
- -- set a VObject as the value of another VObject.
-
- const char* vObjectName(VObject *o);
- -- retrieve the VObject's Name (i.e. id).
-
- const char* vObjectStringZValue(VObject *o);
- -- retrieve the VObject's value interpreted as
- null-terminated string.
-
- const wchar_t* vObjectUStringZValue(VObject *o);
- -- retrieve the VObject's value interpreted as
- null-terminated unicode string.
-
- unsigned int vObjectIntegerValue(VObject *o);
- -- retrieve the VObject's value interpreted as
- integer.
-
- unsigned long vObjectLongValue(VObject *o);
- -- retrieve the VObject's value interpreted as
- long integer.
-
- void* vObjectAnyValue(VObject *o);
- -- retrieve the VObject's value interpreted as
- any value.
-
- VObject* vObjectVObjectValue(VObject *o);
- -- retrieve the VObject's value interpreted as
- a VObject.
-
- VObject* addVObjectProp(VObject *o, VObject *p);
- -- add a VObject p as a property of VObject o.
- (not normally used externally for building a
- VObject).
-
- VObject* addProp(VObject *o, const char *id);
- -- add a property whose name is id to VObject o.
-
- VObject* addPropValue(VObject *o, const char *id, const char *v);
- -- add a property whose name is id and whose value
- is a null-terminated string to VObject o.
-
- VObject* addPropSizedValue(VObject *o, const char *id,
- const char *v, unsigned int size);
- -- add a property whose name is id and whose value
- is a stream of bytes of size size, to VObject o.
-
- VObject* addGroup(VObject *o, const char *g);
- -- add a group g to VObject o.
- e.g. if g is a.b.c, you will have
- o
- c
- VCGroupingProp=b
- VCGroupingProp=a
- and the object c is returned.
-
- VObject* isAPropertyOf(VObject *o, const char *id);
- -- query if a property by the name id is in o and
- return the VObject that represent that property.
-
- void printVObject(VObject *o);
- -- pretty print VObject o to stdout (for debugging use).
-
- void writeVObject(FILE *fp, VObject *o);
- -- convert VObject o to its textual representation and
- write it to file.
-
- char* writeMemVObject(char *s, int *len, VObject *o);
- -- convert VObject o to its textual representation and
- write it to memory. If s is 0, then memory required
- to hold the textual representation will be allocated
- by this API. If a variable len is passed, len will
- be overwriten with the byte size of the textual
- representation. If s is non-zero, then s has to
- be a user allocated buffer whose size has be passed
- in len as a variable. Memory allocated by the API
- has to be freed with call to free. The return value
- of this API is either the user supplied buffer,
- the memory allocated by the API, or 0 (in case of
- failure).
-
- void cleanStrTbl();
- -- this function has to be called when all
- VObject has been destroyed.
-
- void cleanVObject(VObject *o);
- -- release all resources used by VObject o.
-
- wchar_t* fakeUnicode(const char *ps, int *bytes);
- -- convert char* to wchar_t*.
-
- extern int uStrLen(const wchar_t *u);
- -- length of unicode u.
-
- char *fakeCString(const wchar_t *u);
- -- convert wchar_t to CString (blindly assumes that
- this could be done).
-
-9. Additional Programming Notes
- ============================
-In the following notes, please refers to the listing
-of Example.vcf and its VObject Representation
-(shown at the end of this section).
-
-* Handling the Return Value of the VCard/VCalendar Parser
- The example input text file contains two root VObjects
- (a VCalendar and a VCard). The output of the VCard/VCalendar
- parser is a null-terminated list of VObjects. For this
- particular input file, the list will have two VObjects.
- The following shows a template for iterating through the
- output of the Parser:
-
- VObject *t, *v;
- v = Parse_Mime_fromFileName("example.vcf");
- while (v) {
- // currently, v will either be a VCard or a VCalendar
- // do whatever your application need to do to
- // v here ...
- t = v;
- v = nextVObjectInList(v);
- cleanVObject(t);
- }
-
-* Iterating Through a VCard/VCalendar VObject
- From the VObject APIs point of view, a VCard VObject
- is the same as a VCalendar VObject. However, the application
- needs to know what are in a VCard or a VCalendar.
- For example, A VCalendar VObject can have VCDCreatedProp,
- a VCGEOLocationProp, etc, and one or more VCEventProp and
- or VCTodoProp. The VCEventProp and VCTodoProp can have
- many properties of their own, which in turn could have
- more properties (e.g. VCDAlarmProp can be a VCEventProp
- VObject's property, and VCRunTimeProp can be a
- VCDAlarmProp VObject's property. Because a VObject tree
- can be arbitrarily complex, in general, to process all
- properties and values of a VObject tree, a recursive walk
- is desirable. An example recursive VObject tree walk
- can be found in the vobject.c source lines for printVObject*
- and writeVObject* APIs. Depending on what the application need
- to do with a VCard or a VCalendar, a recursive walk
- of the VObject tree may or may not be desirable. An example
- template of a non-recursive walk is shown below:
-
- void processVCardVCalendar(char *inputFile)
- {
- VObject *t, *v;
- v = Parse_Mime_fromFileName(inputFile);
- while (v) {
- char *n = vObjectName(v);
- if (strcmp(n,VCCardProp) == 0) {
- do_VCard(v);
- }
- else if (strcmp(n,VCCalendarProp) == 0) {
- do_VCalendar(v);
- }
- else {
- // don't know how to handle anything else!
- }
- t = v;
- v = nextVObjectInList(v);
- cleanVObject(t);
- }
- }
-
- void do_VCard(VObject *vcard)
- {
- VObjectIterator t;
- initPropIterator(&t,vcard);
- while (moreIteration(&t)) {
- VObject *eachProp = nextVObject(&t);
- // The primarly purpose of this example is to
- // show how to iterate through a VCard VObject,
- // it is not meant to be efficient at all.
- char *n = vObjectName(eachProp);
- if (strcmp(n,VCNameProp)==0) {
- do_name(eachProp);
- }
- else if (strcmp(n,VCEmailProp)==0) {
- do_email(eachProp);
- }
- else if (strcmp(n,VCLabelProp)==0) {
- do_label(eachProp);
- }
- else if ....
- }
- }
-
- void do_VCalendar(VObject *vcal)
- {
- VObjectIterator t;
- initPropIterator(&t,vcard);
- while (moreIteration(&t)) {
- VObject *eachProp = nextVObject(&t);
- // The primarly purpose of this example is to
- // show how to iterate through a VCalendar VObject,
- // it is not meant to be efficient at all.
- char *n = vObjectName(eachProp);
- if (strcmp(n,VCDCreatedProp)==0) {
- do_DCreated(eachProp);
- }
- else if (strcmp(n,VCVersionProp)==0) {
- do_Version(eachProp);
- }
- else if (strcmp(n,VCTodoProp)==0) {
- do_Todo(eachProp);
- }
- else if (strcmp(n,VCEventProp)==0) {
- do_Event(eachProp);
- }
- else if ....
- }
- }
-
- void do_Todo(VObject *vtodo) { ... }
-
- void do_Event(VObject *vevent) { ... }
-
- ...
-
-* Property's Values and Properties
- The VObject APIs do not attempt to check for the
- correctness of the values of a property. Nor do they
- will prevent the user from attaching a non-VCard/VCalendar
- standard property to a VCard/VCalendar property. Take
- the example of line [11] of the example, "O.K" is not
- a valid value of VCStatusProp. It is up to the application
- to accept or reject the value of a property.
-
-* Output of printVObject
- PrintVObject pretty prints a VObject tree in human
- readable form. See the listing at the end of the file
- for an example output of printVObject on the example
- input file "Example.vcf".
-
- Note that binary data are not shown in the output of
- printVObject. Instead, a note is made ([raw data]) to
- indicate that there exists such a binary data.
-
-* Note on Binary Data
- When the value of a property is a binary data, it is only
- useful to know the size of the binary data.
-
- In the case of the VCard/VCalendar parser, it chooses
- to represent the size information as a separate property
- called VCDataSizeProp whose value is the size of the binary
- data. The APIs sequence to construct the VObject subtree
- of line [44] of Example.vcf is
-
- // VObject *vcard;
- VObject *p1 = addProp(vcard,VCLogoProp);
- (void) addProp(p1,VCGIFProp);
- (void) addProp(p1,VCBASE64Prop);
- VObject *p2 = addProp(p1,VCDataSizeProp);
- (void) setVObjectLongValue(p2,1482);
- setVObjectAnyValue(vcard,...pointer to binary data);
-
- Note the presence of VCBase64Prop will cause the
- writeVObject API to output the binary data as BASE64 text.
- For VCard/VCalendar application, having the VCBase64Prop
- property is pratically always neccessary for property with
- binary data as its value.
-
-* Note on Quoted-Printable String
- String value with embedded newline are written out as
- quoted-prinatable string. It is therefore important
- to mark a property with a string value that has
- one or more embedded newlines, with the VCQutedPrintableProp
- property. e.g.
-
- // VObject *root;
- char *msg="To be\nor\nnot to be";
- VObject *p = addPropValue(root,VCDescriptionProp,msg);
- // the following is how you mark a property with
- // a property. In this case, the marker is
- // VCQuotedPrintableProp
- addProp(p,VCQuotedPrintableProp);
-
-* Note on Unicode
- Although, the current parser takes ASCII text file only,
- string values are all stored as Unicode in the VObject tree.
- For now, when using the VObject APIs to construct a
- VObject tree, one should always convert ASCII string value
- to a Unicode string value:
-
- // VObject *root;
- VObject *p = addProp(root,VCSomeProp);
- setVObjectUStringZValue(p,fakeUnicode(someASCIIStringZvalue));
-
- An API is provided to simplify the above process:
-
- addPropValue(root,VCSomeProp,someASCIIStringZValue);
-
- Note that someASCIISTringZValue is automatically converted to
- Unicode by addPropValue API, where as, the former code
- sequence do an explicit call to fakeUnicode.
-
- To read back the value, one should use the vObjectUStringZValue
- API not vObjectStringZValue API. The value returned by the
- vObjectUStringZValue API is a Unicode string. If the application
- do not know how to handle Unicode string, it can use the
- fakeCString API to convert it back to ASCII string (as long
- as the conversion is meaningful).
-
- Note that fakeCString return a heap allocated memory. It is
- important to call deleteStr on fakeCString return value if
- it is not longer required (or there will be memory leak).
-
- NOTE: Unfortunately, at the point when this document is written,
- there is still no consensus on how Unicode is to be handled
- in the textual representation of VCard/VCalendar. So, there
- is no version of writeVObject and the parser to output and
- input Unicode textual representation of VCard/VCalendar.
-
-
-Example.vcf
------------
-line
-number Input Text (example.vcf)
------- ----------
-1 BEGIN:VCALENDAR
-2 DCREATED:19961102T100522
-3 GEO:0,0
-4 VERSION:1.0
-5 BEGIN:VEVENT
-6 DTSTART:19961103T000000
-7 DTEND:20000101T000000
-8 DESCRIPTION;QUOTED-PRINTABLE:To be =0A=
-9 or =0A=
-10 not to be
-11 STATUS:O.K.
-12 X-ACTION:No action required
-13 DALARM:19961103T114500;5;3;Enjoy
-14 MALARM:19970101T120000;;;johny@nowhere.com;Call Mom.
-15 END:VEVENT
-16
-17 BEGIN:VTODO
-18 DUE:19960614T0173000
-19 DESCRIPTION:Relex.
-20 END:VTODO
-21
-22 END:VCALENDAR
-23
-24 BEGIN:VCARD
-25 N:Alden;Roland
-26 FN:Roland H. Alden
-27 ORG:AT&T;Versit Project Office
-28 TITLE:Consultant
-29 EMAIL;WORK;PREF;INTERNET:ralden@ralden.com
-30 LABEL;DOM;POSTAL;PARCEL;HOME;WORK;QUOTED-PRINTABLE:Roland H. Alden=0A=
-31 Suite 2208=0A=
-32 One Pine Street=0A=
-33 San Francisco, CA 94111
-34 LABEL;POSTAL;PARCEL;HOME;WORK;QUOTED-PRINTABLE:Roland H. Alden=0A=
-35 Suite 2208=0A=
-36 One Pine Street=0A=
-37 San Francisco, CA 94111=0A=
-38 U.S.A.
-39 TEL;WORK;PREF;MSG:+1 415 296 9106
-40 TEL;WORK;FAX:+1 415 296 9016
-41 TEL;MSG;CELL:+1 415 608 5981
-42 ADR:;Suite 2208;One Pine Street;San Francisco;CA;94111;U.S.A.
-43 SOUND:ROW-LAND H ALL-DIN
-44 LOGO;GIF;BASE64:
-45 R0lGODdhpgBOAMQAAP///+/v797e3s7Ozr29va2trZycnIyMjHt7e2NjY1JSUkJC
- ... 30 lines of BASE64 data not shown here.
-76 END:VCARD
-
-
-VObject Representation of Example.vcf:
--------------------------------------
-line
-in
-text
-file VObject Tree as Printed by printVObject API
----- -------------------------------------------
-1 VCALENDAR
-2 DCREATED="19961102T100522"
-3 GEO="0,0"
-4 VERSION="1.0"
-5 VEVENT
-6 DTSTART="19961103T000000"
-7 DTEND="20000101T000000"
-8 DESCRIPTION="To be
-9 or
-10 not to be"
-8 QUOTED-PRINTABLE
-11 STATUS="O.K."
-12 X-ACTION="No action required"
-13 DALARM
-13 RUNTIME="19961103T114500"
-13 SNOOZETIME="5"
-13 REPEATCOUNT="3"
-13 DISPLAYSTRING="Enjoy"
-14 MALARM
-14 RUNTIME="19970101T120000"
-14 EMAIL="johny@nowhere.com"
-14 NOTE="Call Mom"
-17 VTODO
-18 DUE="19960614T0173000"
-19 DESCRIPTION="Relex."
-24 VCARD
-25 N
-25 F="Alden"
-25 G="Roland"
-26 FN="Roland H. Alden"
-27 ORG
-27 ORGNAME="AT&T"
-27 OUN="Versit Project Office"
-28 TITLE="Consultant"
-29 EMAIL="ralden@alden.com"
-29 WORK
-29 PREF
-29 INTERNET
-30 LABEL="Roland H. Alden
-31 Suite 2208
-32 One Pine Street
-33 San Francisco, CA 94111"
-30 DOM
-30 POSTAL
-30 PARCEL
-30 HOME
-30 WORK
-30 QUOTED-PRINTABLE
-34 LABEL="Roland H. Alden
-35 Suite 2208
-36 One Pine Street
-37 San Francisco, CA 94111
-38 U.S.A."
-34 POSTAL
-34 PARCEL
-34 HOME
-34 WORK
-34 QUOTED-PRINTABLE
-39 TEL="+1 415 296 9106"
-39 WORK
-39 PREF
-39 MSG
-40 TEL="+1 415 296 9016"
-40 WORK
-40 FAX
-41 TEL="+1 415 608 5981"
-41 MSG
-41 CELL
-42 ADR
-42 EXT ADD="Suite 2208"
-42 STREET="One Pine Street"
-42 L="San Francisco"
-42 R="CA"
-42 PC="94111"
-42 C="U.S.A."
-43 SOUND="ROW-LAND H ALL-DIN"
-44 LOGO=[raw data]
-44 GIF
-44 BASE64
-44 DATASIZE=1482
-
diff --git a/libical/src/libicalvcal/icalvcal.c b/libical/src/libicalvcal/icalvcal.c deleted file mode 100644 index 24c3155178..0000000000 --- a/libical/src/libicalvcal/icalvcal.c +++ /dev/null @@ -1,517 +0,0 @@ -/*====================================================================== - FILE: icalvcal.c - CREATOR: eric 25 May 00 - - $Id$ - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icalvcal.c - - - - The icalvcal_convert routine calls icalvcal_traverse_objects to do - its work.s his routine steps through through all of the properties - and components of a VObject. For each name of a property or a - component, icalvcal_traverse_objects looks up the name in - conversion_table[]. This table indicates wether the name is of a - component or a property, lists a routine to handle conversion, and - has extra data for the conversion. - - The conversion routine will create new iCal components or properties - and add them to the iCal component structure. - - The most common conversion routine is dc_prop. This routine converts - properties for which the text representation of the vCal component - is identical the iCal representation. - - ======================================================================*/ - -#include "icalvcal.h" -#include <string.h> - -enum datatype { - COMPONENT, - PROPERTY, - PARAMETER, - UNSUPPORTED -}; - - -struct conversion_table_struct { - char* vcalname; - enum datatype type; - void* (*conversion_func)(int icaltype, VObject *o); - int icaltype; -}; - -struct conversion_table_struct conversion_table[]; -void* dc_prop(int icaltype, VObject *object); - -static void icalvcal_traverse_objects(VObject *object,icalcomponent* last_comp, - icalproperty* last_prop) -{ - VObjectIterator iterator; - char* name = "[No Name]"; - icalcomponent* subc = 0; - int i; - - if ( vObjectName(object)== 0){ - printf("ERROR, object has no name"); - assert(0); - return; - } - - name = (char*)vObjectName(object); - - /* Lookup this object in the conversion table */ - for (i = 0; conversion_table[i].vcalname != 0; i++){ - if(strcmp(conversion_table[i].vcalname, name) == 0){ - break; - } - } - - /* Did not find the object. It may be an X-property, or an unknown - property */ - if (conversion_table[i].vcalname == 0){ - - /* Handle X properties */ - if(strncmp(name, "X-",2) == 0){ - icalproperty* prop = (icalproperty*)dc_prop(ICAL_X_PROPERTY,object); - icalproperty_set_x_name(prop,name); - icalcomponent_add_property(last_comp,prop); - } else { - assert(0); - return; - } - - } else { - - /* The vCal property is in the table, and it is not an X - property, so try to convert it to an iCal component, - property or parameter. */ - - switch(conversion_table[i].type){ - - - case COMPONENT: { - subc = - (icalcomponent*)(conversion_table[i].conversion_func - (conversion_table[i].icaltype, - object)); - - icalcomponent_add_component(last_comp,subc); - - assert(subc!=0); - - break; - } - - case PROPERTY: { - - if (vObjectValueType(object) && - conversion_table[i].conversion_func != 0 ) { - - icalproperty* prop = - (icalproperty*)(conversion_table[i].conversion_func - (conversion_table[i].icaltype, - object)); - - icalcomponent_add_property(last_comp,prop); - last_prop = prop; - - } - break; - } - - case PARAMETER: { - break; - } - - case UNSUPPORTED: { - - /* If the property is listed as UNSUPPORTED, insert a - X_LIC_ERROR property to note this fact. */ - - char temp[1024]; - char* message = "Unsupported vCal property"; - icalparameter *error_param; - icalproperty *error_prop; - - snprintf(temp,1024,"%s: %s",message,name); - - error_param = icalparameter_new_xlicerrortype( - ICAL_XLICERRORTYPE_UNKNOWNVCALPROPERROR - ); - - error_prop = icalproperty_new_xlicerror(temp); - icalproperty_add_parameter(error_prop, error_param); - - icalcomponent_add_property(last_comp,error_prop); - - break; - } - } - } - - - /* Now, step down into the next vCalproperty */ - - initPropIterator(&iterator,object); - while (moreIteration(&iterator)) { - VObject *eachProp = nextVObject(&iterator); - - /* If 'object' is a component, then the next traversal down - should use it as the 'last_comp' */ - - if(subc!=0){ - icalvcal_traverse_objects(eachProp,subc,last_prop); - - } else { - icalvcal_traverse_objects(eachProp,last_comp,last_prop); - } - } -} - -icalcomponent* icalvcal_convert(VObject *object){ - - char* name = (char*)vObjectName(object); - icalcomponent* container = icalcomponent_new(ICAL_XROOT_COMPONENT); - icalcomponent* root; - - icalerror_check_arg_rz( (object!=0),"Object"); - - /* The root object must be a VCALENDAR */ - if(*name==0 || strcmp(name,VCCalProp) != 0){ - return 0; /* HACK. Should return an error */ - } - - - icalvcal_traverse_objects(object,container,0); - - /* HACK. I am using the extra 'container' component because I am - lazy. I know there is a way to get rid of it, but I did not care - to find it. */ - - root = icalcomponent_get_first_component(container,ICAL_ANY_COMPONENT); - - icalcomponent_remove_component(container, root); - icalcomponent_free(container); - - return root; - -} - -/* comp() is useful for most components, but alarm, daylight and - * timezone are different. In vcal, they are properties, and in ical, - * they are components. Although because of the way that vcal treats - * everything as a property, alarm_comp() daylight_comp() and - * timezone_comp() may not really be necessary, I think it would be - * easier to use them. */ - -void* comp(int icaltype, VObject *o) -{ - icalcomponent_kind kind = (icalcomponent_kind)icaltype; - - icalcomponent* c = icalcomponent_new(kind); - - return (void* )c; -} - -void* alarm_comp(int icaltype, VObject *o) -{ - icalcomponent_kind kind = (icalcomponent_kind)icaltype; - - icalcomponent* c = icalcomponent_new(kind); - - return (void*)c; -} - -void* daylight_comp(int icaltype, VObject *o) -{ - icalcomponent_kind kind = (icalcomponent_kind)icaltype; - - icalcomponent* c = icalcomponent_new(kind); - - return (void*)c; -} - -void* timezone_comp(int icaltype, VObject *o) -{ - icalcomponent_kind kind = (icalcomponent_kind)icaltype; - - icalcomponent* c = icalcomponent_new(kind); - - return (void*)c; -} - - -/* These #defines indicate conversion routines that are not defined yet. */ - -#define categories_prop 0 -#define transp_prop 0 -#define status_prop 0 - -#define parameter 0 -#define rsvp_parameter 0 - - - -/* directly convertable property. The string representation of vcal is - the same as ical */ - -void* dc_prop(int icaltype, VObject *object) -{ - icalproperty_kind kind = (icalproperty_kind)icaltype; - icalproperty *prop; - icalvalue *value; - icalvalue_kind value_kind; - char *s,*t=0; - - prop = icalproperty_new(kind); - - value_kind = - icalenum_property_kind_to_value_kind( - icalproperty_isa(prop)); - - - switch (vObjectValueType(object)) { - case VCVT_USTRINGZ: { - s = t = fakeCString(vObjectUStringZValue(object)); - break; - } - case VCVT_STRINGZ: { - s = (char*)vObjectStringZValue(object); - break; - } - } - - value = icalvalue_new_from_string(value_kind,s); - - if(t!=0){ - deleteStr(t); - } - - icalproperty_set_value(prop,value); - - return (void*)prop; -} - - -/* My extraction program screwed up, so this table does not have all -of the vcal properties in it. I didn't feel like re-doing the entire -table, so you'll have to find the missing properties the hard way -- -the code will assert */ - -struct conversion_table_struct conversion_table[] = -{ -{VCCalProp, COMPONENT, comp, ICAL_VCALENDAR_COMPONENT}, -{VCTodoProp, COMPONENT, comp, ICAL_VTODO_COMPONENT}, -{VCEventProp, COMPONENT, comp, ICAL_VEVENT_COMPONENT}, -{VCAAlarmProp, COMPONENT, alarm_comp, ICAL_XAUDIOALARM_COMPONENT}, -{VCDAlarmProp, COMPONENT, alarm_comp, ICAL_XDISPLAYALARM_COMPONENT}, -{VCMAlarmProp, COMPONENT, alarm_comp, ICAL_XEMAILALARM_COMPONENT}, -{VCPAlarmProp, COMPONENT, alarm_comp, ICAL_XPROCEDUREALARM_COMPONENT}, -{VCDayLightProp, COMPONENT, daylight_comp,0}, -{VCTimeZoneProp, COMPONENT, timezone_comp, ICAL_VTIMEZONE_COMPONENT}, -{VCProdIdProp, PROPERTY, dc_prop, ICAL_PRODID_PROPERTY}, -{VCClassProp, PROPERTY, dc_prop, ICAL_CLASS_PROPERTY}, -{VCDCreatedProp, PROPERTY, dc_prop, ICAL_CREATED_PROPERTY}, -{VCDescriptionProp, PROPERTY, dc_prop, ICAL_DESCRIPTION_PROPERTY}, -{VCAttendeeProp, PROPERTY, dc_prop, ICAL_ATTENDEE_PROPERTY}, -{VCCategoriesProp, PROPERTY, categories_prop,ICAL_CATEGORIES_PROPERTY}, -{VCDTendProp, PROPERTY, dc_prop, ICAL_DTEND_PROPERTY}, -{VCDTstartProp, PROPERTY, dc_prop, ICAL_DTSTART_PROPERTY}, -{VCDueProp, PROPERTY, dc_prop, ICAL_DUE_PROPERTY}, -{VCLocationProp, PROPERTY, dc_prop, ICAL_LOCATION_PROPERTY}, -{VCSummaryProp, PROPERTY, dc_prop, ICAL_SUMMARY_PROPERTY}, -{VCVersionProp, PROPERTY, dc_prop, ICAL_VERSION_PROPERTY}, -{VCTranspProp, PROPERTY, transp_prop, ICAL_TRANSP_PROPERTY}, -{VCUniqueStringProp, PROPERTY, dc_prop, ICAL_UID_PROPERTY}, -{VCURLProp, PROPERTY, dc_prop, ICAL_URL_PROPERTY}, -{VCLastModifiedProp, PROPERTY, dc_prop, ICAL_LASTMODIFIED_PROPERTY}, -{VCSequenceProp, PROPERTY, dc_prop, ICAL_SEQUENCE_PROPERTY}, -{VCPriorityProp, PROPERTY, dc_prop, ICAL_PRIORITY_PROPERTY}, -{VCStatusProp, PROPERTY, status_prop, ICAL_STATUS_PROPERTY}, -{VCRSVPProp, UNSUPPORTED, rsvp_parameter,ICAL_RSVP_PARAMETER }, -{VCEncodingProp, UNSUPPORTED, parameter, ICAL_ENCODING_PARAMETER}, -{VCRoleProp, UNSUPPORTED, parameter, ICAL_ROLE_PARAMETER}, -{VCStatusProp, UNSUPPORTED, parameter, ICAL_STATUS_PROPERTY}, -{VCQuotedPrintableProp,UNSUPPORTED,0, 0}, -{VC7bitProp, UNSUPPORTED,0, 0}, -{VC8bitProp, UNSUPPORTED,0, 0}, -{VCAdditionalNamesProp,UNSUPPORTED,0, 0}, -{VCAdrProp, UNSUPPORTED,0, 0}, -{VCAgentProp, UNSUPPORTED,0, 0}, -{VCAIFFProp, UNSUPPORTED,0, 0}, -{VCAOLProp, UNSUPPORTED,0, 0}, -{VCAppleLinkProp, UNSUPPORTED,0, 0}, -{VCAttachProp, UNSUPPORTED,0, 0}, -{VCATTMailProp, UNSUPPORTED,0, 0}, -{VCAudioContentProp, UNSUPPORTED,0, 0}, -{VCAVIProp, UNSUPPORTED,0, 0}, -{VCBase64Prop, UNSUPPORTED,0, 0}, -{VCBBSProp, UNSUPPORTED,0, 0}, -{VCBirthDateProp, UNSUPPORTED,0, 0}, -{VCBMPProp, UNSUPPORTED,0, 0}, -{VCBodyProp, UNSUPPORTED,0, 0}, -{VCCaptionProp, UNSUPPORTED,0, 0}, -{VCCarProp, UNSUPPORTED,0, 0}, -{VCCellularProp, UNSUPPORTED,0, 0}, -{VCCGMProp, UNSUPPORTED,0, 0}, -{VCCharSetProp, UNSUPPORTED,0, 0}, -{VCCIDProp, UNSUPPORTED,0, 0}, -{VCCISProp, UNSUPPORTED,0, 0}, -{VCCityProp, UNSUPPORTED,0, 0}, -{VCCommentProp, UNSUPPORTED,0, 0}, -{VCCompletedProp, UNSUPPORTED,0, 0}, -{VCCountryNameProp, UNSUPPORTED,0, 0}, -{VCDataSizeProp, UNSUPPORTED,0, 0}, -{VCDeliveryLabelProp, UNSUPPORTED,0, 0}, -{VCDIBProp, UNSUPPORTED,0, 0}, -{VCDisplayStringProp, UNSUPPORTED,0, 0}, -{VCDomesticProp, UNSUPPORTED,0, 0}, -{VCEmailAddressProp, UNSUPPORTED,0, 0}, -{VCEndProp, UNSUPPORTED,0, 0}, -{VCEWorldProp, UNSUPPORTED,0, 0}, -{VCExNumProp, UNSUPPORTED,0, 0}, -{VCExpDateProp, UNSUPPORTED,0, 0}, -{VCExpectProp, UNSUPPORTED,0, 0}, -{VCFamilyNameProp, UNSUPPORTED,0, 0}, -{VCFaxProp, UNSUPPORTED,0, 0}, -{VCFullNameProp, UNSUPPORTED,0, 0}, -{VCGeoProp, UNSUPPORTED,0, 0}, -{VCGeoLocationProp, UNSUPPORTED,0, 0}, -{VCGIFProp, UNSUPPORTED,0, 0}, -{VCGivenNameProp, UNSUPPORTED,0, 0}, -{VCGroupingProp, UNSUPPORTED,0, 0}, -{VCHomeProp, UNSUPPORTED,0, 0}, -{VCIBMMailProp, UNSUPPORTED,0, 0}, -{VCInlineProp, UNSUPPORTED,0, 0}, -{VCInternationalProp, UNSUPPORTED,0, 0}, -{VCInternetProp, UNSUPPORTED,0, 0}, -{VCISDNProp, UNSUPPORTED,0, 0}, -{VCJPEGProp, UNSUPPORTED,0, 0}, -{VCLanguageProp, UNSUPPORTED,0, 0}, -{VCLastRevisedProp, UNSUPPORTED,0, 0}, -{VCLogoProp, UNSUPPORTED,0, 0}, -{VCMailerProp, UNSUPPORTED,0, 0}, -{VCMCIMailProp, UNSUPPORTED,0, 0}, -{VCMessageProp, UNSUPPORTED,0, 0}, -{VCMETProp, UNSUPPORTED,0, 0}, -{VCModemProp, UNSUPPORTED,0, 0}, -{VCMPEG2Prop, UNSUPPORTED,0, 0}, -{VCMPEGProp, UNSUPPORTED,0, 0}, -{VCMSNProp, UNSUPPORTED,0, 0}, -{VCNamePrefixesProp, UNSUPPORTED,0, 0}, -{VCNameProp, UNSUPPORTED,0, 0}, -{VCNameSuffixesProp, UNSUPPORTED,0, 0}, -{VCNoteProp, UNSUPPORTED,0, 0}, -{VCOrgNameProp, UNSUPPORTED,0, 0}, -{VCOrgProp, UNSUPPORTED,0, 0}, -{VCOrgUnit2Prop, UNSUPPORTED,0, 0}, -{VCOrgUnit3Prop, UNSUPPORTED,0, 0}, -{VCOrgUnit4Prop, UNSUPPORTED,0, 0}, -{VCOrgUnitProp, UNSUPPORTED,0, 0}, -{VCPagerProp, UNSUPPORTED,0, 0}, -{VCParcelProp, UNSUPPORTED,0, 0}, -{VCPartProp, UNSUPPORTED,0, 0}, -{VCPCMProp, UNSUPPORTED,0, 0}, -{VCPDFProp, UNSUPPORTED,0, 0}, -{VCPGPProp, UNSUPPORTED,0, 0}, -{VCPhotoProp, UNSUPPORTED,0, 0}, -{VCPICTProp, UNSUPPORTED,0, 0}, -{VCPMBProp, UNSUPPORTED,0, 0}, -{VCPostalBoxProp, UNSUPPORTED,0, 0}, -{VCPostalCodeProp, UNSUPPORTED,0, 0}, -{VCPostalProp, UNSUPPORTED,0, 0}, -{VCPowerShareProp, UNSUPPORTED,0, 0}, -{VCPreferredProp, UNSUPPORTED,0, 0}, -{VCProcedureNameProp, UNSUPPORTED,0, 0}, -{VCProdigyProp, UNSUPPORTED,0, 0}, -{VCPronunciationProp, UNSUPPORTED,0, 0}, -{VCPSProp, UNSUPPORTED,0, 0}, -{VCPublicKeyProp, UNSUPPORTED,0, 0}, -{VCQPProp, UNSUPPORTED,0, 0}, -{VCQuickTimeProp, UNSUPPORTED,0, 0}, -{VCRDateProp, UNSUPPORTED,0, 0}, -{VCRegionProp, UNSUPPORTED,0, 0}, -{VCRepeatCountProp, UNSUPPORTED,0, 0}, -{VCResourcesProp, UNSUPPORTED,0, 0}, -{VCRNumProp, UNSUPPORTED,0, 0}, -{VCRRuleProp, UNSUPPORTED,0, 0}, -{VCRunTimeProp, UNSUPPORTED,0, 0}, -{VCSnoozeTimeProp, UNSUPPORTED,0, 0}, -{VCStartProp, UNSUPPORTED,0, 0}, -{VCStreetAddressProp, UNSUPPORTED,0, 0}, -{VCSubTypeProp, UNSUPPORTED,0, 0}, -{VCTelephoneProp, UNSUPPORTED,0, 0}, -{VCTIFFProp, UNSUPPORTED,0, 0}, -{VCTitleProp, UNSUPPORTED,0, 0}, -{VCTLXProp, UNSUPPORTED,0, 0}, -{VCURLValueProp, UNSUPPORTED,0, 0}, -{VCValueProp, UNSUPPORTED,0, 0}, -{VCVideoProp, UNSUPPORTED,0, 0}, -{VCVoiceProp, UNSUPPORTED,0, 0}, -{VCWAVEProp, UNSUPPORTED,0, 0}, -{VCWMFProp, UNSUPPORTED,0, 0}, -{VCWorkProp, UNSUPPORTED,0, 0}, -{VCX400Prop, UNSUPPORTED,0, 0}, -{VCX509Prop, UNSUPPORTED,0, 0}, -{VCXRuleProp, UNSUPPORTED,0, 0}, -{0,0,0,0} -}; - - -#if 0 - switch (vObjectValueType(object)) { - case VCVT_USTRINGZ: { - char c; - char *t,*s; - s = t = fakeCString(vObjectUStringZValue(object)); - printf(" ustringzstring:%s\n",s); - deleteStr(s); - break; - } - case VCVT_STRINGZ: { - char c; - const char *s = vObjectStringZValue(object); - printf(" stringzstring:%s\n",s); - break; - } - case VCVT_UINT: - { - int i = vObjectIntegerValue(object); - printf(" int:%d\n",i); - break; - } - case VCVT_ULONG: - { - long l = vObjectLongValue(object); - printf(" int:%d\n",l); - break; - } - case VCVT_VOBJECT: - { - printf("ERROR, should not get here\n"); - break; - } - case VCVT_RAW: - case 0: - default: - break; - } - -#endif diff --git a/libical/src/libicalvcal/icalvcal.h b/libical/src/libicalvcal/icalvcal.h deleted file mode 100644 index f2316c2d0f..0000000000 --- a/libical/src/libicalvcal/icalvcal.h +++ /dev/null @@ -1,39 +0,0 @@ -/* -*- Mode: C -*-*/ -/*====================================================================== - FILE: icalvcal.h - CREATOR: eric 25 May 00 - - - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The original code is icalvcal.h - - -======================================================================*/ - -#ifndef ICALVCAL_H -#define ICALVCAL_H - -#include "ical.h" -#include "vcc.h" - -/* Convert a vObject into an icalcomponent */ - -icalcomponent* icalvcal_convert(VObject *object); - -#endif /* !ICALVCAL_H */ - - - diff --git a/libical/src/libicalvcal/port.h b/libical/src/libicalvcal/port.h deleted file mode 100644 index 1768beebd8..0000000000 --- a/libical/src/libicalvcal/port.h +++ /dev/null @@ -1,88 +0,0 @@ -/*************************************************************************** -(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International -Business Machines Corporation and Siemens Rolm Communications Inc. - -For purposes of this license notice, the term Licensors shall mean, -collectively, Apple Computer, Inc., AT&T Corp., International -Business Machines Corporation and Siemens Rolm Communications Inc. -The term Licensor shall mean any of the Licensors. - -Subject to acceptance of the following conditions, permission is hereby -granted by Licensors without the need for written agreement and without -license or royalty fees, to use, copy, modify and distribute this -software for any purpose. - -The above copyright notice and the following four paragraphs must be -reproduced in all copies of this software and any software including -this software. - -THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE -ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR -MODIFICATIONS. - -IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT, -INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT -OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. - -EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, -INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. - -The software is provided with RESTRICTED RIGHTS. Use, duplication, or -disclosure by the government are subject to restrictions set forth in -DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. - -***************************************************************************/ - -#ifndef __PORT_H__ -#define __PORT_H__ 1 - - -#if defined(__CPLUSPLUS__) || defined(__cplusplus) -extern "C" { -#endif - -/* some of these #defines are commented out because */ -/* Visual C++ sets them on the compiler command line instead */ - -/* #define _DEBUG */ -/* #define WIN32 */ -/* #define WIN16 */ -/* #define _WINDOWS */ -/* #define __MWERKS__ */ -/* #define INCLUDEMFC */ - -#define vCardClipboardFormat "+//ISBN 1-887687-00-9::versit::PDI//vCard" -#define vCalendarClipboardFormat "+//ISBN 1-887687-00-9::versit::PDI//vCalendar" - -/* The above strings vCardClipboardFormat and vCalendarClipboardFormat -are globally unique IDs which can be used to generate clipboard format -ID's as per the requirements of a specific platform. For example, in -Windows they are used as the parameter in a call to RegisterClipboardFormat. -For example: - - CLIPFORMAT foo = RegisterClipboardFormat(vCardClipboardFormat); - -*/ - -#define vCardMimeType "text/x-vCard" -#define vCalendarMimeType "text/x-vCalendar" - -#define DLLEXPORT(t) t - -#ifndef FALSE -#define FALSE 0 -#endif -#ifndef TRUE -#define TRUE 1 -#endif - -#define stricmp strcasecmp - -#if defined(__CPLUSPLUS__) || defined(__cplusplus) -} -#endif - -#endif /* __PORT_H__ */ diff --git a/libical/src/libicalvcal/vcaltest.c b/libical/src/libicalvcal/vcaltest.c deleted file mode 100644 index 5528aab1d1..0000000000 --- a/libical/src/libicalvcal/vcaltest.c +++ /dev/null @@ -1,118 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include "vcaltmp.h" - -#if 0 -This testcase would generate a file call "frankcal.vcf" with -the following content: - -BEGIN:VCALENDAR -DCREATED:19960523T100522 -GEO:37.24,-17.87 -PRODID:-//Frank Dawson/Hand Crafted In North Carolina//NONSGML Made By Hand//EN -VERSION:0.3 -BEGIN:VEVENT -DTSTART:19960523T120000 -DTEND:19960523T130000 -DESCRIPTION;QUOTED-PRINTABLE:VERSIT PDI PR Teleconference/Interview =0A= -With Tom Streeter and Frank Dawson - Discuss VERSIT PDI project and vCard and vCalendar=0A= -activities with European Press representatives. -SUMMARY:VERSIT PDI PR Teleconference/Interview -SUBTYPE:PHONE CALL -STATUS:CONFIRMED -TRANSP:19960523T100522-4000F100582713-009251 -UID:http://www.ibm.com/raleigh/fdawson/~c:\or2\orgfiles\versit.or2 -DALARM:19960523T114500;5;3;Your Telecon Starts At Noon!!!; -MALARM:19960522T120000;;;fdawson@raleigh.ibm.com;Remember 05/23 Noon Telecon!!!; -PALARM:19960523T115500;;;c:\or2\organize.exe c:\or2\orgfiles\versit.or2; -X-LDC-OR2-OLE:c:\temp\agenda.doc -END:VEVENT - -BEGIN:VTODO -DUE:19960614T0173000 -DESCRIPTION:Review VCalendar helper API. -END:VTODO - -END:VCALENDAR - -#endif - -FILE *cfp; - -void testVcalAPIs() { - FILE *fp; - VObject *vcal, *vevent; -#if _CONSOLE - cfp = stdout; -#else - cfp = fopen("vcaltest.out","w"); -#endif - if (cfp == 0) return; - vcal = vcsCreateVCal( - "19960523T100522", - "37.24,-17.87", - "-//Frank Dawson/Hand Crafted In North Carolina//NONSGML Made By Hand//EN", - 0, - "0.3" - ); - - vevent = vcsAddEvent( - vcal, - "19960523T120000", - "19960523T130000", - "VERSIT PDI PR Teleconference/Interview \nWith Tom Streeter and Frank Dawson - Discuss VERSIT PDI project and vCard and vCalendar\nactivities with European Press representatives.", - "VERSIT PDI PR Teleconference/Interview", - "PHONE CALL", - 0, - "CONFIRMED", - "19960523T100522-4000F100582713-009251", - "http://www.ibm.com/raleigh/fdawson/~c:\\or2\\orgfiles\\versit.or2", - 0 - ); - - vcsAddDAlarm(vevent, "19960523T114500", "5", "3", - "Your Telecon Starts At Noon!!!"); - vcsAddMAlarm(vevent, "19960522T120000", 0, 0, "fdawson@raleigh.ibm.com", - "Remember 05/23 Noon Telecon!!!"); - vcsAddPAlarm(vevent, "19960523T115500", 0 ,0, - "c:\\or2\\organize.exe c:\\or2\\orgfiles\\versit.or2"); - - addPropValue(vevent, "X-LDC-OR2-OLE", "c:\\temp\\agenda.doc"); - - vcsAddTodo( - vcal, - 0, - "19960614T0173000", - 0, - "Review VCalendar helper API.", - 0, - 0, - 0, - 0, - 0, - 0 - ); - - /* now do something to the resulting VObject */ - /* pretty print on stdout for fun */ - printVObject(cfp,vcal); - /* open the output text file */ - -#define OUTFILE "frankcal.vcf" - - fp = fopen(OUTFILE, "w"); - if (fp) { - /* write it in text form */ - writeVObject(fp,vcal); - fclose(fp); - } - else { - fprintf(cfp,"open output file '%s' failed\n", OUTFILE); - } - if (cfp != stdout) fclose(cfp); - } - -void main() { - testVcalAPIs(); - } - diff --git a/libical/src/libicalvcal/vcaltmp.c b/libical/src/libicalvcal/vcaltmp.c deleted file mode 100644 index ccb21a649a..0000000000 --- a/libical/src/libicalvcal/vcaltmp.c +++ /dev/null @@ -1,337 +0,0 @@ -/* -This module provides some helper APIs for creating -a VCalendar object. - -Note on APIs: - 1. The APIs does not attempt to verify if the arguments - passed are correct. - 2. Where the argument to an API is not applicable, pass - the value 0. - 3. See the test program at the bottom of this file as an - example of usage. - 4. This code calls APIs in vobject.c. - -*/ - -/*************************************************************************** -(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International -Business Machines Corporation and Siemens Rolm Communications Inc. - -For purposes of this license notice, the term Licensors shall mean, -collectively, Apple Computer, Inc., AT&T Corp., International -Business Machines Corporation and Siemens Rolm Communications Inc. -The term Licensor shall mean any of the Licensors. - -Subject to acceptance of the following conditions, permission is hereby -granted by Licensors without the need for written agreement and without -license or royalty fees, to use, copy, modify and distribute this -software for any purpose. - -The above copyright notice and the following four paragraphs must be -reproduced in all copies of this software and any software including -this software. - -THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE -ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR -MODIFICATIONS. - -IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT, -INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT -OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. - -EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, -INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. - -The software is provided with RESTRICTED RIGHTS. Use, duplication, or -disclosure by the government are subject to restrictions set forth in -DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. - -***************************************************************************/ - - -#include <stdio.h> -#include <string.h> -#include "vcaltmp.h" - - -DLLEXPORT(VObject*) vcsCreateVCal( - char *date_created, - char *location, - char *product_id, - char *time_zone, - char *version - ) - { - VObject *vcal = newVObject(VCCalProp); -#define Z(p,v) if (v) addPropValue(vcal,p,v); - Z(VCDCreatedProp, date_created); - Z(VCLocationProp, location) - Z(VCProdIdProp, product_id) - Z(VCTimeZoneProp, time_zone) - Z(VCVersionProp, version) -#undef Z - return vcal; - } - - -DLLEXPORT(VObject*) vcsAddEvent( - VObject *vcal, - char *start_date_time, - char *end_date_time, - char *description, - char *summary, - char *categories, - char *classification, - char *status, - char *transparency, - char *uid, - char *url - ) - { - VObject *vevent = addProp(vcal,VCEventProp); -#define Z(p,v) if (v) addPropValue(vevent,p,v); - Z(VCDTstartProp,start_date_time); - Z(VCDTendProp,end_date_time); - if (description) { - VObject *p = addPropValue(vevent,VCDescriptionProp,description); - if (strchr(description,'\n')) - addProp(p,VCQuotedPrintableProp); - } - Z(VCSummaryProp,summary); - Z(VCCategoriesProp,categories); - Z(VCClassProp,classification); - Z(VCStatusProp,status); - Z(VCTranspProp,transparency); - Z(VCUniqueStringProp,uid); - Z(VCURLProp,url); -#undef Z - return vevent; - } - - -DLLEXPORT(VObject*) vcsAddTodo( - VObject *vcal, - char *start_date_time, - char *due_date_time, - char *date_time_complete, - char *description, - char *summary, - char *priority, - char *classification, - char *status, - char *uid, - char *url - ) - { - VObject *vtodo = addProp(vcal,VCTodoProp); -#define Z(p,v) if (v) addPropValue(vtodo,p,v); - Z(VCDTstartProp,start_date_time); - Z(VCDueProp,due_date_time); - Z(VCCompletedProp,date_time_complete); - if (description) { - VObject *p = addPropValue(vtodo,VCDescriptionProp,description); - if (strchr(description,'\n')) - addProp(p,VCQuotedPrintableProp); - } - Z(VCSummaryProp,summary); - Z(VCPriorityProp,priority); - Z(VCClassProp,classification); - Z(VCStatusProp,status); - Z(VCUniqueStringProp,uid); - Z(VCURLProp,url); -#undef Z - return vtodo; - } - - -DLLEXPORT(VObject*) vcsAddAAlarm( - VObject *vevent, - char *run_time, - char *snooze_time, - char *repeat_count, - char *audio_content - ) - { - VObject *aalarm= addProp(vevent,VCAAlarmProp); -#define Z(p,v) if (v) addPropValue(aalarm,p,v); - Z(VCRunTimeProp,run_time); - Z(VCSnoozeTimeProp,snooze_time); - Z(VCRepeatCountProp,repeat_count); - Z(VCAudioContentProp,audio_content); -#undef Z - return aalarm; - } - - -DLLEXPORT(VObject*) vcsAddMAlarm( - VObject *vevent, - char *run_time, - char *snooze_time, - char *repeat_count, - char *email_address, - char *note - ) - { - VObject *malarm= addProp(vevent,VCMAlarmProp); -#define Z(p,v) if (v) addPropValue(malarm,p,v); - Z(VCRunTimeProp,run_time); - Z(VCSnoozeTimeProp,snooze_time); - Z(VCRepeatCountProp,repeat_count); - Z(VCEmailAddressProp,email_address); - Z(VCNoteProp,note); -#undef Z - return malarm; - } - - -DLLEXPORT(VObject*) vcsAddDAlarm( - VObject *vevent, - char *run_time, - char *snooze_time, - char *repeat_count, - char *display_string - ) - { - VObject *dalarm= addProp(vevent,VCDAlarmProp); -#define Z(p,v) if (v) addPropValue(dalarm,p,v); - Z(VCRunTimeProp,run_time); - Z(VCSnoozeTimeProp,snooze_time); - Z(VCRepeatCountProp,repeat_count); - Z(VCDisplayStringProp,display_string); -#undef Z - return dalarm; - } - - -DLLEXPORT(VObject*) vcsAddPAlarm( - VObject *vevent, - char *run_time, - char *snooze_time, - char *repeat_count, - char *procedure_name - ) - { - VObject *palarm= addProp(vevent,VCPAlarmProp); -#define Z(p,v) if (v) addPropValue(palarm,p,v); - Z(VCRunTimeProp,run_time); - Z(VCSnoozeTimeProp,snooze_time); - Z(VCRepeatCountProp,repeat_count); - Z(VCProcedureNameProp,procedure_name); -#undef Z - return palarm; - } - - -#ifdef _TEST - -#if 0 -This testcase would generate a file call "frankcal.vcf" with -the following content: - -BEGIN:VCALENDAR -DCREATED:19960523T100522 -GEO:37.24,-17.87 -PRODID:-//Frank Dawson/Hand Crafted In North Carolina//NONSGML Made By Hand//EN -VERSION:0.3 -BEGIN:VEVENT -DTSTART:19960523T120000 -DTEND:19960523T130000 -DESCRIPTION;QUOTED-PRINTABLE:VERSIT PDI PR Teleconference/Interview =0A= -With Tom Streeter and Frank Dawson - Discuss VERSIT PDI project and vCard and vCalendar=0A= -activities with European Press representatives. -SUMMARY:VERSIT PDI PR Teleconference/Interview -CATEGORIES:PHONE CALL -STATUS:CONFIRMED -TRANSP:19960523T100522-4000F100582713-009251 -UID:http://www.ibm.com/raleigh/fdawson/~c:\or2\orgfiles\versit.or2 -DALARM:19960523T114500;5;3;Your Telecon Starts At Noon!!!; -MALARM:19960522T120000;;;fdawson@raleigh.ibm.com;Remember 05/23 Noon Telecon!!!; -PALARM:19960523T115500;;;c:\or2\organize.exe c:\or2\orgfiles\versit.or2; -X-LDC-OR2-OLE:c:\temp\agenda.doc -END:VEVENT - -BEGIN:VTODO -DUE:19960614T0173000 -DESCRIPTION:Review VCalendar helper API. -END:VTODO - -END:VCALENDAR - -#endif - -void testVcalAPIs() { - FILE *fp; - VObject *vcal = vcsCreateVCal( - "19960523T100522", - "37.24,-17.87", - "-//Frank Dawson/Hand Crafted In North Carolina//NONSGML Made By Hand//EN", - 0, - "0.3" - ); - - VObject *vevent = vcsAddEvent( - vcal, - "19960523T120000", - "19960523T130000", - "VERSIT PDI PR Teleconference/Interview \nWith Tom Streeter and Frank Dawson - Discuss VERSIT PDI project and vCard and vCalendar\nactivities with European Press representatives.", - "VERSIT PDI PR Teleconference/Interview", - "PHONE CALL", - 0, - "CONFIRMED", - "19960523T100522-4000F100582713-009251", - "http://www.ibm.com/raleigh/fdawson/~c:\\or2\\orgfiles\\versit.or2", - 0 - ); - - vcsAddDAlarm(vevent, "19960523T114500", "5", "3", - "Your Telecon Starts At Noon!!!"); - vcsAddMAlarm(vevent, "19960522T120000", 0, 0, "fdawson@raleigh.ibm.com", - "Remember 05/23 Noon Telecon!!!"); - vcsAddPAlarm(vevent, "19960523T115500", 0 ,0, - "c:\\or2\\organize.exe c:\\or2\\orgfiles\\versit.or2"); - - addPropValue(vevent, "X-LDC-OR2-OLE", "c:\\temp\\agenda.doc"); - - vcsAddTodo( - vcal, - 0, - "19960614T0173000", - 0, - "Review VCalendar helper API.", - 0, - 0, - 0, - 0, - 0, - 0 - ); - - /* now do something to the resulting VObject */ - /* pretty print on stdout for fun */ - printVObject(vcal); - /* open the output text file */ - -#define OUTFILE "frankcal.vcf" - - fp = fopen(OUTFILE, "w"); - if (fp) { - /* write it in text form */ - writeVObject(fp,vcal); - fclose(fp); - } - else { - printf("open output file '%s' failed\n", OUTFILE); - } - } - -void main() { - testVcalAPIs(); - } - -#endif - - -/* end of source file vcaltmp.c */ diff --git a/libical/src/libicalvcal/vcaltmp.h b/libical/src/libicalvcal/vcaltmp.h deleted file mode 100644 index 4c4afde963..0000000000 --- a/libical/src/libicalvcal/vcaltmp.h +++ /dev/null @@ -1,128 +0,0 @@ -/*************************************************************************** -(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International -Business Machines Corporation and Siemens Rolm Communications Inc. - -For purposes of this license notice, the term Licensors shall mean, -collectively, Apple Computer, Inc., AT&T Corp., International -Business Machines Corporation and Siemens Rolm Communications Inc. -The term Licensor shall mean any of the Licensors. - -Subject to acceptance of the following conditions, permission is hereby -granted by Licensors without the need for written agreement and without -license or royalty fees, to use, copy, modify and distribute this -software for any purpose. - -The above copyright notice and the following four paragraphs must be -reproduced in all copies of this software and any software including -this software. - -THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE -ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR -MODIFICATIONS. - -IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT, -INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT -OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. - -EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, -INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. - -The software is provided with RESTRICTED RIGHTS. Use, duplication, or -disclosure by the government are subject to restrictions set forth in -DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. - -***************************************************************************/ - -#include "vcc.h" - -#ifndef __VCALTMP_H__ -#define __VCALTMP_H__ - -#if defined(__CPLUSPLUS__) || defined(__cplusplus) -extern "C" { -#endif - -extern DLLEXPORT(VObject*) vcsCreateVCal( - char *date_created, - char *location, - char *product_id, - char *time_zone, - char *version - ); - -extern DLLEXPORT(VObject*) vcsAddEvent( - VObject *vcal, - char *start_date_time, - char *end_date_time, - char *description, - char *summary, - char *categories, - char *classification, - char *status, - char *transparency, - char *uid, - char *url - ); - - -extern DLLEXPORT(VObject*) vcsAddTodo( - VObject *vcal, - char *start_date_time, - char *due_date_time, - char *date_time_complete, - char *description, - char *summary, - char *priority, - char *classification, - char *status, - char *uid, - char *url - ); - - -extern DLLEXPORT(VObject*) vcsAddAAlarm( - VObject *vevent, - char *run_time, - char *snooze_time, - char *repeat_count, - char *audio_content - ); - - -extern DLLEXPORT(VObject*) vcsAddMAlarm( - VObject *vevent, - char *run_time, - char *snooze_time, - char *repeat_count, - char *email_address, - char *note - ); - - -extern DLLEXPORT(VObject*) vcsAddDAlarm( - VObject *vevent, - char *run_time, - char *snooze_time, - char *repeat_count, - char *display_string - ); - - -extern DLLEXPORT(VObject*) vcsAddPAlarm( - VObject *vevent, - char *run_time, - char *snooze_time, - char *repeat_count, - char *procedure_name - ); - -#if defined(__CPLUSPLUS__) || defined(__cplusplus) -} -#endif - -#endif /* __VCALTMP_H__ */ - - diff --git a/libical/src/libicalvcal/vcc.h b/libical/src/libicalvcal/vcc.h deleted file mode 100644 index 0e52034710..0000000000 --- a/libical/src/libicalvcal/vcc.h +++ /dev/null @@ -1,80 +0,0 @@ -/*************************************************************************** -(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International -Business Machines Corporation and Siemens Rolm Communications Inc. - -For purposes of this license notice, the term Licensors shall mean, -collectively, Apple Computer, Inc., AT&T Corp., International -Business Machines Corporation and Siemens Rolm Communications Inc. -The term Licensor shall mean any of the Licensors. - -Subject to acceptance of the following conditions, permission is hereby -granted by Licensors without the need for written agreement and without -license or royalty fees, to use, copy, modify and distribute this -software for any purpose. - -The above copyright notice and the following four paragraphs must be -reproduced in all copies of this software and any software including -this software. - -THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE -ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR -MODIFICATIONS. - -IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT, -INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT -OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. - -EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, -INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. - -The software is provided with RESTRICTED RIGHTS. Use, duplication, or -disclosure by the government are subject to restrictions set forth in -DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. - -***************************************************************************/ - -#ifndef __VCC_H__ -#define __VCC_H__ 1 - -#include "vobject.h" - - -#if defined(__CPLUSPLUS__) || defined(__cplusplus) -extern "C" { -#endif - -typedef void (*MimeErrorHandler)(char *); - -extern DLLEXPORT(void) registerMimeErrorHandler(MimeErrorHandler); - -extern DLLEXPORT(VObject*) Parse_MIME(const char *input, unsigned long len); -extern DLLEXPORT(VObject*) Parse_MIME_FromFileName(char* fname); - - -/* NOTE regarding Parse_MIME_FromFile -The function above, Parse_MIME_FromFile, comes in two flavors, -neither of which is exported from the DLL. Each version takes -a CFile or FILE* as a parameter, neither of which can be -passed across a DLL interface (at least that is my experience). -If you are linking this code into your build directly then -you may find them a more convenient API that the other flavors -that take a file name. If you use them with the DLL LIB you -will get a link error. -*/ - - -#if INCLUDEMFC -extern VObject* Parse_MIME_FromFile(CFile *file); -#else -extern VObject* Parse_MIME_FromFile(FILE *file); -#endif - -#if defined(__CPLUSPLUS__) || defined(__cplusplus) -} -#endif - -#endif /* __VCC_H__ */ - diff --git a/libical/src/libicalvcal/vcc.y b/libical/src/libicalvcal/vcc.y deleted file mode 100644 index 70feefab57..0000000000 --- a/libical/src/libicalvcal/vcc.y +++ /dev/null @@ -1,1176 +0,0 @@ -%{ - -/*************************************************************************** -(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International -Business Machines Corporation and Siemens Rolm Communications Inc. - -For purposes of this license notice, the term Licensors shall mean, -collectively, Apple Computer, Inc., AT&T Corp., International -Business Machines Corporation and Siemens Rolm Communications Inc. -The term Licensor shall mean any of the Licensors. - -Subject to acceptance of the following conditions, permission is hereby -granted by Licensors without the need for written agreement and without -license or royalty fees, to use, copy, modify and distribute this -software for any purpose. - -The above copyright notice and the following four paragraphs must be -reproduced in all copies of this software and any software including -this software. - -THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE -ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR -MODIFICATIONS. - -IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT, -INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT -OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. - -EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, -INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. - -The software is provided with RESTRICTED RIGHTS. Use, duplication, or -disclosure by the government are subject to restrictions set forth in -DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. - -***************************************************************************/ - -/* - * src: vcc.c - * doc: Parser for vCard and vCalendar. Note that this code is - * generated by a yacc parser generator. Generally it should not - * be edited by hand. The real source is vcc.y. The #line directives - * can be commented out here to make it easier to trace through - * in a debugger. However, if a bug is found it should - * be fixed in vcc.y and this file regenerated. - */ - - -/* debugging utilities */ -#if __DEBUG -#define DBG_(x) printf x -#else -#define DBG_(x) -#endif - -/**** External Functions ****/ - -/* assign local name to parser variables and functions so that - we can use more than one yacc based parser. -*/ - -#define yyparse mime_parse -#define yylex mime_lex -#define yyerror mime_error -#define yychar mime_char -/* #define p_yyval p_mime_val */ -#undef yyval -#define yyval mime_yyval -/* #define p_yylval p_mime_lval */ -#undef yylval -#define yylval mime_yylval -#define yydebug mime_debug -#define yynerrs mime_nerrs -#define yyerrflag mime_errflag -#define yyss mime_ss -#define yyssp mime_ssp -#define yyvs mime_vs -#define yyvsp mime_vsp -#define yylhs mime_lhs -#define yylen mime_len -#define yydefred mime_defred -#define yydgoto mime_dgoto -#define yysindex mime_sindex -#define yyrindex mime_rindex -#define yygindex mime_gindex -#define yytable mime_table -#define yycheck mime_check -#define yyname mime_name -#define yyrule mime_rule -#define YYPREFIX "mime_" - - -#ifndef _NO_LINE_FOLDING -#define _SUPPORT_LINE_FOLDING 1 -#endif - -/* undef below if compile with MFC */ -/* #define INCLUDEMFC 1 */ - -#if defined(WIN32) || defined(_WIN32) -#ifdef INCLUDEMFC -#include <afx.h> -#endif -#endif - -#include <string.h> -#ifndef __MWERKS__ -#include <malloc.h> -#endif -#include <stdio.h> -#include <stdlib.h> -#include <ctype.h> -#include "vcc.h" - -/**** Types, Constants ****/ - -#define YYDEBUG 1 /* 1 to compile in some debugging code */ -#define MAXTOKEN 256 /* maximum token (line) length */ -#define YYSTACKSIZE 50 /* ~unref ? */ -#define MAXLEVEL 10 /* max # of nested objects parseable */ - /* (includes outermost) */ - - -/**** Global Variables ****/ -int mime_lineNum, mime_numErrors; /* yyerror() can use these */ -static VObject* vObjList; -static VObject *curProp; -static VObject *curObj; -static VObject* ObjStack[MAXLEVEL]; -static int ObjStackTop; - - -/* A helpful utility for the rest of the app. */ -#if __CPLUSPLUS__ -extern "C" { -#endif - - extern void Parse_Debug(const char *s); - static void yyerror(char *s); - -#if __CPLUSPLUS__ - }; -#endif - -int yyparse(); - -enum LexMode { - L_NORMAL, - L_VCARD, - L_VCAL, - L_VEVENT, - L_VTODO, - L_VALUES, - L_BASE64, - L_QUOTED_PRINTABLE - }; - -/**** Private Forward Declarations ****/ -static int pushVObject(const char *prop); -static VObject* popVObject(); -static void lexPopMode(int top); -static int lexWithinMode(enum LexMode mode); -static void lexPushMode(enum LexMode mode); -static void enterProps(const char *s); -static void enterAttr(const char *s1, const char *s2); -static void enterValues(const char *value); -static void mime_error_(char *s); - -%} - -/***************************************************************************/ -/*** The grammar ****/ -/***************************************************************************/ - -%union { - char *str; - VObject *vobj; - } - -%token - EQ COLON DOT SEMICOLON SPACE HTAB LINESEP NEWLINE - BEGIN_VCARD END_VCARD BEGIN_VCAL END_VCAL - BEGIN_VEVENT END_VEVENT BEGIN_VTODO END_VTODO - ID - -/* - * NEWLINE is the token that would occur outside a vCard, - * while LINESEP is the token that would occur inside a vCard. - */ - -%token <str> - STRING ID - -%type <str> name value - -%type <vobj> vcard vcal vobject - -%start mime - -%% - - -mime: vobjects - ; - -vobjects: vobject - { addList(&vObjList, $1); curObj = 0; } - vobjects - | vobject - { addList(&vObjList, $1); curObj = 0; } - ; - -vobject: vcard - | vcal - ; - -vcard: - BEGIN_VCARD - { - lexPushMode(L_VCARD); - if (!pushVObject(VCCardProp)) YYERROR; - } - items END_VCARD - { - lexPopMode(0); - $$ = popVObject(); - } - | BEGIN_VCARD - { - lexPushMode(L_VCARD); - if (!pushVObject(VCCardProp)) YYERROR; - } - END_VCARD - { - lexPopMode(0); - $$ = popVObject(); - } - ; - -items: item items - | item - ; - -item: prop COLON - { - lexPushMode(L_VALUES); - } - values LINESEP - { - if (lexWithinMode(L_BASE64) || lexWithinMode(L_QUOTED_PRINTABLE)) - lexPopMode(0); - lexPopMode(0); - } - | error - ; - -prop: name - { - enterProps($1); - } - attr_params - | name - { - enterProps($1); - } - ; - -attr_params: attr_param attr_params - | attr_param - ; - -attr_param: SEMICOLON attr - ; - -attr: name - { - enterAttr($1,0); - } - | name EQ name - { - enterAttr($1,$3); - - } - ; - -name: ID - ; - -values: value SEMICOLON { enterValues($1); } values - | value - { enterValues($1); } - ; - -value: STRING - | { $$ = 0; } - ; - -vcal: - BEGIN_VCAL - { if (!pushVObject(VCCalProp)) YYERROR; } - calitems - END_VCAL - { $$ = popVObject(); } - | BEGIN_VCAL - { if (!pushVObject(VCCalProp)) YYERROR; } - END_VCAL - { $$ = popVObject(); } - ; - -calitems: calitem calitems - | calitem - ; - -calitem: - eventitem - | todoitem - | items - ; - -eventitem: - BEGIN_VEVENT - { - lexPushMode(L_VEVENT); - if (!pushVObject(VCEventProp)) YYERROR; - } - items - END_VEVENT - { - lexPopMode(0); - popVObject(); - } - | BEGIN_VEVENT - { - lexPushMode(L_VEVENT); - if (!pushVObject(VCEventProp)) YYERROR; - } - END_VEVENT - { - lexPopMode(0); - popVObject(); - } - ; - -todoitem: - BEGIN_VTODO - { - lexPushMode(L_VTODO); - if (!pushVObject(VCTodoProp)) YYERROR; - } - items - END_VTODO - { - lexPopMode(0); - popVObject(); - } - | BEGIN_VTODO - { - lexPushMode(L_VTODO); - if (!pushVObject(VCTodoProp)) YYERROR; - } - END_VTODO - { - lexPopMode(0); - popVObject(); - } - ; - -%% -static int pushVObject(const char *prop) - { - VObject *newObj; - if (ObjStackTop == MAXLEVEL) - return FALSE; - - ObjStack[++ObjStackTop] = curObj; - - if (curObj) { - newObj = addProp(curObj,prop); - curObj = newObj; - } - else - curObj = newVObject(prop); - - return TRUE; - } - - -/* This pops the recently built vCard off the stack and returns it. */ -static VObject* popVObject() - { - VObject *oldObj; - if (ObjStackTop < 0) { - yyerror("pop on empty Object Stack\n"); - return 0; - } - oldObj = curObj; - curObj = ObjStack[ObjStackTop--]; - - return oldObj; - } - - -static void enterValues(const char *value) - { - if (fieldedProp && *fieldedProp) { - if (value) { - addPropValue(curProp,*fieldedProp,value); - } - /* else this field is empty, advance to next field */ - fieldedProp++; - } - else { - if (value) { - setVObjectUStringZValue_(curProp,fakeUnicode(value,0)); - } - } - deleteStr(value); - } - -static void enterProps(const char *s) - { - curProp = addGroup(curObj,s); - deleteStr(s); - } - -static void enterAttr(const char *s1, const char *s2) - { - const char *p1, *p2; - p1 = lookupProp_(s1); - if (s2) { - VObject *a; - p2 = lookupProp_(s2); - a = addProp(curProp,p1); - setVObjectStringZValue(a,p2); - } - else - addProp(curProp,p1); - if (stricmp(p1,VCBase64Prop) == 0 || (s2 && stricmp(p2,VCBase64Prop)==0)) - lexPushMode(L_BASE64); - else if (stricmp(p1,VCQuotedPrintableProp) == 0 - || (s2 && stricmp(p2,VCQuotedPrintableProp)==0)) - lexPushMode(L_QUOTED_PRINTABLE); - deleteStr(s1); deleteStr(s2); - } - - -#define MAX_LEX_LOOKAHEAD_0 32 -#define MAX_LEX_LOOKAHEAD 64 -#define MAX_LEX_MODE_STACK_SIZE 10 -#define LEXMODE() (lexBuf.lexModeStack[lexBuf.lexModeStackTop]) - -struct LexBuf { - /* input */ -#ifdef INCLUDEMFC - CFile *inputFile; -#else - FILE *inputFile; -#endif - char *inputString; - unsigned long curPos; - unsigned long inputLen; - /* lookahead buffer */ - /* -- lookahead buffer is short instead of char so that EOF - / can be represented correctly. - */ - unsigned long len; - short buf[MAX_LEX_LOOKAHEAD]; - unsigned long getPtr; - /* context stack */ - unsigned long lexModeStackTop; - enum LexMode lexModeStack[MAX_LEX_MODE_STACK_SIZE]; - /* token buffer */ - unsigned long maxToken; - char *strs; - unsigned long strsLen; - } lexBuf; - -static void lexPushMode(enum LexMode mode) - { - if (lexBuf.lexModeStackTop == (MAX_LEX_MODE_STACK_SIZE-1)) - yyerror("lexical context stack overflow"); - else { - lexBuf.lexModeStack[++lexBuf.lexModeStackTop] = mode; - } - } - -static void lexPopMode(int top) - { - /* special case of pop for ease of error recovery -- this - version will never underflow */ - if (top) - lexBuf.lexModeStackTop = 0; - else - if (lexBuf.lexModeStackTop > 0) lexBuf.lexModeStackTop--; - } - -static int lexWithinMode(enum LexMode mode) { - unsigned long i; - for (i=0;i<lexBuf.lexModeStackTop;i++) - if (mode == lexBuf.lexModeStack[i]) return 1; - return 0; - } - -static char lexGetc_() - { - /* get next char from input, no buffering. */ - if (lexBuf.curPos == lexBuf.inputLen) - return EOF; - else if (lexBuf.inputString) - return *(lexBuf.inputString + lexBuf.curPos++); - else { -#ifdef INCLUDEMFC - char result; - return lexBuf.inputFile->Read(&result, 1) == 1 ? result : EOF; -#else - return fgetc(lexBuf.inputFile); -#endif - } - } - -static int lexGeta() - { - ++lexBuf.len; - return (lexBuf.buf[lexBuf.getPtr] = lexGetc_()); - } - -static int lexGeta_(int i) - { - ++lexBuf.len; - return (lexBuf.buf[(lexBuf.getPtr+i)%MAX_LEX_LOOKAHEAD] = lexGetc_()); - } - -static void lexSkipLookahead() { - if (lexBuf.len > 0 && lexBuf.buf[lexBuf.getPtr]!=EOF) { - /* don't skip EOF. */ - lexBuf.getPtr = (lexBuf.getPtr + 1) % MAX_LEX_LOOKAHEAD; - lexBuf.len--; - } - } - -static int lexLookahead() { - int c = (lexBuf.len)? - lexBuf.buf[lexBuf.getPtr]: - lexGeta(); - /* do the \r\n -> \n or \r -> \n translation here */ - if (c == '\r') { - int a = (lexBuf.len>1)? - lexBuf.buf[(lexBuf.getPtr+1)%MAX_LEX_LOOKAHEAD]: - lexGeta_(1); - if (a == '\n') { - lexSkipLookahead(); - } - lexBuf.buf[lexBuf.getPtr] = c = '\n'; - } - else if (c == '\n') { - int a = (lexBuf.len>1)? - lexBuf.buf[lexBuf.getPtr+1]: - lexGeta_(1); - if (a == '\r') { - lexSkipLookahead(); - } - lexBuf.buf[lexBuf.getPtr] = '\n'; - } - return c; - } - -static int lexGetc() { - int c = lexLookahead(); - if (lexBuf.len > 0 && lexBuf.buf[lexBuf.getPtr]!=EOF) { - /* EOF will remain in lookahead buffer */ - lexBuf.getPtr = (lexBuf.getPtr + 1) % MAX_LEX_LOOKAHEAD; - lexBuf.len--; - } - return c; - } - -static void lexSkipLookaheadWord() { - if (lexBuf.strsLen <= lexBuf.len) { - lexBuf.len -= lexBuf.strsLen; - lexBuf.getPtr = (lexBuf.getPtr + lexBuf.strsLen) % MAX_LEX_LOOKAHEAD; - } - } - -static void lexClearToken() - { - lexBuf.strsLen = 0; - } - -static void lexAppendc(int c) - { - lexBuf.strs[lexBuf.strsLen] = c; - /* append up to zero termination */ - if (c == 0) return; - lexBuf.strsLen++; - if (lexBuf.strsLen > lexBuf.maxToken) { - /* double the token string size */ - lexBuf.maxToken <<= 1; - lexBuf.strs = (char*) realloc(lexBuf.strs,(size_t)lexBuf.maxToken); - } - } - -static char* lexStr() { - return dupStr(lexBuf.strs,(size_t)lexBuf.strsLen+1); - } - -static void lexSkipWhite() { - int c = lexLookahead(); - while (c == ' ' || c == '\t') { - lexSkipLookahead(); - c = lexLookahead(); - } - } - -static char* lexGetWord() { - int c; - lexSkipWhite(); - lexClearToken(); - c = lexLookahead(); - while (c != EOF && !strchr("\t\n ;:=",c)) { - lexAppendc(c); - lexSkipLookahead(); - c = lexLookahead(); - } - lexAppendc(0); - return lexStr(); - } - -static void lexPushLookaheadc(int c) { - int putptr; - /* can't putback EOF, because it never leaves lookahead buffer */ - if (c == EOF) return; - putptr = (int)lexBuf.getPtr - 1; - if (putptr < 0) putptr += MAX_LEX_LOOKAHEAD; - lexBuf.getPtr = putptr; - lexBuf.buf[putptr] = c; - lexBuf.len += 1; - } - -static char* lexLookaheadWord() { - /* this function can lookahead word with max size of MAX_LEX_LOOKAHEAD_0 - / and thing bigger than that will stop the lookahead and return 0; - / leading white spaces are not recoverable. - */ - int c; - int len = 0; - int curgetptr = 0; - lexSkipWhite(); - lexClearToken(); - curgetptr = (int)lexBuf.getPtr; /* remember! */ - while (len < (MAX_LEX_LOOKAHEAD_0)) { - c = lexGetc(); - len++; - if (c == EOF || strchr("\t\n ;:=", c)) { - lexAppendc(0); - /* restore lookahead buf. */ - lexBuf.len += len; - lexBuf.getPtr = curgetptr; - return lexStr(); - } - else - lexAppendc(c); - } - lexBuf.len += len; /* char that has been moved to lookahead buffer */ - lexBuf.getPtr = curgetptr; - return 0; - } - -#ifdef _SUPPORT_LINE_FOLDING -static void handleMoreRFC822LineBreak(int c) { - /* suport RFC 822 line break in cases like - * ADR: foo; - * morefoo; - * more foo; - */ - if (c == ';') { - int a; - lexSkipLookahead(); - /* skip white spaces */ - a = lexLookahead(); - while (a == ' ' || a == '\t') { - lexSkipLookahead(); - a = lexLookahead(); - } - if (a == '\n') { - lexSkipLookahead(); - a = lexLookahead(); - if (a == ' ' || a == '\t') { - /* continuation, throw away all the \n and spaces read so - * far - */ - lexSkipWhite(); - lexPushLookaheadc(';'); - } - else { - lexPushLookaheadc('\n'); - lexPushLookaheadc(';'); - } - } - else { - lexPushLookaheadc(';'); - } - } - } - -static char* lexGet1Value() { - int c; - lexSkipWhite(); - c = lexLookahead(); - lexClearToken(); - while (c != EOF && c != ';') { - if (c == '\n') { - int a; - lexSkipLookahead(); - a = lexLookahead(); - if (a == ' ' || a == '\t') { - lexAppendc(' '); - lexSkipLookahead(); - } - else { - lexPushLookaheadc('\n'); - break; - } - } - else { - lexAppendc(c); - lexSkipLookahead(); - } - c = lexLookahead(); - } - lexAppendc(0); - handleMoreRFC822LineBreak(c); - return c==EOF?0:lexStr(); - } -#endif - - -static int match_begin_name(int end) { - char *n = lexLookaheadWord(); - int token = ID; - if (n) { - if (!stricmp(n,"vcard")) token = end?END_VCARD:BEGIN_VCARD; - else if (!stricmp(n,"vcalendar")) token = end?END_VCAL:BEGIN_VCAL; - else if (!stricmp(n,"vevent")) token = end?END_VEVENT:BEGIN_VEVENT; - else if (!stricmp(n,"vtodo")) token = end?END_VTODO:BEGIN_VTODO; - deleteStr(n); - return token; - } - return 0; - } - - -#ifdef INCLUDEMFC -void initLex(const char *inputstring, unsigned long inputlen, CFile *inputfile) -#else -void initLex(const char *inputstring, unsigned long inputlen, FILE *inputfile) -#endif - { - /* initialize lex mode stack */ - lexBuf.lexModeStack[lexBuf.lexModeStackTop=0] = L_NORMAL; - - /* iniatialize lex buffer. */ - lexBuf.inputString = (char*) inputstring; - lexBuf.inputLen = inputlen; - lexBuf.curPos = 0; - lexBuf.inputFile = inputfile; - - lexBuf.len = 0; - lexBuf.getPtr = 0; - - lexBuf.maxToken = MAXTOKEN; - lexBuf.strs = (char*)malloc(MAXTOKEN); - lexBuf.strsLen = 0; - - } - -static void finiLex() { - free(lexBuf.strs); - } - - -/* This parses and converts the base64 format for binary encoding into - * a decoded buffer (allocated with new). See RFC 1521. - */ -static char * lexGetDataFromBase64() - { - unsigned long bytesLen = 0, bytesMax = 0; - int quadIx = 0, pad = 0; - unsigned long trip = 0; - unsigned char b; - int c; - unsigned char *bytes = NULL; - unsigned char *oldBytes = NULL; - - DBG_(("db: lexGetDataFromBase64\n")); - while (1) { - c = lexGetc(); - if (c == '\n') { - ++mime_lineNum; - if (lexLookahead() == '\n') { - /* a '\n' character by itself means end of data */ - break; - } - else continue; /* ignore '\n' */ - } - else { - if ((c >= 'A') && (c <= 'Z')) - b = (unsigned char)(c - 'A'); - else if ((c >= 'a') && (c <= 'z')) - b = (unsigned char)(c - 'a') + 26; - else if ((c >= '0') && (c <= '9')) - b = (unsigned char)(c - '0') + 52; - else if (c == '+') - b = 62; - else if (c == '/') - b = 63; - else if (c == '=') { - b = 0; - pad++; - } else if ((c == ' ') || (c == '\t')) { - continue; - } else { /* error condition */ - if (bytes) free(bytes); - else if (oldBytes) free(oldBytes); - /* error recovery: skip until 2 adjacent newlines. */ - DBG_(("db: invalid character 0x%x '%c'\n", c,c)); - if (c != EOF) { - c = lexGetc(); - while (c != EOF) { - if (c == '\n' && lexLookahead() == '\n') { - ++mime_lineNum; - break; - } - c = lexGetc(); - } - } - return NULL; - } - trip = (trip << 6) | b; - if (++quadIx == 4) { - unsigned char outBytes[3]; - int numOut; - int i; - for (i = 0; i < 3; i++) { - outBytes[2-i] = (unsigned char)(trip & 0xFF); - trip >>= 8; - } - numOut = 3 - pad; - if (bytesLen + numOut > bytesMax) { - if (!bytes) { - bytesMax = 1024; - bytes = (unsigned char*)malloc((size_t)bytesMax); - } - else { - bytesMax <<= 2; - oldBytes = bytes; - bytes = (unsigned char*)realloc(bytes,(size_t)bytesMax); - } - if (bytes == 0) { - mime_error("out of memory while processing BASE64 data\n"); - } - } - if (bytes) { - memcpy(bytes + bytesLen, outBytes, numOut); - bytesLen += numOut; - } - trip = 0; - quadIx = 0; - } - } - } /* while */ - DBG_(("db: bytesLen = %d\n", bytesLen)); - /* kludge: all this won't be necessary if we have tree form - representation */ - if (bytes) { - setValueWithSize(curProp,bytes,(unsigned int)bytesLen); - free(bytes); - } - else if (oldBytes) { - setValueWithSize(curProp,oldBytes,(unsigned int)bytesLen); - free(oldBytes); - } - return 0; - } - -static int match_begin_end_name(int end) { - int token; - lexSkipWhite(); - if (lexLookahead() != ':') return ID; - lexSkipLookahead(); - lexSkipWhite(); - token = match_begin_name(end); - if (token == ID) { - lexPushLookaheadc(':'); - DBG_(("db: ID '%s'\n", yylval.str)); - return ID; - } - else if (token != 0) { - lexSkipLookaheadWord(); - deleteStr(yylval.str); - DBG_(("db: begin/end %d\n", token)); - return token; - } - return 0; - } - -static char* lexGetQuotedPrintable() - { - char cur; - - lexClearToken(); - do { - cur = lexGetc(); - switch (cur) { - case '=': { - int c = 0; - int next[2]; - int i; - for (i = 0; i < 2; i++) { - next[i] = lexGetc(); - if (next[i] >= '0' && next[i] <= '9') - c = c * 16 + next[i] - '0'; - else if (next[i] >= 'A' && next[i] <= 'F') - c = c * 16 + next[i] - 'A' + 10; - else - break; - } - if (i == 0) { - /* single '=' follow by LINESEP is continuation sign? */ - if (next[0] == '\n') { - ++mime_lineNum; - } - else { - lexPushLookaheadc('='); - goto EndString; - } - } - else if (i == 1) { - lexPushLookaheadc(next[1]); - lexPushLookaheadc(next[0]); - lexAppendc('='); - } else { - lexAppendc(c); - } - break; - } /* '=' */ - case '\n': { - lexPushLookaheadc('\n'); - goto EndString; - } - case (char)EOF: - break; - default: - lexAppendc(cur); - break; - } /* switch */ - } while (cur != (char)EOF); - -EndString: - lexAppendc(0); - return lexStr(); - } /* LexQuotedPrintable */ - -int yylex() { - - int lexmode = LEXMODE(); - if (lexmode == L_VALUES) { - int c = lexGetc(); - if (c == ';') { - DBG_(("db: SEMICOLON\n")); - lexPushLookaheadc(c); -#ifdef _SUPPORT_LINE_FOLDING - handleMoreRFC822LineBreak(c); -#endif - lexSkipLookahead(); - return SEMICOLON; - } - else if (strchr("\n",c)) { - ++mime_lineNum; - /* consume all line separator(s) adjacent to each other */ - c = lexLookahead(); - while (strchr("\n",c)) { - lexSkipLookahead(); - c = lexLookahead(); - ++mime_lineNum; - } - DBG_(("db: LINESEP\n")); - return LINESEP; - } - else { - char *p = 0; - lexPushLookaheadc(c); - if (lexWithinMode(L_BASE64)) { - /* get each char and convert to bin on the fly... */ - p = lexGetDataFromBase64(); - yylval.str = p; - return STRING; - } - else if (lexWithinMode(L_QUOTED_PRINTABLE)) { - p = lexGetQuotedPrintable(); - } - else { -#ifdef _SUPPORT_LINE_FOLDING - p = lexGet1Value(); -#else - p = lexGetStrUntil(";\n"); -#endif - } - if (p) { - DBG_(("db: STRING: '%s'\n", p)); - yylval.str = p; - return STRING; - } - else return 0; - } - } - else { - /* normal mode */ - while (1) { - int c = lexGetc(); - switch(c) { - case ':': { - /* consume all line separator(s) adjacent to each other */ - /* ignoring linesep immediately after colon. */ -/* c = lexLookahead(); - while (strchr("\n",c)) { - lexSkipLookahead(); - c = lexLookahead(); - ++mime_lineNum; - }*/ - DBG_(("db: COLON\n")); - return COLON; - } - case ';': - DBG_(("db: SEMICOLON\n")); - return SEMICOLON; - case '=': - DBG_(("db: EQ\n")); - return EQ; - /* ignore whitespace in this mode */ - case '\t': - case ' ': continue; - case '\n': { - ++mime_lineNum; - continue; - } - case EOF: return 0; - break; - default: { - lexPushLookaheadc(c); - if (isalpha(c)) { - char *t = lexGetWord(); - yylval.str = t; - if (!stricmp(t, "begin")) { - return match_begin_end_name(0); - } - else if (!stricmp(t,"end")) { - return match_begin_end_name(1); - } - else { - DBG_(("db: ID '%s'\n", t)); - return ID; - } - } - else { - /* unknow token */ - return 0; - } - break; - } - } - } - } - return 0; - } - - -/***************************************************************************/ -/*** Public Functions ****/ -/***************************************************************************/ - -static VObject* Parse_MIMEHelper() - { - ObjStackTop = -1; - mime_numErrors = 0; - mime_lineNum = 1; - vObjList = 0; - curObj = 0; - - if (yyparse() != 0) - return 0; - - finiLex(); - return vObjList; - } - -DLLEXPORT(VObject*) Parse_MIME(const char *input, unsigned long len) - { - initLex(input, len, 0); - return Parse_MIMEHelper(); - } - - -#if INCLUDEMFC - -DLLEXPORT(VObject*) Parse_MIME_FromFile(CFile *file) - { - unsigned long startPos; - VObject *result; - - initLex(0,-1,file); - startPos = file->GetPosition(); - if (!(result = Parse_MIMEHelper())) - file->Seek(startPos, CFile::begin); - return result; - } - -#else - -VObject* Parse_MIME_FromFile(FILE *file) - { - VObject *result; - long startPos; - - initLex(0,(unsigned long)-1,file); - startPos = ftell(file); - if (!(result = Parse_MIMEHelper())) { - fseek(file,startPos,SEEK_SET); - } - return result; - } - -DLLEXPORT(VObject*) Parse_MIME_FromFileName(char *fname) - { - FILE *fp = fopen(fname,"r"); - if (fp) { - VObject* o = Parse_MIME_FromFile(fp); - fclose(fp); - return o; - } - else { - char msg[256]; - snprintf(msg, sizeof(msg), "can't open file '%s' for reading\n", fname); - mime_error_(msg); - return 0; - } - } - -#endif - - -static MimeErrorHandler mimeErrorHandler; - -DLLEXPORT(void) registerMimeErrorHandler(MimeErrorHandler me) - { - mimeErrorHandler = me; - } - -static void mime_error(char *s) - { - char msg[256]; - if (mimeErrorHandler) { - sprintf(msg,"%s at line %d", s, mime_lineNum); - mimeErrorHandler(msg); - } - } - -static void mime_error_(char *s) - { - if (mimeErrorHandler) { - mimeErrorHandler(s); - } - } - diff --git a/libical/src/libicalvcal/vctest.c b/libical/src/libicalvcal/vctest.c deleted file mode 100644 index 7975d1e200..0000000000 --- a/libical/src/libicalvcal/vctest.c +++ /dev/null @@ -1,95 +0,0 @@ - -#include <stdio.h> -#include <string.h> -#include "vcc.h" - -FILE *cfp; - -void myMimeErrorHandler(char *s) -{ - printf("%s\n", s); -} - -void main(int argc, char **argv) -{ - int testmem = 0; - - char * foo[2] = {"foo","alden.vcf"}; - -argc = 2; -argv = foo; - -#ifdef _CONSOLE - cfp = stdout; - registerMimeErrorHandler(myMimeErrorHandler); -#else - cfp = fopen("vctest.out", "w"); - if (!cfp) return; -#endif - ++argv; - while (--argc) { - FILE *fp; - if (strcmp(*argv,"-testmem") == 0) { - testmem = 1; - argv++; - continue; - } - fprintf(cfp,"processing %s\n",*argv); - fp = fopen(*argv,"r"); - if (!fp) { - fprintf(cfp,"error opening file\n"); - } - else { - VObject *v, *t; - FILE *ofp; - char buf[256]; - char *p; - strcpy(buf,*argv); - p = strchr(buf,'.'); - if (p) *p = 0; - strcat(buf,".out"); - fprintf(cfp,"reading text input from '%s'...\n", *argv); - /*v = Parse_MIME_FromFile(fp); */ - v = Parse_MIME_FromFileName(*argv); - writeVObjectToFile(buf,v); - cleanVObject(v); - - /* - fprintf(cfp,"pretty print internal format of '%s'...\n", *argv); - ofp = fopen(buf,"w"); - while (v) { - printVObject(cfp,v); - if (testmem) { - char *s, *p; - fprintf(cfp,"test writing to mem...\n"); - p = s = writeMemVObject(0,0,v); - if (s) { - while (*s) { - fputc(*s,ofp); - s++; - } - free(p); - } - } - else { - writeVObject(ofp,v); - } - t = v; - v = nextVObjectInList(v); - cleanVObject(t); - } - - fclose(ofp); - fclose(fp); - */ - } - - cleanStrTbl(); - argv++; - - } - - if (cfp != stdout) fclose(cfp); - -} - diff --git a/libical/src/libicalvcal/vobject.c b/libical/src/libicalvcal/vobject.c deleted file mode 100644 index d685b04278..0000000000 --- a/libical/src/libicalvcal/vobject.c +++ /dev/null @@ -1,1452 +0,0 @@ -/*************************************************************************** -(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International -Business Machines Corporation and Siemens Rolm Communications Inc. - -For purposes of this license notice, the term Licensors shall mean, -collectively, Apple Computer, Inc., AT&T Corp., International -Business Machines Corporation and Siemens Rolm Communications Inc. -The term Licensor shall mean any of the Licensors. - -Subject to acceptance of the following conditions, permission is hereby -granted by Licensors without the need for written agreement and without -license or royalty fees, to use, copy, modify and distribute this -software for any purpose. - -The above copyright notice and the following four paragraphs must be -reproduced in all copies of this software and any software including -this software. - -THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE -ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR -MODIFICATIONS. - -IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT, -INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT -OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. - -EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, -INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. - -The software is provided with RESTRICTED RIGHTS. Use, duplication, or -disclosure by the government are subject to restrictions set forth in -DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. - -***************************************************************************/ - -/* - * src: vobject.c - * doc: vobject and APIs to construct vobject, APIs pretty print - * vobject, and convert a vobject into its textual representation. - */ - -#ifndef MWERKS -#include <malloc.h> -#endif - -#include "vobject.h" -#include <string.h> -#include <stdio.h> -#include <fcntl.h> - - -#define NAME_OF(o) o->id -#define VALUE_TYPE(o) o->valType -#define STRINGZ_VALUE_OF(o) o->val.strs -#define USTRINGZ_VALUE_OF(o) o->val.ustrs -#define INTEGER_VALUE_OF(o) o->val.i -#define LONG_VALUE_OF(o) o->val.l -#define ANY_VALUE_OF(o) o->val.any -#define VOBJECT_VALUE_OF(o) o->val.vobj - -typedef union ValueItem { - const char *strs; - const wchar_t *ustrs; - unsigned int i; - unsigned long l; - void *any; - VObject *vobj; - } ValueItem; - -struct VObject { - VObject *next; - const char *id; - VObject *prop; - unsigned short valType; - ValueItem val; - }; - -typedef struct StrItem StrItem; - -struct StrItem { - StrItem *next; - const char *s; - unsigned int refCnt; - }; - -const char** fieldedProp; - - - -/*---------------------------------------------------------------------- - The following functions involve with memory allocation: - newVObject - deleteVObject - dupStr - deleteStr - newStrItem - deleteStrItem - ----------------------------------------------------------------------*/ - -DLLEXPORT(VObject*) newVObject_(const char *id) -{ - VObject *p = (VObject*)malloc(sizeof(VObject)); - p->next = 0; - p->id = id; - p->prop = 0; - VALUE_TYPE(p) = 0; - ANY_VALUE_OF(p) = 0; - return p; -} - -DLLEXPORT(VObject*) newVObject(const char *id) -{ - return newVObject_(lookupStr(id)); -} - -DLLEXPORT(void) deleteVObject(VObject *p) -{ - unUseStr(p->id); - free(p); -} - -DLLEXPORT(char*) dupStr(const char *s, unsigned int size) -{ - char *t; - if (size == 0) { - size = strlen(s); - } - t = (char*)malloc(size+1); - if (t) { - memcpy(t,s,size); - t[size] = 0; - return t; - } - else { - return (char*)0; - } -} - -DLLEXPORT(void) deleteStr(const char *p) -{ - if (p) free((void*)p); -} - - -static StrItem* newStrItem(const char *s, StrItem *next) -{ - StrItem *p = (StrItem*)malloc(sizeof(StrItem)); - p->next = next; - p->s = s; - p->refCnt = 1; - return p; -} - -static void deleteStrItem(StrItem *p) -{ - free((void*)p); -} - - -/*---------------------------------------------------------------------- - The following function provide accesses to VObject's value. - ----------------------------------------------------------------------*/ - -DLLEXPORT(const char*) vObjectName(VObject *o) -{ - return NAME_OF(o); -} - -DLLEXPORT(void) setVObjectName(VObject *o, const char* id) -{ - NAME_OF(o) = id; -} - -DLLEXPORT(const char*) vObjectStringZValue(VObject *o) -{ - return STRINGZ_VALUE_OF(o); -} - -DLLEXPORT(void) setVObjectStringZValue(VObject *o, const char *s) -{ - STRINGZ_VALUE_OF(o) = dupStr(s,0); - VALUE_TYPE(o) = VCVT_STRINGZ; -} - -DLLEXPORT(void) setVObjectStringZValue_(VObject *o, const char *s) -{ - STRINGZ_VALUE_OF(o) = s; - VALUE_TYPE(o) = VCVT_STRINGZ; -} - -DLLEXPORT(const wchar_t*) vObjectUStringZValue(VObject *o) -{ - return USTRINGZ_VALUE_OF(o); -} - -DLLEXPORT(void) setVObjectUStringZValue(VObject *o, const wchar_t *s) -{ - USTRINGZ_VALUE_OF(o) = (wchar_t*) dupStr((char*)s,(uStrLen(s)+1)*2); - VALUE_TYPE(o) = VCVT_USTRINGZ; -} - -DLLEXPORT(void) setVObjectUStringZValue_(VObject *o, const wchar_t *s) -{ - USTRINGZ_VALUE_OF(o) = s; - VALUE_TYPE(o) = VCVT_USTRINGZ; -} - -DLLEXPORT(unsigned int) vObjectIntegerValue(VObject *o) -{ - return INTEGER_VALUE_OF(o); -} - -DLLEXPORT(void) setVObjectIntegerValue(VObject *o, unsigned int i) -{ - INTEGER_VALUE_OF(o) = i; - VALUE_TYPE(o) = VCVT_UINT; -} - -DLLEXPORT(unsigned long) vObjectLongValue(VObject *o) -{ - return LONG_VALUE_OF(o); -} - -DLLEXPORT(void) setVObjectLongValue(VObject *o, unsigned long l) -{ - LONG_VALUE_OF(o) = l; - VALUE_TYPE(o) = VCVT_ULONG; -} - -DLLEXPORT(void*) vObjectAnyValue(VObject *o) -{ - return ANY_VALUE_OF(o); -} - -DLLEXPORT(void) setVObjectAnyValue(VObject *o, void *t) -{ - ANY_VALUE_OF(o) = t; - VALUE_TYPE(o) = VCVT_RAW; -} - -DLLEXPORT(VObject*) vObjectVObjectValue(VObject *o) -{ - return VOBJECT_VALUE_OF(o); -} - -DLLEXPORT(void) setVObjectVObjectValue(VObject *o, VObject *p) -{ - VOBJECT_VALUE_OF(o) = p; - VALUE_TYPE(o) = VCVT_VOBJECT; -} - -DLLEXPORT(int) vObjectValueType(VObject *o) -{ - return VALUE_TYPE(o); -} - - -/*---------------------------------------------------------------------- - The following functions can be used to build VObject. - ----------------------------------------------------------------------*/ - -DLLEXPORT(VObject*) addVObjectProp(VObject *o, VObject *p) -{ - /* circular link list pointed to tail */ - /* - o {next,id,prop,val} - V - pn {next,id,prop,val} - V - ... - p1 {next,id,prop,val} - V - pn - --> - o {next,id,prop,val} - V - pn {next,id,prop,val} - V - p {next,id,prop,val} - ... - p1 {next,id,prop,val} - V - pn - */ - - VObject *tail = o->prop; - if (tail) { - p->next = tail->next; - o->prop = tail->next = p; - } - else { - o->prop = p->next = p; - } - return p; -} - -DLLEXPORT(VObject*) addProp(VObject *o, const char *id) -{ - return addVObjectProp(o,newVObject(id)); -} - -DLLEXPORT(VObject*) addProp_(VObject *o, const char *id) -{ - return addVObjectProp(o,newVObject_(id)); -} - -DLLEXPORT(void) addList(VObject **o, VObject *p) -{ - p->next = 0; - if (*o == 0) { - *o = p; - } - else { - VObject *t = *o; - while (t->next) { - t = t->next; - } - t->next = p; - } -} - -DLLEXPORT(VObject*) nextVObjectInList(VObject *o) -{ - return o->next; -} - -DLLEXPORT(VObject*) setValueWithSize_(VObject *prop, void *val, unsigned int size) -{ - VObject *sizeProp; - setVObjectAnyValue(prop, val); - sizeProp = addProp(prop,VCDataSizeProp); - setVObjectLongValue(sizeProp, size); - return prop; -} - -DLLEXPORT(VObject*) setValueWithSize(VObject *prop, void *val, unsigned int size) -{ - void *p = dupStr((const char *)val,size); - return setValueWithSize_(prop,p,p?size:0); -} - -DLLEXPORT(void) initPropIterator(VObjectIterator *i, VObject *o) -{ - i->start = o->prop; - i->next = 0; -} - -DLLEXPORT(void) initVObjectIterator(VObjectIterator *i, VObject *o) -{ - i->start = o->next; - i->next = 0; -} - -DLLEXPORT(int) moreIteration(VObjectIterator *i) -{ - return (i->start && (i->next==0 || i->next!=i->start)); -} - -DLLEXPORT(VObject*) nextVObject(VObjectIterator *i) -{ - if (i->start && i->next != i->start) { - if (i->next == 0) { - i->next = i->start->next; - return i->next; - } - else { - i->next = i->next->next; - return i->next; - } - } - else return (VObject*)0; -} - -DLLEXPORT(VObject*) isAPropertyOf(VObject *o, const char *id) -{ - VObjectIterator i; - initPropIterator(&i,o); - while (moreIteration(&i)) { - VObject *each = nextVObject(&i); - if (!stricmp(id,each->id)) - return each; - } - return (VObject*)0; -} - -DLLEXPORT(VObject*) addGroup(VObject *o, const char *g) -{ - /* - a.b.c - --> - prop(c) - prop(VCGrouping=b) - prop(VCGrouping=a) - */ - char *dot = strrchr(g,'.'); - if (dot) { - VObject *p, *t; - char *gs, *n = dot+1; - gs = dupStr(g,0); /* so we can write to it. */ - /* used to be - * t = p = addProp_(o,lookupProp_(n)); - */ - t = p = addProp_(o,lookupProp(n)); - dot = strrchr(gs,'.'); - *dot = 0; - do { - dot = strrchr(gs,'.'); - if (dot) { - n = dot+1; - *dot=0; - } - else - n = gs; - /* property(VCGroupingProp=n); - * and the value may have VCGrouping property - */ - t = addProp(t,VCGroupingProp); - setVObjectStringZValue(t,lookupProp_(n)); - } while (n != gs); - deleteStr(gs); - return p; - } - else - return addProp_(o,lookupProp(g)); -} - -DLLEXPORT(VObject*) addPropValue(VObject *o, const char *p, const char *v) -{ - VObject *prop; - prop = addProp(o,p); - setVObjectUStringZValue_(prop, fakeUnicode(v,0)); - return prop; -} - -DLLEXPORT(VObject*) addPropSizedValue_(VObject *o, const char *p, const char *v, - unsigned int size) -{ - VObject *prop; - prop = addProp(o,p); - setValueWithSize_(prop, (void*)v, size); - return prop; -} - -DLLEXPORT(VObject*) addPropSizedValue(VObject *o, const char *p, const char *v, - unsigned int size) -{ - return addPropSizedValue_(o,p,dupStr(v,size),size); -} - - - -/*---------------------------------------------------------------------- - The following pretty print a VObject - ----------------------------------------------------------------------*/ - -static void printVObject_(FILE *fp, VObject *o, int level); - -static void indent(FILE *fp, int level) -{ - int i; - for (i=0;i<level*4;i++) { - fputc(' ', fp); - } -} - -static void printValue(FILE *fp, VObject *o, int level) -{ - switch (VALUE_TYPE(o)) { - case VCVT_USTRINGZ: { - char c; - char *t,*s; - s = t = fakeCString(USTRINGZ_VALUE_OF(o)); - fputc('"',fp); - while (c=*t,c) { - fputc(c,fp); - if (c == '\n') indent(fp,level+2); - t++; - } - fputc('"',fp); - deleteStr(s); - break; - } - case VCVT_STRINGZ: { - char c; - const char *s = STRINGZ_VALUE_OF(o); - fputc('"',fp); - while (c=*s,c) { - fputc(c,fp); - if (c == '\n') indent(fp,level+2); - s++; - } - fputc('"',fp); - break; - } - case VCVT_UINT: - fprintf(fp,"%d", INTEGER_VALUE_OF(o)); break; - case VCVT_ULONG: - fprintf(fp,"%ld", LONG_VALUE_OF(o)); break; - case VCVT_RAW: - fprintf(fp,"[raw data]"); break; - case VCVT_VOBJECT: - fprintf(fp,"[vobject]\n"); - printVObject_(fp,VOBJECT_VALUE_OF(o),level+1); - break; - case 0: - fprintf(fp,"[none]"); break; - default: - fprintf(fp,"[unknown]"); break; - } -} - -static void printNameValue(FILE *fp,VObject *o, int level) -{ - indent(fp,level); - if (NAME_OF(o)) { - fprintf(fp,"%s", NAME_OF(o)); - } - if (VALUE_TYPE(o)) { - fputc('=',fp); - printValue(fp,o, level); - } - fprintf(fp,"\n"); -} - -static void printVObject_(FILE *fp, VObject *o, int level) - { - VObjectIterator t; - if (o == 0) { - fprintf(fp,"[NULL]\n"); - return; - } - printNameValue(fp,o,level); - initPropIterator(&t,o); - while (moreIteration(&t)) { - VObject *eachProp = nextVObject(&t); - printVObject_(fp,eachProp,level+1); - } - } - -void printVObject(FILE *fp,VObject *o) -{ - printVObject_(fp,o,0); -} - -DLLEXPORT(void) printVObjectToFile(char *fname,VObject *o) -{ - FILE *fp = fopen(fname,"w"); - if (fp) { - printVObject(fp,o); - fclose(fp); - } -} - -DLLEXPORT(void) printVObjectsToFile(char *fname,VObject *list) -{ - FILE *fp = fopen(fname,"w"); - if (fp) { - while (list) { - printVObject(fp,list); - list = nextVObjectInList(list); - } - fclose(fp); - } -} - -DLLEXPORT(void) cleanVObject(VObject *o) -{ - if (o == 0) return; - if (o->prop) { - /* destroy time: cannot use the iterator here. - Have to break the cycle in the circular link - list and turns it into regular NULL-terminated - list -- since at some point of destruction, - the reference entry for the iterator to work - will not longer be valid. - */ - VObject *p; - p = o->prop->next; - o->prop->next = 0; - do { - VObject *t = p->next; - cleanVObject(p); - p = t; - } while (p); - } - switch (VALUE_TYPE(o)) { - case VCVT_USTRINGZ: - case VCVT_STRINGZ: - case VCVT_RAW: - /* assume they are all allocated by malloc. */ - free((char*)STRINGZ_VALUE_OF(o)); - break; - case VCVT_VOBJECT: - cleanVObject(VOBJECT_VALUE_OF(o)); - break; - } - deleteVObject(o); -} - -DLLEXPORT(void) cleanVObjects(VObject *list) -{ - while (list) { - VObject *t = list; - list = nextVObjectInList(list); - cleanVObject(t); - } -} - -/*---------------------------------------------------------------------- - The following is a String Table Facilities. - ----------------------------------------------------------------------*/ - -#define STRTBLSIZE 255 - -static StrItem *strTbl[STRTBLSIZE]; - -static unsigned int hashStr(const char *s) -{ - unsigned int h = 0; - int i; - for (i=0;s[i];i++) { - h += s[i]*i; - } - return h % STRTBLSIZE; -} - -DLLEXPORT(const char*) lookupStr(const char *s) -{ - StrItem *t; - unsigned int h = hashStr(s); - if ((t = strTbl[h]) != 0) { - do { - if (stricmp(t->s,s) == 0) { - t->refCnt++; - return t->s; - } - t = t->next; - } while (t); - } - s = dupStr(s,0); - strTbl[h] = newStrItem(s,strTbl[h]); - return s; -} - -DLLEXPORT(void) unUseStr(const char *s) -{ - StrItem *t, *p; - unsigned int h = hashStr(s); - if ((t = strTbl[h]) != 0) { - p = t; - do { - if (stricmp(t->s,s) == 0) { - t->refCnt--; - if (t->refCnt == 0) { - if (p == strTbl[h]) { - strTbl[h] = t->next; - } - else { - p->next = t->next; - } - deleteStr(t->s); - deleteStrItem(t); - return; - } - } - p = t; - t = t->next; - } while (t); - } -} - -DLLEXPORT(void) cleanStrTbl() -{ - int i; - for (i=0; i<STRTBLSIZE;i++) { - StrItem *t = strTbl[i]; - while (t) { - StrItem *p; - deleteStr(t->s); - p = t; - t = t->next; - deleteStrItem(p); - } while (t); - strTbl[i] = 0; - } -} - - -struct PreDefProp { - const char *name; - const char *alias; - const char** fields; - unsigned int flags; - }; - -/* flags in PreDefProp */ -#define PD_BEGIN 0x1 -#define PD_INTERNAL 0x2 - -static const char *adrFields[] = { - VCPostalBoxProp, - VCExtAddressProp, - VCStreetAddressProp, - VCCityProp, - VCRegionProp, - VCPostalCodeProp, - VCCountryNameProp, - 0 -}; - -static const char *nameFields[] = { - VCFamilyNameProp, - VCGivenNameProp, - VCAdditionalNamesProp, - VCNamePrefixesProp, - VCNameSuffixesProp, - NULL - }; - -static const char *orgFields[] = { - VCOrgNameProp, - VCOrgUnitProp, - VCOrgUnit2Prop, - VCOrgUnit3Prop, - VCOrgUnit4Prop, - NULL - }; - -static const char *AAlarmFields[] = { - VCRunTimeProp, - VCSnoozeTimeProp, - VCRepeatCountProp, - VCAudioContentProp, - 0 - }; - -/* ExDate -- has unamed fields */ -/* RDate -- has unamed fields */ - -static const char *DAlarmFields[] = { - VCRunTimeProp, - VCSnoozeTimeProp, - VCRepeatCountProp, - VCDisplayStringProp, - 0 - }; - -static const char *MAlarmFields[] = { - VCRunTimeProp, - VCSnoozeTimeProp, - VCRepeatCountProp, - VCEmailAddressProp, - VCNoteProp, - 0 - }; - -static const char *PAlarmFields[] = { - VCRunTimeProp, - VCSnoozeTimeProp, - VCRepeatCountProp, - VCProcedureNameProp, - 0 - }; - -static struct PreDefProp propNames[] = { - { VC7bitProp, 0, 0, 0 }, - { VC8bitProp, 0, 0, 0 }, - { VCAAlarmProp, 0, AAlarmFields, 0 }, - { VCAdditionalNamesProp, 0, 0, 0 }, - { VCAdrProp, 0, adrFields, 0 }, - { VCAgentProp, 0, 0, 0 }, - { VCAIFFProp, 0, 0, 0 }, - { VCAOLProp, 0, 0, 0 }, - { VCAppleLinkProp, 0, 0, 0 }, - { VCAttachProp, 0, 0, 0 }, - { VCAttendeeProp, 0, 0, 0 }, - { VCATTMailProp, 0, 0, 0 }, - { VCAudioContentProp, 0, 0, 0 }, - { VCAVIProp, 0, 0, 0 }, - { VCBase64Prop, 0, 0, 0 }, - { VCBBSProp, 0, 0, 0 }, - { VCBirthDateProp, 0, 0, 0 }, - { VCBMPProp, 0, 0, 0 }, - { VCBodyProp, 0, 0, 0 }, - { VCBusinessRoleProp, 0, 0, 0 }, - { VCCalProp, 0, 0, PD_BEGIN }, - { VCCaptionProp, 0, 0, 0 }, - { VCCardProp, 0, 0, PD_BEGIN }, - { VCCarProp, 0, 0, 0 }, - { VCCategoriesProp, 0, 0, 0 }, - { VCCellularProp, 0, 0, 0 }, - { VCCGMProp, 0, 0, 0 }, - { VCCharSetProp, 0, 0, 0 }, - { VCCIDProp, VCContentIDProp, 0, 0 }, - { VCCISProp, 0, 0, 0 }, - { VCCityProp, 0, 0, 0 }, - { VCClassProp, 0, 0, 0 }, - { VCCommentProp, 0, 0, 0 }, - { VCCompletedProp, 0, 0, 0 }, - { VCContentIDProp, 0, 0, 0 }, - { VCCountryNameProp, 0, 0, 0 }, - { VCDAlarmProp, 0, DAlarmFields, 0 }, - { VCDataSizeProp, 0, 0, PD_INTERNAL }, - { VCDayLightProp, 0, 0, 0 }, - { VCDCreatedProp, 0, 0, 0 }, - { VCDeliveryLabelProp, 0, 0, 0 }, - { VCDescriptionProp, 0, 0, 0 }, - { VCDIBProp, 0, 0, 0 }, - { VCDisplayStringProp, 0, 0, 0 }, - { VCDomesticProp, 0, 0, 0 }, - { VCDTendProp, 0, 0, 0 }, - { VCDTstartProp, 0, 0, 0 }, - { VCDueProp, 0, 0, 0 }, - { VCEmailAddressProp, 0, 0, 0 }, - { VCEncodingProp, 0, 0, 0 }, - { VCEndProp, 0, 0, 0 }, - { VCEventProp, 0, 0, PD_BEGIN }, - { VCEWorldProp, 0, 0, 0 }, - { VCExNumProp, 0, 0, 0 }, - { VCExpDateProp, 0, 0, 0 }, - { VCExpectProp, 0, 0, 0 }, - { VCExtAddressProp, 0, 0, 0 }, - { VCFamilyNameProp, 0, 0, 0 }, - { VCFaxProp, 0, 0, 0 }, - { VCFullNameProp, 0, 0, 0 }, - { VCGeoLocationProp, 0, 0, 0 }, - { VCGeoProp, 0, 0, 0 }, - { VCGIFProp, 0, 0, 0 }, - { VCGivenNameProp, 0, 0, 0 }, - { VCGroupingProp, 0, 0, 0 }, - { VCHomeProp, 0, 0, 0 }, - { VCIBMMailProp, 0, 0, 0 }, - { VCInlineProp, 0, 0, 0 }, - { VCInternationalProp, 0, 0, 0 }, - { VCInternetProp, 0, 0, 0 }, - { VCISDNProp, 0, 0, 0 }, - { VCJPEGProp, 0, 0, 0 }, - { VCLanguageProp, 0, 0, 0 }, - { VCLastModifiedProp, 0, 0, 0 }, - { VCLastRevisedProp, 0, 0, 0 }, - { VCLocationProp, 0, 0, 0 }, - { VCLogoProp, 0, 0, 0 }, - { VCMailerProp, 0, 0, 0 }, - { VCMAlarmProp, 0, MAlarmFields, 0 }, - { VCMCIMailProp, 0, 0, 0 }, - { VCMessageProp, 0, 0, 0 }, - { VCMETProp, 0, 0, 0 }, - { VCModemProp, 0, 0, 0 }, - { VCMPEG2Prop, 0, 0, 0 }, - { VCMPEGProp, 0, 0, 0 }, - { VCMSNProp, 0, 0, 0 }, - { VCNamePrefixesProp, 0, 0, 0 }, - { VCNameProp, 0, nameFields, 0 }, - { VCNameSuffixesProp, 0, 0, 0 }, - { VCNoteProp, 0, 0, 0 }, - { VCOrgNameProp, 0, 0, 0 }, - { VCOrgProp, 0, orgFields, 0 }, - { VCOrgUnit2Prop, 0, 0, 0 }, - { VCOrgUnit3Prop, 0, 0, 0 }, - { VCOrgUnit4Prop, 0, 0, 0 }, - { VCOrgUnitProp, 0, 0, 0 }, - { VCPagerProp, 0, 0, 0 }, - { VCPAlarmProp, 0, PAlarmFields, 0 }, - { VCParcelProp, 0, 0, 0 }, - { VCPartProp, 0, 0, 0 }, - { VCPCMProp, 0, 0, 0 }, - { VCPDFProp, 0, 0, 0 }, - { VCPGPProp, 0, 0, 0 }, - { VCPhotoProp, 0, 0, 0 }, - { VCPICTProp, 0, 0, 0 }, - { VCPMBProp, 0, 0, 0 }, - { VCPostalBoxProp, 0, 0, 0 }, - { VCPostalCodeProp, 0, 0, 0 }, - { VCPostalProp, 0, 0, 0 }, - { VCPowerShareProp, 0, 0, 0 }, - { VCPreferredProp, 0, 0, 0 }, - { VCPriorityProp, 0, 0, 0 }, - { VCProcedureNameProp, 0, 0, 0 }, - { VCProdIdProp, 0, 0, 0 }, - { VCProdigyProp, 0, 0, 0 }, - { VCPronunciationProp, 0, 0, 0 }, - { VCPSProp, 0, 0, 0 }, - { VCPublicKeyProp, 0, 0, 0 }, - { VCQPProp, VCQuotedPrintableProp, 0, 0 }, - { VCQuickTimeProp, 0, 0, 0 }, - { VCQuotedPrintableProp, 0, 0, 0 }, - { VCRDateProp, 0, 0, 0 }, - { VCRegionProp, 0, 0, 0 }, - { VCRelatedToProp, 0, 0, 0 }, - { VCRepeatCountProp, 0, 0, 0 }, - { VCResourcesProp, 0, 0, 0 }, - { VCRNumProp, 0, 0, 0 }, - { VCRoleProp, 0, 0, 0 }, - { VCRRuleProp, 0, 0, 0 }, - { VCRSVPProp, 0, 0, 0 }, - { VCRunTimeProp, 0, 0, 0 }, - { VCSequenceProp, 0, 0, 0 }, - { VCSnoozeTimeProp, 0, 0, 0 }, - { VCStartProp, 0, 0, 0 }, - { VCStatusProp, 0, 0, 0 }, - { VCStreetAddressProp, 0, 0, 0 }, - { VCSubTypeProp, 0, 0, 0 }, - { VCSummaryProp, 0, 0, 0 }, - { VCTelephoneProp, 0, 0, 0 }, - { VCTIFFProp, 0, 0, 0 }, - { VCTimeZoneProp, 0, 0, 0 }, - { VCTitleProp, 0, 0, 0 }, - { VCTLXProp, 0, 0, 0 }, - { VCTodoProp, 0, 0, PD_BEGIN }, - { VCTranspProp, 0, 0, 0 }, - { VCUniqueStringProp, 0, 0, 0 }, - { VCURLProp, 0, 0, 0 }, - { VCURLValueProp, 0, 0, 0 }, - { VCValueProp, 0, 0, 0 }, - { VCVersionProp, 0, 0, 0 }, - { VCVideoProp, 0, 0, 0 }, - { VCVoiceProp, 0, 0, 0 }, - { VCWAVEProp, 0, 0, 0 }, - { VCWMFProp, 0, 0, 0 }, - { VCWorkProp, 0, 0, 0 }, - { VCX400Prop, 0, 0, 0 }, - { VCX509Prop, 0, 0, 0 }, - { VCXRuleProp, 0, 0, 0 }, - { 0,0,0,0 } - }; - - -static struct PreDefProp* lookupPropInfo(const char* str) -{ - /* brute force for now, could use a hash table here. */ - int i; - - for (i = 0; propNames[i].name; i++) - if (stricmp(str, propNames[i].name) == 0) { - return &propNames[i]; - } - - return 0; -} - - -DLLEXPORT(const char*) lookupProp_(const char* str) -{ - int i; - - for (i = 0; propNames[i].name; i++) - if (stricmp(str, propNames[i].name) == 0) { - const char* s; - s = propNames[i].alias?propNames[i].alias:propNames[i].name; - return lookupStr(s); - } - return lookupStr(str); -} - - -DLLEXPORT(const char*) lookupProp(const char* str) -{ - int i; - - for (i = 0; propNames[i].name; i++) - if (stricmp(str, propNames[i].name) == 0) { - const char *s; - fieldedProp = propNames[i].fields; - s = propNames[i].alias?propNames[i].alias:propNames[i].name; - return lookupStr(s); - } - fieldedProp = 0; - return lookupStr(str); -} - - -/*---------------------------------------------------------------------- - APIs to Output text form. - ----------------------------------------------------------------------*/ -#define OFILE_REALLOC_SIZE 256 -typedef struct OFile { - FILE *fp; - char *s; - int len; - int limit; - int alloc:1; - int fail:1; - } OFile; - -#if 0 -static void appendsOFile(OFile *fp, const char *s) -{ - int slen; - if (fp->fail) return; - slen = strlen(s); - if (fp->fp) { - fwrite(s,1,slen,fp->fp); - } - else { -stuff: - if (fp->len + slen < fp->limit) { - memcpy(fp->s+fp->len,s,slen); - fp->len += slen; - return; - } - else if (fp->alloc) { - fp->limit = fp->limit + OFILE_REALLOC_SIZE; - if (OFILE_REALLOC_SIZE <= slen) fp->limit += slen; - fp->s = (char *) realloc(fp->s,fp->limit); - if (fp->s) goto stuff; - } - if (fp->alloc) - free(fp->s); - fp->s = 0; - fp->fail = 1; - } -} - -static void appendcOFile(OFile *fp, char c) -{ - if (fp->fail) return; - if (fp->fp) { - fputc(c,fp->fp); - } - else { -stuff: - if (fp->len+1 < fp->limit) { - fp->s[fp->len] = c; - fp->len++; - return; - } - else if (fp->alloc) { - fp->limit = fp->limit + OFILE_REALLOC_SIZE; - fp->s = (char *) realloc(fp->s,fp->limit); - if (fp->s) goto stuff; - } - if (fp->alloc) - free(fp->s); - fp->s = 0; - fp->fail = 1; - } -} -#else -static void appendcOFile_(OFile *fp, char c) -{ - if (fp->fail) return; - if (fp->fp) { - fputc(c,fp->fp); - } - else { -stuff: - if (fp->len+1 < fp->limit) { - fp->s[fp->len] = c; - fp->len++; - return; - } - else if (fp->alloc) { - fp->limit = fp->limit + OFILE_REALLOC_SIZE; - fp->s = realloc(fp->s,fp->limit); - if (fp->s) goto stuff; - } - if (fp->alloc) - free(fp->s); - fp->s = 0; - fp->fail = 1; - } -} - -static void appendcOFile(OFile *fp, char c) -{ - if (c == '\n') { - /* write out as <CR><LF> */ - appendcOFile_(fp,0xd); - appendcOFile_(fp,0xa); - } - else - appendcOFile_(fp,c); -} - -static void appendsOFile(OFile *fp, const char *s) -{ - int i, slen; - slen = strlen(s); - for (i=0; i<slen; i++) { - appendcOFile(fp,s[i]); - } -} - -#endif - -static void initOFile(OFile *fp, FILE *ofp) -{ - fp->fp = ofp; - fp->s = 0; - fp->len = 0; - fp->limit = 0; - fp->alloc = 0; - fp->fail = 0; -} - -static void initMemOFile(OFile *fp, char *s, int len) -{ - fp->fp = 0; - fp->s = s; - fp->len = 0; - fp->limit = s?len:0; - fp->alloc = s?0:1; - fp->fail = 0; -} - - -static int writeBase64(OFile *fp, unsigned char *s, long len) -{ - long cur = 0; - int i, numQuads = 0; - unsigned long trip; - unsigned char b; - char quad[5]; -#define MAXQUADS 16 - - quad[4] = 0; - - while (cur < len) { - /* collect the triplet of bytes into 'trip' */ - trip = 0; - for (i = 0; i < 3; i++) { - b = (cur < len) ? *(s + cur) : 0; - cur++; - trip = trip << 8 | b; - } - /* fill in 'quad' with the appropriate four characters */ - for (i = 3; i >= 0; i--) { - b = (unsigned char)(trip & 0x3F); - trip = trip >> 6; - if ((3 - i) < (cur - len)) - quad[i] = '='; /* pad char */ - else if (b < 26) quad[i] = (char)b + 'A'; - else if (b < 52) quad[i] = (char)(b - 26) + 'a'; - else if (b < 62) quad[i] = (char)(b - 52) + '0'; - else if (b == 62) quad[i] = '+'; - else quad[i] = '/'; - } - /* now output 'quad' with appropriate whitespace and line ending */ - appendsOFile(fp, (numQuads == 0 ? " " : "")); - appendsOFile(fp, quad); - appendsOFile(fp, ((cur >= len)?"\n" :(numQuads==MAXQUADS-1?"\n" : ""))); - numQuads = (numQuads + 1) % MAXQUADS; - } - appendcOFile(fp,'\n'); - - return 1; -} - -static void writeString(OFile *fp, const char *s) -{ - appendsOFile(fp,s); -} - -static void writeQPString(OFile *fp, const char *s) -{ - char buf[4]; - int count=0; - const char *p = s; - - while (*p) { - /* break up lines biggger than 75 chars */ - if(count >=74){ - count=0; - appendsOFile(fp,"=\n"); - } - - /* escape any non ASCII characters and '=' as per rfc1521 */ - if (*p<= 0x1f || *p >=0x7f || *p == '=' ) { - sprintf(buf,"=%02X",(unsigned char)*p); - appendsOFile(fp,buf); - count+=3; - } else { - appendcOFile(fp,*p); - count++; - } - p++; - } -} - - - -static void writeVObject_(OFile *fp, VObject *o); - -static void writeValue(OFile *fp, VObject *o, unsigned long size,int quote) -{ - if (o == 0) return; - switch (VALUE_TYPE(o)) { - case VCVT_USTRINGZ: { - char *s = fakeCString(USTRINGZ_VALUE_OF(o)); - if(quote) writeQPString(fp, s); - else writeString(fp,s); - deleteStr(s); - break; - } - case VCVT_STRINGZ: { - if(quote) writeQPString(fp, STRINGZ_VALUE_OF(o)); - else writeString(fp,STRINGZ_VALUE_OF(o)); - break; - } - case VCVT_UINT: { - char buf[16]; - sprintf(buf,"%u", INTEGER_VALUE_OF(o)); - appendsOFile(fp,buf); - break; - } - case VCVT_ULONG: { - char buf[16]; - sprintf(buf,"%lu", LONG_VALUE_OF(o)); - appendsOFile(fp,buf); - break; - } - case VCVT_RAW: { - appendcOFile(fp,'\n'); - writeBase64(fp,(unsigned char*)(ANY_VALUE_OF(o)),size); - break; - } - case VCVT_VOBJECT: - appendcOFile(fp,'\n'); - writeVObject_(fp,VOBJECT_VALUE_OF(o)); - break; - } -} - -static void writeAttrValue(OFile *fp, VObject *o) -{ - if (NAME_OF(o)) { - struct PreDefProp *pi; - pi = lookupPropInfo(NAME_OF(o)); - if (pi && ((pi->flags & PD_INTERNAL) != 0)) return; - appendcOFile(fp,';'); - appendsOFile(fp,NAME_OF(o)); - } - else - appendcOFile(fp,';'); - if (VALUE_TYPE(o)) { - appendcOFile(fp,'='); - writeValue(fp,o,0,0); - } -} - -static void writeGroup(OFile *fp, VObject *o) -{ - char buf1[256]; - char buf2[256]; - strcpy(buf1,NAME_OF(o)); - while ((o=isAPropertyOf(o,VCGroupingProp)) != 0) { - strcpy(buf2,STRINGZ_VALUE_OF(o)); - strcat(buf2,"."); - strcat(buf2,buf1); - strcpy(buf1,buf2); - } - appendsOFile(fp,buf1); -} - -static int inList(const char **list, const char *s) -{ - if (list == 0) return 0; - while (*list) { - if (stricmp(*list,s) == 0) return 1; - list++; - } - return 0; -} - -static void writeProp(OFile *fp, VObject *o) -{ - int isQuoted=0; - if (NAME_OF(o)) { - struct PreDefProp *pi; - VObjectIterator t; - const char **fields_ = 0; - pi = lookupPropInfo(NAME_OF(o)); - if (pi && ((pi->flags & PD_BEGIN) != 0)) { - writeVObject_(fp,o); - return; - } - if (isAPropertyOf(o,VCGroupingProp)) - writeGroup(fp,o); - else - appendsOFile(fp,NAME_OF(o)); - if (pi) fields_ = pi->fields; - initPropIterator(&t,o); - while (moreIteration(&t)) { - const char *s; - VObject *eachProp = nextVObject(&t); - s = NAME_OF(eachProp); - if (stricmp(VCGroupingProp,s) && !inList(fields_,s)) - writeAttrValue(fp,eachProp); - if (stricmp(VCQPProp,s)==0 || stricmp(VCQuotedPrintableProp,s)==0) - isQuoted=1; - } - if (fields_) { - int i = 0, n = 0; - const char** fields = fields_; - /* output prop as fields */ - appendcOFile(fp,':'); - while (*fields) { - VObject *t = isAPropertyOf(o,*fields); - i++; - if (t) n = i; - fields++; - } - fields = fields_; - for (i=0;i<n;i++) { - writeValue(fp,isAPropertyOf(o,*fields),0,isQuoted); - fields++; - if (i<(n-1)) appendcOFile(fp,';'); - } - } - } - - if (VALUE_TYPE(o)) { - unsigned long size = 0; - VObject *p = isAPropertyOf(o,VCDataSizeProp); - if (p) size = LONG_VALUE_OF(p); - appendcOFile(fp,':'); - writeValue(fp,o,size,isQuoted); - } - - appendcOFile(fp,'\n'); -} - -static void writeVObject_(OFile *fp, VObject *o) -{ - if (NAME_OF(o)) { - struct PreDefProp *pi; - pi = lookupPropInfo(NAME_OF(o)); - - if (pi && ((pi->flags & PD_BEGIN) != 0)) { - VObjectIterator t; - const char *begin = NAME_OF(o); - appendsOFile(fp,"BEGIN:"); - appendsOFile(fp,begin); - appendcOFile(fp,'\n'); - initPropIterator(&t,o); - while (moreIteration(&t)) { - VObject *eachProp = nextVObject(&t); - writeProp(fp, eachProp); - } - appendsOFile(fp,"END:"); - appendsOFile(fp,begin); - appendsOFile(fp,"\n\n"); - } - } -} - -void writeVObject(FILE *fp, VObject *o) -{ - OFile ofp; - initOFile(&ofp,fp); - writeVObject_(&ofp,o); -} - -DLLEXPORT(void) writeVObjectToFile(char *fname, VObject *o) -{ - FILE *fp = fopen(fname,"w"); - if (fp) { - writeVObject(fp,o); - fclose(fp); - } -} - -DLLEXPORT(void) writeVObjectsToFile(char *fname, VObject *list) -{ - FILE *fp = fopen(fname,"w"); - if (fp) { - while (list) { - writeVObject(fp,list); - list = nextVObjectInList(list); - } - fclose(fp); - } -} - -DLLEXPORT(char*) writeMemVObject(char *s, int *len, VObject *o) -{ - OFile ofp; - initMemOFile(&ofp,s,len?*len:0); - writeVObject_(&ofp,o); - if (len) *len = ofp.len; - appendcOFile(&ofp,0); - return ofp.s; -} - -DLLEXPORT(char*) writeMemVObjects(char *s, int *len, VObject *list) -{ - OFile ofp; - initMemOFile(&ofp,s,len?*len:0); - while (list) { - writeVObject_(&ofp,list); - list = nextVObjectInList(list); - } - if (len) *len = ofp.len; - appendcOFile(&ofp,0); - return ofp.s; -} - -/*---------------------------------------------------------------------- - APIs to do fake Unicode stuff. - ----------------------------------------------------------------------*/ -DLLEXPORT(wchar_t*) fakeUnicode(const char *ps, int *bytes) -{ - wchar_t *r, *pw; - int len = strlen(ps)+1; - - pw = r = (wchar_t*)malloc(sizeof(wchar_t)*len); - if (bytes) - *bytes = len * sizeof(wchar_t); - - while (*ps) { - if (*ps == '\n') - *pw = (wchar_t)0x2028; - else if (*ps == '\r') - *pw = (wchar_t)0x2029; - else - *pw = (wchar_t)(unsigned char)*ps; - ps++; pw++; - } - *pw = (wchar_t)0; - - return r; -} - -DLLEXPORT(int) uStrLen(const wchar_t *u) -{ - int i = 0; - while (*u != (wchar_t)0) { u++; i++; } - return i; -} - -DLLEXPORT(char*) fakeCString(const wchar_t *u) -{ - char *s, *t; - int len = uStrLen(u) + 1; - t = s = (char*)malloc(len); - while (*u) { - if (*u == (wchar_t)0x2028) - *t = '\n'; - else if (*u == (wchar_t)0x2029) - *t = '\r'; - else - *t = (char)*u; - u++; t++; - } - *t = 0; - return s; -} - -/* end of source file vobject.c */ diff --git a/libical/src/libicalvcal/vobject.h b/libical/src/libicalvcal/vobject.h deleted file mode 100644 index bc31dc8297..0000000000 --- a/libical/src/libicalvcal/vobject.h +++ /dev/null @@ -1,366 +0,0 @@ -/*************************************************************************** -(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International -Business Machines Corporation and Siemens Rolm Communications Inc. - -For purposes of this license notice, the term Licensors shall mean, -collectively, Apple Computer, Inc., AT&T Corp., International -Business Machines Corporation and Siemens Rolm Communications Inc. -The term Licensor shall mean any of the Licensors. - -Subject to acceptance of the following conditions, permission is hereby -granted by Licensors without the need for written agreement and without -license or royalty fees, to use, copy, modify and distribute this -software for any purpose. - -The above copyright notice and the following four paragraphs must be -reproduced in all copies of this software and any software including -this software. - -THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE -ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR -MODIFICATIONS. - -IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT, -INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT -OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. - -EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, -INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. - -The software is provided with RESTRICTED RIGHTS. Use, duplication, or -disclosure by the government are subject to restrictions set forth in -DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. - -***************************************************************************/ - -/* - -The vCard/vCalendar C interface is implemented in the set -of files as follows: - -vcc.y, yacc source, and vcc.c, the yacc output you will use -implements the core parser - -vobject.c implements an API that insulates the caller from -the parser and changes in the vCard/vCalendar BNF - -port.h defines compilation environment dependent stuff - -vcc.h and vobject.h are header files for their .c counterparts - -vcaltmp.h and vcaltmp.c implement vCalendar "macro" functions -which you may find useful. - -test.c is a standalone test driver that exercises some of -the features of the APIs provided. Invoke test.exe on a -VCARD/VCALENDAR input text file and you will see the pretty -print output of the internal representation (this pretty print -output should give you a good idea of how the internal -representation looks like -- there is one such output in the -following too). Also, a file with the .out suffix is generated -to show that the internal representation can be written back -in the original text format. - -For more information on this API see the readme.txt file -which accompanied this distribution. - - Also visit: - - http://www.versit.com - http://www.ralden.com - -*/ - - -#ifndef __VOBJECT_H__ -#define __VOBJECT_H__ 1 - - -#include "port.h" -#include <stdlib.h> -#include <stdio.h> - -#if defined(__CPLUSPLUS__) || defined(__cplusplus) -extern "C" { -#endif - - -#define VC7bitProp "7BIT" -#define VC8bitProp "8BIT" -#define VCAAlarmProp "AALARM" -#define VCAdditionalNamesProp "ADDN" -#define VCAdrProp "ADR" -#define VCAgentProp "AGENT" -#define VCAIFFProp "AIFF" -#define VCAOLProp "AOL" -#define VCAppleLinkProp "APPLELINK" -#define VCAttachProp "ATTACH" -#define VCAttendeeProp "ATTENDEE" -#define VCATTMailProp "ATTMAIL" -#define VCAudioContentProp "AUDIOCONTENT" -#define VCAVIProp "AVI" -#define VCBase64Prop "BASE64" -#define VCBBSProp "BBS" -#define VCBirthDateProp "BDAY" -#define VCBMPProp "BMP" -#define VCBodyProp "BODY" -#define VCBusinessRoleProp "ROLE" -#define VCCalProp "VCALENDAR" -#define VCCaptionProp "CAP" -#define VCCardProp "VCARD" -#define VCCarProp "CAR" -#define VCCategoriesProp "CATEGORIES" -#define VCCellularProp "CELL" -#define VCCGMProp "CGM" -#define VCCharSetProp "CS" -#define VCCIDProp "CID" -#define VCCISProp "CIS" -#define VCCityProp "L" -#define VCClassProp "CLASS" -#define VCCommentProp "NOTE" -#define VCCompletedProp "COMPLETED" -#define VCContentIDProp "CONTENT-ID" -#define VCCountryNameProp "C" -#define VCDAlarmProp "DALARM" -#define VCDataSizeProp "DATASIZE" -#define VCDayLightProp "DAYLIGHT" -#define VCDCreatedProp "DCREATED" -#define VCDeliveryLabelProp "LABEL" -#define VCDescriptionProp "DESCRIPTION" -#define VCDIBProp "DIB" -#define VCDisplayStringProp "DISPLAYSTRING" -#define VCDomesticProp "DOM" -#define VCDTendProp "DTEND" -#define VCDTstartProp "DTSTART" -#define VCDueProp "DUE" -#define VCEmailAddressProp "EMAIL" -#define VCEncodingProp "ENCODING" -#define VCEndProp "END" -#define VCEventProp "VEVENT" -#define VCEWorldProp "EWORLD" -#define VCExNumProp "EXNUM" -#define VCExpDateProp "EXDATE" -#define VCExpectProp "EXPECT" -#define VCExtAddressProp "EXT ADD" -#define VCFamilyNameProp "F" -#define VCFaxProp "FAX" -#define VCFullNameProp "FN" -#define VCGeoProp "GEO" -#define VCGeoLocationProp "GEO" -#define VCGIFProp "GIF" -#define VCGivenNameProp "G" -#define VCGroupingProp "Grouping" -#define VCHomeProp "HOME" -#define VCIBMMailProp "IBMMail" -#define VCInlineProp "INLINE" -#define VCInternationalProp "INTL" -#define VCInternetProp "INTERNET" -#define VCISDNProp "ISDN" -#define VCJPEGProp "JPEG" -#define VCLanguageProp "LANG" -#define VCLastModifiedProp "LAST-MODIFIED" -#define VCLastRevisedProp "REV" -#define VCLocationProp "LOCATION" -#define VCLogoProp "LOGO" -#define VCMailerProp "MAILER" -#define VCMAlarmProp "MALARM" -#define VCMCIMailProp "MCIMAIL" -#define VCMessageProp "MSG" -#define VCMETProp "MET" -#define VCModemProp "MODEM" -#define VCMPEG2Prop "MPEG2" -#define VCMPEGProp "MPEG" -#define VCMSNProp "MSN" -#define VCNamePrefixesProp "NPRE" -#define VCNameProp "N" -#define VCNameSuffixesProp "NSUF" -#define VCNoteProp "NOTE" -#define VCOrgNameProp "ORGNAME" -#define VCOrgProp "ORG" -#define VCOrgUnit2Prop "OUN2" -#define VCOrgUnit3Prop "OUN3" -#define VCOrgUnit4Prop "OUN4" -#define VCOrgUnitProp "OUN" -#define VCPagerProp "PAGER" -#define VCPAlarmProp "PALARM" -#define VCParcelProp "PARCEL" -#define VCPartProp "PART" -#define VCPCMProp "PCM" -#define VCPDFProp "PDF" -#define VCPGPProp "PGP" -#define VCPhotoProp "PHOTO" -#define VCPICTProp "PICT" -#define VCPMBProp "PMB" -#define VCPostalBoxProp "BOX" -#define VCPostalCodeProp "PC" -#define VCPostalProp "POSTAL" -#define VCPowerShareProp "POWERSHARE" -#define VCPreferredProp "PREF" -#define VCPriorityProp "PRIORITY" -#define VCProcedureNameProp "PROCEDURENAME" -#define VCProdIdProp "PRODID" -#define VCProdigyProp "PRODIGY" -#define VCPronunciationProp "SOUND" -#define VCPSProp "PS" -#define VCPublicKeyProp "KEY" -#define VCQPProp "QP" -#define VCQuickTimeProp "QTIME" -#define VCQuotedPrintableProp "QUOTED-PRINTABLE" -#define VCRDateProp "RDATE" -#define VCRegionProp "R" -#define VCRelatedToProp "RELATED-TO" -#define VCRepeatCountProp "REPEATCOUNT" -#define VCResourcesProp "RESOURCES" -#define VCRNumProp "RNUM" -#define VCRoleProp "ROLE" -#define VCRRuleProp "RRULE" -#define VCRSVPProp "RSVP" -#define VCRunTimeProp "RUNTIME" -#define VCSequenceProp "SEQUENCE" -#define VCSnoozeTimeProp "SNOOZETIME" -#define VCStartProp "START" -#define VCStatusProp "STATUS" -#define VCStreetAddressProp "STREET" -#define VCSubTypeProp "SUBTYPE" -#define VCSummaryProp "SUMMARY" -#define VCTelephoneProp "TEL" -#define VCTIFFProp "TIFF" -#define VCTimeZoneProp "TZ" -#define VCTitleProp "TITLE" -#define VCTLXProp "TLX" -#define VCTodoProp "VTODO" -#define VCTranspProp "TRANSP" -#define VCUniqueStringProp "UID" -#define VCURLProp "URL" -#define VCURLValueProp "URLVAL" -#define VCValueProp "VALUE" -#define VCVersionProp "VERSION" -#define VCVideoProp "VIDEO" -#define VCVoiceProp "VOICE" -#define VCWAVEProp "WAVE" -#define VCWMFProp "WMF" -#define VCWorkProp "WORK" -#define VCX400Prop "X400" -#define VCX509Prop "X509" -#define VCXRuleProp "XRULE" - -/* Extensions */ - -#define XPilotIdProp "X-PILOTID" -#define XPilotStatusProp "X-PILOTSTAT" - -typedef struct VObject VObject; - -typedef struct VObjectIterator { - VObject* start; - VObject* next; - } VObjectIterator; - -extern DLLEXPORT(VObject*) newVObject(const char *id); -extern DLLEXPORT(void) deleteVObject(VObject *p); -extern DLLEXPORT(char*) dupStr(const char *s, unsigned int size); -extern DLLEXPORT(void) deleteStr(const char *p); -extern DLLEXPORT(void) unUseStr(const char *s); - -extern DLLEXPORT(void) setVObjectName(VObject *o, const char* id); -extern DLLEXPORT(void) setVObjectStringZValue(VObject *o, const char *s); -extern DLLEXPORT(void) setVObjectStringZValue_(VObject *o, const char *s); -extern DLLEXPORT(void) setVObjectUStringZValue(VObject *o, const wchar_t *s); -extern DLLEXPORT(void) setVObjectUStringZValue_(VObject *o, const wchar_t *s); -extern DLLEXPORT(void) setVObjectIntegerValue(VObject *o, unsigned int i); -extern DLLEXPORT(void) setVObjectLongValue(VObject *o, unsigned long l); -extern DLLEXPORT(void) setVObjectAnyValue(VObject *o, void *t); -extern DLLEXPORT(VObject*) setValueWithSize(VObject *prop, void *val, unsigned int size); -extern DLLEXPORT(VObject*) setValueWithSize_(VObject *prop, void *val, unsigned int size); - -extern DLLEXPORT(const char*) vObjectName(VObject *o); -extern DLLEXPORT(const char*) vObjectStringZValue(VObject *o); -extern DLLEXPORT(const wchar_t*) vObjectUStringZValue(VObject *o); -extern DLLEXPORT(unsigned int) vObjectIntegerValue(VObject *o); -extern DLLEXPORT(unsigned long) vObjectLongValue(VObject *o); -extern DLLEXPORT(void*) vObjectAnyValue(VObject *o); -extern DLLEXPORT(VObject*) vObjectVObjectValue(VObject *o); -extern DLLEXPORT(void) setVObjectVObjectValue(VObject *o, VObject *p); - -extern DLLEXPORT(VObject*) addVObjectProp(VObject *o, VObject *p); -extern DLLEXPORT(VObject*) addProp(VObject *o, const char *id); -extern DLLEXPORT(VObject*) addProp_(VObject *o, const char *id); -extern DLLEXPORT(VObject*) addPropValue(VObject *o, const char *p, const char *v); -extern DLLEXPORT(VObject*) addPropSizedValue_(VObject *o, const char *p, const char *v, unsigned int size); -extern DLLEXPORT(VObject*) addPropSizedValue(VObject *o, const char *p, const char *v, unsigned int size); -extern DLLEXPORT(VObject*) addGroup(VObject *o, const char *g); -extern DLLEXPORT(void) addList(VObject **o, VObject *p); - -extern DLLEXPORT(VObject*) isAPropertyOf(VObject *o, const char *id); - -extern DLLEXPORT(VObject*) nextVObjectInList(VObject *o); -extern DLLEXPORT(void) initPropIterator(VObjectIterator *i, VObject *o); -extern DLLEXPORT(int) moreIteration(VObjectIterator *i); -extern DLLEXPORT(VObject*) nextVObject(VObjectIterator *i); - -extern DLLEXPORT(char*) writeMemVObject(char *s, int *len, VObject *o); -extern DLLEXPORT(char*) writeMemVObjects(char *s, int *len, VObject *list); - -extern DLLEXPORT(const char*) lookupStr(const char *s); -extern DLLEXPORT(void) cleanStrTbl(); - -extern DLLEXPORT(void) cleanVObject(VObject *o); -extern DLLEXPORT(void) cleanVObjects(VObject *list); - -extern DLLEXPORT(const char*) lookupProp(const char* str); -extern DLLEXPORT(const char*) lookupProp_(const char* str); - -extern DLLEXPORT(wchar_t*) fakeUnicode(const char *ps, int *bytes); -extern DLLEXPORT(int) uStrLen(const wchar_t *u); -extern DLLEXPORT(char*) fakeCString(const wchar_t *u); - -extern DLLEXPORT(void) printVObjectToFile(char *fname,VObject *o); -extern DLLEXPORT(void) printVObjectsToFile(char *fname,VObject *list); -extern DLLEXPORT(void) writeVObjectToFile(char *fname, VObject *o); -extern DLLEXPORT(void) writeVObjectsToFile(char *fname, VObject *list); - -extern DLLEXPORT(int) vObjectValueType(VObject *o); - -/* return type of vObjectValueType: */ -#define VCVT_NOVALUE 0 - /* if the VObject has no value associated with it. */ -#define VCVT_STRINGZ 1 - /* if the VObject has value set by setVObjectStringZValue. */ -#define VCVT_USTRINGZ 2 - /* if the VObject has value set by setVObjectUStringZValue. */ -#define VCVT_UINT 3 - /* if the VObject has value set by setVObjectIntegerValue. */ -#define VCVT_ULONG 4 - /* if the VObject has value set by setVObjectLongValue. */ -#define VCVT_RAW 5 - /* if the VObject has value set by setVObjectAnyValue. */ -#define VCVT_VOBJECT 6 - /* if the VObject has value set by setVObjectVObjectValue. */ - -extern const char** fieldedProp; - -/* NOTE regarding printVObject and writeVObject - -The functions below are not exported from the DLL because they -take a FILE* as a parameter, which cannot be passed across a DLL -interface (at least that is my experience). Instead you can use -their companion functions which take file names or pointers -to memory. However, if you are linking this code into -your build directly then you may find them a more convenient API -and you can go ahead and use them. If you try to use them with -the DLL LIB you will get a link error. -*/ -extern void printVObject(FILE *fp,VObject *o); -extern void writeVObject(FILE *fp, VObject *o); - - -#if defined(__CPLUSPLUS__) || defined(__cplusplus) -} -#endif - -#endif /* __VOBJECT_H__ */ - - diff --git a/libical/src/python/.cvsignore b/libical/src/python/.cvsignore deleted file mode 100644 index 3dda72986f..0000000000 --- a/libical/src/python/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -Makefile.in -Makefile diff --git a/libical/src/python/ChangeLog b/libical/src/python/ChangeLog deleted file mode 100644 index 7b16306ce5..0000000000 --- a/libical/src/python/ChangeLog +++ /dev/null @@ -1,109 +0,0 @@ -2001-03-13 Eric Busboom <eric@softwarestudio.org> - - * Component.py Added Component.property() - -2001-03-10 Patrick Lewis <plewis@inetarena.com> - - * Added __str__ method to Collection.Collection - - * Component.Component can now be initialized without arguments - - * Made _singular_property and _multiple_properties (in Component) - useful for nearly all the specific component interfaces - - * Changed Property.Attendee and Property.Organizer to allow creation - with no arguments - - * Filled in Todo skeleton - - * Added test function for an Event - - -2001-03-05 Eric Busboom <eric@softwarestudio.org> - - * Property.py Added a lot of exception code to signal failure to - create a Property. - - * DerivedProperties.py Added derived property classes for RDATE - and TRIGGER, two properties that can have one of two value types. - - -2001-03-04 Eric Busboom <eric@softwarestudio.org> - - * Property.pm Added Property.ConstructorFailedError exception - - * Component.pm fixed bug in Collection.__setslice__. "," used - instead of ":" - -2001-03-04 Patrick Lewis <plewis@inetarena.com> - - * Split Libical.py file into Component.py, Property.py, Collection.py, - and Store.py - - * Added test_* functions to test.py - - * Changed component bindings to return a Collection when objects can - have multiple values - - * Changed Component object to allow for creation of an object without - an initial string - - * Added Todo and Journal events - -2001-02-28 Eric Busboom <eric@softwarestudio.org> - - * Property Remove most internal data. The property now work - alsmost entirely off of the icalproperty that it holds a reference - to. Made changes in all derived Properties to accomodate the - change. - - * Property Added __del__ - - * Component Component.properties() now caches properties that it - constructs, so two calls to properties() to that get the same - icalproperty will also get the same Property. - - * Property Added Property.__cmp__ to test equality of properties - based on ical string values - -2001-02-27 Eric Busboom <eric@softwarestudio.org> - - * Property Added Property.ref() to set/get the reference to the - Property's internal icalproperty - - * Property Property._update_value now changes the icalproperty - value if a reference has been set. - - * Component re-instituted Component.properties(). The routine now - adds a 'ref' key to the dict that holds the python pointer - string. The C hex value of the pointer is in the 'pid' key - - -2001-02-27 Patrick Lewis <plewis@inetarena.com> - - * Backed out changes to Component removing comp_p; - Component.comp_p should be restored - -2001-02-26 Eric Busboom <eric@softwarestudio.org> - - * Period Added test routine,test_period() - - * Period implemented methods in period - - * Time Addedd addition and subtraction operators - -2001-02-25 Eric Busboom <eric@softwarestudio.org> - - * Libical.py Added test routine for time, time_test() - - * Libical.py Remove end of line chars ('\r\n" ) from - Property._str__. Caller should add these lines itself - - * Liical.py CHanges Time._update_values to set time VALUE type - based on use of is_date, rather than length of string. - - * Libical.py Removed call to _update_value in TIme::timezone - - - * Libical.py changed update_value to _update_value - diff --git a/libical/src/python/Collection.py b/libical/src/python/Collection.py deleted file mode 100644 index 48092aadaa..0000000000 --- a/libical/src/python/Collection.py +++ /dev/null @@ -1,124 +0,0 @@ -#!/usr/bin/env python -# -*- Mode: python -*- -#====================================================================== -# FILE: Collection.py -# CREATOR: eric -# -# DESCRIPTION: -# -# -# $Id$ -# $Locker$ -# -# (C) COPYRIGHT 2001, Eric Busboom <eric@softwarestudio.org> -# (C) COPYRIGHT 2001, Patrick Lewis <plewis@inetarena.com> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of either: -# -# The LGPL as published by the Free Software Foundation, version -# 2.1, available at: http://www.fsf.org/copyleft/lesser.html -# -# Or: -# -# The Mozilla Public License Version 1.0. You may obtain a copy of -# the License at http://www.mozilla.org/MPL/ -#====================================================================== - -from types import * - -class Collection: - """A group of components that can be modified somewhat like a list. - - Usage: - Collection(componet, propSequence) - - component is a Component object - propSequence is a list or tuple of Property (or subclass of Property) - of objects already in component - """ - - def __init__(self, component, propSequence): - self._properties = list(propSequence[:]) - self._component = component - - def __getslice__(self, beg, end): - return Collection(self._component, self._properties[beg:end]) - - def __setslice__(self, beg, end, sequence): - - if not isinstance(sequence,ListType): - raise TypeError, "must assign list (not instance) to slice" - - oldProps = self._properties[beg:end] - - for p in oldProps: - self._component.remove_property(p) - - self._properties[beg:end] = sequence - for p in sequence: - self._component.add_property(p) - - def __getitem__(self, i): - return self._properties[i] - - def __setitem__(self, i, prop): - self._component.remove_property(self._properties[i]) - self._component.add_property(prop) - self._properties[i]=prop - - def __delitem__(self, i): - self._component.remove_property(self._properties[i]) - del self._properties[i] - - def __len__(self): - return len(self._properties) - - def __str__(self): - s = "[ " - if len(self._properties) > 0: - s = s + str(self._properties[0]) - for p in self._properties[1:]: - s = "%s, %s" % (s, p) - s = s + " ]" - return s - - def append(self, property): - self._properties.append(property) - self._component.add_property(property) - -class ComponentCollection: - - def __init__(self, parent, componentSequence): - self._parent = parent - self._components = list(componentSequence[:]) - - def __getslice__(self, beg, end): - return ComponentCollection(self._parent, self._components[beg:end]) - - def __setslice__(self, beg, end, sequence): - oldComps = self._components[beg:end] - self._components.__setslice__(beg, end, sequence) - for c in sequence: - self._components.addComponent(c) - for c in oldComps: - self._parent.remove_component(c) - - def __getitem__(self, i): - return self._components[i] - - def __setitem__(self, i, prop): - self._parent.remove_component(self._components[i]) - self._parent.add_property(prop) - self._components[i]=prop - - def __delitem__(self, i): - self._parent.remove_componet(self._components[i]) - del self._components[i] - - def __len__(self): - return len(self._components) - - def append(self, property): - self._components.append(property) - self._parent.addComponent(property) diff --git a/libical/src/python/Component.py b/libical/src/python/Component.py deleted file mode 100644 index f4399f6c20..0000000000 --- a/libical/src/python/Component.py +++ /dev/null @@ -1,670 +0,0 @@ -#!/usr/bin/env python -# -*- Mode: python -*- -#====================================================================== -# FILE: Component.py -# CREATOR: eric -# -# DESCRIPTION: -# -# -# $Id$ -# $Locker$ -# -# (C) COPYRIGHT 2001, Eric Busboom <eric@softwarestudio.org> -# (C) COPYRIGHT 2001, Patrick Lewis <plewis@inetarena.com> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of either: -# -# The LGPL as published by the Free Software Foundation, version -# 2.1, available at: http://www.fsf.org/copyleft/lesser.html -# -# Or: -# -# The Mozilla Public License Version 1.0. You may obtain a copy of -# the License at http://www.mozilla.org/MPL/ -#====================================================================== - -from LibicalWrap import * -from types import * -from Property import * -from Collection import * - -class Component: - - def __init__(self,str=None, component_kind="ANY", ref=None): - - if ref != None: - self._ref = ref - else: - self._ref = None - if str != None: - self._ref = icalparser_parse_string(str) - else: - kind = icalenum_string_to_component_kind(component_kind) - self._ref = icalcomponent_new(kind) - - self.cached_props = {} - - def __del__(self): - if self._ref != None and \ - icalcomponent_get_parent(self._ref) != None: - - for k in self.cached_props.keys(): - del self.cached_props[k] - - icalcomponent_free(self._ref) - self._ref = None - - def _prop_from_ref(self,p): - - d_string = icallangbind_property_eval_string(p,":") - d = eval(d_string) - d['ref'] = p - - if not self.cached_props.has_key(p): - - if d['value_type'] == 'DATE-TIME' or d['value_type'] == 'DATE': - prop = Time(d,) - elif d['value_type'] == 'PERIOD': - prop = Period(d) - elif d['value_type'] == 'DURATION': - prop = Duration(d) - elif d['name'] == 'ATTACH': - prop = Attach(d) - elif d['name'] == 'ATTENDEE': - prop = Attendee(d) - elif d['name'] == 'ORGANIZER': - prop = Organizer(d) - else: - prop=Property(ref=p) - - self.cached_props[p] = prop - - def property(self, type): - - p = icallangbind_get_first_property(self._ref,type) - - if p !='NULL': - self._prop_from_ref(p) - prop = self.cached_props[p] - return prop - else : - return None - - def properties(self,type='ANY'): - """ - Return a list of Property instances, each representing a - property of the type 'type.' - """ - - props = [] - - p = icallangbind_get_first_property(self._ref,type) - - while p !='NULL': - self._prop_from_ref(p) - prop = self.cached_props[p] - props.append(prop) - p = icallangbind_get_next_property(self._ref,type) - - return Collection(self,props) - - def add_property(self, prop): - "Adds the property object to the component." - - if not isinstance(prop,Property): - raise TypeError - - prop_p = prop.ref() - - if not prop_p: - s = str(prop) - prop_p = icalproperty_new_from_string(s) - - if prop_p == 'NULL': - raise "Bad property string: " + s - - prop.ref(prop_p) - - if icalproperty_get_parent(prop_p)=='NULL': - icalcomponent_add_property(self._ref, prop_p) - elif icalproperty_get_parent(prop_p) != self._ref: - raise "Property is already a child of another component" - - - def remove_property(self,prop): - - if prop.ref() and self.cached_props.has_key(prop.ref()): - - del self.cached_props[prop.ref()] - icalcomponent_remove_property(self._ref,prop.ref()) - - def components(self,type='ANY'): - comps = [] - - return comps - - def add_component(self, componentObj): - "Adds a child component." - pass - - - def remove_component(self, component): - "Removes a child component" - pass - - def as_ical_string(self): - return self.__str__() - - def __str__(self): - - return icalcomponent_as_ical_string(self._ref) - - - -def NewComponent(comp): - "Converts a string or C icalcomponent into the right component object." - - wasStr=0 # Were we passed a string or an icalcomponent? - - if isinstance (comp, StringType): - compStr = comp - comp = icalparser_parse_string(comp) - wasStr=1 - else: - compStr = icalcomponent_as_ical_string(comp) - - kind = icalcomponent_isa(comp) - kindStr = icalenum_component_kind_to_string(kind) - # Do I need to free kind? (I think not). - - if kindStr == 'VEVENT': - newComp = Event(compStr) - elif kindStr == 'VTODO': - newComp = Todo(compStr) - elif kindStr == 'VJOURNAL': - newComp = Journal(compstr) - else: - newComp = Component(compStr) - - # I don't think I need to free the component created when passed a string, - # as it wasn't created with a _new function. - - return newComp - - -class GenericComponent(Component): - - def __init__(self): - - # Component.__init__(self, str) # Call from subclasses - self._recurrence_set=None - - def _singular_property(self, name, value_type, value=None, - property_obj=None, enumerated_values=None): - """Sets or gets the value of a method which exists once per Component. - - This is a constructor method for properties without a strictly defined - object.""" - - curr_properties = self.properties(name) - - # Get the value - if value==None: - if len(curr_properties) == 0: - return None - elif len(curr_properties) == 1: - return curr_properties[0].value() - else: - raise ValueError, "too many properties of type %s" % propType - - # Set the value - else: - # Check if value is in enumerated_values - if enumerated_values: - value = upper(value) - if value not in enumerated_values: - raise ValueError, "%s is not one of %s" \ - % (value, enumerated_values) - - # Create the new property - if property_obj: - if not isinstance(value, property_obj): - # Create a special property_obj property - if property_obj == Time: - p = Time(value, name) - ## p.value_type(value_type) - else: - p = property_obj() - ## p.value_type(value_type) - p.value(value) - else: - p = value # value is already a property_obj - else: - # Create a generic property - p = Property(name) - ## p.value_type(value_type) - p.value(value) - - if len(curr_properties) == 1: - self.remove_property(curr_properties[0]) - elif len(curr_properties) > 1: - raise ValueError, "too many properties of type %s" % propType - - self.add_property(p) - - def method(self, v=None): - "Sets or returns the value of the METHOD property." - return self._singular_property("METHOD", "TEXT", v) - - def prodid(self, v=None): - "Sets or returns the value of the PRODID property." - return self._singular_property("PRODID", "TEXT", v) - - def calscale(self, v=None): - "Sets or returns the value of the CALSCALE property." - return self._singular_property("CALSCALE", "TEXT", v) - - def class_prop(self, v=None): # Class is a reserved word - "Sets or returns the value of the CLASS property." - if v!=None: - v = upper(v) - return self._singular_property('CLASS', 'TEXT', v) - - def created(self, v=None): - """Sets or returns the value of the CREATED property. - - Usage: - created(time_obj) # Set the value using a Time object - created('19970101T123000Z') # Set using an iCalendar string - created(982362522) # Set using seconds - created() # Return an iCalendar string - """ - return self._singular_property("CREATED", "DATE-TIME", v, Time) - - def description(self, v=None): - "Sets or returns the value of the DESCRIPTION property." - return self._singular_property("DESCRIPTION", "TEXT", v) - - def dtstamp(self, v=None): - """Sets or returns the value of the DTSTAMP property. - - Usage: - dtstamp(time_obj) # Set the value using a Time object - dtstamp('19970101T123000Z')# Set using an iCalendar string - dtstamp(982362522) # Set using seconds - dtstamp() # Return an iCalendar string - """ - return self._singular_property("DTSTAMP", "DATE-TIME", v, Time) - - def dtstart(self, v=None): - """Sets or returns the value of the DTSTART property. - - Usage: - dtstart(time_obj) # Set the value using a Time object - dtstart('19970101T123000Z') # Set the value as an iCalendar string - dtstart(982362522) # Set the value using seconds (time_t) - dtstart() # Return the time as an iCalendar string - """ - return self._singular_property("DTSTART", "DATE-TIME", v, Time) - - def last_modified(self, v=None): - """Sets or returns the value of the LAST-MODIFIED property. - - Usage: - lastmodified(time_obj) # Set the value using a Time object - lastmodified('19970101T123000Z')# Set using an iCalendar string - lastmodified(982362522) # Set using seconds - lastmodified() # Return an iCalendar string - """ - return self._singular_property("LAST-MODIFIED", "DATE-TIME", v, Time) - - def organizer(self, v=None): - """Sets or gets the value of the ORGANIZER property. - - Usage: - organizer(orgObj) # Set value using an organizer object - organizer('MAILTO:jd@not.com') # Set value using a CAL-ADDRESS string - organizer() # Return a CAL-ADDRESS string - """ - return self._singular_property('ORGANIZER', 'CAL-ADDRESS', v, - Organizer) - - def recurrence_id(self, v=None): - """Sets or gets the value for the RECURRENCE-ID property. - - Usage: - recurrence_id(recIdObj) # Set using a Recurrence_Id object - recurrence_id("19700801T133000") # Set using an iCalendar string - recurrence_id(8349873494) # Set using seconds from epoch - recurrence_id() # Return an iCalendar string - """ - return self._singular_property('RECURRENCE-ID', 'DATE-TIME', v, - Recurrence_Id) - - def sequence(self, v=None): - """Sets or gets the SEQUENCE value of the Event. - - Usage: - sequence(1) # Set the value using an integer - sequence('2') # Set the value using a string containing an integer - sequence() # Return an integer - """ - if isinstance(v, StringType): - v = int(str) - return self._singular_property('SEQUENCE', 'INTEGER', v) - - def summary(self, v=None): - "Sets or gets the SUMMARY value of the Event." - return self._singular_property('SUMMARY', 'TEXT', v) - - def uid(self, v=None): - "Sets or gets the UID of the Event." - return self._singular_property('UID', 'TEXT', v) - - def url(self, v=None): - """Sets or returns the URL property.""" - return self._singular_property('URL', 'URI', v) - - #### - # Not quite sure if this is how we want to handle recurrence rules, but - # this is a start. - - def recurrence_set(self): - "Returns the Events RecurrenceSet object." - if self._recurrence_set == None: # i.e haven't initialized one - self._recurrence_set = RecurrenceSet() - return self._recurrence_set - - ### - # Alarm interface. Returns an ComponentCollection. - - def alarms(self, values=None): - """Sets or returns ALARM components. - - Examples: - alarms((alarm1,)) # Set using Alarm component - alarms() # Returns an ComponentCollection of all Alarms - """ - if values!=None: - for alarm in values: - self.addComponent(alarm) - else: - return ComponentCollection(self, self.components('VALARM')) - - #### - # Methods that deal with Properties that can occur multiple times are - # below. They use the Collection class to return their Properties. - - def _multiple_properties(self, name, value_type, values, - property_obj=None): - "Processes set/get for Properties that can have multiple instances." - - # Set value - if values!=None: - if not isinstance(values, TupleType) \ - and not isinstance(values, ListType): - raise TypeError, "%s is not a tuple or list." - - # Delete old properties - for p in self.properties(name): - self.remove_property(p) - - for v in values: - if property_obj: # Specialized properties - if not isinstance(v, property_obj): # Make new object - new_prop = property_obj() - new_prop.value(v) - else: # Use existing object - new_prop = v - else: # Generic properties - new_prop= Property() - new_prop.name(name) - # new_prop.value_type(value_type) - new_prop.value(v) - - self.add_property(new_prop) - - # Get value - else: - return Collection(self, self.properties(name)) - - def attachments(self, values=None): - """Sets or returns a Collection of Attach properties. - - 'values' can be a sequence containing URLs (strings) and/or file-ish - objects. - """ - return self._multiple_properties("ATTACH", "", value, Attach) - - def attendees(self, value=None): - """Sets attendees or returns a Collection of Attendee objects. - - If setting the attendees, pass a sequence as the argument. - Examples: - # Set using Attendee objects - attendees((attObj1, attObj2)) - # Set using a CAL-ADDRESS string - attendees(['MAILTO:jdoe@somewhere.com']) - # Set using a combination of Attendee objects and strings - attendees(['MAILTO:jdoe@somewhere.com', attObj1]) - # Returns a list of Attendee objects - attendees() - - When setting the attendees, any previous Attendee objects in the Event - are overwritten. If you want to add to the Attendees, one way to do it - is: - - attendees().append(Attendee('MAILTO:jdoe@nothere.com')) - """ - return self._multiple_properties("ATTENDEE", "", value, Attendee) - - def categories(self, value=None): - """Sets categories or returns a Collection of CATEGORIES properties. - - If setting the categories, pass a sequence as the argument. - Examples: - # Set using string[s] - categories(('APPOINTMENT', 'EDUCATION')) - # Returns a list of Category properites - categories() - - When setting the attendees, any previous category Properties in the - Event are overwritten. If you want to add to the categories, one way - to do it is: - - new_cat=Property('CATEGORIES') - new_cat.value_type('TEXT') - new_cat.value('PERSONAL') - categories().append(new_cat) - """ - return self._multiple_properties("CATEGORIES", "TEXT", value) - - def comments(self, value=None): - "Sets or returns a Collection of COMMENT properties." - return self._multiple_properties('COMMENT', 'TEXT', value) - - def contacts(self, value=None): - "Sets or returns a Collection of CONTACT properties." - return self._multiple_properties('CONTACT', 'TEXT', value) - - def related_tos(self, value=None): - "Sets or returns a Collectoin of RELATED-TO properties." - return self._multiple_properties('RELATED-TO', 'TEXT', value) - - -class Event(GenericComponent): - "The iCalendar Event object." - - def __init__(self, str=None): - Component.__init__(self, str, "VEVENT") - GenericComponent.__init__(self) - - def component_type(self): - "Returns the type of component for the object." - return "VEVENT" - - def clone(self): - "Returns a copy of the object." - return Event(self.asIcalString()) - - def dtend(self, v=None): - """Sets or returns the value of the DTEND property. - - Usage: - dtend(time_obj) # Set the value using a Time object - dtend('19970101T123000Z') # Set the value as an iCalendar string - dtend(982362522) # Set the value using seconds (time_t) - dtend() # Return the time as an iCalendar string - - If the dtend value is being set and duration() has a value, the - duration property will be removed. - """ - if v != None: - duration = self.properties('DURATION') - for d in duration: # Clear DURATION properties - self.remove_property(d) - return self._singular_property("DTEND", "DATE-TIME", v, Time) - - def duration(self, v=None): - """Sets or returns the value of the duration property. - - Usage: - duration(dur_obj) # Set the value using a Duration object - duration("P3DT12H") # Set value as an iCalendar string - duration(3600) # Set duration using seconds - duration() # Return duration as an iCalendar string - - If the duration value is being set and dtend() has a value, the dtend - property will be removed. - """ - - if v != None: - dtend = self.properites('DTEND') - for d in dtend: - self.remove_property(d) # Clear DTEND properties - return self._singular_property("DURATION", "DURATION", v, Duration) - - def status(self, v=None): - "Sets or returns the value of the STATUS property." - - # These values are only good for VEVENT components (i.e. don't copy - # & paste into VTODO or VJOURNAL - valid_values=('TENTATIVE', 'CONFIRMED', 'CANCELLED') - return self._singular_property("STATUS", "TEXT", v, - enumerated_values=valid_values) - - def geo(self, v=None): - """Sets or returns the value of the GEO property. - - Usage: - geo(value) or - geo() # Returns the icalendar string - - 'value' is either a icalendar GEO string or a sequence with two 'float' - numbers. - - Examples: - geo('40.232;-115.9531') # Set value using string - geo((40.232, -115.9531)) # Set value using a sequence - geo() # Returns "40.232;-115.9531" - - To get the GEO property represented as a tuple and numbers instead of - the iCalendar string, use geo_get_tuple(). - """ - - if isinstance(v, ListType) or isinstance(v, TupleType): - v = "%s;%s" % (float(v[0]), float(v[1])) - return self._singular_property("GEO", "FLOAT", v) - - def geo_get_tuple(self): - """Returns the GEO property as a tuple.""" - - geo = self.geo() - geo = split(geo, ';') - return float(geo[0]), float(geo[1]) - - def location(self, v=None): - """Sets or returns the LOCATION property.""" - return self._singular_property("LOCATION", "TEXT", v) - - def transp(self, v=None): - """Sets or returns the TRANSP property.""" - ok_values = ('OPAQUE', 'TRANSPARENT') - return self._singular_property('TRANSP', 'TEXT', v, - enumerated_values=ok_values) - - def resources(self, v=None): - pass - -class Todo(GenericComponent): - "The iCalendar TODO component." - - def component_type(self): - "Returns the type of component for the object." - return "VTODO" - - def clone(self): - "Returns a copy of the object." - return Todo(self.asIcalString()) - - def completed(self, value=None): - return self._singular_property('COMPLETED', 'DATE-TIME', value, Time) - - def geo(self, value=None): - if isinstance(v, ListType) or isinstance(v, TupleType): - v = "%s;%s" % (float(v[0]), float(v[1])) - return self._singular_property("GEO", "FLOAT", value) - - def location(self, value=None): - return self._singular_property('LOCATION', 'TEXT', value) - - def percent(self, value=None): - if value!=None: - value = str(int(value)) - return self._singular_property('PERCENT', 'INTEGER', value) - - def status(self, value=None): - if value!=None: - value=upper(value) - ok_values = ('NEEDS-ACTION', 'COMPLETED', 'IN-PROCESS', 'CANCELLED') - return self._singular_property('STATUS', 'TEXT', value, - enumerated_values=ok_values) - - def due(self, value=None): - if value != None: - duration = self.properties('DURATION') - for d in duration: - self.remove_property(d) # Clear DURATION properties - return self._singular_property('DUE', 'DATE-TIME', value, Time) - - def duration(self, value=None): - if value != None: - due = self.properites('DUE') - for d in due: - self.remove_property(d) # Clear DUE properties - return self._singular_property("DURATION", "DURATION", value, Duration) - - def resources(): - pass - - -class Journal(GenericComponent): - "The iCalendar JOURNAL component." - - def component_type(self): - "Returns the type of component for the object." - return "VJOURNAL" - - def clone(self): - "Returns a copy of the object." - return Journal(self.asIcalString()) - - def status(self, v=None): - if v!=None: - v = upper(v) - ok_values=('DRAFT', 'FINAL', 'CANCELLED') - return self._singular_property('STATUS', 'TEXT', v, - enumerated_values=ok_values) - diff --git a/libical/src/python/DerivedProperties.py b/libical/src/python/DerivedProperties.py deleted file mode 100644 index b557a1f7d7..0000000000 --- a/libical/src/python/DerivedProperties.py +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env python -# -*- Mode: python -*- -#====================================================================== -# FILE: DerivedProperties.py -# CREATOR: eric -# -# DESCRIPTION: -# -# -# $Id$ -# $Locker$ -# -# (C) COPYRIGHT 2001, Eric Busboom <eric@softwarestudio.org> -# (C) COPYRIGHT 2001, Patrick Lewis <plewis@inetarena.com> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of either: -# -# The LGPL as published by the Free Software Foundation, version -# 2.1, available at: http://www.fsf.org/copyleft/lesser.html -# -# Or: -# -# The Mozilla Public License Version 1.0. You may obtain a copy of -# the License at http://www.mozilla.org/MPL/ -#====================================================================== - -from Property import Time, Period, Duration - -def RDate(arg): - - class RDate_Time(Time): - def __init__(self,arg): Time.__init__(self,arg,"RDATE") - - class RDate_Period(Period): - def __init__(self,arg): Period.__init__(self,arg,"RDATE") - - p = None - for c in [RDate_Time, RDate_Period]: - try: return c(arg) - except Property.ConstructorFailedError, d: pass - raise Property.ConstructorFailedError("Failed to construct RDATE from "+str(arg)) - - -def Trigger(arg): - class Trigger_Time(Time): - def __init__(self,arg): Time.__init__(self,arg,"TRIGGER") - - class Trigger_Duration(Duration): - def __init__(self,arg): Duration.__init__(self,arg,"TRIGGER") - - p = None - for c in [Trigger_Duration, Trigger_Time]: - try: return c(arg) - except Property.ConstructorFailedError, d: pass - raise Property.ConstructorFailedError("Failed to construct TRIGGER from "+str(arg)) - - - diff --git a/libical/src/python/Libical.py b/libical/src/python/Libical.py deleted file mode 100644 index 78a0fff8ff..0000000000 --- a/libical/src/python/Libical.py +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env python -# -*- Mode: python -*- -#====================================================================== -# FILE: Libical.py -# CREATOR: eric -# -# DESCRIPTION: -# -# -# $Id$ -# $Locker$ -# -# (C) COPYRIGHT 2001, Eric Busboom <eric@softwarestudio.org> -# (C) COPYRIGHT 2001, Patrick Lewis <plewis@inetarena.com> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of either: -# -# The LGPL as published by the Free Software Foundation, version -# 2.1, available at: http://www.fsf.org/copyleft/lesser.html -# -# Or: -# -# The Mozilla Public License Version 1.0. You may obtain a copy of -# the License at http://www.mozilla.org/MPL/ -#====================================================================== - - -import LibicalWrap - -from Component import Component, NewComponent, Event, Todo, Journal - -# Will eventually remove Time for real Property events -from Property import Property, Time, Duration, Period, Attendee, Organizer, \ - Recurrence_Id, Attach, RecurrenceSet - -from DerivedProperties import RDate, Trigger - -from Store import Store, FileStore diff --git a/libical/src/python/LibicalWrap.i b/libical/src/python/LibicalWrap.i deleted file mode 100644 index c6b6740383..0000000000 --- a/libical/src/python/LibicalWrap.i +++ /dev/null @@ -1,352 +0,0 @@ -/* -*- Mode: C -*-*/ -/*====================================================================== - FILE: ical.i - - (C) COPYRIGHT 1999 Eric Busboom - http://www.softwarestudio.org - - The contents of this file are subject to the Mozilla Public License - Version 1.0 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and - limitations under the License. - - The original author is Eric Busboom - - Contributions from: - Graham Davison (g.m.davison@computer.org) - - ======================================================================*/ - -%module LibicalWrap - - -%{ -#include "ical.h" -#include "icalss.h" - -#include <sys/types.h> /* for size_t */ -#include <time.h> - -%} - - -#include "fcntl.h" /* For Open flags */ - -typedef void icalcomponent; -typedef void icalproperty; - -icalcomponent* icalparser_parse_string(char* str); - - -icalcomponent* icalcomponent_new(int kind); -icalcomponent* icalcomponent_new_clone(icalcomponent* component); -icalcomponent* icalcomponent_new_from_string(char* str); - -char* icalcomponent_as_ical_string(icalcomponent* component); - -void icalcomponent_free(icalcomponent* component); -int icalcomponent_count_errors(icalcomponent* component); -void icalcomponent_strip_errors(icalcomponent* component); -void icalcomponent_convert_errors(icalcomponent* component); - -icalproperty* icalcomponent_get_current_property(icalcomponent* component); - -icalproperty* icalcomponent_get_first_property(icalcomponent* component, - int kind); -icalproperty* icalcomponent_get_next_property(icalcomponent* component, - int kind); - -icalcomponent* icalcomponent_get_current_component (icalcomponent* component); - -icalcomponent* icalcomponent_get_first_component(icalcomponent* component, - int kind); -icalcomponent* icalcomponent_get_next_component(icalcomponent* component, - int kind); - -void icalcomponent_add_property(icalcomponent* component, - icalproperty* property); - -void icalcomponent_remove_property(icalcomponent* component, - icalproperty* property); - - -icalcomponent* icalcomponent_get_parent(icalcomponent* component); -int icalcomponent_isa(icalcomponent* component); - -int icalrestriction_check(icalcomponent* comp); - - -/* actually takes icalproperty_kind */ -icalproperty* icalproperty_new(int kind); - -icalproperty* icalproperty_new_from_string(char* str); - -char* icalproperty_as_ical_string(icalproperty *prop); - -void icalproperty_set_parameter_from_string(icalproperty* prop, - const char* name, const char* value); -void icalproperty_set_value_from_string(icalproperty* prop,const char* value, const char * kind); - -const char* icalproperty_get_value_as_string(icalproperty* prop); -const char* icalproperty_get_parameter_as_string(icalproperty* prop, - const char* name); - - -icalcomponent* icalproperty_get_parent(icalproperty* property); - -int icalerror_supress(const char* error); -void icalerror_restore(const char* error, int es); -char* icalerror_perror(); -void icalerror_clear_errno(void); - -const char* icalproperty_kind_to_string(int kind); -int icalproperty_string_to_kind(const char* string); -int icalproperty_kind_to_value_kind(int kind); - -const char* icalvalue_kind_to_string(int kind); -int icalvalue_string_to_kind(const char* str); - -const char* icalparameter_kind_to_string(int kind); -int icalparameter_string_to_kind(const char* string); - -const char* icalenum_component_kind_to_string(int kind); -int icalenum_string_to_component_kind(const char* string); - -int* icallangbind_new_array(int size); -void icallangbind_free_array(int* array); -int icallangbind_access_array(int* array, int index); - - - -int icalrecur_expand_recurrence(char* rule, int start, - int count, int* array); - - -/* Iterate through properties and components using strings for the kind */ -icalproperty* icallangbind_get_first_property(icalcomponent *c, - const char* prop); - -icalproperty* icallangbind_get_next_property(icalcomponent *c, - const char* prop); - -icalcomponent* icallangbind_get_first_component(icalcomponent *c, - const char* comp); - -icalcomponent* icallangbind_get_next_component(icalcomponent *c, - const char* comp); - - -/* Return a string that can be evaluated in perl or python to - generated a hash that holds the property's name, value and - parameters. Sep is the hash seperation string, "=>" for perl and - ":" for python */ -const char* icallangbind_property_eval_string(icalproperty* prop, char* sep); - -int icallangbind_string_to_open_flag(const char* str); - -/*********************************************************************** - Time routines -***********************************************************************/ - - -struct icaltimetype -{ - int year; - int month; - int day; - int hour; - int minute; - int second; - - int is_utc; /* 1-> time is in UTC timezone */ - - int is_date; /* 1 -> interpret this as date. */ - - const char* zone; /*Ptr to Olsen placename. Libical does not own mem*/ -}; - - -/* Convert seconds past UNIX epoch to a timetype*/ -struct icaltimetype icaltime_from_timet(int v, int is_date); - -/* Return the time as seconds past the UNIX epoch */ -/* Normally, this returns a time_t, but SWIG tries to turn that type - into a pointer */ -int icaltime_as_timet(struct icaltimetype); - -/* Return a string represention of the time, in RFC2445 format. The - string is owned by libical */ -char* icaltime_as_ical_string(struct icaltimetype tt); - -/* create a time from an ISO format string */ -struct icaltimetype icaltime_from_string(const char* str); - -/* Routines for handling timezones */ -/* Return the offset of the named zone as seconds. tt is a time - indicating the date for which you want the offset */ -int icaltime_utc_offset(struct icaltimetype tt, const char* tzid); - -/* convert tt, of timezone tzid, into a utc time. Does nothing if the - time is already UTC. */ -struct icaltimetype icaltime_as_utc(struct icaltimetype tt, - const char* tzid); - -/* convert tt, a time in UTC, into a time in timezone tzid */ -struct icaltimetype icaltime_as_zone(struct icaltimetype tt, - const char* tzid); - -/* Return a null time, which indicates no time has been set. This time represent the beginning of the epoch */ -struct icaltimetype icaltime_null_time(void); - -/* Return true of the time is null. */ -int icaltime_is_null_time(struct icaltimetype t); - -/* Returns false if the time is clearly invalid, but is not null. This - is usually the result of creating a new time type buy not clearing - it, or setting one of the flags to an illegal value. */ -int icaltime_is_valid_time(struct icaltimetype t); - -/* Reset all of the time components to be in their normal ranges. For - instance, given a time with minutes=70, the minutes will be reduces - to 10, and the hour incremented. This allows the caller to do - arithmetic on times without worrying about overflow or - underflow. */ -struct icaltimetype icaltime_normalize(struct icaltimetype t); - -/* Return the day of the year of the given time */ -short icaltime_day_of_year(struct icaltimetype t); - -/* Create a new time, given a day of year and a year. */ -struct icaltimetype icaltime_from_day_of_year(short doy, short year); - -/* Return the day of the week of the given time. Sunday is 0 */ -short icaltime_day_of_week(struct icaltimetype t); - -/* Return the day of the year for the Sunday of the week that the - given time is within. */ -short icaltime_start_doy_of_week(struct icaltimetype t); - -/* Return a string with the time represented in the same format as ctime(). THe string is owned by libical */ -char* icaltime_as_ctime(struct icaltimetype); - -/* Return the week number for the week the given time is within */ -short icaltime_week_number(struct icaltimetype t); - -/* Return -1, 0, or 1 to indicate that a<b, a==b or a>b */ -int icaltime_compare(struct icaltimetype a,struct icaltimetype b); - -/* like icaltime_compare, but only use the date parts. */ -int icaltime_compare_date_only(struct icaltimetype a, struct icaltimetype b); - -/* Return the number of days in the given month */ -short icaltime_days_in_month(short month,short year); - - -/*********************************************************************** - Duration Routines -***********************************************************************/ - - -struct icaldurationtype -{ - int is_neg; - unsigned int days; - unsigned int weeks; - unsigned int hours; - unsigned int minutes; - unsigned int seconds; -}; - -struct icaldurationtype icaldurationtype_from_int(int t); -struct icaldurationtype icaldurationtype_from_string(const char*); -int icaldurationtype_as_int(struct icaldurationtype duration); -char* icaldurationtype_as_ical_string(struct icaldurationtype d); -struct icaldurationtype icaldurationtype_null_duration(); -int icaldurationtype_is_null_duration(struct icaldurationtype d); - -struct icaltimetype icaltime_add(struct icaltimetype t, - struct icaldurationtype d); - -struct icaldurationtype icaltime_subtract(struct icaltimetype t1, - struct icaltimetype t2); - - -/*********************************************************************** - Period Routines -***********************************************************************/ - - -struct icalperiodtype -{ - struct icaltimetype start; - struct icaltimetype end; - struct icaldurationtype duration; -}; - -struct icalperiodtype icalperiodtype_from_string (const char* str); - -const char* icalperiodtype_as_ical_string(struct icalperiodtype p); -struct icalperiodtype icalperiodtype_null_period(); -int icalperiodtype_is_null_period(struct icalperiodtype p); -int icalperiodtype_is_valid_period(struct icalperiodtype p); - - -/*********************************************************************** - Storage Routines -***********************************************************************/ - -icalfileset* icalfileset_new(const char* path); - -/* Like _new, but takes open() flags for opening the file */ -icalfileset* icalfileset_new_open(const char* path, - int flags, int mode); - -void icalfileset_free(icalfileset* cluster); - -const char* icalfileset_path(icalfileset* cluster); - -/* Mark the cluster as changed, so it will be written to disk when it - is freed. Commit writes to disk immediately. */ -void icalfileset_mark(icalfileset* cluster); -icalerrorenum icalfileset_commit(icalfileset* cluster); - -icalerrorenum icalfileset_add_component(icalfileset* cluster, - icalcomponent* child); - -icalerrorenum icalfileset_remove_component(icalfileset* cluster, - icalcomponent* child); - -int icalfileset_count_components(icalfileset* cluster, - icalcomponent_kind kind); - -/* Restrict the component returned by icalfileset_first, _next to those - that pass the gauge. _clear removes the gauge */ -icalerrorenum icalfileset_select(icalfileset* store, icalgauge* gauge); -void icalfileset_clear(icalfileset* store); - -/* Get and search for a component by uid */ -icalcomponent* icalfileset_fetch(icalfileset* cluster, const char* uid); -int icalfileset_has_uid(icalfileset* cluster, const char* uid); -icalcomponent* icalfileset_fetch_match(icalfileset* set, icalcomponent *c); - - -/* Modify components according to the MODIFY method of CAP. Works on - the currently selected components. */ -icalerrorenum icalfileset_modify(icalfileset* store, icalcomponent *oldcomp, - icalcomponent *newcomp); - -/* Iterate through components. If a guage has been defined, these - will skip over components that do not pass the gauge */ - -icalcomponent* icalfileset_get_current_component (icalfileset* cluster); -icalcomponent* icalfileset_get_first_component(icalfileset* cluster); -icalcomponent* icalfileset_get_next_component(icalfileset* cluster); -/* Return a reference to the internal component. You probably should - not be using this. */ - -icalcomponent* icalfileset_get_component(icalfileset* cluster); diff --git a/libical/src/python/Makefile.am b/libical/src/python/Makefile.am deleted file mode 100644 index 8eaf4a74cb..0000000000 --- a/libical/src/python/Makefile.am +++ /dev/null @@ -1,42 +0,0 @@ - -lib_LTLIBRARIES = libLibicalWrap.la - -libLibicalWrap_la_SOURCES = LibicalWrap.c - -INCLUDES = \ - -I$(top_builddir) \ - -I$(top_srcdir)/src \ - -I$(top_builddir)/src \ - -I$(top_srcdir)/src/libical \ - -I$(top_builddir)/src/libical \ - -I$(top_srcdir)/src/libicalss \ - $(PY_CFLAGS) - -LDADD = ../libical/libical.la ../libicalss/libicalss.la - -all: LibicalWrap.so - -LibicalWrap.c: LibicalWrap.i - swig -python -o LibicalWrap.c LibicalWrap.i - -# This part should be done with libtool, but I don't know how to do -# it. Libtool needs to generate a shared library in this directory -# regardless of the value of AM_DISABLE_SHARED -LibicalWrap.so: LibicalWrap.c - ld -shared -o LibicalWrap.so LibicalWrap.o ../libical/.libs/libical.a ../libicalss/.libs/libicalss.a - -CLEANFILES = LibicalWrap.c LibicalWrap_wrap.doc Libical.pyc LibicalWrap.so - -EXTRA_DIST = \ -Libical.py \ -LibicalWrap.i \ -python-binding.txt \ -test.py \ -Collection.py \ -Component.py \ -DerivedProperties.py \ -Property.py \ -Store.py \ -ChangeLog - - diff --git a/libical/src/python/Property.py b/libical/src/python/Property.py deleted file mode 100644 index d63b265525..0000000000 --- a/libical/src/python/Property.py +++ /dev/null @@ -1,839 +0,0 @@ -#!/usr/bin/env python -# -*- Mode: python -*- -#====================================================================== -# FILE: Property.py -# CREATOR: eric -# -# DESCRIPTION: -# -# -# $Id$ -# $Locker$ -# -# (C) COPYRIGHT 2001, Eric Busboom <eric@softwarestudio.org> -# (C) COPYRIGHT 2001, Patrick Lewis <plewis@inetarena.com> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of either: -# -# The LGPL as published by the Free Software Foundation, version -# 2.1, available at: http://www.fsf.org/copyleft/lesser.html -# -# Or: -# -# The Mozilla Public License Version 1.0. You may obtain a copy of -# the License at http://www.mozilla.org/MPL/ -#====================================================================== - -from LibicalWrap import * -from types import * -import regsub -import base64 -from string import index, upper - -#def icalerror_supress(arg): -# pass - -#def icalerror_restore(a,b): -# pass - -def error_type(): - error = icalerror_perror() - return error[:index(error,':')] - -class Property: - """ Represent any iCalendar Property. - - Usage: - Property(dict) - - Where: - dict is a dictionary with keys of 'name', 'value_type', and 'value'. - In addition, parameter:parameter value entries may be included. - """ - - class ConstructorFailedError(Exception): - "Failed to construct a property" - - class UpdateFailedError(Exception): - "Failed to update the value of a property" - - - def __init__(self, type = None, ref = None): - - - assert(ref == None or isinstance(ref,StringType)) - assert(type == None or isinstance(type,StringType)) - - self._ref = None - - if ref != None: - self._ref = ref - elif type != None: - kind = icalproperty_string_to_kind(type) - self._ref = icalproperty_new(kind) - - - if self._ref == None or self._ref == 'NULL': - raise Property.ConstructorFailedError("Failed to construct Property") - - self._deleted = 0; - - - # Initialize all of the required keys - - - def __del__(self): - - self._deleted = 1; - - if not self._deleted and \ - self.ref() and \ - icalproperty_get_parent(self.ref()) == 'NULL': - - icalproperty_free(self.ref()) - - def name(self,v=None): - """ Return the name of the property """ - str = icalproperty_as_ical_string(self._ref) - - idx = index(str, '\n') - - return str[:idx] - - def ref(self,v=None): - """ Return the internal reference to the libical icalproperty """ - if(v != None): - - if not self._deleted and self._ref and \ - icalproperty_get_parent(self._ref) == 'NULL': - - icalproperty_free(self._ref) - - self._ref = v - - return self._ref - - - def value(self,v=None, kind = None): - """ Return the RFC2445 representation of the value """ - - if(v != None): - - if kind != None: - # Get the default kind of value for this property - default_kind = icalvalue_kind_to_string(icalproperty_kind_to_value_kind(icalproperty_string_to_kind(self.name()))) - - if(kind != default_kind): - self.__setitem__('VALUE',kind) - vt = kind - elif self.__getitem__('VALUE'): - vt = self.__getitem__('VALUE') - else: - vt = 'NO' # Use the kind of the existing value - - - icalerror_clear_errno() - - #e1=icalerror_supress("MALFORMEDDATA") - icalproperty_set_value_from_string(self._ref,v,vt) - #icalerror_restore("MALFORMEDDATA",e1) - - if error_type() != "NO": - raise Property.UpdateFailedError(error_type()) - - s = icalproperty_get_value_as_string(self._ref) - assert(s == v) - - return icalproperty_get_value_as_string(self._ref) - - def parameters(self): - - d_string = icallangbind_property_eval_string(self._ref,":") - dict = eval(d_string) - - desc_keys = ('name', 'value', 'value_type', 'pid', 'ref', 'deleted' ) - - def foo(k,d=dict): - if d.has_key(k): del d[k] - - map( foo, desc_keys) - - return filter(lambda p, s=self: s[p] != None, dict.keys()) - - - def as_ical_string(self): - - return icalproperty_as_ical_string(self._ref) - - def __getitem__(self,key): - """ Return property values by name """ - key = upper(key) - - str = icalproperty_get_parameter_as_string(self._ref,key) - - if(str == 'NULL'): return None - - return str - - def __setitem__(self,key,value): - """ Set Property Values by Name """ - key = upper(key) - - icalproperty_set_parameter_from_string(self._ref,key,value) - - return self.__getitem__(key) - - def __str__(self): - - str = self.as_ical_string() - return regsub.gsub('\r?\n ?','',str) - - def __cmp__(self, other): - s_str = str(self) - o_str = str(other) - - return cmp(s_str,o_str) - - -class Time(Property): - """ Represent iCalendar DATE, TIME and DATE-TIME """ - def __init__(self, arg, name="DTSTART"): - """ - Create a new Time from a string or number of seconds past the - POSIX epoch - - Time("19970325T123000Z") Construct from an iCalendar string - Time(8349873494) Construct from seconds past POSIX epoch - - """ - e1=icalerror_supress("MALFORMEDDATA") - e2=icalerror_supress("BADARG") - - if isinstance(arg, DictType): - # Dictionary -- used for creating from Component - self.tt = icaltime_from_string(arg['value']) - Property.__init__(self, ref=arg['ref']) - else: - if isinstance(arg, StringType): - # Create from an iCal string - self.tt = icaltime_from_string(arg) - elif isinstance(arg, IntType) or \ - isinstance(arg, FloatType): - # Create from seconds past the POSIX epoch - self.tt = icaltime_from_timet(int(arg),0) - elif isinstance(arg, Time): - # Copy an instance - self.tt = arg.tt - else: - self.tt = icaltime_null_time() - - Property.__init__(self,type=name) - - icalerror_restore("MALFORMEDDATA",e1) - icalerror_restore("BADARG",e2) - - if icaltime_is_null_time(self.tt): - raise Property.ConstructorFailedError("Failed to construct a Time") - - try: - self._update_value() - except Property.UpdateFailedError: - raise Property.ConstructorFailedError("Failed to construct a Time") - - def _update_value(self): - self.tt = icaltime_normalize(self.tt) - self.value(icaltime_as_ical_string(self.tt),"DATE-TIME") - - def valid(self): - " Return true if this is a valid time " - return not icaltime_is_null_time(self.tt) - - def utc_seconds(self,v=None): - """ Return or set time in seconds past POSIX epoch""" - if (v!=None): - self.tt = icaltime_from_timet(v,0) - self._update_value() - - return icaltime_as_timet(self.tt) - - def is_utc(self,v=None): - """ Return or set boolean indicating if time is in UTC """ - if(v != None): - icaltimetype_is_utc_set(self.tt,v) - self._update_value() - return icaltimetype_is_utc_get(self.tt) - - def is_date(self,v=None): - """ Return or set boolean indicating if time is actually a date """ - if(v != None): - icaltimetype_is_date_set(self.tt,v) - self._update_value() - return icaltimetype_is_date_get(self.tt) - - def timezone(self,v=None): - """ Return or set the timezone string for this time """ - - if (v != None): - assert(isinstance(v,StringType) ) - self['TZID'] = v - return self['TZID'] - - def second(self,v=None): - """ Get or set the seconds component of this time """ - if(v != None): - icaltimetype_second_set(self.tt,v) - self._update_value() - return icaltimetype_second_get(self.tt) - - def minute(self,v=None): - """ Get or set the minute component of this time """ - if(v != None): - icaltimetype_minute_set(self.tt,v) - self._update_value() - return icaltimetype_minute_get(self.tt) - - def hour(self,v=None): - """ Get or set the hour component of this time """ - if(v != None): - icaltimetype_hour_set(self.tt,v) - self._update_value() - return icaltimetype_hour_get(self.tt) - - def day(self,v=None): - """ Get or set the month day component of this time """ - if(v != None): - icaltimetype_day_set(self.tt,v) - self._update_value() - return icaltimetype_day_get(self.tt) - - def month(self,v=None): - """ Get or set the month component of this time. January is month 1 """ - if(v != None): - icaltimetype_month_set(self.tt,v) - self._update_value() - return icaltimetype_month_get(self.tt) - - def year(self,v=None): - """ Get or set the year component of this time """ - if(v != None): - icaltimetype_year_set(self.tt,v) - self._update_value() - - return icaltimetype_year_get(self.tt) - - - - def __add__(self,o): - - other = Duration(o,"DURATION") - - if not other.valid(): - return Duration(0,"DURATION") - - seconds = self.utc_seconds() + other.seconds() - - new = Time(seconds,self.name()) - new.timezone(self.timezone()) - new.is_utc(self.is_utc()) - - return new - - def __radd_(self,o): - return self.__add__(o) - - - def __sub__(self,o): - - - if isinstance(o,Time): - # Subtract a time from this time and return a duration - seconds = self.utc_seconds() - other.utc_seconds() - return Duration(seconds) - elif isinstance(o,Duration): - # Subtract a duration from this time and return a time - other = Duration(o) - if(not other.valid()): - return Time() - - seconds = self.utc_seconds() - other.seconds() - return Time(seconds) - else: - raise TypeError, "subtraction with Time reqires Time or Duration" - -class Duration(Property): - """ - Represent a length of time, like 3 minutes, or 6 days, 20 seconds. - - - """ - - def __init__(self, arg, name="DURATION"): - """ - Create a new duration from an RFC2445 string or number of seconds. - Construct the duration from an iCalendar string or a number of seconds. - - Duration("P3DT2H34M45S") Construct from an iCalendar string - Duration(3660) Construct from seconds - """ - - self.dur = None - - e=icalerror_supress("MALFORMEDDATA") - - if isinstance(arg, DictType): - - self.dur = icaldurationtype_from_string(arg['value']) - Property.__init__(self,ref=arg['ref']) - else: - if isinstance(arg, StringType): - self.dur = icaldurationtype_from_string(arg) - elif isinstance(arg, IntType): - self.dur = icaldurationtype_from_int(arg) - elif isinstance(arg,Duration): - self.dur = arg.dur - else: - self.dur = icaldurationtype_null_duration() - - Property.__init__(self,type=name) - - icalerror_restore("MALFORMEDDATA",e) - - if self.dur == None or icaldurationtype_is_null_duration(self.dur): - raise Property.ConstructorFailedError("Failed to construct Duration from " +str(arg)) - - try: - self._update_value() - except Property.UpdateFailedError: - raise Property.ConstructorFailedError("Failed to construct Duration from " + str(arg)) - - def _update_value(self): - - self.value(icaldurationtype_as_ical_string(self.dur),"DURATION") - - def valid(self): - "Return true if this is a valid duration" - - return not icaldurationtype_is_null_duration(self.dur) - - def seconds(self,v=None): - """Return or set duration in seconds""" - if(v != None): - self.dur = icaldurationtype_from_int(v); - self.dict['value'] = icaltimedurationtype_as_ical_string(self.dur) - return icaldurationtype_as_int(self.dur) - - -class Period(Property): - """Represent a span of time""" - def __init__(self,arg,name='FREEBUSY'): - """ """ - - Property.__init__(self, type = name) - - self.pt=None - - #icalerror_clear_errno() - e1=icalerror_supress("MALFORMEDDATA") - e2=icalerror_supress("BADARG") - - if isinstance(arg, DictType): - - - es=icalerror_supress("MALFORMEDDATA") - self.pt = icalperiodtype_from_string(arg['value']) - icalerror_restore("MALFORMEDDATA",es) - - Property.__init__(self, ref=arg['ref']) - else: - if isinstance(arg, StringType): - - self.pt = icalperiodtype_from_string(arg) - - else: - self.pt = icalperiodtype_null_period() - - Property.__init__(self,type=name) - - icalerror_restore("MALFORMEDDATA",e1) - icalerror_restore("BADARG",e2) - - - if self.pt == None or icalperiodtype_is_null_period(self.pt): - raise Property.ConstructorFailedError("Failed to construct Period") - - - try: - self._update_value() - except Property.UpdateFailedError: - raise Property.ConstructorFailedError("Failed to construct Period") - - def _end_is_duration(self): - dur = icalperiodtype_duration_get(self.pt) - if not icaldurationtype_is_null_duration(dur): - return 1 - return 0 - - def _end_is_time(self): - end = icalperiodtype_end_get(self.pt) - if not icaltime_is_null_time(end): - return 1 - return 0 - - def _update_value(self): - - self.value(icalperiodtype_as_ical_string(self.pt),"PERIOD") - - - def valid(self): - "Return true if this is a valid period" - - return not icalperiodtype_is_null_period(self.dur) - - def start(self,v=None): - """ - Return or set start time of the period. The start time may be - expressed as an RFC2445 format string or an instance of Time. - The return value is an instance of Time - """ - - if(v != None): - if isinstance(t,Time): - t = v - elif isinstance(t,StringType) or isinstance(t,IntType): - t = Time(v,"DTSTART") - else: - raise TypeError - - icalperiodtype_start_set(self.pt,t.tt) - - self._update_value() - - - return Time(icaltime_as_timet(icalperiodtype_start_get(self.pt)), - "DTSTART") - - def end(self,v=None): - """ - Return or set end time of the period. The end time may be - expressed as an RFC2445 format string or an instance of Time. - The return value is an instance of Time. - - If the Period has a duration set, but not an end time, this - method will caluculate the end time from the duration. """ - - if(v != None): - - if isinstance(t,Time): - t = v - elif isinstance(t,StringType) or isinstance(t,IntType): - t = Time(v) - else: - raise TypeError - - if(self._end_is_duration()): - start = icaltime_as_timet(icalperiodtype_start_get(self.pt)) - dur = t.utc_seconds()-start; - icalperiodtype_duration_set(self.pt, - icaldurationtype_from_int(dur)) - else: - icalperiodtype_end_set(self.pt,t.tt) - - self._update_value() - - if(self._end_is_time()): - rt = Time(icaltime_as_timet(icalperiodtype_end_get(self.pt)), - 'DTEND') - rt.timezone(self.timezone()) - return rt - elif(self._end_is_duration()): - start = icaltime_as_timet(icalperiodtype_start_get(self.pt)) - dur = icaldurationtype_as_int(icalperiodtype_duration_get(self.pt)) - rt = Time(start+dur,'DTEND') - rt.timezone(self.timezone()) - return rt - else: - return Time({},'DTEND') - - - - def duration(self,v=None): - """ - Return or set the duration of the period. The duration may be - expressed as an RFC2445 format string or an instance of Duration. - The return value is an instance of Duration. - - If the period has an end time set, but not a duration, this - method will calculate the duration from the end time. """ - - if(v != None): - - if isinstance(t,Duration): - d = v - elif isinstance(t,StringType) or isinstance(t,IntType): - d = Duration(v) - else: - raise TypeError - - if(self._end_is_time()): - start = icaltime_as_timet(icalperiodtype_start_get(self.pt)) - end = start + d.seconds() - - icalperiodtype_end_set(self.pt,icaltime_from_timet(end,0)) - else: - icalperiodtype_duration_set(self.pt,d.dur) - - if(self._end_is_time()): - start =icaltime_as_timet(icalperiodtype_start_get(self.pt)) - end = icaltime_as_timet(icalperiodtype_end_get(self.pt)) - - print "End is time " + str(end-start) - - return Duration(end-start,"DURATION") - - elif(self._end_is_duration()): - dur = icaldurationtype_as_int( - icalperiodtype_duration_get(self.pt)) - - return Duration(dur,"DURATION") - else: - - - return Duration(0,"DURATION") - - - def timezone(self,v=None): - """ Return or set the timezone string for this time """ - if (v != None): - self['TZID'] = v - return self['TZID'] - -class Attendee(Property): - """Class for Attendee properties. - - Usage: - Attendee([dict]) - Attendee([address]) - - Where: - dict is an optional dictionary with keys of - 'value': CAL-ADDRESS string and any parameter: parameter_value entries. - 'name' and 'value_type' entries in dict are ignored and automatically set - with the appropriate values. - address is the CAL-ADDRESS (string) of the Attendee - """ - - def __init__(self, arg={}): - - assert(isinstance(arg,DictType)) - - ref = None - - if arg!={}: - ref = arg['ref'] - - Property.__init__(self,type='ATTENDEE',ref=ref) - - def _doParam(self, parameter, v): - if v!=None: - self[parameter]=v - return self[parameter] - - # Methods for accessing enumerated parameters - def cn(self, v=None): self._doParam('CN', v) - def cutype(self, v=None): self._doParam('CUTYPE', v) - def dir(self, v=None): self._doParam('DIR', v) - def delegated_from(self, v=None): self._doParam('DELEGATED-FROM', v) - def delegated_to(self, v=None): self._doParam('DELEGATED-TO', v) - def language(self, v=None): self._doParam('LANGUAGE', v) - def member(self, v=None): self._doParam('MEMBER', v) - def partstat(self, v=None): self._doParam('PARTSTAT', v) - def role(self, v=None): self._doParam('ROLE', v) - def rsvp(self, v=None): self._doParam('RSVP', v) - def sent_by(self, v=None): self._doParam('SENT-BY', v) - - -class Organizer(Property): - """Class for Organizer property. - """ - - def __init__(self, arg={}): - - assert(isinstance(arg, DictType)) - - ref = None - if arg != {}: - ref = arg['ref'] - Property.__init__(self, type='ORGANIZER', ref=ref) - -## param_t = ( 'CN', 'DIR', 'SENT-BY', 'LANGUAGE' ) -## for param in param_t: -## self[param] = None -## if value != None: -## self.value(value) - - - def _doParam(self, parameter, v): - if v!=None: - self[parameter]=v - return self[parameter] - - def name(self): - "Return the name of the property." - return Property.name(self) - - def value_type(self): - "Return the value type of the property." - return self._desc['value_type'] - - # Methods for accessing enumerated parameters - def cn(self, v=None): self._doParam('CN', v) - def dir(self, v=None): self._doParam('DIR', v) - def language(self, v=None): self._doParam('LANGUAGE', v) - def sent_by(self, v=None): self._doParam('SENT-BY', v) - -class Recurrence_Id(Time): - """Class for RECURRENCE-ID property. - - Usage: - Reccurence_Id(dict) # A normal property dictionary - Reccurence_Id("19960401") # An iCalendar string - Reccurence_Id(8349873494) # Seconds from epoch - - If the 'dict' constructor is used, 'name' and 'value_type' - entries in dict are ignored and automatically set with the appropriate - values. - """ - - def __init__(self, dict={}): - Time.__init__(self, dict) - Property.name(self, 'RECURRENCE-ID') - - def name(self): - return Property.name(self) - - def _doParam(self, parameter, v): - if v!=None: - self[parameter]=v - return self[parameter] - - # Enumerated parameters - def value_parameter(self, v=None): - """Sets or gets the VALUE parameter value. - - The value passed should be either "DATE-TIME" or "DATE". Setting this - parameter has no impact on the property's value_type. Doing something - like: - - rid=Recurrence_Id("19960401") # Sets value & makes value_type="DATE" - rid.value_parameter("DATE-TIME") # Sets the parameter VALUE=DATE-TIME - - Would be allowed (even though it is wrong), so pay attention. - Verifying the component will reveal the error. - """ - if v!=None and v!="DATE" and v!="DATE-TIME": - raise ValueError, "%s is an invalid VALUE parameter value" % str(v) - self._doParam("VALUE", v) - - def tzid(self, v=None): - "Sets or gets the TZID parameter value." - self._doParam("TZID", v) - - def range_parameter(self, v=None): # 'range' is a builtin function - "Sets or gets the RANGE parameter value." - if v!=None and v!="THISANDPRIOR" and v!= "THISANDFUTURE": - raise ValueError, "%s is an invalid RANGE parameter value" % str(v) - self._doParam("RANGE", v) - -class Attach(Property): - """A class representing an ATTACH property. - - Usage: - Attach(uriString [, parameter_dict]) - Attach(fileObj [, parameter_dict]) - """ - - def __init__(self, value=None, parameter_dict={}): - Property.__init__(self, parameter_dict) - Property.name(self, 'ATTACH') - self.value(value) - - def value(self, v=None): - "Returns or sets the value of the property." - if v != None: - if isinstance(v, StringType): # Is a URI - self._desc['value']=v - Property.value_type(self, 'URI') - else: - try: - tempStr = v.read() - except: - raise TypeError,"%s must be a URL string or file-ish type"\ - % str(v) - self._desc['value'] = base64.encodestring(tempStr) - Property.value_type(self, 'BINARY') - else: - return self._desc['value'] - - def name(self): - "Returns the name of the property." - return Property.name(self) - - def value_type(self): - return Property.value_type(self) - - def fmttype(self, v=None): - "Gets or sets the FMTYPE parameter." - if v!= None: - self['FMTTYPE']=v - else: - return self['FMTTYPE'] - -class RecurrenceSet: - """ - Represents a set of event occurrences. This - class controls a component's RRULE, EXRULE, RDATE and EXDATE - properties and can produce from them a set of occurrences. - """ - - def __init__(self): - pass - - def include(self, **params): - """ - Include a date or rule to the set. - - Use date= or pass in a - Time instance to include a date. Included dates will add an - RDATE property or will remove an EXDATE property of the same - date. - - Use rule= or pass in a string to include a rule. Included - rules with either add a RRULE property or remove an EXRULE - property. - - """ - pass - - def exclude(self, **params): - """ - Exclude date or rule to the set. - - Use date= or pass in a Time instance to exclude a - date. Excluded dates will add an EXDATE property or will remove - an RDATE property of the same date. - - Use rule= or pass in a string to exclude a rule. Excluded - rules with either add an EXRULE property or remove an RRULE - property. - - """ - pass - - def occurrences(self, count=None): - """ - Return 'count' occurrences as a tuple of Time instances. - """ - pass - - diff --git a/libical/src/python/Store.py b/libical/src/python/Store.py deleted file mode 100644 index 6d13bd5211..0000000000 --- a/libical/src/python/Store.py +++ /dev/null @@ -1,176 +0,0 @@ -#!/usr/bin/env python -# -*- Mode: python -*- -#====================================================================== -# FILE: Store.py -# CREATOR: eric -# -# DESCRIPTION: -# -# -# $Id$ -# $Locker$ -# -# (C) COPYRIGHT 2001, Eric Busboom <eric@softwarestudio.org> -# (C) COPYRIGHT 2001, Patrick Lewis <plewis@inetarena.com> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of either: -# -# The LGPL as published by the Free Software Foundation, version -# 2.1, available at: http://www.fsf.org/copyleft/lesser.html -# -# Or: -# -# The Mozilla Public License Version 1.0. You may obtain a copy of -# the License at http://www.mozilla.org/MPL/ -#====================================================================== - -from LibicalWrap import * -from Error import LibicalError -from Component import Component - -class Store: - """ - Base class for several component storage methods - """ - - class AddFailedError(LibicalError): - "Failed to add a property to the file store" - - class ConstructorFailedError(LibicalError): - "Failed to create a Store " - - def __init__(self): - pass - - def path(self): - pass - - def mark(self): - pass - - def commit(self): - pass - - def add_component(self, comp): - pass - - def remove_component(self, comp): - pass - - def count_components(self, kind): - pass - - def select(self, gauge): - pass - - def clearSelect(self): - pass - - def fetch(self, uid): - pass - - def fetchMatch(self, comp): - pass - - def modify(self, oldc, newc): - pass - - def current_component(self): - pass - - def first_component(self): - pass - - def next_component(self): - pass - - -class FileStore(Store): - - def __init__(self, file,mode="r",flags=0664): - - _flags = icallangbind_string_to_open_flag(mode) - - - if _flags == -1: - raise Store.ConstructorFailedError("Illegal value for mode: "+mode) - - e1=icalerror_supress("FILE") - self._ref = icalfileset_new_open(file,_flags,flags) - icalerror_restore("FILE",e1) - - print self._ref - - if self._ref == None or self._ref == 'NULL': - raise Store.ConstructorFailedError(file) - - def __del__(self): - icalfileset_free(self._ref) - - def path(self): - return icalfileset_path(self._ref) - - def mark(self): - icalfileset_mark(self._ref) - - def commit(self): - icalfileset_commit(self._ref) - - def add_component(self, comp): - if not isinstance(comp,Component): - raise Store.AddFailedError("Argument is not a component") - - error = icalfileset_add_component(self._ref,comp) - - def remove_component(self, comp): - if not isinstance(comp,Component): - raise Store.AddFailedError("Argument is not a component") - - error = icalfileset_remove_component(self._ref,comp) - - - - def count_components(self, kind): - pass - - def select(self, gauge): - pass - - def clearSelect(self): - pass - - def fetch(self, uid): - pass - - def fetchMatch(self, comp): - pass - - def modify(self, oldc, newc): - pass - - def current_component(self): - comp_ref = icalfileset_get_current_component(self._ref) - - if comp_ref == None: - return None - - return Component(ref=comp_ref) - - def first_component(self): - comp_ref = icalfileset_get_first_component(self._ref) - - if comp_ref == None: - return None - - return Component(ref=comp_ref) - - def next_component(self): - - comp_ref = icalfileset_get_next_component(self._ref) - - if comp_ref == None: - return None - - return Component(ref=comp_ref) - diff --git a/libical/src/python/python-binding.txt b/libical/src/python/python-binding.txt deleted file mode 100644 index 7fc9e066bf..0000000000 --- a/libical/src/python/python-binding.txt +++ /dev/null @@ -1,434 +0,0 @@ - -Classes for python binding to libical -(Indentation indicates inheritance) - - Component - Event - JournalEntry - Todo - FreeBusy - Timezone - Alarm - AudioAlarm - EmailAlarm - ProcedureAlarm - DisplayAlarm - - Property - Attendee - Organizer - Status - Error - - Time - Period - Date - RecurrenceSet - - Timezone - TimezonePhase - - Store - FileStore - DirStore - CAPStore - HeapStore - MySQLStore - - - -Component is the central class in the design. The component can be -though of as a container for child components and properties, or as -representation of a specific kind of iCal object. The first -interface offers general property and component accessors, and the -second treats some types of objects in a special way. - -The general interface offers simple manipulators for child property -and components, and it only works with immediate children. So, given -the Component: - - BEGIN:VCALENDAR - METHOD:PUBLISH - BEGIN:VEVENT - BEGIN:VALARM - COMMENT: An Alarm - END:VALARM - END:VEVENT - END:VCALENDAR - -A caller would have to descend three levels to access the COMMENT -property in the alarm, but only one to access the METHOD property. - -Libical is almost entirely dedicated to the general interface; it -includes all of the *get_first_*, *_next_next_*, *_add_* and *_remove_* -routines. - -The specific interface works with derived classes of Property and -Component. In this interface, the caller could get the COMMENT in the -alarm in the example in two steps. First the caller would ask the -Event object for its alarms, then then the caller would ask the first -Alarm object for its comment. - -The Specific interface is part of the -derived classes of Component. This interface names all of the types of -properties and components that can be accessed from the derived -component type. - -In libical, the specific interface is primarily the "convenience -routines in icalcomponent.h, such as: - - - struct icaltimetype icalcomponent_get_dtend(icalcomponent* comp); - void icalcomponent_set_dtend(icalcomponent* comp, struct icaltimetype v); - - void icalcomponent_set_duration(icalcomponent* comp, - struct icaldurationtype v); - struct icaldurationtype icalcomponent_get_duration(icalcomponent* comp); - -These routines are smarter and do more work than the general -interface. From the general interface, you can set the DTEND -property of a component by creating the property and adding it to a -component. But, if the component already has a DURATION property, then -this is an error -- a component can't have both. - -icalcomponent_set_dtend determines if the component already has a -DURATION. If it does, it substracts the dtstart time from the new -dtend time and sets the duration to that. Otherwise, it creates aor -changes the DTEND. - -Also, icalcomponent_set_duration works the same regardless if the -component is a VCALENDAR or a VEVENT. If it is a VCALENDAR, the -routine descends into the VEVENT before making any changes. If it is -allready a VEVENT ( or VTODO or VJOURNAL ) the routine just makes the -changes. With icalcomponent_add_property, you need to do this check -yourself. - -( There should probably be a class between Component -and Event ,JournalEntry and Todo that names all of the properties and -components. Then Event, JournalEntry and Todo would remove the -accessors that did not apply to them. ) - -Parameters are accessed as dictionaries from Property or as attributes -of a derived class of Property. Both the names and the values of the -parameters are strings. - -The Store hierarchy is a interface to various ways to store iCal -components. Each of these has the same interface as its corresponding -libical module: - - FileStore icalfileset Store iCal components in a single file - DirStore icaldirset Use multiple files, one per month of - DTSTART - CAPStore Access components in a CAP server - HeapStore Components stored in memory - MySQLStore Components stored in a MySQL - database. - -The only iCal value objects that will be implemented as Python classes -are Time, Duration and Period. RecurrenceSet handles recurrence -rules. It replaces the properties RRULE, RDATE, EXRULE and EXDATE. - -(Not all of the libical modules are implemented ) - - -How to Use the library ----------------------- - -The most common usecases will be something like this: - -1)Caller opens a Store object on a file, server or database. The -caller retrieves one or more component. Some of the components will be -booked on the user's calendar. Other components will be messages that -other users have sent, like requests for meetings. - -2) The caller will use the Specific interface ( using methods specific -to each property ) to example the component and decide what to do with -it. - -3) Rarely, the caller will access the general interface to do things -that the specific interface has not implemented or cannot manage -well. - -4) Cller may create a new component, using a combination of the -general and specific interfaces. The caller may send the message to -another user via mail, or may submit it to the user's CAP server with -the CAPStore class. - - -Following are the methods in each of the classes. - -Component - Construct from string - output string in ical form - - Get a Property by type - Get a set of Properties by type - Remove a Property by reference - - Get a Component by type - Get a set of Components by type - Remove a Component by reference - - Validate the component ( insert properties for errors ) - Count error properties - Remove error properties - Convert error properties into REQUEST-STATUS properties - -Event, JournalEntry, Todo - - Construct from string - output string in ical form - - There are get/set accessors for every property. These are - listed in a later section - - -FreeBusy - - Construct from string - Construct from arguments - output string in ical form - - Accessors for the following properties. See below for return - types for these properties: - - method - prodid - attendee - dtstamp - dtstart - freebusy - organizer - uid - comment - contact - request-status - url - duration - sequence - -TimezonePhase - - Construct from string - Construct from arguments - output string in ical form - - Accessors for the following properties. See below for return - types for these properties: - - tzname - offsetto - offsetfrom - rrule - rdate - comment - -TimeZone - - Construct from string - Construct from arguments - output string in ical form - - Accessors for the following properties. See below for return - types for these properties: - - tzid - last-modified - tzurl - standard (returns TimezonePhase) - daylight (returns TimezonePhase) - - -Property - - Construct from string - Construct from arguments - output string in ical form - - Dictionary access to parameters - - Get/set value - -Attendee - - Construct from string - Construct from arguments - output string in ical form - - Access to the following properties and parameters: - cuid - cutype - member - role - rsvp - delto - delfrom - sentby - cn - dir - language - -Organizer - - Access to the following properties: - common_name - dir - sentby - language - - -Time -Date -Period - - Same interfaces as libical modules. - -RecurenceSet - I don't know -- need to think about it more. - -Store - Similar methods to the icalset modules. - - -RFC2445 Properties - -This is a list of all of the RFC2445 properties and their associated -VALUE type. - - -Property Value ----------------------------- -CALSCALE TEXT -METHOD TEXT -PRODID TEXT -VERSION TEXT -CATEGORIES TEXT -CLASS TEXT -COMMENT TEXT -DESCRIPTION TEXT -LOCATION TEXT -PERCENT-COMPLETE INTEGER -PRIORITY INTEGER -RESOURCES TEXT -STATUS STATUS -SUMMARY TEXT -COMPLETED DATE-TIME -FREEBUSY PERIOD -TRANSP TEXT -TZNAME TEXT -TZOFFSETFROM UTC-OFFSET -TZOFFSETTO UTC-OFFSET -TZURL URI -TZID TEXT -ATTENDEE CAL-ADDRESS -CONTACT TEXT -ORGANIZER CAL-ADDRESS -RELATED-TO TEXT -URL URI -UID TEXT -EXRULE RECUR -RRULE RECUR -ACTION TEXT -REPEAT INTEGER -CREATED DATE-TIME -DTSTAMP DATE-TIME -LAST-MODIFIED DATE-TIME -SEQUENCE INTEGER -X TEXT -REQUEST-STATUS STRING -ATTACH URL, BINARY -GEO FLOAT -DTEND DATE-TIME -DUE DATE-TIME -DTSTART DATE-TIME -RECURRENCE-ID DATE-TIME -EXDATE DATE-TIME -RDATE DATE-TIME, PERIOD -TRIGGER DATE-TIME, DURATION -DURATION DURATION - -Some of the properties can appear multiple times in a component, other -can appear only once. For a particular component, the number of times -a property can apper may also change with the METHOD property -associated with the component. This list shows which properties can -appear multiple times for some ( but not all ) combinations of -component type and METHOD value: - -ATTACH -ATTENDEE -CATEGORIES -COMMENT -CONTACT -EXDATE -EXRULE -FREEBUSY -NONE -RDATE -RELATEDTO -REQUESTSTATUS -RESOURCES -RRULE -TZNAME -TZURL -X - - -This is a list of the value types and their associated python return -types. A lowercased return type is a python builtin, and an -uppercase-first-letter is a class in the library: - - -Value Return Type ------------------------------------ -BINARY file -BOOLEAN number -CAL-ADDRESS string -DATE Time -DATE-TIME Time -DURATION Duration -FLOAT number -GEO tuple -INTEGER number -METHOD string -PERIOD Period -RECUR RecurrenceSet -TEXT string -TIME Time -URI string -UTC-OFFSET number -STATUS string -X string - - -I suspect that the Component class should use the three previous -tables to create the property accessor methods on the fly. If the -method generation system is general enough, we could also use it for -other classes, such as Alarm, Timezone, Attendee, Organizer and -Freebusy. - - -Memory Handling ---------------- - -One of the things that made the perl binding to libcal difficult was -that if a Component (in perl) returns a reference to a child Component -(in perl), the child Component (in perl) will contain a reference to a -libical component. When the caller is done with the child component in -perl, the caller just drops it and lets perl reclaim the memory. - -The destructor for Component needs to free the libical component that -it holds a reference to, but the child's libical component is still -being used by libical. So perl frees the libical component and later, -libical tries to reference freed memory. - -The situation is actually a little better than that, because libical -will throw an error when you try to free a component that is still -attached to a parent. - -So, the perl library has to be able to determine when the destructor -should free a libical component or not. The perl library calls -icalcomponent_get_parent(), and if is it non-zero, it does not free -the component. - -It is not hard, just more code, and something to watch out for. - diff --git a/libical/src/python/test.py b/libical/src/python/test.py deleted file mode 100644 index 1fdf515408..0000000000 --- a/libical/src/python/test.py +++ /dev/null @@ -1,373 +0,0 @@ -#!/usr/bin/env python -# -*- Mode: python -*- -#====================================================================== -# FILE: test.py -# CREATOR: eric -# -# DESCRIPTION: -# -# -# $Id$ -# $Locker$ -# -# (C) COPYRIGHT 2001, Eric Busboom <eric@softwarestudio.org> -# (C) COPYRIGHT 2001, Patrick Lewis <plewis@inetarena.com> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of either: -# -# The LGPL as published by the Free Software Foundation, version -# 2.1, available at: http://www.fsf.org/copyleft/lesser.html -# -# Or: -# -# The Mozilla Public License Version 1.0. You may obtain a copy of -# the License at http://www.mozilla.org/MPL/ -#====================================================================== - -from Libical import * - -def error_type(): - error = icalerror_perror() - return error[:index(error,':')] - -comp_str = """ -BEGIN:VEVENT -ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:employee-A@host.com -COMMENT: When in the course of writting comments and nonsense text\, it - becomes necessary to insert a newline -DTSTART:19972512T120000 -DTSTART:19970101T120000Z -DTSTART:19970101 -DURATION:P3DT4H25M -FREEBUSY:19970101T120000/19970101T120000 -FREEBUSY:19970101T120000/PT3H -FREEBUSY:19970101T120000/PT3H -END:VEVENT""" - - -def test_property(): - - print "--------------------------- Test Property ----------------------" - - liw = LibicalWrap - icalprop = liw.icalproperty_new_from_string("ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:employee-A@host.com") - - print liw.icalproperty_as_ical_string(icalprop) - - p = Property(ref=icalprop) - - print p.name() - print p.parameters() - print p['ROLE'] - - p['ROLE'] = 'INDIVIDUAL' - - print p['ROLE'] - - print p.value() - p.value("mailto:Bob@bob.com") - print p.value() - - - print p.as_ical_string() - - try: - p = Property() - except Property.ConstructorFailedError: - pass - else: - assert(0) - -def test_time(): - "Test routine" - - print"-------------------Test Time --------------------------------" - - t = Time("19970325T123010Z",'DTSTART') - - assert(t.year() == 1997) - assert(t.month() == 3) - assert(t.day() == 25) - assert(t.hour() == 12) - assert(t.minute() == 30) - assert(t.second() == 10) - assert(t.is_utc()) - assert(not t.is_date()) - - print t - - t.timezone("America/Los_Angeles") - print str(t) - assert(str(t)=='DTSTART;TZID=America/Los_Angeles:19970325T123010Z') - - t.second(t.second()+80) - - print t - - assert(t.minute() == 31) - assert(t.second() == 30) - - d = Duration(3600,"DURATION") - t2 = t + d - - print t2 - assert(t2.hour() == 13) - - t2 = t - d - - print t2 - assert(isinstance(t2,Time)) - assert(t2.hour() == 11) - - -def test_period(): - - print"-------------------Test Period--------------------------------" - - p = Period("19970101T180000Z/19970101T233000Z") - - print p - - - assert(str(p) == 'FREEBUSY:19970101T180000Z/19970101T233000Z') - - print p.start() - assert(str(p.start()) == 'DTSTART:19970101T180000Z') - - print p.end() - assert(str(p.end()) == 'DTEND:19970101T233000Z') - - print p.duration() - assert(str(p.duration()) == 'DURATION:PT5H30M') - p = None - - p = Period("19970101T180000Z/PT5H30M") - print p - - print p.start() - assert(str(p.start()) == 'DTSTART:19970101T180000Z') - - print p.end() - assert(str(p.end()) == 'DTEND:19970101T233000Z') - - print p.duration() - assert(str(p.duration()) == 'DURATION:PT5H30M') - - -def test_duration(): - - print "-------------- Test Duration ----------------" - - # Ical string - - d = Duration("P3DT4H25M") - - print str(d) - - assert(str(d) == "DURATION:P3DT4H25M") - - print d.seconds() - - assert(d.seconds() == 275100) - - # seconds - - d = Duration(-275100) - - print str(d) - - assert(str(d) == "DURATION:-P3DT4H25M") - - print d.seconds() - - assert(d.seconds() == -275100) - - #error - - try: - d = Duration("P10WT7M") - print str(d) - assert(0) - except: pass - - try: - d = Duration("Pgiberish") - print str(d) - assert(0) - except: - pass - - - -def test_attach(): - - file = open('littlefile.txt') - attachProp = Attach(file) - file.close() - attachProp.fmttype('text/ascii') - print "\n" + attachProp.name() - print attachProp.value_type() - print attachProp.fmttype() - attachProp['fmttype']=None - print "Calling value()" - print attachProp.value() - print "Calling asIcalString()" - print attachProp.as_ical_string() - - -def test_component(): - - print "------------------- Test Component ----------------------" - - - c = Component(comp_str); - - props = c.properties() - - for p in props: - print p.as_ical_string() - - dtstart = c.properties('DTSTART')[0] - - print dtstart - - print "\n Orig hour: ", dtstart.hour() - assert(dtstart.hour() == 12) - - dtstart.hour(dtstart.hour() + 5) - - print "\n New hour: ", dtstart.hour() - assert(dtstart.hour() == 17) - - attendee = c.properties('ATTENDEE')[0] - - print attendee - - t = Time("20011111T123030") - t.name('DTEND') - - c.add_property(t) - - - print c - - dtstart1 = c.properties('DTSTART')[0] - dtstart2 = c.properties('DTSTART')[0] - dtstart3 = c.property('DTSTART') - - assert(dtstart1 is dtstart2) - assert(dtstart1 == dtstart2) - - assert(dtstart1 is dtstart3) - assert(dtstart1 == dtstart3) - - - p = Property(type="SUMMARY"); - p.value("This is a summary") - - c.properties().append(p) - - print c.as_ical_string() - - p = c.properties("SUMMARY")[0] - assert(p!=None); - print str(p) - assert(str(p) == "SUMMARY:This is a summary") - - c.properties()[:] = [p] - - print c.as_ical_string() - - -def test_event(): - print "------------ Event Class ----------------------" - event = Event() - event.created("20010313T123000Z") - #print "created =", event.created() - assert (event.created() == "20010313T123000Z") - - event.organizer("MAILTO:j_doe@nowhere.com") - org = event.properties('ORGANIZER')[0] - #print org.cn() - org.cn('Jane Doe') - assert (isinstance(org, Organizer)) - #print "organizer =", event.organizer() - assert (event.organizer() == "MAILTO:j_doe@nowhere.com") - - event.dtstart("20010401T183000Z") - #print "dtstart =", event.dtstart() - assert (event.dtstart()=="20010401T183000Z") - - dtend = Time('20010401T190000Z', 'DTEND') - event.dtend(dtend) - assert (event.dtend()==dtend.value()) - assert (event.dtend() == '20010401T190000Z') - - att = Attendee() - att.value('jsmith@nothere.com') - event.attendees(('ef_hutton@listenup.com', att)) - - event.description("A short description. Longer ones break things.") - event.status('TeNtAtIvE') - - print event.as_ical_string() - - -def test_derivedprop(): - - print "------------ Derived Properties -----------------" - - p = RDate("20011111T123030") - - print str(p) - - - p = RDate("19970101T120000/19970101T123000") - - print str(p) - - try: - p = RDate("P3DT4H25M") - print str(p) - assert(0) - except: pass - - - p = Trigger("P3DT4H25M") - - print str(p) - - p = Trigger("20011111T123030") - - print str(p) - - try: - p = Trigger("19970101T120000/19970101T123000") - print str(p) - assert(0) - except: pass - - -def run_tests(): - test_property() - - test_time() - - test_period() - - test_component() - - test_duration() - - test_derivedprop() - - test_event() - - #test_attach() - - - -if __name__ == "__main__": - run_tests() - diff --git a/libical/src/test/.cvsignore b/libical/src/test/.cvsignore deleted file mode 100644 index ed72bfe59f..0000000000 --- a/libical/src/test/.cvsignore +++ /dev/null @@ -1,18 +0,0 @@ -*.la -*.lo -.libs -Makefile -Makefile.in -.deps -.libs -copycluster -regression -parser -findobj -storage -stow -recur -testmime -testvcal - - diff --git a/libical/src/test/Makefile.am b/libical/src/test/Makefile.am deleted file mode 100644 index d4fa33c040..0000000000 --- a/libical/src/test/Makefile.am +++ /dev/null @@ -1,25 +0,0 @@ - -noinst_PROGRAMS = copycluster regression parser storage stow recur testmime testvcal process testclassify - -LDADD = ../libicalss/.libs/libicalss.a ../libicalvcal/.libs/libicalvcal.a ../libical/.libs/libical.a - -INCLUDES = \ - -I. \ - -I../libicalvcal \ - -I$(srcdir)/../libicalvcal \ - -I$(srcdir) \ - -I../libical \ - -I$(srcdir)/../libical \ - -I../libicalss \ - -I$(srcdir)/../libicalss - -copycluster_SOURCES = copycluster.c -regression_SOURCES = regression.c -parser_SOURCES = icaltestparser.c -storage_SOURCES = storage.c -stow_SOURCES = stow.c -testvcal_SOURCES = testvcal.c -recur_SOURCES = recur.c -testmime_SOURCES = testmime.c -process_SOURCES = process.c -testclassify_SOURCES = testclassify.c diff --git a/libical/src/test/copycluster.c b/libical/src/test/copycluster.c deleted file mode 100644 index 4eefc37758..0000000000 --- a/libical/src/test/copycluster.c +++ /dev/null @@ -1,130 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: copycluster.c - CREATOR: eric 15 January 2000 - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000 Eric Busboom - http://www.softwarestudio.org - - The contents of this file are subject to the Mozilla Public License - Version 1.0 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and - limitations under the License. - - The Original Code is eric. The Initial Developer of the Original - Code is Eric Busboom - - - ======================================================================*/ - -#include <stdio.h> /* for printf */ -#include "ical.h" -#include "icalss.h" -#include "icalfileset.h" -#include <errno.h> -#include <string.h> /* For strerror */ -#include <signal.h> /* for signal */ -#include <unistd.h> /* for alarm */ -#include "icalrestriction.h" - -static void sig_alrm(int i){ - fprintf(stderr,"Could not get lock on file\n"); - exit(1); -} -/* This program copies a file that holds iCal components to an other file. */ - - -void usage(char* arg0) { - printf("usage: %s cluster-file1 cluster-file2\n",arg0); -} - -int main(int c, char *argv[]){ - - icalfileset *clusterin, *clusterout; - icalcomponent *itr; - int count=0; - int tostdout = 0; - - if(c < 2 || c > 3){ - usage(argv[0]); - exit(1); - } - - if (c == 2){ - tostdout = 1; - } - - - icalerror_set_error_state(ICAL_PARSE_ERROR, ICAL_ERROR_NONFATAL); - - - signal(SIGALRM,sig_alrm); - - alarm(0); - clusterin = icalfileset_new(argv[1]); - alarm(0); - - if (clusterin == 0){ - printf("Could not open input cluster \"%s\"",argv[1]); - - exit(1); - } - - if (!tostdout){ - clusterout = icalfileset_new(argv[2]); - if (clusterout == 0){ - printf("Could not open output cluster \"%s\"\n",argv[2]); - exit(1); - } - } - - - for (itr = icalset_get_first_component(clusterin); - itr != 0; - itr = icalset_get_next_component(clusterin)){ - - icalerror_set_error_state(ICAL_BADARG_ERROR, ICAL_ERROR_NONFATAL); - icalrestriction_check(itr); - icalerror_set_error_state(ICAL_BADARG_ERROR, ICAL_ERROR_DEFAULT); - - if (itr != 0){ - - if(tostdout){ - - printf("--------------\n%s\n",icalcomponent_as_ical_string(itr)); - - } else { - - icalfileset_add_component(clusterout, - icalcomponent_new_clone(itr)); - } - - count++; - - } else { - printf("Got NULL component"); - } - } - - - printf("Transfered %d components\n",count); - - icalfileset_free(clusterin); - - if (!tostdout){ - icalfileset_mark(clusterout); - icalfileset_free(clusterout); - } - - return 0; -} - - diff --git a/libical/src/test/findobj.c b/libical/src/test/findobj.c deleted file mode 100644 index c31101c33d..0000000000 --- a/libical/src/test/findobj.c +++ /dev/null @@ -1,72 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: findobj.c - CREATOR: eric 11 February 2000 - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000 Eric Busboom - http://www.softwarestudio.org - - The contents of this file are subject to the Mozilla Public License - Version 1.0 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and - limitations under the License. - - The Original Code is eric. The Initial Developer of the Original - Code is Eric Busboom - - - ======================================================================*/ - -#include <stdio.h> /* for printf */ -#include "ical.h" -#include "icalcalendar.h" -#include "icaldirset.h" -#include <errno.h> -#include <string.h> /* For strerror */ -#include "icalrestriction.h" - -/* This program finds an object stored in a calendar */ - -void usage(char* arg0) { - printf("usage: %s calendar-dir uid\n",arg0); -} - -int main(int c, char *argv[]){ - - icalcalendar *cal; - icaldirset *booked; - icalcomponent *itr; - - if(c < 2 || c > 3){ - usage(argv[0]); - exit(1); - } - - cal = icalcalendar_new(argv[1]); - - if(cal == 0){ - fprintf(stderr,"%s: error in opening calendar \"%s\": %s. errno is \"%s\"\n", - argv[0],argv[1],icalerror_strerror(icalerrno), - strerror(errno)); - } - - booked = icalcalendar_get_booked(cal); - - itr = icaldirset_fetch(booked,argv[2]); - - - if(itr != 0){ - printf("%s",icalcomponent_as_ical_string(itr)); - } - - return 0; -} - diff --git a/libical/src/test/icaltestparser.c b/libical/src/test/icaltestparser.c deleted file mode 100644 index e5973e0d4a..0000000000 --- a/libical/src/test/icaltestparser.c +++ /dev/null @@ -1,122 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: icaltestparser.c - CREATOR: eric 20 June 1999 - - $Id$ - $Locker$ - - The contents of this file are subject to the Mozilla Public License - Version 1.0 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and - limitations under the License. - - The original author is Eric Busboom - The original code is icaltestparser.c - - - (C) COPYRIGHT 1999 The Software Studio. - http://www.softwarestudio.org - - ======================================================================*/ - -#include <stdio.h> -#include <errno.h> -#include <stdio.h> -#include <string.h> -#include "ical.h" - -#include <stdlib.h> - -char str[] = "BEGIN:VCALENDAR\ -PRODID:\"-//RDU Software//NONSGML HandCal//EN\"\ -VERSION:2.0\ -BEGIN:VTIMEZONE\ -TZID:US-Eastern\ -BEGIN:STANDARD\ -DTSTART:19990404T020000\ -RDATE:19990u404xT020000\ -TZOFFSETFROM:-0500\ -TZOFFSETTO:-0400\ -END:STANDARD\ -BEGIN:DAYLIGHT\ -DTSTART:19990404T020000\ -RDATE:19990404T020000\ -TZOFFSETFROM:-0500\ -TZOFFSETTO:-0400\ -TZNAME:EDT\ -Dkjhgri:derhvnv;\ -BEGIN:dfkjh\ -END:dfdfkjh\ -END:DAYLIGHT\ -END:VTIMEZONE\ -BEGIN:VEVENT\ -GEO:Bongo\ -DTSTAMP:19980309T231000Z\ -UID:guid-1.host1.com\ -ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com\ -ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP\ - :MAILTO:employee-A@host.com\ -DESCRIPTION:Project XYZ Review Meeting\ -CATEGORIES:MEETING\ -CLASS:PUBLIC\ -CREATED:19980309T130000Z\ -SUMMARY:XYZ Project Review\ -DTSTART;TZID=US-Eastern:19980312T083000\ -DTEND;TZID=US-Eastern:19980312T093000\ -LOCATION:1CP Conference Room 4350\ -END:VEVENT\ -END:VCALENDAR\ -"; - -extern int yydebug; - -/* Have the parser fetch data from stdin */ - -char* read_stream(char *s, size_t size, void *d) -{ - char *c = fgets(s,size, (FILE*)d); - - return c; - -} - - - -int main(int argc, char* argv[]) -{ - - char* line; - FILE* stream; - icalcomponent *c; - icalparser *parser = icalparser_new(); - - stream = fopen(argv[1],"r"); - - assert(stream != 0); - - icalparser_set_gen_data(parser,stream); - - do{ - - line = icalparser_get_line(parser,read_stream); - - c = icalparser_add_line(parser,line); - - - if (c != 0){ - /*icalcomponent_convert_errors(c);*/ - printf("%s",icalcomponent_as_ical_string(c)); - printf("\n---------------\n"); - icalcomponent_free(c); - } - - } while ( line != 0); - - return 0; - } diff --git a/libical/src/test/process.c b/libical/src/test/process.c deleted file mode 100644 index 56f1c65fb1..0000000000 --- a/libical/src/test/process.c +++ /dev/null @@ -1,446 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: process.c - CREATOR: eric 11 February 2000 - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000 Eric Busboom - http://www.softwarestudio.org - - The contents of this file are subject to the Mozilla Public License - Version 1.0 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and - limitations under the License. - - ======================================================================*/ - -#include <stdio.h> /* for printf */ -#include "ical.h" -#include "icalss.h" -#include <errno.h> -#include <string.h> /* For strerror */ -#include <stdlib.h> /* for free */ - -struct class_map { - ical_class class; - char *str; -} class_map[] = { - {ICAL_NO_CLASS,"No class"}, - {ICAL_PUBLISH_NEW_CLASS,"New Publish"}, - {ICAL_PUBLISH_UPDATE_CLASS,"New Publish"}, - {ICAL_REQUEST_NEW_CLASS,"New request"}, - {ICAL_REQUEST_UPDATE_CLASS,"Update"}, - {ICAL_REQUEST_RESCHEDULE_CLASS,"Reschedule"}, - {ICAL_REQUEST_DELEGATE_CLASS,"Delegate"}, - {ICAL_REQUEST_NEW_ORGANIZER_CLASS,"New Organizer"}, - {ICAL_REQUEST_FORWARD_CLASS,"Forward"}, - {ICAL_REQUEST_STATUS_CLASS,"Status request"}, - {ICAL_REPLY_ACCEPT_CLASS,"Accept reply"}, - {ICAL_REPLY_DECLINE_CLASS,"Decline reply"}, - {ICAL_REPLY_CRASHER_ACCEPT_CLASS,"Crasher's accept reply"}, - {ICAL_REPLY_CRASHER_DECLINE_CLASS,"Crasher's decline reply"}, - {ICAL_ADD_INSTANCE_CLASS,"Add instance"}, - {ICAL_CANCEL_EVENT_CLASS,"Cancel event"}, - {ICAL_CANCEL_INSTANCE_CLASS,"Cancel instance"}, - {ICAL_CANCEL_ALL_CLASS,"Cancel all instances"}, - {ICAL_REFRESH_CLASS,"Refresh"}, - {ICAL_COUNTER_CLASS,"Counter"}, - {ICAL_DECLINECOUNTER_CLASS,"Decline counter"}, - {ICAL_MALFORMED_CLASS,"Malformed"}, - {ICAL_OBSOLETE_CLASS,"Obsolete"}, - {ICAL_MISSEQUENCED_CLASS,"Missequenced"}, - {ICAL_UNKNOWN_CLASS,"Unknown"} -}; - -char* find_class_string(ical_class class) -{ - int i; - - for (i = 0;class_map[i].class != ICAL_UNKNOWN_CLASS;i++){ - if (class_map[i].class == class){ - return class_map[i].str; - } - } - - return "Unknown"; -} - -void send_message(icalcomponent *reply,const char* this_user) -{ - printf("From: %s\n\n%s\n",this_user,icalcomponent_as_ical_string(reply)); - - -} - - -int main(int argc, char* argv[]) -{ - icalcomponent *c, *next_c; - int i=0; - char *class_string; - int dont_remove; - - icalset* f = icalset_new_file("../../test-data/process-incoming.ics"); - icalset* trash = icalset_new_file("trash.ics"); - icalset* cal = icalset_new_file("../../test-data/process-calendar.ics"); - icalset* out = icalset_new_file("outgoing.ics"); - - const char* this_user = "alice@cal.softwarestudio.org"; - - assert(f!= 0); - assert(cal!=0); - assert(trash!=0); - assert(out!=0); - - - /* Foreach incoming message */ - for(c=icalset_get_first_component(f);c!=0;c = next_c){ - - ical_class class; - icalcomponent *match; - icalcomponent *inner; - icalcomponent *reply = 0; - - assert(c!=0); - - inner = icalcomponent_get_first_real_component(c); - - i++; - reply = 0; - dont_remove = 0; - - if(inner == 0){ - printf("Bad component, no inner\n %s\n", - icalcomponent_as_ical_string(c)); - continue; - } - - /* Find a booked component that is matched to the incoming - message, based on the incoming component's UID, SEQUENCE - and RECURRENCE-ID*/ - - match = icalset_fetch_match(cal,c); - - class = icalclassify(c,match,this_user); - - class_string = find_class_string(class); - - /* Print out the notes associated with the incoming component - and the matched component in the */ - { - const char *c_note=0; - const char *m_note=0; - icalproperty *p; - - for(p = icalcomponent_get_first_property(c,ICAL_X_PROPERTY); - p!= 0; - p = icalcomponent_get_next_property(c,ICAL_X_PROPERTY)){ - - if(strcmp(icalproperty_get_x_name(p),"X-LIC-NOTE")==0){ - c_note = icalproperty_get_x(p); - } - } - - if (match != 0){ - for(p = icalcomponent_get_first_property(match, - ICAL_X_PROPERTY); - p!= 0; - p = icalcomponent_get_next_property(match, - ICAL_X_PROPERTY)){ - if(strcmp(icalproperty_get_x_name(p),"X-LIC-NOTE")==0){ - m_note = icalproperty_get_x(p); - } - } - } - - if(c_note != 0){ - printf("Incoming: %s\n",c_note); - } - if(m_note != 0){ - printf("Match : %s\n",m_note); - } - } - - /* Main processing structure */ - - switch (class){ - case ICAL_NO_CLASS: { - char temp[1024]; - /* Huh? Return an error to sender */ - icalrestriction_check(c); - icalcomponent_convert_errors(c); - - snprintf(temp,1024,"I can't understand the component you sent. \n Here is the component you sent, possibly with error messages:\n %s",icalcomponent_as_ical_string(c)); - - reply = icalmessage_new_error_reply( - c, - this_user, - temp, - "", - ICAL_UNKNOWN_STATUS - ); - - - - break; - } - case ICAL_PUBLISH_NEW_CLASS: { - - /* Don't accept published events from anyone but - self. If self, fall through to ICAL_REQUEST_NEW_CLASS */ - - - - } - case ICAL_REQUEST_NEW_CLASS: { - - /* Book the new component if it does not overlap - anything. If the time is busy and the start time is - an even modulo 4, delegate to - bob@cal.softwarestudio.org. If the time is busy and - is 1 modulo 4, counterpropose for the first - available free time. Otherwise, deline the meeting */ - - icalcomponent *overlaps; - overlaps = icalclassify_find_overlaps(cal,c); - - if(overlaps == 0){ - /* No overlaps, book the meeting */ -/* icalset_add_component(cal,icalcomponent_new_clone(c));*/ - - /* Return a reply */ - reply = icalmessage_new_accept_reply(c,this_user, - "I can make it to this meeting"); - - icalset_add_component(out,reply); - - } else { - /* There was a conflict, so delegate, counterpropose - or decline it */ - struct icaltimetype dtstart - = icalcomponent_get_dtstart(c); - - if(dtstart.hour%4 == 0){ - /* Delegate the meeting */ - reply = icalmessage_new_delegate_reply(c, - this_user, - "bob@cal.softwarestudio.org", - "Unfortunately, I have another commitment that \ -conflicts with this meeting. I am delegating my attendance to Bob. "); - - icalset_add_component(out,reply); - - } else if (dtstart.hour%4 == 1) { - /* Counter propose to next available time */ - icalcomponent *newc; - struct icalperiodtype next_time; - - icalspanlist *spanl = - icalspanlist_new(cal,dtstart, - icaltime_null_time()); - - next_time = icalspanlist_next_free_time( - spanl,icalcomponent_get_dtstart(c)); - - newc = icalcomponent_new_clone(c); - - icalcomponent_set_dtstart(newc,next_time.start); - - - /* Hack, the duration of the counterproposed - meeting may be longer than the free time - available */ - icalcomponent_set_duration(newc, - icalcomponent_get_duration(c)); - - reply = icalmessage_new_counterpropose_reply(c, - newc, - this_user, - "Unfortunately, I have another commitment that \ -conflicts with this meeting. I am proposing a time that works better for me."); - - icalset_add_component(out,reply); - - } else { - /* Decline the meeting */ - - reply = icalmessage_new_decline_reply(c, - this_user, - "I can't make it to this meeting"); - - icalset_add_component(out,reply); - - } - - - } - break; - } - case ICAL_PUBLISH_FREEBUSY_CLASS: { - /* Store the busy time information in a file named after - the sender */ - break; - } - - case ICAL_PUBLISH_UPDATE_CLASS: { - /* Only accept publish updates from self. If self, fall - throught to ICAL_REQUEST_UPDATE_CLASS */ - } - - case ICAL_REQUEST_UPDATE_CLASS: { - /* always accept the changes */ - break; - } - - case ICAL_REQUEST_RESCHEDULE_CLASS: { - /* Use same rules as REQUEST_NEW */ - icalcomponent *overlaps; - overlaps = icalclassify_find_overlaps(cal,c); - - break; - } - case ICAL_REQUEST_DELEGATE_CLASS: { - - break; - } - case ICAL_REQUEST_NEW_ORGANIZER_CLASS: { - break; - } - case ICAL_REQUEST_FORWARD_CLASS: { - break; - } - case ICAL_REQUEST_STATUS_CLASS: { - break; - } - - case ICAL_REQUEST_FREEBUSY_CLASS: { - break; - } - case ICAL_REPLY_ACCEPT_CLASS: { - /* Change the PARTSTAT of the sender */ - break; - } - case ICAL_REPLY_DECLINE_CLASS: { - /* Change the PARTSTAT of the sender */ - break; - } - case ICAL_REPLY_CRASHER_ACCEPT_CLASS: { - /* Add the crasher to the ATTENDEE list with the - appropriate PARTSTAT */ - break; - } - case ICAL_REPLY_CRASHER_DECLINE_CLASS: { - /* Add the crasher to the ATTENDEE list with the - appropriate PARTSTAT */ - break; - } - case ICAL_ADD_INSTANCE_CLASS: { - break; - } - case ICAL_CANCEL_EVENT_CLASS: { - /* Remove the component */ - break; - } - case ICAL_CANCEL_INSTANCE_CLASS: { - break; - } - case ICAL_CANCEL_ALL_CLASS: { - /* Remove the component */ - break; - } - case ICAL_REFRESH_CLASS: { - /* Resend the latest copy of the request */ - break; - } - case ICAL_COUNTER_CLASS: { - break; - } - case ICAL_DECLINECOUNTER_CLASS: { - break; - } - case ICAL_MALFORMED_CLASS: { - /* Send back an error */ - break; - } - case ICAL_OBSOLETE_CLASS: { - printf(" ** Got an obsolete component:\n%s", - icalcomponent_as_ical_string(c)); - /* Send back an error */ - break; - } - case ICAL_MISSEQUENCED_CLASS: { - printf(" ** Got a missequenced component:\n%s", - icalcomponent_as_ical_string(c)); - /* Send back an error */ - break; - } - case ICAL_UNKNOWN_CLASS: { - printf(" ** Don't know what to do with this component:\n%s", - icalcomponent_as_ical_string(c)); - /* Send back an error */ - break; - } - } - -#if(0) - if (reply != 0){ - - /* Don't send the reply if the RSVP parameter indicates not to*/ - icalcomponent *reply_inner; - icalproperty *attendee; - icalparameter *rsvp; - - reply_inner = icalcomponent_get_first_real_component(reply); - attendee = icalcomponent_get_first_property(reply_inner, - ICAL_ATTENDEE_PROPERTY); - rsvp = icalproperty_get_first_parameter(attendee, - ICAL_RSVP_PARAMETER); - - if(rsvp == 0 || icalparameter_get_rsvp(rsvp) == 1){ - icalrestriction_check(reply); - send_message(reply,this_user); - } - - icalcomponent_free(reply); - } -#endif - - if(reply !=0){ - printf("%s\n",icalcomponent_as_ical_string(reply)); - } - - next_c = icalset_get_next_component(f); - - if(dont_remove == 0){ - /*icalset_remove_component(f,c); - icalset_add_component(trash,c);*/ - } - } - -#if (0) - - for(c = icalset_get_first_component(out); - c!=0; - c = icalset_get_next_component(out)){ - - printf("%s",icalcomponent_as_ical_string(c)); - - } -#endif - - icalset_free(f); - icalset_free(trash); - icalset_free(cal); - icalset_free(out); - - return 0; -} - - diff --git a/libical/src/test/recur.c b/libical/src/test/recur.c deleted file mode 100644 index f4d9a38647..0000000000 --- a/libical/src/test/recur.c +++ /dev/null @@ -1,120 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: recur.c - CREATOR: ebusboom 8jun00 - - DESCRIPTION: - - Test program for expanding recurrences. Run as: - - ./recur ../../test-data/recur.txt - - - (C) COPYRIGHT 1999 Eric Busboom - http://www.softwarestudio.org - - The contents of this file are subject to the Mozilla Public License - Version 1.0 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and - limitations under the License. - - ======================================================================*/ - -#include "ical.h" -#include <assert.h> -#include <string.h> /* for strdup */ -#include <stdlib.h> /* for malloc */ -#include <stdio.h> /* for printf */ -#include <time.h> /* for time() */ -#include <signal.h> /* for signal */ -#include <unistd.h> /* for alarm */ -#include "icalmemory.h" -#include "icaldirset.h" -#include "icalfileset.h" - -static void sig_alrm(int i){ - fprintf(stderr,"Could not get lock on file\n"); - exit(1); -} - -int main(int argc, char *argv[]) -{ - icalfileset *cin; - struct icaltimetype start, next; - icalcomponent *itr; - icalproperty *desc, *dtstart, *rrule; - struct icalrecurrencetype recur; - icalrecur_iterator* ritr; - time_t tt; - char* file; - - icalerror_set_error_state(ICAL_PARSE_ERROR, ICAL_ERROR_NONFATAL); - - signal(SIGALRM,sig_alrm); - - - if (argc <= 1){ - file = "../../test-data/recur.txt"; - } else if (argc == 2){ - file = argv[1]; - } else { - fprintf(stderr,"usage: recur [input file]\n"); - exit(1); - } - - alarm(300); /* to get file lock */ - cin = icalfileset_new(file); - alarm(0); - - if(cin == 0){ - fprintf(stderr,"recur: can't open file %s\n",file); - exit(1); - } - - - for (itr = icalfileset_get_first_component(cin); - itr != 0; - itr = icalfileset_get_next_component(cin)){ - - desc = icalcomponent_get_first_property(itr,ICAL_DESCRIPTION_PROPERTY); - dtstart = icalcomponent_get_first_property(itr,ICAL_DTSTART_PROPERTY); - rrule = icalcomponent_get_first_property(itr,ICAL_RRULE_PROPERTY); - - if (desc == 0 || dtstart == 0 || rrule == 0){ - printf("\n******** Error in input component ********\n"); - printf("The following component is malformed:\n %s\n", - icalcomponent_as_ical_string(itr)); - continue; - } - - printf("\n\n#### %s\n",icalproperty_get_description(desc)); - printf("#### %s\n",icalvalue_as_ical_string(icalproperty_get_value(rrule))); - recur = icalproperty_get_rrule(rrule); - start = icalproperty_get_dtstart(dtstart); - - ritr = icalrecur_iterator_new(recur,start); - - tt = icaltime_as_timet(start); - - printf("#### %s\n",ctime(&tt )); - - for(ritr = icalrecur_iterator_new(recur,start), - next = icalrecur_iterator_next(ritr); - !icaltime_is_null_time(next); - next = icalrecur_iterator_next(ritr)){ - - tt = icaltime_as_timet(next); - - printf(" %s",ctime(&tt )); - - } - - } - - return 0; -} diff --git a/libical/src/test/regression.c b/libical/src/test/regression.c deleted file mode 100644 index 3512905cfe..0000000000 --- a/libical/src/test/regression.c +++ /dev/null @@ -1,3605 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: regression.c - CREATOR: eric 03 April 1999 - - DESCRIPTION: - - $Id$ - $Locker$ - - (C) COPYRIGHT 1999 Eric Busboom - http://www.softwarestudio.org - - The contents of this file are subject to the Mozilla Public License - Version 1.0 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and - limitations under the License. - - The original author is Eric Busboom - The original code is regression.c - - - ======================================================================*/ - -#include "ical.h" -#include "icalss.h" - -#include <assert.h> -#include <string.h> /* for strdup */ -#include <stdlib.h> /* for malloc */ -#include <stdio.h> /* for printf */ -#include <time.h> /* for time() */ -#include <unistd.h> /* for unlink, fork */ -#include <sys/wait.h> /* For waitpid */ -#include <sys/types.h> /* For wait pid */ -#include <sys/time.h> /* for select */ - - -/* For GNU libc, strcmp appears to be a macro, so using strcmp in - assert results in incomprehansible assertion messages. This - eliminates the problem */ - -int regrstrcmp(const char* a, const char* b){ - return strcmp(a,b); -} - -/* This example creates and minipulates the ical object that appears - * in rfc 2445, page 137 */ - -char str[] = "BEGIN:VCALENDAR\ -PRODID:\"-//RDU Software//NONSGML HandCal//EN\"\ -VERSION:2.0\ -BEGIN:VTIMEZONE\ -TZID:US-Eastern\ -BEGIN:STANDARD\ -DTSTART:19981025T020000\ -RDATE:19981025T020000\ -TZOFFSETFROM:-0400\ -TZOFFSETTO:-0500\ -TZNAME:EST\ -END:STANDARD\ -BEGIN:DAYLIGHT\ -DTSTART:19990404T020000\ -RDATE:19990404T020000\ -TZOFFSETFROM:-0500\ -TZOFFSETTO:-0400\ -TZNAME:EDT\ -END:DAYLIGHT\ -END:VTIMEZONE\ -BEGIN:VEVENT\ -DTSTAMP:19980309T231000Z\ -UID:guid-1.host1.com\ -ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com\ -ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:employee-A@host.com\ -DESCRIPTION:Project XYZ Review Meeting\ -CATEGORIES:MEETING\ -CLASS:PUBLIC\ -CREATED:19980309T130000Z\ -SUMMARY:XYZ Project Review\ -DTSTART;TZID=US-Eastern:19980312T083000\ -DTEND;TZID=US-Eastern:19980312T093000\ -LOCATION:1CP Conference Room 4350\ -END:VEVENT\ -BEGIN:BOOGA\ -DTSTAMP:19980309T231000Z\ -X-LIC-FOO:Booga\ -DTSTOMP:19980309T231000Z\ -UID:guid-1.host1.com\ -END:BOOGA\ -END:VCALENDAR"; - - -icalcomponent* create_simple_component() -{ - - icalcomponent* calendar; - struct icalperiodtype rtime; - - rtime.start = icaltime_from_timet( time(0),0); - rtime.end = icaltime_from_timet( time(0),0); - - rtime.end.hour++; - - - - /* Create calendar and add properties */ - calendar = icalcomponent_new(ICAL_VCALENDAR_COMPONENT); - - - icalcomponent_add_property( - calendar, - icalproperty_new_version("2.0") - ); - - printf("%s\n",icalcomponent_as_ical_string(calendar)); - - return calendar; - -} - -/* Create a new component */ -icalcomponent* create_new_component() -{ - - icalcomponent* calendar; - icalcomponent* timezone; - icalcomponent* tzc; - icalcomponent* event; - struct icaltimetype atime = icaltime_from_timet( time(0),0); - struct icaldatetimeperiodtype rtime; - icalproperty* property; - - rtime.period.start = icaltime_from_timet( time(0),0); - rtime.period.end = icaltime_from_timet( time(0),0); - rtime.period.end.hour++; - rtime.time = icaltime_null_time(); - - - - /* Create calendar and add properties */ - calendar = icalcomponent_new(ICAL_VCALENDAR_COMPONENT); - - - icalcomponent_add_property( - calendar, - icalproperty_new_version("2.0") - ); - - icalcomponent_add_property( - calendar, - icalproperty_new_prodid("-//RDU Software//NONSGML HandCal//EN") - ); - - /* Create a timezone object and add it to the calendar */ - - timezone = icalcomponent_new(ICAL_VTIMEZONE_COMPONENT); - - icalcomponent_add_property( - timezone, - icalproperty_new_tzid("US_Eastern") - ); - - /* Add a sub-component of the timezone */ - tzc = icalcomponent_new(ICAL_XDAYLIGHT_COMPONENT); - - icalcomponent_add_property( - tzc, - icalproperty_new_dtstart(atime) - ); - - icalcomponent_add_property( - tzc, - icalproperty_new_rdate(rtime) - ); - - icalcomponent_add_property( - tzc, - icalproperty_new_tzoffsetfrom(-4.0) - ); - - icalcomponent_add_property( - tzc, - icalproperty_new_tzoffsetto(-5.0) - ); - - icalcomponent_add_property( - tzc, - icalproperty_new_tzname("EST") - ); - - icalcomponent_add_component(timezone,tzc); - - icalcomponent_add_component(calendar,timezone); - - /* Add a second subcomponent */ - tzc = icalcomponent_new(ICAL_XSTANDARD_COMPONENT); - - icalcomponent_add_property( - tzc, - icalproperty_new_dtstart(atime) - ); - - icalcomponent_add_property( - tzc, - icalproperty_new_rdate(rtime) - ); - - icalcomponent_add_property( - tzc, - icalproperty_new_tzoffsetfrom(-4.0) - ); - - icalcomponent_add_property( - tzc, - icalproperty_new_tzoffsetto(-5.0) - ); - - icalcomponent_add_property( - tzc, - icalproperty_new_tzname("EST") - ); - - icalcomponent_add_component(timezone,tzc); - - /* Add an event */ - - event = icalcomponent_new(ICAL_VEVENT_COMPONENT); - - icalcomponent_add_property( - event, - icalproperty_new_dtstamp(atime) - ); - - icalcomponent_add_property( - event, - icalproperty_new_uid("guid-1.host1.com") - ); - - /* add a property that has parameters */ - property = icalproperty_new_organizer("mrbig@host.com"); - - icalproperty_add_parameter( - property, - icalparameter_new_role(ICAL_ROLE_CHAIR) - ); - - icalcomponent_add_property(event,property); - - /* add another property that has parameters */ - property = icalproperty_new_attendee("employee-A@host.com"); - - icalproperty_add_parameter( - property, - icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT) - ); - - icalproperty_add_parameter( - property, - icalparameter_new_rsvp(ICAL_RSVP_TRUE) - ); - - icalproperty_add_parameter( - property, - icalparameter_new_cutype(ICAL_CUTYPE_GROUP) - ); - - icalcomponent_add_property(event,property); - - - /* more properties */ - - icalcomponent_add_property( - event, - icalproperty_new_description("Project XYZ Review Meeting") - ); - - icalcomponent_add_property( - event, - icalproperty_new_categories("MEETING") - ); - - icalcomponent_add_property( - event, - icalproperty_new_class("PUBLIC") - ); - - icalcomponent_add_property( - event, - icalproperty_new_created(atime) - ); - - icalcomponent_add_property( - event, - icalproperty_new_summary("XYZ Project Review") - ); - - - property = icalproperty_new_dtstart(atime); - - icalproperty_add_parameter( - property, - icalparameter_new_tzid("US-Eastern") - ); - - icalcomponent_add_property(event,property); - - - property = icalproperty_new_dtend(atime); - - icalproperty_add_parameter( - property, - icalparameter_new_tzid("US-Eastern") - ); - - icalcomponent_add_property(event,property); - - icalcomponent_add_property( - event, - icalproperty_new_location("1CP Conference Room 4350") - ); - - icalcomponent_add_component(calendar,event); - - printf("%s\n",icalcomponent_as_ical_string(calendar)); - - icalcomponent_free(calendar); - - return 0; -} - - -/* Create a new component, using the va_args list */ - -icalcomponent* create_new_component_with_va_args() -{ - - icalcomponent* calendar; - struct icaltimetype atime = icaltime_from_timet( time(0),0); - struct icaldatetimeperiodtype rtime; - - rtime.period.start = icaltime_from_timet( time(0),0); - rtime.period.end = icaltime_from_timet( time(0),0); - rtime.period.end.hour++; - rtime.time = icaltime_null_time(); - - calendar = - icalcomponent_vanew( - ICAL_VCALENDAR_COMPONENT, - icalproperty_new_version("2.0"), - icalproperty_new_prodid("-//RDU Software//NONSGML HandCal//EN"), - icalcomponent_vanew( - ICAL_VTIMEZONE_COMPONENT, - icalproperty_new_tzid("US_Eastern"), - icalcomponent_vanew( - ICAL_XDAYLIGHT_COMPONENT, - icalproperty_new_dtstart(atime), - icalproperty_new_rdate(rtime), - icalproperty_new_tzoffsetfrom(-4.0), - icalproperty_new_tzoffsetto(-5.0), - icalproperty_new_tzname("EST"), - 0 - ), - icalcomponent_vanew( - ICAL_XSTANDARD_COMPONENT, - icalproperty_new_dtstart(atime), - icalproperty_new_rdate(rtime), - icalproperty_new_tzoffsetfrom(-5.0), - icalproperty_new_tzoffsetto(-4.0), - icalproperty_new_tzname("EST"), - 0 - ), - 0 - ), - icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_new_dtstamp(atime), - icalproperty_new_uid("guid-1.host1.com"), - icalproperty_vanew_organizer( - "mrbig@host.com", - icalparameter_new_role(ICAL_ROLE_CHAIR), - 0 - ), - icalproperty_vanew_attendee( - "employee-A@host.com", - icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT), - icalparameter_new_rsvp(ICAL_RSVP_TRUE), - icalparameter_new_cutype(ICAL_CUTYPE_GROUP), - 0 - ), - icalproperty_new_description("Project XYZ Review Meeting"), - icalproperty_new_categories("MEETING"), - icalproperty_new_class("PUBLIC"), - icalproperty_new_created(atime), - icalproperty_new_summary("XYZ Project Review"), - icalproperty_vanew_dtstart( - atime, - icalparameter_new_tzid("US-Eastern"), - 0 - ), - icalproperty_vanew_dtend( - atime, - icalparameter_new_tzid("US-Eastern"), - 0 - ), - icalproperty_new_location("1CP Conference Room 4350"), - 0 - ), - 0 - ); - - printf("%s\n",icalcomponent_as_ical_string(calendar)); - - - icalcomponent_free(calendar); - - return 0; -} - - -/* Return a list of all attendees who are required. */ - -char** get_required_attendees(icalproperty* event) -{ - icalproperty* p; - icalparameter* parameter; - - char **attendees; - int max = 10; - int c = 0; - - attendees = malloc(max * (sizeof (char *))); - - assert(event != 0); - assert(icalcomponent_isa(event) == ICAL_VEVENT_COMPONENT); - - for( - p = icalcomponent_get_first_property(event,ICAL_ATTENDEE_PROPERTY); - p != 0; - p = icalcomponent_get_next_property(event,ICAL_ATTENDEE_PROPERTY) - ) { - - parameter = icalproperty_get_first_parameter(p,ICAL_ROLE_PARAMETER); - - if ( icalparameter_get_role(parameter) == ICAL_ROLE_REQPARTICIPANT) - { - attendees[c++] = icalmemory_strdup(icalproperty_get_attendee(p)); - - if (c >= max) { - max *= 2; - attendees = realloc(attendees, max * (sizeof (char *))); - } - - } - } - - return attendees; -} - -/* If an attendee has a PARTSTAT of NEEDSACTION or has no PARTSTAT - parameter, change it to TENTATIVE. */ - -void update_attendees(icalproperty* event) -{ - icalproperty* p; - icalparameter* parameter; - - - assert(event != 0); - assert(icalcomponent_isa(event) == ICAL_VEVENT_COMPONENT); - - for( - p = icalcomponent_get_first_property(event,ICAL_ATTENDEE_PROPERTY); - p != 0; - p = icalcomponent_get_next_property(event,ICAL_ATTENDEE_PROPERTY) - ) { - - parameter = icalproperty_get_first_parameter(p,ICAL_PARTSTAT_PARAMETER); - - if (parameter == 0) { - - icalproperty_add_parameter( - p, - icalparameter_new_partstat(ICAL_PARTSTAT_TENTATIVE) - ); - - } else if (icalparameter_get_partstat(parameter) == ICAL_PARTSTAT_NEEDSACTION) { - - icalproperty_remove_parameter(p,ICAL_PARTSTAT_PARAMETER); - - icalparameter_free(parameter); - - icalproperty_add_parameter( - p, - icalparameter_new_partstat(ICAL_PARTSTAT_TENTATIVE) - ); - } - - } -} - - -void test_values() -{ - icalvalue *v; - icalvalue *copy; - - v = icalvalue_new_caladdress("cap://value/1"); - printf("caladdress 1: %s\n",icalvalue_get_caladdress(v)); - icalvalue_set_caladdress(v,"cap://value/2"); - printf("caladdress 2: %s\n",icalvalue_get_caladdress(v)); - printf("String: %s\n",icalvalue_as_ical_string(v)); - - copy = icalvalue_new_clone(v); - printf("Clone: %s\n",icalvalue_as_ical_string(v)); - icalvalue_free(v); - icalvalue_free(copy); - - - v = icalvalue_new_boolean(1); - printf("caladdress 1: %d\n",icalvalue_get_boolean(v)); - icalvalue_set_boolean(v,2); - printf("caladdress 2: %d\n",icalvalue_get_boolean(v)); - printf("String: %s\n",icalvalue_as_ical_string(v)); - - copy = icalvalue_new_clone(v); - printf("Clone: %s\n",icalvalue_as_ical_string(v)); - icalvalue_free(v); - icalvalue_free(copy); - - - v = icalvalue_new_date(icaltime_from_timet( time(0),0)); - printf("date 1: %s\n",icalvalue_as_ical_string(v)); - icalvalue_set_date(v,icaltime_from_timet( time(0)+3600,0)); - printf("date 2: %s\n",icalvalue_as_ical_string(v)); - - copy = icalvalue_new_clone(v); - printf("Clone: %s\n",icalvalue_as_ical_string(v)); - icalvalue_free(v); - icalvalue_free(copy); - - - v = icalvalue_new(-1); - - printf("Invalid type: %p\n",v); - - if (v!=0) icalvalue_free(v); - - assert(ICAL_BOOLEAN_VALUE == - icalparameter_value_to_value_kind(ICAL_VALUE_BOOLEAN)); - assert(ICAL_UTCOFFSET_VALUE == - icalparameter_value_to_value_kind(ICAL_VALUE_UTCOFFSET)); - assert(ICAL_RECUR_VALUE == - icalparameter_value_to_value_kind(ICAL_VALUE_RECUR)); - assert(ICAL_CALADDRESS_VALUE == - icalparameter_value_to_value_kind(ICAL_VALUE_CALADDRESS)); - assert(ICAL_PERIOD_VALUE == - icalparameter_value_to_value_kind(ICAL_VALUE_PERIOD)); - assert(ICAL_BINARY_VALUE == - icalparameter_value_to_value_kind(ICAL_VALUE_BINARY)); - assert(ICAL_TEXT_VALUE == - icalparameter_value_to_value_kind(ICAL_VALUE_TEXT)); - assert(ICAL_DURATION_VALUE == - icalparameter_value_to_value_kind(ICAL_VALUE_DURATION)); - assert(ICAL_INTEGER_VALUE == icalparameter_value_to_value_kind(ICAL_VALUE_INTEGER)); - assert(ICAL_TIME_VALUE == - icalparameter_value_to_value_kind(ICAL_VALUE_TIME)); - assert(ICAL_URI_VALUE == - icalparameter_value_to_value_kind(ICAL_VALUE_URI)); - assert(ICAL_FLOAT_VALUE == - icalparameter_value_to_value_kind(ICAL_VALUE_FLOAT)); - assert(ICAL_X_VALUE == - icalparameter_value_to_value_kind(ICAL_VALUE_X)); - assert(ICAL_DATETIME_VALUE == - icalparameter_value_to_value_kind(ICAL_VALUE_DATETIME)); - assert(ICAL_DATE_VALUE == - icalparameter_value_to_value_kind(ICAL_VALUE_DATE)); - - /* v = icalvalue_new_caladdress(0); - - printf("Bad string: %p\n",v); - - if (v!=0) icalvalue_free(v); */ - -} - -void test_properties() -{ - icalproperty *prop; - icalparameter *param; - - icalproperty *clone; - - prop = icalproperty_vanew_comment( - "Another Comment", - icalparameter_new_cn("A Common Name 1"), - icalparameter_new_cn("A Common Name 2"), - icalparameter_new_cn("A Common Name 3"), - icalparameter_new_cn("A Common Name 4"), - 0); - - for(param = icalproperty_get_first_parameter(prop,ICAL_ANY_PARAMETER); - param != 0; - param = icalproperty_get_next_parameter(prop,ICAL_ANY_PARAMETER)) { - - printf("Prop parameter: %s\n",icalparameter_get_cn(param)); - } - - printf("Prop value: %s\n",icalproperty_get_comment(prop)); - - - printf("As iCAL string:\n %s\n",icalproperty_as_ical_string(prop)); - - clone = icalproperty_new_clone(prop); - - printf("Clone:\n %s\n",icalproperty_as_ical_string(prop)); - - icalproperty_free(clone); - icalproperty_free(prop); - - prop = icalproperty_new(-1); - - printf("Invalid type: %p\n",prop); - - if (prop!=0) icalproperty_free(prop); - - /* - prop = icalproperty_new_method(0); - - printf("Bad string: %p\n",prop); - - - if (prop!=0) icalproperty_free(prop); - */ -} - -void test_parameters() -{ - icalparameter *p; - int i; - int enums[] = {ICAL_CUTYPE_INDIVIDUAL,ICAL_CUTYPE_RESOURCE,ICAL_FBTYPE_BUSY,ICAL_PARTSTAT_NEEDSACTION,ICAL_ROLE_NONPARTICIPANT,ICAL_XLICCOMPARETYPE_LESSEQUAL,ICAL_XLICERRORTYPE_MIMEPARSEERROR,-1}; - - char* str1 = "A Common Name"; - - p = icalparameter_new_cn(str1); - - printf("Common Name: %s\n",icalparameter_get_cn(p)); - - assert(regrstrcmp(str1,icalparameter_get_cn(p)) == 0); - - printf("As String: %s\n",icalparameter_as_ical_string(p)); - - assert(regrstrcmp(icalparameter_as_ical_string(p),"CN=A Common Name")==0); - - icalparameter_free(p); - - - p = icalparameter_new_from_string("PARTSTAT=ACCEPTED"); - assert(icalparameter_isa(p) == ICAL_PARTSTAT_PARAMETER); - assert(icalparameter_get_partstat(p) == ICAL_PARTSTAT_ACCEPTED); - - p = icalparameter_new_from_string("ROLE=CHAIR"); - assert(icalparameter_isa(p) == ICAL_ROLE_PARAMETER); - assert(icalparameter_get_partstat(p) == ICAL_ROLE_CHAIR); - - p = icalparameter_new_from_string("PARTSTAT=X-FOO"); - assert(icalparameter_isa(p) == ICAL_PARTSTAT_PARAMETER); - assert(icalparameter_get_partstat(p) == ICAL_PARTSTAT_X); - - p = icalparameter_new_from_string("X-PARAM=X-FOO"); - assert(icalparameter_isa(p) == ICAL_X_PARAMETER); - - - for (i=0;enums[i] != -1; i++){ - - printf("%s\n",icalparameter_enum_to_string(enums[i])); - assert(icalparameter_string_to_enum( - icalparameter_enum_to_string(enums[i]))==enums[i]); - } - - -} - - -void test_components() -{ - - icalcomponent* c; - icalcomponent* child; - - c = icalcomponent_vanew( - ICAL_VCALENDAR_COMPONENT, - icalproperty_new_version("2.0"), - icalproperty_new_prodid("-//RDU Software//NONSGML HandCal//EN"), - icalproperty_vanew_comment( - "A Comment", - icalparameter_new_cn("A Common Name 1"), - 0), - icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_new_version("2.0"), - icalproperty_new_description("This is an event"), - icalproperty_vanew_comment( - "Another Comment", - icalparameter_new_cn("A Common Name 1"), - icalparameter_new_cn("A Common Name 2"), - icalparameter_new_cn("A Common Name 3"), - icalparameter_new_cn("A Common Name 4"), - 0), - icalproperty_vanew_xlicerror( - "This is only a test", - icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_COMPONENTPARSEERROR), - 0), - - 0 - ), - 0 - ); - - printf("Original Component:\n%s\n\n",icalcomponent_as_ical_string(c)); - - child = icalcomponent_get_first_component(c,ICAL_VEVENT_COMPONENT); - - printf("Child Component:\n%s\n\n",icalcomponent_as_ical_string(child)); - - icalcomponent_free(c); - -} - -void test_memory() -{ - size_t bufsize = 256; - int i; - char *p; - - char S1[] = "1) When in the Course of human events, "; - char S2[] = "2) it becomes necessary for one people to dissolve the political bands which have connected them with another, "; - char S3[] = "3) and to assume among the powers of the earth, "; - char S4[] = "4) the separate and equal station to which the Laws of Nature and of Nature's God entitle them, "; - char S5[] = "5) a decent respect to the opinions of mankind requires that they "; - char S6[] = "6) should declare the causes which impel them to the separation. "; - char S7[] = "7) We hold these truths to be self-evident, "; - char S8[] = "8) that all men are created equal, "; - -/* char S9[] = "9) that they are endowed by their Creator with certain unalienable Rights, "; - char S10[] = "10) that among these are Life, Liberty, and the pursuit of Happiness. "; - char S11[] = "11) That to secure these rights, Governments are instituted among Men, "; - char S12[] = "12) deriving their just powers from the consent of the governed. "; -*/ - - - char *f, *b1, *b2, *b3, *b4, *b5, *b6, *b7, *b8; - -#define BUFSIZE 1024 - - f = icalmemory_new_buffer(bufsize); - p = f; - b1 = icalmemory_tmp_buffer(BUFSIZE); - strcpy(b1, S1); - icalmemory_append_string(&f, &p, &bufsize, b1); - - b2 = icalmemory_tmp_buffer(BUFSIZE); - strcpy(b2, S2); - icalmemory_append_string(&f, &p, &bufsize, b2); - - b3 = icalmemory_tmp_buffer(BUFSIZE); - strcpy(b3, S3); - icalmemory_append_string(&f, &p, &bufsize, b3); - - b4 = icalmemory_tmp_buffer(BUFSIZE); - strcpy(b4, S4); - icalmemory_append_string(&f, &p, &bufsize, b4); - - b5 = icalmemory_tmp_buffer(BUFSIZE); - strcpy(b5, S5); - icalmemory_append_string(&f, &p, &bufsize, b5); - - b6 = icalmemory_tmp_buffer(BUFSIZE); - strcpy(b6, S6); - icalmemory_append_string(&f, &p, &bufsize, b6); - - b7 = icalmemory_tmp_buffer(BUFSIZE); - strcpy(b7, S7); - icalmemory_append_string(&f, &p, &bufsize, b7); - - b8 = icalmemory_tmp_buffer(BUFSIZE); - strcpy(b8, S8); - icalmemory_append_string(&f, &p, &bufsize, b8); - - - printf("1: %p %s \n",b1,b1); - printf("2: %p %s\n",b2,b2); - printf("3: %p %s\n",b3,b3); - printf("4: %p %s\n",b4,b4); - printf("5: %p %s\n",b5,b5); - printf("6: %p %s\n",b6,b6); - printf("7: %p %s\n",b7,b7); - printf("8: %p %s\n",b8,b8); - - - printf("Final: %s\n", f); - - printf("Final buffer size: %d\n",bufsize); - - free(f); - - bufsize = 4; - - f = icalmemory_new_buffer(bufsize); - - memset(f,0,bufsize); - p = f; - - icalmemory_append_char(&f, &p, &bufsize, 'a'); - printf("Char-by-Char buffer: %s\n", f); - icalmemory_append_char(&f, &p, &bufsize, 'b'); - printf("Char-by-Char buffer: %s\n", f); - icalmemory_append_char(&f, &p, &bufsize, 'c'); - printf("Char-by-Char buffer: %s\n", f); - icalmemory_append_char(&f, &p, &bufsize, 'd'); - printf("Char-by-Char buffer: %s\n", f); - icalmemory_append_char(&f, &p, &bufsize, 'e'); - printf("Char-by-Char buffer: %s\n", f); - icalmemory_append_char(&f, &p, &bufsize, 'f'); - printf("Char-by-Char buffer: %s\n", f); - icalmemory_append_char(&f, &p, &bufsize, 'g'); - printf("Char-by-Char buffer: %s\n", f); - icalmemory_append_char(&f, &p, &bufsize, 'h'); - printf("Char-by-Char buffer: %s\n", f); - icalmemory_append_char(&f, &p, &bufsize, 'i'); - printf("Char-by-Char buffer: %s\n", f); - icalmemory_append_char(&f, &p, &bufsize, 'j'); - printf("Char-by-Char buffer: %s\n", f); - icalmemory_append_char(&f, &p, &bufsize, 'a'); - printf("Char-by-Char buffer: %s\n", f); - icalmemory_append_char(&f, &p, &bufsize, 'b'); - printf("Char-by-Char buffer: %s\n", f); - icalmemory_append_char(&f, &p, &bufsize, 'c'); - printf("Char-by-Char buffer: %s\n", f); - icalmemory_append_char(&f, &p, &bufsize, 'd'); - printf("Char-by-Char buffer: %s\n", f); - icalmemory_append_char(&f, &p, &bufsize, 'e'); - printf("Char-by-Char buffer: %s\n", f); - icalmemory_append_char(&f, &p, &bufsize, 'f'); - printf("Char-by-Char buffer: %s\n", f); - icalmemory_append_char(&f, &p, &bufsize, 'g'); - printf("Char-by-Char buffer: %s\n", f); - icalmemory_append_char(&f, &p, &bufsize, 'h'); - printf("Char-by-Char buffer: %s\n", f); - icalmemory_append_char(&f, &p, &bufsize, 'i'); - printf("Char-by-Char buffer: %s\n", f); - icalmemory_append_char(&f, &p, &bufsize, 'j'); - printf("Char-by-Char buffer: %s\n", f); - - for(i=0; i<100; i++){ - f = icalmemory_tmp_buffer(bufsize); - - assert(f!=0); - - memset(f,0,bufsize); - sprintf(f,"%d",i); - } -} - - -int test_store() -{ - - icalcomponent *c, *gauge; - icalerrorenum error; - icalcomponent *next, *itr; - icalfileset* cluster; - struct icalperiodtype rtime; - icaldirset *s = icaldirset_new("store"); - int i; - - rtime.start = icaltime_from_timet( time(0),0); - - cluster = icalfileset_new("clusterin.vcd"); - - if (cluster == 0){ - printf("Failed to create cluster: %s\n",icalerror_strerror(icalerrno)); - return 0; - } - -#define NUMCOMP 4 - - /* Duplicate every component in the cluster NUMCOMP times */ - - icalerror_clear_errno(); - - for (i = 1; i<NUMCOMP+1; i++){ - - /*rtime.start.month = i%12;*/ - rtime.start.month = i; - rtime.end = rtime.start; - rtime.end.hour++; - - for (itr = icalfileset_get_first_component(cluster); - itr != 0; - itr = icalfileset_get_next_component(cluster)){ - icalcomponent *clone; - icalproperty *p; - - - if(icalcomponent_isa(itr) != ICAL_VEVENT_COMPONENT){ - continue; - } - - assert(itr != 0); - - /* Change the dtstart and dtend times in the component - pointed to by Itr*/ - - clone = icalcomponent_new_clone(itr); - assert(icalerrno == ICAL_NO_ERROR); - assert(clone !=0); - - /* DTSTART*/ - p = icalcomponent_get_first_property(clone,ICAL_DTSTART_PROPERTY); - assert(icalerrno == ICAL_NO_ERROR); - - if (p == 0){ - p = icalproperty_new_dtstart(rtime.start); - icalcomponent_add_property(clone,p); - } else { - icalproperty_set_dtstart(p,rtime.start); - } - assert(icalerrno == ICAL_NO_ERROR); - - /* DTEND*/ - p = icalcomponent_get_first_property(clone,ICAL_DTEND_PROPERTY); - assert(icalerrno == ICAL_NO_ERROR); - - if (p == 0){ - p = icalproperty_new_dtstart(rtime.end); - icalcomponent_add_property(clone,p); - } else { - icalproperty_set_dtstart(p,rtime.end); - } - assert(icalerrno == ICAL_NO_ERROR); - - printf("\n----------\n%s\n---------\n",icalcomponent_as_ical_string(clone)); - - error = icaldirset_add_component(s,clone); - - assert(icalerrno == ICAL_NO_ERROR); - - } - - } - - gauge = - icalcomponent_vanew( - ICAL_VCALENDAR_COMPONENT, - icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_vanew_summary( - "Submit Income Taxes", - icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_EQUAL), - 0), - 0), - icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_vanew_summary( - "Bastille Day Party", - icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_EQUAL), - 0), - 0), - 0); - -#if 0 - - - icaldirset_select(s,gauge); - - for(c = icaldirset_first(s); c != 0; c = icaldirset_next(s)){ - - printf("Got one! (%d)\n", count++); - - if (c != 0){ - printf("%s", icalcomponent_as_ical_string(c));; - if (icaldirset_store(s2,c) == 0){ - printf("Failed to write!\n"); - } - icalcomponent_free(c); - } else { - printf("Failed to get component\n"); - } - } - - - icaldirset_free(s2); -#endif - - - for(c = icaldirset_get_first_component(s); - c != 0; - c = next){ - - next = icaldirset_get_next_component(s); - - if (c != 0){ - /*icaldirset_remove_component(s,c);*/ - printf("%s", icalcomponent_as_ical_string(c));; - } else { - printf("Failed to get component\n"); - } - - - } - - icaldirset_free(s); - return 0; -} - -int test_compare() -{ - icalvalue *v1, *v2; - - v1 = icalvalue_new_caladdress("cap://value/1"); - v2 = icalvalue_new_clone(v1); - - printf("%d\n",icalvalue_compare(v1,v2)); - - v1 = icalvalue_new_caladdress("A"); - v2 = icalvalue_new_caladdress("B"); - - printf("%d\n",icalvalue_compare(v1,v2)); - - v1 = icalvalue_new_caladdress("B"); - v2 = icalvalue_new_caladdress("A"); - - printf("%d\n",icalvalue_compare(v1,v2)); - - v1 = icalvalue_new_integer(5); - v2 = icalvalue_new_integer(5); - - printf("%d\n",icalvalue_compare(v1,v2)); - - v1 = icalvalue_new_integer(5); - v2 = icalvalue_new_integer(10); - - printf("%d\n",icalvalue_compare(v1,v2)); - - v1 = icalvalue_new_integer(10); - v2 = icalvalue_new_integer(5); - - printf("%d\n",icalvalue_compare(v1,v2)); - - return 0; -} - -void test_restriction() -{ - icalcomponent *comp; - struct icaltimetype atime = icaltime_from_timet( time(0),0); - int valid; - - struct icaldatetimeperiodtype rtime; - - rtime.period.start = icaltime_from_timet( time(0),0); - rtime.period.end = icaltime_from_timet( time(0),0); - rtime.period.end.hour++; - rtime.time = icaltime_null_time(); - - comp = - icalcomponent_vanew( - ICAL_VCALENDAR_COMPONENT, - icalproperty_new_version("2.0"), - icalproperty_new_prodid("-//RDU Software//NONSGML HandCal//EN"), - icalproperty_new_method(ICAL_METHOD_REQUEST), - icalcomponent_vanew( - ICAL_VTIMEZONE_COMPONENT, - icalproperty_new_tzid("US_Eastern"), - icalcomponent_vanew( - ICAL_XDAYLIGHT_COMPONENT, - icalproperty_new_dtstart(atime), - icalproperty_new_rdate(rtime), - icalproperty_new_tzoffsetfrom(-4.0), - icalproperty_new_tzoffsetto(-5.0), - icalproperty_new_tzname("EST"), - 0 - ), - icalcomponent_vanew( - ICAL_XSTANDARD_COMPONENT, - icalproperty_new_dtstart(atime), - icalproperty_new_rdate(rtime), - icalproperty_new_tzoffsetfrom(-5.0), - icalproperty_new_tzoffsetto(-4.0), - icalproperty_new_tzname("EST"), - 0 - ), - 0 - ), - icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_new_dtstamp(atime), - icalproperty_new_uid("guid-1.host1.com"), - icalproperty_vanew_organizer( - "mrbig@host.com", - icalparameter_new_role(ICAL_ROLE_CHAIR), - 0 - ), - icalproperty_vanew_attendee( - "employee-A@host.com", - icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT), - icalparameter_new_rsvp(ICAL_RSVP_TRUE), - icalparameter_new_cutype(ICAL_CUTYPE_GROUP), - 0 - ), - icalproperty_new_description("Project XYZ Review Meeting"), - icalproperty_new_categories("MEETING"), - icalproperty_new_class("PUBLIC"), - icalproperty_new_created(atime), - icalproperty_new_summary("XYZ Project Review"), - /* icalproperty_new_dtstart( - atime, - icalparameter_new_tzid("US-Eastern"), - 0 - ),*/ - icalproperty_vanew_dtend( - atime, - icalparameter_new_tzid("US-Eastern"), - 0 - ), - icalproperty_new_location("1CP Conference Room 4350"), - 0 - ), - 0 - ); - - valid = icalrestriction_check(comp); - - printf("#### %d ####\n%s\n",valid, icalcomponent_as_ical_string(comp)); - -} - -#if 0 -void test_calendar() -{ - icalcomponent *comp; - icalfileset *c; - icaldirset *s; - icalcalendar* calendar = icalcalendar_new("calendar"); - icalerrorenum error; - struct icaltimetype atime = icaltime_from_timet( time(0),0); - - comp = icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_new_version("2.0"), - icalproperty_new_description("This is an event"), - icalproperty_new_dtstart(atime), - icalproperty_vanew_comment( - "Another Comment", - icalparameter_new_cn("A Common Name 1"), - icalparameter_new_cn("A Common Name 2"), - icalparameter_new_cn("A Common Name 3"), - icalparameter_new_cn("A Common Name 4"), - 0), - icalproperty_vanew_xlicerror( - "This is only a test", - icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_COMPONENTPARSEERROR), - 0), - - 0); - - - s = icalcalendar_get_booked(calendar); - - error = icaldirset_add_component(s,comp); - - assert(error == ICAL_NO_ERROR); - - c = icalcalendar_get_properties(calendar); - - error = icalfileset_add_component(c,icalcomponent_new_clone(comp)); - - assert(error == ICAL_NO_ERROR); - - icalcalendar_free(calendar); - -} -#endif - -void test_increment(void); - -void print_occur(struct icalrecurrencetype recur, struct icaltimetype start) -{ - struct icaltimetype next; - icalrecur_iterator* ritr; - - time_t tt = icaltime_as_timet(start); - - printf("#### %s\n",icalrecurrencetype_as_string(&recur)); - printf("#### %s\n",ctime(&tt )); - - for(ritr = icalrecur_iterator_new(recur,start), - next = icalrecur_iterator_next(ritr); - !icaltime_is_null_time(next); - next = icalrecur_iterator_next(ritr)){ - - tt = icaltime_as_timet(next); - - printf(" %s",ctime(&tt )); - - } - - icalrecur_iterator_free(ritr); -} - -void test_recur() -{ - struct icalrecurrencetype rt; - struct icaltimetype start; - time_t array[25]; - int i; - - rt = icalrecurrencetype_from_string("FREQ=MONTHLY;UNTIL=19971224T000000Z;INTERVAL=1;BYDAY=TU,2FR,3SA"); - start = icaltime_from_string("19970905T090000Z"); - - print_occur(rt,start); - - printf("\n Using icalrecur_expand_recurrence\n"); - - icalrecur_expand_recurrence("FREQ=MONTHLY;UNTIL=19971224T000000Z;INTERVAL=1;BYDAY=TU,2FR,3SA", - icaltime_as_timet(start), - 25, - array); - - for(i =0; array[i] != 0 && i < 25 ; i++){ - - printf(" %s",ctime(&(array[i]))); - } - - -/* test_increment();*/ - -} - -void test_expand_recurrence(){ - - time_t arr[10]; - time_t now = 931057385; - int i; - icalrecur_expand_recurrence( "FREQ=MONTHLY;BYDAY=MO,WE", now, - 5, arr ); - - printf("Start %s",ctime(&now) ); - for (i=0; i<5; i++) - { - printf("i=%d %s\n", i, ctime(&arr[i]) ); - } - -} - - - -enum byrule { - NO_CONTRACTION = -1, - BY_SECOND = 0, - BY_MINUTE = 1, - BY_HOUR = 2, - BY_DAY = 3, - BY_MONTH_DAY = 4, - BY_YEAR_DAY = 5, - BY_WEEK_NO = 6, - BY_MONTH = 7, - BY_SET_POS -}; - -struct icalrecur_iterator_impl { - - struct icaltimetype dtstart; - struct icaltimetype last; /* last time return from _iterator_next*/ - int occurrence_no; /* number of step made on this iterator */ - struct icalrecurrencetype rule; - - short days[366]; - short days_index; - - enum byrule byrule; - short by_indices[9]; - - - short *by_ptrs[9]; /* Pointers into the by_* array elements of the rule */ -}; - -void icalrecurrencetype_test() -{ - icalvalue *v = icalvalue_new_from_string( - ICAL_RECUR_VALUE, - "FREQ=YEARLY;UNTIL=20060101T000000;INTERVAL=2;BYDAY=SU,WE;BYSECOND=15,30; BYMONTH=1,6,11"); - - struct icalrecurrencetype r = icalvalue_get_recur(v); - struct icaltimetype t = icaltime_from_timet( time(0), 0); - struct icaltimetype next; - time_t tt; - - struct icalrecur_iterator_impl* itr - = (struct icalrecur_iterator_impl*) icalrecur_iterator_new(r,t); - - do { - - next = icalrecur_iterator_next(itr); - tt = icaltime_as_timet(next); - - printf("%s",ctime(&tt )); - - } while( ! icaltime_is_null_time(next)); - -} - -/* From Federico Mena Quintero <federico@helixcode.com> */ -void test_recur_parameter_bug(){ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <ical.h> - - static const char test_icalcomp_str[] = -"BEGIN:VEVENT\r\n" -"RRULE\r\n" -" ;X-EVOLUTION-ENDDATE=20030209T081500\r\n" -" :FREQ=DAILY;COUNT=10;INTERVAL=6\r\n" -"END:VEVENT\r\n"; - - icalcomponent *icalcomp; - icalproperty *prop; - struct icalrecurrencetype recur; - int n_errors; - - icalcomp = icalparser_parse_string ((char *) test_icalcomp_str); - if (!icalcomp) { - fprintf (stderr, "main(): could not parse the component\n"); - exit (EXIT_FAILURE); - } - - printf("%s\n\n",icalcomponent_as_ical_string(icalcomp)); - - n_errors = icalcomponent_count_errors (icalcomp); - if (n_errors) { - icalproperty *p; - - for (p = icalcomponent_get_first_property (icalcomp, - ICAL_XLICERROR_PROPERTY); - p; - p = icalcomponent_get_next_property (icalcomp, - ICAL_XLICERROR_PROPERTY)) { - char *str; - - str = icalproperty_as_ical_string (p); - fprintf (stderr, "error: %s\n", str); - } - } - - prop = icalcomponent_get_first_property (icalcomp, ICAL_RRULE_PROPERTY); - if (!prop) { - fprintf (stderr, "main(): could not get the RRULE property"); - exit (EXIT_FAILURE); - } - - recur = icalproperty_get_rrule (prop); - - printf("%s\n",icalrecurrencetype_as_string(&recur)); - -} - - -void test_duration() -{ - - - struct icaldurationtype d; - - d = icaldurationtype_from_string("PT8H30M"); - printf("%s\n",icaldurationtype_as_ical_string(d)); - assert(icaldurationtype_as_int(d) == 30600); - - d = icaldurationtype_from_string("-PT8H30M"); - printf("%s\n",icaldurationtype_as_ical_string(d)); - assert(icaldurationtype_as_int(d) == -30600); - - d = icaldurationtype_from_string("PT10H10M10S"); - printf("%s\n",icaldurationtype_as_ical_string(d)); - assert(icaldurationtype_as_int(d) == 36610); - - d = icaldurationtype_from_string("P7W"); - printf("%s\n",icaldurationtype_as_ical_string(d)); - assert(icaldurationtype_as_int(d) == 4233600); - - d = icaldurationtype_from_string("P2DT8H30M"); - printf("%s\n",icaldurationtype_as_ical_string(d)); - assert(icaldurationtype_as_int(d) == 203400); - - icalerror_errors_are_fatal = 0; - - d = icaldurationtype_from_string("P-2DT8H30M"); - printf("%s\n",icaldurationtype_as_ical_string(d)); - assert(icaldurationtype_as_int(d) == 0); - - d = icaldurationtype_from_string("P7W8H"); - printf("%s\n",icaldurationtype_as_ical_string(d)); - assert(icaldurationtype_as_int(d) == 0); - - d = icaldurationtype_from_string("T10H"); - printf("%s\n",icaldurationtype_as_ical_string(d)); - assert(icaldurationtype_as_int(d) == 0); - - - icalerror_errors_are_fatal = 1; - -} - -void test_period() -{ - - struct icalperiodtype p; - icalvalue *v; - - p = icalperiodtype_from_string("19971015T050000Z/PT8H30M"); - printf("%s\n",icalperiodtype_as_ical_string(p)); - assert(strcmp(icalperiodtype_as_ical_string(p), - "19971015T050000Z/PT8H30M") == 0); - - p = icalperiodtype_from_string("19971015T050000Z/19971015T060000Z"); - printf("%s\n",icalperiodtype_as_ical_string(p)); - assert(strcmp(icalperiodtype_as_ical_string(p), - "19971015T050000Z/19971015T060000Z") == 0); - - p = icalperiodtype_from_string("19970101T120000/PT3H"); - printf("%s\n",icalperiodtype_as_ical_string(p)); - assert(strcmp(icalperiodtype_as_ical_string(p), - "19970101T120000/PT3H") == 0); - - v = icalvalue_new_from_string(ICAL_PERIOD_VALUE,"19970101T120000/PT3H"); - printf("%s\n",icalvalue_as_ical_string(v)); - assert(strcmp(icalvalue_as_ical_string(v), - "19970101T120000/PT3H") == 0); - - -} - -void test_strings(){ - - icalvalue *v; - - v = icalvalue_new_text("foo;bar;bats"); - - printf("%s\n",icalvalue_as_ical_string(v)); - - icalvalue_free(v); - - v = icalvalue_new_text("foo\\;b\nar\\;ba\tts"); - - printf("%s\n",icalvalue_as_ical_string(v)); - - icalvalue_free(v); - - -} - -void test_requeststat() -{ - icalrequeststatus s; - struct icalreqstattype st, st2; - char temp[1024]; - - s = icalenum_num_to_reqstat(2,1); - - assert(s == ICAL_2_1_FALLBACK_STATUS); - - assert(icalenum_reqstat_major(s) == 2); - assert(icalenum_reqstat_minor(s) == 1); - - printf("2.1: %s\n",icalenum_reqstat_desc(s)); - - st.code = s; - st.debug = "booga"; - st.desc = 0; - - printf("%s\n",icalreqstattype_as_string(st)); - - st.desc = " A non-standard description"; - - printf("%s\n",icalreqstattype_as_string(st)); - - - st.desc = 0; - - sprintf(temp,"%s\n",icalreqstattype_as_string(st)); - - - st2 = icalreqstattype_from_string("2.1;Success but fallback taken on one or more property values.;booga"); - - printf("%d -- %d -- %s -- %s\n",icalenum_reqstat_major(st2.code), - icalenum_reqstat_minor(st2.code), - icalenum_reqstat_desc(st2.code), - st2.debug); - - st2 = icalreqstattype_from_string("2.1;Success but fallback taken on one or more property values.;booga"); - printf("%s\n",icalreqstattype_as_string(st2)); - - st2 = icalreqstattype_from_string("2.1;Success but fallback taken on one or more property values.;"); - printf("%s\n",icalreqstattype_as_string(st2)); - - st2 = icalreqstattype_from_string("2.1;Success but fallback taken on one or more property values."); - printf("%s\n",icalreqstattype_as_string(st2)); - - st2 = icalreqstattype_from_string("2.1;"); - printf("%s\n",icalreqstattype_as_string(st2)); - - st2 = icalreqstattype_from_string("2.1"); - printf("%s\n",icalreqstattype_as_string(st2)); - -#ifndef ICAL_ERRORS_ARE_FATAL - st2 = icalreqstattype_from_string("16.4"); - assert(st2.code == ICAL_UNKNOWN_STATUS); - - st2 = icalreqstattype_from_string("1."); - assert(st2.code == ICAL_UNKNOWN_STATUS); -#endif -} - -char ictt_str[1024]; -char* ictt_as_string(struct icaltimetype t) -{ - - sprintf(ictt_str,"%02d-%02d-%02d %02d:%02d:%02d%s",t.year,t.month,t.day, - t.hour,t.minute,t.second,t.is_utc?" Z":""); - - return ictt_str; -} - - -char* ical_timet_string(time_t t) -{ - struct tm stm = *(gmtime(&t)); - - sprintf(ictt_str,"%02d-%02d-%02d %02d:%02d:%02d Z",stm.tm_year+1900, - stm.tm_mon+1,stm.tm_mday,stm.tm_hour,stm.tm_min,stm.tm_sec); - - return ictt_str; - -} - -void do_test_time(char* zone) -{ - struct icaltimetype ictt, icttutc, icttutczone, icttdayl, - icttla, icttny,icttphoenix, icttlocal, icttnorm; - time_t tt,tt2, tt_p200; - int offset_la, offset_tz; - icalvalue *v; - short day_of_week,start_day_of_week, day_of_year; - - icalerror_errors_are_fatal = 0; - - ictt = icaltime_from_string("20001103T183030Z"); - - tt = icaltime_as_timet(ictt); - - assert(tt==973276230); /* Fri Nov 3 10:30:30 PST 2000 in PST - Fri Nov 3 18:30:30 PST 2000 in UTC */ - - offset_la = icaltime_utc_offset(ictt,"America/Los_Angeles"); - offset_tz = icaltime_utc_offset(ictt, zone); - - printf(" Normalize \n"); - printf("Orig (ical) : %s\n", ictt_as_string(ictt)); - icttnorm = ictt; - icttnorm.second -= 60 * 60 * 24 * 5; - icttnorm = icaltime_normalize(icttnorm); - printf("-5d in sec : %s\n", ictt_as_string(icttnorm)); - icttnorm.day += 60; - icttnorm = icaltime_normalize(icttnorm); - printf("+60 d : %s\n", ictt_as_string(icttnorm)); - - - printf("\n As time_t \n"); - - tt2 = icaltime_as_timet(ictt); - printf("20001103T183030Z (timet): %s\n",ical_timet_string(tt2)); - printf("20001103T183030Z : %s\n",ictt_as_string(ictt)); - assert(tt2 == tt); - - icttlocal = icaltime_from_string("20001103T183030"); - tt2 = icaltime_as_timet(icttlocal); - printf("20001103T183030 (timet): %s\n",ical_timet_string(tt2)); - printf("20001103T183030 : %s\n",ictt_as_string(icttlocal)); - assert(tt-tt2 == offset_tz); - - printf("\n From time_t \n"); - - printf("Orig : %s\n",ical_timet_string(tt)); - printf("As utc : %s\n", ictt_as_string(ictt)); - - icttlocal = icaltime_as_zone(ictt,zone); - printf("As local : %s\n", ictt_as_string(icttlocal)); - - - printf("\n Convert to and from lib c \n"); - - printf("System time is: %s\n",ical_timet_string(tt)); - - v = icalvalue_new_datetime(ictt); - - printf("System time from libical: %s\n",icalvalue_as_ical_string(v)); - - tt2 = icaltime_as_timet(ictt); - printf("Converted back to libc: %s\n",ical_timet_string(tt2)); - - printf("\n Incrementing time \n"); - - icttnorm = ictt; - - icttnorm.year++; - tt2 = icaltime_as_timet(icttnorm); - printf("Add a year: %s\n",ical_timet_string(tt2)); - - icttnorm.month+=13; - tt2 = icaltime_as_timet(icttnorm); - printf("Add 13 months: %s\n",ical_timet_string(tt2)); - - icttnorm.second+=90; - tt2 = icaltime_as_timet(icttnorm); - printf("Add 90 seconds: %s\n",ical_timet_string(tt2)); - - printf("\n Day Of week \n"); - - day_of_week = icaltime_day_of_week(ictt); - start_day_of_week = icaltime_start_doy_of_week(ictt); - day_of_year = icaltime_day_of_year(ictt); - - - printf("Today is day of week %d, day of year %d\n",day_of_week,day_of_year); - printf("Week started n doy of %d\n",start_day_of_week); - assert(day_of_week == 6); - assert(day_of_year == 308); - assert(start_day_of_week == 303 ); - - printf("\n TimeZone Conversions \n"); - - icttla = icaltime_as_zone(ictt,"America/Los_Angeles"); - assert(icttla.hour == 10); - - icttutc = icaltime_as_utc(icttla,"America/Los_Angeles"); - assert(icaltime_compare(icttla, - icaltime_from_string("20001103T103030"))==0); - - icttutczone = icaltime_as_zone(ictt,"Etc/GMT0"); - icttutczone.is_utc = 1; - assert(icaltime_compare(icttutc, icttutczone) == 0); - assert(icaltime_compare(icttutc, ictt) == 0); - - icttny = icaltime_as_zone(ictt,"America/New_York"); - - icttphoenix = icaltime_as_zone(ictt,"America/Phoenix"); - - printf("Orig (ctime): %s\n", ical_timet_string(tt) ); - printf("Orig (ical) : %s\n", ictt_as_string(ictt)); - printf("UTC : %s\n", ictt_as_string(icttutc)); - printf("Los Angeles : %s\n", ictt_as_string(icttla)); - printf("Phoenix : %s\n", ictt_as_string(icttphoenix)); - printf("New York : %s\n", ictt_as_string(icttny)); - - - /* Daylight savings test for New York */ - printf("\n Daylight Savings \n"); - - printf("Orig (ctime): %s\n", ical_timet_string(tt) ); - printf("Orig (ical) : %s\n", ictt_as_string(ictt)); - printf("NY : %s\n", ictt_as_string(icttny)); - - assert(strcmp(ictt_as_string(icttny),"2000-11-03 13:30:30")==0); - - tt_p200 = tt + 200 * 24 * 60 * 60 ; /* Add 200 days */ - - icttdayl = icaltime_from_timet(tt_p200,0); - icttny = icaltime_as_zone(icttdayl,"America/New_York"); - - printf("Orig +200d : %s\n", ical_timet_string(tt_p200) ); - printf("NY+200D : %s\n", ictt_as_string(icttny)); - - assert(strcmp(ictt_as_string(icttny),"2001-05-22 14:30:30")==0); - - /* Daylight savings test for Los Angeles */ - - icttla = icaltime_as_zone(ictt,"America/Los_Angeles"); - - printf("\nOrig (ctime): %s\n", ical_timet_string(tt) ); - printf("Orig (ical) : %s\n", ictt_as_string(ictt)); - printf("LA : %s\n", ictt_as_string(icttla)); - - assert(strcmp(ictt_as_string(icttla),"2000-11-03 10:30:30")==0); - - icttla = icaltime_as_zone(icttdayl,"America/Los_Angeles"); - - printf("Orig +200d : %s\n", ical_timet_string(tt_p200) ); - printf("LA+200D : %s\n", ictt_as_string(icttla)); - - assert(strcmp(ictt_as_string(icttla),"2001-05-22 11:30:30")==0); - - icalerror_errors_are_fatal = 1; -} - -void test_iterators() -{ - icalcomponent *c,*inner,*next; - icalcompiter i; - - c= icalcomponent_vanew( - ICAL_VCALENDAR_COMPONENT, - icalcomponent_vanew(ICAL_VEVENT_COMPONENT, - icalproperty_vanew_version("1"),0), - icalcomponent_vanew(ICAL_VEVENT_COMPONENT, - icalproperty_vanew_version("2"),0), - icalcomponent_vanew(ICAL_VEVENT_COMPONENT, - icalproperty_vanew_version("3"),0), - icalcomponent_vanew(ICAL_VEVENT_COMPONENT, - icalproperty_vanew_version("4"),0), - icalcomponent_vanew(ICAL_VTODO_COMPONENT, - icalproperty_vanew_version("5"),0), - icalcomponent_vanew(ICAL_VJOURNAL_COMPONENT, - icalproperty_vanew_version("6"),0), - icalcomponent_vanew(ICAL_VEVENT_COMPONENT, - icalproperty_vanew_version("7"),0), - icalcomponent_vanew(ICAL_VJOURNAL_COMPONENT, - icalproperty_vanew_version("8"),0), - icalcomponent_vanew(ICAL_VJOURNAL_COMPONENT, - icalproperty_vanew_version("9"),0), - icalcomponent_vanew(ICAL_VJOURNAL_COMPONENT, - icalproperty_vanew_version("10"),0), - 0); - - printf("1: "); - - /* List all of the VEVENTS */ - for(i = icalcomponent_begin_component(c,ICAL_VEVENT_COMPONENT); - icalcompiter_deref(&i)!= 0; icalcompiter_next(&i)){ - - icalcomponent *this = icalcompiter_deref(&i); - - icalproperty *p = - icalcomponent_get_first_property(this, - ICAL_VERSION_PROPERTY); - const char* s = icalproperty_get_version(p); - - printf("%s ",s); - - } - - printf("\n2: "); - -#if 0 - for(inner = icalcomponent_get_first_component(c,ICAL_VEVENT_COMPONENT); - inner != 0; - inner = next){ - - next = icalcomponent_get_next_component(c,ICAL_VEVENT_COMPONENT); - - icalcomponent_remove_component(c,inner); - - icalcomponent_free(inner); - } -#endif - - /* Delete all of the VEVENTS */ - /* reset iterator */ - icalcomponent_get_first_component(c,ICAL_VEVENT_COMPONENT); - - while((inner=icalcomponent_get_current_component(c)) != 0 ){ - if(icalcomponent_isa(inner) == ICAL_VEVENT_COMPONENT){ - icalcomponent_remove_component(c,inner); - } else { - icalcomponent_get_next_component(c,ICAL_VEVENT_COMPONENT); - } - } - - - - /* List all remaining components */ - for(inner = icalcomponent_get_first_component(c,ICAL_ANY_COMPONENT); - inner != 0; - inner = icalcomponent_get_next_component(c,ICAL_ANY_COMPONENT)){ - - - icalproperty *p = - icalcomponent_get_first_property(inner,ICAL_VERSION_PROPERTY); - - const char* s = icalproperty_get_version(p); - - printf("%s ",s); - } - - printf("\n3: "); - - - /* Remove all remaining components */ - for(inner = icalcomponent_get_first_component(c,ICAL_ANY_COMPONENT); - inner != 0; - inner = next){ - - icalcomponent *this; - icalproperty *p; - const char* s; - next = icalcomponent_get_next_component(c,ICAL_ANY_COMPONENT); - - p=icalcomponent_get_first_property(inner,ICAL_VERSION_PROPERTY); - s = icalproperty_get_version(p); - printf("rem:%s ",s); - - icalcomponent_remove_component(c,inner); - - this = icalcomponent_get_current_component(c); - - if(this != 0){ - p=icalcomponent_get_first_property(this,ICAL_VERSION_PROPERTY); - s = icalproperty_get_version(p); - printf("next:%s; ",s); - } - - icalcomponent_free(inner); - } - - printf("\n4: "); - - - /* List all remaining components */ - for(inner = icalcomponent_get_first_component(c,ICAL_ANY_COMPONENT); - inner != 0; - inner = icalcomponent_get_next_component(c,ICAL_ANY_COMPONENT)){ - - icalproperty *p = - icalcomponent_get_first_property(inner,ICAL_VERSION_PROPERTY); - - const char* s = icalproperty_get_version(p); - - printf("%s ",s); - } - - printf("\n"); -} - - - -char* test_set_tz(const char* tzid) -{ - char *tzstr = 0; - char *tmp; - - /* Put the new time zone into the environment */ - if(getenv("TZ") != 0){ - tzstr = (char*)icalmemory_strdup(getenv("TZ")); - - if(tzstr == 0){ - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - } - - tmp = (char*)malloc(1024); - - if(tmp == 0){ - icalerror_set_errno(ICAL_NEWFAILED_ERROR); - return 0; - } - - snprintf(tmp,1024,"TZ=%s",tzid); - - /* HACK. In some libc versions, putenv gives the string to the - system and in some it gives a copy, so the following might be a - memory leak. THe linux man page says that glibc2.1.2 take - ownership ( no leak) while BSD4.4 uses a copy ( A leak ) */ - putenv(tmp); - - return tzstr; /* This will be zero if the TZ env var was not set */ -} - -void test_unset_tz(char* tzstr) -{ - /* restore the original environment */ - - if(tzstr!=0){ - char temp[1024]; - snprintf(temp,1024,"TZ=%s",tzstr); - putenv(temp); - free(tzstr); - } else { - putenv("TZ"); /* Delete from environment */ - } -} - - -void test_time() -{ - char zones[6][40] = { "America/Los_Angeles","America/New_York","Europe/London","Asia/Shanghai", ""}; - int i; - char* old_tz; - int orig_month; - time_t tt; - struct tm stm; - - tt = time(0); - - stm = *(localtime(&tt)); - - orig_month = stm.tm_mon; - - do_test_time(0); - - old_tz = test_set_tz(zones[0]); - - for(i = 0; zones[i][0] != 0; i++){ - - if(zones[i][0] != 0){ - test_set_tz(zones[i]); - } - - printf(" ######### Timezone: %s ############\n",zones[i]); - - do_test_time(zones[i]); - - } - - test_unset_tz(old_tz); - -} - - -void test_icalset() -{ - icalcomponent *c; - - icalset* f = icalset_new_file("2446.ics"); - icalset* d = icalset_new_dir("outdir"); - - assert(f!=0); - assert(d!=0); - - for(c = icalset_get_first_component(f); - c != 0; - c = icalset_get_next_component(f)){ - - icalcomponent *clone; - - clone = icalcomponent_new_clone(c); - - icalset_add_component(d,clone); - - printf(" class %d\n",icalclassify(c,0,"user")); - - } -} - -void test_classify() -{ - icalcomponent *c,*match; - - icalset* f = icalset_new_file("../../test-data/classify.ics"); - - assert(f!=0); - - c = icalset_get_first_component(f); - match = icalset_get_next_component(f); - - printf("Class %d\n",icalclassify(c,match,"A@example.com")); - - -} - -void print_span(int c, struct icaltime_span span ){ - - printf("#%02d start: %s\n",c,ical_timet_string(span.start)); - printf(" end : %s\n",ical_timet_string(span.end)); - -} - -struct icaltimetype icaltime_as_local(struct icaltimetype tt) { - return icaltime_as_zone(tt,0); -} - -void test_span() -{ - time_t tm1 = 973378800; /*Sat Nov 4 23:00:00 UTC 2000, - Sat Nov 4 15:00:00 PST 2000 */ - time_t tm2 = 973382400; /*Sat Nov 5 00:00:00 UTC 2000 - Sat Nov 4 16:00:00 PST 2000 */ - struct icaldurationtype dur; - struct icaltime_span span; - icalcomponent *c; - - memset(&dur,0,sizeof(dur)); - dur.minutes = 30; - - span.start = tm1; - span.end = tm2; - print_span(0,span); - - /* Specify save timezone as in commend above */ - c = - icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_vanew_dtstart( - icaltime_as_local(icaltime_from_timet(tm1,0)), - icalparameter_new_tzid("US/Pacific"),0), - icalproperty_vanew_dtend( - icaltime_as_local(icaltime_from_timet(tm2,0)), - icalparameter_new_tzid("US/Pacific"),0), - 0 - ); - - printf("%s\n",icalcomponent_as_ical_string(c)); - - span = icalcomponent_get_span(c); - - print_span(1,span); - - icalcomponent_free(c); - - /* Use machine's local timezone. Same as above if run in US/Pacific */ - c = - icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_vanew_dtstart(icaltime_from_timet(tm1,0),0), - icalproperty_vanew_dtend(icaltime_from_timet(tm2,0),0), - 0 - ); - - span = icalcomponent_get_span(c); - - print_span(2,span); - - icalcomponent_free(c); - - /* Specify different timezone */ - c = - icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_vanew_dtstart( - icaltime_as_local(icaltime_from_timet(tm1,0)), - icalparameter_new_tzid("US/Eastern"),0), - icalproperty_vanew_dtend( - icaltime_as_local(icaltime_from_timet(tm2,0)), - icalparameter_new_tzid("US/Eastern"),0), - 0 - ); - span = icalcomponent_get_span(c); - print_span(3,span); - - icalcomponent_free(c); - - - /* Specify different timezone for start and end*/ - c = - icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_vanew_dtstart( - icaltime_as_local(icaltime_from_timet(tm1,0)), - icalparameter_new_tzid("US/Eastern"),0), - icalproperty_vanew_dtend( - icaltime_as_local(icaltime_from_timet(tm2,0)), - icalparameter_new_tzid("US/Pacific"),0), - 0 - ); - span = icalcomponent_get_span(c); - print_span(4,span); - - icalcomponent_free(c); - - /* Use Duration */ - c = - icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_vanew_dtstart( - icaltime_as_local(icaltime_from_timet(tm1,0)), - icalparameter_new_tzid("US/Pacific"),0), - icalproperty_new_duration(dur), - - 0 - ); - span = icalcomponent_get_span(c); - print_span(5,span); - - icalcomponent_free(c); - - -#ifndef ICAL_ERRORS_ARE_FATAL - /* Both UTC and Timezone -- an error */ - icalerror_clear_errno(); - c = - icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_vanew_dtstart(icaltime_from_timet(tm1,0), - icalparameter_new_tzid("US/Eastern"),0), - icalproperty_vanew_dtend(icaltime_from_timet(tm2,0), - icalparameter_new_tzid("US/Eastern"),0), - 0 - ); - - span = icalcomponent_get_span(c); - assert(icalerrno != ICAL_NO_ERROR); - - icalcomponent_free(c); - -#endif /*ICAL_ERRORS_ARE_FATAL*/ - -} - -icalcomponent* icalclassify_find_overlaps(icalset* set, icalcomponent* comp); - -void test_overlaps() -{ - -#if 0 /* Hack, not working right now */ - icalcomponent *cset,*c; - icalset *set; - time_t tm1 = 973378800; /*Sat Nov 4 23:00:00 UTC 2000, - Sat Nov 4 15:00:00 PST 2000 */ - time_t tm2 = 973382400; /*Sat Nov 5 00:00:00 UTC 2000 - Sat Nov 4 16:00:00 PST 2000 */ - - time_t hh = 1800; /* one half hour */ - - set = icalset_new_file("../../test-data/overlaps.ics"); - - printf("-- 1 -- \n"); - c = icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_vanew_dtstart(icaltime_from_timet(tm1-hh,0),0), - icalproperty_vanew_dtend(icaltime_from_timet(tm2-hh,0),0), - 0 - ); - - cset = icalclassify_find_overlaps(set,c); - - printf("%s\n",icalcomponent_as_ical_string(cset)); - - printf("-- 2 -- \n"); - c = icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_vanew_dtstart(icaltime_from_timet(tm1-hh,0),0), - icalproperty_vanew_dtend(icaltime_from_timet(tm2,0),0), - 0 - ); - - cset = icalclassify_find_overlaps(set,c); - - printf("%s\n",icalcomponent_as_ical_string(cset)); - - printf("-- 3 -- \n"); - c = icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_vanew_dtstart(icaltime_from_timet(tm1+5*hh,0),0), - icalproperty_vanew_dtend(icaltime_from_timet(tm2+5*hh,0),0), - 0 - ); - - cset = icalclassify_find_overlaps(set,c); - - printf("%s\n",icalcomponent_as_ical_string(cset)); - -#endif - -} - -void test_fblist() -{ - icalspanlist *sl; - icalset* set = icalset_new_file("../../test-data/spanlist.ics"); - struct icalperiodtype period; - - sl = icalspanlist_new(set, - icaltime_from_string("19970324T120000Z"), - icaltime_from_string("19990424T020000Z")); - - printf("Restricted spanlist\n"); - icalspanlist_dump(sl); - - period= icalspanlist_next_free_time(sl, - icaltime_from_string("19970801T120000Z")); - - - printf("Next Free time: %s\n",icaltime_as_ctime(period.start)); - printf(" %s\n",icaltime_as_ctime(period.end)); - - - icalspanlist_free(sl); - - printf("Unrestricted spanlist\n"); - - sl = icalspanlist_new(set, - icaltime_from_string("19970324T120000Z"), - icaltime_null_time()); - - printf("Restricted spanlist\n"); - - icalspanlist_dump(sl); - - period= icalspanlist_next_free_time(sl, - icaltime_from_string("19970801T120000Z")); - - - printf("Next Free time: %s\n",icaltime_as_ctime(period.start)); - printf(" %s\n",icaltime_as_ctime(period.end)); - - - icalspanlist_free(sl); - - -} - -void test_convenience(){ - - icalcomponent *c; - int duration; - - c = icalcomponent_vanew( - ICAL_VCALENDAR_COMPONENT, - icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_new_dtstart(icaltime_from_string("19970801T120000")), - icalproperty_new_dtend(icaltime_from_string("19970801T130000")), - 0 - ), - 0); - - printf("** 1 DTSTART and DTEND **\n%s\n\n", - icalcomponent_as_ical_string(c)); - - duration = icaldurationtype_as_int(icalcomponent_get_duration(c))/60; - - printf("Start: %s\n",ictt_as_string(icalcomponent_get_dtstart(c))); - printf("End: %s\n",ictt_as_string(icalcomponent_get_dtend(c))); - printf("Dur: %d m\n",duration); - - icalcomponent_free(c); - - c = icalcomponent_vanew( - ICAL_VCALENDAR_COMPONENT, - icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_new_dtstart(icaltime_from_string("19970801T120000Z")), - icalproperty_new_duration(icaldurationtype_from_string("PT1H30M")), - 0 - ), - 0); - - printf("\n** 2 DTSTART and DURATION **\n%s\n\n", - icalcomponent_as_ical_string(c)); - - duration = icaldurationtype_as_int(icalcomponent_get_duration(c))/60; - - printf("Start: %s\n",ictt_as_string(icalcomponent_get_dtstart(c))); - printf("End: %s\n",ictt_as_string(icalcomponent_get_dtend(c))); - printf("Dur: %d m\n",duration); - - icalcomponent_free(c); - - c = icalcomponent_vanew( - ICAL_VCALENDAR_COMPONENT, - icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_new_dtstart(icaltime_from_string("19970801T120000")), - icalproperty_new_dtend(icaltime_from_string("19970801T130000")), - 0 - ), - 0); - - icalcomponent_set_duration(c,icaldurationtype_from_string("PT1H30M")); - - printf("** 3 DTSTART and DTEND, Set DURATION **\n%s\n\n", - icalcomponent_as_ical_string(c)); - - duration = icaldurationtype_as_int(icalcomponent_get_duration(c))/60; - - printf("Start: %s\n",ictt_as_string(icalcomponent_get_dtstart(c))); - printf("End: %s\n",ictt_as_string(icalcomponent_get_dtend(c))); - printf("Dur: %d m\n",duration); - - icalcomponent_free(c); - - c = icalcomponent_vanew( - ICAL_VCALENDAR_COMPONENT, - icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_new_dtstart(icaltime_from_string("19970801T120000Z")), - icalproperty_new_duration(icaldurationtype_from_string("PT1H30M")), - 0 - ), - 0); - - icalcomponent_set_dtend(c,icaltime_from_string("19970801T133000Z")); - - printf("\n** 4 DTSTART and DURATION, set DTEND **\n%s\n\n", - icalcomponent_as_ical_string(c)); - - duration = icaldurationtype_as_int(icalcomponent_get_duration(c))/60; - - printf("Start: %s\n",ictt_as_string(icalcomponent_get_dtstart(c))); - printf("End: %s\n",ictt_as_string(icalcomponent_get_dtend(c))); - printf("Dur: %d m\n",duration); - - icalcomponent_free(c); - - c = icalcomponent_vanew( - ICAL_VCALENDAR_COMPONENT, - icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - 0 - ), - 0); - - icalcomponent_set_dtstart(c,icaltime_from_string("19970801T120000Z")); - icalcomponent_set_dtend(c,icaltime_from_string("19970801T133000Z")); - - printf("\n** 5 Set DTSTART and DTEND **\n%s\n\n", - icalcomponent_as_ical_string(c)); - - - duration = icaldurationtype_as_int(icalcomponent_get_duration(c))/60; - - printf("Start: %s\n",ictt_as_string(icalcomponent_get_dtstart(c))); - printf("End: %s\n",ictt_as_string(icalcomponent_get_dtend(c))); - printf("Dur: %d m\n",duration); - - icalcomponent_free(c); - - c = icalcomponent_vanew( - ICAL_VCALENDAR_COMPONENT, - icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - 0 - ), - 0); - - - icalcomponent_set_dtstart(c,icaltime_from_string("19970801T120000Z")); - icalcomponent_set_duration(c,icaldurationtype_from_string("PT1H30M")); - - printf("\n** 6 Set DTSTART and DURATION **\n%s\n\n", - icalcomponent_as_ical_string(c)); - - - duration = icaldurationtype_as_int(icalcomponent_get_duration(c))/60; - - printf("Start: %s\n",ictt_as_string(icalcomponent_get_dtstart(c))); - printf("End: %s\n",ictt_as_string(icalcomponent_get_dtend(c))); - printf("Dur: %d m\n",duration); - - icalcomponent_free(c); - -} - -void test_time_parser() -{ - struct icaltimetype tt; - - icalerror_errors_are_fatal = 0; - - tt = icaltime_from_string("19970101T1000"); - assert(icaltime_is_null_time(tt)); - - tt = icaltime_from_string("19970101X100000"); - assert(icaltime_is_null_time(tt)); - - tt = icaltime_from_string("19970101T100000"); - assert(!icaltime_is_null_time(tt)); - printf("%s\n",icaltime_as_ctime(tt)); - - tt = icaltime_from_string("19970101T100000Z"); - assert(!icaltime_is_null_time(tt)); - printf("%s\n",icaltime_as_ctime(tt)); - - tt = icaltime_from_string("19970101"); - assert(!icaltime_is_null_time(tt)); - printf("%s\n",icaltime_as_ctime(tt)); - - icalerror_errors_are_fatal = 1; - -} - -void test_recur_parser() -{ - struct icalrecurrencetype rt; - - printf("FREQ=YEARLY;UNTIL=20000131T090000Z;BYMONTH=1,2,3,4,8;BYYEARDAY=34,65,76,78;BYDAY=-1TU,3WE,-4FR,SU,SA\n"); - - rt = icalrecurrencetype_from_string("FREQ=YEARLY;UNTIL=20000131T090000Z;BYMONTH=1,2,3,4,8;BYYEARDAY=34,65,76,78;BYDAY=-1TU,3WE,-4FR,SU,SA"); - - printf("%s\n\n",icalrecurrencetype_as_string(&rt)); - - printf("FREQ=DAILY;COUNT=3;BYMONTH=1,2,3,4,8;BYYEARDAY=34,65,76,78;BYDAY=-1TU,3WE,-4FR,SU,S\n"); - - rt = icalrecurrencetype_from_string("FREQ=DAILY;COUNT=3;BYMONTH=1,2,3,4,8;BYYEARDAY=34,65,76,78;BYDAY=-1TU,3WE,-4FR,SU,SA"); - - printf("%s\n",icalrecurrencetype_as_string(&rt)); - -} - -char* ical_strstr(const char *haystack, const char *needle){ - return strstr(haystack,needle); -} - -void test_doy() -{ - struct icaltimetype tt1, tt2; - short doy; - - tt1 = icaltime_from_string("19950301"); - doy = icaltime_day_of_year(tt1); - tt2 = icaltime_from_day_of_year(doy,1995); - printf("%d %s %s\n",doy, icaltime_as_ctime(tt1),icaltime_as_ctime(tt2)); - assert(tt2.day == 1 && tt2.month == 3); - assert(doy == 60); - - tt1 = icaltime_from_string("19960301"); - doy = icaltime_day_of_year(tt1); - tt2 = icaltime_from_day_of_year(doy,1996); - printf("%d %s %s\n",doy, icaltime_as_ctime(tt1),icaltime_as_ctime(tt2)); - assert(tt2.day == 1 && tt2.month == 3); - assert(doy == 61); - - tt1 = icaltime_from_string("19970301"); - doy = icaltime_day_of_year(tt1); - tt2 = icaltime_from_day_of_year(doy,1997); - printf("%d %s %s\n",doy, icaltime_as_ctime(tt1),icaltime_as_ctime(tt2)); - assert(tt2.day == 1 && tt2.month == 3); - assert(doy == 60); - -} - - -void test_x(){ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <ical.h> - - static const char test_icalcomp_str[] = -"BEGIN:VEVENT\r\n" -"RRULE\r\n" -" ;X-EVOLUTION-ENDDATE=20030209T081500\r\n" -" :FREQ=DAILY;COUNT=10;INTERVAL=6\r\n" -"X-COMMENT;X-FOO=BAR: Booga\r\n" -"END:VEVENT\r\n"; - - icalcomponent *icalcomp; - icalproperty *prop; - struct icalrecurrencetype recur; - int n_errors; - - icalcomp = icalparser_parse_string ((char *) test_icalcomp_str); - if (!icalcomp) { - fprintf (stderr, "main(): could not parse the component\n"); - exit (EXIT_FAILURE); - } - - printf("%s\n\n",icalcomponent_as_ical_string(icalcomp)); - - n_errors = icalcomponent_count_errors (icalcomp); - if (n_errors) { - icalproperty *p; - - for (p = icalcomponent_get_first_property (icalcomp, - ICAL_XLICERROR_PROPERTY); - p; - p = icalcomponent_get_next_property (icalcomp, - ICAL_XLICERROR_PROPERTY)) { - char *str; - - str = icalproperty_as_ical_string (p); - fprintf (stderr, "error: %s\n", str); - } - } - - prop = icalcomponent_get_first_property (icalcomp, ICAL_RRULE_PROPERTY); - if (!prop) { - fprintf (stderr, "main(): could not get the RRULE property"); - exit (EXIT_FAILURE); - } - - recur = icalproperty_get_rrule (prop); - - printf("%s\n",icalrecurrencetype_as_string(&recur)); - -} - -void test_gauge_sql() { - - - icalgauge *g; - - printf("\nSELECT DTSTART,DTEND,COMMENT FROM VEVENT,VTODO WHERE VEVENT.SUMMARY = 'Bongoa' AND SEQUENCE < 5\n"); - - g = icalgauge_new_from_sql("SELECT DTSTART,DTEND,COMMENT FROM VEVENT,VTODO WHERE VEVENT.SUMMARY = 'Bongoa' AND SEQUENCE < 5"); - - icalgauge_dump(g); - - icalgauge_free(g); - - printf("\nSELECT * FROM VEVENT,VTODO WHERE VEVENT.SUMMARY = 'Bongoa' AND SEQUENCE < 5 OR METHOD != 'CREATE'\n"); - - g = icalgauge_new_from_sql("SELECT * FROM VEVENT,VTODO WHERE VEVENT.SUMMARY = 'Bongoa' AND SEQUENCE < 5 OR METHOD != 'CREATE'"); - - icalgauge_dump(g); - - icalgauge_free(g); - -} - -void test_gauge_compare() { - - icalgauge *g; - icalcomponent *c; - - /* Equality */ - - c = icalcomponent_vanew(ICAL_VCALENDAR_COMPONENT, - icalcomponent_vanew(ICAL_VEVENT_COMPONENT, - icalproperty_new_dtstart( - icaltime_from_string("20000101T000002")),0),0); - - g = icalgauge_new_from_sql( - "SELECT * FROM VEVENT WHERE DTSTART = '20000101T000002'"); - - printf("SELECT * FROM VEVENT WHERE DTSTART = '20000101T000002'\n"); - assert(c!=0); - assert(g!=0); - - assert(icalgauge_compare(g,c) == 1); - - icalgauge_free(g); - - - g = icalgauge_new_from_sql( - "SELECT * FROM VEVENT WHERE DTSTART = '20000101T000001'"); - - printf("SELECT * FROM VEVENT WHERE DTSTART = '20000101T000001'\n"); - - assert(g!=0); - assert(icalgauge_compare(g,c) == 0); - - icalgauge_free(g); - - g = icalgauge_new_from_sql( - "SELECT * FROM VEVENT WHERE DTSTART != '20000101T000003'"); - - printf("SELECT * FROM VEVENT WHERE DTSTART != '20000101T000003'\n"); - - - assert(g!=0); - assert(icalgauge_compare(g,c) == 1); - - icalgauge_free(g); - - - /* Less than */ - - g = icalgauge_new_from_sql( - "SELECT * FROM VEVENT WHERE DTSTART < '20000101T000003'"); - - printf("SELECT * FROM VEVENT WHERE DTSTART < '20000101T000003'\n"); - - assert(icalgauge_compare(g,c) == 1); - - assert(g!=0); - icalgauge_free(g); - - g = icalgauge_new_from_sql( - "SELECT * FROM VEVENT WHERE DTSTART < '20000101T000002'"); - - printf("SELECT * FROM VEVENT WHERE DTSTART < '20000101T000002'\n"); - - - assert(g!=0); - assert(icalgauge_compare(g,c) == 0); - - icalgauge_free(g); - - /* Greater than */ - - g = icalgauge_new_from_sql( - "SELECT * FROM VEVENT WHERE DTSTART > '20000101T000001'"); - - printf("SELECT * FROM VEVENT WHERE DTSTART > '20000101T000001'\n"); - - - assert(g!=0); - assert(icalgauge_compare(g,c) == 1); - - icalgauge_free(g); - - g = icalgauge_new_from_sql( - "SELECT * FROM VEVENT WHERE DTSTART > '20000101T000002'"); - - printf("SELECT * FROM VEVENT WHERE DTSTART > '20000101T000002'\n"); - - - assert(g!=0); - assert(icalgauge_compare(g,c) == 0); - - icalgauge_free(g); - - - /* Greater than or Equal to */ - - g = icalgauge_new_from_sql( - "SELECT * FROM VEVENT WHERE DTSTART >= '20000101T000002'"); - - printf("SELECT * FROM VEVENT WHERE DTSTART >= '20000101T000002'\n"); - - - assert(g!=0); - assert(icalgauge_compare(g,c) == 1); - - icalgauge_free(g); - - g = icalgauge_new_from_sql( - "SELECT * FROM VEVENT WHERE DTSTART >= '20000101T000003'"); - - printf("SELECT * FROM VEVENT WHERE DTSTART >= '20000101T000003'\n"); - - - assert(g!=0); - assert(icalgauge_compare(g,c) == 0); - - icalgauge_free(g); - - /* Less than or Equal to */ - - g = icalgauge_new_from_sql( - "SELECT * FROM VEVENT WHERE DTSTART <= '20000101T000002'"); - - printf("SELECT * FROM VEVENT WHERE DTSTART <= '20000101T000002'\n"); - - - assert(g!=0); - assert(icalgauge_compare(g,c) == 1); - - icalgauge_free(g); - - g = icalgauge_new_from_sql( - "SELECT * FROM VEVENT WHERE DTSTART <= '20000101T000001'"); - - printf("SELECT * FROM VEVENT WHERE DTSTART <= '20000101T000001'\n"); - - - assert(g!=0); - assert(icalgauge_compare(g,c) == 0); - - icalgauge_free(g); - - icalcomponent_free(c); - - - /* Complex comparisions */ - - c = icalcomponent_vanew( - ICAL_VCALENDAR_COMPONENT, - icalproperty_new_method(ICAL_METHOD_REQUEST), - icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_new_dtstart( - icaltime_from_string("20000101T000002")), - icalproperty_new_comment("foo"), - icalcomponent_vanew( - ICAL_VALARM_COMPONENT, - icalproperty_new_dtstart( - icaltime_from_string("20000101T120000")), - - 0), - 0), - 0); - - - g = icalgauge_new_from_sql( - "SELECT * FROM VEVENT WHERE VALARM.DTSTART = '20000101T120000'"); - - printf("SELECT * FROM VEVENT WHERE VALARM.DTSTART = '20000101T120000'\n"); - - assert(icalgauge_compare(g,c) == 1); - - icalgauge_free(g); - - g = icalgauge_new_from_sql( - "SELECT * FROM VEVENT WHERE COMMENT = 'foo'"); - - printf("SELECT * FROM VEVENT WHERE COMMENT = 'foo'\n"); - - assert(icalgauge_compare(g,c) == 1); - - icalgauge_free(g); - - - g = icalgauge_new_from_sql( - "SELECT * FROM VEVENT WHERE COMMENT = 'foo' AND VALARM.DTSTART = '20000101T120000'"); - - printf("SELECT * FROM VEVENT WHERE COMMENT = 'foo' AND VALARM.DTSTART = '20000101T120000'\n"); - - assert(icalgauge_compare(g,c) == 1); - - icalgauge_free(g); - - icalcomponent_free(c); - -} - -icalcomponent* make_component(int i){ - - icalcomponent *c; - - struct icaltimetype t = icaltime_from_string("20000101T120000Z"); - - t.day += i; - - icaltime_normalize(t); - - c = icalcomponent_vanew( - ICAL_VCALENDAR_COMPONENT, - icalproperty_new_method(ICAL_METHOD_REQUEST), - icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_new_dtstart(t), - 0), - 0); - - assert(c != 0); - - return c; - -} -void test_fileset() -{ - icalfileset *fs; - icalcomponent *c; - int i; - char *path = "test_fileset.ics"; - icalgauge *g = icalgauge_new_from_sql( - "SELECT * FROM VEVENT WHERE DTSTART > '20000103T120000Z' AND DTSTART <= '20000106T120000Z'"); - - - unlink(path); - - fs = icalfileset_new(path); - - assert(fs != 0); - - for (i = 0; i!= 10; i++){ - c = make_component(i); - icalfileset_add_component(fs,c); - } - - icalfileset_commit(fs); - - icalfileset_free(fs); - fs = icalfileset_new(path); - - - printf("== No Selections \n"); - - for (c = icalfileset_get_first_component(fs); - c != 0; - c = icalfileset_get_next_component(fs)){ - struct icaltimetype t = icalcomponent_get_dtstart(c); - - printf("%s\n",icaltime_as_ctime(t)); - } - - icalfileset_select(fs,g); - - printf("\n== DTSTART > '20000103T120000Z' AND DTSTART <= '20000106T120000Z' \n"); - - for (c = icalfileset_get_first_component(fs); - c != 0; - c = icalfileset_get_next_component(fs)){ - struct icaltimetype t = icalcomponent_get_dtstart(c); - - printf("%s\n",icaltime_as_ctime(t)); - } - - icalfileset_free(fs); - -} - -void microsleep(int us) -{ - struct timeval tv; - - tv.tv_sec = 0; - tv.tv_usec = us; - - select(0,0,0,0,&tv); - -} - - -void test_file_locks() -{ - pid_t pid; - char *path = "test_fileset_locktest.ics"; - icalfileset *fs; - icalcomponent *c, *c2; - struct icaldurationtype d; - int i; - int final,sec; - - icalfileset_safe_saves = 1; - - icalerror_clear_errno(); - - unlink(path); - - fs = icalfileset_new(path); - - if(icalfileset_get_first_component(fs)==0){ - c = make_component(0); - - d = icaldurationtype_from_int(1); - - icalcomponent_set_duration(c,d); - - icalfileset_add_component(fs,c); - - c2 = icalcomponent_new_clone(c); - - icalfileset_add_component(fs,c2); - - icalfileset_commit(fs); - } - - icalfileset_free(fs); - - assert(icalerrno == ICAL_NO_ERROR); - - pid = fork(); - - assert(pid >= 0); - - if(pid == 0){ - /*child*/ - int i; - - microsleep(rand()/(RAND_MAX/100)); - - for(i = 0; i< 50; i++){ - fs = icalfileset_new(path); - - - assert(fs != 0); - - c = icalfileset_get_first_component(fs); - - assert(c!=0); - - d = icalcomponent_get_duration(c); - d = icaldurationtype_from_int(icaldurationtype_as_int(d)+1); - - icalcomponent_set_duration(c,d); - icalcomponent_set_summary(c,"Child"); - - c2 = icalcomponent_new_clone(c); - icalcomponent_set_summary(c2,"Child"); - icalfileset_add_component(fs,c2); - - icalfileset_mark(fs); - icalfileset_commit(fs); - - icalfileset_free(fs); - - microsleep(rand()/(RAND_MAX/20)); - - - } - - exit(0); - - } else { - /* parent */ - int i; - - for(i = 0; i< 50; i++){ - fs = icalfileset_new(path); - - assert(fs != 0); - - c = icalfileset_get_first_component(fs); - - assert(c!=0); - - d = icalcomponent_get_duration(c); - d = icaldurationtype_from_int(icaldurationtype_as_int(d)+1); - - icalcomponent_set_duration(c,d); - icalcomponent_set_summary(c,"Parent"); - - c2 = icalcomponent_new_clone(c); - icalcomponent_set_summary(c2,"Parent"); - icalfileset_add_component(fs,c2); - - icalfileset_mark(fs); - icalfileset_commit(fs); - icalfileset_free(fs); - - putc('.',stdout); - fflush(stdout); - - } - } - - assert(waitpid(pid,0,0)==pid); - - - fs = icalfileset_new(path); - - i=1; - - c = icalfileset_get_first_component(fs); - final = icaldurationtype_as_int(icalcomponent_get_duration(c)); - for (c = icalfileset_get_next_component(fs); - c != 0; - c = icalfileset_get_next_component(fs)){ - struct icaldurationtype d = icalcomponent_get_duration(c); - sec = icaldurationtype_as_int(d); - - /*printf("%d,%d ",i,sec);*/ - assert(i == sec); - i++; - } - - printf("\nFinal: %d\n",final); - - - assert(sec == final); -} - -void test_action() -{ - icalcomponent *c; - icalproperty *p; - - static const char test_icalcomp_str[] = -"BEGIN:VEVENT\n" -"ACTION:EMAIL\n" -"ACTION:PROCEDURE\n" -"ACTION:AUDIO\n" -"ACTION:FUBAR\n" -"END:VEVENT\r\n"; - - - c = icalparser_parse_string ((char *) test_icalcomp_str); - if (!c) { - fprintf (stderr, "main(): could not parse the component\n"); - exit (EXIT_FAILURE); - } - - printf("%s\n\n",icalcomponent_as_ical_string(c)); - - p = icalcomponent_get_first_property(c,ICAL_ACTION_PROPERTY); - - assert(icalproperty_get_action(p) == ICAL_ACTION_EMAIL); - - p = icalcomponent_get_next_property(c,ICAL_ACTION_PROPERTY); - - assert(icalproperty_get_action(p) == ICAL_ACTION_PROCEDURE); - - p = icalcomponent_get_next_property(c,ICAL_ACTION_PROPERTY); - - assert(icalproperty_get_action(p) == ICAL_ACTION_AUDIO); - - p = icalcomponent_get_next_property(c,ICAL_ACTION_PROPERTY); - - assert(icalproperty_get_action(p) == ICAL_ACTION_X); - assert(regrstrcmp(icalvalue_get_x(icalproperty_get_value(p)), "FUBAR")==0); - - -} - - - -void test_trigger() -{ - - struct icaltriggertype tr; - icalcomponent *c; - icalproperty *p; - char* str; - - static const char test_icalcomp_str[] = -"BEGIN:VEVENT\n" -"TRIGGER;VALUE=DATE-TIME:19980403T120000\n" -"TRIGGER:-PT15M\n" -"TRIGGER:19980403T120000\n" -"TRIGGER;VALUE=DURATION:-PT15M\n" -"END:VEVENT\r\n"; - - - c = icalparser_parse_string ((char *) test_icalcomp_str); - if (!c) { - fprintf (stderr, "main(): could not parse the component\n"); - exit (EXIT_FAILURE); - } - - printf("%s\n\n",icalcomponent_as_ical_string(c)); - - for(p = icalcomponent_get_first_property(c,ICAL_TRIGGER_PROPERTY); - p != 0; - p = icalcomponent_get_next_property(c,ICAL_TRIGGER_PROPERTY)){ - tr = icalproperty_get_trigger(p); - - if(!icaltime_is_null_time(tr.time)){ - printf("value=DATE-TIME:%s\n", icaltime_as_ical_string(tr.time)); - } else { - printf("value=DURATION:%s\n", icaldurationtype_as_ical_string(tr.duration)); - } - } - - /* Trigger, as a DATETIME */ - tr.duration = icaldurationtype_null_duration(); - tr.time = icaltime_from_string("19970101T120000"); - p = icalproperty_new_trigger(tr); - str = icalproperty_as_ical_string(p); - - printf("%s\n",str); - assert(regrstrcmp("TRIGGER\n ;VALUE=DATE-TIME\n :19970101T120000\n",str) == 0); - icalproperty_free(p); - - /* TRIGGER, as a DURATION */ - tr.time = icaltime_null_time(); - tr.duration = icaldurationtype_from_string("P3DT3H50M45S"); - p = icalproperty_new_trigger(tr); - str = icalproperty_as_ical_string(p); - - printf("%s\n",str); - assert(regrstrcmp("TRIGGER\n ;VALUE=DURATION\n :P3DT3H50M45S\n",str) == 0); - icalproperty_free(p); - - /* TRIGGER, as a DATETIME, VALUE=DATETIME*/ - tr.duration = icaldurationtype_null_duration(); - tr.time = icaltime_from_string("19970101T120000"); - p = icalproperty_new_trigger(tr); - icalproperty_add_parameter(p,icalparameter_new_value( ICAL_VALUE_DATETIME)); - str = icalproperty_as_ical_string(p); - - printf("%s\n",str); - assert(regrstrcmp("TRIGGER\n ;VALUE=DATE-TIME\n :19970101T120000\n",str) == 0); - icalproperty_free(p); - - /*TRIGGER, as a DURATION, VALUE=DATETIME */ - tr.time = icaltime_null_time(); - tr.duration = icaldurationtype_from_string("P3DT3H50M45S"); - p = icalproperty_new_trigger(tr); - icalproperty_add_parameter(p,icalparameter_new_value( ICAL_VALUE_DATETIME )); - - str = icalproperty_as_ical_string(p); - - printf("%s\n",str); - assert(regrstrcmp("TRIGGER\n ;VALUE=DURATION\n :P3DT3H50M45S\n",str) == 0); - icalproperty_free(p); - - /* TRIGGER, as a DATETIME, VALUE=DURATION*/ - tr.duration = icaldurationtype_null_duration(); - tr.time = icaltime_from_string("19970101T120000"); - p = icalproperty_new_trigger(tr); - icalproperty_add_parameter(p,icalparameter_new_value( ICAL_VALUE_DURATION)); - str = icalproperty_as_ical_string(p); - - printf("%s\n",str); - assert(regrstrcmp("TRIGGER\n ;VALUE=DATE-TIME\n :19970101T120000\n",str) == 0); - icalproperty_free(p); - - /*TRIGGER, as a DURATION, VALUE=DURATION */ - tr.time = icaltime_null_time(); - tr.duration = icaldurationtype_from_string("P3DT3H50M45S"); - p = icalproperty_new_trigger(tr); - icalproperty_add_parameter(p,icalparameter_new_value( ICAL_VALUE_DURATION)); - - str = icalproperty_as_ical_string(p); - - printf("%s\n",str); - assert(regrstrcmp("TRIGGER\n ;VALUE=DURATION\n :P3DT3H50M45S\n",str) == 0); - icalproperty_free(p); - - - /* TRIGGER, as a DATETIME, VALUE=BINARY */ - tr.duration = icaldurationtype_null_duration(); - tr.time = icaltime_from_string("19970101T120000"); - p = icalproperty_new_trigger(tr); - icalproperty_add_parameter(p,icalparameter_new_value(ICAL_VALUE_BINARY)); - str = icalproperty_as_ical_string(p); - - printf("%s\n",str); - assert(regrstrcmp("TRIGGER\n ;VALUE=DATE-TIME\n :19970101T120000\n",str) == 0); - icalproperty_free(p); - - /*TRIGGER, as a DURATION, VALUE=BINARY */ - tr.time = icaltime_null_time(); - tr.duration = icaldurationtype_from_string("P3DT3H50M45S"); - p = icalproperty_new_trigger(tr); - icalproperty_add_parameter(p,icalparameter_new_value(ICAL_VALUE_BINARY)); - - str = icalproperty_as_ical_string(p); - - printf("%s\n",str); - assert(regrstrcmp("TRIGGER\n ;VALUE=DURATION\n :P3DT3H50M45S\n",str) == 0); - icalproperty_free(p); - - - -} - -void test_rdate() -{ - - struct icaldatetimeperiodtype dtp; - icalproperty *p; - char* str; - struct icalperiodtype period; - - period.start = icaltime_from_string("19970101T120000"); - period.end = icaltime_null_time(); - period.duration = icaldurationtype_from_string("PT3H10M15S"); - - /* RDATE, as DATE-TIME */ - dtp.time = icaltime_from_string("19970101T120000"); - dtp.period = icalperiodtype_null_period(); - p = icalproperty_new_rdate(dtp); - str = icalproperty_as_ical_string(p); - printf("%s\n",str); - assert(regrstrcmp("RDATE\n ;VALUE=DATE-TIME\n :19970101T120000\n",str) == 0); - icalproperty_free(p); - - - /* RDATE, as PERIOD */ - dtp.time = icaltime_null_time(); - dtp.period = period; - p = icalproperty_new_rdate(dtp); - - str = icalproperty_as_ical_string(p); - printf("%s\n",str); - assert(regrstrcmp("RDATE\n ;VALUE=PERIOD\n :19970101T120000/PT3H10M15S\n",str) == 0); - icalproperty_free(p); - - /* RDATE, as DATE-TIME, VALUE=DATE-TIME */ - dtp.time = icaltime_from_string("19970101T120000"); - dtp.period = icalperiodtype_null_period(); - p = icalproperty_new_rdate(dtp); - icalproperty_add_parameter(p,icalparameter_new_value(ICAL_VALUE_DATETIME)); - str = icalproperty_as_ical_string(p); - printf("%s\n",str); - assert(regrstrcmp("RDATE\n ;VALUE=DATE-TIME\n :19970101T120000\n",str) == 0); - icalproperty_free(p); - - - /* RDATE, as PERIOD, VALUE=DATE-TIME */ - dtp.time = icaltime_null_time(); - dtp.period = period; - p = icalproperty_new_rdate(dtp); - icalproperty_add_parameter(p,icalparameter_new_value(ICAL_VALUE_DATETIME)); - str = icalproperty_as_ical_string(p); - printf("%s\n",str); - assert(regrstrcmp("RDATE\n ;VALUE=PERIOD\n :19970101T120000/PT3H10M15S\n",str) == 0); - icalproperty_free(p); - - - /* RDATE, as DATE-TIME, VALUE=PERIOD */ - dtp.time = icaltime_from_string("19970101T120000"); - dtp.period = icalperiodtype_null_period(); - p = icalproperty_new_rdate(dtp); - icalproperty_add_parameter(p,icalparameter_new_value(ICAL_VALUE_PERIOD)); - str = icalproperty_as_ical_string(p); - printf("%s\n",str); - assert(regrstrcmp("RDATE\n ;VALUE=DATE-TIME\n :19970101T120000\n",str) == 0); - icalproperty_free(p); - - - /* RDATE, as PERIOD, VALUE=PERIOD */ - dtp.time = icaltime_null_time(); - dtp.period = period; - p = icalproperty_new_rdate(dtp); - icalproperty_add_parameter(p,icalparameter_new_value(ICAL_VALUE_PERIOD)); - str = icalproperty_as_ical_string(p); - printf("%s\n",str); - assert(regrstrcmp("RDATE\n ;VALUE=PERIOD\n :19970101T120000/PT3H10M15S\n",str) == 0); - icalproperty_free(p); - - - /* RDATE, as DATE-TIME, VALUE=BINARY */ - dtp.time = icaltime_from_string("19970101T120000"); - dtp.period = icalperiodtype_null_period(); - p = icalproperty_new_rdate(dtp); - icalproperty_add_parameter(p,icalparameter_new_value(ICAL_VALUE_BINARY)); - str = icalproperty_as_ical_string(p); - printf("%s\n",str); - assert(regrstrcmp("RDATE\n ;VALUE=DATE-TIME\n :19970101T120000\n",str) == 0); - icalproperty_free(p); - - - /* RDATE, as PERIOD, VALUE=BINARY */ - dtp.time = icaltime_null_time(); - dtp.period = period; - p = icalproperty_new_rdate(dtp); - icalproperty_add_parameter(p,icalparameter_new_value(ICAL_VALUE_BINARY)); - str = icalproperty_as_ical_string(p); - printf("%s\n",str); - assert(regrstrcmp("RDATE\n ;VALUE=PERIOD\n :19970101T120000/PT3H10M15S\n",str) == 0); - icalproperty_free(p); - - -} - - -void test_langbind() -{ - icalcomponent *c, *inner; - icalproperty *p; - - static const char test_str[] = -"BEGIN:VEVENT\n" -"ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:employee-A@host.com\n" -"COMMENT: Comment that \n spans a line\n" -"DTSTART:19970101T120000\n" -"DTSTART:19970101T120000Z\n" -"DTSTART:19970101\n" -"DURATION:P3DT4H25M\n" -"FREEBUSY:19970101T120000/19970101T120000\n" -"FREEBUSY:19970101T120000/P3DT4H25M\n" -"END:VEVENT\n"; - - - printf("%s\n",test_str); - - c = icalparser_parse_string(test_str); - inner = icalcomponent_get_inner(c); - - - for( - p = icallangbind_get_first_property(inner,"ANY"); - p != 0; - p = icallangbind_get_next_property(inner,"ANY") - ) { - - printf("%s\n",icallangbind_property_eval_string(p,":")); - } - - - - p = icalcomponent_get_first_property(inner,ICAL_ATTENDEE_PROPERTY); - - icalproperty_set_parameter_from_string(p,"CUTYPE","INDIVIDUAL"); - - printf("%s\n",icalproperty_as_ical_string(p)); - - - icalproperty_set_value_from_string(p,"mary@foo.org","TEXT"); - - printf("%s\n",icalproperty_as_ical_string(p)); - -} - -void test_property_parse() -{ - icalproperty *p; - - p= icalproperty_new_from_string( - "ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:employee-A@host.com"); - - assert (p != 0); - printf("%s\n",icalproperty_as_ical_string(p)); - - - p= icalproperty_new_from_string("DTSTART:19970101T120000Z\n"); - - assert (p != 0); - printf("%s\n",icalproperty_as_ical_string(p)); - -} - - -void test_value_parameter() -{ - - icalcomponent *c; - icalproperty *p; - icalparameter *param; - - static const char test_icalcomp_str[] = -"BEGIN:VEVENT\n" -"DTSTART;VALUE=DATE-TIME:19971123T123000\n" -"DTSTART;VALUE=DATE:19971123\n" -"DTSTART;VALUE=FOO:19971123T123000\n" -"END:VEVENT\n"; - - c = icalparser_parse_string ((char *) test_icalcomp_str); - if (!c) { - fprintf (stderr, "main(): could not parse the component\n"); - exit (EXIT_FAILURE); - } - - printf("%s",icalcomponent_as_ical_string(c)); - - p = icalcomponent_get_first_property(c,ICAL_DTSTART_PROPERTY); - param = icalproperty_get_first_parameter(p,ICAL_VALUE_PARAMETER); - assert(icalparameter_get_value(param) == ICAL_VALUE_DATETIME); - - p = icalcomponent_get_next_property(c,ICAL_DTSTART_PROPERTY); - param = icalproperty_get_first_parameter(p,ICAL_VALUE_PARAMETER); - assert(icalparameter_get_value(param) == ICAL_VALUE_DATE); - -} - - -void test_x_property() -{ - icalproperty *p; - - p= icalproperty_new_from_string( - "X-LIC-PROPERTY: This is a note"); - - printf("%s\n",icalproperty_as_ical_string(p)); - - assert(icalproperty_isa(p) == ICAL_X_PROPERTY); - assert(regrstrcmp(icalproperty_get_x_name(p),"X-LIC-PROPERTY")==0); - assert(regrstrcmp(icalproperty_get_x(p)," This is a note")==0); - -} - -int main(int argc, char *argv[]) -{ - int c; - extern char *optarg; - extern int optopt; - int errflg=0; - char* program_name = strrchr(argv[0],'/'); - int ttime=0, trecur=0,tspan=0, tmisc=0, tgauge = 0, tfile = 0, - tbasic = 0; - - if(argc==1) { - ttime = trecur = tspan = tmisc = tgauge = tfile = tbasic = 1; - } - - while ((c = getopt(argc, argv, "t:s:r:m:g:f:b:")) != -1) { - switch (c) { - - case 'b': { - tbasic = atoi(optarg); - break; - } - - case 't': { - ttime = atoi(optarg); - break; - } - - case 's': { - tspan = atoi(optarg); - break; - } - - case 'r': { - trecur = atoi(optarg); - break; - } - - - case 'm': { - tmisc = atoi(optarg); - break; - } - - - case 'g': { - tgauge = atoi(optarg); - break; - } - - case 'f': { - tfile = atoi(optarg); - break; - } - - case ':': {/* Option given without an operand */ - fprintf(stderr, - "%s: Option -%c requires an operand\n", - program_name,optopt); - errflg++; - break; - } - case '?': { - errflg++; - } - - } - - } - - - if(ttime==1 || ttime==2){ - printf("\n------------Test time parser ----------\n"); - test_time_parser(); - - } - - if(ttime==1 || ttime==3){ - printf("\n------------Test time----------------\n"); - test_time(); - } - - if(ttime==1 || ttime==4){ - printf("\n------------Test day of year---------\n"); - test_doy(); - } - - if(ttime==1 || ttime==5){ - printf("\n------------Test duration---------------\n"); - test_duration(); - } - - if(ttime==1 || ttime==6){ - printf("\n------------Test period ----------------\n"); - test_period(); - } - - - - if(trecur==1 || trecur==2){ - printf("\n------------Test recur parser ----------\n"); - test_recur_parser(); - } - - if(trecur==1 || trecur==3){ - printf("\n------------Test recur---------------\n"); - test_recur(); - } - - if(trecur==1 || trecur==4){ - printf("\n------------Test parameter bug---------\n"); - test_recur_parameter_bug(); - } - - if(trecur==1 || trecur==5){ - printf("\n------------Test Array Expansion---------\n"); - test_expand_recurrence(); - } - - - - - if(tspan==1 || tspan==2){ - printf("\n------------Test FBlist------------\n"); - test_fblist(); - } - - if(tspan==1 || tspan==3){ - printf("\n------------Test Overlaps------------\n"); - test_overlaps(); - } - - if(tspan==1 || tspan==4){ - printf("\n------------Test Span----------------\n"); - test_span(); - } - - if(tgauge == 1 || tgauge == 2){ - printf("\n------------Test Gauge SQL----------------\n"); - test_gauge_sql(); - } - - if(tgauge == 1 || tgauge == 3){ - printf("\n------------Test Gauge Compare--------------\n"); - test_gauge_compare(); - } - - if(tfile ==1 || tfile == 2){ - printf("\n------------Test File Set--------------\n"); - test_fileset(); - } - - if(tfile ==1 || tfile == 3){ - printf("\n------------Test File Locks--------------\n"); - test_file_locks(); - } - - - - if(tmisc == 1 || tmisc == 2){ - printf("\n------------Test X Props and Params--------\n"); - test_x(); - } - - if(tmisc == 1 || tmisc == 3){ - printf("\n------------Test Trigger ------------------\n"); - test_trigger(); - } - - if(tmisc == 1 || tmisc == 4){ - - printf("\n------------Test Restriction---------------\n"); - test_restriction(); - } - - if(tmisc == 1 || tmisc == 5){ - - printf("\n------------Test RDATE---------------\n"); - test_rdate(); - } - - if(tmisc == 1 || tmisc == 6){ - - printf("\n------------Test language binding---------------\n"); - test_langbind(); - } - - - if(tmisc == 1 || tmisc == 7){ - - printf("\n------------Test property parser---------------\n"); - test_property_parse(); - } - - if(tmisc == 1 || tmisc == 8){ - printf("\n------------Test Action ------------------\n"); - test_action(); - } - - if(tmisc == 1 || tmisc == 9){ - printf("\n------------Test Value Parameter ------------------\n"); - test_value_parameter(); - } - - if(tmisc == 1 || tmisc == 10){ - printf("\n------------Test X property ------------------\n"); - test_x_property(); - } - - - if(tbasic == 1 || tbasic == 2){ - printf("\n------------Test Values---------------\n"); - test_values(); - } - - if(tbasic == 1 || tbasic == 3){ - printf("\n------------Test Parameters-----------\n"); - test_parameters(); - } - - if(tbasic == 1 || tbasic == 4){ - printf("\n------------Test Properties-----------\n"); - test_properties(); - } - - if(tbasic == 1 || tbasic == 5){ - printf("\n------------Test Components ----------\n"); - test_components(); - } - - if(tmisc == 1){ - - printf("\n------------Test Convenience ------------\n"); - test_convenience(); - - - printf("\n------------Test classify ---------------\n"); - test_classify(); - - - printf("\n------------Test Iterators-----------\n"); - test_iterators(); - - - printf("\n-----------Test request status-------\n"); - test_requeststat(); - - printf("\n------------Test strings---------------\n"); - test_strings(); - - printf("\n------------Test Compare---------------\n"); - test_compare(); - - printf("\n------------Create Components --------\n"); - create_new_component(); - - printf("\n----- Create Components with vaargs ---\n"); - create_new_component_with_va_args(); - - printf("\n------------Test Memory---------------\n"); - test_memory(); - } - - return 0; -} - - - diff --git a/libical/src/test/storage.c b/libical/src/test/storage.c deleted file mode 100644 index 2d8bc586f4..0000000000 --- a/libical/src/test/storage.c +++ /dev/null @@ -1,459 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: usecases.c - CREATOR: eric 03 April 1999 - - DESCRIPTION: - - $Id$ - $Locker$ - - (C) COPYRIGHT 1999 Eric Busboom - http://www.softwarestudio.org - - The contents of this file are subject to the Mozilla Public License - Version 1.0 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and - limitations under the License. - - The original author is Eric Busboom - The original code is usecases.c - - - ======================================================================*/ - -#include "ical.h" -#include <assert.h> -#include <string.h> /* for strdup */ -#include <stdlib.h> /* for malloc */ -#include <stdio.h> /* for printf */ -#include <time.h> /* for time() */ -#include "icalmemory.h" -#include "icaldirset.h" -#include "icalfileset.h" -#include "icalerror.h" -#include "icalrestriction.h" -#include "icalcalendar.h" - -#define OUTPUT_FILE "filesetout.ics" - -char str[] = "BEGIN:VCALENDAR\n\ -PRODID:\"-//RDU Software//NONSGML HandCal//EN\"\n\ -VERSION:2.0\n\ -BEGIN:VTIMEZONE\n\ -TZID:US-Eastern\n\ -BEGIN:STANDARD\n\ -DTSTART:19981025T020000\n\ -RDATE:19981025T020000\n\ -TZOFFSETFROM:-0400\n\ -TZOFFSETTO:-0500\n\ -TZNAME:EST\n\ -END:STANDARD\n\ -BEGIN:DAYLIGHT\n\ -DTSTART:19990404T020000\n\ -RDATE:19990404T020000\n\ -TZOFFSETFROM:-0500\n\ -TZOFFSETTO:-0400\n\ -TZNAME:EDT\n\ -END:DAYLIGHT\n\ -END:VTIMEZONE\n\ -BEGIN:VEVENT\n\ -DTSTAMP:19980309T231000Z\n\ -UID:guid-1.host1.com\n\ -ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com\n\ -ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:employee-A@host.com\n\ -DESCRIPTION:Project XYZ Review Meeting\n\ -CATEGORIES:MEETING\n\ -CLASS:PUBLIC\n\ -CREATED:19980309T130000Z\n\ -SUMMARY:XYZ Project Review\n\ -DTSTART;TZID=US-Eastern:19980312T083000\n\ -DTEND;TZID=US-Eastern:19980312T093000\n\ -LOCATION:1CP Conference Room 4350\n\ -END:VEVENT\n\ -BEGIN:BOOGA\n\ -DTSTAMP:19980309T231000Z\n\ -X-LIC-FOO:Booga\n\ -DTSTOMP:19980309T231000Z\n\ -UID:guid-1.host1.com\n\ -END:BOOGA\n\ -END:VCALENDAR"; - -char str2[] = "BEGIN:VCALENDAR\n\ -PRODID:\"-//RDU Software//NONSGML HandCal//EN\"\n\ -VERSION:2.0\n\ -BEGIN:VEVENT\n\ -DTSTAMP:19980309T231000Z\n\ -UID:guid-1.host1.com\n\ -ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com\n\ -ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:employee-A@host.com\n\ -DESCRIPTION:Project XYZ Review Meeting\n\ -CATEGORIES:MEETING\n\ -CLASS:PUBLIC\n\ -CREATED:19980309T130000Z\n\ -SUMMARY:XYZ Project Review\n\ -DTSTART;TZID=US-Eastern:19980312T083000\n\ -DTEND;TZID=US-Eastern:19980312T093000\n\ -LOCATION:1CP Conference Room 4350\n\ -END:VEVENT\n\ -END:VCALENDAR\n\ -"; - - -void test_fileset() -{ - icalfileset *cout; - int month = 0; - int count=0; - struct icaltimetype start, end; - icalcomponent *c,*clone, *itr; - - start = icaltime_from_timet( time(0),0); - end = start; - end.hour++; - - cout = icalfileset_new(OUTPUT_FILE); - assert(cout != 0); - - c = icalparser_parse_string(str2); - assert(c != 0); - - /* Add data to the file */ - - for(month = 1; month < 10; month++){ - icalcomponent *event; - icalproperty *dtstart, *dtend; - - cout = icalfileset_new(OUTPUT_FILE); - assert(cout != 0); - - start.month = month; - end.month = month; - - clone = icalcomponent_new_clone(c); - assert(clone !=0); - event = icalcomponent_get_first_component(clone,ICAL_VEVENT_COMPONENT); - assert(event != 0); - - dtstart = icalcomponent_get_first_property(event,ICAL_DTSTART_PROPERTY); - assert(dtstart!=0); - icalproperty_set_dtstart(dtstart,start); - - dtend = icalcomponent_get_first_property(event,ICAL_DTEND_PROPERTY); - assert(dtend!=0); - icalproperty_set_dtend(dtend,end); - - icalfileset_add_component(cout,clone); - icalfileset_commit(cout); - - icalfileset_free(cout); - - } - - - /* Print them out */ - - - cout = icalfileset_new(OUTPUT_FILE); - assert(cout != 0); - - for (itr = icalfileset_get_first_component(cout); - itr != 0; - itr = icalfileset_get_next_component(cout)){ - - icalcomponent *event; - icalproperty *dtstart, *dtend; - - count++; - - event = icalcomponent_get_first_component(itr,ICAL_VEVENT_COMPONENT); - - dtstart = icalcomponent_get_first_property(event,ICAL_DTSTART_PROPERTY); - dtend = icalcomponent_get_first_property(event,ICAL_DTEND_PROPERTY); - - printf("%d %s %s\n",count, icalproperty_as_ical_string(dtstart), - icalproperty_as_ical_string(dtend)); - - } - - /* Remove all of them */ - - icalfileset_free(cout); - - cout = icalfileset_new(OUTPUT_FILE); - assert(cout != 0); - - for (itr = icalfileset_get_first_component(cout); - itr != 0; - itr = icalfileset_get_next_component(cout)){ - - - icalfileset_remove_component(cout, itr); - } - - icalfileset_free(cout); - - - /* Print them out again */ - - cout = icalfileset_new(OUTPUT_FILE); - assert(cout != 0); - count =0; - - for (itr = icalfileset_get_first_component(cout); - itr != 0; - itr = icalfileset_get_next_component(cout)){ - - icalcomponent *event; - icalproperty *dtstart, *dtend; - - count++; - - event = icalcomponent_get_first_component(itr,ICAL_VEVENT_COMPONENT); - - dtstart = icalcomponent_get_first_property(event,ICAL_DTSTART_PROPERTY); - dtend = icalcomponent_get_first_property(event,ICAL_DTEND_PROPERTY); - - printf("%d %s %s\n",count, icalproperty_as_ical_string(dtstart), - icalproperty_as_ical_string(dtend)); - - } - - icalfileset_free(cout); - - -} - - - -int test_dirset() -{ - - icalcomponent *c, *gauge; - icalerrorenum error; - icalcomponent *itr; - icalfileset* cluster; - struct icalperiodtype rtime; - icaldirset *s = icaldirset_new("store"); - int i; - - assert(s != 0); - - rtime.start = icaltime_from_timet( time(0),0); - - cluster = icalfileset_new(OUTPUT_FILE); - - assert(cluster != 0); - -#define NUMCOMP 4 - - /* Duplicate every component in the cluster NUMCOMP times */ - - icalerror_clear_errno(); - - for (i = 1; i<NUMCOMP+1; i++){ - - /*rtime.start.month = i%12;*/ - rtime.start.month = i; - rtime.end = rtime.start; - rtime.end.hour++; - - for (itr = icalfileset_get_first_component(cluster); - itr != 0; - itr = icalfileset_get_next_component(cluster)){ - icalcomponent *clone, *inner; - icalproperty *p; - - inner = icalcomponent_get_first_component(itr,ICAL_VEVENT_COMPONENT); - if (inner == 0){ - continue; - } - - /* Change the dtstart and dtend times in the component - pointed to by Itr*/ - - clone = icalcomponent_new_clone(itr); - inner = icalcomponent_get_first_component(itr,ICAL_VEVENT_COMPONENT); - - assert(icalerrno == ICAL_NO_ERROR); - assert(inner !=0); - - /* DTSTART*/ - p = icalcomponent_get_first_property(inner,ICAL_DTSTART_PROPERTY); - assert(icalerrno == ICAL_NO_ERROR); - - if (p == 0){ - p = icalproperty_new_dtstart(rtime.start); - icalcomponent_add_property(inner,p); - } else { - icalproperty_set_dtstart(p,rtime.start); - } - assert(icalerrno == ICAL_NO_ERROR); - - /* DTEND*/ - p = icalcomponent_get_first_property(inner,ICAL_DTEND_PROPERTY); - assert(icalerrno == ICAL_NO_ERROR); - - if (p == 0){ - p = icalproperty_new_dtstart(rtime.end); - icalcomponent_add_property(inner,p); - } else { - icalproperty_set_dtstart(p,rtime.end); - } - assert(icalerrno == ICAL_NO_ERROR); - - printf("\n----------\n%s\n---------\n",icalcomponent_as_ical_string(inner)); - - error = icaldirset_add_component(s, - icalcomponent_new_clone(itr)); - - assert(icalerrno == ICAL_NO_ERROR); - - } - - } - - gauge = - icalcomponent_vanew( - ICAL_VCALENDAR_COMPONENT, - icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_vanew_summary( - "Submit Income Taxes", - icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_EQUAL), - 0), - 0), - icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_vanew_summary( - "Bastille Day Party", - icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_EQUAL), - 0), - 0), - 0); - -#if 0 - - - icaldirset_select(s,gauge); - - for(c = icaldirset_first(s); c != 0; c = icaldirset_next(s)){ - - printf("Got one! (%d)\n", count++); - - if (c != 0){ - printf("%s", icalcomponent_as_ical_string(c));; - if (icaldirset_store(s2,c) == 0){ - printf("Failed to write!\n"); - } - icalcomponent_free(c); - } else { - printf("Failed to get component\n"); - } - } - - - icaldirset_free(s2); -#endif - - - for(c = icaldirset_get_first_component(s); - c != 0; - c = icaldirset_get_next_component(s)){ - - if (c != 0){ - printf("%s", icalcomponent_as_ical_string(c));; - } else { - printf("Failed to get component\n"); - } - - } - - /* Remove all of the components */ - i=0; - while((c=icaldirset_get_current_component(s)) != 0 ){ - i++; - - icaldirset_remove_component(s,c); - } - - - icaldirset_free(s); - return 0; -} - -#if 0 -void test_calendar() -{ - icalcomponent *comp; - icalfileset *c; - icaldirset *s; - icalcalendar* calendar = icalcalendar_new("calendar"); - icalerrorenum error; - struct icaltimetype atime = icaltime_from_timet( time(0),0,0); - - comp = icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_new_version("2.0"), - icalproperty_new_description("This is an event"), - icalproperty_new_dtstart(atime), - icalproperty_vanew_comment( - "Another Comment", - icalparameter_new_cn("A Common Name 1"), - icalparameter_new_cn("A Common Name 2"), - icalparameter_new_cn("A Common Name 3"), - icalparameter_new_cn("A Common Name 4"), - 0), - icalproperty_vanew_xlicerror( - "This is only a test", - icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_COMPONENTPARSEERROR), - 0), - - 0); - - - s = icalcalendar_get_booked(calendar); - - error = icaldirset_add_component(s,comp); - - assert(error == ICAL_NO_ERROR); - - c = icalcalendar_get_properties(calendar); - - error = icalfileset_add_component(c,icalcomponent_new_clone(comp)); - - assert(error == ICAL_NO_ERROR); - - icalcalendar_free(calendar); - -} -#endif - - -int main(int argc, char *argv[]) -{ - -/* printf("\n------------Test File Set---------------\n"); - test_fileset(); */ - - printf("\n------------Test Dir Set---------------\n"); - test_dirset(); - -#if 0 - - - printf("\n------------Test Calendar---------------\n"); - test_calendar(); - -#endif - - return 0; -} - - - diff --git a/libical/src/test/stow.c b/libical/src/test/stow.c deleted file mode 100644 index e676c677f3..0000000000 --- a/libical/src/test/stow.c +++ /dev/null @@ -1,866 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: stow.c - CREATOR: eric 29 April 2000 - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000 Eric Busboom - http://www.softwarestudio.org - - The contents of this file are subject to the Mozilla Public License - Version 1.0 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and - limitations under the License. - - The Initial Developer of the Original Code is Eric Busboom - - ======================================================================*/ - - -#include <stdio.h> -#include <errno.h> -#include <stdio.h> -#include <string.h> -#include <limits.h> /* for PATH_MAX */ -#include <assert.h> -#include <stdlib.h> -#include <sys/utsname.h> /* for uname */ -#include <sys/stat.h> /* for stat */ -#include <unistd.h> /* for stat, getpid, getopt */ -#include <pwd.h> /* For getpwent */ -#include <sys/types.h> /* For getpwent */ -#include <ctype.h> /* for tolower */ - -#include "ical.h" -#include "icalcalendar.h" -#include "icalfileset.h" -#include "icalmime.h" - -char* program_name; -#define TMPSIZE 2048 -#define SENDMAIL "/usr/lib/sendmail -t" - -void usage(char *message); - -#ifndef PATH_MAX -#define PATH_MAX 256 /* HACK */ -#endif - - -enum options { - STORE_IN_FILE, - STORE_IN_DB, - INPUT_IS_MIME, - INPUT_IS_ICAL, - INPUT_FROM_STDIN, - INPUT_FROM_FILE, - ERRORS_TO_STDOUT, - ERRORS_TO_ORGANIZER -}; - -struct options_struct -{ - enum options storage; - enum options input_type; - enum options input_source; - enum options errors; - char* input_file; - char* calid; - char* output_file; -}; - - -enum file_type -{ - ERROR, - NO_FILE, - DIRECTORY, - REGULAR, - OTHER -}; - -enum file_type test_file(char *path) -{ - struct stat sbuf; - enum file_type type; - - errno = 0; - - /* Check if the path already exists and if it is a directory*/ - if (stat(path,&sbuf) != 0){ - - /* A file by the given name does not exist, or there was - another error */ - if(errno == ENOENT) - { - type = NO_FILE; - } else { - type = ERROR; - } - - } else { - /* A file by the given name exists, but is it a directory? */ - - if (S_ISDIR(sbuf.st_mode)){ - type = DIRECTORY; - } else if(S_ISREG(sbuf.st_mode)){ - type = REGULAR; - } else { - type = OTHER; - } - } - - return type; -} - -char* lowercase(const char* str) -{ - char* p = 0; - char* new = strdup(str); - - if(str ==0){ - return 0; - } - - for(p = new; *p!=0; p++){ - *p = tolower(*p); - } - - return new; -} - -#if 0 -char* get_local_attendee(struct options_struct *opt) -{ - char attendee[PATH_MAX]; - - if(opt->calid){ - - strncpy(attendee,opt->calid,PATH_MAX); - - } else { - - char* user = getenv("USER"); - struct utsname uts; - uname(&utget_option); - /* HACK nodename may not be a fully qualified domain name */ - snprintf(attendee,PATH_MAX,"%s@%s",user,uts.nodename); - - } - - return lowercase(attendee); -} -#endif - - -icalcomponent* get_first_real_component(icalcomponent *comp) -{ - icalcomponent *c; - - for(c = icalcomponent_get_first_component(comp,ICAL_ANY_COMPONENT); - c != 0; - c = icalcomponent_get_next_component(comp,ICAL_ANY_COMPONENT)){ - if (icalcomponent_isa(c) == ICAL_VEVENT_COMPONENT || - icalcomponent_isa(c) == ICAL_VTODO_COMPONENT || - icalcomponent_isa(c) == ICAL_VJOURNAL_COMPONENT ) - { - return c; - } - } - - return 0; -} - - - -char* make_mime(char* to, const char* from, const char* subject, - const char* text_message, const char* method, - const char* ical_message) -{ - size_t size = strlen(to)+strlen(from)+strlen(subject)+ - strlen(text_message)+ strlen(ical_message)+TMPSIZE; - - char mime_part_1[TMPSIZE]; - char mime_part_2[TMPSIZE]; - char content_id[TMPSIZE]; - char boundary[TMPSIZE]; - struct utsname uts; - char* m; - - - if ((m = malloc(sizeof(char)*size)) == 0){ - fprintf(stderr,"%s: Can't allocate memory: %s\n",program_name,strerror(errno)); - exit(1); - } - - uname(&uts); - - srand(time(0)<<getpid()); - sprintf(content_id,"%d-%d@%s",(int)time(0),rand(),uts.nodename); - sprintf(boundary,"%d-%d-%s",(int)time(0),rand(),uts.nodename); - - sprintf(mime_part_1,"Content-ID: %s\n\ -Content-type: text/plain\n\ -Content-Description: Text description of error message\n\n\ -%s\n\n--%s", - content_id,text_message,boundary); - - if(ical_message != 0 && method != 0){ - sprintf(mime_part_2,"Content-ID: %s\n\ -Content-type: text/calendar; method=%s\n\ -Content-Description: iCal component reply\n\n\ -%s\n\n--%s--", - content_id,method,ical_message,boundary); - } - - sprintf(m,"To: %s\n\ -From: %s\n\ -Subject: %s\n\ -MIME-Version: 1.0\n\ -Content-ID: %s\n\ -Content-Type: multipart/mixed; boundary=\"%s\"\n\ -\n\ - This is a multimedia message in MIME format\n\ -\n\ ---%s\n\ -%s\n\ -", - to,from,subject,content_id,boundary,boundary, - mime_part_1); - - if(ical_message != 0 && method != 0){ - strcat(m, mime_part_2); - } else { - strcat(m,"--\n"); - } - - return m; -} - -/* The incoming component had fatal errors */ -void return_failure(icalcomponent* comp, char* message, - struct options_struct *opt) -{ - char* local_attendee = opt->calid; - FILE* p; - - icalcomponent *inner = get_first_real_component(comp); - - icalproperty *organizer_prop = icalcomponent_get_first_property(inner,ICAL_ORGANIZER_PROPERTY); - const char *organizer = icalproperty_get_organizer(organizer_prop); - - organizer += 7; - - if (opt->errors == ERRORS_TO_ORGANIZER){ - p = popen(SENDMAIL,"w"); - } else { - p = stdout; - } - - if(p == 0){ - fprintf(stderr, - "%s: fatal. Could not open pipe to sendmail (\"%s\") \n", - program_name,SENDMAIL); - exit(1); - } - - fputs(make_mime(organizer, local_attendee, "iMIP error", - message, "reply", - icalcomponent_as_ical_string(comp)),p); - - if (opt->errors == ERRORS_TO_ORGANIZER){ - pclose(p); - } -} - -/* The program had a fatal error and could not process the incoming component*/ -void return_error(icalcomponent* comp, char* message, struct options_struct *opt) -{ - - - fputs(make_mime("Dest", "Source", "iMIP system failure", - message, 0,0),stdout); - -} - -icalcomponent* make_reply(icalcomponent *comp, icalproperty *return_status, - struct options_struct *opt) - -{ - icalcomponent *reply, *rinner; - icalcomponent *inner = get_first_real_component(comp); - icalproperty *p=0; - char* local_attendee = opt->calid; - char attendee[TMPSIZE]; - - char prodid[TMPSIZE]; - - snprintf(attendee,TMPSIZE,"mailto:%s",local_attendee); - - snprintf(prodid,TMPSIZE,"-//Softwarestudio.org//%s version %s//EN",ICAL_PACKAGE,ICAL_VERSION); - - /* Create the base component */ - reply = icalcomponent_vanew( - ICAL_VCALENDAR_COMPONENT, - icalproperty_new_version(strdup("2.0")), - icalproperty_new_prodid(strdup(prodid)), - icalproperty_new_method(ICAL_METHOD_REPLY), - icalcomponent_vanew( - ICAL_VEVENT_COMPONENT, - icalproperty_new_clone( - icalcomponent_get_first_property(inner,ICAL_DTSTAMP_PROPERTY)), - icalproperty_new_clone( - icalcomponent_get_first_property(inner,ICAL_ORGANIZER_PROPERTY)), - icalproperty_new_clone( - icalcomponent_get_first_property(inner,ICAL_UID_PROPERTY)), - icalproperty_new_attendee(attendee), - 0), - 0); - - - /* Convert errors into request-status properties and transfers - them to the reply component */ - - icalcomponent_convert_errors(comp); - - rinner = get_first_real_component(reply); - - for(p = icalcomponent_get_first_property(inner, - ICAL_REQUESTSTATUS_PROPERTY); - p != 0; - p = icalcomponent_get_next_property(inner, - ICAL_REQUESTSTATUS_PROPERTY)){ - - icalcomponent_add_property(rinner,icalproperty_new_clone(p)); - } - - if(return_status != 0){ - icalcomponent_add_property(rinner, return_status); - } - - return reply; - -} - -int check_attendee(icalproperty *p, struct options_struct *opt){ - const char* s = icalproperty_get_attendee(p); - char* lower_attendee = lowercase(s); - char* local_attendee = opt->calid; - - /* Check that attendee begins with "mailto:" */ - if (strncmp(lower_attendee,"mailto:",7) == 0){ - /* skip over the mailto: part */ - lower_attendee += 7; - - if(strcmp(lower_attendee,local_attendee) == 0){ - return 1; - } - - lower_attendee -= 7; - - free(lower_attendee); - } - - return 0; -} - -char static_component_error_str[PATH_MAX]; -char* check_component(icalcomponent* comp, icalproperty **return_status, - struct options_struct *opt) -{ - char* component_error_str=0; - icalcomponent* inner; - int errors = 0; - icalproperty *p; - int found_attendee = 0; - - *return_status = 0; - - /* This do/while loop only executes once because it is being used - to fake exceptions */ - - do { - - /* Check that we actually got a component */ - if(comp == 0){ - strcpy(static_component_error_str, - "Did not find a component"); - component_error_str = static_component_error_str; - break; - } - - /* Check that the root component is a VCALENDAR */ - if(icalcomponent_isa(comp) != ICAL_VCALENDAR_COMPONENT){ - strcpy(static_component_error_str, - "Root component is not a VCALENDAR"); - component_error_str = static_component_error_str; - break; - } - - - /* Check that the component has a METHOD */ - - if (icalcomponent_get_first_property(comp,ICAL_METHOD_PROPERTY) == 0) - { - strcpy(static_component_error_str, - "Component does not have a METHOD property"); - component_error_str = static_component_error_str; - break; - } - - inner = get_first_real_component(comp); - - - /* Check that the compopnent has an organizer */ - if(icalcomponent_get_first_property(inner,ICAL_ORGANIZER_PROPERTY) == 0){ - fprintf(stderr,"%s: fatal. Component does not have an ORGANIZER property\n",program_name); - - exit(1); - } - - - /* Check for this user as an attendee or organizer */ - - for(p = icalcomponent_get_first_property(inner,ICAL_ATTENDEE_PROPERTY); - p != 0; - p = icalcomponent_get_next_property(inner,ICAL_ATTENDEE_PROPERTY)){ - - found_attendee += check_attendee(p,opt); - } - - for(p = icalcomponent_get_first_property(inner,ICAL_ORGANIZER_PROPERTY); - p != 0; - p = icalcomponent_get_next_property(inner,ICAL_ORGANIZER_PROPERTY)){ - - found_attendee += check_attendee(p,opt); - } - - if (found_attendee == 0){ - struct icalreqstattype rs; - char* rs_string; - memset(static_component_error_str,0,PATH_MAX); - - snprintf(static_component_error_str,PATH_MAX, - "This target user (%s) is not listed as an attendee or organizer", - opt->calid ); - component_error_str = static_component_error_str; - - rs.code = ICAL_3_7_INVCU_STATUS; - rs.desc = 0; - rs.debug = component_error_str; - rs_string = icalreqstattype_as_string(rs); - - *return_status = icalproperty_new_requeststatus(rs_string); - - break; - } - - - - /* Check that the component passes iTIP restrictions */ - - errors = icalcomponent_count_errors(comp); - icalrestriction_check(comp); - - if(errors != icalcomponent_count_errors(comp)){ - snprintf(static_component_error_str,PATH_MAX, - "The component does not conform to iTIP restrictions.\n Here is the original component; look at the X-LIC-ERROR properties\nfor details\n\n%s",icalcomponent_as_ical_string(comp)); - component_error_str = static_component_error_str; - break; - } - - - - } while(0); - - return component_error_str; -} - - -void usage(char *message) -{ - fprintf(stderr,"Usage: %s [-emdcn] [-i inputfile] [-o outputfile] [-u calid]\n",program_name); - fprintf(stderr,"-e\tInput data is encapsulated in a MIME Message \n\ --m\tInput is raw iCal \n\ --i\tSpecify input file. Otherwise, input comes from stdin\n\ --o\tSpecify file to save incoming message to\n\ --d\tSpecify database to send data to\n\ --u\tSet the calid to store the data to\n\ --n\tSend errors to stdout instead of organizer\n\ -"); - -} - - -void get_options(int argc, char* argv[], struct options_struct *opt) -{ - int c; - extern char *optarg; - extern int optind, optopt; - int errflg=0; - - opt->storage = STORE_IN_FILE; - opt->input_source = INPUT_FROM_STDIN; - opt->input_type = INPUT_IS_ICAL; - opt->input_file = 0; - opt->errors = ERRORS_TO_ORGANIZER; - opt->calid = 0; - opt->output_file = 0; - - - while ((c = getopt(argc, argv, "nemu:o:d:b:c:i:")) != -1) { - switch (c) { - case 'e': { /* Input data is MIME encapsulated */ - opt->input_type = INPUT_IS_MIME; - break; - } - case 'm': { /* Input is iCal. Default*/ - opt->input_type = INPUT_IS_ICAL; - break; - } - case 'i': { /* Input comes from named file */ - opt->input_source = INPUT_FROM_FILE; - opt->input_file = strdup(optarg); - break; - } - case 'o': { /* Output goes to named file. Default*/ - opt->output_file = strdup(optarg); - opt->storage = STORE_IN_FILE; - break; - } - case 'd': { /* Output goes to database */ - fprintf(stderr,"%s: option -d is unimplmented\n",program_name); - opt->storage = STORE_IN_DB; - errflg++; - break; - } - case 'c': { - - break; - } - case 'u': { /* Set the calid for the output database or - file. Default is user name of user running - program */ - opt->calid = strdup(optarg); - break; - } - - case 'n': { /* Dump error to stdout. Default is to - send error to the organizer specified - in the iCal data */ - opt->errors = ERRORS_TO_STDOUT; - break; - } - - case ':': {/* Option given without an operand */ - fprintf(stderr, - "%s: Option -%c requires an operand\n", - program_name,optopt); - errflg++; - break; - } - case '?': { - errflg++; - } - - } - - if (errflg >0){ - usage(""); - exit(1); - } - } - - if(opt->calid == 0){ - /* If no calid specified, use username */ - char attendee[PATH_MAX]; - char* user = getenv("USER"); - struct utsname uts; - uname(&uts); - /* HACK nodename may not be a fully qualified domain name */ - snprintf(attendee,PATH_MAX,"%s@%s",user,uts.nodename); - - opt->calid = lowercase(attendee); - } - - if(opt->storage == STORE_IN_FILE && - opt->output_file ==0){ - char file[PATH_MAX]; - char* user = getenv("USER"); - struct passwd *pw; - - if(!user){ - fprintf(stderr,"%s: Can't get username. Try explicitly specifing the output file with -o", program_name); - exit(1); - } - - /* Find password entry for user */ - while( (pw = getpwent())!=0){ - if(strcmp(user,pw->pw_name)==0){ - break; - } - } - - if(pw==0){ - fprintf(stderr,"%s: Can't get get password entry for user \"%s\" Try explicitly specifing the output file with -o", - program_name,user); - exit(1); - } - - if(pw->pw_dir==0){ - fprintf(stderr,"%s: User \"%s\" has no home directory. Try explicitly specifing the output file with -o", - program_name, user); - exit(1); - } - - snprintf(file,PATH_MAX,"%s/.facs/%s",pw->pw_dir,opt->calid); - - opt->output_file = strdup(file); - } - - - /* Now try to create the calendar directory if it does - not exist */ - - if(opt->storage == STORE_IN_FILE ) { - char * p; - char* facspath = strdup(opt->output_file); - enum file_type type; - - /* Cut off the last slash to make it just a directoy */ - - p = strrchr(facspath,'/'); - - if (p == 0){ - fprintf(stderr,"%s: Invalid calendar filename \"%s\"", - program_name,facspath); - exit(1); - } - - *p='\0'; - - type = test_file(facspath); - - errno = 0; - if (type == NO_FILE){ - - if(mkdir(facspath,0775) != 0){ - fprintf(stderr, - "%s: Failed to create calendar directory %s: %s\n", - program_name,facspath, strerror(errno)); - exit(1); - } else { - fprintf(stderr,"%s: Creating calendar directory %s\n", - program_name,facspath); - } - - } else if(type==REGULAR || type == ERROR){ - fprintf(stderr,"%s: Cannot create calendar directory %s\n", - program_name,facspath); - exit(1); - } - } -} - -char* check_options(struct options_struct *opt) -{ - return 0; -} - -void store_component(icalcomponent *comp, struct options_struct *opt) -{ - icalerrorenum error; - - - if(opt->storage == STORE_IN_FILE){ - icalfileset *fs = icalfileset_new(opt->output_file); - - if (fs == 0){ - fprintf(stderr, - "%s: Failed to get incoming component directory: %s\n", - program_name, icalerror_strerror(icalerrno)); - exit(1); - } - - - error = icalfileset_add_component(fs,comp); - - if (error != ICAL_NO_ERROR){ - fprintf(stderr,"%s: Failed to write incoming component: %s\n", - program_name, icalerror_strerror(icalerrno)); - exit(1); - } - - error = icalfileset_commit(fs); - - if (error != ICAL_NO_ERROR){ - fprintf(stderr,"%s: Failed to commit incoming cluster: %s\n", - program_name, icalerror_strerror(icalerrno)); - exit(1); - } - - icalfileset_free(fs); - - return; - } else { - assert(0); - } -} - -char* read_stream(char *s, size_t size, void *d) -{ - char *c = fgets(s,size, (FILE*)d); - - return c; -} - -icalcomponent* read_nonmime_component(struct options_struct *opt) -{ - FILE *stream; - icalcomponent *comp; - icalparser* parser = icalparser_new(); - char* line; - - if(opt->input_source == INPUT_FROM_FILE){ - stream = fopen(opt->input_file,"r"); - - if (stream == 0){ - perror("Can't open input file"); - exit(1); - } - - } else { - stream = stdin; - } - - assert(stream != 0); - icalparser_set_gen_data(parser,stream); - - do { - line = icalparser_get_line(parser,read_stream); - - comp = icalparser_add_line(parser,line); - - if (comp != 0){ - return comp; - } - - } while ( line != 0); - - if(opt->input_source == INPUT_FROM_FILE){ - fclose(stream); - } - - - return comp; - } - -icalcomponent* find_vcalendar(icalcomponent* comp) -{ - icalcomponent *c,*rtrn; - - for(c = icalcomponent_get_first_component(comp,ICAL_ANY_COMPONENT); - c != 0; - c = icalcomponent_get_next_component(comp,ICAL_ANY_COMPONENT)){ - - if(icalcomponent_isa(c) == ICAL_VCALENDAR_COMPONENT){ - icalcomponent_remove_component(comp,c); - return c; - } - - if((rtrn=find_vcalendar(c)) != 0){ - return rtrn; - } - } - - return 0; -} - -icalcomponent* read_mime_component(struct options_struct *opt) -{ - icalcomponent *comp,*mimecomp; - FILE* stream; - - if(opt->input_source == INPUT_FROM_FILE){ - stream = fopen(opt->input_file,"r"); - - if (stream == 0){ - perror("Can't open input file"); - exit(1); - } - - } else { - stream = stdin; - } - - assert(stream != 0); - - mimecomp = icalmime_parse(read_stream,(void*)stream); - - /* now find the iCal component embedded within the mime component */ - comp = find_vcalendar(mimecomp); - - - if(comp == 0){ - return 0; - } - - return comp; -} - -icalcomponent* read_component(struct options_struct *opt) -{ - if(opt->input_type == INPUT_IS_MIME){ - return read_mime_component(opt); - } else if (opt->input_type == INPUT_IS_ICAL){ - return read_nonmime_component(opt); - } else { - fprintf(stderr,"%s: Internal Error; unknown option for input_type\n", - program_name); - exit(1); - } -} - -int main(int argc, char* argv[] ) -{ - char* options_error_str; - char* component_error_str; - icalcomponent* comp, *reply; - struct options_struct opt; - icalproperty *return_status; - - program_name = strrchr(argv[0],'/'); - - get_options(argc, argv, &opt); - - if ( (options_error_str = check_options(&opt)) != 0 ){ - usage(options_error_str); - exit(1); - } - - comp = read_component(&opt); - - if ( (component_error_str = - check_component(comp,&return_status,&opt)) != 0){ - reply = make_reply(comp,return_status,&opt); - return_failure(reply, component_error_str, &opt); - icalcomponent_free(reply); - exit(0); - } - - store_component(comp,&opt); - - - /* Don't free the component comp, since it is now part of the - store, and will be freed there */ - - exit(0); -} - diff --git a/libical/src/test/testclassify.c b/libical/src/test/testclassify.c deleted file mode 100644 index 2c6c785dfa..0000000000 --- a/libical/src/test/testclassify.c +++ /dev/null @@ -1,156 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: testclassify.c - CREATOR: eric 11 February 2000 - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000 Eric Busboom - http://www.softwarestudio.org - - The contents of this file are subject to the Mozilla Public License - Version 1.0 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and - limitations under the License. - - The Original Code is eric. The Initial Developer of the Original - Code is Eric Busboom - - - ======================================================================*/ - -#include <stdio.h> /* for printf */ -#include "ical.h" -#include <errno.h> -#include <string.h> /* For strerror */ -#include "icalset.h" -#include "icalclassify.h" - - -struct class_map { - ical_class class; - char *str; -} class_map[] = { - {ICAL_NO_CLASS,"No class"}, - {ICAL_PUBLISH_NEW_CLASS,"New Publish"}, - {ICAL_PUBLISH_UPDATE_CLASS,"Update Publish"}, - {ICAL_REQUEST_NEW_CLASS,"New request"}, - {ICAL_REQUEST_UPDATE_CLASS,"Update"}, - {ICAL_REQUEST_RESCHEDULE_CLASS,"Reschedule"}, - {ICAL_REQUEST_DELEGATE_CLASS,"Delegate"}, - {ICAL_REQUEST_NEW_ORGANIZER_CLASS,"New Organizer"}, - {ICAL_REQUEST_FORWARD_CLASS,"Forward"}, - {ICAL_REQUEST_STATUS_CLASS,"Status request"}, - {ICAL_REPLY_ACCEPT_CLASS,"Accept reply"}, - {ICAL_REPLY_DECLINE_CLASS,"Decline reply"}, - {ICAL_REPLY_CRASHER_ACCEPT_CLASS,"Crasher's accept reply"}, - {ICAL_REPLY_CRASHER_DECLINE_CLASS,"Crasher's decline reply"}, - {ICAL_ADD_INSTANCE_CLASS,"Add instance"}, - {ICAL_CANCEL_EVENT_CLASS,"Cancel event"}, - {ICAL_CANCEL_INSTANCE_CLASS,"Cancel instance"}, - {ICAL_CANCEL_ALL_CLASS,"Cancel all instances"}, - {ICAL_REFRESH_CLASS,"Refresh"}, - {ICAL_COUNTER_CLASS,"Counter"}, - {ICAL_DECLINECOUNTER_CLASS,"Decline counter"}, - {ICAL_MALFORMED_CLASS,"Malformed"}, - {ICAL_OBSOLETE_CLASS,"Obsolete"}, - {ICAL_MISSEQUENCED_CLASS,"Missequenced"}, - {ICAL_UNKNOWN_CLASS,"Unknown"} -}; - -char* find_class_string(ical_class class) -{ - int i; - - for (i = 0;class_map[i].class != ICAL_UNKNOWN_CLASS;i++){ - if (class_map[i].class == class){ - return class_map[i].str; - } - } - - return "Unknown"; -} - - -int main(int argc, char* argv[]) -{ - icalcomponent *c; - int i=0; - - icalset* f = icalset_new_file("../../test-data/incoming.ics"); - icalset* cal = icalset_new_file("../../test-data/calendar.ics"); - - assert(f!= 0); - assert(cal!=0); - - - /* Foreach incoming message */ - for(c=icalset_get_first_component(f);c!=0; - c=icalset_get_next_component(f)){ - - ical_class class; - icalcomponent *match; - icalcomponent *inner = icalcomponent_get_first_real_component(c); - icalcomponent *p; - const char *this_uid; - const char *i_x_note=0; - const char *c_x_note=0; - - i++; - - if(inner == 0){ - continue; - } - - p = icalcomponent_get_first_property(inner,ICAL_UID_PROPERTY); - this_uid = icalproperty_get_uid(p); - - assert(this_uid != 0); - - /* Find a booked component that is matched to the incoming - message, based on the incoming component's UID, SEQUENCE - and RECURRENCE-ID*/ - - match = icalset_fetch(cal,this_uid); - - class = icalclassify(c,match,"A@example.com"); - - for(p = icalcomponent_get_first_property(c,ICAL_X_PROPERTY); - p!= 0; - p = icalcomponent_get_next_property(c,ICAL_X_PROPERTY)){ - if(strcmp(icalproperty_get_x_name(p),"X-LIC-NOTE")==0){ - i_x_note = icalproperty_get_x(p); - } - } - - - if(i_x_note == 0){ - i_x_note = "None"; - } - - for(p = icalcomponent_get_first_property(match,ICAL_X_PROPERTY); - p!= 0; - p = icalcomponent_get_next_property(match,ICAL_X_PROPERTY)){ - if(strcmp(icalproperty_get_x_name(p),"X-LIC-NOTE")==0){ - c_x_note = icalproperty_get_x(p); - } - } - - if(c_x_note == 0){ - c_x_note = "None"; - } - - - printf("Test %d\nIncoming: %s\nMatched: %s\nClassification: %s\n\n",i,i_x_note,c_x_note,find_class_string(class)); - } - - return 0; -} - - diff --git a/libical/src/test/testmime.c b/libical/src/test/testmime.c deleted file mode 100644 index 5dfc3b7d31..0000000000 --- a/libical/src/test/testmime.c +++ /dev/null @@ -1,340 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: - CREATOR: eric 25 June 2000 - - $Id$ - $Locker$ - - The contents of this file are subject to the Mozilla Public License - Version 1.0 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and - limitations under the License. - - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - The LGPL as published by the Free Software Foundation, version - 2.1, available at: http://www.fsf.org/copyleft/lesser.html - - Or: - - The Mozilla Public License Version 1.0. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - The Initial Developer of the Original Code is Eric Busboom - - (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - ======================================================================*/ - -#include "ical.h" -#include "sspm.h" -#include "icalmime.h" -#include <stdlib.h> /* For rand */ -#include <string.h> /* for strrchr, strdup*/ -#include <unistd.h> /* for getopt */ - -/*int sspm_parse_mime(struct sspm_part *parts, - size_t max_parts, - struct sspm_action_map *actions, - char* (*get_string)(char *s, size_t size, void* data), - void *get_string_data, - struct sspm_header *first_header - ); -*/ - - - -char* major_type_string[] = { - "TEXT", - "IMAGE", - "AUDIO", - "VIDEO", - "APPLICATION", - "MULTIPART", - "MESSAGE", - "UNKNOWN", - "NO" -}; - -char* minor_type_string[] = { - "ANY", - "PLAIN", - "RFC822", - "DIGEST", - "CALENDAR", - "MIXED", - "RELATED", - "ALTERNATIVE", - "PARALLEL", - "UNKNOWN", - "NO" -}; - - -char* read_stream(char *s, size_t size, void *d) -{ - char *c = fgets(s,size, (FILE*)d); - - return c; - -} - - -int main(int argc, char* argv[]) { - - FILE *f; - int c; - extern char *optarg; - extern int optind, optopt; - int errflg=0; - char* program_name; - - struct options{ - int normal; - int stress; - int base64; - int qp; - int sleep; - int count; - char* input_file; - } opt; - - memset(&opt,0,sizeof(opt)); - - program_name = (char*)strrchr((char*)argv[0],'/'); - program_name++; - - while ((c = getopt(argc, argv, "nsbqi:S:c:")) != -1) { - switch (c) { - case 'i': { /* Input comes from named file */ - opt.input_file = strdup(optarg); - break; - } - case 'n':{ /* Normal */ - - if(opt.stress+opt.base64+opt.qp != 0){ - fprintf(stderr, - "%s: Use only one of n,s,b and q\n", - program_name); - } - opt.normal = 1; - break; - } - case 's':{ /* Stress-test*/ - if(opt.base64+opt.normal+opt.qp != 0){ - fprintf(stderr, - "%s: Use only one of n,s,b and q\n", - program_name); - } - opt.stress = 1; - break; - } - case 'b':{ /* test base64 decoding*/ - if(opt.stress+opt.normal+opt.qp != 0){ - fprintf(stderr, - "%s: Use only one of n,s,b and q\n", - program_name); - } - opt.base64 = 1; - break; - } - case 'q':{ /* test quoted-printable decoding*/ - if(opt.stress+opt.base64+opt.normal != 0){ - fprintf(stderr, - "%s: Use only one of n,s,b and q\n", - program_name); - } - opt.qp = 1; - break; - } - case 'S':{ /* sleep at end of run */ - opt.sleep = atoi(optarg); - break; - } - - case 'c':{ /* number of iterations of stress test */ - opt.count = atoi(optarg); - break; - } - - case ':': {/* Option given without an operand */ - fprintf(stderr, - "%s: Option -%c requires an operand\n", - program_name,optopt); - errflg++; - break; - } - case '?': { - errflg++; - } - } - } - - if (errflg >0){ - fprintf(stderr,"Usage: %s [-n|-s|-b|-q] [-i input_file]\n", - program_name); - exit(1); - } - - if(opt.stress+opt.base64+opt.normal+opt.qp == 0){ - fprintf(stderr, - "%s: Must have one of n,s,b or q\n", - program_name); - } - - if(opt.input_file){ - f = fopen(opt.input_file,"r"); - if (f == 0){ - fprintf(stderr,"Could not open input file \"%s\"\n", - opt.input_file); - exit(1); - } - } else { - f = stdin; - } - - - - if(opt.normal == 1){ - icalcomponent *c; - - c = icalmime_parse(read_stream,f); - - printf("%s\n",icalcomponent_as_ical_string(c)); - - icalcomponent_free(c); - - } else if (opt.stress==1 ){ - /* Read file in by lines, then randomize the lines into a - string buffer */ - - char *array[1024]; - char temp[1024]; - char *buf; - int i,last; - int size; - int non_rand; - int rand_lines; - int r; - int j; - icalcomponent *c; - struct slg_data { - char* pos; - char* str; - } d; - - for(i=0; !feof(f); i++){ - fgets(temp,1024,f); - array[i] = strdup(temp); - size += strlen(temp); - } - last = i; - - buf = malloc(size*2); - assert(buf != 0); - - - for(j=0; j<opt.count; j++){ - - srand(j); - memset(buf,0,size*2); - /* First insert some non-randomized lines */ - non_rand = ((float)rand()/(float)RAND_MAX) * last; - for(i=0;i<non_rand;i++){ - strcat(buf,array[i]); - } - - /* Then, insert some lines at random */ - - rand_lines = last - non_rand; - - for(i=0;i<rand_lines;i++){ - srand(i); - r = ((float)rand()/(float)RAND_MAX) * rand_lines; - strcat(buf,array[r+non_rand]); - - } - - d.pos = 0; - d.str = buf; - - c = icalmime_parse(string_line_generator,&d); - - printf("%s\n",icalcomponent_as_ical_string(c)); - - icalcomponent_free(c); - - } - - free(buf); - - for(i=0; i<last; i++){ - free(array[i]); - } - - } else if(opt.qp == 1){ - char str[4096]; - char conv[4096]; - - memset(str,0,4096); - - while(!feof(f) && fgets(str,4096,f)!=0){ - size_t size; - - size = strlen(str); - memset(conv,0,4096); - decode_quoted_printable(conv,str,&size); - - conv[size] = '\0'; - printf("%s",conv); - memset(str,0,4096); - - } - } else if (opt.base64 == 1) { - char str[4096]; - char conv[4096]; - - memset(str,0,4096); - - while(!feof(f) && fgets(str,4096,f)!=0){ - size_t size; - - size = strlen(str); - memset(conv,0,4096); - decode_base64(conv,str,&size); - - conv[size] = '\0'; - printf("%s",conv); - memset(str,0,4096); - - } - } - - if (opt.sleep != 0){ - sleep(opt.sleep); - } - - if( opt.input_file != 0){ - free(opt.input_file); - } - - icalmemory_free_ring(); - - return 0; - -} - - - - - - - - diff --git a/libical/src/test/testvcal.c b/libical/src/test/testvcal.c deleted file mode 100644 index f82adffcc8..0000000000 --- a/libical/src/test/testvcal.c +++ /dev/null @@ -1,64 +0,0 @@ -/* -*- Mode: C -*- - ====================================================================== - FILE: vcal.c - CREATOR: eric 26 May 2000 - - $Id$ - $Locker$ - - (C) COPYRIGHT 2000 Eric Busboom - http://www.softwarestudio.org - - The contents of this file are subject to the Mozilla Public License - Version 1.0 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and - limitations under the License. - - The Original Code is eric. The Initial Developer of the Original - Code is Eric Busboom - - - ======================================================================*/ - -#include "icalvcal.h" -#include <stdio.h> - -/* Given a vCal data file as its first argument, this program will - print out an equivalent iCal component. - - For instance: - - ./testvcal ../../test-data/user-cal.vcf - -*/ - -int main(int argc, char* argv[]) -{ - VObject *vcal = 0; - icalcomponent *comp; - char* file; - - if (argc != 2){ - file = "../../test-data/user-cal.vcf"; - } else { - file = argv[1]; - } - - - vcal = Parse_MIME_FromFileName(file); - - assert(vcal != 0); - - comp = icalvcal_convert(vcal); - - printf("%s\n",icalcomponent_as_ical_string(comp)); - - return 0; -} - - diff --git a/libical/test-data/.cvsignore b/libical/test-data/.cvsignore deleted file mode 100644 index b840c21800..0000000000 --- a/libical/test-data/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -Makefile.in -Makefile
\ No newline at end of file diff --git a/libical/test-data/0 b/libical/test-data/0 deleted file mode 100644 index ed915ad582..0000000000 --- a/libical/test-data/0 +++ /dev/null @@ -1,7 +0,0 @@ -BEGIN:VCALENDAR -BEGIN:VEVENT -SUMMARY:Bastille Day Party This option indicates that xauth should attempt to break any authority file locks before proceeding. -SUMMARY:Bastille Day Party This option indicates that xauth should - attempt to break any authority file locks before proceeding. -END:VEVENT -END:VCALENDAR diff --git a/libical/test-data/1 b/libical/test-data/1 deleted file mode 100644 index a4d078d47b..0000000000 --- a/libical/test-data/1 +++ /dev/null @@ -1,38 +0,0 @@ -BEGIN:VCALENDAR -PRODID:"-//RDU Software//NONSGML HandCal//EN" -VERSION:2.0 -BEGIN:VTIMEZONE -TZID:US-Eastern -BEGIN:STANDARD -DTSTART:19981025T020000 -RDATE:19981025T020000 -TZOFFSETFROM:-0400 -TZOFFSETTO:-0500 -TZNAME:EST -END:STANDARD -BEGIN:DAYLIGHT -DTSTAR:19990404T020000 -RDATE:19990404T020000 -TZOFFSETFROM:-0500 -TZOFFSETTO:-0400 -TZNAME:EDT -END:DAYLIGHT -END:VTIMEZONE -BEGIN:VEVENT -DTSTAMP:19980309T231000Z -UID:guid-1.host1.com -ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com -ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:employee-A@host.com -ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:mailto:Employee-B@HOST.com -ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MailTo:Eric@Agony.Qualcomm.com -DESCRIPTION:Project XYZ Review Meeting -CATEGORIES:MEETING -CLASS:PUBLIC -CREATED:19980309T130000Z -SUMMARY:XYZ Project Review -DTSTAR;TZID=US-Eastern:19980312T083000 -DTEND;TZID=US-Eastern:19980312T093000 -LOCATION:1CP Conference Room 4350 -END:VEVENT -END:VCALENDAR - diff --git a/libical/test-data/1.1 b/libical/test-data/1.1 deleted file mode 100644 index a7c92c33bd..0000000000 --- a/libical/test-data/1.1 +++ /dev/null @@ -1,13 +0,0 @@ -BEGIN:VCALENDAR -DURATION:P15DT5H0M20S -DURATION:P7W -URL;CN=John Smith:http://example.com/urivalue.html -X-SKI-TITLE;RSVP=TRUE: This is an extension property -SUMMARY:"No Property" -SUMMARY;RSVP=TRUE;RSVP=FALSE:Calendaring Interoperability Planning Meeting -SUMMARY;ALTREP=This is an xname:altrep -SUMMARY;CUTYPE=DESCRIPTION is a keyword:Xname parameter -DTEND:19990605 -DTSTART:19990605T103012 -CATEGORIES;RSVP=TRUE;RSVP=FALSE:one,two -END:VCALENDAR diff --git a/libical/test-data/2 b/libical/test-data/2 deleted file mode 100644 index 50ba609ab3..0000000000 --- a/libical/test-data/2 +++ /dev/null @@ -1,22 +0,0 @@ -BEGIN:VCALENDAR -METHOD:xyz -VERSION:2.0 -PRODID:-//ABC Corporation//NONSGML - My Product//EN -BEGIN:VEVENT -DTSTAMP:19970324T1200Z -SEQUENCE:0 -UID:uid3@host1.com -ORGANIZER:MAILTO:jdoe@host1.com -ATTENDEE;RSVP=TRUE:MAILTO:jsmith@host1.com -DTSTART:19970324T123000Z -DTEND:19970324T210000Z -CATEGORIES:MEETING,PROJECT -CLASS:PUBLIC -SUMMARY:Calendaring Interoperability Planning Meeting -DESCRIPTION:Discuss how we can test c&s interoperability\n - using iCalendar and other IETF standards. -LOCATION:LDB Lobby -ATTACH;FMTTYPE=application/postscript:ftp://xyzCorp.com/pub/conf/bkgrnd.ps -END:VEVENT -END:VCALENDAR diff --git a/libical/test-data/2445.ics b/libical/test-data/2445.ics deleted file mode 100644 index ecf6f106ff..0000000000 --- a/libical/test-data/2445.ics +++ /dev/null @@ -1,331 +0,0 @@ -BEGIN:VCALENDAR -VERSION:2.0 -PRODID:-//hacksw/handcal//NONSGML v1.0//EN -BEGIN:VEVENT -DTSTART:19970714T170000Z -DTEND:19970715T035959Z -SUMMARY:Bastille Day Party -END:VEVENT -END:VCALENDAR - -BEGIN:VEVENT -UID:19970901T130000Z-123401@host.com -DTSTAMP:19970901T130000Z -DTSTART:19970903T163000Z -DTEND:19970903T190000Z -SUMMARY:Annual Employee Review -CLASS:PRIVATE -CATEGORIES:BUSINESS,HUMAN RESOURCES -END:VEVENT - -BEGIN:VEVENT -UID:19970901T130000Z-123402@host.com -DTSTAMP:19970901T130000Z -DTSTART:19970401T163000Z -DTEND:19970402T010000Z -SUMMARY:Laurel is in sensitivity awareness class. -CLASS:PUBLIC -CATEGORIES:BUSINESS,HUMAN RESOURCES -TRANSP:TRANSPARENT -END:VEVENT - -BEGIN:VEVENT -UID:19970901T130000Z-123403@host.com -DTSTAMP:19970901T130000Z -DTSTART:19971102 -SUMMARY:Our Blissful Anniversary -CLASS:CONFIDENTIAL -CATEGORIES:ANNIVERSARY,PERSONAL,SPECIAL OCCASION -RRULE:FREQ=YEARLY -END:VEVENT - -BEGIN:VTODO -UID:19970901T130000Z-123404@host.com -DTSTAMP:19970901T130000Z -DTSTART:19970415T133000Z -DUE:19970416T045959Z -SUMMARY:1996 Income Tax Preparation -CLASS:CONFIDENTIAL -CATEGORIES:FAMILY,FINANCE -PRIORITY:1 -STATUS:NEEDS-ACTION -END:VTODO - -BEGIN:VJOURNAL -UID:19970901T130000Z-123405@host.com -DTSTAMP:19970901T130000Z -DTSTART;VALUE=DATE:19970317 -SUMMARY:Staff meeting minutes -DESCRIPTION:1. Staff meeting: Participants include Joe\, Lisa - and Bob. Aurora project plans were reviewed. There is currently - no budget reserves for this project. Lisa will escalate to - management. Next meeting on Tuesday.\n - 2. Telephone Conference: ABC Corp. sales representative called - to discuss new printer. Promised to get us a demo by Friday.\n - 3. Henry Miller (Handsoff Insurance): Car was totaled by tree. - Is looking into a loaner car. 654-2323 (tel). -END:VJOURNAL -BEGIN:VFREEBUSY -ORGANIZER:MAILTO:jane_doe@host1.com -ATTENDEE:MAILTO:john_public@host2.com -DTSTART:19971015T050000Z -DTEND:19971016T050000Z -DTSTAMP:19970901T083000Z -END:VFREEBUSY - -BEGIN:VFREEBUSY -ORGANIZER:MAILTO:jane_doe@host1.com -ATTENDEE:MAILTO:john_public@host2.com -DTSTAMP:19970901T100000Z -DTSTART:19971015T050000Z -DTEND:19971016T050000Z -FREEBUSY;VALUE=PERIOD:19971015T050000Z/PT8H30M, - 19971015T160000Z/PT5H30M,19971015T223000Z/PT6H30M -URL:http://host2.com/pub/busy/jpublic-01.ifb -COMMENT:This iCalendar file contains busy time information for - the next three months. -END:VFREEBUSY - -BEGIN:VFREEBUSY -ORGANIZER:jsmith@host.com -DTSTART:19980313T141711Z -DTEND:19980410T141711Z -FREEBUSY:19980314T233000Z/19980315T003000Z -FREEBUSY:19980316T153000Z/19980316T163000Z -FREEBUSY:19980318T030000Z/19980318T040000Z -URL:http://www.host.com/calendar/busytime/jsmith.ifb -END:VFREEBUSY -BEGIN:VTIMEZONE -TZID:US-Eastern -LAST-MODIFIED:19870101T000000Z -BEGIN:STANDARD -DTSTART:19971026T020000 -RDATE:19971026T020000 -TZOFFSETFROM:-0400 -TZOFFSETTO:-0500 -TZNAME:EST -END:STANDARD -BEGIN:DAYLIGHT -DTSTART:19971026T020000 -RDATE:19970406T020000 -TZOFFSETFROM:-0500 -TZOFFSETTO:-0400 -TZNAME:EDT -END:DAYLIGHT -END:VTIMEZONE -BEGIN:VTIMEZONE -TZID:US-Eastern -LAST-MODIFIED:19870101T000000Z -TZURL:http://zones.stds_r_us.net/tz/US-Eastern -BEGIN:STANDARD -DTSTART:19671029T020000 -RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 -TZOFFSETFROM:-0400 -TZOFFSETTO:-0500 -TZNAME:EST -END:STANDARD -BEGIN:DAYLIGHT -DTSTART:19870405T020000 -RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4 -TZOFFSETFROM:-0500 -TZOFFSETTO:-0400 -TZNAME:EDT -END:DAYLIGHT -END:VTIMEZONE -BEGIN:VTIMEZONE -TZID:US--Fictitious-Eastern -LAST-MODIFIED:19870101T000000Z -BEGIN:STANDARD -DTSTART:19671029T020000 -RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 -TZOFFSETFROM:-0400 -TZOFFSETTO:-0500 -TZNAME:EST -END:STANDARD -BEGIN:DAYLIGHT -DTSTART:19870405T020000 -RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z -TZOFFSETFROM:-0500 -TZOFFSETTO:-0400 -TZNAME:EDT -END:DAYLIGHT -END:VTIMEZONE -BEGIN:VTIMEZONE -TZID:US--Fictitious-Eastern -LAST-MODIFIED:19870101T000000Z -BEGIN:STANDARD -DTSTART:19671029T020000 -RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 -TZOFFSETFROM:-0400 -TZOFFSETTO:-0500 -TZNAME:EST -END:STANDARD -BEGIN:DAYLIGHT -DTSTART:19870405T020000 -RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z -TZOFFSETFROM:-0500 -TZOFFSETTO:-0400 -TZNAME:EDT -END:DAYLIGHT -BEGIN:DAYLIGHT -DTSTART:19990424T020000 -RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=4 -TZOFFSETFROM:-0500 -TZOFFSETTO:-0400 -TZNAME:EDT -END:DAYLIGHT -END:VTIMEZONE -BEGIN:VALARM -TRIGGER;VALUE=DATE-TIME:19970317T133000Z -REPEAT:4 -DURATION:PT15M -ACTION:AUDIO -ATTACH;FMTTYPE=audio/basic:ftp://host.com/pub/sounds/bell-01.aud -END:VALARM -BEGIN:VALARM -TRIGGER:-PT30M -REPEAT:2 -DURATION:PT15M -ACTION:DISPLAY -DESCRIPTION:Breakfast meeting with executive\n - team at 8:30 AM EST. -END:VALARM -BEGIN:VALARM -TRIGGER:-P2D -ACTION:EMAIL -ATTENDEE:MAILTO:john_doe@host.com -SUMMARY:*** REMINDER: SEND AGENDA FOR WEEKLY STAFF MEETING *** -DESCRIPTION:A draft agenda needs to be sent out to the attendees - to the weekly managers meeting (MGR-LIST). Attached is a - pointer the document template for the agenda file. -ATTACH;FMTTYPE=application/binary:http://host.com/templates/agen - da.doc -END:VALARM -BEGIN:VALARM -TRIGGER;VALUE=DATE-TIME:19980101T050000Z -REPEAT:23 -DURATION:PT1H -ACTION:PROCEDURE -ATTACH;FMTTYPE=application/binary:ftp://host.com/novo- - procs/felizano.exe -END:VALARM - -BEGIN:VCALENDAR -PRODID:-//RDU Software//NONSGML HandCal//EN -VERSION:2.0 -BEGIN:VTIMEZONE -TZID:US-Eastern -BEGIN:STANDARD -DTSTART:19981025T020000 -RDATE:19981025T020000 -TZOFFSETFROM:-0400 -TZOFFSETTO:-0500 -TZNAME:EST -END:STANDARD -BEGIN:DAYLIGHT -DTSTART:19990404T020000 -RDATE:19990404T020000 -TZOFFSETFROM:-0500 -TZOFFSETTO:-0400 -TZNAME:EDT -END:DAYLIGHT -END:VTIMEZONE -BEGIN:VEVENT -DTSTAMP:19980309T231000Z -UID:guid-1.host1.com -ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com -ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP: - MAILTO:employee-A@host.com -DESCRIPTION:Project XYZ Review Meeting -CATEGORIES:MEETING -CLASS:PUBLIC -CREATED:19980309T130000Z -SUMMARY:XYZ Project Review -DTSTART;TZID=US-Eastern:19980312T083000 -DTEND;TZID=US-Eastern:19980312T093000 -LOCATION:1CP Conference Room 4350 -END:VEVENT -END:VCALENDAR - - -BEGIN:VCALENDAR -METHOD:PUBLISH -VERSION:2.0 -PRODID:-//ABC Corporation//NONSGML My Product//EN -BEGIN:VEVENT -DTSTAMP:19970324T120000Z -SEQUENCE:0 -UID:uid3@host1.com -ORGANIZER:MAILTO:jdoe@host1.com -DTSTART:19970324T123000Z -DTEND:19970324T210000Z -CATEGORIES:MEETING,PROJECT -CLASS:PUBLIC -SUMMARY:Calendaring Interoperability Planning Meeting -DESCRIPTION:Discuss how we can test c&s interoperability\n - using iCalendar and other IETF standards. -LOCATION:LDB Lobby -ATTACH;FMTTYPE=application/postscript:ftp://xyzCorp.com/pub/ - conf/bkgrnd.ps -END:VEVENT -END:VCALENDAR - -BEGIN:VCALENDAR -VERSION:2.0 -PRODID:-//ABC Corporation//NONSGML My Product//EN -BEGIN:VTODO -DTSTAMP:19980130T134500Z -SEQUENCE:2 -UID:uid4@host1.com -ORGANIZER:MAILTO:unclesam@us.gov -ATTENDEE;PARTSTAT=ACCEPTED:MAILTO:jqpublic@host.com -DUE:19980415T235959 -STATUS:NEEDS-ACTION -SUMMARY:Submit Income Taxes -BEGIN:VALARM -ACTION:AUDIO -TRIGGER:P1DT25M -ATTACH;FMTTYPE=audio/basic:http://host.com/pub/audio- - files/ssbanner.aud -REPEAT:4 -DURATION:PT1H -END:VALARM -END:VTODO -END:VCALENDAR - -BEGIN:VCALENDAR -VERSION:2.0 -PRODID:-//ABC Corporation//NONSGML My Product//EN -BEGIN:VJOURNAL -DTSTAMP:19970324T120000Z -UID:uid5@host1.com -ORGANIZER:MAILTO:jsmith@host.com -STATUS:DRAFT -CLASS:PUBLIC -CATEGORIES:Project Report, XYZ, Weekly Meeting -DESCRIPTION:Project xyz Review Meeting Minutes\n - Agenda\n1. Review of project version 1.0 requirements.\n2. - Definition - of project processes.\n3. Review of project schedule.\n - Participants: John Smith\, Jane Doe\, Jim Dandy\n-It was - decided that the requirements need to be signed off by - product marketing.\n-Project processes were accepted.\n - -Project schedule needs to account for scheduled holidays - and employee vacation time. Check with HR for specific - dates.\n-New schedule will be distributed by Friday.\n- - Next weeks meeting is cancelled. No meeting until 3/23. -END:VJOURNAL -END:VCALENDAR -BEGIN:VCALENDAR -VERSION:2.0 -PRODID:-//RDU Software//NONSGML HandCal//EN -BEGIN:VFREEBUSY -ORGANIZER:MAILTO:jsmith@host.com -DTSTART:19980313T141711Z -DTEND:19980410T141711Z -FREEBUSY:19980314T233000Z/19980315T003000Z -FREEBUSY:19980316T153000Z/19980316T163000Z -FREEBUSY:19980318T030000Z/19980318T040000Z -URL:http://www.host.com/calendar/busytime/jsmith.ifb -END:VFREEBUSY -END:VCALENDAR diff --git a/libical/test-data/2446.ics b/libical/test-data/2446.ics deleted file mode 100644 index c6e2359aa1..0000000000 --- a/libical/test-data/2446.ics +++ /dev/null @@ -1,1006 +0,0 @@ - -BEGIN:VCALENDAR -METHOD:PUBLISH -PRODID:-//ACME/DesktopCalendar//EN -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:mailto:a@example.com -DTSTART:19970701T200000Z -DTSTAMP:19970611T190000Z -SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES -UID:0981234-1234234-23@example.com -END:VEVENT -END:VCALENDAR - -BEGIN:VCALENDAR -METHOD:PUBLISH -VERSION:2.0 -PRODID:-//ACME/DesktopCalendar//EN -BEGIN:VEVENT -ORGANIZER:mailto:a@example.com -DTSTAMP:19970612T190000Z -DTSTART:19970701T210000Z -DTEND:19970701T230000Z -SEQUENCE:1 -UID:0981234-1234234-23@example.com -SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES -END:VEVENT -END:VCALENDAR - -BEGIN:VCALENDAR -METHOD:CANCEL -VERSION:2.0 -PRODID:-//ACME/DesktopCalendar//EN -BEGIN:VEVENT -ORGANIZER:mailto:a@example.com -COMMENT:DUKES forfeit the game -SEQUENCE:2 -UID:0981234-1234234-23@example.com -DTSTAMP:19970613T190000Z -END:VEVENT -END:VCALENDAR - -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:PUBLISH -CALSCALE:GREGORIAN -VERSION:2.0 -BEGIN:VTIMEZONE -TZID:America-Chicago -TZURL:http://zones.stds_r_us.net/tz/America-Chicago -BEGIN:STANDARD -DTSTART:19671029T020000 -RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 -TZOFFSETFROM:-0500 -TZOFFSETTO:-0600 -TZNAME:CST -END:STANDARD -BEGIN:DAYLIGHT -DTSTART:19870405T020000 -RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4 -TZOFFSETFROM:-0600 -TZOFFSETTO:-0500 -TZNAME:CDT -END:DAYLIGHT -END:VTIMEZONE -BEGIN:VEVENT -ORGANIZER:mailto:a@example.com -ATTACH:http://www.dukes.com/ -CATEGORIES:SPORTS EVENT,ENTERTAINMENT -CLASS:PRIVATE -DESCRIPTION:MIDWAY STADIUM\n - Big time game. MUST see.\n - Expected duration:2 hours\n -DTEND;TZID=America-Chicago:19970701T180000 -DTSTART;TZID=America-Chicago:19970702T160000 -DTSTAMP:19970614T190000Z -STATUS:CONFIRMED -LOCATION;VALUE=URI:http://www.midwaystadium.com/ -PRIORITY:2 -RESOURCES:SCOREBOARD -SEQUENCE:3 -SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES -UID:0981234-1234234-23@example.com -RELATED-TO:0981234-1234234-14@example.com -BEGIN:VALARM -TRIGGER:-PT2H -ACTION:DISPLAY -DESCRIPTION:You should be leaving for the game now. -END:VALARM -BEGIN:VALARM -TRIGGER:-PT30M -ACTION:AUDIO -END:VALARM -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:PUBLISH -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:mailto:a@example.com -DTSTAMP:19970614T190000Z -UID:0981234-1234234-23@example.com -DTSTART;VALUE=DATE:19970714 -RRULE:FREQ=YEARLY;INTERVAL=1 -SUMMARY: Bastille Day -END:VEVENT -END:VCALENDAR - -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REQUEST -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN=BIG A:Mailto:A@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=B:Mailto:B@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=C:Mailto:C@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:Mailto:D@example.com -ATTENDEE;RSVP=FALSE;CUTYPE=ROOM:conf_Big@example.com -ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:Mailto:E@example.com -DTSTAMP:19970611T190000Z -DTSTART:19970701T200000Z -DTEND:19970701T200000Z -SUMMARY:Conference -UID:calsrv.example.com-873970198738777@example.com -SEQUENCE:0 -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR - -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REPLY -VERSION:2.0 -BEGIN:VEVENT -ATTENDEE;PARTSTAT=ACCEPTED:Mailto:B@example.com -ORGANIZER:MAILTO:A@example.com -UID:calsrv.example.com-873970198738777@example.com -SEQUENCE:0 -REQUEST-STATUS:2.0;Success -DTSTAMP:19970612T190000Z -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REQUEST -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:C@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:Mailto:D@example.com -ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE; - CUTYPE=ROOM:Mailto:Conf@example.com -ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:Mailto:E@example.com -DTSTART:19970701T180000Z -DTEND:19970701T190000Z -SUMMARY:Phone Conference -UID:calsrv.example.com-873970198738777@example.com -SEQUENCE:1 -DTSTAMP:19970613T190000Z -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REQUEST -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:C@example.com -DTSTART:19970701T190000Z -DTEND:19970701T200000Z -SUMMARY:Discuss the Merits of the election results -LOCATION:Green Conference Room -UID:calsrv.example.com-873970198738777a@example.com -SEQUENCE:0 -DTSTAMP:19970611T190000Z -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR - -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:COUNTER -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:C@example.com -DTSTART:19970701T160000Z -DTEND:19970701T190000Z -DTSTAMP:19970612T190000Z -SUMMARY:Discuss the Merits of the election results -LOCATION:Green Conference Room -COMMENT:This time works much better and I think the big conference - room is too big -UID:calsrv.example.com-873970198738777a@example.com -SEQUENCE:0 -END:VEVENT -END:VCALENDAR - -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REQUEST -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:C@example.com -DTSTAMP:19970613T190000Z -DTSTART:19970701T160000Z -DTEND:19970701T190000Z -SUMMARY:Discuss the Merits of the election results - changed to - meet B's schedule -LOCATION:Green Conference Room -UID:calsrv.example.com-873970198738777@example.com -SEQUENCE:1 -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:DECLINECOUNTER -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:Mailto:A@example.com -COMMENT:Sorry\, I cannot change this meeting time -UID:calsrv.example.com-873970198738777@example.com -DTSTAMP:19970614T190000Z -END:VEVENT -END:VCALENDAR - -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REPLY -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:MAILTO:A@Example.com -ATTENDEE;PARTSTAT=DELEGATED;DELEGATED- - TO="Mailto:E@example.com":Mailto:C@example.com -UID:calsrv.example.com-873970198738777@example.com -SEQUENCE:0 -REQUEST-STATUS:2.0;Success -DTSTAMP:19970611T190000Z -END:VEVENT -END:VCALENDAR - -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REQUEST -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:Mailto:A@example.com -ATTENDEE;PARTSTAT=DELEGATED;DELEGATED- - TO="Mailto:E@example.com":Mailto:C@example.com -ATTENDEE;RSVP=TRUE; - DELEGATED-FROM="Mailto:C@example.com":Mailto:E@example.com -DTSTART:19970701T180000Z -DTEND:19970701T200000Z -SUMMARY:Phone Conference -UID:calsrv.example.com-873970198738777@example.com -SEQUENCE:0 -STATUS:CONFIRMED -DTSTAMP:19970611T190000Z -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REPLY -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:MAILTO:A@Example.com -ATTENDEE;PARTSTAT=ACCEPTED;DELEGATED- - FROM="Mailto:C@example.com":Mailto:E@example.com -UID:calsrv.example.com-873970198738777@example.com -SEQUENCE:0 -REQUEST-STATUS:2.0;Success -DTSTAMP:19970614T190000Z -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REPLY -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:MAILTO:A@Example.com -ATTENDEE;PARTSTAT=DELEGATED; - DELEGATED-TO="Mailto:E@example.com":Mailto:C@example.com -COMMENT:Sorry\, I will be out of town at that time. -UID:calsrv.example.com-873970198738777@example.com -SEQUENCE:0 -REQUEST-STATUS:2.0;Success -DTSTAMP:19970614T190000Z -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REQUEST -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:MAILTO:A@Example.com -ATTENDEE;PARTSTAT=DECLINED; - DELEGATED-FROM="Mailto:C@example.com":Mailto:E@example.com -ATTENDEE;RSVP=TRUE:Mailto:C@example.com -UID:calsrv.example.com-873970198738777@example.com -SEQUENCE:0 -SUMMARY:Phone Conference -DTSTART:19970701T180000Z -DTEND:19970701T200000Z -DTSTAMP:19970614T200000Z -COMMENT:DELEGATE (ATTENDEE Mailto:E@example.com) DECLINED YOUR - INVITATION -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:CANCEL -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:Mailto:A@example.com -ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:A@example.com -ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:B@example.com -ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:C@example.com -ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:D@example.com -COMMENT:Mr. B cannot attend. It's raining. Lets cancel. -UID:calsrv.example.com-873970198738777@example.com -SEQUENCE:1 -STATUS:CANCELLED -DTSTAMP:19970613T190000Z -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:CANCEL -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:Mailto:A@example.com -ATTENDEE:mailto:B@example.com -COMMENT:You're off the hook for this meeting -UID:calsrv.example.com-873970198738777@example.com -DTSTAMP:19970613T193000Z -SEQUENCE:1 -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REQUEST -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com -ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:C@example.com -ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:D@example.com -ATTENDEE;CUTYPE=ROOM:CR_Big@example.com -ATTENDEE;ROLE=NON-PARTICIPANT; - RSVP=FALSE:Mailto:E@example.com -DTSTAMP:19970611T190000Z -DTSTART:19970701T200000Z -DTEND:19970701T203000Z -SUMMARY:Phone Conference -UID:calsrv.example.com-873970198738777@example.com -SEQUENCE:2 -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REQUEST -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:Mailto:B@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:B@example.com -ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:C@example.com -ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:D@example.com -DTSTAMP:19970611T190000Z -DTSTART:19970701T200000Z -DTEND:19970701T203000Z -RRULE:FREQ=WEEKLY -SUMMARY:Phone Conference -UID:123456@example.com -SEQUENCE:1 -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -VERSION:2.0 -METHOD:PUBLISH -BEGIN:VFREEBUSY -DTSTAMP:19980101T124100Z -ORGANIZER:MAILTO:A@Example.com -DTSTART:19980101T124200Z -DTEND:19980107T124200Z -FREEBUSY:19980101T180000Z/19980101T190000Z -FREEBUSY:19980103T020000Z/19980103T050000Z -FREEBUSY:19980107T020000Z/19980107T050000Z -FREEBUSY:19980113T000000Z/19980113T010000Z -FREEBUSY:19980115T190000Z/19980115T200000Z -FREEBUSY:19980115T220000Z/19980115T230000Z -FREEBUSY:19980116T013000Z/19980116T043000Z -END:VFREEBUSY -END:VCALENDAR -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REQUEST -VERSION:2.0 -BEGIN:VFREEBUSY -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR:Mailto:A@example.com -ATTENDEE:Mailto:B@example.com -ATTENDEE:Mailto:C@example.com -DTSTAMP:19970613T190000Z -DTSTART:19970701T080000Z -DTEND:19970701T200000 -UID:calsrv.example.com-873970198738777@example.com -END:VFREEBUSY -END:VCALENDAR -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REPLY -VERSION:2.0 -BEGIN:VFREEBUSY -ORGANIZER:MAILTO:A@example.com -ATTENDEE:Mailto:B@example.com -DTSTART:19970701T080000Z -DTEND:19970701T200000Z -UID:calsrv.example.com-873970198738777@example.com -FREEBUSY:19970701T090000Z/PT1H,19970701T140000Z/PT30M -DTSTAMP:19970613T190030Z -END:VFREEBUSY -END:VCALENDAR -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REQUEST -VERSION:2.0 -BEGIN:VTIMEZONE -TZID:America-SanJose -TZURL:http://zones.stds_r_us.net/tz/America-SanJose -BEGIN:STANDARD -DTSTART:19671029T020000 -RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 -TZOFFSETFROM:-0700 -TZOFFSETTO:-0800 -TZNAME:PST -END:STANDARD -BEGIN:DAYLIGHT -DTSTART:19870405T020000 -RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4 -TZOFFSETFROM:-0800 -TZOFFSETTO:-0700 -TZNAME:PDT -END:DAYLIGHT -END:VTIMEZONE -BEGIN:VEVENT -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CUTYPE=INDIVIDUAL:A@example.COM -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:B@example.fr -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:c@example.jp -DTSTAMP:19970613T190030Z -DTSTART;TZID=America-SanJose:19970701T140000 -DTEND;TZID=America-SanJose:19970701T150000 -RRULE:FREQ=WEEKLY;INTERVAL=20;WKST=SU;BYDAY=TU -RDATE;TZID=America-SanJose:19970910T140000 -EXDATE;TZID=America-SanJose:19970909T140000 -EXDATE;TZID=America-SanJose:19971028T140000 -SUMMARY:Weekly Phone Conference -UID:calsrv.example.com-873970198738777@example.com -SEQUENCE:0 -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -METHOD:REQUEST -PRODID:-//RDU Software//NONSGML HandCal//EN -VERSION:2.0 -BEGIN:VEVENT -UID:guid-1@host1.com -SEQUENCE:0 -RRULE:FREQ=MONTHLY;BYMONTHDAY=1;UNTIL=19980901T210000Z -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com -ATTENDEE:Mailto:B@example.com -ATTENDEE:Mailto:C@example.com -ATTENDEE:Mailto:D@example.com -DESCRIPTION:IETF-C&S Conference Call -CLASS:PUBLIC -SUMMARY:IETF Calendaring Working Group Meeting -DTSTART:19970601T210000Z -DTEND:19970601T220000Z -LOCATION:Conference Call -DTSTAMP:19970526T083000Z -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -METHOD:REQUEST -PRODID:-//RDU Software//NONSGML HandCal//EN -VERSION:2.0 -BEGIN:VEVENT -UID:guid-1@host1com -RECURRENCE-ID:19970701T210000Z -SEQUENCE:1 -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com -ATTENDEE:Mailto:B@example.com -ATTENDEE:Mailto:C@example.com -ATTENDEE:Mailto:D@example.com -DESCRIPTION:IETF-C&S Conference Call -CLASS:PUBLIC -SUMMARY:IETF Calendaring Working Group Meeting -DTSTART:19970703T210000Z -DTEND:19970703T220000Z -LOCATION:Conference Call -DTSTAMP:19970626T093000Z -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -METHOD:CANCEL -PRODID:-//RDU Software//NONSGML HandCal//EN -VERSION:2.0 -BEGIN:VEVENT -UID:guid-1@host1.com -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com -ATTENDEE:Mailto:B@example.com -ATTENDEE:Mailto:C@example.com -ATTENDEE:Mailto:D@example.com -RECURRENCE-ID:19970801T210000Z -SEQUENCE:2 -STATUS:CANCELLED -DTSTAMP:19970721T093000Z -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -METHOD:CANCEL -PRODID:-//RDU Software//NONSGML HandCal//EN -VERSION:2.0 -BEGIN:VEVENT -UID:guid-1@host1.com -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com -ATTENDEE:Mailto:B@example.com -ATTENDEE:Mailto:C@example.com -ATTENDEE:Mailto:D@example.com -DTSTAMP:19970721T103000Z -STATUS:CANCELLED -SEQUENCE:3 -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -METHOD:REQUEST -PRODID:-//RDU Software//NONSGML HandCal//EN -VERSION:2.0 -BEGIN:VEVENT -UID:guid-1@host1.com -RECURRENCE-ID;RANGE=THISANDFUTURE:19970901T210000Z -SEQUENCE:3 -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com -ATTENDEE;RSVP=TRUE:Mailto:B@example.com -ATTENDEE;RSVP=TRUE:Mailto:C@example.com -ATTENDEE;RSVP=TRUE:Mailto:D@example.com -DESCRIPTION:IETF-C&S Discussion -CLASS:PUBLIC -SUMMARY:IETF Calendaring Working Group Meeting -DTSTART:19970901T210000Z -DTEND:19970901T220000Z -LOCATION:Building 32\, Microsoft\, Seattle\, WA -DTSTAMP:19970526T083000Z -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -METHOD:ADD -PRODID:-//RDU Software//NONSGML HandCal//EN -VERSION:2.0 -BEGIN:VEVENT -UID:123456789@host1.com -SEQUENCE:4 -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com -ATTENDEE;RSVP=TRUE:Mailto:B@example.com -ATTENDEE;RSVP=TRUE:Mailto:C@example.com -ATTENDEE;RSVP=TRUE:Mailto:D@example.com -DESCRIPTION:IETF-C&S Conference Call -CLASS:PUBLIC -SUMMARY:IETF Calendaring Working Group Meeting -DTSTART:19970715T210000Z -DTEND:19970715T220000Z -LOCATION:Conference Call -DTSTAMP:19970629T093000Z -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -METHOD:REQUEST -PRODID:-//RDU Software//NONSGML HandCal//EN -VERSION:2.0 -BEGIN:VEVENT -UID:123456789@host1.com -SEQUENCE:0 -RRULE:FREQ=WEEKLY;WKST=SU;BYDAY=TU -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com -ATTENDEE;RSVP=TRUE:Mailto:B@example.com -SUMMARY:Review Accounts -DTSTART:19980303T210000Z -DTEND:19980303T220000Z -LOCATION:The White Room -DTSTAMP:19980301T093000Z -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -METHOD:ADD -PRODID:-//RDU Software//NONSGML HandCal//EN -VERSION:2.0 -BEGIN:VEVENT -UID:123456789@host1.com -SEQUENCE:7 -RRULE:FREQ=WEEKLY;WKST=SU;BYDAY=TH -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com -ATTENDEE;RSVP=TRUE:Mailto:B@example.com -SUMMARY:Review Accounts -DTSTART:19980303T210000Z -DTEND:19980303T220000Z -DTSTAMP:19980303T193000Z -LOCATION:The Usual conference room -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -METHOD:REQUEST -PRODID:-//RDU Software//NONSGML HandCal//EN -VERSION:2.0 -BEGIN:VEVENT -UID:123456789@host1.com -SEQUENCE:7 -RRULE:FREQ=WEEKLY;WKST=SU;BYDAY=TU,TH -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com -ATTENDEE;RSVP=TRUE:Mailto:B@example.com -SUMMARY:Review Accounts -DTSTART:19980303T210000Z -DTEND:19980303T220000Z -DTSTAMP:19980303T193000Z -LOCATION:The White Room -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -METHOD:REQUEST -PRODID:-//RDU Software//NONSGML HandCal//EN -VERSION:2.0 -BEGIN:VEVENT -UID:123456789@host1.com -SEQUENCE:0 -RDATE:19980304T180000Z -RDATE:19980311T180000Z -RDATE:19980318T180000Z -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com -ATTENDEE;RSVP=TRUE:Mailto:B@example.com -SUMMARY:Review Accounts -DTSTART:19980304T180000Z -DTEND:19980304T200000Z -DTSTAMP:19980303T193000Z -LOCATION:Conference Room A -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -METHOD:REQUEST -PRODID:-//RDU Software//NONSGML HandCal//EN -VERSION:2.0 -BEGIN:VEVENT -UID:123456789@host1.com -SEQUENCE:1 -RECURRENCE-ID:19980311T180000Z -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com -ATTENDEE;RSVP=TRUE:Mailto:B@example.com -SUMMARY:Review Accounts -DTSTART:19980311T160000Z -DTEND:19980311T180000Z -DTSTAMP:19980306T193000Z -LOCATION:The Small conference room -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -METHOD:ADD -PRODID:-//RDU Software//NONSGML HandCal//EN -VERSION:2.0 -BEGIN:VEVENT -UID:123456789@host1.com -SEQUENCE:2 -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com -ATTENDEE;RSVP=TRUE:Mailto:B@example.com -SUMMARY:Review Accounts -DTSTART:19980315T180000Z -DTEND:19980315T200000Z -DTSTAMP:19980307T193000Z -LOCATION:Conference Room A -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -METHOD:REQUEST -PRODID:-//RDU Software//NONSGML HandCal//EN -VERSION:2.0 -BEGIN:VEVENT -UID:123456789@host1.com -SEQUENCE:2 -RDATE:19980304T180000Z -RDATE:19980311T160000Z -RDATE:19980315T180000Z -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com -ATTENDEE;RSVP=TRUE:Mailto:B@example.com -SUMMARY:Review Accounts -DTSTART:19980304T180000Z -DTEND:19980304T200000Z -DTSTAMP:19980303T193000Z -LOCATION:Conference Room A -STATUS:CONFIRMED -END:VEVENT -BEGIN:VEVENT -SEQUENCE:2 -RECURRENCE-ID:19980311T160000Z -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com -ATTENDEE;RSVP=TRUE:Mailto:B@example.com -SUMMARY:Review Accounts -DTSTART:19980311T160000Z -DTEND:19980304T180000Z -DTSTAMP:19980306T193000Z -ORGANIZER:Mailto:A@example.com -LOCATION:The Small conference room -UID:guid-1@host1.com -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -METHOD:COUNTER -PRODID:-//RDU Software//NONSGML HandCal//EN -VERSION:2.0 -BEGIN:VEVENT -UID:guid-1@host1.com -RECURRENCE-ID:19970715T210000Z -SEQUENCE:4 -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;RSVP=TRUE:Mailto:A@example.com -ATTENDEE;RSVP=TRUE:Mailto:B@example.com -ATTENDEE;RSVP=TRUE:Mailto:C@example.com -ATTENDEE;RSVP=TRUE:Mailto:D@example.com -DESCRIPTION:IETF-C&S Conference Call -CLASS:PUBLIC -SUMMARY:IETF Calendaring Working Group Meeting -DTSTART:19970715T220000Z -DTEND:19970715T230000Z -LOCATION:Conference Call -COMMENT:May we bump this by an hour? I have a conflict -DTSTAMP:19970629T094000Z -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -METHOD:REQUEST -PRODID:-//RDU Software//NONSGML HandCal//EN -VERSION:2.0 -BEGIN:VEVENT -UID:guid-1@host1.com -SEQUENCE:0 -RRULE:FREQ=MONTHLY;BYMONTHDAY=1 -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR:Mailto:A@example.com -ATTENDEE;RSVP=TRUE:Mailto:B@example.com -ATTENDEE;RSVP=TRUE:Mailto:C@example.com -ATTENDEE;RSVP=TRUE:Mailto:D@example.com -DESCRIPTION:IETF-C&S Conference Call -CLASS:PUBLIC -SUMMARY:IETF Calendaring Working Group Meeting -DTSTART:19970601T210000Z -DTEND:19970601T220000Z -DTSTAMP:19970602T094000Z -LOCATION:Conference Call -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -PRODID:-//RDU Software//NONSGML HandCal//EN -METHOD:REPLY -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:Mailto:A@example.com -ATTENDEE:Mailto:B@example.com -REQUEST-STATUS:2.8;Repeating event ignored. Scheduled as a single - event;RRULE -REQUEST-STATUS:3.0;Invalid Property Name;FOO -UID:guid-1@host1.com -SEQUENCE:0 -DTSTAMP:19970603T094000Z -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REQUEST -VERSION:2.0 -BEGIN:VTODO -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR:Mailto:A@example.com -ATTENDEE;RSVP=TRUE:Mailto:B@example.com -ATTENDEE;RSVP=TRUE:Mailto:C@example.com -ATTENDEE;RSVP=TRUE:Mailto:D@example.com -DTSTART:19970701T170000Z -DUE:19970722T170000Z -PRIORITY:1 -SUMMARY:Create the requirements document -UID:calsrv.example.com-873970198738777-00@example.com -SEQUENCE:0 -DTSTAMP:19970717T200000Z -STATUS:NEEDS-ACTION -END:VTODO -END:VCALENDAR -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REPLY -VERSION:2.0 -BEGIN:VTODO -ORGANIZER:Mailto:A@example.com -ATTENDEE;PARTSTAT=ACCEPTED:Mailto:B@example.com -UID:calsrv.example.com-873970198738777-00@example.com -COMMENT:I'll send you my input by e-mail -SEQUENCE:0 -DTSTAMP:19970717T203000Z -REQUEST-STATUS:2.0;Success -END:VTODO -END:VCALENDAR -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REQUEST -VERSION:2.0 -BEGIN:VTODO -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR:Mailto:A@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:D@example.com -UID:calsrv.example.com-873970198738777-00@example.com -SUMMARY:Create the requirements document -PRIORITY:1 -SEQUENCE:0 -STATUS:IN-PROCESS -DTSTART:19970701T170000Z -DTSTAMP:19970717T230000Z -END:VTODO -END:VCALENDAR -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REPLY -VERSION:2.0 -BEGIN:VTODO -ORGANIZER:MAILTO:A@example.com -ATTENDEE;PARTSTAT=IN-PROCESS:Mailto:B@example.com -PERCENT-COMPLETE:75 -REQUEST-STATUS:2.0 -UID:calsrv.example.com-873970198738777-00@example.com -DTSTAMP:19970717T233000Z -SEQUENCE:0 -END:VTODO -END:VCALENDAR -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REPLY -VERSION:2.0 -BEGIN:VTODO -ORGANIZER:MAILTO:A@example.com -ATTENDEE;PARTSTAT=COMPLETED:Mailto:D@example.com -UID:calsrv.example.com-873970198738777-00@example.com -REQUEST-STATUS:2.0 -DTSTAMP:19970717T233000Z -SEQUENCE:0 -END:VTODO -END:VCALENDAR -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REQUEST -VERSION:2.0 -BEGIN:VTODO -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com -ATTENDEE;PARTSTAT=ACCEPTED;CUTYPE=INDIVIDUAL:Mailto:B@example.com -ATTENDEE;PARTSTAT=IN-PROCESS;CUTYPE=INDIVIDUAL:Mailto:D@example.com -DTSTART:19970701T170000Z -DUE:19970722T170000Z -PRIORITY:1 -SUMMARY:Create the requirements document -UID:calsrv.example.com-873970198738777-00@example.com -SEQUENCE:1 -DTSTAMP:19970718T100000Z -STATUS:IN-PROCESS -PERCENT-COMPLETE:40 -END:VTODO -END:VCALENDAR -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REQUEST -VERSION:2.0 -BEGIN:VTODO -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR:Mailto:A@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:D@example.com -RRULE:FREQ=MONTHLY;COUNT=10;BYDAY=1FR -DTSTART:19980101T100000 -DUE:19980103T100000 -SUMMARY:Send Status Reports to Area Managers -UID:calsrv.example.com-873970198738777-00@example.com -SEQUENCE:0 -DTSTAMP:19970717T200000Z -STATUS:NEEDS-ACTION -PRIORITY:1 -END:VTODO -END:VCALENDAR -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REPLY -VERSION:2.0 -BEGIN:VTODO -ATTENDEE;PARTSTAT=IN-PROCESS:Mailto:B@example.com -PERCENT-COMPLETE:75 -UID:calsrv.example.com-873970198738777-00@example.com -DTSTAMP:19970717T233000Z -RECURRENCE-ID:19980101T170000Z -SEQUENCE:1 -ORGANIZER:MAILTO:A@Example.com -REQUEST-STATUS:2.0 -END:VTODO -END:VCALENDAR -BEGIN:VCALENDAR -METHOD:PUBLISH -PRODID:-//ACME/DesktopCalendar//EN -VERSION:2.0 -BEGIN:VJOURNAL -DTSTART:19971002T200000Z -DTSTAMP:19971002T200000Z -ORGANIZER:MAILTO:A@Example.com -SUMMARY:Phone conference minutes -DESCRIPTION:The editors meeting was held on October 1\, 1997. - Details are in the attached document. -UID:0981234-1234234-2410@example.com -RELATED-TO:0981234-1234234-2402-35@example.com -ATTACH:ftp://ftp.example.com/pub/ed/minutes100197.txt -END:VJOURNAL -END:VCALENDAR -BEGIN:VCALENDAR -PRODID:-//RDU Software//NONSGML HandCal//EN -METHOD:REFRESH -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com -UID: guid-1-12345@host1.com -DTSTAMP:19970603T094000 -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -METHOD:REQUEST -PRODID:-//RDU Software//NONSGML HandCal//EN -VERSION:2.0 -BEGIN:VEVENT -UID:acme-12345@host1.com -SEQUENCE:3 -RRULE:FREQ=WEEKLY -RDATE;VALUE=PERIOD:19970819T210000Z/19970819T220000Z -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com -ATTENDEE:Mailto:B@example.com -DESCRIPTION:IETF-C&S Conference Call -SUMMARY:IETF Calendaring Working Group Meeting -DTSTART:19970801T210000Z -DTEND:19970801T220000Z -RECURRENCE-ID:19970809T210000Z -DTSTAMP:19970726T083000 -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR -BEGIN:VCALENDAR -PRODID:-//RDU Software//NONSGML HandCal//EN -METHOD:REFRESH -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:Mailto:A@example.com -ATTENDEE:Mailto:B@example.com -UID:acme-12345@host1.com -DTSTAMP:19970603T094000 -END:VEVENT -END:VCALENDAR diff --git a/libical/test-data/3 b/libical/test-data/3 deleted file mode 100644 index 008373ebfa..0000000000 --- a/libical/test-data/3 +++ /dev/null @@ -1,21 +0,0 @@ -BEGIN:VCALENDAR -VERSION:2.0 -PRODID:-//ABC Corporation//NONSGML My Product//EN -BEGIN:VTODO -DTSTAMP:19980130T134500Z -SEQUENCE:2 -UID:uid4@host1.com -ORGANIZER:MAILTO:unclesam@us.gov -ATTENDEE;PARTSTAT=ACCEPTED:MAILTO:jqpublic@host.com -DUE:19980415T235959 -STATUS:NEEDS-ACTION -SUMMARY:Submit Income Taxes -BEGIN:VALARM -ACTION:AUDIO -TRIGGER;VALUE=DATE-TIME:19980403T120000 -ATTACH;FMTTYPE=audio/basic:http://host.com/pub/audio-files/ssbanner.aud -REPEAT:4 -DURATION:PT1H -END:VALARM -END:VTODO -END:VCALENDAR diff --git a/libical/test-data/4 b/libical/test-data/4 deleted file mode 100644 index 59c3d6917b..0000000000 --- a/libical/test-data/4 +++ /dev/null @@ -1,23 +0,0 @@ -BEGIN:VCALENDAR -VERSION:2.0 -PRODID:-//ABC Corporation//NONSGML My Product//EN -BEGIN:VJOURNAL -DTSTAMP:19970324T120000Z -UID:uid5@host1.com -ORGANIZER:MAILTO:jsmith@host.com -STATUS:DRAFT -CLASS:PUBLIC -CATEGORIES:Project Report, XYZ: Weekly Meeting -DESCRIPTION:Project xyz Review Meeting Minutes\n - Agenda\n1. Review of project version 1.0 requirements.\n2. - Definition - of project processes.\n3. Review of project schedule.\n - Participants: John Smith\, Jane Doe\, Jim Dandy\n-It was - decided that the requirements need to be signed off by - product marketing.\n-Project processes were accepted.\n - -Project schedule needs to account for scheduled holidays - and employee vacation time. Check with HR for specific - dates.\n-New schedule will be distributed by Friday.\n- - Next weeks meeting is cancelled. No meeting until 3/23. -END:VJOURNAL -END:VCALENDAR diff --git a/libical/test-data/5 b/libical/test-data/5 deleted file mode 100644 index ba1fd09f7f..0000000000 --- a/libical/test-data/5 +++ /dev/null @@ -1,16 +0,0 @@ -BEGIN:VCALENDAR -VERSION:2.0 -PRODID:-//RDU Software//NONSGML HandCal//EN -BEGIN:VFREEBUSY -ORGANIZER:MAILTO:jsmith@host.com -DTSTART:19980313T141711Z -DTEND:19980410T141711 -FREEBUSY:19980314T233000Z/19980315T003000Z -FREEBUSY:19980316T153000Z/19980316T163000Z -FREEBUSY:19980318T030000/19980318T040000,19980318T030000/19980318T040000 -URL:http://www.host.com/calendar/busytime/jsmith.ifb -END:VFREEBUSY -END:VCALENDAR - - - diff --git a/libical/test-data/6 b/libical/test-data/6 deleted file mode 100644 index 753bd2b66c..0000000000 --- a/libical/test-data/6 +++ /dev/null @@ -1,12 +0,0 @@ -BEGIN:VCALENDAR -METHOD:PUBLISH -PRODID:-//ACME/DesktopCalendar//EN -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:mailto:a@example.com -DTSTART:19970701T200000Z -DTSTAMP:19970611T190000Z -SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES -UID:0981234-1234234-23@example.com -END:VEVENT -END:VCALENDAR diff --git a/libical/test-data/7 b/libical/test-data/7 deleted file mode 100644 index 0a255fc514..0000000000 --- a/libical/test-data/7 +++ /dev/null @@ -1,14 +0,0 @@ -BEGIN:VCALENDAR -METHOD:PUBLISH -VERSION:2.0 -PRODID:-//ACME/DesktopCalendar//EN -BEGIN:VEVENT -ORGANIZER:mailto:a@example.com -DTSTAMP:19970612T190000Z -DTSTART:19970701T210000Z -DTEND:19970701T230000Z -SEQUENCE:1 -UID:0981234-1234234-23@example.com -SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES -END:VEVENT -END:VCALENDAR diff --git a/libical/test-data/Makefile.am b/libical/test-data/Makefile.am deleted file mode 100644 index c3475a9c31..0000000000 --- a/libical/test-data/Makefile.am +++ /dev/null @@ -1,26 +0,0 @@ -EXTRA_DIST = \ -0 \ -1 \ -1.1 \ -2 \ -2445.ics \ -2446.ics \ -3 \ -4 \ -5 \ -6 \ -7 \ -smallcluster.ics \ -recur.txt \ -user-cal.vcf \ -complex-mime.txt \ -simple-mime.txt \ -stresstest.ics \ -classify.ics \ -incoming.ics \ -process-incoming.ics \ -calendar.ics \ -restriction.ics \ -overlaps.ics - - diff --git a/libical/test-data/calendar.ics b/libical/test-data/calendar.ics deleted file mode 100644 index 63b0a93838..0000000000 --- a/libical/test-data/calendar.ics +++ /dev/null @@ -1,47 +0,0 @@ -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:CREATE -X-LIC-NOTE: #C1. Rescheduled by #I1\ and updated by #I2 -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:Mailto:B@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN=BIG A:Mailto:A@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=B:Mailto:B@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=C:Mailto:C@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:Mailto:D@example.com -ATTENDEE;RSVP=FALSE;CUTYPE=ROOM:conf_Big@example.com -ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:Mailto:E@example.com -DTSTAMP:19970611T190000Z -DTSTART:19970701T190000Z -DTEND:19970701T1930000Z -SUMMARY:Conference -UID:calsrv.example.com-873970198738777@example.com -SEQUENCE:1 -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR - -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REQUEST -X-LIC-NOTE: #C2. The test user is the organizer. -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:C@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:Mailto:D@example.com -ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE; - CUTYPE=ROOM:Mailto:Conf@example.com -ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:Mailto:E@example.com -DTSTART:19970701T180000Z -DTEND:19970701T190000Z -SUMMARY:Phone Conference -UID:calsrv.example.com-873970198738785@example.com -SEQUENCE:0 -DTSTAMP:19970613T190000Z -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR - diff --git a/libical/test-data/classify.ics b/libical/test-data/classify.ics deleted file mode 100644 index c7c5a1e438..0000000000 --- a/libical/test-data/classify.ics +++ /dev/null @@ -1,43 +0,0 @@ -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REQUEST -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN=BIG A:Mailto:A@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=B:Mailto:B@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=C:Mailto:C@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:Mailto:D@example.com -ATTENDEE;RSVP=FALSE;CUTYPE=ROOM:conf_Big@example.com -ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:Mailto:E@example.com -DTSTAMP:19970611T190000Z -DTSTART:19960701T200000Z -DTEND:19970701T200000Z -SUMMARY:Conference -UID:calsrv.example.com-873970198738777@example.com -SEQUENCE:1 -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR - -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REQUEST -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN=BIG A:Mailto:A@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=B:Mailto:B@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=C:Mailto:C@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:Mailto:D@example.com -ATTENDEE;RSVP=FALSE;CUTYPE=ROOM:conf_Big@example.com -ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:Mailto:E@example.com -DTSTAMP:19950611T190000Z -DTSTART:19970701T200000Z -DTEND:19970701T200000Z -SUMMARY:Conference in the park -UID:calsrv.example.com-873970198738777@example.com -SEQUENCE:0 -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR diff --git a/libical/test-data/complex-mime.txt b/libical/test-data/complex-mime.txt deleted file mode 100644 index 32cb106dfd..0000000000 --- a/libical/test-data/complex-mime.txt +++ /dev/null @@ -1,81 +0,0 @@ -From: foo1@example.com -MIME-Version: 1.0 -To: foo2@example.com,foo3@example.com -Subject: REQUEST - Phone Conference -Content-Type:multipart/related;boundary="--FEE3790DC7E35189CA67CE2C" - -----FEE3790DC7E35189CA67CE2C -Content-Type: multipart/alternative; - boundary="--00FEE3790DC7E35189CA67CE2C00" - -----00FEE3790DC7E35189CA67CE2C00 -Content-Type: text/plain; charset=us-ascii -Content-Transfer-Encoding: 7bit - -When: 7/1/1997 10:00PM PDT- 7/1/97 10:30 PM PDT -Where: -Organizer: foo1@example.com -Summary: Let's discuss the attached document - - -----00FEE3790DC7E35189CA67CE2C00 -Content-Type:text/calendar; method=REQUEST; charset=US-ASCII; - Component=vevent -Content-Transfer-Encoding: quoted-printable -Content-Disposition: attachment; filename="event.vcs" - -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -VERSION:2.0 -METHOD:REQUEST -BEGIN:VEVENT -ORGANIZER:foo1@example.com -ATTENDEE;RSVP=3DTRUE;ROLE=3DREQ-PARTICIPANT;CUTYPE=3DGROUP:MAILTO:employe= -e-A@host.com -ATTENDEE;RSVP=3DTRUE;ROLE=3DREQ-PARTICIPANT;CUTYPE=3DGROUP:mailto:Employe= -e-B@HOST.com -ATTENDEE;RSVP=3DTRUE;ROLE=3DREQ-PARTICIPANT;CUTYPE=3DGROUP:MailTo:Eric@Ag= -ony.Busboom.org -DTSTAMP:19970611T190000Z -DTSTART:19970621T170000Z -DTEND:199706211T173000Z -SUMMARY:Let's discuss the attached document -UID:calsvr.example.com-873970198738777-8aa -SEQUENCE:0 -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR - -----00FEE3790DC7E35189CA67CE2C00 -Content-Type:text/calendar; method=REQUEST; charset=US-ASCII; - Component=vevent -Content-Transfer-Encoding: base64 -Content-Disposition: attachment; filename="event.vcs" - -QkVHSU46VkNBTEVOREFSClBST0RJRDotLy9BQ01FL0Rlc2t0b3BDYWxlbmRhci8vRU4KVkVS -U0lPTjoyLjAKQkVHSU46VkVWRU5UCk9SR0FOSVpFUjpmb28xQGV4YW1wbGUuY29tCkFUVEVO -REVFO1JTVlA9VFJVRTtST0xFPVJFUS1QQVJUSUNJUEFOVDtDVVRZUEU9R1JPVVA6TUFJTFRP -OmVtcGxveWVlLUFAaG9zdC5jb20KQVRURU5ERUU7UlNWUD1UUlVFO1JPTEU9UkVRLVBBUlRJ -Q0lQQU5UO0NVVFlQRT1HUk9VUDptYWlsdG86RW1wbG95ZWUtQkBIT1NULmNvbQpBVFRFTkRF -RTtSU1ZQPVRSVUU7Uk9MRT1SRVEtUEFSVElDSVBBTlQ7Q1VUWVBFPUdST1VQOk1haWxUbzpF -cmljQEFnb255LlF1YWxjb21tLmNvbQpEVFNUQU1QOjE5OTcwNjExVDE5MDAwMFoKRFRTVEFS -VDoxOTk3MDYyMVQxNzAwMDBaCkRURU5EOjE5OTcwNjIxMVQxNzMwMDBaClNVTU1BUlk6TGV0 -J3MgZGlzY3VzcyB0aGUgYXR0YWNoZWQgZG9jdW1lbnQKVUlEOmNhbHN2ci5leGFtcGxlLmNv -bS04NzM5NzAxOTg3Mzg3NzctOGFhClNFUVVFTkNFOjAKU1RBVFVTOkNPTkZJUk1FRApFTkQ6 -VkVWRU5UCkVORDpWQ0FMRU5EQVIK - - -----00FEE3790DC7E35189CA67CE2C00-- - -----FEE3790DC7E35189CA67CE2C -Content-Type: application/msword; name="FieldReport.doc" -Content-Transfer-Encoding: base64 -Content-Disposition: inline; filename="FieldReport.doc" -Content-ID: <calsvr.example.com-12345aaa> - - -R0lGODdhTAQZAJEAAFVVVd3d3e4AAP///ywAAAAATAQZAAAC/5yPOSLhD6OctNqLs94XqAG -4kiW5omm6sq27gvH8kzX9o1y+s73/g8MCofEovGITCoxKMbyCR16cNSq9YrNarfcrvdriIH -5LL5jE6rxc3G+v2cguf0uv2Oz+v38L7/DxgoOKjURnjIIbe3yNjo+AgZWYVIWWl5iZnJY6J. - -----FEE3790DC7E35189CA67CE2C-- diff --git a/libical/test-data/incoming.ics b/libical/test-data/incoming.ics deleted file mode 100644 index c598dfa6bf..0000000000 --- a/libical/test-data/incoming.ics +++ /dev/null @@ -1,168 +0,0 @@ -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REQUEST -X-LIC-NOTE: #I1. Reschedules C1 -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:Mailto:B@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN=BIG A:Mailto:A@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=B:Mailto:B@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=C:Mailto:C@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:Mailto:D@example.com -ATTENDEE;RSVP=FALSE;CUTYPE=ROOM:conf_Big@example.com -ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:Mailto:E@example.com -DTSTAMP:19970611T190000Z -DTSTART:19970701T200000Z -DTEND:19970701T2000000Z -SUMMARY:Conference -UID:calsrv.example.com-873970198738777@example.com -SEQUENCE:2 -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR - -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REQUEST -X-LIC-NOTE: #I2. Updates C1 -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:Mailto:B@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN=BIG A:Mailto:A@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=B:Mailto:B@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=C:Mailto:C@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:Mailto:D@example.com -ATTENDEE;RSVP=FALSE;CUTYPE=ROOM:conf_Big@example.com -ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:Mailto:E@example.com -DTSTAMP:19970611T193000Z -DTSTART:19970701T190000Z -DTEND:19970701T1930000Z -SUMMARY: Pool party -UID:calsrv.example.com-873970198738777@example.com -SEQUENCE:2 -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR - -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REQUEST -X-LIC-NOTE: #I2: This is an obsolete request\, otherwise identical to #I1 -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:Mailto:B@example.com -ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:C@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:Mailto:D@example.com -ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE; - CUTYPE=ROOM:Mailto:Conf@example.com -ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:Mailto:E@example.com -DTSTART:19960701T180000Z -DTEND:19970701T190000Z -SUMMARY:Phone Conference -UID:calsrv.example.com-873970198738777@example.com -SEQUENCE:0 -DTSTAMP:19960613T190000Z -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR - -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REPLY -X-LIC-NOTE: #I3: User B is accepting A's request\, #C2 -VERSION:2.0 -BEGIN:VEVENT -ATTENDEE;PARTSTAT=ACCEPTED:Mailto:B@example.com -ORGANIZER:MAILTO:A@example.com -UID:calsrv.example.com-873970198738785@example.com -SEQUENCE:1 -REQUEST-STATUS:2.0;Success -DTSTAMP:19970612T190000Z -END:VEVENT -END:VCALENDAR - -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REPLY -X-LIC-NOTE: #I4: User C is rejecting A's request\, #C2 -VERSION:2.0 -BEGIN:VEVENT -ATTENDEE;PARTSTAT=DECLINED:Mailto:C@example.com -ORGANIZER:MAILTO:A@example.com -UID:calsrv.example.com-873970198738785@example.com -SEQUENCE:1 -REQUEST-STATUS:2.0;Success -DTSTAMP:19970612T190000Z -END:VEVENT -END:VCALENDAR - -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REPLY -X-LIC-NOTE: #I5: Crasher X is accepting A's request\, #C2 -VERSION:2.0 -BEGIN:VEVENT -ATTENDEE;PARTSTAT=ACCEPTED:Mailto:X@example.com -ORGANIZER:MAILTO:A@example.com -UID:calsrv.example.com-873970198738785@example.com -SEQUENCE:1 -REQUEST-STATUS:2.0;Success -DTSTAMP:19970612T190000Z -END:VEVENT -END:VCALENDAR - -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REPLY -X-LIC-NOTE: #I6: Crasher Y is declining A's request\, #C2 -VERSION:2.0 -BEGIN:VEVENT -ATTENDEE;PARTSTAT=DECLINED:Mailto:Y@example.com -ORGANIZER:MAILTO:A@example.com -UID:calsrv.example.com-873970198738785@example.com -SEQUENCE:1 -REQUEST-STATUS:2.0;Success -DTSTAMP:19970612T190000Z -END:VEVENT -END:VCALENDAR - -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:CANCEL -X-LIC-NOTE: #I7: Cancel #c1 -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:Mailto:B@example.com -ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:A@example.com -ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:B@example.com -ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:C@example.com -ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:D@example.com -COMMENT:Mr. B cannot attend. It's raining. Lets cancel. -UID:calsrv.example.com-873970198738777@example.com -SEQUENCE:1 -UID:calsrv.example.com-873970198738777@example.com -STATUS:CANCELLED -DTSTAMP:19970613T190000Z -END:VEVENT -END:VCALENDAR - -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:COUNTER -X-LIC-NOTE: #I8. Counter to #C1. Changed DTEND to DURATION. -VERSION:2.0 -BEGIN:VEVENT -DTSTAMP:19970611T190000Z -DTSTART:19970701T190000Z -DURATION:PT2H -ORGANIZER:Mailto:B@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=C:Mailto:C@example.com -SUMMARY:Conference -COMMENT: I think the conference should be 2 hours long -UID:calsrv.example.com-873970198738777@example.com -SEQUENCE:1 -END:VEVENT -END:VCALENDAR - diff --git a/libical/test-data/overlaps.ics b/libical/test-data/overlaps.ics deleted file mode 100644 index 57a5c57cc3..0000000000 --- a/libical/test-data/overlaps.ics +++ /dev/null @@ -1,32 +0,0 @@ -BEGIN:VEVENT -DTSTART - :20001104T150000 -DTEND - :20001104T160000 -END:VEVENT - -BEGIN:VEVENT -DTSTART - :20001104T153000 -DTEND - :20001104T163000 -END:VEVENT -BEGIN:VEVENT -DTSTART - :20001104T160000 -DTEND - :20001104T170000 -END:VEVENT -BEGIN:VEVENT -DTSTART - :20001104T163000 -DTEND - :20001104T173000 -END:VEVENT -BEGIN:VEVENT -DTSTART - :20001104T170000 -DTEND - :20001104T180000 -END:VEVENT - diff --git a/libical/test-data/process-incoming.ics b/libical/test-data/process-incoming.ics deleted file mode 100644 index 5f66fb69c7..0000000000 --- a/libical/test-data/process-incoming.ics +++ /dev/null @@ -1,107 +0,0 @@ -BEGIN:VCALENDAR -X-LIC-NOTE: Overlap with Slot 1\, 1200 to 1300\, should be delegated -METHOD - :REQUEST -VERSION - :2.0 -BEGIN:VEVENT -ORGANIZER - :Mailto:bob@cal.softwarestudio.org -ATTENDEE - ;ROLE=CHAIR - ;CUTYPE=INDIVIDUAL - ;CN=Alice - :Mailto:alice@cal.softwarestudio.org -ATTENDEE - ;RSVP=TRUE - ;CUTYPE=INDIVIDUAL - ;CN=B - :Mailto:B@example.com -DTSTAMP - :19970611T030000Z -DTSTART - :19970701T120000Z -DTEND - :19970701T1300Z -SUMMARY - : Overlap 1 -UID - :calsrv.example.com-873970198738703@example.com -SEQUENCE - :0 -STATUS - :CONFIRMED -END:VEVENT -END:VCALENDAR - -BEGIN:VCALENDAR -X-LIC-NOTE: Overlap with Slot 2\, 1300 to 1400\, should be counterproposed -METHOD - :REQUEST -VERSION - :2.0 -BEGIN:VEVENT -ORGANIZER - :Mailto:bob@cal.softwarestudio.org -ATTENDEE - ;ROLE=CHAIR - ;CUTYPE=INDIVIDUAL - ;CN=Alice - :Mailto:alice@cal.softwarestudio.org -ATTENDEE - ;RSVP=TRUE - ;CUTYPE=INDIVIDUAL - ;CN=B - :Mailto:B@example.com -DTSTAMP - :19970611T040000Z -DTSTART - :19970701T13000Z -DTEND - :19970701T140000Z -SUMMARY - :Overlap 2 -UID - :calsrv.example.com-873970198738704@example.com -SEQUENCE - :0 -STATUS - :CONFIRMED -END:VEVENT -END:VCALENDAR - -BEGIN:VCALENDAR -X-LIC-NOTE: Overlap with Slot 3\, 1400 to 1500\, should be declined -METHOD - :REQUEST -VERSION - :2.0 -BEGIN:VEVENT -ORGANIZER - :Mailto:bob@cal.softwarestudio.org -ATTENDEE - ;ROLE=CHAIR - ;CUTYPE=INDIVIDUAL - ;CN=Alice - :Mailto:alice@cal.softwarestudio.org -ATTENDEE - ;RSVP=TRUE - ;CUTYPE=INDIVIDUAL - ;CN=B - :Mailto:B@example.com -DTSTAMP - :19970611T050000Z -DTSTART - :19970701T140000Z -DTEND - :19970701T150000Z -SUMMARY - :Overlap 3 -UID - :calsrv.example.com-873970198738705@example.com -SEQUENCE - :0 -STATUS - :CONFIRMED -END:VEVENT -END:VCALENDAR diff --git a/libical/test-data/recur.txt b/libical/test-data/recur.txt deleted file mode 100644 index f158a2a96b..0000000000 --- a/libical/test-data/recur.txt +++ /dev/null @@ -1,404 +0,0 @@ -BEGIN:VEVENT -DESCRIPTION - :Daily for 10 occurrences: -DTSTART - ;TZID=US-Eastern - :19970902T090000 -RRULE - :FREQ=DAILY;COUNT=10;INTERVAL=1 -END:VEVENT - -BEGIN:VEVENT -DESCRIPTION - :Daily until December 24\, 1997: -DTSTART - ;TZID=US-Eastern - :19971215T090000 -RRULE - :FREQ=DAILY;UNTIL=19971224T000000Z;INTERVAL=1 -END:VEVENT - -BEGIN:VEVENT -DESCRIPTION - :Every other day - forever: -DTSTART - ;TZID=US-Eastern - :19970902T090000 -RRULE - :FREQ=DAILY;COUNT=10;INTERVAL=2 -END:VEVENT - -BEGIN:VEVENT -DESCRIPTION - :Every 10 days\, 5 occurrences: -DTSTART - ;TZID=US-Eastern - :19970902T090000 -RRULE - :FREQ=DAILY;COUNT=5;INTERVAL=10 -END:VEVENT - -BEGIN:VEVENT -DESCRIPTION - :Daily for 10 occurrences: -DTSTART - ;TZID=US-Eastern - :19970902T090000 -RRULE - :FREQ=DAILY;COUNT=10;INTERVAL=1 -END:VEVENT - -BEGIN:VEVENT -DESCRIPTION - :Every day in January\, for 3 years -DTSTART - ;TZID=US-Eastern - :19980101T090000 -RRULE - :FREQ=YEARLY;UNTIL=20000131T090000Z;INTERVAL=1;BYDAY=SU,MO,TU,WE,TH,FR,SA;BYMONTH=1 -END:VEVENT - -BEGIN:VEVENT -DESCRIPTION - :Everyday in January\, for 3 years: -DTSTART - ;TZID=US-Eastern - :19980101T090000 -RRULE - :FREQ=DAILY;UNTIL=20000131T090000Z;INTERVAL=1;BYMONTH=1 -END:VEVENT - -BEGIN:VEVENT -DESCRIPTION - :Weekly for 10 occurrences -DTSTART - ;TZID=US-Eastern - :19970902T090000 -RRULE - :FREQ=WEEKLY;COUNT=10;INTERVAL=1 -END:VEVENT - -BEGIN:VEVENT -DESCRIPTION - :Weekly until December 24\, 1997 -DTSTART - ;TZID=US-Eastern - :19970902T090000 -RRULE - :FREQ=WEEKLY;UNTIL=19971224T000000Z;INTERVAL=1 -END:VEVENT - -BEGIN:VEVENT -DESCRIPTION - :Every other week - forever: -DTSTART - ;TZID=US-Eastern - :19970902T090000 -RRULE - :FREQ=WEEKLY;INTERVAL=2;COUNT=10 -END:VEVENT - -BEGIN:VEVENT -DESCRIPTION - :Weekly on Tuesday and Thursday for 5 weeks: -DTSTART - ;TZID=US-Eastern - :19970902T090000 -RRULE - :FREQ=WEEKLY;UNTIL=19971007T000000Z;INTERVAL=1;BYDAY=TU,TH -END:VEVENT - -BEGIN:VEVENT -DESCRIPTION - :Weekly on Tuesday and Thursday for 5 weeks: -DTSTART - ;TZID=US-Eastern - :19970902T090000 -RRULE - :FREQ=WEEKLY;COUNT=10;INTERVAL=1;BYDAY=TU,TH -END:VEVENT - -BEGIN:VEVENT -DESCRIPTION - :Every other week on Monday\, Wednesday and Friday until December - 24\,1997\, but starting on Tuesday\, September 2\, 1997: -DTSTART - ;TZID=US-Eastern - :19970902T090000 -RRULE - :FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;BYDAY=MO,WE,FR;WKST=SU -END:VEVENT - -BEGIN:VEVENT -DESCRIPTION - :Every other week on Tuesday and Thursday\, for 8 occurrences: -DTSTART - ;TZID=US-Eastern - :19970902T090000 -RRULE - :FREQ=WEEKLY;COUNT=8;INTERVAL=2;BYDAY=TU,TH -END:VEVENT -BEGIN:VEVENT -DESCRIPTION - :Monthly on the 1st Friday for ten occurrences: -DTSTART - ;TZID=US-Eastern - :19970905T090000 -RRULE - :FREQ=MONTHLY;COUNT=10;INTERVAL=1;BYDAY=FR -END:VEVENT -BEGIN:VEVENT -DESCRIPTION - :Monthly on the 1st Friday until December 24\, 1997: -DTSTART - ;TZID=US-Eastern - :19970905T090000 -RRULE - :FREQ=MONTHLY;UNTIL=19971224T000000Z;INTERVAL=1;BYDAY=1FR -END:VEVENT -BEGIN:VEVENT -DESCRIPTION - :Every other month on the 1st and last Sunday of the month for 10 occurrences - : -DTSTART - ;TZID=US-Eastern - :19970907T090000 -RRULE - :FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU -END:VEVENT -BEGIN:VEVENT -DESCRIPTION - :Monthly on the second to last Monday of the month for 6 months: -DTSTART - ;TZID=US-Eastern - :19970922T090000 -RRULE - :FREQ=MONTHLY;COUNT=6;INTERVAL=1;BYDAY=-2MO -END:VEVENT -BEGIN:VEVENT -DESCRIPTION - :Monthly on the third to the last day of the month\, forever: -DTSTART - ;TZID=US-Eastern - :19970928T090000 -RRULE - :FREQ=MONTHLY;INTERVAL=1;COUNT=10;BYMONTHDAY=-3 -END:VEVENT -BEGIN:VEVENT -DESCRIPTION - :Monthly on the 2nd and 15th of the month for 10 occurrences: -DTSTART - ;TZID=US-Eastern - :19970902T090000 -RRULE - :FREQ=MONTHLY;COUNT=10;INTERVAL=1;BYMONTHDAY=2,15 -END:VEVENT -BEGIN:VEVENT -DESCRIPTION - :Monthly on the first and last day of the month for 10 occurrences:\n -DTSTART - ;TZID=US-Eastern - :19970930T090000 -RRULE - :FREQ=MONTHLY;COUNT=10;INTERVAL=1;BYMONTHDAY=1,-1 -END:VEVENT -BEGIN:VEVENT -DESCRIPTION - :Every 18 months on the 10th thru 15th of the month for 10 occurrences: -DTSTART - ;TZID=US-Eastern - :19970910T090000 -RRULE - :FREQ=MONTHLY;COUNT=10;INTERVAL=18;BYMONTHDAY=10,11,12,13,14,15 -END:VEVENT -BEGIN:VEVENT -DESCRIPTION - :Every Tuesday\, every other month: -DTSTART - ;TZID=US-Eastern - :19970902T090000 -RRULE - :FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=TU -END:VEVENT -BEGIN:VEVENT -DESCRIPTION - :Yearly in June and July for 10 occurrences: -DTSTART - ;TZID=US-Eastern - :19970610T090000 -RRULE - :FREQ=YEARLY;COUNT=10;INTERVAL=1;BYMONTH=6,7 -END:VEVENT -BEGIN:VEVENT -DESCRIPTION - :Every other year on January\, February\, and March for 10 occurrences: -DTSTART - ;TZID=US-Eastern - :19970310T090000 -RRULE - :FREQ=YEARLY;COUNT=10;INTERVAL=2;BYMONTH=1,2,3 -END:VEVENT -BEGIN:VEVENT -DESCRIPTION - :Every 3rd year on the 1st\, 100th and 200th day for 10 occurrences: -DTSTART - ;TZID=US-Eastern - :19970101T090000 -RRULE - :FREQ=YEARLY;COUNT=10;INTERVAL=3;BYYEARDAY=1,100,200 -END:VEVENT -BEGIN:VEVENT -DESCRIPTION - :Every 20th Monday of the year\, forever: -DTSTART - ;TZID=US-Eastern - :19970519T090000 -RRULE - :FREQ=YEARLY;INTERVAL=1;COUNT=10;BYDAY=20MO -END:VEVENT -BEGIN:VEVENT -DESCRIPTION - :Monday of week number 20 (where the default start of the week is Monday)\, - forever: -DTSTART - ;TZID=US-Eastern - :19970512T090000 -RRULE - :FREQ=YEARLY;INTERVAL=1;COUNT=10;BYDAY=MO;BYWEEKNO=20 -END:VEVENT -BEGIN:VEVENT -DESCRIPTION - :Every Thursday in March\, forever: -DTSTART - ;TZID=US-Eastern - :19970313T090000 -RRULE - :FREQ=YEARLY;INTERVAL=1;COUNT=10;BYDAY=TH;BYMONTH=3 -END:VEVENT -BEGIN:VEVENT -DESCRIPTION - :Every Thursday\, but only during June\, July\, and August\, forever: -DTSTART - ;TZID=US-Eastern - :19970605T090000 -RRULE - :FREQ=YEARLY;INTERVAL=1;COUNT=10;BYDAY=TH;BYMONTH=6,7,8 -END:VEVENT - -BEGIN:VEVENT -DESCRIPTION - :Every Friday the 13th\, forever: -DTSTART - ;TZID=US-Eastern - :19970902T090000 -RRULE - :FREQ=MONTHLY;INTERVAL=1;COUNT=10;BYDAY=FR;BYMONTHDAY=13 -END:VEVENT - -BEGIN:VEVENT -DESCRIPTION - :The first Saturday that follows the first Sunday of the month\, -DTSTART - ;TZID=US-Eastern - :19970913T090000 -RRULE - :FREQ=MONTHLY;INTERVAL=1;COUNT=10;BYDAY=SA;BYMONTHDAY=7,8,9,10,11,12,13 -END:VEVENT - -BEGIN:VEVENT -DESCRIPTION - :Every four years\, the first Tuesday after a Monday in November\, - forever (U.S. Presidential Election day): -DTSTART - ;TZID=US-Eastern - :19961105T090000 -RRULE - :FREQ=YEARLY;INTERVAL=4;COUNT=10;BYDAY=TU;BYMONTHDAY=2,3,4,5,6,7,8;BYMONTH=11 -END:VEVENT - -BEGIN:VEVENT -DESCRIPTION - :The 3rd instance into the month of one of Tuesday\, Wednesday or - Thursday\, for the next 3 months: -DTSTART - ;TZID=US-Eastern - :19970904T090000 -RRULE - :FREQ=MONTHLY;COUNT=3;INTERVAL=1;BYDAY=TU,WE,TH;BYSETPOS=3 -END:VEVENT - -BEGIN:VEVENT -DESCRIPTION - :The 2nd to last weekday of the month: -DTSTART - ;TZID=US-Eastern - :19970929T090000 -RRULE - :FREQ=MONTHLY;INTERVAL=1;COUNT=10;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2 -END:VEVENT -BEGIN:VEVENT -DESCRIPTION - :Every 3 hours from 9:00 AM to 5:00 PM on a specific day: -DTSTART - ;TZID=US-Eastern - :19970902T090000 -RRULE - :FREQ=HOURLY;UNTIL=19970902T170000Z;INTERVAL=3 -END:VEVENT -BEGIN:VEVENT -DESCRIPTION - :Every 15 minutes for 6 occurrences: -DTSTART - ;TZID=US-Eastern - :19970902T090000 -RRULE - :FREQ=MINUTELY;COUNT=6;INTERVAL=15 -END:VEVENT -BEGIN:VEVENT -DESCRIPTION - :Every hour and a half for 4 occurrences: -DTSTART - ;TZID=US-Eastern - :19970902T090000 -RRULE - :FREQ=MINUTELY;COUNT=4;INTERVAL=90 -END:VEVENT -BEGIN:VEVENT -DESCRIPTION - :Every 20 minutes from 9:00 AM to 4:40 PM every day: -DTSTART - ;TZID=US-Eastern - :19970902T090000 -RRULE - :FREQ=DAILY;COUNT=20;INTERVAL=1;BYMINUTE=0,20,40;BYHOUR=9,10,11,12,13,14,15,16 -END:VEVENT -BEGIN:VEVENT -DESCRIPTION - :Every 20 minutes from 9:00 AM to 4:40 PM every day: -DTSTART - ;TZID=US-Eastern - :19970902T090000 -RRULE - :FREQ=MINUTELY;COUNT=20;INTERVAL=20;BYHOUR=9,10,11,12,13,14,15,16 -END:VEVENT -BEGIN:VEVENT -DESCRIPTION - :An example where the days generated makes a difference because of - WKST: -DTSTART - ;TZID=US-Eastern - :19970805T090000 -RRULE - :FREQ=WEEKLY;COUNT=4;INTERVAL=2;BYDAY=TU,SU -END:VEVENT -BEGIN:VEVENT -DESCRIPTION - :An example where the days generated makes a difference because of - WKST. Changing only WKST from MO to SU yields different results... -DTSTART - ;TZID=US-Eastern - :19970805T090000 -RRULE - :FREQ=WEEKLY;COUNT=4;INTERVAL=2;BYDAY=TU,SU -END:VEVENT - diff --git a/libical/test-data/restriction.ics b/libical/test-data/restriction.ics deleted file mode 100644 index b06493bbb3..0000000000 --- a/libical/test-data/restriction.ics +++ /dev/null @@ -1,49 +0,0 @@ -BEGIN:VCALENDAR -VERSION:2.0 -PRODID:-//hacksw/handcal//NONSGML v1.0//EN -METHOD: REQUEST -BEGIN:VEVENT -UID:19970901T130000Z-123401@host.com -DTSTAMP:19970901T1300Z -DTSTART:19970903T163000Z -DTEND:19970903T190000Z -DURATION:PT15M -SUMMARY:Annual Employee Review -CLASS:PRIVATE -CATEGORIES:BUSINESS,HUMAN RESOURCES -STATUS:TENTATIVE -END:VEVENT -END:VCALENDAR - - -BEGIN:VCALENDAR -VERSION:2.0 -PRODID:-//hacksw/handcal//NONSGML v1.0//EN -METHOD: PUBLISHca -BEGIN:VEVENT -RECURRENCE-ID:19970701T210000Z -RECURRENCE-ID:19970701T210000Z -SEQUENCE:0 -SEQUENCE:1 -CATEGORIES: A -CATEGORIES: B -CLASS: A -CLASS: B -ATTENDEE: BOB -REQUEST-STATUS: 3.0 -END:VEVENT -END:VCALENDAR - -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -METHOD:REPLY -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:MAILTO:A@Example.com -ATTENDEE;PARTSTAT=DELEGATED;DELEGATED- - TO="Mailto:E@example.com":Mailto:C@example.com -UID:calsrv.example.com-873970198738777@example.com -SEQUENCE:0 -DTSTAMP:19970611T190000Z -END:VEVENT -END:VCALENDAR diff --git a/libical/test-data/simple-mime.txt b/libical/test-data/simple-mime.txt deleted file mode 100644 index aa7113a82f..0000000000 --- a/libical/test-data/simple-mime.txt +++ /dev/null @@ -1,26 +0,0 @@ -From: foo1@example.com -MIME-Version: 1.0 -To: foo2@example.com,foo3@example.com -Subject: REQUEST - Phone Conference -Content-Type:text/calendar; method=REQUEST; charset=US-ASCII; - Component=vevent -Content-Transfer-Encoding: 7bit -Content-Disposition: attachment; filename="event.vcs" - -BEGIN:VCALENDAR -PRODID:-//ACME/DesktopCalendar//EN -VERSION:2.0 -BEGIN:VEVENT -ORGANIZER:foo1@example.com -ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:employee-A@host.com -ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:mailto:Employee-B@HOST.com -ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MailTo:Eric@Agony.Qualcomm.com -DTSTAMP:19970611T190000Z -DTSTART:19970621T170000Z -DTEND:199706211T173000Z -SUMMARY:Let's discuss the attached document -UID:calsvr.example.com-873970198738777-8aa -SEQUENCE:0 -STATUS:CONFIRMED -END:VEVENT -END:VCALENDAR diff --git a/libical/test-data/smallcluster.ics b/libical/test-data/smallcluster.ics deleted file mode 100644 index 2902136bab..0000000000 --- a/libical/test-data/smallcluster.ics +++ /dev/null @@ -1,13 +0,0 @@ -BEGIN:VCALENDAR -BEGIN:VCALENDAR -VERSION:2.0 -PRODID:-//hacksw/handcal//NONSGML v1.0//EN -BEGIN:VEVENT -DTSTART - :19970714T170000Z -DTEND:19970715T035959Z -SUMMARY:Bastille Day Party -RRULE:FREQ=YEARLY;UNTIL=123456T123456;BYSETPOS=-1,2,-3,4,-5,6,-7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,4,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54;BYSECOND=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,4,25,26 -END:VEVENT -END:VCALENDAR -END:VCALENDAR diff --git a/libical/test-data/stresstest.ics b/libical/test-data/stresstest.ics deleted file mode 100644 index f64cf6bbc9..0000000000 --- a/libical/test-data/stresstest.ics +++ /dev/null @@ -1,178 +0,0 @@ -BEGIN:VCALENDAR -ACTION:AUDIO -ACTION: -ACTION:~!@#$%^&*()_+}{:"<>?/., -ATTACH:ftp://ftp.example.com/~pub%eof/ed/minutes100197.txt -ATTACH:http://www.dukes.com/ -ATTENDEE:MAILTO:john_doe@host.com -ATTENDEE:;john_public@host2.com -ATTENDEE:MAILTO:john_public@host2.com -ATTENDEE:Mailto:B@example.com -ATTENDEE;PARTSTAT=ACCEPTED;PARTSTAT=DECLINED:Mailto:B@example.com -ATTENDEE;PARTSTAT=*&^*&:Mailto:B@example.com -ATTENDEE;ROLE=CHAIR:Mailto:A@example.com -ATTENDEE;ROLE=ATTENDEE:Mailto:A@example.com -ATTENDEE;ROLE=CHAIR;RSVP=TRUE:Mailto:A@example.com -ATTENDEE;ROLE=NONPARTICIPANT;RSVP=NO:Mailto:E@example.com -ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:Mailto:E@example.com -ATTENDEE;RSVP=FALSE;CUTYPE=ROOM:conf_Big@example.com -ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:Bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb@example.com -CATEGORIES:ANNIVERSARY,PERSONAL,SPECIAL OCCASION;ANNIVERSARY,PERSONAL,SPECIAL OCCASION;ANNIVERSARY,PERSONAL,SPECIAL OCCASION; -CATEGORIES;RSVP=TRUE;RSVP=FALSE:one,two -CLASS:PUBLIC -COMMENT:DELEGATE (ATTENDEE Mailto:E@example.com) DECLINED YOUR - DUKES forfeit the game - I'll send you my input by e-mail - May we bump this by an hour? I have a conflict - Mr. B cannot attend. It's raining. Lets cancel. -Sorry, I cannot change this meeting time -Sorry, I will be out of town at that time. -This iCalendar file contains busy time information for -COMMENT:This time works much better and I think the big conference -COMMENT:You're off the hook for this meeting -CREATED:19980309T130000Z -CREATED:19980309T130000 -CREATED:19980309T13000 -CREATED:19980309T1300 -CREATED:19980309T130 -CREATED:19980309T13 -CREATED:19980309T1 -CREATED:19980309T -CREATED:19980309 -CREATED:1998030 -CREATED:199803 -CREATED:19980 -CREATED:1998 -CREATED:199 -CREATED:19 -CREATED:1 -CREATED: -DTSTAMP:9999999T9999999X -DTSTART:T103012 -DTSTART;VALUE=DATE:19970317 -DTSTART;VALUE=TIME:19970714 -DUE:19980415T235959 -DUE:19980415T235959 -DURATION:P15DT5H0M20S -DURATION:P7W7W8w -DURATION:PT15M -DURATION:PT1H -FREEBUSY:19970701T090000Z/PT1H,19970701T140000Z/PT30M,19980101T180000Z/19980101T190000Z,19980103T020000Z/19980103T050000Z,19980107T020000Z/19980107T050000Z -FREEBUSY:19980318T030000Z/19980318T040000Z -FREEBUSY:19980318T030000Z/19980318T040000 -FREEBUSY;VALUE=PERIOD:19971015T050000Z/PT8H30M, -LOCATION;VALUE=URI:http://www.midwaystadium.com/ -METHOD:ADD -METHOD:DESTROY -METHOD:xyz -METHOD:X-LIC-METHOD -PERCENT-COMPLETE:40 -PERCENT-COMPLETE:.75 -PERCENT-COMPLETE:0 -PRIORITY:1 -PRIORITY:2 -PRIORITY:134645983456666098345624598726459872445897345987 -PRODID:"-//RDU Software//NONSGML HandCal//EN" -PRODID:'-//ABC Corporation//NONSGML ' -PRODID:-//ABC Corporation;foo//NONSGML My Product//EN -RDATE:19970406T020000 -RDATE:19971026T020000 -RDATE:19980304T180000Z -RDATE:19980304T180000Z -RDATE:19980311T160000Z -RDATE:19980311T180000Z -RDATE:19980315T180000Z -RDATE:19980318T180000Z -RDATE:19981025T020000 -RDATE:19981025T020000 -RDATE:19990404T020000 -RDATE:19990404T020000 -RDATE;VALUE=PERIOD:19970819T210000Z/199700819T220000Z -RECURRENCE-ID:19970701T210000Z -RECURRENCE-ID:19970715T210000Z -RECURRENCE-ID:19970801T210000Z -RECURRENCE-ID:19970809T210000Z -RECURRENCE-ID:19980101T170000Z -RECURRENCE-ID:19980311T160000Z -RECURRENCE-ID:19980311T180000Z -RECURRENCE-ID;RANGE=THISANDFUTURE:19970901T210000Z -RELATED-TO:0981234-1234234-14@example.com -RELATED-TO:0981234-1234234-2402-35@example.com -REPEAT:2 -REPEAT:23 -REPEAT:4 -REPEAT:4 -REPEAT:4 -REQUEST-STATUS:2.0;Success -REQUEST-STATUS:2.0;Success -REQUEST-STATUS:2.0;Success -REQUEST-STATUS:2.0;Success -REQUEST-STATUS:2.0;Success -REQUEST-STATUS:2.8;Repeating event ignored. Scheduled as a single -REQUEST-STATUS:3.0;Invalid Property Name;FOO -RESOURCES:SCOREBOARD -RRULE:FREQ=MONTHLY;BYMONTHDAY=1 -RRULE:FREQ=MONTHLY;BYMONTHDAY=1;UNTIL=19980901T210000Z -RRULE:FREQ=MONTHLY;COUNT=10;BYDAY=1FR -RRULE:FREQ=WEEKLY -RRULE:FREQ=WEEKLY -RRULE:FREQ=WEEKLY;INTERVAL=20;WKST=SU;BYDAY=TU -RRULE:FREQ=WEEKLY;WKST=SU;BYDAY=TU -RRULE:FREQ=YEARLY -RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 -RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 -RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 -RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 -RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 -RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=4 -RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4 -RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4 -RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4 -RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z -RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z -RRULE:FREQ=YEARLY;INTERVAL=1 -RRULE:WKST=SU;BYDAY=TH;FREQ=WEEKLY -RRULE:WKST=SU;BYDAY=TU,TH;FREQ=WEEKLY -SCALE:GREGORIAN -SEQUENCE:0 -SEQUENCE:.03486 -SEQUENCE:dflkjhfg -SEQUENCE: -SEQUENCE:7 -STATUS:CANCELLED -STATUS:NEEDS-ACTION -STATUS:Needs Action -SUMMARY: Bastille Day -SUMMARY:"No Property" -SUMMARY:*** REMINDER: SEND AGENDA FOR WEEKLY STAFF MEETING *** -SUMMARY:1996 Income Tax Preparation -SUMMARY:Annual Employee Review -SUMMARY:Bastille Day Party -SUMMARY:Calendaring Interoperability Planning Meeting -SUMMARY:Calendaring Interoperability Planning Meeting -SUMMARY;RSVP=TRUE;RSVP=FALSE:Calendaring Interoperability Planning Meeting -TRANSP:TRANSPARENT -TRIGGER:-P2D -TRIGGER:-PT2H -TRIGGER:-PT30M -TRIGGER:-PT30M -TRIGGER;VALUE=DATE-TIME:19970317T133000Z -TRIGGER;VALUE=DATE-TIME:19980101T050000Z -TRIGGER;VALUE=DATE-TIME:19980403T120000 -TRIGGER;VALUE=DATE-TIME:19980403T120000Z -TZID:America-Chicago -TZID:America-SanJose -TZNAME:PST -TZOFFSETFROM:-0600 -TZOFFSETFROM:0700 -TZOFFSETFROM:4.56 -TZURL:http://zones.stds_r_us.net/tz/America-Chicago -TZURL:http://zones.stds_r_us.net/tz/America-SanJose -TZURL:http://zones.stds_r_us.net/tz/US-Eastern -UID:uid5@host1.com -URL:http://www.host.com/calendar/busytime/jsmith.ifb -VERSION:2.0 -VERSION:.0 -VERSION:2.0.0.0 -X-SKI-TITLE;RSVP=TRUE: This is an extension property -END:VCALENDAR
\ No newline at end of file diff --git a/libical/test-data/user-cal.vcf b/libical/test-data/user-cal.vcf deleted file mode 100644 index 3cf005fa21..0000000000 --- a/libical/test-data/user-cal.vcf +++ /dev/null @@ -1,76 +0,0 @@ -BEGIN:VCALENDAR -X-COMMENT: This file was contributed by Ola Lundqvist <olalu526@student.liu.se> -PRODID:-//GNOME//NONSGML GnomeCalendar//EN -TZ:CEST -VERSION:1.1.4 -BEGIN:VEVENT -UID:20000511T125528-23888-500-1-494 -SEQUENCE:-1 -DTSTART:20000530T150000 -DTEND:20000530T170000 -DCREATED:20000524T125250 -LAST-MODIFIED:20000524T125250 -SUMMARY:Omphalic for ataraxia -STATUS:NEEDS ACTION -CLASS:PUBLIC -PRIORITY:0 -TRANSP:0 -ORGNAME:ola -X-PILOTID:4441126 -X-PILOTSTAT:0 -END:VEVENT - -BEGIN:VEVENT -UID:20000511T125528-23888-500-1-492 -SEQUENCE:-1 -DTSTART:20000529T130000 -DTEND:20000529T130000 -DCREATED:20000524T125250 -LAST-MODIFIED:20000524T125250 -SUMMARY:Eurphrates et filistu -STATUS:NEEDS ACTION -CLASS:PUBLIC -PRIORITY:0 -TRANSP:0 -ORGNAME:ola -X-PILOTID:4441124 -X-PILOTSTAT:0 -END:VEVENT - -BEGIN:VEVENT -UID:20000524T125250-1004-500-1-13 -SEQUENCE:-1 -DTSTART:20000528T000000 -DTEND:20000528T235900 -DCREATED:20000524T125250 -LAST-MODIFIED:20000524T125250 -SUMMARY:Calaphgyian, napiform malefactors -STATUS:NEEDS ACTION -CLASS:PUBLIC -PRIORITY:0 -TRANSP:0 -ORGNAME:ola -X-PILOTID:4441156 -X-PILOTSTAT:0 -END:VEVENT - -BEGIN:VEVENT -UID:20000524T125250-1004-500-1-12 -SEQUENCE:-1 -DTSTART:20000527T150000 -DTEND:20000527T160000 -DCREATED:20000524T125250 -LAST-MODIFIED:20000524T125250 -SUMMARY: aphasiac puntildictus -STATUS:NEEDS ACTION -CLASS:PUBLIC -PRIORITY:0 -TRANSP:0 -ORGNAME:ola -X-PILOTID:4441155 -X-PILOTSTAT:0 -END:VEVENT - - -END:VCALENDAR - |