diff options
Diffstat (limited to 'libical')
53 files changed, 5026 insertions, 3742 deletions
diff --git a/libical/ChangeLog b/libical/ChangeLog index baf8b5a41c..40dd839d62 100644 --- a/libical/ChangeLog +++ b/libical/ChangeLog @@ -1,3 +1,50 @@ +2000-08-04 <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@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@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@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. @@ -5,11 +52,23 @@ * src/libicalss/Makefile.am (INCLUDES): Use $(srcdir) to allow builddir != srcdir. -2000-03-17 Eric Busboom <eric@agony.qualcomm.com> +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@agony.qualcomm.com> +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, diff --git a/libical/Makefile.am b/libical/Makefile.am index 66b37da052..8dcd95a438 100644 --- a/libical/Makefile.am +++ b/libical/Makefile.am @@ -1,11 +1,9 @@ - EXTRA_DIST = \ ChangeLog \ README \ TEST \ TODO -SUBDIRS = design-data doc scripts test-data src - +SUBDIRS = design-data doc scripts test-data src examples diff --git a/libical/NEWS b/libical/NEWS index 71f18ff45b..fb945eb9a2 100644 --- a/libical/NEWS +++ b/libical/NEWS @@ -1,3 +1,49 @@ +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 ) --------------------------------------------- @@ -5,7 +51,7 @@ Fixed two bugs that added extraneous '/' to test values Fixed type in internal string for the COUNTER method -Eliminated a mempry leak in icalparser.c +Eliminated a memory leak in icalparser.c Version 0.16a 29 April 00 diff --git a/libical/README b/libical/README index e0f7641e1e..ce27e309c0 100644 --- a/libical/README +++ b/libical/README @@ -17,6 +17,11 @@ 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 @@ -36,8 +41,8 @@ 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 ) but I don't know about -any other systems. +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 diff --git a/libical/THANKS b/libical/THANKS index 6a51d866fa..6e867ffe27 100644 --- a/libical/THANKS +++ b/libical/THANKS @@ -1,5 +1,7 @@ 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 @@ -7,4 +9,16 @@ 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.
\ No newline at end of file +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. diff --git a/libical/TODO b/libical/TODO index b27e505b35..98d0c2d2b1 100644 --- a/libical/TODO +++ b/libical/TODO @@ -30,3 +30,7 @@ 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. diff --git a/libical/configure.in b/libical/configure.in index c722c0fee1..238429c187 100644 --- a/libical/configure.in +++ b/libical/configure.in @@ -1,7 +1,7 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(src/libical/ical.h) AM_CONFIG_HEADER(config.h) -AM_INIT_AUTOMAKE(libical,0.17) +AM_INIT_AUTOMAKE(libical,0.19) dnl Checks for programs. AC_PROG_YACC @@ -37,16 +37,18 @@ AC_STRUCT_TM dnl Checks for library functions. AC_CHECK_FUNCS(strdup) -AC_OUTPUT([ -Makefile -config.h -design-data/Makefile -doc/Makefile -scripts/Makefile -src/Makefile -src/libical/Makefile -src/libical/icalversion.h -src/libicalss/Makefile -src/test/Makefile -test-data/Makefile -] ) +AC_OUTPUT(\ +src/libical/icalversion.h \ +config.h \ +src/libical/Makefile \ +src/libicalss/Makefile \ +src/libicalvcal/Makefile \ +src/test/Makefile \ +examples/Makefile \ +src/Makefile \ +design-data/Makefile \ +doc/Makefile \ +scripts/Makefile \ +test-data/Makefile \ +src/Makefile \ +Makefile ) diff --git a/libical/design-data/components.txt b/libical/design-data/components.txt index 15417eaf2f..ae5cc976ad 100644 --- a/libical/design-data/components.txt +++ b/libical/design-data/components.txt @@ -17,5 +17,6 @@ VQUERY VCAR VCOMMAND XLICINVALID +XMIMEPART ANY diff --git a/libical/design-data/prop-to-value.txt b/libical/design-data/prop-to-value.txt index a06bdc31f1..4f4bf196ff 100644 --- a/libical/design-data/prop-to-value.txt +++ b/libical/design-data/prop-to-value.txt @@ -34,8 +34,7 @@ CREATED DATE-TIME DTSTAMP DATE-TIME LAST-MODIFIED DATE-TIME SEQUENCE INTEGER -X-LIC-ERROR TEXT -X-LIC-CLUSTERCOUNT INTEGER +X TEXT REQUEST-STATUS STRING ATTACH ATTACH # Non-std: URI or BINARY GEO GEO # Non-std: Two FLOATS @@ -48,3 +47,11 @@ 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/doc/Makefile.am b/libical/doc/Makefile.am index 0df4f3f42d..70b008a369 100644 --- a/libical/doc/Makefile.am +++ b/libical/doc/Makefile.am @@ -1 +1 @@ -EXTRA_DIST = UsingLibical.lyx UsingLibical.ps +EXTRA_DIST = UsingLibical.lyx UsingLibical.ps UsingLibical.txt diff --git a/libical/doc/UsingLibical.lyx b/libical/doc/UsingLibical.lyx index 1742e3af00..868eac93b7 100644 --- a/libical/doc/UsingLibical.lyx +++ b/libical/doc/UsingLibical.lyx @@ -1,6 +1,5 @@ -#This file was created by <eric> Sat Feb 19 10:33:21 2000 -#LyX 1.0 (C) 1995-1999 Matthias Ettrich and the LyX Team -\lyxformat 2.15 +#LyX 1.1 created this file. For more info see http://www.lyx.org/ +\lyxformat 2.16 \textclass linuxdoc \language default \inputencoding default @@ -31,7 +30,15 @@ Using Libical Eric Busboom (eric@softwarestudio.org) \layout Date -January 2000 +May 2000 +\layout Standard + + +\begin_inset LatexCommand \tableofcontents{} + +\end_inset + + \layout Section Introduction @@ -45,52 +52,9 @@ Libical is an Open Source implementation of the iCalendar protocols and \layout Standard -Libical implements the following specifications and protocols -\layout Standard -\added_space_top 0.3cm \added_space_bottom 0.3cm \LyXTable -multicol5 -5 2 0 0 -1 -1 -1 -1 -1 0 0 0 -1 0 0 0 -1 0 0 0 -1 0 0 0 -1 1 0 0 -8 1 0 "" "" -8 1 1 "" "" -0 8 1 0 0 0 0 "" "" -0 8 1 0 0 0 0 "" "" -0 8 1 0 0 0 0 "" "" -0 8 1 0 0 0 0 "" "" -0 8 1 0 0 0 0 "" "" -0 8 1 0 0 0 0 "" "" -0 8 1 0 0 0 0 "" "" -0 8 1 0 0 0 0 "" "" -0 8 1 0 0 0 0 "" "" -0 8 1 0 0 0 0 "" "" - -iCal Core -\newline -2445 -\newline -iTIP -\newline -2446 -\newline -iMIP -\newline -2447 -\newline -iRIP -\newline -draft -\newline -CAP -\newline -draft -\layout Standard - -(The current version, 0.15, does not implement iRip or CAP. - ) +Libical implements RFC2445 and RFC2446. + Eventually, it will also implement iRIP and CAP. + \layout Standard This documentation assumes that you are familiar with the iCalendar standards @@ -140,13 +104,29 @@ This dual license ensures that the library can be incorporated into both dual-licensed. \layout Subsection -Purpose & Goals -\layout Subsection +Example Code +\layout Standard -Document version -\layout Verbatim +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 -$Id: UsingLibical.lyx,v 1.5 2000/06/06 22:48:07 alves Exp $ +src/test +\begin_inset Quotes erd +\end_inset + + for more annotated examples. + \layout Section Building the Library @@ -214,65 +194,51 @@ n of Components, Properties, Parameters an Values, and to allow the user to manipulate the data in various ways \layout Standard \added_space_bottom 0.3cm -\begin_float fig -\layout Standard - - -\begin_inset Figure size 180 147 -file icaluml.eps -flags 13 - -\end_inset - - -\end_float -When a component is send across a network, if it is un-encrypted, it will +When a component is sent across a network, if it is un-encrypted, it will look something like: -\layout Code +\layout Verbatim BEGIN:VEVENT -\layout Code +\layout Verbatim DTSTAMP:19980309T231000Z -\layout Code +\layout Verbatim UID:guid-1.host1.com -\layout Code +\layout Verbatim ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com -\layout Code +\layout Verbatim ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP: -\layout Code - +\layout Verbatim -\protected_separator - MAILTO:employee-A@host.com -\layout Code + MAILTO:employee-A@host.com +\layout Verbatim DESCRIPTION:Project XYZ Review Meeting -\layout Code +\layout Verbatim CATEGORIES:MEETING -\layout Code +\layout Verbatim CLASS:PUBLIC -\layout Code +\layout Verbatim CREATED:19980309T130000Z -\layout Code +\layout Verbatim SUMMARY:XYZ Project Review -\layout Code +\layout Verbatim DTSTART;TZID=US-Eastern:19980312T083000 -\layout Code +\layout Verbatim DTEND;TZID=US-Eastern:19980312T093000 -\layout Code +\layout Verbatim LOCATION:1CP Conference Room 4350 -\layout Code +\layout Verbatim END:VEVENT \layout Subsection @@ -556,7 +522,7 @@ new Strings, of course, are passed in by reference, but libical will take ownership of the memory, so you had beter strdup() the data unless you want a core dump when the memory is freed for the second time. - Libical has some complex bu very regular memory handling rules. + Libical has some complex but very regular memory handling rules. These are detailed in section \begin_inset LatexCommand \ref{sec:memory} @@ -578,880 +544,97 @@ vaargs Constructors \layout Standard There is another way to create complex components, which is arguable more - elegant, if you are not horrified by vaargs. - The vaargs constructor interface all you to create intricate components + elegant, if you are not horrified by varargs. + The varargs constructor interface all you to create intricate components in a single block of text. -\layout Code - - -\protected_separator - -\protected_separator - -\protected_separator - calendar = -\layout Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -icalcomponent_vanew( -\layout Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - ICAL_VCALENDAR_COMPONENT, -\layout Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - icalproperty_new_version(strdup("2.0")), -\layout Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - icalproperty_new_prodid(strdup("-//RDU Software//NONSGML HandCal//EN")), -\layout Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - icalcomponent_vanew( -\layout Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -ICAL_VEVENT_COMPONENT, -\layout Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -icalproperty_new_dtstamp(atime), -\layout Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -icalproperty_new_uid(strdup("guid-1.host1.com")), -\layout Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -icalproperty_vanew_organizer( -\layout Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - strdup("mrbig@host.com"), -\layout Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - icalparameter_new_role(ICAL_ROLE_CHAIR), -\layout Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - 0 -\layout Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -), -\layout Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -icalproperty_vanew_attendee( -\layout Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - strdup("employee-A@host.com"), -\layout Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT), -\layout Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - icalparameter_new_rsvp(1), -\layout Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - icalparameter_new_cutype(ICAL_CUTYPE_GROUP), -\layout Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - 0 -\layout Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - ), -\layout Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -icalproperty_new_location(strdup("1CP Conference Room 4350")), -\layout Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -0 -\layout Code - - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator +\layout Verbatim -\protected_separator + calendar = +\layout Verbatim -\protected_separator + icalcomponent_vanew( +\layout Verbatim -\protected_separator + ICAL_VCALENDAR_COMPONENT, +\layout Verbatim -\protected_separator + icalproperty_new_version(strdup("2.0")), +\layout Verbatim -\protected_separator -), -\layout Code + icalproperty_new_prodid(strdup( +\layout Verbatim + "-//RDU Software//NONSGML HandCal//EN")), +\layout Verbatim -\protected_separator + icalcomponent_vanew( +\layout Verbatim -\protected_separator + ICAL_VEVENT_COMPONENT, +\layout Verbatim -\protected_separator + icalproperty_new_dtstamp(atime), +\layout Verbatim -\protected_separator + icalproperty_new_uid(strdup("guid-1.host1.com")), +\layout Verbatim -\protected_separator + icalproperty_vanew_organizer( +\layout Verbatim -\protected_separator + strdup("mrbig@host.com"), +\layout Verbatim -\protected_separator + icalparameter_new_role(ICAL_ROLE_CHAIR), +\layout Verbatim -\protected_separator + 0 +\layout Verbatim -\protected_separator + ), +\layout Verbatim -\protected_separator + icalproperty_vanew_attendee( +\layout Verbatim -\protected_separator - 0 -\layout Code + strdup("employee-A@host.com"), +\layout Verbatim + icalparameter_new_role( +\layout Verbatim -\protected_separator + ICAL_ROLE_REQPARTICIPANT), +\layout Verbatim -\protected_separator + icalparameter_new_rsvp(1), +\layout Verbatim -\protected_separator + icalparameter_new_cutype(ICAL_CUTYPE_GROUP), +\layout Verbatim -\protected_separator + 0 +\layout Verbatim -\protected_separator + ), +\layout Verbatim -\protected_separator + icalproperty_new_location(strdup( +\layout Verbatim -\protected_separator + "1CP Conference Room 4350")), +\layout Verbatim -\protected_separator + 0 +\layout Verbatim -\protected_separator + ), +\layout Verbatim -\protected_separator + 0 +\layout Verbatim -\protected_separator - ); + ); \layout Standard This form is similar to the regular constructor, except that they have @@ -1492,200 +675,186 @@ icalcomponent* icalparser_parse_string(char* str); This may seem wasteful if you want to pull a large component off of the network; you may prefer to parse the component line by line. - This is possible too, with + This is possible too by using: \layout Verbatim -icalcomponent* icalparser_parse(char*(*line_gen_func)(char *s, size_t size, - void *d)); -\layout Standard +icalparser* icalparser_new(); +\layout Verbatim -This routine takes a pointer to a function that copies 'size' characters - to 's'. - The routine returns 's', similar to fgets(). - See string_line_generator in icalparser.c for an example. - -\layout Subsection +void icalparser_free(icalparser* parser); +\layout Verbatim -Accessing Components -\layout Standard +icalparser_get_line(parser,read_stream); +\layout Verbatim -Given a reference to a component, you probably will want to access the propertie -s, parameters and values inside. - -\layout Subsubsection +icalparser_add_line(parser,line); +\layout Verbatim -Finding Components +icalparser_set_gen_data(parser,stream) \layout Standard -To find a sub-component of a component, use: +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. + For an example: \layout Verbatim -icalproperty* icalcomponent_get_first_component( +char* read_stream(char *s, size_t size, void *d) \layout Verbatim - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -icalcomponent* component, +{ \layout Verbatim + char *c = fgets(s,size, (FILE*)d); +\layout Verbatim -\protected_separator - -\protected_separator - -\protected_separator + return c; +\layout Verbatim -\protected_separator +} +\layout Verbatim -\protected_separator +main() { +\layout Verbatim -\protected_separator + char* line; +\layout Verbatim -\protected_separator + icalcomponent *c; +\layout Verbatim -\protected_separator + icalparser *parser = icalparser_new(); +\layout Verbatim -\protected_separator + FILE* stream = fopen(argv[1],"r"); +\layout Verbatim -\protected_separator + icalparser_set_gen_data(parser,stream); +\layout Verbatim -\protected_separator + do{ +\layout Verbatim -\protected_separator + line = icalparser_get_line(parser,read_stream); +\layout Verbatim -\protected_separator + c = icalparser_add_line(parser,line); +\layout Verbatim -\protected_separator + if (c != 0){ +\layout Verbatim -\protected_separator + printf("%s",icalcomponent_as_ical_string(c)); +\layout Verbatim -\protected_separator + icalparser_claim(parser); +\layout Verbatim -\protected_separator + printf(" +\backslash +n--------------- +\backslash +n"); +\layout Verbatim -\protected_separator + icalcomponent_free(c); +\layout Verbatim -\protected_separator + } +\layout Verbatim -\protected_separator + } while ( line != 0); +\layout Verbatim -\protected_separator +} +\layout Standard -\protected_separator +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(). + +\layout Standard -\protected_separator +Using the same mechanism, other implmentations could read from memory buffers, + sockets or other interfaces. + +\layout Standard -\protected_separator +Since the example code is a very common way to use the parser, there is + a convienience routine; +\layout Verbatim -\protected_separator +icalcomponent* icalparser_parse(icalparser *parser, +\layout Verbatim -\protected_separator + char* (*line_gen_func)(char *s, size_t sise, void* d)) +\layout Standard -\protected_separator +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 cmponents 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. + See section 6.2.2 for how to iterate through the child components. + +\layout Subsection -\protected_separator +Accessing Components +\layout Standard -\protected_separator +Given a reference to a component, you probably will want to access the propertie +s, parameters and values inside. + Libical interface let you find sub-component, add and remove sub-components, + and do the same three operations on properties. + +\layout Subsubsection -\protected_separator +Finding Components +\layout Standard -\protected_separator +To find a sub-component of a component, use: +\layout Verbatim -\protected_separator +icalcomponent* icalcomponent_get_first_component( +\layout Verbatim -\protected_separator + icalcomponent* component, +\layout Verbatim -\protected_separator -icalcomponent_kind kind); + 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 Code +\layout Verbatim ICAL_ANY_COMPONENT -\layout Code +\layout Verbatim ICAL_VEVENT_COMPONENT -\layout Code +\layout Verbatim ICAL_VTODO_COMPONENT -\layout Code +\layout Verbatim ICAL_VJOURNAL_COMPONENT -\layout Code +\layout Verbatim ICAL_VCALENDAR_COMPONENT -\layout Code +\layout Verbatim ICAL_VFREEBUSY_COMPONENT -\layout Code +\layout Verbatim ICAL_VALARM_COMPONENT \layout Standard @@ -1707,59 +876,33 @@ Iteration requires a second routine to get the next subcomponent after the first: \layout Verbatim -icalcomponent* icalcomponent_get_next_component(icalcomponent* component, - +icalcomponent* icalcomponent_get_next_component( +\layout Verbatim + + icalcomponent* component, \layout Verbatim -icalcomponent_kind kind); + 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 Code - - -\protected_separator - for(c = icalcomponent_get_first_component(comp,ICAL_ANY_COMPONENT); -\layout Code - +\layout Verbatim -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -c != 0; -\layout Code + for(c = icalcomponent_get_first_component(comp,ICAL_ANY_COMPONENT); +\layout Verbatim + c != 0; +\layout Verbatim -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -c = icalcomponent_get_next_component(comp,ICAL_ANY_COMPONENT)) -\layout Code + c = icalcomponent_get_next_component(comp,ICAL_ANY_COMPONENT)) +\layout Verbatim { -\layout Code - +\layout Verbatim -\protected_separator - -\protected_separator - -\protected_separator - do_something(c); -\layout Code + do_something(c); +\layout Verbatim } \layout Standard @@ -1777,62 +920,63 @@ Libical component have internal iterators, so you can only have one iteration Removing an element from a list while iterating through the list can cause problems, since you will probably be removing the element that the internal iterator points to. - This will result in the iteration loop terminating immediately after removing - the element. - To avoid the problem, you will need to step the iterator ahead of the element - you are going to remove, like this: -\layout Code + 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 Verbatim for(c = icalcomponent_get_first_component(parent_comp,ICAL_ANY_COMPONENT); -\layout Code - - -\protected_separator +\layout Verbatim -\protected_separator + c != 0; +\layout Verbatim -\protected_separator + c = next +\layout Verbatim -\protected_separator +{ +\layout Verbatim -\protected_separator + next = icalcomponent_get_next_component(parent_comp,ICAL_ANY_COMPONENT); +\layout Verbatim -\protected_separator + icalcomponent_remove_component(parent_comp,c); +\layout Verbatim -\protected_separator -c != 0; -\layout 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 Verbatim -\protected_separator - -\protected_separator - -\protected_separator - -\protected_separator -c = next -\layout Code +icalcomponent_get_first_component(parent_comp,ICAL_VEVENT_COMPONENT); +\layout Verbatim -{ -\protected_separator - -\protected_separator - -\layout Code +while((c=icalcomponent_get_current_component(c)) != 0 ){ +\layout Verbatim + if(icalcomponent_isa(c) == ICAL_VEVENT_COMPONENT){ +\layout Verbatim -\protected_separator -next = icalcomponent_get_next_component(parent_comp,ICAL_ANY_COMPONENT); -\layout Code + icalcomponent_remove_component(parent_comp,inner); +\layout Verbatim + } else { +\layout Verbatim -\protected_separator + icalcomponent_get_next_component(parent_comp,ICAL_VEVENT_COMPONENT); -\protected_separator - icalcomponent_remove_component(parent_comp,c); -\layout Code +\layout Verbatim + + } +\layout Verbatim } \layout Subsubsection @@ -1848,169 +992,73 @@ Finding, iterating and removing properties works the same as it does for icalproperty* icalcomponent_get_first_property( \layout Verbatim - -\protected_separator - -\protected_separator - -\protected_separator -icalcomponent* component, + icalcomponent* component, \layout Verbatim - -\protected_separator - -\protected_separator - -\protected_separator -icalproperty_kind kind); + icalproperty_kind kind); \layout Verbatim icalproperty* icalcomponent_get_next_property( \layout Verbatim - -\protected_separator - -\protected_separator - -\protected_separator -icalcomponent* component, + icalcomponent* component, \layout Verbatim - -\protected_separator - -\protected_separator - -\protected_separator -icalproperty_kind kind); + icalproperty_kind kind); \layout Verbatim void icalcomponent_add_property( \layout Verbatim - -\protected_separator - -\protected_separator - -\protected_separator -icalcomponent* component, + icalcomponent* component, \layout Verbatim - -\protected_separator - -\protected_separator - -\protected_separator -icalproperty* property); + icalproperty* property); \layout Verbatim void icalcomponent_remove_property( \layout Verbatim - -\protected_separator - -\protected_separator - -\protected_separator -icalcomponent* component, + icalcomponent* component, \layout Verbatim - -\protected_separator - -\protected_separator - -\protected_separator -icalproperty* property); + icalproperty* property); \layout Verbatim icalparameter* icalproperty_get_first_parameter( \layout Verbatim - -\protected_separator - -\protected_separator - -\protected_separator -icalproperty* prop, + icalproperty* prop, \layout Verbatim - -\protected_separator - -\protected_separator - -\protected_separator -icalparameter_kind kind); + icalparameter_kind kind); \layout Verbatim icalparameter* icalproperty_get_next_parameter( \layout Verbatim - -\protected_separator - -\protected_separator - -\protected_separator -icalproperty* prop, + icalproperty* prop, \layout Verbatim - -\protected_separator - -\protected_separator - -\protected_separator -icalparameter_kind kind); + icalparameter_kind kind); \layout Verbatim void icalproperty_add_parameter( \layout Verbatim - -\protected_separator - -\protected_separator - -\protected_separator -icalproperty* prop, + icalproperty* prop, \layout Verbatim - -\protected_separator - -\protected_separator - -\protected_separator -icalparameter* parameter); + icalparameter* parameter); \layout Verbatim void icalproperty_remove_parameter( \layout Verbatim - -\protected_separator - -\protected_separator - -\protected_separator -icalproperty* prop, + icalproperty* prop, \layout Verbatim - -\protected_separator - -\protected_separator - -\protected_separator -icalparameter_kind kind); + icalparameter_kind kind); \layout Subsubsection Getting Values @@ -2029,6 +1077,97 @@ Removing Parameters \layout Subsubsection Checking Component Validity +\layout Standard + +RFC 2446 defines rules for what properties must exist in a component to + be used for transfering scheduling data. + Most of these rules relate to the existence of properties relative to the + METHOD property, which declares what operation a remote reciever 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 reciever to join in a meeting. + I this case, RFC2446 says that the component must specify a start time + (DTSTART) and list the reciever as an attendee (ATTENDEE). + +\layout Standard + +Libical can check these restrictions with the routine: +\layout Verbatim + +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 representtion of an object, use one + of the *_as_ical_string() routines: +\layout Verbatim + +char* icalcomponent_as_ical_string (icalcomponent* component) +\layout Verbatim + +char* icalproperty_as_ical_string (icalproperty* property) +\layout Verbatim + +char* icalparameter_as_ical_string (icalparameter* parameter) +\layout Verbatim + +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 +r +\backslash +n +\begin_inset Quotes erd +\end_inset + + However, if you compile with the symbol ICAL_UNIX_NEWLINE defined, it will + terminate lines with +\begin_inset Quotes eld +\end_inset + + +\backslash +n +\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 Storing Objects @@ -2037,7 +1176,8 @@ Storing Objects The libical distribution inclues a seperate library, libicalss, that allows you to store iCal component data to disk in a variety of ways. This library is documented seperately. - + ( & currently, not at all. + ) \layout Subsection @@ -2089,26 +1229,172 @@ Libical relies heavily on dynamic allocation for both the core objects and Error Handling \layout Standard -icalerror_errno. - Return values. - #defines. - icalerror_stop_here. - X-LIC-ERROR +Libical has several error handling mechanisms for the varioustypes of programmin +g, 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 Subsubsection +\layout Standard -Component errors +Most routines will set the global error value icalerrno on errors. + This variable is an enumeration; permissable 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 \layout Subsubsection -icalerror_stop_here -\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 requirments 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 Verbatim + +X-LIC-ERROR;X-LIC-ERRORTYPE=INVALID_ITIP :Failed iTIP restrictions for property + DTSTART. + 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 +1 0 0 0 +0 1 1 0 +1 0 0 0 +0 1 1 0 +1 1 0 0 +0 1 1 0 +1 1 0 0 +0 1 1 0 +0 1 1 0 +2 1 0 "" "" +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 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 Verbatim -X-LIC-ERROR +ICAL_XLICERRORTYPE_COMPONENTPARSEERROR +\layout Verbatim + +ICAL_XLICERRORTYPE_PARAMETERVALUEPARSEERROR +\layout Verbatim + +ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR +\layout Verbatim + +ICAL_XLICERRORTYPE_PROPERTYPARSEERROR +\layout Verbatim + +ICAL_XLICERRORTYPE_VALUEPARSEERROR +\layout Verbatim + +ICAL_XLICERRORTYPE_UNKVCALPROP +\layout Verbatim + +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 ina + 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 Subsection Naming Standard @@ -2249,8 +1535,21 @@ Finding compliance errors Performance \layout Standard -Checking restrictions is computationally expensive +Checking restrictions is computationally expensive. \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 propbably 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 index 0417ded6a5..83c8f6203f 100644 --- a/libical/doc/UsingLibical.ps +++ b/libical/doc/UsingLibical.ps @@ -1,7 +1,7 @@ %!PS-Adobe-2.0 %%Creator: dvips(k) 5.85 Copyright 1999 Radical Eye Software %%Title: UsingLibical.dvi -%%Pages: 6 +%%Pages: 10 %%PageOrder: Ascend %%BoundingBox: 0 0 612 792 %%EndComments @@ -10,7 +10,7 @@ %+ /usr/local/home/eric/proj/FreeAssociation/libical/doc/UsingLibical.ps %+ UsingLibical.dvi %DVIPSParameters: dpi=600, compressed -%DVIPSSource: TeX output 2000.02.18:1517 +%DVIPSSource: TeX output 2000.06.10:1815 %%BeginProcSet: texc.pro %! /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S @@ -71,89 +71,115 @@ 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 ecbx1000 10 47 -/Fa 47 122 df<913A03FF8007FE027F9039F07FFF800103B500FDB512E0010F903A00FF +%DVIPSBitmapFont: Fa ecrm0600 6 1 +/Fa 1 50 df<13E01201120712FF12F91201B3A7487EB512C0A212217AA01E>49 +D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fb ecbx1000 10 55 +/Fb 55 122 df<913A03FF8007FE027F9039F07FFF800103B500FDB512E0010F903A00FF FE0FF0D93FF8ECF81F90267FE0019038F03FF849485A4816E014804816C00200ED1FF081 F007C06F91C7FCA8B912E0A4000390C701C0C7FCB3ABB5D8FC3FEBFF80A43D3A7EB938> 27 D<12E07E127C7E7E7F6C7E6C7E12037F6C7E7F12007F137E137FA2EB3F80A214C013 1F14E0A2130F14F0A4EB07F8A514FCB114F8A5EB0FF0A414E0131FA214C0133F1480A2EB 7F00A2137E13FE5B12015B485A5B1207485A485A90C7FC123E5A12F05A16537BBD25>41 -D<EA0F80EA3FE0EA7FF0A2EAFFF8A5EA7FF0A2EA3FE0EA0F800D0D798C1B>46 -D<49B4FC011F13F0017F13FC9038FF83FE4848C67E4848EB7F804848EB3FC04848EB1FE0 -A2001F15F0A24848EB0FF8A3007F15FCA400FF15FEB3007F15FCA5003F15F86D131FA200 -1F15F0A26C6CEB3FE0000715C06C6CEB7F806C6CEBFF003900FF83FE6DB45A011F13F001 -0190C7FC27377CB530>48 D<141E143E14FE1307137FB5FCA3138FEA000FB3B3A5007FB6 -1280A4213679B530>I<EB0FFE90387FFFC048B512F0000714FC390FE03FFF261F800F13 -80263F000313C0D87F8014E0EBE00100FF6D13F07FA2ED7FF8A46C5A6C5A0006C7FCC8FC -EDFFF0A216E05C16C04A138016004A5A4A5AEC1FF05D4A5A4AC7FC14FE495AD903F01378 -495A495A495A49C712F8017C14F05B49130148B6FC5A5A5A5A5A4815E0B7FCA425367BB5 -30>I<EB03FF011F13F0017F13FC3901FC07FF2603F003138048486C13C0496C13E0EA0F -F86D14F0487EA66C4814E06C5A6C485AC714C04A138016004A5A4A5AEC3FF090380FFFC0 -5D15F090380007FE913801FF806E13C016E0ED7FF016F8ED3FFCA216FEEA1FC0487E487E -487EA416FCA249137F007F15F801C0EBFFF06C5A6C6C4813E0260FFC0713806CB6120000 -0114FC6C6C13F0010790C7FC27377CB530>I<ED07C0150FA2151F153F157F15FF5CA25C -5C5C5C143E143C5C5C1301495A5C495A495A5B133E5B13785B485A1203485A5B48C7FC12 -1E5A127C5AB81280A4C70001EBC000AA0103B61280A429367DB530>I<001C15C0D81F80 -130701F8137F90B61280A216005D5D15F05D15804AC7FC14F090C9FCA7EB03FE90381FFF -E0017F13F89038FE07FC9038F003FFD9C0011380496C13C090C7FC000E15E0C8127F16F0 -A216F8A3121FEA3FC0487E12FF7FA316F05B15FFD87F8014E0007EC713C0003E5B003F49 -13806C6C481300390FF01FFE6CB512F8000114E06C6C1380D90FF8C7FC25377BB530>I< -EC0FF8ECFFFE0103EBFF8090390FF80FC090393FE003E090397F8001F09038FF000F48EC -1FF84848133F485A120F5B121FA2003FEC1FF0ED0FE0484890C7FCA31408EC7FF039FFF1 -FFFC01F313FFD9F78013809039FF007FC049EB3FE04914F0ED1FF85B16FCA34914FEA412 -7FA5123F16FCA26C7E16F8000F143F6D14F0000715E06C6CEB7FC03A01FF81FF806C90B5 -1200013F13FC010F13F00101138027377CB530>I<123C123EEA3FE090B71280A4170048 -5D5E5E5E5EA2007CC7EA0FC000784A5A4BC7FC00F8147E485C5D14014A5AC7485A4A5AA2 -4A5A143F4AC8FCA214FEA213015C1303A21307A2130F5CA2131FA5133FA96D5A6D5A6D5A -29397BB730>I<49B47E010F13F0013F13FC9038FE01FF3A01F8007F804848EB3FC04848 -EB1FE0150F484814F01507121FA27F7F7F6D130F01FF14E014C09138E01FC06CEBF83F91 -38FE7F806C9038FFFE005D6C14F06C14FC6C14FF6D14806D14C090B612E0D803FD14F026 -07F07F13F848487E261FC00F13FC383F8003007F010013FE90C7127F151F00FE14071503 -1501A21500A216FC7E6C14016D14F86C6C13036DEB07F06C6CEB0FE0D80FFEEB7FC00003 -B61200C614FC013F13F00103138027377CB530>I<EB03FF011F13E0017F13F83901FF01 -FE48486C7E4848EB7F80484814C0001FEC3FE0485AED1FF0127F16F8A212FF16FCA416FE -A5007F143FA3123F157F6C7E000F14FF6C6C5A3903FE03DF6CB5129F6C6C131FD91FFC13 -FCEB00201400A3D80FE0EB3FF8487E486C14F0A216E0157F16C0EDFF80495A6C48481300 -90388007FE390FE01FF86CB55A6C14C0C691C7FCEB1FF027377CB530>I<DB3FFCEB01C0 -0203B5EAC003021FECF00791B6EAFC0F01039039FC00FF3F4901C0EB1FFFD91FFEC77E49 -481403D97FF080494880485B48177F4849153F4890C9FC181F485A180F123F5B1807127F -A24993C7FC12FFAD127F7FF003C0123FA27F001F1707A26C6C1780180F6C6D16006C6D5D -6C173E6C6D157ED97FF85D6D6C4A5A6DB44A5A010701C0EB0FE06D01FCEBFF80010090B5 -48C7FC021F14F8020314E09126003FFEC8FC3A3B7BB945>67 D<B87E17F817FF18C02800 -7FF8000713F09338007FF8EF1FFE717E050313807113C0A27113E0F07FF0A2F03FF8A219 -FC181FA219FEA419FFAC19FEA419FC183FA219F8187F19F0F0FFE0A24D13C04D13804D13 -00EF1FFEEF7FFC933807FFF0B912C095C7FC17FC178040397DB849>I<B912C0A43A007F -F800039338007FE0171F170F1707A21703A21701A318F0EE7800A41800A216F8A2150115 -0791B5FCA4ECF80715011500A21678A693C8FCADB7FCA434397DB83C>70 -D<DB3FFCEB01C00203B5EAC003021FECF00791B6EAFC0F01039039FC00FF3F4901C0EB1F +D<B61280A819087F9620>45 D<EA0F80EA3FE0EA7FF0A2EAFFF8A5EA7FF0A2EA3FE0EA0F +800D0D798C1B>I<49B4FC011F13F0017F13FC9038FF83FE4848C67E4848EB7F804848EB +3FC04848EB1FE0A2001F15F0A24848EB0FF8A3007F15FCA400FF15FEB3007F15FCA5003F +15F86D131FA2001F15F0A26C6CEB3FE0000715C06C6CEB7F806C6CEBFF003900FF83FE6D +B45A011F13F0010190C7FC27377CB530>48 D<141E143E14FE1307137FB5FCA3138FEA00 +0FB3B3A5007FB61280A4213679B530>I<EB0FFE90387FFFC048B512F0000714FC390FE0 +3FFF261F800F1380263F000313C0D87F8014E0EBE00100FF6D13F07FA2ED7FF8A46C5A6C +5A0006C7FCC8FCEDFFF0A216E05C16C04A138016004A5A4A5AEC1FF05D4A5A4AC7FC14FE +495AD903F01378495A495A495A49C712F8017C14F05B49130148B6FC5A5A5A5A5A4815E0 +B7FCA425367BB530>I<EB03FF011F13F0017F13FC3901FC07FF2603F003138048486C13 +C0496C13E0EA0FF86D14F0487EA66C4814E06C5A6C485AC714C04A138016004A5A4A5AEC +3FF090380FFFC05D15F090380007FE913801FF806E13C016E0ED7FF016F8ED3FFCA216FE +EA1FC0487E487E487EA416FCA249137F007F15F801C0EBFFF06C5A6C6C4813E0260FFC07 +13806CB61200000114FC6C6C13F0010790C7FC27377CB530>I<ED07C0150FA2151F153F +157F15FF5CA25C5C5C5C143E143C5C5C1301495A5C495A495A5B133E5B13785B485A1203 +485A5B48C7FC121E5A127C5AB81280A4C70001EBC000AA0103B61280A429367DB530>I< +001C15C0D81F80130701F8137F90B61280A216005D5D15F05D15804AC7FC14F090C9FCA7 +EB03FE90381FFFE0017F13F89038FE07FC9038F003FFD9C0011380496C13C090C7FC000E +15E0C8127F16F0A216F8A3121FEA3FC0487E12FF7FA316F05B15FFD87F8014E0007EC713 +C0003E5B003F4913806C6C481300390FF01FFE6CB512F8000114E06C6C1380D90FF8C7FC +25377BB530>I<EC0FF8ECFFFE0103EBFF8090390FF80FC090393FE003E090397F8001F0 +9038FF000F48EC1FF84848133F485A120F5B121FA2003FEC1FF0ED0FE0484890C7FCA314 +08EC7FF039FFF1FFFC01F313FFD9F78013809039FF007FC049EB3FE04914F0ED1FF85B16 +FCA34914FEA4127FA5123F16FCA26C7E16F8000F143F6D14F0000715E06C6CEB7FC03A01 +FF81FF806C90B51200013F13FC010F13F00101138027377CB530>I<123C123EEA3FE090 +B71280A41700485D5E5E5E5EA2007CC7EA0FC000784A5A4BC7FC00F8147E485C5D14014A +5AC7485A4A5AA24A5A143F4AC8FCA214FEA213015C1303A21307A2130F5CA2131FA5133F +A96D5A6D5A6D5A29397BB730>I<49B47E010F13F0013F13FC9038FE01FF3A01F8007F80 +4848EB3FC04848EB1FE0150F484814F01507121FA27F7F7F6D130F01FF14E014C09138E0 +1FC06CEBF83F9138FE7F806C9038FFFE005D6C14F06C14FC6C14FF6D14806D14C090B612 +E0D803FD14F02607F07F13F848487E261FC00F13FC383F8003007F010013FE90C7127F15 +1F00FE140715031501A21500A216FC7E6C14016D14F86C6C13036DEB07F06C6CEB0FE0D8 +0FFEEB7FC00003B61200C614FC013F13F00103138027377CB530>I<EB03FF011F13E001 +7F13F83901FF01FE48486C7E4848EB7F80484814C0001FEC3FE0485AED1FF0127F16F8A2 +12FF16FCA416FEA5007F143FA3123F157F6C7E000F14FF6C6C5A3903FE03DF6CB5129F6C +6C131FD91FFC13FCEB00201400A3D80FE0EB3FF8487E486C14F0A216E0157F16C0EDFF80 +495A6C4848130090388007FE390FE01FF86CB55A6C14C0C691C7FCEB1FF027377CB530> +I<DB3FFCEB01C00203B5EAC003021FECF00791B6EAFC0F01039039FC00FF3F4901C0EB1F FFD91FFEC77E49481403D97FF080494880485B48177F4849153F4890C9FC181F485A180F -123F5B1807127FA24993C8FC12FFAB043FB61280A2127F7FDC0003EBC000123FA27F121F -A26C7EA26C7F6C7F6C7F7ED97FF85C6D7E6DB45C010701C05B6D01FCEBFF3F010090B5EA -FE0F021FECF8030203ECE0009126003FFEC9FC413B7BB94B>I<B612FCA439007FF800B3 -B3ADB612FCA41E397DB824>73 D<B7FCA426007FF8C9FCB3ACEF0780A5170F1800A35FA2 -5FA25F5F5E5EEE0FFE167FB8FCA431397DB839>76 D<B8FC17F017FEEFFF8028007FF800 -0F13C0040113E07013F0EF7FF8EF3FFCA2EF1FFEA218FFA818FEA2EF3FFCA2EF7FF8EFFF -F04C13E0040F13C091B7120017FC17E002F8C9FCB3A4B612FCA438397DB841>80 -D<B712FCEEFFE017FC17FF28007FF8000F13C004017F707F717E717EA2717EA284A760A2 -4D5A604D5A4D5A04035B041F90C8FC91B612FC17E0839139F8003FFCEE0FFF707F707F82 -84A2707FA584A51A601AF084177F1901DD3FFE13E0B600FC011F130394390FFF87C071EB -FF8005011400CBEA1FFC443A7DB848>82 D<D907FF130E013FEBE01E90B5EAF83E0003EC -FE7E3A07FC01FFFE390FF0001F4848130F48481303491301007F140090C8FC167E5A163E -A27F161E7F7F6D91C7FC13FC387FFFE014FEECFFF06C14FE6F7E6C816C15F06C816C81C6 -81133F010F801301D9000F1480EC007F030F13C01503818100F0157FA3163FA27E17807E -167F6C16007E6D14FE01E0495A01F813039039FF801FF800FC90B512E0D8F83F5CD8F007 -49C7FC39E0007FF02A3B7BB935>I<003FB91280A4D9F800EBF003D87FC09238007FC049 -161F007EC7150FA2007C1707A200781703A400F818E0481701A4C892C7FCB3AE010FB7FC -A43B387DB742>I<B600FC011FB512C0A426007FF8C8381FC000725AB3B3181F013F94C7 -FC8060011F163E6D6C157E187C6D6C15FC6D6D495A6D6DEB07F06D01F0EB1FE0DA7FFEEB -FFC0021FB6C8FC02075C020014F0030F1380423A7DB849>I<B600F00103B512E0A4C601 -F0C83807F0006E5E017F5F6E150FA2013F5F6E151F011F94C7FC6E5D6D163E6F147E6D16 -7CA26F14FC6D5E6F13016D5E6F13036D5E811707027F5D6F130F023F5D6F131F021F92C8 -FC815F6E143EEE807E6E147CEEC0FC6E5C16E016E16E5C16F36E5C16FF6F5BA36F5BA26F -90C9FCA26F5AA36F5AA26F5AA26F5A433A7EB848>I<EB3FFE0003B512E0000F14F8391F -F00FFE003FEB03FF6D6C7F6E7FA26F7EA26C5A6C5AEA0380C8FCA2EC3FFF010FB5FC137F -3901FFF87F00071380380FFE00EA3FF85B485A12FF5BA415FF6D5A127F263FF00713F83B -1FFC1FBFFFC0390FFFFE1F0003EBF80F39003FE0032A257DA42E>97 +123F5B1807127FA24993C7FC12FFAD127F7FF003C0123FA27F001F1707A26C6C1780180F +6C6D16006C6D5D6C173E6C6D157ED97FF85D6D6C4A5A6DB44A5A010701C0EB0FE06D01FC +EBFF80010090B548C7FC021F14F8020314E09126003FFEC8FC3A3B7BB945>67 +D<B87E17F817FF18C028007FF8000713F09338007FF8EF1FFE717E050313807113C0A271 +13E0F07FF0A2F03FF8A219FC181FA219FEA419FFAC19FEA419FC183FA219F8187F19F0F0 +FFE0A24D13C04D13804D1300EF1FFEEF7FFC933807FFF0B912C095C7FC17FC178040397D +B849>I<B912F0A426007FF8C7FCEF1FF8170717031701A21700A21878A3043C137C183C +A41800167CA216FC150391B5FCA4ECF8031500167CA2163C180FA3181EA293C7FCA2183E +A2183C187CA218FCA2EF01F81703170F173FEE01FFB9FC18F0A338397DB83F>I<B912C0 +A43A007FF800039338007FE0171F170F1707A21703A21701A318F0EE7800A41800A216F8 +A21501150791B5FCA4ECF80715011500A21678A693C8FCADB7FCA434397DB83C>I<DB3F +FCEB01C00203B5EAC003021FECF00791B6EAFC0F01039039FC00FF3F4901C0EB1FFFD91F +FEC77E49481403D97FF080494880485B48177F4849153F4890C9FC181F485A180F123F5B +1807127FA24993C8FC12FFAB043FB61280A2127F7FDC0003EBC000123FA27F121FA26C7E +A26C7F6C7F6C7F7ED97FF85C6D7E6DB45C010701C05B6D01FCEBFF3F010090B5EAFE0F02 +1FECF8030203ECE0009126003FFEC9FC413B7BB94B>I<B612FCA439007FF800B3B3ADB6 +12FCA41E397DB824>73 D<B7FCA426007FF8C9FCB3ACEF0780A5170F1800A35FA25FA25F +5F5E5EEE0FFE167FB8FCA431397DB839>76 D<B500F80403B512F06E5EA26E5ED8007FF1 +E000A2D97BFF161EA201796D5DA201786D5DA26E6C5DA36E6C4A5AA26E6C4A5AA26E6C4A +5AA26E6C4A5AA26E6C141EA36E6D5BA26E6D5BA26F6C5BA26F6C485AA36F6C485AA26F6C +485AA26F6C48C7FCA2923803FF1EA36F13BCA26F13F8A2705AA2705AA213FCB500FC6D48 +48B612F0A2EE0F80EE070054397DB85B>I<EDFFF8020FEBFF80027F14F0903A01FFC01F +FC010790380007FFD91FFC010113C0D93FF06D6C7E49486E7E49486E7E48496E7E488348 +90C86C7EA248486F1380A248486F13C0A2003F18E0A348486F13F0A400FF18F8AC007F18 +F06D5DA3003F18E0A26D5D001F18C0A26C6C4B13806C18006E5C6C6D4A5A6C5F6C6D4A5A +6D6C4A5AD93FFC49485A6DB401075B0107D9C01F90C7FC010190B512FC6D6C14F0020F14 +80020001F8C8FC3D3B7BB948>79 D<B8FC17F017FEEFFF8028007FF8000F13C0040113E0 +7013F0EF7FF8EF3FFCA2EF1FFEA218FFA818FEA2EF3FFCA2EF7FF8EFFFF04C13E0040F13 +C091B7120017FC17E002F8C9FCB3A4B612FCA438397DB841>I<B712FCEEFFE017FC17FF +28007FF8000F13C004017F707F717E717EA2717EA284A760A24D5A604D5A4D5A04035B04 +1F90C8FC91B612FC17E0839139F8003FFCEE0FFF707F707F8284A2707FA584A51A601AF0 +84177F1901DD3FFE13E0B600FC011F130394390FFF87C071EBFF8005011400CBEA1FFC44 +3A7DB848>82 D<D907FF130E013FEBE01E90B5EAF83E0003ECFE7E3A07FC01FFFE390FF0 +001F4848130F48481303491301007F140090C8FC167E5A163EA27F161E7F7F6D91C7FC13 +FC387FFFE014FEECFFF06C14FE6F7E6C816C15F06C816C81C681133F010F801301D9000F +1480EC007F030F13C01503818100F0157FA3163FA27E17807E167F6C16007E6D14FE01E0 +495A01F813039039FF801FF800FC90B512E0D8F83F5CD8F00749C7FC39E0007FF02A3B7B +B935>I<003FB91280A4D9F800EBF003D87FC09238007FC049161F007EC7150FA2007C17 +07A200781703A400F818E0481701A4C892C7FCB3AE010FB7FCA43B387DB742>I<B600FC +011FB512C0A426007FF8C8381FC000725AB3B3181F013F94C7FC8060011F163E6D6C157E +187C6D6C15FC6D6D495A6D6DEB07F06D01F0EB1FE0DA7FFEEBFFC0021FB6C8FC02075C02 +0014F0030F1380423A7DB849>I<B600F00103B512E0A4C601F0C83807F0006E5E017F5F +6E150FA2013F5F6E151F011F94C7FC6E5D6D163E6F147E6D167CA26F14FC6D5E6F13016D +5E6F13036D5E811707027F5D6F130F023F5D6F131F021F92C8FC815F6E143EEE807E6E14 +7CEEC0FC6E5C16E016E16E5C16F36E5C16FF6F5BA36F5BA26F90C9FCA26F5AA36F5AA26F +5AA26F5A433A7EB848>I<B6D8E01FB500FC90383FFFFCA4000101F0C7D83FFCC8EA7E00 +6C71153C171F6E197C017F701578836E7014F8013F6F5E6E1801011F4B6D5CA26E18036D +4B6D5CA26D6D496D495A173C6F170F6D037C6D91C7FCEF787F6F5F6D4B6C6C131E816D02 +016E5BEFE01F03F8177C027F01036E13784D7E03FCEE80F8023F49486C5C15FE021F010F +EDC1E04D7E03FF16C36E49EDE3C0041E7F049E15F76E01BC6D5C04FC15FF6E95C8FC4C80 +A26E5F4C143F6E5F4C141FA2037F5E4C140FA26F486E5AA2031F5E93C812036F5E5E3A7E +B863>I<007FB5D8F803B512F8A4C66C48C7D80FF0C7FC6D6C5D6D5E6F495A6D6D49C8FC +7F6D6D137E6F5B6DEBF8016D5D6F485A6E6C485A023F130FDA1FFF5BEE9F806E01FFC9FC +805E6E5B6E5B80826F7E153F826F7F5D4B7F92B57EA2DA01F97FDA03F17F03F07F913807 +E07FDA0FC07F021F6D7E4B7E4A486C7F027E8102FE6D7F4A7F49488149486D7F0107804A +6E7E49488149486E7E013F81017F83B60107B61280A441397DB848>I<EB3FFE0003B512 +E0000F14F8391FF00FFE003FEB03FF6D6C7F6E7FA26F7EA26C5A6C5AEA0380C8FCA2EC3F +FF010FB5FC137F3901FFF87F00071380380FFE00EA3FF85B485A12FF5BA415FF6D5A127F +263FF00713F83B1FFC1FBFFFC0390FFFFE1F0003EBF80F39003FE0032A257DA42E>97 D<13FFB5FCA412077EAF4AB47E020F13F0023F13FC9138FE03FFDAF00013804AEB7FC002 80EB3FE091C713F0EE1FF8A217FC160FA217FEAA17FCA3EE1FF8A217F06E133F6EEB7FE0 6E14C0903AFDF001FF80903AF8FC07FE009039F03FFFF8D9E00F13E0D9C00390C7FC2F3A @@ -175,212 +201,186 @@ EBFFC090387FFFE348B6EAEFE02607FE07138F260FF801131F48486C138F003F15CF4990 07FCD807FEEB3FF00001B612C06C6C91C7FC010713F02B377DA530>I<13FFB5FCA41207 7EAFED7FC0913803FFF8020F13FE91381F03FFDA3C01138014784A7E4A14C05CA25CA291 C7FCB3A3B5D8FC3F13FFA4303A7DB935>I<EA01F0EA07FC487EA2487EA56C5AA26C5AEA -01F0C8FCA913FF127FA412077EB3A9B512F8A4153B7DBA1B>I<13FFB5FCA412077EAF92 -380FFFE0A4923803FC0016F0ED0FE0ED1F804BC7FC157E5DEC03F8EC07E04A5A141FEC7F -E04A7E8181A2ECCFFEEC0FFF496C7F806E7F6E7F82157F6F7E6F7E82150F82B5D8F83F13 -F8A42D3A7EB932>107 D<13FFB5FCA412077EB3B3ACB512FCA4163A7DB91B>I<01FED97F -E0EB0FFC00FF902601FFFC90383FFF80020701FF90B512E0DA1F81903983F03FF0DA3C00 -903887801F000749DACF007F00034914DE6D48D97FFC6D7E4A5CA24A5CA291C75BB3A3B5 -D8FC1FB50083B512F0A44C257DA451>I<01FEEB7FC000FF903803FFF8020F13FE91381F -03FFDA3C011380000713780003497E6D4814C05CA25CA291C7FCB3A3B5D8FC3F13FFA430 -257DA435>I<903801FFC0010F13F8017F13FFD9FF807F3A03FE003FE048486D7E48486D -7E48486D7EA2003F81491303007F81A300FF1680A9007F1600A3003F5D6D1307001F5DA2 -6C6C495A6C6C495A6C6C495A6C6C6CB45A6C6CB5C7FC011F13FC010113C029257DA430> -I<9039FF01FF80B5000F13F0023F13FC9138FE07FFDAF00113800003496C13C00280EB7F -E091C713F0EE3FF8A2EE1FFCA3EE0FFEAA17FC161FA217F8163F17F06E137F6E14E06EEB -FFC0DAF00313809139FC07FE0091383FFFF8020F13E0020390C7FC91C9FCACB512FCA42F -357EA435>I<9038FE03F000FFEB0FFEEC3FFF91387C7F809138F8FFC000075B6C6C5A5C -A29138807F80ED3F00150C92C7FC91C8FCB3A2B512FEA422257EA427>114 -D<90383FF0383903FFFEF8000F13FF381FC00F383F0003007E1301007C130012FC15787E -7E6D130013FCEBFFE06C13FCECFF806C14C06C14F06C14F81203C614FC131F9038007FFE -140700F0130114007E157E7E157C6C14FC6C14F8EB80019038F007F090B512C000F81400 -38E01FF81F257DA426>I<130FA55BA45BA25B5BA25A1207001FEBFFE0B6FCA3000390C7 -FCB21578A815F86CEB80F014816CEBC3E090383FFFC06D1380903803FE001D357EB425> -I<01FFEC3FC0B5EB3FFFA4000714016C80B3A35DA25DA26C5C6E4813E06CD9C03E13FF90 -387FFFFC011F13F00103138030257DA435>I<B539F001FFF8A4000390C7EA1F00161E6E -133E6C153C6E137C6C15786E13F8017F5CECF001013F5C14F8011F495AA2ECFC07010F5C -ECFE0F010791C7FC6E5A6D131E15BE6D13BC15FC6D5BA36E5AA26E5AA26E5AA26E5AA22D -257EA432>I<B539F01FFFF0A4000390398003F8006C01C013E06C1407D97FE05B6D6C48 -5A6E48C7FC90381FFC3E010F5B903807FEFC6D6C5A5D6D5B6D5B6E7E6E7E814A7EA24A7E -903801F3FFD903E37FD907C17FEB0FC049486C7E4A6C7E013E80496D7E49130F00016E7E -B590383FFFF8A42D257EA432>120 D<B539F001FFF8A4000390C7EA1F00161E6E133E6C -153C6E137C6C15786E13F8017F5CECF001013F5C14F8011F495AA2ECFC07010F5CECFE0F -010791C7FC6E5A6D131E15BE6D13BC15FC6D5BA36E5AA26E5AA26E5AA26E5AA292C8FCA2 -5C141E003F133E387F803C38FFC07C147814F8EBC1F0EBC3E06C485A387D1F80D83FFFC9 -FCEA1FFCEA07F02D357EA432>I E +01F0C8FCA913FF127FA412077EB3A9B512F8A4153B7DBA1B>I<141FEC7FC0ECFFE0A249 +13F0A56D13E0A2EC7FC0EC1F0091C7FCA9EC0FF0EB0FFFA4EB007F143FB3B0121FEA3F80 +EA7FC0EAFFE0EC7FE0A215C014FF6C481380903883FE006CB45A000F13F0000113801C4B +86BA1D>I<13FFB5FCA412077EAF92380FFFE0A4923803FC0016F0ED0FE0ED1F804BC7FC +157E5DEC03F8EC07E04A5A141FEC7FE04A7E8181A2ECCFFEEC0FFF496C7F806E7F6E7F82 +157F6F7E6F7E82150F82B5D8F83F13F8A42D3A7EB932>I<13FFB5FCA412077EB3B3ACB5 +12FCA4163A7DB91B>I<01FED97FE0EB0FFC00FF902601FFFC90383FFF80020701FF90B5 +12E0DA1F81903983F03FF0DA3C00903887801F000749DACF007F00034914DE6D48D97FFC +6D7E4A5CA24A5CA291C75BB3A3B5D8FC1FB50083B512F0A44C257DA451>I<01FEEB7FC0 +00FF903803FFF8020F13FE91381F03FFDA3C011380000713780003497E6D4814C05CA25C +A291C7FCB3A3B5D8FC3F13FFA430257DA435>I<903801FFC0010F13F8017F13FFD9FF80 +7F3A03FE003FE048486D7E48486D7E48486D7EA2003F81491303007F81A300FF1680A900 +7F1600A3003F5D6D1307001F5DA26C6C495A6C6C495A6C6C495A6C6C6CB45A6C6CB5C7FC +011F13FC010113C029257DA430>I<9039FF01FF80B5000F13F0023F13FC9138FE07FFDA +F00113800003496C13C00280EB7FE091C713F0EE3FF8A2EE1FFCA3EE0FFEAA17FC161FA2 +17F8163F17F06E137F6E14E06EEBFFC0DAF00313809139FC07FE0091383FFFF8020F13E0 +020390C7FC91C9FCACB512FCA42F357EA435>I<9038FE03F000FFEB0FFEEC3FFF91387C +7F809138F8FFC000075B6C6C5A5CA29138807F80ED3F00150C92C7FC91C8FCB3A2B512FE +A422257EA427>114 D<90383FF0383903FFFEF8000F13FF381FC00F383F0003007E1301 +007C130012FC15787E7E6D130013FCEBFFE06C13FCECFF806C14C06C14F06C14F81203C6 +14FC131F9038007FFE140700F0130114007E157E7E157C6C14FC6C14F8EB80019038F007 +F090B512C000F8140038E01FF81F257DA426>I<130FA55BA45BA25B5BA25A1207001FEB +FFE0B6FCA3000390C7FCB21578A815F86CEB80F014816CEBC3E090383FFFC06D13809038 +03FE001D357EB425>I<01FFEC3FC0B5EB3FFFA4000714016C80B3A35DA25DA26C5C6E48 +13E06CD9C03E13FF90387FFFFC011F13F00103138030257DA435>I<B539F001FFF8A400 +0390C7EA1F00161E6E133E6C153C6E137C6C15786E13F8017F5CECF001013F5C14F8011F +495AA2ECFC07010F5CECFE0F010791C7FC6E5A6D131E15BE6D13BC15FC6D5BA36E5AA26E +5AA26E5AA26E5AA22D257EA432>I<B500F1B538803FFFA43D07FE000FF80003E06C6C01 +0715C082028015076C6E6C148015076C01C0ED0F00826E485C017FED801E5D90273FF01E +7F5B17C0DAF83E147C011F90393C3FE078037C14F8903B0FFC781FF0F0A29139FEF00FF1 +0107EDF9E002FF14FB6D496CB45AA24B7E6D5EA26D496C90C7FCA292C7FC6E5CA2023E14 +7C023C143C40257EA445>I<B539F01FFFF0A4000390398003F8006C01C013E06C1407D9 +7FE05B6D6C485A6E48C7FC90381FFC3E010F5B903807FEFC6D6C5A5D6D5B6D5B6E7E6E7E +814A7EA24A7E903801F3FFD903E37FD907C17FEB0FC049486C7E4A6C7E013E80496D7E49 +130F00016E7EB590383FFFF8A42D257EA432>I<B539F001FFF8A4000390C7EA1F00161E +6E133E6C153C6E137C6C15786E13F8017F5CECF001013F5C14F8011F495AA2ECFC07010F +5CECFE0F010791C7FC6E5A6D131E15BE6D13BC15FC6D5BA36E5AA26E5AA26E5AA26E5AA2 +92C8FCA25C141E003F133E387F803C38FFC07C147814F8EBC1F0EBC3E06C485A387D1F80 +D83FFFC9FCEA1FFCEA07F02D357EA432>I E %EndDVIPSBitmapFont -%DVIPSBitmapFont: Fb ecbx1200 12 47 -/Fb 47 122 df<157F913803FFC0020F7F4A7F91383FE1F891387F80789138FF007C4914 -3C495A163E4948131EA3130FA3163E163C167C16786E13F84B5A4B5A15075E6D6C485A4B -C70003B512E0153E15FC6D5B5D4B91390007C0004B5E6D6D150F4FC7FC6D6D151E49173E -496D5D491778496D15F890261FBFFE4A5AD93F3F5E9026FE1FFF1403D801FC6E495A0003 -6D5E48486C6D130F000F6F49C8FC001F6D6D133E48486C6D133C187C007F6D6D5B6F6C48 -5A00FF6E6C485A6FEB87C06F13CFEFFF806F91C9FC6D6D5B6F49EC01E06F7F6C6CEC3FFF -706D13036C6C4A6DEB07C06C6C91B500F0130FDA800702FCEB1F806C9026E03FF89039FF -80FF00000390B5D8F03FEBFFFE6CDBC00F5C6C6CDA00035C011F01F8D9007F13E0010301 -80020790C7FC4B477BC557>38 D<B612F8A91D097F9A25>45 D<EA07C0EA1FF0EA3FF8EA -7FFCEAFFFEA7EA7FFCEA3FF8EA1FF0EA07C00F0F788E1F>I<EC03C01407141F147FEB03 -FF133FB6FCA413C3EA0003B3B3ADB712FCA5264177C038>49 D<ECFFE0010F13FE013F6D -7E90B612E0000315F82607FC0313FE3A0FE0007FFFD81F806D138048C7000F13C0488001 -C015E001F07F00FF6E13F07F17F881A46C5A6C5A6C5AC9FC17F05DA217E05D17C04B1380 -4B1300A2ED1FFC4B5A5E4B5A4B5A4A90C7FC4A5A4A5AEC0FF04A5AEC3F804AC7127814FE -495A494814F8D907E014F0495A495A49C8FC017C140149140348B7FC4816E05A5A5A5A5A -B8FC17C0A42D417BC038>I<ECFFF0010713FF011F14C0017F14F049C66C7ED803F8EB3F -FED807E06D7E81D80FF86D138013FE001F16C07FA66C5A6C4815806C485BC814005D5E4B -5A4B5A4B5A4A5B020F1380902607FFFEC7FC15F815FF16C090C713F0ED3FFCED0FFEEEFF -80816F13C017E0A26F13F0A217F8A3EA0FC0EA3FF0487EA2487EA217F0A25D17E06C5A49 -4913C05BD83F80491380D81FF0491300D80FFEEBFFFE6CB612F800015D6C6C14C0011F49 -C7FC010113E02D427BC038>I<163FA25E5E5D5DA25D5D5D5DA25D92B5FCEC01F7EC03E7 -140715C7EC0F87EC1F07143E147E147C14F8EB01F0EB03E0130714C0EB0F80EB1F00133E -5BA25B485A485A485A120F5B48C7FC123E5A12FCB91280A5C8000F90C7FCAC027FB61280 -A531417DC038>I<0007150301E0143F01FFEB07FF91B6FC5E5E5E5E5E16804BC7FC5D15 -E092C8FC01C0C9FCAAEC3FF001C1B5FC01C714C001DF14F09039FFE03FFC9138000FFE01 -FC6D7E01F06D13804915C0497F6C4815E0C8FC6F13F0A317F8A4EA0F80EA3FE0487E12FF -7FA317F05B5D6C4815E05B007EC74813C0123E003F4A1380D81FC0491300D80FF0495AD8 -07FEEBFFFC6CB612F0C65D013F1480010F01FCC7FC010113C02D427BC038>I<4AB47E02 -1F13F0027F13FC49B6FC01079038807F8090390FFC001FD93FF014C04948137F4948EBFF -E048495A5A1400485A120FA248486D13C0EE7F80EE1E00003F92C7FCA25B127FA2EC07FC -91381FFF8000FF017F13E091B512F89039F9F01FFC9039FBC007FE9039FF8003FF17804A -6C13C05B6F13E0A24915F0A317F85BA4127FA5123FA217F07F121FA2000F4A13E0A26C6C -15C06D4913806C018014006C6D485A6C9038E01FFC6DB55A011F5C010714C0010191C7FC -9038003FF02D427BC038>I<121E121F13FC90B712FEA45A17FC17F817F017E017C0A248 -1680007EC8EA3F00007C157E5E00785D15014B5A00F84A5A484A5A5E151FC848C7FC157E -5DA24A5A14035D14074A5AA2141F5D143FA2147F5D14FFA25BA35B92C8FCA35BA55BAA6D -5A6D5A6D5A2F447AC238>I<EC7FF00103B5FC010F14C0013F14F090397F801FFC3A01FC -0003FE48486D7E497F4848EC7F80163F484815C0A2001F151FA27FA27F7F01FE143F6D15 -8002C0137F02F014006C01FC5B6E485A6C9038FF83FCEDE7F86CECFFE06C5D6C92C7FC6D -14C06D80010F14F882013F8090B7FC48013F14802607FC0F14C0260FF80314E04848C6FC -496D13F0003F141F48481307496D13F8150000FF157F90C8123F161F160FA21607A36D15 -F0127F160F6D15E06C6C141F6DEC3FC06C6CEC7F80D80FFE903801FF003A07FFC00FFE6C -90B55AC615F0013F14C0010F91C7FC010013F02D427BC038>I<EC7FF0903807FFFE011F -6D7E017F14E09039FFE03FF0489038800FF848496C7E48488048486D7E001F80003F1680 -A2484815C08117E0A212FF17F0A617F8A45D127FA3003F5CA26C7E5D6C6C5B12076C6C13 -1E6CEBC07C6CEBFFF8013F5B010F01C013F00101130090C8FCA217E05DA2EA03C0D80FF0 -15C0487E486C491380A217004B5A150F5E49495A6C48495A01C0EBFFE0260FF0035B6CB6 -5A6C4AC7FC6C14F86C6C13E0D907FEC8FC2D427BC038>I<EE1F80A24C7EA24C7EA34C7E -A24B7FA34B7FA24B7FA34B7F169F031F80161F82033F80ED3E07037E80157C8203FC804B -7E02018115F0820203814B137F0207815D173F020F814B7F021F8292C77EA24A82023E80 -027E82027FB7FCA291B87EA2498302F0C8FCA20103834A157F0107834A153FA249488284 -011F8491C97E4984133E017E82B6020FB612F0A54C457CC455>65 -D<DCFFF01470031F01FF14F04AB6EAE0010207EDF803023FEDFE0791B539E001FF0F4949 -C7EA3F9F010701F0EC0FFF4901C0804990C87E4948814948814948167F4849163F484916 -1F5A4A160F485B19074890CAFC19035A5BA2007F1801A34994C7FC12FFAE127F7F1AF0A2 -123FA27F6C18011AE06C7F19036C6D17C06E16077E6C6DEE0F806C6DEE1F006D6C5E6D6C -167E6D6C6C5D6D6D4A5A6D01F0EC07F0010101FEEC1FE06D903AFFF001FF80023F90B6C7 -FC020715FC020115F0DA001F1480030001F8C8FC44467AC451>67 -D<B9FC18F018FE727E19E026003FFEC7001F13F805017F9438003FFF060F7F727F727F72 -7F84737E737EA2737EA2737EA21B80A2851BC0A51BE0AD1BC0A51B8061A21B006162193F -624F5A19FF624E5B06075B4E5B063F90C7FC4DB45A050F13F8BA5A19C04EC8FC18F095C9 -FC4B447CC356>I<BA12F8A485D8001F90C71201EF003F180F180318011800A2197E193E -A3191EA21778A285A405F890C7FCA316011603161F92B5FCA5ED001F160316011600A2F1 -01E01778A2F103C0A494C7FC1907A21A80A2190FA2191FA2193FF17F0061601807181F4D -B5FCBBFC61A443447DC34A>I<DCFFF01470031F01FF14F04AB6EAE0010207EDF803023F -EDFE0791B539E001FF0F4949C7EA3F9F010701F0EC0FFF4901C0804990C87E4948814948 -814948167F4849163F4849161F5A4A160F485B19074890CAFC19035A5BA2007F1801A349 -94C8FC12FFAD057FB612F0127F7FA3003FDC0001EBF000A27F7EA26C7FA26C7F807E6C7F -6C7F6D7E6D6C5D6D6C7E6D6D5C6D01F05C010101FE143F6D903AFFF001FF9F023F90B612 -0F0207EDFC030201EDF000DA001F02C01330030001FCC9FC4C467AC458>71 -D<B7D88003B612FEA526003FFEC9EBF800B3A791B9FCA54AC9FCB3AAB7D88003B612FEA5 -4F447CC358>I<B712F0A526003FFECAFCB3B1F00780A4180F1900A460A360A2187EA218 -FE170117031707171F177FEE03FFB95AA539447CC343>76 D<B500FE067FB512806E95B6 -FCA26F5EA2D8003F50C7FC013D6DEE03DFA2013C6DEE079FA26E6CEE0F1FA26E6C161EA2 -6E6C163CA36E6C1678A26E6C16F0A26E6DEC01E0A26E6DEC03C0A36E6DEC0780A26F6CEC -0F00A26F6C141EA26F6C5CA36F6C5CA26F6C5CA26F6D485AA26F6D485AA26F6D485AA370 -6C48C7FCA293383FF81EA2706C5AA2706C5AA3706C5AA2705BA2705BA2705BA2B6057FB6 -128071C7FCA2173E171C61447CC36A>I<B64BB512FE8181A281D8003F6D91C7EA780081 -013D7F81133C6E7E6E7F6E7F6E7F6E7F82806E7F6E7F6F7E6F7F83816F7F6F7F6F7F6F7F -6F7F8382707F707F707F707F8482707F707F717E7113807113C019E0837113F07113F871 -13FC7113FE19FF847213F884848484A28484197F193F191FA2190F1907B6160319011900 -1A78A24F447CC358>I<923807FFC092B512FE0207ECFFC0021F15F091267FFE0013FC90 -2601FFF0EB1FFF01070180010313C04990C76C7FD91FFC6E6C7E49486F7E49486F7E01FF -8348496F7E48496F1380A248496F13C0A24890C96C13E0A24819F04982003F19F8A3007F -19FC49177FA400FF19FEAD007F19FC6D17FFA3003F19F8A26D5E6C19F0A26E5D6C19E0A2 -6C6D4B13C06C19806E5D6C6D4B13006C6D4B5A6D6C4B5A6D6C4B5A6D6C4A5B6D01C00107 -5B6D01F0011F5B010101FE90B5C7FC6D90B65A023F15F8020715C002004AC8FC030713C0 -47467AC454>I<B9FC18F018FE727E19E0D8001F90C7000F7F05017F716C7E727E727E72 -1380A21AC084A21AE0A91AC0A24E1380A21A00604E5A4E5A4D485A050F5B92B712C096C7 -FC18FC18C092CBFCB3A7B712E0A543447DC34D>I<B812F8EFFFC018F818FE727ED8001F -90C7003F13E005037F05007F727E727E727EA28684A286A762A24E90C7FCA24E5A61187F -943801FFF005075B053F138092B7C8FC18F818E018F892C77FEF3FFF050F7F717F717FA2 -717FA2717FA785A61B0F85A2187F73131F72141EB700E06DEB803E72EBE0FC72EBFFF806 -0114F0726C13E0CC0007138050457DC354>82 D<DAFFE0131C010701FE133C013F9038FF -807C90B6EAE0FC4815F9489038801FFF3907FC00014848EB007F4848143F4848140F4914 -07007F15035B1601160012FF177CA27FA26D153C7F7F6D92C7FC6C7EEBFFE014FE6CEBFF -F015FF6C15E016FC6C816C6F7E6C826C826C6C81011F810107811300020F80140003077F -ED007F82040F1380828212F082A282A27EA218007EA26C5D6C5E6D14036D5D6D140701F8 -4A5A01FFEC3FF002F8EBFFE0486CB65AD8FC1F92C7FCD8F80714FC48C614F04801071380 -31467AC43E>I<003FBA12E0A59026FE000FEB8003D87FE09338003FF049171F90C71607 -A2007E1803007C1801A300781800A400F819F8481978A5C81700B3B3A20107B8FCA54543 -7CC24E>I<B792B6FCA526003FFECAEAFC00806D606F15016D608119036D606F15076D60 -6F150F6D6081191F6D6D93C7FC61027F163E6F157E023F167C8119FC6E6D5C18016E5E70 -13036E5E8218076E6D5C180F6E5E70131F6E93C8FC705B037F143E82187E033F147C7013 -FC6F5C17816F5C17C117C36F5C17E76F5C17FF6F5CA36F91C9FCA2705AA2705AA3705AA2 -705AA2705AA250457EC355>86 D<903801FFE0011F13FE017F6D7E48B612E03A03FE007F -F84848EB1FFC6D6D7E486C6D7EA26F7FA36F7F6C5A6C5AEA00F090C7FCA40203B5FC91B6 -FC1307013F13F19038FFFC01000313E0481380381FFE00485A5B127F5B12FF5BA35DA26D -5B6C6C5B4B13F0D83FFE013EEBFFC03A1FFF80FC7F0007EBFFF86CECE01FC66CEB8007D9 -0FFCC9FC322F7DAD36>97 D<EB7FC0B5FCA512037EB1ED0FF892B57E02C314E002CF14F8 -9139DFC03FFC9139FF000FFE02FCEB03FF4A6D13804A15C04A6D13E05CEF7FF0A218F817 -3FA318FCAC18F8A2177F18F0A3EFFFE06E15C06E5B6E491380027C491300496C495A903A -FC1FC07FFC496CB512F0D9F00314C049C691C7FCC8EA1FF036467DC43E>I<EC3FFC49B5 -12C0010F14F0013F14FC90397FF003FE9039FFC001FF0003495A48494813805B120F485A -A2485A6F1300007F6E5AED00784991C7FCA212FFAC6C7EA3123F6DEC03C0A26C6C140700 -0F16806D140F6C6DEB1F006C6D133E6C01F05B3A007FFC03F86DB55A010F14C0010391C7 -FC9038003FF82A2F7CAD32>I<EE03FEED07FFA5ED001F160FB1EC3FE0903803FFFC010F -EBFF8F013F14CF9039FFF807FF48EBC00148903880007F4890C7123F4848141F49140F12 -1F485AA3127F5BA212FFAC127FA37F123FA26C6C141FA26C6C143F0007157F6C6C91B5FC -6CD9C00314FC6C9038F01FEF6DB5128F011FEBFE0F010713F89026007FC0EBF80036467C -C43E>I<EC3FF80103B57E010F14E0013F8090397FF83FF89039FFC007FC48496C7E4849 -6C7E48486D1380485A001FED7FC05B003FED3FE0A2127F5B17F0161F12FFA290B7FCA401 -F0C9FCA5127FA27FA2123F17F06C7E16016C6C15E06C6C14036C6DEB07C06C6DEB0F806C -01F0EB3F0090397FFE01FE011FB55A010714F0010114C09026001FFEC7FC2C2F7DAD33> -I<DAFFE0137E010F9039FE03FF80013FEBFF8F90B812C048D9C07F133F489038001FF848 -48EB0FFC4848903907FE1F80001F9238FF0F00496D90C7FCA2003F82A8001F93C7FCA26D -5B000F5D6C6C495A6C6C495A6C9038C07FF04890B55A1680D8078F49C8FC018013E0000F -90CAFCA47F7F7F90B612C016FC6CEDFF8017E06C826C16FC7E000382000F82D81FF0C77E -D83FC014074848020113808248C9FC177FA46D15FF007F17006D5C6C6C4A5A6C6C4A5AD8 -0FFEEC3FF83B07FFC001FFF0000190B612C06C6C92C7FC010F14F8D9007F90C8FC32427D -AC38>103 D<EB7FC0B5FCA512037EB1ED07FE92383FFF8092B512E002C114F89139C7F0 -3FFC9138CF801F9139DF000FFE14DE14FC4A6D7E5CA25CA35CB3A7B60083B512FEA53745 -7CC43E>I<137C48B4FC4813804813C0A24813E0A56C13C0A26C13806C1300EA007C90C7 -FCAAEB7FC0EA7FFFA512037EB3AFB6FCA518467CC520>I<EC03E0EC0FF8EC1FFCEC3FFE -A2EC7FFFA5EC3FFEA2EC1FFCEC0FF8EC03E091C7FCAAEC01FF0103B5FCA5EB000F80B3B3 -A7EA1F80EA3FC0EA7FE0EAFFF0EC0FFEA215FC141F01E013F8007FEB3FF0393FC0FFE06C -B512806C1400000313FCC613C0205A86C522>I<EB7FC0B5FCA512037EB3B3B3A3B61280 -A519457CC420>108 D<90277F8007FEEC0FFCB590263FFFC090387FFF8092B5D8F001B5 -12E002816E4880913D87F01FFC0FE03FF8913D8FC00FFE1F801FFC0003D99F009026FF3E -007F6C019E6D013C130F02BC5D02F86D496D7EA24A5D4A5DA34A5DB3A7B60081B60003B5 -12FEA5572D7CAC5E>I<90397F8007FEB590383FFF8092B512E0028114F8913987F03FFC -91388F801F000390399F000FFE6C139E14BC02F86D7E5CA25CA35CB3A7B60083B512FEA5 -372D7CAC3E>I<EC1FFC49B512C0010714F0011F14FC90397FF80FFF9026FFC0017F4849 -6C7F4848C7EA3FE000078248486E7E49140F001F82A2003F82491407007F82A400FF1780 -AA007F1700A46C6C4A5AA2001F5E6D141F000F5E6C6C4A5AA26C6C6CEBFFE06C6D485B27 -007FF80F90C7FC6DB55A010F14F8010114C09026001FFCC8FC312F7DAD38>I<90397FC0 -0FF8B590B57E02C314E002CF14F89139DFC03FFC9139FF001FFE000301FCEB07FF6C496D -13804A15C04A6D13E05C7013F0A2EF7FF8A4EF3FFCACEF7FF8A318F017FFA24C13E06E15 -C06E5B6E4913806E4913006E495A9139DFC07FFC02CFB512F002C314C002C091C7FCED1F -F092C9FCADB67EA536407DAC3E>I<90387F807FB53881FFE0028313F0028F13F8ED8FFC -91389F1FFE000313BE6C13BC14F8A214F0ED0FFC9138E007F8ED01E092C7FCA35CB3A5B6 -12E0A5272D7DAC2E>114 D<90391FFC038090B51287000314FF120F381FF003383FC000 -49133F48C7121F127E00FE140FA215077EA27F01E090C7FC13FE387FFFF014FF6C14C015 -F06C14FC6C800003806C15806C7E010F14C0EB003F020313E0140000F0143FA26C141F15 -0FA27EA26C15C06C141FA26DEB3F8001E0EB7F009038F803FE90B55A00FC5CD8F03F13E0 -26E007FEC7FC232F7CAD2C>I<EB01E0A51303A41307A2130FA2131FA2133F137F13FF12 -03000F90B51280B7FCA4C601E0C7FCB3A3ED01E0A9150302F013C0137F150790393FF80F -8090391FFC1F006DB5FC6D13FC01015B9038003FE023407EBE2C>I<D97FC049B4FCB501 -03B5FCA50003EC000F6C81B3A85EA25EA25E7E6E491380017FD901F713FE9138F807E76D -B512C7010F1407010313FE9026007FF0EBFC00372E7CAC3E>I<B6903803FFFCA5000101 -E09038003E006C163C80017F5D8017F8013F5D6E1301011F5D6E1303010F5D6E13076D5D -ED800F6D92C7FC15C05E6DEBE01E163E6D143CEDF07C027F1378EDF8F8023F5B15FD021F -5B15FF6E5BA36E5BA26E90C8FCA26E5AA26E5AA21578362C7EAB3B>I<B6903803FFFCA5 -000101E09038003E006C163C80017F5D8017F8013F5D6E1301011F5D6E1303010F5D6E13 -076D5DED800F6D92C7FC15C05E6DEBE01E163E6D143CEDF07C027F1378EDF8F8023F5B15 -FD021F5B15FF6E5BA36E5BA26E90C8FCA26E5AA26E5AA21578A215F85D14015D001F1303 -D83F805B387FC007D8FFE05B140F92C9FC5C143E495A387FC1F8EB07F06CB45A6C5B0007 -90CAFCEA01FC36407EAB3B>121 D E +%DVIPSBitmapFont: Fc ecbx1200 12 41 +/Fc 41 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<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 59 -/Fc 59 126 df<121FEA3F80EA7FC0EAFFE0B0EA7FC0AEEA1F00C7FCA7121FEA3F80EA7F +%DVIPSBitmapFont: Fd ectt1000 10 73 +/Fd 73 126 df<121FEA3F80EA7FC0EAFFE0B0EA7FC0AEEA1F00C7FCA7121FEA3F80EA7F C0EAFFE0A5EA7FC0EA3F80EA1F000B3470B32C>33 D<003C131E007F137F481480A66C14 00A6007E7FA6003E133EA3003C131E001C131C191977B32C>I<143814FC13011303EB07 F8EB0FF0EB1FC0EB3F80EB7F0013FE485A485A5B12075B120F5B485AA2123F90C7FCA25A @@ -388,146 +388,191 @@ F8EB0FF0EB1FC0EB3F80EB7F0013FE485A485A5B12075B120F5B485AA2123F90C7FCA25A 80EB1FC0EB0FF0EB07F8EB03FC130113001438164272B92C>40 D<127012FC7E7E6C7E6C 7EEA0FE06C7E6C7E6C7E6C7E137F7F1480131F14C0130FEB07E0A214F01303A214F81301 A314FC1300AC130114F8A3130314F0A2130714E0A2EB0FC0131F1480133F14005B13FE48 -5A485A485A485AEA3FC0485A48C7FC5A5A1270164279B92C>I<EA0F80EA1FE0EA3FF0EA -7FF8A213FCA3123F121F120F120013F8A21201EA03F01207EA1FE0EA7FC0EAFF80130012 -FC12700E17718A2C>44 D<007FB512F0B612F8A36C14F01D0579942C>I<121FEA3F80EA -7FC0EAFFE0A5EA7FC0EA3F80EA1F000B0B708A2C>I<1507ED0F80A2151F16005D153E15 -7E157CA215FC5D14015D14035D14075D140F5D141F92C7FC5C143EA2147E147C14FC5C13 -015C13035C13075C130F5C131F91C8FC5B133EA2137E137C13FC5B12015B12035B12075B -120F5B121F90C9FCA25A123E127E127C12FC5AA2127021417BB92C>I<EB03F8EB0FFE90 -383FFF80497F90B57E3901FE0FF03903F803F848486C7EEBE0004848137EA248487FA248 -C7EA1F80A2003E140F007E15C0A3007C140700FC15E0AC6C140F007E15C0A46CEC1F80A3 -6C6CEB3F00A26C6C137E6D13FE00075CEBF0016C6C485A3901FE0FF06CB55A6D5B6D5BD9 -0FFEC7FCEB03F823357CB32C>I<1307497EA2131FA2133F137F13FF5A1207127FB5FC13 -DF139FEA7C1F1200B3AE007FB512E0B612F0A36C14E01C3477B32C>I<121FEA3F80EA7F -C0EAFFE0A5EA7FC0EA3F80EA1F00C7FCAE121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA -1F000B2470A32C>58 D<EA0F80EA1FC0EA3FE0EA7FF0A5EA3FE0EA1FC0EA0F80C7FCAEEA -0F80EA1FE0EA3FF0EA7FF8A213FCA3123F121F120F120013F8A21201EA03F01207EA1FE0 -EA7FC0EAFF80130012FC12700E3071A32C>I<007FB612F0B712F8A36C15F0CAFCA8007F -B612F0B712F8A36C15F025127DA12C>61 D<EC7F80903803FFE0010F7F013F7F497F9038 -FFC0FE3901FE007FD803F87F4848EB1F809038E00FCF390FC03FFF48484813C091B5FCEA -3F01393E03F87F903907F03FE0007EEBE01F397C0FC00FEC8007A2EAFC1F00F8EB0003A9 -00FCEB8007D87C0F14C0A2ECC00F3A7E07E01F80003EEBF03F903903F87F00393F01FFFE -D81F805B6E5A6C6C6C5A3907E00FC09039F00007C06C6CEB0FE0D801FE131F3900FFC0FF -6DB512C06D1480010FEBFE00010313F89038007FC023337CB22C>64 +5A485A485A485AEA3FC0485A48C7FC5A5A1270164279B92C>I<EB0380497EA600201408 +00F8143E00FE14FE00FF13C1EBC7C7EBE7CF003FB512F8000F14E0000314806C14003800 +7FFCA248B5FC481480000F14E0003F14F839FFE7CFFEEBC7C7EB07C100FE13C000F8143E +0020140800001400A66D5A1F247AAA2C>I<EA0F80EA1FE0EA3FF0EA7FF8A213FCA3123F +121F120F120013F8A21201EA03F01207EA1FE0EA7FC0EAFF80130012FC12700E17718A2C +>44 D<007FB512F0B612F8A36C14F01D0579942C>I<121FEA3F80EA7FC0EAFFE0A5EA7F +C0EA3F80EA1F000B0B708A2C>I<1507ED0F80A2151F16005D153E157E157CA215FC5D14 +015D14035D14075D140F5D141F92C7FC5C143EA2147E147C14FC5C13015C13035C13075C +130F5C131F91C8FC5B133EA2137E137C13FC5B12015B12035B12075B120F5B121F90C9FC +A25A123E127E127C12FC5AA2127021417BB92C>I<EB03F8EB0FFE90383FFF80497F90B5 +7E3901FE0FF03903F803F848486C7EEBE0004848137EA248487FA248C7EA1F80A2003E14 +0F007E15C0A3007C140700FC15E0AC6C140F007E15C0A46CEC1F80A36C6CEB3F00A26C6C +137E6D13FE00075CEBF0016C6C485A3901FE0FF06CB55A6D5B6D5BD90FFEC7FCEB03F823 +357CB32C>I<1307497EA2131FA2133F137F13FF5A1207127FB5FC13DF139FEA7C1F1200 +B3AE007FB512E0B612F0A36C14E01C3477B32C>I<EB0FF890387FFF8048B512E0000780 +4814FC391FF80FFE393FE001FF903880007F48C7EA3F80007E141F00FE15C0150F6C15E0 +1507A3127E123CC8FCA2150F16C0151F1680153F16005D15FE4A5A14034A5A4A5A4A5A4A +5AECFF804948C7FC495A495A495AEB3FE0EB7F8049C8FC485A4848EB03C04848EB07E0EA +1FE0485A48B6FCB7FCA36C15C023347CB32C>I<EB0FFC90387FFF8048B512E0000714F8 +4880391FF807FEEBC0004848137F6D7F1680151FA26C5A6CC7FCC8FC153F16005D15FE14 +014A5AEC1FF890381FFFF0495BA215F86D7F90380007FEEC00FF81ED3F80ED1FC0150FA2 +16E01507A2123C127EB4FC150F16C0A248141F007FEC3F806DEB7F006C6C5B391FF807FE +6CB55A6C5C6C14E0C66C1380D90FFCC7FC23357CB32C>I<EC07F04A7E141F143FA2147E +A214FCEB01F8A2EB03F0EB07E0A2EB0FC0EB1F80A2EB3F00137EA25B485AA2485A5B1207 +485AA2485A48C7FCA2127E5AB712FC16FEA36C15FCC8EAF800AA91387FFFF091B512F8A3 +6E13F027347EB32C>I<000FB512FE4880A35D0180C8FCADEB83FE90389FFF8090B512E0 +15F8819038FE03FE9038F000FF01C07F49EB3F8090C7121F6C15C0C8120FA2ED07E0A412 +3C127EB4FC150F16C0A248141F007EEC3F80007FEC7F006C6C5B6D485A391FF80FFC6CB5 +5A6C5C000114C06C6C90C7FCEB0FF823347CB22C>I<EB07FC90383FFF8090B512E00003 +14F84880390FFC07FE391FF001FF9038C0007F4848EB3F8090C7121F4815C0007E140FA5 +6CEC1F80A26C6CEB3F006D5B390FF001FE3903FC07F86CB55A6C6C13C0D907FCC7FC9038 +7FFFC048B512F03903FC07F8390FF001FE391FC0007F497F48C7EA1F80007EEC0FC0A248 +EC07E0A7007EEC0FC0A2007F141F6C6CEB3F806C6CEB7F009038F001FF390FFC07FE6CB5 +5A6C5CC614E0013F1380D907FCC7FC23357CB32C>56 D<EB07FCEB3FFF90B512C0488048 +803907FC07F8390FF001FC48486C7ED83F80137E157F48C77E007EEC1F8012FE5AED0FC0 +A416E0A37E127E007F141F7E6D133F6C6C137F390FF001FF3807FC0F6CB6FC6C14F76C14 +C7013F130FD90FF813C090C7FCA2151F1680153F1600000F5C486C137E486C13FE4A5A4A +5A14079038801FF0391FE07FE090B55A6C91C7FC6C5B000113F838007FC023357CB32C> +I<121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F00C7FCAE121FEA3F80EA7FC0EAFFE0 +A5EA7FC0EA3F80EA1F000B2470A32C>I<EA0F80EA1FC0EA3FE0EA7FF0A5EA3FE0EA1FC0 +EA0F80C7FCAEEA0F80EA1FE0EA3FF0EA7FF8A213FCA3123F121F120F120013F8A21201EA +03F01207EA1FE0EA7FC0EAFF80130012FC12700E3071A32C>I<007FB612F0B712F8A36C +15F0CAFCA8007FB612F0B712F8A36C15F025127DA12C>61 D<EC7F80903803FFE0010F7F +013F7F497F9038FFC0FE3901FE007FD803F87F4848EB1F809038E00FCF390FC03FFF4848 +4813C091B5FCEA3F01393E03F87F903907F03FE0007EEBE01F397C0FC00FEC8007A2EAFC +1F00F8EB0003A900FCEB8007D87C0F14C0A2ECC00F3A7E07E01F80003EEBF03F903903F8 +7F00393F01FFFED81F805B6E5A6C6C6C5A3907E00FC09039F00007C06C6CEB0FE0D801FE +131F3900FFC0FF6DB512C06D1480010FEBFE00010313F89038007FC023337CB22C>64 D<14FE497EA4497FA214EFA2130781A214C7A2010F7FA314C390381F83F0A590383F01F8 A490387E00FCA549137E90B512FEA34880A29038F8003FA34848EB1F80A4000715C04913 -0FD87FFEEBFFFC6D5AB514FE6C15FC497E27347EB32C>I<02FF13700107EBE0F84913F9 -013F13FD4913FFEBFF813901FE007F4848131FD807F0130F1507485A491303485A150148 -C7FCA25A007EEC00F01600A212FE5AAB7E127EA3007F15F06CEC01F8A26C7EA26C6C1303 -6D14F06C6C130716E0D803FC131F6C6CEB3FC03A00FF81FF806DB512006D5B010F5B6D13 -F00100138025357DB32C>67 D<007FB612F0B712F8A37E3903F00001A7ED00F01600A4EC -01E04A7EA490B5FCA5EBF003A46E5A91C8FCA5163C167EA8007FB612FEB7FCA36C15FC27 -337EB22C>69 D<903901FC038090390FFF87C04913EF017F13FF90B6FC4813073803FC01 -497E4848137F4848133F49131F121F5B003F140F90C7FCA2127EED078092C7FCA212FE5A -A8913803FFF84A13FCA27E007E6D13F89138000FC0A36C141FA27F121F6D133F120F6D13 -7F6C7E6C6C13FF6D5A3801FF076C90B5FC6D13EF011F13CF6DEB0780D901FCC7FC26357D -B32C>71 D<D87FFEEBFFFCB54813FEA36C486C13FCD807E0EB0FC0B190B6FCA59038E000 -0FB3D87FFEEBFFFCB54813FEA36C486C13FC27337EB22C>I<007FB512F8B612FCA36C14 -F839000FC000B3B3A5007FB512F8B612FCA36C14F81E3379B22C>I<387FFFE0B57EA36C -5BD803F0C8FCB3AE16F0ED01F8A8007FB6FCB7FCA36C15F025337DB22C>76 -D<D87FE0EB0FFC486CEB1FFEA26D133F007F15FC000F15E001BC137BA4019E13F3A3EB9F -01A2018F13E3A21483A2018713C314C7A201831383A214EFA201811303A214FFEB80FEA3 -147C14381400ACD87FF0EB1FFC486CEB3FFEA36C48EB1FFC27337EB22C>I<D87FF0EB7F -FC486CEBFFFEA27F007FEC7FFCD807FEEB07C013DEA213DF13CFA2148013C714C0A213C3 -14E0A213C114F0A213C014F8A2147CA3143EA2141E141FA2140F1587A2140715C7A21403 -15E71401A215F71400A215FFD87FFC137F487E153FA26C48EB1F8027337EB22C>I<EB7F -FF0003B512E0000F14F848804880EBE003EB800048C7127FA2007E80A300FE158048141F -B3A86C143FA2007E1500A3007F5CA26C6C13FEEBF00790B5FC6C5C6C5C000314E0C66C90 -C7FC21357BB32C>I<007FB512C0B612F88115FF6C15802603F00013C0153FED0FE0ED07 -F0A2150316F81501A6150316F01507A2ED0FE0ED3FC015FF90B61280160015FC5D15C001 -F0C8FCB0387FFF80B57EA36C5B25337EB22C>I<387FFFFCB67E15E015F86C803907E007 -FE1401EC007F6F7E151FA26F7EA64B5AA2153F4BC7FCEC01FE140790B55A5D15E0818190 -38E007FCEC01FE1400157F81A8160FEE1F80A5D87FFEEB1FBFB5ECFF00815E6C486D5AC8 -EA01F029347EB22C>82 D<90381FF80790B5EA0F804814CF000714FF5A381FF01F383FC0 -03497E48C7FC007E147F00FE143F5A151FA46CEC0F00007E91C7FC127F7FEA3FE0EA1FFC -EBFFC06C13FC0003EBFFC06C14F06C6C7F01077F9038007FFEEC07FF02001380153FED1F -C0A2ED0FE0A20078140712FCA56CEC0FC0A26CEC1F806D133F01E0EB7F009038FE01FF90 -B55A5D00F914F0D8F83F13C0D8700790C7FC23357CB32C>I<007FB612FCB712FEA43AFC -007E007EA70078153CC71400B3AF90383FFFFCA2497F6D5BA227337EB22C>I<D87FFCEB -7FFC486CEBFFFEA36C48EB7FFCD80FC0EB07E06D130F000715C0A36D131F00031580A36D -133F00011500A36D5B0000147EA4017E5BA46D485AA490381F83F0A4010F5B14C7A30107 -5BA214EFA201035BA214FFA26D90C7FCA46D5A27347EB22C>86 D<D87FFCEB7FFC486CEB -FFFEA36C48EB7FFCD807F0EB0FC0151F000315806D133F12016DEB7F0012006D137E017E -13FE017F5BEB3F01EC81F8131FEC83F0EB0FC314C7903807E7E0A201035B14EF6DB45AA2 -92C7FC7F5C147EB0903807FFE0497FA36D5B27337EB22C>89 D<003FB612C04815E0A400 -7EC7EA1FC0ED3F80A2ED7F00157E15FE4A5A003C5CC712034A5AA24A5A4A5AA24A5A4AC7 -FCA214FE495AA2495A495AA2495A495AA2495A49C8FCA213FE485AA24848EB03C049EB07 -E01207485A5B121F485AA248C7FCB7FCA46C15C023337CB22C>I<007FB6FCB71280A46C -150021067B7D2C>95 D<3801FFF0000713FE001F6D7E15E048809038C01FF81407EC01FC -381F80000006C77EC8127EA3ECFFFE131F90B5FC1203120F48EB807E383FF800EA7FC090 -C7FC12FE5AA47E007F14FEEB8003383FE01F6CB612FC6C15FE6C14BF0001EBFE1F3A003F -F007FC27247CA32C>97 D<EA7FF0487EA3127F1201AAEC1FE0ECFFF801FB13FE90B6FC16 -809138F07FC09138801FE091380007F049EB03F85BED01FC491300A216FE167EA816FE6D -14FCA2ED01F86D13036DEB07F0150F9138801FE09138E07FC091B51280160001FB5B01F8 -13F83900F03FC027337FB22C>I<903803FFE0011F13F8017F13FE48B5FC48804848C6FC -EA0FF0485A49137E4848131890C9FC5A127EA25AA8127EA2127F6C140F6DEB1F806C7E6D -133F6C6CEB7F003907FE03FF6CB55A6C5C6C6C5B011F13E0010390C7FC21247AA32C>I< -EC0FFE4A7EA380EC003FAAEB07F8EB3FFE90B512BF4814FF5A3807FC0F380FF00348487E -497E48487F90C7FC007E80A212FE5AA87E007E5CA2007F5C6C7E5C6C6C5A380FF0073807 -FC1F6CB612FC6CECBFFE6C143FEB3FFC90390FF01FFC27337DB22C>I<EB03FE90381FFF -C0017F13F048B57E48803907FE03FE390FF800FFD81FE0EB3F805B4848EB1FC090C7120F -5A007E15E015075AB7FCA416C000FCC9FC7E127EA2127F6CEC03C06DEB07E06C7ED80FF0 -130F6C6CEB3FC001FF13FF000190B512806C1500013F13FC010F13F00101138023247CA3 -2C>I<EC0FF8EC3FFE91B5FC4914805B903807FC7F14F090390FE03F0014C092C7FCA600 -7FB512FEB7FCA36C5C26000FC0C7FCB3A8003FB512F04880A36C5C21337DB22C>I<ED03 -F8903907F80FFC90391FFE3FFE017FB6FC48B7FC48ECFE7F9038FC0FF82607F003133E3A -0FE001FC1CD9C0001300001F8049137EA66D13FE000F5CEBE0016C6C485A3903FC0FF048 -B5FC5D481480D99FFEC7FCEB87F80180C8FCA37F6C7E90B512F06C14FE48ECFF804815E0 -4815F03A3FC0001FF848C7EA03FC007E1400007C157C00FC157E48153EA46C157E007E15 -FCD87F801303D83FE0EB0FF8D81FFCEB7FF06CB612E0000315806C1500D8003F13F80107 -13C028387EA42C>I<EA7FF0487EA3127F1201AAEC1FE0EC7FFC9038F9FFFE01FB7F90B6 -FC9138F03F80ECC01F02807FEC000F5B5BA25BB3267FFFE0B5FCB500F11480A36C01E014 -0029337FB22C>I<1307EB1FC0A2497EA36D5AA20107C7FC90C8FCA7387FFFC080B5FC7E -A2EA0007B3A8007FB512FCB612FEA36C14FC1F3479B32C>I<140EEC3F80A2EC7FC0A3EC -3F80A2EC0E0091C7FCA748B512804814C0A37EC7120FB3B3A2141F003C1480007E133FB4 -14005CEB01FEEBFFFC6C5B5C001F5B000790C7FC1A467CB32C>I<EA7FE0487EA3127F12 -01AA91381FFFF04A13F8A36E13F0913800FE004A5A4A5A4A5A4A5A4A5A4A5A4AC7FC14FE -EBF1FC13F3EBF7FE90B5FCA2EC9F80EC0FC001FE7FEBFC07496C7E496C7E811400157E81 -1680151F3A7FFFC0FFFCB500E113FEA36C01C013FC27337EB22C>I<387FFFE0B57EA37E -EA0003B3B3A5007FB61280B712C0A36C158022337BB22C>I<3A7F83F007E09039CFFC1F -F83AFFDFFE3FFCD87FFF13FF91B57E3A07FE1FFC3E01FCEBF83F496C487E01F013E001E0 -13C0A301C01380B33B7FFC3FF87FF0027F13FFD8FFFE6D13F8D87FFC4913F0023F137F2D -2481A32C>I<397FF01FE039FFF87FFC9038F9FFFE01FB7F6CB6FC00019038F03F80ECC0 -1F02807FEC000F5B5BA25BB3267FFFE0B5FCB500F11480A36C01E0140029247FA32C>I< -EB07FCEB1FFF017F13C048B512F048803907FC07FC390FF001FE48486C7E0180133F003F -158090C7121F007EEC0FC0A348EC07E0A76C140F007E15C0A2007F141F6C15806D133F6C -6CEB7F006D5B6C6C485A3907FC07FC6CB55A6C5C6C6C13C0011F90C7FCEB07FC23247CA3 -2C>I<397FF01FE039FFF8FFF801FB13FE90B6FC6C158000019038F07FC09138801FE091 -380007F049EB03F85BED01FC491300A216FE167EA816FE6D14FCA2ED01F86D13036DEB07 -F0150F9138801FE09138E07FC091B51280160001FB5B01F813F8EC3FC091C8FCAD387FFF -E0B57EA36C5B27367FA32C>I<D87FFEEB3FC0B53801FFF0020713F8021F13FC6C5B3900 -3F7FE1ECFF019138FC00F84A13704A13005CA25C5CA391C8FCAF007FB512E0B67EA36C5C -26247EA32C>114 D<90387FF8700003B512F8120F5A5A387FC00F387E00034813015AA3 -6CEB00F0007F140013F0383FFFC06C13FE6CEBFF80000314E0C66C13F8010113FCEB0007 -EC00FE0078147F00FC143F151F7EA26C143F6D133E6D13FE9038F007FC90B5FC15F815E0 -00F8148039701FFC0020247AA32C>I<131E133FA9007FB6FCB71280A36C1500D8003FC8 -FCB1ED03C0ED07E0A5EC800F011FEB1FC0ECE07F6DB51280160001035B6D13F89038003F -E0232E7EAD2C>I<3A7FF003FF80486C487FA3007F7F0001EB000FB3A3151FA2153F6D13 -7F3900FE03FF90B7FC6D15807F6D13CF902603FE07130029247FA32C>I<3A7FFF01FFFC -B514FE148314016C15FC3A03E0000F80A26D131F00011500A26D5B0000143EA26D137E01 -7C137CA2017E13FC013E5BA2EB3F01011F5BA21483010F5BA214C701075BA214EF01035B -A214FF6D90C7FCA26D5A147C27247EA32C>I<D87FFFEB7FFF6EB5FCB515806C16004A7E -D807C0EB01F0A66C6C495AA3143E147FA2D801F0495AECFF87A214F7A201F113C700005D -9038F9E3CFA201FB13EFA3D97BC190C7FC017F13FFA21480A2013F5B90381F007C29247F -A32C>I<3A3FFF03FFF048018713F8A36C010313F03A00FC007E005D90387E01F8013F5B -EB1F83EC87E090380FCFC0903807EF80EB03FF6D90C7FC5C6D5A147C14FE130180903803 -EF80903807CFC0EB0FC7EC83E090381F01F0013F7FEB7E00017C137C49137E0001803A7F -FF01FFFC1483B514FE6C15FC140127247EA32C>I<3A7FFF01FFFCB5008113FE14831481 -6C010113FC3A03E0000F806C7E151F6D140012005D6D133E137C017E137E013E137CA201 -3F13FC6D5BA2EB0F815DA2EB07C1ECC3E0A2EB03E3ECE7C0130114F75DEB00FFA292C7FC -80A2143EA2147E147CA214FC5CA2EA0C01003F5BEA7F83EB87E0EA7E0F495A387FFF806C -90C8FC6C5A6C5AEA07E027367EA32C>I<003FB612E04815F0A4007EC7EA1FE0ED3FC0ED -7F80EDFF004A5A003C495AC7485A4A5A4A5A4A5A4A5A4AC7FCEB01FC495AEB0FF0495A49 -5A495A49C8FC4848EB01E04848EB03F0485A485A485A485A485AB7FCA46C15E024247DA3 -2C>I<15FF02071380141F147F91B512004913C04AC7FCEB03F85CB31307EB1FE013FF00 -7F5BB55A49C8FC6D7E6C7FC67F131FEB07F01303B380EB01FEECFFC06D13FF6E1380141F -14070200130021417BB92C>I<EA7FC0EAFFF813FE6D7E6C7FC67F131FEB07F01303B380 -EB01FEECFFC06D13FF6E1380141F147F91B512004913C04AC7FCEB03F85CB31307EB1FE0 -13FF007F5BB55A49C8FC13F8EA7FC021417BB92C>125 D E +0FD87FFEEBFFFC6D5AB514FE6C15FC497E27347EB32C>I<007FB512E015F8B612FE6C80 +16C03903F0003FED0FE0ED07F01503A2ED01F8A6ED03F0A21507ED0FE0ED1FC0EDFF8090 +B612005D5D15FF16C09039F0001FE0ED07F0ED03F81501ED00FCA216FE167EA616FE16FC +1501ED03F8150FED3FF0007FB612E016C0B712806CECFE0015F027337FB22C>I<02FF13 +700107EBE0F84913F9013F13FD4913FFEBFF813901FE007F4848131FD807F0130F150748 +5A491303485A150148C7FCA25A007EEC00F01600A212FE5AAB7E127EA3007F15F06CEC01 +F8A26C7EA26C6C13036D14F06C6C130716E0D803FC131F6C6CEB3FC03A00FF81FF806DB5 +12006D5B010F5B6D13F00100138025357DB32C>I<007FB5FCB612C015F0816C803907E0 +03FEEC00FFED7F80153FED1FC0ED0FE0A2150716F0150316F81501A4ED00FCACED01F8A3 +150316F0A2150716E0150FED1FC0153FED7F80EDFF00EC03FE007FB55AB65A5D15C06C91 +C7FC26337EB22C>I<007FB612F0B712F8A37E3903F00001A7ED00F01600A4EC01E04A7E +A490B5FCA5EBF003A46E5A91C8FCA5163C167EA8007FB612FEB7FCA36C15FC27337EB22C +>I<007FB612F8B712FCA37ED803F0C7FCA716781600A515F04A7EA490B5FCA5EBF001A4 +6E5A92C7FCAD387FFFE0B5FC805C7E26337EB22C>I<903901FC038090390FFF87C04913 +EF017F13FF90B6FC4813073803FC01497E4848137F4848133F49131F121F5B003F140F90 +C7FCA2127EED078092C7FCA212FE5AA8913803FFF84A13FCA27E007E6D13F89138000FC0 +A36C141FA27F121F6D133F120F6D137F6C7E6C6C13FF6D5A3801FF076C90B5FC6D13EF01 +1F13CF6DEB0780D901FCC7FC26357DB32C>I<D87FFEEBFFFCB54813FEA36C486C13FCD8 +07E0EB0FC0B190B6FCA59038E0000FB3D87FFEEBFFFCB54813FEA36C486C13FC27337EB2 +2C>I<007FB512F8B612FCA36C14F839000FC000B3B3A5007FB512F8B612FCA36C14F81E +3379B22C>I<0107B512804914C0A36D148090390003F000B3AF1218127EA2B4FCA24A5A +48130F007F131F9038C07FC06CB55A6C91C7FC6C5B000313F838007FC022347BB22C>I< +387FFFE0B57EA36C5BD803F0C8FCB3AE16F0ED01F8A8007FB6FCB7FCA36C15F025337DB2 +2C>76 D<D87FE0EB0FFC486CEB1FFEA26D133F007F15FC000F15E001BC137BA4019E13F3 +A3EB9F01A2018F13E3A21483A2018713C314C7A201831383A214EFA201811303A214FFEB +80FEA3147C14381400ACD87FF0EB1FFC486CEB3FFEA36C48EB1FFC27337EB22C>I<D87F +F0EB7FFC486CEBFFFEA27F007FEC7FFCD807FEEB07C013DEA213DF13CFA2148013C714C0 +A213C314E0A213C114F0A213C014F8A2147CA3143EA2141E141FA2140F1587A2140715C7 +A2140315E71401A215F71400A215FFD87FFC137F487E153FA26C48EB1F8027337EB22C> +I<EB7FFF0003B512E0000F14F848804880EBE003EB800048C7127FA2007E80A300FE1580 +48141FB3A86C143FA2007E1500A3007F5CA26C6C13FEEBF00790B5FC6C5C6C5C000314E0 +C66C90C7FC21357BB32C>I<007FB512C0B612F88115FF6C15802603F00013C0153FED0F +E0ED07F0A2150316F81501A6150316F01507A2ED0FE0ED3FC015FF90B61280160015FC5D +15C001F0C8FCB0387FFF80B57EA36C5B25337EB22C>I<EB7FFF0003B512E0000F14F848 +804880EBF007EB800048C7127FA2007E80A300FE158048141FB3A7EB01F0EB03F800FE14 +3F267E01FC1300A2EB00FE007F5C147FD83F8013FEEBF03F90B5FC6C5C6C5C000314E0C6 +7E90380007F0A26E7EA26E7EA26E7EA2157FA2153E21407BB32C>I<387FFFFCB67E15E0 +15F86C803907E007FE1401EC007F6F7E151FA26F7EA64B5AA2153F4BC7FCEC01FE140790 +B55A5D15E081819038E007FCEC01FE1400157F81A8160FEE1F80A5D87FFEEB1FBFB5ECFF +00815E6C486D5AC8EA01F029347EB22C>I<90381FF80790B5EA0F804814CF000714FF5A +381FF01F383FC003497E48C7FC007E147F00FE143F5A151FA46CEC0F00007E91C7FC127F +7FEA3FE0EA1FFCEBFFC06C13FC0003EBFFC06C14F06C6C7F01077F9038007FFEEC07FF02 +001380153FED1FC0A2ED0FE0A20078140712FCA56CEC0FC0A26CEC1F806D133F01E0EB7F +009038FE01FF90B55A5D00F914F0D8F83F13C0D8700790C7FC23357CB32C>I<007FB612 +FCB712FEA43AFC007E007EA70078153CC71400B3AF90383FFFFCA2497F6D5BA227337EB2 +2C>I<3B7FFF803FFFC0B56C4813E0A36C496C13C03B03F00001F800B3AF6D130300015D +A26D130700005D6D130F017F495A6D6C485AECE0FF6DB5C7FC6D5B010313F86D5B903800 +3F802B3480B22C>I<D87FFCEB7FFC486CEBFFFEA36C48EB7FFCD80FC0EB07E06D130F00 +0715C0A36D131F00031580A36D133F00011500A36D5B0000147EA4017E5BA46D485AA490 +381F83F0A4010F5B14C7A301075BA214EFA201035BA214FFA26D90C7FCA46D5A27347EB2 +2C>I<3A3FFF03FFE0484913F0148714076C6D13E03A01F800FE007F0000495A13FE017E +5BEB7F03013F5B1487011F5B14CF010F5B14FF6D5BA26D90C7FCA26D5AA26D5AA2497EA2 +497EA2497F81EB0FCF81EB1FC7EC87F0EB3F83EC03F8EB7F01017E7FEBFE00497F000114 +7E49137F000380491480151FD87FFEEBFFFC6D5AB514FE6C15FC497E27337EB22C>88 +D<D87FFCEB7FFC486CEBFFFEA36C48EB7FFCD807F0EB0FC0151F000315806D133F12016D +EB7F0012006D137E017E13FE017F5BEB3F01EC81F8131FEC83F0EB0FC314C7903807E7E0 +A201035B14EF6DB45AA292C7FC7F5C147EB0903807FFE0497FA36D5B27337EB22C>I<00 +3FB612C04815E0A4007EC7EA1FC0ED3F80A2ED7F00157E15FE4A5A003C5CC712034A5AA2 +4A5A4A5AA24A5A4AC7FCA214FE495AA2495A495AA2495A495AA2495A49C8FCA213FE485A +A24848EB03C049EB07E01207485A5B121F485AA248C7FCB7FCA46C15C023337CB22C>I< +007FB6FCB71280A46C150021067B7D2C>95 D<3801FFF0000713FE001F6D7E15E0488090 +38C01FF81407EC01FC381F80000006C77EC8127EA3ECFFFE131F90B5FC1203120F48EB80 +7E383FF800EA7FC090C7FC12FE5AA47E007F14FEEB8003383FE01F6CB612FC6C15FE6C14 +BF0001EBFE1F3A003FF007FC27247CA32C>97 D<EA7FF0487EA3127F1201AAEC1FE0ECFF +F801FB13FE90B6FC16809138F07FC09138801FE091380007F049EB03F85BED01FC491300 +A216FE167EA816FE6D14FCA2ED01F86D13036DEB07F0150F9138801FE09138E07FC091B5 +1280160001FB5B01F813F83900F03FC027337FB22C>I<903803FFE0011F13F8017F13FE +48B5FC48804848C6FCEA0FF0485A49137E4848131890C9FC5A127EA25AA8127EA2127F6C +140F6DEB1F806C7E6D133F6C6CEB7F003907FE03FF6CB55A6C5C6C6C5B011F13E0010390 +C7FC21247AA32C>I<EC0FFE4A7EA380EC003FAAEB07F8EB3FFE90B512BF4814FF5A3807 +FC0F380FF00348487E497E48487F90C7FC007E80A212FE5AA87E007E5CA2007F5C6C7E5C +6C6C5A380FF0073807FC1F6CB612FC6CECBFFE6C143FEB3FFC90390FF01FFC27337DB22C +>I<EB03FE90381FFFC0017F13F048B57E48803907FE03FE390FF800FFD81FE0EB3F805B +4848EB1FC090C7120F5A007E15E015075AB7FCA416C000FCC9FC7E127EA2127F6CEC03C0 +6DEB07E06C7ED80FF0130F6C6CEB3FC001FF13FF000190B512806C1500013F13FC010F13 +F00101138023247CA32C>I<EC0FF8EC3FFE91B5FC4914805B903807FC7F14F090390FE0 +3F0014C092C7FCA6007FB512FEB7FCA36C5C26000FC0C7FCB3A8003FB512F04880A36C5C +21337DB22C>I<ED03F8903907F80FFC90391FFE3FFE017FB6FC48B7FC48ECFE7F9038FC +0FF82607F003133E3A0FE001FC1CD9C0001300001F8049137EA66D13FE000F5CEBE0016C +6C485A3903FC0FF048B5FC5D481480D99FFEC7FCEB87F80180C8FCA37F6C7E90B512F06C +14FE48ECFF804815E04815F03A3FC0001FF848C7EA03FC007E1400007C157C00FC157E48 +153EA46C157E007E15FCD87F801303D83FE0EB0FF8D81FFCEB7FF06CB612E0000315806C +1500D8003F13F8010713C028387EA42C>I<EA7FF0487EA3127F1201AAEC1FE0EC7FFC90 +38F9FFFE01FB7F90B6FC9138F03F80ECC01F02807FEC000F5B5BA25BB3267FFFE0B5FCB5 +00F11480A36C01E0140029337FB22C>I<1307EB1FC0A2497EA36D5AA20107C7FC90C8FC +A7387FFFC080B5FC7EA2EA0007B3A8007FB512FCB612FEA36C14FC1F3479B32C>I<140E +EC3F80A2EC7FC0A3EC3F80A2EC0E0091C7FCA748B512804814C0A37EC7120FB3B3A2141F +003C1480007E133FB414005CEB01FEEBFFFC6C5B5C001F5B000790C7FC1A467CB32C>I< +EA7FE0487EA3127F1201AA91381FFFF04A13F8A36E13F0913800FE004A5A4A5A4A5A4A5A +4A5A4A5A4AC7FC14FEEBF1FC13F3EBF7FE90B5FCA2EC9F80EC0FC001FE7FEBFC07496C7E +496C7E811400157E811680151F3A7FFFC0FFFCB500E113FEA36C01C013FC27337EB22C> +I<387FFFE0B57EA37EEA0003B3B3A5007FB61280B712C0A36C158022337BB22C>I<3A7F +83F007E09039CFFC1FF83AFFDFFE3FFCD87FFF13FF91B57E3A07FE1FFC3E01FCEBF83F49 +6C487E01F013E001E013C0A301C01380B33B7FFC3FF87FF0027F13FFD8FFFE6D13F8D87F +FC4913F0023F137F2D2481A32C>I<397FF01FE039FFF87FFC9038F9FFFE01FB7F6CB6FC +00019038F03F80ECC01F02807FEC000F5B5BA25BB3267FFFE0B5FCB500F11480A36C01E0 +140029247FA32C>I<EB07FCEB1FFF017F13C048B512F048803907FC07FC390FF001FE48 +486C7E0180133F003F158090C7121F007EEC0FC0A348EC07E0A76C140F007E15C0A2007F +141F6C15806D133F6C6CEB7F006D5B6C6C485A3907FC07FC6CB55A6C5C6C6C13C0011F90 +C7FCEB07FC23247CA32C>I<397FF01FE039FFF8FFF801FB13FE90B6FC6C158000019038 +F07FC09138801FE091380007F049EB03F85BED01FC491300A216FE167EA816FE6D14FCA2 +ED01F86D13036DEB07F0150F9138801FE09138E07FC091B51280160001FB5B01F813F8EC +3FC091C8FCAD387FFFE0B57EA36C5B27367FA32C>I<D87FFEEB3FC0B53801FFF0020713 +F8021F13FC6C5B39003F7FE1ECFF019138FC00F84A13704A13005CA25C5CA391C8FCAF00 +7FB512E0B67EA36C5C26247EA32C>114 D<90387FF8700003B512F8120F5A5A387FC00F +387E00034813015AA36CEB00F0007F140013F0383FFFC06C13FE6CEBFF80000314E0C66C +13F8010113FCEB0007EC00FE0078147F00FC143F151F7EA26C143F6D133E6D13FE9038F0 +07FC90B5FC15F815E000F8148039701FFC0020247AA32C>I<131E133FA9007FB6FCB712 +80A36C1500D8003FC8FCB1ED03C0ED07E0A5EC800F011FEB1FC0ECE07F6DB51280160001 +035B6D13F89038003FE0232E7EAD2C>I<3A7FF003FF80486C487FA3007F7F0001EB000F +B3A3151FA2153F6D137F3900FE03FF90B7FC6D15807F6D13CF902603FE07130029247FA3 +2C>I<3A7FFF01FFFCB514FE148314016C15FC3A03E0000F80A26D131F00011500A26D5B +0000143EA26D137E017C137CA2017E13FC013E5BA2EB3F01011F5BA21483010F5BA214C7 +01075BA214EF01035BA214FF6D90C7FCA26D5A147C27247EA32C>I<D87FFFEB7FFF6EB5 +FCB515806C16004A7ED807C0EB01F0A66C6C495AA3143E147FA2D801F0495AECFF87A214 +F7A201F113C700005D9038F9E3CFA201FB13EFA3D97BC190C7FC017F13FFA21480A2013F +5B90381F007C29247FA32C>I<3A3FFF03FFF048018713F8A36C010313F03A00FC007E00 +5D90387E01F8013F5BEB1F83EC87E090380FCFC0903807EF80EB03FF6D90C7FC5C6D5A14 +7C14FE130180903803EF80903807CFC0EB0FC7EC83E090381F01F0013F7FEB7E00017C13 +7C49137E0001803A7FFF01FFFC1483B514FE6C15FC140127247EA32C>I<3A7FFF01FFFC +B5008113FE148314816C010113FC3A03E0000F806C7E151F6D140012005D6D133E137C01 +7E137E013E137CA2013F13FC6D5BA2EB0F815DA2EB07C1ECC3E0A2EB03E3ECE7C0130114 +F75DEB00FFA292C7FC80A2143EA2147E147CA214FC5CA2EA0C01003F5BEA7F83EB87E0EA +7E0F495A387FFF806C90C8FC6C5A6C5AEA07E027367EA32C>I<003FB612E04815F0A400 +7EC7EA1FE0ED3FC0ED7F80EDFF004A5A003C495AC7485A4A5A4A5A4A5A4A5A4AC7FCEB01 +FC495AEB0FF0495A495A495A49C8FC4848EB01E04848EB03F0485A485A485A485A485AB7 +FCA46C15E024247DA32C>I<15FF02071380141F147F91B512004913C04AC7FCEB03F85C +B31307EB1FE013FF007F5BB55A49C8FC6D7E6C7FC67F131FEB07F01303B380EB01FEECFF +C06D13FF6E1380141F14070200130021417BB92C>I<EA7FC0EAFFF813FE6D7E6C7FC67F +131FEB07F01303B380EB01FEECFFC06D13FF6E1380141F147F91B512004913C04AC7FCEB +03F85CB31307EB1FE013FF007F5BB55A49C8FC13F8EA7FC021417BB92C>125 +D E %EndDVIPSBitmapFont -%DVIPSBitmapFont: Fd ecbx1440 14.4 41 -/Fd 41 122 df<DC7FFEECFFC0031FB5D8801F13F092B6D8E07F13FC020703F9B57E021F +%DVIPSBitmapFont: Fe ecbx1440 14.4 41 +/Fe 41 122 df<DC7FFEECFFC0031FB5D8801F13F092B6D8E07F13FC020703F9B57E021F D9C007B5EAC1FF91277FFE000102071380DAFFF8010713FC010301E049494813C0495B49 494913F04990C7FC19E0495A741380017F17C04A6E6E130071EC00FC98C7FCAEBB12FEA5 26007FFCC7000701C0C8FCB3B3A7007FB5D8FC07B612F0A552547DD34D>27 @@ -689,8 +734,8 @@ A26F5AA26F5AA35E151F93C9FC5D153E157ED81FC0137C487E486C13FC486C5B14015D4A 5A14074A5A6C48485A4948CAFC495A383F81FC6CB45A6C5B000313C0C648CBFC3E4D7DB4 45>121 D E %EndDVIPSBitmapFont -%DVIPSBitmapFont: Fe ecss2074 20.74 10 -/Fe 10 116 df<EAFFC0B3B3B3B3B3B390B912FCA83E7570F456>76 +%DVIPSBitmapFont: Ff ecss2074 20.74 10 +/Ff 10 116 df<EAFFC0B3B3B3B3B3B390B912FCA83E7570F456>76 D<D8FFC0F03FF0B3B3B3B3AD6C6CF07FE0A46C6CF0FFC0A36D5F001F1A80A26C6C4D1300 A26C6C4D5A6D170F6C616E161F6C6D4C5A6C6D4C5A6E16FF6D6C4B5B6D6C4B5B6D6C4B5B 6D6C6C021F90C7FC6D01E0EC7FFE6D01F849485A6D9026FF801F5B6D91B65A6E5E021F16 @@ -732,14 +777,15 @@ F8A2170FA7EF1FF0A20070163F127C007FEE7FE001C015FF01F0020313C0B5020F138002 F0137F91B712006C5E001F5E000716F0C65E011F1580010302FCC7FCD9000F13C0354C7C CA3D>115 D E %EndDVIPSBitmapFont -%DVIPSBitmapFont: Ff ecrm0700 7 1 -/Ff 1 66 df<140EA2141FA34A7EA3EC6FC0A2ECEFE014C7A290380183F0A390380301F8 -A201067F1400A249137EA2011C137F01187FA24980013FB5FCA2903960000FC0A201E080 -491307A248486D7EA200038115011207D81FC0497ED8FFF890383FFFE0A22B2A7EA931> -65 D E +%DVIPSBitmapFont: Fg ecrm0700 7 2 +/Fg 2 66 df<13381378EA01F8121F12FE12E01200B3AB487EB512F8A215267BA521>49 +D<140EA2141FA34A7EA3EC6FC0A2ECEFE014C7A290380183F0A390380301F8A201067F14 +00A249137EA2011C137F01187FA24980013FB5FCA2903960000FC0A201E080491307A248 +486D7EA200038115011207D81FC0497ED8FFF890383FFFE0A22B2A7EA931>65 +D E %EndDVIPSBitmapFont -%DVIPSBitmapFont: Fg ecrm1000 10 78 -/Fg 78 123 df<B81280A2290280962A>21 D<DA0FF813FC91397FFF07FF903B01F807DF +%DVIPSBitmapFont: Fh ecrm1000 10 80 +/Fh 80 123 df<B81280A2290280962A>21 D<DA0FF813FC91397FFF07FF903B01F807DF 83C0903A07E001FF0F903B1F8007FE1FE090393F000FFC137E16F85B9338F00780484801 0790C7FC1503ACB812F8A32801F80003F0C7FCB3AB486C497E267FFFE0B512F0A3333B7F BA30>27 D<EC0FF8EC7FFE903901F80780903907E001C090391F8000E090383F0007017E @@ -750,153 +796,163 @@ C0A32A3B7FBA2E>I<DA0FF0EB1FF0DA7FFEEBFFFC903B01F80F83F00F903C07E001CFC0 0380903C1F8000FF0001C090273F0007FE130F017E4948497EA2495CA248485C03076E5A 03030203C7FC95C8FCA9F007E0BAFCA33C01F80003F0001F1807B3AA486C496C497E267F FFE0B500C1B51280A3413B7FBA45>I<007C137C00FE13FEEAFF01A3EAFE00A7007E13FC -007C137CA8003C137800381338A700181330171E77BA2A>34 D<030C497EA2031C130303 -1891C7FCA303385B03301306A30370130E0360130CA303E0131C4B1318A3020114384B13 -30A30203147092C71260A34A14E0007FB91280BA12C0C7270C000180C7FCA2021C130302 -1891C8FCA402385B02301306A50270130E0260130CA2BA12C06C1880280001C00038C8FC -4A1330A30103147091C71260A34914E001065CA3010E1301010C5CA3011C1303011891C9 -FCA301385B01301306A30170130E0160130CA23A4A7BB945>I<EB0380A3EB0FF0EB7FFE -48B512803903F38FC03907C381E0390F8380F0D81F031338123E003C141C007C140C150E -0078143E00F814FE1481A400FCEB80FC157800FE140012FF127F13C313E3EA3FFF6C7F14 -F86C13FE6CEBFF80000114C06C14E0013F13F01303ECBFF8148FEC83FC1481A2EC80FE15 -7E123C12FF153EA412FE00F8143C00E0147C12600070147815F8003814F0003C1381001E -EB83E0000FEB87C03907E39F803901FFFE006C5BEB1FE0EB0380A41F437BBD2A>I<121C -127FEAFF80A213C0A3127F121C1200A412011380A2120313005A1206120E5A5A5A12600A -1979B917>39 D<146014E0EB01C0EB0380EB0700130E131E5B5BA25B485AA2485AA21207 -5B120F90C7FCA25A121EA2123EA35AA65AB2127CA67EA3121EA2121F7EA27F12077F1203 -A26C7EA26C7E1378A27F7F130E7FEB0380EB01C0EB00E01460135278BD20>I<12C07E12 -707E7E7E120F6C7E6C7EA26C7E6C7EA21378A2137C133C133E131EA2131F7FA21480A3EB -07C0A6EB03E0B2EB07C0A6EB0F80A31400A25B131EA2133E133C137C1378A25BA2485A48 -5AA2485A48C7FC120E5A5A5A5A5A13527CBD20>I<EB0380497EA7397803803C00FC147E -00FE14FE397F8383FC393FC387F8390FE38FE03903FBBF803900FFFE00EB3FF8EB0FE0A2 -EB3FF8EBFFFE3903FBBF80390FE38FE0393FC387F8397F8383FC39FE0380FE00FC147E00 -78143C390007C000A76D5A1F247BBD2A>I<121C127FEAFF80A213C0A3127F121C1200A4 -12011380A2120313005A1206120E5A5A5A12600A19798817>44 D<B512FCA516057F941C ->I<121C127FEAFF80A5EA7F00121C0909798817>I<1506A2150E150CA2151C1518153815 -30A215701560A215E015C0A214011580A2140315005C1406A2140E140CA2141C1418A214 -381430A21470146014E05CA213015CA2130391C7FCA25B1306A2130E130C131C1318A213 -381330A213701360A213E05BA212015B120390C8FCA25A1206A2120E120CA2121C1218A2 -1238123012701260A212E05AA21F537BBD2A>I<EB03F8EB1FFF90387E0FC09038F803E0 -3901E000F0484813780007147C48487FA248C77EA2481580A3007EEC0FC0A500FE15E0B3 -007E15C0A4007F141F6C1580A36C1500A26C6C133EA26C6C5B6C6C5BEBF0013900F803E0 -90387E0FC0D91FFFC7FCEB03F823397DB62A>I<EB01C013031307131F13FFB5FCA2131F -1200B3B3A7497E007FB512F0A31C3779B62A>I<EB0FF0EB7FFE48B57E3903E03FE0390F -000FF0001E6D7E001C6D7E486D7E5A6E7E126012FE6CEC7F807FA56CC7FC121CC8FCEDFF -00A25D14015D14035D4A5A4A5A5D4A5A4AC7FC147E5C495A14E0495A495A49C8FC011EEB -01805B5B49130348481400485A485A90C75A48B6FC5A5A485CB6FCA321377CB62A>I<EB -07F8EB3FFF90B512C03901F80FF03903C007F848486C7E390E0001FEEA0F80391FE000FF -7FA56C5A6C5AC7485AA25D14035D4A5A5DEC0F80027FC7FCEB1FFCECFF809038000FE06E -7EEC01FC816E7EED7F80A216C0A2153F16E0A2121EEA7F80A2487EA316C0157F49148000 -7EC7FC0070ECFF006C495A121E390F8003F83907F00FF00001B512C06C6C90C7FCEB0FF8 -23397DB62A>I<1538A2157815F8A2140114031407A2140F141F141B14331473146314C3 -13011483EB030313071306130C131C131813301370136013C01201EA038013005A120E12 -0C5A123812305A12E0B712F8A3C73803F800AA4A7E0103B512F8A325387EB72A>I<0006 -140CD80780133C9038F003F890B5FC5D5D158092C7FC14FC38067FE090C9FCAAEB07F8EB -1FFE9038780F809038E007E03907C003F0496C7E130000066D7E81C8FC8181A21680A412 -1C127F5A7FA390C713005D12FC00605C12704A5A6C5C6C1303001E495A6C6C485A3907E0 -3F800001B5C7FC38007FFCEB1FE021397CB62A>I<EC3FC0903801FFF0010713FC90380F -E03E90383F800790387E001F49EB3F804848137F485A12075B000FEC3F0049131E001F91 -C7FC5B123FA3127F90C9FCEB01FC903807FF8039FF1E07E090383801F0496C7E01607F01 -E0137E497F16805BED1FC0A390C713E0A57EA47F123F16C0A2001FEC3F807F000F15006D -5B000714FE6C6C5B6C6C485A3900FE07F090387FFFC0011F90C7FCEB03FC23397DB62A> -I<12301238123E003FB612E0A316C05A168016000070C712060060140E5D5D00E0143048 -14705D5DC712014A5A4AC7FC1406140E5CA25C1478147014F05C1301A213035C1307A213 -0FA3131F5CA2133FA5137FA96DC8FC131E233A7BB72A>I<EB03F8EB1FFF017F13C09038 -FC07F03901E001F83903C0007C4848133C90C7123E48141E000E141F001E80A3121FA26D -5B6D131E7FD80FF85B6D137C01FF13786C6D5A6CEBE3E0ECF780C601FFC7FC6D5A6D6C7E -010F13E0013F7F01F97F3901E07FFE48486C7E380F800F48486C1380001E010113C0487F -007C143F0078EC1FE0150F00F81407481403A21501A36C15C0A200781403007C15806C14 -076CEC0F006C6C131ED807E0137C3903F803F0C6B55A013F1380D907FCC7FC23397DB62A ->I<121C127FEAFF80A5EA7F00121CC7FCB2121C127FEAFF80A5EA7F00121C092479A317> -58 D<EC03FF021F13E09138FC00FCD901E0131ED90780EB0780011EC7EA01E00138EC00 -704981498148488148488190C97E48D901FC1480000ED907FFEB01C0000C90391F03C000 -001C90267E00E013E000184901701360263801F86D13700030496D13300103EC0FE02670 -07E00107133800601718495AA200E0171C484848150CAA6C6C7E1260A26D6C151C007017 -18263003F0130F0101141F00386D013F1338261800FC01771330001C017E9038E3F07000 -0C90261F03C113E0000E903A07FF00FFC06CD901FCEB3F006C90CAFC7F6C7E6C7E13706D -167C011EED03FCD90780EC1FF0D901E0ECFF80D900FC90383FFC00021FB51280020301E0 -C7FC363C7BBA41>64 D<1538A3157CA315FEA34A7EA34A6C7EA202077FEC063FA2020E7F -EC0C1FA2021C7FEC180FA202387FEC3007A202707FEC6003A202C07F1501A2D901807F81 -A249C77F167FA20106810107B6FCA24981010CC7121FA2496E7EA3496E7EA3496E7EA213 -E0707E1201486C81D80FFC02071380B56C90B512FEA3373C7DBB3E>I<B712E016FC16FF -0001903980007FC06C90C7EA1FE0707E707E707EA2707EA283A75F16035F4C5A4C5A4C5A -4C5AEEFF8091B500FCC7FCA291C7EA7F80EE1FE0EE07F0707E707E83707EA21880177F18 -C0A7188017FFA24C13005F16034C5AEE1FF8486DEB7FF0B812C094C7FC16F832397DB83B ->I<913A01FF800180020FEBE003027F13F8903A01FF807E07903A03FC000F0FD90FF0EB -039F4948EB01DFD93F80EB00FF49C8127F01FE153F12014848151F4848150FA248481507 -A2485A1703123F5B007F1601A35B00FF93C7FCAD127F6DED0180A3123F7F001F16031800 -6C7E5F6C7E17066C6C150E6C6C5D00001618017F15386D6C5CD91FE05C6D6CEB03C0D903 -FCEB0F80902701FF803FC7FC9039007FFFFC020F13F002011380313D7BBA3C>I<B712C0 -16F816FE000190398001FF806C90C7EA3FE0EE0FF0EE03F8707E707E177FA2EF3F8018C0 -171F18E0170F18F0A3EF07F8A418FCAC18F8A4EF0FF0A218E0A2171F18C0EF3F80A2EF7F -0017FE4C5A4C5AEE0FF0EE3FE0486DEBFF80B8C7FC16F816C036397DB83F>I<B812FEA3 -000190388000076C90C8FC173F838383A383A31880170116C0A394C7FCA31501A2150315 -0F91B5FCA3EC000F15031501A21500A21860A318E093C712C0A41701A3EF0380A21707A2 -170F173F177F486D903807FF00B9FCA333397EB838>I<B812F8A30001903880001F6C90 -C71201EE00FC177C173C171CA2170CA4170E1706A2ED0180A21700A41503A21507151F91 -B5FCA3EC001F15071503A21501A692C8FCAD4813C0B612C0A32F397DB836>I<DBFF8013 -C0020FEBF001023F13FC9139FF803F03903A03FC000787D90FF0EB03CF4948EB00EF4948 -147F4948143F49C8121F485A4848150F48481507A248481503A2485A1701123F5B007F16 -00A448481600AB93B6FCA26C7E9338007FE0EF3FC0A2123F7F121FA26C7EA26C7EA26C7E -6C7E6C6C157F6D7E6D6C14FF6D6C14EFD90FF8EB03C7D903FEEB0783903A00FFC03F0191 -393FFFFC00020F01F0130002001380383D7CBA41>I<B648B512FEA30001902680000313 -006C90C76C5AB3A491B6FCA391C71201B3A6486D497EB648B512FEA337397DB83E>I<B6 -12C0A3C6EBC0006D5AB3B3AD497EB612C0A31A397EB81E>I<013FB512E0A39039001FFC -00EC07F8B3B3A3123FEA7F80EAFFC0A44A5A1380D87F005B0070131F6C5C6C495A6C49C7 -FC380781FC3801FFF038007F80233B7DB82B>I<B612E0A3000101C0C8FC6C90C9FCB3AD -1718A517381730A31770A317F0A216011603160FEE1FE0486D13FFB8FCA32D397DB834> -76 D<B5933807FFF86E5DA20001F0FC002600DFC0ED1BF8A2D9CFE01533A3D9C7F01563 -A3D9C3F815C3A2D9C1FCEC0183A3D9C0FEEC0303A2027F1406A36E6C130CA36E6C1318A2 -6E6C1330A36E6C1360A26E6C13C0A3913901FC0180A3913900FE0300A2ED7F06A3ED3F8C -A2ED1FD8A3ED0FF0A3486C6D5A487ED80FFC6D48497EB500C00203B512F8A2ED01804539 -7DB84C>I<B5913807FFFE8080C69238007FE06EEC1F80D9DFF0EC0F001706EBCFF8EBC7 -FCA2EBC3FEEBC1FFA201C07F6E7EA26E7E6E7E81140F6E7E8114036E7E168080ED7FC016 -E0153FED1FF0ED0FF8A2ED07FCED03FEA2ED01FF6F1386A2EE7FC6EE3FE6A2EE1FF6EE0F -FEA216071603A216011600A2177E486C153E487ED80FFC151EB500C0140EA2170637397D -B83E>I<EC03FF021F13E09138FE01FC903901F8007ED907E0EB1F8049486D7ED93F80EB -07F049C76C7E01FE6E7E48486E7E49157E0003167F4848ED3F80A24848ED1FC0A2001F17 -E049150F003F17F0A3007F17F8491507A300FF17FCAC007F17F86D150FA3003F17F0A26C -6CED1FE0A36C6CED3FC0000717806D157F000317006C6C15FEA26C6C4A5A017F4A5A6D6C -495A6D6C495AD907E0EB1F80D903F8017FC7FC903900FE01FC91381FFFE0020390C8FC36 -3D7BBA41>I<B712C016FC16FF0001D9800013C06C90C7EA1FE0707EEE03F883707EA270 -7EA21880A71800A24C5AA24C5A5FEE0FF04C5AEEFF8091B548C7FC16F091CAFCB3A5487F -B6FCA331397EB838>I<EC03FF021F13E09138FE01FC903901F8007ED907E0EB1F804948 -6D7ED93F80EB07F049C76C7E01FE6E7E48486E7EA24848157F0007178049153F000F17C0 -49151F001F17E0A24848ED0FF0A3007F17F8A2491507A200FF17FCAC007F17F8A26D150F -A2003F17F0A26C6CED1FE0A36C6CED3FC00007027C14804AB4FC3C03F80383807F003B01 -FC0701C0FEEC0E002600FE0CEBE1FC017FEC63F8D93F8CEB77F0D91FCCEB3FE0D907EE14 -806DB449C7FC0100D981FC130CEC1FFF0203131C91C7001E131C161F183CEF807CEFC0F8 -EE0FFFA318F08218E07013C07013809338007E00364B7BBA41>I<B612FEEDFFE016F800 -0190388007FE6C90C76C7EEE3FC0707E707E707EA2707EA283A65FA24C5AA24C5A4C5AEE -3F8004FFC8FCED07FC91B512E05E9138000FF0ED03F8ED00FE82707E707EA2161F83A583 -A6F00180A217F8160F1803486D01071400B66D6C5A04011306933800FE0ECAEA3FFCEF07 -F0393B7DB83D>I<D90FF813C090383FFE0190B512813903F807E33907E000F74848137F -4848133F48C7121F003E140F007E1407A2007C140312FC1501A36C1400A37E6D14006C7E -7F13F86CB47E6C13F8ECFF806C14E06C14F86C14FEC680013F1480010714C0EB007F0207 -13E0EC007FED3FF0151F150FED07F8A200C01403A21501A37EA216F07E15036C15E06C14 -076C15C06C140F6DEB1F80D8FBF0EB3F00D8F0FE13FE39E03FFFF8010F13E0D8C00190C7 -FC253D7CBA2E>I<003FB812E0A3D9C003EB001F273E0001FE130348EE01F00078160000 -701770A300601730A400E01738481718A4C71600B3B0913807FF80011FB612E0A335397D -B83C>I<B6903807FFFEA3000101809038007FE06C90C8EA1F80EF0F001706B3B2170E6D -150C80171C133F17186D6C14385F6D6C14F06D6C5C6D6C495A6D6CEB07806D6C49C7FC91 -387F807E91381FFFF8020713E09138007F80373B7DB83E>I<B500FC91387FFF80A30003 -018091380FFC006C90C8EA07E0715A6C705A6E1403017F93C7FCA280013F1506A26E140E -011F150C80010F5DA28001075DA26E147001031560A26D6C5CA2806D4A5AA2ED8003027F -91C8FCA291383FC006A215E0021F5BA2EDF01C020F1318A26E6C5AA215FC02035BA2EDFE -E002015BA26E6C5AA36FC9FCA3153EA2151CA3393B7EB83E>I<007FB590383FFFFCA3C6 -01F801071380D97FE0D903FCC7FC013FEC01F06D6C5C5F6D6C5C6D6C13034CC8FC6D6C13 -06160E6D6C5B6DEB8018163891387FC0306E6C5A16E06E6C5A91380FF18015FB6EB4C9FC -5D14036E7EA26E7F6F7EA24B7E15DF9138019FF09138038FF8150F91380607FC91380E03 -FE140C4A6C7EEC38000230804A6D7E14E04A6D7E49486D7E130391C76C7E01066E7E130E -010C6E7E011C1401013C8101FE822607FF80010713E0B500E0013FEBFF80A339397EB83E ->88 D<B500FE91383FFFE0A3000301E0913807FE00C649EC03F0017F6F5A606D6C5D6D6C -140395C7FC6D6C1406A26D6C5C6D6C141C17186D6C143817306D6D5B6E6C13E05F91383F -E0015F91381FF003DA0FF890C8FC1606913807FC0E160C913803FE1C913801FF185E6E13 -B016E0157F6F5AB3A24B7E023FB512C0A33B397FB83E>I<003FB7FCA39039FC0001FE01 -C0130349495A003EC7FC003C4A5A5E0038141F00784A5A12704B5A5E006014FF4A90C7FC -A24A5A5DC712074A5AA24A5A5D143F4A5AA24A5A92C8FC5B495AA2495A5C130F4948EB01 -80A2495A5C137F495A16034890C7FC5B1203485AEE0700485A495C001F5D48485C5E4848 -495A49130FB8FCA329397BB833>I<007FB81280B912C0A26C17803204797041>95 +007C137CA8003C137800381338A700181330171E77BA2A>34 D<141FEC7FC0903801F0E0 +903803C0600107137090380F803090381F00381518A25BA2133E133F15381530A215705D +5D140190381F838092CAFC1487148E02DC49B51280EB0FF85C4A9039003FF8000107ED0F +C06E5D71C7FC6E140E010F150CD91DFC141C01391518D970FE143801E015302601C07F14 +70D803805D00076D6C5BD80F00EBC00148011F5C4890380FE003003E6E48C8FC007E9038 +07F8060203130E00FE6E5A6E6C5A1400ED7F706C4B13036F5A6F7E6C6C6D6C5B7013066C +6C496C130E6DD979FE5B281FF001F07F133C3C07F80FE03FC0F86CB539800FFFF0C69026 +FE000313C0D91FF0D9007FC7FC393E7DBB41>38 D<121C127FEAFF80A213C0A3127F121C +1200A412011380A2120313005A1206120E5A5A5A12600A1979B917>I<146014E0EB01C0 +EB0380EB0700130E131E5B5BA25B485AA2485AA212075B120F90C7FCA25A121EA2123EA3 +5AA65AB2127CA67EA3121EA2121F7EA27F12077F1203A26C7EA26C7E1378A27F7F130E7F +EB0380EB01C0EB00E01460135278BD20>I<12C07E12707E7E7E120F6C7E6C7EA26C7E6C +7EA21378A2137C133C133E131EA2131F7FA21480A3EB07C0A6EB03E0B2EB07C0A6EB0F80 +A31400A25B131EA2133E133C137C1378A25BA2485A485AA2485A48C7FC120E5A5A5A5A5A +13527CBD20>I<EB0380497EA7397803803C00FC147E00FE14FE397F8383FC393FC387F8 +390FE38FE03903FBBF803900FFFE00EB3FF8EB0FE0A2EB3FF8EBFFFE3903FBBF80390FE3 +8FE0393FC387F8397F8383FC39FE0380FE00FC147E0078143C390007C000A76D5A1F247B +BD2A>I<121C127FEAFF80A213C0A3127F121C1200A412011380A2120313005A1206120E +5A5A5A12600A19798817>44 D<B512FCA516057F941C>I<121C127FEAFF80A5EA7F0012 +1C0909798817>I<1506A2150E150CA2151C151815381530A215701560A215E015C0A214 +011580A2140315005C1406A2140E140CA2141C1418A214381430A21470146014E05CA213 +015CA2130391C7FCA25B1306A2130E130C131C1318A213381330A213701360A213E05BA2 +12015B120390C8FCA25A1206A2120E120CA2121C1218A21238123012701260A212E05AA2 +1F537BBD2A>I<EB03F8EB1FFF90387E0FC09038F803E03901E000F0484813780007147C +48487FA248C77EA2481580A3007EEC0FC0A500FE15E0B3007E15C0A4007F141F6C1580A3 +6C1500A26C6C133EA26C6C5B6C6C5BEBF0013900F803E090387E0FC0D91FFFC7FCEB03F8 +23397DB62A>I<EB01C013031307131F13FFB5FCA2131F1200B3B3A7497E007FB512F0A3 +1C3779B62A>I<EB0FF0EB7FFE48B57E3903E03FE0390F000FF0001E6D7E001C6D7E486D +7E5A6E7E126012FE6CEC7F807FA56CC7FC121CC8FCEDFF00A25D14015D14035D4A5A4A5A +5D4A5A4AC7FC147E5C495A14E0495A495A49C8FC011EEB01805B5B49130348481400485A +485A90C75A48B6FC5A5A485CB6FCA321377CB62A>I<EB07F8EB3FFF90B512C03901F80F +F03903C007F848486C7E390E0001FEEA0F80391FE000FF7FA56C5A6C5AC7485AA25D1403 +5D4A5A5DEC0F80027FC7FCEB1FFCECFF809038000FE06E7EEC01FC816E7EED7F80A216C0 +A2153F16E0A2121EEA7F80A2487EA316C0157F491480007EC7FC0070ECFF006C495A121E +390F8003F83907F00FF00001B512C06C6C90C7FCEB0FF823397DB62A>I<1538A2157815 +F8A2140114031407A2140F141F141B14331473146314C313011483EB030313071306130C +131C131813301370136013C01201EA038013005A120E120C5A123812305A12E0B712F8A3 +C73803F800AA4A7E0103B512F8A325387EB72A>I<0006140CD80780133C9038F003F890 +B5FC5D5D158092C7FC14FC38067FE090C9FCAAEB07F8EB1FFE9038780F809038E007E039 +07C003F0496C7E130000066D7E81C8FC8181A21680A4121C127F5A7FA390C713005D12FC +00605C12704A5A6C5C6C1303001E495A6C6C485A3907E03F800001B5C7FC38007FFCEB1F +E021397CB62A>I<EC3FC0903801FFF0010713FC90380FE03E90383F800790387E001F49 +EB3F804848137F485A12075B000FEC3F0049131E001F91C7FC5B123FA3127F90C9FCEB01 +FC903807FF8039FF1E07E090383801F0496C7E01607F01E0137E497F16805BED1FC0A390 +C713E0A57EA47F123F16C0A2001FEC3F807F000F15006D5B000714FE6C6C5B6C6C485A39 +00FE07F090387FFFC0011F90C7FCEB03FC23397DB62A>I<12301238123E003FB612E0A3 +16C05A168016000070C712060060140E5D5D00E014304814705D5DC712014A5A4AC7FC14 +06140E5CA25C1478147014F05C1301A213035C1307A2130FA3131F5CA2133FA5137FA96D +C8FC131E233A7BB72A>I<EB03F8EB1FFF017F13C09038FC07F03901E001F83903C0007C +4848133C90C7123E48141E000E141F001E80A3121FA26D5B6D131E7FD80FF85B6D137C01 +FF13786C6D5A6CEBE3E0ECF780C601FFC7FC6D5A6D6C7E010F13E0013F7F01F97F3901E0 +7FFE48486C7E380F800F48486C1380001E010113C0487F007C143F0078EC1FE0150F00F8 +1407481403A21501A36C15C0A200781403007C15806C14076CEC0F006C6C131ED807E013 +7C3903F803F0C6B55A013F1380D907FCC7FC23397DB62A>I<EB03F8EB1FFF017F13C039 +01FC07E048486C7E3907E001F8000F6D7E4848137E5B003F80A248C71380A25AED1FC0A5 +16E0A56C143FA36C7E157F121F6C6C13FF6C6C13DF000313013901F0039F3900FC0F1FD9 +3FFC13C0EB07F090C7FCA2153F1680A216005D120F486C137E486C5BA24A5A4A5A49485A +381F000F001CEB1F80260F807FC7FC3807FFFE000113F838003FC023397DB62A>I<121C +127FEAFF80A5EA7F00121CC7FCB2121C127FEAFF80A5EA7F00121C092479A317>I<121C +127FEAFF80A5EA7F00121CC7FCB2121C127FEAFF80A213C0A3127F121C1200A412011380 +A2120313005A1206120E5A5A5A12600A3479A317>I<EC03FF021F13E09138FC00FCD901 +E0131ED90780EB0780011EC7EA01E00138EC00704981498148488148488190C97E48D901 +FC1480000ED907FFEB01C0000C90391F03C000001C90267E00E013E00018490170136026 +3801F86D13700030496D13300103EC0FE0267007E00107133800601718495AA200E0171C +484848150CAA6C6C7E1260A26D6C151C00701718263003F0130F0101141F00386D013F13 +38261800FC01771330001C017E9038E3F070000C90261F03C113E0000E903A07FF00FFC0 +6CD901FCEB3F006C90CAFC7F6C7E6C7E13706D167C011EED03FCD90780EC1FF0D901E0EC +FF80D900FC90383FFC00021FB51280020301E0C7FC363C7BBA41>64 +D<1538A3157CA315FEA34A7EA34A6C7EA202077FEC063FA2020E7FEC0C1FA2021C7FEC18 +0FA202387FEC3007A202707FEC6003A202C07F1501A2D901807F81A249C77F167FA20106 +810107B6FCA24981010CC7121FA2496E7EA3496E7EA3496E7EA213E0707E1201486C81D8 +0FFC02071380B56C90B512FEA3373C7DBB3E>I<B712E016FC16FF0001903980007FC06C +90C7EA1FE0707E707E707EA2707EA283A75F16035F4C5A4C5A4C5A4C5AEEFF8091B500FC +C7FCA291C7EA7F80EE1FE0EE07F0707E707E83707EA21880177F18C0A7188017FFA24C13 +005F16034C5AEE1FF8486DEB7FF0B812C094C7FC16F832397DB83B>I<913A01FF800180 +020FEBE003027F13F8903A01FF807E07903A03FC000F0FD90FF0EB039F4948EB01DFD93F +80EB00FF49C8127F01FE153F12014848151F4848150FA248481507A2485A1703123F5B00 +7F1601A35B00FF93C7FCAD127F6DED0180A3123F7F001F160318006C7E5F6C7E17066C6C +150E6C6C5D00001618017F15386D6C5CD91FE05C6D6CEB03C0D903FCEB0F80902701FF80 +3FC7FC9039007FFFFC020F13F002011380313D7BBA3C>I<B712C016F816FE0001903980 +01FF806C90C7EA3FE0EE0FF0EE03F8707E707E177FA2EF3F8018C0171F18E0170F18F0A3 +EF07F8A418FCAC18F8A4EF0FF0A218E0A2171F18C0EF3F80A2EF7F0017FE4C5A4C5AEE0F +F0EE3FE0486DEBFF80B8C7FC16F816C036397DB83F>I<B812FEA3000190388000076C90 +C8FC173F838383A383A31880170116C0A394C7FCA31501A21503150F91B5FCA3EC000F15 +031501A21500A21860A318E093C712C0A41701A3EF0380A21707A2170F173F177F486D90 +3807FF00B9FCA333397EB838>I<B812F8A30001903880001F6C90C71201EE00FC177C17 +3C171CA2170CA4170E1706A2ED0180A21700A41503A21507151F91B5FCA3EC001F150715 +03A21501A692C8FCAD4813C0B612C0A32F397DB836>I<DBFF8013C0020FEBF001023F13 +FC9139FF803F03903A03FC000787D90FF0EB03CF4948EB00EF4948147F4948143F49C812 +1F485A4848150F48481507A248481503A2485A1701123F5B007F1600A448481600AB93B6 +FCA26C7E9338007FE0EF3FC0A2123F7F121FA26C7EA26C7EA26C7E6C7E6C6C157F6D7E6D +6C14FF6D6C14EFD90FF8EB03C7D903FEEB0783903A00FFC03F0191393FFFFC00020F01F0 +130002001380383D7CBA41>I<B648B512FEA30001902680000313006C90C76C5AB3A491 +B6FCA391C71201B3A6486D497EB648B512FEA337397DB83E>I<B612C0A3C6EBC0006D5A +B3B3AD497EB612C0A31A397EB81E>I<B649B5FCA3000101809038007FF06C90C8EA3F80 +053EC7FC173C17385F5F4C5A4C5A4CC8FC160E5E5E5E5E4B5AED0780030EC9FC5D153E15 +7E15FF5C4A7F4A6C7E140E4A6C7E4A6C7E14704A6C7E4A6C7E14804A6C7E6F7EA26F7F70 +7EA2707E707EA2707EA2707E707EA2707E707F8484486D497FB6011FEBFF80A339397DB8 +41>75 D<B612E0A3000101C0C8FC6C90C9FCB3AD1718A517381730A31770A317F0A21601 +1603160FEE1FE0486D13FFB8FCA32D397DB834>I<B5933807FFF86E5DA20001F0FC0026 +00DFC0ED1BF8A2D9CFE01533A3D9C7F01563A3D9C3F815C3A2D9C1FCEC0183A3D9C0FEEC +0303A2027F1406A36E6C130CA36E6C1318A26E6C1330A36E6C1360A26E6C13C0A3913901 +FC0180A3913900FE0300A2ED7F06A3ED3F8CA2ED1FD8A3ED0FF0A3486C6D5A487ED80FFC +6D48497EB500C00203B512F8A2ED018045397DB84C>I<B5913807FFFE8080C69238007F +E06EEC1F80D9DFF0EC0F001706EBCFF8EBC7FCA2EBC3FEEBC1FFA201C07F6E7EA26E7E6E +7E81140F6E7E8114036E7E168080ED7FC016E0153FED1FF0ED0FF8A2ED07FCED03FEA2ED +01FF6F1386A2EE7FC6EE3FE6A2EE1FF6EE0FFEA216071603A216011600A2177E486C153E +487ED80FFC151EB500C0140EA2170637397DB83E>I<EC03FF021F13E09138FE01FC9039 +01F8007ED907E0EB1F8049486D7ED93F80EB07F049C76C7E01FE6E7E48486E7E49157E00 +03167F4848ED3F80A24848ED1FC0A2001F17E049150F003F17F0A3007F17F8491507A300 +FF17FCAC007F17F86D150FA3003F17F0A26C6CED1FE0A36C6CED3FC0000717806D157F00 +0317006C6C15FEA26C6C4A5A017F4A5A6D6C495A6D6C495AD907E0EB1F80D903F8017FC7 +FC903900FE01FC91381FFFE0020390C8FC363D7BBA41>I<B712C016FC16FF0001D98000 +13C06C90C7EA1FE0707EEE03F883707EA2707EA21880A71800A24C5AA24C5A5FEE0FF04C +5AEEFF8091B548C7FC16F091CAFCB3A5487FB6FCA331397EB838>I<EC03FF021F13E091 +38FE01FC903901F8007ED907E0EB1F8049486D7ED93F80EB07F049C76C7E01FE6E7E4848 +6E7EA24848157F0007178049153F000F17C049151F001F17E0A24848ED0FF0A3007F17F8 +A2491507A200FF17FCAC007F17F8A26D150FA2003F17F0A26C6CED1FE0A36C6CED3FC000 +07027C14804AB4FC3C03F80383807F003B01FC0701C0FEEC0E002600FE0CEBE1FC017FEC +63F8D93F8CEB77F0D91FCCEB3FE0D907EE14806DB449C7FC0100D981FC130CEC1FFF0203 +131C91C7001E131C161F183CEF807CEFC0F8EE0FFFA318F08218E07013C0701380933800 +7E00364B7BBA41>I<B612FEEDFFE016F8000190388007FE6C90C76C7EEE3FC0707E707E +707EA2707EA283A65FA24C5AA24C5A4C5AEE3F8004FFC8FCED07FC91B512E05E9138000F +F0ED03F8ED00FE82707E707EA2161F83A583A6F00180A217F8160F1803486D01071400B6 +6D6C5A04011306933800FE0ECAEA3FFCEF07F0393B7DB83D>I<D90FF813C090383FFE01 +90B512813903F807E33907E000F74848137F4848133F48C7121F003E140F007E1407A200 +7C140312FC1501A36C1400A37E6D14006C7E7F13F86CB47E6C13F8ECFF806C14E06C14F8 +6C14FEC680013F1480010714C0EB007F020713E0EC007FED3FF0151F150FED07F8A200C0 +1403A21501A37EA216F07E15036C15E06C14076C15C06C140F6DEB1F80D8FBF0EB3F00D8 +F0FE13FE39E03FFFF8010F13E0D8C00190C7FC253D7CBA2E>I<003FB812E0A3D9C003EB +001F273E0001FE130348EE01F00078160000701770A300601730A400E01738481718A4C7 +1600B3B0913807FF80011FB612E0A335397DB83C>I<B6903807FFFEA300010180903800 +7FE06C90C8EA1F80EF0F001706B3B2170E6D150C80171C133F17186D6C14385F6D6C14F0 +6D6C5C6D6C495A6D6CEB07806D6C49C7FC91387F807E91381FFFF8020713E09138007F80 +373B7DB83E>I<B500FC91387FFF80A30003018091380FFC006C90C8EA07E0715A6C705A +6E1403017F93C7FCA280013F1506A26E140E011F150C80010F5DA28001075DA26E147001 +031560A26D6C5CA2806D4A5AA2ED8003027F91C8FCA291383FC006A215E0021F5BA2EDF0 +1C020F1318A26E6C5AA215FC02035BA2EDFEE002015BA26E6C5AA36FC9FCA3153EA2151C +A3393B7EB83E>I<B5D8FC07B5D8F001B5FCA30007902780001FFEC7EA1FF86C48C7D80F +F8EC07E000010307ED03C01B807F6C6F6C1500A26E5F017F6E6C1406A280013F4A6C5CA2 +80011F4A6D5BEE067FA26D6C010E6D5BEE0C3FA26D6C011C6D5BEE181FA26D6C6F5BEE30 +0FA26D6C6F485AEE6007A26D6C4CC7FC9338C003FCA203805D913B7F818001FE06A203C1 +150EDA3FC3C7EAFF0CA203E3151CDA1FE6EC7F98A215F6DA0FFCEC3FF0A302075E4B141F +A202035E4B140FA202015E4B1407A2020093C8FC4B80503B7EB855>I<007FB590383FFF +FCA3C601F801071380D97FE0D903FCC7FC013FEC01F06D6C5C5F6D6C5C6D6C13034CC8FC +6D6C1306160E6D6C5B6DEB8018163891387FC0306E6C5A16E06E6C5A91380FF18015FB6E +B4C9FC5D14036E7EA26E7F6F7EA24B7E15DF9138019FF09138038FF8150F91380607FC91 +380E03FE140C4A6C7EEC38000230804A6D7E14E04A6D7E49486D7E130391C76C7E01066E +7E130E010C6E7E011C1401013C8101FE822607FF80010713E0B500E0013FEBFF80A33939 +7EB83E>I<B500FE91383FFFE0A3000301E0913807FE00C649EC03F0017F6F5A606D6C5D +6D6C140395C7FC6D6C1406A26D6C5C6D6C141C17186D6C143817306D6D5B6E6C13E05F91 +383FE0015F91381FF003DA0FF890C8FC1606913807FC0E160C913803FE1C913801FF185E +6E13B016E0157F6F5AB3A24B7E023FB512C0A33B397FB83E>I<003FB7FCA39039FC0001 +FE01C0130349495A003EC7FC003C4A5A5E0038141F00784A5A12704B5A5E006014FF4A90 +C7FCA24A5A5DC712074A5AA24A5A5D143F4A5AA24A5A92C8FC5B495AA2495A5C130F4948 +EB0180A2495A5C137F495A16034890C7FC5B1203485AEE0700485A495C001F5D48485C5E +4848495A49130FB8FCA329397BB833>I<007FB81280B912C0A26C17803204797041>95 D<EB1FE0EBFFFC3803E03F3907000F80390F8007E0486C6C7E13E06E7EA26E7E6C5A6C5A C8FCA4147FEB07FFEB3FE0EBFE00EA03F8EA0FF0EA1FC0123F485A90C7FC160C12FEA314 01A26C13036CEB077C903980063E18383FC01E3A0FE0781FF03A03FFF00FE03A007F8007 @@ -978,330 +1034,571 @@ letter %%EndSetup %%Page: 1 1 -1 0 bop 0 162 a Fg(11)17 b(11)h(T)249 180 y(E)295 162 -y(X)h(L)398 145 y Ff(A)435 162 y Fg(T)481 180 y(E)527 -162 y(X)0 353 y Fe(Using)54 b(Libical)p 0 467 3900 24 -v 0 580 a Fg(Eric)28 b(Busb)r(o)r(om)f(\(eric@soft)n(w)n -(arestudio.org\))1921 b(Jan)n(uary)25 b(2000)0 1217 y -Fd(1)131 b(In)l(tro)t(duction)0 1456 y Fg(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 1570 y(sp)r(eci\034cation)k(describ)r(es)g(ho)n -(w)f(calendar)g(clien)n(ts)i(can)f(comm)n(unicate)f(with)i(calendar)e -(serv)n(ers)f(for)i(users)g(can)g(store)f(their)0 1683 -y(calendar)g(data)h(and)h(arrange)d(meetings)i(with)h(other)f(users.)0 -1840 y(Libical)g(implemen)n(ts)h(the)g(follo)n(wing)e(sp)r -(eci\034cations)h(and)h(proto)r(cols)0 1996 y(iCal)f(Core)g(2445)e -(iTIP)k(2446)c(iMIP)j(2447)e(iRIP)i(draft)g(CAP)g(draft)0 -2153 y(\(The)g(curren)n(t)f(v)n(ersion,)f(0.15,)g(do)r(es)h(not)h -(implemen)n(t)g(iRip)g(or)e(CAP)-7 b(.)29 b(\))0 2309 -y(This)j(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 2423 y(these)c(sp)r(eci\034cations)e(are)h(online)g(on)h -(the)g(CALSCH)g(w)n(ebpage)e(at:)p 0 2475 3900 4 v 0 -2617 a Fc(http://www.imc.o)o(rg)o(/ie)o(tf)o(-c)o(ale)o(nd)o(ar)o(/)p -0 2776 V 0 2996 a Fb(1.1)112 b(The)38 b(libical)c(pro)6 -b(ject)0 3207 y Fg(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 3320 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)332 3518 y(h)n(ttp://soft)n(w)n(arestudio.org/libical/index.h)n -(tml)0 3716 y(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:)p 0 3769 -V 0 3904 a Fc(To:)42 b(minimalist@softwa)o(re)o(st)o(udi)o(o.)o(or)o(g) -0 4017 y(Subject:)e(subscribe)g(libical)p 0 4176 V 0 -4396 a Fb(1.2)112 b(License)0 4607 y Fg(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 4720 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 4834 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 4947 y(for)27 b(a)g(cop)n(y)g(of)g(the)h(LGPL.) -0 5104 y(This)j(dual)g(license)f(ensures)h(that)g(the)g(library)f(can)g +1 0 bop 0 162 a Fh(11)17 b(11)h(T)249 180 y(E)295 162 +y(X)h(L)398 145 y Fg(A)435 162 y Fh(T)481 180 y(E)527 +162 y(X)0 353 y Ff(Using)54 b(Libical)p 0 467 3900 24 +v 0 580 a Fh(Eric)28 b(Busb)r(o)r(om)f(\(eric@soft)n(w)n +(arestudio.org\))2054 b(Ma)n(y)26 b(2000)0 1217 y Fe(1)131 +b(In)l(tro)t(duction)0 1456 y Fh(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 +1570 y(sp)r(eci\034cation)k(describ)r(es)g(ho)n(w)f(calendar)g(clien)n +(ts)i(can)f(comm)n(unicate)f(with)i(calendar)e(serv)n(ers)f(for)i +(users)g(can)g(store)f(their)0 1683 y(calendar)g(data)h(and)h(arrange)d +(meetings)i(with)h(other)f(users.)0 1840 y(Libical)g(implemen)n(ts)h +(RF)n(C2445)e(and)h(RF)n(C2446.)35 b(Ev)n(en)n(tually)-7 +b(,)27 b(it)h(will)g(also)e(implemen)n(t)j(iRIP)f(and)f(CAP)-7 +b(.)0 1996 y(This)32 b(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 2110 y(these)c(sp)r(eci\034cations)e(are)h(online) +g(on)h(the)g(CALSCH)g(w)n(ebpage)e(at:)0 2308 y Fd(http://www.imc.o)o +(rg)o(/ie)o(tf)o(-c)o(ale)o(nd)o(ar)o(/)0 2706 y Fc(1.1)112 +b(The)38 b(libical)c(pro)6 b(ject)0 2916 y Fh(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 +3029 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 +3227 y Fd(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 3539 y Fh(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 +3737 y Fd(To:)42 b(minimalist@softwa)o(re)o(st)o(udi)o(o.)o(or)o(g)0 +3850 y(Subject:)e(subscribe)g(libical)0 4248 y Fc(1.2)112 +b(License)0 4458 y Fh(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 4572 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 +4686 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 4799 y(for)27 b(a)g(cop)n(y)g(of)g(the)h(LGPL.) +0 4956 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 5217 y(grams,)23 b(and)h(will)h(b)r(ene\034t)g +(and)f(GPL'd)i(pro-)0 5069 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 -5331 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 5615 y Fb(1.3)112 -b(Purp)s(ose)38 b(&)f(Goals)0 5844 y(1.4)112 b(Do)s(cumen)m(t)37 -b(v)m(ersion)0 6054 y Fg($Id:)g(UsingLibical.lyx,v)26 -b(1.4)h(2000/02/18)22 b(23:06:04)j(eric)i(Exp)h(eric)f($)0 -6386 y Fd(2)131 b(Building)46 b(the)e(Library)0 6624 -y Fg(Libical)37 b(uses)g(auto)r(conf)h(to)f(generate)f(mak)n(e\034les,) -k(although)c(it)i(uses)g(none)f(of)h(the)g(auto)r(conf)f(\035ags)f(to)i -(in\035uence)g(the)0 6738 y(compilation.)e(It)28 b(should)f(built)i -(with)f(no)f(adjustmen)n(ts)h(on)f(Lin)n(ux,)g(F)-7 b(reeBSD)28 -b(and)f(Solaris.)0 7069 y Fd(3)131 b(Structure)0 7308 -y Fg(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 +5183 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 5467 y Fc(1.3)112 +b(Example)37 b(Co)s(de)0 5677 y Fh(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 +5791 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(more)g(annotated)g +(examples.)0 6122 y Fe(2)131 b(Building)46 b(the)e(Library)0 +6361 y Fh(Libical)37 b(uses)g(auto)r(conf)h(to)f(generate)f(mak)n +(e\034les,)k(although)c(it)i(uses)g(none)f(of)h(the)g(auto)r(conf)f +(\035ags)f(to)i(in\035uence)g(the)0 6474 y(compilation.)e(It)28 +b(should)f(built)i(with)f(no)f(adjustmen)n(ts)h(on)f(Lin)n(ux,)g(F)-7 +b(reeBSD)28 b(and)f(Solaris.)0 6805 y Fe(3)131 b(Structure)0 +7044 y Fh(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 -7464 y(Prop)r(erties)32 b(are)f(the)i(fundamen)n(tal)f(unit)i(of)e +7201 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 7578 y(constan)n(t)21 +(a)g(hash)g(en)n(try)-7 b(,)34 b(with)e(a)0 7314 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 -7691 y(line)p 0 7728 V 0 7863 a 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)p eop +7428 y(line)0 7626 y Fd(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)p eop %%Page: 2 2 -2 1 bop 0 -167 3900 5 v 0 -200 a Fa(4.)73 b(Di\033erences)31 -b(F)-8 b(rom)31 b(RF)m(Cs)2732 b Fg(2)p 0 162 3900 4 -v 0 312 a(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 425 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 582 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 695 y(timezones.)0 852 y(The)k(cen)n(tral)f(goal)g(of)h -(libical)g(is)g(to)g(parse)f(iTIP)i(data)e(in)n(to)h(an)g(in)n(ternal)f -(represen)n(tation)g(of)h(Comp)r(onen)n(ts,)g(Prop)r(erties,)0 -965 y(P)n(arameters)d(an)h(V)-7 b(alues,)27 b(and)h(to)f(allo)n(w)g -(the)h(user)f(to)g(manipulate)g(the)h(data)g(in)f(v)-5 -b(arious)27 b(w)n(a)n(ys)0 1257 y Fb(3.1)112 b(Comp)s(onen)m(ts)0 -1486 y(3.2)g(Prop)s(erties)0 1715 y(3.3)g(V)-9 b(alues)0 -1944 y(3.4)112 b(P)m(arameters)0 2173 y(3.5)g(En)m(umerations)0 -2402 y(3.6)g(T)m(yp)s(es)0 2631 y(3.7)g(The)38 b(P)m(arser)0 -2860 y(3.8)112 b(Restrictions)0 3089 y(3.9)g(Memory)37 -b(Managemen)m(t)0 3356 y Fd(4)131 b(Di\033erences)44 -b(F)-11 b(rom)43 b(RF)l(Cs)0 3594 y Fg(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 3708 y(standards)30 b(are)g(also)g(k)n(eey)g(ob)5 -b(jects)31 b(in)h(the)f(library)-7 b(.)47 b(Ho)n(w)n(ev)n(er,)30 -b(there)h(are)f(a)h(few)g(areas)e(where)i(the)h(sp)r(eci\034cations)e -(are)0 3821 y(\(arguably\))g(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 3935 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 -4227 y Fb(4.1)112 b(Pseudo)38 b(Comp)s(onen)m(ts)0 4437 -y Fg(Libical)g(de\034nes)g(comp)r(onen)n(ts)g(for)g(groups)f(of)i(prop) -r(erties)e(that)i(lo)r(ok)e(and)i(act)f(lik)n(e)g(comp)r(onen)n(ts,)i -(but)f(are)f(not)g(de-)0 4550 y(\034ned)c(as)f(comp)r(onen)n(ts)g(in)h -(the)g(sp)r(eci\034cation.)54 b(XD)n(A)-7 b(YLIGHT)35 -b(and)e(XST)-7 b(AND)n(ARD)36 b(are)c(notable)h(examples.)54 -b(These)0 4664 y(pseudo)23 b(comp)r(onen)n(ts)g(group)g(prop)r(erties)g -(within)h(the)g(VTIMEZONE)h(comp)r(onen)n(ts.)35 b(XD)n(A)-7 -b(YLIGHT)25 b(starts)d(with)j("BE-)0 4777 y(GIN:D)n(A)-7 -b(YLIGHT")35 b(and)f(ends)g(with)g("END:D)n(A)-7 b(YLIGHT,)36 -b(just)e(lik)n(e)g(other)f(comp)r(onen)n(ts,)i(but)g(is)f(not)g -(de\034ned)g(as)f(a)0 4891 y(comp)r(onen)n(t)27 b(in)h(RF)n(C2445.)35 -b(\()28 b(See)f(RF)n(C2445,)f(page)h(61)f(\))i(In)g(Libical,)f(it)h(is) -g(a)f(comp)r(onen)n(t.)0 5047 y(There)35 b(are)g(also)g(pseudo)h(comp)r -(onen)n(ts)f(that)i(are)e(conceptually)g(deriv)n(ed)g(classess)f(of)i -(V)-9 b(ALARM.)37 b(RF)n(C2446)d(de\034nes)0 5161 y(what)d(prop)r -(erties)f(ma)n(y)g(b)r(e)h(included)g(in)g(eac)n(h)f(comp)r(onen)n(t,)i -(and)e(for)h(V)-9 b(ALARM,)31 b(the)g(set)g(of)g(prop)r(erties)f(it)h -(ma)n(y)f(ha)n(v)n(e)0 5275 y(dep)r(ends)e(on)f(the)h(v)-5 -b(alue)28 b(of)f(the)h(A)n(CTION)f(prop)r(ert)n(y)-7 -b(.)0 5431 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 -5545 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 5658 y(ha)n(v)n(e)26 b(a)i(DESCRIPTION)g(prop)r(ert)n -(y)-7 b(.)p eop -%%Page: 3 3 -3 2 bop 0 -167 3900 5 v 0 -200 a Fa(5.)73 b(Implemen)m(tation)29 -b(Limitations)2539 b Fg(3)0 162 y(T)-7 b(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 275 y(DIO)n(ALARM,)28 b(XDISPLA)-7 b(Y)g(ALARM,)30 -b(XEMAILALARM)f(and)f(XPR)n(OCEDUREALARM.)0 567 y Fb(4.2)112 -b(Com)m(bined)37 b(V)-9 b(alues)0 777 y Fg(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 890 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 1004 y(asso)r(ciated)26 -b(with)i(a)f(prop)r(ert)n(y)-7 b(.)0 1161 y(It)30 b(is)g(natural)g(to)f -(ha)n(v)n(e)g(in)n(terfaces)g(that)i(w)n(ould)e(return)h(the)g(v)-5 -b(alue)30 b(of)g(a)g(prop)r(ert)n(y)-7 b(,)29 b(but)i(it)f(is)g(cum)n -(b)r(ersone)f(for)h(a)g(single)0 1274 y(routine)i(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 1388 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 1501 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 -1793 y Fb(4.3)112 b(Multi-V)-9 b(alued)36 b(Prop)s(erties)0 -2003 y Fg(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 2116 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 -2230 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 -2344 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 -2457 y(That)c(is,)f(an)g(input)i(line)e(lik)n(e,)p 0 -2526 3900 4 v 0 2703 a Fc(CATEGORIES:)39 b(work,)i(home)p -0 2903 V 0 3053 a Fg(b)r(ecomes)27 b(in)h(libical's)f(in)n(ternal)g -(represen)n(tation)p 0 3122 V 0 3299 a Fc(CATEGORIES:)39 -b(work)0 3412 y(CATEGORIES:)g(home)p 0 3612 V 0 3767 -a Fg(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 3881 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 3994 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 4108 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 4446 y Fd(5)131 b(Implemen)l(tation)44 b(Limitations)0 -4742 y(6)131 b(Using)44 b(libical)0 4999 y Fb(6.1)112 -b(Creating)37 b(Comp)s(onen)m(ts)0 5209 y Fg(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 5323 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.)p +2 1 bop 0 -167 3900 5 v 0 -200 a Fb(3.)73 b(Structure)3313 +b Fh(2)0 162 y(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 275 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 432 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 +545 y(timezones.)0 702 y(The)k(cen)n(tral)f(goal)g(of)h(libical)g(is)g +(to)g(parse)f(iTIP)i(data)e(in)n(to)h(an)g(in)n(ternal)f(represen)n +(tation)g(of)h(Comp)r(onen)n(ts,)g(Prop)r(erties,)0 815 +y(P)n(arameters)d(an)h(V)-7 b(alues,)27 b(and)h(to)f(allo)n(w)g(the)h +(user)f(to)g(manipulate)g(the)h(data)g(in)f(v)-5 b(arious)27 +b(w)n(a)n(ys)0 942 y Fg(1)37 972 y Fh(When)h(a)f(comp)r(onen)n(t)h(is)f +(sen)n(t)h(across)d(a)i(net)n(w)n(ork,)f(if)j(it)f(is)f(un-encrypted,)g +(it)h(will)g(lo)r(ok)f(something)g(lik)n(e:)p 0 1041 +3900 4 v 0 1218 a Fd(BEGIN:VEVENT)0 1331 y(DTSTAMP:19980309)o(T2)o(310) +o(00)o(Z)0 1445 y(UID:guid-1.host1)o(.c)o(om)0 1558 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 +1672 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 1786 y(MAILTO:employee-)o +(A@h)o(os)o(t.)o(com)0 1899 y(DESCRIPTION:Proj)o(ec)o(t)38 +b(XYZ)k(Review)f(Meeting)0 2013 y(CATEGORIES:MEETI)o(NG)0 +2126 y(CLASS:PUBLIC)0 2240 y(CREATED:19980309)o(T1)o(300)o(00)o(Z)0 +2353 y(SUMMARY:XYZ)e(Project)i(Review)0 2467 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 2581 +y(DTEND;TZID=US-Ea)o(st)o(ern)o(:1)o(99)o(803)o(12)o(T0)o(930)o(00)0 +2694 y(LOCATION:1CP)d(Conference)i(Room)i(4350)0 2808 +y(END:VEVENT)p 0 3008 V 0 3235 a Fc(3.1)112 b(Core)37 +b(iCal)f(classes)0 3446 y Fb(3.1.1)94 b(Comp)s(onen)m(ts)0 +3656 y(3.1.2)g(Prop)s(erties)0 3866 y(3.1.3)g(V)-8 b(alues)0 +4076 y(3.1.4)94 b(P)m(arameters)0 4305 y Fc(3.2)112 b(Other)37 +b(elemen)m(ts)g(of)g(libical)0 4515 y Fh(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 +4628 y(using)j(iCal)g(comp)r(onen)n(ts.)104 4735 y Fa(1)p eop +%%Page: 3 3 +3 2 bop 0 -167 3900 5 v 0 -200 a Fb(4.)73 b(Di\033erences)31 +b(F)-8 b(rom)31 b(RF)m(Cs)2732 b Fh(3)0 162 y Fb(3.2.1)94 +b(En)m(umerations)0 372 y(3.2.2)g(T)m(yp)s(es)0 582 y(3.2.3)g(The)32 +b(P)m(arser)0 792 y(3.2.4)94 b(Restrictions)0 1002 y(3.2.5)g(Error)32 +b(ob)5 b(jects)0 1212 y(3.2.6)94 b(Memory)30 b(Managemen)m(t)0 +1422 y(3.2.7)94 b(Storage)32 b(classes)0 1689 y Fe(4)131 +b(Di\033erences)44 b(F)-11 b(rom)43 b(RF)l(Cs)0 1928 +y Fh(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 2041 y(standards)30 +b(are)g(also)g(k)n(eey)g(ob)5 b(jects)31 b(in)h(the)f(library)-7 +b(.)47 b(Ho)n(w)n(ev)n(er,)30 b(there)h(are)f(a)h(few)g(areas)e(where)i +(the)h(sp)r(eci\034cations)e(are)0 2155 y(\(arguably\))g(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 +2268 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 2560 y Fc(4.1)112 +b(Pseudo)38 b(Comp)s(onen)m(ts)0 2770 y Fh(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 2884 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 2997 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 3111 +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 3224 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 +3338 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 3451 y(with)f(the)g(letter)g +("V,")f(while)g(pseudo)g(comp)r(onen)n(ts)g(start)g(with"X.")0 +3608 y(There)35 b(are)g(also)g(pseudo)h(comp)r(onen)n(ts)f(that)i(are)e +(conceptually)g(deriv)n(ed)g(classess)f(of)i(V)-9 b(ALARM.)37 +b(RF)n(C2446)d(de\034nes)0 3721 y(what)d(prop)r(erties)f(ma)n(y)g(b)r +(e)h(included)g(in)g(eac)n(h)f(comp)r(onen)n(t,)i(and)e(for)h(V)-9 +b(ALARM,)31 b(the)g(set)g(of)g(prop)r(erties)f(it)h(ma)n(y)f(ha)n(v)n +(e)0 3835 y(dep)r(ends)e(on)f(the)h(v)-5 b(alue)28 b(of)f(the)h(A)n +(CTION)f(prop)r(ert)n(y)-7 b(.)0 3992 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 4105 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 4219 y(ha)n(v)n(e)26 +b(a)i(DESCRIPTION)g(prop)r(ert)n(y)-7 b(.)0 4375 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 4489 y(DIO)n(ALARM,)28 +b(XDISPLA)-7 b(Y)g(ALARM,)30 b(XEMAILALARM)f(and)f(XPR)n(OCEDUREALARM.) +0 4780 y Fc(4.2)112 b(Com)m(bined)37 b(V)-9 b(alues)0 +4990 y Fh(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 +5104 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 +5217 y(asso)r(ciated)26 b(with)i(a)f(prop)r(ert)n(y)-7 +b(.)0 5374 y(It)30 b(is)g(natural)g(to)f(ha)n(v)n(e)g(in)n(terfaces)g +(that)i(w)n(ould)e(return)h(the)g(v)-5 b(alue)30 b(of)g(a)g(prop)r(ert) +n(y)-7 b(,)29 b(but)i(it)f(is)g(cum)n(b)r(ersone)f(for)h(a)g(single)0 +5488 y(routine)i(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 +5601 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 +5715 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.)p eop %%Page: 4 4 -4 3 bop 0 -167 3900 5 v 0 -200 a Fa(6.)73 b(Using)32 -b(libical)3190 b Fg(4)0 162 y Fa(6.1.1)94 b(Constructor)32 -b(In)m(terfaces)0 372 y Fg(Using)d(constructor)f(in)n(terfaces,)h(y)n +4 3 bop 0 -167 3900 5 v 0 -200 a Fb(5.)73 b(Implemen)m(tation)29 +b(Limitations)2539 b Fh(4)0 162 y Fc(4.3)112 b(Multi-V)-9 +b(alued)36 b(Prop)s(erties)0 372 y Fh(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 485 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 599 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 712 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 826 y(That)c(is,)f(an)g(input)i(line)e(lik)n(e,)0 +1035 y Fd(CATEGORIES:)39 b(work,)i(home)0 1357 y Fh(b)r(ecomes)27 +b(in)h(libical's)f(in)n(ternal)g(represen)n(tation)0 +1566 y Fd(CATEGORIES:)39 b(work)0 1680 y(CATEGORIES:)g(home)0 +2002 y Fh(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 2116 +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 +2229 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 +2343 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 2676 +y Fe(5)131 b(Implemen)l(tation)44 b(Limitations)0 2971 +y(6)131 b(Using)44 b(libical)0 3229 y Fc(6.1)112 b(Creating)37 +b(Comp)s(onen)m(ts)0 3439 y Fh(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 +3553 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 3820 y Fb(6.1.1)94 b(Constructor)32 +b(In)m(terfaces)0 4030 y Fh(Using)d(constructor)f(in)n(terfaces,)h(y)n (ou)f(create)h(eac)n(h)f(of)i(the)f(ob)5 b(jects)29 b(sep)r(erately)g -(and)g(them)h(assem)n(ble)e(them)i(in)g(to)f(com-)0 485 -y(p)r(onen)n(ts:)p 0 555 3900 4 v 0 738 a Fc(event)41 -b(=)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 852 y(icalcomponent_ad)o(d_)o(pro)o(pe)o(rt)o(y\(e)o(ve)o -(nt)o(,)38 b(icalproperty_ne)o(w_)o(dts)o(ta)o(mp)o(\(at)o(im)o(e\))f -(\);)0 965 y(icalcomponent_ad)o(d_)o(pro)o(pe)o(rt)o(y\(e)o(ve)o(nt)o -(,ic)o(al)o(pr)o(ope)o(rt)o(y_)o(new)o(_u)o(id\()o(st)o(rd)o(up\()o("g) -o(ui)o(d-1)o(.h)o(os)o(t1.)o(co)o(m")o(\)\))g(\);)0 1079 -y(property=icalpro)o(pe)o(rty)o(_n)o(ew)o(_or)o(ga)o(ni)o(zer)o(\(s)o -(tr)o(dup)o(\(")o(mr)o(big)o(@h)o(ost)o(.c)o(om)o("\)\))o(;)0 -1192 y(icalproperty_add)o(_p)o(ara)o(me)o(te)o(r\(p)o(ro)o(pe)o(rty)o -(,i)o(ca)o(lpa)o(ra)o(me)o(ter)o(_n)o(ew_)o(ro)o(le)o(\(IC)o(AL)o(_R)o -(OLE)o(_C)o(HA)o(IR\))g(\);)0 1306 y(icalcomponent_ad)o(d_)o(pro)o(pe)o -(rt)o(y\(e)o(ve)o(nt)o(,pr)o(op)o(er)o(ty\))o(;)p 0 1506 -V 0 1722 a Fa(6.1.2)94 b(v)-5 b(aargs)32 b(Constructors)0 -1932 y(6.1.3)94 b(P)m(arsing)32 b(T)-8 b(ext)32 b(Files)0 -2161 y Fb(6.2)112 b(A)m(ccessing)37 b(Comp)s(onen)m(ts)0 -2371 y Fa(6.2.1)94 b(Finding)30 b(Comp)s(onen)m(ts)0 -2582 y(6.2.2)94 b(Remo)m(ving)29 b(Comp)s(onen)m(ts)0 -2792 y Fg(Remo)n(ving)23 b(an)h(elemen)n(t)h(from)f(a)g(list)g(while)h +(and)g(them)h(assem)n(ble)e(them)i(in)g(to)f(com-)0 4143 +y(p)r(onen)n(ts:)p 0 4201 3900 4 v 0 4346 a Fd(icalcomponent)38 +b(*event;)0 4460 y(icalproperty)g(*prop;)0 4574 y(icalparameter)g +(*param;)0 4687 y(struct)j(icaltimetype)e(atime;)0 4801 +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 4914 y(prop)e(=)h(icalproperty_new)o(_d)o(tst)o +(am)o(p\()o(ati)o(me)o(\))37 b(;)0 5028 y(icalcomponent_ad)o(d_)o(pro)o +(pe)o(rt)o(y\(e)o(ve)o(nt)o(,)h(prop\);)0 5141 y(prop)k(=)h +(icalproperty_new)o(_u)o(id\()o(st)o(rd)o(up\()o("g)o(ui)o(d-1)o(.h)o +(os)o(t1.)o(co)o(m"\))o(\))37 b(\);)0 5255 y(icalcomponent_ad)o(d_)o +(pro)o(pe)o(rt)o(y\(e)o(ve)o(nt)o(,pr)o(op)o(\);)0 5369 +y(prop=icalpropert)o(y_)o(new)o(_o)o(rg)o(ani)o(ze)o(r\()o(str)o(du)o +(p\()o("mr)o(bi)o(g@)o(hos)o(t.)o(com)o("\))o(\);)0 5482 +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 5596 y(icalproperty_add)o(_p)o(ara)o(me)o(te)o +(r\(p)o(ro)o(p,)37 b(param\);)0 5709 y(icalcomponent_ad)o(d_)o(pro)o +(pe)o(rt)o(y\(e)o(ve)o(nt)o(,pr)o(op)o(\);)p eop +%%Page: 5 5 +5 4 bop 0 -167 3900 5 v 0 -200 a Fb(6.)73 b(Using)32 +b(libical)3190 b Fh(5)p 0 162 3900 4 v 0 312 a(While)31 +b(w)n(e)g(are)f(on)h(this)g(example,)g(y)n(ou)g(should)f(notice)h(that) +g(libical)g(uses)g(a)f(semi-ob)5 b(ject-orien)n(ted)29 +b(st)n(yle)i(of)g(in)n(terface.)0 425 y(Most)23 b(things)h(y)n(ou)f(w)n +(ork)g(with)h(are)f(ob)5 b(jects,)24 b(that)g(are)f(instan)n(tiated)g +(with)h(a)g(constructor)e(that)i(has)f("new")g(in)h(the)g(name.)0 +539 y(Also)h(note)h(that,)g(other)f(than)h(the)g(ob)5 +b(ject)26 b(reference,)f(most)g(structure)g(data)g(is)h(passed)f(in)h +(to)f(libical)h(routines)f(b)n(y)g(v)-5 b(alue.)0 652 +y(Strings,)24 b(of)g(course,)f(are)g(passed)g(in)h(b)n(y)g(reference,)f +(but)i(libical)f(will)g(tak)n(e)f(o)n(wnership)f(of)i(the)g(memory)-7 +b(,)24 b(so)f(y)n(ou)g(had)h(b)r(eter)0 766 y(strdup\(\))30 +b(the)f(data)g(unless)g(y)n(ou)f(w)n(an)n(t)h(a)f(core)g(dump)i(when)f +(the)h(memory)e(is)h(freed)g(for)g(the)g(second)g(time.)42 +b(Libical)29 b(has)0 879 y(some)e(complex)g(but)h(v)n(ery)f(regular)e +(memory)i(handling)g(rules.)37 b(These)27 b(are)f(detailed)i(in)g +(section)f(6.4)g(\(\).)0 1036 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 1149 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 1263 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 1377 +y(ab)r(ort)27 b(b)n(y)g(default.)0 1649 y Fb(6.1.2)94 +b(v)-5 b(aargs)32 b(Constructors)0 1859 y Fh(There)24 +b(is)h(another)f(w)n(a)n(y)g(to)h(create)f(complex)g(comp)r(onen)n(ts,) +h(whic)n(h)g(is)g(arguable)e(more)h(elegan)n(t,)h(if)g(y)n(ou)f(are)g +(not)h(horri\034ed)0 1973 y(b)n(y)f(v)-5 b(arargs.)33 +b(The)24 b(v)-5 b(arargs)22 b(constructor)g(in)n(terface)i(all)g(y)n +(ou)f(to)h(create)f(in)n(tricate)h(comp)r(onen)n(ts)f(in)i(a)e(single)h +(blo)r(c)n(k)g(of)g(text.)p 0 2042 V 174 2219 a Fd(calendar)40 +b(=)349 2332 y(icalcomponent_v)o(an)o(ew\()523 2446 y(ICAL_VCALENDAR_C) +o(OM)o(PO)o(NEN)o(T,)523 2560 y(icalproperty_new)o(_v)o(er)o(sio)o(n\() +o(st)o(rdu)o(p\()o("2)o(.0")o(\)\))o(,)523 2673 y(icalproperty_new)o +(_p)o(ro)o(did)o(\(s)o(tr)o(dup)o(\(")o(-/)o(/RD)o(U)d +(Software//NONSGML)g(HandCal//EN"\)\),)523 2787 y(icalcomponent_va)o +(ne)o(w\()697 2900 y(ICAL_VEVENT_COMP)o(ONE)o(NT)o(,)697 +3014 y(icalproperty_new)o(_dt)o(st)o(am)o(p\(a)o(ti)o(me)o(\),)697 +3127 y(icalproperty_new)o(_ui)o(d\()o(st)o(rdu)o(p\()o("g)o(uid)o(-1)o +(.ho)o(st)o(1.)o(com)o("\))o(\),)697 3241 y(icalproperty_van)o(ew_)o +(or)o(ga)o(niz)o(er)o(\()872 3355 y(strdup\("mrbig@h)o(os)o(t.)o(com)o +("\))o(,)872 3468 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 3582 y(0)872 3695 y(\),)697 +3809 y(icalproperty_van)o(ew_)o(at)o(te)o(nde)o(e\()872 +3922 y(strdup\("employe)o(e-)o(A@)o(hos)o(t.)o(co)o(m"\))o(,)872 +4036 y(icalparameter_n)o(ew)o(_r)o(ole)o(\(I)o(CA)o(L_R)o(OL)o(E_R)o +(EQ)o(PA)o(RTI)o(CI)o(PA)o(NT\))o(,)872 4150 y(icalparameter_n)o(ew)o +(_r)o(svp)o(\(1)o(\),)872 4263 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 4377 +y(0)872 4490 y(\),)697 4604 y(icalproperty_new)o(_lo)o(ca)o(ti)o(on\()o +(st)o(rd)o(up\()o("1)o(CP)g(Conference)i(Room)j(4350"\)\),)697 +4717 y(0)697 4831 y(\),)523 4945 y(0)523 5058 y(\);)p +0 5258 V 0 5408 a Fh(This)23 b(form)g(is)h(similar)e(to)i(the)f +(regular)f(constructor,)h(except)g(that)h(they)f(ha)n(v)n(e)g("v)-5 +b(anew")22 b(instead)h(of)g("new")g(in)g(the)h(name.)0 +5522 y(The)32 b(argumen)n(ts)f(are)g(similar)g(to)r(o,)j(except)e(that) +g(the)h(comp)r(onen)n(t)e(con)n(tstructor)g(can)h(ha)n(v)n(e)f(a)g +(list)i(of)f(prop)r(erties,)g(and)0 5635 y(the)f(prop)r(ert)n(y)f +(constructor)f(can)h(ha)n(v)n(e)f(a)i(list)g(or)f(parameters.)44 +b(Be)30 b(sure)g(to)h(terminate)g(ev)n(ery)e(list)i(with)g(a)f('0',)i +(or)d(y)n(our)0 5749 y(co)r(de)e(will)h(crash,)f(if)h(y)n(ou)e(are)h +(luc)n(ky)-7 b(.)p eop +%%Page: 6 6 +6 5 bop 0 -167 3900 5 v 0 -200 a Fb(6.)73 b(Using)32 +b(libical)3190 b Fh(6)0 162 y Fb(6.1.3)94 b(P)m(arsing)32 +b(T)-8 b(ext)32 b(Files)0 372 y Fh(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 +485 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 725 y Fd(icalcomponent*)38 b(icalparser_pars)o(e_)o(str) +o(in)o(g\()o(cha)o(r*)f(str\);)0 1078 y Fh(This)30 b(ma)n(y)f(seem)g(w) +n(asteful)h(if)g(y)n(ou)f(w)n(an)n(t)g(to)g(pull)i(a)e(large)f(comp)r +(onen)n(t)i(o\033)f(of)h(the)g(net)n(w)n(ork;)g(y)n(ou)f(ma)n(y)g +(prefer)g(to)g(parse)0 1191 y(the)f(comp)r(onen)n(t)f(line)h(b)n(y)f +(line.)37 b(This)28 b(is)f(p)r(ossible)g(to)r(o)h(b)n(y)f(using:)0 +1431 y Fd(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 1545 y(icalparser_add_l)o(in)o(e\(p)o(ar)o(se)o(r,l)o +(in)o(e\))o(;)0 1658 y(icalparser_set_g)o(en)o(_da)o(ta)o(\(p)o(ars)o +(er)o(,s)o(tre)o(am)o(\))0 2011 y Fh(F)-7 b(or)27 b(an)g(example)g(of)h +(ho)n(w)f(to)g(use)h(this)f(t)n(yp)r(e)h(of)g(parsing,)e(see)h +(examples/parse_text.c)e(for)i(an)g(example.)0 2303 y +Fc(6.2)112 b(A)m(ccessing)37 b(Comp)s(onen)m(ts)0 2513 +y Fh(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 2626 y(inside.)35 +b(Libical)22 b(in)n(terface)g(let)h(y)n(ou)e(\034nd)i(sub-comp)r(onen)n +(t,)g(add)f(and)g(remo)n(v)n(e)f(sub-comp)r(onen)n(ts,)h(and)h(do)f +(the)h(same)e(three)0 2740 y(op)r(erations)26 b(on)h(prop)r(erties.)0 +3013 y Fb(6.2.1)94 b(Finding)30 b(Comp)s(onen)m(ts)0 +3223 y Fh(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 3462 y Fd(icalproperty*)38 +b(icalcomponent_ge)o(t_)o(fir)o(st)o(_c)o(omp)o(on)o(en)o(t\()1482 +3576 y(icalcomponent*)f(component,)1482 3689 y(icalcomponent_k)o(in)o +(d)h(kind\);)0 4042 y Fh(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 4156 y(icalen)n(ums.h)f(are:)p 0 4209 +3900 4 v 0 4386 a Fd(ICAL_ANY_COMPONE)o(NT)0 4499 y(ICAL_VEVENT_COMP)o +(ON)o(ENT)0 4613 y(ICAL_VTODO_COMPO)o(NE)o(NT)0 4726 +y(ICAL_VJOURNAL_CO)o(MP)o(ONE)o(NT)0 4840 y(ICAL_VCALENDAR_C)o(OM)o +(PON)o(EN)o(T)0 4954 y(ICAL_VFREEBUSY_C)o(OM)o(PON)o(EN)o(T)0 +5067 y(ICAL_VALARM_COMP)o(ON)o(ENT)p 0 5267 V 0 5417 +a Fh(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 +5573 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 5687 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.)p eop +%%Page: 7 7 +7 6 bop 0 -167 3900 5 v 0 -200 a Fb(6.)73 b(Using)32 +b(libical)3190 b Fh(7)0 162 y Fb(6.2.2)94 b(In)m(terating)32 +b(Through)g(Comp)s(onen)m(ts)0 372 y Fh(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:)0 611 y Fd(icalcomponent*)38 +b(icalcomponent_g)o(et)o(_ne)o(xt)o(_c)o(omp)o(on)o(en)o(t\(i)o(ca)o +(lco)o(mp)o(on)o(ent)o(*)f(component,)0 725 y(icalcomponent_ki)o(nd)g +(kind\);)0 1078 y Fh(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 +1191 y(p)r(onen)n(ts)p 0 1261 3900 4 v 87 1444 a Fd(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 +1558 y(c)g(!=)g(0;)392 1671 y(c)g(=)g(icalcomponent_get)o(_n)o(ext)o +(_c)o(om)o(pon)o(en)o(t\()o(com)o(p,)o(ICA)o(L_)o(AN)o(Y_C)o(OM)o(PO)o +(NEN)o(T\))o(\))0 1785 y({)261 1899 y(do_something\(c\);)0 +2012 y(})p 0 2212 V 0 2362 a Fh(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 2476 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 +2748 y Fb(6.2.3)94 b(Remo)m(ving)29 b(Comp)s(onen)m(ts)0 +2958 y Fh(Libical)h(comp)r(onen)n(t)g(ha)n(v)n(e)f(in)n(ternal)h +(iterators,)f(so)h(y)n(ou)g(can)g(only)g(ha)n(v)n(e)f(one)h(iteration)g +(o)n(v)n(er)e(a)i(comp)r(onen)n(t)g(at)h(a)f(time.)0 +3072 y(Remo)n(ving)23 b(an)h(elemen)n(t)h(from)f(a)g(list)g(while)h (iterating)e(through)h(the)h(list)f(can)g(cause)g(problems,)g(since)g -(y)n(ou)g(will)g(probably)0 2905 y(b)r(e)e(remo)n(ving)e(the)i(elemen)n +(y)n(ou)g(will)g(probably)0 3185 y(b)r(e)e(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)i(to.)34 b(This)22 b(will)g(result)f(in)h(the)g(iteration)f(lo)r(op)h -(terminating)0 3019 y(immediately)29 b(after)f(remo)n(ving)g(the)h +(terminating)0 3299 y(immediately)29 b(after)f(remo)n(ving)g(the)h (elemen)n(t.)41 b(T)-7 b(o)28 b(a)n(v)n(oid)g(the)h(problem,)f(y)n(ou)h (will)g(need)g(to)f(step)h(the)h(iterator)d(ahead)h(of)0 -3132 y(the)g(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:)p 0 3202 V 0 3385 a Fc(for\(c)41 b(=)j +3413 y(the)g(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:)p 0 3482 V 0 3665 a Fd(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 -3499 y(c)f(!=)g(0;)305 3612 y(c)g(=)g(next)0 3726 y({)174 -3839 y(next)f(=)h(icalcomponent_get)o(_n)o(ex)o(t_c)o(om)o(po)o(nen)o +3779 y(c)f(!=)g(0;)305 3893 y(c)g(=)g(next)0 4006 y({)174 +4120 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 3953 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 4067 y(})p -0 4267 V eop -%%Page: 5 5 -5 4 bop 0 -167 3900 5 v 0 -200 a Fa(6.)73 b(Using)32 -b(libical)3190 b Fg(5)0 162 y Fa(6.2.3)94 b(Finding)30 -b(Prop)s(erties)0 372 y(6.2.4)94 b(Remo)m(ving)29 b(Prop)s(erties)0 -582 y(6.2.5)94 b(Getting)31 b(V)-8 b(alues)0 792 y(6.2.6)94 -b(Setting)31 b(V)-8 b(alues)0 1002 y(6.2.7)94 b(Getting)31 -b(P)m(arameters)0 1212 y(6.2.8)94 b(Setting)31 b(P)m(arameters)0 -1422 y(6.2.9)94 b(Remo)m(ving)29 b(P)m(arameters)0 1632 -y(6.2.10)93 b(Chec)m(king)32 b(Comp)s(onen)m(t)e(V)-8 -b(alidit)m(y)0 1861 y Fb(6.3)112 b(Storing)37 b(Ob)6 -b(jects)0 2071 y Fg(The)27 b(libical)g(distribution)h(inclues)f(a)g -(sep)r(erate)f(library)-7 b(,)26 b(libicalss,)h(that)g(allo)n(ws)f(y)n -(ou)g(to)i(store)e(iCal)h(comp)r(onen)n(t)g(data)f(to)0 -2185 y(disk)h(in)h(a)f(v)-5 b(ariet)n(y)27 b(of)h(w)n(a)n(ys.)35 -b(This)27 b(library)g(is)g(do)r(cumen)n(ted)h(sep)r(erately)-7 -b(.)0 2476 y Fb(6.4)112 b(Memory)37 b(Managemen)m(t)0 -2686 y Fg(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 2800 y(Some)34 b(of)f(this)h(memory)f(the)h(library)f +(NT\))o(;)174 4233 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 4347 y(})p +0 4547 V 0 4763 a Fb(6.2.4)94 b(W)-8 b(orking)31 b(with)g(prop)s +(erties)g(and)h(parameters)0 4973 y Fh(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 +5087 y(sp)r(eci\034c)c(or)e(parameter-sp)r(eci\034c)g(in)n(terfaces:)0 +5326 y Fd(icalproperty*)38 b(icalcomponent_ge)o(t_)o(fir)o(st)o(_p)o +(rop)o(er)o(ty)o(\()218 5440 y(icalcomponent*)g(component,)218 +5553 y(icalproperty_kin)o(d)f(kind\);)0 5667 y(icalproperty*)h +(icalcomponent_ge)o(t_)o(nex)o(t_)o(pr)o(ope)o(rt)o(y\()218 +5780 y(icalcomponent*)g(component,)p eop +%%Page: 8 8 +8 7 bop 0 -167 3900 5 v 0 -200 a Fb(6.)73 b(Using)32 +b(libical)3190 b Fh(8)218 162 y Fd(icalproperty_kin)o(d)37 +b(kind\);)0 275 y(void)42 b(icalcomponent_ad)o(d_)o(pr)o(ope)o(rt)o +(y\()218 389 y(icalcomponent*)c(component,)218 502 y(icalproperty*)g +(property\);)0 616 y(void)k(icalcomponent_re)o(mo)o(ve)o(_pr)o(op)o(er) +o(ty\()218 730 y(icalcomponent*)c(component,)218 843 +y(icalproperty*)g(property\);)0 957 y(icalparameter*)g(icalproperty_ge) +o(t_)o(fir)o(st)o(_p)o(ara)o(me)o(te)o(r\()218 1070 y(icalproperty*)g +(prop,)218 1184 y(icalparameter_ki)o(nd)f(kind\);)0 1297 +y(icalparameter*)h(icalproperty_ge)o(t_)o(nex)o(t_)o(pa)o(ram)o(et)o +(er)o(\()218 1411 y(icalproperty*)g(prop,)218 1525 y(icalparameter_ki)o +(nd)f(kind\);)0 1638 y(void)42 b(icalproperty_add)o(_p)o(ar)o(ame)o(te) +o(r\()218 1752 y(icalproperty*)c(prop,)218 1865 y(icalparameter*)g +(parameter\);)0 1979 y(void)k(icalproperty_rem)o(ov)o(e_)o(par)o(am)o +(et)o(er\()218 2092 y(icalproperty*)c(prop,)218 2206 +y(icalparameter_ki)o(nd)f(kind\);)0 2589 y Fb(6.2.5)94 +b(Getting)31 b(V)-8 b(alues)0 2799 y(6.2.6)94 b(Setting)31 +b(V)-8 b(alues)0 3009 y(6.2.7)94 b(Getting)31 b(P)m(arameters)0 +3219 y(6.2.8)94 b(Setting)31 b(P)m(arameters)0 3429 y(6.2.9)94 +b(Remo)m(ving)29 b(P)m(arameters)0 3639 y(6.2.10)93 b(Chec)m(king)32 +b(Comp)s(onen)m(t)e(V)-8 b(alidit)m(y)0 3868 y Fc(6.3)112 +b(Storing)37 b(Ob)6 b(jects)0 4078 y Fh(The)27 b(libical)g +(distribution)h(inclues)f(a)g(sep)r(erate)f(library)-7 +b(,)26 b(libicalss,)h(that)g(allo)n(ws)f(y)n(ou)g(to)i(store)e(iCal)h +(comp)r(onen)n(t)g(data)f(to)0 4192 y(disk)h(in)h(a)f(v)-5 +b(ariet)n(y)27 b(of)h(w)n(a)n(ys.)35 b(This)27 b(library)g(is)g(do)r +(cumen)n(ted)h(sep)r(erately)-7 b(.)36 b(\()28 b(&)f(curren)n(tly)-7 +b(,)27 b(not)g(at)h(all.)36 b(\))0 4480 y Fc(6.4)112 +b(Memory)37 b(Managemen)m(t)0 4690 y Fh(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 4804 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 2914 y(library)-7 +(memory)f(is)h(managed)e(b)n(y)i(the)0 4917 y(library)-7 b(.)36 b(Here)27 b(is)g(a)g(summary)g(of)h(the)g(memory)e(rules.)0 -3153 y Fa(1\))208 3300 y Fg(If)k(the)g(function)g(name)g(has)f -Fc(")p Fg(new)p Fc(")g Fg(in)h(it,)h(the)f(caller)f(gets)g(con)n(trol)g +5138 y Fb(1\))208 5281 y Fh(If)k(the)g(function)g(name)g(has)f +Fd(")p Fh(new)p Fd(")g Fh(in)h(it,)h(the)f(caller)f(gets)g(con)n(trol)g (of)h(the)g(memory)-7 b(.)42 b(\()31 b(suc)n(h)e(as)g(icalcomp)r(onen-) -208 3413 y(t_new\(\),)f(or)e(icalprop)r(ert)n(y_new_clone\(\))f(\))0 -3593 y Fa(2\))208 3740 y Fg(If)j(y)n(ou)g(got)g(the)h(memory)f(from)g +208 5394 y(t_new\(\),)f(or)e(icalprop)r(ert)n(y_new_clone\(\))f(\))0 +5566 y Fb(2\))208 5709 y Fh(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 3854 y(to)f(free)g(the)h +(corresp)r(onding)d(*_free)i(routine)208 5823 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 4034 y Fa(3\))208 4181 y Fg(If)h(the)g(function)g(name)f -(has)g Fc(")p Fg(add)p Fc(")g Fg(in)h(it,)g(the)g(caller)e(is)i -(transfering)e(con)n(trol)g(of)i(the)g(memory)f(to)g(the)h(routine.)40 -b(\()208 4294 y(icalprop)r(ert)n(y_add_parameter\(\))23 -b(\))0 4474 y Fa(4\))208 4621 y Fg(If)29 b(the)h(function)g(name)f(has) -g Fc(")p Fg(remo)n(v)n(e)p Fc(")e Fg(in)j(it,)g(the)g(caller)f(passes)f -(in)i(a)f(p)r(oin)n(ter)g(to)g(an)g(ob)5 b(ject)29 b(and)h(after)f(the) -g(call)208 4735 y(returns,)j(the)h(caller)e(o)n(wns)g(the)h(ob)5 +(t_new\(\)\))p eop +%%Page: 9 9 +9 8 bop 0 -167 3900 5 v 0 -200 a Fb(6.)73 b(Using)32 +b(libical)3190 b Fh(9)0 162 y Fb(3\))208 307 y Fh(If)29 +b(the)g(function)g(name)f(has)g Fd(")p Fh(add)p Fd(")g +Fh(in)h(it,)g(the)g(caller)e(is)i(transfering)e(con)n(trol)g(of)i(the)g +(memory)f(to)g(the)h(routine.)40 b(\()208 420 y(icalprop)r(ert)n +(y_add_parameter\(\))23 b(\))0 596 y Fb(4\))208 741 y +Fh(If)29 b(the)h(function)g(name)f(has)g Fd(")p Fh(remo)n(v)n(e)p +Fd(")e Fh(in)j(it,)g(the)g(caller)f(passes)f(in)i(a)f(p)r(oin)n(ter)g +(to)g(an)g(ob)5 b(ject)29 b(and)h(after)f(the)g(call)208 +855 y(returns,)j(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 4848 -y(y)n(ou)26 b(do)i(not)f(o)n(wn)g Fc(")p Fg(fo)r(o)p -Fc(")g Fg(and)g(after)g(the)h(call)f(returns,)g(y)n(ou)g(do.)0 -5028 y Fa(5\))208 5175 y Fg(If)d(the)g(routine)f(returns)g(a)g(string,) +(t_remo)n(v)n(e_prop)r(ert)n(y\(comp,fo)r(o\),)208 968 +y(y)n(ou)26 b(do)i(not)f(o)n(wn)g Fd(")p Fh(fo)r(o)p +Fd(")g Fh(and)g(after)g(the)h(call)f(returns,)g(y)n(ou)g(do.)0 +1145 y Fb(5\))208 1290 y Fh(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 5288 y(Y)-7 +(ring)g(bu\033er)h(to)g(reclaim)f(later.)208 1403 y(Y)-7 b(ou'd)27 b(b)r(etter)h(strdup\(\))g(it)g(if)g(y)n(ou)f(w)n(an)n(t)g (to)h(k)n(eep)f(it,)h(and)f(y)n(ou)g(don't)h(ha)n(v)n(e)e(to)h(delete)h -(it.)0 5580 y Fb(6.5)112 b(Error)36 b(Handling)0 5790 -y Fg(icalerror_errno.)c(Return)c(v)-5 b(alues.)37 b(#de\034nes.)g -(icalerror_stop_here)p eop -%%Page: 6 6 -6 5 bop 0 -167 3900 5 v 0 -200 a Fa(7.)73 b(Useful)32 -b(Recipies)3067 b Fg(6)0 162 y Fa(6.5.1)94 b(Return)31 -b(v)-5 b(alues)0 372 y(6.5.2)94 b(icalerrno)0 582 y(6.5.3)g(Comp)s -(onen)m(t)29 b(errors)0 811 y Fb(6.6)112 b(Naming)36 -b(Standard)0 1021 y Fg(Structures)26 b(that)i(y)n(ou)e(access)f(with)j +(it.)0 1693 y Fc(6.5)112 b(Error)36 b(Handling)0 1903 +y Fh(Libical)27 b(has)g(sev)n(eral)e(error)h(handling)h(mec)n(hanisms)f +(for)h(the)h(v)-5 b(arioust)n(yp)r(es)25 b(of)j(programming,)d(seman)n +(tic)i(and)g(syn)n(tactic)0 2017 y(errors)e(y)n(ou)i(ma)n(y)g(encoun)n +(ter.)0 2288 y Fb(6.5.1)94 b(Return)31 b(v)-5 b(alues)0 +2498 y Fh(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 2611 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 2725 y(icalerroren)n(um.)0 +2996 y Fb(6.5.2)94 b(icalerrno)0 3206 y Fh(Most)23 b(routines)f(will)h +(set)g(the)g(global)f(error)f(v)-5 b(alue)23 b(icalerrno)e(on)h +(errors.)33 b(This)23 b(v)-5 b(ariable)22 b(is)h(an)f(en)n(umeration;)i +(p)r(ermissable)0 3320 y(v)-5 b(alues)21 b(can)h(b)r(e)g(found)g(in)g +(libical/icalerror.h.)32 b(If)22 b(the)g(routine)g(returns)f(an)g(en)n +(um)h(icalerroren)n(um,)f(then)h(the)g(return)f(v)-5 +b(alue)0 3433 y(will)28 b(b)r(e)g(the)g(same)f(as)g(icalerrno.)35 +b(Y)-7 b(ou)27 b(can)g(use)h(icalerror_strerror\(\))22 +b(to)28 b(get)f(a)g(string)g(that)h(describ)r(es)f(the)h(error)0 +3704 y Fb(6.5.3)94 b(X-LIC-ERR)m(OR)0 3914 y Fh(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 4028 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 4141 y(routine)j +(indicates)h(that)f(the)h(comp)r(onen)n(t)g(do)r(es)f(not)h(meet)g(the) +g(requirmen)n(ts)e(of)i(RF)n(C2446)d(\()j(a)g(seman)n(tic)f(error\))f +(the)0 4255 y(library)g(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 4368 y(error)26 +b(prop)r(ert)n(y:)0 4598 y Fd(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.)g(Expected)g(1)k(instances)39 +b(of)k(the)f(property)f(and)h(got)g(0)0 4942 y Fh(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 5056 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 +5212 y(There)g(are)g(a)g(few)h(routines)e(to)i(manipulate)f(error)f +(prop)r(erties:)0 5369 y(Routine)g(Purp)r(ose)g(v)n(oid)f +(icalrestriction_c)n(hec)n(k\(\))e(Chec)n(k)i(a)h(comp)r(onen)n(t)f +(against)g(RF)n(C2446)e(and)j(insert)g(error)d(prop)r(er-)0 +5482 y(ties)e(to)g(indicate)g(an)n(y)f(non-complianes)g(in)n(t)h +(icalcomp)r(onen)n(t_coun)n(t_errors\(\))d(Return)j(the)g(n)n(um)n(b)r +(er)g(of)g(error)e(prop)r(erties)0 5596 y(in)33 b(a)f(comp)r(onen)n(t)h +(v)n(oid)f(icalcomp)r(onen)n(t_strip_errors\(\))d(Remo)n(v)n(e)j(all)g +(error)f(prop)r(erties)h(in)h(a)f(comp)r(onen)n(t)h(v)n(oid)f(ical-)0 +5709 y(comp)r(onen)n(t_con)n(v)n(ert_errors\(\))18 b(Con)n(v)n(ert)k +(some)g(error)f(prop)r(erties)h(in)n(to)h(REQUEST-ST)-7 +b(A)g(TUS)24 b(prop)r(erties)e(to)h(indicate)0 5823 y(the)28 +b(inabilit)n(y)f(to)h(pro)r(cess)e(the)i(comp)r(onen)n(t)f(as)g(an)h +(iTIP)g(request.)p eop +%%Page: 10 10 +10 9 bop 0 -167 3900 5 v 0 -200 a Fb(7.)73 b(Useful)32 +b(Recipies)3026 b Fh(10)0 162 y Fc(6.6)112 b(Naming)36 +b(Standard)0 372 y Fh(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 1134 -y(allo)n(w)n(ed)g(to)i(see)f(inside)g(and)h(p)r(ok)n(e)f(at.)0 -1291 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 1405 y(hidden.)0 1561 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 1675 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 1788 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 1902 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 2058 y(En)n(ums)d(that)f(iden)n(tify)h(a)f(comp)r(onen)n -(t,)h(prop)r(ert)n(y)-7 b(,)24 b(v)-5 b(alue)24 b(or)g(parameter)e(end) -j(with)g("_COMPONENT,")e("_PR)n(OPER-)0 2172 y(TY,")k("_V)-9 -b(ALUE,")28 b(or)e("_P)-7 b(AAMETER"s)0 2328 y(En)n(ums)31 +(yp)r(e")g(are)g(things)h(that)g(y)n(ou)f(are)0 485 y(allo)n(w)n(ed)g +(to)i(see)f(inside)g(and)h(p)r(ok)n(e)f(at.)0 642 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 755 y(hidden.)0 912 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 1025 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 1139 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 +1253 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 +1409 y(En)n(ums)d(that)f(iden)n(tify)h(a)f(comp)r(onen)n(t,)h(prop)r +(ert)n(y)-7 b(,)24 b(v)-5 b(alue)24 b(or)g(parameter)e(end)j(with)g +("_COMPONENT,")e("_PR)n(OPER-)0 1523 y(TY,")k("_V)-9 +b(ALUE,")28 b(or)e("_P)-7 b(ARAMETER"s)0 1679 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 2442 y(ICAL_R)n(OLE_REQP)-7 +(w)n(ord.)45 b(F)-7 b(or)29 b(instance:)0 1793 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 2598 y(The)28 b(en)n(ums)f(for)g(the)h(parts)f(of)g(a)g(recurarance)e +0 1949 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.)0 -2937 y Fd(7)131 b(Useful)44 b(Recipies)0 3175 y Fg(Iteration)0 -3332 y(Cop)n(ying)26 b(comp)r(onen)n(ts.)37 b(Remem)n(b)r(er)27 -b(that)h(y)n(ou)f(m)n(ust)g(clone)g(or)g(remo)n(v)n(e)f(an)h(ob)5 -b(ject)28 b(b)r(efore)f(putting)h(in)g(on)f(anothr)g(list.)0 -3488 y(Finding)h(compliance)f(errors)0 3827 y Fd(8)131 -b(P)l(erformance)0 4065 y Fg(Chec)n(king)27 b(restrictions)f(is)h -(computationally)g(exp)r(ensiv)n(e)0 4404 y Fd(9)131 -b(Hac)l(ks)45 b(and)e(Bugs)p eop +2287 y Fe(7)131 b(Useful)44 b(Recipies)0 2526 y Fh(Iteration)0 +2683 y(Cop)n(ying)24 b(comp)r(onen)n(ts.)36 b(Remem)n(b)r(er)25 +b(that)g(y)n(ou)g(m)n(ust)g(clone)g(or)f(remo)n(v)n(e)g(an)h(ob)5 +b(ject)25 b(b)r(efore)g(putting)h(in)f(on)h(another)e(list.)0 +2839 y(Finding)k(compliance)f(errors)0 3177 y Fe(8)131 +b(P)l(erformance)0 3416 y Fh(Chec)n(king)27 b(restrictions)f(is)h +(computationally)g(exp)r(ensiv)n(e.)0 3754 y Fe(9)131 +b(Hac)l(ks)45 b(and)e(Bugs)0 3993 y Fh(There)22 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(propbably)f(b)r(e)h(c)n +(hanged.)0 4107 y(These)27 b(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 diff --git a/libical/doc/UsingLibical.txt b/libical/doc/UsingLibical.txt index f80ea31121..de803cbfde 100644 --- a/libical/doc/UsingLibical.txt +++ b/libical/doc/UsingLibical.txt @@ -4,7 +4,9 @@ Using Libical Eric Busboom (eric@softwarestudio.org) -January 2000 +May 2000 + +\tableofcontents{} 1 Introduction @@ -13,29 +15,14 @@ and protocol data units. The iCalendar specification describes how calendar clients can communicate with calendar servers for users can store their calendar data and arrange meetings with other users. -Libical implements the following specifications and protocols - -+----------+-------+ -|iCal Core | 2445 | -+----------+-------+ -+----------+-------+ -| iTIP | 2446 | -+----------+-------+ -+----------+-------+ -| iMIP | 2447 | -+----------+-------+ -+----------+-------+ -| iRIP | draft | -+----------+-------+ -+----------+-------+ -| CAP | draft | -+----------+-------+ - - -(The current version, 0.14, does not implement iRip or CAP. ) +Libical implements RFC2445 and RFC2446. Eventually, it will also implement +iRIP and CAP. This documentation assumes that you are familiar with the iCalendar -standards RFC2445 and RFC2446. +standards RFC2445 and RFC2446. these specifications are online on +the CALSCH webpage at: + +http://www.imc.org/ietf-calendar/ 1.1 The libical project @@ -47,14 +34,10 @@ 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 @@ -68,14 +51,18 @@ 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 Purpose & Goals +1.3 Example Code -1.4 Document version - -$Id$ +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 more annotated examples. 2 Building the Library +Libical uses autoconf to generate makefiles, although it uses none +of the autoconf flags to influence the compilation. It should built +with no adjustments on Linux, FreeBSD and Solaris. + 3 Structure The iCal calendar model is based on four types of objects: components, @@ -97,25 +84,68 @@ of a calendar system, such as events or timezones. The central goal of libical is to parse iTIP data into an internal representation of Components, Properties, Parameters an Values, and -to allow the user to manipulate the data in various ways +to allow the user to manipulate the data in various ways ([fig] \includegraphics{icaluml.eps} ) When +a component is sent across a network, if it is un-encrypted, it will +look something like: + +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 + +3.1 Core iCal classes + +3.1.1 Components + +3.1.2 Properties -3.1 Components +3.1.3 Values -3.2 Properties +3.1.4 Parameters -3.3 Values +3.2 Other elements of libical -3.4 Parameters +In addition to the core iCal classes, libical has many other types, +structures, classes that aid in creating and using iCal components. -3.5 Enumerations +3.2.1 Enumerations -3.6 Types +3.2.2 Types -3.7 The Parser +3.2.3 The Parser -3.8 Restrictions +3.2.4 Restrictions -3.9 Memory Management +3.2.5 Error objects + +3.2.6 Memory Management + +3.2.7 Storage classes 4 Differences From RFCs @@ -131,10 +161,13 @@ use by maintaining a self-similar interface. 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. XDAYLIGHT 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, it is a component. +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 classess of VALARM. RFC2446 defines what properties may be included in each @@ -196,42 +229,367 @@ into one. 6.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. + 6.1.1 Constructor Interfaces +Using constructor interfaces, you create each of the objects seperately +and them 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(strdup("guid-1.host1.com")) ); + +icalcomponent_add_property(event,prop); + +prop=icalproperty_new_organizer(strdup("mrbig@host.com")); + +param = icalparameter_new_role(ICAL_ROLE_CHAIR) + +icalproperty_add_parameter(prop, param); + +icalcomponent_add_property(event,prop); + +While we are on this example, you should 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. Strings, +of course, are passed in by reference, but libical will take ownership +of the memory, so you had beter strdup() the data unless you want +a core dump when the memory is freed for the second time. Libical +has some complex but very regular memory handling rules. These are +detailed in section \ref{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. + 6.1.2 vaargs Constructors +There is another way to create complex components, which is arguable +more elegant, if you are not horrified by varargs. The varargs constructor +interface all you to create intricate components in a single block +of text. + + calendar = + + icalcomponent_vanew( + + ICAL_VCALENDAR_COMPONENT, + + icalproperty_new_version(strdup("2.0")), + + icalproperty_new_prodid(strdup("-//RDU Software//NONSGML HandCal//EN")), + + icalcomponent_vanew( + + ICAL_VEVENT_COMPONENT, + + icalproperty_new_dtstamp(atime), + + icalproperty_new_uid(strdup("guid-1.host1.com")), + + icalproperty_vanew_organizer( + + strdup("mrbig@host.com"), + + icalparameter_new_role(ICAL_ROLE_CHAIR), + + 0 + + ), + + icalproperty_vanew_attendee( + + strdup("employee-A@host.com"), + + icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT), + + icalparameter_new_rsvp(1), + + icalparameter_new_cutype(ICAL_CUTYPE_GROUP), + + 0 + + ), + + icalproperty_new_location(strdup("1CP Conference Room 4350")), + + 0 + + ), + + 0 + + ); + +This form is similar to the regular constructor, except that they have +``vanew'' instead of ``new'' in the name. The arguments are similar +too, except that the component contstructor can have a list of properties, +and the property constructor can have a list or parameters. Be sure +to terminate every list with a '0', or your code will crash, if you +are lucky. + 6.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); + +This may seem wasteful if you want to pull a large component off of +the network; 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. 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(). + +Using the same mechanism, other implmentations 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 convienience 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 +cmponents 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. See section +6.2.2 for how to iterate through the child components. + 6.2 Accessing Components +Given a reference to a component, you probably will want to access +the properties, parameters and values inside. Libical interface let +you find sub-component, add and remove sub-components, and do the +same three operations on properties. + 6.2.1 Finding Components -6.2.2 Removing 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. + +6.2.2 Interating Through Components + +Iteration requires a second routine to get the next subcomponent after +the first: + +icalcomponent* icalcomponent_get_next_component( -Removing an element from a list while iterating through the list can -cause problems, since you will probably be removing the element that -the internal iterator points to. This will result in the iteration -loop terminating immediately after removing the element. To avoid -the problem, you will need to step the iterator ahead of the element -you are going to remove, like this: + icalcomponent* component, icalcomponent_kind kind); -for(c = icalcomponent_get_first_component(s); +With the 'first' and 'next' routines, you can create a for loop to +iterate through all of a components subcomponents - c != 0; + for(c = icalcomponent_get_first_component(comp,ICAL_ANY_COMPONENT); - c = next) + c != 0; + + c = icalcomponent_get_next_component(comp,ICAL_ANY_COMPONENT)) { - next = icalcomponent_get_next_component(s); + 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. + +6.2.3 Removing Components + +Libical component have internal iterators, so you can only have one +iteration over a component at a time. Removing an element from a list +while iterating through the list can cause problems, since you will +probably be removing the element that the internal iterator points +to. This will result in the iteration loop terminating immediately +after removing the element. 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); - icalcomponent_remove_component(s,c); + c != 0; + + c = next + +{ + + next = icalcomponent_get_next_component(parent_comp,ICAL_ANY_COMPONENT); + + icalcomponent_remove_component(parent_comp,c); } -6.2.3 Finding Properties +6.2.4 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); + +icalparameter* icalproperty_get_first_parameter( + + icalproperty* prop, -6.2.4 Removing Properties + 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); 6.2.5 Getting Values @@ -245,15 +603,65 @@ for(c = icalcomponent_get_first_component(s); 6.2.10 Checking Component Validity +RFC 2446 defines rules for what properties must exist in a component +to be used for transfering scheduling data. Most of these rules relate +to the existence of properties relative to the METHOD property, which +declares what operation a remote reciever 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 reciever to join in +a meeting. I this case, RFC2446 says that the component must specify +a start time (DTSTART) and list the reciever 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. + +6.2.11 Converting Components to Text + +To create an RFC2445 compliant text representtion 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 ``\r\n'' However, if you compile with the +symbol ICAL_UNIX_NEWLINE defined, it will terminate lines with ``\n'' + +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. + 6.3 Storing Objects The libical distribution inclues a seperate library, libicalss, that allows you to store iCal component data to disk in a variety of ways. -This library is documented seperately. +This library is documented seperately. ( & currently, not at all. +) -6.4 Memory Management +6.4 \label{sec:memory}Memory Management -Here are the memory rules for the library: +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() @@ -272,16 +680,99 @@ Here are the memory rules for the library: 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. You'd better strdup it - if you want to keep it, and you don't have to delete it. + put it on a ring buffer to reclaim later. You'd better strdup() + it if you want to keep it, and you don't have to delete it. 6.5 Error Handling +Libical has several error handling mechanisms for the varioustypes +of programming, semantic and syntactic errors you may encounter. + 6.5.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. + 6.5.2 icalerrno -6.5.3 Component errors +Most routines will set the global error value icalerrno on errors. +This variable is an enumeration; permissable 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 + +6.5.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 requirments +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: + ++------------------------------------+--------------------------------+ +|Routine | Purpose | ++------------------------------------+--------------------------------+ ++------------------------------------+--------------------------------+ +|void icalrestriction_check() | Check a component against | +| | RFC2446 and insert error prop | +| | erties to indicate non compli | +| | ance | +|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 to indi | +| | cate the inability to process | +| | the component as an iTIP re | +| | quest. | ++------------------------------------+--------------------------------+ +| | | ++------------------------------------+--------------------------------+ + + +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 +ina 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. 6.6 Naming Standard @@ -299,4 +790,30 @@ 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. -7 Hacks and Bugs +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. + +7 Useful Recipies + +Iteration + +Copying components. Remember that you must clone or remove an object +before putting in on another list. + +Finding compliance errors + +8 Performance + +Checking restrictions is computationally expensive. + +9 Hacks and Bugs + +There are a lot of hacks in the library -- bits of code that I am not +proud of and should propbably be changed. These are marked with the +comment string ``HACK.'' diff --git a/libical/scripts/mkderivedvalues.pl b/libical/scripts/mkderivedvalues.pl index ca2ee4b3a1..103c54a8e2 100755 --- a/libical/scripts/mkderivedvalues.pl +++ b/libical/scripts/mkderivedvalues.pl @@ -179,6 +179,14 @@ icalvalue_set_${lc}(icalvalue* value, $type v) icalerror_check_value_type(value, ICAL_${uc}_VALUE); impl = (struct icalvalue_impl*)value; +EOM + +if( ${union_data} eq 'string'){ +print" if(impl->data.v_${union_data}!=0) {free(impl->data.v_${union_data});}\n"; +} + +print <<EOM; + impl->data.v_${union_data} = $assign } diff --git a/libical/src/Makefile.am b/libical/src/Makefile.am index 37dc5e39cb..4edf2a1d14 100644 --- a/libical/src/Makefile.am +++ b/libical/src/Makefile.am @@ -1 +1 @@ -SUBDIRS = libical libicalss test +SUBDIRS = libical libicalss libicalvcal test diff --git a/libical/src/libical/Makefile.am b/libical/src/libical/Makefile.am index d9af51bccd..35a08effc7 100644 --- a/libical/src/libical/Makefile.am +++ b/libical/src/libical/Makefile.am @@ -30,9 +30,16 @@ libical_a_SOURCES = \ icaltypes.h \ icalvalue.c \ icalvalue.h \ - icalvcal.h \ + icalrecur.c \ + icalrecur.h \ + icaltime.h \ + icaltime.c \ pvl.c \ - pvl.h + pvl.h \ + sspm.c \ + sspm.h \ + icalmime.c \ + icalmime.h include_HEADERS=\ ical.h \ @@ -46,9 +53,12 @@ include_HEADERS=\ icalrestriction.h \ icaltypes.h \ icalvalue.h \ - icalvcal.h \ + icalrecur.h \ icalversion.h \ - pvl.h + icaltime.h \ + pvl.h \ + sspm.h \ + icalmime.h # diff --git a/libical/src/libical/ical.h b/libical/src/libical/ical.h index d0f33cd1a1..05e7ca82bc 100644 --- a/libical/src/libical/ical.h +++ b/libical/src/libical/ical.h @@ -4,20 +4,19 @@ 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 + (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 ical.h ======================================================================*/ @@ -36,6 +35,14 @@ #include "icalmemory.h" #include "icalerror.h" #include "icalrestriction.h" +#include "icaltime.h" +#include "icalrecur.h" + +#ifdef DMALLOC +#include "dmalloc.h" +#endif + + #endif /* !ICAL_H */ diff --git a/libical/src/libical/icalcomponent.c b/libical/src/libical/icalcomponent.c index bd2b13189c..52c2088140 100644 --- a/libical/src/libical/icalcomponent.c +++ b/libical/src/libical/icalcomponent.c @@ -1,25 +1,22 @@ -/* -*- Mode: C -*- */ /*====================================================================== FILE: icalcomponent.c CREATOR: eric 28 April 1999 $Id$ + (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - (C) COPYRIGHT 1999 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 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 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 author is Eric Busboom The original code is icalcomponent.c ======================================================================*/ @@ -154,6 +151,7 @@ icalcomponent* icalcomponent_new_clone(icalcomponent* component) struct icalcomponent_impl *new; icalproperty *p; icalcomponent *c; + pvl_elem itr; icalerror_check_arg_rv( (component!=0), "component"); @@ -164,20 +162,22 @@ icalcomponent* icalcomponent_new_clone(icalcomponent* component) } - for(p = icalcomponent_get_first_property(old,ICAL_ANY_PROPERTY); - p != 0; - p = icalcomponent_get_next_property(old,ICAL_ANY_PROPERTY)){ - - icalcomponent_add_property(new,icalproperty_new_clone(p)); - } + 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(c = icalcomponent_get_first_component(old,ICAL_ANY_COMPONENT); - c != 0; - c = icalcomponent_get_next_component(old,ICAL_ANY_COMPONENT)){ - - icalcomponent_add_component(new,icalcomponent_new_clone(c)); - } + 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; @@ -242,6 +242,8 @@ icalcomponent_as_ical_string (icalcomponent* component) 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"; @@ -270,22 +272,28 @@ icalcomponent_as_ical_string (icalcomponent* component) icalmemory_append_string(&buf, &buf_ptr, &buf_size, newline); - for(p = icalcomponent_get_first_property(component,ICAL_ANY_PROPERTY); - p != 0; - p = icalcomponent_get_next_property(component,ICAL_ANY_PROPERTY)){ - tmp_buf = icalproperty_as_ical_string(p); - - icalmemory_append_string(&buf, &buf_ptr, &buf_size, tmp_buf); - } + 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(c = icalcomponent_get_first_component(component,ICAL_ANY_COMPONENT); - c != 0; - c = icalcomponent_get_next_component(component,ICAL_ANY_COMPONENT)){ + 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); } @@ -423,17 +431,23 @@ icalcomponent_remove_property (icalcomponent* component, icalproperty* property) } int -icalcomponent_count_properties (icalcomponent* component, icalproperty_kind kind) +icalcomponent_count_properties (icalcomponent* component, + icalproperty_kind kind) { int count=0; - icalproperty *p; + pvl_elem itr; + struct icalcomponent_impl *impl = (struct icalcomponent_impl*)component; + icalerror_check_arg_rz( (component!=0), "component"); - for(p = icalcomponent_get_first_property(component,kind); - p != 0; - p = icalcomponent_get_next_property(component,kind)){ - - count++; + 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++; + } } @@ -545,30 +559,42 @@ icalcomponent_remove_component (icalcomponent* parent, icalcomponent* child) if( pvl_data(itr) == (void*)child ){ if (impl->component_iterator == itr){ - /* impl->component_iterator = pvl_next(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) +icalcomponent_count_components (icalcomponent* component, + icalcomponent_kind kind) { int count=0; - icalcomponent *c; + pvl_elem itr; + struct icalcomponent_impl *impl = + (struct iccalcomponent_impl*)component; + icalerror_check_arg_rz( (component!=0), "component"); - for(c = icalcomponent_get_first_component(component,kind); - c != 0; - c = icalcomponent_get_next_component(component,kind)){ - - count++; + 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; } @@ -646,10 +672,14 @@ 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(p = icalcomponent_get_first_property(component,ICAL_ANY_PROPERTY); - p != 0; - p = icalcomponent_get_next_property(component,ICAL_ANY_PROPERTY)){ + for( itr = pvl_head(impl->properties); + itr != 0; + itr = pvl_next(itr)) + { + p = (icalproperty*)pvl_data(itr); if(icalproperty_isa(p) == ICAL_XLICERROR_PROPERTY) { @@ -657,9 +687,12 @@ int icalcomponent_count_errors(icalcomponent* component) } } - for(c = icalcomponent_get_first_component(component,ICAL_ANY_COMPONENT); - c != 0; - c = icalcomponent_get_next_component(component,ICAL_ANY_COMPONENT)){ + + for( itr = pvl_head(impl->components); + itr != 0; + itr = pvl_next(itr)) + { + c = (icalcomponent*)pvl_data(itr); errors += icalcomponent_count_errors(c); @@ -671,30 +704,34 @@ int icalcomponent_count_errors(icalcomponent* component) void icalcomponent_strip_errors(icalcomponent* component) { - icalproperty *p, *next_p; + icalproperty *p; icalcomponent *c; + pvl_elem itr, next_itr; + struct icalcomponent_impl *impl = (struct icalcomponent_impl*)component; - 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); + 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(c = icalcomponent_get_first_component(component,ICAL_ANY_COMPONENT); - c != 0; - c = icalcomponent_get_next_component(component,ICAL_ANY_COMPONENT)){ - + + 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; @@ -709,7 +746,6 @@ void icalcomponent_convert_errors(icalcomponent* component) if(icalproperty_isa(p) == ICAL_XLICERROR_PROPERTY) { struct icalreqstattype rst; - char tmp[MAX_TMP]; icalparameter *param = icalproperty_get_first_parameter (p,ICAL_XLICERRORTYPE_PARAMETER); @@ -779,4 +815,111 @@ void icalcomponent_set_parent(icalcomponent* component, icalcomponent* parent) c->parent = parent; } +icalcompiter icalcompiter_null = {ICAL_NO_COMPONENT,0}; + +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_rz( (component!=0),"component"); + + 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_rz( (component!=0),"component"); + + 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; + } + + 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); +} diff --git a/libical/src/libical/icalcomponent.h b/libical/src/libical/icalcomponent.h index 8d9f22ca76..b0d1e33630 100644 --- a/libical/src/libical/icalcomponent.h +++ b/libical/src/libical/icalcomponent.h @@ -4,20 +4,19 @@ 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 + (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 ======================================================================*/ @@ -28,9 +27,19 @@ #include "icalproperty.h" #include "icalvalue.h" #include "icalenums.h" /* defines icalcomponent_kind */ +#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); @@ -86,6 +95,20 @@ void icalcomponent_remove_component(icalcomponent* parent, 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. + +The internal iterators are deprecated. */ + +/* Using external iterators */ +icalcompiter icalcomponent_begin_component(icalcomponent* component, + icalcomponent_kind kind); + +icalcompiter icalcomponent_end_component(icalcomponent* component, + icalcomponent_kind kind); + /* Iterate through components */ icalcomponent* icalcomponent_get_current_component (icalcomponent* component); @@ -94,6 +117,8 @@ icalcomponent* icalcomponent_get_first_component(icalcomponent* component, 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); @@ -113,6 +138,14 @@ icalcomponent* icalcomponent_get_parent(icalcomponent* component); void icalcomponent_set_parent(icalcomponent* component, icalcomponent* parent); + + +/* External component iterator */ +icalcomponent* icalcompiter_next(icalcompiter* i); +icalcomponent* icalcompiter_prior(icalcompiter* i); +icalcomponent* icalcompiter_deref(icalcompiter* i); + + #endif /* !ICALCOMPONENT_H */ diff --git a/libical/src/libical/icalenums.c b/libical/src/libical/icalenums.c index 7f0aae6a0e..50d23c8d41 100644 --- a/libical/src/libical/icalenums.c +++ b/libical/src/libical/icalenums.c @@ -5,21 +5,19 @@ $Id$ + (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - (C) COPYRIGHT 1999 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 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 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 author is Eric Busboom The original code is icalenum.c ======================================================================*/ @@ -33,7 +31,7 @@ struct icalproperty_kind_map { icalproperty_kind kind; - char name[20]; + char *name; }; static struct icalproperty_kind_map property_map[] = @@ -98,6 +96,10 @@ static struct icalproperty_kind_map property_map[] = /* libical private properties */ { ICAL_XLICERROR_PROPERTY,"X-LIC-ERROR"}, + { ICAL_XLICMIMECONTENTTYPE_PROPERTY,"X-LIC-MIME-CONTENT-TYPE"}, + { ICAL_XLICMIMEENCODING_PROPERTY,"X-LIC-MIME-ENCODING"}, + { ICAL_XLICMIMEOPTINFO_PROPERTY,"X-LIC-MIME-OPT-INFO"}, + { ICAL_XLICMIMECHARSET_PROPERTY,"X-LIC-MIME-CHARSET"}, { ICAL_XLICCLUSTERCOUNT_PROPERTY,"X-LIC-CLUSTERCOUNT"}, /* End of the list */ @@ -287,6 +289,7 @@ static struct icalcomponent_kind_map component_map[] = /* libical private components */ { ICAL_XLICINVALID_COMPONENT, "X-LIC-UNKNOWN" }, + { ICAL_XLICMIMEPART_COMPONENT, "X-LIC-MIME-PART" }, { ICAL_ANY_COMPONENT, "ANY" }, { ICAL_XROOT_COMPONENT, "XROOT" }, diff --git a/libical/src/libical/icalenums.h b/libical/src/libical/icalenums.h index ff7cee486e..ba3137803e 100644 --- a/libical/src/libical/icalenums.h +++ b/libical/src/libical/icalenums.h @@ -1,23 +1,23 @@ + /* -*- Mode: C -*-*/ /*====================================================================== FILE: icalenums.h - (C) COPYRIGHT 1999 Eric Busboom - http://www.softwarestudio.org + (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. + 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 author is Eric Busboom The original code is icalenums.h Contributions from: @@ -57,7 +57,10 @@ typedef enum icalcomponent_kind { ICAL_VQUERY_COMPONENT, ICAL_VCAR_COMPONENT, ICAL_VCOMMAND_COMPONENT, - ICAL_XLICINVALID_COMPONENT + ICAL_XLICINVALID_COMPONENT, + ICAL_XLICMIMEPART_COMPONENT /* a non-stardard component that mirrors + structure of MIME data */ + } icalcomponent_kind; /*********************************************************************** @@ -126,6 +129,12 @@ typedef enum icalproperty_kind { /* libical private properties */ ICAL_XLICERROR_PROPERTY, ICAL_XLICCLUSTERCOUNT_PROPERTY, + ICAL_XLICMIMECONTENTTYPE_PROPERTY, + ICAL_XLICMIMEENCODING_PROPERTY, + ICAL_XLICMIMECID_PROPERTY, + ICAL_XLICMIMEFILENAME_PROPERTY, + ICAL_XLICMIMECHARSET_PROPERTY, + ICAL_XLICMIMEOPTINFO_PROPERTY, ICAL_NO_PROPERTY /* This must be the last enum, for iteration */ @@ -323,7 +332,9 @@ typedef enum icalparameter_xlicerrortype { ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR, ICAL_XLICERRORTYPE_PROPERTYPARSEERROR, ICAL_XLICERRORTYPE_VALUEPARSEERROR, - ICAL_XLICERRORTYPE_INVALIDITIP + ICAL_XLICERRORTYPE_UNKVCALPROP, + ICAL_XLICERRORTYPE_INVALIDITIP, + ICAL_XLICERRORTYPE_MIMEPARSEERROR, } icalparameter_xlicerrortype; typedef enum icalparameter_xliccomparetype { @@ -359,17 +370,20 @@ typedef enum icalparameter_value { * Recurrances **********************************************************************/ - typedef enum icalrecurrencetype_frequency { - ICAL_NO_RECURRENCE, - ICAL_SECONDLY_RECURRENCE, - ICAL_MINUTELY_RECURRENCE, - ICAL_HOURLY_RECURRENCE, - ICAL_DAILY_RECURRENCE, - ICAL_WEEKLY_RECURRENCE, - ICAL_MONTHLY_RECURRENCE, - ICAL_YEARLY_RECURRENCE + /* 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 diff --git a/libical/src/libical/icalerror.c b/libical/src/libical/icalerror.c index fb9e152b16..c7641da504 100644 --- a/libical/src/libical/icalerror.c +++ b/libical/src/libical/icalerror.c @@ -4,23 +4,23 @@ CREATOR: eric 16 May 1999 $Id$ + $Locker$ - (C) COPYRIGHT 1999 Eric Busboom - http://www.softwarestudio.org + (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 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 Mozilla Public License Version 1.0. You may obtain a copy of + the License at http://www.mozilla.org/MPL/ - The original author is Eric Busboom The original code is icalerror.c ======================================================================*/ diff --git a/libical/src/libical/icalerror.h b/libical/src/libical/icalerror.h index 124699c21b..fbf6076dd6 100644 --- a/libical/src/libical/icalerror.h +++ b/libical/src/libical/icalerror.h @@ -6,20 +6,19 @@ $Id$ - (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 + (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 ======================================================================*/ @@ -122,6 +121,7 @@ typedef enum icalerrorenum { ICAL_USAGE_ERROR, ICAL_NO_ERROR, ICAL_MULTIPLEINCLUSION_ERROR, + ICAL_TIMEDOUT_ERROR, ICAL_UNKNOWN_ERROR /* Used for problems in input to icalerror_strerror()*/ } icalerrorenum; diff --git a/libical/src/libical/icalmemory.c b/libical/src/libical/icalmemory.c index 35544b14ee..e13c2c42ca 100644 --- a/libical/src/libical/icalmemory.c +++ b/libical/src/libical/icalmemory.c @@ -4,6 +4,7 @@ CREATOR: eric 30 June 1999 $Id$ + $Locker$ The contents of this file are subject to the Mozilla Public License @@ -16,12 +17,34 @@ 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 - The Initial Developer of the Original Code is Eric Busboom - (C) COPYRIGHT 1999 The Software Studio. - 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 Initial Developer of the Original Code is Eric Busboom + + (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org ======================================================================*/ /* libical often passes strings back to the caller. To make these @@ -41,6 +64,9 @@ #include "config.h" #endif +#ifdef DMALLOC +#include "dmalloc.h" +#endif #include "icalmemory.h" #include "icalerror.h" @@ -52,18 +78,16 @@ #define BUFFER_RING_SIZE 25 #define MIN_BUFFER_SIZE 200 -void* buffer_ring[BUFFER_RING_SIZE+1]; -int buffer_pos = 0; +/* HACK. Not threadsafe */ +void* buffer_ring[BUFFER_RING_SIZE]; +int buffer_pos = -1; int initialized = 0; -/* Create a new temporary buffer on the ring. Libical owns these and wil deallocate them. */ -void* -icalmemory_tmp_buffer (size_t size) +/* Add an existing buffer to the buffer ring */ +void icalmemory_add_tmp_buffer(void* buf) { - void *rtrn; /* 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++){ @@ -71,30 +95,45 @@ icalmemory_tmp_buffer (size_t size) } initialized = 1; } - - /* Ideally, this routine would re-use an existing buffer if it is - larger than the requested buffer. Maybe later.... */ - if (size < MIN_BUFFER_SIZE){ - size = MIN_BUFFER_SIZE; + /* 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){ - /*sprintf(buffer_ring[buffer_pos], "***DEALLOCATED MEMORY***: %d",buffer_pos);*/ free( buffer_ring[buffer_pos]); buffer_ring[buffer_pos] = 0; } + /* Assign the buffer to a slot */ + buffer_ring[buffer_pos] = buf; +} - rtrn = buffer_ring[buffer_pos] = (void*)malloc(size); +/* Create a new temporary buffer on the ring. Libical owns these and + wil deallocate them. */ +void* +icalmemory_tmp_buffer (size_t size) +{ + char *buf; - memset(rtrn,0,size); + if (size < MIN_BUFFER_SIZE){ + size = MIN_BUFFER_SIZE; + } + + buf = (void*)malloc(size); - if(++buffer_pos > BUFFER_RING_SIZE){ - buffer_pos = 0; + if( buf == 0){ + icalerror_set_errno(ICAL_NEWFAILED_ERROR); + return 0; } - return rtrn; + memset(buf,0,size); + + icalmemory_add_tmp_buffer(buf); + + return buf; } void icalmemory_free_ring() @@ -112,6 +151,8 @@ void icalmemory_free_ring() } + + /* Like strdup, but the buffer is on the ring. */ char* icalmemory_tmp_copy(char* str) @@ -124,6 +165,10 @@ icalmemory_tmp_copy(char* str) } +char* icalmemory_strdup(const char *s) +{ + return strdup(s); +} void icalmemory_free_tmp_buffer (void* buf) @@ -137,13 +182,18 @@ icalmemory_free_tmp_buffer (void* buf) } -/* These buffer routines create memory the old fashioned way -- so the caller will have to delocate the new memory */ +/* 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) { - /* HACK. need to handle out of memory case */ void *b = malloc(size); + if( b == 0){ + icalerror_set_errno(ICAL_NEWFAILED_ERROR); + return 0; + } + memset(b,0,size); return b; @@ -151,9 +201,14 @@ void* icalmemory_new_buffer(size_t size) void* icalmemory_resize_buffer(void* buf, size_t size) { - /* HACK. need to handle out of memory case */ + void *b = realloc(buf, size); - return realloc(buf, size); + if( b == 0){ + icalerror_set_errno(ICAL_NEWFAILED_ERROR); + return 0; + } + + return b; } void icalmemory_free_buffer(void* buf) @@ -240,5 +295,5 @@ icalmemory_append_char(char** buf, char** pos, size_t* buf_size, **pos = ch; *pos += 1; - + **pos = 0; } diff --git a/libical/src/libical/icalmemory.h b/libical/src/libical/icalmemory.h index 26d22b7316..6c974cdc95 100644 --- a/libical/src/libical/icalmemory.h +++ b/libical/src/libical/icalmemory.h @@ -17,12 +17,34 @@ 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 - The Initial Developer of the Original Code is Eric Busboom - (C) COPYRIGHT 1999 The Software Studio. - 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 Initial Developer of the Original Code is Eric Busboom + + (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org ======================================================================*/ #ifndef ICALMEMORY_H @@ -30,7 +52,8 @@ #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. */ +/* 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(char* str); @@ -70,6 +93,9 @@ void icalmemory_append_string(char** buf, char** pos, size_t* buf_size, void icalmemory_append_char(char** buf, char** pos, size_t* buf_size, char ch); +/* A wrapper around strdup */ +char* icalmemory_strdup(const char *s); + #endif /* !ICALMEMORY_H */ diff --git a/libical/src/libical/icalparameter.c b/libical/src/libical/icalparameter.c index cf37eb07b2..c77c223f1c 100644 --- a/libical/src/libical/icalparameter.c +++ b/libical/src/libical/icalparameter.c @@ -4,23 +4,23 @@ CREATOR: eric 09 May 1999 $Id$ + $Locker$ - (C) COPYRIGHT 1999 Eric Busboom - http://www.softwarestudio.org + (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 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 Mozilla Public License Version 1.0. You may obtain a copy of + the License at http://www.mozilla.org/MPL/ - The original author is Eric Busboom The original code is icalderivedparameters.{c,h} Contributions from: @@ -114,7 +114,7 @@ icalparameter_new_clone(icalparameter* param) memcpy(new,old,sizeof(struct icalparameter_impl)); if (old->string != 0){ - new->string = strdup(old->string); + new->string = icalmemory_strdup(old->string); if (new->string == 0){ icalparameter_free(new); return 0; @@ -122,7 +122,7 @@ icalparameter_new_clone(icalparameter* param) } if (old->x_name != 0){ - new->x_name = strdup(old->x_name); + new->x_name = icalmemory_strdup(old->x_name); if (new->x_name == 0){ icalparameter_free(new); return 0; @@ -132,6 +132,116 @@ icalparameter_new_clone(icalparameter* param) return new; } +#if 0 + +struct param_string_map { + icalparameter_kind kind; + int val; /* Actually, union of several types of enums */ + char* str; +} param_string_map[] = +{ + {ICAL_CUTYPE_PARAMETER,ICAL_CUTYPE_INDIVIDUAL,"INDIVIDUAL"}, + {ICAL_CUTYPE_PARAMETER,ICAL_CUTYPE_GROUP,"GROUP"}, + {ICAL_CUTYPE_PARAMETER,ICAL_CUTYPE_RESOURCE,"RESOURCE"}, + {ICAL_CUTYPE_PARAMETER,ICAL_CUTYPE_ROOM,"ROOM"}, + {ICAL_CUTYPE_PARAMETER,ICAL_CUTYPE_UNKNOWN,"UNKNOWN"}, + {ICAL_FBTYPE_PARAMETER,ICAL_FBTYPE_FREE,"FREE"}, + {ICAL_FBTYPE_PARAMETER,ICAL_FBTYPE_BUSY,"BUSY"}, + {ICAL_FBTYPE_PARAMETER,ICAL_FBTYPE_BUSYUNAVAILABLE,"BUSYUNAVAILABLE"}, + {ICAL_FBTYPE_PARAMETER,ICAL_FBTYPE_BUSYTENTATIVE,"BUSYTENTATIVE"}, + {ICAL_PARTSTAT_PARAMETER,ICAL_PARTSTAT_NEEDSACTION,"NEEDSACTION"}, + {ICAL_PARTSTAT_PARAMETER,ICAL_PARTSTAT_ACCEPTED,"ACCEPTED"}, + {ICAL_PARTSTAT_PARAMETER,ICAL_PARTSTAT_DECLINED,"DECLINED"}, + {ICAL_PARTSTAT_PARAMETER,ICAL_PARTSTAT_TENTATIVE,"TENTATIVE"}, + {ICAL_PARTSTAT_PARAMETER,ICAL_PARTSTAT_DELEGATED,"DELEGATED"}, + {ICAL_PARTSTAT_PARAMETER,ICAL_PARTSTAT_COMPLETED,"COMPLETED"}, + {ICAL_PARTSTAT_PARAMETER,ICAL_PARTSTAT_INPROCESS,"INPROCESS"}, + {ICAL_RANGE_PARAMETER,ICAL_RANGE_THISANDPRIOR,"THISANDPRIOR"}, + {ICAL_RANGE_PARAMETER,ICAL_RANGE_THISANDFUTURE,"THISANDFUTURE"}, + {ICAL_RELATED_PARAMETER,ICAL_RELATED_START,"START"}, + {ICAL_RELATED_PARAMETER,ICAL_RELATED_END,"END"}, + {ICAL_RELTYPE_PARAMETER,ICAL_RELTYPE_PARENT,"PARENT"}, + {ICAL_RELTYPE_PARAMETER,ICAL_RELTYPE_CHILD,"CHILD"}, + {ICAL_RELTYPE_PARAMETER,ICAL_RELTYPE_SIBLING,"SIBLING"}, + {ICAL_ROLE_PARAMETER,ICAL_ROLE_CHAIR,"CHAIR"}, + {ICAL_RSVP_PARAMETER,ICAL_RSVP_PARAMETER,"TRUE"}, + {ICAL_RSVP_PARAMETER,ICAL_RSVP_PARAMETER,"FALSE"}, + {ICAL_VALUE_PARAMETER,ICAL_VALUE_BINARY,"BINARY"}, + {ICAL_VALUE_PARAMETER,ICAL_VALUE_BOOLEAN,"BOOLEAN"}, + {ICAL_VALUE_PARAMETER,ICAL_VALUE_DATE,"DATE"}, + {ICAL_VALUE_PARAMETER,ICAL_VALUE_DURATION,"DURATION"}, + {ICAL_VALUE_PARAMETER,ICAL_VALUE_FLOAT,"FLOAT"}, + {ICAL_VALUE_PARAMETER,ICAL_VALUE_INTEGER,"INTEGER"}, + {ICAL_VALUE_PARAMETER,ICAL_VALUE_PERIOD,"PERIOD"}, + {ICAL_VALUE_PARAMETER,ICAL_VALUE_RECUR,"RECUR"}, + {ICAL_VALUE_PARAMETER,ICAL_VALUE_TEXT,"TEXT"}, + {ICAL_VALUE_PARAMETER,ICAL_VALUE_TIME,"TIME"}, + {ICAL_VALUE_PARAMETER,ICAL_VALUE_URI,"URI"}, + {ICAL_VALUE_PARAMETER,ICAL_VALUE_XNAME,"ERROR"}, + {ICAL_XLICERRORTYPE_PARAMETER,ICAL_XLICERRORTYPE_COMPONENTPARSEERROR,"COMPONENT_PARSE_ERROR"}, + {ICAL_XLICERRORTYPE_PARAMETER,ICAL_XLICERRORTYPE_PROPERTYPARSEERROR,"PROPERTY_PARSE_ERROR"}, + {ICAL_XLICERRORTYPE_PARAMETER,ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR,"PARAMETER_NAME_PARSE_ERROR"}, + {ICAL_XLICERRORTYPE_PARAMETER,ICAL_XLICERRORTYPE_PARAMETERVALUEPARSEERROR,"PARAMETER_VALUE_PARSE_ERROR"}, + {ICAL_XLICERRORTYPE_PARAMETER,ICAL_XLICERRORTYPE_VALUEPARSEERROR,"VALUE_PARSE_ERROR"}, + {ICAL_XLICERRORTYPE_PARAMETER,ICAL_XLICERRORTYPE_INVALIDITIP,"INVALID_ITIP"}, + {ICAL_XLICERRORTYPE_PARAMETER,ICAL_XLICERRORTYPE_UNKVCALPROP,"UNKNOWN_VCAL_PROP_ERROR"}, + {ICAL_XLICERRORTYPE_PARAMETER,ICAL_XLICERRORTYPE_MIMEPARSEERROR,"MIME_PARSE_ERROR"}, + {ICAL_XLICCOMPARETYPE_PARAMETER,ICAL_XLICCOMPARETYPE_EQUAL,"EQUAL"}, + {ICAL_XLICCOMPARETYPE_PARAMETER,ICAL_XLICCOMPARETYPE_NOTEQUAL,"NOTEQUAL"}, + {ICAL_XLICCOMPARETYPE_PARAMETER,ICAL_XLICCOMPARETYPE_LESS,"LESS"}, + {ICAL_XLICCOMPARETYPE_PARAMETER,ICAL_XLICCOMPARETYPE_GREATER,"GREATER"}, + {ICAL_XLICCOMPARETYPE_PARAMETER,ICAL_XLICCOMPARETYPE_LESSEQUAL,"LESSEQUAL"}, + {ICAL_XLICCOMPARETYPE_PARAMETER,ICAL_XLICCOMPARETYPE_GREATEREQUAL,"GREATEREQUAL"}, + {ICAL_XLICCOMPARETYPE_PARAMETER,ICAL_XLICCOMPARETYPE_REGEX,"REGEX"}, + {ICAL_NO_PARAMETER,0,""}, + +}; + + +icalparameter* icalparameter_new_from_string(icalparameter_kind kind, char* val) +{ + int i =0; + icalparameter* param=0; + + icalerror_check_arg_rz((val!=0),"val"); + + switch(kind){ + case ICAL_SENTBY_PARAMETER: + case ICAL_TZID_PARAMETER: + case ICAL_X_PARAMETER: + case ICAL_FMTTYPE_PARAMETER: + case ICAL_LANGUAGE_PARAMETER: + case ICAL_MEMBER_PARAMETER: + case ICAL_DELEGATEDFROM_PARAMETER: + case ICAL_DELEGATEDTO_PARAMETER: + case ICAL_DIR_PARAMETER: + case ICAL_ALTREP_PARAMETER: + case ICAL_CN_PARAMETER: + { + if (impl->string == 0){ return no_parameter;} + strcpy(tend,impl->string);break; + break; + } + + case ICAL_NO_PARAMETER: + case ICAL_ANY_PARAMETER: + { + } + + default: { + /* All other types are enumerated */ + for(i = 0; param_string_map[i].kind != ICAL_NO_PARAMETER){ + if(kind == param_string_map[i].kind && + strcmp(val,param_string_map[i].str) == 0){ + + + } + } + } +} + +#endif + icalparameter* icalparameter_new_from_string(icalparameter_kind kind, char* val) { @@ -427,6 +537,12 @@ icalparameter* icalparameter_new_from_string(icalparameter_kind kind, char* val) else if(strcmp(val,"INVALID_ITIP") == 0){ param = icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_INVALIDITIP); } + else if(strcmp(val,"MIME_PARSE_ERROR") == 0){ + param = icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_MIMEPARSEERROR); + } + else if(strcmp(val,"UNKNOWN_VCAL_PROP_ERROR") == 0){ + param = icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_UNKVCALPROP); + } break; } @@ -839,6 +955,14 @@ icalparameter_as_ical_string (icalparameter* parameter) { strcpy(tend,"INVALID_ITIP");break; } + case ICAL_XLICERRORTYPE_UNKVCALPROP: + { + strcpy(tend,"UNKNOWN_VCAL_PROP_ERROR");break; + } + case ICAL_XLICERRORTYPE_MIMEPARSEERROR: + { + strcpy(tend,"MIME_PARSE_ERROR");break; + } } break; } @@ -969,7 +1093,7 @@ icalparameter_set_xname (icalparameter* param, char* v) free(impl->x_name); } - impl->x_name = strdup(v); + impl->x_name = icalmemory_strdup(v); if (impl->x_name == 0){ errno = ENOMEM; @@ -998,7 +1122,7 @@ icalparameter_set_xvalue (icalparameter* param, char* v) free(impl->string); } - impl->string = strdup(v); + impl->string = icalmemory_strdup(v); if (impl->string == 0){ errno = ENOMEM; @@ -1071,7 +1195,7 @@ void icalparameter_set_altrep(icalparameter* param, char* v) icalerror_check_arg_rv( (param!=0), "param"); icalerror_clear_errno(); - ((struct icalparameter_impl*)param)->string = strdup(v); + ((struct icalparameter_impl*)param)->string = icalmemory_strdup(v); } /* CN */ @@ -1107,7 +1231,7 @@ void icalparameter_set_cn(icalparameter* param, char* v) icalerror_check_arg_rv( (param!=0), "param"); icalerror_clear_errno(); - ((struct icalparameter_impl*)param)->string = strdup(v); + ((struct icalparameter_impl*)param)->string = icalmemory_strdup(v); } /* CUTYPE */ @@ -1184,7 +1308,7 @@ void icalparameter_set_delegatedfrom(icalparameter* param, char* v) icalerror_check_arg_rv( (param!=0), "param"); icalerror_clear_errno(); - ((struct icalparameter_impl*)param)->string = strdup(v); + ((struct icalparameter_impl*)param)->string = icalmemory_strdup(v); } /* DELEGATED-TO */ @@ -1220,7 +1344,7 @@ void icalparameter_set_delegatedto(icalparameter* param, char* v) icalerror_check_arg_rv( (param!=0), "param"); icalerror_clear_errno(); - ((struct icalparameter_impl*)param)->string = strdup(v); + ((struct icalparameter_impl*)param)->string = icalmemory_strdup(v); } /* DIR */ @@ -1256,7 +1380,7 @@ void icalparameter_set_dir(icalparameter* param, char* v) icalerror_check_arg_rv( (param!=0), "param"); icalerror_clear_errno(); - ((struct icalparameter_impl*)param)->string = strdup(v); + ((struct icalparameter_impl*)param)->string = icalmemory_strdup(v); } /* ENCODING */ @@ -1374,7 +1498,7 @@ void icalparameter_set_fmttype(icalparameter* param, char* v) icalerror_check_arg_rv( (param!=0), "param"); icalerror_clear_errno(); - ((struct icalparameter_impl*)param)->string = strdup(v); + ((struct icalparameter_impl*)param)->string = icalmemory_strdup(v); } /* LANGUAGE */ @@ -1410,7 +1534,7 @@ void icalparameter_set_language(icalparameter* param, char* v) icalerror_check_arg_rv( (param!=0), "param"); icalerror_clear_errno(); - ((struct icalparameter_impl*)param)->string = strdup(v); + ((struct icalparameter_impl*)param)->string = icalmemory_strdup(v); } /* MEMBER */ @@ -1446,7 +1570,7 @@ void icalparameter_set_member(icalparameter* param, char* v) icalerror_check_arg_rv( (param!=0), "param"); icalerror_clear_errno(); - ((struct icalparameter_impl*)param)->string = strdup(v); + ((struct icalparameter_impl*)param)->string = icalmemory_strdup(v); } /* PARTSTAT */ @@ -1719,7 +1843,7 @@ void icalparameter_set_sentby(icalparameter* param, char* v) icalerror_check_arg_rv( (param!=0), "param"); icalerror_clear_errno(); - ((struct icalparameter_impl*)param)->string = strdup(v); + ((struct icalparameter_impl*)param)->string = icalmemory_strdup(v); } /* TZID */ @@ -1755,7 +1879,7 @@ void icalparameter_set_tzid(icalparameter* param, char* v) icalerror_check_arg_rv( (param!=0), "param"); icalerror_clear_errno(); - ((struct icalparameter_impl*)param)->string = strdup(v); + ((struct icalparameter_impl*)param)->string = icalmemory_strdup(v); } /* VALUE */ @@ -1832,7 +1956,7 @@ void icalparameter_set_x(icalparameter* param, char* v) icalerror_check_arg_rv( (param!=0), "param"); icalerror_clear_errno(); - ((struct icalparameter_impl*)param)->string = strdup(v); + ((struct icalparameter_impl*)param)->string = icalmemory_strdup(v); } /* X-LIC-ERRORTYPE */ diff --git a/libical/src/libical/icalparameter.h b/libical/src/libical/icalparameter.h index 174cae6f3f..ad97f34e58 100644 --- a/libical/src/libical/icalparameter.h +++ b/libical/src/libical/icalparameter.h @@ -9,20 +9,19 @@ - (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 + (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 ======================================================================*/ diff --git a/libical/src/libical/icalparser.c b/libical/src/libical/icalparser.c index 3be754036a..b4563e23c9 100644 --- a/libical/src/libical/icalparser.c +++ b/libical/src/libical/icalparser.c @@ -4,6 +4,7 @@ CREATOR: eric 04 August 1999 $Id$ + $Locker$ The contents of this file are subject to the Mozilla Public License @@ -16,11 +17,21 @@ the License for the specific language governing rights and limitations under the License. - The Initial Developer of the Original Code is Eric Busboom - (C) COPYRIGHT 1999 The Software Studio. - 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 Initial Developer of the Original Code is Eric Busboom + (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org ======================================================================*/ #ifdef HAVE_CONFIG_H @@ -91,6 +102,7 @@ icalparser* icalparser_new() return (icalparser*)impl; } + void icalparser_free(icalparser* parser) { struct icalparser_impl* impl = (struct icalparser_impl*)parser; @@ -105,6 +117,8 @@ void icalparser_free(icalparser* parser) } pvl_free(impl->components); + + free(impl); } void icalparser_set_gen_data(icalparser* parser, void* data) @@ -115,7 +129,7 @@ void icalparser_set_gen_data(icalparser* parser, void* data) } -icalvalue* icalvalue_new_from_string_with_error(icalvalue_kind kind, +icalvalue* icalvalue_new_From_string_with_error(icalvalue_kind kind, char* str, icalproperty **error); @@ -313,7 +327,6 @@ char* icalparser_get_next_value(char* line, char **end, icalvalue_kind kind) ) { /* The COMMA was followed by 'FREQ', is it a real seperator*/ /* Fall through */ - printf("%s\n",next); } else if (next != 0){ /* Not real, get the next COMMA */ p = next+1; @@ -404,7 +417,8 @@ char* icalparser_get_line(icalparser *parser, /* 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){ + if (impl->temp[impl->tmp_buf_size-1] == 0 && + impl->temp[impl->tmp_buf_size-2] != '\n'){ impl->buffer_full = 1; } else { impl->buffer_full = 0; @@ -515,7 +529,6 @@ icalcomponent* icalparser_parse(icalparser *parser, do{ line = icalparser_get_line(parser, line_gen_func); - if ((c = icalparser_add_line(parser,line)) != 0){ if (root_component == 0){ /* Just one component */ @@ -538,6 +551,9 @@ icalcomponent* icalparser_parse(icalparser *parser, icalparser_claim(parser); } } + if(line != 0){ + free(line); + } } while ( line != 0); return root_component; @@ -568,7 +584,7 @@ icalcomponent* icalparser_add_line(icalparser* parser, /* 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 market for the start or end of + is not really a property, but the marker for the start or end of a component */ end = 0; @@ -591,8 +607,6 @@ icalcomponent* icalparser_add_line(icalparser* parser, /********************************************************************** * Handle begin and end of components **********************************************************************/ - - /* If the property name is BEGIN or END, we are actually starting or ending a new component */ diff --git a/libical/src/libical/icalparser.h b/libical/src/libical/icalparser.h index 25c07eca9f..161127379f 100644 --- a/libical/src/libical/icalparser.h +++ b/libical/src/libical/icalparser.h @@ -6,20 +6,19 @@ $Id$ - (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 + (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 ======================================================================*/ @@ -32,6 +31,16 @@ #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, @@ -40,6 +49,13 @@ typedef enum icalparser_state { ICALPARSER_IN_PROGRESS } icalparser_state; +icalparser* icalparser_new(); +icalcomponent* icalparser_add_line(icalparser* parser, char* str ); +icalcomponent* icalparser_claim(icalparser* parser); +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 @@ -51,25 +67,13 @@ typedef enum icalparser_state { icalcomponent* icalparser_parse(icalparser *parser, char* (*line_gen_func)(char *s, size_t size, void *d)); -/* A simple, and incorrect interface - can only return one component*/ -icalcomponent* icalparser_parse_string(char* str); +/* 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); -/*********************************************************************** - * 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. - ***********************************************************************/ +icalcomponent* icalparser_parse_string(char* str); -icalparser* icalparser_new(); -void icalparser_set_gen_data(icalparser* parser, void* data); -icalcomponent* icalparser_add_line(icalparser* parser, char* str ); -icalcomponent* icalparser_claim(icalparser* parser); -icalcomponent* icalparser_clean(icalparser* parser); -icalparser_state icalparser_get_state(icalparser* parser); -void icalparser_free(icalparser* parser); /*********************************************************************** * Parser support functions @@ -81,14 +85,6 @@ icalvalue* icalparser_parse_value(icalvalue_kind kind, char* str, icalcomponent /* 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)); - -/* a line_gen_function that returns lines from a string. To use it, - set string_line_generator_str to point to the input string, and set - string_line_generator_pos to 0. These globals make the routine not - thead-safe. */ - -extern char* string_line_generator_str; -extern char* string_line_generator_pos; char* string_line_generator(char *out, size_t buf_size, void *d); #endif /* !ICALPARSE_H */ diff --git a/libical/src/libical/icalproperty.c b/libical/src/libical/icalproperty.c index c3fe7c9073..1040215108 100644 --- a/libical/src/libical/icalproperty.c +++ b/libical/src/libical/icalproperty.c @@ -7,20 +7,19 @@ $Id$ - (C) COPYRIGHT 1999 Eric Busboom - http://www.softwarestudio.org + (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. + 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 author is Eric Busboom The original code is icalproperty.c ======================================================================*/ @@ -29,7 +28,7 @@ #include "config.h" #endif -#include <string.h> /* For strdup, rindex */ +#include <string.h> /* For icalmemory_strdup, rindex */ #include <assert.h> #include <stdlib.h> #include <errno.h> @@ -80,7 +79,7 @@ void icalproperty_add_parameters(struct icalproperty_impl *impl,va_list args) icalproperty_add_parameter((icalproperty*)impl, (icalparameter*)vp); } else { - abort(); + assert(0); } } @@ -138,7 +137,7 @@ icalproperty_new_clone(icalproperty* prop) if (old->x_name != 0) { - new->x_name = strdup(old->x_name); + new->x_name = icalmemory_strdup(old->x_name); if (new->x_name == 0) { icalproperty_free(new); @@ -269,6 +268,7 @@ icalproperty_as_ical_string (icalproperty* prop) icalerror_check_arg_rz( (prop!=0),"prop"); + /* Append property name */ if (impl->kind == ICAL_X_PROPERTY && impl->x_name != 0){ @@ -315,8 +315,9 @@ icalproperty_as_ical_string (icalproperty* prop) value = icalproperty_get_value(prop); if (value != 0){ - icalmemory_append_string(&buf, &buf_ptr, &buf_size, - icalvalue_as_ical_string(icalproperty_get_value(prop))); + 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"); @@ -479,7 +480,7 @@ void icalproperty_set_x_name(icalproperty* prop, char* name) free(impl->x_name); } - impl->x_name = strdup(name); + impl->x_name = icalmemory_strdup(name); if(impl->x_name == 0){ icalerror_set_errno(ICAL_ALLOCATION_ERROR); @@ -569,6 +570,59 @@ icalproperty_method icalproperty_get_method(icalproperty* prop) return icalvalue_get_method(value); } +/* X-LIC-MIMECID */ + +icalproperty* icalproperty_new_xlicmimecid(char* v) +{ + struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICMIMECID_PROPERTY); + icalerror_check_arg_rz( (v!=0),"v"); + + + icalproperty_set_xlicmimecid((icalproperty*)impl,v); + + return (icalproperty*)impl; +} + +icalproperty* icalproperty_vanew_xlicmimecid(char* v, ...) +{ + va_list args; + struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICMIMECID_PROPERTY); + icalerror_check_arg_rz( (v!=0),"v"); + + + icalproperty_set_xlicmimecid((icalproperty*)impl,v); + + va_start(args,v); + icalproperty_add_parameters(impl, args); + va_end(args); + + return (icalproperty*)impl; +} + +void icalproperty_set_xlicmimecid(icalproperty* prop, char* v) +{ + icalvalue *value; + + icalerror_check_arg_rv( (v!=0),"v"); + + icalerror_check_arg_rv( (prop!=0),"prop"); + + value = icalvalue_new_string(v); + + icalproperty_set_value(prop,value); + +} + +char* icalproperty_get_xlicmimecid(icalproperty* prop) +{ + icalvalue *value; + icalerror_check_arg( (prop!=0),"prop"); + + value = icalproperty_get_value(prop); + + return icalvalue_get_string(value); +} + /* LAST-MODIFIED */ icalproperty* icalproperty_new_lastmodified(struct icaltimetype v) @@ -1193,6 +1247,112 @@ char* icalproperty_get_contact(icalproperty* prop) return icalvalue_get_text(value); } +/* X-LIC-MIMECONTENTTYPE */ + +icalproperty* icalproperty_new_xlicmimecontenttype(char* v) +{ + struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICMIMECONTENTTYPE_PROPERTY); + icalerror_check_arg_rz( (v!=0),"v"); + + + icalproperty_set_xlicmimecontenttype((icalproperty*)impl,v); + + return (icalproperty*)impl; +} + +icalproperty* icalproperty_vanew_xlicmimecontenttype(char* v, ...) +{ + va_list args; + struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICMIMECONTENTTYPE_PROPERTY); + icalerror_check_arg_rz( (v!=0),"v"); + + + icalproperty_set_xlicmimecontenttype((icalproperty*)impl,v); + + va_start(args,v); + icalproperty_add_parameters(impl, args); + va_end(args); + + return (icalproperty*)impl; +} + +void icalproperty_set_xlicmimecontenttype(icalproperty* prop, char* v) +{ + icalvalue *value; + + icalerror_check_arg_rv( (v!=0),"v"); + + icalerror_check_arg_rv( (prop!=0),"prop"); + + value = icalvalue_new_string(v); + + icalproperty_set_value(prop,value); + +} + +char* icalproperty_get_xlicmimecontenttype(icalproperty* prop) +{ + icalvalue *value; + icalerror_check_arg( (prop!=0),"prop"); + + value = icalproperty_get_value(prop); + + return icalvalue_get_string(value); +} + +/* X-LIC-MIMEOPTINFO */ + +icalproperty* icalproperty_new_xlicmimeoptinfo(char* v) +{ + struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICMIMEOPTINFO_PROPERTY); + icalerror_check_arg_rz( (v!=0),"v"); + + + icalproperty_set_xlicmimeoptinfo((icalproperty*)impl,v); + + return (icalproperty*)impl; +} + +icalproperty* icalproperty_vanew_xlicmimeoptinfo(char* v, ...) +{ + va_list args; + struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICMIMEOPTINFO_PROPERTY); + icalerror_check_arg_rz( (v!=0),"v"); + + + icalproperty_set_xlicmimeoptinfo((icalproperty*)impl,v); + + va_start(args,v); + icalproperty_add_parameters(impl, args); + va_end(args); + + return (icalproperty*)impl; +} + +void icalproperty_set_xlicmimeoptinfo(icalproperty* prop, char* v) +{ + icalvalue *value; + + icalerror_check_arg_rv( (v!=0),"v"); + + icalerror_check_arg_rv( (prop!=0),"prop"); + + value = icalvalue_new_string(v); + + icalproperty_set_value(prop,value); + +} + +char* icalproperty_get_xlicmimeoptinfo(icalproperty* prop) +{ + icalvalue *value; + icalerror_check_arg( (prop!=0),"prop"); + + value = icalproperty_get_value(prop); + + return icalvalue_get_string(value); +} + /* RELATED-TO */ icalproperty* icalproperty_new_relatedto(char* v) @@ -1352,6 +1512,59 @@ char* icalproperty_get_comment(icalproperty* prop) return icalvalue_get_text(value); } +/* X-LIC-ERROR */ + +icalproperty* icalproperty_new_xlicerror(char* v) +{ + struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICERROR_PROPERTY); + icalerror_check_arg_rz( (v!=0),"v"); + + + icalproperty_set_xlicerror((icalproperty*)impl,v); + + return (icalproperty*)impl; +} + +icalproperty* icalproperty_vanew_xlicerror(char* v, ...) +{ + va_list args; + struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICERROR_PROPERTY); + icalerror_check_arg_rz( (v!=0),"v"); + + + icalproperty_set_xlicerror((icalproperty*)impl,v); + + va_start(args,v); + icalproperty_add_parameters(impl, args); + va_end(args); + + return (icalproperty*)impl; +} + +void icalproperty_set_xlicerror(icalproperty* prop, char* v) +{ + icalvalue *value; + + icalerror_check_arg_rv( (v!=0),"v"); + + icalerror_check_arg_rv( (prop!=0),"prop"); + + value = icalvalue_new_text(v); + + icalproperty_set_value(prop,value); + +} + +char* icalproperty_get_xlicerror(icalproperty* prop) +{ + icalvalue *value; + icalerror_check_arg( (prop!=0),"prop"); + + value = icalproperty_get_value(prop); + + return icalvalue_get_text(value); +} + /* TRIGGER */ icalproperty* icalproperty_new_trigger(union icaltriggertype v) @@ -1402,27 +1615,27 @@ union icaltriggertype icalproperty_get_trigger(icalproperty* prop) return icalvalue_get_trigger(value); } -/* X-LIC-ERROR */ +/* CLASS */ -icalproperty* icalproperty_new_xlicerror(char* v) +icalproperty* icalproperty_new_class(char* v) { - struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICERROR_PROPERTY); + struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_CLASS_PROPERTY); icalerror_check_arg_rz( (v!=0),"v"); - icalproperty_set_xlicerror((icalproperty*)impl,v); + icalproperty_set_class((icalproperty*)impl,v); return (icalproperty*)impl; } -icalproperty* icalproperty_vanew_xlicerror(char* v, ...) +icalproperty* icalproperty_vanew_class(char* v, ...) { va_list args; - struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICERROR_PROPERTY); + struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_CLASS_PROPERTY); icalerror_check_arg_rz( (v!=0),"v"); - icalproperty_set_xlicerror((icalproperty*)impl,v); + icalproperty_set_class((icalproperty*)impl,v); va_start(args,v); icalproperty_add_parameters(impl, args); @@ -1431,7 +1644,7 @@ icalproperty* icalproperty_vanew_xlicerror(char* v, ...) return (icalproperty*)impl; } -void icalproperty_set_xlicerror(icalproperty* prop, char* v) +void icalproperty_set_class(icalproperty* prop, char* v) { icalvalue *value; @@ -1445,7 +1658,7 @@ void icalproperty_set_xlicerror(icalproperty* prop, char* v) } -char* icalproperty_get_xlicerror(icalproperty* prop) +char* icalproperty_get_class(icalproperty* prop) { icalvalue *value; icalerror_check_arg( (prop!=0),"prop"); @@ -1455,27 +1668,27 @@ char* icalproperty_get_xlicerror(icalproperty* prop) return icalvalue_get_text(value); } -/* CLASS */ +/* X */ -icalproperty* icalproperty_new_class(char* v) +icalproperty* icalproperty_new_x(char* v) { - struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_CLASS_PROPERTY); + struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_X_PROPERTY); icalerror_check_arg_rz( (v!=0),"v"); - icalproperty_set_class((icalproperty*)impl,v); + icalproperty_set_x((icalproperty*)impl,v); return (icalproperty*)impl; } -icalproperty* icalproperty_vanew_class(char* v, ...) +icalproperty* icalproperty_vanew_x(char* v, ...) { va_list args; - struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_CLASS_PROPERTY); + struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_X_PROPERTY); icalerror_check_arg_rz( (v!=0),"v"); - icalproperty_set_class((icalproperty*)impl,v); + icalproperty_set_x((icalproperty*)impl,v); va_start(args,v); icalproperty_add_parameters(impl, args); @@ -1484,7 +1697,7 @@ icalproperty* icalproperty_vanew_class(char* v, ...) return (icalproperty*)impl; } -void icalproperty_set_class(icalproperty* prop, char* v) +void icalproperty_set_x(icalproperty* prop, char* v) { icalvalue *value; @@ -1498,7 +1711,7 @@ void icalproperty_set_class(icalproperty* prop, char* v) } -char* icalproperty_get_class(icalproperty* prop) +char* icalproperty_get_x(icalproperty* prop) { icalvalue *value; icalerror_check_arg( (prop!=0),"prop"); @@ -1611,6 +1824,59 @@ char* icalproperty_get_transp(icalproperty* prop) return icalvalue_get_text(value); } +/* X-LIC-MIMEENCODING */ + +icalproperty* icalproperty_new_xlicmimeencoding(char* v) +{ + struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICMIMEENCODING_PROPERTY); + icalerror_check_arg_rz( (v!=0),"v"); + + + icalproperty_set_xlicmimeencoding((icalproperty*)impl,v); + + return (icalproperty*)impl; +} + +icalproperty* icalproperty_vanew_xlicmimeencoding(char* v, ...) +{ + va_list args; + struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICMIMEENCODING_PROPERTY); + icalerror_check_arg_rz( (v!=0),"v"); + + + icalproperty_set_xlicmimeencoding((icalproperty*)impl,v); + + va_start(args,v); + icalproperty_add_parameters(impl, args); + va_end(args); + + return (icalproperty*)impl; +} + +void icalproperty_set_xlicmimeencoding(icalproperty* prop, char* v) +{ + icalvalue *value; + + icalerror_check_arg_rv( (v!=0),"v"); + + icalerror_check_arg_rv( (prop!=0),"prop"); + + value = icalvalue_new_string(v); + + icalproperty_set_value(prop,value); + +} + +char* icalproperty_get_xlicmimeencoding(icalproperty* prop) +{ + icalvalue *value; + icalerror_check_arg( (prop!=0),"prop"); + + value = icalproperty_get_value(prop); + + return icalvalue_get_string(value); +} + /* SEQUENCE */ icalproperty* icalproperty_new_sequence(int v) @@ -2432,6 +2698,59 @@ struct icalperiodtype icalproperty_get_rdate(icalproperty* prop) return icalvalue_get_datetimeperiod(value); } +/* X-LIC-MIMEFILENAME */ + +icalproperty* icalproperty_new_xlicmimefilename(char* v) +{ + struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICMIMEFILENAME_PROPERTY); + icalerror_check_arg_rz( (v!=0),"v"); + + + icalproperty_set_xlicmimefilename((icalproperty*)impl,v); + + return (icalproperty*)impl; +} + +icalproperty* icalproperty_vanew_xlicmimefilename(char* v, ...) +{ + va_list args; + struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICMIMEFILENAME_PROPERTY); + icalerror_check_arg_rz( (v!=0),"v"); + + + icalproperty_set_xlicmimefilename((icalproperty*)impl,v); + + va_start(args,v); + icalproperty_add_parameters(impl, args); + va_end(args); + + return (icalproperty*)impl; +} + +void icalproperty_set_xlicmimefilename(icalproperty* prop, char* v) +{ + icalvalue *value; + + icalerror_check_arg_rv( (v!=0),"v"); + + icalerror_check_arg_rv( (prop!=0),"prop"); + + value = icalvalue_new_string(v); + + icalproperty_set_value(prop,value); + +} + +char* icalproperty_get_xlicmimefilename(icalproperty* prop) +{ + icalvalue *value; + icalerror_check_arg( (prop!=0),"prop"); + + value = icalproperty_get_value(prop); + + return icalvalue_get_string(value); +} + /* URL */ icalproperty* icalproperty_new_url(char* v) @@ -2485,25 +2804,25 @@ char* icalproperty_get_url(icalproperty* prop) return icalvalue_get_uri(value); } -/* ATTACH */ +/* X-LIC-CLUSTERCOUNT */ -icalproperty* icalproperty_new_attach(struct icalattachtype v) +icalproperty* icalproperty_new_xlicclustercount(int v) { - struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_ATTACH_PROPERTY); + struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICCLUSTERCOUNT_PROPERTY); - icalproperty_set_attach((icalproperty*)impl,v); + icalproperty_set_xlicclustercount((icalproperty*)impl,v); return (icalproperty*)impl; } -icalproperty* icalproperty_vanew_attach(struct icalattachtype v, ...) +icalproperty* icalproperty_vanew_xlicclustercount(int v, ...) { va_list args; - struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_ATTACH_PROPERTY); + struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICCLUSTERCOUNT_PROPERTY); - icalproperty_set_attach((icalproperty*)impl,v); + icalproperty_set_xlicclustercount((icalproperty*)impl,v); va_start(args,v); icalproperty_add_parameters(impl, args); @@ -2512,48 +2831,48 @@ icalproperty* icalproperty_vanew_attach(struct icalattachtype v, ...) return (icalproperty*)impl; } -void icalproperty_set_attach(icalproperty* prop, struct icalattachtype v) +void icalproperty_set_xlicclustercount(icalproperty* prop, int v) { icalvalue *value; icalerror_check_arg_rv( (prop!=0),"prop"); - value = icalvalue_new_attach(v); + value = icalvalue_new_integer(v); icalproperty_set_value(prop,value); } -struct icalattachtype icalproperty_get_attach(icalproperty* prop) +int icalproperty_get_xlicclustercount(icalproperty* prop) { icalvalue *value; icalerror_check_arg( (prop!=0),"prop"); value = icalproperty_get_value(prop); - return icalvalue_get_attach(value); + return icalvalue_get_integer(value); } -/* X-LIC-CLUSTERCOUNT */ +/* ATTACH */ -icalproperty* icalproperty_new_xlicclustercount(int v) +icalproperty* icalproperty_new_attach(struct icalattachtype v) { - struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICCLUSTERCOUNT_PROPERTY); + struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_ATTACH_PROPERTY); - icalproperty_set_xlicclustercount((icalproperty*)impl,v); + icalproperty_set_attach((icalproperty*)impl,v); return (icalproperty*)impl; } -icalproperty* icalproperty_vanew_xlicclustercount(int v, ...) +icalproperty* icalproperty_vanew_attach(struct icalattachtype v, ...) { va_list args; - struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICCLUSTERCOUNT_PROPERTY); + struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_ATTACH_PROPERTY); - icalproperty_set_xlicclustercount((icalproperty*)impl,v); + icalproperty_set_attach((icalproperty*)impl,v); va_start(args,v); icalproperty_add_parameters(impl, args); @@ -2562,27 +2881,27 @@ icalproperty* icalproperty_vanew_xlicclustercount(int v, ...) return (icalproperty*)impl; } -void icalproperty_set_xlicclustercount(icalproperty* prop, int v) +void icalproperty_set_attach(icalproperty* prop, struct icalattachtype v) { icalvalue *value; icalerror_check_arg_rv( (prop!=0),"prop"); - value = icalvalue_new_integer(v); + value = icalvalue_new_attach(v); icalproperty_set_value(prop,value); } -int icalproperty_get_xlicclustercount(icalproperty* prop) +struct icalattachtype icalproperty_get_attach(icalproperty* prop) { icalvalue *value; icalerror_check_arg( (prop!=0),"prop"); value = icalproperty_get_value(prop); - return icalvalue_get_integer(value); + return icalvalue_get_attach(value); } /* EXRULE */ @@ -2891,6 +3210,59 @@ struct icalgeotype icalproperty_get_geo(icalproperty* prop) return icalvalue_get_geo(value); } +/* X-LIC-MIMECHARSET */ + +icalproperty* icalproperty_new_xlicmimecharset(char* v) +{ + struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICMIMECHARSET_PROPERTY); + icalerror_check_arg_rz( (v!=0),"v"); + + + icalproperty_set_xlicmimecharset((icalproperty*)impl,v); + + return (icalproperty*)impl; +} + +icalproperty* icalproperty_vanew_xlicmimecharset(char* v, ...) +{ + va_list args; + struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_XLICMIMECHARSET_PROPERTY); + icalerror_check_arg_rz( (v!=0),"v"); + + + icalproperty_set_xlicmimecharset((icalproperty*)impl,v); + + va_start(args,v); + icalproperty_add_parameters(impl, args); + va_end(args); + + return (icalproperty*)impl; +} + +void icalproperty_set_xlicmimecharset(icalproperty* prop, char* v) +{ + icalvalue *value; + + icalerror_check_arg_rv( (v!=0),"v"); + + icalerror_check_arg_rv( (prop!=0),"prop"); + + value = icalvalue_new_string(v); + + icalproperty_set_value(prop,value); + +} + +char* icalproperty_get_xlicmimecharset(icalproperty* prop) +{ + icalvalue *value; + icalerror_check_arg( (prop!=0),"prop"); + + value = icalproperty_get_value(prop); + + return icalvalue_get_string(value); +} + /* COMPLETED */ icalproperty* icalproperty_new_completed(struct icaltimetype v) diff --git a/libical/src/libical/icalproperty.h b/libical/src/libical/icalproperty.h index 2cd28fe179..278c4d533f 100644 --- a/libical/src/libical/icalproperty.h +++ b/libical/src/libical/icalproperty.h @@ -5,20 +5,7 @@ $Id$ - (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. - - + (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org ======================================================================*/ @@ -63,7 +50,6 @@ icalvalue* icalproperty_get_value(icalproperty* prop); void icalproperty_set_x_name(icalproperty* prop, char* name); char* icalproperty_get_x_name(icalproperty* prop); - /* Everything below this line is machine generated. Do not edit. */ /* METHOD */ @@ -72,6 +58,12 @@ icalproperty* icalproperty_vanew_method(icalproperty_method v, ...); void icalproperty_set_method(icalproperty* prop, icalproperty_method v); icalproperty_method icalproperty_get_method(icalproperty* prop); +/* X-LIC-MIMECID */ +icalproperty* icalproperty_new_xlicmimecid(char* v); +icalproperty* icalproperty_vanew_xlicmimecid(char* v, ...); +void icalproperty_set_xlicmimecid(icalproperty* prop, char* v); +char* icalproperty_get_xlicmimecid(icalproperty* prop); + /* LAST-MODIFIED */ icalproperty* icalproperty_new_lastmodified(struct icaltimetype v); icalproperty* icalproperty_vanew_lastmodified(struct icaltimetype v, ...); @@ -144,6 +136,18 @@ icalproperty* icalproperty_vanew_contact(char* v, ...); void icalproperty_set_contact(icalproperty* prop, char* v); char* icalproperty_get_contact(icalproperty* prop); +/* X-LIC-MIMECONTENTTYPE */ +icalproperty* icalproperty_new_xlicmimecontenttype(char* v); +icalproperty* icalproperty_vanew_xlicmimecontenttype(char* v, ...); +void icalproperty_set_xlicmimecontenttype(icalproperty* prop, char* v); +char* icalproperty_get_xlicmimecontenttype(icalproperty* prop); + +/* X-LIC-MIMEOPTINFO */ +icalproperty* icalproperty_new_xlicmimeoptinfo(char* v); +icalproperty* icalproperty_vanew_xlicmimeoptinfo(char* v, ...); +void icalproperty_set_xlicmimeoptinfo(icalproperty* prop, char* v); +char* icalproperty_get_xlicmimeoptinfo(icalproperty* prop); + /* RELATED-TO */ icalproperty* icalproperty_new_relatedto(char* v); icalproperty* icalproperty_vanew_relatedto(char* v, ...); @@ -162,24 +166,30 @@ icalproperty* icalproperty_vanew_comment(char* v, ...); void icalproperty_set_comment(icalproperty* prop, char* v); char* icalproperty_get_comment(icalproperty* prop); -/* TRIGGER */ -icalproperty* icalproperty_new_trigger(union icaltriggertype v); -icalproperty* icalproperty_vanew_trigger(union icaltriggertype v, ...); -void icalproperty_set_trigger(icalproperty* prop, union icaltriggertype v); -union icaltriggertype icalproperty_get_trigger(icalproperty* prop); - /* X-LIC-ERROR */ icalproperty* icalproperty_new_xlicerror(char* v); icalproperty* icalproperty_vanew_xlicerror(char* v, ...); void icalproperty_set_xlicerror(icalproperty* prop, char* v); char* icalproperty_get_xlicerror(icalproperty* prop); +/* TRIGGER */ +icalproperty* icalproperty_new_trigger(union icaltriggertype v); +icalproperty* icalproperty_vanew_trigger(union icaltriggertype v, ...); +void icalproperty_set_trigger(icalproperty* prop, union icaltriggertype v); +union icaltriggertype icalproperty_get_trigger(icalproperty* prop); + /* CLASS */ icalproperty* icalproperty_new_class(char* v); icalproperty* icalproperty_vanew_class(char* v, ...); void icalproperty_set_class(icalproperty* prop, char* v); char* icalproperty_get_class(icalproperty* prop); +/* X */ +icalproperty* icalproperty_new_x(char* v); +icalproperty* icalproperty_vanew_x(char* v, ...); +void icalproperty_set_x(icalproperty* prop, char* v); +char* icalproperty_get_x(icalproperty* prop); + /* TZOFFSETTO */ icalproperty* icalproperty_new_tzoffsetto(int v); icalproperty* icalproperty_vanew_tzoffsetto(int v, ...); @@ -192,6 +202,12 @@ icalproperty* icalproperty_vanew_transp(char* v, ...); void icalproperty_set_transp(icalproperty* prop, char* v); char* icalproperty_get_transp(icalproperty* prop); +/* X-LIC-MIMEENCODING */ +icalproperty* icalproperty_new_xlicmimeencoding(char* v); +icalproperty* icalproperty_vanew_xlicmimeencoding(char* v, ...); +void icalproperty_set_xlicmimeencoding(icalproperty* prop, char* v); +char* icalproperty_get_xlicmimeencoding(icalproperty* prop); + /* SEQUENCE */ icalproperty* icalproperty_new_sequence(int v); icalproperty* icalproperty_vanew_sequence(int v, ...); @@ -288,24 +304,30 @@ icalproperty* icalproperty_vanew_rdate(struct icalperiodtype v, ...); void icalproperty_set_rdate(icalproperty* prop, struct icalperiodtype v); struct icalperiodtype icalproperty_get_rdate(icalproperty* prop); +/* X-LIC-MIMEFILENAME */ +icalproperty* icalproperty_new_xlicmimefilename(char* v); +icalproperty* icalproperty_vanew_xlicmimefilename(char* v, ...); +void icalproperty_set_xlicmimefilename(icalproperty* prop, char* v); +char* icalproperty_get_xlicmimefilename(icalproperty* prop); + /* URL */ icalproperty* icalproperty_new_url(char* v); icalproperty* icalproperty_vanew_url(char* v, ...); void icalproperty_set_url(icalproperty* prop, char* v); char* icalproperty_get_url(icalproperty* prop); -/* ATTACH */ -icalproperty* icalproperty_new_attach(struct icalattachtype v); -icalproperty* icalproperty_vanew_attach(struct icalattachtype v, ...); -void icalproperty_set_attach(icalproperty* prop, struct icalattachtype v); -struct icalattachtype icalproperty_get_attach(icalproperty* prop); - /* X-LIC-CLUSTERCOUNT */ icalproperty* icalproperty_new_xlicclustercount(int v); icalproperty* icalproperty_vanew_xlicclustercount(int v, ...); void icalproperty_set_xlicclustercount(icalproperty* prop, int v); int icalproperty_get_xlicclustercount(icalproperty* prop); +/* ATTACH */ +icalproperty* icalproperty_new_attach(struct icalattachtype v); +icalproperty* icalproperty_vanew_attach(struct icalattachtype v, ...); +void icalproperty_set_attach(icalproperty* prop, struct icalattachtype v); +struct icalattachtype icalproperty_get_attach(icalproperty* prop); + /* EXRULE */ icalproperty* icalproperty_new_exrule(struct icalrecurrencetype v); icalproperty* icalproperty_vanew_exrule(struct icalrecurrencetype v, ...); @@ -342,6 +364,12 @@ icalproperty* icalproperty_vanew_geo(struct icalgeotype v, ...); void icalproperty_set_geo(icalproperty* prop, struct icalgeotype v); struct icalgeotype icalproperty_get_geo(icalproperty* prop); +/* X-LIC-MIMECHARSET */ +icalproperty* icalproperty_new_xlicmimecharset(char* v); +icalproperty* icalproperty_vanew_xlicmimecharset(char* v, ...); +void icalproperty_set_xlicmimecharset(icalproperty* prop, char* v); +char* icalproperty_get_xlicmimecharset(icalproperty* prop); + /* COMPLETED */ icalproperty* icalproperty_new_completed(struct icaltimetype v); icalproperty* icalproperty_vanew_completed(struct icaltimetype v, ...); diff --git a/libical/src/libical/icalrestriction.c b/libical/src/libical/icalrestriction.c index 8371e87545..be0e292d28 100644 --- a/libical/src/libical/icalrestriction.c +++ b/libical/src/libical/icalrestriction.c @@ -2,20 +2,7 @@ /* ====================================================================== File: icalrestriction.c - (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. - - + (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org ======================================================================*/ #ifdef HAVE_CONFIG_H @@ -1466,7 +1453,7 @@ icalrestriction_property_record icalrestriction_property_records[] = { {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_URL_PROPERTY,ICAL_RESTRICTION_ZERO,0}, {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_VERSION_PROPERTY,ICAL_RESTRICTION_ZERO,0}, {ICAL_METHOD_NONE,ICAL_XPROCEDUREALARM_COMPONENT,ICAL_X_PROPERTY,ICAL_RESTRICTION_ZEROPLUS,0}, - {ICAL_METHOD_NONE,ICAL_NO_COMPONENT,ICAL_NO_PROPERTY,ICAL_RESTRICTION_NONE} + {ICAL_METHOD_NONE,ICAL_NO_COMPONENT,ICAL_NO_PROPERTY,ICAL_RESTRICTION_NONE,0} }; icalrestriction_component_record icalrestriction_component_records[] = { {ICAL_METHOD_PUBLISH,ICAL_VEVENT_COMPONENT,ICAL_VALARM_COMPONENT,ICAL_RESTRICTION_ZEROPLUS,0}, @@ -1596,5 +1583,5 @@ icalrestriction_component_record icalrestriction_component_records[] = { {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_VEVENT_COMPONENT,ICAL_RESTRICTION_ZERO,0}, {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_VFREEBUSY_COMPONENT,ICAL_RESTRICTION_ZERO,0}, {ICAL_METHOD_CANCEL,ICAL_VJOURNAL_COMPONENT,ICAL_VTODO_COMPONENT,ICAL_RESTRICTION_ZERO,0}, - {ICAL_METHOD_NONE,ICAL_NO_COMPONENT,ICAL_NO_COMPONENT,ICAL_RESTRICTION_NONE} + {ICAL_METHOD_NONE,ICAL_NO_COMPONENT,ICAL_NO_COMPONENT,ICAL_RESTRICTION_NONE,0} }; diff --git a/libical/src/libical/icalrestriction.h b/libical/src/libical/icalrestriction.h index ca4beeea7b..12421d0f32 100644 --- a/libical/src/libical/icalrestriction.h +++ b/libical/src/libical/icalrestriction.h @@ -6,20 +6,19 @@ $Id$ - (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 + (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: diff --git a/libical/src/libical/icaltypes.c b/libical/src/libical/icaltypes.c index b60333887e..c7017eb2af 100644 --- a/libical/src/libical/icaltypes.c +++ b/libical/src/libical/icaltypes.c @@ -7,20 +7,19 @@ $Locker$ - (C) COPYRIGHT 1999 Eric Busboom - http://www.softwarestudio.org + (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. + 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 author is Eric Busboom The original code is icaltypes.c ======================================================================*/ @@ -31,9 +30,9 @@ #include "icaltypes.h" #include "icalerror.h" #include "icalmemory.h" -#include <stdlib.h> /* for malloc */ +#include <stdlib.h> /* for malloc and abs() */ #include <errno.h> /* for errno */ -#include <string.h> /* for strdup */ +#include <string.h> /* for icalmemory_strdup */ #include <assert.h> #include <limits.h> /* for SHRT_MAX */ @@ -106,9 +105,9 @@ void icalattachtype_set_url(struct icalattachtype* v, char* url) free (v->url); } - v->url = strdup(url); + v->url = icalmemory_strdup(url); - /* HACK This routine should do something if strdup returns NULL */ + /* HACK This routine should do something if icalmemory_strdup returns NULL */ } @@ -159,28 +158,6 @@ icalperiodtype_duration (struct icalperiodtype period); time_t icalperiodtype_end (struct icalperiodtype period); -struct icaltimetype -icaltimetype_from_timet(time_t v, int date) -{ - struct icaltimetype tt; - struct tm t; - time_t tm = time(&v); - -/* HACK Does not properly consider timezone */ - t = *(gmtime(&tm)); - - tt.second = t.tm_sec; - tt.minute = t.tm_min; - tt.hour = t.tm_hour; - tt.day = t.tm_mday; - tt.month = t.tm_mon + 1; - tt.year = t.tm_year+ 1900; - - tt.is_utc = 1; - tt.is_date = date; - - return tt; -} /* From Russel Steinthal */ time_t icaldurationtype_as_timet(struct icaldurationtype dur) @@ -210,7 +187,7 @@ struct icaldurationtype icaldurationtype_from_timet(time_t t) return dur; } - + void icalrecurrencetype_clear(struct icalrecurrencetype *recur) { memset(recur,ICAL_RECURRENCE_ARRAY_MAX_BYTE, @@ -218,16 +195,34 @@ void icalrecurrencetype_clear(struct icalrecurrencetype *recur) recur->week_start = ICAL_NO_WEEKDAY; recur->freq = ICAL_NO_RECURRENCE; - recur->interval = 0; - recur->until.year = 0; + 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 + */ + +enum icalrecurrencetype_weekday icalrecurrencetype_day_day_of_week(short day) +{ + return abs(day)%8; +} + +short icalrecurrencetype_day_position(short day) +{ + return (day-icalrecurrencetype_day_day_of_week(day))/8; +} + struct icalreqstattype icalreqstattype_from_string(char* str) { char *p1,*p2; - size_t len; struct icalreqstattype stat; int major, minor; @@ -235,7 +230,6 @@ struct icalreqstattype icalreqstattype_from_string(char* str) stat.code = ICAL_UNKNOWN_STATUS; stat.debug = 0; - stat.desc = 0; /* Get the status numbers */ @@ -278,7 +272,6 @@ struct icalreqstattype icalreqstattype_from_string(char* str) char* icalreqstattype_as_string(struct icalreqstattype stat) { - char format[20]; char *temp; temp = (char*)icalmemory_tmp_buffer(TEMP_MAX); diff --git a/libical/src/libical/icaltypes.h b/libical/src/libical/icaltypes.h index 77a67fae80..1130ab2457 100644 --- a/libical/src/libical/icaltypes.h +++ b/libical/src/libical/icaltypes.h @@ -4,20 +4,19 @@ 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 + (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 ======================================================================*/ @@ -27,6 +26,7 @@ #include <time.h> #include "icalenums.h" /* for recurrence enums */ +#include "icaltime.h" /* This type type should probably be an opaque type... */ struct icalattachtype @@ -67,21 +67,6 @@ struct icalgeotype float lon; }; -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. */ -}; - -struct icaltimetype icaltimetype_from_timet(time_t v, int is_date); /* See RFC 2445 Section 4.3.10, RECUR Value, for an explaination of @@ -112,7 +97,7 @@ struct icalrecurrencetype short by_second[61]; short by_minute[61]; short by_hour[25]; - short by_day[8]; + short by_day[8]; /* Encoded value, see below */ short by_month_day[32]; short by_year_day[367]; short by_week_no[54]; @@ -123,6 +108,17 @@ struct icalrecurrencetype void icalrecurrencetype_clear(struct icalrecurrencetype *r); +/* 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 */ + +/* 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); + struct icaldurationtype { unsigned int days; @@ -171,7 +167,7 @@ operating on a the value of a request_status property. */ struct icalreqstattype { - icalrequeststatus code; + icalrequeststatus code; char* desc; char* debug; }; diff --git a/libical/src/libical/icalvalue.c b/libical/src/libical/icalvalue.c index 79eb8d827a..db0e58efe8 100644 --- a/libical/src/libical/icalvalue.c +++ b/libical/src/libical/icalvalue.c @@ -5,21 +5,19 @@ $Id$ + (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org - (C) COPYRIGHT 1999 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 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 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 author is Eric Busboom The original code is icalvalue.c Contributions from: @@ -49,7 +47,7 @@ #include <limits.h> /* for SHRT_MAX */ #if _MAC_OS_ -#include "strdup.h" +#include "icalmemory_strdup.h" #endif #define TMP_BUF_SIZE 1024 @@ -88,8 +86,10 @@ struct icalvalue_impl { /*struct icaltimetype v_datetime;*/ /*struct icaltimetype v_datetimedate;*/ - /* struct icalrecurrencetype was once a value in this - union, but it contributes 2000 bytes to every*/ + /* 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; union icaltriggertype v_trigger; @@ -159,7 +159,7 @@ icalvalue* icalvalue_new_clone(icalvalue* value){ case ICAL_URI_VALUE: { if (old->data.v_string != 0) { - new->data.v_string=strdup(old->data.v_string); + new->data.v_string=icalmemory_strdup(old->data.v_string); if ( new->data.v_string == 0 ) { return 0; @@ -195,7 +195,7 @@ icalvalue* icalvalue_new_clone(icalvalue* value){ return new; } -char* strdup_and_dequote(char* str) +char* icalmemory_strdup_and_dequote(char* str) { char* p; char* out = (char*)malloc(sizeof(char) * strlen(str) +1); @@ -343,7 +343,7 @@ icalvalue* icalvalue_new_from_string_with_error(icalvalue_kind kind,char* str,ic case ICAL_TEXT_VALUE: { - char* dequoted_str = strdup_and_dequote(str); + char* dequoted_str = icalmemory_strdup_and_dequote(str); value = icalvalue_new_text(dequoted_str); free(dequoted_str); break; @@ -663,8 +663,11 @@ char* icalvalue_recur_as_ical_string(icalvalue* value) for(i=0; i< limit && array[i] != ICAL_RECURRENCE_ARRAY_MAX; i++){ if (j == 3) { /* BYDAY */ - icalmemory_append_string(&str,&str_p,&buf_sz, - icalenum_weekday_to_string(array[i])); + short dow = icalrecurrencetype_day_day_of_week(array[i]); + char *daystr = icalenum_weekday_to_string(dow); + + /* HACK, does not correctly handle the integer value */ + icalmemory_append_string(&str,&str_p,&buf_sz,daystr); } else { sprintf(temp,"%d",array[i]); icalmemory_append_string(&str,&str_p,&buf_sz, temp); @@ -1369,6 +1372,7 @@ icalvalue_set_attach(icalvalue* value, struct icalattachtype v) icalerror_check_value_type(value, ICAL_ATTACH_VALUE); impl = (struct icalvalue_impl*)value; + impl->data.v_attach = v; } @@ -1405,6 +1409,8 @@ icalvalue_set_binary(icalvalue* value, char* v) icalerror_check_value_type(value, ICAL_BINARY_VALUE); impl = (struct icalvalue_impl*)value; + if(impl->data.v_string!=0) {free(impl->data.v_string);} + impl->data.v_string = strdup(v); if (impl->data.v_string == 0){ @@ -1444,6 +1450,7 @@ icalvalue_set_boolean(icalvalue* value, int v) icalerror_check_value_type(value, ICAL_BOOLEAN_VALUE); impl = (struct icalvalue_impl*)value; + impl->data.v_int = v; } @@ -1480,6 +1487,8 @@ icalvalue_set_caladdress(icalvalue* value, char* v) icalerror_check_value_type(value, ICAL_CALADDRESS_VALUE); impl = (struct icalvalue_impl*)value; + if(impl->data.v_string!=0) {free(impl->data.v_string);} + impl->data.v_string = strdup(v); if (impl->data.v_string == 0){ @@ -1519,6 +1528,7 @@ icalvalue_set_date(icalvalue* value, struct icaltimetype v) icalerror_check_value_type(value, ICAL_DATE_VALUE); impl = (struct icalvalue_impl*)value; + impl->data.v_time = v; } @@ -1553,6 +1563,7 @@ icalvalue_set_datetime(icalvalue* value, struct icaltimetype v) icalerror_check_value_type(value, ICAL_DATETIME_VALUE); impl = (struct icalvalue_impl*)value; + impl->data.v_time = v; } @@ -1587,6 +1598,7 @@ icalvalue_set_datetimedate(icalvalue* value, struct icaltimetype v) icalerror_check_value_type(value, ICAL_DATETIMEDATE_VALUE); impl = (struct icalvalue_impl*)value; + impl->data.v_time = v; } @@ -1621,6 +1633,7 @@ icalvalue_set_datetimeperiod(icalvalue* value, struct icalperiodtype v) icalerror_check_value_type(value, ICAL_DATETIMEPERIOD_VALUE); impl = (struct icalvalue_impl*)value; + impl->data.v_period = v; } @@ -1655,6 +1668,7 @@ icalvalue_set_duration(icalvalue* value, struct icaldurationtype v) icalerror_check_value_type(value, ICAL_DURATION_VALUE); impl = (struct icalvalue_impl*)value; + impl->data.v_duration = v; } @@ -1689,6 +1703,7 @@ icalvalue_set_float(icalvalue* value, float v) icalerror_check_value_type(value, ICAL_FLOAT_VALUE); impl = (struct icalvalue_impl*)value; + impl->data.v_float = v; } @@ -1723,6 +1738,7 @@ icalvalue_set_geo(icalvalue* value, struct icalgeotype v) icalerror_check_value_type(value, ICAL_GEO_VALUE); impl = (struct icalvalue_impl*)value; + impl->data.v_geo = v; } @@ -1757,6 +1773,7 @@ icalvalue_set_integer(icalvalue* value, int v) icalerror_check_value_type(value, ICAL_INTEGER_VALUE); impl = (struct icalvalue_impl*)value; + impl->data.v_int = v; } @@ -1791,6 +1808,7 @@ icalvalue_set_method(icalvalue* value, icalproperty_method v) icalerror_check_value_type(value, ICAL_METHOD_VALUE); impl = (struct icalvalue_impl*)value; + impl->data.v_method = v; } @@ -1825,6 +1843,7 @@ icalvalue_set_period(icalvalue* value, struct icalperiodtype v) icalerror_check_value_type(value, ICAL_PERIOD_VALUE); impl = (struct icalvalue_impl*)value; + impl->data.v_period = v; } @@ -1837,7 +1856,6 @@ icalvalue_get_period(icalvalue* value) return ((struct icalvalue_impl*)value)->data.v_period; } - icalvalue* icalvalue_new_string (char* v) { @@ -1861,6 +1879,8 @@ icalvalue_set_string(icalvalue* value, char* v) icalerror_check_value_type(value, ICAL_STRING_VALUE); impl = (struct icalvalue_impl*)value; + if(impl->data.v_string!=0) {free(impl->data.v_string);} + impl->data.v_string = strdup(v); if (impl->data.v_string == 0){ @@ -1878,6 +1898,7 @@ icalvalue_get_string(icalvalue* value) return ((struct icalvalue_impl*)value)->data.v_string; } + icalvalue* icalvalue_new_text (char* v) { @@ -1901,6 +1922,8 @@ icalvalue_set_text(icalvalue* value, char* v) icalerror_check_value_type(value, ICAL_TEXT_VALUE); impl = (struct icalvalue_impl*)value; + if(impl->data.v_string!=0) {free(impl->data.v_string);} + impl->data.v_string = strdup(v); if (impl->data.v_string == 0){ @@ -1940,6 +1963,7 @@ icalvalue_set_time(icalvalue* value, struct icaltimetype v) icalerror_check_value_type(value, ICAL_TIME_VALUE); impl = (struct icalvalue_impl*)value; + impl->data.v_time = v; } @@ -1974,6 +1998,7 @@ icalvalue_set_trigger(icalvalue* value, union icaltriggertype v) icalerror_check_value_type(value, ICAL_TRIGGER_VALUE); impl = (struct icalvalue_impl*)value; + impl->data.v_trigger = v; } @@ -2010,6 +2035,8 @@ icalvalue_set_uri(icalvalue* value, char* v) icalerror_check_value_type(value, ICAL_URI_VALUE); impl = (struct icalvalue_impl*)value; + if(impl->data.v_string!=0) {free(impl->data.v_string);} + impl->data.v_string = strdup(v); if (impl->data.v_string == 0){ @@ -2049,6 +2076,7 @@ icalvalue_set_utcoffset(icalvalue* value, int v) icalerror_check_value_type(value, ICAL_UTCOFFSET_VALUE); impl = (struct icalvalue_impl*)value; + impl->data.v_int = v; } @@ -2085,6 +2113,8 @@ icalvalue_set_query(icalvalue* value, char* v) icalerror_check_value_type(value, ICAL_QUERY_VALUE); impl = (struct icalvalue_impl*)value; + if(impl->data.v_string!=0) {free(impl->data.v_string);} + impl->data.v_string = strdup(v); if (impl->data.v_string == 0){ diff --git a/libical/src/libical/icalvalue.h b/libical/src/libical/icalvalue.h index ec7457d6aa..18c15abaf4 100644 --- a/libical/src/libical/icalvalue.h +++ b/libical/src/libical/icalvalue.h @@ -9,20 +9,19 @@ - (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 + (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 ======================================================================*/ diff --git a/libical/src/libical/icalyacc.c b/libical/src/libical/icalyacc.c index 46de31370d..04999747db 100644 --- a/libical/src/libical/icalyacc.c +++ b/libical/src/libical/icalyacc.c @@ -145,20 +145,19 @@ $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 + (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 icalitip.y @@ -189,6 +188,7 @@ struct icaldurationtype duration; struct icalrecurrencetype recur; short skiplist[367]; short skippos; +int dow_pos; void copy_list(short* array, size_t size); void clear_recur(); @@ -207,7 +207,7 @@ void ical_yy_error(char *s); /* Don't know why I need this.... */ VALUEs, that is, ) correctly. */ -#line 75 "icalyacc.y" +#line 76 "icalyacc.y" typedef union { float v_float; int v_int; @@ -274,7 +274,7 @@ typedef union { -#define YYFINAL 135 +#define YYFINAL 137 #define YYFLAG -32768 #define YYNTBASE 141 @@ -329,10 +329,10 @@ static const short yyprhs[] = { 0, 42, 45, 48, 51, 54, 57, 61, 64, 68, 71, 74, 75, 77, 79, 83, 87, 91, 101, 108, 112, 116, 120, 124, 128, 132, 136, 138, 140, 142, 144, - 146, 148, 150, 152, 155, 159, 161, 165, 169, 173, - 177, 181, 185, 189, 193, 197, 201, 205, 209, 213, - 217, 221, 225, 229, 233, 237, 241, 245, 246, 250, - 253, 255, 257, 261 + 146, 148, 150, 152, 155, 159, 164, 166, 170, 174, + 178, 182, 186, 190, 194, 198, 202, 206, 210, 214, + 218, 222, 226, 230, 234, 238, 242, 246, 250, 251, + 255, 258, 260, 262, 266 }; static const short yyrhs[] = { 142, @@ -351,33 +351,33 @@ static const short yyrhs[] = { 142, 8, 26, 0, 16, 8, 30, 0, 16, 8, 28, 0, 16, 8, 32, 0, 39, 0, 37, 0, 40, 0, 41, 0, 42, 0, 43, 0, 38, 0, 159, - 0, 3, 159, 0, 160, 11, 159, 0, 3, 0, - 161, 11, 3, 0, 33, 8, 3, 0, 36, 8, - 39, 0, 36, 8, 37, 0, 36, 8, 40, 0, - 36, 8, 41, 0, 36, 8, 42, 0, 36, 8, - 43, 0, 36, 8, 38, 0, 22, 8, 161, 0, - 19, 8, 161, 0, 18, 8, 161, 0, 17, 8, - 160, 0, 20, 8, 161, 0, 21, 8, 161, 0, - 25, 8, 161, 0, 24, 8, 161, 0, 23, 8, - 161, 0, 35, 8, 147, 0, 35, 8, 144, 0, - 34, 8, 3, 0, 0, 163, 12, 162, 0, 158, - 163, 0, 137, 0, 138, 0, 165, 4, 4, 0, - 165, 4, 4, 4, 0 + 0, 3, 159, 0, 160, 11, 159, 0, 160, 11, + 3, 159, 0, 3, 0, 161, 11, 3, 0, 33, + 8, 3, 0, 36, 8, 39, 0, 36, 8, 37, + 0, 36, 8, 40, 0, 36, 8, 41, 0, 36, + 8, 42, 0, 36, 8, 43, 0, 36, 8, 38, + 0, 22, 8, 161, 0, 19, 8, 161, 0, 18, + 8, 161, 0, 17, 8, 160, 0, 20, 8, 161, + 0, 21, 8, 161, 0, 25, 8, 161, 0, 24, + 8, 161, 0, 23, 8, 161, 0, 35, 8, 147, + 0, 35, 8, 144, 0, 34, 8, 3, 0, 0, + 163, 12, 162, 0, 158, 163, 0, 137, 0, 138, + 0, 165, 4, 4, 0, 165, 4, 4, 4, 0 }; #endif #if YYDEBUG != 0 static const short yyrline[] = { 0, - 158, 160, 161, 162, 163, 164, 165, 166, 167, 173, - 175, 178, 181, 196, 198, 201, 203, 205, 221, 222, - 224, 229, 232, 235, 239, 243, 248, 252, 257, 262, - 267, 270, 273, 277, 282, 287, 296, 317, 349, 351, - 352, 353, 354, 355, 356, 360, 362, 363, 364, 365, - 366, 367, 371, 373, 374, 377, 379, 382, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 397, 398, 399, 400, 403, 406, 410, 412, 414, - 422, 423, 425, 431 + 159, 161, 162, 163, 164, 165, 166, 167, 168, 174, + 176, 179, 182, 197, 199, 202, 204, 206, 222, 223, + 225, 230, 233, 236, 240, 244, 249, 253, 258, 263, + 268, 271, 274, 278, 283, 288, 297, 318, 350, 352, + 353, 354, 355, 356, 357, 361, 364, 366, 368, 370, + 372, 374, 379, 381, 382, 383, 386, 388, 391, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 412, 415, 419, 421, + 423, 431, 432, 434, 440 }; #endif @@ -415,10 +415,10 @@ static const short yyr1[] = { 0, 149, 150, 150, 150, 151, 151, 152, 152, 153, 154, 155, 155, 155, 156, 156, 156, 157, 157, 158, 158, 158, 158, 158, 158, 158, 159, 159, 159, 159, 159, - 159, 159, 160, 160, 160, 161, 161, 162, 162, 162, + 159, 159, 160, 160, 160, 160, 161, 161, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 163, 163, 164, - 165, 165, 166, 166 + 162, 162, 162, 162, 162, 162, 162, 162, 163, 163, + 164, 165, 165, 166, 166 }; static const short yyr2[] = { 0, @@ -427,55 +427,55 @@ static const short yyr2[] = { 0, 2, 2, 2, 2, 2, 3, 2, 3, 2, 2, 0, 1, 1, 3, 3, 3, 9, 6, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, - 1, 1, 1, 2, 3, 1, 3, 3, 3, 3, + 1, 1, 1, 2, 3, 4, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 0, 3, 2, - 1, 1, 3, 4 + 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, + 2, 1, 1, 3, 4 }; static const short yydefact[] = { 0, 9, 13, 11, 12, 0, 10, 32, 33, 1, 2, - 3, 4, 0, 5, 6, 78, 7, 0, 8, 0, - 0, 0, 80, 0, 14, 42, 40, 44, 39, 43, - 41, 45, 0, 0, 34, 36, 35, 19, 0, 83, + 3, 4, 0, 5, 6, 79, 7, 0, 8, 0, + 0, 0, 81, 0, 14, 42, 40, 44, 39, 43, + 41, 45, 0, 0, 34, 36, 35, 19, 0, 84, 15, 18, 21, 30, 0, 22, 23, 24, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 79, 84, 31, 25, 27, 29, 0, 0, + 0, 0, 80, 85, 31, 25, 27, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 38, 0, 26, 0, 28, 0, - 47, 52, 46, 48, 49, 50, 51, 53, 69, 56, - 68, 67, 70, 71, 66, 74, 73, 72, 58, 77, - 13, 76, 75, 60, 65, 59, 61, 62, 63, 64, - 0, 54, 0, 0, 0, 16, 55, 57, 14, 17, - 37, 18, 0, 0, 0 + 47, 52, 46, 48, 49, 50, 51, 53, 70, 57, + 69, 68, 71, 72, 67, 75, 74, 73, 59, 78, + 13, 77, 76, 61, 66, 60, 62, 63, 64, 65, + 0, 54, 0, 0, 0, 16, 0, 55, 58, 14, + 17, 37, 56, 18, 0, 0, 0 }; -static const short yydefgoto[] = { 133, - 9, 10, 11, 42, 131, 12, 35, 36, 37, 46, +static const short yydefgoto[] = { 135, + 9, 10, 11, 42, 132, 12, 35, 36, 37, 46, 47, 48, 38, 13, 14, 15, 16, 98, 99, 101, 63, 23, 17, 18, 19 }; static const short yypact[] = { -1, --32768, -123,-32768,-32768, 1,-32768, 3, 6,-32768,-32768, --32768,-32768, -127,-32768,-32768,-32768,-32768, 64,-32768, 66, - -10, -2, 58, 67, -58,-32768,-32768,-32768,-32768,-32768, --32768,-32768, -128, 70,-32768,-32768,-32768, -55, 28, 71, --32768, -64,-32768,-32768, -68,-32768,-32768,-32768,-32768, 69, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83,-32768,-32768, 2, 89, 90,-32768, 0, 91, - 91, 91, 91, 91, 91, 91, 91, 92, 93, 94, - -14, -51,-32768,-32768,-32768, -36,-32768, -56,-32768, -7, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 88,-32768, - 95, 95, 95, 95, 95, 95, 95, 95,-32768,-32768, - -29,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, - 98,-32768, -7, 99, 100, -26,-32768,-32768, -58,-32768, --32768,-32768, 105, 107,-32768 +-32768, -123,-32768,-32768, 1,-32768, 3, 8,-32768,-32768, +-32768,-32768, -122,-32768,-32768,-32768,-32768, 12,-32768, 33, + -7, -2, 40, 49, -119,-32768,-32768,-32768,-32768,-32768, +-32768,-32768, -128, 51,-32768,-32768,-32768, -46, 39, 80, +-32768, -55,-32768,-32768, -100,-32768,-32768,-32768,-32768, 78, + 79, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91,-32768,-32768, 2, 97, 98,-32768, 0, 99, + 99, 99, 99, 99, 99, 99, 99, 100, 101, 102, + -11, -41,-32768,-32768,-32768, -28,-32768, -27,-32768, 28, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 96,-32768, + 103, 103, 103, 103, 103, 103, 103, 103,-32768,-32768, + -20,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, + 107,-32768, 7, 108, 109, -17, 28,-32768,-32768, -119, +-32768,-32768,-32768,-32768, 115, 116,-32768 }; static const short yypgoto[] = {-32768, --32768,-32768, 29, -21,-32768, 30,-32768,-32768, 84,-32768, - 45, 46,-32768,-32768, 47,-32768,-32768, -79,-32768, -17, +-32768,-32768, 37, -12,-32768, 41,-32768,-32768, 93,-32768, + 53, 55,-32768,-32768, 58,-32768,-32768, -72,-32768, 5, -32768,-32768,-32768,-32768,-32768 }; @@ -484,37 +484,37 @@ static const short yypgoto[] = {-32768, static const short yytable[] = { 1, - 33, 2, 90, 43, 82, 20, -81, 44, 21, -82, - 122, 22, 3, 4, 5, 26, 27, 28, 29, 30, - 31, 32, 114, 115, 116, 117, 118, 119, 120, 91, - 92, 93, 94, 95, 96, 97, 91, 92, 93, 94, - 95, 96, 97, 127, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 102, 103, 104, 105, 106, 107, 108, - 59, 60, 61, 62, 66, 67, 68, 24, 25, 39, - 40, 41, 45, 34, 64, 65, 69, 121, 68, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 86, 88, 100, 109, 110, 111, 67, 123, 125, - 126, 128, 129, 130, 134, 124, 135, 132, 112, 113, - 87, 85, 89, 0, 0, 0, 0, 0, 0, 0, - 0, 49, 0, 0, 0, 0, 34, 0, 0, 6, - 0, 0, 0, 0, 0, 7, 8, -31, 83, 84 + 33, 2, 90, 43, 82, 20, -82, 44, 21, 127, + 41, -83, 3, 4, 5, 24, 22, 122, 26, 27, + 28, 29, 30, 31, 32, 114, 115, 116, 117, 118, + 119, 120, 66, 67, 68, 25, 91, 92, 93, 94, + 95, 96, 97, 91, 92, 93, 94, 95, 96, 97, + 128, 39, 40, 45, 133, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 91, 92, 93, 94, 95, 96, + 97, 59, 60, 61, 62, 102, 103, 104, 105, 106, + 107, 108, 34, 64, 65, 69, 70, 121, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 86, + 88, 100, 109, 110, 111, 67, 123, 68, 125, 126, + 129, 130, 131, 124, 136, 137, 112, 134, 87, 0, + 113, 89, 85, 0, 0, 0, 34, 0, 0, 6, + 49, 0, 0, 0, 0, 7, 8, -31, 83, 84 }; static const short yycheck[] = { 1, - 3, 3, 3, 132, 3, 129, 4, 136, 8, 4, - 90, 139, 14, 15, 16, 26, 27, 28, 29, 30, - 31, 32, 37, 38, 39, 40, 41, 42, 43, 37, - 38, 39, 40, 41, 42, 43, 37, 38, 39, 40, - 41, 42, 43, 123, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 71, 72, 73, 74, 75, 76, 77, - 33, 34, 35, 36, 133, 134, 135, 4, 3, 12, - 4, 130, 3, 129, 4, 140, 8, 129, 135, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 3, 3, 3, 3, 3, 3, 134, 11, 129, - 3, 3, 3, 130, 0, 11, 0, 129, 80, 80, - 66, 65, 67, -1, -1, -1, -1, -1, -1, -1, - -1, 38, -1, -1, -1, -1, 129, -1, -1, 131, - -1, -1, -1, -1, -1, 137, 138, 139, 137, 138 + 3, 3, 3, 132, 3, 129, 4, 136, 8, 3, + 130, 4, 14, 15, 16, 4, 139, 90, 26, 27, + 28, 29, 30, 31, 32, 37, 38, 39, 40, 41, + 42, 43, 133, 134, 135, 3, 37, 38, 39, 40, + 41, 42, 43, 37, 38, 39, 40, 41, 42, 43, + 123, 12, 4, 3, 127, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 37, 38, 39, 40, 41, 42, + 43, 33, 34, 35, 36, 71, 72, 73, 74, 75, + 76, 77, 129, 4, 140, 8, 8, 129, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 3, + 3, 3, 3, 3, 3, 134, 11, 135, 129, 3, + 3, 3, 130, 11, 0, 0, 80, 130, 66, -1, + 80, 67, 65, -1, -1, -1, 129, -1, -1, 131, + 38, -1, -1, -1, -1, 137, 138, 139, 137, 138 }; /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "/usr/lib/bison.simple" @@ -1060,7 +1060,7 @@ yyreduce: switch (yyn) { case 9: -#line 167 "icalyacc.y" +#line 168 "icalyacc.y" { icalparser_yy_value = 0; icalparser_clear_flex_input(); @@ -1068,15 +1068,15 @@ case 9: ; break;} case 11: -#line 177 "icalyacc.y" +#line 178 "icalyacc.y" { icalparser_yy_value = icalvalue_new_boolean(1); ; break;} case 12: -#line 179 "icalyacc.y" +#line 180 "icalyacc.y" { icalparser_yy_value = icalvalue_new_boolean(0); ; break;} case 13: -#line 182 "icalyacc.y" +#line 183 "icalyacc.y" { struct icaltimetype stm; @@ -1092,23 +1092,23 @@ case 13: ; break;} case 14: -#line 197 "icalyacc.y" +#line 198 "icalyacc.y" {utc = 0;; break;} case 15: -#line 198 "icalyacc.y" +#line 199 "icalyacc.y" {utc = 1;; break;} case 16: -#line 202 "icalyacc.y" +#line 203 "icalyacc.y" {utc_b = 0;; break;} case 17: -#line 203 "icalyacc.y" +#line 204 "icalyacc.y" {utc_b = 1;; break;} case 18: -#line 207 "icalyacc.y" +#line 208 "icalyacc.y" { struct icaltimetype stm; stm = fill_datetime(yyvsp[-3].v_string, yyvsp[-1].v_string); @@ -1120,100 +1120,100 @@ case 18: ; break;} case 21: -#line 225 "icalyacc.y" +#line 226 "icalyacc.y" { duration.weeks = atoi(yyvsp[-1].v_string); ; break;} case 22: -#line 230 "icalyacc.y" +#line 231 "icalyacc.y" { ; break;} case 23: -#line 233 "icalyacc.y" +#line 234 "icalyacc.y" { ; break;} case 24: -#line 236 "icalyacc.y" +#line 237 "icalyacc.y" { ; break;} case 25: -#line 240 "icalyacc.y" +#line 241 "icalyacc.y" { duration.hours = atoi(yyvsp[-1].v_string); ; break;} case 26: -#line 244 "icalyacc.y" +#line 245 "icalyacc.y" { duration.hours = atoi(yyvsp[-2].v_string); ; break;} case 27: -#line 249 "icalyacc.y" +#line 250 "icalyacc.y" { duration.minutes = atoi(yyvsp[-1].v_string); ; break;} case 28: -#line 253 "icalyacc.y" +#line 254 "icalyacc.y" { duration.minutes = atoi(yyvsp[-2].v_string); ; break;} case 29: -#line 258 "icalyacc.y" +#line 259 "icalyacc.y" { duration.seconds = atoi(yyvsp[-1].v_string); ; break;} case 30: -#line 263 "icalyacc.y" +#line 264 "icalyacc.y" { duration.days = atoi(yyvsp[-1].v_string); ; break;} case 31: -#line 268 "icalyacc.y" +#line 269 "icalyacc.y" { ; break;} case 32: -#line 271 "icalyacc.y" +#line 272 "icalyacc.y" { ; break;} case 33: -#line 274 "icalyacc.y" +#line 275 "icalyacc.y" { ; break;} case 34: -#line 278 "icalyacc.y" +#line 279 "icalyacc.y" { icalparser_yy_value = icalvalue_new_duration(duration); memset(&duration,0, sizeof(duration)); ; break;} case 35: -#line 283 "icalyacc.y" +#line 284 "icalyacc.y" { icalparser_yy_value = icalvalue_new_duration(duration); memset(&duration,0, sizeof(duration)); ; break;} case 36: -#line 288 "icalyacc.y" +#line 289 "icalyacc.y" { icalparser_yy_value = icalvalue_new_duration(duration); memset(&duration,0, sizeof(duration)); ; break;} case 37: -#line 297 "icalyacc.y" +#line 298 "icalyacc.y" { struct icalperiodtype p; @@ -1236,7 +1236,7 @@ case 37: ; break;} case 38: -#line 318 "icalyacc.y" +#line 319 "icalyacc.y" { struct icalperiodtype p; @@ -1265,175 +1265,194 @@ case 38: ; break;} case 39: -#line 350 "icalyacc.y" +#line 351 "icalyacc.y" {clear_recur();recur.freq = ICAL_SECONDLY_RECURRENCE;; break;} case 40: -#line 351 "icalyacc.y" +#line 352 "icalyacc.y" {clear_recur();recur.freq = ICAL_MINUTELY_RECURRENCE;; break;} case 41: -#line 352 "icalyacc.y" +#line 353 "icalyacc.y" {clear_recur();recur.freq = ICAL_HOURLY_RECURRENCE;; break;} case 42: -#line 353 "icalyacc.y" +#line 354 "icalyacc.y" {clear_recur();recur.freq = ICAL_DAILY_RECURRENCE;; break;} case 43: -#line 354 "icalyacc.y" +#line 355 "icalyacc.y" {clear_recur();recur.freq = ICAL_WEEKLY_RECURRENCE;; break;} case 44: -#line 355 "icalyacc.y" +#line 356 "icalyacc.y" {clear_recur();recur.freq = ICAL_MONTHLY_RECURRENCE;; break;} case 45: -#line 356 "icalyacc.y" +#line 357 "icalyacc.y" {clear_recur();recur.freq = ICAL_YEARLY_RECURRENCE;; break;} case 46: -#line 361 "icalyacc.y" -{ skiplist[skippos]=ICAL_SUNDAY_WEEKDAY; if( skippos<8) skippos++;; +#line 362 "icalyacc.y" +{ skiplist[skippos]=ICAL_SUNDAY_WEEKDAY+8*dow_pos; + if( skippos<8) skippos++;; break;} case 47: -#line 362 "icalyacc.y" -{ skiplist[skippos]=ICAL_MONDAY_WEEKDAY;if( skippos<8) skippos++;; +#line 364 "icalyacc.y" +{ skiplist[skippos]=ICAL_MONDAY_WEEKDAY+8*dow_pos; + if( skippos<8) skippos++;; break;} case 48: -#line 363 "icalyacc.y" -{ skiplist[skippos]=ICAL_TUESDAY_WEEKDAY;if( skippos<8) skippos++;; +#line 366 "icalyacc.y" +{ skiplist[skippos]=ICAL_TUESDAY_WEEKDAY+8*dow_pos; + if( skippos<8) skippos++;; break;} case 49: -#line 364 "icalyacc.y" -{ skiplist[skippos]=ICAL_WEDNESDAY_WEEKDAY;if( skippos<8) skippos++;; +#line 368 "icalyacc.y" +{ skiplist[skippos]=ICAL_WEDNESDAY_WEEKDAY+8*dow_pos; + if( skippos<8) skippos++;; break;} case 50: -#line 365 "icalyacc.y" -{ skiplist[skippos]=ICAL_THURSDAY_WEEKDAY;if( skippos<8) skippos++;; +#line 370 "icalyacc.y" +{ skiplist[skippos]=ICAL_THURSDAY_WEEKDAY+8*dow_pos; + if( skippos<8) skippos++;; break;} case 51: -#line 366 "icalyacc.y" -{ skiplist[skippos]=ICAL_FRIDAY_WEEKDAY;if( skippos<8) skippos++;; +#line 372 "icalyacc.y" +{ skiplist[skippos]=ICAL_FRIDAY_WEEKDAY+8*dow_pos; + if( skippos<8) skippos++;; break;} case 52: -#line 367 "icalyacc.y" -{ skiplist[skippos]=ICAL_SATURDAY_WEEKDAY;if( skippos<8) skippos++;; +#line 374 "icalyacc.y" +{ skiplist[skippos]=ICAL_SATURDAY_WEEKDAY+8*dow_pos; + if( skippos<8) skippos++;; + break;} +case 53: +#line 380 "icalyacc.y" +{dow_pos = 0; break;} case 54: -#line 373 "icalyacc.y" -{ ; +#line 381 "icalyacc.y" +{ dow_pos = atoi(yyvsp[-1].v_string); + break;} +case 55: +#line 382 "icalyacc.y" +{dow_pos = 0; break;} case 56: -#line 378 "icalyacc.y" -{ skiplist[skippos] = atoi(yyvsp[0].v_string); skippos++;; +#line 383 "icalyacc.y" +{ dow_pos = atoi(yyvsp[-1].v_string); break;} case 57: -#line 379 "icalyacc.y" -{ skiplist[skippos] = atoi(yyvsp[0].v_string); if (skippos<367) skippos++;; +#line 387 "icalyacc.y" +{ skiplist[skippos] = atoi(yyvsp[0].v_string); skippos++;; break;} case 58: -#line 383 "icalyacc.y" -{recur.interval = atoi(yyvsp[0].v_string);; +#line 388 "icalyacc.y" +{ skiplist[skippos] = atoi(yyvsp[0].v_string); if (skippos<367) skippos++;; break;} case 59: -#line 384 "icalyacc.y" -{recur.week_start = ICAL_SUNDAY_WEEKDAY;; +#line 392 "icalyacc.y" +{recur.interval = atoi(yyvsp[0].v_string);; break;} case 60: -#line 385 "icalyacc.y" -{recur.week_start = ICAL_MONDAY_WEEKDAY;; +#line 393 "icalyacc.y" +{recur.week_start = ICAL_SUNDAY_WEEKDAY;; break;} case 61: -#line 386 "icalyacc.y" -{recur.week_start = ICAL_TUESDAY_WEEKDAY;; +#line 394 "icalyacc.y" +{recur.week_start = ICAL_MONDAY_WEEKDAY;; break;} case 62: -#line 387 "icalyacc.y" -{recur.week_start = ICAL_WEDNESDAY_WEEKDAY;; +#line 395 "icalyacc.y" +{recur.week_start = ICAL_TUESDAY_WEEKDAY;; break;} case 63: -#line 388 "icalyacc.y" -{recur.week_start = ICAL_THURSDAY_WEEKDAY;; +#line 396 "icalyacc.y" +{recur.week_start = ICAL_WEDNESDAY_WEEKDAY;; break;} case 64: -#line 389 "icalyacc.y" -{recur.week_start = ICAL_FRIDAY_WEEKDAY;; +#line 397 "icalyacc.y" +{recur.week_start = ICAL_THURSDAY_WEEKDAY;; break;} case 65: -#line 390 "icalyacc.y" -{recur.week_start = ICAL_SATURDAY_WEEKDAY;; +#line 398 "icalyacc.y" +{recur.week_start = ICAL_FRIDAY_WEEKDAY;; break;} case 66: -#line 391 "icalyacc.y" -{copy_list(recur.by_second,60);; +#line 399 "icalyacc.y" +{recur.week_start = ICAL_SATURDAY_WEEKDAY;; break;} case 67: -#line 392 "icalyacc.y" -{copy_list(recur.by_minute,60);; +#line 400 "icalyacc.y" +{copy_list(recur.by_second,60);; break;} case 68: -#line 393 "icalyacc.y" -{copy_list(recur.by_hour,24);; +#line 401 "icalyacc.y" +{copy_list(recur.by_minute,60);; break;} case 69: -#line 394 "icalyacc.y" -{copy_list(recur.by_day,7);; +#line 402 "icalyacc.y" +{copy_list(recur.by_hour,24);; break;} case 70: -#line 395 "icalyacc.y" -{copy_list(recur.by_month,12);; +#line 403 "icalyacc.y" +{copy_list(recur.by_day,7);; break;} case 71: -#line 396 "icalyacc.y" -{copy_list(recur.by_month_day,31);; +#line 404 "icalyacc.y" +{copy_list(recur.by_month,12);; break;} case 72: -#line 397 "icalyacc.y" -{copy_list(recur.by_year_day,366);; +#line 405 "icalyacc.y" +{copy_list(recur.by_month_day,31);; break;} case 73: -#line 398 "icalyacc.y" -{copy_list(recur.by_week_no,53);; +#line 406 "icalyacc.y" +{copy_list(recur.by_year_day,366);; break;} case 74: -#line 399 "icalyacc.y" -{copy_list(recur.by_set_pos,366);; +#line 407 "icalyacc.y" +{copy_list(recur.by_week_no,53);; break;} case 75: -#line 401 "icalyacc.y" +#line 408 "icalyacc.y" +{copy_list(recur.by_set_pos,366);; + break;} +case 76: +#line 410 "icalyacc.y" { recur.until = icalvalue_get_datetime(icalparser_yy_value); icalvalue_free(icalparser_yy_value); icalparser_yy_value=0;; break;} -case 76: -#line 404 "icalyacc.y" +case 77: +#line 413 "icalyacc.y" { recur.until = icalvalue_get_date(icalparser_yy_value); icalvalue_free(icalparser_yy_value); icalparser_yy_value=0;; break;} -case 77: -#line 407 "icalyacc.y" +case 78: +#line 416 "icalyacc.y" { recur.count = atoi(yyvsp[0].v_string); ; break;} -case 80: -#line 416 "icalyacc.y" +case 81: +#line 425 "icalyacc.y" { icalparser_yy_value = icalvalue_new_recur(recur); ; break;} -case 81: -#line 422 "icalyacc.y" +case 82: +#line 431 "icalyacc.y" { utcsign = 1; ; break;} -case 82: -#line 423 "icalyacc.y" +case 83: +#line 432 "icalyacc.y" { utcsign = -1; ; break;} -case 83: -#line 427 "icalyacc.y" +case 84: +#line 436 "icalyacc.y" { icalparser_yy_value = icalvalue_new_utcoffset( utcsign * (yyvsp[-1].v_int*3600) + (yyvsp[0].v_int*60) ); ; break;} -case 84: -#line 432 "icalyacc.y" +case 85: +#line 441 "icalyacc.y" { icalparser_yy_value = icalvalue_new_utcoffset(utcsign * (yyvsp[-2].v_int*3600) + (yyvsp[-1].v_int*60) +(yyvsp[0].v_int)); ; @@ -1660,7 +1679,7 @@ yyerrhandle: } return 1; } -#line 438 "icalyacc.y" +#line 447 "icalyacc.y" diff --git a/libical/src/libical/icalyacc.y b/libical/src/libical/icalyacc.y index 1fe2a737e9..0917daf371 100644 --- a/libical/src/libical/icalyacc.y +++ b/libical/src/libical/icalyacc.y @@ -6,7 +6,7 @@ DESCRIPTION: - $Id: icalyacc.y,v 1.4 2000/06/06 22:48:09 alves Exp $ + $Id: icalyacc.y,v 1.5 2000/08/24 20:12:04 jpr Exp $ $Locker: $ (C) COPYRIGHT 1999 Eric Busboom @@ -53,6 +53,7 @@ struct icaldurationtype duration; struct icalrecurrencetype recur; short skiplist[367]; short skippos; +int dow_pos; void copy_list(short* array, size_t size); void clear_recur(); @@ -358,20 +359,28 @@ recur_start: weekday: - SU { skiplist[skippos]=ICAL_SUNDAY_WEEKDAY; if( skippos<8) skippos++;} - | MO { skiplist[skippos]=ICAL_MONDAY_WEEKDAY;if( skippos<8) skippos++;} - | TU { skiplist[skippos]=ICAL_TUESDAY_WEEKDAY;if( skippos<8) skippos++;} - | WE { skiplist[skippos]=ICAL_WEDNESDAY_WEEKDAY;if( skippos<8) skippos++;} - | TH { skiplist[skippos]=ICAL_THURSDAY_WEEKDAY;if( skippos<8) skippos++;} - | FR { skiplist[skippos]=ICAL_FRIDAY_WEEKDAY;if( skippos<8) skippos++;} - | SA { skiplist[skippos]=ICAL_SATURDAY_WEEKDAY;if( skippos<8) skippos++;} + SU { skiplist[skippos]=ICAL_SUNDAY_WEEKDAY+8*dow_pos; + if( skippos<8) skippos++;} + | MO { skiplist[skippos]=ICAL_MONDAY_WEEKDAY+8*dow_pos; + if( skippos<8) skippos++;} + | TU { skiplist[skippos]=ICAL_TUESDAY_WEEKDAY+8*dow_pos; + if( skippos<8) skippos++;} + | WE { skiplist[skippos]=ICAL_WEDNESDAY_WEEKDAY+8*dow_pos; + if( skippos<8) skippos++;} + | TH { skiplist[skippos]=ICAL_THURSDAY_WEEKDAY+8*dow_pos; + if( skippos<8) skippos++;} + | FR { skiplist[skippos]=ICAL_FRIDAY_WEEKDAY+8*dow_pos; + if( skippos<8) skippos++;} + | SA { skiplist[skippos]=ICAL_SATURDAY_WEEKDAY+8*dow_pos; + if( skippos<8) skippos++;} ; weekday_list: - weekday - | DIGITS weekday { } /* HACK Incorectly handles int in BYDAY */ - | weekday_list COMMA weekday + weekday {dow_pos = 0}; + | DIGITS weekday { dow_pos = atoi($1)} + | weekday_list COMMA weekday {dow_pos = 0}; + | weekday_list COMMA DIGITS weekday { dow_pos = atoi($3)} recur_list: diff --git a/libical/src/libical/pvl.c b/libical/src/libical/pvl.c index d5225a541e..94eaeac874 100644 --- a/libical/src/libical/pvl.c +++ b/libical/src/libical/pvl.c @@ -3,18 +3,7 @@ CREATOR: eric November, 1995 - (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. + (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org ======================================================================*/ #ifdef HAVE_CONFIG_H @@ -505,6 +494,10 @@ pvl_remove(pvl_list l,pvl_elem e) data = E->d; + E->prior = 0; + E->next = 0; + E->d = 0; + free(E); return data; diff --git a/libical/src/libical/pvl.h b/libical/src/libical/pvl.h index 8113f7495a..40ca516e9f 100644 --- a/libical/src/libical/pvl.h +++ b/libical/src/libical/pvl.h @@ -3,27 +3,9 @@ CREATOR: eric November, 1995 - (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. - + (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org ======================================================================*/ -/* - struct pvl_elem_t - - This type is private. Always use pvl_elem instead - - */ #ifndef __PVL_H__ #define __PVL_H__ @@ -31,6 +13,14 @@ 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 */ diff --git a/libical/src/libicalss/Makefile.am b/libical/src/libicalss/Makefile.am index 01a7fa4d9c..e4431cb492 100644 --- a/libical/src/libicalss/Makefile.am +++ b/libical/src/libicalss/Makefile.am @@ -6,16 +6,27 @@ lib_LIBRARIES = libicalss.a libicalss_a_SOURCES =\ icalcalendar.c \ icalcalendar.h \ - icalcluster.c \ - icalcluster.h \ - icalstore.c \ - icalstore.h + icalset.h \ + icalset.c \ + icalfileset.c \ + icalfileset.h \ + icalfilesetimpl.h \ + icaldirset.c \ + icaldirset.h \ + icalcsdb.h \ + icalcstp.h \ + icalgauge.h \ + icalgauge.c include_HEADERS =\ icalcalendar.h \ - icalcluster.h \ - icalstore.h - + icalset.h + icalfileset.h \ + icalfilesetimpl.h \ + icaldirset.h \ + icalcsdb.h \ + icalcstp.h \ + icalgauge.h INCLUDES = \ -I ../libical/ \ diff --git a/libical/src/libicalss/icalcalendar.c b/libical/src/libicalss/icalcalendar.c index 0f2231b1d7..e63b5330ad 100644 --- a/libical/src/libicalss/icalcalendar.c +++ b/libical/src/libicalss/icalcalendar.c @@ -1,27 +1,22 @@ -/* -*- Mode: C -*- - ====================================================================== +/*====================================================================== FILE: icalcalendar.c CREATOR: eric 23 December 1999 $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 Code is eric. The Initial Developer of the Original - Code is Eric Busboom + (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/ ======================================================================*/ @@ -32,7 +27,9 @@ #include "icalcalendar.h" -#include "icalcluster.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 */ @@ -52,8 +49,8 @@ struct icalcalendar_impl char* dir; icalcomponent* freebusy; icalcomponent* properties; - icalstore* booked; - icalstore* incoming; + icalset* booked; + icalset* incoming; }; struct icalcalendar_impl* icalcalendar_new_impl() @@ -132,19 +129,19 @@ void icalcalendar_free(icalcalendar* calendar) } if (impl->freebusy !=0){ - icalcluster_free(impl->freebusy); + icalfileset_free(impl->freebusy); } if (impl->properties !=0){ - icalcluster_free(impl->properties); + icalfileset_free(impl->properties); } if (impl->booked !=0){ - icalstore_free(impl->booked); + icaldirset_free(impl->booked); } if (impl->incoming !=0){ - icalstore_free(impl->incoming); + icaldirset_free(impl->incoming); } impl->dir = 0; @@ -186,7 +183,7 @@ int icalcalendar_ownlock(icalcalendar* calendar) return 0; } -icalstore* icalcalendar_get_booked(icalcalendar* calendar) +icalset* icalcalendar_get_booked(icalcalendar* calendar) { struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar; char dir[PATH_MAX]; @@ -200,7 +197,7 @@ icalstore* icalcalendar_get_booked(icalcalendar* calendar) if (impl->booked == 0){ icalerror_clear_errno(); - impl->booked = icalstore_new(dir); + impl->booked = icaldirset_new(dir); assert(icalerrno == ICAL_NO_ERROR); } @@ -208,7 +205,7 @@ icalstore* icalcalendar_get_booked(icalcalendar* calendar) } -icalcluster* icalcalendar_get_incoming(icalcalendar* calendar) +icalset* icalcalendar_get_incoming(icalcalendar* calendar) { char path[PATH_MAX]; struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar; @@ -220,13 +217,13 @@ icalcluster* icalcalendar_get_incoming(icalcalendar* calendar) strcat(path,INCOMING_FILE); if (impl->properties == 0){ - impl->properties = icalcluster_new(path); + impl->properties = icalfileset_new(path); } return impl->properties; } -icalcluster* icalcalendar_get_properties(icalcalendar* calendar) +icalset* icalcalendar_get_properties(icalcalendar* calendar) { char path[PATH_MAX]; struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar; @@ -238,13 +235,13 @@ icalcluster* icalcalendar_get_properties(icalcalendar* calendar) strcat(path,PROP_FILE); if (impl->properties == 0){ - impl->properties = icalcluster_new(path); + impl->properties = icalfileset_new(path); } return impl->properties; } -icalcluster* icalcalendar_get_freebusy(icalcalendar* calendar) +icalset* icalcalendar_get_freebusy(icalcalendar* calendar) { char path[PATH_MAX]; struct icalcalendar_impl *impl = (struct icalcalendar_impl*)calendar; @@ -257,7 +254,7 @@ icalcluster* icalcalendar_get_freebusy(icalcalendar* calendar) if (impl->freebusy == 0){ - impl->freebusy = icalcluster_new(path); + impl->freebusy = icalfileset_new(path); } return impl->freebusy; diff --git a/libical/src/libicalss/icalcalendar.h b/libical/src/libicalss/icalcalendar.h index 90e7b33c22..f07457c60d 100644 --- a/libical/src/libicalss/icalcalendar.h +++ b/libical/src/libicalss/icalcalendar.h @@ -7,19 +7,19 @@ $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. - + (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 @@ -30,12 +30,11 @@ #define ICALCALENDAR_H #include "ical.h" -#include "icalstore.h" -#include "icalcluster.h" +#include "icalset.h" /* icalcalendar * Routines for storing calendar data in a file system. The calendar - * has two icalstores, one for incoming components and one for booked + * 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 */ @@ -53,13 +52,13 @@ int icalcalendar_islocked(icalcalendar* calendar); int icalcalendar_ownlock(icalcalendar* calendar); -icalstore* icalcalendar_get_booked(icalcalendar* calendar); +icalset* icalcalendar_get_booked(icalcalendar* calendar); -icalcluster* icalcalendar_get_incoming(icalcalendar* calendar); +icalset* icalcalendar_get_incoming(icalcalendar* calendar); -icalcluster* icalcalendar_get_properties(icalcalendar* calendar); +icalset* icalcalendar_get_properties(icalcalendar* calendar); -icalcluster* icalcalendar_get_freebusy(icalcalendar* calendar); +icalset* icalcalendar_get_freebusy(icalcalendar* calendar); #endif /* !ICALCALENDAR_H */ diff --git a/libical/src/test/Makefile.am b/libical/src/test/Makefile.am index 81ffff8c39..bd76fca669 100644 --- a/libical/src/test/Makefile.am +++ b/libical/src/test/Makefile.am @@ -1,7 +1,7 @@ -noinst_PROGRAMS = usecases copycluster regression parser findobj storage stow +noinst_PROGRAMS = copycluster regression parser findobj storage stow testvcal recur testmime -LDADD = ../libical/libical.a ../libicalss/libicalss.a +LDADD = ../libical/libical.a ../libicalss/libicalss.a ../libicalvcal/libicalvcal.a INCLUDES = \ -I . \ -I $(srcdir) \ @@ -9,11 +9,15 @@ INCLUDES = \ -I $(srcdir)/../libical \ -I../libicalss \ -I $(srcdir)/../libicalss + -I../libicalvcal \ + -I $(srcdir)/../libicalvcal findobj_SOURCES = findobj.c -usecases_SOURCES = usecases.c copycluster_SOURCES = copycluster.c regression_SOURCES = regression.c parser_SOURCES = icaltestparser.c storage_SOURCES = storage.c -stow_SOURCES = stow.c
\ No newline at end of file +stow_SOURCES = stow.c +testvcal_SOURCES =testvcal.c +recur_SOURCES = recur.c +test_mime = testmime.c
\ No newline at end of file diff --git a/libical/src/test/Makefile.in b/libical/src/test/Makefile.in deleted file mode 100644 index 8a7cf257c3..0000000000 --- a/libical/src/test/Makefile.in +++ /dev/null @@ -1,385 +0,0 @@ -# Makefile.in generated automatically by automake 1.4 from Makefile.am - -# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - - -SHELL = @SHELL@ - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include - -DESTDIR = - -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ - -top_builddir = ../.. - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - -INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -transform = @program_transform_name@ - -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -host_alias = @host_alias@ -host_triplet = @host@ -AR = @AR@ -AS = @AS@ -CC = @CC@ -DLLTOOL = @DLLTOOL@ -LEX = @LEX@ -LIBTOOL = @LIBTOOL@ -LN_S = @LN_S@ -MAKEINFO = @MAKEINFO@ -OBJDUMP = @OBJDUMP@ -PACKAGE = @PACKAGE@ -RANLIB = @RANLIB@ -VERSION = @VERSION@ -YACC = @YACC@ - -noinst_PROGRAMS = usecases copycluster regression parser findobj storage stow - -LDADD = ../libical/libical.a ../libicalss/libicalss.a -INCLUDES = -I . -I $(srcdir) -I../libical -I $(srcdir)/../libical -I../libicalss -I $(srcdir)/../libicalss - - -findobj_SOURCES = findobj.c -usecases_SOURCES = usecases.c -copycluster_SOURCES = copycluster.c -regression_SOURCES = regression.c -parser_SOURCES = icaltestparser.c -storage_SOURCES = storage.c -stow_SOURCES = stow.c -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = ../../config.h -CONFIG_CLEAN_FILES = -PROGRAMS = $(noinst_PROGRAMS) - - -DEFS = @DEFS@ -I. -I$(srcdir) -I../.. -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ -usecases_OBJECTS = usecases.o -usecases_LDADD = $(LDADD) -usecases_DEPENDENCIES = ../libical/libical.a ../libicalss/libicalss.a -usecases_LDFLAGS = -copycluster_OBJECTS = copycluster.o -copycluster_LDADD = $(LDADD) -copycluster_DEPENDENCIES = ../libical/libical.a \ -../libicalss/libicalss.a -copycluster_LDFLAGS = -regression_OBJECTS = regression.o -regression_LDADD = $(LDADD) -regression_DEPENDENCIES = ../libical/libical.a ../libicalss/libicalss.a -regression_LDFLAGS = -parser_OBJECTS = icaltestparser.o -parser_LDADD = $(LDADD) -parser_DEPENDENCIES = ../libical/libical.a ../libicalss/libicalss.a -parser_LDFLAGS = -findobj_OBJECTS = findobj.o -findobj_LDADD = $(LDADD) -findobj_DEPENDENCIES = ../libical/libical.a ../libicalss/libicalss.a -findobj_LDFLAGS = -storage_OBJECTS = storage.o -storage_LDADD = $(LDADD) -storage_DEPENDENCIES = ../libical/libical.a ../libicalss/libicalss.a -storage_LDFLAGS = -stow_OBJECTS = stow.o -stow_LDADD = $(LDADD) -stow_DEPENDENCIES = ../libical/libical.a ../libicalss/libicalss.a -stow_LDFLAGS = -CFLAGS = @CFLAGS@ -COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ -DIST_COMMON = Makefile.am Makefile.in - - -DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) - -TAR = gtar -GZIP_ENV = --best -DEP_FILES = .deps/copycluster.P .deps/findobj.P .deps/icaltestparser.P \ -.deps/regression.P .deps/storage.P .deps/stow.P .deps/usecases.P -SOURCES = $(usecases_SOURCES) $(copycluster_SOURCES) $(regression_SOURCES) $(parser_SOURCES) $(findobj_SOURCES) $(storage_SOURCES) $(stow_SOURCES) -OBJECTS = $(usecases_OBJECTS) $(copycluster_OBJECTS) $(regression_OBJECTS) $(parser_OBJECTS) $(findobj_OBJECTS) $(storage_OBJECTS) $(stow_OBJECTS) - -all: all-redirect -.SUFFIXES: -.SUFFIXES: .S .c .lo .o .s -$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) - cd $(top_srcdir) && $(AUTOMAKE) --gnu src/test/Makefile - -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES) - cd $(top_builddir) \ - && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status - - -mostlyclean-noinstPROGRAMS: - -clean-noinstPROGRAMS: - -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) - -distclean-noinstPROGRAMS: - -maintainer-clean-noinstPROGRAMS: - -.s.o: - $(COMPILE) -c $< - -.S.o: - $(COMPILE) -c $< - -mostlyclean-compile: - -rm -f *.o core *.core - -clean-compile: - -distclean-compile: - -rm -f *.tab.c - -maintainer-clean-compile: - -.s.lo: - $(LIBTOOL) --mode=compile $(COMPILE) -c $< - -.S.lo: - $(LIBTOOL) --mode=compile $(COMPILE) -c $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -maintainer-clean-libtool: - -usecases: $(usecases_OBJECTS) $(usecases_DEPENDENCIES) - @rm -f usecases - $(LINK) $(usecases_LDFLAGS) $(usecases_OBJECTS) $(usecases_LDADD) $(LIBS) - -copycluster: $(copycluster_OBJECTS) $(copycluster_DEPENDENCIES) - @rm -f copycluster - $(LINK) $(copycluster_LDFLAGS) $(copycluster_OBJECTS) $(copycluster_LDADD) $(LIBS) - -regression: $(regression_OBJECTS) $(regression_DEPENDENCIES) - @rm -f regression - $(LINK) $(regression_LDFLAGS) $(regression_OBJECTS) $(regression_LDADD) $(LIBS) - -parser: $(parser_OBJECTS) $(parser_DEPENDENCIES) - @rm -f parser - $(LINK) $(parser_LDFLAGS) $(parser_OBJECTS) $(parser_LDADD) $(LIBS) - -findobj: $(findobj_OBJECTS) $(findobj_DEPENDENCIES) - @rm -f findobj - $(LINK) $(findobj_LDFLAGS) $(findobj_OBJECTS) $(findobj_LDADD) $(LIBS) - -storage: $(storage_OBJECTS) $(storage_DEPENDENCIES) - @rm -f storage - $(LINK) $(storage_LDFLAGS) $(storage_OBJECTS) $(storage_LDADD) $(LIBS) - -stow: $(stow_OBJECTS) $(stow_DEPENDENCIES) - @rm -f stow - $(LINK) $(stow_LDFLAGS) $(stow_OBJECTS) $(stow_LDADD) $(LIBS) - -tags: TAGS - -ID: $(HEADERS) $(SOURCES) $(LISP) - list='$(SOURCES) $(HEADERS)'; \ - unique=`for i in $$list; do echo $$i; done | \ - awk ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - here=`pwd` && cd $(srcdir) \ - && mkid -f$$here/ID $$unique $(LISP) - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS)'; \ - unique=`for i in $$list; do echo $$i; done | \ - awk ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ - || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) - -mostlyclean-tags: - -clean-tags: - -distclean-tags: - -rm -f TAGS ID - -maintainer-clean-tags: - -distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) - -subdir = src/test - -distdir: $(DISTFILES) - here=`cd $(top_builddir) && pwd`; \ - top_distdir=`cd $(top_distdir) && pwd`; \ - distdir=`cd $(distdir) && pwd`; \ - cd $(top_srcdir) \ - && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu src/test/Makefile - @for file in $(DISTFILES); do \ - d=$(srcdir); \ - if test -d $$d/$$file; then \ - cp -pr $$d/$$file $(distdir)/$$file; \ - else \ - test -f $(distdir)/$$file \ - || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ - || cp -p $$d/$$file $(distdir)/$$file || :; \ - fi; \ - done - -DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :) - --include $(DEP_FILES) - -mostlyclean-depend: - -clean-depend: - -distclean-depend: - -rm -rf .deps - -maintainer-clean-depend: - -%.o: %.c - @echo '$(COMPILE) -c $<'; \ - $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $< - @-cp .deps/$(*F).pp .deps/$(*F).P; \ - tr ' ' '\012' < .deps/$(*F).pp \ - | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ - >> .deps/$(*F).P; \ - rm .deps/$(*F).pp - -%.lo: %.c - @echo '$(LTCOMPILE) -c $<'; \ - $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< - @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \ - < .deps/$(*F).pp > .deps/$(*F).P; \ - tr ' ' '\012' < .deps/$(*F).pp \ - | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ - >> .deps/$(*F).P; \ - rm -f .deps/$(*F).pp -info-am: -info: info-am -dvi-am: -dvi: dvi-am -check-am: all-am -check: check-am -installcheck-am: -installcheck: installcheck-am -install-exec-am: -install-exec: install-exec-am - -install-data-am: -install-data: install-data-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am -install: install-am -uninstall-am: -uninstall: uninstall-am -all-am: Makefile $(PROGRAMS) -all-redirect: all-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install -installdirs: - - -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) - -rm -f config.cache config.log stamp-h stamp-h[0-9]* - -maintainer-clean-generic: -mostlyclean-am: mostlyclean-noinstPROGRAMS mostlyclean-compile \ - mostlyclean-libtool mostlyclean-tags mostlyclean-depend \ - mostlyclean-generic - -mostlyclean: mostlyclean-am - -clean-am: clean-noinstPROGRAMS clean-compile clean-libtool clean-tags \ - clean-depend clean-generic mostlyclean-am - -clean: clean-am - -distclean-am: distclean-noinstPROGRAMS distclean-compile \ - distclean-libtool distclean-tags distclean-depend \ - distclean-generic clean-am - -rm -f libtool - -distclean: distclean-am - -maintainer-clean-am: maintainer-clean-noinstPROGRAMS \ - maintainer-clean-compile maintainer-clean-libtool \ - maintainer-clean-tags maintainer-clean-depend \ - maintainer-clean-generic distclean-am - @echo "This command is intended for maintainers to use;" - @echo "it deletes files that may require special tools to rebuild." - -maintainer-clean: maintainer-clean-am - -.PHONY: mostlyclean-noinstPROGRAMS distclean-noinstPROGRAMS \ -clean-noinstPROGRAMS maintainer-clean-noinstPROGRAMS \ -mostlyclean-compile distclean-compile clean-compile \ -maintainer-clean-compile mostlyclean-libtool distclean-libtool \ -clean-libtool maintainer-clean-libtool tags mostlyclean-tags \ -distclean-tags clean-tags maintainer-clean-tags distdir \ -mostlyclean-depend distclean-depend clean-depend \ -maintainer-clean-depend info-am info dvi-am dvi check check-am \ -installcheck-am installcheck install-exec-am install-exec \ -install-data-am install-data install-am install uninstall-am uninstall \ -all-redirect all-am all installdirs mostlyclean-generic \ -distclean-generic clean-generic maintainer-clean-generic clean \ -mostlyclean distclean maintainer-clean - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/libical/src/test/copycluster.c b/libical/src/test/copycluster.c index b059130c13..11bd94c62d 100644 --- a/libical/src/test/copycluster.c +++ b/libical/src/test/copycluster.c @@ -27,7 +27,7 @@ #include <stdio.h> /* for printf */ #include "ical.h" -#include "icalcluster.h" +#include "icalfileset.h" #include <errno.h> #include <string.h> /* For strerror */ #include "icalrestriction.h" @@ -41,7 +41,7 @@ void usage(char* arg0) { int main(int c, char *argv[]){ - icalcluster *clusterin, *clusterout; + icalfileset *clusterin, *clusterout; icalcomponent *itr; int count=0; int tostdout = 0; @@ -55,7 +55,7 @@ int main(int c, char *argv[]){ tostdout = 1; } - clusterin = icalcluster_new(argv[1]); + clusterin = icalfileset_new(argv[1]); if (clusterin == 0){ printf("Could not open input cluster \"%s\"",argv[1]); @@ -64,7 +64,7 @@ int main(int c, char *argv[]){ } if (!tostdout){ - clusterout = icalcluster_new(argv[2]); + clusterout = icalfileset_new(argv[2]); if (clusterout == 0){ printf("Could not open output cluster \"%s\"\n",argv[2]); exit(1); @@ -72,10 +72,10 @@ int main(int c, char *argv[]){ } - for (itr = icalcluster_get_first_component(clusterin, + for (itr = icalfileset_get_first_component(clusterin, ICAL_ANY_COMPONENT); itr != 0; - itr = icalcluster_get_next_component(clusterin, + itr = icalfileset_get_next_component(clusterin, ICAL_ANY_COMPONENT)){ icalrestriction_check(itr); @@ -87,7 +87,7 @@ int main(int c, char *argv[]){ printf("--------------\n%s\n",icalcomponent_as_ical_string(itr)); } else { - icalcluster_add_component(clusterout, + icalfileset_add_component(clusterout, icalcomponent_new_clone(itr)); } @@ -101,11 +101,11 @@ int main(int c, char *argv[]){ printf("Transfered %d components\n",count); - icalcluster_free(clusterin); + icalfileset_free(clusterin); if (!tostdout){ - icalcluster_mark(clusterout); - icalcluster_free(clusterout); + icalfileset_mark(clusterout); + icalfileset_free(clusterout); } return 0; diff --git a/libical/src/test/findobj.c b/libical/src/test/findobj.c index e7ec59169a..c31101c33d 100644 --- a/libical/src/test/findobj.c +++ b/libical/src/test/findobj.c @@ -28,6 +28,7 @@ #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" @@ -41,7 +42,7 @@ void usage(char* arg0) { int main(int c, char *argv[]){ icalcalendar *cal; - icalstore *booked; + icaldirset *booked; icalcomponent *itr; if(c < 2 || c > 3){ @@ -59,7 +60,7 @@ int main(int c, char *argv[]){ booked = icalcalendar_get_booked(cal); - itr = icalstore_fetch(booked,argv[2]); + itr = icaldirset_fetch(booked,argv[2]); if(itr != 0){ diff --git a/libical/src/test/icaltestparser.c b/libical/src/test/icaltestparser.c index 98dbcff94f..71f91b641f 100644 --- a/libical/src/test/icaltestparser.c +++ b/libical/src/test/icaltestparser.c @@ -91,7 +91,6 @@ char* read_stream(char *s, size_t size, void *d) int main(int argc, char* argv[]) { - int lineno = 0; char* line; FILE* stream; icalcomponent *c; @@ -120,5 +119,5 @@ int main(int argc, char* argv[]) } while ( line != 0); - -} + return 0; + } diff --git a/libical/src/test/regression.c b/libical/src/test/regression.c index 7b1606d432..dc6a5301f1 100644 --- a/libical/src/test/regression.c +++ b/libical/src/test/regression.c @@ -34,11 +34,12 @@ #include <stdio.h> /* for printf */ #include <time.h> /* for time() */ #include "icalmemory.h" -#include "icalstore.h" -#include "icalcluster.h" #include "icalerror.h" #include "icalrestriction.h" #include "icalcalendar.h" +#include "icalgauge.h" +#include "icaldirset.h" +#include "icalfileset.h" /* This example creates and minipulates the ical object that appears * in rfc 2445, page 137 */ @@ -92,8 +93,8 @@ icalcomponent* create_simple_component() icalcomponent* calendar; struct icalperiodtype rtime; - rtime.start = icaltimetype_from_timet( time(0),0); - rtime.end = icaltimetype_from_timet( time(0),0); + rtime.start = icaltime_from_timet( time(0),0,0); + rtime.end = icaltime_from_timet( time(0),0,0); rtime.end.hour++; @@ -122,12 +123,12 @@ icalcomponent* create_new_component() icalcomponent* timezone; icalcomponent* tzc; icalcomponent* event; - struct icaltimetype atime = icaltimetype_from_timet( time(0),0); + struct icaltimetype atime = icaltime_from_timet( time(0),0,0); struct icalperiodtype rtime; icalproperty* property; - rtime.start = icaltimetype_from_timet( time(0),0); - rtime.end = icaltimetype_from_timet( time(0),0); + rtime.start = icaltime_from_timet( time(0),0,0); + rtime.end = icaltime_from_timet( time(0),0,0); rtime.end.hour++; @@ -331,11 +332,11 @@ icalcomponent* create_new_component_with_va_args() { icalcomponent* calendar; - struct icaltimetype atime = icaltimetype_from_timet( time(0),0); + struct icaltimetype atime = icaltime_from_timet( time(0),0,0); struct icalperiodtype rtime; - rtime.start = icaltimetype_from_timet( time(0),0); - rtime.end = icaltimetype_from_timet( time(0),0); + rtime.start = icaltime_from_timet( time(0),0,0); + rtime.end = icaltime_from_timet( time(0),0,0); rtime.end.hour++; @@ -524,9 +525,9 @@ void test_values() icalvalue_free(copy); - v = icalvalue_new_date(icaltimetype_from_timet( time(0),0)); + v = icalvalue_new_date(icaltime_from_timet( time(0),0,0)); printf("date 1: %s\n",icalvalue_as_ical_string(v)); - icalvalue_set_date(v,icaltimetype_from_timet( time(0)+3600,0)); + icalvalue_set_date(v,icaltime_from_timet( time(0)+3600,0,0)); printf("date 2: %s\n",icalvalue_as_ical_string(v)); copy = icalvalue_new_clone(v); @@ -662,6 +663,7 @@ void test_components() void test_memory() { size_t bufsize = 256; + int i; char *p; char S1[] = "1) When in the Course of human events, "; @@ -682,8 +684,7 @@ void test_memory() char *f, *b1, *b2, *b3, *b4, *b5, *b6, *b7, *b8; - #define BUFSIZE 1024 - +#define BUFSIZE 1024 f = icalmemory_new_buffer(bufsize); p = f; @@ -737,32 +738,61 @@ void test_memory() 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); + } } @@ -772,14 +802,14 @@ int test_store() icalcomponent *c, *gauge; icalerrorenum error; icalcomponent *next, *itr; - icalcluster* cluster; + icalfileset* cluster; struct icalperiodtype rtime; - icalstore *s = icalstore_new("store"); + icaldirset *s = icaldirset_new("store"); int i; - rtime.start = icaltimetype_from_timet( time(0),0); + rtime.start = icaltime_from_timet( time(0),0,0); - cluster = icalcluster_new("clusterin.vcd"); + cluster = icalfileset_new("clusterin.vcd"); if (cluster == 0){ printf("Failed to create cluster: %s\n",icalerror_strerror(icalerrno)); @@ -799,10 +829,10 @@ int test_store() rtime.end = rtime.start; rtime.end.hour++; - for (itr = icalcluster_get_first_component(cluster, + for (itr = icalfileset_get_first_component(cluster, ICAL_ANY_COMPONENT); itr != 0; - itr = icalcluster_get_next_component(cluster, + itr = icalfileset_get_next_component(cluster, ICAL_ANY_COMPONENT)){ icalcomponent *clone; icalproperty *p; @@ -847,7 +877,7 @@ int test_store() printf("\n----------\n%s\n---------\n",icalcomponent_as_ical_string(clone)); - error = icalstore_add_component(s,clone); + error = icaldirset_add_component(s,clone); assert(icalerrno == ICAL_NO_ERROR); @@ -877,15 +907,15 @@ int test_store() #if 0 - icalstore_select(s,gauge); + icaldirset_select(s,gauge); - for(c = icalstore_first(s); c != 0; c = icalstore_next(s)){ + 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 (icalstore_store(s2,c) == 0){ + if (icaldirset_store(s2,c) == 0){ printf("Failed to write!\n"); } icalcomponent_free(c); @@ -895,18 +925,18 @@ int test_store() } - icalstore_free(s2); + icaldirset_free(s2); #endif - for(c = icalstore_get_first_component(s); + for(c = icaldirset_get_first_component(s,ICAL_ANY_COMPONENT); c != 0; c = next){ - next = icalstore_get_next_component(s); + next = icaldirset_get_next_component(s,ICAL_ANY_COMPONENT); if (c != 0){ - /*icalstore_remove_component(s,c);*/ + /*icaldirset_remove_component(s,c);*/ printf("%s", icalcomponent_as_ical_string(c));; } else { printf("Failed to get component\n"); @@ -915,7 +945,7 @@ int test_store() } - icalstore_free(s); + icaldirset_free(s); return 0; } @@ -976,7 +1006,7 @@ int test_compare() printf("%s",icalcomponent_as_ical_string(gauge)); - printf("%d\n",icalstore_test(c,gauge)); + printf("%d\n",icalgauge_test(c,gauge)); return 0; } @@ -984,13 +1014,13 @@ int test_compare() void test_restriction() { icalcomponent *comp; - struct icaltimetype atime = icaltimetype_from_timet( time(0),0); + struct icaltimetype atime = icaltime_from_timet( time(0),0,0); int valid; struct icalperiodtype rtime; - rtime.start = icaltimetype_from_timet( time(0),0); - rtime.end = icaltimetype_from_timet( time(0),0); + rtime.start = icaltime_from_timet( time(0),0,0); + rtime.end = icaltime_from_timet( time(0),0,0); rtime.end.hour++; @@ -1097,11 +1127,11 @@ void test_restriction() void test_calendar() { icalcomponent *comp; - icalcluster *c; - icalstore *s; + icalfileset *c; + icaldirset *s; icalcalendar* calendar = icalcalendar_new("calendar"); icalerrorenum error; - struct icaltimetype atime = icaltimetype_from_timet( time(0),0); + struct icaltimetype atime = icaltime_from_timet( time(0),0,0); comp = icalcomponent_vanew( ICAL_VEVENT_COMPONENT, @@ -1125,13 +1155,13 @@ void test_calendar() s = icalcalendar_get_booked(calendar); - error = icalstore_add_component(s,comp); + error = icaldirset_add_component(s,comp); assert(error == ICAL_NO_ERROR); c = icalcalendar_get_properties(calendar); - error = icalcluster_add_component(c,icalcomponent_new_clone(comp)); + error = icalfileset_add_component(c,icalcomponent_new_clone(comp)); assert(error == ICAL_NO_ERROR); @@ -1170,6 +1200,19 @@ void test_recur() } +void test_recur_expansion() +{ + + icalvalue *v; + + v = icalvalue_new_from_string(ICAL_RECUR_VALUE, + "FREQ=YEARLY;UNTIL=123456T123456;INTERVAL=2;BYMONTH=1;BYDAY=SU;BYHOUR=8,9;BYMINUTE=30"); + + printf("%s\n",icalvalue_as_ical_string(v)); + + icalrecurrencetype_test(); +} + void test_duration() { @@ -1278,19 +1321,213 @@ void test_requeststat() } +void test_time() +{ + struct icaltimetype ictt; + time_t tt,tt2; + icalvalue *v; + short day_of_week,start_day_of_week, day_of_year; + + + tt = time(0); + + printf("System time is: %s\n",ctime(&tt)); + + ictt = icaltime_from_timet(tt,0,0); + + 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",ctime(&tt2)); + + + ictt.year++; + tt2 = icaltime_as_timet(ictt); + printf("Add a year: %s\n",ctime(&tt2)); + + ictt.month+=13; + tt2 = icaltime_as_timet(ictt); + printf("Add 13 months: %s\n",ctime(&tt2)); + + ictt.second+=90; + tt2 = icaltime_as_timet(ictt); + printf("Add 90 seconds: %s\n",ctime(&tt2)); + + ictt = icaltime_from_timet(tt,0,0); + + + 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); + + +} + +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); + 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); + + 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; + 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); + + char* s = icalproperty_get_version(p); + + printf("%s ",s); + } + + printf("\n"); +} + int main(int argc, char *argv[]) { + printf("\n------------Test Memory---------------\n"); + test_memory(); + +exit(0); + + + printf("\n------------Test Iterators-----------\n"); + test_iterators(); + + + printf("\n------------Test time----------------\n"); + test_time(); printf("\n------------Test Restriction---------------\n"); test_restriction(); - exit(0); - printf("\n------------Test request status-------\n"); test_requeststat(); - printf("\n------------Test strings---------------\n"); test_strings(); @@ -1303,9 +1540,6 @@ int main(int argc, char *argv[]) printf("\n------------Test Compare---------------\n"); test_compare(); - printf("\n------------Test Memory---------------\n"); - test_memory(); - printf("\n------------Test Values---------------\n"); test_values(); diff --git a/libical/src/test/storage.c b/libical/src/test/storage.c index f6d0dd69e5..d53001b574 100644 --- a/libical/src/test/storage.c +++ b/libical/src/test/storage.c @@ -34,14 +34,13 @@ #include <stdio.h> /* for printf */ #include <time.h> /* for time() */ #include "icalmemory.h" -#include "icalstore.h" -#include "icalcluster.h" +#include "icaldirset.h" +#include "icalfileset.h" #include "icalerror.h" #include "icalrestriction.h" #include "icalcalendar.h" -/* This example creates and minipulates the ical object that appears - * in rfc 2445, page 137 */ +#define OUTPUT_FILE "filesetout.ics" char str[] = "BEGIN:VCALENDAR\n\ PRODID:\"-//RDU Software//NONSGML HandCal//EN\"\n\ @@ -106,29 +105,31 @@ END:VCALENDAR\n\ "; -void test_cluster() +void test_fileset() { - icalcluster *cin, *cout; + icalfileset *cout; int month = 0; int count=0; struct icaltimetype start, end; icalcomponent *c,*clone, *itr; - start = icaltimetype_from_timet( time(0),0); + start = icaltime_from_timet( time(0),0,0); end = start; end.hour++; - cout = icalcluster_new("clusterout.ics"); + cout = icalfileset_new(OUTPUT_FILE); assert(cout != 0); c = icalparser_parse_string(str2); assert(c != 0); - for(month = 1; month < 2; month++){ + /* Add data to the file */ + + for(month = 1; month < 10; month++){ icalcomponent *event; icalproperty *dtstart, *dtend; - cout = icalcluster_new("clusterout.ics"); + cout = icalfileset_new(OUTPUT_FILE); assert(cout != 0); start.month = month; @@ -147,10 +148,10 @@ void test_cluster() assert(dtend!=0); icalproperty_set_dtend(dtend,end); - icalcluster_add_component(cout,clone); - icalcluster_commit(cout); + icalfileset_add_component(cout,clone); + icalfileset_commit(cout); - icalcluster_free(cout); + icalfileset_free(cout); } @@ -158,13 +159,13 @@ void test_cluster() /* Print them out */ - cout = icalcluster_new("clusterout.ics"); + cout = icalfileset_new(OUTPUT_FILE); assert(cout != 0); - for (itr = icalcluster_get_first_component(cout, + for (itr = icalfileset_get_first_component(cout, ICAL_ANY_COMPONENT); itr != 0; - itr = icalcluster_get_next_component(cout, + itr = icalfileset_get_next_component(cout, ICAL_ANY_COMPONENT)){ icalcomponent *event; @@ -184,34 +185,34 @@ void test_cluster() /* Remove all of them */ - icalcluster_free(cout); + icalfileset_free(cout); - cout = icalcluster_new("clusterout.ics"); + cout = icalfileset_new(OUTPUT_FILE); assert(cout != 0); - for (itr = icalcluster_get_first_component(cout, + for (itr = icalfileset_get_first_component(cout, ICAL_ANY_COMPONENT); itr != 0; - itr = icalcluster_get_next_component(cout, + itr = icalfileset_get_next_component(cout, ICAL_ANY_COMPONENT)){ - icalcluster_remove_component(cout, itr); + icalfileset_remove_component(cout, itr); } - icalcluster_free(cout); + icalfileset_free(cout); /* Print them out again */ - cout = icalcluster_new("clusterout.ics"); + cout = icalfileset_new(OUTPUT_FILE); assert(cout != 0); count =0; - for (itr = icalcluster_get_first_component(cout, + for (itr = icalfileset_get_first_component(cout, ICAL_ANY_COMPONENT); itr != 0; - itr = icalcluster_get_next_component(cout, + itr = icalfileset_get_next_component(cout, ICAL_ANY_COMPONENT)){ icalcomponent *event; @@ -229,29 +230,29 @@ void test_cluster() } - icalcluster_free(cout); + icalfileset_free(cout); } -int test_store() +int test_dirset() { icalcomponent *c, *gauge; icalerrorenum error; - icalcomponent *next, *itr; - icalcluster* cluster; + icalcomponent *itr; + icalfileset* cluster; struct icalperiodtype rtime; - icalstore *s = icalstore_new("store"); + icaldirset *s = icaldirset_new("store"); int i; assert(s != 0); - rtime.start = icaltimetype_from_timet( time(0),0); + rtime.start = icaltime_from_timet( time(0),0,0); - cluster = icalcluster_new("clusterout.ics"); + cluster = icalfileset_new(OUTPUT_FILE); assert(cluster != 0); @@ -268,10 +269,10 @@ int test_store() rtime.end = rtime.start; rtime.end.hour++; - for (itr = icalcluster_get_first_component(cluster, + for (itr = icalfileset_get_first_component(cluster, ICAL_ANY_COMPONENT); itr != 0; - itr = icalcluster_get_next_component(cluster, + itr = icalfileset_get_next_component(cluster, ICAL_ANY_COMPONENT)){ icalcomponent *clone, *inner; icalproperty *p; @@ -316,7 +317,8 @@ int test_store() printf("\n----------\n%s\n---------\n",icalcomponent_as_ical_string(inner)); - error = icalstore_add_component(s,inner); + error = icaldirset_add_component(s, + icalcomponent_new_clone(itr)); assert(icalerrno == ICAL_NO_ERROR); @@ -346,15 +348,15 @@ int test_store() #if 0 - icalstore_select(s,gauge); + icaldirset_select(s,gauge); - for(c = icalstore_first(s); c != 0; c = icalstore_next(s)){ + 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 (icalstore_store(s2,c) == 0){ + if (icaldirset_store(s2,c) == 0){ printf("Failed to write!\n"); } icalcomponent_free(c); @@ -364,38 +366,43 @@ int test_store() } - icalstore_free(s2); + icaldirset_free(s2); #endif - for(c = icalstore_get_first_component(s); + for(c = icaldirset_get_first_component(s,ICAL_ANY_COMPONENT); c != 0; - c = next){ - - next = icalstore_get_next_component(s); + c = icaldirset_get_next_component(s,ICAL_ANY_COMPONENT)){ if (c != 0){ - /*icalstore_remove_component(s,c);*/ 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); } + - icalstore_free(s); + icaldirset_free(s); return 0; } void test_calendar() { icalcomponent *comp; - icalcluster *c; - icalstore *s; + icalfileset *c; + icaldirset *s; icalcalendar* calendar = icalcalendar_new("calendar"); icalerrorenum error; - struct icaltimetype atime = icaltimetype_from_timet( time(0),0); + struct icaltimetype atime = icaltime_from_timet( time(0),0,0); comp = icalcomponent_vanew( ICAL_VEVENT_COMPONENT, @@ -419,13 +426,13 @@ void test_calendar() s = icalcalendar_get_booked(calendar); - error = icalstore_add_component(s,comp); + error = icaldirset_add_component(s,comp); assert(error == ICAL_NO_ERROR); c = icalcalendar_get_properties(calendar); - error = icalcluster_add_component(c,icalcomponent_new_clone(comp)); + error = icalfileset_add_component(c,icalcomponent_new_clone(comp)); assert(error == ICAL_NO_ERROR); @@ -437,16 +444,14 @@ void test_calendar() int main(int argc, char *argv[]) { +/* printf("\n------------Test File Set---------------\n"); + test_fileset(); */ - printf("\n------------Test Cluster---------------\n"); - test_cluster(); + printf("\n------------Test Dir Set---------------\n"); + test_dirset(); #if 0 - printf("\n------------Test Store---------------\n"); - test_store(); - - printf("\n------------Test Calendar---------------\n"); test_calendar(); diff --git a/libical/src/test/stow.c b/libical/src/test/stow.c index d7629855c5..f742b417a5 100644 --- a/libical/src/test/stow.c +++ b/libical/src/test/stow.c @@ -33,35 +33,85 @@ #include <stdlib.h> #include <sys/utsname.h> /* for uname */ #include <sys/stat.h> /* for stat */ -#include <unistd.h> /* for stat, getpid */ +#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" enum options { - STORE_IN_DIR, + STORE_IN_FILE, STORE_IN_DB, - INPUT_IS_EMAIL, + INPUT_IS_MIME, INPUT_IS_ICAL, INPUT_FROM_STDIN, - INPUT_FROM_FILE + 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* input_text; char* calid; - char* caldir; + 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(char* str) { @@ -79,23 +129,33 @@ char* lowercase(char* str) return new; } +#if 0 char* get_local_attendee(struct options_struct *opt) { char attendee[PATH_MAX]; - char* user = getenv("USER"); - struct utsname uts; + if(opt->calid){ - uname(&uts); + strncpy(attendee,opt->calid,PATH_MAX); - /* HACK nodename may not be a fully qualified domain name */ - snprintf(attendee,PATH_MAX,"%s@%s",user,uts.nodename); + } 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 void usage(char *message) { + fprintf(stderr,"Usage: %s [-emdcn] [-i inputfile] [-o outputfile] [-u calid]\n",program_name); + } icalcomponent* get_first_real_component(icalcomponent *comp) @@ -140,20 +200,20 @@ char* make_mime(char* to, char* from, char* subject, uname(&uts); srand(time(0)<<getpid()); - sprintf(content_id,"%d-%d@%s",time(0),rand(),uts.nodename); - sprintf(boundary,"%d-%d-%s",time(0),rand(),uts.nodename); + 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", +%s\n\n--%s", content_id,text_message,boundary); if(ical_message != 0 && method != 0){ - sprintf(mime_part_2,"\nContent-ID: %s\n\ + 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--\n", +Content-Description: iCal component reply\n\n\ +%s\n\n--%s--", content_id,method,ical_message,boundary); } @@ -166,6 +226,7 @@ Content-Type: multipart/mixed; boundary=\"%s\"\n\ \n\ This is a multimedia message in MIME format\n\ \n\ +--%s %s ", to,from,subject,content_id,boundary,boundary, @@ -181,14 +242,39 @@ Content-Type: multipart/mixed; boundary=\"%s\"\n\ } /* The incoming component had fatal errors */ -void return_failure(icalcomponent* comp, char* message, struct options_struct *opt) +void return_failure(icalcomponent* comp, char* message, + struct options_struct *opt) { - + char* local_attendee = opt->calid; + FILE* p; - fputs(make_mime("Dest", "Source", "iMIP error", - message, "reply", - icalcomponent_as_ical_string(comp)),stdout); + icalcomponent *inner = get_first_real_component(comp); + + icalproperty *organizer_prop = icalcomponent_get_first_property(inner,ICAL_ORGANIZER_PROPERTY); + 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*/ @@ -201,43 +287,124 @@ void return_error(icalcomponent* comp, char* message, struct options_struct *op } -char* check_component(icalcomponent* comp, struct options_struct *opt) +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){ + 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) { - static char static_component_error_str[PATH_MAX]; 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 the root component is a VCALENDAR */ - if(icalcomponent_isa(comp) != ICAL_VCALENDAR_COMPONENT){ + /* Check that we actually got a component */ + if(comp == 0){ strcpy(static_component_error_str, - "Root component is not a VCALENDAR"); + "Did not find a component"); component_error_str = static_component_error_str; break; } - /* Check that the component passes iTIP restrictions */ - - errors = icalcomponent_count_errors(comp); - icalrestriction_check(comp); - - if(errors != icalcomponent_count_errors(comp)){ + /* Check that the root component is a VCALENDAR */ + if(icalcomponent_isa(comp) != ICAL_VCALENDAR_COMPONENT){ strcpy(static_component_error_str, - "The component does not conform to iTIP restrictions"); + "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) + if (icalcomponent_get_first_property(comp,ICAL_METHOD_PROPERTY) == 0) { strcpy(static_component_error_str, "Component does not have a METHOD property"); @@ -245,208 +412,288 @@ char* check_component(icalcomponent* comp, struct options_struct *opt) break; } - /* Check for this user as an attendee */ + inner = get_first_real_component(comp); - 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)){ - - char* s = icalproperty_get_attendee(p); - char* lower_attendee = lowercase(s); - char* local_attendee = get_local_attendee(opt); - - /* 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){ - found_attendee = 1; - } - - lower_attendee -= 7; + + found_attendee += check_attendee(p,opt); + } - free(local_attendee); - free(lower_attendee); - - } + 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){ - char* local_attendee = get_local_attendee(opt); + 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", - local_attendee ); + "This target user (%s) is not listed as an attendee or organizer", + opt->calid ); component_error_str = static_component_error_str; - free(local_attendee); + + 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 get_options(int argc, char* argv[], struct options_struct *opt) { - opt->storage = STORE_IN_DIR; - opt->input_type = INPUT_FROM_STDIN; + 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->input_text = 0; + opt->errors = ERRORS_TO_ORGANIZER; opt->calid = 0; - opt->caldir = 0; -} - -char* check_options(struct options_struct *opt) -{ - return 0; -} - -void store_component(icalcomponent *comp, icalcalendar* cal, - struct options_struct *opt) -{ - - icalcluster *incoming = 0; - icalerrorenum error; - - incoming = icalcalendar_get_incoming(cal); + 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 (incoming == 0){ - fprintf(stderr,"%s: Failed to get incoming component directory: %s\n", - program_name, icalerror_strerror(icalerrno)); - 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); - error = icalcluster_add_component(incoming,comp); - - if (error != ICAL_NO_ERROR){ - fprintf(stderr,"%s: Failed to write incoming component: %s\n", - program_name, icalerror_strerror(icalerrno)); - exit(1); - } - - error = icalcluster_commit(incoming); - - if (error != ICAL_NO_ERROR){ - fprintf(stderr,"%s: Failed to commit incoming cluster: %s\n", - program_name, icalerror_strerror(icalerrno)); - exit(1); + opt->calid = lowercase(attendee); } - - return; -} - -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; + if(opt->storage == STORE_IN_FILE && + opt->output_file ==0){ + char file[PATH_MAX]; + char* user = getenv("USER"); + struct passwd *pw; - /* Check if the path already exists and if it is a directory*/ - if (stat(path,&sbuf) != 0){ + if(!user){ + fprintf(stderr,"%s: Can't get username. Try explicitly specifing the output file with -o", program_name); + exit(1); + } - /* A file by the given name does not exist, or there was - another error */ - if(errno == ENOENT) - { - type = NO_FILE; - } else { - type = ERROR; + /* 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); } - } 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; + 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); } - return type; -} -icalcalendar* get_calendar(icalcomponent* comp, struct options_struct *opt) -{ - - struct stat sbuf; - char calpath[PATH_MAX]; - char facspath[PATH_MAX]; - char* home = getenv("HOME"); - char* user = getenv("USER"); - enum file_type type; - icalcalendar* cal; + /* Now try to create the calendar directory if it does + not exist */ - snprintf(facspath,PATH_MAX,"%s/.facs",home); + if(opt->storage == STORE_IN_FILE ) { + char * p; + char* facspath = strdup(opt->output_file); + enum file_type type; - type = test_file(facspath); + /* Cut off the last slash to make it just a directoy */ - errno = 0; - if (type == NO_FILE){ + p = strrchr(facspath,'/'); - if(mkdir(facspath,0775) != 0){ - fprintf(stderr,"%s: Failed to create calendar store directory %s: %s\n", - program_name,facspath, strerror(errno)); - exit(1); - } else { - printf("%s: Creating calendar store directory %s\n",program_name,facspath); - } + if (p == 0){ + fprintf(stderr,"%s: Invalid calendar filename \"%s\"", + program_name,facspath); + exit(1); + } + + *p='\0'; + + type = test_file(facspath); - } else if(type==REGULAR || type == ERROR){ - fprintf(stderr,"%s: Cannot create calendar store directory %s\n", + 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; - snprintf(calpath,PATH_MAX,"%s/%s",facspath,user); - type = test_file(calpath); + if(opt->storage == STORE_IN_FILE){ + icalfileset *fs = icalfileset_new(opt->output_file); - errno = 0; + if (fs == 0){ + fprintf(stderr, + "%s: Failed to get incoming component directory: %s\n", + program_name, icalerror_strerror(icalerrno)); + exit(1); + } - if (type == NO_FILE){ - if(mkdir(calpath,0775) != 0){ - fprintf(stderr,"%s: Failed to create calendar directory %s: %s\n", - program_name,calpath, strerror(errno)); - } else { - printf("%s: Creating calendar store directory %s\n",program_name,facspath); + 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); } - } else if(type==REGULAR || type == ERROR){ - fprintf(stderr,"%s: Cannot create calendar directory %s\n", - program_name,calpath); + + 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); - } - - cal = icalcalendar_new(calpath); + } + + icalfileset_free(fs); - if(cal == 0){ - fprintf(stderr,"%s: Failed to open calendar at %s: %s", - program_name,calpath,icalerror_strerror(icalerrno)); - exit(1); + return; + } else { + assert(0); } - - return cal; - } char* read_stream(char *s, size_t size, void *d) @@ -456,14 +703,14 @@ char* read_stream(char *s, size_t size, void *d) return c; } -icalcomponent* read_component(struct options_struct *opt) +icalcomponent* read_nonmime_component(struct options_struct *opt) { FILE *stream; icalcomponent *comp; icalparser* parser = icalparser_new(); char* line; - if(opt->input_type == INPUT_FROM_FILE){ + if(opt->input_source == INPUT_FROM_FILE){ stream = fopen(opt->input_file,"r"); if (stream == 0){ @@ -490,22 +737,89 @@ icalcomponent* read_component(struct options_struct *opt) } while ( line != 0); - if(opt->input_type == INPUT_FROM_FILE){ + 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; - icalcalendar* cal; icalcomponent* comp, *reply; struct options_struct opt; + icalproperty *return_status; - program_name = argv[0]; + program_name = strrchr(argv[0],'/'); get_options(argc, argv, &opt); @@ -516,17 +830,19 @@ int main(int argc, char* argv[] ) comp = read_component(&opt); - if ( (component_error_str = check_component(comp,&opt)) != 0){ - return_failure(comp, component_error_str, &opt); - exit(1); + 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); } - cal = get_calendar(comp,&opt); + store_component(comp,&opt); - store_component(comp,cal, &opt); - icalcomponent_free(comp); - icalcalendar_free(cal); + /* 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/test-data/Makefile.am b/libical/test-data/Makefile.am index bf2079606c..83a434b288 100644 --- a/libical/test-data/Makefile.am +++ b/libical/test-data/Makefile.am @@ -10,4 +10,11 @@ EXTRA_DIST = \ 5 \ 6 \ 7 \ -smallcluster.ics
\ No newline at end of file +smallcluster.ics \ +recur.txt \ +user-cal.vcf \ +complex-mime.txt \ +simple-mime.txt \ +stresstest.ics + + |