summaryrefslogtreecommitdiffstats
path: root/libkcal
diff options
context:
space:
mode:
authortoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
committertoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
commit460c52653ab0dcca6f19a4f492ed2c5e4e963ab0 (patch)
tree67208f7c145782a7e90b123b982ca78d88cc2c87 /libkcal
downloadtdepim-460c52653ab0dcca6f19a4f492ed2c5e4e963ab0.tar.gz
tdepim-460c52653ab0dcca6f19a4f492ed2c5e4e963ab0.zip
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdepim@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'libkcal')
-rw-r--r--libkcal/COPYING487
-rw-r--r--libkcal/DESIGN63
-rw-r--r--libkcal/HACKING8
-rw-r--r--libkcal/Mainpage.dox15
-rw-r--r--libkcal/Makefile.am81
-rw-r--r--libkcal/README11
-rw-r--r--libkcal/README.libical4
-rw-r--r--libkcal/alarm.cpp459
-rw-r--r--libkcal/alarm.h370
-rw-r--r--libkcal/attachment.cpp121
-rw-r--r--libkcal/attachment.h96
-rw-r--r--libkcal/attendee.cpp167
-rw-r--r--libkcal/attendee.h162
-rw-r--r--libkcal/calendar.cpp858
-rw-r--r--libkcal/calendar.h958
-rw-r--r--libkcal/calendarlocal.cpp595
-rw-r--r--libkcal/calendarlocal.h228
-rw-r--r--libkcal/calendarnull.cpp42
-rw-r--r--libkcal/calendarnull.h309
-rw-r--r--libkcal/calendarresources.cpp811
-rw-r--r--libkcal/calendarresources.h696
-rw-r--r--libkcal/calfilter.cpp226
-rw-r--r--libkcal/calfilter.h158
-rw-r--r--libkcal/calformat.cpp78
-rw-r--r--libkcal/calformat.h115
-rw-r--r--libkcal/calstorage.h58
-rw-r--r--libkcal/compat.cpp250
-rw-r--r--libkcal/compat.h124
-rw-r--r--libkcal/confirmsavedialog.cpp66
-rw-r--r--libkcal/confirmsavedialog.h47
-rw-r--r--libkcal/convertqtopia.cpp119
-rw-r--r--libkcal/customproperties.cpp142
-rw-r--r--libkcal/customproperties.h133
-rw-r--r--libkcal/dndfactory.cpp187
-rw-r--r--libkcal/dndfactory.h73
-rw-r--r--libkcal/dummyscheduler.cpp127
-rw-r--r--libkcal/dummyscheduler.h58
-rw-r--r--libkcal/duration.cpp60
-rw-r--r--libkcal/duration.h59
-rw-r--r--libkcal/event.cpp154
-rw-r--r--libkcal/event.h135
-rw-r--r--libkcal/exceptions.cpp91
-rw-r--r--libkcal/exceptions.h97
-rw-r--r--libkcal/filestorage.cpp155
-rw-r--r--libkcal/filestorage.h63
-rw-r--r--libkcal/freebusy.cpp224
-rw-r--r--libkcal/freebusy.h84
-rw-r--r--libkcal/freebusycache.h47
-rw-r--r--libkcal/freebusyurlstore.cpp70
-rw-r--r--libkcal/freebusyurlstore.h54
-rw-r--r--libkcal/htmlexport.cpp713
-rw-r--r--libkcal/htmlexport.h101
-rw-r--r--libkcal/htmlexportsettings.kcfg147
-rw-r--r--libkcal/htmlexportsettings.kcfgc10
-rw-r--r--libkcal/icaldrag.cpp59
-rw-r--r--libkcal/icaldrag.h60
-rw-r--r--libkcal/icalformat.cpp580
-rw-r--r--libkcal/icalformat.h147
-rw-r--r--libkcal/icalformatimpl.cpp2203
-rw-r--r--libkcal/icalformatimpl.h127
-rw-r--r--libkcal/imipscheduler.cpp59
-rw-r--r--libkcal/imipscheduler.h55
-rw-r--r--libkcal/incidence.cpp847
-rw-r--r--libkcal/incidence.h486
-rw-r--r--libkcal/incidencebase.cpp425
-rw-r--r--libkcal/incidencebase.h293
-rw-r--r--libkcal/incidenceformatter.cpp2215
-rw-r--r--libkcal/incidenceformatter.h78
-rw-r--r--libkcal/journal.cpp44
-rw-r--r--libkcal/journal.h57
-rw-r--r--libkcal/kcal_manager.desktop66
-rw-r--r--libkcal/kcalversion.h28
-rw-r--r--libkcal/libical/AUTHORS4
-rw-r--r--libkcal/libical/COPYING0
-rw-r--r--libkcal/libical/ChangeLog811
-rw-r--r--libkcal/libical/INSTALL24
-rw-r--r--libkcal/libical/Makefile.am11
-rw-r--r--libkcal/libical/NEWS522
-rw-r--r--libkcal/libical/README102
-rw-r--r--libkcal/libical/README.zoneinfo44
-rw-r--r--libkcal/libical/TEST4
-rw-r--r--libkcal/libical/THANKS69
-rw-r--r--libkcal/libical/TODO39
-rw-r--r--libkcal/libical/configure.in.in20
-rw-r--r--libkcal/libical/design-data/Makefile.am6
-rw-r--r--libkcal/libical/design-data/parameters.csv25
-rw-r--r--libkcal/libical/design-data/properties.csv78
-rw-r--r--libkcal/libical/design-data/restrictions.csv1420
-rw-r--r--libkcal/libical/design-data/status.txt56
-rw-r--r--libkcal/libical/design-data/value-types.csv31
-rw-r--r--libkcal/libical/doc/Makefile.am1
-rw-r--r--libkcal/libical/doc/UsingLibical.lyx2578
-rw-r--r--libkcal/libical/doc/UsingLibical.ps2327
-rw-r--r--libkcal/libical/doc/UsingLibical.txt1384
-rw-r--r--libkcal/libical/examples/Makefile.am16
-rw-r--r--libkcal/libical/examples/access_components.c318
-rw-r--r--libkcal/libical/examples/access_properties_and_parameters.c144
-rw-r--r--libkcal/libical/examples/errors.c70
-rw-r--r--libkcal/libical/examples/main.c12
-rw-r--r--libkcal/libical/examples/parse_text.c68
-rw-r--r--libkcal/libical/scripts/Makefile.am9
-rwxr-xr-xlibkcal/libical/scripts/mkderivedcomponents.pl170
-rwxr-xr-xlibkcal/libical/scripts/mkderivedparameters.pl332
-rwxr-xr-xlibkcal/libical/scripts/mkderivedproperties.pl258
-rwxr-xr-xlibkcal/libical/scripts/mkderivedvalues.pl236
-rwxr-xr-xlibkcal/libical/scripts/mkparameterrestrictions.pl85
-rwxr-xr-xlibkcal/libical/scripts/mkrestrictionrecords.pl109
-rwxr-xr-xlibkcal/libical/scripts/mkrestrictiontable.pl98
-rw-r--r--libkcal/libical/scripts/readvaluesfile.pl130
-rw-r--r--libkcal/libical/src/Makefile.am1
-rw-r--r--libkcal/libical/src/libical/Makefile.am232
-rw-r--r--libkcal/libical/src/libical/astime.h65
-rw-r--r--libkcal/libical/src/libical/caldate.c176
-rw-r--r--libkcal/libical/src/libical/icalarray.c161
-rw-r--r--libkcal/libical/src/libical/icalarray.h61
-rw-r--r--libkcal/libical/src/libical/icalattach.c137
-rw-r--r--libkcal/libical/src/libical/icalattach.h60
-rw-r--r--libkcal/libical/src/libical/icalattachimpl.h58
-rw-r--r--libkcal/libical/src/libical/icalcomponent.c2598
-rw-r--r--libkcal/libical/src/libical/icalcomponent.h283
-rw-r--r--libkcal/libical/src/libical/icalderivedparameter.c.in205
-rw-r--r--libkcal/libical/src/libical/icalderivedparameter.h.in36
-rw-r--r--libkcal/libical/src/libical/icalderivedproperty.c.in284
-rw-r--r--libkcal/libical/src/libical/icalderivedproperty.h.in21
-rw-r--r--libkcal/libical/src/libical/icalderivedvalue.c.in336
-rw-r--r--libkcal/libical/src/libical/icalderivedvalue.h.in63
-rw-r--r--libkcal/libical/src/libical/icalduration.c331
-rw-r--r--libkcal/libical/src/libical/icalduration.h61
-rw-r--r--libkcal/libical/src/libical/icalenums.c166
-rw-r--r--libkcal/libical/src/libical/icalenums.h166
-rw-r--r--libkcal/libical/src/libical/icalerror.c250
-rw-r--r--libkcal/libical/src/libical/icalerror.h160
-rw-r--r--libkcal/libical/src/libical/icalmemory.c373
-rw-r--r--libkcal/libical/src/libical/icalmemory.h83
-rw-r--r--libkcal/libical/src/libical/icalmime.c393
-rw-r--r--libkcal/libical/src/libical/icalmime.h42
-rw-r--r--libkcal/libical/src/libical/icalparameter.c384
-rw-r--r--libkcal/libical/src/libical/icalparameter.h68
-rw-r--r--libkcal/libical/src/libical/icalparameterimpl.h51
-rw-r--r--libkcal/libical/src/libical/icalparser.c1105
-rw-r--r--libkcal/libical/src/libical/icalparser.h96
-rw-r--r--libkcal/libical/src/libical/icalperiod.c169
-rw-r--r--libkcal/libical/src/libical/icalperiod.h54
-rw-r--r--libkcal/libical/src/libical/icalproperty.c998
-rw-r--r--libkcal/libical/src/libical/icalproperty.h133
-rw-r--r--libkcal/libical/src/libical/icalrecur.c2400
-rw-r--r--libkcal/libical/src/libical/icalrecur.h215
-rw-r--r--libkcal/libical/src/libical/icalrestriction.c.in503
-rw-r--r--libkcal/libical/src/libical/icalrestriction.h63
-rw-r--r--libkcal/libical/src/libical/icaltime.c1014
-rw-r--r--libkcal/libical/src/libical/icaltime.h271
-rw-r--r--libkcal/libical/src/libical/icaltimezone.c1670
-rw-r--r--libkcal/libical/src/libical/icaltimezone.h165
-rw-r--r--libkcal/libical/src/libical/icaltypes.c190
-rw-r--r--libkcal/libical/src/libical/icaltypes.h108
-rw-r--r--libkcal/libical/src/libical/icalvalue.c1326
-rw-r--r--libkcal/libical/src/libical/icalvalue.h87
-rw-r--r--libkcal/libical/src/libical/icalvalueimpl.h95
-rw-r--r--libkcal/libical/src/libical/icalversion.h7
-rw-r--r--libkcal/libical/src/libical/icalversion.h.in7
-rw-r--r--libkcal/libical/src/libical/pvl.c585
-rw-r--r--libkcal/libical/src/libical/pvl.h98
-rw-r--r--libkcal/libical/src/libical/sspm.c1630
-rw-r--r--libkcal/libical/src/libical/sspm.h144
-rw-r--r--libkcal/libical/src/libical/vsnprintf.c172
-rw-r--r--libkcal/libical/src/libicalss/Makefile.am35
-rw-r--r--libkcal/libical/src/libicalss/icalclassify.c752
-rw-r--r--libkcal/libical/src/libicalss/icalclassify.h38
-rw-r--r--libkcal/libical/tzdata/africa673
-rw-r--r--libkcal/libical/tzdata/antarctica327
-rw-r--r--libkcal/libical/tzdata/asia1919
-rw-r--r--libkcal/libical/tzdata/australasia1454
-rw-r--r--libkcal/libical/tzdata/backward112
-rw-r--r--libkcal/libical/tzdata/etcetera80
-rw-r--r--libkcal/libical/tzdata/europe2525
-rw-r--r--libkcal/libical/tzdata/factory8
-rw-r--r--libkcal/libical/tzdata/iso3166.tab269
-rw-r--r--libkcal/libical/tzdata/leapseconds83
-rw-r--r--libkcal/libical/tzdata/northamerica2651
-rw-r--r--libkcal/libical/tzdata/pacificnew26
-rw-r--r--libkcal/libical/tzdata/solar87388
-rw-r--r--libkcal/libical/tzdata/solar88388
-rw-r--r--libkcal/libical/tzdata/solar89393
-rw-r--r--libkcal/libical/tzdata/southamerica1259
-rw-r--r--libkcal/libical/tzdata/systemv36
-rw-r--r--libkcal/libical/tzdata/yearistype.sh40
-rw-r--r--libkcal/libical/tzdata/zone.tab423
-rw-r--r--libkcal/libical/vzic-1.3/ChangeLog57
-rw-r--r--libkcal/libical/vzic-1.3/Makefile83
-rw-r--r--libkcal/libical/vzic-1.3/Makefile.org89
-rw-r--r--libkcal/libical/vzic-1.3/README202
-rw-r--r--libkcal/libical/vzic-1.3/test-vzic.c422
-rw-r--r--libkcal/libical/vzic-1.3/vzic-dump.c409
-rw-r--r--libkcal/libical/vzic-1.3/vzic-dump.h58
-rwxr-xr-xlibkcal/libical/vzic-1.3/vzic-dump.pl222
-rwxr-xr-xlibkcal/libical/vzic-1.3/vzic-merge.pl127
-rw-r--r--libkcal/libical/vzic-1.3/vzic-output.c2325
-rw-r--r--libkcal/libical/vzic-1.3/vzic-output.h38
-rw-r--r--libkcal/libical/vzic-1.3/vzic-parse.c901
-rw-r--r--libkcal/libical/vzic-1.3/vzic-parse.h38
-rwxr-xr-xlibkcal/libical/vzic-1.3/vzic-test.pl164
-rw-r--r--libkcal/libical/vzic-1.3/vzic.c320
-rw-r--r--libkcal/libical/vzic-1.3/vzic.h196
-rw-r--r--libkcal/libical/zoneinfo/Africa/Abidjan.ics15
-rw-r--r--libkcal/libical/zoneinfo/Africa/Accra.ics41
-rw-r--r--libkcal/libical/zoneinfo/Africa/Addis_Ababa.ics22
-rw-r--r--libkcal/libical/zoneinfo/Africa/Algiers.ics90
-rw-r--r--libkcal/libical/zoneinfo/Africa/Asmara.ics29
-rw-r--r--libkcal/libical/zoneinfo/Africa/Bamako.ics29
-rw-r--r--libkcal/libical/zoneinfo/Africa/Bangui.ics15
-rw-r--r--libkcal/libical/zoneinfo/Africa/Banjul.ics29
-rw-r--r--libkcal/libical/zoneinfo/Africa/Bissau.ics22
-rw-r--r--libkcal/libical/zoneinfo/Africa/Blantyre.ics15
-rw-r--r--libkcal/libical/zoneinfo/Africa/Brazzaville.ics15
-rw-r--r--libkcal/libical/zoneinfo/Africa/Bujumbura.ics15
-rw-r--r--libkcal/libical/zoneinfo/Africa/Cairo.ics148
-rw-r--r--libkcal/libical/zoneinfo/Africa/Casablanca.ics51
-rw-r--r--libkcal/libical/zoneinfo/Africa/Ceuta.ics99
-rw-r--r--libkcal/libical/zoneinfo/Africa/Conakry.ics29
-rw-r--r--libkcal/libical/zoneinfo/Africa/Dakar.ics22
-rw-r--r--libkcal/libical/zoneinfo/Africa/Dar_es_Salaam.ics29
-rw-r--r--libkcal/libical/zoneinfo/Africa/Djibouti.ics15
-rw-r--r--libkcal/libical/zoneinfo/Africa/Douala.ics15
-rw-r--r--libkcal/libical/zoneinfo/Africa/El_Aaiun.ics22
-rw-r--r--libkcal/libical/zoneinfo/Africa/Freetown.ics81
-rw-r--r--libkcal/libical/zoneinfo/Africa/Gaborone.ics29
-rw-r--r--libkcal/libical/zoneinfo/Africa/Harare.ics15
-rw-r--r--libkcal/libical/zoneinfo/Africa/Johannesburg.ics38
-rw-r--r--libkcal/libical/zoneinfo/Africa/Kampala.ics36
-rw-r--r--libkcal/libical/zoneinfo/Africa/Khartoum.ics66
-rw-r--r--libkcal/libical/zoneinfo/Africa/Kigali.ics15
-rw-r--r--libkcal/libical/zoneinfo/Africa/Kinshasa.ics15
-rw-r--r--libkcal/libical/zoneinfo/Africa/Lagos.ics15
-rw-r--r--libkcal/libical/zoneinfo/Africa/Libreville.ics15
-rw-r--r--libkcal/libical/zoneinfo/Africa/Lome.ics15
-rw-r--r--libkcal/libical/zoneinfo/Africa/Luanda.ics22
-rw-r--r--libkcal/libical/zoneinfo/Africa/Lubumbashi.ics15
-rw-r--r--libkcal/libical/zoneinfo/Africa/Lusaka.ics15
-rw-r--r--libkcal/libical/zoneinfo/Africa/Malabo.ics22
-rw-r--r--libkcal/libical/zoneinfo/Africa/Maputo.ics15
-rw-r--r--libkcal/libical/zoneinfo/Africa/Maseru.ics29
-rw-r--r--libkcal/libical/zoneinfo/Africa/Mbabane.ics15
-rw-r--r--libkcal/libical/zoneinfo/Africa/Mogadishu.ics29
-rw-r--r--libkcal/libical/zoneinfo/Africa/Monrovia.ics29
-rw-r--r--libkcal/libical/zoneinfo/Africa/Nairobi.ics36
-rw-r--r--libkcal/libical/zoneinfo/Africa/Ndjamena.ics29
-rw-r--r--libkcal/libical/zoneinfo/Africa/Niamey.ics29
-rw-r--r--libkcal/libical/zoneinfo/Africa/Nouakchott.ics29
-rw-r--r--libkcal/libical/zoneinfo/Africa/Ouagadougou.ics15
-rw-r--r--libkcal/libical/zoneinfo/Africa/Porto-Novo.ics22
-rw-r--r--libkcal/libical/zoneinfo/Africa/Sao_Tome.ics22
-rw-r--r--libkcal/libical/zoneinfo/Africa/Tripoli.ics67
-rw-r--r--libkcal/libical/zoneinfo/Africa/Tunis.ics74
-rw-r--r--libkcal/libical/zoneinfo/Africa/Windhoek.ics64
-rw-r--r--libkcal/libical/zoneinfo/America/Adak.ics186
-rw-r--r--libkcal/libical/zoneinfo/America/Anchorage.ics186
-rw-r--r--libkcal/libical/zoneinfo/America/Anguilla.ics15
-rw-r--r--libkcal/libical/zoneinfo/America/Antigua.ics22
-rw-r--r--libkcal/libical/zoneinfo/America/Araguaina.ics84
-rw-r--r--libkcal/libical/zoneinfo/America/Argentina/Buenos_Aires.ics134
-rw-r--r--libkcal/libical/zoneinfo/America/Argentina/Catamarca.ics154
-rw-r--r--libkcal/libical/zoneinfo/America/Argentina/Cordoba.ics146
-rw-r--r--libkcal/libical/zoneinfo/America/Argentina/Jujuy.ics165
-rw-r--r--libkcal/libical/zoneinfo/America/Argentina/La_Rioja.ics149
-rw-r--r--libkcal/libical/zoneinfo/America/Argentina/Mendoza.ics160
-rw-r--r--libkcal/libical/zoneinfo/America/Argentina/Rio_Gallegos.ics142
-rw-r--r--libkcal/libical/zoneinfo/America/Argentina/San_Juan.ics149
-rw-r--r--libkcal/libical/zoneinfo/America/Argentina/San_Luis.ics141
-rw-r--r--libkcal/libical/zoneinfo/America/Argentina/Tucuman.ics154
-rw-r--r--libkcal/libical/zoneinfo/America/Argentina/Ushuaia.ics142
-rw-r--r--libkcal/libical/zoneinfo/America/Aruba.ics22
-rw-r--r--libkcal/libical/zoneinfo/America/Asuncion.ics121
-rw-r--r--libkcal/libical/zoneinfo/America/Atikokan.ics51
-rw-r--r--libkcal/libical/zoneinfo/America/Bahia.ics92
-rw-r--r--libkcal/libical/zoneinfo/America/Barbados.ics42
-rw-r--r--libkcal/libical/zoneinfo/America/Belem.ics62
-rw-r--r--libkcal/libical/zoneinfo/America/Belize.ics93
-rw-r--r--libkcal/libical/zoneinfo/America/Blanc-Sablon.ics51
-rw-r--r--libkcal/libical/zoneinfo/America/Boa_Vista.ics67
-rw-r--r--libkcal/libical/zoneinfo/America/Bogota.ics36
-rw-r--r--libkcal/libical/zoneinfo/America/Boise.ics166
-rw-r--r--libkcal/libical/zoneinfo/America/Cambridge_Bay.ics155
-rw-r--r--libkcal/libical/zoneinfo/America/Campo_Grande.ics107
-rw-r--r--libkcal/libical/zoneinfo/America/Cancun.ics79
-rw-r--r--libkcal/libical/zoneinfo/America/Caracas.ics36
-rw-r--r--libkcal/libical/zoneinfo/America/Cayenne.ics22
-rw-r--r--libkcal/libical/zoneinfo/America/Cayman.ics22
-rw-r--r--libkcal/libical/zoneinfo/America/Chicago.ics242
-rw-r--r--libkcal/libical/zoneinfo/America/Chihuahua.ics90
-rw-r--r--libkcal/libical/zoneinfo/America/Costa_Rica.ics42
-rw-r--r--libkcal/libical/zoneinfo/America/Cuiaba.ics113
-rw-r--r--libkcal/libical/zoneinfo/America/Curacao.ics22
-rw-r--r--libkcal/libical/zoneinfo/America/Danmarkshavn.ics66
-rw-r--r--libkcal/libical/zoneinfo/America/Dawson.ics153
-rw-r--r--libkcal/libical/zoneinfo/America/Dawson_Creek.ics109
-rw-r--r--libkcal/libical/zoneinfo/America/Denver.ics158
-rw-r--r--libkcal/libical/zoneinfo/America/Detroit.ics145
-rw-r--r--libkcal/libical/zoneinfo/America/Dominica.ics15
-rw-r--r--libkcal/libical/zoneinfo/America/Edmonton.ics151
-rw-r--r--libkcal/libical/zoneinfo/America/Eirunepe.ics66
-rw-r--r--libkcal/libical/zoneinfo/America/El_Salvador.ics31
-rw-r--r--libkcal/libical/zoneinfo/America/Fortaleza.ics75
-rw-r--r--libkcal/libical/zoneinfo/America/Glace_Bay.ics140
-rw-r--r--libkcal/libical/zoneinfo/America/Godthab.ics58
-rw-r--r--libkcal/libical/zoneinfo/America/Goose_Bay.ics258
-rw-r--r--libkcal/libical/zoneinfo/America/Grand_Turk.ics104
-rw-r--r--libkcal/libical/zoneinfo/America/Grenada.ics15
-rw-r--r--libkcal/libical/zoneinfo/America/Guadeloupe.ics15
-rw-r--r--libkcal/libical/zoneinfo/America/Guatemala.ics35
-rw-r--r--libkcal/libical/zoneinfo/America/Guayaquil.ics22
-rw-r--r--libkcal/libical/zoneinfo/America/Guyana.ics36
-rw-r--r--libkcal/libical/zoneinfo/America/Halifax.ics228
-rw-r--r--libkcal/libical/zoneinfo/America/Havana.ics148
-rw-r--r--libkcal/libical/zoneinfo/America/Hermosillo.ics66
-rw-r--r--libkcal/libical/zoneinfo/America/Indiana/Indianapolis.ics125
-rw-r--r--libkcal/libical/zoneinfo/America/Indiana/Knox.ics169
-rw-r--r--libkcal/libical/zoneinfo/America/Indiana/Marengo.ics133
-rw-r--r--libkcal/libical/zoneinfo/America/Indiana/Petersburg.ics133
-rw-r--r--libkcal/libical/zoneinfo/America/Indiana/Tell_City.ics130
-rw-r--r--libkcal/libical/zoneinfo/America/Indiana/Vevay.ics98
-rw-r--r--libkcal/libical/zoneinfo/America/Indiana/Vincennes.ics132
-rw-r--r--libkcal/libical/zoneinfo/America/Indiana/Winamac.ics143
-rw-r--r--libkcal/libical/zoneinfo/America/Inuvik.ics122
-rw-r--r--libkcal/libical/zoneinfo/America/Iqaluit.ics135
-rw-r--r--libkcal/libical/zoneinfo/America/Jamaica.ics61
-rw-r--r--libkcal/libical/zoneinfo/America/Juneau.ics173
-rw-r--r--libkcal/libical/zoneinfo/America/Kentucky/Louisville.ics205
-rw-r--r--libkcal/libical/zoneinfo/America/Kentucky/Monticello.ics164
-rw-r--r--libkcal/libical/zoneinfo/America/La_Paz.ics29
-rw-r--r--libkcal/libical/zoneinfo/America/Lima.ics48
-rw-r--r--libkcal/libical/zoneinfo/America/Los_Angeles.ics184
-rw-r--r--libkcal/libical/zoneinfo/America/Maceio.ics79
-rw-r--r--libkcal/libical/zoneinfo/America/Managua.ics54
-rw-r--r--libkcal/libical/zoneinfo/America/Manaus.ics66
-rw-r--r--libkcal/libical/zoneinfo/America/Marigot.ics15
-rw-r--r--libkcal/libical/zoneinfo/America/Martinique.ics36
-rw-r--r--libkcal/libical/zoneinfo/America/Mazatlan.ics79
-rw-r--r--libkcal/libical/zoneinfo/America/Menominee.ics152
-rw-r--r--libkcal/libical/zoneinfo/America/Merida.ics61
-rw-r--r--libkcal/libical/zoneinfo/America/Mexico_City.ics91
-rw-r--r--libkcal/libical/zoneinfo/America/Miquelon.ics95
-rw-r--r--libkcal/libical/zoneinfo/America/Moncton.ics215
-rw-r--r--libkcal/libical/zoneinfo/America/Monterrey.ics63
-rw-r--r--libkcal/libical/zoneinfo/America/Montevideo.ics151
-rw-r--r--libkcal/libical/zoneinfo/America/Montreal.ics233
-rw-r--r--libkcal/libical/zoneinfo/America/Montserrat.ics15
-rw-r--r--libkcal/libical/zoneinfo/America/Nassau.ics134
-rw-r--r--libkcal/libical/zoneinfo/America/New_York.ics236
-rw-r--r--libkcal/libical/zoneinfo/America/Nipigon.ics125
-rw-r--r--libkcal/libical/zoneinfo/America/Nome.ics186
-rw-r--r--libkcal/libical/zoneinfo/America/Noronha.ics75
-rw-r--r--libkcal/libical/zoneinfo/America/North_Dakota/Center.ics158
-rw-r--r--libkcal/libical/zoneinfo/America/North_Dakota/New_Salem.ics158
-rw-r--r--libkcal/libical/zoneinfo/America/Panama.ics22
-rw-r--r--libkcal/libical/zoneinfo/America/Pangnirtung.ics160
-rw-r--r--libkcal/libical/zoneinfo/America/Paramaribo.ics43
-rw-r--r--libkcal/libical/zoneinfo/America/Phoenix.ics51
-rw-r--r--libkcal/libical/zoneinfo/America/Port-au-Prince.ics68
-rw-r--r--libkcal/libical/zoneinfo/America/Port_of_Spain.ics15
-rw-r--r--libkcal/libical/zoneinfo/America/Porto_Velho.ics62
-rw-r--r--libkcal/libical/zoneinfo/America/Puerto_Rico.ics43
-rw-r--r--libkcal/libical/zoneinfo/America/Rainy_River.ics125
-rw-r--r--libkcal/libical/zoneinfo/America/Rankin_Inlet.ics121
-rw-r--r--libkcal/libical/zoneinfo/America/Recife.ics75
-rw-r--r--libkcal/libical/zoneinfo/America/Regina.ics97
-rw-r--r--libkcal/libical/zoneinfo/America/Resolute.ics107
-rw-r--r--libkcal/libical/zoneinfo/America/Rio_Branco.ics62
-rw-r--r--libkcal/libical/zoneinfo/America/Santiago.ics193
-rw-r--r--libkcal/libical/zoneinfo/America/Santo_Domingo.ics67
-rw-r--r--libkcal/libical/zoneinfo/America/Sao_Paulo.ics114
-rw-r--r--libkcal/libical/zoneinfo/America/Scoresbysund.ics71
-rw-r--r--libkcal/libical/zoneinfo/America/Shiprock.ics158
-rw-r--r--libkcal/libical/zoneinfo/America/St_Barthelemy.ics15
-rw-r--r--libkcal/libical/zoneinfo/America/St_Johns.ics268
-rw-r--r--libkcal/libical/zoneinfo/America/St_Kitts.ics15
-rw-r--r--libkcal/libical/zoneinfo/America/St_Lucia.ics22
-rw-r--r--libkcal/libical/zoneinfo/America/St_Thomas.ics15
-rw-r--r--libkcal/libical/zoneinfo/America/St_Vincent.ics22
-rw-r--r--libkcal/libical/zoneinfo/America/Swift_Current.ics74
-rw-r--r--libkcal/libical/zoneinfo/America/Tegucigalpa.ics33
-rw-r--r--libkcal/libical/zoneinfo/America/Thule.ics73
-rw-r--r--libkcal/libical/zoneinfo/America/Thunder_Bay.ics145
-rw-r--r--libkcal/libical/zoneinfo/America/Tijuana.ics106
-rw-r--r--libkcal/libical/zoneinfo/America/Toronto.ics232
-rw-r--r--libkcal/libical/zoneinfo/America/Tortola.ics15
-rw-r--r--libkcal/libical/zoneinfo/America/Vancouver.ics187
-rw-r--r--libkcal/libical/zoneinfo/America/Whitehorse.ics153
-rw-r--r--libkcal/libical/zoneinfo/America/Winnipeg.ics183
-rw-r--r--libkcal/libical/zoneinfo/America/Yakutat.ics167
-rw-r--r--libkcal/libical/zoneinfo/America/Yellowknife.ics131
-rw-r--r--libkcal/libical/zoneinfo/Antarctica/Casey.ics15
-rw-r--r--libkcal/libical/zoneinfo/Antarctica/Davis.ics23
-rw-r--r--libkcal/libical/zoneinfo/Antarctica/DumontDUrville.ics29
-rw-r--r--libkcal/libical/zoneinfo/Antarctica/Mawson.ics15
-rw-r--r--libkcal/libical/zoneinfo/Antarctica/McMurdo.ics107
-rw-r--r--libkcal/libical/zoneinfo/Antarctica/Palmer.ics118
-rw-r--r--libkcal/libical/zoneinfo/Antarctica/Rothera.ics15
-rw-r--r--libkcal/libical/zoneinfo/Antarctica/South_Pole.ics107
-rw-r--r--libkcal/libical/zoneinfo/Antarctica/Syowa.ics15
-rw-r--r--libkcal/libical/zoneinfo/Antarctica/Vostok.ics15
-rw-r--r--libkcal/libical/zoneinfo/Arctic/Longyearbyen.ics89
-rw-r--r--libkcal/libical/zoneinfo/Asia/Aden.ics15
-rw-r--r--libkcal/libical/zoneinfo/Asia/Almaty.ics89
-rw-r--r--libkcal/libical/zoneinfo/Asia/Amman.ics89
-rw-r--r--libkcal/libical/zoneinfo/Asia/Anadyr.ics112
-rw-r--r--libkcal/libical/zoneinfo/Asia/Aqtau.ics143
-rw-r--r--libkcal/libical/zoneinfo/Asia/Aqtobe.ics119
-rw-r--r--libkcal/libical/zoneinfo/Asia/Ashgabat.ics82
-rw-r--r--libkcal/libical/zoneinfo/Asia/Baghdad.ics86
-rw-r--r--libkcal/libical/zoneinfo/Asia/Bahrain.ics22
-rw-r--r--libkcal/libical/zoneinfo/Asia/Baku.ics119
-rw-r--r--libkcal/libical/zoneinfo/Asia/Bangkok.ics22
-rw-r--r--libkcal/libical/zoneinfo/Asia/Beirut.ics97
-rw-r--r--libkcal/libical/zoneinfo/Asia/Bishkek.ics108
-rw-r--r--libkcal/libical/zoneinfo/Asia/Brunei.ics22
-rw-r--r--libkcal/libical/zoneinfo/Asia/Calcutta.ics37
-rw-r--r--libkcal/libical/zoneinfo/Asia/Choibalsan.ics84
-rw-r--r--libkcal/libical/zoneinfo/Asia/Chongqing.ics46
-rw-r--r--libkcal/libical/zoneinfo/Asia/Colombo.ics64
-rw-r--r--libkcal/libical/zoneinfo/Asia/Damascus.ics131
-rw-r--r--libkcal/libical/zoneinfo/Asia/Dhaka.ics50
-rw-r--r--libkcal/libical/zoneinfo/Asia/Dili.ics43
-rw-r--r--libkcal/libical/zoneinfo/Asia/Dubai.ics15
-rw-r--r--libkcal/libical/zoneinfo/Asia/Dushanbe.ics68
-rw-r--r--libkcal/libical/zoneinfo/Asia/Gaza.ics147
-rw-r--r--libkcal/libical/zoneinfo/Asia/Harbin.ics61
-rw-r--r--libkcal/libical/zoneinfo/Asia/Ho_Chi_Minh.ics36
-rw-r--r--libkcal/libical/zoneinfo/Asia/Hong_Kong.ics95
-rw-r--r--libkcal/libical/zoneinfo/Asia/Hovd.ics78
-rw-r--r--libkcal/libical/zoneinfo/Asia/Irkutsk.ics95
-rw-r--r--libkcal/libical/zoneinfo/Asia/Istanbul.ics187
-rw-r--r--libkcal/libical/zoneinfo/Asia/Jakarta.ics64
-rw-r--r--libkcal/libical/zoneinfo/Asia/Jayapura.ics29
-rw-r--r--libkcal/libical/zoneinfo/Asia/Jerusalem.ics187
-rw-r--r--libkcal/libical/zoneinfo/Asia/Kabul.ics22
-rw-r--r--libkcal/libical/zoneinfo/Asia/Kamchatka.ics88
-rw-r--r--libkcal/libical/zoneinfo/Asia/Karachi.ics57
-rw-r--r--libkcal/libical/zoneinfo/Asia/Kashgar.ics53
-rw-r--r--libkcal/libical/zoneinfo/Asia/Katmandu.ics22
-rw-r--r--libkcal/libical/zoneinfo/Asia/Kolkata.ics37
-rw-r--r--libkcal/libical/zoneinfo/Asia/Krasnoyarsk.ics88
-rw-r--r--libkcal/libical/zoneinfo/Asia/Kuala_Lumpur.ics64
-rw-r--r--libkcal/libical/zoneinfo/Asia/Kuching.ics69
-rw-r--r--libkcal/libical/zoneinfo/Asia/Kuwait.ics15
-rw-r--r--libkcal/libical/zoneinfo/Asia/Macau.ics74
-rw-r--r--libkcal/libical/zoneinfo/Asia/Magadan.ics88
-rw-r--r--libkcal/libical/zoneinfo/Asia/Makassar.ics36
-rw-r--r--libkcal/libical/zoneinfo/Asia/Manila.ics48
-rw-r--r--libkcal/libical/zoneinfo/Asia/Muscat.ics15
-rw-r--r--libkcal/libical/zoneinfo/Asia/Nicosia.ics95
-rw-r--r--libkcal/libical/zoneinfo/Asia/Novosibirsk.ics96
-rw-r--r--libkcal/libical/zoneinfo/Asia/Omsk.ics88
-rw-r--r--libkcal/libical/zoneinfo/Asia/Oral.ics143
-rw-r--r--libkcal/libical/zoneinfo/Asia/Phnom_Penh.ics36
-rw-r--r--libkcal/libical/zoneinfo/Asia/Pontianak.ics64
-rw-r--r--libkcal/libical/zoneinfo/Asia/Pyongyang.ics44
-rw-r--r--libkcal/libical/zoneinfo/Asia/Qatar.ics22
-rw-r--r--libkcal/libical/zoneinfo/Asia/Qyzylorda.ics132
-rw-r--r--libkcal/libical/zoneinfo/Asia/Rangoon.ics36
-rw-r--r--libkcal/libical/zoneinfo/Asia/Riyadh.ics15
-rw-r--r--libkcal/libical/zoneinfo/Asia/Saigon.ics36
-rw-r--r--libkcal/libical/zoneinfo/Asia/Sakhalin.ics107
-rw-r--r--libkcal/libical/zoneinfo/Asia/Samarkand.ics88
-rw-r--r--libkcal/libical/zoneinfo/Asia/Seoul.ics69
-rw-r--r--libkcal/libical/zoneinfo/Asia/Shanghai.ics50
-rw-r--r--libkcal/libical/zoneinfo/Asia/Singapore.ics71
-rw-r--r--libkcal/libical/zoneinfo/Asia/Taipei.ics67
-rw-r--r--libkcal/libical/zoneinfo/Asia/Tashkent.ics82
-rw-r--r--libkcal/libical/zoneinfo/Asia/Tbilisi.ics159
-rw-r--r--libkcal/libical/zoneinfo/Asia/Tehran.ics156
-rw-r--r--libkcal/libical/zoneinfo/Asia/Thimphu.ics22
-rw-r--r--libkcal/libical/zoneinfo/Asia/Tokyo.ics49
-rw-r--r--libkcal/libical/zoneinfo/Asia/Ulaanbaatar.ics78
-rw-r--r--libkcal/libical/zoneinfo/Asia/Urumqi.ics46
-rw-r--r--libkcal/libical/zoneinfo/Asia/Vientiane.ics36
-rw-r--r--libkcal/libical/zoneinfo/Asia/Vladivostok.ics88
-rw-r--r--libkcal/libical/zoneinfo/Asia/Yakutsk.ics88
-rw-r--r--libkcal/libical/zoneinfo/Asia/Yekaterinburg.ics106
-rw-r--r--libkcal/libical/zoneinfo/Asia/Yerevan.ics110
-rw-r--r--libkcal/libical/zoneinfo/Atlantic/Azores.ics223
-rw-r--r--libkcal/libical/zoneinfo/Atlantic/Bermuda.ics114
-rw-r--r--libkcal/libical/zoneinfo/Atlantic/Canary.ics72
-rw-r--r--libkcal/libical/zoneinfo/Atlantic/Cape_Verde.ics36
-rw-r--r--libkcal/libical/zoneinfo/Atlantic/Faroe.ics57
-rw-r--r--libkcal/libical/zoneinfo/Atlantic/Jan_Mayen.ics89
-rw-r--r--libkcal/libical/zoneinfo/Atlantic/Madeira.ics201
-rw-r--r--libkcal/libical/zoneinfo/Atlantic/Reykjavik.ics103
-rw-r--r--libkcal/libical/zoneinfo/Atlantic/South_Georgia.ics15
-rw-r--r--libkcal/libical/zoneinfo/Atlantic/St_Helena.ics22
-rw-r--r--libkcal/libical/zoneinfo/Atlantic/Stanley.ics120
-rw-r--r--libkcal/libical/zoneinfo/Australia/Adelaide.ics136
-rw-r--r--libkcal/libical/zoneinfo/Australia/Brisbane.ics50
-rw-r--r--libkcal/libical/zoneinfo/Australia/Broken_Hill.ics150
-rw-r--r--libkcal/libical/zoneinfo/Australia/Currie.ics129
-rw-r--r--libkcal/libical/zoneinfo/Australia/Darwin.ics42
-rw-r--r--libkcal/libical/zoneinfo/Australia/Eucla.ics52
-rw-r--r--libkcal/libical/zoneinfo/Australia/Hobart.ics137
-rw-r--r--libkcal/libical/zoneinfo/Australia/Lindeman.ics55
-rw-r--r--libkcal/libical/zoneinfo/Australia/Lord_Howe.ics113
-rw-r--r--libkcal/libical/zoneinfo/Australia/Melbourne.ics129
-rw-r--r--libkcal/libical/zoneinfo/Australia/Perth.ics52
-rw-r--r--libkcal/libical/zoneinfo/Australia/Sydney.ics129
-rw-r--r--libkcal/libical/zoneinfo/Europe/Amsterdam.ics164
-rw-r--r--libkcal/libical/zoneinfo/Europe/Andorra.ics53
-rw-r--r--libkcal/libical/zoneinfo/Europe/Athens.ics116
-rw-r--r--libkcal/libical/zoneinfo/Europe/Belgrade.ics69
-rw-r--r--libkcal/libical/zoneinfo/Europe/Berlin.ics103
-rw-r--r--libkcal/libical/zoneinfo/Europe/Bratislava.ics96
-rw-r--r--libkcal/libical/zoneinfo/Europe/Brussels.ics164
-rw-r--r--libkcal/libical/zoneinfo/Europe/Bucharest.ics109
-rw-r--r--libkcal/libical/zoneinfo/Europe/Budapest.ics101
-rw-r--r--libkcal/libical/zoneinfo/Europe/Chisinau.ics161
-rw-r--r--libkcal/libical/zoneinfo/Europe/Copenhagen.ics88
-rw-r--r--libkcal/libical/zoneinfo/Europe/Dublin.ics201
-rw-r--r--libkcal/libical/zoneinfo/Europe/Gibraltar.ics171
-rw-r--r--libkcal/libical/zoneinfo/Europe/Guernsey.ics208
-rw-r--r--libkcal/libical/zoneinfo/Europe/Helsinki.ics72
-rw-r--r--libkcal/libical/zoneinfo/Europe/Isle_of_Man.ics208
-rw-r--r--libkcal/libical/zoneinfo/Europe/Istanbul.ics187
-rw-r--r--libkcal/libical/zoneinfo/Europe/Jersey.ics208
-rw-r--r--libkcal/libical/zoneinfo/Europe/Kaliningrad.ics138
-rw-r--r--libkcal/libical/zoneinfo/Europe/Kiev.ics137
-rw-r--r--libkcal/libical/zoneinfo/Europe/Lisbon.ics227
-rw-r--r--libkcal/libical/zoneinfo/Europe/Ljubljana.ics69
-rw-r--r--libkcal/libical/zoneinfo/Europe/London.ics208
-rw-r--r--libkcal/libical/zoneinfo/Europe/Luxembourg.ics155
-rw-r--r--libkcal/libical/zoneinfo/Europe/Madrid.ics136
-rw-r--r--libkcal/libical/zoneinfo/Europe/Malta.ics117
-rw-r--r--libkcal/libical/zoneinfo/Europe/Mariehamn.ics72
-rw-r--r--libkcal/libical/zoneinfo/Europe/Minsk.ics129
-rw-r--r--libkcal/libical/zoneinfo/Europe/Monaco.ics163
-rw-r--r--libkcal/libical/zoneinfo/Europe/Moscow.ics155
-rw-r--r--libkcal/libical/zoneinfo/Europe/Nicosia.ics95
-rw-r--r--libkcal/libical/zoneinfo/Europe/Oslo.ics89
-rw-r--r--libkcal/libical/zoneinfo/Europe/Paris.ics168
-rw-r--r--libkcal/libical/zoneinfo/Europe/Podgorica.ics69
-rw-r--r--libkcal/libical/zoneinfo/Europe/Prague.ics96
-rw-r--r--libkcal/libical/zoneinfo/Europe/Riga.ics167
-rw-r--r--libkcal/libical/zoneinfo/Europe/Rome.ics131
-rw-r--r--libkcal/libical/zoneinfo/Europe/Samara.ics125
-rw-r--r--libkcal/libical/zoneinfo/Europe/San_Marino.ics131
-rw-r--r--libkcal/libical/zoneinfo/Europe/Sarajevo.ics69
-rw-r--r--libkcal/libical/zoneinfo/Europe/Simferopol.ics150
-rw-r--r--libkcal/libical/zoneinfo/Europe/Skopje.ics69
-rw-r--r--libkcal/libical/zoneinfo/Europe/Sofia.ics123
-rw-r--r--libkcal/libical/zoneinfo/Europe/Stockholm.ics74
-rw-r--r--libkcal/libical/zoneinfo/Europe/Tallinn.ics160
-rw-r--r--libkcal/libical/zoneinfo/Europe/Tirane.ics85
-rw-r--r--libkcal/libical/zoneinfo/Europe/Uzhgorod.ics146
-rw-r--r--libkcal/libical/zoneinfo/Europe/Vaduz.ics57
-rw-r--r--libkcal/libical/zoneinfo/Europe/Vatican.ics131
-rw-r--r--libkcal/libical/zoneinfo/Europe/Vienna.ics89
-rw-r--r--libkcal/libical/zoneinfo/Europe/Vilnius.ics170
-rw-r--r--libkcal/libical/zoneinfo/Europe/Volgograd.ics112
-rw-r--r--libkcal/libical/zoneinfo/Europe/Warsaw.ics152
-rw-r--r--libkcal/libical/zoneinfo/Europe/Zagreb.ics69
-rw-r--r--libkcal/libical/zoneinfo/Europe/Zaporozhye.ics138
-rw-r--r--libkcal/libical/zoneinfo/Europe/Zurich.ics76
-rw-r--r--libkcal/libical/zoneinfo/Indian/Antananarivo.ics29
-rw-r--r--libkcal/libical/zoneinfo/Indian/Chagos.ics22
-rw-r--r--libkcal/libical/zoneinfo/Indian/Christmas.ics15
-rw-r--r--libkcal/libical/zoneinfo/Indian/Cocos.ics15
-rw-r--r--libkcal/libical/zoneinfo/Indian/Comoro.ics15
-rw-r--r--libkcal/libical/zoneinfo/Indian/Kerguelen.ics15
-rw-r--r--libkcal/libical/zoneinfo/Indian/Mahe.ics15
-rw-r--r--libkcal/libical/zoneinfo/Indian/Maldives.ics22
-rw-r--r--libkcal/libical/zoneinfo/Indian/Mauritius.ics15
-rw-r--r--libkcal/libical/zoneinfo/Indian/Mayotte.ics15
-rw-r--r--libkcal/libical/zoneinfo/Indian/Reunion.ics15
-rw-r--r--libkcal/libical/zoneinfo/Makefile.am39
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Apia.ics29
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Auckland.ics165
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Chatham.ics107
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Easter.ics154
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Efate.ics47
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Enderbury.ics29
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Fakaofo.ics15
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Fiji.ics31
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Funafuti.ics15
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Galapagos.ics22
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Gambier.ics15
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Guadalcanal.ics15
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Guam.ics29
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Honolulu.ics51
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Johnston.ics15
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Kiritimati.ics29
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Kosrae.ics29
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Kwajalein.ics29
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Majuro.ics22
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Marquesas.ics15
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Midway.ics43
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Nauru.ics36
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Niue.ics29
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Norfolk.ics22
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Noumea.ics33
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Pago_Pago.ics43
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Palau.ics15
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Pitcairn.ics22
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Ponape.ics15
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Port_Moresby.ics22
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Rarotonga.ics59
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Saipan.ics36
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Tahiti.ics15
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Tarawa.ics15
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Tongatapu.ics47
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Truk.ics15
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Wake.ics15
-rw-r--r--libkcal/libical/zoneinfo/Pacific/Wallis.ics15
-rw-r--r--libkcal/libical/zoneinfo/zones.h401
-rw-r--r--libkcal/libical/zoneinfo/zones.tab401
-rw-r--r--libkcal/libkcal_export.h28
-rw-r--r--libkcal/listbase.h97
-rw-r--r--libkcal/local.desktop60
-rw-r--r--libkcal/localdir.desktop60
-rw-r--r--libkcal/period.cpp92
-rw-r--r--libkcal/period.h70
-rw-r--r--libkcal/person.cpp96
-rw-r--r--libkcal/person.h62
-rw-r--r--libkcal/qtopiaformat.cpp316
-rw-r--r--libkcal/qtopiaformat.h55
-rw-r--r--libkcal/recurrence.cpp1079
-rw-r--r--libkcal/recurrence.h513
-rw-r--r--libkcal/recurrencerule.cpp1428
-rw-r--r--libkcal/recurrencerule.h343
-rw-r--r--libkcal/resourcecached.cpp661
-rw-r--r--libkcal/resourcecached.h358
-rw-r--r--libkcal/resourcecachedconfig.cpp120
-rw-r--r--libkcal/resourcecachedconfig.h88
-rw-r--r--libkcal/resourcecalendar.cpp205
-rw-r--r--libkcal/resourcecalendar.h413
-rw-r--r--libkcal/resourcelocal.cpp231
-rw-r--r--libkcal/resourcelocal.h104
-rw-r--r--libkcal/resourcelocal_plugin.cpp34
-rw-r--r--libkcal/resourcelocalconfig.cpp110
-rw-r--r--libkcal/resourcelocalconfig.h63
-rw-r--r--libkcal/resourcelocaldir.cpp277
-rw-r--r--libkcal/resourcelocaldir.h103
-rw-r--r--libkcal/resourcelocaldir_plugin.cpp33
-rw-r--r--libkcal/resourcelocaldirconfig.cpp72
-rw-r--r--libkcal/resourcelocaldirconfig.h66
-rw-r--r--libkcal/scheduler.cpp444
-rw-r--r--libkcal/scheduler.h193
-rw-r--r--libkcal/tests/Makefile.am102
-rwxr-xr-xlibkcal/tests/createref.sh12
-rwxr-xr-xlibkcal/tests/createtestcases.pl82
-rwxr-xr-xlibkcal/tests/data/Compat/Evolution_2.8.2_timezone_test.ics20
-rw-r--r--libkcal/tests/data/Compat/Evolution_2.8.2_timezone_test.ics.ical.ref18
-rw-r--r--libkcal/tests/data/Compat/KOrganizer_3.1.ics465
-rw-r--r--libkcal/tests/data/Compat/KOrganizer_3.1.ics.ical.ref256
-rw-r--r--libkcal/tests/data/Compat/KOrganizer_3.1a.ics70
-rw-r--r--libkcal/tests/data/Compat/KOrganizer_3.1a.ics.ical.ref42
-rw-r--r--libkcal/tests/data/Compat/KOrganizer_3.2.ics87
-rw-r--r--libkcal/tests/data/Compat/KOrganizer_3.2.ics.ical.ref83
-rw-r--r--libkcal/tests/data/Compat/MSExchange.ics44
-rw-r--r--libkcal/tests/data/Compat/MSExchange.ics.ical.fixme2
-rw-r--r--libkcal/tests/data/Compat/MSExchange.ics.ical.ref27
-rw-r--r--libkcal/tests/data/Compat/Mozilla_1.0.ics61
-rw-r--r--libkcal/tests/data/Compat/Mozilla_1.0.ics.ical.ref74
-rw-r--r--libkcal/tests/data/Compat/eGroupware.ics23
-rw-r--r--libkcal/tests/data/Compat/eGroupware.ics.ical.ref22
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily-3.0.7.ics.saved123
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily1.ics33
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily1.ics.next.ref68
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily1.ics.prev.ref68
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily1.ics.recurson.ref68
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily10.ics31
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily10.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily10.ics.prev.ref8
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily10.ics.recurson.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily11.ics31
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily11.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily11.ics.prev.ref122
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily11.ics.recurson.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily2.ics31
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily2.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily2.ics.prev.ref161
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily2.ics.recurson.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily3.ics31
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily3.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily3.ics.prev.ref161
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily3.ics.recurson.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily4.ics31
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily4.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily4.ics.prev.ref175
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily4.ics.recurson.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily5.ics31
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily5.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily5.ics.prev.ref81
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily5.ics.recurson.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily6.ics31
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily6.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily6.ics.prev.ref81
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily6.ics.recurson.ref80
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily7.ics31
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily7.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily7.ics.prev.ref81
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily7.ics.recurson.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily8.ics31
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily8.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily8.ics.prev.ref81
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily8.ics.recurson.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily9.ics31
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily9.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily9.ics.prev.ref8
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily9.ics.recurson.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/readme.txt1
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase01.ics23
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase01.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase01.ics.prev.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase01.ics.recurson.ref512
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase02.ics23
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase02.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase02.ics.prev.ref293
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase02.ics.recurson.ref292
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase03.ics23
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase03.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase03.ics.prev.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase03.ics.recurson.ref2050
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase04.ics24
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase04.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase04.ics.prev.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase04.ics.recurson.ref2050
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase05.ics23
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase05.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase05.ics.prev.ref35
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase05.ics.recurson.ref34
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase06.ics30
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase06.ics.next.ref2
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase06.ics.prev.ref2
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase06.ics.recurson.ref2
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase07.ics23
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase07.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase07.ics.prev.ref4
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase07.ics.recurson.ref4
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase08.ics23
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase08.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase08.ics.prev.ref68
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase08.ics.recurson.ref67
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase09.ics24
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase09.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase09.ics.prev.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase09.ics.recurson.ref2050
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase10.ics23
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase10.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase10.ics.prev.ref9
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase10.ics.recurson.ref9
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCases.ics.all214
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/readme.txt10
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase01.ics20
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase01.ics.next.ref28
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase01.ics.prev.ref28
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase01.ics.recurson.ref28
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase02.ics20
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase02.ics.next.ref18
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase02.ics.prev.ref18
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase02.ics.recurson.ref18
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase03.ics20
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase03.ics.next.ref18
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase03.ics.prev.ref18
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase03.ics.recurson.ref18
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase04.ics21
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase04.ics.next.ref10
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase04.ics.prev.ref10
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase04.ics.recurson.ref10
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase05.ics21
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase05.ics.next.ref6
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase05.ics.prev.ref6
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase05.ics.recurson.ref6
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase06.ics20
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase06.ics.next.ref51
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase06.ics.prev.ref51
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase06.ics.recurson.ref51
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase07.ics21
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase07.ics.next.ref18
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase07.ics.prev.ref18
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase07.ics.recurson.ref18
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase08.ics21
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase08.ics.next.ref18
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase08.ics.prev.ref18
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase08.ics.recurson.ref18
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase09.ics20
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase09.ics.next.ref18
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase09.ics.prev.ref18
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase09.ics.recurson.ref18
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase10.ics20
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase10.ics.next.ref14
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase10.ics.prev.ref14
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase10.ics.recurson.ref14
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase11.ics21
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase11.ics.next.ref18
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase11.ics.prev.ref18
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase11.ics.recurson.ref18
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase12.ics20
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase12.ics.next.ref15
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase12.ics.prev.ref15
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase12.ics.recurson.ref15
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase13.ics21
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase13.ics.next.ref8
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase13.ics.prev.ref8
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase13.ics.recurson.ref8
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCases.ics.saved219
-rw-r--r--libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/readme.txt14
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase01.ics13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase01.ics.next.ref9
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase01.ics.prev.ref9
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase01.ics.recurson.ref7
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase02.ics13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase02.ics.next.ref10
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase02.ics.prev.ref10
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase02.ics.recurson.ref8
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase03.ics13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase03.ics.next.ref502
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase03.ics.prev.ref15
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase03.ics.recurson.ref12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase04.ics13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase04.ics.next.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase04.ics.prev.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase04.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase05.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase05.ics.next.ref502
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase05.ics.prev.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase05.ics.recurson.ref10
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase06.ics13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase06.ics.next.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase06.ics.prev.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase06.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase07.ics13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase07.ics.next.ref6
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase07.ics.prev.ref6
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase07.ics.recurson.ref4
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase08.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase08.ics.next.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase08.ics.prev.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase08.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase09.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase09.ics.next.ref12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase09.ics.prev.ref12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase09.ics.recurson.ref10
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase10.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase10.ics.next.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase10.ics.prev.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase10.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase11.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase11.ics.next.ref8
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase11.ics.prev.ref8
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase11.ics.recurson.ref6
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase12.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase12.ics.next.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase12.ics.prev.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase12.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase15.ics13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase15.ics.next.ref9
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase15.ics.prev.ref9
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase15.ics.recurson.ref7
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase16.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase16.ics.next.ref53
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase16.ics.prev.ref53
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase16.ics.recurson.ref51
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase17.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase17.ics.next.ref12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase17.ics.prev.ref12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase17.ics.recurson.ref10
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase18.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase18.ics.next.ref17
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase18.ics.prev.ref17
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase18.ics.recurson.ref15
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase19.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase19.ics.next.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase19.ics.prev.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase19.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase20.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase20.ics.next.ref20
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase20.ics.prev.ref20
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase20.ics.recurson.ref18
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase21.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase21.ics.next.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase21.ics.prev.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase21.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase23.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase23.ics.next.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase23.ics.prev.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase23.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase24.ics13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase24.ics.next.ref28
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase24.ics.prev.ref28
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase24.ics.recurson.ref26
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase25.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase25.ics.next.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase25.ics.prev.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase25.ics.recurson.ref9
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase26.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase26.ics.next.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase26.ics.prev.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase26.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase27.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase27.ics.next.ref7
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase27.ics.prev.ref7
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase27.ics.recurson.ref5
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase28.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase28.ics.next.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase28.ics.prev.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase28.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase29.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase29.ics.next.ref9
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase29.ics.prev.ref9
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase29.ics.recurson.ref7
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase30.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase30.ics.next.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase30.ics.prev.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase30.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase31.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase31.ics.next.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase31.ics.prev.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase31.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase32.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase32.ics.next.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase32.ics.prev.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase32.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase33.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase33.ics.next.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase33.ics.prev.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase33.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase34.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase34.ics.next.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase34.ics.prev.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase34.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase35.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase35.ics.next.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase35.ics.prev.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase35.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase36.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase36.ics.next.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase36.ics.prev.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase36.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase37.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase37.ics.next.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase37.ics.prev.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase37.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase38.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase38.ics.next.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase38.ics.prev.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase38.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase39.ics13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase39.ics.next.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase39.ics.prev.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase39.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase40.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase40.ics.next.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase40.ics.prev.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase40.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase41.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase41.ics.next.ref23
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase41.ics.prev.ref23
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase41.ics.recurson.ref21
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase42.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase42.ics.next.ref14
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase42.ics.prev.ref14
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase42.ics.recurson.ref12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase43.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase43.ics.next.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase43.ics.prev.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase43.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase44.ics13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase44.ics.next.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase44.ics.prev.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase44.ics.recurson.ref5
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase45.ics13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase45.ics.next.ref6
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase45.ics.prev.ref6
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase45.ics.recurson.ref4
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase46.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase46.ics.next.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase46.ics.prev.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase46.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase48.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase48.ics.next.ref9
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase48.ics.prev.ref9
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase48.ics.recurson.ref2
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase49.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase49.ics.next.ref7
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase49.ics.prev.ref7
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase49.ics.recurson.ref2
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase50.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase50.ics.next.ref23
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase50.ics.prev.ref23
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase50.ics.recurson.ref2
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase51.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase51.ics.next.ref23
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase51.ics.prev.ref23
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase51.ics.recurson.ref2
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase54.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase54.ics.next.ref9
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase54.ics.prev.ref9
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase54.ics.recurson.ref7
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase55.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase55.ics.next.ref4
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase55.ics.prev.ref4
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase55.ics.recurson.ref2
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase56.ics13
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase56.ics.next.ref3
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase56.ics.prev.ref3
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase56.ics.recurson.ref1
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase57.ics15
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase57.ics.next.ref26
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase57.ics.prev.ref26
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase57.ics.recurson.ref24
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/readme.txt9
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/recur.ics.saved420
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/2445AllExamples.ics.saved367
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase01.ics33
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase01.ics.comp34.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase01.ics.next.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase01.ics.prev.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase01.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase02.ics33
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase02.ics.comp34.ref115
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase02.ics.next.ref114
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase02.ics.prev.ref114
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase02.ics.recurson.ref114
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase03.ics33
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase03.ics.comp34.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase03.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase03.ics.prev.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase03.ics.recurson.ref2435
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase04.ics33
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase04.ics.comp34.ref6
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase04.ics.next.ref6
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase04.ics.prev.ref6
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase04.ics.recurson.ref6
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase05.ics34
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase05.ics.comp34.ref2
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase05.ics.next.ref93
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase05.ics.prev.ref93
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase05.ics.recurson.ref93
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase06.ics33
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase06.ics.comp34.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase06.ics.next.ref93
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase06.ics.prev.ref93
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase06.ics.recurson.ref93
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase07.ics33
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase07.ics.comp34.ref2
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase07.ics.next.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase07.ics.prev.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase07.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase08.ics33
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase08.ics.comp34.ref18
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase08.ics.next.ref18
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase08.ics.prev.ref18
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase08.ics.recurson.ref18
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase09.ics33
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase09.ics.comp34.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase09.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase09.ics.prev.ref349
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase09.ics.recurson.ref348
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase10.ics33
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase10.ics.comp34.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase10.ics.next.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase10.ics.prev.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase10.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase11.ics33
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase11.ics.comp34.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase11.ics.next.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase11.ics.prev.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase11.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase12.ics34
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase12.ics.comp34.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase12.ics.next.ref26
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase12.ics.prev.ref26
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase12.ics.recurson.ref26
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase13.ics33
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase13.ics.comp34.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase13.ics.next.ref9
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase13.ics.prev.ref9
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase13.ics.recurson.ref9
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase14.ics33
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase14.ics.comp34.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase14.ics.next.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase14.ics.prev.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase14.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase15.ics33
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase15.ics.comp34.ref5
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase15.ics.next.ref5
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase15.ics.prev.ref5
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase15.ics.recurson.ref5
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase16.ics34
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase16.ics.comp34.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase16.ics.next.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase16.ics.prev.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase16.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase17.ics34
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase17.ics.comp34.ref7
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase17.ics.next.ref7
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase17.ics.prev.ref7
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase17.ics.recurson.ref7
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase18.ics33
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase18.ics.comp34.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase18.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase18.ics.prev.ref161
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase18.ics.recurson.ref160
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase19.ics33
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase19.ics.comp34.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase19.ics.next.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase19.ics.prev.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase19.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase20.ics34
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase20.ics.comp34.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase20.ics.next.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase20.ics.prev.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase20.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase21.ics34
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase21.ics.comp34.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase21.ics.next.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase21.ics.prev.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase21.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase22.ics33
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase22.ics.comp34.ref2
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase22.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase22.ics.prev.ref351
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase22.ics.recurson.ref350
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase23.ics33
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase23.ics.comp34.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase23.ics.next.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase23.ics.prev.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase23.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase24.ics34
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase24.ics.comp34.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase24.ics.next.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase24.ics.prev.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase24.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase25.ics34
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase25.ics.comp34.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase25.ics.next.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase25.ics.prev.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase25.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase26.ics33
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase26.ics.comp34.ref1
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase26.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase26.ics.prev.ref15
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase26.ics.recurson.ref14
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase27.ics34
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase27.ics.comp34.ref1
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase27.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase27.ics.prev.ref15
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase27.ics.recurson.ref14
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase28.ics33
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase28.ics.comp34.ref2
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase28.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase28.ics.prev.ref61
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase28.ics.recurson.ref60
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase29.ics34
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase29.ics.comp34.ref2
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase29.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase29.ics.prev.ref185
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase29.ics.recurson.ref184
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase30.ics34
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase30.ics.comp34.ref2
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase30.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase30.ics.prev.ref23
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase30.ics.recurson.ref22
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase31.ics34
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase31.ics.comp34.ref2
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase31.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase31.ics.prev.ref161
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase31.ics.recurson.ref160
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase32.ics34
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase32.ics.comp34.ref2
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase32.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase32.ics.prev.ref5
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase32.ics.recurson.ref4
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase33.ics34
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase33.ics.comp34.ref5
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase33.ics.next.ref4
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase33.ics.prev.ref4
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase33.ics.recurson.ref4
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase34.ics33
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase34.ics.comp34.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase34.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase34.ics.prev.ref161
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase34.ics.recurson.ref160
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase35.ics33
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase35.ics.comp34.ref3
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase35.ics.next.ref3
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase35.ics.prev.ref3
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase35.ics.recurson.ref2
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36.ics33
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36.ics.comp34.ref7
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36.ics.next.ref7
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36.ics.prev.ref7
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36.ics.recurson.ref2
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36U.ics34
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36U.ics.comp34.ref8
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36U.ics.next.ref8
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36U.ics.prev.ref8
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36U.ics.recurson.ref2
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase37.ics33
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase37.ics.comp34.ref5
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase37.ics.next.ref5
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase37.ics.prev.ref5
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase37.ics.recurson.ref2
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase38.ics33
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase38.ics.comp34.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase38.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase38.ics.prev.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase38.ics.recurson.ref4869
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase39.ics33
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase39.ics.comp34.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase39.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase39.ics.prev.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase39.ics.recurson.ref4869
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase40.ics15
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase40.ics.comp34.ref5
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase40.ics.next.ref5
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase40.ics.prev.ref5
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase40.ics.recurson.ref5
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase41.ics14
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase41.ics.comp34.ref3
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase41.ics.next.ref5
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase41.ics.prev.ref5
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase41.ics.recurson.ref5
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/readme.txt2
-rw-r--r--libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase02.ics11
-rw-r--r--libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase02.ics.next.ref2
-rw-r--r--libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase02.ics.prev.ref2
-rw-r--r--libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase02.ics.recurson.ref1
-rw-r--r--libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase03.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase03.ics.next.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase03.ics.prev.ref13
-rw-r--r--libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase03.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase04.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase04.ics.next.fixme2
-rw-r--r--libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase04.ics.next.ref4
-rw-r--r--libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase04.ics.prev.fixme2
-rw-r--r--libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase04.ics.prev.ref4
-rw-r--r--libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase04.ics.recurson.ref2
-rw-r--r--libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase05.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase05.ics.next.ref93
-rw-r--r--libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase05.ics.prev.ref93
-rw-r--r--libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase05.ics.recurson.ref93
-rw-r--r--libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase06.ics12
-rw-r--r--libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase06.ics.next.fixme2
-rw-r--r--libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase06.ics.next.ref95
-rw-r--r--libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase06.ics.prev.ref93
-rw-r--r--libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase06.ics.recurson.ref93
-rw-r--r--libkcal/tests/data/RecurrenceRule/UntilInUTC/readme.txt25
-rw-r--r--libkcal/tests/data/RecurrenceRule/readme.txt3
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/PayDay.ics31
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/PayDay.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/PayDay.ics.prev.ref84
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/PayDay.ics.recurson.ref83
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/anniversary_4.6.1.ics13
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/anniversary_4.6.1.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/anniversary_4.6.1.ics.prev.ref15
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/anniversary_4.6.1.ics.recurson.ref14
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/daily.ics16
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/daily.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/daily.ics.prev.ref31
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/daily.ics.recurson.ref30
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/exdate.ics24
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/exdate.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/exdate.ics.prev.ref293
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/exdate.ics.recurson.ref292
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/hourly.ics15
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/hourly.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/hourly.ics.prev.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/hourly.ics.recurson.ref2060
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/lastworkday.ics15
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/lastworkday.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/lastworkday.ics.prev.ref70
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/lastworkday.ics.recurson.ref69
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/monthly.ics15
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/monthly.ics.comp34.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/monthly.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/monthly.ics.prev.ref138
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/monthly.ics.recurson.ref137
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/rdate.ics19
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/rdate.ics.next.ref14
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/rdate.ics.prev.ref14
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/rdate.ics.recurson.ref11
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/test1.ics15
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/test1.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/test1.ics.prev.ref18
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/test1.ics.recurson.ref9
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/weekly.ics15
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/weekly.ics.comp34.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/weekly.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/weekly.ics.prev.ref296
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/weekly.ics.recurson.ref295
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/yearly.ics15
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/yearly.ics.comp34.ref499
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/yearly.ics.next.ref500
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/yearly.ics.prev.ref4
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/yearly.ics.recurson.ref3
-rw-r--r--libkcal/tests/data/resource_test_config8
-rw-r--r--libkcal/tests/data/test_pilot.ics23
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_3.4.ics.all220
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_3.4.vcs.all201
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase01.ics22
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase01.ics.vcal.ref20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase01.vcs20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase01.vcs.ical.ref20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase02.ics22
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase02.ics.vcal.ref20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase02.vcs20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase02.vcs.ical.ref20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase03.ics22
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase03.ics.vcal.ref20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase03.vcs20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase03.vcs.ical.ref20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase04.ics23
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase04.ics.vcal.ref20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase04.vcs20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase04.vcs.ical.ref21
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase05.ics23
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase05.ics.vcal.ref20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase05.vcs20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase05.vcs.ical.ref21
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase06.ics22
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase06.ics.vcal.ref20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase06.vcs20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase06.vcs.ical.ref19
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase07.ics23
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase07.ics.vcal.ref19
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase07.vcs19
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase07.vcs.ical.ref20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase08.ics23
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase08.ics.vcal.ref19
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase08.vcs19
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase08.vcs.ical.ref20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase09.ics22
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase09.ics.vcal.ref20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase09.vcs20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase09.vcs.ical.ref20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase10.ics22
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase10.ics.vcal.ref20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase10.vcs20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase10.vcs.ical.ref20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase11.ics23
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase11.ics.vcal.ref20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase11.vcs20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase11.vcs.ical.ref21
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase12.ics22
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase12.ics.vcal.ref20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase12.vcs20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase12.vcs.ical.ref20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase13.ics23
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase13.ics.vcal.ref20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase13.vcs20
-rw-r--r--libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase13.vcs.ical.ref21
-rw-r--r--libkcal/tests/data/vCalendar/readme.txt5
-rw-r--r--libkcal/tests/fbrecurring.cpp52
-rw-r--r--libkcal/tests/readandwrite.cpp84
-rwxr-xr-xlibkcal/tests/runtestcase.pl162
-rw-r--r--libkcal/tests/testcalendar.cpp54
-rw-r--r--libkcal/tests/testfb.cpp64
-rw-r--r--libkcal/tests/testfields.cpp169
-rw-r--r--libkcal/tests/testincidence.cpp92
-rw-r--r--libkcal/tests/testincidencegenerator.h34
-rw-r--r--libkcal/tests/testrecurprevious.cpp134
-rw-r--r--libkcal/tests/testrecurrence.cpp126
-rw-r--r--libkcal/tests/testrecurrencetype.cpp126
-rw-r--r--libkcal/tests/testrecurson.cpp121
-rw-r--r--libkcal/tests/testresource.cpp253
-rw-r--r--libkcal/tests/testresource.h55
-rw-r--r--libkcal/tests/testtostring.cpp46
-rw-r--r--libkcal/tests/testvcalexport.cpp90
-rw-r--r--libkcal/todo.cpp318
-rw-r--r--libkcal/todo.h242
-rw-r--r--libkcal/vcaldrag.cpp55
-rw-r--r--libkcal/vcaldrag.h60
-rw-r--r--libkcal/vcalformat.cpp1626
-rw-r--r--libkcal/vcalformat.h121
-rw-r--r--libkcal/versit/Makefile.am6
-rw-r--r--libkcal/versit/port.h75
-rw-r--r--libkcal/versit/readme.txt944
-rw-r--r--libkcal/versit/vcc.c2498
-rw-r--r--libkcal/versit/vcc.h76
-rw-r--r--libkcal/versit/vcc.y1232
-rw-r--r--libkcal/versit/vobject.c1429
-rw-r--r--libkcal/versit/vobject.h384
1379 files changed, 201265 insertions, 0 deletions
diff --git a/libkcal/COPYING b/libkcal/COPYING
new file mode 100644
index 00000000..b05ce718
--- /dev/null
+++ b/libkcal/COPYING
@@ -0,0 +1,487 @@
+NOTE! The LGPL below is copyrighted by the Free Software Foundation, but
+the instance of code that it refers to are copyrighted
+by the authors who actually wrote it.
+
+---------------------------------------------------------------------------
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor
+ Boston, MA 02110-1301, USA.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL. It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it. You can use it for
+your libraries, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library. If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software. To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+ Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs. This
+license, the GNU Library General Public License, applies to certain
+designated libraries. This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+ The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it. Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program. However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+ Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries. We
+concluded that weaker conditions might promote sharing better.
+
+ However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves. This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them. (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.) The hope is that this
+will lead to faster development of free libraries.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+ Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License"). Each licensee is
+addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ c) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ d) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/libkcal/DESIGN b/libkcal/DESIGN
new file mode 100644
index 00000000..37023c1a
--- /dev/null
+++ b/libkcal/DESIGN
@@ -0,0 +1,63 @@
+LIBKCAL
+=======
+
+libkcal provides the non-GUI part of calendaring. It is partly based
+on libical, an implementation of the iCalendar format defined in
+rfc2445. libical is an object-oriented C library, which provides basic
+but complete handling of calendaring components. libkcal puts a C++
+face on it, which fully encapsulates the library.
+
+Calendaring data is handled by the Calendar class interface, which
+provides a storage for calendar components. One implementation of the
+Calendar interface exists, the CalendarLocal class, which provides
+local storage as a file. (TODO: Explain the resources.)
+
+The Calendar class uses the CalFormat class interface to convert
+calendar data into a textual representation. There are two
+implementations, the VCalFormat for vCalendar and the ICalFormat for
+iCalendar.
+
+Actual calendaring components are handled by the classes Event, Todo
+and Journal, all inheriting from the common base class
+Incidence. These classes store the information related to an event,
+todo or journal entry.
+
+Specifics
+=========
+
+This is the place to put in developer notes for various specific
+places that need extra description.
+
+The scheduling ID
+-----------------
+
+In the Incidence class, there is an attribute called mSchedulingID.
+It is only set when you have an event or to-do that is the result of
+accepting an invitation. In this case it is the value of the UID of
+the invitation, and is used for looking up the event if you get
+changes to the original invitations - changes, canceling, updates...
+
+The get-method that returns the schedulingID checks if this is set
+at all. If not, it returns the UID. And when the incidence is saved in
+iCal, the schedulingID (i.e. the UID if no SID is there) is saved in
+the iCal UID field, and if schedulingID is not null, the UID of the
+incidence is saved in X-KDE-LIBKCAL-ID. The reason for this is
+compatibility with other iCal based applications, because they expect
+the UID of the invitation to be saved in the iCal UID field. In the
+Kolab resource XML format, there is a tag <scheduling-id> where it is
+stored if present.
+
+This is the scenario that led to the introduction of this scheme: If
+you have access to some other persons calendar - for example with the
+IMAP or Kolab resources using shared folders - and both you and the
+other accept the same invitation, then you both have an event with the
+same SID. Had this been the UID (as was previously the case and as is
+done by other applications) then you would have two incidences with
+the same UID, and libkcal is designed with a very basic assumption
+that this must never happen. By storing the UID in SID and making a
+new and private UID, there is still the link to the invitation UID
+that is necessary for scheduling, and the UIDs of the two incidences
+in your calendar are different. The scenario that really has this
+problem is the secretary scenario - the secretary will often be at the
+same events as the boss, and has access to the boss' folders. This
+means he or she would see this problem all the time.
diff --git a/libkcal/HACKING b/libkcal/HACKING
new file mode 100644
index 00000000..1029d1b4
--- /dev/null
+++ b/libkcal/HACKING
@@ -0,0 +1,8 @@
+See kdelibs/kabc/HACKING or http://korganizer.kde.org/develop/hacking.html for
+general coding style conventions.
+
+Additional conventions for libkcal and KOrganizer:
+
+- Don't use dynamic_cast. In most cases the use of dynamic_cast is an indication
+for design problems. In addition it isn't always available, e.g. when compiling
+without run-time type information for KOrganizer/Embedded.
diff --git a/libkcal/Mainpage.dox b/libkcal/Mainpage.dox
new file mode 100644
index 00000000..c1d800c4
--- /dev/null
+++ b/libkcal/Mainpage.dox
@@ -0,0 +1,15 @@
+/** \mainpage libkcal - The KDE calendar access library.
+
+This library provides access to and handling of calendar data. It supports the
+standard formats iCalendar and vCalendar and the group scheduling standard iTIP.
+
+<b>Important:</b> This is mainly a KDE PIM internal library. The API might be
+subject to source and binary incompatible changes.
+
+If you use this library for kdepim-external projects, please let us know, so we
+can coordinate possible changes.
+
+libkcal development is discussed on the <a
+href="mailto:kde-pim@kde.org">kde-pim@kde.org</a> mailing list.
+
+*/
diff --git a/libkcal/Makefile.am b/libkcal/Makefile.am
new file mode 100644
index 00000000..ccdebd9d
--- /dev/null
+++ b/libkcal/Makefile.am
@@ -0,0 +1,81 @@
+SUBDIRS = libical versit tests
+
+INCLUDES = -I$(srcdir)/libical/src/libical \
+ -I$(srcdir)/libical/src/libicalss -I./libical/src/libical \
+ -I./libical/src/libicalss -I$(srcdir)/versit -I$(top_srcdir)/ \
+ -I$(top_srcdir)/ktnef \
+ -I$(top_srcdir)/libemailfunctions \
+ $(all_includes)
+
+lib_LTLIBRARIES = libkcal.la
+libkcal_la_LDFLAGS = $(all_libraries) -no-undefined -version-info 2:0:0
+libkcal_la_LIBADD = versit/libversit.la $(LIB_KIO) \
+ ./libical/src/libical/libical.la \
+ ./libical/src/libicalss/libicalss.la \
+ $(top_builddir)/ktnef/lib/libktnef.la \
+ ../libemailfunctions/libemailfunctions.la \
+ -lkresources -lkabc
+
+libkcal_la_COMPILE_FIRST = ./libical/src/libical/ical.h ./libical/src/libicalss/icalss.h
+libkcal_la_SOURCES = \
+ incidencebase.cpp incidence.cpp journal.cpp todo.cpp event.cpp \
+ freebusy.cpp attendee.cpp attachment.cpp recurrencerule.cpp recurrence.cpp alarm.cpp \
+ customproperties.cpp calendar.cpp calendarlocal.cpp \
+ calformat.cpp vcalformat.cpp icalformat.cpp icalformatimpl.cpp \
+ incidenceformatter.cpp \
+ vcaldrag.cpp icaldrag.cpp \
+ exceptions.cpp \
+ scheduler.cpp imipscheduler.cpp dummyscheduler.cpp \
+ calfilter.cpp \
+ person.cpp period.cpp duration.cpp \
+ dndfactory.cpp \
+ filestorage.cpp \
+ compat.cpp \
+ resourcecalendar.cpp resourcelocal.cpp resourcelocalconfig.cpp \
+ resourcelocaldir.cpp resourcelocaldirconfig.cpp \
+ resourcecached.cpp resourcecachedconfig.cpp \
+ calendarresources.cpp \
+ qtopiaformat.cpp \
+ htmlexportsettings.kcfgc htmlexport.cpp calendarnull.cpp \
+ freebusyurlstore.cpp \
+ confirmsavedialog.cpp
+
+libkcalincludedir = $(includedir)/libkcal
+libkcalinclude_HEADERS = alarm.h attachment.h attendee.h calendar.h \
+ calendarlocal.h calendarnull.h calendarresources.h calfilter.h calformat.h \
+ calstorage.h customproperties.h dndfactory.h duration.h event.h \
+ exceptions.h filestorage.h freebusy.h htmlexportsettings.h htmlexport.h icaldrag.h icalformat.h \
+ incidencebase.h incidence.h incidenceformatter.h journal.h kcalversion.h listbase.h period.h person.h \
+ qtopiaformat.h recurrencerule.h recurrence.h resourcecached.h resourcecalendar.h \
+ resourcelocalconfig.h resourcelocaldirconfig.h resourcelocaldir.h \
+ resourcelocal.h scheduler.h libkcal_export.h \
+ todo.h vcaldrag.h vcalformat.h
+
+kde_module_LTLIBRARIES = kcal_local.la kcal_localdir.la
+
+kcal_local_la_SOURCES = resourcelocal_plugin.cpp
+kcal_local_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN)
+kcal_local_la_LIBADD = libkcal.la
+
+kcal_localdir_la_SOURCES = resourcelocaldir_plugin.cpp
+kcal_localdir_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN)
+kcal_localdir_la_LIBADD = libkcal.la
+
+EXTRA_PROGRAMS = convertqtopia
+convertqtopia_SOURCES = convertqtopia.cpp
+convertqtopia_LDADD = libkcal.la
+
+servicedir = $(kde_servicesdir)/kresources/kcal
+service_DATA = local.desktop localdir.desktop
+
+manager_DATA = kcal_manager.desktop
+managerdir = $(kde_servicesdir)/kresources
+
+METASOURCES = AUTO
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/libkcal.pot
+
+DOXYGEN_EXCLUDE = libical
+DOXYGEN_REFERENCES=kresources
+include $(top_srcdir)/admin/Doxyfile.am
diff --git a/libkcal/README b/libkcal/README
new file mode 100644
index 00000000..a8085d8a
--- /dev/null
+++ b/libkcal/README
@@ -0,0 +1,11 @@
+libkcal
+=======
+
+This library contains the calendaring classes originally only used by
+KOrganizer. They provide a C++ API for handling the vCalendar and iCalendar
+formats, which makes use of Qt classes. This library should be GUI independent
+and suitable for writing command line applications.
+
+Its API is still under development and will change without further notice. If
+you are interested in using this library, please contact Cornelius Schumacher
+<schumacher@kde.org>, the current maintainer of the lib.
diff --git a/libkcal/README.libical b/libkcal/README.libical
new file mode 100644
index 00000000..3e1365b5
--- /dev/null
+++ b/libkcal/README.libical
@@ -0,0 +1,4 @@
+The directory libical contains version 0.23 of libical with a few minor
+modifications to let it compile in the kdepim module. You can get the original
+distribution from http://www.softwarestudio.org/download. More information about
+libical can be found at http://www.softwarestudio.org/libical.
diff --git a/libkcal/alarm.cpp b/libkcal/alarm.cpp
new file mode 100644
index 00000000..c4416fb7
--- /dev/null
+++ b/libkcal/alarm.cpp
@@ -0,0 +1,459 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 1998 Preston Brown <pbrown@kde.org>
+ Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "incidence.h"
+#include "todo.h"
+
+#include "alarm.h"
+
+using namespace KCal;
+
+Alarm::Alarm(Incidence *parent)
+ : mParent(parent),
+ mType(Invalid),
+ mDescription(""), // to make operator==() not fail
+ mFile(""), // to make operator==() not fail
+ mMailSubject(""), // to make operator==() not fail
+ mAlarmSnoozeTime(5),
+ mAlarmRepeatCount(0),
+ mEndOffset(false),
+ mHasTime(false),
+ mAlarmEnabled(false)
+{
+}
+
+Alarm::~Alarm()
+{
+}
+
+bool Alarm::operator==( const Alarm& rhs ) const
+{
+ if ( mType != rhs.mType ||
+ mAlarmSnoozeTime != rhs.mAlarmSnoozeTime ||
+ mAlarmRepeatCount != rhs.mAlarmRepeatCount ||
+ mAlarmEnabled != rhs.mAlarmEnabled ||
+ mHasTime != rhs.mHasTime)
+ return false;
+
+ if (mHasTime) {
+ if (mAlarmTime != rhs.mAlarmTime)
+ return false;
+ } else {
+ if (mOffset != rhs.mOffset ||
+ mEndOffset != rhs.mEndOffset)
+ return false;
+ }
+
+ switch (mType) {
+ case Display:
+ return mDescription == rhs.mDescription;
+
+ case Email:
+ return mDescription == rhs.mDescription &&
+ mMailAttachFiles == rhs.mMailAttachFiles &&
+ mMailAddresses == rhs.mMailAddresses &&
+ mMailSubject == rhs.mMailSubject;
+
+ case Procedure:
+ return mFile == rhs.mFile &&
+ mDescription == rhs.mDescription;
+
+ case Audio:
+ return mFile == rhs.mFile;
+
+ case Invalid:
+ break;
+ }
+ return false;
+}
+
+void Alarm::setType(Alarm::Type type)
+{
+ if (type == mType)
+ return;
+
+ switch (type) {
+ case Display:
+ mDescription = "";
+ break;
+ case Procedure:
+ mFile = mDescription = "";
+ break;
+ case Audio:
+ mFile = "";
+ break;
+ case Email:
+ mMailSubject = mDescription = "";
+ mMailAddresses.clear();
+ mMailAttachFiles.clear();
+ break;
+ case Invalid:
+ break;
+ default:
+ return;
+ }
+ mType = type;
+ if ( mParent ) mParent->updated();
+}
+
+Alarm::Type Alarm::type() const
+{
+ return mType;
+}
+
+void Alarm::setAudioAlarm(const QString &audioFile)
+{
+ mType = Audio;
+ mFile = audioFile;
+ if ( mParent ) mParent->updated();
+}
+
+void Alarm::setAudioFile(const QString &audioFile)
+{
+ if (mType == Audio) {
+ mFile = audioFile;
+ if ( mParent ) mParent->updated();
+ }
+}
+
+QString Alarm::audioFile() const
+{
+ return (mType == Audio) ? mFile : QString::null;
+}
+
+void Alarm::setProcedureAlarm(const QString &programFile, const QString &arguments)
+{
+ mType = Procedure;
+ mFile = programFile;
+ mDescription = arguments;
+ if ( mParent ) mParent->updated();
+}
+
+void Alarm::setProgramFile(const QString &programFile)
+{
+ if (mType == Procedure) {
+ mFile = programFile;
+ if ( mParent ) mParent->updated();
+ }
+}
+
+QString Alarm::programFile() const
+{
+ return (mType == Procedure) ? mFile : QString::null;
+}
+
+void Alarm::setProgramArguments(const QString &arguments)
+{
+ if (mType == Procedure) {
+ mDescription = arguments;
+ if ( mParent ) mParent->updated();
+ }
+}
+
+QString Alarm::programArguments() const
+{
+ return (mType == Procedure) ? mDescription : QString::null;
+}
+
+void Alarm::setEmailAlarm(const QString &subject, const QString &text,
+ const QValueList<Person> &addressees, const QStringList &attachments)
+{
+ mType = Email;
+ mMailSubject = subject;
+ mDescription = text;
+ mMailAddresses = addressees;
+ mMailAttachFiles = attachments;
+ if ( mParent ) mParent->updated();
+}
+
+void Alarm::setMailAddress(const Person &mailAddress)
+{
+ if (mType == Email) {
+ mMailAddresses.clear();
+ mMailAddresses += mailAddress;
+ if ( mParent ) mParent->updated();
+ }
+}
+
+void Alarm::setMailAddresses(const QValueList<Person> &mailAddresses)
+{
+ if (mType == Email) {
+ mMailAddresses = mailAddresses;
+ if ( mParent ) mParent->updated();
+ }
+}
+
+void Alarm::addMailAddress(const Person &mailAddress)
+{
+ if (mType == Email) {
+ mMailAddresses += mailAddress;
+ if ( mParent ) mParent->updated();
+ }
+}
+
+QValueList<Person> Alarm::mailAddresses() const
+{
+ return (mType == Email) ? mMailAddresses : QValueList<Person>();
+}
+
+void Alarm::setMailSubject(const QString &mailAlarmSubject)
+{
+ if (mType == Email) {
+ mMailSubject = mailAlarmSubject;
+ if ( mParent ) mParent->updated();
+ }
+}
+
+QString Alarm::mailSubject() const
+{
+ return (mType == Email) ? mMailSubject : QString::null;
+}
+
+void Alarm::setMailAttachment(const QString &mailAttachFile)
+{
+ if (mType == Email) {
+ mMailAttachFiles.clear();
+ mMailAttachFiles += mailAttachFile;
+ if ( mParent ) mParent->updated();
+ }
+}
+
+void Alarm::setMailAttachments(const QStringList &mailAttachFiles)
+{
+ if (mType == Email) {
+ mMailAttachFiles = mailAttachFiles;
+ if ( mParent ) mParent->updated();
+ }
+}
+
+void Alarm::addMailAttachment(const QString &mailAttachFile)
+{
+ if (mType == Email) {
+ mMailAttachFiles += mailAttachFile;
+ if ( mParent ) mParent->updated();
+ }
+}
+
+QStringList Alarm::mailAttachments() const
+{
+ return (mType == Email) ? mMailAttachFiles : QStringList();
+}
+
+void Alarm::setMailText(const QString &text)
+{
+ if (mType == Email) {
+ mDescription = text;
+ if ( mParent ) mParent->updated();
+ }
+}
+
+QString Alarm::mailText() const
+{
+ return (mType == Email) ? mDescription : QString::null;
+}
+
+void Alarm::setDisplayAlarm(const QString &text)
+{
+ mType = Display;
+ if ( !text.isNull() )
+ mDescription = text;
+ if ( mParent ) mParent->updated();
+}
+
+void Alarm::setText(const QString &text)
+{
+ if (mType == Display) {
+ mDescription = text;
+ if ( mParent ) mParent->updated();
+ }
+}
+
+QString Alarm::text() const
+{
+ return (mType == Display) ? mDescription : QString::null;
+}
+
+void Alarm::setTime(const QDateTime &alarmTime)
+{
+ mAlarmTime = alarmTime;
+ mHasTime = true;
+
+ if ( mParent ) mParent->updated();
+}
+
+QDateTime Alarm::time() const
+{
+ if ( hasTime() )
+ return mAlarmTime;
+ else if ( mParent )
+ {
+ if (mParent->type()=="Todo") {
+ Todo *t = static_cast<Todo*>(mParent);
+ return mOffset.end( t->dtDue() );
+ } else if (mEndOffset) {
+ return mOffset.end( mParent->dtEnd() );
+ } else {
+ return mOffset.end( mParent->dtStart() );
+ }
+ } else return QDateTime();
+}
+
+bool Alarm::hasTime() const
+{
+ return mHasTime;
+}
+
+void Alarm::setSnoozeTime(int alarmSnoozeTime)
+{
+ if (alarmSnoozeTime > 0) {
+ mAlarmSnoozeTime = alarmSnoozeTime;
+ if ( mParent ) mParent->updated();
+ }
+}
+
+int Alarm::snoozeTime() const
+{
+ return mAlarmSnoozeTime;
+}
+
+void Alarm::setRepeatCount(int alarmRepeatCount)
+{
+ mAlarmRepeatCount = alarmRepeatCount;
+ if ( mParent ) mParent->updated();
+}
+
+int Alarm::repeatCount() const
+{
+ return mAlarmRepeatCount;
+}
+
+int Alarm::duration() const
+{
+ return mAlarmRepeatCount * mAlarmSnoozeTime * 60;
+}
+
+QDateTime Alarm::nextRepetition(const QDateTime& preTime) const
+{
+ // This method is coded to avoid 32-bit integer overflow using
+ // QDateTime::secsTo(), which occurs with time spans > 68 years.
+ QDateTime at = time();
+ if (at > preTime)
+ return at;
+ if (!mAlarmRepeatCount)
+ return QDateTime(); // there isn't an occurrence after the specified time
+ int snoozeSecs = mAlarmSnoozeTime * 60;
+ QDateTime lastRepetition = at.addSecs(mAlarmRepeatCount * snoozeSecs);
+ if (lastRepetition <= preTime)
+ return QDateTime(); // all repetitions have finished before the specified time
+ int repetition = (at.secsTo(preTime) + snoozeSecs) / snoozeSecs;
+ return at.addSecs(repetition * snoozeSecs);
+}
+
+QDateTime Alarm::previousRepetition(const QDateTime& afterTime) const
+{
+ // This method is coded to avoid 32-bit integer overflow using
+ // QDateTime::secsTo(), which occurs with time spans > 68 years.
+ QDateTime at = time();
+ if (at >= afterTime)
+ return QDateTime(); // alarm's first/only time is at/after the specified time
+ if (!mAlarmRepeatCount)
+ return at;
+ int snoozeSecs = mAlarmSnoozeTime * 60;
+ QDateTime lastRepetition = at.addSecs(mAlarmRepeatCount * snoozeSecs);
+ if (lastRepetition < afterTime)
+ return lastRepetition; // all repetitions have finished before the specified time
+ int repetition = (at.secsTo(afterTime) - 1) / snoozeSecs;
+ return at.addSecs(repetition * snoozeSecs);
+}
+
+QDateTime Alarm::endTime() const
+{
+ if (mAlarmRepeatCount)
+ return time().addSecs(mAlarmRepeatCount * mAlarmSnoozeTime * 60);
+ else
+ return time();
+}
+
+void Alarm::toggleAlarm()
+{
+ mAlarmEnabled = !mAlarmEnabled;
+ if ( mParent ) mParent->updated();
+}
+
+void Alarm::setEnabled(bool enable)
+{
+ mAlarmEnabled = enable;
+ if ( mParent ) mParent->updated();
+}
+
+bool Alarm::enabled() const
+{
+ return mAlarmEnabled;
+}
+
+void Alarm::setStartOffset( const Duration &offset )
+{
+ mOffset = offset;
+ mEndOffset = false;
+ mHasTime = false;
+ if ( mParent ) mParent->updated();
+}
+
+Duration Alarm::startOffset() const
+{
+ return (mHasTime || mEndOffset) ? 0 : mOffset;
+}
+
+bool Alarm::hasStartOffset() const
+{
+ return !mHasTime && !mEndOffset;
+}
+
+bool Alarm::hasEndOffset() const
+{
+ return !mHasTime && mEndOffset;
+}
+
+void Alarm::setEndOffset( const Duration &offset )
+{
+ mOffset = offset;
+ mEndOffset = true;
+ mHasTime = false;
+ if ( mParent ) mParent->updated();
+}
+
+Duration Alarm::endOffset() const
+{
+ return (mHasTime || !mEndOffset) ? 0 : mOffset;
+}
+
+void Alarm::setParent( Incidence *parent )
+{
+ mParent = parent;
+}
+
+void Alarm::customPropertyUpdated()
+{
+ if ( mParent ) mParent->updated();
+}
diff --git a/libkcal/alarm.h b/libkcal/alarm.h
new file mode 100644
index 00000000..64970e63
--- /dev/null
+++ b/libkcal/alarm.h
@@ -0,0 +1,370 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001-2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef KCAL_ALARM_H
+#define KCAL_ALARM_H
+
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qvaluelist.h>
+
+#include "customproperties.h"
+#include "duration.h"
+#include "person.h"
+#include "listbase.h"
+#include "libkcal_export.h"
+
+#include <kdepimmacros.h>
+
+namespace KCal {
+
+class Incidence;
+
+/**
+ This class represents an alarm notification.
+*/
+class LIBKCAL_EXPORT Alarm : public CustomProperties
+{
+ public:
+ enum Type { Invalid, Display, Procedure, Email, Audio };
+
+ typedef ListBase<Alarm> List;
+
+ /**
+ Construct a new alarm with variables initialized to "sane" values.
+ */
+ explicit Alarm( Incidence *parent );
+ /**
+ Destruct Alarm object.
+ */
+ ~Alarm();
+
+ /**
+ Compare this alarm with another one.
+ */
+ bool operator==( const Alarm & ) const;
+ bool operator!=( const Alarm &a ) const { return !operator==( a ); }
+
+ /**
+ Set the type of the alarm.
+ If the specified type is different from the current type of the alarm,
+ the alarm's type-specific properties are initialised to null.
+
+ @param type type of alarm.
+ */
+ void setType( Type type );
+ /**
+ Return the type of the alarm.
+ */
+ Type type() const;
+
+ /**
+ Set the alarm to be a display alarm.
+
+ @param text text to display when the alarm is triggered.
+ */
+ void setDisplayAlarm( const QString &text = QString::null );
+ /**
+ Set the text to be displayed when the alarm is triggered.
+ Ignored if the alarm is not a display alarm.
+ */
+ void setText( const QString &text );
+ /**
+ Return the text string that displays when the alarm is triggered.
+ */
+ QString text() const;
+
+ /**
+ Set the alarm to be an audio alarm.
+
+ @param audioFile optional file to play when the alarm is triggered.
+ */
+ void setAudioAlarm( const QString &audioFile = QString::null );
+ /**
+ Set the file to play when the audio alarm is triggered.
+ Ignored if the alarm is not an audio alarm.
+ */
+ void setAudioFile( const QString &audioFile );
+ /**
+ Return the name of the audio file for the alarm.
+
+ @return The audio file for the alarm, or QString::null if not an audio alarm.
+ */
+ QString audioFile() const;
+
+ /**
+ Set the alarm to be a procedure alarm.
+
+ @param programFile program to execute when the alarm is triggered.
+ @param arguments arguments to supply to programFile.
+ */
+ void setProcedureAlarm( const QString &programFile,
+ const QString &arguments = QString::null );
+ /**
+ Set the program file to execute when the alarm is triggered.
+ Ignored if the alarm is not a procedure alarm.
+ */
+ void setProgramFile( const QString &programFile );
+ /**
+ Return the name of the program file to execute when the alarm is triggered.
+
+ @return the program file name, or QString::null if not a procedure alarm.
+ */
+ QString programFile() const;
+ /**
+ Set the arguments to the program to execute when the alarm is triggered.
+ Ignored if the alarm is not a procedure alarm.
+ */
+ void setProgramArguments( const QString &arguments );
+ /**
+ Return the arguments to the program to run when the alarm is triggered.
+
+ @return the program arguments, or QString::null if not a procedure alarm.
+ */
+ QString programArguments() const;
+
+ /**
+ Set the alarm to be an email alarm.
+
+ @param subject subject line of email.
+ @param text body of email.
+ @param addressees email addresses of recipient(s).
+ @param attachments optional names of files to attach to the email.
+ */
+ void setEmailAlarm( const QString &subject, const QString &text,
+ const QValueList<Person> &addressees,
+ const QStringList &attachments = QStringList() );
+
+ /**
+ Send mail to this address when the alarm is triggered.
+ Ignored if the alarm is not an email alarm.
+ */
+ void setMailAddress( const Person &mailAlarmAddress );
+ /**
+ Send mail to these addresses when the alarm is triggered.
+ Ignored if the alarm is not an email alarm.
+ */
+ void setMailAddresses( const QValueList<Person> &mailAlarmAddresses );
+ /**
+ Add this address to the list of addresses to send mail to when the alarm is triggered.
+ Ignored if the alarm is not an email alarm.
+ */
+ void addMailAddress( const Person &mailAlarmAddress );
+ /**
+ Return the addresses to send mail to when an alarm goes off.
+ */
+ QValueList<Person> mailAddresses() const;
+
+ /**
+ Set the subject line of the mail.
+ Ignored if the alarm is not an email alarm.
+ */
+ void setMailSubject( const QString &mailAlarmSubject );
+ /**
+ Return the subject line of the mail.
+ */
+ QString mailSubject() const;
+
+ /**
+ Attach this filename to the email.
+ Ignored if the alarm is not an email alarm.
+ */
+ void setMailAttachment( const QString &mailAttachFile );
+ /**
+ Attach these filenames to the email.
+ Ignored if the alarm is not an email alarm.
+ */
+ void setMailAttachments( const QStringList &mailAttachFiles );
+ /**
+ Add this filename to the list of files to attach to the email.
+ Ignored if the alarm is not an email alarm.
+ */
+ void addMailAttachment( const QString &mailAttachFile );
+ /**
+ Return the filenames to attach to the email.
+ */
+ QStringList mailAttachments() const;
+
+ /**
+ Set the email body text.
+ Ignored if the alarm is not an email alarm.
+ */
+ void setMailText( const QString &text );
+ /**
+ Return the email body text.
+
+ @return the body text, or QString::null if not an email alarm.
+ */
+ QString mailText() const;
+
+ /**
+ Set the time to trigger an alarm.
+ */
+ void setTime( const QDateTime &alarmTime );
+ /**
+ Return the date/time when an alarm goes off.
+ */
+ QDateTime time() const;
+ /**
+ Return the date/time when the last repetition of the alarm goes off.
+ If the alarm does not repeat, this is equivalent to calling time().
+ */
+ QDateTime endTime() const;
+ /**
+ Return true, if the alarm has an explicit date/time.
+ */
+ bool hasTime() const;
+
+ /**
+ Set offset of alarm in time relative to the start of the event.
+ */
+ void setStartOffset( const Duration & );
+ /**
+ Return offset of alarm in time relative to the start of the event.
+ If the alarm's time is not defined in terms of an offset relative
+ to the start of the event, returns zero.
+ */
+ Duration startOffset() const;
+ /**
+ Return whether the alarm is defined in terms of an offset relative
+ to the start of the event.
+ */
+ bool hasStartOffset() const;
+
+ /**
+ Set offset of alarm in time relative to the end of the event.
+ */
+ void setEndOffset( const Duration & );
+ /**
+ Return offset of alarm in time relative to the end of the event.
+ If the alarm's time is not defined in terms of an offset relative
+ to the end of the event, returns zero.
+ */
+ Duration endOffset() const;
+ /**
+ Return whether the alarm is defined in terms of an offset relative
+ to the end of the event.
+ */
+ bool hasEndOffset() const;
+
+ /**
+ Set the interval between snoozes for the alarm.
+
+ @param alarmSnoozeTime the time in minutes between snoozes.
+ */
+ void setSnoozeTime( int alarmSnoozeTime );
+
+ /**
+ Get how long the alarm snooze interval is.
+
+ @return the number of minutes between snoozes.
+ */
+ int snoozeTime() const;
+
+ /**
+ Set how many times an alarm is to repeat itself after its initial
+ occurrence (w/snoozes).
+ */
+ void setRepeatCount( int alarmRepeatCount );
+ /**
+ Get how many times an alarm repeats, after its initial occurrence.
+ */
+ int repeatCount() const;
+ /**
+ Get the time of the alarm's initial occurrence or its next repetition,
+ after a given time.
+ @param preTime the date and time after which to find the next repetition.
+ @return the date and time of the next repetition, or an invalid date/time if
+ the specified time is at or after the alarm's last repetition.
+ */
+ QDateTime nextRepetition(const QDateTime& preTime) const;
+ /**
+ Get the time of the alarm's latest repetition, or its initial occurrence if
+ none, before a given time.
+ @param afterTime the date and time before which to find the latest repetition.
+ @return the date and time of the latest repetition, or an invalid date/time if
+ the specified time is at or before the alarm's initial occurrence.
+ */
+ QDateTime previousRepetition(const QDateTime& afterTime) const;
+ /**
+ Get how long between the alarm's initial occurrence and its final repetition.
+ @return the number of seconds between the initial occurrence and final repetition.
+ */
+ int duration() const;
+
+ /**
+ Toggles the value of alarm to be either on or off.
+ Set's the alarm time to be x minutes before dtStart time.
+ */
+ void toggleAlarm();
+
+ /**
+ Set the alarm enabled status.
+ */
+ void setEnabled(bool enable);
+ /**
+ Get the alarm enabled status.
+ */
+ bool enabled() const;
+
+ /**
+ Set the alarm's parent incidence.
+ */
+ void setParent( Incidence * );
+ /**
+ Get the alarm's parent incidence.
+ */
+ Incidence *parent() const { return mParent; }
+
+ protected:
+ /**
+ @copydoc
+ CustomProperties::customPropertyUpdated()
+ */
+ virtual void customPropertyUpdated();
+
+ private:
+ Incidence *mParent; // the incidence which this alarm belongs to
+ Type mType; // type of alarm
+ QString mDescription; // text to display/email body/procedure arguments
+ QString mFile; // procedure program to run/optional audio file to play
+ QStringList mMailAttachFiles; // filenames to attach to email
+ QValueList<Person> mMailAddresses; // who to mail for reminder
+ QString mMailSubject; // subject of email
+
+ int mAlarmSnoozeTime; // number of minutes after alarm to
+ // snooze before ringing again
+ int mAlarmRepeatCount; // number of times for alarm to repeat
+ // after the initial time
+
+ QDateTime mAlarmTime; // time at which to trigger the alarm
+ Duration mOffset; // time relative to incidence DTSTART to trigger the alarm
+ bool mEndOffset; // if true, mOffset relates to DTEND, not DTSTART
+ bool mHasTime; // use mAlarmTime, not mOffset
+ bool mAlarmEnabled;
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/attachment.cpp b/libkcal/attachment.cpp
new file mode 100644
index 00000000..58a54006
--- /dev/null
+++ b/libkcal/attachment.cpp
@@ -0,0 +1,121 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2002 Michael Brade <brade@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "attachment.h"
+
+using namespace KCal;
+
+Attachment::Attachment( const Attachment &attachment)
+{
+ mMimeType = attachment.mMimeType;
+ mData = attachment.mData;
+ mBinary = attachment.mBinary;
+ mShowInline = attachment.mShowInline;
+ mLabel = attachment.mLabel;
+}
+
+Attachment::Attachment(const QString& uri, const QString& mime)
+{
+ mMimeType = mime;
+ mData = uri;
+ mBinary = false;
+ mShowInline = false;
+ mLabel = QString::null;
+}
+
+Attachment::Attachment(const char *base64, const QString& mime)
+{
+ mMimeType = mime;
+ mData = QString::fromUtf8(base64);
+ mBinary = true;
+ mShowInline = false;
+ mLabel = QString::null;
+}
+
+bool Attachment::isUri() const
+{
+ return !mBinary;
+}
+
+QString Attachment::uri() const
+{
+ if (!mBinary)
+ return mData;
+ else
+ return QString::null;
+}
+
+void Attachment::setUri(const QString& uri)
+{
+ mData = uri;
+ mBinary = false;
+}
+
+bool Attachment::isBinary() const
+{
+ return mBinary;
+}
+
+char *Attachment::data() const
+{
+ if (mBinary)
+ // this method actually return a const char*, but that can't be done because of the uneededly non-const libical API
+ return const_cast<char*>( mData.latin1() ); //mData.utf8().data();
+ else
+ return 0;
+}
+
+void Attachment::setData(const char *base64)
+{
+ mData = QString::fromUtf8(base64);
+ mBinary = true;
+}
+
+QString Attachment::mimeType() const
+{
+ return mMimeType;
+}
+
+void Attachment::setMimeType(const QString& mime)
+{
+ mMimeType = mime;
+}
+
+bool Attachment::showInline() const
+{
+ return mShowInline;
+}
+
+void Attachment::setShowInline( bool showinline )
+{
+ mShowInline = showinline;
+}
+
+QString Attachment::label() const
+{
+ return mLabel;
+}
+
+void Attachment::setLabel( const QString& label )
+{
+ mLabel = label;
+}
+
diff --git a/libkcal/attachment.h b/libkcal/attachment.h
new file mode 100644
index 00000000..6e390709
--- /dev/null
+++ b/libkcal/attachment.h
@@ -0,0 +1,96 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2002 Michael Brade <brade@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_ATTACHMENT_H
+#define KCAL_ATTACHMENT_H
+
+#include "listbase.h"
+#include "libkcal_export.h"
+
+#include <qstring.h>
+
+namespace KCal {
+
+/**
+ This class represents information related to an attachment.
+*/
+class KDE_EXPORT Attachment
+{
+ public:
+ typedef ListBase<Attachment> List;
+
+ /**
+ Create a Reference to some URI by copying an existing Attachment.
+
+ @param attachment the attachment to be duplicated
+ */
+ Attachment( const Attachment &attachment );
+
+ /**
+ Create a Reference to some URI.
+
+ @param uri the uri this attachment refers to
+ @param mime the mime type of the resource being linked to
+ */
+ Attachment( const QString &uri, const QString &mime = QString::null );
+
+ /**
+ Create a binary attachment.
+
+ @param base64 the attachment in base64 format
+ @param mime the mime type of the attachment
+ */
+ Attachment( const char *base64, const QString &mime = QString::null );
+
+ /* The VALUE parameter in iCal */
+ bool isUri() const;
+ QString uri() const;
+ void setUri( const QString &uri );
+
+ bool isBinary() const;
+ char *data() const;
+ void setData( const char *base64 );
+
+ /* The optional FMTTYPE parameter in iCal */
+ QString mimeType() const;
+ void setMimeType( const QString &mime );
+
+ /* The custom X-CONTENT-DISPOSITION parameter, used by OGo etc. */
+ bool showInline() const;
+ void setShowInline( bool showinline );
+
+ /* The custom X-LABEL parameter to show a human-readable title */
+ QString label() const;
+ void setLabel( const QString &label );
+
+ private:
+ QString mMimeType;
+ QString mData;
+ bool mBinary;
+ bool mShowInline;
+ QString mLabel;
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/attendee.cpp b/libkcal/attendee.cpp
new file mode 100644
index 00000000..7594c8eb
--- /dev/null
+++ b/libkcal/attendee.cpp
@@ -0,0 +1,167 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qstringlist.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+
+#include "attendee.h"
+
+using namespace KCal;
+
+Attendee::Attendee( const QString &name, const QString &email, bool _rsvp,
+ Attendee::PartStat s, Attendee::Role r, const QString &u)
+ : Person( name, email )
+{
+ mRSVP = _rsvp;
+ mStatus = s;
+ mRole = r;
+ mUid = u;
+}
+
+Attendee::~Attendee()
+{
+}
+
+bool KCal::operator==( const Attendee& a1, const Attendee& a2 )
+{
+ return ( operator==( (const Person&)a1, (const Person&) a2 ) &&
+ a1.RSVP() == a2.RSVP() &&
+ a1.role() == a2.role() &&
+ a1.status() == a2.status() &&
+ a1.uid() == a2.uid() &&
+ a1.delegate() == a2.delegate() &&
+ a1.delegator() == a2.delegator() );
+}
+
+void Attendee::setStatus( Attendee::PartStat s )
+{
+ mStatus = s;
+}
+
+Attendee::PartStat Attendee::status() const
+{
+ return mStatus;
+}
+
+QString Attendee::statusStr() const
+{
+ return statusName( mStatus );
+}
+
+QString Attendee::statusName( Attendee::PartStat s )
+{
+ switch ( s ) {
+ default:
+ case NeedsAction:
+ return i18n("Needs Action");
+ break;
+ case Accepted:
+ return i18n("Accepted");
+ break;
+ case Declined:
+ return i18n("Declined");
+ break;
+ case Tentative:
+ return i18n("attendee status", "Tentative");
+ break;
+ case Delegated:
+ return i18n("Delegated");
+ break;
+ case Completed:
+ return i18n("Completed");
+ break;
+ case InProcess:
+ return i18n("In Process");
+ break;
+ }
+}
+
+QStringList Attendee::statusList()
+{
+ QStringList list;
+ list << statusName( NeedsAction );
+ list << statusName( Accepted );
+ list << statusName( Declined );
+ list << statusName( Tentative );
+ list << statusName( Delegated );
+ list << statusName( Completed );
+ list << statusName( InProcess );
+
+ return list;
+}
+
+
+void Attendee::setRole( Attendee::Role r )
+{
+ mRole = r;
+}
+
+Attendee::Role Attendee::role() const
+{
+ return mRole;
+}
+
+QString Attendee::roleStr() const
+{
+ return roleName( mRole );
+}
+
+void Attendee::setUid( const QString &uid )
+{
+ mUid = uid;
+}
+
+QString Attendee::uid() const
+{
+ return mUid;
+}
+
+QString Attendee::roleName( Attendee::Role r )
+{
+ switch ( r ) {
+ case Chair:
+ return i18n("Chair");
+ break;
+ default:
+ case ReqParticipant:
+ return i18n("Participant");
+ break;
+ case OptParticipant:
+ return i18n("Optional Participant");
+ break;
+ case NonParticipant:
+ return i18n("Observer");
+ break;
+ }
+}
+
+QStringList Attendee::roleList()
+{
+ QStringList list;
+ list << roleName( ReqParticipant );
+ list << roleName( OptParticipant );
+ list << roleName( NonParticipant );
+ list << roleName( Chair );
+
+ return list;
+}
diff --git a/libkcal/attendee.h b/libkcal/attendee.h
new file mode 100644
index 00000000..1cdc7b54
--- /dev/null
+++ b/libkcal/attendee.h
@@ -0,0 +1,162 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001-2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef KCAL_ATTENDEE_H
+#define KCAL_ATTENDEE_H
+
+#include <qstring.h>
+#include <qstringlist.h>
+
+#include "listbase.h"
+#include "person.h"
+
+namespace KCal {
+
+/**
+ This class represents information related to an attendee of an event.
+*/
+class LIBKCAL_EXPORT Attendee : public Person
+{
+ public:
+ enum PartStat { NeedsAction, Accepted, Declined, Tentative,
+ Delegated, Completed, InProcess };
+ enum Role { ReqParticipant, OptParticipant, NonParticipant, Chair };
+
+ typedef ListBase<Attendee> List;
+
+ /**
+ Create Attendee.
+
+ @param name Name
+ @param email Email address
+ @param rsvp Request for reply
+ @param status Status (see enum for list)
+ @param role Role
+ @param u the uid for the attendee
+ */
+ Attendee( const QString &name, const QString &email,
+ bool rsvp = false, PartStat status = NeedsAction,
+ Role role = ReqParticipant, const QString &u = QString::null );
+ /**
+ Destruct Attendee.
+ */
+ virtual ~Attendee();
+
+ /**
+ Set role of Attendee.
+ */
+ // FIXME: List of roles still has to be documented.
+ void setRole( Role );
+
+ /**
+ Return role of Attendee.
+ */
+ Role role() const;
+
+ /**
+ Return role as clear text string.
+ */
+ QString roleStr() const;
+ /**
+ Return string represenation of role.
+ */
+ static QString roleName( Role );
+ /**
+ Return string representations of all available roles.
+ */
+ static QStringList roleList();
+
+ /**
+ Return unique id of the attendee.
+ */
+ QString uid() const;
+ /**
+ Set unique id of attendee.
+ */
+ void setUid ( const QString & );
+
+ /**
+ Set status. See enum for definitions of possible values.
+ */
+ void setStatus( PartStat s );
+
+ /**
+ Return status.
+ */
+ PartStat status() const;
+
+ /**
+ Return status as human-readable string.
+ */
+ QString statusStr() const;
+ /**
+ Return string representation of attendee status.
+ */
+ static QString statusName( PartStat );
+ /**
+ Return string representations of all available attendee status values.
+ */
+ static QStringList statusList();
+
+ /**
+ Set if Attendee is asked to reply.
+ */
+ void setRSVP( bool r ) { mRSVP = r; }
+ /**
+ Return, if Attendee is asked to reply.
+ */
+ bool RSVP() const { return mRSVP; }
+
+ /**
+ Sets the delegate.
+ */
+ void setDelegate( const QString &delegate ) { mDelegate = delegate; }
+ /**
+ Returns the delegate.
+ */
+ QString delegate() const { return mDelegate; }
+
+ /**
+ Sets the delegator.
+ */
+ void setDelegator( const QString &delegator ) { mDelegator = delegator; }
+ /**
+ Returns the delegator.
+ */
+ QString delegator() const { return mDelegator; }
+
+ private:
+ bool mRSVP;
+ Role mRole;
+ PartStat mStatus;
+ QString mUid;
+ QString mDelegate;
+ QString mDelegator;
+
+ class Private;
+ Private *d;
+};
+
+bool operator==( const Attendee& a1, const Attendee& a2 );
+
+}
+
+#endif
diff --git a/libkcal/calendar.cpp b/libkcal/calendar.cpp
new file mode 100644
index 00000000..4c9e568a
--- /dev/null
+++ b/libkcal/calendar.cpp
@@ -0,0 +1,858 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 1998 Preston Brown <pbrown@kde.org>
+ Copyright (c) 2000-2004 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+/**
+ @file calendar.cpp
+ Provides the main "calendar" object class.
+
+ @author Preston Brown
+ @author Cornelius Schumacher
+ @author Reinhold Kainhofer
+*/
+#include <stdlib.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+
+#include "exceptions.h"
+#include "calfilter.h"
+
+#include "calendar.h"
+
+using namespace KCal;
+
+Calendar::Calendar( const QString &timeZoneId )
+{
+ mTimeZoneId = timeZoneId;
+ mLocalTime = false;
+
+ init();
+}
+
+void Calendar::init()
+{
+ mNewObserver = false;
+ mObserversEnabled = true;
+
+ mModified = false;
+
+ // Setup default filter, which does nothing
+ mDefaultFilter = new CalFilter;
+ mFilter = mDefaultFilter;
+ mFilter->setEnabled( false );
+
+ // user information...
+ setOwner( Person( i18n( "Unknown Name" ), i18n( "unknown@nowhere" ) ) );
+}
+
+Calendar::~Calendar()
+{
+ delete mDefaultFilter;
+}
+
+const Person &Calendar::getOwner() const
+{
+ return mOwner;
+}
+
+void Calendar::setOwner( const Person &owner )
+{
+ mOwner = owner;
+
+ setModified( true );
+}
+
+void Calendar::setTimeZoneId( const QString &timeZoneId )
+{
+ mTimeZoneId = timeZoneId;
+ mLocalTime = false;
+
+ setModified( true );
+ doSetTimeZoneId( timeZoneId );
+}
+
+QString Calendar::timeZoneId() const
+{
+ return mTimeZoneId;
+}
+
+void Calendar::setLocalTime()
+{
+ mLocalTime = true;
+ mTimeZoneId = "";
+
+ setModified( true );
+}
+
+bool Calendar::isLocalTime() const
+{
+ return mLocalTime;
+}
+
+void Calendar::setFilter( CalFilter *filter )
+{
+ if ( filter ) {
+ mFilter = filter;
+ } else {
+ mFilter = mDefaultFilter;
+ }
+}
+
+CalFilter *Calendar::filter()
+{
+ return mFilter;
+}
+
+QStringList Calendar::categories()
+{
+ Incidence::List rawInc( rawIncidences() );
+ QStringList cats, thisCats;
+ // @TODO: For now just iterate over all incidences. In the future,
+ // the list of categories should be built when reading the file.
+ for ( Incidence::List::ConstIterator i = rawInc.constBegin();
+ i != rawInc.constEnd(); ++i ) {
+ thisCats = (*i)->categories();
+ for ( QStringList::ConstIterator si = thisCats.constBegin();
+ si != thisCats.constEnd(); ++si ) {
+ if ( cats.find( *si ) == cats.end() ) {
+ cats.append( *si );
+ }
+ }
+ }
+ return cats;
+}
+
+Incidence::List Calendar::incidences( const QDate &date )
+{
+ return mergeIncidenceList( events( date ), todos( date ), journals( date ) );
+}
+
+Incidence::List Calendar::incidences()
+{
+ return mergeIncidenceList( events(), todos(), journals() );
+}
+
+Incidence::List Calendar::rawIncidences()
+{
+ return mergeIncidenceList( rawEvents(), rawTodos(), rawJournals() );
+}
+
+Event::List Calendar::sortEvents( Event::List *eventList,
+ EventSortField sortField,
+ SortDirection sortDirection )
+{
+ Event::List eventListSorted;
+ Event::List tempList, t;
+ Event::List alphaList;
+ Event::List::Iterator sortIt;
+ Event::List::Iterator eit;
+
+ // Notice we alphabetically presort Summaries first.
+ // We do this so comparison "ties" stay in a nice order.
+
+ switch( sortField ) {
+ case EventSortUnsorted:
+ eventListSorted = *eventList;
+ break;
+
+ case EventSortStartDate:
+ alphaList = sortEvents( eventList, EventSortSummary, sortDirection );
+ for ( eit = alphaList.begin(); eit != alphaList.end(); ++eit ) {
+ sortIt = eventListSorted.begin();
+ if ( sortDirection == SortDirectionAscending ) {
+ while ( sortIt != eventListSorted.end() &&
+ (*eit)->dtStart() >= (*sortIt)->dtStart() ) {
+ ++sortIt;
+ }
+ } else {
+ while ( sortIt != eventListSorted.end() &&
+ (*eit)->dtStart() < (*sortIt)->dtStart() ) {
+ ++sortIt;
+ }
+ }
+ eventListSorted.insert( sortIt, *eit );
+ }
+ break;
+
+ case EventSortEndDate:
+ alphaList = sortEvents( eventList, EventSortSummary, sortDirection );
+ for ( eit = alphaList.begin(); eit != alphaList.end(); ++eit ) {
+ if ( (*eit)->hasEndDate() ) {
+ sortIt = eventListSorted.begin();
+ if ( sortDirection == SortDirectionAscending ) {
+ while ( sortIt != eventListSorted.end() &&
+ (*eit)->dtEnd() >= (*sortIt)->dtEnd() ) {
+ ++sortIt;
+ }
+ } else {
+ while ( sortIt != eventListSorted.end() &&
+ (*eit)->dtEnd() < (*sortIt)->dtEnd() ) {
+ ++sortIt;
+ }
+ }
+ } else {
+ // Keep a list of the Events without End DateTimes
+ tempList.append( *eit );
+ }
+ eventListSorted.insert( sortIt, *eit );
+ }
+ if ( sortDirection == SortDirectionAscending ) {
+ // Append the list of Events without End DateTimes
+ eventListSorted += tempList;
+ } else {
+ // Prepend the list of Events without End DateTimes
+ tempList += eventListSorted;
+ eventListSorted = tempList;
+ }
+ break;
+
+ case EventSortSummary:
+ for ( eit = eventList->begin(); eit != eventList->end(); ++eit ) {
+ sortIt = eventListSorted.begin();
+ if ( sortDirection == SortDirectionAscending ) {
+ while ( sortIt != eventListSorted.end() &&
+ (*eit)->summary() >= (*sortIt)->summary() ) {
+ ++sortIt;
+ }
+ } else {
+ while ( sortIt != eventListSorted.end() &&
+ (*eit)->summary() < (*sortIt)->summary() ) {
+ ++sortIt;
+ }
+ }
+ eventListSorted.insert( sortIt, *eit );
+ }
+ break;
+ }
+
+ return eventListSorted;
+
+}
+
+Event::List Calendar::events( const QDate &date,
+ EventSortField sortField,
+ SortDirection sortDirection )
+{
+ Event::List el = rawEventsForDate( date, sortField, sortDirection );
+ mFilter->apply( &el );
+ return el;
+}
+
+Event::List Calendar::events( const QDateTime &qdt )
+{
+ Event::List el = rawEventsForDate( qdt );
+ mFilter->apply( &el );
+ return el;
+}
+
+Event::List Calendar::events( const QDate &start, const QDate &end,
+ bool inclusive)
+{
+ Event::List el = rawEvents( start, end, inclusive );
+ mFilter->apply( &el );
+ return el;
+}
+
+Event::List Calendar::events( EventSortField sortField,
+ SortDirection sortDirection )
+{
+ Event::List el = rawEvents( sortField, sortDirection );
+ mFilter->apply( &el );
+ return el;
+}
+
+bool Calendar::addIncidence( Incidence *incidence )
+{
+ Incidence::AddVisitor<Calendar> v( this );
+
+ return incidence->accept(v);
+}
+
+bool Calendar::deleteIncidence( Incidence *incidence )
+{
+ if ( beginChange( incidence ) ) {
+ Incidence::DeleteVisitor<Calendar> v( this );
+ bool result = incidence->accept( v );
+ endChange( incidence );
+ return result;
+ } else
+ return false;
+}
+
+/** Dissociate a single occurrence or all future occurrences from a recurring sequence.
+ The new incidence is returned, but not automatically inserted into the calendar,
+ which is left to the calling application */
+Incidence *Calendar::dissociateOccurrence( Incidence *incidence, QDate date,
+ bool single )
+{
+ if ( !incidence || !incidence->doesRecur() )
+ return 0;
+
+ Incidence *newInc = incidence->clone();
+ newInc->recreate();
+ newInc->setRelatedTo( incidence );
+ Recurrence *recur = newInc->recurrence();
+ if ( single ) {
+ recur->clear();
+ } else {
+ // Adjust the recurrence for the future incidences. In particular
+ // adjust the "end after n occurrences" rules! "No end date" and "end by ..."
+ // don't need to be modified.
+ int duration = recur->duration();
+ if ( duration > 0 ) {
+ int doneduration = recur->durationTo( date.addDays(-1) );
+ if ( doneduration >= duration ) {
+ kdDebug(5850) << "The dissociated event already occurred more often "
+ << "than it was supposed to ever occur. ERROR!" << endl;
+ recur->clear();
+ } else {
+ recur->setDuration( duration - doneduration );
+ }
+ }
+ }
+ // Adjust the date of the incidence
+ if ( incidence->type() == "Event" ) {
+ Event *ev = static_cast<Event *>( newInc );
+ QDateTime start( ev->dtStart() );
+ int daysTo = start.date().daysTo( date );
+ ev->setDtStart( start.addDays( daysTo ) );
+ ev->setDtEnd( ev->dtEnd().addDays( daysTo ) );
+ } else if ( incidence->type() == "Todo" ) {
+ Todo *td = static_cast<Todo *>( newInc );
+ bool haveOffset = false;
+ int daysTo = 0;
+ if ( td->hasDueDate() ) {
+ QDateTime due( td->dtDue() );
+ daysTo = due.date().daysTo( date );
+ td->setDtDue( due.addDays( daysTo ), true );
+ haveOffset = true;
+ }
+ if ( td->hasStartDate() ) {
+ QDateTime start( td->dtStart() );
+ if ( !haveOffset )
+ daysTo = start.date().daysTo( date );
+ td->setDtStart( start.addDays( daysTo ) );
+ haveOffset = true;
+ }
+ }
+ recur = incidence->recurrence();
+ if ( recur ) {
+ if ( single ) {
+ recur->addExDate( date );
+ } else {
+ // Make sure the recurrence of the past events ends
+ // at the corresponding day
+ recur->setEndDate( date.addDays(-1) );
+ }
+ }
+ return newInc;
+}
+
+Incidence *Calendar::incidence( const QString &uid )
+{
+ Incidence *i = event( uid );
+ if ( i )
+ return i;
+ i = todo( uid );
+ if ( i )
+ return i;
+ i = journal( uid );
+ return i;
+}
+
+Incidence::List Calendar::incidencesFromSchedulingID( const QString &UID )
+{
+ Incidence::List result;
+ Incidence::List incidences = rawIncidences();
+ Incidence::List::iterator it = incidences.begin();
+ for ( ; it != incidences.end(); ++it )
+ if ( (*it)->schedulingID() == UID )
+ result.append( *it );
+ return result;
+}
+
+Incidence *Calendar::incidenceFromSchedulingID( const QString &UID )
+{
+ Incidence::List incidences = rawIncidences();
+ Incidence::List::iterator it = incidences.begin();
+ for ( ; it != incidences.end(); ++it )
+ if ( (*it)->schedulingID() == UID )
+ // Touchdown, and the crowd goes wild
+ return *it;
+ // Not found
+ return 0;
+}
+
+Todo::List Calendar::sortTodos( Todo::List *todoList,
+ TodoSortField sortField,
+ SortDirection sortDirection )
+{
+ Todo::List todoListSorted;
+ Todo::List tempList, t;
+ Todo::List alphaList;
+ Todo::List::Iterator sortIt;
+ Todo::List::Iterator eit;
+
+ // Notice we alphabetically presort Summaries first.
+ // We do this so comparison "ties" stay in a nice order.
+
+ // Note that Todos may not have Start DateTimes nor due DateTimes.
+
+ switch( sortField ) {
+ case TodoSortUnsorted:
+ todoListSorted = *todoList;
+ break;
+
+ case TodoSortStartDate:
+ alphaList = sortTodos( todoList, TodoSortSummary, sortDirection );
+ for ( eit = alphaList.begin(); eit != alphaList.end(); ++eit ) {
+ if ( (*eit)->hasStartDate() ) {
+ sortIt = todoListSorted.begin();
+ if ( sortDirection == SortDirectionAscending ) {
+ while ( sortIt != todoListSorted.end() &&
+ (*eit)->dtStart() >= (*sortIt)->dtStart() ) {
+ ++sortIt;
+ }
+ } else {
+ while ( sortIt != todoListSorted.end() &&
+ (*eit)->dtStart() < (*sortIt)->dtStart() ) {
+ ++sortIt;
+ }
+ }
+ todoListSorted.insert( sortIt, *eit );
+ } else {
+ // Keep a list of the Todos without Start DateTimes
+ tempList.append( *eit );
+ }
+ }
+ if ( sortDirection == SortDirectionAscending ) {
+ // Append the list of Todos without Start DateTimes
+ todoListSorted += tempList;
+ } else {
+ // Prepend the list of Todos without Start DateTimes
+ tempList += todoListSorted;
+ todoListSorted = tempList;
+ }
+ break;
+
+ case TodoSortDueDate:
+ alphaList = sortTodos( todoList, TodoSortSummary, sortDirection );
+ for ( eit = alphaList.begin(); eit != alphaList.end(); ++eit ) {
+ if ( (*eit)->hasDueDate() ) {
+ sortIt = todoListSorted.begin();
+ if ( sortDirection == SortDirectionAscending ) {
+ while ( sortIt != todoListSorted.end() &&
+ (*eit)->dtDue() >= (*sortIt)->dtDue() ) {
+ ++sortIt;
+ }
+ } else {
+ while ( sortIt != todoListSorted.end() &&
+ (*eit)->dtDue() < (*sortIt)->dtDue() ) {
+ ++sortIt;
+ }
+ }
+ todoListSorted.insert( sortIt, *eit );
+ } else {
+ // Keep a list of the Todos without Due DateTimes
+ tempList.append( *eit );
+ }
+ }
+ if ( sortDirection == SortDirectionAscending ) {
+ // Append the list of Todos without Due DateTimes
+ todoListSorted += tempList;
+ } else {
+ // Prepend the list of Todos without Due DateTimes
+ tempList += todoListSorted;
+ todoListSorted = tempList;
+ }
+ break;
+
+ case TodoSortPriority:
+ alphaList = sortTodos( todoList, TodoSortSummary, sortDirection );
+ for ( eit = alphaList.begin(); eit != alphaList.end(); ++eit ) {
+ sortIt = todoListSorted.begin();
+ if ( sortDirection == SortDirectionAscending ) {
+ while ( sortIt != todoListSorted.end() &&
+ (*eit)->priority() >= (*sortIt)->priority() ) {
+ ++sortIt;
+ }
+ } else {
+ while ( sortIt != todoListSorted.end() &&
+ (*eit)->priority() < (*sortIt)->priority() ) {
+ ++sortIt;
+ }
+ }
+ todoListSorted.insert( sortIt, *eit );
+ }
+ break;
+
+ case TodoSortPercentComplete:
+ alphaList = sortTodos( todoList, TodoSortSummary, sortDirection );
+ for ( eit = alphaList.begin(); eit != alphaList.end(); ++eit ) {
+ sortIt = todoListSorted.begin();
+ if ( sortDirection == SortDirectionAscending ) {
+ while ( sortIt != todoListSorted.end() &&
+ (*eit)->percentComplete() >= (*sortIt)->percentComplete() ) {
+ ++sortIt;
+ }
+ } else {
+ while ( sortIt != todoListSorted.end() &&
+ (*eit)->percentComplete() < (*sortIt)->percentComplete() ) {
+ ++sortIt;
+ }
+ }
+ todoListSorted.insert( sortIt, *eit );
+ }
+ break;
+
+ case TodoSortSummary:
+ for ( eit = todoList->begin(); eit != todoList->end(); ++eit ) {
+ sortIt = todoListSorted.begin();
+ if ( sortDirection == SortDirectionAscending ) {
+ while ( sortIt != todoListSorted.end() &&
+ (*eit)->summary() >= (*sortIt)->summary() ) {
+ ++sortIt;
+ }
+ } else {
+ while ( sortIt != todoListSorted.end() &&
+ (*eit)->summary() < (*sortIt)->summary() ) {
+ ++sortIt;
+ }
+ }
+ todoListSorted.insert( sortIt, *eit );
+ }
+ break;
+ }
+
+ return todoListSorted;
+}
+
+Todo::List Calendar::todos( TodoSortField sortField,
+ SortDirection sortDirection )
+{
+ Todo::List tl = rawTodos( sortField, sortDirection );
+ mFilter->apply( &tl );
+ return tl;
+}
+
+Todo::List Calendar::todos( const QDate &date )
+{
+ Todo::List el = rawTodosForDate( date );
+ mFilter->apply( &el );
+ return el;
+}
+
+Journal::List Calendar::sortJournals( Journal::List *journalList,
+ JournalSortField sortField,
+ SortDirection sortDirection )
+{
+ Journal::List journalListSorted;
+ Journal::List::Iterator sortIt;
+ Journal::List::Iterator eit;
+
+ switch( sortField ) {
+ case JournalSortUnsorted:
+ journalListSorted = *journalList;
+ break;
+
+ case JournalSortDate:
+ for ( eit = journalList->begin(); eit != journalList->end(); ++eit ) {
+ sortIt = journalListSorted.begin();
+ if ( sortDirection == SortDirectionAscending ) {
+ while ( sortIt != journalListSorted.end() &&
+ (*eit)->dtStart() >= (*sortIt)->dtStart() ) {
+ ++sortIt;
+ }
+ } else {
+ while ( sortIt != journalListSorted.end() &&
+ (*eit)->dtStart() < (*sortIt)->dtStart() ) {
+ ++sortIt;
+ }
+ }
+ journalListSorted.insert( sortIt, *eit );
+ }
+ break;
+
+ case JournalSortSummary:
+ for ( eit = journalList->begin(); eit != journalList->end(); ++eit ) {
+ sortIt = journalListSorted.begin();
+ if ( sortDirection == SortDirectionAscending ) {
+ while ( sortIt != journalListSorted.end() &&
+ (*eit)->summary() >= (*sortIt)->summary() ) {
+ ++sortIt;
+ }
+ } else {
+ while ( sortIt != journalListSorted.end() &&
+ (*eit)->summary() < (*sortIt)->summary() ) {
+ ++sortIt;
+ }
+ }
+ journalListSorted.insert( sortIt, *eit );
+ }
+ break;
+ }
+
+ return journalListSorted;
+}
+
+Journal::List Calendar::journals( JournalSortField sortField,
+ SortDirection sortDirection )
+{
+ Journal::List jl = rawJournals( sortField, sortDirection );
+ mFilter->apply( &jl );
+ return jl;
+}
+
+Journal::List Calendar::journals( const QDate &date )
+{
+ Journal::List el = rawJournalsForDate( date );
+ mFilter->apply( &el );
+ return el;
+}
+
+// When this is called, the todo have already been added to the calendar.
+// This method is only about linking related todos
+void Calendar::setupRelations( Incidence *forincidence )
+{
+ if ( !forincidence ) return;
+// kdDebug(5850) << "Calendar::setupRelations for incidence " << forincidence << " with UID " << forincidence->uid() << ", summary: " << forincidence->summary() << endl;
+ QString uid = forincidence->uid();
+
+ // First, go over the list of orphans and see if this is their parent
+ while ( Incidence* i = mOrphans[ uid ] ) {
+ mOrphans.remove( uid );
+ i->setRelatedTo( forincidence );
+ forincidence->addRelation( i );
+ mOrphanUids.remove( i->uid() );
+ }
+
+ // Now see about this incidences parent
+ if ( !forincidence->relatedTo() && !forincidence->relatedToUid().isEmpty() ) {
+ // This incidence has a uid it is related to but is not registered to it yet
+ // Try to find it
+ Incidence* parent = incidence( forincidence->relatedToUid() );
+ if ( parent ) {
+ // Found it
+ forincidence->setRelatedTo( parent );
+ parent->addRelation( forincidence );
+ } else {
+ // Not found, put this in the mOrphans list
+ // Note that the mOrphans dict might have several entries with the same key! That are
+ // multiple children that wait for the parent incidence to be inserted.
+ mOrphans.insert( forincidence->relatedToUid(), forincidence );
+ mOrphanUids.insert( forincidence->uid(), forincidence );
+ }
+ }
+}
+
+// If a task with subtasks is deleted, move it's subtasks to the orphans list
+void Calendar::removeRelations( Incidence *incidence )
+{
+ if( !incidence ) {
+ kdDebug(5800) << "Warning: Calendar::removeRelations( 0 )!\n";
+ return;
+ }
+
+// kdDebug(5850) << "Calendar::removeRelations for incidence " << forincidence << " with UID " << forincidence->uid() << ", summary: " << forincidence->summary() << endl;
+ QString uid = incidence->uid();
+
+ Incidence::List relations = incidence->relations();
+ Incidence::List::ConstIterator it;
+ for ( it = relations.begin(); it != relations.end(); ++it ) {
+ Incidence *i = *it;
+ if ( !mOrphanUids.find( i->uid() ) ) {
+ mOrphans.insert( uid, i );
+ mOrphanUids.insert( i->uid(), i );
+ i->setRelatedTo( 0 );
+ i->setRelatedToUid( uid );
+ }
+ }
+
+ // If this incidence is related to something else, tell that about it
+ if ( incidence->relatedTo() )
+ incidence->relatedTo()->removeRelation( incidence );
+
+ // Remove this one from the orphans list
+ if ( mOrphanUids.remove( uid ) ) {
+ // This incidence is located in the orphans list - it should be removed
+ // Since the mOrphans dict might contain the same key (with different
+ // child incidence pointers!) multiple times, take care that we remove
+ // the correct one. So we need to remove all items with the given
+ // parent UID, and readd those that are not for this item. Also, there
+ // might be other entries with differnet UID that point to this
+ // incidence (this might happen when the relatedTo of the item is
+ // changed before its parent is inserted. This might happen with
+ // groupware servers....). Remove them, too
+ QStringList relatedToUids;
+ // First get the list of all keys in the mOrphans list that point to the removed item
+ relatedToUids << incidence->relatedToUid();
+ for ( QDictIterator<Incidence> it( mOrphans ); it.current(); ++it ) {
+ if ( it.current()->uid() == uid ) {
+ relatedToUids << it.currentKey();
+ }
+ }
+
+ // now go through all uids that have one entry that point to the incidence
+ for ( QStringList::Iterator uidit = relatedToUids.begin();
+ uidit != relatedToUids.end(); ++uidit ) {
+ Incidence::List tempList;
+ // Remove all to get access to the remaining entries
+ while( Incidence* i = mOrphans[ *uidit ] ) {
+ mOrphans.remove( *uidit );
+ if ( i != incidence ) tempList.append( i );
+ }
+ // Readd those that point to a different orphan incidence
+ for ( Incidence::List::Iterator incit = tempList.begin();
+ incit != tempList.end(); ++incit ) {
+ mOrphans.insert( *uidit, *incit );
+ }
+ }
+ }
+}
+
+void Calendar::registerObserver( Observer *observer )
+{
+ if( !mObservers.contains( observer ) )
+ mObservers.append( observer );
+ mNewObserver = true;
+}
+
+void Calendar::unregisterObserver( Observer *observer )
+{
+ mObservers.remove( observer );
+}
+
+void Calendar::setModified( bool modified )
+{
+ if ( modified != mModified || mNewObserver ) {
+ mNewObserver = false;
+ Observer *observer;
+ for ( observer = mObservers.first(); observer;
+ observer = mObservers.next() ) {
+ observer->calendarModified( modified, this );
+ }
+ mModified = modified;
+ }
+}
+
+void Calendar::incidenceUpdated( IncidenceBase *incidence )
+{
+ incidence->setSyncStatus( Event::SYNCMOD );
+ incidence->setLastModified( QDateTime::currentDateTime() );
+ // we should probably update the revision number here,
+ // or internally in the Event itself when certain things change.
+ // need to verify with ical documentation.
+
+ // The static_cast is ok as the CalendarLocal only observes Incidence objects
+ notifyIncidenceChanged( static_cast<Incidence *>( incidence ) );
+
+ setModified( true );
+}
+
+void Calendar::notifyIncidenceAdded( Incidence *i )
+{
+ if ( !mObserversEnabled )
+ return;
+
+ Observer *observer;
+ for ( observer = mObservers.first(); observer;
+ observer = mObservers.next() ) {
+ observer->calendarIncidenceAdded( i );
+ }
+}
+
+void Calendar::notifyIncidenceChanged( Incidence *i )
+{
+ if ( !mObserversEnabled )
+ return;
+
+ Observer *observer;
+ for ( observer = mObservers.first(); observer;
+ observer = mObservers.next() ) {
+ observer->calendarIncidenceChanged( i );
+ }
+}
+
+void Calendar::notifyIncidenceDeleted( Incidence *i )
+{
+ if ( !mObserversEnabled )
+ return;
+
+ Observer *observer;
+ for ( observer = mObservers.first(); observer;
+ observer = mObservers.next() ) {
+ observer->calendarIncidenceDeleted( i );
+ }
+}
+
+void Calendar::customPropertyUpdated()
+{
+ setModified( true );
+}
+
+void Calendar::setProductId( const QString &productId )
+{
+ mProductId = productId;
+}
+
+QString Calendar::productId()
+{
+ return mProductId;
+}
+
+Incidence::List Calendar::mergeIncidenceList( const Event::List &events,
+ const Todo::List &todos,
+ const Journal::List &journals )
+{
+ Incidence::List incidences;
+
+ Event::List::ConstIterator it1;
+ for ( it1 = events.begin(); it1 != events.end(); ++it1 )
+ incidences.append( *it1 );
+
+ Todo::List::ConstIterator it2;
+ for ( it2 = todos.begin(); it2 != todos.end(); ++it2 )
+ incidences.append( *it2 );
+
+ Journal::List::ConstIterator it3;
+ for ( it3 = journals.begin(); it3 != journals.end(); ++it3 )
+ incidences.append( *it3 );
+
+ return incidences;
+}
+
+bool Calendar::beginChange( Incidence * )
+{
+ return true;
+}
+
+bool Calendar::endChange( Incidence * )
+{
+ return true;
+}
+
+void Calendar::setObserversEnabled( bool enabled )
+{
+ mObserversEnabled = enabled;
+}
+
+#include "calendar.moc"
diff --git a/libkcal/calendar.h b/libkcal/calendar.h
new file mode 100644
index 00000000..bfcf4c8a
--- /dev/null
+++ b/libkcal/calendar.h
@@ -0,0 +1,958 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 1998 Preston Brown <pbrown@kde.org>
+ Copyright (c) 2001,2003,2004 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+/**
+ @file calendar.h
+ Provides the main "calendar" object class.
+
+ @author Preston Brown
+ @author Cornelius Schumacher
+ @author Reinhold Kainhofer
+ */
+#ifndef KCAL_CALENDAR_H
+#define KCAL_CALENDAR_H
+
+#include <qobject.h>
+#include <qstring.h>
+#include <qdatetime.h>
+#include <qptrlist.h>
+#include <qdict.h>
+#include <kdepimmacros.h>
+
+#include "customproperties.h"
+#include "event.h"
+#include "todo.h"
+#include "journal.h"
+#include "kcalversion.h"
+#include "person.h"
+
+/**
+ @namespace KCal
+ Namespace KCal is for global classes, objects and/or functions in libkcal.
+*/
+namespace KCal {
+
+class CalFilter;
+
+/**
+ @enum SortDirection
+ Sort direction.
+*/
+enum SortDirection
+{
+ /** Sort in ascending order (first to last) */
+ SortDirectionAscending,
+ /** Sort in descending order (last to first) */
+ SortDirectionDescending
+};
+
+/**
+ @enum EventSortField
+ How Events are to be sorted.
+*/
+enum EventSortField
+{
+ /** Events are to be unsorted */
+ EventSortUnsorted,
+ /** Sort Events chronologically, by start date */
+ EventSortStartDate,
+ /** Sort Events chronologically, by end date */
+ EventSortEndDate,
+ /** Sort Events alphabetically, by summary */
+ EventSortSummary
+};
+
+/**
+ @enum TodoSortField
+ How Todos are to be sorted.
+*/
+enum TodoSortField
+{
+ /** Todos are to be unsorted */
+ TodoSortUnsorted,
+ /** Sort Todos chronologically, by start date */
+ TodoSortStartDate,
+ /** Sort Todos chronologically, by due date */
+ TodoSortDueDate,
+ /** Sort Todos by priority */
+ TodoSortPriority,
+ /** Sort Todos by percentage completed */
+ TodoSortPercentComplete,
+ /** Sort Todos alphabetically, by summary */
+ TodoSortSummary
+};
+
+/**
+ @enum JournalSortField
+ How Journals are to be sorted.
+*/
+enum JournalSortField
+{
+ /** Journals are to be unsorted */
+ JournalSortUnsorted,
+ /** Sort Journals chronologically by date */
+ JournalSortDate,
+ /** Sort Journals alphabetically, by summary */
+ JournalSortSummary
+};
+
+/**
+ @class Calendar
+
+ This is the main "calendar" object class. It holds information like
+ Incidences(Events, To-dos, Journals), user information, etc. etc.
+
+ This is an abstract base class defining the interface to a calendar. It is
+ implemented by subclasses like CalendarLocal, which use different
+ methods to store and access the data.
+
+ <b>Ownership of Incidences</b>:
+
+ Incidence ownership is handled by the following policy: As soon as an
+ Incidence (or any other subclass of IncidenceBase) object is added to the
+ Calendar by an add...() method it is owned by the Calendar object.
+ The Calendar takes care of deleting it. All Incidences returned by the
+ query functions are returned as pointers so that changes to the returned
+ Incidences are immediately visible in the Calendar. Do <em>Not</em>
+ delete any Incidence object you get from Calendar.
+
+ <b>Time Zone Handling</b>:
+
+ - Incidence Storing:
+ - By default, (when LocalTime is unset) Incidence dates will have the
+ "UTC" time zone when stored into a calendar file.
+ - To store Incidence dates without a time zone (i.e, "floating time
+ zone") LocalTime must be set using the setLocalTime() method.
+
+ - Incidence Viewing:
+ - By default, Incidence dates will have the "UTC" time zone when
+ read from a calendar.
+ - To view Incidence dates using another time zone TimeZoneId must
+ be set using the setTimeZoneId() method, or the TimeZoneId can
+ be passed to the Calendar constructor.
+ - It is permitted to switch viewing time zones using setTimeZoneId()
+ as desired after the Calendar object has been constructed.
+
+ - Note that:
+ - The Calendar class doesn't do anything with TimeZoneId: it simply
+ saves it for later use by the ICalFormat class.
+ - The ICalFormat class takes TimeZoneId and applies it to loaded
+ Incidences before returning them in ICalFormat::load().
+ - Each Incidence can have its own time zone (or have a floating
+ time zone).
+ - Once an Incidence is loaded it is adjusted to use the viewing
+ time zone, TimeZoneId.
+ - Depending on the LocalTime setting, all loaded Incidences are stored
+ either in UTC or without a time zone (floating time zone).
+*/
+class LIBKCAL_EXPORT Calendar : public QObject, public CustomProperties,
+ public IncidenceBase::Observer
+{
+ Q_OBJECT
+
+ public:
+
+ /**
+ Construct Calendar object using a Time Zone.
+
+ @param timeZoneId is a string containing a Time Zone ID, which is
+ assumed to be valid. The Time Zone Id is used to set the time zone
+ for viewing Incidence dates.\n
+ On some systems, /usr/share/zoneinfo/zone.tab may be available for
+ reference.\n
+ @e Example: "Europe/Berlin"
+
+ @warning
+ Do Not pass an empty timeZoneId string as this may cause unintended
+ consequences when storing Incidences into the Calendar.
+ */
+ Calendar( const QString &timeZoneId );
+
+ /**
+ Destructor
+ */
+ virtual ~Calendar();
+
+ /**
+ Set the Calendar Product ID.
+
+ @param productId is a QString containing the Product ID.
+ */
+ void setProductId( const QString &productId );
+
+ /**
+ Get the Calendar's Product ID.
+
+ @return the string containing the Product ID
+ */
+ QString productId();
+
+ /**
+ Set the owner of the Calendar.
+
+ @param owner is a Person object.
+ */
+ void setOwner( const Person &owner );
+
+ /**
+ Get the owner of the Calendar.
+
+ @return the owner Person object.
+ */
+ const Person &getOwner() const;
+
+ /**
+ Set the Time Zone Id for the Calendar.
+
+ @param timeZoneId is a string containing a Time Zone ID, which is
+ assumed to be valid. The Time Zone Id is used to set the time zone
+ for viewing Incidence dates.\n
+ On some systems, /usr/share/zoneinfo/zone.tab may be available for
+ reference.\n
+ @e Example: "Europe/Berlin"
+
+ @warning
+ Do Not pass an empty timeZoneId string as this may cause unintended
+ consequences when storing Incidences into the Calendar.
+ */
+ void setTimeZoneId( const QString &timeZoneId );
+
+ /**
+ * Set the timezone used for viewing the incidences in this calendar. In
+ * case it differs from the current timezone, shift the events such that they
+ * retain their absolute time (in UTC).
+ * @ref setTimeZoneId
+ */
+ virtual void setTimeZoneIdViewOnly( const QString &timeZoneId ) = 0;
+
+ /**
+ Get the Time Zone ID for the Calendar.
+
+ @return the string containg the Time Zone ID.
+ */
+ QString timeZoneId() const;
+
+ /**
+ Set to store calendar Incidences without a time zone.
+ */
+ void setLocalTime();
+
+ /**
+ Determine if Calendar Incidences are to be written without a time zone.
+
+ @return true if the Calendar is set to write Incidences withoout
+ a time zone; false otherwise.
+ */
+ bool isLocalTime() const;
+
+ /**
+ Set if the Calendar had been modified.
+
+ @param modified is true if the Calendar has been modified since open
+ or last save.
+ */
+ void setModified( bool modified );
+
+ /**
+ Determine the Calendar's modification status.
+
+ @return true if the Calendar has been modified since open or last save.
+ */
+ bool isModified() const { return mModified; }
+
+ /**
+ Clears out the current Calendar, freeing all used memory etc.
+ */
+ virtual void close() = 0;
+
+ /**
+ Sync changes in memory to persistant storage.
+ */
+ virtual void save() = 0;
+
+ /**
+ * Load the calendar contents from storage. This requires the calendar to have been loaded
+ * once before, in other words initialized.
+ * @par tz The timezone to use for loading.
+ */
+ virtual bool reload( const QString &tz ) = 0;
+
+ /**
+ Determine if the Calendar is currently being saved.
+
+ @return true if the Calendar is currently being saved; false otherwise.
+ */
+ virtual bool isSaving() { return false; }
+
+ /**
+ Return a list of all categories used by Incidences in this Calendar.
+
+ @return a QStringList containing all the categories.
+ */
+ QStringList categories();
+
+// Incidence Specific Methods //
+
+ /**
+ Insert an Incidence into the Calendar.
+
+ @param incidence is a pointer to the Incidence to insert.
+
+ @return true if the Incidence was successfully inserted; false otherwise.
+ */
+ virtual bool addIncidence( Incidence *incidence );
+
+ /**
+ Remove an Incidence from the Calendar.
+
+ @param incidence is a pointer to the Incidence to remove.
+
+ @return true if the Incidence was successfully removed; false otherwise.
+ */
+ virtual bool deleteIncidence( Incidence *incidence );
+
+ /**
+ Return a filtered list of all Incidences for this Calendar.
+
+ @return the list of all filtered Incidences.
+ */
+ virtual Incidence::List incidences();
+
+ /**
+ Return a filtered list of all Incidences which occur on the given date.
+
+ @param date request filtered Incidence list for this QDate only.
+
+ @return the list of filtered Incidences occurring on the specified date.
+ */
+ virtual Incidence::List incidences( const QDate &date );
+
+ /**
+ Return an unfiltered list of all Incidences for this Calendar.
+
+ @return the list of all unfiltered Incidences.
+ */
+ virtual Incidence::List rawIncidences();
+
+ /**
+ Returns the Incidence associated with the given unique identifier.
+
+ @param uid is a unique identifier string.
+
+ @return a pointer to the Incidence.
+ A null pointer is returned if no such Incidence exists.
+ */
+ Incidence *incidence( const QString &uid );
+
+ /**
+ Returns the Incidence associated with the given scheduling identifier.
+
+ @param sid is a unique scheduling identifier string.
+
+ @return a pointer to the Incidence.
+ A null pointer is returned if no such Incidence exists.
+ */
+ Incidence *incidenceFromSchedulingID( const QString &sid );
+
+ /**
+ * Searches all events and todos for (an incidence with this
+ * scheduling ID. Returns a list of matching results.
+ **/
+ Incidence::List incidencesFromSchedulingID( const QString &UID );
+
+ /**
+ Create a merged list of Events, Todos, and Journals.
+
+ @param events is an Event list to merge.
+ @param todos is a Todo list to merge.
+ @param journals is a Journal list to merge.
+
+ @return a list of merged Incidences.
+ */
+ static Incidence::List mergeIncidenceList( const Event::List &events,
+ const Todo::List &todos,
+ const Journal::List &journals );
+
+ /**
+ Flag that a change to a Calendar Incidence is starting.
+
+ @param incidence is a pointer to the Incidence that will be changing.
+ */
+ virtual bool beginChange( Incidence *incidence );
+
+ /**
+ Flag that a change to a Calendar Incidence has completed.
+
+ @param incidence is a pointer to the Incidence that was changed.
+ */
+ virtual bool endChange( Incidence *incidence );
+
+ /**
+ Dissociate an Incidence from a recurring Incidence.
+ By default, only one single Incidence for the specified @a date
+ will be dissociated and returned. If @a single is false, then
+ the recurrence will be split at @a date, the old Incidence will
+ have its recurrence ending at @a date and the new Incidence
+ will have all recurrences past the @a date.
+
+ @param incidence is a pointer to a recurring Incidence.
+ @param date is the QDate within the recurring Incidence on which
+ the dissociation will be performed.
+ @param single is a flag meaning that a new Incidence should be created
+ from the recurring Incidences after @a date.
+
+ @return a pointer to a new recurring Incidence if @a single is false.
+ */
+ Incidence *dissociateOccurrence( Incidence *incidence, QDate date,
+ bool single = true );
+
+// Event Specific Methods //
+
+ /**
+ Insert an Event into the Calendar.
+
+ @param event is a pointer to the Event to insert.
+
+ @return true if the Event was successfully inserted; false otherwise.
+ */
+ virtual bool addEvent( Event *event ) = 0;
+
+ /**
+ Remove an Event from the Calendar.
+
+ @param event is a pointer to the Event to remove.
+
+ @return true if the Event was successfully remove; false otherwise.
+ */
+ virtual bool deleteEvent( Event *event ) = 0;
+
+ /**
+ Sort a list of Events.
+
+ @param eventList is a pointer to a list of Events.
+ @param sortField specifies the EventSortField.
+ @param sortDirection specifies the SortDirection.
+
+ @return a list of Events sorted as specified.
+ */
+ static Event::List sortEvents( Event::List *eventList,
+ EventSortField sortField,
+ SortDirection sortDirection );
+ /**
+ Return a sorted, filtered list of all Events for this Calendar.
+
+ @param sortField specifies the EventSortField.
+ @param sortDirection specifies the SortDirection.
+
+ @return the list of all filtered Events sorted as specified.
+ */
+ virtual Event::List events(
+ EventSortField sortField = EventSortUnsorted,
+ SortDirection sortDirection = SortDirectionAscending );
+
+ /**
+ Return a filtered list of all Events which occur on the given timestamp.
+
+ @param qdt request filtered Event list for this QDateTime only.
+
+ @return the list of filtered Events occurring on the specified timestamp.
+ */
+ Event::List events( const QDateTime &qdt );
+
+ /**
+ Return a filtered list of all Events occurring within a date range.
+
+ @param start is the starting date.
+ @param end is the ending date.
+ @param inclusive if true only Events which are completely included
+ within the date range are returned.
+
+ @return the list of filtered Events occurring within the specified
+ date range.
+ */
+ Event::List events( const QDate &start, const QDate &end,
+ bool inclusive = false);
+
+ /**
+ Return a sorted, filtered list of all Events which occur on the given
+ date. The Events are sorted according to @a sortField and
+ @a sortDirection.
+
+ @param date request filtered Event list for this QDate only.
+ @param sortField specifies the EventSortField.
+ @param sortDirection specifies the SortDirection.
+
+ @return the list of sorted, filtered Events occurring on @a date.
+ */
+ Event::List events(
+ const QDate &date,
+ EventSortField sortField = EventSortUnsorted,
+ SortDirection sortDirection = SortDirectionAscending );
+
+ /**
+ Return a sorted, unfiltered list of all Events for this Calendar.
+
+ @param sortField specifies the EventSortField.
+ @param sortDirection specifies the SortDirection.
+
+ @return the list of all unfiltered Events sorted as specified.
+ */
+ virtual Event::List rawEvents(
+ EventSortField sortField = EventSortUnsorted,
+ SortDirection sortDirection = SortDirectionAscending ) = 0;
+
+ /**
+ Return an unfiltered list of all Events which occur on the given
+ timestamp.
+
+ @param qdt request unfiltered Event list for this QDateTime only.
+
+ @return the list of unfiltered Events occurring on the specified
+ timestamp.
+ */
+ virtual Event::List rawEventsForDate( const QDateTime &qdt ) = 0;
+
+ /**
+ Return an unfiltered list of all Events occurring within a date range.
+
+ @param start is the starting date.
+ @param end is the ending date.
+ @param inclusive if true only Events which are completely included
+ within the date range are returned.
+
+ @return the list of unfiltered Events occurring within the specified
+ date range.
+ */
+ virtual Event::List rawEvents( const QDate &start, const QDate &end,
+ bool inclusive = false ) = 0;
+
+ /**
+ Return a sorted, unfiltered list of all Events which occur on the given
+ date. The Events are sorted according to @a sortField and
+ @a sortDirection.
+
+ @param date request unfiltered Event list for this QDate only.
+ @param sortField specifies the EventSortField.
+ @param sortDirection specifies the SortDirection.
+
+ @return the list of sorted, unfiltered Events occurring on @a date.
+ */
+ virtual Event::List rawEventsForDate(
+ const QDate &date,
+ EventSortField sortField = EventSortUnsorted,
+ SortDirection sortDirection = SortDirectionAscending ) = 0;
+
+ /**
+ Returns the Event associated with the given unique identifier.
+
+ @param uid is a unique identifier string.
+
+ @return a pointer to the Event.
+ A null pointer is returned if no such Event exists.
+ */
+ virtual Event *event( const QString &uid ) = 0;
+
+// Todo Specific Methods //
+
+ /**
+ Insert a Todo into the Calendar.
+
+ @param todo is a pointer to the Todo to insert.
+
+ @return true if the Todo was successfully inserted; false otherwise.
+ */
+ virtual bool addTodo( Todo *todo ) = 0;
+
+ /**
+ Remove a Todo from the Calendar.
+
+ @param todo is a pointer to the Todo to remove.
+
+ @return true if the Todo was successfully removed; false otherwise.
+ */
+ virtual bool deleteTodo( Todo *todo ) = 0;
+
+ /**
+ Sort a list of Todos.
+
+ @param todoList is a pointer to a list of Todos.
+ @param sortField specifies the TodoSortField.
+ @param sortDirection specifies the SortDirection.
+
+ @return a list of Todos sorted as specified.
+ */
+ static Todo::List sortTodos( Todo::List *todoList,
+ TodoSortField sortField,
+ SortDirection sortDirection );
+
+ /**
+ Return a sorted, filtered list of all Todos for this Calendar.
+
+ @param sortField specifies the TodoSortField.
+ @param sortDirection specifies the SortDirection.
+
+ @return the list of all filtered Todos sorted as specified.
+ */
+ virtual Todo::List todos(
+ TodoSortField sortField = TodoSortUnsorted,
+ SortDirection sortDirection = SortDirectionAscending );
+
+ /**
+ Return a filtered list of all Todos which are due on the specified date.
+
+ @param date request filtered Todos due on this QDate.
+
+ @return the list of filtered Todos due on the specified date.
+ */
+ virtual Todo::List todos( const QDate &date );
+
+ /**
+ Return a sorted, unfiltered list of all Todos for this Calendar.
+
+ @param sortField specifies the TodoSortField.
+ @param sortDirection specifies the SortDirection.
+
+ @return the list of all unfiltered Todos sorted as specified.
+ */
+ virtual Todo::List rawTodos(
+ TodoSortField sortField = TodoSortUnsorted,
+ SortDirection sortDirection = SortDirectionAscending ) = 0;
+
+ /**
+ Return an unfiltered list of all Todos which due on the specified date.
+
+ @param date request unfiltered Todos due on this QDate.
+
+ @return the list of unfiltered Todos due on the specified date.
+ */
+ virtual Todo::List rawTodosForDate( const QDate &date ) = 0;
+
+ /**
+ Returns the Todo associated with the given unique identifier.
+
+ @param uid is a unique identifier string.
+
+ @return a pointer to the Todo.
+ A null pointer is returned if no such Todo exists.
+ */
+ virtual Todo *todo( const QString &uid ) = 0;
+
+// Journal Specific Methods //
+
+ /**
+ Insert a Journal into the Calendar.
+
+ @param journal is a pointer to the Journal to insert.
+
+ @return true if the Journal was successfully inserted; false otherwise.
+ */
+ virtual bool addJournal( Journal *journal ) = 0;
+
+ /**
+ Remove a Journal from the Calendar.
+
+ @param journal is a pointer to the Journal to remove.
+
+ @return true if the Journal was successfully removed; false otherwise.
+ */
+ virtual bool deleteJournal( Journal *journal ) = 0;
+
+ /**
+ Sort a list of Journals.
+
+ @param journalList is a pointer to a list of Journals.
+ @param sortField specifies the JournalSortField.
+ @param sortDirection specifies the SortDirection.
+
+ @return a list of Journals sorted as specified.
+ */
+ static Journal::List sortJournals( Journal::List *journalList,
+ JournalSortField sortField,
+ SortDirection sortDirection );
+ /**
+ Return a sorted, filtered list of all Journals for this Calendar.
+
+ @param sortField specifies the JournalSortField.
+ @param sortDirection specifies the SortDirection.
+
+ @return the list of all filtered Journals sorted as specified.
+ */
+ virtual Journal::List journals(
+ JournalSortField sortField = JournalSortUnsorted,
+ SortDirection sortDirection = SortDirectionAscending );
+
+ /**
+ Return a filtered list of all Journals for on the specifed date.
+
+ @param date request filtered Journals for this QDate only.
+
+ @return the list of filtered Journals for the specified date.
+ */
+ virtual Journal::List journals( const QDate &date );
+
+ /**
+ Return a sorted, unfiltered list of all Journals for this Calendar.
+
+ @param sortField specifies the JournalSortField.
+ @param sortDirection specifies the SortDirection.
+
+ @return the list of all unfiltered Journals sorted as specified.
+ */
+ virtual Journal::List rawJournals(
+ JournalSortField sortField = JournalSortUnsorted,
+ SortDirection sortDirection = SortDirectionAscending ) = 0;
+
+ /**
+ Return an unfiltered list of all Journals for on the specifed date.
+
+ @param date request unfiltered Journals for this QDate only.
+
+ @return the list of unfiltered Journals for the specified date.
+ */
+ virtual Journal::List rawJournalsForDate( const QDate &date ) = 0;
+
+ /**
+ Returns the Journal associated with the given unique identifier.
+
+ @param uid is a unique identifier string.
+
+ @return a pointer to the Journal.
+ A null pointer is returned if no such Journal exists.
+ */
+ virtual Journal *journal( const QString &uid ) = 0;
+
+// Relations Specific Methods //
+
+ /**
+ Setup Relations for an Incidence.
+
+ @param incidence is a pointer to the Incidence to have a
+ Relation setup.
+ */
+ virtual void setupRelations( Incidence *incidence );
+
+ /**
+ Remove all Relations from an Incidence.
+
+ @param incidence is a pointer to the Incidence to have a
+ Relation removed.
+ */
+ virtual void removeRelations( Incidence *incidence );
+
+// Filter Specific Methods //
+
+ /**
+ Set the Calendar filter.
+
+ @param filter a pointer to a CalFilter object which will be
+ used to filter Calendar Incidences.
+ */
+ void setFilter( CalFilter *filter );
+
+ /**
+ Return the Calendar filter.
+
+ @return a pointer to the Calendar CalFilter.
+ A null pointer is returned if no such CalFilter exists.
+ */
+ CalFilter *filter();
+
+// Alarm Specific Methods //
+
+ /**
+ Return a list of Alarms within a time range for this Calendar.
+
+ @param from is the starting timestamp.
+ @param to is the ending timestamp.
+
+ @return the list of Alarms for the for the specified time range.
+ */
+ virtual Alarm::List alarms( const QDateTime &from,
+ const QDateTime &to ) = 0;
+
+// Observer Specific Methods //
+
+ /**
+ @class Observer
+
+ The Observer class.
+ */
+ class Observer
+ {
+ public:
+ virtual ~Observer() {}
+ /**
+ Notify the Observer that a Calendar has been modified.
+
+ First parameter is true if the Calendar has been modified.\n
+ Second parameter is a pointer to the Calendar object that
+ is being observed.
+ */
+ virtual void calendarModified( bool /*modified*/,
+ Calendar * /*calendar*/ ) {};
+
+ /**
+ Notify the Observer that an Incidence has been inserted.
+
+ First parameter is a pointer to the Incidence that was inserted.
+ */
+ virtual void calendarIncidenceAdded( Incidence * /*incidence*/ ) {}
+
+ /**
+ Notify the Observer that an Incidence has been modified.
+
+ First parameter is a pointer to the Incidence that was modified.
+ */
+ virtual void calendarIncidenceChanged( Incidence * /*incidence*/ ) {}
+
+ /**
+ Notify the Observer that an Incidence has been removed.
+
+ First parameter is a pointer to the Incidence that was removed.
+ */
+ virtual void calendarIncidenceDeleted( Incidence * /*incidence*/ ) {}
+ };
+
+ /**
+ Register an Observer for this Calendar.
+
+ @param observer is a pointer to an Observer object that will be
+ watching this Calendar.
+ */
+ void registerObserver( Observer *observer );
+
+ /**
+ Unregister an Observer for this Calendar.
+
+ @param observer is a pointer to an Observer object that has been
+ watching this Calendar.
+ */
+ void unregisterObserver( Observer *observer );
+
+ signals:
+ /**
+ Signal that the Calendar has been modified.
+ */
+ void calendarChanged();
+
+ /**
+ Signal that the Calendar has been saved.
+ */
+ void calendarSaved();
+
+ /**
+ Signal that the Calendar has been loaded into memory.
+ */
+ void calendarLoaded();
+
+ protected:
+ /**
+ The Observer interface. So far not implemented.
+
+ @param incidenceBase is a pointer an IncidenceBase object.
+ */
+ void incidenceUpdated( IncidenceBase *incidenceBase );
+
+ /**
+ Let Calendar subclasses set the Time Zone ID.
+
+ First parameter is a string containing a Time Zone ID, which is
+ assumed to be valid. On some systems, /usr/share/zoneinfo/zone.tab
+ may be available for reference.\n
+ @e Example: "Europe/Berlin"
+
+ @warning
+ Do Not pass an empty timeZoneId string as this may cause unintended
+ consequences when storing Incidences into the Calendar.
+ */
+ virtual void doSetTimeZoneId( const QString &/*timeZoneId*/ ) {}
+
+ /**
+ Let Calendar subclasses notify that they inserted an Incidence.
+
+ @param incidence is a pointer to the Incidence object that was inserted.
+ */
+ void notifyIncidenceAdded( Incidence *incidence );
+
+ /**
+ Let Calendar subclasses notify that they modified an Incidence.
+
+ @param incidence is a pointer to the Incidence object that was modified.
+ */
+ void notifyIncidenceChanged( Incidence *incidence );
+
+ /**
+ Let Calendar subclasses notify that they removed an Incidence.
+
+ @param incidence is a pointer to the Incidence object that was removed.
+ */
+ void notifyIncidenceDeleted( Incidence *incidence );
+
+ /**
+ @copydoc
+ CustomProperties::customPropertyUpdated()
+ */
+ virtual void customPropertyUpdated();
+
+ /**
+ Let Calendar subclasses notify that they enabled an Observer.
+
+ @param enabled if true tells the Calendar that a subclass has
+ enabled an Observer.
+ */
+ void setObserversEnabled( bool enabled );
+
+ //TODO: Move appendAlarms() and appendRecurringAlarms() from
+ // calendarlocal here, as protected static methods
+ // returning static Alarm::List
+
+ private:
+ /**
+ Intialize a Calendar object with starting values.
+ */
+ void init();
+
+ QString mProductId;
+ Person mOwner;
+ QString mTimeZoneId;
+ bool mLocalTime;
+
+ bool mModified;
+
+ CalFilter *mFilter;
+ CalFilter *mDefaultFilter;
+
+ QPtrList<Observer> mObservers;
+ bool mNewObserver;
+ bool mObserversEnabled;
+
+ // This list is used to put together related Todos
+ QDict<Incidence> mOrphans;
+ QDict<Incidence> mOrphanUids;
+
+ class Private;
+ Private *d;
+ };
+
+}
+
+#endif
diff --git a/libkcal/calendarlocal.cpp b/libkcal/calendarlocal.cpp
new file mode 100644
index 00000000..a37488f6
--- /dev/null
+++ b/libkcal/calendarlocal.cpp
@@ -0,0 +1,595 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 1998 Preston Brown <pbrown@kde.org>
+ Copyright (c) 2001,2003,2004 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qdatetime.h>
+#include <qstring.h>
+#include <qptrlist.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+
+#include "vcaldrag.h"
+#include "vcalformat.h"
+#include "icalformat.h"
+#include "exceptions.h"
+#include "incidence.h"
+#include "journal.h"
+#include "filestorage.h"
+
+#include "calendarlocal.h"
+
+using namespace KCal;
+
+CalendarLocal::CalendarLocal( const QString &timeZoneId )
+ : Calendar( timeZoneId ), mEvents( 47 )
+{
+ init();
+}
+
+void CalendarLocal::init()
+{
+ mDeletedIncidences.setAutoDelete( true );
+ mFileName = QString::null;
+}
+
+
+CalendarLocal::~CalendarLocal()
+{
+ close();
+}
+
+bool CalendarLocal::load( const QString &fileName, CalFormat *format )
+{
+ mFileName = fileName;
+ FileStorage storage( this, fileName, format );
+ return storage.load();
+}
+
+bool CalendarLocal::reload( const QString &tz )
+{
+ const QString filename = mFileName;
+ save();
+ close();
+ mFileName = filename;
+ setTimeZoneId( tz );
+ FileStorage storage( this, mFileName );
+ return storage.load();
+}
+
+bool CalendarLocal::save( const QString &fileName, CalFormat *format )
+{
+ // Save only if the calendar is either modified, or saved to a
+ // different file than it was loaded from
+ if ( mFileName != fileName || isModified() ) {
+ FileStorage storage( this, fileName, format );
+ return storage.save();
+ } else {
+ return true;
+ }
+}
+
+void CalendarLocal::close()
+{
+ setObserversEnabled( false );
+ mFileName = QString::null;
+
+ deleteAllEvents();
+ deleteAllTodos();
+ deleteAllJournals();
+
+ mDeletedIncidences.clear();
+ setModified( false );
+
+ setObserversEnabled( true );
+}
+
+
+bool CalendarLocal::addEvent( Event *event )
+{
+ insertEvent( event );
+
+ event->registerObserver( this );
+
+ setModified( true );
+
+ notifyIncidenceAdded( event );
+
+ return true;
+}
+
+bool CalendarLocal::deleteEvent( Event *event )
+{
+// kdDebug(5800) << "CalendarLocal::deleteEvent" << endl;
+
+ if ( mEvents.remove( event->uid() ) ) {
+ setModified( true );
+ notifyIncidenceDeleted( event );
+ mDeletedIncidences.append( event );
+ return true;
+ } else {
+ kdWarning() << "CalendarLocal::deleteEvent(): Event not found." << endl;
+ return false;
+ }
+}
+
+void CalendarLocal::deleteAllEvents()
+{
+ // kdDebug(5800) << "CalendarLocal::deleteAllEvents" << endl;
+ QDictIterator<Event> it( mEvents );
+ while( it.current() ) {
+ notifyIncidenceDeleted( it.current() );
+ ++it;
+ }
+
+ mEvents.setAutoDelete( true );
+ mEvents.clear();
+ mEvents.setAutoDelete( false );
+}
+
+Event *CalendarLocal::event( const QString &uid )
+{
+// kdDebug(5800) << "CalendarLocal::event(): " << uid << endl;
+ return mEvents[ uid ];
+}
+
+bool CalendarLocal::addTodo( Todo *todo )
+{
+ mTodoList.append( todo );
+
+ todo->registerObserver( this );
+
+ // Set up subtask relations
+ setupRelations( todo );
+
+ setModified( true );
+
+ notifyIncidenceAdded( todo );
+
+ return true;
+}
+
+bool CalendarLocal::deleteTodo( Todo *todo )
+{
+ // Handle orphaned children
+ removeRelations( todo );
+
+ if ( mTodoList.removeRef( todo ) ) {
+ setModified( true );
+ notifyIncidenceDeleted( todo );
+ mDeletedIncidences.append( todo );
+ return true;
+ } else {
+ kdWarning() << "CalendarLocal::deleteTodo(): Todo not found." << endl;
+ return false;
+ }
+}
+
+void CalendarLocal::deleteAllTodos()
+{
+ // kdDebug(5800) << "CalendarLocal::deleteAllTodos()\n";
+ Todo::List::ConstIterator it;
+ for( it = mTodoList.begin(); it != mTodoList.end(); ++it ) {
+ notifyIncidenceDeleted( *it );
+ }
+
+ mTodoList.setAutoDelete( true );
+ mTodoList.clearAll();
+ mTodoList.setAutoDelete( false );
+}
+
+Todo::List CalendarLocal::rawTodos( TodoSortField sortField,
+ SortDirection sortDirection )
+{
+ return sortTodos( &mTodoList, sortField, sortDirection );
+}
+
+Todo *CalendarLocal::todo( const QString &uid )
+{
+ Todo::List::ConstIterator it;
+ for ( it = mTodoList.begin(); it != mTodoList.end(); ++it ) {
+ if ( (*it)->uid() == uid ) return *it;
+ }
+
+ return 0;
+}
+
+Todo::List CalendarLocal::rawTodosForDate( const QDate &date )
+{
+ Todo::List todos;
+
+ Todo::List::ConstIterator it;
+ for ( it = mTodoList.begin(); it != mTodoList.end(); ++it ) {
+ Todo *todo = *it;
+ if ( todo->hasDueDate() && todo->dtDue().date() == date ) {
+ todos.append( todo );
+ }
+ }
+
+ return todos;
+}
+
+Alarm::List CalendarLocal::alarmsTo( const QDateTime &to )
+{
+ return alarms( QDateTime( QDate( 1900, 1, 1 ) ), to );
+}
+
+Alarm::List CalendarLocal::alarms( const QDateTime &from, const QDateTime &to )
+{
+// kdDebug(5800) << "CalendarLocal::alarms(" << from.toString() << " - "
+// << to.toString() << ")" << endl;
+
+ Alarm::List alarms;
+
+ EventDictIterator it( mEvents );
+ for( ; it.current(); ++it ) {
+ Event *e = *it;
+ if ( e->doesRecur() ) appendRecurringAlarms( alarms, e, from, to );
+ else appendAlarms( alarms, e, from, to );
+ }
+
+ Todo::List::ConstIterator it2;
+ for( it2 = mTodoList.begin(); it2 != mTodoList.end(); ++it2 ) {
+ if (! (*it2)->isCompleted() ) appendAlarms( alarms, *it2, from, to );
+ }
+
+ return alarms;
+}
+
+void CalendarLocal::appendAlarms( Alarm::List &alarms, Incidence *incidence,
+ const QDateTime &from, const QDateTime &to )
+{
+ QDateTime preTime = from.addSecs(-1);
+ Alarm::List::ConstIterator it;
+ for( it = incidence->alarms().begin(); it != incidence->alarms().end();
+ ++it ) {
+ if ( (*it)->enabled() ) {
+ QDateTime dt = (*it)->nextRepetition(preTime);
+ if ( dt.isValid() && dt <= to ) {
+ kdDebug(5800) << "CalendarLocal::appendAlarms() '"
+ << incidence->summary() << "': "
+ << dt.toString() << endl;
+ alarms.append( *it );
+ }
+ }
+ }
+}
+
+void CalendarLocal::appendRecurringAlarms( Alarm::List &alarms,
+ Incidence *incidence,
+ const QDateTime &from,
+ const QDateTime &to )
+{
+ QDateTime qdt;
+ int endOffset = 0;
+ bool endOffsetValid = false;
+ int period = from.secsTo(to);
+ Alarm::List::ConstIterator it;
+ for( it = incidence->alarms().begin(); it != incidence->alarms().end();
+ ++it ) {
+ Alarm *alarm = *it;
+ if ( alarm->enabled() ) {
+ if ( alarm->hasTime() ) {
+ // The alarm time is defined as an absolute date/time
+ qdt = alarm->nextRepetition( from.addSecs(-1) );
+ if ( !qdt.isValid() || qdt > to )
+ continue;
+ } else {
+ // The alarm time is defined by an offset from the event start or end time.
+ // Find the offset from the event start time, which is also used as the
+ // offset from the recurrence time.
+ int offset = 0;
+ if ( alarm->hasStartOffset() ) {
+ offset = alarm->startOffset().asSeconds();
+ } else if ( alarm->hasEndOffset() ) {
+ if ( !endOffsetValid ) {
+ endOffset = incidence->dtStart().secsTo( incidence->dtEnd() );
+ endOffsetValid = true;
+ }
+ offset = alarm->endOffset().asSeconds() + endOffset;
+ }
+
+ // Adjust the 'from' date/time and find the next recurrence at or after it
+ qdt = incidence->recurrence()->getNextDateTime( from.addSecs(-offset - 1) );
+ if ( !qdt.isValid()
+ || (qdt = qdt.addSecs( offset )) > to ) // remove the adjustment to get the alarm time
+ {
+ // The next recurrence is too late.
+ if ( !alarm->repeatCount() )
+ continue;
+ // The alarm has repetitions, so check whether repetitions of previous
+ // recurrences fall within the time period.
+ bool found = false;
+ qdt = from.addSecs( -offset );
+ while ( (qdt = incidence->recurrence()->getPreviousDateTime( qdt )).isValid() ) {
+ int toFrom = qdt.secsTo( from ) - offset;
+ if ( toFrom > alarm->duration() )
+ break; // this recurrence's last repetition is too early, so give up
+ // The last repetition of this recurrence is at or after 'from' time.
+ // Check if a repetition occurs between 'from' and 'to'.
+ int snooze = alarm->snoozeTime() * 60; // in seconds
+ if ( period >= snooze
+ || toFrom % snooze == 0
+ || (toFrom / snooze + 1) * snooze <= toFrom + period ) {
+ found = true;
+#ifndef NDEBUG
+ qdt = qdt.addSecs( offset + ((toFrom-1) / snooze + 1) * snooze ); // for debug output
+#endif
+ break;
+ }
+ }
+ if ( !found )
+ continue;
+ }
+ }
+ kdDebug(5800) << "CalendarLocal::appendAlarms() '" << incidence->summary()
+ << "': " << qdt.toString() << endl;
+ alarms.append( alarm );
+ }
+ }
+}
+
+
+void CalendarLocal::incidenceUpdated( IncidenceBase *incidence )
+{
+ incidence->setSyncStatusSilent( Event::SYNCMOD );
+ incidence->setLastModified( QDateTime::currentDateTime() );
+ // we should probably update the revision number here,
+ // or internally in the Event itself when certain things change.
+ // need to verify with ical documentation.
+
+ // The static_cast is ok as the CalendarLocal only observes Incidence objects
+ notifyIncidenceChanged( static_cast<Incidence *>( incidence ) );
+
+ setModified( true );
+}
+
+void CalendarLocal::insertEvent( Event *event )
+{
+ QString uid = event->uid();
+ if ( mEvents[ uid ] == 0 ) {
+ mEvents.insert( uid, event );
+ }
+#ifndef NDEBUG
+ else // if we already have an event with this UID, it has to be the same event,
+ // otherwise something's really broken
+ Q_ASSERT( mEvents[uid] == event );
+#endif
+}
+
+Event::List CalendarLocal::rawEventsForDate( const QDate &qd,
+ EventSortField sortField,
+ SortDirection sortDirection )
+{
+ Event::List eventList;
+
+ EventDictIterator it( mEvents );
+ for( ; it.current(); ++it ) {
+ Event *event = *it;
+
+ if ( event->doesRecur() ) {
+ if ( event->isMultiDay() ) {
+ int extraDays = event->dtStart().date().daysTo( event->dtEnd().date() );
+ int i;
+ for ( i = 0; i <= extraDays; i++ ) {
+ if ( event->recursOn( qd.addDays( -i ) ) ) {
+ eventList.append( event );
+ break;
+ }
+ }
+ } else {
+ if ( event->recursOn( qd ) )
+ eventList.append( event );
+ }
+ } else {
+ if ( event->dtStart().date() <= qd && event->dateEnd() >= qd ) {
+ eventList.append( event );
+ }
+ }
+ }
+
+ return sortEvents( &eventList, sortField, sortDirection );
+}
+
+Event::List CalendarLocal::rawEvents( const QDate &start, const QDate &end,
+ bool inclusive )
+{
+ Event::List eventList;
+ QDate yesterStart = start.addDays(-1);
+
+ // Get non-recurring events
+ EventDictIterator it( mEvents );
+ for( ; it.current(); ++it ) {
+ Event *event = *it;
+
+ QDate rStart = event->dtStart().date();
+ if (end < rStart) {
+// kdDebug(5800) << "Skipping event starting after TOI" << endl;
+ continue;
+ }
+ if ( inclusive && rStart < start) {
+// kdDebug(5800) << "Skipping event starting before TOI while inclusive" << endl;
+ continue;
+ }
+
+ if ( ! event->doesRecur() ) { // non-recurring events
+ QDate rEnd = event->dtEnd().date();
+ if (rEnd < start) {
+// kdDebug(5800) << "Skipping event ending before TOI" << endl;
+ continue;
+ }
+ if ( inclusive && end < rEnd ) {
+// kdDebug(5800) << "Skipping event ending after TOI while inclusive" << endl;
+ continue;
+ }
+ } else { // recurring events
+ switch ( event->recurrence()->duration() ) {
+ case -1: // infinite
+ if ( inclusive ) {
+// kdDebug(5800) << "Skipping infinite event because inclusive" << endl;
+ continue;
+ }
+ break;
+ case 0: // end date given
+ default: // count given
+ QDate rEnd = event->recurrence()->endDate();
+ if ( ! rEnd.isValid() ) {
+// kdDebug(5800) << "Skipping recurring event without occurences" << endl;
+ continue;
+ }
+ if ( rEnd < start ) {
+// kdDebug(5800) << "Skipping recurring event ending before TOI" << endl;
+ continue;
+ }
+ if ( inclusive && end < rEnd ) {
+// kdDebug(5800) << "Skipping recurring event ending after TOI while inclusive" << endl;
+ continue;
+ }
+ /* FIXME: too much conversion between QDate and QDateTime makes this useless:
+ * freebusy(end=QDateTime(day, "00:00:00")) ->
+ * rawEvents(end=QDate(day)) ->
+ * durationTo(QDateTime(day, "23:59:59"))
+ * so events repeating at the end day match and are included.
+ */
+#if 0
+ int durationBeforeStart = event->recurrence()->durationTo(yesterStart);
+ int durationUntilEnd = event->recurrence()->durationTo(end);
+ if (durationBeforeStart == durationUntilEnd) {
+ kdDebug(5800) << "Skipping recurring event without occurences in TOI" << endl;
+ continue;
+ }
+#endif
+ break;
+ } // switch(duration)
+ } // if(doesRecur)
+
+ eventList.append( event );
+ }
+
+ return eventList;
+}
+
+Event::List CalendarLocal::rawEventsForDate( const QDateTime &qdt )
+{
+ return rawEventsForDate( qdt.date() );
+}
+
+Event::List CalendarLocal::rawEvents( EventSortField sortField, SortDirection sortDirection )
+{
+ Event::List eventList;
+ EventDictIterator it( mEvents );
+ for( ; it.current(); ++it )
+ eventList.append( *it );
+ return sortEvents( &eventList, sortField, sortDirection );
+}
+
+bool CalendarLocal::addJournal(Journal *journal)
+{
+// if (journal->dtStart().isValid())
+// kdDebug(5800) << "Adding Journal on " << journal->dtStart().toString() << endl;
+// else
+// kdDebug(5800) << "Adding Journal without a DTSTART" << endl;
+
+ mJournalList.append(journal);
+
+ journal->registerObserver( this );
+
+ setModified( true );
+
+ notifyIncidenceAdded( journal );
+
+ return true;
+}
+
+bool CalendarLocal::deleteJournal( Journal *journal )
+{
+ if ( mJournalList.removeRef( journal ) ) {
+ setModified( true );
+ notifyIncidenceDeleted( journal );
+ mDeletedIncidences.append( journal );
+ return true;
+ } else {
+ kdWarning() << "CalendarLocal::deleteJournal(): Journal not found." << endl;
+ return false;
+ }
+}
+
+void CalendarLocal::deleteAllJournals()
+{
+ Journal::List::ConstIterator it;
+ for( it = mJournalList.begin(); it != mJournalList.end(); ++it ) {
+ notifyIncidenceDeleted( *it );
+ }
+
+ mJournalList.setAutoDelete( true );
+ mJournalList.clearAll();
+ mJournalList.setAutoDelete( false );
+}
+
+Journal *CalendarLocal::journal( const QString &uid )
+{
+ Journal::List::ConstIterator it;
+ for ( it = mJournalList.begin(); it != mJournalList.end(); ++it )
+ if ( (*it)->uid() == uid )
+ return *it;
+
+ return 0;
+}
+
+Journal::List CalendarLocal::rawJournals( JournalSortField sortField, SortDirection sortDirection )
+{
+ return sortJournals( &mJournalList, sortField, sortDirection );
+}
+
+Journal::List CalendarLocal::rawJournalsForDate( const QDate &date )
+{
+ Journal::List journals;
+
+ Journal::List::ConstIterator it;
+ for ( it = mJournalList.begin(); it != mJournalList.end(); ++it ) {
+ Journal *journal = *it;
+ if ( journal->dtStart().date() == date ) {
+ journals.append( journal );
+ }
+ }
+
+ return journals;
+}
+
+void CalendarLocal::setTimeZoneIdViewOnly( const QString& tz )
+{
+ const QString question( i18n("The timezone setting was changed. In order to display the calendar "
+ "you are looking at in the new timezone, it needs to be saved. Do you want to save the pending "
+ "changes or rather wait and apply the new timezone on the next reload?" ) );
+ int rc = KMessageBox::Yes;
+ if ( isModified() ) {
+ rc = KMessageBox::questionYesNo( 0, question,
+ i18n("Save before applying timezones?"),
+ KStdGuiItem::save(),
+ KGuiItem(i18n("Apply Timezone Change on Next Reload")),
+ "calendarLocalSaveBeforeTimezoneShift");
+ }
+ if ( rc == KMessageBox::Yes ) {
+ reload( tz );
+ }
+}
diff --git a/libkcal/calendarlocal.h b/libkcal/calendarlocal.h
new file mode 100644
index 00000000..99bc76c2
--- /dev/null
+++ b/libkcal/calendarlocal.h
@@ -0,0 +1,228 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 1998 Preston Brown <pbrown@kde.org>
+ Copyright (c) 2001,2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_CALENDARLOCAL_H
+#define KCAL_CALENDARLOCAL_H
+
+#include "calendar.h"
+#include <qdict.h>
+#include <kdepimmacros.h>
+
+namespace KCal {
+
+class CalFormat;
+
+/**
+ This class provides a calendar stored as a local file.
+*/
+class LIBKCAL_EXPORT CalendarLocal : public Calendar
+{
+ public:
+ /**
+ Constructs a new calendar, with variables initialized to sane values.
+ */
+ CalendarLocal( const QString &timeZoneId );
+ ~CalendarLocal();
+
+ /**
+ Loads a calendar on disk in vCalendar or iCalendar format into the current
+ calendar. Incidences already present are preserved. If an event of the
+ file to be loaded has the same unique id as an incidence already present
+ the new incidence is ignored.
+
+ To load a CalendarLocal object from a file without preserving existing
+ incidences call close() before load().
+
+ @return true, if successful, false on error.
+ @param fileName the name of the calendar on disk.
+ @param format the format to use. If 0, iCalendar and vCalendar will be used
+ */
+ bool load( const QString &fileName, CalFormat *format = 0 );
+
+ /**
+ * Reloads the contents of the storage into memory. The associated file name
+ * must be known, in other words a previous load() must have been executed.
+ * @return success or failure
+ */
+ bool reload( const QString &tz );
+
+ /**
+ Writes out the calendar to disk in the specified \a format.
+ CalendarLocal takes ownership of the CalFormat object.
+ @param fileName the name of the file
+ @param format the format to use
+ @return true, if successful, false on error.
+ */
+ bool save( const QString &fileName, CalFormat *format = 0 );
+
+ /**
+ Clears out the current calendar, freeing all used memory etc. etc.
+ */
+ void close();
+
+ void save() {}
+
+ /**
+ Add Event to calendar.
+ */
+ bool addEvent( Event *event );
+ /**
+ Deletes an event from this calendar.
+ */
+ bool deleteEvent( Event *event );
+ /**
+ Deletes all events from this calendar.
+ */
+ void deleteAllEvents();
+
+ /**
+ Retrieves an event on the basis of the unique string ID.
+ */
+ Event *event( const QString &uid );
+ /**
+ Return unfiltered list of all events in calendar.
+ */
+ Event::List rawEvents( EventSortField sortField = EventSortUnsorted, SortDirection sortDirection = SortDirectionAscending );
+
+ /**
+ Add a todo to the todolist.
+ */
+ bool addTodo( Todo *todo );
+ /**
+ Remove a todo from the todolist.
+ */
+ bool deleteTodo( Todo * );
+ /**
+ Deletes all todos from this calendar.
+ */
+ void deleteAllTodos();
+ /**
+ Searches todolist for an event with this unique string identifier,
+ returns a pointer or null.
+ */
+ Todo *todo( const QString &uid );
+ /**
+ Return list of all todos.
+ */
+ Todo::List rawTodos( TodoSortField sortField = TodoSortUnsorted, SortDirection sortDirection = SortDirectionAscending );
+ /**
+ Returns list of todos due on the specified date.
+ */
+ Todo::List rawTodosForDate( const QDate &date );
+
+ /**
+ Add a Journal entry to calendar.
+ */
+ bool addJournal( Journal * );
+ /**
+ Remove a Journal from the calendar.
+ */
+ bool deleteJournal( Journal * );
+ /**
+ Deletes all journals from this calendar.
+ */
+ void deleteAllJournals();
+ /**
+ Return Journal with given UID.
+ */
+ Journal *journal( const QString &uid );
+ /**
+ Return list of all journals.
+ */
+ Journal::List rawJournals( JournalSortField sortField = JournalSortUnsorted, SortDirection sortDirection = SortDirectionAscending );
+ /**
+ Get unfiltered journals for a given date.
+ */
+ Journal::List rawJournalsForDate( const QDate &date );
+
+ /**
+ Return all alarms, which ocur in the given time interval.
+ */
+ Alarm::List alarms( const QDateTime &from, const QDateTime &to );
+
+ /**
+ Return all alarms, which ocur before given date.
+ */
+ Alarm::List alarmsTo( const QDateTime &to );
+
+ /**
+ Builds and then returns a list of all events that match for the
+ date specified. useful for dayView, etc. etc.
+ */
+ Event::List rawEventsForDate( const QDate &date, EventSortField sortField = EventSortUnsorted, SortDirection sortDirection = SortDirectionAscending );
+ /**
+ Get unfiltered events for date \a qdt.
+ */
+ Event::List rawEventsForDate( const QDateTime &qdt );
+ /**
+ Get unfiltered events in a range of dates. If inclusive is set to true,
+ only events are returned, which are completely included in the range.
+ If inclusive is set to false, all events which overlap the range are
+ returned. An event's entire time span is considered in evaluating
+ whether it should be returned. For a non-recurring event, its span is
+ from its start to its end date. For a recurring event, its time span is
+ from its first to its last recurrence.
+ */
+ Event::List rawEvents( const QDate &start, const QDate &end,
+ bool inclusive = false );
+
+ /**
+ * Set the timezone of the calendar to be used for interpreting the events
+ * in the calendar. This requires that the calendar is saved first, so the
+ * user is asked whether he wants to do that, or keep the timezone as is.
+ */
+ void setTimeZoneIdViewOnly( const QString& tz );
+
+ protected:
+
+ /** Notification function of IncidenceBase::Observer. */
+ void incidenceUpdated( IncidenceBase *i );
+
+ /** inserts an event into its "proper place" in the calendar. */
+ void insertEvent( Event *event );
+
+ /** Append alarms of incidence in interval to list of alarms. */
+ void appendAlarms( Alarm::List &alarms, Incidence *incidence,
+ const QDateTime &from, const QDateTime &to );
+
+ /** Append alarms of recurring events in interval to list of alarms. */
+ void appendRecurringAlarms( Alarm::List &alarms, Incidence *incidence,
+ const QDateTime &from, const QDateTime &to );
+
+ private:
+ void init();
+
+ typedef QDict<Event> EventDict;
+ typedef QDictIterator<Event> EventDictIterator;
+ EventDict mEvents;
+ Todo::List mTodoList;
+ Journal::List mJournalList;
+
+ Incidence::List mDeletedIncidences;
+ QString mFileName;
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/calendarnull.cpp b/libkcal/calendarnull.cpp
new file mode 100644
index 00000000..cef2588c
--- /dev/null
+++ b/libkcal/calendarnull.cpp
@@ -0,0 +1,42 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+/**
+ @file calendarnull.cpp
+ A null calendar class with does nothing.
+
+ @author Cornelius Schumacher
+*/
+#include "calendarnull.h"
+
+using namespace KCal;
+
+CalendarNull::CalendarNull( const QString &timeZoneId )
+ : Calendar( timeZoneId )
+{}
+
+CalendarNull *CalendarNull::mSelf = 0;
+
+CalendarNull *CalendarNull::self()
+{
+ if ( !mSelf ) mSelf = new CalendarNull( QString::fromLatin1( "UTC" ) );
+
+ return mSelf;
+}
diff --git a/libkcal/calendarnull.h b/libkcal/calendarnull.h
new file mode 100644
index 00000000..6f27ed52
--- /dev/null
+++ b/libkcal/calendarnull.h
@@ -0,0 +1,309 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+/*
+ @file calendarnull.h
+ A null calendar class with does nothing.
+
+ @author Cornelius Schumacher
+*/
+#ifndef KCAL_CALENDARNULL_H
+#define KCAL_CALENDARNULL_H
+
+#include "calendar.h"
+#include "libkcal_export.h"
+
+class KConfig;
+
+/**
+ @namespace KCal
+ Namespace KCal is for global classes, objects and/or functions in libkcal.
+*/
+namespace KCal {
+
+/**
+ @class CalendarNull
+
+ This is a null calendar class which does nothing. It can be passed to
+ functions which need a calendar object when there actually isn't a real
+ calendar yet. CalendarNull can be used to implement the null object
+ design pattern. Instead of passing a 0 pointer and checking for 0 with
+ each access a CalendarNull object can be passed.
+*/
+class LIBKCAL_EXPORT CalendarNull : public Calendar
+{
+ public:
+ /**
+ Constructor.
+ */
+ CalendarNull( const QString &timeZoneId );
+
+ /**
+ Destructor.
+ */
+ ~CalendarNull() {}
+
+ /**
+ Returns a pointer to a CalendarNull object, which is constructed
+ if necessary.
+ */
+ static CalendarNull *self();
+
+ /**
+ Clears out the current Calendar, freeing all used memory etc.
+ */
+ void close() {}
+
+ /**
+ Sync changes in memory to persistant storage.
+ */
+ void save() {}
+
+ bool reload( const QString & ) { return true;}
+
+// Event Specific Methods //
+
+ /**
+ Insert an Evenet into the Calendar.
+
+ First parameter is a pointer to the Event to insert.
+
+ Returns false.
+ */
+ bool addEvent( Event * /*event*/ )
+ { return false; }
+
+ /**
+ Remove an Event from the Calendar.
+
+ First parameter is a pointer to the Event to remove.
+
+ Returns false.
+ */
+ bool deleteEvent( Event * /*event*/ )
+ { return false; }
+
+ /**
+ Return a sorted, unfiltered list of all Events for this Calendar.
+
+ First parameter specifies the EventSortField.\n
+ Second parameter specifies the SortDirection.
+
+ Returns an empty Event List.
+ */
+ Event::List rawEvents( EventSortField /*sortField*/,
+ SortDirection /*sortDirection*/ )
+ { return Event::List(); }
+
+ /**
+ Return an unfiltered list of all Events occurring within a date range.
+
+ First parameter is the starting date.\n
+ Second parameter is the ending date.\n
+ Third parameter, if true, specifies that only Events which are
+ completely included within the date range are returned.
+
+ Returns an empty Event List.
+ */
+ Event::List rawEvents( const QDate & /*start*/, const QDate & /*end*/,
+ bool /*inclusive*/ )
+ { return Event::List(); }
+
+ /**
+ Return an unfiltered list of all Events which occur on the given
+ timestamp.
+
+ First parameter is a QDateTime to return unfiltered events for.
+
+ Returns an empty Event List.
+ */
+ Event::List rawEventsForDate( const QDateTime & /*qdt*/ )
+ { return Event::List(); }
+
+ /**
+ Return a sorted, unfiltered list of all Events which occur on the given
+ date. The Events are sorted according to @a sortField and
+ @a sortDirection.
+
+ First parameter is a QDate to return unfiltered Events for.\n
+ Second parameter specifies the EventSortField.\n
+ Third parameter specifies the SortDirection.
+
+ Returns an empty Event List.
+ */
+ Event::List rawEventsForDate(
+ const QDate & /*date*/,
+ EventSortField /*sortField=EventSortUnsorted*/,
+ SortDirection /*sortDirection=SortDirectionAscending*/ )
+ { return Event::List(); }
+
+ /**
+ Returns the Event associated with the given unique identifier.
+
+ First parameter is a unique identifier string.
+
+ Return a null Event pointer.
+ */
+ Event *event( const QString & /*uid*/ )
+ { return 0; }
+
+// Todo Specific Methods //
+
+ /**
+ Insert a Todo into the Calendar.
+
+ First parameter is a pointer to the Todo to insert.
+
+ Returns false.
+ */
+ bool addTodo( Todo * /*todo*/ )
+ { return false; }
+
+ /**
+ Remove a Todo from the Calendar.
+
+ First parameter is a pointer to the Todo to remove.
+
+ Returns false.
+ */
+ bool deleteTodo( Todo * /*todo*/ )
+ { return false; }
+
+ /**
+ Return a sorted, unfiltered list of all Todos for this Calendar.
+
+ First parameter specifies the TodoSortField.\n
+ Second parameter specifies the SortDirection.
+
+ Returns an empty Todo List.
+ */
+ Todo::List rawTodos( TodoSortField /*sortField*/,
+ SortDirection /*sortDirection*/ )
+ { return Todo::List(); }
+
+ /**
+ Return an unfiltered list of all Todos for this Calendar which
+ are due on the specifed date.
+
+ First parameter is the due date to return unfiltered Todos for.
+
+ Returns an empty Todo List.
+ */
+ Todo::List rawTodosForDate( const QDate & /*date*/ )
+ { return Todo::List(); }
+
+ /**
+ Returns the Todo associated with the given unique identifier.
+
+ First parameter is a unique identifier string.
+
+ Returns a null Todo pointer.
+ */
+ Todo *todo( const QString & /*uid*/ )
+ { return 0; }
+
+// Journal Specific Methods //
+
+ /**
+ Insert a Journal into the Calendar.
+
+ First parameter is a pointer to the Journal to insert.
+
+ Returns false.
+ */
+ bool addJournal( Journal * /*journal*/ )
+ { return false; }
+
+ /**
+ Remove a Journal from the Calendar.
+
+ First parameter is a pointer to the Journal to remove.
+
+ Returns false.
+ */
+ bool deleteJournal( Journal * /*journal*/ )
+ { return false; }
+
+ /**
+ Return a sorted, filtered list of all Journals for this Calendar.
+
+ First parameter specifies the JournalSortField.\n
+ Second parameterd specifies the SortDirection.
+
+ Returns an empty Journal List.
+ */
+ Journal::List rawJournals( JournalSortField /*sortField*/,
+ SortDirection /*sortDirection*/ )
+ { return Journal::List(); }
+
+ /**
+ Return an unfiltered list of all Journals for on the specifed date.
+
+ First parameter specifies the data to return the unfiltered Journals for.
+
+ Returns an empty Journal List.
+ */
+ Journal::List rawJournalsForDate( const QDate & /*date*/ )
+ { return Journal::List(); }
+
+ /**
+ Returns the Journal associated with the given unique identifier.
+
+ First parameter is a unique identifier string.
+
+ Returns an null Journal pointer.
+ */
+ Journal *journal( const QString & /*uid*/ )
+ { return 0; }
+
+// Alarm Specific Methods //
+
+ /**
+ Return a list of Alarms within a time range for this Calendar.
+
+ First parameter is the starting timestamp.\n
+ Second parameter is the ending timestamp.
+
+ Returns an empty Alarm List.
+ */
+
+ Alarm::List alarms( const QDateTime & /*from*/, const QDateTime & /*to*/ )
+ { return Alarm::List(); }
+
+// Observer Specific Methods //
+
+ /**
+ The Observer interface. So far not implemented.
+ First parameter is a pointer an IncidenceBase object.
+ */
+ void incidenceUpdated( IncidenceBase * /*incidenceBase*/ ) {}
+
+ void setTimeZoneIdViewOnly( const QString& ) {};
+
+ private:
+ static CalendarNull *mSelf;
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/calendarresources.cpp b/libkcal/calendarresources.cpp
new file mode 100644
index 00000000..d6ef5c79
--- /dev/null
+++ b/libkcal/calendarresources.cpp
@@ -0,0 +1,811 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+/**
+ @file calendarresources.cpp
+ Provides a calendar composed of several calendar resources.
+
+ @author Cornelius Schumacher
+ @author Reinhold Kainhofer
+*/
+#include <stdlib.h>
+
+#include <qdatetime.h>
+#include <qstring.h>
+#include <qptrlist.h>
+
+#include <kdebug.h>
+#include <kstandarddirs.h>
+#include <klocale.h>
+
+#include "vcaldrag.h"
+#include "vcalformat.h"
+#include "icalformat.h"
+#include "exceptions.h"
+#include "incidence.h"
+#include "journal.h"
+#include "filestorage.h"
+
+#include <kresources/manager.h>
+#include <kresources/selectdialog.h>
+#include <kabc/lock.h>
+
+#include "resourcecalendar.h"
+#include "resourcelocal.h"
+
+#include "calendarresources.h"
+
+using namespace KCal;
+
+ResourceCalendar
+*CalendarResources::StandardDestinationPolicy::destination( Incidence * )
+{
+ return resourceManager()->standardResource();
+}
+
+ResourceCalendar
+*CalendarResources::AskDestinationPolicy::destination( Incidence * )
+{
+ QPtrList<KRES::Resource> list;
+
+ CalendarResourceManager::ActiveIterator it;
+ for ( it = resourceManager()->activeBegin();
+ it != resourceManager()->activeEnd(); ++it ) {
+ if ( !(*it)->readOnly() ) {
+ //Insert the first the Standard resource to get be the default selected.
+ if ( resourceManager()->standardResource() == *it )
+ list.insert( 0, *it );
+ else
+ list.append( *it );
+ }
+ }
+
+ KRES::Resource *r;
+ r = KRES::SelectDialog::getResource( list, parent() );
+ return static_cast<ResourceCalendar *>( r );
+}
+
+CalendarResources::CalendarResources( const QString &timeZoneId,
+ const QString &family )
+ : Calendar( timeZoneId )
+{
+ init( family );
+}
+
+void CalendarResources::init( const QString &family )
+{
+ kdDebug(5800) << "CalendarResources::init( " << family << " )" << endl;
+
+ mManager = new CalendarResourceManager( family );
+ mManager->addObserver( this );
+
+ mStandardPolicy = new StandardDestinationPolicy( mManager );
+ mAskPolicy = new AskDestinationPolicy( mManager );
+ mDestinationPolicy = mStandardPolicy;
+}
+
+CalendarResources::~CalendarResources()
+{
+ close();
+ delete mManager;
+ delete mStandardPolicy;
+ delete mAskPolicy;
+}
+
+void CalendarResources::readConfig( KConfig *config )
+{
+ mManager->readConfig( config );
+
+ CalendarResourceManager::Iterator it;
+ for ( it = mManager->begin(); it != mManager->end(); ++it ) {
+ connectResource( *it );
+ }
+}
+
+void CalendarResources::load()
+{
+ kdDebug(5800) << "CalendarResources::load()" << endl;
+
+ if ( !mManager->standardResource() ) {
+ kdDebug(5800) << "Warning! No standard resource yet." << endl;
+ }
+
+ // set the timezone for all resources. Otherwise we'll have those terrible tz
+ // troubles ;-((
+ CalendarResourceManager::Iterator i1;
+ for ( i1 = mManager->begin(); i1 != mManager->end(); ++i1 ) {
+ (*i1)->setTimeZoneId( timeZoneId() );
+ }
+
+ QValueList<ResourceCalendar *> failed;
+
+ // Open all active resources
+ CalendarResourceManager::ActiveIterator it;
+ for ( it = mManager->activeBegin(); it != mManager->activeEnd(); ++it ) {
+ if ( !(*it)->load() ) {
+ failed.append( *it );
+ }
+ Incidence::List incidences = (*it)->rawIncidences();
+ Incidence::List::Iterator incit;
+ for ( incit = incidences.begin(); incit != incidences.end(); ++incit ) {
+ (*incit)->registerObserver( this );
+ notifyIncidenceAdded( *incit );
+ }
+ }
+
+ QValueList<ResourceCalendar *>::ConstIterator it2;
+ for ( it2 = failed.begin(); it2 != failed.end(); ++it2 ) {
+ (*it2)->setActive( false );
+ emit signalResourceModified( *it2 );
+ }
+
+ mOpen = true;
+}
+
+bool CalendarResources::reload( const QString &tz )
+{
+ save();
+ close();
+ setTimeZoneId( tz );
+ load();
+ return true;
+}
+
+void CalendarResources::setStandardDestinationPolicy()
+{
+ mDestinationPolicy = mStandardPolicy;
+}
+
+void CalendarResources::setAskDestinationPolicy()
+{
+ mDestinationPolicy = mAskPolicy;
+}
+
+QWidget *CalendarResources::dialogParentWidget()
+{
+ return mDestinationPolicy->parent();
+}
+
+void CalendarResources::setDialogParentWidget( QWidget *parent )
+{
+ mDestinationPolicy->setParent( parent );
+}
+
+void CalendarResources::close()
+{
+ kdDebug(5800) << "CalendarResources::close" << endl;
+
+ if ( mOpen ) {
+ CalendarResourceManager::ActiveIterator it;
+ for ( it = mManager->activeBegin(); it != mManager->activeEnd(); ++it ) {
+ (*it)->close();
+ }
+
+ setModified( false );
+ mOpen = false;
+ }
+}
+
+void CalendarResources::save()
+{
+ kdDebug(5800) << "CalendarResources::save()" << endl;
+
+ if ( mOpen && isModified() ) {
+ CalendarResourceManager::ActiveIterator it;
+ for ( it = mManager->activeBegin(); it != mManager->activeEnd(); ++it ) {
+ (*it)->save();
+ }
+
+ setModified( false );
+ }
+}
+
+bool CalendarResources::isSaving()
+{
+ CalendarResourceManager::ActiveIterator it;
+ for ( it = mManager->activeBegin(); it != mManager->activeEnd(); ++it ) {
+ if ( (*it)->isSaving() ) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool CalendarResources::addIncidence( Incidence *incidence,
+ ResourceCalendar *resource )
+{
+ // FIXME: Use proper locking via begin/endChange!
+ bool validRes = false;
+ CalendarResourceManager::ActiveIterator it;
+ for ( it = mManager->activeBegin(); it != mManager->activeEnd(); ++it ) {
+ if ( (*it) == resource )
+ validRes = true;
+ }
+ ResourceCalendar *oldResource = 0;
+ if ( mResourceMap.contains( incidence ) ) {
+ oldResource = mResourceMap[incidence];
+ }
+ mResourceMap[incidence] = resource;
+ if ( validRes && beginChange( incidence ) &&
+ resource->addIncidence( incidence ) ) {
+// mResourceMap[incidence] = resource;
+ incidence->registerObserver( this );
+ notifyIncidenceAdded( incidence );
+ setModified( true );
+ endChange( incidence );
+ return true;
+ } else {
+ if ( oldResource )
+ mResourceMap[incidence] = oldResource;
+ else
+ mResourceMap.remove( incidence );
+ }
+
+ return false;
+}
+
+bool CalendarResources::addIncidence( Incidence *incidence )
+{
+ kdDebug(5800) << "CalendarResources::addIncidence" << this << endl;
+
+ ResourceCalendar *resource = mDestinationPolicy->destination( incidence );
+
+ if ( resource ) {
+ mResourceMap[ incidence ] = resource;
+
+ if ( beginChange( incidence ) && resource->addIncidence( incidence ) ) {
+ incidence->registerObserver( this );
+ notifyIncidenceAdded( incidence );
+
+
+ mResourceMap[ incidence ] = resource;
+ setModified( true );
+ endChange( incidence );
+ return true;
+ } else {
+ mResourceMap.remove( incidence );
+ }
+ } else
+ kdDebug(5800) << "CalendarResources::addIncidence(): no resource" << endl;
+
+ return false;
+}
+
+bool CalendarResources::addEvent( Event *event )
+{
+ kdDebug(5800) << "CalendarResources::addEvent" << endl;
+ return addIncidence( event );
+}
+
+bool CalendarResources::addEvent( Event *Event, ResourceCalendar *resource )
+{
+ return addIncidence( Event, resource );
+}
+
+bool CalendarResources::deleteEvent( Event *event )
+{
+ kdDebug(5800) << "CalendarResources::deleteEvent" << endl;
+
+ bool status;
+ if ( mResourceMap.find( event ) != mResourceMap.end() ) {
+ status = mResourceMap[event]->deleteEvent( event );
+ if ( status )
+ mResourceMap.remove( event );
+ } else {
+ status = false;
+ CalendarResourceManager::ActiveIterator it;
+ for ( it = mManager->activeBegin(); it != mManager->activeEnd(); ++it ) {
+ status = (*it)->deleteEvent( event ) || status;
+ }
+ }
+
+ setModified( status );
+ return status;
+}
+
+Event *CalendarResources::event( const QString &uid )
+{
+ CalendarResourceManager::ActiveIterator it;
+ for ( it = mManager->activeBegin(); it != mManager->activeEnd(); ++it ) {
+ Event* event = (*it)->event( uid );
+ if ( event ) {
+ mResourceMap[event] = *it;
+ return event;
+ }
+ }
+
+ // Not found
+ return 0;
+}
+
+bool CalendarResources::addTodo( Todo *todo )
+{
+ kdDebug(5800) << "CalendarResources::addTodo" << endl;
+ return addIncidence( todo );
+}
+
+bool CalendarResources::addTodo( Todo *todo, ResourceCalendar *resource )
+{
+ return addIncidence( todo, resource );
+}
+
+bool CalendarResources::deleteTodo( Todo *todo )
+{
+ kdDebug(5800) << "CalendarResources::deleteTodo" << endl;
+
+ bool status;
+ if ( mResourceMap.find( todo ) != mResourceMap.end() ) {
+ status = mResourceMap[todo]->deleteTodo( todo );
+ if ( status )
+ mResourceMap.remove( todo );
+ } else {
+ CalendarResourceManager::ActiveIterator it;
+ status = false;
+ for ( it = mManager->activeBegin(); it != mManager->activeEnd(); ++it ) {
+ status = (*it)->deleteTodo( todo ) || status;
+ }
+ }
+
+ setModified( status );
+ return status;
+}
+
+Todo::List CalendarResources::rawTodos( TodoSortField sortField,
+ SortDirection sortDirection )
+{
+ Todo::List result;
+
+ CalendarResourceManager::ActiveIterator it;
+ for ( it = mManager->activeBegin(); it != mManager->activeEnd(); ++it ) {
+ Todo::List todos = (*it)->rawTodos( TodoSortUnsorted );
+ Todo::List::ConstIterator it2;
+ for ( it2 = todos.begin(); it2 != todos.end(); ++it2 ) {
+ result.append( *it2 );
+ mResourceMap[ *it2 ] = *it;
+ }
+ }
+ return sortTodos( &result, sortField, sortDirection );
+}
+
+Todo *CalendarResources::todo( const QString &uid )
+{
+ kdDebug(5800) << "CalendarResources::todo(uid)" << endl;
+
+ CalendarResourceManager::ActiveIterator it;
+ for ( it = mManager->activeBegin(); it != mManager->activeEnd(); ++it ) {
+ Todo *todo = (*it)->todo( uid );
+ if ( todo ) {
+ mResourceMap[todo] = *it;
+ return todo;
+ }
+ }
+
+ // Not found
+ return 0;
+}
+
+Todo::List CalendarResources::rawTodosForDate( const QDate &date )
+{
+ Todo::List result;
+
+ CalendarResourceManager::ActiveIterator it;
+ for ( it = mManager->activeBegin(); it != mManager->activeEnd(); ++it ) {
+ Todo::List todos = (*it)->rawTodosForDate( date );
+ Todo::List::ConstIterator it2;
+ for ( it2 = todos.begin(); it2 != todos.end(); ++it2 ) {
+ result.append( *it2 );
+ mResourceMap[ *it2 ] = *it;
+ }
+ }
+
+ return result;
+}
+
+Alarm::List CalendarResources::alarmsTo( const QDateTime &to )
+{
+ kdDebug(5800) << "CalendarResources::alarmsTo" << endl;
+
+ Alarm::List result;
+ CalendarResourceManager::ActiveIterator resit;
+ for ( resit = mManager->activeBegin(); resit != mManager->activeEnd(); ++resit ) {
+ Alarm::List list = (*resit)->alarmsTo( to );
+ Alarm::List::Iterator alarmit;
+ for ( alarmit = list.begin(); alarmit != list.end(); ++alarmit )
+ result.append( *alarmit );
+ }
+ return result;
+}
+
+Alarm::List CalendarResources::alarms( const QDateTime &from,
+ const QDateTime &to )
+{
+ Alarm::List result;
+ CalendarResourceManager::ActiveIterator resit;
+ for ( resit = mManager->activeBegin(); resit != mManager->activeEnd(); ++resit ) {
+ Alarm::List list = (*resit)->alarms( from, to );
+ Alarm::List::Iterator alarmit;
+ for ( alarmit = list.begin(); alarmit != list.end(); ++alarmit )
+ result.append( *alarmit );
+ }
+ return result;
+}
+
+/****************************** PROTECTED METHODS ****************************/
+
+Event::List CalendarResources::rawEventsForDate( const QDate &date,
+ EventSortField sortField,
+ SortDirection sortDirection )
+{
+ Event::List result;
+ CalendarResourceManager::ActiveIterator it;
+ for ( it = mManager->activeBegin(); it != mManager->activeEnd(); ++it ) {
+ Event::List list = (*it)->rawEventsForDate( date );
+ Event::List::ConstIterator it2;
+ for ( it2 = list.begin(); it2 != list.end(); ++it2 ) {
+ result.append( *it2 );
+ mResourceMap[ *it2 ] = *it;
+ }
+ }
+ return sortEvents( &result, sortField, sortDirection );
+}
+
+Event::List CalendarResources::rawEvents( const QDate &start, const QDate &end,
+ bool inclusive )
+{
+ kdDebug(5800) << "CalendarResources::rawEvents(start,end,inclusive)" << endl;
+
+ Event::List result;
+ CalendarResourceManager::ActiveIterator it;
+ for ( it = mManager->activeBegin(); it != mManager->activeEnd(); ++it ) {
+ Event::List list = (*it)->rawEvents( start, end, inclusive );
+ Event::List::ConstIterator it2;
+ for ( it2 = list.begin(); it2 != list.end(); ++it2 ) {
+ result.append( *it2 );
+ mResourceMap[ *it2 ] = *it;
+ }
+ }
+ return result;
+}
+
+Event::List CalendarResources::rawEventsForDate( const QDateTime &qdt )
+{
+ kdDebug(5800) << "CalendarResources::rawEventsForDate(qdt)" << endl;
+
+ // @TODO: Remove the code duplication by the resourcemap iteration block.
+ Event::List result;
+ CalendarResourceManager::ActiveIterator it;
+ for ( it = mManager->activeBegin(); it != mManager->activeEnd(); ++it ) {
+ Event::List list = (*it)->rawEventsForDate( qdt );
+ Event::List::ConstIterator it2;
+ for ( it2 = list.begin(); it2 != list.end(); ++it2 ) {
+ result.append( *it2 );
+ mResourceMap[ *it2 ] = *it;
+ }
+ }
+ return result;
+}
+
+Event::List CalendarResources::rawEvents( EventSortField sortField,
+ SortDirection sortDirection )
+{
+ kdDebug(5800) << "CalendarResources::rawEvents()" << endl;
+
+ Event::List result;
+ CalendarResourceManager::ActiveIterator it;
+ for ( it = mManager->activeBegin(); it != mManager->activeEnd(); ++it ) {
+ Event::List list = (*it)->rawEvents( EventSortUnsorted );
+ Event::List::ConstIterator it2;
+ for ( it2 = list.begin(); it2 != list.end(); ++it2 ) {
+ result.append( *it2 );
+ mResourceMap[ *it2 ] = *it;
+ }
+ }
+ return sortEvents( &result, sortField, sortDirection );
+}
+
+
+bool CalendarResources::addJournal( Journal *journal )
+{
+ kdDebug(5800) << "CalendarResources::addJournal" << endl;
+ return addIncidence( journal );
+}
+
+bool CalendarResources::deleteJournal( Journal *journal )
+{
+ kdDebug(5800) << "CalendarResources::deleteJournal" << endl;
+
+ bool status;
+ if ( mResourceMap.find( journal ) != mResourceMap.end() ) {
+ status = mResourceMap[journal]->deleteJournal( journal );
+ if ( status )
+ mResourceMap.remove( journal );
+ } else {
+ CalendarResourceManager::ActiveIterator it;
+ status = false;
+ for ( it = mManager->activeBegin(); it != mManager->activeEnd(); ++it ) {
+ status = (*it)->deleteJournal( journal ) || status;
+ }
+ }
+
+ setModified( status );
+ return status;
+}
+
+bool CalendarResources::addJournal( Journal *journal,
+ ResourceCalendar *resource
+ )
+{
+ return addIncidence( journal, resource );
+}
+
+Journal *CalendarResources::journal( const QString &uid )
+{
+ kdDebug(5800) << "CalendarResources::journal(uid)" << endl;
+
+ CalendarResourceManager::ActiveIterator it;
+ for ( it = mManager->activeBegin(); it != mManager->activeEnd(); ++it ) {
+ Journal* journal = (*it)->journal( uid );
+ if ( journal ) {
+ mResourceMap[journal] = *it;
+ return journal;
+ }
+ }
+
+ // Not found
+ return 0;
+}
+
+Journal::List CalendarResources::rawJournals( JournalSortField sortField,
+ SortDirection sortDirection )
+{
+ kdDebug(5800) << "CalendarResources::rawJournals()" << endl;
+
+ Journal::List result;
+ CalendarResourceManager::ActiveIterator it;
+ for ( it = mManager->activeBegin(); it != mManager->activeEnd(); ++it ) {
+ Journal::List journals = (*it)->rawJournals( JournalSortUnsorted );
+ Journal::List::ConstIterator it2;
+ for ( it2 = journals.begin(); it2 != journals.end(); ++it2 ) {
+ result.append( *it2 );
+ mResourceMap[ *it2 ] = *it;
+ }
+ }
+ return sortJournals( &result, sortField, sortDirection );
+}
+
+Journal::List CalendarResources::rawJournalsForDate( const QDate &date )
+{
+
+ Journal::List result;
+
+ CalendarResourceManager::ActiveIterator it;
+ for ( it = mManager->activeBegin(); it != mManager->activeEnd(); ++it ) {
+ Journal::List journals = (*it)->rawJournalsForDate( date );
+ Journal::List::ConstIterator it2;
+ for ( it2 = journals.begin(); it2 != journals.end(); ++it2 ) {
+ result.append( *it2 );
+ mResourceMap[ *it2 ] = *it;
+ }
+ }
+ return result;
+}
+
+void CalendarResources::connectResource( ResourceCalendar *resource )
+{
+ connect( resource, SIGNAL( resourceChanged( ResourceCalendar * ) ),
+ SIGNAL( calendarChanged() ) );
+ connect( resource, SIGNAL( resourceSaved( ResourceCalendar * ) ),
+ SIGNAL( calendarSaved() ) );
+
+ connect( resource, SIGNAL( resourceLoadError( ResourceCalendar *,
+ const QString & ) ),
+ SLOT( slotLoadError( ResourceCalendar *, const QString & ) ) );
+ connect( resource, SIGNAL( resourceSaveError( ResourceCalendar *,
+ const QString & ) ),
+ SLOT( slotSaveError( ResourceCalendar *, const QString & ) ) );
+}
+
+ResourceCalendar *CalendarResources::resource( Incidence *incidence )
+{
+ if ( mResourceMap.find( incidence ) != mResourceMap.end() ) {
+ return mResourceMap[ incidence ];
+ }
+ return 0;
+}
+
+void CalendarResources::resourceAdded( ResourceCalendar *resource )
+{
+ kdDebug(5800) << "Resource added: " << resource->resourceName() << endl;
+
+ if ( !resource->isActive() )
+ return;
+
+ if ( resource->open() ) {
+ resource->load();
+ }
+
+ connectResource( resource );
+
+ emit signalResourceAdded( resource );
+}
+
+void CalendarResources::resourceModified( ResourceCalendar *resource )
+{
+ kdDebug(5800) << "Resource modified: " << resource->resourceName() << endl;
+
+ emit signalResourceModified( resource );
+}
+
+void CalendarResources::resourceDeleted( ResourceCalendar *resource )
+{
+ kdDebug(5800) << "Resource deleted: " << resource->resourceName() << endl;
+
+ emit signalResourceDeleted( resource );
+}
+
+void CalendarResources::doSetTimeZoneId( const QString &timeZoneId )
+{
+ // set the timezone for all resources. Otherwise we'll have those terrible
+ // tz troubles ;-((
+ CalendarResourceManager::Iterator i1;
+ for ( i1 = mManager->begin(); i1 != mManager->end(); ++i1 ) {
+ (*i1)->setTimeZoneId( timeZoneId );
+ }
+}
+
+void CalendarResources::setTimeZoneIdViewOnly( const QString &timeZoneId )
+{
+ reload( timeZoneId );
+}
+
+CalendarResources::Ticket
+*CalendarResources::requestSaveTicket( ResourceCalendar *resource )
+{
+ kdDebug(5800) << "CalendarResources::requestSaveTicket()" << endl;
+
+ KABC::Lock *lock = resource->lock();
+ if ( !lock )
+ return 0;
+ if ( lock->lock() )
+ return new Ticket( resource );
+ else
+ return 0;
+}
+
+bool CalendarResources::save( Ticket *ticket, Incidence *incidence )
+{
+ kdDebug(5800) << "CalendarResources::save( Ticket *)" << endl;
+
+ if ( !ticket || !ticket->resource() )
+ return false;
+
+ kdDebug(5800) << "tick " << ticket->resource()->resourceName() << endl;
+
+ // @TODO: Check if the resource was changed at all. If not, don't save.
+ if ( ticket->resource()->save( incidence ) ) {
+ releaseSaveTicket( ticket );
+ return true;
+ }
+
+ return false;
+}
+
+void CalendarResources::releaseSaveTicket( Ticket *ticket )
+{
+ ticket->resource()->lock()->unlock();
+ delete ticket;
+}
+
+bool CalendarResources::beginChange( Incidence *incidence )
+{
+ kdDebug(5800) << "CalendarResources::beginChange()" << endl;
+
+ ResourceCalendar *r = resource( incidence );
+ if ( !r ) {
+ r = mDestinationPolicy->destination( incidence );
+ if ( !r ) {
+ kdError() << "Unable to get destination resource." << endl;
+ return false;
+ }
+ mResourceMap[ incidence ] = r;
+ }
+
+ int count = incrementChangeCount( r );
+ if ( count == 1 ) {
+ Ticket *ticket = requestSaveTicket( r );
+ if ( !ticket ) {
+ kdDebug(5800) << "CalendarResources::beginChange(): unable to get ticket."
+ << endl;
+ decrementChangeCount( r );
+ return false;
+ } else {
+ mTickets[ r ] = ticket;
+ }
+ }
+
+ return true;
+}
+
+bool CalendarResources::endChange( Incidence *incidence )
+{
+ kdDebug(5800) << "CalendarResource::endChange()" << endl;
+
+ ResourceCalendar *r = resource( incidence );
+ if ( !r )
+ return false;
+
+ int count = decrementChangeCount( r );
+
+ if ( count == 0 ) {
+ bool ok = save( mTickets[ r ], incidence );
+ if ( ok ) {
+ mTickets.remove( r );
+ } else {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+int CalendarResources::incrementChangeCount( ResourceCalendar *r )
+{
+ if ( !mChangeCounts.contains( r ) ) {
+ mChangeCounts.insert( r, 0 );
+ }
+
+ int count = mChangeCounts[ r ];
+ ++count;
+ mChangeCounts[ r ] = count;
+
+ return count;
+}
+
+int CalendarResources::decrementChangeCount( ResourceCalendar *r )
+{
+ if ( !mChangeCounts.contains( r ) ) {
+ kdError() << "No change count for resource." << endl;
+ return 0;
+ }
+
+ int count = mChangeCounts[ r ];
+ --count;
+ if ( count < 0 ) {
+ kdError() << "Can't decrement change count. It already is 0." << endl;
+ count = 0;
+ }
+ mChangeCounts[ r ] = count;
+
+ return count;
+}
+
+void CalendarResources::slotLoadError( ResourceCalendar *, const QString &err )
+{
+ emit signalErrorMessage( err );
+}
+
+void CalendarResources::slotSaveError( ResourceCalendar *, const QString &err )
+{
+ emit signalErrorMessage( err );
+}
+
+#include "calendarresources.moc"
diff --git a/libkcal/calendarresources.h b/libkcal/calendarresources.h
new file mode 100644
index 00000000..a9e0fa80
--- /dev/null
+++ b/libkcal/calendarresources.h
@@ -0,0 +1,696 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+/**
+ @file calendarresources.h
+ Provides a Calendar composed of several Calendar Resources.
+
+ @author Cornelius Schumacher
+ @author Reinhold Kainhofer
+ */
+#ifndef KCAL_CALENDARRESOURCES_H
+#define KCAL_CALENDARRESOURCES_H
+
+#include <qintdict.h>
+#include <qmap.h>
+
+#include "calendar.h"
+#include "resourcecalendar.h"
+
+#include "libkcal_export.h"
+
+#include <kresources/manager.h>
+
+class QWidget;
+
+/**
+ @namespace KCal
+ Namespace KCal is for global classes, objects and/or functions in libkcal.
+*/
+namespace KCal {
+
+class CalFormat;
+
+/**
+ @class CalendarResources
+
+ This class provides a Calendar which is composed of other Calendars
+ known as "Resources".
+
+ Examples of Calendar Resources are:
+ - Calendars stored as local ICS formatted files
+ - a set of incidences (one-per-file) within a local directory
+ - birthdays and anniversaries contained in an addressbook
+
+*/
+class LIBKCAL_EXPORT CalendarResources :
+ public Calendar,
+ public KRES::ManagerObserver<ResourceCalendar>
+{
+ Q_OBJECT
+ public:
+ /**
+ @class DestinationPolicy
+ */
+ class DestinationPolicy
+ {
+ public:
+ DestinationPolicy( CalendarResourceManager *manager,
+ QWidget *parent = 0 ) :
+ mManager( manager ), mParent( parent ) {}
+
+ virtual ResourceCalendar *destination( Incidence *incidence ) = 0;
+ virtual QWidget *parent() { return mParent; }
+ virtual void setParent( QWidget *newparent ) { mParent = newparent; }
+
+ protected:
+ CalendarResourceManager *resourceManager()
+ { return mManager; }
+
+ private:
+ CalendarResourceManager *mManager;
+ QWidget *mParent;
+ };
+
+ /**
+ @class StandardDestinationPolicy
+ */
+ class StandardDestinationPolicy : public DestinationPolicy
+ {
+ public:
+ StandardDestinationPolicy( CalendarResourceManager *manager,
+ QWidget *parent = 0 ) :
+ DestinationPolicy( manager, parent ) {}
+
+ ResourceCalendar *destination( Incidence *incidence );
+
+ private:
+ class Private;
+ Private *d;
+ };
+
+ /**
+ @class AskDestinationPolicy
+ */
+ class AskDestinationPolicy : public DestinationPolicy
+ {
+ public:
+ AskDestinationPolicy( CalendarResourceManager *manager,
+ QWidget *parent = 0 ) :
+ DestinationPolicy( manager, parent ) {}
+
+ ResourceCalendar *destination( Incidence *incidence );
+
+ private:
+ class Private;
+ Private *d;
+ };
+
+ /**
+ @class Ticket
+ */
+ class Ticket
+ {
+ friend class CalendarResources;
+ public:
+ ResourceCalendar *resource() const
+ { return mResource; }
+
+ private:
+ Ticket( ResourceCalendar *r ) : mResource( r ) {}
+
+ ResourceCalendar *mResource;
+
+ class Private;
+ Private *d;
+ };
+
+ /**
+ Construct CalendarResource object using a Time Zone and a Family name.
+
+ @param timeZoneId is a string containing a Time Zone ID, which is
+ assumed to be valid. The Time Zone Id is used to set the time zone
+ for viewing Incidence dates.\n
+ On some systems, /usr/share/zoneinfo/zone.tab may be available for
+ reference.\n
+ @e Example: "Europe/Berlin"
+
+ @warning
+ Do Not pass an empty timeZoneId string as this may cause unintended
+ consequences when storing Incidences into the Calendar.
+
+ @param family is any QString representing a unique name.
+ */
+ CalendarResources(
+ const QString &timeZoneId,
+ const QString &family = QString::fromLatin1( "calendar" ) );
+
+ /**
+ Destructor
+ */
+ ~CalendarResources();
+
+ /**
+ Loads all Incidences from the Resources. The Resources must be added
+ first using either readConfig(KConfig *config), which adds the system
+ Resources, or manually using resourceAdded(ResourceCalendar *resource).
+ */
+ void load();
+
+ /**
+ * Reloads all incidences from all resources.
+ * @par tz The timezone to set.
+ * @return success or failure
+ */
+ bool reload( const QString &tz );
+
+ /**
+ Clear out the current Calendar, freeing all used memory etc.
+ */
+ void close();
+
+ /**
+ Save this Calendar.
+ If the save is successfull, the Ticket is deleted. Otherwise, the
+ caller must release the Ticket with releaseSaveTicket() to abandon
+ the save operation or call save() to try the save again.
+
+ @param ticket is a pointer to the Ticket object.
+ @param incidence is a pointer to the Incidence object.
+ If incidence is null, save the entire Calendar (all Resources)
+ else only the specified Incidence is saved.
+
+ @return true if the save was successful; false otherwise.
+ */
+ virtual bool save( Ticket *ticket, Incidence *incidence = 0 );
+
+ /**
+ Sync changes in memory to persistant storage.
+ */
+ void save();
+
+ /**
+ Determine if the Calendar is currently being saved.
+
+ @return true if the Calendar is currently being saved; false otherwise.
+ */
+ bool isSaving();
+
+ /**
+ Get the CalendarResourceManager used by this calendar.
+
+ @return a pointer to the CalendarResourceManage.
+ */
+ CalendarResourceManager *resourceManager() const
+ { return mManager; }
+
+ /**
+ Get the Resource associated with a specified Incidence.
+
+ @param incidence is a pointer to an Incidence whose Resource
+ is to be located.
+
+ @return a pointer to the Resource containing the Incidence.
+ */
+ ResourceCalendar *resource( Incidence *incidence );
+
+ /**
+ Read the Resources settings from a config file.
+
+ @param config The KConfig object which points to the config file.
+ If no object is given (null pointer) the standard config file is used.
+
+ @note Call this method <em>before</em> load().
+ */
+ void readConfig( KConfig *config = 0 );
+
+ /**
+ Set the destination policy such that Incidences are always added
+ to the standard Resource.
+ */
+ void setStandardDestinationPolicy();
+
+ /**
+ Set the destination policy such that Incidences are added to a
+ Resource which is queried.
+ */
+ void setAskDestinationPolicy();
+
+ /**
+ Returns the current parent for new dialogs. This is a bad hack, but we need
+ to properly set the parent for the resource selection dialog. Otherwise
+ the dialog will not be modal to the editor dialog in korganizer and
+ the user can still work in the editor dialog (and thus crash korganizer).
+ Afterwards we need to reset it (to avoid pointers to widgets that are
+ already deleted) so we also need the accessor
+ */
+ QWidget *dialogParentWidget();
+ /**
+ Set the widget parent for new dialogs. This is a bad hack, but we need
+ to properly set the parent for the resource selection dialog. Otherwise
+ the dialog will not be modal to the editor dialog in korganizer and
+ the user can still work in the editor dialog (and thus crash korganizer).
+ */
+ void setDialogParentWidget( QWidget *parent );
+
+ /**
+ Request ticket for saving the Calendar. If a ticket is returned the
+ Calendar is locked for write access until save() or releaseSaveTicket()
+ is called.
+
+ @param resource is a pointer to the ResourceCalendar object.
+
+ @return a pointer to a Ticket object indicating that the Calendar
+ is locked for write access; otherwise a null pointer.
+ */
+ Ticket *requestSaveTicket( ResourceCalendar *resource );
+
+ /**
+ Release the save Ticket. The Calendar is unlocked without saving.
+
+ @param ticket is a pointer to a Ticket object.
+ */
+ virtual void releaseSaveTicket( Ticket *ticket );
+
+ /**
+ Add a Resource to the Calendar.
+ This method must be public, because in-process added Resources
+ do not emit the corresponding signal, so this methodd has to be
+ called manually!
+
+ @param resource is a pointer to the ResourceCalendar to add.
+ */
+ void resourceAdded( ResourceCalendar *resource );
+
+// Incidence Specific Methods //
+
+ /**
+ Insert an Incidence into the Calendar.
+
+ @param incidence is a pointer to the Incidence to insert.
+
+ @return true if the Incidence was successfully inserted; false otherwise.
+ */
+ bool addIncidence( Incidence *incidence );
+
+ /**
+ Insert an Incidence into a Calendar Resource.
+
+ @param incidence is a pointer to the Incidence to insert.
+ @param resource is a pointer to the ResourceCalendar to be added to.
+
+ @return true if the Incidence was successfully inserted; false otherwise.
+ */
+ bool addIncidence( Incidence *incidence, ResourceCalendar *resource );
+
+ /**
+ Flag that a change to a Calendar Incidence is starting.
+
+ @param incidence is a pointer to the Incidence that will be changing.
+ */
+ bool beginChange( Incidence *incidence );
+
+ /**
+ Flag that a change to a Calendar Incidence has completed.
+
+ @param incidence is a pointer to the Incidence that was changed.
+ */
+ bool endChange( Incidence *incidence );
+
+// Event Specific Methods //
+
+ /**
+ Insert an Event into the Calendar.
+
+ @param event is a pointer to the Event to insert.
+
+ @return true if the Event was successfully inserted; false otherwise.
+
+ @note In most cases use
+ addIncidence( Incidence *incidence ) instead.
+ */
+ bool addEvent( Event *event );
+
+ /**
+ Insert an Event into a Calendar Resource.
+
+ @param event is a pointer to the Event to insert.
+ @param resource is a pointer to the ResourceCalendar to be added to.
+
+ @return true if the Event was successfully inserted; false otherwise.
+
+ @note In most cases use
+ addIncidence( Incidence *incidence, ResourceCalendar *resource ) instead.
+ */
+ bool addEvent( Event *event, ResourceCalendar *resource );
+
+ /**
+ Remove an Event from the Calendar.
+
+ @param event is a pointer to the Event to remove.
+
+ @return true if the Event was successfully removed; false otherwise.
+
+ @note In most cases use
+ deleteIncidence( Incidence *incidence) instead.
+ */
+ bool deleteEvent( Event *event );
+
+ /**
+ Return a sorted, unfiltered list of all Events.
+
+ @param sortField specifies the EventSortField.
+ @param sortDirection specifies the SortDirection.
+
+ @return the list of all unfiltered Events sorted as specified.
+ */
+ Event::List rawEvents(
+ EventSortField sortField = EventSortUnsorted,
+ SortDirection sortDirection = SortDirectionAscending );
+
+ /**
+ Return an unfiltered list of all Events which occur on the given
+ timestamp.
+
+ @param qdt request unfiltered Event list for this QDateTime only.
+
+ @return the list of unfiltered Events occurring on the specified
+ timestamp.
+ */
+ Event::List rawEventsForDate( const QDateTime &qdt );
+
+ /**
+ Return an unfiltered list of all Events occurring within a date range.
+
+ @param start is the starting date.
+ @param end is the ending date.
+ @param inclusive if true only Events which are completely included
+ within the date range are returned.
+
+ @return the list of unfiltered Events occurring within the specified
+ date range.
+ */
+ Event::List rawEvents( const QDate &start, const QDate &end,
+ bool inclusive = false );
+
+ /**
+ Return a sorted, unfiltered list of all Events which occur on the given
+ date. The Events are sorted according to @a sortField and
+ @a sortDirection.
+
+ @param date request unfiltered Event list for this QDate only.
+ @param sortField specifies the EventSortField.
+ @param sortDirection specifies the SortDirection.
+
+ @return the list of sorted, unfiltered Events occurring on @a date.
+ */
+ Event::List rawEventsForDate(
+ const QDate &date,
+ EventSortField sortField = EventSortUnsorted,
+ SortDirection sortDirection = SortDirectionAscending );
+
+ /**
+ Returns the Event associated with the given unique identifier.
+
+ @param uid is a unique identifier string.
+
+ @return a pointer to the Event.
+ A null pointer is returned if no such Event exists.
+ */
+ Event *event( const QString &uid );
+
+// Todo Specific Methods //
+
+ /**
+ Insert a Todo into a Calendar Resource.
+
+ @param todo is a pointer to the Todo to insert.
+
+ @return true if the Todo was successfully inserted; false otherwise.
+
+ @note In most cases use
+ addIncidence( Incidence *incidence ) instead.
+ */
+ bool addTodo( Todo *todo );
+
+ /**
+ Insert an Todo into a Calendar Resource.
+
+ @param todo is a pointer to the Todo to insert.
+ @param resource is a pointer to the ResourceCalendar to be added to.
+
+ @return true if the Todo was successfully inserted; false otherwise.
+
+ @note In most cases use
+ addIncidence( Incidence *incidence, ResourceCalendar *resource ) instead.
+ */
+ bool addTodo( Todo *todo, ResourceCalendar *resource );
+
+ /**
+ Remove an Todo from the Calendar.
+
+ @param todo is a pointer to the Todo to remove.
+
+ @return true if the Todo was successfully removed; false otherwise.
+
+ @note In most cases use
+ deleteIncidence( Incidence *incidence ) instead.
+ */
+ bool deleteTodo( Todo *todo );
+
+ /**
+ Return a sorted, unfiltered list of all Todos for this Calendar.
+
+ @param sortField specifies the TodoSortField.
+ @param sortDirection specifies the SortDirection.
+
+ @return the list of all unfiltered Todos sorted as specified.
+ */
+ Todo::List rawTodos( TodoSortField sortField = TodoSortUnsorted,
+ SortDirection sortDirection = SortDirectionAscending );
+
+ /**
+ Return an unfiltered list of all Todos which are due on the specified
+ date.
+
+ @param date request unfiltered Todos due on this QDate.
+
+ @return the list of unfiltered Todos due on the specified date.
+ */
+ Todo::List rawTodosForDate( const QDate &date );
+
+ /**
+ Returns the Todo associated with the given unique identifier.
+
+ @param uid is a unique identifier string.
+
+ @return a pointer to the Todo.
+ A null pointer is returned if no such Todo exists.
+ */
+ Todo *todo( const QString &uid );
+
+// Journal Specific Methods //
+
+ /**
+ Insert a Journal into the Calendar.
+
+ @param journal is a pointer to the Journal to insert.
+
+ @return true if the Journal was successfully inserted; false otherwise.
+
+ @note In most cases use
+ addIncidence( Incidence *incidence ) instead.
+ */
+ bool addJournal( Journal *journal );
+
+ /**
+ Insert a Journal into a Calendar Resource.
+
+ @param journal is a pointer to the Journal to insert.
+ @param resource is a pointer to the ResourceCalendar to be added to.
+
+ @return true if the Journal was successfully inserted; false otherwise.
+
+ @note In most cases use
+ addIncidence( Incidence *incidence, ResourceCalendar *resource ) instead.
+ */
+ bool addJournal( Journal *journal, ResourceCalendar *resource );
+
+ /**
+ Remove a Journal from the Calendar.
+
+ @param journal is a pointer to the Journal to remove.
+
+ @return true if the Journal was successfully removed; false otherwise.
+
+ @note In most cases use
+ deleteIncidence( Incidence *incidence ) instead.
+ */
+ bool deleteJournal( Journal *journal );
+
+ /**
+ Return a sorted, unfiltered list of all Journals for this Calendar.
+
+ @param sortField specifies the JournalSortField.
+ @param sortDirection specifies the SortDirection.
+
+ @return the list of all unfiltered Journals sorted as specified.
+ */
+ Journal::List rawJournals(
+ JournalSortField sortField = JournalSortUnsorted,
+ SortDirection sortDirection = SortDirectionAscending );
+
+ /**
+ Return an unfiltered list of all Journals for on the specifed date.
+
+ @param date request unfiltered Journals for this QDate only.
+
+ @return the list of unfiltered Journals for the specified date.
+ */
+ Journal::List rawJournalsForDate( const QDate &date );
+
+ /**
+ Returns the Journal associated with the given unique identifier.
+
+ @param uid is a unique identifier string.
+
+ @return a pointer to the Journal.
+ A null pointer is returned if no such Journal exists.
+ */
+ Journal *journal( const QString &uid );
+
+// Alarm Specific Methods //
+
+ /**
+ Return a list of Alarms within a time range for this Calendar.
+
+ @param from is the starting timestamp.
+ @param to is the ending timestamp.
+
+ @return the list of Alarms for the for the specified time range.
+ */
+ Alarm::List alarms( const QDateTime &from, const QDateTime &to );
+
+ /**
+ Return a list of Alarms that occur before the specified timestamp.
+
+ @param to is the ending timestamp.
+
+ @return the list of Alarms occurring before the specified QDateTime.
+ */
+ Alarm::List alarmsTo( const QDateTime &to );
+
+ /**
+ * Set the viewing time zone, which requires that all resources are saved,
+ * and then reloaded such that the event times are re-interpreted in the new
+ * timezone. Note that the absolute times of events do not change with this.
+ * If you want to change the times of the contents of the resources, use
+ * setTimeZoneId
+ */
+ void setTimeZoneIdViewOnly( const QString& tz );
+
+ signals:
+ /**
+ Signal that the Resource has been modified.
+ */
+ void signalResourceModified( ResourceCalendar *resource );
+
+ /**
+ Signal that an Incidence has been inserted to the Resource.
+ */
+ void signalResourceAdded( ResourceCalendar *resource );
+
+ /**
+ Signal that an Incidence has been removed from the Resource.
+ */
+ void signalResourceDeleted( ResourceCalendar *resource );
+
+ /**
+ Signal an error message.
+ */
+ void signalErrorMessage( const QString &err );
+
+ protected:
+ void connectResource( ResourceCalendar *resource );
+ void resourceModified( ResourceCalendar *resource );
+ void resourceDeleted( ResourceCalendar *resource );
+
+ /**
+ Let CalendarResource subclasses set the Time Zone ID.
+
+ First parameter is a string containing a Time Zone ID, which is
+ assumed to be valid. On some systems, /usr/share/zoneinfo/zone.tab
+ may be available for reference.\n
+ @e Example: "Europe/Berlin"
+
+ @warning
+ Do Not pass an empty timeZoneId string as this may cause unintended
+ consequences when storing Incidences into the Calendar.
+ */
+ virtual void doSetTimeZoneId( const QString &timeZoneId );
+
+ /**
+ Increment the number of times this Resource has been changed by 1.
+
+ @param resource is a pointer to the ResourceCalendar to be counted.
+
+ @return the new number of times this Resource has been changed.
+ */
+ int incrementChangeCount( ResourceCalendar *resource );
+
+ /**
+ Decrement the number of times this Resource has been changed by 1.
+
+ @param resource is a pointer to the ResourceCalendar to be counted.
+
+ @return the new number of times this Resource has been changed.
+ */
+ int decrementChangeCount( ResourceCalendar *resource );
+
+ protected slots:
+ void slotLoadError( ResourceCalendar *resource, const QString &err );
+ void slotSaveError( ResourceCalendar *resource, const QString &err );
+
+ private:
+ /**
+ Initialize the Resource object with starting values.
+ */
+ void init( const QString &family );
+
+ bool mOpen;
+
+ KRES::Manager<ResourceCalendar>* mManager;
+ QMap <Incidence*, ResourceCalendar*> mResourceMap;
+
+ DestinationPolicy *mDestinationPolicy;
+ StandardDestinationPolicy *mStandardPolicy;
+ AskDestinationPolicy *mAskPolicy;
+
+ QMap<ResourceCalendar *, Ticket *> mTickets;
+ QMap<ResourceCalendar *, int> mChangeCounts;
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/calfilter.cpp b/libkcal/calfilter.cpp
new file mode 100644
index 00000000..c1b66f09
--- /dev/null
+++ b/libkcal/calfilter.cpp
@@ -0,0 +1,226 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+ Copyright (C) 2004 Bram Schoenmakers <bramschoenmakers@kde.nl>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "calfilter.h"
+
+using namespace KCal;
+
+CalFilter::CalFilter()
+{
+ mEnabled = true;
+ mCriteria = 0;
+ mCompletedTimeSpan = 0;
+}
+
+CalFilter::CalFilter(const QString &name)
+{
+ mName = name;
+ mEnabled = true;
+ mCriteria = 0;
+ mCompletedTimeSpan = 0;
+}
+
+CalFilter::~CalFilter()
+{
+}
+
+void CalFilter::apply( Event::List *eventlist ) const
+{
+ if ( !mEnabled ) return;
+
+// kdDebug(5800) << "CalFilter::apply()" << endl;
+
+ Event::List::Iterator it = eventlist->begin();
+ while( it != eventlist->end() ) {
+ if ( !filterIncidence( *it ) ) {
+ it = eventlist->remove( it );
+ } else {
+ ++it;
+ }
+ }
+
+// kdDebug(5800) << "CalFilter::apply() done" << endl;
+}
+
+// TODO: avoid duplicating apply() code
+void CalFilter::apply( Todo::List *todolist ) const
+{
+ if ( !mEnabled ) return;
+
+// kdDebug(5800) << "CalFilter::apply()" << endl;
+
+ Todo::List::Iterator it = todolist->begin();
+ while( it != todolist->end() ) {
+ if ( !filterIncidence( *it ) ) {
+ it = todolist->remove( it );
+ } else {
+ ++it;
+ }
+ }
+
+// kdDebug(5800) << "CalFilter::apply() done" << endl;
+}
+
+void CalFilter::apply( Journal::List *journallist ) const
+{
+ if ( !mEnabled ) return;
+
+ Journal::List::Iterator it = journallist->begin();
+ while( it != journallist->end() ) {
+ if ( !filterIncidence( *it ) ) {
+ it = journallist->remove( it );
+ } else {
+ ++it;
+ }
+ }
+}
+
+bool CalFilter::filterIncidence(Incidence *incidence) const
+{
+// kdDebug(5800) << "CalFilter::filterIncidence(): " << incidence->summary() << endl;
+
+ if ( !mEnabled ) return true;
+
+ Todo *todo = dynamic_cast<Todo *>(incidence);
+ if( todo ) {
+ if ( (mCriteria & HideCompleted) && todo->isCompleted() ) {
+ // Check if completion date is suffently long ago:
+ if ( todo->completed().addDays( mCompletedTimeSpan ) <
+ QDateTime::currentDateTime() ) {
+ return false;
+ }
+ }
+
+ if( ( mCriteria & HideInactiveTodos ) &&
+ ( todo->hasStartDate() &&
+ QDateTime::currentDateTime() < todo->dtStart() ||
+ todo->isCompleted() ) )
+ return false;
+
+ if ( mCriteria & HideTodosWithoutAttendeeInEmailList ) {
+ bool iAmOneOfTheAttendees = false;
+ const Attendee::List &attendees = todo->attendees();
+ if ( !todo->attendees().isEmpty() ) {
+ Attendee::List::ConstIterator it;
+ for( it = attendees.begin(); it != attendees.end(); ++it ) {
+ if ( mEmailList.find( (*it)->email() ) != mEmailList.end() ) {
+ iAmOneOfTheAttendees = true;
+ break;
+ }
+ }
+ } else {
+ // no attendees, must be me only
+ iAmOneOfTheAttendees = true;
+ }
+ if ( !iAmOneOfTheAttendees )
+ return false;
+ }
+ }
+
+
+ if (mCriteria & HideRecurring) {
+ if (incidence->doesRecur()) return false;
+ }
+
+ if (mCriteria & ShowCategories) {
+ for (QStringList::ConstIterator it = mCategoryList.constBegin();
+ it != mCategoryList.constEnd(); ++it ) {
+ QStringList incidenceCategories = incidence->categories();
+ for (QStringList::ConstIterator it2 = incidenceCategories.constBegin();
+ it2 != incidenceCategories.constEnd(); ++it2 ) {
+ if ((*it) == (*it2)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ } else {
+ for (QStringList::ConstIterator it = mCategoryList.constBegin();
+ it != mCategoryList.constEnd(); ++it ) {
+ QStringList incidenceCategories = incidence->categories();
+ for (QStringList::ConstIterator it2 = incidenceCategories.constBegin();
+ it2 != incidenceCategories.constEnd(); ++it2 ) {
+ if ((*it) == (*it2)) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+// kdDebug(5800) << "CalFilter::filterIncidence(): passed" << endl;
+
+ return true;
+}
+
+void CalFilter::setEnabled(bool enabled)
+{
+ mEnabled = enabled;
+}
+
+bool CalFilter::isEnabled() const
+{
+ return mEnabled;
+}
+
+void CalFilter::setCriteria(int criteria)
+{
+ mCriteria = criteria;
+}
+
+int CalFilter::criteria() const
+{
+ return mCriteria;
+}
+
+void CalFilter::setCategoryList(const QStringList &categoryList)
+{
+ mCategoryList = categoryList;
+}
+
+QStringList CalFilter::categoryList() const
+{
+ return mCategoryList;
+}
+
+void CalFilter::setEmailList(const QStringList &emailList)
+{
+ mEmailList = emailList;
+}
+
+QStringList CalFilter::emailList() const
+{
+ return mEmailList;
+}
+
+void CalFilter::setCompletedTimeSpan( int timespan )
+{
+ mCompletedTimeSpan = timespan;
+}
+
+int CalFilter::completedTimeSpan() const
+{
+ return mCompletedTimeSpan;
+}
diff --git a/libkcal/calfilter.h b/libkcal/calfilter.h
new file mode 100644
index 00000000..fb34454e
--- /dev/null
+++ b/libkcal/calfilter.h
@@ -0,0 +1,158 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001,2003,2004 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_CALFILTER_H
+#define KCAL_CALFILTER_H
+
+#include <qstring.h>
+#include <qptrlist.h>
+
+#include "event.h"
+#include "todo.h"
+#include "journal.h"
+#include "libkcal_export.h"
+
+namespace KCal {
+
+/**
+ Filter for calendar objects.
+*/
+class LIBKCAL_EXPORT CalFilter
+{
+ public:
+ /** Construct filter. */
+ CalFilter();
+ /** Construct filter with name */
+ CalFilter( const QString &name );
+ /** Destruct filter. */
+ ~CalFilter();
+
+ /**
+ Set name of filter.
+ */
+ void setName( const QString &name ) { mName = name; }
+ /**
+ Return name of filter.
+ */
+ QString name() const { return mName; }
+
+ /**
+ Apply filter to eventlist, all events not matching filter criterias are
+ removed from the list.
+ */
+ void apply( Event::List *eventlist ) const;
+
+ /**
+ Apply filter to todolist, all todos not matching filter criterias are
+ removed from the list.
+ */
+ void apply( Todo::List *todolist ) const;
+
+ /**
+ Apply filter to todolist, all todos not matching filter criterias are
+ removed from the list.
+ */
+ void apply( Journal::List *journallist) const;
+
+ /**
+ Apply filter criteria on the specified incidence. Return true, if event passes
+ criteria, otherwise return false.
+ */
+ bool filterIncidence( Incidence * ) const;
+
+ /**
+ Enable or disable filter.
+ */
+ void setEnabled( bool );
+ /**
+ Return wheter the filter is enabled or not.
+ */
+ bool isEnabled() const;
+
+
+ /**
+ Set list of categories, which is used for showing/hiding categories of
+ events.
+ See related functions.
+ */
+ void setCategoryList( const QStringList & );
+ /**
+ Return category list, used for showing/hiding categories of events.
+ See related functions.
+ */
+ QStringList categoryList() const;
+
+ /**
+ Set list of email addresses which are to be considered when finding
+ incidences which the current user is not a participant of. This is
+ normally the list used by KOPrefs::thatIsMe() as well.
+ */
+ void setEmailList( const QStringList & );
+ /**
+ Return list of email addresses which are to be considered when finding
+ incidences which the current user is not a participant of. This is
+ normally the list used by KOPrefs::thatIsMe() as well.
+ See related functions.
+ */
+ QStringList emailList() const;
+
+ enum { HideRecurring = 1, HideCompleted = 2, ShowCategories = 4,
+ HideInactiveTodos = 8, HideTodosWithoutAttendeeInEmailList = 16 };
+
+ /**
+ Set criteria, which have to be fulfilled by events passing the filter.
+ */
+ void setCriteria( int );
+ /**
+ Get inclusive filter criteria.
+ */
+ int criteria() const;
+
+ /**
+ Set the number of days for "Hide completed todos", after which todos are
+ not shown any more. If nothing is set explicitly, all finished todos will
+ be hidden if the "hide completed todos" option is selected.
+ */
+ void setCompletedTimeSpan( int timespan );
+ /**
+ Return the number of days for "Hide completed todos", after which todos are
+ not shown any more.
+ */
+ int completedTimeSpan() const;
+
+ private:
+ QString mName;
+
+ int mCriteria;
+
+ bool mEnabled;
+
+ QStringList mCategoryList;
+ QStringList mEmailList;
+ int mCompletedTimeSpan;
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/calformat.cpp b/libkcal/calformat.cpp
new file mode 100644
index 00000000..642eefeb
--- /dev/null
+++ b/libkcal/calformat.cpp
@@ -0,0 +1,78 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <klocale.h>
+#include <kdebug.h>
+#include <kapplication.h>
+
+#include "calformat.h"
+
+using namespace KCal;
+
+QString CalFormat::mApplication = QString::fromLatin1("libkcal");
+QString CalFormat::mProductId = QString::fromLatin1("-//K Desktop Environment//NONSGML libkcal 3.5//EN");
+
+
+CalFormat::CalFormat()
+{
+ mException = 0;
+}
+
+CalFormat::~CalFormat()
+{
+ delete mException;
+}
+
+void CalFormat::clearException()
+{
+ delete mException;
+ mException = 0;
+}
+
+void CalFormat::setException(ErrorFormat *exception)
+{
+ delete mException;
+ mException = exception;
+}
+
+ErrorFormat *CalFormat::exception()
+{
+ return mException;
+}
+
+void CalFormat::setApplication(const QString& application, const QString& productID)
+{
+ mApplication = application;
+ mProductId = productID;
+}
+
+QString CalFormat::createUniqueId()
+{
+ int hashTime = QTime::currentTime().hour() +
+ QTime::currentTime().minute() + QTime::currentTime().second() +
+ QTime::currentTime().msec();
+ QString uidStr = QString("%1-%2.%3")
+ .arg(mApplication)
+ .arg(KApplication::random())
+ .arg(hashTime);
+ return uidStr;
+}
+
diff --git a/libkcal/calformat.h b/libkcal/calformat.h
new file mode 100644
index 00000000..80c36a1f
--- /dev/null
+++ b/libkcal/calformat.h
@@ -0,0 +1,115 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001-2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_CALFORMAT_H
+#define KCAL_CALFORMAT_H
+
+#include <qstring.h>
+#include <qdatetime.h>
+#include <qevent.h>
+
+#include "exceptions.h"
+#include "event.h"
+#include "libkcal_export.h"
+
+namespace KCal {
+
+class VCalDrag;
+class Calendar;
+
+/**
+ This is the base class for calendar formats. It provides an interface for the
+ generation/interpretation of a textual representation of a calendar.
+
+ @short Class providing in interface to a calendar format
+*/
+class LIBKCAL_EXPORT CalFormat
+{
+ public:
+ /** Constructs a new format. */
+ CalFormat();
+ /** Destruct calendar format. */
+ virtual ~CalFormat();
+
+ /**
+ loads a calendar on disk into the calendar associated with this format.
+ Returns TRUE if successful,else returns FALSE.
+ @param fileName the name of the calendar on disk.
+ */
+ virtual bool load(Calendar *, const QString &fileName) = 0;
+ /** writes out the calendar to disk. Returns true if
+ * successful and false on error.
+ * @param fileName the name of the file
+ */
+ virtual bool save(Calendar *, const QString &fileName) = 0;
+
+ /**
+ Parse string and populate calendar with that information.
+ */
+ virtual bool fromString(Calendar *, const QString & ) = 0;
+ /**
+ Return calendar information as string.
+ */
+ virtual QString toString(Calendar *) = 0;
+
+ /** Clear exception status of this format object */
+ void clearException();
+ /**
+ Return exception, if there is any, containing information about the last
+ error that occurred.
+ */
+ ErrorFormat *exception();
+
+ /** Set the application name for use in unique IDs and error messages,
+ * and product ID for incidence PRODID property
+ */
+ static void setApplication(const QString& app, const QString& productID);
+ /** Return the application name used in unique IDs and error messages */
+ static const QString& application() { return mApplication; }
+ /** Return the PRODID string to write into calendar files */
+ static const QString& productId() { return mProductId; }
+ /** Return the PRODID string loaded from calendar file */
+ const QString &loadedProductId() { return mLoadedProductId; }
+
+ /** Create a unique id string. */
+ static QString createUniqueId();
+
+ /**
+ Set exception for this object. This is used by the functions of this
+ class to report errors.
+ */
+ void setException(ErrorFormat *error);
+
+ protected:
+ QString mLoadedProductId; // PRODID string loaded from calendar file
+
+ private:
+ ErrorFormat *mException;
+
+ static QString mApplication; // name of application for unique ID strings
+ static QString mProductId; // PRODID string to write to calendar files
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/calstorage.h b/libkcal/calstorage.h
new file mode 100644
index 00000000..06c9cbd5
--- /dev/null
+++ b/libkcal/calstorage.h
@@ -0,0 +1,58 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2002,2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_CALSTORAGE_H
+#define KCAL_CALSTORAGE_H
+
+#include "libkcal_export.h"
+
+namespace KCal {
+
+class Calendar;
+
+/**
+ This class provides the interface to the storage of a calendar.
+*/
+class LIBKCAL_EXPORT CalStorage
+{
+ public:
+ CalStorage( Calendar *calendar )
+ {
+ mCalendar = calendar;
+ }
+ virtual ~CalStorage() {}
+
+ Calendar *calendar() const { return mCalendar; }
+
+ virtual bool open() = 0;
+ virtual bool load() = 0;
+ virtual bool save() = 0;
+ virtual bool close() = 0;
+
+ private:
+ Calendar *mCalendar;
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/compat.cpp b/libkcal/compat.cpp
new file mode 100644
index 00000000..a0de0d35
--- /dev/null
+++ b/libkcal/compat.cpp
@@ -0,0 +1,250 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2002 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "compat.h"
+
+#include <kdebug.h>
+
+#include <qregexp.h>
+
+#include "incidence.h"
+
+using namespace KCal;
+
+Compat *CompatFactory::createCompat( const QString &productId )
+{
+// kdDebug(5800) << "CompatFactory::createCompat(): '" << productId << "'"
+// << endl;
+
+ Compat *compat = 0;
+
+ int korg = productId.find( "KOrganizer" );
+ int outl9 = productId.find( "Outlook 9.0" );
+// int kcal = productId.find( "LibKCal" );
+
+ // TODO: Use the version of LibKCal to determine the compat class...
+ if ( korg >= 0 ) {
+ int versionStart = productId.find( " ", korg );
+ if ( versionStart >= 0 ) {
+ int versionStop = productId.find( QRegExp( "[ /]" ), versionStart + 1 );
+ if ( versionStop >= 0 ) {
+ QString version = productId.mid( versionStart + 1,
+ versionStop - versionStart - 1 );
+// kdDebug(5800) << "Found KOrganizer version: " << version << endl;
+
+ int versionNum = version.section( ".", 0, 0 ).toInt() * 10000 +
+ version.section( ".", 1, 1 ).toInt() * 100 +
+ version.section( ".", 2, 2 ).toInt();
+ int releaseStop = productId.find( "/", versionStop );
+ QString release;
+ if ( releaseStop > versionStop ) {
+ release = productId.mid( versionStop+1, releaseStop-versionStop-1 );
+ }
+// kdDebug(5800) << "KOrganizer release: \"" << release << "\"" << endl;
+
+// kdDebug(5800) << "Numerical version: " << versionNum << endl;
+
+ if ( versionNum < 30100 ) {
+ compat = new CompatPre31;
+ } else if ( versionNum < 30200 ) {
+ compat = new CompatPre32;
+ } else if ( versionNum == 30200 && release == "pre" ) {
+ kdDebug(5800) << "Generating compat for KOrganizer 3.2 pre " << endl;
+ compat = new Compat32PrereleaseVersions;
+ } else if ( versionNum < 30400 ) {
+ compat = new CompatPre34;
+ } else if ( versionNum < 30500 ) {
+ compat = new CompatPre35;
+ }
+ }
+ }
+ } else if ( outl9 >= 0 ) {
+ kdDebug(5800) << "Generating compat for Outlook < 2000 (Outlook 9.0)" << endl;
+ compat = new CompatOutlook9;
+ }
+
+ if ( !compat ) compat = new Compat;
+
+ return compat;
+}
+
+void Compat::fixEmptySummary( Incidence *incidence )
+{
+ // some stupid vCal exporters ignore the standard and use Description
+ // instead of Summary for the default field. Correct for this: Copy the
+ // first line of the description to the summary (if summary is just one
+ // line, move it)
+ if (incidence->summary().isEmpty() &&
+ !(incidence->description().isEmpty())) {
+ QString oldDescription = incidence->description().stripWhiteSpace();
+ QString newSummary( oldDescription );
+ newSummary.remove( QRegExp("\n.*") );
+ incidence->setSummary( newSummary );
+ if ( oldDescription == newSummary )
+ incidence->setDescription("");
+ }
+}
+
+void Compat::fixRecurrence( Incidence */*incidence*/ )
+{
+ // Prevent use of compatibility mode during subsequent changes by the application
+// incidence->recurrence()->setCompatVersion();
+}
+
+/** Before kde 3.5, the start date was not automatically a recurring date. So
+ if the start date doesn't match the recurrence rule, we need to add an ex
+ date for the date start. If a duration was given, the DTSTART was only counted
+ if it matched, so by accident this was already the correct behavior, so
+ we don't need to adjust the duration... */
+void CompatPre35::fixRecurrence( Incidence *incidence )
+{
+ Recurrence* recurrence = incidence->recurrence();
+ if (recurrence ) {
+ QDateTime start( incidence->dtStart() );
+ // kde < 3.5 only had one rrule, so no need to loop over all RRULEs.
+ RecurrenceRule *r = recurrence->defaultRRule();
+ if ( r && !r->dateMatchesRules( start ) ) {
+ recurrence->addExDateTime( start );
+ }
+ }
+
+ // Call base class method now that everything else is done
+ Compat::fixRecurrence( incidence );
+}
+
+int CompatPre34::fixPriority( int prio )
+{
+ if ( 0<prio && prio<6 ) {
+ // adjust 1->1, 2->3, 3->5, 4->7, 5->9
+ return 2*prio - 1;
+ } else return prio;
+}
+
+/** The recurrence has a specified number of repetitions.
+ Pre-3.2, this was extended by the number of exception dates.
+ This is also rfc 2445-compliant. The duration of an RRULE also counts
+ events that are later excluded via EXDATE or EXRULE. */
+void CompatPre32::fixRecurrence( Incidence *incidence )
+{
+ Recurrence* recurrence = incidence->recurrence();
+ if ( recurrence->doesRecur() && recurrence->duration() > 0 ) {
+ recurrence->setDuration( recurrence->duration() + incidence->recurrence()->exDates().count() );
+ }
+ // Call base class method now that everything else is done
+ CompatPre35::fixRecurrence( incidence );
+}
+
+/** Before kde 3.1, floating events (events without a date) had 0:00 of their
+ last day as the end date. E.g. 28.5.2005 0:00 until 28.5.2005 0:00 for an
+ event that lasted the whole day on May 28, 2005. According to RFC 2445, the
+ end date for such an event needs to be 29.5.2005 0:00.
+
+ Update: We misunderstood rfc 2445 in this regard. For all-day events, the
+ DTEND is the last day of the event. See a mail from the Author or rfc 2445:
+ http://www.imc.org/ietf-calendar/archive1/msg03648.html
+ However, as all other applications also got this wrong, we'll just leave it
+ as it is and use the wrong interpretation (was also discussed on
+ ietf-calsify)*/
+void CompatPre31::fixFloatingEnd( QDate &endDate )
+{
+ endDate = endDate.addDays( 1 );
+}
+
+void CompatPre31::fixRecurrence( Incidence *incidence )
+{
+ CompatPre32::fixRecurrence( incidence );
+
+ Recurrence *recur = incidence->recurrence();
+ RecurrenceRule *r = 0;
+ if ( recur ) r = recur->defaultRRule();
+ if ( recur && r ) {
+ int duration = r->duration();
+ if ( duration > 0 ) {
+ // Backwards compatibility for KDE < 3.1.
+ // rDuration was set to the number of time periods to recur,
+ // with week start always on a Monday.
+ // Convert this to the number of occurrences.
+ r->setDuration( -1 );
+ QDate end( r->startDt().date() );
+ bool doNothing = false;
+ // # of periods:
+ int tmp = ( duration - 1 ) * r->frequency();
+ switch ( r->recurrenceType() ) {
+ case RecurrenceRule::rWeekly: {
+ end = end.addDays( tmp * 7 + 7 - end.dayOfWeek() );
+ break; }
+ case RecurrenceRule::rMonthly: {
+ int month = end.month() - 1 + tmp;
+ end.setYMD( end.year() + month / 12, month % 12 + 1, 31 );
+ break; }
+ case RecurrenceRule::rYearly: {
+ end.setYMD( end.year() + tmp, 12, 31);
+ break; }
+ default:
+ doNothing = true;
+ break;
+ }
+ if ( !doNothing ) {
+ duration = r->durationTo( QDateTime( end, QTime( 0, 0, 0 ) ) );
+ r->setDuration( duration );
+ }
+ }
+
+ /* addYearlyNum */
+ // Dates were stored as day numbers, with a fiddle to take account of leap years.
+ // Convert the day number to a month.
+ QValueList<int> days = r->byYearDays();
+ if ( !days.isEmpty() ) {
+ QValueList<int> months = r->byMonths();
+ for ( QValueListConstIterator<int> it = days.begin(); it != days.end(); ++it ) {
+ int newmonth = QDate( r->startDt().date().year(), 1, 1).addDays( (*it) - 1 ).month();
+ if ( !months.contains( newmonth ) )
+ months.append( newmonth );
+ }
+ r->setByMonths( months );
+ days.clear();
+ r->setByYearDays( days );
+ }
+ }
+
+
+}
+
+/** In Outlook 9, alarms have the wrong sign. I.e. RFC 2445 says that negative
+ values for the trigger are before the event's start. Outlook/exchange,
+ however used positive values. */
+void CompatOutlook9::fixAlarms( Incidence *incidence )
+{
+ if ( !incidence ) return;
+ Alarm::List alarms = incidence->alarms();
+ Alarm::List::Iterator it;
+ for ( it = alarms.begin(); it != alarms.end(); ++it ) {
+ Alarm *al = *it;
+ if ( al && al->hasStartOffset() ) {
+ Duration offsetDuration = al->startOffset();
+ int offs = offsetDuration.asSeconds();
+ if ( offs>0 )
+ offsetDuration = Duration( -offs );
+ al->setStartOffset( offsetDuration );
+ }
+ }
+}
diff --git a/libkcal/compat.h b/libkcal/compat.h
new file mode 100644
index 00000000..dd2d9907
--- /dev/null
+++ b/libkcal/compat.h
@@ -0,0 +1,124 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2002 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_COMPAT_H
+#define KCAL_COMPAT_H
+
+#include <qstring.h>
+#include <qdatetime.h>
+
+namespace KCal {
+
+class Incidence;
+class Compat;
+
+/**
+ Factory for creating the right Compat object.
+*/
+class CompatFactory
+{
+ public:
+ static Compat *createCompat( const QString &productId );
+};
+
+/**
+ This class provides compatibility to older (broken) versions of KOrganizer.
+*/
+class Compat
+{
+ public:
+ Compat() {};
+ virtual ~Compat() {};
+
+ virtual void fixRecurrence( Incidence * );
+ virtual void fixEmptySummary( Incidence * );
+ virtual void fixAlarms( Incidence * ) {}
+ virtual void fixFloatingEnd( QDate & ) {}
+ virtual bool useTimeZoneShift() { return true; }
+ virtual int fixPriority( int prio ) { return prio; }
+
+ private:
+ class Private;
+ Private *d;
+};
+
+class CompatPre35 : public Compat
+{
+ public:
+ virtual void fixRecurrence( Incidence * );
+ private:
+ class Private;
+ Private *d;
+};
+
+class CompatPre34 : public CompatPre35
+{
+ public:
+ virtual int fixPriority( int prio );
+ private:
+ class Private;
+ Private *d;
+};
+
+class CompatPre32 : public CompatPre34
+{
+ public:
+ virtual void fixRecurrence( Incidence * );
+
+ private:
+ class Private;
+ Private *d;
+};
+
+class CompatPre31 : public CompatPre32
+{
+ public:
+ virtual void fixFloatingEnd( QDate & );
+ virtual void fixRecurrence( Incidence *incidence );
+
+ private:
+ class Private;
+ Private *d;
+};
+
+class Compat32PrereleaseVersions : public Compat
+{
+ public:
+ virtual bool useTimeZoneShift() { return false; }
+
+ private:
+ class Private;
+ Private *d;
+};
+
+class CompatOutlook9 : public Compat
+{
+ public:
+ virtual void fixAlarms( Incidence * );
+
+ private:
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/confirmsavedialog.cpp b/libkcal/confirmsavedialog.cpp
new file mode 100644
index 00000000..ce2bb0f4
--- /dev/null
+++ b/libkcal/confirmsavedialog.cpp
@@ -0,0 +1,66 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2004 Cornelius Schumacher <schumacher@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include "confirmsavedialog.h"
+
+#include <klistview.h>
+#include <klocale.h>
+
+#include <qlayout.h>
+#include <qframe.h>
+#include <qlabel.h>
+
+using namespace KCal;
+
+ConfirmSaveDialog::ConfirmSaveDialog( const QString &destination,
+ QWidget *parent, const char *name )
+ : KDialogBase( parent, name, true, i18n("Confirm Save"), Ok | Cancel )
+{
+ QFrame *topFrame = makeMainWidget();
+
+ QBoxLayout *topLayout = new QVBoxLayout( topFrame );
+ topLayout->setSpacing( spacingHint() );
+
+ QLabel *label = new QLabel(
+ i18n("You have requested to save the following objects to '%1':")
+ .arg( destination ), topFrame );
+ topLayout->addWidget( label );
+
+ mListView = new KListView( topFrame );
+ mListView->addColumn( i18n("Operation") );
+ mListView->addColumn( i18n("Type") );
+ mListView->addColumn( i18n("Summary") );
+ mListView->addColumn( i18n("UID") );
+ topLayout->addWidget( mListView );
+}
+
+void ConfirmSaveDialog::addIncidences( const Incidence::List &incidences,
+ const QString &operation )
+{
+ Incidence::List::ConstIterator it;
+ for( it = incidences.begin(); it != incidences.end(); ++it ) {
+ Incidence *i = *it;
+ KListViewItem *item = new KListViewItem( mListView );
+ item->setText( 0, operation );
+ item->setText( 1, i->type() );
+ item->setText( 2, i->summary() );
+ item->setText( 3, i->uid() );
+ }
+}
diff --git a/libkcal/confirmsavedialog.h b/libkcal/confirmsavedialog.h
new file mode 100644
index 00000000..7d36ec67
--- /dev/null
+++ b/libkcal/confirmsavedialog.h
@@ -0,0 +1,47 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2004 Cornelius Schumacher <schumacher@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_CONFIRMSAVEDIALOG_H
+#define KCAL_CONFIRMSAVEDIALOG_H
+
+#include <libkcal/incidence.h>
+
+#include <kdialogbase.h>
+#include <kdepimmacros.h>
+
+class KListView;
+
+namespace KCal {
+
+class KDE_EXPORT ConfirmSaveDialog : public KDialogBase
+{
+ public:
+ ConfirmSaveDialog( const QString &destination, QWidget *parent,
+ const char *name = 0 );
+
+ void addIncidences( const Incidence::List &incidences,
+ const QString &operation );
+
+ private:
+ KListView *mListView;
+};
+
+}
+
+#endif
diff --git a/libkcal/convertqtopia.cpp b/libkcal/convertqtopia.cpp
new file mode 100644
index 00000000..dd6824b3
--- /dev/null
+++ b/libkcal/convertqtopia.cpp
@@ -0,0 +1,119 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "calendarlocal.h"
+#include "icalformat.h"
+#include "qtopiaformat.h"
+
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kcmdlineargs.h>
+#include <kglobal.h>
+#include <kconfig.h>
+#include <kstandarddirs.h>
+
+#include <iostream>
+
+using namespace KCal;
+
+static const KCmdLineOptions options[] =
+{
+ {"q", 0, 0 },
+ {"qtopia2icalendar", I18N_NOOP("Convert Qtopia calendar file to iCalendar"), 0 },
+ {"i", 0, 0 },
+ {"icalendar2qtopia", I18N_NOOP("Convert iCalendar to iCalendar"), 0 },
+ {"o", 0, 0},
+ {"output <file>", I18N_NOOP("Output file"), 0 },
+ {"+input", I18N_NOOP("Input file"), 0 },
+ KCmdLineLastOption
+};
+
+int main(int argc,char **argv)
+{
+ KAboutData aboutData("convertqtopia",I18N_NOOP("Qtopia calendar file converter"),"0.1");
+ aboutData.addAuthor("Cornelius Schumacher", 0, "schumacher@kde.org");
+
+ KCmdLineArgs::init(argc,argv,&aboutData);
+ KCmdLineArgs::addCmdLineOptions( options );
+
+ KApplication app;
+
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ bool sourceQtopia = false;
+ bool sourceIcalendar = false;
+
+ if ( args->isSet( "qtopia2icalendar" ) ) {
+ sourceQtopia = true;
+ }
+
+ if ( args->isSet( "icalendar2qtopia" ) ) {
+ sourceIcalendar = true;
+ }
+
+ if ( sourceQtopia && sourceIcalendar ) {
+ KCmdLineArgs::usage(
+ i18n("Please specify only one of the conversion options.") );
+ }
+ if ( !sourceQtopia && !sourceIcalendar ) {
+ KCmdLineArgs::usage(
+ i18n("You have to specify one conversion option.") );
+ }
+
+ if ( args->count() != 1 ) {
+ KCmdLineArgs::usage( i18n("Error: No input file.") );
+ }
+
+ QString inputFile = args->arg( 0 );
+
+ QString outputFile;
+ if ( args->isSet("output") ) outputFile = args->getOption( "output" );
+
+ kdDebug(5800) << "Input File: '" << inputFile << "'" << endl;
+ kdDebug(5800) << "Output File: '" << outputFile << "'" << endl;
+
+ if ( sourceQtopia ) {
+ CalendarLocal cal;
+
+ QtopiaFormat qtopiaFormat;
+ qtopiaFormat.load( &cal, inputFile );
+
+ ICalFormat icalendarFormat;
+ if ( outputFile.isEmpty() ) {
+ QString out = icalendarFormat.toString( &cal );
+ std::cout << out.local8Bit() << std::endl;
+ } else {
+ bool success = icalendarFormat.save( &cal, outputFile );
+ if ( !success ) {
+ std::cerr << i18n( "Error saving to '%1'." ).arg( outputFile ).local8Bit()
+ << std::endl;
+ return 1;
+ }
+ }
+ }
+
+ if ( sourceIcalendar ) {
+ std::cerr << "Not implemented yet." << std::endl;
+ return 1;
+ }
+}
diff --git a/libkcal/customproperties.cpp b/libkcal/customproperties.cpp
new file mode 100644
index 00000000..b64d9fee
--- /dev/null
+++ b/libkcal/customproperties.cpp
@@ -0,0 +1,142 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2002,2006 David Jarvie <software@astrojar.org.uk>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "customproperties.h"
+
+#include <kdebug.h>
+
+using namespace KCal;
+
+CustomProperties::CustomProperties()
+{
+}
+
+CustomProperties::CustomProperties(const CustomProperties &cp)
+ : mProperties(cp.mProperties)
+{
+}
+
+CustomProperties::~CustomProperties()
+{
+}
+
+bool CustomProperties::operator==( const CustomProperties &other ) const
+{
+ if ( mProperties.count() != other.mProperties.count() ) return false;
+ QMap<QCString, QString>::ConstIterator it;
+ for( it = mProperties.begin(); it != mProperties.end(); ++it ) {
+ QMap<QCString, QString>::ConstIterator itOther =
+ other.mProperties.find( it.key() );
+
+ if ( itOther == other.mProperties.end() ) {
+ return false;
+ }
+ if ( itOther.data() != it.data() ) return false;
+ }
+
+ return true;
+}
+
+void CustomProperties::setCustomProperty(const QCString &app, const QCString &key,
+ const QString &value)
+{
+ if (value.isNull() || key.isEmpty() || app.isEmpty())
+ return;
+ QCString property = "X-KDE-" + app + "-" + key;
+ if (!checkName(property))
+ return;
+ mProperties[property] = value;
+ customPropertyUpdated();
+}
+
+void CustomProperties::removeCustomProperty(const QCString &app, const QCString &key)
+{
+ removeNonKDECustomProperty(QCString("X-KDE-" + app + "-" + key));
+}
+
+QString CustomProperties::customProperty(const QCString &app, const QCString &key) const
+{
+ return nonKDECustomProperty(QCString("X-KDE-" + app + "-" + key));
+}
+
+void CustomProperties::setNonKDECustomProperty(const QCString &name, const QString &value)
+{
+ if (value.isNull() || !checkName(name))
+ return;
+ mProperties[name] = value;
+ customPropertyUpdated();
+}
+
+void CustomProperties::removeNonKDECustomProperty(const QCString &name)
+{
+ QMap<QCString, QString>::Iterator it = mProperties.find(name);
+ if (it != mProperties.end()) {
+ mProperties.remove(it);
+ customPropertyUpdated();
+ }
+}
+
+QString CustomProperties::nonKDECustomProperty(const QCString &name) const
+{
+ QMap<QCString, QString>::ConstIterator it = mProperties.find(name);
+ if (it == mProperties.end())
+ return QString::null;
+ return it.data();
+}
+
+void CustomProperties::setCustomProperties(const QMap<QCString, QString> &properties)
+{
+ bool changed = false;
+ for (QMap<QCString, QString>::ConstIterator it = properties.begin(); it != properties.end(); ++it) {
+ // Validate the property name and convert any null string to empty string
+ if (checkName(it.key())) {
+ mProperties[it.key()] = it.data().isNull() ? QString("") : it.data();
+ changed = true;
+ }
+ }
+ if (changed)
+ customPropertyUpdated();
+}
+
+QMap<QCString, QString> CustomProperties::customProperties() const
+{
+ return mProperties;
+}
+
+bool CustomProperties::checkName(const QCString &name)
+{
+ // Check that the property name starts with 'X-' and contains
+ // only the permitted characters
+ const char* n = name;
+ int len = name.length();
+ if (len < 2 || n[0] != 'X' || n[1] != '-')
+ return false;
+ for (int i = 2; i < len; ++i) {
+ char ch = n[i];
+ if (ch >= 'A' && ch <= 'Z'
+ || ch >= 'a' && ch <= 'z'
+ || ch >= '0' && ch <= '9'
+ || ch == '-')
+ continue;
+ return false; // invalid character found
+ }
+ return true;
+}
diff --git a/libkcal/customproperties.h b/libkcal/customproperties.h
new file mode 100644
index 00000000..5cafff2e
--- /dev/null
+++ b/libkcal/customproperties.h
@@ -0,0 +1,133 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2002,2006 David Jarvie <software@astrojar.org.uk>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef KCAL_CUSTOMPROPERTIES_H
+#define KCAL_CUSTOMPROPERTIES_H
+
+#include <qstring.h>
+#include <qmap.h>
+#include <kdepimmacros.h>
+
+#include "libkcal_export.h"
+
+namespace KCal {
+
+/**
+ This class represents custom calendar properties.
+ It is used as a base class for classes which represent calendar components.
+ A custom property name written by libkcal has the form X-KDE-APP-KEY where
+ APP represents the application name, and KEY distinguishes individual
+ properties for the application.
+ In keeping with RFC2445, property names must be composed only of the
+ characters A-Z, a-z, 0-9 and '-'.
+*/
+class LIBKCAL_EXPORT CustomProperties
+{
+ public:
+ /**
+ Construct a new empty custom properties instance.
+ */
+ CustomProperties();
+ CustomProperties( const CustomProperties & );
+ ~CustomProperties();
+
+ bool operator==( const CustomProperties & ) const;
+
+ /**
+ Create or modify a custom calendar property.
+
+ @param app Application name as it appears in the custom property name.
+ @param key Property identifier specific to the application.
+ @param value The property's value. A call with a value of QString::null
+ will be ignored.
+ */
+ void setCustomProperty( const QCString &app, const QCString &key,
+ const QString &value );
+ /**
+ Delete a custom calendar property.
+
+ @param app Application name as it appears in the custom property name.
+ @param key Property identifier specific to the application.
+ */
+ void removeCustomProperty( const QCString &app, const QCString &key );
+ /**
+ Return the value of a custom calendar property.
+
+ @param app Application name as it appears in the custom property name.
+ @param key Property identifier specific to the application.
+ @return Property value, or QString::null if (and only if) the property
+ does not exist.
+ */
+ QString customProperty( const QCString &app, const QCString &key ) const;
+
+ /**
+ Create or modify a non-KDE or non-standard custom calendar property.
+
+ @param name Full property name
+ @param value The property's value. A call with a value of QString::null
+ will be ignored.
+ */
+ void setNonKDECustomProperty( const QCString &name, const QString &value );
+ /**
+ Delete a non-KDE or non-standard custom calendar property.
+
+ @param name Full property name
+ */
+ void removeNonKDECustomProperty( const QCString &name );
+ /**
+ Return the value of a non-KDE or non-standard custom calendar property.
+
+ @param name Full property name
+ @return Property value, or QString::null if (and only if) the property
+ does not exist.
+ */
+ QString nonKDECustomProperty( const QCString& name ) const;
+
+ /**
+ Initialise the alarm's custom calendar properties to the specified
+ key/value pairs.
+ */
+ void setCustomProperties( const QMap<QCString, QString> &properties );
+ /**
+ Return all custom calendar property key/value pairs.
+ */
+ QMap<QCString, QString> customProperties() const;
+
+ protected:
+ /**
+ Called when a custom property has been changed.
+ The default implementation does nothing: override in derived classes
+ to perform change processing.
+ */
+ virtual void customPropertyUpdated() {}
+
+ private:
+ static bool checkName(const QCString& name);
+
+ QMap<QCString, QString> mProperties; // custom calendar properties
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/dndfactory.cpp b/libkcal/dndfactory.cpp
new file mode 100644
index 00000000..273c305b
--- /dev/null
+++ b/libkcal/dndfactory.cpp
@@ -0,0 +1,187 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 1998 Preston Brown <pbrown@kde.org>
+ Copyright (c) 2001,2002 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qapplication.h>
+#include <qclipboard.h>
+
+#include <kiconloader.h>
+#include <kdebug.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+
+#include "vcaldrag.h"
+#include "icaldrag.h"
+#include "calendar.h"
+#include "vcalformat.h"
+#include "icalformat.h"
+#include "calendarlocal.h"
+
+#include "dndfactory.h"
+
+using namespace KCal;
+
+DndFactory::DndFactory( Calendar *cal ) :
+ mCalendar( cal )
+{
+}
+
+ICalDrag *DndFactory::createDrag( Incidence *incidence, QWidget *owner )
+{
+ CalendarLocal cal( mCalendar->timeZoneId() );
+ Incidence *i = incidence->clone();
+ cal.addIncidence( i );
+
+ ICalDrag *icd = new ICalDrag( &cal, owner );
+ if ( i->type() == "Event" )
+ icd->setPixmap( BarIcon( "appointment" ) );
+ else if ( i->type() == "Todo" )
+ icd->setPixmap( BarIcon( "todo" ) );
+
+ return icd;
+}
+
+Event *DndFactory::createDrop(QDropEvent *de)
+{
+ kdDebug(5800) << "DndFactory::createDrop()" << endl;
+
+ CalendarLocal cal( mCalendar->timeZoneId() );
+
+ if ( ICalDrag::decode( de, &cal ) || VCalDrag::decode( de, &cal ) ) {
+ de->accept();
+
+ Event::List events = cal.events();
+ if ( !events.isEmpty() ) {
+ Event *event = new Event( *events.first() );
+ return event;
+ }
+ }
+
+ return 0;
+}
+
+Todo *DndFactory::createDropTodo(QDropEvent *de)
+{
+ kdDebug(5800) << "VCalFormat::createDropTodo()" << endl;
+
+ CalendarLocal cal( mCalendar->timeZoneId() );
+
+ if ( ICalDrag::decode( de, &cal ) || VCalDrag::decode( de, &cal ) ) {
+ de->accept();
+
+ Todo::List todos = cal.todos();
+ if ( !todos.isEmpty() ) {
+ Todo *todo = new Todo( *todos.first() );
+ return todo;
+ }
+ }
+
+ return 0;
+}
+
+
+void DndFactory::cutIncidence( Incidence *selectedInc )
+{
+ if ( copyIncidence( selectedInc ) ) {
+ mCalendar->deleteIncidence( selectedInc );
+ }
+}
+
+bool DndFactory::copyIncidence( Incidence *selectedInc )
+{
+ if ( !selectedInc )
+ return false;
+ QClipboard *cb = QApplication::clipboard();
+
+ CalendarLocal cal( mCalendar->timeZoneId() );
+ Incidence *inc = selectedInc->clone();
+ cal.addIncidence( inc );
+ cb->setData( new ICalDrag( &cal ) );
+
+ return true;
+}
+
+Incidence *DndFactory::pasteIncidence(const QDate &newDate, const QTime *newTime)
+{
+// kdDebug(5800) << "DnDFactory::pasteEvent()" << endl;
+
+ CalendarLocal cal( mCalendar->timeZoneId() );
+
+ QClipboard *cb = QApplication::clipboard();
+
+ if ( !ICalDrag::decode( cb->data(), &cal ) &&
+ !VCalDrag::decode( cb->data(), &cal ) ) {
+ kdDebug(5800) << "Can't parse clipboard" << endl;
+ return 0;
+ }
+
+ Incidence::List incList = cal.incidences();
+ Incidence *inc = incList.first();
+
+ if ( !incList.isEmpty() && inc ) {
+ inc = inc->clone();
+
+ inc->recreate();
+
+ if ( inc->type() == "Event" ) {
+
+ Event *anEvent = static_cast<Event*>( inc );
+ // Calculate length of event
+ int daysOffset = anEvent->dtStart().date().daysTo(
+ anEvent->dtEnd().date() );
+ // new end date if event starts at the same time on the new day
+ QDateTime endDate( newDate.addDays(daysOffset), anEvent->dtEnd().time() );
+
+ if ( newTime ) {
+ // additional offset for new time of day
+ int addSecsOffset( anEvent->dtStart().time().secsTo( *newTime ));
+ endDate=endDate.addSecs( addSecsOffset );
+ anEvent->setDtStart( QDateTime( newDate, *newTime ) );
+ } else {
+ anEvent->setDtStart( QDateTime( newDate, anEvent->dtStart().time() ) );
+ }
+ anEvent->setDtEnd( endDate );
+
+ } else if ( inc->type() == "Todo" ) {
+ Todo *anTodo = static_cast<Todo*>( inc );
+ if ( newTime ) {
+ anTodo->setDtDue( QDateTime( newDate, *newTime ) );
+ } else {
+ anTodo->setDtDue( QDateTime( newDate, anTodo->dtDue().time() ) );
+ }
+ } else if ( inc->type() == "Journal" ) {
+ Journal *anJournal = static_cast<Journal*>( inc );
+ if ( newTime ) {
+ anJournal->setDtStart( QDateTime( newDate, *newTime ) );
+ } else {
+ anJournal->setDtStart( QDateTime( newDate ) );
+ }
+ } else {
+ kdDebug(5850) << "Trying to paste unknown incidence of type " << inc->type() << endl;
+ }
+
+ return inc;
+
+ }
+
+ return 0;
+}
diff --git a/libkcal/dndfactory.h b/libkcal/dndfactory.h
new file mode 100644
index 00000000..c9e744ef
--- /dev/null
+++ b/libkcal/dndfactory.h
@@ -0,0 +1,73 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 1998 Preston Brown <pbrown@kde.org>
+ Copyright (c) 2001,2002,2003 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef KCAL_DNDFACTORY_H
+#define KCAL_DNDFACTORY_H
+
+#include "libkcal_export.h"
+
+namespace KCal {
+
+class ICalDrag;
+class Event;
+class Todo;
+class Calendar;
+
+/**
+ This class implements functions to create Drag and Drop objects used for
+ Drag-and-Drop and Copy-and-Paste.
+
+ @short vCalendar/iCalendar Drag-and-Drop object factory.
+*/
+class LIBKCAL_EXPORT DndFactory
+{
+ public:
+ DndFactory( Calendar * );
+
+ /**
+ Create a drag object.
+ */
+ ICalDrag *createDrag( Incidence *incidence, QWidget *owner );
+
+ /** Create Todo object from drop event */
+ Todo *createDropTodo(QDropEvent *de);
+ /** Create Event object from drop event */
+ Event *createDrop(QDropEvent *de);
+
+ /** cut incidence to clipboard */
+ void cutIncidence( Incidence * );
+ /** copy the incidence to clipboard */
+ bool copyIncidence( Incidence * );
+ /** pastes the event or todo and returns a pointer to the new incidence pasted. */
+ Incidence *pasteIncidence( const QDate &, const QTime *newTime = 0 );
+
+ private:
+ Calendar *mCalendar;
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/dummyscheduler.cpp b/libkcal/dummyscheduler.cpp
new file mode 100644
index 00000000..eeeb73d7
--- /dev/null
+++ b/libkcal/dummyscheduler.cpp
@@ -0,0 +1,127 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+//
+// DummyScheduler - iMIP implementation of iTIP methods
+//
+
+#include <qfile.h>
+#include <qtextstream.h>
+
+#include <kdebug.h>
+#include <kstandarddirs.h>
+
+#include "event.h"
+#include "icalformat.h"
+
+#include "dummyscheduler.h"
+
+using namespace KCal;
+
+DummyScheduler::DummyScheduler(Calendar *calendar)
+ : Scheduler(calendar)
+{
+}
+
+DummyScheduler::~DummyScheduler()
+{
+}
+
+bool DummyScheduler::publish (IncidenceBase *incidence,const QString &/*recipients*/)
+{
+ QString messageText = mFormat->createScheduleMessage(incidence,
+ Scheduler::Publish);
+
+ return saveMessage(messageText);
+}
+
+bool DummyScheduler::performTransaction(IncidenceBase *incidence,Method method,const QString &/*recipients*/)
+{
+ QString messageText = mFormat->createScheduleMessage(incidence,method);
+
+ return saveMessage(messageText);
+}
+
+bool DummyScheduler::performTransaction(IncidenceBase *incidence,Method method)
+{
+ QString messageText = mFormat->createScheduleMessage(incidence,method);
+
+ return saveMessage(messageText);
+}
+
+bool DummyScheduler::saveMessage(const QString &message)
+{
+ QFile f("dummyscheduler.store");
+ if (f.open(IO_WriteOnly | IO_Append)) {
+ QTextStream t(&f);
+ t << message << endl;
+ f.close();
+ return true;
+ } else {
+ return false;
+ }
+}
+
+QPtrList<ScheduleMessage> DummyScheduler::retrieveTransactions()
+{
+ QPtrList<ScheduleMessage> messageList;
+
+ QFile f("dummyscheduler.store");
+ if (!f.open(IO_ReadOnly)) {
+ kdDebug(5800) << "DummyScheduler::retrieveTransactions(): Can't open file"
+ << endl;
+ } else {
+ QTextStream t(&f);
+ QString messageString;
+ QString messageLine = t.readLine();
+ while (!messageLine.isNull()) {
+// kdDebug(5800) << "++++++++" << messageLine << endl;
+ messageString += messageLine + "\n";
+ if (messageLine.find("END:VCALENDAR") >= 0) {
+ kdDebug(5800) << "---------------" << messageString << endl;
+ ScheduleMessage *message = mFormat->parseScheduleMessage(mCalendar,
+ messageString);
+ kdDebug(5800) << "--Parsed" << endl;
+ if (message) {
+ messageList.append(message);
+ } else {
+ QString errorMessage;
+ if (mFormat->exception()) {
+ errorMessage = mFormat->exception()->message();
+ }
+ kdDebug(5800) << "DummyScheduler::retrieveTransactions() Error parsing "
+ "message: " << errorMessage << endl;
+ }
+ messageString="";
+ }
+ messageLine = t.readLine();
+ }
+ f.close();
+ }
+
+ return messageList;
+}
+
+QString DummyScheduler::freeBusyDir()
+{
+ // the dummy scheduler should never handle freebusy stuff - so it's hardcoded
+ return QString("");
+}
diff --git a/libkcal/dummyscheduler.h b/libkcal/dummyscheduler.h
new file mode 100644
index 00000000..93ca7e65
--- /dev/null
+++ b/libkcal/dummyscheduler.h
@@ -0,0 +1,58 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001-2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef DUMMYSCHEDULER_H
+#define DUMMYSCHEDULER_H
+
+#include "scheduler.h"
+
+namespace KCal {
+
+/**
+ \internal
+
+ This class implements the iTIP interface as a primitive local version for
+ testing. It uses a file dummyscheduler.store as inbox/outbox.
+*/
+class DummyScheduler : public Scheduler
+{
+ public:
+ DummyScheduler(Calendar *);
+ virtual ~DummyScheduler();
+
+ bool publish (IncidenceBase *incidence,const QString &recipients);
+ bool performTransaction(IncidenceBase *incidence,Method method);
+ bool performTransaction(IncidenceBase *incidence,Method method,const QString &recipients);
+ QPtrList<ScheduleMessage> retrieveTransactions();
+
+ virtual QString freeBusyDir();
+
+ protected:
+ bool saveMessage(const QString &);
+
+ private:
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
+
diff --git a/libkcal/duration.cpp b/libkcal/duration.cpp
new file mode 100644
index 00000000..01ee7562
--- /dev/null
+++ b/libkcal/duration.cpp
@@ -0,0 +1,60 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+#include <klocale.h>
+
+#include "duration.h"
+
+using namespace KCal;
+
+Duration::Duration()
+{
+ mSeconds = 0;
+}
+
+Duration::Duration( const QDateTime &start, const QDateTime &end )
+{
+ mSeconds = start.secsTo( end );
+}
+
+Duration::Duration( int seconds )
+{
+ mSeconds = seconds;
+}
+
+
+bool KCal::operator==( const Duration& d1, const Duration& d2 )
+{
+ return ( d1.asSeconds() == d2.asSeconds() );
+}
+
+
+
+QDateTime Duration::end( const QDateTime &start ) const
+{
+ return start.addSecs( mSeconds );
+}
+
+int Duration::asSeconds() const
+{
+ return mSeconds;
+}
diff --git a/libkcal/duration.h b/libkcal/duration.h
new file mode 100644
index 00000000..69c93978
--- /dev/null
+++ b/libkcal/duration.h
@@ -0,0 +1,59 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001-2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_DURATION_H
+#define KCAL_DURATION_H
+
+#include <qdatetime.h>
+
+#include "libkcal_export.h"
+
+namespace KCal {
+
+/**
+ This class represents a duration.
+*/
+class LIBKCAL_EXPORT Duration
+{
+ public:
+ Duration();
+ Duration( const QDateTime &start, const QDateTime &end );
+ Duration( int seconds );
+
+ QDateTime end( const QDateTime &start ) const;
+
+ int asSeconds() const;
+
+ private:
+ int mSeconds;
+
+ class Private;
+ Private *d;
+};
+
+bool operator==( const Duration&, const Duration& );
+inline bool operator!=( const Duration &d1, const Duration &d2 )
+{
+ return !operator==( d1, d2 );
+}
+
+}
+
+#endif
diff --git a/libkcal/event.cpp b/libkcal/event.cpp
new file mode 100644
index 00000000..077a4331
--- /dev/null
+++ b/libkcal/event.cpp
@@ -0,0 +1,154 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kglobal.h>
+#include <klocale.h>
+#include <kdebug.h>
+
+#include "event.h"
+
+using namespace KCal;
+
+Event::Event() :
+ mHasEndDate( false ), mTransparency( Opaque )
+{
+}
+
+Event::Event(const Event &e) : Incidence(e)
+{
+ mDtEnd = e.mDtEnd;
+ mHasEndDate = e.mHasEndDate;
+ mTransparency = e.mTransparency;
+}
+
+Event::~Event()
+{
+// kdDebug(5800) << "~Event() " << int( this ) << endl;
+}
+
+Event *Event::clone()
+{
+// kdDebug(5800) << "Event::clone()" << endl;
+ return new Event(*this);
+}
+
+Event& Event::operator=( const Event &e )
+{
+ Incidence::operator=( e );
+ mDtEnd = e.mDtEnd;
+ mHasEndDate = e.mHasEndDate;
+ mTransparency = e.mTransparency;
+ return *this;
+}
+
+bool Event::operator==( const Event& e2 ) const
+{
+ return
+ static_cast<const Incidence&>(*this) == static_cast<const Incidence&>(e2) &&
+ dtEnd() == e2.dtEnd() &&
+ hasEndDate() == e2.hasEndDate() &&
+ transparency() == e2.transparency();
+}
+
+
+
+void Event::setDtEnd(const QDateTime &dtEnd)
+{
+ if (mReadOnly) return;
+
+ mDtEnd = dtEnd;
+
+ setHasEndDate(true);
+ setHasDuration(false);
+
+ updated();
+}
+
+QDateTime Event::dtEnd() const
+{
+ if (hasEndDate()) return mDtEnd;
+ if (hasDuration()) return dtStart().addSecs(duration());
+
+ kdDebug(5800) << "Warning! Event '" << summary()
+ << "' has neither end date nor duration." << endl;
+ return dtStart();
+}
+
+QDate Event::dateEnd() const
+{
+ if ( doesFloat() ) return dtEnd().date();
+ else return dtEnd().addSecs(-1).date();
+}
+
+QString Event::dtEndTimeStr() const
+{
+ return KGlobal::locale()->formatTime(dtEnd().time());
+}
+
+QString Event::dtEndDateStr(bool shortfmt) const
+{
+ return KGlobal::locale()->formatDate(dtEnd().date(),shortfmt);
+}
+
+QString Event::dtEndStr() const
+{
+ return KGlobal::locale()->formatDateTime(dtEnd());
+}
+
+void Event::setHasEndDate(bool b)
+{
+ mHasEndDate = b;
+}
+
+bool Event::hasEndDate() const
+{
+ return mHasEndDate;
+}
+
+bool Event::isMultiDay() const
+{
+ // End date is non inclusive, so subtract 1 second...
+ QDateTime start( dtStart() );
+ QDateTime end( dtEnd() );
+ if ( ! doesFloat() ) {
+ end = end.addSecs(-1);
+ }
+ bool multi = ( start.date() != end.date() && start <= end );
+ return multi;
+}
+
+void Event::setTransparency(Event::Transparency transparency)
+{
+ if (mReadOnly) return;
+ mTransparency = transparency;
+ updated();
+}
+
+Event::Transparency Event::transparency() const
+{
+ return mTransparency;
+}
+
+void Event::setDuration(int seconds)
+{
+ setHasEndDate(false);
+ Incidence::setDuration(seconds);
+}
diff --git a/libkcal/event.h b/libkcal/event.h
new file mode 100644
index 00000000..334c1039
--- /dev/null
+++ b/libkcal/event.h
@@ -0,0 +1,135 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001-2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_EVENT_H
+#define KCAL_EVENT_H
+
+#include "incidence.h"
+#include <kdepimmacros.h>
+
+namespace KCal {
+
+/**
+ This class provides an Event in the sense of RFC2445.
+*/
+class LIBKCAL_EXPORT Event : public Incidence
+{
+ public:
+ /**
+ Transparency of event.
+
+ Opaque - event appears in free/busy time
+ Transparent - event doesn't appear in free/busy time
+ */
+ enum Transparency { Opaque, Transparent };
+
+ typedef ListBase<Event> List;
+
+ Event();
+ Event( const Event & );
+ ~Event();
+ Event& operator=( const Event &e );
+ bool operator==( const Event & ) const;
+
+ QCString type() const { return "Event"; }
+
+ /**
+ Return copy of this Event. The caller owns the returned objet.
+ */
+ Event *clone();
+
+ /**
+ Set end date and time.
+ */
+ void setDtEnd(const QDateTime &dtEnd);
+ /**
+ Return end date and time.
+ */
+ virtual QDateTime dtEnd() const;
+ /**
+ Returns the day when the event ends. This might be different from
+ dtEnd().date, since the end date/time is non-inclusive. So timed events
+ ending at 0:00 have their end date on the day before.
+ */
+ QDate dateEnd() const;
+ /**
+ Return end time as string formatted according to the users locale
+ settings.
+ */
+ QString dtEndTimeStr() const;
+ /**
+ Return end date as string formatted according to the users locale
+ settings.
+
+ @param shortfmt if true return string in short format, if false return
+ long format
+ */
+ QString dtEndDateStr( bool shortfmt = true ) const;
+ /**
+ Return end date and time as string formatted according to the users locale
+ settings.
+ */
+ QString dtEndStr() const;
+
+ /**
+ Set whether the event has an end date/time.
+ */
+ void setHasEndDate(bool);
+ /**
+ Return whether the event has an end date/time.
+ */
+ bool hasEndDate() const;
+
+ /**
+ Return true if the event spans multiple days, otherwise return false.
+ */
+ bool isMultiDay() const;
+
+ /**
+ Set the event's time transparency level.
+ */
+ void setTransparency( Transparency transparency );
+ /**
+ Return the event's time transparency level.
+ */
+ Transparency transparency() const;
+
+ /**
+ Set duration of this event.
+ */
+ void setDuration( int seconds );
+
+ protected:
+ /** Return the end date/time of the base incidence. */
+ virtual QDateTime endDateRecurrenceBase() const { return dtEnd(); }
+ private:
+ bool accept( Visitor &v ) { return v.visit( this ); }
+
+ QDateTime mDtEnd;
+ bool mHasEndDate;
+ Transparency mTransparency;
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/exceptions.cpp b/libkcal/exceptions.cpp
new file mode 100644
index 00000000..677ec418
--- /dev/null
+++ b/libkcal/exceptions.cpp
@@ -0,0 +1,91 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <klocale.h>
+
+#include "calformat.h"
+#include "exceptions.h"
+
+using namespace KCal;
+
+Exception::Exception(const QString &message)
+{
+ mMessage = message;
+}
+
+Exception::~Exception()
+{
+}
+
+QString Exception::message()
+{
+ if (mMessage.isEmpty()) return i18n("%1 Error").arg(CalFormat::application());
+ else return mMessage;
+}
+
+
+ErrorFormat::ErrorFormat(ErrorCodeFormat code,const QString &message) :
+ Exception(message)
+{
+ mCode = code;
+}
+
+QString ErrorFormat::message()
+{
+ QString message = "";
+
+ switch (mCode) {
+ case LoadError:
+ message = i18n("Load Error");
+ break;
+ case SaveError:
+ message = i18n("Save Error");
+ break;
+ case ParseErrorIcal:
+ message = i18n("Parse Error in libical");
+ break;
+ case ParseErrorKcal:
+ message = i18n("Parse Error in libkcal");
+ break;
+ case NoCalendar:
+ message = i18n("No calendar component found.");
+ break;
+ case CalVersion1:
+ message = i18n("vCalendar Version 1.0 detected.");
+ break;
+ case CalVersion2:
+ message = i18n("iCalendar Version 2.0 detected.");
+ break;
+ case Restriction:
+ message = i18n("Restriction violation");
+ default:
+ break;
+ }
+
+ if (!mMessage.isEmpty()) message += ": " + mMessage;
+
+ return message;
+}
+
+ErrorFormat::ErrorCodeFormat ErrorFormat::errorCode()
+{
+ return mCode;
+}
diff --git a/libkcal/exceptions.h b/libkcal/exceptions.h
new file mode 100644
index 00000000..b86f513a
--- /dev/null
+++ b/libkcal/exceptions.h
@@ -0,0 +1,97 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001-2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef KCAL_EXCEPTIONS_H
+#define KCAL_EXCEPTIONS_H
+//
+// Exception classes of libkcal.
+//
+// We don't use actual C++ exceptions right now. These classes are currently
+// returned by an error function, but we can build upon them, if we start
+// to use C++ exceptions.
+
+#include <qstring.h>
+
+namespace KCal {
+
+/**
+ KOrganizer exceptions base class. This is currently used as a fancy kind of
+ error code not as an C++ exception.
+*/
+class Exception
+{
+ public:
+ /**
+ Construct exception with descriptive message \a message.
+ */
+ Exception( const QString &message = QString::null );
+ virtual ~Exception();
+
+ /**
+ Return descriptive message of exception.
+ */
+ virtual QString message();
+
+ protected:
+ QString mMessage;
+
+ private:
+ class Private;
+ Private *d;
+};
+
+/**
+ Calendar format related error class.
+*/
+class ErrorFormat : public Exception
+{
+ public:
+ enum ErrorCodeFormat { LoadError, SaveError,
+ ParseErrorIcal, ParseErrorKcal,
+ NoCalendar,
+ CalVersion1,CalVersion2,
+ CalVersionUnknown,
+ Restriction };
+
+ /**
+ Create format error exception.
+ */
+ ErrorFormat( ErrorCodeFormat code, const QString &message = QString::null );
+
+ /**
+ Return format error message.
+ */
+ QString message();
+ /**
+ Return format error code.
+ */
+ ErrorCodeFormat errorCode();
+
+ private:
+ ErrorCodeFormat mCode;
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/filestorage.cpp b/libkcal/filestorage.cpp
new file mode 100644
index 00000000..5419a254
--- /dev/null
+++ b/libkcal/filestorage.cpp
@@ -0,0 +1,155 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2002 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <stdlib.h>
+
+#include <qdatetime.h>
+#include <qstring.h>
+#include <qptrlist.h>
+
+#include <kdebug.h>
+
+#include "calendar.h"
+#include "vcaldrag.h"
+#include "vcalformat.h"
+#include "icalformat.h"
+
+#include "filestorage.h"
+
+using namespace KCal;
+
+FileStorage::FileStorage( Calendar *cal, const QString &fileName,
+ CalFormat *format )
+ : CalStorage( cal ),
+ mFileName( fileName ),
+ mSaveFormat( format )
+{
+}
+
+FileStorage::~FileStorage()
+{
+ delete mSaveFormat;
+}
+
+void FileStorage::setFileName( const QString &fileName )
+{
+ mFileName = fileName;
+}
+
+QString FileStorage::fileName()const
+{
+ return mFileName;
+}
+
+
+void FileStorage::setSaveFormat( CalFormat *format )
+{
+ delete mSaveFormat;
+ mSaveFormat = format;
+}
+
+CalFormat *FileStorage::saveFormat()const
+{
+ return mSaveFormat;
+}
+
+
+bool FileStorage::open()
+{
+ return true;
+}
+
+bool FileStorage::load()
+{
+// kdDebug(5800) << "FileStorage::load(): '" << mFileName << "'" << endl;
+
+ // do we want to silently accept this, or make some noise? Dunno...
+ // it is a semantical thing vs. a practical thing.
+ if (mFileName.isEmpty()) return false;
+
+ // Always try to load with iCalendar. It will detect, if it is actually a
+ // vCalendar file.
+ bool success;
+ // First try the supplied format. Otherwise fall through to iCalendar, then
+ // to vCalendar
+ success = saveFormat() && saveFormat()->load( calendar(), mFileName );
+ if ( !success ) {
+ ICalFormat iCal;
+
+ success = iCal.load( calendar(), mFileName);
+ if ( !success ) {
+ if ( iCal.exception() ) {
+// kdDebug(5800) << "---Error: " << mFormat->exception()->errorCode() << endl;
+ if ( iCal.exception()->errorCode() == ErrorFormat::CalVersion1 ) {
+ // Expected non vCalendar file, but detected vCalendar
+ kdDebug(5800) << "FileStorage::load() Fallback to VCalFormat" << endl;
+ VCalFormat vCal;
+ success = vCal.load( calendar(), mFileName );
+ calendar()->setProductId( vCal.productId() );
+ } else {
+ return false;
+ }
+ } else {
+ kdDebug(5800) << "Warning! There should be an exception set." << endl;
+ return false;
+ }
+ } else {
+// kdDebug(5800) << "---Success" << endl;
+ calendar()->setProductId( iCal.loadedProductId() );
+ }
+ }
+
+ calendar()->setModified( false );
+
+ return true;
+}
+
+bool FileStorage::save()
+{
+ if ( mFileName.isEmpty() ) return false;
+
+ CalFormat *format = 0;
+ if ( mSaveFormat ) format = mSaveFormat;
+ else format = new ICalFormat;
+
+ bool success = format->save( calendar(), mFileName );
+
+ if ( success ) {
+ calendar()->setModified( false );
+ } else {
+ if ( !format->exception() ) {
+ kdDebug(5800) << "FileStorage::save(): Error. There should be an exception set."
+ << endl;
+ } else {
+ kdDebug(5800) << "FileStorage::save(): " << format->exception()->message()
+ << endl;
+ }
+ }
+
+ if ( !mSaveFormat ) delete format;
+
+ return success;
+}
+
+bool FileStorage::close()
+{
+ return true;
+}
diff --git a/libkcal/filestorage.h b/libkcal/filestorage.h
new file mode 100644
index 00000000..c4fc7391
--- /dev/null
+++ b/libkcal/filestorage.h
@@ -0,0 +1,63 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2002,2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_FILESTORAGE_H
+#define KCAL_FILESTORAGE_H
+
+#include "calstorage.h"
+
+namespace KCal {
+
+class CalFormat;
+/**
+ This class provides a calendar storage as a local file.
+*/
+class LIBKCAL_EXPORT FileStorage : public CalStorage
+{
+ public:
+ FileStorage( Calendar *, const QString &fileName = QString::null,
+ CalFormat *format = 0 );
+ virtual ~FileStorage();
+
+ void setFileName( const QString &mFileName );
+ QString fileName() const;
+
+ /**
+ FileStorage takes ownership of format object.
+ */
+ void setSaveFormat( CalFormat * );
+ CalFormat *saveFormat() const;
+
+ bool open();
+ bool load();
+ bool save();
+ bool close();
+
+ private:
+ QString mFileName;
+ CalFormat *mSaveFormat;
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/freebusy.cpp b/libkcal/freebusy.cpp
new file mode 100644
index 00000000..71f05b35
--- /dev/null
+++ b/libkcal/freebusy.cpp
@@ -0,0 +1,224 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "freebusy.h"
+
+using namespace KCal;
+
+FreeBusy::FreeBusy()
+{
+}
+
+FreeBusy::FreeBusy(const QDateTime &start, const QDateTime &end)
+{
+ setDtStart(start);
+ setDtEnd(end);
+}
+
+FreeBusy::FreeBusy( Calendar *calendar, const QDateTime &start, const QDateTime &end )
+{
+ kdDebug(5800) << "FreeBusy::FreeBusy" << endl;
+ mCalendar = calendar;
+
+ setDtStart(start);
+ setDtEnd(end);
+
+ // Get all the events in the calendar
+ Event::List eventList = mCalendar->rawEvents( start.date(), end.date() );
+
+ int extraDays, i, x, duration;
+ duration = start.daysTo(end);
+ QDate day;
+ QDateTime tmpStart;
+ QDateTime tmpEnd;
+ // Loops through every event in the calendar
+ Event::List::ConstIterator it;
+ for( it = eventList.begin(); it != eventList.end(); ++it ) {
+ Event *event = *it;
+
+ // The code below can not handle floating events. Fixing this resulted
+ // in a lot of duplicated code. Instead, make a copy of the event and
+ // set the period to the full day(s). This trick works for recurring,
+ // multiday, and single day floating events.
+ Event *floatingEvent = 0;
+ if ( event->doesFloat() ) {
+ // Floating event. Do the hack
+ kdDebug(5800) << "Floating event\n";
+ floatingEvent = new Event( *event );
+
+ // Set the start and end times to be on midnight
+ QDateTime start( floatingEvent->dtStart().date(), QTime( 0, 0 ) );
+ QDateTime end( floatingEvent->dtEnd().date(), QTime( 23, 59, 59, 999 ) );
+ floatingEvent->setFloats( false );
+ floatingEvent->setDtStart( start );
+ floatingEvent->setDtEnd( end );
+
+ kdDebug(5800) << "Use: " << start.toString() << " to " << end.toString()
+ << endl;
+ // Finally, use this event for the setting below
+ event = floatingEvent;
+ }
+
+ // This whole for loop is for recurring events, it loops through
+ // each of the days of the freebusy request
+
+ // First check if this is transparent. If it is, it shouldn't be in the
+ // freebusy list
+ if ( event->transparency() == Event::Transparent )
+ // Transparent
+ continue;
+
+ for( i = 0; i <= duration; ++i ) {
+ day=(start.addDays(i).date());
+ tmpStart.setDate(day);
+ tmpEnd.setDate(day);
+
+ if( event->doesRecur() ) {
+ if ( event->isMultiDay() ) {
+// FIXME: This doesn't work for sub-daily recurrences or recurrences with
+// a different time than the original event.
+ extraDays = event->dtStart().date().daysTo(event->dtEnd().date());
+ for ( x = 0; x <= extraDays; ++x ) {
+ if ( event->recursOn(day.addDays(-x))) {
+ tmpStart.setDate(day.addDays(-x));
+ tmpStart.setTime(event->dtStart().time());
+ tmpEnd=tmpStart.addSecs( (event->duration()) );
+
+ addLocalPeriod( tmpStart, tmpEnd );
+ break;
+ }
+ }
+ } else {
+ if (event->recursOn(day)) {
+ tmpStart.setTime(event->dtStart().time());
+ tmpEnd.setTime(event->dtEnd().time());
+
+ addLocalPeriod (tmpStart, tmpEnd);
+ }
+ }
+ }
+
+ }
+ // Non-recurring events
+ addLocalPeriod(event->dtStart(), event->dtEnd());
+
+ // Clean up
+ delete floatingEvent;
+ }
+
+ sortList();
+}
+
+FreeBusy::~FreeBusy()
+{
+}
+
+bool FreeBusy::setDtEnd( const QDateTime &end )
+{
+ mDtEnd = end;
+ return true;
+}
+
+QDateTime FreeBusy::dtEnd() const
+{
+ return mDtEnd;
+}
+
+PeriodList FreeBusy::busyPeriods() const
+{
+ return mBusyPeriods;
+}
+
+bool FreeBusy::addLocalPeriod(const QDateTime &eventStart, const QDateTime &eventEnd ) {
+ QDateTime tmpStart;
+ QDateTime tmpEnd;
+
+ //Check to see if the start *or* end of the event is
+ //between the start and end of the freebusy dates.
+ if ( !( ( ( dtStart().secsTo(eventStart) >= 0 ) &&
+ ( eventStart.secsTo(dtEnd()) >= 0 ) )
+ || ( ( dtStart().secsTo(eventEnd) >= 0 ) &&
+ ( eventEnd.secsTo(dtEnd()) >= 0 ) ) ) )
+ return false;
+
+ if ( eventStart.secsTo( dtStart() ) >= 0 ) {
+ tmpStart = dtStart();
+ } else {
+ tmpStart = eventStart;
+ }
+
+ if ( eventEnd.secsTo( dtEnd() ) <= 0 ) {
+ tmpEnd = dtEnd();
+ } else {
+ tmpEnd = eventEnd;
+ }
+
+ Period p(tmpStart, tmpEnd);
+ mBusyPeriods.append( p );
+
+ return true;
+}
+
+FreeBusy::FreeBusy( PeriodList busyPeriods)
+{
+ mBusyPeriods = busyPeriods;
+}
+
+void FreeBusy::sortList()
+{
+ qHeapSort( mBusyPeriods );
+ return;
+}
+
+void FreeBusy::addPeriods(const PeriodList &list )
+{
+ mBusyPeriods += list;
+ sortList();
+}
+
+void FreeBusy::addPeriod(const QDateTime &start, const QDateTime &end)
+{
+ mBusyPeriods.append( Period(start, end) );
+ sortList();
+}
+
+void FreeBusy::addPeriod( const QDateTime &start, const Duration &dur )
+{
+ mBusyPeriods.append( Period(start, dur) );
+ sortList();
+}
+
+void FreeBusy::merge( FreeBusy *freeBusy )
+{
+ if ( freeBusy->dtStart() < dtStart() )
+ setDtStart( freeBusy->dtStart() );
+
+ if ( freeBusy->dtEnd() > dtEnd() )
+ setDtEnd( freeBusy->dtEnd() );
+
+ QValueList<Period> periods = freeBusy->busyPeriods();
+ QValueList<Period>::ConstIterator it;
+ for ( it = periods.begin(); it != periods.end(); ++it )
+ addPeriod( (*it).start(), (*it).end() );
+}
diff --git a/libkcal/freebusy.h b/libkcal/freebusy.h
new file mode 100644
index 00000000..0ba1e2cd
--- /dev/null
+++ b/libkcal/freebusy.h
@@ -0,0 +1,84 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001-2003 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_FREEBUSY_H
+#define KCAL_FREEBUSY_H
+
+#include <qdatetime.h>
+#include <qvaluelist.h>
+#include <qptrlist.h>
+
+#include "period.h"
+#include "calendar.h"
+
+#include "incidencebase.h"
+
+namespace KCal {
+
+ typedef QValueList<Period> PeriodList;
+/**
+ This class provides information about free/busy time of a calendar user.
+*/
+class LIBKCAL_EXPORT FreeBusy : public IncidenceBase
+{
+ public:
+ FreeBusy();
+ FreeBusy( const QDateTime &start, const QDateTime &end );
+ FreeBusy( Calendar *calendar, const QDateTime &start,
+ const QDateTime &end );
+ FreeBusy( PeriodList busyPeriods );
+
+ ~FreeBusy();
+
+ QCString type() const { return "FreeBusy"; }
+
+ virtual QDateTime dtEnd() const;
+ bool setDtEnd( const QDateTime &end );
+
+ PeriodList busyPeriods() const;
+
+ /** Adds a period to the freebusy list and sorts the list. */
+ void addPeriod( const QDateTime &start, const QDateTime &end );
+ void addPeriod( const QDateTime &start, const Duration &dur );
+ /** Adds a list of periods to the freebusy object and then sorts
+ * that list. Use this if you are adding many items, instead of the
+ * addPeriod method, to avoid sorting repeatedly. */
+ void addPeriods( const PeriodList & );
+ void sortList();
+
+ void merge( FreeBusy *freebusy );
+
+ private:
+ bool accept( Visitor &v ) { return v.visit( this ); }
+ //This is used for creating a freebusy object for the current user
+ bool addLocalPeriod( const QDateTime &start, const QDateTime &end );
+
+ QDateTime mDtEnd;
+ PeriodList mBusyPeriods;
+ Calendar *mCalendar;
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/freebusycache.h b/libkcal/freebusycache.h
new file mode 100644
index 00000000..180c4e4a
--- /dev/null
+++ b/libkcal/freebusycache.h
@@ -0,0 +1,47 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2004 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_FREEBUSYCACHE_H
+#define KCAL_FREEBUSYCACHE_H
+
+#include <qstring.h>
+
+namespace KCal {
+
+class FreeBusy;
+
+class FreeBusyCache
+{
+ public:
+ /**
+ Save freebusy information belonging to an email.
+ */
+ virtual bool saveFreeBusy( FreeBusy *freebusy, const Person &person ) = 0;
+// virtual bool saveFreeBusy( FreeBusy *, const QString &email ) = 0;
+
+ /**
+ Load freebusy information belonging to an email.
+ */
+ virtual FreeBusy *loadFreeBusy( const QString &email ) = 0;
+};
+
+}
+
+#endif
diff --git a/libkcal/freebusyurlstore.cpp b/libkcal/freebusyurlstore.cpp
new file mode 100644
index 00000000..d8f71ea4
--- /dev/null
+++ b/libkcal/freebusyurlstore.cpp
@@ -0,0 +1,70 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2004 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "freebusyurlstore.h"
+
+#include <kstaticdeleter.h>
+#include <kconfig.h>
+#include <kstandarddirs.h>
+
+using namespace KCal;
+
+static KStaticDeleter<FreeBusyUrlStore> selfDeleter;
+
+FreeBusyUrlStore *FreeBusyUrlStore::mSelf = 0;
+
+FreeBusyUrlStore *FreeBusyUrlStore::self()
+{
+ if ( !mSelf ) {
+ selfDeleter.setObject( mSelf, new FreeBusyUrlStore() );
+ }
+ return mSelf;
+}
+
+FreeBusyUrlStore::FreeBusyUrlStore()
+{
+ QString configFile = locateLocal( "data", "korganizer/freebusyurls" );
+ mConfig = new KConfig( configFile );
+}
+
+FreeBusyUrlStore::~FreeBusyUrlStore()
+{
+ delete mConfig;
+}
+
+void FreeBusyUrlStore::writeUrl( const QString &email, const QString &url )
+{
+ mConfig->setGroup( email );
+
+ mConfig->writeEntry( "url", url );
+}
+
+QString FreeBusyUrlStore::readUrl( const QString &email )
+{
+ mConfig->setGroup( email );
+
+ return mConfig->readEntry( "url" );
+}
+
+void FreeBusyUrlStore::sync()
+{
+ mConfig->sync();
+}
diff --git a/libkcal/freebusyurlstore.h b/libkcal/freebusyurlstore.h
new file mode 100644
index 00000000..28355782
--- /dev/null
+++ b/libkcal/freebusyurlstore.h
@@ -0,0 +1,54 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2004 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_FREEBUSYURLSTORE_H
+#define KCAL_FREEBUSYURLSTORE_H
+
+#include <qstring.h>
+
+#include "libkcal_export.h"
+
+class KConfig;
+
+namespace KCal {
+
+class LIBKCAL_EXPORT FreeBusyUrlStore
+{
+ public:
+ static FreeBusyUrlStore *self();
+ ~FreeBusyUrlStore();
+
+ void writeUrl( const QString &email, const QString &url );
+
+ QString readUrl( const QString &email );
+
+ void sync();
+
+ private:
+ FreeBusyUrlStore();
+
+ static FreeBusyUrlStore *mSelf;
+
+ KConfig *mConfig;
+};
+
+}
+
+#endif
diff --git a/libkcal/htmlexport.cpp b/libkcal/htmlexport.cpp
new file mode 100644
index 00000000..8d157015
--- /dev/null
+++ b/libkcal/htmlexport.cpp
@@ -0,0 +1,713 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qapplication.h>
+#include <qfile.h>
+#include <qtextstream.h>
+#include <qtextcodec.h>
+#include <qregexp.h>
+
+#include <kcharsets.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kdebug.h>
+#include <kcalendarsystem.h>
+
+#include <libkcal/calendar.h>
+#include <libkcal/event.h>
+#include <libkcal/todo.h>
+
+#ifndef KORG_NOKABC
+ #include <kabc/stdaddressbook.h>
+#endif
+#include "htmlexport.h"
+#include "htmlexportsettings.h"
+
+using namespace KCal;
+
+HtmlExport::HtmlExport( Calendar *calendar, HTMLExportSettings *settings ) :
+ mCalendar( calendar ), mSettings( settings )
+{
+}
+
+bool HtmlExport::save( const QString &fileName )
+{
+ QString fn( fileName );
+ if ( fn.isEmpty() && mSettings ) {
+ fn = mSettings->outputFile();
+ }
+ if ( !mSettings || fn.isEmpty() ) {
+ return false;
+ }
+ QFile f( fileName );
+ if ( !f.open(IO_WriteOnly)) {
+ return false;
+ }
+ QTextStream ts(&f);
+ bool success = save(&ts);
+ f.close();
+ return success;
+}
+
+bool HtmlExport::save(QTextStream *ts)
+{
+ if ( !mSettings ) return false;
+ ts->setEncoding( QTextStream::UnicodeUTF8 );
+
+ // Write HTML header
+ *ts << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" ";
+ *ts << "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n";
+
+ *ts << "<html><head>" << endl;
+ *ts << " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=";
+ *ts << "UTF-8\" />\n";
+ if ( !mSettings->pageTitle().isEmpty())
+ *ts << " <title>" << mSettings->pageTitle() << "</title>\n";
+ *ts << " <style type=\"text/css\">\n";
+ *ts << styleSheet();
+ *ts << " </style>\n";
+ *ts << "</head><body>\n";
+
+ // FIXME: Write header
+ // (Heading, Calendar-Owner, Calendar-Date, ...)
+
+ if ( mSettings->eventView() || mSettings->monthView() || mSettings->weekView() ) {
+ if (!mSettings->eventTitle().isEmpty())
+ *ts << "<h1>" << mSettings->eventTitle() << "</h1>\n";
+
+ // Write Week View
+ if ( mSettings->weekView() )
+ createWeekView( ts );
+ // Write Month View
+ if ( mSettings->monthView() )
+ createMonthView( ts );
+ // Write Event List
+ if ( mSettings->eventView() )
+ createEventList( ts );
+ }
+
+ // Write Todo List
+ if ( mSettings->todoView() ) {
+ if ( !mSettings->todoListTitle().isEmpty())
+ *ts << "<h1>" << mSettings->todoListTitle() << "</h1>\n";
+ createTodoList(ts);
+ }
+
+ // Write Journals
+ if ( mSettings->journalView() ) {
+ if ( !mSettings->journalTitle().isEmpty())
+ *ts << "<h1>" << mSettings->journalTitle() << "</h1>\n";
+ createJournalView(ts);
+ }
+
+ // Write Free/Busy
+ if ( mSettings->freeBusyView() ) {
+ if ( !mSettings->freeBusyTitle().isEmpty())
+ *ts << "<h1>" << mSettings->freeBusyTitle() << "</h1>\n";
+ createFreeBusyView(ts);
+ }
+
+ createFooter( ts );
+
+ // Write HTML trailer
+ *ts << "</body></html>\n";
+
+ return true;
+}
+
+void HtmlExport::createMonthView(QTextStream *ts)
+{
+ QDate start = fromDate();
+ start.setYMD( start.year(), start.month(), 1 ); // go back to first day in month
+
+ QDate end( start.year(), start.month(), start.daysInMonth() );
+
+ int startmonth = start.month();
+ int startyear = start.year();
+
+ while ( start < toDate() ) {
+ // Write header
+ *ts << "<h2>" << (i18n("month_year","%1 %2").arg(KGlobal::locale()->calendar()->monthName(start))
+ .arg(start.year())) << "</h2>\n";
+ if ( KGlobal::locale()->weekStartDay() == 1 ) {
+ start = start.addDays(1 - start.dayOfWeek());
+ } else {
+ if (start.dayOfWeek() != 7) {
+ start = start.addDays(-start.dayOfWeek());
+ }
+ }
+ *ts << "<table border=\"1\">\n";
+
+ // Write table header
+ *ts << " <tr>";
+ for(int i=0; i<7; ++i) {
+ *ts << "<th>" << KGlobal::locale()->calendar()->weekDayName( start.addDays(i) ) << "</th>";
+ }
+ *ts << "</tr>\n";
+
+ // Write days
+ while (start <= end) {
+ *ts << " <tr>\n";
+ for(int i=0;i<7;++i) {
+ *ts << " <td valign=\"top\"><table border=\"0\">";
+
+ *ts << "<tr><td ";
+ if (mHolidayMap.contains(start) || start.dayOfWeek() == 7) {
+ *ts << "class=\"dateholiday\"";
+ } else {
+ *ts << "class=\"date\"";
+ }
+ *ts << ">" << QString::number(start.day());
+
+ if (mHolidayMap.contains(start)) {
+ *ts << " <em>" << mHolidayMap[start] << "</em>";
+ }
+
+ *ts << "</td></tr><tr><td valign=\"top\">";
+
+ Event::List events = mCalendar->events( start,
+ EventSortStartDate,
+ SortDirectionAscending );
+ if (events.count()) {
+ *ts << "<table>";
+ Event::List::ConstIterator it;
+ for( it = events.begin(); it != events.end(); ++it ) {
+ if ( checkSecrecy( *it ) ) {
+ createEvent( ts, *it, start, false );
+ }
+ }
+ *ts << "</table>";
+ } else {
+ *ts << "&nbsp;";
+ }
+
+ *ts << "</td></tr></table></td>\n";
+ start = start.addDays(1);
+ }
+ *ts << " </tr>\n";
+ }
+ *ts << "</table>\n";
+ startmonth += 1;
+ if ( startmonth > 12 ) {
+ startyear += 1;
+ startmonth = 1;
+ }
+ start.setYMD( startyear, startmonth, 1 );
+ end.setYMD(start.year(),start.month(),start.daysInMonth());
+ }
+}
+
+void HtmlExport::createEventList (QTextStream *ts)
+{
+ int columns = 3;
+ *ts << "<table border=\"0\" cellpadding=\"3\" cellspacing=\"3\">\n";
+ *ts << " <tr>\n";
+ *ts << " <th class=\"sum\">" << i18n("Start Time") << "</th>\n";
+ *ts << " <th>" << i18n("End Time") << "</th>\n";
+ *ts << " <th>" << i18n("Event") << "</th>\n";
+ if ( mSettings->eventLocation() ) {
+ *ts << " <th>" << i18n("Location") << "</th>\n";
+ ++columns;
+ }
+ if ( mSettings->eventCategories() ) {
+ *ts << " <th>" << i18n("Categories") << "</th>\n";
+ ++columns;
+ }
+ if ( mSettings->eventAttendees() ) {
+ *ts << " <th>" << i18n("Attendees") << "</th>\n";
+ ++columns;
+ }
+
+ *ts << " </tr>\n";
+
+ for ( QDate dt = fromDate(); dt <= toDate(); dt = dt.addDays(1) ) {
+ kdDebug(5850) << "Getting events for " << dt.toString() << endl;
+ Event::List events = mCalendar->events(dt,
+ EventSortStartDate,
+ SortDirectionAscending );
+ if (events.count()) {
+ Event::List::ConstIterator it;
+ bool first = true;
+ for( it = events.begin(); it != events.end(); ++it ) {
+ if ( checkSecrecy( *it ) ) {
+ if ( first ) {
+ *ts << " <tr><td colspan=\"" << QString::number(columns)
+ << "\" class=\"datehead\"><i>"
+ << KGlobal::locale()->formatDate(dt)
+ << "</i></td></tr>\n";
+ first = false;
+ }
+ createEvent( ts, *it, dt );
+ }
+ }
+ }
+ }
+
+ *ts << "</table>\n";
+}
+
+void HtmlExport::createEvent (QTextStream *ts, Event *event,
+ QDate date,bool withDescription)
+{
+ kdDebug(5850) << "HtmlExport::createEvent(): " << event->summary() << endl;
+ *ts << " <tr>\n";
+
+ if (!event->doesFloat()) {
+ if (event->isMultiDay() && (event->dtStart().date() != date)) {
+ *ts << " <td>&nbsp;</td>\n";
+ } else {
+ *ts << " <td valign=\"top\">" << event->dtStartTimeStr() << "</td>\n";
+ }
+ if (event->isMultiDay() && (event->dtEnd().date() != date)) {
+ *ts << " <td>&nbsp;</td>\n";
+ } else {
+ *ts << " <td valign=\"top\">" << event->dtEndTimeStr() << "</td>\n";
+ }
+ } else {
+ *ts << " <td>&nbsp;</td><td>&nbsp;</td>\n";
+ }
+
+ *ts << " <td class=\"sum\">\n";
+ *ts << " <b>" << cleanChars(event->summary()) << "</b>\n";
+ if ( withDescription && !event->description().isEmpty() ) {
+ *ts << " <p>" << breakString( cleanChars( event->description() ) ) << "</p>\n";
+ }
+ *ts << " </td>\n";
+
+ if ( mSettings->eventLocation() ) {
+ *ts << " <td>\n";
+ formatLocation( ts, event );
+ *ts << " </td>\n";
+ }
+
+ if ( mSettings->eventCategories() ) {
+ *ts << " <td>\n";
+ formatCategories( ts, event );
+ *ts << " </td>\n";
+ }
+
+ if ( mSettings->eventAttendees() ) {
+ *ts << " <td>\n";
+ formatAttendees( ts, event );
+ *ts << " </td>\n";
+ }
+
+ *ts << " </tr>\n";
+}
+
+void HtmlExport::createTodoList ( QTextStream *ts )
+{
+ Todo::List rawTodoList = mCalendar->todos();
+
+ Todo::List::Iterator it = rawTodoList.begin();
+ while ( it != rawTodoList.end() ) {
+ Todo *ev = *it;
+ Todo *subev = ev;
+ if ( ev->relatedTo() ) {
+ if ( ev->relatedTo()->type()=="Todo" ) {
+ if ( rawTodoList.find( static_cast<Todo *>( ev->relatedTo() ) ) ==
+ rawTodoList.end() ) {
+ rawTodoList.append( static_cast<Todo *>( ev->relatedTo() ) );
+ }
+ }
+ }
+ it = rawTodoList.find( subev );
+ ++it;
+ }
+
+ // FIXME: Sort list by priorities. This is brute force and should be
+ // replaced by a real sorting algorithm.
+ Todo::List todoList;
+ for ( int i = 1; i <= 9; ++i ) {
+ for( it = rawTodoList.begin(); it != rawTodoList.end(); ++it ) {
+ if ( (*it)->priority() == i && checkSecrecy( *it ) ) {
+ todoList.append( *it );
+ }
+ }
+ }
+ for( it = rawTodoList.begin(); it != rawTodoList.end(); ++it ) {
+ if ( (*it)->priority() == 0 && checkSecrecy( *it ) ) {
+ todoList.append( *it );
+ }
+ }
+
+ int columns = 3;
+ *ts << "<table border=\"0\" cellpadding=\"3\" cellspacing=\"3\">\n";
+ *ts << " <tr>\n";
+ *ts << " <th class=\"sum\">" << i18n("Task") << "</th>\n";
+ *ts << " <th>" << i18n("Priority") << "</th>\n";
+ *ts << " <th>" << i18n("Completed") << "</th>\n";
+ if ( mSettings->taskDueDate() ) {
+ *ts << " <th>" << i18n("Due Date") << "</th>\n";
+ ++columns;
+ }
+ if ( mSettings->taskLocation() ) {
+ *ts << " <th>" << i18n("Location") << "</th>\n";
+ ++columns;
+ }
+ if ( mSettings->taskCategories() ) {
+ *ts << " <th>" << i18n("Categories") << "</th>\n";
+ ++columns;
+ }
+ if ( mSettings->taskAttendees() ) {
+ *ts << " <th>" << i18n("Attendees") << "</th>\n";
+ ++columns;
+ }
+ *ts << " </tr>\n";
+
+ // Create top-level list.
+ for( it = todoList.begin(); it != todoList.end(); ++it ) {
+ if ( !(*it)->relatedTo() ) createTodo( ts, *it );
+ }
+
+ // Create sub-level lists
+ for( it = todoList.begin(); it != todoList.end(); ++it ) {
+ Incidence::List relations = (*it)->relations();
+ if (relations.count()) {
+ // Generate sub-task list of event ev
+ *ts << " <tr>\n";
+ *ts << " <td class=\"subhead\" colspan=";
+ *ts << "\"" << QString::number(columns) << "\"";
+ *ts << "><a name=\"sub" << (*it)->uid() << "\"></a>"
+ << i18n("Sub-Tasks of: ") << "<a href=\"#"
+ << (*it)->uid() << "\"><b>" << cleanChars( (*it)->summary())
+ << "</b></a></td>\n";
+ *ts << " </tr>\n";
+
+ Todo::List sortedList;
+ // FIXME: Sort list by priorities. This is brute force and should be
+ // replaced by a real sorting algorithm.
+ for ( int i = 1; i <= 9; ++i ) {
+ Incidence::List::ConstIterator it2;
+ for( it2 = relations.begin(); it2 != relations.end(); ++it2 ) {
+ Todo *ev3 = dynamic_cast<Todo *>( *it2 );
+ if ( ev3 && ev3->priority() == i ) sortedList.append( ev3 );
+ }
+ }
+ Incidence::List::ConstIterator it2;
+ for( it2 = relations.begin(); it2 != relations.end(); ++it2 ) {
+ Todo *ev3 = dynamic_cast<Todo *>( *it2 );
+ if ( ev3 && ev3->priority() == 0 ) sortedList.append( ev3 );
+ }
+
+ Todo::List::ConstIterator it3;
+ for( it3 = sortedList.begin(); it3 != sortedList.end(); ++it3 ) {
+ createTodo( ts, *it3 );
+ }
+ }
+ }
+
+ *ts << "</table>\n";
+}
+
+void HtmlExport::createTodo (QTextStream *ts,Todo *todo)
+{
+ kdDebug(5850) << "HtmlExport::createTodo()" << endl;
+
+ bool completed = todo->isCompleted();
+ Incidence::List relations = todo->relations();
+
+ *ts << "<tr>\n";
+
+ *ts << " <td class=\"sum";
+ if (completed) *ts << "done";
+ *ts << "\">\n";
+ *ts << " <a name=\"" << todo->uid() << "\"></a>\n";
+ *ts << " <b>" << cleanChars(todo->summary()) << "</b>\n";
+ if (!todo->description().isEmpty()) {
+ *ts << " <p>" << breakString(cleanChars(todo->description())) << "</p>\n";
+ }
+ if (relations.count()) {
+ *ts << " <div align=\"right\"><a href=\"#sub" << todo->uid()
+ << "\">" << i18n("Sub-Tasks") << "</a></div>\n";
+ }
+ *ts << " </td>\n";
+
+ *ts << " <td";
+ if (completed) *ts << " class=\"done\"";
+ *ts << ">\n";
+ *ts << " " << todo->priority() << "\n";
+ *ts << " </td>\n";
+
+ *ts << " <td";
+ if (completed) *ts << " class=\"done\"";
+ *ts << ">\n";
+ *ts << " " << i18n("%1 %").arg(todo->percentComplete()) << "\n";
+ *ts << " </td>\n";
+
+ if ( mSettings->taskDueDate() ) {
+ *ts << " <td";
+ if (completed) *ts << " class=\"done\"";
+ *ts << ">\n";
+ if (todo->hasDueDate()) {
+ *ts << " " << todo->dtDueDateStr() << "\n";
+ } else {
+ *ts << " &nbsp;\n";
+ }
+ *ts << " </td>\n";
+ }
+
+ if ( mSettings->taskLocation() ) {
+ *ts << " <td";
+ if (completed) *ts << " class=\"done\"";
+ *ts << ">\n";
+ formatLocation(ts,todo);
+ *ts << " </td>\n";
+ }
+
+ if ( mSettings->taskCategories() ) {
+ *ts << " <td";
+ if (completed) *ts << " class=\"done\"";
+ *ts << ">\n";
+ formatCategories(ts,todo);
+ *ts << " </td>\n";
+ }
+
+ if ( mSettings->taskAttendees() ) {
+ *ts << " <td";
+ if (completed) *ts << " class=\"done\"";
+ *ts << ">\n";
+ formatAttendees(ts,todo);
+ *ts << " </td>\n";
+ }
+
+ *ts << "</tr>\n";
+}
+
+void HtmlExport::createWeekView( QTextStream */*ts*/ )
+{
+ // FIXME: Implement this!
+}
+
+void HtmlExport::createJournalView( QTextStream */*ts*/ )
+{
+// Journal::List rawJournalList = mCalendar->journals();
+ // FIXME: Implement this!
+}
+
+void HtmlExport::createFreeBusyView( QTextStream */*ts*/ )
+{
+ // FIXME: Implement this!
+}
+
+bool HtmlExport::checkSecrecy( Incidence *incidence )
+{
+ int secrecy = incidence->secrecy();
+ if ( secrecy == Incidence::SecrecyPublic ) {
+ return true;
+ }
+ if ( secrecy == Incidence::SecrecyPrivate && !mSettings->excludePrivate() ) {
+ return true;
+ }
+ if ( secrecy == Incidence::SecrecyConfidential &&
+ !mSettings->excludeConfidential() ) {
+ return true;
+ }
+ return false;
+}
+
+void HtmlExport::formatLocation (QTextStream *ts,Incidence *event)
+{
+ if (!event->location().isEmpty()) {
+ *ts << " " << cleanChars(event->location()) << "\n";
+ } else {
+ *ts << " &nbsp;\n";
+ }
+}
+
+void HtmlExport::formatCategories (QTextStream *ts,Incidence *event)
+{
+ if (!event->categoriesStr().isEmpty()) {
+ *ts << " " << cleanChars(event->categoriesStr()) << "\n";
+ } else {
+ *ts << " &nbsp;\n";
+ }
+}
+
+void HtmlExport::formatAttendees( QTextStream *ts, Incidence *event )
+{
+ Attendee::List attendees = event->attendees();
+ if (attendees.count()) {
+ *ts << "<em>";
+#ifndef KORG_NOKABC
+ KABC::AddressBook *add_book = KABC::StdAddressBook::self( true );
+ KABC::Addressee::List addressList;
+ addressList = add_book->findByEmail(event->organizer().email());
+ KABC::Addressee o = addressList.first();
+ if (!o.isEmpty() && addressList.size()<2) {
+ *ts << "<a href=\"mailto:" << event->organizer().email() << "\">";
+ *ts << cleanChars(o.formattedName()) << "</a>\n";
+ }
+ else *ts << event->organizer().fullName();
+#else
+ *ts << event->organizer().fullName();
+#endif
+ *ts << "</em><br />";
+ Attendee::List::ConstIterator it;
+ for( it = attendees.begin(); it != attendees.end(); ++it ) {
+ Attendee *a = *it;
+ if (!a->email().isEmpty()) {
+ *ts << "<a href=\"mailto:" << a->email();
+ *ts << "\">" << cleanChars(a->name()) << "</a>";
+ }
+ else {
+ *ts << " " << cleanChars(a->name());
+ }
+ *ts << "<br />" << "\n";
+ }
+ } else {
+ *ts << " &nbsp;\n";
+ }
+}
+
+QString HtmlExport::breakString(const QString &text)
+{
+ int number = text.contains("\n");
+ if(number < 0) {
+ return text;
+ } else {
+ QString out;
+ QString tmpText = text;
+ int pos = 0;
+ QString tmp;
+ for(int i=0;i<=number;i++) {
+ pos = tmpText.find("\n");
+ tmp = tmpText.left(pos);
+ tmpText = tmpText.right(tmpText.length() - pos - 1);
+ out += tmp + "<br />";
+ }
+ return out;
+ }
+}
+
+void HtmlExport::createFooter( QTextStream *ts )
+{
+ // FIXME: Implement this in a translatable way!
+ QString trailer = i18n("This page was created ");
+
+/* bool hasPerson = false;
+ bool hasCredit = false;
+ bool hasCreditURL = false;
+ QString mail, name, credit, creditURL;*/
+ if (!mSettings->eMail().isEmpty()) {
+ if (!mSettings->name().isEmpty())
+ trailer += i18n("by <a href=\"mailto:%1\">%2</a> ").arg( mSettings->eMail() ).arg( mSettings->name() );
+ else
+ trailer += i18n("by <a href=\"mailto:%1\">%2</a> ").arg( mSettings->eMail() ).arg( mSettings->eMail() );
+ } else {
+ if (!mSettings->name().isEmpty())
+ trailer += i18n("by %1 ").arg( mSettings->name() );
+ }
+ if (!mSettings->creditName().isEmpty()) {
+ if (!mSettings->creditURL().isEmpty())
+ trailer += i18n("with <a href=\"%1\">%2</a>")
+ .arg( mSettings->creditURL() )
+ .arg( mSettings->creditName() );
+ else
+ trailer += i18n("with %1").arg( mSettings->creditName() );
+ }
+ *ts << "<p>" << trailer << "</p>\n";
+}
+
+
+QString HtmlExport::cleanChars(const QString &text)
+{
+ QString txt = text;
+ txt = txt.replace( "&", "&amp;" );
+ txt = txt.replace( "<", "&lt;" );
+ txt = txt.replace( ">", "&gt;" );
+ txt = txt.replace( "\"", "&quot;" );
+ txt = txt.replace( QString::fromUtf8("ä"), "&auml;" );
+ txt = txt.replace( QString::fromUtf8("á"), "&aacute;" );
+ txt = txt.replace( QString::fromUtf8("à"), "&agrave;" );
+ txt = txt.replace( QString::fromUtf8("â"), "&acirc;" );
+ txt = txt.replace( QString::fromUtf8("Ä"), "&Auml;" );
+ txt = txt.replace( QString::fromUtf8("ó"), "&oacute;" );
+ txt = txt.replace( QString::fromUtf8("ô"), "&ocirc;" );
+ txt = txt.replace( QString::fromUtf8("ö"), "&ouml;" );
+ txt = txt.replace( QString::fromUtf8("Ö"), "&Ouml;" );
+ txt = txt.replace( QString::fromUtf8("ü"), "&uuml;" );
+ txt = txt.replace( QString::fromUtf8("Ü"), "&Uuml;" );
+ txt = txt.replace( QString::fromUtf8("ß"), "&szlig;" );
+ txt = txt.replace( QString::fromUtf8("€"), "&euro;" );
+ txt = txt.replace( QString::fromUtf8("é"), "&eacute;" );
+ txt = txt.replace( QString::fromUtf8("ë"), "&euml;" );
+ txt = txt.replace( QString::fromUtf8("è"), "&egrave;" );
+ txt = txt.replace( QString::fromUtf8("ñ"), "&ntilde;" );
+ txt = txt.replace( QString::fromUtf8("ç"), "&ccedil;" );
+
+ return txt;
+}
+
+QString HtmlExport::styleSheet() const
+{
+ if ( !mSettings->styleSheet().isEmpty() )
+ return mSettings->styleSheet();
+
+ QString css;
+
+ if ( QApplication::reverseLayout() ) {
+ css += " body { background-color:white; color:black; direction: rtl }\n";
+ css += " td { text-align:center; background-color:#eee }\n";
+ css += " th { text-align:center; background-color:#228; color:white }\n";
+ css += " td.sumdone { background-color:#ccc }\n";
+ css += " td.done { background-color:#ccc }\n";
+ css += " td.subhead { text-align:center; background-color:#ccf }\n";
+ css += " td.datehead { text-align:center; background-color:#ccf }\n";
+ css += " td.space { background-color:white }\n";
+ css += " td.dateholiday { color:red }\n";
+ } else {
+ css += " body { background-color:white; color:black }\n";
+ css += " td { text-align:center; background-color:#eee }\n";
+ css += " th { text-align:center; background-color:#228; color:white }\n";
+ css += " td.sum { text-align:left }\n";
+ css += " td.sumdone { text-align:left; background-color:#ccc }\n";
+ css += " td.done { background-color:#ccc }\n";
+ css += " td.subhead { text-align:center; background-color:#ccf }\n";
+ css += " td.datehead { text-align:center; background-color:#ccf }\n";
+ css += " td.space { background-color:white }\n";
+ css += " td.date { text-align:left }\n";
+ css += " td.dateholiday { text-align:left; color:red }\n";
+ }
+
+ return css;
+}
+
+
+void HtmlExport::addHoliday( const QDate &date, const QString &name)
+{
+ if ( mHolidayMap[date].isEmpty() ) {
+ mHolidayMap[date] = name;
+ } else {
+ mHolidayMap[date] = i18n("list of holidays", "%1, %2").arg(mHolidayMap[date]).arg(name);
+ }
+}
+
+QDate HtmlExport::fromDate() const
+{
+ return mSettings->dateStart().date();
+}
+
+QDate HtmlExport::toDate() const
+{
+ return mSettings->dateEnd().date();
+}
diff --git a/libkcal/htmlexport.h b/libkcal/htmlexport.h
new file mode 100644
index 00000000..c1642590
--- /dev/null
+++ b/libkcal/htmlexport.h
@@ -0,0 +1,101 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2000-2003 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_HTMLEXPORT_H
+#define KCAL_HTMLEXPORT_H
+
+#include <qstring.h>
+#include <qdatetime.h>
+#include <qmap.h>
+
+#include <libkcal/calendar.h>
+#include <libkcal/htmlexportsettings.h>
+
+#include "libkcal_export.h"
+
+class QFile;
+class QTextStream;
+
+namespace KCal {
+
+/**
+ This class provides the functions to export a calendar as an HTML page.
+*/
+class KDE_EXPORT HtmlExport
+{
+ public:
+ /**
+ Create new HTML exporter for calendar.
+ */
+ HtmlExport( Calendar *calendar, HTMLExportSettings *settings );
+ virtual ~HtmlExport() {}
+
+ /**
+ Writes out the calendar in HTML format.
+ */
+ bool save( const QString &fileName = QString::null );
+
+ /**
+ Writes out calendar to text stream.
+ */
+ bool save( QTextStream * );
+
+ void addHoliday( const QDate &date, const QString &name );
+
+ protected:
+ void createWeekView( QTextStream *ts );
+ void createMonthView( QTextStream *ts );
+ void createEventList( QTextStream *ts );
+ void createTodoList( QTextStream *ts );
+ void createJournalView( QTextStream *ts );
+ void createFreeBusyView( QTextStream *ts );
+
+ void createTodo( QTextStream *ts, Todo *todo);
+ void createEvent( QTextStream *ts, Event *event, QDate date,
+ bool withDescription = true);
+ void createFooter( QTextStream *ts );
+
+ bool checkSecrecy( Incidence * );
+
+ void formatLocation( QTextStream *ts, Incidence *event );
+ void formatCategories( QTextStream *ts, Incidence *event );
+ void formatAttendees( QTextStream *ts, Incidence *event );
+
+ QString breakString( const QString &text );
+
+ QDate fromDate() const;
+ QDate toDate() const;
+ QString styleSheet() const;
+
+ private:
+ QString cleanChars( const QString &txt );
+
+ Calendar *mCalendar;
+ HTMLExportSettings *mSettings;
+ QMap<QDate,QString> mHolidayMap;
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/htmlexportsettings.kcfg b/libkcal/htmlexportsettings.kcfg
new file mode 100644
index 00000000..0aa2ce0d
--- /dev/null
+++ b/libkcal/htmlexportsettings.kcfg
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+ <kcfgfile name="libkcal_htmlexportrc">
+ <parameter name="application" />
+ </kcfgfile>
+
+ <group name="$(application)-General">
+ <entry type="String" key="Name">
+ <label>Full name of the calendar owner</label>
+ <whatsthis>WhatsThis text for FullName setting</whatsthis>
+ </entry>
+ <entry type="String" key="EMail">
+ <label>Email of the calendar owner</label>
+ <whatsthis>WhatsThis text for Email setting</whatsthis>
+ </entry>
+ <entry type="String" key="Credit Name">
+ <label>Creator application</label>
+ <whatsthis>Creator application of the calendar</whatsthis>
+ </entry>
+ <entry type="String" key="Credit URL">
+ <label>Creator URL</label>
+ <whatsthis>URL of the creator application of the calendar.</whatsthis>
+ <default></default>
+ </entry>
+ <entry type="String" key="Page Title">
+ <label>Page Title</label>
+ <default code="true">i18n("Calendar")</default>
+ </entry>
+
+ <entry type="DateTime" key="Date Start">
+ <label>Date start</label>
+ <whatsthis>First day of the range that shall be exported to HTML.</whatsthis>
+ </entry>
+ <entry type="DateTime" key="Date End">
+ <label>Date end</label>
+ <whatsthis>Last day of the range that shall be exported to HTML.</whatsthis>
+ </entry>
+
+ <entry type="Path" key="Output File">
+ <label>Output filename</label>
+ <whatsthis>The output file name for the HTML export.</whatsthis>
+ <default>$HOME/calendar.html</default>
+ </entry>
+ <entry type="String" key="Style Sheet">
+ <label>Style sheet</label>
+ <whatsthis>CSS style sheet to be used by the final HTML page. This string contains the actual contents of the CSS, not a path to the style sheet.</whatsthis>
+ </entry>
+
+ <entry type="Bool" key="Exclude Private">
+ <label>Exclude private incidences from the export</label>
+ <default>true</default>
+ </entry>
+ <entry type="Bool" key="Exclude Confidential">
+ <label>Exclude confidential incidences from the export</label>
+ <default>true</default>
+ </entry>
+
+ </group>
+
+ <group name="$(application)-Events">
+ <entry type="Bool" key="Event View">
+ <label>Export events as list</label>
+ <default>false</default>
+ </entry>
+ <entry type="Bool" key="Month View">
+ <label>Export in month view</label>
+ <default>true</default>
+ </entry>
+ <entry type="Bool" key="Week View">
+ <label>Export in week view</label>
+ <default>false</default>
+ </entry>
+ <entry type="String" name="EventTitle" key="Title">
+ <label>Title of the calendar</label>
+ <default code="true">i18n("Calendar")</default>
+ </entry>
+
+ <entry type="Bool" name="EventLocation" key="Export Location">
+ <label>Export location of the events</label>
+ <default>true</default>
+ </entry>
+ <entry type="Bool" name="EventCategories" key="Export Categories">
+ <label>Export categories of the events</label>
+ <default>true</default>
+ </entry>
+ <entry type="Bool" name="EventAttendees" key="Export Attendees">
+ <label>Export attendees of the events</label>
+ <default>false</default>
+ </entry>
+
+ </group>
+
+ <group name="$(application)-Todos">
+ <entry type="Bool" key="Todo View">
+ <label>Export to-do list</label>
+ <default>true</default>
+ </entry>
+ <entry type="String" key="TodoList Title">
+ <label>Title of the to-do list</label>
+ <default code="true">i18n("To-do List")</default>
+ </entry>
+
+ <entry type="Bool" name="TaskDueDate" key="Export Due Date">
+ <label>Export due dates of the to-dos</label>
+ <default>true</default>
+ </entry>
+ <entry type="Bool" name="TaskLocation" key="Export Location">
+ <label>Export location of the to-dos</label>
+ <default>true</default>
+ </entry>
+ <entry type="Bool" name="TaskCategories" key="Export Categories">
+ <label>Export categories of the to-dos</label>
+ <default>true</default>
+ </entry>
+ <entry type="Bool" name="TaskAttendees" key="Export Attendees">
+ <label>Export attendees of the to-dos</label>
+ <default>false</default>
+ </entry>
+
+ </group>
+
+ <group name="$(application)-Journals">
+ <entry type="Bool" key="Journal View">
+ <label>Export journals</label>
+ <default>false</default>
+ </entry>
+ <entry type="String" key="Journal Title">
+ <label>Title of the journal list</label>
+ <default code="true">i18n("Journals")</default>
+ </entry>
+ </group>
+
+ <group name="$(application)-FreeBusy">
+ <entry type="Bool" key="FreeBusy View">
+ <label>Export journals</label>
+ <default>false</default>
+ </entry>
+ <entry type="String" name="FreeBusyTitle" key="Free/Busy Title">
+ <label>Title of the free/busy list</label>
+ <default code="true">i18n("Busy times")</default>
+ </entry>
+ </group>
+
+</kcfg>
diff --git a/libkcal/htmlexportsettings.kcfgc b/libkcal/htmlexportsettings.kcfgc
new file mode 100644
index 00000000..62c52615
--- /dev/null
+++ b/libkcal/htmlexportsettings.kcfgc
@@ -0,0 +1,10 @@
+# Code generation options for kconfig_compiler
+File=htmlexportsettings.kcfg
+ClassName=HTMLExportSettings
+Singleton=false
+Mutators=true
+MemberVariables=public
+GlobalEnums=true
+ItemAccessors=true
+SetUserTexts=true
+Visibility=KDE_EXPORT
diff --git a/libkcal/icaldrag.cpp b/libkcal/icaldrag.cpp
new file mode 100644
index 00000000..ad7e9549
--- /dev/null
+++ b/libkcal/icaldrag.cpp
@@ -0,0 +1,59 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 1998 Preston Brown <pbrown@kde.org>
+ Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "icaldrag.h"
+
+#include "icalformat.h"
+
+#include <kdebug.h>
+
+using namespace KCal;
+
+ICalDrag::ICalDrag( Calendar *cal, QWidget *parent, const char *name )
+ : QStoredDrag( "text/calendar", parent, name )
+{
+ ICalFormat icf;
+ QString scal = icf.toString( cal );
+
+ setEncodedData( scal.utf8() );
+}
+
+bool ICalDrag::canDecode( QMimeSource *me )
+{
+ return me->provides( "text/calendar" );
+}
+
+bool ICalDrag::decode( QMimeSource *de, Calendar *cal )
+{
+ bool success = false;
+
+ QByteArray payload = de->encodedData( "text/calendar" );
+ if ( payload.size() ) {
+ QString txt = QString::fromUtf8( payload.data() );
+
+ ICalFormat icf;
+ success = icf.fromString( cal, txt );
+ }
+
+ return success;
+}
+
diff --git a/libkcal/icaldrag.h b/libkcal/icaldrag.h
new file mode 100644
index 00000000..cddc9894
--- /dev/null
+++ b/libkcal/icaldrag.h
@@ -0,0 +1,60 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 1998 Preston Brown <pbrown@kde.org>
+ Copyright (c) 2001-2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef KCAL_ICALDRAG_H
+#define KCAL_ICALDRAG_H
+
+#include <qdragobject.h>
+#include "calendar.h"
+#include "libkcal_export.h"
+
+namespace KCal {
+
+/**
+ iCalendar drag&drop class.
+*/
+class LIBKCAL_EXPORT ICalDrag : public QStoredDrag
+{
+ public:
+ /**
+ Create a drag&drop object for iCalendar component \a ical.
+ */
+ ICalDrag( Calendar *cal, QWidget *parent = 0, const char *name = 0 );
+ ~ICalDrag() {};
+
+ /**
+ Return, if drag&drop object can be decode to iCalendar.
+ */
+ static bool canDecode( QMimeSource * );
+ /**
+ Decode drag&drop object to iCalendar component \a cal.
+ */
+ static bool decode( QMimeSource *e, Calendar *cal );
+
+ private:
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/icalformat.cpp b/libkcal/icalformat.cpp
new file mode 100644
index 00000000..0c4295cc
--- /dev/null
+++ b/libkcal/icalformat.cpp
@@ -0,0 +1,580 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qdatetime.h>
+#include <qstring.h>
+#include <qptrlist.h>
+#include <qregexp.h>
+#include <qclipboard.h>
+#include <qfile.h>
+#include <qtextstream.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+
+extern "C" {
+ #include <ical.h>
+ #include <icalss.h>
+ #include <icalparser.h>
+ #include <icalrestriction.h>
+ #include <icalmemory.h>
+}
+
+#include "calendar.h"
+#include "calendarlocal.h"
+#include "journal.h"
+
+#include "icalformat.h"
+#include "icalformatimpl.h"
+#include <ksavefile.h>
+
+#include <stdio.h>
+
+#define _ICAL_VERSION "2.0"
+
+using namespace KCal;
+
+ICalFormat::ICalFormat() : mImpl(0)
+{
+ setImplementation( new ICalFormatImpl( this ) );
+
+ mTimeZoneId = "UTC";
+ mUtc = true;
+}
+
+ICalFormat::~ICalFormat()
+{
+ delete mImpl;
+}
+
+void ICalFormat::setImplementation( ICalFormatImpl *impl )
+{
+ if ( mImpl ) delete mImpl;
+ mImpl = impl;
+}
+
+#if defined(_AIX) && defined(open)
+#undef open
+#endif
+
+bool ICalFormat::load( Calendar *calendar, const QString &fileName)
+{
+ kdDebug(5800) << "ICalFormat::load() " << fileName << endl;
+
+ clearException();
+
+ QFile file( fileName );
+ if (!file.open( IO_ReadOnly ) ) {
+ kdDebug(5800) << "ICalFormat::load() load error" << endl;
+ setException(new ErrorFormat(ErrorFormat::LoadError));
+ return false;
+ }
+ QTextStream ts( &file );
+ ts.setEncoding( QTextStream::Latin1 );
+ QString text = ts.read();
+ file.close();
+
+ if ( text.stripWhiteSpace().isEmpty() ) // empty files are valid
+ return true;
+ else
+ return fromRawString( calendar, text.latin1() );
+}
+
+
+bool ICalFormat::save( Calendar *calendar, const QString &fileName )
+{
+ kdDebug(5800) << "ICalFormat::save(): " << fileName << endl;
+
+ clearException();
+
+ QString text = toString( calendar );
+
+ if ( text.isNull() ) return false;
+
+ // Write backup file
+ KSaveFile::backupFile( fileName );
+
+ KSaveFile file( fileName );
+ if ( file.status() != 0 ) {
+ kdDebug(5800) << "ICalFormat::save() errno: " << strerror( file.status() )
+ << endl;
+ setException( new ErrorFormat( ErrorFormat::SaveError,
+ i18n( "Error saving to '%1'." ).arg( fileName ) ) );
+ return false;
+ }
+
+ // Convert to UTF8 and save
+ QCString textUtf8 = text.utf8();
+ file.file()->writeBlock( textUtf8.data(), textUtf8.size() - 1 );
+
+ if ( !file.close() ) {
+ kdDebug(5800) << "KSaveFile: close: status was " << file.status() << ". See errno.h." << endl;
+ setException(new ErrorFormat(ErrorFormat::SaveError,
+ i18n("Could not save '%1'").arg(fileName)));
+ return false;
+ }
+
+ return true;
+}
+
+bool ICalFormat::fromString( Calendar *cal, const QString &text )
+{
+ return fromRawString( cal, text.utf8() );
+}
+
+bool ICalFormat::fromRawString( Calendar *cal, const QCString &text )
+{
+ setTimeZone( cal->timeZoneId(), !cal->isLocalTime() );
+
+ // Get first VCALENDAR component.
+ // TODO: Handle more than one VCALENDAR or non-VCALENDAR top components
+ icalcomponent *calendar;
+
+ // Let's defend const correctness until the very gates of hell^Wlibical
+ calendar = icalcomponent_new_from_string( const_cast<char*>( (const char*)text ) );
+ // kdDebug(5800) << "Error: " << icalerror_perror() << endl;
+ if (!calendar) {
+ kdDebug(5800) << "ICalFormat::load() parse error" << endl;
+ setException(new ErrorFormat(ErrorFormat::ParseErrorIcal));
+ return false;
+ }
+
+ bool success = true;
+
+ if (icalcomponent_isa(calendar) == ICAL_XROOT_COMPONENT) {
+ icalcomponent *comp;
+ for ( comp = icalcomponent_get_first_component(calendar, ICAL_VCALENDAR_COMPONENT);
+ comp != 0; comp = icalcomponent_get_next_component(calendar, ICAL_VCALENDAR_COMPONENT) ) {
+ // put all objects into their proper places
+ if ( !mImpl->populate( cal, comp ) ) {
+ kdDebug(5800) << "ICalFormat::load(): Could not populate calendar" << endl;
+ if ( !exception() ) {
+ setException(new ErrorFormat(ErrorFormat::ParseErrorKcal));
+ }
+ success = false;
+ } else {
+ mLoadedProductId = mImpl->loadedProductId();
+ }
+ icalcomponent_free( comp );
+ }
+ } else if (icalcomponent_isa(calendar) != ICAL_VCALENDAR_COMPONENT) {
+ kdDebug(5800) << "ICalFormat::load(): No VCALENDAR component found" << endl;
+ setException(new ErrorFormat(ErrorFormat::NoCalendar));
+ success = false;
+ } else {
+ // put all objects into their proper places
+ if ( !mImpl->populate( cal, calendar ) ) {
+ kdDebug(5800) << "ICalFormat::load(): Could not populate calendar" << endl;
+ if ( !exception() ) {
+ setException(new ErrorFormat(ErrorFormat::ParseErrorKcal));
+ }
+ success = false;
+ } else
+ mLoadedProductId = mImpl->loadedProductId();
+ }
+
+ icalcomponent_free( calendar );
+ icalmemory_free_ring();
+
+ return success;
+}
+
+Incidence *ICalFormat::fromString( const QString &text )
+{
+ CalendarLocal cal( mTimeZoneId );
+ fromString(&cal, text);
+
+ Incidence *ical = 0;
+ Event::List elist = cal.events();
+ if ( elist.count() > 0 ) {
+ ical = elist.first();
+ } else {
+ Todo::List tlist = cal.todos();
+ if ( tlist.count() > 0 ) {
+ ical = tlist.first();
+ } else {
+ Journal::List jlist = cal.journals();
+ if ( jlist.count() > 0 ) {
+ ical = jlist.first();
+ }
+ }
+ }
+
+ return ical ? ical->clone() : 0;
+}
+
+QString ICalFormat::toString( Calendar *cal )
+{
+ setTimeZone( cal->timeZoneId(), !cal->isLocalTime() );
+
+ icalcomponent *calendar = mImpl->createCalendarComponent(cal);
+
+ icalcomponent *component;
+
+ // todos
+ Todo::List todoList = cal->rawTodos();
+ Todo::List::ConstIterator it;
+ for( it = todoList.begin(); it != todoList.end(); ++it ) {
+// kdDebug(5800) << "ICalFormat::toString() write todo "
+// << (*it)->uid() << endl;
+ component = mImpl->writeTodo( *it );
+ icalcomponent_add_component( calendar, component );
+ }
+
+ // events
+ Event::List events = cal->rawEvents();
+ Event::List::ConstIterator it2;
+ for( it2 = events.begin(); it2 != events.end(); ++it2 ) {
+// kdDebug(5800) << "ICalFormat::toString() write event "
+// << (*it2)->uid() << endl;
+ component = mImpl->writeEvent( *it2 );
+ icalcomponent_add_component( calendar, component );
+ }
+
+ // journals
+ Journal::List journals = cal->journals();
+ Journal::List::ConstIterator it3;
+ for( it3 = journals.begin(); it3 != journals.end(); ++it3 ) {
+ kdDebug(5800) << "ICalFormat::toString() write journal "
+ << (*it3)->uid() << endl;
+ component = mImpl->writeJournal( *it3 );
+ icalcomponent_add_component( calendar, component );
+ }
+
+ QString text = QString::fromUtf8( icalcomponent_as_ical_string( calendar ) );
+
+ icalcomponent_free( calendar );
+ icalmemory_free_ring();
+
+ if (!text) {
+ setException(new ErrorFormat(ErrorFormat::SaveError,
+ i18n("libical error")));
+ return QString::null;
+ }
+
+ return text;
+}
+
+QString ICalFormat::toICalString( Incidence *incidence )
+{
+ CalendarLocal cal( mTimeZoneId );
+ cal.addIncidence( incidence->clone() );
+ return toString( &cal );
+}
+
+QString ICalFormat::toString( Incidence *incidence )
+{
+ icalcomponent *component;
+
+ component = mImpl->writeIncidence( incidence );
+
+ QString text = QString::fromUtf8( icalcomponent_as_ical_string( component ) );
+
+ icalcomponent_free( component );
+
+ return text;
+}
+
+QString ICalFormat::toString( RecurrenceRule *recurrence )
+{
+ icalproperty *property;
+ property = icalproperty_new_rrule( mImpl->writeRecurrenceRule( recurrence ) );
+ QString text = QString::fromUtf8( icalproperty_as_ical_string( property ) );
+ icalproperty_free( property );
+ return text;
+}
+
+bool ICalFormat::fromString( RecurrenceRule * recurrence, const QString& rrule )
+{
+ if ( !recurrence ) return false;
+ bool success = true;
+ icalerror_clear_errno();
+ struct icalrecurrencetype recur = icalrecurrencetype_from_string( rrule.latin1() );
+ if ( icalerrno != ICAL_NO_ERROR ) {
+ kdDebug(5800) << "Recurrence parsing error: " << icalerror_strerror( icalerrno ) << endl;
+ success = false;
+ }
+
+ if ( success ) {
+ mImpl->readRecurrence( recur, recurrence );
+ }
+
+ return success;
+}
+
+
+QString ICalFormat::createScheduleMessage(IncidenceBase *incidence,
+ Scheduler::Method method)
+{
+ icalcomponent *message = 0;
+
+ // Handle scheduling ID being present
+ if ( incidence->type() == "Event" || incidence->type() == "Todo" ) {
+ Incidence* i = static_cast<Incidence*>( incidence );
+ if ( i->schedulingID() != i->uid() ) {
+ // We have a separation of scheduling ID and UID
+ i = i->clone();
+ i->setUid( i->schedulingID() );
+ i->setSchedulingID( QString::null );
+
+ // Build the message with the cloned incidence
+ message = mImpl->createScheduleComponent( i, method );
+
+ // And clean up
+ delete i;
+ }
+ }
+
+ if ( message == 0 )
+ message = mImpl->createScheduleComponent(incidence,method);
+
+ // FIXME TODO: Don't we have to free message? What about the ical_string? MEMLEAK
+ QString messageText = QString::fromUtf8( icalcomponent_as_ical_string(message) );
+
+#if 0
+ kdDebug(5800) << "ICalFormat::createScheduleMessage: message START\n"
+ << messageText
+ << "ICalFormat::createScheduleMessage: message END" << endl;
+#endif
+
+ return messageText;
+}
+
+FreeBusy *ICalFormat::parseFreeBusy( const QString &str )
+{
+ clearException();
+
+ icalcomponent *message;
+ message = icalparser_parse_string( str.utf8() );
+
+ if ( !message ) return 0;
+
+ FreeBusy *freeBusy = 0;
+
+ icalcomponent *c;
+ for ( c = icalcomponent_get_first_component( message, ICAL_VFREEBUSY_COMPONENT );
+ c != 0; c = icalcomponent_get_next_component( message, ICAL_VFREEBUSY_COMPONENT ) ) {
+ FreeBusy *fb = mImpl->readFreeBusy( c );
+
+ if ( freeBusy ) {
+ freeBusy->merge( fb );
+ delete fb;
+ } else {
+ freeBusy = fb;
+ }
+ }
+
+ if ( !freeBusy )
+ kdDebug(5800) << "ICalFormat:parseFreeBusy: object is not a freebusy."
+ << endl;
+ return freeBusy;
+}
+
+ScheduleMessage *ICalFormat::parseScheduleMessage( Calendar *cal,
+ const QString &messageText )
+{
+ setTimeZone( cal->timeZoneId(), !cal->isLocalTime() );
+ clearException();
+
+ if (messageText.isEmpty())
+ {
+ setException( new ErrorFormat( ErrorFormat::ParseErrorKcal, QString::fromLatin1( "messageText was empty, unable to parse into a ScheduleMessage" ) ) );
+ return 0;
+ }
+ // TODO FIXME: Don't we have to ical-free message??? MEMLEAK
+ icalcomponent *message;
+ message = icalparser_parse_string(messageText.utf8());
+
+ if (!message)
+ {
+ setException( new ErrorFormat( ErrorFormat::ParseErrorKcal, QString::fromLatin1( "icalparser was unable to parse messageText into a ScheduleMessage" ) ) );
+ return 0;
+ }
+
+ icalproperty *m = icalcomponent_get_first_property(message,
+ ICAL_METHOD_PROPERTY);
+ if (!m)
+ {
+ setException( new ErrorFormat( ErrorFormat::ParseErrorKcal, QString::fromLatin1( "message didn't contain an ICAL_METHOD_PROPERTY" ) ) );
+ return 0;
+ }
+
+ icalcomponent *c;
+
+ IncidenceBase *incidence = 0;
+ c = icalcomponent_get_first_component(message,ICAL_VEVENT_COMPONENT);
+ if (c) {
+ icalcomponent *ctz = icalcomponent_get_first_component(message,ICAL_VTIMEZONE_COMPONENT);
+ incidence = mImpl->readEvent(c, ctz);
+ }
+
+ if (!incidence) {
+ c = icalcomponent_get_first_component(message,ICAL_VTODO_COMPONENT);
+ if (c) {
+ incidence = mImpl->readTodo(c);
+ }
+ }
+
+ if (!incidence) {
+ c = icalcomponent_get_first_component(message,ICAL_VJOURNAL_COMPONENT);
+ if (c) {
+ incidence = mImpl->readJournal(c);
+ }
+ }
+
+ if (!incidence) {
+ c = icalcomponent_get_first_component(message,ICAL_VFREEBUSY_COMPONENT);
+ if (c) {
+ incidence = mImpl->readFreeBusy(c);
+ }
+ }
+
+
+
+ if (!incidence) {
+ kdDebug(5800) << "ICalFormat:parseScheduleMessage: object is not a freebusy, event, todo or journal" << endl;
+ setException( new ErrorFormat( ErrorFormat::ParseErrorKcal, QString::fromLatin1( "object is not a freebusy, event, todo or journal" ) ) );
+ return 0;
+ }
+
+ kdDebug(5800) << "ICalFormat::parseScheduleMessage() getting method..." << endl;
+
+ icalproperty_method icalmethod = icalproperty_get_method(m);
+ Scheduler::Method method;
+
+ switch (icalmethod) {
+ case ICAL_METHOD_PUBLISH:
+ method = Scheduler::Publish;
+ break;
+ case ICAL_METHOD_REQUEST:
+ method = Scheduler::Request;
+ break;
+ case ICAL_METHOD_REFRESH:
+ method = Scheduler::Refresh;
+ break;
+ case ICAL_METHOD_CANCEL:
+ method = Scheduler::Cancel;
+ break;
+ case ICAL_METHOD_ADD:
+ method = Scheduler::Add;
+ break;
+ case ICAL_METHOD_REPLY:
+ method = Scheduler::Reply;
+ break;
+ case ICAL_METHOD_COUNTER:
+ method = Scheduler::Counter;
+ break;
+ case ICAL_METHOD_DECLINECOUNTER:
+ method = Scheduler::Declinecounter;
+ break;
+ default:
+ method = Scheduler::NoMethod;
+ kdDebug(5800) << "ICalFormat::parseScheduleMessage(): Unknow method" << endl;
+ break;
+ }
+
+ kdDebug(5800) << "ICalFormat::parseScheduleMessage() restriction..." << endl;
+
+ if (!icalrestriction_check(message)) {
+ kdWarning(5800) << k_funcinfo << endl << "libkcal reported a problem while parsing:" << endl;
+ kdWarning(5800) << Scheduler::translatedMethodName(method) + ": " + mImpl->extractErrorProperty(c)<< endl;
+ /*
+ setException(new ErrorFormat(ErrorFormat::Restriction,
+ Scheduler::translatedMethodName(method) + ": " +
+ mImpl->extractErrorProperty(c)));
+ delete incidence;
+ return 0;
+ */
+ }
+ icalcomponent *calendarComponent = mImpl->createCalendarComponent(cal);
+
+ Incidence *existingIncidence =
+ cal->incidenceFromSchedulingID(incidence->uid());
+ if (existingIncidence) {
+ // TODO: check, if cast is required, or if it can be done by virtual funcs.
+ // TODO: Use a visitor for this!
+ if (existingIncidence->type() == "Todo") {
+ Todo *todo = static_cast<Todo *>(existingIncidence);
+ icalcomponent_add_component(calendarComponent,
+ mImpl->writeTodo(todo));
+ }
+ if (existingIncidence->type() == "Event") {
+ Event *event = static_cast<Event *>(existingIncidence);
+ icalcomponent_add_component(calendarComponent,
+ mImpl->writeEvent(event));
+ }
+ } else {
+ calendarComponent = 0;
+ }
+
+ kdDebug(5800) << "ICalFormat::parseScheduleMessage() classify..." << endl;
+
+ icalproperty_xlicclass result = icalclassify( message, calendarComponent,
+ (char *)"" );
+
+ kdDebug(5800) << "ICalFormat::parseScheduleMessage() returning..." << endl;
+ kdDebug(5800) << "ICalFormat::parseScheduleMessage(), result = " << result << endl;
+
+ ScheduleMessage::Status status;
+
+ switch (result) {
+ case ICAL_XLICCLASS_PUBLISHNEW:
+ status = ScheduleMessage::PublishNew;
+ break;
+ case ICAL_XLICCLASS_PUBLISHUPDATE:
+ status = ScheduleMessage::PublishUpdate;
+ break;
+ case ICAL_XLICCLASS_OBSOLETE:
+ status = ScheduleMessage::Obsolete;
+ break;
+ case ICAL_XLICCLASS_REQUESTNEW:
+ status = ScheduleMessage::RequestNew;
+ break;
+ case ICAL_XLICCLASS_REQUESTUPDATE:
+ status = ScheduleMessage::RequestUpdate;
+ break;
+ case ICAL_XLICCLASS_UNKNOWN:
+ default:
+ status = ScheduleMessage::Unknown;
+ break;
+ }
+
+ kdDebug(5800) << "ICalFormat::parseScheduleMessage(), status = " << status << endl;
+// TODO FIXME: Don't we have to free calendarComponent??? MEMLEAK
+
+ return new ScheduleMessage(incidence,method,status);
+}
+
+void ICalFormat::setTimeZone( const QString &id, bool utc )
+{
+ mTimeZoneId = id;
+ mUtc = utc;
+}
+
+QString ICalFormat::timeZoneId() const
+{
+ return mTimeZoneId;
+}
+
+bool ICalFormat::utc() const
+{
+ return mUtc;
+}
diff --git a/libkcal/icalformat.h b/libkcal/icalformat.h
new file mode 100644
index 00000000..b7460006
--- /dev/null
+++ b/libkcal/icalformat.h
@@ -0,0 +1,147 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001-2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_ICALFORMAT_H
+#define KCAL_ICALFORMAT_H
+
+#include <qstring.h>
+
+#include "scheduler.h"
+
+#include "calformat.h"
+#include <kdepimmacros.h>
+
+namespace KCal {
+
+class ICalFormatImpl;
+class FreeBusy;
+
+/**
+ This class implements the iCalendar format. It provides methods for
+ loading/saving/converting iCalendar format data into the internal KOrganizer
+ representation as Calendar and Events.
+
+ @short iCalendar format implementation
+*/
+class LIBKCAL_EXPORT ICalFormat : public CalFormat
+{
+ public:
+ ICalFormat();
+ virtual ~ICalFormat();
+
+ /**
+ Loads a calendar on disk in iCalendar format into calendar.
+ Returns true if successful, else returns false. Provides more error
+ information by exception().
+
+ @param calendar Calendar object to be filled.
+ @param fileName The name of the calendar file on disk.
+ */
+ bool load( Calendar * calendar, const QString &fileName );
+ /**
+ Writes out the calendar to disk in iCalendar format. Returns true if
+ successful and false on error.
+
+ @param calendar The Calendar object to be written.
+ @param fileName The name of the calendar file on disk.
+ */
+ bool save( Calendar * calendar, const QString &fileName );
+
+ /**
+ Parse string and populate calendar with that information.
+ */
+ bool fromString( Calendar * calendar, const QString & );
+
+ /**
+ Parse string and return first ical component.
+ */
+ Incidence *fromString( const QString & );
+
+ /**
+ Return calendar information as string.
+ */
+ QString toString( Calendar * );
+ /**
+ Return incidence as full iCalendar formatted text.
+ */
+ QString toICalString( Incidence * );
+ /**
+ Return incidence as iCalendar formatted text.
+ */
+ QString toString( Incidence * );
+ /**
+ Return recurrence rule as iCalendar formatted text.
+ */
+ QString toString( RecurrenceRule * );
+ /**
+ Parse string and fill recurrence object with
+ that information
+ */
+ bool fromString ( RecurrenceRule *, const QString& );
+
+ /**
+ Create a scheduling message for event @p e using method @p m.
+ */
+ QString createScheduleMessage(IncidenceBase *e,Scheduler::Method m);
+ /**
+ Parse scheduling message provided as string @p s.
+ */
+ ScheduleMessage *parseScheduleMessage( Calendar *, const QString &s);
+
+ /**
+ Parse FREEBUSY object.
+ */
+ FreeBusy *parseFreeBusy( const QString & );
+
+ /**
+ Set id of used time zone and whether this time zone is UTC or not.
+ */
+ void setTimeZone( const QString &id, bool utc );
+ /**
+ Return id string of timezone used.
+ */
+ QString timeZoneId() const;
+ /**
+ Return true if timezone used is UTC, otherwise return false.
+ */
+ bool utc() const;
+
+ protected:
+ /**
+ Parse string and return first ical component of a raw byte array of
+ a utf8 encoded string. This is an overload used for efficiency reading
+ to avoid utf8 conversions, which are expensive, when reading from disk.
+ */
+ bool fromRawString( Calendar * calendar, const QCString & );
+ void setImplementation( ICalFormatImpl *impl );
+
+ private:
+ ICalFormatImpl *mImpl;
+
+ QString mTimeZoneId;
+ bool mUtc;
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/icalformatimpl.cpp b/libkcal/icalformatimpl.cpp
new file mode 100644
index 00000000..bd3b8e7b
--- /dev/null
+++ b/libkcal/icalformatimpl.cpp
@@ -0,0 +1,2203 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qdatetime.h>
+#include <qstring.h>
+#include <qptrlist.h>
+#include <qfile.h>
+#include <cstdlib>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kmdcodec.h>
+
+extern "C" {
+ #include <ical.h>
+ #include <icalparser.h>
+ #include <icalrestriction.h>
+}
+
+#include "calendar.h"
+#include "journal.h"
+#include "icalformat.h"
+#include "icalformatimpl.h"
+#include "compat.h"
+
+#define _ICAL_VERSION "2.0"
+
+using namespace KCal;
+
+/* Static helpers */
+static QDateTime ICalDate2QDate(const icaltimetype& t)
+{
+ // Outlook sends dates starting from 1601-01-01, but QDate()
+ // can only handle dates starting 1752-09-14.
+ const int year = (t.year>=1754) ? t.year : 1754;
+ return QDateTime(QDate(year,t.month,t.day), QTime(t.hour,t.minute,t.second));
+}
+
+static void _dumpIcaltime( const icaltimetype& t)
+{
+ kdDebug(5800) << "--- Y: " << t.year << " M: " << t.month << " D: " << t.day
+ << endl;
+ kdDebug(5800) << "--- H: " << t.hour << " M: " << t.minute << " S: " << t.second
+ << endl;
+ kdDebug(5800) << "--- isUtc: " << icaltime_is_utc( t )<< endl;
+ kdDebug(5800) << "--- zoneId: " << icaltimezone_get_tzid( const_cast<icaltimezone*>( t.zone ) )<< endl;
+}
+
+const int gSecondsPerMinute = 60;
+const int gSecondsPerHour = gSecondsPerMinute * 60;
+const int gSecondsPerDay = gSecondsPerHour * 24;
+const int gSecondsPerWeek = gSecondsPerDay * 7;
+
+ICalFormatImpl::ICalFormatImpl( ICalFormat *parent ) :
+ mParent( parent ), mCompat( new Compat )
+{
+}
+
+ICalFormatImpl::~ICalFormatImpl()
+{
+ delete mCompat;
+}
+
+class ICalFormatImpl::ToComponentVisitor : public IncidenceBase::Visitor
+{
+ public:
+ ToComponentVisitor( ICalFormatImpl *impl, Scheduler::Method m ) : mImpl( impl ), mComponent( 0 ), mMethod( m ) {}
+
+ bool visit( Event *e ) { mComponent = mImpl->writeEvent( e ); return true; }
+ bool visit( Todo *e ) { mComponent = mImpl->writeTodo( e ); return true; }
+ bool visit( Journal *e ) { mComponent = mImpl->writeJournal( e ); return true; }
+ bool visit( FreeBusy *fb ) { mComponent = mImpl->writeFreeBusy( fb, mMethod ); return true; }
+
+ icalcomponent *component() { return mComponent; }
+
+ private:
+ ICalFormatImpl *mImpl;
+ icalcomponent *mComponent;
+ Scheduler::Method mMethod;
+};
+
+icalcomponent *ICalFormatImpl::writeIncidence( IncidenceBase *incidence, Scheduler::Method method )
+{
+ ToComponentVisitor v( this, method );
+ if ( incidence->accept(v) )
+ return v.component();
+ else return 0;
+}
+
+icalcomponent *ICalFormatImpl::writeTodo(Todo *todo)
+{
+ QString tmpStr;
+ QStringList tmpStrList;
+
+ icalcomponent *vtodo = icalcomponent_new(ICAL_VTODO_COMPONENT);
+
+ writeIncidence(vtodo,todo);
+
+ // due date
+ if (todo->hasDueDate()) {
+ icaltimetype due;
+ if (todo->doesFloat()) {
+ due = writeICalDate(todo->dtDue(true).date());
+ } else {
+ due = writeICalDateTime(todo->dtDue(true));
+ }
+ icalcomponent_add_property(vtodo,icalproperty_new_due(due));
+ }
+
+ // start time
+ if ( todo->hasStartDate() || todo->doesRecur() ) {
+ icaltimetype start;
+ if (todo->doesFloat()) {
+// kdDebug(5800) << " Incidence " << todo->summary() << " floats." << endl;
+ start = writeICalDate(todo->dtStart(true).date());
+ } else {
+// kdDebug(5800) << " incidence " << todo->summary() << " has time." << endl;
+ start = writeICalDateTime(todo->dtStart(true));
+ }
+ icalcomponent_add_property(vtodo,icalproperty_new_dtstart(start));
+ }
+
+ // completion date
+ if (todo->isCompleted()) {
+ if (!todo->hasCompletedDate()) {
+ // If todo was created by KOrganizer <2.2 it has no correct completion
+ // date. Set it to now.
+ todo->setCompleted(QDateTime::currentDateTime());
+ }
+ icaltimetype completed = writeICalDateTime(todo->completed());
+ icalcomponent_add_property(vtodo,icalproperty_new_completed(completed));
+ }
+
+ icalcomponent_add_property(vtodo,
+ icalproperty_new_percentcomplete(todo->percentComplete()));
+
+ if( todo->doesRecur() ) {
+ icalcomponent_add_property(vtodo,
+ icalproperty_new_recurrenceid( writeICalDateTime( todo->dtDue())));
+ }
+
+ return vtodo;
+}
+
+icalcomponent *ICalFormatImpl::writeEvent(Event *event)
+{
+#if 0
+ kdDebug(5800) << "Write Event '" << event->summary() << "' (" << event->uid()
+ << ")" << endl;
+#endif
+
+ QString tmpStr;
+ QStringList tmpStrList;
+
+ icalcomponent *vevent = icalcomponent_new(ICAL_VEVENT_COMPONENT);
+
+ writeIncidence(vevent,event);
+
+ // start time
+ icaltimetype start;
+ if (event->doesFloat()) {
+// kdDebug(5800) << " Incidence " << event->summary() << " floats." << endl;
+ start = writeICalDate(event->dtStart().date());
+ } else {
+// kdDebug(5800) << " incidence " << event->summary() << " has time." << endl;
+ start = writeICalDateTime(event->dtStart());
+ }
+ icalcomponent_add_property(vevent,icalproperty_new_dtstart(start));
+
+ if (event->hasEndDate()) {
+ // End time.
+ // RFC2445 says that if DTEND is present, it has to be greater than DTSTART.
+ icaltimetype end;
+ if (event->doesFloat()) {
+// kdDebug(5800) << " Event " << event->summary() << " floats." << endl;
+ // +1 day because end date is non-inclusive.
+ end = writeICalDate( event->dtEnd().date().addDays( 1 ) );
+ icalcomponent_add_property(vevent,icalproperty_new_dtend(end));
+ } else {
+// kdDebug(5800) << " Event " << event->summary() << " has time." << endl;
+ if (event->dtEnd() != event->dtStart()) {
+ end = writeICalDateTime(event->dtEnd());
+ icalcomponent_add_property(vevent,icalproperty_new_dtend(end));
+ }
+ }
+ }
+
+// TODO: resources
+#if 0
+ // resources
+ tmpStrList = anEvent->resources();
+ tmpStr = tmpStrList.join(";");
+ if (!tmpStr.isEmpty())
+ addPropValue(vevent, VCResourcesProp, tmpStr.utf8());
+
+#endif
+
+ // Transparency
+ switch( event->transparency() ) {
+ case Event::Transparent:
+ icalcomponent_add_property(
+ vevent,
+ icalproperty_new_transp( ICAL_TRANSP_TRANSPARENT ) );
+ break;
+ case Event::Opaque:
+ icalcomponent_add_property(
+ vevent,
+ icalproperty_new_transp( ICAL_TRANSP_OPAQUE ) );
+ break;
+ }
+
+ return vevent;
+}
+
+icalcomponent *ICalFormatImpl::writeFreeBusy(FreeBusy *freebusy,
+ Scheduler::Method method)
+{
+#if QT_VERSION >= 300
+ kdDebug(5800) << "icalformatimpl: writeFreeBusy: startDate: "
+ << freebusy->dtStart().toString("ddd MMMM d yyyy: h:m:s ap") << " End Date: "
+ << freebusy->dtEnd().toString("ddd MMMM d yyyy: h:m:s ap") << endl;
+#endif
+
+ icalcomponent *vfreebusy = icalcomponent_new(ICAL_VFREEBUSY_COMPONENT);
+
+ writeIncidenceBase(vfreebusy,freebusy);
+
+ icalcomponent_add_property(vfreebusy, icalproperty_new_dtstart(
+ writeICalDateTime(freebusy->dtStart())));
+
+ icalcomponent_add_property(vfreebusy, icalproperty_new_dtend(
+ writeICalDateTime(freebusy->dtEnd())));
+
+ if (method == Scheduler::Request) {
+ icalcomponent_add_property(vfreebusy,icalproperty_new_uid(
+ freebusy->uid().utf8()));
+ }
+
+ //Loops through all the periods in the freebusy object
+ QValueList<Period> list = freebusy->busyPeriods();
+ QValueList<Period>::Iterator it;
+ icalperiodtype period = icalperiodtype_null_period();
+ for (it = list.begin(); it!= list.end(); ++it) {
+ period.start = writeICalDateTime((*it).start());
+ if ( (*it).hasDuration() ) {
+ period.duration = writeICalDuration( (*it).duration().asSeconds() );
+ } else {
+ period.end = writeICalDateTime((*it).end());
+ }
+ icalcomponent_add_property(vfreebusy, icalproperty_new_freebusy(period) );
+ }
+
+ return vfreebusy;
+}
+
+icalcomponent *ICalFormatImpl::writeJournal(Journal *journal)
+{
+ icalcomponent *vjournal = icalcomponent_new(ICAL_VJOURNAL_COMPONENT);
+
+ writeIncidence(vjournal,journal);
+
+ // start time
+ if (journal->dtStart().isValid()) {
+ icaltimetype start;
+ if (journal->doesFloat()) {
+// kdDebug(5800) << " Incidence " << event->summary() << " floats." << endl;
+ start = writeICalDate(journal->dtStart().date());
+ } else {
+// kdDebug(5800) << " incidence " << event->summary() << " has time." << endl;
+ start = writeICalDateTime(journal->dtStart());
+ }
+ icalcomponent_add_property(vjournal,icalproperty_new_dtstart(start));
+ }
+
+ return vjournal;
+}
+
+void ICalFormatImpl::writeIncidence(icalcomponent *parent,Incidence *incidence)
+{
+ // pilot sync stuff
+// TODO: move this application-specific code to kpilot
+ if (incidence->pilotId()) {
+ // NOTE: we can't do setNonKDECustomProperty here because this changes
+ // data and triggers an updated() event...
+ // incidence->setNonKDECustomProperty("X-PILOTSTAT", QString::number(incidence->syncStatus()));
+ // incidence->setNonKDECustomProperty("X-PILOTID", QString::number(incidence->pilotId()));
+
+ icalproperty *p = 0;
+ p = icalproperty_new_x(QString::number(incidence->syncStatus()).utf8());
+ icalproperty_set_x_name(p,"X-PILOTSTAT");
+ icalcomponent_add_property(parent,p);
+
+ p = icalproperty_new_x(QString::number(incidence->pilotId()).utf8());
+ icalproperty_set_x_name(p,"X-PILOTID");
+ icalcomponent_add_property(parent,p);
+ }
+
+ if ( incidence->schedulingID() != incidence->uid() )
+ // We need to store the UID in here. The rawSchedulingID will
+ // go into the iCal UID component
+ incidence->setCustomProperty( "LIBKCAL", "ID", incidence->uid() );
+ else
+ incidence->removeCustomProperty( "LIBKCAL", "ID" );
+
+ writeIncidenceBase(parent,incidence);
+
+ // creation date
+ icalcomponent_add_property(parent,icalproperty_new_created(
+ writeICalDateTime(incidence->created())));
+
+ // unique id
+ // If the scheduling ID is different from the real UID, the real
+ // one is stored on X-REALID above
+ if ( !incidence->schedulingID().isEmpty() ) {
+ icalcomponent_add_property(parent,icalproperty_new_uid(
+ incidence->schedulingID().utf8()));
+ }
+
+ // revision
+ if ( incidence->revision() > 0 ) { // 0 is default, so don't write that out
+ icalcomponent_add_property(parent,icalproperty_new_sequence(
+ incidence->revision()));
+ }
+
+ // last modification date
+ if ( incidence->lastModified().isValid() ) {
+ icalcomponent_add_property(parent,icalproperty_new_lastmodified(
+ writeICalDateTime(incidence->lastModified())));
+ }
+
+ // description
+ if (!incidence->description().isEmpty()) {
+ icalcomponent_add_property(parent,icalproperty_new_description(
+ incidence->description().utf8()));
+ }
+
+ // summary
+ if (!incidence->summary().isEmpty()) {
+ icalcomponent_add_property(parent,icalproperty_new_summary(
+ incidence->summary().utf8()));
+ }
+
+ // location
+ if (!incidence->location().isEmpty()) {
+ icalcomponent_add_property(parent,icalproperty_new_location(
+ incidence->location().utf8()));
+ }
+
+ // status
+ icalproperty_status status = ICAL_STATUS_NONE;
+ switch (incidence->status()) {
+ case Incidence::StatusTentative: status = ICAL_STATUS_TENTATIVE; break;
+ case Incidence::StatusConfirmed: status = ICAL_STATUS_CONFIRMED; break;
+ case Incidence::StatusCompleted: status = ICAL_STATUS_COMPLETED; break;
+ case Incidence::StatusNeedsAction: status = ICAL_STATUS_NEEDSACTION; break;
+ case Incidence::StatusCanceled: status = ICAL_STATUS_CANCELLED; break;
+ case Incidence::StatusInProcess: status = ICAL_STATUS_INPROCESS; break;
+ case Incidence::StatusDraft: status = ICAL_STATUS_DRAFT; break;
+ case Incidence::StatusFinal: status = ICAL_STATUS_FINAL; break;
+ case Incidence::StatusX: {
+ icalproperty* p = icalproperty_new_status(ICAL_STATUS_X);
+ icalvalue_set_x(icalproperty_get_value(p), incidence->statusStr().utf8());
+ icalcomponent_add_property(parent, p);
+ break;
+ }
+ case Incidence::StatusNone:
+ default:
+ break;
+ }
+ if (status != ICAL_STATUS_NONE)
+ icalcomponent_add_property(parent, icalproperty_new_status(status));
+
+ // secrecy
+ icalproperty_class secClass;
+ switch (incidence->secrecy()) {
+ case Incidence::SecrecyPublic:
+ secClass = ICAL_CLASS_PUBLIC;
+ break;
+ case Incidence::SecrecyConfidential:
+ secClass = ICAL_CLASS_CONFIDENTIAL;
+ break;
+ case Incidence::SecrecyPrivate:
+ default:
+ secClass = ICAL_CLASS_PRIVATE;
+ break;
+ }
+ if ( secClass != ICAL_CLASS_PUBLIC ) {
+ icalcomponent_add_property(parent,icalproperty_new_class(secClass));
+ }
+
+ // priority
+ if ( incidence->priority() > 0 ) { // 0 is undefined priority
+ icalcomponent_add_property(parent,icalproperty_new_priority(
+ incidence->priority()));
+ }
+
+ // categories
+ QStringList categories = incidence->categories();
+ QStringList::Iterator it;
+ for(it = categories.begin(); it != categories.end(); ++it ) {
+ icalcomponent_add_property(parent,icalproperty_new_categories((*it).utf8()));
+ }
+
+ // related event
+ if ( !incidence->relatedToUid().isEmpty() ) {
+ icalcomponent_add_property(parent,icalproperty_new_relatedto(
+ incidence->relatedToUid().utf8()));
+ }
+
+// kdDebug(5800) << "Write recurrence for '" << incidence->summary() << "' (" << incidence->uid()
+// << ")" << endl;
+
+ RecurrenceRule::List rrules( incidence->recurrence()->rRules() );
+ RecurrenceRule::List::ConstIterator rit;
+ for ( rit = rrules.begin(); rit != rrules.end(); ++rit ) {
+ icalcomponent_add_property( parent, icalproperty_new_rrule(
+ writeRecurrenceRule( (*rit) ) ) );
+ }
+
+ RecurrenceRule::List exrules( incidence->recurrence()->exRules() );
+ RecurrenceRule::List::ConstIterator exit;
+ for ( exit = exrules.begin(); exit != exrules.end(); ++exit ) {
+ icalcomponent_add_property( parent, icalproperty_new_rrule(
+ writeRecurrenceRule( (*exit) ) ) );
+ }
+
+ DateList dateList = incidence->recurrence()->exDates();
+ DateList::ConstIterator exIt;
+ for(exIt = dateList.begin(); exIt != dateList.end(); ++exIt) {
+ icalcomponent_add_property(parent,icalproperty_new_exdate(
+ writeICalDate(*exIt)));
+ }
+ DateTimeList dateTimeList = incidence->recurrence()->exDateTimes();
+ DateTimeList::ConstIterator extIt;
+ for(extIt = dateTimeList.begin(); extIt != dateTimeList.end(); ++extIt) {
+ icalcomponent_add_property(parent,icalproperty_new_exdate(
+ writeICalDateTime(*extIt)));
+ }
+
+
+ dateList = incidence->recurrence()->rDates();
+ DateList::ConstIterator rdIt;
+ for( rdIt = dateList.begin(); rdIt != dateList.end(); ++rdIt) {
+ icalcomponent_add_property( parent, icalproperty_new_rdate(
+ writeICalDatePeriod(*rdIt) ) );
+ }
+ dateTimeList = incidence->recurrence()->rDateTimes();
+ DateTimeList::ConstIterator rdtIt;
+ for( rdtIt = dateTimeList.begin(); rdtIt != dateTimeList.end(); ++rdtIt) {
+ icalcomponent_add_property( parent, icalproperty_new_rdate(
+ writeICalDateTimePeriod(*rdtIt) ) );
+ }
+
+ // attachments
+ Attachment::List attachments = incidence->attachments();
+ Attachment::List::ConstIterator atIt;
+ for ( atIt = attachments.begin(); atIt != attachments.end(); ++atIt ) {
+ icalcomponent_add_property( parent, writeAttachment( *atIt ) );
+ }
+
+ // alarms
+ Alarm::List::ConstIterator alarmIt;
+ for ( alarmIt = incidence->alarms().begin();
+ alarmIt != incidence->alarms().end(); ++alarmIt ) {
+ if ( (*alarmIt)->enabled() ) {
+// kdDebug(5800) << "Write alarm for " << incidence->summary() << endl;
+ icalcomponent_add_component( parent, writeAlarm( *alarmIt ) );
+ }
+ }
+
+ // duration
+ if (incidence->hasDuration()) {
+ icaldurationtype duration;
+ duration = writeICalDuration( incidence->duration() );
+ icalcomponent_add_property(parent,icalproperty_new_duration(duration));
+ }
+}
+
+void ICalFormatImpl::writeIncidenceBase( icalcomponent *parent,
+ IncidenceBase * incidenceBase )
+{
+ icalcomponent_add_property( parent, icalproperty_new_dtstamp(
+ writeICalDateTime( QDateTime::currentDateTime() ) ) );
+
+ // organizer stuff
+ if ( !incidenceBase->organizer().isEmpty() ) {
+ icalcomponent_add_property( parent, writeOrganizer( incidenceBase->organizer() ) );
+ }
+
+ // attendees
+ if ( incidenceBase->attendeeCount() > 0 ) {
+ Attendee::List::ConstIterator it;
+ for( it = incidenceBase->attendees().begin();
+ it != incidenceBase->attendees().end(); ++it ) {
+ icalcomponent_add_property( parent, writeAttendee( *it ) );
+ }
+ }
+
+ // comments
+ QStringList comments = incidenceBase->comments();
+ for (QStringList::Iterator it=comments.begin(); it!=comments.end(); ++it) {
+ icalcomponent_add_property(parent, icalproperty_new_comment((*it).utf8()));
+ }
+
+ // custom properties
+ writeCustomProperties( parent, incidenceBase );
+}
+
+void ICalFormatImpl::writeCustomProperties(icalcomponent *parent,CustomProperties *properties)
+{
+ QMap<QCString, QString> custom = properties->customProperties();
+ for (QMap<QCString, QString>::Iterator c = custom.begin(); c != custom.end(); ++c) {
+ icalproperty *p = icalproperty_new_x(c.data().utf8());
+ icalproperty_set_x_name(p,c.key());
+ icalcomponent_add_property(parent,p);
+ }
+}
+
+icalproperty *ICalFormatImpl::writeOrganizer( const Person &organizer )
+{
+ icalproperty *p = icalproperty_new_organizer("MAILTO:" + organizer.email().utf8());
+
+ if (!organizer.name().isEmpty()) {
+ icalproperty_add_parameter( p, icalparameter_new_cn(organizer.name().utf8()) );
+ }
+ // TODO: Write dir, sent-by and language
+
+ return p;
+}
+
+
+icalproperty *ICalFormatImpl::writeAttendee(Attendee *attendee)
+{
+ icalproperty *p = icalproperty_new_attendee("mailto:" + attendee->email().utf8());
+
+ if (!attendee->name().isEmpty()) {
+ icalproperty_add_parameter(p,icalparameter_new_cn(attendee->name().utf8()));
+ }
+
+
+ icalproperty_add_parameter(p,icalparameter_new_rsvp(
+ attendee->RSVP() ? ICAL_RSVP_TRUE : ICAL_RSVP_FALSE ));
+
+ icalparameter_partstat status = ICAL_PARTSTAT_NEEDSACTION;
+ switch (attendee->status()) {
+ default:
+ case Attendee::NeedsAction:
+ status = ICAL_PARTSTAT_NEEDSACTION;
+ break;
+ case Attendee::Accepted:
+ status = ICAL_PARTSTAT_ACCEPTED;
+ break;
+ case Attendee::Declined:
+ status = ICAL_PARTSTAT_DECLINED;
+ break;
+ case Attendee::Tentative:
+ status = ICAL_PARTSTAT_TENTATIVE;
+ break;
+ case Attendee::Delegated:
+ status = ICAL_PARTSTAT_DELEGATED;
+ break;
+ case Attendee::Completed:
+ status = ICAL_PARTSTAT_COMPLETED;
+ break;
+ case Attendee::InProcess:
+ status = ICAL_PARTSTAT_INPROCESS;
+ break;
+ }
+ icalproperty_add_parameter(p,icalparameter_new_partstat(status));
+
+ icalparameter_role role = ICAL_ROLE_REQPARTICIPANT;
+ switch (attendee->role()) {
+ case Attendee::Chair:
+ role = ICAL_ROLE_CHAIR;
+ break;
+ default:
+ case Attendee::ReqParticipant:
+ role = ICAL_ROLE_REQPARTICIPANT;
+ break;
+ case Attendee::OptParticipant:
+ role = ICAL_ROLE_OPTPARTICIPANT;
+ break;
+ case Attendee::NonParticipant:
+ role = ICAL_ROLE_NONPARTICIPANT;
+ break;
+ }
+ icalproperty_add_parameter(p,icalparameter_new_role(role));
+
+ if (!attendee->uid().isEmpty()) {
+ icalparameter* icalparameter_uid = icalparameter_new_x(attendee->uid().utf8());
+ icalparameter_set_xname(icalparameter_uid,"X-UID");
+ icalproperty_add_parameter(p,icalparameter_uid);
+ }
+
+ if ( !attendee->delegate().isEmpty() ) {
+ icalparameter* icalparameter_delegate = icalparameter_new_delegatedto( attendee->delegate().utf8() );
+ icalproperty_add_parameter( p, icalparameter_delegate );
+ }
+
+ if ( !attendee->delegator().isEmpty() ) {
+ icalparameter* icalparameter_delegator = icalparameter_new_delegatedfrom( attendee->delegator().utf8() );
+ icalproperty_add_parameter( p, icalparameter_delegator );
+ }
+
+ return p;
+}
+
+icalproperty *ICalFormatImpl::writeAttachment(Attachment *att)
+{
+ icalattach *attach;
+ if (att->isUri())
+ attach = icalattach_new_from_url( att->uri().utf8().data());
+ else
+ attach = icalattach_new_from_data ( (unsigned char *)att->data(), 0, 0);
+ icalproperty *p = icalproperty_new_attach(attach);
+
+ if ( !att->mimeType().isEmpty() ) {
+ icalproperty_add_parameter( p,
+ icalparameter_new_fmttype( att->mimeType().utf8().data() ) );
+ }
+
+ if ( att->isBinary() ) {
+ icalproperty_add_parameter( p,
+ icalparameter_new_value( ICAL_VALUE_BINARY ) );
+ icalproperty_add_parameter( p,
+ icalparameter_new_encoding( ICAL_ENCODING_BASE64 ) );
+ }
+
+ if ( att->showInline() ) {
+ icalparameter* icalparameter_inline = icalparameter_new_x( "inline" );
+ icalparameter_set_xname( icalparameter_inline, "X-CONTENT-DISPOSITION" );
+ icalproperty_add_parameter( p, icalparameter_inline );
+ }
+
+ if ( !att->label().isEmpty() ) {
+ icalparameter* icalparameter_label = icalparameter_new_x( att->label().utf8() );
+ icalparameter_set_xname( icalparameter_label, "X-LABEL" );
+ icalproperty_add_parameter( p, icalparameter_label );
+ }
+
+ return p;
+}
+
+icalrecurrencetype ICalFormatImpl::writeRecurrenceRule( RecurrenceRule *recur )
+{
+// kdDebug(5800) << "ICalFormatImpl::writeRecurrenceRule()" << endl;
+
+ icalrecurrencetype r;
+ icalrecurrencetype_clear(&r);
+
+ switch( recur->recurrenceType() ) {
+ case RecurrenceRule::rSecondly:
+ r.freq = ICAL_SECONDLY_RECURRENCE;
+ break;
+ case RecurrenceRule::rMinutely:
+ r.freq = ICAL_MINUTELY_RECURRENCE;
+ break;
+ case RecurrenceRule::rHourly:
+ r.freq = ICAL_HOURLY_RECURRENCE;
+ break;
+ case RecurrenceRule::rDaily:
+ r.freq = ICAL_DAILY_RECURRENCE;
+ break;
+ case RecurrenceRule::rWeekly:
+ r.freq = ICAL_WEEKLY_RECURRENCE;
+ break;
+ case RecurrenceRule::rMonthly:
+ r.freq = ICAL_MONTHLY_RECURRENCE;
+ break;
+ case RecurrenceRule::rYearly:
+ r.freq = ICAL_YEARLY_RECURRENCE;
+ break;
+ default:
+ r.freq = ICAL_NO_RECURRENCE;
+ kdDebug(5800) << "ICalFormatImpl::writeRecurrence(): no recurrence" << endl;
+ break;
+ }
+
+ int index = 0;
+ QValueList<int> bys;
+ QValueList<int>::ConstIterator it;
+
+ // Now write out the BY* parts:
+ bys = recur->bySeconds();
+ index = 0;
+ for ( it = bys.begin(); it != bys.end(); ++it ) {
+ r.by_second[index++] = *it;
+ }
+
+ bys = recur->byMinutes();
+ index = 0;
+ for ( it = bys.begin(); it != bys.end(); ++it ) {
+ r.by_minute[index++] = *it;
+ }
+
+ bys = recur->byHours();
+ index = 0;
+ for ( it = bys.begin(); it != bys.end(); ++it ) {
+ r.by_hour[index++] = *it;
+ }
+
+ bys = recur->byMonthDays();
+ index = 0;
+ for ( it = bys.begin(); it != bys.end(); ++it ) {
+ r.by_month_day[index++] = icalrecurrencetype_day_position( (*it) * 8 );
+ }
+
+ bys = recur->byYearDays();
+ index = 0;
+ for ( it = bys.begin(); it != bys.end(); ++it ) {
+ r.by_year_day[index++] = *it;
+ }
+
+ bys = recur->byWeekNumbers();
+ index = 0;
+ for ( it = bys.begin(); it != bys.end(); ++it ) {
+ r.by_week_no[index++] = *it;
+ }
+
+ bys = recur->byMonths();
+ index = 0;
+ for ( it = bys.begin(); it != bys.end(); ++it ) {
+ r.by_month[index++] = *it;
+ }
+
+ bys = recur->bySetPos();
+ index = 0;
+ for ( it = bys.begin(); it != bys.end(); ++it ) {
+ r.by_set_pos[index++] = *it;
+ }
+
+
+ QValueList<RecurrenceRule::WDayPos> byd = recur->byDays();
+ int day;
+ index = 0;
+ for ( QValueList<RecurrenceRule::WDayPos>::ConstIterator dit = byd.begin();
+ dit != byd.end(); ++dit ) {
+ day = (*dit).day() % 7 + 1; // convert from Monday=1 to Sunday=1
+ if ( (*dit).pos() < 0 ) {
+ day += (-(*dit).pos())*8;
+ day = -day;
+ } else {
+ day += (*dit).pos()*8;
+ }
+ r.by_day[index++] = day;
+ }
+
+ r.week_start = static_cast<icalrecurrencetype_weekday>(
+ recur->weekStart()%7 + 1);
+
+ if ( recur->frequency() > 1 ) {
+ // Dont' write out INTERVAL=1, because that's the default anyway
+ r.interval = recur->frequency();
+ }
+
+ if ( recur->duration() > 0 ) {
+ r.count = recur->duration();
+ } else if ( recur->duration() == -1 ) {
+ r.count = 0;
+ } else {
+ if ( recur->doesFloat() )
+ r.until = writeICalDate(recur->endDt().date());
+ else
+ r.until = writeICalDateTime(recur->endDt());
+ }
+
+// Debug output
+#if 0
+ const char *str = icalrecurrencetype_as_string(&r);
+ if (str) {
+ kdDebug(5800) << " String: " << str << endl;
+ } else {
+ kdDebug(5800) << " No String" << endl;
+ }
+#endif
+
+ return r;
+}
+
+
+icalcomponent *ICalFormatImpl::writeAlarm(Alarm *alarm)
+{
+// kdDebug(5800) << " ICalFormatImpl::writeAlarm" << endl;
+ icalcomponent *a = icalcomponent_new(ICAL_VALARM_COMPONENT);
+
+ icalproperty_action action;
+ icalattach *attach = 0;
+
+ switch (alarm->type()) {
+ case Alarm::Procedure:
+ action = ICAL_ACTION_PROCEDURE;
+ attach = icalattach_new_from_url(QFile::encodeName(alarm->programFile()).data());
+ icalcomponent_add_property(a,icalproperty_new_attach(attach));
+ if (!alarm->programArguments().isEmpty()) {
+ icalcomponent_add_property(a,icalproperty_new_description(alarm->programArguments().utf8()));
+ }
+ break;
+ case Alarm::Audio:
+ action = ICAL_ACTION_AUDIO;
+// kdDebug(5800) << " It's an audio action, file: " << alarm->audioFile() << endl;
+ if (!alarm->audioFile().isEmpty()) {
+ attach = icalattach_new_from_url(QFile::encodeName( alarm->audioFile() ).data());
+ icalcomponent_add_property(a,icalproperty_new_attach(attach));
+ }
+ break;
+ case Alarm::Email: {
+ action = ICAL_ACTION_EMAIL;
+ QValueList<Person> addresses = alarm->mailAddresses();
+ for (QValueList<Person>::Iterator ad = addresses.begin(); ad != addresses.end(); ++ad) {
+ icalproperty *p = icalproperty_new_attendee("MAILTO:" + (*ad).email().utf8());
+ if (!(*ad).name().isEmpty()) {
+ icalproperty_add_parameter(p,icalparameter_new_cn((*ad).name().utf8()));
+ }
+ icalcomponent_add_property(a,p);
+ }
+ icalcomponent_add_property(a,icalproperty_new_summary(alarm->mailSubject().utf8()));
+ icalcomponent_add_property(a,icalproperty_new_description(alarm->mailText().utf8()));
+ QStringList attachments = alarm->mailAttachments();
+ if (attachments.count() > 0) {
+ for (QStringList::Iterator at = attachments.begin(); at != attachments.end(); ++at) {
+ attach = icalattach_new_from_url(QFile::encodeName( *at ).data());
+ icalcomponent_add_property(a,icalproperty_new_attach(attach));
+ }
+ }
+ break;
+ }
+ case Alarm::Display:
+ action = ICAL_ACTION_DISPLAY;
+ icalcomponent_add_property(a,icalproperty_new_description(alarm->text().utf8()));
+ break;
+ case Alarm::Invalid:
+ default:
+ kdDebug(5800) << "Unknown type of alarm" << endl;
+ action = ICAL_ACTION_NONE;
+ break;
+ }
+ icalcomponent_add_property(a,icalproperty_new_action(action));
+
+ // Trigger time
+ icaltriggertype trigger;
+ if ( alarm->hasTime() ) {
+ trigger.time = writeICalDateTime(alarm->time());
+ trigger.duration = icaldurationtype_null_duration();
+ } else {
+ trigger.time = icaltime_null_time();
+ Duration offset;
+ if ( alarm->hasStartOffset() )
+ offset = alarm->startOffset();
+ else
+ offset = alarm->endOffset();
+ trigger.duration = icaldurationtype_from_int( offset.asSeconds() );
+ }
+ icalproperty *p = icalproperty_new_trigger(trigger);
+ if ( alarm->hasEndOffset() )
+ icalproperty_add_parameter(p,icalparameter_new_related(ICAL_RELATED_END));
+ icalcomponent_add_property(a,p);
+
+ // Repeat count and duration
+ if (alarm->repeatCount()) {
+ icalcomponent_add_property(a,icalproperty_new_repeat(alarm->repeatCount()));
+ icalcomponent_add_property(a,icalproperty_new_duration(
+ icaldurationtype_from_int(alarm->snoozeTime()*60)));
+ }
+
+ // Custom properties
+ QMap<QCString, QString> custom = alarm->customProperties();
+ for (QMap<QCString, QString>::Iterator c = custom.begin(); c != custom.end(); ++c) {
+ icalproperty *p = icalproperty_new_x(c.data().utf8());
+ icalproperty_set_x_name(p,c.key());
+ icalcomponent_add_property(a,p);
+ }
+
+ return a;
+}
+
+Todo *ICalFormatImpl::readTodo(icalcomponent *vtodo)
+{
+ Todo *todo = new Todo;
+
+ readIncidence(vtodo, 0, todo); // FIXME timezone
+
+ icalproperty *p = icalcomponent_get_first_property(vtodo,ICAL_ANY_PROPERTY);
+
+// int intvalue;
+ icaltimetype icaltime;
+
+ QStringList categories;
+
+ while (p) {
+ icalproperty_kind kind = icalproperty_isa(p);
+ switch (kind) {
+
+ case ICAL_DUE_PROPERTY: // due date
+ icaltime = icalproperty_get_due(p);
+ if (icaltime.is_date) {
+ todo->setDtDue(QDateTime(readICalDate(icaltime),QTime(0,0,0)),true);
+ } else {
+ todo->setDtDue(readICalDateTime(icaltime),true);
+ todo->setFloats(false);
+ }
+ todo->setHasDueDate(true);
+ break;
+
+ case ICAL_COMPLETED_PROPERTY: // completion date
+ icaltime = icalproperty_get_completed(p);
+ todo->setCompleted(readICalDateTime(icaltime));
+ break;
+
+ case ICAL_PERCENTCOMPLETE_PROPERTY: // Percent completed
+ todo->setPercentComplete(icalproperty_get_percentcomplete(p));
+ break;
+
+ case ICAL_RELATEDTO_PROPERTY: // related todo (parent)
+ todo->setRelatedToUid(QString::fromUtf8(icalproperty_get_relatedto(p)));
+ mTodosRelate.append(todo);
+ break;
+
+ case ICAL_DTSTART_PROPERTY: {
+ // Flag that todo has start date. Value is read in by readIncidence().
+ if ( todo->comments().grep("NoStartDate").count() )
+ todo->setHasStartDate( false );
+ else
+ todo->setHasStartDate( true );
+ break;
+ }
+
+ case ICAL_RECURRENCEID_PROPERTY:
+ icaltime = icalproperty_get_recurrenceid(p);
+ todo->setDtRecurrence( readICalDateTime(icaltime) );
+ break;
+
+ default:
+// kdDebug(5800) << "ICALFormat::readTodo(): Unknown property: " << kind
+// << endl;
+ break;
+ }
+
+ p = icalcomponent_get_next_property(vtodo,ICAL_ANY_PROPERTY);
+ }
+
+ if (mCompat) mCompat->fixEmptySummary( todo );
+
+ return todo;
+}
+
+Event *ICalFormatImpl::readEvent( icalcomponent *vevent, icalcomponent *vtimezone )
+{
+ Event *event = new Event;
+
+ // FIXME where is this freed?
+ icaltimezone *tz = icaltimezone_new();
+ if ( !icaltimezone_set_component( tz, vtimezone ) ) {
+ icaltimezone_free( tz, 1 );
+ tz = 0;
+ }
+
+ readIncidence( vevent, tz, event);
+
+ icalproperty *p = icalcomponent_get_first_property(vevent,ICAL_ANY_PROPERTY);
+
+// int intvalue;
+ icaltimetype icaltime;
+
+ QStringList categories;
+ icalproperty_transp transparency;
+
+ bool dtEndProcessed = false;
+
+ while (p) {
+ icalproperty_kind kind = icalproperty_isa(p);
+ switch (kind) {
+
+ case ICAL_DTEND_PROPERTY: // start date and time
+ icaltime = icalproperty_get_dtend(p);
+ if (icaltime.is_date) {
+ // End date is non-inclusive
+ QDate endDate = readICalDate( icaltime ).addDays( -1 );
+ if ( mCompat ) mCompat->fixFloatingEnd( endDate );
+ if ( endDate < event->dtStart().date() ) {
+ endDate = event->dtStart().date();
+ }
+ event->setDtEnd( QDateTime( endDate, QTime( 0, 0, 0 ) ) );
+ } else {
+ event->setDtEnd(readICalDateTime(icaltime, tz));
+ event->setFloats( false );
+ }
+ dtEndProcessed = true;
+ break;
+
+ case ICAL_RELATEDTO_PROPERTY: // related event (parent)
+ event->setRelatedToUid(QString::fromUtf8(icalproperty_get_relatedto(p)));
+ mEventsRelate.append(event);
+ break;
+
+
+ case ICAL_TRANSP_PROPERTY: // Transparency
+ transparency = icalproperty_get_transp(p);
+ if( transparency == ICAL_TRANSP_TRANSPARENT )
+ event->setTransparency( Event::Transparent );
+ else
+ event->setTransparency( Event::Opaque );
+ break;
+
+ default:
+// kdDebug(5800) << "ICALFormat::readEvent(): Unknown property: " << kind
+// << endl;
+ break;
+ }
+
+ p = icalcomponent_get_next_property(vevent,ICAL_ANY_PROPERTY);
+ }
+
+ // according to rfc2445 the dtend shouldn't be written when it equals
+ // start date. so assign one equal to start date.
+ if ( !dtEndProcessed && !event->hasDuration() ) {
+ event->setDtEnd( event->dtStart() );
+ }
+
+ QString msade = event->nonKDECustomProperty("X-MICROSOFT-CDO-ALLDAYEVENT");
+ if (!msade.isEmpty()) {
+ bool floats = (msade == QString::fromLatin1("TRUE"));
+ event->setFloats(floats);
+ }
+
+ if ( mCompat ) mCompat->fixEmptySummary( event );
+
+ return event;
+}
+
+FreeBusy *ICalFormatImpl::readFreeBusy(icalcomponent *vfreebusy)
+{
+ FreeBusy *freebusy = new FreeBusy;
+
+ readIncidenceBase(vfreebusy, freebusy);
+
+ icalproperty *p = icalcomponent_get_first_property(vfreebusy,ICAL_ANY_PROPERTY);
+
+ icaltimetype icaltime;
+ PeriodList periods;
+
+ while (p) {
+ icalproperty_kind kind = icalproperty_isa(p);
+ switch (kind) {
+
+ case ICAL_DTSTART_PROPERTY: // start date and time
+ icaltime = icalproperty_get_dtstart(p);
+ freebusy->setDtStart(readICalDateTime(icaltime));
+ break;
+
+ case ICAL_DTEND_PROPERTY: // end Date and Time
+ icaltime = icalproperty_get_dtend(p);
+ freebusy->setDtEnd(readICalDateTime(icaltime));
+ break;
+
+ case ICAL_FREEBUSY_PROPERTY: { //Any FreeBusy Times
+ icalperiodtype icalperiod = icalproperty_get_freebusy(p);
+ QDateTime period_start = readICalDateTime(icalperiod.start);
+ Period period;
+ if ( !icaltime_is_null_time(icalperiod.end) ) {
+ QDateTime period_end = readICalDateTime(icalperiod.end);
+ period = Period(period_start, period_end);
+ } else {
+ Duration duration = readICalDuration( icalperiod.duration );
+ period = Period(period_start, duration);
+ }
+ QCString param = icalproperty_get_parameter_as_string( p, "X-SUMMARY" );
+ period.setSummary( QString::fromUtf8( KCodecs::base64Decode( param ) ) );
+ param = icalproperty_get_parameter_as_string( p, "X-LOCATION" );
+ period.setLocation( QString::fromUtf8( KCodecs::base64Decode( param ) ) );
+ periods.append( period );
+ break;}
+
+ default:
+// kdDebug(5800) << "ICalFormatImpl::readFreeBusy(): Unknown property: "
+// << kind << endl;
+ break;
+ }
+ p = icalcomponent_get_next_property(vfreebusy,ICAL_ANY_PROPERTY);
+ }
+ freebusy->addPeriods( periods );
+
+ return freebusy;
+}
+
+Journal *ICalFormatImpl::readJournal(icalcomponent *vjournal)
+{
+ Journal *journal = new Journal;
+
+ readIncidence(vjournal, 0, journal); // FIXME tz?
+
+ return journal;
+}
+
+Attendee *ICalFormatImpl::readAttendee(icalproperty *attendee)
+{
+ icalparameter *p = 0;
+
+ QString email = QString::fromUtf8(icalproperty_get_attendee(attendee));
+ if ( email.startsWith( "mailto:", false ) ) {
+ email = email.mid( 7 );
+ }
+
+ QString name;
+ QString uid = QString::null;
+ p = icalproperty_get_first_parameter(attendee,ICAL_CN_PARAMETER);
+ if (p) {
+ name = QString::fromUtf8(icalparameter_get_cn(p));
+ } else {
+ }
+
+ bool rsvp=false;
+ p = icalproperty_get_first_parameter(attendee,ICAL_RSVP_PARAMETER);
+ if (p) {
+ icalparameter_rsvp rsvpParameter = icalparameter_get_rsvp(p);
+ if (rsvpParameter == ICAL_RSVP_TRUE) rsvp = true;
+ }
+
+ Attendee::PartStat status = Attendee::NeedsAction;
+ p = icalproperty_get_first_parameter(attendee,ICAL_PARTSTAT_PARAMETER);
+ if (p) {
+ icalparameter_partstat partStatParameter = icalparameter_get_partstat(p);
+ switch(partStatParameter) {
+ default:
+ case ICAL_PARTSTAT_NEEDSACTION:
+ status = Attendee::NeedsAction;
+ break;
+ case ICAL_PARTSTAT_ACCEPTED:
+ status = Attendee::Accepted;
+ break;
+ case ICAL_PARTSTAT_DECLINED:
+ status = Attendee::Declined;
+ break;
+ case ICAL_PARTSTAT_TENTATIVE:
+ status = Attendee::Tentative;
+ break;
+ case ICAL_PARTSTAT_DELEGATED:
+ status = Attendee::Delegated;
+ break;
+ case ICAL_PARTSTAT_COMPLETED:
+ status = Attendee::Completed;
+ break;
+ case ICAL_PARTSTAT_INPROCESS:
+ status = Attendee::InProcess;
+ break;
+ }
+ }
+
+ Attendee::Role role = Attendee::ReqParticipant;
+ p = icalproperty_get_first_parameter(attendee,ICAL_ROLE_PARAMETER);
+ if (p) {
+ icalparameter_role roleParameter = icalparameter_get_role(p);
+ switch(roleParameter) {
+ case ICAL_ROLE_CHAIR:
+ role = Attendee::Chair;
+ break;
+ default:
+ case ICAL_ROLE_REQPARTICIPANT:
+ role = Attendee::ReqParticipant;
+ break;
+ case ICAL_ROLE_OPTPARTICIPANT:
+ role = Attendee::OptParticipant;
+ break;
+ case ICAL_ROLE_NONPARTICIPANT:
+ role = Attendee::NonParticipant;
+ break;
+ }
+ }
+
+ p = icalproperty_get_first_parameter(attendee,ICAL_X_PARAMETER);
+ uid = icalparameter_get_xvalue(p);
+ // This should be added, but there seems to be a libical bug here.
+ // TODO: does this work now in libical-0.24 or greater?
+ /*while (p) {
+ // if (icalparameter_get_xname(p) == "X-UID") {
+ uid = icalparameter_get_xvalue(p);
+ p = icalproperty_get_next_parameter(attendee,ICAL_X_PARAMETER);
+ } */
+
+ Attendee *a = new Attendee( name, email, rsvp, status, role, uid );
+
+ p = icalproperty_get_first_parameter( attendee, ICAL_DELEGATEDTO_PARAMETER );
+ if ( p )
+ a->setDelegate( icalparameter_get_delegatedto( p ) );
+
+ p = icalproperty_get_first_parameter( attendee, ICAL_DELEGATEDFROM_PARAMETER );
+ if ( p )
+ a->setDelegator( icalparameter_get_delegatedfrom( p ) );
+
+ return a;
+}
+
+Person ICalFormatImpl::readOrganizer( icalproperty *organizer )
+{
+ QString email = QString::fromUtf8(icalproperty_get_organizer(organizer));
+ if ( email.startsWith( "mailto:", false ) ) {
+ email = email.mid( 7 );
+ }
+ QString cn;
+
+ icalparameter *p = icalproperty_get_first_parameter(
+ organizer, ICAL_CN_PARAMETER );
+
+ if ( p ) {
+ cn = QString::fromUtf8( icalparameter_get_cn( p ) );
+ }
+ Person org( cn, email );
+ // TODO: Treat sent-by, dir and language here, too
+ return org;
+}
+
+Attachment *ICalFormatImpl::readAttachment(icalproperty *attach)
+{
+ Attachment *attachment = 0;
+
+ icalvalue_kind value_kind = icalvalue_isa(icalproperty_get_value(attach));
+
+ if ( value_kind == ICAL_ATTACH_VALUE || value_kind == ICAL_BINARY_VALUE ) {
+ icalattach *a = icalproperty_get_attach(attach);
+
+ int isurl = icalattach_get_is_url (a);
+ if (isurl == 0)
+ attachment = new Attachment((const char*)icalattach_get_data(a));
+ else {
+ attachment = new Attachment(QString::fromUtf8(icalattach_get_url(a)));
+ }
+ }
+ else if ( value_kind == ICAL_URI_VALUE ) {
+ attachment = new Attachment(QString::fromUtf8(icalvalue_get_uri(icalproperty_get_value(attach))));
+ }
+
+ icalparameter *p = icalproperty_get_first_parameter(attach, ICAL_FMTTYPE_PARAMETER);
+ if (p && attachment)
+ attachment->setMimeType(QString(icalparameter_get_fmttype(p)));
+
+ p = icalproperty_get_first_parameter(attach,ICAL_X_PARAMETER);
+ while (p) {
+ if ( strncmp (icalparameter_get_xname(p), "X-LABEL", 7) == 0 )
+ attachment->setLabel( icalparameter_get_xvalue(p) );
+ p = icalproperty_get_next_parameter(attach, ICAL_X_PARAMETER);
+ }
+
+ return attachment;
+}
+
+void ICalFormatImpl::readIncidence(icalcomponent *parent, icaltimezone *tz, Incidence *incidence)
+{
+ readIncidenceBase(parent,incidence);
+
+ icalproperty *p = icalcomponent_get_first_property(parent,ICAL_ANY_PROPERTY);
+
+ const char *text;
+ int intvalue, inttext;
+ icaltimetype icaltime;
+ icaldurationtype icalduration;
+
+ QStringList categories;
+
+ while (p) {
+ icalproperty_kind kind = icalproperty_isa(p);
+ switch (kind) {
+
+ case ICAL_CREATED_PROPERTY:
+ icaltime = icalproperty_get_created(p);
+ incidence->setCreated(readICalDateTime(icaltime, tz));
+ break;
+
+ case ICAL_SEQUENCE_PROPERTY: // sequence
+ intvalue = icalproperty_get_sequence(p);
+ incidence->setRevision(intvalue);
+ break;
+
+ case ICAL_LASTMODIFIED_PROPERTY: // last modification date
+ icaltime = icalproperty_get_lastmodified(p);
+ incidence->setLastModified(readICalDateTime(icaltime, tz));
+ break;
+
+ case ICAL_DTSTART_PROPERTY: // start date and time
+ icaltime = icalproperty_get_dtstart(p);
+ if (icaltime.is_date) {
+ incidence->setDtStart(QDateTime(readICalDate(icaltime),QTime(0,0,0)));
+ incidence->setFloats( true );
+ } else {
+ incidence->setDtStart(readICalDateTime(icaltime, tz));
+ incidence->setFloats( false );
+ }
+ break;
+
+ case ICAL_DURATION_PROPERTY: // start date and time
+ icalduration = icalproperty_get_duration(p);
+ incidence->setDuration(readICalDuration(icalduration));
+ break;
+
+ case ICAL_DESCRIPTION_PROPERTY: // description
+ text = icalproperty_get_description(p);
+ incidence->setDescription(QString::fromUtf8(text));
+ break;
+
+ case ICAL_SUMMARY_PROPERTY: // summary
+ text = icalproperty_get_summary(p);
+ incidence->setSummary(QString::fromUtf8(text));
+ break;
+
+ case ICAL_LOCATION_PROPERTY: // location
+ text = icalproperty_get_location(p);
+ incidence->setLocation(QString::fromUtf8(text));
+ break;
+
+ case ICAL_STATUS_PROPERTY: { // status
+ Incidence::Status stat;
+ switch (icalproperty_get_status(p)) {
+ case ICAL_STATUS_TENTATIVE: stat = Incidence::StatusTentative; break;
+ case ICAL_STATUS_CONFIRMED: stat = Incidence::StatusConfirmed; break;
+ case ICAL_STATUS_COMPLETED: stat = Incidence::StatusCompleted; break;
+ case ICAL_STATUS_NEEDSACTION: stat = Incidence::StatusNeedsAction; break;
+ case ICAL_STATUS_CANCELLED: stat = Incidence::StatusCanceled; break;
+ case ICAL_STATUS_INPROCESS: stat = Incidence::StatusInProcess; break;
+ case ICAL_STATUS_DRAFT: stat = Incidence::StatusDraft; break;
+ case ICAL_STATUS_FINAL: stat = Incidence::StatusFinal; break;
+ case ICAL_STATUS_X:
+ incidence->setCustomStatus(QString::fromUtf8(icalvalue_get_x(icalproperty_get_value(p))));
+ stat = Incidence::StatusX;
+ break;
+ case ICAL_STATUS_NONE:
+ default: stat = Incidence::StatusNone; break;
+ }
+ if (stat != Incidence::StatusX)
+ incidence->setStatus(stat);
+ break;
+ }
+
+ case ICAL_PRIORITY_PROPERTY: // priority
+ intvalue = icalproperty_get_priority( p );
+ if ( mCompat )
+ intvalue = mCompat->fixPriority( intvalue );
+ incidence->setPriority( intvalue );
+ break;
+
+ case ICAL_CATEGORIES_PROPERTY: // categories
+ text = icalproperty_get_categories(p);
+ categories.append(QString::fromUtf8(text));
+ break;
+
+ case ICAL_RRULE_PROPERTY:
+ readRecurrenceRule( p, incidence );
+ break;
+
+ case ICAL_RDATE_PROPERTY: {
+ icaldatetimeperiodtype rd = icalproperty_get_rdate( p );
+ if ( icaltime_is_valid_time( rd.time ) ) {
+ if ( icaltime_is_date( rd.time ) ) {
+ incidence->recurrence()->addRDate( readICalDate( rd.time ) );
+ } else {
+ incidence->recurrence()->addRDateTime( readICalDateTime( rd.time, tz ) );
+ }
+ } else {
+ // TODO: RDates as period are not yet implemented!
+ }
+ break; }
+
+ case ICAL_EXRULE_PROPERTY:
+ readExceptionRule( p, incidence );
+ break;
+
+ case ICAL_EXDATE_PROPERTY:
+ icaltime = icalproperty_get_exdate(p);
+ if ( icaltime_is_date(icaltime) ) {
+ incidence->recurrence()->addExDate( readICalDate(icaltime) );
+ } else {
+ incidence->recurrence()->addExDateTime( readICalDateTime(icaltime, tz) );
+ }
+ break;
+
+ case ICAL_CLASS_PROPERTY:
+ inttext = icalproperty_get_class(p);
+ if (inttext == ICAL_CLASS_PUBLIC ) {
+ incidence->setSecrecy(Incidence::SecrecyPublic);
+ } else if (inttext == ICAL_CLASS_CONFIDENTIAL ) {
+ incidence->setSecrecy(Incidence::SecrecyConfidential);
+ } else {
+ incidence->setSecrecy(Incidence::SecrecyPrivate);
+ }
+ break;
+
+ case ICAL_ATTACH_PROPERTY: // attachments
+ incidence->addAttachment(readAttachment(p));
+ break;
+
+ default:
+// kdDebug(5800) << "ICALFormat::readIncidence(): Unknown property: " << kind
+// << endl;
+ break;
+ }
+
+ p = icalcomponent_get_next_property(parent,ICAL_ANY_PROPERTY);
+ }
+
+ // Set the scheduling ID
+ const QString uid = incidence->customProperty( "LIBKCAL", "ID" );
+ if ( !uid.isNull() ) {
+ // The UID stored in incidencebase is actually the scheduling ID
+ // It has to be stored in the iCal UID component for compatibility
+ // with other iCal applications
+ incidence->setSchedulingID( incidence->uid() );
+ incidence->setUid( uid );
+ }
+
+ // Now that recurrence and exception stuff is completely set up,
+ // do any backwards compatibility adjustments.
+ if ( incidence->doesRecur() && mCompat )
+ mCompat->fixRecurrence( incidence );
+
+ // add categories
+ incidence->setCategories(categories);
+
+ // iterate through all alarms
+ for (icalcomponent *alarm = icalcomponent_get_first_component(parent,ICAL_VALARM_COMPONENT);
+ alarm;
+ alarm = icalcomponent_get_next_component(parent,ICAL_VALARM_COMPONENT)) {
+ readAlarm(alarm,incidence);
+ }
+ // Fix incorrect alarm settings by other applications (like outloook 9)
+ if ( mCompat ) mCompat->fixAlarms( incidence );
+
+}
+
+void ICalFormatImpl::readIncidenceBase(icalcomponent *parent,IncidenceBase *incidenceBase)
+{
+ icalproperty *p = icalcomponent_get_first_property(parent,ICAL_ANY_PROPERTY);
+
+ while (p) {
+ icalproperty_kind kind = icalproperty_isa(p);
+ switch (kind) {
+
+ case ICAL_UID_PROPERTY: // unique id
+ incidenceBase->setUid(QString::fromUtf8(icalproperty_get_uid(p)));
+ break;
+
+ case ICAL_ORGANIZER_PROPERTY: // organizer
+ incidenceBase->setOrganizer( readOrganizer(p));
+ break;
+
+ case ICAL_ATTENDEE_PROPERTY: // attendee
+ incidenceBase->addAttendee(readAttendee(p));
+ break;
+
+ case ICAL_COMMENT_PROPERTY:
+ incidenceBase->addComment(
+ QString::fromUtf8(icalproperty_get_comment(p)));
+ break;
+
+ default:
+ break;
+ }
+
+ p = icalcomponent_get_next_property(parent,ICAL_ANY_PROPERTY);
+ }
+
+ // kpilot stuff
+ // TODO: move this application-specific code to kpilot
+ // need to get X-PILOT* attributes out, set correct properties, and get
+ // rid of them...
+ // Pointer fun, as per libical documentation
+ // (documented in UsingLibical.txt)
+ icalproperty *next =0;
+
+ for ( p = icalcomponent_get_first_property(parent,ICAL_X_PROPERTY);
+ p != 0;
+ p = next )
+ {
+
+ next = icalcomponent_get_next_property(parent,ICAL_X_PROPERTY);
+
+ QString value = QString::fromUtf8(icalproperty_get_x(p));
+ QString name = icalproperty_get_x_name(p);
+
+ if (name == "X-PILOTID" && !value.isEmpty()) {
+ incidenceBase->setPilotId(value.toInt());
+ icalcomponent_remove_property(parent,p);
+ } else if (name == "X-PILOTSTAT" && !value.isEmpty()) {
+ incidenceBase->setSyncStatus(value.toInt());
+ icalcomponent_remove_property(parent,p);
+ }
+ }
+
+ // custom properties
+ readCustomProperties(parent, incidenceBase);
+}
+
+void ICalFormatImpl::readCustomProperties(icalcomponent *parent,CustomProperties *properties)
+{
+ QMap<QCString, QString> customProperties;
+ QString lastProperty;
+
+ icalproperty *p = icalcomponent_get_first_property(parent,ICAL_X_PROPERTY);
+
+ while (p) {
+
+ QString value = QString::fromUtf8(icalproperty_get_x(p));
+ const char *name = icalproperty_get_x_name(p);
+ if ( lastProperty != name ) {
+ customProperties[name] = value;
+ } else {
+ customProperties[name] = customProperties[name].append( "," ).append( value );
+ }
+ // kdDebug(5800) << "Set custom property [" << name << '=' << value << ']' << endl;
+ p = icalcomponent_get_next_property(parent,ICAL_X_PROPERTY);
+ lastProperty = name;
+ }
+
+ properties->setCustomProperties(customProperties);
+}
+
+
+
+void ICalFormatImpl::readRecurrenceRule(icalproperty *rrule,Incidence *incidence )
+{
+// kdDebug(5800) << "Read recurrence for " << incidence->summary() << endl;
+
+ Recurrence *recur = incidence->recurrence();
+
+ struct icalrecurrencetype r = icalproperty_get_rrule(rrule);
+// dumpIcalRecurrence(r);
+
+ RecurrenceRule *recurrule = new RecurrenceRule( /*incidence*/ );
+ recurrule->setStartDt( incidence->dtStart() );
+ readRecurrence( r, recurrule );
+ recur->addRRule( recurrule );
+}
+
+void ICalFormatImpl::readExceptionRule( icalproperty *rrule, Incidence *incidence )
+{
+// kdDebug(5800) << "Read recurrence for " << incidence->summary() << endl;
+
+ struct icalrecurrencetype r = icalproperty_get_exrule(rrule);
+// dumpIcalRecurrence(r);
+
+ RecurrenceRule *recurrule = new RecurrenceRule( /*incidence*/ );
+ recurrule->setStartDt( incidence->dtStart() );
+ readRecurrence( r, recurrule );
+
+ Recurrence *recur = incidence->recurrence();
+ recur->addExRule( recurrule );
+}
+
+void ICalFormatImpl::readRecurrence( const struct icalrecurrencetype &r, RecurrenceRule* recur )
+{
+ // Generate the RRULE string
+ recur->mRRule = QString( icalrecurrencetype_as_string( const_cast<struct icalrecurrencetype*>(&r) ) );
+ // Period
+ switch ( r.freq ) {
+ case ICAL_SECONDLY_RECURRENCE: recur->setRecurrenceType( RecurrenceRule::rSecondly ); break;
+ case ICAL_MINUTELY_RECURRENCE: recur->setRecurrenceType( RecurrenceRule::rMinutely ); break;
+ case ICAL_HOURLY_RECURRENCE: recur->setRecurrenceType( RecurrenceRule::rHourly ); break;
+ case ICAL_DAILY_RECURRENCE: recur->setRecurrenceType( RecurrenceRule::rDaily ); break;
+ case ICAL_WEEKLY_RECURRENCE: recur->setRecurrenceType( RecurrenceRule::rWeekly ); break;
+ case ICAL_MONTHLY_RECURRENCE: recur->setRecurrenceType( RecurrenceRule::rMonthly ); break;
+ case ICAL_YEARLY_RECURRENCE: recur->setRecurrenceType( RecurrenceRule::rYearly ); break;
+ case ICAL_NO_RECURRENCE:
+ default:
+ recur->setRecurrenceType( RecurrenceRule::rNone );
+ }
+ // Frequency
+ recur->setFrequency( r.interval );
+
+ // Duration & End Date
+ if ( !icaltime_is_null_time( r.until ) ) {
+ icaltimetype t;
+ t = r.until;
+ // Convert to the correct time zone! it's in UTC by specification.
+ QDateTime endDate( readICalDateTime(t) );
+ recur->setEndDt( endDate );
+ } else {
+ if (r.count == 0)
+ recur->setDuration( -1 );
+ else
+ recur->setDuration( r.count );
+ }
+
+ // Week start setting
+ int wkst = (r.week_start + 5)%7 + 1;
+ recur->setWeekStart( wkst );
+
+ // And now all BY*
+ QValueList<int> lst;
+ int i;
+ int index = 0;
+
+#define readSetByList(rrulecomp,setfunc) \
+ index = 0; \
+ lst.clear(); \
+ while ( (i = r.rrulecomp[index++] ) != ICAL_RECURRENCE_ARRAY_MAX ) \
+ lst.append( i ); \
+ if ( !lst.isEmpty() ) recur->setfunc( lst );
+
+ // BYSECOND, MINUTE and HOUR, MONTHDAY, YEARDAY, WEEKNUMBER, MONTH
+ // and SETPOS are standard int lists, so we can treat them with the
+ // same macro
+ readSetByList( by_second, setBySeconds );
+ readSetByList( by_minute, setByMinutes );
+ readSetByList( by_hour, setByHours );
+ readSetByList( by_month_day, setByMonthDays );
+ readSetByList( by_year_day, setByYearDays );
+ readSetByList( by_week_no, setByWeekNumbers );
+ readSetByList( by_month, setByMonths );
+ readSetByList( by_set_pos, setBySetPos );
+#undef readSetByList
+
+ // BYDAY is a special case, since it's not an int list
+ QValueList<RecurrenceRule::WDayPos> wdlst;
+ short day;
+ index=0;
+ while((day = r.by_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) {
+ RecurrenceRule::WDayPos pos;
+ pos.setDay( ( icalrecurrencetype_day_day_of_week( day ) + 5 )%7 + 1 );
+ pos.setPos( icalrecurrencetype_day_position( day ) );
+// kdDebug(5800)<< " o) By day, index="<<index-1<<", pos="<<pos.Pos<<", day="<<pos.Day<<endl;
+ wdlst.append( pos );
+ }
+ if ( !wdlst.isEmpty() ) recur->setByDays( wdlst );
+
+
+ // TODO Store all X- fields of the RRULE inside the recurrence (so they are
+ // preserved
+}
+
+
+void ICalFormatImpl::readAlarm(icalcomponent *alarm,Incidence *incidence)
+{
+// kdDebug(5800) << "Read alarm for " << incidence->summary() << endl;
+
+ Alarm* ialarm = incidence->newAlarm();
+ ialarm->setRepeatCount(0);
+ ialarm->setEnabled(true);
+
+ // Determine the alarm's action type
+ icalproperty *p = icalcomponent_get_first_property(alarm,ICAL_ACTION_PROPERTY);
+ Alarm::Type type = Alarm::Display;
+ icalproperty_action action = ICAL_ACTION_DISPLAY;
+ if ( !p ) {
+ kdDebug(5800) << "Unknown type of alarm, using default" << endl;
+// return;
+ } else {
+
+ action = icalproperty_get_action(p);
+ switch ( action ) {
+ case ICAL_ACTION_DISPLAY: type = Alarm::Display; break;
+ case ICAL_ACTION_AUDIO: type = Alarm::Audio; break;
+ case ICAL_ACTION_PROCEDURE: type = Alarm::Procedure; break;
+ case ICAL_ACTION_EMAIL: type = Alarm::Email; break;
+ default:
+ kdDebug(5800) << "Unknown type of alarm: " << action << endl;
+// type = Alarm::Invalid;
+ }
+ }
+ ialarm->setType(type);
+// kdDebug(5800) << " alarm type =" << type << endl;
+
+ p = icalcomponent_get_first_property(alarm,ICAL_ANY_PROPERTY);
+ while (p) {
+ icalproperty_kind kind = icalproperty_isa(p);
+
+ switch (kind) {
+
+ case ICAL_TRIGGER_PROPERTY: {
+ icaltriggertype trigger = icalproperty_get_trigger(p);
+ if (icaltime_is_null_time(trigger.time)) {
+ if (icaldurationtype_is_null_duration(trigger.duration)) {
+ kdDebug(5800) << "ICalFormatImpl::readAlarm(): Trigger has no time and no duration." << endl;
+ } else {
+ Duration duration = icaldurationtype_as_int( trigger.duration );
+ icalparameter *param = icalproperty_get_first_parameter(p,ICAL_RELATED_PARAMETER);
+ if (param && icalparameter_get_related(param) == ICAL_RELATED_END)
+ ialarm->setEndOffset(duration);
+ else
+ ialarm->setStartOffset(duration);
+ }
+ } else {
+ ialarm->setTime(readICalDateTime(trigger.time));
+ }
+ break;
+ }
+ case ICAL_DURATION_PROPERTY: {
+ icaldurationtype duration = icalproperty_get_duration(p);
+ ialarm->setSnoozeTime(icaldurationtype_as_int(duration)/60);
+ break;
+ }
+ case ICAL_REPEAT_PROPERTY:
+ ialarm->setRepeatCount(icalproperty_get_repeat(p));
+ break;
+
+ // Only in DISPLAY and EMAIL and PROCEDURE alarms
+ case ICAL_DESCRIPTION_PROPERTY: {
+ QString description = QString::fromUtf8(icalproperty_get_description(p));
+ switch ( action ) {
+ case ICAL_ACTION_DISPLAY:
+ ialarm->setText( description );
+ break;
+ case ICAL_ACTION_PROCEDURE:
+ ialarm->setProgramArguments( description );
+ break;
+ case ICAL_ACTION_EMAIL:
+ ialarm->setMailText( description );
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+ // Only in EMAIL alarm
+ case ICAL_SUMMARY_PROPERTY:
+ ialarm->setMailSubject(QString::fromUtf8(icalproperty_get_summary(p)));
+ break;
+
+ // Only in EMAIL alarm
+ case ICAL_ATTENDEE_PROPERTY: {
+ QString email = QString::fromUtf8(icalproperty_get_attendee(p));
+ if ( email.startsWith("mailto:", false ) ) {
+ email = email.mid( 7 );
+ }
+ QString name;
+ icalparameter *param = icalproperty_get_first_parameter(p,ICAL_CN_PARAMETER);
+ if (param) {
+ name = QString::fromUtf8(icalparameter_get_cn(param));
+ }
+ ialarm->addMailAddress(Person(name, email));
+ break;
+ }
+ // Only in AUDIO and EMAIL and PROCEDURE alarms
+ case ICAL_ATTACH_PROPERTY: {
+ Attachment *attach = readAttachment( p );
+ if ( attach && attach->isUri() ) {
+ switch ( action ) {
+ case ICAL_ACTION_AUDIO:
+ ialarm->setAudioFile( attach->uri() );
+ break;
+ case ICAL_ACTION_PROCEDURE:
+ ialarm->setProgramFile( attach->uri() );
+ break;
+ case ICAL_ACTION_EMAIL:
+ ialarm->addMailAttachment( attach->uri() );
+ break;
+ default:
+ break;
+ }
+ } else {
+ kdDebug() << "Alarm attachments currently only support URIs, but "
+ "no binary data" << endl;
+ }
+ delete attach;
+ break;
+ }
+ default:
+ break;
+ }
+
+ p = icalcomponent_get_next_property(alarm,ICAL_ANY_PROPERTY);
+ }
+
+ // custom properties
+ readCustomProperties(alarm, ialarm);
+
+ // TODO: check for consistency of alarm properties
+}
+
+icaldatetimeperiodtype ICalFormatImpl::writeICalDatePeriod( const QDate &date )
+{
+ icaldatetimeperiodtype t;
+ t.time = writeICalDate( date );
+ t.period = icalperiodtype_null_period();
+ return t;
+}
+
+icaldatetimeperiodtype ICalFormatImpl::writeICalDateTimePeriod( const QDateTime &date )
+{
+ icaldatetimeperiodtype t;
+ t.time = writeICalDateTime( date );
+ t.period = icalperiodtype_null_period();
+ return t;
+}
+
+icaltimetype ICalFormatImpl::writeICalDate(const QDate &date)
+{
+ icaltimetype t = icaltime_null_time();
+
+ t.year = date.year();
+ t.month = date.month();
+ t.day = date.day();
+
+ t.hour = 0;
+ t.minute = 0;
+ t.second = 0;
+
+ t.is_date = 1;
+
+ t.is_utc = 0;
+
+ t.zone = 0;
+
+ return t;
+}
+
+icaltimetype ICalFormatImpl::writeICalDateTime(const QDateTime &datetime)
+{
+ icaltimetype t = icaltime_null_time();
+
+ t.year = datetime.date().year();
+ t.month = datetime.date().month();
+ t.day = datetime.date().day();
+
+ t.hour = datetime.time().hour();
+ t.minute = datetime.time().minute();
+ t.second = datetime.time().second();
+
+ t.is_date = 0;
+ t.zone = icaltimezone_get_builtin_timezone ( mParent->timeZoneId().latin1() );
+ t.is_utc = 0;
+
+ // _dumpIcaltime( t );
+ /* The QDateTime we get passed in is to be considered in the timezone of
+ * the current calendar (mParent's), or, if there is none, to be floating.
+ * In the later case store a floating time, in the former normalize to utc. */
+ if (mParent->timeZoneId().isEmpty())
+ t = icaltime_convert_to_zone( t, 0 ); //make floating timezone
+ else {
+ icaltimezone* tz = icaltimezone_get_builtin_timezone ( mParent->timeZoneId().latin1() );
+ icaltimezone* utc = icaltimezone_get_utc_timezone();
+ if ( tz != utc ) {
+ t.zone = tz;
+ t = icaltime_convert_to_zone( t, utc );
+ } else {
+ t.is_utc = 1;
+ t.zone = utc;
+ }
+ }
+// _dumpIcaltime( t );
+
+ return t;
+}
+
+QDateTime ICalFormatImpl::readICalDateTime( icaltimetype& t, icaltimezone* tz )
+{
+// kdDebug(5800) << "ICalFormatImpl::readICalDateTime()" << endl;
+ icaltimezone *zone = tz;
+ if ( tz && t.is_utc == 0 ) { // Only use the TZ if time is not UTC.
+ // FIXME: We'll need to make sure to apply the appropriate TZ, not just
+ // the first one found.
+ t.zone = tz;
+ t.is_utc = (tz == icaltimezone_get_utc_timezone())?1:0;
+ } else {
+ zone = icaltimezone_get_utc_timezone();
+ }
+ //_dumpIcaltime( t );
+
+ // Convert to view time
+ if ( !mParent->timeZoneId().isEmpty() && t.zone ) {
+// kdDebug(5800) << "--- Converting time from: " << icaltimezone_get_tzid( const_cast<icaltimezone*>( t.zone ) ) << " (" << ICalDate2QDate(t) << ")." << endl;
+ icaltimezone* viewTimeZone = icaltimezone_get_builtin_timezone ( mParent->timeZoneId().latin1() );
+ icaltimezone_convert_time( &t, zone, viewTimeZone );
+// kdDebug(5800) << "--- Converted to zone " << mParent->timeZoneId() << " (" << ICalDate2QDate(t) << ")." << endl;
+ }
+
+ return ICalDate2QDate(t);
+}
+
+QDate ICalFormatImpl::readICalDate(icaltimetype t)
+{
+ return ICalDate2QDate(t).date();
+}
+
+icaldurationtype ICalFormatImpl::writeICalDuration(int seconds)
+{
+ icaldurationtype d;
+
+ d.is_neg = (seconds<0)?1:0;
+ if (seconds<0) seconds = -seconds;
+
+ d.weeks = seconds / gSecondsPerWeek;
+ seconds %= gSecondsPerWeek;
+ d.days = seconds / gSecondsPerDay;
+ seconds %= gSecondsPerDay;
+ d.hours = seconds / gSecondsPerHour;
+ seconds %= gSecondsPerHour;
+ d.minutes = seconds / gSecondsPerMinute;
+ seconds %= gSecondsPerMinute;
+ d.seconds = seconds;
+
+ return d;
+}
+
+int ICalFormatImpl::readICalDuration(icaldurationtype d)
+{
+ int result = 0;
+
+ result += d.weeks * gSecondsPerWeek;
+ result += d.days * gSecondsPerDay;
+ result += d.hours * gSecondsPerHour;
+ result += d.minutes * gSecondsPerMinute;
+ result += d.seconds;
+
+ if (d.is_neg) result *= -1;
+
+ return result;
+}
+
+icalcomponent *ICalFormatImpl::createCalendarComponent(Calendar *cal)
+{
+ icalcomponent *calendar;
+
+ // Root component
+ calendar = icalcomponent_new(ICAL_VCALENDAR_COMPONENT);
+
+ icalproperty *p;
+
+ // Product Identifier
+ p = icalproperty_new_prodid(CalFormat::productId().utf8());
+ icalcomponent_add_property(calendar,p);
+
+ // TODO: Add time zone
+
+ // iCalendar version (2.0)
+ p = icalproperty_new_version(const_cast<char *>(_ICAL_VERSION));
+ icalcomponent_add_property(calendar,p);
+
+ // Custom properties
+ if( cal != 0 )
+ writeCustomProperties(calendar, cal);
+
+ return calendar;
+}
+
+
+
+// take a raw vcalendar (i.e. from a file on disk, clipboard, etc. etc.
+// and break it down from its tree-like format into the dictionary format
+// that is used internally in the ICalFormatImpl.
+bool ICalFormatImpl::populate( Calendar *cal, icalcomponent *calendar)
+{
+ // this function will populate the caldict dictionary and other event
+ // lists. It turns vevents into Events and then inserts them.
+
+ if (!calendar) return false;
+
+// TODO: check for METHOD
+
+ icalproperty *p;
+
+ p = icalcomponent_get_first_property(calendar,ICAL_PRODID_PROPERTY);
+ if (!p) {
+ kdDebug(5800) << "No PRODID property found" << endl;
+ mLoadedProductId = "";
+ } else {
+ mLoadedProductId = QString::fromUtf8(icalproperty_get_prodid(p));
+// kdDebug(5800) << "VCALENDAR prodid: '" << mLoadedProductId << "'" << endl;
+
+ delete mCompat;
+ mCompat = CompatFactory::createCompat( mLoadedProductId );
+ }
+
+ p = icalcomponent_get_first_property(calendar,ICAL_VERSION_PROPERTY);
+ if (!p) {
+ kdDebug(5800) << "No VERSION property found" << endl;
+ mParent->setException(new ErrorFormat(ErrorFormat::CalVersionUnknown));
+ return false;
+ } else {
+ const char *version = icalproperty_get_version(p);
+// kdDebug(5800) << "VCALENDAR version: '" << version << "'" << endl;
+
+ if (strcmp(version,"1.0") == 0) {
+ kdDebug(5800) << "Expected iCalendar, got vCalendar" << endl;
+ mParent->setException(new ErrorFormat(ErrorFormat::CalVersion1,
+ i18n("Expected iCalendar format")));
+ return false;
+ } else if (strcmp(version,"2.0") != 0) {
+ kdDebug(5800) << "Expected iCalendar, got unknown format" << endl;
+ mParent->setException(new ErrorFormat(ErrorFormat::CalVersionUnknown));
+ return false;
+ }
+ }
+
+ // custom properties
+ readCustomProperties(calendar, cal);
+
+// TODO: set time zone
+
+ // read a VTIMEZONE if there is one
+ icalcomponent *ctz =
+ icalcomponent_get_first_component( calendar, ICAL_VTIMEZONE_COMPONENT );
+
+ // Store all events with a relatedTo property in a list for post-processing
+ mEventsRelate.clear();
+ mTodosRelate.clear();
+ // TODO: make sure that only actually added events go to this lists.
+
+ icalcomponent *c;
+
+ // Iterate through all todos
+ c = icalcomponent_get_first_component(calendar,ICAL_VTODO_COMPONENT);
+ while (c) {
+// kdDebug(5800) << "----Todo found" << endl;
+ Todo *todo = readTodo(c);
+ if (todo) {
+ if (!cal->todo(todo->uid())) {
+ cal->addTodo(todo);
+ } else {
+ delete todo;
+ mTodosRelate.remove( todo );
+ }
+ }
+ c = icalcomponent_get_next_component(calendar,ICAL_VTODO_COMPONENT);
+ }
+
+ // Iterate through all events
+ c = icalcomponent_get_first_component(calendar,ICAL_VEVENT_COMPONENT);
+ while (c) {
+// kdDebug(5800) << "----Event found" << endl;
+ Event *event = readEvent(c, ctz);
+ if (event) {
+ if (!cal->event(event->uid())) {
+ cal->addEvent(event);
+ } else {
+ delete event;
+ mEventsRelate.remove( event );
+ }
+ }
+ c = icalcomponent_get_next_component(calendar,ICAL_VEVENT_COMPONENT);
+ }
+
+ // Iterate through all journals
+ c = icalcomponent_get_first_component(calendar,ICAL_VJOURNAL_COMPONENT);
+ while (c) {
+// kdDebug(5800) << "----Journal found" << endl;
+ Journal *journal = readJournal(c);
+ if (journal) {
+ if (!cal->journal(journal->uid())) {
+ cal->addJournal(journal);
+ } else {
+ delete journal;
+ }
+ }
+ c = icalcomponent_get_next_component(calendar,ICAL_VJOURNAL_COMPONENT);
+ }
+
+ // Post-Process list of events with relations, put Event objects in relation
+ Event::List::ConstIterator eIt;
+ for ( eIt = mEventsRelate.begin(); eIt != mEventsRelate.end(); ++eIt ) {
+ (*eIt)->setRelatedTo( cal->incidence( (*eIt)->relatedToUid() ) );
+ }
+ Todo::List::ConstIterator tIt;
+ for ( tIt = mTodosRelate.begin(); tIt != mTodosRelate.end(); ++tIt ) {
+ (*tIt)->setRelatedTo( cal->incidence( (*tIt)->relatedToUid() ) );
+ }
+
+ return true;
+}
+
+QString ICalFormatImpl::extractErrorProperty(icalcomponent *c)
+{
+// kdDebug(5800) << "ICalFormatImpl:extractErrorProperty: "
+// << icalcomponent_as_ical_string(c) << endl;
+
+ QString errorMessage;
+
+ icalproperty *error;
+ error = icalcomponent_get_first_property(c,ICAL_XLICERROR_PROPERTY);
+ while(error) {
+ errorMessage += icalproperty_get_xlicerror(error);
+ errorMessage += "\n";
+ error = icalcomponent_get_next_property(c,ICAL_XLICERROR_PROPERTY);
+ }
+
+// kdDebug(5800) << "ICalFormatImpl:extractErrorProperty: " << errorMessage << endl;
+
+ return errorMessage;
+}
+
+void ICalFormatImpl::dumpIcalRecurrence(icalrecurrencetype r)
+{
+ int i;
+
+ kdDebug(5800) << " Freq: " << r.freq << endl;
+ kdDebug(5800) << " Until: " << icaltime_as_ical_string(r.until) << endl;
+ kdDebug(5800) << " Count: " << r.count << endl;
+ if (r.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX) {
+ int index = 0;
+ QString out = " By Day: ";
+ while((i = r.by_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) {
+ out.append(QString::number(i) + " ");
+ }
+ kdDebug(5800) << out << endl;
+ }
+ if (r.by_month_day[0] != ICAL_RECURRENCE_ARRAY_MAX) {
+ int index = 0;
+ QString out = " By Month Day: ";
+ while((i = r.by_month_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) {
+ out.append(QString::number(i) + " ");
+ }
+ kdDebug(5800) << out << endl;
+ }
+ if (r.by_year_day[0] != ICAL_RECURRENCE_ARRAY_MAX) {
+ int index = 0;
+ QString out = " By Year Day: ";
+ while((i = r.by_year_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) {
+ out.append(QString::number(i) + " ");
+ }
+ kdDebug(5800) << out << endl;
+ }
+ if (r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX) {
+ int index = 0;
+ QString out = " By Month: ";
+ while((i = r.by_month[index++]) != ICAL_RECURRENCE_ARRAY_MAX) {
+ out.append(QString::number(i) + " ");
+ }
+ kdDebug(5800) << out << endl;
+ }
+ if (r.by_set_pos[0] != ICAL_RECURRENCE_ARRAY_MAX) {
+ int index = 0;
+ QString out = " By Set Pos: ";
+ while((i = r.by_set_pos[index++]) != ICAL_RECURRENCE_ARRAY_MAX) {
+ kdDebug(5800) << "========= " << i << endl;
+ out.append(QString::number(i) + " ");
+ }
+ kdDebug(5800) << out << endl;
+ }
+}
+
+icalcomponent *ICalFormatImpl::createScheduleComponent(IncidenceBase *incidence,
+ Scheduler::Method method)
+{
+ icalcomponent *message = createCalendarComponent();
+
+ icalproperty_method icalmethod = ICAL_METHOD_NONE;
+
+ switch (method) {
+ case Scheduler::Publish:
+ icalmethod = ICAL_METHOD_PUBLISH;
+ break;
+ case Scheduler::Request:
+ icalmethod = ICAL_METHOD_REQUEST;
+ break;
+ case Scheduler::Refresh:
+ icalmethod = ICAL_METHOD_REFRESH;
+ break;
+ case Scheduler::Cancel:
+ icalmethod = ICAL_METHOD_CANCEL;
+ break;
+ case Scheduler::Add:
+ icalmethod = ICAL_METHOD_ADD;
+ break;
+ case Scheduler::Reply:
+ icalmethod = ICAL_METHOD_REPLY;
+ break;
+ case Scheduler::Counter:
+ icalmethod = ICAL_METHOD_COUNTER;
+ break;
+ case Scheduler::Declinecounter:
+ icalmethod = ICAL_METHOD_DECLINECOUNTER;
+ break;
+ default:
+ kdDebug(5800) << "ICalFormat::createScheduleMessage(): Unknow method" << endl;
+ return message;
+ }
+
+ icalcomponent_add_property(message,icalproperty_new_method(icalmethod));
+
+ icalcomponent *inc = writeIncidence( incidence, method );
+ /*
+ * RFC 2446 states in section 3.4.3 ( REPLY to a VTODO ), that
+ * a REQUEST-STATUS property has to be present. For the other two, event and
+ * free busy, it can be there, but is optional. Until we do more
+ * fine grained handling, assume all is well. Note that this is the
+ * status of the _request_, not the attendee. Just to avoid confusion.
+ * - till
+ */
+ if ( icalmethod == ICAL_METHOD_REPLY ) {
+ struct icalreqstattype rst;
+ rst.code = ICAL_2_0_SUCCESS_STATUS;
+ rst.desc = 0;
+ rst.debug = 0;
+ icalcomponent_add_property( inc, icalproperty_new_requeststatus( rst ) );
+ }
+ icalcomponent_add_component( message, inc );
+
+ return message;
+}
diff --git a/libkcal/icalformatimpl.h b/libkcal/icalformatimpl.h
new file mode 100644
index 00000000..c92f381b
--- /dev/null
+++ b/libkcal/icalformatimpl.h
@@ -0,0 +1,127 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001-2003 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_ICALFORMATIMPL_H
+#define KCAL_ICALFORMATIMPL_H
+
+#include <qstring.h>
+#include <qdict.h>
+
+#include "scheduler.h"
+#include "freebusy.h"
+
+
+extern "C" {
+ #include <ical.h>
+}
+
+namespace KCal {
+
+class Compat;
+
+/**
+ @internal
+
+ This class provides the libical dependent functions for ICalFormat.
+*/
+class ICalFormatImpl
+{
+ public:
+ /** Create new iCal format for calendar object */
+ ICalFormatImpl( ICalFormat *parent );
+ virtual ~ICalFormatImpl();
+
+ bool populate( Calendar *, icalcomponent *fs);
+
+ icalcomponent *writeIncidence(IncidenceBase *incidence, Scheduler::Method method = Scheduler::Request );
+ icalcomponent *writeTodo(Todo *todo);
+ icalcomponent *writeEvent(Event *event);
+ icalcomponent *writeFreeBusy(FreeBusy *freebusy,
+ Scheduler::Method method = Scheduler::Publish );
+ icalcomponent *writeJournal(Journal *journal);
+ void writeIncidence(icalcomponent *parent,Incidence *incidence);
+ icalproperty *writeAttendee(Attendee *attendee);
+ icalproperty *writeOrganizer( const Person &organizer );
+ icalproperty *writeAttachment(Attachment *attach);
+ icalproperty *writeRecurrenceRule(Recurrence *);
+ icalrecurrencetype writeRecurrenceRule( RecurrenceRule *recur );
+ icalcomponent *writeAlarm(Alarm *alarm);
+
+ QString extractErrorProperty(icalcomponent *);
+ Todo *readTodo(icalcomponent *vtodo);
+ Event *readEvent(icalcomponent *vevent, icalcomponent *vtimezone);
+ FreeBusy *readFreeBusy(icalcomponent *vfreebusy);
+ Journal *readJournal(icalcomponent *vjournal);
+ Attendee *readAttendee(icalproperty *attendee);
+ Person readOrganizer( icalproperty *organizer );
+ Attachment *readAttachment(icalproperty *attach);
+ void readIncidence(icalcomponent *parent, icaltimezone *timezone, Incidence *incidence);
+ void readRecurrenceRule(icalproperty *rrule,Incidence *event );
+ void readExceptionRule( icalproperty *rrule, Incidence *incidence );
+ void readRecurrence( const struct icalrecurrencetype &r, RecurrenceRule* recur );
+ void readAlarm(icalcomponent *alarm,Incidence *incidence);
+ /** Return the PRODID string loaded from calendar file */
+ const QString &loadedProductId() { return mLoadedProductId; }
+
+ static icaltimetype writeICalDate(const QDate &);
+ static QDate readICalDate(icaltimetype);
+ icaltimetype writeICalDateTime(const QDateTime &);
+ QDateTime readICalDateTime( icaltimetype&, icaltimezone* tz = 0 );
+ static icaldurationtype writeICalDuration(int seconds);
+ static int readICalDuration(icaldurationtype);
+ static icaldatetimeperiodtype writeICalDatePeriod( const QDate &date );
+ icaldatetimeperiodtype writeICalDateTimePeriod( const QDateTime &date );
+
+ icalcomponent *createCalendarComponent(Calendar * = 0);
+ icalcomponent *createScheduleComponent(IncidenceBase *,Scheduler::Method);
+
+ protected:
+ void dumpIcalRecurrence(icalrecurrencetype);
+ private:
+ void writeIncidenceBase(icalcomponent *parent,IncidenceBase *);
+ void readIncidenceBase(icalcomponent *parent, IncidenceBase *);
+ void writeCustomProperties(icalcomponent *parent,CustomProperties *);
+ void readCustomProperties(icalcomponent *parent,CustomProperties *);
+ void readTimezone(icalcomponent *vtimezone);
+
+ ICalFormat *mParent;
+ Calendar *mCalendar;
+
+ QString mLoadedProductId; // PRODID string loaded from calendar file
+
+ Event::List mEventsRelate; // events with relations
+ Todo::List mTodosRelate; // todos with relations
+
+ static const int mSecondsPerWeek;
+ static const int mSecondsPerDay;
+ static const int mSecondsPerHour;
+ static const int mSecondsPerMinute;
+
+ Compat *mCompat;
+
+ class ToComponentVisitor;
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/imipscheduler.cpp b/libkcal/imipscheduler.cpp
new file mode 100644
index 00000000..2a83840e
--- /dev/null
+++ b/libkcal/imipscheduler.cpp
@@ -0,0 +1,59 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+//
+// IMIPScheduler - iMIP implementation of iTIP methods
+//
+
+#include "event.h"
+#include "icalformat.h"
+
+#include "imipscheduler.h"
+
+using namespace KCal;
+
+IMIPScheduler::IMIPScheduler(Calendar *calendar)
+ : Scheduler(calendar)
+{
+}
+
+IMIPScheduler::~IMIPScheduler()
+{
+}
+
+bool IMIPScheduler::publish (IncidenceBase * /*incidence*/,const QString &/*recipients*/)
+{
+ return false;
+}
+
+bool IMIPScheduler::performTransaction(IncidenceBase *incidence,Method method)
+{
+ mFormat->createScheduleMessage(incidence,method);
+
+ return false;
+}
+
+QPtrList<ScheduleMessage> IMIPScheduler::retrieveTransactions()
+{
+ QPtrList<ScheduleMessage> messageList;
+
+ return messageList;
+}
diff --git a/libkcal/imipscheduler.h b/libkcal/imipscheduler.h
new file mode 100644
index 00000000..95535798
--- /dev/null
+++ b/libkcal/imipscheduler.h
@@ -0,0 +1,55 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001-2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_IMIPSCHEDULER_H
+#define KCAL_IMIPSCHEDULER_H
+
+#include <qptrlist.h>
+#include "libkcal_export.h"
+
+#include "scheduler.h"
+
+namespace KCal {
+
+/*
+ \internal
+
+ This class implements the iTIP interface using the email interface specified
+ as iMIP.
+*/
+class KDE_EXPORT IMIPScheduler : public Scheduler
+{
+ public:
+ IMIPScheduler( Calendar * );
+ virtual ~IMIPScheduler();
+
+ bool publish (IncidenceBase *incidence,const QString &recipients);
+ bool performTransaction(IncidenceBase *incidence,Method method);
+ QPtrList<ScheduleMessage> retrieveTransactions();
+
+ private:
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
+
diff --git a/libkcal/incidence.cpp b/libkcal/incidence.cpp
new file mode 100644
index 00000000..c4ee5108
--- /dev/null
+++ b/libkcal/incidence.cpp
@@ -0,0 +1,847 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kglobal.h>
+#include <klocale.h>
+#include <kdebug.h>
+
+#include "calformat.h"
+
+#include "incidence.h"
+
+using namespace KCal;
+
+Incidence::Incidence() :
+ IncidenceBase(),
+ mRelatedTo(0), mStatus(StatusNone), mSecrecy(SecrecyPublic),
+ mPriority(0), mRecurrence(0)
+{
+ recreate();
+
+ mAlarms.setAutoDelete(true);
+ mAttachments.setAutoDelete(true);
+}
+
+Incidence::Incidence( const Incidence &i ) : IncidenceBase( i ),Recurrence::Observer()
+{
+// TODO: reenable attributes currently commented out.
+ mRevision = i.mRevision;
+ mCreated = i.mCreated;
+ mDescription = i.mDescription;
+ mSummary = i.mSummary;
+ mCategories = i.mCategories;
+// Incidence *mRelatedTo; Incidence *mRelatedTo;
+ mRelatedTo = 0;
+ mRelatedToUid = i.mRelatedToUid;
+// Incidence::List mRelations; Incidence::List mRelations;
+ mResources = i.mResources;
+ mStatusString = i.mStatusString;
+ mStatus = i.mStatus;
+ mSecrecy = i.mSecrecy;
+ mPriority = i.mPriority;
+ mLocation = i.mLocation;
+
+ // Alarms and Attachments are stored in ListBase<...>, which is a QValueList<...*>.
+ // We need to really duplicate the objects stored therein, otherwise deleting
+ // i will also delete all attachments from this object (setAutoDelete...)
+ Alarm::List::ConstIterator it;
+ for( it = i.mAlarms.begin(); it != i.mAlarms.end(); ++it ) {
+ Alarm *b = new Alarm( **it );
+ b->setParent( this );
+ mAlarms.append( b );
+ }
+ mAlarms.setAutoDelete(true);
+
+ Attachment::List::ConstIterator it1;
+ for ( it1 = i.mAttachments.begin(); it1 != i.mAttachments.end(); ++it1 ) {
+ Attachment *a = new Attachment( **it1 );
+ mAttachments.append( a );
+ }
+ mAttachments.setAutoDelete( true );
+
+ if (i.mRecurrence) {
+ mRecurrence = new Recurrence( *(i.mRecurrence) );
+ mRecurrence->addObserver( this );
+ } else
+ mRecurrence = 0;
+
+ mSchedulingID = i.mSchedulingID;
+}
+
+Incidence::~Incidence()
+{
+ Incidence::List Relations = mRelations;
+ List::ConstIterator it;
+ for ( it = Relations.begin(); it != Relations.end(); ++it ) {
+ if ( (*it)->relatedTo() == this ) (*it)->mRelatedTo = 0;
+ }
+ if ( relatedTo() ) relatedTo()->removeRelation( this );
+
+ delete mRecurrence;
+}
+
+// A string comparison that considers that null and empty are the same
+static bool stringCompare( const QString& s1, const QString& s2 )
+{
+ return ( s1.isEmpty() && s2.isEmpty() ) || (s1 == s2);
+}
+
+Incidence& Incidence::operator=( const Incidence &i )
+{
+ if ( &i == this )
+ return *this;
+ IncidenceBase::operator=( i );
+ mRevision = i.mRevision;
+ mCreated = i.mCreated;
+ mDescription = i.mDescription;
+ mSummary = i.mSummary;
+ mCategories = i.mCategories;
+ mRelatedTo = 0;
+ mRelatedToUid = i.mRelatedToUid;
+ mRelations.clear();
+ mResources = i.mResources;
+ mStatusString = i.mStatusString;
+ mStatus = i.mStatus;
+ mSecrecy = i.mSecrecy;
+ mPriority = i.mPriority;
+ mLocation = i.mLocation;
+
+ mAlarms.clearAll();
+ Alarm::List::ConstIterator it;
+ for( it = i.mAlarms.begin(); it != i.mAlarms.end(); ++it ) {
+ Alarm *b = new Alarm( **it );
+ b->setParent( this );
+ mAlarms.append( b );
+ }
+
+ mAttachments.clearAll();
+ Attachment::List::ConstIterator it1;
+ for ( it1 = i.mAttachments.begin(); it1 != i.mAttachments.end(); ++it1 ) {
+ Attachment *a = new Attachment( **it1 );
+ mAttachments.append( a );
+ }
+
+ delete mRecurrence;
+ if (i.mRecurrence) {
+ mRecurrence = new Recurrence( *(i.mRecurrence) );
+ mRecurrence->addObserver( this );
+ } else
+ mRecurrence = 0;
+
+ mSchedulingID = i.mSchedulingID;
+ return *this;
+}
+
+bool Incidence::operator==( const Incidence& i2 ) const
+{
+ if( alarms().count() != i2.alarms().count() ) {
+ return false; // no need to check further
+ }
+
+ Alarm::List::ConstIterator a1 = alarms().begin();
+ Alarm::List::ConstIterator a2 = i2.alarms().begin();
+ for( ; a1 != alarms().end() && a2 != i2.alarms().end(); ++a1, ++a2 )
+ if( **a1 == **a2 )
+ continue;
+ else {
+ return false;
+ }
+
+ if ( !IncidenceBase::operator==(i2) )
+ return false;
+
+ bool recurrenceEqual = ( mRecurrence == 0 && i2.mRecurrence == 0 );
+ if ( !recurrenceEqual )
+ {
+ recurrenceEqual = mRecurrence != 0 &&
+ i2.mRecurrence != 0 &&
+ *mRecurrence == *i2.mRecurrence;
+ }
+
+ return
+ recurrenceEqual &&
+ created() == i2.created() &&
+ stringCompare( description(), i2.description() ) &&
+ stringCompare( summary(), i2.summary() ) &&
+ categories() == i2.categories() &&
+ // no need to compare mRelatedTo
+ stringCompare( relatedToUid(), i2.relatedToUid() ) &&
+ relations() == i2.relations() &&
+ attachments() == i2.attachments() &&
+ resources() == i2.resources() &&
+ mStatus == i2.mStatus &&
+ ( mStatus == StatusNone || stringCompare( mStatusString, i2.mStatusString ) ) &&
+ secrecy() == i2.secrecy() &&
+ priority() == i2.priority() &&
+ stringCompare( location(), i2.location() ) &&
+ stringCompare( schedulingID(), i2.schedulingID() );
+}
+
+
+void Incidence::recreate()
+{
+ setCreated(QDateTime::currentDateTime());
+
+ setUid(CalFormat::createUniqueId());
+ setSchedulingID( QString::null );
+
+ setRevision(0);
+
+ setLastModified(QDateTime::currentDateTime());
+ setPilotId( 0 );
+ setSyncStatus( SYNCNONE );
+}
+
+void Incidence::setReadOnly( bool readOnly )
+{
+ IncidenceBase::setReadOnly( readOnly );
+ if ( mRecurrence )
+ mRecurrence->setRecurReadOnly( readOnly );
+}
+
+void Incidence::setFloats(bool f)
+{
+ if (mReadOnly) return;
+ if ( recurrence() )
+ recurrence()->setFloats( f );
+ IncidenceBase::setFloats( f );
+}
+
+void Incidence::setCreated( const QDateTime &created )
+{
+ if (mReadOnly) return;
+ mCreated = created;
+
+// FIXME: Shouldn't we call updated for the creation date, too?
+// updated();
+}
+
+QDateTime Incidence::created() const
+{
+ return mCreated;
+}
+
+void Incidence::setRevision( int rev )
+{
+ if (mReadOnly) return;
+ mRevision = rev;
+
+ updated();
+}
+
+int Incidence::revision() const
+{
+ return mRevision;
+}
+
+void Incidence::setDtStart(const QDateTime &dtStart)
+{
+ if ( mRecurrence ) {
+ mRecurrence->setStartDateTime( dtStart );
+ mRecurrence->setFloats( doesFloat() );
+ }
+ IncidenceBase::setDtStart( dtStart );
+}
+
+void Incidence::setDescription(const QString &description)
+{
+ if (mReadOnly) return;
+ mDescription = description;
+ updated();
+}
+
+QString Incidence::description() const
+{
+ return mDescription;
+}
+
+
+void Incidence::setSummary(const QString &summary)
+{
+ if (mReadOnly) return;
+ mSummary = summary;
+ updated();
+}
+
+QString Incidence::summary() const
+{
+ return mSummary;
+}
+
+void Incidence::setCategories(const QStringList &categories)
+{
+ if (mReadOnly) return;
+ mCategories = categories;
+ updated();
+}
+
+// TODO: remove setCategories(QString) function
+void Incidence::setCategories(const QString &catStr)
+{
+ if (mReadOnly) return;
+ mCategories.clear();
+
+ if (catStr.isEmpty()) return;
+
+ mCategories = QStringList::split(",",catStr);
+
+ QStringList::Iterator it;
+ for(it = mCategories.begin();it != mCategories.end(); ++it) {
+ *it = (*it).stripWhiteSpace();
+ }
+
+ updated();
+}
+
+QStringList Incidence::categories() const
+{
+ return mCategories;
+}
+
+QString Incidence::categoriesStr() const
+{
+ return mCategories.join(",");
+}
+
+void Incidence::setRelatedToUid(const QString &relatedToUid)
+{
+ if ( mReadOnly || mRelatedToUid == relatedToUid ) return;
+ mRelatedToUid = relatedToUid;
+ updated();
+}
+
+QString Incidence::relatedToUid() const
+{
+ return mRelatedToUid;
+}
+
+void Incidence::setRelatedTo(Incidence *relatedTo)
+{
+ if (mReadOnly || mRelatedTo == relatedTo) return;
+ if(mRelatedTo)
+ mRelatedTo->removeRelation(this);
+ mRelatedTo = relatedTo;
+ if (mRelatedTo) {
+ mRelatedTo->addRelation(this);
+ if ( mRelatedTo->uid() != mRelatedToUid )
+ setRelatedToUid( mRelatedTo->uid() );
+ } else {
+ setRelatedToUid( QString::null );
+ }
+}
+
+Incidence *Incidence::relatedTo() const
+{
+ return mRelatedTo;
+}
+
+Incidence::List Incidence::relations() const
+{
+ return mRelations;
+}
+
+void Incidence::addRelation( Incidence *event )
+{
+ if ( mRelations.find( event ) == mRelations.end() ) {
+ mRelations.append( event );
+ }
+}
+
+void Incidence::removeRelation(Incidence *event)
+// Remove the relation of our incident. E.g. if you have a task t and a
+// subtask, the subtask will have its relation to the task t.
+{
+ mRelations.removeRef(event);
+// if (event->getRelatedTo() == this) event->setRelatedTo(0);
+ mRelatedToUid=QString();
+}
+
+
+// %%%%%%%%%%%% Recurrence-related methods %%%%%%%%%%%%%%%%%%%%
+
+
+Recurrence *Incidence::recurrence() const
+{
+ if (!mRecurrence)
+ {
+ const_cast<KCal::Incidence*>(this)->mRecurrence = new Recurrence();
+ mRecurrence->setStartDateTime( IncidenceBase::dtStart() );
+ mRecurrence->setFloats( doesFloat() );
+ mRecurrence->setRecurReadOnly( mReadOnly );
+ mRecurrence->addObserver( const_cast<KCal::Incidence*>(this) );
+ }
+
+ return mRecurrence;
+}
+
+void Incidence::clearRecurrence()
+{
+ delete mRecurrence;
+ mRecurrence = 0;
+}
+
+uint Incidence::recurrenceType() const
+{
+ if ( mRecurrence ) return mRecurrence->recurrenceType();
+ else return Recurrence::rNone;
+}
+
+bool Incidence::doesRecur() const
+{
+ if ( mRecurrence ) return mRecurrence->doesRecur();
+ else return false;
+}
+
+bool Incidence::recursOn(const QDate &qd) const
+{
+ return ( mRecurrence && mRecurrence->recursOn(qd) );
+}
+
+bool Incidence::recursAt(const QDateTime &qdt) const
+{
+ return ( mRecurrence && mRecurrence->recursAt(qdt) );
+}
+
+/**
+ Calculates the start date/time for all recurrences that happen at some time
+ on the given date (might start before that date, but end on or after the
+ given date).
+ @param date the date where the incidence should occur
+ @return the start date/time of all occurences that overlap with the given
+ date. Empty list if the incidence does not overlap with the date at all
+*/
+QValueList<QDateTime> Incidence::startDateTimesForDate( const QDate &date ) const
+{
+//kdDebug(5800) << "Incidence::startDateTimesForDate " << date << ", incidence=" << summary() << endl;
+ QDateTime start = dtStart();
+ QDateTime end = endDateRecurrenceBase();
+
+ QValueList<QDateTime> result;
+
+ // TODO_Recurrence: Also work if only due date is given...
+ if ( !start.isValid() && ! end.isValid() ) {
+ return result;
+ }
+
+ // if the incidence doesn't recur,
+ if ( !doesRecur() ) {
+ if ( !(start.date() > date || end.date() < date ) ) {
+ result << start;
+ }
+ return result;
+ }
+
+ int days = start.daysTo( end );
+ // Account for possible recurrences going over midnight, while the original event doesn't
+ QDate tmpday( date.addDays( -days - 1 ) );
+ QDateTime tmp;
+ while ( tmpday <= date ) {
+ if ( recurrence()->recursOn( tmpday ) ) {
+ QValueList<QTime> times = recurrence()->recurTimesOn( tmpday );
+ for ( QValueList<QTime>::ConstIterator it = times.begin(); it != times.end(); ++it ) {
+ tmp = QDateTime( tmpday, *it );
+ if ( endDateForStart( tmp ).date() >= date )
+ result << tmp;
+ }
+ }
+ tmpday = tmpday.addDays( 1 );
+ }
+ return result;
+}
+
+/**
+ Calculates the start date/time for all recurrences that happen at the given
+ time.
+ @param datetime the date/time where the incidence should occur
+ @return the start date/time of all occurences that overlap with the given
+ date/time. Empty list if the incidence does not happen at the given
+ time at all.
+*/
+QValueList<QDateTime> Incidence::startDateTimesForDateTime( const QDateTime &datetime ) const
+{
+// kdDebug(5800) << "Incidence::startDateTimesForDateTime " << datetime << ", incidence=" << summary() << endl;
+ QDateTime start = dtStart();
+ QDateTime end = endDateRecurrenceBase();
+
+ QValueList<QDateTime> result;
+
+ // TODO_Recurrence: Also work if only due date is given...
+ if ( !start.isValid() && ! end.isValid() ) {
+ return result;
+ }
+
+ // if the incidence doesn't recur,
+ if ( !doesRecur() ) {
+ if ( !(start > datetime || end < datetime ) ) {
+ result << start;
+ }
+ return result;
+ }
+
+ int days = start.daysTo( end );
+ // Account for possible recurrences going over midnight, while the original event doesn't
+ QDate tmpday( datetime.date().addDays( -days - 1 ) );
+ QDateTime tmp;
+ while ( tmpday <= datetime.date() ) {
+ if ( recurrence()->recursOn( tmpday ) ) {
+ QValueList<QTime> times = recurrence()->recurTimesOn( tmpday );
+ for ( QValueList<QTime>::ConstIterator it = times.begin(); it != times.end(); ++it ) {
+ tmp = QDateTime( tmpday, *it );
+ if ( !(tmp > datetime || endDateForStart( tmp ) < datetime ) )
+ result << tmp;
+ }
+ }
+ tmpday = tmpday.addDays( 1 );
+ }
+ return result;
+}
+
+/** Return the end time of the occurrence if it starts at the given date/time */
+QDateTime Incidence::endDateForStart( const QDateTime &startDt ) const
+{
+ QDateTime start = dtStart();
+ QDateTime end = endDateRecurrenceBase();
+ if ( !end.isValid() ) return start;
+ if ( !start.isValid() ) return end;
+
+ return startDt.addSecs( start.secsTo( end ) );
+}
+
+// %%%%%%%%%%%%%%%%% begin:RecurrenceRule %%%%%%%%%%%%%%%%%
+
+// Exception Dates
+/*void Incidence::setExDates(const DateList &exDates)
+{
+ if ( mReadOnly ) return;
+ recurrence()->setExDates( exDates );
+ updated();
+}
+
+void Incidence::addExDate( const QDate &date )
+{
+ if ( mReadOnly ) return;
+ recurrence()->addExDate( date );
+ updated();
+}
+
+DateList Incidence::exDates() const
+{
+ if ( mRecurrence ) return mRecurrence->exDates();
+ else return DateList();
+}
+
+
+// Exception DateTimes
+void Incidence::setExDateTimes( const DateTimeList &exDates )
+{
+ if ( mReadOnly ) return;
+ recurrence()->setExDateTimes( exDates );
+ updated();
+}
+
+void Incidence::addExDateTime( const QDateTime &date )
+{
+ if ( mReadOnly ) return;
+ recurrence()->addExDateTime( date );
+ updated();
+}
+
+DateTimeList Incidence::exDateTimes() const
+{
+ if ( mRecurrence ) return mRecurrence->exDateTimes();
+ else return DateTimeList();
+}
+
+
+// Recurrence Dates
+void Incidence::setRDates(const DateList &exDates)
+{
+ if ( mReadOnly ) return;
+ recurrence()->setRDates( exDates );
+ updated();
+}
+
+void Incidence::addRDate( const QDate &date )
+{
+ if ( mReadOnly ) return;
+ recurrence()->addRDate( date );
+ updated();
+}
+
+DateList Incidence::rDates() const
+{
+ if ( mRecurrence ) return mRecurrence->rDates();
+ else return DateList();
+}
+
+
+// Recurrence DateTimes
+void Incidence::setRDateTimes( const DateTimeList &exDates )
+{
+ if ( mReadOnly ) return;
+ recurrence()->setRDateTimes( exDates );
+ updated();
+}
+
+void Incidence::addRDateTime( const QDateTime &date )
+{
+ if ( mReadOnly ) return;
+ recurrence()->addRDateTime( date );
+ updated();
+}
+
+DateTimeList Incidence::rDateTimes() const
+{
+ if ( mRecurrence ) return mRecurrence->rDateTimes();
+ else return DateTimeList();
+}*/
+
+// %%%%%%%%%%%%%%%%% end:RecurrenceRule %%%%%%%%%%%%%%%%%
+
+void Incidence::addAttachment(Attachment *attachment)
+{
+ if (mReadOnly || !attachment) return;
+ mAttachments.append(attachment);
+ updated();
+}
+
+void Incidence::deleteAttachment(Attachment *attachment)
+{
+ mAttachments.removeRef(attachment);
+}
+
+void Incidence::deleteAttachments( const QString &mime )
+{
+ Attachment::List::Iterator it = mAttachments.begin();
+ while( it != mAttachments.end() ) {
+ if ( (*it)->mimeType() == mime ) mAttachments.remove( it );
+ else ++it;
+ }
+}
+
+Attachment::List Incidence::attachments() const
+{
+ return mAttachments;
+}
+
+Attachment::List Incidence::attachments(const QString& mime) const
+{
+ Attachment::List attachments;
+ Attachment::List::ConstIterator it;
+ for( it = mAttachments.begin(); it != mAttachments.end(); ++it ) {
+ if ( (*it)->mimeType() == mime ) attachments.append( *it );
+ }
+
+ return attachments;
+}
+
+void Incidence::clearAttachments()
+{
+ mAttachments.clearAll();
+}
+
+void Incidence::setResources(const QStringList &resources)
+{
+ if (mReadOnly) return;
+ mResources = resources;
+ updated();
+}
+
+QStringList Incidence::resources() const
+{
+ return mResources;
+}
+
+
+void Incidence::setPriority(int priority)
+{
+ if (mReadOnly) return;
+ mPriority = priority;
+ updated();
+}
+
+int Incidence::priority() const
+{
+ return mPriority;
+}
+
+void Incidence::setStatus(Incidence::Status status)
+{
+ if (mReadOnly || status == StatusX) return;
+ mStatus = status;
+ mStatusString = QString::null;
+ updated();
+}
+
+void Incidence::setCustomStatus(const QString &status)
+{
+ if (mReadOnly) return;
+ mStatus = status.isEmpty() ? StatusNone : StatusX;
+ mStatusString = status;
+ updated();
+}
+
+Incidence::Status Incidence::status() const
+{
+ return mStatus;
+}
+
+QString Incidence::statusStr() const
+{
+ if (mStatus == StatusX)
+ return mStatusString;
+ return statusName(mStatus);
+}
+
+QString Incidence::statusName(Incidence::Status status)
+{
+ switch (status) {
+ case StatusTentative: return i18n("incidence status", "Tentative");
+ case StatusConfirmed: return i18n("Confirmed");
+ case StatusCompleted: return i18n("Completed");
+ case StatusNeedsAction: return i18n("Needs-Action");
+ case StatusCanceled: return i18n("Canceled");
+ case StatusInProcess: return i18n("In-Process");
+ case StatusDraft: return i18n("Draft");
+ case StatusFinal: return i18n("Final");
+ case StatusX:
+ case StatusNone:
+ default: return QString::null;
+ }
+}
+
+void Incidence::setSecrecy(int sec)
+{
+ if (mReadOnly) return;
+ mSecrecy = sec;
+ updated();
+}
+
+int Incidence::secrecy() const
+{
+ return mSecrecy;
+}
+
+QString Incidence::secrecyStr() const
+{
+ return secrecyName(mSecrecy);
+}
+
+QString Incidence::secrecyName(int secrecy)
+{
+ switch (secrecy) {
+ case SecrecyPublic:
+ return i18n("Public");
+ case SecrecyPrivate:
+ return i18n("Private");
+ case SecrecyConfidential:
+ return i18n("Confidential");
+ default:
+ return i18n("Undefined");
+ }
+}
+
+QStringList Incidence::secrecyList()
+{
+ QStringList list;
+ list << secrecyName(SecrecyPublic);
+ list << secrecyName(SecrecyPrivate);
+ list << secrecyName(SecrecyConfidential);
+
+ return list;
+}
+
+
+const Alarm::List &Incidence::alarms() const
+{
+ return mAlarms;
+}
+
+Alarm* Incidence::newAlarm()
+{
+ Alarm* alarm = new Alarm(this);
+ mAlarms.append(alarm);
+// updated();
+ return alarm;
+}
+
+void Incidence::addAlarm(Alarm *alarm)
+{
+ mAlarms.append(alarm);
+ updated();
+}
+
+void Incidence::removeAlarm(Alarm *alarm)
+{
+ mAlarms.removeRef(alarm);
+ updated();
+}
+
+void Incidence::clearAlarms()
+{
+ mAlarms.clearAll();
+ updated();
+}
+
+bool Incidence::isAlarmEnabled() const
+{
+ Alarm::List::ConstIterator it;
+ for( it = mAlarms.begin(); it != mAlarms.end(); ++it ) {
+ if ( (*it)->enabled() ) return true;
+ }
+ return false;
+}
+
+void Incidence::setLocation(const QString &location)
+{
+ if (mReadOnly) return;
+ mLocation = location;
+ updated();
+}
+
+QString Incidence::location() const
+{
+ return mLocation;
+}
+
+void Incidence::setSchedulingID( const QString& sid )
+{
+ mSchedulingID = sid;
+}
+
+QString Incidence::schedulingID() const
+{
+ if ( mSchedulingID.isNull() )
+ // Nothing set, so use the normal uid
+ return uid();
+ return mSchedulingID;
+}
+
+/** Observer interface for the recurrence class. If the recurrence is changed,
+ this method will be called for the incidence the recurrence object
+ belongs to. */
+void Incidence::recurrenceUpdated( Recurrence *recurrence )
+{
+ if ( recurrence == mRecurrence )
+ updated();
+}
+
diff --git a/libkcal/incidence.h b/libkcal/incidence.h
new file mode 100644
index 00000000..5c90fd91
--- /dev/null
+++ b/libkcal/incidence.h
@@ -0,0 +1,486 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001-2003 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef INCIDENCE_H
+#define INCIDENCE_H
+
+#include <qdatetime.h>
+#include <qstringlist.h>
+#include <qvaluelist.h>
+
+#include "recurrence.h"
+#include "alarm.h"
+#include "attachment.h"
+#include "libkcal_export.h"
+
+#include "incidencebase.h"
+#include <kdepimmacros.h>
+
+namespace KCal {
+
+
+/**
+ This class provides the base class common to all calendar components.
+*/
+class LIBKCAL_EXPORT Incidence : public IncidenceBase, public Recurrence::Observer
+{
+ public:
+ /**
+ This class implements a visitor for adding an Incidence to a resource
+ supporting addEvent(), addTodo() and addJournal() calls.
+ */
+ template<class T>
+ class AddVisitor : public IncidenceBase::Visitor
+ {
+ public:
+ AddVisitor( T *r ) : mResource( r ) {}
+
+ bool visit( Event *e ) { return mResource->addEvent( e ); }
+ bool visit( Todo *t ) { return mResource->addTodo( t ); }
+ bool visit( Journal *j ) { return mResource->addJournal( j ); }
+
+ private:
+ T *mResource;
+ };
+
+ /**
+ This class implements a visitor for deleting an Incidence from a resource
+ supporting deleteEvent(), deleteTodo() and deleteJournal() calls.
+ */
+ template<class T>
+ class DeleteVisitor : public IncidenceBase::Visitor
+ {
+ public:
+ DeleteVisitor( T *r ) : mResource( r ) {}
+
+ bool visit( Event *e ) { mResource->deleteEvent( e ); return true; }
+ bool visit( Todo *t ) { mResource->deleteTodo( t ); return true; }
+ bool visit( Journal *j ) { mResource->deleteJournal( j ); return true; }
+
+ private:
+ T *mResource;
+ };
+
+ /** Enumeration for describing an event's status. */
+ enum Status {
+ StatusNone, StatusTentative, StatusConfirmed, StatusCompleted,
+ StatusNeedsAction, StatusCanceled, StatusInProcess, StatusDraft,
+ StatusFinal,
+ StatusX // indicates a non-standard status string
+ };
+
+ /** enumeration for describing an event's secrecy. */
+ enum { SecrecyPublic = 0, SecrecyPrivate = 1, SecrecyConfidential = 2 };
+
+ typedef ListBase<Incidence> List;
+
+ Incidence();
+ Incidence( const Incidence & );
+ ~Incidence();
+
+ Incidence& operator=( const Incidence &i );
+ bool operator==( const Incidence & ) const;
+
+ /**
+ Return copy of this object. The returned object is owned by the caller.
+ */
+ virtual Incidence *clone() = 0;
+
+ /**
+ Set readonly state of incidence.
+
+ @param readonly If true, the incidence is set to readonly, if false the
+ incidence is set to readwrite.
+ */
+ void setReadOnly( bool readonly );
+
+ /** Set whether the incidence floats, i.e. has a date but no time attached to it. */
+ void setFloats( bool f );
+
+ /**
+ Recreate event. The event is made a new unique event, but already stored
+ event information is preserved. Sets uniquie id, creation date, last
+ modification date and revision number.
+ */
+ void recreate();
+
+ /**
+ Set creation date.
+ */
+ void setCreated( const QDateTime & );
+ /**
+ Return time and date of creation.
+ */
+ QDateTime created() const;
+
+ /**
+ Set the number of revisions this event has seen.
+ */
+ void setRevision( int rev );
+ /**
+ Return the number of revisions this event has seen.
+ */
+ int revision() const;
+
+ /**
+ Set starting date/time.
+ */
+ virtual void setDtStart( const QDateTime &dtStart );
+ /**
+ Return the incidence's ending date/time as a QDateTime.
+ */
+ virtual QDateTime dtEnd() const { return QDateTime(); }
+
+ /**
+ Set the long description.
+ */
+ void setDescription( const QString &description );
+ /**
+ Return long description.
+ */
+ QString description() const;
+
+ /**
+ Set short summary.
+ */
+ void setSummary( const QString &summary );
+ /**
+ Return short summary.
+ */
+ QString summary() const;
+
+ /**
+ Set categories.
+ */
+ void setCategories( const QStringList &categories );
+ /**
+ Set categories based on a comma delimited string.
+ */
+ void setCategories(const QString &catStr);
+ /**
+ Return categories as a list of strings.
+ */
+ QStringList categories() const;
+ /**
+ Return categories as a comma separated string.
+ */
+ QString categoriesStr() const;
+
+ /**
+ Point at some other event to which the event relates. This function should
+ only be used when constructing a calendar before the related Incidence
+ exists.
+ */
+ void setRelatedToUid(const QString &);
+ /**
+ What event does this one relate to? This function should
+ only be used when constructing a calendar before the related Incidence
+ exists.
+ */
+ QString relatedToUid() const;
+ /**
+ Point at some other event to which the event relates
+ */
+ void setRelatedTo(Incidence *relatedTo);
+ /**
+ What event does this one relate to?
+ */
+ Incidence *relatedTo() const;
+ /**
+ All events that are related to this event.
+ */
+ Incidence::List relations() const;
+ /**
+ Add an event which is related to this event.
+ */
+ void addRelation(Incidence *);
+ /**
+ Remove event that is related to this event.
+ */
+ void removeRelation(Incidence *);
+
+
+// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+// %%%%% Recurrence-related methods
+// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ /**
+ Return the recurrence rule associated with this incidence. If there is
+ none, returns an appropriate (non-0) object.
+ */
+ Recurrence *recurrence() const;
+
+ /** Removes all recurrence and exception rules and dates. */
+ void clearRecurrence();
+
+ /**
+ Forward to Recurrence::doesRecur().
+ */
+ bool doesRecur() const;
+ uint recurrenceType() const;
+
+ /**
+ Returns true if the date specified is one on which the incidence will
+ recur.
+ */
+ virtual bool recursOn( const QDate &qd ) const;
+ /**
+ Returns true if the date/time specified is one on which the incidence will
+ recur.
+ */
+ bool recursAt( const QDateTime &qdt ) const;
+
+ /**
+ Calculates the start date/time for all recurrences that happen at some time
+ on the given date (might start before that date, but end on or after the
+ given date).
+ @param date the date where the incidence should occur
+ @return the start date/time of all occurences that overlap with the given
+ date. Empty list if the incidence does not overlap with the date at all
+ */
+ virtual QValueList<QDateTime> startDateTimesForDate( const QDate &date ) const;
+
+ /**
+ Calculates the start date/time for all recurrences that happen at the given
+ time.
+ @param datetime the date/time where the incidence should occur
+ @return the start date/time of all occurences that overlap with the given
+ date/time. Empty list if the incidence does not happen at the given
+ time at all.
+ */
+ virtual QValueList<QDateTime> startDateTimesForDateTime( const QDateTime &datetime ) const;
+
+ /** Return the end time of the occurrence if it starts at the given date/time */
+ virtual QDateTime endDateForStart( const QDateTime &startDt ) const;
+
+
+// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+// %%%%% Attachment-related methods
+// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ /**
+ Add attachment.
+ */
+ void addAttachment( Attachment *attachment );
+ /**
+ Remove and delete a specific attachment.
+ */
+ void deleteAttachment( Attachment *attachment );
+ /**
+ Remove and delete all attachments with this mime type.
+ */
+ void deleteAttachments( const QString &mime );
+ /**
+ Return list of all associated attachments.
+ */
+ Attachment::List attachments() const;
+ /**
+ Find a list of attachments with this mime type.
+ */
+ Attachment::List attachments( const QString &mime ) const;
+ /**
+ Remove and delete all attachments.
+ */
+ void clearAttachments();
+
+
+// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+// %%%%% Secrecy and Status methods
+// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ /**
+ Sets secrecy status. This can be Public, Private or Confidential. See
+ separate enum.
+ */
+ void setSecrecy( int );
+ /**
+ Return the event's secrecy.
+ */
+ int secrecy() const;
+ /**
+ Return secrecy as translated string.
+ */
+ QString secrecyStr() const;
+ /**
+ Return list of all available secrecy states as list of translated strings.
+ */
+ static QStringList secrecyList();
+ /**
+ Return human-readable translated name of secrecy class.
+ */
+ static QString secrecyName( int );
+
+ /**
+ Sets the incidence status to a standard status value. See
+ separate enum. Note that StatusX cannot be specified.
+ */
+ void setStatus( Status status );
+ /**
+ Sets the incidence status to a non-standard status value.
+ @param status non-standard status string. If empty,
+ the incidence status will be set to StatusNone.
+ */
+ void setCustomStatus( const QString &status );
+ /**
+ Return the event's status.
+ */
+ Status status() const;
+ /**
+ Return the event's status string.
+ */
+ QString statusStr() const;
+ /**
+ Return human-readable translated name of status value.
+ */
+ static QString statusName( Status );
+
+
+// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+// %%%%% Other methods
+// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ /**
+ Set resources used, such as Office, Car, etc.
+ */
+ void setResources( const QStringList &resources );
+ /**
+ Return list of current resources.
+ */
+ QStringList resources() const;
+
+ /**
+ Set the incidences priority. The priority has to be a value between 0 and
+ 9, 0 is undefined, 1 the highest, 9 the lowest priority (decreasing
+ order).
+ */
+ void setPriority( int priority );
+ /**
+ Return priority. The priority is a number between 1 and 9. 1 is highest
+ priority. If the priority is undefined 0 is returned.
+ */
+ int priority() const;
+
+
+// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+// %%%%% Alarm-related methods
+// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ /**
+ All alarms that are associated with this incidence.
+ */
+ const Alarm::List &alarms() const;
+ /**
+ Create a new alarm which is associated with this incidence.
+ */
+ Alarm *newAlarm();
+ /**
+ Add an alarm which is associated with this incidence.
+ */
+ void addAlarm( Alarm * );
+ /**
+ Remove an alarm that is associated with this incidence.
+ */
+ void removeAlarm( Alarm * );
+ /**
+ Remove all alarms that are associated with this incidence.
+ */
+ void clearAlarms();
+ /**
+ Return whether any alarm associated with this incidence is enabled.
+ */
+ bool isAlarmEnabled() const;
+
+
+// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+// %%%%% Other methods
+// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+
+ /**
+ Set the event's/todo's location. Do _not_ use it with journal.
+ */
+ void setLocation(const QString &location);
+ /**
+ Return the event's/todo's location. Do _not_ use it with journal.
+ */
+ QString location() const;
+
+ /**
+ Set the event's/todo's scheduling ID. Does not make sense for journals.
+ This is used for accepted invitations as the place to store the UID
+ of the invitation. It is later used again if updates to the
+ invitation comes in.
+ If we did not set a new UID on incidences from invitations, we can
+ end up with more than one resource having events with the same UID,
+ if you have access to other peoples resources.
+ */
+ void setSchedulingID( const QString& sid );
+ /**
+ Return the event's/todo's scheduling ID. Does not make sense for journals
+ If this is not set, it will return uid().
+ */
+ QString schedulingID() const;
+
+ /** Observer interface for the recurrence class. If the recurrence is changed,
+ this method will be called for the incidence the recurrence object
+ belongs to. */
+ virtual void recurrenceUpdated( Recurrence * );
+ protected:
+ /** Return the end date/time of the base incidence (e.g. due date/time for
+ to-dos, end date/time for events).
+ This method needs to be reimplemented by derived classes. */
+ virtual QDateTime endDateRecurrenceBase() const { return dtStart(); }
+
+ private:
+ int mRevision;
+
+ // base components of jounal, event and todo
+ QDateTime mCreated;
+ QString mDescription;
+ QString mSummary;
+ QStringList mCategories;
+ Incidence *mRelatedTo;
+ QString mRelatedToUid;
+ Incidence::List mRelations;
+ Attachment::List mAttachments;
+ QStringList mResources;
+
+ QString mStatusString;
+ Status mStatus;
+ int mSecrecy;
+ int mPriority; // 1 = highest, 2 = less, etc.
+
+ Alarm::List mAlarms;
+ Recurrence *mRecurrence;
+
+ QString mLocation;
+
+ // Scheduling ID - used only to identify between scheduling mails
+ QString mSchedulingID;
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/incidencebase.cpp b/libkcal/incidencebase.cpp
new file mode 100644
index 00000000..4777e5c4
--- /dev/null
+++ b/libkcal/incidencebase.cpp
@@ -0,0 +1,425 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001,2004 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kglobal.h>
+#include <klocale.h>
+#include <kdebug.h>
+
+#include "calformat.h"
+
+#include "incidencebase.h"
+
+using namespace KCal;
+
+IncidenceBase::IncidenceBase()
+ : mReadOnly( false ), mFloats( true ), mDuration( 0 ), mHasDuration( false ),
+ mPilotId( 0 ), mSyncStatus( SYNCMOD )
+{
+ setUid( CalFormat::createUniqueId() );
+
+ mAttendees.setAutoDelete( true );
+}
+
+IncidenceBase::IncidenceBase(const IncidenceBase &i) :
+ CustomProperties( i )
+{
+ mReadOnly = i.mReadOnly;
+ mDtStart = i.mDtStart;
+ mDuration = i.mDuration;
+ mHasDuration = i.mHasDuration;
+ mOrganizer = i.mOrganizer;
+ mUid = i.mUid;
+ Attendee::List attendees = i.attendees();
+ Attendee::List::ConstIterator it;
+ for( it = attendees.begin(); it != attendees.end(); ++it ) {
+ mAttendees.append( new Attendee( *(*it) ) );
+ }
+ mFloats = i.mFloats;
+ mLastModified = i.mLastModified;
+ mPilotId = i.mPilotId;
+ mSyncStatus = i.mSyncStatus;
+ mComments = i.mComments;
+
+ mAttendees.setAutoDelete( true );
+}
+
+IncidenceBase::~IncidenceBase()
+{
+}
+
+IncidenceBase& IncidenceBase::operator=( const IncidenceBase& i )
+{
+ CustomProperties::operator=( i );
+ mReadOnly = i.mReadOnly;
+ mDtStart = i.mDtStart;
+ mDuration = i.mDuration;
+ mHasDuration = i.mHasDuration;
+ mOrganizer = i.mOrganizer;
+ mUid = i.mUid;
+ mAttendees.clear();
+ Attendee::List attendees = i.attendees();
+ Attendee::List::ConstIterator it;
+ for( it = attendees.begin(); it != attendees.end(); ++it ) {
+ mAttendees.append( new Attendee( *(*it) ) );
+ }
+ mFloats = i.mFloats;
+ mLastModified = i.mLastModified;
+ mPilotId = i.mPilotId;
+ mSyncStatus = i.mSyncStatus;
+ mComments = i.mComments;
+
+ return *this;
+}
+
+bool IncidenceBase::operator==( const IncidenceBase& i2 ) const
+{
+ if( attendees().count() != i2.attendees().count() ) {
+ return false; // no need to check further
+ }
+
+ Attendee::List al1 = attendees();
+ Attendee::List al2 = i2.attendees();
+ Attendee::List::ConstIterator a1 = al1.begin();
+ Attendee::List::ConstIterator a2 = al2.begin();
+ for( ; a1 != al1.end() && a2 != al2.end(); ++a1, ++a2 ) {
+ if( **a1 == **a2 )
+ continue;
+ else {
+ return false;
+ }
+ }
+
+ if ( !CustomProperties::operator==(i2) )
+ return false;
+
+ return ( dtStart() == i2.dtStart() &&
+ organizer() == i2.organizer() &&
+ uid() == i2.uid() &&
+ // Don't compare lastModified, otherwise the operator is not
+ // of much use. We are not comparing for identity, after all.
+ doesFloat() == i2.doesFloat() &&
+ duration() == i2.duration() &&
+ hasDuration() == i2.hasDuration() &&
+ pilotId() == i2.pilotId() &&
+ syncStatus() == i2.syncStatus() );
+ // no need to compare mObserver
+}
+
+
+
+
+void IncidenceBase::setUid(const QString &uid)
+{
+ mUid = uid;
+ updated();
+}
+
+QString IncidenceBase::uid() const
+{
+ return mUid;
+}
+
+void IncidenceBase::setLastModified(const QDateTime &lm)
+{
+ // DON'T! updated() because we call this from
+ // Calendar::updateEvent().
+
+ // Remove milliseconds part.
+ QDateTime current = lm;
+ QTime t = current.time();
+ t.setHMS( t.hour(), t.minute(), t.second(), 0 );
+ current.setTime( t );
+
+ mLastModified = current;
+}
+
+QDateTime IncidenceBase::lastModified() const
+{
+ return mLastModified;
+}
+
+void IncidenceBase::setOrganizer( const Person &o )
+{
+ // we don't check for readonly here, because it is
+ // possible that by setting the organizer we are changing
+ // the event's readonly status...
+ mOrganizer = o;
+
+ updated();
+}
+
+void IncidenceBase::setOrganizer(const QString &o)
+{
+ QString mail( o );
+ if ( mail.startsWith("MAILTO:", false) )
+ mail = mail.remove( 0, 7 );
+ // split the string into full name plus email.
+ Person organizer( mail );
+ setOrganizer( organizer );
+}
+
+Person IncidenceBase::organizer() const
+{
+ return mOrganizer;
+}
+
+void IncidenceBase::setReadOnly( bool readOnly )
+{
+ mReadOnly = readOnly;
+}
+
+void IncidenceBase::setDtStart(const QDateTime &dtStart)
+{
+// if (mReadOnly) return;
+ mDtStart = dtStart;
+ updated();
+}
+
+QDateTime IncidenceBase::dtStart() const
+{
+ return mDtStart;
+}
+
+QString IncidenceBase::dtStartTimeStr() const
+{
+ return KGlobal::locale()->formatTime(dtStart().time());
+}
+
+QString IncidenceBase::dtStartDateStr(bool shortfmt) const
+{
+ return KGlobal::locale()->formatDate(dtStart().date(),shortfmt);
+}
+
+QString IncidenceBase::dtStartStr() const
+{
+ return KGlobal::locale()->formatDateTime(dtStart());
+}
+
+
+bool IncidenceBase::doesFloat() const
+{
+ return mFloats;
+}
+
+void IncidenceBase::setFloats(bool f)
+{
+ if (mReadOnly) return;
+ mFloats = f;
+ updated();
+}
+
+
+void IncidenceBase::addComment(const QString& comment)
+{
+ mComments += comment;
+}
+
+bool IncidenceBase::removeComment( const QString& comment)
+{
+ bool found = false;
+ QStringList::Iterator i;
+
+ for ( i = mComments.begin(); !found && i != mComments.end(); ++i ) {
+ if ( (*i) == comment ) {
+ found = true;
+ mComments.remove(i);
+ }
+ }
+
+ return found;
+}
+
+void IncidenceBase::clearComments()
+{
+ mComments.clear();
+}
+
+QStringList IncidenceBase::comments() const
+{
+ return mComments;
+}
+
+
+void IncidenceBase::addAttendee(Attendee *a, bool doupdate)
+{
+// kdDebug(5800) << "IncidenceBase::addAttendee()" << endl;
+ if (mReadOnly) return;
+// kdDebug(5800) << "IncidenceBase::addAttendee() weiter" << endl;
+ if (a->name().left(7).upper() == "MAILTO:")
+ a->setName(a->name().remove(0,7));
+
+ mAttendees.append(a);
+ if (doupdate) updated();
+}
+
+#if 0
+void IncidenceBase::removeAttendee(Attendee *a)
+{
+ if (mReadOnly) return;
+ mAttendees.removeRef(a);
+ updated();
+}
+
+void IncidenceBase::removeAttendee(const char *n)
+{
+ Attendee *a;
+
+ if (mReadOnly) return;
+ for (a = mAttendees.first(); a; a = mAttendees.next())
+ if (a->getName() == n) {
+ mAttendees.remove();
+ break;
+ }
+}
+#endif
+
+void IncidenceBase::clearAttendees()
+{
+ if (mReadOnly) return;
+ mAttendees.clear();
+}
+
+Attendee *IncidenceBase::attendeeByMail( const QString &email ) const
+{
+ Attendee::List::ConstIterator it;
+ for( it = mAttendees.begin(); it != mAttendees.end(); ++it ) {
+ if ( (*it)->email() == email ) return *it;
+ }
+
+ return 0;
+}
+
+Attendee *IncidenceBase::attendeeByMails( const QStringList &emails,
+ const QString &email) const
+{
+ QStringList mails = emails;
+ if ( !email.isEmpty() ) mails.append( email );
+
+ Attendee::List::ConstIterator itA;
+ for( itA = mAttendees.begin(); itA != mAttendees.end(); ++itA ) {
+ for ( QStringList::Iterator it = mails.begin(); it != mails.end(); ++it ) {
+ if ( (*itA)->email() == (*it) ) return *itA;
+ }
+ }
+
+ return 0;
+}
+
+Attendee *IncidenceBase::attendeeByUid( const QString &uid ) const
+{
+ Attendee::List::ConstIterator it;
+ for( it = mAttendees.begin(); it != mAttendees.end(); ++it ) {
+ if ( (*it)->uid() == uid ) return *it;
+ }
+
+ return 0;
+}
+
+
+void IncidenceBase::setDuration(int seconds)
+{
+ mDuration = seconds;
+ setHasDuration(true);
+ updated();
+}
+
+int IncidenceBase::duration() const
+{
+ return mDuration;
+}
+
+void IncidenceBase::setHasDuration(bool hasDuration)
+{
+ mHasDuration = hasDuration;
+}
+
+bool IncidenceBase::hasDuration() const
+{
+ return mHasDuration;
+}
+
+void IncidenceBase::setSyncStatus(int stat)
+{
+ if (mReadOnly) return;
+ if ( mSyncStatus == stat ) return;
+ mSyncStatus = stat;
+ updatedSilent();
+}
+void IncidenceBase::setSyncStatusSilent(int stat)
+{
+ if (mReadOnly) return;
+ mSyncStatus = stat;
+}
+
+int IncidenceBase::syncStatus() const
+{
+ return mSyncStatus;
+}
+
+void IncidenceBase::setPilotId( unsigned long id )
+{
+ if (mReadOnly) return;
+ if ( mPilotId == id) return;
+ mPilotId = id;
+ updatedSilent();
+}
+
+unsigned long IncidenceBase::pilotId() const
+{
+ return mPilotId;
+}
+
+void IncidenceBase::registerObserver( IncidenceBase::Observer *observer )
+{
+ if( !mObservers.contains( observer ) ) mObservers.append( observer );
+}
+
+void IncidenceBase::unRegisterObserver( IncidenceBase::Observer *observer )
+{
+ mObservers.remove( observer );
+}
+
+void IncidenceBase::updated()
+{
+ QPtrListIterator<Observer> it(mObservers);
+ while( it.current() ) {
+ Observer *o = it.current();
+ ++it;
+ o->incidenceUpdated( this );
+ }
+}
+
+void IncidenceBase::customPropertyUpdated()
+{
+ updated();
+}
+
+void IncidenceBase::updatedSilent()
+{
+ QPtrListIterator<Observer> it(mObservers);
+ while( it.current() ) {
+ Observer *o = it.current();
+ ++it;
+ o->incidenceUpdatedSilent( this );
+ }
+}
+
diff --git a/libkcal/incidencebase.h b/libkcal/incidencebase.h
new file mode 100644
index 00000000..1cccb4dd
--- /dev/null
+++ b/libkcal/incidencebase.h
@@ -0,0 +1,293 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001-2003 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_INCIDENCEBASE_H
+#define KCAL_INCIDENCEBASE_H
+
+#include <qdatetime.h>
+#include <qstringlist.h>
+#include <qvaluelist.h>
+#include <qptrlist.h>
+
+#include "customproperties.h"
+#include "attendee.h"
+
+namespace KCal {
+
+typedef QValueList<QDate> DateList;
+typedef QValueList<QDateTime> DateTimeList;
+class Event;
+class Todo;
+class Journal;
+class FreeBusy;
+
+/**
+ This class provides the base class common to all calendar components.
+*/
+class LIBKCAL_EXPORT IncidenceBase : public CustomProperties
+{
+ public:
+ /**
+ This class provides the interface for a visitor of calendar components. It
+ serves as base class for concrete visitors, which implement certain actions on
+ calendar components. It allows to add functions, which operate on the concrete
+ types of calendar components, without changing the calendar component classes.
+ */
+ class Visitor
+ {
+ public:
+ /** Destruct Incidence::Visitor */
+ virtual ~Visitor() {}
+
+ /**
+ Reimplement this function in your concrete subclass of IncidenceBase::Visitor to perform actions
+ on an Event object.
+ */
+ virtual bool visit(Event *) { return false; }
+ /**
+ Reimplement this function in your concrete subclass of IncidenceBase::Visitor to perform actions
+ on a Todo object.
+ */
+ virtual bool visit(Todo *) { return false; }
+ /**
+ Reimplement this function in your concrete subclass of IncidenceBase::Visitor to perform actions
+ on an Journal object.
+ */
+ virtual bool visit(Journal *) { return false; }
+ /**
+ Reimplement this function in your concrete subclass of IncidenceBase::Visitor to perform actions
+ on a FreeBusy object.
+ */
+ virtual bool visit(FreeBusy *) { return false; }
+
+ protected:
+ /** Constructor is protected to prevent direct creation of visitor base class. */
+ Visitor() {}
+ };
+
+ class Observer {
+ public:
+ virtual ~Observer() {}
+ virtual void incidenceUpdated( IncidenceBase * ) = 0;
+ virtual void incidenceUpdatedSilent( IncidenceBase * ) {};
+ };
+
+ IncidenceBase();
+ IncidenceBase( const IncidenceBase & );
+ virtual ~IncidenceBase();
+
+ IncidenceBase& operator=( const IncidenceBase &i );
+ bool operator==( const IncidenceBase & ) const;
+
+ /**
+ Accept IncidenceVisitor. A class taking part in the visitor mechanism has to
+ provide this implementation:
+ <pre>
+ bool accept(Visitor &v) { return v.visit(this); }
+ </pre>
+ */
+ virtual bool accept(Visitor &) { return false; }
+
+ virtual QCString type() const = 0;
+
+ /** Set the unique id for the event */
+ void setUid( const QString & );
+ /** Return the unique id for the event */
+ QString uid() const;
+
+ /** Sets the time the incidence was last modified. */
+ void setLastModified( const QDateTime &lm );
+ /** Return the time the incidence was last modified. */
+ QDateTime lastModified() const;
+
+ /** sets the organizer for the event */
+ void setOrganizer( const Person &o );
+ void setOrganizer( const QString &o );
+ Person organizer() const;
+
+ /** Set readonly status. */
+ virtual void setReadOnly( bool );
+ /** Return if the object is read-only. */
+ bool isReadOnly() const { return mReadOnly; }
+
+ /** for setting the event's starting date/time with a QDateTime. */
+ virtual void setDtStart( const QDateTime &dtStart );
+ /** returns an event's starting date/time as a QDateTime. */
+ virtual QDateTime dtStart() const;
+ /** returns an event's starting time as a string formatted according to the
+ users locale settings */
+ virtual QString dtStartTimeStr() const;
+ /** returns an event's starting date as a string formatted according to the
+ users locale settings */
+ virtual QString dtStartDateStr( bool shortfmt = true ) const;
+ /** returns an event's starting date and time as a string formatted according
+ to the users locale settings */
+ virtual QString dtStartStr() const;
+
+ virtual void setDuration( int seconds );
+ int duration() const;
+ void setHasDuration( bool );
+ bool hasDuration() const;
+
+ /** Return true or false depending on whether the incidence "floats,"
+ * i.e. has a date but no time attached to it. */
+ bool doesFloat() const;
+ /** Set whether the incidence floats, i.e. has a date but no time attached to it. */
+ void setFloats( bool f );
+
+ //
+ // Comments
+ //
+
+ /**
+ * Add a comment to this incidence.
+ *
+ * Does not add a linefeed character. Just appends the text as passed in.
+ *
+ * @param comment The comment to add.
+ */
+ void addComment(const QString& comment);
+
+ /**
+ * Remove a comment from the event.
+ *
+ * Removes first comment whose string is an exact match for the string
+ * passed in.
+ *
+ * @return true if match found, false otherwise.
+ */
+ bool removeComment( const QString& comment );
+
+ /** Delete all comments associated with this incidence. */
+ void clearComments();
+
+ /** Return all comments associated with this incidence. */
+ QStringList comments() const;
+
+ /**
+ Add Attendee to this incidence. IncidenceBase takes ownership of the
+ Attendee object.
+
+ @param attendee a pointer to the attendee to add
+ @param doUpdate If true the Observers are notified, if false they are not.
+ */
+ void addAttendee( Attendee *attendee, bool doUpdate = true );
+ /**
+ Remove all Attendees.
+ */
+ void clearAttendees();
+ /**
+ Return list of attendees.
+ */
+ const Attendee::List &attendees() const { return mAttendees; };
+ /**
+ Return number of attendees.
+ */
+ int attendeeCount() const { return mAttendees.count(); };
+ /**
+ Return the Attendee with this email address.
+ */
+ Attendee *attendeeByMail( const QString & ) const;
+ /**
+ Return first Attendee with one of the given email addresses.
+ */
+ Attendee *attendeeByMails( const QStringList &,
+ const QString &email = QString::null ) const;
+ /**
+ Return attendee with given uid.
+ */
+ Attendee *attendeeByUid( const QString &uid ) const;
+
+ /**
+ Pilot synchronization states
+ */
+ enum { SYNCNONE = 0, SYNCMOD = 1, SYNCDEL = 3 };
+ /**
+ Set synchronisation satus.
+ */
+ void setSyncStatus( int status );
+ void setSyncStatusSilent( int status );
+ /**
+ Return synchronisation status.
+ */
+ int syncStatus() const;
+
+ /**
+ Set Pilot Id.
+ */
+ void setPilotId( unsigned long id );
+ /**
+ Return Pilot Id.
+ */
+ unsigned long pilotId() const;
+
+ /**
+ Register observer. The observer is notified when the observed object
+ changes.
+ */
+ void registerObserver( Observer * );
+ /**
+ Unregister observer. It isn't notified anymore about changes.
+ */
+ void unRegisterObserver( Observer * );
+ /**
+ Call this to notify the observers after the IncidenceBas object has
+ changed.
+ */
+ void updated();
+ void updatedSilent();
+
+ protected:
+ /**
+ @copydoc
+ CustomProperties::customPropertyUpdated()
+ */
+ virtual void customPropertyUpdated();
+
+ bool mReadOnly;
+
+ private:
+ // base components
+ QDateTime mDtStart;
+ Person mOrganizer;
+ QString mUid;
+ QDateTime mLastModified;
+ Attendee::List mAttendees;
+ QStringList mComments;
+
+ bool mFloats;
+
+ int mDuration;
+ bool mHasDuration;
+
+ // PILOT SYNCHRONIZATION STUFF
+ unsigned long mPilotId; // unique id for pilot sync
+ int mSyncStatus; // status (for sync)
+
+ QPtrList<Observer> mObservers;
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/incidenceformatter.cpp b/libkcal/incidenceformatter.cpp
new file mode 100644
index 00000000..766906fd
--- /dev/null
+++ b/libkcal/incidenceformatter.cpp
@@ -0,0 +1,2215 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (c) 2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "incidenceformatter.h"
+
+#include <libkcal/attachment.h>
+#include <libkcal/event.h>
+#include <libkcal/todo.h>
+#include <libkcal/journal.h>
+#include <libkcal/calendar.h>
+#include <libkcal/calendarlocal.h>
+#include <libkcal/icalformat.h>
+#include <libkcal/freebusy.h>
+#include <libkcal/calendarresources.h>
+
+#include <libemailfunctions/email.h>
+
+#include <ktnef/ktnefparser.h>
+#include <ktnef/ktnefmessage.h>
+#include <ktnef/ktnefdefs.h>
+#include <kabc/phonenumber.h>
+#include <kabc/vcardconverter.h>
+#include <kabc/stdaddressbook.h>
+
+#include <kapplication.h>
+// #include <kdebug.h>
+
+#include <klocale.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+
+#include <qbuffer.h>
+#include <qstylesheet.h>
+#include <qdatetime.h>
+
+#include <time.h>
+
+
+using namespace KCal;
+
+
+/*******************************************************************
+ * Helper functions for the extensive display (event viewer)
+ *******************************************************************/
+
+static QString eventViewerAddLink( const QString &ref, const QString &text,
+ bool newline = true )
+{
+ QString tmpStr( "<a href=\"" + ref + "\">" + text + "</a>" );
+ if ( newline ) tmpStr += "\n";
+ return tmpStr;
+}
+
+static QString eventViewerAddTag( const QString & tag, const QString & text )
+{
+ int numLineBreaks = text.contains( "\n" );
+ QString str = "<" + tag + ">";
+ QString tmpText = text;
+ QString tmpStr = str;
+ if( numLineBreaks >= 0 ) {
+ if ( numLineBreaks > 0) {
+ int pos = 0;
+ QString tmp;
+ for( int i = 0; i <= numLineBreaks; i++ ) {
+ pos = tmpText.find( "\n" );
+ tmp = tmpText.left( pos );
+ tmpText = tmpText.right( tmpText.length() - pos - 1 );
+ tmpStr += tmp + "<br>";
+ }
+ } else {
+ tmpStr += tmpText;
+ }
+ }
+ tmpStr += "</" + tag + ">";
+ return tmpStr;
+}
+
+static QString linkPerson( const QString& email, QString name, QString uid )
+{
+ // Make the search, if there is an email address to search on,
+ // and either name or uid is missing
+ if ( !email.isEmpty() && ( name.isEmpty() || uid.isEmpty() ) ) {
+ KABC::AddressBook *add_book = KABC::StdAddressBook::self( true );
+ KABC::Addressee::List addressList = add_book->findByEmail( email );
+ KABC::Addressee o = addressList.first();
+ if ( !o.isEmpty() && addressList.size() < 2 ) {
+ if ( name.isEmpty() )
+ // No name set, so use the one from the addressbook
+ name = o.formattedName();
+ uid = o.uid();
+ } else
+ // Email not found in the addressbook. Don't make a link
+ uid = QString::null;
+ }
+ kdDebug(5850) << "formatAttendees: uid = " << uid << endl;
+
+ // Show the attendee
+ QString tmpString = "<li>";
+ if ( !uid.isEmpty() ) {
+ // There is a UID, so make a link to the addressbook
+ if ( name.isEmpty() )
+ // Use the email address for text
+ tmpString += eventViewerAddLink( "uid:" + uid, email );
+ else
+ tmpString += eventViewerAddLink( "uid:" + uid, name );
+ } else {
+ // No UID, just show some text
+ tmpString += ( name.isEmpty() ? email : name );
+ }
+ tmpString += '\n';
+
+ // Make the mailto link
+ if ( !email.isEmpty() ) {
+ KCal::Person person( name, email );
+ KURL mailto;
+ mailto.setProtocol( "mailto" );
+ mailto.setPath( person.fullName() );
+ tmpString += eventViewerAddLink( mailto.url(), QString::null );
+ }
+ tmpString += "</li>\n";
+
+ return tmpString;
+}
+
+static QString eventViewerFormatAttendees( Incidence *event )
+{
+ QString tmpStr;
+ Attendee::List attendees = event->attendees();
+ if ( attendees.count() ) {
+
+ // Add organizer link
+ tmpStr += eventViewerAddTag( "i", i18n("Organizer") );
+ tmpStr += "<ul>";
+ tmpStr += linkPerson( event->organizer().email(),
+ event->organizer().name(), QString::null );
+ tmpStr += "</ul>";
+
+ // Add attendees links
+ tmpStr += eventViewerAddTag( "i", i18n("Attendees") );
+ tmpStr += "<ul>";
+ Attendee::List::ConstIterator it;
+ for( it = attendees.begin(); it != attendees.end(); ++it ) {
+ Attendee *a = *it;
+ tmpStr += linkPerson( a->email(), a->name(), a->uid() );
+ if ( !a->delegator().isEmpty() ) {
+ tmpStr += i18n(" (delegated by %1)" ).arg( a->delegator() );
+ }
+ if ( !a->delegate().isEmpty() ) {
+ tmpStr += i18n(" (delegated to %1)" ).arg( a->delegate() );
+ }
+ }
+ tmpStr += "</ul>";
+ }
+ return tmpStr;
+}
+
+static QString eventViewerFormatAttachments( Incidence *i )
+{
+ QString tmpStr;
+ Attachment::List as = i->attachments();
+ if ( as.count() > 0 ) {
+ Attachment::List::ConstIterator it;
+ for( it = as.begin(); it != as.end(); ++it ) {
+ if ( (*it)->isUri() ) {
+ QString name;
+ if ( (*it)->uri().startsWith( "kmail:" ) )
+ name = i18n( "Show mail" );
+ else
+ name = (*it)->uri();
+ tmpStr += eventViewerAddLink( (*it)->uri(), name );
+ tmpStr += "<br>";
+ }
+ }
+ }
+ return tmpStr;
+}
+
+/*
+ FIXME:This function depends of kaddressbook. Is necessary a new
+ type of event?
+*/
+static QString eventViewerFormatBirthday( Event *event )
+{
+ if ( !event) return QString::null;
+ if ( event->customProperty("KABC","BIRTHDAY") != "YES" ) return QString::null;
+
+ QString uid = event->customProperty("KABC","UID-1");
+ QString name = event->customProperty("KABC","NAME-1");
+ QString email= event->customProperty("KABC","EMAIL-1");
+
+ QString tmpString = "<ul>";
+ tmpString += linkPerson( email, name, uid );
+
+ if ( event->customProperty( "KABC", "ANNIVERSARY") == "YES" ) {
+ uid = event->customProperty("KABC","UID-2");
+ name = event->customProperty("KABC","NAME-2");
+ email= event->customProperty("KABC","EMAIL-2");
+ tmpString += linkPerson( email, name, uid );
+ }
+
+ tmpString += "</ul>";
+ return tmpString;
+}
+
+static QString eventViewerFormatHeader( Incidence *incidence )
+{
+ QString tmpStr = "<table><tr>";
+
+ // show icons
+ {
+ tmpStr += "<td>";
+
+ if ( incidence->type() == "Event" ) {
+ tmpStr += "<img src=\"" +
+ KGlobal::iconLoader()->iconPath( "appointment", KIcon::Small ) +
+ "\">";
+ }
+ if ( incidence->type() == "Todo" ) {
+ tmpStr += "<img src=\"" +
+ KGlobal::iconLoader()->iconPath( "todo", KIcon::Small ) +
+ "\">";
+ }
+ if ( incidence->type() == "Journal" ) {
+ tmpStr += "<img src=\"" +
+ KGlobal::iconLoader()->iconPath( "journal", KIcon::Small ) +
+ "\">";
+ }
+ if ( incidence->isAlarmEnabled() ) {
+ tmpStr += "<img src=\"" +
+ KGlobal::iconLoader()->iconPath( "bell", KIcon::Small ) +
+ "\">";
+ }
+ if ( incidence->doesRecur() ) {
+ tmpStr += "<img src=\"" +
+ KGlobal::iconLoader()->iconPath( "recur", KIcon::Small ) +
+ "\">";
+ }
+ if ( incidence->isReadOnly() ) {
+ tmpStr += "<img src=\"" +
+ KGlobal::iconLoader()->iconPath( "readonlyevent", KIcon::Small ) +
+ "\">";
+ }
+
+ tmpStr += "</td>";
+ }
+
+ tmpStr += "<td>"
+ + eventViewerAddTag( "u",
+ eventViewerAddTag( "b", incidence->summary() ) )
+ + "</td>";
+ tmpStr += "</tr></table><br>";
+
+ return tmpStr;
+}
+
+static QString eventViewerFormatEvent( Event *event )
+{
+ if ( !event ) return QString::null;
+ QString tmpStr = eventViewerFormatHeader( event );
+
+ tmpStr += "<table>";
+
+ tmpStr += "<tr>";
+ if ( event->doesFloat() ) {
+ if ( event->isMultiDay() ) {
+ tmpStr += "<td align=\"right\"><b>" + i18n( "Time" ) + "</b></td>";
+ tmpStr += "<td>" + i18n("<beginTime> - <endTime>","%1 - %2")
+ .arg( event->dtStartDateStr() )
+ .arg( event->dtEndDateStr() ) + "</td>";
+ } else {
+ tmpStr += "<td align=\"right\"><b>" + i18n( "Date" ) + "</b></td>";
+ tmpStr += "<td>" + i18n("date as string","%1").arg( event->dtStartDateStr() ) + "</td>";
+ }
+ } else {
+ if ( event->isMultiDay() ) {
+ tmpStr += "<td align=\"right\"><b>" + i18n( "Time" ) + "</b></td>";
+ tmpStr += "<td>" + i18n("<beginTime> - <endTime>","%1 - %2")
+ .arg( event->dtStartStr() )
+ .arg( event->dtEndStr() ) + "</td>";
+ } else {
+ tmpStr += "<td align=\"right\"><b>" + i18n( "Time" ) + "</b></td>";
+ if ( event->hasEndDate() && event->dtStart() != event->dtEnd()) {
+ tmpStr += "<td>" + i18n("<beginTime> - <endTime>","%1 - %2")
+ .arg( event->dtStartTimeStr() )
+ .arg( event->dtEndTimeStr() ) + "</td>";
+ } else {
+ tmpStr += "<td>" + event->dtStartTimeStr() + "</td>";
+ }
+ tmpStr += "</tr><tr>";
+ tmpStr += "<td align=\"right\"><b>" + i18n( "Date" ) + "</b></td>";
+ tmpStr += "<td>" + i18n("date as string","%1")
+ .arg( event->dtStartDateStr() ) + "</td>";
+ }
+ }
+ tmpStr += "</tr>";
+
+ if ( event->customProperty("KABC","BIRTHDAY")== "YES" ) {
+ tmpStr += "<tr>";
+ tmpStr += "<td align=\"right\"><b>" + i18n( "Birthday" ) + "</b></td>";
+ tmpStr += "<td>" + eventViewerFormatBirthday( event ) + "</td>";
+ tmpStr += "</tr>";
+ tmpStr += "</table>";
+ return tmpStr;
+ }
+
+ if ( !event->description().isEmpty() ) {
+ tmpStr += "<tr>";
+ tmpStr += "<td align=\"right\"><b>" + i18n( "Description" ) + "</b></td>";
+ tmpStr += "<td>" + eventViewerAddTag( "p", event->description() ) + "</td>";
+ tmpStr += "</tr>";
+ }
+
+ if ( !event->location().isEmpty() ) {
+ tmpStr += "<tr>";
+ tmpStr += "<td align=\"right\"><b>" + i18n( "Location" ) + "</b></td>";
+ tmpStr += "<td>" + event->location() + "</td>";
+ tmpStr += "</tr>";
+ }
+
+ if ( event->categories().count() > 0 ) {
+ tmpStr += "<tr>";
+ tmpStr += "<td align=\"right\"><b>" + i18n( "1 Category", "%n Categories", event->categories().count() )+ "</b></td>";
+ tmpStr += "<td>" + event->categoriesStr() + "</td>";
+ tmpStr += "</tr>";
+ }
+
+ if ( event->doesRecur() ) {
+ QDateTime dt =
+ event->recurrence()->getNextDateTime( QDateTime::currentDateTime() );
+ tmpStr += "<tr>";
+ tmpStr += "<td align=\"right\"><b>" + i18n( "Next on" ) + "</b></td>";
+ if ( !event->doesFloat() ) {
+ tmpStr += "<td>" +
+ KGlobal::locale()->formatDateTime( dt, true ) + "</td>";
+ } else {
+ tmpStr += "<td>" +
+ KGlobal::locale()->formatDate( dt.date(), true ) + "</td>";
+ }
+ tmpStr += "</tr>";
+ }
+
+ int attendeeCount = event->attendees().count();
+ if ( attendeeCount > 0 ) {
+ tmpStr += "<tr><td colspan=\"2\">";
+ tmpStr += eventViewerFormatAttendees( event );
+ tmpStr += "</td></tr>";
+ }
+
+ int attachmentCount = event->attachments().count();
+ if ( attachmentCount > 0 ) {
+ tmpStr += "<tr>";
+ tmpStr += "<td align=\"right\"><b>" + i18n( "1 attachment", "%n attachments", attachmentCount )+ "</b></td>";
+ tmpStr += "<td>" + eventViewerFormatAttachments( event ) + "</td>";
+ tmpStr += "</tr>";
+ }
+
+ tmpStr += "</table>";
+ tmpStr += "<em>" + i18n( "Creation date: %1.").arg(
+ KGlobal::locale()->formatDateTime( event->created() , true ) ) + "</em>";
+ return tmpStr;
+}
+
+static QString eventViewerFormatTodo( Todo *todo )
+{
+ if ( !todo ) return QString::null;
+ QString tmpStr = eventViewerFormatHeader( todo );
+
+ tmpStr += "<table>";
+
+ if ( todo->hasDueDate() ) {
+ tmpStr += "<tr>";
+ tmpStr += "<td align=\"right\"><b>" + i18n( "Due on" ) + "</b></td>";
+ if ( !todo->doesFloat() ) {
+ tmpStr += "<td>" +
+ KGlobal::locale()->formatDateTime( todo->dtDue(), true ) +
+ "</td>";
+ } else {
+ tmpStr += "<td>" +
+ KGlobal::locale()->formatDate( todo->dtDue().date(), true ) +
+ "</td>";
+ }
+ tmpStr += "</tr>";
+ }
+
+ if ( !todo->description().isEmpty() ) {
+ tmpStr += "<tr>";
+ tmpStr += "<td align=\"right\"><b>" + i18n( "Description" ) + "</b></td>";
+ tmpStr += "<td>" + todo->description() + "</td>";
+ tmpStr += "</tr>";
+ }
+
+ if ( !todo->location().isEmpty() ) {
+ tmpStr += "<tr>";
+ tmpStr += "<td align=\"right\"><b>" + i18n( "Location" ) + "</b></td>";
+ tmpStr += "<td>" + todo->location() + "</td>";
+ tmpStr += "</tr>";
+ }
+
+ if ( todo->categories().count() > 0 ) {
+ tmpStr += "<tr>";
+ tmpStr += "<td align=\"right\"><b>" + i18n( "1 Category", "%n Categories", todo->categories().count() )+ "</b></td>";
+ tmpStr += "<td>" + todo->categoriesStr() + "</td>";
+ tmpStr += "</tr>";
+ }
+
+ tmpStr += "<tr>";
+ tmpStr += "<td align=\"right\"><b>" + i18n( "Priority" ) + "</b></td>";
+ if ( todo->priority() > 0 ) {
+ tmpStr += "<td>" + QString::number( todo->priority() ) + "</td>";
+ } else {
+ tmpStr += "<td>" + i18n( "Unspecified" ) + "</td>";
+ }
+ tmpStr += "</tr>";
+
+ tmpStr += "<tr>";
+ tmpStr += "<td align=\"right\"><b>" + i18n( "Completed" ) + "</b></td>";
+ tmpStr += "<td>" + i18n( "%1 %" ).arg( todo->percentComplete() ) + "</td>";
+ tmpStr += "</tr>";
+
+ if ( todo->doesRecur() ) {
+ QDateTime dt =
+ todo->recurrence()->getNextDateTime( QDateTime::currentDateTime() );
+ tmpStr += "<tr>";
+ tmpStr += "<td align=\"right\"><b>" + i18n( "Next on" ) + "</b></td>";
+ if ( !todo->doesFloat() ) {
+ tmpStr += "<td>" +
+ KGlobal::locale()->formatDateTime( dt, true ) + "</td>";
+ } else {
+ tmpStr += "<td>" +
+ KGlobal::locale()->formatDate( dt.date(), true ) + "</td>";
+ }
+ tmpStr += "</tr>";
+ }
+
+ int attendeeCount = todo->attendees().count();
+ if ( attendeeCount > 0 ) {
+ tmpStr += "<tr><td colspan=\"2\">";
+ tmpStr += eventViewerFormatAttendees( todo );
+ tmpStr += "</td></tr>";
+ }
+
+ int attachmentCount = todo->attachments().count();
+ if ( attachmentCount > 0 ) {
+ tmpStr += "<tr>";
+ tmpStr += "<td align=\"right\"><b>" + i18n( "1 attachment", "%n attachments", attachmentCount )+ "</b></td>";
+ tmpStr += "<td>" + eventViewerFormatAttachments( todo ) + "</td>";
+ tmpStr += "</tr>";
+ }
+
+ tmpStr += "</table>";
+ tmpStr += "<em>" + i18n( "Creation date: %1.").arg(
+ KGlobal::locale()->formatDateTime( todo->created(), true ) ) + "</em>";
+ return tmpStr;
+}
+
+static QString eventViewerFormatJournal( Journal *journal )
+{
+ if ( !journal ) return QString::null;
+
+ QString tmpStr;
+ if ( !journal->summary().isEmpty() ) {
+ tmpStr += eventViewerAddTag( "u",
+ eventViewerAddTag( "b", journal->summary() ) );
+ }
+ tmpStr += eventViewerAddTag( "b", i18n("Journal for %1").arg( journal->dtStartDateStr( false ) ) );
+ if ( !journal->description().isEmpty() )
+ tmpStr += eventViewerAddTag( "p", journal->description() );
+ return tmpStr;
+}
+
+static QString eventViewerFormatFreeBusy( FreeBusy *fb )
+{
+ if ( !fb ) return QString::null;
+
+ QString tmpStr =
+ eventViewerAddTag( "u",
+ eventViewerAddTag( "b", i18n("Free/Busy information for %1")
+ .arg( fb->organizer().fullName() ) ) );
+ tmpStr += eventViewerAddTag( "i", i18n("Busy times in date range %1 - %2:")
+ .arg( KGlobal::locale()->formatDate( fb->dtStart().date(), true ) )
+ .arg( KGlobal::locale()->formatDate( fb->dtEnd().date(), true ) ) );
+
+ QValueList<Period> periods = fb->busyPeriods();
+
+ QString text = eventViewerAddTag( "em", eventViewerAddTag( "b", i18n("Busy:") ) );
+ QValueList<Period>::iterator it;
+ for ( it = periods.begin(); it != periods.end(); ++it ) {
+ Period per = *it;
+ if ( per.hasDuration() ) {
+ int dur = per.duration().asSeconds();
+ QString cont;
+ if ( dur >= 3600 ) {
+ cont += i18n("1 hour ", "%n hours ", dur / 3600 );
+ dur %= 3600;
+ }
+ if ( dur >= 60 ) {
+ cont += i18n("1 minute ", "%n minutes ", dur / 60);
+ dur %= 60;
+ }
+ if ( dur > 0 ) {
+ cont += i18n("1 second", "%n seconds", dur);
+ }
+ text += i18n("startDate for duration", "%1 for %2")
+ .arg( KGlobal::locale()->formatDateTime( per.start(), false ) )
+ .arg( cont );
+ text += "<br>";
+ } else {
+ if ( per.start().date() == per.end().date() ) {
+ text += i18n("date, fromTime - toTime ", "%1, %2 - %3")
+ .arg( KGlobal::locale()->formatDate( per.start().date() ) )
+ .arg( KGlobal::locale()->formatTime( per.start().time() ) )
+ .arg( KGlobal::locale()->formatTime( per.end().time() ) );
+ } else {
+ text += i18n("fromDateTime - toDateTime", "%1 - %2")
+ .arg( KGlobal::locale()->formatDateTime( per.start(), false ) )
+ .arg( KGlobal::locale()->formatDateTime( per.end(), false ) );
+ }
+ text += "<br>";
+ }
+ }
+ tmpStr += eventViewerAddTag( "p", text );
+ return tmpStr;
+}
+
+class IncidenceFormatter::EventViewerVisitor : public IncidenceBase::Visitor
+{
+ public:
+ EventViewerVisitor() { mResult = ""; }
+ bool act( IncidenceBase *incidence ) { return incidence->accept( *this ); }
+ QString result() const { return mResult; }
+ protected:
+ bool visit( Event *event )
+ {
+ mResult = eventViewerFormatEvent( event );
+ return !mResult.isEmpty();
+ }
+ bool visit( Todo *todo )
+ {
+ mResult = eventViewerFormatTodo( todo );
+ return !mResult.isEmpty();
+ }
+ bool visit( Journal *journal )
+ {
+ mResult = eventViewerFormatJournal( journal );
+ return !mResult.isEmpty();
+ }
+ bool visit( FreeBusy *fb )
+ {
+ mResult = eventViewerFormatFreeBusy( fb );
+ return !mResult.isEmpty();
+ }
+
+ protected:
+ QString mResult;
+};
+
+QString IncidenceFormatter::extensiveDisplayString( IncidenceBase *incidence )
+{
+ if ( !incidence ) return QString::null;
+ EventViewerVisitor v;
+ if ( v.act( incidence ) ) {
+ return v.result();
+ } else
+ return QString::null;
+}
+
+
+
+
+/*******************************************************************
+ * Helper functions for the body part formatter of kmail
+ *******************************************************************/
+
+static QString string2HTML( const QString& str )
+{
+ return QStyleSheet::convertFromPlainText(str, QStyleSheetItem::WhiteSpaceNormal);
+}
+
+static QString eventStartTimeStr( Event *event )
+{
+ QString tmp;
+ if ( ! event->doesFloat() ) {
+ tmp = i18n("%1: Start Date, %2: Start Time", "%1 %2")
+ .arg( event->dtStartDateStr(), event->dtStartTimeStr() );
+ } else {
+ tmp = i18n("%1: Start Date", "%1 (time unspecified)")
+ .arg( event->dtStartDateStr() );
+ }
+ return tmp;
+}
+
+static QString eventEndTimeStr( Event *event )
+{
+ QString tmp;
+ if ( event->hasEndDate() ) {
+ if ( ! event->doesFloat() ) {
+ tmp = i18n("%1: End Date, %2: End Time", "%1 %2")
+ .arg( event->dtEndDateStr(), event->dtEndTimeStr() );
+ } else {
+ tmp = i18n("%1: End Date", "%1 (time unspecified)")
+ .arg( event->dtEndDateStr() );
+ }
+ } else {
+ tmp = i18n( "Unspecified" );
+ }
+ return tmp;
+}
+
+static QString invitationRow( const QString &cell1, const QString &cell2 )
+{
+ return "<tr><td>" + cell1 + "</td><td>" + cell2 + "</td></tr>\n";
+}
+
+static QString invitationsDetailsIncidence( Incidence *incidence )
+{
+ QString html;
+ QString descr = incidence->description();
+ if( !descr.isEmpty() ) {
+ html += "<br/><u>" + i18n("Description:")
+ + "</u><table border=\"0\"><tr><td>&nbsp;</td><td>";
+ html += string2HTML(descr) + "</td></tr></table>";
+ }
+ QStringList comments = incidence->comments();
+ if ( !comments.isEmpty() ) {
+ html += "<br><u>" + i18n("Comments:")
+ + "</u><table border=\"0\"><tr><td>&nbsp;</td><td><ul>";
+ for ( uint i = 0; i < comments.count(); ++i )
+ html += "<li>" + string2HTML( comments[i] ) + "</li>";
+ html += "</ul></td></tr></table>";
+ }
+ return html;
+}
+
+static QString invitationDetailsEvent( Event* event )
+{
+ // Meeting details are formatted into an HTML table
+ if ( !event )
+ return QString::null;
+
+ QString html;
+ QString tmp;
+
+ QString sSummary = i18n( "Summary unspecified" );
+ if ( ! event->summary().isEmpty() ) {
+ sSummary = string2HTML( event->summary() );
+ }
+
+ QString sLocation = i18n( "Location unspecified" );
+ if ( ! event->location().isEmpty() ) {
+ sLocation = string2HTML( event->location() );
+ }
+
+ QString dir = ( QApplication::reverseLayout() ? "rtl" : "ltr" );
+ html = QString("<div dir=\"%1\">\n").arg(dir);
+
+ html += "<table border=\"0\" cellpadding=\"1\" cellspacing=\"1\">\n";
+
+ // Meeting summary & location rows
+ html += invitationRow( i18n( "What:" ), sSummary );
+ html += invitationRow( i18n( "Where:" ), sLocation );
+
+ // Meeting Start Time Row
+ html += invitationRow( i18n( "Start Time:" ), eventStartTimeStr( event ) );
+
+ // Meeting End Time Row
+ html += invitationRow( i18n( "End Time:" ), eventEndTimeStr( event ) );
+
+ // Meeting Duration Row
+ if ( !event->doesFloat() && event->hasEndDate() ) {
+ tmp = QString::null;
+ QTime sDuration(0,0,0), t;
+ int secs = event->dtStart().secsTo( event->dtEnd() );
+ t = sDuration.addSecs( secs );
+ if ( t.hour() > 0 ) {
+ tmp += i18n( "1 hour ", "%n hours ", t.hour() );
+ }
+ if ( t.minute() > 0 ) {
+ tmp += i18n( "1 minute ", "%n minutes ", t.minute() );
+ }
+
+ html += invitationRow( i18n( "Duration:" ), tmp );
+ }
+
+ html += "</table>\n";
+ html += invitationsDetailsIncidence( event );
+ html += "</div>\n";
+
+ return html;
+}
+
+static QString invitationDetailsTodo( Todo *todo )
+{
+ // Task details are formatted into an HTML table
+ if ( !todo )
+ return QString::null;
+
+ QString sSummary = i18n( "Summary unspecified" );
+ QString sDescr = i18n( "Description unspecified" );
+ if ( ! todo->summary().isEmpty() ) {
+ sSummary = todo->summary();
+ }
+ if ( ! todo->description().isEmpty() ) {
+ sDescr = todo->description();
+ }
+ QString html( "<table border=\"0\" cellpadding=\"1\" cellspacing=\"1\">\n" );
+ html += invitationRow( i18n( "Summary:" ), sSummary );
+ html += invitationRow( i18n( "Description:" ), sDescr );
+ html += "</table>\n";
+ html += invitationsDetailsIncidence( todo );
+
+ return html;
+}
+
+static QString invitationDetailsJournal( Journal *journal )
+{
+ if ( !journal )
+ return QString::null;
+
+ QString sSummary = i18n( "Summary unspecified" );
+ QString sDescr = i18n( "Description unspecified" );
+ if ( ! journal->summary().isEmpty() ) {
+ sSummary = journal->summary();
+ }
+ if ( ! journal->description().isEmpty() ) {
+ sDescr = journal->description();
+ }
+ QString html( "<table border=\"0\" cellpadding=\"1\" cellspacing=\"1\">\n" );
+ html += invitationRow( i18n( "Summary:" ), sSummary );
+ html += invitationRow( i18n( "Date:" ), journal->dtStartDateStr( false ) );
+ html += invitationRow( i18n( "Description:" ), sDescr );
+ html += "</table>\n";
+ html += invitationsDetailsIncidence( journal );
+
+ return html;
+}
+
+static QString invitationDetailsFreeBusy( FreeBusy *fb )
+{
+ if ( !fb )
+ return QString::null;
+ QString html( "<table border=\"0\" cellpadding=\"1\" cellspacing=\"1\">\n" );
+
+ html += invitationRow( i18n("Person:"), fb->organizer().fullName() );
+ html += invitationRow( i18n("Start date:"), fb->dtStartDateStr() );
+ html += invitationRow( i18n("End date:"),
+ KGlobal::locale()->formatDate( fb->dtEnd().date(), true ) );
+ html += "<tr><td colspan=2><hr></td></tr>\n";
+ html += "<tr><td colspan=2>Busy periods given in this free/busy object:</td></tr>\n";
+
+ QValueList<Period> periods = fb->busyPeriods();
+
+ QValueList<Period>::iterator it;
+ for ( it = periods.begin(); it != periods.end(); ++it ) {
+ Period per = *it;
+ if ( per.hasDuration() ) {
+ int dur = per.duration().asSeconds();
+ QString cont;
+ if ( dur >= 3600 ) {
+ cont += i18n("1 hour ", "%n hours ", dur / 3600);
+ dur %= 3600;
+ }
+ if ( dur >= 60 ) {
+ cont += i18n("1 minute", "%n minutes ", dur / 60);
+ dur %= 60;
+ }
+ if ( dur > 0 ) {
+ cont += i18n("1 second", "%n seconds", dur);
+ }
+ html += invitationRow( QString::null, i18n("startDate for duration", "%1 for %2")
+ .arg( KGlobal::locale()->formatDateTime( per.start(), false ) )
+ .arg(cont) );
+ } else {
+ QString cont;
+ if ( per.start().date() == per.end().date() ) {
+ cont = i18n("date, fromTime - toTime ", "%1, %2 - %3")
+ .arg( KGlobal::locale()->formatDate( per.start().date() ) )
+ .arg( KGlobal::locale()->formatTime( per.start().time() ) )
+ .arg( KGlobal::locale()->formatTime( per.end().time() ) );
+ } else {
+ cont = i18n("fromDateTime - toDateTime", "%1 - %2")
+ .arg( KGlobal::locale()->formatDateTime( per.start(), false ) )
+ .arg( KGlobal::locale()->formatDateTime( per.end(), false ) );
+ }
+
+ html += invitationRow( QString::null, cont );
+ }
+ }
+
+ html += "</table>\n";
+ return html;
+}
+
+static QString invitationHeaderEvent( Event *event, ScheduleMessage *msg )
+{
+ if ( !msg || !event )
+ return QString::null;
+ switch ( msg->method() ) {
+ case Scheduler::Publish:
+ return i18n("This event has been published");
+ case Scheduler::Request:
+ if ( event->revision() > 0 )
+ return i18n( "This meeting has been updated" );
+ return i18n( "You have been invited to this meeting" );
+ case Scheduler::Refresh:
+ return i18n( "This invitation was refreshed" );
+ case Scheduler::Cancel:
+ return i18n( "This meeting has been canceled" );
+ case Scheduler::Add:
+ return i18n( "Addition to the meeting invitation" );
+ case Scheduler::Reply: {
+ Attendee::List attendees = event->attendees();
+ if( attendees.count() == 0 ) {
+ kdDebug(5850) << "No attendees in the iCal reply!\n";
+ return QString::null;
+ }
+ if( attendees.count() != 1 )
+ kdDebug(5850) << "Warning: attendeecount in the reply should be 1 "
+ << "but is " << attendees.count() << endl;
+ Attendee* attendee = *attendees.begin();
+ QString attendeeName = attendee->name();
+ if ( attendeeName.isEmpty() )
+ attendeeName = attendee->email();
+ if ( attendeeName.isEmpty() )
+ attendeeName = i18n( "Sender" );
+
+ QString delegatorName, dummy;
+ KPIM::getNameAndMail( attendee->delegator(), delegatorName, dummy );
+ if ( delegatorName.isEmpty() )
+ delegatorName = attendee->delegator();
+
+ switch( attendee->status() ) {
+ case Attendee::NeedsAction:
+ return i18n( "%1 indicates this invitation still needs some action" ).arg( attendeeName );
+ case Attendee::Accepted:
+ if ( delegatorName.isEmpty() )
+ return i18n( "%1 accepts this meeting invitation" ).arg( attendeeName );
+ return i18n( "%1 accepts this meeting invitation on behalf of %2" )
+ .arg( attendeeName ).arg( delegatorName );
+ case Attendee::Tentative:
+ if ( delegatorName.isEmpty() )
+ return i18n( "%1 tentatively accepts this meeting invitation" ).arg( attendeeName );
+ return i18n( "%1 tentatively accepts this meeting invitation on behalf of %2" )
+ .arg( attendeeName ).arg( delegatorName );
+ case Attendee::Declined:
+ if ( delegatorName.isEmpty() )
+ return i18n( "%1 declines this meeting invitation" ).arg( attendeeName );
+ return i18n( "%1 declines this meeting invitation on behalf of %2" )
+ .arg( attendeeName ).arg( delegatorName );
+ case Attendee::Delegated: {
+ QString delegate, dummy;
+ KPIM::getNameAndMail( attendee->delegate(), delegate, dummy );
+ if ( delegate.isEmpty() )
+ delegate = attendee->delegate();
+ if ( !delegate.isEmpty() )
+ return i18n( "%1 has delegated this meeting invitation to %2" )
+ .arg( attendeeName ) .arg( delegate );
+ return i18n( "%1 has delegated this meeting invitation" ).arg( attendeeName );
+ }
+ case Attendee::Completed:
+ return i18n( "This meeting invitation is now completed" );
+ case Attendee::InProcess:
+ return i18n( "%1 is still processing the invitation" ).arg( attendeeName );
+ default:
+ return i18n( "Unknown response to this meeting invitation" );
+ }
+ break; }
+ case Scheduler::Counter:
+ return i18n( "Sender makes this counter proposal" );
+ case Scheduler::Declinecounter:
+ return i18n( "Sender declines the counter proposal" );
+ case Scheduler::NoMethod:
+ return i18n("Error: iMIP message with unknown method: '%1'")
+ .arg( msg->method() );
+ }
+ return QString::null;
+}
+
+static QString invitationHeaderTodo( Todo *todo, ScheduleMessage *msg )
+{
+ if ( !msg || !todo )
+ return QString::null;
+ switch ( msg->method() ) {
+ case Scheduler::Publish:
+ return i18n("This task has been published");
+ case Scheduler::Request:
+ if ( todo->revision() > 0 )
+ return i18n( "This task has been updated" );
+ return i18n( "You have been assigned this task" );
+ case Scheduler::Refresh:
+ return i18n( "This task was refreshed" );
+ case Scheduler::Cancel:
+ return i18n( "This task was canceled" );
+ case Scheduler::Add:
+ return i18n( "Addition to the task" );
+ case Scheduler::Reply: {
+ Attendee::List attendees = todo->attendees();
+ if( attendees.count() == 0 ) {
+ kdDebug(5850) << "No attendees in the iCal reply!\n";
+ return QString::null;
+ }
+ if( attendees.count() != 1 )
+ kdDebug(5850) << "Warning: attendeecount in the reply should be 1 "
+ << "but is " << attendees.count() << endl;
+ Attendee* attendee = *attendees.begin();
+
+ switch( attendee->status() ) {
+ case Attendee::NeedsAction:
+ return i18n( "Sender indicates this task assignment still needs some action" );
+ case Attendee::Accepted:
+ return i18n( "Sender accepts this task" );
+ case Attendee::Tentative:
+ return i18n( "Sender tentatively accepts this task" );
+ case Attendee::Declined:
+ return i18n( "Sender declines this task" );
+ case Attendee::Delegated: {
+ QString delegate, dummy;
+ KPIM::getNameAndMail( attendee->delegate(), delegate, dummy );
+ if ( delegate.isEmpty() )
+ delegate = attendee->delegate();
+ if ( !delegate.isEmpty() )
+ return i18n( "Sender has delegated this request for the task to %1" ).arg( delegate );
+ return i18n( "Sender has delegated this request for the task " );
+ }
+ case Attendee::Completed:
+ return i18n( "The request for this task is now completed" );
+ case Attendee::InProcess:
+ return i18n( "Sender is still processing the invitation" );
+ default:
+ return i18n( "Unknown response to this task" );
+ }
+ break; }
+ case Scheduler::Counter:
+ return i18n( "Sender makes this counter proposal" );
+ case Scheduler::Declinecounter:
+ return i18n( "Sender declines the counter proposal" );
+ case Scheduler::NoMethod:
+ return i18n("Error: iMIP message with unknown method: '%1'")
+ .arg( msg->method() );
+ }
+ return QString::null;
+}
+
+static QString invitationHeaderJournal( Journal *journal, ScheduleMessage *msg )
+{
+ // TODO: Several of the methods are not allowed for journals, so remove them.
+ if ( !msg || !journal )
+ return QString::null;
+ switch ( msg->method() ) {
+ case Scheduler::Publish:
+ return i18n("This journal has been published");
+ case Scheduler::Request:
+ return i18n( "You have been assigned this journal" );
+ case Scheduler::Refresh:
+ return i18n( "This journal was refreshed" );
+ case Scheduler::Cancel:
+ return i18n( "This journal was canceled" );
+ case Scheduler::Add:
+ return i18n( "Addition to the journal" );
+ case Scheduler::Reply: {
+ Attendee::List attendees = journal->attendees();
+ if( attendees.count() == 0 ) {
+ kdDebug(5850) << "No attendees in the iCal reply!\n";
+ return QString::null;
+ }
+ if( attendees.count() != 1 )
+ kdDebug(5850) << "Warning: attendeecount in the reply should be 1 "
+ << "but is " << attendees.count() << endl;
+ Attendee* attendee = *attendees.begin();
+
+ switch( attendee->status() ) {
+ case Attendee::NeedsAction:
+ return i18n( "Sender indicates this journal assignment still needs some action" );
+ case Attendee::Accepted:
+ return i18n( "Sender accepts this journal" );
+ case Attendee::Tentative:
+ return i18n( "Sender tentatively accepts this journal" );
+ case Attendee::Declined:
+ return i18n( "Sender declines this journal" );
+ case Attendee::Delegated:
+ return i18n( "Sender has delegated this request for the journal" );
+ case Attendee::Completed:
+ return i18n( "The request for this journal is now completed" );
+ case Attendee::InProcess:
+ return i18n( "Sender is still processing the invitation" );
+ default:
+ return i18n( "Unknown response to this journal" );
+ }
+ break; }
+ case Scheduler::Counter:
+ return i18n( "Sender makes this counter proposal" );
+ case Scheduler::Declinecounter:
+ return i18n( "Sender declines the counter proposal" );
+ case Scheduler::NoMethod:
+ return i18n("Error: iMIP message with unknown method: '%1'")
+ .arg( msg->method() );
+ }
+ return QString::null;
+}
+
+static QString invitationHeaderFreeBusy( FreeBusy *fb, ScheduleMessage *msg )
+{
+ if ( !msg || !fb )
+ return QString::null;
+ switch ( msg->method() ) {
+ case Scheduler::Publish:
+ return i18n("This free/busy list has been published");
+ case Scheduler::Request:
+ return i18n( "The free/busy list has been requested" );
+ case Scheduler::Refresh:
+ return i18n( "This free/busy list was refreshed" );
+ case Scheduler::Cancel:
+ return i18n( "This free/busy list was canceled" );
+ case Scheduler::Add:
+ return i18n( "Addition to the free/busy list" );
+ case Scheduler::NoMethod:
+ default:
+ return i18n("Error: Free/Busy iMIP message with unknown method: '%1'")
+ .arg( msg->method() );
+ }
+}
+
+class IncidenceFormatter::ScheduleMessageVisitor : public IncidenceBase::Visitor
+{
+ public:
+ ScheduleMessageVisitor() : mMessage(0) { mResult = ""; }
+ bool act( IncidenceBase *incidence, ScheduleMessage *msg ) { mMessage = msg; return incidence->accept( *this ); }
+ QString result() const { return mResult; }
+
+ protected:
+ QString mResult;
+ ScheduleMessage *mMessage;
+};
+
+class IncidenceFormatter::InvitationHeaderVisitor :
+ public IncidenceFormatter::ScheduleMessageVisitor
+{
+ protected:
+ bool visit( Event *event )
+ {
+ mResult = invitationHeaderEvent( event, mMessage );
+ return !mResult.isEmpty();
+ }
+ bool visit( Todo *todo )
+ {
+ mResult = invitationHeaderTodo( todo, mMessage );
+ return !mResult.isEmpty();
+ }
+ bool visit( Journal *journal )
+ {
+ mResult = invitationHeaderJournal( journal, mMessage );
+ return !mResult.isEmpty();
+ }
+ bool visit( FreeBusy *fb )
+ {
+ mResult = invitationHeaderFreeBusy( fb, mMessage );
+ return !mResult.isEmpty();
+ }
+};
+
+class IncidenceFormatter::InvitationBodyVisitor :
+ public IncidenceFormatter::ScheduleMessageVisitor
+{
+ protected:
+ bool visit( Event *event )
+ {
+ mResult = invitationDetailsEvent( event );
+ return !mResult.isEmpty();
+ }
+ bool visit( Todo *todo )
+ {
+ mResult = invitationDetailsTodo( todo );
+ return !mResult.isEmpty();
+ }
+ bool visit( Journal *journal )
+ {
+ mResult = invitationDetailsJournal( journal );
+ return !mResult.isEmpty();
+ }
+ bool visit( FreeBusy *fb )
+ {
+ mResult = invitationDetailsFreeBusy( fb );
+ return !mResult.isEmpty();
+ }
+};
+
+class IncidenceFormatter::IncidenceCompareVisitor :
+ public IncidenceBase::Visitor
+{
+ public:
+ IncidenceCompareVisitor() : mExistingIncidence(0) {}
+ bool act( IncidenceBase *incidence, Incidence* existingIncidence )
+ {
+ mExistingIncidence = existingIncidence;
+ return incidence->accept( *this );
+ }
+
+ QString result() const
+ {
+ if ( mChanges.isEmpty() )
+ return QString();
+ QString html = "<div align=\"left\"><ul><li>";
+ html += mChanges.join( "</li><li>" );
+ html += "</li><ul></div>";
+ return html;
+ }
+
+ protected:
+ bool visit( Event *event )
+ {
+ compareEvents( event, dynamic_cast<Event*>( mExistingIncidence ) );
+ compareIncidences( event, mExistingIncidence );
+ return !mChanges.isEmpty();
+ }
+ bool visit( Todo *todo )
+ {
+ compareIncidences( todo, mExistingIncidence );
+ return !mChanges.isEmpty();
+ }
+ bool visit( Journal *journal )
+ {
+ compareIncidences( journal, mExistingIncidence );
+ return !mChanges.isEmpty();
+ }
+ bool visit( FreeBusy *fb )
+ {
+ Q_UNUSED( fb );
+ return !mChanges.isEmpty();
+ }
+
+ private:
+ void compareEvents( Event *newEvent, Event *oldEvent )
+ {
+ if ( !oldEvent || !newEvent )
+ return;
+ if ( oldEvent->dtStart() != newEvent->dtStart() || oldEvent->doesFloat() != newEvent->doesFloat() )
+ mChanges += i18n( "The begin of the meeting has been changed from %1 to %2" )
+ .arg( eventStartTimeStr( oldEvent ) ).arg( eventStartTimeStr( newEvent ) );
+ if ( oldEvent->dtEnd() != newEvent->dtEnd() || oldEvent->doesFloat() != newEvent->doesFloat() )
+ mChanges += i18n( "The end of the meeting has been changed from %1 to %2" )
+ .arg( eventEndTimeStr( oldEvent ) ).arg( eventEndTimeStr( newEvent ) );
+ }
+
+ void compareIncidences( Incidence *newInc, Incidence *oldInc )
+ {
+ if ( !oldInc || !newInc )
+ return;
+ if ( oldInc->summary() != newInc->summary() )
+ mChanges += i18n( "The summary has been changed to: \"%1\"" ).arg( newInc->summary() );
+ if ( oldInc->location() != newInc->location() )
+ mChanges += i18n( "The location has been changed to: \"%1\"" ).arg( newInc->location() );
+ if ( oldInc->description() != newInc->description() )
+ mChanges += i18n( "The description has been changed to: \"%1\"" ).arg( newInc->description() );
+ Attendee::List oldAttendees = oldInc->attendees();
+ Attendee::List newAttendees = newInc->attendees();
+ for ( Attendee::List::ConstIterator it = newAttendees.constBegin(); it != newAttendees.constEnd(); ++it ) {
+ Attendee *oldAtt = oldInc->attendeeByMail( (*it)->email() );
+ if ( !oldAtt ) {
+ mChanges += i18n( "Attendee %1 has been added" ).arg( (*it)->fullName() );
+ } else {
+ if ( oldAtt->status() != (*it)->status() )
+ mChanges += i18n( "The status of attendee %1 has been changed to: %2" ).arg( (*it)->fullName() )
+ .arg( (*it)->statusStr() );
+ }
+ }
+ for ( Attendee::List::ConstIterator it = oldAttendees.constBegin(); it != oldAttendees.constEnd(); ++it ) {
+ Attendee *newAtt = newInc->attendeeByMail( (*it)->email() );
+ if ( !newAtt )
+ mChanges += i18n( "Attendee %1 has been removed" ).arg( (*it)->fullName() );
+ }
+ }
+
+ private:
+ Incidence* mExistingIncidence;
+ QStringList mChanges;
+};
+
+
+QString InvitationFormatterHelper::makeLink( const QString &id, const QString &text )
+{
+ QString res( "<a href=\"%1\"><b>%2</b></a>" );
+ return res.arg( generateLinkURL( id ) ).arg( text );
+ return res;
+}
+
+// Check if the given incidence is likely one that we own instead one from
+// a shared calendar (Kolab-specific)
+static bool incidenceOwnedByMe( Calendar* calendar, Incidence *incidence )
+{
+ CalendarResources* cal = dynamic_cast<CalendarResources*>( calendar );
+ if ( !cal || !incidence )
+ return true;
+ ResourceCalendar* res = cal->resource( incidence );
+ if ( !res )
+ return true;
+ const QString subRes = res->subresourceIdentifier( incidence );
+ if ( !subRes.contains( "/.INBOX.directory/" ) )
+ return false;
+ return true;
+}
+
+QString IncidenceFormatter::formatICalInvitation( QString invitation, Calendar *mCalendar,
+ InvitationFormatterHelper *helper )
+{
+ if ( invitation.isEmpty() ) return QString::null;
+
+ ICalFormat format;
+ // parseScheduleMessage takes the tz from the calendar, no need to set it manually here for the format!
+ ScheduleMessage *msg = format.parseScheduleMessage( mCalendar, invitation );
+
+ if( !msg ) {
+ kdDebug( 5850 ) << "Failed to parse the scheduling message" << endl;
+ Q_ASSERT( format.exception() );
+ kdDebug( 5850 ) << format.exception()->message() << endl;
+ return QString::null;
+ }
+
+ IncidenceBase *incBase = msg->event();
+
+ Incidence* existingIncidence = 0;
+ if ( helper->calendar() ) {
+ existingIncidence = helper->calendar()->incidence( incBase->uid() );
+ if ( !incidenceOwnedByMe( helper->calendar(), existingIncidence ) )
+ existingIncidence = 0;
+ if ( !existingIncidence ) {
+ const Incidence::List list = helper->calendar()->incidences();
+ for ( Incidence::List::ConstIterator it = list.begin(), end = list.end(); it != end; ++it ) {
+ if ( (*it)->schedulingID() == incBase->uid() && incidenceOwnedByMe( helper->calendar(), *it ) ) {
+ existingIncidence = *it;
+ break;
+ }
+ }
+ }
+ }
+
+ // First make the text of the message
+ QString html;
+
+ QString tableStyle = QString::fromLatin1(
+ "style=\"border: solid 1px; margin: 0em;\"" );
+ QString tableHead = QString::fromLatin1(
+ "<div align=\"center\">"
+ "<table width=\"80%\" cellpadding=\"1\" cellspacing=\"0\" %1>"
+ "<tr><td>").arg(tableStyle);
+
+ html += tableHead;
+ InvitationHeaderVisitor headerVisitor;
+ // The InvitationHeaderVisitor returns false if the incidence is somehow invalid, or not handled
+ if ( !headerVisitor.act( incBase, msg ) )
+ return QString::null;
+ html += "<b>" + headerVisitor.result() + "</b>";
+
+ InvitationBodyVisitor bodyVisitor;
+ if ( !bodyVisitor.act( incBase, msg ) )
+ return QString::null;
+ html += bodyVisitor.result();
+
+ if ( msg->method() == Scheduler::Request ) { // ### Scheduler::Publish/Refresh/Add as well?
+ IncidenceCompareVisitor compareVisitor;
+ if ( compareVisitor.act( incBase, existingIncidence ) ) {
+ html += i18n("<p align=\"left\">The following changes have been made by the organizer:</p>");
+ html += compareVisitor.result();
+ }
+ }
+
+ html += "<br/>";
+ html += "<table border=\"0\" cellspacing=\"0\"><tr><td>&nbsp;</td></tr><tr>";
+
+#if 0
+ html += helper->makeLinkURL( "accept", i18n("[Enter this into my calendar]") );
+ html += "</td><td> &nbsp; </td><td>";
+#endif
+
+ // Add groupware links
+
+ switch ( msg->method() ) {
+ case Scheduler::Publish:
+ case Scheduler::Request:
+ case Scheduler::Refresh:
+ case Scheduler::Add:
+ {
+ Incidence *inc = dynamic_cast<Incidence*>( incBase );
+ if ( inc && inc->revision() > 0 && (existingIncidence || !helper->calendar()) ) {
+ if ( incBase->type() == "Todo" ) {
+ html += "<td colspan=\"9\">";
+ html += helper->makeLink( "reply", i18n( "[Enter this into my task list]" ) );
+ } else {
+ html += "<td colspan=\"13\">";
+ html += helper->makeLink( "reply", i18n( "[Enter this into my calendar]" ) );
+ }
+ html += "</td></tr><tr>";
+ }
+ html += "<td>";
+
+ if ( !existingIncidence ) {
+ // Accept
+ html += helper->makeLink( "accept", i18n( "[Accept]" ) );
+ html += "</td><td> &nbsp; </td><td>";
+ html += helper->makeLink( "accept_conditionally",
+ i18n( "Accept conditionally", "[Accept cond.]" ) );
+ html += "</td><td> &nbsp; </td><td>";
+ // counter proposal
+ html += helper->makeLink( "counter", i18n( "[Counter proposal]" ) );
+ html += "</td><td> &nbsp; </td><td>";
+ // Decline
+ html += helper->makeLink( "decline", i18n( "[Decline]" ) );
+ html += "</td><td> &nbsp; </td><td>";
+
+ // Delegate
+ html += helper->makeLink( "delegate", i18n( "[Delegate]" ) );
+ html += "</td><td> &nbsp; </td><td>";
+
+ // Forward
+ html += helper->makeLink( "forward", i18n( "[Forward]" ) );
+
+ if ( incBase->type() == "Event" ) {
+ html += "</b></a></td><td> &nbsp; </td><td>";
+ html += helper->makeLink( "check_calendar", i18n("[Check my calendar]" ) );
+ }
+ }
+ break;
+ }
+
+ case Scheduler::Cancel:
+ // Cancel event from my calendar
+ html += helper->makeLink( "cancel", i18n( "[Remove this from my calendar]" ) );
+ break;
+
+ case Scheduler::Reply:
+ // Enter this into my calendar
+ if ( incBase->type() == "Todo" ) {
+ html += helper->makeLink( "reply", i18n( "[Enter this into my task list]" ) );
+ } else {
+ html += helper->makeLink( "reply", i18n( "[Enter this into my calendar]" ) );
+ }
+ break;
+
+ case Scheduler::Counter:
+ html += helper->makeLink( "accept_counter", i18n("[Accept]") );
+ html += "&nbsp;";
+ html += helper->makeLink( "decline_counter", i18n("[Decline]") );
+ html += "&nbsp;";
+ html += helper->makeLink( "check_calendar", i18n("[Check my calendar]" ) );
+ break;
+ case Scheduler::Declinecounter:
+ case Scheduler::NoMethod:
+ break;
+ }
+
+ html += "</td></tr></table>";
+
+ html += "</td></tr></table><br></div>";
+
+ return html;
+}
+
+
+
+
+/*******************************************************************
+ * Helper functions for the msTNEF -> VPart converter
+ *******************************************************************/
+
+
+//-----------------------------------------------------------------------------
+
+static QString stringProp( KTNEFMessage* tnefMsg, const Q_UINT32& key,
+ const QString& fallback = QString::null)
+{
+ return tnefMsg->findProp( key < 0x10000 ? key & 0xFFFF : key >> 16,
+ fallback );
+}
+
+static QString sNamedProp( KTNEFMessage* tnefMsg, const QString& name,
+ const QString& fallback = QString::null )
+{
+ return tnefMsg->findNamedProp( name, fallback );
+}
+
+struct save_tz { char* old_tz; char* tz_env_str; };
+
+/* temporarily go to a different timezone */
+static struct save_tz set_tz( const char* _tc )
+{
+ const char *tc = _tc?_tc:"UTC";
+
+ struct save_tz rv;
+
+ rv.old_tz = 0;
+ rv.tz_env_str = 0;
+
+ //kdDebug(5006) << "set_tz(), timezone before = " << timezone << endl;
+
+ char* tz_env = 0;
+ if( getenv( "TZ" ) ) {
+ tz_env = strdup( getenv( "TZ" ) );
+ rv.old_tz = tz_env;
+ }
+ char* tmp_env = (char*)malloc( strlen( tc ) + 4 );
+ strcpy( tmp_env, "TZ=" );
+ strcpy( tmp_env+3, tc );
+ putenv( tmp_env );
+
+ rv.tz_env_str = tmp_env;
+
+ /* tmp_env is not free'ed -- it is part of the environment */
+
+ tzset();
+ //kdDebug(5006) << "set_tz(), timezone after = " << timezone << endl;
+
+ return rv;
+}
+
+/* restore previous timezone */
+static void unset_tz( struct save_tz old_tz )
+{
+ if( old_tz.old_tz ) {
+ char* tmp_env = (char*)malloc( strlen( old_tz.old_tz ) + 4 );
+ strcpy( tmp_env, "TZ=" );
+ strcpy( tmp_env+3, old_tz.old_tz );
+ putenv( tmp_env );
+ /* tmp_env is not free'ed -- it is part of the environment */
+ free( old_tz.old_tz );
+ } else {
+ /* clear TZ from env */
+ putenv( strdup("TZ") );
+ }
+ tzset();
+
+ /* is this OK? */
+ if( old_tz.tz_env_str ) free( old_tz.tz_env_str );
+}
+
+static QDateTime utc2Local( const QDateTime& utcdt )
+{
+ struct tm tmL;
+
+ save_tz tmp_tz = set_tz("UTC");
+ time_t utc = utcdt.toTime_t();
+ unset_tz( tmp_tz );
+
+ localtime_r( &utc, &tmL );
+ return QDateTime( QDate( tmL.tm_year+1900, tmL.tm_mon+1, tmL.tm_mday ),
+ QTime( tmL.tm_hour, tmL.tm_min, tmL.tm_sec ) );
+}
+
+
+static QDateTime pureISOToLocalQDateTime( const QString& dtStr,
+ bool bDateOnly = false )
+{
+ QDate tmpDate;
+ QTime tmpTime;
+ int year, month, day, hour, minute, second;
+
+ if( bDateOnly ) {
+ year = dtStr.left( 4 ).toInt();
+ month = dtStr.mid( 4, 2 ).toInt();
+ day = dtStr.mid( 6, 2 ).toInt();
+ hour = 0;
+ minute = 0;
+ second = 0;
+ } else {
+ year = dtStr.left( 4 ).toInt();
+ month = dtStr.mid( 4, 2 ).toInt();
+ day = dtStr.mid( 6, 2 ).toInt();
+ hour = dtStr.mid( 9, 2 ).toInt();
+ minute = dtStr.mid( 11, 2 ).toInt();
+ second = dtStr.mid( 13, 2 ).toInt();
+ }
+ tmpDate.setYMD( year, month, day );
+ tmpTime.setHMS( hour, minute, second );
+
+ if( tmpDate.isValid() && tmpTime.isValid() ) {
+ QDateTime dT = QDateTime( tmpDate, tmpTime );
+
+ if( !bDateOnly ) {
+ // correct for GMT ( == Zulu time == UTC )
+ if (dtStr.at(dtStr.length()-1) == 'Z') {
+ //dT = dT.addSecs( 60 * KRFCDate::localUTCOffset() );
+ //localUTCOffset( dT ) );
+ dT = utc2Local( dT );
+ }
+ }
+ return dT;
+ } else
+ return QDateTime();
+}
+
+
+
+QString IncidenceFormatter::msTNEFToVPart( const QByteArray& tnef )
+{
+ bool bOk = false;
+
+ KTNEFParser parser;
+ QBuffer buf( tnef );
+ CalendarLocal cal ( QString::fromLatin1( "UTC" ) );
+ KABC::Addressee addressee;
+ KABC::VCardConverter cardConv;
+ ICalFormat calFormat;
+ Event* event = new Event();
+
+ if( parser.openDevice( &buf ) ) {
+ KTNEFMessage* tnefMsg = parser.message();
+ //QMap<int,KTNEFProperty*> props = parser.message()->properties();
+
+ // Everything depends from property PR_MESSAGE_CLASS
+ // (this is added by KTNEFParser):
+ QString msgClass = tnefMsg->findProp( 0x001A, QString::null, true )
+ .upper();
+ if( !msgClass.isEmpty() ) {
+ // Match the old class names that might be used by Outlook for
+ // compatibility with Microsoft Mail for Windows for Workgroups 3.1.
+ bool bCompatClassAppointment = false;
+ bool bCompatMethodRequest = false;
+ bool bCompatMethodCancled = false;
+ bool bCompatMethodAccepted = false;
+ bool bCompatMethodAcceptedCond = false;
+ bool bCompatMethodDeclined = false;
+ if( msgClass.startsWith( "IPM.MICROSOFT SCHEDULE." ) ) {
+ bCompatClassAppointment = true;
+ if( msgClass.endsWith( ".MTGREQ" ) )
+ bCompatMethodRequest = true;
+ if( msgClass.endsWith( ".MTGCNCL" ) )
+ bCompatMethodCancled = true;
+ if( msgClass.endsWith( ".MTGRESPP" ) )
+ bCompatMethodAccepted = true;
+ if( msgClass.endsWith( ".MTGRESPA" ) )
+ bCompatMethodAcceptedCond = true;
+ if( msgClass.endsWith( ".MTGRESPN" ) )
+ bCompatMethodDeclined = true;
+ }
+ bool bCompatClassNote = ( msgClass == "IPM.MICROSOFT MAIL.NOTE" );
+
+ if( bCompatClassAppointment || "IPM.APPOINTMENT" == msgClass ) {
+ // Compose a vCal
+ bool bIsReply = false;
+ QString prodID = "-//Microsoft Corporation//Outlook ";
+ prodID += tnefMsg->findNamedProp( "0x8554", "9.0" );
+ prodID += "MIMEDIR/EN\n";
+ prodID += "VERSION:2.0\n";
+ calFormat.setApplication( "Outlook", prodID );
+
+ Scheduler::Method method;
+ if( bCompatMethodRequest )
+ method = Scheduler::Request;
+ else if( bCompatMethodCancled )
+ method = Scheduler::Cancel;
+ else if( bCompatMethodAccepted || bCompatMethodAcceptedCond ||
+ bCompatMethodDeclined ) {
+ method = Scheduler::Reply;
+ bIsReply = true;
+ } else {
+ // pending(khz): verify whether "0x0c17" is the right tag ???
+ //
+ // at the moment we think there are REQUESTS and UPDATES
+ //
+ // but WHAT ABOUT REPLIES ???
+ //
+ //
+
+ if( tnefMsg->findProp(0x0c17) == "1" )
+ bIsReply = true;
+ method = Scheduler::Request;
+ }
+
+ /// ### FIXME Need to get this attribute written
+ ScheduleMessage schedMsg(event, method, ScheduleMessage::Unknown );
+
+ QString sSenderSearchKeyEmail( tnefMsg->findProp( 0x0C1D ) );
+
+ if( !sSenderSearchKeyEmail.isEmpty() ) {
+ int colon = sSenderSearchKeyEmail.find( ':' );
+ // May be e.g. "SMTP:KHZ@KDE.ORG"
+ if( sSenderSearchKeyEmail.find( ':' ) == -1 )
+ sSenderSearchKeyEmail.remove( 0, colon+1 );
+ }
+
+ QString s( tnefMsg->findProp( 0x0e04 ) );
+ QStringList attendees = QStringList::split( ';', s );
+ if( attendees.count() ) {
+ for( QStringList::Iterator it = attendees.begin();
+ it != attendees.end(); ++it ) {
+ // Skip all entries that have no '@' since these are
+ // no mail addresses
+ if( (*it).find('@') == -1 ) {
+ s = (*it).stripWhiteSpace();
+
+ Attendee *attendee = new Attendee( s, s, true );
+ if( bIsReply ) {
+ if( bCompatMethodAccepted )
+ attendee->setStatus( Attendee::Accepted );
+ if( bCompatMethodDeclined )
+ attendee->setStatus( Attendee::Declined );
+ if( bCompatMethodAcceptedCond )
+ attendee->setStatus(Attendee::Tentative);
+ } else {
+ attendee->setStatus( Attendee::NeedsAction );
+ attendee->setRole( Attendee::ReqParticipant );
+ }
+ event->addAttendee(attendee);
+ }
+ }
+ } else {
+ // Oops, no attendees?
+ // This must be old style, let us use the PR_SENDER_SEARCH_KEY.
+ s = sSenderSearchKeyEmail;
+ if( !s.isEmpty() ) {
+ Attendee *attendee = new Attendee( QString::null, QString::null,
+ true );
+ if( bIsReply ) {
+ if( bCompatMethodAccepted )
+ attendee->setStatus( Attendee::Accepted );
+ if( bCompatMethodAcceptedCond )
+ attendee->setStatus( Attendee::Declined );
+ if( bCompatMethodDeclined )
+ attendee->setStatus( Attendee::Tentative );
+ } else {
+ attendee->setStatus(Attendee::NeedsAction);
+ attendee->setRole(Attendee::ReqParticipant);
+ }
+ event->addAttendee(attendee);
+ }
+ }
+ s = tnefMsg->findProp( 0x0c1f ); // look for organizer property
+ if( s.isEmpty() && !bIsReply )
+ s = sSenderSearchKeyEmail;
+ // TODO: Use the common name?
+ if( !s.isEmpty() )
+ event->setOrganizer( s );
+
+ s = tnefMsg->findProp( 0x8516 ).replace( QChar( '-' ), QString::null )
+ .replace( QChar( ':' ), QString::null );
+ event->setDtStart( QDateTime::fromString( s ) ); // ## Format??
+
+ s = tnefMsg->findProp( 0x8517 ).replace( QChar( '-' ), QString::null )
+ .replace( QChar( ':' ), QString::null );
+ event->setDtEnd( QDateTime::fromString( s ) );
+
+ s = tnefMsg->findProp( 0x8208 );
+ event->setLocation( s );
+
+ // is it OK to set this to OPAQUE always ??
+ //vPart += "TRANSP:OPAQUE\n"; ###FIXME, portme!
+ //vPart += "SEQUENCE:0\n";
+
+ // is "0x0023" OK - or should we look for "0x0003" ??
+ s = tnefMsg->findProp( 0x0023 );
+ event->setUid( s );
+
+ // PENDING(khz): is this value in local timezone? Must it be
+ // adjusted? Most likely this is a bug in the server or in
+ // Outlook - we ignore it for now.
+ s = tnefMsg->findProp( 0x8202 ).replace( QChar( '-' ), QString::null )
+ .replace( QChar( ':' ), QString::null );
+ // ### libkcal always uses currentDateTime()
+ // event->setDtStamp(QDateTime::fromString(s));
+
+ s = tnefMsg->findNamedProp( "Keywords" );
+ event->setCategories( s );
+
+ s = tnefMsg->findProp( 0x1000 );
+ event->setDescription( s );
+
+ s = tnefMsg->findProp( 0x0070 );
+ event->setSummary( s );
+
+ s = tnefMsg->findProp( 0x0026 );
+ event->setPriority( s.toInt() );
+
+ // is reminder flag set ?
+ if(!tnefMsg->findProp(0x8503).isEmpty()) {
+ Alarm *alarm = new Alarm(event);
+ QDateTime highNoonTime =
+ pureISOToLocalQDateTime( tnefMsg->findProp( 0x8502 )
+ .replace( QChar( '-' ), "" )
+ .replace( QChar( ':' ), "" ) );
+ QDateTime wakeMeUpTime =
+ pureISOToLocalQDateTime( tnefMsg->findProp( 0x8560, "" )
+ .replace( QChar( '-' ), "" )
+ .replace( QChar( ':' ), "" ) );
+ alarm->setTime(wakeMeUpTime);
+
+ if( highNoonTime.isValid() && wakeMeUpTime.isValid() )
+ alarm->setStartOffset( Duration( highNoonTime, wakeMeUpTime ) );
+ else
+ // default: wake them up 15 minutes before the appointment
+ alarm->setStartOffset( Duration( 15*60 ) );
+ alarm->setDisplayAlarm( i18n( "Reminder" ) );
+
+ // Sorry: the different action types are not known (yet)
+ // so we always set 'DISPLAY' (no sounds, no images...)
+ event->addAlarm( alarm );
+ }
+ cal.addEvent( event );
+ bOk = true;
+ // we finished composing a vCal
+ } else if( bCompatClassNote || "IPM.CONTACT" == msgClass ) {
+ addressee.setUid( stringProp( tnefMsg, attMSGID ) );
+ addressee.setFormattedName( stringProp( tnefMsg, MAPI_TAG_PR_DISPLAY_NAME ) );
+ addressee.insertEmail( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_EMAIL1EMAILADDRESS ), true );
+ addressee.insertEmail( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_EMAIL2EMAILADDRESS ), false );
+ addressee.insertEmail( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_EMAIL3EMAILADDRESS ), false );
+ addressee.insertCustom( "KADDRESSBOOK", "X-IMAddress", sNamedProp( tnefMsg, MAPI_TAG_CONTACT_IMADDRESS ) );
+ addressee.insertCustom( "KADDRESSBOOK", "X-SpousesName", stringProp( tnefMsg, MAPI_TAG_PR_SPOUSE_NAME ) );
+ addressee.insertCustom( "KADDRESSBOOK", "X-ManagersName", stringProp( tnefMsg, MAPI_TAG_PR_MANAGER_NAME ) );
+ addressee.insertCustom( "KADDRESSBOOK", "X-AssistantsName", stringProp( tnefMsg, MAPI_TAG_PR_ASSISTANT ) );
+ addressee.insertCustom( "KADDRESSBOOK", "X-Department", stringProp( tnefMsg, MAPI_TAG_PR_DEPARTMENT_NAME ) );
+ addressee.insertCustom( "KADDRESSBOOK", "X-Office", stringProp( tnefMsg, MAPI_TAG_PR_OFFICE_LOCATION ) );
+ addressee.insertCustom( "KADDRESSBOOK", "X-Profession", stringProp( tnefMsg, MAPI_TAG_PR_PROFESSION ) );
+
+ QString s = tnefMsg->findProp( MAPI_TAG_PR_WEDDING_ANNIVERSARY )
+ .replace( QChar( '-' ), QString::null )
+ .replace( QChar( ':' ), QString::null );
+ if( !s.isEmpty() )
+ addressee.insertCustom( "KADDRESSBOOK", "X-Anniversary", s );
+
+ addressee.setUrl( KURL( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_WEBPAGE ) ) );
+
+ // collect parts of Name entry
+ addressee.setFamilyName( stringProp( tnefMsg, MAPI_TAG_PR_SURNAME ) );
+ addressee.setGivenName( stringProp( tnefMsg, MAPI_TAG_PR_GIVEN_NAME ) );
+ addressee.setAdditionalName( stringProp( tnefMsg, MAPI_TAG_PR_MIDDLE_NAME ) );
+ addressee.setPrefix( stringProp( tnefMsg, MAPI_TAG_PR_DISPLAY_NAME_PREFIX ) );
+ addressee.setSuffix( stringProp( tnefMsg, MAPI_TAG_PR_GENERATION ) );
+
+ addressee.setNickName( stringProp( tnefMsg, MAPI_TAG_PR_NICKNAME ) );
+ addressee.setRole( stringProp( tnefMsg, MAPI_TAG_PR_TITLE ) );
+ addressee.setOrganization( stringProp( tnefMsg, MAPI_TAG_PR_COMPANY_NAME ) );
+ /*
+ the MAPI property ID of this (multiline) )field is unknown:
+ vPart += stringProp(tnefMsg, "\n","NOTE", ... , "" );
+ */
+
+ KABC::Address adr;
+ adr.setPostOfficeBox( stringProp( tnefMsg, MAPI_TAG_PR_HOME_ADDRESS_PO_BOX ) );
+ adr.setStreet( stringProp( tnefMsg, MAPI_TAG_PR_HOME_ADDRESS_STREET ) );
+ adr.setLocality( stringProp( tnefMsg, MAPI_TAG_PR_HOME_ADDRESS_CITY ) );
+ adr.setRegion( stringProp( tnefMsg, MAPI_TAG_PR_HOME_ADDRESS_STATE_OR_PROVINCE ) );
+ adr.setPostalCode( stringProp( tnefMsg, MAPI_TAG_PR_HOME_ADDRESS_POSTAL_CODE ) );
+ adr.setCountry( stringProp( tnefMsg, MAPI_TAG_PR_HOME_ADDRESS_COUNTRY ) );
+ adr.setType(KABC::Address::Home);
+ addressee.insertAddress(adr);
+
+ adr.setPostOfficeBox( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_BUSINESSADDRESSPOBOX ) );
+ adr.setStreet( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_BUSINESSADDRESSSTREET ) );
+ adr.setLocality( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_BUSINESSADDRESSCITY ) );
+ adr.setRegion( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_BUSINESSADDRESSSTATE ) );
+ adr.setPostalCode( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_BUSINESSADDRESSPOSTALCODE ) );
+ adr.setCountry( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_BUSINESSADDRESSCOUNTRY ) );
+ adr.setType( KABC::Address::Work );
+ addressee.insertAddress( adr );
+
+ adr.setPostOfficeBox( stringProp( tnefMsg, MAPI_TAG_PR_OTHER_ADDRESS_PO_BOX ) );
+ adr.setStreet( stringProp(tnefMsg, MAPI_TAG_PR_OTHER_ADDRESS_STREET ) );
+ adr.setLocality( stringProp(tnefMsg, MAPI_TAG_PR_OTHER_ADDRESS_CITY ) );
+ adr.setRegion( stringProp(tnefMsg, MAPI_TAG_PR_OTHER_ADDRESS_STATE_OR_PROVINCE ) );
+ adr.setPostalCode( stringProp(tnefMsg, MAPI_TAG_PR_OTHER_ADDRESS_POSTAL_CODE ) );
+ adr.setCountry( stringProp(tnefMsg, MAPI_TAG_PR_OTHER_ADDRESS_COUNTRY ) );
+ adr.setType( KABC::Address::Dom );
+ addressee.insertAddress(adr);
+
+ // problem: the 'other' address was stored by KOrganizer in
+ // a line looking like the following one:
+ // vPart += "\nADR;TYPE=dom;TYPE=intl;TYPE=parcel;TYPE=postal;TYPE=work;TYPE=home:other_pobox;;other_str1\nother_str2;other_loc;other_region;other_pocode;other_country
+
+ QString nr;
+ nr = stringProp( tnefMsg, MAPI_TAG_PR_HOME_TELEPHONE_NUMBER );
+ addressee.insertPhoneNumber( KABC::PhoneNumber( nr, KABC::PhoneNumber::Home ) );
+ nr = stringProp( tnefMsg, MAPI_TAG_PR_BUSINESS_TELEPHONE_NUMBER );
+ addressee.insertPhoneNumber( KABC::PhoneNumber( nr, KABC::PhoneNumber::Work ) );
+ nr = stringProp( tnefMsg, MAPI_TAG_PR_MOBILE_TELEPHONE_NUMBER );
+ addressee.insertPhoneNumber( KABC::PhoneNumber( nr, KABC::PhoneNumber::Cell ) );
+ nr = stringProp( tnefMsg, MAPI_TAG_PR_HOME_FAX_NUMBER );
+ addressee.insertPhoneNumber( KABC::PhoneNumber( nr, KABC::PhoneNumber::Fax | KABC::PhoneNumber::Home ) );
+ nr = stringProp( tnefMsg, MAPI_TAG_PR_BUSINESS_FAX_NUMBER );
+ addressee.insertPhoneNumber( KABC::PhoneNumber( nr, KABC::PhoneNumber::Fax | KABC::PhoneNumber::Work ) );
+
+ s = tnefMsg->findProp( MAPI_TAG_PR_BIRTHDAY )
+ .replace( QChar( '-' ), QString::null )
+ .replace( QChar( ':' ), QString::null );
+ if( !s.isEmpty() )
+ addressee.setBirthday( QDateTime::fromString( s ) );
+
+ bOk = ( !addressee.isEmpty() );
+ } else if( "IPM.NOTE" == msgClass ) {
+
+ } // else if ... and so on ...
+ }
+ }
+
+ // Compose return string
+ QString iCal = calFormat.toString( &cal );
+ if( !iCal.isEmpty() )
+ // This was an iCal
+ return iCal;
+
+ // Not an iCal - try a vCard
+ KABC::VCardConverter converter;
+ return converter.createVCard( addressee );
+}
+
+
+QString IncidenceFormatter::formatTNEFInvitation( const QByteArray& tnef,
+ Calendar *mCalendar, InvitationFormatterHelper *helper )
+{
+ QString vPart = IncidenceFormatter::msTNEFToVPart( tnef );
+ QString iCal = IncidenceFormatter::formatICalInvitation( vPart, mCalendar, helper );
+ if( !iCal.isEmpty() )
+ return iCal;
+ return vPart;
+}
+
+
+
+
+/*******************************************************************
+ * Helper functions for the Incidence tooltips
+ *******************************************************************/
+
+class IncidenceFormatter::ToolTipVisitor : public IncidenceBase::Visitor
+{
+ public:
+ ToolTipVisitor() : mRichText( true ), mResult( "" ) {}
+
+ bool act( IncidenceBase *incidence, bool richText=true)
+ {
+ mRichText = richText;
+ mResult = "";
+ return incidence ? incidence->accept( *this ) : false;
+ }
+ QString result() const { return mResult; }
+
+ protected:
+ bool visit( Event *event );
+ bool visit( Todo *todo );
+ bool visit( Journal *journal );
+ bool visit( FreeBusy *fb );
+
+ QString dateRangeText( Event*event );
+ QString dateRangeText( Todo *todo );
+ QString dateRangeText( Journal *journal );
+ QString dateRangeText( FreeBusy *fb );
+
+ QString generateToolTip( Incidence* incidence, QString dtRangeText );
+
+ protected:
+ bool mRichText;
+ QString mResult;
+};
+
+QString IncidenceFormatter::ToolTipVisitor::dateRangeText( Event*event )
+{
+ QString ret;
+ QString tmp;
+ if ( event->isMultiDay() ) {
+
+ tmp = "<br>" + i18n("Event start", "<i>From:</i>&nbsp;%1");
+ if (event->doesFloat())
+ ret += tmp.arg( event->dtStartDateStr().replace(" ", "&nbsp;") );
+ else
+ ret += tmp.arg( event->dtStartStr().replace(" ", "&nbsp;") );
+
+ tmp = "<br>" + i18n("Event end","<i>To:</i>&nbsp;%1");
+ if (event->doesFloat())
+ ret += tmp.arg( event->dtEndDateStr().replace(" ", "&nbsp;") );
+ else
+ ret += tmp.arg( event->dtEndStr().replace(" ", "&nbsp;") );
+
+ } else {
+
+ ret += "<br>"+i18n("<i>Date:</i>&nbsp;%1").
+ arg( event->dtStartDateStr().replace(" ", "&nbsp;") );
+ if ( !event->doesFloat() ) {
+ const QString dtStartTime = event->dtStartTimeStr().replace( " ", "&nbsp;" );
+ const QString dtEndTime = event->dtEndTimeStr().replace( " ", "&nbsp;" );
+ if ( dtStartTime == dtEndTime ) { // to prevent 'Time: 17:00 - 17:00'
+ tmp = "<br>" + i18n("time for event, &nbsp; to prevent ugly line breaks",
+ "<i>Time:</i>&nbsp;%1").
+ arg( dtStartTime );
+ } else {
+ tmp = "<br>" + i18n("time range for event, &nbsp; to prevent ugly line breaks",
+ "<i>Time:</i>&nbsp;%1&nbsp;-&nbsp;%2").
+ arg( dtStartTime, dtEndTime );
+ }
+ ret += tmp;
+ }
+
+ }
+ return ret;
+}
+
+QString IncidenceFormatter::ToolTipVisitor::dateRangeText( Todo*todo )
+{
+ QString ret;
+ bool floats( todo->doesFloat() );
+ if (todo->hasStartDate())
+ // No need to add <i> here. This is separated issue and each line
+ // is very visible on its own. On the other hand... Yes, I like it
+ // italics here :)
+ ret += "<br>" + i18n("<i>Start:</i>&nbsp;%1").arg(
+ (floats)
+ ?(todo->dtStartDateStr().replace(" ", "&nbsp;"))
+ :(todo->dtStartStr().replace(" ", "&nbsp;")) ) ;
+ if (todo->hasDueDate())
+ ret += "<br>" + i18n("<i>Due:</i>&nbsp;%1").arg(
+ (floats)
+ ?(todo->dtDueDateStr().replace(" ", "&nbsp;"))
+ :(todo->dtDueStr().replace(" ", "&nbsp;")) );
+ if (todo->isCompleted())
+ ret += "<br>" + i18n("<i>Completed:</i>&nbsp;%1").arg( todo->completedStr().replace(" ", "&nbsp;") );
+ else
+ ret += "<br>" + i18n("%1 % completed").arg(todo->percentComplete());
+
+ return ret;
+}
+
+QString IncidenceFormatter::ToolTipVisitor::dateRangeText( Journal*journal )
+{
+ QString ret;
+ if (journal->dtStart().isValid() ) {
+ ret += "<br>" + i18n("<i>Date:</i>&nbsp;%1").arg( journal->dtStartDateStr( false ) );
+ }
+ return ret;
+}
+
+QString IncidenceFormatter::ToolTipVisitor::dateRangeText( FreeBusy *fb )
+{
+ QString tmp( "<br>" + i18n("<i>Period start:</i>&nbsp;%1") );
+ QString ret = tmp.arg( KGlobal::locale()->formatDateTime( fb->dtStart() ) );
+ tmp = "<br>" + i18n("<i>Period start:</i>&nbsp;%1");
+ ret += tmp.arg( KGlobal::locale()->formatDateTime( fb->dtEnd() ) );
+ return ret;
+}
+
+
+
+bool IncidenceFormatter::ToolTipVisitor::visit( Event *event )
+{
+ mResult = generateToolTip( event, dateRangeText( event ) );
+ return !mResult.isEmpty();
+}
+
+bool IncidenceFormatter::ToolTipVisitor::visit( Todo *todo )
+{
+ mResult = generateToolTip( todo, dateRangeText( todo ) );
+ return !mResult.isEmpty();
+}
+
+bool IncidenceFormatter::ToolTipVisitor::visit( Journal *journal )
+{
+ mResult = generateToolTip( journal, dateRangeText( journal ) );
+ return !mResult.isEmpty();
+}
+
+bool IncidenceFormatter::ToolTipVisitor::visit( FreeBusy *fb )
+{
+ mResult = "<qt><b>" + i18n("Free/Busy information for %1")
+ .arg(fb->organizer().fullName()) + "</b>";
+ mResult += dateRangeText( fb );
+ mResult += "</qt>";
+ return !mResult.isEmpty();
+}
+
+QString IncidenceFormatter::ToolTipVisitor::generateToolTip( Incidence* incidence, QString dtRangeText )
+{
+ if ( !incidence )
+ return QString::null;
+
+ QString tmp = "<qt><b>"+ incidence->summary().replace("\n", "<br>")+"</b>";
+
+ tmp += dtRangeText;
+
+ if (!incidence->location().isEmpty()) {
+ // Put Location: in italics
+ tmp += "<br>"+i18n("<i>Location:</i>&nbsp;%1").
+ arg( incidence->location().replace("\n", "<br>") );
+ }
+ if (!incidence->description().isEmpty()) {
+ QString desc(incidence->description());
+ if (desc.length()>120) {
+ desc = desc.left(120) + "...";
+ }
+ tmp += "<br>----------<br>" + i18n("<i>Description:</i><br>") + desc.replace("\n", "<br>");
+ }
+ tmp += "</qt>";
+ return tmp;
+}
+
+QString IncidenceFormatter::toolTipString( IncidenceBase *incidence, bool richText )
+{
+ ToolTipVisitor v;
+ if ( v.act( incidence, richText ) ) {
+ return v.result();
+ } else
+ return QString::null;
+}
+
+
+
+
+/*******************************************************************
+ * Helper functions for the Incidence tooltips
+ *******************************************************************/
+
+class IncidenceFormatter::MailBodyVisitor : public IncidenceBase::Visitor
+{
+ public:
+ MailBodyVisitor() : mResult( "" ) {}
+
+ bool act( IncidenceBase *incidence )
+ {
+ mResult = "";
+ return incidence ? incidence->accept( *this ) : false;
+ }
+ QString result() const { return mResult; }
+
+ protected:
+ bool visit( Event *event );
+ bool visit( Todo *todo );
+ bool visit( Journal *journal );
+ bool visit( FreeBusy * ) { mResult = i18n("This is a Free Busy Object"); return !mResult.isEmpty(); }
+ protected:
+ QString mResult;
+};
+
+
+static QString mailBodyIncidence( Incidence *incidence )
+{
+ QString body;
+ if ( !incidence->summary().isEmpty() ) {
+ body += i18n("Summary: %1\n").arg( incidence->summary() );
+ }
+ if ( !incidence->organizer().isEmpty() ) {
+ body += i18n("Organizer: %1\n").arg( incidence->organizer().fullName() );
+ }
+ if ( !incidence->location().isEmpty() ) {
+ body += i18n("Location: %1\n").arg( incidence->location() );
+ }
+ return body;
+}
+
+bool IncidenceFormatter::MailBodyVisitor::visit( Event *event )
+{
+ QString recurrence[]= {i18n("no recurrence", "None"),
+ i18n("Minutely"), i18n("Hourly"), i18n("Daily"),
+ i18n("Weekly"), i18n("Monthly Same Day"), i18n("Monthly Same Position"),
+ i18n("Yearly"), i18n("Yearly"), i18n("Yearly")};
+
+ mResult = mailBodyIncidence( event );
+ mResult += i18n("Start Date: %1\n").arg( event->dtStartDateStr() );
+ if ( !event->doesFloat() ) {
+ mResult += i18n("Start Time: %1\n").arg( event->dtStartTimeStr() );
+ }
+ if ( event->dtStart() != event->dtEnd() ) {
+ mResult += i18n("End Date: %1\n").arg( event->dtEndDateStr() );
+ }
+ if ( !event->doesFloat() ) {
+ mResult += i18n("End Time: %1\n").arg( event->dtEndTimeStr() );
+ }
+ if ( event->doesRecur() ) {
+ Recurrence *recur = event->recurrence();
+ // TODO: Merge these two to one of the form "Recurs every 3 days"
+ mResult += i18n("Recurs: %1\n")
+ .arg( recurrence[ recur->recurrenceType() ] );
+ mResult += i18n("Frequency: %1\n")
+ .arg( event->recurrence()->frequency() );
+
+ if ( recur->duration() > 0 ) {
+ mResult += i18n ("Repeats once", "Repeats %n times", recur->duration());
+ mResult += '\n';
+ } else {
+ if ( recur->duration() != -1 ) {
+// TODO_Recurrence: What to do with floating
+ QString endstr;
+ if ( event->doesFloat() ) {
+ endstr = KGlobal::locale()->formatDate( recur->endDate() );
+ } else {
+ endstr = KGlobal::locale()->formatDateTime( recur->endDateTime() );
+ }
+ mResult += i18n("Repeat until: %1\n").arg( endstr );
+ } else {
+ mResult += i18n("Repeats forever\n");
+ }
+ }
+ }
+ QString details = event->description();
+ if ( !details.isEmpty() ) {
+ mResult += i18n("Details:\n%1\n").arg( details );
+ }
+ return !mResult.isEmpty();
+}
+
+bool IncidenceFormatter::MailBodyVisitor::visit( Todo *todo )
+{
+ mResult = mailBodyIncidence( todo );
+
+ if ( todo->hasStartDate() ) {
+ mResult += i18n("Start Date: %1\n").arg( todo->dtStartDateStr() );
+ if ( !todo->doesFloat() ) {
+ mResult += i18n("Start Time: %1\n").arg( todo->dtStartTimeStr() );
+ }
+ }
+ if ( todo->hasDueDate() ) {
+ mResult += i18n("Due Date: %1\n").arg( todo->dtDueDateStr() );
+ if ( !todo->doesFloat() ) {
+ mResult += i18n("Due Time: %1\n").arg( todo->dtDueTimeStr() );
+ }
+ }
+ QString details = todo->description();
+ if ( !details.isEmpty() ) {
+ mResult += i18n("Details:\n%1\n").arg( details );
+ }
+ return !mResult.isEmpty();
+}
+
+bool IncidenceFormatter::MailBodyVisitor::visit( Journal *journal )
+{
+ mResult = mailBodyIncidence( journal );
+ mResult += i18n("Date: %1\n").arg( journal->dtStartDateStr() );
+ if ( !journal->doesFloat() ) {
+ mResult += i18n("Time: %1\n").arg( journal->dtStartTimeStr() );
+ }
+ if ( !journal->description().isEmpty() )
+ mResult += i18n("Text of the journal:\n%1\n").arg( journal->description() );
+ return !mResult.isEmpty();
+}
+
+
+
+QString IncidenceFormatter::mailBodyString( IncidenceBase *incidence )
+{
+ if ( !incidence )
+ return QString::null;
+
+ MailBodyVisitor v;
+ if ( v.act( incidence ) ) {
+ return v.result();
+ }
+ return QString::null;
+}
+
+static QString recurEnd( Incidence *incidence )
+{
+ QString endstr;
+ if ( incidence->doesFloat() ) {
+ endstr = KGlobal::locale()->formatDate( incidence->recurrence()->endDate() );
+ } else {
+ endstr = KGlobal::locale()->formatDateTime( incidence->recurrence()->endDateTime() );
+ }
+ return endstr;
+}
+
+QString IncidenceFormatter::recurrenceString(Incidence * incidence)
+{
+ if ( !incidence->doesRecur() )
+ return i18n( "No recurrence" );
+
+ Recurrence *recur = incidence->recurrence();
+ switch ( recur->recurrenceType() ) {
+ case Recurrence::rNone:
+ return i18n( "No recurrence" );
+ case Recurrence::rMinutely:
+ if ( recur->duration() != -1 )
+ return i18n( "Recurs every minute until %1", "Recurs every %n minutes until %1", recur->frequency() )
+ .arg( recurEnd( incidence ) );
+ return i18n( "Recurs every minute", "Recurs every %n minutes", recur->frequency() );
+ case Recurrence::rHourly:
+ if ( recur->duration() != -1 )
+ return i18n( "Recurs hourly until %1", "Recurs every %n hours until %1", recur->frequency() )
+ .arg( recurEnd( incidence ) );
+ return i18n( "Recurs hourly", "Recurs every %n hours", recur->frequency() );
+ case Recurrence::rDaily:
+ if ( recur->duration() != -1 )
+ return i18n( "Recurs daily until %1", "Recurs every %n days until %1", recur->frequency() )
+ .arg( recurEnd( incidence ) );
+ return i18n( "Recurs daily", "Recurs every %n days", recur->frequency() );
+ case Recurrence::rWeekly:
+ if ( recur->duration() != -1 )
+ return i18n( "Recurs weekly until %1", "Recurs every %n weeks until %1", recur->frequency() )
+ .arg( recurEnd( incidence ) );
+ return i18n( "Recurs weekly", "Recurs every %n weeks", recur->frequency() );
+ case Recurrence::rMonthlyPos:
+ case Recurrence::rMonthlyDay:
+ if ( recur->duration() != -1 )
+ return i18n( "Recurs monthly until %1" ).arg( recurEnd( incidence ) );
+ return i18n( "Recurs monthly" );
+ case Recurrence::rYearlyMonth:
+ case Recurrence::rYearlyDay:
+ case Recurrence::rYearlyPos:
+ if ( recur->duration() != -1 )
+ return i18n( "Recurs yearly until %1" ).arg( recurEnd( incidence ) );
+ return i18n( "Recurs yearly" );
+ default:
+ return i18n( "Incidence recurs" );
+ }
+}
diff --git a/libkcal/incidenceformatter.h b/libkcal/incidenceformatter.h
new file mode 100644
index 00000000..264bbd81
--- /dev/null
+++ b/libkcal/incidenceformatter.h
@@ -0,0 +1,78 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001-2003 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (c) 2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_INCIDENCEFORMATTER_H
+#define KCAL_INCIDENCEFORMATTER_H
+
+#include <qstring.h>
+
+#include "libkcal_export.h"
+
+namespace KCal {
+class Calendar;
+class Incidence;
+class IncidenceBase;
+
+class LIBKCAL_EXPORT InvitationFormatterHelper
+{
+ public:
+ virtual QString generateLinkURL( const QString &id ) { return id; }
+ virtual QString makeLink( const QString &id, const QString &text );
+ virtual Calendar* calendar() const { return 0; }
+};
+
+/**
+ This class is a helper class that provides several static methods to format an Incidence
+ into different formats, like an HTML representation for KMail, a representation for tool tips,
+ or a representation for the event viewer.
+
+ @short methods to format incidences into various formats for displaying them
+*/
+class LIBKCAL_EXPORT IncidenceFormatter
+{
+ public:
+ static QString toolTipString( IncidenceBase *incidence, bool richText = true );
+ static QString mailBodyString( IncidenceBase *incidencebase );
+ static QString extensiveDisplayString( IncidenceBase *incidence );
+
+ static QString formatICalInvitation( QString invitation, Calendar *mCalendar,
+ InvitationFormatterHelper *helper );
+ // Format a TNEF attachment to an HTML mail
+ static QString formatTNEFInvitation( const QByteArray& tnef,
+ Calendar *mCalendar,
+ InvitationFormatterHelper *helper );
+ // Transform a TNEF attachment to an iCal or vCard
+ static QString msTNEFToVPart( const QByteArray& tnef );
+
+ static QString recurrenceString( Incidence *incidence );
+ private:
+ class EventViewerVisitor;
+ class ScheduleMessageVisitor;
+ class InvitationHeaderVisitor;
+ class InvitationBodyVisitor;
+ class IncidenceCompareVisitor;
+ class ToolTipVisitor;
+ class MailBodyVisitor;
+};
+
+}
+
+#endif
diff --git a/libkcal/journal.cpp b/libkcal/journal.cpp
new file mode 100644
index 00000000..febe0c87
--- /dev/null
+++ b/libkcal/journal.cpp
@@ -0,0 +1,44 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "journal.h"
+
+using namespace KCal;
+
+Journal::Journal()
+{
+}
+
+Journal::~Journal()
+{
+}
+
+Journal *Journal::clone()
+{
+ return new Journal( *this );
+}
+
+
+bool Journal::operator==( const Journal& j2 ) const
+{
+ return static_cast<const Incidence&>(*this) == static_cast<const Incidence&>(j2);
+}
+
diff --git a/libkcal/journal.h b/libkcal/journal.h
new file mode 100644
index 00000000..4307c241
--- /dev/null
+++ b/libkcal/journal.h
@@ -0,0 +1,57 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001-2003 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_JOURNAL_H
+#define KCAL_JOURNAL_H
+
+#include "incidence.h"
+#include <kdepimmacros.h>
+
+namespace KCal {
+
+/**
+ This class provides a Journal in the sense of RFC2445.
+*/
+class LIBKCAL_EXPORT Journal : public Incidence
+{
+ public:
+ typedef ListBase<Journal> List;
+
+ Journal();
+ ~Journal();
+ bool accept( Visitor &v ) { return v.visit(this); }
+ bool operator==( const Journal& ) const;
+
+ QCString type() const { return "Journal"; }
+
+ /**
+ Return copy of this Journal. The caller owns the returned object.
+ */
+ Journal *clone();
+
+ private:
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/kcal_manager.desktop b/libkcal/kcal_manager.desktop
new file mode 100644
index 00000000..e606a9d6
--- /dev/null
+++ b/libkcal/kcal_manager.desktop
@@ -0,0 +1,66 @@
+# KDE Config File
+[Desktop Entry]
+Name=Calendar
+Name[af]=Kalender
+Name[ar]=التقويم
+Name[be]=КалÑндар
+Name[bg]=Календар
+Name[br]=Deiziadur
+Name[bs]=Kalendar
+Name[ca]=Calendari
+Name[cs]=Kalendář
+Name[cy]=Calendr
+Name[da]=Kalender
+Name[de]=Kalender
+Name[el]=ΗμεÏολόγιο
+Name[eo]=Kalendaro
+Name[es]=Calendario
+Name[et]=Kalender
+Name[eu]=Egutegia
+Name[fa]=تقویم
+Name[fi]=Kalenteri
+Name[fr]=Calendrier
+Name[fy]=Aginda
+Name[ga]=Féilire
+Name[gl]=Calendario
+Name[he]=לוח שנה
+Name[hi]=कैलेनà¥à¤¡à¤°
+Name[hu]=Naptár
+Name[is]=Dagatal
+Name[it]=Calendario
+Name[ja]=カレンダー
+Name[ka]=კáƒáƒšáƒ”ნდáƒáƒ áƒ˜
+Name[kk]=Күнтізбе
+Name[km]=ប្រážáž·áž‘áž·áž“
+Name[lt]=Kalendorius
+Name[mk]=Календар
+Name[ms]=Kalendar
+Name[nb]=Kalender
+Name[nds]=Kalenner
+Name[ne]=कà¥à¤¯à¤¾à¤²à¥‡à¤¨à¥à¤¡à¤°
+Name[nl]=Agenda
+Name[nn]=Kalender
+Name[pa]=ਕੈਲੰਡਰ
+Name[pl]=Kalendarz
+Name[pt]=Calendário
+Name[pt_BR]=Calendário
+Name[ru]=Календарь
+Name[se]=Kaleandar
+Name[sk]=Kalendár
+Name[sl]=Koledar
+Name[sr]=Календар
+Name[sr@Latn]=Kalendar
+Name[sv]=Kalender
+Name[ta]=நாளà¯à®•à®¾à®Ÿà¯à®Ÿà®¿
+Name[tg]=Тақвим
+Name[th]=บันทึà¸à¸›à¸£à¸°à¸ˆà¸³à¸§à¸±à¸™
+Name[tr]=Takvim
+Name[uk]=Календар
+Name[uz]=Kalendar
+Name[uz@cyrillic]=Календар
+Name[zh_CN]=日历
+Name[zh_TW]=行事曆
+Type=Service
+ServiceTypes=KResources/Manager
+
+X-KDE-ResourceFamily=calendar
diff --git a/libkcal/kcalversion.h b/libkcal/kcalversion.h
new file mode 100644
index 00000000..e0c153f5
--- /dev/null
+++ b/libkcal/kcalversion.h
@@ -0,0 +1,28 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (C) 2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_KCALVERSION_H
+#define KCAL_KCALVERSION_H
+
+#define LIBKCAL_IS_VERSION( a,b,c ) ( LIBKCAL_VERSION >= KDE_MAKE_VERSION(a,b,c) )
+#define LIBKCAL_VERSION KDE_MAKE_VERSION(1,3,0)
+#define LIBKCAL_VERSIONSTR "1.3"
+
+#endif
diff --git a/libkcal/libical/AUTHORS b/libkcal/libical/AUTHORS
new file mode 100644
index 00000000..ce25b7bd
--- /dev/null
+++ b/libkcal/libical/AUTHORS
@@ -0,0 +1,4 @@
+John Gray <gray@agora-net.com>
+Andrea Campi <a.campi@inet.it>
+
+Original author May 1998-December 2001, Eric Busboom <eric@softwarestudio.org>
diff --git a/libkcal/libical/COPYING b/libkcal/libical/COPYING
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/libkcal/libical/COPYING
diff --git a/libkcal/libical/ChangeLog b/libkcal/libical/ChangeLog
new file mode 100644
index 00000000..97d25838
--- /dev/null
+++ b/libkcal/libical/ChangeLog
@@ -0,0 +1,811 @@
+2002-07-09 Andrea Campi <a.campi@inet.it>
+
+ * src/libical/icalcomponent.c
+ * src/libical/icalcomponent.h: Added a check for valid component kind
+ before instancing a new one.
+
+2002-07-08 Andrea Campi <a.campi@inet.it>
+
+ * src/python/Gauge.py
+ * src/python/LibicalWrap.i
+ * src/python/Property.py
+ * src/python/Store.py
+ * src/python/Time.py
+ * src/python/python-binding.txt
+ * src/python/test.py: Updated the python bindings to match the C API
+ changes.
+ Obtained from: Mark Tearle
+
+2002-07-04 Andrea Campi <a.campi@inet.it>
+
+ * src/libical/icalderivedproperty.c.in
+ * src/libical/icalproperty.c
+ * src/libical/icalproperty.h: Added a check for valid property kind
+ before instancing a new one.
+
+ * src/libical/icalvalue.c: Fixed icalvalue_new_clone to properly clone
+ X- properties.
+
+2002-06-28 Andrea Campi <a.campi@inet.it>
+
+ * design-data/parameters.csv
+ * src/libicalss/icalgauge.c
+ * src/libicalss/icalgaugeimpl.h
+ * src/libicalss/icalsslexer.c
+ * src/libicalss/icalsslexer.l
+ * src/libicalss/icalssyacc.c
+ * src/libicalss/icalssyacc.h
+ * src/libicalss/icalssyacc.y: Added IS NULL to icalgauge
+ syntax.
+ Obtained from: Paul Lindner
+
+ * src/libical/icallexer.c
+ * src/libical/icallexer.l
+ * src/libical/icalyacc.c
+ * src/libical/icalyacc.h
+ * src/libical/icalyacc.y: Sent lex/yacc code to Attic.
+
+ * src/libical/icalparameter.c: Changed icalparameter_as_ical_string
+ to also quote the param value if it contains a , (comma), as per RFC2445.
+
+ * src/libicalss/icalset.c
+ * src/libicalss/icalset.h: Added experimental code to support
+ dynamic loading of icalset derived classes.
+
+ * src/libicalss/Makefile.am
+ * src/libicalss/icalspanlist_cxx.cpp
+ * src/libicalss/icalspanlist_cxx.h: Added C++ binding for libicalss.
+ Obtained from: Paul Lindner
+
+2002-06-28 Eric Busboom <eric@softwarestudio.org>
+
+ * src/libical/Makefile.am
+ * src/libical/icalduration.c
+ * src/libical/icalparser.c
+ * src/libical/icalvalue.c
+ * src/libical/icalyacc.c
+ * src/libical/icalyacc.h: removed lex and yacc by writing
+ code to parse UTC-OFFSET
+
+2002-06-27 Andrea Campi <a.campi@inet.it>
+
+ * src/libical/icalcomponent.c
+ * src/libical/icalcomponent.h: Added icalcomponent_foreach_recurrence
+ as a better way of handling recurrences; deprecated
+ icalcomponent_get_span
+ Obtained from: Paul Lindner
+
+ * src/libical/icalderivedvalue.c.in
+ * src/libical/icalvalue.c
+ * src/libical/icalvalue.h: Added a check for valid value kind before
+ instancing a new one.
+ Obtained from: Paul Lindner
+
+ * src/libical/icalproperty.c
+ * src/libical/icalproperty.h: Deprecated icalproperty_remove_parameter,
+ added 3 new functions to do the same in a safer way (wrt X- params).
+ Obtained from: Paul Lindner
+
+ * src/libical/icaltime.c
+ * src/libical/icaltime.h: Added functions to work with time spans.
+ Obtained from: Paul Lindner
+
+2002-06-26 Andrea Campi <a.campi@inet.it>
+
+ * src/libical/icalduration.c: Fixed icaldurationtype_from_int to
+ generate valid RFC2445 durations (it used to mix weeks and other
+ time units).
+
+2002-06-13 Andrea Campi <a.campi@inet.it>
+
+ * src/libical/icalvalue.c: Fixed escaping of TEXT values and
+ formatting of UTCOFFSET values to more closely match RFC2445.
+
+ * configure.in
+ * src/libical/Makefile.am
+ * src/libical/icalparameter_cxx.cpp
+ * src/libical/icalparameter_cxx.h
+ * src/libical/icalproperty_cxx.cpp
+ * src/libical/icalproperty_cxx.h
+ * src/libical/icalvalue_cxx.cpp
+ * src/libical/icalvalue_cxx.h
+ * src/libical/vcomponent.cpp
+ * src/libical/vcomponent.h
+ * src/libicalss/icalbdbset_cxx.h: Added C++ binding.
+ Obtained from: Paul Lindner
+
+ * configure.in
+ * src/libicalss/Makefile.am
+ * src/libicalss/icalbdbset.c
+ * src/libicalss/icalbdbset.h
+ * src/libicalss/icalbdbset.h
+ * src/libicalss/icalbdbsetimpl.h
+ * src/test/Makefile.am
+ * src/test/storage.c: Added BerkeleyDB 4.0 icalset implementation.
+ Obtained from: Paul Lindner
+
+2002-06-11 Andrea Campi <a.campi@inet.it>
+
+ * src/test/Makefile.am
+ * src/test/regression-classify.c
+ * src/test/regression-component.c
+ * src/test/regression-recur.c
+ * src/test/regression-utils.c
+ * src/test/regression.c
+ * src/test/regression.h
+ * src/test/test_fileset.ics: New regression test suite
+ Obtained from: Paul Lindner
+
+ * src/libical/icalcomponent.c
+ * src/libical/icalproperty.c
+ * src/libical/icalproperty.h
+ * src/python/test.py
+ * src/test/regression.c: Improved X- parameter handling.
+ Obtained from: Mark Tearle
+
+2002-06-07 Andrea Campi <a.campi@inet.it>
+
+ * configure.in
+ * src/libical/Makefile.am
+ * src/libical/icallexer.l
+ * src/libical/icalparser.c
+ * src/libical/icalparser.h
+ * src/libical/icalyacc.y
+ * src/libicalss/Makefile.am
+ * src/libicalss/icalgauge.c
+ * src/libicalss/icalsslexer.c
+ * src/libicalss/icalsslexer.l
+ * src/libicalss/icalssyacc.c
+ * src/libicalss/icalssyacc.h
+ * src/libicalss/icalssyacc.y: Made parser fully reentrant using
+ recent versions of flex/bison. Also committed the generated files
+ so that the library can be compiled even without those tools.
+ Obtained from: Paul Lindner
+
+ * src/python/LibicalWrap.i
+ * src/python/Property.py
+ * src/python/test.py: Support X- properties in the Python wrapper.
+ Obtained from: Mark Tearle
+
+2002-06-04 Andrea Campi <a.campi@inet.it>
+
+ * *: Constifed a lot of functions, also made a few of them static
+ Obtained from: Paul Lindner <lindner@inuus.com>
+
+2002-06-03 Andrea Campi <a.campi@inet.it>
+ * src/libical/icallangbind.c
+ * src/python/Component.py
+ * src/python/Gauge.py
+ * src/python/Libical.py
+ * src/python/LibicalWrap.i
+ * src/python/Store.py
+ * src/python/test.py: Fully implemented FileStore and Gauge
+ in the python bindings.
+ Obtained from: Mark Tearle <mtearle@tearle.com>
+
+2002-05-28 Andrea Campi <a.campi@inet.it>
+
+ * src/libical/icalattach.c
+ * src/libical/icalattach.h
+ * src/libical/icalattachimpl.h
+ * src/libical/icalderivedproperty.c.in
+ * src/libical/icalderivedvalue.c.in
+ * src/libical/icalderivedvalue.h.in
+ * src/libical/icaltypes.c
+ * src/libical/icaltypes.h
+ * src/libical/icalvalue.c
+ * src/libical/icalvalueimpl.h: Changed ATTACH to be an opaque type
+
+2002-05-27 Eric Busboom <eric@softwarestudio.org>
+
+ * scripts/mkderivedparameters.pl
+ * scripts/mkderivedproperties.pl
+ * scripts/mkderivedvalues.pl
+ * src/libical/icalderivedparameter.c.in
+ * src/libical/icalderivedparameter.h.in
+ * src/libical/icalderivedproperty.c.in
+ * src/libical/icalderivedproperty.h.in
+ * src/libical/icalderivedvalue.c.in
+ * src/libical/icalderivedvalue.h.in: changed the auto generated
+ files and scripts so that the generated code is inserted into the
+ middle of the template (.in) file, instead of the end. This means
+ we could get rid of the declaration for the maps.
+
+2002-05-27 Andrea Campi <a.campi@inet.it>
+
+ * src/libical/icaltimezone.c: Worked around Outlook/Exchange brokenness.
+ Obtained from: evolution CVS repository
+
+2002-05-24 Andrea Campi <a.campi@inet.it>
+
+ * src/libical/icalproperty.c: Implemented proper RFC2445 folding.
+ Obtained from: evolution CVS repository
+
+ * src/libical/icalrecur.c: Worked around Outlook/Exchange brokenness.
+ Obtained from: evolution CVS repository
+
+
+2002-05-21 Andrea Campi <a.campi@inet.it>
+
+ * src/libical/*: Removed void * in favor of opaque typedef types.
+ This helped uncover a few bugs and made debugging easier.
+ Obtained from: Paul Lindner
+
+2002-05-10 Andrea Campi <a.campi@inet.it>
+
+ * src/libical/icalmemory.c: Made the memory allocator threadsafe.
+ This code is currently conditional on USE_THREAD, but it might
+ become the default in the future.
+ Obtained from: Paul Lindner
+
+ * src/libical/icaltime.c: Implemented icaltime_is_date(), with the
+ intent of removing all direct accesses to is_date.
+
+2002-05-09 Andrea Campi <a.campi@inet.it>
+
+ * icaltime.c Rewrote and documented icaltime API, with the goal of
+ keeping it stable until release 1.0. Some functions and internal
+ implementation details are now declared obsolete and removed from
+ the documentation; they will be removed at a later time.
+
+2001-12-12 Eric Busboom <eric@softwarestudio.org>
+
+ * icalrecur.c implemented recurrence rule for "FREQ=YEARLY",
+ with no BY rules.
+
+2001-12-11 Eric Busboom <eric@softwarestudio.org>
+
+ * icalrecur.c Fixed bug in next_month for MONTHLY rules that have
+ only BYDAY rules. The code would miss valid dates that fell on the
+ first of the month. created new routine is_day_in_byday()
+
+ * icaltime.c Fixed icaltime_from_day_of_year to correctly handle
+ negative and over-range day-of-years
+
+ * icaltime.c collected all instances of leap year code into
+ icaltime_is_leap_year
+
+ * icaltime.c icaltime_day_of_year. Changed an assert into code
+ that advances the year when the day of year is lager than the
+ number of days in the given year
+
+ * icalerrno.c,h Added the function version
+ icalerror_set_errno. Only the define verson existed.
+
+ * icaltime.c Moved all of the getenv/putenv operations into icaltimegm()
+
+2001-06-29 Eric Busboom <eric@softwarestudio.org>
+
+ * icalderivedproperties.h,c Changed the signature if the CLASS
+ property from TEXT to CLASS. ( enum icalproperty_class)
+
+2001-06-22 Eric Busboom <eric@softwarestudio.org>
+
+ * icaltypes.c Fixed bug in icaltriggertype_new_from_string htat
+ caused it to fail.
+
+2001-04-12 Eric Busboom <eric@softwarestudio.org>
+
+ * icalvalue.c Added quoting to apostrophies ("'") in text
+ values. This is not required by the spec, but it is necessary in
+ icallangbind_property_eval_string, since ' is special in both perl
+ and python.
+
+2001-04-10 Eric Busboom <eric@softwarestudio.org>
+
+ * icalvalue.c Added routine icalvalue_reset_kind. This routine is
+ now called by all autogenerated icalvalue_set_*
+ routines. icalvalue_reset_kind() will change the kind of the value
+ based on the data in the value. Currently, it will set a value to
+ either DATETIME or DATE based on the is_date flag of icaltimetype.
+
+2001-04-09 Eric Busboom <eric@softwarestudio.org>
+
+ * icalproperty.h Converted REQUEST-STATUS to use the struct
+ icalreqstat structure instead of a string
+
+2001-04-01 Eric Busboom <eric@softwarestudio.org>
+
+ * icalcomponent.h Changed meaning of
+ icalcomponent_new_from_string. It used to create a new component
+ given the text name of the component type to create. Now it calls
+ icalparser_parse_string to create a new component from the
+ complete iCalendar text representation of the component.
+
+2001-03-31 Eric Busboom <eric@softwarestudio.org>
+
+ * icalvalue Changed ACTION properties to take an ACTION value
+ instead of TEXT. The ACTION value is enumerated.
+
+2001-03-26 Eric Busboom <eric@softwarestudio.org>
+
+ * icalparameter.h icalparameter_rsvp_* routines now take, return
+ ICAL_RSVP_TRUE and ICAL_RSVP_FALSE, not 0 and 1
+
+2001-03-25 Eric Busboom <eric@softwarestudio.org>
+
+ * icalrecur.c Many changes to get YEARLY rules working and fix
+ other errors. Recurrences are stil broken, but more types of rue
+ now work.
+
+2001-03-16 Eric Busboom <eric@softwarestudio.org>
+
+ * icalparameter.c Changed icalparameter_new_from_string() to
+ icalparameter_new_from_value_string(). Created new
+ icalparameter_new_from_string() that takes strings of
+ form"PARAMNAME=PARAMVALUE"
+
+ * *_XNAME changes all _XNAME enumerations to _X
+
+ * derived props, values, parameters. Seperated out derived
+ proeprties, parameters and values into their own files. This makes
+ it easier to auto generate all of the enumerations for values,
+ parameters and proeprties.
+
+ * icalenum.h Major changes to icalenum. Movel all of the
+ icalenum_* values to other modules, and changed the names. Look
+ for #defines in icalenum.h tying the old name to the new
+ name. Also moved all of the enumerations into other files.
+
+
+
+2001-02-26 Eric Busboom <eric@softwarestudio.org>
+
+ * src/libical/icalproperty.c Added
+ icalproperty_set_parameter_from_string and
+ icalproperty_set_value_from_string to aid in binding to Python
+
+2001-02-15 Eric Busboom <eric@softwarestudio.org>
+
+ * design-data/prop-to-value.txt Made a new CSV file,
+ properties.cvs That collects property-to-value and default value
+ information
+
+ * src/libical/icalproperty.{c,h}.in Moved auto generated code into
+ icalderivedproperty.{c,h} and created icalderivedproperty.{c,h}.in
+
+
+
+2001-02-14 JP Rosevear <jpr@ximian.com>
+
+ * src/libical/Makefile.am: Sigh, automake is dumber than i thought
+
+2001-02-12 JP Rosevear <jpr@ximian.com>
+
+ * src/test/Makefile.am: link with the static versions
+
+ * src/python/Makefile.am: use include dir discovered in configure checks
+
+ * src/python/.cvsignore: shush
+
+ * src/libical/icalrestriction.c: remove autogenerated file
+
+ * src/libical/Makefile.am: the generated files are now disted so
+ look for them in the source dir rather than the build dir
+
+ * src/Makefile.am: Only build the python dir if all the configure
+ stuff checked out
+
+ * configure.in: Remove shared library disabling and add a python
+ check and allow for the python bindings to not be built
+
+2001-02-11 Eric Busboom <eric@softwarestudio.org>
+
+ * src/python/Makefile.am Tweaked makefile to use automake more,
+ but it stil isn't quie right.
+
+2001-02-09 JP Rosevear <jpr@ximian.com>
+
+ * Shush cvs
+
+2001-02-09 JP Rosevear <jpr@ximian.com>
+
+ * src/libical/Makefile.am: Slightly over zealous during the merge
+
+2001-02-09 JP Rosevear <jpr@ximian.com>
+
+ * src/libical/Makefile.am: Correct typo
+
+ * Removal of more auto generated files
+
+2001-02-09 JP Rosevear <jpr@ximian.com>
+
+ * Removal of various auto generated files
+
+2001-02-09 JP Rosevear <jpr@ximian.com>
+
+ * src/libical/icalparameter.c.in (icalparameter_new_from_string):
+ its NEEDS-ACTION rather than NEEDSACTION
+ (icalparameter_as_ical_string): ditto
+
+2001-02-09 Eric Busboom <eric@softwarestudio.org>
+
+ * python Added src/python directory. Inserted SWIG wrapper files,
+ and a simple interface to Component, Time, Duration, Period and
+ Store.
+
+ * icallangbind.c More experimental work
+
+ * icalduration.{c,h}, icalperiod.{c,h} Broke out period and
+ duration types into their own files
+
+2001-02-06 Christopher James Lahey <clahey@ximian.com>
+
+ * src/libical/icallangbind.c: Added a missing #include here.
+
+ * src/libical/icalrecur.c (icalrecur_add_bydayrules): Copy the
+ passed in const vals since we change it.
+
+2001-02-06 Eric Busboom <eric@softwarestudio.org>
+
+ * icaltime.c Changed icaltime_from_day_of_year to run mktime in
+ the UTC timezone. This fixed a bug where it would return one day
+ eariler for some timezones.
+
+2001-02-05 Ettore Perazzoli <ettore@ximian.com>
+
+ * src/libical/Makefile.am (COMBINEDHEADERS): `icalvalue.h',
+ `icalparameter.h', `icalproperty.h' and `icalrestriction.h' are
+ created in the builddir so they shouldn't be prefixed with
+ `$(top_builddir)/src/libical'.
+
+2001-01-26 Eric Busboom <eric@softwarestudio.org>
+
+ * icalproperty.c.in Improved icalproperty_as_ical_string() to
+ eliminate the possibility of having a VALUE parameter that does
+ not match the actual kind of value.
+
+ * icalvalue.c.in made icalvalue_*_trigger() and
+ icalvalue_*_datetimeperiod non-autogenerated. These routines were
+ for combined value type -- non standard values that can have more
+ than on standard value type. These non-standard types now delegate
+ to stadard types.
+
+2001-01-24 Eric Busboom <eric@softwarestudio.org>
+
+ * icalfileset.c fixed icalfileset_read-from_file so it will handle
+ lines longer than 80 char properly.
+
+2001-01-23 JP Rosevear <jpr@ximian.com>
+
+ * configure.in: Don't AC_INIT on an autogenerated file that does not
+ exist beforehand
+
+2001-01-23 Eric Busboom <eric@softwarestudio.org>
+
+ * icltime.c Removed all of the _local_ routines and simplified
+ icaltime_utc_offset and icaltime_as_timet
+
+ * regression.c Added tests for triggers and improvements to icaltime.c
+
+ * icaltypes.c Addedd icaltriggertype_from_string and changed
+ icaltriggertype to be a struct
+
+2001-01-22 Eric Busboom <eric@softwarestudio.org>
+
+ * icaltime.c implemented icaldurationtype_from_string to parse the
+ string it self, rather than use lex/yacc
+
+2001-01-15 Eric Busboom <eric@softwarestudio.org>
+
+ * icalfileset.c Many improvements. File locking now works, and so
+ does searching with icalfileset_select()
+
+2001-01-08 Eric Busboom <eric@softwarestudio.org>
+
+ * Makefile.am Remove spaces after -I in several
+ Makefile.am routines.
+
+ * icalset.c removed return statements from some void functions.
+
+ * icalparameter.c.in Added break to default: case that had no
+ body. Compilers on Solaris and Tru64 UNIX complained.
+
+2001-01-02 Eric Busboom <eric@softwarestudio.org>
+
+ * icaltime.c Changed icaldurationtype_from_time and _as_timet to
+ _from_int and _as_int. This is a change interface that may break
+ some code.
+
+ * icalgauge.c icalgaugeimpl.h, icalgauge.h., Rewrote gauge code to
+ use pvl-lists directly, instead of trying to reuse icalcomponent.
+
+2000-12-13 Ettore Perazzoli <ettore@helixcode.com>
+
+ * src/libicalvcal/Makefile.am (INCLUDES): Add
+ `$(top_builddir)/src/libical' to the include directory list.
+
+ * src/libical/Makefile.am (icalparameter.h): Use `$(srcdir)'.
+ (icalparameter.c): Likewise.
+ (icalproperty.h): Likewise.
+ (icalproperty.c): Likewise.
+ (icalvalue.h): Likewise.
+ (icalvalue.c): Likewise.
+ (icalrestriction.c): Likewise.
+ (COMBINEDHEADERS): `icalvalue.h', `icalparameter.h' and
+ `icalproperty.h' are in builddir, not srcdir, so fix the list to
+ use `$(top_builddir)' instead of `$(top_srcdir)'.
+ (all): Removed.
+ (BUILT_SOURCES): Move `ical.h' here instead.
+ (ical.h): Don't depend on `(BUILT_SOURCES)'; this a built source
+ itself.
+
+2000-12-12 Eric Busboom <eric@softwarestudio.org>
+
+ * icalparser.c Addedd support for x-parameters.
+
+ * icalenum.c Fixed icalenum_parameter_type_to_string and
+ icalenum_property_type_to_string to property identify X- parameers
+ and properties.
+
+ * icalparameter.c Fixed icalparameter_as_ical_string to property
+ write out X-Parameters.
+
+
+2000-12-11 Eric Busboom <eric@softwarestudio.org>
+
+ * icalcstp.c added empty bodies to prep_* routines so that shared
+ libraries would build.
+
+2000-12-11 JP Rosevear <jpr@helixcode.com>
+
+ * src/libical/icaltime.c (icaltime_compare_date_only): New
+ function that compares only the dates, not the times as well.
+
+ * src/libical/icaltime.h: Add prototype for the function above.
+
+ * src/libical/icalrecur.h (struct icalrecurrencetype): Correct
+ header documentation.
+
+ * src/libical/icaltypes.c: No longer include <limits.h>.
+
+ * src/libical/icalrecur.c: Likewise.
+
+ * src/libical/icalvalue.c: Likewise.
+
+ * src/libical/icalyacc.y: Likewise.
+
+2000-12-11 Federico Mena Quintero <federico@helixcode.com>
+
+ * configure.in (AC_OUTPUT): Fixed order of generated files to make
+ "make distcheck" work. Turn on AM_MAINTAINER_MODE.
+
+ * src/libical/Makefile.am (EXTRA_DIST): Add icalversion.h.in.
+ (COMBINEDHEADERS): Added paths to make "make distcheck" work.
+ (libical_la_SOURCES): Added headers for distribution in our weird
+ setup.
+
+2000-12-06 Eric Busboom <eric@softwarestudio.org>
+
+ * icaltime.c added icaltime_as_local to convert a UTC time to a
+ local time
+
+ * icaltime.h icaltime.c Removed is_utc argument from
+ icaltime_from_timet
+
+
+2000-11-29 Eric Busboom <eric@softwarestudio.org>
+
+ * icalrecur.c More testing and bug fixes. Many more of the rules
+ in recur.txt work correctly.
+
+2000-11-28 Eric Busboom <eric@softwarestudio.org>
+
+ * icalrecur.c Several changes to extract icalrecur.c from
+ libical. I'd like to make it into a reference impl for recurrence
+ rules. CHanges include moving all of the recurrence type and
+ recurrence enums from icalenum and icaltypes into icalrecur, and
+ adding code to parse recurrence rule strings.
+
+ * icaltime.c Changed icaltime_from_string to parse the string
+ directly. Now icaltime.c has no dependency on icalvalue.c
+
+2000-11-21 Eric Busboom <eric@softwarestudio.org>
+
+ * icalrecur.c Fixed a bug in the increment_* routines that made
+ incrementing by more then 1 insensible. Thanks to Martin Neimeier
+
+2000-11-20 Eric Busboom <eric@softwarestudio.org>
+
+ * icalmessage.c Many routines to create new ical messages.
+
+ * icalspanlist.c Code to generate a list of the busy time f the
+ VEVENTS in a set. Also includes routiens to generate free and busy
+ lists from the spanlist, and to find the next free time after a
+ given time.
+
+ * icalvalue.c The STATUS property now has its own value type,
+ STATUS, which holds the enumeration icalproperty_status.
+
+ * icalrestriction.c Added more restrictions. Now handles mutual
+ and exclusive consitions, and checks for the reight values in
+ STATUS properties
+
+
+2000-11-10 Eric Busboom <eric@softwarestudio.org>
+
+ * icaltypes.c Added routine to create durationtype from string:
+ icaldurationtype_from_string
+
+2000-11-09 Eric Busboom <eric@softwarestudio.org>
+
+ * icalcomponet.c Add sever get/set convienience routines to access
+ and manipulate common component propoerties from the component
+ interface. This eliminates the need to create a lot of temporary
+ variables if you just want to change the start time of and event.
+
+2000-11-06 Eric Busboom <eric@softwarestudio.org>
+
+ * icalcomponent.c Added new routines to icalcomponent:
+ _get_span -- returns the start and end times of the event in UTC
+ _get_first_real_component -- return ref to VTODO, VEVENT or VJOURNAL
+
+ * icalspanlist.c Added new class, icalspanlist, that generates a
+ list of alternating busy and free times from an icalset. The class
+ includes routines to gnerate rfc2445 busy and free lists, and to
+ get the next avaliable busy or free time after a given time.
+
+2000-11-06 Federico Mena Quintero <federico@helixcode.com>
+
+ * src/libical/icalvalue.c (icalvalue_recur_as_ical_string): Handle
+ both the position and weekday in the by_day field.
+
+2000-10-20 Eric Busboom <eric@agony.busboom.org>
+
+ * Const correctness. Added 'const' all over everywhere.
+
+2000-10-19 Eric Busboom <eric@agony.busboom.org>
+
+ * icalproperty, icalparameter, icalvalue .c, .h Changed most
+ instances of char* to const char*
+
+ * icalclassify.h Added multiple include protection
+
+ * icalset.h and others, got rid of parameter named "new"
+
+2000-10-15 Eric Busboom <eric@softwarestudio.org>
+
+ * icalcomponent Added convienience functions for constructing
+ components: icalcomponent_new_vcalendar(), etc.
+
+ * Makefile.am Incorporated build system patch from Federico
+ Quintero. Misc small fixes and cleanup
+
+ * scripts Incorporated auto-gen patch from Frederico. Generated
+ code in libical now uses icalproperty.c.in (etc) instead of
+ editing file icalparoperty.c in place.
+
+ * libical. Changed flex/bison to use the -P/-p options to set
+ ical_yy as a prefix. Removed prefix redefinition from icalyacc.y
+
+2000-10-12 Eric Busboom <eric@softwarestudio.org>
+
+ * icalproperty.c Fixed icalproperty_get_{first,next}_parameter to
+ honor the parameter kind argument
+
+ * icalparameter.c Added, but did not complete, a new version of
+ icalparameters_from_string that does not use the hairy nested
+ case/switch statements of the previous version
+
+
+2000-10-02 Eric Busboom <eric@softwarestudio.org>
+
+ * ical.h ical.h and icalss.h now are concatenations of all of the
+ public headers for their respective libraries. Thus, only ical.h,
+ icalss.h and icalvcal.h need to be installed.
+
+2000-09-11 Eric Busboom <eric@softwarestudio.org>
+
+ * icalvcal.c Added more comments
+
+2000-08-31 JP Rosevear <jpr@helixcode.com>
+
+ * configure.in: Don't list config.h in AC_OUTPUT
+
+2000-08-26 Ettore Perazzoli <ettore@helixcode.com>
+
+ * examples/Makefile.am (INCLUDES): More `$(srcdir)' loving.
+
+ * src/libicalvcal/Makefile.am (INCLUDES): Add `-I
+ $(srcdir)/../libical' for builddir != srcdir loving.
+
+2000-08-25 Christopher James Lahey <clahey@helixcode.com>
+
+ * examples/access_properties_and_parameters.c,
+ src/libicalvcal/vcc.y: Got rid of some warnings.
+
+ * src/libicalvcal/vcc.c: Checking in generated C file.
+
+2000-08-25 Christopher James Lahey <clahey@helixcode.com>
+
+ * src/libical/icalcomponent.c: Fixed an incorrect struct name.
+
+2000-08-25 Peter Williams <peterw@helixcode.com>
+
+ * src/libical/icalcomponent.c (icalcomponent_end_component): Compile fix;
+ use icalerror_check_arg_re so we can return an valid icalcompiter.
+ (icalcomponent_begin_component): Same.
+
+2000-08-24 Federico Mena Quintero <federico@helixcode.com>
+
+ * src/test/Makefile.am: Make it work.
+
+2000-08-04 Eric Busboom <eric@softwarestudio.org>
+
+ * stow.c Changed stow to write data to a file ( icalfileset) not a
+ calendar. Also added MIME parsing capability
+
+ * sspm.c Core of the mime processor. Now handles quoted-printable
+ and base64 encodings
+
+ * icalmime.h New file that parses mime data and returns an
+ icalcomponent that includes all of the parts.
+
+
+2000-07-26 Eric Busboom <eric@softwarestudio.org>
+
+ * icaldirset.h misc bug fixes to get deleting components to work
+
+ * icalcomponent.h Eliminated internal use of _get_first_component
+ and _get_next_component, since these will reset the interal
+ iterators.
+
+2000-07-23 Eric Busboom <eric@softwarestudio.org>
+
+ * icalcomponent.h Added external iterators to icalcomponent for
+ subcomponents: icalcompiter. These are still experimental, but they
+ seem to work OK and have a nice syntax
+
+2000-07-18 Eric Busboom <eric@softwarestudio.org>
+
+ * icalset This is a new "superclass" for icalstore, icalcluster,
+ and others. It merges the interfaces of the old icalstore and
+ icalcluster
+
+ * icalstore.{c,h} CHanged name to icaldirset
+
+ * icalcluster.{c,h} Changed name to icalfileset
+
+
+2000-06-12 Eric Busboom <eric@softwarestudio.org>
+
+ * icalstow.c misc improvements and bug fixes to make it useful.
+
+2000-06-09 Eric Busboom <eric@softwarestudio.org>
+
+ * icalrecur.c More extensive code changes for recurrence rule.
+
+ * icalyacc.y Added support for integers in by day lists
+
+2000-06-01 Eric Busboom <eric@softwarestudio.org>
+
+ * icalrecur.c moved recur code into new files
+
+2000-05-30 Eric Busboom <eric@softwarestudio.org>
+
+ * icaltypes.c Extensive work on code to expand recurences
+
+ * icaltypes.h Changed signature icaltimetype_from_timet to include
+ is_utc flag.
+
+
+2000-03-17 Eric Busboom <eric@softwarestudio.org>
+
+ * icalstore.c Vastly improved icalstore_test.
+
+2000-03-16 Eric Busboom <eric@softwarestudio.org>
+
+ * icalcluster.c Added compile flag (ICAL_SAFESAVES) to switch how
+ icalcluster saves files during commits. When the flag is define,
+ it will write the data to a temorar file and rename the file to
+ the target file.
+
+ * storage.c Added seterate test suite for sotage components
+
+ * icalparser.c Created parser object, implemented line-oriented
+ parsering, and made message oriented parsing work in terms f line
+ oriented parsing.
+
+ * icalparser.c Fixed icalparser_get_line to remove \r in input.
+
+
diff --git a/libkcal/libical/INSTALL b/libkcal/libical/INSTALL
new file mode 100644
index 00000000..b3f195d6
--- /dev/null
+++ b/libkcal/libical/INSTALL
@@ -0,0 +1,24 @@
+Building the library
+--------------------
+
+This distribution is developed on Red Hat Linux 6.0 and usually
+compiles on SunOS 5.6 and FreeBSD 2.27. I have reports of success of
+previous version on MacOS ( with CodeWarrior ) and on UnixWare, but I
+don't know about any other systems.
+
+The library is configured with automake. From the root directory, run
+
+ ./configure
+
+To build all of the Makefiles for your system. If you will be installing the library, you may want to use the --prefix flag to set the directory where the library and header files will be installed.
+
+ ./configure --prefix=/proj/local/
+
+If configure runs fine, run "make" to build the library and
+"make install" to install it.
+
+The current version of libical focuses on creating and
+manipulating iCal objects. With it, you can parse text representations
+of iCal components, add and remove sub-components, properties,
+parameters and values, and print the components back out as strings.
+
diff --git a/libkcal/libical/Makefile.am b/libkcal/libical/Makefile.am
new file mode 100644
index 00000000..baf9fc36
--- /dev/null
+++ b/libkcal/libical/Makefile.am
@@ -0,0 +1,11 @@
+
+KDE_OPTIONS = foreign
+
+EXTRA_DIST = \
+ ChangeLog \
+ README \
+ TEST \
+ TODO
+
+SUBDIRS = doc scripts src zoneinfo
+
diff --git a/libkcal/libical/NEWS b/libkcal/libical/NEWS
new file mode 100644
index 00000000..ad1299b2
--- /dev/null
+++ b/libkcal/libical/NEWS
@@ -0,0 +1,522 @@
+Version 0.24, XX Xxx 2002 ( cvs tag libical-0-24 )
+--------------------------------------------------
+
+**** Incompatibilities with previous version ****
+
+CSTP client/server code has been removed from libicalss.
+Future versions will eventually contain a full CAP 6.0
+client/server implementation.
+
+icalproperty_get_name() is deprecated and will change
+in a future release. Use icalproperty_get_icalproperty_name()
+instead.
+
+icalcomponent_get_span() is deprecated in this release
+because it does not handle recurring events. See
+icalcomponent_foreach_recurrence() for an alternate
+interface.
+
+The icalproperty_remove_parameter() call is deprecated
+because it improperly deals with extended parameters.
+See icalproperty_remove_parameter_by_kind() for a
+compatible call.
+
+Code that deals with the TRANSPARENT property now
+uses enumeration values to get/set values instead of
+strings.
+
+The code for dealing with icalsets was overhauled. You
+will want to use the common icalset_* routines
+directly instead of calling into the icalfileset_* or
+icaldirset_* routines.
+
+A number of routines now expect to be called with
+const arguments. A number of routines now
+return pointers to const data.
+
+
+**** New Features ****
+
+Major cleanup of the time-handling routines. New API is
+available that deals with timezones much more cleanly.
+
+The regression routines in src/test are much cleaner.
+Test runs summarize which tests fail and do not
+immediately abort() like the old set of tests. A
+number of old, commented tests were resurrected.
+
+C++ Interface: New libraries libical_cxx.la and libicalss_cxx.la
+are build when you configure with the --enable-cxx option.
+
+Java Interface: A JNI interface to libical is build when
+you configure with the --enable-java option.
+
+Most of libical is now reentrant and thread safe. The Lex/Yacc
+query parser is pre-built with flex 2.5.8 and bison 1.34. To
+rebuild these files you will need to specify the --with-devel
+option. The --enable-reentrant option also adds the -D_REENTRANT
+flag for systems that require it. The build system attempts to
+add the pthread libraries to support a thread safe memory allocator
+and thread-safe error handling.
+
+A new storage mechanism for Berkeley DB 4.0 was contributed
+by Critical Path. Specify the --with-bdb4 and --with-bdb4-dir
+options to enable.
+
+Embedded code comments are slowly being migrated to be
+doxygen compliant. See http://www.doxygen.org/ for
+more on this wonderful tool.
+
+The code should now compile with non-gcc compilers. Certain
+parts of the autogenerated code were causing problems. The
+code base has also been ported to the windows Visual C
+environment.
+
+
+Version 0.23, 26 Mar 01 ( cvs tag libical-0-23 )
+------------------------------------------------
+
+**** Incompatibilities with previous versions ****
+
+icalparameter_new_rsvp
+icalparameter_get_rsvp
+icalparameter_set_rsvp
+
+ These routines now take and return ICAL_RSVP_TRUE and
+ ICAL_RSVP_FALSE instead of 0 and 1
+
+icalenum_*_to_*
+
+ These routines have been moved to icalproperty, icalparameter
+ or icalvalue
+
+
+
+Python interface: An alpha level python interface is available in
+src/python.
+
+Perl interface: A pre-alpha level interface is available in
+src/Net-ICal-Libical
+
+Code Autogeneration: Converted all of the important files in
+design-data/ to .csv files and improved the code that is generated
+from them. Now all of the enumerations for property, parameters and
+values are generated from thes files, as are the string
+representations for the enumerations. You can add a new property or
+parameter to the system simply by adding a line to the appropriate
+file in design-data/
+
+Recurrences: Improved the recurrence code by fixing bugs in MONTHLY
+recurrences and completely re-implementing expand_year_days() for
+YEARLY recurrences. Hubert V's aided in testing.
+
+Build system: JP Rosevear made several improvements to the build
+system. Now checking out the code from cvs should give to a complete
+but minimal distribution, without any of the autognerated files.
+
+Interface changes: Nearly all of the icalenum routines for converting
+between strings and enumerations have been moved out of icalenum into
+icalproperty, icalparameter and icalvalue. This means that their names
+have changed, although #defines have been added to icalenum.h to map
+back to the old names.
+
+Added src/libical/icllangbind.c that has some functions to make it
+easier to bind libical to other languages.
+
+
+Version 0.22, 15 Jan 01 ( cvs tag libical-0-22)
+----------------------------------------------
+
+Many improvements to the time routines in icaltime.c. I think that
+they actually make sense now. Note that there is an interface change
+with icaltime_from_timet() -- I removed the is_utc parameter, since
+all timet values are in UTC. Use icaltime_from_int() if you really
+want the old interface
+
+Major improvements to icalfileset. icalfileset_select now works and so
+does file locking.
+
+Minor revision to the documentation, but it does include a new section
+on file storage ( icalfileset ) and time ( icaltime.c)
+
+Lots of bug fixes and small patches.
+
+I improved the regression test in src/test/regression.c. It now have
+command line switches to select specific tests ( undocumentated, of
+course ) and more of the tests include asserts, so you can just run it
+without looking at the output. If the test runs without crashing, it
+is mostly OK.
+
+
+
+Version 0.21, 20 Nov 00 ( cvs tag libical-0-21)
+----------------------------------------------
+
+ * icalmessage.c Many routines to create new ical messages.
+
+ * icalspanlist.c Code to generate a list of the busy time f the
+ VEVENTS in a set. Also includes routiens to generate free and busy
+ lists from the spanlist, and to find the next free time after a
+ given time.
+
+ * icalvalue.c The STATUS property now has its own value type,
+ STATUS, which holds the enumeration icalproperty_status.
+
+ * icalrestriction.c Added more restrictions. Now handles mutual
+ and exclusive consitions, and checks for the reight values in
+ STATUS properties
+
+ * icaltypes.c Added routine to create durationtype from string:
+ icaldurationtype_from_string
+
+
+ * icalcomponet.c Add sever get/set convienience routines to access
+ and manipulate common component propoerties from the component
+ interface. This eliminates the need to create a lot of temporary
+ variables if you just want to change the start time of and event.
+
+
+ * icalcomponent.c Added new routines to icalcomponent:
+ _get_span -- returns the start and end times of the event in UTC
+ _get_first_real_component -- return ref to VTODO, VEVENT or VJOURNAL
+
+ * icalspanlist.c Added new class, icalspanlist, that generates a
+ list of alternating busy and free times from an icalset. The class
+ includes routines to gnerate rfc2445 busy and free lists, and to
+ get the next avaliable busy or free time after a given time.
+
+
+Version 0.20D 3 Nov 00
+-----------------------
+
+Many miscelaneous tweaks to the build system
+
+More work to icalclassify.
+
+Aded routines to icaltime.c to convert to and from specific timezones
+in Olsen format ("America/Los_Angeles")
+
+
+Version 0.20 7 Sept 00 (cvs tag libical-0-20 )
+----------------------------------------------
+
+Addedd icalclassify() which looks at a message and determine how to
+process it.
+
+Misc bug fixes and tweaks.
+
+Version 0.19 6 August 00 (cvs tag libical-0-19)
+-----------------------------------------------
+
+Created a MIME parser in icalmime.c. This will take any complex MIME
+encapsulated message and return an icalcomponent with the same
+structure. Each MIME part is represented by a component of type
+X-LIC-MIMEPART.
+
+Added MIME partsing to stow.c
+
+Added external iterators to icalcomponent. See test_iterators() in
+test/regression.c
+
+Refactored icalcluster and icalstore into icalset, icalfileset and
+icaldirset, which have a pseudo inheritance relationship between them.
+
+Fixed more memory leaks.
+
+Version 0.18a 10 June 00 ( cvs tag libical-0-18a )
+-----------------------------------------------
+
+Did the final tweaks to stow.c, a program to recieve and store iMIP
+messages.
+
+
+Version 0.18 10 June 00 ( cvs tag libical-0-18 )
+-----------------------------------------------
+
+Added libicalvcal, which includes the Versit code for parsing vCal
+files and a routine (icalvcal_convert() ) that converts a vCal object
+to an iCal object. The test program is src/test/testvcal.
+
+Added marginally functional recurrence code. The curent code does not
+handle all of the examples in rfc2445 ( which are extracted in
+test-data/recur.txt ) but it can do all of the obvious cases. See the
+test program in src/test/recur.c for an example. In particular, the
+code cannot handle the integer values in BYDAY, nor negative integers
+in BYMONTH or BYMONTHDAY. It also cannot handle BYSETPOS.
+
+Moved some code to the examples directory and improved the comments.
+
+Did a little more work on the documentation in the doc directory. The
+documentation is in LyX source, but there is a text version in
+UsingLibical.txt
+
+
+Version 0.17 15 May 00 (cvs tag libical-0-17 )
+---------------------------------------------
+
+Fixed two bugs that added extraneous '/' to test values
+
+Fixed type in internal string for the COUNTER method
+
+Eliminated a memory leak in icalparser.c
+
+
+Version 0.16a 29 April 00
+----------------------------------------------
+
+Fixed bug in icalvalue_new_from_string that caused METHOD value to
+choke on non standard input.
+
+Fixed a memory leak in icalparser_add_line -- failed to free 'line'
+
+
+Version 0.16 5 April 00 ( cvs tag libical-0-16)
+----------------------------------------------
+
+Now using automake.
+
+Substantial changes to the parser. New interfaces let you parser
+multiple components from a single stream by feading the parser object
+one line at a time.
+
+Added a STRING value type. this type is like TEXT, but does not
+backslash magic characters. It is used in PRODID and REQUEST-STATUS,
+where the '/' and ';' are literal.
+
+Added several convience functions for REQUEST-STATUS to icalenums.c
+
+Addedd a routine to icalcomponent to convert X-LIC errors to
+REQUEST-STATUS return values.
+
+Version 0.15a 5 Mar 00 (cvs tag libical-0-15a)
+---------------------
+
+Experimented with CVS
+
+Fixed icalvalue_set_text to convert escaped characters into the proper
+values.
+
+Other minor code tweaks.
+
+
+Version 0.15 7 Feb 00
+---------------------
+
+Split the storage classess ( icalstore, icalcluster, icalcalendar )
+into a seperate library, libicalss
+
+Implemented restriction checking in file icalrestrictions.c. The
+checking is not complete, but can handle the bulk of the restrictions
+described in RFC 2446.
+
+Created a new value type, METHOD. Changed METHOD property to use the
+new value. The METHOD value uses an enumeration.
+
+
+Version 0.14b
+-------------
+
+Implemented parsing of RECUR values, although it does not handle BYDAY
+specs with numbers.
+
+Fixed error in icalparser_next_line that mangled lines longer than the
+temp buffer (1024 chars.) The temp buffer is now 80 chars, and it can
+handle (apparently) arbitrary length lines
+
+Fixed severe brokenness in a value, but I forgot which one.
+
+Cleaned cruft out of the distribution, so the tarfile is smaller.
+
+
+Version 0.14a 14 Jan 00
+-----------------------
+
+Fixed bug in ROLE parameter -- missing '-' in the text of allowed values
+
+Fixed bug in X-parameters
+
+Version 0.14 11 Jan 00
+----------------------
+
+Fixed wrong value type for TRIGGER property
+
+Added Calendar object. Calendar is an aggregate of two stores and two
+clusters, and can store all of the inforamation associated with a
+calendar.
+
+icalcomponent_add_property and icalcomponent_add_component will
+complain if you try to add a component or property that is already
+part of an other component. The *_free routines wil complain if you try
+to free a linked component or property.
+
+More improvements to error handling.
+
+Parser is much more robust.
+
+Minor memory enhancements.
+
+Regression test runs without memory leaks.
+
+Version 0.13d 21Dec99
+---------------------
+
+Seperated perl interface and library
+
+Added autoconf support
+
+Scripts that generate derived properties, values and parameters now
+change source and header files inline.
+
+Changed icalstore to cluster all components with DTSTART in a month
+into a single file. This should reduce number of file accesses by a
+factor of 60.
+
+Ran code through Purify and fixed memory leaks.
+
+
+Version 0.13 16Nov99
+---------------------
+
+Yet more bug fixes! Yeah!
+
+Added better error handling. The Parser inserts X-LIC-*ERROR
+properties to warn of parsing errors.
+
+The imip source/sink programs in /src/imip is demonstrably functional.
+
+Version 0.12b 17Oct99
+---------------------
+
+More bug fixes, particularily in parse from string routines
+
+ICal::Store is mostly functional
+
+This is version is a checkpoint, not a release.
+
+Version 0.12a 10Oct99
+---------------------
+
+Expanded perl interface:
+ Added 1/2 of Store module
+ Fixed bugs
+ Implemeted get_{first,next}_property
+
+Extended C interface
+ Made get_{first,next}_property work properly
+ Fixed bugs
+
+
+This is version is a checkpoint, not a release.
+
+Version 0.12 27Aug99
+--------------------
+
+Added a rudimentatry perl interface
+
+This is version is a checkpoint, not a release.
+
+
+Version 0.11 11Aug99
+--------------------
+
+Eliminated most use of flex/bison -- all parsing, except for the
+values, is done in C.
+
+Cleaned up memory leaks. Purify claims that I got them all.
+
+Moved all derived component/prop/param/value code ( in .inc / .h
+files) into main files ( icalcomponent.{c,h}, icalproperty.{c,h}, etc/
+)
+
+Implemented *_clone routines.
+
+Fixed a lot of bugs.
+
+Implemented more value types. Still unimplemeneted are BINARY and RECUR
+
+Included MacOS/Code Warior files from Graham Davison
+
+
+Version 0.10 8Jul99
+-------------------
+
+Eliminated shift/reduce and reduce/reduce conflicts in the parser.
+This version is almost feature complete -- it has the basic structure
+for all of the library's functionality, and it will only require
+implementing procedure shells and fixing bugs. I think that all of the
+hard work is done...
+
+Version 0.09a,b 3,7 Jul99
+-------------------------
+
+Various improvements to the parser, added some functionality. The parser code
+is mostly complete, and should be fully functional, except for a horde of
+bugs. Also added support for X-Properties.
+
+Version 0.09 25Jun99
+--------------------
+
+Added a parser in files src/comp/icalitip.{y,l} The lexer is mostly
+functional, but the parser is not.
+
+
+Version 0.08 2Jun99
+--------------------
+
+All files now have MPL licensing
+
+Implement enough of the code to perform some rudimentary testing
+
+
+Version 0.07 14May99
+--------------------
+
+Remove all interfaces that construct object from a string
+
+Moved most code back into comp directory
+
+Implemented C files for most headers -- usecases.c now links.
+
+Many improvements to generation scripts.
+
+
+
+Version 0.06 25Apr99
+--------------------
+
+Expanded distribution to include:
+ Directory structure that can accomodate future expansion
+ Several levels of Makefiles
+ This CHANGES file
+
+Added headers for irip and parse modules
+
+Added several files with design information
+
+Added scripts that I had used to generate much of the ical header code.
+
+Split C headers from CC headers
+
+Added data for iTIP and iCAL component restrictions in restrictions.csv
+
+Version 0.05 11Apr99
+----------------------
+
+Changes to ical headers
+
+ Added derived Property classes.
+
+ Improved the interface to the derived property and parameter classes
+
+ Added derived component classes.
+
+ Created usecases.c and ccusecases.cc to demonstrate use
+
+ C++ interface compile
+
+
+Version 0.04 5Apr99
+-------------------
+
+Version 0.02 30Mar99
+--------------------
diff --git a/libkcal/libical/README b/libkcal/libical/README
new file mode 100644
index 00000000..19a4740e
--- /dev/null
+++ b/libkcal/libical/README
@@ -0,0 +1,102 @@
+
+LIBICAL -- An implementation of basic iCAL protocols
+
+The code and datafiles in this distribution are licensed under the
+Mozilla Public License. See http://www.mozilla.org/NPL/MPL-1.0.html
+for a copy of the license. Alternately, you may use libical under the
+terms of the GNU Library General Public License. See
+http://www.fsf.org/copyleft/lesser.html for a copy of the LGPL.
+
+This dual license ensures that the library can be incorporated into
+both proprietary code and GPL'd programs, and will benefit from
+improvements made by programmers in both realms. I will only accept
+changes into my version of the library if they are similarly
+dual-licensed.
+
+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.
+
+Portions of this distribution are Copyright (c) 1997 Theo de
+Raadt. See the header for src/libical/vsnprintf.c for the full
+copyright statement.
+
+This code is under active development. If you would like to contribute
+to the project, you can contact me, Eric Busboom, at
+eric@softwarestudio.org. The project has a webpage at
+
+ http://softwarestudio.org/libical/index.html
+
+and a mailing list that you can join by sending the following mail:
+
+ ------------
+ To: minimalist@softwarestudio.org
+ Subject: subscribe libical
+ ------------
+
+
+Building the library
+--------------------
+
+This distribution is developed on Red Hat Linux 6.0 and usually
+compiles on SunOS 5.6 and FreeBSD 2.27. I have reports of success of
+previous version on MacOS ( with CodeWarrior ) and on UnixWare, but I
+don't know about any other systems.
+
+The library is configured with automake. IF YOU ARE BUILDING THE
+SOURCE FROM A TARBALL, From the root directory, run
+
+ ./configure
+
+To build all of the Makefiles for your system. If you will be
+installing the library, you may want to use the --prefix flag to set
+the directory where the library and header files will be installed.
+
+ ./configure --prefix=/proj/local/
+
+If configure runs fine, run "make" to build the library and
+"make install" to install it.
+
+Although the distribution uses libtool to generate libraries, it has
+shared libraries turned off by default. To create and install shared
+libraries use:
+
+ ./configure --enable-shared
+
+
+IF YOU ARE BUILDING FROM CVS, there will be no configure file until
+you create one with autogen.sh. YOu can pass configure parameters to
+autogen.sh on the command line.
+
+The current version of libical focuses on creating and
+manipulating iCal objects. With it, you can parse text representations
+of iCal components, add and remove sub-components, properties,
+parameters and values, and print the components back out as strings.
+
+
+Notes for Libical Developers
+-------------------
+
+If you don't want to use gcc as the compiler, and you got the sources
+from CVS, you should set the CC variable to the path to the compiler
+and run "automake --include-deps" to keep automake from using
+gcc-specific automatic dependancy tracking.
+
+ > CC=/pkg/SUNWspro/bin/cc; export CC
+ > automake --include-deps
+ > ./configure --prefix=/proj/local/
+ > make
+
+You will not need to re-run automake unless you got the sources from CVS.
+
+Using the Library
+-----------------
+
+There is rudimentary, unfinished documentation in the /doc directory,
+and annotated examples in /examples and the test code in src/test.
+
+
+
+Eric Busboom
+eric@softwarestudio.org
diff --git a/libkcal/libical/README.zoneinfo b/libkcal/libical/README.zoneinfo
new file mode 100644
index 00000000..57ce26c7
--- /dev/null
+++ b/libkcal/libical/README.zoneinfo
@@ -0,0 +1,44 @@
+To generate our zoneinfo .ics files:
+
+ 1. Download and untar the most recent tzdataXXX.tar.gz package
+ from ftp://elsie.nci.nih.gov/pub/ to the tzdata subdir
+
+ % cd tzdata
+ % wget ftp://elsie.nci.nih.gov/pub/tzdata2007h.tar.gz
+ % cat tzdata2007h.tar.gz | gunzip -c | tar xvf -
+ % rm tzdata2007h.tar.gz
+ % cd ..
+
+ 2. Make sure we have the most recent version of the vzic program
+ which can be found at
+ http://dialspace.dial.pipex.com/prod/dialspace/town/pipexdsl/s/asbm26/vzic
+
+ % wget http://dialspace.dial.pipex.com/prod/dialspace/town/pipexdsl/s/asbm26/vzic/vzic-1.3.tgz
+ % cat vzic-1.3.tgz | gunzip -c | tar xvf -
+ % rm vzic-1.3.tgz
+
+ 3. Configure and build vzic
+
+ % cd vzic-1.3
+ % vi Makefile
+
+ make the following changes:
+ OLSON_DIR = ../tzdata
+ PRODUCT_ID = -//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+ TZID_PREFIX = /kde.org/Olson_%D_1/
+
+ % make
+ % cd ..
+
+ 4. Do it!
+
+ % cd vzic-1.3
+ % ./vzic --pure --output-dir ../zoneinfo
+
+ 5. Cleanup
+
+ % make clean
+
+ 6. Commit new tzdata and vzic, if necessary
+
+ 7. Commit new zoneinfo
diff --git a/libkcal/libical/TEST b/libkcal/libical/TEST
new file mode 100644
index 00000000..786ce3ce
--- /dev/null
+++ b/libkcal/libical/TEST
@@ -0,0 +1,4 @@
+
+Parser Tests
+------------
+Use iCAL keywords as first words of unquoted strings
diff --git a/libkcal/libical/THANKS b/libkcal/libical/THANKS
new file mode 100644
index 00000000..d795eeca
--- /dev/null
+++ b/libkcal/libical/THANKS
@@ -0,0 +1,69 @@
+Thanks to:
+
+Allan Clark <allanc@atlas.platypus.bc.ca> for testing libical against
+UnixWare.
+
+Graham Davison <g.m.davison@computer.org> for MacOS support and
+miscelaneous code bits
+
+Seth Alves <alves@hungry.com> for the first cut at the Makefile.am
+files and various utility functions.
+
+Russ Steinthal <rms39@columbia.edu> for several utility functions and
+comments.
+
+Ola Lundqvist <olalu526@student.liu.se> for the vCal test data file.
+
+Colin DuPlantis <colin@cp.net> for new functions in icalparser.c
+
+Holger Schmidt <hschmidt@chronolabs.de> for all of icalcstp.c, The
+CSTP protocol implementation, and modifications to icalcstp.h
+
+Gisle Hannemyr <gisle@oslonett.no> The decode*() functions in sspm.c
+are based on the decode() routine in the mimelite program, Copyright
+(c) 1994 Gisle Hannemyr.
+
+The Evolution team at Helixcode ( Federico Mena Quintero
+<federico@helixcode.com>, JP Rosevear <jpr@helixcode.com>, Ettore
+Perazzoli <ettore@helixcode.com>, Christopher James Lahey
+<clahey@helixcode.com>, Peter Williams <peterw@helixcode.com>) for
+miscelaneous patches and adjustments to the build system.
+
+Cornelius Schumacher <schumacher@kde.org> for many insightful
+suggestions and a few patches.
+
+Mark D. Anderson <mda@discerning.com> for discussions and ideas.
+
+Martin Neimeier <nei@ibn.de> for correcting bugs in icalrecur.c
+
+Tom Leitner <tom@radar.tu-graz.ac.at> For several bug fixes in
+compiling on Tru64 UNIX.
+
+Patrick Lewis <plewis@inetarena.com> for several bug reports and
+substantial ( co-authorship) contributions to the Python bindings
+
+Larry W. Virden <lvirden@cas.org> for several bug reports in compiling
+on Solaris.
+
+Bryan Bartone <bsb@mesasys.com> for code changes based on porting
+libical to Windows.
+
+Hubert V <hubertv@bigfoot.com> for checking and analyzing the output
+of the recurrence rule system.
+
+Jonathan Yue <jonathan.yue@cp.net> for icalproperty_get_name()
+
+Jeff Mace <jhm18@psu.edu> for finding bugs in gauges.
+
+John Gray <gray@agora-net.com> for routing memory leaks, porting to
+WIN32, and taking over leadership of the project.
+
+Andrea Campi <a.campi@inet.it> for miscellaneous updates and beginning
+of Doxygen documentation.
+
+Paul Lindner <plindner@cp.net> for several contributions, including
+C++ binding, reentrant parser, thread safe memory allocator, and a
+lot of documentation.
+
+Mark Tearle <mtearle@tearle.com> for keeping the Python bindings up
+to date.
diff --git a/libkcal/libical/TODO b/libkcal/libical/TODO
new file mode 100644
index 00000000..f707c2a5
--- /dev/null
+++ b/libkcal/libical/TODO
@@ -0,0 +1,39 @@
+
+TODOs for libical
+-----------------
+
+libical treats properties with multiple values incorrecty -- it always
+seperates multiple values into multiple properties. This is not
+acceptable for CATEGORIES and RESOURCES.
+
+Some TEXT valued properties, like METHOD, have a limited set of valid
+values. The code should check that the values of these properites are
+valid. ( Although METHOD now uses enums, and is not really TEXT valued )
+
+Finish implementing values
+ ATTACH/BINARY
+ content_type
+ language
+
+Check for buffer overflow on external input.
+
+Error Handling
+
+ Dates and times: the parser will accept many illegal date time
+ values
+
+RECUR values ignore integers in BYDAY clauses, ie 'FREQ=MONTHLY;BYDAY=-1SU'
+
+Restrictions code does not catch lack of DTEND or DURATION
+
+For some value types, if there illegal characters in the value ( like
+4.56 in an integer value), the parser will output the characters to
+stdout.
+
+Check all uses of strcpy and sprinf for buffer overflows
+
+Make the mime parsing code in sspm grow the list of parts as needed,
+rather than having a hard limit.
+
+in sspm.c, and unrecognized content-transfer-encoding values must
+force a content type of application/octet-stream.
diff --git a/libkcal/libical/configure.in.in b/libkcal/libical/configure.in.in
new file mode 100644
index 00000000..79aafbc3
--- /dev/null
+++ b/libkcal/libical/configure.in.in
@@ -0,0 +1,20 @@
+dnl Checks for programs.
+AC_PROG_YACC
+AM_PROG_LEX
+
+AC_CHECK_PROGS(PERL, perl5 perl)
+
+AC_DEFINE(ICAL_SAFESAVES,1, [safe saves])
+AC_DEFINE(ICAL_UNIX_NEWLINE,1, [unix newline])
+
+AC_CHECK_HEADERS(time.h sys/types.h assert.h)
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+AC_TYPE_SIZE_T
+AC_STRUCT_TM
+AM_PROG_LEX
+
+dnl Checks for library functions.
+AC_CHECK_FUNCS(strdup)
+
diff --git a/libkcal/libical/design-data/Makefile.am b/libkcal/libical/design-data/Makefile.am
new file mode 100644
index 00000000..8f27cd6c
--- /dev/null
+++ b/libkcal/libical/design-data/Makefile.am
@@ -0,0 +1,6 @@
+EXTRA_DIST =\
+ properties.csv \
+ parameters.csv \
+ restrictions.csv \
+ status.txt \
+ value-types.csv
diff --git a/libkcal/libical/design-data/parameters.csv b/libkcal/libical/design-data/parameters.csv
new file mode 100644
index 00000000..56cae99d
--- /dev/null
+++ b/libkcal/libical/design-data/parameters.csv
@@ -0,0 +1,25 @@
+"#Name ","C Type","Enumeration Values"
+"ALTREP","const char*",
+"CHARSET","const char*",
+"CN","const char*",
+"CUTYPE","icalparameter_cutype","INDIVIDUAL;GROUP;RESOURCE;ROOM;UNKNOWN"
+"DELEGATED-FROM","const char*",
+"DELEGATED-TO","const char*",
+"DIR","const char*",
+"ENCODING","icalparameter_encoding","8BIT;BASE64"
+"FBTYPE","icalparameter_fbtype","FREE;BUSY;BUSYUNAVAILABLE;BUSYTENTATIVE"
+"FMTTYPE","const char*",
+"LANGUAGE","const char*",
+"MEMBER","const char*",
+"PARTSTAT","icalparameter_partstat","NEEDS-ACTION;ACCEPTED;DECLINED;TENTATIVE;DELEGATED;COMPLETED;INPROCESS"
+"RANGE","icalparameter_range","THISANDPRIOR;THISANDFUTURE"
+"RELATED","icalparameter_related","START;END"
+"RELTYPE","icalparameter_reltype","PARENT;CHILD;SIBLING"
+"ROLE","icalparameter_role","CHAIR;REQ-PARTICIPANT;OPT-PARTICIPANT;NON-PARTICIPANT"
+"RSVP","icalparameter_rsvp","TRUE;FALSE"
+"SENT-BY","const char*",
+"TZID","const char*",
+"VALUE","icalparameter_value","BINARY;BOOLEAN;DATE;DURATION;FLOAT;INTEGER;PERIOD;RECUR;TEXT;URI;ERROR;DATE-TIME;UTC-OFFSET;CAL-ADDRESS"
+"X","const char*",
+"X-LIC-ERRORTYPE","icalparameter_xlicerrortype","COMPONENT-PARSE-ERROR;PROPERTY-PARSE-ERROR;PARAMETER-NAME-PARSE-ERROR;PARAMETER-VALUE-PARSE-ERROR;VALUE-PARSE-ERROR;INVALID-ITIP;UNKNOWN-VCAL-PROP-ERROR;MIME-PARSE-ERROR;VCAL-PROP-PARSE-ERROR"
+"X-LIC-COMPARETYPE","icalparameter_xliccomparetype","EQUAL;NOTEQUAL;LESS;GREATER;LESSEQUAL;GREATEREQUAL;REGEX;ISNULL;ISNOTNULL"
diff --git a/libkcal/libical/design-data/properties.csv b/libkcal/libical/design-data/properties.csv
new file mode 100644
index 00000000..57b837b8
--- /dev/null
+++ b/libkcal/libical/design-data/properties.csv
@@ -0,0 +1,78 @@
+,,
+"#Property Name","libical Value type","iCalendar default value"
+"ACTION","ACTION","ACTION"
+"ALLOW-CONFLICT","TEXT","TEXT"
+"ATTACH","ATTACH","URI"
+"ATTENDEE","CAL-ADDRESS","CAL-ADDRESS"
+"CALSCALE","TEXT","TEXT"
+"CATEGORIES","TEXT","TEXT"
+"CALID","TEXT","TEXT"
+"CARID","TEXT","TEXT"
+"CLASS","CLASS","CLASS"
+"COMMENT","TEXT","TEXT"
+"COMPLETED","DATE-TIME","DATE-TIME"
+"CONTACT","TEXT","TEXT"
+"CREATED","DATE-TIME","DATE-TIME"
+"DECREED","TEXT","TEXT"
+"DEFAULT-CHARSET","TEXT","TEXT"
+"DEFAULT-LOCALE","TEXT","TEXT"
+"DEFAULT-TZID","TEXT","TEXT"
+"DESCRIPTION","TEXT","TEXT"
+"DTEND","DATE-TIME","DATE-TIME"
+"DTSTAMP","DATE-TIME","DATE-TIME"
+"DTSTART","DATE-TIME","DATE-TIME"
+"DUE","DATE-TIME","DATE-TIME"
+"DURATION","DURATION","DURATION"
+"EXDATE","DATE-TIME","DATE-TIME"
+"EXRULE","RECUR","RECUR"
+"FREEBUSY","PERIOD","PERIOD"
+"GEO","GEO","GEO"
+"LAST-MODIFIED","DATE-TIME","DATE-TIME"
+"LOCATION","TEXT","TEXT"
+"METHOD","METHOD","METHOD"
+"ORGANIZER","CAL-ADDRESS","CAL-ADDRESS"
+"OWNER","TEXT","TEXT"
+"PERCENT-COMPLETE","INTEGER","INTEGER"
+"PRIORITY","INTEGER","INTEGER"
+"PRODID","TEXT","TEXT"
+"RDATE","DATE-TIME-PERIOD","DATE-TIME"
+"RECURRENCE-ID","DATE-TIME","DATE-TIME"
+"RELATED-TO","TEXT","TEXT"
+"RELCALID","TEXT","TEXT"
+"REPEAT","INTEGER","INTEGER"
+"REQUEST-STATUS","REQUEST-STATUS","REQUEST-STATUS"
+"RESOURCES","TEXT","TEXT"
+"RRULE","RECUR","RECUR"
+"SEQUENCE","INTEGER","INTEGER"
+"STATUS","STATUS","STATUS"
+"SUMMARY","TEXT","TEXT"
+"TRANSP","TRANSP","TRANSP"
+"TRIGGER","TRIGGER","DURATION"
+"TZID","TEXT","TEXT"
+"TZNAME","TEXT","TEXT"
+"TZOFFSETFROM","UTC-OFFSET","UTC-OFFSET"
+"TZOFFSETTO","UTC-OFFSET","UTC-OFFSET"
+"TZURL","URI","URI"
+"UID","TEXT","TEXT"
+"URL","URI","URI"
+"VERSION","TEXT","TEXT"
+"X","X","X"
+"SCOPE","TEXT","TEXT"
+"MAXRESULTS","INTEGER","INTEGER"
+"MAXRESULTSSIZE","INTEGER","INTEGER"
+"QUERY","QUERY","QUERY"
+"QUERYNAME","TEXT","TEXT"
+"EXPAND","INTEGER","INTEGER"
+"TARGET","CAL-ADDRESS","CAL-ADDRESS"
+"X-LIC-ERROR","TEXT","TEXT"
+"X-LIC-CLUSTERCOUNT","STRING","STRING"
+"X-LIC-MIMECONTENTTYPE","STRING","STRING"
+"X-LIC-MIMECHARSET","STRING","STRING"
+"X-LIC-MIMEENCODING","STRING","STRING"
+"X-LIC-MIMEOPTINFO","STRING","STRING"
+"X-LIC-MIMECID","STRING","STRING"
+"X-LIC-MIMEFILENAME","STRING","STRING"
+"CALMASTER","TEXT","TEXT"
+"X-LIC-CLASS","X-LIC-CLASS","X-LIC-CLASS"
+"ANY","NO","NO"
+"NO","NO","NO"
diff --git a/libkcal/libical/design-data/restrictions.csv b/libkcal/libical/design-data/restrictions.csv
new file mode 100644
index 00000000..bded8506
--- /dev/null
+++ b/libkcal/libical/design-data/restrictions.csv
@@ -0,0 +1,1420 @@
+# Method, Target component, Property, Sub-component, Restriction
+PUBLISH,VEVENT,NONE,NONE,ONEPLUS
+PUBLISH,VEVENT,DTSTAMP,NONE,ONE
+PUBLISH,VEVENT,DTSTART,NONE,ONE
+PUBLISH,VEVENT,ORGANIZER,NONE,ONE
+PUBLISH,VEVENT,SUMMARY,NONE,ONE
+PUBLISH,VEVENT,UID,NONE,ONE
+PUBLISH,VEVENT,RECURRENCEID,NONE,ZEROORONE,must_be_recurring
+PUBLISH,VEVENT,SEQUENCE,NONE,ZEROORONE
+PUBLISH,VEVENT,ATTACH,NONE,ZEROPLUS
+PUBLISH,VEVENT,CATEGORIES,NONE,ZEROPLUS #Non-standard
+PUBLISH,VEVENT,CLASS,NONE,ZEROORONE
+PUBLISH,VEVENT,COMMENT,NONE,ZEROORONE
+PUBLISH,VEVENT,CONTACT,NONE,ZEROPLUS
+PUBLISH,VEVENT,CREATED,NONE,ZEROORONE
+PUBLISH,VEVENT,DESCRIPTION,NONE,ZEROORONE
+PUBLISH,VEVENT,DTEND,NONE,ONEEXCLUSIVE,no_duration
+PUBLISH,VEVENT,DURATION,NONE,ONEEXCLUSIVE,no_dtend
+PUBLISH,VEVENT,EXDATE,NONE,ZEROPLUS
+PUBLISH,VEVENT,EXRULE,NONE,ZEROPLUS
+PUBLISH,VEVENT,GEO,NONE,ZEROORONE
+PUBLISH,VEVENT,LASTMODIFIED,NONE,ZEROORONE
+PUBLISH,VEVENT,LOCATION,NONE,ZEROORONE
+PUBLISH,VEVENT,PRIORITY,NONE,ZEROORONE
+PUBLISH,VEVENT,RDATE,NONE,ZEROPLUS
+PUBLISH,VEVENT,RELATEDTO,NONE,ZEROPLUS
+PUBLISH,VEVENT,RESOURCES,NONE,ZEROORONE
+PUBLISH,VEVENT,RRULE,NONE,ZEROPLUS
+PUBLISH,VEVENT,STATUS,NONE,ZEROORONE,may_be_tent_conf_cancel
+PUBLISH,VEVENT,TRANSP,NONE,ZEROORONE
+PUBLISH,VEVENT,URL,NONE,ZEROORONE
+PUBLISH,VEVENT,X,NONE,ZEROPLUS
+PUBLISH,VEVENT,ATTENDEE,NONE,ZERO
+PUBLISH,VEVENT,REQUESTSTATUS,NONE,ZERO
+PUBLISH,VEVENT,NONE,VALARM,ZEROPLUS
+PUBLISH,VEVENT,NONE,VFREEBUSY,ZERO
+PUBLISH,VEVENT,NONE,VJOURNAL,ZERO
+PUBLISH,VEVENT,NONE,VTODO,ZERO
+PUBLISH,VEVENT,NONE,VTIMEZONE,ZEROPLUS,must_if_tz_ref
+PUBLISH,VEVENT,NONE,X,ZEROPLUS
+PUBLISH,VEVENT,RELCALID,NONE,ZEROORONE
+REQUEST,VEVENT,NONE,NONE,ONEPLUS
+REQUEST,VEVENT,ATTENDEE,NONE,ONEPLUS
+REQUEST,VEVENT,DTSTAMP,NONE,ONE
+REQUEST,VEVENT,DTSTART,NONE,ONE
+REQUEST,VEVENT,ORGANIZER,NONE,ONE
+REQUEST,VEVENT,SEQUENCE,NONE,ZEROORONE
+REQUEST,VEVENT,SUMMARY,NONE,ONE
+REQUEST,VEVENT,UID,NONE,ONE
+REQUEST,VEVENT,ATTACH,NONE,ZEROPLUS
+REQUEST,VEVENT,CATEGORIES,NONE,ZEROPLUS #Non-standard
+REQUEST,VEVENT,CLASS,NONE,ZEROORONE
+REQUEST,VEVENT,COMMENT,NONE,ZEROORONE
+REQUEST,VEVENT,CONTACT,NONE,ZEROPLUS
+REQUEST,VEVENT,CREATED,NONE,ZEROORONE
+REQUEST,VEVENT,DESCRIPTION,NONE,ZEROORONE
+REQUEST,VEVENT,DTEND,NONE,ONEEXCLUSIVE,no_duration
+REQUEST,VEVENT,DURATION,NONE,ONEEXCLUSIVE,no_dtend
+REQUEST,VEVENT,EXDATE,NONE,ZEROPLUS
+REQUEST,VEVENT,EXRULE,NONE,ZEROPLUS
+REQUEST,VEVENT,GEO,NONE,ZEROORONE
+REQUEST,VEVENT,LASTMODIFIED,NONE,ZEROORONE
+REQUEST,VEVENT,LOCATION,NONE,ZEROORONE
+REQUEST,VEVENT,PRIORITY,NONE,ZEROORONE
+REQUEST,VEVENT,RDATE,NONE,ZEROPLUS
+REQUEST,VEVENT,RECURRENCEID,NONE,ZEROORONE,must_be_recurring
+REQUEST,VEVENT,RELATEDTO,NONE,ZEROPLUS
+REQUEST,VEVENT,REQUESTSTATUS,NONE,ZEROPLUS
+REQUEST,VEVENT,RESOURCES,NONE,ZEROORONE
+REQUEST,VEVENT,RRULE,NONE,ZEROPLUS
+REQUEST,VEVENT,STATUS,NONE,ZEROORONE,may_be_tent_conf
+REQUEST,VEVENT,TRANSP,NONE,ZEROORONE
+REQUEST,VEVENT,URL,NONE,ZEROORONE
+REQUEST,VEVENT,X,NONE,ZEROPLUS
+REQUEST,VEVENT,NONE,VALARM,ZEROPLUS
+REQUEST,VEVENT,NONE,VTIMEZONE,ZEROPLUS,must_if_tz_ref
+REQUEST,VEVENT,NONE,X,ZEROPLUS
+REQUEST,VEVENT,NONE,VFREEBUSY,ZERO
+REQUEST,VEVENT,NONE,VJOURNAL,ZERO
+REQUEST,VEVENT,NONE,VTODO,ZERO
+REQUEST,VEVENT,RELCALID,NONE,ZEROORONE
+REPLY,VEVENT,NONE,NONE,ONEPLUS
+REPLY,VEVENT,ATTENDEE,NONE,ONE
+REPLY,VEVENT,DTSTAMP,NONE,ONE
+REPLY,VEVENT,ORGANIZER,NONE,ONE
+REPLY,VEVENT,RECURRENCEID,NONE,ZEROORONE,must_be_recurring
+REPLY,VEVENT,UID,NONE,ONE
+REPLY,VEVENT,SEQUENCE,NONE,ZEROORONE
+REPLY,VEVENT,ATTACH,NONE,ZEROPLUS
+REPLY,VEVENT,CATEGORIES,NONE,ZEROPLUS #Non-standard
+REPLY,VEVENT,CLASS,NONE,ZEROORONE
+REPLY,VEVENT,COMMENT,NONE,ZEROORONE
+REPLY,VEVENT,CONTACT,NONE,ZEROPLUS
+REPLY,VEVENT,CREATED,NONE,ZEROORONE
+REPLY,VEVENT,DESCRIPTION,NONE,ZEROORONE
+REPLY,VEVENT,DTEND,NONE,ONEEXCLUSIVE,no_duration
+REPLY,VEVENT,DTSTART,NONE,ZEROORONE
+REPLY,VEVENT,DURATION,NONE,ONEEXCLUSIVE,no_dtend
+REPLY,VEVENT,EXDATE,NONE,ZEROPLUS
+REPLY,VEVENT,EXRULE,NONE,ZEROPLUS
+REPLY,VEVENT,GEO,NONE,ZEROORONE
+REPLY,VEVENT,LASTMODIFIED,NONE,ZEROORONE
+REPLY,VEVENT,LOCATION,NONE,ZEROORONE
+REPLY,VEVENT,PRIORITY,NONE,ZEROORONE
+REPLY,VEVENT,RDATE,NONE,ZEROPLUS
+REPLY,VEVENT,RELATEDTO,NONE,ZEROPLUS
+REPLY,VEVENT,RESOURCES,NONE,ZEROORONE
+REPLY,VEVENT,REQUESTSTATUS,NONE,ZEROPLUS
+REPLY,VEVENT,RRULE,NONE,ZEROPLUS
+REPLY,VEVENT,STATUS,NONE,ZEROORONE
+REPLY,VEVENT,SUMMARY,NONE,ZEROORONE
+REPLY,VEVENT,TRANSP,NONE,ZEROORONE
+REPLY,VEVENT,URL,NONE,ZEROORONE
+REPLY,VEVENT,X,NONE,ZEROPLUS
+REPLY,VEVENT,NONE,VTIMEZONE,ZEROORONE,must_if_tz_ref
+REPLY,VEVENT,NONE,X,ZEROPLUS
+REPLY,VEVENT,NONE,VALARM,ZERO
+REPLY,VEVENT,NONE,VFREEBUSY,ZERO
+REPLY,VEVENT,NONE,VJOURNAL,ZERO
+REPLY,VEVENT,NONE,VTODO,ZERO
+REPLY,VEVENT,RELCALID,NONE,ZEROORONE
+ADD,VEVENT,NONE,NONE,ONE
+ADD,VEVENT,DTSTAMP,NONE,ONE
+ADD,VEVENT,DTSTART,NONE,ONE
+ADD,VEVENT,ORGANIZER,NONE,ONE
+ADD,VEVENT,SEQUENCE,NONE,ONE
+ADD,VEVENT,SUMMARY,NONE,ONE
+ADD,VEVENT,UID,NONE,ONE
+ADD,VEVENT,ATTACH,NONE,ZEROPLUS
+ADD,VEVENT,ATTENDEE,NONE,ZEROPLUS
+ADD,VEVENT,CATEGORIES,NONE,ZEROPLUS #Non-standard
+ADD,VEVENT,CLASS,NONE,ZEROORONE
+ADD,VEVENT,COMMENT,NONE,ZEROORONE
+ADD,VEVENT,CONTACT,NONE,ZEROPLUS
+ADD,VEVENT,CREATED,NONE,ZEROORONE
+ADD,VEVENT,DESCRIPTION,NONE,ZEROORONE
+ADD,VEVENT,DTEND,NONE,ONEEXCLUSIVE,no_duration
+ADD,VEVENT,DURATION,NONE,ONEEXCLUSIVE,no_dtend
+ADD,VEVENT,EXDATE,NONE,ZEROPLUS
+ADD,VEVENT,EXRULE,NONE,ZEROPLUS
+ADD,VEVENT,GEO,NONE,ZEROORONE
+ADD,VEVENT,LASTMODIFIED,NONE,ZEROORONE
+ADD,VEVENT,LOCATION,NONE,ZEROORONE
+ADD,VEVENT,PRIORITY,NONE,ZEROORONE
+ADD,VEVENT,RDATE,NONE,ZEROPLUS
+ADD,VEVENT,RELATEDTO,NONE,ZEROPLUS
+ADD,VEVENT,RESOURCES,NONE,ZEROORONE
+ADD,VEVENT,RRULE,NONE,ZEROPLUS
+ADD,VEVENT,STATUS,NONE,ZEROORONE,may_be_tent_conf
+ADD,VEVENT,TRANSP,NONE,ZEROORONE
+ADD,VEVENT,URL,NONE,ZEROORONE
+ADD,VEVENT,X,NONE,ZEROPLUS
+ADD,VEVENT,RECURRENCEID,NONE,ZERO,must_be_recurring
+ADD,VEVENT,REQUESTSTATUS,NONE,ZERO
+ADD,VEVENT,NONE,VALARM,ZEROPLUS
+ADD,VEVENT,NONE,VTIMEZONE,ZEROPLUS,must_if_tz_ref
+ADD,VEVENT,NONE,X,ZEROPLUS
+ADD,VEVENT,NONE,VFREEBUSY,ZERO
+ADD,VEVENT,NONE,VTODO,ZERO
+ADD,VEVENT,NONE,VJOURNAL,ZERO
+ADD,VEVENT,RELCALID,NONE,ZEROORONE
+CANCEL,VEVENT,NONE,NONE,ONEPLUS
+CANCEL,VEVENT,ATTENDEE,NONE,ZEROPLUS
+CANCEL,VEVENT,DTSTAMP,NONE,ONE
+CANCEL,VEVENT,ORGANIZER,NONE,ONE
+CANCEL,VEVENT,SEQUENCE,NONE,ONE
+CANCEL,VEVENT,UID,NONE,ONE
+CANCEL,VEVENT,COMMENT,NONE,ZEROORONE
+CANCEL,VEVENT,ATTACH,NONE,ZEROPLUS
+CANCEL,VEVENT,CATEGORIES,NONE,ZEROPLUS #Non-standard
+CANCEL,VEVENT,CLASS,NONE,ZEROORONE
+CANCEL,VEVENT,CONTACT,NONE,ZEROPLUS
+CANCEL,VEVENT,CREATED,NONE,ZEROORONE
+CANCEL,VEVENT,DESCRIPTION,NONE,ZEROORONE
+CANCEL,VEVENT,DTEND,NONE,ONEEXCLUSIVE ,no_duration
+CANCEL,VEVENT,DTSTART,NONE,ZEROORONE
+CANCEL,VEVENT,DURATION,NONE,ONEEXCLUSIVE,no_dtend
+CANCEL,VEVENT,EXDATE,NONE,ZEROPLUS
+CANCEL,VEVENT,EXRULE,NONE,ZEROPLUS
+CANCEL,VEVENT,GEO,NONE,ZEROORONE
+CANCEL,VEVENT,LASTMODIFIED,NONE,ZEROORONE
+CANCEL,VEVENT,LOCATION,NONE,ZEROORONE
+CANCEL,VEVENT,PRIORITY,NONE,ZEROORONE
+CANCEL,VEVENT,RDATE,NONE,ZEROPLUS
+CANCEL,VEVENT,RECURRENCEID,NONE,ZEROORONE,must_be_recurring
+CANCEL,VEVENT,RELATEDTO,NONE,ZEROPLUS
+CANCEL,VEVENT,RESOURCES,NONE,ZEROORONE
+CANCEL,VEVENT,RRULE,NONE,ZEROPLUS
+CANCEL,VEVENT,STATUS,NONE,ZEROORONE,must_be_canceled_no_attendee
+CANCEL,VEVENT,SUMMARY,NONE,ZEROORONE
+CANCEL,VEVENT,TRANSP,NONE,ZEROORONE
+CANCEL,VEVENT,URL,NONE,ZEROORONE
+CANCEL,VEVENT,X,NONE,ZEROPLUS
+CANCEL,VEVENT,REQUESTSTATUS,NONE,ZERO
+CANCEL,VEVENT,NONE,VTIMEZONE,ZEROPLUS,must_if_tz_ref
+CANCEL,VEVENT,NONE,X,ZEROPLUS
+CANCEL,VEVENT,NONE,VTODO,ZERO
+CANCEL,VEVENT,NONE,VJOURNAL,ZERO
+CANCEL,VEVENT,NONE,VFREEBUSY,ZERO
+CANCEL,VEVENT,NONE,VALARM,ZERO
+CANCEL,VEVENT,RELCALID,NONE,ZEROORONE
+REFRESH,VEVENT,NONE,NONE,ONE
+REFRESH,VEVENT,ATTENDEE,NONE,ONE
+REFRESH,VEVENT,DTSTAMP,NONE,ONE
+REFRESH,VEVENT,ORGANIZER,NONE,ONE
+REFRESH,VEVENT,UID,NONE,ONE
+REFRESH,VEVENT,COMMENT,NONE,ZEROORONE
+REFRESH,VEVENT,RECURRENCEID,NONE,ZEROORONE,must_be_recurring
+REFRESH,VEVENT,X,NONE,ZEROPLUS
+REFRESH,VEVENT,ATTACH,NONE,ZERO
+REFRESH,VEVENT,CATEGORIES,NONE,ZERO
+REFRESH,VEVENT,CLASS,NONE,ZERO
+REFRESH,VEVENT,CONTACT,NONE,ZERO
+REFRESH,VEVENT,CREATED,NONE,ZERO
+REFRESH,VEVENT,DESCRIPTION,NONE,ZERO
+REFRESH,VEVENT,DTEND,NONE,ZERO
+REFRESH,VEVENT,DTSTART,NONE,ZERO
+REFRESH,VEVENT,DURATION,NONE,ZERO
+REFRESH,VEVENT,EXDATE,NONE,ZERO
+REFRESH,VEVENT,EXRULE,NONE,ZERO
+REFRESH,VEVENT,GEO,NONE,ZERO
+REFRESH,VEVENT,LASTMODIFIED,NONE,ZERO
+REFRESH,VEVENT,LOCATION,NONE,ZERO
+REFRESH,VEVENT,PRIORITY,NONE,ZERO
+REFRESH,VEVENT,RDATE,NONE,ZERO
+REFRESH,VEVENT,RELATEDTO,NONE,ZERO
+REFRESH,VEVENT,REQUESTSTATUS,NONE,ZERO
+REFRESH,VEVENT,RESOURCES,NONE,ZERO
+REFRESH,VEVENT,RRULE,NONE,ZERO
+REFRESH,VEVENT,SEQUENCE,NONE,ZERO
+REFRESH,VEVENT,STATUS,NONE,ZERO
+REFRESH,VEVENT,SUMMARY,NONE,ZERO
+REFRESH,VEVENT,TRANSP,NONE,ZERO
+REFRESH,VEVENT,URL,NONE,ZERO
+REFRESH,VEVENT,NONE,X,ZEROPLUS
+REFRESH,VEVENT,NONE,VTODO,ZERO
+REFRESH,VEVENT,NONE,VJOURNAL,ZERO
+REFRESH,VEVENT,NONE,VFREEBUSY,ZERO
+REFRESH,VEVENT,NONE,VTIMEZONE,ZERO,must_if_tz_ref
+REFRESH,VEVENT,NONE,VALARM,ZERO
+REFRESH,VEVENT,RELCALID,NONE,ZEROORONE
+COUNTER,VEVENT,NONE,NONE,ONE
+COUNTER,VEVENT,DTSTAMP,NONE,ONE
+COUNTER,VEVENT,DTSTART,NONE,ONE
+COUNTER,VEVENT,ORGANIZER,NONE,ONE
+COUNTER,VEVENT,SEQUENCE,NONE,ONE
+COUNTER,VEVENT,SUMMARY,NONE,ONE
+COUNTER,VEVENT,UID,NONE,ONE
+COUNTER,VEVENT,ATTACH,NONE,ZEROPLUS
+COUNTER,VEVENT,ATTENDEE,NONE,ZEROPLUS
+COUNTER,VEVENT,CATEGORIES,NONE,ZEROPLUS #Non-standard
+COUNTER,VEVENT,CLASS,NONE,ZEROORONE
+COUNTER,VEVENT,COMMENT,NONE,ZEROORONE
+COUNTER,VEVENT,CONTACT,NONE,ZEROPLUS
+COUNTER,VEVENT,CREATED,NONE,ZEROORONE
+COUNTER,VEVENT,DESCRIPTION,NONE,ZEROORONE
+COUNTER,VEVENT,DTEND,NONE,ONEEXCLUSIVE,no_duration
+COUNTER,VEVENT,DURATION,NONE,ONEEXCLUSIVE,no_dtend
+COUNTER,VEVENT,EXDATE,NONE,ZEROPLUS
+COUNTER,VEVENT,EXRULE,NONE,ZEROPLUS
+COUNTER,VEVENT,GEO,NONE,ZEROORONE
+COUNTER,VEVENT,LASTMODIFIED,NONE,ZEROORONE
+COUNTER,VEVENT,LOCATION,NONE,ZEROORONE
+COUNTER,VEVENT,PRIORITY,NONE,ZEROORONE
+COUNTER,VEVENT,RDATE,NONE,ZEROPLUS
+COUNTER,VEVENT,RECURRENCEID,NONE,ZEROORONE,must_be_recurring
+COUNTER,VEVENT,RELATEDTO,NONE,ZEROPLUS
+COUNTER,VEVENT,REQUESTSTATUS,NONE,ZEROPLUS
+COUNTER,VEVENT,RESOURCES,NONE,ZEROORONE
+COUNTER,VEVENT,RRULE,NONE,ZEROPLUS
+COUNTER,VEVENT,STATUS,NONE,ZEROORONE,may_be_tent_conf_cancel
+COUNTER,VEVENT,TRANSP,NONE,ZEROORONE
+COUNTER,VEVENT,URL,NONE,ZEROORONE
+COUNTER,VEVENT,X,NONE,ZEROPLUS
+COUNTER,VEVENT,NONE,VALARM,ZEROPLUS
+COUNTER,VEVENT,NONE,VTIMEZONE,ZEROPLUS,must_if_tz_ref
+COUNTER,VEVENT,NONE,X,ZEROPLUS
+COUNTER,VEVENT,NONE,VTODO,ZERO
+COUNTER,VEVENT,NONE,VJOURNAL,ZERO
+COUNTER,VEVENT,NONE,VFREEBUSY,ZERO
+COUNTER,VEVENT,RELCALID,NONE,ZEROORONE
+DECLINECOUNTER,VEVENT,NONE,NONE,ONE
+DECLINECOUNTER,VEVENT,DTSTAMP,NONE,ONE
+DECLINECOUNTER,VEVENT,ORGANIZER,NONE,ONE
+DECLINECOUNTER,VEVENT,UID,NONE,ONE
+DECLINECOUNTER,VEVENT,COMMENT,NONE,ZEROORONE
+DECLINECOUNTER,VEVENT,RECURRENCEID,NONE,ZEROORONE,must_be_recurring
+DECLINECOUNTER,VEVENT,REQUESTSTATUS,NONE,ZEROPLUS
+DECLINECOUNTER,VEVENT,SEQUENCE,NONE,ZERO
+DECLINECOUNTER,VEVENT,X,NONE,ZEROPLUS
+DECLINECOUNTER,VEVENT,ATTACH,NONE,ZERO
+DECLINECOUNTER,VEVENT,ATTENDEE,NONE,ZERO
+DECLINECOUNTER,VEVENT,CATEGORIES,NONE,ZERO
+DECLINECOUNTER,VEVENT,CLASS,NONE,ZERO
+DECLINECOUNTER,VEVENT,CONTACT,NONE,ZERO
+DECLINECOUNTER,VEVENT,CREATED,NONE,ZERO
+DECLINECOUNTER,VEVENT,DESCRIPTION,NONE,ZERO
+DECLINECOUNTER,VEVENT,DTEND,NONE,ZERO
+DECLINECOUNTER,VEVENT,DTSTART,NONE,ZERO
+DECLINECOUNTER,VEVENT,DURATION,NONE,ZERO
+DECLINECOUNTER,VEVENT,EXDATE,NONE,ZERO
+DECLINECOUNTER,VEVENT,EXRULE,NONE,ZERO
+DECLINECOUNTER,VEVENT,GEO,NONE,ZERO
+DECLINECOUNTER,VEVENT,LASTMODIFIED,NONE,ZERO
+DECLINECOUNTER,VEVENT,LOCATION,NONE,ZERO
+DECLINECOUNTER,VEVENT,PRIORITY,NONE,ZERO
+DECLINECOUNTER,VEVENT,RDATE,NONE,ZERO
+DECLINECOUNTER,VEVENT,RELATEDTO,NONE,ZERO
+DECLINECOUNTER,VEVENT,RESOURCES,NONE,ZERO
+DECLINECOUNTER,VEVENT,RRULE,NONE,ZERO
+DECLINECOUNTER,VEVENT,STATUS,NONE,ZERO
+DECLINECOUNTER,VEVENT,SUMMARY,NONE,ZERO
+DECLINECOUNTER,VEVENT,TRANSP,NONE,ZERO
+DECLINECOUNTER,VEVENT,URL,NONE,ZERO
+DECLINECOUNTER,VEVENT,NONE,X,ZEROPLUS
+DECLINECOUNTER,VEVENT,NONE,VTODO,ZERO
+DECLINECOUNTER,VEVENT,NONE,VJOURNAL,ZERO
+DECLINECOUNTER,VEVENT,NONE,VFREEBUSY,ZERO
+DECLINECOUNTER,VEVENT,NONE,VTIMEZONE,ZERO,must_if_tz_ref
+DECLINECOUNTER,VEVENT,NONE,VALARM,ZERO
+DECLINECOUNTER,VEVENT,RELCALID,NONE,ZEROORONE
+PUBLISH,VFREEBUSY,NONE,NONE,ONEPLUS
+PUBLISH,VFREEBUSY,DTSTAMP,NONE,ONE
+PUBLISH,VFREEBUSY,DTSTART,NONE,ONE
+PUBLISH,VFREEBUSY,DTEND,NONE,ONE
+PUBLISH,VFREEBUSY,FREEBUSY,NONE,ONEPLUS
+PUBLISH,VFREEBUSY,ORGANIZER,NONE,ONE
+PUBLISH,VFREEBUSY,COMMENT,NONE,ZEROORONE
+PUBLISH,VFREEBUSY,CONTACT,NONE,ZEROPLUS
+PUBLISH,VFREEBUSY,X,NONE,ZEROPLUS
+PUBLISH,VFREEBUSY,URL,NONE,ZEROORONE
+PUBLISH,VFREEBUSY,ATTENDEE,NONE,ZERO
+PUBLISH,VFREEBUSY,DURATION,NONE,ZERO
+PUBLISH,VFREEBUSY,REQUESTSTATUS,NONE,ZERO
+PUBLISH,VFREEBUSY,UID,NONE,ZERO
+PUBLISH,VFREEBUSY,NONE,X,ZEROPLUS
+PUBLISH,VFREEBUSY,NONE,VEVENT,ZERO
+PUBLISH,VFREEBUSY,NONE,VTODO,ZERO
+PUBLISH,VFREEBUSY,NONE,VJOURNAL,ZERO
+PUBLISH,VFREEBUSY,NONE,VTIMEZONE,ZERO,must_if_tz_ref
+PUBLISH,VFREEBUSY,NONE,VALARM,ZERO
+REQUEST,VFREEBUSY,NONE,NONE,ONE
+REQUEST,VFREEBUSY,ATTENDEE,NONE,ONEPLUS
+REQUEST,VFREEBUSY,DTEND,NONE,ONE
+REQUEST,VFREEBUSY,DTSTAMP,NONE,ONE
+REQUEST,VFREEBUSY,DTSTART,NONE,ONE
+REQUEST,VFREEBUSY,ORGANIZER,NONE,ONE
+REQUEST,VFREEBUSY,UID,NONE,ONE
+REQUEST,VFREEBUSY,COMMENT,NONE,ZEROORONE
+REQUEST,VFREEBUSY,CONTACT,NONE,ZEROPLUS
+REQUEST,VFREEBUSY,X,NONE,ZEROPLUS
+REQUEST,VFREEBUSY,FREEBUSY,NONE,ZERO
+REQUEST,VFREEBUSY,DURATION,NONE,ZERO
+REQUEST,VFREEBUSY,REQUESTSTATUS,NONE,ZERO
+REQUEST,VFREEBUSY,URL,NONE,ZERO
+REQUEST,VFREEBUSY,NONE,X,ZEROPLUS
+REQUEST,VFREEBUSY,NONE,VALARM,ZERO
+REQUEST,VFREEBUSY,NONE,VEVENT,ZERO
+REQUEST,VFREEBUSY,NONE,VTODO,ZERO
+REQUEST,VFREEBUSY,NONE,VJOURNAL,ZERO
+REQUEST,VFREEBUSY,NONE,VTIMEZONE,ZERO
+REPLY,VFREEBUSY,NONE,NONE,ONE
+REPLY,VFREEBUSY,ATTENDEE,NONE,ONE
+REPLY,VFREEBUSY,DTSTAMP,NONE,ONE
+REPLY,VFREEBUSY,DTEND,NONE,ONE
+REPLY,VFREEBUSY,DTSTART,NONE,ONE
+REPLY,VFREEBUSY,FREEBUSY,NONE,ONEPLUS
+REPLY,VFREEBUSY,ORGANIZER,NONE,ONE
+REPLY,VFREEBUSY,UID,NONE,ONE
+REPLY,VFREEBUSY,COMMENT,NONE,ZEROORONE
+REPLY,VFREEBUSY,CONTACT,NONE,ZEROPLUS
+REPLY,VFREEBUSY,REQUESTSTATUS,NONE,ZEROPLUS
+REPLY,VFREEBUSY,URL,NONE,ZEROORONE
+REPLY,VFREEBUSY,X,NONE,ZEROPLUS
+REPLY,VFREEBUSY,DURATION,NONE,ZERO
+REPLY,VFREEBUSY,SEQUENCE,NONE,ZERO
+REPLY,VFREEBUSY,NONE,X,ZEROPLUS
+REPLY,VFREEBUSY,NONE,VALARM,ZERO
+REPLY,VFREEBUSY,NONE,VEVENT,ZERO
+REPLY,VFREEBUSY,NONE,VTODO,ZERO
+REPLY,VFREEBUSY,NONE,VJOURNAL,ZERO
+REPLY,VFREEBUSY,NONE,VTIMEZONE,ZERO
+PUBLISH,VTODO,NONE,NONE,ONEPLUS
+PUBLISH,VTODO,DTSTAMP,NONE,ONE
+PUBLISH,VTODO,DTSTART,NONE,ONE
+PUBLISH,VTODO,ORGANIZER,NONE,ONE
+PUBLISH,VTODO,PRIORITY,NONE,ONE
+PUBLISH,VTODO,SEQUENCE,NONE,ZEROORONE
+PUBLISH,VTODO,SUMMARY,NONE,ONE
+PUBLISH,VTODO,UID,NONE,ONE
+PUBLISH,VTODO,ATTACH,NONE,ZEROPLUS
+PUBLISH,VTODO,CATEGORIES,NONE,ZEROPLUS #Non-Standard
+PUBLISH,VTODO,CLASS,NONE,ZEROORONE
+PUBLISH,VTODO,COMMENT,NONE,ZEROORONE
+PUBLISH,VTODO,CONTACT,NONE,ZEROPLUS
+PUBLISH,VTODO,CREATED,NONE,ZEROORONE
+PUBLISH,VTODO,DESCRIPTION,NONE,ZEROORONE
+PUBLISH,VTODO,DUE,NONE,ZEROORONE
+PUBLISH,VTODO,DURATION,NONE,ZEROORONE
+PUBLISH,VTODO,EXDATE,NONE,ZEROPLUS
+PUBLISH,VTODO,EXRULE,NONE,ZEROPLUS
+PUBLISH,VTODO,GEO,NONE,ZEROORONE
+PUBLISH,VTODO,LASTMODIFIED,NONE,ZEROORONE
+PUBLISH,VTODO,LOCATION,NONE,ZEROORONE
+PUBLISH,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE
+PUBLISH,VTODO,RDATE,NONE,ZEROPLUS
+PUBLISH,VTODO,RECURRENCEID,NONE,ZEROORONE,must_be_recurring
+PUBLISH,VTODO,RELATEDTO,NONE,ZEROPLUS
+PUBLISH,VTODO,RESOURCES,NONE,ZEROORONE
+PUBLISH,VTODO,RRULE,NONE,ZEROPLUS
+PUBLISH,VTODO,STATUS,NONE,ZEROORONE
+PUBLISH,VTODO,URL,NONE,ZEROORONE
+PUBLISH,VTODO,X,NONE,ZEROPLUS
+PUBLISH,VTODO,ATTENDEE,NONE,ZERO
+PUBLISH,VTODO,REQUESTSTATUS,NONE,ZERO
+PUBLISH,VTODO,NONE,VTIMEZONE,ZEROPLUS
+PUBLISH,VTODO,NONE,VALARM,ZEROPLUS
+PUBLISH,VTODO,NONE,X,ZEROPLUS
+PUBLISH,VTODO,NONE,VFREEBUSY,ZERO
+PUBLISH,VTODO,NONE,VEVENT,ZERO
+PUBLISH,VTODO,NONE,VJOURNAL,ZERO
+PUBLISH,VTODO,RELCALID,NONE,ZEROORONE
+REQUEST,VTODO,NONE,NONE,ONEPLUS
+REQUEST,VTODO,ATTENDEE,NONE,ONEPLUS
+REQUEST,VTODO,DTSTAMP,NONE,ONE
+REQUEST,VTODO,DTSTART,NONE,ONE
+REQUEST,VTODO,ORGANIZER,NONE,ONE
+REQUEST,VTODO,PRIORITY,NONE,ONE
+REQUEST,VTODO,SEQUENCE,NONE,ZEROORONE
+REQUEST,VTODO,SUMMARY,NONE,ONE
+REQUEST,VTODO,UID,NONE,ONE
+REQUEST,VTODO,ATTACH,NONE,ZEROPLUS
+REQUEST,VTODO,CATEGORIES,NONE,ZEROPLUS #Non-Standard
+REQUEST,VTODO,CLASS,NONE,ZEROORONE
+REQUEST,VTODO,COMMENT,NONE,ZEROORONE
+REQUEST,VTODO,CONTACT,NONE,ZEROPLUS
+REQUEST,VTODO,CREATED,NONE,ZEROORONE
+REQUEST,VTODO,DESCRIPTION,NONE,ZEROORONE
+REQUEST,VTODO,DUE,NONE,ZEROORONE
+REQUEST,VTODO,DURATION,NONE,ZEROORONE
+REQUEST,VTODO,EXDATE,NONE,ZEROPLUS
+REQUEST,VTODO,EXRULE,NONE,ZEROPLUS
+REQUEST,VTODO,GEO,NONE,ZEROORONE
+REQUEST,VTODO,LASTMODIFIED,NONE,ZEROORONE
+REQUEST,VTODO,LOCATION,NONE,ZEROORONE
+REQUEST,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE
+REQUEST,VTODO,RDATE,NONE,ZEROPLUS
+REQUEST,VTODO,RECURRENCEID,NONE,ZEROORONE,must_be_recurring
+REQUEST,VTODO,RELATEDTO,NONE,ZEROPLUS
+REQUEST,VTODO,RESOURCES,NONE,ZEROORONE
+REQUEST,VTODO,RRULE,NONE,ZEROPLUS
+REQUEST,VTODO,STATUS,NONE,ZEROORONE,may_be_comp_need_process
+REQUEST,VTODO,URL,NONE,ZEROORONE
+REQUEST,VTODO,X,NONE,ZEROPLUS
+REQUEST,VTODO,REQUESTSTATUS,NONE,ZERO
+REQUEST,VTODO,NONE,VALARM,ZEROPLUS
+REQUEST,VTODO,NONE,VTIMEZONE,ZEROPLUS
+REQUEST,VTODO,NONE,X,ZEROPLUS
+REQUEST,VTODO,NONE,VEVENT,ZERO
+REQUEST,VTODO,NONE,VFREEBUSY,ZERO
+REQUEST,VTODO,NONE,VJOURNAL,ZERO
+REQUEST,VTODO,RELCALID,NONE,ZEROORONE
+REPLY,VTODO,NONE,NONE,ONEPLUS
+REPLY,VTODO,ATTENDEE,NONE,ONEPLUS
+REPLY,VTODO,DTSTAMP,NONE,ONE
+REPLY,VTODO,ORGANIZER,NONE,ONE
+REPLY,VTODO,REQUESTSTATUS,NONE,ONEPLUS
+REPLY,VTODO,UID,NONE,ONE
+REPLY,VTODO,ATTACH,NONE,ZEROPLUS
+REPLY,VTODO,CATEGORIES,NONE,ZEROPLUS #Non-Standard
+REPLY,VTODO,CLASS,NONE,ZEROORONE
+REPLY,VTODO,COMMENT,NONE,ZEROORONE
+REPLY,VTODO,CONTACT,NONE,ZEROPLUS
+REPLY,VTODO,CREATED,NONE,ZEROORONE
+REPLY,VTODO,DESCRIPTION,NONE,ZEROORONE
+REPLY,VTODO,DTSTART,NONE,ZEROORONE
+REPLY,VTODO,DUE,NONE,ZEROORONE
+REPLY,VTODO,DURATION,NONE,ZEROORONE
+REPLY,VTODO,EXDATE,NONE,ZEROPLUS
+REPLY,VTODO,EXRULE,NONE,ZEROPLUS
+REPLY,VTODO,GEO,NONE,ZEROORONE
+REPLY,VTODO,LASTMODIFIED,NONE,ZEROORONE
+REPLY,VTODO,LOCATION,NONE,ZEROORONE
+REPLY,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE
+REPLY,VTODO,PRIORITY,NONE,ZEROORONE
+REPLY,VTODO,RDATE,NONE,ZEROPLUS
+REPLY,VTODO,RELATEDTO,NONE,ZEROPLUS
+REPLY,VTODO,RESOURCES,NONE,ZEROORONE
+REPLY,VTODO,RRULE,NONE,ZEROPLUS
+REPLY,VTODO,RECURRENCEID,NONE,ZEROORONE,must_be_recurring
+REPLY,VTODO,SEQUENCE,NONE,ZEROORONE
+REPLY,VTODO,STATUS,NONE,ZEROORONE
+REPLY,VTODO,SUMMARY,NONE,ZEROORONE
+REPLY,VTODO,URL,NONE,ZEROORONE
+REPLY,VTODO,X,NONE,ZEROPLUS
+REPLY,VTODO,NONE,VTIMEZONE,ZEROORONE
+REPLY,VTODO,NONE,X,ZEROPLUS
+REPLY,VTODO,NONE,VALARM,ZERO
+REPLY,VTODO,NONE,VEVENT,ZERO
+REPLY,VTODO,NONE,VFREEBUSY,ZERO
+REPLY,VTODO,RELCALID,NONE,ZEROORONE
+ADD,VTODO,NONE,NONE,ONE
+ADD,VTODO,DTSTAMP,NONE,ONE
+ADD,VTODO,ORGANIZER,NONE,ONE
+ADD,VTODO,PRIORITY,NONE,ONE
+ADD,VTODO,SEQUENCE,NONE,ONE
+ADD,VTODO,SUMMARY,NONE,ONE
+ADD,VTODO,UID,NONE,ONE
+ADD,VTODO,ATTACH,NONE,ZEROPLUS
+ADD,VTODO,ATTENDEE,NONE,ZEROPLUS
+ADD,VTODO,CATEGORIES,NONE,ZEROPLUS
+ADD,VTODO,CLASS,NONE,ZEROORONE
+ADD,VTODO,COMMENT,NONE,ZEROORONE
+ADD,VTODO,CONTACT,NONE,ZEROPLUS
+ADD,VTODO,CREATED,NONE,ZEROORONE
+ADD,VTODO,DESCRIPTION,NONE,ZEROORONE
+ADD,VTODO,DTSTART,NONE,ZEROORONE
+ADD,VTODO,DUE,NONE,ZEROORONE
+ADD,VTODO,DURATION,NONE,ZEROORONE
+ADD,VTODO,EXDATE,NONE,ZEROPLUS
+ADD,VTODO,EXRULE,NONE,ZEROPLUS
+ADD,VTODO,GEO,NONE,ZEROORONE
+ADD,VTODO,LASTMODIFIED,NONE,ZEROORONE
+ADD,VTODO,LOCATION,NONE,ZEROORONE
+ADD,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE
+ADD,VTODO,RDATE,NONE,ZEROPLUS
+ADD,VTODO,RELATEDTO,NONE,ZEROPLUS
+ADD,VTODO,RESOURCES,NONE,ZEROORONE
+ADD,VTODO,RRULE,NONE,ZEROPLUS
+ADD,VTODO,STATUS,NONE,ZEROORONE,may_be_comp_need_process
+ADD,VTODO,URL,NONE,ZEROORONE
+ADD,VTODO,X,NONE,ZEROPLUS
+ADD,VTODO,RECURRENCEID,NONE,ZERO,must_be_recurring
+ADD,VTODO,REQUESTSTATUS,NONE,ZERO
+ADD,VTODO,NONE,VALARM,ZEROPLUS
+ADD,VTODO,NONE,VTIMEZONE,ZEROPLUS
+ADD,VTODO,NONE,X,ZEROPLUS
+ADD,VTODO,NONE,VEVENT,ZERO
+ADD,VTODO,NONE,VJOURNAL,ZERO
+ADD,VTODO,NONE,VFREEBUSY,ZERO
+ADD,VTODO,RELCALID,NONE,ZEROORONE
+CANCEL,VTODO,NONE,NONE,ONE
+CANCEL,VTODO,ATTENDEE,NONE,ZEROPLUS
+CANCEL,VTODO,UID,NONE,ONE
+CANCEL,VTODO,DTSTAMP,NONE,ONE
+CANCEL,VTODO,ORGANIZER,NONE,ONE
+CANCEL,VTODO,SEQUENCE,NONE,ONE
+CANCEL,VTODO,ATTACH,NONE,ZEROPLUS
+CANCEL,VTODO,CATEGORIES,NONE,ZEROPLUS #Non-Standard
+CANCEL,VTODO,CLASS,NONE,ZEROORONE
+CANCEL,VTODO,COMMENT,NONE,ZEROORONE
+CANCEL,VTODO,CONTACT,NONE,ZEROPLUS
+CANCEL,VTODO,CREATED,NONE,ZEROORONE
+CANCEL,VTODO,DESCRIPTION,NONE,ZEROORONE
+CANCEL,VTODO,DTSTART,NONE,ZEROORONE
+CANCEL,VTODO,DUE,NONE,ZEROORONE
+CANCEL,VTODO,DURATION,NONE,ZEROORONE
+CANCEL,VTODO,EXDATE,NONE,ZEROPLUS
+CANCEL,VTODO,EXRULE,NONE,ZEROPLUS
+CANCEL,VTODO,GEO,NONE,ZEROORONE
+CANCEL,VTODO,LASTMODIFIED,NONE,ZEROORONE
+CANCEL,VTODO,LOCATION,NONE,ZEROORONE
+CANCEL,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE
+CANCEL,VTODO,RDATE,NONE,ZEROPLUS
+CANCEL,VTODO,RECURRENCEID,NONE,ZEROORONE,must_be_recurring
+CANCEL,VTODO,RELATEDTO,NONE,ZEROPLUS
+CANCEL,VTODO,RESOURCES,NONE,ZEROORONE
+CANCEL,VTODO,RRULE,NONE,ZEROPLUS
+CANCEL,VTODO,PRIORITY,NONE,ZEROORONE
+CANCEL,VTODO,STATUS,NONE,ZEROORONE,must_be_canceled_no_attendee
+CANCEL,VTODO,URL,NONE,ZEROORONE
+CANCEL,VTODO,X,NONE,ZEROPLUS
+CANCEL,VTODO,REQUESTSTATUS,NONE,ZERO
+CANCEL,VTODO,NONE,VTIMEZONE,ZEROORONE
+CANCEL,VTODO,NONE,X,ZEROPLUS
+CANCEL,VTODO,NONE,VALARM,ZERO
+CANCEL,VTODO,NONE,VEVENT,ZERO
+CANCEL,VTODO,NONE,VFREEBUSY,ZERO
+CANCEL,VTODO,RELCALID,NONE,ZEROORONE
+REFRESH,VTODO,NONE,NONE,ONE
+REFRESH,VTODO,ATTENDEE,NONE,ONE
+REFRESH,VTODO,DTSTAMP,NONE,ONE
+REFRESH,VTODO,UID,NONE,ONE
+REFRESH,VTODO,RECURRENCEID,NONE,ZEROORONE,must_be_recurring
+REFRESH,VTODO,X,NONE,ZEROPLUS
+REFRESH,VTODO,ATTACH,NONE,ZERO
+REFRESH,VTODO,CATEGORIES,NONE,ZERO
+REFRESH,VTODO,CLASS,NONE,ZERO
+REFRESH,VTODO,COMMENT,NONE,ZERO
+REFRESH,VTODO,CONTACT,NONE,ZERO
+REFRESH,VTODO,CREATED,NONE,ZERO
+REFRESH,VTODO,DESCRIPTION,NONE,ZERO
+REFRESH,VTODO,DTSTART,NONE,ZERO
+REFRESH,VTODO,DUE,NONE,ZERO
+REFRESH,VTODO,DURATION,NONE,ZERO
+REFRESH,VTODO,EXDATE,NONE,ZERO
+REFRESH,VTODO,EXRULE,NONE,ZERO
+REFRESH,VTODO,GEO,NONE,ZERO
+REFRESH,VTODO,LASTMODIFIED,NONE,ZERO
+REFRESH,VTODO,LOCATION,NONE,ZERO
+REFRESH,VTODO,ORGANIZER,NONE,ZERO
+REFRESH,VTODO,PERCENTCOMPLETE,NONE,ZERO
+REFRESH,VTODO,PRIORITY,NONE,ZERO
+REFRESH,VTODO,RDATE,NONE,ZERO
+REFRESH,VTODO,RELATEDTO,NONE,ZERO
+REFRESH,VTODO,REQUESTSTATUS,NONE,ZERO
+REFRESH,VTODO,RESOURCES,NONE,ZERO
+REFRESH,VTODO,RRULE,NONE,ZERO
+REFRESH,VTODO,SEQUENCE,NONE,ZERO
+REFRESH,VTODO,STATUS,NONE,ZERO
+REFRESH,VTODO,URL,NONE,ZERO
+REFRESH,VTODO,NONE,X,ZEROPLUS
+REFRESH,VTODO,NONE,VALARM,ZERO
+REFRESH,VTODO,NONE,VEVENT,ZERO
+REFRESH,VTODO,NONE,VFREEBUSY,ZERO
+REFRESH,VTODO,NONE,VTIMEZONE,ZERO
+REFRESH,VTODO,RELCALID,NONE,ZEROORONE
+COUNTER,VTODO,NONE,NONE,ONE
+COUNTER,VTODO,ATTENDEE,NONE,ONEPLUS
+COUNTER,VTODO,DTSTAMP,NONE,ONE
+COUNTER,VTODO,ORGANIZER,NONE,ONE
+COUNTER,VTODO,PRIORITY,NONE,ONE
+COUNTER,VTODO,SUMMARY,NONE,ONE
+COUNTER,VTODO,UID,NONE,ONE
+COUNTER,VTODO,ATTACH,NONE,ZEROPLUS
+COUNTER,VTODO,CATEGORIES,NONE,ZEROPLUS #Non-standard
+COUNTER,VTODO,CLASS,NONE,ZEROORONE
+COUNTER,VTODO,COMMENT,NONE,ZEROORONE
+COUNTER,VTODO,CONTACT,NONE,ZEROPLUS
+COUNTER,VTODO,CREATED,NONE,ZEROORONE
+COUNTER,VTODO,DESCRIPTION,NONE,ZEROORONE
+COUNTER,VTODO,DTSTART,NONE,ZEROORONE
+COUNTER,VTODO,DUE,NONE,ZEROORONE
+COUNTER,VTODO,DURATION,NONE,ZEROORONE
+COUNTER,VTODO,EXDATE,NONE,ZEROPLUS
+COUNTER,VTODO,EXRULE,NONE,ZEROPLUS
+COUNTER,VTODO,GEO,NONE,ZEROORONE
+COUNTER,VTODO,LASTMODIFIED,NONE,ZEROORONE
+COUNTER,VTODO,LOCATION,NONE,ZEROORONE
+COUNTER,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE
+COUNTER,VTODO,RDATE,NONE,ZEROPLUS
+COUNTER,VTODO,RECURRENCEID,NONE,ZEROORONE,must_be_recurring
+COUNTER,VTODO,RELATEDTO,NONE,ZEROPLUS
+COUNTER,VTODO,REQUESTSTATUS,NONE,ZEROPLUS
+COUNTER,VTODO,RESOURCES,NONE,ZEROORONE
+COUNTER,VTODO,RRULE,NONE,ZEROORONE
+COUNTER,VTODO,SEQUENCE,NONE,ZEROORONE
+COUNTER,VTODO,STATUS,NONE,ZEROORONE,may_be_comp_need_process
+COUNTER,VTODO,URL,NONE,ZEROORONE
+COUNTER,VTODO,X,NONE,ZEROPLUS
+COUNTER,VTODO,NONE,VALARM,ZEROPLUS
+COUNTER,VTODO,NONE,VTIMEZONE,ZEROORONE
+COUNTER,VTODO,NONE,X,ZEROPLUS
+COUNTER,VTODO,NONE,VEVENT,ZERO
+COUNTER,VTODO,NONE,VFREEBUSY,ZERO
+COUNTER,VTODO,RELCALID,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,NONE,NONE,ONE
+DECLINECOUNTER,VTODO,ATTENDEE,NONE,ONEPLUS
+DECLINECOUNTER,VTODO,DTSTAMP,NONE,ONE
+DECLINECOUNTER,VTODO,ORGANIZER,NONE,ONE
+DECLINECOUNTER,VTODO,SEQUENCE,NONE,ONE
+DECLINECOUNTER,VTODO,UID,NONE,ONE
+DECLINECOUNTER,VTODO,ATTACH,NONE,ZEROPLUS
+DECLINECOUNTER,VTODO,CATEGORIES,NONE,ZEROPLUS #Non-standard
+DECLINECOUNTER,VTODO,CLASS,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,COMMENT,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,CONTACT,NONE,ZEROPLUS
+DECLINECOUNTER,VTODO,CREATED,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,DESCRIPTION,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,DTSTART,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,DUE,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,DURATION,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,EXDATE,NONE,ZEROPLUS
+DECLINECOUNTER,VTODO,EXRULE,NONE,ZEROPLUS
+DECLINECOUNTER,VTODO,GEO,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,LASTMODIFIED,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,LOCATION,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,PRIORITY,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,RDATE,NONE,ZEROPLUS
+DECLINECOUNTER,VTODO,RECURRENCEID,NONE,ZEROORONE,must_be_recurring
+DECLINECOUNTER,VTODO,RELATEDTO,NONE,ZEROPLUS
+DECLINECOUNTER,VTODO,REQUESTSTATUS,NONE,ZEROPLUS
+DECLINECOUNTER,VTODO,RESOURCES,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,RRULE,NONE,ZEROPLUS
+DECLINECOUNTER,VTODO,STATUS,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,URL,NONE,ZEROORONE
+DECLINECOUNTER,VTODO,X,NONE,ZEROPLUS
+DECLINECOUNTER,VTODO,NONE,VTIMEZONE,ZEROPLUS
+DECLINECOUNTER,VTODO,NONE,X,ZEROPLUS
+DECLINECOUNTER,VTODO,NONE,VALARM,ZERO
+DECLINECOUNTER,VTODO,NONE,VEVENT,ZERO
+DECLINECOUNTER,VTODO,NONE,VFREEBUSY,ZERO
+DECLINECOUNTER,VTODO,RELCALID,NONE,ZEROORONE
+PUBLISH,VJOURNAL,NONE,NONE,ONEPLUS
+PUBLISH,VJOURNAL,DESCRIPTION,NONE,ONE
+PUBLISH,VJOURNAL,DTSTAMP,NONE,ONE
+PUBLISH,VJOURNAL,DTSTART,NONE,ONE
+PUBLISH,VJOURNAL,ORGANIZER,NONE,ONE
+PUBLISH,VJOURNAL,UID,NONE,ONE
+PUBLISH,VJOURNAL,ATTACH,NONE,ZEROPLUS
+PUBLISH,VJOURNAL,CATEGORIES,NONE,ZEROPLUS #Non-standard
+PUBLISH,VJOURNAL,CLASS,NONE,ZEROORONE
+PUBLISH,VJOURNAL,COMMENT,NONE,ZEROORONE
+PUBLISH,VJOURNAL,CONTACT,NONE,ZEROPLUS
+PUBLISH,VJOURNAL,CREATED,NONE,ZEROORONE
+PUBLISH,VJOURNAL,EXDATE,NONE,ZEROPLUS
+PUBLISH,VJOURNAL,EXRULE,NONE,ZEROPLUS
+PUBLISH,VJOURNAL,LASTMODIFIED,NONE,ZEROORONE
+PUBLISH,VJOURNAL,RDATE,NONE,ZEROPLUS
+PUBLISH,VJOURNAL,RECURRENCEID,NONE,ZEROORONE,must_be_recurring
+PUBLISH,VJOURNAL,RELATEDTO,NONE,ZEROPLUS
+PUBLISH,VJOURNAL,RRULE,NONE,ZEROPLUS
+PUBLISH,VJOURNAL,SEQUENCE,NONE,ZEROORONE
+PUBLISH,VJOURNAL,STATUS,NONE,ZEROORONE,may_be_draft_final_canceled
+PUBLISH,VJOURNAL,SUMMARY,NONE,ZEROORONE
+PUBLISH,VJOURNAL,URL,NONE,ZEROORONE
+PUBLISH,VJOURNAL,X,NONE,ZEROPLUS
+PUBLISH,VJOURNAL,ATTENDEE,NONE,ZERO
+PUBLISH,VJOURNAL,NONE,VALARM,ZEROPLUS
+PUBLISH,VJOURNAL,NONE,VTIMEZONE,ZEROPLUS
+PUBLISH,VJOURNAL,NONE,X,ZEROPLUS
+PUBLISH,VJOURNAL,NONE,VEVENT,ZERO
+PUBLISH,VJOURNAL,NONE,VFREEBUSY,ZERO
+PUBLISH,VJOURNAL,NONE,VTODO,ZERO
+ADD,VJOURNAL,NONE,NONE,ONE
+ADD,VJOURNAL,DESCRIPTION,NONE,ONE
+ADD,VJOURNAL,DTSTAMP,NONE,ONE
+ADD,VJOURNAL,DTSTART,NONE,ONE
+ADD,VJOURNAL,ORGANIZER,NONE,ONE
+ADD,VJOURNAL,SEQUENCE,NONE,ONE
+ADD,VJOURNAL,UID,NONE,ONE
+ADD,VJOURNAL,ATTACH,NONE,ZEROPLUS
+ADD,VJOURNAL,CATEGORIES,NONE,ZEROPLUS #Non-standard
+ADD,VJOURNAL,CLASS,NONE,ZEROORONE
+ADD,VJOURNAL,COMMENT,NONE,ZEROORONE
+ADD,VJOURNAL,CONTACT,NONE,ZEROPLUS
+ADD,VJOURNAL,CREATED,NONE,ZEROORONE
+ADD,VJOURNAL,EXDATE,NONE,ZEROPLUS
+ADD,VJOURNAL,EXRULE,NONE,ZEROPLUS
+ADD,VJOURNAL,LASTMODIFIED,NONE,ZEROORONE
+ADD,VJOURNAL,RDATE,NONE,ZEROPLUS
+ADD,VJOURNAL,RELATEDTO,NONE,ZEROPLUS
+ADD,VJOURNAL,RRULE,NONE,ZEROPLUS
+ADD,VJOURNAL,STATUS,NONE,ZEROORONE
+ADD,VJOURNAL,SUMMARY,NONE,ZEROORONE
+ADD,VJOURNAL,URL,NONE,ZEROORONE
+ADD,VJOURNAL,X,NONE,ZEROPLUS
+ADD,VJOURNAL,ATTENDEE,NONE,ZERO
+ADD,VJOURNAL,RECURRENCEID,NONE,ZERO
+ADD,VJOURNAL,NONE,VALARM,ZEROPLUS
+ADD,VJOURNAL,NONE,VTIMEZONE,ZEROORONE
+ADD,VJOURNAL,NONE,X,ZEROPLUS
+ADD,VJOURNAL,NONE,VEVENT,ZERO
+ADD,VJOURNAL,NONE,VFREEBUSY,ZERO
+ADD,VJOURNAL,NONE,VTODO,ZERO
+CANCEL,VJOURNAL,NONE,NONE,ONEPLUS
+CANCEL,VJOURNAL,DTSTAMP,NONE,ONE
+CANCEL,VJOURNAL,ORGANIZER,NONE,ONE
+CANCEL,VJOURNAL,SEQUENCE,NONE,ONE
+CANCEL,VJOURNAL,UID,NONE,ONE
+CANCEL,VJOURNAL,ATTACH,NONE,ZEROPLUS
+CANCEL,VJOURNAL,ATTENDEE,NONE,ZEROPLUS
+CANCEL,VJOURNAL,CATEGORIES,NONE,ZEROPLUS #Non-standard
+CANCEL,VJOURNAL,CLASS,NONE,ZEROORONE
+CANCEL,VJOURNAL,COMMENT,NONE,ZEROORONE
+CANCEL,VJOURNAL,CONTACT,NONE,ZEROPLUS
+CANCEL,VJOURNAL,CREATED,NONE,ZEROORONE
+CANCEL,VJOURNAL,DESCRIPTION,NONE,ZEROORONE
+CANCEL,VJOURNAL,DTSTART,NONE,ZEROORONE
+CANCEL,VJOURNAL,EXDATE,NONE,ZEROPLUS
+CANCEL,VJOURNAL,EXRULE,NONE,ZEROPLUS
+CANCEL,VJOURNAL,LASTMODIFIED,NONE,ZEROORONE
+CANCEL,VJOURNAL,RDATE,NONE,ZEROPLUS
+CANCEL,VJOURNAL,RECURRENCEID,NONE,ZEROORONE,must_be_recurring
+CANCEL,VJOURNAL,RELATEDTO,NONE,ZEROPLUS
+CANCEL,VJOURNAL,RRULE,NONE,ZEROPLUS
+CANCEL,VJOURNAL,STATUS,NONE,ZEROORONE,must_be_cancel_if_present
+CANCEL,VJOURNAL,SUMMARY,NONE,ZEROORONE
+CANCEL,VJOURNAL,URL,NONE,ZEROORONE
+CANCEL,VJOURNAL,X,NONE,ZEROPLUS
+CANCEL,VJOURNAL,REQUESTSTATUS,NONE,ZERO
+CANCEL,VJOURNAL,NONE,VTIMEZONE,ZEROPLUS
+CANCEL,VJOURNAL,NONE,X,ZEROPLUS
+CANCEL,VJOURNAL,NONE,VALARM,ZERO
+CANCEL,VJOURNAL,NONE,VEVENT,ZERO
+CANCEL,VJOURNAL,NONE,VFREEBUSY,ZERO
+CANCEL,VJOURNAL,NONE,VTODO,ZERO
+PUBLISH,VAGENDA,NONE,NONE,ONEPLUS
+PUBLISH,VAGENDA,CALMASTER,NONE,ONE
+PUBLISH,VAGENDA,OWNER,NONE,ZEROORONE
+PUBLISH,VAGENDA,RELCALID,NONE,ZEROORONE
+PUBLISH,VAGENDA,TZID,NONE,ONE
+REQUEST,VAGENDA,NONE,NONE,ONEPLUS
+REQUEST,VAGENDA,CALMASTER,NONE,ONE
+REQUEST,VAGENDA,OWNER,NONE,ZEROORONE
+REQUEST,VAGENDA,RELCALID,NONE,ZEROORONE
+REQUEST,VAGENDA,TZID,NONE,ONE
+REPLY,VAGENDA,NONE,NONE,ONEPLUS
+REPLY,VAGENDA,CALMASTER,NONE,ONE
+REPLY,VAGENDA,OWNER,NONE,ZEROORONE
+REPLY,VAGENDA,RELCALID,NONE,ZEROORONE
+REPLY,VAGENDA,TZID,NONE,ONE
+ADD,VAGENDA,NONE,NONE,ONEPLUS
+ADD,VAGENDA,CALMASTER,NONE,ONE
+ADD,VAGENDA,OWNER,NONE,ZEROORONE
+ADD,VAGENDA,RELCALID,NONE,ZEROORONE
+ADD,VAGENDA,TZID,NONE,ONE
+CANCEL,VAGENDA,NONE,NONE,ONEPLUS
+CANCEL,VAGENDA,CALMASTER,NONE,ONE
+CANCEL,VAGENDA,OWNER,NONE,ZEROORONE
+CANCEL,VAGENDA,RELCALID,NONE,ZEROORONE
+CANCEL,VAGENDA,TZID,NONE,ONE
+REFRESH,VAGENDA,NONE,NONE,ONEPLUS
+REFRESH,VAGENDA,CALMASTER,NONE,ONE
+REFRESH,VAGENDA,OWNER,NONE,ZEROORONE
+REFRESH,VAGENDA,RELCALID,NONE,ZEROORONE
+REFRESH,VAGENDA,TZID,NONE,ONE
+COUNTER,VAGENDA,NONE,NONE,ONEPLUS
+COUNTER,VAGENDA,CALMASTER,NONE,ONE
+COUNTER,VAGENDA,OWNER,NONE,ZEROORONE
+COUNTER,VAGENDA,RELCALID,NONE,ZEROORONE
+COUNTER,VAGENDA,TZID,NONE,ONE
+DECLINECOUNTER,VAGENDA,NONE,NONE,ONEPLUS
+DECLINECOUNTER,VAGENDA,CALMASTER,NONE,ONE
+DECLINECOUNTER,VAGENDA,OWNER,NONE,ZEROORONE
+DECLINECOUNTER,VAGENDA,RELCALID,NONE,ZEROORONE
+DECLINECOUNTER,VAGENDA,TZID,NONE,ONE
+NONE,VAGENDA,ALLOWCONFLICT,NONE,ONE
+NONE,VAGENDA,CALMASTER,NONE,ONE
+NONE,VAGENDA,OWNER,NONE,ZEROORONE
+NONE,VAGENDA,RELCALID,NONE,ZEROORONE
+NONE,VAGENDA,TZID,NONE,ONE
+NONE,VAGENDA,DEFAULTCHARSET,NONE,ONE
+NONE,VAGENDA,DEFAULTLOCALE,NONE,ONE
+NONE,VAGENDA,DEFAULTTZID,NONE,ONE
+NONE,VCALENDAR,ACTION,NONE,ZERO
+NONE,VCALENDAR,ATTACH,NONE,ZERO
+NONE,VCALENDAR,ATTENDEE,NONE,ZERO
+NONE,VCALENDAR,RELCALID,NONE,ZEROORONE
+NONE,VCALENDAR,CALSCALE,NONE,ZEROORONE
+NONE,VCALENDAR,CATEGORIES,NONE,ZERO
+NONE,VCALENDAR,CLASS,NONE,ZERO
+NONE,VCALENDAR,COMMENT,NONE,ZERO
+NONE,VCALENDAR,COMPLETED,NONE,ZERO
+NONE,VCALENDAR,CONTACT,NONE,ZERO
+NONE,VCALENDAR,CREATED,NONE,ZERO
+NONE,VCALENDAR,DESCRIPTION,NONE,ZERO
+NONE,VCALENDAR,DTEND,NONE,ZERO
+NONE,VCALENDAR,DTSTAMP,NONE,ZERO
+NONE,VCALENDAR,DTSTART,NONE,ZERO
+NONE,VCALENDAR,DUE,NONE,ZERO
+NONE,VCALENDAR,DURATION,NONE,ZERO
+NONE,VCALENDAR,EXDATE,NONE,ZERO
+NONE,VCALENDAR,EXRULE,NONE,ZERO
+NONE,VCALENDAR,FREEBUSY,NONE,ZERO
+NONE,VCALENDAR,GEO,NONE,ZERO
+NONE,VCALENDAR,LASTMODIFIED,NONE,ZERO
+NONE,VCALENDAR,LOCATION,NONE,ZERO
+NONE,VCALENDAR,METHOD,NONE,ZEROORONE
+NONE,VCALENDAR,ORGANIZER,NONE,ZERO
+NONE,VCALENDAR,PERCENTCOMPLETE,NONE,ZERO
+NONE,VCALENDAR,PRIORITY,NONE,ZERO
+NONE,VCALENDAR,PRODID,NONE,ONE
+NONE,VCALENDAR,RDATE,NONE,ZERO
+NONE,VCALENDAR,RECURRENCEID,NONE,ZERO
+NONE,VCALENDAR,RELATEDTO,NONE,ZERO
+NONE,VCALENDAR,REPEAT,NONE,ZERO
+NONE,VCALENDAR,REQUESTSTATUS,NONE,ZERO
+NONE,VCALENDAR,RESOURCES,NONE,ZERO
+NONE,VCALENDAR,RRULE,NONE,ZERO
+NONE,VCALENDAR,SEQUENCE,NONE,ZERO
+NONE,VCALENDAR,STATUS,NONE,ZERO
+NONE,VCALENDAR,SUMMARY,NONE,ZERO
+NONE,VCALENDAR,TRANSP,NONE,ZERO
+NONE,VCALENDAR,TRIGGER,NONE,ZERO
+NONE,VCALENDAR,TZID,NONE,ZERO
+NONE,VCALENDAR,TZNAME,NONE,ZERO
+NONE,VCALENDAR,TZOFFSETFROM,NONE,ZERO
+NONE,VCALENDAR,TZOFFSETTO,NONE,ZERO
+NONE,VCALENDAR,TZURL,NONE,ZERO
+NONE,VCALENDAR,UID,NONE,ZERO
+NONE,VCALENDAR,URL,NONE,ZERO
+NONE,VCALENDAR,VERSION,NONE,ONE
+NONE,VCALENDAR,X,NONE,ZEROPLUS
+NONE,VEVENT,ACTION,NONE,ZERO
+NONE,VEVENT,ATTACH,NONE,ZEROPLUS
+NONE,VEVENT,ATTENDEE,NONE,ZEROPLUS
+NONE,VEVENT,CALSCALE,NONE,ZERO
+NONE,VEVENT,CATEGORIES,NONE,ZEROPLUS
+NONE,VEVENT,CLASS,NONE,ZEROORONE
+NONE,VEVENT,COMMENT,NONE,ZEROPLUS
+NONE,VEVENT,COMPLETED,NONE,ZERO
+NONE,VEVENT,CONTACT,NONE,ZEROPLUS
+NONE,VEVENT,CREATED,NONE,ZEROORONE
+NONE,VEVENT,DESCRIPTION,NONE,ZEROORONE
+NONE,VEVENT,DTEND,NONE,ONEEXCLUSIVE,no_duration
+NONE,VEVENT,DTSTAMP,NONE,ZEROORONE
+NONE,VEVENT,DTSTART,NONE,ZEROORONE
+NONE,VEVENT,DUE,NONE,ZERO
+NONE,VEVENT,DURATION,NONE,ONEEXCLUSIVE,no_dtend
+NONE,VEVENT,EXDATE,NONE,ZEROPLUS
+NONE,VEVENT,EXRULE,NONE,ZEROPLUS
+NONE,VEVENT,FREEBUSY,NONE,ZERO
+NONE,VEVENT,GEO,NONE,ZEROORONE
+NONE,VEVENT,LASTMODIFIED,NONE,ZEROORONE
+NONE,VEVENT,LOCATION,NONE,ZEROORONE
+NONE,VEVENT,METHOD,NONE,ZERO
+NONE,VEVENT,ORGANIZER,NONE,ZEROORONE
+NONE,VEVENT,PERCENTCOMPLETE,NONE,ZERO
+NONE,VEVENT,PRIORITY,NONE,ZEROORONE
+NONE,VEVENT,PRODID,NONE,ZERO
+NONE,VEVENT,RDATE,NONE,ZEROPLUS
+NONE,VEVENT,RECURRENCEID,NONE,ZEROORONE,must_be_recurring
+NONE,VEVENT,RELATEDTO,NONE,ZEROPLUS
+NONE,VEVENT,REPEAT,NONE,ZERO
+NONE,VEVENT,REQUESTSTATUS,NONE,ZEROPLUS
+NONE,VEVENT,RESOURCES,NONE,ZEROPLUS
+NONE,VEVENT,RRULE,NONE,ZEROPLUS
+NONE,VEVENT,SEQUENCE,NONE,ZEROORONE
+NONE,VEVENT,STATUS,NONE,ZEROORONE
+NONE,VEVENT,SUMMARY,NONE,ZEROORONE
+NONE,VEVENT,TRANSP,NONE,ZEROORONE
+NONE,VEVENT,TRIGGER,NONE,ZERO
+NONE,VEVENT,TZID,NONE,ZERO
+NONE,VEVENT,TZNAME,NONE,ZERO
+NONE,VEVENT,TZOFFSETFROM,NONE,ZERO
+NONE,VEVENT,TZOFFSETTO,NONE,ZERO
+NONE,VEVENT,TZURL,NONE,ZERO
+NONE,VEVENT,UID,NONE,ZEROORONE
+NONE,VEVENT,URL,NONE,ZEROORONE
+NONE,VEVENT,VERSION,NONE,ZERO
+NONE,VEVENT,X,NONE,ZEROPLUS
+NONE,VEVENT,RELCALID,NONE,ZEROORONE
+NONE,VTODO,ACTION,NONE,ZERO
+NONE,VTODO,ATTACH,NONE,ZEROPLUS
+NONE,VTODO,ATTENDEE,NONE,ZEROPLUS
+NONE,VTODO,CALSCALE,NONE,ZERO
+NONE,VTODO,CATEGORIES,NONE,ZEROPLUS
+NONE,VTODO,CLASS,NONE,ZEROORONE
+NONE,VTODO,COMMENT,NONE,ZEROPLUS
+NONE,VTODO,COMPLETED,NONE,ZEROORONE
+NONE,VTODO,CONTACT,NONE,ZEROPLUS
+NONE,VTODO,CREATED,NONE,ZEROORONE
+NONE,VTODO,DESCRIPTION,NONE,ZEROORONE
+NONE,VTODO,DTEND,NONE,ZERO
+NONE,VTODO,DTSTAMP,NONE,ZEROORONE
+NONE,VTODO,DTSTART,NONE,ZEROORONE
+NONE,VTODO,DUE,NONE,ONEEXCLUSIVE
+NONE,VTODO,DURATION,NONE,ONEEXCLUSIVE
+NONE,VTODO,EXDATE,NONE,ZEROPLUS
+NONE,VTODO,EXRULE,NONE,ZEROPLUS
+NONE,VTODO,FREEBUSY,NONE,ZERO
+NONE,VTODO,GEO,NONE,ZEROORONE
+NONE,VTODO,LASTMODIFIED,NONE,ZEROORONE
+NONE,VTODO,LOCATION,NONE,ZEROORONE
+NONE,VTODO,METHOD,NONE,ZERO
+NONE,VTODO,ORGANIZER,NONE,ZEROORONE
+NONE,VTODO,PERCENTCOMPLETE,NONE,ZEROORONE
+NONE,VTODO,PRIORITY,NONE,ZEROORONE
+NONE,VTODO,PRODID,NONE,ZERO
+NONE,VTODO,RDATE,NONE,ZEROPLUS
+NONE,VTODO,RECURRENCEID,NONE,ZEROORONE,must_be_recurring
+NONE,VTODO,RELATEDTO,NONE,ZEROPLUS
+NONE,VTODO,REPEAT,NONE,ZERO
+NONE,VTODO,REQUESTSTATUS,NONE,ZEROPLUS
+NONE,VTODO,RESOURCES,NONE,ZEROPLUS
+NONE,VTODO,RRULE,NONE,ZEROPLUS
+NONE,VTODO,SEQUENCE,NONE,ZEROORONE
+NONE,VTODO,STATUS,NONE,ZEROORONE
+NONE,VTODO,SUMMARY,NONE,ZEROORONE
+NONE,VTODO,TRANSP,NONE,ZERO
+NONE,VTODO,TRIGGER,NONE,ZERO
+NONE,VTODO,TZID,NONE,ZERO
+NONE,VTODO,TZNAME,NONE,ZERO
+NONE,VTODO,TZOFFSETFROM,NONE,ZERO
+NONE,VTODO,TZOFFSETTO,NONE,ZERO
+NONE,VTODO,TZURL,NONE,ZERO
+NONE,VTODO,UID,NONE,ZEROORONE
+NONE,VTODO,URL,NONE,ZEROORONE
+NONE,VTODO,VERSION,NONE,ZERO
+NONE,VTODO,X,NONE,ZEROPLUS
+NONE,VTODO,RELCALID,NONE,ZEROORONE
+NONE,VJOURNAL,ACTION,NONE,ZERO
+NONE,VJOURNAL,ATTACH,NONE,ZEROPLUS
+NONE,VJOURNAL,ATTENDEE,NONE,ZEROPLUS
+NONE,VJOURNAL,CALSCALE,NONE,ZERO
+NONE,VJOURNAL,CATEGORIES,NONE,ZEROPLUS
+NONE,VJOURNAL,CLASS,NONE,ZEROORONE
+NONE,VJOURNAL,COMMENT,NONE,ZEROPLUS
+NONE,VJOURNAL,COMPLETED,NONE,ZERO
+NONE,VJOURNAL,CONTACT,NONE,ZEROPLUS
+NONE,VJOURNAL,CREATED,NONE,ZEROORONE
+NONE,VJOURNAL,DESCRIPTION,NONE,ZEROORONE
+NONE,VJOURNAL,DTEND,NONE,ZERO
+NONE,VJOURNAL,DTSTAMP,NONE,ZEROORONE
+NONE,VJOURNAL,DTSTART,NONE,ZEROORONE
+NONE,VJOURNAL,DUE,NONE,ONEEXCLUSIVE
+NONE,VJOURNAL,DURATION,NONE,ONEEXCLUSIVE
+NONE,VJOURNAL,EXDATE,NONE,ZEROPLUS
+NONE,VJOURNAL,EXRULE,NONE,ZEROPLUS
+NONE,VJOURNAL,FREEBUSY,NONE,ZERO
+NONE,VJOURNAL,GEO,NONE,ZERO
+NONE,VJOURNAL,LASTMODIFIED,NONE,ZEROORONE
+NONE,VJOURNAL,LOCATION,NONE,ZERO
+NONE,VJOURNAL,METHOD,NONE,ZERO
+NONE,VJOURNAL,ORGANIZER,NONE,ZEROORONE
+NONE,VJOURNAL,PERCENTCOMPLETE,NONE,ZERO
+NONE,VJOURNAL,PRIORITY,NONE,ZERO
+NONE,VJOURNAL,PRODID,NONE,ZERO
+NONE,VJOURNAL,RDATE,NONE,ZEROPLUS
+NONE,VJOURNAL,RECURRENCEID,NONE,ZEROORONE,must_be_recurring
+NONE,VJOURNAL,RELATEDTO,NONE,ZEROPLUS
+NONE,VJOURNAL,REPEAT,NONE,ZERO
+NONE,VJOURNAL,REQUESTSTATUS,NONE,ZEROPLUS
+NONE,VJOURNAL,RESOURCES,NONE,ZERO
+NONE,VJOURNAL,RRULE,NONE,ZEROPLUS
+NONE,VJOURNAL,SEQUENCE,NONE,ZEROORONE
+NONE,VJOURNAL,STATUS,NONE,ZEROORONE
+NONE,VJOURNAL,SUMMARY,NONE,ZEROORONE
+NONE,VJOURNAL,TRANSP,NONE,ZERO
+NONE,VJOURNAL,TRIGGER,NONE,ZERO
+NONE,VJOURNAL,TZID,NONE,ZERO
+NONE,VJOURNAL,TZNAME,NONE,ZERO
+NONE,VJOURNAL,TZOFFSETFROM,NONE,ZERO
+NONE,VJOURNAL,TZOFFSETTO,NONE,ZERO
+NONE,VJOURNAL,TZURL,NONE,ZERO
+NONE,VJOURNAL,UID,NONE,ZEROORONE
+NONE,VJOURNAL,URL,NONE,ZEROORONE
+NONE,VJOURNAL,VERSION,NONE,ZERO
+NONE,VJOURNAL,X,NONE,ZEROPLUS
+NONE,VFREEBUSY,ACTION,NONE,ZERO
+NONE,VFREEBUSY,ATTACH,NONE,ZERO
+NONE,VFREEBUSY,ATTENDEE,NONE,ZEROPLUS
+NONE,VFREEBUSY,CALSCALE,NONE,ZERO
+NONE,VFREEBUSY,CATEGORIES,NONE,ZERO
+NONE,VFREEBUSY,CLASS,NONE,ZERO
+NONE,VFREEBUSY,COMMENT,NONE,ZEROPLUS
+NONE,VFREEBUSY,COMPLETED,NONE,ZERO
+NONE,VFREEBUSY,CONTACT,NONE,ZEROORONE
+NONE,VFREEBUSY,CREATED,NONE,ZERO
+NONE,VFREEBUSY,DESCRIPTION,NONE,ZERO
+NONE,VFREEBUSY,DTEND,NONE,ZEROORONE
+NONE,VFREEBUSY,DTSTAMP,NONE,ZERO
+NONE,VFREEBUSY,DTSTART,NONE,ZEROORONE
+NONE,VFREEBUSY,DUE,NONE,ZERO
+NONE,VFREEBUSY,DURATION,NONE,ZEROORONE
+NONE,VFREEBUSY,EXDATE,NONE,ZERO
+NONE,VFREEBUSY,EXRULE,NONE,ZERO
+NONE,VFREEBUSY,FREEBUSY,NONE,ZEROPLUS
+NONE,VFREEBUSY,GEO,NONE,ZERO
+NONE,VFREEBUSY,LASTMODIFIED,NONE,ZERO
+NONE,VFREEBUSY,LOCATION,NONE,ZERO
+NONE,VFREEBUSY,METHOD,NONE,ZERO
+NONE,VFREEBUSY,ORGANIZER,NONE,ZEROORONE
+NONE,VFREEBUSY,PERCENTCOMPLETE,NONE,ZERO
+NONE,VFREEBUSY,PRIORITY,NONE,ZERO
+NONE,VFREEBUSY,PRODID,NONE,ZERO
+NONE,VFREEBUSY,RDATE,NONE,ZERO
+NONE,VFREEBUSY,RECURRENCEID,NONE,ZERO
+NONE,VFREEBUSY,RELATEDTO,NONE,ZERO
+NONE,VFREEBUSY,REPEAT,NONE,ZERO
+NONE,VFREEBUSY,REQUESTSTATUS,NONE,ZEROPLUS
+NONE,VFREEBUSY,RESOURCES,NONE,ZERO
+NONE,VFREEBUSY,RRULE,NONE,ZERO
+NONE,VFREEBUSY,SEQUENCE,NONE,ZERO
+NONE,VFREEBUSY,STATUS,NONE,ZERO
+NONE,VFREEBUSY,SUMMARY,NONE,ZERO
+NONE,VFREEBUSY,TRANSP,NONE,ZERO
+NONE,VFREEBUSY,TRIGGER,NONE,ZERO
+NONE,VFREEBUSY,TZID,NONE,ZERO
+NONE,VFREEBUSY,TZNAME,NONE,ZERO
+NONE,VFREEBUSY,TZOFFSETFROM,NONE,ZERO
+NONE,VFREEBUSY,TZOFFSETTO,NONE,ZERO
+NONE,VFREEBUSY,TZURL,NONE,ZERO
+NONE,VFREEBUSY,UID,NONE,ZEROORONE
+NONE,VFREEBUSY,URL,NONE,ZEROORONE
+NONE,VFREEBUSY,VERSION,NONE,ZERO
+NONE,VFREEBUSY,X,NONE,ZEROPLUS
+NONE,VTIMEZONE,ACTION,NONE,ZERO
+NONE,VTIMEZONE,ATTACH,NONE,ZERO
+NONE,VTIMEZONE,ATTENDEE,NONE,ZERO
+NONE,VTIMEZONE,CALSCALE,NONE,ZERO
+NONE,VTIMEZONE,CATEGORIES,NONE,ZERO
+NONE,VTIMEZONE,CLASS,NONE,ZERO
+NONE,VTIMEZONE,COMMENT,NONE,ZERO
+NONE,VTIMEZONE,COMPLETED,NONE,ZERO
+NONE,VTIMEZONE,CONTACT,NONE,ZERO
+NONE,VTIMEZONE,CREATED,NONE,ZERO
+NONE,VTIMEZONE,DESCRIPTION,NONE,ZERO
+NONE,VTIMEZONE,DTEND,NONE,ZERO
+NONE,VTIMEZONE,DTSTAMP,NONE,ZERO
+NONE,VTIMEZONE,DTSTART,NONE,ZERO
+NONE,VTIMEZONE,DUE,NONE,ZERO
+NONE,VTIMEZONE,DURATION,NONE,ZERO
+NONE,VTIMEZONE,EXDATE,NONE,ZERO
+NONE,VTIMEZONE,EXRULE,NONE,ZERO
+NONE,VTIMEZONE,FREEBUSY,NONE,ZERO
+NONE,VTIMEZONE,GEO,NONE,ZERO
+NONE,VTIMEZONE,LASTMODIFIED,NONE,ZEROORONE
+NONE,VTIMEZONE,LOCATION,NONE,ZERO
+NONE,VTIMEZONE,METHOD,NONE,ZERO
+NONE,VTIMEZONE,ORGANIZER,NONE,ZERO
+NONE,VTIMEZONE,PERCENTCOMPLETE,NONE,ZERO
+NONE,VTIMEZONE,PRIORITY,NONE,ZERO
+NONE,VTIMEZONE,PRODID,NONE,ZERO
+NONE,VTIMEZONE,RDATE,NONE,ZERO
+NONE,VTIMEZONE,RECURRENCEID,NONE,ZERO
+NONE,VTIMEZONE,RELATEDTO,NONE,ZERO
+NONE,VTIMEZONE,REPEAT,NONE,ZERO
+NONE,VTIMEZONE,REQUESTSTATUS,NONE,ZERO
+NONE,VTIMEZONE,RESOURCES,NONE,ZERO
+NONE,VTIMEZONE,RRULE,NONE,ZERO
+NONE,VTIMEZONE,SEQUENCE,NONE,ZERO
+NONE,VTIMEZONE,STATUS,NONE,ZERO
+NONE,VTIMEZONE,SUMMARY,NONE,ZERO
+NONE,VTIMEZONE,TRANSP,NONE,ZERO
+NONE,VTIMEZONE,TRIGGER,NONE,ZERO
+NONE,VTIMEZONE,TZID,NONE,ONE
+NONE,VTIMEZONE,TZNAME,NONE,ZERO
+NONE,VTIMEZONE,TZOFFSETFROM,NONE,ZERO
+NONE,VTIMEZONE,TZOFFSETTO,NONE,ZERO
+NONE,VTIMEZONE,TZURL,NONE,ZEROPLUS
+NONE,VTIMEZONE,UID,NONE,ZERO
+NONE,VTIMEZONE,URL,NONE,ZERO
+NONE,VTIMEZONE,VERSION,NONE,ZERO
+NONE,VTIMEZONE,X,NONE,ZEROORONE
+NONE,VTIMEZONE,NONE,XSTANDARD,ZEROPLUS
+NONE,VTIMEZONE,NONE,XDAYLIGHT,ZEROPLUS
+NONE,XSTANDARD,ACTION,NONE,ZERO
+NONE,XSTANDARD,ATTACH,NONE,ZERO
+NONE,XSTANDARD,ATTENDEE,NONE,ZERO
+NONE,XSTANDARD,CALSCALE,NONE,ZERO
+NONE,XSTANDARD,CATEGORIES,NONE,ZERO
+NONE,XSTANDARD,CLASS,NONE,ZERO
+NONE,XSTANDARD,COMMENT,NONE,ZEROPLUS
+NONE,XSTANDARD,COMPLETED,NONE,ZERO
+NONE,XSTANDARD,CONTACT,NONE,ZERO
+NONE,XSTANDARD,CREATED,NONE,ZERO
+NONE,XSTANDARD,DESCRIPTION,NONE,ZERO
+NONE,XSTANDARD,DTEND,NONE,ZERO
+NONE,XSTANDARD,DTSTAMP,NONE,ZERO
+NONE,XSTANDARD,DTSTART,NONE,ONE
+NONE,XSTANDARD,DUE,NONE,ZERO
+NONE,XSTANDARD,DURATION,NONE,ZERO
+NONE,XSTANDARD,EXDATE,NONE,ZERO
+NONE,XSTANDARD,EXRULE,NONE,ZERO
+NONE,XSTANDARD,FREEBUSY,NONE,ZERO
+NONE,XSTANDARD,GEO,NONE,ZERO
+NONE,XSTANDARD,LASTMODIFIED,NONE,ZERO
+NONE,XSTANDARD,LOCATION,NONE,ZERO
+NONE,XSTANDARD,METHOD,NONE,ZERO
+NONE,XSTANDARD,ORGANIZER,NONE,ZERO
+NONE,XSTANDARD,PERCENTCOMPLETE,NONE,ZERO
+NONE,XSTANDARD,PRIORITY,NONE,ZERO
+NONE,XSTANDARD,PRODID,NONE,ZERO
+NONE,XSTANDARD,RDATE,NONE,ZEROPLUS
+NONE,XSTANDARD,RECURRENCEID,NONE,ZERO
+NONE,XSTANDARD,RELATEDTO,NONE,ZERO
+NONE,XSTANDARD,REPEAT,NONE,ZERO
+NONE,XSTANDARD,REQUESTSTATUS,NONE,ZERO
+NONE,XSTANDARD,RESOURCES,NONE,ZERO
+NONE,XSTANDARD,RRULE,NONE,ZEROPLUS
+NONE,XSTANDARD,SEQUENCE,NONE,ZERO
+NONE,XSTANDARD,STATUS,NONE,ZERO
+NONE,XSTANDARD,SUMMARY,NONE,ZERO
+NONE,XSTANDARD,TRANSP,NONE,ZERO
+NONE,XSTANDARD,TRIGGER,NONE,ZERO
+NONE,XSTANDARD,TZID,NONE,ZERO
+NONE,XSTANDARD,TZNAME,NONE,ZEROPLUS
+NONE,XSTANDARD,TZOFFSETFROM,NONE,ONE
+NONE,XSTANDARD,TZOFFSETTO,NONE,ONE
+NONE,XSTANDARD,TZURL,NONE,ZERO
+NONE,XSTANDARD,UID,NONE,ZERO
+NONE,XSTANDARD,URL,NONE,ZERO
+NONE,XSTANDARD,VERSION,NONE,ZERO
+NONE,XSTANDARD,X,NONE,ZEROPLUS
+NONE,XDAYLIGHT,ACTION,NONE,ZERO
+NONE,XDAYLIGHT,ATTACH,NONE,ZERO
+NONE,XDAYLIGHT,ATTENDEE,NONE,ZERO
+NONE,XDAYLIGHT,CALSCALE,NONE,ZERO
+NONE,XDAYLIGHT,CATEGORIES,NONE,ZERO
+NONE,XDAYLIGHT,CLASS,NONE,ZERO
+NONE,XDAYLIGHT,COMMENT,NONE,ZEROPLUS
+NONE,XDAYLIGHT,COMPLETED,NONE,ZERO
+NONE,XDAYLIGHT,CONTACT,NONE,ZERO
+NONE,XDAYLIGHT,CREATED,NONE,ZERO
+NONE,XDAYLIGHT,DESCRIPTION,NONE,ZERO
+NONE,XDAYLIGHT,DTEND,NONE,ZERO
+NONE,XDAYLIGHT,DTSTAMP,NONE,ZERO
+NONE,XDAYLIGHT,DTSTART,NONE,ONE
+NONE,XDAYLIGHT,DUE,NONE,ZERO
+NONE,XDAYLIGHT,DURATION,NONE,ZERO
+NONE,XDAYLIGHT,EXDATE,NONE,ZERO
+NONE,XDAYLIGHT,EXRULE,NONE,ZERO
+NONE,XDAYLIGHT,FREEBUSY,NONE,ZERO
+NONE,XDAYLIGHT,GEO,NONE,ZERO
+NONE,XDAYLIGHT,LASTMODIFIED,NONE,ZERO
+NONE,XDAYLIGHT,LOCATION,NONE,ZERO
+NONE,XDAYLIGHT,METHOD,NONE,ZERO
+NONE,XDAYLIGHT,ORGANIZER,NONE,ZERO
+NONE,XDAYLIGHT,PERCENTCOMPLETE,NONE,ZERO
+NONE,XDAYLIGHT,PRIORITY,NONE,ZERO
+NONE,XDAYLIGHT,PRODID,NONE,ZERO
+NONE,XDAYLIGHT,RDATE,NONE,ZEROPLUS
+NONE,XDAYLIGHT,RECURRENCEID,NONE,ZERO
+NONE,XDAYLIGHT,RELATEDTO,NONE,ZERO
+NONE,XDAYLIGHT,REPEAT,NONE,ZERO
+NONE,XDAYLIGHT,REQUESTSTATUS,NONE,ZERO
+NONE,XDAYLIGHT,RESOURCES,NONE,ZERO
+NONE,XDAYLIGHT,RRULE,NONE,ZEROPLUS
+NONE,XDAYLIGHT,SEQUENCE,NONE,ZERO
+NONE,XDAYLIGHT,STATUS,NONE,ZERO
+NONE,XDAYLIGHT,SUMMARY,NONE,ZERO
+NONE,XDAYLIGHT,TRANSP,NONE,ZERO
+NONE,XDAYLIGHT,TRIGGER,NONE,ZERO
+NONE,XDAYLIGHT,TZID,NONE,ZERO
+NONE,XDAYLIGHT,TZNAME,NONE,ZEROPLUS
+NONE,XDAYLIGHT,TZOFFSETFROM,NONE,ONE
+NONE,XDAYLIGHT,TZOFFSETTO,NONE,ONE
+NONE,XDAYLIGHT,TZURL,NONE,ZERO
+NONE,XDAYLIGHT,UID,NONE,ZERO
+NONE,XDAYLIGHT,URL,NONE,ZERO
+NONE,XDAYLIGHT,VERSION,NONE,ZERO
+NONE,XDAYLIGHT,X,NONE,ZEROPLUS
+NONE,XAUDIOALARM,ACTION,NONE,ONE
+NONE,XAUDIOALARM,ATTACH,NONE,ZEROORONE
+NONE,XAUDIOALARM,ATTENDEE,NONE,ZERO
+NONE,XAUDIOALARM,CALSCALE,NONE,ZERO
+NONE,XAUDIOALARM,CATEGORIES,NONE,ZERO
+NONE,XAUDIOALARM,CLASS,NONE,ZERO
+NONE,XAUDIOALARM,COMMENT,NONE,ZERO
+NONE,XAUDIOALARM,COMPLETED,NONE,ZERO
+NONE,XAUDIOALARM,CONTACT,NONE,ZERO
+NONE,XAUDIOALARM,CREATED,NONE,ZERO
+NONE,XAUDIOALARM,DESCRIPTION,NONE,ZERO
+NONE,XAUDIOALARM,DTEND,NONE,ZERO
+NONE,XAUDIOALARM,DTSTAMP,NONE,ZERO
+NONE,XAUDIOALARM,DTSTART,NONE,ZERO
+NONE,XAUDIOALARM,DUE,NONE,ZERO
+NONE,XAUDIOALARM,DURATION,NONE,ONEMUTUAL,must_have_repeat
+NONE,XAUDIOALARM,REPEAT,NONE,ONEMUTUAL,must_have_duration
+NONE,XAUDIOALARM,EXDATE,NONE,ZERO
+NONE,XAUDIOALARM,EXRULE,NONE,ZERO
+NONE,XAUDIOALARM,FREEBUSY,NONE,ZERO
+NONE,XAUDIOALARM,GEO,NONE,ZERO
+NONE,XAUDIOALARM,LASTMODIFIED,NONE,ZERO
+NONE,XAUDIOALARM,LOCATION,NONE,ZERO
+NONE,XAUDIOALARM,METHOD,NONE,ZERO
+NONE,XAUDIOALARM,ORGANIZER,NONE,ZERO
+NONE,XAUDIOALARM,PERCENTCOMPLETE,NONE,ZERO
+NONE,XAUDIOALARM,PRIORITY,NONE,ZERO
+NONE,XAUDIOALARM,PRODID,NONE,ZERO
+NONE,XAUDIOALARM,RDATE,NONE,ZERO
+NONE,XAUDIOALARM,RECURRENCEID,NONE,ZERO
+NONE,XAUDIOALARM,RELATEDTO,NONE,ZERO
+NONE,XAUDIOALARM,REQUESTSTATUS,NONE,ZERO
+NONE,XAUDIOALARM,RESOURCES,NONE,ZERO
+NONE,XAUDIOALARM,RRULE,NONE,ZERO
+NONE,XAUDIOALARM,SEQUENCE,NONE,ZERO
+NONE,XAUDIOALARM,STATUS,NONE,ZERO
+NONE,XAUDIOALARM,SUMMARY,NONE,ZERO
+NONE,XAUDIOALARM,TRANSP,NONE,ZERO
+NONE,XAUDIOALARM,TRIGGER,NONE,ONE
+NONE,XAUDIOALARM,TZID,NONE,ZERO
+NONE,XAUDIOALARM,TZNAME,NONE,ZERO
+NONE,XAUDIOALARM,TZOFFSETFROM,NONE,ZERO
+NONE,XAUDIOALARM,TZOFFSETTO,NONE,ZERO
+NONE,XAUDIOALARM,TZURL,NONE,ZERO
+NONE,XAUDIOALARM,UID,NONE,ZERO
+NONE,XAUDIOALARM,URL,NONE,ZERO
+NONE,XAUDIOALARM,VERSION,NONE,ZERO
+NONE,XAUDIOALARM,X,NONE,ZEROPLUS
+NONE,XDISPLAYALARM,ACTION,NONE,ONE
+NONE,XDISPLAYALARM,ATTACH,NONE,ZERO
+NONE,XDISPLAYALARM,ATTENDEE,NONE,ZERO
+NONE,XDISPLAYALARM,CALSCALE,NONE,ZERO
+NONE,XDISPLAYALARM,CATEGORIES,NONE,ZERO
+NONE,XDISPLAYALARM,CLASS,NONE,ZERO
+NONE,XDISPLAYALARM,COMMENT,NONE,ZERO
+NONE,XDISPLAYALARM,COMPLETED,NONE,ZERO
+NONE,XDISPLAYALARM,CONTACT,NONE,ZERO
+NONE,XDISPLAYALARM,CREATED,NONE,ZERO
+NONE,XDISPLAYALARM,DESCRIPTION,NONE,ONE
+NONE,XDISPLAYALARM,DTEND,NONE,ZERO
+NONE,XDISPLAYALARM,DTSTAMP,NONE,ZERO
+NONE,XDISPLAYALARM,DTSTART,NONE,ZERO
+NONE,XDISPLAYALARM,DUE,NONE,ZERO
+NONE,XDISPLAYALARM,DURATION,NONE,ONEMUTUAL,must_have_repeat
+NONE,XDISPLAYALARM,REPEAT,NONE,ONEMUTUAL,must_have_duration
+NONE,XDISPLAYALARM,EXDATE,NONE,ZERO
+NONE,XDISPLAYALARM,EXRULE,NONE,ZERO
+NONE,XDISPLAYALARM,FREEBUSY,NONE,ZERO
+NONE,XDISPLAYALARM,GEO,NONE,ZERO
+NONE,XDISPLAYALARM,LASTMODIFIED,NONE,ZERO
+NONE,XDISPLAYALARM,LOCATION,NONE,ZERO
+NONE,XDISPLAYALARM,METHOD,NONE,ZERO
+NONE,XDISPLAYALARM,ORGANIZER,NONE,ZERO
+NONE,XDISPLAYALARM,PERCENTCOMPLETE,NONE,ZERO
+NONE,XDISPLAYALARM,PRIORITY,NONE,ZERO
+NONE,XDISPLAYALARM,PRODID,NONE,ZERO
+NONE,XDISPLAYALARM,RDATE,NONE,ZERO
+NONE,XDISPLAYALARM,RECURRENCEID,NONE,ZERO
+NONE,XDISPLAYALARM,RELATEDTO,NONE,ZERO
+NONE,XDISPLAYALARM,REQUESTSTATUS,NONE,ZERO
+NONE,XDISPLAYALARM,RESOURCES,NONE,ZERO
+NONE,XDISPLAYALARM,RRULE,NONE,ZERO
+NONE,XDISPLAYALARM,SEQUENCE,NONE,ZERO
+NONE,XDISPLAYALARM,STATUS,NONE,ZERO
+NONE,XDISPLAYALARM,SUMMARY,NONE,ZERO
+NONE,XDISPLAYALARM,TRANSP,NONE,ZERO
+NONE,XDISPLAYALARM,TRIGGER,NONE,ONE
+NONE,XDISPLAYALARM,TZID,NONE,ZERO
+NONE,XDISPLAYALARM,TZNAME,NONE,ZERO
+NONE,XDISPLAYALARM,TZOFFSETFROM,NONE,ZERO
+NONE,XDISPLAYALARM,TZOFFSETTO,NONE,ZERO
+NONE,XDISPLAYALARM,TZURL,NONE,ZERO
+NONE,XDISPLAYALARM,UID,NONE,ZERO
+NONE,XDISPLAYALARM,URL,NONE,ZERO
+NONE,XDISPLAYALARM,VERSION,NONE,ZERO
+NONE,XDISPLAYALARM,X,NONE,ZEROPLUS
+NONE,XEMAILALARM,ACTION,NONE,ONE,must_be_email
+NONE,XEMAILALARM,ATTACH,NONE,ZEROPLUS
+NONE,XEMAILALARM,ATTENDEE,NONE,ONEPLUS
+NONE,XEMAILALARM,CALSCALE,NONE,ZERO
+NONE,XEMAILALARM,CATEGORIES,NONE,ZERO
+NONE,XEMAILALARM,CLASS,NONE,ZERO
+NONE,XEMAILALARM,COMMENT,NONE,ZERO
+NONE,XEMAILALARM,COMPLETED,NONE,ZERO
+NONE,XEMAILALARM,CONTACT,NONE,ZERO
+NONE,XEMAILALARM,CREATED,NONE,ZERO
+NONE,XEMAILALARM,DESCRIPTION,NONE,ONE
+NONE,XEMAILALARM,DTEND,NONE,ZERO
+NONE,XEMAILALARM,DTSTAMP,NONE,ZERO
+NONE,XEMAILALARM,DTSTART,NONE,ZERO
+NONE,XEMAILALARM,DUE,NONE,ZERO
+NONE,XEMAILALARM,DURATION,NONE,ONEMUTUAL,must_have_repeat
+NONE,XEMAILALARM,REPEAT,NONE,ONEMUTUAL,must_have_duration
+NONE,XEMAILALARM,EXDATE,NONE,ZERO
+NONE,XEMAILALARM,EXRULE,NONE,ZERO
+NONE,XEMAILALARM,FREEBUSY,NONE,ZERO
+NONE,XEMAILALARM,GEO,NONE,ZERO
+NONE,XEMAILALARM,LASTMODIFIED,NONE,ZERO
+NONE,XEMAILALARM,LOCATION,NONE,ZERO
+NONE,XEMAILALARM,METHOD,NONE,ZERO
+NONE,XEMAILALARM,ORGANIZER,NONE,ZERO
+NONE,XEMAILALARM,PERCENTCOMPLETE,NONE,ZERO
+NONE,XEMAILALARM,PRIORITY,NONE,ZERO
+NONE,XEMAILALARM,PRODID,NONE,ZERO
+NONE,XEMAILALARM,RDATE,NONE,ZERO
+NONE,XEMAILALARM,RECURRENCEID,NONE,ZERO
+NONE,XEMAILALARM,RELATEDTO,NONE,ZERO
+NONE,XEMAILALARM,REQUESTSTATUS,NONE,ZERO
+NONE,XEMAILALARM,RESOURCES,NONE,ZERO
+NONE,XEMAILALARM,RRULE,NONE,ZERO
+NONE,XEMAILALARM,SEQUENCE,NONE,ZERO
+NONE,XEMAILALARM,STATUS,NONE,ZERO
+NONE,XEMAILALARM,SUMMARY,NONE,ONE
+NONE,XEMAILALARM,TRANSP,NONE,ZERO
+NONE,XEMAILALARM,TRIGGER,NONE,ONE
+NONE,XEMAILALARM,TZID,NONE,ZERO
+NONE,XEMAILALARM,TZNAME,NONE,ZERO
+NONE,XEMAILALARM,TZOFFSETFROM,NONE,ZERO
+NONE,XEMAILALARM,TZOFFSETTO,NONE,ZERO
+NONE,XEMAILALARM,TZURL,NONE,ZERO
+NONE,XEMAILALARM,UID,NONE,ZERO
+NONE,XEMAILALARM,URL,NONE,ZERO
+NONE,XEMAILALARM,VERSION,NONE,ZERO
+NONE,XEMAILALARM,X,NONE,ZEROPLUS
+NONE,XPROCEDUREALARM,ACTION,NONE,ONE
+NONE,XPROCEDUREALARM,ATTACH,NONE,ZEROORONE
+NONE,XPROCEDUREALARM,ATTENDEE,NONE,ZERO
+NONE,XPROCEDUREALARM,CALSCALE,NONE,ZERO
+NONE,XPROCEDUREALARM,CATEGORIES,NONE,ZERO
+NONE,XPROCEDUREALARM,CLASS,NONE,ZERO
+NONE,XPROCEDUREALARM,COMMENT,NONE,ZERO
+NONE,XPROCEDUREALARM,COMPLETED,NONE,ZERO
+NONE,XPROCEDUREALARM,CONTACT,NONE,ZERO
+NONE,XPROCEDUREALARM,CREATED,NONE,ZERO
+NONE,XPROCEDUREALARM,DESCRIPTION,NONE,ZEROORONE
+NONE,XPROCEDUREALARM,DTEND,NONE,ZERO
+NONE,XPROCEDUREALARM,DTSTAMP,NONE,ZERO
+NONE,XPROCEDUREALARM,DTSTART,NONE,ZERO
+NONE,XPROCEDUREALARM,DUE,NONE,ZERO
+NONE,XPROCEDUREALARM,DURATION,NONE,ONEMUTUAL,must_have_repeat
+NONE,XPROCEDUREALARM,REPEAT,NONE,ONEMUTUAL,must_have_duration
+NONE,XPROCEDUREALARM,EXDATE,NONE,ZERO
+NONE,XPROCEDUREALARM,EXRULE,NONE,ZERO
+NONE,XPROCEDUREALARM,FREEBUSY,NONE,ZERO
+NONE,XPROCEDUREALARM,GEO,NONE,ZERO
+NONE,XPROCEDUREALARM,LASTMODIFIED,NONE,ZERO
+NONE,XPROCEDUREALARM,LOCATION,NONE,ZERO
+NONE,XPROCEDUREALARM,METHOD,NONE,ZERO
+NONE,XPROCEDUREALARM,ORGANIZER,NONE,ZERO
+NONE,XPROCEDUREALARM,PERCENTCOMPLETE,NONE,ZERO
+NONE,XPROCEDUREALARM,PRIORITY,NONE,ZERO
+NONE,XPROCEDUREALARM,PRODID,NONE,ZERO
+NONE,XPROCEDUREALARM,RDATE,NONE,ZERO
+NONE,XPROCEDUREALARM,RECURRENCEID,NONE,ZERO
+NONE,XPROCEDUREALARM,RELATEDTO,NONE,ZERO
+NONE,XPROCEDUREALARM,REQUESTSTATUS,NONE,ZERO
+NONE,XPROCEDUREALARM,RESOURCES,NONE,ZERO
+NONE,XPROCEDUREALARM,RRULE,NONE,ZERO
+NONE,XPROCEDUREALARM,SEQUENCE,NONE,ZERO
+NONE,XPROCEDUREALARM,STATUS,NONE,ZERO
+NONE,XPROCEDUREALARM,SUMMARY,NONE,ZERO
+NONE,XPROCEDUREALARM,TRANSP,NONE,ZERO
+NONE,XPROCEDUREALARM,TRIGGER,NONE,ONE
+NONE,XPROCEDUREALARM,TZID,NONE,ZERO
+NONE,XPROCEDUREALARM,TZNAME,NONE,ZERO
+NONE,XPROCEDUREALARM,TZOFFSETFROM,NONE,ZERO
+NONE,XPROCEDUREALARM,TZOFFSETTO,NONE,ZERO
+NONE,XPROCEDUREALARM,TZURL,NONE,ZERO
+NONE,XPROCEDUREALARM,UID,NONE,ZERO
+NONE,XPROCEDUREALARM,URL,NONE,ZERO
+NONE,XPROCEDUREALARM,VERSION,NONE,ZERO
+NONE,XPROCEDUREALARM,X,NONE,ZEROPLUS
+NONE,VQUERY,QUERY,NONE,ZEROORONE
+NONE,VQUERY,QUERYNAME,NONE,ONE
+NONE,VQUERY,EXPAND,NONE,ONE
diff --git a/libkcal/libical/design-data/status.txt b/libkcal/libical/design-data/status.txt
new file mode 100644
index 00000000..9e7bbf83
--- /dev/null
+++ b/libkcal/libical/design-data/status.txt
@@ -0,0 +1,56 @@
+2.0 STATOK Operation was successfully performed.
+2.0.1 STARTSENDATA Start ICAL input; end with <CRLF>.<CRLF>
+2.0.11 OKDATAFOLLOWS The request was processed successfully. Reply data follows on the next line and terminates with <CRLF>.<CRLF>
+2.0.2 REPLYPENDING A timeout has occurred. The server is still working on the reply. Use CONTINUE to continue waiting for the reply or ABORT to terminate the command.
+2.0.3 ABORTED The command currently underway was successsfully aborted.
+2.0.4 WILLATTEMPT The specified Calendar is not here but an attempt will be made to deliver the request or reply to the Calendar anyway.
+2.0.5 TRUSTEDWILLQUEUE The request or reply will be queued and delivered to the target calendar when its iRIP server contacts this server and issues the SWITCH command.
+2.0.6 WILLATTEMPT The specified Calendar is not here but an attempt will be made to deliver the request or reply to the Calendar anyway.
+2.0.7 QUEUED The message has been queued for delivery.
+2.0.8 QUEUEEMPTY There are no more queued messages.
+2.1 FALLBACK Success. Fallback taken on one or more property values.
+2.2 NOCOMMANDINPROGRESS An ABORT or CONTINUE was received when no command was in progress
+2.2 IGPROP Success. Invalid property ignored.
+2.3 IGPARAM Success. invalid property parameter ignored.
+2.4 IGXPROP Success. Unknown non-standard property ignored.
+2.5 IGXPARAM Success. Unknown non standard property value ignored.
+2.6 IGCOMP Success. Invalid calendar component ignored.
+2.7 FORWARD Success. Request forwarded to Calendar User.
+2.8 ONEEVENT Success. Repeating event ignored. Scheduled as a single component.
+2.9 TRUNC Success. Truncated end date time to date boundary.
+2.10 ONETODO Success. Repeating VTODO ignored. Scheduled as a single VTODO.
+2.11 TRUNCRRULE Success. Unbounded RRULE clipped at some finite number of instances
+3.0 INVPROPNAME Invalid property name.
+3.1 INVPROPVAL Invalid property value.
+3.2 INVPARAM Invalid property parameter.
+3.3 INVPARAMVAL Invalid property parameter value.
+3.4 INVCOMP Invalid calendar component sequence.
+3.5 INVTIME Invalid date or time.
+3.6 INVRULE Invalid rule.
+3.7 INVCU Invalid Calendar User.
+3.8 NOAUTH No authority.
+3.9 BADVERSION Unsupported version.
+3.10 TOOBIG Request entity too large.
+3.11 MISSREQCOMP Required component or property missing.
+3.12 UNKCOMP Unknown component or property found.
+3.13 BADCOMP Unsupported component or property found
+3.14 NOCAP Unsupported capability.
+4.0 BUSY Event conflict. Date/time is busy.
+5.0 MAYBE Request MAY supported.
+5.1 UNAVAIL Service unavailable.
+5.2 NOSERVICE Invalid calendar service.
+5.3 NOSCHED No scheduling support for user.
+6.1 AUTHENTICATEFAILURE Unsupported authentication mechanism, credentials rejected
+6.2 AUTHENTICATIONABORTED Sender aborted authentication, authentication exchange cancelled
+8.0 GENERALFAILURE A failure has occurred in the Receiver that prevents the operation from succeeding.
+8.1 SERVERTOOBUSY The iRIP Receiver is too busy.
+8.2 ICALOBJECTTOOBIG Object has exceeded the server's size limit.
+8.3 DATETOOLARGE A DATETIME value was too far in the future to be represented on this Calendar.
+8.4 DATETOOSMALL A DATETIME value was too far in the past to be represented on this Calendar.
+9.0 INVALIDIRIPCOMMAND An unrecongnized command was received.
+9.1 UNEXPECTEDCOMMAND The command is not allowed for the server's current state.
+10.1 REFERRAL Accompanied by an alternate address.
+10.2 SERVERSHUTDOWN The server is shutting down.
+10.3 SERVERSTOPPING FLOOD 2
+10.4 EXCEEDEDQUOTAS The operation would cause a resource to exceed the allocated quota
+10.5 QUEUEDTOOLONG The ITIP message has been queued too long. Delivery has been aborted.
diff --git a/libkcal/libical/design-data/value-types.csv b/libkcal/libical/design-data/value-types.csv
new file mode 100644
index 00000000..feb5c476
--- /dev/null
+++ b/libkcal/libical/design-data/value-types.csv
@@ -0,0 +1,31 @@
+"#Name","C type& gen flag","Python","Component Values","Enum Values"
+"BINARY","(a)const char*","file","unitary",
+"BOOLEAN","(a)int","integer","unitary",
+"CAL-ADDRESS","(a)const char*","string","unitary",
+"DATE","(a)struct icaltimetype","Time","unitary",
+"DATE-TIME","(a)struct icaltimetype","Time","unitary",
+"DURATION","(a)struct icaldurationtype","Duration","unitary",
+"FLOAT","(a)float","float","unitary",
+"INTEGER","(a)int","integer","unitary",
+"PERIOD","(a)struct icalperiodtype","Period","unitary",
+"RECUR","(m)struct icalrecurrencetype","RecurrenceSet","unitary",
+"TEXT","(a)const char*","string","unitary",
+"URI","(a)const char*","string","unitary",
+"UTC-OFFSET","(a)int","integer","unitary",
+"QUERY","(a)const char*","string","unitary",
+"#Non-standard multi-valued types",,,,
+"ATTACH","(m)icalattach *","none","URI;BINARY",
+"DATE-TIME-PERIOD","(m)struct icaldatetimeperiodtype","none","DATE-TIME;PERIOD",
+"TRIGGER","(m)struct icaltriggertype","string","DURATION;DATE-TIME",
+"#Non-standard property enumeration types",,,,
+"METHOD","(a)enum icalproperty_method","string","unitary","PUBLISH;REQUEST;REPLY;ADD;CANCEL;REFRESH;COUNTER;DECLINECOUNTER;CREATE;READ;RESPONSE;MOVE;MODIFY;GENERATEUID;DELETE"
+"X-LIC-CLASS","(a)enum icalproperty_xlicclass","string","unitary","PUBLISH-NEW;PUBLISH-UPDATE;PUBLISH-FREEBUSY;REQUEST-NEW;REQUEST-UPDATE;REQUEST-RESCHEDULE;REQUEST-DELEGATE;REQUEST-NEW-ORGANIZER;REQUEST-FORWARD;REQUEST-STATUS;REQUEST-FREEBUSY;REPLY-ACCEPT;REPLY-DECLINE;REPLY-DELEGATE;REPLY-CRASHER-ACCEPT;REPLY-CRASHER-DECLINE;ADD-INSTANCE;CANCEL-EVENT;CANCEL-INSTANCE;CANCEL-ALL;REFRESH;COUNTER;DECLINECOUNTER;MALFORMED;OBSOLETE;MISSEQUENCED;UNKNOWN"
+"ACTION","(a)enum icalproperty_action","string","unitary","AUDIO;DISPLAY;EMAIL;PROCEDURE"
+"STATUS","(a)enum icalproperty_status","string","unitary","TENTATIVE;CONFIRMED;COMPLETED;NEEDS-ACTION;CANCELLED;IN-PROCESS;DRAFT;FINAL"
+"TRANSP","(a)enum icalproperty_transp","string","unitary","OPAQUE;OPAQUE-NOCONFLICT;TRANSPARENT;TRANSPARENT-NOCONFLICT"
+"CLASS","(a)enum icalproperty_class","string","unitary","PUBLIC;PRIVATE;CONFIDENTIAL"
+"#Other non-standard",,,,
+"REQUEST-STATUS","(a)struct icalreqstattype","string","unitary"
+"GEO","(a)struct icalgeotype","tuple","unitary",
+"STRING","(a)const char*","string","unitary",
+"X","(m)const char*","string","unitary",
diff --git a/libkcal/libical/doc/Makefile.am b/libkcal/libical/doc/Makefile.am
new file mode 100644
index 00000000..70b008a3
--- /dev/null
+++ b/libkcal/libical/doc/Makefile.am
@@ -0,0 +1 @@
+EXTRA_DIST = UsingLibical.lyx UsingLibical.ps UsingLibical.txt
diff --git a/libkcal/libical/doc/UsingLibical.lyx b/libkcal/libical/doc/UsingLibical.lyx
new file mode 100644
index 00000000..c29a61f6
--- /dev/null
+++ b/libkcal/libical/doc/UsingLibical.lyx
@@ -0,0 +1,2578 @@
+#LyX 1.1 created this file. For more info see http://www.lyx.org/
+\lyxformat 2.16
+\textclass article
+\language default
+\inputencoding latin1
+\fontscheme default
+\graphics default
+\paperfontsize default
+\spacing single
+\papersize Default
+\paperpackage a4
+\use_geometry 0
+\use_amsmath 0
+\paperorientation portrait
+\secnumdepth 3
+\tocdepth 3
+\paragraph_separation indent
+\defskip medskip
+\quotes_language english
+\quotes_times 2
+\papercolumns 1
+\papersides 1
+\paperpagestyle default
+
+\layout Title
+
+Using Libical
+\layout Author
+
+Eric Busboom (eric@softwarestudio.org)
+\layout Date
+
+January 2001
+\layout Standard
+
+
+\begin_inset LatexCommand \tableofcontents{}
+
+\end_inset
+
+
+\layout Section
+
+Introduction
+\layout Standard
+
+Libical is an Open Source implementation of the iCalendar protocols and
+ protocol data units.
+ The iCalendar specification describes how calendar clients can communicate
+ with calendar servers so users can store their calendar data and arrange
+ meetings with other users.
+
+\layout Standard
+
+Libical implements RFC2445, RFC2446 and some of RFC2447 and the CAP draft.
+
+\layout Standard
+
+This documentation assumes that you are familiar with the iCalendar standards
+ RFC2445 and RFC2446.
+ these specifications are online on the CALSCH webpage at:
+\layout LyX-Code
+
+http://www.imc.org/ietf-calendar/
+\layout Subsection
+
+The libical project
+\layout Standard
+
+This code is under active development.
+ If you would like to contribute to the project, you can contact me, Eric
+ Busboom, at eric@softwarestudio.org.
+ The project has a webpage at
+\layout LyX-Code
+
+http://softwarestudio.org/libical/index.html
+\layout Standard
+
+and a mailing list that you can join by sending the following mail:
+\layout LyX-Code
+
+To: minimalist@softwarestudio.org
+\layout LyX-Code
+
+Subject: subscribe libical
+\layout Subsection
+
+License
+\layout Standard
+
+The code and datafiles in this distribution are licensed under the Mozilla
+ Public License.
+ See http://www.mozilla.org/NPL/MPL-1.0.html for a copy of the license.
+ Alternately, you may use libical under the terms of the GNU Library General
+ Public License.
+ See http://www.fsf.org/copyleft/lesser.html for a copy of the LGPL.
+\layout Standard
+
+This dual license ensures that the library can be incorporated into both
+ proprietary code and GPL'd programs, and will benefit from improvements
+ made by programmers in both realms.
+ I will only accept changes into my version of the library if they are similarly
+ dual-licensed.
+\layout Subsection
+
+Example Code
+\layout Standard
+
+A lot of the documentation for this library is in the form of example code.
+ These examples are in the
+\begin_inset Quotes eld
+\end_inset
+
+examples
+\begin_inset Quotes erd
+\end_inset
+
+ directory of the distribution.
+ Also look in
+\begin_inset Quotes eld
+\end_inset
+
+src/test
+\begin_inset Quotes erd
+\end_inset
+
+ for additional annotated examples.
+
+\layout Section
+
+Building and Installing the Library
+\layout Standard
+
+Libical uses autoconf to generate makefiles.
+ It should built with no adjustments on Linux, FreeBSD and Solaris under
+ gcc.
+ Some version have been successfully been build on MacOS, Solaris, UnixWare,
+ And Tru64 UNIX without gcc, but you may run into problems with a particular
+ later version.
+
+\layout Standard
+
+For a more complete guide to building the library, see the README file in
+ the distribution.
+
+\layout Standard
+
+
+\begin_inset Quotes eld
+\end_inset
+
+make install
+\begin_inset Quotes erd
+\end_inset
+
+ will install the libraries and header files for three modules: libical,
+ libicalss.
+ and libicalvcal.
+ If you build shared objects, then these files will be installed:
+\layout Itemize
+
+ical.h
+\layout Itemize
+
+libical.a
+\layout Itemize
+
+libical.so
+\layout Itemize
+
+icalss.h
+\layout Itemize
+
+libicalss.a
+\layout Itemize
+
+libicalss.so
+\layout Itemize
+
+icalvcal.h
+\layout Itemize
+
+libicalvcal.a
+\layout Itemize
+
+libicalvcal.so
+\layout Standard
+
+The header files ical.h and icalss.h are combined header files, generated
+ by concatenating together all of the header files in src/libical and src/libica
+lss respectively.
+
+\layout Section
+
+Structure
+\layout Standard
+
+The iCal calendar model is based on four types of objects: components, propertie
+s, values and parameters.
+
+\layout Standard
+
+Properties are the fundamental unit of information in iCal, and they work
+ a bit like a hash entry, with a constant key and a variable value.
+ Properties may also have modifiers, called parameters.
+ In the iCal content line
+\layout LyX-Code
+
+ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com
+\layout Standard
+
+The property name is
+\begin_inset Quotes eld
+\end_inset
+
+ORGANIZER,
+\begin_inset Quotes erd
+\end_inset
+
+ the value of the property is
+\begin_inset Quotes eld
+\end_inset
+
+mrbig@host.com
+\begin_inset Quotes erd
+\end_inset
+
+ and the
+\begin_inset Quotes eld
+\end_inset
+
+ROLE
+\begin_inset Quotes erd
+\end_inset
+
+ parameter specifies that Mr Big is the chair of the meetings associated
+ with this property.
+
+\layout Standard
+
+Components are groups of properties that represent the core objects of a
+ calendar system, such as events or timezones.
+ Components are delimited by
+\begin_inset Quotes eld
+\end_inset
+
+BEGIN
+\begin_inset Quotes erd
+\end_inset
+
+ and
+\begin_inset Quotes eld
+\end_inset
+
+END
+\begin_inset Quotes erd
+\end_inset
+
+ tags.
+
+\layout Standard
+\added_space_bottom 0.3cm
+When a component is sent across a network, if it is un-encrypted, it will
+ look something like:
+\layout LyX-Code
+
+BEGIN:VCALENDAR
+\layout LyX-Code
+
+METHOD:REQUEST
+\layout LyX-Code
+
+PRODID: -//hacksw/handcal//NONSGML v1.0//EN
+\layout LyX-Code
+
+BEGIN:VEVENT
+\layout LyX-Code
+
+DTSTAMP:19980309T231000Z
+\layout LyX-Code
+
+UID:guid-1.host1.com
+\layout LyX-Code
+
+ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com
+\layout LyX-Code
+
+ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:
+\layout LyX-Code
+
+ MAILTO:employee-A@host.com
+\layout LyX-Code
+
+DESCRIPTION:Project XYZ Review Meeting
+\layout LyX-Code
+
+CATEGORIES:MEETING
+\layout LyX-Code
+
+CLASS:PUBLIC
+\layout LyX-Code
+
+CREATED:19980309T130000Z
+\layout LyX-Code
+
+SUMMARY:XYZ Project Review
+\layout LyX-Code
+
+DTSTART;TZID=US-Eastern:19980312T083000
+\layout LyX-Code
+
+DTEND;TZID=US-Eastern:19980312T093000
+\layout LyX-Code
+
+LOCATION:1CP Conference Room 4350
+\layout LyX-Code
+
+END:VEVENT
+\layout LyX-Code
+
+END:VCALENDAR
+\layout Standard
+
+Note that components can be nested; this example has both a VCALENDAR and
+ a VEVENT component, one nested inside the other.
+
+\layout Standard
+
+The main goal of Libical is to offer a structured, type-safe to create,
+ access and manipulate components and their properties, values and parameters.
+
+\layout Subsection
+
+Core iCal classes
+\layout Standard
+
+Libical is an object-based, data-oriented library.
+ There are no real-objects, but the way the routines are named and organized
+ results in the same sort of encapsulations and abstraction that are major
+ features of Object-Orieted languages.
+ Nearly all of the routines in the library are associated with an opaque
+ data types and perform some operation on that data type.
+ For instnace, a Property is declared as:
+\layout LyX-Code
+
+icalproperty *prop;
+\layout Standard
+
+Icalproperty is typedef'd to void, so the only way to manipulate it is through
+ the accessor routines, all of which have a form similar to:
+\layout LyX-Code
+
+char* icalproperty_as_ical_string(icalproperty* prop);
+\layout Standard
+
+That is, the name of the 'class' is the first word in the routine name,
+ and the first parameter is a pointer to the 'object.'
+\layout Standard
+
+Although the library does not actually have classes, we will use those terms
+ since the behavior of these associations of data and routines is very similar
+ to a class.
+
+\layout Subsubsection
+
+Properties
+\layout LyX-Code
+
+icalproperty *prop;
+\layout Standard
+
+Properties are represented with the icalproperty class and its many
+\begin_inset Quotes eld
+\end_inset
+
+derived
+\begin_inset Quotes erd
+\end_inset
+
+ classes with on
+\begin_inset Quotes eld
+\end_inset
+
+derived
+\begin_inset Quotes erd
+\end_inset
+
+ class per property type in RFC2445.
+ Again, there is no actual inheritance relations, but there are clusters
+ of routines that make this term useful.
+ A property is a container for a single value and a set of parameters.
+
+\layout Subsubsection
+
+Components
+\layout LyX-Code
+
+icalcomponent *comp;
+\layout Standard
+
+In libical, components are represented with the icalcomponent class.
+ Icalcomponent is a container for a set of other components and properties.
+\layout Subsubsection
+
+Values
+\layout LyX-Code
+
+icalvalue *value;
+\layout Standard
+
+Values are represented in a similar way to properties; a base class and
+ many
+\begin_inset Quotes eld
+\end_inset
+
+derived
+\begin_inset Quotes eld
+\end_inset
+
+ classes.
+ A value is essentially a abstract handle on a single fundamental type,
+ a structure or a union.
+ You probably will never use a value directly, since for most operations
+ you can get to its data through the property that holds it.
+
+\layout Subsubsection
+
+Parameters
+\layout LyX-Code
+
+icalparameter *param;
+\layout Standard
+
+Parameters are represetned in a similar way to properties, except that they
+ contain only one value
+\layout Subsection
+
+Other elements of libical
+\layout Standard
+
+In addition to the core iCal classes, libical has many other types, structures,
+ classes that aid in creating and using iCal components.
+
+\layout Subsubsection
+
+Enumerations and types
+\layout Standard
+
+Libical is strongly typed, so every component, property, parameter, and
+ value type has an enumeration, and some have an associated structure or
+ union.
+
+\layout Subsubsection
+
+The parser
+\layout Standard
+
+The libical parser offers a variety of ways to convert RFC2445 text into
+ a libical iinsteral component structure.
+ the parser can parse blocks of text as a string, or it can parse lin-by-line.
+\layout Subsubsection
+
+Error objects
+\layout Standard
+
+Libical has a substantial error reporting system for both programming errors
+ and component usage errors.
+
+\layout Subsubsection
+
+Memory Management
+\layout Standard
+
+Since many of libicals interfaces return strings, the library has its own
+ memory management system to elimiate the need to free every string returned
+ from the libraru.
+
+\layout Subsubsection
+
+Storage classes
+\layout Standard
+
+The library also offers several classes to store components to flies, memory
+ or databases.
+
+\layout Section
+
+Differences From RFCs
+\layout Standard
+
+Libical has been designed to follow the standards as closely as possible,
+ so that the key objects in the standards are also key objects in the library.
+ However, there are a few areas where the specifications are (arguably)
+ irregular, and following them exactly would result in an unfriendly interface.
+ These deviations make libical easier to use by maintaining a self-similar
+ interface.
+
+\layout Subsection
+
+Pseudo Components
+\layout Standard
+
+Libical defines components for groups of properties that look and act like
+ components, but are not defined as components in the specification.
+ XDAYLIGHT and XSTANDARD are notable examples.
+ These pseudo components group properties within the VTIMEZONE components.
+ For instanace, the timezone properties associated with daylight savings
+ time starts with
+\begin_inset Quotes eld
+\end_inset
+
+BEGIN:DAYLIGHT
+\begin_inset Quotes erd
+\end_inset
+
+ and ends with
+\begin_inset Quotes eld
+\end_inset
+
+END:DAYLIGHT, just like other components, but is not defined as a component
+ in RFC2445.
+ ( See RFC2445, page 61 ) In Libical,this grouping is represented by the
+ XDAYLIGHT component.
+ Standard iCAL components all start with the letter
+\begin_inset Quotes eld
+\end_inset
+
+V,
+\begin_inset Quotes erd
+\end_inset
+
+ while pseudo components start with
+\begin_inset Quotes erd
+\end_inset
+
+X.
+\begin_inset Quotes erd
+\end_inset
+
+
+\layout Standard
+
+There are also pseudo components that are conceptually derived classes of
+ VALARM.
+ RFC2446 defines what properties may be included in each component, and
+ for VALARM, the set of properties it may have depends on the value of the
+ ACTION property.
+
+\layout Standard
+
+For instance, if a VALARM component has an ACTION property with the value
+ of
+\begin_inset Quotes eld
+\end_inset
+
+AUDIO,
+\begin_inset Quotes erd
+\end_inset
+
+ the component must also have an
+\begin_inset Quotes eld
+\end_inset
+
+ATTACH
+\begin_inset Quotes erd
+\end_inset
+
+ property.
+ However, if the ACTION value is
+\begin_inset Quotes eld
+\end_inset
+
+DISPLAY,
+\begin_inset Quotes erd
+\end_inset
+
+ the component must have a DESCRIPTION property.
+
+\layout Standard
+
+To handle these various, complex restrictions, libical has pseudo components
+ for each type of alarm: XAUDIOALARM, XDISPLAYALARM, XEMAILALARM and XPROCEDUREA
+LARM.
+
+\layout Subsection
+
+Combined Values
+\layout Standard
+
+Many values can take more than one type.
+ TRIGGER, for instance, can have a value type of with DURATION or of DATE-TIME.
+ These multiple types make it difficult to create routines to return the
+ value associated with a property.
+
+\layout Standard
+
+It is natural to have interfaces that would return the value of a property,
+ but it is cumbersome for a single routine to return multiple types.
+ So, in libical, properties that can have multiple types are given a single
+ type that is the union of their RFC2445 types.
+ For instance, in libical, the value of the TRIGGER property resolves to
+ struct icaltriggertype.
+ This type is a union of a DURATION and a DATE-TIME.
+
+\layout Subsection
+
+Multi-Valued Properties
+\layout Standard
+
+Some properties, such as CATEGORIES have only one value type, but each CATEGORIE
+S property can have multiple value instances.
+ This also results in a cumbersome interface -- CATEGORIES accessors would
+ have to return a list while all other accessors returned a single value.
+ In libical, all properties have a single value, and multi-valued properties
+ are broken down into multiple single valued properties during parsing.
+ That is, an input line like,
+\layout LyX-Code
+
+CATEGORIES: work, home
+\layout Standard
+
+becomes in libical's internal representation
+\layout LyX-Code
+
+CATEGORIES: work
+\layout LyX-Code
+
+CATEGORIES: home
+\layout Standard
+
+Oddly, RFC2445 allows some multi-valued properties ( like FREEBUSY ) to
+ exist as both a multi-values property and as multiple single value properties,
+ while others ( like CATEGORIES ) can only exist as single multi-valued
+ properties.
+ This makes the internal representation for CATEGORIES illegal.
+ However when you convert a component to a string, the library will collect
+ all of the CATEGORIES properties into one.
+
+\layout Section
+
+Using libical
+\layout Subsection
+
+Creating Components
+\layout Standard
+
+There are three ways to create components in Libical:
+\layout Itemize
+
+Create individual components, properties and parameters and assemble them
+ into structures
+\layout Itemize
+
+Build complete components with nested vaargs calls
+\layout Itemize
+
+Parse bits of text
+\layout Itemize
+
+Parse entire files
+\layout Subsubsection
+
+Constructor Interfaces
+\layout Standard
+
+Using constructor interfaces, you create each of the objects separately
+ and then assemble them in to components:
+\layout LyX-Code
+
+icalcomponent *event;
+\layout LyX-Code
+
+icalproperty *prop;
+\layout LyX-Code
+
+icalparameter *param;
+\layout LyX-Code
+
+struct icaltimetype atime;
+\layout LyX-Code
+
+\layout LyX-Code
+
+event = icalcomponent_new(ICAL_VEVENT_COMPONENT);
+\layout LyX-Code
+
+prop = icalproperty_new_dtstamp(atime);
+\layout LyX-Code
+
+icalcomponent_add_property(event, prop);
+\layout LyX-Code
+
+\layout LyX-Code
+
+prop = icalproperty_new_uid(''guid-1.host1.com'') );
+\layout LyX-Code
+
+icalcomponent_add_property(event,prop);
+\layout LyX-Code
+
+\layout LyX-Code
+
+prop=icalproperty_new_organizer(''mrbig@host.com'');
+\layout LyX-Code
+
+param = icalparameter_new_role(ICAL_ROLE_CHAIR)
+\layout LyX-Code
+
+icalproperty_add_parameter(prop, param);
+\layout LyX-Code
+
+\layout LyX-Code
+
+icalcomponent_add_property(event,prop);
+\layout Standard
+
+Notice that libical uses a semi-object-oriented style of interface.
+ Most things you work with are objects, that are instantiated with a constructor
+ that has
+\begin_inset Quotes eld
+\end_inset
+
+new
+\begin_inset Quotes erd
+\end_inset
+
+ in the name.
+ Also note that, other than the object reference, most structure data is
+ passed in to libical routines by value.
+ Libical has some complex but very regular memory handling rules.
+ These are detailed in section
+\begin_inset LatexCommand \ref{sec:memory}
+
+\end_inset
+
+.
+\layout Standard
+
+If any of the constructors fail, they will return 0.
+ If you try to insert 0 into a property or component, or use a zero-valued
+ object reference, libical will either silently ignore the error or will
+ abort with an error message.
+ This behavior is controlled by a compile time flag (ICAL_ERRORS_ARE_FATAL),
+ and will abort by default.
+
+\layout Subsubsection
+
+vaargs Constructors
+\layout Standard
+
+There is another way to create complex components, which is arguably more
+ elegant, if you are not horrified by varargs.
+ The varargs constructor interface allows you to create intricate components
+ in a single block of code.
+ Here is the previous examples in the vaargs style.
+
+\layout LyX-Code
+
+ calendar =
+\layout LyX-Code
+
+ icalcomponent_vanew(
+\layout LyX-Code
+
+ ICAL_VCALENDAR_COMPONENT,
+\layout LyX-Code
+
+ icalproperty_new_version(''2.0''),
+\layout LyX-Code
+
+ icalproperty_new_prodid(
+\layout LyX-Code
+
+ ''-//RDU Software//NONSGML HandCal//EN''),
+\layout LyX-Code
+
+ icalcomponent_vanew(
+\layout LyX-Code
+
+ ICAL_VEVENT_COMPONENT,
+\layout LyX-Code
+
+ icalproperty_new_dtstamp(atime),
+\layout LyX-Code
+
+ icalproperty_new_uid(''guid-1.host1.com''),
+\layout LyX-Code
+
+ icalproperty_vanew_organizer(
+\layout LyX-Code
+
+ ''mrbig@host.com''),
+\layout LyX-Code
+
+ icalparameter_new_role(ICAL_ROLE_CHAIR),
+\layout LyX-Code
+
+ 0
+\layout LyX-Code
+
+ ),
+\layout LyX-Code
+
+ icalproperty_vanew_attendee(
+\layout LyX-Code
+
+ ''employee-A@host.com'',
+\layout LyX-Code
+
+ icalparameter_new_role(
+\layout LyX-Code
+
+ ICAL_ROLE_REQPARTICIPANT),
+\layout LyX-Code
+
+ icalparameter_new_rsvp(1),
+\layout LyX-Code
+
+ icalparameter_new_cutype(ICAL_CUTYPE_GROUP),
+\layout LyX-Code
+
+ 0
+\layout LyX-Code
+
+ ),
+\layout LyX-Code
+
+ icalproperty_new_location(
+\layout LyX-Code
+
+ "1CP Conference Room 4350"),
+\layout LyX-Code
+
+ 0
+\layout LyX-Code
+
+ ),
+\layout LyX-Code
+
+ 0
+\layout LyX-Code
+
+ );
+\layout Standard
+
+This form is similar to the constructor form , except that the constructors
+ have
+\begin_inset Quotes eld
+\end_inset
+
+vanew
+\begin_inset Quotes erd
+\end_inset
+
+ instead of
+\begin_inset Quotes eld
+\end_inset
+
+new
+\begin_inset Quotes erd
+\end_inset
+
+ in the name.
+ The arguments are similar too, except that the component constructor can
+ have a list of properties, and the property constructor can have a list
+ of parameters.
+ Be sure to terminate every list with a '0', or your code will crash, if
+ you are lucky.
+
+\layout Subsubsection
+
+Parsing Text
+\layout Standard
+
+Several routines are available for generating objects from text.
+ For properties, use:
+\layout LyX-Code
+
+icalproperty* p;
+\layout LyX-Code
+
+p = icalproperty_new_from_string("DTSTART:19970101T120000Z
+\backslash
+n");
+\layout Standard
+
+For parameters, use:
+\layout LyX-Code
+
+icalparameter *param
+\layout LyX-Code
+
+param = icalparameter_new_from_string("PARTSTAT=ACCEPTED");
+\layout Standard
+
+The final way to create components will probably be the most common; you
+ can create components from RFC2445 compliant text.
+ If you have the string in memory, use
+\layout LyX-Code
+
+icalcomponent* icalcomponent_new_from_string(char* str);
+\layout Standard
+
+If the string contains only one component, the routine will return the component
+ in libical form.
+ If the string contains multiple components, the multiple components will
+ be returned as the children of an ICAL_XROOT_COMPONENT component.
+ This routine is identical to ( and actually uses ) icalparser_parse_string(char
+* str).
+\layout Standard
+
+Parsing a whole string may seem wasteful if you want to pull a large component
+ off of the network or from a file; you may prefer to parse the component
+ line by line.
+ This is possible too by using:
+\layout LyX-Code
+
+icalparser* icalparser_new();
+\layout LyX-Code
+
+void icalparser_free(icalparser* parser);
+\layout LyX-Code
+
+icalparser_get_line(parser,read_stream);
+\layout LyX-Code
+
+icalparser_add_line(parser,line);
+\layout LyX-Code
+
+icalparser_set_gen_data(parser,stream)
+\layout Standard
+
+These routines will construct a parser object to which you can add lines
+ of input and retrieve any components that the parser creates from the input.
+ These routines work by specifing an adaptor routine to get string data
+ from a source.
+ For an example:
+\layout LyX-Code
+
+char* read_stream(char *s, size_t size, void *d)
+\layout LyX-Code
+
+{
+\layout LyX-Code
+
+ char *c = fgets(s,size, (FILE*)d);
+\layout LyX-Code
+
+ return c;
+\layout LyX-Code
+
+}
+\layout LyX-Code
+
+main() {
+\layout LyX-Code
+
+ char* line;
+\layout LyX-Code
+
+ icalcomponent *c;
+\layout LyX-Code
+
+ icalparser *parser = icalparser_new();
+\layout LyX-Code
+
+ FILE* stream = fopen(argv[1],"r");
+\layout LyX-Code
+
+ icalparser_set_gen_data(parser,stream);
+\layout LyX-Code
+
+ do{
+\layout LyX-Code
+
+ line = icalparser_get_line(parser,read_stream);
+\layout LyX-Code
+
+ c = icalparser_add_line(parser,line);
+\layout LyX-Code
+
+ if (c != 0){
+\layout LyX-Code
+
+ printf("%s",icalcomponent_as_ical_string(c));
+\layout LyX-Code
+
+ icalparser_claim(parser);
+\layout LyX-Code
+
+ printf("
+\backslash
+n---------------
+\backslash
+n");
+\layout LyX-Code
+
+ icalcomponent_free(c);
+\layout LyX-Code
+
+ }
+\layout LyX-Code
+
+ } while ( line != 0);
+\layout LyX-Code
+
+}
+\layout Standard
+
+The parser object parameterizes the routine used to get input lines with
+ icalparser_set_gen_data() and
+\emph on
+
+\emph default
+icalparser_get_line().
+ In this example, the routine read_stream() will fetch the next line from
+ a stream, with the stream passed in as the void* parameter d.
+ The parser calls read_stream() from icalparser_get_line(), but it also
+ needs to know what stream to use.
+ This is set by the call to icalparser_set_gen_data().
+ By using a different routine for read_stream or passing in different data
+ with icalparser_set_gen_data, you can connect to any data source.
+
+\layout Standard
+
+Using the same mechanism, other implementations could read from memory buffers,
+ sockets or other interfaces.
+
+\layout Standard
+
+Since the example code is a very common way to use the parser, there is
+ a convenience routine;
+\layout LyX-Code
+
+icalcomponent* icalparser_parse(icalparser *parser,
+\layout LyX-Code
+
+ char* (*line_gen_func)(char *s, size_t size, void* d))
+\layout Standard
+
+To use this routine, you still must construct the parser object and pass
+ in a reference to a line reading routine.
+ If the parser can create a single component from the input, it will return
+ a pointer to the newly constructed component.
+ If the parser can construct multiple components from the input, it will
+ return a reference to an XROOT component ( of type ICAL_XROOT_COMPONENT.)
+ This XROOT component will hold all of the components constructed from the
+ input as children.
+
+\layout Subsection
+
+Accessing Components
+\layout Standard
+
+Given a reference to a component, you probably will want to access the propertie
+s, parameters and values inside.
+ Libical interfaces let you find sub-components, add and remove sub-components,
+ and do the same three operations on properties.
+
+\layout Subsubsection
+
+Finding Components
+\layout Standard
+
+To find a sub-component of a component, use:
+\layout LyX-Code
+
+icalcomponent* icalcomponent_get_first_component(
+\layout LyX-Code
+
+ icalcomponent* component,
+\layout LyX-Code
+
+ icalcomponent_kind kind);
+\layout Standard
+
+This routine will return a reference to the first component of the type
+ 'kind.' The key kind values, listed in icalenums.h are:
+\layout LyX-Code
+
+ICAL_ANY_COMPONENT
+\layout LyX-Code
+
+ICAL_VEVENT_COMPONENT
+\layout LyX-Code
+
+ICAL_VTODO_COMPONENT
+\layout LyX-Code
+
+ICAL_VJOURNAL_COMPONENT
+\layout LyX-Code
+
+ICAL_VCALENDAR_COMPONENT
+\layout LyX-Code
+
+ICAL_VFREEBUSY_COMPONENT
+\layout LyX-Code
+
+ICAL_VALARM_COMPONENT
+\layout Standard
+
+These are only the most common components; there are many more listed in
+ icalenums.h.
+\layout Standard
+
+As you might guess, if there is more than one subcomponent of the type you
+ have chosen, this routine will return only the first.
+ to get at the others, you need to iterate through the component.
+
+\layout Subsubsection
+
+Iterating Through Components
+\layout Standard
+
+Iteration requires a second routine to get the next subcomponent after the
+ first:
+\layout LyX-Code
+
+icalcomponent* icalcomponent_get_next_component(
+\layout LyX-Code
+
+ icalcomponent* component,
+\layout LyX-Code
+
+ icalcomponent_kind kind);
+\layout Standard
+
+With the 'first' and 'next' routines, you can create a for loop to iterate
+ through all of a components subcomponents
+\layout LyX-Code
+
+ for(c = icalcomponent_get_first_component(comp,ICAL_ANY_COMPONENT);
+\layout LyX-Code
+
+ c != 0;
+\layout LyX-Code
+
+ c = icalcomponent_get_next_component(comp,ICAL_ANY_COMPONENT))
+\layout LyX-Code
+
+{
+\layout LyX-Code
+
+ do_something(c);
+\layout LyX-Code
+
+}
+\layout Standard
+
+This code bit wil iterate through all of the subcomponents in 'comp' but
+ you can select a specific type of component by changing ICAL_ANY_COMPONENT
+ to another component type.
+\layout Subsubsection
+
+Using Component Iterators
+\layout Standard
+
+The iteration model in the previous section requires the component to keep
+ the state of the iteration.
+ So, you could not use this model to perform a sorting operations, since
+ you'd need two iterators and there is only space for one.
+ If you ever call icalcomponent_get_first_component() when an iteration
+ is in progress, the pointer will be reset to the beginning.
+
+\layout Standard
+
+To solve this problem, there are also external iterators for components.
+ The routines associated with these external iterators are:
+\layout LyX-Code
+
+icalcompiter icalcomponent_begin_component(icalcomponent* component, icalcompone
+nt_kind kind);
+\layout LyX-Code
+
+icalcompiter icalcomponent_end_component(icalcomponent* component, icalcomponent
+_kind kind);
+\layout LyX-Code
+
+icalcomponent* icalcompiter_next(icalcompiter* i);
+\layout LyX-Code
+
+icalcomponent* icalcompiter_prior(icalcompiter* i);
+\layout LyX-Code
+
+icalcomponent* icalcompiter_deref(icalcompiter* i);
+\layout Standard
+
+The _begin_() and _end_() routines return a new iterator that points to
+ the beginning and ending of the list of subcomponent for the given component,
+ and the kind argument works like the kind argument for internal iterators.
+
+\layout Standard
+
+After creating an iterators, use _next_() and _prior_() to step forward
+ and backward through the list and get the component that the iterator points
+ to, and use _deref() to return the component that the iterator points to
+ without moving the iterator.
+ All routines will return 0 when they move to point off the end of the list.
+
+\layout Standard
+
+Here is an example of a loop using these routines:
+\layout LyX-Code
+
+for(
+\layout LyX-Code
+
+ i = icalcomponent_begin_component(impl->cluster,ICAL_ANY_COMPONENT);
+
+\layout LyX-Code
+
+ icalcompiter_deref(&i)!= 0;
+\layout LyX-Code
+
+ icalcompiter_next(&i)
+\layout LyX-Code
+
+) {
+\layout LyX-Code
+
+ icalcomponent *this = icalcompiter_deref(&i);
+\layout LyX-Code
+
+}
+\layout Subsubsection
+
+Removing Components
+\layout Standard
+
+Removing an element from a list while iterating through the list with the
+ internal iterators can cause problems, since you will probably be removing
+ the element that the internal iterator points to.
+ The _remove() routine will keep the iterator valid by moving it to the
+ next component, but in a normal loop, this will result in two advances
+ per iteration, and you will remove only every other component.
+ To avoid the problem, you will need to step the iterator ahead of the
+ element you are going to remove, like this:
+\layout LyX-Code
+
+for(c = icalcomponent_get_first_component(parent_comp,ICAL_ANY_COMPONENT);
+
+\layout LyX-Code
+
+ c != 0;
+\layout LyX-Code
+
+ c = next
+\layout LyX-Code
+
+{
+\layout LyX-Code
+
+ next = icalcomponent_get_next_component(parent_comp,ICAL_ANY_COMPONENT);
+\layout LyX-Code
+
+ icalcomponent_remove_component(parent_comp,c);
+\layout LyX-Code
+
+}
+\layout Standard
+
+Another way to remove components is to rely on the side effect of icalcomponent_
+remove_component: if component iterator in the parent component is pointing
+ to the child that will be removed, it will move the iterator to the component
+ after the child.
+ The following code will exploit this behavior:
+\layout LyX-Code
+
+icalcomponent_get_first_component(parent_comp,ICAL_VEVENT_COMPONENT);
+\layout LyX-Code
+
+while((c=icalcomponent_get_current_component(c)) != 0 ){
+\layout LyX-Code
+
+ if(icalcomponent_isa(c) == ICAL_VEVENT_COMPONENT){
+\layout LyX-Code
+
+ icalcomponent_remove_component(parent_comp,inner);
+\layout LyX-Code
+
+ } else {
+\layout LyX-Code
+
+ icalcomponent_get_next_component(parent_comp,ICAL_VEVENT_COMPONENT);
+
+\layout LyX-Code
+
+ }
+\layout LyX-Code
+
+}
+\layout Subsubsection
+
+Working with properties and parameters
+\layout Standard
+
+Finding, iterating and removing properties works the same as it does for
+ components, using the property-specific or parameter-specific interfaces:
+
+\layout LyX-Code
+
+icalproperty* icalcomponent_get_first_property(
+\layout LyX-Code
+
+ icalcomponent* component,
+\layout LyX-Code
+
+ icalproperty_kind kind);
+\layout LyX-Code
+
+icalproperty* icalcomponent_get_next_property(
+\layout LyX-Code
+
+ icalcomponent* component,
+\layout LyX-Code
+
+ icalproperty_kind kind);
+\layout LyX-Code
+
+void icalcomponent_add_property(
+\layout LyX-Code
+
+ icalcomponent* component,
+\layout LyX-Code
+
+ icalproperty* property);
+\layout LyX-Code
+
+void icalcomponent_remove_property(
+\layout LyX-Code
+
+ icalcomponent* component,
+\layout LyX-Code
+
+ icalproperty* property);
+\layout Standard
+
+For parameters:
+\layout LyX-Code
+
+icalparameter* icalproperty_get_first_parameter(
+\layout LyX-Code
+
+ icalproperty* prop,
+\layout LyX-Code
+
+ icalparameter_kind kind);
+\layout LyX-Code
+
+icalparameter* icalproperty_get_next_parameter(
+\layout LyX-Code
+
+ icalproperty* prop,
+\layout LyX-Code
+
+ icalparameter_kind kind);
+\layout LyX-Code
+
+void icalproperty_add_parameter(
+\layout LyX-Code
+
+ icalproperty* prop,
+\layout LyX-Code
+
+ icalparameter* parameter);
+\layout LyX-Code
+
+void icalproperty_remove_parameter(
+\layout LyX-Code
+
+ icalproperty* prop,
+\layout LyX-Code
+
+ icalparameter_kind kind);
+\layout Standard
+
+Note that since there should be only one parameter of each type in a property,
+ you will rarely need to use icalparameter_get_nect_paameter.
+\layout Subsubsection
+
+Working with values
+\layout Standard
+
+Values are typically part of a property, although they can exist on their
+ own.
+ You can manipulate them either as part of the property or independently.
+\layout Standard
+
+The most common way to work with values to is to manipulate them from they
+ properties that contain them.
+ This involves fewer routine calls and intermediate variables than working
+ with them independently, and it is type-safe.
+
+\layout Standard
+
+For each property, there are a _get_ and a _set_ routine that access the
+ internal value.
+ For instanace, for the UID property, the routines are:
+\layout LyX-Code
+
+void icalproperty_set_uid(icalproperty* prop, const char* v)
+\layout LyX-Code
+
+const char* icalproperty_get_uid(icalproperty* prop)
+\layout Standard
+
+For multi-valued properties, like ATTACH, the value type is usually a struct
+ or union that holds both possible types.
+
+\layout Standard
+
+If you want to work with the underlying value object, you can get and set
+ it with:
+\layout LyX-Code
+
+icalvalue* icalproperty_get_value (icalproperty* prop)
+\layout LyX-Code
+
+void icalproperty_set_value(icalproperty* prop, icalvalue* value);
+\layout Standard
+
+Icalproperty_get_value() will return a reference that you can manipulate
+ with other icalvalue routines.
+ Most of the time, you will have to know what the type of the value is.
+ For instance, if you know that the value is a DATETIME type, you can manipulate
+ it with:
+\layout LyX-Code
+
+struct icaltimetype icalvalue_get_datetime(icalvalue* value);
+\layout LyX-Code
+
+void icalvalue_set_datetime(icalvalue* value, struct icaltimetype v);
+\layout Standard
+
+When working with an extension property or value (and X-PROPERTY or a property
+ that has the parameter VALUE=x-name ) the value type is always a string.
+ To get and set the value, use:
+\layout LyX-Code
+
+void icalproperty_set_x(icalproperty* prop, char* v);
+\layout LyX-Code
+
+char* icalproperty_get_x(icalproperty* prop);
+\layout Standard
+
+All X properties have the type of ICAL_X_PROPERTY, so you will need these
+ routines to get and set the name of the property:
+\layout LyX-Code
+
+char* icalproperty_get_x_name(icalproperty* prop)
+\layout LyX-Code
+
+void icalproperty_set_x_name(icalproperty* prop, char* name);
+\layout Subsubsection
+
+Checking Component Validity
+\layout Standard
+
+RFC 2446 defines rules for what properties must exist in a component to
+ be used for transferring scheduling data.
+ Most of these rules relate to the existence of properties relative to the
+ METHOD property, which declares what operation a remote receiver should
+ use to process a component.
+ For instance, if the METHOD is REQUEST and the component is a VEVENT, the
+ sender is probably asking the receiver to join in a meeting.
+ In this case, RFC2446 says that the component must specify a start time
+ (DTSTART) and list the receiver as an attendee (ATTENDEE).
+
+\layout Standard
+
+Libical can check these restrictions with the routine:
+\layout LyX-Code
+
+int icalrestriction_check(icalcomponent* comp);
+\layout Standard
+
+This routine returns 0 if the component does not pass RFC2446 restrictions,
+ or if the component is malformed.
+ The component you pass in
+\emph on
+must
+\emph default
+ be a VCALENDAR, with one or more children, like the examples in RFC2446.
+
+\layout Standard
+
+When this routine runs, it will insert new properties into the component
+ to indicate any errors it finds.
+ See section 6.5.3, X-LIC-ERROR for more information about these error properties.
+
+\layout Subsubsection
+
+Converting Components to Text
+\layout Standard
+
+To create an RFC2445 compliant text representation of an object, use one
+ of the *_as_ical_string() routines:
+\layout LyX-Code
+
+char* icalcomponent_as_ical_string (icalcomponent* component)
+\layout LyX-Code
+
+char* icalproperty_as_ical_string (icalproperty* property)
+\layout LyX-Code
+
+char* icalparameter_as_ical_string (icalparameter* parameter)
+\layout LyX-Code
+
+char* icalvalue_as_ical_string (icalvalue* value)
+\layout Standard
+
+In most cases, you will only use icalcomponent_as_ical_string (), since
+ it will cascade and convert all of the parameters, properties and values
+ that are attached to the root component.
+\layout Standard
+
+Icalproperty_as_ical_string() will terminate each line with the RFC2445
+ specified line terminator
+\begin_inset Quotes eld
+\end_inset
+
+
+\backslash
+
+\backslash
+n
+\begin_inset Quotes erd
+\end_inset
+
+ However, if you compile with the symbol ICAL_UNIX_NEWLINE undefined, (
+ it is defined by default) it will terminate lines with
+\begin_inset Quotes eld
+\end_inset
+
+
+\backslash
+
+\backslash
+n
+\backslash
+
+\backslash
+r
+\begin_inset Quotes erd
+\end_inset
+
+
+\layout Standard
+
+Remember that the string returned by these routines is owned by the library,
+ and will eventually be re-written.
+ You should copy it if you want to preserve it.
+
+\layout Subsection
+
+Time
+\layout Subsubsection
+
+Time structure
+\layout Standard
+
+LIbical defines it's own time structure for storing all dates and times.
+ It would have been nice to re-use the C library's
+\emph on
+struct tm,
+\emph default
+but that structure does not differentiate between dates and times, and between
+ local time and UTC.
+ The libical structure is:
+\layout LyX-Code
+
+struct icaltimetype {
+\layout LyX-Code
+
+ int year;
+\layout LyX-Code
+
+ int month;
+\layout LyX-Code
+
+ int day;
+\layout LyX-Code
+
+ int hour;
+\layout LyX-Code
+
+ int minute;
+\layout LyX-Code
+
+ int second;
+\layout LyX-Code
+
+ int is_utc; /* 1-> time is in UTC timezone */
+\layout LyX-Code
+
+ int is_date; /* 1 -> interpret this as date.
+ */ };
+\layout Standard
+
+The year, month, day, hour, minute and second fields hold the broken-out
+ time values.
+ The is_utc field distinguishes between times in UTC and a local time zone.
+ The is_date field indicates if the time should be interpreted only as a
+ date.
+ If it is a date, the hour, minute and second fields are assumed to be zero,
+ regardless of their actual vaules.
+
+\layout Subsubsection
+
+Creating time structures
+\layout Standard
+
+There are several ways to create a new icaltimetype structure:
+\layout LyX-Code
+
+struct icaltimetype icaltime_from_string(const char* str);
+\layout LyX-Code
+
+struct icaltimetype icaltime_from_timet(time_t v, int is_date);
+\layout LyX-Code
+
+\layout Standard
+
+Icaltime_from_string takes any RFC2445 compliant time string:
+\layout LyX-Code
+
+struct icaltimetype tt = icaltime_from_string("19970101T103000");
+\layout Standard
+
+Icaltime_from_timet takes a timet value, representing seconds past the POSIX
+ epoch, and a flag to indicate if the time is a date.
+ Dates have an identical structure to a time, but the time portion ( hours,
+ minuts and seconds ) is always 00:00:00.
+ Dates act differently in sorting an comparision, and they have a different
+ string representation in RFC2445.
+
+\layout Subsubsection
+
+Time manipulating routines
+\layout Standard
+
+The null time value is used to indicate that the data in the structure is
+ not a valid time.
+\layout LyX-Code
+
+struct icaltimetype icaltime_null_time(void);
+\layout LyX-Code
+
+int icaltime_is_null_time(struct icaltimetype t);
+\layout Standard
+
+It is sensible for the broken-out time fields to contain values that are
+ not permitted in an ISO compliant time string.
+ For instance, the seconds field can hold values greater than 59, and the
+ hours field can hold values larger than 24.
+ The excessive values will be rolled over into the next larger field when
+ the structure is normalized.
+
+\layout LyX-Code
+
+struct icaltimetype icaltime_normalize(struct icaltimetype t);
+\layout Standard
+
+Normalizing allows you to do arithmetic operations on time values.
+
+\layout LyX-Code
+
+struct icaltimetype tt = icaltime_from_string(
+\begin_inset Quotes eld
+\end_inset
+
+19970101T103000
+\begin_inset Quotes erd
+\end_inset
+
+);
+\layout LyX-Code
+
+tt.days +=3
+\layout LyX-Code
+
+tt.second += 70;
+\layout LyX-Code
+
+tt = icaltime_normalize(tt);
+\layout Standard
+
+There are several routines to get the day of the week or month, etc, from
+ a time structure.
+\layout LyX-Code
+
+short icaltime_day_of_year(struct icaltimetype t);
+\layout LyX-Code
+
+struct icaltimetype icaltime_from_day_of_year(short doy, short year);
+\layout LyX-Code
+
+short icaltime_day_of_week(struct icaltimetype t);
+\layout LyX-Code
+
+short icaltime_start_doy_of_week(struct icaltimetype t);
+\layout LyX-Code
+
+short icaltime_week_number(short day_of_month, short month, short year);
+\layout LyX-Code
+
+struct icaltimetype icaltime_from_week_number(short week_number, short year);
+\layout LyX-Code
+
+short icaltime_days_in_month(short month,short year);
+\layout Standard
+
+Two routines convert time structures to and from the number of seconds since
+ the POSIX epoch.
+ The is_date field indicates whether or not the hour, minute and second
+ fields should be used in the conversion.
+\layout LyX-Code
+
+struct icaltimetype icaltime_from_timet(time_t v, int is_date);
+\layout LyX-Code
+
+time_t icaltime_as_timet(struct icaltimetype);
+\layout Standard
+
+The compare routine works exactly like strcmp, but on time structures.
+
+\layout LyX-Code
+
+int icaltime_compare(struct icaltimetype a,struct icaltimetype b);
+\layout Standard
+
+The following routines convert between UTC and a named timezone.
+ The tzid field must be a timezone name from the Olsen database, such as
+
+\begin_inset Quotes eld
+\end_inset
+
+America/Los_Angeles.
+\begin_inset Quotes erd
+\end_inset
+
+
+\layout Standard
+
+The utc_offset routine returns the offset of the named time zone from UTC,
+ in seconds.
+
+\layout Standard
+
+The tt parameter in the following routines indicates the date on which the
+ conversion should be made.
+ The tt parameter is necessary because timezones have many different rules
+ for when daylight savings time is used, and these rules can change over
+ time.
+ So, for a single timezone one year may have daylight savings time on March
+ 15, but for other years March 15 may be standard time, and some years may
+ have standard time all year.
+
+\layout LyX-Code
+
+int icaltime_utc_offset(struct icaltimetype tt, char* tzid);
+\layout LyX-Code
+
+int icaltime_local_utc_offset();
+\layout LyX-Code
+
+struct icaltimetype icaltime_as_utc(struct icaltimetype tt,char* tzid);
+\layout LyX-Code
+
+struct icaltimetype icaltime_as_zone(struct icaltimetype tt,char* tzid);
+\layout LyX-Code
+
+struct icaltimetype icaltime_as_local(struct icaltimetype tt);
+\layout Subsection
+
+Storing Objects
+\layout Standard
+
+The libical distribution includes a separate library, libicalss, that allows
+ you to store iCal component data to disk in a variety of ways.
+ This library also includes code to implement the CSTP protocol of CAP and
+ has some routines for deciphering incomming messages.
+
+\layout Standard
+
+The file storage routines are organized in an inheritance heirarchy that
+ is rooted in icalset, with the derived class icalfileset and icaldirset.
+ Icalfileset stores components to a file, while icaldirset stores components
+ to multiple files, one per month based on DTSTAMP.
+ Other storages classess, for storage to a heap or a mysql database are
+ planned for the future.
+
+\layout Standard
+
+All of the icalset derived classes have the same interface:
+\layout LyX-Code
+
+\layout LyX-Code
+
+icaldirset* icaldirset_new(const char* path);
+\layout LyX-Code
+
+void icaldirset_free(icaldirset* store);
+\layout LyX-Code
+
+const char* icaldirset_path(icaldirset* store);
+\layout LyX-Code
+
+void icaldirset_mark(icaldirset* store);
+\layout LyX-Code
+
+icalerrorenum icaldirset_commit(icaldirset* store);
+\layout LyX-Code
+
+icalerrorenum icaldirset_add_component(icaldirset* store, icalcomponent*
+ comp);
+\layout LyX-Code
+
+icalerrorenum icaldirset_remove_component(icaldirset* store, icalcomponent*
+ comp);
+\layout LyX-Code
+
+int icaldirset_count_components(icaldirset* store, icalcomponent_kind kind);
+\layout LyX-Code
+
+icalerrorenum icaldirset_select(icaldirset* store, icalcomponent* gauge);
+\layout LyX-Code
+
+void icaldirset_clear(icaldirset* store);
+\layout LyX-Code
+
+icalcomponent* icaldirset_fetch(icaldirset* store, const char* uid);
+\layout LyX-Code
+
+int icaldirset_has_uid(icaldirset* store, const char* uid);
+\layout LyX-Code
+
+icalcomponent* icaldirset_fetch_match(icaldirset* set, icalcomponent *c);
+\layout LyX-Code
+
+icalerrorenum icaldirset_modify(icaldirset* store, icalcomponent *oldc,
+ icalcomponent *newc);
+\layout LyX-Code
+
+icalcomponent* icaldirset_get_current_component(icaldirset* store);
+\layout LyX-Code
+
+icalcomponent* icaldirset_get_first_component(icaldirset* store);
+\layout LyX-Code
+
+icalcomponent* icaldirset_get_next_component(icaldirset* store);
+\layout Subsubsection
+
+Creating a new set
+\layout Standard
+
+You can create a new set from either the base class or the direved class.
+ From the base class use one of:
+\layout LyX-Code
+
+icalset* icalset_new_file(const char* path);
+\layout LyX-Code
+
+icalset* icalset_new_dir(const char* path);
+\layout LyX-Code
+
+icalset* icalset_new_heap(void);
+\layout LyX-Code
+
+icalset* icalset_new_mysql(const char* path);
+\layout Standard
+
+You can also create a new set based on the derived class, For instance,
+ with icalfileset:
+\layout LyX-Code
+
+icalfileset* icalfileset_new(const char* path);
+\layout LyX-Code
+
+icalfileset* icalfileset_new_open(const char* path, int flags, mode_t mode);
+\layout Standard
+
+Icaset_new_file is identical to icalfileset_new.
+ BOth routines will open an existing file for readinga and writing, or create
+ a new file if it does not exist.
+ Icalfilset_new_open takes the same arguments as the open() system routine
+ and behaves in the same way.
+
+\layout Standard
+
+The icalset and icalfilset objects are somewhat interchangable -- you can
+ use an icalfileset* as an argument to any of the icalset routines.
+\layout Standard
+
+The following examples will all use icalfileset routines; using the other
+ icalset derived classess will be similar.
+
+\layout Subsubsection
+
+Adding, Finding and Removing Components
+\layout Standard
+
+To add components to a set, use:
+\layout LyX-Code
+
+icalerrorenum icalfileset_add_component(icalfileset* cluster, icalcomponent*
+ child);
+\layout Standard
+
+The fileset keeps an inmemory copy of the components, and this set must
+ be written back to the file ocassionally.
+ There are two routines to manage this:
+\layout LyX-Code
+
+void icalfileset_mark(icalfileset* cluster);
+\layout LyX-Code
+
+icalerrorenum icalfileset_commit(icalfileset* cluster);
+\layout Standard
+
+Icalfileset_mark indicates that the in-memory components have changed.
+ Calling the _add_component routine will call _mark automatically, but you
+ may need to call it yourself if you have made a change to an existing component.
+ The _commit routine writes the data base to disk, but only if it is marked.
+ The _commit routine is called automatically when the icalfileset is freed.
+
+\layout Standard
+
+To iterate through the components in a set, use:
+\layout LyX-Code
+
+icalcomponent* icalfileset_get_first_component(icalfileset* cluster);
+\layout LyX-Code
+
+icalcomponent* icalfileset_get_next_component(icalfileset* cluster);
+\layout LyX-Code
+
+icalcomponent* icalfileset_get_current_component (icalfileset* cluster);
+
+\layout Standard
+
+These routines work like the corresponding routines from icalcomponent,
+ except that their output is filtered through a gauge.
+ A gauge is a test for the properties within a components; only components
+ that pass the test are returned.
+ A gauge can be constructed from a MINSQL string with:
+\layout LyX-Code
+
+icalgauge* icalgauge_new_from_sql(char* sql);
+\layout Standard
+
+Then, you can add the gauge to the set with :
+\layout LyX-Code
+
+icalerrorenum icalfileset_select(icalfileset* store, icalgauge* gauge);
+\layout Standard
+
+Here is an example that puts all of these routines together:
+\layout LyX-Code
+
+
+\latex no_latex
+void test_fileset()
+\layout LyX-Code
+
+
+\latex no_latex
+{
+\layout LyX-Code
+
+
+\latex no_latex
+ icalfileset *fs;
+\layout LyX-Code
+
+
+\latex no_latex
+ icalcomponent *c;
+\layout LyX-Code
+
+
+\latex no_latex
+ int i;
+\layout LyX-Code
+
+
+\latex no_latex
+ char *path = "test_fileset.ics";
+\layout LyX-Code
+
+
+\latex no_latex
+ icalgauge *g = icalgauge_new_from_sql(
+\layout LyX-Code
+
+
+\latex no_latex
+ "SELECT * FROM VEVENT WHERE DTSTART > '20000103T120000Z' AND DTSTART
+ <= '20000106T120000Z'");
+\layout LyX-Code
+
+
+\latex no_latex
+
+\layout LyX-Code
+
+
+\latex no_latex
+fs = icalfileset_new(path);
+\layout LyX-Code
+
+
+\layout LyX-Code
+
+
+\latex no_latex
+for (i = 0; i!= 10; i++){
+\layout LyX-Code
+
+
+\latex no_latex
+ c = make_component(i);
+\latex default
+ /* Make a new component where DTSTART has month of i */
+\layout LyX-Code
+
+
+\latex no_latex
+ icalfileset_add_component(fs,c);
+\layout LyX-Code
+
+
+\latex no_latex
+ }
+\layout LyX-Code
+
+\layout LyX-Code
+
+
+\latex no_latex
+ icalfileset_commit(fs);
+\latex default
+ /* Write to disk */
+\layout LyX-Code
+
+\layout LyX-Code
+
+
+\latex no_latex
+ icalfileset_select(fs,g);
+\latex default
+ /* Set the gauge to filter components */
+\layout LyX-Code
+
+
+\latex no_latex
+
+\layout LyX-Code
+
+
+\latex no_latex
+ for (c = icalfileset_get_first_component(fs);
+\layout LyX-Code
+
+
+\latex no_latex
+ c != 0;
+\layout LyX-Code
+
+
+\latex no_latex
+ c = icalfileset_get_next_component(fs)){
+\layout LyX-Code
+
+
+\latex no_latex
+ struct icaltimetype t = icalcomponent_get_dtstart(c);
+\layout LyX-Code
+
+
+\latex no_latex
+
+\layout LyX-Code
+
+
+\latex no_latex
+ printf("%s
+\backslash
+n",icaltime_as_ctime(t));
+\layout LyX-Code
+
+
+\latex no_latex
+ }
+\layout LyX-Code
+
+
+\latex no_latex
+icalfileset_free(fs);
+\layout LyX-Code
+
+
+\latex no_latex
+}
+\layout Subsubsection
+
+Other routines
+\layout Standard
+
+There are several other routines in the icalset interface, but they not
+ fully implemented yet.
+
+\layout Subsection
+
+
+\begin_inset LatexCommand \label{sec:memory}
+
+\end_inset
+
+Memory Management
+\layout Standard
+
+Libical relies heavily on dynamic allocation for both the core objects and
+ for the strings used to hold values.
+ Some of this memory the library caller owns and must free, and some of
+ the memory is managed by the library.
+ Here is a summary of the memory rules.
+
+\layout Description
+
+1) If the function name has "new" in it, the caller gets control of the
+ memory.
+ ( such as icalcomponent_new(), or icalproperty_new_clone() )
+\layout Description
+
+2) If you got the memory from a routine with new in it, you must call the
+ corresponding *_free routine to free the memory.
+ ( Use icalcomponent_free() to free objects created with icalcomponent_new())
+
+\layout Description
+
+3) If the function name has "add" in it, the caller is transferring control
+ of the memory to the routine.
+ ( icalproperty_add_parameter() )
+\layout Description
+
+4) If the function name has "remove" in it, the caller passes in a pointer
+ to an object and after the call returns, the caller owns the object.
+ So, before you call icalcomponent_remove_property(comp,foo), you do not
+ own "foo" and after the call returns, you do.
+
+\layout Description
+
+5) If the routine returns a string, libical owns the memory and will put
+ it on a ring buffer to reclaim later.
+ For example, icalcomponent_as_ical_string().
+ You'd better strdup() it if you want to keep it, and you don't have to
+ delete it.
+
+\layout Subsection
+
+Error Handling
+\layout Standard
+
+Libical has several error handling mechanisms for the various types of programmi
+ng, semantic and syntactic errors you may encounter.
+\layout Subsubsection
+
+Return values
+\layout Standard
+
+Many library routines signal errors through their return values.
+ All routines that return a pointer, such as icalcomponent_new(), will return
+ 0 ( zero ) on a fatal error.
+ Some routines will return a value of enum icalerrorenum.
+
+\layout Subsubsection
+
+icalerrno
+\layout Standard
+
+Most routines will set the global error value icalerrno on errors.
+ This variable is an enumeration; permissible values can be found in libical/ica
+lerror.h.
+ If the routine returns an enum icalerrorenum, then the return value will
+ be the same as icalerrno.
+ You can use icalerror_strerror() to get a string that describes the error.
+ The enumerations are:
+\layout Standard
+\added_space_top 0.3cm \added_space_bottom 0.3cm \align center \LyXTable
+multicol5
+12 2 0 0 -1 -1 -1 -1
+1 1 0 0
+1 0 0 0
+1 0 0 0
+1 0 0 0
+1 0 0 0
+1 0 0 0
+1 0 0 0
+1 0 0 0
+1 0 0 0
+1 0 0 0
+1 0 0 0
+1 1 0 0
+2 1 0 "" ""
+2 1 1 "" ""
+0 8 1 0 0 0 0 "" ""
+0 8 1 0 0 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+
+
+\newline
+
+\newline
+ICAL_BADARG_ERROR
+\newline
+One of the argument to a routine was bad.
+ Typically for a null pointer.
+\newline
+ICAL_NEWFAILED_ERROR
+\newline
+A new() or malloc() failed
+\newline
+ICAL_MALFORMEDDATA_ERROR
+\newline
+An input string was not in the correct format
+\newline
+ICAL_PARSE_ERROR
+\newline
+the parser failed to parse an incomming component
+\newline
+ICAL_INTERNAL_ERROR
+\newline
+Largely equivalent to an assert; it indicates a bug in the libical code
+\newline
+ICAL_FILE_ERROR
+\newline
+A file operation failed.
+ Check errno for more detai
+\newline
+ICAL_ALLOCATION_ERROR
+\newline
+
+\newline
+ICAL_NO_ERROR
+\newline
+No error has occurred
+\newline
+ICAL_TIMEDOUT_ERROR
+\newline
+Failed to acquire a lock on a file, or the CSTP protocol timed out.
+
+\newline
+ICAL_MULTIPLEINCLUSION_ERROR
+\newline
+
+\newline
+ICAL_UNKNOWN_ERROR
+\newline
+
+\layout Subsubsection
+
+X-LIC-ERROR and X-LIC-INVALID-COMPONENT
+\layout Standard
+
+The library handles semantic and syntactic errors in components by inserting
+ errors properties into the components.
+ If the parser cannot parse incoming text ( a syntactic error ) or if the
+ icalrestriction_check() routine indicates that the component does not meet
+ the requirements of RFC2446 ( a semantic error) the library will insert
+ properties of the type X-LIC-ERROR to describe the error.
+ Here is an example of the error property:
+\layout LyX-Code
+
+X-LIC-ERROR;X-LIC-ERRORTYPE=INVALID_ITIP :Failed iTIP restrictions for property
+ DTSTART.
+
+\layout LyX-Code
+
+Expected 1 instances of the property and got 0
+\layout Standard
+
+This error resulted from a call to icalrestriction_check(), which discovered
+ that the component does not have a DTSTART property, as required by RFC2445.
+
+\layout Standard
+
+There are a few routines to manipulate error properties:
+\layout Standard
+\LyXTable
+multicol5
+10 2 0 0 -1 -1 -1 -1
+1 1 0 0
+0 0 0 0
+0 1 1 0
+0 0 0 0
+0 1 1 0
+0 1 0 0
+0 1 1 0
+0 1 0 0
+0 1 1 0
+0 1 1 0
+2 1 1 "" ""
+2 1 1 "3in" ""
+0 2 1 1 0 0 0 "" ""
+0 8 1 0 0 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 1 0 1 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 0 0 1 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 1 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 1 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 1 1 0 1 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 1 1 0 1 "" ""
+0 2 1 0 0 0 0 "" ""
+0 2 1 1 0 0 1 "" ""
+
+Routine
+\newline
+Purpose
+\newline
+void icalrestriction_check()
+\newline
+Check a component against RFC2446 and insert
+\newline
+
+\newline
+error properties to indicate non compliance
+\newline
+int icalcomponent_count_errors()
+\newline
+Return the number of error properties
+\newline
+
+\newline
+in a component
+\newline
+void icalcomponent_strip_errors()
+\newline
+Remove all error properties in as
+\newline
+
+\newline
+component
+\newline
+void icalcomponent_convert_errors()
+\newline
+Convert some error properties into
+\newline
+
+\newline
+REQUESTS-STATUS proprties to indicate the inability to
+\newline
+
+\newline
+process the component as an iTIP request.
+
+\layout Standard
+
+The types of errors are listed in icalerror.h.
+ They are:
+\layout LyX-Code
+
+ICAL_XLICERRORTYPE_COMPONENTPARSEERROR
+\layout LyX-Code
+
+ICAL_XLICERRORTYPE_PARAMETERVALUEPARSEERROR
+\layout LyX-Code
+
+ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR
+\layout LyX-Code
+
+ICAL_XLICERRORTYPE_PROPERTYPARSEERROR
+\layout LyX-Code
+
+ICAL_XLICERRORTYPE_VALUEPARSEERROR
+\layout LyX-Code
+
+ICAL_XLICERRORTYPE_UNKVCALPROP
+\layout LyX-Code
+
+ICAL_XLICERRORTYPE_INVALIDITIP
+\layout Standard
+
+The libical parser will generate the error that end in PARSEERROR when it
+ encounters garbage in the input steam.
+ ICAL_XLICERRORTYPE_INVALIDITIP is inserted by icalrestriction_check(),
+ and ICAL_XLICERRORTYPE_UNKVCALPROP is generated by icalvcal_convert() when
+ it encounters a vCal property that it cannot convert or does not know about.
+
+\layout Standard
+
+Icalcomponent_convert_errors() converts some of the error properties in
+ a component into REQUEST-STATUS properties that indicate a failure.
+ As of libical version0.18, this routine only convert *PARSEERROR errors
+ and it always generates a 3.x ( failure ) code.
+ This makes it more of a good idea than a really useful bit of code.
+
+\layout Subsubsection
+
+ICAL_ERRORS_ARE_FATAL and icalerror_errors_are_fatal
+\layout Standard
+
+If the global variable icalerror_errors_are_fatal is set to 1, then any
+ error condition will cause the program to abort.
+ The abort occurs in icalerror_set_errno(), and is done with an assert(0)
+ if NDEBUG is undefined, and with icalerror_crash_here if NDEBUG is defined.
+ The default value of icalerror_errors_are_fatal is 1 when ICAL_ERRORS_ARE_FATAL
+ is defined, and 0 otherwise.
+ Since ICAL_ERRORS_ARE_FATAL is defined by default, icalerror_errors_are_fatal
+ is also defined by default.
+
+\layout Subsection
+
+Naming Standard
+\layout Standard
+
+Structures that you access with the
+\begin_inset Quotes eld
+\end_inset
+
+struct
+\begin_inset Quotes erd
+\end_inset
+
+ keyword, such as
+\begin_inset Quotes eld
+\end_inset
+
+struct icaltimetype
+\begin_inset Quotes erd
+\end_inset
+
+ are things that you are allowed to see inside and poke at.
+
+\layout Standard
+
+Structures that you access though a typedef, such as
+\begin_inset Quotes eld
+\end_inset
+
+icalcomponent
+\begin_inset Quotes erd
+\end_inset
+
+ are things where all of the data is hidden.
+
+\layout Standard
+
+Component names that start with
+\begin_inset Quotes eld
+\end_inset
+
+V
+\begin_inset Quotes erd
+\end_inset
+
+ are part of RFC 2445 or another iCal standard.
+ Component names that start with
+\begin_inset Quotes eld
+\end_inset
+
+X
+\begin_inset Quotes erd
+\end_inset
+
+ are also part of the spec, but they are not actually components in the
+ spec.
+ However, they look and act like components, so they are components in libical.
+ Names that start with
+\begin_inset Quotes eld
+\end_inset
+
+XLIC
+\begin_inset Quotes erd
+\end_inset
+
+ or
+\begin_inset Quotes eld
+\end_inset
+
+X-LIC
+\begin_inset Quotes erd
+\end_inset
+
+ are not part of any iCal spec.
+ They are used internally by libical.
+
+\layout Standard
+
+Enums that identify a component, property, value or parameter end with
+\begin_inset Quotes eld
+\end_inset
+
+_COMPONENT,
+\begin_inset Quotes erd
+\end_inset
+
+
+\begin_inset Quotes eld
+\end_inset
+
+_PROPERTY,
+\begin_inset Quotes erd
+\end_inset
+
+
+\begin_inset Quotes eld
+\end_inset
+
+_VALUE,
+\begin_inset Quotes erd
+\end_inset
+
+ or
+\begin_inset Quotes eld
+\end_inset
+
+_PARAMETER
+\begin_inset Quotes erd
+\end_inset
+
+s
+\layout Standard
+
+Enums that identify a parameter value have the name of the parameter as
+ the second word.
+ For instance: ICAL_ROLE_REQPARTICIPANT or ICAL_PARTSTAT_ACCEPTED.
+\layout Standard
+
+The enums for the parts of a recurarance rule and request statuses are irregular.
+
+\layout Section
+
+Hacks and Bugs
+\layout Standard
+
+There are a lot of hacks in the library -- bits of code that I am not proud
+ of and should probably be changed.
+ These are marked with the comment string
+\begin_inset Quotes eld
+\end_inset
+
+HACK.
+\begin_inset Quotes erd
+\end_inset
+
+
+\the_end
diff --git a/libkcal/libical/doc/UsingLibical.ps b/libkcal/libical/doc/UsingLibical.ps
new file mode 100644
index 00000000..6223144e
--- /dev/null
+++ b/libkcal/libical/doc/UsingLibical.ps
@@ -0,0 +1,2327 @@
+%!PS-Adobe-2.0
+%%Creator: dvips(k) 5.86 Copyright 1999 Radical Eye Software
+%%Title: UsingLibical.dvi
+%%Pages: 22
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 612 792
+%%EndComments
+%DVIPSWebPage: (www.radicaleye.com)
+%DVIPSCommandLine: dvips -t letter -o
+%+ /usr/local/home/eric/proj/FreeAssociation/libical/doc/UsingLibical.ps
+%+ UsingLibical.dvi
+%DVIPSParameters: dpi=600, compressed
+%DVIPSSource: TeX output 2001.01.09:0928
+%%BeginProcSet: texc.pro
+%!
+/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
+N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
+mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
+0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
+landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize
+mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[
+matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round
+exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
+statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
+N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
+/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
+/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2
+array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
+df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A
+definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get
+}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub}
+B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr
+1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3
+1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx
+0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx
+sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{
+rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp
+gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B
+/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{
+/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{
+A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy
+get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse}
+ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp
+fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17
+{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add
+chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{
+1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop}
+forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn
+/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put
+}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{
+bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A
+mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{
+SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{
+userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X
+1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4
+index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
+/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{
+/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)
+(LaserWriter 16/600)]{A length product length le{A length product exch 0
+exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse
+end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask
+grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot}
+imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round
+exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto
+fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p
+delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M}
+B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{
+p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S
+rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end
+
+%%EndProcSet
+TeXDict begin 40258431 52099146 1000 600 600 (UsingLibical.dvi)
+@start
+%DVIPSBitmapFont: Fa ecti1000 10 7
+/Fa 7 118 df<EA03C0EA07F0120F121F13F8A313F0EA07B0EA003013701360A213E013
+C01201EA038013005A120E5A5A5A5A5A0D197A8819>44 D<147F903803FFC090380FC1E0
+90381F0070017E13784913383901F801F83803F003120713E0120FD81FC013F091C7FC48
+5AA2127F90C8FCA35A5AA45AA3153015381578007C14F0007EEB01E0003EEB03C0EC0F80
+6CEB3E00380F81F83803FFE0C690C7FC1D2677A426>99 D<D801E001FEEB07F03C07F803
+FF801FFC3C0E3C0F07C0783E3C1E3E3C03E1E01F261C1F78D9F3C013803C383FF001F780
+0F02E01400007801C013FE007018C002805B4A4848EB1F80EAF07FD8E07E5CA200000207
+143F01FE1700495CA2030F5C0001177E495C18FE031F5C120349DA8001131C18F8033F15
+3C00070403133849020013F0A24B1570000F17E049017E15F019E003FEECE1C0001FEE01
+E34949903800FF000007C70038143C3E2679A444>109 D<3903C003F0390FF01FFC391E
+783C0F381C7C703A3C3EE03F8038383FC0EB7F800078150000701300151CD8F07E90C7FC
+EAE0FE5BA2120012015BA312035BA312075BA3120F5BA3121F5BA3123F90C9FC120E2126
+79A423>114 D<14FE903807FF8090380F83C090383E00E04913F00178137001F813F000
+01130313F0A215E00003EB01C06DC7FC7FEBFFC06C13F814FE6C7F6D13807F010F13C013
+00143F141F140F123E127E00FE1480A348EB1F0012E06C133E00705B6C5B381E03E06CB4
+5AD801FEC7FC1C267AA422>I<EB0380EB07C0130FA4131F1480A3133F1400A35B137E00
+7FB5FCA2B6FC3800FC00A312015BA312035BA312075BA3120F5BA3121FEB801CA2143C00
+3F1338EB0078147014F014E0EB01C0EA3E03381F0780380F0F00EA07FCEA01F0183579B3
+1C>I<13F8D803FEEB01C0D8078FEB03E0390E0F8007121E121C0038140F131F007815C0
+1270013F131F00F0130000E015805BD8007E133FA201FE14005B5D120149137EA215FE12
+0349EBFC0EA20201131E161C15F813E0163CD9F003133814070001ECF07091381EF8F03A
+00F83C78E090393FF03FC090390FC00F00272679A42D>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fb ecbx1200 12 42
+/Fb 42 122 df<B612F8A91D097F9A25>45 D<EA07C0EA1FF0EA3FF8EA7FFCEAFFFEA7EA
+7FFCEA3FF8EA1FF0EA07C00F0F788E1F>I<EC03C01407141F147FEB03FF133FB6FCA413
+C3EA0003B3B3ADB712FCA5264177C038>49 D<ECFFE0010F13FE013F6D7E90B612E00003
+15F82607FC0313FE3A0FE0007FFFD81F806D138048C7000F13C0488001C015E001F07F00
+FF6E13F07F17F881A46C5A6C5A6C5AC9FC17F05DA217E05D17C04B13804B1300A2ED1FFC
+4B5A5E4B5A4B5A4A90C7FC4A5A4A5AEC0FF04A5AEC3F804AC7127814FE495A494814F8D9
+07E014F0495A495A49C8FC017C140149140348B7FC4816E05A5A5A5A5AB8FC17C0A42D41
+7BC038>I<ECFFF0010713FF011F14C0017F14F049C66C7ED803F8EB3FFED807E06D7E81
+D80FF86D138013FE001F16C07FA66C5A6C4815806C485BC814005D5E4B5A4B5A4B5A4A5B
+020F1380902607FFFEC7FC15F815FF16C090C713F0ED3FFCED0FFEEEFF80816F13C017E0
+A26F13F0A217F8A3EA0FC0EA3FF0487EA2487EA217F0A25D17E06C5A494913C05BD83F80
+491380D81FF0491300D80FFEEBFFFE6CB612F800015D6C6C14C0011F49C7FC010113E02D
+427BC038>I<163FA25E5E5D5DA25D5D5D5DA25D92B5FCEC01F7EC03E7140715C7EC0F87
+EC1F07143E147E147C14F8EB01F0EB03E0130714C0EB0F80EB1F00133E5BA25B485A485A
+485A120F5B48C7FC123E5A12FCB91280A5C8000F90C7FCAC027FB61280A531417DC038>
+I<0007150301E0143F01FFEB07FF91B6FC5E5E5E5E5E16804BC7FC5D15E092C8FC01C0C9
+FCAAEC3FF001C1B5FC01C714C001DF14F09039FFE03FFC9138000FFE01FC6D7E01F06D13
+804915C0497F6C4815E0C8FC6F13F0A317F8A4EA0F80EA3FE0487E12FF7FA317F05B5D6C
+4815E05B007EC74813C0123E003F4A1380D81FC0491300D80FF0495AD807FEEBFFFC6CB6
+12F0C65D013F1480010F01FCC7FC010113C02D427BC038>I<4AB47E021F13F0027F13FC
+49B6FC01079038807F8090390FFC001FD93FF014C04948137F4948EBFFE048495A5A1400
+485A120FA248486D13C0EE7F80EE1E00003F92C7FCA25B127FA2EC07FC91381FFF8000FF
+017F13E091B512F89039F9F01FFC9039FBC007FE9039FF8003FF17804A6C13C05B6F13E0
+A24915F0A317F85BA4127FA5123FA217F07F121FA2000F4A13E0A26C6C15C06D4913806C
+018014006C6D485A6C9038E01FFC6DB55A011F5C010714C0010191C7FC9038003FF02D42
+7BC038>I<121E121F13FC90B712FEA45A17FC17F817F017E017C0A2481680007EC8EA3F
+00007C157E5E00785D15014B5A00F84A5A484A5A5E151FC848C7FC157E5DA24A5A14035D
+14074A5AA2141F5D143FA2147F5D14FFA25BA35B92C8FCA35BA55BAA6D5A6D5A6D5A2F44
+7AC238>I<EE1F80A24C7EA24C7EA34C7EA24B7FA34B7FA24B7FA34B7F169F031F80161F
+82033F80ED3E07037E80157C8203FC804B7E02018115F0820203814B137F0207815D173F
+020F814B7F021F8292C77EA24A82023E80027E82027FB7FCA291B87EA2498302F0C8FCA2
+0103834A157F0107834A153FA249488284011F8491C97E4984133E017E82B6020FB612F0
+A54C457CC455>65 D<DCFFF01470031F01FF14F04AB6EAE0010207EDF803023FEDFE0791
+B539E001FF0F4949C7EA3F9F010701F0EC0FFF4901C0804990C87E494881494881494816
+7F4849163F4849161F5A4A160F485B19074890CAFC19035A5BA2007F1801A34994C7FC12
+FFAE127F7F1AF0A2123FA27F6C18011AE06C7F19036C6D17C06E16077E6C6DEE0F806C6D
+EE1F006D6C5E6D6C167E6D6C6C5D6D6D4A5A6D01F0EC07F0010101FEEC1FE06D903AFFF0
+01FF80023F90B6C7FC020715FC020115F0DA001F1480030001F8C8FC44467AC451>67
+D<BA12F8A485D8001F90C71201EF003F180F180318011800A2197E193EA3191EA21778A2
+85A405F890C7FCA316011603161F92B5FCA5ED001F160316011600A2F101E01778A2F103
+C0A494C7FC1907A21A80A2190FA2191FA2193FF17F0061601807181F4DB5FCBBFC61A443
+447DC34A>69 D<B7D88003B612FEA526003FFEC9EBF800B3A791B9FCA54AC9FCB3AAB7D8
+8003B612FEA54F447CC358>72 D<B712F0A526003FFECAFCB3B1F00780A4180F1900A460
+A360A2187EA218FE170117031707171F177FEE03FFB95AA539447CC343>76
+D<B500FE067FB512806E95B6FCA26F5EA2D8003F50C7FC013D6DEE03DFA2013C6DEE079F
+A26E6CEE0F1FA26E6C161EA26E6C163CA36E6C1678A26E6C16F0A26E6DEC01E0A26E6DEC
+03C0A36E6DEC0780A26F6CEC0F00A26F6C141EA26F6C5CA36F6C5CA26F6C5CA26F6D485A
+A26F6D485AA26F6D485AA3706C48C7FCA293383FF81EA2706C5AA2706C5AA3706C5AA270
+5BA2705BA2705BA2B6057FB6128071C7FCA2173E171C61447CC36A>I<B64BB512FE8181
+A281D8003F6D91C7EA780081013D7F81133C6E7E6E7F6E7F6E7F6E7F82806E7F6E7F6F7E
+6F7F83816F7F6F7F6F7F6F7F6F7F8382707F707F707F707F8482707F707F717E71138071
+13C019E0837113F07113F87113FC7113FE19FF847213F884848484A28484197F193F191F
+A2190F1907B61603190119001A78A24F447CC358>I<923807FFC092B512FE0207ECFFC0
+021F15F091267FFE0013FC902601FFF0EB1FFF01070180010313C04990C76C7FD91FFC6E
+6C7E49486F7E49486F7E01FF8348496F7E48496F1380A248496F13C0A24890C96C13E0A2
+4819F04982003F19F8A3007F19FC49177FA400FF19FEAD007F19FC6D17FFA3003F19F8A2
+6D5E6C19F0A26E5D6C19E0A26C6D4B13C06C19806E5D6C6D4B13006C6D4B5A6D6C4B5A6D
+6C4B5A6D6C4A5B6D01C001075B6D01F0011F5B010101FE90B5C7FC6D90B65A023F15F802
+0715C002004AC8FC030713C047467AC454>I<B9FC18F018FE727E19E0D8001F90C7000F
+7F05017F716C7E727E727E721380A21AC084A21AE0A91AC0A24E1380A21A00604E5A4E5A
+4D485A050F5B92B712C096C7FC18FC18C092CBFCB3A7B712E0A543447DC34D>I<DAFFE0
+131C010701FE133C013F9038FF807C90B6EAE0FC4815F9489038801FFF3907FC00014848
+EB007F4848143F4848140F491407007F15035B1601160012FF177CA27FA26D153C7F7F6D
+92C7FC6C7EEBFFE014FE6CEBFFF015FF6C15E016FC6C816C6F7E6C826C826C6C81011F81
+0107811300020F80140003077FED007F82040F1380828212F082A282A27EA218007EA26C
+5D6C5E6D14036D5D6D140701F84A5A01FFEC3FF002F8EBFFE0486CB65AD8FC1F92C7FCD8
+F80714FC48C614F0480107138031467AC43E>83 D<003FBA12E0A59026FE000FEB8003D8
+7FE09338003FF049171F90C71607A2007E1803007C1801A300781800A400F819F8481978
+A5C81700B3B3A20107B8FCA545437CC24E>I<B792B6FCA526003FFECAEAFC00806D606F
+15016D608119036D606F15076D606F150F6D6081191F6D6D93C7FC61027F163E6F157E02
+3F167C8119FC6E6D5C18016E5E7013036E5E8218076E6D5C180F6E5E70131F6E93C8FC70
+5B037F143E82187E033F147C7013FC6F5C17816F5C17C117C36F5C17E76F5C17FF6F5CA3
+6F91C9FCA2705AA2705AA3705AA2705AA2705AA250457EC355>86
+D<903801FFE0011F13FE017F6D7E48B612E03A03FE007FF84848EB1FFC6D6D7E486C6D7E
+A26F7FA36F7F6C5A6C5AEA00F090C7FCA40203B5FC91B6FC1307013F13F19038FFFC0100
+0313E0481380381FFE00485A5B127F5B12FF5BA35DA26D5B6C6C5B4B13F0D83FFE013EEB
+FFC03A1FFF80FC7F0007EBFFF86CECE01FC66CEB8007D90FFCC9FC322F7DAD36>97
+D<EB7FC0B5FCA512037EB1ED0FF892B57E02C314E002CF14F89139DFC03FFC9139FF000F
+FE02FCEB03FF4A6D13804A15C04A6D13E05CEF7FF0A218F8173FA318FCAC18F8A2177F18
+F0A3EFFFE06E15C06E5B6E491380027C491300496C495A903AFC1FC07FFC496CB512F0D9
+F00314C049C691C7FCC8EA1FF036467DC43E>I<EC3FFC49B512C0010F14F0013F14FC90
+397FF003FE9039FFC001FF0003495A48494813805B120F485AA2485A6F1300007F6E5AED
+00784991C7FCA212FFAC6C7EA3123F6DEC03C0A26C6C1407000F16806D140F6C6DEB1F00
+6C6D133E6C01F05B3A007FFC03F86DB55A010F14C0010391C7FC9038003FF82A2F7CAD32
+>I<EE03FEED07FFA5ED001F160FB1EC3FE0903803FFFC010FEBFF8F013F14CF9039FFF8
+07FF48EBC00148903880007F4890C7123F4848141F49140F121F485AA3127F5BA212FFAC
+127FA37F123FA26C6C141FA26C6C143F0007157F6C6C91B5FC6CD9C00314FC6C9038F01F
+EF6DB5128F011FEBFE0F010713F89026007FC0EBF80036467CC43E>I<EC3FF80103B57E
+010F14E0013F8090397FF83FF89039FFC007FC48496C7E48496C7E48486D1380485A001F
+ED7FC05B003FED3FE0A2127F5B17F0161F12FFA290B7FCA401F0C9FCA5127FA27FA2123F
+17F06C7E16016C6C15E06C6C14036C6DEB07C06C6DEB0F806C01F0EB3F0090397FFE01FE
+011FB55A010714F0010114C09026001FFEC7FC2C2F7DAD33>I<EDFF80020F13E0027F13
+F049B512F849EB8FFC90390FFE0FFE90381FFC1F14F8133FEB7FF0A2ED0FFCEBFFE0ED03
+F0ED00C01600ABB612F8A5C601E0C7FCB3B0007FEBFFE0A527467DC522>I<DAFFE0137E
+010F9039FE03FF80013FEBFF8F90B812C048D9C07F133F489038001FF84848EB0FFC4848
+903907FE1F80001F9238FF0F00496D90C7FCA2003F82A8001F93C7FCA26D5B000F5D6C6C
+495A6C6C495A6C9038C07FF04890B55A1680D8078F49C8FC018013E0000F90CAFCA47F7F
+7F90B612C016FC6CEDFF8017E06C826C16FC7E000382000F82D81FF0C77ED83FC0140748
+48020113808248C9FC177FA46D15FF007F17006D5C6C6C4A5A6C6C4A5AD80FFEEC3FF83B
+07FFC001FFF0000190B612C06C6C92C7FC010F14F8D9007F90C8FC32427DAC38>I<EB7F
+C0B5FCA512037EB1ED07FE92383FFF8092B512E002C114F89139C7F03FFC9138CF801F91
+39DF000FFE14DE14FC4A6D7E5CA25CA35CB3A7B60083B512FEA537457CC43E>I<137C48
+B4FC4813804813C0A24813E0A56C13C0A26C13806C1300EA007C90C7FCAAEB7FC0EA7FFF
+A512037EB3AFB6FCA518467CC520>I<EC03E0EC0FF8EC1FFCEC3FFEA2EC7FFFA5EC3FFE
+A2EC1FFCEC0FF8EC03E091C7FCAAEC01FF0103B5FCA5EB000F80B3B3A7EA1F80EA3FC0EA
+7FE0EAFFF0EC0FFEA215FC141F01E013F8007FEB3FF0393FC0FFE06CB512806C14000003
+13FCC613C0205A86C522>I<EB7FC0B5FCA512037EB3B3B3A3B61280A519457CC420>108
+D<90277F8007FEEC0FFCB590263FFFC090387FFF8092B5D8F001B512E002816E4880913D
+87F01FFC0FE03FF8913D8FC00FFE1F801FFC0003D99F009026FF3E007F6C019E6D013C13
+0F02BC5D02F86D496D7EA24A5D4A5DA34A5DB3A7B60081B60003B512FEA5572D7CAC5E>
+I<90397F8007FEB590383FFF8092B512E0028114F8913987F03FFC91388F801F00039039
+9F000FFE6C139E14BC02F86D7E5CA25CA35CB3A7B60083B512FEA5372D7CAC3E>I<EC1F
+FC49B512C0010714F0011F14FC90397FF80FFF9026FFC0017F48496C7F4848C7EA3FE000
+078248486E7E49140F001F82A2003F82491407007F82A400FF1780AA007F1700A46C6C4A
+5AA2001F5E6D141F000F5E6C6C4A5AA26C6C6CEBFFE06C6D485B27007FF80F90C7FC6DB5
+5A010F14F8010114C09026001FFCC8FC312F7DAD38>I<90397FC00FF8B590B57E02C314
+E002CF14F89139DFC03FFC9139FF001FFE000301FCEB07FF6C496D13804A15C04A6D13E0
+5C7013F0A2EF7FF8A4EF3FFCACEF7FF8A318F017FFA24C13E06E15C06E5B6E4913806E49
+13006E495A9139DFC07FFC02CFB512F002C314C002C091C7FCED1FF092C9FCADB67EA536
+407DAC3E>I<90387F807FB53881FFE0028313F0028F13F8ED8FFC91389F1FFE000313BE
+6C13BC14F8A214F0ED0FFC9138E007F8ED01E092C7FCA35CB3A5B612E0A5272D7DAC2E>
+114 D<90391FFC038090B51287000314FF120F381FF003383FC00049133F48C7121F127E
+00FE140FA215077EA27F01E090C7FC13FE387FFFF014FF6C14C015F06C14FC6C80000380
+6C15806C7E010F14C0EB003F020313E0140000F0143FA26C141F150FA27EA26C15C06C14
+1FA26DEB3F8001E0EB7F009038F803FE90B55A00FC5CD8F03F13E026E007FEC7FC232F7C
+AD2C>I<EB01E0A51303A41307A2130FA2131FA2133F137F13FF1203000F90B51280B7FC
+A4C601E0C7FCB3A3ED01E0A9150302F013C0137F150790393FF80F8090391FFC1F006DB5
+FC6D13FC01015B9038003FE023407EBE2C>I<D97FC049B4FCB50103B5FCA50003EC000F
+6C81B3A85EA25EA25E7E6E491380017FD901F713FE9138F807E76DB512C7010F14070103
+13FE9026007FF0EBFC00372E7CAC3E>I<B500FE90383FFFF0A5C601F0903803E0006D6C
+495A6D6C495A011F4AC7FC6E5B6D6C137E6DEB807C6D6D5A6DEBC1F0EDE3E06DEBF7C06E
+B45A806E90C8FC5D6E7E6E7F6E7FA24A7F4A7F8291381F3FFCEC3E1F027C7F4A6C7E4948
+6C7F01036D7F49487E02C08049486C7F49C76C7E013E6E7E017E141FB500E090B512FCA5
+362C7EAB3B>120 D<B6903803FFFCA5000101E09038003E006C163C80017F5D8017F801
+3F5D6E1301011F5D6E1303010F5D6E13076D5DED800F6D92C7FC15C05E6DEBE01E163E6D
+143CEDF07C027F1378EDF8F8023F5B15FD021F5B15FF6E5BA36E5BA26E90C8FCA26E5AA2
+6E5AA21578A215F85D14015D001F1303D83F805B387FC007D8FFE05B140F92C9FC5C143E
+495A387FC1F8EB07F06CB45A6C5B000790CAFCEA01FC36407EAB3B>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fc ectt1000 10 78
+/Fc 78 123 df<121FEA3F80EA7FC0EAFFE0B0EA7FC0AEEA1F00C7FCA7121FEA3F80EA7F
+C0EAFFE0A5EA7FC0EA3F80EA1F000B3470B32C>33 D<003C131E007F137F481480A66C14
+00A6007E7FA6003E133EA3003C131E001C131C191977B32C>I<EA0F80EA1FE0EA3FF012
+7F13F8A213FCA2123F121F120FEA007CA313FC13F8A2120113F01203EA07E0A2EA0FC0EA
+3F80127FEAFF005A12F812700E1D71B22C>39 D<143814FC13011303EB07F8EB0FF0EB1F
+C0EB3F80EB7F0013FE485A485A5B12075B120F5B485AA2123F90C7FCA25A127EA312FE5A
+AC7E127EA3127F7EA27F121FA26C7E7F12077F12037F6C7E6C7E137FEB3F80EB1FC0EB0F
+F0EB07F8EB03FC130113001438164272B92C>I<127012FC7E7E6C7E6C7EEA0FE06C7E6C
+7E6C7E6C7E137F7F1480131F14C0130FEB07E0A214F01303A214F81301A314FC1300AC13
+0114F8A3130314F0A2130714E0A2EB0FC0131F1480133F14005B13FE485A485A485A485A
+EA3FC0485A48C7FC5A5A1270164279B92C>I<EB0380497EA60020140800F8143E00FE14
+FE00FF13C1EBC7C7EBE7CF003FB512F8000F14E0000314806C140038007FFCA248B5FC48
+1480000F14E0003F14F839FFE7CFFEEBC7C7EB07C100FE13C000F8143E00201408000014
+00A66D5A1F247AAA2C>I<147014F8AF003FB612E0B712F8A4C700F8C7FCB0147025267D
+AB2C>I<EA0F80EA1FE0EA3FF0EA7FF8A213FCA3123F121F120F120013F8A21201EA03F0
+1207EA1FE0EA7FC0EAFF80130012FC12700E17718A2C>I<007FB512F0B612F8A36C14F0
+1D0579942C>I<121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F000B0B708A2C>I<1507
+ED0F80A2151F16005D153E157E157CA215FC5D14015D14035D14075D140F5D141F92C7FC
+5C143EA2147E147C14FC5C13015C13035C13075C130F5C131F91C8FC5B133EA2137E137C
+13FC5B12015B12035B12075B120F5B121F90C9FCA25A123E127E127C12FC5AA212702141
+7BB92C>I<EB03F8EB0FFE90383FFF80497F90B57E3901FE0FF03903F803F848486C7EEB
+E0004848137EA248487FA248C7EA1F80A2003E140F007E15C0A3007C140700FC15E0AC6C
+140F007E15C0A46CEC1F80A36C6CEB3F00A26C6C137E6D13FE00075CEBF0016C6C485A39
+01FE0FF06CB55A6D5B6D5BD90FFEC7FCEB03F823357CB32C>I<1307497EA2131FA2133F
+137F13FF5A1207127FB5FC13DF139FEA7C1F1200B3AE007FB512E0B612F0A36C14E01C34
+77B32C>I<EB0FF890387FFF8048B512E00007804814FC391FF80FFE393FE001FF903880
+007F48C7EA3F80007E141F00FE15C0150F6C15E01507A3127E123CC8FCA2150F16C0151F
+1680153F16005D15FE4A5A14034A5A4A5A4A5A4A5AECFF804948C7FC495A495A495AEB3F
+E0EB7F8049C8FC485A4848EB03C04848EB07E0EA1FE0485A48B6FCB7FCA36C15C023347C
+B32C>I<EB0FFC90387FFF8048B512E0000714F84880391FF807FEEBC0004848137F6D7F
+1680151FA26C5A6CC7FCC8FC153F16005D15FE14014A5AEC1FF890381FFFF0495BA215F8
+6D7F90380007FEEC00FF81ED3F80ED1FC0150FA216E01507A2123C127EB4FC150F16C0A2
+48141F007FEC3F806DEB7F006C6C5B391FF807FE6CB55A6C5C6C14E0C66C1380D90FFCC7
+FC23357CB32C>I<EC07F04A7E141F143FA2147EA214FCEB01F8A2EB03F0EB07E0A2EB0F
+C0EB1F80A2EB3F00137EA25B485AA2485A5B1207485AA2485A48C7FCA2127E5AB712FC16
+FEA36C15FCC8EAF800AA91387FFFF091B512F8A36E13F027347EB32C>I<000FB512FE48
+80A35D0180C8FCADEB83FE90389FFF8090B512E015F8819038FE03FE9038F000FF01C07F
+49EB3F8090C7121F6C15C0C8120FA2ED07E0A4123C127EB4FC150F16C0A248141F007EEC
+3F80007FEC7F006C6C5B6D485A391FF80FFC6CB55A6C5C000114C06C6C90C7FCEB0FF823
+347CB22C>I<EC3FC0903801FFF801077F011F7F497F90387FE07F9039FF003F80484813
+7FEA03F8485A5B000FEC3F004848131E4990C7FC123F90C9FCA25A127EEB03FE90381FFF
+80D8FC7F13E000FDB57EB67E9038FE07FC9038F001FE9038C0007F49EB3F8090C7121F16
+C048140F16E01507A3127EA47E150F6D14C0001F141F6D1480000F143F6DEB7F003907F8
+01FE3903FE07FC6CB55A6C5C6D5B011F1380D907FCC7FC23357CB32C>I<1278B712C016
+E0A316C000FCC7EA3F80ED7F0015FE00785CC712014A5A4A5A5D140F5D4A5A143F92C7FC
+5C147E14FE5C13015CA2495AA213075CA3495AA4495AA5133F91C8FCAA131E23357CB32C
+>I<EB07FC90383FFF8090B512E0000314F84880390FFC07FE391FF001FF9038C0007F48
+48EB3F8090C7121F4815C0007E140FA56CEC1F80A26C6CEB3F006D5B390FF001FE3903FC
+07F86CB55A6C6C13C0D907FCC7FC90387FFFC048B512F03903FC07F8390FF001FE391FC0
+007F497F48C7EA1F80007EEC0FC0A248EC07E0A7007EEC0FC0A2007F141F6C6CEB3F806C
+6CEB7F009038F001FF390FFC07FE6CB55A6C5CC614E0013F1380D907FCC7FC23357CB32C
+>I<EB07FCEB3FFF90B512C0488048803907FC07F8390FF001FC48486C7ED83F80137E15
+7F48C77E007EEC1F8012FE5AED0FC0A416E0A37E127E007F141F7E6D133F6C6C137F390F
+F001FF3807FC0F6CB6FC6C14F76C14C7013F130FD90FF813C090C7FCA2151F1680153F16
+00000F5C486C137E486C13FE4A5A4A5A14079038801FF0391FE07FE090B55A6C91C7FC6C
+5B000113F838007FC023357CB32C>I<121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F
+00C7FCAE121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F000B2470A32C>I<EA0F80EA
+1FC0EA3FE0EA7FF0A5EA3FE0EA1FC0EA0F80C7FCAEEA0F80EA1FE0EA3FF0EA7FF8A213FC
+A3123F121F120F120013F8A21201EA03F01207EA1FE0EA7FC0EAFF80130012FC12700E30
+71A32C>I<007FB612F0B712F8A36C15F0CAFCA8007FB612F0B712F8A36C15F025127DA1
+2C>61 D<EC7F80903803FFE0010F7F013F7F497F9038FFC0FE3901FE007FD803F87F4848
+EB1F809038E00FCF390FC03FFF48484813C091B5FCEA3F01393E03F87F903907F03FE000
+7EEBE01F397C0FC00FEC8007A2EAFC1F00F8EB0003A900FCEB8007D87C0F14C0A2ECC00F
+3A7E07E01F80003EEBF03F903903F87F00393F01FFFED81F805B6E5A6C6C6C5A3907E00F
+C09039F00007C06C6CEB0FE0D801FE131F3900FFC0FF6DB512C06D1480010FEBFE000103
+13F89038007FC023337CB22C>64 D<14FE497EA4497FA214EFA2130781A214C7A2010F7F
+A314C390381F83F0A590383F01F8A490387E00FCA549137E90B512FEA34880A29038F800
+3FA34848EB1F80A4000715C049130FD87FFEEBFFFC6D5AB514FE6C15FC497E27347EB32C
+>I<007FB512E015F8B612FE6C8016C03903F0003FED0FE0ED07F01503A2ED01F8A6ED03
+F0A21507ED0FE0ED1FC0EDFF8090B612005D5D15FF16C09039F0001FE0ED07F0ED03F815
+01ED00FCA216FE167EA616FE16FC1501ED03F8150FED3FF0007FB612E016C0B712806CEC
+FE0015F027337FB22C>I<02FF13700107EBE0F84913F9013F13FD4913FFEBFF813901FE
+007F4848131FD807F0130F1507485A491303485A150148C7FCA25A007EEC00F01600A212
+FE5AAB7E127EA3007F15F06CEC01F8A26C7EA26C6C13036D14F06C6C130716E0D803FC13
+1F6C6CEB3FC03A00FF81FF806DB512006D5B010F5B6D13F00100138025357DB32C>I<00
+7FB5FCB612C015F0816C803907E003FEEC00FFED7F80153FED1FC0ED0FE0A2150716F015
+0316F81501A4ED00FCACED01F8A3150316F0A2150716E0150FED1FC0153FED7F80EDFF00
+EC03FE007FB55AB65A5D15C06C91C7FC26337EB22C>I<007FB612F0B712F8A37E3903F0
+0001A7ED00F01600A4EC01E04A7EA490B5FCA5EBF003A46E5A91C8FCA5163C167EA8007F
+B612FEB7FCA36C15FC27337EB22C>I<007FB612F8B712FCA37ED803F0C7FCA716781600
+A515F04A7EA490B5FCA5EBF001A46E5A92C7FCAD387FFFE0B5FC805C7E26337EB22C>I<
+903901FC038090390FFF87C04913EF017F13FF90B6FC4813073803FC01497E4848137F48
+48133F49131F121F5B003F140F90C7FCA2127EED078092C7FCA212FE5AA8913803FFF84A
+13FCA27E007E6D13F89138000FC0A36C141FA27F121F6D133F120F6D137F6C7E6C6C13FF
+6D5A3801FF076C90B5FC6D13EF011F13CF6DEB0780D901FCC7FC26357DB32C>I<D87FFE
+EBFFFCB54813FEA36C486C13FCD807E0EB0FC0B190B6FCA59038E0000FB3D87FFEEBFFFC
+B54813FEA36C486C13FC27337EB22C>I<007FB512F8B612FCA36C14F839000FC000B3B3
+A5007FB512F8B612FCA36C14F81E3379B22C>I<0107B512804914C0A36D148090390003
+F000B3AF1218127EA2B4FCA24A5A48130F007F131F9038C07FC06CB55A6C91C7FC6C5B00
+0313F838007FC022347BB22C>I<D87FFCEB7FF8486CEBFFFCA36C48EB7FF8D807C0EB1F
+80153FED7F00157E5D4A5A14034A5A5D4A5A4A5A143F4AC7FC147E5CEBC1F813C3EBC7FC
+A2EBCFFEEBDFBEEBFFBF141F01FE7F496C7E13F86E7EEBF00301E07FEBC001816E7EA215
+7E153E153F811680ED0FC0A2ED07E0D87FFCEB1FFC486CEB3FFEA36C48EB1FFC27337EB2
+2C>I<387FFFE0B57EA36C5BD803F0C8FCB3AE16F0ED01F8A8007FB6FCB7FCA36C15F025
+337DB22C>I<D87FE0EB0FFC486CEB1FFEA26D133F007F15FC000F15E001BC137BA4019E
+13F3A3EB9F01A2018F13E3A21483A2018713C314C7A201831383A214EFA201811303A214
+FFEB80FEA3147C14381400ACD87FF0EB1FFC486CEB3FFEA36C48EB1FFC27337EB22C>I<
+D87FF0EB7FFC486CEBFFFEA27F007FEC7FFCD807FEEB07C013DEA213DF13CFA2148013C7
+14C0A213C314E0A213C114F0A213C014F8A2147CA3143EA2141E141FA2140F1587A21407
+15C7A2140315E71401A215F71400A215FFD87FFC137F487E153FA26C48EB1F8027337EB2
+2C>I<EB7FFF0003B512E0000F14F848804880EBE003EB800048C7127FA2007E80A300FE
+158048141FB3A86C143FA2007E1500A3007F5CA26C6C13FEEBF00790B5FC6C5C6C5C0003
+14E0C66C90C7FC21357BB32C>I<007FB512C0B612F88115FF6C15802603F00013C0153F
+ED0FE0ED07F0A2150316F81501A6150316F01507A2ED0FE0ED3FC015FF90B61280160015
+FC5D15C001F0C8FCB0387FFF80B57EA36C5B25337EB22C>I<EB7FFF0003B512E0000F14
+F848804880EBF007EB800048C7127FA2007E80A300FE158048141FB3A7EB01F0EB03F800
+FE143F267E01FC1300A2EB00FE007F5C147FD83F8013FEEBF03F90B5FC6C5C6C5C000314
+E0C67E90380007F0A26E7EA26E7EA26E7EA2157FA2153E21407BB32C>I<387FFFFCB67E
+15E015F86C803907E007FE1401EC007F6F7E151FA26F7EA64B5AA2153F4BC7FCEC01FE14
+0790B55A5D15E081819038E007FCEC01FE1400157F81A8160FEE1F80A5D87FFEEB1FBFB5
+ECFF00815E6C486D5AC8EA01F029347EB22C>I<90381FF80790B5EA0F804814CF000714
+FF5A381FF01F383FC003497E48C7FC007E147F00FE143F5A151FA46CEC0F00007E91C7FC
+127F7FEA3FE0EA1FFCEBFFC06C13FC0003EBFFC06C14F06C6C7F01077F9038007FFEEC07
+FF02001380153FED1FC0A2ED0FE0A20078140712FCA56CEC0FC0A26CEC1F806D133F01E0
+EB7F009038FE01FF90B55A5D00F914F0D8F83F13C0D8700790C7FC23357CB32C>I<007F
+B612FCB712FEA43AFC007E007EA70078153CC71400B3AF90383FFFFCA2497F6D5BA22733
+7EB22C>I<3B7FFF803FFFC0B56C4813E0A36C496C13C03B03F00001F800B3AF6D130300
+015DA26D130700005D6D130F017F495A6D6C485AECE0FF6DB5C7FC6D5B010313F86D5B90
+38003F802B3480B22C>I<D87FFCEB7FFC486CEBFFFEA36C48EB7FFCD80FC0EB07E06D13
+0F000715C0A36D131F00031580A36D133F00011500A36D5B0000147EA4017E5BA46D485A
+A490381F83F0A4010F5B14C7A301075BA214EFA201035BA214FFA26D90C7FCA46D5A2734
+7EB22C>I<D87FF0EB07FF486C491380A36C486D1300001FC8127CA46C6C5CA76C6C495A
+A4143E147FA33A03E0FF83E0A214F7A201E113C3A3000101E35BA201F113C701F313E7A3
+14C1A200005DA201F713F71480A301FF13FF017F91C7FC4A7EA4013E133E29347FB22C>
+I<3A3FFF03FFE0484913F0148714076C6D13E03A01F800FE007F0000495A13FE017E5BEB
+7F03013F5B1487011F5B14CF010F5B14FF6D5BA26D90C7FCA26D5AA26D5AA2497EA2497E
+A2497F81EB0FCF81EB1FC7EC87F0EB3F83EC03F8EB7F01017E7FEBFE00497F0001147E49
+137F000380491480151FD87FFEEBFFFC6D5AB514FE6C15FC497E27337EB22C>I<D87FFC
+EB7FFC486CEBFFFEA36C48EB7FFCD807F0EB0FC0151F000315806D133F12016DEB7F0012
+006D137E017E13FE017F5BEB3F01EC81F8131FEC83F0EB0FC314C7903807E7E0A201035B
+14EF6DB45AA292C7FC7F5C147EB0903807FFE0497FA36D5B27337EB22C>I<003FB612C0
+4815E0A4007EC7EA1FC0ED3F80A2ED7F00157E15FE4A5A003C5CC712034A5AA24A5A4A5A
+A24A5A4AC7FCA214FE495AA2495A495AA2495A495AA2495A49C8FCA213FE485AA24848EB
+03C049EB07E01207485A5B121F485AA248C7FCB7FCA46C15C023337CB22C>I<007FB6FC
+B71280A46C150021067B7D2C>95 D<3801FFF0000713FE001F6D7E15E048809038C01FF8
+1407EC01FC381F80000006C77EC8127EA3ECFFFE131F90B5FC1203120F48EB807E383FF8
+00EA7FC090C7FC12FE5AA47E007F14FEEB8003383FE01F6CB612FC6C15FE6C14BF0001EB
+FE1F3A003FF007FC27247CA32C>97 D<EA7FF0487EA3127F1201AAEC1FE0ECFFF801FB13
+FE90B6FC16809138F07FC09138801FE091380007F049EB03F85BED01FC491300A216FE16
+7EA816FE6D14FCA2ED01F86D13036DEB07F0150F9138801FE09138E07FC091B512801600
+01FB5B01F813F83900F03FC027337FB22C>I<903803FFE0011F13F8017F13FE48B5FC48
+804848C6FCEA0FF0485A49137E4848131890C9FC5A127EA25AA8127EA2127F6C140F6DEB
+1F806C7E6D133F6C6CEB7F003907FE03FF6CB55A6C5C6C6C5B011F13E0010390C7FC2124
+7AA32C>I<EC0FFE4A7EA380EC003FAAEB07F8EB3FFE90B512BF4814FF5A3807FC0F380F
+F00348487E497E48487F90C7FC007E80A212FE5AA87E007E5CA2007F5C6C7E5C6C6C5A38
+0FF0073807FC1F6CB612FC6CECBFFE6C143FEB3FFC90390FF01FFC27337DB22C>I<EB03
+FE90381FFFC0017F13F048B57E48803907FE03FE390FF800FFD81FE0EB3F805B4848EB1F
+C090C7120F5A007E15E015075AB7FCA416C000FCC9FC7E127EA2127F6CEC03C06DEB07E0
+6C7ED80FF0130F6C6CEB3FC001FF13FF000190B512806C1500013F13FC010F13F0010113
+8023247CA32C>I<EC0FF8EC3FFE91B5FC4914805B903807FC7F14F090390FE03F0014C0
+92C7FCA6007FB512FEB7FCA36C5C26000FC0C7FCB3A8003FB512F04880A36C5C21337DB2
+2C>I<ED03F8903907F80FFC90391FFE3FFE017FB6FC48B7FC48ECFE7F9038FC0FF82607
+F003133E3A0FE001FC1CD9C0001300001F8049137EA66D13FE000F5CEBE0016C6C485A39
+03FC0FF048B5FC5D481480D99FFEC7FCEB87F80180C8FCA37F6C7E90B512F06C14FE48EC
+FF804815E04815F03A3FC0001FF848C7EA03FC007E1400007C157C00FC157E48153EA46C
+157E007E15FCD87F801303D83FE0EB0FF8D81FFCEB7FF06CB612E0000315806C1500D800
+3F13F8010713C028387EA42C>I<EA7FF0487EA3127F1201AAEC1FE0EC7FFC9038F9FFFE
+01FB7F90B6FC9138F03F80ECC01F02807FEC000F5B5BA25BB3267FFFE0B5FCB500F11480
+A36C01E0140029337FB22C>I<1307EB1FC0A2497EA36D5AA20107C7FC90C8FCA7387FFF
+C080B5FC7EA2EA0007B3A8007FB512FCB612FEA36C14FC1F3479B32C>I<140EEC3F80A2
+EC7FC0A3EC3F80A2EC0E0091C7FCA748B512804814C0A37EC7120FB3B3A2141F003C1480
+007E133FB414005CEB01FEEBFFFC6C5B5C001F5B000790C7FC1A467CB32C>I<EA7FE048
+7EA3127F1201AA91381FFFF04A13F8A36E13F0913800FE004A5A4A5A4A5A4A5A4A5A4A5A
+4AC7FC14FEEBF1FC13F3EBF7FE90B5FCA2EC9F80EC0FC001FE7FEBFC07496C7E496C7E81
+1400157E811680151F3A7FFFC0FFFCB500E113FEA36C01C013FC27337EB22C>I<387FFF
+E0B57EA37EEA0003B3B3A5007FB61280B712C0A36C158022337BB22C>I<3A7F83F007E0
+9039CFFC1FF83AFFDFFE3FFCD87FFF13FF91B57E3A07FE1FFC3E01FCEBF83F496C487E01
+F013E001E013C0A301C01380B33B7FFC3FF87FF0027F13FFD8FFFE6D13F8D87FFC4913F0
+023F137F2D2481A32C>I<397FF01FE039FFF87FFC9038F9FFFE01FB7F6CB6FC00019038
+F03F80ECC01F02807FEC000F5B5BA25BB3267FFFE0B5FCB500F11480A36C01E014002924
+7FA32C>I<EB07FCEB1FFF017F13C048B512F048803907FC07FC390FF001FE48486C7E01
+80133F003F158090C7121F007EEC0FC0A348EC07E0A76C140F007E15C0A2007F141F6C15
+806D133F6C6CEB7F006D5B6C6C485A3907FC07FC6CB55A6C5C6C6C13C0011F90C7FCEB07
+FC23247CA32C>I<397FF01FE039FFF8FFF801FB13FE90B6FC6C158000019038F07FC091
+38801FE091380007F049EB03F85BED01FC491300A216FE167EA816FE6D14FCA2ED01F86D
+13036DEB07F0150F9138801FE09138E07FC091B51280160001FB5B01F813F8EC3FC091C8
+FCAD387FFFE0B57EA36C5B27367FA32C>I<903903FC078090391FFF0FC0017F13CF48B5
+12EF4814FF3807FE07380FF00148487E49137F4848133F90C7FC48141F127E150F5AA87E
+007E141FA26C143F7F6C6C137F6D13FF380FF0033807FC0F6CB6FC6C14EF6C6C138F6D13
+0FEB07F890C7FCAD0203B5FC4A1480A36E140029367DA32C>I<D87FFEEB3FC0B53801FF
+F0020713F8021F13FC6C5B39003F7FE1ECFF019138FC00F84A13704A13005CA25C5CA391
+C8FCAF007FB512E0B67EA36C5C26247EA32C>I<90387FF8700003B512F8120F5A5A387F
+C00F387E00034813015AA36CEB00F0007F140013F0383FFFC06C13FE6CEBFF80000314E0
+C66C13F8010113FCEB0007EC00FE0078147F00FC143F151F7EA26C143F6D133E6D13FE90
+38F007FC90B5FC15F815E000F8148039701FFC0020247AA32C>I<131E133FA9007FB6FC
+B71280A36C1500D8003FC8FCB1ED03C0ED07E0A5EC800F011FEB1FC0ECE07F6DB5128016
+0001035B6D13F89038003FE0232E7EAD2C>I<3A7FF003FF80486C487FA3007F7F0001EB
+000FB3A3151FA2153F6D137F3900FE03FF90B7FC6D15807F6D13CF902603FE0713002924
+7FA32C>I<3A7FFF01FFFCB514FE148314016C15FC3A03E0000F80A26D131F00011500A2
+6D5B0000143EA26D137E017C137CA2017E13FC013E5BA2EB3F01011F5BA21483010F5BA2
+14C701075BA214EF01035BA214FF6D90C7FCA26D5A147C27247EA32C>I<D87FFFEB7FFF
+6EB5FCB515806C16004A7ED807C0EB01F0A66C6C495AA3143E147FA2D801F0495AECFF87
+A214F7A201F113C700005D9038F9E3CFA201FB13EFA3D97BC190C7FC017F13FFA21480A2
+013F5B90381F007C29247FA32C>I<3A3FFF03FFF048018713F8A36C010313F03A00FC00
+7E005D90387E01F8013F5BEB1F83EC87E090380FCFC0903807EF80EB03FF6D90C7FC5C6D
+5A147C14FE130180903803EF80903807CFC0EB0FC7EC83E090381F01F0013F7FEB7E0001
+7C137C49137E0001803A7FFF01FFFC1483B514FE6C15FC140127247EA32C>I<3A7FFF01
+FFFCB5008113FE148314816C010113FC3A03E0000F806C7E151F6D140012005D6D133E13
+7C017E137E013E137CA2013F13FC6D5BA2EB0F815DA2EB07C1ECC3E0A2EB03E3ECE7C013
+0114F75DEB00FFA292C7FC80A2143EA2147E147CA214FC5CA2EA0C01003F5BEA7F83EB87
+E0EA7E0F495A387FFF806C90C8FC6C5A6C5AEA07E027367EA32C>I<003FB612E04815F0
+A4007EC7EA1FE0ED3FC0ED7F80EDFF004A5A003C495AC7485A4A5A4A5A4A5A4A5A4AC7FC
+EB01FC495AEB0FF0495A495A495A49C8FC4848EB01E04848EB03F0485A485A485A485A48
+5AB7FCA46C15E024247DA32C>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fd ecbx1000 10 57
+/Fd 57 122 df<913A03FF8007FE027F9039F07FFF800103B500FDB512E0010F903A00FF
+FE0FF0D93FF8ECF81F90267FE0019038F03FF849485A4816E014804816C00200ED1FF081
+F007C06F91C7FCA8B912E0A4000390C701C0C7FCB3ABB5D8FC3FEBFF80A43D3A7EB938>
+27 D<12E07E127C7E7E7F6C7E6C7E12037F6C7E7F12007F137E137FA2EB3F80A214C013
+1F14E0A2130F14F0A4EB07F8A514FCB114F8A5EB0FF0A414E0131FA214C0133F1480A2EB
+7F00A2137E13FE5B12015B485A5B1207485A485A90C7FC123E5A12F05A16537BBD25>41
+D<EA0F80EA3FE0EA7FF0A2EAFFF8A213FCA3127FA2123FEA0F9CEA001C133C1338A31378
+137013F0EA01E0A2EA03C0EA0780EA0F005A121C12180E1D798C1B>44
+D<B61280A819087F9620>I<EA0F80EA3FE0EA7FF0A2EAFFF8A5EA7FF0A2EA3FE0EA0F80
+0D0D798C1B>I<141E143E14FE1307137FB5FCA3138FEA000FB3B3A5007FB61280A42136
+79B530>49 D<EB0FFE90387FFFC048B512F0000714FC390FE03FFF261F800F1380263F00
+0313C0D87F8014E0EBE00100FF6D13F07FA2ED7FF8A46C5A6C5A0006C7FCC8FCEDFFF0A2
+16E05C16C04A138016004A5A4A5AEC1FF05D4A5A4AC7FC14FE495AD903F01378495A495A
+495A49C712F8017C14F05B49130148B6FC5A5A5A5A5A4815E0B7FCA425367BB530>I<EB
+03FF011F13F0017F13FC3901FC07FF2603F003138048486C13C0496C13E0EA0FF86D14F0
+487EA66C4814E06C5A6C485AC714C04A138016004A5A4A5AEC3FF090380FFFC05D15F090
+380007FE913801FF806E13C016E0ED7FF016F8ED3FFCA216FEEA1FC0487E487E487EA416
+FCA249137F007F15F801C0EBFFF06C5A6C6C4813E0260FFC0713806CB61200000114FC6C
+6C13F0010790C7FC27377CB530>I<ED07C0150FA2151F153F157F15FF5CA25C5C5C5C14
+3E143C5C5C1301495A5C495A495A5B133E5B13785B485A1203485A5B48C7FC121E5A127C
+5AB81280A4C70001EBC000AA0103B61280A429367DB530>I<001C15C0D81F80130701F8
+137F90B61280A216005D5D15F05D15804AC7FC14F090C9FCA7EB03FE90381FFFE0017F13
+F89038FE07FC9038F003FFD9C0011380496C13C090C7FC000E15E0C8127F16F0A216F8A3
+121FEA3FC0487E12FF7FA316F05B15FFD87F8014E0007EC713C0003E5B003F4913806C6C
+481300390FF01FFE6CB512F8000114E06C6C1380D90FF8C7FC25377BB530>I<EC0FF8EC
+FFFE0103EBFF8090390FF80FC090393FE003E090397F8001F09038FF000F48EC1FF84848
+133F485A120F5B121FA2003FEC1FF0ED0FE0484890C7FCA31408EC7FF039FFF1FFFC01F3
+13FFD9F78013809039FF007FC049EB3FE04914F0ED1FF85B16FCA34914FEA4127FA5123F
+16FCA26C7E16F8000F143F6D14F0000715E06C6CEB7FC03A01FF81FF806C90B51200013F
+13FC010F13F00101138027377CB530>I<123C123EEA3FE090B71280A41700485D5E5E5E
+5EA2007CC7EA0FC000784A5A4BC7FC00F8147E485C5D14014A5AC7485A4A5AA24A5A143F
+4AC8FCA214FEA213015C1303A21307A2130F5CA2131FA5133FA96D5A6D5A6D5A29397BB7
+30>I<49B47E010F13F0013F13FC9038FE01FF3A01F8007F804848EB3FC04848EB1FE015
+0F484814F01507121FA27F7F7F6D130F01FF14E014C09138E01FC06CEBF83F9138FE7F80
+6C9038FFFE005D6C14F06C14FC6C14FF6D14806D14C090B612E0D803FD14F02607F07F13
+F848487E261FC00F13FC383F8003007F010013FE90C7127F151F00FE140715031501A215
+00A216FC7E6C14016D14F86C6C13036DEB07F06C6CEB0FE0D80FFEEB7FC00003B61200C6
+14FC013F13F00103138027377CB530>I<ED03E04B7EA24B7EA34B7EA24B7EA34B7EA292
+B57EA34A8015F302038015E1A202078015C0020F80ED807FA2021F80ED003F4A80023E13
+1FA2027E80027C7F02FC814A7FA20101824A7F49B77EA3498202C0C7FC010F824A147FA2
+011F8291C8123F4982013E151FA2017E82017C8101FE83B500F80107B61280A4413A7DB9
+48>65 D<B812C017FC17FF18C028007FF000037F04007F717E717E171F84A2717EA74D5A
+A260173F4D5A4D5A4C13C0040F5B91B600FCC7FCA2EFFF8002F0C713F0EF3FF8717E717E
+717E19807113C0A319E0A719C0A25F4D138019005FEF7FFE4C485AB912F018C095C7FC17
+F03B397DB844>I<DB3FFCEB01C00203B5EAC003021FECF00791B6EAFC0F01039039FC00
+FF3F4901C0EB1FFFD91FFEC77E49481403D97FF080494880485B48177F4849153F4890C9
+FC181F485A180F123F5B1807127FA24993C7FC12FFAD127F7FF003C0123FA27F001F1707
+A26C6C1780180F6C6D16006C6D5D6C173E6C6D157ED97FF85D6D6C4A5A6DB44A5A010701
+C0EB0FE06D01FCEBFF80010090B548C7FC021F14F8020314E09126003FFEC8FC3A3B7BB9
+45>I<B87E17F817FF18C028007FF8000713F09338007FF8EF1FFE717E050313807113C0
+A27113E0F07FF0A2F03FF8A219FC181FA219FEA419FFAC19FEA419FC183FA219F8187F19
+F0F0FFE0A24D13C04D13804D1300EF1FFEEF7FFC933807FFF0B912C095C7FC17FC178040
+397DB849>I<B912F0A426007FF8C7FCEF1FF8170717031701A21700A21878A3043C137C
+183CA41800167CA216FC150391B5FCA4ECF8031500167CA2163C180FA3181EA293C7FCA2
+183EA2183C187CA218FCA2EF01F81703170F173FEE01FFB9FC18F0A338397DB83F>I<B9
+12C0A43A007FF800039338007FE0171F170F1707A21703A21701A318F0EE7800A41800A2
+16F8A21501150791B5FCA4ECF80715011500A21678A693C8FCADB7FCA434397DB83C>I<
+B6D8FC03B612F0A426007FF8C70001EBE000B3A391B8FCA402F8C71201B3A6B6D8FC03B6
+12F0A444397DB84B>72 D<B612FCA439007FF800B3B3ADB612FCA41E397DB824>I<B7FC
+A426007FF8C9FCB3ACEF0780A5170F1800A35FA25FA25F5F5E5EEE0FFE167FB8FCA43139
+7DB839>76 D<B500F80403B512F06E5EA26E5ED8007FF1E000A2D97BFF161EA201796D5D
+A201786D5DA26E6C5DA36E6C4A5AA26E6C4A5AA26E6C4A5AA26E6C4A5AA26E6C141EA36E
+6D5BA26E6D5BA26F6C5BA26F6C485AA36F6C485AA26F6C485AA26F6C48C7FCA2923803FF
+1EA36F13BCA26F13F8A2705AA2705AA213FCB500FC6D4848B612F0A2EE0F80EE07005439
+7DB85B>I<B500FC0203B512F0A28080C66C6D90390003F0006F6E5A81017B7F13798101
+787F6E7E6E7E6E7F6E7FA26E7F6E7F6E7F6E7F6F7E153F826F13806F13C06F13E06F13F0
+6F13F88117FCEE7FFEEE3FFF7013817013C17013E18218F17013F97013FDEF7FFF8383A2
+8383838383187FA2183F181F01FC160FB500FC150718031801A244397DB84B>I<EDFFF8
+020FEBFF80027F14F0903A01FFC01FFC010790380007FFD91FFC010113C0D93FF06D6C7E
+49486E7E49486E7E48496E7E48834890C86C7EA248486F1380A248486F13C0A2003F18E0
+A348486F13F0A400FF18F8AC007F18F06D5DA3003F18E0A26D5D001F18C0A26C6C4B1380
+6C18006E5C6C6D4A5A6C5F6C6D4A5A6D6C4A5AD93FFC49485A6DB401075B0107D9C01F90
+C7FC010190B512FC6D6C14F0020F1480020001F8C8FC3D3B7BB948>I<B8FC17F017FEEF
+FF8028007FF8000F13C0040113E07013F0EF7FF8EF3FFCA2EF1FFEA218FFA818FEA2EF3F
+FCA2EF7FF8EFFFF04C13E0040F13C091B7120017FC17E002F8C9FCB3A4B612FCA438397D
+B841>I<B712FCEEFFE017FC17FF28007FF8000F13C004017F707F717E717EA2717EA284
+A760A24D5A604D5A4D5A04035B041F90C8FC91B612FC17E0839139F8003FFCEE0FFF707F
+707F8284A2707FA584A51A601AF084177F1901DD3FFE13E0B600FC011F130394390FFF87
+C071EBFF8005011400CBEA1FFC443A7DB848>82 D<D907FF130E013FEBE01E90B5EAF83E
+0003ECFE7E3A07FC01FFFE390FF0001F4848130F48481303491301007F140090C8FC167E
+5A163EA27F161E7F7F6D91C7FC13FC387FFFE014FEECFFF06C14FE6F7E6C816C15F06C81
+6C81C681133F010F801301D9000F1480EC007F030F13C01503818100F0157FA3163FA27E
+17807E167F6C16007E6D14FE01E0495A01F813039039FF801FF800FC90B512E0D8F83F5C
+D8F00749C7FC39E0007FF02A3B7BB935>I<003FB91280A4D9F800EBF003D87FC0923800
+7FC049161F007EC7150FA2007C1707A200781703A400F818E0481701A4C892C7FCB3AE01
+0FB7FCA43B387DB742>I<B600FC011FB512C0A426007FF8C8381FC000725AB3B3181F01
+3F94C7FC8060011F163E6D6C157E187C6D6C15FC6D6D495A6D6DEB07F06D01F0EB1FE0DA
+7FFEEBFFC0021FB6C8FC02075C020014F0030F1380423A7DB849>I<B600F00103B512E0
+A4C601F0C83807F0006E5E017F5F6E150FA2013F5F6E151F011F94C7FC6E5D6D163E6F14
+7E6D167CA26F14FC6D5E6F13016D5E6F13036D5E811707027F5D6F130F023F5D6F131F02
+1F92C8FC815F6E143EEE807E6E147CEEC0FC6E5C16E016E16E5C16F36E5C16FF6F5BA36F
+5BA26F90C9FCA26F5AA36F5AA26F5AA26F5A433A7EB848>I<B6D8E01FB500FC90383FFF
+FCA4000101F0C7D83FFCC8EA7E006C71153C171F6E197C017F701578836E7014F8013F6F
+5E6E1801011F4B6D5CA26E18036D4B6D5CA26D6D496D495A173C6F170F6D037C6D91C7FC
+EF787F6F5F6D4B6C6C131E816D02016E5BEFE01F03F8177C027F01036E13784D7E03FCEE
+80F8023F49486C5C15FE021F010FEDC1E04D7E03FF16C36E49EDE3C0041E7F049E15F76E
+01BC6D5C04FC15FF6E95C8FC4C80A26E5F4C143F6E5F4C141FA2037F5E4C140FA26F486E
+5AA2031F5E93C812036F5E5E3A7EB863>I<007FB5D8F803B512F8A4C66C48C7D80FF0C7
+FC6D6C5D6D5E6F495A6D6D49C8FC7F6D6D137E6F5B6DEBF8016D5D6F485A6E6C485A023F
+130FDA1FFF5BEE9F806E01FFC9FC805E6E5B6E5B80826F7E153F826F7F5D4B7F92B57EA2
+DA01F97FDA03F17F03F07F913807E07FDA0FC07F021F6D7E4B7E4A486C7F027E8102FE6D
+7F4A7F49488149486D7F0107804A6E7E49488149486E7E013F81017F83B60107B61280A4
+41397DB848>I<EB3FFE0003B512E0000F14F8391FF00FFE003FEB03FF6D6C7F6E7FA26F
+7EA26C5A6C5AEA0380C8FCA2EC3FFF010FB5FC137F3901FFF87F00071380380FFE00EA3F
+F85B485A12FF5BA415FF6D5A127F263FF00713F83B1FFC1FBFFFC0390FFFFE1F0003EBF8
+0F39003FE0032A257DA42E>97 D<13FFB5FCA412077EAF4AB47E020F13F0023F13FC9138
+FE03FFDAF00013804AEB7FC00280EB3FE091C713F0EE1FF8A217FC160FA217FEAA17FCA3
+EE1FF8A217F06E133F6EEB7FE06E14C0903AFDF001FF80903AF8FC07FE009039F03FFFF8
+D9E00F13E0D9C00390C7FC2F3A7EB935>I<903801FFC0010F13FC017F13FFD9FF801380
+2603FE0013C048485AEA0FF8121F13F0123F6E13804848EB7F00151C92C7FC12FFA9127F
+A27F123FED01E06C7E15036C6CEB07C06C6C14806C6C131FC69038C07E006DB45A010F13
+F00101138023257DA42A>I<EE7F80ED7FFFA4150381AF903801FF81010F13F1013F13FD
+9038FFC07F0003EB001FD807FC1307000F8048487F5B123FA2485AA312FFAA127FA27F12
+3FA26C6C5B000F5C6C6C5B6C6C4913C02701FF80FD13FE39007FFFF9011F13E101011301
+2F3A7DB935>I<903803FF80011F13F0017F13FC3901FF83FE3A03FE007F804848133F48
+4814C0001FEC1FE05B003FEC0FF0A2485A16F8150712FFA290B6FCA301E0C8FCA4127FA3
+6C7E1678121F6C6C14F86D14F000071403D801FFEB0FE06C9038C07FC06DB51200010F13
+FC010113E025257DA42C>I<EC1FF0903801FFFC010713FF90391FF87F8090383FE0FFD9
+FFC113C0A2481381A24813016E1380A2ED3E0092C7FCA8B6FCA4000390C8FCB3ABB512FE
+A4223A7DB91D>I<161FD907FEEBFFC090387FFFE348B6EAEFE02607FE07138F260FF801
+131F48486C138F003F15CF4990387FC7C0EEC000007F81A6003F5DA26D13FF001F5D6C6C
+4890C7FC3907FE07FE48B512F86D13E0261E07FEC8FC90CAFCA2123E123F7F6C7E90B512
+F8EDFF8016E06C15F86C816C815A001F81393FC0000F48C8138048157F5A163FA36C157F
+6C16006D5C6C6C495AD81FF0EB07FCD807FEEB3FF00001B612C06C6C91C7FC010713F02B
+377DA530>I<13FFB5FCA412077EAFED7FC0913803FFF8020F13FE91381F03FFDA3C0113
+8014784A7E4A14C05CA25CA291C7FCB3A3B5D8FC3F13FFA4303A7DB935>I<EA01F0EA07
+FC487EA2487EA56C5AA26C5AEA01F0C8FCA913FF127FA412077EB3A9B512F8A4153B7DBA
+1B>I<141FEC7FC0ECFFE0A24913F0A56D13E0A2EC7FC0EC1F0091C7FCA9EC0FF0EB0FFF
+A4EB007F143FB3B0121FEA3F80EA7FC0EAFFE0EC7FE0A215C014FF6C481380903883FE00
+6CB45A000F13F0000113801C4B86BA1D>I<13FFB5FCA412077EAF92380FFFE0A4923803
+FC0016F0ED0FE0ED1F804BC7FC157E5DEC03F8EC07E04A5A141FEC7FE04A7E8181A2ECCF
+FEEC0FFF496C7F806E7F6E7F82157F6F7E6F7E82150F82B5D8F83F13F8A42D3A7EB932>
+I<13FFB5FCA412077EB3B3ACB512FCA4163A7DB91B>I<01FED97FE0EB0FFC00FF902601
+FFFC90383FFF80020701FF90B512E0DA1F81903983F03FF0DA3C00903887801F000749DA
+CF007F00034914DE6D48D97FFC6D7E4A5CA24A5CA291C75BB3A3B5D8FC1FB50083B512F0
+A44C257DA451>I<01FEEB7FC000FF903803FFF8020F13FE91381F03FFDA3C0113800007
+13780003497E6D4814C05CA25CA291C7FCB3A3B5D8FC3F13FFA430257DA435>I<903801
+FFC0010F13F8017F13FFD9FF807F3A03FE003FE048486D7E48486D7E48486D7EA2003F81
+491303007F81A300FF1680A9007F1600A3003F5D6D1307001F5DA26C6C495A6C6C495A6C
+6C495A6C6C6CB45A6C6CB5C7FC011F13FC010113C029257DA430>I<9039FF01FF80B500
+0F13F0023F13FC9138FE07FFDAF00113800003496C13C00280EB7FE091C713F0EE3FF8A2
+EE1FFCA3EE0FFEAA17FC161FA217F8163F17F06E137F6E14E06EEBFFC0DAF00313809139
+FC07FE0091383FFFF8020F13E0020390C7FC91C9FCACB512FCA42F357EA435>I<9038FE
+03F000FFEB0FFEEC3FFF91387C7F809138F8FFC000075B6C6C5A5CA29138807F80ED3F00
+150C92C7FC91C8FCB3A2B512FEA422257EA427>114 D<90383FF0383903FFFEF8000F13
+FF381FC00F383F0003007E1301007C130012FC15787E7E6D130013FCEBFFE06C13FCECFF
+806C14C06C14F06C14F81203C614FC131F9038007FFE140700F0130114007E157E7E157C
+6C14FC6C14F8EB80019038F007F090B512C000F8140038E01FF81F257DA426>I<130FA5
+5BA45BA25B5BA25A1207001FEBFFE0B6FCA3000390C7FCB21578A815F86CEB80F014816C
+EBC3E090383FFFC06D1380903803FE001D357EB425>I<01FFEC3FC0B5EB3FFFA4000714
+016C80B3A35DA25DA26C5C6E4813E06CD9C03E13FF90387FFFFC011F13F0010313803025
+7DA435>I<B539F001FFF8A4000390C7EA1F00161E6E133E6C153C6E137C6C15786E13F8
+017F5CECF001013F5C14F8011F495AA2ECFC07010F5CECFE0F010791C7FC6E5A6D131E15
+BE6D13BC15FC6D5BA36E5AA26E5AA26E5AA26E5AA22D257EA432>I<B500F1B538803FFF
+A43D07FE000FF80003E06C6C010715C082028015076C6E6C148015076C01C0ED0F00826E
+485C017FED801E5D90273FF01E7F5B17C0DAF83E147C011F90393C3FE078037C14F8903B
+0FFC781FF0F0A29139FEF00FF10107EDF9E002FF14FB6D496CB45AA24B7E6D5EA26D496C
+90C7FCA292C7FC6E5CA2023E147C023C143C40257EA445>I<B539F01FFFF0A400039039
+8003F8006C01C013E06C1407D97FE05B6D6C485A6E48C7FC90381FFC3E010F5B903807FE
+FC6D6C5A5D6D5B6D5B6E7E6E7E814A7EA24A7E903801F3FFD903E37FD907C17FEB0FC049
+486C7E4A6C7E013E80496D7E49130F00016E7EB590383FFFF8A42D257EA432>I<B539F0
+01FFF8A4000390C7EA1F00161E6E133E6C153C6E137C6C15786E13F8017F5CECF001013F
+5C14F8011F495AA2ECFC07010F5CECFE0F010791C7FC6E5A6D131E15BE6D13BC15FC6D5B
+A36E5AA26E5AA26E5AA26E5AA292C8FCA25C141E003F133E387F803C38FFC07C147814F8
+EBC1F0EBC3E06C485A387D1F80D83FFFC9FCEA1FFCEA07F02D357EA432>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fe ecbx1440 14.4 35
+/Fe 35 122 df<DC7FFEECFFC0031FB5D8801F13F092B6D8E07F13FC020703F9B57E021F
+D9C007B5EAC1FF91277FFE000102071380DAFFF8010713FC010301E049494813C0495B49
+494913F04990C7FC19E0495A741380017F17C04A6E6E130071EC00FC98C7FCAEBB12FEA5
+26007FFCC7000701C0C8FCB3B3A7007FB5D8FC07B612F0A552547DD34D>27
+D<151E153E15FE1403140F147FEB07FF0003B5FCB6FCA3EBF87FEAFC00C7FCB3B3B3A600
+7FB712FCA52E4E76CD42>49 D<EC1FFE49B512F0010F14FC013FECFF804915E02701FF80
+3F7F2703FC000713FCD807F001017F48486D7FD81F806E138048C87E7013C0D87FE016E0
+01F8806D16F000FF817F7013F8A56C5AA26C5A6C5AEA0380C914F05EA218E05E18C05E18
+804C13005F4C5A4C5A5F4B5B4B5B4B5B94C7FCED0FFC4B5A4B5AED7FC04B5A4A90C8FCEC
+03FC4A5A4A4814F84A5A4A5A4AC8FC02FEEC01F0495A495A495A5CD90F80140349C8FC01
+3E1507017FB7FC90B812E05A5A5A5A5A5A5AB9FC18C0A4354E7ACD42>I<913807FFC002
+7F13FC0103B67E010F15E090261FF80313F890267FC0007F01FEC7EA3FFE48488148486E
+138013FE486C6C6D13C0804817E080A66C5B18C06C5B6C90C75AD80038168090C8FC4C13
+00A24C5A5F4C5A4B5B4B13C0030F5BDB7FFEC7FC91387FFFF816C016FCEEFF80DA000313
+E09238007FF8EE3FFE707E70138018C07013E018F07013F8A218FC82A218FEA3EA03C0EA
+0FF0EA3FFC487EA2B5FCA218FCA25E18F8A26C4816F0495C4916E0D83FE04A13C06C485C
+D80FF04A1380D807FE91387FFE003B03FFE003FFFC6C90B65A6C6C15E0010F92C7FC0101
+14FCD9001F1380374F7BCD42>I<17FC1601A216031607160FA2161F163F167FA216FF5D
+5DA25D5D5D167F153E157E15FC15F8EC01F01403EC07E015C0EC0F80141FEC3F00143E5C
+14FC495A5C495A1307495A5C49C7FC5B137E137C5B1201485A5B485A120F485A90C8FC12
+3E127E5ABA1280A5C901FCC7FCAF021FB71280A5394F7CCE42>I<486C150601F0153E01
+FEEC01FED9FFF0133F91B65A5F5F5F5F5F94C7FC16FC5E16E093C8FC15FC01F0138091CA
+FCAC913807FF80023F13F891B512FE01F36E7E9026FFFC0113E09139E0007FF891C76C7E
+496E7E01F86E7E5B7013804916C0C9FC18E08218F0A418F8A31203EA0FE0EA3FF8487EA2
+12FF7FA218F0A25B5E6C4816E05B01C016C06CC85A18806C6C4A13007FD80FF04A5A6C6C
+ECFFFCD803FE4913F02701FFE00F5B6C6CB612806D92C7FC010F14F8010114C09026003F
+FCC8FC354F7ACD42>I<ED07FE92B512C0020314F0021F14FC91397FFC01FE9139FFE000
+7F01030180EB3F804990C7121F4948EC7FC0494814FF4948010313E0495A49485B5A485B
+A2485BA2486F13C091C7FC4803001300177E94C7FC5AA25B127FA2ED3FF04AB5FC020714
+C000FF4914F091391F807FF891393E001FFE02786D7E4A6D13807013C06D5A4A6D13E018
+F05C7013F8A291C813FCA44916FEA3127FA6123FA37F6C17FCA36C17F85E7E6E15F06C17
+E06C6D5B6E15C06C4B13806D6C491300D93FFC495A6DB4EBFFFC010790B512F06D5D0100
+1580021F01FCC7FC020313C0374F7BCD42>I<B912FEF0FFF019FE737E1AE0D8000F01C0
+C7001F7F06037F727F726C7E867313807313C0A27313E0A37313F0A94F13E0A34F13C01B
+80614F1300624F5A06035B4E13E0063F5B92B8C7FC19F8A2F1FF8003C0C7001F13E00601
+13F89538007FFE737E070F13C01BE07313F0851BF87313FCA27313FEA31BFFA91BFEA261
+1BFCA2614F13F81BF0614F13E0077F13C04EB51280060FEBFE00BB5A1AF01AC04FC7FC19
+C050527BD15D>66 D<932603FFF01407047F01FF140F0307B600E0131F033F03F8133F92
+B700FE137F02039126C003FF13FF020F01F8C7EA3FC1023F01C0EC0FE391B5C80003B5FC
+4901FC814949814901E082011F498249498292CA7E4948834948835A4A83485B4885A248
+49187FA2485B1B3FA2485B1B1FA25AA21B0091CDFCA2B5FCAE7EA280A36C1A1FA36C7FA2
+1B3F6C7F1B3E6C7F1B7E6C6D187C6C1AFC6E18F86C19016D6CEF03F06D7E6FEE07E06D6D
+EE0FC001076DEE1F806D01F8EE3F006D6D16FE6D01FF4B5A023F01C0EC07F8020F01FCEC
+3FF00203903AFFC001FFC0020091B6C7FC033F15FC030715F0DB007F1480040301F0C8FC
+505479D25F>I<BAFC19F819FF1AE01AF8D8000701F0C7001F13FE06017FDE003F13C007
+0F7F07037F737F737F747E747E747F86747F8886888688A2747FA3881B7FA288A51D80AF
+1D00A564A21BFF64A3505BA2505BA2505BA2505B505B99C7FC505A1A7F4F485A4F13F007
+0F5B073F5B4EB55A061F49C8FCBB12F81AE097C9FC19F896CAFC59527CD165>I<BB12FC
+A5D8000701F0C7000F7F1800191F190F19071903190119001A7E1A7F86A386A51B80DD03
+E0130FA497C7FCA31707A3170F171F173FEE01FF92B6FCA5EDF001EE003F171F170F1707
+A31703A794CAFCB3A2B812F0A549527CD153>70 D<B8D88007B712FCA5D8000701F0C900
+3FEB8000B3AE92BAFCA503F0C9123FB3B1B8D88007B712FCA55E527CD167>72
+D<B81280A5D8000701F0C7FCB3B3B3B2B81280A529527DD130>I<B812E0A5D8000F01E0
+CAFCB3B3A91AF8A419011AF0A51903A31907A2190F1AE0191FA2193F197F19FF60180760
+187F0503B5FCBB12C0A545527CD14F>76 D<B912E018FF19F019FE737ED8000701F0C714
+E0060F7F060313FC06007F737E737F8587737FA28785A287A863A261636361634F90C8FC
+4F5A4F5A06035B060F13E095B5128092B748C9FC19F019C019F09226F0000713FC050013
+FF063F7F727F727F727F727FA2727FA28486A886A71D707513F8A2851C017301C013F0A2
+73EBE003B86C6D9038F007E0739038FC1FC0070190B51280736C1400080F5BCE13F85D53
+7CD162>82 D<DA0FFE141C91B500F0133C010702FC137C011F02FF13FC017F15C19026FF
+F00113E148903980001FFB4890C7EA07FFD807FC14014848804848153F171F4848150FA2
+007F1607491503A2170112FFA217007FA26D167CA27F7F6D93C7FC6C7E14C014F8ECFF80
+6C14F8EDFFC06C15FC6CEDFF8017F06C16FC6C826C707E6C836D82011F8201078213016D
+6C81020781EC007F030380ED003F040314801600173F837113C0838312F883A3837EA319
+807EA26C5E19007F6D4B5A7F6D4B5A01FC4B5A6D151FD9FFC04A5AD97FF8ECFFE028FE1F
+FF80075B010790B6C7FCD8FC0115FC486C6C14F048010F14C0489026007FFCC8FC3A5479
+D249>I<B700FE4AB612F0A5D8000F01E0CA387FC000091FC7FCB3B3B26D611B3E811B7E
+6D197CA26D6D17FC636D6D1601027F4D5A6F4C5A023F170F6E6C4C5A6E6D4B5A6E01E003
+FFC8FC6E01F8EC03FE020001FEEC1FFC923B7FFFE001FFF8031F90B612E0030716800300
+4BC9FC041F14F0040091CAFC5C537CD165>85 D<EC3FFE0107B512E0011F14FC017F14FF
+2701FFC00F13C02703FE00037F486C01007F6E6D7E486D80707EA2707EA3707F6C5B6C90
+C7FC6C5AC9FCA60307B5FC0203B6FC147F0103B7FC011FEBF00F017F1300EBFFFC000313
+F04813C0485B4890C7FC5A5B485AF081F012FF5BA35EA26D5C127F6D5C003F03F713C36D
+D901E314E06CD9C00714FF00079026F01F8114C06C90B5C61480C602FC6D1300011F01F0
+EB3FFC01010180EB07F03C387CB642>97 D<EB3FF8B5FCA51203C6FCB3A4EE7FF00307B5
+FC031F14C0037F14F0913AF9FF007FFCDAFFF8EB1FFF03E001077F03806D7F92C76C7F4A
+6E7F5C4A6F7E85183F85A38584A31A80AD1A00A36061A261187F616E15FF616E4A5B6E4A
+5B6F495BDACFE04990C7FCDA87F0EB3FFE913A01FE01FFF8496CB65A49013F14C0490107
+49C8FC90C813E041547DD249>I<913803FFE0023F13FE91B67E010315E0010F9038003F
+F8D93FFCEB07FC4948497E4948131F4849497E485B485BA24890C7FC5A5B003F6F5A705A
+705A007F92C8FC5BA312FFAD127F7FA3123F7F6CEE0F80A26C6D141F18006C6D5C6C6D14
+3E6C6D147E6C6D5C6D6C495A6DB4EB07F0010F9038C01FE06D90B5128001014AC7FCD900
+3F13F80203138031387CB63A>I<943803FF80040FB5FCA5EE003F170FB3A4913803FF80
+023F13F849B512FE0107ECFF8F011F9038C03FEF90273FFE0007B5FCD97FF8130149487F
+484980484980484980488291C8FC5A5B123FA2127F5BA312FFAD127FA37F123FA3121F7F
+6C5E6C6D5C5F6C6D91B5FC6C6D5B6C6D4914E0D97FFCD90FEFEBFF80D91FFFEB7F8F0107
+90B5120F010114FC6D6C13E00207010049C7FC41547CD249>I<913807FF80027F13F849
+B512FE01076E7E011F010313E0903A3FFC007FF0D97FF06D7E49486D7E4849130F48496D
+7E48824890C77E1880485A82003F17C0A3485A18E082A212FFA290B8FCA401FCCAFCA612
+7FA37F123FA2EF03E06C7E17076C17C06C6D140F18806C6D141F6C6DEC3F006C6D147ED9
+7FFC495AD91FFFEB07F86D9038E03FF0010390B512C001005D023F01FCC7FC020113E033
+387CB63C>I<DA1FFE14FE49B539E007FF80010FDAFC1F13C0013FDAFF7F13E090267FF8
+07EBFF072701FFE001EBF07F48497E484990387FF83F91C7003F14C048EEFC1F489338FE
+070049021F90C7FCA2003F82A9001F5EA26D143F6C5E6C5E6E137F6C6D495A6C6D485B6C
+D9F80713804890B6C8FCD803EF14FC01C114E02707C01FFEC9FC49CBFCA2487EA37FA27F
+13FC90B612FE6CEDFFF017FCEFFF806C8318F06C836C837F48B87E1207D80FFCC700037F
+4848EC003F4848150F48486F138083485A83A56D5D007F18006D5D003F5F6C6C4B5A01FE
+153FD807FFED7FF06C01C049485AC601FC011F1380013FB648C7FC010F15F8010115C0D9
+000F01F8C8FC3B4F7CB542>103 D<EB3FF8B5FCA51203C6FCB3A4EE1FFC93B57E030314
+E0030F14F892391FC07FFC92397E003FFE03F86D7EECF9F04B6D7FECFBC0ECFF8092C76C
+7FA25CA25CA45CB3ACB6D8F807B612C0A542537CD249>I<133FEBFFC0487F487FA2487F
+A66C5BA26C5B6C5B013FC7FC90C8FCAEEB1FF8B5FCA512017EB3B3A6B612F0A51C547CD3
+24>I<EB3FF8B5FCA51203C6FCB3A50407B512F0A59339007FF000EF3FC04D5A4DC7FCEE
+01FC4C5AEE0FF04C5A4C5A4CC8FC16FEED03FC4B5A4B5A4B5A4B7E4B7EECF9FF02FB7F91
+B57EA28203BF7F031F7F14FE4A6C7FDAF0077F6F7FA26F7F6F7F167F83707F707FA2707F
+707F707FA2707F707F84B6D8F00F14FEA53F537DD245>107 D<EB3FF8B5FCA51203C6FC
+B3B3B3B1B612F8A51D537CD224>I<D93FF0D91FF84AB47EB591B56C010F13F8030302E0
+013F13FE030F6E90B6FCDB3F809027F803F80F7F922A7E007FFC07E0077F000302F89028
+3FFE0F80037FC6D9F1F0011F49487EDAF3E0DAFF3E814B153CDAF7805D92C76C496D7F14
+FF4A5EA24A5EA34A5EB3ADB6D8F80FB66CB612F8A565367BB56E>I<D93FF0EB1FFCB591
+B57E030314E0030F14F892391FC07FFC92397E003FFE000302F86D7EC6EBF1F04B6D7FEC
+F3C0ECF78092C76C7F14FF5CA25CA45CB3ACB6D8F807B612C0A542367CB549>I<913801
+FFC0023F13FE91B67E010315E0010F018013F8903A3FFC001FFED97FF0EB07FF49486D7F
+48496D7F48496D7F91C8127F4883488349153F001F83A2003F8349151FA2007F83A400FF
+1880AC007F1800A3003F5F6D153FA2001F5FA26C6C4B5AA26C6D4A5A6C5F6C6D495B6C6D
+495B6D6C4990C7FCD93FFCEB1FFE6DB46CB45A010790B512F0010115C0D9003F49C8FC02
+0313E039387CB642>I<90393FF001FCB590380FFF804B13E0037F13F09238FE1FF89138
+F1F83F00019138F07FFC6CEBF3E015C0ECF780A2ECFF00EE3FF84AEB1FF0EE0FE093C7FC
+5CA45CB3ABB612FEA52E367DB535>114 D<903903FFC00E011FEBFC1E90B6127E000315
+FE3907FE003FD80FF0130F4848130348481301491300127F90C8127EA248153EA27FA27F
+01F091C7FC13FCEBFF806C13FEECFFF06C14FE6F7E6C15E06C816C15FC6C81C681133F01
+0F15801301D9000F14C0EC003F030713E0150100F880167F6C153FA2161F7EA217C07E6D
+143F17807F6DEC7F0001F85C6DEB03FE9039FF801FFC486CB512F0D8F81F14C0D8F00791
+C7FC39E0007FF02B387CB634>I<147CA614FCA41301A31303A21307A2130F131F133F13
+7F13FF1203000F90B512FEB7FCA426007FFCC8FCB3A9EE0F80ABEE1F006D7EA2011F143E
+806D6D5A6DEBC1F86DEBFFF001005C023F1380DA03FEC7FC294D7ECB33>I<D93FF89138
+01FFC0B50207B5FCA50003ED001FC61607B3AE5FA35FA25F137F5F6D6C14F7DC01E713F0
+6D6CD907C7EBFFC0903A0FFF801F876D90B51207010114FC6D6C13F0020701C091C7FC42
+377CB549>I<B600E090381FFFFCA5000101F8C7000113006CEE007C6E15FC017F5E6E14
+01013F5E8017036D6D5C17076D5E6F130F6D5E6F131F6D93C7FC815F6D6D133E177E6D15
+7C6F13FC027F5C811601DA3FFF5B16036E5C16876E5C16CF6E5C16EF16FF6E91C8FCA26E
+5BA26E5BA26F5AA36F5AA26F5AA26F5AA35E151F93C9FC5D153E157ED81FC0137C487E48
+6C13FC486C5B14015D4A5A14074A5A6C48485A4948CAFC495A383F81FC6CB45A6C5B0003
+13C0C648CBFC3E4D7DB445>121 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Ff ecrm1000 10 81
+/Ff 81 123 df<B81280A2290280962A>21 D<DA0FF813FC91397FFF07FF903B01F807DF
+83C0903A07E001FF0F903B1F8007FE1FE090393F000FFC137E16F85B9338F00780484801
+0790C7FC1503ACB812F8A32801F80003F0C7FCB3AB486C497E267FFFE0B512F0A3333B7F
+BA30>27 D<EC0FF8EC7FFE903901F80780903907E001C090391F8000E090383F0007017E
+497EA25BA2485A6F5AED018092C8FCA9ED03F0B7FCA33901F8000F1503B3AA486C497E26
+7FFFE0B512C0A32A3B7FBA2E>I<EC0FFC91387FFF70903901F803F0903807E00790381F
+800FEB3F00137EA25B150748481303ADB7FCA33901F80003B3AB486C497E267FFFE0B512
+C0A32A3B7FBA2E>I<DA0FF0EB1FF0DA7FFEEBFFFC903B01F80F83F00F903C07E001CFC0
+0380903C1F8000FF0001C090273F0007FE130F017E4948497EA2495CA248485C03076E5A
+03030203C7FC95C8FCA9F007E0BAFCA33C01F80003F0001F1807B3AA486C496C497E267F
+FFE0B500C1B51280A3413B7FBA45>I<007C137C00FE13FEEAFF01A3EAFE00A7007E13FC
+007C137CA8003C137800381338A700181330171E77BA2A>34 D<121C127FEAFF80A213C0
+A3127F121C1200A412011380A2120313005A1206120E5A5A5A12600A1979B917>39
+D<146014E0EB01C0EB0380EB0700130E131E5B5BA25B485AA2485AA212075B120F90C7FC
+A25A121EA2123EA35AA65AB2127CA67EA3121EA2121F7EA27F12077F1203A26C7EA26C7E
+1378A27F7F130E7FEB0380EB01C0EB00E01460135278BD20>I<12C07E12707E7E7E120F
+6C7E6C7EA26C7E6C7EA21378A2137C133C133E131EA2131F7FA21480A3EB07C0A6EB03E0
+B2EB07C0A6EB0F80A31400A25B131EA2133E133C137C1378A25BA2485A485AA2485A48C7
+FC120E5A5A5A5A5A13527CBD20>I<EB0380497EA7397803803C00FC147E00FE14FE397F
+8383FC393FC387F8390FE38FE03903FBBF803900FFFE00EB3FF8EB0FE0A2EB3FF8EBFFFE
+3903FBBF80390FE38FE0393FC387F8397F8383FC39FE0380FE00FC147E0078143C390007
+C000A76D5A1F247BBD2A>I<121C127FEAFF80A213C0A3127F121C1200A412011380A212
+0313005A1206120E5A5A5A12600A19798817>44 D<B512FCA516057F941C>I<121C127F
+EAFF80A5EA7F00121C0909798817>I<1506A2150E150CA2151C151815381530A2157015
+60A215E015C0A214011580A2140315005C1406A2140E140CA2141C1418A214381430A214
+70146014E05CA213015CA2130391C7FCA25B1306A2130E130C131C1318A213381330A213
+701360A213E05BA212015B120390C8FCA25A1206A2120E120CA2121C1218A21238123012
+701260A212E05AA21F537BBD2A>I<EB03F8EB1FFF90387E0FC09038F803E03901E000F0
+484813780007147C48487FA248C77EA2481580A3007EEC0FC0A500FE15E0B3007E15C0A4
+007F141F6C1580A36C1500A26C6C133EA26C6C5B6C6C5BEBF0013900F803E090387E0FC0
+D91FFFC7FCEB03F823397DB62A>I<EB01C013031307131F13FFB5FCA2131F1200B3B3A7
+497E007FB512F0A31C3779B62A>I<EB0FF0EB7FFE48B57E3903E03FE0390F000FF0001E
+6D7E001C6D7E486D7E5A6E7E126012FE6CEC7F807FA56CC7FC121CC8FCEDFF00A25D1401
+5D14035D4A5A4A5A5D4A5A4AC7FC147E5C495A14E0495A495A49C8FC011EEB01805B5B49
+130348481400485A485A90C75A48B6FC5A5A485CB6FCA321377CB62A>I<EB07F8EB3FFF
+90B512C03901F80FF03903C007F848486C7E390E0001FEEA0F80391FE000FF7FA56C5A6C
+5AC7485AA25D14035D4A5A5DEC0F80027FC7FCEB1FFCECFF809038000FE06E7EEC01FC81
+6E7EED7F80A216C0A2153F16E0A2121EEA7F80A2487EA316C0157F491480007EC7FC0070
+ECFF006C495A121E390F8003F83907F00FF00001B512C06C6C90C7FCEB0FF823397DB62A
+>I<1538A2157815F8A2140114031407A2140F141F141B14331473146314C313011483EB
+030313071306130C131C131813301370136013C01201EA038013005A120E120C5A123812
+305A12E0B712F8A3C73803F800AA4A7E0103B512F8A325387EB72A>I<0006140CD80780
+133C9038F003F890B5FC5D5D158092C7FC14FC38067FE090C9FCAAEB07F8EB1FFE903878
+0F809038E007E03907C003F0496C7E130000066D7E81C8FC8181A21680A4121C127F5A7F
+A390C713005D12FC00605C12704A5A6C5C6C1303001E495A6C6C485A3907E03F800001B5
+C7FC38007FFCEB1FE021397CB62A>I<EC3FC0903801FFF0010713FC90380FE03E90383F
+800790387E001F49EB3F804848137F485A12075B000FEC3F0049131E001F91C7FC5B123F
+A3127F90C9FCEB01FC903807FF8039FF1E07E090383801F0496C7E01607F01E0137E497F
+16805BED1FC0A390C713E0A57EA47F123F16C0A2001FEC3F807F000F15006D5B000714FE
+6C6C5B6C6C485A3900FE07F090387FFFC0011F90C7FCEB03FC23397DB62A>I<12301238
+123E003FB612E0A316C05A168016000070C712060060140E5D5D00E014304814705D5DC7
+12014A5A4AC7FC1406140E5CA25C1478147014F05C1301A213035C1307A2130FA3131F5C
+A2133FA5137FA96DC8FC131E233A7BB72A>I<EB03F8EB1FFF017F13C09038FC07F03901
+E001F83903C0007C4848133C90C7123E48141E000E141F001E80A3121FA26D5B6D131E7F
+D80FF85B6D137C01FF13786C6D5A6CEBE3E0ECF780C601FFC7FC6D5A6D6C7E010F13E001
+3F7F01F97F3901E07FFE48486C7E380F800F48486C1380001E010113C0487F007C143F00
+78EC1FE0150F00F81407481403A21501A36C15C0A200781403007C15806C14076CEC0F00
+6C6C131ED807E0137C3903F803F0C6B55A013F1380D907FCC7FC23397DB62A>I<EB03F8
+EB1FFF017F13C03901FC07E048486C7E3907E001F8000F6D7E4848137E5B003F80A248C7
+1380A25AED1FC0A516E0A56C143FA36C7E157F121F6C6C13FF6C6C13DF000313013901F0
+039F3900FC0F1FD93FFC13C0EB07F090C7FCA2153F1680A216005D120F486C137E486C5B
+A24A5A4A5A49485A381F000F001CEB1F80260F807FC7FC3807FFFE000113F838003FC023
+397DB62A>I<121C127FEAFF80A5EA7F00121CC7FCB2121C127FEAFF80A5EA7F00121C09
+2479A317>I<121C127FEAFF80A5EA7F00121CC7FCB2121C127FEAFF80A213C0A3127F12
+1C1200A412011380A2120313005A1206120E5A5A5A12600A3479A317>I<007FB812F8B9
+12FCCCFCB0B912FC6C17F836147B9E41>61 D<EC03FF021F13E09138FC00FCD901E0131E
+D90780EB0780011EC7EA01E00138EC00704981498148488148488190C97E48D901FC1480
+000ED907FFEB01C0000C90391F03C000001C90267E00E013E000184901701360263801F8
+6D13700030496D13300103EC0FE0267007E00107133800601718495AA200E0171C484848
+150CAA6C6C7E1260A26D6C151C00701718263003F0130F0101141F00386D013F13382618
+00FC01771330001C017E9038E3F070000C90261F03C113E0000E903A07FF00FFC06CD901
+FCEB3F006C90CAFC7F6C7E6C7E13706D167C011EED03FCD90780EC1FF0D901E0ECFF80D9
+00FC90383FFC00021FB51280020301E0C7FC363C7BBA41>64 D<1538A3157CA315FEA34A
+7EA34A6C7EA202077FEC063FA2020E7FEC0C1FA2021C7FEC180FA202387FEC3007A20270
+7FEC6003A202C07F1501A2D901807F81A249C77F167FA20106810107B6FCA24981010CC7
+121FA2496E7EA3496E7EA3496E7EA213E0707E1201486C81D80FFC02071380B56C90B512
+FEA3373C7DBB3E>I<B712E016FC16FF0001903980007FC06C90C7EA1FE0707E707E707E
+A2707EA283A75F16035F4C5A4C5A4C5A4C5AEEFF8091B500FCC7FCA291C7EA7F80EE1FE0
+EE07F0707E707E83707EA21880177F18C0A7188017FFA24C13005F16034C5AEE1FF8486D
+EB7FF0B812C094C7FC16F832397DB83B>I<913A01FF800180020FEBE003027F13F8903A
+01FF807E07903A03FC000F0FD90FF0EB039F4948EB01DFD93F80EB00FF49C8127F01FE15
+3F12014848151F4848150FA248481507A2485A1703123F5B007F1601A35B00FF93C7FCAD
+127F6DED0180A3123F7F001F160318006C7E5F6C7E17066C6C150E6C6C5D00001618017F
+15386D6C5CD91FE05C6D6CEB03C0D903FCEB0F80902701FF803FC7FC9039007FFFFC020F
+13F002011380313D7BBA3C>I<B712C016F816FE000190398001FF806C90C7EA3FE0EE0F
+F0EE03F8707E707E177FA2EF3F8018C0171F18E0170F18F0A3EF07F8A418FCAC18F8A4EF
+0FF0A218E0A2171F18C0EF3F80A2EF7F0017FE4C5A4C5AEE0FF0EE3FE0486DEBFF80B8C7
+FC16F816C036397DB83F>I<B812FEA3000190388000076C90C8FC173F838383A383A318
+80170116C0A394C7FCA31501A21503150F91B5FCA3EC000F15031501A21500A21860A318
+E093C712C0A41701A3EF0380A21707A2170F173F177F486D903807FF00B9FCA333397EB8
+38>I<B812F8A30001903880001F6C90C71201EE00FC177C173C171CA2170CA4170E1706
+A2ED0180A21700A41503A21507151F91B5FCA3EC001F15071503A21501A692C8FCAD4813
+C0B612C0A32F397DB836>I<DBFF8013C0020FEBF001023F13FC9139FF803F03903A03FC
+000787D90FF0EB03CF4948EB00EF4948147F4948143F49C8121F485A4848150F48481507
+A248481503A2485A1701123F5B007F1600A448481600AB93B6FCA26C7E9338007FE0EF3F
+C0A2123F7F121FA26C7EA26C7EA26C7E6C7E6C6C157F6D7E6D6C14FF6D6C14EFD90FF8EB
+03C7D903FEEB0783903A00FFC03F0191393FFFFC00020F01F0130002001380383D7CBA41
+>I<B648B512FEA30001902680000313006C90C76C5AB3A491B6FCA391C71201B3A6486D
+497EB648B512FEA337397DB83E>I<B612C0A3C6EBC0006D5AB3B3AD497EB612C0A31A39
+7EB81E>I<013FB512E0A39039001FFC00EC07F8B3B3A3123FEA7F80EAFFC0A44A5A1380
+D87F005B0070131F6C5C6C495A6C49C7FC380781FC3801FFF038007F80233B7DB82B>I<
+B649B5FCA3000101809038007FF06C90C8EA3F80053EC7FC173C17385F5F4C5A4C5A4CC8
+FC160E5E5E5E5E4B5AED0780030EC9FC5D153E157E15FF5C4A7F4A6C7E140E4A6C7E4A6C
+7E14704A6C7E4A6C7E14804A6C7E6F7EA26F7F707EA2707E707EA2707EA2707E707EA270
+7E707F8484486D497FB6011FEBFF80A339397DB841>I<B612E0A3000101C0C8FC6C90C9
+FCB3AD1718A517381730A31770A317F0A216011603160FEE1FE0486D13FFB8FCA32D397D
+B834>I<B5933807FFF86E5DA20001F0FC002600DFC0ED1BF8A2D9CFE01533A3D9C7F015
+63A3D9C3F815C3A2D9C1FCEC0183A3D9C0FEEC0303A2027F1406A36E6C130CA36E6C1318
+A26E6C1330A36E6C1360A26E6C13C0A3913901FC0180A3913900FE0300A2ED7F06A3ED3F
+8CA2ED1FD8A3ED0FF0A3486C6D5A487ED80FFC6D48497EB500C00203B512F8A2ED018045
+397DB84C>I<B5913807FFFE8080C69238007FE06EEC1F80D9DFF0EC0F001706EBCFF8EB
+C7FCA2EBC3FEEBC1FFA201C07F6E7EA26E7E6E7E81140F6E7E8114036E7E168080ED7FC0
+16E0153FED1FF0ED0FF8A2ED07FCED03FEA2ED01FF6F1386A2EE7FC6EE3FE6A2EE1FF6EE
+0FFEA216071603A216011600A2177E486C153E487ED80FFC151EB500C0140EA217063739
+7DB83E>I<EC03FF021F13E09138FE01FC903901F8007ED907E0EB1F8049486D7ED93F80
+EB07F049C76C7E01FE6E7E48486E7E49157E0003167F4848ED3F80A24848ED1FC0A2001F
+17E049150F003F17F0A3007F17F8491507A300FF17FCAC007F17F86D150FA3003F17F0A2
+6C6CED1FE0A36C6CED3FC0000717806D157F000317006C6C15FEA26C6C4A5A017F4A5A6D
+6C495A6D6C495AD907E0EB1F80D903F8017FC7FC903900FE01FC91381FFFE0020390C8FC
+363D7BBA41>I<B712C016FC16FF0001D9800013C06C90C7EA1FE0707EEE03F883707EA2
+707EA21880A71800A24C5AA24C5A5FEE0FF04C5AEEFF8091B548C7FC16F091CAFCB3A548
+7FB6FCA331397EB838>I<EC03FF021F13E09138FE01FC903901F8007ED907E0EB1F8049
+486D7ED93F80EB07F049C76C7E01FE6E7E48486E7EA24848157F0007178049153F000F17
+C049151F001F17E0A24848ED0FF0A3007F17F8A2491507A200FF17FCAC007F17F8A26D15
+0FA2003F17F0A26C6CED1FE0A36C6CED3FC00007027C14804AB4FC3C03F80383807F003B
+01FC0701C0FEEC0E002600FE0CEBE1FC017FEC63F8D93F8CEB77F0D91FCCEB3FE0D907EE
+14806DB449C7FC0100D981FC130CEC1FFF0203131C91C7001E131C161F183CEF807CEFC0
+F8EE0FFFA318F08218E07013C07013809338007E00364B7BBA41>I<B612FEEDFFE016F8
+000190388007FE6C90C76C7EEE3FC0707E707E707EA2707EA283A65FA24C5AA24C5A4C5A
+EE3F8004FFC8FCED07FC91B512E05E9138000FF0ED03F8ED00FE82707E707EA2161F83A5
+83A6F00180A217F8160F1803486D01071400B66D6C5A04011306933800FE0ECAEA3FFCEF
+07F0393B7DB83D>I<D90FF813C090383FFE0190B512813903F807E33907E000F7484813
+7F4848133F48C7121F003E140F007E1407A2007C140312FC1501A36C1400A37E6D14006C
+7E7F13F86CB47E6C13F8ECFF806C14E06C14F86C14FEC680013F1480010714C0EB007F02
+0713E0EC007FED3FF0151F150FED07F8A200C01403A21501A37EA216F07E15036C15E06C
+14076C15C06C140F6DEB1F80D8FBF0EB3F00D8F0FE13FE39E03FFFF8010F13E0D8C00190
+C7FC253D7CBA2E>I<003FB812E0A3D9C003EB001F273E0001FE130348EE01F000781600
+00701770A300601730A400E01738481718A4C71600B3B0913807FF80011FB612E0A33539
+7DB83C>I<B6903807FFFEA3000101809038007FE06C90C8EA1F80EF0F001706B3B2170E
+6D150C80171C133F17186D6C14385F6D6C14F06D6C5C6D6C495A6D6CEB07806D6C49C7FC
+91387F807E91381FFFF8020713E09138007F80373B7DB83E>I<B500FC91387FFF80A300
+03018091380FFC006C90C8EA07E0715A6C705A6E1403017F93C7FCA280013F1506A26E14
+0E011F150C80010F5DA28001075DA26E147001031560A26D6C5CA2806D4A5AA2ED800302
+7F91C8FCA291383FC006A215E0021F5BA2EDF01C020F1318A26E6C5AA215FC02035BA2ED
+FEE002015BA26E6C5AA36FC9FCA3153EA2151CA3393B7EB83E>I<B5D8FC07B5D8F001B5
+FCA30007902780001FFEC7EA1FF86C48C7D80FF8EC07E000010307ED03C01B807F6C6F6C
+1500A26E5F017F6E6C1406A280013F4A6C5CA280011F4A6D5BEE067FA26D6C010E6D5BEE
+0C3FA26D6C011C6D5BEE181FA26D6C6F5BEE300FA26D6C6F485AEE6007A26D6C4CC7FC93
+38C003FCA203805D913B7F818001FE06A203C1150EDA3FC3C7EAFF0CA203E3151CDA1FE6
+EC7F98A215F6DA0FFCEC3FF0A302075E4B141FA202035E4B140FA202015E4B1407A20200
+93C8FC4B80503B7EB855>I<007FB590383FFFFCA3C601F801071380D97FE0D903FCC7FC
+013FEC01F06D6C5C5F6D6C5C6D6C13034CC8FC6D6C1306160E6D6C5B6DEB801816389138
+7FC0306E6C5A16E06E6C5A91380FF18015FB6EB4C9FC5D14036E7EA26E7F6F7EA24B7E15
+DF9138019FF09138038FF8150F91380607FC91380E03FE140C4A6C7EEC38000230804A6D
+7E14E04A6D7E49486D7E130391C76C7E01066E7E130E010C6E7E011C1401013C8101FE82
+2607FF80010713E0B500E0013FEBFF80A339397EB83E>I<B500FE91383FFFE0A3000301
+E0913807FE00C649EC03F0017F6F5A606D6C5D6D6C140395C7FC6D6C1406A26D6C5C6D6C
+141C17186D6C143817306D6D5B6E6C13E05F91383FE0015F91381FF003DA0FF890C8FC16
+06913807FC0E160C913803FE1C913801FF185E6E13B016E0157F6F5AB3A24B7E023FB512
+C0A33B397FB83E>I<003FB7FCA39039FC0001FE01C0130349495A003EC7FC003C4A5A5E
+0038141F00784A5A12704B5A5E006014FF4A90C7FCA24A5A5DC712074A5AA24A5A5D143F
+4A5AA24A5A92C8FC5B495AA2495A5C130F4948EB0180A2495A5C137F495A16034890C7FC
+5B1203485AEE0700485A495C001F5D48485C5E4848495A49130FB8FCA329397BB833>I<
+007FB81280B912C0A26C17803204797041>95 D<EB1FE0EBFFFC3803E03F3907000F8039
+0F8007E0486C6C7E13E06E7EA26E7E6C5A6C5AC8FCA4147FEB07FFEB3FE0EBFE00EA03F8
+EA0FF0EA1FC0123F485A90C7FC160C12FEA31401A26C13036CEB077C903980063E18383F
+C01E3A0FE0781FF03A03FFF00FE03A007F8007C026277DA52A>97
+D<EA03F012FFA3120F1203B0EC1FE0EC7FF89038F1E03E9039F3801F809039F7000FC001
+FEEB07E049EB03F049EB01F85BED00FCA216FEA2167E167FAA167E16FEA216FC15016D14
+F8ED03F07F01EEEB07E001C6EB0FC09039C7801F00903881E07E903800FFF8C7EA1FC028
+3B7EB92E>I<EB03FC90381FFF8090387E03E03901F80070484813F83907E001FC380FC0
+03A2EA1F80123F90380001F848EB00F01500A2127E12FEAA127E127FA26C14067F001F14
+0E6D130C000F141C6C6C13386C6C13706C6C13E039007C07C090381FFF00EB07F81F277D
+A525>I<ED0FC0EC03FFA3EC003F150FB0EB03F8EB1FFF90387E078F9038F801EF3903F0
+007F4848133F4848131FA24848130F123F90C7FC5AA2127E12FEAA127E127FA27EA26C6C
+131FA26C6C133F6C6C137F6C6CEBEFF03A01F801CFFF39007C078F90381FFE0FD907F813
+C0283B7DB92E>I<EB07F8EB1FFF90387C0FC03901F803E03903F001F0D807E013F8380F
+C0004848137CA248C7127E153E5A153F127E12FEA3B7FCA248C8FCA5127EA2127FA26C14
+037F001F14076C6C13060007140E6D131CD801F013386C6C137090387E03E090381FFF80
+903803FC0020277EA525>I<147E903803FF8090380FC1E0EB1F8790383F0FF0137EA213
+FCA23901F803C091C7FCADB512FCA3D801F8C7FCB3AB487E387FFFF8A31C3B7FBA19>I<
+ED03F090390FF00FF890393FFC3C3C9039F81F707C3901F00FE03903E007C03A07C003E0
+10000FECF000A248486C7EA86C6C485AA200075C6C6C485A6D485A6D48C7FC38073FFC38
+060FF0000EC9FCA4120FA213C06CB512C015F86C14FE6CECFF804815C03A0F80007FE048
+C7EA0FF0003E140348140116F8481400A56C1401007C15F06CEC03E0003F1407D80F80EB
+0F80D807E0EB3F003901FC01FC39007FFFF0010790C7FC26387EA52A>I<EA03F012FFA3
+120F1203B0EC0FF0EC3FFCECF03F9039F1C01F809039F3800FC0EBF70013FE496D7EA25B
+A35BB3A3486C497EB500C1B51280A3293A7EB92E>I<EA0380EA0FE0487EA56C5AEA0380
+C8FCAAEA03F012FFA312071203B3AA487EB512C0A312387EB717>I<EB01C0EB07F0EB0F
+F8A5EB07F0EB01C090C7FCAAEB01F813FFA313071301B3B3A2123C127E00FF13F01303A2
+14E038FE07C0127C383C0F00EA0FFEEA03F8154984B719>I<EA03F012FFA3120F1203B1
+913801FFFCA39138007FC01600157C15705D4A5A4A5A4AC7FC141E1438147814FC13F1EB
+F3FEEBF73F01FE7FEBF81F496C7E8114076E7E6E7E811400157E157F811680ED1FC0486C
+EB3FF0B500C0B5FCA3283A7EB92C>I<EA03F012FFA3120F1203B3B3AD487EB512C0A312
+3A7EB917>I<2703F00FF0EB1FE000FFD93FFCEB7FF8913AF03F01E07E903BF1C01F8380
+3F3D0FF3800FC7001F802603F70013CE01FE14DC49D907F8EB0FC0A2495CA3495CB3A348
+6C496CEB1FE0B500C1B50083B5FCA340257EA445>I<3903F00FF000FFEB3FFCECF03F90
+39F1C01F803A0FF3800FC03803F70013FE496D7EA25BA35BB3A3486C497EB500C1B51280
+A329257EA42E>I<EB03FE90380FFF8090383E03E09038F800F84848137C48487F48487F
+4848EB0F80001F15C090C712074815E0A2007EEC03F0A400FE15F8A9007E15F0A2007F14
+076C15E0A26C6CEB0FC0000F15806D131F6C6CEB3F006C6C137EC66C13F890387E03F090
+381FFFC0D903FEC7FC25277EA52A>I<3903F01FE000FFEB7FF89038F1E07E9039F3801F
+803A07F7000FC0D803FEEB07E049EB03F04914F849130116FC150016FEA3167FAA16FEA3
+ED01FCA26DEB03F816F06D13076DEB0FE001F614C09039F7803F009038F1E07E9038F0FF
+F8EC1FC091C8FCAB487EB512C0A328357EA42E>I<D903F813C090381FFE0190387E0781
+9038FC01C33903F000E3000714774848133749133F001F141F485A150F48C7FCA312FEAA
+127FA37E6D131F121F6D133F120F6C6C137F6C6C13EF3901F801CF39007E078F90381FFE
+0FEB07F890C7FCABED1FE00203B5FCA328357DA42C>I<3807E01F00FFEB7FC09038E1E3
+E09038E387F0380FE707EA03E613EE9038EC03E09038FC0080491300A45BB3A2487EB512
+F0A31C257EA421>I<EBFF03000313E7380F80FF381E003F487F487F00707F12F0A2807E
+A27EB490C7FCEA7FE013FF6C13E06C13F86C7F00037FC67F01071380EB007F141F00C0EB
+0FC01407A26C1303A37E15806C13077EEC0F00B4131E38F3C07C38E1FFF038C03F801A27
+7DA521>I<1318A51338A31378A313F8120112031207001FB5FCB6FCA2D801F8C7FCB215
+C0A93800FC011580EB7C03017E13006D5AEB0FFEEB01F81A347FB220>I<D803F0EB07E0
+00FFEB01FFA3000FEB001F00031407B3A4150FA3151F12016D133F0000EC77F86D9038E7
+FF8090383F03C790381FFF87903A03FC07E00029267EA42E>I<B538803FFEA33A0FF800
+0FF06C48EB07E00003EC03C06D148000011500A26C6C1306A26D130E017E130CA26D5BA2
+EC8038011F1330A26D6C5AA214E001075BA2903803F180A3D901FBC7FCA214FF6D5AA214
+7CA31438A227257EA32C>I<B53A1FFFE03FFEA3260FF8009038000FF86C48017EEB03E0
+18C00003023EEB0180A26C6C013FEB0300A36C6CEC8006156FA2017E9038EFC00C15C717
+1CD93F01EBE01815830281EBF038D91F831430150102C3EBF87090260FC6001360A2D907
+E66D5A02EC137CA2D903FCEB7F804A133FA2010192C7FC4A7FA20100141E4A130E026013
+0C37257EA33C>I<B538807FFFA33A03FE003FF00001EC1F80000092C7FC017E131C6D13
+186D6C5AECC070010F5B6D6C5AECF180EB03FB6DB4C8FC6D5AA2147F804A7E8114CF9038
+01C7E090380383F090380703F8EB0601496C7E011C137E49137F01787F496D7E486C8000
+0FEC3FF0D8FFFE90B51280A329247FA32C>I<B538803FFEA33A0FF8000FF06C48EB07C0
+0003EC03806C7E16007F00001406A2017E5BA2137F6D5BA26D6C5AA2ECC070010F1360A2
+6D6C5AA214F101035BA2D901FBC7FCA214FF6D5AA2147CA31438A21430A214701460A25C
+A2EA7C0100FE5B130391C8FC1306EAFC0EEA701C6C5AEA1FF0EA0FC027357EA32C>I<00
+3FB512FCA2EB8003D83E0013F8003CEB07F00038EB0FE012300070EB1FC0EC3F80006013
+7F150014FE495AA2C6485A495AA2495A495A495AA290387F000613FEA2485A485A000714
+0E5B4848130C4848131CA24848133C48C7127C48EB03FC90B5FCA21F247EA325>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fg ecss2074 20.74 10
+/Fg 10 116 df<EAFFC0B3B3B3B3B3B390B912FCA83E7570F456>76
+D<D8FFC0F03FF0B3B3B3B3AD6C6CF07FE0A46C6CF0FFC0A36D5F001F1A80A26C6C4D1300
+A26C6C4D5A6D170F6C616E161F6C6D4C5A6C6D4C5A6E16FF6D6C4B5B6D6C4B5B6D6C4B5B
+6D6C6C021F90C7FC6D01E0EC7FFE6D01F849485A6D9026FF801F5B6D91B65A6E5E021F16
+8002074BC8FC020115F86E6C14E0030F91C9FC030013F04C7770F46D>85
+D<91380FFF8049B512F0010F14FC017F14FF48B712C0000782001F824882DAE0007F49C7
+EA3FFE01F8140FD81FC06E7E90C86C1380121E00186F13C0001081CAFCEF7FE0A318F017
+3FAD93B5FC157F0207B6FC143F49B7FC1307011F153F017FEBF80090B512804801F8C7FC
+4813C04890C8FCEA0FFC485A485A5B485A5BA248C9FCA5177FA26D15FFA26C6C5C6D5C6D
+140F6C6C5C01FF91B5FC6CEBE00791B612BF6CEDFE3F16FC6C15F06C15C06CECFE006C6C
+13F0D91FFCC9FC344C77CA4C>97 D<EAFFC0B3B3ADED0FFC92B57E020714E0021F80027F
+14FC91B67E01C38101C7829026CFFE0080D9DFF0131FD9FFC001037F4A6D7F49C86C7E49
+153F496F7E170F496F7E5B717E4981A2711380A2187FA219C0183FA419E0181FAD183F19
+C0A3187FA2198018FFA24D1300A25F6D5E17076D4B5A6D151F4D5A6D4B5A6D15FF6D0203
+5B6E495BD9DFE0013F5B9026CFFC01B5C7FC01C7B65A01C35D01C15D01C05D023F14C002
+0F5C020301FCC8FCC8EA3FE03B7C72FA52>I<ED3FFF4AB512F8020F14FF023F15C04A15
+F049B712FC4916FF49178049EBE0004990C7120FD93FFC02011300D97FF06E7E4948151F
+0280814890C912034894C7FC5B485A5B120F5B121F5B123F5BA3485AA548CCFCAD6C7EA4
+7F123FA27F121F7FA26C7EA26C6C17806D1601000317036C6C160F6E151F6C01E0ED7FC0
+6D6CEC01FFD93FFC14076DB4143F6DD9E003B512806D90B6EAFE006D5E6D16F06D6C5D6E
+1580020F02FCC7FC020114E09126003FFCC8FC3A4C78CA47>I<DB1FE04AB4FC912601FF
+FE143F02079026FF8003B5FC4AECC01F023F02F0B6FC4A02FB158091BAFC49EBE01F49D9
+000302FCC7FC49486D01F8C8FC02F89038007F8049486E7E49486E7E4A140F013F824A14
+07A249C86C7EA401FE6F7EAA017F4B5AA46D6C4A5AA26E140F011F5E6E141F6D6C4A5A6D
+6C4A5A02FEEB01FF496C4990C9FC499038E01FFE92B55A495D02BF5C020F14C0496C5CD9
+7E0149CAFC9138001FE001FE90CCFCA67FA27F8080EB3FF091B612FE6DEDFFF818FF6D17
+C019F0013F17FC498390BA7E48854801E0C71203480180DA001F7F4848C900037F484816
+0049EF3FF84848171F49717E127F4917078648481703A76D1707007F616D170F003F616D
+171FD81FFCEF7FF06C6C4D5A6D5E6C01C003075B6C01F8033F5BC601FF4AB448C7FC6D01
+F0011F5B6D90B75A010F17E00103178001004CC8FC021F15F002031580DA000F01E0C9FC
+496D7CC950>103 D<EAFFE0ABC7FCB3A9EA7FE0B3B3B3B30B6F74EE25>105
+D<EAFFC0B3B3B3B3B3B3AF0A7B73FA25>108 D<ED1FF826FFC001B57E020714E0021F14
+F8027F8091B67E01C18101C316809038C7FE00D9CFF0011F13C0D9DFE0010713E0D9FF80
+130191C8FC18F049157F5B173F4916F8A249151FA35BA45BB3B3AC354A72C952>110
+D<91380FFFC091B512FE0107ECFFC0011F15F8017F15FE90B812804817C05A489038F000
+3F4890C70003138049EC007FD81FF8151F491507003F16014992C7FCA2485AA77FA26C7E
+7F7F6CB4FC6C13C014F86CEBFF806C14FC6CECFFE06C15FC6D14FF6D15C0010F81010315
+F8010081020F80DA007F7F03071480DB003F13C0160F040313E01600EF7FF0173FA2EF1F
+F8A2170FA7EF1FF0A20070163F127C007FEE7FE001C015FF01F0020313C0B5020F138002
+F0137F91B712006C5E001F5E000716F0C65E011F1580010302FCC7FCD9000F13C0354C7C
+CA3D>115 D E
+%EndDVIPSBitmapFont
+end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+%%BeginPaperSize: Letter
+letter
+%%EndPaperSize
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop 0 201 a Fg(Using)54 b(Libical)p 0 315 3900 24
+v 0 428 a Ff(Eric)28 b(Busb)r(o)r(om)f(\(eric@soft)n(w)n
+(arestudio.org\))1948 b(Jan)n(uary)26 b(2001)0 1072 y
+Fe(Con)l(ten)l(ts)0 1312 y Fd(1)77 b(In)m(tro)s(duction)3201
+b(2)125 1468 y Ff(1.1)83 b(The)28 b(libical)f(pro)5 b(ject)67
+b(.)41 b(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)
+f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)134 b(3)125 1625 y(1.2)83
+b(License)22 b(.)41 b(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)
+f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h
+(.)134 b(3)125 1781 y(1.3)83 b(Example)28 b(Co)r(de)78
+b(.)41 b(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)
+f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)134 b(3)0 2021
+y Fd(2)77 b(Building)30 b(the)h(Library)2865 b(3)0 2260
+y(3)77 b(Structure)3330 b(3)125 2417 y Ff(3.1)83 b(Core)27
+b(iCal)g(classes)62 b(.)42 b(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)134
+b(4)315 2573 y(3.1.1)94 b(Prop)r(erties)34 b(.)42 b(.)f(.)h(.)g(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)
+h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f
+(.)h(.)134 b(4)315 2730 y(3.1.2)94 b(Comp)r(onen)n(ts)84
+b(.)42 b(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)
+h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g
+(.)f(.)h(.)f(.)h(.)f(.)h(.)134 b(5)315 2886 y(3.1.3)94
+b(V)-7 b(alues)108 b(.)41 b(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)134
+b(5)315 3043 y(3.1.4)94 b(P)n(arameters)61 b(.)41 b(.)h(.)g(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)
+f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h
+(.)134 b(5)125 3199 y(3.2)83 b(Other)27 b(elemen)n(ts)h(of)f(libical)42
+b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f
+(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)
+f(.)h(.)f(.)h(.)134 b(5)315 3356 y(3.2.1)94 b(En)n(umerations)27
+b(and)g(t)n(yp)r(es)42 b(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)
+g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f
+(.)h(.)f(.)h(.)f(.)h(.)134 b(5)315 3512 y(3.2.2)94 b(The)28
+b(parser)78 b(.)41 b(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)
+h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)134 b(5)315
+3669 y(3.2.3)94 b(Error)26 b(ob)5 b(jects)57 b(.)42 b(.)g(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)
+f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h
+(.)134 b(5)315 3825 y(3.2.4)94 b(Memory)27 b(Managemen)n(t)65
+b(.)42 b(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)
+h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f
+(.)h(.)134 b(5)315 3981 y(3.2.5)94 b(Storage)26 b(classes)64
+b(.)42 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)
+g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f
+(.)h(.)f(.)h(.)f(.)h(.)134 b(5)0 4221 y Fd(4)77 b(Di\033erences)30
+b(F)-8 b(rom)31 b(RF)m(Cs)2750 b(6)125 4377 y Ff(4.1)83
+b(Pseudo)28 b(Comp)r(onen)n(ts)62 b(.)42 b(.)g(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)134
+b(6)125 4534 y(4.2)83 b(Com)n(bined)28 b(V)-7 b(alues)108
+b(.)41 b(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)
+f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)134 b(6)125 4690 y(4.3)83
+b(Multi-V)-7 b(alued)28 b(Prop)r(erties)54 b(.)41 b(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)134
+b(6)0 4930 y Fd(5)77 b(Using)31 b(libical)3208 b(7)125
+5086 y Ff(5.1)83 b(Creating)27 b(Comp)r(onen)n(ts)73
+b(.)42 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)
+g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f
+(.)h(.)f(.)h(.)f(.)h(.)134 b(7)315 5243 y(5.1.1)94 b(Constructor)26
+b(In)n(terfaces)48 b(.)42 b(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h
+(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)
+f(.)h(.)f(.)h(.)f(.)h(.)134 b(7)315 5399 y(5.1.2)94 b(v)-5
+b(aargs)26 b(Constructors)70 b(.)41 b(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h
+(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)134 b(8)p eop
+%%Page: 2 2
+2 1 bop 0 -167 3900 5 v 0 -200 a Fd(1.)73 b(In)m(tro)s(duction)3184
+b Ff(2)315 162 y(5.1.3)94 b(P)n(arsing)26 b(T)-7 b(ext)28
+b(Files)68 b(.)42 b(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h
+(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)
+f(.)h(.)f(.)h(.)f(.)h(.)134 b(8)125 318 y(5.2)83 b(A)n(ccessing)27
+b(Comp)r(onen)n(ts)105 b(.)41 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h
+(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 b(10)315 475
+y(5.2.1)h(Finding)28 b(Comp)r(onen)n(ts)99 b(.)42 b(.)f(.)h(.)f(.)h(.)g
+(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 b(10)315
+631 y(5.2.2)h(Iterating)27 b(Through)f(Comp)r(onen)n(ts)45
+b(.)d(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93
+b(10)315 788 y(5.2.3)h(Using)27 b(Comp)r(onen)n(t)h(Iterators)59
+b(.)41 b(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)
+g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93
+b(11)315 944 y(5.2.4)h(Remo)n(ving)27 b(Comp)r(onen)n(ts)83
+b(.)41 b(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)
+f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h
+(.)93 b(12)315 1101 y(5.2.5)h(W)-7 b(orking)27 b(with)h(prop)r(erties)e
+(and)i(parameters)e(.)41 b(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93
+b(12)315 1257 y(5.2.6)h(W)-7 b(orking)27 b(with)h(v)-5
+b(alues)52 b(.)41 b(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g
+(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)
+h(.)f(.)h(.)f(.)h(.)93 b(13)315 1413 y(5.2.7)h(Chec)n(king)27
+b(Comp)r(onen)n(t)g(V)-7 b(alidit)n(y)25 b(.)42 b(.)g(.)f(.)h(.)f(.)h
+(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 b(14)315 1570 y(5.2.8)h(Con)n(v)n
+(erting)26 b(Comp)r(onen)n(ts)h(to)g(T)-7 b(ext)74 b(.)41
+b(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 b(14)125
+1726 y(5.3)83 b(Time)33 b(.)42 b(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)
+g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f
+(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)
+f(.)h(.)f(.)h(.)93 b(15)315 1883 y(5.3.1)h(Time)28 b(structure)56
+b(.)42 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)
+g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f
+(.)h(.)f(.)h(.)f(.)h(.)93 b(15)315 2039 y(5.3.2)h(Creating)26
+b(time)j(structures)j(.)41 b(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)
+g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f
+(.)h(.)f(.)h(.)f(.)h(.)93 b(15)315 2196 y(5.3.3)h(Time)28
+b(manipulating)f(routines)38 b(.)j(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g
+(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)
+h(.)f(.)h(.)f(.)h(.)93 b(15)125 2352 y(5.4)83 b(Storing)27
+b(Ob)5 b(jects)39 b(.)i(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93
+b(17)315 2509 y(5.4.1)h(Creating)26 b(a)i(new)f(set)48
+b(.)42 b(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)
+h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f
+(.)h(.)f(.)h(.)93 b(17)315 2665 y(5.4.2)h(A)n(dding,)28
+b(Finding)f(and)h(Remo)n(ving)e(Comp)r(onen)n(ts)76 b(.)41
+b(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h
+(.)f(.)h(.)f(.)h(.)93 b(18)315 2822 y(5.4.3)h(Other)27
+b(routines)70 b(.)42 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f
+(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 b(19)125 2978
+y(5.5)83 b(Memory)27 b(Managemen)n(t)73 b(.)42 b(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93
+b(19)125 3135 y(5.6)83 b(Error)27 b(Handling)56 b(.)41
+b(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h
+(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 b(20)315 3291 y(5.6.1)h(Return)28
+b(v)-5 b(alues)34 b(.)42 b(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f
+(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 b(20)315
+3448 y(5.6.2)h(icalerrno)28 b(.)41 b(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h
+(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93
+b(20)315 3604 y(5.6.3)h(X-LIC-ERR)n(OR)27 b(and)g(X-LIC-INV)-9
+b(ALID-COMPONENT)70 b(.)42 b(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)
+f(.)h(.)f(.)h(.)f(.)h(.)93 b(20)125 3760 y(5.7)83 b(Naming)28
+b(Standard)h(.)42 b(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f
+(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 b(21)0
+4000 y Fd(6)77 b(Hac)m(ks)32 b(and)g(Bugs)3009 b(22)0
+4338 y Fe(1)131 b(In)l(tro)t(duction)0 4577 y Ff(Libical)23
+b(is)f(an)h(Op)r(en)g(Source)f(implemen)n(tation)h(of)g(the)g
+(iCalendar)f(proto)r(cols)f(and)i(proto)r(col)e(data)i(units.)35
+b(The)23 b(iCalendar)0 4691 y(sp)r(eci\034cation)29 b(describ)r(es)f
+(ho)n(w)h(calendar)f(clien)n(ts)h(can)f(comm)n(unicate)h(with)h
+(calendar)d(serv)n(ers)g(so)i(users)f(can)h(store)f(their)0
+4804 y(calendar)e(data)h(and)h(arrange)d(meetings)i(with)h(other)f
+(users.)0 4961 y(Libical)g(implemen)n(ts)h(RF)n(C2445,)e(RF)n(C2446)f
+(and)j(some)f(of)g(RF)n(C2447)f(and)h(the)h(CAP)g(draft.)0
+5117 y(This)k(do)r(cumen)n(tation)g(assumes)g(that)g(y)n(ou)g(are)f
+(familiar)h(with)h(the)f(iCalendar)f(standards)g(RF)n(C2445)g(and)h(RF)
+n(C2446.)0 5231 y(these)c(sp)r(eci\034cations)e(are)h(online)g(on)h
+(the)g(CALSCH)g(w)n(ebpage)e(at:)p eop
+%%Page: 3 3
+3 2 bop 0 -167 3900 5 v 0 -200 a Fd(2.)73 b(Building)31
+b(the)g(Library)2847 b Ff(3)0 162 y Fc(http://www.imc.o)o(rg)o(/ie)o
+(tf)o(-c)o(ale)o(nd)o(ar)o(/)0 453 y Fb(1.1)112 b(The)38
+b(libical)c(pro)6 b(ject)0 663 y Ff(This)29 b(co)r(de)g(is)g(under)g
+(activ)n(e)f(dev)n(elopmen)n(t.)40 b(If)30 b(y)n(ou)e(w)n(ould)h(lik)n
+(e)f(to)h(con)n(tribute)g(to)g(the)g(pro)5 b(ject,)29
+b(y)n(ou)f(can)h(con)n(tact)f(me,)0 777 y(Eric)g(Busb)r(o)r(om,)f(at)g
+(eric@soft)n(w)n(arestudio.org.)33 b(The)27 b(pro)5 b(ject)27
+b(has)g(a)g(w)n(ebpage)g(at)0 1016 y Fc(http://softwares)o(tu)o(dio)o
+(.o)o(rg)o(/li)o(bi)o(ca)o(l/i)o(nd)o(ex)o(.ht)o(ml)0
+1256 y Ff(and)g(a)h(mailing)f(list)g(that)h(y)n(ou)f(can)g(join)h(b)n
+(y)f(sending)g(the)h(follo)n(wing)f(mail:)0 1495 y Fc(To:)42
+b(minimalist@softwa)o(re)o(st)o(udi)o(o.)o(or)o(g)0 1609
+y(Subject:)e(subscribe)g(libical)0 1900 y Fb(1.2)112
+b(License)0 2111 y Ff(The)60 b(co)r(de)f(and)h(data\034les)f(in)h(this)
+g(distribution)g(are)e(licensed)i(under)g(the)g(Mozilla)f(Public)h
+(License.)133 b(See)0 2224 y(h)n(ttp://www.mozilla.org/NPL/MPL-1.0.h)n
+(tml)37 b(for)j(a)h(cop)n(y)f(of)g(the)i(license.)76
+b(Alternately)-7 b(,)44 b(y)n(ou)c(ma)n(y)g(use)g(libical)0
+2338 y(under)32 b(the)g(terms)g(of)g(the)g(GNU)h(Library)d(General)h
+(Public)i(License.)50 b(See)32 b(h)n(ttp://www.fsf.org/cop)n
+(yleft/lesser.h)n(tml)0 2451 y(for)27 b(a)g(cop)n(y)g(of)g(the)h(LGPL.)
+0 2608 y(This)j(dual)g(license)f(ensures)h(that)g(the)g(library)f(can)g
+(b)r(e)i(incorp)r(orated)d(in)n(to)i(b)r(oth)g(proprietary)e(co)r(de)i
+(and)f(GPL'd)i(pro-)0 2721 y(grams,)23 b(and)h(will)h(b)r(ene\034t)g
+(from)f(impro)n(v)n(emen)n(ts)e(made)i(b)n(y)g(programmers)e(in)i(b)r
+(oth)h(realms.)34 b(I)25 b(will)f(only)g(accept)g(c)n(hanges)0
+2835 y(in)n(to)j(m)n(y)h(v)n(ersion)e(of)h(the)h(library)e(if)i(they)g
+(are)f(similarly)f(dual-licensed.)0 3126 y Fb(1.3)112
+b(Example)37 b(Co)s(de)0 3336 y Ff(A)h(lot)f(of)h(the)g(do)r(cumen)n
+(tation)f(for)g(this)h(library)e(is)i(in)g(the)g(form)f(of)g(example)g
+(co)r(de.)67 b(These)37 b(examples)g(are)g(in)h(the)0
+3450 y("examples")26 b(directory)g(of)i(the)g(distribution.)36
+b(Also)28 b(lo)r(ok)e(in)i("src/test")e(for)h(additional)g(annotated)g
+(examples.)0 3788 y Fe(2)131 b(Building)46 b(the)e(Library)0
+4027 y Ff(Libical)33 b(uses)h(auto)r(conf)f(to)h(generate)e(mak)n
+(e\034les.)55 b(It)34 b(should)g(built)g(with)g(no)g(adjustmen)n(ts)g
+(on)f(Lin)n(ux,)j(F)-7 b(reeBSD)33 b(and)0 4141 y(Solaris)22
+b(under)i(gcc.)34 b(Some)24 b(v)n(ersion)e(ha)n(v)n(e)g(b)r(een)i
+(successfully)f(b)r(een)h(build)g(on)f(MacOS,)g(Solaris,)g(UnixW)-7
+b(are,)24 b(And)g(T)-7 b(ru64)0 4254 y(UNIX)28 b(without)g(gcc,)f(but)i
+(y)n(ou)d(ma)n(y)h(run)h(in)n(to)f(problems)g(with)h(a)f(particular)f
+(later)h(v)n(ersion.)0 4411 y(F)-7 b(or)27 b(a)g(more)g(complete)g
+(guide)h(to)f(building)h(the)g(library)-7 b(,)26 b(see)h(the)h(README)i
+(\034le)e(in)f(the)h(distribution.)0 4749 y Fe(3)131
+b(Structure)0 4988 y Ff(The)28 b(iCal)f(calendar)f(mo)r(del)i(is)f
+(based)g(on)h(four)f(t)n(yp)r(es)g(of)h(ob)5 b(jects:)36
+b(comp)r(onen)n(ts,)27 b(prop)r(erties,)g(v)-5 b(alues)27
+b(and)g(parameters.)0 5144 y(Prop)r(erties)32 b(are)f(the)i(fundamen)n
+(tal)f(unit)i(of)e(information)g(in)g(iCal,)i(and)e(they)g(w)n(ork)f(a)
+h(bit)h(lik)n(e)f(a)g(hash)g(en)n(try)-7 b(,)34 b(with)e(a)0
+5258 y(constan)n(t)21 b(k)n(ey)h(and)g(a)f(v)-5 b(ariable)21
+b(v)-5 b(alue.)35 b(Prop)r(erties)21 b(ma)n(y)h(also)f(ha)n(v)n(e)g(mo)
+r(di\034ers,)h(called)g(parameters.)33 b(In)22 b(the)h(iCal)f(con)n
+(ten)n(t)0 5371 y(line)p eop
+%%Page: 4 4
+4 3 bop 0 -167 3900 5 v 0 -200 a Fd(3.)73 b(Structure)3313
+b Ff(4)0 162 y Fc(ORGANIZER;ROLE=C)o(HA)o(IR:)o(MA)o(IL)o(TO:)o(mr)o
+(bi)o(g@h)o(os)o(t.)o(com)0 401 y Ff(The)34 b(prop)r(ert)n(y)f(name)h
+(is)g("OR)n(GANIZER,")g(the)g(v)-5 b(alue)34 b(of)h(the)f(prop)r(ert)n
+(y)f(is)h("mrbig@host.com")e(and)i(the)g("R)n(OLE")0
+515 y(parameter)26 b(sp)r(eci\034es)h(that)h(Mr)g(Big)f(is)g(the)h(c)n
+(hair)e(of)i(the)g(meetings)f(asso)r(ciated)f(with)i(this)g(prop)r(ert)
+n(y)-7 b(.)0 671 y(Comp)r(onen)n(ts)26 b(are)f(groups)g(of)h(prop)r
+(erties)f(that)i(represen)n(t)e(the)i(core)e(ob)5 b(jects)26
+b(of)g(a)g(calendar)f(system,)h(suc)n(h)g(as)g(ev)n(en)n(ts)f(or)0
+785 y(timezones.)36 b(Comp)r(onen)n(ts)27 b(are)g(delimited)h(b)n(y)g
+("BEGIN")f(and)g("END")h(tags.)0 941 y(When)g(a)f(comp)r(onen)n(t)g(is)
+h(sen)n(t)f(across)f(a)h(net)n(w)n(ork,)f(if)i(it)g(is)g(un-encrypted,)
+f(it)h(will)g(lo)r(ok)f(something)g(lik)n(e:)0 1181 y
+Fc(BEGIN:VCALENDAR)0 1294 y(METHOD:REQUEST)0 1408 y(PRODID:)41
+b(-//hacksw/handc)o(al)o(//N)o(ON)o(SG)o(ML)c(v1.0//EN)0
+1521 y(BEGIN:VEVENT)0 1635 y(DTSTAMP:19980309)o(T2)o(310)o(00)o(Z)0
+1749 y(UID:guid-1.host1)o(.c)o(om)0 1862 y(ORGANIZER;ROLE=C)o(HA)o(IR:)
+o(MA)o(IL)o(TO:)o(mr)o(bi)o(g@h)o(os)o(t.)o(com)0 1976
+y(ATTENDEE;RSVP=TR)o(UE)o(;RO)o(LE)o(=R)o(EQ-)o(PA)o(RT)o(ICI)o(PA)o
+(NT)o(;CU)o(TY)o(PE)o(=GR)o(OU)o(P:)87 2089 y(MAILTO:employee-)o(A@h)o
+(os)o(t.)o(com)0 2203 y(DESCRIPTION:Proj)o(ec)o(t)h(XYZ)k(Review)f
+(Meeting)0 2317 y(CATEGORIES:MEETI)o(NG)0 2430 y(CLASS:PUBLIC)0
+2544 y(CREATED:19980309)o(T1)o(300)o(00)o(Z)0 2657 y(SUMMARY:XYZ)e
+(Project)i(Review)0 2771 y(DTSTART;TZID=US-)o(Ea)o(ste)o(rn)o(:1)o(998)
+o(03)o(12)o(T08)o(30)o(00)0 2884 y(DTEND;TZID=US-Ea)o(st)o(ern)o(:1)o
+(99)o(803)o(12)o(T0)o(930)o(00)0 2998 y(LOCATION:1CP)d(Conference)i
+(Room)i(4350)0 3112 y(END:VEVENT)0 3225 y(END:VCALENDAR)0
+3465 y Ff(Note)28 b(that)h(comp)r(onen)n(ts)f(can)g(b)r(e)h(nested;)g
+(this)g(example)e(has)h(b)r(oth)h(a)f(V)n(CALEND)n(AR)i(and)e(a)g
+(VEVENT)i(comp)r(onen)n(t,)0 3578 y(one)d(nested)h(inside)f(the)h
+(other.)0 3870 y Fb(3.1)112 b(Core)37 b(iCal)f(classes)0
+4080 y Ff(Libical)25 b(is)h(an)g(ob)5 b(ject-based,)25
+b(data-orien)n(ted)f(library)-7 b(.)34 b(Nearly)25 b(all)h(of)g(the)g
+(routines)f(in)h(the)g(library)e(are)h(asso)r(ciated)g(with)0
+4193 y(an)e(opaque)g(data)f(t)n(yp)r(es)i(and)f(p)r(erform)g(some)g(op)
+r(eration)f(on)h(that)h(data)e(t)n(yp)r(e.)36 b(Although)24
+b(the)f(library)f(do)r(es)h(not)h(actually)0 4307 y(ha)n(v)n(e)32
+b(classes,)h(w)n(e)g(will)g(use)g(those)g(terms)f(since)h(the)h(b)r
+(eha)n(vior)d(of)i(these)g(asso)r(ciations)e(of)j(data)e(and)h
+(routines)f(is)h(v)n(ery)0 4420 y(similar)27 b(to)g(a)g(class.)0
+4693 y Fd(3.1.1)94 b(Prop)s(erties)0 4903 y Ff(Prop)r(erties)23
+b(are)g(represen)n(ted)f(with)j(the)f(icalprop)r(ert)n(y)e(class)h(and)
+g(its)h(man)n(y)f("deriv)n(ed")f(classes)g(with)j(on)e("deriv)n(ed")f
+(class)0 5017 y(p)r(er)35 b(prop)r(ert)n(y)g(t)n(yp)r(e)g(in)h(RF)n
+(C2445.)59 b(Again,)37 b(there)e(is)h(no)f(actual)g(inheritance)g
+(relations,)h(but)g(there)g(are)e(clusters)h(of)0 5130
+y(routines)27 b(that)h(mak)n(e)e(this)i(term)g(useful.)37
+b(A)28 b(prop)r(ert)n(y)e(is)i(a)f(con)n(tainer)f(for)h(a)g(single)g(v)
+-5 b(alue)28 b(and)f(a)g(set)h(of)f(parameters.)p eop
+%%Page: 5 5
+5 4 bop 0 -167 3900 5 v 0 -200 a Fd(3.)73 b(Structure)3313
+b Ff(5)0 162 y Fd(3.1.2)94 b(Comp)s(onen)m(ts)0 372 y
+Ff(In)29 b(libical,)f(comp)r(onen)n(ts)g(are)g(represen)n(ted)f(with)i
+(the)g(icalcomp)r(onen)n(t)e(class.)39 b(Icalcomp)r(onen)n(t)27
+b(is)i(a)f(con)n(tainer)f(for)h(a)g(set)0 485 y(of)g(other)e(comp)r
+(onen)n(ts)h(and)h(prop)r(erties.)0 758 y Fd(3.1.3)94
+b(V)-8 b(alues)0 968 y Ff(V)h(alues)29 b(are)g(represen)n(ted)f(in)i(a)
+f(similar)f(w)n(a)n(y)g(to)i(prop)r(erties;)f(a)g(base)g(class)g(and)g
+(man)n(y)g("deriv)n(ed)f(")h(classes.)41 b(A)30 b(v)-5
+b(alue)29 b(is)0 1082 y(essen)n(tially)d(a)i(abstract)e(handle)i(on)f
+(a)g(single)g(fundamen)n(tal)h(t)n(yp)r(e,)f(a)h(structure)f(or)f(a)h
+(union.)0 1354 y Fd(3.1.4)94 b(P)m(arameters)0 1564 y
+Ff(P)n(arameters)26 b(are)g(represetned)h(in)h(a)f(similar)g(w)n(a)n(y)
+f(to)i(prop)r(erties,)e(except)i(that)g(they)f(con)n(tain)g(only)g(one)
+g(v)-5 b(alue)0 1856 y Fb(3.2)112 b(Other)37 b(elemen)m(ts)g(of)g
+(libical)0 2066 y Ff(In)26 b(addition)f(to)h(the)g(core)e(iCal)h
+(classes,)g(libical)g(has)g(man)n(y)g(other)g(t)n(yp)r(es,)h
+(structures,)g(classes)e(that)i(aid)f(in)h(creating)e(and)0
+2179 y(using)j(iCal)g(comp)r(onen)n(ts.)0 2452 y Fd(3.2.1)94
+b(En)m(umerations)30 b(and)i(t)m(yp)s(es)0 2662 y Ff(Libical)h(is)f
+(strongly)g(t)n(yp)r(ed,)i(so)r(o)e(ev)n(ery)g(comp)r(onen)n(t,)i(prop)
+r(ert)n(y)-7 b(,)33 b(parameter,)g(and)f(v)-5 b(alue)33
+b(t)n(yp)r(e)g(has)g(an)f(en)n(umeration,)0 2776 y(and)27
+b(some)g(ha)n(v)n(e)g(an)g(asso)r(ciated)f(structure)h(or)g(union.)0
+3048 y Fd(3.2.2)94 b(The)32 b(parser)0 3258 y Ff(The)20
+b(libical)f(parser)f(o\033ers)h(a)g(v)-5 b(ariet)n(y)19
+b(of)h(w)n(a)n(ys)e(to)h(con)n(v)n(ert)f(RF)n(C2445)g(text)i(in)n(to)g
+(a)f(libical)g(iinsteral)g(comp)r(onen)n(t)h(structure.)0
+3372 y(the)28 b(parser)e(can)h(parse)f(blo)r(c)n(ks)h(of)h(text)g(as)f
+(a)g(string,)g(or)f(it)i(can)g(parse)e(lin-b)n(y-line.)0
+3645 y Fd(3.2.3)94 b(Error)32 b(ob)5 b(jects)0 3855 y
+Ff(Libical)27 b(has)g(a)g(substan)n(tial)g(error)f(rep)r(orting)g
+(system)i(for)f(b)r(oth)h(programming)d(errors)g(and)j(comp)r(onen)n(t)
+f(usage)f(errors.)0 4127 y Fd(3.2.4)94 b(Memory)30 b(Managemen)m(t)0
+4337 y Ff(Since)38 b(man)n(y)g(of)h(libicals)e(in)n(terfaces)h(return)g
+(strings,)i(the)e(library)f(has)h(its)h(o)n(wn)e(memory)h(managemen)n
+(t)f(system)h(to)0 4451 y(elimiate)28 b(the)g(need)f(to)h(free)f(ev)n
+(ery)f(string)h(returned)g(from)g(the)h(libraru.)0 4724
+y Fd(3.2.5)94 b(Storage)32 b(classes)0 4934 y Ff(The)c(library)e(also)g
+(o\033ers)h(sev)n(eral)f(classes)g(to)h(store)g(comp)r(onen)n(ts)g(to)g
+(\035ies,)h(memory)f(or)f(databases.)p eop
+%%Page: 6 6
+6 5 bop 0 -167 3900 5 v 0 -200 a Fd(4.)73 b(Di\033erences)31
+b(F)-8 b(rom)31 b(RF)m(Cs)2732 b Ff(6)0 162 y Fe(4)131
+b(Di\033erences)44 b(F)-11 b(rom)43 b(RF)l(Cs)0 400 y
+Ff(Libical)c(has)f(b)r(een)h(designed)g(to)f(follo)n(w)h(the)g
+(standards)e(as)i(closely)f(as)g(p)r(ossible,)j(so)e(that)g(the)g(k)n
+(ey)f(ob)5 b(jects)39 b(in)g(the)0 514 y(standards)32
+b(are)g(also)g(k)n(ey)g(ob)5 b(jects)33 b(in)g(the)h(library)-7
+b(.)52 b(Ho)n(w)n(ev)n(er,)32 b(there)h(are)f(a)h(few)g(areas)f(where)g
+(the)i(sp)r(eci\034cations)e(are)0 628 y(\(arguably\))e(irregular,)h
+(and)g(follo)n(wing)g(them)h(exactly)f(w)n(ould)g(result)h(in)g(an)f
+(unfriendly)h(in)n(terface.)49 b(These)31 b(deviations)0
+741 y(mak)n(e)c(libical)g(easier)f(to)i(use)f(b)n(y)h(main)n(taining)e
+(a)h(self-similar)g(in)n(terface.)0 1033 y Fb(4.1)112
+b(Pseudo)38 b(Comp)s(onen)m(ts)0 1243 y Ff(Libical)29
+b(de\034nes)g(comp)r(onen)n(ts)g(for)g(groups)f(of)h(prop)r(erties)f
+(that)i(lo)r(ok)f(and)g(act)g(lik)n(e)g(comp)r(onen)n(ts,)g(but)h(are)e
+(not)i(de\034ned)0 1356 y(as)e(comp)r(onen)n(ts)h(in)g(the)g(sp)r
+(eci\034cation.)41 b(XD)n(A)-7 b(YLIGHT)30 b(and)f(XST)-7
+b(AND)n(ARD)30 b(are)e(notable)h(examples.)40 b(These)29
+b(pseudo)0 1470 y(comp)r(onen)n(ts)d(group)f(prop)r(erties)g(within)i
+(the)g(VTIMEZONE)g(comp)r(onen)n(ts.)36 b(F)-7 b(or)25
+b(instanace,)h(the)h(timezone)f(prop)r(erties)0 1583
+y(asso)r(ciated)f(with)i(da)n(yligh)n(t)e(sa)n(vings)g(time)i(starts)e
+(with)i("BEGIN:D)n(A)-7 b(YLIGHT")27 b(and)f(ends)h(with)f("END:D)n(A)
+-7 b(YLIGHT,)0 1697 y(just)32 b(lik)n(e)g(other)f(comp)r(onen)n(ts,)h
+(but)g(is)g(not)g(de\034ned)g(as)f(a)g(comp)r(onen)n(t)g(in)h(RF)n
+(C2445.)48 b(\()32 b(See)f(RF)n(C2445,)g(page)g(61)g(\))h(In)0
+1811 y(Libical,this)d(grouping)e(is)i(represen)n(ted)e(b)n(y)i(the)g
+(XD)n(A)-7 b(YLIGHT)30 b(comp)r(onen)n(t.)41 b(Standard)28
+b(iCAL)h(comp)r(onen)n(ts)f(all)h(start)0 1924 y(with)f(the)g(letter)g
+("V,")f(while)g(pseudo)g(comp)r(onen)n(ts)g(start)g(with"X.")0
+2081 y(There)22 b(are)g(also)g(pseudo)h(comp)r(onen)n(ts)f(that)h(are)f
+(conceptually)g(deriv)n(ed)g(classes)g(of)h(V)-9 b(ALARM.)23
+b(RF)n(C2446)e(de\034nes)i(what)0 2194 y(prop)r(erties)g(ma)n(y)h(b)r
+(e)g(included)h(in)f(eac)n(h)g(comp)r(onen)n(t,)g(and)g(for)g(V)-9
+b(ALARM,)25 b(the)f(set)g(of)h(prop)r(erties)e(it)h(ma)n(y)g(ha)n(v)n
+(e)f(dep)r(ends)0 2308 y(on)k(the)h(v)-5 b(alue)28 b(of)f(the)h(A)n
+(CTION)f(prop)r(ert)n(y)-7 b(.)0 2464 y(F)g(or)19 b(instance,)j(if)e(a)
+g(V)-9 b(ALARM)20 b(comp)r(onen)n(t)g(has)f(an)h(A)n(CTION)g(prop)r
+(ert)n(y)e(with)j(the)f(v)-5 b(alue)20 b(of)g("A)n(UDIO,")f(the)h(comp)
+r(onen)n(t)0 2578 y(m)n(ust)h(also)g(ha)n(v)n(e)f(an)h("A)-7
+b(TT)g(A)n(CH")21 b(prop)r(ert)n(y)-7 b(.)34 b(Ho)n(w)n(ev)n(er,)20
+b(if)i(the)g(A)n(CTION)f(v)-5 b(alue)21 b(is)g("DISPLA)-7
+b(Y,")22 b(the)g(comp)r(onen)n(t)f(m)n(ust)0 2691 y(ha)n(v)n(e)26
+b(a)i(DESCRIPTION)g(prop)r(ert)n(y)-7 b(.)0 2848 y(T)g(o)28
+b(handle)g(these)g(v)-5 b(arious,)27 b(complex)h(restrictions,)f
+(libical)h(has)g(pseudo)g(comp)r(onen)n(ts)f(for)h(eac)n(h)f(t)n(yp)r
+(e)i(of)f(alarm:)37 b(XA)n(U-)0 2961 y(DIO)n(ALARM,)28
+b(XDISPLA)-7 b(Y)g(ALARM,)30 b(XEMAILALARM)f(and)f(XPR)n(OCEDUREALARM.)
+0 3253 y Fb(4.2)112 b(Com)m(bined)37 b(V)-9 b(alues)0
+3463 y Ff(Man)n(y)34 b(v)-5 b(alues)34 b(can)g(tak)n(e)g(more)g(than)g
+(one)h(t)n(yp)r(e.)58 b(TRIGGER,)35 b(for)f(instance,)i(can)e(ha)n(v)n
+(e)g(a)g(v)-5 b(alue)34 b(t)n(yp)r(e)h(of)g(with)g(DU-)0
+3577 y(RA)-7 b(TION)32 b(or)f(of)h(D)n(A)-7 b(TE-TIME.)33
+b(These)f(m)n(ultiple)g(t)n(yp)r(es)g(mak)n(e)f(it)i(di\036cult)g(to)e
+(create)g(routines)h(to)f(return)h(the)g(v)-5 b(alue)0
+3690 y(asso)r(ciated)26 b(with)i(a)f(prop)r(ert)n(y)-7
+b(.)0 3847 y(It)29 b(is)g(natural)f(to)h(ha)n(v)n(e)f(in)n(terfaces)g
+(that)h(w)n(ould)f(return)h(the)g(v)-5 b(alue)29 b(of)f(a)h(prop)r(ert)
+n(y)-7 b(,)28 b(but)i(it)f(is)g(cum)n(b)r(ersome)f(for)g(a)h(single)0
+3960 y(routine)j(to)g(return)g(m)n(ultiple)h(t)n(yp)r(es.)51
+b(So,)33 b(in)g(libical,)g(prop)r(erties)e(that)i(can)f(ha)n(v)n(e)f(m)
+n(ultiple)i(t)n(yp)r(es)f(are)f(giv)n(en)h(a)g(single)0
+4074 y(t)n(yp)r(e)26 b(that)g(is)g(the)g(union)g(of)g(their)g(RF)n
+(C2445)e(t)n(yp)r(es.)36 b(F)-7 b(or)26 b(instance,)g(in)g(libical,)g
+(the)g(v)-5 b(alue)26 b(of)g(the)g(TRIGGER)h(prop)r(ert)n(y)0
+4187 y(resolv)n(es)e(to)j(struct)f(icaltriggert)n(yp)r(e.)35
+b(This)28 b(t)n(yp)r(e)f(is)h(a)f(union)h(of)f(a)g(DURA)-7
+b(TION)29 b(and)e(a)g(D)n(A)-7 b(TE-TIME.)0 4479 y Fb(4.3)112
+b(Multi-V)-9 b(alued)36 b(Prop)s(erties)0 4689 y Ff(Some)31
+b(prop)r(erties,)h(suc)n(h)f(as)g(CA)-7 b(TEGORIES)33
+b(ha)n(v)n(e)d(only)h(one)g(v)-5 b(alue)32 b(t)n(yp)r(e,)h(but)f(eac)n
+(h)e(CA)-7 b(TEGORIES)33 b(prop)r(ert)n(y)d(can)0 4803
+y(ha)n(v)n(e)24 b(m)n(ultiple)h(v)-5 b(alue)25 b(instances.)35
+b(This)25 b(also)f(results)g(in)h(a)g(cum)n(b)r(ersome)f(in)n(terface)g
+(\025)g(CA)-7 b(TEGORIES)26 b(accessors)d(w)n(ould)0
+4916 y(ha)n(v)n(e)k(to)i(return)f(a)g(list)g(while)h(all)f(other)g
+(accessors)e(returned)i(a)g(single)g(v)-5 b(alue.)39
+b(In)29 b(libical,)g(all)f(prop)r(erties)f(ha)n(v)n(e)h(a)g(single)0
+5030 y(v)-5 b(alue,)35 b(and)e(m)n(ulti-v)-5 b(alued)33
+b(prop)r(erties)f(are)h(brok)n(en)f(do)n(wn)g(in)n(to)h(m)n(ultiple)h
+(single)f(v)-5 b(alued)33 b(prop)r(erties)g(during)f(parsing.)0
+5143 y(That)c(is,)f(an)g(input)i(line)e(lik)n(e,)0 5383
+y Fc(CATEGORIES:)39 b(work,)i(home)p eop
+%%Page: 7 7
+7 6 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32
+b(libical)3190 b Ff(7)0 162 y(b)r(ecomes)27 b(in)h(libical's)f(in)n
+(ternal)g(represen)n(tation)0 401 y Fc(CATEGORIES:)39
+b(work)0 515 y(CATEGORIES:)g(home)0 754 y Ff(Oddly)-7
+b(,)34 b(RF)n(C2445)d(allo)n(ws)g(some)h(m)n(ulti-v)-5
+b(alued)33 b(prop)r(erties)f(\()h(lik)n(e)g(FREEBUSY)h(\))f(to)g(exist)
+g(as)f(b)r(oth)h(a)f(m)n(ulti-v)-5 b(alues)0 868 y(prop)r(ert)n(y)24
+b(and)h(as)f(m)n(ultiple)h(single)g(v)-5 b(alue)24 b(prop)r(erties,)h
+(while)g(others)f(\()i(lik)n(e)e(CA)-7 b(TEGORIES)26
+b(\))f(can)g(only)g(exist)f(as)h(single)0 981 y(m)n(ulti-v)-5
+b(alued)32 b(prop)r(erties.)48 b(This)31 b(mak)n(es)g(the)h(in)n
+(ternal)f(represen)n(tation)e(for)i(CA)-7 b(TEGORIES)33
+b(illegal.)48 b(Ho)n(w)n(ev)n(er)30 b(when)0 1095 y(y)n(ou)d(con)n(v)n
+(ert)f(a)h(comp)r(onen)n(t)g(to)h(a)f(string,)g(the)h(library)e(will)i
+(collect)f(all)g(of)h(the)g(CA)-7 b(TEGORIES)28 b(prop)r(erties)f(in)n
+(to)g(one.)0 1433 y Fe(5)131 b(Using)44 b(libical)0 1691
+y Fb(5.1)112 b(Creating)37 b(Comp)s(onen)m(ts)0 1901
+y Ff(There)e(are)g(three)h(w)n(a)n(ys)e(to)i(create)e(comp)r(onen)n(ts)
+i(in)g(Libical:)53 b(creating)34 b(individual)i(ob)5
+b(jects)35 b(and)h(assem)n(bling)e(them,)0 2015 y(building)28
+b(en)n(tire)f(ob)5 b(jects)27 b(in)h(massiv)n(e)e(v)-5
+b(aargs)26 b(calls,)h(and)g(parsing)f(a)h(text)h(\034le)g(con)n
+(taining)e(iCalendar)h(data.)0 2287 y Fd(5.1.1)94 b(Constructor)32
+b(In)m(terfaces)0 2497 y Ff(Using)e(constructor)f(in)n(terfaces,)i(y)n
+(ou)f(create)f(eac)n(h)h(of)h(the)g(ob)5 b(jects)30 b(separately)f(and)
+i(then)g(assem)n(ble)e(them)i(in)g(to)g(com-)0 2611 y(p)r(onen)n(ts:)0
+2850 y Fc(icalcomponent)38 b(*event;)0 2964 y(icalproperty)g(*prop;)0
+3077 y(icalparameter)g(*param;)0 3191 y(struct)j(icaltimetype)e(atime;)
+0 3305 y(event)i(=)j(icalcomponent_n)o(ew)o(\(IC)o(AL)o(_V)o(EVE)o(NT)o
+(_C)o(OMP)o(ON)o(EN)o(T\);)0 3418 y(prop)e(=)h(icalproperty_new)o(_d)o
+(tst)o(am)o(p\()o(ati)o(me)o(\))37 b(;)0 3532 y(icalcomponent_ad)o(d_)o
+(pro)o(pe)o(rt)o(y\(e)o(ve)o(nt)o(,)h(prop\);)0 3645
+y(prop)k(=)h(icalproperty_new)o(_u)o(id\()o('')o(gu)o(id-)o(1.)o(ho)o
+(st1)o(.c)o(om)o(''\))37 b(\);)0 3759 y(icalcomponent_ad)o(d_)o(pro)o
+(pe)o(rt)o(y\(e)o(ve)o(nt)o(,pr)o(op)o(\);)0 3872 y(prop=icalpropert)o
+(y_)o(new)o(_o)o(rg)o(ani)o(ze)o(r\()o(''m)o(rb)o(ig)o(@ho)o(st)o(.c)o
+(om')o('\))o(;)0 3986 y(param)k(=)j(icalparameter_n)o(ew)o(_ro)o(le)o
+(\(I)o(CAL)o(_R)o(OL)o(E_C)o(HA)o(IR)o(\))0 4100 y(icalproperty_add)o
+(_p)o(ara)o(me)o(te)o(r\(p)o(ro)o(p,)37 b(param\);)0
+4213 y(icalcomponent_ad)o(d_)o(pro)o(pe)o(rt)o(y\(e)o(ve)o(nt)o(,pr)o
+(op)o(\);)0 4453 y Ff(Notice)e(that)g(libical)g(uses)f(a)h(semi-ob)5
+b(ject-orien)n(ted)32 b(st)n(yle)j(of)g(in)n(terface.)58
+b(Most)34 b(things)h(y)n(ou)f(w)n(ork)f(with)j(are)e(ob)5
+b(jects,)0 4566 y(that)28 b(are)e(instan)n(tiated)h(with)h(a)f
+(constructor)f(that)i(has)f("new")g(in)g(the)h(name.)37
+b(Also)27 b(note)g(that,)h(other)f(than)g(the)h(ob)5
+b(ject)0 4680 y(reference,)30 b(most)g(structure)f(data)h(is)g(passed)f
+(in)h(to)g(libical)g(routines)f(b)n(y)h(v)-5 b(alue.)44
+b(Libical)30 b(has)g(some)f(complex)h(but)g(v)n(ery)0
+4793 y(regular)c(memory)g(handling)i(rules.)36 b(These)27
+b(are)g(detailed)g(in)h(section)f(5.5)g(\(\).)0 4950
+y(If)33 b(an)n(y)e(of)h(the)h(constructors)d(fail,)k(they)f(will)f
+(return)g(0.)50 b(If)33 b(y)n(ou)f(try)g(to)g(insert)g(0)f(in)n(to)h(a)
+g(prop)r(ert)n(y)f(or)h(comp)r(onen)n(t,)h(or)0 5063
+y(use)j(a)g(zero-v)-5 b(alued)34 b(ob)5 b(ject)36 b(reference,)h
+(libical)f(will)h(either)f(silen)n(tly)f(ignore)g(the)i(error)d(or)h
+(will)h(ab)r(ort)g(with)g(an)g(error)0 5177 y(message.)61
+b(This)36 b(b)r(eha)n(vior)e(is)i(con)n(trolled)f(b)n(y)g(a)h(compile)g
+(time)g(\035ag)f(\(ICAL_ERR)n(ORS_ARE_F)-9 b(A)i(T)g(AL\),)37
+b(and)f(will)0 5291 y(ab)r(ort)27 b(b)n(y)g(default.)p
+eop
+%%Page: 8 8
+8 7 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32
+b(libical)3190 b Ff(8)0 162 y Fd(5.1.2)94 b(v)-5 b(aargs)32
+b(Constructors)0 372 y Ff(There)24 b(is)g(another)g(w)n(a)n(y)f(to)i
+(create)e(complex)h(comp)r(onen)n(ts,)h(whic)n(h)f(is)h(arguably)d
+(more)i(elegan)n(t,)g(if)h(y)n(ou)f(are)g(not)g(horri\034ed)0
+485 y(b)n(y)k(v)-5 b(arargs.)35 b(The)28 b(v)-5 b(arargs)26
+b(constructor)g(in)n(terface)i(allo)n(ws)e(y)n(ou)i(to)f(create)h(in)n
+(tricate)f(comp)r(onen)n(ts)g(in)i(a)e(single)h(blo)r(c)n(k)f(of)0
+599 y(co)r(de.)37 b(Here)27 b(is)g(the)h(previous)f(examples)f(in)i
+(the)g(v)-5 b(aargs)26 b(st)n(yle.)174 830 y Fc(calendar)40
+b(=)349 943 y(icalcomponent_v)o(an)o(ew\()523 1057 y(ICAL_VCALENDAR_C)o
+(OM)o(PO)o(NEN)o(T,)523 1171 y(icalproperty_new)o(_v)o(er)o(sio)o(n\()o
+('')o(2.0)o('')o(\),)523 1284 y(icalproperty_new)o(_p)o(ro)o(did)o(\()
+741 1398 y(''-//RDU)g(Software//NONSGM)o(L)d(HandCal//EN''\),)523
+1511 y(icalcomponent_va)o(ne)o(w\()697 1625 y(ICAL_VEVENT_COMP)o(ONE)o
+(NT)o(,)697 1738 y(icalproperty_new)o(_dt)o(st)o(am)o(p\(a)o(ti)o(me)o
+(\),)697 1852 y(icalproperty_new)o(_ui)o(d\()o('')o(gui)o(d-)o(1.)o
+(hos)o(t1)o(.co)o(m')o('\))o(,)697 1966 y(icalproperty_van)o(ew_)o(or)o
+(ga)o(niz)o(er)o(\()872 2079 y(''mrbig@host.co)o(m')o('\))o(,)872
+2193 y(icalparameter_n)o(ew)o(_r)o(ole)o(\(I)o(CA)o(L_R)o(OL)o(E_C)o
+(HA)o(IR)o(\),)872 2306 y(0)872 2420 y(\),)697 2533 y(icalproperty_van)
+o(ew_)o(at)o(te)o(nde)o(e\()872 2647 y(''employee-A@ho)o(st)o(.c)o(om')
+o(',)872 2761 y(icalparameter_n)o(ew)o(_r)o(ole)o(\()1046
+2874 y(ICAL_ROLE_REQPA)o(RTI)o(CI)o(PA)o(NT\))o(,)872
+2988 y(icalparameter_n)o(ew)o(_r)o(svp)o(\(1)o(\),)872
+3101 y(icalparameter_n)o(ew)o(_c)o(uty)o(pe)o(\(I)o(CAL)o(_C)o(UTY)o
+(PE)o(_G)o(ROU)o(P\))o(,)872 3215 y(0)872 3328 y(\),)697
+3442 y(icalproperty_new)o(_lo)o(ca)o(ti)o(on\()828 3556
+y(1CP)42 b(Conference)e(Room)h(4350\),)697 3669 y(0)697
+3783 y(\),)523 3896 y(0)523 4010 y(\);)0 4241 y Ff(This)30
+b(form)f(is)h(similar)f(to)h(the)g(constructor)f(form)g(,)i(except)f
+(that)g(the)g(constructors)e(ha)n(v)n(e)h("v)-5 b(anew")29
+b(instead)g(of)h("new")0 4354 y(in)38 b(the)f(name.)66
+b(The)37 b(argumen)n(ts)f(are)h(similar)f(to)r(o,)k(except)d(that)g
+(the)h(comp)r(onen)n(t)f(constructor)f(can)h(ha)n(v)n(e)f(a)h(list)g
+(of)0 4468 y(prop)r(erties,)26 b(and)i(the)f(prop)r(ert)n(y)g
+(constructor)e(can)i(ha)n(v)n(e)g(a)g(list)g(of)h(parameters.)35
+b(Be)27 b(sure)f(to)i(terminate)f(ev)n(ery)f(list)i(with)0
+4582 y(a)f('0',)h(or)e(y)n(our)g(co)r(de)i(will)g(crash,)e(if)i(y)n(ou)
+f(are)g(luc)n(ky)-7 b(.)0 4853 y Fd(5.1.3)94 b(P)m(arsing)32
+b(T)-8 b(ext)32 b(Files)0 5063 y Ff(The)g(\034nal)g(w)n(a)n(y)f(to)h
+(create)f(comp)r(onen)n(ts)h(will)g(probably)f(b)r(e)h(the)h(most)f
+(common;)i(y)n(ou)d(can)h(create)f(comp)r(onen)n(ts)g(from)0
+5176 y(RF)n(C2445)26 b(complian)n(t)h(text.)37 b(If)28
+b(y)n(ou)f(ha)n(v)n(e)f(the)i(string)f(in)h(memory)-7
+b(,)26 b(use)0 5407 y Fc(icalcomponent*)38 b(icalparser_pars)o(e_)o
+(str)o(in)o(g\()o(cha)o(r*)f(str\);)p eop
+%%Page: 9 9
+9 8 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32
+b(libical)3190 b Ff(9)0 162 y(If)38 b(the)g(string)f(con)n(tains)f
+(only)h(one)h(comp)r(onen)n(t,)h(the)f(parser)e(will)i(return)f(the)h
+(comp)r(onen)n(t)f(in)h(libical)f(form.)67 b(If)38 b(the)0
+275 y(string)45 b(con)n(tains)g(m)n(ultiple)h(comp)r(onen)n(ts,)k(the)c
+(m)n(ultiple)g(comp)r(onen)n(ts)f(will)h(b)r(e)g(returned)f(as)g(the)h
+(c)n(hildren)g(of)f(an)0 389 y(ICAL_XR)n(OOT_COMPONENT)26
+b(comp)r(onen)n(t.)0 545 y(P)n(arsing)h(a)h(whole)g(string)f(ma)n(y)h
+(seem)g(w)n(asteful)f(if)i(y)n(ou)f(w)n(an)n(t)f(to)h(pull)h(a)f(large)
+e(comp)r(onen)n(t)i(o\033)h(of)f(the)g(net)n(w)n(ork)f(or)g(from)0
+659 y(a)g(\034le;)h(y)n(ou)f(ma)n(y)g(prefer)g(to)g(parse)f(the)i(comp)
+r(onen)n(t)g(line)f(b)n(y)h(line.)37 b(This)27 b(is)h(p)r(ossible)f(to)
+r(o)g(b)n(y)g(using:)0 898 y Fc(icalparser*)39 b(icalparser_new\(\))o
+(;)0 1012 y(void)j(icalparser_free\()o(ic)o(al)o(par)o(se)o(r*)37
+b(parser\);)0 1125 y(icalparser_get_l)o(in)o(e\(p)o(ar)o(se)o(r,r)o(ea)
+o(d_)o(str)o(ea)o(m\))o(;)0 1239 y(icalparser_add_l)o(in)o(e\(p)o(ar)o
+(se)o(r,l)o(in)o(e\))o(;)0 1353 y(icalparser_set_g)o(en)o(_da)o(ta)o
+(\(p)o(ars)o(er)o(,s)o(tre)o(am)o(\))0 1592 y Ff(These)21
+b(routines)f(will)i(construct)f(a)f(parser)g(ob)5 b(ject)21
+b(to)g(whic)n(h)g(y)n(ou)g(can)g(add)g(lines)g(of)g(input)h(and)f
+(retriev)n(e)f(an)n(y)h(comp)r(onen)n(ts)0 1705 y(that)32
+b(the)g(parser)f(creates)f(from)i(the)g(input.)51 b(These)31
+b(routines)g(w)n(ork)g(b)n(y)g(sp)r(eci\034ng)h(an)g(adaptor)e(routine)
+h(to)h(get)g(string)0 1819 y(data)27 b(from)g(a)g(source.)36
+b(F)-7 b(or)27 b(an)g(example:)0 2058 y Fc(char*)41 b
+(read_stream\(char)c(*s,)43 b(size_t)e(size,)g(void)h(*d\))87
+2286 y(char)g(*c)h(=)g(fgets\(s,size,)38 b(\(FILE*\)d\);)87
+2399 y(return)j(c;)0 2626 y(main\(\))87 2740 y(char*)h(line;)87
+2853 y(icalcomponent)c(*c;)87 2967 y(icalparser)h(*parser)i(=)i
+(icalparser_new\(\))o(;)87 3081 y(FILE*)f(stream)f(=)i
+(fopen\(argv1,r\);)87 3194 y(icalparser_set_g)o(en_)o(da)o(ta)o(\(pa)o
+(rs)o(er)o(,st)o(re)o(am)o(\);)87 3308 y(do)174 3421
+y(line)f(=)h(icalparser_get_li)o(ne)o(\(p)o(ars)o(er)o(,r)o(ead)o(_s)o
+(tr)o(eam)o(\);)174 3535 y(c)g(=)h(icalparser_add_)o(li)o(ne\()o(pa)o
+(rs)o(er,)o(li)o(ne)o(\);)174 3648 y(if)f(\(c)g(!=)f(0\))218
+3762 y(printf\(s,icalcom)o(po)o(ne)o(nt_)o(as)o(_i)o(cal)o(_s)o(tr)o
+(ing)o(\(c)o(\)\))o(;)218 3876 y(icalparser_claim)o(\(p)o(ar)o(ser)o
+(\);)218 3989 y(printf\(n--------)o(--)o(--)o(---)o(n\))o(;)218
+4103 y(icalcomponent_fr)o(ee)o(\(c)o(\);)131 4330 y(while)f(\()i(line)f
+(!=)h(0\);)0 4569 y Ff(The)48 b(parser)f(ob)5 b(ject)48
+b(parameterizes)f(the)i(routine)f(used)g(to)g(get)h(input)g(lines)f
+(with)h(icalparser_set_gen_data\(\))0 4683 y
+(andicalparser_get_line\(\).)81 b(In)44 b(this)f(example,)k(the)d
+(routine)f(read_stream\(\))e(will)j(fetc)n(h)g(the)f(next)h(line)g
+(from)e(a)0 4796 y(stream,)51 b(with)d(the)f(stream)g(passed)f(in)h(as)
+g(the)g(v)n(oid*)f(parameter)f(d.)96 b(The)47 b(parser)f(calls)g
+(read_stream\(\))f(from)0 4910 y(icalparser_get_line\(\),)e(but)g(it)g
+(also)e(needs)h(to)h(kno)n(w)e(what)h(stream)g(to)g(use.)81
+b(This)42 b(is)h(set)f(b)n(y)g(the)h(call)f(to)g(ical-)0
+5024 y(parser_set_gen_data\(\).)64 b(By)37 b(using)g(a)h(di\033eren)n
+(t)f(routine)h(for)f(read_stream)e(or)i(passing)g(in)h(di\033eren)n(t)f
+(data)h(with)0 5137 y(icalparser_set_gen_data,)23 b(y)n(ou)k(can)g
+(connect)g(to)h(an)n(y)e(data)i(source.)0 5294 y(Using)g(the)h(same)e
+(mec)n(hanism,)h(other)g(implemen)n(tations)g(could)g(read)f(from)h
+(memory)g(bu\033ers,)g(so)r(c)n(k)n(ets)f(or)g(other)h(in)n(ter-)0
+5407 y(faces.)p eop
+%%Page: 10 10
+10 9 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32
+b(libical)3149 b Ff(10)0 162 y(Since)28 b(the)g(example)f(co)r(de)g(is)
+h(a)f(v)n(ery)f(common)h(w)n(a)n(y)f(to)i(use)f(the)h(parser,)e(there)i
+(is)f(a)g(con)n(v)n(enience)f(routine;)0 401 y Fc(icalcomponent*)38
+b(icalparser_pars)o(e\()o(ica)o(lp)o(ar)o(ser)f(*parser,)654
+515 y(char*)k(\(*line_gen_func\))o(\(c)o(har)c(*s,)42
+b(size_t)f(size,)85 b(void*)42 b(d\)\))0 754 y Ff(T)-7
+b(o)36 b(use)h(this)g(routine,)i(y)n(ou)d(still)h(m)n(ust)g(construct)f
+(the)h(parser)f(ob)5 b(ject)36 b(and)h(pass)f(in)h(a)f(reference)g(to)h
+(a)f(line)h(reading)0 868 y(routine.)50 b(If)33 b(the)f(parser)f(can)h
+(create)f(a)h(single)f(comp)r(onen)n(t)h(from)g(the)g(input,)i(it)f
+(will)f(return)g(a)g(p)r(oin)n(ter)g(to)g(the)g(newly)0
+981 y(constructed)h(comp)r(onen)n(t.)54 b(If)34 b(the)g(parser)e(can)h
+(construct)f(m)n(ultiple)i(comp)r(onen)n(ts)f(from)g(the)h(input,)i(it)
+e(will)g(return)e(a)0 1095 y(reference)c(to)h(an)g(XR)n(OOT)g(comp)r
+(onen)n(t)g(\()h(of)f(t)n(yp)r(e)g(ICAL_XR)n(OOT_COMPONENT.\))g(This)g
+(XR)n(OOT)f(comp)r(onen)n(t)0 1209 y(will)g(hold)f(all)h(of)f(the)h
+(comp)r(onen)n(ts)f(constructed)g(from)g(the)h(input)g(as)f(c)n
+(hildren.)0 1500 y Fb(5.2)112 b(A)m(ccessing)37 b(Comp)s(onen)m(ts)0
+1710 y Ff(Giv)n(en)30 b(a)g(reference)f(to)i(a)e(comp)r(onen)n(t,)i(y)n
+(ou)f(probably)f(will)h(w)n(an)n(t)g(to)g(access)f(the)i(prop)r
+(erties,)f(parameters)e(and)j(v)-5 b(alues)0 1824 y(inside.)56
+b(Libical)34 b(in)n(terfaces)f(let)i(y)n(ou)e(\034nd)i(sub-comp)r(onen)
+n(t,)g(add)e(and)h(remo)n(v)n(e)f(sub-comp)r(onen)n(ts,)i(and)e(do)h
+(the)h(same)0 1937 y(three)27 b(op)r(erations)g(on)g(prop)r(erties.)0
+2210 y Fd(5.2.1)94 b(Finding)30 b(Comp)s(onen)m(ts)0
+2420 y Ff(T)-7 b(o)27 b(\034nd)h(a)f(sub-comp)r(onen)n(t)g(of)h(a)f
+(comp)r(onen)n(t,)g(use:)0 2659 y Fc(icalcomponent*)38
+b(icalcomponent_g)o(et)o(_fi)o(rs)o(t_)o(com)o(po)o(ne)o(nt\()1525
+2773 y(icalcomponent*)g(component,)1525 2887 y(icalcomponent_ki)o(nd)f
+(kind\);)0 3126 y Ff(This)27 b(routine)g(will)h(return)f(a)g(reference)
+g(to)g(the)h(\034rst)f(comp)r(onen)n(t)g(of)h(the)f(t)n(yp)r(e)h
+('kind.')37 b(The)28 b(k)n(ey)e(kind)i(v)-5 b(alues,)27
+b(listed)h(in)0 3240 y(icalen)n(ums.h)f(are:)0 3479 y
+Fc(ICAL_ANY_COMPONE)o(NT)0 3593 y(ICAL_VEVENT_COMP)o(ON)o(ENT)0
+3706 y(ICAL_VTODO_COMPO)o(NE)o(NT)0 3820 y(ICAL_VJOURNAL_CO)o(MP)o(ONE)
+o(NT)0 3933 y(ICAL_VCALENDAR_C)o(OM)o(PON)o(EN)o(T)0
+4047 y(ICAL_VFREEBUSY_C)o(OM)o(PON)o(EN)o(T)0 4161 y(ICAL_VALARM_COMP)o
+(ON)o(ENT)0 4400 y Ff(These)g(are)g(only)g(the)h(most)f(common)g(comp)r
+(onen)n(ts;)g(there)h(are)e(man)n(y)h(more)g(listed)h(in)g(icalen)n
+(ums.h.)0 4557 y(As)h(y)n(ou)f(migh)n(t)h(guess,)g(if)g(there)g(is)g
+(more)f(than)h(one)f(sub)r(comp)r(onen)n(t)h(of)g(the)h(t)n(yp)r(e)f(y)
+n(ou)f(ha)n(v)n(e)g(c)n(hosen,)g(this)h(routine)g(will)0
+4670 y(return)e(only)g(the)h(\034rst.)37 b(to)27 b(get)h(at)f(the)h
+(others,)f(y)n(ou)f(need)i(to)g(iterate)f(through)f(the)i(comp)r(onen)n
+(t.)0 4943 y Fd(5.2.2)94 b(Iterating)32 b(Through)g(Comp)s(onen)m(ts)0
+5153 y Ff(Iteration)27 b(requires)f(a)h(second)g(routine)g(to)h(get)f
+(the)h(next)g(sub)r(comp)r(onen)n(t)f(after)g(the)h(\034rst:)p
+eop
+%%Page: 11 11
+11 10 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32
+b(libical)3149 b Ff(11)0 162 y Fc(icalcomponent*)38 b(icalcomponent_g)o
+(et)o(_ne)o(xt)o(_c)o(omp)o(on)o(en)o(t\()654 275 y(icalcomponent*)f
+(component,)654 389 y(icalcomponent_k)o(in)o(d)h(kind\);)0
+610 y Ff(With)25 b(the)g('\034rst')f(and)g('next')h(routines,)g(y)n(ou)
+e(can)h(create)g(a)g(for)f(lo)r(op)h(to)h(iterate)f(through)f(all)h(of)
+h(a)f(comp)r(onen)n(ts)g(sub)r(com-)0 723 y(p)r(onen)n(ts)87
+944 y Fc(for\(c)42 b(=)h(icalcomponent_g)o(et_)o(fi)o(rs)o(t_c)o(om)o
+(po)o(nen)o(t\()o(co)o(mp,)o(IC)o(AL_)o(AN)o(Y_)o(COM)o(PO)o(NE)o(NT\))
+o(;)392 1058 y(c)g(!=)g(0;)44 1171 y(c)g(=)g(icalcomponent_ge)o(t_)o
+(ne)o(xt_)o(co)o(mp)o(one)o(nt)o(\(c)o(omp)o(,I)o(CA)o(L_A)o(NY)o(_CO)o
+(MP)o(ON)o(ENT)o(\)\))261 1398 y(do_something\(c\);)0
+1619 y Ff(This)32 b(co)r(de)f(bit)h(wil)g(iterate)g(through)f(all)g(of)
+h(the)g(sub)r(comp)r(onen)n(ts)f(in)h('comp')g(but)g(y)n(ou)f(can)g
+(select)h(a)f(sp)r(eci\034c)h(t)n(yp)r(e)g(of)0 1733
+y(comp)r(onen)n(t)27 b(b)n(y)h(c)n(hanging)e(ICAL_ANY_COMPONENT)i(to)f
+(another)g(comp)r(onen)n(t)g(t)n(yp)r(e.)0 2002 y Fd(5.2.3)94
+b(Using)31 b(Comp)s(onen)m(t)f(Iterators)0 2212 y Ff(The)h(iteration)f
+(mo)r(del)h(in)h(the)f(previous)f(section)g(requires)g(the)h(comp)r
+(onen)n(t)g(to)g(k)n(eep)f(the)i(state)f(of)g(the)g(iteration.)46
+b(So,)0 2326 y(y)n(ou)32 b(could)g(not)h(use)f(this)h(mo)r(del)g(to)f
+(p)r(erform)g(a)g(sorting)f(op)r(erations,)i(since)f(y)n(ou'd)g(need)h
+(t)n(w)n(o)f(iterators)f(and)h(there)g(is)0 2440 y(only)26
+b(space)h(for)f(one.)36 b(If)27 b(y)n(ou)f(ev)n(er)g(call)h(icalcomp)r
+(onen)n(t_get_\034rst_comp)r(onen)n(t\(\))d(when)j(an)f(iteration)h(is)
+f(in)h(progress,)0 2553 y(the)h(p)r(oin)n(ter)f(will)h(b)r(e)g(reset)f
+(to)g(the)h(b)r(eginning.)0 2710 y(T)-7 b(o)28 b(solv)n(e)g(this)h
+(problem,)g(there)f(are)g(also)g(external)f(iterators)h(for)g(comp)r
+(onen)n(ts.)40 b(The)28 b(routines)g(asso)r(ciated)g(with)h(these)0
+2823 y(external)e(iterators)f(are:)0 3044 y Fc(icalcompiter)38
+b(icalcomponent_beg)o(in)o(_co)o(mp)o(on)o(ent)o(\(i)o(ca)o(lco)o(mp)o
+(one)o(nt)o(*)f(component,)j(icalcomponent_k)o(ind)d(kind\);)0
+3158 y(icalcompiter)h(icalcomponent_end)o(_c)o(omp)o(on)o(en)o(t\(i)o
+(ca)o(lc)o(omp)o(on)o(ent)o(*)f(component,)j(icalcomponent_k)o(in)o(d)e
+(kind\);)0 3271 y(icalcomponent*)g(icalcompiter_ne)o(xt)o(\(ic)o(al)o
+(co)o(mpi)o(te)o(r*)f(i\);)0 3385 y(icalcomponent*)h(icalcompiter_pr)o
+(io)o(r\(i)o(ca)o(lc)o(omp)o(it)o(er)o(*)g(i\);)0 3498
+y(icalcomponent*)g(icalcompiter_de)o(re)o(f\(i)o(ca)o(lc)o(omp)o(it)o
+(er)o(*)g(i\);)0 3719 y Ff(The)27 b(_b)r(egin_\(\))g(and)g(_end_\(\))g
+(routines)g(return)g(a)g(new)g(iterator)f(that)h(p)r(oin)n(ts)g(to)h
+(the)f(b)r(eginning)g(and)g(ending)h(of)f(the)0 3833
+y(list)36 b(of)f(sub)r(comp)r(onen)n(t)h(for)f(the)h(giv)n(en)f(comp)r
+(onen)n(t,)i(and)e(the)h(kind)g(argumen)n(t)e(w)n(orks)g(lik)n(e)h(the)
+h(kind)g(argumen)n(t)f(for)0 3946 y(in)n(ternal)27 b(iterators.)0
+4103 y(After)f(creating)e(an)h(iterators,)g(use)g(_next_\(\))g(and)h
+(_prior_\(\))e(to)h(step)h(forw)n(ard)d(and)j(bac)n(kw)n(ard)d(through)
+i(the)h(list)f(and)0 4216 y(get)30 b(the)g(comp)r(onen)n(t)g(that)g
+(the)g(iterator)e(p)r(oin)n(ts)i(to,)h(and)e(use)h(_deref\(\))g(to)g
+(return)f(the)h(comp)r(onen)n(t)g(that)g(the)g(iterator)0
+4330 y(p)r(oin)n(ts)c(to)g(without)h(mo)n(ving)e(the)i(iterator.)35
+b(All)27 b(routines)f(will)g(return)g(0)g(when)g(they)h(mo)n(v)n(e)e
+(to)h(p)r(oin)n(t)h(o\033)f(the)h(end)f(of)h(the)0 4444
+y(list.)0 4600 y(Here)g(is)h(an)f(example)g(of)h(a)f(lo)r(op)g(using)g
+(these)h(routines:)0 4821 y Fc(for\()131 4934 y(i)43
+b(=)g(icalcomponent_be)o(gi)o(n_c)o(om)o(po)o(nen)o(t\()o(im)o(pl-)o
+(cl)o(us)o(ter)o(,I)o(CAL)o(_A)o(NY)o(_CO)o(MP)o(ON)o(ENT)o(\);)131
+5048 y(icalcompiter_de)o(ref)o(\(i)o(\)!)o(=)38 b(0;)131
+5162 y(icalcompiter_ne)o(xt\()o(i\))0 5275 y(\))261 5389
+y(icalcomponent)h(*this)i(=)i(icalcompiter_der)o(ef)o(\(i\))o(;)p
+eop
+%%Page: 12 12
+12 11 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32
+b(libical)3149 b Ff(12)0 162 y Fd(5.2.4)94 b(Remo)m(ving)29
+b(Comp)s(onen)m(ts)0 372 y Ff(Remo)n(ving)40 b(an)h(elemen)n(t)g(from)g
+(a)g(list)g(while)h(iterating)e(through)h(the)g(list)h(with)f(the)h(in)
+n(ternal)e(iterators)g(can)h(cause)0 485 y(problems,)20
+b(since)e(y)n(ou)g(will)h(probably)e(b)r(e)i(remo)n(ving)e(the)i
+(elemen)n(t)g(that)g(the)g(in)n(ternal)f(iterator)f(p)r(oin)n(ts)h(to.)
+34 b(The)19 b(_remo)n(v)n(e\(\))0 599 y(routine)24 b(will)g(k)n(eep)f
+(the)i(iterator)d(v)-5 b(alid)24 b(b)n(y)g(mo)n(ving)f(it)h(to)g(the)h
+(next)f(comp)r(onen)n(t,)g(but)h(in)f(a)g(normal)f(lo)r(op,)h(this)g
+(will)g(result)0 712 y(in)k(t)n(w)n(o)f(adv)-5 b(ances)26
+b(p)r(er)i(iteration,)e(and)i(y)n(ou)f(will)g(remo)n(v)n(e)f(only)h(ev)
+n(ery)f(other)h(comp)r(onen)n(t.)37 b(T)-7 b(o)27 b(a)n(v)n(oid)f(the)i
+(problem,)f(y)n(ou)0 826 y(will)h(need)f(to)h(step)g(the)g(iterator)e
+(ahead)h(of)g(the)h(elemen)n(t)g(y)n(ou)e(are)h(going)f(to)i(remo)n(v)n
+(e,)e(lik)n(e)h(this:)0 1066 y Fc(for\(c)41 b(=)j(icalcomponent_g)o(et)
+o(_fi)o(rs)o(t_)o(com)o(po)o(ne)o(nt\()o(pa)o(re)o(nt_)o(co)o(mp,)o(IC)
+o(AL)o(_AN)o(Y_)o(CO)o(MPO)o(NE)o(NT)o(\);)305 1179 y(c)f(!=)g(0;)305
+1293 y(c)g(=)g(next)174 1520 y(next)f(=)h(icalcomponent_get)o(_n)o(ex)o
+(t_c)o(om)o(po)o(nen)o(t\()o(pa)o(ren)o(t_)o(com)o(p,)o(IC)o(AL_)o(AN)o
+(Y_)o(COM)o(PO)o(NE)o(NT\))o(;)174 1633 y(icalcomponent_rem)o(ov)o(e_)o
+(com)o(po)o(ne)o(nt\()o(pa)o(re)o(nt_)o(co)o(mp)o(,c\))o(;)0
+1873 y Ff(Another)32 b(w)n(a)n(y)e(to)i(remo)n(v)n(e)e(comp)r(onen)n
+(ts)i(is)g(to)f(rely)h(on)f(the)i(side)f(e\033ect)g(of)g(icalcomp)r
+(onen)n(t_remo)n(v)n(e_comp)r(onen)n(t:)42 b(if)0 1986
+y(comp)r(onen)n(t)28 b(iterator)g(in)h(the)g(paren)n(t)f(comp)r(onen)n
+(t)h(is)f(p)r(oin)n(ting)h(to)g(the)g(c)n(hild)g(that)g(will)g(b)r(e)g
+(remo)n(v)n(ed,)f(it)h(will)g(mo)n(v)n(e)f(the)0 2100
+y(iterator)e(to)i(the)g(comp)r(onen)n(t)f(after)g(the)h(c)n(hild.)37
+b(The)27 b(follo)n(wing)g(co)r(de)g(will)h(exploit)f(this)h(b)r(eha)n
+(vior:)0 2340 y Fc(icalcomponent_ge)o(t_)o(fir)o(st)o(_c)o(omp)o(on)o
+(en)o(t\(p)o(ar)o(en)o(t_c)o(om)o(p,)o(ICA)o(L_)o(VEV)o(EN)o(T_)o(COM)o
+(PO)o(NE)o(NT\))o(;)0 2453 y(while\(\(c=icalcom)o(po)o(nen)o(t_)o(ge)o
+(t_c)o(ur)o(re)o(nt_)o(co)o(mp)o(one)o(nt)o(\(c)o(\)\))37
+b(!=)43 b(0)g(\))131 2567 y(if\(icalcomponen)o(t_i)o(sa)o(\(c)o(\))38
+b(==)k(ICAL_VEVENT_COMP)o(ONE)o(NT)o(\))261 2680 y(icalcomponent_rem)o
+(ov)o(e_c)o(om)o(po)o(nen)o(t\()o(pa)o(ren)o(t_)o(co)o(mp,)o(in)o(ner)o
+(\);)174 2794 y(else)261 2907 y(icalcomponent_get)o(_n)o(ext)o(_c)o(om)
+o(pon)o(en)o(t\()o(par)o(en)o(t_)o(com)o(p,)o(ICA)o(L_)o(VE)o(VEN)o(T_)
+o(CO)o(MPO)o(NE)o(NT)o(\);)0 3294 y Fd(5.2.5)94 b(W)-8
+b(orking)31 b(with)g(prop)s(erties)g(and)h(parameters)0
+3504 y Ff(Finding,)g(iterating)f(and)g(remo)n(ving)e(prop)r(erties)h(w)
+n(orks)g(the)h(same)g(as)f(it)i(do)r(es)e(for)h(comp)r(onen)n(ts,)g
+(using)g(the)h(prop)r(ert)n(y-)0 3617 y(sp)r(eci\034c)c(or)e
+(parameter-sp)r(eci\034c)g(in)n(terfaces:)0 3857 y Fc(icalproperty*)38
+b(icalcomponent_ge)o(t_)o(fir)o(st)o(_p)o(rop)o(er)o(ty)o(\()218
+3970 y(icalcomponent*)g(component,)218 4084 y(icalproperty_kin)o(d)f
+(kind\);)0 4197 y(icalproperty*)h(icalcomponent_ge)o(t_)o(nex)o(t_)o
+(pr)o(ope)o(rt)o(y\()218 4311 y(icalcomponent*)g(component,)218
+4425 y(icalproperty_kin)o(d)f(kind\);)0 4538 y(void)42
+b(icalcomponent_ad)o(d_)o(pr)o(ope)o(rt)o(y\()218 4652
+y(icalcomponent*)c(component,)218 4765 y(icalproperty*)g(property\);)0
+4879 y(void)k(icalcomponent_re)o(mo)o(ve)o(_pr)o(op)o(er)o(ty\()218
+4992 y(icalcomponent*)c(component,)218 5106 y(icalproperty*)g
+(property\);)0 5346 y Ff(F)-7 b(or)27 b(parameters:)p
+eop
+%%Page: 13 13
+13 12 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32
+b(libical)3149 b Ff(13)0 162 y Fc(icalparameter*)38 b(icalproperty_ge)o
+(t_)o(fir)o(st)o(_p)o(ara)o(me)o(te)o(r\()218 275 y(icalproperty*)g
+(prop,)218 389 y(icalparameter_ki)o(nd)f(kind\);)0 502
+y(icalparameter*)h(icalproperty_ge)o(t_)o(nex)o(t_)o(pa)o(ram)o(et)o
+(er)o(\()218 616 y(icalproperty*)g(prop,)218 730 y(icalparameter_ki)o
+(nd)f(kind\);)0 843 y(void)42 b(icalproperty_add)o(_p)o(ar)o(ame)o(te)o
+(r\()218 957 y(icalproperty*)c(prop,)218 1070 y(icalparameter*)g
+(parameter\);)0 1184 y(void)k(icalproperty_rem)o(ov)o(e_)o(par)o(am)o
+(et)o(er\()218 1297 y(icalproperty*)c(prop,)218 1411
+y(icalparameter_ki)o(nd)f(kind\);)0 1650 y Ff(Note)30
+b(that)g(since)f(there)h(should)f(b)r(e)i(only)e(one)g(parameter)f(of)i
+(eac)n(h)f(t)n(yp)r(e)h(in)g(a)f(prop)r(ert)n(y)-7 b(,)30
+b(y)n(ou)f(will)h(rarely)e(need)i(to)f(use)0 1764 y
+(icalparameter_get_nect_paameter.)0 2037 y Fd(5.2.6)94
+b(W)-8 b(orking)31 b(with)g(v)-5 b(alues)0 2247 y Ff(V)e(alues)33
+b(are)g(t)n(ypically)g(part)h(of)f(a)h(prop)r(ert)n(y)-7
+b(,)34 b(although)f(they)h(can)f(exist)h(on)f(their)h(o)n(wn.)55
+b(Y)-7 b(ou)34 b(can)f(manipulate)h(them)0 2360 y(either)27
+b(as)g(part)g(of)h(the)g(prop)r(ert)n(y)e(or)h(indep)r(enden)n(tly)-7
+b(.)0 2517 y(The)36 b(most)f(common)g(w)n(a)n(y)f(to)h(w)n(ork)f(with)i
+(v)-5 b(alues)35 b(to)h(is)f(to)g(manipulate)h(them)g(from)f(they)h
+(prop)r(erties)e(that)i(con)n(tain)0 2630 y(them.)46
+b(This)31 b(in)n(v)n(olv)n(es)d(few)n(er)i(routine)g(calls)g(and)h(in)n
+(termediate)f(v)-5 b(ariables)29 b(than)h(w)n(orking)f(with)i(them)g
+(indep)r(enden)n(tly)-7 b(,)0 2744 y(and)27 b(it)h(is)g(t)n(yp)r
+(e-safe.)0 2900 y(F)-7 b(or)26 b(eac)n(h)g(prop)r(ert)n(y)-7
+b(,)26 b(there)h(are)f(a)g(_get_)g(and)h(a)f(_set_)g(routine)h(that)g
+(access)e(the)j(in)n(ternal)e(v)-5 b(alue.)36 b(F)-7
+b(or)26 b(instanace,)h(for)0 3014 y(the)h(UID)g(prop)r(ert)n(y)-7
+b(,)27 b(the)h(routines)f(are:)0 3253 y Fc(void)42 b(icalproperty_set)o
+(_u)o(id)o(\(ic)o(al)o(pr)o(ope)o(rt)o(y*)37 b(prop,)k(const)h(char*)f
+(v\))0 3367 y(const)g(char*)h(icalproperty_get)o(_u)o(id)o(\(ic)o(al)o
+(pr)o(ope)o(rt)o(y*)37 b(prop\))0 3607 y Ff(F)-7 b(or)19
+b(m)n(ulti-v)-5 b(alued)20 b(prop)r(erties,)h(lik)n(e)f(A)-7
+b(TT)g(A)n(CH,)20 b(the)h(v)-5 b(alue)20 b(t)n(yp)r(e)g(is)g(usually)f
+(a)h(struct)g(or)f(union)h(that)g(holds)g(b)r(oth)g(p)r(ossible)0
+3720 y(t)n(yp)r(es.)0 3877 y(If)28 b(y)n(ou)f(w)n(an)n(t)g(to)g(w)n
+(ork)f(with)i(the)g(underlying)f(v)-5 b(alue)28 b(ob)5
+b(ject,)27 b(y)n(ou)g(can)g(get)g(and)h(set)f(it)h(with:)0
+4116 y Fc(icalvalue*)39 b(icalproperty_get_)o(va)o(lu)o(e)f
+(\(icalproperty*)f(prop\))0 4230 y(void)42 b(icalproperty_set)o(_v)o
+(al)o(ue\()o(ic)o(al)o(pro)o(pe)o(rt)o(y*)37 b(prop,)42
+b(icalvalue*)d(value\);)0 4469 y Ff(Icalprop)r(ert)n(y_get_v)-5
+b(alue\(\))36 b(will)i(return)g(a)g(reference)f(that)h(y)n(ou)g(can)g
+(manipulate)g(with)h(other)e(icalv)-5 b(alue)38 b(routines.)0
+4583 y(Most)30 b(of)h(the)g(time,)g(y)n(ou)f(will)h(ha)n(v)n(e)e(to)i
+(kno)n(w)e(what)i(the)g(t)n(yp)r(e)f(of)h(the)g(v)-5
+b(alue)30 b(is.)46 b(F)-7 b(or)30 b(instance,)g(if)i(y)n(ou)d(kno)n(w)h
+(that)h(the)0 4696 y(v)-5 b(alue)27 b(is)h(a)f(D)n(A)-7
+b(TETIME)29 b(t)n(yp)r(e,)f(y)n(ou)f(can)g(manipulate)g(it)h(with:)0
+4936 y Fc(struct)41 b(icaltimetype)e(icalvalue_get_d)o(at)o(et)o(ime)o
+(\(i)o(ca)o(lva)o(lu)o(e*)e(value\);)0 5049 y(void)42
+b(icalvalue_set_da)o(te)o(ti)o(me\()o(ic)o(al)o(val)o(ue)o(*)37
+b(value,)k(struct)h(icaltimetype)c(v\);)0 5289 y Ff(When)21
+b(w)n(orking)e(with)i(an)f(extension)g(prop)r(ert)n(y)f(or)h(v)-5
+b(alue)20 b(\(and)h(X-PR)n(OPER)-7 b(TY)21 b(or)f(a)g(prop)r(ert)n(y)f
+(that)i(has)f(the)h(parameter)0 5402 y(V)-9 b(ALUE=x-name)27
+b(\))h(the)g(v)-5 b(alue)28 b(t)n(yp)r(e)f(is)h(alw)n(a)n(ys)d(a)j
+(string.)36 b(T)-7 b(o)27 b(get)g(and)h(set)f(the)h(v)-5
+b(alue,)28 b(use:)p eop
+%%Page: 14 14
+14 13 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32
+b(libical)3149 b Ff(14)0 162 y Fc(void)42 b(icalproperty_set)o(_x)o
+(\(i)o(cal)o(pr)o(op)o(ert)o(y*)37 b(prop,)k(char*)h(v\);)0
+275 y(char*)f(icalproperty_get_)o(x\()o(ica)o(lp)o(ro)o(per)o(ty)o(*)c
+(prop\);)0 515 y Ff(All)26 b(X)g(prop)r(erties)f(ha)n(v)n(e)f(the)i(t)n
+(yp)r(e)g(of)g(ICAL_X_PR)n(OPER)-7 b(TY,)26 b(so)f(y)n(ou)g(will)h
+(need)g(these)g(routines)f(to)g(get)h(and)f(set)h(the)0
+628 y(name)h(of)h(the)g(prop)r(ert)n(y:)0 868 y Fc(char*)41
+b(icalproperty_get_)o(x_)o(nam)o(e\()o(ic)o(alp)o(ro)o(pe)o(rty)o(*)c
+(prop\))0 981 y(void)42 b(icalproperty_set)o(_x)o(_n)o(ame)o(\(i)o(ca)o
+(lpr)o(op)o(er)o(ty*)37 b(prop,)k(char*)h(name\);)0 1254
+y Fd(5.2.7)94 b(Chec)m(king)32 b(Comp)s(onen)m(t)d(V)-8
+b(alidit)m(y)0 1464 y Ff(RF)n(C)25 b(2446)e(de\034nes)j(rules)e(for)h
+(what)g(prop)r(erties)f(m)n(ust)h(exist)g(in)h(a)e(comp)r(onen)n(t)h
+(to)g(b)r(e)h(used)f(for)f(transferring)g(sc)n(heduling)0
+1578 y(data.)58 b(Most)35 b(of)g(these)g(rules)f(relate)g(to)h(the)g
+(existence)f(of)h(prop)r(erties)f(relativ)n(e)g(to)h(the)g(METHOD)h
+(prop)r(ert)n(y)-7 b(,)35 b(whic)n(h)0 1691 y(declares)22
+b(what)h(op)r(eration)f(a)h(remote)g(receiv)n(er)f(should)h(use)g(to)g
+(pro)r(cess)f(a)h(comp)r(onen)n(t.)35 b(F)-7 b(or)23
+b(instance,)h(if)g(the)f(METHOD)0 1805 y(is)36 b(REQUEST)h(and)e(the)i
+(comp)r(onen)n(t)e(is)h(a)f(VEVENT,)j(the)e(sender)f(is)h(probably)f
+(asking)f(the)j(receiv)n(er)d(to)h(join)h(in)g(a)0 1918
+y(meeting.)g(In)25 b(this)g(case,)g(RF)n(C2446)d(sa)n(ys)i(that)h(the)g
+(comp)r(onen)n(t)g(m)n(ust)g(sp)r(ecify)g(a)f(start)g(time)i(\(DTST)-7
+b(AR)g(T\))26 b(and)f(list)g(the)0 2032 y(receiv)n(er)h(as)h(an)g
+(attendee)h(\(A)-7 b(TTENDEE\).)0 2188 y(Libical)27 b(can)g(c)n(hec)n
+(k)g(these)h(restrictions)e(with)i(the)g(routine:)0 2428
+y Fc(int)42 b(icalrestriction_c)o(he)o(ck)o(\(ic)o(al)o(co)o(mpo)o(ne)o
+(nt)o(*)c(comp\);)0 2667 y Ff(This)19 b(routine)f(returns)g(0)h(if)g
+(the)g(comp)r(onen)n(t)g(do)r(es)f(not)h(pass)f(RF)n(C2446)f
+(restrictions,)i(or)f(if)h(the)g(comp)r(onen)n(t)g(is)g(malformed.)0
+2781 y(The)38 b(comp)r(onen)n(t)g(y)n(ou)f(pass)g(in)h
+Fa(must)45 b Ff(b)r(e)38 b(a)g(V)n(CALEND)n(AR,)h(with)g(one)e(or)g
+(more)h(c)n(hildren,)i(lik)n(e)d(the)i(examples)e(in)0
+2895 y(RF)n(C2446.)0 3051 y(When)28 b(this)f(routine)g(runs,)f(it)i
+(will)f(insert)g(new)g(prop)r(erties)f(in)n(to)h(the)h(comp)r(onen)n(t)
+e(to)h(indicate)h(an)n(y)e(errors)f(it)i(\034nds.)37
+b(See)0 3165 y(section)27 b(6.5.3,)f(X-LIC-ERR)n(OR)i(for)f(more)f
+(information)h(ab)r(out)h(these)f(error)f(prop)r(erties.)0
+3437 y Fd(5.2.8)94 b(Con)m(v)m(erting)32 b(Comp)s(onen)m(ts)d(to)j(T)-8
+b(ext)0 3647 y Ff(T)h(o)19 b(create)g(an)h(RF)n(C2445)e(complian)n(t)h
+(text)h(represen)n(tation)e(of)i(an)f(ob)5 b(ject,)21
+b(use)f(one)f(of)h(the)g(*_as_ical_string\(\))d(routines:)0
+3887 y Fc(char*)41 b(icalcomponent_as_)o(ic)o(al_)o(st)o(ri)o(ng)c
+(\(icalcomponent*)g(component\))0 4000 y(char*)k(icalproperty_as_i)o
+(ca)o(l_s)o(tr)o(in)o(g)d(\(icalproperty*)f(property\))0
+4114 y(char*)k(icalparameter_as_)o(ic)o(al_)o(st)o(ri)o(ng)c
+(\(icalparameter*)g(parameter\))0 4227 y(char*)k(icalvalue_as_ical)o
+(_s)o(tri)o(ng)c(\(icalvalue*)i(value\))0 4467 y Ff(In)32
+b(most)h(cases,)f(y)n(ou)f(will)i(only)f(use)g(icalcomp)r(onen)n
+(t_as_ical_string)c(\(\),)34 b(since)e(it)h(will)f(cascade)f(and)h(con)
+n(v)n(ert)f(all)h(of)0 4581 y(the)c(parameters,)e(prop)r(erties)g(and)i
+(v)-5 b(alues)27 b(that)h(are)e(attac)n(hed)h(to)h(the)g(ro)r(ot)e
+(comp)r(onen)n(t.)0 4737 y(Icalprop)r(ert)n(y_as_ical_string\(\))37
+b(will)k(terminate)g(eac)n(h)g(line)g(with)h(the)f(RF)n(C2445)f(sp)r
+(eci\034ed)h(line)h(terminator)e("n")0 4851 y(Ho)n(w)n(ev)n(er,)27
+b(if)h(y)n(ou)g(compile)g(with)h(the)f(sym)n(b)r(ol)g
+(ICAL_UNIX_NEWLINE)i(unde\034ned,)f(\()g(it)g(is)f(de\034ned)h(b)n(y)f
+(default\))h(it)0 4964 y(will)f(terminate)f(lines)h(with)g("nr")0
+5121 y(Remem)n(b)r(er)35 b(that)h(the)f(string)g(returned)f(b)n(y)h
+(these)h(routines)e(is)h(o)n(wned)g(b)n(y)g(the)h(library)-7
+b(,)36 b(and)f(will)g(ev)n(en)n(tually)f(b)r(e)i(re-)0
+5234 y(written.)h(Y)-7 b(ou)28 b(should)f(cop)n(y)g(it)h(if)g(y)n(ou)e
+(w)n(an)n(t)h(to)h(preserv)n(e)e(it.)p eop
+%%Page: 15 15
+15 14 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32
+b(libical)3149 b Ff(15)0 162 y Fb(5.3)112 b(Time)0 372
+y Fd(5.3.1)94 b(Time)30 b(structure)0 582 y Ff(LIbical)d(de\034nes)g
+(it's)g(o)n(wn)f(time)i(structure)e(for)h(storing)f(all)h(dates)f(and)h
+(times.)37 b(It)28 b(w)n(ould)e(ha)n(v)n(e)g(b)r(een)i(nice)f(to)g
+(re-use)f(the)0 695 y(C)j(library's)e Fa(struct)j(tm,)h
+Ff(but)e(that)h(structure)e(do)r(es)g(not)h(di\033eren)n(tiate)g(b)r
+(et)n(w)n(een)g(dates)f(and)h(times,)g(and)g(b)r(et)n(w)n(een)g(lo)r
+(cal)0 809 y(time)f(and)f(UTC.)h(The)g(libical)f(structure)g(is:)0
+1031 y Fc(struct)41 b(icaltimetype)87 1144 y(int)h(year;)87
+1258 y(int)g(month;)87 1371 y(int)g(day;)87 1485 y(int)g(hour;)87
+1599 y(int)g(minute;)87 1712 y(int)g(second;)87 1826
+y(int)g(is_utc;)f(/*)i(1-)g(time)e(is)i(in)g(UTC)f(timezone)e(*/)87
+1939 y(int)i(is_date;)f(/*)h(1)i(-)f(interpret)c(this)j(as)h(date.)e
+(*/)i(;)0 2161 y Ff(The)35 b(y)n(ear,)h(mon)n(th,)g(da)n(y)-7
+b(,)37 b(hour,)f(min)n(ute)f(and)g(second)g(\034elds)g(ho)n(w)f(the)h
+(brok)n(en-out)f(time)h(v)-5 b(alues.)59 b(The)35 b(is_utc)g(\034eld)0
+2275 y(distinguishes)30 b(b)r(et)n(w)n(een)h(times)g(UTC)g(and)g(a)f
+(lo)r(cal)g(time)i(zone.)45 b(The)31 b(is_date)f(\034eld)h(indicates)g
+(if)g(the)g(in)n(tra-da)n(y)e(\034elds)0 2388 y(hold)e(v)-5
+b(alid)28 b(data.)0 2658 y Fd(5.3.2)94 b(Creating)31
+b(time)f(structures)0 2868 y Ff(There)d(are)g(sev)n(eral)e(w)n(a)n(ys)h
+(to)i(create)e(a)i(new)f(icaltimet)n(yp)r(e)h(structure:)0
+3089 y Fc(struct)41 b(icaltimetype)e(icaltime_from_s)o(tr)o(in)o(g\(c)o
+(on)o(st)e(char*)42 b(str\);)0 3203 y(struct)f(icaltimetype)e
+(icaltime_from_t)o(im)o(et)o(\(ti)o(me)o(_t)e(v,)43 b(int)f(is_date\);)
+0 3317 y(struct)f(icaltimetype)e(icaltime_from_i)o(nt)o(\(i)o(nt)e(v,)
+43 b(int)f(is_date,)e(int)j(is_utc\);)0 3538 y Ff(Icaltime_from_string)
+25 b(tak)n(es)i(an)n(y)g(RF)n(C2445)e(complian)n(t)i(time)h(string:)0
+3760 y Fc(struct)41 b(icaltimetype)e(tt)j(=)h(icaltime_from_str)o(in)o
+(g\()o(199)o(70)o(101)o(T1)o(03)o(000)o(\);)0 3982 y
+Ff(Icaltime_from_timet)22 b(tak)n(es)g(a)h(timet)g(v)-5
+b(alue,)24 b(represen)n(ting)e(seconds)g(past)g(the)i(POSIX)f(ep)r(o)r
+(c)n(h,)h(and)f(a)f(\035ag)g(to)h(indicate)0 4095 y(if)k(the)f(time)g
+(is)g(a)g(date.)36 b(Dates)26 b(ha)n(v)n(e)f(an)h(iden)n(tical)f
+(structure)h(to)g(a)f(time,)i(but)g(they)f(time)h(p)r(ortion)e(\()i
+(hours,)e(min)n(uts)h(and)0 4209 y(seconds)d(\))i(is)g(alw)n(a)n(ys)d
+(00:00:00.)33 b(Dates)24 b(act)h(di\033eren)n(tly)f(in)h(sorting)e(an)h
+(comparision,)f(and)i(they)f(ha)n(v)n(e)f(a)h(di\033eren)n(t)h(string)0
+4322 y(represen)n(tation)h(in)i(RF)n(C2445.)0 4479 y(The)20
+b(icaltime_from_in)n(t)e(is)h(lik)n(e)g(icaltime_from_timet,)i(but)f
+(with)g(an)f(arbitrary)f(ep)r(o)r(c)n(h.)34 b(This)19
+b(routine)g(w)n(as)g(a)g(mistak)n(e)0 4592 y(and)27 b(is)h(deprecated.)
+0 4862 y Fd(5.3.3)94 b(Time)30 b(manipulating)f(routines)0
+5072 y Ff(The)f(n)n(ull)f(time)h(v)-5 b(alue)28 b(is)f(used)h(to)f
+(indicate)h(that)g(the)g(data)f(in)g(the)h(structure)f(is)h(not)f(a)h
+(v)-5 b(alid)27 b(time.)0 5294 y Fc(struct)41 b(icaltimetype)e
+(icaltime_null_t)o(im)o(e\()o(voi)o(d\))o(;)0 5407 y(int)j
+(icaltime_is_null_)o(ti)o(me)o(\(st)o(ru)o(ct)37 b(icaltimetype)h(t\);)
+p eop
+%%Page: 16 16
+16 15 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32
+b(libical)3149 b Ff(16)0 162 y(It)33 b(is)g(sensible)g(for)g(the)g
+(brok)n(en-out)f(time)h(\034elds)g(to)g(con)n(tain)g(v)-5
+b(alues)32 b(that)i(are)e(not)h(p)r(ermitted)h(in)f(an)g(ISO)g
+(complian)n(t)0 275 y(time)g(string.)53 b(F)-7 b(or)32
+b(instance,)i(the)g(seconds)e(\034eld)h(can)g(hold)g(v)-5
+b(alues)32 b(greater)f(than)j(59,)f(and)g(the)g(hours)f(\034eld)i(can)e
+(hold)0 389 y(v)-5 b(alues)29 b(larger)e(than)j(24.)41
+b(The)29 b(excessiv)n(e)f(v)-5 b(alues)29 b(will)g(b)r(e)h(rolled)e(o)n
+(v)n(er)g(in)n(to)h(the)g(next)h(larger)d(\034eld)j(when)f(the)h
+(structure)0 502 y(is)d(normalized.)0 712 y Fc(struct)41
+b(icaltimetype)e(icaltime_normal)o(iz)o(e\()o(str)o(uc)o(t)e
+(icaltimetype)i(t\);)0 921 y Ff(Normalizing)26 b(allo)n(ws)g(y)n(ou)h
+(to)h(do)f(arithmetic)g(op)r(erations)g(on)g(time)h(v)-5
+b(alues.)0 1130 y Fc(struct)41 b(icaltimetype)e(tt)j(=)h
+(icaltime_from_str)o(in)o(g\()o("19)o(97)o(010)o(1T)o(10)o(300)o(0")o
+(\);)0 1244 y(tt.days)e(+=3)0 1357 y(tt.second)f(+=)i(70;)0
+1471 y(tt)h(=)g(icaltime_normali)o(ze)o(\(t)o(t\);)0
+1680 y Ff(There)27 b(are)g(sev)n(eral)e(routines)i(to)h(get)f(the)h(da)
+n(y)f(of)g(the)h(w)n(eek)f(or)g(mon)n(th,)g(etc,)h(from)f(a)h(time)g
+(structure.)0 1889 y Fc(short)41 b(icaltime_day_of_y)o(ea)o(r\(s)o(tr)o
+(uc)o(t)d(icaltimetype)g(t\);)0 2003 y(struct)j(icaltimetype)e
+(icaltime_from_d)o(ay)o(_o)o(f_y)o(ea)o(r\()o(sho)o(rt)e(doy,)42
+b(short)f(year\);)0 2117 y(short)g(icaltime_day_of_w)o(ee)o(k\(s)o(tr)o
+(uc)o(t)d(icaltimetype)g(t\);)0 2230 y(short)j(icaltime_start_do)o(y_)o
+(of_)o(we)o(ek)o(\(st)o(ru)o(ct)c(icaltimetype)i(t\);)0
+2344 y(short)i(icaltime_week_num)o(be)o(r\(s)o(ho)o(rt)c(day_of_month,)
+h(short)k(month,)f(short)g(year\);)0 2457 y(struct)g(icaltimetype)e
+(icaltime_from_w)o(ee)o(k_)o(num)o(be)o(r\()o(sho)o(rt)e(week_number,)h
+(short)k(year\);)0 2571 y(short)f(icaltime_days_in_)o(mo)o(nth)o(\(s)o
+(ho)o(rt)c(month,short)i(year\);)0 2780 y Ff(T)-7 b(w)n(o)37
+b(routines)g(con)n(v)n(ert)g(time)h(structures)f(to)h(and)f(from)h(the)
+g(n)n(um)n(b)r(er)g(of)f(seconds)g(since)h(the)g(POSIX)g(ep)r(o)r(c)n
+(h.)68 b(The)0 2894 y(is_date)27 b(\034eld)h(indicates)f(whether)g(or)g
+(not)h(the)g(hour,)e(min)n(ute)i(and)g(second)f(\034elds)g(should)h(b)r
+(e)g(used)f(in)h(the)g(con)n(v)n(ersion.)0 3103 y Fc(struct)41
+b(icaltimetype)e(icaltime_from_t)o(im)o(et)o(\(ti)o(me)o(_t)e(v,)43
+b(int)f(is_date\);)0 3217 y(time_t)f(icaltime_as_time)o(t\()o(str)o(uc)
+o(t)c(icaltimetype\);)0 3426 y Ff(The)28 b(compare)e(routine)h(w)n
+(orks)f(exactly)h(lik)n(e)g(strcmp,)g(but)h(on)g(time)g(structures.)0
+3635 y Fc(int)42 b(icaltime_compare\()o(st)o(ru)o(ct)37
+b(icaltimetype)i(a,struct)h(icaltimetype)e(b\);)0 3844
+y Ff(The)d(follo)n(wing)e(routines)h(con)n(v)n(ert)g(b)r(et)n(w)n(een)g
+(UTC)h(and)g(a)f(named)h(timezone.)58 b(The)35 b(tzid)g(\034eld)g(m)n
+(ust)g(b)r(e)g(a)f(timezone)0 3958 y(name)27 b(from)h(the)f(Olsen)h
+(database,)e(suc)n(h)h(as)g("America/Los_Angeles.")0
+4114 y(The)h(utc_o\033set)f(routine)g(returns)g(the)h(o\033set)f(of)h
+(the)g(named)f(time)h(zone)f(from)h(UTC,)f(in)h(seconds.)0
+4271 y(The)f(tt)g(parameter)e(in)i(the)g(follo)n(wing)e(routines)h
+(indicates)h(the)g(date)f(on)h(whic)n(h)f(the)h(con)n(v)n(ersion)d
+(should)j(b)r(e)g(made.)36 b(The)0 4384 y(tt)23 b(parameter)e(is)h
+(necessary)f(b)r(ecause)h(timezones)g(ha)n(v)n(e)f(man)n(y)g
+(di\033eren)n(t)i(rules)f(for)g(when)g(da)n(yligh)n(t)f(sa)n(vings)g
+(time)i(is)f(used,)0 4498 y(and)27 b(these)h(rules)f(can)g(c)n(hange)f
+(o)n(v)n(er)g(time.)37 b(So,)27 b(for)g(a)g(single)g(timezone)g(one)g
+(y)n(ear)f(ma)n(y)h(ha)n(v)n(e)f(da)n(yligh)n(t)h(sa)n(vings)e(time)j
+(on)0 4612 y(Marc)n(h)f(15,)f(but)j(for)e(other)g(y)n(ears)f(Marc)n(h)g
+(15)h(ma)n(y)g(b)r(e)h(standard)f(time,)h(and)f(some)g(y)n(ears)f(ma)n
+(y)h(ha)n(v)n(e)g(standard)f(time)i(all)0 4725 y(y)n(ear.)0
+4934 y Fc(int)42 b(icaltime_utc_offs)o(et)o(\(s)o(tru)o(ct)37
+b(icaltimetype)h(tt,)43 b(char*)e(tzid\);)0 5048 y(int)h
+(icaltime_local_ut)o(c_)o(of)o(fse)o(t\()o(\);)0 5162
+y(struct)f(icaltimetype)e(icaltime_as_utc)o(\(s)o(tr)o(uct)e
+(icaltimetype)h(tt,char*)i(tzid\);)0 5275 y(struct)h(icaltimetype)e
+(icaltime_as_zon)o(e\()o(st)o(ruc)o(t)e(icaltimetype)i(tt,char*)h
+(tzid\);)0 5389 y(struct)h(icaltimetype)e(icaltime_as_loc)o(al)o(\(s)o
+(tru)o(ct)e(icaltimetype)h(tt\);)p eop
+%%Page: 17 17
+17 16 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32
+b(libical)3149 b Ff(17)0 162 y Fb(5.4)112 b(Storing)37
+b(Ob)6 b(jects)0 372 y Ff(The)31 b(libical)f(distribution)h(includes)g
+(a)f(separate)f(library)-7 b(,)30 b(libicalss,)h(that)g(allo)n(ws)e(y)n
+(ou)h(to)g(store)g(iCal)g(comp)r(onen)n(t)h(data)0 485
+y(to)f(disk)g(in)h(a)f(v)-5 b(ariet)n(y)29 b(of)i(w)n(a)n(ys.)43
+b(This)30 b(library)f(also)h(includes)g(co)r(de)g(to)g(implemen)n(t)h
+(the)g(CSTP)g(proto)r(col)e(of)h(CAP)h(and)0 599 y(has)c(some)g
+(routines)g(for)g(deciphering)g(incomming)g(messages.)0
+755 y(The)f(\034le)h(storage)e(routines)g(are)h(organized)e(in)j(an)f
+(inheritance)g(heirarc)n(h)n(y)f(that)h(is)h(ro)r(oted)e(in)i(icalset,)
+f(with)h(the)g(deriv)n(ed)0 869 y(class)k(ical\034leset)g(and)h
+(icaldirset.)48 b(Ical\034leset)32 b(stores)e(comp)r(onen)n(ts)h(to)h
+(a)g(\034le,)h(while)f(icaldirset)e(stores)h(comp)r(onen)n(ts)g(to)0
+983 y(m)n(ultiple)c(\034les,)f(one)g(p)r(er)g(mon)n(th)g(based)g(on)g
+(DTST)-7 b(AMP)g(.)28 b(Other)e(storages)e(classess,)h(for)g(storage)g
+(to)h(a)g(heap)g(or)f(a)h(m)n(ysql)0 1096 y(database)g(are)h(planned)g
+(for)g(the)h(future.)0 1253 y(All)g(of)g(the)g(icalset)f(deriv)n(ed)f
+(classes)h(ha)n(v)n(e)f(the)i(same)f(in)n(terface:)0
+1579 y Fc(icaldirset*)39 b(icaldirset_new\(c)o(on)o(st)e(char*)k
+(path\);)0 1693 y(void)h(icaldirset_free\()o(ic)o(al)o(dir)o(se)o(t*)37
+b(store\);)0 1806 y(const)k(char*)h(icaldirset_path\()o(ic)o(al)o(dir)o
+(se)o(t*)37 b(store\);)0 1920 y(void)42 b(icaldirset_mark\()o(ic)o(al)o
+(dir)o(se)o(t*)37 b(store\);)0 2033 y(icalerrorenum)h(icaldirset_commi)
+o(t\()o(ica)o(ld)o(ir)o(set)o(*)f(store\);)0 2147 y(icalerrorenum)h
+(icaldirset_add_c)o(om)o(pon)o(en)o(t\()o(ica)o(ld)o(ir)o(set)o(*)f
+(store,)k(icalcomponent*)d(comp\);)0 2260 y(icalerrorenum)g
+(icaldirset_remov)o(e_)o(com)o(po)o(ne)o(nt\()o(ic)o(al)o(dir)o(se)o
+(t*)f(store,)k(icalcomponent*)d(comp\);)0 2374 y(int)k
+(icaldirset_count_)o(co)o(mp)o(one)o(nt)o(s\()o(ica)o(ld)o(ir)o(set)o
+(*)37 b(store,)k(icalcomponent_kin)o(d)c(kind\);)0 2488
+y(icalerrorenum)h(icaldirset_selec)o(t\()o(ica)o(ld)o(ir)o(set)o(*)f
+(store,)k(icalcomponent*)d(gauge\);)0 2601 y(void)k(icaldirset_clear)o
+(\(i)o(ca)o(ldi)o(rs)o(et)o(*)c(store\);)0 2715 y(icalcomponent*)g
+(icaldirset_fetc)o(h\()o(ica)o(ld)o(ir)o(set)o(*)f(store,)k(const)h
+(char*)f(uid\);)0 2828 y(int)h(icaldirset_has_ui)o(d\()o(ic)o(ald)o(ir)
+o(se)o(t*)37 b(store,)k(const)h(char*)f(uid\);)0 2942
+y(icalcomponent*)d(icaldirset_fetc)o(h_)o(mat)o(ch)o(\(i)o(cal)o(di)o
+(rs)o(et*)f(set,)42 b(icalcomponent)c(*c\);)0 3055 y(icalerrorenum)g
+(icaldirset_modif)o(y\()o(ica)o(ld)o(ir)o(set)o(*)f(store,)k
+(icalcomponent)d(*oldc,)j(icalcomponent)e(*newc\);)0
+3169 y(icalcomponent*)f(icaldirset_get_)o(cu)o(rre)o(nt)o(_c)o(omp)o
+(on)o(en)o(t\(i)o(ca)o(ldi)o(rs)o(et)o(*)g(store\);)0
+3283 y(icalcomponent*)g(icaldirset_get_)o(fi)o(rst)o(_c)o(om)o(pon)o
+(en)o(t\()o(ica)o(ld)o(irs)o(et)o(*)f(store\);)0 3396
+y(icalcomponent*)h(icaldirset_get_)o(ne)o(xt_)o(co)o(mp)o(one)o(nt)o
+(\(i)o(cal)o(di)o(rse)o(t*)f(store\);)0 3664 y Fd(5.4.1)94
+b(Creating)31 b(a)h(new)g(set)0 3874 y Ff(Y)-7 b(ou)28
+b(can)f(create)f(a)i(new)f(set)h(from)f(either)g(the)h(base)f(class)g
+(or)g(the)g(direv)n(ed)g(class.)36 b(F)-7 b(rom)27 b(the)h(base)f
+(class)g(use)g(one)g(of:)0 4087 y Fc(icalset*)40 b(icalset_new_file)o
+(\(co)o(ns)o(t)d(char*)42 b(path\);)0 4201 y(icalset*)e
+(icalset_new_dir\()o(con)o(st)d(char*)k(path\);)0 4314
+y(icalset*)f(icalset_new_heap)o(\(vo)o(id)o(\);)0 4428
+y(icalset*)g(icalset_new_mysq)o(l\(c)o(on)o(st)d(char*)k(path\);)0
+4641 y Ff(Y)-7 b(ou)28 b(can)f(also)f(create)h(a)g(new)h(set)f(based)g
+(on)h(the)f(deriv)n(ed)g(class,)g(F)-7 b(or)27 b(instance,)g(with)h
+(ical\034leset:)0 4854 y Fc(icalfileset*)38 b(icalfileset_new\(c)o(on)o
+(st)f(char*)42 b(path\);)0 4967 y(icalfileset*)c(icalfileset_new_o)o
+(pe)o(n\(c)o(on)o(st)f(char*)k(path,)h(int)g(flags,)f(mode_t)g(mode\);)
+0 5180 y Ff(Icaset_new_\034le)33 b(is)h(iden)n(tical)g(to)g
+(ical\034leset_new.)55 b(BOth)34 b(routines)g(will)g(op)r(en)g(an)g
+(existing)g(\034le)g(for)g(readinga)e(and)0 5294 y(writing,)24
+b(or)e(create)g(a)h(new)g(\034le)g(if)h(it)f(do)r(es)g(not)g(exist.)35
+b(Ical\034lset_new_op)r(en)22 b(tak)n(es)g(the)h(same)g(argumen)n(ts)f
+(as)g(the)i(op)r(en\(\))0 5407 y(system)j(routine)g(and)h(b)r(eha)n(v)n
+(es)e(in)i(the)g(same)f(w)n(a)n(y)-7 b(.)p eop
+%%Page: 18 18
+18 17 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32
+b(libical)3149 b Ff(18)0 162 y(The)29 b(icalset)g(and)g(ical\034lset)g
+(ob)5 b(jects)29 b(are)f(somewhat)h(in)n(terc)n(hangable)e(\025)i(y)n
+(ou)f(can)h(use)g(an)g(ical\034leset*)g(as)f(an)h(argumen)n(t)0
+275 y(to)e(an)n(y)g(of)h(the)g(icalset)f(routines.)0
+432 y(The)d(follo)n(wing)f(examples)h(will)g(all)g(use)g(ical\034leset)
+g(routines;)g(using)g(the)h(other)e(icalset)h(deriv)n(ed)f(classess)g
+(will)h(b)r(e)h(similar.)0 704 y Fd(5.4.2)94 b(A)m(dding,)31
+b(Finding)g(and)h(Remo)m(ving)d(Comp)s(onen)m(ts)0 914
+y Ff(T)-7 b(o)27 b(add)h(comp)r(onen)n(ts)f(to)g(a)g(set,)h(use:)0
+1154 y Fc(icalerrorenum)38 b(icalfileset_add_)o(co)o(mpo)o(ne)o(nt)o
+(\(ic)o(al)o(fi)o(les)o(et)o(*)g(cluster,)i(icalcomponent*)d(child\);)0
+1393 y Ff(The)k(\034leset)h(k)n(eeps)e(an)h(inmemory)g(cop)n(y)f(of)h
+(the)h(comp)r(onen)n(ts,)i(and)d(this)g(set)h(m)n(ust)f(b)r(e)g
+(written)h(bac)n(k)e(to)h(the)h(\034le)0 1507 y(o)r(cassionally)-7
+b(.)35 b(There)27 b(are)f(t)n(w)n(o)h(routines)g(to)g(manage)g(this:)0
+1746 y Fc(void)42 b(icalfileset_mark)o(\(i)o(ca)o(lfi)o(le)o(se)o(t*)37
+b(cluster\);)0 1860 y(icalerrorenum)h(icalfileset_comm)o(it)o(\(ic)o
+(al)o(fi)o(les)o(et)o(*)f(cluster\);)0 2099 y Ff(Ical\034leset_mark)d
+(indicates)i(that)h(the)g(in-memory)e(comp)r(onen)n(ts)h(ha)n(v)n(e)f
+(c)n(hanged.)62 b(Calling)36 b(the)h(_add_comp)r(onen)n(t)0
+2212 y(routine)32 b(will)h(call)f(_mark)f(automatically)-7
+b(,)33 b(but)g(y)n(ou)f(ma)n(y)g(need)h(to)f(call)h(it)g(y)n(ourself)e
+(if)i(y)n(ou)f(ha)n(v)n(e)f(made)i(a)f(c)n(hange)f(to)0
+2326 y(an)g(existing)h(comp)r(onen)n(t.)49 b(The)32 b(_commit)f
+(routine)g(writes)h(the)g(data)f(base)g(to)h(disk,)g(but)h(only)e(if)h
+(it)g(is)g(mark)n(ed.)48 b(The)0 2440 y(_commit)27 b(routine)g(is)h
+(called)f(automatically)f(when)i(the)g(ical\034leset)f(is)h(freed.)0
+2596 y(T)-7 b(o)27 b(iterate)g(through)g(the)h(comp)r(onen)n(ts)f(in)h
+(a)f(set,)h(use:)0 2835 y Fc(icalcomponent*)38 b(icalfileset_get)o(_f)o
+(irs)o(t_)o(co)o(mpo)o(ne)o(nt)o(\(ic)o(al)o(fil)o(es)o(et)o(*)g
+(cluster\);)0 2949 y(icalcomponent*)g(icalfileset_get)o(_n)o(ext)o(_c)o
+(om)o(pon)o(en)o(t\()o(ica)o(lf)o(ile)o(se)o(t*)f(cluster\);)0
+3063 y(icalcomponent*)h(icalfileset_get)o(_c)o(urr)o(en)o(t_)o(com)o
+(po)o(ne)o(nt)f(\(icalfileset*)h(cluster\);)0 3302 y
+Ff(These)25 b(routines)g(w)n(ork)g(lik)n(e)g(the)h(corresp)r(onding)e
+(routines)h(from)g(icalcomp)r(onen)n(t,)g(except)h(that)g(their)f
+(output)i(is)e(\034ltered)0 3415 y(through)j(a)h(gauge.)39
+b(A)29 b(gauge)f(is)h(a)f(test)h(for)g(the)g(prop)r(erties)f(within)h
+(a)g(comp)r(onen)n(ts;)g(only)f(comp)r(onen)n(ts)g(that)i(pass)e(the)0
+3529 y(test)g(are)e(returned.)37 b(A)28 b(gauge)e(can)h(b)r(e)h
+(constructed)f(from)g(a)g(MINSQL)h(string)f(with:)0 3768
+y Fc(icalgauge*)39 b(icalgauge_new_fro)o(m_)o(sq)o(l\(c)o(ha)o(r*)e
+(sql\);)0 4008 y Ff(Then,)28 b(y)n(ou)f(can)g(add)g(the)h(gauge)e(to)i
+(the)g(set)f(with)h(:)0 4247 y Fc(icalerrorenum)38 b(icalfileset_sele)o
+(ct)o(\(ic)o(al)o(fi)o(les)o(et)o(*)f(store,)42 b(icalgauge*)d
+(gauge\);)0 4486 y Ff(Here)27 b(is)h(an)f(example)g(that)h(puts)g(all)f
+(of)h(these)f(routines)g(together:)0 4726 y Fc(void)42
+b(test_fileset\(\))174 4953 y(icalfileset)d(*fs;)174
+5066 y(icalcomponent)f(*c;)174 5180 y(int)43 b(i;)174
+5294 y(char)f(*path)g(=)h(test_fileset.ic)o(s;)174 5407
+y(icalgauge)84 b(*g)42 b(=)i(icalgauge_new_f)o(ro)o(m_)o(sql)o(\()p
+eop
+%%Page: 19 19
+19 18 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32
+b(libical)3149 b Ff(19)349 162 y Fc(SELECT)41 b(*)i(FROM)f(VEVENT)f
+(WHERE)g(DTSTART)84 b('20000103T120000Z)o(')37 b(AND)43
+b(DTSTART)d(=)j('20000106T120000Z)o('\))o(;)174 389 y(fs)g(=)g
+(icalfileset_new\()o(pat)o(h\))o(;)174 616 y(for)g(\(i)f(=)h(0;)g(i!=)g
+(10;)f(i++\))349 730 y(c)h(=)g(make_component\(i)o(\);)37
+b(/*)43 b(Make)e(a)j(new)e(component)e(where)h(DTSTART)g(has)h(month)f
+(of)i(i)g(*/)349 843 y(icalfileset_add)o(_c)o(omp)o(on)o(en)o(t\(f)o
+(s,)o(c\))o(;)174 1184 y(icalfileset_commi)o(t\()o(fs)o(\);)37
+b(/*)43 b(Write)e(to)i(disk)f(*/)174 1411 y(icalfileset_selec)o(t\()o
+(fs)o(,g\))o(;)37 b(/*)43 b(Set)f(the)h(gauge)e(to)i(filter)e
+(components)e(*/)174 1638 y(for)k(\(c)f(=)h(icalfileset_get_f)o(ir)o
+(st_)o(co)o(mp)o(one)o(nt)o(\(f)o(s\);)392 1752 y(c)g(!=)g(0;)392
+1865 y(c)g(=)g(icalfileset_get_n)o(ex)o(t_c)o(om)o(po)o(nen)o(t\()o(fs)
+o(\)\))349 1979 y(struct)e(icaltimetype)d(t)43 b(=)g(icalcomponent_get)
+o(_d)o(tst)o(ar)o(t\()o(c\);)349 2206 y(printf\(sn,icalt)o(im)o(e_a)o
+(s_)o(ct)o(ime)o(\(t)o(\)\))o(;)174 2433 y(icalfileset_free\()o(fs)o
+(\);)0 2706 y Fd(5.4.3)94 b(Other)31 b(routines)0 2916
+y Ff(There)c(are)g(sev)n(eral)e(other)i(routines)g(in)h(the)g(icalset)f
+(in)n(terface,)g(but)h(they)g(not)f(fully)h(implemen)n(ted)h(y)n(et.)0
+3207 y Fb(5.5)112 b(Memory)37 b(Managemen)m(t)0 3417
+y Ff(Libical)25 b(relies)f(hea)n(vily)g(on)h(dynamic)g(allo)r(cation)f
+(for)h(b)r(oth)h(the)f(core)f(ob)5 b(jects)25 b(and)g(for)f(the)i
+(strings)e(used)h(to)g(hold)g(v)-5 b(alues.)0 3531 y(Some)34
+b(of)f(this)h(memory)f(the)h(library)f(caller)g(o)n(wns)g(and)g(m)n
+(ust)h(free,)h(and)f(some)f(of)h(the)g(memory)f(is)h(managed)e(b)n(y)i
+(the)0 3645 y(library)-7 b(.)36 b(Here)27 b(is)g(a)g(summary)g(of)h
+(the)g(memory)e(rules.)0 3884 y Fd(1\))208 4031 y Ff(If)40
+b(the)h(function)g(name)g(has)f(new)g(in)h(it,)j(the)d(caller)e(gets)h
+(con)n(trol)f(of)i(the)g(memory)-7 b(.)75 b(\()40 b(suc)n(h)h(as)e
+(icalcomp)r(o-)208 4144 y(nen)n(t_new\(\),)27 b(or)g(icalprop)r(ert)n
+(y_new_clone\(\))e(\))0 4324 y Fd(2\))208 4471 y Ff(If)j(y)n(ou)g(got)g
+(the)h(memory)f(from)g(a)g(routine)g(with)h(new)f(in)h(it,)g(y)n(ou)f
+(m)n(ust)h(call)f(the)h(corresp)r(onding)d(*_free)i(routine)208
+4585 y(to)f(free)g(the)h(memory)-7 b(.)36 b(\()28 b(Use)g(icalcomp)r
+(onen)n(t_free\(\))e(to)i(free)f(ob)5 b(jects)27 b(created)g(with)h
+(icalcomp)r(onen)n(t_new\(\)\))0 4765 y Fd(3\))208 4912
+y Ff(If)j(the)h(function)f(name)g(has)g(add)g(in)g(it,)i(the)f(caller)e
+(is)h(transferring)e(con)n(trol)h(of)h(the)h(memory)e(to)h(the)h
+(routine.)47 b(\()208 5025 y(icalprop)r(ert)n(y_add_parameter\(\))23
+b(\))0 5205 y Fd(4\))p eop
+%%Page: 20 20
+20 19 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32
+b(libical)3149 b Ff(20)208 162 y(If)34 b(the)g(function)g(name)g(has)f
+(remo)n(v)n(e)f(in)i(it,)i(the)e(caller)f(passes)f(in)i(a)g(p)r(oin)n
+(ter)f(to)g(an)h(ob)5 b(ject)33 b(and)h(after)f(the)h(call)208
+275 y(returns,)e(the)h(caller)e(o)n(wns)g(the)h(ob)5
+b(ject.)50 b(So,)33 b(b)r(efore)f(y)n(ou)f(call)h(icalcomp)r(onen)n
+(t_remo)n(v)n(e_prop)r(ert)n(y\(comp,fo)r(o\),)208 389
+y(y)n(ou)26 b(do)i(not)f(o)n(wn)g(fo)r(o)g(and)h(after)f(the)h(call)f
+(returns,)g(y)n(ou)g(do.)0 561 y Fd(5\))208 703 y Ff(If)d(the)g
+(routine)f(returns)g(a)g(string,)h(libical)g(o)n(wns)f(the)h(memory)f
+(and)g(will)h(put)g(it)h(on)e(a)g(ring)g(bu\033er)h(to)g(reclaim)f
+(later.)208 817 y(F)-7 b(or)32 b(example,)i(icalcomp)r(onen)n
+(t_as_ical_string\(\).)50 b(Y)-7 b(ou'd)33 b(b)r(etter)g(strdup\(\))h
+(it)g(if)f(y)n(ou)f(w)n(an)n(t)h(to)g(k)n(eep)f(it,)j(and)208
+931 y(y)n(ou)26 b(don't)i(ha)n(v)n(e)e(to)i(delete)g(it.)0
+1219 y Fb(5.6)112 b(Error)36 b(Handling)0 1429 y Ff(Libical)25
+b(has)g(sev)n(eral)e(error)h(handling)h(mec)n(hanisms)f(for)h(the)h(v)
+-5 b(arious)24 b(t)n(yp)r(es)h(of)g(programming,)f(seman)n(tic)h(and)g
+(syn)n(tactic)0 1542 y(errors)g(y)n(ou)i(ma)n(y)g(encoun)n(ter.)0
+1811 y Fd(5.6.1)94 b(Return)31 b(v)-5 b(alues)0 2022
+y Ff(Man)n(y)29 b(library)f(routines)g(signal)h(errors)e(through)h
+(their)h(return)g(v)-5 b(alues.)42 b(All)30 b(routines)e(that)i(return)
+f(a)f(p)r(oin)n(ter,)i(suc)n(h)f(as)0 2135 y(icalcomp)r(onen)n
+(t_new\(\),)36 b(will)f(return)f(0)g(\()h(zero)f(\))h(on)f(a)g(fatal)h
+(error.)56 b(Some)35 b(routines)f(will)g(return)h(a)f(v)-5
+b(alue)34 b(of)h(en)n(um)0 2249 y(icalerroren)n(um.)0
+2518 y Fd(5.6.2)94 b(icalerrno)0 2728 y Ff(Most)24 b(routines)f(will)i
+(set)f(the)g(global)f(error)f(v)-5 b(alue)24 b(icalerrno)f(on)h
+(errors.)33 b(This)24 b(v)-5 b(ariable)23 b(is)h(an)g(en)n(umeration;)g
+(p)r(ermissible)0 2841 y(v)-5 b(alues)35 b(can)f(b)r(e)h(found)h(in)f
+(libical/icalerror.h.)56 b(If)35 b(the)g(routine)g(returns)f(an)h(en)n
+(um)g(icalerroren)n(um,)f(then)h(the)h(return)0 2955
+y(v)-5 b(alue)27 b(will)h(b)r(e)f(the)h(same)f(as)f(icalerrno.)35
+b(Y)-7 b(ou)27 b(can)g(use)g(icalerror_strerror\(\))c(to)k(get)g(a)g
+(string)f(that)i(describ)r(es)e(the)i(error)0 3224 y
+Fd(5.6.3)94 b(X-LIC-ERR)m(OR)30 b(and)j(X-LIC-INV)-11
+b(ALID-COMPONENT)0 3434 y Ff(The)38 b(library)f(handles)g(seman)n(tic)g
+(and)h(syn)n(tactic)f(errors)f(in)i(comp)r(onen)n(ts)g(b)n(y)f
+(inserting)g(errors)f(prop)r(erties)h(in)n(to)h(the)0
+3548 y(comp)r(onen)n(ts.)k(If)30 b(the)g(parser)d(cannot)i(parse)g
+(incoming)g(text)g(\()h(a)f(syn)n(tactic)g(error)e(\))j(or)f(if)h(the)g
+(icalrestriction_c)n(hec)n(k\(\))0 3661 y(routine)h(indicates)g(that)h
+(the)f(comp)r(onen)n(t)g(do)r(es)g(not)h(meet)f(the)h(requiremen)n(ts)e
+(of)h(RF)n(C2446)f(\()h(a)g(seman)n(tic)g(error\))f(the)0
+3775 y(library)i(will)h(insert)g(prop)r(erties)f(of)h(the)h(t)n(yp)r(e)
+f(X-LIC-ERR)n(OR)g(to)g(describ)r(e)g(the)g(error.)52
+b(Here)33 b(is)g(an)g(example)g(of)g(the)0 3889 y(error)26
+b(prop)r(ert)n(y:)0 4108 y Fc(X-LIC-ERROR;X-LI)o(C-)o(ERR)o(OR)o(TY)o
+(PE=)o(IN)o(VA)o(LID)o(_I)o(TI)o(P)38 b(:Failed)i(iTIP)i(restrictions)d
+(for)j(property)e(DTSTART.)0 4221 y(Expected)g(1)j(instances)d(of)j
+(the)f(property)e(and)j(got)f(0)0 4441 y Ff(This)35 b(error)f(resulted)
+h(from)g(a)g(call)g(to)h(icalrestriction_c)n(hec)n(k\(\),)f(whic)n(h)g
+(disco)n(v)n(ered)e(that)j(the)g(comp)r(onen)n(t)f(do)r(es)g(not)0
+4554 y(ha)n(v)n(e)26 b(a)i(DTST)-7 b(AR)g(T)28 b(prop)r(ert)n(y)-7
+b(,)27 b(as)g(required)f(b)n(y)h(RF)n(C2445.)0 4711 y(There)g(are)g(a)g
+(few)h(routines)e(to)i(manipulate)f(error)f(prop)r(erties:)0
+4867 y(The)35 b(follo)n(wing)g(data)g(is)g(supp)r(osed)g(to)g(b)r(e)h
+(in)g(a)f(table.)60 b(It)36 b(lo)r(oks)e(OK)h(in)h(LyX,)f(but)h(do)r
+(es)f(not)g(format)g(prop)r(ertly)g(in)0 4981 y(output.)0
+5137 y(Routine)28 b(Purp)r(ose)f(v)n(oid)g(icalrestriction_c)n(hec)n
+(k\(\))e(Chec)n(k)i(a)g(comp)r(onen)n(t)g(against)g(RF)n(C2446)e(and)j
+(insert)0 5294 y(error)g(prop)r(erties)g(to)i(indicate)f(non)g
+(compliance)g(in)n(t)h(icalcomp)r(onen)n(t_coun)n(t_errors\(\))c
+(Return)j(the)h(n)n(um)n(b)r(er)g(of)f(error)0 5407 y(prop)r(erties)p
+eop
+%%Page: 21 21
+21 20 bop 0 -167 3900 5 v 0 -200 a Fd(5.)73 b(Using)32
+b(libical)3149 b Ff(21)0 162 y(in)28 b(a)f(comp)r(onen)n(t)g(v)n(oid)g
+(icalcomp)r(onen)n(t_strip_errors\(\))d(Remo)n(v)n(e)i(all)i(error)d
+(prop)r(erties)i(in)h(as)0 318 y(comp)r(onen)n(t)f(v)n(oid)g(icalcomp)r
+(onen)n(t_con)n(v)n(ert_errors\(\))c(Con)n(v)n(ert)j(some)h(error)e
+(prop)r(erties)i(in)n(to)0 475 y(REQUESTS-ST)-7 b(A)g(TUS)29
+b(proprties)e(to)g(indicate)h(the)g(inabilit)n(y)f(to)0
+631 y(pro)r(cess)f(the)i(comp)r(onen)n(t)g(as)e(an)i(iTIP)g(request.)0
+788 y(The)g(t)n(yp)r(es)f(of)h(errors)d(are)i(listed)g(in)h
+(icalerror.h.)35 b(They)27 b(are:)0 1027 y Fc(ICAL_XLICERRORTY)o(PE)o
+(_CO)o(MP)o(ON)o(ENT)o(PA)o(RS)o(EER)o(RO)o(R)0 1141
+y(ICAL_XLICERRORTY)o(PE)o(_PA)o(RA)o(ME)o(TER)o(VA)o(LU)o(EPA)o(RS)o
+(EE)o(RRO)o(R)0 1254 y(ICAL_XLICERRORTY)o(PE)o(_PA)o(RA)o(ME)o(TER)o
+(NA)o(ME)o(PAR)o(SE)o(ER)o(ROR)0 1368 y(ICAL_XLICERRORTY)o(PE)o(_PR)o
+(OP)o(ER)o(TYP)o(AR)o(SE)o(ERR)o(OR)0 1481 y(ICAL_XLICERRORTY)o(PE)o
+(_VA)o(LU)o(EP)o(ARS)o(EE)o(RR)o(OR)0 1595 y(ICAL_XLICERRORTY)o(PE)o
+(_UN)o(KV)o(CA)o(LPR)o(OP)0 1709 y(ICAL_XLICERRORTY)o(PE)o(_IN)o(VA)o
+(LI)o(DIT)o(IP)0 1948 y Ff(The)46 b(libical)f(parser)f(will)i(generate)
+e(the)i(error)d(that)j(end)g(in)g(P)-7 b(ARSEERR)n(OR)47
+b(when)e(it)h(encoun)n(ters)f(garbage)e(in)0 2062 y(the)d(input)g
+(steam.)72 b(ICAL_XLICERR)n(OR)-7 b(TYPE_INV)e(ALIDITIP)42
+b(is)d(inserted)g(b)n(y)g(icalrestriction_c)n(hec)n(k\(\),)h(and)0
+2175 y(ICAL_XLICERR)n(OR)-7 b(TYPE_UNKV)n(CALPR)n(OP)21
+b(is)e(generated)f(b)n(y)i(icalv)n(cal_con)n(v)n(ert\(\))c(when)k(it)g
+(encoun)n(ters)f(a)g(vCal)0 2289 y(prop)r(ert)n(y)26
+b(that)i(it)g(cannot)f(con)n(v)n(ert)f(or)h(do)r(es)g(not)h(kno)n(w)f
+(ab)r(out.)0 2445 y(Icalcomp)r(onen)n(t_con)n(v)n(ert_errors\(\))33
+b(con)n(v)n(erts)k(some)g(of)i(the)f(error)f(prop)r(erties)g(in)h(a)g
+(comp)r(onen)n(t)g(in)n(to)g(REQUEST-)0 2559 y(ST)-7
+b(A)g(TUS)29 b(prop)r(erties)e(that)h(indicate)g(a)g(failure.)38
+b(As)28 b(of)g(libical)g(v)n(ersion0.18,)e(this)i(routine)g(only)f(con)
+n(v)n(ert)g(*P)-7 b(ARSEER-)0 2672 y(R)n(OR)29 b(errors)d(and)j(it)h
+(alw)n(a)n(ys)d(generates)h(a)g(3.x)h(\()g(failure)g(\))g(co)r(de.)42
+b(This)29 b(mak)n(es)f(it)h(more)f(of)h(a)g(go)r(o)r(d)g(idea)f(than)h
+(a)g(really)0 2786 y(useful)f(bit)g(of)g(co)r(de.)0 3077
+y Fb(5.7)112 b(Naming)36 b(Standard)0 3288 y Ff(Structures)26
+b(that)i(y)n(ou)e(access)f(with)j(the)f("struct")f(k)n(eyw)n(ord,)f
+(suc)n(h)h(as)h("struct)f(icaltimet)n(yp)r(e")g(are)g(things)h(that)g
+(y)n(ou)f(are)0 3401 y(allo)n(w)n(ed)g(to)i(see)f(inside)g(and)h(p)r
+(ok)n(e)f(at.)0 3558 y(Structures)33 b(that)h(y)n(ou)e(access)g(though)
+i(a)f(t)n(yp)r(edef,)i(suc)n(h)e(as)g("icalcomp)r(onen)n(t")e(are)i
+(things)g(where)g(all)g(of)h(the)f(data)g(is)0 3671 y(hidden.)0
+3828 y(Comp)r(onen)n(t)28 b(names)g(that)h(start)f(with)h("V")f(are)f
+(part)h(of)h(RF)n(C)f(2445)f(or)g(another)h(iCal)g(standard.)38
+b(Comp)r(onen)n(t)29 b(names)0 3941 y(that)h(start)f(with)i("X")e(are)g
+(also)g(part)g(of)h(the)g(sp)r(ec,)g(but)h(they)f(are)f(not)h(actually)
+f(comp)r(onen)n(ts)g(in)h(the)g(sp)r(ec.)44 b(Ho)n(w)n(ev)n(er,)0
+4055 y(they)34 b(lo)r(ok)f(and)g(act)h(lik)n(e)f(comp)r(onen)n(ts,)h
+(so)f(they)h(are)f(comp)r(onen)n(ts)g(in)h(libical.)55
+b(Names)33 b(that)h(start)f(with)h("XLIC")f(or)0 4168
+y("X-LIC")26 b(are)h(not)h(part)f(of)g(an)n(y)g(iCal)g(sp)r(ec.)37
+b(They)27 b(are)g(used)h(in)n(ternally)e(b)n(y)i(libical.)0
+4325 y(En)n(ums)34 b(that)h(iden)n(tify)f(a)g(comp)r(onen)n(t,)h(prop)r
+(ert)n(y)-7 b(,)35 b(v)-5 b(alue)33 b(or)h(parameter)e(end)i(with)h
+("_COMPONENT,")e("_PR)n(OP-)0 4438 y(ER)-7 b(TY,")28
+b("_V)-9 b(ALUE,")27 b(or)g("_P)-7 b(ARAMETER"s)0 4595
+y(En)n(ums)31 b(that)f(iden)n(tify)h(a)f(parameter)f(v)-5
+b(alue)30 b(ha)n(v)n(e)f(the)i(name)f(of)h(the)f(parameter)f(as)h(the)h
+(second)e(w)n(ord.)45 b(F)-7 b(or)29 b(instance:)0 4708
+y(ICAL_R)n(OLE_REQP)-7 b(AR)g(TICIP)g(ANT)29 b(or)d(ICAL_P)-7
+b(AR)g(TST)g(A)g(T_A)n(CCEPTED.)0 4865 y(The)28 b(en)n(ums)f(for)g(the)
+h(parts)f(of)g(a)g(recurarance)e(rule)j(and)f(request)g(statuses)g(are)
+f(irregular.)p eop
+%%Page: 22 22
+22 21 bop 0 -167 3900 5 v 0 -200 a Fd(6.)73 b(Hac)m(ks)33
+b(and)f(Bugs)2997 b Ff(22)0 162 y Fe(6)131 b(Hac)l(ks)45
+b(and)e(Bugs)0 400 y Ff(There)24 b(are)f(a)g(lot)h(of)g(hac)n(ks)f(in)i
+(the)f(library)f(\025)h(bits)g(of)g(co)r(de)g(that)g(I)g(am)g(not)g
+(proud)g(of)g(and)g(should)g(probably)f(b)r(e)h(c)n(hanged.)0
+514 y(These)j(are)g(mark)n(ed)f(with)i(the)g(commen)n(t)g(string)e("HA)
+n(CK.")p eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/libkcal/libical/doc/UsingLibical.txt b/libkcal/libical/doc/UsingLibical.txt
new file mode 100644
index 00000000..6b203d43
--- /dev/null
+++ b/libkcal/libical/doc/UsingLibical.txt
@@ -0,0 +1,1384 @@
+
+
+Using Libical
+
+Eric Busboom (eric@softwarestudio.org)
+
+January 2001
+
+
+
+1 Introduction
+
+Libical is an Open Source implementation of the iCalendar protocols
+and protocol data units. The iCalendar specification describes how
+calendar clients can communicate with calendar servers so users can
+store their calendar data and arrange meetings with other users.
+
+Libical implements RFC2445, RFC2446 and some of RFC2447 and the CAP
+draft.
+
+This documentation assumes that you are familiar with the iCalendar
+standards RFC2445 and RFC2446. these specifications are online on
+the CALSCH webpage at:
+
+http://www.imc.org/ietf-calendar/
+
+1.1 The libical project
+
+This code is under active development. If you would like to contribute
+to the project, you can contact me, Eric Busboom, at eric@softwarestudio.org.
+The project has a webpage at
+
+http://softwarestudio.org/libical/index.html
+
+and a mailing list that you can join by sending the following mail:
+
+To: minimalist@softwarestudio.org
+
+Subject: subscribe libical
+
+1.2 License
+
+The code and datafiles in this distribution are licensed under the
+Mozilla Public License. See http://www.mozilla.org/NPL/MPL-1.0.html
+for a copy of the license. Alternately, you may use libical under
+the terms of the GNU Library General Public License. See http://www.fsf.org/copyleft/lesser.html
+for a copy of the LGPL.
+
+This dual license ensures that the library can be incorporated into
+both proprietary code and GPL'd programs, and will benefit from improvements
+made by programmers in both realms. I will only accept changes into
+my version of the library if they are similarly dual-licensed.
+
+1.3 Example Code
+
+A lot of the documentation for this library is in the form of example
+code. These examples are in the "examples" directory of the distribution.
+Also look in "src/test" for additional annotated examples.
+
+2 Building the Library
+
+Libical uses autoconf to generate makefiles. It should built with no
+adjustments on Linux, FreeBSD and Solaris under gcc. Some version
+have been successfully been build on MacOS, Solaris, UnixWare, And
+Tru64 UNIX without gcc, but you may run into problems with a particular
+later version.
+
+For a more complete guide to building the library, see the README file
+in the distribution.
+
+3 Structure
+
+The iCal calendar model is based on four types of objects: components,
+properties, values and parameters.
+
+Properties are the fundamental unit of information in iCal, and they
+work a bit like a hash entry, with a constant key and a variable value.
+Properties may also have modifiers, called parameters. In the iCal
+content line
+
+ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com
+
+The property name is "ORGANIZER," the value of the property is "mrbig@host.com"
+and the "ROLE" parameter specifies that Mr Big is the chair of the
+meetings associated with this property.
+
+Components are groups of properties that represent the core objects
+of a calendar system, such as events or timezones. Components are
+delimited by "BEGIN" and "END" tags.
+
+When a component is sent across a network, if it is un-encrypted, it
+will look something like:
+
+BEGIN:VCALENDAR
+
+METHOD:REQUEST
+
+PRODID: -//hacksw/handcal//NONSGML v1.0//EN
+
+BEGIN:VEVENT
+
+DTSTAMP:19980309T231000Z
+
+UID:guid-1.host1.com
+
+ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com
+
+ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:
+
+ MAILTO:employee-A@host.com
+
+DESCRIPTION:Project XYZ Review Meeting
+
+CATEGORIES:MEETING
+
+CLASS:PUBLIC
+
+CREATED:19980309T130000Z
+
+SUMMARY:XYZ Project Review
+
+DTSTART;TZID=US-Eastern:19980312T083000
+
+DTEND;TZID=US-Eastern:19980312T093000
+
+LOCATION:1CP Conference Room 4350
+
+END:VEVENT
+
+END:VCALENDAR
+
+Note that components can be nested; this example has both a VCALENDAR
+and a VEVENT component, one nested inside the other.
+
+3.1 Core iCal classes
+
+Libical is an object-based, data-oriented library. Nearly all of the
+routines in the library are associated with an opaque data types and
+perform some operation on that data type. Although the library does
+not actually have classes, we will use those terms since the behavior
+of these associations of data and routines is very similar to a class.
+
+3.1.1 Properties
+
+Properties are represented with the icalproperty class and its many
+"derived" classes with on "derived" class per property type in RFC2445.
+Again, there is no actual inheritance relations, but there are clusters
+of routines that make this term useful. A property is a container
+for a single value and a set of parameters.
+
+3.1.2 Components
+
+In libical, components are represented with the icalcomponent class.
+Icalcomponent is a container for a set of other components and properties.
+
+3.1.3 Values
+
+Values are represented in a similar way to properties; a base class
+and many "derived " classes. A value is essentially a abstract handle
+on a single fundamental type, a structure or a union.
+
+3.1.4 Parameters
+
+Parameters are represetned in a similar way to properties, except that
+they contain only one value
+
+3.2 Other elements of libical
+
+In addition to the core iCal classes, libical has many other types,
+structures, classes that aid in creating and using iCal components.
+
+3.2.1 Enumerations and types
+
+Libical is strongly typed, soo every component, property, parameter,
+and value type has an enumeration, and some have an associated structure
+or union.
+
+3.2.2 The parser
+
+The libical parser offers a variety of ways to convert RFC2445 text
+into a libical iinsteral component structure. the parser can parse
+blocks of text as a string, or it can parse lin-by-line.
+
+3.2.3 Error objects
+
+Libical has a substantial error reporting system for both programming
+errors and component usage errors.
+
+3.2.4 Memory Management
+
+Since many of libicals interfaces return strings, the library has its
+own memory management system to elimiate the need to free every string
+returned from the libraru.
+
+3.2.5 Storage classes
+
+The library also offers several classes to store components to flies,
+memory or databases.
+
+4 Differences From RFCs
+
+Libical has been designed to follow the standards as closely as possible,
+so that the key objects in the standards are also key objects in the
+library. However, there are a few areas where the specifications are
+(arguably) irregular, and following them exactly would result in an
+unfriendly interface. These deviations make libical easier to use
+by maintaining a self-similar interface.
+
+4.1 Pseudo Components
+
+Libical defines components for groups of properties that look and act
+like components, but are not defined as components in the specification.
+XDAYLIGHT and XSTANDARD are notable examples. These pseudo components
+group properties within the VTIMEZONE components. For instanace, the
+timezone properties associated with daylight savings time starts with
+"BEGIN:DAYLIGHT" and ends with "END:DAYLIGHT, just like other components,
+but is not defined as a component in RFC2445. ( See RFC2445, page
+61 ) In Libical,this grouping is represented by the XDAYLIGHT component.
+Standard iCAL components all start with the letter "V," while pseudo
+components start with"X."
+
+There are also pseudo components that are conceptually derived classes
+of VALARM. RFC2446 defines what properties may be included in each
+component, and for VALARM, the set of properties it may have depends
+on the value of the ACTION property.
+
+For instance, if a VALARM component has an ACTION property with the
+value of "AUDIO," the component must also have an "ATTACH" property.
+However, if the ACTION value is "DISPLAY," the component must have
+a DESCRIPTION property.
+
+To handle these various, complex restrictions, libical has pseudo components
+for each type of alarm: XAUDIOALARM, XDISPLAYALARM, XEMAILALARM and
+XPROCEDUREALARM.
+
+4.2 Combined Values
+
+Many values can take more than one type. TRIGGER, for instance, can
+have a value type of with DURATION or of DATE-TIME. These multiple
+types make it difficult to create routines to return the value associated
+with a property.
+
+It is natural to have interfaces that would return the value of a property,
+but it is cumbersome for a single routine to return multiple types.
+So, in libical, properties that can have multiple types are given
+a single type that is the union of their RFC2445 types. For instance,
+in libical, the value of the TRIGGER property resolves to struct icaltriggertype.
+This type is a union of a DURATION and a DATE-TIME.
+
+4.3 Multi-Valued Properties
+
+Some properties, such as CATEGORIES have only one value type, but each
+CATEGORIES property can have multiple value instances. This also results
+in a cumbersome interface -- CATEGORIES accessors would have to return
+a list while all other accessors returned a single value. In libical,
+all properties have a single value, and multi-valued properties are
+broken down into multiple single valued properties during parsing.
+That is, an input line like,
+
+CATEGORIES: work, home
+
+becomes in libical's internal representation
+
+CATEGORIES: work
+
+CATEGORIES: home
+
+Oddly, RFC2445 allows some multi-valued properties ( like FREEBUSY
+) to exist as both a multi-values property and as multiple single
+value properties, while others ( like CATEGORIES ) can only exist
+as single multi-valued properties. This makes the internal representation
+for CATEGORIES illegal. However when you convert a component to a
+string, the library will collect all of the CATEGORIES properties
+into one.
+
+5 Using libical
+
+5.1 Creating Components
+
+There are three ways to create components in Libical: creating individual
+objects and assembling them, building entire objects in massive vaargs
+calls, and parsing a text file containing iCalendar data.
+
+5.1.1 Constructor Interfaces
+
+Using constructor interfaces, you create each of the objects separately
+and then assemble them in to components:
+
+icalcomponent *event;
+
+icalproperty *prop;
+
+icalparameter *param;
+
+struct icaltimetype atime;
+
+event = icalcomponent_new(ICAL_VEVENT_COMPONENT);
+
+prop = icalproperty_new_dtstamp(atime) ;
+
+icalcomponent_add_property(event, prop);
+
+prop = icalproperty_new_uid(''guid-1.host1.com'') );
+
+icalcomponent_add_property(event,prop);
+
+prop=icalproperty_new_organizer(''mrbig@host.com'');
+
+param = icalparameter_new_role(ICAL_ROLE_CHAIR)
+
+icalproperty_add_parameter(prop, param);
+
+icalcomponent_add_property(event,prop);
+
+Notice that libical uses a semi-object-oriented style of interface.
+Most things you work with are objects, that are instantiated with
+a constructor that has "new" in the name. Also note that, other than
+the object reference, most structure data is passed in to libical
+routines by value. Libical has some complex but very regular memory
+handling rules. These are detailed in section [sec:memory].
+
+If any of the constructors fail, they will return 0. If you try to
+insert 0 into a property or component, or use a zero-valued object
+reference, libical will either silently ignore the error or will abort
+with an error message. This behavior is controlled by a compile time
+flag (ICAL_ERRORS_ARE_FATAL), and will abort by default.
+
+5.1.2 vaargs Constructors
+
+There is another way to create complex components, which is arguably
+more elegant, if you are not horrified by varargs. The varargs constructor
+interface allows you to create intricate components in a single block
+of code. Here is the previous examples in the vaargs style.
+
+ calendar =
+
+ icalcomponent_vanew(
+
+ ICAL_VCALENDAR_COMPONENT,
+
+ icalproperty_new_version(''2.0''),
+
+ icalproperty_new_prodid(
+
+ ''-//RDU Software//NONSGML HandCal//EN''),
+
+ icalcomponent_vanew(
+
+ ICAL_VEVENT_COMPONENT,
+
+ icalproperty_new_dtstamp(atime),
+
+ icalproperty_new_uid(''guid-1.host1.com''),
+
+ icalproperty_vanew_organizer(
+
+ ''mrbig@host.com''),
+
+ icalparameter_new_role(ICAL_ROLE_CHAIR),
+
+ 0
+
+ ),
+
+ icalproperty_vanew_attendee(
+
+ ''employee-A@host.com'',
+
+ icalparameter_new_role(
+
+ ICAL_ROLE_REQPARTICIPANT),
+
+ icalparameter_new_rsvp(1),
+
+ icalparameter_new_cutype(ICAL_CUTYPE_GROUP),
+
+ 0
+
+ ),
+
+ icalproperty_new_location(
+
+ "1CP Conference Room 4350"),
+
+ 0
+
+ ),
+
+ 0
+
+ );
+
+This form is similar to the constructor form , except that the constructors
+have "vanew" instead of "new" in the name. The arguments are similar
+too, except that the component constructor can have a list of properties,
+and the property constructor can have a list of parameters. Be sure
+to terminate every list with a '0', or your code will crash, if you
+are lucky.
+
+5.1.3 Parsing Text Files
+
+The final way to create components will probably be the most common;
+you can create components from RFC2445 compliant text. If you have
+the string in memory, use
+
+icalcomponent* icalparser_parse_string(char* str);
+
+If the string contains only one component, the parser will return the
+component in libical form. If the string contains multiple components,
+the multiple components will be returned as the children of an ICAL_XROOT_COMPONENT
+component.
+
+Parsing a whole string may seem wasteful if you want to pull a large
+component off of the network or from a file; you may prefer to parse
+the component line by line. This is possible too by using:
+
+icalparser* icalparser_new();
+
+void icalparser_free(icalparser* parser);
+
+icalparser_get_line(parser,read_stream);
+
+icalparser_add_line(parser,line);
+
+icalparser_set_gen_data(parser,stream)
+
+These routines will construct a parser object to which you can add
+lines of input and retrieve any components that the parser creates
+from the input. These routines work by specifing an adaptor routine
+to get string data from a source. For an example:
+
+char* read_stream(char *s, size_t size, void *d)
+
+{
+
+ char *c = fgets(s,size, (FILE*)d);
+
+ return c;
+
+}
+
+main() {
+
+ char* line;
+
+ icalcomponent *c;
+
+ icalparser *parser = icalparser_new();
+
+ FILE* stream = fopen(argv[1],"r");
+
+ icalparser_set_gen_data(parser,stream);
+
+ do{
+
+ line = icalparser_get_line(parser,read_stream);
+
+ c = icalparser_add_line(parser,line);
+
+ if (c != 0){
+
+ printf("%s",icalcomponent_as_ical_string(c));
+
+ icalparser_claim(parser);
+
+ printf("\n---------------\n");
+
+ icalcomponent_free(c);
+
+ }
+
+ } while ( line != 0);
+
+}
+
+The parser object parameterizes the routine used to get input lines
+with icalparser_set_gen_data() and icalparser_get_line(). In this
+example, the routine read_stream() will fetch the next line from a
+stream, with the stream passed in as the void* parameter d. The parser
+calls read_stream() from icalparser_get_line(), but it also needs
+to know what stream to use. This is set by the call to icalparser_set_gen_data().
+By using a different routine for read_stream or passing in different
+data with icalparser_set_gen_data, you can connect to any data source.
+
+Using the same mechanism, other implementations could read from memory
+buffers, sockets or other interfaces.
+
+Since the example code is a very common way to use the parser, there
+is a convenience routine;
+
+icalcomponent* icalparser_parse(icalparser *parser,
+
+ char* (*line_gen_func)(char *s, size_t size, void*
+d))
+
+To use this routine, you still must construct the parser object and
+pass in a reference to a line reading routine. If the parser can create
+a single component from the input, it will return a pointer to the
+newly constructed component. If the parser can construct multiple
+components from the input, it will return a reference to an XROOT
+component ( of type ICAL_XROOT_COMPONENT.) This XROOT component will
+hold all of the components constructed from the input as children.
+
+5.2 Accessing Components
+
+Given a reference to a component, you probably will want to access
+the properties, parameters and values inside. Libical interfaces let
+you find sub-component, add and remove sub-components, and do the
+same three operations on properties.
+
+5.2.1 Finding Components
+
+To find a sub-component of a component, use:
+
+icalcomponent* icalcomponent_get_first_component(
+
+ icalcomponent* component,
+
+ icalcomponent_kind kind);
+
+This routine will return a reference to the first component of the
+type 'kind.' The key kind values, listed in icalenums.h are:
+
+ICAL_ANY_COMPONENT
+
+ICAL_VEVENT_COMPONENT
+
+ICAL_VTODO_COMPONENT
+
+ICAL_VJOURNAL_COMPONENT
+
+ICAL_VCALENDAR_COMPONENT
+
+ICAL_VFREEBUSY_COMPONENT
+
+ICAL_VALARM_COMPONENT
+
+These are only the most common components; there are many more listed
+in icalenums.h.
+
+As you might guess, if there is more than one subcomponent of the type
+you have chosen, this routine will return only the first. to get at
+the others, you need to iterate through the component.
+
+5.2.2 Iterating Through Components
+
+Iteration requires a second routine to get the next subcomponent after
+the first:
+
+icalcomponent* icalcomponent_get_next_component(
+
+ icalcomponent* component,
+
+ icalcomponent_kind kind);
+
+With the 'first' and 'next' routines, you can create a for loop to
+iterate through all of a components subcomponents
+
+ for(c = icalcomponent_get_first_component(comp,ICAL_ANY_COMPONENT);
+
+ c != 0;
+
+ c = icalcomponent_get_next_component(comp,ICAL_ANY_COMPONENT))
+
+{
+
+ do_something(c);
+
+}
+
+This code bit wil iterate through all of the subcomponents in 'comp'
+but you can select a specific type of component by changing ICAL_ANY_COMPONENT
+to another component type.
+
+5.2.3 Using Component Iterators
+
+The iteration model in the previous section requires the component
+to keep the state of the iteration. So, you could not use this model
+to perform a sorting operations, since you'd need two iterators and
+there is only space for one. If you ever call icalcomponent_get_first_component()
+when an iteration is in progress, the pointer will be reset to the
+beginning.
+
+To solve this problem, there are also external iterators for components.
+The routines associated with these external iterators are:
+
+icalcompiter icalcomponent_begin_component(icalcomponent* component,
+icalcomponent_kind kind);
+
+icalcompiter icalcomponent_end_component(icalcomponent* component,
+icalcomponent_kind kind);
+
+icalcomponent* icalcompiter_next(icalcompiter* i);
+
+icalcomponent* icalcompiter_prior(icalcompiter* i);
+
+icalcomponent* icalcompiter_deref(icalcompiter* i);
+
+The _begin_() and _end_() routines return a new iterator that points
+to the beginning and ending of the list of subcomponent for the given
+component, and the kind argument works like the kind argument for
+internal iterators.
+
+After creating an iterators, use _next_() and _prior_() to step forward
+and backward through the list and get the component that the iterator
+points to, and use _deref() to return the component that the iterator
+points to without moving the iterator. All routines will return 0
+when they move to point off the end of the list.
+
+Here is an example of a loop using these routines:
+
+for(
+
+ i = icalcomponent_begin_component(impl->cluster,ICAL_ANY_COMPONENT);
+
+ icalcompiter_deref(&i)!= 0;
+
+ icalcompiter_next(&i)
+
+) {
+
+ icalcomponent *this = icalcompiter_deref(&i);
+
+}
+
+5.2.4 Removing Components
+
+Removing an element from a list while iterating through the list with
+the internal iterators can cause problems, since you will probably
+be removing the element that the internal iterator points to. The
+_remove() routine will keep the iterator valid by moving it to the
+next component, but in a normal loop, this will result in two advances
+per iteration, and you will remove only every other component. To
+avoid the problem, you will need to step the iterator ahead of the
+element you are going to remove, like this:
+
+for(c = icalcomponent_get_first_component(parent_comp,ICAL_ANY_COMPONENT);
+
+ c != 0;
+
+ c = next
+
+{
+
+ next = icalcomponent_get_next_component(parent_comp,ICAL_ANY_COMPONENT);
+
+ icalcomponent_remove_component(parent_comp,c);
+
+}
+
+Another way to remove components is to rely on the side effect of icalcomponent_remove_component:
+if component iterator in the parent component is pointing to the child
+that will be removed, it will move the iterator to the component after
+the child. The following code will exploit this behavior:
+
+icalcomponent_get_first_component(parent_comp,ICAL_VEVENT_COMPONENT);
+
+while((c=icalcomponent_get_current_component(c)) != 0 ){
+
+ if(icalcomponent_isa(c) == ICAL_VEVENT_COMPONENT){
+
+ icalcomponent_remove_component(parent_comp,inner);
+
+ } else {
+
+ icalcomponent_get_next_component(parent_comp,ICAL_VEVENT_COMPONENT);
+
+ }
+
+}
+
+5.2.5 Working with properties and parameters
+
+Finding, iterating and removing properties works the same as it does
+for components, using the property-specific or parameter-specific
+interfaces:
+
+icalproperty* icalcomponent_get_first_property(
+
+ icalcomponent* component,
+
+ icalproperty_kind kind);
+
+icalproperty* icalcomponent_get_next_property(
+
+ icalcomponent* component,
+
+ icalproperty_kind kind);
+
+void icalcomponent_add_property(
+
+ icalcomponent* component,
+
+ icalproperty* property);
+
+void icalcomponent_remove_property(
+
+ icalcomponent* component,
+
+ icalproperty* property);
+
+For parameters:
+
+icalparameter* icalproperty_get_first_parameter(
+
+ icalproperty* prop,
+
+ icalparameter_kind kind);
+
+icalparameter* icalproperty_get_next_parameter(
+
+ icalproperty* prop,
+
+ icalparameter_kind kind);
+
+void icalproperty_add_parameter(
+
+ icalproperty* prop,
+
+ icalparameter* parameter);
+
+void icalproperty_remove_parameter(
+
+ icalproperty* prop,
+
+ icalparameter_kind kind);
+
+Note that since there should be only one parameter of each type in
+a property, you will rarely need to use icalparameter_get_nect_paameter.
+
+5.2.6 Working with values
+
+Values are typically part of a property, although they can exist on
+their own. You can manipulate them either as part of the property
+or independently.
+
+The most common way to work with values to is to manipulate them from
+they properties that contain them. This involves fewer routine calls
+and intermediate variables than working with them independently, and
+it is type-safe.
+
+For each property, there are a _get_ and a _set_ routine that access
+the internal value. For instanace, for the UID property, the routines
+are:
+
+void icalproperty_set_uid(icalproperty* prop, const char* v)
+
+const char* icalproperty_get_uid(icalproperty* prop)
+
+For multi-valued properties, like ATTACH, the value type is usually
+a struct or union that holds both possible types.
+
+If you want to work with the underlying value object, you can get and
+set it with:
+
+icalvalue* icalproperty_get_value (icalproperty* prop)
+
+void icalproperty_set_value(icalproperty* prop, icalvalue* value);
+
+Icalproperty_get_value() will return a reference that you can manipulate
+with other icalvalue routines. Most of the time, you will have to
+know what the type of the value is. For instance, if you know that
+the value is a DATETIME type, you can manipulate it with:
+
+struct icaltimetype icalvalue_get_datetime(icalvalue* value);
+
+void icalvalue_set_datetime(icalvalue* value, struct icaltimetype v);
+
+When working with an extension property or value (and X-PROPERTY or
+a property that has the parameter VALUE=x-name ) the value type is
+always a string. To get and set the value, use:
+
+void icalproperty_set_x(icalproperty* prop, char* v);
+
+char* icalproperty_get_x(icalproperty* prop);
+
+All X properties have the type of ICAL_X_PROPERTY, so you will need
+these routines to get and set the name of the property:
+
+char* icalproperty_get_x_name(icalproperty* prop)
+
+void icalproperty_set_x_name(icalproperty* prop, char* name);
+
+5.2.7 Checking Component Validity
+
+RFC 2446 defines rules for what properties must exist in a component
+to be used for transferring scheduling data. Most of these rules relate
+to the existence of properties relative to the METHOD property, which
+declares what operation a remote receiver should use to process a
+component. For instance, if the METHOD is REQUEST and the component
+is a VEVENT, the sender is probably asking the receiver to join in
+a meeting. In this case, RFC2446 says that the component must specify
+a start time (DTSTART) and list the receiver as an attendee (ATTENDEE).
+
+Libical can check these restrictions with the routine:
+
+int icalrestriction_check(icalcomponent* comp);
+
+This routine returns 0 if the component does not pass RFC2446 restrictions,
+or if the component is malformed. The component you pass in must be
+a VCALENDAR, with one or more children, like the examples in RFC2446.
+
+When this routine runs, it will insert new properties into the component
+to indicate any errors it finds. See section 6.5.3, X-LIC-ERROR for
+more information about these error properties.
+
+5.2.8 Converting Components to Text
+
+To create an RFC2445 compliant text representation of an object, use
+one of the *_as_ical_string() routines:
+
+char* icalcomponent_as_ical_string (icalcomponent* component)
+
+char* icalproperty_as_ical_string (icalproperty* property)
+
+char* icalparameter_as_ical_string (icalparameter* parameter)
+
+char* icalvalue_as_ical_string (icalvalue* value)
+
+In most cases, you will only use icalcomponent_as_ical_string (), since
+it will cascade and convert all of the parameters, properties and
+values that are attached to the root component.
+
+Icalproperty_as_ical_string() will terminate each line with the RFC2445
+specified line terminator "\\n" However, if you compile with the symbol
+ICAL_UNIX_NEWLINE undefined, ( it is defined by default) it will terminate
+lines with "\\n\\r"
+
+Remember that the string returned by these routines is owned by the
+library, and will eventually be re-written. You should copy it if
+you want to preserve it.
+
+5.3 Time
+
+5.3.1 Time structure
+
+LIbical defines it's own time structure for storing all dates and times.
+It would have been nice to re-use the C library's struct tm, but that
+structure does not differentiate between dates and times, and between
+local time and UTC. The libical structure is:
+
+struct icaltimetype {
+
+ int year;
+
+ int month;
+
+ int day;
+
+ int hour;
+
+ int minute;
+
+ int second;
+
+ int is_utc; /* 1-> time is in UTC timezone */
+
+ int is_date; /* 1 -> interpret this as date. */ };
+
+The year, month, day, hour, minute and second fields hold the broken-out
+time values. The is_utc field distinguishes between times in UTC and
+a local time zone. The is_date field indicates if the time should
+be interpreted only as a date. If it is a date, the hour, minute and
+second fields are assumed to be zero, regardless of their actual vaules.
+
+5.3.2 Creating time structures
+
+There are several ways to create a new icaltimetype structure:
+
+struct icaltimetype icaltime_from_string(const char* str);
+
+struct icaltimetype icaltime_from_timet(time_t v, int is_date);
+
+struct icaltimetype icaltime_from_int(int v, int is_date, int is_utc);
+
+Icaltime_from_string takes any RFC2445 compliant time string:
+
+struct icaltimetype tt = icaltime_from_string("19970101T103000");
+
+Icaltime_from_timet takes a timet value, representing seconds past
+the POSIX epoch, and a flag to indicate if the time is a date. Dates
+have an identical structure to a time, but the time portion ( hours,
+minuts and seconds ) is always 00:00:00. Dates act differently in
+sorting an comparision, and they have a different string representation
+in RFC2445.
+
+The icaltime_from_int is like icaltime_from_timet, but with an arbitrary
+epoch. This routine was a mistake and is deprecated.
+
+5.3.3 Time manipulating routines
+
+The null time value is used to indicate that the data in the structure
+is not a valid time.
+
+struct icaltimetype icaltime_null_time(void);
+
+int icaltime_is_null_time(struct icaltimetype t);
+
+It is sensible for the broken-out time fields to contain values that
+are not permitted in an ISO compliant time string. For instance, the
+seconds field can hold values greater than 59, and the hours field
+can hold values larger than 24. The excessive values will be rolled
+over into the next larger field when the structure is normalized.
+
+struct icaltimetype icaltime_normalize(struct icaltimetype t);
+
+Normalizing allows you to do arithmetic operations on time values.
+
+struct icaltimetype tt = icaltime_from_string("19970101T103000");
+
+tt.days +=3
+
+tt.second += 70;
+
+tt = icaltime_normalize(tt);
+
+There are several routines to get the day of the week or month, etc,
+from a time structure.
+
+short icaltime_day_of_year(struct icaltimetype t);
+
+struct icaltimetype icaltime_from_day_of_year(short doy, short year);
+
+short icaltime_day_of_week(struct icaltimetype t);
+
+short icaltime_start_doy_of_week(struct icaltimetype t);
+
+short icaltime_week_number(short day_of_month, short month, short year);
+
+struct icaltimetype icaltime_from_week_number(short week_number, short
+year);
+
+short icaltime_days_in_month(short month,short year);
+
+Two routines convert time structures to and from the number of seconds
+since the POSIX epoch. The is_date field indicates whether or not
+the hour, minute and second fields should be used in the conversion.
+
+struct icaltimetype icaltime_from_timet(time_t v, int is_date);
+
+time_t icaltime_as_timet(struct icaltimetype);
+
+The compare routine works exactly like strcmp, but on time structures.
+
+int icaltime_compare(struct icaltimetype a,struct icaltimetype b);
+
+The following routines convert between UTC and a named timezone. The
+tzid field must be a timezone name from the Olsen database, such as
+"America/Los_Angeles."
+
+The utc_offset routine returns the offset of the named time zone from
+UTC, in seconds.
+
+The tt parameter in the following routines indicates the date on which
+the conversion should be made. The tt parameter is necessary because
+timezones have many different rules for when daylight savings time
+is used, and these rules can change over time. So, for a single timezone
+one year may have daylight savings time on March 15, but for other
+years March 15 may be standard time, and some years may have standard
+time all year.
+
+int icaltime_utc_offset(struct icaltimetype tt, char* tzid);
+
+int icaltime_local_utc_offset();
+
+struct icaltimetype icaltime_as_utc(struct icaltimetype tt,char* tzid);
+
+struct icaltimetype icaltime_as_zone(struct icaltimetype tt,char* tzid);
+
+struct icaltimetype icaltime_as_local(struct icaltimetype tt);
+
+5.4 Storing Objects
+
+The libical distribution includes a separate library, libicalss, that
+allows you to store iCal component data to disk in a variety of ways.
+This library also includes code to implement the CSTP protocol of
+CAP and has some routines for deciphering incomming messages.
+
+The file storage routines are organized in an inheritance heirarchy
+that is rooted in icalset, with the derived class icalfileset and
+icaldirset. Icalfileset stores components to a file, while icaldirset
+stores components to multiple files, one per month based on DTSTAMP.
+Other storages classess, for storage to a heap or a mysql database
+are planned for the future.
+
+All of the icalset derived classes have the same interface:
+
+icaldirset* icaldirset_new(const char* path);
+
+void icaldirset_free(icaldirset* store);
+
+const char* icaldirset_path(icaldirset* store);
+
+void icaldirset_mark(icaldirset* store);
+
+icalerrorenum icaldirset_commit(icaldirset* store);
+
+icalerrorenum icaldirset_add_component(icaldirset* store, icalcomponent*
+comp);
+
+icalerrorenum icaldirset_remove_component(icaldirset* store, icalcomponent*
+comp);
+
+int icaldirset_count_components(icaldirset* store, icalcomponent_kind
+kind);
+
+icalerrorenum icaldirset_select(icaldirset* store, icalcomponent* gauge);
+
+void icaldirset_clear(icaldirset* store);
+
+icalcomponent* icaldirset_fetch(icaldirset* store, const char* uid);
+
+int icaldirset_has_uid(icaldirset* store, const char* uid);
+
+icalcomponent* icaldirset_fetch_match(icaldirset* set, icalcomponent
+*c);
+
+icalerrorenum icaldirset_modify(icaldirset* store, icalcomponent *oldc,
+icalcomponent *newc);
+
+icalcomponent* icaldirset_get_current_component(icaldirset* store);
+
+icalcomponent* icaldirset_get_first_component(icaldirset* store);
+
+icalcomponent* icaldirset_get_next_component(icaldirset* store);
+
+5.4.1 Creating a new set
+
+You can create a new set from either the base class or the direved
+class. From the base class use one of:
+
+icalset* icalset_new_file(const char* path);
+
+icalset* icalset_new_dir(const char* path);
+
+icalset* icalset_new_heap(void);
+
+icalset* icalset_new_mysql(const char* path);
+
+You can also create a new set based on the derived class, For instance,
+with icalfileset:
+
+icalfileset* icalfileset_new(const char* path);
+
+icalfileset* icalfileset_new_open(const char* path, int flags, mode_t
+mode);
+
+Icaset_new_file is identical to icalfileset_new. BOth routines will
+open an existing file for readinga and writing, or create a new file
+if it does not exist. Icalfilset_new_open takes the same arguments
+as the open() system routine and behaves in the same way.
+
+The icalset and icalfilset objects are somewhat interchangable -- you
+can use an icalfileset* as an argument to any of the icalset routines.
+
+The following examples will all use icalfileset routines; using the
+other icalset derived classess will be similar.
+
+5.4.2 Adding, Finding and Removing Components
+
+To add components to a set, use:
+
+icalerrorenum icalfileset_add_component(icalfileset* cluster, icalcomponent*
+child);
+
+The fileset keeps an inmemory copy of the components, and this set
+must be written back to the file ocassionally. There are two routines
+to manage this:
+
+void icalfileset_mark(icalfileset* cluster);
+
+icalerrorenum icalfileset_commit(icalfileset* cluster);
+
+Icalfileset_mark indicates that the in-memory components have changed.
+Calling the _add_component routine will call _mark automatically,
+but you may need to call it yourself if you have made a change to
+an existing component. The _commit routine writes the data base to
+disk, but only if it is marked. The _commit routine is called automatically
+when the icalfileset is freed.
+
+To iterate through the components in a set, use:
+
+icalcomponent* icalfileset_get_first_component(icalfileset* cluster);
+
+icalcomponent* icalfileset_get_next_component(icalfileset* cluster);
+
+icalcomponent* icalfileset_get_current_component (icalfileset* cluster);
+
+These routines work like the corresponding routines from icalcomponent,
+except that their output is filtered through a gauge. A gauge is a
+test for the properties within a components; only components that
+pass the test are returned. A gauge can be constructed from a MINSQL
+string with:
+
+icalgauge* icalgauge_new_from_sql(char* sql);
+
+Then, you can add the gauge to the set with :
+
+icalerrorenum icalfileset_select(icalfileset* store, icalgauge* gauge);
+
+Here is an example that puts all of these routines together:
+
+void test_fileset()
+
+{
+
+ icalfileset *fs;
+
+ icalcomponent *c;
+
+ int i;
+
+ char *path = "test_fileset.ics";
+
+ icalgauge *g = icalgauge_new_from_sql(
+
+ "SELECT * FROM VEVENT WHERE DTSTART > '20000103T120000Z' AND
+DTSTART <= '20000106T120000Z'");
+
+
+
+ fs = icalfileset_new(path);
+
+
+
+ for (i = 0; i!= 10; i++){
+
+ c = make_component(i); /* Make a new component where DTSTART
+has month of i */
+
+ icalfileset_add_component(fs,c);
+
+ }
+
+ icalfileset_commit(fs); /* Write to disk */
+
+ icalfileset_select(fs,g); /* Set the gauge to filter components
+*/
+
+
+
+ for (c = icalfileset_get_first_component(fs);
+
+ c != 0;
+
+ c = icalfileset_get_next_component(fs)){
+
+ struct icaltimetype t = icalcomponent_get_dtstart(c);
+
+
+
+ printf("%s\n",icaltime_as_ctime(t));
+
+ }
+
+ icalfileset_free(fs);
+
+}
+
+5.4.3 Other routines
+
+There are several other routines in the icalset interface, but they
+not fully implemented yet.
+
+5.5 <sec:memory>Memory Management
+
+Libical relies heavily on dynamic allocation for both the core objects
+and for the strings used to hold values. Some of this memory the library
+caller owns and must free, and some of the memory is managed by the
+library. Here is a summary of the memory rules.
+
+1) If the function name has "new" in it, the caller gets control
+ of the memory. ( such as icalcomponent_new(), or icalproperty_new_clone()
+ )
+
+2) If you got the memory from a routine with new in it, you must
+ call the corresponding *_free routine to free the memory. ( Use
+ icalcomponent_free() to free objects created with icalcomponent_new())
+
+3) If the function name has "add" in it, the caller is transferring
+ control of the memory to the routine. ( icalproperty_add_parameter() )
+
+4) If the function name has "remove" in it, the caller passes in
+ a pointer to an object and after the call returns, the caller owns
+ the object. So, before you call icalcomponent_remove_property(comp,foo),
+ you do not own "foo" and after the call returns, you do.
+
+5) If the routine returns a string, libical owns the memory and will
+ put it on a ring buffer to reclaim later. For example, icalcomponent_as_ical_string().
+ You'd better strdup() it if you want to keep it, and you don't have
+ to delete it.
+
+5.6 Error Handling
+
+Libical has several error handling mechanisms for the various types
+of programming, semantic and syntactic errors you may encounter.
+
+5.6.1 Return values
+
+Many library routines signal errors through their return values. All
+routines that return a pointer, such as icalcomponent_new(), will
+return 0 ( zero ) on a fatal error. Some routines will return a value
+of enum icalerrorenum.
+
+5.6.2 icalerrno
+
+Most routines will set the global error value icalerrno on errors.
+This variable is an enumeration; permissible values can be found in
+libical/icalerror.h. If the routine returns an enum icalerrorenum,
+then the return value will be the same as icalerrno. You can use icalerror_strerror()
+to get a string that describes the error. The enumerations are:
+
+* ICAL_BADARG_ERROR -- One of the argument to a routine was bad. Typically
+ for a null pointer.
+
+* ICAL_NEWFAILED_ERROR -- A new() or malloc() failed
+
+* ICAL_MALFORMEDDATA_ERROR -- An input string was not in the correct
+ format
+
+* ICAL_PARSE_ERROR -- The parser failed to parse an incomming component
+
+* ICAL_INTERNAL_ERROR -- Largely equivalent to an assert
+
+* ICAL_FILE_ERROR -- A file operation failed. Check errno for more
+ detail.
+
+* ICAL_ALLOCATION_ERROR -- ?
+
+* ICAL_USAGE_ERROR -- ?
+
+* ICAL_NO_ERROR -- No error
+
+* ICAL_MULTIPLEINCLUSION_ERROR -- ?
+
+* ICAL_TIMEDOUT_ERROR -- For CSTP and acquiring locks
+
+* ICAL_UNKNOWN_ERROR -- ?
+
+5.6.3 X-LIC-ERROR and X-LIC-INVALID-COMPONENT
+
+The library handles semantic and syntactic errors in components by
+inserting errors properties into the components. If the parser cannot
+parse incoming text ( a syntactic error ) or if the icalrestriction_check()
+routine indicates that the component does not meet the requirements
+of RFC2446 ( a semantic error) the library will insert properties
+of the type X-LIC-ERROR to describe the error. Here is an example
+of the error property:
+
+X-LIC-ERROR;X-LIC-ERRORTYPE=INVALID_ITIP :Failed iTIP restrictions
+for property DTSTART.
+
+Expected 1 instances of the property and got 0
+
+This error resulted from a call to icalrestriction_check(), which discovered
+that the component does not have a DTSTART property, as required by
+RFC2445.
+
+There are a few routines to manipulate error properties:
+
+[ The following data is supposed to be in a table. It looks OK in LyX,
+but does not format propertly in output. ]
+
++-------------------------------------+---------------------------------------------------------+
+| Routine | Purpose |
++-------------------------------------+---------------------------------------------------------+
+| void icalrestriction_check() | Check a component against RFC2446 and insert |
++-------------------------------------+---------------------------------------------------------+
+| | error properties to indicate non compliance |
++-------------------------------------+---------------------------------------------------------+
+| int icalcomponent_count_errors() | Return the number of error properties |
++-------------------------------------+---------------------------------------------------------+
+| | in a component |
++-------------------------------------+---------------------------------------------------------+
+| void icalcomponent_strip_errors() | Remove all error properties in as |
++-------------------------------------+---------------------------------------------------------+
+| | component |
++-------------------------------------+---------------------------------------------------------+
+| void icalcomponent_convert_errors() | Convert some error properties into |
++-------------------------------------+---------------------------------------------------------+
+| | REQUESTS-STATUS proprties to indicate the inability to |
++-------------------------------------+---------------------------------------------------------+
+| | process the component as an iTIP request. |
++-------------------------------------+---------------------------------------------------------+
+
+
+The types of errors are listed in icalerror.h. They are:
+
+ICAL_XLICERRORTYPE_COMPONENTPARSEERROR
+
+ICAL_XLICERRORTYPE_PARAMETERVALUEPARSEERROR
+
+ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR
+
+ICAL_XLICERRORTYPE_PROPERTYPARSEERROR
+
+ICAL_XLICERRORTYPE_VALUEPARSEERROR
+
+ICAL_XLICERRORTYPE_UNKVCALPROP
+
+ICAL_XLICERRORTYPE_INVALIDITIP
+
+The libical parser will generate the error that end in PARSEERROR when
+it encounters garbage in the input steam. ICAL_XLICERRORTYPE_INVALIDITIP
+is inserted by icalrestriction_check(), and ICAL_XLICERRORTYPE_UNKVCALPROP
+is generated by icalvcal_convert() when it encounters a vCal property
+that it cannot convert or does not know about.
+
+Icalcomponent_convert_errors() converts some of the error properties
+in a component into REQUEST-STATUS properties that indicate a failure.
+As of libical version0.18, this routine only convert *PARSEERROR errors
+and it always generates a 3.x ( failure ) code. This makes it more
+of a good idea than a really useful bit of code.
+
+5.6.4 ICAL_ERRORS_ARE_FATAL and icalerror_errors_are_fatal
+
+If the global variable icalerror_errors_are_fatal is set to 1, then
+any error condition will cause the program to abort. The abort occurs
+in icalerror_set_errno(), and is done with an assert(0) if NDEBUG
+is undefined, and with icalerror_crash_here if NDEBUG is defined.
+The default value of icalerror_errors_are_fatal is 1 when ICAL_ERRORS_ARE_FATAL
+is defined, and 0 otherwise. Since ICAL_ERRORS_ARE_FATAL is defined
+by default, icalerror_errors_are_fatal is also defined by default.
+
+5.7 Naming Standard
+
+Structures that you access with the "struct" keyword, such as "struct
+icaltimetype" are things that you are allowed to see inside and poke
+at.
+
+Structures that you access though a typedef, such as "icalcomponent"
+are things where all of the data is hidden.
+
+Component names that start with "V" are part of RFC 2445 or another
+iCal standard. Component names that start with "X" are also part of
+the spec, but they are not actually components in the spec. However,
+they look and act like components, so they are components in libical.
+Names that start with "XLIC" or "X-LIC" are not part of any iCal spec.
+They are used internally by libical.
+
+Enums that identify a component, property, value or parameter end with
+"_COMPONENT," "_PROPERTY," "_VALUE," or "_PARAMETER"s
+
+Enums that identify a parameter value have the name of the parameter
+as the second word. For instance: ICAL_ROLE_REQPARTICIPANT or ICAL_PARTSTAT_ACCEPTED.
+
+The enums for the parts of a recurarance rule and request statuses
+are irregular.
+
+6 Hacks and Bugs
+
+There are a lot of hacks in the library -- bits of code that I am not
+proud of and should probably be changed. These are marked with the
+comment string "HACK."
+
+7 Library Reference
+
+7.1 Manipulating struct icaltimetype
+
+7.1.1 Struct icaltimetype
+
+struct icaltimetype
+
+{
+
+ int year;
+
+ int month;
+
+ int day;
+
+ int hour;
+
+ int minute;
+
+ int second;
+
+ int is_utc;
+
+ int is_date;
+
+ const char* zone;
+
+};
diff --git a/libkcal/libical/examples/Makefile.am b/libkcal/libical/examples/Makefile.am
new file mode 100644
index 00000000..95076dba
--- /dev/null
+++ b/libkcal/libical/examples/Makefile.am
@@ -0,0 +1,16 @@
+
+noinst_PROGRAMS = doesnothing
+
+doesnothing_LDADD = ../src/libical/libical.la ../src/libicalss/libicalss.la ../src/libicalvcal/libicalvcal.la
+
+#LIBS = @PTHREAD_LIBS@
+
+INCLUDES = -I. -I../src/libical -I../src/libicalss -I../src/libicalvcal
+
+doesnothing_SOURCES = \
+ access_components.c \
+ access_properties_and_parameters.c \
+ errors.c \
+ main.c \
+ parse_text.c
+
diff --git a/libkcal/libical/examples/access_components.c b/libkcal/libical/examples/access_components.c
new file mode 100644
index 00000000..dc92b64a
--- /dev/null
+++ b/libkcal/libical/examples/access_components.c
@@ -0,0 +1,318 @@
+/* Access_component.c */
+
+#include "ical.h"
+
+#include <assert.h>
+#include <string.h> /* for strdup */
+#include <stdlib.h> /* for malloc */
+#include <stdio.h> /* for printf */
+#include <time.h> /* for time() */
+
+void do_something(icalcomponent *c);
+
+/* Creating iCal Components
+
+ There are two ways to create new component in libical. You can
+ build the component from primitive parts, or you can create it
+ from a string.
+
+ There are two variations of the API for building the component from
+ primitive parts. In the first variation, you add each parameter and
+ value to a property, and then add each property to a
+ component. This results in a long series of function calls. This
+ style is show in create_new_component()
+
+ The second variation uses vargs lists to nest many primitive part
+ constructors, resulting in a compact, neatly formated way to create
+ components. This style is shown in create_new_component_with_va_args()
+
+
+
+*/
+
+icalcomponent* create_new_component()
+{
+
+ /* variable definitions */
+ icalcomponent* calendar;
+ icalcomponent* event;
+ struct icaltimetype atime = icaltime_from_timet( time(0),0);
+ struct icalperiodtype rtime;
+ icalproperty* property;
+
+ /* Define a time type that will use as data later. */
+ rtime.start = icaltime_from_timet( time(0),0);
+ rtime.end = icaltime_from_timet( time(0),0);
+ rtime.end.hour++;
+
+ /* Create calendar and add properties */
+
+ calendar = icalcomponent_new(ICAL_VCALENDAR_COMPONENT);
+
+ /* Nearly every libical function call has the same general
+ form. The first part of the name defines the 'class' for the
+ function, and the first argument will be a pointer to a struct
+ of that class. So, icalcomponent_ functions will all take
+ icalcomponent* as their first argument. */
+
+ /* The next call creates a new proeprty and immediately adds it to the
+ 'calendar' component. */
+
+ icalcomponent_add_property(
+ calendar,
+ icalproperty_new_version("2.0")
+ );
+
+
+ /* Here is the short version of the memory rules:
+
+ If the routine name has "new" in it:
+ Caller owns the returned memory.
+ If you pass in a string, the routine takes the memory.
+
+ If the routine name has "add" in it:
+ The routine takes control of the component, property,
+ parameter or value memory.
+
+ If the routine returns a string ( "get" and "as_ical_string" )
+ The library owns the returned memory.
+
+ There are more rules, so refer to the documentation for more
+ details.
+
+ */
+
+ icalcomponent_add_property(
+ calendar,
+ icalproperty_new_prodid("-//RDU Software//NONSGML HandCal//EN")
+ );
+
+ /* Add an event */
+
+ event = icalcomponent_new(ICAL_VEVENT_COMPONENT);
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_dtstamp(atime)
+ );
+
+ /* In the previous call, atime is a struct, and it is passed in by value.
+ This is how all compound types of values are handled. */
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_uid("guid-1.host1.com")
+ );
+
+ /* add a property that has parameters */
+ property = icalproperty_new_organizer("mailto:mrbig@host.com");
+
+ icalproperty_add_parameter(
+ property,
+ icalparameter_new_role(ICAL_ROLE_CHAIR)
+ );
+
+ icalcomponent_add_property(event,property);
+
+ /* In this style of component creation, you need to use an extra
+ call to add parameters to properties, but the form of this
+ operation is the same as adding a property to a component */
+
+ /* add another property that has parameters */
+ property = icalproperty_new_attendee("mailto:employee-A@host.com");
+
+ icalproperty_add_parameter(
+ property,
+ icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT)
+ );
+
+ icalproperty_add_parameter(
+ property,
+ icalparameter_new_rsvp(1)
+ );
+
+ icalproperty_add_parameter(
+ property,
+ icalparameter_new_cutype(ICAL_CUTYPE_GROUP)
+ );
+
+ icalcomponent_add_property(event,property);
+
+
+ /* more properties */
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_description("Project XYZ Review Meeting")
+ );
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_categories("MEETING")
+ );
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_class(ICAL_CLASS_PUBLIC)
+ );
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_created(atime)
+ );
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_summary("XYZ Project Review")
+ );
+
+ property = icalproperty_new_dtstart(atime);
+
+ icalproperty_add_parameter(
+ property,
+ icalparameter_new_tzid("US-Eastern")
+ );
+
+ icalcomponent_add_property(event,property);
+
+
+ property = icalproperty_new_dtend(atime);
+
+ icalproperty_add_parameter(
+ property,
+ icalparameter_new_tzid("US-Eastern")
+ );
+
+ icalcomponent_add_property(event,property);
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_location("1CP Conference Room 4350")
+ );
+
+ icalcomponent_add_component(calendar,event);
+
+ return calendar;
+}
+
+
+/* Now, create the same component as in the previous routine, but use
+the constructor style. */
+
+icalcomponent* create_new_component_with_va_args()
+{
+
+ /* This is a similar set up to the last routine */
+ icalcomponent* calendar;
+ struct icaltimetype atime = icaltime_from_timet( time(0),0);
+ struct icalperiodtype rtime;
+
+ rtime.start = icaltime_from_timet( time(0),0);
+ rtime.end = icaltime_from_timet( time(0),0);
+ rtime.end.hour++;
+
+ /* Some of these routines are the same as those in the previous
+ routine, but we've also added several 'vanew' routines. These
+ 'vanew' routines take a list of properties, parameters or
+ values and add each of them to the parent property or
+ component. */
+
+ calendar =
+ icalcomponent_vanew(
+ ICAL_VCALENDAR_COMPONENT,
+ icalproperty_new_version("2.0"),
+ icalproperty_new_prodid("-//RDU Software//NONSGML HandCal//EN"),
+ icalcomponent_vanew(
+ ICAL_VEVENT_COMPONENT,
+ icalproperty_new_dtstamp(atime),
+ icalproperty_new_uid("guid-1.host1.com"),
+ icalproperty_vanew_organizer(
+ "mailto:mrbig@host.com",
+ icalparameter_new_role(ICAL_ROLE_CHAIR),
+ 0
+ ),
+ icalproperty_vanew_attendee(
+ "mailto:employee-A@host.com",
+ icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT),
+ icalparameter_new_rsvp(1),
+ icalparameter_new_cutype(ICAL_CUTYPE_GROUP),
+ 0
+ ),
+ icalproperty_new_description("Project XYZ Review Meeting"),
+
+ icalproperty_new_categories("MEETING"),
+ icalproperty_new_class(ICAL_CLASS_PUBLIC),
+ icalproperty_new_created(atime),
+ icalproperty_new_summary("XYZ Project Review"),
+ icalproperty_vanew_dtstart(
+ atime,
+ icalparameter_new_tzid("US-Eastern"),
+ 0
+ ),
+ icalproperty_vanew_dtend(
+ atime,
+ icalparameter_new_tzid("US-Eastern"),
+ 0
+ ),
+ icalproperty_new_location("1CP Conference Room 4350"),
+ 0
+ ),
+ 0
+ );
+
+
+ /* Note that properties with no parameters can use the regular
+ 'new' constructor, while those with parameters use the 'vanew'
+ constructor. And, be sure that the last argument in the 'vanew'
+ call is a zero. Without, your program will probably crash. */
+
+ return calendar;
+}
+
+
+void find_sub_components(icalcomponent* comp)
+{
+ icalcomponent *c;
+
+ /* The second parameter to icalcomponent_get_first_component
+ indicates the type of component to search for. This will
+ iterate through all sub-components */
+ for(c = icalcomponent_get_first_component(comp,ICAL_ANY_COMPONENT);
+ c != 0;
+ c = icalcomponent_get_next_component(comp,ICAL_ANY_COMPONENT)){
+
+ do_something(c);
+ }
+
+ /* This will iterate only though VEVENT sub-components */
+
+ for(c = icalcomponent_get_first_component(comp,ICAL_VEVENT_COMPONENT);
+ c != 0;
+ c = icalcomponent_get_next_component(comp,ICAL_VEVENT_COMPONENT)){
+
+ do_something(c);
+ }
+
+}
+
+/* Ical components only have one internal iterator, so removing the
+ object that the iterator points to can cause problems. Here is the
+ right way to remove components */
+
+void remove_vevent_sub_components(icalcomponent* comp){
+
+ icalcomponent *c, *next;
+
+ for( c = icalcomponent_get_first_component(comp,ICAL_VEVENT_COMPONENT);
+ c != 0;
+ c = next)
+ {
+ next = icalcomponent_get_next_component(comp,ICAL_VEVENT_COMPONENT);
+
+ icalcomponent_remove_component(comp,c);
+
+ do_something(c);
+ }
+
+}
+
diff --git a/libkcal/libical/examples/access_properties_and_parameters.c b/libkcal/libical/examples/access_properties_and_parameters.c
new file mode 100644
index 00000000..ba3d7fcc
--- /dev/null
+++ b/libkcal/libical/examples/access_properties_and_parameters.c
@@ -0,0 +1,144 @@
+/* access_properties_and_parameters.c */
+
+#include "ical.h"
+#include <string.h>
+
+/* Get a particular parameter out of a component. This routine will
+ return a list of strings of all attendees who are required. Note
+ that this routine assumes that the component that we pass in is a
+ VEVENT. */
+
+void get_required_attendees(icalcomponent* event)
+{
+ icalproperty* p;
+ icalparameter* parameter;
+
+ assert(event != 0);
+ assert(icalcomponent_isa(event) == ICAL_VEVENT_COMPONENT);
+
+ /* This loop iterates over all of the ATTENDEE properties in the
+ event */
+
+ /* The iteration routines save their state in the event
+ struct, so the are not thread safe unless you lock the whole
+ component. */
+
+ for(
+ p = icalcomponent_get_first_property(event,ICAL_ATTENDEE_PROPERTY);
+ p != 0;
+ p = icalcomponent_get_next_property(event,ICAL_ATTENDEE_PROPERTY)
+ ) {
+
+ /* Get the first ROLE parameter in the property. There should
+ only be one, so we won't bother to iterate over them. But,
+ you can iterate over parameters just like with properties */
+
+ parameter = icalproperty_get_first_parameter(p,ICAL_ROLE_PARAMETER);
+
+ /* If the parameter indicates the participant is required, get
+ the attendees name and stick a copy of it into the output
+ array */
+
+ if ( icalparameter_get_role(parameter) == ICAL_ROLE_REQPARTICIPANT)
+ {
+ /* Remember, the caller does not own this string, so you
+ should strdup it if you want to change it. */
+ const char *attendee = icalproperty_get_attendee(p);
+ }
+ }
+
+}
+
+/* Here is a similar example. If an attendee has a PARTSTAT of
+ NEEDSACTION or has no PARTSTAT parameter, change it to
+ TENTATIVE. */
+
+void update_attendees(icalcomponent* event)
+{
+ icalproperty* p;
+ icalparameter* parameter;
+
+ assert(event != 0);
+ assert(icalcomponent_isa(event) == ICAL_VEVENT_COMPONENT);
+
+ for(
+ p = icalcomponent_get_first_property(event,ICAL_ATTENDEE_PROPERTY);
+ p != 0;
+ p = icalcomponent_get_next_property(event,ICAL_ATTENDEE_PROPERTY)
+ ) {
+
+ parameter = icalproperty_get_first_parameter(p,ICAL_PARTSTAT_PARAMETER);
+
+ if (parameter == 0) {
+
+ /* There was no PARTSTAT parameter, so add one. */
+ icalproperty_add_parameter(
+ p,
+ icalparameter_new_partstat(ICAL_PARTSTAT_TENTATIVE)
+ );
+
+ } else if (icalparameter_get_partstat(parameter) == ICAL_PARTSTAT_NEEDSACTION) {
+ /* Remove the NEEDSACTION parameter and replace it with
+ TENTATIVE */
+
+ icalproperty_remove_parameter(p,ICAL_PARTSTAT_PARAMETER);
+
+ /* Don't forget to free it */
+ icalparameter_free(parameter);
+
+ /* Add a new one */
+ icalproperty_add_parameter(
+ p,
+ icalparameter_new_partstat(ICAL_PARTSTAT_TENTATIVE)
+ );
+ }
+
+ }
+}
+
+/* Here are some examples of manipulating properties */
+
+void test_properties()
+{
+ icalproperty *prop;
+ icalparameter *param;
+ icalvalue *value;
+
+ icalproperty *clone;
+
+ /* Create a new property */
+ prop = icalproperty_vanew_comment(
+ "Another Comment",
+ icalparameter_new_cn("A Common Name 1"),
+ icalparameter_new_cn("A Common Name 2"),
+ icalparameter_new_cn("A Common Name 3"),
+ icalparameter_new_cn("A Common Name 4"),
+ 0);
+
+ /* Iterate through all of the parameters in the property */
+ for(param = icalproperty_get_first_parameter(prop,ICAL_ANY_PARAMETER);
+ param != 0;
+ param = icalproperty_get_next_parameter(prop,ICAL_ANY_PARAMETER)) {
+
+ printf("Prop parameter: %s\n",icalparameter_get_cn(param));
+ }
+
+ /* Get a string representation of the property's value */
+ printf("Prop value: %s\n",icalproperty_get_comment(prop));
+
+ /* Spit out the property in its RFC 2445 representation */
+ printf("As iCAL string:\n %s\n",icalproperty_as_ical_string(prop));
+
+ /* Make a copy of the property. Caller owns the memory */
+ clone = icalproperty_new_clone(prop);
+
+ /* Get a reference to the value within the clone property */
+ value = icalproperty_get_value(clone);
+
+ printf("Value: %s",icalvalue_as_ical_string(value));
+
+ /* Free the original and the clone */
+ icalproperty_free(clone);
+ icalproperty_free(prop);
+
+}
diff --git a/libkcal/libical/examples/errors.c b/libkcal/libical/examples/errors.c
new file mode 100644
index 00000000..86d963bd
--- /dev/null
+++ b/libkcal/libical/examples/errors.c
@@ -0,0 +1,70 @@
+/* errors.c */
+
+#include "ical.h"
+#include <stdio.h>
+
+void program_errors()
+{
+ /*Most routines will set icalerrno on errors. This is an
+ enumeration defined in icalerror.h */
+
+ icalcomponent *c;
+
+ icalerror_clear_errno();
+
+ c = icalcomponent_new(ICAL_VEVENT_COMPONENT);
+
+ if (icalerrno != ICAL_NO_ERROR){
+
+ fprintf(stderr,"Horrible libical error: %s\n",
+ icalerror_strerror(icalerrno));
+
+ }
+
+}
+
+void component_errors(icalcomponent *comp)
+{
+ int errors;
+ icalproperty *p;
+
+ /* presume that we just got this component from the parser */
+
+ errors = icalcomponent_count_errors(comp);
+
+ printf("This component has %d parsing errors\n", errors);
+
+ /* Print out all of the parsing errors. This is not strictly
+ correct, because it does not descend into any sub-components,
+ as icalcomponent_count_errors() does. */
+
+ for(p = icalcomponent_get_first_property(comp,ICAL_XLICERROR_PROPERTY);
+ p != 0;
+ p = icalcomponent_get_next_property(comp,ICAL_XLICERROR_PROPERTY))
+ {
+
+ printf("-- The error is %s:\n",icalproperty_get_xlicerror(p));
+ }
+
+
+
+ /* Check the component for iTIP compilance, and add more
+ X-LIC-ERROR properties if it is non-compilant. */
+ icalrestriction_check(comp);
+
+
+ /* Count the new errors. */
+ if(errors != icalcomponent_count_errors(comp)){
+ printf(" -- The component also has iTIP restriction errors \n");
+ }
+
+ /* Since there are iTIP restriction errors, it may be impossible
+ to process this component as an iTIP request. In this case, the
+ X-LIC-ERROR proeprties should be expressed as REQUEST-STATUS
+ properties in the reply. This following routine makes this
+ conversion */
+
+
+ icalcomponent_convert_errors(comp);
+
+}
diff --git a/libkcal/libical/examples/main.c b/libkcal/libical/examples/main.c
new file mode 100644
index 00000000..1be2de5c
--- /dev/null
+++ b/libkcal/libical/examples/main.c
@@ -0,0 +1,12 @@
+/* This is just to make the code in the example directory link properly. */
+#include "ical.h"
+
+int main()
+{
+
+ return 1;
+}
+
+
+void do_something(icalcomponent* comp){
+}
diff --git a/libkcal/libical/examples/parse_text.c b/libkcal/libical/examples/parse_text.c
new file mode 100644
index 00000000..b7eba43b
--- /dev/null
+++ b/libkcal/libical/examples/parse_text.c
@@ -0,0 +1,68 @@
+/* parse_text.c
+
+ */
+#include <stdio.h>
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include "ical.h"
+
+#include <stdlib.h>
+
+/* The icalparser_get_line routine will create a single *content* line
+out of one or more input lines. The content line is all of the
+properties and values for a single property, and it can span several
+input lines. So, icalparser_get_line will need to be able to get more
+data on its own. Read_string is a routine that does this. You can
+write your own version of read stream to get data from other types of
+files, sockets, etc. */
+
+char* read_stream(char *s, size_t size, void *d)
+{
+ char *c = fgets(s,size, (FILE*)d);
+
+ return c;
+
+}
+
+void parse_text(int argc, char* argv[])
+{
+
+ char* line;
+ FILE* stream;
+ icalcomponent *c;
+
+ /* Create a new parser object */
+ icalparser *parser = icalparser_new();
+
+ stream = fopen(argv[1],"r");
+
+ assert(stream != 0);
+
+ /* Tell the parser what input routie it should use. */
+ icalparser_set_gen_data(parser,stream);
+
+ do{
+
+ /* Get a single content line by making one or more calls to
+ read_stream()*/
+ line = icalparser_get_line(parser,read_stream);
+
+ /* Now, add that line into the parser object. If that line
+ completes a component, c will be non-zero */
+ c = icalparser_add_line(parser,line);
+
+
+ if (c != 0){
+ printf("%s",icalcomponent_as_ical_string(c));
+
+ printf("\n---------------\n");
+
+ icalcomponent_free(c);
+ }
+
+ } while ( line != 0);
+
+
+ icalparser_free(parser);
+}
diff --git a/libkcal/libical/scripts/Makefile.am b/libkcal/libical/scripts/Makefile.am
new file mode 100644
index 00000000..47ce3e6e
--- /dev/null
+++ b/libkcal/libical/scripts/Makefile.am
@@ -0,0 +1,9 @@
+EXTRA_DIST = \
+mkderivedcomponents.pl \
+mkderivedparameters.pl \
+mkderivedproperties.pl \
+mkderivedvalues.pl \
+mkparameterrestrictions.pl \
+mkrestrictionrecords.pl \
+mkrestrictiontable.pl \
+readvaluesfile.pl
diff --git a/libkcal/libical/scripts/mkderivedcomponents.pl b/libkcal/libical/scripts/mkderivedcomponents.pl
new file mode 100755
index 00000000..31743c3b
--- /dev/null
+++ b/libkcal/libical/scripts/mkderivedcomponents.pl
@@ -0,0 +1,170 @@
+#!/usr/bin/env perl
+
+use Getopt::Std;
+getopts('chspi:');
+
+
+# ARG 0 is components.txt
+open(PV,"$ARGV[0]") || die "Can't open components file $ARGV[0]:$!";
+
+my @components;
+
+while (<PV>){
+
+ s/#.*//;
+
+ chop;
+
+ push(@components,$_);
+
+}
+
+close PV;
+
+# Write the file inline by copying everything before a demarcation
+# line, and putting the generated data after the demarcation
+
+if ($opt_i) {
+
+ open(IN,$opt_i) || die "Can't open input file \"$opt_i\"";
+
+ while(<IN>){
+
+ if (/Do not edit/){
+ last;
+ }
+
+ print;
+
+ }
+
+ if($opt_i){
+ print "# Everything below this line is machine generated. Do not edit. \n";
+ } else {
+ print "/* Everything below this line is machine generated. Do not edit. */\n";
+ }
+
+}
+
+if ($opt_c or $opt_h and !$opt_i){
+
+print <<EOM;
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icalderivedproperties.{c,h}
+ CREATOR: eric 09 May 1999
+
+ \044Id:\044
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.0 (the "License"); you may not use this file except in
+ compliance with the License. You may obtain a copy of the License at
+ http://www.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+
+ ======================================================================*/
+
+/*
+ * THIS FILE IS MACHINE GENERATED DO NOT EDIT
+ */
+
+#include <stdarg.h> /* for va_arg functions */
+
+EOM
+
+}
+
+if ($opt_p and !$opt_i){
+
+print <<EOM;
+
+EOM
+
+}
+
+
+foreach $comp (@components) {
+
+ next if !$comp;
+
+ my $ucf = join("",map {ucfirst(lc($_));} split(/-/,$comp));
+ my $lc = lc($ucf);
+ my $uc = uc($lc);
+
+ if($opt_c) { # Make C source
+ print<<EOM;
+
+/* $comp */
+
+icalcomponent* icalcomponent_new_${lc}()
+{
+ return (icalcomponent*)icalcomponent_new_impl(ICAL_${uc}_COMPONENT);
+}
+
+icalcomponent* icalcomponent_vanew_${lc}(...)
+{
+ va_list args;
+ struct icalcomponent_impl *impl = icalcomponent_new_impl(ICAL_${uc}_component);
+
+ va_start(args,v);
+ icalcomponent_add_properties(impl, args);
+ va_end(args);
+
+ return (icalcomponent*)impl;
+}
+
+EOM
+
+
+ } elsif ($opt_h) { # Make a C header
+ print<<EOM;
+
+/* $comp */
+icalcomponent* icalcomponent_new_${lc}();
+icalcomponent* icalcomponent_vanew_${lc}(...);
+EOM
+
+} elsif ($opt_s) { # Make something for a switch statement
+
+print <<EOM;
+case ICAL_${uc}_PROPERTY:
+EOM
+
+} elsif ($opt_p) { # make perl source
+
+print <<EOM;
+
+# $comp
+package Net::ICal::Component::${ucf};
+\@ISA=qw(Net::ICal::Component);
+
+sub new
+{
+ my \$package = shift;
+ my \$c = Net::ICal::icalcomponent_new(\$Net::ICal::ICAL_${uc}_COMPONENT);
+
+ my \$self = Net::ICal::Component::new_from_ref(\$c);
+ Net::ICal::Component::_add_elements(\$self,\\\@_);
+
+ # Self is blessed in new_from_ref
+
+ return \$self;
+
+}
+EOM
+
+}
+
+
+
+}
+
+
diff --git a/libkcal/libical/scripts/mkderivedparameters.pl b/libkcal/libical/scripts/mkderivedparameters.pl
new file mode 100755
index 00000000..9e8f92cd
--- /dev/null
+++ b/libkcal/libical/scripts/mkderivedparameters.pl
@@ -0,0 +1,332 @@
+#!/usr/bin/env perl
+
+require "readvaluesfile.pl";
+
+use Getopt::Std;
+getopts('chspi:');
+
+%no_xname = (RELATED=>1,RANGE=>1,RSVP=>1,XLICERRORTYPE=>1,XLICCOMPARETYPE=>1);
+
+%params = read_parameters_file($ARGV[0]);
+
+
+# Write the file inline by copying everything before a demarcation
+# line, and putting the generated data after the demarcation
+
+if ($opt_i) {
+
+ open(IN,$opt_i) || die "Can't open input file $opt_i";
+
+ while(<IN>){
+ if (/<insert_code_here>/){
+ insert_code();
+ } else {
+ print;
+ }
+
+ }
+
+ if($opt_p){
+ print "# Everything below this line is machine generated. Do not edit. \n";
+ } else {
+ print "/* Everything below this line is machine generated. Do not edit. */\n";
+ }
+
+}
+
+sub insert_code
+{
+
+# Write parameter enumerations and datatypes
+
+if($opt_h){
+ print "typedef enum icalparameter_kind {\n ICAL_ANY_PARAMETER = 0,\n";
+ foreach $param (sort keys %params) {
+
+ next if !$param;
+
+ next if $param eq 'NO' or $param eq 'ANY';
+
+ my $uc = join("",map {uc($_);} split(/-/,$param));
+
+ my @enums = @{$params{$param}->{'enums'}};
+
+ print " ICAL_${uc}_PARAMETER, \n";
+
+ }
+ print " ICAL_NO_PARAMETER\n} icalparameter_kind;\n\n";
+
+ # Now create enumerations for parameter values
+ $idx = 20000;
+
+ print "#define ICALPARAMETER_FIRST_ENUM $idx\n\n";
+
+ foreach $param (sort keys %params) {
+
+ next if !$param;
+
+ next if $param eq 'NO' or $prop eq 'ANY';
+
+ my $type = $params{$param}->{"C"};
+ my $ucv = join("",map {uc(lc($_));} split(/-/,$param));
+ my @enums = @{$params{$param}->{'enums'}};
+
+ if(@enums){
+
+ print "typedef enum $type {\n";
+ my $first = 1;
+
+ unshift(@enums,"X");
+
+ push(@enums,"NONE");
+
+ foreach $e (@enums) {
+ if (!$first){
+ print ",\n";
+ } else {
+ $first = 0;
+ }
+
+ my $uce = join("",map {uc(lc($_));} split(/-/,$e));
+
+ print " ICAL_${ucv}_${uce} = $idx";
+
+ $idx++;
+ }
+ $c_type =~ s/enum //;
+
+ print "\n} $type;\n\n";
+ }
+ }
+
+ print "#define ICALPARAMETER_LAST_ENUM $idx\n\n";
+
+}
+
+if ($opt_c){
+
+
+ # Create the icalparameter_value to icalvalue_kind conversion table
+ my $count = 0;
+ my $out;
+
+ foreach $enum (@{$params{'VALUE'}->{'enums'}}){
+ next if $enum eq 'NO' or $enum eq 'ERROR';
+ $uc = join("",map {uc(lc($_));} split(/-/,$enum));
+ $out.=" {ICAL_VALUE_${uc},ICAL_${uc}_VALUE},\n";
+ $count++;
+ }
+
+ $count+=2;
+ print "struct icalparameter_value_kind_map value_kind_map[$count] = {\n";
+ print $out;
+ print " {ICAL_VALUE_X,ICAL_X_VALUE},\n";
+ print " {ICAL_VALUE_NONE,ICAL_NO_VALUE}\n};\n\n";
+
+ #Create the parameter Name map
+
+ $out="";
+ $count=0;
+ foreach $param (sort keys %params) {
+
+ next if !$param;
+
+ next if $param eq 'NO' or $prop eq 'ANY';
+
+ my $lc = join("",map {lc($_);} split(/-/,$param));
+ my $uc = join("",map {uc(lc($_));} split(/-/,$param));
+
+ $count++;
+ $out.=" {ICAL_${uc}_PARAMETER,\"$param\"},\n";
+
+ }
+ $count+=1;
+ print "struct icalparameter_kind_map parameter_map[$count] = { \n";
+ print $out;
+ print " { ICAL_NO_PARAMETER, \"\"}\n};\n\n";
+
+ # Create the parameter value map
+ $out ="";
+ $count=0;
+ foreach $param (sort keys %params) {
+
+ next if !$param;
+
+ next if $param eq 'NO' or $prop eq 'ANY';
+
+ my $type = $params{$param}->{"C"};
+ my $uc = join("",map {uc(lc($_));} split(/-/,$param));
+ my @enums = @{$params{$param}->{'enums'}};
+
+ if(@enums){
+
+ foreach $e (@enums){
+ my $uce = join("",map {uc(lc($_));} split(/-/,$e));
+
+ $count++;
+ $out.=" {ICAL_${uc}_PARAMETER,ICAL_${uc}_${uce},\"$e\"},\n";
+ }
+
+ }
+ }
+
+ $count+=3;
+ print "struct icalparameter_map icalparameter_map[] = {\n";
+ print "{ICAL_ANY_PARAMETER,0,\"\"},\n";
+ print $out;
+ print " {ICAL_NO_PARAMETER,0,\"\"}};\n\n";
+
+}
+
+foreach $param (keys %params){
+
+ my $type = $params{$param}->{'C'};
+
+ my $ucf = join("",map {ucfirst(lc($_));} split(/-/,$param));
+
+ my $lc = lc($ucf);
+ my $uc = uc($lc);
+
+ my $charorenum;
+ my $set_code;
+ my $pointer_check;
+ my $pointer_check_v;
+ my $xrange;
+
+ if ($type=~/char/ ) {
+
+ $charorenum = " icalerror_check_arg_rz( (param!=0), \"param\");\n return param->string;";
+
+ $set_code = "((struct icalparameter_impl*)param)->string = icalmemory_strdup(v);";
+
+ $pointer_check = "icalerror_check_arg_rz( (v!=0),\"v\");";
+ $pointer_check_v = "icalerror_check_arg_rv( (v!=0),\"v\");";
+
+ } else {
+
+ $xrange =" if (param->string != 0){\n return ICAL_${uc}_X;\n }\n" if !exists $no_xname{$uc};
+
+ $charorenum= "icalerror_check_arg( (param!=0), \"param\");\n$xrange\nreturn ($type)(param->data);";
+
+ $pointer_check = "icalerror_check_arg_rz(v >= ICAL_${uc}_X,\"v\");\n icalerror_check_arg_rz(v < ICAL_${uc}_NONE,\"v\");";
+
+ $pointer_check_v = "icalerror_check_arg_rv(v >= ICAL_${uc}_X,\"v\");\n icalerror_check_arg_rv(v < ICAL_${uc}_NONE,\"v\");";
+
+ $set_code = "((struct icalparameter_impl*)param)->data = (int)v;";
+
+ }
+
+
+
+ if ($opt_c) {
+
+ print <<EOM;
+/* $param */
+icalparameter* icalparameter_new_${lc}($type v)
+{
+ struct icalparameter_impl *impl;
+ icalerror_clear_errno();
+ $pointer_check
+ impl = icalparameter_new_impl(ICAL_${uc}_PARAMETER);
+ if (impl == 0) {
+ return 0;
+ }
+
+ icalparameter_set_${lc}((icalparameter*) impl,v);
+ if (icalerrno != ICAL_NO_ERROR) {
+ icalparameter_free((icalparameter*) impl);
+ return 0;
+ }
+
+ return (icalparameter*) impl;
+}
+
+${type} icalparameter_get_${lc}(const icalparameter* param)
+{
+ icalerror_clear_errno();
+$charorenum
+}
+
+void icalparameter_set_${lc}(icalparameter* param, ${type} v)
+{
+ $pointer_check_v
+ icalerror_check_arg_rv( (param!=0), "param");
+ icalerror_clear_errno();
+
+ $set_code
+}
+
+EOM
+
+ } elsif( $opt_h) {
+
+ print <<EOM;
+/* $param */
+icalparameter* icalparameter_new_${lc}($type v);
+${type} icalparameter_get_${lc}(const icalparameter* value);
+void icalparameter_set_${lc}(icalparameter* value, ${type} v);
+
+EOM
+
+}
+
+if ($opt_p) {
+
+ print <<EOM;
+
+# $param
+
+package Net::ICal::Parameter::${ucf};
+\@ISA=qw(Net::ICal::Parameter);
+
+sub new
+{
+ my \$self = [];
+ my \$package = shift;
+ my \$value = shift;
+
+ bless \$self, \$package;
+
+ my \$p;
+
+ if (\$value) {
+ \$p = Net::ICal::icalparameter_new_from_string(\$Net::ICal::ICAL_${uc}_PARAMETER,\$value);
+ } else {
+ \$p = Net::ICal::icalparameter_new(\$Net::ICal::ICAL_${uc}_PARAMETER);
+ }
+
+ \$self->[0] = \$p;
+
+ return \$self;
+}
+
+sub get
+{
+ my \$self = shift;
+ my \$impl = \$self->_impl();
+
+ return Net::ICal::icalparameter_as_ical_string(\$impl);
+
+}
+
+sub set
+{
+ # This is hard to implement, so I've punted for now.
+ die "Set is not implemented";
+}
+
+EOM
+
+}
+
+}
+
+if ($opt_h){
+
+print <<EOM;
+#endif /*ICALPARAMETER_H*/
+
+EOM
+}
+
+}
diff --git a/libkcal/libical/scripts/mkderivedproperties.pl b/libkcal/libical/scripts/mkderivedproperties.pl
new file mode 100755
index 00000000..4eafb192
--- /dev/null
+++ b/libkcal/libical/scripts/mkderivedproperties.pl
@@ -0,0 +1,258 @@
+#!/usr/bin/env perl
+
+require "readvaluesfile.pl";
+
+use Getopt::Std;
+getopts('chspmi:');
+
+# ARG 0 is properties.csv
+%propmap = read_properties_file($ARGV[0]);
+
+# ARG 1 is value-types.txt
+%valuemap = read_values_file($ARGV[1]);
+
+
+$include_vanew = 1;
+
+# Write the file inline by copying everything before a demarcation
+# line, and putting the generated data after the demarcation
+
+if ($opt_i) {
+
+ open(IN,$opt_i) || die "Can't open input file $opt_i";
+
+ while(<IN>){
+
+ if (/<insert_code_here>/){
+ insert_code();
+ } else {
+ print;
+ }
+
+ }
+
+}
+
+sub fudge_data {
+ my $prop = shift;
+
+ my $value = $propmap{$prop}->{'lic_value'};
+
+ if (!$value){
+ die "Can't find value for property \"$prop\"\n";
+ }
+ my $ucf = join("",map {ucfirst(lc($_));} split(/-/,$prop));
+ my $lc = lc($ucf);
+ my $uc = uc($lc);
+
+ my $ucfvalue = join("",map {ucfirst(lc($_));} split(/-/,$value));
+ my $lcvalue = lc($ucfvalue);
+ my $ucvalue = uc($lcvalue);
+
+ my $type = $valuemap{$value}->{C}->[1];
+
+ return ($uc,$lc,$lcvalue,$ucvalue,$type);
+
+}
+
+sub insert_code {
+
+# Create the property map data
+if($opt_c){
+
+
+ my @props = sort keys %propmap;
+ my $count = scalar(@props);
+
+
+ print "struct icalproperty_map property_map[$count] = {\n";
+
+ foreach $prop (@props) {
+
+ next if !$prop;
+
+ next if $prop eq 'NO';
+
+ my ($uc,$lc,$lcvalue,$ucvalue,$type) = fudge_data($prop);
+
+ print "{ICAL_${uc}_PROPERTY,\"$prop\",ICAL_${ucvalue}_VALUE},\n";
+
+ }
+
+ $prop = "NO";
+
+ my ($uc,$lc,$lcvalue,$ucvalue,$type) = fudge_data($prop);
+
+ print "{ICAL_${uc}_PROPERTY,\"\",ICAL_NO_VALUE}};\n\n";
+
+ $idx = 10000;
+ $count = 1;
+ my $out = "";
+
+ foreach $value (sort keys %valuemap) {
+
+ next if !$value;
+ next if $value eq 'NO' or $prop eq 'ANY';
+
+ my $ucv = join("",map {uc(lc($_));} split(/-/,$value));
+ my @enums = @{$valuemap{$value}->{'enums'}};
+
+ if(@enums){
+
+ my ($c_autogen,$c_type) = @{$valuemap{$value}->{'C'}};
+
+ unshift(@enums,"X");
+ push(@enums,"NONE");
+
+ foreach $e (@enums) {
+
+ my $uce = join("",map {uc(lc($_));} split(/-/,$e));
+
+ if($e ne "X" and $e ne "NONE"){
+ $str = $e;
+ } else {
+ $str = "";
+ }
+
+ $out.=" {ICAL_${ucv}_PROPERTY,ICAL_${ucv}_${uce},\"$str\" }, /*$idx*/\n";
+
+ $idx++;
+ $count++;
+ }
+
+ }
+ }
+
+ $count++;
+ print "struct icalproperty_enum_map enum_map[$count] = {\n";
+ print $out;
+ print " {ICAL_NO_PROPERTY,0,\"\"}\n};\n\n";
+
+
+
+}
+
+
+if($opt_h){
+
+ # Create the property enumerations list
+ print "typedef enum icalproperty_kind {\n ICAL_ANY_PROPERTY = 0,\n";
+ foreach $prop (sort keys %propmap) {
+
+ next if !$prop;
+
+ next if $prop eq 'NO' or $prop eq 'ANY';
+
+ my ($uc,$lc,$lcvalue,$ucvalue,$type) = fudge_data($prop);
+
+ print " ICAL_${uc}_PROPERTY, \n";
+
+ }
+ print " ICAL_NO_PROPERTY\n} icalproperty_kind;\n\n";
+
+
+}
+
+
+foreach $prop (sort keys %propmap) {
+
+ next if !$prop;
+
+ next if $prop eq 'NO' or $prop eq 'ANY';
+
+ my ($uc,$lc,$lcvalue,$ucvalue,$type) = fudge_data($prop);
+
+
+ my $pointer_check;
+ if ($type =~ /\*/){
+ $pointer_check = "icalerror_check_arg_rz( (v!=0),\"v\");\n" if $type =~ /\*/;
+ } elsif ( $type eq "void" ){
+ $pointer_check = "icalerror_check_arg_rv( (v!=0),\"v\");\n" if $type =~ /\*/;
+
+ }
+
+ my $set_pointer_check = "icalerror_check_arg_rv( (v!=0),\"v\");\n" if $type =~ /\*/;
+
+ if($opt_c) { # Generate C source
+
+ if ($include_vanew) {
+ print<<EOM;
+icalproperty* icalproperty_vanew_${lc}($type v, ...){
+ va_list args;
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_${uc}_PROPERTY); $pointer_check
+ icalproperty_set_${lc}((icalproperty*)impl,v);
+ va_start(args,v);
+ icalproperty_add_parameters(impl, args);
+ va_end(args);
+ return (icalproperty*)impl;
+}
+EOM
+}
+ print<<EOM;
+
+/* $prop */
+icalproperty* icalproperty_new_${lc}($type v) {
+ struct icalproperty_impl *impl = icalproperty_new_impl(ICAL_${uc}_PROPERTY); $pointer_check
+ icalproperty_set_${lc}((icalproperty*)impl,v);
+ return (icalproperty*)impl;
+}
+
+EOM
+ # Allow DTSTART, DTEND, DUE, EXDATE and RECURRENCE-ID to take DATE values.
+ if ($lc eq "dtstart" || $lc eq "dtend" || $lc eq "due" || $lc eq "exdate"
+ || $lc eq "recurrenceid") {
+ print<<EOM;
+void icalproperty_set_${lc}(icalproperty* prop, $type v){
+ icalvalue *value;
+ $set_pointer_check
+ icalerror_check_arg_rv( (prop!=0),"prop");
+ if (v.is_date)
+ value = icalvalue_new_date(v);
+ else
+ value = icalvalue_new_datetime(v);
+ icalproperty_set_value(prop,value);
+}
+EOM
+ } else {
+
+ print<<EOM;
+void icalproperty_set_${lc}(icalproperty* prop, $type v){
+ $set_pointer_check
+ icalerror_check_arg_rv( (prop!=0),"prop");
+ icalproperty_set_value(prop,icalvalue_new_${lcvalue}(v));
+}
+EOM
+ }
+ print<<EOM;
+$type icalproperty_get_${lc}(const icalproperty* prop){
+ icalerror_check_arg( (prop!=0),"prop");
+ return icalvalue_get_${lcvalue}(icalproperty_get_value(prop));
+}
+EOM
+ } elsif ($opt_h) { # Generate C Header file
+
+
+ print "\
+/* $prop */\
+icalproperty* icalproperty_new_${lc}($type v);\
+void icalproperty_set_${lc}(icalproperty* prop, $type v);\
+$type icalproperty_get_${lc}(const icalproperty* prop);";
+
+
+if ($include_vanew){
+ print "icalproperty* icalproperty_vanew_${lc}($type v, ...);\n";
+}
+
+}
+
+
+} # This brace terminates the main loop
+
+
+
+if ($opt_h){
+
+print "\n\n#endif /*ICALPROPERTY_H*/\n"
+}
+
+}
diff --git a/libkcal/libical/scripts/mkderivedvalues.pl b/libkcal/libical/scripts/mkderivedvalues.pl
new file mode 100755
index 00000000..fef659c3
--- /dev/null
+++ b/libkcal/libical/scripts/mkderivedvalues.pl
@@ -0,0 +1,236 @@
+#!/usr/bin/perl
+
+use lib '.';
+
+require 'readvaluesfile.pl';
+
+use Getopt::Std;
+getopts('chi:');
+
+ #Options
+ # c -> generate c code file
+ # h-> generate header file
+
+ # Open with value-types.txt
+
+my %h = read_values_file($ARGV[0]);
+
+
+ # Write the file inline by copying everything before a demarcation
+ # line, and putting the generated data after the demarcation
+
+if ($opt_i) {
+
+ open(IN,$opt_i) || die "Can't open input file $opt_i";
+
+ while(<IN>){
+ if (/<insert_code_here>/){
+ insert_code();
+ } else {
+ print;
+ }
+
+
+ }
+}
+
+sub insert_code
+{
+ # Map type names to the value in the icalvalue_impl data union */
+
+%union_map = (
+ BOOLEAN => 'int',
+ CALADDRESS=>'string',
+ DATE=>'time',
+ DATETIME=>'time',
+ DATETIMEDATE=>'time',
+ DATETIMEPERIOD=>'period',
+ DURATION=>'duration',
+ INTEGER=>'int',
+ TEXT=>'string',
+ URI=>'string',
+ UTCOFFSET=>'int',
+ QUERY=>'string',
+ BINARY=>'string',
+ X=>'string'
+ );
+
+
+if($opt_h){
+
+ # First print out the value enumerations
+ $idx = 5000;
+ print "typedef enum icalvalue_kind {\n";
+ print " ICAL_ANY_VALUE=$idx,\n";
+
+ foreach $value (keys %h) {
+
+ $idx++;
+ my $ucv = join("",map {uc(lc($_));} split(/-/,$value));
+
+ next if $value eq "NO";
+
+ print " ICAL_${ucv}_VALUE=$idx,\n";
+ }
+
+ $idx++;
+ print " ICAL_NO_VALUE=$idx\n} icalvalue_kind ;\n\n";
+
+ # Now create enumerations for property values
+ $idx = 10000;
+
+ print "#define ICALPROPERTY_FIRST_ENUM $idx\n\n";
+
+ foreach $value (sort keys %h) {
+
+ next if !$value;
+
+ next if $value eq 'NO' or $prop eq 'ANY';
+
+ my $ucv = join("",map {uc(lc($_));} split(/-/,$value));
+ my @enums = @{$h{$value}->{'enums'}};
+
+ if(@enums){
+
+ my ($c_autogen,$c_type) = @{$h{$value}->{'C'}};
+ print "typedef $c_type {\n";
+ my $first = 1;
+
+ unshift(@enums,"X");
+
+ push(@enums,"NONE");
+
+ foreach $e (@enums) {
+ if (!$first){
+ print ",\n";
+ } else {
+ $first = 0;
+ }
+
+ my $uce = join("",map {uc(lc($_));} split(/-/,$e));
+
+ print " ICAL_${ucv}_${uce} = $idx";
+
+ $idx++;
+ }
+
+ $c_type =~ s/enum //;
+
+ print "\n} $c_type;\n\n";
+ }
+ }
+
+ print "#define ICALPROPERTY_LAST_ENUM $idx\n\n";
+
+}
+
+
+if($opt_c){
+
+ # print out the value to string map
+
+ my $count = scalar(keys %h) + 1;
+ print "struct icalvalue_kind_map value_map[$count]={\n";
+
+ foreach $value (keys %h) {
+
+ $idx++;
+ my $ucv = join("",map {uc(lc($_));} split(/-/,$value));
+
+ next if $value eq "NO";
+
+ print " {ICAL_${ucv}_VALUE,\"$value\"},\n";
+ }
+
+
+ print " {ICAL_NO_VALUE,\"\"}\n};";
+
+}
+
+
+foreach $value (keys %h) {
+
+ my $autogen = $h{$value}->{C}->[0];
+ my $type = $h{$value}->{C}->[1];
+
+ my $ucf = join("",map {ucfirst(lc($_));} split(/-/,$value));
+
+ my $lc = lc($ucf);
+ my $uc = uc($lc);
+
+ my $pointer_check = "icalerror_check_arg_rz( (v!=0),\"v\");\n" if $type =~ /\*/;
+ my $pointer_check_rv = "icalerror_check_arg_rv( (v!=0),\"v\");\n" if $type =~ /\*/;
+
+ my $assign;
+
+ if ($type =~ /char/){
+ $assign = "icalmemory_strdup(v);\n\n if (impl->data.v_string == 0){\n errno = ENOMEM;\n }\n";
+ } else {
+ $assign = "v;";
+ }
+
+ my $union_data;
+
+ if(@{$h{$value}->{'enums'}}){
+ $union_data = 'enum';
+
+ } elsif (exists $union_map{$uc} ){
+ $union_data=$union_map{$uc};
+ } else {
+ $union_data = $lc;
+ }
+
+ if ($opt_c && $autogen) {
+
+ print "\n\n\
+icalvalue* icalvalue_new_${lc} ($type v){\
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_${uc}_VALUE);\
+ $pointer_check\
+ icalvalue_set_${lc}((icalvalue*)impl,v);\
+ return (icalvalue*)impl;\
+}\
+void icalvalue_set_${lc}(icalvalue* value, $type v) {\
+ struct icalvalue_impl* impl; \
+ icalerror_check_arg_rv( (value!=0),\"value\");\
+ $pointer_check_rv\
+ icalerror_check_value_type(value, ICAL_${uc}_VALUE);\
+ impl = (struct icalvalue_impl*)value;\n";
+
+ if( $union_data eq 'string') {
+
+ print " if(impl->data.v_${union_data}!=0) {free((void*)impl->data.v_${union_data});}\n";
+ }
+
+
+ print "\n\
+ impl->data.v_$union_data = $assign \n\
+ icalvalue_reset_kind(impl);\n}\n";
+
+ print "$type\ icalvalue_get_${lc}(const icalvalue* value)\ {\n";
+ if ($type =~ m/(\*|int|float)$/) {
+ print " icalerror_check_arg_rz( (value!=0),\"value\");\n";
+ } else {
+ print " icalerror_check_arg( (value!=0),\"value\");\n";
+ }
+ print " icalerror_check_value_type(value, ICAL_${uc}_VALUE);\
+ return ((struct icalvalue_impl*)value)->data.v_${union_data};\n}\n";
+
+
+ } elsif($opt_h && $autogen) {
+
+ print "\n /* $value */ \
+icalvalue* icalvalue_new_${lc}($type v); \
+$type icalvalue_get_${lc}(const icalvalue* value); \
+void icalvalue_set_${lc}(icalvalue* value, ${type} v);\n\n";
+
+ }
+
+}
+
+
+if ($opt_h){
+ print "#endif /*ICALVALUE_H*/\n";
+ }
+
+
+}
diff --git a/libkcal/libical/scripts/mkparameterrestrictions.pl b/libkcal/libical/scripts/mkparameterrestrictions.pl
new file mode 100755
index 00000000..2c57eb4c
--- /dev/null
+++ b/libkcal/libical/scripts/mkparameterrestrictions.pl
@@ -0,0 +1,85 @@
+#!/usr/bin/perl
+
+# Version: 1.0
+# Script last updated: 30May1999 GMD
+# Change log:
+# <none>
+
+
+# usually open params-in-prop.txt
+open(F,"$ARGV[0]") || die "Can't open restriction file $ARGV[0]:$!";
+
+print <<EOM;
+/*
+ ======================================================================
+ File: parameterrestrictions.c
+
+ (C) COPYRIGHT 1999 Graham Davison
+ mailto:g.m.davison\@computer.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.0 (the "License"); you may not use this file except in
+ compliance with the License. You may obtain a copy of the License at
+ http://www.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+
+ ======================================================================*/
+
+/*
+ * THIS FILE IS MACHINE GENERATED DO NOT EDIT
+ */
+
+
+int icalrestriction_is_parameter_allowed(icalproperty_kind prop,icalparameter_kind param)
+{
+ switch (prop)
+ {
+EOM
+
+while(<F>)
+{
+ chop;
+
+ # split line by whitespace
+ my @v = split(/\s+/,$_);
+ # property is first item on line
+ my $prop = shift @v;
+ my $prop_name = $prop;
+ if (substr($prop,0,1) eq "X") { $prop = "X"; }
+ $prop = join("",split(/-/,$prop));
+
+print <<EOM;
+
+ /* ${prop_name} */
+ case ICAL_${prop}_PROPERTY:
+ switch (param)
+ {
+EOM
+
+ foreach $param (@v)
+ {
+ $param = join("",split(/-/,$param));
+ print "\t\t\t\tcase ICAL_${param}_PARAMETER:\n";
+ }
+
+print <<EOM;
+ return 1;
+ default:
+ return 0;
+ }
+
+EOM
+
+}
+
+print <<EOM;
+ }
+
+ return 0;
+}
+EOM
diff --git a/libkcal/libical/scripts/mkrestrictionrecords.pl b/libkcal/libical/scripts/mkrestrictionrecords.pl
new file mode 100755
index 00000000..dd28d777
--- /dev/null
+++ b/libkcal/libical/scripts/mkrestrictionrecords.pl
@@ -0,0 +1,109 @@
+#!/usr/bin/env perl
+
+# Version: 1.0
+# Script last updated: 30May1999 GMD
+# Change log:
+# <none>
+
+# usually open restrictions.csv
+open(F,"$ARGV[0]") || die "Can't open restriction file $ARGV[0]:$!";
+
+print <<EOM;
+/*
+ ======================================================================
+ File: restrictionrecords.c
+
+ (C) COPYRIGHT 1999 Graham Davison
+ mailto:g.m.davison\@computer.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.0 (the "License"); you may not use this file except in
+ compliance with the License. You may obtain a copy of the License at
+ http://www.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+
+ ======================================================================*/
+
+
+/*
+ * THIS FILE IS MACHINE GENERATED DO NOT EDIT
+ */
+
+
+typedef struct icalrestriction_record {
+ icalproperty_method method;
+ icalcomponent_kind component;
+ icalproperty_kind property;
+ icalcomponent_kind subcomponent;
+ icalrestriction_kind restriction;
+} icalrestriction_record;
+
+
+icalrestriction_record icalrestriction_records[] =
+{
+EOM
+
+my $last_method = "";
+my $last_component = "";
+my $last_property = "";
+my $need_header = 0;
+
+while(<F>)
+{
+ chop;
+
+ # split line at commas
+ my ($method,$component,$property,$subcomponent,$restriction)=split(/\,/,$_);
+
+ #
+ #put in code to generate comments here!
+ #
+ if ($method ne $last_method)
+ {
+ $need_header = 1;
+ $last_method = $method;
+ }
+ if ($component ne $last_component)
+ {
+ $need_header = 1;
+ $last_component = $component;
+ }
+
+ if ($need_header)
+ {
+ print "\n\t/* METHOD: ${method}, COMPONENT: ${component} */\n";
+ $need_header = 0;
+ }
+
+ foreach $item ($component,$property,$subcomponent,$restriction)
+ {
+ # handle special cases.
+ if ($item eq "NONE")
+ { $item = "NO"; }
+ else { if (substr($item,0,1) eq "X")
+ { $item = "X"; }}
+
+ # strip out dashes
+ $item = join("",split(/-/,$item));
+ }
+ # strip leading V from component names
+ $component =~ s/^(V?)(\w+?)((SAVINGS)?)((TIME)?)$/$2/;
+ $subcomponent =~ s/^V(\w+)/$1/;
+
+ print "\t\{ICAL_METHOD_${method},ICAL_${component}_COMPONENT,";
+ print "ICAL_${property}_PROPERTY,ICAL_${subcomponent}_COMPONENT,";
+ print "ICAL_RESTRICTION_${restriction}\},\n";
+
+}
+
+print <<EOM;
+
+ /* END */
+ {ICAL_METHOD_NONE,ICAL_NO_COMPONENT,ICAL_NO_PROPERTY,ICAL_NO_COMPONENT,ICAL_RESTRICTION_NONE}
+};
+EOM
diff --git a/libkcal/libical/scripts/mkrestrictiontable.pl b/libkcal/libical/scripts/mkrestrictiontable.pl
new file mode 100755
index 00000000..0e4e65c0
--- /dev/null
+++ b/libkcal/libical/scripts/mkrestrictiontable.pl
@@ -0,0 +1,98 @@
+#!/usr/bin/env perl
+
+use Getopt::Std;
+getopts('i:');
+
+# the argument should be the path to the restriction datafile, usually
+# design-data/restrictions.csv
+open(F,"$ARGV[0]") || die "Can't open restriction data file $ARGV[0]:$!";
+
+# Write the file inline by copying everything before a demarcation
+# line, and putting the generated data after the demarcation
+
+if ($opt_i) {
+
+ open(IN,$opt_i) || die "Can't open input file $opt_i";
+
+ while(<IN>){
+
+ if (/Do not edit/){
+ last;
+ }
+
+ print;
+
+ }
+
+ print "/* Everything below this line is machine generated. Do not edit. */\n";
+
+
+ close IN;
+}
+
+# First build the property restriction table
+print "icalrestriction_property_record icalrestriction_property_records[] = {\n";
+
+while(<F>)
+{
+
+ chop;
+
+ s/\#.*$//;
+
+ my($method,$targetcomp,$prop,$subcomp,$restr,$sub) = split(/,/,$_);
+
+ next if !$method;
+
+ if(!$sub) {
+ $sub = "0";
+ } else {
+ $sub = "icalrestriction_".$sub;
+ }
+
+ if($prop ne "NONE"){
+ print(" \{ICAL_METHOD_${method},ICAL_${targetcomp}_COMPONENT,ICAL_${prop}_PROPERTY,ICAL_RESTRICTION_${restr},$sub},\n");
+ }
+
+}
+
+
+# Print the terminating line
+print " {ICAL_METHOD_NONE,ICAL_NO_COMPONENT,ICAL_NO_PROPERTY,ICAL_RESTRICTION_NONE, 0}\n";
+
+print "};\n";
+
+print "icalrestriction_component_record icalrestriction_component_records[] = {\n";
+
+
+# Go back through the entire file and build the component restriction table
+close(F);
+open(F,"$ARGV[0]") || die "Can't open restriction data file $ARGV[0]:$!";
+
+while(<F>)
+{
+
+ chop;
+
+ s/\#.*$//;
+
+ my($method,$targetcomp,$prop,$subcomp,$restr,$sub) = split(/,/,$_);
+
+ next if !$method;
+
+ if(!$sub) {
+ $sub = "0";
+ } else {
+ $sub = "icalrestriction_".$sub;
+ }
+
+
+ if($subcomp ne "NONE"){
+ print(" \{ICAL_METHOD_${method},ICAL_${targetcomp}_COMPONENT,ICAL_${subcomp}_COMPONENT,ICAL_RESTRICTION_${restr},$sub\},\n");
+ }
+
+}
+
+# print the terminating line
+print " {ICAL_METHOD_NONE,ICAL_NO_COMPONENT,ICAL_NO_COMPONENT,ICAL_RESTRICTION_NONE, 0}\n";
+print "};\n";
diff --git a/libkcal/libical/scripts/readvaluesfile.pl b/libkcal/libical/scripts/readvaluesfile.pl
new file mode 100644
index 00000000..d5e2d36f
--- /dev/null
+++ b/libkcal/libical/scripts/readvaluesfile.pl
@@ -0,0 +1,130 @@
+
+
+sub read_values_file {
+
+ my $path = shift;
+ my %h;
+
+ open(F,$path) || die "Can't open values file $path";
+
+ while(<F>){
+
+ chop;
+
+ s/#.*$//g;
+ s/\"//g;
+
+ next if ! $_;
+
+ @column = split(/,/,$_);
+
+ my $value_name = $column[0];
+
+ my $c_type_str = $column[1];
+ my $c_autogen = ($c_type_str =~ /\(a\)/);
+
+ my $c_type = $c_type_str;
+ $c_type =~ s/\(.\)//;
+
+ my $python_type = $column[2];
+ my $components = $column[3];
+ my $enum_values = $column[4];
+
+ my @components;
+ if($components ne "unitary"){
+ @components = split(/;/,$components);
+ } else {
+ @components = ();
+ }
+
+ my @enums;
+ if($enum_values) {
+ @enums = split(/;/,$enum_values);
+
+ } else {
+ @enums = ();
+ }
+
+ $h{$value_name} = { C => [$c_autogen,$c_type],
+ perl => $perl_type,
+ python => $python_type,
+ components=>[@components],
+ enums=>[@enums]
+ };
+ }
+
+ return %h;
+}
+
+sub read_properties_file {
+
+ my $path = shift;
+ my %h;
+
+ open(F,$path) || die "Can't open properties file $path";
+
+ while(<F>){
+
+ chop;
+
+ s/#.*$//g;
+ s/\"//g;
+
+ next if ! $_;
+
+ @column = split(/,/,$_);
+
+ my $property_name = $column[0];
+
+ my $lic_value = $column[1];
+ my $default_value = $column[2];
+
+ $h{$property_name} = { lic_value => $lic_value,
+ default_value => $default_value
+ };
+ }
+
+ return %h;
+}
+
+sub read_parameters_file {
+
+ my $path = shift;
+ my %h;
+
+ open(F,$path) || die "Can't open parameters file $path";
+
+ while(<F>){
+
+ chop;
+
+ s/#.*$//g;
+ s/\"//g;
+
+ next if ! $_;
+
+ @column = split(/\,/,$_);
+
+ my $parameter_name = $column[0];
+
+ my $data_type = $column[1];
+ my $enum_string = $column[2];
+
+ my @enums;
+ if($enum_string){
+ @enums = split(/;/,$enum_string);
+ }
+
+ $h{$parameter_name} = { C => $data_type,
+ enums => [@enums]
+ };
+ }
+
+ close(F);
+
+ return %h;
+}
+
+
+
+1;
diff --git a/libkcal/libical/src/Makefile.am b/libkcal/libical/src/Makefile.am
new file mode 100644
index 00000000..ef640803
--- /dev/null
+++ b/libkcal/libical/src/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = libical libicalss
diff --git a/libkcal/libical/src/libical/Makefile.am b/libkcal/libical/src/libical/Makefile.am
new file mode 100644
index 00000000..e0d51321
--- /dev/null
+++ b/libkcal/libical/src/libical/Makefile.am
@@ -0,0 +1,232 @@
+#======================================================================
+# FILE: Makefile.am
+# CREATOR: eric
+#
+#
+#
+# (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of either:
+#
+# The LGPL as published by the Free Software Foundation, version
+# 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+#
+# Or:
+#
+# The Mozilla Public License Version 1.0. You may obtain a copy of
+# the License at http://www.mozilla.org/MPL/
+#
+# The original code is icalcomponent.c
+#
+#======================================================================
+
+
+DESIGNDATA = $(srcdir)/../../design-data
+ICALSCRIPTS = $(srcdir)/../../scripts
+
+noinst_LTLIBRARIES = libical.la
+
+AM_CPPFLAGS = -DPACKAGE_DATA_DIR=\""$(kde_datadir)/libical"\"
+
+AM_YFLAGS = -d -v -t -pical_yy
+AM_LFLAGS = -Pical_yy -olex.yy.c
+
+INCLUDES = \
+ -I$(top_builddir)/libkcal/libical \
+ -I$(top_srcdir)/libkcal/libical/src \
+ -I$(top_builddir)/libkcal/libical/src \
+ -I$(srcdir)
+
+libical_la_LDFLAGS = -no-undefined
+
+# Order is important!
+libical_la_SOURCES = \
+ caldate.c \
+ icalarray.c \
+ icalattach.c \
+ icalderivedparameter.c \
+ icalrecur.c \
+ icalrestriction.c \
+ icalcomponent.c \
+ icalenums.c \
+ icalerror.c \
+ icalmemory.c \
+ icalmime.c \
+ icalparameter.c \
+ icalparser.c \
+ icalderivedproperty.c \
+ icalproperty.c \
+ icaltime.c \
+ icalduration.c \
+ icalperiod.c \
+ icaltimezone.c \
+ icaltypes.c \
+ icalvalue.c \
+ icalderivedvalue.c \
+ pvl.c \
+ sspm.c \
+ vsnprintf.c
+
+
+noinst_HEADERS = ical.h \
+ astime.h \
+ icalarray.h \
+ icalattach.h \
+ icalattachimpl.h \
+ icalderivedparameter.h \
+ icalrecur.h \
+ icalcomponent.h \
+ icalenums.h \
+ icalerror.h \
+ icalmemory.h \
+ icalmime.h \
+ icalparameter.h \
+ icalparameterimpl.h \
+ icalparser.h \
+ icalderivedproperty.h \
+ icalproperty.h \
+ icaltime.h \
+ icalduration.h \
+ icalperiod.h \
+ icaltimezone.h \
+ icaltypes.h \
+ icalvalue.h \
+ icalvalueimpl.h \
+ icalderivedvalue.h \
+ pvl.h \
+ sspm.h
+
+# ORDERING OF HEADERS IS SIGNIFICANT. Don't change this ordering. It
+# is required to make the combined header ical.h properly
+COMBINEDHEADERS = \
+ $(srcdir)/icalversion.h \
+ $(srcdir)/icaltime.h \
+ $(srcdir)/icalduration.h \
+ $(srcdir)/icalperiod.h \
+ $(srcdir)/icalenums.h \
+ $(srcdir)/icaltypes.h \
+ $(srcdir)/icalrecur.h \
+ $(srcdir)/icalattach.h \
+ icalderivedvalue.h \
+ icalderivedparameter.h \
+ $(srcdir)/icalvalue.h \
+ $(srcdir)/icalparameter.h \
+ icalderivedproperty.h \
+ $(srcdir)/icalproperty.h \
+ $(srcdir)/pvl.h \
+ $(srcdir)/icalarray.h \
+ $(srcdir)/icalcomponent.h \
+ $(srcdir)/icaltimezone.h \
+ $(srcdir)/icalparser.h \
+ $(srcdir)/icalmemory.h \
+ $(srcdir)/icalerror.h \
+ $(srcdir)/icalrestriction.h \
+ $(srcdir)/sspm.h \
+ $(srcdir)/icalmime.h
+
+ical.h: $(COMBINEDHEADERS)
+ echo '#ifdef __cplusplus' > ical.h
+ echo 'extern "C" {' >> ical.h
+ echo '#endif' >> ical.h
+ cat $(COMBINEDHEADERS) \
+ | egrep -v "#include.*\"ical" \
+ | egrep -v "#include.*\"config" \
+ | egrep -v "#include.*\"pvl\.h\"" \
+ | egrep -v '\$$(Id|Locker): .+\$$'>> ical.h
+ echo '#ifdef __cplusplus' >> ical.h
+ echo '}' >> ical.h
+ echo '#endif' >> ical.h
+
+# parameters
+
+PARAMETERDEPS = \
+ $(ICALSCRIPTS)/mkderivedparameters.pl \
+ $(DESIGNDATA)/parameters.csv \
+ icalderivedparameter.c.in \
+ icalderivedparameter.h.in
+
+icalderivedparameter.h: $(PARAMETERDEPS)
+ $(PERL) -I $(ICALSCRIPTS) $(ICALSCRIPTS)/mkderivedparameters.pl -i $(srcdir)/icalderivedparameter.h.in -h $(DESIGNDATA)/parameters.csv > icalderivedparameter.h || rm -f icalderivedparameter.h
+
+
+icalderivedparameter.c: $(PARAMETERDEPS) icalparameter.h
+ $(PERL) -I $(ICALSCRIPTS) $(ICALSCRIPTS)/mkderivedparameters.pl -i $(srcdir)/icalderivedparameter.c.in -c $(DESIGNDATA)/parameters.csv > icalderivedparameter.c || rm -f icalderivedparameter.c
+
+
+# properties
+
+PROPERTYDEPS = \
+ $(ICALSCRIPTS)/mkderivedproperties.pl \
+ $(DESIGNDATA)/properties.csv \
+ $(DESIGNDATA)/value-types.csv \
+ icalderivedproperty.c.in \
+ icalderivedproperty.h.in
+
+
+icalderivedproperty.h: $(PROPERTYDEPS)
+ $(PERL) -I$(ICALSCRIPTS) $(ICALSCRIPTS)/mkderivedproperties.pl \
+ -i $(srcdir)/icalderivedproperty.h.in -h $(DESIGNDATA)/properties.csv\
+ ${DESIGNDATA}/value-types.csv > icalderivedproperty.h || rm -f icalderivedproperty.h
+
+icalderivedproperty.c: $(PROPERTYDEPS) icalproperty.h
+ $(PERL) -I$(ICALSCRIPTS) $(ICALSCRIPTS)/mkderivedproperties.pl \
+ -i $(srcdir)/icalderivedproperty.c.in -c $(DESIGNDATA)/properties.csv \
+ ${DESIGNDATA}/value-types.csv > icalderivedproperty.c || rm -f icalderivedproperty.c
+
+# restrictions
+
+RESTRICTIONDEPS = \
+ $(ICALSCRIPTS)/mkrestrictiontable.pl \
+ $(DESIGNDATA)/restrictions.csv \
+ icalrestriction.c.in
+
+icalrestriction.c: $(RESTRICTIONDEPS)
+ $(PERL) $(ICALSCRIPTS)/mkrestrictiontable.pl -i $(srcdir)/icalrestriction.c.in \
+ $(DESIGNDATA)/restrictions.csv > icalrestriction.c || rm -f icalrestriction.c
+
+# values
+
+VALUEDEPS = \
+ $(ICALSCRIPTS)/mkderivedvalues.pl \
+ $(DESIGNDATA)/value-types.csv \
+ icalderivedvalue.c.in \
+ icalderivedvalue.h.in
+
+icalderivedvalue.h: $(VALUEDEPS)
+ $(PERL) -I$(ICALSCRIPTS) $(ICALSCRIPTS)/mkderivedvalues.pl \
+ -i $(srcdir)/icalderivedvalue.h.in -h $(DESIGNDATA)/value-types.csv > icalderivedvalue.h || rm -f icalderivedvalue.h
+
+icalderivedvalue.c: $(VALUEDEPS) icalderivedvalue.h
+ $(PERL) -I$(ICALSCRIPTS) $(ICALSCRIPTS)/mkderivedvalues.pl \
+ -i $(srcdir)/icalderivedvalue.c.in -c $(DESIGNDATA)/value-types.csv > icalderivedvalue.c || rm -f icalderivedvalue.c
+
+# housekeeping
+CLEANFILES = y.output \
+ icalderivedvalue.h icalderivedproperty.h icalderivedparameter.h ical.h \
+ icalderivedvalue.c icalderivedproperty.c icalderivedparameter.c \
+ icalrestriction.c
+
+EXTRA_DIST = \
+ icalderivedparameter.c.in \
+ icalderivedparameter.h.in \
+ icalderivedproperty.c.in \
+ icalderivedproperty.h.in \
+ icalrestriction.c.in \
+ icalderivedvalue.c.in \
+ icalderivedvalue.h.in \
+ icalversion.h.in
+
+
+icalcomponent.lo: icalderivedvalue.h icalderivedproperty.h icalderivedparameter.h
+icalderivedparameter.lo: icalderivedvalue.h icalderivedproperty.h icalderivedparameter.h
+icalderivedproperty.lo: icalderivedvalue.h icalderivedproperty.h icalderivedparameter.h
+icalderivedvalue.lo: icalderivedvalue.h icalderivedproperty.h icalderivedparameter.h
+icalduration.lo: icalderivedvalue.h icalderivedproperty.h icalderivedparameter.h
+icalmime.lo: icalderivedvalue.h icalderivedproperty.h icalderivedparameter.h
+icalparameter.lo: icalderivedvalue.h icalderivedproperty.h icalderivedparameter.h
+icalparser.lo: icalderivedvalue.h icalderivedproperty.h icalderivedparameter.h
+icalproperty.lo: icalderivedvalue.h icalderivedproperty.h icalderivedparameter.h
+icalrestriction.lo: icalderivedvalue.h icalderivedproperty.h icalderivedparameter.h
+icaltime.lo: icalderivedvalue.h icalderivedproperty.h icalderivedparameter.h
+icalvalue.lo: icalderivedvalue.h icalderivedproperty.h icalderivedparameter.h
diff --git a/libkcal/libical/src/libical/astime.h b/libkcal/libical/src/libical/astime.h
new file mode 100644
index 00000000..6962c060
--- /dev/null
+++ b/libkcal/libical/src/libical/astime.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 1986-2000, Hiram Clawson
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the
+ * above copyright notice, this list of conditions and
+ * the following disclaimer in the documentation and/or
+ * other materials provided with the distribution.
+ *
+ * Neither name of The Museum of Hiram nor the names of
+ * its contributors may be used to endorse or promote products
+ * derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @file astime.h
+ * @brief contains definitions of structures used for time calculations.
+ */
+
+#ifndef _astime_h_
+#define _astime_h_
+
+typedef struct ut_instant {
+ double j_date; /**< julian decimal date, 0 = 01 Jan 4713 BC 12 HR UT */
+ long year; /**< year, valid range [-4,713, +2,147,483,647] */
+ int month; /**< [1-12] */
+ int day; /**< [1-31] */
+ int i_hour; /**< [0-23] */
+ int i_minute; /**< [0-59] */
+ int i_second; /**< [0-59] */
+ double d_hour; /**< [0.0-23.9999] includes minute and second */
+ double d_minute; /**< [0.0-59.9999] includes second */
+ double d_second; /**< [0.0-59.9999] */
+ int weekday; /**< [0-6] */
+ int day_of_year; /**< [1-366] */
+} UTinstant, * UTinstantPtr;
+
+/* Functions in caldate.c */
+
+long caldat( UTinstantPtr ); /** converts julian date to year,mo,da */
+double juldat( UTinstantPtr ); /** returns julian day from year,mo,da */
+
+#endif /* _astime_h_ */
diff --git a/libkcal/libical/src/libical/caldate.c b/libkcal/libical/src/libical/caldate.c
new file mode 100644
index 00000000..f5554f66
--- /dev/null
+++ b/libkcal/libical/src/libical/caldate.c
@@ -0,0 +1,176 @@
+/*
+ * Copyright (c) 1986-2000, Hiram Clawson
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the
+ * above copyright notice, this list of conditions and
+ * the following disclaimer in the documentation and/or
+ * other materials provided with the distribution.
+ *
+ * Neither name of The Museum of Hiram nor the names of
+ * its contributors may be used to endorse or promote products
+ * derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "astime.h" /* time structures */
+
+/**
+ * caldat computes the day of the week, the day of the year
+ * the gregorian (or julian) calendar date and the universal
+ * time from the julian decimal date.
+ * for astronomical purposes, The Gregorian calendar reform occurred
+ * on 15 Oct. 1582. This is 05 Oct 1582 by the julian calendar.
+
+ * Input: a ut_instant structure pointer, where the j_date element
+ * has been set. ( = 0 for 01 Jan 4713 B.C. 12 HR UT )
+ *
+ * output: will set all the other elements of the structure.
+ * As a convienence, the function will also return the year.
+ *
+ * Reference: Astronomial formulae for calculators, meeus, p 23
+ * from fortran program by F. Espenak - April 1982 Page 277,
+ * 50 Year canon of solar eclipses: 1986-2035
+ *
+ */
+
+long caldat( date )
+struct ut_instant * date;
+{
+ double frac;
+ long jd;
+ long ka;
+ long kb;
+ long kc;
+ long kd;
+ long ke;
+ long ialp;
+
+ jd = (long) (date->j_date + 0.5); /* integer julian date */
+ frac = date->j_date + 0.5 - (double) jd + 1.0e-10; /* day fraction */
+ ka = (long) jd;
+ if ( jd >= 2299161L )
+ {
+ ialp = ( (double) jd - 1867216.25 ) / ( 36524.25 );
+ ka = jd + 1L + ialp - ( ialp >> 2 );
+ }
+ kb = ka + 1524L;
+ kc = ( (double) kb - 122.1 ) / 365.25;
+ kd = (double) kc * 365.25;
+ ke = (double) ( kb - kd ) / 30.6001;
+ date->day = kb - kd - ((long) ( (double) ke * 30.6001 ));
+ if ( ke > 13L )
+ date->month = ke - 13L;
+ else
+ date->month = ke - 1L;
+ if ( (date->month == 2) && (date->day > 28) )
+ date->day = 29;
+ if ( (date->month == 2) && (date->day == 29) && (ke == 3L) )
+ date->year = kc - 4716L;
+ else if ( date->month > 2 )
+ date->year = kc - 4716L;
+ else
+ date->year = kc - 4715L;
+ date->i_hour = date->d_hour = frac * 24.0; /* hour */
+ date->i_minute = date->d_minute =
+ ( date->d_hour - (double) date->i_hour ) * 60.0; /* minute */
+ date->i_second = date->d_second =
+ ( date->d_minute - (double) date->i_minute ) * 60.0;/* second */
+ date->weekday = (jd + 1L) % 7L; /* day of week */
+ if ( date->year == ((date->year >> 2) << 2) )
+ date->day_of_year =
+ ( ( 275 * date->month ) / 9)
+ - ((date->month + 9) / 12)
+ + date->day - 30;
+ else
+ date->day_of_year =
+ ( ( 275 * date->month ) / 9)
+ - (((date->month + 9) / 12) << 1)
+ + date->day - 30;
+ return( date->year );
+}
+
+/**
+ * juldat computes the julian decimal date (j_date) from
+ * the gregorian (or Julian) calendar date.
+ * for astronomical purposes, The Gregorian calendar reform occurred
+ * on 15 Oct. 1582. This is 05 Oct 1582 by the julian calendar.
+ * Input: a ut_instant structure pointer where Day, Month, Year and
+ * i_hour, i_minute, d_second have been set for the date
+ * in question.
+ *
+ * Output: the j_date and weekday elements of the structure will be set.
+ * Also, the return value of the function will be the j_date too.
+ *
+ * Reference: Astronomial formulae for calculators, meeus, p 23
+ * from fortran program by F. Espenak - April 1982 Page 276,
+ * 50 Year canon of solar eclipses: 1986-2035
+ */
+
+double juldat( date )
+struct ut_instant * date;
+{
+ double frac, gyr;
+ long iy0, im0;
+ long ia, ib;
+ long jd;
+
+ /* decimal day fraction */
+ frac = (( double)date->i_hour/ 24.0)
+ + ((double) date->i_minute / 1440.0)
+ + (date->d_second / 86400.0);
+ /* convert date to format YYYY.MMDDdd */
+ gyr = (double) date->year
+ + (0.01 * (double) date->month)
+ + (0.0001 * (double) date->day)
+ + (0.0001 * frac) + 1.0e-9;
+ /* conversion factors */
+ if ( date->month <= 2 )
+ {
+ iy0 = date->year - 1L;
+ im0 = date->month + 12;
+ }
+ else
+ {
+ iy0 = date->year;
+ im0 = date->month;
+ }
+ ia = iy0 / 100L;
+ ib = 2L - ia + (ia >> 2);
+ /* calculate julian date */
+ if ( date->year < 0L )
+ jd = (long) ((365.25 * (double) iy0) - 0.75)
+ + (long) (30.6001 * (im0 + 1L) )
+ + (long) date->day + 1720994L;
+ else
+ jd = (long) (365.25 * (double) iy0)
+ + (long) (30.6001 * (double) (im0 + 1L))
+ + (long) date->day + 1720994L;
+ if ( gyr >= 1582.1015 ) /* on or after 15 October 1582 */
+ jd += ib;
+ date->j_date = (double) jd + frac + 0.5;
+ jd = (long) (date->j_date + 0.5);
+ date->weekday = (jd + 1L) % 7L;
+ return( date->j_date );
+} /* end of double juldat( date ) */
diff --git a/libkcal/libical/src/libical/icalarray.c b/libkcal/libical/src/libical/icalarray.c
new file mode 100644
index 00000000..05e764c7
--- /dev/null
+++ b/libkcal/libical/src/libical/icalarray.c
@@ -0,0 +1,161 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*-
+ ======================================================================
+ FILE: icalarray.c
+ CREATOR: Damon Chaplin 07 March 2001
+
+
+ (C) COPYRIGHT 2001, Ximian, Inc.
+
+ 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/
+
+
+ ======================================================================*/
+
+/** @file icalarray.c
+ *
+ * @brief An array of arbitrarily-sized elements which grows
+ * dynamically as elements are added.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "icalarray.h"
+#include "icalerror.h"
+
+
+static void icalarray_expand (icalarray *array,
+ int space_needed);
+
+/** @brief Constructor
+ */
+
+icalarray*
+icalarray_new (int element_size,
+ int increment_size)
+{
+ icalarray *array;
+
+ array = (icalarray*) malloc (sizeof (icalarray));
+ if (!array) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return NULL;
+ }
+
+ array->element_size = element_size;
+ array->increment_size = increment_size;
+ array->num_elements = 0;
+ array->space_allocated = 0;
+ array->data = NULL;
+
+ return array;
+}
+
+/** @brief Destructor
+ */
+
+void
+icalarray_free (icalarray *array)
+{
+ if (array->data)
+ free (array->data);
+ free (array);
+}
+
+
+void
+icalarray_append (icalarray *array,
+ const void *element)
+{
+ if (array->num_elements >= array->space_allocated)
+ icalarray_expand (array, 1);
+
+ memcpy ((char *)(array->data) + ( array->num_elements * array->element_size ), element,
+ array->element_size);
+ array->num_elements++;
+}
+
+
+void*
+icalarray_element_at (icalarray *array,
+ int position)
+{
+ assert (position >= 0);
+ assert ((unsigned int)position < array->num_elements);
+
+ return (char *)(array->data) + (position * array->element_size);
+}
+
+
+void
+icalarray_remove_element_at (icalarray *array,
+ int position)
+{
+ void *dest;
+ int elements_to_move;
+
+ assert (position >= 0);
+ assert ((unsigned int)position < array->num_elements);
+
+ dest = (char *)array->data + (position * array->element_size);
+ elements_to_move = array->num_elements - position - 1;
+
+ if (elements_to_move > 0)
+ memmove (dest, (char *)dest + array->element_size,
+ elements_to_move * array->element_size);
+
+ array->num_elements--;
+}
+
+
+void
+icalarray_sort (icalarray *array,
+ int (*compare) (const void *,
+ const void *))
+{
+ qsort (array->data, array->num_elements, array->element_size, compare);
+}
+
+
+static void
+icalarray_expand (icalarray *array,
+ int space_needed)
+{
+ int new_space_allocated;
+ void *new_data;
+
+ new_space_allocated = array->space_allocated + array->increment_size;
+
+ if ((unsigned int)space_needed > array->increment_size)
+ new_space_allocated += space_needed;
+
+ /*
+ new_data = realloc (array->data,
+ new_space_allocated * array->element_size);
+ */
+ new_data = malloc(new_space_allocated * array->element_size);
+
+ if (new_data) {
+ memcpy(new_data,array->data,array->element_size*array->space_allocated);
+ free(array->data);
+ array->data = new_data;
+ array->space_allocated = new_space_allocated;
+ } else {
+ icalerror_set_errno(ICAL_ALLOCATION_ERROR);
+ }
+}
+
+
diff --git a/libkcal/libical/src/libical/icalarray.h b/libkcal/libical/src/libical/icalarray.h
new file mode 100644
index 00000000..16d39034
--- /dev/null
+++ b/libkcal/libical/src/libical/icalarray.h
@@ -0,0 +1,61 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/*======================================================================
+ FILE: icalarray.h
+ CREATOR: Damon Chaplin 07 March 2001
+
+
+
+ (C) COPYRIGHT 2001, Ximian, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+
+======================================================================*/
+
+
+#ifndef ICALARRAY_H
+#define ICALARRAY_H
+
+/** @file icalarray.h
+ *
+ * @brief An array of arbitrarily-sized elements which grows
+ * dynamically as elements are added.
+ */
+
+typedef struct _icalarray icalarray;
+struct _icalarray {
+ unsigned int element_size;
+ unsigned int increment_size;
+ unsigned int num_elements;
+ unsigned int space_allocated;
+ void *data;
+};
+
+
+
+icalarray *icalarray_new (int element_size,
+ int increment_size);
+void icalarray_free (icalarray *array);
+
+void icalarray_append (icalarray *array,
+ const void *element);
+void icalarray_remove_element_at (icalarray *array,
+ int position);
+
+void *icalarray_element_at (icalarray *array,
+ int position);
+
+void icalarray_sort (icalarray *array,
+ int (*compare) (const void *, const void *));
+
+
+#endif /* ICALARRAY_H */
diff --git a/libkcal/libical/src/libical/icalattach.c b/libkcal/libical/src/libical/icalattach.c
new file mode 100644
index 00000000..23cdbeef
--- /dev/null
+++ b/libkcal/libical/src/libical/icalattach.c
@@ -0,0 +1,137 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icalattach.c
+ CREATOR: acampi 28 May 02
+
+
+
+ (C) COPYRIGHT 2000, Andrea Campi <a.campi@inet.it>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The original code is icaltypes.c
+
+ ======================================================================*/
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "icaltypes.h"
+#include "icalerror.h"
+#include "icalmemory.h"
+#include "icalattachimpl.h"
+#include <stdlib.h> /* for malloc and abs() */
+#include <errno.h> /* for errno */
+#include <string.h> /* for icalmemory_strdup */
+#include <assert.h>
+
+icalattach *
+icalattach_new_from_url (const char *url)
+{
+ icalattach *attach;
+ char *url_copy;
+
+ icalerror_check_arg_rz ((url != NULL), "url");
+
+ if ((attach = malloc (sizeof (icalattach))) == NULL) {
+ errno = ENOMEM;
+ return NULL;
+ }
+
+ if ((url_copy = strdup (url)) == NULL) {
+ free (attach);
+ errno = ENOMEM;
+ return NULL;
+ }
+
+ attach->refcount = 1;
+ attach->is_url = 1;
+ attach->u.url.url = url_copy;
+
+ return attach;
+}
+
+icalattach *
+icalattach_new_from_data (unsigned char *data, icalattach_free_fn_t free_fn,
+ void *free_fn_data)
+{
+ icalattach *attach;
+
+ icalerror_check_arg_rz ((data != NULL), "data");
+
+ if ((attach = malloc (sizeof (icalattach))) == NULL) {
+ errno = ENOMEM;
+ return NULL;
+ }
+
+ attach->refcount = 1;
+ attach->is_url = 0;
+ attach->u.data.data = data;
+ attach->u.data.free_fn = free_fn;
+ attach->u.data.free_fn_data = free_fn_data;
+
+ return attach;
+}
+
+void
+icalattach_ref (icalattach *attach)
+{
+ icalerror_check_arg_rv ((attach != NULL), "attach");
+ icalerror_check_arg_rv ((attach->refcount > 0), "attach->refcount > 0");
+
+ attach->refcount++;
+}
+
+void
+icalattach_unref (icalattach *attach)
+{
+ icalerror_check_arg_rv ((attach != NULL), "attach");
+ icalerror_check_arg_rv ((attach->refcount > 0), "attach->refcount > 0");
+
+ attach->refcount--;
+
+ if (attach->refcount != 0)
+ return;
+
+ if (attach->is_url)
+ free (attach->u.url.url);
+ else if (attach->u.data.free_fn)
+ (* attach->u.data.free_fn) (attach->u.data.data, attach->u.data.free_fn_data);
+
+ free (attach);
+}
+
+int
+icalattach_get_is_url (icalattach *attach)
+{
+ icalerror_check_arg_rz ((attach != NULL), "attach");
+
+ return attach->is_url ? 1 : 0;
+}
+
+const char *
+icalattach_get_url (icalattach *attach)
+{
+ icalerror_check_arg_rz ((attach != NULL), "attach");
+ icalerror_check_arg_rz ((attach->is_url), "attach->is_url");
+
+ return attach->u.url.url;
+}
+
+unsigned char *
+icalattach_get_data (icalattach *attach)
+{
+ icalerror_check_arg_rz ((attach != NULL), "attach");
+ icalerror_check_arg_rz ((!attach->is_url), "!attach->is_url");
+
+ return attach->u.data.data;
+}
diff --git a/libkcal/libical/src/libical/icalattach.h b/libkcal/libical/src/libical/icalattach.h
new file mode 100644
index 00000000..4189d4bb
--- /dev/null
+++ b/libkcal/libical/src/libical/icalattach.h
@@ -0,0 +1,60 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalattach.h
+ CREATOR: acampi 28 May 02
+
+
+ (C) COPYRIGHT 2002, Andrea Campi <a.campi@inet.it>
+
+ 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 icalattach.h
+
+======================================================================*/
+
+#ifndef ICALATTACH_H
+#define ICALATTACH_H
+
+
+typedef struct icalattach_impl icalattach;
+
+typedef void (* icalattach_free_fn_t) (unsigned char *data, void *user_data);
+
+icalattach *icalattach_new_from_url (const char *url);
+icalattach *icalattach_new_from_data (unsigned char *data,
+ icalattach_free_fn_t free_fn, void *free_fn_data);
+
+void icalattach_ref (icalattach *attach);
+void icalattach_unref (icalattach *attach);
+
+int icalattach_get_is_url (icalattach *attach);
+const char *icalattach_get_url (icalattach *attach);
+unsigned char *icalattach_get_data (icalattach *attach);
+
+struct icalattachtype* icalattachtype_new(void);
+void icalattachtype_add_reference(struct icalattachtype* v);
+void icalattachtype_free(struct icalattachtype* v);
+
+void icalattachtype_set_url(struct icalattachtype* v, char* url);
+char* icalattachtype_get_url(struct icalattachtype* v);
+
+void icalattachtype_set_base64(struct icalattachtype* v, char* base64,
+ int owns);
+char* icalattachtype_get_base64(struct icalattachtype* v);
+
+void icalattachtype_set_binary(struct icalattachtype* v, char* binary,
+ int owns);
+void* icalattachtype_get_binary(struct icalattachtype* v);
+
+
+
+#endif /* !ICALATTACH_H */
diff --git a/libkcal/libical/src/libical/icalattachimpl.h b/libkcal/libical/src/libical/icalattachimpl.h
new file mode 100644
index 00000000..08c22fd8
--- /dev/null
+++ b/libkcal/libical/src/libical/icalattachimpl.h
@@ -0,0 +1,58 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalattachimpl.h
+ CREATOR: acampi 28 May 02
+
+
+
+ (C) COPYRIGHT 2000, Andrea Campi <a.campi@inet.it>
+
+ 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 icalattachimpl.h
+
+
+======================================================================*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifndef ICALATTACHIMPL_H
+#define ICALATTACHIMPL_H
+
+#include "icalattach.h"
+
+/* Private structure for ATTACH values */
+struct icalattach_impl {
+ /* Reference count */
+ int refcount;
+
+ union {
+ /* URL attachment data */
+ struct {
+ char *url;
+ } url;
+
+ /* Inline data */
+ struct {
+ unsigned char *data;
+ icalattach_free_fn_t free_fn;
+ void *free_fn_data;
+ } data;
+ } u;
+
+ /* TRUE if URL, FALSE if inline data */
+ unsigned int is_url : 1;
+};
+
+#endif
diff --git a/libkcal/libical/src/libical/icalcomponent.c b/libkcal/libical/src/libical/icalcomponent.c
new file mode 100644
index 00000000..bab0e72a
--- /dev/null
+++ b/libkcal/libical/src/libical/icalcomponent.c
@@ -0,0 +1,2598 @@
+/*======================================================================
+ FILE: icalcomponent.c
+ CREATOR: eric 28 April 1999
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The original code is icalcomponent.c
+
+======================================================================*/
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "icalcomponent.h"
+#include "pvl.h" /* "Pointer-to-void list" */
+#include "icalerror.h"
+#include "icalmemory.h"
+#include "icalenums.h"
+#include "icaltime.h"
+#include "icalarray.h"
+#include "icaltimezone.h"
+#include "icalduration.h"
+#include "icalperiod.h"
+#include "icalparser.h"
+#include "icalrestriction.h"
+
+#include <stdlib.h> /* for malloc */
+#include <stdarg.h> /* for va_list, etc */
+#include <errno.h>
+#include <assert.h>
+#include <stdio.h> /* for fprintf */
+#include <string.h> /* for strdup */
+#include <limits.h> /* for INT_MAX */
+
+struct icalcomponent_impl
+{
+ char id[5];
+ icalcomponent_kind kind;
+ char* x_name;
+ pvl_list properties;
+ pvl_elem property_iterator;
+ pvl_list components;
+ pvl_elem component_iterator;
+ icalcomponent* parent;
+
+ /** An array of icaltimezone structs. We use this so we can do fast
+ lookup of timezones using binary searches. timezones_sorted is
+ set to 0 whenever we add a timezone, so we remember to sort the
+ array before doing a binary search. */
+ icalarray* timezones;
+ int timezones_sorted;
+};
+
+/* icalproperty functions that only components get to use */
+void icalproperty_set_parent(icalproperty* property,
+ icalcomponent* component);
+icalcomponent* icalproperty_get_parent(icalproperty* property);
+void icalcomponent_add_children(icalcomponent *impl,va_list args);
+static icalcomponent* icalcomponent_new_impl (icalcomponent_kind kind);
+
+static void icalcomponent_merge_vtimezone (icalcomponent *comp,
+ icalcomponent *vtimezone,
+ icalarray *tzids_to_rename);
+static void icalcomponent_handle_conflicting_vtimezones (icalcomponent *comp,
+ icalcomponent *vtimezone,
+ icalproperty *tzid_prop,
+ const char *tzid,
+ icalarray *tzids_to_rename);
+static unsigned int icalcomponent_get_tzid_prefix_len (const char *tzid);
+static void icalcomponent_rename_tzids(icalcomponent* comp,
+ icalarray* rename_table);
+static void icalcomponent_rename_tzids_callback(icalparameter *param,
+ void *data);
+static int icalcomponent_compare_vtimezones (icalcomponent *vtimezone1,
+ icalcomponent *vtimezone2);
+static int icalcomponent_compare_timezone_fn (const void *elem1,
+ const void *elem2);
+
+
+void icalcomponent_add_children(icalcomponent *impl, va_list args)
+{
+ void* vp;
+
+ while((vp = va_arg(args, void*)) != 0) {
+
+ assert (icalcomponent_isa_component(vp) != 0 ||
+ icalproperty_isa_property(vp) != 0 ) ;
+
+ if (icalcomponent_isa_component(vp) != 0 ){
+ icalcomponent_add_component(impl, (icalcomponent*)vp);
+
+ } else if (icalproperty_isa_property(vp) != 0 ){
+ icalcomponent_add_property(impl, (icalproperty*)vp);
+ }
+ }
+}
+
+static icalcomponent*
+icalcomponent_new_impl (icalcomponent_kind kind)
+{
+ icalcomponent* comp;
+
+ if (!icalcomponent_kind_is_valid(kind))
+ return NULL;
+
+ if ( ( comp = (icalcomponent*) malloc(sizeof(icalcomponent))) == 0) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return 0;
+ }
+
+ strcpy(comp->id,"comp");
+
+ comp->kind = kind;
+ comp->properties = pvl_newlist();
+ comp->property_iterator = 0;
+ comp->components = pvl_newlist();
+ comp->component_iterator = 0;
+ comp->x_name = 0;
+ comp->parent = 0;
+ comp->timezones = NULL;
+ comp->timezones_sorted = 1;
+
+ return comp;
+}
+
+/** @brief Constructor
+ */
+icalcomponent*
+icalcomponent_new (icalcomponent_kind kind)
+{
+ return icalcomponent_new_impl(kind);
+}
+
+/** @brief Constructor
+ */
+icalcomponent*
+icalcomponent_vanew (icalcomponent_kind kind, ...)
+{
+ va_list args;
+
+ icalcomponent *impl = icalcomponent_new_impl(kind);
+
+ if (impl == 0){
+ return 0;
+ }
+
+ va_start(args,kind);
+ icalcomponent_add_children(impl, args);
+ va_end(args);
+
+ return impl;
+}
+
+/** @brief Constructor
+ */
+icalcomponent* icalcomponent_new_from_string(char* str)
+{
+ return icalparser_parse_string(str);
+}
+
+/** @brief Constructor
+ */
+icalcomponent* icalcomponent_new_clone(icalcomponent* old)
+{
+ icalcomponent *new;
+ icalproperty *p;
+ icalcomponent *c;
+ pvl_elem itr;
+
+ icalerror_check_arg_rz( (old!=0), "component");
+
+ new = icalcomponent_new_impl(old->kind);
+
+ if (new == 0){
+ return 0;
+ }
+
+
+ for( itr = pvl_head(old->properties);
+ itr != 0;
+ itr = pvl_next(itr))
+ {
+ p = (icalproperty*)pvl_data(itr);
+ icalcomponent_add_property(new,icalproperty_new_clone(p));
+ }
+
+
+ for( itr = pvl_head(old->components);
+ itr != 0;
+ itr = pvl_next(itr))
+ {
+ c = (icalcomponent*)pvl_data(itr);
+ icalcomponent_add_component(new,icalcomponent_new_clone(c));
+ }
+
+ return new;
+
+}
+
+/*** @brief Destructor
+ */
+void
+icalcomponent_free (icalcomponent* c)
+{
+ icalproperty* prop;
+ icalcomponent* comp;
+
+ icalerror_check_arg_rv( (c!=0), "component");
+
+#ifdef ICAL_FREE_ON_LIST_IS_ERROR
+ icalerror_assert( (c->parent ==0),"Tried to free a component that is still attached to a parent component");
+#else
+ if(c->parent != 0){
+ return;
+ }
+#endif
+
+ if(c != 0 ){
+
+ if ( c->properties != 0 )
+ {
+ while( (prop=pvl_pop(c->properties)) != 0){
+ assert(prop != 0);
+ icalproperty_set_parent(prop,0);
+ icalproperty_free(prop);
+ }
+ pvl_free(c->properties);
+ }
+
+
+ while( (comp=pvl_data(pvl_head(c->components))) != 0){
+ assert(comp!=0);
+ icalcomponent_remove_component(c,comp);
+ icalcomponent_free(comp);
+ }
+
+ pvl_free(c->components);
+
+ if (c->x_name != 0) {
+ free(c->x_name);
+ }
+
+ if (c->timezones)
+ icaltimezone_array_free (c->timezones);
+
+ c->kind = ICAL_NO_COMPONENT;
+ c->properties = 0;
+ c->property_iterator = 0;
+ c->components = 0;
+ c->component_iterator = 0;
+ c->x_name = 0;
+ c->id[0] = 'X';
+ c->timezones = NULL;
+
+ free(c);
+ }
+}
+
+char*
+icalcomponent_as_ical_string (icalcomponent* impl)
+{
+ char* buf, *out_buf;
+ const char* tmp_buf;
+ size_t buf_size = 1024;
+ char* buf_ptr = 0;
+ pvl_elem itr;
+
+/* RFC 2445 explicitly says that the newline is *ALWAYS* a \r\n (CRLF)!!!! */
+char newline[] = "\r\n";
+/* WIN32 automatically adds the \r, Anybody else need it?
+#ifdef ICAL_UNIX_NEWLINE
+ char newline[] = "\n";
+#else
+ char newline[] = "\r\n";
+#endif
+*/
+
+ icalcomponent *c;
+ icalproperty *p;
+ icalcomponent_kind kind = icalcomponent_isa(impl);
+
+ const char* kind_string;
+
+ buf = icalmemory_new_buffer(buf_size);
+ buf_ptr = buf;
+
+ icalerror_check_arg_rz( (impl!=0), "component");
+ icalerror_check_arg_rz( (kind!=ICAL_NO_COMPONENT), "component kind is ICAL_NO_COMPONENT");
+
+ kind_string = icalcomponent_kind_to_string(kind);
+
+ icalerror_check_arg_rz( (kind_string!=0),"Unknown kind of component");
+
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, "BEGIN:");
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, kind_string);
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, newline);
+
+
+
+ for( itr = pvl_head(impl->properties);
+ itr != 0;
+ itr = pvl_next(itr))
+ {
+ p = (icalproperty*)pvl_data(itr);
+
+ icalerror_assert((p!=0),"Got a null property");
+ tmp_buf = icalproperty_as_ical_string(p);
+
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, tmp_buf);
+ }
+
+
+ for( itr = pvl_head(impl->components);
+ itr != 0;
+ itr = pvl_next(itr))
+ {
+ c = (icalcomponent*)pvl_data(itr);
+
+ tmp_buf = icalcomponent_as_ical_string(c);
+
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, tmp_buf);
+
+ }
+
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, "END:");
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size,
+ icalcomponent_kind_to_string(kind));
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, newline);
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, newline);
+
+ out_buf = icalmemory_tmp_copy(buf);
+ free(buf);
+
+ return out_buf;
+}
+
+
+int
+icalcomponent_is_valid (icalcomponent* component)
+{
+ if ( (strcmp(component->id,"comp") == 0) &&
+ component->kind != ICAL_NO_COMPONENT){
+ return 1;
+ } else {
+ return 0;
+ }
+
+}
+
+
+icalcomponent_kind
+icalcomponent_isa (const icalcomponent* component)
+{
+ icalerror_check_arg_rx( (component!=0), "component", ICAL_NO_COMPONENT);
+
+ if(component != 0)
+ {
+ return component->kind;
+ }
+
+ return ICAL_NO_COMPONENT;
+}
+
+
+int
+icalcomponent_isa_component (void* component)
+{
+ icalcomponent *impl = component;
+
+ icalerror_check_arg_rz( (component!=0), "component");
+
+ if (strcmp(impl->id,"comp") == 0) {
+ return 1;
+ } else {
+ return 0;
+ }
+
+}
+
+void
+icalcomponent_add_property (icalcomponent* component, icalproperty* property)
+{
+ icalerror_check_arg_rv( (component!=0), "component");
+ icalerror_check_arg_rv( (property!=0), "property");
+
+ icalerror_assert( (!icalproperty_get_parent(property)),"The property has already been added to a component. Remove the property with icalcomponent_remove_property before calling icalcomponent_add_property");
+
+ icalproperty_set_parent(property,component);
+
+ pvl_push(component->properties,property);
+}
+
+
+void
+icalcomponent_remove_property (icalcomponent* component, icalproperty* property)
+{
+ pvl_elem itr, next_itr;
+
+ icalerror_check_arg_rv( (component!=0), "component");
+ icalerror_check_arg_rv( (property!=0), "property");
+
+ icalerror_assert( (icalproperty_get_parent(property)),"The property is not a member of a component");
+
+
+ for( itr = pvl_head(component->properties);
+ itr != 0;
+ itr = next_itr)
+ {
+ next_itr = pvl_next(itr);
+
+ if( pvl_data(itr) == (void*)property ){
+
+ if (component->property_iterator == itr){
+ component->property_iterator = pvl_next(itr);
+ }
+
+ pvl_remove( component->properties, itr);
+ icalproperty_set_parent(property,0);
+ }
+ }
+}
+
+int
+icalcomponent_count_properties (icalcomponent* component,
+ icalproperty_kind kind)
+{
+ int count=0;
+ pvl_elem itr;
+
+ icalerror_check_arg_rz( (component!=0), "component");
+
+ for( itr = pvl_head(component->properties);
+ itr != 0;
+ itr = pvl_next(itr))
+ {
+ if(kind == icalproperty_isa((icalproperty*)pvl_data(itr)) ||
+ kind == ICAL_ANY_PROPERTY){
+ count++;
+ }
+ }
+
+
+ return count;
+
+}
+
+icalproperty* icalcomponent_get_current_property (icalcomponent* component)
+{
+ icalerror_check_arg_rz( (component!=0),"component");
+
+ if ((component->property_iterator==0)){
+ return 0;
+ }
+
+ return (icalproperty*) pvl_data(component->property_iterator);
+}
+
+icalproperty*
+icalcomponent_get_first_property (icalcomponent* c, icalproperty_kind kind)
+{
+ icalerror_check_arg_rz( (c!=0),"component");
+
+ for( c->property_iterator = pvl_head(c->properties);
+ c->property_iterator != 0;
+ c->property_iterator = pvl_next(c->property_iterator)) {
+
+ icalproperty *p = (icalproperty*) pvl_data(c->property_iterator);
+
+ if (icalproperty_isa(p) == kind || kind == ICAL_ANY_PROPERTY) {
+
+ return p;
+ }
+ }
+ return 0;
+}
+
+icalproperty*
+icalcomponent_get_next_property (icalcomponent* c, icalproperty_kind kind)
+{
+ icalerror_check_arg_rz( (c!=0),"component");
+
+ if (c->property_iterator == 0){
+ return 0;
+ }
+
+ for( c->property_iterator = pvl_next(c->property_iterator);
+ c->property_iterator != 0;
+ c->property_iterator = pvl_next(c->property_iterator)) {
+
+ icalproperty *p = (icalproperty*) pvl_data(c->property_iterator);
+
+ if (icalproperty_isa(p) == kind || kind == ICAL_ANY_PROPERTY) {
+
+ return p;
+ }
+ }
+
+ return 0;
+}
+
+
+icalproperty**
+icalcomponent_get_properties (icalcomponent* component, icalproperty_kind kind);
+
+
+void
+icalcomponent_add_component (icalcomponent* parent, icalcomponent* child)
+{
+ icalerror_check_arg_rv( (parent!=0), "parent");
+ icalerror_check_arg_rv( (child!=0), "child");
+
+ if (child->parent !=0) {
+ icalerror_set_errno(ICAL_USAGE_ERROR);
+ }
+
+ child->parent = parent;
+
+ pvl_push(parent->components,child);
+
+ /* If the new component is a VTIMEZONE, add it to our array. */
+ if (child->kind == ICAL_VTIMEZONE_COMPONENT) {
+ /* FIXME: Currently we are also creating this array when loading in
+ a builtin VTIMEZONE, when we don't need it. */
+ if (!parent->timezones)
+ parent->timezones = icaltimezone_array_new ();
+
+ icaltimezone_array_append_from_vtimezone (parent->timezones, child);
+
+ /* Flag that we need to sort it before doing any binary searches. */
+ parent->timezones_sorted = 0;
+ }
+}
+
+
+void
+icalcomponent_remove_component (icalcomponent* parent, icalcomponent* child)
+{
+ pvl_elem itr, next_itr;
+
+ icalerror_check_arg_rv( (parent!=0), "parent");
+ icalerror_check_arg_rv( (child!=0), "child");
+
+ /* If the component is a VTIMEZONE, remove it from our array as well. */
+ if (child->kind == ICAL_VTIMEZONE_COMPONENT) {
+ icaltimezone *zone;
+ int i, num_elements;
+
+ num_elements = parent->timezones ? parent->timezones->num_elements : 0;
+ for (i = 0; i < num_elements; i++) {
+ zone = icalarray_element_at (parent->timezones, i);
+ if (icaltimezone_get_component (zone) == child) {
+ icaltimezone_free (zone, 0);
+ icalarray_remove_element_at (parent->timezones, i);
+ break;
+ }
+ }
+ }
+
+ for( itr = pvl_head(parent->components);
+ itr != 0;
+ itr = next_itr)
+ {
+ next_itr = pvl_next(itr);
+
+ if( pvl_data(itr) == (void*)child ){
+
+ if (parent->component_iterator == itr){
+ /* Don't let the current iterator become invalid */
+
+ /* HACK. The semantics for this are troubling. */
+ parent->component_iterator =
+ pvl_next(parent->component_iterator);
+
+ }
+ pvl_remove( parent->components, itr);
+ child->parent = 0;
+ break;
+ }
+ }
+}
+
+
+int
+icalcomponent_count_components (icalcomponent* component,
+ icalcomponent_kind kind)
+{
+ int count=0;
+ pvl_elem itr;
+
+ icalerror_check_arg_rz( (component!=0), "component");
+
+ for( itr = pvl_head(component->components);
+ itr != 0;
+ itr = pvl_next(itr))
+ {
+ if(kind == icalcomponent_isa((icalcomponent*)pvl_data(itr)) ||
+ kind == ICAL_ANY_COMPONENT){
+ count++;
+ }
+ }
+
+ return count;
+}
+
+icalcomponent*
+icalcomponent_get_current_component(icalcomponent* component)
+{
+ icalerror_check_arg_rz( (component!=0),"component");
+
+ if (component->component_iterator == 0){
+ return 0;
+ }
+
+ return (icalcomponent*) pvl_data(component->component_iterator);
+}
+
+icalcomponent*
+icalcomponent_get_first_component (icalcomponent* c,
+ icalcomponent_kind kind)
+{
+ icalerror_check_arg_rz( (c!=0),"component");
+
+ for( c->component_iterator = pvl_head(c->components);
+ c->component_iterator != 0;
+ c->component_iterator = pvl_next(c->component_iterator)) {
+
+ icalcomponent *p = (icalcomponent*) pvl_data(c->component_iterator);
+
+ if (icalcomponent_isa(p) == kind || kind == ICAL_ANY_COMPONENT) {
+
+ return p;
+ }
+ }
+
+ return 0;
+}
+
+
+icalcomponent*
+icalcomponent_get_next_component (icalcomponent* c, icalcomponent_kind kind)
+{
+ icalerror_check_arg_rz( (c!=0),"component");
+
+ if (c->component_iterator == 0){
+ return 0;
+ }
+
+ for( c->component_iterator = pvl_next(c->component_iterator);
+ c->component_iterator != 0;
+ c->component_iterator = pvl_next(c->component_iterator)) {
+
+ icalcomponent *p = (icalcomponent*) pvl_data(c->component_iterator);
+
+ if (icalcomponent_isa(p) == kind || kind == ICAL_ANY_COMPONENT) {
+
+ return p;
+ }
+ }
+
+ return 0;
+}
+
+icalcomponent* icalcomponent_get_first_real_component(icalcomponent *c)
+{
+ icalcomponent *comp;
+
+ for(comp = icalcomponent_get_first_component(c,ICAL_ANY_COMPONENT);
+ comp != 0;
+ comp = icalcomponent_get_next_component(c,ICAL_ANY_COMPONENT)){
+
+ icalcomponent_kind kind = icalcomponent_isa(comp);
+
+ if(kind == ICAL_VEVENT_COMPONENT ||
+ kind == ICAL_VTODO_COMPONENT ||
+ kind == ICAL_VJOURNAL_COMPONENT ||
+ kind == ICAL_VFREEBUSY_COMPONENT ||
+ kind == ICAL_VQUERY_COMPONENT ||
+ kind == ICAL_VAGENDA_COMPONENT){
+ return comp;
+ }
+ }
+ return 0;
+}
+
+
+/** @brief Get the timespan covered by this component, in UTC
+ * (deprecated)
+ *
+ * see icalcomponent_foreach_recurrence() for a better way to
+ * extract spans from an component.
+ *
+ * This method can be called on either a VCALENDAR or any real
+ * component. If the VCALENDAR contains no real component, but
+ * contains a VTIMEZONE, we return that span instead.
+ * This might not be a desirable behavior; we keep it for now
+ * for backward compatibility, but it might be deprecated at a
+ * future time.
+ *
+ * FIXME this API needs to be clarified. DTEND is defined as the
+ * first available time after the end of this event, so the span
+ * should actually end 1 second before DTEND.
+ */
+
+icaltime_span icalcomponent_get_span(icalcomponent* comp)
+{
+ icalcomponent *inner;
+ icalcomponent_kind kind;
+ icaltime_span span;
+ struct icaltimetype start, end;
+
+ span.start = 0;
+ span.end = 0;
+ span.is_busy= 1;
+
+ /* initial Error checking */
+ if (comp == NULL) {
+ return span;
+ }
+
+ /* FIXME this might go away */
+ kind = icalcomponent_isa(comp);
+ if(kind == ICAL_VCALENDAR_COMPONENT){
+ inner = icalcomponent_get_first_real_component(comp);
+
+ /* Maybe there is a VTIMEZONE in there */
+ if (inner == 0){
+ inner = icalcomponent_get_first_component(comp,
+ ICAL_VTIMEZONE_COMPONENT);
+ }
+
+ } else {
+ inner = comp;
+ }
+
+ if (inner == 0){
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ /*icalerror_warn("icalcomponent_get_span: no component specified, or empty VCALENDAR component");*/
+ return span;
+ }
+
+ kind = icalcomponent_isa(inner);
+
+ if( !( kind == ICAL_VEVENT_COMPONENT ||
+ kind == ICAL_VJOURNAL_COMPONENT ||
+ kind == ICAL_VTODO_COMPONENT ||
+ kind == ICAL_VFREEBUSY_COMPONENT )) {
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ /*icalerror_warn("icalcomponent_get_span: no component specified, or empty VCALENDAR component");*/
+ return span;
+
+ }
+
+ /* Get to work. starting with DTSTART */
+ start = icalcomponent_get_dtstart(comp);
+ if (icaltime_is_null_time(start)) {
+ return span;
+ }
+ span.start = icaltime_as_timet_with_zone(start,
+ icaltimezone_get_utc_timezone());
+
+ /* The end time could be specified as either a DTEND or a DURATION */
+ /* icalcomponent_get_dtend takes care of these cases. */
+ end = icalcomponent_get_dtend(comp);
+ if (icaltime_is_null_time(end)) {
+ if (!icaltime_is_date(start)) {
+ /* If dtstart is a DATE-TIME and there is no DTEND nor DURATION
+ it takes no time */
+ span.start = 0;
+ return span;
+ } else {
+ end = start;
+ }
+ }
+
+ span.end = icaltime_as_timet_with_zone(end,
+ icaltimezone_get_utc_timezone());
+ if (icaltime_is_date(start)) {
+ /* Until the end of the day*/
+ span.end += 60*60*24 - 1;
+ }
+
+ return span;
+
+}
+
+/**
+ * Decide if this recurrance is acceptable
+ *
+ * @param comp A valid icalcomponent.
+ * @param dtstart The base dtstart value for this component.
+ * @param recurtime The time to test against.
+ *
+ * @return true if the recurrence value is excluded, false otherwise.
+ *
+ * This function decides if a specific recurrence value is
+ * excluded by EXRULE or EXDATE properties.
+ *
+ * It's not the most efficient code. You might get better performance
+ * if you assume that recurtime is always increasing for each
+ * call. Then you could:
+ *
+ * - sort the EXDATE values
+ * - save the state of each EXRULE iterator for the next call.
+ *
+ * In this case though you don't need to worry how you call this
+ * function. It will always return the correct result.
+ */
+
+int icalproperty_recurrence_is_excluded(icalcomponent *comp,
+ struct icaltimetype *dtstart,
+ struct icaltimetype *recurtime) {
+ icalproperty *exdate, *exrule;
+
+ if (comp == NULL ||
+ dtstart == NULL ||
+ recurtime == NULL ||
+ icaltime_is_null_time(*recurtime))
+ /* BAD DATA */
+ return 1;
+
+ /** first test against the exdate values **/
+ for (exdate = icalcomponent_get_first_property(comp,ICAL_EXDATE_PROPERTY);
+ exdate != NULL;
+ exdate = icalcomponent_get_next_property(comp,ICAL_EXDATE_PROPERTY)) {
+
+ struct icaltimetype exdatetime = icalproperty_get_exdate(exdate);
+
+ if (icaltime_compare(*recurtime, exdatetime) == 0) {
+ /** MATCHED **/
+ return 1;
+ }
+ }
+
+ /** Now test against the EXRULEs **/
+ for (exrule = icalcomponent_get_first_property(comp,ICAL_EXRULE_PROPERTY);
+ exrule != NULL;
+ exrule = icalcomponent_get_next_property(comp,ICAL_EXRULE_PROPERTY)) {
+
+ struct icalrecurrencetype recur = icalproperty_get_exrule(exrule);
+ icalrecur_iterator *exrule_itr = icalrecur_iterator_new(recur, *dtstart);
+ struct icaltimetype exrule_time;
+
+ while (1) {
+ int result;
+ exrule_time = icalrecur_iterator_next(exrule_itr);
+
+ if (icaltime_is_null_time(exrule_time))
+ break;
+
+ result = icaltime_compare(*recurtime, exrule_time);
+ if (result == 0) {
+ icalrecur_iterator_free(exrule_itr);
+ return 1; /** MATCH **/
+ }
+ if (result == 1)
+ break; /** exrule_time > recurtime **/
+ }
+
+ icalrecur_iterator_free(exrule_itr);
+ }
+
+ return 0; /** no matches **/
+}
+
+/**
+ * @brief Return the busy status based on the TRANSP property.
+ *
+ * @param comp A valid icalcomponent.
+ *
+ * @return 1 if the event is a busy item, 0 if it is not.
+ */
+
+static int icalcomponent_is_busy(icalcomponent *comp) {
+ icalproperty *transp;
+ enum icalproperty_status status;
+ int ret = 1;
+
+ /** @todo check access control here, converting busy->free if the
+ permissions do not allow access... */
+
+ /* Is this a busy time? Check the TRANSP property */
+ transp = icalcomponent_get_first_property(comp, ICAL_TRANSP_PROPERTY);
+
+ if (transp) {
+ icalvalue *transp_val = icalproperty_get_value(transp);
+
+ switch (icalvalue_get_transp(transp_val)) {
+ case ICAL_TRANSP_OPAQUE:
+ case ICAL_TRANSP_OPAQUENOCONFLICT:
+ case ICAL_TRANSP_NONE:
+ ret = 1;
+ break;
+ case ICAL_TRANSP_TRANSPARENT:
+ case ICAL_TRANSP_TRANSPARENTNOCONFLICT:
+ ret = 0;
+ break;
+ default:
+ ret = 0;
+ break;
+ }
+ }
+ status = icalcomponent_get_status(comp);
+ if (ret && status) {
+ switch (status) {
+ case ICAL_STATUS_CANCELLED:
+ case ICAL_STATUS_TENTATIVE:
+ ret = 0;
+ break;
+ default:
+ break;
+ }
+ }
+ return(ret);
+}
+
+
+
+
+/**
+ * @brief cycle through all recurrances of an event
+ *
+ * @param comp A valid VEVENT component
+ * @param start Ignore timespans before this
+ * @param end Ignore timespans after this
+ * @param callback Function called for each timespan within the range
+ * @param callback_data Pointer passed back to the callback function
+ *
+ * This function will call the specified callback function for once
+ * for the base value of DTSTART, and foreach recurring date/time
+ * value.
+ *
+ * It will filter out events that are specified as an EXDATE or an EXRULE.
+ *
+ * @todo We do not filter out duplicate RRULES/RDATES
+ * @todo We do not handle RDATEs with explicit periods
+ */
+
+void icalcomponent_foreach_recurrence(icalcomponent* comp,
+ struct icaltimetype start,
+ struct icaltimetype end,
+ void (*callback)(icalcomponent *comp,
+ struct icaltime_span *span,
+ void *data),
+ void *callback_data)
+{
+ struct icaltimetype dtstart, dtend;
+ icaltime_span recurspan, basespan, limit_span;
+ time_t limit_start, limit_end;
+ int dtduration;
+ icalproperty *rrule, *rdate;
+ struct icaldurationtype dur;
+ pvl_elem property_iterator; /* for saving the iterator */
+
+ if (comp == NULL || callback == NULL)
+ return;
+
+ dtstart = icalcomponent_get_dtstart(comp);
+
+ if (icaltime_is_null_time(dtstart))
+ return;
+
+
+ /* The end time could be specified as either a DTEND or a DURATION */
+ /* icalcomponent_get_dtend takes care of these cases. */
+ dtend = icalcomponent_get_dtend(comp);
+
+ /* Now set up the base span for this item, corresponding to the
+ base DTSTART and DTEND */
+ basespan = icaltime_span_new(dtstart, dtend, 1);
+
+ basespan.is_busy = icalcomponent_is_busy(comp);
+
+
+ /** Calculate the ceiling and floor values.. **/
+ limit_start = icaltime_as_timet_with_zone(start, icaltimezone_get_utc_timezone());
+ if (!icaltime_is_null_time(end))
+ limit_end = icaltime_as_timet_with_zone(end, icaltimezone_get_utc_timezone());
+ else
+ limit_end = INT_MAX; /* max 32 bit time_t */
+
+ limit_span.start = limit_start;
+ limit_span.end = limit_end;
+
+
+ /* Do the callback for the initial DTSTART entry */
+
+ if (!icalproperty_recurrence_is_excluded(comp, &dtstart, &dtstart)) {
+ /** call callback action **/
+ if (icaltime_span_overlaps(&basespan, &limit_span))
+ (*callback) (comp, &basespan, callback_data);
+ }
+
+ recurspan = basespan;
+ dtduration = basespan.end - basespan.start;
+
+ /* Now cycle through the rrule entries */
+ for (rrule = icalcomponent_get_first_property(comp,ICAL_RRULE_PROPERTY);
+ rrule != NULL;
+ rrule = icalcomponent_get_next_property(comp,ICAL_RRULE_PROPERTY)) {
+
+ struct icalrecurrencetype recur = icalproperty_get_rrule(rrule);
+ icalrecur_iterator *rrule_itr = icalrecur_iterator_new(recur, dtstart);
+ struct icaltimetype rrule_time = icalrecur_iterator_next(rrule_itr);
+ /** note that icalrecur_iterator_next always returns dtstart
+ the first time.. **/
+
+ while (1) {
+ rrule_time = icalrecur_iterator_next(rrule_itr);
+
+ if (icaltime_is_null_time(rrule_time))
+ break;
+
+ dur = icaltime_subtract(rrule_time, dtstart);
+
+ recurspan.start = basespan.start + icaldurationtype_as_int(dur);
+ recurspan.end = recurspan.start + dtduration;
+
+ /** save the iterator ICK! **/
+ property_iterator = comp->property_iterator;
+
+ if (!icalproperty_recurrence_is_excluded(comp, &dtstart, &rrule_time)) {
+ /** call callback action **/
+ if (icaltime_span_overlaps(&recurspan, &limit_span))
+ (*callback) (comp, &recurspan, callback_data);
+ }
+ comp->property_iterator = property_iterator;
+ } /* end of iteration over a specific RRULE */
+
+ icalrecur_iterator_free(rrule_itr);
+ } /* end of RRULE loop */
+
+
+ /** Now process RDATE entries **/
+ for (rdate = icalcomponent_get_first_property(comp,ICAL_RDATE_PROPERTY);
+ rdate != NULL;
+ rdate = icalcomponent_get_next_property(comp,ICAL_RDATE_PROPERTY)) {
+
+ struct icaldatetimeperiodtype rdate_period = icalproperty_get_rdate(rdate);
+
+ /** RDATES can specify raw datetimes, periods, or dates.
+ we only support raw datetimes for now..
+
+ @todo Add support for other types **/
+
+ if (icaltime_is_null_time(rdate_period.time))
+ continue;
+
+ dur = icaltime_subtract(rdate_period.time, dtstart);
+
+ recurspan.start = basespan.start + icaldurationtype_as_int(dur);
+ recurspan.end = recurspan.start + dtduration;
+
+ /** save the iterator ICK! **/
+ property_iterator = comp->property_iterator;
+
+ if (!icalproperty_recurrence_is_excluded(comp, &dtstart, &rdate_period.time)) {
+ /** call callback action **/
+ (*callback) (comp, &recurspan, callback_data);
+ }
+ comp->property_iterator = property_iterator;
+ }
+}
+
+
+
+int icalcomponent_check_restrictions(icalcomponent* comp){
+ icalerror_check_arg_rz(comp!=0,"comp");
+ return icalrestriction_check(comp);
+}
+
+/** @brief returns the number of errors encountered parsing the data
+ *
+ * This function counts the number times the X-LIC-ERROR occurs
+ * in the data structure.
+ */
+
+int icalcomponent_count_errors(icalcomponent* component)
+{
+ int errors = 0;
+ icalproperty *p;
+ icalcomponent *c;
+ pvl_elem itr;
+
+ for( itr = pvl_head(component->properties);
+ itr != 0;
+ itr = pvl_next(itr))
+ {
+ p = (icalproperty*)pvl_data(itr);
+
+ if(icalproperty_isa(p) == ICAL_XLICERROR_PROPERTY)
+ {
+ errors++;
+ }
+ }
+
+
+ for( itr = pvl_head(component->components);
+ itr != 0;
+ itr = pvl_next(itr))
+ {
+ c = (icalcomponent*)pvl_data(itr);
+
+ errors += icalcomponent_count_errors(c);
+
+ }
+
+ return errors;
+}
+
+
+void icalcomponent_strip_errors(icalcomponent* component)
+{
+ icalproperty *p;
+ icalcomponent *c;
+ pvl_elem itr, next_itr;
+
+ for( itr = pvl_head(component->properties);
+ itr != 0;
+ itr = next_itr)
+ {
+ p = (icalproperty*)pvl_data(itr);
+ next_itr = pvl_next(itr);
+
+ if(icalproperty_isa(p) == ICAL_XLICERROR_PROPERTY)
+ {
+ icalcomponent_remove_property(component,p);
+ }
+ }
+
+ for( itr = pvl_head(component->components);
+ itr != 0;
+ itr = pvl_next(itr))
+ {
+ c = (icalcomponent*)pvl_data(itr);
+ icalcomponent_strip_errors(c);
+ }
+}
+
+/* Hack. This will change the state of the iterators */
+void icalcomponent_convert_errors(icalcomponent* component)
+{
+ icalproperty *p, *next_p;
+ icalcomponent *c;
+
+ for(p = icalcomponent_get_first_property(component,ICAL_ANY_PROPERTY);
+ p != 0;
+ p = next_p){
+
+ next_p = icalcomponent_get_next_property(component,ICAL_ANY_PROPERTY);
+
+ if(icalproperty_isa(p) == ICAL_XLICERROR_PROPERTY)
+ {
+ struct icalreqstattype rst;
+ icalparameter *param = icalproperty_get_first_parameter
+ (p,ICAL_XLICERRORTYPE_PARAMETER);
+
+ rst.code = ICAL_UNKNOWN_STATUS;
+ rst.desc = 0;
+
+ switch(icalparameter_get_xlicerrortype(param)){
+
+ case ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR: {
+ rst.code = ICAL_3_2_INVPARAM_STATUS;
+ break;
+ }
+ case ICAL_XLICERRORTYPE_PARAMETERVALUEPARSEERROR: {
+ rst.code = ICAL_3_3_INVPARAMVAL_STATUS;
+ break;
+ }
+ case ICAL_XLICERRORTYPE_PROPERTYPARSEERROR: {
+ rst.code = ICAL_3_0_INVPROPNAME_STATUS;
+ break;
+ }
+ case ICAL_XLICERRORTYPE_VALUEPARSEERROR: {
+ rst.code = ICAL_3_1_INVPROPVAL_STATUS;
+ break;
+ }
+ case ICAL_XLICERRORTYPE_COMPONENTPARSEERROR: {
+ rst.code = ICAL_3_4_INVCOMP_STATUS;
+ break;
+ }
+
+ default: {
+ break;
+ }
+ }
+ if (rst.code != ICAL_UNKNOWN_STATUS){
+
+ rst.debug = icalproperty_get_xlicerror(p);
+ icalcomponent_add_property(component,
+ icalproperty_new_requeststatus(rst));
+
+ icalcomponent_remove_property(component,p);
+ }
+ }
+ }
+
+ for(c = icalcomponent_get_first_component(component,ICAL_ANY_COMPONENT);
+ c != 0;
+ c = icalcomponent_get_next_component(component,ICAL_ANY_COMPONENT)){
+
+ icalcomponent_convert_errors(c);
+ }
+}
+
+
+icalcomponent* icalcomponent_get_parent(icalcomponent* component)
+{
+ return component->parent;
+}
+
+void icalcomponent_set_parent(icalcomponent* component, icalcomponent* parent)
+{
+ component->parent = parent;
+}
+
+icalcompiter icalcompiter_null = {ICAL_NO_COMPONENT,0};
+
+
+struct icalcomponent_kind_map {
+ icalcomponent_kind kind;
+ char name[20];
+};
+
+
+
+static struct icalcomponent_kind_map component_map[] =
+{
+ { ICAL_VEVENT_COMPONENT, "VEVENT" },
+ { ICAL_VTODO_COMPONENT, "VTODO" },
+ { ICAL_VJOURNAL_COMPONENT, "VJOURNAL" },
+ { ICAL_VCALENDAR_COMPONENT, "VCALENDAR" },
+ { ICAL_VAGENDA_COMPONENT, "VAGENDA" },
+ { ICAL_VFREEBUSY_COMPONENT, "VFREEBUSY" },
+ { ICAL_VTIMEZONE_COMPONENT, "VTIMEZONE" },
+ { ICAL_VALARM_COMPONENT, "VALARM" },
+ { ICAL_XSTANDARD_COMPONENT, "STANDARD" }, /*These are part of RFC2445 */
+ { ICAL_XDAYLIGHT_COMPONENT, "DAYLIGHT" }, /*but are not really components*/
+ { ICAL_X_COMPONENT, "X" },
+ { ICAL_VSCHEDULE_COMPONENT, "SCHEDULE" },
+
+ /* CAP components */
+ { ICAL_VQUERY_COMPONENT, "VQUERY" },
+ { ICAL_VCAR_COMPONENT, "VCAR" },
+ { ICAL_VCOMMAND_COMPONENT, "VCOMMAND" },
+
+ /* libical private components */
+ { ICAL_XLICINVALID_COMPONENT, "X-LIC-UNKNOWN" },
+ { ICAL_XLICMIMEPART_COMPONENT, "X-LIC-MIME-PART" },
+ { ICAL_ANY_COMPONENT, "ANY" },
+ { ICAL_XROOT_COMPONENT, "XROOT" },
+
+ /* End of list */
+ { ICAL_NO_COMPONENT, "" },
+};
+
+
+int icalcomponent_kind_is_valid(const icalcomponent_kind kind)
+{
+ int i = 0;
+ do {
+ if (component_map[i].kind == kind)
+ return 1;
+ } while (component_map[i++].kind != ICAL_NO_COMPONENT);
+
+ return 0;
+}
+
+const char* icalcomponent_kind_to_string(icalcomponent_kind kind)
+{
+ int i;
+
+ for (i=0; component_map[i].kind != ICAL_NO_COMPONENT; i++) {
+ if (component_map[i].kind == kind) {
+ return component_map[i].name;
+ }
+ }
+
+ return 0;
+
+}
+
+icalcomponent_kind icalcomponent_string_to_kind(const char* string)
+{
+ int i;
+
+ if (string ==0 ) {
+ return ICAL_NO_COMPONENT;
+ }
+
+ for (i=0; component_map[i].kind != ICAL_NO_COMPONENT; i++) {
+ if (strcasecmp(component_map[i].name, string) == 0) {
+ return component_map[i].kind;
+ }
+ }
+
+ return ICAL_NO_COMPONENT;
+}
+
+
+
+icalcompiter
+icalcomponent_begin_component(icalcomponent* component,icalcomponent_kind kind)
+{
+ icalcompiter itr;
+ pvl_elem i;
+
+ itr.kind = kind;
+ itr.iter = NULL;
+
+ icalerror_check_arg_re(component!=0,"component",icalcompiter_null);
+
+ for( i = pvl_head(component->components); i != 0; i = pvl_next(i)) {
+
+ 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)
+{
+ icalcompiter itr;
+ pvl_elem i;
+
+ itr.kind = kind;
+
+ icalerror_check_arg_re(component!=0,"component",icalcompiter_null);
+
+ for( i = pvl_tail(component->components); i != 0; i = pvl_prior(i)) {
+
+ icalcomponent *c = (icalcomponent*) pvl_data(i);
+
+ if (icalcomponent_isa(c) == kind || kind == ICAL_ANY_COMPONENT) {
+
+ itr.iter = pvl_next(i);
+
+ return itr;
+ }
+ }
+
+ return icalcompiter_null;;
+}
+
+
+icalcomponent* icalcompiter_next(icalcompiter* i)
+{
+ if (i->iter == 0){
+ return 0;
+ }
+
+ icalerror_check_arg_rz( (i!=0),"i");
+
+ for( i->iter = pvl_next(i->iter);
+ i->iter != 0;
+ i->iter = pvl_next(i->iter)) {
+
+ icalcomponent *c = (icalcomponent*) pvl_data(i->iter);
+
+ if (icalcomponent_isa(c) == i->kind
+ || i->kind == ICAL_ANY_COMPONENT) {
+
+ return icalcompiter_deref(i);;
+ }
+ }
+
+ return 0;
+
+}
+
+icalcomponent* icalcompiter_prior(icalcompiter* i)
+{
+ if (i->iter == 0){
+ return 0;
+ }
+
+ for( i->iter = pvl_prior(i->iter);
+ i->iter != 0;
+ i->iter = pvl_prior(i->iter)) {
+
+ icalcomponent *c = (icalcomponent*) pvl_data(i->iter);
+
+ if (icalcomponent_isa(c) == i->kind
+ || i->kind == ICAL_ANY_COMPONENT) {
+
+ return icalcompiter_deref(i);;
+ }
+ }
+
+ return 0;
+
+}
+icalcomponent* icalcompiter_deref(icalcompiter* i)
+{
+ if(i->iter ==0){
+ return 0;
+ }
+
+ return pvl_data(i->iter);
+}
+
+icalcomponent* icalcomponent_get_inner(icalcomponent* comp)
+{
+ if (icalcomponent_isa(comp) == ICAL_VCALENDAR_COMPONENT){
+ return icalcomponent_get_first_real_component(comp);
+ } else {
+ return comp;
+ }
+}
+
+/** @brief sets the METHOD property to the given method
+ */
+
+void icalcomponent_set_method(icalcomponent* comp, icalproperty_method method)
+{
+ icalproperty *prop
+ = icalcomponent_get_first_property(comp, ICAL_METHOD_PROPERTY);
+
+
+ if (prop == 0){
+ prop = icalproperty_new_method(method);
+ icalcomponent_add_property(comp, prop);
+ }
+
+ icalproperty_set_method(prop,method);
+
+}
+
+/** @brief returns the METHOD property
+ */
+
+icalproperty_method icalcomponent_get_method(icalcomponent* comp)
+{
+ icalproperty *prop
+ = icalcomponent_get_first_property(comp,ICAL_METHOD_PROPERTY);
+
+ if (prop == 0){
+ return ICAL_METHOD_NONE;
+ }
+
+ return icalproperty_get_method(prop);
+}
+
+#define ICALSETUPSET(p_kind) \
+ icalcomponent *inner; \
+ icalproperty *prop; \
+ icalerror_check_arg_rv(comp!=0,"comp");\
+ inner = icalcomponent_get_inner(comp); \
+ if(inner == 0){\
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);\
+ return;\
+ }\
+ prop = icalcomponent_get_first_property(inner, p_kind);
+
+
+/** @brief Set DTSTART property to given icaltime
+ *
+ * This method respects the icaltime type (DATE vs DATE-TIME) and
+ * timezone (or lack thereof).
+ */
+void icalcomponent_set_dtstart(icalcomponent* comp, struct icaltimetype v)
+{
+ const char *tzid;
+ ICALSETUPSET(ICAL_DTSTART_PROPERTY);
+
+ if (prop == 0){
+ prop = icalproperty_new_dtstart(v);
+ icalcomponent_add_property(inner, prop);
+ } else {
+ icalproperty_remove_parameter_by_kind(prop, ICAL_TZID_PARAMETER);
+ }
+
+ icalproperty_set_dtstart(prop,v);
+
+ if ((tzid = icaltime_get_tzid(v)) != NULL && !icaltime_is_utc(v)) {
+ icalproperty_add_parameter(prop, icalparameter_new_tzid(tzid));
+ }
+}
+
+/** @brief Get a DATE or DATE-TIME property as an icaltime
+ *
+ * If the property is a DATE-TIME with a timezone parameter and a
+ * corresponding VTIMEZONE is present in the component, the
+ * returned component will already be in the correct timezone;
+ * otherwise the caller is responsible for converting it.
+ *
+ * FIXME this is useless until we can flag the failure
+ */
+static struct icaltimetype
+icalcomponent_get_datetime(icalcomponent *comp, icalproperty *prop) {
+
+ icalparameter *param;
+ struct icaltimetype ret;
+
+ ret = icalvalue_get_datetime(icalproperty_get_value(prop));
+
+ if ((param = icalproperty_get_first_parameter(prop, ICAL_TZID_PARAMETER))
+ != NULL) {
+ const char *tzid = icalparameter_get_tzid(param);
+ icaltimezone *tz;
+
+ if ((tz = icalcomponent_get_timezone(comp, tzid)) != NULL) {
+ icaltime_set_timezone(&ret, tz);
+ }
+ }
+
+ return ret;
+}
+
+/** @brief Get DTSTART property as an icaltime
+ *
+ * If DTSTART is a DATE-TIME with a timezone parameter and a
+ * corresponding VTIMEZONE is present in the component, the
+ * returned component will already be in the correct timezone;
+ * otherwise the caller is responsible for converting it.
+ *
+ * FIXME this is useless until we can flag the failure
+ */
+struct icaltimetype icalcomponent_get_dtstart(icalcomponent* comp)
+{
+ icalcomponent *inner = icalcomponent_get_inner(comp);
+ icalproperty *prop;
+
+ prop = icalcomponent_get_first_property(inner,ICAL_DTSTART_PROPERTY);
+ if (prop == 0){
+ return icaltime_null_time();
+ }
+
+ return icalcomponent_get_datetime(comp, prop);
+}
+
+/** @brief Get DTEND property as an icaltime
+ *
+ * If a DTEND property is not present but a DURATION is, we use
+ * that to determine the proper end.
+ *
+ * If DTSTART is a DATE-TIME with a timezone parameter and a
+ * corresponding VTIMEZONE is present in the component, the
+ * returned component will already be in the correct timezone;
+ * otherwise the caller is responsible for converting it.
+ *
+ * FIXME this is useless until we can flag the failure
+ */
+struct icaltimetype icalcomponent_get_dtend(icalcomponent* comp)
+{
+ icalcomponent *inner = icalcomponent_get_inner(comp);
+ icalproperty *end_prop
+ = icalcomponent_get_first_property(inner,ICAL_DTEND_PROPERTY);
+ icalproperty *dur_prop
+ = icalcomponent_get_first_property(inner, ICAL_DURATION_PROPERTY);
+ struct icaltimetype ret = icaltime_null_time();
+
+ if ( end_prop != 0) {
+ ret = icalcomponent_get_datetime(comp, end_prop);
+ } else if ( dur_prop != 0) {
+
+ struct icaltimetype start =
+ icalcomponent_get_dtstart(inner);
+ struct icaldurationtype duration =
+ icalproperty_get_duration(dur_prop);
+
+ struct icaltimetype end = icaltime_add(start,duration);
+
+ ret = end;
+ }
+
+ return ret;
+}
+
+/** @brief Set DTEND property to given icaltime
+ *
+ * This method respects the icaltime type (DATE vs DATE-TIME) and
+ * timezone (or lack thereof).
+ *
+ * This also checks that a DURATION property isn't already there,
+ * and returns an error if it is. It's the caller's responsibility
+ * to remove it.
+ */
+void icalcomponent_set_dtend(icalcomponent* comp, struct icaltimetype v)
+{
+ const char *tzid;
+ ICALSETUPSET(ICAL_DTEND_PROPERTY);
+
+ if (icalcomponent_get_first_property(inner,ICAL_DURATION_PROPERTY)
+ != NULL) {
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return;
+ }
+
+ if (prop == 0) {
+ prop = icalproperty_new_dtend(v);
+ icalcomponent_add_property(inner, prop);
+ } else {
+ icalproperty_remove_parameter_by_kind(prop, ICAL_TZID_PARAMETER);
+ }
+
+ icalproperty_set_dtend(prop,v);
+
+ if ((tzid = icaltime_get_tzid(v)) != NULL && !icaltime_is_utc(v)) {
+ icalproperty_add_parameter(prop, icalparameter_new_tzid(tzid));
+ }
+}
+
+/** @brief Set DURATION property to given icalduration
+ *
+ * This method respects the icaltime type (DATE vs DATE-TIME) and
+ * timezone (or lack thereof).
+ *
+ * This also checks that a DTEND property isn't already there,
+ * and returns an error if it is. It's the caller's responsibility
+ * to remove it.
+ */
+void icalcomponent_set_duration(icalcomponent* comp,
+ struct icaldurationtype v)
+{
+ ICALSETUPSET(ICAL_DURATION_PROPERTY);
+
+ if (icalcomponent_get_first_property(inner,ICAL_DTEND_PROPERTY) != NULL) {
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return;
+ }
+
+ if (prop == 0) {
+ prop = icalproperty_new_duration(v);
+ icalcomponent_add_property(inner, prop);
+ } else {
+ icalproperty_set_duration(prop,v);
+ }
+}
+
+/** @brief Get DURATION property as an icalduration
+ *
+ * If a DURATION property is not present but a DTEND is, we use
+ * that to determine the proper end.
+ */
+struct icaldurationtype icalcomponent_get_duration(icalcomponent* comp)
+{
+ icalcomponent *inner = icalcomponent_get_inner(comp);
+
+ icalproperty *end_prop
+ = icalcomponent_get_first_property(inner,ICAL_DTEND_PROPERTY);
+
+ icalproperty *dur_prop
+ = icalcomponent_get_first_property(inner,ICAL_DURATION_PROPERTY);
+
+ struct icaldurationtype ret = icaldurationtype_null_duration();
+
+ if ( dur_prop != 0 && end_prop == 0) {
+ ret = icalproperty_get_duration(dur_prop);
+
+ } else if ( end_prop != 0 && dur_prop == 0) {
+ /**
+ * FIXME
+ * We assume DTSTART and DTEND are not in different time zones.
+ * Does the standard actually guarantee this?
+ */
+ struct icaltimetype start =
+ icalcomponent_get_dtstart(inner);
+ struct icaltimetype end =
+ icalcomponent_get_dtend(inner);
+
+ ret = icaltime_subtract(end, start);
+ } else {
+ /* Error, both duration and dtend have been specified */
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ }
+ return ret;
+}
+
+void icalcomponent_set_dtstamp(icalcomponent* comp, struct icaltimetype v)
+{
+
+ ICALSETUPSET(ICAL_DTSTAMP_PROPERTY);
+
+ if (prop == 0){
+ prop = icalproperty_new_dtstamp(v);
+ icalcomponent_add_property(inner, prop);
+ }
+
+ icalproperty_set_dtstamp(prop,v);
+
+}
+
+
+struct icaltimetype icalcomponent_get_dtstamp(icalcomponent* comp)
+{
+ icalcomponent *inner = icalcomponent_get_inner(comp);
+ icalproperty *prop
+ = icalcomponent_get_first_property(inner,ICAL_DTSTAMP_PROPERTY);
+
+ if (prop == 0){
+ return icaltime_null_time();
+ }
+
+ return icalproperty_get_dtstamp(prop);
+}
+
+
+void icalcomponent_set_summary(icalcomponent* comp, const char* v)
+{
+ ICALSETUPSET(ICAL_SUMMARY_PROPERTY)
+
+ if (prop == 0){
+ prop = icalproperty_new_summary(v);
+ icalcomponent_add_property(inner, prop);
+ }
+
+ icalproperty_set_summary(prop,v);
+}
+
+
+const char* icalcomponent_get_summary(icalcomponent* comp)
+{
+ icalcomponent *inner;
+ icalproperty *prop;
+ icalerror_check_arg_rz(comp!=0,"comp");
+
+ inner = icalcomponent_get_inner(comp);
+
+ if(inner == 0){
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return 0;
+ }
+
+ prop= icalcomponent_get_first_property(inner,ICAL_SUMMARY_PROPERTY);
+
+ if (prop == 0){
+ return 0;
+ }
+
+ return icalproperty_get_summary(prop);
+
+}
+
+void icalcomponent_set_comment(icalcomponent* comp, const char* v)
+{
+ ICALSETUPSET(ICAL_COMMENT_PROPERTY);
+
+ if (prop == 0){
+ prop = icalproperty_new_comment(v);
+ icalcomponent_add_property(inner, prop);
+ }
+
+ icalproperty_set_summary(prop,v);
+
+}
+const char* icalcomponent_get_comment(icalcomponent* comp){
+ icalcomponent *inner;
+ icalproperty *prop;
+ icalerror_check_arg_rz(comp!=0,"comp");
+
+ inner = icalcomponent_get_inner(comp);
+
+ if(inner == 0){
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return 0;
+ }
+
+ prop= icalcomponent_get_first_property(inner,ICAL_COMMENT_PROPERTY);
+
+ if (prop == 0){
+ return 0;
+ }
+
+ return icalproperty_get_comment(prop);
+}
+
+void icalcomponent_set_uid(icalcomponent* comp, const char* v)
+{
+ ICALSETUPSET(ICAL_UID_PROPERTY);
+
+ if (prop == 0){
+ prop = icalproperty_new_uid(v);
+ icalcomponent_add_property(inner, prop);
+ }
+
+ icalproperty_set_summary(prop,v);
+
+}
+const char* icalcomponent_get_uid(icalcomponent* comp){
+ icalcomponent *inner;
+ icalproperty *prop;
+ icalerror_check_arg_rz(comp!=0,"comp");
+
+ inner = icalcomponent_get_inner(comp);
+
+ if(inner == 0){
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return 0;
+ }
+
+ prop= icalcomponent_get_first_property(inner,ICAL_UID_PROPERTY);
+
+ if (prop == 0){
+ return 0;
+ }
+
+ return icalproperty_get_uid(prop);
+}
+
+void icalcomponent_set_recurrenceid(icalcomponent* comp, struct icaltimetype v)
+{
+ ICALSETUPSET(ICAL_RECURRENCEID_PROPERTY);
+
+ if (prop == 0){
+ prop = icalproperty_new_recurrenceid(v);
+ icalcomponent_add_property(inner, prop);
+ }
+
+ icalproperty_set_recurrenceid(prop,v);
+}
+struct icaltimetype icalcomponent_get_recurrenceid(icalcomponent* comp)
+{
+ icalcomponent *inner;
+ icalproperty *prop;
+ if (comp == 0) {
+ icalerror_set_errno(ICAL_BADARG_ERROR);
+ return icaltime_null_time();
+ }
+
+ inner = icalcomponent_get_inner(comp);
+
+ if(inner == 0){
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return icaltime_null_time();
+ }
+
+ prop= icalcomponent_get_first_property(inner, ICAL_RECURRENCEID_PROPERTY);
+
+ if (prop == 0){
+ return icaltime_null_time();
+ }
+
+ return icalproperty_get_recurrenceid(prop);
+}
+
+void icalcomponent_set_description(icalcomponent* comp, const char* v)
+{
+ ICALSETUPSET(ICAL_DESCRIPTION_PROPERTY);
+
+ if (prop == 0){
+ prop = icalproperty_new_description(v);
+ icalcomponent_add_property(inner, prop);
+ }
+
+ icalproperty_set_description(prop,v);
+}
+const char* icalcomponent_get_description(icalcomponent* comp)
+{
+ icalcomponent *inner;
+ icalproperty *prop;
+ icalerror_check_arg_rz(comp!=0,"comp");
+
+ inner = icalcomponent_get_inner(comp);
+
+ if(inner == 0){
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return 0;
+ }
+
+ prop= icalcomponent_get_first_property(inner,ICAL_DESCRIPTION_PROPERTY);
+
+ if (prop == 0){
+ return 0;
+ }
+
+ return icalproperty_get_description(prop);
+}
+
+void icalcomponent_set_location(icalcomponent* comp, const char* v)
+{
+ ICALSETUPSET(ICAL_LOCATION_PROPERTY)
+
+ if (prop == 0){
+ prop = icalproperty_new_location(v);
+ icalcomponent_add_property(inner, prop);
+ }
+
+ icalproperty_set_location(prop,v);
+}
+const char* icalcomponent_get_location(icalcomponent* comp)
+{
+ icalcomponent *inner;
+ icalproperty *prop;
+ icalerror_check_arg_rz(comp!=0,"comp");
+
+ inner = icalcomponent_get_inner(comp);
+
+ if(inner == 0){
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return 0;
+ }
+
+ prop= icalcomponent_get_first_property(inner,ICAL_LOCATION_PROPERTY);
+
+ if (prop == 0){
+ return 0;
+ }
+
+ return icalproperty_get_location(prop);
+}
+
+void icalcomponent_set_sequence(icalcomponent* comp, int v)
+{
+ ICALSETUPSET(ICAL_SEQUENCE_PROPERTY);
+
+ if (prop == 0){
+ prop = icalproperty_new_sequence(v);
+ icalcomponent_add_property(inner, prop);
+ }
+
+ icalproperty_set_sequence(prop,v);
+
+}
+int icalcomponent_get_sequence(icalcomponent* comp){
+ icalcomponent *inner;
+ icalproperty *prop;
+ icalerror_check_arg_rz(comp!=0,"comp");
+
+ inner = icalcomponent_get_inner(comp);
+
+ if(inner == 0){
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return 0;
+ }
+
+ prop= icalcomponent_get_first_property(inner,ICAL_SEQUENCE_PROPERTY);
+
+ if (prop == 0){
+ return 0;
+ }
+
+ return icalproperty_get_sequence(prop);
+}
+
+
+void icalcomponent_set_status(icalcomponent* comp, enum icalproperty_status v)
+{
+ ICALSETUPSET(ICAL_STATUS_PROPERTY);
+
+ if (prop == 0){
+ prop = icalproperty_new_status(v);
+ icalcomponent_add_property(inner, prop);
+ }
+
+ icalproperty_set_status(prop,v);
+
+}
+enum icalproperty_status icalcomponent_get_status(icalcomponent* comp){
+ icalcomponent *inner;
+ icalproperty *prop;
+ icalerror_check_arg_rz(comp!=0,"comp");
+
+ inner = icalcomponent_get_inner(comp);
+
+ if(inner == 0){
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return 0;
+ }
+
+ prop= icalcomponent_get_first_property(inner,ICAL_STATUS_PROPERTY);
+
+ if (prop == 0){
+ return 0;
+ }
+
+ return icalproperty_get_status(prop);
+}
+
+icalcomponent* icalcomponent_new_vcalendar()
+{
+ return icalcomponent_new(ICAL_VCALENDAR_COMPONENT);
+}
+icalcomponent* icalcomponent_new_vevent()
+{
+ return icalcomponent_new(ICAL_VEVENT_COMPONENT);
+}
+icalcomponent* icalcomponent_new_vtodo()
+{
+ return icalcomponent_new(ICAL_VTODO_COMPONENT);
+}
+icalcomponent* icalcomponent_new_vjournal()
+{
+ return icalcomponent_new(ICAL_VJOURNAL_COMPONENT);
+}
+icalcomponent* icalcomponent_new_valarm()
+{
+ return icalcomponent_new(ICAL_VALARM_COMPONENT);
+}
+icalcomponent* icalcomponent_new_vfreebusy()
+{
+ return icalcomponent_new(ICAL_VFREEBUSY_COMPONENT);
+}
+icalcomponent* icalcomponent_new_vtimezone()
+{
+ return icalcomponent_new(ICAL_VTIMEZONE_COMPONENT);
+}
+icalcomponent* icalcomponent_new_xstandard()
+{
+ return icalcomponent_new(ICAL_XSTANDARD_COMPONENT);
+}
+icalcomponent* icalcomponent_new_xdaylight()
+{
+ return icalcomponent_new(ICAL_XDAYLIGHT_COMPONENT);
+}
+icalcomponent* icalcomponent_new_vagenda()
+{
+ return icalcomponent_new(ICAL_VAGENDA_COMPONENT);
+}
+icalcomponent* icalcomponent_new_vquery()
+{
+ return icalcomponent_new(ICAL_VQUERY_COMPONENT);
+}
+
+/*
+ * Timezone stuff.
+ */
+
+
+/**
+ * This takes 2 VCALENDAR components and merges the second one into the first,
+ * resolving any problems with conflicting TZIDs. comp_to_merge will no
+ * longer exist after calling this function.
+ */
+void icalcomponent_merge_component(icalcomponent* comp,
+ icalcomponent* comp_to_merge)
+{
+ icalcomponent *subcomp, *next_subcomp;
+ icalarray *tzids_to_rename;
+ unsigned int i;
+
+ /* Check that both components are VCALENDAR components. */
+ assert (icalcomponent_isa(comp) == ICAL_VCALENDAR_COMPONENT);
+ assert (icalcomponent_isa(comp_to_merge) == ICAL_VCALENDAR_COMPONENT);
+
+ /* Step through each subcomponent of comp_to_merge, looking for VTIMEZONEs.
+ For each VTIMEZONE found, check if we need to add it to comp and if we
+ need to rename it and all TZID references to it. */
+ tzids_to_rename = icalarray_new (sizeof (char*), 16);
+ subcomp = icalcomponent_get_first_component (comp_to_merge,
+ ICAL_VTIMEZONE_COMPONENT);
+ while (subcomp) {
+ next_subcomp = icalcomponent_get_next_component (comp_to_merge,
+ ICAL_VTIMEZONE_COMPONENT);
+ /* This will add the VTIMEZONE to comp, if necessary, and also update
+ the array of TZIDs we need to rename. */
+ icalcomponent_merge_vtimezone (comp, subcomp, tzids_to_rename);
+ /* FIXME: Handle possible NEWFAILED error. */
+
+ subcomp = next_subcomp;
+ }
+
+ /* If we need to do any renaming of TZIDs, do it now. */
+ if (tzids_to_rename->num_elements != 0) {
+ icalcomponent_rename_tzids (comp_to_merge, tzids_to_rename);
+
+ /* Now free the tzids_to_rename array. */
+ for (i = 0; i < tzids_to_rename->num_elements; i++) {
+ free (icalarray_element_at (tzids_to_rename, i));
+ }
+ icalarray_free (tzids_to_rename);
+ }
+
+ /* Now move all the components from comp_to_merge to comp, excluding
+ VTIMEZONE components. */
+ subcomp = icalcomponent_get_first_component (comp_to_merge,
+ ICAL_ANY_COMPONENT);
+ while (subcomp) {
+ next_subcomp = icalcomponent_get_next_component (comp_to_merge,
+ ICAL_ANY_COMPONENT);
+ if (icalcomponent_isa(subcomp) != ICAL_VTIMEZONE_COMPONENT) {
+ icalcomponent_remove_component (comp_to_merge, subcomp);
+ icalcomponent_add_component (comp, subcomp);
+ }
+ subcomp = next_subcomp;
+ }
+
+ /* Free comp_to_merge. We have moved most of the subcomponents over to
+ comp now. */
+ icalcomponent_free (comp_to_merge);
+}
+
+
+static void icalcomponent_merge_vtimezone (icalcomponent *comp,
+ icalcomponent *vtimezone,
+ icalarray *tzids_to_rename)
+{
+ icalproperty *tzid_prop;
+ const char *tzid;
+ char *tzid_copy;
+ icaltimezone *existing_vtimezone;
+
+ /* Get the TZID of the VTIMEZONE. */
+ tzid_prop = icalcomponent_get_first_property (vtimezone, ICAL_TZID_PROPERTY);
+ if (!tzid_prop)
+ return;
+
+ tzid = icalproperty_get_tzid (tzid_prop);
+ if (!tzid)
+ return;
+
+ /* See if there is already a VTIMEZONE in comp with the same TZID. */
+ existing_vtimezone = icalcomponent_get_timezone (comp, tzid);
+
+ /* If there is no existing VTIMEZONE with the same TZID, we can just move
+ the VTIMEZONE to comp and return. */
+ if (!existing_vtimezone) {
+ icalcomponent_remove_component (icalcomponent_get_parent (vtimezone),
+ vtimezone);
+ icalcomponent_add_component (comp, vtimezone);
+ return;
+ }
+
+ /* If the TZID has a '/' prefix, then we don't have to worry about the
+ clashing TZIDs, as they are supposed to be exactly the same VTIMEZONE. */
+ if (tzid[0] == '/')
+ return;
+
+ /* Now we have two VTIMEZONEs with the same TZID (which isn't a globally
+ unique one), so we compare the VTIMEZONE components to see if they are
+ the same. If they are, we don't need to do anything. We make a copy of
+ the tzid, since the parameter may get modified in these calls. */
+ tzid_copy = strdup (tzid);
+ if (!tzid_copy) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return;
+ }
+
+ if (!icalcomponent_compare_vtimezones (comp, vtimezone)) {
+ /* FIXME: Handle possible NEWFAILED error. */
+
+ /* Now we have two different VTIMEZONEs with the same TZID. */
+ icalcomponent_handle_conflicting_vtimezones (comp, vtimezone, tzid_prop,
+ tzid_copy, tzids_to_rename);
+ }
+ free (tzid_copy);
+}
+
+
+static void
+icalcomponent_handle_conflicting_vtimezones (icalcomponent *comp,
+ icalcomponent *vtimezone,
+ icalproperty *tzid_prop,
+ const char *tzid,
+ icalarray *tzids_to_rename)
+{
+ int i, suffix, max_suffix = 0, num_elements;
+ unsigned int tzid_len;
+ char *tzid_copy, *new_tzid, suffix_buf[32];
+ (void)tzid_prop; /* hack to stop unused variable warning */
+
+ /* Find the length of the TZID without any trailing digits. */
+ tzid_len = icalcomponent_get_tzid_prefix_len (tzid);
+
+ /* Step through each of the VTIMEZONEs in comp. We may already have the
+ clashing VTIMEZONE in the calendar, but it may have been renamed
+ (i.e. a unique number added on the end of the TZID, e.g. 'London2').
+ So we compare the new VTIMEZONE with any VTIMEZONEs that have the
+ same prefix (e.g. 'London'). If it matches any of those, we have to
+ rename the TZIDs to that TZID, else we rename to a new TZID, using
+ the biggest numeric suffix found + 1. */
+ num_elements = comp->timezones ? comp->timezones->num_elements : 0;
+ for (i = 0; i < num_elements; i++) {
+ icaltimezone *zone;
+ const char *existing_tzid;
+ const char *existing_tzid_copy;
+ unsigned int existing_tzid_len;
+
+ zone = icalarray_element_at (comp->timezones, i);
+ existing_tzid = icaltimezone_get_tzid (zone);
+
+ /* Find the length of the TZID without any trailing digits. */
+ existing_tzid_len = icalcomponent_get_tzid_prefix_len (existing_tzid);
+
+ /* Check if we have the same prefix. */
+ if (tzid_len == existing_tzid_len
+ && !strncmp (tzid, existing_tzid, tzid_len)) {
+ /* Compare the VTIMEZONEs. */
+ if (icalcomponent_compare_vtimezones (icaltimezone_get_component (zone),
+ vtimezone)) {
+ /* The VTIMEZONEs match, so we can use the existing VTIMEZONE. But
+ we have to rename TZIDs to this TZID. */
+ tzid_copy = strdup (tzid);
+ existing_tzid_copy = strdup (existing_tzid);
+ if (!tzid_copy || !existing_tzid_copy) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ } else {
+ icalarray_append (tzids_to_rename, tzid_copy);
+ icalarray_append (tzids_to_rename, existing_tzid_copy);
+ }
+ return;
+ } else {
+ /* FIXME: Handle possible NEWFAILED error. */
+
+ /* Convert the suffix to an integer and remember the maximum numeric
+ suffix found. */
+ suffix = atoi (existing_tzid + existing_tzid_len);
+ if (max_suffix < suffix)
+ max_suffix = suffix;
+ }
+ }
+ }
+
+ /* We didn't find a VTIMEZONE that matched, so we have to rename the TZID,
+ using the maximum numerical suffix found + 1. */
+ tzid_copy = strdup (tzid);
+ snprintf (suffix_buf, sizeof(suffix_buf), "%i", max_suffix + 1);
+ new_tzid = malloc (tzid_len + strlen (suffix_buf) + 1);
+ if (!new_tzid || !tzid_copy) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return;
+ }
+
+ strncpy (new_tzid, tzid, tzid_len);
+ strcpy (new_tzid + tzid_len, suffix_buf);
+ icalarray_append (tzids_to_rename, tzid_copy);
+ icalarray_append (tzids_to_rename, new_tzid);
+}
+
+
+/* Returns the length of the TZID, without any trailing digits. */
+static unsigned int icalcomponent_get_tzid_prefix_len (const char *tzid)
+{
+ int len;
+ const char *p;
+
+ len = strlen (tzid);
+ p = tzid + len - 1;
+ while (len > 0 && *p >= '0' && *p <= '9') {
+ p--;
+ len--;
+ }
+
+ return len;
+}
+
+
+/**
+ * Renames all references to the given TZIDs to a new name. rename_table
+ * contains pairs of strings - a current TZID, and the new TZID to rename it
+ * to.
+ */
+static void icalcomponent_rename_tzids(icalcomponent* comp,
+ icalarray* rename_table)
+{
+ icalcomponent_foreach_tzid (comp, icalcomponent_rename_tzids_callback,
+ rename_table);
+}
+
+
+static void icalcomponent_rename_tzids_callback(icalparameter *param, void *data)
+{
+ icalarray *rename_table = data;
+ const char *tzid;
+ int i;
+
+ tzid = icalparameter_get_tzid (param);
+ if (!tzid)
+ return;
+
+ /* Step through the rename table to see if the current TZID matches
+ any of the ones we want to rename. */
+ for (i = 0; (unsigned int)i < rename_table->num_elements - 1; i += 2) {
+ if (!strcmp (tzid, icalarray_element_at (rename_table, i))) {
+ icalparameter_set_tzid (param, icalarray_element_at (rename_table, i + 1));
+ break;
+ }
+ }
+}
+
+
+/**
+ * Calls the given function for each TZID parameter found in the component.
+ */
+void icalcomponent_foreach_tzid(icalcomponent* comp,
+ void (*callback)(icalparameter *param, void *data),
+ void *callback_data)
+{
+ icalproperty *prop;
+ icalproperty_kind kind;
+ icalparameter *param;
+ icalcomponent *subcomp;
+
+ /* First look for any TZID parameters used in this component itself. */
+ prop = icalcomponent_get_first_property (comp, ICAL_ANY_PROPERTY);
+ while (prop) {
+ kind = icalproperty_isa (prop);
+
+ /* These are the only properties that can have a TZID. Note that
+ COMPLETED, CREATED, DTSTAMP & LASTMODIFIED must be in UTC. */
+ if (kind == ICAL_DTSTART_PROPERTY || kind == ICAL_DTEND_PROPERTY
+ || kind == ICAL_DUE_PROPERTY || kind == ICAL_EXDATE_PROPERTY
+ || kind == ICAL_RDATE_PROPERTY) {
+ param = icalproperty_get_first_parameter (prop, ICAL_TZID_PARAMETER);
+ if (param)
+ (*callback) (param, callback_data);
+ }
+
+ prop = icalcomponent_get_next_property (comp, ICAL_ANY_PROPERTY);
+ }
+
+ /* Now recursively check child components. */
+ subcomp = icalcomponent_get_first_component (comp, ICAL_ANY_COMPONENT);
+ while (subcomp) {
+ icalcomponent_foreach_tzid (subcomp, callback, callback_data);
+ subcomp = icalcomponent_get_next_component (comp, ICAL_ANY_COMPONENT);
+ }
+}
+
+
+
+/**
+ * Returns the icaltimezone from the component corresponding to the given
+ * TZID, or NULL if the component does not have a corresponding VTIMEZONE.
+ */
+icaltimezone* icalcomponent_get_timezone(icalcomponent* comp, const char *tzid)
+{
+ icaltimezone *zone;
+ int lower, upper, middle, cmp;
+ const char *zone_tzid;
+
+ if (!comp->timezones)
+ return NULL;
+
+ /* Sort the array if necessary (by the TZID string). */
+ if (!comp->timezones_sorted) {
+ icalarray_sort (comp->timezones, icalcomponent_compare_timezone_fn);
+ comp->timezones_sorted = 1;
+ }
+
+ /* Do a simple binary search. */
+ lower = middle = 0;
+ upper = comp->timezones->num_elements;
+
+ while (lower < upper) {
+ middle = (lower + upper) >> 1;
+ zone = icalarray_element_at (comp->timezones, middle);
+ zone_tzid = icaltimezone_get_tzid (zone);
+ cmp = strcmp (tzid, zone_tzid);
+ if (cmp == 0)
+ return zone;
+ else if (cmp < 0)
+ upper = middle;
+ else
+ lower = middle + 1;
+ }
+
+ return NULL;
+}
+
+
+/**
+ * A function to compare 2 icaltimezone elements, used for qsort().
+ */
+static int icalcomponent_compare_timezone_fn (const void *elem1,
+ const void *elem2)
+{
+ icaltimezone *zone1, *zone2;
+ const char *zone1_tzid, *zone2_tzid;
+
+ zone1 = (icaltimezone*) elem1;
+ zone2 = (icaltimezone*) elem2;
+
+ zone1_tzid = icaltimezone_get_tzid (zone1);
+ zone2_tzid = icaltimezone_get_tzid (zone2);
+
+ return strcmp (zone1_tzid, zone2_tzid);
+}
+
+
+/**
+ * Compares 2 VTIMEZONE components to see if they match, ignoring their TZIDs.
+ * It returns 1 if they match, 0 if they don't, or -1 on error.
+ */
+static int icalcomponent_compare_vtimezones (icalcomponent *vtimezone1,
+ icalcomponent *vtimezone2)
+{
+ icalproperty *prop1, *prop2;
+ const char *tzid1, *tzid2;
+ char *tzid2_copy, *string1, *string2;
+ int cmp;
+
+ /* Get the TZID property of the first VTIMEZONE. */
+ prop1 = icalcomponent_get_first_property (vtimezone1, ICAL_TZID_PROPERTY);
+ if (!prop1)
+ return -1;
+
+ tzid1 = icalproperty_get_tzid (prop1);
+ if (!tzid1)
+ return -1;
+
+ /* Get the TZID property of the second VTIMEZONE. */
+ prop2 = icalcomponent_get_first_property (vtimezone2, ICAL_TZID_PROPERTY);
+ if (!prop2)
+ return -1;
+
+ tzid2 = icalproperty_get_tzid (prop2);
+ if (!tzid2)
+ return -1;
+
+ /* Copy the second TZID, and set the property to the same as the first
+ TZID, since we don't care if these match of not. */
+ tzid2_copy = strdup (tzid2);
+ if (!tzid2_copy) {
+ icalerror_set_errno (ICAL_NEWFAILED_ERROR);
+ return 0;
+ }
+
+ icalproperty_set_tzid (prop2, tzid1);
+
+ /* Now convert both VTIMEZONEs to strings and compare them. */
+ string1 = icalcomponent_as_ical_string (vtimezone1);
+ if (!string1) {
+ free (tzid2_copy);
+ return -1;
+ }
+
+ string2 = icalcomponent_as_ical_string (vtimezone2);
+ if (!string2) {
+ free (string1);
+ free (tzid2_copy);
+ return -1;
+ }
+
+ cmp = strcmp (string1, string2);
+
+ free (string1);
+ free (string2);
+
+ /* Now reset the second TZID. */
+ icalproperty_set_tzid (prop2, tzid2_copy);
+ free (tzid2_copy);
+
+ return (cmp == 0) ? 1 : 0;
+}
+
+
+
+
+
+
+/**
+ * @brief set the RELCALID property of a component.
+ *
+ * @param comp Valid calendar component.
+ * @param v Relcalid URL value
+ */
+
+void icalcomponent_set_relcalid(icalcomponent* comp, const char* v)
+{
+ ICALSETUPSET(ICAL_RELCALID_PROPERTY);
+
+ if (prop == 0){
+ prop = icalproperty_new_relcalid(v);
+ icalcomponent_add_property(inner, prop);
+ }
+
+ icalproperty_set_relcalid(prop,v);
+
+}
+
+
+/**
+ * @brief get the RELCALID property of a component.
+ *
+ * @param comp Valid calendar component.
+ */
+
+const char* icalcomponent_get_relcalid(icalcomponent* comp){
+ icalcomponent *inner;
+ icalproperty *prop;
+ icalerror_check_arg_rz(comp!=0,"comp");
+
+ inner = icalcomponent_get_inner(comp);
+
+ if(inner == 0){
+ return 0;
+ }
+
+ prop= icalcomponent_get_first_property(inner,ICAL_RELCALID_PROPERTY);
+
+ if (prop == 0){
+ return 0;
+ }
+
+ return icalproperty_get_relcalid(prop);
+}
+
+
+/** @brief Return the time a TODO task is DUE.
+ *
+ * @param comp Valid calendar component.
+ *
+ * Uses the DUE: property if it exists, otherwise we calculate the DUE
+ * value by adding the task's duration to the DTSTART time
+ */
+
+struct icaltimetype icalcomponent_get_due(icalcomponent* comp)
+{
+ icalcomponent *inner = icalcomponent_get_inner(comp);
+
+ icalproperty *due_prop
+ = icalcomponent_get_first_property(inner,ICAL_DUE_PROPERTY);
+
+ icalproperty *dur_prop
+ = icalcomponent_get_first_property(inner, ICAL_DURATION_PROPERTY);
+
+ if( due_prop == 0 && dur_prop == 0){
+ return icaltime_null_time();
+ } else if ( due_prop != 0) {
+ return icalproperty_get_due(due_prop);
+ } else if ( dur_prop != 0) {
+
+ struct icaltimetype start =
+ icalcomponent_get_dtstart(inner);
+ struct icaldurationtype duration =
+ icalproperty_get_duration(dur_prop);
+
+ struct icaltimetype due = icaltime_add(start,duration);
+
+ return due;
+
+ } else {
+ /* Error, both duration and due have been specified */
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return icaltime_null_time();
+
+ }
+
+}
+
+/** @brief Set the due date of a VTODO task.
+ *
+ * @param comp Valid VTODO component.
+ * @param v Valid due date time.
+ *
+ * - If no duration or due properties then set the DUE property.
+ * - If a DUE property is already set, then reset it to the value v.
+ * - If a DURATION property is already set, then calculate the new
+ * duration based on the supplied value of v.
+ */
+
+void icalcomponent_set_due(icalcomponent* comp, struct icaltimetype v)
+{
+ icalcomponent *inner = icalcomponent_get_inner(comp);
+
+ icalproperty *due_prop
+ = icalcomponent_get_first_property(inner,ICAL_DUE_PROPERTY);
+
+ icalproperty *dur_prop
+ = icalcomponent_get_first_property(inner,ICAL_DURATION_PROPERTY);
+
+
+ if( due_prop == 0 && dur_prop == 0){
+ due_prop = icalproperty_new_due(v);
+ icalcomponent_add_property(inner,due_prop);
+ } else if ( due_prop != 0) {
+ icalproperty_set_due(due_prop,v);
+ } else if ( dur_prop != 0) {
+ struct icaltimetype start =
+ icalcomponent_get_dtstart(inner);
+
+ struct icaltimetype due =
+ icalcomponent_get_due(inner);
+
+ struct icaldurationtype dur
+ = icaltime_subtract(due,start);
+
+ icalproperty_set_duration(dur_prop,dur);
+
+ } else {
+ /* Error, both duration and due have been specified */
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ }
+}
diff --git a/libkcal/libical/src/libical/icalcomponent.h b/libkcal/libical/src/libical/icalcomponent.h
new file mode 100644
index 00000000..ae8a5d32
--- /dev/null
+++ b/libkcal/libical/src/libical/icalcomponent.h
@@ -0,0 +1,283 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalcomponent.h
+ CREATOR: eric 20 March 1999
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The original code is icalcomponent.h
+
+======================================================================*/
+
+#ifndef ICALCOMPONENT_H
+#define ICALCOMPONENT_H
+
+#include "icalproperty.h"
+#include "icalvalue.h"
+#include "icalenums.h" /* defines icalcomponent_kind */
+#include "pvl.h"
+
+typedef struct icalcomponent_impl icalcomponent;
+
+#ifndef ICALTIMEZONE_DEFINED
+#define ICALTIMEZONE_DEFINED
+/** @brief An opaque struct representing a timezone.
+ * We declare this here to avoid a circular dependancy.
+ */
+typedef struct _icaltimezone icaltimezone;
+#endif
+
+
+/* This is exposed so that callers will not have to allocate and
+ deallocate iterators. Pretend that you can't see it. */
+typedef struct icalcompiter
+{
+ icalcomponent_kind kind;
+ pvl_elem iter;
+
+} icalcompiter;
+
+icalcomponent* icalcomponent_new(icalcomponent_kind kind);
+icalcomponent* icalcomponent_new_clone(icalcomponent* component);
+icalcomponent* icalcomponent_new_from_string(char* str);
+icalcomponent* icalcomponent_vanew(icalcomponent_kind kind, ...);
+void icalcomponent_free(icalcomponent* component);
+
+char* icalcomponent_as_ical_string(icalcomponent* component);
+
+int icalcomponent_is_valid(icalcomponent* component);
+
+icalcomponent_kind icalcomponent_isa(const icalcomponent* component);
+
+int icalcomponent_isa_component (void* component);
+
+/*
+ * Working with properties
+ */
+
+void icalcomponent_add_property(icalcomponent* component,
+ icalproperty* property);
+
+void icalcomponent_remove_property(icalcomponent* component,
+ icalproperty* property);
+
+int icalcomponent_count_properties(icalcomponent* component,
+ icalproperty_kind kind);
+
+/* Iterate through the properties */
+icalproperty* icalcomponent_get_current_property(icalcomponent* component);
+
+icalproperty* icalcomponent_get_first_property(icalcomponent* component,
+ icalproperty_kind kind);
+icalproperty* icalcomponent_get_next_property(icalcomponent* component,
+ icalproperty_kind kind);
+
+
+/*
+ * Working with components
+ */
+
+
+/* Return the first VEVENT, VTODO or VJOURNAL sub-component of cop, or
+ comp if it is one of those types */
+
+icalcomponent* icalcomponent_get_inner(icalcomponent* comp);
+
+
+void icalcomponent_add_component(icalcomponent* parent,
+ icalcomponent* child);
+
+void icalcomponent_remove_component(icalcomponent* parent,
+ icalcomponent* child);
+
+int icalcomponent_count_components(icalcomponent* component,
+ icalcomponent_kind kind);
+
+/**
+ This takes 2 VCALENDAR components and merges the second one into the first,
+ resolving any problems with conflicting TZIDs. comp_to_merge will no
+ longer exist after calling this function. */
+void icalcomponent_merge_component(icalcomponent* comp,
+ icalcomponent* comp_to_merge);
+
+
+/* Iteration Routines. There are two forms of iterators, internal and
+external. The internal ones came first, and are almost completely
+sufficient, but they fail badly when you want to construct a loop that
+removes components from the container.*/
+
+
+/* Iterate through components */
+icalcomponent* icalcomponent_get_current_component (icalcomponent* component);
+
+icalcomponent* icalcomponent_get_first_component(icalcomponent* component,
+ icalcomponent_kind kind);
+icalcomponent* icalcomponent_get_next_component(icalcomponent* component,
+ icalcomponent_kind kind);
+
+/* Using external iterators */
+icalcompiter icalcomponent_begin_component(icalcomponent* component,
+ icalcomponent_kind kind);
+icalcompiter icalcomponent_end_component(icalcomponent* component,
+ icalcomponent_kind kind);
+icalcomponent* icalcompiter_next(icalcompiter* i);
+icalcomponent* icalcompiter_prior(icalcompiter* i);
+icalcomponent* icalcompiter_deref(icalcompiter* i);
+
+
+/* Working with embedded error properties */
+
+
+/* Check the component against itip rules and insert error properties*/
+/* Working with embedded error properties */
+int icalcomponent_check_restrictions(icalcomponent* comp);
+
+/** Count embedded errors. */
+int icalcomponent_count_errors(icalcomponent* component);
+
+/** Remove all X-LIC-ERROR properties*/
+void icalcomponent_strip_errors(icalcomponent* component);
+
+/** Convert some X-LIC-ERROR properties into RETURN-STATUS properties*/
+void icalcomponent_convert_errors(icalcomponent* component);
+
+/* Internal operations. They are private, and you should not be using them. */
+icalcomponent* icalcomponent_get_parent(icalcomponent* component);
+void icalcomponent_set_parent(icalcomponent* component,
+ icalcomponent* parent);
+
+/* Kind conversion routines */
+
+int icalcomponent_kind_is_valid(const icalcomponent_kind kind);
+
+icalcomponent_kind icalcomponent_string_to_kind(const char* string);
+
+const char* icalcomponent_kind_to_string(icalcomponent_kind kind);
+
+
+/************* Derived class methods. ****************************
+
+If the code was in an OO language, the remaining routines would be
+members of classes derived from icalcomponent. Don't call them on the
+wrong component subtypes. */
+
+/** For VCOMPONENT: Return a reference to the first VEVENT, VTODO or
+ VJOURNAL */
+icalcomponent* icalcomponent_get_first_real_component(icalcomponent *c);
+
+/** For VEVENT, VTODO, VJOURNAL and VTIMEZONE: report the start and end
+ times of an event in UTC */
+struct icaltime_span icalcomponent_get_span(icalcomponent* comp);
+
+/******************** Convienience routines **********************/
+
+void icalcomponent_set_dtstart(icalcomponent* comp, struct icaltimetype v);
+struct icaltimetype icalcomponent_get_dtstart(icalcomponent* comp);
+
+/* For the icalcomponent routines only, dtend and duration are tied
+ together. If you call the set routine for one and the other exists,
+ the routine will calculate the change to the other. That is, if
+ there is a DTEND and you call set_duration, the routine will modify
+ DTEND to be the sum of DTSTART and the duration. If you call a get
+ routine for one and the other exists, the routine will calculate
+ the return value. If you call a set routine and neither exists, the
+ routine will create the apcompriate comperty */
+
+
+struct icaltimetype icalcomponent_get_dtend(icalcomponent* comp);
+void icalcomponent_set_dtend(icalcomponent* comp, struct icaltimetype v);
+
+struct icaltimetype icalcomponent_get_due(icalcomponent* comp);
+void icalcomponent_set_due(icalcomponent* comp, struct icaltimetype v);
+
+void icalcomponent_set_duration(icalcomponent* comp,
+ struct icaldurationtype v);
+struct icaldurationtype icalcomponent_get_duration(icalcomponent* comp);
+
+void icalcomponent_set_method(icalcomponent* comp, icalproperty_method method);
+icalproperty_method icalcomponent_get_method(icalcomponent* comp);
+
+struct icaltimetype icalcomponent_get_dtstamp(icalcomponent* comp);
+void icalcomponent_set_dtstamp(icalcomponent* comp, struct icaltimetype v);
+
+void icalcomponent_set_summary(icalcomponent* comp, const char* v);
+const char* icalcomponent_get_summary(icalcomponent* comp);
+
+void icalcomponent_set_comment(icalcomponent* comp, const char* v);
+const char* icalcomponent_get_comment(icalcomponent* comp);
+
+void icalcomponent_set_uid(icalcomponent* comp, const char* v);
+const char* icalcomponent_get_uid(icalcomponent* comp);
+
+void icalcomponent_set_relcalid(icalcomponent* comp, const char* v);
+const char* icalcomponent_get_relcalid(icalcomponent* comp);
+
+void icalcomponent_set_recurrenceid(icalcomponent* comp,
+ struct icaltimetype v);
+struct icaltimetype icalcomponent_get_recurrenceid(icalcomponent* comp);
+
+void icalcomponent_set_description(icalcomponent* comp, const char* v);
+const char* icalcomponent_get_description(icalcomponent* comp);
+
+void icalcomponent_set_location(icalcomponent* comp, const char* v);
+const char* icalcomponent_get_location(icalcomponent* comp);
+
+void icalcomponent_set_sequence(icalcomponent* comp, int v);
+int icalcomponent_get_sequence(icalcomponent* comp);
+
+void icalcomponent_set_status(icalcomponent* comp, enum icalproperty_status v);
+enum icalproperty_status icalcomponent_get_status(icalcomponent* comp);
+
+
+/** Calls the given function for each TZID parameter found in the
+ component, and any subcomponents. */
+void icalcomponent_foreach_tzid(icalcomponent* comp,
+ void (*callback)(icalparameter *param, void *data),
+ void *callback_data);
+
+/** Returns the icaltimezone in the component corresponding to the
+ TZID, or NULL if it can't be found. */
+icaltimezone* icalcomponent_get_timezone(icalcomponent* comp,
+ const char *tzid);
+
+int icalproperty_recurrence_is_excluded(icalcomponent *comp,
+ struct icaltimetype *dtstart,
+ struct icaltimetype *recurtime);
+
+void icalcomponent_foreach_recurrence(icalcomponent* comp,
+ struct icaltimetype start,
+ struct icaltimetype end,
+ void (*callback)(icalcomponent *comp,
+ struct icaltime_span *span,
+ void *data),
+ void *callback_data);
+
+
+/*************** Type Specific routines ***************/
+
+icalcomponent* icalcomponent_new_vcalendar();
+icalcomponent* icalcomponent_new_vevent();
+icalcomponent* icalcomponent_new_vtodo();
+icalcomponent* icalcomponent_new_vjournal();
+icalcomponent* icalcomponent_new_valarm();
+icalcomponent* icalcomponent_new_vfreebusy();
+icalcomponent* icalcomponent_new_vtimezone();
+icalcomponent* icalcomponent_new_xstandard();
+icalcomponent* icalcomponent_new_xdaylight();
+icalcomponent* icalcomponent_new_vagenda();
+icalcomponent* icalcomponent_new_vquery();
+
+#endif /* !ICALCOMPONENT_H */
diff --git a/libkcal/libical/src/libical/icalderivedparameter.c.in b/libkcal/libical/src/libical/icalderivedparameter.c.in
new file mode 100644
index 00000000..db112be6
--- /dev/null
+++ b/libkcal/libical/src/libical/icalderivedparameter.c.in
@@ -0,0 +1,205 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icalderivedparameters.{c,h}
+ CREATOR: eric 09 May 1999
+
+
+
+ (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The original code is icalderivedparameters.{c,h}
+
+ Contributions from:
+ Graham Davison (g.m.davison@computer.org)
+
+ ======================================================================*/
+/*#line 29 "icalparameter.c.in"*/
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+
+#include "icalparameter.h"
+#include "icalparameterimpl.h"
+
+#include "icalproperty.h"
+#include "icalerror.h"
+#include "icalmemory.h"
+
+#include <stdlib.h> /* for malloc() */
+#include <errno.h>
+#include <string.h> /* for memset() */
+
+icalvalue_kind icalparameter_value_to_value_kind(icalparameter_value value);
+
+struct icalparameter_impl* icalparameter_new_impl(icalparameter_kind kind);
+
+/* This map associates each of the parameters with the string
+ representation of the parameter's name */
+struct icalparameter_kind_map {
+ icalparameter_kind kind;
+ const char *name;
+
+};
+
+/* This map associates the enumerations for the VALUE parameter with
+ the kinds of VALUEs. */
+
+struct icalparameter_value_kind_map {
+ icalparameter_value value;
+ icalvalue_kind kind;
+};
+
+/* This map associates the parameter enumerations with a specific parameter and the string representation of the enumeration */
+
+struct icalparameter_map {
+ icalparameter_kind kind;
+ int enumeration;
+ const char* str;
+};
+
+
+
+<insert_code_here>
+
+const char* icalparameter_kind_to_string(icalparameter_kind kind)
+{
+ int i;
+
+ for (i=0; parameter_map[i].kind != ICAL_NO_PARAMETER; i++) {
+ if (parameter_map[i].kind == kind) {
+ return parameter_map[i].name;
+ }
+ }
+
+ return 0;
+
+}
+
+icalparameter_kind icalparameter_string_to_kind(const char* string)
+{
+ int i;
+
+ if (string ==0 ) {
+ return ICAL_NO_PARAMETER;
+ }
+
+ for (i=0; parameter_map[i].kind != ICAL_NO_PARAMETER; i++) {
+
+ if (strcasecmp(parameter_map[i].name, string) == 0) {
+ return parameter_map[i].kind;
+ }
+ }
+
+ if(strncmp(string,"X-",2)==0){
+ return ICAL_X_PARAMETER;
+ }
+
+ return ICAL_NO_PARAMETER;
+}
+
+
+icalvalue_kind icalparameter_value_to_value_kind(icalparameter_value value)
+{
+ int i;
+
+ for (i=0; value_kind_map[i].kind != ICAL_NO_VALUE; i++) {
+
+ if (value_kind_map[i].value == value) {
+ return value_kind_map[i].kind;
+ }
+ }
+
+ return ICAL_NO_VALUE;
+}
+
+
+const char* icalparameter_enum_to_string(int e)
+{
+ int i;
+
+ icalerror_check_arg_rz(e >= ICALPARAMETER_FIRST_ENUM,"e");
+ icalerror_check_arg_rz(e <= ICALPARAMETER_LAST_ENUM,"e");
+
+ for (i=0; icalparameter_map[i].kind != ICAL_NO_PARAMETER; i++){
+ if(e == icalparameter_map[i].enumeration){
+ return icalparameter_map[i].str;
+ }
+ }
+
+ return 0;
+}
+
+int icalparameter_string_to_enum(const char* str)
+{
+ int i;
+
+ icalerror_check_arg_rz(str != 0,"str");
+
+ for (i=0; icalparameter_map[i].kind != ICAL_NO_PARAMETER; i++){
+ if(strcasecmp(str,icalparameter_map[i].str) == 0) {
+ return icalparameter_map[i].enumeration;
+ }
+ }
+
+ return 0;
+}
+
+icalparameter* icalparameter_new_from_value_string(icalparameter_kind kind,const char* val)
+{
+
+ struct icalparameter_impl* param=0;
+ int found_kind = 0;
+ int i;
+
+ icalerror_check_arg_rz((val!=0),"val");
+
+ /* Search through the parameter map to find a matching kind */
+
+ param = icalparameter_new_impl(kind);
+ if (!param)
+ return 0;
+
+ for (i=0; icalparameter_map[i].kind != ICAL_NO_PARAMETER; i++){
+ if(kind == icalparameter_map[i].kind) {
+ found_kind = 1;
+ if(strcasecmp(val,icalparameter_map[i].str) == 0) {
+
+ param->data = (int)icalparameter_map[i].enumeration;
+ return param;
+ }
+ }
+ }
+
+ if(found_kind == 1){
+ /* The kind was in the parameter map, but the string did not
+ match, so assume that it is an alternate value, like an
+ X-value.*/
+
+ icalparameter_set_xvalue(param, val);
+
+ } else {
+
+ /* If the kind was not found, then it must be a string type */
+
+ ((struct icalparameter_impl*)param)->string = icalmemory_strdup(val);
+
+ }
+
+ return param;
+}
+
+
+
+
diff --git a/libkcal/libical/src/libical/icalderivedparameter.h.in b/libkcal/libical/src/libical/icalderivedparameter.h.in
new file mode 100644
index 00000000..99be6ff2
--- /dev/null
+++ b/libkcal/libical/src/libical/icalderivedparameter.h.in
@@ -0,0 +1,36 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalparam.h
+ CREATOR: eric 20 March 1999
+
+
+
+
+
+ (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The original code is icalparam.h
+
+ ======================================================================*/
+
+#ifndef ICALDERIVEDPARAMETER_H
+#define ICALDERIVEDPARAMETER_H
+
+
+typedef struct icalparameter_impl icalparameter;
+
+const char* icalparameter_enum_to_string(int e);
+int icalparameter_string_to_enum(const char* str);
+
+<insert_code_here>
diff --git a/libkcal/libical/src/libical/icalderivedproperty.c.in b/libkcal/libical/src/libical/icalderivedproperty.c.in
new file mode 100644
index 00000000..a8bcbc04
--- /dev/null
+++ b/libkcal/libical/src/libical/icalderivedproperty.c.in
@@ -0,0 +1,284 @@
+/* -*- Mode: C -*- */
+
+/*======================================================================
+ FILE: icalderivedproperty.c
+ CREATOR: eric 15 Feb 2001
+
+
+
+ (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The original code is icalproperty.c
+
+======================================================================*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "icalproperty.h"
+#include "icalcomponent.h"
+#include "pvl.h"
+#include "icalenums.h"
+#include "icalerror.h"
+#include "icalmemory.h"
+#include "icalparser.h"
+
+#include <string.h> /* For icalmemory_strdup, rindex */
+#include <assert.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <stdio.h> /* for printf */
+#include <stdarg.h> /* for va_list, va_start, etc. */
+
+struct icalproperty_impl*
+icalproperty_new_impl (icalproperty_kind kind);
+void icalproperty_add_parameters(struct icalproperty_impl *prop,va_list args);
+
+/* This map associates the property kinds with the string
+ representation of the property name and the kind of VALUE that the
+ property uses as a default */
+
+struct icalproperty_map {
+ icalproperty_kind kind;
+ const char *name;
+ icalvalue_kind value;
+
+};
+
+/* This map associates the property enumerations with the king of
+ property that they are used in and the string representation of the
+ enumeration */
+
+struct icalproperty_enum_map {
+ icalproperty_kind prop;
+ int prop_enum;
+ const char* str;
+};
+
+
+<insert_code_here>
+
+int icalproperty_kind_is_valid(const icalproperty_kind kind)
+{
+ int i = 0;
+ do {
+ if (property_map[i].kind == kind)
+ return 1;
+ } while (property_map[i++].kind != ICAL_NO_PROPERTY);
+
+ return 0;
+}
+
+const char* icalproperty_kind_to_string(icalproperty_kind kind)
+{
+ int i;
+
+ for (i=0; property_map[i].kind != ICAL_NO_PROPERTY; i++) {
+ if (property_map[i].kind == kind) {
+ return property_map[i].name;
+ }
+ }
+
+ return 0;
+
+}
+
+
+icalproperty_kind icalproperty_string_to_kind(const char* string)
+{
+ int i;
+
+ if (string ==0 ) {
+ return ICAL_NO_PROPERTY;
+ }
+
+
+ for (i=0; property_map[i].kind != ICAL_NO_PROPERTY; i++) {
+ if (strcasecmp(property_map[i].name, string) == 0) {
+ return property_map[i].kind;
+ }
+ }
+
+ if(strncmp(string,"X-",2)==0){
+ return ICAL_X_PROPERTY;
+ }
+
+
+ return ICAL_NO_PROPERTY;
+}
+
+
+icalproperty_kind icalproperty_value_kind_to_kind(icalvalue_kind kind)
+{
+ int i;
+
+ for (i=0; property_map[i].kind != ICAL_NO_PROPERTY; i++) {
+ if ( property_map[i].value == kind ) {
+ return property_map[i].kind;
+ }
+ }
+
+ return ICAL_NO_PROPERTY;
+}
+
+
+
+icalvalue_kind icalproperty_kind_to_value_kind(icalproperty_kind kind)
+{
+ int i;
+
+ for (i=0; property_map[i].kind != ICAL_NO_PROPERTY; i++) {
+ if ( property_map[i].kind == kind ) {
+ return property_map[i].value;
+ }
+ }
+
+ return ICAL_NO_VALUE;
+}
+
+
+const char* icalproperty_enum_to_string(int e)
+{
+ icalerror_check_arg_rz(e >= ICALPROPERTY_FIRST_ENUM,"e");
+ icalerror_check_arg_rz(e <= ICALPROPERTY_LAST_ENUM,"e");
+
+ return enum_map[e-ICALPROPERTY_FIRST_ENUM].str;
+}
+
+int icalproperty_kind_and_string_to_enum(const int kind, const char* str)
+{
+ icalproperty_kind pkind;
+ int i;
+
+ icalerror_check_arg_rz(str!=0,"str")
+
+ if ((pkind = icalproperty_value_kind_to_kind(kind)) == ICAL_NO_VALUE)
+ return 0;
+
+ while(*str == ' '){
+ str++;
+ }
+
+ for (i=ICALPROPERTY_FIRST_ENUM; i != ICALPROPERTY_LAST_ENUM; i++) {
+ if (enum_map[i-ICALPROPERTY_FIRST_ENUM].prop == pkind)
+ break;
+ }
+ if (i == ICALPROPERTY_LAST_ENUM)
+ return 0;
+
+ for (; i != ICALPROPERTY_LAST_ENUM; i++) {
+ if ( strcasecmp(enum_map[i-ICALPROPERTY_FIRST_ENUM].str, str) == 0) {
+ return enum_map[i-ICALPROPERTY_FIRST_ENUM].prop_enum;
+ }
+ }
+
+ return 0;
+}
+
+/** @deprecated please use icalproperty_kind_and_string_to_enum instead */
+int icalproperty_string_to_enum(const char* str)
+{
+ int i;
+
+ icalerror_check_arg_rz(str!=0,"str")
+
+ while(*str == ' '){
+ str++;
+ }
+
+ for (i=ICALPROPERTY_FIRST_ENUM; i != ICALPROPERTY_LAST_ENUM; i++) {
+ if ( strcasecmp(enum_map[i-ICALPROPERTY_FIRST_ENUM].str, str) == 0) {
+ return enum_map[i-ICALPROPERTY_FIRST_ENUM].prop_enum;
+ }
+ }
+
+ return 0;
+}
+
+int icalproperty_enum_belongs_to_property(icalproperty_kind kind, int e)
+{
+ int i;
+
+
+ for (i=ICALPROPERTY_FIRST_ENUM; i != ICALPROPERTY_LAST_ENUM; i++) {
+ if(enum_map[i-ICALPROPERTY_FIRST_ENUM].prop_enum == e &&
+ enum_map[i-ICALPROPERTY_FIRST_ENUM].prop == kind ){
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+
+const char* icalproperty_method_to_string(icalproperty_method method)
+{
+ icalerror_check_arg_rz(method >= ICAL_METHOD_X,"method");
+ icalerror_check_arg_rz(method <= ICAL_METHOD_NONE,"method");
+
+ return enum_map[method-ICALPROPERTY_FIRST_ENUM].str;
+}
+
+icalproperty_method icalproperty_string_to_method(const char* str)
+{
+ int i;
+
+ icalerror_check_arg_rx(str!=0,"str",ICAL_METHOD_NONE)
+
+ while(*str == ' '){
+ str++;
+ }
+
+ for (i=ICAL_METHOD_X-ICALPROPERTY_FIRST_ENUM;
+ i != ICAL_METHOD_NONE-ICALPROPERTY_FIRST_ENUM;
+ i++) {
+ if ( strcasecmp(enum_map[i].str, str) == 0) {
+ return (icalproperty_method)enum_map[i].prop_enum;
+ }
+ }
+
+ return ICAL_METHOD_NONE;
+}
+
+
+const char* icalenum_status_to_string(icalproperty_status status)
+{
+ icalerror_check_arg_rz(status >= ICAL_STATUS_X,"status");
+ icalerror_check_arg_rz(status <= ICAL_STATUS_NONE,"status");
+
+ return enum_map[status-ICALPROPERTY_FIRST_ENUM].str;
+}
+
+icalproperty_status icalenum_string_to_status(const char* str)
+{
+ int i;
+
+ icalerror_check_arg_rx(str!=0,"str",ICAL_STATUS_NONE)
+
+ while(*str == ' '){
+ str++;
+ }
+
+ for (i=ICAL_STATUS_X-ICALPROPERTY_FIRST_ENUM;
+ i != ICAL_STATUS_NONE-ICALPROPERTY_FIRST_ENUM;
+ i++) {
+ if ( strcasecmp(enum_map[i].str, str) == 0) {
+ return (icalproperty_status)enum_map[i].prop_enum;
+ }
+ }
+
+ return ICAL_STATUS_NONE;
+
+}
diff --git a/libkcal/libical/src/libical/icalderivedproperty.h.in b/libkcal/libical/src/libical/icalderivedproperty.h.in
new file mode 100644
index 00000000..195d27fc
--- /dev/null
+++ b/libkcal/libical/src/libical/icalderivedproperty.h.in
@@ -0,0 +1,21 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icalderivedproperties.{c,h}
+ CREATOR: eric 09 May 1999
+
+
+ (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org
+ ======================================================================*/
+
+
+#ifndef ICALDERIVEDPROPERTY_H
+#define ICALDERIVEDPROPERTY_H
+
+#include <time.h>
+#include "icalparameter.h"
+#include "icalderivedvalue.h"
+#include "icalrecur.h"
+
+typedef struct icalproperty_impl icalproperty;
+
+<insert_code_here>
diff --git a/libkcal/libical/src/libical/icalderivedvalue.c.in b/libkcal/libical/src/libical/icalderivedvalue.c.in
new file mode 100644
index 00000000..e126867a
--- /dev/null
+++ b/libkcal/libical/src/libical/icalderivedvalue.c.in
@@ -0,0 +1,336 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalvalue.c
+ CREATOR: eric 02 May 1999
+
+
+
+ (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The original code is icalvalue.c
+
+ Contributions from:
+ Graham Davison (g.m.davison@computer.org)
+
+
+======================================================================*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "icalerror.h"
+#include "icalmemory.h"
+#include "icalparser.h"
+#include "icalenums.h"
+
+#include "icalvalueimpl.h"
+
+#include <stdlib.h> /* for malloc */
+#include <stdio.h> /* for snprintf */
+#include <string.h> /* For memset, others */
+#include <stddef.h> /* For offsetof() macro */
+#include <errno.h>
+#include <time.h> /* for mktime */
+#include <stdlib.h> /* for atoi and atof */
+#include <limits.h> /* for SHRT_MAX */
+
+struct icalvalue_impl* icalvalue_new_impl(icalvalue_kind kind);
+
+/* This map associates each of the value types with its string
+ representation */
+struct icalvalue_kind_map {
+ icalvalue_kind kind;
+ char name[20];
+};
+
+<insert_code_here>
+
+
+int icalvalue_kind_is_valid(const icalvalue_kind kind)
+{
+ int i = 0;
+ do {
+ if (value_map[i].kind == kind)
+ return 1;
+ } while (value_map[i++].kind != ICAL_NO_VALUE);
+
+ return 0;
+}
+
+const char* icalvalue_kind_to_string(const icalvalue_kind kind)
+{
+ int i;
+
+ for (i=0; value_map[i].kind != ICAL_NO_VALUE; i++) {
+ if (value_map[i].kind == kind) {
+ return value_map[i].name;
+ }
+ }
+
+ return 0;
+}
+
+icalvalue_kind icalvalue_string_to_kind(const char* str)
+{
+ int i;
+
+ for (i=0; value_map[i].kind != ICAL_NO_VALUE; i++) {
+ if (strcasecmp(value_map[i].name,str) == 0) {
+ return value_map[i].kind;
+ }
+ }
+
+ return value_map[i].kind;
+
+}
+
+icalvalue* icalvalue_new_x (const char* v){
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_X_VALUE);
+ icalerror_check_arg_rz( (v!=0),"v");
+
+ icalvalue_set_x((icalvalue*)impl,v);
+ return (icalvalue*)impl;
+}
+void icalvalue_set_x(icalvalue* impl, const char* v) {
+ icalerror_check_arg_rv( (impl!=0),"value");
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ if(impl->x_value!=0) {free((void*)impl->x_value);}
+
+ impl->x_value = icalmemory_strdup(v);
+
+ if (impl->x_value == 0){
+ errno = ENOMEM;
+ }
+
+ }
+const char* icalvalue_get_x(const icalvalue* value) {
+
+ icalerror_check_arg( (value!=0),"value");
+ icalerror_check_value_type(value, ICAL_X_VALUE);
+ return value->x_value;
+}
+
+/* Recur is a special case, so it is not auto generated. */
+icalvalue*
+icalvalue_new_recur (struct icalrecurrencetype v)
+{
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_RECUR_VALUE);
+
+ icalvalue_set_recur((icalvalue*)impl,v);
+
+ return (icalvalue*)impl;
+}
+
+void
+icalvalue_set_recur(icalvalue* impl, struct icalrecurrencetype v)
+{
+ icalerror_check_arg_rv( (impl!=0),"value");
+ icalerror_check_value_type(value, ICAL_RECUR_VALUE);
+
+ if (impl->data.v_recur != 0){
+ free(impl->data.v_recur);
+ impl->data.v_recur = 0;
+ }
+
+ impl->data.v_recur = malloc(sizeof(struct icalrecurrencetype));
+
+ if (impl->data.v_recur == 0){
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return;
+ } else {
+ memcpy(impl->data.v_recur, &v, sizeof(struct icalrecurrencetype));
+ }
+
+}
+
+struct icalrecurrencetype
+icalvalue_get_recur(const icalvalue* value)
+{
+ icalerror_check_arg( (value!=0),"value");
+ icalerror_check_value_type(value, ICAL_RECUR_VALUE);
+
+ return *(value->data.v_recur);
+}
+
+
+
+
+icalvalue*
+icalvalue_new_trigger (struct icaltriggertype v)
+{
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_TRIGGER_VALUE);
+
+ icalvalue_set_trigger((icalvalue*)impl,v);
+
+ return (icalvalue*)impl;
+}
+
+void
+icalvalue_set_trigger(icalvalue* value, struct icaltriggertype v)
+{
+ icalerror_check_arg_rv( (value!=0),"value");
+
+ if(!icaltime_is_null_time(v.time)){
+ icalvalue_set_datetime(value,v.time);
+ value->kind = ICAL_DATETIME_VALUE;
+ } else {
+ icalvalue_set_duration(value,v.duration);
+ value->kind = ICAL_DURATION_VALUE;
+ }
+}
+
+struct icaltriggertype
+icalvalue_get_trigger(const icalvalue* impl)
+{
+ struct icaltriggertype tr;
+
+ icalerror_check_arg( (impl!=0),"value");
+ icalerror_check_arg( (impl!=0),"value");
+
+ if(impl->kind == ICAL_DATETIME_VALUE){
+ tr.duration = icaldurationtype_from_int(0);
+ tr.time = impl->data.v_time;
+ } else if(impl->kind == ICAL_DURATION_VALUE){
+ tr.time = icaltime_null_time();
+ tr.duration = impl->data.v_duration;
+ } else {
+ tr.duration = icaldurationtype_from_int(0);
+ tr.time = icaltime_null_time();
+ icalerror_set_errno(ICAL_BADARG_ERROR);
+ }
+
+ return tr;
+}
+
+/* DATE-TIME-PERIOD is a special case, and is not auto generated */
+
+icalvalue*
+icalvalue_new_datetimeperiod (struct icaldatetimeperiodtype v)
+{
+ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_DATETIMEPERIOD_VALUE);
+
+ icalvalue_set_datetimeperiod(impl,v);
+
+ return (icalvalue*)impl;
+}
+
+void
+icalvalue_set_datetimeperiod(icalvalue* impl, struct icaldatetimeperiodtype v)
+{
+ icalerror_check_arg_rv( (impl!=0),"value");
+
+ icalerror_check_value_type(value, ICAL_DATETIMEPERIOD_VALUE);
+
+ if(!icaltime_is_null_time(v.time)){
+ if(!icaltime_is_valid_time(v.time)){
+ icalerror_set_errno(ICAL_BADARG_ERROR);
+ return;
+ }
+ impl->kind = ICAL_DATETIME_VALUE;
+ icalvalue_set_datetime(impl,v.time);
+ } else if (!icalperiodtype_is_null_period(v.period)) {
+ if(!icalperiodtype_is_valid_period(v.period)){
+ icalerror_set_errno(ICAL_BADARG_ERROR);
+ return;
+ }
+ impl->kind = ICAL_PERIOD_VALUE;
+ icalvalue_set_period(impl,v.period);
+ } else {
+ icalerror_set_errno(ICAL_BADARG_ERROR);
+ }
+}
+
+struct icaldatetimeperiodtype
+icalvalue_get_datetimeperiod(const icalvalue* impl)
+{
+ struct icaldatetimeperiodtype dtp;
+
+ icalerror_check_arg( (impl!=0),"value");
+ icalerror_check_value_type(value, ICAL_DATETIMEPERIOD_VALUE);
+
+ if( impl->kind == ICAL_DATETIME_VALUE || impl->kind == ICAL_DATE_VALUE ){
+ dtp.period = icalperiodtype_null_period();
+ dtp.time = impl->data.v_time;
+ } else if(impl->kind == ICAL_PERIOD_VALUE) {
+ dtp.period = impl->data.v_period;
+ dtp.time = icaltime_null_time();
+ } else {
+ dtp.period = icalperiodtype_null_period();
+ dtp.time = icaltime_null_time();
+ icalerror_set_errno(ICAL_BADARG_ERROR);
+ }
+
+ return dtp;
+}
+
+
+
+icalvalue *
+icalvalue_new_attach (icalattach *attach)
+{
+ struct icalvalue_impl *impl;
+
+ icalerror_check_arg_rz ((attach != NULL), "attach");
+
+ impl = icalvalue_new_impl (ICAL_ATTACH_VALUE);
+ if (!impl) {
+ errno = ENOMEM;
+ return NULL;
+ }
+
+ icalvalue_set_attach ((icalvalue *) impl, attach);
+ return (icalvalue *) impl;
+}
+
+void
+icalvalue_set_attach (icalvalue *value, icalattach *attach)
+{
+ struct icalvalue_impl *impl;
+
+ icalerror_check_arg_rv ((value != NULL), "value");
+ icalerror_check_value_type (value, ICAL_ATTACH_VALUE);
+ icalerror_check_arg_rv ((attach != NULL), "attach");
+
+ impl = (struct icalvalue_impl *) value;
+
+ icalattach_ref (attach);
+
+ if (impl->data.v_attach)
+ icalattach_unref (impl->data.v_attach);
+
+ impl->data.v_attach = attach;
+}
+
+icalattach *
+icalvalue_get_attach (const icalvalue *value)
+{
+ icalerror_check_arg_rz ((value != NULL), "value");
+ icalerror_check_value_type (value, ICAL_ATTACH_VALUE);
+
+ return value->data.v_attach;
+}
+
+
+
+
+
+
+
+/* The remaining interfaces are 'new', 'set' and 'get' for each of the value
+ types */
+
+
+/* Everything below this line is machine generated. Do not edit. */
diff --git a/libkcal/libical/src/libical/icalderivedvalue.h.in b/libkcal/libical/src/libical/icalderivedvalue.h.in
new file mode 100644
index 00000000..92c45340
--- /dev/null
+++ b/libkcal/libical/src/libical/icalderivedvalue.h.in
@@ -0,0 +1,63 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalvalue.h
+ CREATOR: eric 20 March 1999
+
+
+
+
+
+ (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The original code is icalvalue.h
+
+ ======================================================================*/
+
+#ifndef ICALDERIVEDVALUE_H
+#define ICALDERIVEDVALUE_H
+
+#include "icaltypes.h"
+#include "icalrecur.h"
+#include "icaltime.h"
+#include "icalduration.h"
+#include "icalperiod.h"
+#include "icalattach.h"
+
+typedef struct icalvalue_impl icalvalue;
+
+
+
+void icalvalue_set_x(icalvalue* value, const char* v);
+icalvalue* icalvalue_new_x(const char* v);
+const char* icalvalue_get_x(const icalvalue* value);
+
+icalvalue* icalvalue_new_recur (struct icalrecurrencetype v);
+void icalvalue_set_recur(icalvalue* value, struct icalrecurrencetype v);
+struct icalrecurrencetype icalvalue_get_recur(const icalvalue* value);
+
+icalvalue* icalvalue_new_trigger (struct icaltriggertype v);
+void icalvalue_set_trigger(icalvalue* value, struct icaltriggertype v);
+struct icaltriggertype icalvalue_get_trigger(const icalvalue* value);
+
+icalvalue* icalvalue_new_datetimeperiod (struct icaldatetimeperiodtype v);
+void icalvalue_set_datetimeperiod(icalvalue* value, struct icaldatetimeperiodtype v);
+struct icaldatetimeperiodtype icalvalue_get_datetimeperiod(const icalvalue* value);
+
+icalvalue *icalvalue_new_attach (icalattach *attach);
+void icalvalue_set_attach (icalvalue *value, icalattach *attach);
+icalattach *icalvalue_get_attach (const icalvalue *value);
+
+void icalvalue_reset_kind(icalvalue* value);
+
+<insert_code_here>
diff --git a/libkcal/libical/src/libical/icalduration.c b/libkcal/libical/src/libical/icalduration.c
new file mode 100644
index 00000000..0d9856b2
--- /dev/null
+++ b/libkcal/libical/src/libical/icalduration.c
@@ -0,0 +1,331 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icaltime.c
+ CREATOR: eric 02 June 2000
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The Original Code is eric. The Initial Developer of the Original
+ Code is Eric Busboom
+
+
+ ======================================================================*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "icalduration.h"
+
+#include <assert.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "icalerror.h"
+#include "icalmemory.h"
+#include "icalvalue.h"
+
+
+
+
+/* From Seth Alves, <alves@hungry.com> */
+struct icaldurationtype icaldurationtype_from_int(int t)
+{
+ struct icaldurationtype dur;
+ int used = 0;
+
+ dur = icaldurationtype_null_duration();
+
+ if(t < 0){
+ dur.is_neg = 1;
+ t = -t;
+ }
+
+ if (t % (60 * 60 * 24 * 7) == 0) {
+ dur.weeks = t / (60 * 60 * 24 * 7);
+ } else {
+ used += dur.weeks * (60 * 60 * 24 * 7);
+ dur.days = (t - used) / (60 * 60 * 24);
+ used += dur.days * (60 * 60 * 24);
+ dur.hours = (t - used) / (60 * 60);
+ used += dur.hours * (60 * 60);
+ dur.minutes = (t - used) / (60);
+ used += dur.minutes * (60);
+ dur.seconds = (t - used);
+ }
+
+ return dur;
+}
+
+struct icaldurationtype icaldurationtype_from_string(const char* str)
+{
+
+ int i;
+ int begin_flag = 0;
+ int time_flag = 0;
+ int date_flag = 0;
+ int week_flag = 0;
+ int digits=-1;
+ int scan_size = -1;
+ int size = strlen(str);
+ char p;
+ struct icaldurationtype d;
+
+ memset(&d, 0, sizeof(struct icaldurationtype));
+
+ for(i=0;i != size;i++){
+ p = str[i];
+
+ switch(p)
+ {
+ case '-': {
+ if(i != 0 || begin_flag == 1) goto error;
+
+ d.is_neg = 1;
+ break;
+ }
+
+ case 'P': {
+ if (i != 0 && i !=1 ) goto error;
+ begin_flag = 1;
+ break;
+ }
+
+ case 'T': {
+ time_flag = 1;
+ break;
+ }
+
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ {
+
+ /* HACK. Skip any more digits if the l;ast one
+ read has not been assigned */
+ if(digits != -1){
+ break;
+ }
+
+ if (begin_flag == 0) goto error;
+ /* Get all of the digits, not one at a time */
+ scan_size = sscanf(&str[i],"%d",&digits);
+ if(scan_size == 0) goto error;
+ break;
+ }
+
+ case 'H': {
+ if (time_flag == 0||week_flag == 1||d.hours !=0||digits ==-1)
+ goto error;
+ d.hours = digits; digits = -1;
+ break;
+ }
+ case 'M': {
+ if (time_flag == 0||week_flag==1||d.minutes != 0||digits ==-1)
+ goto error;
+ d.minutes = digits; digits = -1;
+ break;
+ }
+ case 'S': {
+ if (time_flag == 0||week_flag==1||d.seconds!=0||digits ==-1)
+ goto error;
+ d.seconds = digits; digits = -1;
+ break;
+ }
+ case 'W': {
+ if (time_flag==1||date_flag==1||d.weeks!=0||digits ==-1)
+ goto error;
+ week_flag = 1;
+ d.weeks = digits; digits = -1;
+ break;
+ }
+ case 'D': {
+ if (time_flag==1||week_flag==1||d.days!=0||digits ==-1)
+ goto error;
+ date_flag = 1;
+ d.days = digits; digits = -1;
+ break;
+ }
+ default: {
+ goto error;
+ }
+
+ }
+ }
+
+ return d;
+
+
+ error:
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return icaldurationtype_bad_duration();
+}
+
+#define TMP_BUF_SIZE 1024
+static
+void append_duration_segment(char** buf, char** buf_ptr, size_t* buf_size,
+ const char* sep, unsigned int value) {
+
+ char temp[TMP_BUF_SIZE];
+
+ snprintf(temp,sizeof(temp),"%d",value);
+
+ icalmemory_append_string(buf, buf_ptr, buf_size, temp);
+ icalmemory_append_string(buf, buf_ptr, buf_size, sep);
+
+}
+
+char* icaldurationtype_as_ical_string(struct icaldurationtype d)
+{
+
+ char *buf, *output_line;
+ size_t buf_size = 256;
+ char* buf_ptr = 0;
+ int seconds;
+
+ buf = (char*)icalmemory_new_buffer(buf_size);
+ buf_ptr = buf;
+
+
+ seconds = icaldurationtype_as_int(d);
+
+ if(seconds !=0){
+
+ if(d.is_neg == 1){
+ icalmemory_append_char(&buf, &buf_ptr, &buf_size, '-');
+ }
+
+ icalmemory_append_char(&buf, &buf_ptr, &buf_size, 'P');
+
+ if (d.weeks != 0 ) {
+ append_duration_segment(&buf, &buf_ptr, &buf_size, "W", d.weeks);
+ }
+
+ if (d.days != 0 ) {
+ append_duration_segment(&buf, &buf_ptr, &buf_size, "D", d.days);
+ }
+
+ if (d.hours != 0 || d.minutes != 0 || d.seconds != 0) {
+
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, "T");
+
+ if (d.hours != 0 ) {
+ append_duration_segment(&buf, &buf_ptr, &buf_size, "H", d.hours);
+ }
+ if (d.minutes != 0 ) {
+ append_duration_segment(&buf, &buf_ptr, &buf_size, "M",
+ d.minutes);
+ }
+ if (d.seconds != 0 ) {
+ append_duration_segment(&buf, &buf_ptr, &buf_size, "S",
+ d.seconds);
+ }
+
+ }
+ } else {
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, "PT0S");
+ }
+
+ output_line = icalmemory_tmp_copy(buf);
+ icalmemory_free_buffer(buf);
+
+ return output_line;
+
+}
+
+
+/* From Russel Steinthal */
+int icaldurationtype_as_int(struct icaldurationtype dur)
+{
+ return (int)( (dur.seconds +
+ (60 * dur.minutes) +
+ (60 * 60 * dur.hours) +
+ (60 * 60 * 24 * dur.days) +
+ (60 * 60 * 24 * 7 * dur.weeks))
+ * (dur.is_neg==1? -1 : 1) ) ;
+}
+
+struct icaldurationtype icaldurationtype_null_duration(void)
+{
+ struct icaldurationtype d;
+
+ memset(&d,0,sizeof(struct icaldurationtype));
+
+ return d;
+}
+
+int icaldurationtype_is_null_duration(struct icaldurationtype d)
+{
+ if(icaldurationtype_as_int(d) == 0){
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+/* in icalvalue_new_from_string_with_error, we should not call
+ icaldurationtype_is_null_duration() to see if there is an error
+ condition. Null duration is perfectly valid for an alarm.
+ We cannot depend on the caller to check icalerrno either,
+ following the philosophy of unix errno. we set the is_neg
+ to -1 to indicate that this is a bad duration.
+*/
+struct icaldurationtype icaldurationtype_bad_duration()
+{
+ struct icaldurationtype d;
+ memset(&d,0,sizeof(struct icaldurationtype));
+ d.is_neg = -1;
+ return d;
+}
+
+int icaldurationtype_is_bad_duration(struct icaldurationtype d)
+{
+ return (d.is_neg == -1);
+}
+
+
+struct icaltimetype icaltime_add(struct icaltimetype t,
+ struct icaldurationtype d)
+{
+ int dt = icaldurationtype_as_int(d);
+
+ t.second += dt;
+
+ t = icaltime_normalize(t);
+
+ return t;
+}
+
+struct icaldurationtype icaltime_subtract(struct icaltimetype t1,
+ struct icaltimetype t2)
+{
+
+ time_t t1t = icaltime_as_timet(t1);
+ time_t t2t = icaltime_as_timet(t2);
+
+ return icaldurationtype_from_int((int)(t1t-t2t));
+
+
+}
+
diff --git a/libkcal/libical/src/libical/icalduration.h b/libkcal/libical/src/libical/icalduration.h
new file mode 100644
index 00000000..fb79dbc3
--- /dev/null
+++ b/libkcal/libical/src/libical/icalduration.h
@@ -0,0 +1,61 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalduration.h
+ CREATOR: eric 26 Jan 2001
+
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The Original Code is eric. The Initial Developer of the Original
+ Code is Eric Busboom
+
+
+======================================================================*/
+
+#ifndef ICALDURATION_H
+#define ICALDURATION_H
+
+#include "icaltime.h"
+
+struct icaldurationtype
+{
+ int is_neg;
+ unsigned int days;
+ unsigned int weeks;
+ unsigned int hours;
+ unsigned int minutes;
+ unsigned int seconds;
+};
+
+struct icaldurationtype icaldurationtype_from_int(int t);
+struct icaldurationtype icaldurationtype_from_string(const char*);
+int icaldurationtype_as_int(struct icaldurationtype duration);
+char* icaldurationtype_as_ical_string(struct icaldurationtype d);
+struct icaldurationtype icaldurationtype_null_duration(void);
+struct icaldurationtype icaldurationtype_bad_duration(void);
+int icaldurationtype_is_null_duration(struct icaldurationtype d);
+int icaldurationtype_is_bad_duration(struct icaldurationtype d);
+
+struct icaltimetype icaltime_add(struct icaltimetype t,
+ struct icaldurationtype d);
+
+struct icaldurationtype icaltime_subtract(struct icaltimetype t1,
+ struct icaltimetype t2);
+
+#endif /* !ICALDURATION_H */
+
+
+
diff --git a/libkcal/libical/src/libical/icalenums.c b/libkcal/libical/src/libical/icalenums.c
new file mode 100644
index 00000000..70d97faf
--- /dev/null
+++ b/libkcal/libical/src/libical/icalenums.c
@@ -0,0 +1,166 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalenum.c
+ CREATOR: eric 29 April 1999
+
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The original code is icalenum.c
+
+ ======================================================================*/
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "icalenums.h"
+
+#include <stdio.h> /* For fprintf */
+#include <stdio.h> /* For stderr */
+#include <string.h> /* For strncmp */
+#include <assert.h>
+#include "icalmemory.h"
+
+/*** @brief Allowed request status values
+ */
+static struct {
+ enum icalrequeststatus kind;
+ int major;
+ int minor;
+ const char* str;
+} request_status_map[] = {
+ {ICAL_2_0_SUCCESS_STATUS, 2,0,"Success."},
+ {ICAL_2_1_FALLBACK_STATUS, 2,1,"Success but fallback taken on one or more property values."},
+ {ICAL_2_2_IGPROP_STATUS, 2,2,"Success, invalid property ignored."},
+ {ICAL_2_3_IGPARAM_STATUS, 2,3,"Success, invalid property parameter ignored."},
+ {ICAL_2_4_IGXPROP_STATUS, 2,4,"Success, unknown non-standard property ignored."},
+ {ICAL_2_5_IGXPARAM_STATUS, 2,5,"Success, unknown non standard property value ignored."},
+ {ICAL_2_6_IGCOMP_STATUS, 2,6,"Success, invalid calendar component ignored."},
+ {ICAL_2_7_FORWARD_STATUS, 2,7,"Success, request forwarded to Calendar User."},
+ {ICAL_2_8_ONEEVENT_STATUS, 2,8,"Success, repeating event ignored. Scheduled as a single component."},
+ {ICAL_2_9_TRUNC_STATUS, 2,9,"Success, truncated end date time to date boundary."},
+ {ICAL_2_10_ONETODO_STATUS, 2,10,"Success, repeating VTODO ignored. Scheduled as a single VTODO."},
+ {ICAL_2_11_TRUNCRRULE_STATUS, 2,11,"Success, unbounded RRULE clipped at some finite number of instances "},
+ {ICAL_3_0_INVPROPNAME_STATUS, 3,0,"Invalid property name."},
+ {ICAL_3_1_INVPROPVAL_STATUS, 3,1,"Invalid property value."},
+ {ICAL_3_2_INVPARAM_STATUS, 3,2,"Invalid property parameter."},
+ {ICAL_3_3_INVPARAMVAL_STATUS, 3,3,"Invalid property parameter value."},
+ {ICAL_3_4_INVCOMP_STATUS, 3,4,"Invalid calendar component."},
+ {ICAL_3_5_INVTIME_STATUS, 3,5,"Invalid date or time."},
+ {ICAL_3_6_INVRULE_STATUS, 3,6,"Invalid rule."},
+ {ICAL_3_7_INVCU_STATUS, 3,7,"Invalid Calendar User."},
+ {ICAL_3_8_NOAUTH_STATUS, 3,8,"No authority."},
+ {ICAL_3_9_BADVERSION_STATUS, 3,9,"Unsupported version."},
+ {ICAL_3_10_TOOBIG_STATUS, 3,10,"Request entity too large."},
+ {ICAL_3_11_MISSREQCOMP_STATUS, 3,11,"Required component or property missing."},
+ {ICAL_3_12_UNKCOMP_STATUS, 3,12,"Unknown component or property found."},
+ {ICAL_3_13_BADCOMP_STATUS, 3,13,"Unsupported component or property found"},
+ {ICAL_3_14_NOCAP_STATUS, 3,14,"Unsupported capability."},
+ {ICAL_3_15_INVCOMMAND, 3,15,"Invalid command."},
+ {ICAL_4_0_BUSY_STATUS, 4,0,"Event conflict. Date/time is busy."},
+ {ICAL_4_1_STORE_ACCESS_DENIED, 4,1,"Store Access Denied."},
+ {ICAL_4_2_STORE_FAILED, 4,2,"Store Failed."},
+ {ICAL_4_3_STORE_NOT_FOUND, 4,3,"Store not found."},
+ {ICAL_5_0_MAYBE_STATUS, 5,0,"Request MAY supported."},
+ {ICAL_5_1_UNAVAIL_STATUS, 5,1,"Service unavailable."},
+ {ICAL_5_2_NOSERVICE_STATUS, 5,2,"Invalid calendar service."},
+ {ICAL_5_3_NOSCHED_STATUS, 5,3,"No scheduling support for user."},
+ {ICAL_6_1_CONTAINER_NOT_FOUND, 6,1,"Container not found."},
+ {ICAL_9_0_UNRECOGNIZED_COMMAND, 9,0,"An unrecognized command was received."},
+ {ICAL_UNKNOWN_STATUS, 0,0,"Error: Unknown request status"}
+};
+
+
+/*** @brief Return the descriptive text for a request status
+ */
+const char* icalenum_reqstat_desc(icalrequeststatus stat)
+{
+ int i;
+
+ for (i=0; request_status_map[i].kind != ICAL_UNKNOWN_STATUS; i++) {
+ if ( request_status_map[i].kind == stat) {
+ return request_status_map[i].str;
+ }
+ }
+
+ return 0;
+}
+
+/*** @brief Return the code for a request status
+ */
+char* icalenum_reqstat_code(icalrequeststatus stat)
+{
+ int i, major, minor;
+ char tmpbuf[36];
+
+ for (i=0; request_status_map[i].kind != ICAL_UNKNOWN_STATUS; i++) {
+ if ( request_status_map[i].kind == stat) {
+ major = request_status_map[i].major;
+ minor = request_status_map[i].minor;
+ snprintf(tmpbuf, sizeof(tmpbuf), "%i.%i", major, minor);
+ return icalmemory_tmp_copy(tmpbuf);
+ }
+ }
+ return NULL;
+}
+
+/*** @brief Return the major number for a request status
+ */
+short icalenum_reqstat_major(icalrequeststatus stat)
+{
+ int i;
+
+ for (i=0; request_status_map[i].kind != ICAL_UNKNOWN_STATUS; i++) {
+ if ( request_status_map[i].kind == stat) {
+ return request_status_map[i].major;
+ }
+ }
+ return -1;
+}
+
+/*** @brief Return the minor number for a request status
+ */
+short icalenum_reqstat_minor(icalrequeststatus stat)
+{
+ int i;
+
+ for (i=0; request_status_map[i].kind != ICAL_UNKNOWN_STATUS; i++) {
+ if ( request_status_map[i].kind == stat) {
+ return request_status_map[i].minor;
+ }
+ }
+ return -1;
+}
+
+
+/*** @brief Return a request status for major/minor status numbers
+ */
+icalrequeststatus icalenum_num_to_reqstat(short major, short minor)
+{
+ int i;
+
+ for (i=0; request_status_map[i].kind != ICAL_UNKNOWN_STATUS; i++) {
+ if ( request_status_map[i].major == major && request_status_map[i].minor == minor) {
+ return request_status_map[i].kind;
+ }
+ }
+ return 0;
+}
+
+
+
diff --git a/libkcal/libical/src/libical/icalenums.h b/libkcal/libical/src/libical/icalenums.h
new file mode 100644
index 00000000..971655a3
--- /dev/null
+++ b/libkcal/libical/src/libical/icalenums.h
@@ -0,0 +1,166 @@
+
+/* -*- Mode: C -*-*/
+/*======================================================================
+ FILE: icalenums.h
+
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The original code is icalenums.h
+
+ Contributions from:
+ Graham Davison <g.m.davison@computer.org>
+
+======================================================================*/
+
+#ifndef ICALENUMS_H
+#define ICALENUMS_H
+
+
+
+/***********************************************************************
+ * Component enumerations
+**********************************************************************/
+
+typedef enum icalcomponent_kind {
+ ICAL_NO_COMPONENT,
+ ICAL_ANY_COMPONENT, /* Used to select all components*/
+ ICAL_XROOT_COMPONENT,
+ ICAL_XATTACH_COMPONENT, /* MIME attached data, returned by parser. */
+ ICAL_VEVENT_COMPONENT,
+ ICAL_VTODO_COMPONENT,
+ ICAL_VJOURNAL_COMPONENT,
+ ICAL_VCALENDAR_COMPONENT,
+ ICAL_VAGENDA_COMPONENT,
+ ICAL_VFREEBUSY_COMPONENT,
+ ICAL_VALARM_COMPONENT,
+ ICAL_XAUDIOALARM_COMPONENT,
+ ICAL_XDISPLAYALARM_COMPONENT,
+ ICAL_XEMAILALARM_COMPONENT,
+ ICAL_XPROCEDUREALARM_COMPONENT,
+ ICAL_VTIMEZONE_COMPONENT,
+ ICAL_XSTANDARD_COMPONENT,
+ ICAL_XDAYLIGHT_COMPONENT,
+ ICAL_X_COMPONENT,
+ ICAL_VSCHEDULE_COMPONENT,
+ ICAL_VQUERY_COMPONENT,
+ ICAL_VCAR_COMPONENT,
+ ICAL_VCOMMAND_COMPONENT,
+ ICAL_XLICINVALID_COMPONENT,
+ ICAL_XLICMIMEPART_COMPONENT /* a non-stardard component that mirrors
+ structure of MIME data */
+
+} icalcomponent_kind;
+
+
+
+/***********************************************************************
+ * Request Status codes
+ **********************************************************************/
+
+typedef enum icalrequeststatus {
+ ICAL_UNKNOWN_STATUS,
+ ICAL_2_0_SUCCESS_STATUS,
+ ICAL_2_1_FALLBACK_STATUS,
+ ICAL_2_2_IGPROP_STATUS,
+ ICAL_2_3_IGPARAM_STATUS,
+ ICAL_2_4_IGXPROP_STATUS,
+ ICAL_2_5_IGXPARAM_STATUS,
+ ICAL_2_6_IGCOMP_STATUS,
+ ICAL_2_7_FORWARD_STATUS,
+ ICAL_2_8_ONEEVENT_STATUS,
+ ICAL_2_9_TRUNC_STATUS,
+ ICAL_2_10_ONETODO_STATUS,
+ ICAL_2_11_TRUNCRRULE_STATUS,
+ ICAL_3_0_INVPROPNAME_STATUS,
+ ICAL_3_1_INVPROPVAL_STATUS,
+ ICAL_3_2_INVPARAM_STATUS,
+ ICAL_3_3_INVPARAMVAL_STATUS,
+ ICAL_3_4_INVCOMP_STATUS,
+ ICAL_3_5_INVTIME_STATUS,
+ ICAL_3_6_INVRULE_STATUS,
+ ICAL_3_7_INVCU_STATUS,
+ ICAL_3_8_NOAUTH_STATUS,
+ ICAL_3_9_BADVERSION_STATUS,
+ ICAL_3_10_TOOBIG_STATUS,
+ ICAL_3_11_MISSREQCOMP_STATUS,
+ ICAL_3_12_UNKCOMP_STATUS,
+ ICAL_3_13_BADCOMP_STATUS,
+ ICAL_3_14_NOCAP_STATUS,
+ ICAL_3_15_INVCOMMAND,
+ ICAL_4_0_BUSY_STATUS,
+ ICAL_4_1_STORE_ACCESS_DENIED,
+ ICAL_4_2_STORE_FAILED,
+ ICAL_4_3_STORE_NOT_FOUND,
+ ICAL_5_0_MAYBE_STATUS,
+ ICAL_5_1_UNAVAIL_STATUS,
+ ICAL_5_2_NOSERVICE_STATUS,
+ ICAL_5_3_NOSCHED_STATUS,
+ ICAL_6_1_CONTAINER_NOT_FOUND,
+ ICAL_9_0_UNRECOGNIZED_COMMAND
+} icalrequeststatus;
+
+
+const char* icalenum_reqstat_desc(icalrequeststatus stat);
+short icalenum_reqstat_major(icalrequeststatus stat);
+short icalenum_reqstat_minor(icalrequeststatus stat);
+icalrequeststatus icalenum_num_to_reqstat(short major, short minor);
+char* icalenum_reqstat_code(icalrequeststatus stat);
+
+/***********************************************************************
+ * Conversion functions
+**********************************************************************/
+
+
+/* Thse routines used to be in icalenums.c, but were moved into the
+ icalproperty, icalparameter, icalvalue, or icalcomponent modules. */
+
+/* const char* icalproperty_kind_to_string(icalproperty_kind kind);*/
+#define icalenum_property_kind_to_string(x) icalproperty_kind_to_string(x)
+
+/*icalproperty_kind icalproperty_string_to_kind(const char* string)*/
+#define icalenum_string_to_property_kind(x) icalproperty_string_to_kind(x)
+
+/*icalvalue_kind icalproperty_kind_to_value_kind(icalproperty_kind kind);*/
+#define icalenum_property_kind_to_value_kind(x) icalproperty_kind_to_value_kind(x)
+
+/*const char* icalenum_method_to_string(icalproperty_method);*/
+#define icalenum_method_to_string(x) icalproperty_method_to_string(x)
+
+/*icalproperty_method icalenum_string_to_method(const char* string);*/
+#define icalenum_string_to_method(x) icalproperty_string_to_method(x)
+
+/*const char* icalenum_status_to_string(icalproperty_status);*/
+#define icalenum_status_to_string(x) icalproperty_status_to_string(x)
+
+/*icalproperty_status icalenum_string_to_status(const char* string);*/
+#define icalenum_string_to_status(x) icalproperty_string_to_status(x)
+
+/*icalvalue_kind icalenum_string_to_value_kind(const char* str);*/
+#define icalenum_string_to_value_kind(x) icalvalue_string_to_kind(x)
+
+/*const char* icalenum_value_kind_to_string(icalvalue_kind kind);*/
+#define icalenum_value_kind_to_string(x) icalvalue_kind_to_string(x)
+
+/*const char* icalenum_component_kind_to_string(icalcomponent_kind kind);*/
+#define icalenum_component_kind_to_string(x) icalcomponent_kind_to_string(x)
+
+/*icalcomponent_kind icalenum_string_to_component_kind(const char* string);*/
+#define icalenum_string_to_component_kind(x) icalcomponent_string_to_kind(x)
+
+
+#endif /* !ICALENUMS_H */
+
diff --git a/libkcal/libical/src/libical/icalerror.c b/libkcal/libical/src/libical/icalerror.c
new file mode 100644
index 00000000..7cd44dea
--- /dev/null
+++ b/libkcal/libical/src/libical/icalerror.c
@@ -0,0 +1,250 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icalerror.c
+ CREATOR: eric 16 May 1999
+
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The original code is icalerror.c
+
+ ======================================================================*/
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h> /* for malloc() */
+#include <string.h> /* for strcmp */
+#include "icalerror.h"
+
+#ifdef HAVE_PTHREAD
+#include <pthread.h>
+
+static pthread_key_t icalerrno_key;
+static pthread_once_t icalerrno_key_once = PTHREAD_ONCE_INIT;
+
+static void icalerrno_destroy(void* buf) {
+ free(buf);
+ pthread_setspecific(icalerrno_key, NULL);
+}
+
+static void icalerrno_key_alloc(void) {
+ pthread_key_create(&icalerrno_key, icalerrno_destroy);
+}
+
+icalerrorenum *icalerrno_return(void) {
+ icalerrorenum *_errno;
+
+ pthread_once(&icalerrno_key_once, icalerrno_key_alloc);
+
+ _errno = (icalerrorenum*) pthread_getspecific(icalerrno_key);
+
+ if (!_errno) {
+ _errno = malloc(sizeof(icalerrorenum));
+ *_errno = ICAL_NO_ERROR;
+ pthread_setspecific(icalerrno_key, _errno);
+ }
+ return _errno;
+}
+
+#else
+
+static icalerrorenum icalerrno_storage = ICAL_NO_ERROR;
+
+icalerrorenum *icalerrno_return(void) {
+ return &icalerrno_storage;
+}
+
+#endif
+
+
+static int foo;
+
+void icalerror_stop_here(void)
+{
+ foo++; /* Keep optimizers from removing routine */
+}
+
+void icalerror_crash_here(void)
+{
+ int *p=0;
+ *p = 1;
+
+ assert( *p);
+}
+
+#ifdef ICAL_SETERROR_ISFUNC
+void icalerror_set_errno(icalerrorenum x)
+{
+ icalerrno = x;
+ if(icalerror_get_error_state(x)==ICAL_ERROR_FATAL ||
+ (icalerror_get_error_state(x)==ICAL_ERROR_DEFAULT &&
+ icalerror_errors_are_fatal == 1 )){
+ icalerror_warn(icalerror_strerror(x));
+ assert(0);
+ }
+
+}
+#endif
+
+void icalerror_clear_errno() {
+
+ icalerrno = ICAL_NO_ERROR;
+}
+
+#ifdef ICAL_ERRORS_ARE_FATAL
+int icalerror_errors_are_fatal = 1;
+#else
+int icalerror_errors_are_fatal = 0;
+#endif
+
+struct icalerror_state {
+ icalerrorenum error;
+ icalerrorstate state;
+};
+
+static struct icalerror_state error_state_map[] =
+{
+ { ICAL_BADARG_ERROR,ICAL_ERROR_DEFAULT},
+ { ICAL_NEWFAILED_ERROR,ICAL_ERROR_DEFAULT},
+ { ICAL_ALLOCATION_ERROR,ICAL_ERROR_DEFAULT},
+ { ICAL_MALFORMEDDATA_ERROR,ICAL_ERROR_DEFAULT},
+ { ICAL_PARSE_ERROR,ICAL_ERROR_DEFAULT},
+ { ICAL_INTERNAL_ERROR,ICAL_ERROR_DEFAULT},
+ { ICAL_FILE_ERROR,ICAL_ERROR_DEFAULT},
+ { ICAL_USAGE_ERROR,ICAL_ERROR_DEFAULT},
+ { ICAL_UNIMPLEMENTED_ERROR,ICAL_ERROR_DEFAULT},
+ { ICAL_UNKNOWN_ERROR,ICAL_ERROR_DEFAULT},
+ { ICAL_NO_ERROR,ICAL_ERROR_DEFAULT}
+
+};
+
+struct icalerror_string_map {
+ const char* str;
+ icalerrorenum error;
+ char name[160];
+};
+
+static struct icalerror_string_map string_map[] =
+{
+ {"BADARG",ICAL_BADARG_ERROR,"BADARG: Bad argument to function"},
+ { "NEWFAILED",ICAL_NEWFAILED_ERROR,"NEWFAILED: Failed to create a new object via a *_new() routine"},
+ { "ALLOCATION",ICAL_ALLOCATION_ERROR,"ALLOCATION: Failed to allocate new memory"},
+ {"MALFORMEDDATA",ICAL_MALFORMEDDATA_ERROR,"MALFORMEDDATA: An input string was not correctly formed or a component has missing or extra properties"},
+ { "PARSE",ICAL_PARSE_ERROR,"PARSE: Failed to parse a part of an iCal component"},
+ {"INTERNAL",ICAL_INTERNAL_ERROR,"INTERNAL: Random internal error. This indicates an error in the library code, not an error in use"},
+ { "FILE",ICAL_FILE_ERROR,"FILE: An operation on a file failed. Check errno for more detail."},
+ { "USAGE",ICAL_USAGE_ERROR,"USAGE: Failed to propertyl sequence calls to a set of interfaces"},
+ { "UNIMPLEMENTED",ICAL_UNIMPLEMENTED_ERROR,"UNIMPLEMENTED: This feature has not been implemented"},
+ { "NO",ICAL_NO_ERROR,"NO: No error"},
+ {"UNKNOWN",ICAL_UNKNOWN_ERROR,"UNKNOWN: Unknown error type -- icalerror_strerror() was probably given bad input"}
+};
+
+
+icalerrorenum icalerror_error_from_string(const char* str){
+
+ icalerrorenum e = ICAL_NO_ERROR;
+ int i = 0;
+
+ for( i = 0; string_map[i].error != ICAL_NO_ERROR; i++){
+ if (strcmp(string_map[i].str,str) == 0){
+ e = string_map[i].error;
+ }
+ }
+
+ return e;
+}
+
+icalerrorstate icalerror_supress(const char* error){
+
+ icalerrorenum e = icalerror_error_from_string(error);
+ icalerrorstate es;
+
+ if (e == ICAL_NO_ERROR){
+ return ICAL_ERROR_UNKNOWN;
+ }
+
+
+ es = icalerror_get_error_state(e);
+ icalerror_set_error_state(e,ICAL_ERROR_NONFATAL);
+
+ return es;
+}
+
+char* icalerror_perror()
+{
+ return icalerror_strerror(icalerrno);
+}
+
+void icalerror_restore(const char* error, icalerrorstate es){
+
+
+ icalerrorenum e = icalerror_error_from_string(error);
+
+ if (e != ICAL_NO_ERROR){
+ icalerror_set_error_state(e,es);
+ }
+
+}
+
+
+
+void icalerror_set_error_state( icalerrorenum error,
+ icalerrorstate state)
+{
+ int i;
+
+ for(i = 0; error_state_map[i].error!= ICAL_NO_ERROR;i++){
+ if(error_state_map[i].error == error){
+ error_state_map[i].state = state;
+ }
+ }
+}
+
+icalerrorstate icalerror_get_error_state( icalerrorenum error)
+{
+ int i;
+
+ for(i = 0; error_state_map[i].error!= ICAL_NO_ERROR;i++){
+ if(error_state_map[i].error == error){
+ return error_state_map[i].state;
+ }
+ }
+
+ return ICAL_ERROR_UNKNOWN;
+}
+
+
+
+
+char* icalerror_strerror(icalerrorenum e) {
+
+ int i;
+
+ for (i=0; string_map[i].error != ICAL_UNKNOWN_ERROR; i++) {
+ if (string_map[i].error == e) {
+ return string_map[i].name;
+ }
+ }
+
+ return string_map[i].name; /* Return string for ICAL_UNKNOWN_ERROR*/
+
+}
+
+
+
diff --git a/libkcal/libical/src/libical/icalerror.h b/libkcal/libical/src/libical/icalerror.h
new file mode 100644
index 00000000..0003b2f9
--- /dev/null
+++ b/libkcal/libical/src/libical/icalerror.h
@@ -0,0 +1,160 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalerror.h
+ CREATOR: eric 09 May 1999
+
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The original code is icalerror.h
+
+======================================================================*/
+
+
+#ifndef ICALERROR_H
+#define ICALERROR_H
+
+#include <assert.h>
+#include <stdio.h> /* For icalerror_warn() */
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define ICAL_SETERROR_ISFUNC
+
+
+/** This routine is called before any error is triggered. It is called
+ by icalerror_set_errno, so it does not appear in all of the macros
+ below */
+void icalerror_stop_here(void);
+
+void icalerror_crash_here(void);
+
+typedef enum icalerrorenum {
+ ICAL_NO_ERROR, /* icalerrno may not be initialized - put it first so and pray that the compiler initialize things to zero */
+ ICAL_BADARG_ERROR,
+ ICAL_NEWFAILED_ERROR,
+ ICAL_ALLOCATION_ERROR,
+ ICAL_MALFORMEDDATA_ERROR,
+ ICAL_PARSE_ERROR,
+ ICAL_INTERNAL_ERROR, /* Like assert --internal consist. prob */
+ ICAL_FILE_ERROR,
+ ICAL_USAGE_ERROR,
+ ICAL_UNIMPLEMENTED_ERROR,
+ ICAL_UNKNOWN_ERROR /* Used for problems in input to icalerror_strerror()*/
+
+} icalerrorenum;
+
+icalerrorenum * icalerrno_return(void);
+#define icalerrno (*(icalerrno_return()))
+
+/** If true, libicl aborts after a call to icalerror_set_error
+ *
+ * @warning NOT THREAD SAFE -- recommended that you do not change
+ * this in a multithreaded program.
+ */
+extern int icalerror_errors_are_fatal;
+
+/* Warning messages */
+
+#ifdef __GNUC__ca
+#define icalerror_warn(message) {fprintf(stderr,"%s(), %s:%d: %s\n",__FUNCTION__,__FILE__,__LINE__,message);}
+#else /* __GNU_C__ */
+#define icalerror_warn(message) {fprintf(stderr,"%s:%d: %s\n",__FILE__,__LINE__,message);}
+#endif /* __GNU_C__ */
+
+
+void icalerror_clear_errno(void);
+void _icalerror_set_errno(icalerrorenum);
+
+/* Make an individual error fatal or non-fatal. */
+typedef enum icalerrorstate {
+ ICAL_ERROR_FATAL, /* Not fata */
+ ICAL_ERROR_NONFATAL, /* Fatal */
+ ICAL_ERROR_DEFAULT, /* Use the value of icalerror_errors_are_fatal*/
+ ICAL_ERROR_UNKNOWN /* Asked state for an unknown error type */
+} icalerrorstate ;
+
+char* icalerror_strerror(icalerrorenum e);
+char* icalerror_perror();
+void icalerror_set_error_state( icalerrorenum error, icalerrorstate);
+icalerrorstate icalerror_get_error_state( icalerrorenum error);
+
+#ifndef ICAL_SETERROR_ISFUNC
+#define icalerror_set_errno(x) \
+icalerrno = x; \
+if(icalerror_get_error_state(x)==ICAL_ERROR_FATAL || \
+ (icalerror_get_error_state(x)==ICAL_ERROR_DEFAULT && \
+ icalerror_errors_are_fatal == 1 )){ \
+ icalerror_warn(icalerror_strerror(x)); \
+ assert(0); \
+}
+#else
+void icalerror_set_errno(icalerrorenum x);
+#endif
+
+#ifdef ICAL_ERRORS_ARE_FATAL
+#undef NDEBUG
+#endif
+
+#define icalerror_check_value_type(value,type);
+#define icalerror_check_property_type(value,type);
+#define icalerror_check_parameter_type(value,type);
+#define icalerror_check_component_type(value,type);
+
+/* Assert with a message */
+#ifdef ICAL_ERRORS_ARE_FATAL
+
+#ifdef __GNUC__
+#define icalerror_assert(test,message) if(!(test)){fprintf(stderr,"%s(), %s:%d: %s\n",__FUNCTION__,__FILE__,__LINE__,message);icalerror_stop_here(); abort();}
+#else /*__GNUC__*/
+#define icalerror_assert(test,message) if(!(test)){fprintf(stderr,"%s:%d: %s\n",__FILE__,__LINE__,message);icalerror_stop_here(); abort();}
+#endif /*__GNUC__*/
+
+#else /* ICAL_ERRORS_ARE_FATAL */
+#define icalerror_assert(test,message)
+#endif /* ICAL_ERRORS_ARE_FATAL */
+
+/* Check & abort if check fails */
+#define icalerror_check_arg(test,arg) if(!(test)) { icalerror_set_errno(ICAL_BADARG_ERROR); }
+
+/* Check & return void if check fails*/
+#define icalerror_check_arg_rv(test,arg) if(!(test)) {icalerror_set_errno(ICAL_BADARG_ERROR); return; }
+
+/* Check & return 0 if check fails*/
+#define icalerror_check_arg_rz(test,arg) if(!(test)) { icalerror_set_errno(ICAL_BADARG_ERROR); return 0;}
+
+/* Check & return an error if check fails*/
+#define icalerror_check_arg_re(test,arg,error) if(!(test)) { icalerror_stop_here(); assert(0); return error;}
+
+/* Check & return something*/
+#define icalerror_check_arg_rx(test,arg,x) if(!(test)) { icalerror_set_errno(ICAL_BADARG_ERROR); return x;}
+
+
+
+/* String interfaces to set an error to NONFATAL and restore it to its
+ original value */
+
+icalerrorstate icalerror_supress(const char* error);
+void icalerror_restore(const char* error, icalerrorstate es);
+
+
+#endif /* !ICALERROR_H */
+
+
+
diff --git a/libkcal/libical/src/libical/icalmemory.c b/libkcal/libical/src/libical/icalmemory.c
new file mode 100644
index 00000000..32ab69c2
--- /dev/null
+++ b/libkcal/libical/src/libical/icalmemory.c
@@ -0,0 +1,373 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icalmemory.c
+ CREATOR: eric 30 June 1999
+
+ (C) COPYRIGHT 1999, Eric Busboom <eric@softwarestudio.org>
+ 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 Code is icalmemory.h
+
+ ======================================================================*/
+
+/**
+ * @file icalmemory.c
+ * @brief Common memory management routines.
+ *
+ * libical often passes strings back to the caller. To make these
+ * interfaces simple, I did not want the caller to have to pass in a
+ * memory buffer, but having libical pass out newly allocated memory
+ * makes it difficult to de-allocate the memory.
+ *
+ * The ring buffer in this scheme makes it possible for libical to pass
+ * out references to memory which the caller does not own, and be able
+ * to de-allocate the memory later. The ring allows libical to have
+ * several buffers active simultaneously, which is handy when creating
+ * string representations of components.
+ */
+
+#define ICALMEMORY_C
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef DMALLOC
+#include "dmalloc.h"
+#endif
+
+#include "icalmemory.h"
+#include "icalerror.h"
+
+#include <stdio.h> /* for printf (debugging) */
+#include <stdlib.h> /* for malloc, realloc */
+#include <string.h> /* for memset(), strdup */
+
+#ifdef WIN32
+#include <windows.h>
+#endif
+
+#define BUFFER_RING_SIZE 2500
+#define MIN_BUFFER_SIZE 200
+
+
+/* HACK. Not threadsafe */
+
+typedef struct {
+ int pos;
+ void *ring[BUFFER_RING_SIZE];
+} buffer_ring;
+
+void icalmemory_free_tmp_buffer (void* buf);
+void icalmemory_free_ring_byval(buffer_ring *br);
+
+static buffer_ring* global_buffer_ring = 0;
+
+#ifdef HAVE_PTHREAD
+#include <pthread.h>
+
+static pthread_key_t ring_key;
+static pthread_once_t ring_key_once = PTHREAD_ONCE_INIT;
+
+static void ring_destroy(void * buf) {
+ if (buf) icalmemory_free_ring_byval((buffer_ring *) buf);
+ pthread_setspecific(ring_key, NULL);
+}
+
+static void ring_key_alloc(void) {
+ pthread_key_create(&ring_key, ring_destroy);
+}
+#endif
+
+
+static buffer_ring * buffer_ring_new(void) {
+ buffer_ring *br;
+ int i;
+
+ br = (buffer_ring *)malloc(sizeof(buffer_ring));
+
+ for(i=0; i<BUFFER_RING_SIZE; i++){
+ br->ring[i] = 0;
+ }
+ br->pos = 0;
+ return(br);
+}
+
+
+#ifdef HAVE_PTHREAD
+static buffer_ring* get_buffer_ring_pthread(void) {
+ buffer_ring *br;
+
+ pthread_once(&ring_key_once, ring_key_alloc);
+
+ br = pthread_getspecific(ring_key);
+
+ if (!br) {
+ br = buffer_ring_new();
+ pthread_setspecific(ring_key, br);
+ }
+ return(br);
+}
+#endif
+
+/* get buffer ring via a single global for a non-threaded program */
+static buffer_ring* get_buffer_ring_global(void) {
+ if (global_buffer_ring == 0) {
+ global_buffer_ring = buffer_ring_new();
+ }
+ return(global_buffer_ring);
+}
+
+static buffer_ring *get_buffer_ring(void) {
+#ifdef HAVE_PTHREAD
+ return(get_buffer_ring_pthread());
+#else
+ return get_buffer_ring_global();
+#endif
+}
+
+
+/** Add an existing buffer to the buffer ring */
+void icalmemory_add_tmp_buffer(void* buf)
+{
+ buffer_ring *br = get_buffer_ring();
+
+
+ /* Wrap around the ring */
+ if(++(br->pos) == BUFFER_RING_SIZE){
+ br->pos = 0;
+ }
+
+ /* Free buffers as their slots are overwritten */
+ if ( br->ring[br->pos] != 0){
+ free( br->ring[br->pos]);
+ }
+
+ /* Assign the buffer to a slot */
+ br->ring[br->pos] = buf;
+}
+
+
+/**
+ * Create a new temporary buffer on the ring. Libical owns these and
+ * will deallocate them.
+ */
+
+void*
+icalmemory_tmp_buffer (size_t size)
+{
+ char *buf;
+
+ if (size < MIN_BUFFER_SIZE){
+ size = MIN_BUFFER_SIZE;
+ }
+
+ buf = (void*)malloc(size);
+
+ if( buf == 0){
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return 0;
+ }
+
+ memset(buf,0,size);
+
+ icalmemory_add_tmp_buffer(buf);
+
+ return buf;
+}
+
+/** get rid of this buffer ring */
+void icalmemory_free_ring_byval(buffer_ring *br) {
+ int i;
+ for(i=0; i<BUFFER_RING_SIZE; i++){
+ if ( br->ring[i] != 0){
+ free( br->ring[i]);
+ }
+ }
+ free(br);
+}
+
+void icalmemory_free_ring()
+{
+ buffer_ring *br;
+ br = get_buffer_ring();
+
+ icalmemory_free_ring_byval(br);
+#ifdef HAVE_PTHREAD
+ pthread_setspecific(ring_key, 0);
+#else
+ global_buffer_ring = 0;
+#endif
+
+}
+
+
+
+/** Like strdup, but the buffer is on the ring. */
+char*
+icalmemory_tmp_copy(const char* str)
+{
+ char* b = icalmemory_tmp_buffer(strlen(str)+1);
+
+ strcpy(b,str);
+
+ return b;
+}
+
+
+char* icalmemory_strdup(const char *s)
+{
+ return strdup(s);
+}
+
+void
+icalmemory_free_tmp_buffer (void* buf)
+{
+ if(buf == 0)
+ {
+ return;
+ }
+
+ free(buf);
+}
+
+
+/*
+ * These buffer routines create memory the old fashioned way -- so the
+ * caller will have to deallocate the new memory
+ */
+
+void* icalmemory_new_buffer(size_t size)
+{
+ void *b = malloc(size);
+
+ if( b == 0){
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return 0;
+ }
+
+ memset(b,0,size);
+
+ return b;
+}
+
+void* icalmemory_resize_buffer(void* buf, size_t size)
+{
+ void *b = realloc(buf, size);
+
+ if( b == 0){
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return 0;
+ }
+
+ return b;
+}
+
+void icalmemory_free_buffer(void* buf)
+{
+ free(buf);
+}
+
+void
+icalmemory_append_string(char** buf, char** pos, size_t* buf_size,
+ const char* string)
+{
+ char *new_buf;
+ char *new_pos;
+
+ size_t data_length, final_length, string_length;
+
+#ifndef ICAL_NO_INTERNAL_DEBUG
+ icalerror_check_arg_rv( (buf!=0),"buf");
+ icalerror_check_arg_rv( (*buf!=0),"*buf");
+ icalerror_check_arg_rv( (pos!=0),"pos");
+ icalerror_check_arg_rv( (*pos!=0),"*pos");
+ icalerror_check_arg_rv( (buf_size!=0),"buf_size");
+ icalerror_check_arg_rv( (*buf_size!=0),"*buf_size");
+ icalerror_check_arg_rv( (string!=0),"string");
+#endif
+
+ string_length = strlen(string);
+ data_length = (size_t)*pos - (size_t)*buf;
+ final_length = data_length + string_length;
+
+ if ( final_length >= (size_t) *buf_size) {
+
+
+ *buf_size = (*buf_size) * 2 + final_length;
+
+ new_buf = realloc(*buf,*buf_size);
+
+ new_pos = (void*)((size_t)new_buf + data_length);
+
+ *pos = new_pos;
+ *buf = new_buf;
+ }
+
+ strcpy(*pos, string);
+
+ *pos += string_length;
+}
+
+
+void
+icalmemory_append_char(char** buf, char** pos, size_t* buf_size,
+ char ch)
+{
+ char *new_buf;
+ char *new_pos;
+
+ size_t data_length, final_length;
+
+#ifndef ICAL_NO_INTERNAL_DEBUG
+ icalerror_check_arg_rv( (buf!=0),"buf");
+ icalerror_check_arg_rv( (*buf!=0),"*buf");
+ icalerror_check_arg_rv( (pos!=0),"pos");
+ icalerror_check_arg_rv( (*pos!=0),"*pos");
+ icalerror_check_arg_rv( (buf_size!=0),"buf_size");
+ icalerror_check_arg_rv( (*buf_size!=0),"*buf_size");
+#endif
+
+ data_length = (size_t)*pos - (size_t)*buf;
+
+ final_length = data_length + 2;
+
+ if ( final_length > (size_t) *buf_size ) {
+
+
+ *buf_size = (*buf_size) * 2 + final_length +1;
+
+ new_buf = realloc(*buf,*buf_size);
+
+ new_pos = (void*)((size_t)new_buf + data_length);
+
+ *pos = new_pos;
+ *buf = new_buf;
+ }
+
+ **pos = ch;
+ *pos += 1;
+ **pos = 0;
+}
diff --git a/libkcal/libical/src/libical/icalmemory.h b/libkcal/libical/src/libical/icalmemory.h
new file mode 100644
index 00000000..ed07c3f1
--- /dev/null
+++ b/libkcal/libical/src/libical/icalmemory.h
@@ -0,0 +1,83 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalmemory.h
+ CREATOR: eric 30 June 1999
+
+
+
+ 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 <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+======================================================================*/
+
+#ifndef ICALMEMORY_H
+#define ICALMEMORY_H
+
+#ifndef WIN32
+#include <sys/types.h> /* for size_t */
+#else
+#include <stddef.h>
+#endif
+
+/* Tmp buffers are managed by ical. References can be returned to the
+ caller, although the caller will not own the memory. */
+
+void* icalmemory_tmp_buffer(size_t size);
+char* icalmemory_tmp_copy(const char* str);
+
+/** Add an externally allocated buffer to the ring. */
+void icalmemory_add_tmp_buffer(void*);
+
+
+/** Free all memory used in the ring */
+void icalmemory_free_ring(void);
+
+/* Non-tmp buffers must be freed. These are mostly wrappers around
+ * malloc, etc, but are used so the caller can change the memory
+ * allocators in a future version of the library */
+
+void* icalmemory_new_buffer(size_t size);
+void* icalmemory_resize_buffer(void* buf, size_t size);
+void icalmemory_free_buffer(void* buf);
+
+/**
+ icalmemory_append_string will copy the string 'string' to the
+ buffer 'buf' starting at position 'pos', reallocing 'buf' if it is
+ too small. 'buf_size' is the size of 'buf' and will be changed if
+ 'buf' is reallocated. 'pos' will point to the last byte of the new
+ string in 'buf', usually a '\0' */
+
+/* THESE ROUTINES CAN NOT BE USED ON TMP BUFFERS. Only use them on
+ normally allocated memory, or on buffers created from
+ icalmemory_new_buffer, never with buffers created by
+ icalmemory_tmp_buffer. If icalmemory_append_string has to resize a
+ buffer on the ring, the ring will loose track of it an you will
+ have memory problems. */
+
+void icalmemory_append_string(char** buf, char** pos, size_t* buf_size,
+ const char* string);
+
+/** icalmemory_append_char is similar, but is appends a character instead of a string */
+void icalmemory_append_char(char** buf, char** pos, size_t* buf_size,
+ char ch);
+
+/** A wrapper around strdup. Partly to trap calls to strdup, partly
+ because in -ansi, gcc on Red Hat claims that strdup is undeclared */
+char* icalmemory_strdup(const char *s);
+
+#endif /* !ICALMEMORY_H */
+
+
+
diff --git a/libkcal/libical/src/libical/icalmime.c b/libkcal/libical/src/libical/icalmime.c
new file mode 100644
index 00000000..0a186d14
--- /dev/null
+++ b/libkcal/libical/src/libical/icalmime.c
@@ -0,0 +1,393 @@
+/* -*- Mode: C -*-*/
+/*======================================================================
+ FILE: icalmime.c
+ CREATOR: eric 26 July 2000
+
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The Original Code is eric. The Initial Developer of the Original
+ Code is Eric Busboom
+
+
+======================================================================*/
+
+#include "icalmime.h"
+#include "icalerror.h"
+#include "icalmemory.h"
+#include "sspm.h"
+#include "stdlib.h"
+#include <string.h> /* For strdup */
+#include <stdio.h> /* for snprintf*/
+
+#ifdef DMALLOC
+#include "dmalloc.h"
+#endif
+
+#ifdef WIN32
+#define snprintf _snprintf
+#define strcasecmp stricmp
+#endif
+
+/* These *_part routines are called by the MIME parser via the
+ local_action_map */
+
+struct text_part
+{
+ char* buf;
+ char* buf_pos;
+ size_t buf_size;
+};
+
+void* icalmime_text_new_part()
+{
+
+#define BUF_SIZE 2048
+
+ struct text_part* impl;
+
+ if ( ( impl = (struct text_part*)
+ malloc(sizeof(struct text_part))) == 0) {
+ return 0;
+ }
+
+ impl->buf = icalmemory_new_buffer(BUF_SIZE);
+ impl->buf_pos = impl->buf;
+ impl->buf_size = BUF_SIZE;
+
+ return impl;
+}
+void icalmime_text_add_line(void *part,
+ struct sspm_header *header,
+ const char* line, size_t size)
+{
+ struct text_part* impl = (struct text_part*) part;
+ (void)header;
+ (void)size;
+
+ icalmemory_append_string(&(impl->buf),&(impl->buf_pos),
+ &(impl->buf_size),line);
+
+}
+
+void* icalmime_textcalendar_end_part(void* part)
+{
+
+ struct text_part* impl = (struct text_part*) part;
+ icalcomponent *c = icalparser_parse_string(impl->buf);
+
+ icalmemory_free_buffer(impl->buf);
+ free(impl);
+
+ return c;
+
+}
+
+void* icalmime_text_end_part(void* part)
+{
+ struct text_part* impl = ( struct text_part*) part;
+
+ icalmemory_add_tmp_buffer(impl->buf);
+ /* What for? free(impl); */
+
+ return impl->buf;
+}
+
+void icalmime_text_free_part(void *part)
+{
+ part = part;
+}
+
+
+/* Ignore Attachments for now */
+
+void* icalmime_attachment_new_part()
+{
+ return 0;
+}
+void icalmime_attachment_add_line(void *part, struct sspm_header *header,
+ const char* line, size_t size)
+{
+ (void)part;
+ (void)header;
+ (void)line;
+ (void)size;
+}
+
+void* icalmime_attachment_end_part(void* part)
+{
+ (void)part;
+ return 0;
+}
+
+void icalmime_attachment_free_part(void *part)
+{
+ (void)part;
+}
+
+
+
+
+struct sspm_action_map icalmime_local_action_map[] =
+{
+ {SSPM_TEXT_MAJOR_TYPE,SSPM_CALENDAR_MINOR_TYPE,icalmime_text_new_part,icalmime_text_add_line,icalmime_textcalendar_end_part,icalmime_text_free_part},
+ {SSPM_TEXT_MAJOR_TYPE,SSPM_ANY_MINOR_TYPE,icalmime_text_new_part,icalmime_text_add_line,icalmime_text_end_part,icalmime_text_free_part},
+ {SSPM_TEXT_MAJOR_TYPE,SSPM_PLAIN_MINOR_TYPE,icalmime_text_new_part,icalmime_text_add_line,icalmime_text_end_part,icalmime_text_free_part},
+ {SSPM_APPLICATION_MAJOR_TYPE,SSPM_CALENDAR_MINOR_TYPE,icalmime_attachment_new_part,icalmime_attachment_add_line,icalmime_attachment_end_part,icalmime_attachment_free_part},
+ {SSPM_IMAGE_MAJOR_TYPE,SSPM_CALENDAR_MINOR_TYPE,icalmime_attachment_new_part,icalmime_attachment_add_line,icalmime_attachment_end_part,icalmime_attachment_free_part},
+ {SSPM_AUDIO_MAJOR_TYPE,SSPM_CALENDAR_MINOR_TYPE,icalmime_attachment_new_part,icalmime_attachment_add_line,icalmime_attachment_end_part,icalmime_attachment_free_part},
+ {SSPM_IMAGE_MAJOR_TYPE,SSPM_CALENDAR_MINOR_TYPE,icalmime_attachment_new_part,icalmime_attachment_add_line,icalmime_attachment_end_part,icalmime_attachment_free_part},
+ {SSPM_UNKNOWN_MAJOR_TYPE,SSPM_UNKNOWN_MINOR_TYPE,0,0,0,0}
+};
+
+#define NUM_PARTS 100 /* HACK. Hard Limit */
+
+
+
+struct sspm_part* icalmime_make_part(icalcomponent* comp)
+{
+ comp = comp;
+ return 0;
+}
+
+char* icalmime_as_mime_string(char* icalcomponent);
+
+icalcomponent* icalmime_parse(char* (*get_string)(char *s, size_t size,
+ void *d),
+ void *data)
+{
+ struct sspm_part *parts;
+ int i, last_level=0;
+ icalcomponent *root=0, *parent=0, *comp=0, *last = 0;
+
+ if ( (parts = (struct sspm_part *)
+ malloc(NUM_PARTS*sizeof(struct sspm_part)))==0) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return 0;
+ }
+
+ memset(parts,0,sizeof(parts));
+
+ sspm_parse_mime(parts,
+ NUM_PARTS, /* Max parts */
+ icalmime_local_action_map, /* Actions */
+ get_string,
+ data, /* data for get_string*/
+ 0 /* First header */);
+
+
+
+ for(i = 0; i <NUM_PARTS && parts[i].header.major != SSPM_NO_MAJOR_TYPE ; i++){
+
+#define TMPSZ 1024
+ char mimetype[TMPSZ];
+ const char* major = sspm_major_type_string(parts[i].header.major);
+ const char* minor = sspm_minor_type_string(parts[i].header.minor);
+
+ if(parts[i].header.minor == SSPM_UNKNOWN_MINOR_TYPE ){
+ assert(parts[i].header.minor_text !=0);
+ minor = parts[i].header.minor_text;
+ }
+
+ snprintf(mimetype,sizeof(mimetype),"%s/%s",major,minor);
+
+ comp = icalcomponent_new(ICAL_XLICMIMEPART_COMPONENT);
+
+ if(comp == 0){
+ /* HACK Handle Error */
+ assert(0);
+ }
+
+ if(parts[i].header.error!=SSPM_NO_ERROR){
+ const char *str="Unknown error";
+ char temp[256];
+
+ if(parts[i].header.error==SSPM_UNEXPECTED_BOUNDARY_ERROR){
+ str = "Got an unexpected boundary, possibly due to a MIME header for a MULTIPART part that is missing the Content-Type line";
+ }
+
+ if(parts[i].header.error==SSPM_WRONG_BOUNDARY_ERROR){
+ str = "Got the wrong boundary for the opening of a MULTIPART part.";
+ }
+
+ if(parts[i].header.error==SSPM_NO_BOUNDARY_ERROR){
+ str = "Got a multipart header that did not specify a boundary";
+ }
+
+ if(parts[i].header.error==SSPM_NO_HEADER_ERROR){
+ str = "Did not get a header for the part. Is there a blank\
+line between the header and the previous boundary\?";
+
+ }
+
+ if(parts[i].header.error_text != 0){
+ snprintf(temp,256,
+ "%s: %s",str,parts[i].header.error_text);
+ } else {
+ strcpy(temp,str);
+ }
+
+ icalcomponent_add_property
+ (comp,
+ icalproperty_vanew_xlicerror(
+ temp,
+ icalparameter_new_xlicerrortype(
+ ICAL_XLICERRORTYPE_MIMEPARSEERROR),
+ 0));
+ }
+
+ if(parts[i].header.major != SSPM_NO_MAJOR_TYPE &&
+ parts[i].header.major != SSPM_UNKNOWN_MAJOR_TYPE){
+
+ icalcomponent_add_property(comp,
+ icalproperty_new_xlicmimecontenttype((char*)
+ icalmemory_strdup(mimetype)));
+
+ }
+
+ if (parts[i].header.encoding != SSPM_NO_ENCODING){
+
+ icalcomponent_add_property(comp,
+ icalproperty_new_xlicmimeencoding(
+ sspm_encoding_string(parts[i].header.encoding)));
+ }
+
+ if (parts[i].header.filename != 0){
+ icalcomponent_add_property(comp,
+ icalproperty_new_xlicmimefilename(parts[i].header.filename));
+ }
+
+ if (parts[i].header.content_id != 0){
+ icalcomponent_add_property(comp,
+ icalproperty_new_xlicmimecid(parts[i].header.content_id));
+ }
+
+ if (parts[i].header.charset != 0){
+ icalcomponent_add_property(comp,
+ icalproperty_new_xlicmimecharset(parts[i].header.charset));
+ }
+
+ /* Add iCal components as children of the component */
+ if(parts[i].header.major == SSPM_TEXT_MAJOR_TYPE &&
+ parts[i].header.minor == SSPM_CALENDAR_MINOR_TYPE &&
+ parts[i].data != 0){
+
+ icalcomponent_add_component(comp,
+ (icalcomponent*)parts[i].data);
+ parts[i].data = 0;
+
+ } else if(parts[i].header.major == SSPM_TEXT_MAJOR_TYPE &&
+ parts[i].header.minor != SSPM_CALENDAR_MINOR_TYPE &&
+ parts[i].data != 0){
+
+ /* Add other text components as "DESCRIPTION" properties */
+
+ icalcomponent_add_property(comp,
+ icalproperty_new_description(
+ (char*)icalmemory_strdup((char*)parts[i].data)));
+
+ parts[i].data = 0;
+ }
+
+
+ if(root!= 0 && parts[i].level == 0){
+ /* We've already assigned the root, but there is another
+ part at the root level. This is probably a parse
+ error*/
+ icalcomponent_free(comp);
+ continue;
+ }
+
+ if(parts[i].level == last_level && last_level != 0){
+ icalerror_assert(parent!=0,"No parent for adding component");
+
+ icalcomponent_add_component(parent,comp);
+
+ } else if (parts[i].level == last_level && last_level == 0 &&
+ root == 0) {
+
+ root = comp;
+ parent = comp;
+
+ } else if (parts[i].level > last_level){
+
+ parent = last;
+ icalcomponent_add_component(parent,comp);
+
+ last_level = parts[i].level;
+
+ } else if (parts[i].level < last_level){
+
+ parent = icalcomponent_get_parent(parent);
+ icalcomponent_add_component(parent,comp);
+
+ last_level = parts[i].level;
+ } else {
+ assert(0);
+ }
+
+ last = comp;
+ last_level = parts[i].level;
+ assert(parts[i].data == 0);
+ }
+
+ sspm_free_parts(parts,NUM_PARTS);
+ free(parts);
+
+ return root;
+}
+
+
+
+int icalmime_test(char* (*get_string)(char *s, size_t size, void *d),
+ void *data)
+{
+ char *out;
+ struct sspm_part *parts;
+ int i;
+
+ if ( (parts = (struct sspm_part *)
+ malloc(NUM_PARTS*sizeof(struct sspm_part)))==0) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return 0;
+ }
+
+ memset(parts,0,sizeof(parts));
+
+ sspm_parse_mime(parts,
+ NUM_PARTS, /* Max parts */
+ icalmime_local_action_map, /* Actions */
+ get_string,
+ data, /* data for get_string*/
+ 0 /* First header */);
+
+ for(i = 0; i <NUM_PARTS && parts[i].header.major != SSPM_NO_MAJOR_TYPE ;
+ i++){
+ if(parts[i].header.minor == SSPM_CALENDAR_MINOR_TYPE){
+ parts[i].data = icalmemory_strdup(
+ icalcomponent_as_ical_string((icalcomponent*)parts[i].data));
+ }
+ }
+
+ sspm_write_mime(parts,NUM_PARTS,&out,"To: bob@bob.org");
+
+ printf("%s\n",out);
+
+ return 0;
+
+}
+
+
diff --git a/libkcal/libical/src/libical/icalmime.h b/libkcal/libical/src/libical/icalmime.h
new file mode 100644
index 00000000..8d42dde3
--- /dev/null
+++ b/libkcal/libical/src/libical/icalmime.h
@@ -0,0 +1,42 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalmime.h
+ CREATOR: eric 26 July 2000
+
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+======================================================================*/
+
+#ifndef ICALMIME_H
+#define ICALMIME_H
+
+#include "icalcomponent.h"
+#include "icalparser.h"
+
+icalcomponent* icalmime_parse( char* (*line_gen_func)(char *s, size_t size,
+ void *d),
+ void *data);
+
+/* The inverse of icalmime_parse, not implemented yet. Use sspm.h directly. */
+char* icalmime_as_mime_string(char* component);
+
+
+
+#endif /* !ICALMIME_H */
+
+
+
diff --git a/libkcal/libical/src/libical/icalparameter.c b/libkcal/libical/src/libical/icalparameter.c
new file mode 100644
index 00000000..52029e31
--- /dev/null
+++ b/libkcal/libical/src/libical/icalparameter.c
@@ -0,0 +1,384 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icalderivedparameters.{c,h}
+ CREATOR: eric 09 May 1999
+
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The original code is icalderivedparameters.{c,h}
+
+ Contributions from:
+ Graham Davison <g.m.davison@computer.org>
+
+ ======================================================================*/
+/*#line 29 "icalparameter.c.in"*/
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+
+#include "icalparameter.h"
+#include "icalproperty.h"
+#include "icalerror.h"
+#include "icalmemory.h"
+#include "icalparameterimpl.h"
+
+#include <stdlib.h> /* for malloc() */
+#include <errno.h>
+#include <string.h> /* for memset() */
+
+/* In icalderivedparameter */
+icalparameter* icalparameter_new_from_value_string(icalparameter_kind kind,const char* val);
+
+
+struct icalparameter_impl* icalparameter_new_impl(icalparameter_kind kind)
+{
+ struct icalparameter_impl* v;
+
+ if ( ( v = (struct icalparameter_impl*)
+ malloc(sizeof(struct icalparameter_impl))) == 0) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return 0;
+ }
+
+ strcpy(v->id,"para");
+
+ v->kind = kind;
+ v->size = 0;
+ v->string = 0;
+ v->x_name = 0;
+ v->parent = 0;
+ v->data = 0;
+
+ return v;
+}
+
+icalparameter*
+icalparameter_new (icalparameter_kind kind)
+{
+ struct icalparameter_impl* v = icalparameter_new_impl(kind);
+
+ return (icalparameter*) v;
+
+}
+
+void
+icalparameter_free (icalparameter* param)
+{
+
+/* HACK. This always triggers, even when parameter is non-zero
+ icalerror_check_arg_rv((parameter==0),"parameter");*/
+
+
+#ifdef ICAL_FREE_ON_LIST_IS_ERROR
+ icalerror_assert( (param->parent ==0),"Tried to free a parameter that is still attached to a component. ");
+
+#else
+ if(param->parent !=0){
+ return;
+ }
+#endif
+
+
+ if (param->string != 0){
+ free ((void*)param->string);
+ }
+
+ if (param->x_name != 0){
+ free ((void*)param->x_name);
+ }
+
+ memset(param,0,sizeof(param));
+
+ param->parent = 0;
+ param->id[0] = 'X';
+ free(param);
+}
+
+
+
+icalparameter*
+icalparameter_new_clone(icalparameter* old)
+{
+ struct icalparameter_impl *new;
+
+ new = icalparameter_new_impl(old->kind);
+
+ icalerror_check_arg_rz((old!=0),"param");
+
+ if (new == 0){
+ return 0;
+ }
+
+ memcpy(new,old,sizeof(struct icalparameter_impl));
+
+ if (old->string != 0){
+ new->string = icalmemory_strdup(old->string);
+ if (new->string == 0){
+ icalparameter_free(new);
+ return 0;
+ }
+ }
+
+ if (old->x_name != 0){
+ new->x_name = icalmemory_strdup(old->x_name);
+ if (new->x_name == 0){
+ icalparameter_free(new);
+ return 0;
+ }
+ }
+
+ return new;
+}
+
+icalparameter* icalparameter_new_from_string(const char *str)
+{
+ char* eq;
+ char* cpy;
+ icalparameter_kind kind;
+ icalparameter *param;
+
+ icalerror_check_arg_rz(str != 0,"str");
+
+ cpy = icalmemory_strdup(str);
+
+ if (cpy == 0){
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return 0;
+ }
+
+ eq = strchr(cpy,'=');
+
+ if(eq == 0){
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return 0;
+ }
+
+ *eq = '\0';
+
+ eq++;
+
+ kind = icalparameter_string_to_kind(cpy);
+
+ if(kind == ICAL_NO_PARAMETER){
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return 0;
+ }
+
+ param = icalparameter_new_from_value_string(kind,eq);
+
+ if(kind == ICAL_X_PARAMETER){
+ icalparameter_set_xname(param,cpy);
+ }
+
+ free(cpy);
+
+ return param;
+
+}
+
+/**
+ * Return a string representation of the parameter according to RFC2445.
+ *
+ * param = param-name "=" param-value
+ * param-name = iana-token / x-token
+ * param-value = paramtext /quoted-string
+ * paramtext = *SAFE-SHARE
+ * quoted-string= DQUOTE *QSAFE-CHARE DQUOTE
+ * QSAFE-CHAR = any character except CTLs and DQUOTE
+ * SAFE-CHAR = any character except CTLs, DQUOTE. ";", ":", ","
+ */
+char*
+icalparameter_as_ical_string (icalparameter* param)
+{
+ size_t buf_size = 1024;
+ char* buf;
+ char* buf_ptr;
+ char *out_buf;
+ const char *kind_string;
+
+ icalerror_check_arg_rz( (param!=0), "parameter");
+
+ /* Create new buffer that we can append names, parameters and a
+ value to, and reallocate as needed. Later, this buffer will be
+ copied to a icalmemory_tmp_buffer, which is managed internally
+ by libical, so it can be given to the caller without fear of
+ the caller forgetting to free it */
+
+ buf = icalmemory_new_buffer(buf_size);
+ buf_ptr = buf;
+
+ if(param->kind == ICAL_X_PARAMETER) {
+
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size,
+ icalparameter_get_xname(param));
+
+ } else {
+
+ kind_string = icalparameter_kind_to_string(param->kind);
+
+ if (param->kind == ICAL_NO_PARAMETER ||
+ param->kind == ICAL_ANY_PARAMETER ||
+ kind_string == 0)
+ {
+ icalerror_set_errno(ICAL_BADARG_ERROR);
+ return 0;
+ }
+
+
+ /* Put the parameter name into the string */
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, kind_string);
+
+ }
+
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, "=");
+
+ if(param->string !=0){
+ int qm = 0;
+
+ /* Encapsulate the property in quotes if necessary */
+ if (strpbrk(param->string, ";:,") != 0) {
+ icalmemory_append_char (&buf, &buf_ptr, &buf_size, '"');
+ qm = 1;
+ }
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, param->string);
+ if (qm == 1) {
+ icalmemory_append_char (&buf, &buf_ptr, &buf_size, '"');
+ }
+ } else if (param->data != 0){
+ const char* str = icalparameter_enum_to_string(param->data);
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, str);
+ } else {
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return 0;
+ }
+
+ /* Now, copy the buffer to a tmp_buffer, which is safe to give to
+ the caller without worring about de-allocating it. */
+
+ out_buf = icalmemory_tmp_buffer(strlen(buf)+1);
+ strcpy(out_buf, buf);
+
+ icalmemory_free_buffer(buf);
+
+ return out_buf;
+
+}
+
+
+int
+icalparameter_is_valid (icalparameter* parameter);
+
+
+icalparameter_kind
+icalparameter_isa (icalparameter* parameter)
+{
+ if(parameter == 0){
+ return ICAL_NO_PARAMETER;
+ }
+
+ return parameter->kind;
+}
+
+
+int
+icalparameter_isa_parameter (void* parameter)
+{
+ struct icalparameter_impl *impl = (struct icalparameter_impl *)parameter;
+
+ if (parameter == 0){
+ return 0;
+ }
+
+ if (strcmp(impl->id,"para") == 0) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+
+void
+icalparameter_set_xname (icalparameter* param, const char* v)
+{
+ icalerror_check_arg_rv( (param!=0),"param");
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ if (param->x_name != 0){
+ free((void*)param->x_name);
+ }
+
+ param->x_name = icalmemory_strdup(v);
+
+ if (param->x_name == 0){
+ errno = ENOMEM;
+ }
+
+}
+
+const char*
+icalparameter_get_xname (icalparameter* param)
+{
+ icalerror_check_arg_rz( (param!=0),"param");
+
+ return param->x_name;
+}
+
+void
+icalparameter_set_xvalue (icalparameter* param, const char* v)
+{
+ icalerror_check_arg_rv( (param!=0),"param");
+ icalerror_check_arg_rv( (v!=0),"v");
+
+ if (param->string != 0){
+ free((void*)param->string);
+ }
+
+ param->string = icalmemory_strdup(v);
+
+ if (param->string == 0){
+ errno = ENOMEM;
+ }
+
+}
+
+const char*
+icalparameter_get_xvalue (icalparameter* param)
+{
+ icalerror_check_arg_rz( (param!=0),"param");
+
+ return param->string;
+}
+
+void icalparameter_set_parent(icalparameter* param,
+ icalproperty* property)
+{
+ icalerror_check_arg_rv( (param!=0),"param");
+
+ param->parent = property;
+}
+
+icalproperty* icalparameter_get_parent(icalparameter* param)
+{
+ icalerror_check_arg_rz( (param!=0),"param");
+
+ return param->parent;
+}
+
+
+/* Everything below this line is machine generated. Do not edit. */
+/* ALTREP */
diff --git a/libkcal/libical/src/libical/icalparameter.h b/libkcal/libical/src/libical/icalparameter.h
new file mode 100644
index 00000000..dc5d0548
--- /dev/null
+++ b/libkcal/libical/src/libical/icalparameter.h
@@ -0,0 +1,68 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalparam.h
+ CREATOR: eric 20 March 1999
+
+
+
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The original code is icalparam.h
+
+ ======================================================================*/
+
+#ifndef ICALPARAM_H
+#define ICALPARAM_H
+
+#include "icalderivedparameter.h"
+
+/* Declared in icalderivedparameter.h */
+/*typedef struct icalparameter_impl icalparameter;*/
+
+icalparameter* icalparameter_new(icalparameter_kind kind);
+icalparameter* icalparameter_new_clone(icalparameter* p);
+
+/* Create from string of form "PARAMNAME=VALUE" */
+icalparameter* icalparameter_new_from_string(const char* value);
+
+/* Create from just the value, the part after the "=" */
+icalparameter* icalparameter_new_from_value_string(icalparameter_kind kind, const char* value);
+
+void icalparameter_free(icalparameter* parameter);
+
+char* icalparameter_as_ical_string(icalparameter* parameter);
+
+int icalparameter_is_valid(icalparameter* parameter);
+
+icalparameter_kind icalparameter_isa(icalparameter* parameter);
+
+int icalparameter_isa_parameter(void* param);
+
+/* Access the name of an X parameer */
+void icalparameter_set_xname (icalparameter* param, const char* v);
+const char* icalparameter_get_xname(icalparameter* param);
+void icalparameter_set_xvalue (icalparameter* param, const char* v);
+const char* icalparameter_get_xvalue(icalparameter* param);
+
+/* Convert enumerations */
+
+const char* icalparameter_kind_to_string(icalparameter_kind kind);
+icalparameter_kind icalparameter_string_to_kind(const char* string);
+
+
+
+#endif
diff --git a/libkcal/libical/src/libical/icalparameterimpl.h b/libkcal/libical/src/libical/icalparameterimpl.h
new file mode 100644
index 00000000..f2fed404
--- /dev/null
+++ b/libkcal/libical/src/libical/icalparameterimpl.h
@@ -0,0 +1,51 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icalparameterimpl.h
+ CREATOR: eric 09 May 1999
+
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The original code is icalderivedparameters.{c,h}
+
+ Contributions from:
+ Graham Davison (g.m.davison@computer.org)
+
+ ======================================================================*/
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifndef ICALPARAMETER_IMPL
+#define ICALPARAMETER_IMPL
+
+#include "icalparameter.h"
+#include "icalproperty.h"
+
+struct icalparameter_impl
+{
+ icalparameter_kind kind;
+ char id[5];
+ int size;
+ const char* string;
+ const char* x_name;
+ icalproperty* parent;
+
+ int data;
+};
+
+
+#endif /*ICALPARAMETER_IMPL*/
diff --git a/libkcal/libical/src/libical/icalparser.c b/libkcal/libical/src/libical/icalparser.c
new file mode 100644
index 00000000..95843c96
--- /dev/null
+++ b/libkcal/libical/src/libical/icalparser.c
@@ -0,0 +1,1105 @@
+/* -*- Mode: C; tab-width: 4; c-basic-offset: 8; -*-
+ ======================================================================
+ FILE: icalparser.c
+ CREATOR: eric 04 August 1999
+
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.0 (the "License"); you may not use this file except in
+ compliance with the License. You may obtain a copy of the License at
+ http://www.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The Initial Developer of the Original Code is Eric Busboom
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+ ======================================================================*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+
+#include "pvl.h"
+#include "icalerror.h"
+#include "icalvalue.h"
+#include "icalderivedparameter.h"
+#include "icalparameter.h"
+#include "icalproperty.h"
+#include "icalcomponent.h"
+
+#include <string.h> /* For strncpy & size_t */
+#include <stdio.h> /* For FILE and fgets and snprintf */
+#include <stdlib.h> /* for free */
+#include <ctype.h>
+
+#include "icalmemory.h"
+#include "icalparser.h"
+
+#ifdef HAVE_WCTYPE_H
+# include <wctype.h>
+/* Some systems have an imcomplete implementation on wctype (FreeBSD,
+ * Darwin). Cope with that. */
+# ifndef HAVE_ISWSPACE
+# define iswspace isspace
+# endif
+#else
+# ifndef HAVE_ISWSPACE
+# define iswspace isspace
+# endif
+#endif
+
+#ifdef WIN32
+#define snprintf _snprintf
+#define strcasecmp stricmp
+#endif
+
+char* icalparser_get_next_char(char c, char *str, int qm);
+char* icalparser_get_next_parameter(char* line,char** end);
+char* icalparser_get_next_value(char* line, char **end, icalvalue_kind kind);
+char* icalparser_get_prop_name(char* line, char** end);
+char* icalparser_get_param_name(char* line, char **end);
+
+#define TMP_BUF_SIZE 80
+
+struct icalparser_impl
+{
+ int buffer_full; /* flag indicates that temp is smaller that
+ data being read into it*/
+ int continuation_line; /* last line read was a continuation line */
+ size_t tmp_buf_size;
+ char temp[TMP_BUF_SIZE];
+ icalcomponent *root_component;
+ int version;
+ int level;
+ int lineno;
+ icalparser_state state;
+ pvl_list components;
+
+ void *line_gen_data;
+
+};
+
+
+icalparser* icalparser_new(void)
+{
+ struct icalparser_impl* impl = 0;
+ if ( ( impl = (struct icalparser_impl*)
+ malloc(sizeof(struct icalparser_impl))) == 0) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return 0;
+ }
+
+ impl->root_component = 0;
+ impl->components = pvl_newlist();
+ impl->level = 0;
+ impl->state = ICALPARSER_SUCCESS;
+ impl->tmp_buf_size = TMP_BUF_SIZE;
+ impl->buffer_full = 0;
+ impl->continuation_line = 0;
+ impl->lineno = 0;
+ impl->continuation_line = 0;
+ memset(impl->temp,0, TMP_BUF_SIZE);
+
+ return (icalparser*)impl;
+}
+
+
+void icalparser_free(icalparser* parser)
+{
+ icalcomponent *c;
+
+ if (parser->root_component != 0){
+ icalcomponent_free(parser->root_component);
+ }
+
+ while( (c=pvl_pop(parser->components)) != 0){
+ icalcomponent_free(c);
+ }
+
+ pvl_free(parser->components);
+
+ free(parser);
+}
+
+void icalparser_set_gen_data(icalparser* parser, void* data)
+{
+ parser->line_gen_data = data;
+}
+
+
+icalvalue* icalvalue_new_From_string_with_error(icalvalue_kind kind,
+ char* str,
+ icalproperty **error);
+
+
+
+char* icalparser_get_next_char(char c, char *str, int qm)
+{
+ int quote_mode = 0;
+ char* p;
+
+ for(p=str; *p!=0; p++){
+ if (qm == 1) {
+ if ( quote_mode == 0 && *p=='"' && *(p-1) != '\\' ){
+ quote_mode =1;
+ continue;
+ }
+
+ if ( quote_mode == 1 && *p=='"' && *(p-1) != '\\' ){
+ quote_mode =0;
+ continue;
+ }
+ }
+
+ if (quote_mode == 0 && *p== c && *(p-1) != '\\' ){
+ return p;
+ }
+
+ }
+
+ return 0;
+}
+
+
+/** make a new tmp buffer out of a substring */
+static char* make_segment(char* start, char* end)
+{
+ char *buf, *tmp;
+ size_t size = (size_t)end - (size_t)start;
+
+ buf = icalmemory_tmp_buffer(size+1);
+
+
+ strncpy(buf,start,size);
+ *(buf+size) = 0;
+
+ tmp = (buf+size);
+ while ( *tmp == '\0' || iswspace(*tmp) )
+ {
+ *tmp = 0;
+ tmp--;
+ }
+
+ return buf;
+}
+
+
+char* icalparser_get_prop_name(char* line, char** end)
+{
+ char* p;
+ char* v;
+ char *str;
+
+ p = icalparser_get_next_char(';',line,1);
+ v = icalparser_get_next_char(':',line,1);
+ if (p== 0 && v == 0) {
+ return 0;
+ }
+
+ /* There is no ';' or, it is after the ';' that marks the beginning of
+ the value */
+ if (v!=0 && ( p == 0 || p > v)){
+ str = make_segment(line,v);
+ *end = v+1;
+ } else {
+ str = make_segment(line,p);
+ *end = p+1;
+ }
+
+ return str;
+}
+
+
+char* icalparser_get_param_name(char* line, char **end)
+{
+ char* next;
+ char *str;
+
+ next = icalparser_get_next_char('=',line,1);
+
+ if (next == 0) {
+ return 0;
+ }
+
+ str = make_segment(line,next);
+ *end = next+1;
+ if (**end == '"') {
+ *end = *end+1;
+ next = icalparser_get_next_char('"',*end,0);
+ if (next == 0) {
+ return 0;
+ }
+
+ *end = make_segment(*end,next);
+ }
+
+ return str;
+}
+
+
+char* icalparser_get_next_paramvalue(char* line, char **end)
+{
+ char* next;
+ char *str;
+
+ next = icalparser_get_next_char(',',line,1);
+
+ if (next == 0){
+ next = (char*)(size_t)line+(size_t)strlen(line);\
+ }
+
+ if (next == line){
+ return 0;
+ } else {
+ str = make_segment(line,next);
+ *end = next+1;
+ return str;
+ }
+}
+
+
+/**
+ A property may have multiple values, if the values are separated by
+ commas in the content line. This routine will look for the next
+ comma after line and will set the next place to start searching in
+ end. */
+
+char* icalparser_get_next_value(char* line, char **end, icalvalue_kind kind)
+{
+
+ char* next;
+ char *p;
+ char *str;
+ size_t length = strlen(line);
+
+ p = line;
+ while(1){
+
+ next = icalparser_get_next_char(',',p,1);
+
+ /* Unforunately, RFC2445 says that for the RECUR value, COMMA
+ can both separate digits in a list, and it can separate
+ multiple recurrence specifications. This is not a friendly
+ part of the spec. This weirdness tries to
+ distinguish the two uses. it is probably a HACK*/
+
+ if( kind == ICAL_RECUR_VALUE ) {
+ if ( next != 0 &&
+ (*end+length) > next+5 &&
+ strncmp(next,"FREQ",4) == 0
+ ) {
+ /* The COMMA was followed by 'FREQ', is it a real separator*/
+ /* Fall through */
+ } else if (next != 0){
+ /* Not real, get the next COMMA */
+ p = next+1;
+ next = 0;
+ continue;
+ }
+ }
+ /* ignore all , for query value. select dtstart, dtend etc ... */
+ else if( kind == ICAL_QUERY_VALUE) {
+ if ( next != 0) {
+ p = next+1;
+ continue;
+ }
+ else
+ break;
+ }
+
+ /* If the comma is preceded by a '\', then it is a literal and
+ not a value separator*/
+
+ if ( (next!=0 && *(next-1) == '\\') ||
+ (next!=0 && *(next-3) == '\\')
+ )
+ /*second clause for '/' is on prev line. HACK may be out of bounds */
+ {
+ p = next+1;
+ } else {
+ break;
+ }
+
+ }
+
+ if (next == 0){
+ next = (char*)(size_t)line+length;
+ *end = next;
+ } else {
+ *end = next+1;
+ }
+
+ if (next == line){
+ return 0;
+ }
+
+
+ str = make_segment(line,next);
+ return str;
+
+}
+
+char* icalparser_get_next_parameter(char* line,char** end)
+{
+ char *next;
+ char *v;
+ char *str;
+
+ v = icalparser_get_next_char(':',line,1);
+ next = icalparser_get_next_char(';', line,1);
+
+ /* There is no ';' or, it is after the ':' that marks the beginning of
+ the value */
+
+ if (next == 0 || next > v) {
+ next = icalparser_get_next_char(':', line,1);
+ }
+
+ if (next != 0) {
+ str = make_segment(line,next);
+ *end = next+1;
+ return str;
+ } else {
+ *end = line;
+ return 0;
+ }
+}
+
+
+/**
+ * Get a single property line, from the property name through the
+ * final new line, and include any continuation lines
+ */
+char* icalparser_get_line(icalparser *parser,
+ char* (*line_gen_func)(char *s, size_t size, void *d))
+{
+ char *line;
+ char *line_p;
+ size_t buf_size = parser->tmp_buf_size;
+
+ line_p = line = icalmemory_new_buffer(buf_size);
+ line[0] = '\0';
+
+ /* Read lines by calling line_gen_func and putting the data into
+ parser->temp. If the line is a continuation line ( begins with a
+ space after a newline ) then append the data onto line and read
+ again. Otherwise, exit the loop. */
+
+ while(1) {
+
+ /* The first part of the loop deals with the temp buffer,
+ which was read on he last pass through the loop. The
+ routine is split like this because it has to read lone line
+ ahead to determine if a line is a continuation line. */
+
+
+ /* The tmp buffer is not clear, so transfer the data in it to the
+ output. This may be left over from a previous call */
+ if (parser->temp[0] != '\0' ) {
+
+ /* If the last position in the temp buffer is occupied,
+ mark the buffer as full. The means we will do another
+ read later, because the line is not finished */
+ if (parser->temp[parser->tmp_buf_size-1] == 0 &&
+ parser->temp[parser->tmp_buf_size-2] != '\n'&&
+ parser->temp[parser->tmp_buf_size-2] != 0 ){
+ parser->buffer_full = 1;
+ } else {
+ parser->buffer_full = 0;
+ }
+
+ /* Copy the temp to the output and clear the temp buffer. */
+ if(parser->continuation_line==1){
+ /* back up the pointer to erase the continuation characters */
+ parser->continuation_line = 0;
+ line_p--;
+
+ if ( *(line_p-1) == '\r'){
+ line_p--;
+ }
+
+ /* copy one space up to eliminate the leading space*/
+ icalmemory_append_string(&line,&line_p,&buf_size,
+ parser->temp+1);
+
+ } else {
+ icalmemory_append_string(&line,&line_p,&buf_size,parser->temp);
+ }
+
+ parser->temp[0] = '\0' ;
+ }
+
+ parser->temp[parser->tmp_buf_size-1] = 1; /* Mark end of buffer */
+
+ /****** Here is where the routine gets string data ******************/
+ if ((*line_gen_func)(parser->temp,parser->tmp_buf_size,parser->line_gen_data)
+ ==0){/* Get more data */
+
+ /* If the first position is clear, it means we didn't get
+ any more data from the last call to line_ge_func*/
+ if (parser->temp[0] == '\0'){
+
+ if(line[0] != '\0'){
+ /* There is data in the output, so fall trhough and process it*/
+ break;
+ } else {
+ /* No data in output; return and signal that there
+ is no more input*/
+ free(line);
+ return 0;
+ }
+ }
+ }
+
+
+ /* If the output line ends in a '\n' and the temp buffer
+ begins with a ' ', then the buffer holds a continuation
+ line, so keep reading. */
+
+ if ( line_p > line+1 && *(line_p-1) == '\n'
+ && (parser->temp[0] == ' ' || parser->temp[0] == '\t') ) {
+
+ parser->continuation_line = 1;
+
+ } else if ( parser->buffer_full == 1 ) {
+
+ /* The buffer was filled on the last read, so read again */
+
+ } else {
+
+ /* Looks like the end of this content line, so break */
+ break;
+ }
+
+
+ }
+
+ /* Erase the final newline and/or carriage return*/
+ if ( line_p > line+1 && *(line_p-1) == '\n') {
+ *(line_p-1) = '\0';
+ if ( *(line_p-2) == '\r'){
+ *(line_p-2) = '\0';
+ }
+
+ } else {
+ *(line_p) = '\0';
+ }
+
+ while ( (*line_p == '\0' || iswspace(*line_p)) && line_p > line )
+ {
+ *line_p = '\0';
+ line_p--;
+ }
+
+ return line;
+
+}
+
+static void insert_error(icalcomponent* comp, const char* text,
+ const char* message, icalparameter_xlicerrortype type)
+{
+ char temp[1024];
+
+ if (text == 0){
+ snprintf(temp,1024,"%s:",message);
+ } else {
+ snprintf(temp,1024,"%s: %s",message,text);
+ }
+
+ icalcomponent_add_property
+ (comp,
+ icalproperty_vanew_xlicerror(
+ temp,
+ icalparameter_new_xlicerrortype(type),
+ 0));
+}
+
+
+static int line_is_blank(char* line){
+ int i=0;
+
+ for(i=0; *(line+i)!=0; i++){
+ char c = *(line+i);
+
+ if(c != ' ' && c != '\n' && c != '\t'){
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+icalcomponent* icalparser_parse(icalparser *parser,
+ char* (*line_gen_func)(char *s, size_t size,
+ void* d))
+{
+
+ char* line;
+ icalcomponent *c=0;
+ icalcomponent *root=0;
+ icalerrorstate es = icalerror_get_error_state(ICAL_MALFORMEDDATA_ERROR);
+ int cont;
+
+ icalerror_check_arg_rz((parser !=0),"parser");
+
+ icalerror_set_error_state(ICAL_MALFORMEDDATA_ERROR,ICAL_ERROR_NONFATAL);
+
+ do{
+ line = icalparser_get_line(parser, line_gen_func);
+
+ if ((c = icalparser_add_line(parser,line)) != 0){
+
+ if(icalcomponent_get_parent(c) !=0){
+ /* This is bad news... assert? */
+ }
+
+ assert(parser->root_component == 0);
+ assert(pvl_count(parser->components) ==0);
+
+ if (root == 0){
+ /* Just one component */
+ root = c;
+ } else if(icalcomponent_isa(root) != ICAL_XROOT_COMPONENT) {
+ /*Got a second component, so move the two components under
+ an XROOT container */
+ icalcomponent *tempc = icalcomponent_new(ICAL_XROOT_COMPONENT);
+ icalcomponent_add_component(tempc, root);
+ icalcomponent_add_component(tempc, c);
+ root = tempc;
+ } else if(icalcomponent_isa(root) == ICAL_XROOT_COMPONENT) {
+ /* Already have an XROOT container, so add the component
+ to it*/
+ icalcomponent_add_component(root, c);
+
+ } else {
+ /* Badness */
+ assert(0);
+ }
+
+ c = 0;
+
+ }
+ cont = 0;
+ if(line != 0){
+ free(line);
+ cont = 1;
+ }
+ } while ( cont );
+
+ icalerror_set_error_state(ICAL_MALFORMEDDATA_ERROR,es);
+
+ return root;
+
+}
+
+
+icalcomponent* icalparser_add_line(icalparser* parser,
+ char* line)
+{
+ char *str;
+ char *end;
+ int vcount = 0;
+ icalproperty *prop;
+ icalproperty_kind prop_kind;
+ icalvalue *value;
+ icalvalue_kind value_kind = ICAL_NO_VALUE;
+
+
+ icalerror_check_arg_rz((parser != 0),"parser");
+
+
+ if (line == 0)
+ {
+ parser->state = ICALPARSER_ERROR;
+ return 0;
+ }
+
+ if(line_is_blank(line) == 1){
+ return 0;
+ }
+
+ /* Begin by getting the property name at the start of the line. The
+ property name may end up being "BEGIN" or "END" in which case it
+ is not really a property, but the marker for the start or end of
+ a component */
+
+ end = 0;
+ str = icalparser_get_prop_name(line, &end);
+
+ if (str == 0 || strlen(str) == 0 ){
+ /* Could not get a property name */
+ icalcomponent *tail = pvl_data(pvl_tail(parser->components));
+
+ if (tail){
+ insert_error(tail,line,
+ "Got a data line, but could not find a property name or component begin tag",
+ ICAL_XLICERRORTYPE_COMPONENTPARSEERROR);
+ }
+ tail = 0;
+ parser->state = ICALPARSER_ERROR;
+ return 0;
+ }
+
+ /**********************************************************************
+ * Handle begin and end of components
+ **********************************************************************/
+ /* If the property name is BEGIN or END, we are actually
+ starting or ending a new component */
+
+
+ if(strcasecmp(str,"BEGIN") == 0){
+ icalcomponent *c;
+ icalcomponent_kind comp_kind;
+
+
+ parser->level++;
+ str = icalparser_get_next_value(end,&end, value_kind);
+
+
+ comp_kind = icalenum_string_to_component_kind(str);
+
+
+ if (comp_kind == ICAL_NO_COMPONENT){
+
+
+ c = icalcomponent_new(ICAL_XLICINVALID_COMPONENT);
+ insert_error(c,str,"Parse error in component name",
+ ICAL_XLICERRORTYPE_COMPONENTPARSEERROR);
+ }
+
+ c = icalcomponent_new(comp_kind);
+
+ if (c == 0){
+ c = icalcomponent_new(ICAL_XLICINVALID_COMPONENT);
+ insert_error(c,str,"Parse error in component name",
+ ICAL_XLICERRORTYPE_COMPONENTPARSEERROR);
+ }
+
+ pvl_push(parser->components,c);
+
+ parser->state = ICALPARSER_BEGIN_COMP;
+ return 0;
+
+ } else if (strcasecmp(str,"END") == 0 ) {
+ icalcomponent* tail;
+
+ parser->level--;
+ str = icalparser_get_next_value(end,&end, value_kind);
+
+ /* Pop last component off of list and add it to the second-to-last*/
+ parser->root_component = pvl_pop(parser->components);
+
+ tail = pvl_data(pvl_tail(parser->components));
+
+ if(tail != 0){
+ icalcomponent_add_component(tail,parser->root_component);
+ }
+
+ tail = 0;
+
+ /* Return the component if we are back to the 0th level */
+ if (parser->level == 0){
+ icalcomponent *rtrn;
+
+ if(pvl_count(parser->components) != 0){
+ /* There are still components on the stack -- this means
+ that one of them did not have a proper "END" */
+ pvl_push(parser->components,parser->root_component);
+ icalparser_clean(parser); /* may reset parser->root_component*/
+ }
+
+ assert(pvl_count(parser->components) == 0);
+
+ parser->state = ICALPARSER_SUCCESS;
+ rtrn = parser->root_component;
+ parser->root_component = 0;
+ return rtrn;
+
+ } else {
+ parser->state = ICALPARSER_END_COMP;
+ return 0;
+ }
+ }
+
+
+ /* There is no point in continuing if we have not seen a
+ component yet */
+
+ if(pvl_data(pvl_tail(parser->components)) == 0){
+ parser->state = ICALPARSER_ERROR;
+ return 0;
+ }
+
+
+ /**********************************************************************
+ * Handle property names
+ **********************************************************************/
+
+ /* At this point, the property name really is a property name,
+ (Not a component name) so make a new property and add it to
+ the component */
+
+
+ prop_kind = icalproperty_string_to_kind(str);
+
+ prop = icalproperty_new(prop_kind);
+
+ if (prop != 0){
+ icalcomponent *tail = pvl_data(pvl_tail(parser->components));
+
+ if(prop_kind==ICAL_X_PROPERTY){
+ icalproperty_set_x_name(prop,str);
+ }
+
+ icalcomponent_add_property(tail, prop);
+
+ /* Set the value kind for the default for this type of
+ property. This may be re-set by a VALUE parameter */
+ value_kind = icalproperty_kind_to_value_kind(icalproperty_isa(prop));
+
+ } else {
+ icalcomponent* tail = pvl_data(pvl_tail(parser->components));
+
+ insert_error(tail,str,"Parse error in property name",
+ ICAL_XLICERRORTYPE_PROPERTYPARSEERROR);
+
+ tail = 0;
+ parser->state = ICALPARSER_ERROR;
+ return 0;
+ }
+
+ /**********************************************************************
+ * Handle parameter values
+ **********************************************************************/
+
+ /* Now, add any parameters to the last property */
+
+ while(1) {
+
+ if (*(end-1) == ':'){
+ /* if the last separator was a ":" and the value is a
+ URL, icalparser_get_next_parameter will find the
+ ':' in the URL, so better break now. */
+ break;
+ }
+
+ str = icalparser_get_next_parameter(end,&end);
+
+ if (str != 0){
+ char* name;
+ char* pvalue;
+
+ icalparameter *param = 0;
+ icalparameter_kind kind;
+ icalcomponent *tail = pvl_data(pvl_tail(parser->components));
+
+ name = icalparser_get_param_name(str,&pvalue);
+
+ if (name == 0){
+ /* 'tail' defined above */
+ insert_error(tail, str, "Cant parse parameter name",
+ ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR);
+ tail = 0;
+ break;
+ }
+
+ kind = icalparameter_string_to_kind(name);
+
+ if(kind == ICAL_X_PARAMETER){
+ param = icalparameter_new(ICAL_X_PARAMETER);
+
+ if(param != 0){
+ icalparameter_set_xname(param,name);
+ icalparameter_set_xvalue(param,pvalue);
+ }
+
+
+ } else if (kind != ICAL_NO_PARAMETER){
+ param = icalparameter_new_from_value_string(kind,pvalue);
+ } else {
+ /* Error. Failed to parse the parameter*/
+ /* 'tail' defined above */
+ insert_error(tail, str, "Cant parse parameter name",
+ ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR);
+ tail = 0;
+ parser->state = ICALPARSER_ERROR;
+ return 0;
+ }
+
+ if (param == 0){
+ /* 'tail' defined above */
+ insert_error(tail,str,"Cant parse parameter value",
+ ICAL_XLICERRORTYPE_PARAMETERVALUEPARSEERROR);
+
+ tail = 0;
+ parser->state = ICALPARSER_ERROR;
+ continue;
+ }
+
+ /* If it is a VALUE parameter, set the kind of value*/
+ if (icalparameter_isa(param)==ICAL_VALUE_PARAMETER){
+
+ value_kind = (icalvalue_kind)
+ icalparameter_value_to_value_kind(
+ icalparameter_get_value(param)
+ );
+
+ if (value_kind == ICAL_NO_VALUE){
+
+ /* Ooops, could not parse the value of the
+ parameter ( it was not one of the defined
+ values ), so reset the value_kind */
+
+ insert_error(
+ tail, str,
+ "Got a VALUE parameter with an unknown type",
+ ICAL_XLICERRORTYPE_PARAMETERVALUEPARSEERROR);
+ icalparameter_free(param);
+
+ value_kind =
+ icalproperty_kind_to_value_kind(
+ icalproperty_isa(prop));
+
+ icalparameter_free(param);
+ tail = 0;
+ parser->state = ICALPARSER_ERROR;
+ return 0;
+ }
+ }
+
+ /* Everything is OK, so add the parameter */
+ icalproperty_add_parameter(prop,param);
+ tail = 0;
+
+ } else { /* if ( str != 0) */
+ /* If we did not get a param string, go on to looking
+ for a value */
+ break;
+ } /* if ( str != 0) */
+
+ } /* while(1) */
+
+ /**********************************************************************
+ * Handle values
+ **********************************************************************/
+
+ /* Look for values. If there are ',' characters in the values,
+ then there are multiple values, so clone the current
+ parameter and add one part of the value to each clone */
+
+ vcount=0;
+ while(1) {
+ str = icalparser_get_next_value(end,&end, value_kind);
+
+ if (str != 0){
+
+ if (vcount > 0){
+ /* Actually, only clone after the second value */
+ icalproperty* clone = icalproperty_new_clone(prop);
+ icalcomponent* tail = pvl_data(pvl_tail(parser->components));
+
+ icalcomponent_add_property(tail, clone);
+ prop = clone;
+ tail = 0;
+ }
+
+ value = icalvalue_new_from_string(value_kind, str);
+
+ /* Don't add properties without value */
+ if (value == 0){
+ char temp[200]; /* HACK */
+
+ icalproperty_kind prop_kind = icalproperty_isa(prop);
+ icalcomponent* tail = pvl_data(pvl_tail(parser->components));
+
+ snprintf(temp,sizeof(temp),"Can't parse as %s value in %s property. Removing entire property",
+ icalvalue_kind_to_string(value_kind),
+ icalproperty_kind_to_string(prop_kind));
+
+ insert_error(tail, str, temp,
+ ICAL_XLICERRORTYPE_VALUEPARSEERROR);
+
+ /* Remove the troublesome property */
+ icalcomponent_remove_property(tail,prop);
+ icalproperty_free(prop);
+ prop = 0;
+ tail = 0;
+ parser->state = ICALPARSER_ERROR;
+ return 0;
+
+ } else {
+ vcount++;
+ icalproperty_set_value(prop, value);
+ }
+
+
+ } else {
+ if (vcount == 0){
+ char temp[200]; /* HACK */
+
+ icalproperty_kind prop_kind = icalproperty_isa(prop);
+ icalcomponent *tail = pvl_data(pvl_tail(parser->components));
+
+ snprintf(temp,sizeof(temp),"No value for %s property. Removing entire property",
+ icalproperty_kind_to_string(prop_kind));
+
+ insert_error(tail, str, temp,
+ ICAL_XLICERRORTYPE_VALUEPARSEERROR);
+
+ /* Remove the troublesome property */
+ icalcomponent_remove_property(tail,prop);
+ icalproperty_free(prop);
+ prop = 0;
+ tail = 0;
+ parser->state = ICALPARSER_ERROR;
+ return 0;
+ } else {
+
+ break;
+ }
+ }
+ }
+
+ /****************************************************************
+ * End of component parsing.
+ *****************************************************************/
+
+ if (pvl_data(pvl_tail(parser->components)) == 0 &&
+ parser->level == 0){
+ /* HACK. Does this clause ever get executed? */
+ parser->state = ICALPARSER_SUCCESS;
+ assert(0);
+ return parser->root_component;
+ } else {
+ parser->state = ICALPARSER_IN_PROGRESS;
+ return 0;
+ }
+
+}
+
+icalparser_state icalparser_get_state(icalparser* parser)
+{
+ return parser->state;
+
+}
+
+icalcomponent* icalparser_clean(icalparser* parser)
+{
+ icalcomponent *tail;
+
+ icalerror_check_arg_rz((parser != 0 ),"parser");
+
+ /* We won't get a clean exit if some components did not have an
+ "END" tag. Clear off any component that may be left in the list */
+
+ while((tail=pvl_data(pvl_tail(parser->components))) != 0){
+
+ insert_error(tail," ",
+ "Missing END tag for this component. Closing component at end of input.",
+ ICAL_XLICERRORTYPE_COMPONENTPARSEERROR);
+
+
+ parser->root_component = pvl_pop(parser->components);
+ tail=pvl_data(pvl_tail(parser->components));
+
+ if(tail != 0 && parser->root_component != NULL){
+ if(icalcomponent_get_parent(parser->root_component)!=0){
+ icalerror_warn("icalparser_clean is trying to attach a component for the second time");
+ } else {
+ icalcomponent_add_component(tail,parser->root_component);
+ }
+ }
+
+ }
+
+ return parser->root_component;
+
+}
+
+struct slg_data {
+ const char* pos;
+ const char* str;
+};
+
+
+char* icalparser_string_line_generator(char *out, size_t buf_size, void *d)
+{
+ char *n;
+ size_t size;
+ struct slg_data* data = (struct slg_data*)d;
+
+ if(data->pos==0){
+ data->pos=data->str;
+ }
+
+ /* If the pointer is at the end of the string, we are done */
+ if (*(data->pos)==0){
+ return 0;
+ }
+
+ n = strchr(data->pos,'\n');
+
+ if (n == 0){
+ size = strlen(data->pos);
+ } else {
+ n++; /* include newline in output */
+ size = (n-data->pos);
+ }
+
+ if (size > buf_size-1){
+ size = buf_size-1;
+ }
+
+
+ strncpy(out,data->pos,size);
+
+ *(out+size) = '\0';
+
+ data->pos += size;
+
+ return out;
+}
+
+icalcomponent* icalparser_parse_string(const char* str)
+{
+ icalcomponent *c;
+ struct slg_data d;
+ icalparser *p;
+
+ icalerrorstate es = icalerror_get_error_state(ICAL_MALFORMEDDATA_ERROR);
+
+ d.pos = 0;
+ d.str = str;
+
+ p = icalparser_new();
+ icalparser_set_gen_data(p,&d);
+
+ icalerror_set_error_state(ICAL_MALFORMEDDATA_ERROR,ICAL_ERROR_NONFATAL);
+
+ c = icalparser_parse(p,icalparser_string_line_generator);
+
+ icalerror_set_error_state(ICAL_MALFORMEDDATA_ERROR,es);
+
+ icalparser_free(p);
+
+ return c;
+
+}
diff --git a/libkcal/libical/src/libical/icalparser.h b/libkcal/libical/src/libical/icalparser.h
new file mode 100644
index 00000000..914f9384
--- /dev/null
+++ b/libkcal/libical/src/libical/icalparser.h
@@ -0,0 +1,96 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalparser.h
+ CREATOR: eric 20 April 1999
+
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The original code is icalparser.h
+
+======================================================================*/
+
+
+#ifndef ICALPARSER_H
+#define ICALPARSER_H
+
+#include "icalenums.h"
+#include "icaltypes.h"
+#include"icalcomponent.h"
+
+#include <stdio.h> /* For FILE* */
+
+typedef struct icalparser_impl icalparser;
+
+
+/**
+ * @file icalparser.h
+ * @brief Line-oriented parsing.
+ *
+ * Create a new parser via icalparse_new_parser, then add lines one at
+ * a time with icalparse_add_line(). icalparser_add_line() will return
+ * non-zero when it has finished with a component.
+ */
+
+typedef enum icalparser_state {
+ ICALPARSER_ERROR,
+ ICALPARSER_SUCCESS,
+ ICALPARSER_BEGIN_COMP,
+ ICALPARSER_END_COMP,
+ ICALPARSER_IN_PROGRESS
+} icalparser_state;
+
+icalparser* icalparser_new(void);
+icalcomponent* icalparser_add_line(icalparser* parser, char* str );
+icalcomponent* icalparser_clean(icalparser* parser);
+icalparser_state icalparser_get_state(icalparser* parser);
+void icalparser_free(icalparser* parser);
+
+
+/**
+ * Message oriented parsing. icalparser_parse takes a string that
+ * holds the text ( in RFC 2445 format ) and returns a pointer to an
+ * icalcomponent. The caller owns the memory. line_gen_func is a
+ * pointer to a function that returns one content line per invocation
+ */
+
+icalcomponent* icalparser_parse(icalparser *parser,
+ char* (*line_gen_func)(char *s, size_t size, void *d));
+
+/**
+ Set the data that icalparser_parse will give to the line_gen_func
+ as the parameter 'd'
+ */
+void icalparser_set_gen_data(icalparser* parser, void* data);
+
+
+icalcomponent* icalparser_parse_string(const char* str);
+
+
+/***********************************************************************
+ * Parser support functions
+ ***********************************************************************/
+
+/** Use the flex/bison parser to turn a string into a value type */
+icalvalue* icalparser_parse_value(icalvalue_kind kind,
+ const char* str, icalcomponent** errors);
+
+/** Given a line generator function, return a single iCal content line.*/
+char* icalparser_get_line(icalparser* parser, char* (*line_gen_func)(char *s, size_t size, void *d));
+
+char* icalparser_string_line_generator(char *out, size_t buf_size, void *d);
+
+#endif /* !ICALPARSE_H */
diff --git a/libkcal/libical/src/libical/icalperiod.c b/libkcal/libical/src/libical/icalperiod.c
new file mode 100644
index 00000000..0429a2e6
--- /dev/null
+++ b/libkcal/libical/src/libical/icalperiod.c
@@ -0,0 +1,169 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icalperiod.c
+ CREATOR: eric 02 June 2000
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The Original Code is eric. The Initial Developer of the Original
+ Code is Eric Busboom
+
+
+ ======================================================================*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "icalperiod.h"
+
+#include <assert.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "icalerror.h"
+#include "icalmemory.h"
+
+
+
+
+struct icalperiodtype icalperiodtype_from_string (const char* str)
+{
+
+ struct icalperiodtype p, null_p;
+ char *s = icalmemory_strdup(str);
+ char *start, *end = s;
+ icalerrorstate es;
+
+ /* Errors are normally generated in the following code, so save
+ the error state for resoration later */
+
+ icalerrorenum e = icalerrno;
+
+ p.start = p.end = icaltime_null_time();
+ p.duration = icaldurationtype_from_int(0);
+
+ null_p = p;
+
+ if(s == 0) goto error;
+
+ start = s;
+ end = strchr(s, '/');
+
+ if(end == 0) goto error;
+
+ *end = 0;
+ end++;
+
+ p.start = icaltime_from_string(start);
+
+ if (icaltime_is_null_time(p.start)) goto error;
+
+ es = icalerror_get_error_state(ICAL_MALFORMEDDATA_ERROR);
+ icalerror_set_error_state(ICAL_MALFORMEDDATA_ERROR,ICAL_ERROR_NONFATAL);
+
+ p.end = icaltime_from_string(end);
+
+ icalerror_set_error_state(ICAL_MALFORMEDDATA_ERROR,es);
+
+
+ if (icaltime_is_null_time(p.end)){
+
+ p.duration = icaldurationtype_from_string(end);
+
+ if(icaldurationtype_as_int(p.duration) == 0) goto error;
+ }
+
+ icalerrno = e;
+
+ icalmemory_free_buffer(s);
+
+ return p;
+
+ error:
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+
+ if (s)
+ icalmemory_free_buffer (s);
+ return null_p;
+}
+
+
+const char* icalperiodtype_as_ical_string(struct icalperiodtype p)
+{
+
+ const char* start;
+ const char* end;
+
+ char *buf;
+ size_t buf_size = 40;
+ char* buf_ptr = 0;
+
+ buf = (char*)icalmemory_new_buffer(buf_size);
+ buf_ptr = buf;
+
+
+ start = icaltime_as_ical_string(p.start);
+
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, start);
+
+ if(!icaltime_is_null_time(p.end)){
+ end = icaltime_as_ical_string(p.end);
+ } else {
+ end = icaldurationtype_as_ical_string(p.duration);
+ }
+
+ icalmemory_append_char(&buf, &buf_ptr, &buf_size, '/');
+
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, end);
+
+ icalmemory_add_tmp_buffer(buf);
+
+ return buf;
+}
+
+
+
+struct icalperiodtype icalperiodtype_null_period(void) {
+ struct icalperiodtype p;
+ p.start = icaltime_null_time();
+ p.end = icaltime_null_time();
+ p.duration = icaldurationtype_null_duration();
+
+ return p;
+}
+int icalperiodtype_is_null_period(struct icalperiodtype p){
+
+ if(icaltime_is_null_time(p.start) &&
+ icaltime_is_null_time(p.end) &&
+ icaldurationtype_is_null_duration(p.duration)){
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+int icalperiodtype_is_valid_period(struct icalperiodtype p){
+ if(icaltime_is_valid_time(p.start) &&
+ (icaltime_is_valid_time(p.end) || icaltime_is_null_time(p.end)) )
+ {
+ return 1;
+ }
+
+ return 0;
+}
+
diff --git a/libkcal/libical/src/libical/icalperiod.h b/libkcal/libical/src/libical/icalperiod.h
new file mode 100644
index 00000000..af3040d6
--- /dev/null
+++ b/libkcal/libical/src/libical/icalperiod.h
@@ -0,0 +1,54 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalperiod.h
+ CREATOR: eric 26 Jan 2001
+
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The Original Code is eric. The Initial Developer of the Original
+ Code is Eric Busboom
+
+
+======================================================================*/
+
+#ifndef ICALPERIOD_H
+#define ICALPERIOD_H
+
+#include "icaltime.h"
+#include "icalduration.h"
+
+struct icalperiodtype
+{
+ struct icaltimetype start;
+ struct icaltimetype end;
+ struct icaldurationtype duration;
+};
+
+struct icalperiodtype icalperiodtype_from_string (const char* str);
+
+const char* icalperiodtype_as_ical_string(struct icalperiodtype p);
+
+struct icalperiodtype icalperiodtype_null_period(void);
+
+int icalperiodtype_is_null_period(struct icalperiodtype p);
+
+int icalperiodtype_is_valid_period(struct icalperiodtype p);
+
+#endif /* !ICALTIME_H */
+
+
+
diff --git a/libkcal/libical/src/libical/icalproperty.c b/libkcal/libical/src/libical/icalproperty.c
new file mode 100644
index 00000000..67c158eb
--- /dev/null
+++ b/libkcal/libical/src/libical/icalproperty.c
@@ -0,0 +1,998 @@
+/* -*- Mode: C -*- */
+
+/*======================================================================
+ FILE: icalproperty.c
+ CREATOR: eric 28 April 1999
+
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The original code is icalproperty.c
+
+======================================================================*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "icalproperty.h"
+#include "icalparameter.h"
+#include "icalcomponent.h"
+#include "pvl.h"
+#include "icalenums.h"
+#include "icalerror.h"
+#include "icalmemory.h"
+#include "icalparser.h"
+
+#include <string.h> /* For icalmemory_strdup, rindex */
+#include <assert.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <stdio.h> /* for printf */
+#include <stdarg.h> /* for va_list, va_start, etc. */
+
+#ifdef WIN32
+#define snprintf _snprintf
+#define strcasecmp stricmp
+#endif
+
+/* Private routines for icalproperty */
+void icalvalue_set_parent(icalvalue* value,
+ icalproperty* property);
+icalproperty* icalvalue_get_parent(icalvalue* value);
+
+void icalparameter_set_parent(icalparameter* param,
+ icalproperty* property);
+icalproperty* icalparameter_get_parent(icalparameter* value);
+
+
+void icalproperty_set_x_name(icalproperty* prop, const char* name);
+
+struct icalproperty_impl
+{
+ char id[5];
+ icalproperty_kind kind;
+ char* x_name;
+ pvl_list parameters;
+ pvl_elem parameter_iterator;
+ icalvalue* value;
+ icalcomponent *parent;
+};
+
+void icalproperty_add_parameters(icalproperty* prop, va_list args)
+{
+ void* vp;
+
+ while((vp = va_arg(args, void*)) != 0) {
+
+ if (icalvalue_isa_value(vp) != 0 ){
+ } else if (icalparameter_isa_parameter(vp) != 0 ){
+
+ icalproperty_add_parameter((icalproperty*)prop,
+ (icalparameter*)vp);
+ } else {
+ icalerror_set_errno(ICAL_BADARG_ERROR);
+ }
+
+ }
+}
+
+
+icalproperty*
+icalproperty_new_impl(icalproperty_kind kind)
+{
+ icalproperty* prop;
+
+ if (!icalproperty_kind_is_valid(kind))
+ return NULL;
+
+ if ( ( prop = (icalproperty*) malloc(sizeof(icalproperty))) == 0) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return 0;
+ }
+
+ strcpy(prop->id,"prop");
+
+ prop->kind = kind;
+ prop->parameters = pvl_newlist();
+ prop->parameter_iterator = 0;
+ prop->value = 0;
+ prop->x_name = 0;
+ prop->parent = 0;
+
+ return prop;
+}
+
+
+icalproperty*
+icalproperty_new (icalproperty_kind kind)
+{
+ if (kind == ICAL_NO_PROPERTY){
+ return 0;
+ }
+
+ return (icalproperty*)icalproperty_new_impl(kind);
+}
+
+
+icalproperty*
+icalproperty_new_clone(icalproperty* old)
+{
+ icalproperty *new = icalproperty_new_impl(old->kind);
+ pvl_elem p;
+
+ icalerror_check_arg_rz((old!=0),"old");
+ icalerror_check_arg_rz((new!=0),"new");
+
+ if (old->value !=0) {
+ new->value = icalvalue_new_clone(old->value);
+ }
+
+ if (old->x_name != 0) {
+
+ new->x_name = icalmemory_strdup(old->x_name);
+
+ if (new->x_name == 0) {
+ icalproperty_free(new);
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return 0;
+ }
+ }
+
+ for(p=pvl_head(old->parameters);p != 0; p = pvl_next(p)){
+ icalparameter *param = icalparameter_new_clone(pvl_data(p));
+
+ if (param == 0){
+ icalproperty_free(new);
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return 0;
+ }
+
+ pvl_push(new->parameters,param);
+
+ }
+
+ return new;
+
+}
+
+icalproperty* icalproperty_new_from_string(const char* str)
+{
+
+ size_t buf_size = 1024;
+ char* buf = icalmemory_new_buffer(buf_size);
+ char* buf_ptr = buf;
+ icalproperty *prop;
+ icalcomponent *comp;
+ int errors = 0;
+
+ icalerror_check_arg_rz( (str!=0),"str");
+
+ /* Is this a HACK or a crafty reuse of code? */
+
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, "BEGIN:VCALENDAR\n");
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, str);
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, "\n");
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, "END:VCALENDAR\n");
+
+ comp = icalparser_parse_string(buf);
+
+ if(comp == 0){
+ icalerror_set_errno(ICAL_PARSE_ERROR);
+ return 0;
+ }
+
+ errors = icalcomponent_count_errors(comp);
+
+ prop = icalcomponent_get_first_property(comp,ICAL_ANY_PROPERTY);
+
+ icalcomponent_remove_property(comp,prop);
+
+ icalcomponent_free(comp);
+ free(buf);
+
+ if(errors > 0){
+ icalproperty_free(prop);
+ return 0;
+ } else {
+ return prop;
+ }
+
+}
+
+void
+icalproperty_free (icalproperty* p)
+{
+ icalparameter* param;
+
+ icalerror_check_arg_rv((p!=0),"prop");
+
+#ifdef ICAL_FREE_ON_LIST_IS_ERROR
+ icalerror_assert( (p->parent ==0),"Tried to free a property that is still attached to a component. ");
+
+#else
+ if(p->parent !=0){
+ return;
+ }
+#endif
+
+ if (p->value != 0){
+ icalvalue_set_parent(p->value,0);
+ icalvalue_free(p->value);
+ }
+
+ while( (param = pvl_pop(p->parameters)) != 0){
+ icalparameter_free(param);
+ }
+
+ pvl_free(p->parameters);
+
+ if (p->x_name != 0) {
+ free(p->x_name);
+ }
+
+ p->kind = ICAL_NO_PROPERTY;
+ p->parameters = 0;
+ p->parameter_iterator = 0;
+ p->value = 0;
+ p->x_name = 0;
+ p->id[0] = 'X';
+
+ free(p);
+
+}
+
+
+/* This returns where the start of the next line should be. chars_left does
+ not include the trailing '\0'. */
+#define MAX_LINE_LEN 75
+/*#define MAX_LINE_LEN 120*/
+
+static char*
+get_next_line_start (char *line_start, int chars_left)
+{
+ char *pos;
+
+ /* If we have 74 chars or less left, we can output all of them.
+ we return a pointer to the '\0' at the end of the string. */
+ if (chars_left < MAX_LINE_LEN) {
+ return line_start + chars_left;
+ }
+
+ /* Now we jump to the last possible character of the line, and step back
+ trying to find a ';' ':' or ' '. If we find one, we return the character
+ after it. */
+ pos = line_start + MAX_LINE_LEN - 2;
+ while (pos > line_start) {
+ if (*pos == ';' || *pos == ':' || *pos == ' ') {
+ return pos + 1;
+ }
+ pos--;
+ }
+ /* Now try to split on a UTF-8 boundary defined as a 7-bit
+ value or as a byte with the two high-most bits set:
+ 11xxxxxx. See http://czyborra.com/utf/ */
+
+ pos = line_start + MAX_LINE_LEN - 1;
+ while (pos > line_start) {
+ /* plain ascii */
+ if ((*pos & 128) == 0)
+ return pos;
+
+ /* utf8 escape byte */
+ if ((*pos & 192) == 192)
+ return pos;
+
+ pos--;
+ }
+
+ /* Give up, just break at 74 chars (the 75th char is the space at
+ the start of the line). */
+
+ return line_start + MAX_LINE_LEN - 1;
+}
+
+
+/** This splits the property into lines less than 75 octects long (as
+ * specified in RFC2445). It tries to split after a ';' if it can.
+ * It returns a tmp buffer. NOTE: I'm not sure if it matters if we
+ * split a line in the middle of a UTF-8 character. It probably won't
+ * look nice in a text editor.
+ */
+static char*
+fold_property_line (char *text)
+{
+ size_t buf_size;
+ char *buf, *buf_ptr, *line_start, *next_line_start, *out_buf;
+ int len, chars_left, first_line;
+ char ch;
+
+ /* Start with a buffer twice the size of our property line, so we almost
+ certainly won't overflow it. */
+ len = strlen (text);
+ buf_size = len * 2;
+ buf = icalmemory_new_buffer (buf_size);
+ buf_ptr = buf;
+
+ /* Step through the text, finding each line to add to the output. */
+ line_start = text;
+ chars_left = len;
+ first_line = 1;
+ for (;;) {
+ if (chars_left <= 0)
+ break;
+
+ /* This returns the first character for the next line. */
+ next_line_start = get_next_line_start (line_start, chars_left);
+
+ /* If this isn't the first line, we need to output a newline and space
+ first. */
+ if (!first_line) {
+ icalmemory_append_string (&buf, &buf_ptr, &buf_size, "\r\n ");
+ }
+ first_line = 0;
+
+ /* This adds the line to our tmp buffer. We temporarily place a '\0'
+ in text, so we can copy the line in one go. */
+ ch = *next_line_start;
+ *next_line_start = '\0';
+ icalmemory_append_string (&buf, &buf_ptr, &buf_size, line_start);
+ *next_line_start = ch;
+
+ /* Now we move on to the next line. */
+ chars_left -= (next_line_start - line_start);
+ line_start = next_line_start;
+ }
+
+ /* Copy it to a temporary buffer, and then free it. */
+ out_buf = icalmemory_tmp_buffer (strlen (buf) + 1);
+ strcpy (out_buf, buf);
+ icalmemory_free_buffer (buf);
+
+ return out_buf;
+}
+
+
+/* Determine what VALUE parameter to include. The VALUE parameters
+ are ignored in the normal parameter printing ( the block after
+ this one, so we need to do it here */
+static const char *
+icalproperty_get_value_kind(icalproperty *prop)
+{
+ const char* kind_string = 0;
+
+ icalparameter *orig_val_param
+ = icalproperty_get_first_parameter(prop,ICAL_VALUE_PARAMETER);
+
+ icalvalue *value = icalproperty_get_value(prop);
+
+ icalvalue_kind orig_kind = ICAL_NO_VALUE;
+
+ icalvalue_kind this_kind = ICAL_NO_VALUE;
+
+ icalvalue_kind default_kind
+ = icalproperty_kind_to_value_kind(prop->kind);
+
+ if(orig_val_param){
+ orig_kind = icalparameter_value_to_value_kind( icalparameter_get_value(orig_val_param) );
+ }
+
+ if(value != 0){
+ this_kind = icalvalue_isa(value);
+ }
+
+ if ( orig_kind != ICAL_NO_VALUE ) {
+ kind_string = icalvalue_kind_to_string( orig_kind );
+ } else if(this_kind == default_kind &&
+ orig_kind != ICAL_NO_VALUE){
+ /* The kind is the default, so it does not need to be
+ included, but do it anyway, since it was explicit in
+ the property. But, use the default, not the one
+ specified in the property */
+
+ kind_string = icalvalue_kind_to_string(default_kind);
+
+ } else if (this_kind != default_kind && this_kind != ICAL_NO_VALUE){
+ /* Not the default, so it must be specified */
+ kind_string = icalvalue_kind_to_string(this_kind);
+ } else {
+ /* Don'tinclude the VALUE parameter at all */
+ }
+
+ return kind_string;
+}
+
+const char*
+icalproperty_as_ical_string (icalproperty* prop)
+{
+ icalparameter *param;
+
+ /* Create new buffer that we can append names, parameters and a
+ value to, and reallocate as needed. Later, this buffer will be
+ copied to a icalmemory_tmp_buffer, which is managed internally
+ by libical, so it can be given to the caller without fear of
+ the caller forgetting to free it */
+
+ const char* property_name = 0;
+ size_t buf_size = 1024;
+ char* buf = icalmemory_new_buffer(buf_size);
+ char* buf_ptr = buf;
+ icalvalue* value;
+ char *out_buf;
+ const char* kind_string = 0;
+
+ char newline[] = "\r\n";
+
+
+ icalerror_check_arg_rz( (prop!=0),"prop");
+
+
+ /* Append property name */
+
+ if (prop->kind == ICAL_X_PROPERTY && prop->x_name != 0){
+ property_name = prop->x_name;
+ } else {
+ property_name = icalproperty_kind_to_string(prop->kind);
+ }
+
+ if (property_name == 0 ) {
+ icalerror_warn("Got a property of an unknown kind.");
+ icalmemory_free_buffer(buf);
+ return 0;
+
+ }
+
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, property_name);
+
+ kind_string = icalproperty_get_value_kind(prop);
+ if(kind_string!=0){
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, ";VALUE=");
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, kind_string);
+ }
+
+ /* Append parameters */
+ for(param = icalproperty_get_first_parameter(prop,ICAL_ANY_PARAMETER);
+ param != 0;
+ param = icalproperty_get_next_parameter(prop,ICAL_ANY_PARAMETER)) {
+
+ icalparameter_kind kind = icalparameter_isa(param);
+ kind_string = icalparameter_as_ical_string(param);
+
+ if(kind==ICAL_VALUE_PARAMETER){
+ continue;
+ }
+
+ if (kind_string == 0 ) {
+ icalerror_warn("Got a parameter of unknown kind for the following property");
+
+ icalerror_warn((property_name) ? property_name : "(NULL)");
+ continue;
+ }
+
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, ";");
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, kind_string);
+ }
+
+ /* Append value */
+
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, ":");
+
+ value = icalproperty_get_value(prop);
+
+ if (value != 0){
+ const char *str = icalvalue_as_ical_string(value);
+ icalerror_assert((str !=0),"Could not get string representation of a value");
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, str);
+ } else {
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size,"ERROR: No Value");
+
+ }
+
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, newline);
+
+ /* Now, copy the buffer to a tmp_buffer, which is safe to give to
+ the caller without worring about de-allocating it. */
+
+ /* We now use a function to fold the line properly every 75 characters. */
+ out_buf = fold_property_line (buf);
+
+ icalmemory_free_buffer(buf);
+
+ return out_buf;
+}
+
+
+
+icalproperty_kind
+icalproperty_isa (icalproperty* p)
+{
+ if(p != 0){
+ return p->kind;
+ }
+
+ return ICAL_NO_PROPERTY;
+}
+
+int
+icalproperty_isa_property (void* property)
+{
+ icalproperty *impl = (icalproperty *) property;
+
+ icalerror_check_arg_rz( (property!=0), "property");
+ if (strcmp(impl->id,"prop") == 0) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+
+void
+icalproperty_add_parameter (icalproperty* p,icalparameter* parameter)
+{
+ icalerror_check_arg_rv( (p!=0),"prop");
+ icalerror_check_arg_rv( (parameter!=0),"parameter");
+
+ pvl_push(p->parameters, parameter);
+
+}
+
+void
+icalproperty_set_parameter (icalproperty* prop,icalparameter* parameter)
+{
+ icalparameter_kind kind;
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+ icalerror_check_arg_rv( (parameter!=0),"parameter");
+
+ kind = icalparameter_isa(parameter);
+ if (kind != ICAL_X_PARAMETER)
+ icalproperty_remove_parameter_by_kind(prop,kind);
+ else
+ icalproperty_remove_parameter_by_name(prop,
+ icalparameter_get_xname(parameter));
+
+ icalproperty_add_parameter(prop,parameter);
+}
+
+void icalproperty_set_parameter_from_string(icalproperty* prop,
+ const char* name, const char* value)
+{
+
+ icalparameter_kind kind;
+ icalparameter *param;
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+ icalerror_check_arg_rv( (name!=0),"name");
+ icalerror_check_arg_rv( (value!=0),"value");
+
+ kind = icalparameter_string_to_kind(name);
+
+ if(kind == ICAL_NO_PARAMETER){
+ icalerror_set_errno(ICAL_BADARG_ERROR);
+ return;
+ }
+
+ param = icalparameter_new_from_value_string(kind,value);
+
+ if (param == 0){
+ icalerror_set_errno(ICAL_BADARG_ERROR);
+ return;
+ }
+
+ if(kind == ICAL_X_PARAMETER){
+ icalparameter_set_xname(param, name);
+ }
+
+ icalproperty_set_parameter(prop,param);
+
+}
+
+const char* icalproperty_get_parameter_as_string(icalproperty* prop,
+ const char* name)
+{
+ icalparameter_kind kind;
+ icalparameter *param;
+ char* str;
+ char* pv;
+
+ icalerror_check_arg_rz( (prop!=0),"prop");
+ icalerror_check_arg_rz( (name!=0),"name");
+
+ kind = icalparameter_string_to_kind(name);
+
+ if(kind == ICAL_NO_PARAMETER){
+ /* icalenum_string_to_parameter_kind will set icalerrno */
+ return 0;
+ }
+
+ for(param = icalproperty_get_first_parameter(prop,kind);
+ param != 0;
+ param = icalproperty_get_next_parameter(prop,kind)) {
+ if (kind != ICAL_X_PARAMETER) {
+ break;
+ }
+
+ if (strcmp(icalparameter_get_xname(param),name)==0) {
+ break;
+ }
+ }
+
+ if (param == 0){
+ return 0;
+ }
+
+
+ str = icalparameter_as_ical_string(param);
+
+ pv = strchr(str,'=');
+
+ if(pv == 0){
+ icalerror_set_errno(ICAL_INTERNAL_ERROR);
+ return 0;
+ }
+
+ return pv+1;
+
+}
+
+/** @see icalproperty_remove_parameter_by_kind()
+ *
+ * @deprecated Please use icalproperty_remove_parameter_by_kind()
+ * instead.
+ */
+
+void
+icalproperty_remove_parameter(icalproperty* prop, icalparameter_kind kind)
+{
+ icalproperty_remove_parameter_by_kind(prop, kind);
+}
+
+
+/** @brief Remove all parameters with the specified kind.
+ *
+ * @param prop A valid icalproperty.
+ * @param kind The kind to remove (ex. ICAL_TZID_PARAMETER)
+ *
+ * See icalproperty_remove_parameter_by_name() and
+ * icalproperty_remove_parameter_by_ref() for alternate ways of
+ * removing parameters
+ */
+
+void
+icalproperty_remove_parameter_by_kind(icalproperty* prop, icalparameter_kind kind)
+{
+ pvl_elem p;
+
+ icalerror_check_arg_rv((prop!=0),"prop");
+
+ for(p=pvl_head(prop->parameters);p != 0; p = pvl_next(p)){
+ icalparameter* param = (icalparameter *)pvl_data (p);
+ if (icalparameter_isa(param) == kind) {
+ pvl_remove (prop->parameters, p);
+ icalparameter_free(param);
+ break;
+ }
+ }
+}
+
+
+/** @brief Remove all parameters with the specified name.
+ *
+ * @param prop A valid icalproperty.
+ * @param name The name of the parameter to remove
+ *
+ * This function removes parameters with the given name. The name
+ * corresponds to either a built-in name (TZID, etc.) or the name of
+ * an extended parameter (X-FOO)
+ *
+ * See icalproperty_remove_parameter_by_kind() and
+ * icalproperty_remove_parameter_by_ref() for alternate ways of removing
+ * parameters
+ */
+
+
+void
+icalproperty_remove_parameter_by_name(icalproperty* prop, const char *name)
+{
+ pvl_elem p;
+
+ icalerror_check_arg_rv((prop!=0),"prop");
+
+ for(p=pvl_head(prop->parameters);p != 0; p = pvl_next(p)){
+ icalparameter* param = (icalparameter *)pvl_data (p);
+ const char * kind_string;
+
+ if (icalparameter_isa(param) == ICAL_X_PARAMETER)
+ kind_string = icalparameter_get_xname(param);
+ else
+ kind_string = icalparameter_kind_to_string(icalparameter_isa(param));
+
+ if (!kind_string)
+ continue;
+
+ if (0 == strcmp(kind_string, name)) {
+ pvl_remove (prop->parameters, p);
+ break;
+ }
+ }
+}
+
+
+/** @brief Remove the specified parameter reference from the property.
+ *
+ * @param prop A valid icalproperty.
+ * @param parameter A reference to a specific icalparameter.
+ *
+ * This function removes the specified parameter reference from the
+ * property.
+ */
+
+void
+icalproperty_remove_parameter_by_ref(icalproperty* prop, icalparameter* parameter)
+{
+ pvl_elem p;
+ icalparameter_kind kind;
+ const char *name;
+
+ icalerror_check_arg_rv((prop!=0),"prop");
+ icalerror_check_arg_rv((parameter!=0),"parameter");
+
+ kind = icalparameter_isa(parameter);
+ name = icalparameter_get_xname(parameter);
+
+ /*
+ * FIXME If it's an X- parameter, also compare the names. It would be nice
+ * to have a better abstraction like icalparameter_equals()
+ */
+ for(p=pvl_head(prop->parameters);p != 0; p = pvl_next(p)){
+ icalparameter* p_param = (icalparameter *)pvl_data (p);
+ if (icalparameter_isa(p_param) == kind &&
+ (kind != ICAL_X_PARAMETER ||
+ !strcmp(icalparameter_get_xname(p_param), name))) {
+ pvl_remove (prop->parameters, p);
+ icalparameter_free(p_param);
+ break;
+ }
+ }
+}
+
+
+int
+icalproperty_count_parameters (const icalproperty* prop)
+{
+ if(prop != 0){
+ return pvl_count(prop->parameters);
+ }
+
+ icalerror_set_errno(ICAL_USAGE_ERROR);
+ return -1;
+}
+
+
+icalparameter*
+icalproperty_get_first_parameter(icalproperty* p, icalparameter_kind kind)
+{
+ icalerror_check_arg_rz( (p!=0),"prop");
+
+ p->parameter_iterator = pvl_head(p->parameters);
+
+ if (p->parameter_iterator == 0) {
+ return 0;
+ }
+
+ for( p->parameter_iterator = pvl_head(p->parameters);
+ p->parameter_iterator !=0;
+ p->parameter_iterator = pvl_next(p->parameter_iterator)){
+
+ icalparameter *param = (icalparameter*)pvl_data(p->parameter_iterator);
+
+ if(icalparameter_isa(param) == kind || kind == ICAL_ANY_PARAMETER){
+ return param;
+ }
+ }
+
+ return 0;
+}
+
+
+icalparameter*
+icalproperty_get_next_parameter (icalproperty* p, icalparameter_kind kind)
+{
+ icalerror_check_arg_rz( (p!=0),"prop");
+
+ if (p->parameter_iterator == 0) {
+ return 0;
+ }
+
+ for( p->parameter_iterator = pvl_next(p->parameter_iterator);
+ p->parameter_iterator !=0;
+ p->parameter_iterator = pvl_next(p->parameter_iterator)){
+
+ icalparameter *param = (icalparameter*)pvl_data(p->parameter_iterator);
+
+ if(icalparameter_isa(param) == kind || kind == ICAL_ANY_PARAMETER){
+ return param;
+ }
+ }
+
+ return 0;
+
+}
+
+void
+icalproperty_set_value (icalproperty* p, icalvalue* value)
+{
+ icalerror_check_arg_rv((p !=0),"prop");
+ icalerror_check_arg_rv((value !=0),"value");
+
+ if (p->value != 0){
+ icalvalue_set_parent(p->value,0);
+ icalvalue_free(p->value);
+ p->value = 0;
+ }
+
+ p->value = value;
+
+ icalvalue_set_parent(value,p);
+}
+
+
+void icalproperty_set_value_from_string(icalproperty* prop,const char* str,
+ const char* type)
+{
+ icalvalue *oval,*nval;
+ icalvalue_kind kind = ICAL_NO_VALUE;
+
+ icalerror_check_arg_rv( (prop!=0),"prop");
+ icalerror_check_arg_rv( (str!=0),"str");
+ icalerror_check_arg_rv( (type!=0),"type");
+
+ if(strcmp(type,"NO")==0){
+ /* Get the type from the value the property already has, if it exists */
+ oval = icalproperty_get_value(prop);
+ if(oval != 0){
+ /* Use the existing value kind */
+ kind = icalvalue_isa(oval);
+ } else {
+ /* Use the default kind for the property */
+ kind = icalproperty_kind_to_value_kind(icalproperty_isa(prop));
+ }
+ } else {
+ /* Use the given kind string */
+ kind = icalvalue_string_to_kind(type);
+ }
+
+ if(kind == ICAL_NO_VALUE){
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return;
+ }
+
+ nval = icalvalue_new_from_string(kind, str);
+
+ if(nval == 0){
+ /* icalvalue_new_from_string sets errno */
+ assert(icalerrno != ICAL_NO_ERROR);
+ return;
+ }
+
+ icalproperty_set_value(prop,nval);
+
+
+}
+
+icalvalue*
+icalproperty_get_value(const icalproperty* prop)
+{
+ icalerror_check_arg_rz( (prop!=0),"prop");
+
+ return prop->value;
+}
+
+const char* icalproperty_get_value_as_string(const icalproperty* prop)
+{
+ icalvalue *value;
+
+ icalerror_check_arg_rz( (prop!=0),"prop");
+
+ value = prop->value;
+
+ return icalvalue_as_ical_string(value);
+}
+
+
+void icalproperty_set_x_name(icalproperty* prop, const char* name)
+{
+ icalerror_check_arg_rv( (name!=0),"name");
+ icalerror_check_arg_rv( (prop!=0),"prop");
+
+ if (prop->x_name != 0) {
+ free(prop->x_name);
+ }
+
+ prop->x_name = icalmemory_strdup(name);
+
+ if(prop->x_name == 0){
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ }
+
+}
+
+const char* icalproperty_get_x_name(icalproperty* prop){
+ icalerror_check_arg_rz( (prop!=0),"prop");
+
+ return prop->x_name;
+}
+
+
+const char* icalproperty_get_name(const icalproperty* prop)
+{
+#ifndef NO_WARN_DEPRECATED
+ icalerror_warn("icalproperty_get_name() is DEPRECATED, please use icalproperty_get_property_name() instead.");
+#endif
+ return icalproperty_get_property_name(prop);
+}
+
+const char* icalproperty_get_property_name(const icalproperty* prop)
+{
+
+ const char* property_name = 0;
+ size_t buf_size = 256;
+ char* buf = icalmemory_new_buffer(buf_size);
+ char* buf_ptr = buf;
+
+ icalerror_check_arg_rz( (prop!=0),"prop");
+
+ if (prop->kind == ICAL_X_PROPERTY && prop->x_name != 0){
+ property_name = prop->x_name;
+ } else {
+ property_name = icalproperty_kind_to_string(prop->kind);
+ }
+
+ if (property_name == 0 ) {
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return 0;
+
+ } else {
+ /* _append_string will automatically grow the buffer if
+ property_name is longer than the initial buffer size */
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, property_name);
+ }
+
+ /* Add the buffer to the temporary buffer ring -- the caller will
+ not have to free the memory. */
+ icalmemory_add_tmp_buffer(buf);
+
+ return buf;
+}
+
+
+
+
+void icalproperty_set_parent(icalproperty* property,
+ icalcomponent* component)
+{
+ icalerror_check_arg_rv( (property!=0),"property");
+
+ property->parent = component;
+}
+
+icalcomponent* icalproperty_get_parent(const icalproperty* property)
+{
+ icalerror_check_arg_rz( (property!=0),"property");
+
+ return property->parent;
+}
diff --git a/libkcal/libical/src/libical/icalproperty.h b/libkcal/libical/src/libical/icalproperty.h
new file mode 100644
index 00000000..b7db3316
--- /dev/null
+++ b/libkcal/libical/src/libical/icalproperty.h
@@ -0,0 +1,133 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalproperty.h
+ CREATOR: eric 20 March 1999
+
+
+
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The original code is icalparam.h
+
+ ======================================================================*/
+
+
+#ifndef ICALPROPERTY_H
+#define ICALPROPERTY_H
+
+#include <time.h>
+#include <stdarg.h> /* for va_... */
+
+#include "icalderivedparameter.h"
+
+#include "icalvalue.h"
+#include "icalrecur.h"
+
+/* Actually in icalderivedproperty.h:
+ typedef struct icalproperty_impl icalproperty; */
+
+#include "icalderivedproperty.h" /* To get icalproperty_kind enumerations */
+
+icalproperty* icalproperty_new(icalproperty_kind kind);
+
+icalproperty* icalproperty_new_clone(icalproperty * prop);
+
+icalproperty* icalproperty_new_from_string(const char* str);
+
+const char* icalproperty_as_ical_string(icalproperty* prop);
+
+void icalproperty_free(icalproperty* prop);
+
+icalproperty_kind icalproperty_isa(icalproperty* property);
+int icalproperty_isa_property(void* property);
+
+void icalproperty_add_parameters(struct icalproperty_impl *prop,va_list args);
+void icalproperty_add_parameter(icalproperty* prop,icalparameter* parameter);
+void icalproperty_set_parameter(icalproperty* prop,icalparameter* parameter);
+void icalproperty_set_parameter_from_string(icalproperty* prop,
+ const char* name, const char* value);
+const char* icalproperty_get_parameter_as_string(icalproperty* prop,
+ const char* name);
+
+void icalproperty_remove_parameter(icalproperty* prop,
+ icalparameter_kind kind);
+
+void icalproperty_remove_parameter_by_kind(icalproperty* prop,
+ icalparameter_kind kind);
+
+void icalproperty_remove_parameter_by_name(icalproperty* prop,
+ const char *name);
+
+void icalproperty_remove_parameter_by_ref(icalproperty* prop,
+ icalparameter *param);
+
+
+
+int icalproperty_count_parameters(const icalproperty* prop);
+
+/* Iterate through the parameters */
+icalparameter* icalproperty_get_first_parameter(icalproperty* prop,
+ icalparameter_kind kind);
+icalparameter* icalproperty_get_next_parameter(icalproperty* prop,
+ icalparameter_kind kind);
+/* Access the value of the property */
+void icalproperty_set_value(icalproperty* prop, icalvalue* value);
+void icalproperty_set_value_from_string(icalproperty* prop,const char* value, const char* kind);
+
+icalvalue* icalproperty_get_value(const icalproperty* prop);
+const char* icalproperty_get_value_as_string(const icalproperty* prop);
+
+/* Deal with X properties */
+
+void icalproperty_set_x_name(icalproperty* prop, const char* name);
+const char* icalproperty_get_x_name(icalproperty* prop);
+
+/** Return the name of the property -- the type name converted to a
+ * string, or the value of _get_x_name if the type is and X
+ * property
+ */
+const char* icalproperty_get_property_name (const icalproperty* prop);
+
+icalvalue_kind icalparameter_value_to_value_kind(icalparameter_value value);
+
+/* Convert kinds to string and get default value type */
+
+icalvalue_kind icalproperty_kind_to_value_kind(icalproperty_kind kind);
+icalproperty_kind icalproperty_value_kind_to_kind(icalvalue_kind kind);
+const char* icalproperty_kind_to_string(icalproperty_kind kind);
+icalproperty_kind icalproperty_string_to_kind(const char* string);
+
+/** Check validity of a specific icalproperty_kind **/
+int icalproperty_kind_is_valid(const icalproperty_kind kind);
+
+icalproperty_method icalproperty_string_to_method(const char* str);
+const char* icalproperty_method_to_string(icalproperty_method method);
+
+
+const char* icalproperty_enum_to_string(int e);
+int icalproperty_string_to_enum(const char* str);
+int icalproperty_kind_and_string_to_enum(const int kind, const char* str);
+
+const char* icalproperty_status_to_string(icalproperty_status);
+icalproperty_status icalproperty_string_to_status(const char* string);
+
+int icalproperty_enum_belongs_to_property(icalproperty_kind kind, int e);
+
+
+
+
+#endif /*ICALPROPERTY_H*/
diff --git a/libkcal/libical/src/libical/icalrecur.c b/libkcal/libical/src/libical/icalrecur.c
new file mode 100644
index 00000000..acd2ccce
--- /dev/null
+++ b/libkcal/libical/src/libical/icalrecur.c
@@ -0,0 +1,2400 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icalrecur.c
+ CREATOR: eric 16 May 2000
+
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ 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/
+*/
+
+/**
+ @file icalrecur.c
+ @brief Implementation of routines for dealing with recurring time
+
+ How this code works:
+
+ Processing starts when the caller generates a new recurrence
+ iterator via icalrecur_iterator_new(). This routine copies the
+ recurrence rule into the iterator and extracts things like start and
+ end dates. Then, it checks if the rule is legal, using some logic
+ from RFC2445 and some logic that probably should be in RFC2445.
+
+ Then, icalrecur_iterator_new() re-writes some of the BY*
+ arrays. This involves ( via a call to setup_defaults() ) :
+
+ 1) For BY rule parts with no data ( ie BYSECOND was not specified )
+ copy the corresponding time part from DTSTART into the BY array. (
+ So impl->by_ptrs[BY_SECOND] will then have one element if is
+ originally had none ) This only happens if the BY* rule part data
+ would expand the number of occurrences in the occurrence set. This
+ lets the code ignore DTSTART later on and still use it to get the
+ time parts that were not specified in any other way.
+
+ 2) For the by rule part that are not the same interval as the
+ frequency -- for HOURLY anything but BYHOUR, for instance -- copy the
+ first data element from the rule part into the first occurrence. For
+ example, for "INTERVAL=MONTHLY and BYHOUR=10,30", initialize the
+ first time to be returned to have an hour of 10.
+
+ Finally, for INTERVAL=YEARLY, the routine expands the rule to get
+ all of the days specified in the rule. The code will do this for
+ each new year, and this is the first expansion. This is a special
+ case for the yearly interval; no other frequency gets expanded this
+ way. The yearly interval is the most complex, so some special
+ processing is required.
+
+ After creating a new iterator, the caller will make successive calls
+ to icalrecur_iterator_next() to get the next time specified by the
+ rule. The main part of this routine is a switch on the frequency of
+ the rule. Each different frequency is handled by a different
+ routine.
+
+ For example, next_hour handles the case of INTERVAL=HOURLY, and it
+ is called by other routines to get the next hour. First, the routine
+ tries to get the next minute part of a time with a call to
+ next_minute(). If next_minute() returns 1, it has reached the end of
+ its data, usually the last element of the BYMINUTE array. Then, if
+ there is data in the BYHOUR array, the routine changes the hour to
+ the next one in the array. If INTERVAL=HOURLY, the routine advances
+ the hour by the interval.
+
+ If the routine used the last hour in the BYHOUR array, and the
+ INTERVAL=HOURLY, then the routine calls increment_monthday() to set
+ the next month day. The increment_* routines may call higher routine
+ to increment the month or year also.
+
+ The code for INTERVAL=DAILY is handled by next_day(). First, the
+ routine tries to get the next hour part of a time with a call to
+ next_hour. If next_hour() returns 1, it has reached the end of its
+ data, usually the last element of the BYHOUR array. This means that
+ next_day() should increment the time to the next day. If FREQUENCY==DAILY,
+ the routine increments the day by the interval; otherwise, it
+ increments the day by 1.
+
+ Next_day() differs from next_hour because it does not use the BYDAY
+ array to select an appropriate day. Instead, it returns every day (
+ incrementing by 1 if the frequency is not DAILY with INTERVAL!=1)
+ Any days that are not specified in an non-empty BYDAY array are
+ filtered out later.
+
+ Generally, the flow of these routine is for a next_* call a next_*
+ routine of a lower interval ( next_day calls next_hour) and then to
+ possibly call an increment_* routine of an equal or higher
+ interval. ( next_day calls increment_monthday() )
+
+ When the call to the original next_* routine returns,
+ icalrecur_iterator_next() will check the returned data against other
+ BYrule parts to determine if is should be excluded by calling
+ check_contracting_rules. Generally, a contracting rule is any with a
+ larger time span than the interval. For instance, if
+ INTERVAL=DAILY, BYMONTH is a contracting rule part.
+
+ Check_contracting_rules() uses icalrecur_check_rulepart() to do its
+ work. icalrecur_check_rulepart() uses expand_map[] to determine if a rule
+ is contracting, and if it is, and if the BY rule part has some data,
+ then the routine checks if the value of a component of the time is
+ part of the byrule part. For instance, for "INTERVAL=DAILY;
+ BYMONTH=6,10", icalrecur_check_rulepart() would check that the time value
+ given to it has a month of either 6 or 10.
+
+ Finally, icalrecur_iterator_next() does a few other checks on the
+ time value, and if it passes, it returns the time.
+
+ A note about the end_of_data flag. The flag indicates that the
+ routine is at the end of its data -- the last BY rule if the routine
+ is using by rules, or the last day of the week/month/year/etc if
+ not.
+
+ This flag is usually set early in a next_* routine and returned in
+ the end. The way it is used allows the next_* routine to set the
+ last time back to the first element in a BYxx rule, and then signal
+ to the higer level routine to increment the next higher level. For
+ instance. WITH FREQ=MONTHLY;BYDAY=TU,FR, After next_weekday_by_month
+ runs though both TU and FR, it sets the week day back to TU and sets
+ end_of_data to 1x. This signals next_month to increment the month.
+
+
+ ======================================================================*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+
+#include "icalrecur.h"
+
+#include "icalerror.h"
+#include "icalmemory.h"
+
+#include <stdlib.h> /* for malloc */
+#include <errno.h> /* for errno */
+#include <string.h> /* for strdup and strchr*/
+#include <assert.h>
+#include <stddef.h> /* For offsetof() macro */
+
+#include "pvl.h"
+
+/** This is the last year we will go up to, since 32-bit time_t values
+ only go up to the start of 2038. */
+#define MAX_TIME_T_YEAR 2037
+
+#define TEMP_MAX 1024
+
+
+#define BYDAYIDX impl->by_indices[BY_DAY]
+#define BYDAYPTR impl->by_ptrs[BY_DAY]
+
+#define BYMONIDX impl->by_indices[BY_MONTH]
+#define BYMONPTR impl->by_ptrs[BY_MONTH]
+
+#define BYMDIDX impl->by_indices[BY_MONTH_DAY]
+#define BYMDPTR impl->by_ptrs[BY_MONTH_DAY]
+
+#define BYWEEKIDX impl->by_indices[BY_WEEK_NO]
+#define BYWEEKPTR impl->by_ptrs[BY_WEEK_NO]
+
+const char* icalrecur_freq_to_string(icalrecurrencetype_frequency kind);
+icalrecurrencetype_frequency icalrecur_string_to_freq(const char* str);
+
+const char* icalrecur_weekday_to_string(icalrecurrencetype_weekday kind);
+icalrecurrencetype_weekday icalrecur_string_to_weekday(const char* str);
+
+
+/*********************** Rule parsing routines ************************/
+
+struct icalrecur_parser {
+ const char* rule;
+ char* copy;
+ char* this_clause;
+ char* next_clause;
+
+ struct icalrecurrencetype rt;
+};
+
+const char* icalrecur_first_clause(struct icalrecur_parser *parser)
+{
+ char *idx;
+ parser->this_clause = parser->copy;
+
+ idx = strchr(parser->this_clause,';');
+
+ if (idx == 0){
+ parser->next_clause = 0;
+ return 0;
+ }
+
+ *idx = 0;
+ idx++;
+ parser->next_clause = idx;
+
+ return parser->this_clause;
+
+}
+
+const char* icalrecur_next_clause(struct icalrecur_parser *parser)
+{
+ char* idx;
+
+ parser->this_clause = parser->next_clause;
+
+ if(parser->this_clause == 0){
+ return 0;
+ }
+
+ idx = strchr(parser->this_clause,';');
+
+ if (idx == 0){
+ parser->next_clause = 0;
+ } else {
+
+ *idx = 0;
+ idx++;
+ parser->next_clause = idx;
+ }
+
+ return parser->this_clause;
+
+}
+
+void icalrecur_clause_name_and_value(struct icalrecur_parser *parser,
+ char** name, char** value)
+{
+ char *idx;
+
+ *name = parser->this_clause;
+
+ idx = strchr(parser->this_clause,'=');
+
+ if (idx == 0){
+ *name = 0;
+ *value = 0;
+ return;
+ }
+
+ *idx = 0;
+ idx++;
+ *value = idx;
+}
+
+void icalrecur_add_byrules(struct icalrecur_parser *parser, short *array,
+ int size, char* vals)
+{
+ char *t, *n;
+ int i=0;
+ int sign = 1;
+ int v;
+ (void)parser;
+
+ n = vals;
+
+ while(n != 0){
+
+ if(i == size){
+ return;
+ }
+
+ t = n;
+
+ n = strchr(t,',');
+
+ if(n != 0){
+ *n = 0;
+ n++;
+ }
+
+ /* Get optional sign. HACK. sign is not allowed for all BYxxx
+ rule parts */
+ if( *t == '-'){
+ sign = -1;
+ t++;
+ } else if (*t == '+'){
+ sign = 1;
+ t++;
+ } else {
+ sign = 1;
+ }
+
+ v = atoi(t) * sign ;
+
+
+ array[i++] = (short)v;
+ array[i] = ICAL_RECURRENCE_ARRAY_MAX;
+
+ }
+
+}
+
+void icalrecur_add_bydayrules(struct icalrecur_parser *parser, const char* vals)
+{
+
+ char *t, *n;
+ int i=0;
+ int sign = 1;
+ int weekno = 0;
+ icalrecurrencetype_weekday wd;
+ short *array = parser->rt.by_day;
+ char* end;
+ char* vals_copy;
+
+ vals_copy = icalmemory_strdup(vals);
+
+ end = (char*)vals_copy+strlen(vals_copy);
+ n = vals_copy;
+
+ while(n != 0){
+
+
+ t = n;
+
+ n = strchr(t,',');
+
+ if(n != 0){
+ *n = 0;
+ n++;
+ }
+
+ /* Get optional sign. */
+ if( *t == '-'){
+ sign = -1;
+ t++;
+ } else if (*t == '+'){
+ sign = 1;
+ t++;
+ } else {
+ sign = 1;
+ }
+
+ /* Get Optional weekno */
+ weekno = strtol(t,&t,10);
+
+ /* Outlook/Exchange generate "BYDAY=MO, FR" and "BYDAY=2 TH".
+ * Cope with that.
+ */
+ if (*t == ' ')
+ t++;
+
+ wd = icalrecur_string_to_weekday(t);
+
+ array[i++] = (short)(sign* (wd + 8*weekno));
+ array[i] = ICAL_RECURRENCE_ARRAY_MAX;
+
+ }
+
+ free(vals_copy);
+
+}
+
+
+struct icalrecurrencetype icalrecurrencetype_from_string(const char* str)
+{
+ struct icalrecur_parser parser;
+
+ memset(&parser,0,sizeof(parser));
+ icalrecurrencetype_clear(&parser.rt);
+
+ icalerror_check_arg_re(str!=0,"str",parser.rt);
+
+
+ /* Set up the parser struct */
+ parser.rule = str;
+ parser.copy = icalmemory_strdup(parser.rule);
+ parser.this_clause = parser.copy;
+
+ if(parser.copy == 0){
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return parser.rt;
+ }
+
+ /* Loop through all of the clauses */
+ for(icalrecur_first_clause(&parser);
+ parser.this_clause != 0;
+ icalrecur_next_clause(&parser))
+ {
+ char *name, *value;
+ icalrecur_clause_name_and_value(&parser,&name,&value);
+
+ if(name == 0){
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ icalrecurrencetype_clear(&parser.rt);
+ free(parser.copy);
+ return parser.rt;
+ }
+
+ if (strcasecmp(name,"FREQ") == 0){
+ parser.rt.freq = icalrecur_string_to_freq(value);
+ } else if (strcasecmp(name,"COUNT") == 0){
+ parser.rt.count = atoi(value);
+ } else if (strcasecmp(name,"UNTIL") == 0){
+ parser.rt.until = icaltime_from_string(value);
+ } else if (strcasecmp(name,"INTERVAL") == 0){
+ parser.rt.interval = (short)atoi(value);
+ } else if (strcasecmp(name,"WKST") == 0){
+ parser.rt.week_start = icalrecur_string_to_weekday(value);
+ } else if (strcasecmp(name,"BYSECOND") == 0){
+ icalrecur_add_byrules(&parser,parser.rt.by_second,
+ ICAL_BY_SECOND_SIZE,value);
+ } else if (strcasecmp(name,"BYMINUTE") == 0){
+ icalrecur_add_byrules(&parser,parser.rt.by_minute,
+ ICAL_BY_MINUTE_SIZE,value);
+ } else if (strcasecmp(name,"BYHOUR") == 0){
+ icalrecur_add_byrules(&parser,parser.rt.by_hour,
+ ICAL_BY_HOUR_SIZE,value);
+ } else if (strcasecmp(name,"BYDAY") == 0){
+ icalrecur_add_bydayrules(&parser,value);
+ } else if (strcasecmp(name,"BYMONTHDAY") == 0){
+ icalrecur_add_byrules(&parser,parser.rt.by_month_day,
+ ICAL_BY_MONTHDAY_SIZE,value);
+ } else if (strcasecmp(name,"BYYEARDAY") == 0){
+ icalrecur_add_byrules(&parser,parser.rt.by_year_day,
+ ICAL_BY_YEARDAY_SIZE,value);
+ } else if (strcasecmp(name,"BYWEEKNO") == 0){
+ icalrecur_add_byrules(&parser,parser.rt.by_week_no,
+ ICAL_BY_WEEKNO_SIZE,value);
+ } else if (strcasecmp(name,"BYMONTH") == 0){
+ icalrecur_add_byrules(&parser,parser.rt.by_month,
+ ICAL_BY_MONTH_SIZE,value);
+ } else if (strcasecmp(name,"BYSETPOS") == 0){
+ icalrecur_add_byrules(&parser,parser.rt.by_set_pos,
+ ICAL_BY_SETPOS_SIZE,value);
+ } else {
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ icalrecurrencetype_clear(&parser.rt);
+ free(parser.copy);
+ return parser.rt;
+ }
+
+ }
+
+ free(parser.copy);
+
+ return parser.rt;
+
+}
+
+static struct { const char* str;size_t offset; int limit; } recurmap[] =
+{
+ {";BYSECOND=",offsetof(struct icalrecurrencetype,by_second),60},
+ {";BYMINUTE=",offsetof(struct icalrecurrencetype,by_minute),60},
+ {";BYHOUR=",offsetof(struct icalrecurrencetype,by_hour),24},
+ {";BYDAY=",offsetof(struct icalrecurrencetype,by_day),7},
+ {";BYMONTHDAY=",offsetof(struct icalrecurrencetype,by_month_day),31},
+ {";BYYEARDAY=",offsetof(struct icalrecurrencetype,by_year_day),366},
+ {";BYWEEKNO=",offsetof(struct icalrecurrencetype,by_week_no),52},
+ {";BYMONTH=",offsetof(struct icalrecurrencetype,by_month),12},
+ {";BYSETPOS=",offsetof(struct icalrecurrencetype,by_set_pos),366},
+ {0,0,0},
+};
+
+/* A private routine in icalvalue.c */
+void print_date_to_string(char* str, struct icaltimetype *data);
+void print_datetime_to_string(char* str, struct icaltimetype *data);
+
+char* icalrecurrencetype_as_string(struct icalrecurrencetype *recur)
+{
+ char* str;
+ char *str_p;
+ size_t buf_sz = 200;
+ char temp[20];
+ int i,j;
+
+ if(recur->freq == ICAL_NO_RECURRENCE){
+ return 0;
+ }
+
+ str = (char*)icalmemory_tmp_buffer(buf_sz);
+ str_p = str;
+
+ icalmemory_append_string(&str,&str_p,&buf_sz,"FREQ=");
+ icalmemory_append_string(&str,&str_p,&buf_sz,
+ icalrecur_freq_to_string(recur->freq));
+
+ if(recur->until.year != 0){
+
+ temp[0] = 0;
+ if (recur->until.is_date)
+ print_date_to_string(temp,&(recur->until));
+ else
+ print_datetime_to_string(temp,&(recur->until));
+
+ icalmemory_append_string(&str,&str_p,&buf_sz,";UNTIL=");
+ icalmemory_append_string(&str,&str_p,&buf_sz, temp);
+ }
+
+ if(recur->count != 0){
+ snprintf(temp,sizeof(temp),"%d",recur->count);
+ icalmemory_append_string(&str,&str_p,&buf_sz,";COUNT=");
+ icalmemory_append_string(&str,&str_p,&buf_sz, temp);
+ }
+
+ if(recur->interval != 1){
+ snprintf(temp,sizeof(temp),"%d",recur->interval);
+ icalmemory_append_string(&str,&str_p,&buf_sz,";INTERVAL=");
+ icalmemory_append_string(&str,&str_p,&buf_sz, temp);
+ }
+
+ for(j =0; recurmap[j].str != 0; j++){
+ short* array = (short*)(recurmap[j].offset+ (size_t)recur);
+ int limit = recurmap[j].limit;
+
+ /* Skip unused arrays */
+ if( array[0] != ICAL_RECURRENCE_ARRAY_MAX ) {
+
+ icalmemory_append_string(&str,&str_p,&buf_sz,recurmap[j].str);
+
+ for(i=0;
+ i< limit && array[i] != ICAL_RECURRENCE_ARRAY_MAX;
+ i++){
+ if (j == 3) { /* BYDAY */
+ const char *daystr = icalrecur_weekday_to_string(
+ icalrecurrencetype_day_day_of_week(array[i]));
+ int pos;
+
+ pos = icalrecurrencetype_day_position(array[i]);
+
+ if (pos == 0)
+ icalmemory_append_string(&str,&str_p,&buf_sz,daystr);
+ else {
+ snprintf(temp,sizeof(temp),"%d%s",pos,daystr);
+ icalmemory_append_string(&str,&str_p,&buf_sz,temp);
+ }
+
+ } else {
+ snprintf(temp,sizeof(temp),"%d",array[i]);
+ icalmemory_append_string(&str,&str_p,&buf_sz, temp);
+ }
+
+ if( (i+1)<limit &&array[i+1]
+ != ICAL_RECURRENCE_ARRAY_MAX){
+ icalmemory_append_char(&str,&str_p,&buf_sz,',');
+ }
+ }
+ }
+ }
+
+ /* Monday is the default, so no need to write that out */
+ if ( recur->week_start != ICAL_MONDAY_WEEKDAY ) {
+ const char *daystr = icalrecur_weekday_to_string(
+ icalrecurrencetype_day_day_of_week( recur->week_start ));
+ icalmemory_append_string(&str,&str_p,&buf_sz,";WKST=");
+ icalmemory_append_string(&str,&str_p,&buf_sz,daystr);
+ }
+
+ return str;
+}
+
+
+/************************* occurrence iteration routiens ******************/
+
+enum byrule {
+ NO_CONTRACTION = -1,
+ BY_SECOND = 0,
+ BY_MINUTE = 1,
+ BY_HOUR = 2,
+ BY_DAY = 3,
+ BY_MONTH_DAY = 4,
+ BY_YEAR_DAY = 5,
+ BY_WEEK_NO = 6,
+ BY_MONTH = 7,
+ BY_SET_POS
+};
+
+
+
+struct icalrecur_iterator_impl {
+
+ struct icaltimetype dtstart; /* Hack. Make into time_t */
+ struct icaltimetype last; /* last time return from _iterator_next*/
+ int occurrence_no; /* number of step made on t iterator */
+ struct icalrecurrencetype rule;
+
+ short days[366];
+ short days_index;
+
+ enum byrule byrule;
+ short by_indices[9];
+ short orig_data[9]; /**< 1 if there was data in the byrule */
+
+
+ short *by_ptrs[9]; /**< Pointers into the by_* array elements of the rule */
+
+};
+
+static void increment_year(icalrecur_iterator* impl, int inc);
+
+int icalrecur_iterator_sizeof_byarray(short* byarray)
+{
+ int array_itr;
+
+ for(array_itr = 0;
+ byarray[array_itr] != ICAL_RECURRENCE_ARRAY_MAX;
+ array_itr++){
+ }
+
+ return array_itr;
+}
+
+enum expand_table {
+ UNKNOWN = 0,
+ CONTRACT = 1,
+ EXPAND =2,
+ ILLEGAL=3
+};
+
+/**
+ * The split map indicates, for a particular interval, wether a BY_*
+ * rule part expands the number of instances in the occcurrence set or
+ * contracts it. 1=> contract, 2=>expand, and 3 means the pairing is
+ * not allowed.
+ */
+
+struct expand_split_map_struct
+{
+ icalrecurrencetype_frequency frequency;
+
+ /* Elements of the 'map' array correspond to the BYxxx rules:
+ Second,Minute,Hour,Day,Month Day,Year Day,Week No,Month*/
+
+ short map[8];
+};
+
+static struct expand_split_map_struct expand_map[] =
+{
+ {ICAL_SECONDLY_RECURRENCE,{1,1,1,1,1,1,1,1}},
+ {ICAL_MINUTELY_RECURRENCE,{2,1,1,1,1,1,1,1}},
+ {ICAL_HOURLY_RECURRENCE, {2,2,1,1,1,1,1,1}},
+ {ICAL_DAILY_RECURRENCE, {2,2,2,1,1,1,1,1}},
+ {ICAL_WEEKLY_RECURRENCE, {2,2,2,2,3,3,1,1}},
+ {ICAL_MONTHLY_RECURRENCE, {2,2,2,2,2,3,3,1}},
+ {ICAL_YEARLY_RECURRENCE, {2,2,2,2,2,2,2,2}},
+ {ICAL_NO_RECURRENCE, {0,0,0,0,0,0,0,0}}
+
+};
+
+
+
+/** Check that the rule has only the two given interday byrule parts. */
+static
+int icalrecur_two_byrule(icalrecur_iterator* impl,
+ enum byrule one,enum byrule two)
+{
+ short test_array[9];
+ enum byrule itr;
+ int passes = 0;
+
+ memset(test_array,0,sizeof(test_array));
+
+ test_array[one] = 1;
+ test_array[two] = 1;
+
+ for(itr = BY_DAY; itr != BY_SET_POS; itr++){
+
+ if( (test_array[itr] == 0 &&
+ impl->by_ptrs[itr][0] != ICAL_RECURRENCE_ARRAY_MAX
+ ) ||
+ (test_array[itr] == 1 &&
+ impl->by_ptrs[itr][0] == ICAL_RECURRENCE_ARRAY_MAX
+ )
+ ) {
+ /* test failed */
+ passes = 0;
+ }
+ }
+
+ return passes;
+
+}
+
+/** Check that the rule has only the one given interdat byrule parts. */
+static int icalrecur_one_byrule(icalrecur_iterator* impl,enum byrule one)
+{
+ int passes = 1;
+ enum byrule itr;
+
+ for(itr = BY_DAY; itr != BY_SET_POS; itr++){
+
+ if ((itr==one && impl->by_ptrs[itr][0] == ICAL_RECURRENCE_ARRAY_MAX) ||
+ (itr!=one && impl->by_ptrs[itr][0] != ICAL_RECURRENCE_ARRAY_MAX)) {
+ passes = 0;
+ }
+ }
+
+ return passes;
+}
+
+/*static int count_byrules(icalrecur_iterator* impl)
+{
+ int count = 0;
+ enum byrule itr;
+
+ for(itr = BY_DAY; itr <= BY_SET_POS; itr++){
+ if(impl->by_ptrs[itr][0] != ICAL_RECURRENCE_ARRAY_MAX){
+ count++;
+ }
+ }
+
+ return count;
+}*/
+
+
+static void setup_defaults(icalrecur_iterator* impl,
+ enum byrule byrule, icalrecurrencetype_frequency req,
+ int deftime, int *timepart)
+{
+
+ icalrecurrencetype_frequency freq;
+ freq = impl->rule.freq;
+
+ /* Re-write the BY rule arrays with data from the DTSTART time so
+ we don't have to explicitly deal with DTSTART */
+
+ if(impl->by_ptrs[byrule][0] == ICAL_RECURRENCE_ARRAY_MAX &&
+ expand_map[freq].map[byrule] != CONTRACT){
+ impl->by_ptrs[byrule][0] = (short)deftime;
+ }
+
+ /* Initialize the first occurrence */
+ if( freq != req && expand_map[freq].map[byrule] != CONTRACT){
+ *timepart = impl->by_ptrs[byrule][0];
+ }
+
+
+}
+
+static int has_by_data(icalrecur_iterator* impl, enum byrule byrule){
+
+ return (impl->orig_data[byrule] == 1);
+}
+
+
+static int expand_year_days(icalrecur_iterator* impl, int year);
+
+
+icalrecur_iterator* icalrecur_iterator_new(struct icalrecurrencetype rule,
+ struct icaltimetype dtstart)
+{
+ icalrecur_iterator* impl;
+ icalrecurrencetype_frequency freq;
+
+ if ( ( impl = (icalrecur_iterator*)
+ malloc(sizeof(icalrecur_iterator))) == 0) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return 0;
+ }
+
+ memset(impl,0,sizeof(icalrecur_iterator));
+
+ impl->rule = rule;
+ impl->last = dtstart;
+ impl->dtstart = dtstart;
+ impl->days_index =0;
+ impl->occurrence_no = 0;
+ freq = impl->rule.freq;
+
+ /* Set up convienience pointers to make the code simpler. Allows
+ us to iterate through all of the BY* arrays in the rule. */
+
+ impl->by_ptrs[BY_MONTH]=impl->rule.by_month;
+ impl->by_ptrs[BY_WEEK_NO]=impl->rule.by_week_no;
+ impl->by_ptrs[BY_YEAR_DAY]=impl->rule.by_year_day;
+ impl->by_ptrs[BY_MONTH_DAY]=impl->rule.by_month_day;
+ impl->by_ptrs[BY_DAY]=impl->rule.by_day;
+ impl->by_ptrs[BY_HOUR]=impl->rule.by_hour;
+ impl->by_ptrs[BY_MINUTE]=impl->rule.by_minute;
+ impl->by_ptrs[BY_SECOND]=impl->rule.by_second;
+ impl->by_ptrs[BY_SET_POS]=impl->rule.by_set_pos;
+
+ memset(impl->orig_data,0,9*sizeof(short));
+
+ /* Note which by rules had data in them when the iterator was
+ created. We can't use the actuall by_x arrays, because the
+ empty ones will be given default values later in this
+ routine. The orig_data array will be used later in has_by_data */
+
+ impl->orig_data[BY_MONTH]
+ = (short)(impl->rule.by_month[0]!=ICAL_RECURRENCE_ARRAY_MAX);
+ impl->orig_data[BY_WEEK_NO]
+ =(short)(impl->rule.by_week_no[0]!=ICAL_RECURRENCE_ARRAY_MAX);
+ impl->orig_data[BY_YEAR_DAY]
+ =(short)(impl->rule.by_year_day[0]!=ICAL_RECURRENCE_ARRAY_MAX);
+ impl->orig_data[BY_MONTH_DAY]
+ =(short)(impl->rule.by_month_day[0]!=ICAL_RECURRENCE_ARRAY_MAX);
+ impl->orig_data[BY_DAY]
+ = (short)(impl->rule.by_day[0]!=ICAL_RECURRENCE_ARRAY_MAX);
+ impl->orig_data[BY_HOUR]
+ = (short)(impl->rule.by_hour[0]!=ICAL_RECURRENCE_ARRAY_MAX);
+ impl->orig_data[BY_MINUTE]
+ = (short)(impl->rule.by_minute[0]!=ICAL_RECURRENCE_ARRAY_MAX);
+ impl->orig_data[BY_SECOND]
+ = (short)(impl->rule.by_second[0]!=ICAL_RECURRENCE_ARRAY_MAX);
+ impl->orig_data[BY_SET_POS]
+ = (short)(impl->rule.by_set_pos[0]!=ICAL_RECURRENCE_ARRAY_MAX);
+
+
+ /* Check if the recurrence rule is legal */
+
+ /* If the BYYEARDAY appears, no other date rule part may appear. */
+
+ if(icalrecur_two_byrule(impl,BY_YEAR_DAY,BY_MONTH) ||
+ icalrecur_two_byrule(impl,BY_YEAR_DAY,BY_WEEK_NO) ||
+ icalrecur_two_byrule(impl,BY_YEAR_DAY,BY_MONTH_DAY) ||
+ icalrecur_two_byrule(impl,BY_YEAR_DAY,BY_DAY) ){
+
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+
+ return 0;
+ }
+
+ /* BYWEEKNO and BYMONTH rule parts may not both appear.*/
+
+ if(icalrecur_two_byrule(impl,BY_WEEK_NO,BY_MONTH)){
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return 0;
+ }
+
+ /* BYWEEKNO and BYMONTHDAY rule parts may not both appear.*/
+
+ if(icalrecur_two_byrule(impl,BY_WEEK_NO,BY_MONTH_DAY)){
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return 0;
+ }
+
+
+ /*For MONTHLY recurrences (FREQ=MONTHLY) neither BYYEARDAY nor
+ BYWEEKNO may appear. */
+
+ if(freq == ICAL_MONTHLY_RECURRENCE &&
+ icalrecur_one_byrule(impl,BY_WEEK_NO)){
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return 0;
+ }
+
+
+ /*For WEEKLY recurrences (FREQ=WEEKLY) neither BYMONTHDAY nor
+ BYYEARDAY may appear. */
+
+ if(freq == ICAL_WEEKLY_RECURRENCE &&
+ icalrecur_one_byrule(impl,BY_MONTH_DAY )) {
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return 0;
+ }
+
+ /* BYYEARDAY may only appear in YEARLY rules */
+ if(freq != ICAL_YEARLY_RECURRENCE &&
+ icalrecur_one_byrule(impl,BY_YEAR_DAY )) {
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return 0;
+ }
+
+ /* Rewrite some of the rules and set up defaults to make later
+ processing easier. Primarily, t involves copying an element
+ from the start time into the corresponding BY_* array when the
+ BY_* array is empty */
+
+
+ setup_defaults(impl,BY_SECOND,ICAL_SECONDLY_RECURRENCE,
+ impl->dtstart.second,
+ &(impl->last.second));
+
+ setup_defaults(impl,BY_MINUTE,ICAL_MINUTELY_RECURRENCE,
+ impl->dtstart.minute,
+ &(impl->last.minute));
+
+ setup_defaults(impl,BY_HOUR,ICAL_HOURLY_RECURRENCE,
+ impl->dtstart.hour,
+ &(impl->last.hour));
+
+ setup_defaults(impl,BY_MONTH_DAY,ICAL_DAILY_RECURRENCE,
+ impl->dtstart.day,
+ &(impl->last.day));
+
+ setup_defaults(impl,BY_MONTH,ICAL_MONTHLY_RECURRENCE,
+ impl->dtstart.month,
+ &(impl->last.month));
+
+
+ if(impl->rule.freq == ICAL_WEEKLY_RECURRENCE ){
+
+ if(impl->by_ptrs[BY_DAY][0] == ICAL_RECURRENCE_ARRAY_MAX){
+
+ /* Weekly recurrences with no BY_DAY data should occur on the
+ same day of the week as the start time . */
+ impl->by_ptrs[BY_DAY][0] = (short)icaltime_day_of_week(impl->dtstart);
+
+ } else {
+ /* If there is BY_DAY data, then we need to move the initial
+ time to the start of the BY_DAY data. That is if the
+ start time is on a Wednesday, and the rule has
+ BYDAY=MO,WE,FR, move the initial time back to
+ monday. Otherwise, jumping to the next week ( jumping 7
+ days ahead ) will skip over some occurrences in the
+ second week. */
+
+ /* This is probably a HACK. There should be some more
+ general way to solve this problem */
+
+ short dow = (short)(impl->by_ptrs[BY_DAY][0]-icaltime_day_of_week(impl->last));
+
+ if(dow < 0) {
+ /* initial time is after first day of BY_DAY data */
+
+ impl->last.day += dow;
+ impl->last = icaltime_normalize(impl->last);
+ }
+ }
+
+
+ }
+
+ /* For YEARLY rule, begin by setting up the year days array . The
+ YEARLY rules work by expanding one year at a time. */
+
+ if(impl->rule.freq == ICAL_YEARLY_RECURRENCE){
+ struct icaltimetype next;
+
+ for (;;) {
+ expand_year_days(impl, impl->last.year);
+ if (impl->days[0] != ICAL_RECURRENCE_ARRAY_MAX)
+ break; /* break when no days are expanded */
+ increment_year(impl,impl->rule.interval);
+ }
+
+ /* Copy the first day into last. */
+ next = icaltime_from_day_of_year(impl->days[0], impl->last.year);
+
+ impl->last.day = next.day;
+ impl->last.month = next.month;
+ }
+
+
+ /* If this is a monthly interval with by day data, then we need to
+ set the last value to the appropriate day of the month */
+
+ if(impl->rule.freq == ICAL_MONTHLY_RECURRENCE &&
+ has_by_data(impl,BY_DAY)) {
+
+ int dow = icalrecurrencetype_day_day_of_week(
+ impl->by_ptrs[BY_DAY][impl->by_indices[BY_DAY]]);
+ int pos = icalrecurrencetype_day_position(
+ impl->by_ptrs[BY_DAY][impl->by_indices[BY_DAY]]);
+
+ int poscount = 0;
+ int days_in_month =
+ icaltime_days_in_month(impl->last.month, impl->last.year);
+
+ if(pos >= 0){
+ /* Count up from the first day pf the month to find the
+ pos'th weekday of dow ( like the second monday. ) */
+
+ for(impl->last.day = 1;
+ impl->last.day <= days_in_month;
+ impl->last.day++){
+
+ if(icaltime_day_of_week(impl->last) == dow){
+ if(++poscount == pos || pos == 0){
+ break;
+ }
+ }
+ }
+ } else {
+ /* Count down from the last day pf the month to find the
+ pos'th weekday of dow ( like the second to last monday. ) */
+ pos = -pos;
+ for(impl->last.day = days_in_month;
+ impl->last.day != 0;
+ impl->last.day--){
+
+ if(icaltime_day_of_week(impl->last) == dow){
+ if(++poscount == pos ){
+ break;
+ }
+ }
+ }
+ }
+
+
+ if(impl->last.day > days_in_month || impl->last.day == 0){
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return 0;
+ }
+
+ }
+
+
+
+ return impl;
+}
+
+
+void icalrecur_iterator_free(icalrecur_iterator* i)
+{
+ icalerror_check_arg_rv((i!=0),"impl");
+
+ free(i);
+
+}
+
+static void increment_year(icalrecur_iterator* impl, int inc)
+{
+ impl->last.year+=inc;
+}
+
+/** Increment month is different that the other incement_* routines --
+ it figures out the interval for itself, and uses BYMONTH data if
+ available. */
+static void increment_month(icalrecur_iterator* impl)
+{
+ int years;
+
+ if(has_by_data(impl,BY_MONTH) ){
+ /* Ignore the frequency and use the byrule data */
+
+ impl->by_indices[BY_MONTH]++;
+
+ if (impl->by_ptrs[BY_MONTH][impl->by_indices[BY_MONTH]]
+ ==ICAL_RECURRENCE_ARRAY_MAX){
+ impl->by_indices[BY_MONTH] = 0;
+
+ increment_year(impl,1);
+
+ }
+
+ impl->last.month =
+ impl->by_ptrs[BY_MONTH][impl->by_indices[BY_MONTH]];
+
+ } else {
+
+ int inc;
+
+ if(impl->rule.freq == ICAL_MONTHLY_RECURRENCE){
+ inc = impl->rule.interval;
+ } else {
+ inc = 1;
+ }
+
+ impl->last.month+=inc;
+
+ /* Months are offset by one */
+ impl->last.month--;
+
+ years = impl->last.month / 12;
+
+ impl->last.month = impl->last.month % 12;
+
+ impl->last.month++;
+
+ if (years != 0){
+ increment_year(impl,years);
+ }
+ }
+}
+
+static void increment_monthday(icalrecur_iterator* impl, int inc)
+{
+ int i;
+
+ for(i=0; i<inc; i++){
+
+ int days_in_month =
+ icaltime_days_in_month(impl->last.month, impl->last.year);
+
+ impl->last.day++;
+
+ if (impl->last.day > days_in_month){
+ impl->last.day = impl->last.day-days_in_month;
+ increment_month(impl);
+ }
+ }
+}
+
+
+static void increment_hour(icalrecur_iterator* impl, int inc)
+{
+ int days;
+
+ impl->last.hour+=inc;
+
+ days = impl->last.hour / 24;
+ impl->last.hour = impl->last.hour % 24;
+
+ if (impl->days != 0){
+ increment_monthday(impl,days);
+ }
+}
+
+static void increment_minute(icalrecur_iterator* impl, int inc)
+{
+ int hours;
+
+ impl->last.minute+=inc;
+
+ hours = impl->last.minute / 60;
+ impl->last.minute = impl->last.minute % 60;
+
+ if (hours != 0){
+ increment_hour(impl,hours);
+ }
+
+}
+
+static void increment_second(icalrecur_iterator* impl, int inc)
+{
+ int minutes;
+
+ impl->last.second+=inc;
+
+ minutes = impl->last.second / 60;
+ impl->last.second = impl->last.second % 60;
+
+ if (minutes != 0)
+ {
+ increment_minute(impl, minutes);
+ }
+}
+
+#if 0
+#include "ical.h"
+void test_increment()
+{
+ icalrecur_iterator impl;
+
+ impl.last = icaltime_from_string("20000101T000000Z");
+
+ printf("Orig: %s\n",icaltime_as_ctime(impl.last));
+
+ increment_second(&impl,5);
+ printf("+ 5 sec : %s\n",icaltime_as_ctime(impl.last));
+
+ increment_second(&impl,355);
+ printf("+ 355 sec : %s\n",icaltime_as_ctime(impl.last));
+
+ increment_minute(&impl,5);
+ printf("+ 5 min : %s\n",icaltime_as_ctime(impl.last));
+
+ increment_minute(&impl,360);
+ printf("+ 360 min : %s\n",icaltime_as_ctime(impl.last));
+ increment_hour(&impl,5);
+ printf("+ 5 hours : %s\n",icaltime_as_ctime(impl.last));
+ increment_hour(&impl,43);
+ printf("+ 43 hours : %s\n",icaltime_as_ctime(impl.last));
+ increment_monthday(&impl,3);
+ printf("+ 3 days : %s\n",icaltime_as_ctime(impl.last));
+ increment_monthday(&impl,600);
+ printf("+ 600 days : %s\n",icaltime_as_ctime(impl.last));
+
+}
+
+#endif
+
+static int next_second(icalrecur_iterator* impl)
+{
+
+ int has_by_second = (impl->by_ptrs[BY_SECOND][0]!=ICAL_RECURRENCE_ARRAY_MAX);
+ int this_frequency = (impl->rule.freq == ICAL_SECONDLY_RECURRENCE);
+
+ int end_of_data = 0;
+
+ assert(has_by_second || this_frequency);
+
+ if( has_by_second ){
+ /* Ignore the frequency and use the byrule data */
+
+ impl->by_indices[BY_SECOND]++;
+
+ if (impl->by_ptrs[BY_SECOND][impl->by_indices[BY_SECOND]]
+ ==ICAL_RECURRENCE_ARRAY_MAX){
+ impl->by_indices[BY_SECOND] = 0;
+
+ end_of_data = 1;
+ }
+
+
+ impl->last.second =
+ impl->by_ptrs[BY_SECOND][impl->by_indices[BY_SECOND]];
+
+
+ } else if( !has_by_second && this_frequency ){
+ /* Compute the next value from the last time and the frequency interval*/
+ increment_second(impl, impl->rule.interval);
+
+ }
+
+ /* If we have gone through all of the seconds on the BY list, then we
+ need to move to the next minute */
+
+ if(has_by_second && end_of_data && this_frequency ){
+ increment_minute(impl,1);
+ }
+
+ return end_of_data;
+
+}
+
+static int next_minute(icalrecur_iterator* impl)
+{
+
+ int has_by_minute = (impl->by_ptrs[BY_MINUTE][0]!=ICAL_RECURRENCE_ARRAY_MAX);
+ int this_frequency = (impl->rule.freq == ICAL_MINUTELY_RECURRENCE);
+
+ int end_of_data = 0;
+
+ assert(has_by_minute || this_frequency);
+
+
+ if (next_second(impl) == 0){
+ return 0;
+ }
+
+ if( has_by_minute ){
+ /* Ignore the frequency and use the byrule data */
+
+ impl->by_indices[BY_MINUTE]++;
+
+ if (impl->by_ptrs[BY_MINUTE][impl->by_indices[BY_MINUTE]]
+ ==ICAL_RECURRENCE_ARRAY_MAX){
+
+ impl->by_indices[BY_MINUTE] = 0;
+
+ end_of_data = 1;
+ }
+
+ impl->last.minute =
+ impl->by_ptrs[BY_MINUTE][impl->by_indices[BY_MINUTE]];
+
+ } else if( !has_by_minute && this_frequency ){
+ /* Compute the next value from the last time and the frequency interval*/
+ increment_minute(impl,impl->rule.interval);
+ }
+
+/* If we have gone through all of the minutes on the BY list, then we
+ need to move to the next hour */
+
+ if(has_by_minute && end_of_data && this_frequency ){
+ increment_hour(impl,1);
+ }
+
+ return end_of_data;
+}
+
+static int next_hour(icalrecur_iterator* impl)
+{
+
+ int has_by_hour = (impl->by_ptrs[BY_HOUR][0]!=ICAL_RECURRENCE_ARRAY_MAX);
+ int this_frequency = (impl->rule.freq == ICAL_HOURLY_RECURRENCE);
+
+ int end_of_data = 0;
+
+ assert(has_by_hour || this_frequency);
+
+ if (next_minute(impl) == 0){
+ return 0;
+ }
+
+ if( has_by_hour ){
+ /* Ignore the frequency and use the byrule data */
+
+ impl->by_indices[BY_HOUR]++;
+
+ if (impl->by_ptrs[BY_HOUR][impl->by_indices[BY_HOUR]]
+ ==ICAL_RECURRENCE_ARRAY_MAX){
+ impl->by_indices[BY_HOUR] = 0;
+
+ end_of_data = 1;
+ }
+
+ impl->last.hour =
+ impl->by_ptrs[BY_HOUR][impl->by_indices[BY_HOUR]];
+
+ } else if( !has_by_hour && this_frequency ){
+ /* Compute the next value from the last time and the frequency interval*/
+ increment_hour(impl,impl->rule.interval);
+
+ }
+
+ /* If we have gone through all of the hours on the BY list, then we
+ need to move to the next day */
+
+ if(has_by_hour && end_of_data && this_frequency ){
+ increment_monthday(impl,1);
+ }
+
+ return end_of_data;
+
+}
+
+static int next_day(icalrecur_iterator* impl)
+{
+
+ int has_by_day = (impl->by_ptrs[BY_DAY][0]!=ICAL_RECURRENCE_ARRAY_MAX);
+ int this_frequency = (impl->rule.freq == ICAL_DAILY_RECURRENCE);
+
+ assert(has_by_day || this_frequency);
+
+ if (next_hour(impl) == 0){
+ return 0;
+ }
+
+ /* Always increment through the interval, since this routine is not
+ called by any other next_* routine, and the days that are
+ excluded will be taken care of by restriction filtering */
+
+ if(this_frequency){
+ increment_monthday(impl,impl->rule.interval);
+ } else {
+ increment_monthday(impl,1);
+ }
+
+
+ return 0;
+
+}
+
+
+/*static int next_yearday(icalrecur_iterator* impl)
+{
+
+ int has_by_yearday = (impl->by_ptrs[BY_YEAR_DAY][0]!=ICAL_RECURRENCE_ARRAY_MAX);
+
+ int end_of_data = 0;
+
+ assert(has_by_yearday );
+
+ if (next_hour(impl) == 0){
+ return 0;
+ }
+
+ impl->by_indices[BY_YEAR_DAY]++;
+
+ if (impl->by_ptrs[BY_YEAR_DAY][impl->by_indices[BY_YEAR_DAY]]
+ ==ICAL_RECURRENCE_ARRAY_MAX){
+ impl->by_indices[BY_YEAR_DAY] = 0;
+
+ end_of_data = 1;
+ }
+
+ impl->last.day =
+ impl->by_ptrs[BY_YEAR_DAY][impl->by_indices[BY_YEAR_DAY]];
+
+ if(has_by_yearday && end_of_data){
+ increment_year(impl,1);
+ }
+
+ return end_of_data;
+
+}*/
+
+
+/* Returns the day of the month for the current month of t that is the
+ pos'th instance of the day-of-week dow */
+
+static int nth_weekday(int dow, int pos, struct icaltimetype t){
+
+ int days_in_month = icaltime_days_in_month(t.month, t.year);
+ int end_dow, start_dow;
+ int wd;
+
+ if(pos >= 0){
+ t.day = 1;
+ start_dow = icaltime_day_of_week(t);
+
+ if (pos != 0) {
+ pos--;
+ }
+
+ /* find month day of first occurrence of dow -- such as the
+ month day of the first monday */
+
+ wd = dow-start_dow+1;
+
+ if (wd <= 0){
+ wd = wd + 7;
+ }
+
+ wd = wd + pos * 7;
+
+ } else {
+ t.day = days_in_month;
+ end_dow = icaltime_day_of_week(t);
+
+ pos++;
+
+ /* find month day of last occurrence of dow -- such as the
+ month day of the last monday */
+
+ wd = (end_dow - dow);
+
+ if (wd < 0){
+ wd = wd+ 7;
+ }
+
+ wd = days_in_month - wd;
+
+ wd = wd + pos * 7;
+ }
+
+ return wd;
+}
+
+static int is_day_in_byday(icalrecur_iterator* impl,struct icaltimetype tt){
+
+ int idx;
+
+ for(idx = 0; BYDAYPTR[idx] != ICAL_RECURRENCE_ARRAY_MAX; idx++){
+ int dow = icalrecurrencetype_day_day_of_week(BYDAYPTR[idx]);
+ int pos = icalrecurrencetype_day_position(BYDAYPTR[idx]);
+ int this_dow = icaltime_day_of_week(tt);
+
+ if( (pos == 0 && dow == this_dow ) || /* Just a dow, like "TU" or "FR" */
+ (nth_weekday(dow,pos,tt) == tt.day)){ /*pos+wod: "3FR" or -1TU" */
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+static int next_month(icalrecur_iterator* impl)
+{
+ int data_valid = 1;
+
+ int this_frequency = (impl->rule.freq == ICAL_MONTHLY_RECURRENCE);
+
+ assert( has_by_data(impl,BY_MONTH) || this_frequency);
+
+ /* Iterate through the occurrences within a day. If we don't get to
+ the end of the intra-day data, don't bother going to the next
+ month */
+
+ if (next_hour(impl) == 0){
+ return data_valid; /* Signal that the data is valid */
+ }
+
+ /* Now iterate through the occurrences within a month -- by days,
+ weeks or weekdays. */
+
+ /*
+ * Case 1:
+ * Rules Like: FREQ=MONTHLY;INTERVAL=1;BYDAY=FR;BYMONTHDAY=13
+ */
+
+ if(has_by_data(impl,BY_DAY) && has_by_data(impl,BY_MONTH_DAY)){
+ int day, idx,j;
+ int days_in_month = icaltime_days_in_month(impl->last.month,
+ impl->last.year);
+ /* Iterate through the remaining days in the month and check if
+ each day is listed in the BY_DAY array and in the BY_MONTHDAY
+ array. This seems very inneficient, but I think it is the
+ simplest way to account for both BYDAY=1FR (First friday in
+ month) and BYDAY=FR ( every friday in month ) */
+
+ for(day = impl->last.day+1; day <= days_in_month; day++){
+ for(idx = 0; BYDAYPTR[idx] != ICAL_RECURRENCE_ARRAY_MAX; idx++){
+ for(j = 0; BYMDPTR[j]!=ICAL_RECURRENCE_ARRAY_MAX; j++){
+ int dow =
+ icalrecurrencetype_day_day_of_week(BYDAYPTR[idx]);
+ int pos = icalrecurrencetype_day_position(BYDAYPTR[idx]);
+ int mday = BYMDPTR[j];
+ int this_dow;
+
+ impl->last.day = day;
+ this_dow = icaltime_day_of_week(impl->last);
+
+ if( (pos == 0 && dow == this_dow && mday == day) ||
+ (nth_weekday(dow,pos,impl->last) == day && mday==day)){
+ goto MDEND;
+ }
+ }
+ }
+ }
+
+ MDEND:
+
+ if ( day > days_in_month){
+ impl->last.day = 1;
+ increment_month(impl);
+ data_valid = 0; /* signal that impl->last is invalid */
+ }
+
+
+ /*
+ * Case 2:
+ * Rules Like: FREQ=MONTHLY;INTERVAL=1;BYDAY=FR
+ */
+
+ } else if(has_by_data(impl,BY_DAY)){
+ /* For this case, the weekdays are relative to the
+ month. BYDAY=FR -> First Friday in month, etc. */
+
+ /* This code iterates through the remaining days in the month
+ and checks if each day is listed in the BY_DAY array. This
+ seems very inneficient, but I think it is the simplest way to
+ account for both BYDAY=1FR (First friday in month) and
+ BYDAY=FR ( every friday in month ) */
+
+ int day;
+ int days_in_month = icaltime_days_in_month(impl->last.month,
+ impl->last.year);
+ assert( BYDAYPTR[0]!=ICAL_RECURRENCE_ARRAY_MAX);
+
+ for(day = impl->last.day+1; day <= days_in_month; day++){
+ impl->last.day = day;
+ if(is_day_in_byday(impl,impl->last)){
+ data_valid = 1;
+ break;
+ }
+ }
+
+ if ( day > days_in_month){
+ impl->last.day = 1;
+ increment_month(impl);
+
+ /* Did moving to the next month put us on a valid date? if
+ so, note that the new data is valid, if, not, mark it
+ invalid */
+
+ if(is_day_in_byday(impl,impl->last)){
+ data_valid = 1;
+ } else {
+ data_valid = 0; /* signal that impl->last is invalid */
+ }
+ }
+
+ /*
+ * Case 3
+ * Rules Like: FREQ=MONTHLY;COUNT=10;BYMONTHDAY=-3
+ */
+
+ } else if (has_by_data(impl,BY_MONTH_DAY)) {
+ int day;
+
+ assert( BYMDPTR[0]!=ICAL_RECURRENCE_ARRAY_MAX);
+
+ BYMDIDX++;
+
+ /* Are we at the end of the BYDAY array? */
+ if (BYMDPTR[BYMDIDX] ==ICAL_RECURRENCE_ARRAY_MAX){
+
+ BYMDIDX = 0; /* Reset to 0 */
+ increment_month(impl);
+ }
+
+ day = BYMDPTR[BYMDIDX];
+
+ if (day < 0) {
+ day = icaltime_days_in_month(impl->last.month, impl->last.year) + day + 1;
+ }
+
+ impl->last.day = day;
+
+ } else {
+ increment_month(impl);
+ }
+
+ return data_valid;
+
+}
+
+static int next_weekday_by_week(icalrecur_iterator* impl)
+{
+
+ int end_of_data = 0;
+ int start_of_week, dow;
+ struct icaltimetype next;
+
+ if (next_hour(impl) == 0){
+ return 0;
+ }
+
+ if(!has_by_data(impl,BY_DAY)){
+ return 1;
+ }
+
+ /* If we get here, we need to step to tne next day */
+
+ for (;;) {
+ struct icaltimetype tt = icaltime_null_time();
+ BYDAYIDX++; /* Look at next elem in BYDAY array */
+
+ /* Are we at the end of the BYDAY array? */
+ if (BYDAYPTR[BYDAYIDX]==ICAL_RECURRENCE_ARRAY_MAX){
+ BYDAYIDX = 0; /* Reset to 0 */
+ end_of_data = 1; /* Signal that we're at the end */
+ }
+
+ /* Add the day of week offset to to the start of this week, and use
+ that to get the next day */
+ /* ignore position of dow ("4FR"), only use dow ("FR")*/
+ dow = icalrecurrencetype_day_day_of_week(BYDAYPTR[BYDAYIDX]);
+ tt.year = impl->last.year;
+ tt.day = impl->last.day;
+ tt.month = impl->last.month;
+
+ start_of_week = icaltime_start_doy_of_week(tt);
+
+ dow--; /* Set Sunday to be 0 */
+
+ if(dow+start_of_week <1){
+ /* The selected date is in the previous year. */
+ if(!end_of_data){
+ continue;
+ }
+ }
+
+ next = icaltime_from_day_of_year(start_of_week + dow,impl->last.year);
+
+ impl->last.day = next.day;
+ impl->last.month = next.month;
+ impl->last.year = next.year;
+
+ return end_of_data;
+ }
+
+}
+
+static int next_week(icalrecur_iterator* impl)
+{
+ int end_of_data = 0;
+
+ /* Increment to the next week day, if there is data at a level less than a week */
+ if (next_weekday_by_week(impl) == 0){
+ return 0; /* Have not reached end of week yet */
+ }
+
+ /* If we get here, we have incremented through the entire week, and
+ can increment to the next week */
+
+ if( has_by_data(impl,BY_WEEK_NO)){
+ /*FREQ=WEEKLY;BYWEEK=20*/
+ /* Use the Week Number byrule data */
+ int week_no;
+ struct icaltimetype t;
+
+ impl->by_indices[BY_WEEK_NO]++;
+
+ if (impl->by_ptrs[BY_WEEK_NO][impl->by_indices[BY_WEEK_NO]]
+ ==ICAL_RECURRENCE_ARRAY_MAX){
+ impl->by_indices[BY_WEEK_NO] = 0;
+
+ end_of_data = 1;
+ }
+
+ t = impl->last;
+ t.month=1; /* HACK, should be setting to the date of the first week of year*/
+ t.day=1;
+
+ week_no = impl->by_ptrs[BY_WEEK_NO][impl->by_indices[BY_WEEK_NO]];
+
+ impl->last.day += week_no*7;
+
+ impl->last = icaltime_normalize(impl->last);
+
+ } else {
+ /* Jump to the next week */
+ increment_monthday(impl,7*impl->rule.interval);
+ }
+
+ if( has_by_data(impl,BY_WEEK_NO) && end_of_data){
+ increment_year(impl,1);
+ }
+
+ return end_of_data;
+
+}
+
+/** Expand the BYDAY rule part and return a pointer to a newly allocated list of days. */
+static pvl_list expand_by_day(icalrecur_iterator* impl, int year)
+{
+ /* Try to calculate each of the occurrences. */
+ int i;
+ pvl_list days_list = pvl_newlist();
+
+ int start_dow, end_dow, end_year_day;
+ struct icaltimetype tmp = impl->last;
+
+ tmp.year= year;
+ tmp.month = 1;
+ tmp.day = 1;
+ tmp.is_date = 1;
+
+ /* Find the day that 1st Jan falls on, 1 (Sun) to 7 (Sat). */
+ start_dow = icaltime_day_of_week(tmp);
+
+ /* Get the last day of the year*/
+ tmp.year= year;
+ tmp.month = 12;
+ tmp.day = 31;
+ tmp.is_date = 1;
+
+ end_dow = icaltime_day_of_week(tmp);
+ end_year_day = icaltime_day_of_year(tmp);
+
+ for(i = 0; BYDAYPTR[i] != ICAL_RECURRENCE_ARRAY_MAX; i++){
+ /* This is 1 (Sun) to 7 (Sat). */
+ int dow =
+ icalrecurrencetype_day_day_of_week(BYDAYPTR[i]);
+ int pos = icalrecurrencetype_day_position(BYDAYPTR[i]);
+
+ if(pos == 0){
+ /* The day was specified without a position -- it is just
+ a bare day of the week ( BYDAY=SU) so add all of the
+ days of the year with this day-of-week*/
+ int doy, tmp_start_doy;
+
+ tmp_start_doy = ((dow + 7 - start_dow) % 7) + 1;
+
+ for (doy = tmp_start_doy; doy <= end_year_day; doy += 7)
+ pvl_push(days_list,(void*)(ptrdiff_t)doy);
+
+ } else if ( pos > 0) {
+ int first;
+ /* First occurrence of dow in year */
+ if( dow >= start_dow) {
+ first = dow - start_dow + 1;
+ } else {
+ first = dow - start_dow + 8;
+ }
+
+ /* Then just multiple the position times 7 to get the pos'th day in the year */
+ pvl_push(days_list,(void*)(first+ (pos-1) * 7));
+
+ } else { /* pos < 0 */
+ int last;
+ pos = -pos;
+
+ /* last occurrence of dow in year */
+ if( dow <= end_dow) {
+ last = end_year_day - end_dow + dow;
+ } else {
+ last = end_year_day - end_dow + dow - 7;
+ }
+
+ pvl_push(days_list,(void*)(last - (pos-1) * 7));
+ }
+ }
+ return days_list;
+}
+
+
+/* For INTERVAL=YEARLY, set up the days[] array in the iterator to
+ list all of the days of the current year that are specified in this
+ rule. */
+
+static int expand_year_days(icalrecur_iterator* impl, int year)
+{
+ int j,k;
+ int days_index=0;
+ struct icaltimetype t;
+ int flags;
+
+ t = icaltime_null_date();
+
+#define HBD(x) has_by_data(impl,x)
+
+ memset(impl->days,ICAL_RECURRENCE_ARRAY_MAX_BYTE,sizeof(impl->days));
+
+ /* The flags and the following switch statement select which code
+ to use to expand the yers days, based on which BY-rules are
+ present. */
+
+ flags = (HBD(BY_DAY) ? 1<<BY_DAY : 0) +
+ (HBD(BY_WEEK_NO) ? 1<<BY_WEEK_NO : 0) +
+ (HBD(BY_MONTH_DAY) ? 1<<BY_MONTH_DAY : 0) +
+ (HBD(BY_MONTH) ? 1<<BY_MONTH : 0) +
+ (HBD(BY_YEAR_DAY) ? 1<<BY_YEAR_DAY : 0);
+
+
+ switch(flags) {
+
+ case 0: {
+ /* FREQ=YEARLY; */
+ t = impl->dtstart;
+ t.year = impl->last.year;
+
+ impl->days[days_index++] = (short)icaltime_day_of_year(t);
+
+ break;
+ }
+ case 1<<BY_MONTH: {
+ /* FREQ=YEARLY; BYMONTH=3,11*/
+
+ for(j=0;impl->by_ptrs[BY_MONTH][j]!=ICAL_RECURRENCE_ARRAY_MAX;j++){
+ int month = impl->by_ptrs[BY_MONTH][j];
+ int doy;
+
+ t = impl->dtstart;
+ t.year = year;
+ t.month = month;
+ t.is_date = 1;
+
+ doy = icaltime_day_of_year(t);
+
+ impl->days[days_index++] = (short)doy;
+
+ }
+ break;
+ }
+
+ case 1<<BY_MONTH_DAY: {
+ /* FREQ=YEARLY; BYMONTHDAY=1,15*/
+ for(k=0;impl->by_ptrs[BY_MONTH_DAY][k]!=ICAL_RECURRENCE_ARRAY_MAX;k++)
+ {
+ int month_day = impl->by_ptrs[BY_MONTH_DAY][k];
+ int doy;
+
+ t = impl->dtstart;
+ t.day = month_day;
+ t.year = year;
+ t.is_date = 1;
+
+ doy = icaltime_day_of_year(t);
+
+ impl->days[days_index++] = (short)doy;
+
+ }
+ break;
+ }
+
+ case (1<<BY_MONTH_DAY) + (1<<BY_MONTH): {
+ /* FREQ=YEARLY; BYMONTHDAY=1,15; BYMONTH=10 */
+
+ for(j=0;impl->by_ptrs[BY_MONTH][j]!=ICAL_RECURRENCE_ARRAY_MAX;j++){
+ for(k=0;impl->by_ptrs[BY_MONTH_DAY][k]!=ICAL_RECURRENCE_ARRAY_MAX;k++)
+ {
+ int month = impl->by_ptrs[BY_MONTH][j];
+ int month_day = impl->by_ptrs[BY_MONTH_DAY][k];
+ int doy;
+
+ t.day = month_day;
+ t.month = month;
+ t.year = year;
+ t.is_date = 1;
+
+ doy = icaltime_day_of_year(t);
+
+ impl->days[days_index++] = (short)doy;
+
+ }
+ }
+
+ break;
+ }
+
+ case 1<<BY_WEEK_NO: {
+ /* FREQ=YEARLY; BYWEEKNO=20,50 */
+
+ int dow;
+
+ t.day = impl->dtstart.day;
+ t.month = impl->dtstart.month;
+ t.year = year;
+ t.is_date = 1;
+
+ dow = icaltime_day_of_week(t);
+ /* HACK Not finished */
+
+ icalerror_set_errno(ICAL_UNIMPLEMENTED_ERROR);
+
+ break;
+ }
+
+ case (1<<BY_WEEK_NO) + (1<<BY_MONTH_DAY): {
+ /*FREQ=YEARLY; WEEKNO=20,50; BYMONTH= 6,11 */
+ icalerror_set_errno(ICAL_UNIMPLEMENTED_ERROR);
+ break;
+ }
+
+ case 1<<BY_DAY: {
+ /*FREQ=YEARLY; BYDAY=TH,20MO,-10FR*/
+ pvl_elem i;
+ pvl_list days = expand_by_day(impl,year);
+
+
+ for(i=pvl_head(days);i!=0;i=pvl_next(i)){
+ short day = (short)(intptr_t)pvl_data(i);
+ impl->days[days_index++] = day;
+ }
+
+ pvl_free(days);
+
+ break;
+ }
+
+ case (1<<BY_DAY)+(1<<BY_MONTH): {
+ /*FREQ=YEARLY; BYDAY=TH,20MO,-10FR; BYMONTH = 12*/
+
+
+ for(j=0;impl->by_ptrs[BY_MONTH][j]!=ICAL_RECURRENCE_ARRAY_MAX;j++){
+ int month = impl->by_ptrs[BY_MONTH][j];
+ int days_in_month = icaltime_days_in_month(month,year);
+ int first_dow, last_dow, doy_offset;
+
+ t.year = year;
+ t.month = month;
+ t.day = 1;
+ t.is_date = 1;
+
+ first_dow = icaltime_day_of_week(t);
+
+ /* This holds the day offset used to calculate the day of the year
+ from the month day. Just add the month day to this. */
+ doy_offset = icaltime_day_of_year(t) - 1;
+
+ t.day = days_in_month;
+ last_dow = icaltime_day_of_week(t);
+
+ for(k=0;impl->by_ptrs[BY_DAY][k]!=ICAL_RECURRENCE_ARRAY_MAX;k++){
+ short day_coded = impl->by_ptrs[BY_DAY][k];
+ enum icalrecurrencetype_weekday dow =
+ icalrecurrencetype_day_day_of_week(day_coded);
+ int pos = icalrecurrencetype_day_position(day_coded);
+ int first_matching_day, last_matching_day, day, month_day;
+
+ /* Calculate the first day in the month with the given weekday,
+ and the last day. */
+ first_matching_day = ((dow + 7 - first_dow) % 7) + 1;
+ last_matching_day = days_in_month - ((last_dow + 7 - dow) % 7);
+
+ if (pos == 0) {
+ /* Add all of instances of the weekday within the month. */
+ for (day = first_matching_day; day <= days_in_month; day += 7)
+ impl->days[days_index++] = (short)(doy_offset + day);
+
+ } else if (pos > 0) {
+ /* Add the nth instance of the weekday within the month. */
+ month_day = first_matching_day + (pos - 1) * 7;
+
+ if (month_day <= days_in_month)
+ impl->days[days_index++] = (short)(doy_offset + month_day);
+
+ } else {
+ /* Add the -nth instance of the weekday within the month.*/
+ month_day = last_matching_day + (pos + 1) * 7;
+
+ if (month_day > 0)
+ impl->days[days_index++] = (short)(doy_offset + month_day);
+ }
+ }
+ }
+ break;
+ }
+
+ case (1<<BY_DAY) + (1<<BY_MONTH_DAY) : {
+ /*FREQ=YEARLY; BYDAY=TH,20MO,-10FR; BYMONTHDAY=1,15*/
+
+ pvl_elem itr;
+ pvl_list days = expand_by_day(impl,year);
+
+ for(itr=pvl_head(days);itr!=0;itr=pvl_next(itr)){
+ short day = (short)(intptr_t)pvl_data(itr);
+ struct icaltimetype tt;
+
+ tt = icaltime_from_day_of_year(day,year);
+
+ for(j = 0; BYMDPTR[j]!=ICAL_RECURRENCE_ARRAY_MAX; j++){
+ int mday = BYMDPTR[j];
+
+ if(tt.day == mday){
+ impl->days[days_index++] = day;
+ }
+ }
+
+ }
+
+ pvl_free(days);
+
+ break;
+ }
+
+ case (1<<BY_DAY) + (1<<BY_MONTH_DAY) + (1<<BY_MONTH): {
+ /*FREQ=YEARLY; BYDAY=TH,20MO,-10FR; BYMONTHDAY=10; MYMONTH=6,11*/
+
+ pvl_elem itr;
+ pvl_list days = expand_by_day(impl,year);
+
+ for(itr=pvl_head(days);itr!=0;itr=pvl_next(itr)){
+ short day = (short)(intptr_t)pvl_data(itr);
+ struct icaltimetype tt;
+ int i;
+
+ tt = icaltime_from_day_of_year(day,year);
+
+ for(i = 0; BYMONPTR[i] != ICAL_RECURRENCE_ARRAY_MAX; i++){
+ for(j = 0; BYMDPTR[j]!=ICAL_RECURRENCE_ARRAY_MAX; j++){
+ int mday = BYMDPTR[j];
+ int month = BYMONPTR[i];
+
+ if(tt.month == month && tt.day == mday){
+ impl->days[days_index++] = day;
+ }
+ }
+ }
+
+ }
+
+ pvl_free(days);
+
+ break;
+
+ }
+
+ case (1<<BY_DAY) + (1<<BY_WEEK_NO) : {
+ /*FREQ=YEARLY; BYDAY=TH,20MO,-10FR; WEEKNO=20,50*/
+
+ pvl_elem itr;
+ pvl_list days = expand_by_day(impl,year);
+
+ for(itr=pvl_head(days);itr!=0;itr=pvl_next(itr)){
+ short day = (short)(intptr_t)pvl_data(itr);
+ struct icaltimetype tt;
+ int i;
+
+ tt = icaltime_from_day_of_year(day,year);
+
+ for(i = 0; BYWEEKPTR[i] != ICAL_RECURRENCE_ARRAY_MAX; i++){
+ int weekno = BYWEEKPTR[i];
+ int this_weekno = icaltime_week_number(tt);
+ if(weekno== this_weekno){
+ impl->days[days_index++] = day;
+ }
+ }
+
+ }
+
+ pvl_free(days);
+ break;
+ }
+
+ case (1<<BY_DAY) + (1<<BY_WEEK_NO) + (1<<BY_MONTH_DAY): {
+ /*FREQ=YEARLY; BYDAY=TH,20MO,-10FR; WEEKNO=20,50; BYMONTHDAY=1,15*/
+ icalerror_set_errno(ICAL_UNIMPLEMENTED_ERROR);
+ break;
+ }
+
+ case 1<<BY_YEAR_DAY: {
+ for(j=0;impl->by_ptrs[BY_YEAR_DAY][j]!=ICAL_RECURRENCE_ARRAY_MAX;j++){
+ impl->days[days_index++] = impl->by_ptrs[BY_YEAR_DAY][j];
+ }
+ break;
+ }
+
+ default: {
+ icalerror_set_errno(ICAL_UNIMPLEMENTED_ERROR);
+ break;
+ }
+
+ }
+
+ return 0;
+}
+
+
+static int next_year(icalrecur_iterator* impl)
+{
+ struct icaltimetype next;
+
+ if (next_hour(impl) == 0){
+ return 0;
+ }
+
+ if (impl->days[++impl->days_index] == ICAL_RECURRENCE_ARRAY_MAX){
+ impl->days_index = 0;
+
+ for (;;) {
+ increment_year(impl,impl->rule.interval);
+ expand_year_days(impl,impl->last.year);
+ if (impl->days[0] != ICAL_RECURRENCE_ARRAY_MAX)
+ break;
+ }
+ }
+
+ next = icaltime_from_day_of_year(impl->days[impl->days_index], impl->last.year);
+
+ impl->last.day = next.day;
+ impl->last.month = next.month;
+
+ return 1;
+}
+
+int icalrecur_check_rulepart(icalrecur_iterator* impl,
+ int v, enum byrule byrule)
+{
+ int itr;
+
+ if(impl->by_ptrs[byrule][0]!=ICAL_RECURRENCE_ARRAY_MAX){
+ for(itr=0; impl->by_ptrs[byrule][itr]!=ICAL_RECURRENCE_ARRAY_MAX;itr++){
+ if(impl->by_ptrs[byrule][itr] == v){
+ return 1;
+ }
+ }
+ }
+
+ return 0;
+}
+
+static int check_contract_restriction(icalrecur_iterator* impl,
+ enum byrule byrule, int v)
+{
+ int pass = 0;
+ int itr;
+ icalrecurrencetype_frequency freq = impl->rule.freq;
+
+ if(impl->by_ptrs[byrule][0]!=ICAL_RECURRENCE_ARRAY_MAX &&
+ expand_map[freq].map[byrule] == CONTRACT){
+ for(itr=0; impl->by_ptrs[byrule][itr]!=ICAL_RECURRENCE_ARRAY_MAX;itr++){
+ if(impl->by_ptrs[byrule][itr] == v){
+ pass=1;
+ break;
+ }
+ }
+
+ return pass;
+ } else {
+ /* This is not a contracting byrule, or it has no data, so the
+ test passes*/
+ return 1;
+ }
+}
+
+
+static int check_contracting_rules(icalrecur_iterator* impl)
+{
+
+ int day_of_week = icaltime_day_of_week(impl->last);
+ int week_no = icaltime_week_number(impl->last);
+ int year_day = icaltime_day_of_year(impl->last);
+
+ if (
+ check_contract_restriction(impl,BY_SECOND, impl->last.second) &&
+ check_contract_restriction(impl,BY_MINUTE, impl->last.minute) &&
+ check_contract_restriction(impl,BY_HOUR, impl->last.hour) &&
+ check_contract_restriction(impl,BY_DAY, day_of_week) &&
+ check_contract_restriction(impl,BY_WEEK_NO, week_no) &&
+ check_contract_restriction(impl,BY_MONTH_DAY, impl->last.day) &&
+ check_contract_restriction(impl,BY_MONTH, impl->last.month) &&
+ check_contract_restriction(impl,BY_YEAR_DAY, year_day) )
+ {
+
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+struct icaltimetype icalrecur_iterator_next(icalrecur_iterator *impl)
+{
+ int valid = 1;
+
+ if( (impl->rule.count!=0 &&impl->occurrence_no >= impl->rule.count) ||
+ (!icaltime_is_null_time(impl->rule.until) &&
+ icaltime_compare(impl->last,impl->rule.until) > 0)) {
+ return icaltime_null_time();
+ }
+
+ if(impl->occurrence_no == 0
+ && icaltime_compare(impl->last,impl->dtstart) >= 0){
+
+ impl->occurrence_no++;
+ return impl->last;
+ }
+
+ do {
+ valid = 1;
+ switch(impl->rule.freq){
+
+ case ICAL_SECONDLY_RECURRENCE: {
+ next_second(impl);
+ break;
+ }
+ case ICAL_MINUTELY_RECURRENCE: {
+ next_minute(impl);
+ break;
+ }
+ case ICAL_HOURLY_RECURRENCE: {
+ next_hour(impl);
+ break;
+ }
+ case ICAL_DAILY_RECURRENCE: {
+ next_day(impl);
+ break;
+ }
+ case ICAL_WEEKLY_RECURRENCE: {
+ next_week(impl);
+ break;
+ }
+ case ICAL_MONTHLY_RECURRENCE: {
+ valid = next_month(impl);
+ break;
+ }
+ case ICAL_YEARLY_RECURRENCE:{
+ next_year(impl);
+ break;
+ }
+ default:{
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return icaltime_null_time();
+ }
+ }
+
+ if(impl->last.year >= 2038 ){
+ /* HACK */
+ return icaltime_null_time();
+ }
+
+ } while(!check_contracting_rules(impl)
+ || icaltime_compare(impl->last,impl->dtstart) < 0
+ || valid == 0);
+
+
+/* Ignore null times and times that are after the until time */
+ if( !icaltime_is_null_time(impl->rule.until) &&
+ icaltime_compare(impl->last,impl->rule.until) > 0 ) {
+ return icaltime_null_time();
+ }
+
+ impl->occurrence_no++;
+
+ return impl->last;
+}
+
+
+/************************** Type Routines **********************/
+
+
+void icalrecurrencetype_clear(struct icalrecurrencetype *recur)
+{
+ memset(recur,ICAL_RECURRENCE_ARRAY_MAX_BYTE,
+ sizeof(struct icalrecurrencetype));
+
+ recur->week_start = ICAL_MONDAY_WEEKDAY;
+ recur->freq = ICAL_NO_RECURRENCE;
+ recur->interval = 1;
+ memset(&(recur->until),0,sizeof(struct icaltimetype));
+ recur->count = 0;
+}
+
+/** The 'day' element of icalrecurrencetype_weekday is encoded to
+ * allow representation of both the day of the week ( Monday, Tueday),
+ * but also the Nth day of the week ( First tuesday of the month, last
+ * thursday of the year) These routines decode the day values.
+ *
+ * The day's position in the period ( Nth-ness) and the numerical
+ * value of the day are encoded together as: pos*7 + dow
+ *
+ * A position of 0 means 'any' or 'every'
+ */
+
+enum icalrecurrencetype_weekday icalrecurrencetype_day_day_of_week(short day)
+{
+ return abs(day)%8;
+}
+
+int icalrecurrencetype_day_position(short day)
+{
+ int wd, pos;
+
+ wd = icalrecurrencetype_day_day_of_week(day);
+
+ pos = (abs(day)-wd)/8 * ((day<0)?-1:1);
+
+
+ return pos;
+}
+
+
+/****************** Enumeration Routines ******************/
+
+static struct {icalrecurrencetype_weekday wd; const char * str; }
+wd_map[] = {
+ {ICAL_SUNDAY_WEEKDAY,"SU"},
+ {ICAL_MONDAY_WEEKDAY,"MO"},
+ {ICAL_TUESDAY_WEEKDAY,"TU"},
+ {ICAL_WEDNESDAY_WEEKDAY,"WE"},
+ {ICAL_THURSDAY_WEEKDAY,"TH"},
+ {ICAL_FRIDAY_WEEKDAY,"FR"},
+ {ICAL_SATURDAY_WEEKDAY,"SA"},
+ {ICAL_NO_WEEKDAY,0}
+};
+
+const char* icalrecur_weekday_to_string(icalrecurrencetype_weekday kind)
+{
+ int i;
+
+ for (i=0; wd_map[i].wd != ICAL_NO_WEEKDAY; i++) {
+ if ( wd_map[i].wd == kind) {
+ return wd_map[i].str;
+ }
+ }
+
+ return 0;
+}
+
+icalrecurrencetype_weekday icalrecur_string_to_weekday(const char* str)
+{
+ int i;
+
+ for (i=0; wd_map[i].wd != ICAL_NO_WEEKDAY; i++) {
+ if ( strcasecmp(str,wd_map[i].str) == 0){
+ return wd_map[i].wd;
+ }
+ }
+
+ return ICAL_NO_WEEKDAY;
+}
+
+
+
+static struct {
+ icalrecurrencetype_frequency kind;
+ const char* str;
+} freq_map[] = {
+ {ICAL_SECONDLY_RECURRENCE,"SECONDLY"},
+ {ICAL_MINUTELY_RECURRENCE,"MINUTELY"},
+ {ICAL_HOURLY_RECURRENCE,"HOURLY"},
+ {ICAL_DAILY_RECURRENCE,"DAILY"},
+ {ICAL_WEEKLY_RECURRENCE,"WEEKLY"},
+ {ICAL_MONTHLY_RECURRENCE,"MONTHLY"},
+ {ICAL_YEARLY_RECURRENCE,"YEARLY"},
+ {ICAL_NO_RECURRENCE,0}
+};
+
+const char* icalrecur_freq_to_string(icalrecurrencetype_frequency kind)
+{
+ int i;
+
+ for (i=0; freq_map[i].kind != ICAL_NO_RECURRENCE ; i++) {
+ if ( freq_map[i].kind == kind ) {
+ return freq_map[i].str;
+ }
+ }
+ return 0;
+}
+
+icalrecurrencetype_frequency icalrecur_string_to_freq(const char* str)
+{
+ int i;
+
+ for (i=0; freq_map[i].kind != ICAL_NO_RECURRENCE ; i++) {
+ if ( strcasecmp(str,freq_map[i].str) == 0){
+ return freq_map[i].kind;
+ }
+ }
+ return ICAL_NO_RECURRENCE;
+}
+
+/** Fill an array with the 'count' number of occurrences generated by
+ * the rrule. Note that the times are returned in UTC, but the times
+ * are calculated in local time. YOu will have to convert the results
+ * back into local time before using them.
+ */
+
+int icalrecur_expand_recurrence(char* rule, time_t start,
+ int count, time_t* array)
+{
+ struct icalrecurrencetype recur;
+ icalrecur_iterator* ritr;
+ time_t tt;
+ struct icaltimetype icstart, next;
+ int i = 0;
+
+ memset(array, 0, count*sizeof(time_t));
+
+ icstart = icaltime_from_timet_with_zone(start,0,0);
+
+ recur = icalrecurrencetype_from_string(rule);
+
+ for(ritr = icalrecur_iterator_new(recur,icstart),
+ next = icalrecur_iterator_next(ritr);
+ !icaltime_is_null_time(next) && i < count;
+ next = icalrecur_iterator_next(ritr)){
+
+ tt = icaltime_as_timet(next);
+
+ if (tt >= start ){
+ array[i++] = tt;
+ }
+
+ }
+
+ icalrecur_iterator_free(ritr);
+
+ return 1;
+}
diff --git a/libkcal/libical/src/libical/icalrecur.h b/libkcal/libical/src/libical/icalrecur.h
new file mode 100644
index 00000000..da186f86
--- /dev/null
+++ b/libkcal/libical/src/libical/icalrecur.h
@@ -0,0 +1,215 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalrecur.h
+ CREATOR: eric 20 March 2000
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ 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/
+*/
+
+/**
+@file icalrecur.h
+@brief Routines for dealing with recurring time
+
+How to use:
+
+1) Get a rule and a start time from a component
+
+@code
+ icalproperty rrule;
+ struct icalrecurrencetype recur;
+ struct icaltimetype dtstart;
+
+ rrule = icalcomponent_get_first_property(comp,ICAL_RRULE_PROPERTY);
+ recur = icalproperty_get_rrule(rrule);
+ start = icalproperty_get_dtstart(dtstart);
+@endcode
+
+Or, just make them up:
+
+@code
+ recur = icalrecurrencetype_from_string("FREQ=YEARLY;BYDAY=SU,WE");
+ dtstart = icaltime_from_string("19970101T123000")
+@endcode
+
+2) Create an iterator
+
+@code
+ icalrecur_iterator* ritr;
+ ritr = icalrecur_iterator_new(recur,start);
+@endcode
+
+3) Iterator over the occurrences
+
+@code
+ struct icaltimetype next;
+ while (next = icalrecur_iterator_next(ritr)
+ && !icaltime_is_null_time(next){
+ Do something with next
+ }
+@endcode
+
+Note that that the time returned by icalrecur_iterator_next is in
+whatever timezone that dtstart is in.
+
+*/
+
+#ifndef ICALRECUR_H
+#define ICALRECUR_H
+
+#include <time.h>
+#include "icaltime.h"
+
+/*
+ * Recurrance enumerations
+ */
+
+typedef enum icalrecurrencetype_frequency
+{
+ /* These enums are used to index an array, so don't change the
+ order or the integers */
+
+ ICAL_SECONDLY_RECURRENCE=0,
+ ICAL_MINUTELY_RECURRENCE=1,
+ ICAL_HOURLY_RECURRENCE=2,
+ ICAL_DAILY_RECURRENCE=3,
+ ICAL_WEEKLY_RECURRENCE=4,
+ ICAL_MONTHLY_RECURRENCE=5,
+ ICAL_YEARLY_RECURRENCE=6,
+ ICAL_NO_RECURRENCE=7
+
+} icalrecurrencetype_frequency;
+
+typedef enum icalrecurrencetype_weekday
+{
+ ICAL_NO_WEEKDAY,
+ ICAL_SUNDAY_WEEKDAY,
+ ICAL_MONDAY_WEEKDAY,
+ ICAL_TUESDAY_WEEKDAY,
+ ICAL_WEDNESDAY_WEEKDAY,
+ ICAL_THURSDAY_WEEKDAY,
+ ICAL_FRIDAY_WEEKDAY,
+ ICAL_SATURDAY_WEEKDAY
+} icalrecurrencetype_weekday;
+
+enum {
+ ICAL_RECURRENCE_ARRAY_MAX = 0x7f7f,
+ ICAL_RECURRENCE_ARRAY_MAX_BYTE = 0x7f
+};
+
+
+
+/**
+ * Recurrence type routines
+ */
+
+/* See RFC 2445 Section 4.3.10, RECUR Value, for an explaination of
+ the values and fields in struct icalrecurrencetype */
+
+#define ICAL_BY_SECOND_SIZE 61
+#define ICAL_BY_MINUTE_SIZE 61
+#define ICAL_BY_HOUR_SIZE 25
+#define ICAL_BY_DAY_SIZE 364 /* 7 days * 52 weeks */
+#define ICAL_BY_MONTHDAY_SIZE 32
+#define ICAL_BY_YEARDAY_SIZE 367
+#define ICAL_BY_WEEKNO_SIZE 54
+#define ICAL_BY_MONTH_SIZE 13
+#define ICAL_BY_SETPOS_SIZE 367
+
+/** Main struct for holding digested recurrence rules */
+struct icalrecurrencetype
+{
+ icalrecurrencetype_frequency freq;
+
+
+ /* until and count are mutually exclusive. */
+ struct icaltimetype until;
+ int count;
+
+ short interval;
+
+ icalrecurrencetype_weekday week_start;
+
+ /* The BY* parameters can each take a list of values. Here I
+ * assume that the list of values will not be larger than the
+ * range of the value -- that is, the client will not name a
+ * value more than once.
+
+ * Each of the lists is terminated with the value
+ * ICAL_RECURRENCE_ARRAY_MAX unless the the list is full.
+ */
+
+ short by_second[ICAL_BY_SECOND_SIZE];
+ short by_minute[ICAL_BY_MINUTE_SIZE];
+ short by_hour[ICAL_BY_HOUR_SIZE];
+ short by_day[ICAL_BY_DAY_SIZE]; /* Encoded value, see below */
+ short by_month_day[ICAL_BY_MONTHDAY_SIZE];
+ short by_year_day[ ICAL_BY_YEARDAY_SIZE];
+ short by_week_no[ICAL_BY_WEEKNO_SIZE];
+ short by_month[ICAL_BY_MONTH_SIZE];
+ short by_set_pos[ICAL_BY_SETPOS_SIZE];
+};
+
+
+void icalrecurrencetype_clear(struct icalrecurrencetype *r);
+
+/**
+ * Array Encoding
+ *
+ * The 'day' element of the by_day array is encoded to allow
+ * representation of both the day of the week ( Monday, Tueday), but also
+ * the Nth day of the week ( First tuesday of the month, last thursday of
+ * the year) These routines decode the day values
+ */
+
+/** 1 == Monday, etc. */
+enum icalrecurrencetype_weekday icalrecurrencetype_day_day_of_week(short day);
+
+/** 0 == any of day of week. 1 == first, 2 = second, -2 == second to last, etc */
+int icalrecurrencetype_day_position(short day);
+
+
+/** Recurrance rule parser */
+
+/** Convert between strings and recurrencetype structures. */
+struct icalrecurrencetype icalrecurrencetype_from_string(const char* str);
+char* icalrecurrencetype_as_string(struct icalrecurrencetype *recur);
+
+
+/** Recurrence iteration routines */
+
+typedef struct icalrecur_iterator_impl icalrecur_iterator;
+
+/** Create a new recurrence rule iterator */
+icalrecur_iterator* icalrecur_iterator_new(struct icalrecurrencetype rule,
+ struct icaltimetype dtstart);
+
+/** Get the next occurrence from an iterator */
+struct icaltimetype icalrecur_iterator_next(icalrecur_iterator*);
+
+void icalrecur_iterator_decrement_count(icalrecur_iterator*);
+
+/** Free the iterator */
+void icalrecur_iterator_free(icalrecur_iterator*);
+
+/**
+ * Fills array up with at most 'count' time_t values, each
+ * representing an occurrence time in seconds past the POSIX epoch
+ */
+int icalrecur_expand_recurrence(char* rule, time_t start,
+ int count, time_t* array);
+
+
+#endif
diff --git a/libkcal/libical/src/libical/icalrestriction.c.in b/libkcal/libical/src/libical/icalrestriction.c.in
new file mode 100644
index 00000000..b75e562c
--- /dev/null
+++ b/libkcal/libical/src/libical/icalrestriction.c.in
@@ -0,0 +1,503 @@
+/* -*- Mode: C -*- */
+/* ======================================================================
+ File: icalrestriction.c
+
+ (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org
+ ======================================================================*/
+/*#line 7 "icalrestriction.c.in"*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "icalrestriction.h"
+#include "icalenums.h"
+#include "icalerror.h"
+
+#include <assert.h>
+#include <stdio.h> /* For snprintf */
+
+#define TMP_BUF_SIZE 1024
+
+#ifdef WIN32
+#define snprintf _snprintf
+#define strcasecmp stricmp
+#endif
+
+
+/* Define the structs for the restrictions. these data are filled out
+in machine generated code below */
+
+struct icalrestriction_property_record;
+
+typedef const char* (*restriction_func)(struct icalrestriction_property_record* rec,icalcomponent* comp,icalproperty* prop);
+
+
+typedef struct icalrestriction_property_record {
+ icalproperty_method method;
+ icalcomponent_kind component;
+ icalproperty_kind property;
+ icalrestriction_kind restriction;
+ restriction_func function;
+} icalrestriction_property_record;
+
+
+typedef struct icalrestriction_component_record {
+ icalproperty_method method;
+ icalcomponent_kind component;
+ icalcomponent_kind subcomponent;
+ icalrestriction_kind restriction;
+ restriction_func function;
+} icalrestriction_component_record;
+
+icalrestriction_property_record*
+icalrestriction_get_property_restriction(icalproperty_method method,
+ icalcomponent_kind component,
+ icalproperty_kind property);
+icalrestriction_component_record*
+icalrestriction_get_component_restriction(icalproperty_method method,
+ icalcomponent_kind component,
+ icalcomponent_kind subcomponent);
+
+icalrestriction_component_record icalrestriction_component_records[];
+icalrestriction_property_record icalrestriction_property_records[];
+
+icalrestriction_property_record null_prop_record = {ICAL_METHOD_NONE,ICAL_NO_COMPONENT,ICAL_NO_PROPERTY,ICAL_RESTRICTION_UNKNOWN,0};
+icalrestriction_component_record null_comp_record = {ICAL_METHOD_NONE,ICAL_NO_COMPONENT,ICAL_NO_COMPONENT,ICAL_RESTRICTION_UNKNOWN,0};
+
+
+/** Each row gives the result of comparing a restriction against a count.
+ The columns in each row represent 0,1,2+. '-1' indicates
+ 'invalid, 'don't care' or 'needs more analysis' So, for
+ ICAL_RESTRICTION_ONE, if there is 1 of a property with that
+ restriction, it passes, but if there are 0 or 2+, it fails. */
+
+char compare_map[ICAL_RESTRICTION_UNKNOWN+1][3] = {
+ { 1, 1, 1},/*ICAL_RESTRICTION_NONE*/
+ { 1, 0, 0},/*ICAL_RESTRICTION_ZERO*/
+ { 0, 1, 0},/*ICAL_RESTRICTION_ONE*/
+ { 1, 1, 1},/*ICAL_RESTRICTION_ZEROPLUS*/
+ { 0, 1, 1},/*ICAL_RESTRICTION_ONEPLUS*/
+ { 1, 1, 0},/*ICAL_RESTRICTION_ZEROORONE*/
+ { 1, 1, 0},/*ICAL_RESTRICTION_ONEEXCLUSIVE*/
+ { 1, 1, 0},/*ICAL_RESTRICTION_ONEMUTUAL*/
+ { 1, 1, 1} /*ICAL_RESTRICTION_UNKNOWN*/
+};
+
+char restr_string_map[ICAL_RESTRICTION_UNKNOWN+1][60] = {
+ "unknown number",/*ICAL_RESTRICTION_NONE*/
+ "0",/*ICAL_RESTRICTION_ZERO*/
+ "1",/*ICAL_RESTRICTION_ONE*/
+ "zero or more",/*ICAL_RESTRICTION_ZEROPLUS*/
+ "one or more" ,/*ICAL_RESTRICTION_ONEPLUS*/
+ "zero or one",/*ICAL_RESTRICTION_ZEROORONE*/
+ "zero or one, exclusive with another property",/*ICAL_RESTRICTION_ONEEXCLUSIVE*/
+ "zero or one, mutual with another property",/*ICAL_RESTRICTION_ONEMUTUAL*/
+ "unknown number" /*ICAL_RESTRICTION_UNKNOWN*/
+};
+
+
+int
+icalrestriction_compare(icalrestriction_kind restr, int count){
+
+ /* restr is an unsigned int, ICAL_RESTRICTION_NONE == 0, so the check will always return false */
+ if ( /*restr < ICAL_RESTRICTION_NONE ||*/ restr > ICAL_RESTRICTION_UNKNOWN
+ || count < 0){
+ return -1;
+ }
+
+ if (count > 2) {
+ count = 2;
+ }
+
+ return compare_map[restr][count];
+
+}
+
+/* Special case routines */
+
+const char* icalrestriction_may_be_draft_final_canceled(
+ icalrestriction_property_record *rec,
+ icalcomponent* comp,
+ icalproperty* prop)
+{
+ icalproperty_status stat = icalproperty_get_status(prop);
+
+ (void)rec;
+ (void)comp;
+
+ if( !( stat == ICAL_STATUS_DRAFT ||
+ stat == ICAL_STATUS_FINAL ||
+ stat == ICAL_STATUS_CANCELLED )){
+
+ return "Failed iTIP restrictions for STATUS property. Value must be one of DRAFT, FINAL, or CANCELED";
+
+ }
+
+ return 0;
+}
+
+const char* icalrestriction_may_be_comp_need_process(
+ icalrestriction_property_record *rec,
+ icalcomponent* comp,
+ icalproperty* prop)
+{
+ icalproperty_status stat = icalproperty_get_status(prop);
+
+ (void)rec;
+ (void)comp;
+
+ if( !( stat == ICAL_STATUS_COMPLETED ||
+ stat == ICAL_STATUS_NEEDSACTION ||
+ stat == ICAL_STATUS_INPROCESS )){
+
+ return "Failed iTIP restrictions for STATUS property. Value must be one of COMPLETED, NEEDS-ACTION or IN-PROCESS";
+
+ }
+
+ return 0;
+}
+const char* icalrestriction_may_be_tent_conf(icalrestriction_property_record *rec,
+ icalcomponent* comp,
+ icalproperty* prop)
+{
+ icalproperty_status stat = icalproperty_get_status(prop);
+
+ (void)rec;
+ (void)comp;
+
+ if( !( stat == ICAL_STATUS_TENTATIVE ||
+ stat == ICAL_STATUS_CONFIRMED )){
+
+ return "Failed iTIP restrictions for STATUS property. Value must be one of TENTATIVE or CONFIRMED";
+
+ }
+
+ return 0;
+}
+const char* icalrestriction_may_be_tent_conf_cancel(
+ icalrestriction_property_record *rec,
+ icalcomponent* comp,
+ icalproperty* prop)
+{
+ icalproperty_status stat = icalproperty_get_status(prop);
+
+ (void)rec;
+ (void)comp;
+
+ if( !( stat == ICAL_STATUS_TENTATIVE ||
+ stat == ICAL_STATUS_CONFIRMED ||
+ stat == ICAL_STATUS_CANCELLED )){
+
+ return "Failed iTIP restrictions for STATUS property. Value must be one of TENTATIVE, CONFIRMED or CANCELED";
+
+ }
+
+ return 0;
+}
+
+const char* icalrestriction_must_be_cancel_if_present(
+ icalrestriction_property_record *rec,
+ icalcomponent* comp,
+ icalproperty* prop)
+{
+ /* This routine will not be called if prop == 0 */
+ icalproperty_status stat = icalproperty_get_status(prop);
+
+ (void)rec;
+ (void)comp;
+
+ if( stat != ICAL_STATUS_CANCELLED)
+ {
+ return "Failed iTIP restrictions for STATUS property. Value must be CANCELLED";
+
+ }
+
+
+ return 0;
+}
+
+const char* icalrestriction_must_be_canceled_no_attendee(
+ icalrestriction_property_record *rec,
+ icalcomponent* comp,
+ icalproperty* prop)
+{
+ (void)rec;
+ (void)comp;
+ (void)prop;
+
+ /* Hack. see rfc2446, 3.2.5 CANCEL for porperty STATUS. I don't
+ understand the note */
+
+ return 0;
+}
+const char* icalrestriction_must_be_recurring(icalrestriction_property_record *rec,
+ icalcomponent* comp,
+ icalproperty* prop){
+ /* Hack */
+ (void)rec;
+ (void)comp;
+ (void)prop;
+ return 0;
+}
+const char* icalrestriction_must_have_duration(icalrestriction_property_record *rec,
+ icalcomponent* comp,
+ icalproperty* prop){
+
+ (void)rec;
+ (void)prop;
+
+ if( !icalcomponent_get_first_property(comp,ICAL_DURATION_PROPERTY)){
+
+ return "Failed iTIP restrictions for DURATION property. This component must have a DURATION property";
+
+ }
+
+ return 0;
+}
+const char* icalrestriction_must_have_repeat(icalrestriction_property_record *rec,
+ icalcomponent* comp,
+ icalproperty* prop){
+ (void)rec;
+ (void)prop;
+ if( !icalcomponent_get_first_property(comp,ICAL_REPEAT_PROPERTY)){
+
+ return "Failed iTIP restrictions for REPEAT property. This component must have a REPEAT property";
+
+ }
+
+ return 0;
+}
+const char* icalrestriction_must_if_tz_ref(icalrestriction_property_record *rec,
+ icalcomponent* comp,
+ icalproperty* prop){
+
+ /* Hack */
+ (void)rec;
+ (void)comp;
+ (void)prop;
+ return 0;
+}
+const char* icalrestriction_no_dtend(icalrestriction_property_record *rec,
+ icalcomponent* comp,
+ icalproperty* prop){
+
+ (void)rec;
+ (void)prop;
+ if( !icalcomponent_get_first_property(comp,ICAL_DTEND_PROPERTY)){
+
+ return "Failed iTIP restrictions for DTEND property. The component must not have both DURATION and DTEND";
+
+ }
+
+ return 0;
+}
+const char* icalrestriction_no_duration(icalrestriction_property_record *rec,
+ icalcomponent* comp,
+ icalproperty* prop){
+ (void)rec;
+ (void)comp;
+ (void)prop;
+
+ /* _no_dtend takes care of this one */
+ return 0;
+}
+const char* icalrestriction_must_be_email(
+ icalrestriction_property_record *rec,
+ icalcomponent* comp,
+ icalproperty* prop)
+{
+ icalproperty_status stat = icalproperty_get_action(prop);
+
+ (void)rec;
+ (void)comp;
+
+ if( !( stat == ICAL_ACTION_EMAIL)){
+
+ return "Failed iTIP restrictions for ACTION property. Value must be EMAIL.";
+
+ }
+
+ return 0;
+}
+
+int icalrestriction_check_component(icalproperty_method method,
+ icalcomponent* comp)
+{
+ icalproperty_kind kind;
+ icalcomponent_kind comp_kind;
+ icalrestriction_kind restr;
+ icalrestriction_property_record *prop_record;
+ const char* funcr = 0;
+ icalproperty *prop;
+
+ int count;
+ int compare;
+ int valid = 1;
+
+ comp_kind = icalcomponent_isa(comp);
+
+ /* Check all of the properties in this component */
+
+ for(kind = ICAL_ANY_PROPERTY+1; kind != ICAL_NO_PROPERTY; kind++){
+ count = icalcomponent_count_properties(comp, kind);
+
+ prop_record = icalrestriction_get_property_restriction(method,
+ comp_kind,
+ kind);
+
+ restr = prop_record->restriction;
+
+ if(restr == ICAL_RESTRICTION_ONEEXCLUSIVE ||
+ restr == ICAL_RESTRICTION_ONEMUTUAL) {
+
+ /* First treat is as a 0/1 restriction */
+ restr = ICAL_RESTRICTION_ZEROORONE;
+ compare = icalrestriction_compare(restr,count);
+
+ } else {
+
+ compare = icalrestriction_compare(restr,count);
+ }
+
+ assert(compare != -1);
+
+ if (compare == 0){
+ char temp[TMP_BUF_SIZE];
+
+ snprintf(temp, TMP_BUF_SIZE,"Failed iTIP restrictions for %s property. Expected %s instances of the property and got %d",
+ icalenum_property_kind_to_string(kind),
+ restr_string_map[restr], count);
+
+ icalcomponent_add_property
+ (comp,
+ icalproperty_vanew_xlicerror(
+ temp,
+ icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_INVALIDITIP),
+ 0));
+ }
+
+
+ prop = icalcomponent_get_first_property(comp, kind);
+
+ if (prop != 0 && prop_record->function !=0 ){
+ funcr = prop_record->function(prop_record,comp,prop);
+ }
+
+ if(funcr !=0){
+ icalcomponent_add_property
+ (comp,
+ icalproperty_vanew_xlicerror(
+ funcr,
+ icalparameter_new_xlicerrortype(
+ ICAL_XLICERRORTYPE_INVALIDITIP),
+ 0));
+
+ compare = 0;
+ }
+
+ valid = valid && compare;
+ }
+
+
+
+ return valid;
+
+
+}
+
+int icalrestriction_check(icalcomponent* outer_comp)
+{
+ icalcomponent_kind comp_kind;
+ icalproperty_method method;
+ icalcomponent* inner_comp;
+ icalproperty *method_prop;
+ int valid;
+
+ icalerror_check_arg_rz( (outer_comp!=0), "outer comp");
+
+
+ /* Get the Method value from the outer component */
+
+ comp_kind = icalcomponent_isa(outer_comp);
+
+ if (comp_kind != ICAL_VCALENDAR_COMPONENT){
+ icalerror_set_errno(ICAL_BADARG_ERROR);
+ return 0;
+ }
+
+ method_prop = icalcomponent_get_first_property(outer_comp,
+ ICAL_METHOD_PROPERTY);
+
+ if (method_prop == 0){
+ method = ICAL_METHOD_NONE;
+ } else {
+ method = icalproperty_get_method(method_prop);
+ }
+
+
+ /* Check the VCALENDAR wrapper */
+ valid = icalrestriction_check_component(ICAL_METHOD_NONE,outer_comp);
+
+
+ /* Now check the inner components */
+
+ for(inner_comp= icalcomponent_get_first_component(outer_comp,
+ ICAL_ANY_COMPONENT);
+ inner_comp != 0;
+ inner_comp= icalcomponent_get_next_component(outer_comp,
+ ICAL_ANY_COMPONENT)){
+
+ valid = valid && icalrestriction_check_component(method,inner_comp);
+
+ }
+
+
+ return valid;
+
+}
+
+icalrestriction_property_record*
+icalrestriction_get_property_restriction(icalproperty_method method,
+ icalcomponent_kind component,
+ icalproperty_kind property)
+{
+ int i;
+
+ for(i = 0;
+ icalrestriction_property_records[i].restriction != ICAL_RESTRICTION_NONE;
+ i++){
+
+ if (method == icalrestriction_property_records[i].method &&
+ component == icalrestriction_property_records[i].component &&
+ property == icalrestriction_property_records[i].property ){
+ return &icalrestriction_property_records[i];
+ }
+ }
+
+ return &null_prop_record;
+}
+
+
+icalrestriction_component_record*
+icalrestriction_get_component_restriction(icalproperty_method method,
+ icalcomponent_kind component,
+ icalcomponent_kind subcomponent)
+{
+
+ int i;
+
+ for(i = 0;
+ icalrestriction_component_records[i].restriction != ICAL_RESTRICTION_NONE;
+ i++){
+
+ if (method == icalrestriction_component_records[i].method &&
+ component == icalrestriction_component_records[i].component &&
+ subcomponent == icalrestriction_component_records[i].subcomponent ){
+ return &icalrestriction_component_records[i];
+ }
+ }
+
+ return &null_comp_record;
+}
+
diff --git a/libkcal/libical/src/libical/icalrestriction.h b/libkcal/libical/src/libical/icalrestriction.h
new file mode 100644
index 00000000..b5281215
--- /dev/null
+++ b/libkcal/libical/src/libical/icalrestriction.h
@@ -0,0 +1,63 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalrestriction.h
+ CREATOR: eric 24 April 1999
+
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The original code is icalrestriction.h
+
+ Contributions from:
+ Graham Davison (g.m.davison@computer.org)
+
+
+======================================================================*/
+
+#include "icalproperty.h"
+#include "icalcomponent.h"
+
+#ifndef ICALRESTRICTION_H
+#define ICALRESTRICTION_H
+
+/* These must stay in this order for icalrestriction_compare to work */
+typedef enum icalrestriction_kind {
+ ICAL_RESTRICTION_NONE=0, /* 0 */
+ ICAL_RESTRICTION_ZERO, /* 1 */
+ ICAL_RESTRICTION_ONE, /* 2 */
+ ICAL_RESTRICTION_ZEROPLUS, /* 3 */
+ ICAL_RESTRICTION_ONEPLUS, /* 4 */
+ ICAL_RESTRICTION_ZEROORONE, /* 5 */
+ ICAL_RESTRICTION_ONEEXCLUSIVE, /* 6 */
+ ICAL_RESTRICTION_ONEMUTUAL, /* 7 */
+ ICAL_RESTRICTION_UNKNOWN /* 8 */
+} icalrestriction_kind;
+
+int
+icalrestriction_compare(icalrestriction_kind restr, int count);
+
+
+int
+icalrestriction_is_parameter_allowed(icalproperty_kind property,
+ icalparameter_kind parameter);
+
+int icalrestriction_check(icalcomponent* comp);
+
+
+#endif /* !ICALRESTRICTION_H */
+
+
+
diff --git a/libkcal/libical/src/libical/icaltime.c b/libkcal/libical/src/libical/icaltime.c
new file mode 100644
index 00000000..514322a3
--- /dev/null
+++ b/libkcal/libical/src/libical/icaltime.c
@@ -0,0 +1,1014 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icaltime.c
+ CREATOR: eric 02 June 2000
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The Original Code is eric. The Initial Developer of the Original
+ Code is Eric Busboom
+
+
+ ======================================================================*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "icaltime.h"
+#include <assert.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+
+#include "astime.h" /* Julian data handling routines */
+
+#include "icalerror.h"
+#include "icalmemory.h"
+
+#include "icaltimezone.h"
+#include "icalvalue.h"
+
+#ifdef WIN32
+#include <Windows.h>
+
+#define snprintf _snprintf
+#define strcasecmp stricmp
+#endif
+
+/*
+ * Function to convert a struct tm time specification
+ * to an ANSI time_t using the specified time zone.
+ * This is different from the standard mktime() function
+ * in that we don't want the automatic adjustments for
+ * local daylight savings time applied to the result.
+ * This function expects well-formed input.
+ */
+static time_t make_time(struct tm *tm, int tzm)
+{
+ time_t tim;
+
+ static int days[] = { -1, 30, 58, 89, 119, 150, 180, 211, 242, 272, 303, 333, 364 };
+
+ /* check that year specification within range */
+
+ if (tm->tm_year < 70 || tm->tm_year > 138)
+ return((time_t) -1);
+
+ /* check that month specification within range */
+
+ if (tm->tm_mon < 0 || tm->tm_mon > 11)
+ return((time_t) -1);
+
+ /* check for upper bound of Jan 17, 2038 (to avoid possibility of
+ 32-bit arithmetic overflow) */
+
+ if (tm->tm_year == 138) {
+ if (tm->tm_mon > 0)
+ return((time_t) -1);
+ else if (tm->tm_mday > 17)
+ return((time_t) -1);
+ }
+
+ /*
+ * calculate elapsed days since start of the epoch (midnight Jan
+ * 1st, 1970 UTC) 17 = number of leap years between 1900 and 1970
+ * (number of leap days to subtract)
+ */
+
+ tim = (tm->tm_year - 70) * 365 + ((tm->tm_year - 1) / 4) - 17;
+
+ /* add number of days elapsed in the current year */
+
+ tim += days[tm->tm_mon];
+
+ /* check and adjust for leap years (the leap year check only valid
+ during the 32-bit era */
+
+ if ((tm->tm_year & 3) == 0 && tm->tm_mon > 1)
+ tim += 1;
+
+ /* elapsed days to current date */
+
+ tim += tm->tm_mday;
+
+
+ /* calculate elapsed hours since start of the epoch */
+
+ tim = tim * 24 + tm->tm_hour;
+
+ /* calculate elapsed minutes since start of the epoch */
+
+ tim = tim * 60 + tm->tm_min;
+
+ /* adjust per time zone specification */
+
+ tim -= tzm;
+
+ /* calculate elapsed seconds since start of the epoch */
+
+ tim = tim * 60 + tm->tm_sec;
+
+ /* return number of seconds since start of the epoch */
+
+ return(tim);
+}
+
+/** @brief Constructor (deprecated).
+ *
+ * Convert seconds past UNIX epoch to a timetype.
+ *
+ * @deprecated This constructor is deprecated and shouldn't be used in
+ * new software. Use icaltime_from_timet_with_zone(time_t, int,
+ * icaltimezone *) instead. In the meantime, calls to this method
+ * return a floating time, which can always be converted to a local
+ * time with an appropriate call to icaltime_convert_to_zone().
+ */
+
+struct icaltimetype
+icaltime_from_timet(const time_t tm, const int is_date)
+{
+#ifndef NO_WARN_DEPRECATED
+ icalerror_warn("icaltime_from_timet() is DEPRECATED, use icaltime_from_timet_with_zone() instead");
+#endif
+
+ return icaltime_from_timet_with_zone(tm, is_date, 0);
+}
+
+
+/** @brief Constructor.
+ *
+ * @param tm The time
+ * @param is_date Boolean: 1 means we should treat tm as a DATE
+ * @param zone The timezone tm is in, NULL means to treat tm as a
+ * floating time
+ *
+ * Return a new icaltime instance, initialized to the given time
+ * expressed as seconds past UNIX epoch, optionally using the given
+ * timezone.
+ *
+ * If the caller specifies the is_date param as TRUE, the returned
+ * object is of DATE type, otherwise the input is meant to be of
+ * DATE-TIME type.
+ * If the zone is not specified (NULL zone param) the time is taken
+ * to be floating, that is, valid in any timezone. Note that, in
+ * addition to the uses specified in [RFC2445], this can be used
+ * when doing simple math on couples of times.
+ * If the zone is specified (UTC or otherwise), it's stored in the
+ * object and it's used as the native timezone for this object.
+ * This means that the caller can convert this time to a different
+ * target timezone with no need to store the source timezone.
+ *
+ */
+struct icaltimetype
+icaltime_from_timet_with_zone(const time_t tm, const int is_date,
+ icaltimezone *zone)
+{
+ struct icaltimetype tt = icaltime_null_time();
+ struct tm t;
+ icaltimezone *utc_zone;
+
+ /* Convert the time_t to a struct tm. We can trust gmtime for this. */
+#ifdef HAVE_GMTIME_R
+ gmtime_r(&tm, &t);
+#else
+ {
+ struct tm *t_ptr = gmtime(&tm);
+ t = *t_ptr;
+ }
+#endif
+
+ tt.year = t.tm_year + 1900;
+ tt.month = t.tm_mon + 1;
+ tt.day = t.tm_mday;
+
+ if (is_date) {
+ tt.is_date = 1;
+ return tt;
+ }
+
+ tt.hour = t.tm_hour;
+ tt.minute = t.tm_min;
+ tt.second = t.tm_sec;
+
+ /* If it's a floating time, we don't do any conversion. */
+ if (zone == NULL) {
+ return tt;
+ }
+
+ utc_zone = icaltimezone_get_utc_timezone ();
+ tt.is_utc = (zone == utc_zone) ? 1 : 0;
+ tt.zone = zone;
+
+ return tt;
+}
+
+/** @brief Convenience constructor.
+ *
+ * Returns the current time in the given timezone, as an icaltimetype.
+ */
+struct icaltimetype icaltime_current_time_with_zone(icaltimezone *zone)
+{
+ return icaltime_from_timet_with_zone (time (NULL), 0, zone);
+}
+
+/** @brief Convenience constructor.
+ *
+ * Returns the current day as an icaltimetype, with is_date set.
+ */
+struct icaltimetype icaltime_today(void)
+{
+ return icaltime_from_timet_with_zone (time (NULL), 1, NULL);
+}
+
+/** @brief Return the time as seconds past the UNIX epoch
+ */
+time_t icaltime_as_timet(const struct icaltimetype tt)
+{
+ struct tm stm;
+ time_t t;
+
+ /* If the time is the special null time, return 0. */
+ if (icaltime_is_null_time(tt)) {
+ return 0;
+ }
+
+ /* Copy the icaltimetype to a struct tm. */
+ memset (&stm, 0, sizeof (struct tm));
+
+ stm.tm_sec = tt.second;
+ stm.tm_min = tt.minute;
+ stm.tm_hour = tt.hour;
+ stm.tm_mday = tt.day;
+ stm.tm_mon = tt.month-1;
+ stm.tm_year = tt.year-1900;
+ stm.tm_isdst = -1;
+
+ t = make_time(&stm, 0);
+
+ return t;
+
+}
+
+/** @brief Return the time as seconds past the UNIX epoch, using the
+ * given timezone.
+ *
+ * This convenience method combines a call to icaltime_convert() with
+ * a call to icaltime_as_timet().
+ * If the input timezone is null, no conversion is done; that is, the
+ * time is simply returned as time_t in its native timezone.
+ */
+time_t icaltime_as_timet_with_zone(const struct icaltimetype _tt,
+ icaltimezone *zone)
+{
+ struct icaltimetype tt = _tt;
+ struct tm stm;
+ time_t t;
+
+ /* If the time is the special null time, return 0. */
+ if (icaltime_is_null_time(tt)) {
+ return 0;
+ }
+
+ if (zone != NULL) {
+ tt = icaltime_convert_to_zone(_tt, zone);
+ }
+
+ /* Copy the icaltimetype to a struct tm. */
+ memset (&stm, 0, sizeof (struct tm));
+
+ stm.tm_sec = tt.second;
+ stm.tm_min = tt.minute;
+ stm.tm_hour = tt.hour;
+ stm.tm_mday = tt.day;
+ stm.tm_mon = tt.month-1;
+ stm.tm_year = tt.year-1900;
+ stm.tm_isdst = -1;
+
+ t = make_time(&stm, 0);
+
+ return t;
+}
+
+/**
+ * Return a string represention of the time, in RFC2445 format. The
+ * string is owned by libical
+ */
+const char* icaltime_as_ical_string(const struct icaltimetype tt)
+{
+ size_t size = 17;
+ char* buf = icalmemory_new_buffer(size);
+
+ if(tt.is_date){
+ snprintf(buf, size,"%04d%02d%02d",tt.year,tt.month,tt.day);
+ } else {
+ const char* fmt;
+ if(tt.is_utc){
+ fmt = "%04d%02d%02dT%02d%02d%02dZ";
+ } else {
+ fmt = "%04d%02d%02dT%02d%02d%02d";
+ }
+ snprintf(buf, size,fmt,tt.year,tt.month,tt.day,
+ tt.hour,tt.minute,tt.second);
+ }
+
+ icalmemory_add_tmp_buffer(buf);
+
+ return buf;
+
+}
+
+/**
+ * Reset all of the time components to be in their normal ranges. For
+ * instance, given a time with minutes=70, the minutes will be reduces
+ * to 10, and the hour incremented. This allows the caller to do
+ * arithmetic on times without worrying about overflow or
+ * underflow.
+ *
+ * Implementation note: we call icaltime_adjust() with no adjustment.
+ */
+struct icaltimetype icaltime_normalize(const struct icaltimetype tt)
+{
+ struct icaltimetype ret = tt;
+ icaltime_adjust(&ret, 0, 0, 0, 0);
+ return ret;
+}
+
+
+
+/** @brief Contructor.
+ *
+ * Create a time from an ISO format string.
+ *
+ * @todo If the given string specifies a DATE-TIME not in UTC, there
+ * is no way to know if this is a floating time or really refers to a
+ * timezone. We should probably add a new constructor:
+ * icaltime_from_string_with_zone()
+ */
+struct icaltimetype icaltime_from_string(const char* str)
+{
+ struct icaltimetype tt = icaltime_null_time();
+ int size;
+
+ icalerror_check_arg_re(str!=0,"str",icaltime_null_time());
+
+ size = strlen(str);
+
+ if(size == 15) { /* floating time */
+ tt.is_utc = 0;
+ tt.is_date = 0;
+ } else if (size == 16) { /* UTC time, ends in 'Z'*/
+ if(str[15] != 'Z')
+ goto errorlabel;
+
+ tt.is_utc = 1;
+ tt.zone = icaltimezone_get_utc_timezone();
+ tt.is_date = 0;
+ } else if (size == 8) { /* A DATE */
+ tt.is_utc = 1;
+ tt.is_date = 1;
+ } else { /* error */
+ goto errorlabel;
+ }
+
+ if(tt.is_date == 1){
+ if (sscanf(str,"%04d%02d%02d",&tt.year,&tt.month,&tt.day) < 3)
+ goto errorlabel;
+ } else {
+ char tsep;
+ if (sscanf(str,"%04d%02d%02d%c%02d%02d%02d",&tt.year,&tt.month,&tt.day,
+ &tsep,&tt.hour,&tt.minute,&tt.second) < 7)
+ goto errorlabel;
+
+ if(tsep != 'T')
+ goto errorlabel;
+ }
+
+ return tt;
+
+errorlabel:
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return icaltime_null_time();
+}
+
+
+/* Returns whether the specified year is a leap year. Year is the normal year,
+ e.g. 2001. */
+int
+icaltime_is_leap_year (const int year)
+{
+
+ if (year <= 1752)
+ return (year % 4 == 0);
+ else
+ return ( (year % 4==0) && (year % 100 !=0 )) || (year % 400 == 0);
+}
+
+static int _days_in_month[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
+
+int icaltime_days_in_month(const int month, const int year)
+{
+
+ int days = _days_in_month[month];
+
+ assert(month > 0);
+ assert(month <= 12);
+
+ if( month == 2){
+ days += icaltime_is_leap_year(year);
+ }
+
+ return days;
+}
+
+/* 1-> Sunday, 7->Saturday */
+int icaltime_day_of_week(const struct icaltimetype t){
+ UTinstant jt;
+
+ memset(&jt,0,sizeof(UTinstant));
+
+ jt.year = t.year;
+ jt.month = t.month;
+ jt.day = t.day;
+ jt.i_hour = 0;
+ jt.i_minute = 0;
+ jt.i_second = 0;
+
+ juldat(&jt);
+
+ return jt.weekday + 1;
+}
+
+/** Day of the year that the first day of the week (Sunday) is on.
+ *
+ * @todo Doesn't take into account different week start days.
+ */
+int icaltime_start_doy_of_week(const struct icaltimetype t){
+ UTinstant jt;
+
+ memset(&jt,0,sizeof(UTinstant));
+
+ jt.year = t.year;
+ jt.month = t.month;
+ jt.day = t.day;
+ jt.i_hour = 0;
+ jt.i_minute = 0;
+ jt.i_second = 0;
+
+ juldat(&jt);
+ caldat(&jt);
+
+ return jt.day_of_year - jt.weekday;
+}
+
+/**
+ * @todo Doesn't take into account the start day of the
+ * week. strftime assumes that weeks start on Monday.
+ */
+int icaltime_week_number(const struct icaltimetype ictt)
+{
+ UTinstant jt;
+
+ memset(&jt,0,sizeof(UTinstant));
+
+ jt.year = ictt.year;
+ jt.month = ictt.month;
+ jt.day = ictt.day;
+ jt.i_hour = 0;
+ jt.i_minute = 0;
+ jt.i_second = 0;
+
+ juldat(&jt);
+ caldat(&jt);
+
+ return (jt.day_of_year - jt.weekday) / 7;
+}
+
+/* The first array is for non-leap years, the second for leap years*/
+static const int days_in_year[2][13] =
+{ /* jan feb mar apr may jun jul aug sep oct nov dec */
+ { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
+ { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
+};
+
+/**
+ * Returns the day of the year, counting from 1 (Jan 1st).
+ */
+int icaltime_day_of_year(const struct icaltimetype t){
+ int is_leap = icaltime_is_leap_year (t.year);
+
+ return days_in_year[is_leap][t.month - 1] + t.day;
+}
+
+/** @brief Contructor.
+ *
+ * Create a new time, given a day of year and a year.
+ */
+/* Jan 1 is day #1, not 0 */
+struct icaltimetype icaltime_from_day_of_year(const int _doy, const int _year)
+{
+ struct icaltimetype tt = icaltime_null_date();
+ int is_leap;
+ int month;
+ int doy = _doy;
+ int year = _year;
+
+ is_leap = icaltime_is_leap_year(year);
+
+ /* Zero and neg numbers represent days of the previous year */
+ if(doy <1){
+ year--;
+ is_leap = icaltime_is_leap_year(year);
+ doy += days_in_year[is_leap][12];
+ } else if(doy > days_in_year[is_leap][12]){
+ /* Move on to the next year*/
+ is_leap = icaltime_is_leap_year(year);
+ doy -= days_in_year[is_leap][12];
+ year++;
+ }
+
+ tt.year = year;
+
+ for (month = 11; month >= 0; month--) {
+ if (doy > days_in_year[is_leap][month]) {
+ tt.month = month + 1;
+ tt.day = doy - days_in_year[is_leap][month];
+ break;
+ }
+ }
+
+ return tt;
+}
+
+/** @brief Constructor.
+ *
+ * Return a null time, which indicates no time has been set.
+ * This time represents the beginning of the epoch.
+ */
+struct icaltimetype icaltime_null_time(void)
+{
+ struct icaltimetype t;
+ memset(&t,0,sizeof(struct icaltimetype));
+
+ return t;
+}
+
+/** @brief Constructor.
+ *
+ * Return a null date, which indicates no time has been set.
+ */
+struct icaltimetype icaltime_null_date(void)
+{
+ struct icaltimetype t;
+ memset(&t,0,sizeof(struct icaltimetype));
+
+ t.is_date = 1;
+
+ /*
+ * Init to -1 to match what icalyacc.y used to do.
+ * Does anything depend on this?
+ */
+ t.hour = -1;
+ t.minute = -1;
+ t.second = -1;
+
+ return t;
+}
+
+
+/**
+ * Returns false if the time is clearly invalid, but is not null. This
+ * is usually the result of creating a new time type buy not clearing
+ * it, or setting one of the flags to an illegal value.
+ */
+int icaltime_is_valid_time(const struct icaltimetype t){
+ if(t.is_utc > 1 || t.is_utc < 0 ||
+ t.year < 0 || t.year > 3000 ||
+ t.is_date > 1 || t.is_date < 0){
+ return 0;
+ } else {
+ return 1;
+ }
+
+}
+
+/** @brief Returns true if time is a DATE
+ */
+int icaltime_is_date(const struct icaltimetype t) {
+
+ return t.is_date;
+}
+
+/** @brief Returns true if time is relative to UTC zone
+ *
+ * @todo We should only check the zone
+ */
+int icaltime_is_utc(const struct icaltimetype t) {
+
+ return t.is_utc;
+}
+
+/**
+ * Return true if the time is null.
+ */
+int icaltime_is_null_time(const struct icaltimetype t)
+{
+ if (t.second +t.minute+t.hour+t.day+t.month+t.year == 0){
+ return 1;
+ }
+
+ return 0;
+
+}
+
+/**
+ * Return -1, 0, or 1 to indicate that a<b, a==b, or a>b.
+ * This calls icaltime_compare function after converting them to the utc
+ * timezone.
+ */
+
+int icaltime_compare(const struct icaltimetype a_in, const struct icaltimetype b_in)
+{
+ int retval = 0;
+ struct icaltimetype a, b;
+
+ a = icaltime_convert_to_zone(a_in, icaltimezone_get_utc_timezone());
+ b = icaltime_convert_to_zone(b_in, icaltimezone_get_utc_timezone());
+
+ if (a.year > b.year)
+ retval = 1;
+ else if (a.year < b.year)
+ retval = -1;
+
+ else if (a.month > b.month)
+ retval = 1;
+ else if (a.month < b.month)
+ retval = -1;
+
+ else if (a.day > b.day)
+ retval = 1;
+ else if (a.day < b.day)
+ retval = -1;
+
+ /* if both are dates, we are done */
+ if (a.is_date && b.is_date)
+ return retval;
+
+ /* else, if we already found a difference, we are done */
+ else if (retval != 0)
+ return retval;
+
+ /* else, if only one is a date (and we already know the date part is equal),
+ then the other is greater */
+ else if (b.is_date)
+ retval = 1;
+ else if (a.is_date)
+ retval = -1;
+
+ else if (a.hour > b.hour)
+ retval = 1;
+ else if (a.hour < b.hour)
+ retval = -1;
+
+ else if (a.minute > b.minute)
+ retval = 1;
+ else if (a.minute < b.minute)
+ retval = -1;
+
+ else if (a.second > b.second)
+ retval = 1;
+ else if (a.second < b.second)
+ retval = -1;
+
+ return retval;
+}
+
+/**
+ * like icaltime_compare, but only use the date parts.
+ */
+
+int
+icaltime_compare_date_only(const struct icaltimetype a_in, const struct icaltimetype b_in)
+{
+ int retval;
+ struct icaltimetype a, b;
+
+ a = icaltime_convert_to_zone(a_in, icaltimezone_get_utc_timezone());
+ b = icaltime_convert_to_zone(b_in, icaltimezone_get_utc_timezone());
+
+ if (a.year > b.year)
+ retval = 1;
+ else if (a.year < b.year)
+ retval = -1;
+
+ else if (a.month > b.month)
+ retval = 1;
+ else if (a.month < b.month)
+ retval = -1;
+
+ else if (a.day > b.day)
+ retval = 1;
+ else if (a.day < b.day)
+ retval = -1;
+
+ else
+ retval = 0;
+
+ return retval;
+}
+
+/* These are defined in icalduration.c:
+struct icaltimetype icaltime_add(struct icaltimetype t,
+ struct icaldurationtype d)
+struct icaldurationtype icaltime_subtract(struct icaltimetype t1,
+ struct icaltimetype t2)
+*/
+
+
+
+/** @brief Internal, shouldn't be part of the public API
+ *
+ * Adds (or subtracts) a time from a icaltimetype.
+ * NOTE: This function is exactly the same as icaltimezone_adjust_change()
+ * except for the type of the first parameter.
+ */
+void
+icaltime_adjust(struct icaltimetype *tt, const int days, const int hours,
+ const int minutes, const int seconds) {
+
+ int second, minute, hour, day;
+ int minutes_overflow, hours_overflow, days_overflow, years_overflow;
+ int days_in_month;
+
+ /* Add on the seconds. */
+ second = tt->second + seconds;
+ tt->second = second % 60;
+ minutes_overflow = second / 60;
+ if (tt->second < 0) {
+ tt->second += 60;
+ minutes_overflow--;
+ }
+
+ /* Add on the minutes. */
+ minute = tt->minute + minutes + minutes_overflow;
+ tt->minute = minute % 60;
+ hours_overflow = minute / 60;
+ if (tt->minute < 0) {
+ tt->minute += 60;
+ hours_overflow--;
+ }
+
+ /* Add on the hours. */
+ hour = tt->hour + hours + hours_overflow;
+ tt->hour = hour % 24;
+ days_overflow = hour / 24;
+ if (tt->hour < 0) {
+ tt->hour += 24;
+ days_overflow--;
+ }
+
+ /* Normalize the month. We do this before handling the day since we may
+ need to know what month it is to get the number of days in it.
+ Note that months are 1 to 12, so we have to be a bit careful. */
+ if (tt->month >= 13) {
+ years_overflow = (tt->month - 1) / 12;
+ tt->year += years_overflow;
+ tt->month -= years_overflow * 12;
+ } else if (tt->month <= 0) {
+ /* 0 to -11 is -1 year out, -12 to -23 is -2 years. */
+ years_overflow = (tt->month / 12) - 1;
+ tt->year += years_overflow;
+ tt->month -= years_overflow * 12;
+ }
+
+ /* Add on the days. */
+ day = tt->day + days + days_overflow;
+ if (day > 0) {
+ for (;;) {
+ days_in_month = icaltime_days_in_month (tt->month, tt->year);
+ if (day <= days_in_month)
+ break;
+
+ tt->month++;
+ if (tt->month >= 13) {
+ tt->year++;
+ tt->month = 1;
+ }
+
+ day -= days_in_month;
+ }
+ } else {
+ while (day <= 0) {
+ if (tt->month == 1) {
+ tt->year--;
+ tt->month = 12;
+ } else {
+ tt->month--;
+ }
+
+ day += icaltime_days_in_month (tt->month, tt->year);
+ }
+ }
+ tt->day = day;
+}
+
+/** @brief Convert time to a given timezone
+ *
+ * Convert a time from its native timezone to a given timezone.
+ *
+ * If tt is a date, the returned time is an exact
+ * copy of the input. If it's a floating time, the returned object
+ * represents the same time translated to the given timezone.
+ * Otherwise the time will be converted to the new
+ * time zone, and its native timezone set to the right timezone.
+ */
+struct icaltimetype icaltime_convert_to_zone(const struct icaltimetype tt,
+ icaltimezone *zone) {
+
+ struct icaltimetype ret = tt;
+
+ /* If it's a date do nothing */
+ if (tt.is_date) {
+ return ret;
+ }
+
+ if (tt.zone == zone) {
+ return ret;
+ }
+
+ /* If it's a floating time we don't want to adjust the time */
+ if (tt.zone != NULL) {
+ icaltimezone_convert_time(&ret, tt.zone, zone);
+ }
+
+ ret.zone = zone;
+ if (zone == icaltimezone_get_utc_timezone()) {
+ ret.is_utc = 1;
+ } else {
+ ret.is_utc = 0;
+ }
+
+ return ret;
+}
+
+icaltimezone *
+icaltime_get_timezone(const struct icaltimetype t) {
+
+ return t.zone;
+}
+
+const char *
+icaltime_get_tzid(const struct icaltimetype t) {
+
+ if (t.zone != NULL) {
+ return icaltimezone_get_tzid(t.zone);
+ } else {
+ return NULL;
+ }
+}
+
+/** @brief Set the timezone
+ *
+ * Force the icaltime to be interpreted relative to another timezone.
+ * If you need to do timezone conversion, applying offset adjustments,
+ * then you should use icaltime_convert_to_timezone instead.
+ */
+struct icaltimetype
+icaltime_set_timezone(struct icaltimetype *t, icaltimezone *zone) {
+
+ /* If it's a date do nothing */
+ if (t->is_date) {
+ return *t;
+ }
+
+ if (t->zone == zone) {
+ return *t;
+ }
+
+ t->zone = zone;
+ if (zone == icaltimezone_get_utc_timezone()) {
+ t->is_utc = 1;
+ } else {
+ t->is_utc = 0;
+ }
+
+ return *t;
+}
+
+
+/**
+ * @brief builds an icaltimespan given a start time, end time and busy value.
+ *
+ * @param dtstart The beginning time of the span, can be a date-time
+ * or just a date.
+ * @param dtend The end time of the span.
+ * @param is_busy A boolean value, 0/1.
+ * @return A span using the supplied values.
+ *
+ * returned span contains times specified in UTC.
+ */
+
+icaltime_span icaltime_span_new(struct icaltimetype dtstart,
+ struct icaltimetype dtend,
+ int is_busy)
+{
+ icaltime_span span;
+
+ span.is_busy = is_busy;
+
+ span.start = icaltime_as_timet_with_zone(dtstart,
+ icaltimezone_get_utc_timezone());
+
+ if (icaltime_is_null_time(dtend)) {
+ if (!icaltime_is_date(dtstart)) {
+ /* If dtstart is a DATE-TIME and there is no DTEND nor DURATION
+ it takes no time */
+ span.end = span.start;
+ return span;
+ } else {
+ dtend = dtstart;
+ }
+ }
+
+ span.end = icaltime_as_timet_with_zone(dtend, icaltimezone_get_utc_timezone());
+
+ if (icaltime_is_date(dtstart)) {
+ /* no time specified, go until the end of the day..*/
+ span.end += 60*60*24 - 1;
+ }
+ return span;
+}
+
+
+/** @brief Returns true if the two spans overlap
+ *
+ * @param s1 1st span to test
+ * @param s2 2nd span to test
+ * @return boolean value
+ *
+ * The result is calculated by testing if the start time of s1 is contained
+ * by the s2 span, or if the end time of s1 is contained by the s2 span.
+ *
+ * Also returns true if the spans are equal.
+ *
+ * Note, this will return false if the spans are adjacent.
+ */
+
+int icaltime_span_overlaps(icaltime_span *s1,
+ icaltime_span *s2)
+{
+ /* s1->start in s2 */
+ if (s1->start > s2->start && s1->start < s2->end)
+ return 1;
+
+ /* s1->end in s2 */
+ if (s1->end > s2->start && s1->end < s2->end)
+ return 1;
+
+ /* s2->start in s1 */
+ if (s2->start > s1->start && s2->start < s1->end)
+ return 1;
+
+ /* s2->end in s1 */
+ if (s2->end > s1->start && s2->end < s1->end)
+ return 1;
+
+ if (s1->start == s2->start && s1->end == s2->end)
+ return 1;
+
+ return 0;
+}
+
+/** @brief Returns true if the span is totally within the containing
+ * span
+ *
+ * @param s The span to test for.
+ * @param container The span to test against.
+ * @return boolean value.
+ *
+ */
+
+int icaltime_span_contains(icaltime_span *s,
+ icaltime_span *container)
+{
+
+ if ((s->start >= container->start && s->start < container->end) &&
+ (s->end <= container->end && s->end > container->start))
+ return 1;
+
+ return 0;
+}
diff --git a/libkcal/libical/src/libical/icaltime.h b/libkcal/libical/src/libical/icaltime.h
new file mode 100644
index 00000000..5871529f
--- /dev/null
+++ b/libkcal/libical/src/libical/icaltime.h
@@ -0,0 +1,271 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icaltime.h
+ CREATOR: eric 02 June 2000
+
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ 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
+
+
+======================================================================*/
+
+/** @file icaltime.h
+ * @brief struct icaltimetype is a pseudo-object that abstracts time
+ * handling.
+ *
+ * It can represent either a DATE or a DATE-TIME (floating, UTC or in a
+ * given timezone), and it keeps track internally of its native timezone.
+ *
+ * The typical usage is to call the correct constructor specifying the
+ * desired timezone. If this is not known until a later time, the
+ * correct behavior is to specify a NULL timezone and call
+ * icaltime_convert_to_zone() at a later time.
+ *
+ * There are several ways to create a new icaltimetype:
+ *
+ * - icaltime_null_time()
+ * - icaltime_null_date()
+ * - icaltime_current_time_with_zone()
+ * - icaltime_today()
+ * - icaltime_from_timet_with_zone(time_t tm, int is_date,
+ * icaltimezone *zone)
+ * - icaltime_from_string_with_zone(const char* str, icaltimezone *zone)
+ * - icaltime_from_day_of_year(int doy, int year)
+ * - icaltime_from_week_number(int week_number, int year)
+ *
+ * italtimetype objects can be converted to different formats:
+ *
+ * - icaltime_as_timet(struct icaltimetype tt)
+ * - icaltime_as_timet_with_zone(struct icaltimetype tt,
+ * icaltimezone *zone)
+ * - icaltime_as_ical_string(struct icaltimetype tt)
+ *
+ * Accessor methods include:
+ *
+ * - icaltime_get_timezone(struct icaltimetype t)
+ * - icaltime_get_tzid(struct icaltimetype t)
+ * - icaltime_set_timezone(struct icaltimetype t, icaltimezone *zone)
+ * - icaltime_day_of_year(struct icaltimetype t)
+ * - icaltime_day_of_week(struct icaltimetype t)
+ * - icaltime_start_doy_of_week(struct icaltimetype t)
+ * - icaltime_week_number(struct icaltimetype t)
+ *
+ * Query methods include:
+ *
+ * - icaltime_is_null_time(struct icaltimetype t)
+ * - icaltime_is_valid_time(struct icaltimetype t)
+ * - icaltime_is_date(struct icaltimetype t)
+ * - icaltime_is_utc(struct icaltimetype t)
+ * - icaltime_is_floating(struct icaltimetype t)
+ *
+ * Modify, compare and utility methods include:
+ *
+ * - icaltime_add(struct icaltimetype t, struct icaldurationtype d)
+ * - icaltime_subtract(struct icaltimetype t1, struct icaltimetype t2)
+ * - icaltime_compare_with_zone(struct icaltimetype a,struct icaltimetype b)
+ * - icaltime_compare(struct icaltimetype a,struct icaltimetype b)
+ * - icaltime_compare_date_only(struct icaltimetype a,
+ * struct icaltimetype b)
+ * - icaltime_adjust(struct icaltimetype *tt, int days, int hours,
+ * int minutes, int seconds);
+ * - icaltime_normalize(struct icaltimetype t);
+ * - icaltime_convert_to_zone(const struct icaltimetype tt,
+ * icaltimezone *zone);
+ */
+
+#ifndef ICALTIME_H
+#define ICALTIME_H
+
+#include <time.h>
+/* An opaque struct representing a timezone. We declare this here to avoid
+ a circular dependancy. */
+#ifndef ICALTIMEZONE_DEFINED
+#define ICALTIMEZONE_DEFINED
+typedef struct _icaltimezone icaltimezone;
+#endif
+
+/** icaltime_span is returned by icalcomponent_get_span() */
+struct icaltime_span {
+ time_t start; /**< in UTC */
+ time_t end; /**< in UTC */
+ int is_busy; /**< 1->busy time, 0-> free time */
+};
+
+typedef struct icaltime_span icaltime_span;
+
+/*
+ * FIXME
+ *
+ * is_utc is redundant, and might be considered a minor optimization.
+ * It might be deprecated, so you should use icaltime_is_utc() instead.
+ */
+struct icaltimetype
+{
+ int year; /**< Actual year, e.g. 2001. */
+ int month; /**< 1 (Jan) to 12 (Dec). */
+ 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. */
+
+ int is_daylight; /**< 1 -> time is in daylight savings time. */
+
+ icaltimezone *zone; /**< timezone */
+};
+
+typedef struct icaltimetype icaltimetype;
+
+/** Return a null time, which indicates no time has been set.
+ This time represent the beginning of the epoch */
+struct icaltimetype icaltime_null_time(void);
+
+/** Return a null date */
+struct icaltimetype icaltime_null_date(void);
+
+/** Returns the current time in the given timezone, as an icaltimetype. */
+struct icaltimetype icaltime_current_time_with_zone(icaltimezone *zone);
+
+/** Returns the current day as an icaltimetype, with is_date set. */
+struct icaltimetype icaltime_today(void);
+
+/** Convert seconds past UNIX epoch to a timetype*/
+struct icaltimetype icaltime_from_timet(const time_t v, const int is_date);
+
+/** Convert seconds past UNIX epoch to a timetype, using timezones. */
+struct icaltimetype icaltime_from_timet_with_zone(const time_t tm,
+ const int is_date, icaltimezone *zone);
+
+/** create a time from an ISO format string */
+struct icaltimetype icaltime_from_string(const char* str);
+
+/** create a time from an ISO format string */
+struct icaltimetype icaltime_from_string_with_zone(const char* str,
+ icaltimezone *zone);
+
+/** Create a new time, given a day of year and a year. */
+struct icaltimetype icaltime_from_day_of_year(const int doy,
+ const int year);
+
+/** @brief Contructor (TODO).
+ * Create a new time from a weeknumber and a year. */
+struct icaltimetype icaltime_from_week_number(const int week_number,
+ const int year);
+
+/** Return the time as seconds past the UNIX epoch */
+time_t icaltime_as_timet(const struct icaltimetype);
+
+/** Return the time as seconds past the UNIX epoch, using timezones. */
+time_t icaltime_as_timet_with_zone(const struct icaltimetype tt,
+ icaltimezone *zone);
+
+/** Return a string represention of the time, in RFC2445 format. The
+ string is owned by libical */
+const char* icaltime_as_ical_string(const struct icaltimetype tt);
+
+/** @brief Return the timezone */
+icaltimezone *icaltime_get_timezone(const struct icaltimetype t);
+
+/** @brief Return the tzid, or NULL for a floating time */
+const char *icaltime_get_tzid(const struct icaltimetype t);
+
+/** @brief Set the timezone */
+struct icaltimetype icaltime_set_timezone(struct icaltimetype *t,
+ icaltimezone *zone);
+
+/** Return the day of the year of the given time */
+int icaltime_day_of_year(const struct icaltimetype t);
+
+/** Return the day of the week of the given time. Sunday is 1 */
+int icaltime_day_of_week(const struct icaltimetype t);
+
+/** Return the day of the year for the Sunday of the week that the
+ given time is within. */
+int icaltime_start_doy_of_week(const struct icaltimetype t);
+
+/** Return the week number for the week the given time is within */
+int icaltime_week_number(const struct icaltimetype t);
+
+/** Return true of the time is null. */
+int icaltime_is_null_time(const struct icaltimetype t);
+
+/** Returns false if the time is clearly invalid, but is not null. This
+ is usually the result of creating a new time type buy not clearing
+ it, or setting one of the flags to an illegal value. */
+int icaltime_is_valid_time(const struct icaltimetype t);
+
+/** @brief Returns true if time is of DATE type, false if DATE-TIME */
+int icaltime_is_date(const struct icaltimetype t);
+
+/** @brief Returns true if time is relative to UTC zone */
+int icaltime_is_utc(const struct icaltimetype t);
+
+/** @brief Returns true if time is a floating time */
+int icaltime_is_floating(const struct icaltimetype t);
+
+/** Return -1, 0, or 1 to indicate that a<b, a==b or a>b */
+int icaltime_compare_with_zone(const struct icaltimetype a,
+ const struct icaltimetype b);
+
+/** Return -1, 0, or 1 to indicate that a<b, a==b or a>b */
+int icaltime_compare(const struct icaltimetype a,
+ const struct icaltimetype b);
+
+/** like icaltime_compare, but only use the date parts. */
+int icaltime_compare_date_only(const struct icaltimetype a,
+ const struct icaltimetype b);
+
+/** Adds or subtracts a number of days, hours, minutes and seconds. */
+void icaltime_adjust(struct icaltimetype *tt, const int days,
+ const int hours, const int minutes, const int seconds);
+
+/** Normalize the icaltime, so that all fields are within the normal range. */
+struct icaltimetype icaltime_normalize(const struct icaltimetype t);
+
+/** convert tt, of timezone tzid, into a utc time. Does nothing if the
+ time is already UTC. */
+struct icaltimetype icaltime_convert_to_zone(const struct icaltimetype tt,
+ icaltimezone *zone);
+
+/** Return the number of days in the given month */
+int icaltime_days_in_month(const int month, const int year);
+
+
+/** @brief calculate an icaltimespan given a start and end time. */
+struct icaltime_span icaltime_span_new(struct icaltimetype dtstart,
+ struct icaltimetype dtend,
+ int is_busy);
+
+/** @brief Returns true if the two spans overlap **/
+int icaltime_span_overlaps(icaltime_span *s1,
+ icaltime_span *s2);
+
+/** @brief Returns true if the span is totally within the containing
+ * span
+ */
+int icaltime_span_contains(icaltime_span *s,
+ icaltime_span *container);
+
+
+#endif /* !ICALTIME_H */
+
+
diff --git a/libkcal/libical/src/libical/icaltimezone.c b/libkcal/libical/src/libical/icaltimezone.c
new file mode 100644
index 00000000..fab228ef
--- /dev/null
+++ b/libkcal/libical/src/libical/icaltimezone.c
@@ -0,0 +1,1670 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/*======================================================================
+ FILE: icaltimezone.c
+ CREATOR: Damon Chaplin 15 March 2001
+
+
+ (C) COPYRIGHT 2001, Damon Chaplin
+
+ 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/
+
+
+======================================================================*/
+
+/** @file icaltimezone.c
+ * @brief implementation of timezone handling routines
+ **/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "icalproperty.h"
+#include "icalarray.h"
+#include "icalerror.h"
+#include "icalparser.h"
+#include "icaltimezone.h"
+
+#ifdef WIN32
+#define snprintf _snprintf
+#define PACKAGE_DATA_DIR "/Projects/libical"
+#endif
+
+/** This is the toplevel directory where the timezone data is installed in. */
+#define ZONEINFO_DIRECTORY PACKAGE_DATA_DIR "/zoneinfo"
+
+/** The prefix we use to uniquely identify TZIDs. */
+#define TZID_PREFIX "/softwarestudio.org/"
+#define TZID_PREFIX_LEN 20
+
+/** This is the filename of the file containing the city names and
+ coordinates of all the builtin timezones. */
+#define ZONES_TAB_FILENAME "zones.tab"
+
+/** This is the number of years of extra coverage we do when expanding
+ the timezone changes. */
+#define ICALTIMEZONE_EXTRA_COVERAGE 5
+
+/** This is the maximum year we will expand to. time_t values only go up to
+ somewhere around 2037. */
+#define ICALTIMEZONE_MAX_YEAR 2035
+
+struct _icaltimezone {
+ char *tzid;
+ /**< The unique ID of this timezone,
+ e.g. "/softwarestudio.org/Olson_20010601_1/Africa/Banjul".
+ This should only be used to identify a VTIMEZONE. It is not
+ meant to be displayed to the user in any form. */
+
+ char *location;
+ /**< The location for the timezone, e.g. "Africa/Accra" for the
+ Olson database. We look for this in the "LOCATION" or
+ "X-LIC-LOCATION" properties of the VTIMEZONE component. It
+ isn't a standard property yet. This will be NULL if no location
+ is found in the VTIMEZONE. */
+
+ char *tznames;
+ /**< This will be set to a combination of the TZNAME properties
+ from the last STANDARD and DAYLIGHT components in the
+ VTIMEZONE, e.g. "EST/EDT". If they both use the same TZNAME,
+ or only one type of component is found, then only one TZNAME
+ will appear, e.g. "AZOT". If no TZNAME is found this will be
+ NULL. */
+
+ double latitude;
+ double longitude;
+ /**< The coordinates of the city, in degrees. */
+
+ icalcomponent *component;
+ /**< The toplevel VTIMEZONE component loaded from the .ics file for this
+ timezone. If we need to regenerate the changes data we need this. */
+
+ icaltimezone *builtin_timezone;
+ /**< If this is not NULL it points to the builtin icaltimezone
+ that the above TZID refers to. This icaltimezone should be used
+ instead when accessing the timezone changes data, so that the
+ expanded timezone changes data is shared between calendar
+ components. */
+
+ int end_year;
+ /**< This is the last year for which we have expanded the data to.
+ If we need to calculate a date past this we need to expand the
+ timezone component data from scratch. */
+
+ icalarray *changes;
+ /**< A dynamically-allocated array of time zone changes, sorted by the
+ time of the change in local time. So we can do fast binary-searches
+ to convert from local time to UTC. */
+};
+
+typedef struct _icaltimezonechange icaltimezonechange;
+
+struct _icaltimezonechange {
+ int utc_offset;
+ /**< The offset to add to UTC to get local time, in seconds. */
+
+ int prev_utc_offset;
+ /**< The offset to add to UTC, before this change, in seconds. */
+
+ int year; /**< Actual year, e.g. 2001. */
+ int month; /**< 1 (Jan) to 12 (Dec). */
+ int day;
+ int hour;
+ int minute;
+ int second;
+ /**< The time that the change came into effect, in UTC.
+ Note that the prev_utc_offset applies to this local time,
+ since we haven't changed to the new offset yet. */
+
+ int is_daylight;
+ /**< Whether this is STANDARD or DAYLIGHT time. */
+};
+
+
+/** An array of icaltimezones for the builtin timezones. */
+static icalarray *builtin_timezones = NULL;
+
+/** This is the special UTC timezone, which isn't in builtin_timezones. */
+static icaltimezone utc_timezone = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+
+static char* zone_files_directory = NULL;
+
+static void icaltimezone_reset (icaltimezone *zone);
+static char* icaltimezone_get_location_from_vtimezone (icalcomponent *component);
+static char* icaltimezone_get_tznames_from_vtimezone (icalcomponent *component);
+static void icaltimezone_expand_changes (icaltimezone *zone,
+ int end_year);
+static void icaltimezone_expand_vtimezone (icalcomponent *comp,
+ int end_year,
+ icalarray *changes);
+static int icaltimezone_compare_change_fn (const void *elem1,
+ const void *elem2);
+
+static int icaltimezone_find_nearby_change (icaltimezone *zone,
+ icaltimezonechange *change);
+
+static void icaltimezone_adjust_change (icaltimezonechange *tt,
+ int days,
+ int hours,
+ int minutes,
+ int seconds);
+
+static void icaltimezone_init (icaltimezone *zone);
+
+/** Gets the TZID, LOCATION/X-LIC-LOCATION, and TZNAME properties from the
+ VTIMEZONE component and places them in the icaltimezone. It returns 1 on
+ success, or 0 if the TZID can't be found. */
+static int icaltimezone_get_vtimezone_properties (icaltimezone *zone,
+ icalcomponent *component);
+
+
+static void icaltimezone_load_builtin_timezone (icaltimezone *zone);
+
+static void icaltimezone_ensure_coverage (icaltimezone *zone,
+ int end_year);
+
+
+static void icaltimezone_init_builtin_timezones(void);
+
+static void icaltimezone_parse_zone_tab (void);
+
+static char* icaltimezone_load_get_line_fn (char *s,
+ size_t size,
+ void *data);
+
+static void format_utc_offset (int utc_offset,
+ char *buffer);
+
+static const char* get_zone_directory(void);
+
+
+/** Creates a new icaltimezone. */
+icaltimezone*
+icaltimezone_new (void)
+{
+ icaltimezone *zone;
+
+ zone = (icaltimezone*) malloc (sizeof (icaltimezone));
+ if (!zone) {
+ icalerror_set_errno (ICAL_NEWFAILED_ERROR);
+ return NULL;
+ }
+
+ icaltimezone_init (zone);
+
+ return zone;
+}
+
+
+/** Frees all memory used for the icaltimezone. */
+void
+icaltimezone_free (icaltimezone *zone,
+ int free_struct)
+{
+ icaltimezone_reset (zone);
+ if (free_struct)
+ free ((void *)zone);
+}
+
+
+/** Resets the icaltimezone to the initial state, freeing most of the fields. */
+static void
+icaltimezone_reset (icaltimezone *zone)
+{
+ if (zone->tzid)
+ free (zone->tzid);
+ if (zone->location)
+ free (zone->location);
+ if (zone->tznames)
+ free (zone->tznames);
+ if (zone->component)
+ icalcomponent_free (zone->component);
+ if (zone->changes)
+ icalarray_free (zone->changes);
+
+ icaltimezone_init (zone);
+}
+
+
+/** Initializes an icaltimezone. */
+static void
+icaltimezone_init (icaltimezone *zone)
+{
+ zone->tzid = NULL;
+ zone->location = NULL;
+ zone->tznames = NULL;
+ zone->latitude = 0.0;
+ zone->longitude = 0.0;
+ zone->component = NULL;
+ zone->builtin_timezone = NULL;
+ zone->end_year = 0;
+ zone->changes = NULL;
+}
+
+
+/** Gets the TZID, LOCATION/X-LIC-LOCATION and TZNAME properties of
+ the VTIMEZONE component and stores them in the icaltimezone. It
+ returns 1 on success, or 0 if the TZID can't be found. Note that
+ it expects the zone to be initialized or reset - it doesn't free
+ any old values. */
+static int
+icaltimezone_get_vtimezone_properties (icaltimezone *zone,
+ icalcomponent *component)
+{
+ icalproperty *prop;
+ const char *tzid;
+
+ prop = icalcomponent_get_first_property (component, ICAL_TZID_PROPERTY);
+ if (!prop)
+ return 0;
+
+ /* A VTIMEZONE MUST have a TZID, or a lot of our code won't work. */
+ tzid = icalproperty_get_tzid (prop);
+ if (!tzid)
+ return 0;
+
+ zone->tzid = strdup (tzid);
+ zone->component = component;
+ if ( zone->location != 0 ) free ( zone->location );
+ zone->location = icaltimezone_get_location_from_vtimezone (component);
+ zone->tznames = icaltimezone_get_tznames_from_vtimezone (component);
+
+ return 1;
+}
+
+/** Gets the LOCATION or X-LIC-LOCATION property from a VTIMEZONE. */
+static char*
+icaltimezone_get_location_from_vtimezone (icalcomponent *component)
+{
+ icalproperty *prop;
+ const char *location;
+ const char *name;
+
+ prop = icalcomponent_get_first_property (component,
+ ICAL_LOCATION_PROPERTY);
+ if (prop) {
+ location = icalproperty_get_location (prop);
+ if (location)
+ return strdup (location);
+ }
+
+ prop = icalcomponent_get_first_property (component, ICAL_X_PROPERTY);
+ while (prop) {
+ name = icalproperty_get_x_name (prop);
+ if (name && !strcasecmp (name, "X-LIC-LOCATION")) {
+ location = icalproperty_get_x (prop);
+ if (location)
+ return strdup (location);
+ }
+ prop = icalcomponent_get_next_property (component,
+ ICAL_X_PROPERTY);
+ }
+
+ return NULL;
+}
+
+
+/** Gets the TZNAMEs used for the last STANDARD & DAYLIGHT components
+ in a VTIMEZONE. If both STANDARD and DAYLIGHT components use the
+ same TZNAME, it returns that. If they use different TZNAMEs, it
+ formats them like "EST/EDT". The returned string should be freed by
+ the caller. */
+static char*
+icaltimezone_get_tznames_from_vtimezone (icalcomponent *component)
+{
+ icalcomponent *comp;
+ icalcomponent_kind type;
+ icalproperty *prop;
+ struct icaltimetype dtstart;
+ struct icaldatetimeperiodtype rdate;
+ const char *current_tzname;
+ const char *standard_tzname = NULL, *daylight_tzname = NULL;
+ struct icaltimetype standard_max_date, daylight_max_date;
+ struct icaltimetype current_max_date;
+
+ standard_max_date = icaltime_null_time();
+ daylight_max_date = icaltime_null_time();
+
+ /* Step through the STANDARD & DAYLIGHT subcomponents. */
+ comp = icalcomponent_get_first_component (component, ICAL_ANY_COMPONENT);
+ while (comp) {
+ type = icalcomponent_isa (comp);
+ if (type == ICAL_XSTANDARD_COMPONENT
+ || type == ICAL_XDAYLIGHT_COMPONENT) {
+ current_max_date = icaltime_null_time ();
+ current_tzname = NULL;
+
+ /* Step through the properties. We want to find the TZNAME, and
+ the largest DTSTART or RDATE. */
+ prop = icalcomponent_get_first_property (comp, ICAL_ANY_PROPERTY);
+ while (prop) {
+ switch (icalproperty_isa (prop)) {
+ case ICAL_TZNAME_PROPERTY:
+ current_tzname = icalproperty_get_tzname (prop);
+ break;
+
+ case ICAL_DTSTART_PROPERTY:
+ dtstart = icalproperty_get_dtstart (prop);
+ if (icaltime_compare (dtstart, current_max_date) > 0)
+ current_max_date = dtstart;
+
+ break;
+
+ case ICAL_RDATE_PROPERTY:
+ rdate = icalproperty_get_rdate (prop);
+ if (icaltime_compare (rdate.time, current_max_date) > 0)
+ current_max_date = rdate.time;
+
+ break;
+
+ default:
+ break;
+ }
+
+ prop = icalcomponent_get_next_property (comp,
+ ICAL_ANY_PROPERTY);
+ }
+
+ if (current_tzname) {
+ if (type == ICAL_XSTANDARD_COMPONENT) {
+ if (!standard_tzname
+ || icaltime_compare (current_max_date,
+ standard_max_date) > 0) {
+ standard_max_date = current_max_date;
+ standard_tzname = current_tzname;
+ }
+ } else {
+ if (!daylight_tzname
+ || icaltime_compare (current_max_date,
+ daylight_max_date) > 0) {
+ daylight_max_date = current_max_date;
+ daylight_tzname = current_tzname;
+ }
+ }
+ }
+ }
+
+ comp = icalcomponent_get_next_component (component,
+ ICAL_ANY_COMPONENT);
+ }
+
+ /* Outlook (2000) places "Standard Time" and "Daylight Time" in the TZNAME
+ strings, which is totally useless. So we return NULL in that case. */
+ if (standard_tzname && !strcmp (standard_tzname, "Standard Time"))
+ return NULL;
+
+ /* If both standard and daylight TZNAMEs were found, if they are the same
+ we return just one, else we format them like "EST/EDT". */
+ if (standard_tzname && daylight_tzname) {
+ unsigned int standard_len, daylight_len;
+ char *tznames;
+
+ if (!strcmp (standard_tzname, daylight_tzname))
+ return strdup (standard_tzname);
+
+ standard_len = strlen (standard_tzname);
+ daylight_len = strlen (daylight_tzname);
+ tznames = malloc (standard_len + daylight_len + 2);
+ strcpy (tznames, standard_tzname);
+ tznames[standard_len] = '/';
+ strcpy (tznames + standard_len + 1, daylight_tzname);
+ return tznames;
+ } else {
+ const char *tznames;
+
+ /* If either of the TZNAMEs was found just return that, else NULL. */
+ tznames = standard_tzname ? standard_tzname : daylight_tzname;
+ return tznames ? strdup (tznames) : NULL;
+ }
+}
+
+
+static void
+icaltimezone_ensure_coverage (icaltimezone *zone,
+ int end_year)
+{
+ /* When we expand timezone changes we always expand at least up to this
+ year, plus ICALTIMEZONE_EXTRA_COVERAGE. */
+ static int icaltimezone_minimum_expansion_year = -1;
+
+ int changes_end_year;
+
+ if (!zone->component)
+ icaltimezone_load_builtin_timezone (zone);
+
+ if (icaltimezone_minimum_expansion_year == -1) {
+ struct icaltimetype today = icaltime_today();
+ icaltimezone_minimum_expansion_year = today.year;
+ }
+
+ changes_end_year = end_year;
+ if (changes_end_year < icaltimezone_minimum_expansion_year)
+ changes_end_year = icaltimezone_minimum_expansion_year;
+
+ changes_end_year += ICALTIMEZONE_EXTRA_COVERAGE;
+
+ if (changes_end_year > ICALTIMEZONE_MAX_YEAR)
+ changes_end_year = ICALTIMEZONE_MAX_YEAR;
+
+ if (!zone->changes || zone->end_year < end_year)
+ icaltimezone_expand_changes (zone, changes_end_year);
+}
+
+
+static void
+icaltimezone_expand_changes (icaltimezone *zone,
+ int end_year)
+{
+ icalarray *changes;
+ icalcomponent *comp;
+
+#if 0
+ printf ("\nExpanding changes for: %s to year: %i\n", zone->tzid, end_year);
+#endif
+
+ changes = icalarray_new (sizeof (icaltimezonechange), 32);
+ if (!changes)
+ return;
+
+ /* Scan the STANDARD and DAYLIGHT subcomponents. */
+ comp = icalcomponent_get_first_component (zone->component,
+ ICAL_ANY_COMPONENT);
+ while (comp) {
+ icaltimezone_expand_vtimezone (comp, end_year, changes);
+ comp = icalcomponent_get_next_component (zone->component,
+ ICAL_ANY_COMPONENT);
+ }
+
+ /* Sort the changes. We may have duplicates but I don't think it will
+ matter. */
+ icalarray_sort (changes, icaltimezone_compare_change_fn);
+
+ if (zone->changes)
+ icalarray_free (zone->changes);
+
+ zone->changes = changes;
+ zone->end_year = end_year;
+}
+
+
+static void
+icaltimezone_expand_vtimezone (icalcomponent *comp,
+ int end_year,
+ icalarray *changes)
+{
+ icaltimezonechange change;
+ icalproperty *prop;
+ struct icaltimetype dtstart, occ;
+ struct icalrecurrencetype rrule;
+ icalrecur_iterator* rrule_iterator;
+ struct icaldatetimeperiodtype rdate;
+ int found_dtstart = 0, found_tzoffsetto = 0, found_tzoffsetfrom = 0;
+ int has_recurrence = 0;
+
+ /* First we check if it is a STANDARD or DAYLIGHT component, and
+ just return if it isn't. */
+ if (icalcomponent_isa (comp) == ICAL_XSTANDARD_COMPONENT)
+ change.is_daylight = 0;
+ else if (icalcomponent_isa (comp) == ICAL_XDAYLIGHT_COMPONENT)
+ change.is_daylight = 1;
+ else
+ return;
+
+ /* Step through each of the properties to find the DTSTART,
+ TZOFFSETFROM and TZOFFSETTO. We can't expand recurrences here
+ since we need these properties before we can do that. */
+ prop = icalcomponent_get_first_property (comp, ICAL_ANY_PROPERTY);
+ while (prop) {
+ switch (icalproperty_isa (prop)) {
+ case ICAL_DTSTART_PROPERTY:
+ dtstart = icalproperty_get_dtstart (prop);
+ found_dtstart = 1;
+ break;
+ case ICAL_TZOFFSETTO_PROPERTY:
+ change.utc_offset = icalproperty_get_tzoffsetto (prop);
+ /*printf ("Found TZOFFSETTO: %i\n", change.utc_offset);*/
+ found_tzoffsetto = 1;
+ break;
+ case ICAL_TZOFFSETFROM_PROPERTY:
+ change.prev_utc_offset = icalproperty_get_tzoffsetfrom (prop);
+ /*printf ("Found TZOFFSETFROM: %i\n", change.prev_utc_offset);*/
+ found_tzoffsetfrom = 1;
+ break;
+ case ICAL_RDATE_PROPERTY:
+ case ICAL_RRULE_PROPERTY:
+ has_recurrence = 1;
+ break;
+ default:
+ /* Just ignore any other properties. */
+ break;
+ }
+
+ prop = icalcomponent_get_next_property (comp, ICAL_ANY_PROPERTY);
+ }
+
+ /* If we didn't find a DTSTART, TZOFFSETTO and TZOFFSETFROM we have to
+ ignore the component. FIXME: Add an error property? */
+ if (!found_dtstart || !found_tzoffsetto || !found_tzoffsetfrom)
+ return;
+
+#if 0
+ printf ("\n Expanding component DTSTART (Y/M/D): %i/%i/%i %i:%02i:%02i\n",
+ dtstart.year, dtstart.month, dtstart.day,
+ dtstart.hour, dtstart.minute, dtstart.second);
+#endif
+
+ /* If the STANDARD/DAYLIGHT component has no recurrence data, we just add
+ a single change for the DTSTART. */
+ if (!has_recurrence) {
+ change.year = dtstart.year;
+ change.month = dtstart.month;
+ change.day = dtstart.day;
+ change.hour = dtstart.hour;
+ change.minute = dtstart.minute;
+ change.second = dtstart.second;
+
+ /* Convert to UTC. */
+ icaltimezone_adjust_change (&change, 0, 0, 0, -change.prev_utc_offset);
+
+#if 0
+ printf (" Appending single DTSTART (Y/M/D): %i/%02i/%02i %i:%02i:%02i\n",
+ change.year, change.month, change.day,
+ change.hour, change.minute, change.second);
+#endif
+
+ /* Add the change to the array. */
+ icalarray_append (changes, &change);
+ return;
+ }
+
+ /* The component has recurrence data, so we expand that now. */
+ prop = icalcomponent_get_first_property (comp, ICAL_ANY_PROPERTY);
+ while (prop) {
+#if 0
+ printf ("Expanding property...\n");
+#endif
+ switch (icalproperty_isa (prop)) {
+ case ICAL_RDATE_PROPERTY:
+ rdate = icalproperty_get_rdate (prop);
+ change.year = rdate.time.year;
+ change.month = rdate.time.month;
+ change.day = rdate.time.day;
+ /* RDATEs with a DATE value inherit the time from
+ the DTSTART. */
+ if (icaltime_is_date(rdate.time)) {
+ change.hour = dtstart.hour;
+ change.minute = dtstart.minute;
+ change.second = dtstart.second;
+ } else {
+ change.hour = rdate.time.hour;
+ change.minute = rdate.time.minute;
+ change.second = rdate.time.second;
+
+ /* The spec was a bit vague about whether RDATEs were in local
+ time or UTC so we support both to be safe. So if it is in
+ UTC we have to add the UTC offset to get a local time. */
+ if (!icaltime_is_utc(rdate.time))
+ icaltimezone_adjust_change (&change, 0, 0, 0,
+ -change.prev_utc_offset);
+ }
+
+#if 0
+ printf (" Appending RDATE element (Y/M/D): %i/%02i/%02i %i:%02i:%02i\n",
+ change.year, change.month, change.day,
+ change.hour, change.minute, change.second);
+#endif
+
+ icalarray_append (changes, &change);
+ break;
+ case ICAL_RRULE_PROPERTY:
+ rrule = icalproperty_get_rrule (prop);
+
+ /* If the rrule UNTIL value is set and is in UTC, we convert it to
+ a local time, since the recurrence code has no way to convert
+ it itself. */
+ if (!icaltime_is_null_time (rrule.until) && rrule.until.is_utc) {
+#if 0
+ printf (" Found RRULE UNTIL in UTC.\n");
+#endif
+
+ /* To convert from UTC to a local time, we use the TZOFFSETFROM
+ since that is the offset from UTC that will be in effect
+ when each of the RRULE occurrences happens. */
+ icaltime_adjust (&rrule.until, 0, 0, 0,
+ change.prev_utc_offset);
+ rrule.until.is_utc = 0;
+ }
+
+ rrule_iterator = icalrecur_iterator_new (rrule, dtstart);
+ for (;;) {
+ occ = icalrecur_iterator_next (rrule_iterator);
+ if (occ.year > end_year || icaltime_is_null_time (occ))
+ break;
+
+ change.year = occ.year;
+ change.month = occ.month;
+ change.day = occ.day;
+ change.hour = occ.hour;
+ change.minute = occ.minute;
+ change.second = occ.second;
+
+#if 0
+ printf (" Appending RRULE element (Y/M/D): %i/%02i/%02i %i:%02i:%02i\n",
+ change.year, change.month, change.day,
+ change.hour, change.minute, change.second);
+#endif
+
+ icaltimezone_adjust_change (&change, 0, 0, 0,
+ -change.prev_utc_offset);
+
+ icalarray_append (changes, &change);
+ }
+
+ icalrecur_iterator_free (rrule_iterator);
+ break;
+ default:
+ break;
+ }
+
+ prop = icalcomponent_get_next_property (comp, ICAL_ANY_PROPERTY);
+ }
+}
+
+
+/** A function to compare 2 icaltimezonechange elements, used for qsort(). */
+static int
+icaltimezone_compare_change_fn (const void *elem1,
+ const void *elem2)
+{
+ icaltimezonechange *change1, *change2;
+ int retval;
+
+ change1 = (icaltimezonechange *)elem1;
+ change2 = (icaltimezonechange *)elem2;
+
+ if (change1->year < change2->year)
+ retval = -1;
+ else if (change1->year > change2->year)
+ retval = 1;
+
+ else if (change1->month < change2->month)
+ retval = -1;
+ else if (change1->month > change2->month)
+ retval = 1;
+
+ else if (change1->day < change2->day)
+ retval = -1;
+ else if (change1->day > change2->day)
+ retval = 1;
+
+ else if (change1->hour < change2->hour)
+ retval = -1;
+ else if (change1->hour > change2->hour)
+ retval = 1;
+
+ else if (change1->minute < change2->minute)
+ retval = -1;
+ else if (change1->minute > change2->minute)
+ retval = 1;
+
+ else if (change1->second < change2->second)
+ retval = -1;
+ else if (change1->second > change2->second)
+ retval = 1;
+
+ else
+ retval = 0;
+
+ return retval;
+}
+
+
+
+void
+icaltimezone_convert_time (struct icaltimetype *tt,
+ icaltimezone *from_zone,
+ icaltimezone *to_zone)
+{
+ int utc_offset, is_daylight;
+
+ /* If the time is a DATE value or both timezones are the same, or we are
+ converting a floating time, we don't need to do anything. */
+ if (icaltime_is_date(*tt) || from_zone == to_zone || from_zone == NULL)
+ return;
+
+ /* Convert the time to UTC by getting the UTC offset and subtracting it. */
+ utc_offset = icaltimezone_get_utc_offset (from_zone, tt, NULL);
+ icaltime_adjust (tt, 0, 0, 0, -utc_offset);
+
+ /* Now we convert the time to the new timezone by getting the UTC offset
+ of our UTC time and adding it. */
+ utc_offset = icaltimezone_get_utc_offset_of_utc_time (to_zone, tt,
+ &is_daylight);
+ tt->is_daylight = is_daylight;
+ icaltime_adjust (tt, 0, 0, 0, utc_offset);
+}
+
+
+
+
+/** @deprecated This API wasn't updated when we changed icaltimetype to contain its own
+ timezone. Also, this takes a pointer instead of the struct. */
+/* Calculates the UTC offset of a given local time in the given
+ timezone. It is the number of seconds to add to UTC to get local
+ time. The is_daylight flag is set to 1 if the time is in
+ daylight-savings time. */
+int
+icaltimezone_get_utc_offset (icaltimezone *zone,
+ struct icaltimetype *tt,
+ int *is_daylight)
+{
+ icaltimezonechange *zone_change, *prev_zone_change, tt_change, tmp_change;
+ int change_num, step, utc_offset_change, cmp;
+ int change_num_to_use;
+ int want_daylight;
+
+ if (tt == NULL)
+ return 0;
+
+ if (is_daylight)
+ *is_daylight = 0;
+
+ /* For local times and UTC return 0. */
+ if (zone == NULL || zone == &utc_timezone)
+ return 0;
+
+ /* Use the builtin icaltimezone if possible. */
+ if (zone->builtin_timezone)
+ zone = zone->builtin_timezone;
+
+ /* Make sure the changes array is expanded up to the given time. */
+ icaltimezone_ensure_coverage (zone, tt->year);
+
+ if (!zone->changes || zone->changes->num_elements == 0)
+ return 0;
+
+ /* Copy the time parts of the icaltimetype to an icaltimezonechange so we
+ can use our comparison function on it. */
+ tt_change.year = tt->year;
+ tt_change.month = tt->month;
+ tt_change.day = tt->day;
+ tt_change.hour = tt->hour;
+ tt_change.minute = tt->minute;
+ tt_change.second = tt->second;
+
+ /* This should find a change close to the time, either the change before
+ it or the change after it. */
+ change_num = icaltimezone_find_nearby_change (zone, &tt_change);
+
+ /* Sanity check. */
+ icalerror_assert (change_num >= 0,
+ "Negative timezone change index");
+ icalerror_assert (change_num < zone->changes->num_elements,
+ "Timezone change index out of bounds");
+
+ /* Now move backwards or forwards to find the timezone change that applies
+ to tt. It should only have to do 1 or 2 steps. */
+ zone_change = icalarray_element_at (zone->changes, change_num);
+ step = 1;
+ change_num_to_use = -1;
+ for (;;) {
+ /* Copy the change, so we can adjust it. */
+ tmp_change = *zone_change;
+
+ /* If the clock is going backward, check if it is in the region of time
+ that is used twice. If it is, use the change with the daylight
+ setting which matches tt, or use standard if we don't know. */
+ if (tmp_change.utc_offset < tmp_change.prev_utc_offset) {
+ /* If the time change is at 2:00AM local time and the clock is
+ going back to 1:00AM we adjust the change to 1:00AM. We may
+ have the wrong change but we'll figure that out later. */
+ icaltimezone_adjust_change (&tmp_change, 0, 0, 0,
+ tmp_change.utc_offset);
+ } else {
+ icaltimezone_adjust_change (&tmp_change, 0, 0, 0,
+ tmp_change.prev_utc_offset);
+ }
+
+ cmp = icaltimezone_compare_change_fn (&tt_change, &tmp_change);
+
+ /* If the given time is on or after this change, then this change may
+ apply, but we continue as a later change may be the right one.
+ If the given time is before this change, then if we have already
+ found a change which applies we can use that, else we need to step
+ backwards. */
+ if (cmp >= 0)
+ change_num_to_use = change_num;
+ else
+ step = -1;
+
+ /* If we are stepping backwards through the changes and we have found
+ a change that applies, then we know this is the change to use so
+ we exit the loop. */
+ if (step == -1 && change_num_to_use != -1)
+ break;
+
+ change_num += step;
+
+ /* If we go past the start of the changes array, then we have no data
+ for this time so we return a UTC offset of 0. */
+ if (change_num < 0)
+ return 0;
+
+ if ((unsigned int)change_num >= zone->changes->num_elements)
+ break;
+
+ zone_change = icalarray_element_at (zone->changes, change_num);
+ }
+
+ /* If we didn't find a change to use, then we have a bug! */
+ icalerror_assert (change_num_to_use != -1,
+ "No applicable timezone change found");
+
+ /* Now we just need to check if the time is in the overlapped region of
+ time when clocks go back. */
+ zone_change = icalarray_element_at (zone->changes, change_num_to_use);
+
+ utc_offset_change = zone_change->utc_offset - zone_change->prev_utc_offset;
+ if (utc_offset_change < 0 && change_num_to_use > 0) {
+ tmp_change = *zone_change;
+ icaltimezone_adjust_change (&tmp_change, 0, 0, 0,
+ tmp_change.prev_utc_offset);
+
+ if (icaltimezone_compare_change_fn (&tt_change, &tmp_change) < 0) {
+ /* The time is in the overlapped region, so we may need to use
+ either the current zone_change or the previous one. If the
+ time has the is_daylight field set we use the matching change,
+ else we use the change with standard time. */
+ prev_zone_change = icalarray_element_at (zone->changes,
+ change_num_to_use - 1);
+
+ /* I was going to add an is_daylight flag to struct icaltimetype,
+ but iCalendar doesn't let us distinguish between standard and
+ daylight time anyway, so there's no point. So we just use the
+ standard time instead. */
+ want_daylight = (tt->is_daylight == 1) ? 1 : 0;
+
+#if 0
+ if (zone_change->is_daylight == prev_zone_change->is_daylight)
+ printf (" **** Same is_daylight setting\n");
+#endif
+
+ if (zone_change->is_daylight != want_daylight
+ && prev_zone_change->is_daylight == want_daylight)
+ zone_change = prev_zone_change;
+ }
+ }
+
+ /* Now we know exactly which timezone change applies to the time, so
+ we can return the UTC offset and whether it is a daylight time. */
+ if (is_daylight)
+ *is_daylight = zone_change->is_daylight;
+ return zone_change->utc_offset;
+}
+
+
+/** @deprecated This API wasn't updated when we changed icaltimetype to contain its own
+ timezone. Also, this takes a pointer instead of the struct. */
+/** Calculates the UTC offset of a given UTC time in the given
+ timezone. It is the number of seconds to add to UTC to get local
+ time. The is_daylight flag is set to 1 if the time is in
+ daylight-savings time. */
+int
+icaltimezone_get_utc_offset_of_utc_time (icaltimezone *zone,
+ struct icaltimetype *tt,
+ int *is_daylight)
+{
+ icaltimezonechange *zone_change, tt_change, tmp_change;
+ int change_num, step, change_num_to_use;
+
+ if (is_daylight)
+ *is_daylight = 0;
+
+ /* For local times and UTC return 0. */
+ if (zone == NULL || zone == &utc_timezone)
+ return 0;
+
+ /* Use the builtin icaltimezone if possible. */
+ if (zone->builtin_timezone)
+ zone = zone->builtin_timezone;
+
+ /* Make sure the changes array is expanded up to the given time. */
+ icaltimezone_ensure_coverage (zone, tt->year);
+
+ if (!zone->changes || zone->changes->num_elements == 0)
+ return 0;
+
+ /* Copy the time parts of the icaltimetype to an icaltimezonechange so we
+ can use our comparison function on it. */
+ tt_change.year = tt->year;
+ tt_change.month = tt->month;
+ tt_change.day = tt->day;
+ tt_change.hour = tt->hour;
+ tt_change.minute = tt->minute;
+ tt_change.second = tt->second;
+
+ /* This should find a change close to the time, either the change before
+ it or the change after it. */
+ change_num = icaltimezone_find_nearby_change (zone, &tt_change);
+
+ /* Sanity check. */
+ icalerror_assert (change_num >= 0,
+ "Negative timezone change index");
+ icalerror_assert (change_num < zone->changes->num_elements,
+ "Timezone change index out of bounds");
+
+ /* Now move backwards or forwards to find the timezone change that applies
+ to tt. It should only have to do 1 or 2 steps. */
+ zone_change = icalarray_element_at (zone->changes, change_num);
+ step = 1;
+ change_num_to_use = -1;
+ for (;;) {
+ /* Copy the change and adjust it to UTC. */
+ tmp_change = *zone_change;
+
+ /* If the given time is on or after this change, then this change may
+ apply, but we continue as a later change may be the right one.
+ If the given time is before this change, then if we have already
+ found a change which applies we can use that, else we need to step
+ backwards. */
+ if (icaltimezone_compare_change_fn (&tt_change, &tmp_change) >= 0)
+ change_num_to_use = change_num;
+ else
+ step = -1;
+
+ /* If we are stepping backwards through the changes and we have found
+ a change that applies, then we know this is the change to use so
+ we exit the loop. */
+ if (step == -1 && change_num_to_use != -1)
+ break;
+
+ change_num += step;
+
+ /* If we go past the start of the changes array, then we have no data
+ for this time so we return a UTC offset of 0. */
+ if (change_num < 0)
+ return 0;
+
+ if ((unsigned int)change_num >= zone->changes->num_elements)
+ break;
+
+ zone_change = icalarray_element_at (zone->changes, change_num);
+ }
+
+ /* If we didn't find a change to use, then we have a bug! */
+ icalerror_assert (change_num_to_use != -1,
+ "No applicable timezone change found");
+
+ /* Now we know exactly which timezone change applies to the time, so
+ we can return the UTC offset and whether it is a daylight time. */
+ zone_change = icalarray_element_at (zone->changes, change_num_to_use);
+ if (is_daylight)
+ *is_daylight = zone_change->is_daylight;
+
+ return zone_change->utc_offset;
+}
+
+
+/** Returns the index of a timezone change which is close to the time
+ given in change. */
+static int
+icaltimezone_find_nearby_change (icaltimezone *zone,
+ icaltimezonechange *change)
+{
+ icaltimezonechange *zone_change;
+ int lower, upper, middle, cmp;
+
+ /* Do a simple binary search. */
+ lower = middle = 0;
+ upper = zone->changes->num_elements;
+
+ while (lower < upper) {
+ middle = (lower + upper) / 2;
+ zone_change = icalarray_element_at (zone->changes, middle);
+ cmp = icaltimezone_compare_change_fn (change, zone_change);
+ if (cmp == 0)
+ break;
+ else if (cmp < 0)
+ upper = middle;
+ else
+ lower = middle + 1;
+ }
+
+ return middle;
+}
+
+
+
+
+/** Adds (or subtracts) a time from a icaltimezonechange. NOTE: This
+ function is exactly the same as icaltime_adjust() except for the
+ type of the first parameter. */
+static void
+icaltimezone_adjust_change (icaltimezonechange *tt,
+ int days,
+ int hours,
+ int minutes,
+ int seconds)
+{
+ int second, minute, hour, day;
+ int minutes_overflow, hours_overflow, days_overflow;
+ int days_in_month;
+
+ /* Add on the seconds. */
+ second = tt->second + seconds;
+ tt->second = second % 60;
+ minutes_overflow = second / 60;
+ if (tt->second < 0) {
+ tt->second += 60;
+ minutes_overflow--;
+ }
+
+ /* Add on the minutes. */
+ minute = tt->minute + minutes + minutes_overflow;
+ tt->minute = minute % 60;
+ hours_overflow = minute / 60;
+ if (tt->minute < 0) {
+ tt->minute += 60;
+ hours_overflow--;
+ }
+
+ /* Add on the hours. */
+ hour = tt->hour + hours + hours_overflow;
+ tt->hour = hour % 24;
+ days_overflow = hour / 24;
+ if (tt->hour < 0) {
+ tt->hour += 24;
+ days_overflow--;
+ }
+
+ /* Add on the days. */
+ day = tt->day + days + days_overflow;
+ if (day > 0) {
+ for (;;) {
+ days_in_month = icaltime_days_in_month (tt->month, tt->year);
+ if (day <= days_in_month)
+ break;
+
+ tt->month++;
+ if (tt->month >= 13) {
+ tt->year++;
+ tt->month = 1;
+ }
+
+ day -= days_in_month;
+ }
+ } else {
+ while (day <= 0) {
+ if (tt->month == 1) {
+ tt->year--;
+ tt->month = 12;
+ } else {
+ tt->month--;
+ }
+
+ day += icaltime_days_in_month (tt->month, tt->year);
+ }
+ }
+ tt->day = day;
+}
+
+
+const char*
+icaltimezone_get_tzid (icaltimezone *zone)
+{
+ /* If this is a floating time, without a timezone, return NULL. */
+ if (!zone)
+ return NULL;
+
+ if (!zone->tzid)
+ icaltimezone_load_builtin_timezone (zone);
+
+ return zone->tzid;
+}
+
+
+const char*
+icaltimezone_get_location (icaltimezone *zone)
+{
+ /* If this is a floating time, without a timezone, return NULL. */
+ if (!zone)
+ return NULL;
+
+ /* Note that for builtin timezones this comes from zones.tab so we don't
+ need to check the timezone is loaded here. */
+ return zone->location;
+}
+
+
+const char*
+icaltimezone_get_tznames (icaltimezone *zone)
+{
+ /* If this is a floating time, without a timezone, return NULL. */
+ if (!zone)
+ return NULL;
+
+ if (!zone->component)
+ icaltimezone_load_builtin_timezone (zone);
+
+ return zone->tznames;
+}
+
+
+/** Returns the latitude of a builtin timezone. */
+double
+icaltimezone_get_latitude (icaltimezone *zone)
+{
+ /* If this is a floating time, without a timezone, return 0. */
+ if (!zone)
+ return 0.0;
+
+ /* Note that for builtin timezones this comes from zones.tab so we don't
+ need to check the timezone is loaded here. */
+ return zone->latitude;
+}
+
+
+/** Returns the longitude of a builtin timezone. */
+double
+icaltimezone_get_longitude (icaltimezone *zone)
+{
+ /* If this is a floating time, without a timezone, return 0. */
+ if (!zone)
+ return 0.0;
+
+ /* Note that for builtin timezones this comes from zones.tab so we don't
+ need to check the timezone is loaded here. */
+ return zone->longitude;
+}
+
+
+/** Returns the VTIMEZONE component of a timezone. */
+icalcomponent*
+icaltimezone_get_component (icaltimezone *zone)
+{
+ /* If this is a floating time, without a timezone, return NULL. */
+ if (!zone)
+ return NULL;
+
+ if (!zone->component)
+ icaltimezone_load_builtin_timezone (zone);
+
+ return zone->component;
+}
+
+
+/** Sets the VTIMEZONE component of an icaltimezone, initializing the
+ tzid, location & tzname fields. It returns 1 on success or 0 on
+ failure, i.e. no TZID was found. */
+int
+icaltimezone_set_component (icaltimezone *zone,
+ icalcomponent *comp)
+{
+ icaltimezone_reset (zone);
+ return icaltimezone_get_vtimezone_properties (zone, comp);
+}
+
+
+icalarray*
+icaltimezone_array_new (void)
+{
+ return icalarray_new (sizeof (icaltimezone), 16);
+}
+
+
+void
+icaltimezone_array_append_from_vtimezone (icalarray *timezones,
+ icalcomponent *child)
+{
+ icaltimezone zone;
+
+ icaltimezone_init (&zone);
+ if (icaltimezone_get_vtimezone_properties (&zone, child))
+ icalarray_append (timezones, &zone);
+}
+
+
+void
+icaltimezone_array_free (icalarray *timezones)
+{
+ icaltimezone *zone;
+ int i;
+
+ if ( timezones )
+ {
+ for (i = 0; (unsigned int)i < timezones->num_elements; i++) {
+ zone = icalarray_element_at (timezones, i);
+ icaltimezone_free (zone, 0);
+ }
+
+ icalarray_free (timezones);
+ }
+}
+
+
+/*
+ * BUILTIN TIMEZONE HANDLING
+ */
+
+
+/** Returns an icalarray of icaltimezone structs, one for each builtin
+ timezone. This will load and parse the zones.tab file to get the
+ timezone names and their coordinates. It will not load the
+ VTIMEZONE data for any timezones. */
+icalarray*
+icaltimezone_get_builtin_timezones (void)
+{
+ if (!builtin_timezones)
+ icaltimezone_init_builtin_timezones ();
+
+ return builtin_timezones;
+}
+
+/** Release builtin timezone memory */
+void
+icaltimezone_free_builtin_timezones(void)
+{
+ icaltimezone_array_free(builtin_timezones);
+}
+
+
+/** Returns a single builtin timezone, given its Olson city name. */
+icaltimezone*
+icaltimezone_get_builtin_timezone (const char *location)
+{
+ icaltimezone *zone;
+ int lower, upper, middle, cmp;
+ const char *zone_location;
+
+ if (!location || !location[0])
+ return NULL;
+
+ if (!strcmp (location, "UTC"))
+ return &utc_timezone;
+
+ if (!builtin_timezones)
+ icaltimezone_init_builtin_timezones ();
+
+ /* Do a simple binary search. */
+ lower = middle = 0;
+ upper = builtin_timezones->num_elements;
+
+ while (lower < upper) {
+ middle = (lower + upper) / 2;
+ zone = icalarray_element_at (builtin_timezones, middle);
+ zone_location = icaltimezone_get_location (zone);
+ cmp = strcmp (location, zone_location);
+ if (cmp == 0)
+ return zone;
+ else if (cmp < 0)
+ upper = middle;
+ else
+ lower = middle + 1;
+ }
+
+ return NULL;
+}
+
+
+/** Returns a single builtin timezone, given its TZID. */
+icaltimezone*
+icaltimezone_get_builtin_timezone_from_tzid (const char *tzid)
+{
+ int num_slashes = 0;
+ const char *p, *zone_tzid;
+ icaltimezone *zone;
+
+ if (!tzid || !tzid[0])
+ return NULL;
+
+ /* Check that the TZID starts with our unique prefix. */
+ if (strncmp (tzid, TZID_PREFIX, TZID_PREFIX_LEN))
+ return NULL;
+
+ /* Get the location, which is after the 3rd '/' character. */
+ p = tzid;
+ for (p = tzid; *p; p++) {
+ if (*p == '/') {
+ num_slashes++;
+ if (num_slashes == 3)
+ break;
+ }
+ }
+
+ if (num_slashes != 3)
+ return NULL;
+
+ p++;
+
+ /* Now we can use the function to get the builtin timezone from the
+ location string. */
+ zone = icaltimezone_get_builtin_timezone (p);
+ if (!zone)
+ return NULL;
+
+ /* Check that the builtin TZID matches exactly. We don't want to return
+ a different version of the VTIMEZONE. */
+ zone_tzid = icaltimezone_get_tzid (zone);
+ if (!strcmp (zone_tzid, tzid))
+ return zone;
+ else
+ return NULL;
+}
+
+
+/** Returns the special UTC timezone. */
+icaltimezone*
+icaltimezone_get_utc_timezone (void)
+{
+ if (!builtin_timezones)
+ icaltimezone_init_builtin_timezones ();
+
+ return &utc_timezone;
+}
+
+
+
+/** This initializes the builtin timezone data, i.e. the
+ builtin_timezones array and the special UTC timezone. It should be
+ called before any code that uses the timezone functions. */
+static void
+icaltimezone_init_builtin_timezones (void)
+{
+ /* Initialize the special UTC timezone. */
+ utc_timezone.tzid = (char *)"UTC";
+
+ icaltimezone_parse_zone_tab ();
+}
+
+
+/** This parses the zones.tab file containing the names and locations
+ of the builtin timezones. It creates the builtin_timezones array
+ which is an icalarray of icaltimezone structs. It only fills in the
+ location, latitude and longtude fields; the rest are left
+ blank. The VTIMEZONE component is loaded later if it is needed. The
+ timezones in the zones.tab file are sorted by their name, which is
+ useful for binary searches. */
+static void
+icaltimezone_parse_zone_tab (void)
+{
+ char *filename;
+ FILE *fp;
+ char buf[1024]; /* Used to store each line of zones.tab as it is read. */
+ char location[1024]; /* Stores the city name when parsing buf. */
+ unsigned int filename_len;
+ int latitude_degrees, latitude_minutes, latitude_seconds;
+ int longitude_degrees, longitude_minutes, longitude_seconds;
+ icaltimezone zone;
+
+ icalerror_assert (builtin_timezones == NULL,
+ "Parsing zones.tab file multiple times");
+
+ builtin_timezones = icalarray_new (sizeof (icaltimezone), 32);
+
+ filename_len = strlen (get_zone_directory()) + strlen (ZONES_TAB_FILENAME)
+ + 2;
+
+ filename = (char*) malloc (filename_len);
+ if (!filename) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return;
+ }
+
+ snprintf (filename, filename_len, "%s/%s", get_zone_directory(),
+ ZONES_TAB_FILENAME);
+
+ fp = fopen (filename, "r");
+ free (filename);
+ if (!fp) {
+ icalerror_set_errno(ICAL_FILE_ERROR);
+ return;
+ }
+
+ while (fgets (buf, sizeof(buf), fp)) {
+ if (*buf == '#') continue;
+
+ /* The format of each line is: "latitude longitude location". */
+ if (sscanf (buf, "%4d%2d%2d %4d%2d%2d %s",
+ &latitude_degrees, &latitude_minutes,
+ &latitude_seconds,
+ &longitude_degrees, &longitude_minutes,
+ &longitude_seconds,
+ location) != 7) {
+ fprintf (stderr, "Invalid timezone description line: %s\n", buf);
+ continue;
+ }
+
+ icaltimezone_init (&zone);
+ zone.location = strdup (location);
+
+ if (latitude_degrees >= 0)
+ zone.latitude = (double) latitude_degrees
+ + (double) latitude_minutes / 60
+ + (double) latitude_seconds / 3600;
+ else
+ zone.latitude = (double) latitude_degrees
+ - (double) latitude_minutes / 60
+ - (double) latitude_seconds / 3600;
+
+ if (longitude_degrees >= 0)
+ zone.longitude = (double) longitude_degrees
+ + (double) longitude_minutes / 60
+ + (double) longitude_seconds / 3600;
+ else
+ zone.longitude = (double) longitude_degrees
+ - (double) longitude_minutes / 60
+ - (double) longitude_seconds / 3600;
+
+ icalarray_append (builtin_timezones, &zone);
+
+#if 0
+ printf ("Found zone: %s %f %f\n",
+ location, zone.latitude, zone.longitude);
+#endif
+ }
+
+ fclose (fp);
+}
+
+
+/** Loads the builtin VTIMEZONE data for the given timezone. */
+static void
+icaltimezone_load_builtin_timezone (icaltimezone *zone)
+{
+ char *filename;
+ unsigned int filename_len;
+ FILE *fp;
+ icalparser *parser;
+ icalcomponent *comp, *subcomp;
+
+ /* If the location isn't set, it isn't a builtin timezone. */
+ if (!zone->location || !zone->location[0])
+ return;
+
+ filename_len = strlen (get_zone_directory()) + strlen (zone->location) + 6;
+
+ filename = (char*) malloc (filename_len);
+ if (!filename) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return;
+ }
+
+ snprintf (filename, filename_len, "%s/%s.ics", get_zone_directory(),
+ zone->location);
+
+ fp = fopen (filename, "r");
+ free (filename);
+ if (!fp) {
+ icalerror_set_errno(ICAL_FILE_ERROR);
+ return;
+ }
+
+
+ /* ##### B.# Sun, 11 Nov 2001 04:04:29 +1100
+ this is where the MALFORMEDDATA error is being set, after the call to 'icalparser_parse'
+ fprintf(stderr, "** WARNING ** %s: %d %s\n", __FILE__, __LINE__, icalerror_strerror(icalerrno));
+ */
+
+ parser = icalparser_new ();
+ icalparser_set_gen_data (parser, fp);
+ comp = icalparser_parse (parser, icaltimezone_load_get_line_fn);
+ icalparser_free (parser);
+ fclose (fp);
+
+
+
+ /* Find the VTIMEZONE component inside the VCALENDAR. There should be 1. */
+ subcomp = icalcomponent_get_first_component (comp,
+ ICAL_VTIMEZONE_COMPONENT);
+ if (!subcomp) {
+ icalerror_set_errno(ICAL_PARSE_ERROR);
+ return;
+ }
+
+ icaltimezone_get_vtimezone_properties (zone, subcomp);
+
+ icalcomponent_remove_component(comp,subcomp);
+
+ icalcomponent_free(comp);
+
+}
+
+
+/** Callback used from icalparser_parse() */
+static char *
+icaltimezone_load_get_line_fn (char *s,
+ size_t size,
+ void *data)
+{
+ return fgets (s, (int)size, (FILE*) data);
+}
+
+
+
+
+/*
+ * DEBUGGING
+ */
+
+/**
+ * This outputs a list of timezone changes for the given timezone to the
+ * given file, up to the maximum year given. We compare this output with the
+ * output from 'vzic --dump-changes' to make sure that we are consistent.
+ * (vzic is the Olson timezone database to VTIMEZONE converter.)
+ *
+ * The output format is:
+ *
+ * Zone-Name [tab] Date [tab] Time [tab] UTC-Offset
+ *
+ * The Date and Time fields specify the time change in UTC.
+ *
+ * The UTC Offset is for local (wall-clock) time. It is the amount of time
+ * to add to UTC to get local time.
+ */
+int
+icaltimezone_dump_changes (icaltimezone *zone,
+ int max_year,
+ FILE *fp)
+{
+ static const char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
+ icaltimezonechange *zone_change;
+ int change_num;
+ char buffer[8];
+
+ /* Make sure the changes array is expanded up to the given time. */
+ icaltimezone_ensure_coverage (zone, max_year);
+
+#if 0
+ printf ("Num changes: %i\n", zone->changes->num_elements);
+#endif
+
+ change_num = 0;
+ for (change_num = 0; (unsigned int)change_num < zone->changes->num_elements; change_num++) {
+ zone_change = icalarray_element_at (zone->changes, change_num);
+
+ if (zone_change->year > max_year)
+ break;
+
+ fprintf (fp, "%s\t%2i %s %04i\t%2i:%02i:%02i",
+ zone->location,
+ zone_change->day, months[zone_change->month - 1],
+ zone_change->year,
+ zone_change->hour, zone_change->minute, zone_change->second);
+
+ /* Wall Clock Time offset from UTC. */
+ format_utc_offset (zone_change->utc_offset, buffer);
+ fprintf (fp, "\t%s", buffer);
+
+ fprintf (fp, "\n");
+ }
+ return 1;
+}
+
+
+/** This formats a UTC offset as "+HHMM" or "+HHMMSS".
+ buffer should have space for 8 characters. */
+static void
+format_utc_offset (int utc_offset,
+ char *buffer)
+{
+ const char *sign = "+";
+ int hours, minutes, seconds;
+
+ if (utc_offset < 0) {
+ utc_offset = -utc_offset;
+ sign = "-";
+ }
+
+ hours = utc_offset / 3600;
+ minutes = (utc_offset % 3600) / 60;
+ seconds = utc_offset % 60;
+
+ /* Sanity check. Standard timezone offsets shouldn't be much more than 12
+ hours, and daylight saving shouldn't change it by more than a few hours.
+ (The maximum offset is 15 hours 56 minutes at present.) */
+ if (hours < 0 || hours >= 24 || minutes < 0 || minutes >= 60
+ || seconds < 0 || seconds >= 60) {
+ fprintf (stderr, "Warning: Strange timezone offset: H:%i M:%i S:%i\n",
+ hours, minutes, seconds);
+ }
+
+ if (seconds == 0)
+ snprintf (buffer, sizeof(buffer), "%s%02i%02i", sign, hours, minutes);
+ else
+ snprintf (buffer, sizeof(buffer), "%s%02i%02i%02i", sign, hours, minutes, seconds);
+}
+
+static const char* get_zone_directory(void)
+{
+ return zone_files_directory == NULL ? ZONEINFO_DIRECTORY : zone_files_directory;
+}
+
+void set_zone_directory(char *path)
+{
+ zone_files_directory = malloc(strlen(path)+1);
+ if ( zone_files_directory != NULL )
+ {
+ strcpy(zone_files_directory,path);
+ }
+}
+
+void free_zone_directory(void)
+{
+ if ( zone_files_directory != NULL )
+ {
+ free(zone_files_directory);
+ }
+}
diff --git a/libkcal/libical/src/libical/icaltimezone.h b/libkcal/libical/src/libical/icaltimezone.h
new file mode 100644
index 00000000..1a97d391
--- /dev/null
+++ b/libkcal/libical/src/libical/icaltimezone.h
@@ -0,0 +1,165 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/*======================================================================
+ FILE: icaltimezone.h
+ CREATOR: Damon Chaplin 15 March 2001
+
+
+
+ (C) COPYRIGHT 2001, Damon Chaplin
+
+ 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/
+
+
+======================================================================*/
+/**
+ * @file icaltimezone.h
+ * @brief timezone handling routines
+ */
+
+#ifndef ICALTIMEZONE_H
+#define ICALTIMEZONE_H
+
+#include <stdio.h> /* For FILE* */
+#include "icaltime.h"
+#include "icalarray.h"
+#include "icalcomponent.h"
+
+
+#ifndef ICALTIMEZONE_DEFINED
+#define ICALTIMEZONE_DEFINED
+/** @brief An opaque struct representing a timezone.
+ * We declare this here to avoid a circular dependancy.
+ */
+typedef struct _icaltimezone icaltimezone;
+#endif
+
+/**
+ * @par Creating/Destroying individual icaltimezones.
+ */
+
+/** Creates a new icaltimezone. */
+icaltimezone *icaltimezone_new (void);
+
+/** Frees all memory used for the icaltimezone. Set free_struct to free the
+ icaltimezone struct as well. */
+void icaltimezone_free (icaltimezone *zone,
+ int free_struct);
+
+
+/**
+ * @par Accessing timezones.
+ */
+
+/** Free any builtin timezone information **/
+void icaltimezone_free_builtin_timezones(void);
+
+/** Returns the array of builtin icaltimezones. */
+icalarray* icaltimezone_get_builtin_timezones (void);
+
+/** Returns a single builtin timezone, given its Olson city name. */
+icaltimezone* icaltimezone_get_builtin_timezone (const char *location);
+
+/** Returns a single builtin timezone, given its TZID. */
+icaltimezone* icaltimezone_get_builtin_timezone_from_tzid (const char *tzid);
+
+/** Returns the UTC timezone. */
+icaltimezone* icaltimezone_get_utc_timezone (void);
+
+/** Returns the TZID of a timezone. */
+const char* icaltimezone_get_tzid (icaltimezone *zone);
+
+/** Returns the city name of a timezone. */
+const char* icaltimezone_get_location (icaltimezone *zone);
+
+/** Returns the TZNAME properties used in the latest STANDARD and DAYLIGHT
+ components. If they are the same it will return just one, e.g. "LMT".
+ If they are different it will format them like "EST/EDT". Note that this
+ may also return NULL. */
+const char* icaltimezone_get_tznames (icaltimezone *zone);
+
+/** Returns the latitude of a builtin timezone. */
+double icaltimezone_get_latitude (icaltimezone *zone);
+
+/** Returns the longitude of a builtin timezone. */
+double icaltimezone_get_longitude (icaltimezone *zone);
+
+/** Returns the VTIMEZONE component of a timezone. */
+icalcomponent* icaltimezone_get_component (icaltimezone *zone);
+
+/** Sets the VTIMEZONE component of an icaltimezone, initializing the tzid,
+ location & tzname fields. It returns 1 on success or 0 on failure, i.e.
+ no TZID was found. */
+int icaltimezone_set_component (icaltimezone *zone,
+ icalcomponent *comp);
+
+/**
+ * @par Converting times between timezones.
+ */
+
+void icaltimezone_convert_time (struct icaltimetype *tt,
+ icaltimezone *from_zone,
+ icaltimezone *to_zone);
+
+
+/**
+ * @par Getting offsets from UTC.
+ */
+
+/** Calculates the UTC offset of a given local time in the given
+ timezone. It is the number of seconds to add to UTC to get local
+ time. The is_daylight flag is set to 1 if the time is in
+ daylight-savings time. */
+int icaltimezone_get_utc_offset (icaltimezone *zone,
+ struct icaltimetype *tt,
+ int *is_daylight);
+
+/** Calculates the UTC offset of a given UTC time in the given
+ timezone. It is the number of seconds to add to UTC to get local
+ time. The is_daylight flag is set to 1 if the time is in
+ daylight-savings time. */
+int icaltimezone_get_utc_offset_of_utc_time (icaltimezone *zone,
+ struct icaltimetype *tt,
+ int *is_daylight);
+
+
+
+/*
+ * Handling arrays of timezones. Mainly for internal use.
+ */
+icalarray* icaltimezone_array_new (void);
+
+void icaltimezone_array_append_from_vtimezone (icalarray *timezones,
+ icalcomponent *child);
+void icaltimezone_array_free (icalarray *timezones);
+
+
+/*
+ * @par Handling the default location the timezone files
+ */
+
+/** Set the directory to look for the zonefiles */
+void set_zone_directory(char *path);
+
+/** Free memory dedicated to the zonefile directory */
+void free_zone_directory(void);
+
+/*
+ * @par Debugging Output.
+ */
+
+/** Dumps information about changes in the timezone up to and including
+ max_year. */
+int icaltimezone_dump_changes (icaltimezone *zone,
+ int max_year,
+ FILE *fp);
+
+#endif /* ICALTIMEZONE_H */
diff --git a/libkcal/libical/src/libical/icaltypes.c b/libkcal/libical/src/libical/icaltypes.c
new file mode 100644
index 00000000..6797e04d
--- /dev/null
+++ b/libkcal/libical/src/libical/icaltypes.c
@@ -0,0 +1,190 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icaltypes.c
+ CREATOR: eric 16 May 1999
+
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The original code is icaltypes.c
+
+ ======================================================================*/
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "icaltypes.h"
+#include "icalerror.h"
+#include "icalmemory.h"
+#include <stdlib.h> /* for malloc and abs() */
+#include <errno.h> /* for errno */
+#include <string.h> /* for icalmemory_strdup */
+#include <assert.h>
+
+#ifdef WIN32
+#define snprintf _snprintf
+#define strcasecmp stricmp
+#endif
+
+#define TEMP_MAX 1024
+
+
+int icaltriggertype_is_null_trigger(struct icaltriggertype tr)
+{
+ if(icaltime_is_null_time(tr.time) &&
+ icaldurationtype_is_null_duration(tr.duration)){
+ return 1;
+ }
+
+ return 0;
+}
+
+int icaltriggertype_is_bad_trigger(struct icaltriggertype tr)
+{
+ if(icaldurationtype_is_bad_duration(tr.duration)){
+ return 1;
+ }
+
+ return 0;
+}
+
+struct icaltriggertype icaltriggertype_from_int(const int reltime)
+{
+ struct icaltriggertype tr;
+
+ tr.time = icaltime_null_time();
+ tr.duration = icaldurationtype_from_int(reltime);
+
+ return tr;
+}
+
+struct icaltriggertype icaltriggertype_from_string(const char* str)
+{
+
+
+ struct icaltriggertype tr, null_tr;
+ icalerrorstate es = ICAL_ERROR_UNKNOWN;
+ icalerrorenum e;
+
+ tr.time= icaltime_null_time();
+ tr.duration = icaldurationtype_from_int(0);
+
+ null_tr = tr;
+
+
+ /* Suppress errors so a failure in icaltime_from_string() does not cause an abort */
+ es = icalerror_get_error_state(ICAL_MALFORMEDDATA_ERROR);
+ if(str == 0) goto error;
+ icalerror_set_error_state(ICAL_MALFORMEDDATA_ERROR,ICAL_ERROR_NONFATAL);
+ e = icalerrno;
+ icalerror_set_errno(ICAL_NO_ERROR);
+
+ tr.time = icaltime_from_string(str);
+
+ if (icaltime_is_null_time(tr.time)){
+
+ tr.duration = icaldurationtype_from_string(str);
+
+ if (icaldurationtype_is_bad_duration(tr.duration)) goto error;
+ }
+
+ icalerror_set_error_state(ICAL_MALFORMEDDATA_ERROR,es);
+ icalerror_set_errno(e);
+ return tr;
+
+ error:
+ icalerror_set_error_state(ICAL_MALFORMEDDATA_ERROR,es);
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return tr;
+
+}
+
+
+struct icalreqstattype icalreqstattype_from_string(const char* str)
+{
+ const char *p1,*p2;
+ struct icalreqstattype stat;
+ short major=0, minor=0;
+
+ icalerror_check_arg((str != 0),"str");
+
+ stat.code = ICAL_UNKNOWN_STATUS;
+ stat.debug = 0;
+ stat.desc = 0;
+
+ /* Get the status numbers */
+
+ sscanf(str, "%hd.%hd",&major, &minor);
+
+ if (major <= 0 || minor < 0){
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return stat;
+ }
+
+ stat.code = icalenum_num_to_reqstat(major, minor);
+
+ if (stat.code == ICAL_UNKNOWN_STATUS){
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ return stat;
+ }
+
+
+ p1 = strchr(str,';');
+
+ if (p1 == 0){
+/* icalerror_set_errno(ICAL_BADARG_ERROR);*/
+ return stat;
+ }
+
+ /* Just ignore the second clause; it will be taken from inside the library
+ */
+
+
+
+ p2 = strchr(p1+1,';');
+ if (p2 != 0 && *p2 != 0){
+ stat.debug = p2+1;
+ }
+
+ return stat;
+
+}
+
+const char* icalreqstattype_as_string(struct icalreqstattype stat)
+{
+ char *temp;
+
+ temp = (char*)icalmemory_tmp_buffer(TEMP_MAX);
+
+ icalerror_check_arg_rz((stat.code != ICAL_UNKNOWN_STATUS),"Status");
+
+ if (stat.desc == 0){
+ stat.desc = icalenum_reqstat_desc(stat.code);
+ }
+
+ if(stat.debug != 0){
+ snprintf(temp,TEMP_MAX,"%d.%d;%s;%s", icalenum_reqstat_major(stat.code),
+ icalenum_reqstat_minor(stat.code),
+ stat.desc, stat.debug);
+
+ } else {
+ snprintf(temp,TEMP_MAX,"%d.%d;%s", icalenum_reqstat_major(stat.code),
+ icalenum_reqstat_minor(stat.code),
+ stat.desc);
+ }
+
+ return temp;
+}
diff --git a/libkcal/libical/src/libical/icaltypes.h b/libkcal/libical/src/libical/icaltypes.h
new file mode 100644
index 00000000..a89069d5
--- /dev/null
+++ b/libkcal/libical/src/libical/icaltypes.h
@@ -0,0 +1,108 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icaltypes.h
+ CREATOR: eric 20 March 1999
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The original code is icaltypes.h
+
+======================================================================*/
+
+#ifndef ICALTYPES_H
+#define ICALTYPES_H
+
+#include <time.h>
+#include "icalenums.h"
+#include "icaltime.h"
+#include "icalduration.h"
+#include "icalperiod.h"
+
+
+struct icalgeotype
+{
+ float lat;
+ float lon;
+};
+
+
+struct icaldatetimeperiodtype
+{
+ struct icaltimetype time;
+ struct icalperiodtype period;
+};
+
+
+struct icaltriggertype
+{
+ struct icaltimetype time;
+ struct icaldurationtype duration;
+};
+
+struct icaltriggertype icaltriggertype_from_int(const int reltime);
+struct icaltriggertype icaltriggertype_from_string(const char* str);
+
+int icaltriggertype_is_null_trigger(struct icaltriggertype tr);
+int icaltriggertype_is_bad_trigger(struct icaltriggertype tr);
+
+/* struct icalreqstattype. This struct contains two string pointers,
+but don't try to free either of them. The "desc" string is a pointer
+to a static table inside the library. Don't try to free it. The
+"debug" string is a pointer into the string that the called passed
+into to icalreqstattype_from_string. Don't try to free it either, and
+don't use it after the original string has been freed.
+
+BTW, you would get that original string from
+*icalproperty_get_requeststatus() or icalvalue_get_text(), when
+operating on a the value of a request_status property. */
+
+struct icalreqstattype {
+
+ icalrequeststatus code;
+ const char* desc;
+ const char* debug;
+};
+
+struct icalreqstattype icalreqstattype_from_string(const char* str);
+const char* icalreqstattype_as_string(struct icalreqstattype);
+
+
+
+struct icaltimezonephase {
+ const char* tzname;
+ int is_stdandard; /* 1 = standard tme, 0 = daylight savings time */
+ struct icaltimetype dtstart;
+ int offsetto;
+ int tzoffsetfrom;
+ const char* comment;
+ struct icaldatetimeperiodtype rdate;
+ const char* rrule;
+};
+
+
+struct icaltimezonetype {
+ const char* tzid;
+ struct icaltimetype last_mod;
+ const char* tzurl;
+
+ /* Array of phases. The end of the array is a phase with tzname == 0 */
+ struct icaltimezonephase *phases;
+};
+
+void icaltimezonetype_free(struct icaltimezonetype tzt);
+
+
+#endif /* !ICALTYPES_H */
diff --git a/libkcal/libical/src/libical/icalvalue.c b/libkcal/libical/src/libical/icalvalue.c
new file mode 100644
index 00000000..4166d56a
--- /dev/null
+++ b/libkcal/libical/src/libical/icalvalue.c
@@ -0,0 +1,1326 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* vi:set ts=4 sts=4 sw=4 expandtab : */
+/*======================================================================
+ FILE: icalvalue.c
+ CREATOR: eric 02 May 1999
+
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The original code is icalvalue.c
+
+ Contributions from:
+ Graham Davison <g.m.davison@computer.org>
+
+
+======================================================================*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "icalerror.h"
+#include "icalmemory.h"
+#include "icalparser.h"
+#include "icalenums.h"
+#include "icalvalueimpl.h"
+
+#include <stdlib.h> /* for malloc */
+#include <stdio.h> /* for snprintf */
+#include <string.h> /* For memset, others */
+#include <stddef.h> /* For offsetof() macro */
+#include <errno.h>
+#include <time.h> /* for mktime */
+#include <stdlib.h> /* for atoi and atof */
+#include <limits.h> /* for SHRT_MAX */
+
+#ifdef WIN32
+#define snprintf _snprintf
+#define strcasecmp stricmp
+#endif
+
+#ifdef _MAC_OS_
+#include "icalmemory_strdup.h"
+#endif
+
+#define TMP_BUF_SIZE 1024
+
+void print_datetime_to_string(char* str, const struct icaltimetype *data);
+void print_date_to_string(char* str, const struct icaltimetype *data);
+void print_time_to_string(char* str, const struct icaltimetype *data);
+
+
+struct icalvalue_impl* icalvalue_new_impl(icalvalue_kind kind){
+
+ struct icalvalue_impl* v;
+
+ if (!icalvalue_kind_is_valid(kind))
+ return NULL;
+
+ if ( ( v = (struct icalvalue_impl*)
+ malloc(sizeof(struct icalvalue_impl))) == 0) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return 0;
+ }
+
+ strcpy(v->id,"val");
+
+ v->kind = kind;
+ v->size = 0;
+ v->parent = 0;
+ v->x_value = 0;
+ memset(&(v->data),0,sizeof(v->data));
+
+ return v;
+
+}
+
+
+
+icalvalue*
+icalvalue_new (icalvalue_kind kind)
+{
+ return (icalvalue*)icalvalue_new_impl(kind);
+}
+
+icalvalue* icalvalue_new_clone(const icalvalue* old) {
+ struct icalvalue_impl* new;
+
+ new = icalvalue_new_impl(old->kind);
+
+ if (new == 0){
+ return 0;
+ }
+
+ strcpy(new->id, old->id);
+ new->kind = old->kind;
+ new->size = old->size;
+
+ switch (new->kind){
+ case ICAL_ATTACH_VALUE:
+ case ICAL_BINARY_VALUE:
+ {
+ /* Hmm. We just ref the attach value, which may not be the right
+ * thing to do. We cannot quite copy the data, anyways, since we
+ * don't know how long it is.
+ */
+ new->data.v_attach = old->data.v_attach;
+ if (new->data.v_attach)
+ icalattach_ref (new->data.v_attach);
+
+ break;
+ }
+ case ICAL_QUERY_VALUE:
+ case ICAL_STRING_VALUE:
+ case ICAL_TEXT_VALUE:
+ case ICAL_CALADDRESS_VALUE:
+ case ICAL_URI_VALUE:
+ {
+ if (old->data.v_string != 0) {
+ new->data.v_string=icalmemory_strdup(old->data.v_string);
+
+ if ( new->data.v_string == 0 ) {
+ return 0;
+ }
+
+ }
+ break;
+ }
+ case ICAL_RECUR_VALUE:
+ {
+ if(old->data.v_recur != 0){
+ new->data.v_recur = malloc(sizeof(struct icalrecurrencetype));
+
+ if(new->data.v_recur == 0){
+ return 0;
+ }
+
+ memcpy( new->data.v_recur, old->data.v_recur,
+ sizeof(struct icalrecurrencetype));
+ }
+ break;
+ }
+
+ case ICAL_X_VALUE:
+ {
+ if (old->x_value != 0) {
+ new->x_value=icalmemory_strdup(old->x_value);
+
+ if (new->x_value == 0) {
+ return 0;
+ }
+ }
+
+ break;
+ }
+
+ default:
+ {
+ /* all of the other types are stored as values, not
+ pointers, so we can just copy the whole structure. */
+
+ new->data = old->data;
+ }
+ }
+
+ return new;
+}
+
+static char* icalmemory_strdup_and_dequote(const char* str)
+{
+ const char* p;
+ char* out = (char*)malloc(sizeof(char) * strlen(str) +1);
+ char* pout;
+
+ if (out == 0){
+ return 0;
+ }
+
+ pout = out;
+
+ for (p = str; *p!=0; p++){
+
+ if( *p == '\\')
+ {
+ p++;
+ switch(*p){
+ case 0:
+ {
+ *pout = '\0';
+ break;
+
+ }
+ case 'n':
+ case 'N':
+ {
+ *pout = '\n';
+ break;
+ }
+ case 't':
+ case 'T':
+ {
+ *pout = '\t';
+ break;
+ }
+ case 'r':
+ case 'R':
+ {
+ *pout = '\r';
+ break;
+ }
+ case 'b':
+ case 'B':
+ {
+ *pout = '\b';
+ break;
+ }
+ case 'f':
+ case 'F':
+ {
+ *pout = '\f';
+ break;
+ }
+ case ';':
+ case ',':
+ case '"':
+ case '\\':
+ {
+ *pout = *p;
+ break;
+ }
+ default:
+ {
+ *pout = ' ';
+ }
+ }
+ } else {
+ *pout = *p;
+ }
+
+ pout++;
+
+ }
+
+ *pout = '\0';
+
+ return out;
+}
+
+/*
+ * FIXME
+ *
+ * This is a bad API, as it forces callers to specify their own X type.
+ * This function should take care of this by itself.
+ */
+static
+icalvalue* icalvalue_new_enum(icalvalue_kind kind, int x_type, const char* str)
+{
+ int e = icalproperty_kind_and_string_to_enum(kind, str);
+ struct icalvalue_impl *value;
+
+ if(e != 0 && icalproperty_enum_belongs_to_property(
+ icalproperty_value_kind_to_kind(kind),e)) {
+
+ value = icalvalue_new_impl(kind);
+ value->data.v_enum = e;
+ } else {
+ /* Make it an X value */
+ value = icalvalue_new_impl(kind);
+ value->data.v_enum = x_type;
+ icalvalue_set_x(value,str);
+ }
+
+ return value;
+}
+
+
+icalvalue* icalvalue_new_from_string_with_error(icalvalue_kind kind,const char* str,icalproperty** error)
+{
+
+ struct icalvalue_impl *value = 0;
+
+ icalerror_check_arg_rz(str!=0,"str");
+
+ if (error != 0){
+ *error = 0;
+ }
+
+ switch (kind){
+
+ case ICAL_ATTACH_VALUE:
+ {
+ icalattach *attach;
+
+ attach = icalattach_new_from_url (str);
+ if (!attach)
+ break;
+
+ value = icalvalue_new_attach (attach);
+ icalattach_unref (attach);
+ break;
+ }
+
+ case ICAL_BINARY_VALUE:
+ {
+ icalattach *attach;
+ attach = icalattach_new_from_data (str, 0, 0);
+ if ( !attach )
+ break;
+ value = icalvalue_new_attach (attach);
+ icalattach_unref (attach);
+ break;
+ }
+ case ICAL_BOOLEAN_VALUE:
+ {
+ /* HACK */
+ value = 0;
+
+ if (error != 0){
+ char temp[TMP_BUF_SIZE];
+ snprintf(temp,sizeof(temp),"%s Values are not implemented",
+ icalvalue_kind_to_string(kind));
+ *error = icalproperty_vanew_xlicerror(
+ temp,
+ icalparameter_new_xlicerrortype(
+ ICAL_XLICERRORTYPE_VALUEPARSEERROR),
+ 0);
+ }
+ break;
+ }
+
+
+ case ICAL_TRANSP_VALUE:
+ value = icalvalue_new_enum(kind, (int)ICAL_TRANSP_X,str);
+ break;
+ case ICAL_METHOD_VALUE:
+ value = icalvalue_new_enum(kind, (int)ICAL_METHOD_X,str);
+ break;
+ case ICAL_STATUS_VALUE:
+ value = icalvalue_new_enum(kind, (int)ICAL_STATUS_X,str);
+ break;
+ case ICAL_ACTION_VALUE:
+ value = icalvalue_new_enum(kind, (int)ICAL_ACTION_X,str);
+ break;
+
+ case ICAL_QUERY_VALUE:
+ value = icalvalue_new_query(str);
+ break;
+
+ case ICAL_CLASS_VALUE:
+ value = icalvalue_new_enum(kind, (int)ICAL_CLASS_X,str);
+ break;
+
+
+ case ICAL_INTEGER_VALUE:
+ value = icalvalue_new_integer(atoi(str));
+ break;
+
+ case ICAL_FLOAT_VALUE:
+ value = icalvalue_new_float((float)atof(str));
+ break;
+
+ case ICAL_UTCOFFSET_VALUE:
+ {
+ int t,utcoffset, hours, minutes, seconds;
+ /* treat the UTCOFSET string a a decimal number, disassemble its digits
+ and reconstruct it as sections */
+ t = strtol(str,0,10);
+ /* add phantom seconds field */
+ if(abs(t)<9999){t *= 100; }
+ hours = (t/10000);
+ minutes = (t-hours*10000)/100;
+ seconds = (t-hours*10000-minutes*100);
+ utcoffset = hours*3600+minutes*60+seconds;
+
+ value = icalvalue_new_utcoffset(utcoffset);
+
+ break;
+ }
+
+ case ICAL_TEXT_VALUE:
+ {
+ char* dequoted_str = icalmemory_strdup_and_dequote(str);
+ value = icalvalue_new_text(dequoted_str);
+ free(dequoted_str);
+ break;
+ }
+
+ case ICAL_STRING_VALUE:
+ value = icalvalue_new_string(str);
+ break;
+
+ case ICAL_CALADDRESS_VALUE:
+ value = icalvalue_new_caladdress(str);
+ break;
+
+ case ICAL_URI_VALUE:
+ value = icalvalue_new_uri(str);
+ break;
+
+ case ICAL_GEO_VALUE:
+ value = 0;
+ /* HACK */
+
+ if (error != 0){
+ char temp[TMP_BUF_SIZE];
+ strcpy(temp,"GEO Values are not implemented");
+ *error = icalproperty_vanew_xlicerror(
+ temp,
+ icalparameter_new_xlicerrortype(
+ ICAL_XLICERRORTYPE_VALUEPARSEERROR),
+ 0);
+ }
+
+ /*icalerror_warn("Parsing GEO properties is unimplmeneted");*/
+
+ break;
+
+ case ICAL_RECUR_VALUE:
+ {
+ struct icalrecurrencetype rt;
+ rt = icalrecurrencetype_from_string(str);
+ if(rt.freq != ICAL_NO_RECURRENCE){
+ value = icalvalue_new_recur(rt);
+ }
+ break;
+ }
+
+ case ICAL_DATE_VALUE:
+ case ICAL_DATETIME_VALUE:
+ {
+ struct icaltimetype tt;
+
+ tt = icaltime_from_string(str);
+ if(!icaltime_is_null_time(tt)){
+ value = icalvalue_new_impl(kind);
+ value->data.v_time = tt;
+
+ icalvalue_reset_kind(value);
+ }
+ break;
+ }
+
+ case ICAL_DATETIMEPERIOD_VALUE:
+ {
+ struct icaltimetype tt;
+ struct icalperiodtype p;
+ tt = icaltime_from_string(str);
+
+ if(!icaltime_is_null_time(tt)){
+ value = icalvalue_new_datetime(tt);
+ break;
+ }
+
+ p = icalperiodtype_from_string(str);
+ if (!icalperiodtype_is_null_period(p)){
+ value = icalvalue_new_period(p);
+ }
+
+ break;
+ }
+
+ case ICAL_DURATION_VALUE:
+ {
+ struct icaldurationtype dur = icaldurationtype_from_string(str);
+
+ if (!icaldurationtype_is_bad_duration(dur)) { /* failed to parse */
+ value = icalvalue_new_duration(dur);
+ }
+
+ break;
+ }
+
+ case ICAL_PERIOD_VALUE:
+ {
+ struct icalperiodtype p;
+ p = icalperiodtype_from_string(str);
+
+ if(!icalperiodtype_is_null_period(p)){
+ value = icalvalue_new_period(p);
+ }
+ break;
+ }
+
+ case ICAL_TRIGGER_VALUE:
+ {
+ struct icaltriggertype tr = icaltriggertype_from_string(str);
+ if (!icaltriggertype_is_bad_trigger(tr)) {
+ value = icalvalue_new_trigger(tr);
+ }
+ break;
+ }
+
+ case ICAL_REQUESTSTATUS_VALUE:
+ {
+ struct icalreqstattype rst = icalreqstattype_from_string(str);
+ if(rst.code != ICAL_UNKNOWN_STATUS){
+ value = icalvalue_new_requeststatus(rst);
+ }
+ break;
+
+ }
+
+ case ICAL_X_VALUE:
+ {
+ char* dequoted_str = icalmemory_strdup_and_dequote(str);
+ value = icalvalue_new_x(dequoted_str);
+ free(dequoted_str);
+ }
+ break;
+
+ default:
+ {
+ if (error != 0 ){
+ char temp[TMP_BUF_SIZE];
+
+ snprintf(temp,TMP_BUF_SIZE,"Unknown type for \'%s\'",str);
+
+ *error = icalproperty_vanew_xlicerror(
+ temp,
+ icalparameter_new_xlicerrortype(
+ ICAL_XLICERRORTYPE_VALUEPARSEERROR),
+ 0);
+ }
+
+ icalerror_warn("icalvalue_new_from_string got an unknown value type");
+ value=0;
+ }
+ }
+
+
+ if (error != 0 && *error == 0 && value == 0){
+ char temp[TMP_BUF_SIZE];
+
+ snprintf(temp,TMP_BUF_SIZE,"Failed to parse value: \'%s\'",str);
+
+ *error = icalproperty_vanew_xlicerror(
+ temp,
+ icalparameter_new_xlicerrortype(
+ ICAL_XLICERRORTYPE_VALUEPARSEERROR),
+ 0);
+ }
+
+
+ return value;
+
+}
+
+icalvalue* icalvalue_new_from_string(icalvalue_kind kind,const char* str)
+{
+ return icalvalue_new_from_string_with_error(kind,str,(icalproperty**)0);
+}
+
+
+
+void
+icalvalue_free (icalvalue* v)
+{
+ icalerror_check_arg_rv((v != 0),"value");
+
+#ifdef ICAL_FREE_ON_LIST_IS_ERROR
+ icalerror_assert( (v->parent ==0),"This value is still attached to a property");
+
+#else
+ if(v->parent !=0){
+ return;
+ }
+#endif
+
+ if(v->x_value != 0){
+ free(v->x_value);
+ }
+
+ switch (v->kind){
+ case ICAL_BINARY_VALUE:
+ case ICAL_ATTACH_VALUE: {
+ if (v->data.v_attach) {
+ icalattach_unref (v->data.v_attach);
+ v->data.v_attach = NULL;
+ }
+
+ break;
+ }
+ case ICAL_TEXT_VALUE:
+ case ICAL_CALADDRESS_VALUE:
+ case ICAL_URI_VALUE:
+ case ICAL_QUERY_VALUE:
+ {
+ if (v->data.v_string != 0) {
+ free((void*)v->data.v_string);
+ v->data.v_string = 0;
+ }
+ break;
+ }
+ case ICAL_RECUR_VALUE:
+ {
+ if(v->data.v_recur != 0){
+ free((void*)v->data.v_recur);
+ v->data.v_recur = 0;
+ }
+ break;
+ }
+
+ default:
+ {
+ /* Nothing to do */
+ }
+ }
+
+ v->kind = ICAL_NO_VALUE;
+ v->size = 0;
+ v->parent = 0;
+ memset(&(v->data),0,sizeof(v->data));
+ v->id[0] = 'X';
+ free(v);
+}
+
+int
+icalvalue_is_valid (const icalvalue* value)
+{
+ if(value == 0){
+ return 0;
+ }
+
+ return 1;
+}
+
+static char* icalvalue_binary_as_ical_string(const icalvalue* value) {
+
+ const char* data;
+ char* str;
+ icalerror_check_arg_rz( (value!=0),"value");
+
+ data = icalvalue_get_binary(value);
+
+ str = (char*)icalmemory_tmp_buffer(60);
+ strcpy(str,"icalvalue_binary_as_ical_string is not implemented yet");
+
+ return str;
+}
+
+
+#define MAX_INT_DIGITS 12 /* Enough for 2^32 + sign*/
+
+static char* icalvalue_int_as_ical_string(const icalvalue* value) {
+ int data;
+ char* str = (char*)icalmemory_tmp_buffer(MAX_INT_DIGITS);
+
+ icalerror_check_arg_rz( (value!=0),"value");
+
+ data = icalvalue_get_integer(value);
+
+ snprintf(str,MAX_INT_DIGITS,"%d",data);
+
+ return str;
+}
+
+static char* icalvalue_utcoffset_as_ical_string(const icalvalue* value)
+{
+ int data,h,m,s;
+ char sign;
+ char* str = (char*)icalmemory_tmp_buffer(9);
+
+ icalerror_check_arg_rz( (value!=0),"value");
+
+ data = icalvalue_get_utcoffset(value);
+
+ if (abs(data) == data){
+ sign = '+';
+ } else {
+ sign = '-';
+ }
+
+ h = data/3600;
+ m = (data - (h*3600))/ 60;
+ s = (data - (h*3600) - (m*60));
+
+ if (s > 0)
+ snprintf(str,9,"%c%02d%02d%02d",sign,abs(h),abs(m),abs(s));
+ else
+ snprintf(str,9,"%c%02d%02d",sign,abs(h),abs(m));
+
+ return str;
+}
+
+static char* icalvalue_string_as_ical_string(const icalvalue* value) {
+
+ const char* data;
+ char* str = 0;
+ icalerror_check_arg_rz( (value!=0),"value");
+ data = value->data.v_string;
+
+ str = (char*)icalmemory_tmp_buffer(strlen(data)+1);
+
+ strcpy(str,data);
+
+ return str;
+}
+
+
+static char* icalvalue_recur_as_ical_string(const icalvalue* value)
+{
+ struct icalrecurrencetype *recur = value->data.v_recur;
+
+ return icalrecurrencetype_as_string(recur);
+}
+
+ /* @todo This is not RFC2445 compliant.
+ * The RFC only allows:
+ * TSAFE-CHAR = %x20-21 / %x23-2B / %x2D-39 / %x3C-5B / %x5D-7E / NON-US-ASCII
+ * As such, \t\r\b\f are not allowed, not even escaped
+ */
+
+static char* icalvalue_text_as_ical_string(const icalvalue* value) {
+ char *str;
+ char *str_p;
+ char *rtrn;
+ const char *p;
+ size_t buf_sz;
+
+ buf_sz = strlen(value->data.v_string)+1;
+
+ str_p = str = (char*)icalmemory_new_buffer(buf_sz);
+
+ if (str_p == 0){
+ return 0;
+ }
+
+ for(p=value->data.v_string; *p!=0; p++){
+
+ switch(*p){
+ case '\n': {
+ icalmemory_append_string(&str,&str_p,&buf_sz,"\\n");
+ break;
+ }
+
+ case '\t': {
+ icalmemory_append_string(&str,&str_p,&buf_sz,"\\t");
+ break;
+ }
+ case '\r': {
+ icalmemory_append_string(&str,&str_p,&buf_sz,"\\r");
+ break;
+ }
+ case '\b': {
+ icalmemory_append_string(&str,&str_p,&buf_sz,"\\b");
+ break;
+ }
+ case '\f': {
+ icalmemory_append_string(&str,&str_p,&buf_sz,"\\f");
+ break;
+ }
+
+ case ';':
+ case ',':
+ case '"':
+ case '\\':{
+ icalmemory_append_char(&str,&str_p,&buf_sz,'\\');
+ icalmemory_append_char(&str,&str_p,&buf_sz,*p);
+ break;
+ }
+
+ default: {
+ icalmemory_append_char(&str,&str_p,&buf_sz,*p);
+ }
+ }
+ }
+
+ /* Assume the last character is not a '\0' and add one. We could
+ check *str_p != 0, but that would be an uninitialized memory
+ read. */
+
+
+ icalmemory_append_char(&str,&str_p,&buf_sz,'\0');
+
+ rtrn = icalmemory_tmp_copy(str);
+
+ icalmemory_free_buffer(str);
+
+ return rtrn;
+}
+
+
+static char*
+icalvalue_attach_as_ical_string(const icalvalue* value)
+{
+ icalattach *a;
+ char * str;
+
+ icalerror_check_arg_rz( (value!=0),"value");
+
+ a = icalvalue_get_attach(value);
+
+ if (icalattach_get_is_url (a)) {
+ const char *url;
+
+ url = icalattach_get_url (a);
+ str = icalmemory_tmp_buffer (strlen (url) + 1);
+ strcpy (str, url);
+ return str;
+ } else {
+/* return icalvalue_binary_as_ical_string (value);*/
+ const char *data = 0;
+ data = (const char*)icalattach_get_data(a);
+ str = icalmemory_tmp_buffer (strlen (data) + 1);
+ strcpy (str, data);
+ return str;
+}
+}
+
+
+static char* icalvalue_duration_as_ical_string(const icalvalue* value) {
+
+ struct icaldurationtype data;
+
+ icalerror_check_arg_rz( (value!=0),"value");
+ data = icalvalue_get_duration(value);
+
+ return icaldurationtype_as_ical_string(data);
+}
+
+void print_time_to_string(char* str, const struct icaltimetype *data)
+{
+ char temp[20];
+
+ if (icaltime_is_utc(*data)){
+ snprintf(temp,sizeof(temp),"%02d%02d%02dZ",data->hour,data->minute,data->second);
+ } else {
+ snprintf(temp,sizeof(temp),"%02d%02d%02d",data->hour,data->minute,data->second);
+ }
+
+ strcat(str,temp);
+}
+
+
+void print_date_to_string(char* str, const struct icaltimetype *data)
+{
+ char temp[20];
+
+ snprintf(temp,sizeof(temp),"%04d%02d%02d",data->year,data->month,data->day);
+
+ strcat(str,temp);
+}
+
+static char* icalvalue_date_as_ical_string(const icalvalue* value) {
+
+ struct icaltimetype data;
+ char* str;
+ icalerror_check_arg_rz( (value!=0),"value");
+ data = icalvalue_get_date(value);
+
+ str = (char*)icalmemory_tmp_buffer(9);
+
+ str[0] = 0;
+ print_date_to_string(str,&data);
+
+ return str;
+}
+
+void print_datetime_to_string(char* str, const struct icaltimetype *data)
+{
+ print_date_to_string(str,data);
+ if ( !data->is_date ) {
+ strcat(str,"T");
+ print_time_to_string(str,data);
+ }
+}
+
+static const char* icalvalue_datetime_as_ical_string(const icalvalue* value) {
+
+ struct icaltimetype data;
+ char* str;
+ icalvalue_kind kind = icalvalue_isa(value);
+
+ icalerror_check_arg_rz( (value!=0),"value");
+
+
+ if( !(kind == ICAL_DATE_VALUE || kind == ICAL_DATETIME_VALUE ))
+ {
+ icalerror_set_errno(ICAL_BADARG_ERROR);
+ return 0;
+ }
+
+ data = icalvalue_get_datetime(value);
+
+ str = (char*)icalmemory_tmp_buffer(20);
+
+ str[0] = 0;
+
+ print_datetime_to_string(str,&data);
+
+ return str;
+
+}
+
+static char* icalvalue_float_as_ical_string(const icalvalue* value) {
+
+ float data;
+ char* str;
+ icalerror_check_arg_rz( (value!=0),"value");
+ data = icalvalue_get_float(value);
+
+ str = (char*)icalmemory_tmp_buffer(40);
+
+ snprintf(str,40,"%f",data);
+
+ return str;
+}
+
+static char* icalvalue_geo_as_ical_string(const icalvalue* value) {
+
+ struct icalgeotype data;
+ char* str;
+ icalerror_check_arg_rz( (value!=0),"value");
+
+ data = icalvalue_get_geo(value);
+
+ str = (char*)icalmemory_tmp_buffer(80);
+
+ snprintf(str,80,"%f;%f",data.lat,data.lon);
+
+ return str;
+}
+
+static const char* icalvalue_datetimeperiod_as_ical_string(const icalvalue* value) {
+ struct icaldatetimeperiodtype dtp = icalvalue_get_datetimeperiod(value);
+
+ icalerror_check_arg_rz( (value!=0),"value");
+
+ if(!icaltime_is_null_time(dtp.time)){
+ return icaltime_as_ical_string(dtp.time);
+ } else {
+ return icalperiodtype_as_ical_string(dtp.period);
+ }
+}
+
+static const char* icalvalue_period_as_ical_string(const icalvalue* value) {
+ struct icalperiodtype data;
+ icalerror_check_arg_rz( (value!=0),"value");
+ data = icalvalue_get_period(value);
+
+ return icalperiodtype_as_ical_string(data);
+
+}
+
+static const char* icalvalue_trigger_as_ical_string(const icalvalue* value) {
+
+ struct icaltriggertype data;
+
+ icalerror_check_arg_rz( (value!=0),"value");
+ data = icalvalue_get_trigger(value);
+
+ if(!icaltime_is_null_time(data.time)){
+ return icaltime_as_ical_string(data.time);
+ } else {
+ return icaldurationtype_as_ical_string(data.duration);
+ }
+
+}
+
+const char*
+icalvalue_as_ical_string(const icalvalue* value)
+{
+ if(value == 0){
+ return 0;
+ }
+
+ switch (value->kind){
+
+ case ICAL_ATTACH_VALUE:
+ return icalvalue_attach_as_ical_string(value);
+
+ case ICAL_BINARY_VALUE:
+ return icalvalue_binary_as_ical_string(value);
+
+ case ICAL_BOOLEAN_VALUE:
+ case ICAL_INTEGER_VALUE:
+ return icalvalue_int_as_ical_string(value);
+
+ case ICAL_UTCOFFSET_VALUE:
+ return icalvalue_utcoffset_as_ical_string(value);
+
+ case ICAL_TEXT_VALUE:
+ return icalvalue_text_as_ical_string(value);
+
+ case ICAL_QUERY_VALUE:
+ return icalvalue_string_as_ical_string(value);
+
+ case ICAL_STRING_VALUE:
+ case ICAL_URI_VALUE:
+ case ICAL_CALADDRESS_VALUE:
+ return icalvalue_string_as_ical_string(value);
+
+ case ICAL_DATE_VALUE:
+ return icalvalue_date_as_ical_string(value);
+ case ICAL_DATETIME_VALUE:
+ return icalvalue_datetime_as_ical_string(value);
+ case ICAL_DURATION_VALUE:
+ return icalvalue_duration_as_ical_string(value);
+
+ case ICAL_PERIOD_VALUE:
+ return icalvalue_period_as_ical_string(value);
+ case ICAL_DATETIMEPERIOD_VALUE:
+ return icalvalue_datetimeperiod_as_ical_string(value);
+
+ case ICAL_FLOAT_VALUE:
+ return icalvalue_float_as_ical_string(value);
+
+ case ICAL_GEO_VALUE:
+ return icalvalue_geo_as_ical_string(value);
+
+ case ICAL_RECUR_VALUE:
+ return icalvalue_recur_as_ical_string(value);
+
+ case ICAL_TRIGGER_VALUE:
+ return icalvalue_trigger_as_ical_string(value);
+
+ case ICAL_REQUESTSTATUS_VALUE:
+ return icalreqstattype_as_string(value->data.v_requeststatus);
+
+ case ICAL_ACTION_VALUE:
+ case ICAL_METHOD_VALUE:
+ case ICAL_STATUS_VALUE:
+ case ICAL_TRANSP_VALUE:
+ case ICAL_CLASS_VALUE:
+ if(value->x_value !=0){
+ return icalmemory_tmp_copy(value->x_value);
+ }
+
+ return icalproperty_enum_to_string(value->data.v_enum);
+
+ case ICAL_X_VALUE:
+ if (value->x_value != 0)
+ return icalmemory_tmp_copy(value->x_value);
+
+ /* FALLTHRU */
+
+ case ICAL_NO_VALUE:
+ default:
+ {
+ return 0;
+ }
+ }
+}
+
+
+icalvalue_kind
+icalvalue_isa (const icalvalue* value)
+{
+ if(value == 0){
+ return ICAL_NO_VALUE;
+ }
+
+ return value->kind;
+}
+
+
+int
+icalvalue_isa_value (void* value)
+{
+ struct icalvalue_impl *impl = (struct icalvalue_impl *)value;
+
+ icalerror_check_arg_rz( (value!=0), "value");
+
+ if (strcmp(impl->id,"val") == 0) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+
+static int icalvalue_is_time(const icalvalue* a) {
+ icalvalue_kind kind = icalvalue_isa(a);
+
+ if(kind == ICAL_DATETIME_VALUE ||
+ kind == ICAL_DATE_VALUE ){
+ return 1;
+ }
+
+ return 0;
+
+}
+
+/*
+ * In case of error, this function returns 0. This is partly bogus, as 0 is
+ * not part of the returned enum.
+ * FIXME We should probably add an error value to the enum.
+ */
+icalparameter_xliccomparetype
+icalvalue_compare(const icalvalue* a, const icalvalue *b)
+{
+
+ icalerror_check_arg_rz( (a!=0), "a");
+ icalerror_check_arg_rz( (b!=0), "b");
+
+ /* Not the same type; they can only be unequal */
+ if( ! (icalvalue_is_time(a) && icalvalue_is_time(b)) &&
+ icalvalue_isa(a) != icalvalue_isa(b)){
+ return ICAL_XLICCOMPARETYPE_NOTEQUAL;
+ }
+
+ switch (icalvalue_isa(a)){
+
+ case ICAL_ATTACH_VALUE:
+ {
+ if (icalattach_get_is_url(a->data.v_attach) &&
+ icalattach_get_is_url(b->data.v_attach)) {
+ if (strcasecmp(icalattach_get_url(a->data.v_attach),
+ icalattach_get_url(b->data.v_attach)) == 0)
+ return ICAL_XLICCOMPARETYPE_EQUAL;
+ else
+ return ICAL_XLICCOMPARETYPE_NOTEQUAL;
+ }
+ else {
+ if (a->data.v_attach == b->data.v_attach)
+ return ICAL_XLICCOMPARETYPE_EQUAL;
+ else
+ return ICAL_XLICCOMPARETYPE_NOTEQUAL;
+ }
+ }
+ case ICAL_BINARY_VALUE:
+ {
+ if (a->data.v_attach == b->data.v_attach)
+ return ICAL_XLICCOMPARETYPE_EQUAL;
+ else
+ return ICAL_XLICCOMPARETYPE_NOTEQUAL;
+ }
+
+ case ICAL_BOOLEAN_VALUE:
+ {
+ if (icalvalue_get_boolean(a) == icalvalue_get_boolean(b)){
+ return ICAL_XLICCOMPARETYPE_EQUAL;
+ } else {
+ return ICAL_XLICCOMPARETYPE_NOTEQUAL;
+ }
+ }
+
+ case ICAL_FLOAT_VALUE:
+ {
+ if (a->data.v_float > b->data.v_float){
+ return ICAL_XLICCOMPARETYPE_GREATER;
+ } else if (a->data.v_float < b->data.v_float){
+ return ICAL_XLICCOMPARETYPE_LESS;
+ } else {
+ return ICAL_XLICCOMPARETYPE_EQUAL;
+ }
+ }
+
+ case ICAL_INTEGER_VALUE:
+ case ICAL_UTCOFFSET_VALUE:
+ {
+ if (a->data.v_int > b->data.v_int){
+ return ICAL_XLICCOMPARETYPE_GREATER;
+ } else if (a->data.v_int < b->data.v_int){
+ return ICAL_XLICCOMPARETYPE_LESS;
+ } else {
+ return ICAL_XLICCOMPARETYPE_EQUAL;
+ }
+ }
+
+ case ICAL_DURATION_VALUE:
+ {
+ int dur_a = icaldurationtype_as_int(a->data.v_duration);
+ int dur_b = icaldurationtype_as_int(b->data.v_duration);
+
+ if (dur_a > dur_b){
+ return ICAL_XLICCOMPARETYPE_GREATER;
+ } else if (dur_a < dur_b){
+ return ICAL_XLICCOMPARETYPE_LESS;
+ } else {
+ return ICAL_XLICCOMPARETYPE_EQUAL;
+ }
+ }
+
+
+ case ICAL_TEXT_VALUE:
+ case ICAL_URI_VALUE:
+ case ICAL_CALADDRESS_VALUE:
+ case ICAL_TRIGGER_VALUE:
+ case ICAL_DATE_VALUE:
+ case ICAL_DATETIME_VALUE:
+ case ICAL_DATETIMEPERIOD_VALUE:
+ case ICAL_QUERY_VALUE:
+ case ICAL_RECUR_VALUE:
+ {
+ int r;
+
+ r = strcmp(icalvalue_as_ical_string(a),
+ icalvalue_as_ical_string(b));
+
+ if (r > 0) {
+ return ICAL_XLICCOMPARETYPE_GREATER;
+ } else if (r < 0){
+ return ICAL_XLICCOMPARETYPE_LESS;
+ } else {
+ return ICAL_XLICCOMPARETYPE_EQUAL;
+ }
+
+
+ }
+
+ case ICAL_METHOD_VALUE:
+ {
+ if (icalvalue_get_method(a) == icalvalue_get_method(b)){
+ return ICAL_XLICCOMPARETYPE_EQUAL;
+ } else {
+ return ICAL_XLICCOMPARETYPE_NOTEQUAL;
+ }
+
+ }
+
+ case ICAL_STATUS_VALUE:
+ {
+ if (icalvalue_get_status(a) == icalvalue_get_status(b)){
+ return ICAL_XLICCOMPARETYPE_EQUAL;
+ } else {
+ return ICAL_XLICCOMPARETYPE_NOTEQUAL;
+ }
+
+ }
+
+ case ICAL_TRANSP_VALUE:
+ {
+ if (icalvalue_get_transp(a) == icalvalue_get_transp(b)){
+ return ICAL_XLICCOMPARETYPE_EQUAL;
+ } else {
+ return ICAL_XLICCOMPARETYPE_NOTEQUAL;
+ }
+ }
+
+ case ICAL_ACTION_VALUE:
+ {
+ if (icalvalue_get_action(a) == icalvalue_get_action(b)){
+ return ICAL_XLICCOMPARETYPE_EQUAL;
+ } else {
+ return ICAL_XLICCOMPARETYPE_NOTEQUAL;
+ }
+ }
+
+ case ICAL_PERIOD_VALUE:
+ case ICAL_GEO_VALUE:
+ case ICAL_NO_VALUE:
+ default:
+ {
+ icalerror_warn("Comparison not implemented for value type");
+ return 0;
+ }
+ }
+
+}
+
+/** Examine the value and possibly change the kind to agree with the
+ * value
+ */
+
+void icalvalue_reset_kind(icalvalue* value)
+{
+ if( (value->kind==ICAL_DATETIME_VALUE || value->kind==ICAL_DATE_VALUE )&&
+ !icaltime_is_null_time(value->data.v_time) ) {
+
+ if(icaltime_is_date(value->data.v_time)){
+ value->kind = ICAL_DATE_VALUE;
+ } else {
+ value->kind = ICAL_DATETIME_VALUE;
+ }
+ }
+
+}
+
+void icalvalue_set_parent(icalvalue* value,
+ icalproperty* property)
+{
+ value->parent = property;
+}
+
+icalproperty* icalvalue_get_parent(icalvalue* value)
+{
+ return value->parent;
+}
+
+
+int icalvalue_encode_ical_string(const char *szText, char *szEncText, int nMaxBufferLen)
+{
+ char *ptr;
+ icalvalue *value = 0;
+
+ if ((szText == 0) || (szEncText == 0))
+ return 0;
+
+ value = icalvalue_new_from_string(ICAL_STRING_VALUE, szText);
+
+ if (value == 0)
+ return 0;
+
+ ptr = icalvalue_text_as_ical_string(value);
+ if (ptr == 0)
+ return 0;
+
+ if ((int)strlen(ptr) >= nMaxBufferLen)
+ {
+ icalvalue_free (value);
+ return 0;
+ }
+
+ strcpy(szEncText, ptr);
+
+ icalvalue_free ((icalvalue*)value);
+
+ return 1;
+}
+
+/* The remaining interfaces are 'new', 'set' and 'get' for each of the value
+ types */
diff --git a/libkcal/libical/src/libical/icalvalue.h b/libkcal/libical/src/libical/icalvalue.h
new file mode 100644
index 00000000..96b97043
--- /dev/null
+++ b/libkcal/libical/src/libical/icalvalue.h
@@ -0,0 +1,87 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalvalue.h
+ CREATOR: eric 20 March 1999
+
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The original code is icalvalue.h
+
+ ======================================================================*/
+
+#ifndef ICALVALUE_H
+#define ICALVALUE_H
+
+#include <time.h>
+#include "icalenums.h"
+#include "icaltypes.h"
+#include "icalrecur.h"
+#include "icalduration.h"
+#include "icalperiod.h"
+#include "icalderivedproperty.h" /* For icalproperty_method, etc. */
+#include "icalderivedparameter.h"
+#include "icalderivedvalue.h"
+
+/* Defined in icalderivedvalue.h */
+/*typedef struct icalvalue_impl icalvalue;*/
+
+icalvalue* icalvalue_new(icalvalue_kind kind);
+
+icalvalue* icalvalue_new_clone(const icalvalue* value);
+
+icalvalue* icalvalue_new_from_string(icalvalue_kind kind, const char* str);
+
+void icalvalue_free(icalvalue* value);
+
+int icalvalue_is_valid(const icalvalue* value);
+
+const char* icalvalue_as_ical_string(const icalvalue* value);
+
+icalvalue_kind icalvalue_isa(const icalvalue* value);
+
+int icalvalue_isa_value(void*);
+
+icalparameter_xliccomparetype icalvalue_compare(const icalvalue* a, const icalvalue *b);
+
+
+/* Special, non autogenerated value accessors */
+
+icalvalue* icalvalue_new_recur (struct icalrecurrencetype v);
+void icalvalue_set_recur(icalvalue* value, struct icalrecurrencetype v);
+struct icalrecurrencetype icalvalue_get_recur(const icalvalue* value);
+
+icalvalue* icalvalue_new_trigger (struct icaltriggertype v);
+void icalvalue_set_trigger(icalvalue* value, struct icaltriggertype v);
+struct icaltriggertype icalvalue_get_trigger(const icalvalue* value);
+
+icalvalue* icalvalue_new_datetimeperiod (struct icaldatetimeperiodtype v);
+void icalvalue_set_datetimeperiod(icalvalue* value,
+ struct icaldatetimeperiodtype v);
+struct icaldatetimeperiodtype icalvalue_get_datetimeperiod(const icalvalue* value);
+
+/* Convert enumerations */
+
+icalvalue_kind icalvalue_string_to_kind(const char* str);
+const char* icalvalue_kind_to_string(const icalvalue_kind kind);
+
+/** Check validity of a specific icalvalue_kind **/
+int icalvalue_kind_is_valid(const icalvalue_kind kind);
+
+/** Encode a character string in ical format, esacpe certain characters, etc. */
+int icalvalue_encode_ical_string(const char *szText, char *szEncText, int MaxBufferLen);
+
+#endif /*ICALVALUE_H*/
diff --git a/libkcal/libical/src/libical/icalvalueimpl.h b/libkcal/libical/src/libical/icalvalueimpl.h
new file mode 100644
index 00000000..545c8fa7
--- /dev/null
+++ b/libkcal/libical/src/libical/icalvalueimpl.h
@@ -0,0 +1,95 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalvalue.c
+ CREATOR: eric 02 May 1999
+
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The original code is icalvalue.c
+
+ Contributions from:
+ Graham Davison (g.m.davison@computer.org)
+
+
+======================================================================*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifndef ICALVALUEIMPL_H
+#define ICALVALUEIMPL_H
+
+#include "icalenums.h"
+#include "icalproperty.h"
+#include "icalderivedvalue.h"
+
+
+struct icalvalue_impl {
+ icalvalue_kind kind; /*this is the kind that is visible from the outside*/
+
+ char id[5];
+ int size;
+ icalproperty* parent;
+ char* x_value;
+
+ union data {
+ icalattach *v_attach;
+ /* void *v_binary; */ /* use v_attach */
+ const char *v_string;
+ /*char *v_text;*/
+ /*char *v_caladdress;*/
+ /*char *v_uri;*/
+ float v_float;
+ int v_int;
+ /*int v_boolean;*/
+ /*int v_integer;*/
+ struct icaldurationtype v_duration;
+ /*int v_utcoffset;*/
+
+ struct icalperiodtype v_period;
+ /*struct icalperiodtype v_datetimeperiod;*/
+ struct icalgeotype v_geo;
+ /*time_t v_time;*/
+ struct icaltimetype v_time;
+ /*struct icaltimetype v_date;*/
+ /*struct icaltimetype v_datetime;*/
+ /*struct icaltimetype v_datetimedate;*/
+
+ struct icalreqstattype v_requeststatus;
+
+ /* struct icalrecurrencetype was once included
+ directly ( not referenced ) in this union, but it
+ contributes 2000 bytes to every value, so now it is
+ a reference*/
+
+ struct icalrecurrencetype *v_recur;
+ struct icaltriggertype v_trigger;
+
+ int v_enum;
+ /* v_enum takes care of several enumerated types including:
+ icalproperty_method v_method;
+ icalproperty_status v_status;
+ icalproperty_action v_action;
+ icalproperty_class v_class;
+ icalproperty_transp v_transp;
+ */
+
+ } data;
+};
+
+#endif
diff --git a/libkcal/libical/src/libical/icalversion.h b/libkcal/libical/src/libical/icalversion.h
new file mode 100644
index 00000000..c4b1d15e
--- /dev/null
+++ b/libkcal/libical/src/libical/icalversion.h
@@ -0,0 +1,7 @@
+#ifndef ICAL_VERSION_H
+#define ICAL_VERSION_H
+
+#define ICAL_PACKAGE "libical"
+#define ICAL_VERSION "0.24"
+
+#endif
diff --git a/libkcal/libical/src/libical/icalversion.h.in b/libkcal/libical/src/libical/icalversion.h.in
new file mode 100644
index 00000000..5d213693
--- /dev/null
+++ b/libkcal/libical/src/libical/icalversion.h.in
@@ -0,0 +1,7 @@
+#ifndef ICAL_VERSION_H
+#define ICAL_VERSION_H
+
+#define ICAL_PACKAGE "@PACKAGE@"
+#define ICAL_VERSION "@VERSION@"
+
+#endif
diff --git a/libkcal/libical/src/libical/pvl.c b/libkcal/libical/src/libical/pvl.c
new file mode 100644
index 00000000..d663eaab
--- /dev/null
+++ b/libkcal/libical/src/libical/pvl.c
@@ -0,0 +1,585 @@
+/*======================================================================
+ FILE: pvl.c
+ CREATOR: eric November, 1995
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+======================================================================*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "pvl.h"
+#include <errno.h>
+#include <assert.h>
+#include <stdlib.h>
+
+/**
+ struct pvl_list_t
+
+ The list structure. This is the hanlde for the entire list
+
+ This type is also private. Use pvl_list instead
+
+ */
+
+typedef struct pvl_list_t
+{
+ int MAGIC; /**< Magic Identifier */
+ struct pvl_elem_t *head; /**< Head of list */
+ struct pvl_elem_t *tail; /**< Tail of list */
+ int count; /**< Number of items in the list */
+ struct pvl_elem_t *p; /**< Pointer used for iterators */
+} pvl_list_t;
+
+
+
+
+/**
+ * This global is incremented for each call to pvl_new_element(); it gives each
+ * list a unique identifer
+ */
+
+int pvl_elem_count = 0;
+int pvl_list_count = 0;
+
+
+/**
+ * @brief Creates a new list, clears the pointers and assigns a magic number
+ *
+ * @return Pointer to the new list, 0 if there is no available memory.
+ */
+
+pvl_list
+pvl_newlist()
+{
+ struct pvl_list_t *L;
+
+ if ( ( L = (struct pvl_list_t*)malloc(sizeof(struct pvl_list_t))) == 0)
+ {
+ errno = ENOMEM;
+ return 0;
+ }
+
+ L->MAGIC = pvl_list_count;
+ pvl_list_count++;
+ L->head = 0;
+ L->tail = 0;
+ L->count = 0;
+ L->p = 0;
+
+ return L;
+}
+
+void
+pvl_free(pvl_list l)
+{
+ struct pvl_list_t *L = (struct pvl_list_t *)l;
+
+ pvl_clear(l);
+
+ free(L);
+}
+
+/**
+ * @brief Creates a new list element, assigns a magic number, and assigns
+ * the next and previous pointers.
+ *
+ * Passing in the next and previous points may seem odd, but it allos the user
+ * to set them while keeping the internal data hidden. In nearly all cases,
+ * the user is the pvl library itself.
+ *
+ * @param d The data item to be stored in the list
+ * @param next Pointer value to assign to the member "next"
+ * @param prior Pointer value to assign to the member "prior"
+ *
+ * @return A pointer to the new element, 0 if there is no memory available.
+ */
+
+pvl_elem
+pvl_new_element(void *d, pvl_elem next, pvl_elem prior)
+{
+ struct pvl_elem_t *E;
+
+ if ( ( E = (struct pvl_elem_t*)malloc(sizeof(struct pvl_elem_t))) == 0)
+ {
+ errno = ENOMEM;
+ return 0;
+ }
+
+ E->MAGIC = pvl_elem_count++;
+ E->d = d;
+ E->next = next;
+ E->prior = prior;
+
+ return (pvl_elem)E;
+}
+
+/**
+ * @brief Add a new element to the from of the list
+ *
+ * @param L The list to add the item to
+ * @param d Pointer to the item to add
+ */
+
+void
+pvl_unshift(pvl_list L,void *d)
+{
+ struct pvl_elem_t *E = pvl_new_element(d,L->head,0);
+
+ if (E->next != 0)
+ {
+ /* Link the head node to it */
+ E->next->prior = E;
+ }
+
+ /* move the head */
+ L->head = E;
+
+ /* maybe move the tail */
+
+ if (L->tail == 0)
+ {
+ L->tail = E;
+ }
+
+ L->count++;
+}
+
+/**
+ * @brief Remove an element from the front of the list
+ *
+ * @param L The list to operate on
+ *
+ * @return the entry on the front of the list
+ */
+
+void*
+pvl_shift(pvl_list L)
+{
+ if (L->head == 0)
+ {
+ return 0;
+ }
+
+ return pvl_remove(L,(void*)L->head);
+
+}
+
+/**
+ * @brief Add a new item to the tail of the list
+ *
+ * @param L The list to operate on
+ * @param d Pointer to the item to add
+ *
+ */
+
+void
+pvl_push(pvl_list L,void *d)
+{
+ struct pvl_elem_t *E = pvl_new_element(d,0,L->tail);
+
+ /* These are done in pvl_new_element
+ E->next = 0;
+ E->prior = L->tail;
+ */
+
+ if (L->tail != 0)
+ {
+ L->tail->next = E;
+ }
+
+ if (L->head == 0)
+ {
+ L->head = E;
+ }
+
+ L->tail = E;
+
+ L->count++;
+
+}
+
+/**
+ * @brief Remove an element from the tail of the list
+ *
+ * @param L The list to operate on
+ */
+
+void*
+pvl_pop(pvl_list L)
+{
+ if ( L->tail == 0)
+ {
+ return 0;
+ }
+
+ return pvl_remove(L,(void*) L->tail);;
+
+}
+
+
+/**
+ * Add a new item to a list that is ordered by a comparison function.
+ * This routine assumes that the list is properly ordered.
+ *
+ * @param L The list to operate on
+ * @param f Pointer to a comparison function
+ * @param d Pointer to data to pass to the comparison function
+ */
+
+void
+pvl_insert_ordered(pvl_list L,pvl_comparef f,void *d)
+{
+ struct pvl_elem_t *P;
+
+ L->count++;
+
+ /* Empty list, add to head */
+
+ if(L->head == 0)
+ {
+ pvl_unshift(L,d);
+ return;
+ }
+
+ /* smaller than head, add to head */
+
+ if ( ((*f)(d,L->head->d)) <= 0)
+ {
+ pvl_unshift(L,d);
+ return;
+ }
+
+ /* larger than tail, add to tail */
+ if ( (*f)(d,L->tail->d) >= 0)
+ {
+ pvl_push(L,d);
+ return;
+ }
+
+
+ /* Search for the first element that is smaller, and add before it */
+
+ for (P=L->head; P != 0; P = P->next)
+ {
+ if ( (*f)(P->d,d) >= 0)
+ {
+ pvl_insert_before(L,P,d);
+ return;
+ }
+ }
+
+ /* badness, choke */
+#ifndef lint
+ assert(0);
+#endif
+}
+
+/**
+ * @brief Add a new item after the referenced element.
+ * @param L The list to operate on
+ * @param P The list element to add the item after
+ * @param d Pointer to the item to add.
+ */
+
+void
+pvl_insert_after(pvl_list L,pvl_elem P,void *d)
+{
+ struct pvl_elem_t *E = 0;
+
+ L->count++;
+
+ if (P == 0)
+ {
+ pvl_unshift(L,d);
+ return;
+ }
+
+ if ( P == L->tail)
+ {
+ E = pvl_new_element(d,0,P);
+ L->tail = E;
+ E->prior->next = E;
+ }
+ else
+ {
+ E = pvl_new_element(d,P->next,P);
+ E->next->prior = E;
+ E->prior->next = E;
+ }
+}
+
+/**
+ * @brief Add an item after a referenced item
+ *
+ * @param L The list to operate on
+ * @param P The list element to add the item before
+ * @param d Pointer to the data to be added.
+ */
+
+void
+pvl_insert_before(pvl_list L,pvl_elem P,void *d)
+{
+ struct pvl_elem_t *E = 0;
+
+ L->count++;
+
+ if (P == 0)
+ {
+ pvl_unshift(L,d);
+ return;
+ }
+
+ if ( P == L->head)
+ {
+ E = pvl_new_element(d,P,0);
+ E->next->prior = E;
+ L->head = E;
+ }
+ else
+ {
+ E = pvl_new_element(d,P,P->prior);
+ E->prior->next = E;
+ E->next->prior = E;
+ }
+}
+
+/**
+ * @brief Remove the referenced item from the list.
+ *
+ * This routine will free the element, but not the data item that the
+ * element contains.
+ *
+ * @param L The list to operate on
+ * @param E The element to remove.
+ */
+
+void*
+pvl_remove(pvl_list L,pvl_elem E)
+{
+ void* data;
+
+ if (E == L->head)
+ {
+ if (E->next != 0)
+ {
+ E->next->prior = 0;
+ L->head = E->next;
+ } else {
+ /* E Also points to tail -> only one element in list */
+ L->tail = 0;
+ L->head = 0;
+ }
+ }
+ else if (E == L->tail)
+ {
+ if (E->prior != 0)
+ {
+ E->prior->next = 0;
+ L->tail = E->prior;
+ } else {
+ /* E points to the head, so it was the last element */
+ /* This case should be taken care of in the previous clause */
+ L->head = 0;
+ L->tail = 0;
+ }
+ }
+ else
+ {
+ E->prior->next = E->next;
+ E->next->prior = E->prior;
+ }
+
+
+ L->count--;
+
+ data = E->d;
+
+ E->prior = 0;
+ E->next = 0;
+ E->d = 0;
+
+ free(E);
+
+ return data;
+
+}
+
+/**
+ * @brief Return a pointer to data that satisfies a function.
+ *
+ * This routine will interate through the entire list and call the
+ * find function for each item. It will break and return a pointer to the
+ * data that causes the find function to return 1.
+ *
+ * @param l The list to operate on
+ * @param f Pointer to the find function
+ * @param v Pointer to constant data to pass into the function
+ *
+ * @return Pointer to the element that the find function found.
+ */
+
+pvl_elem
+pvl_find(pvl_list l,pvl_findf f,void* v)
+{
+ pvl_elem e;
+
+ for (e=pvl_head(l); e!= 0; e = pvl_next(e))
+ {
+ if ( (*f)(((struct pvl_elem_t *)e)->d,v) == 1)
+ {
+ /* Save this elem for a call to find_next */
+ ((struct pvl_list_t *)l)->p = e;
+ return e;
+ }
+ }
+
+ return 0;
+
+}
+
+/**
+ * @brief Like pvl_find(), but continues the search where the last find() or
+ * find_next() left off.
+ *
+ * @param l The list to operate on
+ * @param f Pointer to the find function
+ * @param v Pointer to constant data to pass into the function
+ *
+ * @return Pointer to the element that the find function found.
+ */
+
+pvl_elem
+pvl_find_next(pvl_list l,pvl_findf f,void* v)
+{
+
+ pvl_elem e;
+
+ for (e=pvl_head(l); e!= 0; e = pvl_next(e))
+ {
+ if ( (*f)(((struct pvl_elem_t *)e)->d,v) == 1)
+ {
+ /* Save this elem for a call to find_next */
+ ((struct pvl_list_t *)l)->p = e;
+ return e;
+ }
+ }
+
+ return 0;
+
+}
+
+/**
+ * @brief Remove the all the elements in the list. The does not free
+ * the data items the elements hold.
+ */
+
+void
+pvl_clear(pvl_list l)
+{
+ pvl_elem e = pvl_head(l);
+ pvl_elem next;
+
+ if (e == 0) {
+ return;
+ }
+
+ while(e != 0)
+ {
+ next = pvl_next(e);
+ pvl_remove(l,e);
+ e = next;
+ }
+}
+
+
+/**
+ * @brief Returns the number of items in the list.
+ */
+
+int
+pvl_count(pvl_list L)
+{
+ return L->count;
+}
+
+
+/**
+ * @brief Returns a pointer to the given element
+ */
+
+pvl_elem
+pvl_next(pvl_elem E)
+{
+ if (E == 0){
+ return 0;
+ }
+
+ return (pvl_elem)E->next;
+}
+
+
+/**
+ * @brief Returns a pointer to the element previous to the element given.
+ */
+
+pvl_elem
+pvl_prior(pvl_elem E)
+{
+ return (pvl_elem)E->prior;
+}
+
+
+/**
+ * @brief Returns a pointer to the first item in the list.
+ */
+
+pvl_elem
+pvl_head(pvl_list L )
+{
+ return (pvl_elem)L->head;
+}
+
+/**
+ * @brief Returns a pointer to the last item in the list.
+ */
+pvl_elem
+pvl_tail(pvl_list L)
+{
+ return (pvl_elem)L->tail;
+}
+
+#ifndef PVL_USE_MACROS
+void*
+pvl_data(pvl_elem E)
+{
+ if ( E == 0){
+ return 0;
+ }
+
+ return E->d;
+}
+#endif
+
+/**
+ * @brief Call a function for every item in the list.
+ *
+ * @param l The list to operate on
+ * @param f Pointer to the function to call
+ * @param v Data to pass to the function on every iteration
+ */
+
+void
+pvl_apply(pvl_list l,pvl_applyf f, void *v)
+{
+ pvl_elem e;
+
+ for (e=pvl_head(l); e!= 0; e = pvl_next(e))
+ {
+ (*f)(((struct pvl_elem_t *)e)->d,v);
+ }
+
+}
diff --git a/libkcal/libical/src/libical/pvl.h b/libkcal/libical/src/libical/pvl.h
new file mode 100644
index 00000000..cb306ae6
--- /dev/null
+++ b/libkcal/libical/src/libical/pvl.h
@@ -0,0 +1,98 @@
+/*======================================================================
+ FILE: pvl.h
+ CREATOR: eric November, 1995
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+======================================================================*/
+
+
+#ifndef __PVL_H__
+#define __PVL_H__
+
+typedef struct pvl_list_t* pvl_list;
+typedef struct pvl_elem_t* pvl_elem;
+
+/**
+ * This type is private. Always use pvl_elem instead. The struct would
+ * not even appear in this header except to make code in the USE_MACROS
+ * blocks work
+ */
+
+typedef struct pvl_elem_t
+{
+ int MAGIC; /**< Magic Identifier */
+ void *d; /**< Pointer to data user is storing */
+ struct pvl_elem_t *next; /**< Next element */
+ struct pvl_elem_t *prior; /**< Prior element */
+} pvl_elem_t;
+
+
+
+/**
+ * This global is incremented for each call to pvl_new_element(); it gives each
+ * list a unique identifer
+ */
+
+extern int pvl_elem_count;
+extern int pvl_list_count;
+
+/* Create new lists or elements */
+pvl_elem pvl_new_element(void* d, pvl_elem next,pvl_elem prior);
+pvl_list pvl_newlist(void);
+void pvl_free(pvl_list);
+
+/* Add, remove, or get the head of the list */
+void pvl_unshift(pvl_list l,void *d);
+void* pvl_shift(pvl_list l);
+pvl_elem pvl_head(pvl_list);
+
+/* Add, remove or get the tail of the list */
+void pvl_push(pvl_list l,void *d);
+void* pvl_pop(pvl_list l);
+pvl_elem pvl_tail(pvl_list);
+
+/* Insert elements in random places */
+typedef int (*pvl_comparef)(void* a, void* b); /* a, b are of the data type*/
+void pvl_insert_ordered(pvl_list l,pvl_comparef f,void *d);
+void pvl_insert_after(pvl_list l,pvl_elem e,void *d);
+void pvl_insert_before(pvl_list l,pvl_elem e,void *d);
+
+/* Remove an element, or clear the entire list */
+void* pvl_remove(pvl_list,pvl_elem); /* Remove element, return data */
+void pvl_clear(pvl_list); /* Remove all elements, de-allocate all data */
+
+int pvl_count(pvl_list);
+
+/* Navagate the list */
+pvl_elem pvl_next(pvl_elem e);
+pvl_elem pvl_prior(pvl_elem e);
+
+/* get the data in the list */
+#ifndef PVL_USE_MACROS
+void* pvl_data(pvl_elem);
+#else
+#define pvl_data(x) x==0 ? 0 : ((struct pvl_elem_t *)x)->d;
+#endif
+
+
+/* Find an element for which a function returns true */
+typedef int (*pvl_findf)(void* a, void* b); /*a is list elem, b is other data*/
+pvl_elem pvl_find(pvl_list l,pvl_findf f,void* v);
+pvl_elem pvl_find_next(pvl_list l,pvl_findf f,void* v);
+
+/**
+ * Pass each element in the list to a function
+ * a is list elem, b is other data
+ */
+typedef void (*pvl_applyf)(void* a, void* b);
+void pvl_apply(pvl_list l,pvl_applyf f, void *v);
+
+
+#endif /* __PVL_H__ */
+
+
+
+
+
diff --git a/libkcal/libical/src/libical/sspm.c b/libkcal/libical/src/libical/sspm.c
new file mode 100644
index 00000000..61237cb3
--- /dev/null
+++ b/libkcal/libical/src/libical/sspm.c
@@ -0,0 +1,1630 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: sspm.c Parse Mime
+ CREATOR: eric 25 June 2000
+
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.0 (the "License"); you may not use this file except in
+ compliance with the License. You may obtain a copy of the License at
+ http://www.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+ The Initial Developer of the Original Code is Eric Busboom
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+ ======================================================================*/
+
+#include <stdio.h>
+#include <string.h>
+#include "sspm.h"
+#include <assert.h>
+#include <ctype.h> /* for tolower */
+#include <stdlib.h> /* for malloc, free */
+#include <string.h> /* for strcasecmp */
+
+#ifdef DMALLOC
+#include "dmalloc.h"
+#endif
+
+#ifdef WIN32
+#define snprintf _snprintf
+#define strcasecmp stricmp
+#endif
+
+#define TMP_BUF_SIZE 1024
+
+
+enum mime_state {
+ UNKNOWN_STATE,
+ IN_HEADER,
+ END_OF_HEADER,
+ IN_BODY,
+ OPENING_PART,
+ END_OF_PART,
+ TERMINAL_END_OF_PART,
+ END_OF_INPUT
+};
+
+struct mime_impl{
+ struct sspm_part *parts;
+ size_t max_parts;
+ int part_no;
+ int level;
+ struct sspm_action_map *actions;
+ char* (*get_string)(char *s, size_t size, void* data);
+ void* get_string_data;
+ char temp[TMP_BUF_SIZE];
+ enum mime_state state;
+};
+
+void sspm_free_header(struct sspm_header *header);
+void* sspm_make_multipart_part(struct mime_impl *impl,struct sspm_header *header);
+void sspm_read_header(struct mime_impl *impl,struct sspm_header *header);
+
+char* sspm_strdup(const char* str){
+
+ char* s;
+
+ s = strdup(str);
+
+ return s;
+}
+
+
+static struct major_content_type_map
+{
+ enum sspm_major_type type;
+ const char* str;
+
+} major_content_type_map[] =
+{
+ {SSPM_MULTIPART_MAJOR_TYPE,"multipart" },
+ {SSPM_TEXT_MAJOR_TYPE,"text" },
+ {SSPM_TEXT_MAJOR_TYPE,"text" },
+ {SSPM_IMAGE_MAJOR_TYPE,"image" },
+ {SSPM_AUDIO_MAJOR_TYPE,"audio" },
+ {SSPM_VIDEO_MAJOR_TYPE,"video" },
+ {SSPM_APPLICATION_MAJOR_TYPE,"application" },
+ {SSPM_MULTIPART_MAJOR_TYPE,"multipart" },
+ {SSPM_MESSAGE_MAJOR_TYPE,"message" },
+ {SSPM_UNKNOWN_MAJOR_TYPE,"" },
+};
+
+static struct minor_content_type_map
+{
+ enum sspm_minor_type type;
+ const char* str;
+
+} minor_content_type_map[] =
+{
+ {SSPM_ANY_MINOR_TYPE,"*" },
+ {SSPM_PLAIN_MINOR_TYPE,"plain" },
+ {SSPM_RFC822_MINOR_TYPE,"rfc822" },
+ {SSPM_DIGEST_MINOR_TYPE,"digest" },
+ {SSPM_CALENDAR_MINOR_TYPE,"calendar" },
+ {SSPM_MIXED_MINOR_TYPE,"mixed" },
+ {SSPM_RELATED_MINOR_TYPE,"related" },
+ {SSPM_ALTERNATIVE_MINOR_TYPE,"alternative" },
+ {SSPM_PARALLEL_MINOR_TYPE, "parallel" },
+ {SSPM_UNKNOWN_MINOR_TYPE,"" }
+};
+
+
+
+struct encoding_map {
+ enum sspm_encoding encoding;
+ const char* str;
+} sspm_encoding_map[] =
+{
+ {SSPM_NO_ENCODING,""},
+ {SSPM_QUOTED_PRINTABLE_ENCODING,"quoted-printable"},
+ {SSPM_8BIT_ENCODING,"8bit"},
+ {SSPM_7BIT_ENCODING,"7bit"},
+ {SSPM_BINARY_ENCODING,"binary"},
+ {SSPM_BASE64_ENCODING,"base64"},
+ {SSPM_UNKNOWN_ENCODING,""}
+
+};
+
+
+char* sspm_get_parameter(const char* line, const char* parameter)
+{
+ char *p,*s,*q;
+ static char name[1024];
+
+ /* Find where the parameter name is in the line */
+ p = strstr(line,parameter);
+
+ if( p == 0){
+ return 0;
+ }
+
+ /* skip over the parameter name, the '=' and any blank spaces */
+
+ p+=strlen(parameter);
+
+ while(*p==' ' || *p == '='){
+ p++;
+ }
+
+ /*now find the next semicolon*/
+
+ s = strchr(p,';');
+
+ /* Strip of leading quote */
+ q = strchr(p,'\"');
+
+ if(q !=0){
+ p = q+1;
+ }
+
+ if(s != 0){
+ strncpy(name,p,(size_t)s-(size_t)p);
+ } else {
+ strcpy(name,p);
+ }
+
+ /* Strip off trailing quote, if it exists */
+
+ q = strrchr(name,'\"');
+
+ if (q != 0){
+ *q='\0';
+ }
+
+ return name;
+}
+
+char* sspm_property_name(const char* line)
+{
+ static char name[1024];
+ char *c = strchr(line,':');
+
+ if(c != 0){
+ strncpy(name,line,(size_t)c-(size_t)line);
+ name[(size_t)c-(size_t)line] = '\0';
+ return name;
+ } else {
+ return 0;
+ }
+}
+
+char* sspm_value(char* line)
+{
+ static char value[1024];
+
+ char *c,*s, *p;
+
+ /* Find the first colon and the next semicolon */
+
+ value[0] = 0;
+ c = strchr(line,':');
+ if (!c)
+ return value;
+ s = strchr(c,';');
+
+ /* Skip the colon */
+ c++;
+
+ if (s == 0){
+ s = c+strlen(line);
+ }
+
+ for(p=value; c != s; c++){
+ if(*c!=' ' && *c!='\n'){
+ *(p++) = *c;
+ }
+ }
+
+ *p='\0';
+
+ return value;
+
+}
+
+static const char *mime_headers[] = {
+ "Content-Type",
+ "Content-Transfer-Encoding",
+ "Content-Disposition",
+ "Content-Id",
+ "Mime-Version",
+ 0
+};
+
+
+void* sspm_default_new_part()
+{
+ return 0;
+}
+void sspm_default_add_line(void *part, struct sspm_header *header,
+ const char* line, size_t size)
+{
+ (void)part;
+ (void)header;
+ (void)line;
+ (void)size;
+}
+
+void* sspm_default_end_part(void* part)
+{
+ (void)part;
+ return 0;
+}
+
+void sspm_default_free_part(void *part)
+{
+ (void)part;
+}
+
+
+
+struct sspm_action_map sspm_action_map[] =
+{
+ {SSPM_UNKNOWN_MAJOR_TYPE,SSPM_UNKNOWN_MINOR_TYPE,sspm_default_new_part,sspm_default_add_line,sspm_default_end_part,sspm_default_free_part},
+};
+
+int sspm_is_mime_header(char *line)
+{
+ char *name = sspm_property_name(line);
+ int i;
+
+ if(name == 0){
+ return 0;
+ }
+
+ for(i = 0; mime_headers[i] != 0; i++){
+ if(strcasecmp(name, mime_headers[i]) == 0)
+ return 1;
+ }
+
+ return 0;
+}
+
+int sspm_is_mail_header(char* line)
+{
+ char *name = sspm_property_name(line);
+
+ if (name != 0){
+ return 1;
+ }
+
+ return 0;
+
+}
+
+int sspm_is_blank(char* line)
+{
+ char *p;
+ char c =0;
+
+ for(p=line; *p!=0; p++){
+ if( ! (*p == ' '|| *p == '\t' || *p=='\n') ){
+ c++;
+ }
+ }
+
+ if (c==0){
+ return 1;
+ }
+
+ return 0;
+
+}
+
+int sspm_is_continuation_line(char* line)
+{
+ if (line[0] == ' '|| line[0] == '\t' ) {
+ return 1;
+ }
+
+ return 0;
+}
+
+int sspm_is_mime_boundary(char *line)
+{
+ if( line[0] == '-' && line[1] == '-') {
+ return 1;
+ }
+
+ return 0;
+}
+
+int sspm_is_mime_terminating_boundary(char *line)
+{
+
+
+ if (sspm_is_mime_boundary(line) &&
+ strstr(line,"--\n")){
+ return 1;
+ }
+
+ return 0;
+}
+
+enum line_type {
+ EMPTY,
+ BLANK,
+ MIME_HEADER,
+ MAIL_HEADER,
+ HEADER_CONTINUATION,
+ BOUNDARY,
+ TERMINATING_BOUNDARY,
+ UNKNOWN_TYPE
+};
+
+
+static enum line_type get_line_type(char* line){
+
+ if (line == 0){
+ return EMPTY;
+ } else if(sspm_is_blank(line)){
+ return BLANK;
+ } else if (sspm_is_mime_header(line)){
+ return MIME_HEADER;
+ } else if (sspm_is_mail_header(line)){
+ return MAIL_HEADER;
+ } else if (sspm_is_continuation_line(line)){
+ return HEADER_CONTINUATION;
+ } else if (sspm_is_mime_terminating_boundary(line)){
+ return TERMINATING_BOUNDARY;
+ } else if (sspm_is_mime_boundary(line)) {
+ return BOUNDARY;
+ } else {
+ return UNKNOWN_TYPE;
+ }
+
+
+}
+
+
+static struct sspm_action_map get_action(struct mime_impl *impl,
+ enum sspm_major_type major,
+ enum sspm_minor_type minor)
+{
+ int i;
+
+ /* Read caller suppled action map */
+
+ if (impl->actions != 0){
+ for(i=0; impl->actions[i].major != SSPM_UNKNOWN_MAJOR_TYPE; i++){
+ if((major == impl->actions[i].major &&
+ minor == impl->actions[i].minor) ||
+ (major == impl->actions[i].major &&
+ minor == SSPM_ANY_MINOR_TYPE)){
+ return impl->actions[i];
+ }
+ }
+ }
+
+ /* Else, read default action map */
+
+ for(i=0; sspm_action_map[i].major != SSPM_UNKNOWN_MAJOR_TYPE; i++){
+ if((major == sspm_action_map[i].major &&
+ minor == sspm_action_map[i].minor) ||
+ (major == sspm_action_map[i].major &&
+ minor == SSPM_ANY_MINOR_TYPE)){
+ break;
+ }
+ }
+
+ return sspm_action_map[i];
+}
+
+
+char* sspm_lowercase(char* str)
+{
+ char* p = 0;
+ char* new = sspm_strdup(str);
+
+ if(str ==0){
+ return 0;
+ }
+
+ for(p = new; *p!=0; p++){
+ *p = tolower(*p);
+ }
+
+ return new;
+}
+
+enum sspm_major_type sspm_find_major_content_type(char* type)
+{
+ int i;
+
+ char* ltype = sspm_lowercase(type);
+
+ for (i=0; major_content_type_map[i].type != SSPM_UNKNOWN_MINOR_TYPE; i++){
+ if(strncmp(ltype, major_content_type_map[i].str,
+ strlen(major_content_type_map[i].str))==0){
+ free(ltype);
+ return major_content_type_map[i].type;
+ }
+ }
+ free(ltype);
+ return major_content_type_map[i].type; /* Should return SSPM_UNKNOWN_MINOR_TYPE */
+}
+
+enum sspm_minor_type sspm_find_minor_content_type(char* type)
+{
+ int i;
+ char* ltype = sspm_lowercase(type);
+
+ char *p = strchr(ltype,'/');
+
+ if (p==0){
+ return SSPM_UNKNOWN_MINOR_TYPE;
+ }
+
+ p++; /* Skip the '/' */
+
+ for (i=0; minor_content_type_map[i].type != SSPM_UNKNOWN_MINOR_TYPE; i++){
+ if(strncmp(p, minor_content_type_map[i].str,
+ strlen(minor_content_type_map[i].str))==0){
+ free(ltype);
+ return minor_content_type_map[i].type;
+ }
+ }
+
+ free(ltype);
+ return minor_content_type_map[i].type; /* Should return SSPM_UNKNOWN_MINOR_TYPE */
+}
+
+const char* sspm_major_type_string(enum sspm_major_type type)
+{
+ int i;
+
+ for (i=0; major_content_type_map[i].type != SSPM_UNKNOWN_MINOR_TYPE;
+ i++){
+
+ if(type == major_content_type_map[i].type){
+ return major_content_type_map[i].str;
+ }
+ }
+
+ return major_content_type_map[i].str; /* Should return SSPM_UNKNOWN_MINOR_TYPE */
+}
+
+const char* sspm_minor_type_string(enum sspm_minor_type type)
+{
+ int i;
+ for (i=0; minor_content_type_map[i].type != SSPM_UNKNOWN_MINOR_TYPE;
+ i++){
+ if(type == minor_content_type_map[i].type){
+ return minor_content_type_map[i].str;
+ }
+ }
+
+ return minor_content_type_map[i].str; /* Should return SSPM_UNKNOWN_MINOR_TYPE */
+}
+
+
+const char* sspm_encoding_string(enum sspm_encoding type)
+{
+ int i;
+ for (i=0; sspm_encoding_map[i].encoding != SSPM_UNKNOWN_ENCODING;
+ i++){
+ if(type == sspm_encoding_map[i].encoding){
+ return sspm_encoding_map[i].str;
+ }
+ }
+
+ return sspm_encoding_map[i].str; /* Should return SSPM_UNKNOWN_MINOR_TYPE */
+}
+
+/* Interpret a header line and add its data to the header
+ structure. */
+void sspm_build_header(struct sspm_header *header, char* line)
+{
+ char *prop;
+ char *val;
+
+ val = sspm_strdup(sspm_value(line));
+ prop = sspm_strdup(sspm_property_name(line));
+
+ if(strcasecmp(prop,"Content-Type") == 0){
+
+ /* Create a new mime_header, fill in content-type
+ and possibly boundary */
+
+ char* boundary= sspm_get_parameter(line,"boundary");
+
+ header->def = 0;
+ header->major = sspm_find_major_content_type(val);
+ header->minor = sspm_find_minor_content_type(val);
+
+ if(header->minor == SSPM_UNKNOWN_MINOR_TYPE){
+ char *p = strchr(val,'/');
+
+ if (p != 0){
+ p++; /* Skip the '/' */
+
+ header->minor_text = sspm_strdup(p);
+ } else {
+ /* Error, malformed content type */
+ header->minor_text = sspm_strdup("unknown");
+ }
+ }
+ if (boundary != 0){
+ header->boundary = sspm_strdup(boundary);
+ }
+
+ } else if(strcasecmp(prop,"Content-Transfer-Encoding")==0){
+ char* encoding = sspm_value(line);
+ char* lencoding = sspm_lowercase(encoding);
+
+ if(strcasecmp(lencoding,"base64")==0){
+ header->encoding = SSPM_BASE64_ENCODING;
+ } else if(strcasecmp(lencoding,"quoted-printable")==0){
+ header->encoding = SSPM_QUOTED_PRINTABLE_ENCODING;
+ } else if(strcasecmp(lencoding,"binary")==0){
+ header->encoding = SSPM_BINARY_ENCODING;
+ } else if(strcasecmp(lencoding,"7bit")==0){
+ header->encoding = SSPM_7BIT_ENCODING;
+ } else if(strcasecmp(lencoding,"8bit")==0){
+ header->encoding = SSPM_8BIT_ENCODING;
+ } else {
+ header->encoding = SSPM_UNKNOWN_ENCODING;
+ }
+
+
+ free(lencoding);
+
+ header->def = 0;
+
+ } else if(strcasecmp(prop,"Content-Id")==0){
+ char* cid = sspm_value(line);
+ header->content_id = sspm_strdup(cid);
+ header->def = 0;
+
+ }
+ free(val);
+ free(prop);
+}
+
+char* sspm_get_next_line(struct mime_impl *impl)
+{
+ char* s;
+ s = impl->get_string(impl->temp,TMP_BUF_SIZE,impl->get_string_data);
+
+ if(s == 0){
+ impl->state = END_OF_INPUT;
+ }
+ return s;
+}
+
+
+void sspm_store_part(struct mime_impl *impl, struct sspm_header header,
+ int level, void *part, size_t size)
+{
+
+ impl->parts[impl->part_no].header = header;
+ impl->parts[impl->part_no].level = level;
+ impl->parts[impl->part_no].data = part;
+ impl->parts[impl->part_no].data_size = size;
+ impl->part_no++;
+}
+
+void sspm_set_error(struct sspm_header* header, enum sspm_error error,
+ char* message)
+{
+ header->error = error;
+
+ if(header->error_text!=0){
+ free(header->error_text);
+ }
+
+ header->def = 0;
+
+ if(message != 0){
+ header->error_text = sspm_strdup(message);
+ } else {
+ header->error_text = 0;
+ }
+
+}
+
+void* sspm_make_part(struct mime_impl *impl,
+ struct sspm_header *header,
+ struct sspm_header *parent_header,
+ void **end_part,
+ size_t *size)
+{
+
+ /* For a single part type, read to the boundary, if there is a
+ boundary. Otherwise, read until the end of input. This routine
+ assumes that the caller has read the header and has left the input
+ at the first blank line */
+
+ char *line;
+ void *part;
+ int end = 0;
+
+ struct sspm_action_map action = get_action(
+ impl,
+ header->major,
+ header->minor);
+
+ *size = 0;
+ part =action.new_part();
+
+ impl->state = IN_BODY;
+
+ while(end == 0 && (line = sspm_get_next_line(impl)) != 0){
+
+ if(sspm_is_mime_boundary(line)){
+
+ /* If there is a boundary, then this must be a multipart
+ part, so there must be a parent_header. */
+ if(parent_header == 0){
+ char* boundary;
+ end = 1;
+ *end_part = 0;
+
+ sspm_set_error(header,SSPM_UNEXPECTED_BOUNDARY_ERROR,line);
+
+ /* Read until the paired terminating boundary */
+ if((boundary = (char*)malloc(strlen(line)+5)) == 0){
+ fprintf(stderr,"Out of memory");
+ abort();
+ }
+ strcpy(boundary,line);
+ strcat(boundary,"--");
+ while((line = sspm_get_next_line(impl)) != 0){
+ /*printf("Error: %s\n",line);*/
+ if(strcmp(boundary,line)==0){
+ break;
+ }
+ }
+ free(boundary);
+
+ break;
+ }
+
+ if(strncmp((line+2),parent_header->boundary,
+ sizeof(parent_header->boundary)) == 0){
+ *end_part = action.end_part(part);
+
+ if(sspm_is_mime_boundary(line)){
+ impl->state = END_OF_PART;
+ } else if ( sspm_is_mime_terminating_boundary(line)){
+ impl->state = TERMINAL_END_OF_PART;
+ }
+ end = 1;
+ } else {
+ /* Error, this is not the correct terminating boundary*/
+
+ /* read and discard until we get the right boundary. */
+ char* boundary;
+ char msg[256];
+
+ snprintf(msg,256,
+ "Expected: %s--. Got: %s",
+ parent_header->boundary,line);
+
+ sspm_set_error(parent_header,
+ SSPM_WRONG_BOUNDARY_ERROR,msg);
+
+ /* Read until the paired terminating boundary */
+ if((boundary = (char*)malloc(strlen(line)+5)) == 0){
+ fprintf(stderr,"Out of memory");
+ abort();
+ }
+ strcpy(boundary,line);
+ strcat(boundary,"--");
+ while((line = sspm_get_next_line(impl)) != 0){
+ if(strcmp(boundary,line)==0){
+ break;
+ }
+ }
+ free(boundary);
+
+ }
+ } else {
+ char* data=0;
+ char* rtrn=0;
+ *size = strlen(line);
+
+ data = (char*)malloc(*size+2);
+ assert(data != 0);
+ if (header->encoding == SSPM_BASE64_ENCODING){
+ rtrn = decode_base64(data,line,size);
+ } else if(header->encoding == SSPM_QUOTED_PRINTABLE_ENCODING){
+ rtrn = decode_quoted_printable(data,line,size);
+ }
+
+ if(rtrn == 0){
+ strcpy(data,line);
+ }
+
+ /* add a end-of-string after the data, just in case binary
+ data from decode64 gets passed to a tring handling
+ routine in add_line */
+ data[*size+1]='\0';
+
+ action.add_line(part,header,data,*size);
+
+ free(data);
+ }
+ }
+
+ if (end == 0){
+ /* End the part if the input is exhausted */
+ *end_part = action.end_part(part);
+ }
+
+ return end_part;
+}
+
+
+void* sspm_make_multipart_subpart(struct mime_impl *impl,
+ struct sspm_header *parent_header)
+{
+ struct sspm_header header;
+ char *line;
+ void* part;
+ size_t size;
+
+ if(parent_header->boundary == 0){
+ /* Error. Multipart headers must have a boundary*/
+
+ sspm_set_error(parent_header,SSPM_NO_BOUNDARY_ERROR,0);
+ /* read all of the reamining lines */
+ while((line = sspm_get_next_line(impl)) != 0){
+ }
+
+ return 0;
+ }
+
+
+ /* Step 1: Read the opening boundary */
+
+ if(get_line_type(impl->temp) != BOUNDARY){
+ while((line=sspm_get_next_line(impl)) != 0 ){
+ if(sspm_is_mime_boundary(line)){
+
+ assert(parent_header != 0);
+
+ /* Check if it is the right boundary */
+ if(!sspm_is_mime_terminating_boundary(line) &&
+ strncmp((line+2),parent_header->boundary,
+ sizeof(parent_header->boundary))
+ == 0){
+ /* The +2 in strncmp skips over the leading "--" */
+
+ break;
+ } else {
+ /* Got the wrong boundary, so read and discard
+ until we get the right boundary. */
+ char* boundary;
+ char msg[256];
+
+ snprintf(msg,256,
+ "Expected: %s. Got: %s",
+ parent_header->boundary,line);
+
+ sspm_set_error(parent_header,
+ SSPM_WRONG_BOUNDARY_ERROR,msg);
+
+ /* Read until the paired terminating boundary */
+ if((boundary = (char*)malloc(strlen(line)+5)) == 0){
+ fprintf(stderr,"Out of memory");
+ abort();
+ }
+ strcpy(boundary,line);
+ strcat(boundary,"--");
+ while((line = sspm_get_next_line(impl)) != 0){
+ if(strcmp(boundary,line)==0){
+ break;
+ }
+ }
+ free(boundary);
+
+ return 0;
+ }
+ }
+ }
+ }
+
+ /* Step 2: Get the part header */
+ sspm_read_header(impl,&header);
+
+ /* If the header is still listed as default, there was probably an
+ error */
+ if(header.def == 1 && header.error != SSPM_NO_ERROR){
+ sspm_set_error(&header,SSPM_NO_HEADER_ERROR,0);
+ return 0;
+ }
+
+ if(header.error!= SSPM_NO_ERROR){
+ sspm_store_part(impl,header,impl->level,0,0);
+ return 0;
+ }
+
+ /* Step 3: read the body */
+
+ if(header.major == SSPM_MULTIPART_MAJOR_TYPE){
+ struct sspm_header *child_header;
+ child_header = &(impl->parts[impl->part_no].header);
+
+ /* Store the multipart part */
+ sspm_store_part(impl,header,impl->level,0,0);
+
+ /* now get all of the sub-parts */
+ part = sspm_make_multipart_part(impl,child_header);
+
+ if(get_line_type(impl->temp) != TERMINATING_BOUNDARY){
+
+ sspm_set_error(child_header,SSPM_NO_BOUNDARY_ERROR,impl->temp);
+ return 0;
+ }
+
+ sspm_get_next_line(impl); /* Step past the terminating boundary */
+
+ } else {
+ sspm_make_part(impl, &header,parent_header,&part,&size);
+
+ memset(&(impl->parts[impl->part_no]), 0, sizeof(struct sspm_part));
+
+ sspm_store_part(impl,header,impl->level,part,size);
+
+ }
+
+ return part;
+}
+
+void* sspm_make_multipart_part(struct mime_impl *impl,struct sspm_header *header)
+{
+ void *part=0;
+
+ /* Now descend a level into each of the children of this part */
+ impl->level++;
+
+ /* Now we are working on the CHILD */
+ memset(&(impl->parts[impl->part_no]), 0, sizeof(struct sspm_part));
+
+ do{
+ part = sspm_make_multipart_subpart(impl,header);
+
+ if (part==0){
+ /* Clean up the part in progress */
+ impl->parts[impl->part_no].header.major
+ = SSPM_NO_MAJOR_TYPE;
+ impl->parts[impl->part_no].header.minor
+ = SSPM_NO_MINOR_TYPE;
+
+ }
+
+
+ } while (get_line_type(impl->temp) != TERMINATING_BOUNDARY &&
+ impl->state != END_OF_INPUT);
+
+ impl->level--;
+
+ return 0;
+}
+
+
+void sspm_read_header(struct mime_impl *impl,struct sspm_header *header)
+{
+#define BUF_SIZE 1024
+#define MAX_HEADER_LINES 25
+
+ char *buf;
+ char header_lines[MAX_HEADER_LINES][BUF_SIZE]; /* HACK, hard limits */
+ int current_line = -1;
+ int end = 0;
+
+ memset(header_lines,0,sizeof(header_lines));
+ memset(header,0,sizeof(struct sspm_header));
+
+ /* Set up default header */
+ header->def = 1;
+ header->major = SSPM_TEXT_MAJOR_TYPE;
+ header->minor = SSPM_PLAIN_MINOR_TYPE;
+ header->error = SSPM_NO_ERROR;
+ header->error_text = 0;
+
+ /* Read all of the lines into memory */
+ while(end==0&& (buf=sspm_get_next_line(impl)) != 0){
+
+ enum line_type line_type = get_line_type(buf);
+
+ switch(line_type){
+ case BLANK: {
+ end = 1;
+ impl->state = END_OF_HEADER;
+ break;
+ }
+
+ case MAIL_HEADER:
+ case MIME_HEADER: {
+ impl->state = IN_HEADER;
+ current_line++;
+
+ assert(strlen(buf) < BUF_SIZE);
+
+ strncpy(header_lines[current_line],buf,BUF_SIZE);
+ header_lines[current_line][BUF_SIZE-1] = '\0';
+
+ break;
+ }
+
+ case HEADER_CONTINUATION: {
+ char* last_line, *end;
+ char *buf_start;
+
+ if(current_line < 0){
+ /* This is not really a continuation line, since
+ we have not see any header line yet */
+ sspm_set_error(header,SSPM_MALFORMED_HEADER_ERROR,buf);
+ return;
+ }
+
+ last_line = header_lines[current_line];
+ end = (char*) ( (size_t)strlen(last_line)+
+ (size_t)last_line);
+
+ impl->state = IN_HEADER;
+
+
+ /* skip over the spaces in buf start, and remove the new
+ line at the end of the lat line */
+ if (last_line[strlen(last_line)-1] == '\n'){
+ last_line[strlen(last_line)-1] = '\0';
+ }
+ buf_start = buf;
+ while(*buf_start == ' ' ||*buf_start == '\t' ){
+ buf_start++;
+ }
+
+ assert( strlen(buf_start) + strlen(last_line) < BUF_SIZE);
+
+ strncat(last_line,buf_start, BUF_SIZE-strlen(last_line)-1);
+
+ break;
+ }
+
+ default: {
+ sspm_set_error(header,SSPM_MALFORMED_HEADER_ERROR,buf);
+ return;
+ }
+ }
+ }
+
+
+ for(current_line = 0;
+ current_line < MAX_HEADER_LINES && header_lines[current_line][0] != 0;
+ current_line++){
+
+ sspm_build_header(header,header_lines[current_line]);
+ }
+
+
+}
+
+/* Root routine for parsing mime entries*/
+int sspm_parse_mime(struct sspm_part *parts,
+ size_t max_parts,
+ struct sspm_action_map *actions,
+ char* (*get_string)(char *s, size_t size, void* data),
+ void *get_string_data,
+ struct sspm_header *first_header
+ )
+{
+ struct mime_impl impl;
+ struct sspm_header header;
+ void *part;
+ int i;
+ (void)first_header;
+
+ /* Initialize all of the data */
+ memset(&impl,0,sizeof(struct mime_impl));
+ memset(&header,0,sizeof(struct sspm_header));
+
+ for(i = 0; i<(int)max_parts; i++){
+ parts[i].header.major = SSPM_NO_MAJOR_TYPE;
+ parts[i].header.minor = SSPM_NO_MINOR_TYPE;
+ }
+
+ impl.parts = parts;
+ impl.max_parts = max_parts;
+ impl.part_no = 0;
+ impl.actions = actions;
+ impl.get_string = get_string;
+ impl.get_string_data = get_string_data;
+
+ /* Read the header of the message. This will be the email header,
+ unless first_header is specified. But ( HACK) that var is not
+ currently being used */
+ sspm_read_header(&impl,&header);
+
+ if(header.major == SSPM_MULTIPART_MAJOR_TYPE){
+ struct sspm_header *child_header;
+ child_header = &(impl.parts[impl.part_no].header);
+
+ sspm_store_part(&impl,header,impl.level,0,0);
+
+ part = sspm_make_multipart_part(&impl,child_header);
+
+ } else {
+ void *part;
+ size_t size;
+ sspm_make_part(&impl, &header, 0,&part,&size);
+
+ memset(&(impl.parts[impl.part_no]), 0, sizeof(struct sspm_part));
+
+ sspm_store_part(&impl,header,impl.level,part,size);
+ }
+
+ return 0;
+}
+
+void sspm_free_parts(struct sspm_part *parts, size_t max_parts)
+{
+ int i;
+
+ for(i = 0; i<(int)max_parts && parts[i].header.major != SSPM_NO_MAJOR_TYPE;
+ i++){
+ sspm_free_header(&(parts[i].header));
+ }
+}
+
+void sspm_free_header(struct sspm_header *header)
+{
+ if(header->boundary!=0){
+ free(header->boundary);
+ }
+ if(header->minor_text!=0){
+ free(header->minor_text);
+ }
+ if(header->charset!=0){
+ free(header->charset);
+ }
+ if(header->filename!=0){
+ free(header->filename);
+ }
+ if(header->content_id!=0){
+ free(header->content_id);
+ }
+ if(header->error_text!=0){
+ free(header->error_text);
+ }
+}
+
+/***********************************************************************
+The remaining code is beased on code from the mimelite distribution,
+which has the following notice:
+
+| Authorship:
+| Copyright (c) 1994 Gisle Hannemyr.
+| Permission is granted to hack, make and distribute copies of this
+| program as long as this copyright notice is not removed.
+| Flames, bug reports, comments and improvements to:
+| snail: Gisle Hannemyr, Brageveien 3A, 0452 Oslo, Norway
+| email: Inet: gisle@oslonett.no
+
+The code is heavily modified by Eric Busboom.
+
+***********************************************************************/
+
+char *decode_quoted_printable(char *dest,
+ char *src,
+ size_t *size)
+{
+ int cc;
+ size_t i=0;
+
+ while (*src != 0 && i < *size) {
+ if (*src == '=') {
+
+ src++;
+ if (!*src) {
+ break;
+ }
+
+ /* remove soft line breaks*/
+ if ((*src == '\n') || (*src == '\r')){
+ src++;
+ if ((*src == '\n') || (*src == '\r')){
+ src++;
+ }
+ continue;
+ }
+
+ cc = isdigit(*src) ? (*src - '0') : (*src - 55);
+ cc *= 0x10;
+ src++;
+ if (!*src) {
+ break;
+ }
+ cc += isdigit(*src) ? (*src - '0') : (*src - 55);
+
+ *dest = cc;
+
+ } else {
+ *dest = *src;
+ }
+
+ dest++;
+ src++;
+ i++;
+ }
+
+ *dest = '\0';
+
+ *size = i;
+ return(dest);
+}
+
+char *decode_base64(char *dest,
+ char *src,
+ size_t *size)
+{
+ int cc = 0;
+ char buf[4] = {0,0,0,0};
+ int p = 0;
+ int valid_data = 0;
+ size_t size_out=0;
+
+ while (*src && p<(int)*size && (cc!= -1)) {
+
+ /* convert a character into the Base64 alphabet */
+ cc = *src++;
+
+ if ((cc >= 'A') && (cc <= 'Z')) cc = cc - 'A';
+ else if ((cc >= 'a') && (cc <= 'z')) cc = cc - 'a' + 26;
+ else if ((cc >= '0') && (cc <= '9')) cc = cc - '0' + 52;
+ else if (cc == '/') cc = 63;
+ else if (cc == '+') cc = 62;
+ else cc = -1;
+
+ assert(cc<64);
+
+ /* If we've reached the end, fill the remaining slots in
+ the bucket and do a final conversion */
+ if(cc== -1){
+ if(valid_data == 0){
+ return 0;
+ }
+
+ while(p%4!=3){
+ p++;
+ buf[p%4] = 0;
+ }
+ } else {
+ buf[p%4] = cc;
+ size_out++;
+ valid_data = 1;
+ }
+
+
+ /* When we have 4 base64 letters, convert them into three
+ bytes */
+ if (p%4 == 3) {
+ *dest++ =(buf[0]<< 2)|((buf[1] & 0x30) >> 4);
+ *dest++ =((buf[1] & 0x0F) << 4)|((buf[2] & 0x3C) >> 2);
+ *dest++ =((buf[2] & 0x03) << 6)|(buf[3] & 0x3F);
+
+ memset(buf,0,4);
+ }
+
+ p++;
+
+ }
+ /* Calculate the size of the converted data*/
+ *size = ((int)(size_out/4))*3;
+ if(size_out%4 == 2) *size+=1;
+ if(size_out%4 == 3) *size+=2;
+
+ return(dest);
+}
+
+
+/***********************************************************************
+
+ Routines to output MIME
+
+**********************************************************************/
+
+
+struct sspm_buffer {
+ char* buffer;
+ char* pos;
+ size_t buf_size;
+ int line_pos;
+};
+
+void sspm_append_string(struct sspm_buffer* buf, const char* string);
+void sspm_write_part(struct sspm_buffer *buf,struct sspm_part *part, int *part_num);
+
+void sspm_append_hex(struct sspm_buffer* buf, char ch)
+{
+ char tmp[4];
+
+ snprintf(tmp,sizeof(tmp),"=%02X",ch);
+
+ sspm_append_string(buf,tmp);
+}
+
+/* a copy of icalmemory_append_char */
+void sspm_append_char(struct sspm_buffer* buf, char ch)
+{
+ char *new_buf;
+ char *new_pos;
+
+ size_t data_length, final_length;
+
+ data_length = (size_t)buf->pos - (size_t)buf->buffer;
+
+ final_length = data_length + 2;
+
+ if ( final_length > (size_t) buf->buf_size ) {
+
+ buf->buf_size = (buf->buf_size) * 2 + final_length +1;
+
+ new_buf = realloc(buf->buffer,buf->buf_size);
+
+ new_pos = (void*)((size_t)new_buf + data_length);
+
+ buf->pos = new_pos;
+ buf->buffer = new_buf;
+ }
+
+ *(buf->pos) = ch;
+ buf->pos += 1;
+ *(buf->pos) = 0;
+}
+/* A copy of icalmemory_append_string */
+void sspm_append_string(struct sspm_buffer* buf, const char* string)
+{
+ char *new_buf;
+ char *new_pos;
+
+ size_t data_length, final_length, string_length;
+
+ string_length = strlen(string);
+ data_length = (size_t)buf->pos - (size_t)buf->buffer;
+ final_length = data_length + string_length;
+
+ if ( final_length >= (size_t) buf->buf_size) {
+
+
+ buf->buf_size = (buf->buf_size) * 2 + final_length;
+
+ new_buf = realloc(buf->buffer,buf->buf_size);
+
+ new_pos = (void*)((size_t)new_buf + data_length);
+
+ buf->pos = new_pos;
+ buf->buffer = new_buf;
+ }
+
+ strcpy(buf->pos, string);
+
+ buf->pos += string_length;
+}
+
+
+
+static int sspm_is_printable(char c)
+{
+ return (c >= 33) && (c <= 126) && (c != '=');
+
+}
+
+
+void sspm_encode_quoted_printable(struct sspm_buffer *buf, char* data)
+{
+ char *p;
+ int lpos = 0;
+
+ for(p = data; *p != 0; p++){
+
+ if(sspm_is_printable(*p)){
+ /* plain characters can represent themselves */
+ /* RFC2045 Rule #2 */
+ sspm_append_char(buf,*p);
+ lpos++;
+ } else if ( *p == '\t' || *p == ' ' ) {
+
+ /* For tabs and spaces, only encode if they appear at the
+ end of the line */
+ /* RFC2045 Rule #3 */
+
+ char n = *(p+1);
+
+ if( n == '\n' || n == '\r'){
+ sspm_append_hex(buf,*p);
+ lpos += 3;
+ } else {
+ sspm_append_char(buf,*p);
+ lpos++;
+ }
+
+ } else if( *p == '\n' || *p == '\r'){
+ sspm_append_char(buf,*p);
+
+ lpos=0;
+
+ } else {
+ /* All others need to be encoded */
+ sspm_append_hex(buf,*p);
+ lpos+=3;
+ }
+
+
+ /* Add line breaks */
+ if (lpos > 72){
+ lpos = 0;
+ sspm_append_string(buf,"=\n");
+ }
+ }
+}
+
+static char BaseTable[64] = {
+ 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
+ 'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
+ 'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
+ 'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/'
+};
+
+void sspm_write_base64(struct sspm_buffer *buf, char* inbuf,int size )
+{
+
+ char outbuf[4];
+ int i;
+
+ outbuf[0] = outbuf[1] = outbuf[2] = outbuf[3] = 65;
+
+ switch(size){
+
+ case 4:
+ outbuf[3] = inbuf[2] & 0x3F;
+
+ case 3:
+ outbuf[2] = ((inbuf[1] & 0x0F) << 2) | ((inbuf[2] & 0xC0) >> 6);
+
+ case 2:
+ outbuf[0] = (inbuf[0] & 0xFC) >> 2;
+ outbuf[1] = ((inbuf[0] & 0x03) << 4) | ((inbuf[1] & 0xF0) >> 4);
+ break;
+
+ default:
+ assert(0);
+ }
+
+ for(i = 0; i < 4; i++){
+
+ if(outbuf[i] == 65){
+ sspm_append_char(buf,'=');
+ } else {
+ sspm_append_char(buf,BaseTable[(int)outbuf[i]]);
+ }
+ }
+}
+
+void sspm_encode_base64(struct sspm_buffer *buf, char* data, size_t size)
+{
+ char *p;
+ char inbuf[3];
+ int i = 0;
+ int first = 1;
+ int lpos = 0;
+ (void)size;
+
+ inbuf[0] = inbuf[1] = inbuf[2] = 0;
+
+ for (p = data; *p !=0; p++){
+
+ if (i%3 == 0 && first == 0){
+
+ sspm_write_base64(buf, inbuf, 4);
+ lpos+=4;
+
+ inbuf[0] = inbuf[1] = inbuf[2] = 0;
+ }
+
+ assert(lpos%4 == 0);
+
+ if (lpos == 72){
+ sspm_append_string(buf,"\n");
+ lpos = 0;
+ }
+
+ inbuf[i%3] = *p;
+
+ i++;
+ first = 0;
+
+ }
+
+
+ /* If the inbuf was not exactly filled on the last byte, we need
+ to spit out the odd bytes that did get in -- either one or
+ two. This will result in an output of two bytes and '==' or
+ three bytes and '=', respectively */
+
+ if (i%3 == 1 && first == 0){
+ sspm_write_base64(buf, inbuf, 2);
+ } else if (i%3 == 2 && first == 0){
+ sspm_write_base64(buf, inbuf, 3);
+ }
+
+}
+
+void sspm_write_header(struct sspm_buffer *buf,struct sspm_header *header)
+{
+
+ int i;
+ char temp[TMP_BUF_SIZE];
+ const char* major;
+ const char* minor;
+
+ /* Content-type */
+
+ major = sspm_major_type_string(header->major);
+ minor = sspm_minor_type_string(header->minor);
+
+ if(header->minor == SSPM_UNKNOWN_MINOR_TYPE ){
+ assert(header->minor_text !=0);
+ minor = header->minor_text;
+ }
+
+ snprintf(temp,sizeof(temp),"Content-Type: %s/%s",major,minor);
+
+ sspm_append_string(buf,temp);
+
+ if(header->boundary != 0){
+ snprintf(temp,sizeof(temp),";boundary=\"%s\"",header->boundary);
+ sspm_append_string(buf,temp);
+ }
+
+ /* Append any content type parameters */
+ if(header->content_type_params != 0){
+ for(i=0; *(header->content_type_params[i])!= 0;i++){
+ strncpy(temp,header->content_type_params[i],sizeof(temp));
+ sspm_append_char(buf,';');
+ sspm_append_string(buf,temp);
+ }
+ }
+
+ sspm_append_char(buf,'\n');
+
+ /*Content-Transfer-Encoding */
+
+ if(header->encoding != SSPM_UNKNOWN_ENCODING &&
+ header->encoding != SSPM_NO_ENCODING){
+ snprintf(temp,sizeof(temp),"Content-Transfer-Encoding: %s\n",
+ sspm_encoding_string(header->encoding));
+ }
+
+ sspm_append_char(buf,'\n');
+
+}
+
+void sspm_write_multipart_part(struct sspm_buffer *buf,
+ struct sspm_part *parts,
+ int* part_num)
+{
+
+ int parent_level, level;
+ struct sspm_header *header = &(parts[*part_num].header);
+ /* Write the header for the multipart part */
+ sspm_write_header(buf,header);
+
+ parent_level = parts[*part_num].level;
+
+ (*part_num)++;
+
+ level = parts[*part_num].level;
+
+ while(parts[*part_num].header.major != SSPM_NO_MAJOR_TYPE &&
+ level == parent_level+1){
+
+ assert(header->boundary);
+ sspm_append_string(buf,header->boundary);
+ sspm_append_char(buf,'\n');
+
+ if (parts[*part_num].header.major == SSPM_MULTIPART_MAJOR_TYPE){
+ sspm_write_multipart_part(buf,parts,part_num);
+ } else {
+ sspm_write_part(buf, &(parts[*part_num]), part_num);
+ }
+
+ (*part_num)++;
+ level = parts[*part_num].level;
+ }
+
+ sspm_append_string(buf,"\n\n--");
+ sspm_append_string(buf,header->boundary);
+ sspm_append_string(buf,"\n");
+
+ (*part_num)--; /* undo last, spurious, increment */
+}
+
+void sspm_write_part(struct sspm_buffer *buf,struct sspm_part *part,int *part_num)
+{
+ (void)part_num;
+
+ /* Write header */
+ sspm_write_header(buf,&(part->header));
+
+ /* Write part data */
+
+ if(part->data == 0){
+ return;
+ }
+
+ if(part->header.encoding == SSPM_BASE64_ENCODING) {
+ assert(part->data_size != 0);
+ sspm_encode_base64(buf,part->data,part->data_size);
+ } else if(part->header.encoding == SSPM_QUOTED_PRINTABLE_ENCODING) {
+ sspm_encode_quoted_printable(buf,part->data);
+ } else {
+ sspm_append_string(buf,part->data);
+ }
+
+ sspm_append_string(buf,"\n\n");
+}
+
+int sspm_write_mime(struct sspm_part *parts,size_t num_parts,
+ char **output_string, const char* header)
+{
+ struct sspm_buffer buf;
+ int part_num =0;
+ (void)num_parts;
+
+ buf.buffer = malloc(4096);
+ buf.pos = buf.buffer;
+ buf.buf_size = 10;
+ buf.line_pos = 0;
+
+ /* write caller's header */
+ if(header != 0){
+ sspm_append_string(&buf,header);
+ }
+
+ if(buf.buffer[strlen(buf.buffer)-1] != '\n'){
+ sspm_append_char(&buf,'\n');
+ }
+
+ /* write mime-version header */
+ sspm_append_string(&buf,"Mime-Version: 1.0\n");
+
+ /* End of header */
+
+ /* Write body parts */
+ while(parts[part_num].header.major != SSPM_NO_MAJOR_TYPE){
+ if (parts[part_num].header.major == SSPM_MULTIPART_MAJOR_TYPE){
+ sspm_write_multipart_part(&buf,parts,&part_num);
+ } else {
+ sspm_write_part(&buf, &(parts[part_num]), &part_num);
+ }
+
+ part_num++;
+ }
+
+
+ *output_string = buf.buffer;
+
+ return 0;
+}
+
diff --git a/libkcal/libical/src/libical/sspm.h b/libkcal/libical/src/libical/sspm.h
new file mode 100644
index 00000000..00be0821
--- /dev/null
+++ b/libkcal/libical/src/libical/sspm.h
@@ -0,0 +1,144 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: sspm.h Mime Parser
+ CREATOR: eric 25 June 2000
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ 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 Initial Developer of the Original Code is Eric Busboom
+
+ (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org
+ ======================================================================*/
+
+#ifndef SSPM_H
+#define SSPM_H
+
+enum sspm_major_type {
+ SSPM_NO_MAJOR_TYPE,
+ SSPM_TEXT_MAJOR_TYPE,
+ SSPM_IMAGE_MAJOR_TYPE,
+ SSPM_AUDIO_MAJOR_TYPE,
+ SSPM_VIDEO_MAJOR_TYPE,
+ SSPM_APPLICATION_MAJOR_TYPE,
+ SSPM_MULTIPART_MAJOR_TYPE,
+ SSPM_MESSAGE_MAJOR_TYPE,
+ SSPM_UNKNOWN_MAJOR_TYPE
+};
+
+enum sspm_minor_type {
+ SSPM_NO_MINOR_TYPE,
+ SSPM_ANY_MINOR_TYPE,
+ SSPM_PLAIN_MINOR_TYPE,
+ SSPM_RFC822_MINOR_TYPE,
+ SSPM_DIGEST_MINOR_TYPE,
+ SSPM_CALENDAR_MINOR_TYPE,
+ SSPM_MIXED_MINOR_TYPE,
+ SSPM_RELATED_MINOR_TYPE,
+ SSPM_ALTERNATIVE_MINOR_TYPE,
+ SSPM_PARALLEL_MINOR_TYPE,
+ SSPM_UNKNOWN_MINOR_TYPE
+};
+
+enum sspm_encoding {
+ SSPM_NO_ENCODING,
+ SSPM_QUOTED_PRINTABLE_ENCODING,
+ SSPM_8BIT_ENCODING,
+ SSPM_7BIT_ENCODING,
+ SSPM_BINARY_ENCODING,
+ SSPM_BASE64_ENCODING,
+ SSPM_UNKNOWN_ENCODING
+};
+
+enum sspm_error{
+ SSPM_NO_ERROR,
+ SSPM_UNEXPECTED_BOUNDARY_ERROR,
+ SSPM_WRONG_BOUNDARY_ERROR,
+ SSPM_NO_BOUNDARY_ERROR,
+ SSPM_NO_HEADER_ERROR,
+ SSPM_MALFORMED_HEADER_ERROR
+};
+
+
+struct sspm_header
+{
+ int def;
+ char* boundary;
+ enum sspm_major_type major;
+ enum sspm_minor_type minor;
+ char *minor_text;
+ char ** content_type_params;
+ char* charset;
+ enum sspm_encoding encoding;
+ char* filename;
+ char* content_id;
+ enum sspm_error error;
+ char* error_text;
+};
+
+struct sspm_part {
+ struct sspm_header header;
+ int level;
+ size_t data_size;
+ void *data;
+};
+
+struct sspm_action_map {
+ enum sspm_major_type major;
+ enum sspm_minor_type minor;
+ void* (*new_part)();
+ void (*add_line)(void *part, struct sspm_header *header,
+ const char* line, size_t size);
+ void* (*end_part)(void* part);
+ void (*free_part)(void *part);
+};
+
+const char* sspm_major_type_string(enum sspm_major_type type);
+const char* sspm_minor_type_string(enum sspm_minor_type type);
+const char* sspm_encoding_string(enum sspm_encoding type);
+
+int sspm_parse_mime(struct sspm_part *parts,
+ size_t max_parts,
+ struct sspm_action_map *actions,
+ char* (*get_string)(char *s, size_t size, void* data),
+ void *get_string_data,
+ struct sspm_header *first_header
+ );
+
+void sspm_free_parts(struct sspm_part *parts, size_t max_parts);
+
+char *decode_quoted_printable(char *dest,
+ char *src,
+ size_t *size);
+char *decode_base64(char *dest,
+ char *src,
+ size_t *size);
+
+
+int sspm_write_mime(struct sspm_part *parts,size_t num_parts,
+ char **output_string, const char* header);
+
+#endif /*SSPM_H*/
diff --git a/libkcal/libical/src/libical/vsnprintf.c b/libkcal/libical/src/libical/vsnprintf.c
new file mode 100644
index 00000000..982920b2
--- /dev/null
+++ b/libkcal/libical/src/libical/vsnprintf.c
@@ -0,0 +1,172 @@
+#ifndef WIN32
+#include "config.h"
+#endif
+#ifndef HAVE_SNPRINTF
+/*
+ * Revision 12: http://theos.com/~deraadt/snprintf.c
+ *
+ * Copyright (c) 1997 Theo de Raadt
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WIN32
+#include <sys/param.h>
+#include <sys/mman.h>
+#include <unistd.h>
+#endif
+#include <sys/types.h>
+#include <signal.h>
+#include <stdio.h>
+#include <string.h>
+#if __STDC__
+#include <stdarg.h>
+#include <stdlib.h>
+#else
+#include <varargs.h>
+#endif
+#include <setjmp.h>
+
+#ifndef roundup
+#define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
+#endif
+
+static int pgsize;
+static char *curobj;
+static sigjmp_buf bail;
+
+#define EXTRABYTES 2 /* XXX: why 2? you don't want to know */
+
+static char *
+msetup(str, n)
+ char *str;
+ size_t n;
+{
+ char *e;
+
+ if (n == 0)
+ return NULL;
+ if (pgsize == 0)
+ pgsize = getpagesize();
+ curobj = (char *)malloc(n + EXTRABYTES + pgsize * 2);
+ if (curobj == NULL)
+ return NULL;
+ e = curobj + n + EXTRABYTES;
+ e = (char *)roundup((unsigned long)e, pgsize);
+ if (mprotect(e, pgsize, PROT_NONE) == -1) {
+ free(curobj);
+ curobj = NULL;
+ return NULL;
+ }
+ e = e - n - EXTRABYTES;
+ *e = '\0';
+ return (e);
+}
+
+static void
+mcatch(int i)
+{
+ siglongjmp(bail, 1);
+}
+
+static void
+mcleanup(str, n, p)
+ char *str;
+ size_t n;
+ char *p;
+{
+ strncpy(str, p, n-1);
+ str[n-1] = '\0';
+ if (mprotect((caddr_t)(p + n + EXTRABYTES), pgsize,
+ PROT_READ|PROT_WRITE|PROT_EXEC) == -1)
+ mprotect((caddr_t)(p + n + EXTRABYTES), pgsize,
+ PROT_READ|PROT_WRITE);
+ free(curobj);
+}
+
+int
+#if __STDC__
+vsnprintf(char *str, size_t n, char const *fmt, va_list ap)
+#else
+vsnprintf(str, n, fmt, ap)
+ char *str;
+ size_t n;
+ char *fmt;
+ char *ap;
+#endif
+{
+ struct sigaction osa, nsa;
+ char *p;
+ int ret = n + 1; /* if we bail, indicated we overflowed */
+
+ memset(&nsa, 0, sizeof nsa);
+ nsa.sa_handler = mcatch;
+ sigemptyset(&nsa.sa_mask);
+
+ p = msetup(str, n);
+ if (p == NULL) {
+ *str = '\0';
+ return 0;
+ }
+ if (sigsetjmp(bail, 1) == 0) {
+ if (sigaction(SIGSEGV, &nsa, &osa) == -1) {
+ mcleanup(str, n, p);
+ return (0);
+ }
+ ret = vsprintf(p, fmt, ap);
+ }
+ mcleanup(str, n, p);
+ (void) sigaction(SIGSEGV, &osa, NULL);
+ return (ret);
+}
+
+int
+#if __STDC__
+snprintf(char *str, size_t n, char const *fmt, ...)
+#else
+snprintf(str, n, fmt, va_alist)
+ char *str;
+ size_t n;
+ char *fmt;
+ va_dcl
+#endif
+{
+ va_list ap;
+#if __STDC__
+ va_start(ap, fmt);
+#else
+ va_start(ap);
+#endif
+
+ return (vsnprintf(str, n, fmt, ap));
+ va_end(ap);
+}
+
+
+#else
+
+/* ANSI C forbids an empty source file... */
+
+static void vsnprintf_dummy_func() {
+ vsnprintf_dummy_func();
+}
+
+#endif
diff --git a/libkcal/libical/src/libicalss/Makefile.am b/libkcal/libical/src/libicalss/Makefile.am
new file mode 100644
index 00000000..d2c1396b
--- /dev/null
+++ b/libkcal/libical/src/libicalss/Makefile.am
@@ -0,0 +1,35 @@
+
+noinst_LTLIBRARIES = libicalss.la
+
+AM_YFLAGS =-d -v -p ss
+AM_LFLAGS = -Pss
+LEX_OUTPUT_ROOT = lex.ss
+
+INCLUDES = -I../libical -I$(srcdir)/../libical
+
+libicalss_la_SOURCES = \
+ icalclassify.c \
+ icalclassify.h
+
+# We don't need icalss.h, but it needs to be built...
+libicalss_la_COMPILE_FIRST = ../libical/ical.h icalss.h
+
+COMBINEDHEADERS = \
+ $(srcdir)/icalclassify.h
+
+icalss.h: $(COMBINEDHEADERS)
+ echo '#ifdef __cplusplus' > icalss.h
+ echo 'extern "C" {' >> icalss.h
+ echo '#endif' >> icalss.h
+ cat $(COMBINEDHEADERS) \
+ | egrep -v "#include.*\"ical" \
+ | egrep -v "#include.*\"pvl\.h\"" \
+ | egrep -v '\$$(Id|Locker): .+\$$'>> icalss.h
+ echo '#ifdef __cplusplus' >> icalss.h
+ echo '}' >> icalss.h
+ echo '#endif' >> icalss.h
+
+noinst_HEADERS = icalss.h icalclassify.h
+
+CLEANFILES = icalss.h
+
diff --git a/libkcal/libical/src/libicalss/icalclassify.c b/libkcal/libical/src/libicalss/icalclassify.c
new file mode 100644
index 00000000..1cc848a1
--- /dev/null
+++ b/libkcal/libical/src/libicalss/icalclassify.c
@@ -0,0 +1,752 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: icalclassify.c
+ CREATOR: ebusboom 23 aug 2000
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+
+ ======================================================================*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "ical.h"
+#include "icalclassify.h"
+#include "icalmemory.h"
+
+#include <ctype.h> /* For tolower() */
+#include <string.h> /* for index() */
+#include <stdlib.h> /* for malloc and free */
+
+
+
+struct icalclassify_parts {
+ icalcomponent *c;
+ icalcomponent_kind inner_kind;
+ icalproperty_method method;
+ char* organizer;
+ icalparameter_partstat reply_partstat;
+ char* reply_attendee;
+ char* uid;
+ int sequence;
+ struct icaltimetype dtstamp;
+ struct icaltimetype recurrence_id;
+};
+
+
+char* icalclassify_lowercase(const char* str)
+{
+ char* p = 0;
+ char *xnew;
+
+ if(str ==0){
+ return 0;
+ }
+
+ xnew = icalmemory_strdup(str);
+ for(p = xnew; *p!=0; p++){
+ *p = tolower(*p);
+ }
+
+ return xnew;
+}
+
+
+
+icalproperty* icalclassify_find_attendee(icalcomponent *c,
+ const char* attendee)
+{
+ icalproperty *p;
+ icalcomponent* inner;
+ char* lattendee;
+ char* upn;
+
+ if(attendee == 0){
+ return 0;
+ }
+
+ lattendee = icalclassify_lowercase(attendee);
+ upn = strchr(lattendee,':');
+
+ if (upn== 0){
+ upn = lattendee;
+ } else {
+ upn++; /* skip the ";"*/
+ }
+
+ inner = icalcomponent_get_first_real_component(c);
+
+ for(p = icalcomponent_get_first_property(inner,ICAL_ATTENDEE_PROPERTY);
+ p != 0;
+ p = icalcomponent_get_next_property(inner,ICAL_ATTENDEE_PROPERTY))
+ {
+ char* this_upn;
+ char* this_attendee
+ = icalclassify_lowercase(icalproperty_get_attendee(p));
+ if ( !this_attendee ) continue;
+ this_upn = strchr(this_attendee,':');
+
+ if(this_upn == 0){
+ continue;
+ } else {
+ this_upn++;
+ }
+
+ if(strcmp(this_upn,upn)==0){
+ free(lattendee);
+ free(this_attendee);
+ return p;
+ }
+
+ free(this_attendee);
+ }
+ free(lattendee);
+
+ return 0;
+
+}
+
+void icalssutil_free_parts(struct icalclassify_parts *parts)
+{
+ if(parts == 0){
+ return;
+ }
+
+ if(parts->organizer != 0){
+ free(parts->organizer);
+ }
+
+ if(parts->uid != 0){
+ free(parts->uid);
+ }
+
+ if(parts->reply_attendee){
+ free(parts->reply_attendee);
+ }
+}
+
+void icalssutil_get_parts(icalcomponent* c,
+ struct icalclassify_parts* parts)
+{
+ icalproperty *p;
+ icalcomponent *inner;
+
+ memset(parts,0,sizeof(struct icalclassify_parts));
+
+ parts->method = ICAL_METHOD_NONE;
+ parts->sequence = 0;
+ parts->reply_partstat = ICAL_PARTSTAT_NONE;
+
+ if(c == 0){
+ return;
+ }
+
+ parts->c = c;
+
+ p = icalcomponent_get_first_property(c,ICAL_METHOD_PROPERTY);
+ if(p!=0){
+ parts->method = icalproperty_get_method(p);
+ }
+
+ inner = icalcomponent_get_first_real_component(c);
+
+ parts->inner_kind = icalcomponent_isa(inner);
+
+ p = icalcomponent_get_first_property(inner,ICAL_ORGANIZER_PROPERTY);
+ if(p!=0){
+ const char *p_organizer = icalproperty_get_organizer(p);
+ if (p_organizer!=0) {
+ parts->organizer = strdup(p_organizer);
+ }
+ }
+
+ p = icalcomponent_get_first_property(inner,ICAL_SEQUENCE_PROPERTY);
+ if(p!=0){
+ parts->sequence = icalproperty_get_sequence(p);
+ }
+
+ p = icalcomponent_get_first_property(inner,ICAL_UID_PROPERTY);
+ if(p!=0){
+ const char *p_uid = icalproperty_get_uid(p);
+ if (p_uid!=0) {
+ parts->uid = strdup(p_uid);
+ }
+ }
+
+ p = icalcomponent_get_first_property(inner,ICAL_RECURRENCEID_PROPERTY);
+ if(p!=0){
+ parts->recurrence_id = icalproperty_get_recurrenceid(p);
+ }
+
+ p = icalcomponent_get_first_property(inner,ICAL_DTSTAMP_PROPERTY);
+ if(p!=0){
+ parts->dtstamp = icalproperty_get_dtstamp(p);
+ }
+
+ if(parts->method==ICAL_METHOD_REPLY){
+ icalparameter *param;
+ p = icalcomponent_get_first_property(inner,ICAL_ATTENDEE_PROPERTY);
+
+ if(p!=0){
+ const char *attendee = 0;
+ param = icalproperty_get_first_parameter(p,ICAL_PARTSTAT_PARAMETER);
+
+ if(param != 0){
+ parts->reply_partstat =
+ icalparameter_get_partstat(param);
+ }
+ attendee = icalproperty_get_attendee(p);
+ if ( attendee )
+ parts->reply_attendee = strdup( attendee );
+ }
+
+ }
+
+
+}
+
+
+int icalssutil_is_rescheduled(icalcomponent* a,icalcomponent* b)
+{
+ icalproperty *p1,*p2;
+ icalcomponent *i1,*i2;
+ int i;
+
+ icalproperty_kind kind_array[] = {
+ ICAL_DTSTART_PROPERTY,
+ ICAL_DTEND_PROPERTY,
+ ICAL_DURATION_PROPERTY,
+ ICAL_DUE_PROPERTY,
+ ICAL_RRULE_PROPERTY,
+ ICAL_RDATE_PROPERTY,
+ ICAL_EXRULE_PROPERTY,
+ ICAL_EXDATE_PROPERTY,
+ ICAL_NO_PROPERTY
+ };
+
+ i1 = icalcomponent_get_first_real_component(a);
+ i2 = icalcomponent_get_first_real_component(b);
+
+ for(i =0; kind_array[i] != ICAL_NO_PROPERTY; i++){
+ p1 = icalcomponent_get_first_property(i1,kind_array[i]);
+ p2 = icalcomponent_get_first_property(i2,kind_array[i]);
+
+ if( (p1!=0)^(p2!=0) ){
+ /* Return true if the property exists in one component and not
+ the other */
+ return 1;
+ }
+
+ if(p1 && strcmp(icalproperty_as_ical_string(p1),
+ icalproperty_as_ical_string(p2)) != 0){
+ return 1;
+ }
+ }
+
+ return 0;
+
+}
+
+#define icalclassify_pre \
+ int rtrn =0;
+
+#define icalclassify_post \
+ return rtrn;
+
+
+int icalclassify_publish_new(struct icalclassify_parts *comp,
+ struct icalclassify_parts *match,
+ const char* user)
+{
+ icalclassify_pre;
+ (void)user;
+
+ if(comp->method == ICAL_METHOD_PUBLISH &&
+ match == 0 && comp->inner_kind != ICAL_VFREEBUSY_COMPONENT){
+ rtrn = 1;
+ }
+
+ icalclassify_post;
+
+}
+
+int icalclassify_publish_update(struct icalclassify_parts *comp,
+ struct icalclassify_parts *match,
+ const char* user)
+{
+ icalclassify_pre;
+ (void)user;
+
+ if(comp->method == ICAL_METHOD_PUBLISH &&
+ match !=0 && comp->inner_kind != ICAL_VFREEBUSY_COMPONENT){
+ rtrn = 1;
+ }
+
+ icalclassify_post;
+
+}
+
+int icalclassify_publish_freebusy(struct icalclassify_parts *comp,
+ struct icalclassify_parts *match,
+ const char* user)
+{
+ icalclassify_pre;
+
+ (void)match;
+ (void)user;
+ if(comp->method == ICAL_METHOD_PUBLISH &&
+ comp->inner_kind == ICAL_VFREEBUSY_COMPONENT){
+ rtrn = 1;
+ }
+
+ icalclassify_post;
+
+}
+
+
+int icalclassify_request_new(struct icalclassify_parts *comp,
+ struct icalclassify_parts *match,
+ const char* user)
+{
+ /* Method is REQUEST, and there is no match */
+
+ icalclassify_pre
+ (void)user;
+
+ if(match->c==0 && comp->method == ICAL_METHOD_REQUEST){
+ rtrn = 1;
+ }
+
+ icalclassify_post
+
+}
+
+int icalclassify_request_update(
+ struct icalclassify_parts *comp,
+ struct icalclassify_parts *match,
+ const char* user)
+{
+ /* REQUEST method, Higher SEQUENCE than match, and all
+ time-related properties are unchanged */
+
+ icalclassify_pre
+ (void)user;
+
+ if (match != 0 &&
+ comp->sequence >= match->sequence &&
+ !icalssutil_is_rescheduled(comp->c,match->c)){
+ rtrn = 1;
+ }
+
+ icalclassify_post
+
+}
+
+int icalclassify_request_reschedule(
+ struct icalclassify_parts *comp,
+ struct icalclassify_parts *match,
+ const char* user)
+{
+ /* REQUEST method, Higher SEQUENCE than match, and one or more
+ time-related properties are changed */
+ icalclassify_pre
+ (void)user;
+
+ if (match->c != 0 &&
+ comp->sequence > match->sequence &&
+ icalssutil_is_rescheduled(comp->c,match->c)){
+ rtrn = 1;
+ }
+
+ icalclassify_post
+
+}
+
+int icalclassify_request_delegate(
+ struct icalclassify_parts *comp,
+ struct icalclassify_parts *match,
+ const char* user)
+{
+ icalproperty* attendee;
+ icalparameter* param;
+ icalclassify_pre;
+ (void)match;
+
+ attendee = icalclassify_find_attendee(comp->c,user);
+
+ if(attendee == 0){
+ return 0;
+ }
+
+ param = icalproperty_get_first_parameter(attendee,ICAL_DELEGATEDFROM_PARAMETER);
+
+ if (param != 0){
+ rtrn = 1;
+ }
+
+ icalclassify_post
+
+}
+
+int icalclassify_request_new_organizer(
+ struct icalclassify_parts *comp,
+ struct icalclassify_parts *match,
+ const char* user)
+{
+ /* Organizer has changed between match and component */
+ icalclassify_pre
+ icalerror_set_errno(ICAL_UNIMPLEMENTED_ERROR);
+ icalclassify_post
+ (void)comp;
+ (void)match;
+ (void)user;
+
+}
+
+int icalclassify_request_status(
+ struct icalclassify_parts *comp,
+ struct icalclassify_parts *match,
+ const char* user)
+{
+ icalclassify_pre
+ icalerror_set_errno(ICAL_UNIMPLEMENTED_ERROR);
+ icalclassify_post
+ (void)comp;
+ (void)match;
+ (void)user;
+}
+
+int icalclassify_request_forward(
+ struct icalclassify_parts *comp,
+ struct icalclassify_parts *match,
+ const char* user)
+{
+ icalclassify_pre
+ icalerror_set_errno(ICAL_UNIMPLEMENTED_ERROR);
+ icalclassify_post
+ (void)comp;
+ (void)match;
+ (void)user;
+}
+
+int icalclassify_request_freebusy(
+ struct icalclassify_parts *comp,
+ struct icalclassify_parts *match,
+ const char* user)
+{
+ icalclassify_pre
+ icalerror_set_errno(ICAL_UNIMPLEMENTED_ERROR);
+ icalclassify_post
+ (void)comp;
+ (void)match;
+ (void)user;
+}
+
+int icalclassify_reply_accept(
+ struct icalclassify_parts *comp,
+ struct icalclassify_parts *match,
+ const char* user)
+{
+ icalproperty* attendee;
+ icalclassify_pre;
+ (void)user;
+
+ attendee = icalclassify_find_attendee(match->c,comp->reply_attendee);
+
+ if(attendee != 0&&
+ comp->reply_partstat == ICAL_PARTSTAT_ACCEPTED){
+ rtrn = 1;
+ }
+
+ icalclassify_post
+}
+int icalclassify_reply_decline(
+ struct icalclassify_parts *comp,
+ struct icalclassify_parts *match,
+ const char* user)
+{
+ icalproperty* attendee;
+ icalclassify_pre;
+ (void)user;
+
+ attendee = icalclassify_find_attendee(match->c,comp->reply_attendee);
+
+
+ if( attendee != 0 &&
+ comp->reply_partstat == ICAL_PARTSTAT_DECLINED){
+ rtrn = 1;
+ }
+ icalclassify_post
+}
+int icalclassify_reply_delegate(
+ struct icalclassify_parts *comp,
+ struct icalclassify_parts *match,
+ const char* user)
+{
+ icalproperty* attendee;
+ icalclassify_pre;
+ (void)user;
+
+ attendee = icalclassify_find_attendee(match->c,comp->reply_attendee);
+
+ if( attendee != 0 &&
+ comp->reply_partstat == ICAL_PARTSTAT_DELEGATED){
+ rtrn = 1;
+ }
+ icalclassify_post
+}
+int icalclassify_reply_crasher_accept(
+ struct icalclassify_parts *comp,
+ struct icalclassify_parts *match,
+ const char* user)
+{
+ icalproperty* attendee;
+ icalclassify_pre;
+ (void)user;
+
+ attendee= icalclassify_find_attendee(match->c,comp->reply_attendee);
+
+ if(attendee == 0 &&
+ comp->reply_partstat == ICAL_PARTSTAT_ACCEPTED){
+ rtrn = 1;
+ }
+ icalclassify_post
+}
+int icalclassify_reply_crasher_decline(
+ struct icalclassify_parts *comp,
+ struct icalclassify_parts *match,
+ const char* user)
+{
+ icalproperty* attendee;
+ icalclassify_pre;
+ (void)user;
+
+
+ attendee = icalclassify_find_attendee(match->c,comp->reply_attendee);
+
+ if(attendee == 0 &&
+ comp->reply_partstat == ICAL_PARTSTAT_DECLINED){
+ rtrn = 1;
+ }
+ icalclassify_post
+}
+int icalclassify_add_instance(
+ struct icalclassify_parts *comp,
+ struct icalclassify_parts *match,
+ const char* user)
+{
+ icalclassify_pre
+ (void)match;
+ (void)user;
+
+ if(comp->method == ICAL_METHOD_ADD){
+ rtrn = 1;
+ }
+ icalclassify_post
+}
+int icalclassify_cancel_event(
+ struct icalclassify_parts *comp,
+ struct icalclassify_parts *match,
+ const char* user)
+{
+ icalclassify_pre
+ (void)match;
+ (void)user;
+ if(comp->method == ICAL_METHOD_CANCEL){
+ rtrn = 1;
+ }
+ icalclassify_post
+}
+int icalclassify_cancel_instance(
+ struct icalclassify_parts *comp,
+ struct icalclassify_parts *match,
+ const char* user)
+{
+ icalclassify_pre
+ (void)match;
+ (void)user;
+ if(comp->method == ICAL_METHOD_CANCEL){
+ rtrn = 1;
+ }
+ icalclassify_post
+}
+int icalclassify_cancel_all(
+ struct icalclassify_parts *comp,
+ struct icalclassify_parts *match,
+ const char* user)
+{
+ icalclassify_pre
+ (void)match;
+ (void)user;
+ if(comp->method == ICAL_METHOD_CANCEL){
+ rtrn = 1;
+ }
+ icalclassify_post
+}
+int icalclassify_refesh(
+ struct icalclassify_parts *comp,
+ struct icalclassify_parts *match,
+ const char* user)
+{
+ icalclassify_pre
+ (void)match;
+ (void)user;
+ if(comp->method == ICAL_METHOD_REFRESH){
+ rtrn = 1;
+ }
+ icalclassify_post
+}
+int icalclassify_counter(
+ struct icalclassify_parts *comp,
+ struct icalclassify_parts *match,
+ const char* user)
+{
+ icalclassify_pre
+ (void)match;
+ (void)user;
+ if(comp->method == ICAL_METHOD_COUNTER){
+ rtrn = 1;
+ }
+ icalclassify_post
+}
+int icalclassify_delinecounter(
+ struct icalclassify_parts *comp,
+ struct icalclassify_parts *match,
+ const char* user)
+{
+ icalclassify_pre
+ (void)match;
+ (void)user;
+
+ if(comp->method == ICAL_METHOD_DECLINECOUNTER){
+ rtrn = 1;
+ }
+
+ icalclassify_post
+}
+
+struct icalclassify_map {
+ icalproperty_method method;
+ int (*fn)(struct icalclassify_parts *comp,struct icalclassify_parts *match, const char* user);
+ icalproperty_xlicclass class;
+} icalclassify_map[] =
+{ {ICAL_METHOD_PUBLISH,icalclassify_publish_new,ICAL_XLICCLASS_PUBLISHNEW},
+ {ICAL_METHOD_PUBLISH,icalclassify_publish_update,ICAL_XLICCLASS_PUBLISHUPDATE},
+ {ICAL_METHOD_PUBLISH,icalclassify_publish_freebusy,ICAL_XLICCLASS_PUBLISHFREEBUSY},
+ {ICAL_METHOD_REQUEST,icalclassify_request_delegate,ICAL_XLICCLASS_REQUESTDELEGATE},
+ {ICAL_METHOD_REQUEST,icalclassify_request_new,ICAL_XLICCLASS_REQUESTNEW},
+ {ICAL_METHOD_REQUEST,icalclassify_request_update,ICAL_XLICCLASS_REQUESTUPDATE},
+ {ICAL_METHOD_REQUEST,icalclassify_request_reschedule,ICAL_XLICCLASS_REQUESTRESCHEDULE},
+
+ {ICAL_METHOD_REQUEST,icalclassify_request_new_organizer,ICAL_XLICCLASS_REQUESTNEWORGANIZER},
+ {ICAL_METHOD_REQUEST,icalclassify_request_forward,ICAL_XLICCLASS_REQUESTFORWARD},
+ {ICAL_METHOD_REQUEST,icalclassify_request_status,ICAL_XLICCLASS_REQUESTSTATUS},
+ {ICAL_METHOD_REQUEST,icalclassify_request_freebusy,ICAL_XLICCLASS_REQUESTFREEBUSY},
+
+ {ICAL_METHOD_REPLY,icalclassify_reply_accept,ICAL_XLICCLASS_REPLYACCEPT},
+ {ICAL_METHOD_REPLY,icalclassify_reply_decline,ICAL_XLICCLASS_REPLYDECLINE},
+ {ICAL_METHOD_REPLY,icalclassify_reply_delegate,ICAL_XLICCLASS_REPLYDELEGATE},
+ {ICAL_METHOD_REPLY,icalclassify_reply_crasher_accept,ICAL_XLICCLASS_REPLYCRASHERACCEPT},
+ {ICAL_METHOD_REPLY,icalclassify_reply_crasher_decline,ICAL_XLICCLASS_REPLYCRASHERDECLINE},
+
+ {ICAL_METHOD_ADD,icalclassify_add_instance,ICAL_XLICCLASS_ADDINSTANCE},
+
+ {ICAL_METHOD_CANCEL,icalclassify_cancel_event,ICAL_XLICCLASS_CANCELEVENT},
+ {ICAL_METHOD_CANCEL,icalclassify_cancel_instance,ICAL_XLICCLASS_CANCELINSTANCE},
+ {ICAL_METHOD_CANCEL,icalclassify_cancel_all,ICAL_XLICCLASS_CANCELALL},
+
+ {ICAL_METHOD_REFRESH,icalclassify_refesh,ICAL_XLICCLASS_REFRESH},
+ {ICAL_METHOD_COUNTER,icalclassify_counter,ICAL_XLICCLASS_COUNTER},
+ {ICAL_METHOD_DECLINECOUNTER,icalclassify_delinecounter,ICAL_XLICCLASS_DECLINECOUNTER},
+ {ICAL_METHOD_NONE,0,ICAL_XLICCLASS_NONE}
+};
+
+
+icalproperty_xlicclass icalclassify(icalcomponent* c,icalcomponent* match,
+ const char* user)
+{
+ icalcomponent *inner;
+ icalproperty *p;
+ icalproperty_method method;
+ icalproperty_xlicclass class = ICAL_XLICCLASS_UNKNOWN;
+
+ int i;
+
+ struct icalclassify_parts comp_parts;
+ struct icalclassify_parts match_parts;
+
+ inner = icalcomponent_get_first_real_component(c);
+
+ if (inner == 0) {
+ return ICAL_XLICCLASS_NONE;
+ }
+
+ icalssutil_get_parts(c,&comp_parts);
+ icalssutil_get_parts(match,&match_parts);
+
+ /* Determine if the incoming component is obsoleted by the match */
+ if(match != 0 && (
+ comp_parts.method == ICAL_METHOD_REQUEST
+ )){
+ assert ( ! ((comp_parts.dtstamp.is_utc==1)^
+ (match_parts.dtstamp.is_utc==1)));
+
+ if( comp_parts.sequence<match_parts.sequence &&
+ icaltime_compare(comp_parts.dtstamp,match_parts.dtstamp)>0)
+ {
+ /* comp has a smaller sequence and a later DTSTAMP */
+ class = ICAL_XLICCLASS_MISSEQUENCED;
+ goto CLEANUP;
+ }
+
+ if( (comp_parts.sequence<match_parts.sequence )
+ /*&&icaltime_compare(comp_parts.dtstamp,match_parts.dtstamp)<=0*/
+ ||
+ ( comp_parts.sequence == match_parts.sequence &&
+ icaltime_compare(comp_parts.dtstamp,match_parts.dtstamp)<=0)){
+
+ class = ICAL_XLICCLASS_OBSOLETE;
+ goto CLEANUP;
+ }
+
+ }
+
+ p = icalcomponent_get_first_property(c,ICAL_METHOD_PROPERTY);
+ if (p == 0) {
+ class = ICAL_XLICCLASS_UNKNOWN;
+ goto CLEANUP;
+ }
+ method = icalproperty_get_method(p);
+
+ for (i =0; icalclassify_map[i].method != ICAL_METHOD_NONE; i++){
+ if(icalclassify_map[i].method == method){
+ if( (*(icalclassify_map[i].fn))(&comp_parts,&match_parts,user)==1){
+ class = icalclassify_map[i].class;
+ break;
+ }
+ }
+ }
+
+CLEANUP:
+ icalssutil_free_parts(&comp_parts);
+ icalssutil_free_parts(&match_parts);
+
+ return class;
+
+}
+
diff --git a/libkcal/libical/src/libicalss/icalclassify.h b/libkcal/libical/src/libicalss/icalclassify.h
new file mode 100644
index 00000000..9132a2f5
--- /dev/null
+++ b/libkcal/libical/src/libicalss/icalclassify.h
@@ -0,0 +1,38 @@
+/* -*- Mode: C -*- */
+/*======================================================================
+ FILE: icalclassify.h
+ CREATOR: eric 21 Aug 2000
+
+
+
+ (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
+ http://www.softwarestudio.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of either:
+
+ The LGPL as published by the Free Software Foundation, version
+ 2.1, available at: http://www.fsf.org/copyleft/lesser.html
+
+ Or:
+
+ The Mozilla Public License Version 1.0. You may obtain a copy of
+ the License at http://www.mozilla.org/MPL/
+
+
+ =========================================================================*/
+
+#ifndef ICALCLASSIFY_H
+#define ICALCLASSIFY_H
+
+#include "ical.h"
+
+icalproperty_xlicclass icalclassify(icalcomponent* c,icalcomponent* match,
+ const char* user);
+
+#endif /* ICALCLASSIFY_H*/
+
+
+
+
+
diff --git a/libkcal/libical/tzdata/africa b/libkcal/libical/tzdata/africa
new file mode 100644
index 00000000..434110cc
--- /dev/null
+++ b/libkcal/libical/tzdata/africa
@@ -0,0 +1,673 @@
+# @(#)africa 8.10
+# <pre>
+
+# This data is by no means authoritative; if you think you know better,
+# go ahead and edit the file (and please send any changes to
+# tz@elsie.nci.nih.gov for general use in the future).
+
+# From Paul Eggert (2006-03-22):
+#
+# A good source for time zone historical data outside the U.S. is
+# Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition),
+# San Diego: ACS Publications, Inc. (2003).
+#
+# Gwillim Law writes that a good source
+# for recent time zone data is the International Air Transport
+# Association's Standard Schedules Information Manual (IATA SSIM),
+# published semiannually. Law sent in several helpful summaries
+# of the IATA's data after 1990.
+#
+# Except where otherwise noted, Shanks & Pottenger is the source for
+# entries through 1990, and IATA SSIM is the source for entries afterwards.
+#
+# Another source occasionally used is Edward W. Whitman, World Time Differences,
+# Whitman Publishing Co, 2 Niagara Av, Ealing, London (undated), which
+# I found in the UCLA library.
+#
+# A reliable and entertaining source about time zones is
+# Derek Howse, Greenwich time and longitude, Philip Wilson Publishers (1997).
+#
+# Previous editions of this database used WAT, CAT, SAT, and EAT
+# for +0:00 through +3:00, respectively,
+# but Mark R V Murray reports that
+# `SAST' is the official abbreviation for +2:00 in the country of South Africa,
+# `CAT' is commonly used for +2:00 in countries north of South Africa, and
+# `WAT' is probably the best name for +1:00, as the common phrase for
+# the area that includes Nigeria is ``West Africa''.
+# He has heard of ``Western Sahara Time'' for +0:00 but can find no reference.
+#
+# To make things confusing, `WAT' seems to have been used for -1:00 long ago;
+# I'd guess that this was because people needed _some_ name for -1:00,
+# and at the time, far west Africa was the only major land area in -1:00.
+# This usage is now obsolete, as the last use of -1:00 on the African
+# mainland seems to have been 1976 in Western Sahara.
+#
+# To summarize, the following abbreviations seem to have some currency:
+# -1:00 WAT West Africa Time (no longer used)
+# 0:00 GMT Greenwich Mean Time
+# 2:00 CAT Central Africa Time
+# 2:00 SAST South Africa Standard Time
+# and Murray suggests the following abbreviation:
+# 1:00 WAT West Africa Time
+# I realize that this leads to `WAT' being used for both -1:00 and 1:00
+# for times before 1976, but this is the best I can think of
+# until we get more information.
+#
+# I invented the following abbreviations; corrections are welcome!
+# 2:00 WAST West Africa Summer Time
+# 2:30 BEAT British East Africa Time (no longer used)
+# 2:44:45 BEAUT British East Africa Unified Time (no longer used)
+# 3:00 CAST Central Africa Summer Time (no longer used)
+# 3:00 SAST South Africa Summer Time (no longer used)
+# 3:00 EAT East Africa Time
+# 4:00 EAST East Africa Summer Time (no longer used)
+
+# Algeria
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Algeria 1916 only - Jun 14 23:00s 1:00 S
+Rule Algeria 1916 1919 - Oct Sun>=1 23:00s 0 -
+Rule Algeria 1917 only - Mar 24 23:00s 1:00 S
+Rule Algeria 1918 only - Mar 9 23:00s 1:00 S
+Rule Algeria 1919 only - Mar 1 23:00s 1:00 S
+Rule Algeria 1920 only - Feb 14 23:00s 1:00 S
+Rule Algeria 1920 only - Oct 23 23:00s 0 -
+Rule Algeria 1921 only - Mar 14 23:00s 1:00 S
+Rule Algeria 1921 only - Jun 21 23:00s 0 -
+Rule Algeria 1939 only - Sep 11 23:00s 1:00 S
+Rule Algeria 1939 only - Nov 19 1:00 0 -
+Rule Algeria 1944 1945 - Apr Mon>=1 2:00 1:00 S
+Rule Algeria 1944 only - Oct 8 2:00 0 -
+Rule Algeria 1945 only - Sep 16 1:00 0 -
+Rule Algeria 1971 only - Apr 25 23:00s 1:00 S
+Rule Algeria 1971 only - Sep 26 23:00s 0 -
+Rule Algeria 1977 only - May 6 0:00 1:00 S
+Rule Algeria 1977 only - Oct 21 0:00 0 -
+Rule Algeria 1978 only - Mar 24 1:00 1:00 S
+Rule Algeria 1978 only - Sep 22 3:00 0 -
+Rule Algeria 1980 only - Apr 25 0:00 1:00 S
+Rule Algeria 1980 only - Oct 31 2:00 0 -
+# Shanks & Pottenger give 0:09:20 for Paris Mean Time; go with Howse's
+# more precise 0:09:21.
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Algiers 0:12:12 - LMT 1891 Mar 15 0:01
+ 0:09:21 - PMT 1911 Mar 11 # Paris Mean Time
+ 0:00 Algeria WE%sT 1940 Feb 25 2:00
+ 1:00 Algeria CE%sT 1946 Oct 7
+ 0:00 - WET 1956 Jan 29
+ 1:00 - CET 1963 Apr 14
+ 0:00 Algeria WE%sT 1977 Oct 21
+ 1:00 Algeria CE%sT 1979 Oct 26
+ 0:00 Algeria WE%sT 1981 May
+ 1:00 - CET
+
+# Angola
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Luanda 0:52:56 - LMT 1892
+ 0:52:04 - AOT 1911 May 26 # Angola Time
+ 1:00 - WAT
+
+# Benin
+# Whitman says they switched to 1:00 in 1946, not 1934;
+# go with Shanks & Pottenger.
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Porto-Novo 0:10:28 - LMT 1912
+ 0:00 - GMT 1934 Feb 26
+ 1:00 - WAT
+
+# Botswana
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Gaborone 1:43:40 - LMT 1885
+ 2:00 - CAT 1943 Sep 19 2:00
+ 2:00 1:00 CAST 1944 Mar 19 2:00
+ 2:00 - CAT
+
+# Burkina Faso
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Ouagadougou -0:06:04 - LMT 1912
+ 0:00 - GMT
+
+# Burundi
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Bujumbura 1:57:28 - LMT 1890
+ 2:00 - CAT
+
+# Cameroon
+# Whitman says they switched to 1:00 in 1920; go with Shanks & Pottenger.
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Douala 0:38:48 - LMT 1912
+ 1:00 - WAT
+
+# Cape Verde
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Atlantic/Cape_Verde -1:34:04 - LMT 1907 # Praia
+ -2:00 - CVT 1942 Sep
+ -2:00 1:00 CVST 1945 Oct 15
+ -2:00 - CVT 1975 Nov 25 2:00
+ -1:00 - CVT
+
+# Central African Republic
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Bangui 1:14:20 - LMT 1912
+ 1:00 - WAT
+
+# Chad
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Ndjamena 1:00:12 - LMT 1912
+ 1:00 - WAT 1979 Oct 14
+ 1:00 1:00 WAST 1980 Mar 8
+ 1:00 - WAT
+
+# Comoros
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Indian/Comoro 2:53:04 - LMT 1911 Jul # Moroni, Gran Comoro
+ 3:00 - EAT
+
+# Democratic Republic of Congo
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Kinshasa 1:01:12 - LMT 1897 Nov 9
+ 1:00 - WAT
+Zone Africa/Lubumbashi 1:49:52 - LMT 1897 Nov 9
+ 2:00 - CAT
+
+# Republic of the Congo
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Brazzaville 1:01:08 - LMT 1912
+ 1:00 - WAT
+
+# Cote D'Ivoire
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Abidjan -0:16:08 - LMT 1912
+ 0:00 - GMT
+
+# Djibouti
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Djibouti 2:52:36 - LMT 1911 Jul
+ 3:00 - EAT
+
+###############################################################################
+
+# Egypt
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Egypt 1940 only - Jul 15 0:00 1:00 S
+Rule Egypt 1940 only - Oct 1 0:00 0 -
+Rule Egypt 1941 only - Apr 15 0:00 1:00 S
+Rule Egypt 1941 only - Sep 16 0:00 0 -
+Rule Egypt 1942 1944 - Apr 1 0:00 1:00 S
+Rule Egypt 1942 only - Oct 27 0:00 0 -
+Rule Egypt 1943 1945 - Nov 1 0:00 0 -
+Rule Egypt 1945 only - Apr 16 0:00 1:00 S
+Rule Egypt 1957 only - May 10 0:00 1:00 S
+Rule Egypt 1957 1958 - Oct 1 0:00 0 -
+Rule Egypt 1958 only - May 1 0:00 1:00 S
+Rule Egypt 1959 1981 - May 1 1:00 1:00 S
+Rule Egypt 1959 1965 - Sep 30 3:00 0 -
+Rule Egypt 1966 1994 - Oct 1 3:00 0 -
+Rule Egypt 1982 only - Jul 25 1:00 1:00 S
+Rule Egypt 1983 only - Jul 12 1:00 1:00 S
+Rule Egypt 1984 1988 - May 1 1:00 1:00 S
+Rule Egypt 1989 only - May 6 1:00 1:00 S
+Rule Egypt 1990 1994 - May 1 1:00 1:00 S
+# IATA (after 1990) says transitions are at 0:00.
+# Go with IATA starting in 1995, except correct 1995 entry from 09-30 to 09-29.
+Rule Egypt 1995 max - Apr lastFri 0:00s 1:00 S
+Rule Egypt 1995 2005 - Sep lastThu 23:00s 0 -
+# From Steffen Thorsen (2006-09-19):
+# The Egyptian Gazette, issue 41,090 (2006-09-18), page 1, reports:
+# Egypt will turn back clocks by one hour at the midnight of Thursday
+# after observing the daylight saving time since May.
+# http://news.gom.com.eg/gazette/pdf/2006/09/18/01.pdf
+Rule Egypt 2006 only - Sep 21 23:00s 0 -
+# From Dirk Losch (2007-08-14):
+# I received a mail from an airline which says that the daylight
+# saving time in Egypt will end in the night of 2007-09-06 to 2007-09-07.
+# From Jesper Norgaard Welen (2007-08-15): [The following agree:]
+# http://www.nentjes.info/Bill/bill5.htm
+# http://www.timeanddate.com/worldclock/city.html?n=53
+# From Steffen Thorsen (2007-09-04): The official information...:
+# http://www.sis.gov.eg/En/EgyptOnline/Miscellaneous/000002/0207000000000000001580.htm
+Rule Egypt 2007 only - Sep Thu>=1 23:00s 0 -
+# From Abdelrahman Hassan (2007-09-06):
+# Due to the Hijri (lunar Islamic calendar) year being 11 days shorter
+# than the year of the Gregorian calendar, Ramadan shifts earlier each
+# year. This year it will be observed September 13 (September is quite
+# hot in Egypt), and the idea is to make fasting easier for workers by
+# shifting business hours one hour out of daytime heat. Consequently,
+# unless discontinued, next DST may end Thursday 28 August 2008.
+# From Paul Eggert (2007-08-17):
+# For lack of better info, assume the new rule is last Thursday in August.
+Rule Egypt 2008 max - Aug lastThu 23:00s 0 -
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Cairo 2:05:00 - LMT 1900 Oct
+ 2:00 Egypt EE%sT
+
+# Equatorial Guinea
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Malabo 0:35:08 - LMT 1912
+ 0:00 - GMT 1963 Dec 15
+ 1:00 - WAT
+
+# Eritrea
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Asmara 2:35:32 - LMT 1870
+ 2:35:32 - AMT 1890 # Asmara Mean Time
+ 2:35:20 - ADMT 1936 May 5 # Adis Dera MT
+ 3:00 - EAT
+
+# Ethiopia
+# From Paul Eggert (2006-03-22):
+# Shanks & Pottenger write that Ethiopia had six narrowly-spaced time zones
+# between 1870 and 1890, and that they merged to 38E50 (2:35:20) in 1890.
+# We'll guess that 38E50 is for Adis Dera.
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Addis_Ababa 2:34:48 - LMT 1870
+ 2:35:20 - ADMT 1936 May 5 # Adis Dera MT
+ 3:00 - EAT
+
+# Gabon
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Libreville 0:37:48 - LMT 1912
+ 1:00 - WAT
+
+# Gambia
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Banjul -1:06:36 - LMT 1912
+ -1:06:36 - BMT 1935 # Banjul Mean Time
+ -1:00 - WAT 1964
+ 0:00 - GMT
+
+# Ghana
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+# Whitman says DST was observed from 1931 to ``the present'';
+# go with Shanks & Pottenger.
+Rule Ghana 1936 1942 - Sep 1 0:00 0:20 GHST
+Rule Ghana 1936 1942 - Dec 31 0:00 0 GMT
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Accra -0:00:52 - LMT 1918
+ 0:00 Ghana %s
+
+# Guinea
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Conakry -0:54:52 - LMT 1912
+ 0:00 - GMT 1934 Feb 26
+ -1:00 - WAT 1960
+ 0:00 - GMT
+
+# Guinea-Bissau
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Bissau -1:02:20 - LMT 1911 May 26
+ -1:00 - WAT 1975
+ 0:00 - GMT
+
+# Kenya
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Nairobi 2:27:16 - LMT 1928 Jul
+ 3:00 - EAT 1930
+ 2:30 - BEAT 1940
+ 2:44:45 - BEAUT 1960
+ 3:00 - EAT
+
+# Lesotho
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Maseru 1:50:00 - LMT 1903 Mar
+ 2:00 - SAST 1943 Sep 19 2:00
+ 2:00 1:00 SAST 1944 Mar 19 2:00
+ 2:00 - SAST
+
+# Liberia
+# From Paul Eggert (2006-03-22):
+# In 1972 Liberia was the last country to switch
+# from a UTC offset that was not a multiple of 15 or 20 minutes.
+# Howse reports that it was in honor of their president's birthday.
+# Shank & Pottenger report the date as May 1, whereas Howse reports Jan;
+# go with Shanks & Pottenger.
+# For Liberia before 1972, Shanks & Pottenger report -0:44, whereas Howse and
+# Whitman each report -0:44:30; go with the more precise figure.
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Monrovia -0:43:08 - LMT 1882
+ -0:43:08 - MMT 1919 Mar # Monrovia Mean Time
+ -0:44:30 - LRT 1972 May # Liberia Time
+ 0:00 - GMT
+
+###############################################################################
+
+# Libya
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Libya 1951 only - Oct 14 2:00 1:00 S
+Rule Libya 1952 only - Jan 1 0:00 0 -
+Rule Libya 1953 only - Oct 9 2:00 1:00 S
+Rule Libya 1954 only - Jan 1 0:00 0 -
+Rule Libya 1955 only - Sep 30 0:00 1:00 S
+Rule Libya 1956 only - Jan 1 0:00 0 -
+Rule Libya 1982 1984 - Apr 1 0:00 1:00 S
+Rule Libya 1982 1985 - Oct 1 0:00 0 -
+Rule Libya 1985 only - Apr 6 0:00 1:00 S
+Rule Libya 1986 only - Apr 4 0:00 1:00 S
+Rule Libya 1986 only - Oct 3 0:00 0 -
+Rule Libya 1987 1989 - Apr 1 0:00 1:00 S
+Rule Libya 1987 1989 - Oct 1 0:00 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Tripoli 0:52:44 - LMT 1920
+ 1:00 Libya CE%sT 1959
+ 2:00 - EET 1982
+ 1:00 Libya CE%sT 1990 May 4
+# The following entries are from Shanks & Pottenger;
+# the IATA SSIM data contain some obvious errors.
+ 2:00 - EET 1996 Sep 30
+ 1:00 - CET 1997 Apr 4
+ 1:00 1:00 CEST 1997 Oct 4
+ 2:00 - EET
+
+# Madagascar
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Indian/Antananarivo 3:10:04 - LMT 1911 Jul
+ 3:00 - EAT 1954 Feb 27 23:00s
+ 3:00 1:00 EAST 1954 May 29 23:00s
+ 3:00 - EAT
+
+# Malawi
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Blantyre 2:20:00 - LMT 1903 Mar
+ 2:00 - CAT
+
+# Mali
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Bamako -0:32:00 - LMT 1912
+ 0:00 - GMT 1934 Feb 26
+ -1:00 - WAT 1960 Jun 20
+ 0:00 - GMT
+
+# Mauritania
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Nouakchott -1:03:48 - LMT 1912
+ 0:00 - GMT 1934 Feb 26
+ -1:00 - WAT 1960 Nov 28
+ 0:00 - GMT
+
+# Mauritius
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Indian/Mauritius 3:50:00 - LMT 1907 # Port Louis
+ 4:00 - MUT # Mauritius Time
+# Agalega Is, Rodriguez
+# no information; probably like Indian/Mauritius
+
+# Mayotte
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Indian/Mayotte 3:00:56 - LMT 1911 Jul # Mamoutzou
+ 3:00 - EAT
+
+# Morocco
+# See the `europe' file for Spanish Morocco (Africa/Ceuta).
+# RULE NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Morocco 1939 only - Sep 12 0:00 1:00 S
+Rule Morocco 1939 only - Nov 19 0:00 0 -
+Rule Morocco 1940 only - Feb 25 0:00 1:00 S
+Rule Morocco 1945 only - Nov 18 0:00 0 -
+Rule Morocco 1950 only - Jun 11 0:00 1:00 S
+Rule Morocco 1950 only - Oct 29 0:00 0 -
+Rule Morocco 1967 only - Jun 3 12:00 1:00 S
+Rule Morocco 1967 only - Oct 1 0:00 0 -
+Rule Morocco 1974 only - Jun 24 0:00 1:00 S
+Rule Morocco 1974 only - Sep 1 0:00 0 -
+Rule Morocco 1976 1977 - May 1 0:00 1:00 S
+Rule Morocco 1976 only - Aug 1 0:00 0 -
+Rule Morocco 1977 only - Sep 28 0:00 0 -
+Rule Morocco 1978 only - Jun 1 0:00 1:00 S
+Rule Morocco 1978 only - Aug 4 0:00 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Casablanca -0:30:20 - LMT 1913 Oct 26
+ 0:00 Morocco WE%sT 1984 Mar 16
+ 1:00 - CET 1986
+ 0:00 - WET
+# Western Sahara
+Zone Africa/El_Aaiun -0:52:48 - LMT 1934 Jan
+ -1:00 - WAT 1976 Apr 14
+ 0:00 - WET
+
+# Mozambique
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Maputo 2:10:20 - LMT 1903 Mar
+ 2:00 - CAT
+
+# Namibia
+# The 1994-04-03 transition is from Shanks & Pottenger.
+# Shanks & Pottenger report no DST after 1998-04; go with IATA.
+
+# From Petronella Sibeene (2007-03-30) in
+# <http://allafrica.com/stories/200703300178.html>:
+# While the entire country changes its time, Katima Mulilo and other
+# settlements in Caprivi unofficially will not because the sun there
+# rises and sets earlier compared to other regions. Chief of
+# Forecasting Riaan van Zyl explained that the far eastern parts of
+# the country are close to 40 minutes earlier in sunrise than the rest
+# of the country.
+#
+# From Paul Eggert (2007-03-31):
+# Apparently the Caprivi Strip informally observes Botswana time, but
+# we have no details. In the meantime people there can use Africa/Gaborone.
+
+# RULE NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Namibia 1994 max - Sep Sun>=1 2:00 1:00 S
+Rule Namibia 1995 max - Apr Sun>=1 2:00 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Windhoek 1:08:24 - LMT 1892 Feb 8
+ 1:30 - SWAT 1903 Mar # SW Africa Time
+ 2:00 - SAST 1942 Sep 20 2:00
+ 2:00 1:00 SAST 1943 Mar 21 2:00
+ 2:00 - SAST 1990 Mar 21 # independence
+ 2:00 - CAT 1994 Apr 3
+ 1:00 Namibia WA%sT
+
+# Niger
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Niamey 0:08:28 - LMT 1912
+ -1:00 - WAT 1934 Feb 26
+ 0:00 - GMT 1960
+ 1:00 - WAT
+
+# Nigeria
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Lagos 0:13:36 - LMT 1919 Sep
+ 1:00 - WAT
+
+# Reunion
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Indian/Reunion 3:41:52 - LMT 1911 Jun # Saint-Denis
+ 4:00 - RET # Reunion Time
+#
+# Scattered Islands (Iles Eparses) administered from Reunion are as follows.
+# The following information about them is taken from
+# Iles Eparses (www.outre-mer.gouv.fr/domtom/ile.htm, 1997-07-22, in French;
+# no longer available as of 1999-08-17).
+# We have no info about their time zone histories.
+#
+# Bassas da India - uninhabited
+# Europa Island - inhabited from 1905 to 1910 by two families
+# Glorioso Is - inhabited until at least 1958
+# Juan de Nova - uninhabited
+# Tromelin - inhabited until at least 1958
+
+# Rwanda
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Kigali 2:00:16 - LMT 1935 Jun
+ 2:00 - CAT
+
+# St Helena
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Atlantic/St_Helena -0:22:48 - LMT 1890 # Jamestown
+ -0:22:48 - JMT 1951 # Jamestown Mean Time
+ 0:00 - GMT
+# The other parts of the St Helena territory are similar:
+# Tristan da Cunha: on GMT, say Whitman and the CIA
+# Ascension: on GMT, says usno1995 and the CIA
+# Gough (scientific station since 1955; sealers wintered previously):
+# on GMT, says the CIA
+# Inaccessible, Nightingale: no information, but probably GMT
+
+# Sao Tome and Principe
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Sao_Tome 0:26:56 - LMT 1884
+ -0:36:32 - LMT 1912 # Lisbon Mean Time
+ 0:00 - GMT
+
+# Senegal
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Dakar -1:09:44 - LMT 1912
+ -1:00 - WAT 1941 Jun
+ 0:00 - GMT
+
+# Seychelles
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Indian/Mahe 3:41:48 - LMT 1906 Jun # Victoria
+ 4:00 - SCT # Seychelles Time
+# From Paul Eggert (2001-05-30):
+# Aldabra, Farquhar, and Desroches, originally dependencies of the
+# Seychelles, were transferred to the British Indian Ocean Territory
+# in 1965 and returned to Seychelles control in 1976. We don't know
+# whether this affected their time zone, so omit this for now.
+# Possibly the islands were uninhabited.
+
+# Sierra Leone
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+# Whitman gives Mar 31 - Aug 31 for 1931 on; go with Shanks & Pottenger.
+Rule SL 1935 1942 - Jun 1 0:00 0:40 SLST
+Rule SL 1935 1942 - Oct 1 0:00 0 WAT
+Rule SL 1957 1962 - Jun 1 0:00 1:00 SLST
+Rule SL 1957 1962 - Sep 1 0:00 0 GMT
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Freetown -0:53:00 - LMT 1882
+ -0:53:00 - FMT 1913 Jun # Freetown Mean Time
+ -1:00 SL %s 1957
+ 0:00 SL %s
+
+# Somalia
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Mogadishu 3:01:28 - LMT 1893 Nov
+ 3:00 - EAT 1931
+ 2:30 - BEAT 1957
+ 3:00 - EAT
+
+# South Africa
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule SA 1942 1943 - Sep Sun>=15 2:00 1:00 -
+Rule SA 1943 1944 - Mar Sun>=15 2:00 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Johannesburg 1:52:00 - LMT 1892 Feb 8
+ 1:30 - SAST 1903 Mar
+ 2:00 SA SAST
+# Marion and Prince Edward Is
+# scientific station since 1947
+# no information
+
+# Sudan
+#
+# From <a href="http://www.sunanews.net/sn13jane.html">
+# Sudan News Agency (2000-01-13)
+# </a>, also reported by Michael De Beukelaer-Dossche via Steffen Thorsen:
+# Clocks will be moved ahead for 60 minutes all over the Sudan as of noon
+# Saturday.... This was announced Thursday by Caretaker State Minister for
+# Manpower Abdul-Rahman Nur-Eddin.
+#
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Sudan 1970 only - May 1 0:00 1:00 S
+Rule Sudan 1970 1985 - Oct 15 0:00 0 -
+Rule Sudan 1971 only - Apr 30 0:00 1:00 S
+Rule Sudan 1972 1985 - Apr lastSun 0:00 1:00 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Khartoum 2:10:08 - LMT 1931
+ 2:00 Sudan CA%sT 2000 Jan 15 12:00
+ 3:00 - EAT
+
+# Swaziland
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Mbabane 2:04:24 - LMT 1903 Mar
+ 2:00 - SAST
+
+# Tanzania
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Dar_es_Salaam 2:37:08 - LMT 1931
+ 3:00 - EAT 1948
+ 2:44:45 - BEAUT 1961
+ 3:00 - EAT
+
+# Togo
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Lome 0:04:52 - LMT 1893
+ 0:00 - GMT
+
+# Tunisia
+
+# From Gwillim Law (2005-04-30):
+# My correspondent, Risto Nykanen, has alerted me to another adoption of DST,
+# this time in Tunisia. According to Yahoo France News
+# <http://fr.news.yahoo.com/050426/5/4dumk.html>, in a story attributed to AP
+# and dated 2005-04-26, "Tunisia has decided to advance its official time by
+# one hour, starting on Sunday, May 1. Henceforth, Tunisian time will be
+# UTC+2 instead of UTC+1. The change will take place at 23:00 UTC next
+# Saturday." (My translation)
+#
+# From Oscar van Vlijmen (2005-05-02):
+# LaPresse, the first national daily newspaper ...
+# <http://www.lapresse.tn/archives/archives280405/actualites/lheure.html>
+# ... DST for 2005: on: Sun May 1 0h standard time, off: Fri Sept. 30,
+# 1h standard time.
+#
+# From Atef Loukil (2006-03-28):
+# The daylight saving time will be the same each year:
+# Beginning : the last Sunday of March at 02:00
+# Ending : the last Sunday of October at 03:00 ...
+# http://www.tap.info.tn/en/index.php?option=com_content&task=view&id=1188&Itemid=50
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Tunisia 1939 only - Apr 15 23:00s 1:00 S
+Rule Tunisia 1939 only - Nov 18 23:00s 0 -
+Rule Tunisia 1940 only - Feb 25 23:00s 1:00 S
+Rule Tunisia 1941 only - Oct 6 0:00 0 -
+Rule Tunisia 1942 only - Mar 9 0:00 1:00 S
+Rule Tunisia 1942 only - Nov 2 3:00 0 -
+Rule Tunisia 1943 only - Mar 29 2:00 1:00 S
+Rule Tunisia 1943 only - Apr 17 2:00 0 -
+Rule Tunisia 1943 only - Apr 25 2:00 1:00 S
+Rule Tunisia 1943 only - Oct 4 2:00 0 -
+Rule Tunisia 1944 1945 - Apr Mon>=1 2:00 1:00 S
+Rule Tunisia 1944 only - Oct 8 0:00 0 -
+Rule Tunisia 1945 only - Sep 16 0:00 0 -
+Rule Tunisia 1977 only - Apr 30 0:00s 1:00 S
+Rule Tunisia 1977 only - Sep 24 0:00s 0 -
+Rule Tunisia 1978 only - May 1 0:00s 1:00 S
+Rule Tunisia 1978 only - Oct 1 0:00s 0 -
+Rule Tunisia 1988 only - Jun 1 0:00s 1:00 S
+Rule Tunisia 1988 1990 - Sep lastSun 0:00s 0 -
+Rule Tunisia 1989 only - Mar 26 0:00s 1:00 S
+Rule Tunisia 1990 only - May 1 0:00s 1:00 S
+Rule Tunisia 2005 only - May 1 0:00s 1:00 S
+Rule Tunisia 2005 only - Sep 30 1:00s 0 -
+Rule Tunisia 2006 max - Mar lastSun 2:00s 1:00 S
+Rule Tunisia 2006 max - Oct lastSun 2:00s 0 -
+# Shanks & Pottenger give 0:09:20 for Paris Mean Time; go with Howse's
+# more precise 0:09:21.
+# Shanks & Pottenger say the 1911 switch was on Mar 9; go with Howse's Mar 11.
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Tunis 0:40:44 - LMT 1881 May 12
+ 0:09:21 - PMT 1911 Mar 11 # Paris Mean Time
+ 1:00 Tunisia CE%sT
+
+# Uganda
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Kampala 2:09:40 - LMT 1928 Jul
+ 3:00 - EAT 1930
+ 2:30 - BEAT 1948
+ 2:44:45 - BEAUT 1957
+ 3:00 - EAT
+
+# Zambia
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Lusaka 1:53:08 - LMT 1903 Mar
+ 2:00 - CAT
+
+# Zimbabwe
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Africa/Harare 2:04:12 - LMT 1903 Mar
+ 2:00 - CAT
diff --git a/libkcal/libical/tzdata/antarctica b/libkcal/libical/tzdata/antarctica
new file mode 100644
index 00000000..ef279cbe
--- /dev/null
+++ b/libkcal/libical/tzdata/antarctica
@@ -0,0 +1,327 @@
+# @(#)antarctica 8.4
+# <pre>
+
+# From Paul Eggert (1999-11-15):
+# To keep things manageable, we list only locations occupied year-round; see
+# <a href="http://www.comnap.aq/comnap/comnap.nsf/P/Stations/">
+# COMNAP - Stations and Bases
+# </a>
+# and
+# <a href="http://www.spri.cam.ac.uk/bob/periant.htm">
+# Summary of the Peri-Antarctic Islands (1998-07-23)
+# </a>
+# for information.
+# Unless otherwise specified, we have no time zone information.
+#
+# Except for the French entries,
+# I made up all time zone abbreviations mentioned here; corrections welcome!
+# FORMAT is `zzz' and GMTOFF is 0 for locations while uninhabited.
+
+# These rules are stolen from the `europe' file.
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule RussAQ 1981 1984 - Apr 1 0:00 1:00 S
+Rule RussAQ 1981 1983 - Oct 1 0:00 0 -
+Rule RussAQ 1984 1991 - Sep lastSun 2:00s 0 -
+Rule RussAQ 1985 1991 - Mar lastSun 2:00s 1:00 S
+Rule RussAQ 1992 only - Mar lastSat 23:00 1:00 S
+Rule RussAQ 1992 only - Sep lastSat 23:00 0 -
+Rule RussAQ 1993 max - Mar lastSun 2:00s 1:00 S
+Rule RussAQ 1993 1995 - Sep lastSun 2:00s 0 -
+Rule RussAQ 1996 max - Oct lastSun 2:00s 0 -
+
+# These rules are stolen from the `southamerica' file.
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule ArgAQ 1964 1966 - Mar 1 0:00 0 -
+Rule ArgAQ 1964 1966 - Oct 15 0:00 1:00 S
+Rule ArgAQ 1967 only - Apr 2 0:00 0 -
+Rule ArgAQ 1967 1968 - Oct Sun>=1 0:00 1:00 S
+Rule ArgAQ 1968 1969 - Apr Sun>=1 0:00 0 -
+Rule ArgAQ 1974 only - Jan 23 0:00 1:00 S
+Rule ArgAQ 1974 only - May 1 0:00 0 -
+Rule ChileAQ 1972 1986 - Mar Sun>=9 3:00u 0 -
+Rule ChileAQ 1974 1987 - Oct Sun>=9 4:00u 1:00 S
+Rule ChileAQ 1987 only - Apr 12 3:00u 0 -
+Rule ChileAQ 1988 1989 - Mar Sun>=9 3:00u 0 -
+Rule ChileAQ 1988 only - Oct Sun>=1 4:00u 1:00 S
+Rule ChileAQ 1989 only - Oct Sun>=9 4:00u 1:00 S
+Rule ChileAQ 1990 only - Mar 18 3:00u 0 -
+Rule ChileAQ 1990 only - Sep 16 4:00u 1:00 S
+Rule ChileAQ 1991 1996 - Mar Sun>=9 3:00u 0 -
+Rule ChileAQ 1991 1997 - Oct Sun>=9 4:00u 1:00 S
+Rule ChileAQ 1997 only - Mar 30 3:00u 0 -
+Rule ChileAQ 1998 only - Mar Sun>=9 3:00u 0 -
+Rule ChileAQ 1998 only - Sep 27 4:00u 1:00 S
+Rule ChileAQ 1999 only - Apr 4 3:00u 0 -
+Rule ChileAQ 1999 max - Oct Sun>=9 4:00u 1:00 S
+Rule ChileAQ 2000 max - Mar Sun>=9 3:00u 0 -
+
+
+# Argentina - year-round bases
+# Belgrano II, Confin Coast, -770227-0343737, since 1972-02-05
+# Esperanza, San Martin Land, -6323-05659, since 1952-12-17
+# Jubany, Potter Peninsula, King George Island, -6414-0602320, since 1982-01
+# Marambio, Seymour I, -6414-05637, since 1969-10-29
+# Orcadas, Laurie I, -6016-04444, since 1904-02-22
+# San Martin, Debenham I, -6807-06708, since 1951-03-21
+# (except 1960-03 / 1976-03-21)
+
+# Australia - territories
+# Heard Island, McDonald Islands (uninhabited)
+# previously sealers and scientific personnel wintered
+# <a href="http://web.archive.org/web/20021204222245/http://www.dstc.qut.edu.au/DST/marg/daylight.html">
+# Margaret Turner reports
+# </a> (1999-09-30) that they're UTC+5, with no DST;
+# presumably this is when they have visitors.
+#
+# year-round bases
+# Casey, Bailey Peninsula, -6617+11032, since 1969
+# Davis, Vestfold Hills, -6835+07759, since 1957-01-13
+# (except 1964-11 - 1969-02)
+# Mawson, Holme Bay, -6736+06253, since 1954-02-13
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Antarctica/Casey 0 - zzz 1969
+ 8:00 - WST # Western (Aus) Standard Time
+Zone Antarctica/Davis 0 - zzz 1957 Jan 13
+ 7:00 - DAVT 1964 Nov # Davis Time
+ 0 - zzz 1969 Feb
+ 7:00 - DAVT
+Zone Antarctica/Mawson 0 - zzz 1954 Feb 13
+ 6:00 - MAWT # Mawson Time
+# References:
+# <a href="http://www.antdiv.gov.au/aad/exop/sfo/casey/casey_aws.html">
+# Casey Weather (1998-02-26)
+# </a>
+# <a href="http://www.antdiv.gov.au/aad/exop/sfo/davis/video.html">
+# Davis Station, Antarctica (1998-02-26)
+# </a>
+# <a href="http://www.antdiv.gov.au/aad/exop/sfo/mawson/video.html">
+# Mawson Station, Antarctica (1998-02-25)
+# </a>
+
+# Brazil - year-round base
+# Comandante Ferraz, King George Island, -6205+05824, since 1983/4
+
+# Chile - year-round bases and towns
+# Escudero, South Shetland Is, -621157-0585735, since 1994
+# Presidente Eduadro Frei, King George Island, -6214-05848, since 1969-03-07
+# General Bernardo O'Higgins, Antarctic Peninsula, -6319-05704, since 1948-02
+# Capitan Arturo Prat, -6230-05941
+# Villa Las Estrellas (a town), around the Frei base, since 1984-04-09
+# These locations have always used Santiago time; use TZ='America/Santiago'.
+
+# China - year-round bases
+# Great Wall, King George Island, -6213-05858, since 1985-02-20
+# Zhongshan, Larsemann Hills, Prydz Bay, -6922+07623, since 1989-02-26
+
+# France - year-round bases
+#
+# From Antoine Leca (1997-01-20):
+# Time data are from Nicole Pailleau at the IFRTP
+# (French Institute for Polar Research and Technology).
+# She confirms that French Southern Territories and Terre Adelie bases
+# don't observe daylight saving time, even if Terre Adelie supplies came
+# from Tasmania.
+#
+# French Southern Territories with year-round inhabitants
+#
+# Martin-de-Vivies Base, Amsterdam Island, -374105+0773155, since 1950
+# Alfred-Faure Base, Crozet Islands, -462551+0515152, since 1964
+# Port-aux-Francais, Kerguelen Islands, -492110+0701303, since 1951;
+# whaling & sealing station operated 1908/1914, 1920/1929, and 1951/1956
+#
+# St Paul Island - near Amsterdam, uninhabited
+# fishing stations operated variously 1819/1931
+#
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Indian/Kerguelen 0 - zzz 1950 # Port-aux-Francais
+ 5:00 - TFT # ISO code TF Time
+#
+# year-round base in the main continent
+# Dumont-d'Urville, Ile des Petrels, -6640+14001, since 1956-11
+#
+# Another base at Port-Martin, 50km east, began operation in 1947.
+# It was destroyed by fire on 1952-01-14.
+#
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Antarctica/DumontDUrville 0 - zzz 1947
+ 10:00 - PMT 1952 Jan 14 # Port-Martin Time
+ 0 - zzz 1956 Nov
+ 10:00 - DDUT # Dumont-d'Urville Time
+# Reference:
+# <a href="http://en.wikipedia.org/wiki/Dumont_d'Urville_Station">
+# Dumont d'Urville Station (2005-12-05)
+# </a>
+
+# Germany - year-round base
+# Georg von Neumayer, -7039-00815
+
+# India - year-round base
+# Dakshin Gangotri, -7005+01200
+
+# Japan - year-round bases
+# Dome Fuji, -7719+03942
+# Syowa, -690022+0393524
+#
+# From Hideyuki Suzuki (1999-02-06):
+# In all Japanese stations, +0300 is used as the standard time.
+#
+# Syowa station, which is the first antarctic station of Japan,
+# was established on 1957-01-29. Since Syowa station is still the main
+# station of Japan, it's appropriate for the principal location.
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Antarctica/Syowa 0 - zzz 1957 Jan 29
+ 3:00 - SYOT # Syowa Time
+# See:
+# <a href="http://www.nipr.ac.jp/english/ara01.html">
+# NIPR Antarctic Research Activities (1999-08-17)
+# </a>
+
+# S Korea - year-round base
+# King Sejong, King George Island, -6213-05847, since 1988
+
+# New Zealand - claims
+# Balleny Islands (never inhabited)
+# Scott Island (never inhabited)
+#
+# year-round base
+# Scott, Ross Island, since 1957-01, is like Antarctica/McMurdo.
+#
+# These rules for New Zealand are stolen from the `australasia' file.
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule NZAQ 1974 only - Nov 3 2:00s 1:00 D
+Rule NZAQ 1975 1988 - Oct lastSun 2:00s 1:00 D
+Rule NZAQ 1989 only - Oct 8 2:00s 1:00 D
+Rule NZAQ 1990 2006 - Oct Sun>=1 2:00s 1:00 D
+Rule NZAQ 1975 only - Feb 23 2:00s 0 S
+Rule NZAQ 1976 1989 - Mar Sun>=1 2:00s 0 S
+Rule NZAQ 1990 2007 - Mar Sun>=15 2:00s 0 S
+Rule NZAQ 2007 max - Sep lastSun 2:00s 1:00 D
+Rule NZAQ 2008 max - Apr Sun>=1 2:00s 0 S
+
+# Norway - territories
+# Bouvet (never inhabited)
+#
+# claims
+# Peter I Island (never inhabited)
+
+# Poland - year-round base
+# Arctowski, King George Island, -620945-0582745, since 1977
+
+# Russia - year-round bases
+# Bellingshausen, King George Island, -621159-0585337, since 1968-02-22
+# Mirny, Davis coast, -6633+09301, since 1956-02
+# Molodezhnaya, Alasheyev Bay, -6740+04551,
+# year-round from 1962-02 to 1999-07-01
+# Novolazarevskaya, Queen Maud Land, -7046+01150,
+# year-round from 1960/61 to 1992
+
+# Vostok, since 1957-12-16, temporarily closed 1994-02/1994-11
+# <a href="http://quest.arc.nasa.gov/antarctica/QA/computers/Directions,Time,ZIP">
+# From Craig Mundell (1994-12-15)</a>:
+# Vostok, which is one of the Russian stations, is set on the same
+# time as Moscow, Russia.
+#
+# From Lee Hotz (2001-03-08):
+# I queried the folks at Columbia who spent the summer at Vostok and this is
+# what they had to say about time there:
+# ``in the US Camp (East Camp) we have been on New Zealand (McMurdo)
+# time, which is 12 hours ahead of GMT. The Russian Station Vostok was
+# 6 hours behind that (although only 2 miles away, i.e. 6 hours ahead
+# of GMT). This is a time zone I think two hours east of Moscow. The
+# natural time zone is in between the two: 8 hours ahead of GMT.''
+#
+# From Paul Eggert (2001-05-04):
+# This seems to be hopelessly confusing, so I asked Lee Hotz about it
+# in person. He said that some Antartic locations set their local
+# time so that noon is the warmest part of the day, and that this
+# changes during the year and does not necessarily correspond to mean
+# solar noon. So the Vostok time might have been whatever the clocks
+# happened to be during their visit. So we still don't really know what time
+# it is at Vostok. But we'll guess UTC+6.
+#
+Zone Antarctica/Vostok 0 - zzz 1957 Dec 16
+ 6:00 - VOST # Vostok time
+
+# S Africa - year-round bases
+# Marion Island, -4653+03752
+# Sanae, -7141-00250
+
+# UK
+#
+# British Antarctic Territories (BAT) claims
+# South Orkney Islands
+# scientific station from 1903
+# whaling station at Signy I 1920/1926
+# South Shetland Islands
+#
+# year-round bases
+# Bird Island, South Georgia, -5400-03803, since 1983
+# Deception Island, -6259-06034, whaling station 1912/1931,
+# scientific station 1943/1967,
+# previously sealers and a scientific expedition wintered by accident,
+# and a garrison was deployed briefly
+# Halley, Coates Land, -7535-02604, since 1956-01-06
+# Halley is on a moving ice shelf and is periodically relocated
+# so that it is never more than 10km from its nominal location.
+# Rothera, Adelaide Island, -6734-6808, since 1976-12-01
+#
+# From Paul Eggert (2002-10-22)
+# <http://webexhibits.org/daylightsaving/g.html> says Rothera is -03 all year.
+#
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Antarctica/Rothera 0 - zzz 1976 Dec 1
+ -3:00 - ROTT # Rothera time
+
+# Uruguay - year round base
+# Artigas, King George Island, -621104-0585107
+
+# USA - year-round bases
+#
+# Palmer, Anvers Island, since 1965 (moved 2 miles in 1968)
+#
+# From Ethan Dicks (1996-10-06):
+# It keeps the same time as Punta Arenas, Chile, because, just like us
+# and the South Pole, that's the other end of their supply line....
+# I verified with someone who was there that since 1980,
+# Palmer has followed Chile. Prior to that, before the Falklands War,
+# Palmer used to be supplied from Argentina.
+#
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Antarctica/Palmer 0 - zzz 1965
+ -4:00 ArgAQ AR%sT 1969 Oct 5
+ -3:00 ArgAQ AR%sT 1982 May
+ -4:00 ChileAQ CL%sT
+#
+#
+# McMurdo, Ross Island, since 1955-12
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Antarctica/McMurdo 0 - zzz 1956
+ 12:00 NZAQ NZ%sT
+#
+# Amundsen-Scott, South Pole, continuously occupied since 1956-11-20
+#
+# From Paul Eggert (1996-09-03):
+# Normally it wouldn't have a separate entry, since it's like the
+# larger Antarctica/McMurdo since 1970, but it's too famous to omit.
+#
+# From Chris Carrier (1996-06-27):
+# Siple, the first commander of the South Pole station,
+# stated that he would have liked to have kept GMT at the station,
+# but that he found it more convenient to keep GMT+12
+# as supplies for the station were coming from McMurdo Sound,
+# which was on GMT+12 because New Zealand was on GMT+12 all year
+# at that time (1957). (Source: Siple's book 90 degrees SOUTH.)
+#
+# From Susan Smith
+# http://www.cybertours.com/whs/pole10.html
+# (1995-11-13 16:24:56 +1300, no longer available):
+# We use the same time as McMurdo does.
+# And they use the same time as Christchurch, NZ does....
+# One last quirk about South Pole time.
+# All the electric clocks are usually wrong.
+# Something about the generators running at 60.1hertz or something
+# makes all of the clocks run fast. So every couple of days,
+# we have to go around and set them back 5 minutes or so.
+# Maybe if we let them run fast all of the time, we'd get to leave here sooner!!
+#
+Link Antarctica/McMurdo Antarctica/South_Pole
diff --git a/libkcal/libical/tzdata/asia b/libkcal/libical/tzdata/asia
new file mode 100644
index 00000000..70f15153
--- /dev/null
+++ b/libkcal/libical/tzdata/asia
@@ -0,0 +1,1919 @@
+# @(#)asia 8.18
+# <pre>
+
+# This data is by no means authoritative; if you think you know better,
+# go ahead and edit the file (and please send any changes to
+# tz@elsie.nci.nih.gov for general use in the future).
+
+# From Paul Eggert (2006-03-22):
+#
+# A good source for time zone historical data outside the U.S. is
+# Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition),
+# San Diego: ACS Publications, Inc. (2003).
+#
+# Gwillim Law writes that a good source
+# for recent time zone data is the International Air Transport
+# Association's Standard Schedules Information Manual (IATA SSIM),
+# published semiannually. Law sent in several helpful summaries
+# of the IATA's data after 1990.
+#
+# Except where otherwise noted, Shanks & Pottenger is the source for
+# entries through 1990, and IATA SSIM is the source for entries afterwards.
+#
+# Another source occasionally used is Edward W. Whitman, World Time Differences,
+# Whitman Publishing Co, 2 Niagara Av, Ealing, London (undated), which
+# I found in the UCLA library.
+#
+# A reliable and entertaining source about time zones is
+# Derek Howse, Greenwich time and longitude, Philip Wilson Publishers (1997).
+#
+# I invented the abbreviations marked `*' in the following table;
+# the rest are from earlier versions of this file, or from other sources.
+# Corrections are welcome!
+# std dst
+# LMT Local Mean Time
+# 2:00 EET EEST Eastern European Time
+# 2:00 IST IDT Israel
+# 3:00 AST ADT Arabia*
+# 3:30 IRST IRDT Iran
+# 4:00 GST Gulf*
+# 5:30 IST India
+# 7:00 ICT Indochina*
+# 7:00 WIT west Indonesia
+# 8:00 CIT central Indonesia
+# 8:00 CST China
+# 9:00 CJT Central Japanese Time (1896/1937)*
+# 9:00 EIT east Indonesia
+# 9:00 JST JDT Japan
+# 9:00 KST KDT Korea
+# 9:30 CST (Australian) Central Standard Time
+#
+# See the `europe' file for Russia and Turkey in Asia.
+
+# From Guy Harris:
+# Incorporates data for Singapore from Robert Elz' asia 1.1, as well as
+# additional information from Tom Yap, Sun Microsystems Intercontinental
+# Technical Support (including a page from the Official Airline Guide -
+# Worldwide Edition). The names for time zones are guesses.
+
+###############################################################################
+
+# These rules are stolen from the `europe' file.
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule EUAsia 1981 max - Mar lastSun 1:00u 1:00 S
+Rule EUAsia 1979 1995 - Sep lastSun 1:00u 0 -
+Rule EUAsia 1996 max - Oct lastSun 1:00u 0 -
+Rule E-EurAsia 1981 max - Mar lastSun 0:00 1:00 S
+Rule E-EurAsia 1979 1995 - Sep lastSun 0:00 0 -
+Rule E-EurAsia 1996 max - Oct lastSun 0:00 0 -
+Rule RussiaAsia 1981 1984 - Apr 1 0:00 1:00 S
+Rule RussiaAsia 1981 1983 - Oct 1 0:00 0 -
+Rule RussiaAsia 1984 1991 - Sep lastSun 2:00s 0 -
+Rule RussiaAsia 1985 1991 - Mar lastSun 2:00s 1:00 S
+Rule RussiaAsia 1992 only - Mar lastSat 23:00 1:00 S
+Rule RussiaAsia 1992 only - Sep lastSat 23:00 0 -
+Rule RussiaAsia 1993 max - Mar lastSun 2:00s 1:00 S
+Rule RussiaAsia 1993 1995 - Sep lastSun 2:00s 0 -
+Rule RussiaAsia 1996 max - Oct lastSun 2:00s 0 -
+
+# Afghanistan
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Kabul 4:36:48 - LMT 1890
+ 4:00 - AFT 1945
+ 4:30 - AFT
+
+# Armenia
+# From Paul Eggert (2006-03-22):
+# Shanks & Pottenger have Yerevan switching to 3:00 (with Russian DST)
+# in spring 1991, then to 4:00 with no DST in fall 1995, then
+# readopting Russian DST in 1997. Go with Shanks & Pottenger, even
+# when they disagree with others. Edgar Der-Danieliantz
+# reported (1996-05-04) that Yerevan probably wouldn't use DST
+# in 1996, though it did use DST in 1995. IATA SSIM (1991/1998) reports that
+# Armenia switched from 3:00 to 4:00 in 1998 and observed DST after 1991,
+# but started switching at 3:00s in 1998.
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Yerevan 2:58:00 - LMT 1924 May 2
+ 3:00 - YERT 1957 Mar # Yerevan Time
+ 4:00 RussiaAsia YER%sT 1991 Mar 31 2:00s
+ 3:00 1:00 YERST 1991 Sep 23 # independence
+ 3:00 RussiaAsia AM%sT 1995 Sep 24 2:00s
+ 4:00 - AMT 1997
+ 4:00 RussiaAsia AM%sT
+
+# Azerbaijan
+# From Rustam Aliyev of the Azerbaijan Internet Forum (2005-10-23):
+# According to the resolution of Cabinet of Ministers, 1997
+# Resolution available at: http://aif.az/docs/daylight_res.pdf
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Azer 1997 max - Mar lastSun 4:00 1:00 S
+Rule Azer 1997 max - Oct lastSun 5:00 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Baku 3:19:24 - LMT 1924 May 2
+ 3:00 - BAKT 1957 Mar # Baku Time
+ 4:00 RussiaAsia BAK%sT 1991 Mar 31 2:00s
+ 3:00 1:00 BAKST 1991 Aug 30 # independence
+ 3:00 RussiaAsia AZ%sT 1992 Sep lastSat 23:00
+ 4:00 - AZT 1996 # Azerbaijan time
+ 4:00 EUAsia AZ%sT 1997
+ 4:00 Azer AZ%sT
+
+# Bahrain
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Bahrain 3:22:20 - LMT 1920 # Al Manamah
+ 4:00 - GST 1972 Jun
+ 3:00 - AST
+
+# Bangladesh
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Dhaka 6:01:40 - LMT 1890
+ 5:53:20 - HMT 1941 Oct # Howrah Mean Time?
+ 6:30 - BURT 1942 May 15 # Burma Time
+ 5:30 - IST 1942 Sep
+ 6:30 - BURT 1951 Sep 30
+ 6:00 - DACT 1971 Mar 26 # Dacca Time
+ 6:00 - BDT # Bangladesh Time
+
+# Bhutan
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Thimphu 5:58:36 - LMT 1947 Aug 15 # or Thimbu
+ 5:30 - IST 1987 Oct
+ 6:00 - BTT # Bhutan Time
+
+# British Indian Ocean Territory
+# Whitman and the 1995 CIA time zone map say 5:00, but the
+# 1997 and later maps say 6:00. Assume the switch occurred in 1996.
+# We have no information as to when standard time was introduced;
+# assume it occurred in 1907, the same year as Mauritius (which
+# then contained the Chagos Archipelago).
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Indian/Chagos 4:49:40 - LMT 1907
+ 5:00 - IOT 1996 # BIOT Time
+ 6:00 - IOT
+
+# Brunei
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Brunei 7:39:40 - LMT 1926 Mar # Bandar Seri Begawan
+ 7:30 - BNT 1933
+ 8:00 - BNT
+
+# Burma / Myanmar
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Rangoon 6:24:40 - LMT 1880 # or Yangon
+ 6:24:36 - RMT 1920 # Rangoon Mean Time?
+ 6:30 - BURT 1942 May # Burma Time
+ 9:00 - JST 1945 May 3
+ 6:30 - MMT # Myanmar Time
+
+# Cambodia
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Phnom_Penh 6:59:40 - LMT 1906 Jun 9
+ 7:06:20 - SMT 1911 Mar 11 0:01 # Saigon MT?
+ 7:00 - ICT 1912 May
+ 8:00 - ICT 1931 May
+ 7:00 - ICT
+
+# China
+
+# From Guy Harris:
+# People's Republic of China. Yes, they really have only one time zone.
+
+# From Bob Devine (1988-01-28):
+# No they don't. See TIME mag, 1986-02-17 p.52. Even though
+# China is across 4 physical time zones, before Feb 1, 1986 only the
+# Peking (Bejing) time zone was recognized. Since that date, China
+# has two of 'em -- Peking's and Urumqi (named after the capital of
+# the Xinjiang Uyghur Autonomous Region). I don't know about DST for it.
+#
+# . . .I just deleted the DST table and this editor makes it too
+# painful to suck in another copy.. So, here is what I have for
+# DST start/end dates for Peking's time zone (info from AP):
+#
+# 1986 May 4 - Sept 14
+# 1987 mid-April - ??
+
+# From U. S. Naval Observatory (1989-01-19):
+# CHINA 8 H AHEAD OF UTC ALL OF CHINA, INCL TAIWAN
+# CHINA 9 H AHEAD OF UTC APR 17 - SEP 10
+
+# From Paul Eggert (2006-03-22):
+# Shanks & Pottenger write that China (except for Hong Kong and Macau)
+# has had a single time zone since 1980 May 1, observing summer DST
+# from 1986 through 1991; this contradicts Devine's
+# note about Time magazine, though apparently _something_ happened in 1986.
+# Go with Shanks & Pottenger for now. I made up names for the other
+# pre-1980 time zones.
+
+# From Shanks & Pottenger:
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Shang 1940 only - Jun 3 0:00 1:00 D
+Rule Shang 1940 1941 - Oct 1 0:00 0 S
+Rule Shang 1941 only - Mar 16 0:00 1:00 D
+Rule PRC 1986 only - May 4 0:00 1:00 D
+Rule PRC 1986 1991 - Sep Sun>=11 0:00 0 S
+Rule PRC 1987 1991 - Apr Sun>=10 0:00 1:00 D
+
+# From Anthony Fok (2001-12-20):
+# BTW, I did some research on-line and found some info regarding these five
+# historic timezones from some Taiwan websites. And yes, there are official
+# Chinese names for these locales (before 1949).
+#
+# From Jesper Norgaard Welen (2006-07-14):
+# I have investigated the timezones around 1970 on the
+# http://www.astro.com/atlas site [with provinces and county
+# boundaries summarized below].... A few other exceptions were two
+# counties on the Sichuan side of the Xizang-Sichuan border,
+# counties Dege and Baiyu which lies on the Sichuan side and are
+# therefore supposed to be GMT+7, Xizang region being GMT+6, but Dege
+# county is GMT+8 according to astro.com while Baiyu county is GMT+6
+# (could be true), for the moment I am assuming that those two
+# counties are mistakes in the astro.com data.
+
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+# Changbai Time ("Long-white Time", Long-white = Heilongjiang area)
+# Heilongjiang (except Mohe county), Jilin
+Zone Asia/Harbin 8:26:44 - LMT 1928 # or Haerbin
+ 8:30 - CHAT 1932 Mar # Changbai Time
+ 8:00 - CST 1940
+ 9:00 - CHAT 1966 May
+ 8:30 - CHAT 1980 May
+ 8:00 PRC C%sT
+# Zhongyuan Time ("Central plain Time")
+# most of China
+Zone Asia/Shanghai 8:05:52 - LMT 1928
+ 8:00 Shang C%sT 1949
+ 8:00 PRC C%sT
+# Long-shu Time (probably due to Long and Shu being two names of that area)
+# Guangxi, Guizhou, Hainan, Ningxia, Sichuan, Shaanxi, and Yunnan;
+# most of Gansu; west Inner Mongolia; west Qinghai; and the Guangdong
+# counties Deqing, Enping, Kaiping, Luoding, Taishan, Xinxing,
+# Yangchun, Yangjiang, Yu'nan, and Yunfu.
+Zone Asia/Chongqing 7:06:20 - LMT 1928 # or Chungking
+ 7:00 - LONT 1980 May # Long-shu Time
+ 8:00 PRC C%sT
+# Xin-zang Time ("Xinjiang-Tibet Time")
+# The Gansu counties Aksay, Anxi, Dunhuang, Subei; west Qinghai;
+# the Guangdong counties Xuwen, Haikang, Suixi, Lianjiang,
+# Zhanjiang, Wuchuan, Huazhou, Gaozhou, Maoming, Dianbai, and Xinyi;
+# east Tibet, including Lhasa, Chamdo, Shigaise, Jimsar, Shawan and Hutubi;
+# east Xinjiang, including Urumqi, Turpan, Karamay, Korla, Minfeng, Jinghe,
+# Wusu, Qiemo, Xinyan, Wulanwusu, Jinghe, Yumin, Tacheng, Tuoli, Emin,
+# Shihezi, Changji, Yanqi, Heshuo, Tuokexun, Tulufan, Shanshan, Hami,
+# Fukang, Kuitun, Kumukuli, Miquan, Qitai, and Turfan.
+Zone Asia/Urumqi 5:50:20 - LMT 1928 # or Urumchi
+ 6:00 - URUT 1980 May # Urumqi Time
+ 8:00 PRC C%sT
+# Kunlun Time
+# West Tibet, including Pulan, Aheqi, Shufu, Shule;
+# West Xinjiang, including Aksu, Atushi, Yining, Hetian, Cele, Luopu, Nileke,
+# Zhaosu, Tekesi, Gongliu, Chabuchaer, Huocheng, Bole, Pishan, Suiding,
+# and Yarkand.
+Zone Asia/Kashgar 5:03:56 - LMT 1928 # or Kashi or Kaxgar
+ 5:30 - KAST 1940 # Kashgar Time
+ 5:00 - KAST 1980 May
+ 8:00 PRC C%sT
+
+# Hong Kong (Xianggang)
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule HK 1946 only - Apr 20 3:30 1:00 S
+Rule HK 1946 only - Dec 1 3:30 0 -
+Rule HK 1947 only - Apr 13 3:30 1:00 S
+Rule HK 1947 only - Dec 30 3:30 0 -
+Rule HK 1948 only - May 2 3:30 1:00 S
+Rule HK 1948 1952 - Oct lastSun 3:30 0 -
+Rule HK 1949 1953 - Apr Sun>=1 3:30 1:00 S
+Rule HK 1953 only - Nov 1 3:30 0 -
+Rule HK 1954 1964 - Mar Sun>=18 3:30 1:00 S
+Rule HK 1954 only - Oct 31 3:30 0 -
+Rule HK 1955 1964 - Nov Sun>=1 3:30 0 -
+Rule HK 1965 1977 - Apr Sun>=16 3:30 1:00 S
+Rule HK 1965 1977 - Oct Sun>=16 3:30 0 -
+Rule HK 1979 1980 - May Sun>=8 3:30 1:00 S
+Rule HK 1979 1980 - Oct Sun>=16 3:30 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Hong_Kong 7:36:36 - LMT 1904 Oct 30
+ 8:00 HK HK%sT
+
+
+###############################################################################
+
+# Taiwan
+
+# Shanks & Pottenger write that Taiwan observed DST during 1945, when it
+# was still controlled by Japan. This is hard to believe, but we don't
+# have any other information.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Taiwan 1945 1951 - May 1 0:00 1:00 D
+Rule Taiwan 1945 1951 - Oct 1 0:00 0 S
+Rule Taiwan 1952 only - Mar 1 0:00 1:00 D
+Rule Taiwan 1952 1954 - Nov 1 0:00 0 S
+Rule Taiwan 1953 1959 - Apr 1 0:00 1:00 D
+Rule Taiwan 1955 1961 - Oct 1 0:00 0 S
+Rule Taiwan 1960 1961 - Jun 1 0:00 1:00 D
+Rule Taiwan 1974 1975 - Apr 1 0:00 1:00 D
+Rule Taiwan 1974 1975 - Oct 1 0:00 0 S
+Rule Taiwan 1980 only - Jun 30 0:00 1:00 D
+Rule Taiwan 1980 only - Sep 30 0:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Taipei 8:06:00 - LMT 1896 # or Taibei or T'ai-pei
+ 8:00 Taiwan C%sT
+
+# Macau (Macao, Aomen)
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Macau 1961 1962 - Mar Sun>=16 3:30 1:00 S
+Rule Macau 1961 1964 - Nov Sun>=1 3:30 0 -
+Rule Macau 1963 only - Mar Sun>=16 0:00 1:00 S
+Rule Macau 1964 only - Mar Sun>=16 3:30 1:00 S
+Rule Macau 1965 only - Mar Sun>=16 0:00 1:00 S
+Rule Macau 1965 only - Oct 31 0:00 0 -
+Rule Macau 1966 1971 - Apr Sun>=16 3:30 1:00 S
+Rule Macau 1966 1971 - Oct Sun>=16 3:30 0 -
+Rule Macau 1972 1974 - Apr Sun>=15 0:00 1:00 S
+Rule Macau 1972 1973 - Oct Sun>=15 0:00 0 -
+Rule Macau 1974 1977 - Oct Sun>=15 3:30 0 -
+Rule Macau 1975 1977 - Apr Sun>=15 3:30 1:00 S
+Rule Macau 1978 1980 - Apr Sun>=15 0:00 1:00 S
+Rule Macau 1978 1980 - Oct Sun>=15 0:00 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Macau 7:34:20 - LMT 1912
+ 8:00 Macau MO%sT 1999 Dec 20 # return to China
+ 8:00 PRC C%sT
+
+
+###############################################################################
+
+# Cyprus
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Cyprus 1975 only - Apr 13 0:00 1:00 S
+Rule Cyprus 1975 only - Oct 12 0:00 0 -
+Rule Cyprus 1976 only - May 15 0:00 1:00 S
+Rule Cyprus 1976 only - Oct 11 0:00 0 -
+Rule Cyprus 1977 1980 - Apr Sun>=1 0:00 1:00 S
+Rule Cyprus 1977 only - Sep 25 0:00 0 -
+Rule Cyprus 1978 only - Oct 2 0:00 0 -
+Rule Cyprus 1979 1997 - Sep lastSun 0:00 0 -
+Rule Cyprus 1981 1998 - Mar lastSun 0:00 1:00 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Nicosia 2:13:28 - LMT 1921 Nov 14
+ 2:00 Cyprus EE%sT 1998 Sep
+ 2:00 EUAsia EE%sT
+# IATA SSIM (1998-09) has Cyprus using EU rules for the first time.
+
+# Classically, Cyprus belongs to Asia; e.g. see Herodotus, Histories, I.72.
+# However, for various reasons many users expect to find it under Europe.
+Link Asia/Nicosia Europe/Nicosia
+
+# Georgia
+# From Paul Eggert (1994-11-19):
+# Today's _Economist_ (p 60) reports that Georgia moved its clocks forward
+# an hour recently, due to a law proposed by Zurab Murvanidze,
+# an MP who went on a hunger strike for 11 days to force discussion about it!
+# We have no details, but we'll guess they didn't move the clocks back in fall.
+#
+# From Mathew Englander, quoting AP (1996-10-23 13:05-04):
+# Instead of putting back clocks at the end of October, Georgia
+# will stay on daylight savings time this winter to save energy,
+# President Eduard Shevardnadze decreed Wednesday.
+#
+# From the BBC via Joseph S. Myers (2004-06-27):
+#
+# Georgia moved closer to Western Europe on Sunday... The former Soviet
+# republic has changed its time zone back to that of Moscow. As a result it
+# is now just four hours ahead of Greenwich Mean Time, rather than five hours
+# ahead. The switch was decreed by the pro-Western president of Georgia,
+# Mikhail Saakashvili, who said the change was partly prompted by the process
+# of integration into Europe.
+
+# From Teimuraz Abashidze (2005-11-07):
+# Government of Georgia ... decided to NOT CHANGE daylight savings time on
+# [Oct.] 30, as it was done before during last more than 10 years.
+# Currently, we are in fact GMT +4:00, as before 30 October it was GMT
+# +3:00.... The problem is, there is NO FORMAL LAW or governmental document
+# about it. As far as I can find, I was told, that there is no document,
+# because we just DIDN'T ISSUE document about switching to winter time....
+# I don't know what can be done, especially knowing that some years ago our
+# DST rules where changed THREE TIMES during one month.
+
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Tbilisi 2:59:16 - LMT 1880
+ 2:59:16 - TBMT 1924 May 2 # Tbilisi Mean Time
+ 3:00 - TBIT 1957 Mar # Tbilisi Time
+ 4:00 RussiaAsia TBI%sT 1991 Mar 31 2:00s
+ 3:00 1:00 TBIST 1991 Apr 9 # independence
+ 3:00 RussiaAsia GE%sT 1992 # Georgia Time
+ 3:00 E-EurAsia GE%sT 1994 Sep lastSun
+ 4:00 E-EurAsia GE%sT 1996 Oct lastSun
+ 4:00 1:00 GEST 1997 Mar lastSun
+ 4:00 E-EurAsia GE%sT 2004 Jun 27
+ 3:00 RussiaAsia GE%sT 2005 Mar lastSun 2:00
+ 4:00 - GET
+
+# East Timor
+
+# See Indonesia for the 1945 transition.
+
+# From Joao Carrascalao, brother of the former governor of East Timor, in
+# <a href="http://etan.org/et99c/december/26-31/30ETMAY.htm">
+# East Timor may be late for its millennium
+# </a> (1999-12-26/31):
+# Portugal tried to change the time forward in 1974 because the sun
+# rises too early but the suggestion raised a lot of problems with the
+# Timorese and I still don't think it would work today because it
+# conflicts with their way of life.
+
+# From Paul Eggert (2000-12-04):
+# We don't have any record of the above attempt.
+# Most likely our records are incomplete, but we have no better data.
+
+# <a href="http://www.hri.org/news/world/undh/last/00-08-16.undh.html">
+# From Manoel de Almeida e Silva, Deputy Spokesman for the UN Secretary-General
+# (2000-08-16)</a>:
+# The Cabinet of the East Timor Transition Administration decided
+# today to advance East Timor's time by one hour. The time change,
+# which will be permanent, with no seasonal adjustment, will happen at
+# midnight on Saturday, September 16.
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Dili 8:22:20 - LMT 1912
+ 8:00 - TLT 1942 Feb 21 23:00 # E Timor Time
+ 9:00 - JST 1945 Sep 23
+ 9:00 - TLT 1976 May 3
+ 8:00 - CIT 2000 Sep 17 00:00
+ 9:00 - TLT
+
+# India
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Kolkata 5:53:28 - LMT 1880 # Kolkata
+ 5:53:20 - HMT 1941 Oct # Howrah Mean Time?
+ 6:30 - BURT 1942 May 15 # Burma Time
+ 5:30 - IST 1942 Sep
+ 5:30 1:00 IST 1945 Oct 15
+ 5:30 - IST
+# The following are like Asia/Kolkata:
+# Andaman Is
+# Lakshadweep (Laccadive, Minicoy and Amindivi Is)
+# Nicobar Is
+
+# Indonesia
+#
+# From Gwillim Law (2001-05-28), overriding Shanks & Pottenger:
+# <http://www.sumatera-inc.com/go_to_invest/about_indonesia.asp#standtime>
+# says that Indonesia's time zones changed on 1988-01-01. Looking at some
+# time zone maps, I think that must refer to Western Borneo (Kalimantan Barat
+# and Kalimantan Tengah) switching from UTC+8 to UTC+7.
+#
+# From Paul Eggert (2007-03-10):
+# Here is another correction to Shanks & Pottenger.
+# JohnTWB writes that Japanese forces did not surrender control in
+# Indonesia until 1945-09-01 00:00 at the earliest (in Jakarta) and
+# other formal surrender ceremonies were September 9, 11, and 13, plus
+# September 12 for the regional surrender to Mountbatten in Singapore.
+# These would be the earliest possible times for a change.
+# Regimes horaires pour le monde entier, by Henri Le Corre, (Editions
+# Traditionnelles, 1987, Paris) says that Java and Madura switched
+# from JST to UTC+07:30 on 1945-09-23, and gives 1944-09-01 for Jayapura
+# (Hollandia). For now, assume all Indonesian locations other than Jayapura
+# switched on 1945-09-23.
+#
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Jakarta 7:07:12 - LMT 1867 Aug 10
+# Shanks & Pottenger say the next transition was at 1924 Jan 1 0:13,
+# but this must be a typo.
+ 7:07:12 - JMT 1923 Dec 31 23:47:12 # Jakarta
+ 7:20 - JAVT 1932 Nov # Java Time
+ 7:30 - WIT 1942 Mar 23
+ 9:00 - JST 1945 Sep 23
+ 7:30 - WIT 1948 May
+ 8:00 - WIT 1950 May
+ 7:30 - WIT 1964
+ 7:00 - WIT
+Zone Asia/Pontianak 7:17:20 - LMT 1908 May
+ 7:17:20 - PMT 1932 Nov # Pontianak MT
+ 7:30 - WIT 1942 Jan 29
+ 9:00 - JST 1945 Sep 23
+ 7:30 - WIT 1948 May
+ 8:00 - WIT 1950 May
+ 7:30 - WIT 1964
+ 8:00 - CIT 1988 Jan 1
+ 7:00 - WIT
+Zone Asia/Makassar 7:57:36 - LMT 1920
+ 7:57:36 - MMT 1932 Nov # Macassar MT
+ 8:00 - CIT 1942 Feb 9
+ 9:00 - JST 1945 Sep 23
+ 8:00 - CIT
+Zone Asia/Jayapura 9:22:48 - LMT 1932 Nov
+ 9:00 - EIT 1944 Sep 1
+ 9:30 - CST 1964
+ 9:00 - EIT
+
+# Iran
+
+# From Roozbeh Pournader (2003-03-15):
+# This is an English translation of what I just found (originally in Persian).
+# The Gregorian dates in brackets are mine:
+#
+# Official Newspaper No. 13548-1370/6/25 [1991-09-16]
+# No. 16760/T233 H 1370/6/10 [1991-09-01]
+#
+# The Rule About Change of the Official Time of the Country
+#
+# The Board of Ministers, in the meeting dated 1370/5/23 [1991-08-14],
+# based on the suggestion number 2221/D dated 1370/4/22 [1991-07-13]
+# of the Country's Organization for Official and Employment Affairs,
+# and referring to the law for equating the working hours of workers
+# and officers in the whole country dated 1359/4/23 [1980-07-14], and
+# for synchronizing the official times of the country, agreed that:
+#
+# The official time of the country will should move forward one hour
+# at the 24[:00] hours of the first day of Farvardin and should return
+# to its previous state at the 24[:00] hours of the 30th day of
+# Shahrivar.
+#
+# First Deputy to the President - Hassan Habibi
+#
+# From personal experience, that agrees with what has been followed
+# for at least the last 5 years. Before that, for a few years, the
+# date used was the first Thursday night of Farvardin and the last
+# Thursday night of Shahrivar, but I can't give exact dates....
+# I have also changed the abbreviations to what is considered correct
+# here in Iran, IRST for regular time and IRDT for daylight saving time.
+#
+# From Roozbeh Pournader (2005-04-05):
+# The text of the Iranian law, in effect since 1925, clearly mentions
+# that the true solar year is the measure, and there is no arithmetic
+# leap year calculation involved. There has never been any serious
+# plan to change that law....
+#
+# From Paul Eggert (2006-03-22):
+# Go with Shanks & Pottenger before Sept. 1991, and with Pournader thereafter.
+# I used Ed Reingold's cal-persia in GNU Emacs 21.2 to check Persian dates,
+# stopping after 2037 when 32-bit time_t's overflow.
+# That cal-persia used Birashk's approximation, which disagrees with the solar
+# calendar predictions for the year 2025, so I corrected those dates by hand.
+#
+# From Oscar van Vlijmen (2005-03-30), writing about future
+# discrepancies between cal-persia and the Iranian calendar:
+# For 2091 solar-longitude-after yields 2091-03-20 08:40:07.7 UT for
+# the vernal equinox and that gets so close to 12:00 some local
+# Iranian time that the definition of the correct location needs to be
+# known exactly, amongst other factors. 2157 is even closer:
+# 2157-03-20 08:37:15.5 UT. But the Gregorian year 2025 should give
+# no interpretation problem whatsoever. By the way, another instant
+# in the near future where there will be a discrepancy between
+# arithmetical and astronomical Iranian calendars will be in 2058:
+# vernal equinox on 2058-03-20 09:03:05.9 UT. The Java version of
+# Reingold's/Dershowitz' calculator gives correctly the Gregorian date
+# 2058-03-21 for 1 Farvardin 1437 (astronomical).
+#
+# From Steffen Thorsen (2006-03-22):
+# Several of my users have reported that Iran will not observe DST anymore:
+# http://www.irna.ir/en/news/view/line-17/0603193812164948.htm
+#
+# From Reuters (2007-09-16), with a heads-up from Jesper Norgaard Welen:
+# ... the Guardian Council ... approved a law on Sunday to re-introduce
+# daylight saving time ...
+# http://uk.reuters.com/article/oilRpt/idUKBLA65048420070916
+#
+# From Roozbeh Pournader (2007-11-05):
+# This is quoted from Official Gazette of the Islamic Republic of
+# Iran, Volume 63, Number 18242, dated Tuesday 1386/6/24
+# [2007-10-16]. I am doing the best translation I can:...
+# The official time of the country will be moved forward for one hour
+# on the 24 hours of the first day of the month of Farvardin and will
+# be changed back to its previous state on the 24 hours of the
+# thirtieth day of Shahrivar.
+#
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Iran 1978 1980 - Mar 21 0:00 1:00 D
+Rule Iran 1978 only - Oct 21 0:00 0 S
+Rule Iran 1979 only - Sep 19 0:00 0 S
+Rule Iran 1980 only - Sep 23 0:00 0 S
+Rule Iran 1991 only - May 3 0:00 1:00 D
+Rule Iran 1992 1995 - Mar 22 0:00 1:00 D
+Rule Iran 1991 1995 - Sep 22 0:00 0 S
+Rule Iran 1996 only - Mar 21 0:00 1:00 D
+Rule Iran 1996 only - Sep 21 0:00 0 S
+Rule Iran 1997 1999 - Mar 22 0:00 1:00 D
+Rule Iran 1997 1999 - Sep 22 0:00 0 S
+Rule Iran 2000 only - Mar 21 0:00 1:00 D
+Rule Iran 2000 only - Sep 21 0:00 0 S
+Rule Iran 2001 2003 - Mar 22 0:00 1:00 D
+Rule Iran 2001 2003 - Sep 22 0:00 0 S
+Rule Iran 2004 only - Mar 21 0:00 1:00 D
+Rule Iran 2004 only - Sep 21 0:00 0 S
+Rule Iran 2005 only - Mar 22 0:00 1:00 D
+Rule Iran 2005 only - Sep 22 0:00 0 S
+Rule Iran 2008 only - Mar 21 0:00 1:00 D
+Rule Iran 2008 only - Sep 21 0:00 0 S
+Rule Iran 2009 2011 - Mar 22 0:00 1:00 D
+Rule Iran 2009 2011 - Sep 22 0:00 0 S
+Rule Iran 2012 only - Mar 21 0:00 1:00 D
+Rule Iran 2012 only - Sep 21 0:00 0 S
+Rule Iran 2013 2015 - Mar 22 0:00 1:00 D
+Rule Iran 2013 2015 - Sep 22 0:00 0 S
+Rule Iran 2016 only - Mar 21 0:00 1:00 D
+Rule Iran 2016 only - Sep 21 0:00 0 S
+Rule Iran 2017 2019 - Mar 22 0:00 1:00 D
+Rule Iran 2017 2019 - Sep 22 0:00 0 S
+Rule Iran 2020 only - Mar 21 0:00 1:00 D
+Rule Iran 2020 only - Sep 21 0:00 0 S
+Rule Iran 2021 2023 - Mar 22 0:00 1:00 D
+Rule Iran 2021 2023 - Sep 22 0:00 0 S
+Rule Iran 2024 only - Mar 21 0:00 1:00 D
+Rule Iran 2024 only - Sep 21 0:00 0 S
+Rule Iran 2025 2027 - Mar 22 0:00 1:00 D
+Rule Iran 2025 2027 - Sep 22 0:00 0 S
+Rule Iran 2028 2029 - Mar 21 0:00 1:00 D
+Rule Iran 2028 2029 - Sep 21 0:00 0 S
+Rule Iran 2030 2031 - Mar 22 0:00 1:00 D
+Rule Iran 2030 2031 - Sep 22 0:00 0 S
+Rule Iran 2032 2033 - Mar 21 0:00 1:00 D
+Rule Iran 2032 2033 - Sep 21 0:00 0 S
+Rule Iran 2034 2035 - Mar 22 0:00 1:00 D
+Rule Iran 2034 2035 - Sep 22 0:00 0 S
+Rule Iran 2036 2037 - Mar 21 0:00 1:00 D
+Rule Iran 2036 2037 - Sep 21 0:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Tehran 3:25:44 - LMT 1916
+ 3:25:44 - TMT 1946 # Tehran Mean Time
+ 3:30 - IRST 1977 Nov
+ 4:00 Iran IR%sT 1979
+ 3:30 Iran IR%sT
+
+
+# Iraq
+#
+# From Jonathan Lennox (2000-06-12):
+# An article in this week's Economist ("Inside the Saddam-free zone", p. 50 in
+# the U.S. edition) on the Iraqi Kurds contains a paragraph:
+# "The three northern provinces ... switched their clocks this spring and
+# are an hour ahead of Baghdad."
+#
+# But Rives McDow (2000-06-18) quotes a contact in Iraqi-Kurdistan as follows:
+# In the past, some Kurdish nationalists, as a protest to the Iraqi
+# Government, did not adhere to daylight saving time. They referred
+# to daylight saving as Saddam time. But, as of today, the time zone
+# in Iraqi-Kurdistan is on standard time with Baghdad, Iraq.
+#
+# So we'll ignore the Economist's claim.
+
+# From Steffen Thorsen (2008-03-10):
+# The cabinet in Iraq abolished DST last week, according to the following
+# news sources (in Arabic):
+# <a href="http://www.aljeeran.net/wesima_articles/news-20080305-98602.html">
+# http://www.aljeeran.net/wesima_articles/news-20080305-98602.html
+# </a>
+# <a href="http://www.aswataliraq.info/look/article.tpl?id=2047&IdLanguage=17&IdPublication=4&NrArticle=71743&NrIssue=1&NrSection=10">
+# http://www.aswataliraq.info/look/article.tpl?id=2047&IdLanguage=17&IdPublication=4&NrArticle=71743&NrIssue=1&NrSection=10
+# </a>
+#
+# We have published a short article in English about the change:
+# <a href="http://www.timeanddate.com/news/time/iraq-dumps-daylight-saving.html">
+# http://www.timeanddate.com/news/time/iraq-dumps-daylight-saving.html
+# </a>
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Iraq 1982 only - May 1 0:00 1:00 D
+Rule Iraq 1982 1984 - Oct 1 0:00 0 S
+Rule Iraq 1983 only - Mar 31 0:00 1:00 D
+Rule Iraq 1984 1985 - Apr 1 0:00 1:00 D
+Rule Iraq 1985 1990 - Sep lastSun 1:00s 0 S
+Rule Iraq 1986 1990 - Mar lastSun 1:00s 1:00 D
+# IATA SSIM (1991/1996) says Apr 1 12:01am UTC; guess the `:01' is a typo.
+# Shanks & Pottenger say Iraq did not observe DST 1992/1997; ignore this.
+#
+Rule Iraq 1991 2007 - Apr 1 3:00s 1:00 D
+Rule Iraq 1991 2007 - Oct 1 3:00s 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Baghdad 2:57:40 - LMT 1890
+ 2:57:36 - BMT 1918 # Baghdad Mean Time?
+ 3:00 - AST 1982 May
+ 3:00 Iraq A%sT
+
+
+###############################################################################
+
+# Israel
+
+# From Ephraim Silverberg (2001-01-11):
+#
+# I coined "IST/IDT" circa 1988. Until then there were three
+# different abbreviations in use:
+#
+# JST Jerusalem Standard Time [Danny Braniss, Hebrew University]
+# IZT Israel Zonal (sic) Time [Prof. Haim Papo, Technion]
+# EEST Eastern Europe Standard Time [used by almost everyone else]
+#
+# Since timezones should be called by country and not capital cities,
+# I ruled out JST. As Israel is in Asia Minor and not Eastern Europe,
+# EEST was equally unacceptable. Since "zonal" was not compatible with
+# any other timezone abbreviation, I felt that 'IST' was the way to go
+# and, indeed, it has received almost universal acceptance in timezone
+# settings in Israeli computers.
+#
+# In any case, I am happy to share timezone abbreviations with India,
+# high on my favorite-country list (and not only because my wife's
+# family is from India).
+
+# From Shanks & Pottenger:
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Zion 1940 only - Jun 1 0:00 1:00 D
+Rule Zion 1942 1944 - Nov 1 0:00 0 S
+Rule Zion 1943 only - Apr 1 2:00 1:00 D
+Rule Zion 1944 only - Apr 1 0:00 1:00 D
+Rule Zion 1945 only - Apr 16 0:00 1:00 D
+Rule Zion 1945 only - Nov 1 2:00 0 S
+Rule Zion 1946 only - Apr 16 2:00 1:00 D
+Rule Zion 1946 only - Nov 1 0:00 0 S
+Rule Zion 1948 only - May 23 0:00 2:00 DD
+Rule Zion 1948 only - Sep 1 0:00 1:00 D
+Rule Zion 1948 1949 - Nov 1 2:00 0 S
+Rule Zion 1949 only - May 1 0:00 1:00 D
+Rule Zion 1950 only - Apr 16 0:00 1:00 D
+Rule Zion 1950 only - Sep 15 3:00 0 S
+Rule Zion 1951 only - Apr 1 0:00 1:00 D
+Rule Zion 1951 only - Nov 11 3:00 0 S
+Rule Zion 1952 only - Apr 20 2:00 1:00 D
+Rule Zion 1952 only - Oct 19 3:00 0 S
+Rule Zion 1953 only - Apr 12 2:00 1:00 D
+Rule Zion 1953 only - Sep 13 3:00 0 S
+Rule Zion 1954 only - Jun 13 0:00 1:00 D
+Rule Zion 1954 only - Sep 12 0:00 0 S
+Rule Zion 1955 only - Jun 11 2:00 1:00 D
+Rule Zion 1955 only - Sep 11 0:00 0 S
+Rule Zion 1956 only - Jun 3 0:00 1:00 D
+Rule Zion 1956 only - Sep 30 3:00 0 S
+Rule Zion 1957 only - Apr 29 2:00 1:00 D
+Rule Zion 1957 only - Sep 22 0:00 0 S
+Rule Zion 1974 only - Jul 7 0:00 1:00 D
+Rule Zion 1974 only - Oct 13 0:00 0 S
+Rule Zion 1975 only - Apr 20 0:00 1:00 D
+Rule Zion 1975 only - Aug 31 0:00 0 S
+Rule Zion 1985 only - Apr 14 0:00 1:00 D
+Rule Zion 1985 only - Sep 15 0:00 0 S
+Rule Zion 1986 only - May 18 0:00 1:00 D
+Rule Zion 1986 only - Sep 7 0:00 0 S
+Rule Zion 1987 only - Apr 15 0:00 1:00 D
+Rule Zion 1987 only - Sep 13 0:00 0 S
+Rule Zion 1988 only - Apr 9 0:00 1:00 D
+Rule Zion 1988 only - Sep 3 0:00 0 S
+
+# From Ephraim Silverberg
+# (1997-03-04, 1998-03-16, 1998-12-28, 2000-01-17, 2000-07-25, 2004-12-22,
+# and 2005-02-17):
+
+# According to the Office of the Secretary General of the Ministry of
+# Interior, there is NO set rule for Daylight-Savings/Standard time changes.
+# One thing is entrenched in law, however: that there must be at least 150
+# days of daylight savings time annually. From 1993-1998, the change to
+# daylight savings time was on a Friday morning from midnight IST to
+# 1 a.m IDT; up until 1998, the change back to standard time was on a
+# Saturday night from midnight daylight savings time to 11 p.m. standard
+# time. 1996 is an exception to this rule where the change back to standard
+# time took place on Sunday night instead of Saturday night to avoid
+# conflicts with the Jewish New Year. In 1999, the change to
+# daylight savings time was still on a Friday morning but from
+# 2 a.m. IST to 3 a.m. IDT; furthermore, the change back to standard time
+# was also on a Friday morning from 2 a.m. IDT to 1 a.m. IST for
+# 1999 only. In the year 2000, the change to daylight savings time was
+# similar to 1999, but although the change back will be on a Friday, it
+# will take place from 1 a.m. IDT to midnight IST. Starting in 2001, all
+# changes to/from will take place at 1 a.m. old time, but now there is no
+# rule as to what day of the week it will take place in as the start date
+# (except in 2003) is the night after the Passover Seder (i.e. the eve
+# of the 16th of Nisan in the lunar Hebrew calendar) and the end date
+# (except in 2002) is three nights before Yom Kippur [Day of Atonement]
+# (the eve of the 7th of Tishrei in the lunar Hebrew calendar).
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Zion 1989 only - Apr 30 0:00 1:00 D
+Rule Zion 1989 only - Sep 3 0:00 0 S
+Rule Zion 1990 only - Mar 25 0:00 1:00 D
+Rule Zion 1990 only - Aug 26 0:00 0 S
+Rule Zion 1991 only - Mar 24 0:00 1:00 D
+Rule Zion 1991 only - Sep 1 0:00 0 S
+Rule Zion 1992 only - Mar 29 0:00 1:00 D
+Rule Zion 1992 only - Sep 6 0:00 0 S
+Rule Zion 1993 only - Apr 2 0:00 1:00 D
+Rule Zion 1993 only - Sep 5 0:00 0 S
+
+# The dates for 1994-1995 were obtained from Office of the Spokeswoman for the
+# Ministry of Interior, Jerusalem, Israel. The spokeswoman can be reached by
+# calling the office directly at 972-2-6701447 or 972-2-6701448.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Zion 1994 only - Apr 1 0:00 1:00 D
+Rule Zion 1994 only - Aug 28 0:00 0 S
+Rule Zion 1995 only - Mar 31 0:00 1:00 D
+Rule Zion 1995 only - Sep 3 0:00 0 S
+
+# The dates for 1996 were determined by the Minister of Interior of the
+# time, Haim Ramon. The official announcement regarding 1996-1998
+# (with the dates for 1997-1998 no longer being relevant) can be viewed at:
+#
+# ftp://ftp.cs.huji.ac.il/pub/tz/announcements/1996-1998.ramon.ps.gz
+#
+# The dates for 1997-1998 were altered by his successor, Rabbi Eli Suissa.
+#
+# The official announcements for the years 1997-1999 can be viewed at:
+#
+# ftp://ftp.cs.huji.ac.il/pub/tz/announcements/YYYY.ps.gz
+#
+# where YYYY is the relevant year.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Zion 1996 only - Mar 15 0:00 1:00 D
+Rule Zion 1996 only - Sep 16 0:00 0 S
+Rule Zion 1997 only - Mar 21 0:00 1:00 D
+Rule Zion 1997 only - Sep 14 0:00 0 S
+Rule Zion 1998 only - Mar 20 0:00 1:00 D
+Rule Zion 1998 only - Sep 6 0:00 0 S
+Rule Zion 1999 only - Apr 2 2:00 1:00 D
+Rule Zion 1999 only - Sep 3 2:00 0 S
+
+# The Knesset Interior Committee has changed the dates for 2000 for
+# the third time in just over a year and have set new dates for the
+# years 2001-2004 as well.
+#
+# The official announcement for the start date of 2000 can be viewed at:
+#
+# ftp://ftp.cs.huji.ac.il/pub/tz/announcements/2000-start.ps.gz
+#
+# The official announcement for the end date of 2000 and the dates
+# for the years 2001-2004 can be viewed at:
+#
+# ftp://ftp.cs.huji.ac.il/pub/tz/announcements/2000-2004.ps.gz
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Zion 2000 only - Apr 14 2:00 1:00 D
+Rule Zion 2000 only - Oct 6 1:00 0 S
+Rule Zion 2001 only - Apr 9 1:00 1:00 D
+Rule Zion 2001 only - Sep 24 1:00 0 S
+Rule Zion 2002 only - Mar 29 1:00 1:00 D
+Rule Zion 2002 only - Oct 7 1:00 0 S
+Rule Zion 2003 only - Mar 28 1:00 1:00 D
+Rule Zion 2003 only - Oct 3 1:00 0 S
+Rule Zion 2004 only - Apr 7 1:00 1:00 D
+Rule Zion 2004 only - Sep 22 1:00 0 S
+
+# The proposed law agreed upon by the Knesset Interior Committee on
+# 2005-02-14 is that, for 2005 and beyond, DST starts at 02:00 the
+# last Friday before April 2nd (i.e. the last Friday in March or April
+# 1st itself if it falls on a Friday) and ends at 02:00 on the Saturday
+# night _before_ the fast of Yom Kippur.
+#
+# Those who can read Hebrew can view the announcement at:
+#
+# ftp://ftp.cs.huji.ac.il/pub/tz/announcements/2005+beyond.ps
+
+# From Paul Eggert (2005-02-22):
+# I used Ephraim Silverberg's dst-israel.el program
+# <ftp://ftp.cs.huji.ac.il/pub/tz/software/dst-israel.el> (2005-02-20)
+# along with Ed Reingold's cal-hebrew in GNU Emacs 21.4,
+# to generate the transitions in this list.
+# (I replaced "lastFri" with "Fri>=26" by hand.)
+# The spring transitions below all correspond to the following Rule:
+#
+# Rule Zion 2005 max - Mar Fri>=26 2:00 1:00 D
+#
+# but older zic implementations (e.g., Solaris 8) do not support
+# "Fri>=26" to mean April 1 in years like 2005, so for now we list the
+# springtime transitions explicitly.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Zion 2005 only - Apr 1 2:00 1:00 D
+Rule Zion 2005 only - Oct 9 2:00 0 S
+Rule Zion 2006 2010 - Mar Fri>=26 2:00 1:00 D
+Rule Zion 2006 only - Oct 1 2:00 0 S
+Rule Zion 2007 only - Sep 16 2:00 0 S
+Rule Zion 2008 only - Oct 5 2:00 0 S
+Rule Zion 2009 only - Sep 27 2:00 0 S
+Rule Zion 2010 only - Sep 12 2:00 0 S
+Rule Zion 2011 only - Apr 1 2:00 1:00 D
+Rule Zion 2011 only - Oct 2 2:00 0 S
+Rule Zion 2012 2015 - Mar Fri>=26 2:00 1:00 D
+Rule Zion 2012 only - Sep 23 2:00 0 S
+Rule Zion 2013 only - Sep 8 2:00 0 S
+Rule Zion 2014 only - Sep 28 2:00 0 S
+Rule Zion 2015 only - Sep 20 2:00 0 S
+Rule Zion 2016 only - Apr 1 2:00 1:00 D
+Rule Zion 2016 only - Oct 9 2:00 0 S
+Rule Zion 2017 2021 - Mar Fri>=26 2:00 1:00 D
+Rule Zion 2017 only - Sep 24 2:00 0 S
+Rule Zion 2018 only - Sep 16 2:00 0 S
+Rule Zion 2019 only - Oct 6 2:00 0 S
+Rule Zion 2020 only - Sep 27 2:00 0 S
+Rule Zion 2021 only - Sep 12 2:00 0 S
+Rule Zion 2022 only - Apr 1 2:00 1:00 D
+Rule Zion 2022 only - Oct 2 2:00 0 S
+Rule Zion 2023 2032 - Mar Fri>=26 2:00 1:00 D
+Rule Zion 2023 only - Sep 24 2:00 0 S
+Rule Zion 2024 only - Oct 6 2:00 0 S
+Rule Zion 2025 only - Sep 28 2:00 0 S
+Rule Zion 2026 only - Sep 20 2:00 0 S
+Rule Zion 2027 only - Oct 10 2:00 0 S
+Rule Zion 2028 only - Sep 24 2:00 0 S
+Rule Zion 2029 only - Sep 16 2:00 0 S
+Rule Zion 2030 only - Oct 6 2:00 0 S
+Rule Zion 2031 only - Sep 21 2:00 0 S
+Rule Zion 2032 only - Sep 12 2:00 0 S
+Rule Zion 2033 only - Apr 1 2:00 1:00 D
+Rule Zion 2033 only - Oct 2 2:00 0 S
+Rule Zion 2034 2037 - Mar Fri>=26 2:00 1:00 D
+Rule Zion 2034 only - Sep 17 2:00 0 S
+Rule Zion 2035 only - Oct 7 2:00 0 S
+Rule Zion 2036 only - Sep 28 2:00 0 S
+Rule Zion 2037 only - Sep 13 2:00 0 S
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Jerusalem 2:20:56 - LMT 1880
+ 2:20:40 - JMT 1918 # Jerusalem Mean Time?
+ 2:00 Zion I%sT
+
+
+
+###############################################################################
+
+# Japan
+
+# `9:00' and `JST' is from Guy Harris.
+
+# From Paul Eggert (1995-03-06):
+# Today's _Asahi Evening News_ (page 4) reports that Japan had
+# daylight saving between 1948 and 1951, but ``the system was discontinued
+# because the public believed it would lead to longer working hours.''
+
+# From Mayumi Negishi in the 2005-08-10 Japan Times
+# <http://www.japantimes.co.jp/cgi-bin/getarticle.pl5?nn20050810f2.htm>:
+# Occupation authorities imposed daylight-saving time on Japan on
+# [1948-05-01].... But lack of prior debate and the execution of
+# daylight-saving time just three days after the bill was passed generated
+# deep hatred of the concept.... The Diet unceremoniously passed a bill to
+# dump the unpopular system in October 1951, less than a month after the San
+# Francisco Peace Treaty was signed. (A government poll in 1951 showed 53%
+# of the Japanese wanted to scrap daylight-saving time, as opposed to 30% who
+# wanted to keep it.)
+
+# From Paul Eggert (2006-03-22):
+# Shanks & Pottenger write that DST in Japan during those years was as follows:
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Japan 1948 only - May Sun>=1 2:00 1:00 D
+Rule Japan 1948 1951 - Sep Sat>=8 2:00 0 S
+Rule Japan 1949 only - Apr Sun>=1 2:00 1:00 D
+Rule Japan 1950 1951 - May Sun>=1 2:00 1:00 D
+# but the only locations using it (for birth certificates, presumably, since
+# their audience is astrologers) were US military bases. For now, assume
+# that for most purposes daylight-saving time was observed; otherwise, what
+# would have been the point of the 1951 poll?
+
+# From Hideyuki Suzuki (1998-11-09):
+# 'Tokyo' usually stands for the former location of Tokyo Astronomical
+# Observatory: E 139 44' 40".90 (9h 18m 58s.727), N 35 39' 16".0.
+# This data is from 'Rika Nenpyou (Chronological Scientific Tables) 1996'
+# edited by National Astronomical Observatory of Japan....
+# JST (Japan Standard Time) has been used since 1888-01-01 00:00 (JST).
+# The law is enacted on 1886-07-07.
+
+# From Hideyuki Suzuki (1998-11-16):
+# The ordinance No. 51 (1886) established "standard time" in Japan,
+# which stands for the time on E 135 degree.
+# In the ordinance No. 167 (1895), "standard time" was renamed to "central
+# standard time". And the same ordinance also established "western standard
+# time", which stands for the time on E 120 degree.... But "western standard
+# time" was abolished in the ordinance No. 529 (1937). In the ordinance No.
+# 167, there is no mention regarding for what place western standard time is
+# standard....
+#
+# I wrote "ordinance" above, but I don't know how to translate.
+# In Japanese it's "chokurei", which means ordinance from emperor.
+
+# Shanks & Pottenger claim JST in use since 1896, and that a few
+# places (e.g. Ishigaki) use +0800; go with Suzuki. Guess that all
+# ordinances took effect on Jan 1.
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Tokyo 9:18:59 - LMT 1887 Dec 31 15:00u
+ 9:00 - JST 1896
+ 9:00 - CJT 1938
+ 9:00 Japan J%sT
+# Since 1938, all Japanese possessions have been like Asia/Tokyo.
+
+# Jordan
+#
+# From <a href="http://star.arabia.com/990701/JO9.html">
+# Jordan Week (1999-07-01) </a> via Steffen Thorsen (1999-09-09):
+# Clocks in Jordan were forwarded one hour on Wednesday at midnight,
+# in accordance with the government's decision to implement summer time
+# all year round.
+#
+# From <a href="http://star.arabia.com/990930/JO9.html">
+# Jordan Week (1999-09-30) </a> via Steffen Thorsen (1999-11-09):
+# Winter time starts today Thursday, 30 September. Clocks will be turned back
+# by one hour. This is the latest government decision and it's final!
+# The decision was taken because of the increase in working hours in
+# government's departments from six to seven hours.
+#
+# From Paul Eggert (2005-11-22):
+# Starting 2003 transitions are from Steffen Thorsen's web site timeanddate.com.
+#
+# From Steffen Thorsen (2005-11-23):
+# For Jordan I have received multiple independent user reports every year
+# about DST end dates, as the end-rule is different every year.
+#
+# From Steffen Thorsen (2006-10-01), after a heads-up from Hilal Malawi:
+# http://www.petranews.gov.jo/nepras/2006/Sep/05/4000.htm
+# "Jordan will switch to winter time on Friday, October 27".
+#
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Jordan 1973 only - Jun 6 0:00 1:00 S
+Rule Jordan 1973 1975 - Oct 1 0:00 0 -
+Rule Jordan 1974 1977 - May 1 0:00 1:00 S
+Rule Jordan 1976 only - Nov 1 0:00 0 -
+Rule Jordan 1977 only - Oct 1 0:00 0 -
+Rule Jordan 1978 only - Apr 30 0:00 1:00 S
+Rule Jordan 1978 only - Sep 30 0:00 0 -
+Rule Jordan 1985 only - Apr 1 0:00 1:00 S
+Rule Jordan 1985 only - Oct 1 0:00 0 -
+Rule Jordan 1986 1988 - Apr Fri>=1 0:00 1:00 S
+Rule Jordan 1986 1990 - Oct Fri>=1 0:00 0 -
+Rule Jordan 1989 only - May 8 0:00 1:00 S
+Rule Jordan 1990 only - Apr 27 0:00 1:00 S
+Rule Jordan 1991 only - Apr 17 0:00 1:00 S
+Rule Jordan 1991 only - Sep 27 0:00 0 -
+Rule Jordan 1992 only - Apr 10 0:00 1:00 S
+Rule Jordan 1992 1993 - Oct Fri>=1 0:00 0 -
+Rule Jordan 1993 1998 - Apr Fri>=1 0:00 1:00 S
+Rule Jordan 1994 only - Sep Fri>=15 0:00 0 -
+Rule Jordan 1995 1998 - Sep Fri>=15 0:00s 0 -
+Rule Jordan 1999 only - Jul 1 0:00s 1:00 S
+Rule Jordan 1999 2002 - Sep lastThu 0:00s 0 -
+Rule Jordan 2000 max - Mar lastThu 0:00s 1:00 S
+Rule Jordan 2003 only - Oct 24 0:00s 0 -
+Rule Jordan 2004 only - Oct 15 0:00s 0 -
+Rule Jordan 2005 only - Sep lastFri 0:00s 0 -
+Rule Jordan 2006 max - Oct lastFri 0:00s 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Amman 2:23:44 - LMT 1931
+ 2:00 Jordan EE%sT
+
+
+# Kazakhstan
+
+# From Paul Eggert (1996-11-22):
+# Andrew Evtichov (1996-04-13) writes that Kazakhstan
+# stayed in sync with Moscow after 1990, and that Aqtobe (formerly Aktyubinsk)
+# and Aqtau (formerly Shevchenko) are the largest cities in their zones.
+# Guess that Aqtau and Aqtobe diverged in 1995, since that's the first time
+# IATA SSIM mentions a third time zone in Kazakhstan.
+
+# From Paul Eggert (2006-03-22):
+# German Iofis, ELSI, Almaty (2001-10-09) reports that Kazakhstan uses
+# RussiaAsia rules, instead of switching at 00:00 as the IATA has it.
+# Go with Shanks & Pottenger, who have them always using RussiaAsia rules.
+# Also go with the following claims of Shanks & Pottenger:
+#
+# - Kazakhstan did not observe DST in 1991.
+# - Qyzylorda switched from +5:00 to +6:00 on 1992-01-19 02:00.
+# - Oral switched from +5:00 to +4:00 in spring 1989.
+
+# <a href="http://www.kazsociety.org.uk/news/2005/03/30.htm">
+# From Kazakhstan Embassy's News Bulletin #11 (2005-03-21):
+# </a>
+# The Government of Kazakhstan passed a resolution March 15 abolishing
+# daylight saving time citing lack of economic benefits and health
+# complications coupled with a decrease in productivity.
+#
+# From Branislav Kojic (in Astana) via Gwillim Law (2005-06-28):
+# ... what happened was that the former Kazakhstan Eastern time zone
+# was "blended" with the Central zone. Therefore, Kazakhstan now has
+# two time zones, and difference between them is one hour. The zone
+# closer to UTC is the former Western zone (probably still called the
+# same), encompassing four provinces in the west: Aqtobe, Atyrau,
+# Mangghystau, and West Kazakhstan. The other zone encompasses
+# everything else.... I guess that would make Kazakhstan time zones
+# de jure UTC+5 and UTC+6 respectively.
+
+#
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+#
+# Almaty (formerly Alma-Ata), representing most locations in Kazakhstan
+Zone Asia/Almaty 5:07:48 - LMT 1924 May 2 # or Alma-Ata
+ 5:00 - ALMT 1930 Jun 21 # Alma-Ata Time
+ 6:00 RussiaAsia ALM%sT 1991
+ 6:00 - ALMT 1992
+ 6:00 RussiaAsia ALM%sT 2005 Mar 15
+ 6:00 - ALMT
+# Qyzylorda (aka Kyzylorda, Kizilorda, Kzyl-Orda, etc.)
+Zone Asia/Qyzylorda 4:21:52 - LMT 1924 May 2
+ 4:00 - KIZT 1930 Jun 21 # Kizilorda Time
+ 5:00 - KIZT 1981 Apr 1
+ 5:00 1:00 KIZST 1981 Oct 1
+ 6:00 - KIZT 1982 Apr 1
+ 5:00 RussiaAsia KIZ%sT 1991
+ 5:00 - KIZT 1991 Dec 16 # independence
+ 5:00 - QYZT 1992 Jan 19 2:00
+ 6:00 RussiaAsia QYZ%sT 2005 Mar 15
+ 6:00 - QYZT
+# Aqtobe (aka Aktobe, formerly Akt'ubinsk)
+Zone Asia/Aqtobe 3:48:40 - LMT 1924 May 2
+ 4:00 - AKTT 1930 Jun 21 # Aktyubinsk Time
+ 5:00 - AKTT 1981 Apr 1
+ 5:00 1:00 AKTST 1981 Oct 1
+ 6:00 - AKTT 1982 Apr 1
+ 5:00 RussiaAsia AKT%sT 1991
+ 5:00 - AKTT 1991 Dec 16 # independence
+ 5:00 RussiaAsia AQT%sT 2005 Mar 15 # Aqtobe Time
+ 5:00 - AQTT
+# Mangghystau
+# Aqtau was not founded until 1963, but it represents an inhabited region,
+# so include time stamps before 1963.
+Zone Asia/Aqtau 3:21:04 - LMT 1924 May 2
+ 4:00 - FORT 1930 Jun 21 # Fort Shevchenko T
+ 5:00 - FORT 1963
+ 5:00 - SHET 1981 Oct 1 # Shevchenko Time
+ 6:00 - SHET 1982 Apr 1
+ 5:00 RussiaAsia SHE%sT 1991
+ 5:00 - SHET 1991 Dec 16 # independence
+ 5:00 RussiaAsia AQT%sT 1995 Mar lastSun 2:00 # Aqtau Time
+ 4:00 RussiaAsia AQT%sT 2005 Mar 15
+ 5:00 - AQTT
+# West Kazakhstan
+Zone Asia/Oral 3:25:24 - LMT 1924 May 2 # or Ural'sk
+ 4:00 - URAT 1930 Jun 21 # Ural'sk time
+ 5:00 - URAT 1981 Apr 1
+ 5:00 1:00 URAST 1981 Oct 1
+ 6:00 - URAT 1982 Apr 1
+ 5:00 RussiaAsia URA%sT 1989 Mar 26 2:00
+ 4:00 RussiaAsia URA%sT 1991
+ 4:00 - URAT 1991 Dec 16 # independence
+ 4:00 RussiaAsia ORA%sT 2005 Mar 15 # Oral Time
+ 5:00 - ORAT
+
+# Kyrgyzstan (Kirgizstan)
+# Transitions through 1991 are from Shanks & Pottenger.
+
+# From Paul Eggert (2005-08-15):
+# According to an article dated today in the Kyrgyzstan Development Gateway
+# <http://eng.gateway.kg/cgi-bin/page.pl?id=1&story_name=doc9979.shtml>
+# Kyrgyzstan is canceling the daylight saving time system. I take the article
+# to mean that they will leave their clocks at 6 hours ahead of UTC.
+# From Malik Abdugaliev (2005-09-21):
+# Our government cancels daylight saving time 6th of August 2005.
+# From 2005-08-12 our GMT-offset is +6, w/o any daylight saving.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Kyrgyz 1992 1996 - Apr Sun>=7 0:00s 1:00 S
+Rule Kyrgyz 1992 1996 - Sep lastSun 0:00 0 -
+Rule Kyrgyz 1997 2005 - Mar lastSun 2:30 1:00 S
+Rule Kyrgyz 1997 2004 - Oct lastSun 2:30 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Bishkek 4:58:24 - LMT 1924 May 2
+ 5:00 - FRUT 1930 Jun 21 # Frunze Time
+ 6:00 RussiaAsia FRU%sT 1991 Mar 31 2:00s
+ 5:00 1:00 FRUST 1991 Aug 31 2:00 # independence
+ 5:00 Kyrgyz KG%sT 2005 Aug 12 # Kyrgyzstan Time
+ 6:00 - KGT
+
+###############################################################################
+
+# Korea (North and South)
+
+# From Annie I. Bang (2006-07-10) in
+# <http://www.koreaherald.co.kr/SITE/data/html_dir/2006/07/10/200607100012.asp>:
+# The Ministry of Commerce, Industry and Energy has already
+# commissioned a research project [to reintroduce DST] and has said
+# the system may begin as early as 2008.... Korea ran a daylight
+# saving program from 1949-61 but stopped it during the 1950-53 Korean War.
+
+# From Shanks & Pottenger:
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule ROK 1960 only - May 15 0:00 1:00 D
+Rule ROK 1960 only - Sep 13 0:00 0 S
+Rule ROK 1987 1988 - May Sun>=8 0:00 1:00 D
+Rule ROK 1987 1988 - Oct Sun>=8 0:00 0 S
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Seoul 8:27:52 - LMT 1890
+ 8:30 - KST 1904 Dec
+ 9:00 - KST 1928
+ 8:30 - KST 1932
+ 9:00 - KST 1954 Mar 21
+ 8:00 ROK K%sT 1961 Aug 10
+ 8:30 - KST 1968 Oct
+ 9:00 ROK K%sT
+Zone Asia/Pyongyang 8:23:00 - LMT 1890
+ 8:30 - KST 1904 Dec
+ 9:00 - KST 1928
+ 8:30 - KST 1932
+ 9:00 - KST 1954 Mar 21
+ 8:00 - KST 1961 Aug 10
+ 9:00 - KST
+
+###############################################################################
+
+# Kuwait
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+# From the Arab Times (2007-03-14):
+# The Civil Service Commission (CSC) has approved a proposal forwarded
+# by MP Ahmad Baqer on implementing the daylight saving time (DST) in
+# Kuwait starting from April until the end of Sept this year, reports Al-Anba.
+# <http://www.arabtimesonline.com/arabtimes/kuwait/Viewdet.asp?ID=9950>.
+# From Paul Eggert (2007-03-29):
+# We don't know the details, or whether the approval means it'll happen,
+# so for now we assume no DST.
+Zone Asia/Kuwait 3:11:56 - LMT 1950
+ 3:00 - AST
+
+# Laos
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Vientiane 6:50:24 - LMT 1906 Jun 9 # or Viangchan
+ 7:06:20 - SMT 1911 Mar 11 0:01 # Saigon MT?
+ 7:00 - ICT 1912 May
+ 8:00 - ICT 1931 May
+ 7:00 - ICT
+
+# Lebanon
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Lebanon 1920 only - Mar 28 0:00 1:00 S
+Rule Lebanon 1920 only - Oct 25 0:00 0 -
+Rule Lebanon 1921 only - Apr 3 0:00 1:00 S
+Rule Lebanon 1921 only - Oct 3 0:00 0 -
+Rule Lebanon 1922 only - Mar 26 0:00 1:00 S
+Rule Lebanon 1922 only - Oct 8 0:00 0 -
+Rule Lebanon 1923 only - Apr 22 0:00 1:00 S
+Rule Lebanon 1923 only - Sep 16 0:00 0 -
+Rule Lebanon 1957 1961 - May 1 0:00 1:00 S
+Rule Lebanon 1957 1961 - Oct 1 0:00 0 -
+Rule Lebanon 1972 only - Jun 22 0:00 1:00 S
+Rule Lebanon 1972 1977 - Oct 1 0:00 0 -
+Rule Lebanon 1973 1977 - May 1 0:00 1:00 S
+Rule Lebanon 1978 only - Apr 30 0:00 1:00 S
+Rule Lebanon 1978 only - Sep 30 0:00 0 -
+Rule Lebanon 1984 1987 - May 1 0:00 1:00 S
+Rule Lebanon 1984 1991 - Oct 16 0:00 0 -
+Rule Lebanon 1988 only - Jun 1 0:00 1:00 S
+Rule Lebanon 1989 only - May 10 0:00 1:00 S
+Rule Lebanon 1990 1992 - May 1 0:00 1:00 S
+Rule Lebanon 1992 only - Oct 4 0:00 0 -
+Rule Lebanon 1993 max - Mar lastSun 0:00 1:00 S
+Rule Lebanon 1993 1998 - Sep lastSun 0:00 0 -
+Rule Lebanon 1999 max - Oct lastSun 0:00 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Beirut 2:22:00 - LMT 1880
+ 2:00 Lebanon EE%sT
+
+# Malaysia
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule NBorneo 1935 1941 - Sep 14 0:00 0:20 TS # one-Third Summer
+Rule NBorneo 1935 1941 - Dec 14 0:00 0 -
+#
+# peninsular Malaysia
+# The data here are taken from Mok Ly Yng (2003-10-30)
+# <http://www.math.nus.edu.sg/aslaksen/teaching/timezone.html>.
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Kuala_Lumpur 6:46:46 - LMT 1901 Jan 1
+ 6:55:25 - SMT 1905 Jun 1 # Singapore M.T.
+ 7:00 - MALT 1933 Jan 1 # Malaya Time
+ 7:00 0:20 MALST 1936 Jan 1
+ 7:20 - MALT 1941 Sep 1
+ 7:30 - MALT 1942 Feb 16
+ 9:00 - JST 1945 Sep 12
+ 7:30 - MALT 1982 Jan 1
+ 8:00 - MYT # Malaysia Time
+# Sabah & Sarawak
+# From Paul Eggert (2006-03-22):
+# The data here are mostly from Shanks & Pottenger, but the 1942, 1945 and 1982
+# transition dates are from Mok Ly Yng.
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Kuching 7:21:20 - LMT 1926 Mar
+ 7:30 - BORT 1933 # Borneo Time
+ 8:00 NBorneo BOR%sT 1942 Feb 16
+ 9:00 - JST 1945 Sep 12
+ 8:00 - BORT 1982 Jan 1
+ 8:00 - MYT
+
+# Maldives
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Indian/Maldives 4:54:00 - LMT 1880 # Male
+ 4:54:00 - MMT 1960 # Male Mean Time
+ 5:00 - MVT # Maldives Time
+
+# Mongolia
+
+# Shanks & Pottenger say that Mongolia has three time zones, but
+# usno1995 and the CIA map Standard Time Zones of the World (2005-03)
+# both say that it has just one.
+
+# From Oscar van Vlijmen (1999-12-11):
+# <a href="http://www.mongoliatourism.gov.mn/general.htm">
+# General Information Mongolia
+# </a> (1999-09)
+# "Time: Mongolia has two time zones. Three westernmost provinces of
+# Bayan-Ulgii, Uvs, and Hovd are one hour earlier than the capital city, and
+# the rest of the country follows the Ulaanbaatar time, which is UTC/GMT plus
+# eight hours."
+
+# From Rives McDow (1999-12-13):
+# Mongolia discontinued the use of daylight savings time in 1999; 1998
+# being the last year it was implemented. The dates of implementation I am
+# unsure of, but most probably it was similar to Russia, except for the time
+# of implementation may have been different....
+# Some maps in the past have indicated that there was an additional time
+# zone in the eastern part of Mongolia, including the provinces of Dornod,
+# Suhbaatar, and possibly Khentij.
+
+# From Paul Eggert (1999-12-15):
+# Naming and spelling is tricky in Mongolia.
+# We'll use Hovd (also spelled Chovd and Khovd) to represent the west zone;
+# the capital of the Hovd province is sometimes called Hovd, sometimes Dund-Us,
+# and sometimes Jirgalanta (with variant spellings), but the name Hovd
+# is good enough for our purposes.
+
+# From Rives McDow (2001-05-13):
+# In addition to Mongolia starting daylight savings as reported earlier
+# (adopted DST on 2001-04-27 02:00 local time, ending 2001-09-28),
+# there are three time zones.
+#
+# Provinces [at 7:00]: Bayan-ulgii, Uvs, Khovd, Zavkhan, Govi-Altai
+# Provinces [at 8:00]: Khovsgol, Bulgan, Arkhangai, Khentii, Tov,
+# Bayankhongor, Ovorkhangai, Dundgovi, Dornogovi, Omnogovi
+# Provinces [at 9:00]: Dornod, Sukhbaatar
+#
+# [The province of Selenge is omitted from the above lists.]
+
+# From Ganbold Ts., Ulaanbaatar (2004-04-17):
+# Daylight saving occurs at 02:00 local time last Saturday of March.
+# It will change back to normal at 02:00 local time last Saturday of
+# September.... As I remember this rule was changed in 2001.
+#
+# From Paul Eggert (2004-04-17):
+# For now, assume Rives McDow's informant got confused about Friday vs
+# Saturday, and that his 2001 dates should have 1 added to them.
+
+# From Paul Eggert (2005-07-26):
+# We have wildly conflicting information about Mongolia's time zones.
+# Bill Bonnet (2005-05-19) reports that the US Embassy in Ulaanbaatar says
+# there is only one time zone and that DST is observed, citing Microsoft
+# Windows XP as the source. Risto Nykanen (2005-05-16) reports that
+# travelmongolia.org says there are two time zones (UTC+7, UTC+8) with no DST.
+# Oscar van Vlijmen (2005-05-20) reports that the Mongolian Embassy in
+# Washington, DC says there are two time zones, with DST observed.
+# He also found
+# <http://ubpost.mongolnews.mn/index.php?subaction=showcomments&id=1111634894&archive=&start_from=&ucat=1&>
+# which also says that there is DST, and which has a comment by "Toddius"
+# (2005-03-31 06:05 +0700) saying "Mongolia actually has 3.5 time zones.
+# The West (OLGII) is +7 GMT, most of the country is ULAT is +8 GMT
+# and some Eastern provinces are +9 GMT but Sukhbaatar Aimag is SUHK +8.5 GMT.
+# The SUKH timezone is new this year, it is one of the few things the
+# parliament passed during the tumultuous winter session."
+# For now, let's ignore this information, until we have more confirmation.
+
+# From Ganbold Ts. (2007-02-26):
+# Parliament of Mongolia has just changed the daylight-saving rule in February.
+# They decided not to adopt daylight-saving time....
+# http://www.mongolnews.mn/index.php?module=unuudur&sec=view&id=15742
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Mongol 1983 1984 - Apr 1 0:00 1:00 S
+Rule Mongol 1983 only - Oct 1 0:00 0 -
+# Shanks & Pottenger and IATA SSIM say 1990s switches occurred at 00:00,
+# but McDow says the 2001 switches occurred at 02:00. Also, IATA SSIM
+# (1996-09) says 1996-10-25. Go with Shanks & Pottenger through 1998.
+#
+# Shanks & Pottenger say that the Sept. 1984 through Sept. 1990 switches
+# in Choibalsan (more precisely, in Dornod and Sukhbaatar) took place
+# at 02:00 standard time, not at 00:00 local time as in the rest of
+# the country. That would be odd, and possibly is a result of their
+# correction of 02:00 (in the previous edition) not being done correctly
+# in the latest edition; so ignore it for now.
+
+Rule Mongol 1985 1998 - Mar lastSun 0:00 1:00 S
+Rule Mongol 1984 1998 - Sep lastSun 0:00 0 -
+# IATA SSIM (1999-09) says Mongolia no longer observes DST.
+Rule Mongol 2001 only - Apr lastSat 2:00 1:00 S
+Rule Mongol 2001 2006 - Sep lastSat 2:00 0 -
+Rule Mongol 2002 2006 - Mar lastSat 2:00 1:00 S
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+# Hovd, a.k.a. Chovd, Dund-Us, Dzhargalant, Khovd, Jirgalanta
+Zone Asia/Hovd 6:06:36 - LMT 1905 Aug
+ 6:00 - HOVT 1978 # Hovd Time
+ 7:00 Mongol HOV%sT
+# Ulaanbaatar, a.k.a. Ulan Bataar, Ulan Bator, Urga
+Zone Asia/Ulaanbaatar 7:07:32 - LMT 1905 Aug
+ 7:00 - ULAT 1978 # Ulaanbaatar Time
+ 8:00 Mongol ULA%sT
+# Choibalsan, a.k.a. Bajan Tuemen, Bajan Tumen, Chojbalsan,
+# Choybalsan, Sanbejse, Tchoibalsan
+Zone Asia/Choibalsan 7:38:00 - LMT 1905 Aug
+ 7:00 - ULAT 1978
+ 8:00 - ULAT 1983 Apr
+ 9:00 Mongol CHO%sT # Choibalsan Time
+
+# Nepal
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Katmandu 5:41:16 - LMT 1920
+ 5:30 - IST 1986
+ 5:45 - NPT # Nepal Time
+
+# Oman
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Muscat 3:54:20 - LMT 1920
+ 4:00 - GST
+
+# Pakistan
+
+# From Rives McDow (2002-03-13):
+# I have been advised that Pakistan has decided to adopt dst on a
+# TRIAL basis for one year, starting 00:01 local time on April 7, 2002
+# and ending at 00:01 local time October 6, 2002. This is what I was
+# told, but I believe that the actual time of change may be 00:00; the
+# 00:01 was to make it clear which day it was on.
+
+# From Paul Eggert (2002-03-15):
+# Jesper Norgaard found this URL:
+# http://www.pak.gov.pk/public/news/app/app06_dec.htm
+# (dated 2001-12-06) which says that the Cabinet adopted a scheme "to
+# advance the clocks by one hour on the night between the first
+# Saturday and Sunday of April and revert to the original position on
+# 15th October each year". This agrees with McDow's 04-07 at 00:00,
+# but disagrees about the October transition, and makes it sound like
+# it's not on a trial basis. Also, the "between the first Saturday
+# and Sunday of April" phrase, if taken literally, means that the
+# transition takes place at 00:00 on the first Sunday on or after 04-02.
+
+# From Paul Eggert (2003-02-09):
+# DAWN <http://www.dawn.com/2002/10/06/top13.htm> reported on 2002-10-05
+# that 2002 DST ended that day at midnight. Go with McDow for now.
+
+# From Steffen Thorsen (2003-03-14):
+# According to http://www.dawn.com/2003/03/07/top15.htm
+# there will be no DST in Pakistan this year:
+#
+# ISLAMABAD, March 6: Information and Media Development Minister Sheikh
+# Rashid Ahmed on Thursday said the cabinet had reversed a previous
+# decision to advance clocks by one hour in summer and put them back by
+# one hour in winter with the aim of saving light hours and energy.
+#
+# The minister told a news conference that the experiment had rather
+# shown 8 per cent higher consumption of electricity.
+
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Pakistan 2002 only - Apr Sun>=2 0:01 1:00 S
+Rule Pakistan 2002 only - Oct Sun>=2 0:01 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Karachi 4:28:12 - LMT 1907
+ 5:30 - IST 1942 Sep
+ 5:30 1:00 IST 1945 Oct 15
+ 5:30 - IST 1951 Sep 30
+ 5:00 - KART 1971 Mar 26 # Karachi Time
+ 5:00 Pakistan PK%sT # Pakistan Time
+
+# Palestine
+
+# From Amos Shapir (1998-02-15):
+#
+# From 1917 until 1948-05-15, all of Palestine, including the parts now
+# known as the Gaza Strip and the West Bank, was under British rule.
+# Therefore the rules given for Israel for that period, apply there too...
+#
+# The Gaza Strip was under Egyptian rule between 1948-05-15 until 1967-06-05
+# (except a short occupation by Israel from 1956-11 till 1957-03, but no
+# time zone was affected then). It was never formally annexed to Egypt,
+# though.
+#
+# The rest of Palestine was under Jordanian rule at that time, formally
+# annexed in 1950 as the West Bank (and the word "Trans" was dropped from
+# the country's previous name of "the Hashemite Kingdom of the
+# Trans-Jordan"). So the rules for Jordan for that time apply. Major
+# towns in that area are Nablus (Shchem), El-Halil (Hebron), Ramallah, and
+# East Jerusalem.
+#
+# Both areas were occupied by Israel in June 1967, but not annexed (except
+# for East Jerusalem). They were on Israel time since then; there might
+# have been a Military Governor's order about time zones, but I'm not aware
+# of any (such orders may have been issued semi-annually whenever summer
+# time was in effect, but maybe the legal aspect of time was just neglected).
+#
+# The Palestinian Authority was established in 1993, and got hold of most
+# towns in the West Bank and Gaza by 1995. I know that in order to
+# demonstrate...independence, they have been switching to
+# summer time and back on a different schedule than Israel's, but I don't
+# know when this was started, or what algorithm is used (most likely the
+# Jordanian one).
+#
+# To summarize, the table should probably look something like that:
+#
+# Area \ when | 1918-1947 | 1948-1967 | 1967-1995 | 1996-
+# ------------+-----------+-----------+-----------+-----------
+# Israel | Zion | Zion | Zion | Zion
+# West bank | Zion | Jordan | Zion | Jordan
+# Gaza | Zion | Egypt | Zion | Jordan
+#
+# I guess more info may be available from the PA's web page (if/when they
+# have one).
+
+# From Paul Eggert (2006-03-22):
+# Shanks & Pottenger write that Gaza did not observe DST until 1957, but go
+# with Shapir and assume that it observed DST from 1940 through 1947,
+# and that it used Jordanian rules starting in 1996.
+# We don't yet need a separate entry for the West Bank, since
+# the only differences between it and Gaza that we know about
+# occurred before our cutoff date of 1970.
+# However, as we get more information, we may need to add entries
+# for parts of the West Bank as they transitioned from Israel's rules
+# to Palestine's rules. If you have more info about this, please
+# send it to tz@elsie.nci.nih.gov for incorporation into future editions.
+
+# From IINS News Service - Israel - 1998-03-23 10:38:07 Israel time,
+# forwarded by Ephraim Silverberg:
+#
+# Despite the fact that Israel changed over to daylight savings time
+# last week, the PLO Authority (PA) has decided not to turn its clocks
+# one-hour forward at this time. As a sign of independence from Israeli rule,
+# the PA has decided to implement DST in April.
+
+# From Paul Eggert (1999-09-20):
+# Daoud Kuttab writes in
+# <a href="http://www.jpost.com/com/Archive/22.Apr.1999/Opinion/Article-2.html">
+# Holiday havoc
+# </a> (Jerusalem Post, 1999-04-22) that
+# the Palestinian National Authority changed to DST on 1999-04-15.
+# I vaguely recall that they switch back in October (sorry, forgot the source).
+# For now, let's assume that the spring switch was at 24:00,
+# and that they switch at 0:00 on the 3rd Fridays of April and October.
+
+# From Paul Eggert (2005-11-22):
+# Starting 2004 transitions are from Steffen Thorsen's web site timeanddate.com.
+
+# From Steffen Thorsen (2005-11-23):
+# A user from Gaza reported that Gaza made the change early because of
+# the Ramadan. Next year Ramadan will be even earlier, so I think
+# there is a good chance next year's end date will be around two weeks
+# earlier--the same goes for Jordan.
+
+# From Steffen Thorsen (2006-08-17):
+# I was informed by a user in Bethlehem that in Bethlehem it started the
+# same day as Israel, and after checking with other users in the area, I
+# was informed that they started DST one day after Israel. I was not
+# able to find any authoritative sources at the time, nor details if
+# Gaza changed as well, but presumed Gaza to follow the same rules as
+# the West Bank.
+
+# From Steffen Thorsen (2006-09-26):
+# according to the Palestine News Network (2006-09-19):
+# http://english.pnn.ps/index.php?option=com_content&task=view&id=596&Itemid=5
+# > The Council of Ministers announced that this year its winter schedule
+# > will begin early, as of midnight Thursday. It is also time to turn
+# > back the clocks for winter. Friday will begin an hour late this week.
+# I guess it is likely that next year's date will be moved as well,
+# because of the Ramadan.
+
+# From Jesper Norgaard Welen (2007-09-18):
+# According to Steffen Thorsen's web site the Gaza Strip and the rest of the
+# Palestinian territories left DST early on 13.th. of September at 2:00.
+
+# From Paul Eggert (2007-09-20):
+# My understanding is that Gaza and the West Bank disagree even over when
+# the weekend is (Thursday+Friday versus Friday+Saturday), so I'd be a bit
+# surprised if they agreed about DST. But for now, assume they agree.
+# For lack of better information, predict that future changes will be
+# the 2nd Thursday of September at 02:00.
+
+# The rules for Egypt are stolen from the `africa' file.
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule EgyptAsia 1957 only - May 10 0:00 1:00 S
+Rule EgyptAsia 1957 1958 - Oct 1 0:00 0 -
+Rule EgyptAsia 1958 only - May 1 0:00 1:00 S
+Rule EgyptAsia 1959 1967 - May 1 1:00 1:00 S
+Rule EgyptAsia 1959 1965 - Sep 30 3:00 0 -
+Rule EgyptAsia 1966 only - Oct 1 3:00 0 -
+
+Rule Palestine 1999 2005 - Apr Fri>=15 0:00 1:00 S
+Rule Palestine 1999 2003 - Oct Fri>=15 0:00 0 -
+Rule Palestine 2004 only - Oct 1 1:00 0 -
+Rule Palestine 2005 only - Oct 4 2:00 0 -
+Rule Palestine 2006 max - Apr 1 0:00 1:00 S
+Rule Palestine 2006 only - Sep 22 0:00 0 -
+Rule Palestine 2007 max - Sep Thu>=8 2:00 0 -
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Gaza 2:17:52 - LMT 1900 Oct
+ 2:00 Zion EET 1948 May 15
+ 2:00 EgyptAsia EE%sT 1967 Jun 5
+ 2:00 Zion I%sT 1996
+ 2:00 Jordan EE%sT 1999
+ 2:00 Palestine EE%sT
+
+# Paracel Is
+# no information
+
+# Philippines
+# On 1844-08-16, Narciso Claveria, governor-general of the
+# Philippines, issued a proclamation announcing that 1844-12-30 was to
+# be immediately followed by 1845-01-01. Robert H. van Gent has a
+# transcript of the decree in <http://www.phys.uu.nl/~vgent/idl/idl.htm>.
+# The rest of the data are from Shanks & Pottenger.
+
+# From Paul Eggert (2006-04-25):
+# Tomorrow's Manila Standard reports that the Philippines Department of
+# Trade and Industry is considering adopting DST this June when the
+# rainy season begins. See
+# <http://www.manilastandardtoday.com/?page=politics02_april26_2006>.
+# For now, we'll ignore this, since it's not definite and we lack details.
+#
+# From Jesper Norgaard Welen (2006-04-26):
+# ... claims that Philippines had DST last time in 1990:
+# http://story.philippinetimes.com/p.x/ct/9/id/145be20cc6b121c0/cid/3e5bbccc730d258c/
+# [a story dated 2006-04-25 by Cris Larano of Dow Jones Newswires,
+# but no details]
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Phil 1936 only - Nov 1 0:00 1:00 S
+Rule Phil 1937 only - Feb 1 0:00 0 -
+Rule Phil 1954 only - Apr 12 0:00 1:00 S
+Rule Phil 1954 only - Jul 1 0:00 0 -
+Rule Phil 1978 only - Mar 22 0:00 1:00 S
+Rule Phil 1978 only - Sep 21 0:00 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Manila -15:56:00 - LMT 1844 Dec 31
+ 8:04:00 - LMT 1899 May 11
+ 8:00 Phil PH%sT 1942 May
+ 9:00 - JST 1944 Nov
+ 8:00 Phil PH%sT
+
+# Qatar
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Qatar 3:26:08 - LMT 1920 # Al Dawhah / Doha
+ 4:00 - GST 1972 Jun
+ 3:00 - AST
+
+# Saudi Arabia
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Riyadh 3:06:52 - LMT 1950
+ 3:00 - AST
+
+# Singapore
+# The data here are taken from Mok Ly Yng (2003-10-30)
+# <http://www.math.nus.edu.sg/aslaksen/teaching/timezone.html>.
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Singapore 6:55:25 - LMT 1901 Jan 1
+ 6:55:25 - SMT 1905 Jun 1 # Singapore M.T.
+ 7:00 - MALT 1933 Jan 1 # Malaya Time
+ 7:00 0:20 MALST 1936 Jan 1
+ 7:20 - MALT 1941 Sep 1
+ 7:30 - MALT 1942 Feb 16
+ 9:00 - JST 1945 Sep 12
+ 7:30 - MALT 1965 Aug 9 # independence
+ 7:30 - SGT 1982 Jan 1 # Singapore Time
+ 8:00 - SGT
+
+# Spratly Is
+# no information
+
+# Sri Lanka
+# From Paul Eggert (1996-09-03):
+# "Sri Lanka advances clock by an hour to avoid blackout"
+# (www.virtual-pc.com/lankaweb/news/items/240596-2.html, 1996-05-24,
+# no longer available as of 1999-08-17)
+# reported ``the country's standard time will be put forward by one hour at
+# midnight Friday (1830 GMT) `in the light of the present power crisis'.''
+#
+# From Dharmasiri Senanayake, Sri Lanka Media Minister (1996-10-24), as quoted
+# by Shamindra in
+# <a href="news:54rka5$m5h@mtinsc01-mgt.ops.worldnet.att.net">
+# Daily News - Hot News Section (1996-10-26)
+# </a>:
+# With effect from 12.30 a.m. on 26th October 1996
+# Sri Lanka will be six (06) hours ahead of GMT.
+
+# From Jesper Norgaard Welen (2006-04-14), quoting Sri Lanka News Online
+# <http://news.sinhalaya.com/wmview.php?ArtID=11002> (2006-04-13):
+# 0030 hrs on April 15, 2006 (midnight of April 14, 2006 +30 minutes)
+# at present, become 2400 hours of April 14, 2006 (midnight of April 14, 2006).
+
+# From Peter Apps and Ranga Sirila of Reuters (2006-04-12) in:
+# <http://today.reuters.co.uk/news/newsArticle.aspx?type=scienceNews&storyID=2006-04-12T172228Z_01_COL295762_RTRIDST_0_SCIENCE-SRILANKA-TIME-DC.XML>
+# [The Tamil Tigers] never accepted the original 1996 time change and simply
+# kept their clocks set five and a half hours ahead of Greenwich Mean
+# Time (GMT), in line with neighbor India.
+# From Paul Eggert (2006-04-18):
+# People who live in regions under Tamil control can use [TZ='Asia/Kolkata'],
+# as that zone has agreed with the Tamil areas since our cutoff date of 1970.
+
+# From K Sethu (2006-04-25):
+# I think the abbreviation LKT originated from the world of computers at
+# the time of or subsequent to the time zone changes by SL Government
+# twice in 1996 and probably SL Government or its standardization
+# agencies never declared an abbreviation as a national standard.
+#
+# I recollect before the recent change the government annoucemments
+# mentioning it as simply changing Sri Lanka Standard Time or Sri Lanka
+# Time and no mention was made about the abbreviation.
+#
+# If we look at Sri Lanka Department of Government's "Official News
+# Website of Sri Lanka" ... http://www.news.lk/ we can see that they
+# use SLT as abbreviation in time stamp at the beginning of each news
+# item....
+#
+# Within Sri Lanka I think LKT is well known among computer users and
+# adminsitrators. In my opinion SLT may not be a good choice because the
+# nation's largest telcom / internet operator Sri Lanka Telcom is well
+# known by that abbreviation - simply as SLT (there IP domains are
+# slt.lk and sltnet.lk).
+#
+# But if indeed our government has adopted SLT as standard abbreviation
+# (that we have not known so far) then it is better that it be used for
+# all computers.
+
+# From Paul Eggert (2006-04-25):
+# One possibility is that we wait for a bit for the dust to settle down
+# and then see what people actually say in practice.
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Colombo 5:19:24 - LMT 1880
+ 5:19:32 - MMT 1906 # Moratuwa Mean Time
+ 5:30 - IST 1942 Jan 5
+ 5:30 0:30 IHST 1942 Sep
+ 5:30 1:00 IST 1945 Oct 16 2:00
+ 5:30 - IST 1996 May 25 0:00
+ 6:30 - LKT 1996 Oct 26 0:30
+ 6:00 - LKT 2006 Apr 15 0:30
+ 5:30 - IST
+
+# Syria
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Syria 1920 1923 - Apr Sun>=15 2:00 1:00 S
+Rule Syria 1920 1923 - Oct Sun>=1 2:00 0 -
+Rule Syria 1962 only - Apr 29 2:00 1:00 S
+Rule Syria 1962 only - Oct 1 2:00 0 -
+Rule Syria 1963 1965 - May 1 2:00 1:00 S
+Rule Syria 1963 only - Sep 30 2:00 0 -
+Rule Syria 1964 only - Oct 1 2:00 0 -
+Rule Syria 1965 only - Sep 30 2:00 0 -
+Rule Syria 1966 only - Apr 24 2:00 1:00 S
+Rule Syria 1966 1976 - Oct 1 2:00 0 -
+Rule Syria 1967 1978 - May 1 2:00 1:00 S
+Rule Syria 1977 1978 - Sep 1 2:00 0 -
+Rule Syria 1983 1984 - Apr 9 2:00 1:00 S
+Rule Syria 1983 1984 - Oct 1 2:00 0 -
+Rule Syria 1986 only - Feb 16 2:00 1:00 S
+Rule Syria 1986 only - Oct 9 2:00 0 -
+Rule Syria 1987 only - Mar 1 2:00 1:00 S
+Rule Syria 1987 1988 - Oct 31 2:00 0 -
+Rule Syria 1988 only - Mar 15 2:00 1:00 S
+Rule Syria 1989 only - Mar 31 2:00 1:00 S
+Rule Syria 1989 only - Oct 1 2:00 0 -
+Rule Syria 1990 only - Apr 1 2:00 1:00 S
+Rule Syria 1990 only - Sep 30 2:00 0 -
+Rule Syria 1991 only - Apr 1 0:00 1:00 S
+Rule Syria 1991 1992 - Oct 1 0:00 0 -
+Rule Syria 1992 only - Apr 8 0:00 1:00 S
+Rule Syria 1993 only - Mar 26 0:00 1:00 S
+Rule Syria 1993 only - Sep 25 0:00 0 -
+# IATA SSIM (1998-02) says 1998-04-02;
+# (1998-09) says 1999-03-29 and 1999-09-29; (1999-02) says 1999-04-02,
+# 2000-04-02, and 2001-04-02; (1999-09) says 2000-03-31 and 2001-03-31;
+# (2006) says 2006-03-31 and 2006-09-22;
+# for now ignore all these claims and go with Shanks & Pottenger,
+# except for the 2006-09-22 claim (which seems right for Ramadan).
+Rule Syria 1994 1996 - Apr 1 0:00 1:00 S
+Rule Syria 1994 2005 - Oct 1 0:00 0 -
+Rule Syria 1997 1998 - Mar lastMon 0:00 1:00 S
+Rule Syria 1999 2006 - Apr 1 0:00 1:00 S
+# From Stephen Colebourne (2006-09-18):
+# According to IATA data, Syria will change DST on 21st September [21:00 UTC]
+# this year [only].... This is probably related to Ramadan, like Egypt.
+Rule Syria 2006 only - Sep 22 0:00 0 -
+# From Paul Eggert (2007-03-29):
+# Today the AP reported "Syria will switch to summertime at midnight Thursday."
+# http://www.iht.com/articles/ap/2007/03/29/africa/ME-GEN-Syria-Time-Change.php
+Rule Syria 2007 only - Mar lastFri 0:00 1:00 S
+# From Jesper Norgard (2007-10-27):
+# The sister center ICARDA of my work CIMMYT is confirming that Syria DST will
+# not take place 1.st November at 0:00 o'clock but 1.st November at 24:00 or
+# rather Midnight between Thursday and Friday. This does make more sence than
+# having it between Wednesday and Thursday (two workdays in Syria) since the
+# weekend in Syria is not Saturday and Sunday, but Friday and Saturday. So now
+# it is implemented at midnight of the last workday before weekend...
+#
+# From Steffen Thorsen (2007-10-27):
+# Jesper Norgaard Welen wrote:
+#
+# > "Winter local time in Syria will be observed at midnight of Thursday 1
+# > November 2007, and the clock will be put back 1 hour."
+#
+# I found confirmation on this in this gov.sy-article (Arabic):
+# http://wehda.alwehda.gov.sy/_print_veiw.asp?FileName=12521710520070926111247
+#
+# which using Google's translate tools says:
+# Council of Ministers also approved the commencement of work on
+# identifying the winter time as of Friday, 2/11/2007 where the 60th
+# minute delay at midnight Thursday 1/11/2007.
+Rule Syria 2007 only - Nov Fri>=1 0:00 0 -
+
+# From Stephen Colebourne (2008-03-17):
+# For everyone's info, I saw an IATA time zone change for [Syria] for
+# this month (March 2008) in the last day or so...This is the data IATA
+# are now using:
+# Country Time Standard --- DST Start --- --- DST End --- DST
+# Name Zone Variation Time Date Time Date
+# Variation
+# Syrian Arab
+# Republic SY +0200 2200 03APR08 2100 30SEP08 +0300
+# 2200 02APR09 2100 30SEP09 +0300
+# 2200 01APR10 2100 30SEP10 +0300
+
+# From Arthur David Olson (2008-03-17):
+# Here's a link to English-language coverage by the Syrian Arab News
+# Agency (SANA)...
+# <a href="http://www.sana.sy/eng/21/2008/03/11/165173.htm">
+# http://www.sana.sy/eng/21/2008/03/11/165173.htm
+# </a>...which reads (in part) "The Cabinet approved the suggestion of the
+# Ministry of Electricity to begin daylight savings time on Friday April
+# 4th, advancing clocks one hour ahead on midnight of Thursday April 3rd."
+# Since Syria is two hours east of UTC, the 2200 and 2100 transition times
+# shown above match up with midnight in Syria.
+
+# From Arthur David Olson (2008-03-18):
+# My buest guess at a Syrian rule is "the Friday nearest April 1";
+# coding that involves either using a "Mar Fri>=29" construct that old time zone
+# compilers can't handle or having multiple Rules (a la Israel).
+# For now, use "Apr Fri>=1", and go with IATA on a uniform Sep 30 end.
+
+Rule Syria 2008 max - Apr Fri>=1 0:00 1:00 S
+Rule Syria 2008 max - Oct 1 0:00 0 -
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Damascus 2:25:12 - LMT 1920 # Dimashq
+ 2:00 Syria EE%sT
+
+# Tajikistan
+# From Shanks & Pottenger.
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Dushanbe 4:35:12 - LMT 1924 May 2
+ 5:00 - DUST 1930 Jun 21 # Dushanbe Time
+ 6:00 RussiaAsia DUS%sT 1991 Mar 31 2:00s
+ 5:00 1:00 DUSST 1991 Sep 9 2:00s
+ 5:00 - TJT # Tajikistan Time
+
+# Thailand
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Bangkok 6:42:04 - LMT 1880
+ 6:42:04 - BMT 1920 Apr # Bangkok Mean Time
+ 7:00 - ICT
+
+# Turkmenistan
+# From Shanks & Pottenger.
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Ashgabat 3:53:32 - LMT 1924 May 2 # or Ashkhabad
+ 4:00 - ASHT 1930 Jun 21 # Ashkhabad Time
+ 5:00 RussiaAsia ASH%sT 1991 Mar 31 2:00
+ 4:00 RussiaAsia ASH%sT 1991 Oct 27 # independence
+ 4:00 RussiaAsia TM%sT 1992 Jan 19 2:00
+ 5:00 - TMT
+
+# United Arab Emirates
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Dubai 3:41:12 - LMT 1920
+ 4:00 - GST
+
+# Uzbekistan
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Samarkand 4:27:12 - LMT 1924 May 2
+ 4:00 - SAMT 1930 Jun 21 # Samarkand Time
+ 5:00 - SAMT 1981 Apr 1
+ 5:00 1:00 SAMST 1981 Oct 1
+ 6:00 - TAST 1982 Apr 1 # Tashkent Time
+ 5:00 RussiaAsia SAM%sT 1991 Sep 1 # independence
+ 5:00 RussiaAsia UZ%sT 1992
+ 5:00 - UZT
+Zone Asia/Tashkent 4:37:12 - LMT 1924 May 2
+ 5:00 - TAST 1930 Jun 21 # Tashkent Time
+ 6:00 RussiaAsia TAS%sT 1991 Mar 31 2:00
+ 5:00 RussiaAsia TAS%sT 1991 Sep 1 # independence
+ 5:00 RussiaAsia UZ%sT 1992
+ 5:00 - UZT
+
+# Vietnam
+
+# From Arthur David Olson (2008-03-18):
+# The English-language name of Vietnam's most populous city is "Ho Chi Min City";
+# we use Ho_Chi_Minh below to avoid a name of more than 14 characters.
+
+# From Shanks & Pottenger:
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Ho_Chi_Minh 7:06:40 - LMT 1906 Jun 9
+ 7:06:20 - SMT 1911 Mar 11 0:01 # Saigon MT?
+ 7:00 - ICT 1912 May
+ 8:00 - ICT 1931 May
+ 7:00 - ICT
+
+# Yemen
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Asia/Aden 3:00:48 - LMT 1950
+ 3:00 - AST
diff --git a/libkcal/libical/tzdata/australasia b/libkcal/libical/tzdata/australasia
new file mode 100644
index 00000000..30d695ff
--- /dev/null
+++ b/libkcal/libical/tzdata/australasia
@@ -0,0 +1,1454 @@
+# @(#)australasia 8.8
+# <pre>
+
+# This file also includes Pacific islands.
+
+# Notes are at the end of this file
+
+###############################################################################
+
+# Australia
+
+# Please see the notes below for the controversy about "EST" versus "AEST" etc.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Aus 1917 only - Jan 1 0:01 1:00 -
+Rule Aus 1917 only - Mar 25 2:00 0 -
+Rule Aus 1942 only - Jan 1 2:00 1:00 -
+Rule Aus 1942 only - Mar 29 2:00 0 -
+Rule Aus 1942 only - Sep 27 2:00 1:00 -
+Rule Aus 1943 1944 - Mar lastSun 2:00 0 -
+Rule Aus 1943 only - Oct 3 2:00 1:00 -
+# Go with Whitman and the Australian National Standards Commission, which
+# says W Australia didn't use DST in 1943/1944. Ignore Whitman's claim that
+# 1944/1945 was just like 1943/1944.
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+# Northern Territory
+Zone Australia/Darwin 8:43:20 - LMT 1895 Feb
+ 9:00 - CST 1899 May
+ 9:30 Aus CST
+# Western Australia
+#
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule AW 1974 only - Oct lastSun 2:00s 1:00 -
+Rule AW 1975 only - Mar Sun>=1 2:00s 0 -
+Rule AW 1983 only - Oct lastSun 2:00s 1:00 -
+Rule AW 1984 only - Mar Sun>=1 2:00s 0 -
+Rule AW 1991 only - Nov 17 2:00s 1:00 -
+Rule AW 1992 only - Mar Sun>=1 2:00s 0 -
+Rule AW 2006 only - Dec 3 2:00s 1:00 -
+Rule AW 2007 2009 - Mar lastSun 2:00s 0 -
+Rule AW 2007 2008 - Oct lastSun 2:00s 1:00 -
+Zone Australia/Perth 7:43:24 - LMT 1895 Dec
+ 8:00 Aus WST 1943 Jul
+ 8:00 AW WST
+Zone Australia/Eucla 8:35:28 - LMT 1895 Dec
+ 8:45 Aus CWST 1943 Jul
+ 8:45 AW CWST
+
+# Queensland
+#
+# From Alex Livingston (1996-11-01):
+# I have heard or read more than once that some resort islands off the coast
+# of Queensland chose to keep observing daylight-saving time even after
+# Queensland ceased to.
+#
+# From Paul Eggert (1996-11-22):
+# IATA SSIM (1993-02/1994-09) say that the Holiday Islands (Hayman, Lindeman,
+# Hamilton) observed DST for two years after the rest of Queensland stopped.
+# Hamilton is the largest, but there is also a Hamilton in Victoria,
+# so use Lindeman.
+#
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule AQ 1971 only - Oct lastSun 2:00s 1:00 -
+Rule AQ 1972 only - Feb lastSun 2:00s 0 -
+Rule AQ 1989 1991 - Oct lastSun 2:00s 1:00 -
+Rule AQ 1990 1992 - Mar Sun>=1 2:00s 0 -
+Rule Holiday 1992 1993 - Oct lastSun 2:00s 1:00 -
+Rule Holiday 1993 1994 - Mar Sun>=1 2:00s 0 -
+Zone Australia/Brisbane 10:12:08 - LMT 1895
+ 10:00 Aus EST 1971
+ 10:00 AQ EST
+Zone Australia/Lindeman 9:55:56 - LMT 1895
+ 10:00 Aus EST 1971
+ 10:00 AQ EST 1992 Jul
+ 10:00 Holiday EST
+
+# South Australia
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule AS 1971 1985 - Oct lastSun 2:00s 1:00 -
+Rule AS 1986 only - Oct 19 2:00s 1:00 -
+Rule AS 1987 2007 - Oct lastSun 2:00s 1:00 -
+Rule AS 1972 only - Feb 27 2:00s 0 -
+Rule AS 1973 1985 - Mar Sun>=1 2:00s 0 -
+Rule AS 1986 1989 - Mar Sun>=15 2:00s 0 -
+Rule AS 1990 only - Mar Sun>=18 2:00s 0 -
+Rule AS 1991 only - Mar Sun>=1 2:00s 0 -
+Rule AS 1992 only - Mar Sun>=18 2:00s 0 -
+Rule AS 1993 only - Mar Sun>=1 2:00s 0 -
+Rule AS 1994 only - Mar Sun>=18 2:00s 0 -
+Rule AS 1995 2005 - Mar lastSun 2:00s 0 -
+Rule AS 2006 only - Apr Sun>=1 2:00s 0 -
+Rule AS 2007 only - Mar lastSun 2:00s 0 -
+Rule AS 2008 max - Apr Sun>=1 2:00s 0 -
+Rule AS 2008 max - Oct Sun>=1 2:00s 1:00 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Australia/Adelaide 9:14:20 - LMT 1895 Feb
+ 9:00 - CST 1899 May
+ 9:30 Aus CST 1971
+ 9:30 AS CST
+
+# Tasmania
+#
+# From Paul Eggert (2005-08-16):
+# <http://www.bom.gov.au/climate/averages/tables/dst_times.shtml>
+# says King Island didn't observe DST from WWII until late 1971.
+#
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule AT 1967 only - Oct Sun>=1 2:00s 1:00 -
+Rule AT 1968 only - Mar lastSun 2:00s 0 -
+Rule AT 1968 1985 - Oct lastSun 2:00s 1:00 -
+Rule AT 1969 1971 - Mar Sun>=8 2:00s 0 -
+Rule AT 1972 only - Feb lastSun 2:00s 0 -
+Rule AT 1973 1981 - Mar Sun>=1 2:00s 0 -
+Rule AT 1982 1983 - Mar lastSun 2:00s 0 -
+Rule AT 1984 1986 - Mar Sun>=1 2:00s 0 -
+Rule AT 1986 only - Oct Sun>=15 2:00s 1:00 -
+Rule AT 1987 1990 - Mar Sun>=15 2:00s 0 -
+Rule AT 1987 only - Oct Sun>=22 2:00s 1:00 -
+Rule AT 1988 1990 - Oct lastSun 2:00s 1:00 -
+Rule AT 1991 1999 - Oct Sun>=1 2:00s 1:00 -
+Rule AT 1991 2005 - Mar lastSun 2:00s 0 -
+Rule AT 2000 only - Aug lastSun 2:00s 1:00 -
+Rule AT 2001 max - Oct Sun>=1 2:00s 1:00 -
+Rule AT 2006 only - Apr Sun>=1 2:00s 0 -
+Rule AT 2007 only - Mar lastSun 2:00s 0 -
+Rule AT 2008 max - Apr Sun>=1 2:00s 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Australia/Hobart 9:49:16 - LMT 1895 Sep
+ 10:00 - EST 1916 Oct 1 2:00
+ 10:00 1:00 EST 1917 Feb
+ 10:00 Aus EST 1967
+ 10:00 AT EST
+Zone Australia/Currie 9:35:28 - LMT 1895 Sep
+ 10:00 - EST 1916 Oct 1 2:00
+ 10:00 1:00 EST 1917 Feb
+ 10:00 Aus EST 1971 Jul
+ 10:00 AT EST
+
+# Victoria
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule AV 1971 1985 - Oct lastSun 2:00s 1:00 -
+Rule AV 1972 only - Feb lastSun 2:00s 0 -
+Rule AV 1973 1985 - Mar Sun>=1 2:00s 0 -
+Rule AV 1986 1990 - Mar Sun>=15 2:00s 0 -
+Rule AV 1986 1987 - Oct Sun>=15 2:00s 1:00 -
+Rule AV 1988 1999 - Oct lastSun 2:00s 1:00 -
+Rule AV 1991 1994 - Mar Sun>=1 2:00s 0 -
+Rule AV 1995 2005 - Mar lastSun 2:00s 0 -
+Rule AV 2000 only - Aug lastSun 2:00s 1:00 -
+Rule AV 2001 2007 - Oct lastSun 2:00s 1:00 -
+Rule AV 2006 only - Apr Sun>=1 2:00s 0 -
+Rule AV 2007 only - Mar lastSun 2:00s 0 -
+Rule AV 2008 max - Apr Sun>=1 2:00s 0 -
+Rule AV 2008 max - Oct Sun>=1 2:00s 1:00 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Australia/Melbourne 9:39:52 - LMT 1895 Feb
+ 10:00 Aus EST 1971
+ 10:00 AV EST
+
+# New South Wales
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule AN 1971 1985 - Oct lastSun 2:00s 1:00 -
+Rule AN 1972 only - Feb 27 2:00s 0 -
+Rule AN 1973 1981 - Mar Sun>=1 2:00s 0 -
+Rule AN 1982 only - Apr Sun>=1 2:00s 0 -
+Rule AN 1983 1985 - Mar Sun>=1 2:00s 0 -
+Rule AN 1986 1989 - Mar Sun>=15 2:00s 0 -
+Rule AN 1986 only - Oct 19 2:00s 1:00 -
+Rule AN 1987 1999 - Oct lastSun 2:00s 1:00 -
+Rule AN 1990 1995 - Mar Sun>=1 2:00s 0 -
+Rule AN 1996 2005 - Mar lastSun 2:00s 0 -
+Rule AN 2000 only - Aug lastSun 2:00s 1:00 -
+Rule AN 2001 2007 - Oct lastSun 2:00s 1:00 -
+Rule AN 2006 only - Apr Sun>=1 2:00s 0 -
+Rule AN 2007 only - Mar lastSun 2:00s 0 -
+Rule AN 2008 max - Apr Sun>=1 2:00s 0 -
+Rule AN 2008 max - Oct Sun>=1 2:00s 1:00 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Australia/Sydney 10:04:52 - LMT 1895 Feb
+ 10:00 Aus EST 1971
+ 10:00 AN EST
+Zone Australia/Broken_Hill 9:25:48 - LMT 1895 Feb
+ 10:00 - EST 1896 Aug 23
+ 9:00 - CST 1899 May
+ 9:30 Aus CST 1971
+ 9:30 AN CST 2000
+ 9:30 AS CST
+
+# Lord Howe Island
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule LH 1981 1984 - Oct lastSun 2:00 1:00 -
+Rule LH 1982 1985 - Mar Sun>=1 2:00 0 -
+Rule LH 1985 only - Oct lastSun 2:00 0:30 -
+Rule LH 1986 1989 - Mar Sun>=15 2:00 0 -
+Rule LH 1986 only - Oct 19 2:00 0:30 -
+Rule LH 1987 1999 - Oct lastSun 2:00 0:30 -
+Rule LH 1990 1995 - Mar Sun>=1 2:00 0 -
+Rule LH 1996 2005 - Mar lastSun 2:00 0 -
+Rule LH 2000 only - Aug lastSun 2:00 0:30 -
+Rule LH 2001 2007 - Oct lastSun 2:00 0:30 -
+Rule LH 2006 only - Apr Sun>=1 2:00 0 -
+Rule LH 2007 only - Mar lastSun 2:00 0 -
+Rule LH 2008 max - Apr Sun>=1 2:00 0 -
+Rule LH 2008 max - Oct Sun>=1 2:00 0:30 -
+Zone Australia/Lord_Howe 10:36:20 - LMT 1895 Feb
+ 10:00 - EST 1981 Mar
+ 10:30 LH LHST
+
+# Australian miscellany
+#
+# Ashmore Is, Cartier
+# no indigenous inhabitants; only seasonal caretakers
+# no times are set
+#
+# Coral Sea Is
+# no indigenous inhabitants; only meteorologists
+# no times are set
+#
+# Macquarie
+# permanent occupation (scientific station) since 1948;
+# sealing and penguin oil station operated 1888/1917
+# like Australia/Hobart
+
+# Christmas
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Indian/Christmas 7:02:52 - LMT 1895 Feb
+ 7:00 - CXT # Christmas Island Time
+
+# Cook Is
+# From Shanks & Pottenger:
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Cook 1978 only - Nov 12 0:00 0:30 HS
+Rule Cook 1979 1991 - Mar Sun>=1 0:00 0 -
+Rule Cook 1979 1990 - Oct lastSun 0:00 0:30 HS
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Pacific/Rarotonga -10:39:04 - LMT 1901 # Avarua
+ -10:30 - CKT 1978 Nov 12 # Cook Is Time
+ -10:00 Cook CK%sT
+
+# Cocos
+# These islands were ruled by the Ross family from about 1830 to 1978.
+# We don't know when standard time was introduced; for now, we guess 1900.
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Indian/Cocos 6:27:40 - LMT 1900
+ 6:30 - CCT # Cocos Islands Time
+
+# Fiji
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Fiji 1998 1999 - Nov Sun>=1 2:00 1:00 S
+Rule Fiji 1999 2000 - Feb lastSun 3:00 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Pacific/Fiji 11:53:40 - LMT 1915 Oct 26 # Suva
+ 12:00 Fiji FJ%sT # Fiji Time
+
+# French Polynesia
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Pacific/Gambier -8:59:48 - LMT 1912 Oct # Rikitea
+ -9:00 - GAMT # Gambier Time
+Zone Pacific/Marquesas -9:18:00 - LMT 1912 Oct
+ -9:30 - MART # Marquesas Time
+Zone Pacific/Tahiti -9:58:16 - LMT 1912 Oct # Papeete
+ -10:00 - TAHT # Tahiti Time
+# Clipperton (near North America) is administered from French Polynesia;
+# it is uninhabited.
+
+# Guam
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Pacific/Guam -14:21:00 - LMT 1844 Dec 31
+ 9:39:00 - LMT 1901 # Agana
+ 10:00 - GST 2000 Dec 23 # Guam
+ 10:00 - ChST # Chamorro Standard Time
+
+# Kiribati
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Pacific/Tarawa 11:32:04 - LMT 1901 # Bairiki
+ 12:00 - GILT # Gilbert Is Time
+Zone Pacific/Enderbury -11:24:20 - LMT 1901
+ -12:00 - PHOT 1979 Oct # Phoenix Is Time
+ -11:00 - PHOT 1995
+ 13:00 - PHOT
+Zone Pacific/Kiritimati -10:29:20 - LMT 1901
+ -10:40 - LINT 1979 Oct # Line Is Time
+ -10:00 - LINT 1995
+ 14:00 - LINT
+
+# N Mariana Is
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Pacific/Saipan -14:17:00 - LMT 1844 Dec 31
+ 9:43:00 - LMT 1901
+ 9:00 - MPT 1969 Oct # N Mariana Is Time
+ 10:00 - MPT 2000 Dec 23
+ 10:00 - ChST # Chamorro Standard Time
+
+# Marshall Is
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Pacific/Majuro 11:24:48 - LMT 1901
+ 11:00 - MHT 1969 Oct # Marshall Islands Time
+ 12:00 - MHT
+Zone Pacific/Kwajalein 11:09:20 - LMT 1901
+ 11:00 - MHT 1969 Oct
+ -12:00 - KWAT 1993 Aug 20 # Kwajalein Time
+ 12:00 - MHT
+
+# Micronesia
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Pacific/Truk 10:07:08 - LMT 1901
+ 10:00 - TRUT # Truk Time
+Zone Pacific/Ponape 10:32:52 - LMT 1901 # Kolonia
+ 11:00 - PONT # Ponape Time
+Zone Pacific/Kosrae 10:51:56 - LMT 1901
+ 11:00 - KOST 1969 Oct # Kosrae Time
+ 12:00 - KOST 1999
+ 11:00 - KOST
+
+# Nauru
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Pacific/Nauru 11:07:40 - LMT 1921 Jan 15 # Uaobe
+ 11:30 - NRT 1942 Mar 15 # Nauru Time
+ 9:00 - JST 1944 Aug 15
+ 11:30 - NRT 1979 May
+ 12:00 - NRT
+
+# New Caledonia
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule NC 1977 1978 - Dec Sun>=1 0:00 1:00 S
+Rule NC 1978 1979 - Feb 27 0:00 0 -
+Rule NC 1996 only - Dec 1 2:00s 1:00 S
+# Shanks & Pottenger say the following was at 2:00; go with IATA.
+Rule NC 1997 only - Mar 2 2:00s 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Pacific/Noumea 11:05:48 - LMT 1912 Jan 13
+ 11:00 NC NC%sT
+
+
+###############################################################################
+
+# New Zealand
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule NZ 1927 only - Nov 6 2:00 1:00 S
+Rule NZ 1928 only - Mar 4 2:00 0 M
+Rule NZ 1928 1933 - Oct Sun>=8 2:00 0:30 S
+Rule NZ 1929 1933 - Mar Sun>=15 2:00 0 M
+Rule NZ 1934 1940 - Apr lastSun 2:00 0 M
+Rule NZ 1934 1940 - Sep lastSun 2:00 0:30 S
+Rule NZ 1946 only - Jan 1 0:00 0 S
+# Since 1957 Chatham has been 45 minutes ahead of NZ, but there's no
+# convenient notation for this so we must duplicate the Rule lines.
+Rule NZ 1974 only - Nov Sun>=1 2:00s 1:00 D
+Rule Chatham 1974 only - Nov Sun>=1 2:45s 1:00 D
+Rule NZ 1975 only - Feb lastSun 2:00s 0 S
+Rule Chatham 1975 only - Feb lastSun 2:45s 0 S
+Rule NZ 1975 1988 - Oct lastSun 2:00s 1:00 D
+Rule Chatham 1975 1988 - Oct lastSun 2:45s 1:00 D
+Rule NZ 1976 1989 - Mar Sun>=1 2:00s 0 S
+Rule Chatham 1976 1989 - Mar Sun>=1 2:45s 0 S
+Rule NZ 1989 only - Oct Sun>=8 2:00s 1:00 D
+Rule Chatham 1989 only - Oct Sun>=8 2:45s 1:00 D
+Rule NZ 1990 2006 - Oct Sun>=1 2:00s 1:00 D
+Rule Chatham 1990 2006 - Oct Sun>=1 2:45s 1:00 D
+Rule NZ 1990 2007 - Mar Sun>=15 2:00s 0 S
+Rule Chatham 1990 2007 - Mar Sun>=15 2:45s 0 S
+Rule NZ 2007 max - Sep lastSun 2:00s 1:00 D
+Rule Chatham 2007 max - Sep lastSun 2:45s 1:00 D
+Rule NZ 2008 max - Apr Sun>=1 2:00s 0 S
+Rule Chatham 2008 max - Apr Sun>=1 2:45s 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Pacific/Auckland 11:39:04 - LMT 1868 Nov 2
+ 11:30 NZ NZ%sT 1946 Jan 1
+ 12:00 NZ NZ%sT
+Zone Pacific/Chatham 12:13:48 - LMT 1957 Jan 1
+ 12:45 Chatham CHA%sT
+
+
+# Auckland Is
+# uninhabited; Maori and Moriori, colonial settlers, pastoralists, sealers,
+# and scientific personnel have wintered
+
+# Campbell I
+# minor whaling stations operated 1909/1914
+# scientific station operated 1941/1995;
+# previously whalers, sealers, pastoralists, and scientific personnel wintered
+# was probably like Pacific/Auckland
+
+###############################################################################
+
+
+# Niue
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Pacific/Niue -11:19:40 - LMT 1901 # Alofi
+ -11:20 - NUT 1951 # Niue Time
+ -11:30 - NUT 1978 Oct 1
+ -11:00 - NUT
+
+# Norfolk
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Pacific/Norfolk 11:11:52 - LMT 1901 # Kingston
+ 11:12 - NMT 1951 # Norfolk Mean Time
+ 11:30 - NFT # Norfolk Time
+
+# Palau (Belau)
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Pacific/Palau 8:57:56 - LMT 1901 # Koror
+ 9:00 - PWT # Palau Time
+
+# Papua New Guinea
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Pacific/Port_Moresby 9:48:40 - LMT 1880
+ 9:48:32 - PMMT 1895 # Port Moresby Mean Time
+ 10:00 - PGT # Papua New Guinea Time
+
+# Pitcairn
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Pacific/Pitcairn -8:40:20 - LMT 1901 # Adamstown
+ -8:30 - PNT 1998 Apr 27 00:00
+ -8:00 - PST # Pitcairn Standard Time
+
+# American Samoa
+Zone Pacific/Pago_Pago 12:37:12 - LMT 1879 Jul 5
+ -11:22:48 - LMT 1911
+ -11:30 - SAMT 1950 # Samoa Time
+ -11:00 - NST 1967 Apr # N=Nome
+ -11:00 - BST 1983 Nov 30 # B=Bering
+ -11:00 - SST # S=Samoa
+
+# Samoa
+Zone Pacific/Apia 12:33:04 - LMT 1879 Jul 5
+ -11:26:56 - LMT 1911
+ -11:30 - SAMT 1950 # Samoa Time
+ -11:00 - WST # Samoa Time
+
+# Solomon Is
+# excludes Bougainville, for which see Papua New Guinea
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Pacific/Guadalcanal 10:39:48 - LMT 1912 Oct # Honiara
+ 11:00 - SBT # Solomon Is Time
+
+# Tokelau Is
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Pacific/Fakaofo -11:24:56 - LMT 1901
+ -10:00 - TKT # Tokelau Time
+
+# Tonga
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Tonga 1999 only - Oct 7 2:00s 1:00 S
+Rule Tonga 2000 only - Mar 19 2:00s 0 -
+Rule Tonga 2000 2001 - Nov Sun>=1 2:00 1:00 S
+Rule Tonga 2001 2002 - Jan lastSun 2:00 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Pacific/Tongatapu 12:19:20 - LMT 1901
+ 12:20 - TOT 1941 # Tonga Time
+ 13:00 - TOT 1999
+ 13:00 Tonga TO%sT
+
+# Tuvalu
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Pacific/Funafuti 11:56:52 - LMT 1901
+ 12:00 - TVT # Tuvalu Time
+
+
+# US minor outlying islands
+
+# Howland, Baker
+# Howland was mined for guano by American companies 1857-1878 and British
+# 1886-1891; Baker was similar but exact dates are not known.
+# Inhabited by civilians 1935-1942; U.S. military bases 1943-1944;
+# uninhabited thereafter.
+# Howland observed Hawaii Standard Time (UTC-10:30) in 1937;
+# see page 206 of Elgen M. Long and Marie K. Long,
+# Amelia Earhart: the Mystery Solved, Simon & Schuster (2000).
+# So most likely Howland and Baker observed Hawaii Time from 1935
+# until they were abandoned after the war.
+
+# Jarvis
+# Mined for guano by American companies 1857-1879 and British 1883?-1891?.
+# Inhabited by civilians 1935-1942; IGY scientific base 1957-1958;
+# uninhabited thereafter.
+# no information; was probably like Pacific/Kiritimati
+
+# Johnston
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Pacific/Johnston -10:00 - HST
+
+# Kingman
+# uninhabited
+
+# Midway
+#
+# From Mark Brader (2005-01-23):
+# [Fallacies and Fantasies of Air Transport History, by R.E.G. Davies,
+# published 1994 by Paladwr Press, McLean, VA, USA; ISBN 0-9626483-5-3]
+# reproduced a Pan American Airways timeables from 1936, for their weekly
+# "Orient Express" flights between San Francisco and Manila, and connecting
+# flights to Chicago and the US East Coast. As it uses some time zone
+# designations that I've never seen before:....
+# Fri. 6:30A Lv. HONOLOLU (Pearl Harbor), H.I. H.L.T. Ar. 5:30P Sun.
+# " 3:00P Ar. MIDWAY ISLAND . . . . . . . . . M.L.T. Lv. 6:00A "
+#
+Zone Pacific/Midway -11:49:28 - LMT 1901
+ -11:00 - NST 1956 Jun 3
+ -11:00 1:00 NDT 1956 Sep 2
+ -11:00 - NST 1967 Apr # N=Nome
+ -11:00 - BST 1983 Nov 30 # B=Bering
+ -11:00 - SST # S=Samoa
+
+# Palmyra
+# uninhabited since World War II; was probably like Pacific/Kiritimati
+
+# Wake
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Pacific/Wake 11:06:28 - LMT 1901
+ 12:00 - WAKT # Wake Time
+
+
+# Vanuatu
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Vanuatu 1983 only - Sep 25 0:00 1:00 S
+Rule Vanuatu 1984 1991 - Mar Sun>=23 0:00 0 -
+Rule Vanuatu 1984 only - Oct 23 0:00 1:00 S
+Rule Vanuatu 1985 1991 - Sep Sun>=23 0:00 1:00 S
+Rule Vanuatu 1992 1993 - Jan Sun>=23 0:00 0 -
+Rule Vanuatu 1992 only - Oct Sun>=23 0:00 1:00 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Pacific/Efate 11:13:16 - LMT 1912 Jan 13 # Vila
+ 11:00 Vanuatu VU%sT # Vanuatu Time
+
+# Wallis and Futuna
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Pacific/Wallis 12:15:20 - LMT 1901
+ 12:00 - WFT # Wallis & Futuna Time
+
+###############################################################################
+
+# NOTES
+
+# This data is by no means authoritative; if you think you know better,
+# go ahead and edit the file (and please send any changes to
+# tz@elsie.nci.nih.gov for general use in the future).
+
+# From Paul Eggert (2006-03-22):
+# A good source for time zone historical data outside the U.S. is
+# Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition),
+# San Diego: ACS Publications, Inc. (2003).
+#
+# Gwillim Law writes that a good source
+# for recent time zone data is the International Air Transport
+# Association's Standard Schedules Information Manual (IATA SSIM),
+# published semiannually. Law sent in several helpful summaries
+# of the IATA's data after 1990.
+#
+# Except where otherwise noted, Shanks & Pottenger is the source for
+# entries through 1990, and IATA SSIM is the source for entries afterwards.
+#
+# Another source occasionally used is Edward W. Whitman, World Time Differences,
+# Whitman Publishing Co, 2 Niagara Av, Ealing, London (undated), which
+# I found in the UCLA library.
+#
+# A reliable and entertaining source about time zones is
+# Derek Howse, Greenwich time and longitude, Philip Wilson Publishers (1997).
+#
+# I invented the abbreviations marked `*' in the following table;
+# the rest are from earlier versions of this file, or from other sources.
+# Corrections are welcome!
+# std dst
+# LMT Local Mean Time
+# 8:00 WST WST Western Australia
+# 8:45 CWST CWST Central Western Australia*
+# 9:00 JST Japan
+# 9:30 CST CST Central Australia
+# 10:00 EST EST Eastern Australia
+# 10:00 ChST Chamorro
+# 10:30 LHST LHST Lord Howe*
+# 11:30 NZMT NZST New Zealand through 1945
+# 12:00 NZST NZDT New Zealand 1946-present
+# 12:45 CHAST CHADT Chatham*
+# -11:00 SST Samoa
+# -10:00 HST Hawaii
+# - 8:00 PST Pitcairn*
+#
+# See the `northamerica' file for Hawaii.
+# See the `southamerica' file for Easter I and the Galapagos Is.
+
+###############################################################################
+
+# Australia
+
+# From Paul Eggert (2005-12-08):
+# <a href="http://www.bom.gov.au/climate/averages/tables/dst_times.shtml">
+# Implementation Dates of Daylight Saving Time within Australia
+# </a> summarizes daylight saving issues in Australia.
+
+# From Arthur David Olson (2005-12-12):
+# <a href="http://www.lawlink.nsw.gov.au/lawlink/Corporate/ll_agdinfo.nsf/pages/community_relations_daylight_saving">
+# Lawlink NSW:Daylight Saving in New South Wales
+# </a> covers New South Wales in particular.
+
+# From John Mackin (1991-03-06):
+# We in Australia have _never_ referred to DST as `daylight' time.
+# It is called `summer' time. Now by a happy coincidence, `summer'
+# and `standard' happen to start with the same letter; hence, the
+# abbreviation does _not_ change...
+# The legislation does not actually define abbreviations, at least
+# in this State, but the abbreviation is just commonly taken to be the
+# initials of the phrase, and the legislation here uniformly uses
+# the phrase `summer time' and does not use the phrase `daylight
+# time'.
+# Announcers on the Commonwealth radio network, the ABC (for Australian
+# Broadcasting Commission), use the phrases `Eastern Standard Time'
+# or `Eastern Summer Time'. (Note, though, that as I say in the
+# current australasia file, there is really no such thing.) Announcers
+# on its overseas service, Radio Australia, use the same phrases
+# prefixed by the word `Australian' when referring to local times;
+# time announcements on that service, naturally enough, are made in UTC.
+
+# From Arthur David Olson (1992-03-08):
+# Given the above, what's chosen for year-round use is:
+# CST for any place operating at a GMTOFF of 9:30
+# WST for any place operating at a GMTOFF of 8:00
+# EST for any place operating at a GMTOFF of 10:00
+
+# From Chuck Soper (2006-06-01):
+# I recently found this Australian government web page on time zones:
+# <http://www.australia.gov.au/about-australia-13time>
+# And this government web page lists time zone names and abbreviations:
+# <http://www.bom.gov.au/climate/averages/tables/daysavtm.shtml>
+
+# From Paul Eggert (2001-04-05), summarizing a long discussion about "EST"
+# versus "AEST" etc.:
+#
+# I see the following points of dispute:
+#
+# * How important are unique time zone abbreviations?
+#
+# Here I tend to agree with the point (most recently made by Chris
+# Newman) that unique abbreviations should not be essential for proper
+# operation of software. We have other instances of ambiguity
+# (e.g. "IST" denoting both "Israel Standard Time" and "Indian
+# Standard Time"), and they are not likely to go away any time soon.
+# In the old days, some software mistakenly relied on unique
+# abbreviations, but this is becoming less true with time, and I don't
+# think it's that important to cater to such software these days.
+#
+# On the other hand, there is another motivation for unambiguous
+# abbreviations: it cuts down on human confusion. This is
+# particularly true for Australia, where "EST" can mean one thing for
+# time T and a different thing for time T plus 1 second.
+#
+# * Does the relevant legislation indicate which abbreviations should be used?
+#
+# Here I tend to think that things are a mess, just as they are in
+# many other countries. We Americans are currently disagreeing about
+# which abbreviation to use for the newly legislated Chamorro Standard
+# Time, for example.
+#
+# Personally, I would prefer to use common practice; I would like to
+# refer to legislation only for examples of common practice, or as a
+# tiebreaker.
+#
+# * Do Australians more often use "Eastern Daylight Time" or "Eastern
+# Summer Time"? Do they typically prefix the time zone names with
+# the word "Australian"?
+#
+# My own impression is that both "Daylight Time" and "Summer Time" are
+# common and are widely understood, but that "Summer Time" is more
+# popular; and that the leading "A" is also common but is omitted more
+# often than not. I just used AltaVista advanced search and got the
+# following count of page hits:
+#
+# 1,103 "Eastern Summer Time" AND domain:au
+# 971 "Australian Eastern Summer Time" AND domain:au
+# 613 "Eastern Daylight Time" AND domain:au
+# 127 "Australian Eastern Daylight Time" AND domain:au
+#
+# Here "Summer" seems quite a bit more popular than "Daylight",
+# particularly when we know the time zone is Australian and not US,
+# say. The "Australian" prefix seems to be popular for Eastern Summer
+# Time, but unpopular for Eastern Daylight Time.
+#
+# For abbreviations, tools like AltaVista are less useful because of
+# ambiguity. Many hits are not really time zones, unfortunately, and
+# many hits denote US time zones and not Australian ones. But here
+# are the hit counts anyway:
+#
+# 161,304 "EST" and domain:au
+# 25,156 "EDT" and domain:au
+# 18,263 "AEST" and domain:au
+# 10,416 "AEDT" and domain:au
+#
+# 14,538 "CST" and domain:au
+# 5,728 "CDT" and domain:au
+# 176 "ACST" and domain:au
+# 29 "ACDT" and domain:au
+#
+# 7,539 "WST" and domain:au
+# 68 "AWST" and domain:au
+#
+# This data suggest that Australians tend to omit the "A" prefix in
+# practice. The situation for "ST" versus "DT" is less clear, given
+# the ambiguities involved.
+#
+# * How do Australians feel about the abbreviations in the tz database?
+#
+# If you just count Australians on this list, I count 2 in favor and 3
+# against. One of the "against" votes (David Keegel) counseled delay,
+# saying that both AEST/AEDT and EST/EST are widely used and
+# understood in Australia.
+
+# From Paul Eggert (1995-12-19):
+# Shanks & Pottenger report 2:00 for all autumn changes in Australia and NZ.
+# Mark Prior writes that his newspaper
+# reports that NSW's fall 1995 change will occur at 2:00,
+# but Robert Elz says it's been 3:00 in Victoria since 1970
+# and perhaps the newspaper's `2:00' is referring to standard time.
+# For now we'll continue to assume 2:00s for changes since 1960.
+
+# From Eric Ulevik (1998-01-05):
+#
+# Here are some URLs to Australian time legislation. These URLs are stable,
+# and should probably be included in the data file. There are probably more
+# relevant entries in this database.
+#
+# NSW (including LHI and Broken Hill):
+# <a href="http://www.austlii.edu.au/au/legis/nsw/consol_act/sta1987137/index.html">
+# Standard Time Act 1987 (updated 1995-04-04)
+# </a>
+# ACT
+# <a href="http://www.austlii.edu.au/au/legis/act/consol_act/stasta1972279/index.html">
+# Standard Time and Summer Time Act 1972
+# </a>
+# SA
+# <a href="http://www.austlii.edu.au/au/legis/sa/consol_act/sta1898137/index.html">
+# Standard Time Act, 1898
+# </a>
+
+# From David Grosz (2005-06-13):
+# It was announced last week that Daylight Saving would be extended by
+# one week next year to allow for the 2006 Commonwealth Games.
+# Daylight Saving is now to end for next year only on the first Sunday
+# in April instead of the last Sunday in March.
+#
+# From Gwillim Law (2005-06-14):
+# I did some Googling and found that all of those states (and territory) plan
+# to extend DST together in 2006.
+# ACT: http://www.cmd.act.gov.au/mediareleases/fileread.cfm?file=86.txt
+# New South Wales: http://www.thecouriermail.news.com.au/common/story_page/0,5936,15538869%255E1702,00.html
+# South Australia: http://www.news.com.au/story/0,10117,15555031-1246,00.html
+# Tasmania: http://www.media.tas.gov.au/release.php?id=14772
+# Victoria: I wasn't able to find anything separate, but the other articles
+# allude to it.
+# But not Queensland
+# http://www.news.com.au/story/0,10117,15564030-1248,00.html.
+
+# Northern Territory
+
+# From George Shepherd via Simon Woodhead via Robert Elz (1991-03-06):
+# # The NORTHERN TERRITORY.. [ Courtesy N.T. Dept of the Chief Minister ]
+# # [ Nov 1990 ]
+# # N.T. have never utilised any DST due to sub-tropical/tropical location.
+# ...
+# Zone Australia/North 9:30 - CST
+
+# From Bradley White (1991-03-04):
+# A recent excerpt from an Australian newspaper...
+# the Northern Territory do[es] not have daylight saving.
+
+# Western Australia
+
+# From George Shepherd via Simon Woodhead via Robert Elz (1991-03-06):
+# # The state of WESTERN AUSTRALIA.. [ Courtesy W.A. dept Premier+Cabinet ]
+# # [ Nov 1990 ]
+# # W.A. suffers from a great deal of public and political opposition to
+# # DST in principle. A bill is brought before parliament in most years, but
+# # usually defeated either in the upper house, or in party caucus
+# # before reaching parliament.
+# ...
+# Zone Australia/West 8:00 AW %sST
+# ...
+# Rule AW 1974 only - Oct lastSun 2:00 1:00 D
+# Rule AW 1975 only - Mar Sun>=1 3:00 0 W
+# Rule AW 1983 only - Oct lastSun 2:00 1:00 D
+# Rule AW 1984 only - Mar Sun>=1 3:00 0 W
+
+# From Bradley White (1991-03-04):
+# A recent excerpt from an Australian newspaper...
+# Western Australia...do[es] not have daylight saving.
+
+# From John D. Newman via Bradley White (1991-11-02):
+# Western Australia is still on "winter time". Some DH in Sydney
+# rang me at home a few days ago at 6.00am. (He had just arrived at
+# work at 9.00am.)
+# W.A. is switching to Summer Time on Nov 17th just to confuse
+# everybody again.
+
+# From Arthur David Olson (1992-03-08):
+# The 1992 ending date used in the rules is a best guess;
+# it matches what was used in the past.
+
+# <a href="http://www.bom.gov.au/faq/faqgen.htm">
+# The Australian Bureau of Meteorology FAQ
+# </a> (1999-09-27) writes that Giles Meteorological Station uses
+# South Australian time even though it's located in Western Australia.
+
+# Queensland
+# From George Shepherd via Simon Woodhead via Robert Elz (1991-03-06):
+# # The state of QUEENSLAND.. [ Courtesy Qld. Dept Premier Econ&Trade Devel ]
+# # [ Dec 1990 ]
+# ...
+# Zone Australia/Queensland 10:00 AQ %sST
+# ...
+# Rule AQ 1971 only - Oct lastSun 2:00 1:00 D
+# Rule AQ 1972 only - Feb lastSun 3:00 0 E
+# Rule AQ 1989 max - Oct lastSun 2:00 1:00 D
+# Rule AQ 1990 max - Mar Sun>=1 3:00 0 E
+
+# From Bradley White (1989-12-24):
+# "Australia/Queensland" now observes daylight time (i.e. from
+# October 1989).
+
+# From Bradley White (1991-03-04):
+# A recent excerpt from an Australian newspaper...
+# ...Queensland...[has] agreed to end daylight saving
+# at 3am tomorrow (March 3)...
+
+# From John Mackin (1991-03-06):
+# I can certainly confirm for my part that Daylight Saving in NSW did in fact
+# end on Sunday, 3 March. I don't know at what hour, though. (It surprised
+# me.)
+
+# From Bradley White (1992-03-08):
+# ...there was recently a referendum in Queensland which resulted
+# in the experimental daylight saving system being abandoned. So, ...
+# ...
+# Rule QLD 1989 1991 - Oct lastSun 2:00 1:00 D
+# Rule QLD 1990 1992 - Mar Sun>=1 3:00 0 S
+# ...
+
+# From Arthur David Olson (1992-03-08):
+# The chosen rules the union of the 1971/1972 change and the 1989-1992 changes.
+
+# From Christopher Hunt (2006-11-21), after an advance warning
+# from Jesper Norgaard Welen (2006-11-01):
+# WA are trialing DST for three years.
+# <http://www.parliament.wa.gov.au/parliament/bills.nsf/9A1B183144403DA54825721200088DF1/$File/Bill175-1B.pdf>
+
+# From Rives McDow (2002-04-09):
+# The most interesting region I have found consists of three towns on the
+# southern coast.... South Australia observes daylight saving time; Western
+# Australia does not. The two states are one and a half hours apart. The
+# residents decided to forget about this nonsense of changing the clock so
+# much and set the local time 20 hours and 45 minutes from the
+# international date line, or right in the middle of the time of South
+# Australia and Western Australia....
+#
+# From Paul Eggert (2002-04-09):
+# This is confirmed by the section entitled
+# "What's the deal with time zones???" in
+# <http://www.earthsci.unimelb.edu.au/~awatkins/null.html>.
+#
+# From Alex Livingston (2006-12-07):
+# ... it was just on four years ago that I drove along the Eyre Highway,
+# which passes through eastern Western Australia close to the southern
+# coast of the continent.
+#
+# I paid particular attention to the time kept there. There can be no
+# dispute that UTC+08:45 was considered "the time" from the border
+# village just inside the border with South Australia to as far west
+# as just east of Caiguna. There can also be no dispute that Eucla is
+# the largest population centre in this zone....
+#
+# Now that Western Australia is observing daylight saving, the
+# question arose whether this part of the state would follow suit. I
+# just called the border village and confirmed that indeed they have,
+# meaning that they are now observing UTC+09:45.
+#
+# (2006-12-09):
+# I personally doubt that either experimentation with daylight saving
+# in WA or its introduction in SA had anything to do with the genesis
+# of this time zone. My hunch is that it's been around since well
+# before 1975. I remember seeing it noted on road maps decades ago.
+
+# From Paul Eggert (2006-12-15):
+# For lack of better info, assume the tradition dates back to the
+# introduction of standard time in 1895.
+
+
+# southeast Australia
+#
+# From Paul Eggert (2007-07-23):
+# Starting autumn 2008 Victoria, NSW, South Australia, Tasmania and the ACT
+# end DST the first Sunday in April and start DST the first Sunday in October.
+# http://www.theage.com.au/news/national/daylight-savings-to-span-six-months/2007/06/27/1182623966703.html
+
+
+# South Australia
+
+# From Bradley White (1991-03-04):
+# A recent excerpt from an Australian newspaper...
+# ...South Australia...[has] agreed to end daylight saving
+# at 3am tomorrow (March 3)...
+
+# From George Shepherd via Simon Woodhead via Robert Elz (1991-03-06):
+# # The state of SOUTH AUSTRALIA....[ Courtesy of S.A. Dept of Labour ]
+# # [ Nov 1990 ]
+# ...
+# Zone Australia/South 9:30 AS %sST
+# ...
+# Rule AS 1971 max - Oct lastSun 2:00 1:00 D
+# Rule AS 1972 1985 - Mar Sun>=1 3:00 0 C
+# Rule AS 1986 1990 - Mar Sun>=15 3:00 0 C
+# Rule AS 1991 max - Mar Sun>=1 3:00 0 C
+
+# From Bradley White (1992-03-11):
+# Recent correspondence with a friend in Adelaide
+# contained the following exchange: "Due to the Adelaide Festival,
+# South Australia delays setting back our clocks for a few weeks."
+
+# From Robert Elz (1992-03-13):
+# I heard that apparently (or at least, it appears that)
+# South Aus will have an extra 3 weeks daylight saving every even
+# numbered year (from 1990). That's when the Adelaide Festival
+# is on...
+
+# From Robert Elz (1992-03-16, 00:57:07 +1000):
+# DST didn't end in Adelaide today (yesterday)....
+# But whether it's "4th Sunday" or "2nd last Sunday" I have no idea whatever...
+# (it's just as likely to be "the Sunday we pick for this year"...).
+
+# From Bradley White (1994-04-11):
+# If Sun, 15 March, 1992 was at +1030 as kre asserts, but yet Sun, 20 March,
+# 1994 was at +0930 as John Connolly's customer seems to assert, then I can
+# only conclude that the actual rule is more complicated....
+
+# From John Warburton (1994-10-07):
+# The new Daylight Savings dates for South Australia ...
+# was gazetted in the Government Hansard on Sep 26 1994....
+# start on last Sunday in October and end in last sunday in March.
+
+# From Paul Eggert (2007-07-23):
+# See "southeast Australia" above for 2008 and later.
+
+# Tasmania
+
+# The rules for 1967 through 1991 were reported by George Shepherd
+# via Simon Woodhead via Robert Elz (1991-03-06):
+# # The state of TASMANIA.. [Courtesy Tasmanian Dept of Premier + Cabinet ]
+# # [ Nov 1990 ]
+
+# From Bill Hart via Guy Harris (1991-10-10):
+# Oh yes, the new daylight savings rules are uniquely tasmanian, we have
+# 6 weeks a year now when we are out of sync with the rest of Australia
+# (but nothing new about that).
+
+# From Alex Livingston (1999-10-04):
+# I heard on the ABC (Australian Broadcasting Corporation) radio news on the
+# (long) weekend that Tasmania, which usually goes its own way in this regard,
+# has decided to join with most of NSW, the ACT, and most of Victoria
+# (Australia) and start daylight saving on the last Sunday in August in 2000
+# instead of the first Sunday in October.
+
+# Sim Alam (2000-07-03) reported a legal citation for the 2000/2001 rules:
+# http://www.thelaw.tas.gov.au/fragview/42++1968+GS3A@EN+2000070300
+
+# From Paul Eggert (2007-07-23):
+# See "southeast Australia" above for 2008 and later.
+
+# Victoria
+
+# The rules for 1971 through 1991 were reported by George Shepherd
+# via Simon Woodhead via Robert Elz (1991-03-06):
+# # The state of VICTORIA.. [ Courtesy of Vic. Dept of Premier + Cabinet ]
+# # [ Nov 1990 ]
+
+# From Scott Harrington (2001-08-29):
+# On KQED's "City Arts and Lectures" program last night I heard an
+# interesting story about daylight savings time. Dr. John Heilbron was
+# discussing his book "The Sun in the Church: Cathedrals as Solar
+# Observatories"[1], and in particular the Shrine of Remembrance[2] located
+# in Melbourne, Australia.
+#
+# Apparently the shrine's main purpose is a beam of sunlight which
+# illuminates a special spot on the floor at the 11th hour of the 11th day
+# of the 11th month (Remembrance Day) every year in memory of Australia's
+# fallen WWI soldiers. And if you go there on Nov. 11, at 11am local time,
+# you will indeed see the sunbeam illuminate the special spot at the
+# expected time.
+#
+# However, that is only because of some special mirror contraption that had
+# to be employed, since due to daylight savings time, the true solar time of
+# the remembrance moment occurs one hour later (or earlier?). Perhaps
+# someone with more information on this jury-rig can tell us more.
+#
+# [1] http://www.hup.harvard.edu/catalog/HEISUN.html
+# [2] http://www.shrine.org.au
+
+# From Paul Eggert (2007-07-23):
+# See "southeast Australia" above for 2008 and later.
+
+# New South Wales
+
+# From Arthur David Olson:
+# New South Wales and subjurisdictions have their own ideas of a fun time.
+# Based on law library research by John Mackin,
+# who notes:
+# In Australia, time is not legislated federally, but rather by the
+# individual states. Thus, while such terms as ``Eastern Standard Time''
+# [I mean, of course, Australian EST, not any other kind] are in common
+# use, _they have NO REAL MEANING_, as they are not defined in the
+# legislation. This is very important to understand.
+# I have researched New South Wales time only...
+
+# From Eric Ulevik (1999-05-26):
+# DST will start in NSW on the last Sunday of August, rather than the usual
+# October in 2000. [See: Matthew Moore,
+# <a href="http://www.smh.com.au/news/9905/26/pageone/pageone4.html">
+# Two months more daylight saving
+# </a>
+# Sydney Morning Herald (1999-05-26).]
+
+# From Paul Eggert (1999-09-27):
+# See the following official NSW source:
+# <a href="http://dir.gis.nsw.gov.au/cgi-bin/genobject/document/other/daylightsaving/tigGmZ">
+# Daylight Saving in New South Wales.
+# </a>
+#
+# Narrabri Shire (NSW) council has announced it will ignore the extension of
+# daylight saving next year. See:
+# <a href="http://abc.net.au/news/regionals/neweng/monthly/regeng-22jul1999-1.htm">
+# Narrabri Council to ignore daylight saving
+# </a> (1999-07-22). For now, we'll wait to see if this really happens.
+#
+# Victoria will following NSW. See:
+# <a href="http://abc.net.au/local/news/olympics/1999/07/item19990728112314_1.htm">
+# Vic to extend daylight saving
+# </a> (1999-07-28).
+#
+# However, South Australia rejected the DST request. See:
+# <a href="http://abc.net.au/news/olympics/1999/07/item19990719151754_1.htm">
+# South Australia rejects Olympics daylight savings request
+# </a> (1999-07-19).
+#
+# Queensland also will not observe DST for the Olympics. See:
+# <a href="http://abc.net.au/news/olympics/1999/06/item19990601114608_1.htm">
+# Qld says no to daylight savings for Olympics
+# </a> (1999-06-01), which quotes Queensland Premier Peter Beattie as saying
+# ``Look you've got to remember in my family when this came up last time
+# I voted for it, my wife voted against it and she said to me it's all very
+# well for you, you don't have to worry about getting the children out of
+# bed, getting them to school, getting them to sleep at night.
+# I've been through all this argument domestically...my wife rules.''
+#
+# Broken Hill will stick with South Australian time in 2000. See:
+# <a href="http://abc.net.au/news/regionals/brokenh/monthly/regbrok-21jul1999-6.htm">
+# Broken Hill to be behind the times
+# </a> (1999-07-21).
+
+# IATA SSIM (1998-09) says that the spring 2000 change for Australian
+# Capital Territory, New South Wales except Lord Howe Island and Broken
+# Hill, and Victoria will be August 27, presumably due to the Sydney Olympics.
+
+# From Eric Ulevik, referring to Sydney's Sun Herald (2000-08-13), page 29:
+# The Queensland Premier Peter Beattie is encouraging northern NSW
+# towns to use Queensland time.
+
+# From Paul Eggert (2007-07-23):
+# See "southeast Australia" above for 2008 and later.
+
+# Yancowinna
+
+# From John Mackin (1989-01-04):
+# `Broken Hill' means the County of Yancowinna.
+
+# From George Shepherd via Simon Woodhead via Robert Elz (1991-03-06):
+# # YANCOWINNA.. [ Confirmation courtesy of Broken Hill Postmaster ]
+# # [ Dec 1990 ]
+# ...
+# # Yancowinna uses Central Standard Time, despite [its] location on the
+# # New South Wales side of the S.A. border. Most business and social dealings
+# # are with CST zones, therefore CST is legislated by local government
+# # although the switch to Summer Time occurs in line with N.S.W. There have
+# # been years when this did not apply, but the historical data is not
+# # presently available.
+# Zone Australia/Yancowinna 9:30 AY %sST
+# ...
+# Rule AY 1971 1985 - Oct lastSun 2:00 1:00 D
+# Rule AY 1972 only - Feb lastSun 3:00 0 C
+# [followed by other Rules]
+
+# Lord Howe Island
+
+# From George Shepherd via Simon Woodhead via Robert Elz (1991-03-06):
+# LHI... [ Courtesy of Pauline Van Winsen ]
+# [ Dec 1990 ]
+# Lord Howe Island is located off the New South Wales coast, and is half an
+# hour ahead of NSW time.
+
+# From James Lonergan, Secretary, Lord Howe Island Board (2000-01-27):
+# Lord Howe Island summer time in 2000/2001 will commence on the same
+# date as the rest of NSW (i.e. 2000-08-27). For your information the
+# Lord Howe Island Board (controlling authority for the Island) is
+# seeking the community's views on various options for summer time
+# arrangements on the Island, e.g. advance clocks by 1 full hour
+# instead of only 30 minutes. Dependant on the wishes of residents
+# the Board may approach the NSW government to change the existing
+# arrangements. The starting date for summer time on the Island will
+# however always coincide with the rest of NSW.
+
+# From James Lonergan, Secretary, Lord Howe Island Board (2000-10-25):
+# Lord Howe Island advances clocks by 30 minutes during DST in NSW and retards
+# clocks by 30 minutes when DST finishes. Since DST was most recently
+# introduced in NSW, the "changeover" time on the Island has been 02:00 as
+# shown on clocks on LHI. I guess this means that for 30 minutes at the start
+# of DST, LHI is actually 1 hour ahead of the rest of NSW.
+
+# From Paul Eggert (2006-03-22):
+# For Lord Howe dates we use Shanks & Pottenger through 1989, and
+# Lonergan thereafter. For times we use Lonergan.
+
+# From Paul Eggert (2007-07-23):
+# See "southeast Australia" above for 2008 and later.
+
+###############################################################################
+
+# New Zealand
+
+# From Mark Davies (1990-10-03):
+# the 1989/90 year was a trial of an extended "daylight saving" period.
+# This trial was deemed successful and the extended period adopted for
+# subsequent years (with the addition of a further week at the start).
+# source -- phone call to Ministry of Internal Affairs Head Office.
+
+# From George Shepherd via Simon Woodhead via Robert Elz (1991-03-06):
+# # The Country of New Zealand (Australia's east island -) Gee they hate that!
+# # or is Australia the west island of N.Z.
+# # [ courtesy of Geoff Tribble.. Auckland N.Z. ]
+# # [ Nov 1990 ]
+# ...
+# Rule NZ 1974 1988 - Oct lastSun 2:00 1:00 D
+# Rule NZ 1989 max - Oct Sun>=1 2:00 1:00 D
+# Rule NZ 1975 1989 - Mar Sun>=1 3:00 0 S
+# Rule NZ 1990 max - Mar lastSun 3:00 0 S
+# ...
+# Zone NZ 12:00 NZ NZ%sT # New Zealand
+# Zone NZ-CHAT 12:45 - NZ-CHAT # Chatham Island
+
+# From Arthur David Olson (1992-03-08):
+# The chosen rules use the Davies October 8 values for the start of DST in 1989
+# rather than the October 1 value.
+
+# From Paul Eggert (1995-12-19);
+# Shank & Pottenger report 2:00 for all autumn changes in Australia and NZ.
+# Robert Uzgalis writes that the New Zealand Daylight
+# Savings Time Order in Council dated 1990-06-18 specifies 2:00 standard
+# time on both the first Sunday in October and the third Sunday in March.
+# As with Australia, we'll assume the tradition is 2:00s, not 2:00.
+#
+# From Paul Eggert (2006-03-22):
+# The Department of Internal Affairs (DIA) maintains a brief history,
+# as does Carol Squires; see tz-link.htm for the full references.
+# Use these sources in preference to Shanks & Pottenger.
+#
+# For Chatham, IATA SSIM (1991/1999) gives the NZ rules but with
+# transitions at 2:45 local standard time; this confirms that Chatham
+# is always exactly 45 minutes ahead of Auckland.
+
+# From Colin Sharples (2007-04-30):
+# DST will now start on the last Sunday in September, and end on the
+# first Sunday in April. The changes take effect this year, meaning
+# that DST will begin on 2007-09-30 2008-04-06.
+# http://www.dia.govt.nz/diawebsite.nsf/wpg_URL/Services-Daylight-Saving-Daylight-saving-to-be-extended
+
+###############################################################################
+
+
+# Fiji
+
+# Howse writes (p 153) that in 1879 the British governor of Fiji
+# enacted an ordinance standardizing the islands on Antipodean Time
+# instead of the American system (which was one day behind).
+
+# From Rives McDow (1998-10-08):
+# Fiji will introduce DST effective 0200 local time, 1998-11-01
+# until 0300 local time 1999-02-28. Each year the DST period will
+# be from the first Sunday in November until the last Sunday in February.
+
+# From Paul Eggert (2000-01-08):
+# IATA SSIM (1999-09) says DST ends 0100 local time. Go with McDow.
+
+# From the BBC World Service (1998-10-31 11:32 UTC):
+# The Fijiian government says the main reasons for the time change is to
+# improve productivity and reduce road accidents. But correspondents say it
+# also hopes the move will boost Fiji's ability to compete with other pacific
+# islands in the effort to attract tourists to witness the dawning of the new
+# millenium.
+
+# http://www.fiji.gov.fj/press/2000_09/2000_09_13-05.shtml (2000-09-13)
+# reports that Fiji has discontinued DST.
+
+# Johnston
+
+# Johnston data is from usno1995.
+
+
+# Kiribati
+
+# From Paul Eggert (1996-01-22):
+# Today's _Wall Street Journal_ (page 1) reports that Kiribati
+# ``declared it the same day throught the country as of Jan. 1, 1995''
+# as part of the competition to be first into the 21st century.
+
+
+# Kwajalein
+
+# In comp.risks 14.87 (26 August 1993), Peter Neumann writes:
+# I wonder what happened in Kwajalein, where there was NO Friday,
+# 1993-08-20. Thursday night at midnight Kwajalein switched sides with
+# respect to the International Date Line, to rejoin its fellow islands,
+# going from 11:59 p.m. Thursday to 12:00 m. Saturday in a blink.
+
+
+# N Mariana Is, Guam
+
+# Howse writes (p 153) ``The Spaniards, on the other hand, reached the
+# Philippines and the Ladrones from America,'' and implies that the Ladrones
+# (now called the Marianas) kept American date for quite some time.
+# For now, we assume the Ladrones switched at the same time as the Philippines;
+# see Asia/Manila.
+
+# US Public Law 106-564 (2000-12-23) made UTC+10 the official standard time,
+# under the name "Chamorro Standard Time". There is no official abbreviation,
+# but Congressman Robert A. Underwood, author of the bill that became law,
+# wrote in a press release (2000-12-27) that he will seek the use of "ChST".
+
+
+# Micronesia
+
+# Alan Eugene Davis writes (1996-03-16),
+# ``I am certain, having lived there for the past decade, that "Truk"
+# (now properly known as Chuuk) ... is in the time zone GMT+10.''
+#
+# Shanks & Pottenger write that Truk switched from UTC+10 to UTC+11
+# on 1978-10-01; ignore this for now.
+
+# From Paul Eggert (1999-10-29):
+# The Federated States of Micronesia Visitors Board writes in
+# <a href="http://www.fsmgov.org/info/clocks.html">
+# The Federated States of Micronesia - Visitor Information
+# </a> (1999-01-26)
+# that Truk and Yap are UTC+10, and Ponape and Kosrae are UTC+11.
+# We don't know when Kosrae switched from UTC+12; assume January 1 for now.
+
+
+# Midway
+
+# From Charles T O'Connor, KMTH DJ (1956),
+# quoted in the KTMH section of the Radio Heritage Collection
+# <http://radiodx.com/spdxr/KMTH.htm> (2002-12-31):
+# For the past two months we've been on what is known as Daylight
+# Saving Time. This time has put us on air at 5am in the morning,
+# your time down there in New Zealand. Starting September 2, 1956
+# we'll again go back to Standard Time. This'll mean that we'll go to
+# air at 6am your time.
+#
+# From Paul Eggert (2003-03-23):
+# We don't know the date of that quote, but we'll guess they
+# started DST on June 3. Possibly DST was observed other years
+# in Midway, but we have no record of it.
+
+
+# Pitcairn
+
+# From Rives McDow (1999-11-08):
+# A Proclamation was signed by the Governor of Pitcairn on the 27th March 1998
+# with regard to Pitcairn Standard Time. The Proclamation is as follows.
+#
+# The local time for general purposes in the Islands shall be
+# Co-ordinated Universal time minus 8 hours and shall be known
+# as Pitcairn Standard Time.
+#
+# ... I have also seen Pitcairn listed as UTC minus 9 hours in several
+# references, and can only assume that this was an error in interpretation
+# somehow in light of this proclamation.
+
+# From Rives McDow (1999-11-09):
+# The Proclamation regarding Pitcairn time came into effect on 27 April 1998
+# ... at midnight.
+
+# From Howie Phelps (1999-11-10), who talked to a Pitcairner via shortwave:
+# Betty Christian told me yesterday that their local time is the same as
+# Pacific Standard Time. They used to be 1/2 hour different from us here in
+# Sacramento but it was changed a couple of years ago.
+
+
+# Samoa
+
+# Howse writes (p 153, citing p 10 of the 1883-11-18 New York Herald)
+# that in 1879 the King of Samoa decided to change
+# ``the date in his kingdom from the Antipodean to the American system,
+# ordaining -- by a masterpiece of diplomatic flattery -- that
+# the Fourth of July should be celebrated twice in that year.''
+
+
+# Tonga
+
+# From Paul Eggert (1996-01-22):
+# Today's _Wall Street Journal_ (p 1) reports that ``Tonga has been plotting
+# to sneak ahead of [New Zealanders] by introducing daylight-saving time.''
+# Since Kiribati has moved the Date Line it's not clear what Tonga will do.
+
+# Don Mundell writes in the 1997-02-20 Tonga Chronicle
+# <a href="http://www.tongatapu.net.to/tonga/homeland/timebegins.htm">
+# How Tonga became `The Land where Time Begins'
+# </a>:
+
+# Until 1941 Tonga maintained a standard time 50 minutes ahead of NZST
+# 12 hours and 20 minutes ahead of GMT. When New Zealand adjusted its
+# standard time in 1940s, Tonga had the choice of subtracting from its
+# local time to come on the same standard time as New Zealand or of
+# advancing its time to maintain the differential of 13 degrees
+# (approximately 50 minutes ahead of New Zealand time).
+#
+# Because His Majesty King Taufa'ahau Tupou IV, then Crown Prince
+# Tungi, preferred to ensure Tonga's title as the land where time
+# begins, the Legislative Assembly approved the latter change.
+#
+# But some of the older, more conservative members from the outer
+# islands objected. "If at midnight on Dec. 31, we move ahead 40
+# minutes, as your Royal Highness wishes, what becomes of the 40
+# minutes we have lost?"
+#
+# The Crown Prince, presented an unanswerable argument: "Remember that
+# on the World Day of Prayer, you would be the first people on Earth
+# to say your prayers in the morning."
+
+# From Paul Eggert (2006-03-22):
+# Shanks & Pottenger say the transition was on 1968-10-01; go with Mundell.
+
+# From Eric Ulevik (1999-05-03):
+# Tonga's director of tourism, who is also secretary of the National Millenium
+# Committee, has a plan to get Tonga back in front.
+# He has proposed a one-off move to tropical daylight saving for Tonga from
+# October to March, which has won approval in principle from the Tongan
+# Government.
+
+# From Steffen Thorsen (1999-09-09):
+# * Tonga will introduce DST in November
+#
+# I was given this link by John Letts:
+# <a hef="http://news.bbc.co.uk/hi/english/world/asia-pacific/newsid_424000/424764.stm">
+# http://news.bbc.co.uk/hi/english/world/asia-pacific/newsid_424000/424764.stm
+# </a>
+#
+# I have not been able to find exact dates for the transition in November
+# yet. By reading this article it seems like Fiji will be 14 hours ahead
+# of UTC as well, but as far as I know Fiji will only be 13 hours ahead
+# (12 + 1 hour DST).
+
+# From Arthur David Olson (1999-09-20):
+# According to <a href="http://www.tongaonline.com/news/sept1799.html>
+# http://www.tongaonline.com/news/sept1799.html
+# </a>:
+# "Daylight Savings Time will take effect on Oct. 2 through April 15, 2000
+# and annually thereafter from the first Saturday in October through the
+# third Saturday of April. Under the system approved by Privy Council on
+# Sept. 10, clocks must be turned ahead one hour on the opening day and
+# set back an hour on the closing date."
+# Alas, no indication of the time of day.
+
+# From Rives McDow (1999-10-06):
+# Tonga started its Daylight Saving on Saturday morning October 2nd at 0200am.
+# Daylight Saving ends on April 16 at 0300am which is Sunday morning.
+
+# From Steffen Thorsen (2000-10-31):
+# Back in March I found a notice on the website http://www.tongaonline.com
+# that Tonga changed back to standard time one month early, on March 19
+# instead of the original reported date April 16. Unfortunately, the article
+# is no longer available on the site, and I did not make a copy of the
+# text, and I have forgotten to report it here.
+# (Original URL was: http://www.tongaonline.com/news/march162000.htm )
+
+# From Rives McDow (2000-12-01):
+# Tonga is observing DST as of 2000-11-04 and will stop on 2001-01-27.
+
+# From Sione Moala-Mafi (2001-09-20) via Rives McDow:
+# At 2:00am on the first Sunday of November, the standard time in the Kingdom
+# shall be moved forward by one hour to 3:00am. At 2:00am on the last Sunday
+# of January the standard time in the Kingdom shall be moved backward by one
+# hour to 1:00am.
+
+# From Pulu 'Anau (2002-11-05):
+# The law was for 3 years, supposedly to get renewed. It wasn't.
+
+
+# Wake
+
+# From Vernice Anderson, Personal Secretary to Philip Jessup,
+# US Ambassador At Large (oral history interview, 1971-02-02):
+#
+# Saturday, the 14th [of October, 1950] -- ... The time was all the
+# more confusing at that point, because we had crossed the
+# International Date Line, thus getting two Sundays. Furthermore, we
+# discovered that Wake Island had two hours of daylight saving time
+# making calculation of time in Washington difficult if not almost
+# impossible.
+#
+# http://www.trumanlibrary.org/wake/meeting.htm
+
+# From Paul Eggert (2003-03-23):
+# We have no other report of DST in Wake Island, so omit this info for now.
+
+###############################################################################
+
+# The International Date Line
+
+# From Gwillim Law (2000-01-03):
+#
+# The International Date Line is not defined by any international standard,
+# convention, or treaty. Mapmakers are free to draw it as they please.
+# Reputable mapmakers will simply ensure that every point of land appears on
+# the correct side of the IDL, according to the date legally observed there.
+#
+# When Kiribati adopted a uniform date in 1995, thereby moving the Phoenix and
+# Line Islands to the west side of the IDL (or, if you prefer, moving the IDL
+# to the east side of the Phoenix and Line Islands), I suppose that most
+# mapmakers redrew the IDL following the boundary of Kiribati. Even that line
+# has a rather arbitrary nature. The straight-line boundaries between Pacific
+# island nations that are shown on many maps are based on an international
+# convention, but are not legally binding national borders.... The date is
+# governed by the IDL; therefore, even on the high seas, there may be some
+# places as late as fourteen hours later than UTC. And, since the IDL is not
+# an international standard, there are some places on the high seas where the
+# correct date is ambiguous.
+
+# From Wikipedia <http://en.wikipedia.org/wiki/Time_zone> (2005-08-31):
+# Before 1920, all ships kept local apparent time on the high seas by setting
+# their clocks at night or at the morning sight so that, given the ship's
+# speed and direction, it would be 12 o'clock when the Sun crossed the ship's
+# meridian (12 o'clock = local apparent noon). During 1917, at the
+# Anglo-French Conference on Time-keeping at Sea, it was recommended that all
+# ships, both military and civilian, should adopt hourly standard time zones
+# on the high seas. Whenever a ship was within the territorial waters of any
+# nation it would use that nation's standard time. The captain was permitted
+# to change his ship's clocks at a time of his choice following his ship's
+# entry into another zone time--he often chose midnight. These zones were
+# adopted by all major fleets between 1920 and 1925 but not by many
+# independent merchant ships until World War II.
+
+# From Paul Eggert, using references suggested by Oscar van Vlijmen
+# (2005-03-20):
+#
+# The American Practical Navigator (2002)
+# <http://pollux.nss.nima.mil/pubs/pubs_j_apn_sections.html?rid=187>
+# talks only about the 180-degree meridian with respect to ships in
+# international waters; it ignores the international date line.
diff --git a/libkcal/libical/tzdata/backward b/libkcal/libical/tzdata/backward
new file mode 100644
index 00000000..a65991c2
--- /dev/null
+++ b/libkcal/libical/tzdata/backward
@@ -0,0 +1,112 @@
+# @(#)backward 8.6
+
+# This file provides links between current names for time zones
+# and their old names. Many names changed in late 1993.
+
+Link Africa/Asmara Africa/Asmera
+Link Africa/Bamako Africa/Timbuktu
+Link America/Argentina/Catamarca America/Argentina/ComodRivadavia
+Link America/Adak America/Atka
+Link America/Argentina/Buenos_Aires America/Buenos_Aires
+Link America/Argentina/Catamarca America/Catamarca
+Link America/Atikokan America/Coral_Harbour
+Link America/Argentina/Cordoba America/Cordoba
+Link America/Tijuana America/Ensenada
+Link America/Indiana/Indianapolis America/Fort_Wayne
+Link America/Indiana/Indianapolis America/Indianapolis
+Link America/Argentina/Jujuy America/Jujuy
+Link America/Indiana/Knox America/Knox_IN
+Link America/Kentucky/Louisville America/Louisville
+Link America/Argentina/Mendoza America/Mendoza
+Link America/Rio_Branco America/Porto_Acre
+Link America/Argentina/Cordoba America/Rosario
+Link America/St_Thomas America/Virgin
+Link Asia/Ashgabat Asia/Ashkhabad
+Link Asia/Chongqing Asia/Chungking
+Link Asia/Dhaka Asia/Dacca
+Link Asia/Kolkata Asia/Calcutta
+Link Asia/Macau Asia/Macao
+Link Asia/Jerusalem Asia/Tel_Aviv
+Link Asia/Ho_Chi_Minh Asia/Saigon
+Link Asia/Thimphu Asia/Thimbu
+Link Asia/Makassar Asia/Ujung_Pandang
+Link Asia/Ulaanbaatar Asia/Ulan_Bator
+Link Atlantic/Faroe Atlantic/Faeroe
+Link Europe/Oslo Atlantic/Jan_Mayen
+Link Australia/Sydney Australia/ACT
+Link Australia/Sydney Australia/Canberra
+Link Australia/Lord_Howe Australia/LHI
+Link Australia/Sydney Australia/NSW
+Link Australia/Darwin Australia/North
+Link Australia/Brisbane Australia/Queensland
+Link Australia/Adelaide Australia/South
+Link Australia/Hobart Australia/Tasmania
+Link Australia/Melbourne Australia/Victoria
+Link Australia/Perth Australia/West
+Link Australia/Broken_Hill Australia/Yancowinna
+Link America/Rio_Branco Brazil/Acre
+Link America/Noronha Brazil/DeNoronha
+Link America/Sao_Paulo Brazil/East
+Link America/Manaus Brazil/West
+Link America/Halifax Canada/Atlantic
+Link America/Winnipeg Canada/Central
+Link America/Regina Canada/East-Saskatchewan
+Link America/Toronto Canada/Eastern
+Link America/Edmonton Canada/Mountain
+Link America/St_Johns Canada/Newfoundland
+Link America/Vancouver Canada/Pacific
+Link America/Regina Canada/Saskatchewan
+Link America/Whitehorse Canada/Yukon
+Link America/Santiago Chile/Continental
+Link Pacific/Easter Chile/EasterIsland
+Link America/Havana Cuba
+Link Africa/Cairo Egypt
+Link Europe/Dublin Eire
+Link Europe/London Europe/Belfast
+Link Europe/Chisinau Europe/Tiraspol
+Link Europe/London GB
+Link Europe/London GB-Eire
+Link Etc/GMT GMT+0
+Link Etc/GMT GMT-0
+Link Etc/GMT GMT0
+Link Etc/GMT Greenwich
+Link Asia/Hong_Kong Hongkong
+Link Atlantic/Reykjavik Iceland
+Link Asia/Tehran Iran
+Link Asia/Jerusalem Israel
+Link America/Jamaica Jamaica
+Link Asia/Tokyo Japan
+Link Pacific/Kwajalein Kwajalein
+Link Africa/Tripoli Libya
+Link America/Tijuana Mexico/BajaNorte
+Link America/Mazatlan Mexico/BajaSur
+Link America/Mexico_City Mexico/General
+Link Pacific/Auckland NZ
+Link Pacific/Chatham NZ-CHAT
+Link America/Denver Navajo
+Link Asia/Shanghai PRC
+Link Pacific/Pago_Pago Pacific/Samoa
+Link Pacific/Truk Pacific/Yap
+Link Europe/Warsaw Poland
+Link Europe/Lisbon Portugal
+Link Asia/Taipei ROC
+Link Asia/Seoul ROK
+Link Asia/Singapore Singapore
+Link Europe/Istanbul Turkey
+Link Etc/UCT UCT
+Link America/Anchorage US/Alaska
+Link America/Adak US/Aleutian
+Link America/Phoenix US/Arizona
+Link America/Chicago US/Central
+Link America/Indiana/Indianapolis US/East-Indiana
+Link America/New_York US/Eastern
+Link Pacific/Honolulu US/Hawaii
+Link America/Indiana/Knox US/Indiana-Starke
+Link America/Detroit US/Michigan
+Link America/Denver US/Mountain
+Link America/Los_Angeles US/Pacific
+Link Pacific/Pago_Pago US/Samoa
+Link Etc/UTC UTC
+Link Etc/UTC Universal
+Link Europe/Moscow W-SU
+Link Etc/UTC Zulu
diff --git a/libkcal/libical/tzdata/etcetera b/libkcal/libical/tzdata/etcetera
new file mode 100644
index 00000000..cddbe8a2
--- /dev/null
+++ b/libkcal/libical/tzdata/etcetera
@@ -0,0 +1,80 @@
+# @(#)etcetera 8.1
+
+# These entries are mostly present for historical reasons, so that
+# people in areas not otherwise covered by the tz files could "zic -l"
+# to a time zone that was right for their area. These days, the
+# tz files cover almost all the inhabited world, and the only practical
+# need now for the entries that are not on UTC are for ships at sea
+# that cannot use POSIX TZ settings.
+
+Zone Etc/GMT 0 - GMT
+Zone Etc/UTC 0 - UTC
+Zone Etc/UCT 0 - UCT
+
+# The following link uses older naming conventions,
+# but it belongs here, not in the file `backward',
+# as functions like gmtime load the "GMT" file to handle leap seconds properly.
+# We want this to work even on installations that omit the other older names.
+Link Etc/GMT GMT
+
+Link Etc/UTC Etc/Universal
+Link Etc/UTC Etc/Zulu
+
+Link Etc/GMT Etc/Greenwich
+Link Etc/GMT Etc/GMT-0
+Link Etc/GMT Etc/GMT+0
+Link Etc/GMT Etc/GMT0
+
+# We use POSIX-style signs in the Zone names and the output abbreviations,
+# even though this is the opposite of what many people expect.
+# POSIX has positive signs west of Greenwich, but many people expect
+# positive signs east of Greenwich. For example, TZ='Etc/GMT+4' uses
+# the abbreviation "GMT+4" and corresponds to 4 hours behind UTC
+# (i.e. west of Greenwich) even though many people would expect it to
+# mean 4 hours ahead of UTC (i.e. east of Greenwich).
+#
+# In the draft 5 of POSIX 1003.1-200x, the angle bracket notation
+# (which is not yet supported by the tz code) allows for
+# TZ='<GMT-4>+4'; if you want time zone abbreviations conforming to
+# ISO 8601 you can use TZ='<-0400>+4'. Thus the commonly-expected
+# offset is kept within the angle bracket (and is used for display)
+# while the POSIX sign is kept outside the angle bracket (and is used
+# for calculation).
+#
+# Do not use a TZ setting like TZ='GMT+4', which is four hours behind
+# GMT but uses the completely misleading abbreviation "GMT".
+
+# Earlier incarnations of this package were not POSIX-compliant,
+# and had lines such as
+# Zone GMT-12 -12 - GMT-1200
+# We did not want things to change quietly if someone accustomed to the old
+# way does a
+# zic -l GMT-12
+# so we moved the names into the Etc subdirectory.
+
+Zone Etc/GMT-14 14 - GMT-14 # 14 hours ahead of GMT
+Zone Etc/GMT-13 13 - GMT-13
+Zone Etc/GMT-12 12 - GMT-12
+Zone Etc/GMT-11 11 - GMT-11
+Zone Etc/GMT-10 10 - GMT-10
+Zone Etc/GMT-9 9 - GMT-9
+Zone Etc/GMT-8 8 - GMT-8
+Zone Etc/GMT-7 7 - GMT-7
+Zone Etc/GMT-6 6 - GMT-6
+Zone Etc/GMT-5 5 - GMT-5
+Zone Etc/GMT-4 4 - GMT-4
+Zone Etc/GMT-3 3 - GMT-3
+Zone Etc/GMT-2 2 - GMT-2
+Zone Etc/GMT-1 1 - GMT-1
+Zone Etc/GMT+1 -1 - GMT+1
+Zone Etc/GMT+2 -2 - GMT+2
+Zone Etc/GMT+3 -3 - GMT+3
+Zone Etc/GMT+4 -4 - GMT+4
+Zone Etc/GMT+5 -5 - GMT+5
+Zone Etc/GMT+6 -6 - GMT+6
+Zone Etc/GMT+7 -7 - GMT+7
+Zone Etc/GMT+8 -8 - GMT+8
+Zone Etc/GMT+9 -9 - GMT+9
+Zone Etc/GMT+10 -10 - GMT+10
+Zone Etc/GMT+11 -11 - GMT+11
+Zone Etc/GMT+12 -12 - GMT+12
diff --git a/libkcal/libical/tzdata/europe b/libkcal/libical/tzdata/europe
new file mode 100644
index 00000000..73eed00f
--- /dev/null
+++ b/libkcal/libical/tzdata/europe
@@ -0,0 +1,2525 @@
+# @(#)europe 8.12
+# <pre>
+
+# This data is by no means authoritative; if you think you know better,
+# go ahead and edit the file (and please send any changes to
+# tz@elsie.nci.nih.gov for general use in the future).
+
+# From Paul Eggert (2006-03-22):
+# A good source for time zone historical data outside the U.S. is
+# Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition),
+# San Diego: ACS Publications, Inc. (2003).
+#
+# Gwillim Law writes that a good source
+# for recent time zone data is the International Air Transport
+# Association's Standard Schedules Information Manual (IATA SSIM),
+# published semiannually. Law sent in several helpful summaries
+# of the IATA's data after 1990.
+#
+# Except where otherwise noted, Shanks & Pottenger is the source for
+# entries through 1991, and IATA SSIM is the source for entries afterwards.
+#
+# Other sources occasionally used include:
+#
+# Edward W. Whitman, World Time Differences,
+# Whitman Publishing Co, 2 Niagara Av, Ealing, London (undated),
+# which I found in the UCLA library.
+#
+# <a href="http://www.pettswoodvillage.co.uk/Daylight_Savings_William_Willett.pdf">
+# William Willett, The Waste of Daylight, 19th edition
+# </a> (1914-03)
+#
+# Brazil's Departamento Servico da Hora (DSH),
+# <a href="http://pcdsh01.on.br/HISTHV.htm">
+# History of Summer Time
+# </a> (1998-09-21, in Portuguese)
+
+#
+# I invented the abbreviations marked `*' in the following table;
+# the rest are from earlier versions of this file, or from other sources.
+# Corrections are welcome!
+# std dst 2dst
+# LMT Local Mean Time
+# -4:00 AST ADT Atlantic
+# -3:00 WGT WGST Western Greenland*
+# -1:00 EGT EGST Eastern Greenland*
+# 0:00 GMT BST BDST Greenwich, British Summer
+# 0:00 GMT IST Greenwich, Irish Summer
+# 0:00 WET WEST WEMT Western Europe
+# 0:19:32.13 AMT NST Amsterdam, Netherlands Summer (1835-1937)*
+# 0:20 NET NEST Netherlands (1937-1940)*
+# 1:00 CET CEST CEMT Central Europe
+# 1:00:14 SET Swedish (1879-1899)*
+# 2:00 EET EEST Eastern Europe
+# 3:00 MSK MSD Moscow
+#
+# A reliable and entertaining source about time zones, especially in Britain,
+# Derek Howse, Greenwich time and longitude, Philip Wilson Publishers (1997).
+
+# From Peter Ilieve (1994-12-04),
+# The original six [EU members]: Belgium, France, (West) Germany, Italy,
+# Luxembourg, the Netherlands.
+# Plus, from 1 Jan 73: Denmark, Ireland, United Kingdom.
+# Plus, from 1 Jan 81: Greece.
+# Plus, from 1 Jan 86: Spain, Portugal.
+# Plus, from 1 Jan 95: Austria, Finland, Sweden. (Norway negotiated terms for
+# entry but in a referendum on 28 Nov 94 the people voted No by 52.2% to 47.8%
+# on a turnout of 88.6%. This was almost the same result as Norway's previous
+# referendum in 1972, they are the only country to have said No twice.
+# Referendums in the other three countries voted Yes.)
+# ...
+# Estonia ... uses EU dates but not at 01:00 GMT, they use midnight GMT.
+# I don't think they know yet what they will do from 1996 onwards.
+# ...
+# There shouldn't be any [current members who are not using EU rules].
+# A Directive has the force of law, member states are obliged to enact
+# national law to implement it. The only contentious issue was the
+# different end date for the UK and Ireland, and this was always allowed
+# in the Directive.
+
+
+###############################################################################
+
+# Britain (United Kingdom) and Ireland (Eire)
+
+# From Peter Ilieve (1994-07-06):
+#
+# On 17 Jan 1994 the Independent, a UK quality newspaper, had a piece about
+# historical vistas along the Thames in west London. There was a photo
+# and a sketch map showing some of the sightlines involved. One paragraph
+# of the text said:
+#
+# `An old stone obelisk marking a forgotten terrestrial meridian stands
+# beside the river at Kew. In the 18th century, before time and longitude
+# was standardised by the Royal Observatory in Greenwich, scholars observed
+# this stone and the movement of stars from Kew Observatory nearby. They
+# made their calculations and set the time for the Horse Guards and Parliament,
+# but now the stone is obscured by scrubwood and can only be seen by walking
+# along the towpath within a few yards of it.'
+#
+# I have a one inch to one mile map of London and my estimate of the stone's
+# position is 51 deg. 28' 30" N, 0 deg. 18' 45" W. The longitude should
+# be within about +-2". The Ordnance Survey grid reference is TQ172761.
+#
+# [This yields GMTOFF = -0:01:15 for London LMT in the 18th century.]
+
+# From Paul Eggert (1993-11-18):
+#
+# Howse writes that Britain was the first country to use standard time.
+# The railways cared most about the inconsistencies of local mean time,
+# and it was they who forced a uniform time on the country.
+# The original idea was credited to Dr. William Hyde Wollaston (1766-1828)
+# and was popularized by Abraham Follett Osler (1808-1903).
+# The first railway to adopt London time was the Great Western Railway
+# in November 1840; other railways followed suit, and by 1847 most
+# (though not all) railways used London time. On 1847-09-22 the
+# Railway Clearing House, an industry standards body, recommended that GMT be
+# adopted at all stations as soon as the General Post Office permitted it.
+# The transition occurred on 12-01 for the L&NW, the Caledonian,
+# and presumably other railways; the January 1848 Bradshaw's lists many
+# railways as using GMT. By 1855 the vast majority of public
+# clocks in Britain were set to GMT (though some, like the great clock
+# on Tom Tower at Christ Church, Oxford, were fitted with two minute hands,
+# one for local time and one for GMT). The last major holdout was the legal
+# system, which stubbornly stuck to local time for many years, leading
+# to oddities like polls opening at 08:13 and closing at 16:13.
+# The legal system finally switched to GMT when the Statutes (Definition
+# of Time) Act took effect; it received the Royal Assent on 1880-08-02.
+#
+# In the tables below, we condense this complicated story into a single
+# transition date for London, namely 1847-12-01. We don't know as much
+# about Dublin, so we use 1880-08-02, the legal transition time.
+
+# From Paul Eggert (2003-09-27):
+# Summer Time was first seriously proposed by William Willett (1857-1915),
+# a London builder and member of the Royal Astronomical Society
+# who circulated a pamphlet ``The Waste of Daylight'' (1907)
+# that proposed advancing clocks 20 minutes on each of four Sundays in April,
+# and retarding them by the same amount on four Sundays in September.
+# A bill was drafted in 1909 and introduced in Parliament several times,
+# but it met with ridicule and opposition, especially from farming interests.
+# Later editions of the pamphlet proposed one-hour summer time, and
+# it was eventually adopted as a wartime measure in 1916.
+# See: Summer Time Arrives Early, The Times (2000-05-18).
+# A monument to Willett was unveiled on 1927-05-21, in an open space in
+# a 45-acre wood near Chislehurst, Kent that was purchased by popular
+# subscription and open to the public. On the south face of the monolith,
+# designed by G. W. Miller, is the the William Willett Memorial Sundial,
+# which is permanently set to Summer Time.
+
+# From Winston Churchill (1934-04-28):
+# It is one of the paradoxes of history that we should owe the boon of
+# summer time, which gives every year to the people of this country
+# between 160 and 170 hours more daylight leisure, to a war which
+# plunged Europe into darkness for four years, and shook the
+# foundations of civilization throughout the world.
+# -- <a href="http://www.winstonchurchill.org/fh114willett.htm">
+# "A Silent Toast to William Willett", Pictorial Weekly
+# </a>
+
+# From Paul Eggert (1996-09-03):
+# The OED Supplement says that the English originally said ``Daylight Saving''
+# when they were debating the adoption of DST in 1908; but by 1916 this
+# term appears only in quotes taken from DST's opponents, whereas the
+# proponents (who eventually won the argument) are quoted as using ``Summer''.
+
+# From Arthur David Olson (1989-01-19):
+#
+# A source at the British Information Office in New York avers that it's
+# known as "British" Summer Time in all parts of the United Kingdom.
+
+# Date: 4 Jan 89 08:57:25 GMT (Wed)
+# From: Jonathan Leffler
+# [British Summer Time] is fixed annually by Act of Parliament.
+# If you can predict what Parliament will do, you should be in
+# politics making a fortune, not computing.
+
+# From Chris Carrier (1996-06-14):
+# I remember reading in various wartime issues of the London Times the
+# acronym BDST for British Double Summer Time. Look for the published
+# time of sunrise and sunset in The Times, when BDST was in effect, and
+# if you find a zone reference it will say, "All times B.D.S.T."
+
+# From Joseph S. Myers (1999-09-02):
+# ... some military cables (WO 219/4100 - this is a copy from the
+# main SHAEF archives held in the US National Archives, SHAEF/5252/8/516)
+# agree that the usage is BDST (this appears in a message dated 17 Feb 1945).
+
+# From Joseph S. Myers (2000-10-03):
+# On 18th April 1941, Sir Stephen Tallents of the BBC wrote to Sir
+# Alexander Maxwell of the Home Office asking whether there was any
+# official designation; the reply of the 21st was that there wasn't
+# but he couldn't think of anything better than the "Double British
+# Summer Time" that the BBC had been using informally.
+# http://student.cusu.cam.ac.uk/~jsm28/british-time/bbc-19410418.png
+# http://student.cusu.cam.ac.uk/~jsm28/british-time/ho-19410421.png
+
+# From Sir Alexander Maxwell in the above-mentioned letter (1941-04-21):
+# [N]o official designation has as far as I know been adopted for the time
+# which is to be introduced in May....
+# I cannot think of anything better than "Double British Summer Time"
+# which could not be said to run counter to any official description.
+
+# From Paul Eggert (2000-10-02):
+# Howse writes (p 157) `DBST' too, but `BDST' seems to have been common
+# and follows the more usual convention of putting the location name first,
+# so we use `BDST'.
+
+# Peter Ilieve (1998-04-19) described at length
+# the history of summer time legislation in the United Kingdom.
+# Since 1998 Joseph S. Myers has been updating
+# and extending this list, which can be found in
+# <a href="http://student.cusu.cam.ac.uk/~jsm28/british-time/">
+# History of legal time in Britain
+# </a>
+
+# From Joseph S. Myers (1998-01-06):
+#
+# The legal time in the UK outside of summer time is definitely GMT, not UTC;
+# see Lord Tanlaw's speech
+# <a href="http://www.parliament.the-stationery-office.co.uk/pa/ld199697/ldhansrd/pdvn/lds97/text/70611-20.htm#70611-20_head0">
+# (Lords Hansard 11 June 1997 columns 964 to 976)
+# </a>.
+
+# From Paul Eggert (2006-03-22):
+#
+# For lack of other data, follow Shanks & Pottenger for Eire in 1940-1948.
+#
+# Given Ilieve and Myers's data, the following claims by Shanks & Pottenger
+# are incorrect:
+# * Wales did not switch from GMT to daylight saving time until
+# 1921 Apr 3, when they began to conform with the rest of Great Britain.
+# Actually, Wales was identical after 1880.
+# * Eire had two transitions on 1916 Oct 1.
+# It actually just had one transition.
+# * Northern Ireland used single daylight saving time throughout WW II.
+# Actually, it conformed to Britain.
+# * GB-Eire changed standard time to 1 hour ahead of GMT on 1968-02-18.
+# Actually, that date saw the usual switch to summer time.
+# Standard time was not changed until 1968-10-27 (the clocks didn't change).
+#
+# Here is another incorrect claim by Shanks & Pottenger:
+# * Jersey, Guernsey, and the Isle of Man did not switch from GMT
+# to daylight saving time until 1921 Apr 3, when they began to
+# conform with Great Britain.
+# S.R.&O. 1916, No. 382 and HO 45/10811/312364 (quoted above) say otherwise.
+#
+# The following claim by Shanks & Pottenger is possible though doubtful;
+# we'll ignore it for now.
+# * Dublin's 1971-10-31 switch was at 02:00, even though London's was 03:00.
+#
+#
+# Whitman says Dublin Mean Time was -0:25:21, which is more precise than
+# Shanks & Pottenger.
+# Perhaps this was Dunsink Observatory Time, as Dunsink Observatory
+# (8 km NW of Dublin's center) seemingly was to Dublin as Greenwich was
+# to London. For example:
+#
+# "Timeball on the ballast office is down. Dunsink time."
+# -- James Joyce, Ulysses
+
+# From Joseph S. Myers (2005-01-26):
+# Irish laws are available online at www.irishstatutebook.ie. These include
+# various relating to legal time, for example:
+#
+# ZZA13Y1923.html ZZA12Y1924.html ZZA8Y1925.html ZZSIV20PG1267.html
+#
+# ZZSI71Y1947.html ZZSI128Y1948.html ZZSI23Y1949.html ZZSI41Y1950.html
+# ZZSI27Y1951.html ZZSI73Y1952.html
+#
+# ZZSI11Y1961.html ZZSI232Y1961.html ZZSI182Y1962.html
+# ZZSI167Y1963.html ZZSI257Y1964.html ZZSI198Y1967.html
+# ZZA23Y1968.html ZZA17Y1971.html
+#
+# ZZSI67Y1981.html ZZSI212Y1982.html ZZSI45Y1986.html
+# ZZSI264Y1988.html ZZSI52Y1990.html ZZSI371Y1992.html
+# ZZSI395Y1994.html ZZSI484Y1997.html ZZSI506Y2001.html
+#
+# [These are all relative to the root, e.g., the first is
+# <http://www.irishstatutebook.ie/ZZA13Y1923.html>.]
+#
+# (These are those I found, but there could be more. In any case these
+# should allow various updates to the comments in the europe file to cover
+# the laws applicable in Ireland.)
+#
+# (Note that the time in the Republic of Ireland since 1968 has been defined
+# in terms of standard time being GMT+1 with a period of winter time when it
+# is GMT, rather than standard time being GMT with a period of summer time
+# being GMT+1.)
+
+# From Paul Eggert (1999-03-28):
+# Clive Feather (<news:859845706.26043.0@office.demon.net>, 1997-03-31)
+# reports that Folkestone (Cheriton) Shuttle Terminal uses Concession Time
+# (CT), equivalent to French civil time.
+# Julian Hill (<news:36118128.5A14@virgin.net>, 1998-09-30) reports that
+# trains between Dollands Moor (the freight facility next door)
+# and Frethun run in CT.
+# My admittedly uninformed guess is that the terminal has two authorities,
+# the French concession operators and the British civil authorities,
+# and that the time depends on who you're talking to.
+# If, say, the British police were called to the station for some reason,
+# I would expect the official police report to use GMT/BST and not CET/CEST.
+# This is a borderline case, but for now let's stick to GMT/BST.
+
+# From an anonymous contributor (1996-06-02):
+# The law governing time in Ireland is under Statutory Instrument SI 395/94,
+# which gives force to European Union 7th Council Directive # 94/21/EC.
+# Under this directive, the Minister for Justice in Ireland makes appropriate
+# regulations. I spoke this morning with the Secretary of the Department of
+# Justice (tel +353 1 678 9711) who confirmed to me that the correct name is
+# "Irish Summer Time", abbreviated to "IST".
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+# Summer Time Act, 1916
+Rule GB-Eire 1916 only - May 21 2:00s 1:00 BST
+Rule GB-Eire 1916 only - Oct 1 2:00s 0 GMT
+# S.R.&O. 1917, No. 358
+Rule GB-Eire 1917 only - Apr 8 2:00s 1:00 BST
+Rule GB-Eire 1917 only - Sep 17 2:00s 0 GMT
+# S.R.&O. 1918, No. 274
+Rule GB-Eire 1918 only - Mar 24 2:00s 1:00 BST
+Rule GB-Eire 1918 only - Sep 30 2:00s 0 GMT
+# S.R.&O. 1919, No. 297
+Rule GB-Eire 1919 only - Mar 30 2:00s 1:00 BST
+Rule GB-Eire 1919 only - Sep 29 2:00s 0 GMT
+# S.R.&O. 1920, No. 458
+Rule GB-Eire 1920 only - Mar 28 2:00s 1:00 BST
+# S.R.&O. 1920, No. 1844
+Rule GB-Eire 1920 only - Oct 25 2:00s 0 GMT
+# S.R.&O. 1921, No. 363
+Rule GB-Eire 1921 only - Apr 3 2:00s 1:00 BST
+Rule GB-Eire 1921 only - Oct 3 2:00s 0 GMT
+# S.R.&O. 1922, No. 264
+Rule GB-Eire 1922 only - Mar 26 2:00s 1:00 BST
+Rule GB-Eire 1922 only - Oct 8 2:00s 0 GMT
+# The Summer Time Act, 1922
+Rule GB-Eire 1923 only - Apr Sun>=16 2:00s 1:00 BST
+Rule GB-Eire 1923 1924 - Sep Sun>=16 2:00s 0 GMT
+Rule GB-Eire 1924 only - Apr Sun>=9 2:00s 1:00 BST
+Rule GB-Eire 1925 1926 - Apr Sun>=16 2:00s 1:00 BST
+# The Summer Time Act, 1925
+Rule GB-Eire 1925 1938 - Oct Sun>=2 2:00s 0 GMT
+Rule GB-Eire 1927 only - Apr Sun>=9 2:00s 1:00 BST
+Rule GB-Eire 1928 1929 - Apr Sun>=16 2:00s 1:00 BST
+Rule GB-Eire 1930 only - Apr Sun>=9 2:00s 1:00 BST
+Rule GB-Eire 1931 1932 - Apr Sun>=16 2:00s 1:00 BST
+Rule GB-Eire 1933 only - Apr Sun>=9 2:00s 1:00 BST
+Rule GB-Eire 1934 only - Apr Sun>=16 2:00s 1:00 BST
+Rule GB-Eire 1935 only - Apr Sun>=9 2:00s 1:00 BST
+Rule GB-Eire 1936 1937 - Apr Sun>=16 2:00s 1:00 BST
+Rule GB-Eire 1938 only - Apr Sun>=9 2:00s 1:00 BST
+Rule GB-Eire 1939 only - Apr Sun>=16 2:00s 1:00 BST
+# S.R.&O. 1939, No. 1379
+Rule GB-Eire 1939 only - Nov Sun>=16 2:00s 0 GMT
+# S.R.&O. 1940, No. 172 and No. 1883
+Rule GB-Eire 1940 only - Feb Sun>=23 2:00s 1:00 BST
+# S.R.&O. 1941, No. 476
+Rule GB-Eire 1941 only - May Sun>=2 1:00s 2:00 BDST
+Rule GB-Eire 1941 1943 - Aug Sun>=9 1:00s 1:00 BST
+# S.R.&O. 1942, No. 506
+Rule GB-Eire 1942 1944 - Apr Sun>=2 1:00s 2:00 BDST
+# S.R.&O. 1944, No. 932
+Rule GB-Eire 1944 only - Sep Sun>=16 1:00s 1:00 BST
+# S.R.&O. 1945, No. 312
+Rule GB-Eire 1945 only - Apr Mon>=2 1:00s 2:00 BDST
+Rule GB-Eire 1945 only - Jul Sun>=9 1:00s 1:00 BST
+# S.R.&O. 1945, No. 1208
+Rule GB-Eire 1945 1946 - Oct Sun>=2 2:00s 0 GMT
+Rule GB-Eire 1946 only - Apr Sun>=9 2:00s 1:00 BST
+# The Summer Time Act, 1947
+Rule GB-Eire 1947 only - Mar 16 2:00s 1:00 BST
+Rule GB-Eire 1947 only - Apr 13 1:00s 2:00 BDST
+Rule GB-Eire 1947 only - Aug 10 1:00s 1:00 BST
+Rule GB-Eire 1947 only - Nov 2 2:00s 0 GMT
+# Summer Time Order, 1948 (S.I. 1948/495)
+Rule GB-Eire 1948 only - Mar 14 2:00s 1:00 BST
+Rule GB-Eire 1948 only - Oct 31 2:00s 0 GMT
+# Summer Time Order, 1949 (S.I. 1949/373)
+Rule GB-Eire 1949 only - Apr 3 2:00s 1:00 BST
+Rule GB-Eire 1949 only - Oct 30 2:00s 0 GMT
+# Summer Time Order, 1950 (S.I. 1950/518)
+# Summer Time Order, 1951 (S.I. 1951/430)
+# Summer Time Order, 1952 (S.I. 1952/451)
+Rule GB-Eire 1950 1952 - Apr Sun>=14 2:00s 1:00 BST
+Rule GB-Eire 1950 1952 - Oct Sun>=21 2:00s 0 GMT
+# revert to the rules of the Summer Time Act, 1925
+Rule GB-Eire 1953 only - Apr Sun>=16 2:00s 1:00 BST
+Rule GB-Eire 1953 1960 - Oct Sun>=2 2:00s 0 GMT
+Rule GB-Eire 1954 only - Apr Sun>=9 2:00s 1:00 BST
+Rule GB-Eire 1955 1956 - Apr Sun>=16 2:00s 1:00 BST
+Rule GB-Eire 1957 only - Apr Sun>=9 2:00s 1:00 BST
+Rule GB-Eire 1958 1959 - Apr Sun>=16 2:00s 1:00 BST
+Rule GB-Eire 1960 only - Apr Sun>=9 2:00s 1:00 BST
+# Summer Time Order, 1961 (S.I. 1961/71)
+# Summer Time (1962) Order, 1961 (S.I. 1961/2465)
+# Summer Time Order, 1963 (S.I. 1963/81)
+Rule GB-Eire 1961 1963 - Mar lastSun 2:00s 1:00 BST
+Rule GB-Eire 1961 1968 - Oct Sun>=23 2:00s 0 GMT
+# Summer Time (1964) Order, 1963 (S.I. 1963/2101)
+# Summer Time Order, 1964 (S.I. 1964/1201)
+# Summer Time Order, 1967 (S.I. 1967/1148)
+Rule GB-Eire 1964 1967 - Mar Sun>=19 2:00s 1:00 BST
+# Summer Time Order, 1968 (S.I. 1968/117)
+Rule GB-Eire 1968 only - Feb 18 2:00s 1:00 BST
+# The British Standard Time Act, 1968
+# (no summer time)
+# The Summer Time Act, 1972
+Rule GB-Eire 1972 1980 - Mar Sun>=16 2:00s 1:00 BST
+Rule GB-Eire 1972 1980 - Oct Sun>=23 2:00s 0 GMT
+# Summer Time Order, 1980 (S.I. 1980/1089)
+# Summer Time Order, 1982 (S.I. 1982/1673)
+# Summer Time Order, 1986 (S.I. 1986/223)
+# Summer Time Order, 1988 (S.I. 1988/931)
+Rule GB-Eire 1981 1995 - Mar lastSun 1:00u 1:00 BST
+Rule GB-Eire 1981 1989 - Oct Sun>=23 1:00u 0 GMT
+# Summer Time Order, 1989 (S.I. 1989/985)
+# Summer Time Order, 1992 (S.I. 1992/1729)
+# Summer Time Order 1994 (S.I. 1994/2798)
+Rule GB-Eire 1990 1995 - Oct Sun>=22 1:00u 0 GMT
+# Summer Time Order 1997 (S.I. 1997/2982)
+# See EU for rules starting in 1996.
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/London -0:01:15 - LMT 1847 Dec 1 0:00s
+ 0:00 GB-Eire %s 1968 Oct 27
+ 1:00 - BST 1971 Oct 31 2:00u
+ 0:00 GB-Eire %s 1996
+ 0:00 EU GMT/BST
+Link Europe/London Europe/Jersey
+Link Europe/London Europe/Guernsey
+Link Europe/London Europe/Isle_of_Man
+Zone Europe/Dublin -0:25:00 - LMT 1880 Aug 2
+ -0:25:21 - DMT 1916 May 21 2:00
+ -0:25:21 1:00 IST 1916 Oct 1 2:00s
+ 0:00 GB-Eire %s 1921 Dec 6 # independence
+ 0:00 GB-Eire GMT/IST 1940 Feb 25 2:00
+ 0:00 1:00 IST 1946 Oct 6 2:00
+ 0:00 - GMT 1947 Mar 16 2:00
+ 0:00 1:00 IST 1947 Nov 2 2:00
+ 0:00 - GMT 1948 Apr 18 2:00
+ 0:00 GB-Eire GMT/IST 1968 Oct 27
+ 1:00 - IST 1971 Oct 31 2:00u
+ 0:00 GB-Eire GMT/IST 1996
+ 0:00 EU GMT/IST
+
+###############################################################################
+
+# Europe
+
+# EU rules are for the European Union, previously known as the EC, EEC,
+# Common Market, etc.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule EU 1977 1980 - Apr Sun>=1 1:00u 1:00 S
+Rule EU 1977 only - Sep lastSun 1:00u 0 -
+Rule EU 1978 only - Oct 1 1:00u 0 -
+Rule EU 1979 1995 - Sep lastSun 1:00u 0 -
+Rule EU 1981 max - Mar lastSun 1:00u 1:00 S
+Rule EU 1996 max - Oct lastSun 1:00u 0 -
+# The most recent directive covers the years starting in 2002. See:
+# <a href="http://europa.eu.int/eur-lex/en/lif/dat/2000/en_300L0084.html"
+# Directive 2000/84/EC of the European Parliament and of the Council
+# of 19 January 2001 on summer-time arrangements.
+# </a>
+
+# W-Eur differs from EU only in that W-Eur uses standard time.
+Rule W-Eur 1977 1980 - Apr Sun>=1 1:00s 1:00 S
+Rule W-Eur 1977 only - Sep lastSun 1:00s 0 -
+Rule W-Eur 1978 only - Oct 1 1:00s 0 -
+Rule W-Eur 1979 1995 - Sep lastSun 1:00s 0 -
+Rule W-Eur 1981 max - Mar lastSun 1:00s 1:00 S
+Rule W-Eur 1996 max - Oct lastSun 1:00s 0 -
+
+# Older C-Eur rules are for convenience in the tables.
+# From 1977 on, C-Eur differs from EU only in that C-Eur uses standard time.
+Rule C-Eur 1916 only - Apr 30 23:00 1:00 S
+Rule C-Eur 1916 only - Oct 1 1:00 0 -
+Rule C-Eur 1917 1918 - Apr Mon>=15 2:00s 1:00 S
+Rule C-Eur 1917 1918 - Sep Mon>=15 2:00s 0 -
+Rule C-Eur 1940 only - Apr 1 2:00s 1:00 S
+Rule C-Eur 1942 only - Nov 2 2:00s 0 -
+Rule C-Eur 1943 only - Mar 29 2:00s 1:00 S
+Rule C-Eur 1943 only - Oct 4 2:00s 0 -
+Rule C-Eur 1944 only - Apr 3 2:00s 1:00 S
+# Whitman gives 1944 Oct 7; go with Shanks & Pottenger.
+Rule C-Eur 1944 only - Oct 2 2:00s 0 -
+Rule C-Eur 1977 1980 - Apr Sun>=1 2:00s 1:00 S
+Rule C-Eur 1977 only - Sep lastSun 2:00s 0 -
+Rule C-Eur 1978 only - Oct 1 2:00s 0 -
+Rule C-Eur 1979 1995 - Sep lastSun 2:00s 0 -
+Rule C-Eur 1981 max - Mar lastSun 2:00s 1:00 S
+Rule C-Eur 1996 max - Oct lastSun 2:00s 0 -
+
+# E-Eur differs from EU only in that E-Eur switches at midnight local time.
+Rule E-Eur 1977 1980 - Apr Sun>=1 0:00 1:00 S
+Rule E-Eur 1977 only - Sep lastSun 0:00 0 -
+Rule E-Eur 1978 only - Oct 1 0:00 0 -
+Rule E-Eur 1979 1995 - Sep lastSun 0:00 0 -
+Rule E-Eur 1981 max - Mar lastSun 0:00 1:00 S
+Rule E-Eur 1996 max - Oct lastSun 0:00 0 -
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Russia 1917 only - Jul 1 23:00 1:00 MST # Moscow Summer Time
+Rule Russia 1917 only - Dec 28 0:00 0 MMT # Moscow Mean Time
+Rule Russia 1918 only - May 31 22:00 2:00 MDST # Moscow Double Summer Time
+Rule Russia 1918 only - Sep 16 1:00 1:00 MST
+Rule Russia 1919 only - May 31 23:00 2:00 MDST
+Rule Russia 1919 only - Jul 1 2:00 1:00 S
+Rule Russia 1919 only - Aug 16 0:00 0 -
+Rule Russia 1921 only - Feb 14 23:00 1:00 S
+Rule Russia 1921 only - Mar 20 23:00 2:00 M # Midsummer
+Rule Russia 1921 only - Sep 1 0:00 1:00 S
+Rule Russia 1921 only - Oct 1 0:00 0 -
+# Act No.925 of the Council of Ministers of the USSR (1980-10-24):
+Rule Russia 1981 1984 - Apr 1 0:00 1:00 S
+Rule Russia 1981 1983 - Oct 1 0:00 0 -
+# Act No.967 of the Council of Ministers of the USSR (1984-09-13), repeated in
+# Act No.227 of the Council of Ministers of the USSR (1989-03-14):
+Rule Russia 1984 1991 - Sep lastSun 2:00s 0 -
+Rule Russia 1985 1991 - Mar lastSun 2:00s 1:00 S
+#
+Rule Russia 1992 only - Mar lastSat 23:00 1:00 S
+Rule Russia 1992 only - Sep lastSat 23:00 0 -
+Rule Russia 1993 max - Mar lastSun 2:00s 1:00 S
+Rule Russia 1993 1995 - Sep lastSun 2:00s 0 -
+Rule Russia 1996 max - Oct lastSun 2:00s 0 -
+
+# These are for backward compatibility with older versions.
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone WET 0:00 EU WE%sT
+Zone CET 1:00 C-Eur CE%sT
+Zone MET 1:00 C-Eur ME%sT
+Zone EET 2:00 EU EE%sT
+
+# Previous editions of this database used abbreviations like MET DST
+# for Central European Summer Time, but this didn't agree with common usage.
+
+# From Markus Kuhn (1996-07-12):
+# The official German names ... are
+#
+# Mitteleuropaeische Zeit (MEZ) = UTC+01:00
+# Mitteleuropaeische Sommerzeit (MESZ) = UTC+02:00
+#
+# as defined in the German Time Act (Gesetz ueber die Zeitbestimmung (ZeitG),
+# 1978-07-25, Bundesgesetzblatt, Jahrgang 1978, Teil I, S. 1110-1111)....
+# I wrote ... to the German Federal Physical-Technical Institution
+#
+# Physikalisch-Technische Bundesanstalt (PTB)
+# Laboratorium 4.41 "Zeiteinheit"
+# Postfach 3345
+# D-38023 Braunschweig
+# phone: +49 531 592-0
+#
+# ... I received today an answer letter from Dr. Peter Hetzel, head of the PTB
+# department for time and frequency transmission. He explained that the
+# PTB translates MEZ and MESZ into English as
+#
+# Central European Time (CET) = UTC+01:00
+# Central European Summer Time (CEST) = UTC+02:00
+
+
+# Albania
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Albania 1940 only - Jun 16 0:00 1:00 S
+Rule Albania 1942 only - Nov 2 3:00 0 -
+Rule Albania 1943 only - Mar 29 2:00 1:00 S
+Rule Albania 1943 only - Apr 10 3:00 0 -
+Rule Albania 1974 only - May 4 0:00 1:00 S
+Rule Albania 1974 only - Oct 2 0:00 0 -
+Rule Albania 1975 only - May 1 0:00 1:00 S
+Rule Albania 1975 only - Oct 2 0:00 0 -
+Rule Albania 1976 only - May 2 0:00 1:00 S
+Rule Albania 1976 only - Oct 3 0:00 0 -
+Rule Albania 1977 only - May 8 0:00 1:00 S
+Rule Albania 1977 only - Oct 2 0:00 0 -
+Rule Albania 1978 only - May 6 0:00 1:00 S
+Rule Albania 1978 only - Oct 1 0:00 0 -
+Rule Albania 1979 only - May 5 0:00 1:00 S
+Rule Albania 1979 only - Sep 30 0:00 0 -
+Rule Albania 1980 only - May 3 0:00 1:00 S
+Rule Albania 1980 only - Oct 4 0:00 0 -
+Rule Albania 1981 only - Apr 26 0:00 1:00 S
+Rule Albania 1981 only - Sep 27 0:00 0 -
+Rule Albania 1982 only - May 2 0:00 1:00 S
+Rule Albania 1982 only - Oct 3 0:00 0 -
+Rule Albania 1983 only - Apr 18 0:00 1:00 S
+Rule Albania 1983 only - Oct 1 0:00 0 -
+Rule Albania 1984 only - Apr 1 0:00 1:00 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Tirane 1:19:20 - LMT 1914
+ 1:00 - CET 1940 Jun 16
+ 1:00 Albania CE%sT 1984 Jul
+ 1:00 EU CE%sT
+
+# Andorra
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Andorra 0:06:04 - LMT 1901
+ 0:00 - WET 1946 Sep 30
+ 1:00 - CET 1985 Mar 31 2:00
+ 1:00 EU CE%sT
+
+# Austria
+
+# From Paul Eggert (2006-03-22): Shanks & Pottenger give 1918-06-16 and
+# 1945-11-18, but the Austrian Federal Office of Metrology and
+# Surveying (BEV) gives 1918-09-16 and for Vienna gives the "alleged"
+# date of 1945-04-12 with no time. For the 1980-04-06 transition
+# Shanks & Pottenger give 02:00, the BEV 00:00. Go with the BEV,
+# and guess 02:00 for 1945-04-12.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Austria 1920 only - Apr 5 2:00s 1:00 S
+Rule Austria 1920 only - Sep 13 2:00s 0 -
+Rule Austria 1946 only - Apr 14 2:00s 1:00 S
+Rule Austria 1946 1948 - Oct Sun>=1 2:00s 0 -
+Rule Austria 1947 only - Apr 6 2:00s 1:00 S
+Rule Austria 1948 only - Apr 18 2:00s 1:00 S
+Rule Austria 1980 only - Apr 6 0:00 1:00 S
+Rule Austria 1980 only - Sep 28 0:00 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Vienna 1:05:20 - LMT 1893 Apr
+ 1:00 C-Eur CE%sT 1920
+ 1:00 Austria CE%sT 1940 Apr 1 2:00s
+ 1:00 C-Eur CE%sT 1945 Apr 2 2:00s
+ 1:00 1:00 CEST 1945 Apr 12 2:00s
+ 1:00 - CET 1946
+ 1:00 Austria CE%sT 1981
+ 1:00 EU CE%sT
+
+# Belarus
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Minsk 1:50:16 - LMT 1880
+ 1:50 - MMT 1924 May 2 # Minsk Mean Time
+ 2:00 - EET 1930 Jun 21
+ 3:00 - MSK 1941 Jun 28
+ 1:00 C-Eur CE%sT 1944 Jul 3
+ 3:00 Russia MSK/MSD 1990
+ 3:00 - MSK 1991 Mar 31 2:00s
+ 2:00 1:00 EEST 1991 Sep 29 2:00s
+ 2:00 - EET 1992 Mar 29 0:00s
+ 2:00 1:00 EEST 1992 Sep 27 0:00s
+ 2:00 Russia EE%sT
+
+# Belgium
+#
+# From Paul Eggert (1997-07-02):
+# Entries from 1918 through 1991 are taken from:
+# Annuaire de L'Observatoire Royal de Belgique,
+# Avenue Circulaire, 3, B-1180 BRUXELLES, CLVIIe annee, 1991
+# (Imprimerie HAYEZ, s.p.r.l., Rue Fin, 4, 1080 BRUXELLES, MCMXC),
+# pp 8-9.
+# LMT before 1892 was 0:17:30, according to the official journal of Belgium:
+# Moniteur Belge, Samedi 30 Avril 1892, N.121.
+# Thanks to Pascal Delmoitie for these references.
+# The 1918 rules are listed for completeness; they apply to unoccupied Belgium.
+# Assume Brussels switched to WET in 1918 when the armistice took effect.
+#
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Belgium 1918 only - Mar 9 0:00s 1:00 S
+Rule Belgium 1918 1919 - Oct Sat>=1 23:00s 0 -
+Rule Belgium 1919 only - Mar 1 23:00s 1:00 S
+Rule Belgium 1920 only - Feb 14 23:00s 1:00 S
+Rule Belgium 1920 only - Oct 23 23:00s 0 -
+Rule Belgium 1921 only - Mar 14 23:00s 1:00 S
+Rule Belgium 1921 only - Oct 25 23:00s 0 -
+Rule Belgium 1922 only - Mar 25 23:00s 1:00 S
+Rule Belgium 1922 1927 - Oct Sat>=1 23:00s 0 -
+Rule Belgium 1923 only - Apr 21 23:00s 1:00 S
+Rule Belgium 1924 only - Mar 29 23:00s 1:00 S
+Rule Belgium 1925 only - Apr 4 23:00s 1:00 S
+# DSH writes that a royal decree of 1926-02-22 specified the Sun following 3rd
+# Sat in Apr (except if it's Easter, in which case it's one Sunday earlier),
+# to Sun following 1st Sat in Oct, and that a royal decree of 1928-09-15
+# changed the transition times to 02:00 GMT.
+Rule Belgium 1926 only - Apr 17 23:00s 1:00 S
+Rule Belgium 1927 only - Apr 9 23:00s 1:00 S
+Rule Belgium 1928 only - Apr 14 23:00s 1:00 S
+Rule Belgium 1928 1938 - Oct Sun>=2 2:00s 0 -
+Rule Belgium 1929 only - Apr 21 2:00s 1:00 S
+Rule Belgium 1930 only - Apr 13 2:00s 1:00 S
+Rule Belgium 1931 only - Apr 19 2:00s 1:00 S
+Rule Belgium 1932 only - Apr 3 2:00s 1:00 S
+Rule Belgium 1933 only - Mar 26 2:00s 1:00 S
+Rule Belgium 1934 only - Apr 8 2:00s 1:00 S
+Rule Belgium 1935 only - Mar 31 2:00s 1:00 S
+Rule Belgium 1936 only - Apr 19 2:00s 1:00 S
+Rule Belgium 1937 only - Apr 4 2:00s 1:00 S
+Rule Belgium 1938 only - Mar 27 2:00s 1:00 S
+Rule Belgium 1939 only - Apr 16 2:00s 1:00 S
+Rule Belgium 1939 only - Nov 19 2:00s 0 -
+Rule Belgium 1940 only - Feb 25 2:00s 1:00 S
+Rule Belgium 1944 only - Sep 17 2:00s 0 -
+Rule Belgium 1945 only - Apr 2 2:00s 1:00 S
+Rule Belgium 1945 only - Sep 16 2:00s 0 -
+Rule Belgium 1946 only - May 19 2:00s 1:00 S
+Rule Belgium 1946 only - Oct 7 2:00s 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Brussels 0:17:30 - LMT 1880
+ 0:17:30 - BMT 1892 May 1 12:00 # Brussels MT
+ 0:00 - WET 1914 Nov 8
+ 1:00 - CET 1916 May 1 0:00
+ 1:00 C-Eur CE%sT 1918 Nov 11 11:00u
+ 0:00 Belgium WE%sT 1940 May 20 2:00s
+ 1:00 C-Eur CE%sT 1944 Sep 3
+ 1:00 Belgium CE%sT 1977
+ 1:00 EU CE%sT
+
+# Bosnia and Herzegovina
+# see Serbia
+
+# Bulgaria
+#
+# From Plamen Simenov via Steffen Thorsen (1999-09-09):
+# A document of Government of Bulgaria (No.94/1997) says:
+# EET --> EETDST is in 03:00 Local time in last Sunday of March ...
+# EETDST --> EET is in 04:00 Local time in last Sunday of October
+#
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Bulg 1979 only - Mar 31 23:00 1:00 S
+Rule Bulg 1979 only - Oct 1 1:00 0 -
+Rule Bulg 1980 1982 - Apr Sat>=1 23:00 1:00 S
+Rule Bulg 1980 only - Sep 29 1:00 0 -
+Rule Bulg 1981 only - Sep 27 2:00 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Sofia 1:33:16 - LMT 1880
+ 1:56:56 - IMT 1894 Nov 30 # Istanbul MT?
+ 2:00 - EET 1942 Nov 2 3:00
+ 1:00 C-Eur CE%sT 1945 Apr 2 3:00
+ 2:00 - EET 1979 Mar 31 23:00
+ 2:00 Bulg EE%sT 1982 Sep 26 2:00
+ 2:00 C-Eur EE%sT 1991
+ 2:00 E-Eur EE%sT 1997
+ 2:00 EU EE%sT
+
+# Croatia
+# see Serbia
+
+# Cyprus
+# Please see the `asia' file for Asia/Nicosia.
+
+# Czech Republic
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Czech 1945 only - Apr 8 2:00s 1:00 S
+Rule Czech 1945 only - Nov 18 2:00s 0 -
+Rule Czech 1946 only - May 6 2:00s 1:00 S
+Rule Czech 1946 1949 - Oct Sun>=1 2:00s 0 -
+Rule Czech 1947 only - Apr 20 2:00s 1:00 S
+Rule Czech 1948 only - Apr 18 2:00s 1:00 S
+Rule Czech 1949 only - Apr 9 2:00s 1:00 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Prague 0:57:44 - LMT 1850
+ 0:57:44 - PMT 1891 Oct # Prague Mean Time
+ 1:00 C-Eur CE%sT 1944 Sep 17 2:00s
+ 1:00 Czech CE%sT 1979
+ 1:00 EU CE%sT
+
+# Denmark, Faroe Islands, and Greenland
+
+# From Jesper Norgaard Welen (2005-04-26):
+# http://www.hum.aau.dk/~poe/tid/tine/DanskTid.htm says that the law
+# [introducing standard time] was in effect from 1894-01-01....
+# The page http://www.retsinfo.dk/_GETDOCI_/ACCN/A18930008330-REGL
+# confirms this, and states that the law was put forth 1893-03-29.
+#
+# The EU treaty with effect from 1973:
+# http://www.retsinfo.dk/_GETDOCI_/ACCN/A19722110030-REGL
+#
+# This provoked a new law from 1974 to make possible summer time changes
+# in subsequenet decrees with the law
+# http://www.retsinfo.dk/_GETDOCI_/ACCN/A19740022330-REGL
+#
+# It seems however that no decree was set forward until 1980. I have
+# not found any decree, but in another related law, the effecting DST
+# changes are stated explicitly to be from 1980-04-06 at 02:00 to
+# 1980-09-28 at 02:00. If this is true, this differs slightly from
+# the EU rule in that DST runs to 02:00, not 03:00. We don't know
+# when Denmark began using the EU rule correctly, but we have only
+# confirmation of the 1980-time, so I presume it was correct in 1981:
+# The law is about the management of the extra hour, concerning
+# working hours reported and effect on obligatory-rest rules (which
+# was suspended on that night):
+# http://www.retsinfo.dk/_GETDOCI_/ACCN/C19801120554-REGL
+
+# From Jesper Norgaard Welen (2005-06-11):
+# The Herning Folkeblad (1980-09-26) reported that the night between
+# Saturday and Sunday the clock is set back from three to two.
+
+# From Paul Eggert (2005-06-11):
+# Hence the "02:00" of the 1980 law refers to standard time, not
+# wall-clock time, and so the EU rules were in effect in 1980.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Denmark 1916 only - May 14 23:00 1:00 S
+Rule Denmark 1916 only - Sep 30 23:00 0 -
+Rule Denmark 1940 only - May 15 0:00 1:00 S
+Rule Denmark 1945 only - Apr 2 2:00s 1:00 S
+Rule Denmark 1945 only - Aug 15 2:00s 0 -
+Rule Denmark 1946 only - May 1 2:00s 1:00 S
+Rule Denmark 1946 only - Sep 1 2:00s 0 -
+Rule Denmark 1947 only - May 4 2:00s 1:00 S
+Rule Denmark 1947 only - Aug 10 2:00s 0 -
+Rule Denmark 1948 only - May 9 2:00s 1:00 S
+Rule Denmark 1948 only - Aug 8 2:00s 0 -
+#
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Copenhagen 0:50:20 - LMT 1890
+ 0:50:20 - CMT 1894 Jan 1 # Copenhagen MT
+ 1:00 Denmark CE%sT 1942 Nov 2 2:00s
+ 1:00 C-Eur CE%sT 1945 Apr 2 2:00
+ 1:00 Denmark CE%sT 1980
+ 1:00 EU CE%sT
+Zone Atlantic/Faroe -0:27:04 - LMT 1908 Jan 11 # Torshavn
+ 0:00 - WET 1981
+ 0:00 EU WE%sT
+#
+# From Paul Eggert (2004-10-31):
+# During World War II, Germany maintained secret manned weather stations in
+# East Greenland and Franz Josef Land, but we don't know their time zones.
+# My source for this is Wilhelm Dege's book mentioned under Svalbard.
+#
+# From Paul Eggert (2006-03-22):
+# Greenland joined the EU as part of Denmark, obtained home rule on 1979-05-01,
+# and left the EU on 1985-02-01. It therefore should have been using EU
+# rules at least through 1984. Shanks & Pottenger say Scoresbysund and Godthab
+# used C-Eur rules after 1980, but IATA SSIM (1991/1996) says they use EU
+# rules since at least 1991. Assume EU rules since 1980.
+
+# From Gwillin Law (2001-06-06), citing
+# <http://www.statkart.no/efs/efshefter/2001/efs5-2001.pdf> (2001-03-15),
+# and with translations corrected by Steffen Thorsen:
+#
+# Greenland has four local times, and the relation to UTC
+# is according to the following time line:
+#
+# The military zone near Thule UTC-4
+# Standard Greenland time UTC-3
+# Scoresbysund UTC-1
+# Danmarkshavn UTC
+#
+# In the military area near Thule and in Danmarkshavn DST will not be
+# introduced.
+
+# From Rives McDow (2001-11-01):
+#
+# I correspond regularly with the Dansk Polarcenter, and wrote them at
+# the time to clarify the situation in Thule. Unfortunately, I have
+# not heard back from them regarding my recent letter. [But I have
+# info from earlier correspondence.]
+#
+# According to the center, a very small local time zone around Thule
+# Air Base keeps the time according to UTC-4, implementing daylight
+# savings using North America rules, changing the time at 02:00 local time....
+#
+# The east coast of Greenland north of the community of Scoresbysund
+# uses UTC in the same way as in Iceland, year round, with no dst.
+# There are just a few stations on this coast, including the
+# Danmarkshavn ICAO weather station mentioned in your September 29th
+# email. The other stations are two sledge patrol stations in
+# Mestersvig and Daneborg, the air force base at Station Nord, and the
+# DPC research station at Zackenberg.
+#
+# Scoresbysund and two small villages nearby keep time UTC-1 and use
+# the same daylight savings time period as in West Greenland (Godthab).
+#
+# The rest of Greenland, including Godthab (this area, although it
+# includes central Greenland, is known as west Greenland), keeps time
+# UTC-3, with daylight savings methods according to European rules.
+#
+# It is common procedure to use UTC 0 in the wilderness of East and
+# North Greenland, because it is mainly Icelandic aircraft operators
+# maintaining traffic in these areas. However, the official status of
+# this area is that it sticks with Godthab time. This area might be
+# considered a dual time zone in some respects because of this.
+
+# From Rives McDow (2001-11-19):
+# I heard back from someone stationed at Thule; the time change took place
+# there at 2:00 AM.
+
+# From Paul Eggert (2006-03-22):
+# From 1997 on the CIA map shows Danmarkshavn on GMT;
+# the 1995 map as like Godthab.
+# For lack of better info, assume they were like Godthab before 1996.
+# startkart.no says Thule does not observe DST, but this is clearly an error,
+# so go with Shanks & Pottenger for Thule transitions until this year.
+# For 2007 on assume Thule will stay in sync with US DST rules.
+#
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Thule 1991 1992 - Mar lastSun 2:00 1:00 D
+Rule Thule 1991 1992 - Sep lastSun 2:00 0 S
+Rule Thule 1993 2006 - Apr Sun>=1 2:00 1:00 D
+Rule Thule 1993 2006 - Oct lastSun 2:00 0 S
+Rule Thule 2007 max - Mar Sun>=8 2:00 1:00 D
+Rule Thule 2007 max - Nov Sun>=1 2:00 0 S
+#
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Danmarkshavn -1:14:40 - LMT 1916 Jul 28
+ -3:00 - WGT 1980 Apr 6 2:00
+ -3:00 EU WG%sT 1996
+ 0:00 - GMT
+Zone America/Scoresbysund -1:27:52 - LMT 1916 Jul 28 # Ittoqqortoormiit
+ -2:00 - CGT 1980 Apr 6 2:00
+ -2:00 C-Eur CG%sT 1981 Mar 29
+ -1:00 EU EG%sT
+Zone America/Godthab -3:26:56 - LMT 1916 Jul 28 # Nuuk
+ -3:00 - WGT 1980 Apr 6 2:00
+ -3:00 EU WG%sT
+Zone America/Thule -4:35:08 - LMT 1916 Jul 28 # Pituffik air base
+ -4:00 Thule A%sT
+
+# Estonia
+# From Peter Ilieve (1994-10-15):
+# A relative in Tallinn confirms the accuracy of the data for 1989 onwards
+# [through 1994] and gives the legal authority for it,
+# a regulation of the Government of Estonia, No. 111 of 1989....
+#
+# From Peter Ilieve (1996-10-28):
+# [IATA SSIM (1992/1996) claims that the Baltic republics switch at 01:00s,
+# but a relative confirms that Estonia still switches at 02:00s, writing:]
+# ``I do not [know] exactly but there are some little different
+# (confusing) rules for International Air and Railway Transport Schedules
+# conversion in Sunday connected with end of summer time in Estonia....
+# A discussion is running about the summer time efficiency and effect on
+# human physiology. It seems that Estonia maybe will not change to
+# summer time next spring.''
+
+# From Peter Ilieve (1998-11-04), heavily edited:
+# <a href="http://trip.rk.ee/cgi-bin/thw?${BASE}=akt&${OOHTML}=rtd&TA=1998&TO=1&AN=1390">
+# The 1998-09-22 Estonian time law
+# </a>
+# refers to the Eighth Directive and cites the association agreement between
+# the EU and Estonia, ratified by the Estonian law (RT II 1995, 22--27, 120).
+#
+# I also asked [my relative] whether they use any standard abbreviation
+# for their standard and summer times. He says no, they use "suveaeg"
+# (summer time) and "talveaeg" (winter time).
+
+# From <a href="http://www.baltictimes.com/">The Baltic Times</a> (1999-09-09)
+# via Steffen Thorsen:
+# This year will mark the last time Estonia shifts to summer time,
+# a council of the ruling coalition announced Sept. 6....
+# But what this could mean for Estonia's chances of joining the European
+# Union are still unclear. In 1994, the EU declared summer time compulsory
+# for all member states until 2001. Brussels has yet to decide what to do
+# after that.
+
+# From Mart Oruaas (2000-01-29):
+# Regulation no. 301 (1999-10-12) obsoletes previous regulation
+# no. 206 (1998-09-22) and thus sticks Estonia to +02:00 GMT for all
+# the year round. The regulation is effective 1999-11-01.
+
+# From Toomas Soome (2002-02-21):
+# The Estonian government has changed once again timezone politics.
+# Now we are using again EU rules.
+#
+# From Urmet Jaanes (2002-03-28):
+# The legislative reference is Government decree No. 84 on 2002-02-21.
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Tallinn 1:39:00 - LMT 1880
+ 1:39:00 - TMT 1918 Feb # Tallinn Mean Time
+ 1:00 C-Eur CE%sT 1919 Jul
+ 1:39:00 - TMT 1921 May
+ 2:00 - EET 1940 Aug 6
+ 3:00 - MSK 1941 Sep 15
+ 1:00 C-Eur CE%sT 1944 Sep 22
+ 3:00 Russia MSK/MSD 1989 Mar 26 2:00s
+ 2:00 1:00 EEST 1989 Sep 24 2:00s
+ 2:00 C-Eur EE%sT 1998 Sep 22
+ 2:00 EU EE%sT 1999 Nov 1
+ 2:00 - EET 2002 Feb 21
+ 2:00 EU EE%sT
+
+# Finland
+#
+# From Hannu Strang (1994-09-25 06:03:37 UTC):
+# Well, here in Helsinki we're just changing from summer time to regular one,
+# and it's supposed to change at 4am...
+#
+# From Paul Eggert (2006-03-22):
+# Shanks & Pottenger say Finland has switched at 02:00 standard time
+# since 1981. Go with Strang instead.
+#
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Finland 1942 only - Apr 3 0:00 1:00 S
+Rule Finland 1942 only - Oct 3 0:00 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Helsinki 1:39:52 - LMT 1878 May 31
+ 1:39:52 - HMT 1921 May # Helsinki Mean Time
+ 2:00 Finland EE%sT 1981 Mar 29 2:00
+ 2:00 EU EE%sT
+
+# Aaland Is
+Link Europe/Helsinki Europe/Mariehamn
+
+
+# France
+
+# From Ciro Discepolo (2000-12-20):
+#
+# Henri Le Corre, Regimes Horaires pour le monde entier, Editions
+# Traditionnelles - Paris 2 books, 1993
+#
+# Gabriel, Traite de l'heure dans le monde, Guy Tredaniel editeur,
+# Paris, 1991
+#
+# Francoise Gauquelin, Problemes de l'heure resolus en astrologie,
+# Guy tredaniel, Paris 1987
+
+
+#
+# Shank & Pottenger seem to use `24:00' ambiguously; resolve it with Whitman.
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule France 1916 only - Jun 14 23:00s 1:00 S
+Rule France 1916 1919 - Oct Sun>=1 23:00s 0 -
+Rule France 1917 only - Mar 24 23:00s 1:00 S
+Rule France 1918 only - Mar 9 23:00s 1:00 S
+Rule France 1919 only - Mar 1 23:00s 1:00 S
+Rule France 1920 only - Feb 14 23:00s 1:00 S
+Rule France 1920 only - Oct 23 23:00s 0 -
+Rule France 1921 only - Mar 14 23:00s 1:00 S
+Rule France 1921 only - Oct 25 23:00s 0 -
+Rule France 1922 only - Mar 25 23:00s 1:00 S
+# DSH writes that a law of 1923-05-24 specified 3rd Sat in Apr at 23:00 to 1st
+# Sat in Oct at 24:00; and that in 1930, because of Easter, the transitions
+# were Apr 12 and Oct 5. Go with Shanks & Pottenger.
+Rule France 1922 1938 - Oct Sat>=1 23:00s 0 -
+Rule France 1923 only - May 26 23:00s 1:00 S
+Rule France 1924 only - Mar 29 23:00s 1:00 S
+Rule France 1925 only - Apr 4 23:00s 1:00 S
+Rule France 1926 only - Apr 17 23:00s 1:00 S
+Rule France 1927 only - Apr 9 23:00s 1:00 S
+Rule France 1928 only - Apr 14 23:00s 1:00 S
+Rule France 1929 only - Apr 20 23:00s 1:00 S
+Rule France 1930 only - Apr 12 23:00s 1:00 S
+Rule France 1931 only - Apr 18 23:00s 1:00 S
+Rule France 1932 only - Apr 2 23:00s 1:00 S
+Rule France 1933 only - Mar 25 23:00s 1:00 S
+Rule France 1934 only - Apr 7 23:00s 1:00 S
+Rule France 1935 only - Mar 30 23:00s 1:00 S
+Rule France 1936 only - Apr 18 23:00s 1:00 S
+Rule France 1937 only - Apr 3 23:00s 1:00 S
+Rule France 1938 only - Mar 26 23:00s 1:00 S
+Rule France 1939 only - Apr 15 23:00s 1:00 S
+Rule France 1939 only - Nov 18 23:00s 0 -
+Rule France 1940 only - Feb 25 2:00 1:00 S
+# The French rules for 1941-1944 were not used in Paris, but Shanks & Pottenger
+# write that they were used in Monaco and in many French locations.
+# Le Corre writes that the upper limit of the free zone was Arneguy, Orthez,
+# Mont-de-Marsan, Bazas, Langon, Lamotte-Montravel, Marouil, La
+# Rochefoucault, Champagne-Mouton, La Roche-Posay, La Haye-Decartes,
+# Loches, Montrichard, Vierzon, Bourges, Moulins, Digoin,
+# Paray-le-Monial, Montceau-les-Mines, Chalons-sur-Saone, Arbois,
+# Dole, Morez, St-Claude, and Collognes (Haute-Savioe).
+Rule France 1941 only - May 5 0:00 2:00 M # Midsummer
+# Shanks & Pottenger say this transition occurred at Oct 6 1:00,
+# but go with Denis Excoffier (1997-12-12),
+# who quotes the Ephemerides Astronomiques for 1998 from Bureau des Longitudes
+# as saying 5/10/41 22hUT.
+Rule France 1941 only - Oct 6 0:00 1:00 S
+Rule France 1942 only - Mar 9 0:00 2:00 M
+Rule France 1942 only - Nov 2 3:00 1:00 S
+Rule France 1943 only - Mar 29 2:00 2:00 M
+Rule France 1943 only - Oct 4 3:00 1:00 S
+Rule France 1944 only - Apr 3 2:00 2:00 M
+Rule France 1944 only - Oct 8 1:00 1:00 S
+Rule France 1945 only - Apr 2 2:00 2:00 M
+Rule France 1945 only - Sep 16 3:00 0 -
+# Shanks & Pottenger give Mar 28 2:00 and Sep 26 3:00;
+# go with Excoffier's 28/3/76 0hUT and 25/9/76 23hUT.
+Rule France 1976 only - Mar 28 1:00 1:00 S
+Rule France 1976 only - Sep 26 1:00 0 -
+# Shanks & Pottenger give 0:09:20 for Paris Mean Time, and Whitman 0:09:05,
+# but Howse quotes the actual French legislation as saying 0:09:21.
+# Go with Howse. Howse writes that the time in France was officially based
+# on PMT-0:09:21 until 1978-08-09, when the time base finally switched to UTC.
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Paris 0:09:21 - LMT 1891 Mar 15 0:01
+ 0:09:21 - PMT 1911 Mar 11 0:01 # Paris MT
+# Shanks & Pottenger give 1940 Jun 14 0:00; go with Excoffier and Le Corre.
+ 0:00 France WE%sT 1940 Jun 14 23:00
+# Le Corre says Paris stuck with occupied-France time after the liberation;
+# go with Shanks & Pottenger.
+ 1:00 C-Eur CE%sT 1944 Aug 25
+ 0:00 France WE%sT 1945 Sep 16 3:00
+ 1:00 France CE%sT 1977
+ 1:00 EU CE%sT
+
+# Germany
+
+# From Markus Kuhn (1998-09-29):
+# The German time zone web site by the Physikalisch-Technische
+# Bundesanstalt contains DST information back to 1916.
+# [See tz-link.htm for the URL.]
+
+# From Joerg Schilling (2002-10-23):
+# In 1945, Berlin was switched to Moscow Summer time (GMT+4) by <a
+# href="http://www.dhm.de/lemo/html/biografien/BersarinNikolai/">
+# General [Nikolai] Bersarin</a>.
+
+# From Paul Eggert (2003-03-08):
+# <a href="http://www.parlament-berlin.de/pds-fraktion.nsf/727459127c8b66ee8525662300459099/defc77cb784f180ac1256c2b0030274b/$FILE/bersarint.pdf">
+# says that Bersarin issued an order to use Moscow time on May 20.
+# However, Moscow did not observe daylight saving in 1945, so
+# this was equivalent to CEMT (GMT+3), not GMT+4.
+
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Germany 1945 only - Apr 2 2:00s 1:00 S
+Rule Germany 1945 only - May 24 2:00 2:00 M # Midsummer
+Rule Germany 1945 only - Sep 24 3:00 1:00 S
+Rule Germany 1945 only - Nov 18 2:00s 0 -
+Rule Germany 1946 only - Apr 14 2:00s 1:00 S
+Rule Germany 1946 only - Oct 7 2:00s 0 -
+Rule Germany 1947 1949 - Oct Sun>=1 2:00s 0 -
+Rule Germany 1947 only - Apr 6 2:00s 1:00 S
+Rule Germany 1947 only - May 11 2:00s 2:00 M
+Rule Germany 1947 only - Jun 29 3:00 1:00 S
+Rule Germany 1948 only - Apr 18 2:00s 1:00 S
+Rule Germany 1949 only - Apr 10 2:00s 1:00 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Berlin 0:53:28 - LMT 1893 Apr
+ 1:00 C-Eur CE%sT 1945 Apr 2 2:00
+ 1:00 Germany CE%sT 1980
+ 1:00 EU CE%sT
+
+# Georgia
+# Please see the "asia" file for Asia/Tbilisi.
+# Herodotus (Histories, IV.45) says Georgia north of the Phasis (now Rioni)
+# is in Europe. Our reference location Tbilisi is in the Asian part.
+
+# Gibraltar
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Gibraltar -0:21:24 - LMT 1880 Aug 2 0:00s
+ 0:00 GB-Eire %s 1957 Apr 14 2:00
+ 1:00 - CET 1982
+ 1:00 EU CE%sT
+
+# Greece
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+# Whitman gives 1932 Jul 5 - Nov 1; go with Shanks & Pottenger.
+Rule Greece 1932 only - Jul 7 0:00 1:00 S
+Rule Greece 1932 only - Sep 1 0:00 0 -
+# Whitman gives 1941 Apr 25 - ?; go with Shanks & Pottenger.
+Rule Greece 1941 only - Apr 7 0:00 1:00 S
+# Whitman gives 1942 Feb 2 - ?; go with Shanks & Pottenger.
+Rule Greece 1942 only - Nov 2 3:00 0 -
+Rule Greece 1943 only - Mar 30 0:00 1:00 S
+Rule Greece 1943 only - Oct 4 0:00 0 -
+# Whitman gives 1944 Oct 3 - Oct 31; go with Shanks & Pottenger.
+Rule Greece 1952 only - Jul 1 0:00 1:00 S
+Rule Greece 1952 only - Nov 2 0:00 0 -
+Rule Greece 1975 only - Apr 12 0:00s 1:00 S
+Rule Greece 1975 only - Nov 26 0:00s 0 -
+Rule Greece 1976 only - Apr 11 2:00s 1:00 S
+Rule Greece 1976 only - Oct 10 2:00s 0 -
+Rule Greece 1977 1978 - Apr Sun>=1 2:00s 1:00 S
+Rule Greece 1977 only - Sep 26 2:00s 0 -
+Rule Greece 1978 only - Sep 24 4:00 0 -
+Rule Greece 1979 only - Apr 1 9:00 1:00 S
+Rule Greece 1979 only - Sep 29 2:00 0 -
+Rule Greece 1980 only - Apr 1 0:00 1:00 S
+Rule Greece 1980 only - Sep 28 0:00 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Athens 1:34:52 - LMT 1895 Sep 14
+ 1:34:52 - AMT 1916 Jul 28 0:01 # Athens MT
+ 2:00 Greece EE%sT 1941 Apr 30
+ 1:00 Greece CE%sT 1944 Apr 4
+ 2:00 Greece EE%sT 1981
+ # Shanks & Pottenger say it switched to C-Eur in 1981;
+ # go with EU instead, since Greece joined it on Jan 1.
+ 2:00 EU EE%sT
+
+# Hungary
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Hungary 1918 only - Apr 1 3:00 1:00 S
+Rule Hungary 1918 only - Sep 29 3:00 0 -
+Rule Hungary 1919 only - Apr 15 3:00 1:00 S
+Rule Hungary 1919 only - Sep 15 3:00 0 -
+Rule Hungary 1920 only - Apr 5 3:00 1:00 S
+Rule Hungary 1920 only - Sep 30 3:00 0 -
+Rule Hungary 1945 only - May 1 23:00 1:00 S
+Rule Hungary 1945 only - Nov 3 0:00 0 -
+Rule Hungary 1946 only - Mar 31 2:00s 1:00 S
+Rule Hungary 1946 1949 - Oct Sun>=1 2:00s 0 -
+Rule Hungary 1947 1949 - Apr Sun>=4 2:00s 1:00 S
+Rule Hungary 1950 only - Apr 17 2:00s 1:00 S
+Rule Hungary 1950 only - Oct 23 2:00s 0 -
+Rule Hungary 1954 1955 - May 23 0:00 1:00 S
+Rule Hungary 1954 1955 - Oct 3 0:00 0 -
+Rule Hungary 1956 only - Jun Sun>=1 0:00 1:00 S
+Rule Hungary 1956 only - Sep lastSun 0:00 0 -
+Rule Hungary 1957 only - Jun Sun>=1 1:00 1:00 S
+Rule Hungary 1957 only - Sep lastSun 3:00 0 -
+Rule Hungary 1980 only - Apr 6 1:00 1:00 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Budapest 1:16:20 - LMT 1890 Oct
+ 1:00 C-Eur CE%sT 1918
+ 1:00 Hungary CE%sT 1941 Apr 6 2:00
+ 1:00 C-Eur CE%sT 1945 May 1 23:00
+ 1:00 Hungary CE%sT 1980 Sep 28 2:00s
+ 1:00 EU CE%sT
+
+# Iceland
+#
+# From Adam David (1993-11-06):
+# The name of the timezone in Iceland for system / mail / news purposes is GMT.
+#
+# (1993-12-05):
+# This material is paraphrased from the 1988 edition of the University of
+# Iceland Almanak.
+#
+# From January 1st, 1908 the whole of Iceland was standardised at 1 hour
+# behind GMT. Previously, local mean solar time was used in different parts
+# of Iceland, the almanak had been based on Reykjavik mean solar time which
+# was 1 hour and 28 minutes behind GMT.
+#
+# "first day of winter" referred to [below] means the first day of the 26 weeks
+# of winter, according to the old icelandic calendar that dates back to the
+# time the norsemen first settled Iceland. The first day of winter is always
+# Saturday, but is not dependent on the Julian or Gregorian calendars.
+#
+# (1993-12-10):
+# I have a reference from the Oxford Icelandic-English dictionary for the
+# beginning of winter, which ties it to the ecclesiastical calendar (and thus
+# to the julian/gregorian calendar) over the period in question.
+# the winter begins on the Saturday next before St. Luke's day
+# (old style), or on St. Luke's day, if a Saturday.
+# St. Luke's day ought to be traceable from ecclesiastical sources. "old style"
+# might be a reference to the Julian calendar as opposed to Gregorian, or it
+# might mean something else (???).
+#
+# From Paul Eggert (2006-03-22):
+# The Iceland Almanak, Shanks & Pottenger, and Whitman disagree on many points.
+# We go with the Almanak, except for one claim from Shanks & Pottenger, namely
+# that Reykavik was 21W57 from 1837 to 1908, local mean time before that.
+#
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Iceland 1917 1918 - Feb 19 23:00 1:00 S
+Rule Iceland 1917 only - Oct 21 1:00 0 -
+Rule Iceland 1918 only - Nov 16 1:00 0 -
+Rule Iceland 1939 only - Apr 29 23:00 1:00 S
+Rule Iceland 1939 only - Nov 29 2:00 0 -
+Rule Iceland 1940 only - Feb 25 2:00 1:00 S
+Rule Iceland 1940 only - Nov 3 2:00 0 -
+Rule Iceland 1941 only - Mar 2 1:00s 1:00 S
+Rule Iceland 1941 only - Nov 2 1:00s 0 -
+Rule Iceland 1942 only - Mar 8 1:00s 1:00 S
+Rule Iceland 1942 only - Oct 25 1:00s 0 -
+# 1943-1946 - first Sunday in March until first Sunday in winter
+Rule Iceland 1943 1946 - Mar Sun>=1 1:00s 1:00 S
+Rule Iceland 1943 1948 - Oct Sun>=22 1:00s 0 -
+# 1947-1967 - first Sunday in April until first Sunday in winter
+Rule Iceland 1947 1967 - Apr Sun>=1 1:00s 1:00 S
+# 1949 Oct transition delayed by 1 week
+Rule Iceland 1949 only - Oct 30 1:00s 0 -
+Rule Iceland 1950 1966 - Oct Sun>=22 1:00s 0 -
+Rule Iceland 1967 only - Oct 29 1:00s 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Atlantic/Reykjavik -1:27:24 - LMT 1837
+ -1:27:48 - RMT 1908 # Reykjavik Mean Time?
+ -1:00 Iceland IS%sT 1968 Apr 7 1:00s
+ 0:00 - GMT
+
+# Italy
+#
+# From Paul Eggert (2001-03-06):
+# Sicily and Sardinia each had their own time zones from 1866 to 1893,
+# called Palermo Time (+00:53:28) and Cagliari Time (+00:36:32).
+# During World War II, German-controlled Italy used German time.
+# But these events all occurred before the 1970 cutoff,
+# so record only the time in Rome.
+#
+# From Paul Eggert (2006-03-22):
+# For Italian DST we have three sources: Shanks & Pottenger, Whitman, and
+# F. Pollastri
+# <a href="http://toi.iriti.cnr.it/uk/ienitlt.html">
+# Day-light Saving Time in Italy (2006-02-03)
+# </a>
+# (`FP' below), taken from an Italian National Electrotechnical Institute
+# publication. When the three sources disagree, guess who's right, as follows:
+#
+# year FP Shanks&P. (S) Whitman (W) Go with:
+# 1916 06-03 06-03 24:00 06-03 00:00 FP & W
+# 09-30 09-30 24:00 09-30 01:00 FP; guess 24:00s
+# 1917 04-01 03-31 24:00 03-31 00:00 FP & S
+# 09-30 09-29 24:00 09-30 01:00 FP & W
+# 1918 03-09 03-09 24:00 03-09 00:00 FP & S
+# 10-06 10-05 24:00 10-06 01:00 FP & W
+# 1919 03-01 03-01 24:00 03-01 00:00 FP & S
+# 10-04 10-04 24:00 10-04 01:00 FP; guess 24:00s
+# 1920 03-20 03-20 24:00 03-20 00:00 FP & S
+# 09-18 09-18 24:00 10-01 01:00 FP; guess 24:00s
+# 1944 04-02 04-03 02:00 S (see C-Eur)
+# 09-16 10-02 03:00 FP; guess 24:00s
+# 1945 09-14 09-16 24:00 FP; guess 24:00s
+# 1970 05-21 05-31 00:00 S
+# 09-20 09-27 00:00 S
+#
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Italy 1916 only - Jun 3 0:00s 1:00 S
+Rule Italy 1916 only - Oct 1 0:00s 0 -
+Rule Italy 1917 only - Apr 1 0:00s 1:00 S
+Rule Italy 1917 only - Sep 30 0:00s 0 -
+Rule Italy 1918 only - Mar 10 0:00s 1:00 S
+Rule Italy 1918 1919 - Oct Sun>=1 0:00s 0 -
+Rule Italy 1919 only - Mar 2 0:00s 1:00 S
+Rule Italy 1920 only - Mar 21 0:00s 1:00 S
+Rule Italy 1920 only - Sep 19 0:00s 0 -
+Rule Italy 1940 only - Jun 15 0:00s 1:00 S
+Rule Italy 1944 only - Sep 17 0:00s 0 -
+Rule Italy 1945 only - Apr 2 2:00 1:00 S
+Rule Italy 1945 only - Sep 15 0:00s 0 -
+Rule Italy 1946 only - Mar 17 2:00s 1:00 S
+Rule Italy 1946 only - Oct 6 2:00s 0 -
+Rule Italy 1947 only - Mar 16 0:00s 1:00 S
+Rule Italy 1947 only - Oct 5 0:00s 0 -
+Rule Italy 1948 only - Feb 29 2:00s 1:00 S
+Rule Italy 1948 only - Oct 3 2:00s 0 -
+Rule Italy 1966 1968 - May Sun>=22 0:00 1:00 S
+Rule Italy 1966 1969 - Sep Sun>=22 0:00 0 -
+Rule Italy 1969 only - Jun 1 0:00 1:00 S
+Rule Italy 1970 only - May 31 0:00 1:00 S
+Rule Italy 1970 only - Sep lastSun 0:00 0 -
+Rule Italy 1971 1972 - May Sun>=22 0:00 1:00 S
+Rule Italy 1971 only - Sep lastSun 1:00 0 -
+Rule Italy 1972 only - Oct 1 0:00 0 -
+Rule Italy 1973 only - Jun 3 0:00 1:00 S
+Rule Italy 1973 1974 - Sep lastSun 0:00 0 -
+Rule Italy 1974 only - May 26 0:00 1:00 S
+Rule Italy 1975 only - Jun 1 0:00s 1:00 S
+Rule Italy 1975 1977 - Sep lastSun 0:00s 0 -
+Rule Italy 1976 only - May 30 0:00s 1:00 S
+Rule Italy 1977 1979 - May Sun>=22 0:00s 1:00 S
+Rule Italy 1978 only - Oct 1 0:00s 0 -
+Rule Italy 1979 only - Sep 30 0:00s 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Rome 0:49:56 - LMT 1866 Sep 22
+ 0:49:56 - RMT 1893 Nov 1 0:00s # Rome Mean
+ 1:00 Italy CE%sT 1942 Nov 2 2:00s
+ 1:00 C-Eur CE%sT 1944 Jul
+ 1:00 Italy CE%sT 1980
+ 1:00 EU CE%sT
+
+Link Europe/Rome Europe/Vatican
+Link Europe/Rome Europe/San_Marino
+
+# Latvia
+
+# From Liene Kanepe (1998-09-17):
+
+# I asked about this matter Scientific Secretary of the Institute of Astronomy
+# of The University of Latvia Dr. paed Mr. Ilgonis Vilks. I also searched the
+# correct data in juridical acts and I found some juridical documents about
+# changes in the counting of time in Latvia from 1981....
+#
+# Act No.35 of the Council of Ministers of Latvian SSR of 1981-01-22 ...
+# according to the Act No.925 of the Council of Ministers of USSR of 1980-10-24
+# ...: all year round the time of 2nd time zone + 1 hour, in addition turning
+# the hands of the clock 1 hour forward on 1 April at 00:00 (GMT 31 March 21:00)
+# and 1 hour backward on the 1 October at 00:00 (GMT 30 September 20:00).
+#
+# Act No.592 of the Council of Ministers of Latvian SSR of 1984-09-24 ...
+# according to the Act No.967 of the Council of Ministers of USSR of 1984-09-13
+# ...: all year round the time of 2nd time zone + 1 hour, in addition turning
+# the hands of the clock 1 hour forward on the last Sunday of March at 02:00
+# (GMT 23:00 on the previous day) and 1 hour backward on the last Sunday of
+# September at 03:00 (GMT 23:00 on the previous day).
+#
+# Act No.81 of the Council of Ministers of Latvian SSR of 1989-03-22 ...
+# according to the Act No.227 of the Council of Ministers of USSR of 1989-03-14
+# ...: since the last Sunday of March 1989 in Lithuanian SSR, Latvian SSR,
+# Estonian SSR and Kaliningrad region of Russian Federation all year round the
+# time of 2nd time zone (Moscow time minus one hour). On the territory of Latvia
+# transition to summer time is performed on the last Sunday of March at 02:00
+# (GMT 00:00), turning the hands of the clock 1 hour forward. The end of
+# daylight saving time is performed on the last Sunday of September at 03:00
+# (GMT 00:00), turning the hands of the clock 1 hour backward. Exception is
+# 1989-03-26, when we must not turn the hands of the clock....
+#
+# The Regulations of the Cabinet of Ministers of the Republic of Latvia of
+# 1997-01-21 on transition to Summer time ... established the same order of
+# daylight savings time settings as in the States of the European Union.
+
+# From Andrei Ivanov (2000-03-06):
+# This year Latvia will not switch to Daylight Savings Time (as specified in
+# <a href="http://www.lv-laiks.lv/wwwraksti/2000/071072/vd4.htm">
+# The Regulations of the Cabinet of Ministers of the Rep. of Latvia of
+# 29-Feb-2000 (#79)</a>, in Latvian for subscribers only).
+
+# <a href="http://www.rferl.org/newsline/2001/01/3-CEE/cee-030101.html">
+# From RFE/RL Newsline (2001-01-03), noted after a heads-up by Rives McDow:
+# </a>
+# The Latvian government on 2 January decided that the country will
+# institute daylight-saving time this spring, LETA reported.
+# Last February the three Baltic states decided not to turn back their
+# clocks one hour in the spring....
+# Minister of Economy Aigars Kalvitis noted that Latvia had too few
+# daylight hours and thus decided to comply with a draft European
+# Commission directive that provides for instituting daylight-saving
+# time in EU countries between 2002 and 2006. The Latvian government
+# urged Lithuania and Estonia to adopt a similar time policy, but it
+# appears that they will not do so....
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Latvia 1989 1996 - Mar lastSun 2:00s 1:00 S
+Rule Latvia 1989 1996 - Sep lastSun 2:00s 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Riga 1:36:24 - LMT 1880
+ 1:36:24 - RMT 1918 Apr 15 2:00 #Riga Mean Time
+ 1:36:24 1:00 LST 1918 Sep 16 3:00 #Latvian Summer
+ 1:36:24 - RMT 1919 Apr 1 2:00
+ 1:36:24 1:00 LST 1919 May 22 3:00
+ 1:36:24 - RMT 1926 May 11
+ 2:00 - EET 1940 Aug 5
+ 3:00 - MSK 1941 Jul
+ 1:00 C-Eur CE%sT 1944 Oct 13
+ 3:00 Russia MSK/MSD 1989 Mar lastSun 2:00s
+ 2:00 1:00 EEST 1989 Sep lastSun 2:00s
+ 2:00 Latvia EE%sT 1997 Jan 21
+ 2:00 EU EE%sT 2000 Feb 29
+ 2:00 - EET 2001 Jan 2
+ 2:00 EU EE%sT
+
+# Liechtenstein
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Vaduz 0:38:04 - LMT 1894 Jun
+ 1:00 - CET 1981
+ 1:00 EU CE%sT
+
+# Lithuania
+
+# From Paul Eggert (1996-11-22):
+# IATA SSIM (1992/1996) says Lithuania uses W-Eur rules, but since it is
+# known to be wrong about Estonia and Latvia, assume it's wrong here too.
+
+# From Marius Gedminas (1998-08-07):
+# I would like to inform that in this year Lithuanian time zone
+# (Europe/Vilnius) was changed.
+
+# From <a href="http://www.elta.lt/">ELTA</a> No. 972 (2582) (1999-09-29),
+# via Steffen Thorsen:
+# Lithuania has shifted back to the second time zone (GMT plus two hours)
+# to be valid here starting from October 31,
+# as decided by the national government on Wednesday....
+# The Lithuanian government also announced plans to consider a
+# motion to give up shifting to summer time in spring, as it was
+# already done by Estonia.
+
+# From the <a href="http://www.tourism.lt/informa/ff.htm">
+# Fact File, Lithuanian State Department of Tourism
+# </a> (2000-03-27): Local time is GMT+2 hours ..., no daylight saving.
+
+# From a user via Klaus Marten (2003-02-07):
+# As a candidate for membership of the European Union, Lithuania will
+# observe Summer Time in 2003, changing its clocks at the times laid
+# down in EU Directive 2000/84 of 19.I.01 (i.e. at the same times as its
+# neighbour Latvia). The text of the Lithuanian government Order of
+# 7.XI.02 to this effect can be found at
+# http://www.lrvk.lt/nut/11/n1749.htm
+
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Vilnius 1:41:16 - LMT 1880
+ 1:24:00 - WMT 1917 # Warsaw Mean Time
+ 1:35:36 - KMT 1919 Oct 10 # Kaunas Mean Time
+ 1:00 - CET 1920 Jul 12
+ 2:00 - EET 1920 Oct 9
+ 1:00 - CET 1940 Aug 3
+ 3:00 - MSK 1941 Jun 24
+ 1:00 C-Eur CE%sT 1944 Aug
+ 3:00 Russia MSK/MSD 1991 Mar 31 2:00s
+ 2:00 1:00 EEST 1991 Sep 29 2:00s
+ 2:00 C-Eur EE%sT 1998
+ 2:00 - EET 1998 Mar 29 1:00u
+ 1:00 EU CE%sT 1999 Oct 31 1:00u
+ 2:00 - EET 2003 Jan 1
+ 2:00 EU EE%sT
+
+# Luxembourg
+# Whitman disagrees with most of these dates in minor ways;
+# go with Shanks & Pottenger.
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Lux 1916 only - May 14 23:00 1:00 S
+Rule Lux 1916 only - Oct 1 1:00 0 -
+Rule Lux 1917 only - Apr 28 23:00 1:00 S
+Rule Lux 1917 only - Sep 17 1:00 0 -
+Rule Lux 1918 only - Apr Mon>=15 2:00s 1:00 S
+Rule Lux 1918 only - Sep Mon>=15 2:00s 0 -
+Rule Lux 1919 only - Mar 1 23:00 1:00 S
+Rule Lux 1919 only - Oct 5 3:00 0 -
+Rule Lux 1920 only - Feb 14 23:00 1:00 S
+Rule Lux 1920 only - Oct 24 2:00 0 -
+Rule Lux 1921 only - Mar 14 23:00 1:00 S
+Rule Lux 1921 only - Oct 26 2:00 0 -
+Rule Lux 1922 only - Mar 25 23:00 1:00 S
+Rule Lux 1922 only - Oct Sun>=2 1:00 0 -
+Rule Lux 1923 only - Apr 21 23:00 1:00 S
+Rule Lux 1923 only - Oct Sun>=2 2:00 0 -
+Rule Lux 1924 only - Mar 29 23:00 1:00 S
+Rule Lux 1924 1928 - Oct Sun>=2 1:00 0 -
+Rule Lux 1925 only - Apr 5 23:00 1:00 S
+Rule Lux 1926 only - Apr 17 23:00 1:00 S
+Rule Lux 1927 only - Apr 9 23:00 1:00 S
+Rule Lux 1928 only - Apr 14 23:00 1:00 S
+Rule Lux 1929 only - Apr 20 23:00 1:00 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Luxembourg 0:24:36 - LMT 1904 Jun
+ 1:00 Lux CE%sT 1918 Nov 25
+ 0:00 Lux WE%sT 1929 Oct 6 2:00s
+ 0:00 Belgium WE%sT 1940 May 14 3:00
+ 1:00 C-Eur WE%sT 1944 Sep 18 3:00
+ 1:00 Belgium CE%sT 1977
+ 1:00 EU CE%sT
+
+# Macedonia
+# see Serbia
+
+# Malta
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Malta 1973 only - Mar 31 0:00s 1:00 S
+Rule Malta 1973 only - Sep 29 0:00s 0 -
+Rule Malta 1974 only - Apr 21 0:00s 1:00 S
+Rule Malta 1974 only - Sep 16 0:00s 0 -
+Rule Malta 1975 1979 - Apr Sun>=15 2:00 1:00 S
+Rule Malta 1975 1980 - Sep Sun>=15 2:00 0 -
+Rule Malta 1980 only - Mar 31 2:00 1:00 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Malta 0:58:04 - LMT 1893 Nov 2 0:00s # Valletta
+ 1:00 Italy CE%sT 1942 Nov 2 2:00s
+ 1:00 C-Eur CE%sT 1945 Apr 2 2:00s
+ 1:00 Italy CE%sT 1973 Mar 31
+ 1:00 Malta CE%sT 1981
+ 1:00 EU CE%sT
+
+# Moldova
+
+# From Paul Eggert (2006-03-22):
+# A previous version of this database followed Shanks & Pottenger, who write
+# that Tiraspol switched to Moscow time on 1992-01-19 at 02:00.
+# However, this is most likely an error, as Moldova declared independence
+# on 1991-08-27 (the 1992-01-19 date is that of a Russian decree).
+# In early 1992 there was large-scale interethnic violence in the area
+# and it's possible that some Russophones continued to observe Moscow time.
+# But [two people] separately reported via
+# Jesper Norgaard that as of 2001-01-24 Tiraspol was like Chisinau.
+# The Tiraspol entry has therefore been removed for now.
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Chisinau 1:55:20 - LMT 1880
+ 1:55 - CMT 1918 Feb 15 # Chisinau MT
+ 1:44:24 - BMT 1931 Jul 24 # Bucharest MT
+ 2:00 Romania EE%sT 1940 Aug 15
+ 2:00 1:00 EEST 1941 Jul 17
+ 1:00 C-Eur CE%sT 1944 Aug 24
+ 3:00 Russia MSK/MSD 1990
+ 3:00 - MSK 1990 May 6
+ 2:00 - EET 1991
+ 2:00 Russia EE%sT 1992
+ 2:00 E-Eur EE%sT 1997
+# See Romania commentary for the guessed 1997 transition to EU rules.
+ 2:00 EU EE%sT
+
+# Monaco
+# Shanks & Pottenger give 0:09:20 for Paris Mean Time; go with Howse's
+# more precise 0:09:21.
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Monaco 0:29:32 - LMT 1891 Mar 15
+ 0:09:21 - PMT 1911 Mar 11 # Paris Mean Time
+ 0:00 France WE%sT 1945 Sep 16 3:00
+ 1:00 France CE%sT 1977
+ 1:00 EU CE%sT
+
+# Montenegro
+# see Serbia
+
+# Netherlands
+
+# Howse writes that the Netherlands' railways used GMT between 1892 and 1940,
+# but for other purposes the Netherlands used Amsterdam mean time.
+
+# However, Robert H. van Gent writes (2001-04-01):
+# Howse's statement is only correct up to 1909. From 1909-05-01 (00:00:00
+# Amsterdam mean time) onwards, the whole of the Netherlands (including
+# the Dutch railways) was required by law to observe Amsterdam mean time
+# (19 minutes 32.13 seconds ahead of GMT). This had already been the
+# common practice (except for the railways) for many decades but it was
+# not until 1909 when the Dutch government finally defined this by law.
+# On 1937-07-01 this was changed to 20 minutes (exactly) ahead of GMT and
+# was generally known as Dutch Time ("Nederlandse Tijd").
+#
+# (2001-04-08):
+# 1892-05-01 was the date when the Dutch railways were by law required to
+# observe GMT while the remainder of the Netherlands adhered to the common
+# practice of following Amsterdam mean time.
+#
+# (2001-04-09):
+# In 1835 the authorities of the province of North Holland requested the
+# municipal authorities of the towns and cities in the province to observe
+# Amsterdam mean time but I do not know in how many cases this request was
+# actually followed.
+#
+# From 1852 onwards the Dutch telegraph offices were by law required to
+# observe Amsterdam mean time. As the time signals from the observatory of
+# Leiden were also distributed by the telegraph system, I assume that most
+# places linked up with the telegraph (and railway) system automatically
+# adopted Amsterdam mean time.
+#
+# Although the early Dutch railway companies initially observed a variety
+# of times, most of them had adopted Amsterdam mean time by 1858 but it
+# was not until 1866 when they were all required by law to observe
+# Amsterdam mean time.
+
+# The data before 1945 are taken from
+# <http://www.phys.uu.nl/~vgent/wettijd/wettijd.htm>.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Neth 1916 only - May 1 0:00 1:00 NST # Netherlands Summer Time
+Rule Neth 1916 only - Oct 1 0:00 0 AMT # Amsterdam Mean Time
+Rule Neth 1917 only - Apr 16 2:00s 1:00 NST
+Rule Neth 1917 only - Sep 17 2:00s 0 AMT
+Rule Neth 1918 1921 - Apr Mon>=1 2:00s 1:00 NST
+Rule Neth 1918 1921 - Sep lastMon 2:00s 0 AMT
+Rule Neth 1922 only - Mar lastSun 2:00s 1:00 NST
+Rule Neth 1922 1936 - Oct Sun>=2 2:00s 0 AMT
+Rule Neth 1923 only - Jun Fri>=1 2:00s 1:00 NST
+Rule Neth 1924 only - Mar lastSun 2:00s 1:00 NST
+Rule Neth 1925 only - Jun Fri>=1 2:00s 1:00 NST
+# From 1926 through 1939 DST began 05-15, except that it was delayed by a week
+# in years when 05-15 fell in the Pentecost weekend.
+Rule Neth 1926 1931 - May 15 2:00s 1:00 NST
+Rule Neth 1932 only - May 22 2:00s 1:00 NST
+Rule Neth 1933 1936 - May 15 2:00s 1:00 NST
+Rule Neth 1937 only - May 22 2:00s 1:00 NST
+Rule Neth 1937 only - Jul 1 0:00 1:00 S
+Rule Neth 1937 1939 - Oct Sun>=2 2:00s 0 -
+Rule Neth 1938 1939 - May 15 2:00s 1:00 S
+Rule Neth 1945 only - Apr 2 2:00s 1:00 S
+Rule Neth 1945 only - Sep 16 2:00s 0 -
+#
+# Amsterdam Mean Time was +00:19:32.13 exactly, but the .13 is omitted
+# below because the current format requires GMTOFF to be an integer.
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Amsterdam 0:19:32 - LMT 1835
+ 0:19:32 Neth %s 1937 Jul 1
+ 0:20 Neth NE%sT 1940 May 16 0:00 # Dutch Time
+ 1:00 C-Eur CE%sT 1945 Apr 2 2:00
+ 1:00 Neth CE%sT 1977
+ 1:00 EU CE%sT
+
+# Norway
+# http://met.no/met/met_lex/q_u/sommertid.html (2004-01) agrees with Shanks &
+# Pottenger.
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Norway 1916 only - May 22 1:00 1:00 S
+Rule Norway 1916 only - Sep 30 0:00 0 -
+Rule Norway 1945 only - Apr 2 2:00s 1:00 S
+Rule Norway 1945 only - Oct 1 2:00s 0 -
+Rule Norway 1959 1964 - Mar Sun>=15 2:00s 1:00 S
+Rule Norway 1959 1965 - Sep Sun>=15 2:00s 0 -
+Rule Norway 1965 only - Apr 25 2:00s 1:00 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Oslo 0:43:00 - LMT 1895 Jan 1
+ 1:00 Norway CE%sT 1940 Aug 10 23:00
+ 1:00 C-Eur CE%sT 1945 Apr 2 2:00
+ 1:00 Norway CE%sT 1980
+ 1:00 EU CE%sT
+
+# Svalbard & Jan Mayen
+
+# From Steffen Thorsen (2001-05-01):
+# Although I could not find it explicitly, it seems that Jan Mayen and
+# Svalbard have been using the same time as Norway at least since the
+# time they were declared as parts of Norway. Svalbard was declared
+# as a part of Norway by law of 1925-07-17 no 11, section 4 and Jan
+# Mayen by law of 1930-02-27 no 2, section 2. (From
+# http://www.lovdata.no/all/nl-19250717-011.html and
+# http://www.lovdata.no/all/nl-19300227-002.html). The law/regulation
+# for normal/standard time in Norway is from 1894-06-29 no 1 (came
+# into operation on 1895-01-01) and Svalbard/Jan Mayen seem to be a
+# part of this law since 1925/1930. (From
+# http://www.lovdata.no/all/nl-18940629-001.html ) I have not been
+# able to find if Jan Mayen used a different time zone (e.g. -0100)
+# before 1930. Jan Mayen has only been "inhabitated" since 1921 by
+# Norwegian meteorologists and maybe used the same time as Norway ever
+# since 1921. Svalbard (Arctic/Longyearbyen) has been inhabited since
+# before 1895, and therefore probably changed the local time somewhere
+# between 1895 and 1925 (inclusive).
+
+# From Paul Eggert (2001-05-01):
+#
+# Actually, Jan Mayen was never occupied by Germany during World War II,
+# so it must have diverged from Oslo time during the war, as Oslo was
+# keeping Berlin time.
+#
+# <http://home.no.net/janmayen/history.htm> says that the meteorologists
+# burned down their station in 1940 and left the island, but returned in
+# 1941 with a small Norwegian garrison and continued operations despite
+# frequent air ttacks from Germans. In 1943 the Americans established a
+# radiolocating station on the island, called "Atlantic City". Possibly
+# the UTC offset changed during the war, but I think it unlikely that
+# Jan Mayen used German daylight-saving rules.
+#
+# Svalbard is more complicated, as it was raided in August 1941 by an
+# Allied party that evacuated the civilian population to England (says
+# <http://www.bartleby.com/65/sv/Svalbard.html>). The Svalbard FAQ
+# <http://www.svalbard.com/SvalbardFAQ.html> says that the Germans were
+# expelled on 1942-05-14. However, small parties of Germans did return,
+# and according to Wilhelm Dege's book "War North of 80" (1954)
+# <http://www.ucalgary.ca/UofC/departments/UP/1-55238/1-55238-110-2.html>
+# the German armed forces at the Svalbard weather station code-named
+# Haudegen did not surrender to the Allies until September 1945.
+#
+# All these events predate our cutoff date of 1970. Unless we can
+# come up with more definitive info about the timekeeping during the
+# war years it's probably best just do do the following for now:
+Link Europe/Oslo Arctic/Longyearbyen
+
+# Poland
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Poland 1918 1919 - Sep 16 2:00s 0 -
+Rule Poland 1919 only - Apr 15 2:00s 1:00 S
+Rule Poland 1944 only - Apr 3 2:00s 1:00 S
+# Whitman gives 1944 Nov 30; go with Shanks & Pottenger.
+Rule Poland 1944 only - Oct 4 2:00 0 -
+# For 1944-1948 Whitman gives the previous day; go with Shanks & Pottenger.
+Rule Poland 1945 only - Apr 29 0:00 1:00 S
+Rule Poland 1945 only - Nov 1 0:00 0 -
+# For 1946 on the source is Kazimierz Borkowski,
+# Torun Center for Astronomy, Dept. of Radio Astronomy, Nicolaus Copernicus U.,
+# <http://www.astro.uni.torun.pl/~kb/Artykuly/U-PA/Czas2.htm#tth_tAb1>
+# Thanks to Przemyslaw Augustyniak (2005-05-28) for this reference.
+# He also gives these further references:
+# Mon Pol nr 13, poz 162 (1995) <http://www.abc.com.pl/serwis/mp/1995/0162.htm>
+# Druk nr 2180 (2003) <http://www.senat.gov.pl/k5/dok/sejm/053/2180.pdf>
+Rule Poland 1946 only - Apr 14 0:00s 1:00 S
+Rule Poland 1946 only - Oct 7 2:00s 0 -
+Rule Poland 1947 only - May 4 2:00s 1:00 S
+Rule Poland 1947 1949 - Oct Sun>=1 2:00s 0 -
+Rule Poland 1948 only - Apr 18 2:00s 1:00 S
+Rule Poland 1949 only - Apr 10 2:00s 1:00 S
+Rule Poland 1957 only - Jun 2 1:00s 1:00 S
+Rule Poland 1957 1958 - Sep lastSun 1:00s 0 -
+Rule Poland 1958 only - Mar 30 1:00s 1:00 S
+Rule Poland 1959 only - May 31 1:00s 1:00 S
+Rule Poland 1959 1961 - Oct Sun>=1 1:00s 0 -
+Rule Poland 1960 only - Apr 3 1:00s 1:00 S
+Rule Poland 1961 1964 - May lastSun 1:00s 1:00 S
+Rule Poland 1962 1964 - Sep lastSun 1:00s 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Warsaw 1:24:00 - LMT 1880
+ 1:24:00 - WMT 1915 Aug 5 # Warsaw Mean Time
+ 1:00 C-Eur CE%sT 1918 Sep 16 3:00
+ 2:00 Poland EE%sT 1922 Jun
+ 1:00 Poland CE%sT 1940 Jun 23 2:00
+ 1:00 C-Eur CE%sT 1944 Oct
+ 1:00 Poland CE%sT 1977
+ 1:00 W-Eur CE%sT 1988
+ 1:00 EU CE%sT
+
+# Portugal
+#
+# From Rui Pedro Salgueiro (1992-11-12):
+# Portugal has recently (September, 27) changed timezone
+# (from WET to MET or CET) to harmonize with EEC.
+#
+# Martin Bruckmann (1996-02-29) reports via Peter Ilieve
+# that Portugal is reverting to 0:00 by not moving its clocks this spring.
+# The new Prime Minister was fed up with getting up in the dark in the winter.
+#
+# From Paul Eggert (1996-11-12):
+# IATA SSIM (1991-09) reports several 1991-09 and 1992-09 transitions
+# at 02:00u, not 01:00u. Assume that these are typos.
+# IATA SSIM (1991/1992) reports that the Azores were at -1:00.
+# IATA SSIM (1993-02) says +0:00; later issues (through 1996-09) say -1:00.
+# Guess that the Azores changed to EU rules in 1992 (since that's when Portugal
+# harmonized with the EU), and that they stayed +0:00 that winter.
+#
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+# DSH writes that despite Decree 1,469 (1915), the change to the clocks was not
+# done every year, depending on what Spain did, because of railroad schedules.
+# Go with Shanks & Pottenger.
+Rule Port 1916 only - Jun 17 23:00 1:00 S
+# Whitman gives 1916 Oct 31; go with Shanks & Pottenger.
+Rule Port 1916 only - Nov 1 1:00 0 -
+Rule Port 1917 only - Feb 28 23:00s 1:00 S
+Rule Port 1917 1921 - Oct 14 23:00s 0 -
+Rule Port 1918 only - Mar 1 23:00s 1:00 S
+Rule Port 1919 only - Feb 28 23:00s 1:00 S
+Rule Port 1920 only - Feb 29 23:00s 1:00 S
+Rule Port 1921 only - Feb 28 23:00s 1:00 S
+Rule Port 1924 only - Apr 16 23:00s 1:00 S
+Rule Port 1924 only - Oct 14 23:00s 0 -
+Rule Port 1926 only - Apr 17 23:00s 1:00 S
+Rule Port 1926 1929 - Oct Sat>=1 23:00s 0 -
+Rule Port 1927 only - Apr 9 23:00s 1:00 S
+Rule Port 1928 only - Apr 14 23:00s 1:00 S
+Rule Port 1929 only - Apr 20 23:00s 1:00 S
+Rule Port 1931 only - Apr 18 23:00s 1:00 S
+# Whitman gives 1931 Oct 8; go with Shanks & Pottenger.
+Rule Port 1931 1932 - Oct Sat>=1 23:00s 0 -
+Rule Port 1932 only - Apr 2 23:00s 1:00 S
+Rule Port 1934 only - Apr 7 23:00s 1:00 S
+# Whitman gives 1934 Oct 5; go with Shanks & Pottenger.
+Rule Port 1934 1938 - Oct Sat>=1 23:00s 0 -
+# Shanks & Pottenger give 1935 Apr 30; go with Whitman.
+Rule Port 1935 only - Mar 30 23:00s 1:00 S
+Rule Port 1936 only - Apr 18 23:00s 1:00 S
+# Whitman gives 1937 Apr 2; go with Shanks & Pottenger.
+Rule Port 1937 only - Apr 3 23:00s 1:00 S
+Rule Port 1938 only - Mar 26 23:00s 1:00 S
+Rule Port 1939 only - Apr 15 23:00s 1:00 S
+# Whitman gives 1939 Oct 7; go with Shanks & Pottenger.
+Rule Port 1939 only - Nov 18 23:00s 0 -
+Rule Port 1940 only - Feb 24 23:00s 1:00 S
+# Shanks & Pottenger give 1940 Oct 7; go with Whitman.
+Rule Port 1940 1941 - Oct 5 23:00s 0 -
+Rule Port 1941 only - Apr 5 23:00s 1:00 S
+Rule Port 1942 1945 - Mar Sat>=8 23:00s 1:00 S
+Rule Port 1942 only - Apr 25 22:00s 2:00 M # Midsummer
+Rule Port 1942 only - Aug 15 22:00s 1:00 S
+Rule Port 1942 1945 - Oct Sat>=24 23:00s 0 -
+Rule Port 1943 only - Apr 17 22:00s 2:00 M
+Rule Port 1943 1945 - Aug Sat>=25 22:00s 1:00 S
+Rule Port 1944 1945 - Apr Sat>=21 22:00s 2:00 M
+Rule Port 1946 only - Apr Sat>=1 23:00s 1:00 S
+Rule Port 1946 only - Oct Sat>=1 23:00s 0 -
+Rule Port 1947 1949 - Apr Sun>=1 2:00s 1:00 S
+Rule Port 1947 1949 - Oct Sun>=1 2:00s 0 -
+# Shanks & Pottenger say DST was observed in 1950; go with Whitman.
+# Whitman gives Oct lastSun for 1952 on; go with Shanks & Pottenger.
+Rule Port 1951 1965 - Apr Sun>=1 2:00s 1:00 S
+Rule Port 1951 1965 - Oct Sun>=1 2:00s 0 -
+Rule Port 1977 only - Mar 27 0:00s 1:00 S
+Rule Port 1977 only - Sep 25 0:00s 0 -
+Rule Port 1978 1979 - Apr Sun>=1 0:00s 1:00 S
+Rule Port 1978 only - Oct 1 0:00s 0 -
+Rule Port 1979 1982 - Sep lastSun 1:00s 0 -
+Rule Port 1980 only - Mar lastSun 0:00s 1:00 S
+Rule Port 1981 1982 - Mar lastSun 1:00s 1:00 S
+Rule Port 1983 only - Mar lastSun 2:00s 1:00 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+# Shanks & Pottenger say the transition from LMT to WET occurred 1911-05-24;
+# Willett says 1912-01-01. Go with Willett.
+Zone Europe/Lisbon -0:36:32 - LMT 1884
+ -0:36:32 - LMT 1912 Jan 1 # Lisbon Mean Time
+ 0:00 Port WE%sT 1966 Apr 3 2:00
+ 1:00 - CET 1976 Sep 26 1:00
+ 0:00 Port WE%sT 1983 Sep 25 1:00s
+ 0:00 W-Eur WE%sT 1992 Sep 27 1:00s
+ 1:00 EU CE%sT 1996 Mar 31 1:00u
+ 0:00 EU WE%sT
+Zone Atlantic/Azores -1:42:40 - LMT 1884 # Ponta Delgada
+ -1:54:32 - HMT 1911 May 24 # Horta Mean Time
+ -2:00 Port AZO%sT 1966 Apr 3 2:00 # Azores Time
+ -1:00 Port AZO%sT 1983 Sep 25 1:00s
+ -1:00 W-Eur AZO%sT 1992 Sep 27 1:00s
+ 0:00 EU WE%sT 1993 Mar 28 1:00u
+ -1:00 EU AZO%sT
+Zone Atlantic/Madeira -1:07:36 - LMT 1884 # Funchal
+ -1:07:36 - FMT 1911 May 24 # Funchal Mean Time
+ -1:00 Port MAD%sT 1966 Apr 3 2:00 # Madeira Time
+ 0:00 Port WE%sT 1983 Sep 25 1:00s
+ 0:00 EU WE%sT
+
+# Romania
+#
+# From Paul Eggert (1999-10-07):
+# <a href="http://www.nineoclock.ro/POL/1778pol.html">
+# Nine O'clock</a> (1998-10-23) reports that the switch occurred at
+# 04:00 local time in fall 1998. For lack of better info,
+# assume that Romania and Moldova switched to EU rules in 1997,
+# the same year as Bulgaria.
+#
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Romania 1932 only - May 21 0:00s 1:00 S
+Rule Romania 1932 1939 - Oct Sun>=1 0:00s 0 -
+Rule Romania 1933 1939 - Apr Sun>=2 0:00s 1:00 S
+Rule Romania 1979 only - May 27 0:00 1:00 S
+Rule Romania 1979 only - Sep lastSun 0:00 0 -
+Rule Romania 1980 only - Apr 5 23:00 1:00 S
+Rule Romania 1980 only - Sep lastSun 1:00 0 -
+Rule Romania 1991 1993 - Mar lastSun 0:00s 1:00 S
+Rule Romania 1991 1993 - Sep lastSun 0:00s 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Bucharest 1:44:24 - LMT 1891 Oct
+ 1:44:24 - BMT 1931 Jul 24 # Bucharest MT
+ 2:00 Romania EE%sT 1981 Mar 29 2:00s
+ 2:00 C-Eur EE%sT 1991
+ 2:00 Romania EE%sT 1994
+ 2:00 E-Eur EE%sT 1997
+ 2:00 EU EE%sT
+
+# Russia
+
+# From Paul Eggert (2006-03-22):
+# Except for Moscow after 1919-07-01, I invented the time zone abbreviations.
+# Moscow time zone abbreviations after 1919-07-01, and Moscow rules after 1991,
+# are from Andrey A. Chernov. The rest is from Shanks & Pottenger,
+# except we follow Chernov's report that 1992 DST transitions were Sat
+# 23:00, not Sun 02:00s.
+#
+# From Stanislaw A. Kuzikowski (1994-06-29):
+# But now it is some months since Novosibirsk is 3 hours ahead of Moscow!
+# I do not know why they have decided to make this change;
+# as far as I remember it was done exactly during winter->summer switching
+# so we (Novosibirsk) simply did not switch.
+#
+# From Andrey A. Chernov (1996-10-04):
+# `MSK' and `MSD' were born and used initially on Moscow computers with
+# UNIX-like OSes by several developer groups (e.g. Demos group, Kiae group)....
+# The next step was the UUCP network, the Relcom predecessor
+# (used mainly for mail), and MSK/MSD was actively used there.
+#
+# From Chris Carrier (1996-10-30):
+# According to a friend of mine who rode the Trans-Siberian Railroad from
+# Moscow to Irkutsk in 1995, public air and rail transport in Russia ...
+# still follows Moscow time, no matter where in Russia it is located.
+#
+# For Grozny, Chechnya, we have the following story from
+# John Daniszewski, "Scavengers in the Rubble", Los Angeles Times (2001-02-07):
+# News--often false--is spread by word of mouth. A rumor that it was
+# time to move the clocks back put this whole city out of sync with
+# the rest of Russia for two weeks--even soldiers stationed here began
+# enforcing curfew at the wrong time.
+#
+# From Gwillim Law (2001-06-05):
+# There's considerable evidence that Sakhalin Island used to be in
+# UTC+11, and has changed to UTC+10, in this decade. I start with the
+# SSIM, which listed Yuzhno-Sakhalinsk in zone RU10 along with Magadan
+# until February 1997, and then in RU9 with Khabarovsk and Vladivostok
+# since September 1997.... Although the Kuril Islands are
+# administratively part of Sakhalin oblast', they appear to have
+# remained on UTC+11 along with Magadan.
+#
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+#
+# Kaliningradskaya oblast'.
+Zone Europe/Kaliningrad 1:22:00 - LMT 1893 Apr
+ 1:00 C-Eur CE%sT 1945
+ 2:00 Poland CE%sT 1946
+ 3:00 Russia MSK/MSD 1991 Mar 31 2:00s
+ 2:00 Russia EE%sT
+#
+# From Oscar van Vlijmen (2001-08-25): [This region consists of]
+# Respublika Adygeya, Arkhangel'skaya oblast',
+# Belgorodskaya oblast', Bryanskaya oblast', Vladimirskaya oblast',
+# Vologodskaya oblast', Voronezhskaya oblast',
+# Respublika Dagestan, Ivanovskaya oblast', Respublika Ingushetiya,
+# Kabarbino-Balkarskaya Respublika, Respublika Kalmykiya,
+# Kalyzhskaya oblast', Respublika Karachaevo-Cherkessiya,
+# Respublika Kareliya, Respublika Komi,
+# Kostromskaya oblast', Krasnodarskij kraj, Kurskaya oblast',
+# Leningradskaya oblast', Lipetskaya oblast', Respublika Marij El,
+# Respublika Mordoviya, Moskva, Moskovskaya oblast',
+# Murmanskaya oblast', Nenetskij avtonomnyj okrug,
+# Nizhegorodskaya oblast', Novgorodskaya oblast', Orlovskaya oblast',
+# Penzenskaya oblast', Pskovskaya oblast', Rostovskaya oblast',
+# Ryazanskaya oblast', Sankt-Peterburg,
+# Respublika Severnaya Osetiya, Smolenskaya oblast',
+# Stavropol'skij kraj, Tambovskaya oblast', Respublika Tatarstan,
+# Tverskaya oblast', Tyl'skaya oblast', Ul'yanovskaya oblast',
+# Chechenskaya Respublika, Chuvashskaya oblast',
+# Yaroslavskaya oblast'
+Zone Europe/Moscow 2:30:20 - LMT 1880
+ 2:30 - MMT 1916 Jul 3 # Moscow Mean Time
+ 2:30:48 Russia %s 1919 Jul 1 2:00
+ 3:00 Russia MSK/MSD 1922 Oct
+ 2:00 - EET 1930 Jun 21
+ 3:00 Russia MSK/MSD 1991 Mar 31 2:00s
+ 2:00 Russia EE%sT 1992 Jan 19 2:00s
+ 3:00 Russia MSK/MSD
+#
+# Astrakhanskaya oblast', Kirovskaya oblast', Saratovskaya oblast',
+# Volgogradskaya oblast'. Shanks & Pottenger say Kirov is still at +0400
+# but Wikipedia (2006-05-09) says +0300. Perhaps it switched after the
+# others? But we have no data.
+Zone Europe/Volgograd 2:57:40 - LMT 1920 Jan 3
+ 3:00 - TSAT 1925 Apr 6 # Tsaritsyn Time
+ 3:00 - STAT 1930 Jun 21 # Stalingrad Time
+ 4:00 - STAT 1961 Nov 11
+ 4:00 Russia VOL%sT 1989 Mar 26 2:00s # Volgograd T
+ 3:00 Russia VOL%sT 1991 Mar 31 2:00s
+ 4:00 - VOLT 1992 Mar 29 2:00s
+ 3:00 Russia VOL%sT
+#
+# From Oscar van Vlijmen (2001-08-25): [This region consists of]
+# Samarskaya oblast', Udmyrtskaya respublika
+Zone Europe/Samara 3:20:36 - LMT 1919 Jul 1 2:00
+ 3:00 - SAMT 1930 Jun 21
+ 4:00 - SAMT 1935 Jan 27
+ 4:00 Russia KUY%sT 1989 Mar 26 2:00s # Kuybyshev
+ 3:00 Russia KUY%sT 1991 Mar 31 2:00s
+ 2:00 Russia KUY%sT 1991 Sep 29 2:00s
+ 3:00 - KUYT 1991 Oct 20 3:00
+ 4:00 Russia SAM%sT # Samara Time
+#
+# From Oscar van Vlijmen (2001-08-25): [This region consists of]
+# Respublika Bashkortostan, Komi-Permyatskij avtonomnyj okrug,
+# Kurganskaya oblast', Orenburgskaya oblast', Permskaya oblast',
+# Sverdlovskaya oblast', Tyumenskaya oblast',
+# Khanty-Manskijskij avtonomnyj okrug, Chelyabinskaya oblast',
+# Yamalo-Nenetskij avtonomnyj okrug.
+Zone Asia/Yekaterinburg 4:02:24 - LMT 1919 Jul 15 4:00
+ 4:00 - SVET 1930 Jun 21 # Sverdlovsk Time
+ 5:00 Russia SVE%sT 1991 Mar 31 2:00s
+ 4:00 Russia SVE%sT 1992 Jan 19 2:00s
+ 5:00 Russia YEK%sT # Yekaterinburg Time
+#
+# From Oscar van Vlijmen (2001-08-25): [This region consists of]
+# Respublika Altaj, Altajskij kraj, Omskaya oblast'.
+Zone Asia/Omsk 4:53:36 - LMT 1919 Nov 14
+ 5:00 - OMST 1930 Jun 21 # Omsk TIme
+ 6:00 Russia OMS%sT 1991 Mar 31 2:00s
+ 5:00 Russia OMS%sT 1992 Jan 19 2:00s
+ 6:00 Russia OMS%sT
+#
+# From Paul Eggert (2006-08-19): I'm guessing about Tomsk here; it's
+# not clear when it switched from +7 to +6.
+# Novosibirskaya oblast', Tomskaya oblast'.
+Zone Asia/Novosibirsk 5:31:40 - LMT 1919 Dec 14 6:00
+ 6:00 - NOVT 1930 Jun 21 # Novosibirsk Time
+ 7:00 Russia NOV%sT 1991 Mar 31 2:00s
+ 6:00 Russia NOV%sT 1992 Jan 19 2:00s
+ 7:00 Russia NOV%sT 1993 May 23 # say Shanks & P.
+ 6:00 Russia NOV%sT
+#
+# From Oscar van Vlijmen (2001-08-25): [This region consists of]
+# Kemerovskaya oblast', Krasnoyarskij kraj,
+# Tajmyrskij (Dolgano-Nenetskij) avtonomnyj okrug,
+# Respublika Tuva, Respublika Khakasiya, Evenkijskij avtonomnyj okrug.
+Zone Asia/Krasnoyarsk 6:11:20 - LMT 1920 Jan 6
+ 6:00 - KRAT 1930 Jun 21 # Krasnoyarsk Time
+ 7:00 Russia KRA%sT 1991 Mar 31 2:00s
+ 6:00 Russia KRA%sT 1992 Jan 19 2:00s
+ 7:00 Russia KRA%sT
+#
+# From Oscar van Vlijmen (2001-08-25): [This region consists of]
+# Respublika Buryatiya, Irkutskaya oblast',
+# Ust'-Ordynskij Buryatskij avtonomnyj okrug.
+Zone Asia/Irkutsk 6:57:20 - LMT 1880
+ 6:57:20 - IMT 1920 Jan 25 # Irkutsk Mean Time
+ 7:00 - IRKT 1930 Jun 21 # Irkutsk Time
+ 8:00 Russia IRK%sT 1991 Mar 31 2:00s
+ 7:00 Russia IRK%sT 1992 Jan 19 2:00s
+ 8:00 Russia IRK%sT
+#
+# From Oscar van Vlijmen (2003-10-18): [This region consists of]
+# Aginskij Buryatskij avtonomnyj okrug, Amurskaya oblast',
+# [parts of] Respublika Sakha (Yakutiya), Chitinskaya oblast'.
+# The Sakha districts are: Aldanskij, Amginskij, Anabarskij,
+# Bulunskij, Verkhnekolymskij, Verkhnevilyujskij, Vilyujskij, Gornyj,
+# Zhiganskij, Kobyajskij, Lenskij, Megino-Kangalasskij, Mirninskij,
+# Namskij, Nyurbinskij, Olenekskij, Olekminskij, Srednekolymskij,
+# Suntarskij, Tattinskij, Ust'-Aldanskij, Khangalasskij,
+# Churapchinskij, Eveno-Bytantajskij.
+Zone Asia/Yakutsk 8:38:40 - LMT 1919 Dec 15
+ 8:00 - YAKT 1930 Jun 21 # Yakutsk Time
+ 9:00 Russia YAK%sT 1991 Mar 31 2:00s
+ 8:00 Russia YAK%sT 1992 Jan 19 2:00s
+ 9:00 Russia YAK%sT
+#
+# From Oscar van Vlijmen (2003-10-18): [This region consists of]
+# Evrejskaya avtonomnaya oblast', Khabarovskij kraj, Primorskij kraj,
+# [parts of] Respublika Sakha (Yakutiya).
+# The Sakha districts are: Verkhoyanskij, Tomponskij, Ust'-Majskij,
+# Ust'-Yanskij.
+Zone Asia/Vladivostok 8:47:44 - LMT 1922 Nov 15
+ 9:00 - VLAT 1930 Jun 21 # Vladivostok Time
+ 10:00 Russia VLA%sT 1991 Mar 31 2:00s
+ 9:00 Russia VLA%sST 1992 Jan 19 2:00s
+ 10:00 Russia VLA%sT
+#
+# Sakhalinskaya oblast'.
+# The Zone name should be Yuzhno-Sakhalinsk, but that's too long.
+Zone Asia/Sakhalin 9:30:48 - LMT 1905 Aug 23
+ 9:00 - CJT 1938
+ 9:00 - JST 1945 Aug 25
+ 11:00 Russia SAK%sT 1991 Mar 31 2:00s # Sakhalin T.
+ 10:00 Russia SAK%sT 1992 Jan 19 2:00s
+ 11:00 Russia SAK%sT 1997 Mar lastSun 2:00s
+ 10:00 Russia SAK%sT
+#
+# From Oscar van Vlijmen (2003-10-18): [This region consists of]
+# Magadanskaya oblast', Respublika Sakha (Yakutiya).
+# Probably also: Kuril Islands.
+# The Sakha districts are: Abyjskij, Allaikhovskij, Momskij,
+# Nizhnekolymskij, Ojmyakonskij.
+Zone Asia/Magadan 10:03:12 - LMT 1924 May 2
+ 10:00 - MAGT 1930 Jun 21 # Magadan Time
+ 11:00 Russia MAG%sT 1991 Mar 31 2:00s
+ 10:00 Russia MAG%sT 1992 Jan 19 2:00s
+ 11:00 Russia MAG%sT
+#
+# From Oscar van Vlijmen (2001-08-25): [This region consists of]
+# Kamchatskaya oblast', Koryakskij avtonomnyj okrug.
+#
+# The Zone name should be Asia/Petropavlovsk-Kamchatski, but that's too long.
+Zone Asia/Kamchatka 10:34:36 - LMT 1922 Nov 10
+ 11:00 - PETT 1930 Jun 21 # P-K Time
+ 12:00 Russia PET%sT 1991 Mar 31 2:00s
+ 11:00 Russia PET%sT 1992 Jan 19 2:00s
+ 12:00 Russia PET%sT
+#
+# Chukotskij avtonomnyj okrug
+Zone Asia/Anadyr 11:49:56 - LMT 1924 May 2
+ 12:00 - ANAT 1930 Jun 21 # Anadyr Time
+ 13:00 Russia ANA%sT 1982 Apr 1 0:00s
+ 12:00 Russia ANA%sT 1991 Mar 31 2:00s
+ 11:00 Russia ANA%sT 1992 Jan 19 2:00s
+ 12:00 Russia ANA%sT
+
+# Serbia
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Belgrade 1:22:00 - LMT 1884
+ 1:00 - CET 1941 Apr 18 23:00
+ 1:00 C-Eur CE%sT 1945 May 8 2:00s
+ 1:00 1:00 CEST 1945 Sep 16 2:00s
+# Metod Kozelj reports that the legal date of
+# transition to EU rules was 1982-11-27, for all of Yugoslavia at the time.
+# Shanks & Pottenger don't give as much detail, so go with Kozelj.
+ 1:00 - CET 1982 Nov 27
+ 1:00 EU CE%sT
+Link Europe/Belgrade Europe/Ljubljana # Slovenia
+Link Europe/Belgrade Europe/Podgorica # Montenegro
+Link Europe/Belgrade Europe/Sarajevo # Bosnia and Herzegovina
+Link Europe/Belgrade Europe/Skopje # Macedonia
+Link Europe/Belgrade Europe/Zagreb # Croatia
+
+# Slovakia
+Link Europe/Prague Europe/Bratislava
+
+# Slovenia
+# see Serbia
+
+# Spain
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+# For 1917-1919 Whitman gives Apr Sat>=1 - Oct Sat>=1;
+# go with Shanks & Pottenger.
+Rule Spain 1917 only - May 5 23:00s 1:00 S
+Rule Spain 1917 1919 - Oct 6 23:00s 0 -
+Rule Spain 1918 only - Apr 15 23:00s 1:00 S
+Rule Spain 1919 only - Apr 5 23:00s 1:00 S
+# Whitman gives 1921 Feb 28 - Oct 14; go with Shanks & Pottenger.
+Rule Spain 1924 only - Apr 16 23:00s 1:00 S
+# Whitman gives 1924 Oct 14; go with Shanks & Pottenger.
+Rule Spain 1924 only - Oct 4 23:00s 0 -
+Rule Spain 1926 only - Apr 17 23:00s 1:00 S
+# Whitman says no DST in 1929; go with Shanks & Pottenger.
+Rule Spain 1926 1929 - Oct Sat>=1 23:00s 0 -
+Rule Spain 1927 only - Apr 9 23:00s 1:00 S
+Rule Spain 1928 only - Apr 14 23:00s 1:00 S
+Rule Spain 1929 only - Apr 20 23:00s 1:00 S
+# Whitman gives 1937 Jun 16, 1938 Apr 16, 1940 Apr 13;
+# go with Shanks & Pottenger.
+Rule Spain 1937 only - May 22 23:00s 1:00 S
+Rule Spain 1937 1939 - Oct Sat>=1 23:00s 0 -
+Rule Spain 1938 only - Mar 22 23:00s 1:00 S
+Rule Spain 1939 only - Apr 15 23:00s 1:00 S
+Rule Spain 1940 only - Mar 16 23:00s 1:00 S
+# Whitman says no DST 1942-1945; go with Shanks & Pottenger.
+Rule Spain 1942 only - May 2 22:00s 2:00 M # Midsummer
+Rule Spain 1942 only - Sep 1 22:00s 1:00 S
+Rule Spain 1943 1946 - Apr Sat>=13 22:00s 2:00 M
+Rule Spain 1943 only - Oct 3 22:00s 1:00 S
+Rule Spain 1944 only - Oct 10 22:00s 1:00 S
+Rule Spain 1945 only - Sep 30 1:00 1:00 S
+Rule Spain 1946 only - Sep 30 0:00 0 -
+Rule Spain 1949 only - Apr 30 23:00 1:00 S
+Rule Spain 1949 only - Sep 30 1:00 0 -
+Rule Spain 1974 1975 - Apr Sat>=13 23:00 1:00 S
+Rule Spain 1974 1975 - Oct Sun>=1 1:00 0 -
+Rule Spain 1976 only - Mar 27 23:00 1:00 S
+Rule Spain 1976 1977 - Sep lastSun 1:00 0 -
+Rule Spain 1977 1978 - Apr 2 23:00 1:00 S
+Rule Spain 1978 only - Oct 1 1:00 0 -
+# The following rules are copied from Morocco from 1967 through 1978.
+Rule SpainAfrica 1967 only - Jun 3 12:00 1:00 S
+Rule SpainAfrica 1967 only - Oct 1 0:00 0 -
+Rule SpainAfrica 1974 only - Jun 24 0:00 1:00 S
+Rule SpainAfrica 1974 only - Sep 1 0:00 0 -
+Rule SpainAfrica 1976 1977 - May 1 0:00 1:00 S
+Rule SpainAfrica 1976 only - Aug 1 0:00 0 -
+Rule SpainAfrica 1977 only - Sep 28 0:00 0 -
+Rule SpainAfrica 1978 only - Jun 1 0:00 1:00 S
+Rule SpainAfrica 1978 only - Aug 4 0:00 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Madrid -0:14:44 - LMT 1901 Jan 1 0:00s
+ 0:00 Spain WE%sT 1946 Sep 30
+ 1:00 Spain CE%sT 1979
+ 1:00 EU CE%sT
+Zone Africa/Ceuta -0:21:16 - LMT 1901
+ 0:00 - WET 1918 May 6 23:00
+ 0:00 1:00 WEST 1918 Oct 7 23:00
+ 0:00 - WET 1924
+ 0:00 Spain WE%sT 1929
+ 0:00 SpainAfrica WE%sT 1984 Mar 16
+ 1:00 - CET 1986
+ 1:00 EU CE%sT
+Zone Atlantic/Canary -1:01:36 - LMT 1922 Mar # Las Palmas de Gran C.
+ -1:00 - CANT 1946 Sep 30 1:00 # Canaries Time
+ 0:00 - WET 1980 Apr 6 0:00s
+ 0:00 1:00 WEST 1980 Sep 28 0:00s
+ 0:00 EU WE%sT
+# IATA SSIM (1996-09) says the Canaries switch at 2:00u, not 1:00u.
+# Ignore this for now, as the Canaries are part of the EU.
+
+# Sweden
+
+# From Ivan Nilsson (2001-04-13), superseding Shanks & Pottenger:
+#
+# The law "Svensk forfattningssamling 1878, no 14" about standard time in 1879:
+# From the beginning of 1879 (that is 01-01 00:00) the time for all
+# places in the country is "the mean solar time for the meridian at
+# three degrees, or twelve minutes of time, to the west of the
+# meridian of the Observatory of Stockholm". The law is dated 1878-05-31.
+#
+# The observatory at that time had the meridian 18 degrees 03' 30"
+# eastern longitude = 01:12:14 in time. Less 12 minutes gives the
+# national standard time as 01:00:14 ahead of GMT....
+#
+# About the beginning of CET in Sweden. The lawtext ("Svensk
+# forfattningssamling 1899, no 44") states, that "from the beginning
+# of 1900... ... the same as the mean solar time for the meridian at
+# the distance of one hour of time from the meridian of the English
+# observatory at Greenwich, or at 12 minutes 14 seconds to the west
+# from the meridian of the Observatory of Stockholm". The law is dated
+# 1899-06-16. In short: At 1900-01-01 00:00:00 the new standard time
+# in Sweden is 01:00:00 ahead of GMT.
+#
+# 1916: The lawtext ("Svensk forfattningssamling 1916, no 124") states
+# that "1916-05-15 is considered to begin one hour earlier". It is
+# pretty obvious that at 05-14 23:00 the clocks are set to 05-15 00:00....
+# Further the law says, that "1916-09-30 is considered to end one hour later".
+#
+# The laws regulating [DST] are available on the site of the Swedish
+# Parliament beginning with 1985 - the laws regulating 1980/1984 are
+# not available on the site (to my knowledge they are only available
+# in Swedish): <http://www.riksdagen.se/english/work/sfst.asp> (type
+# "sommartid" without the quotes in the field "Fritext" and then click
+# the Sok-button).
+#
+# (2001-05-13):
+#
+# I have now found a newspaper stating that at 1916-10-01 01:00
+# summertime the church-clocks etc were set back one hour to show
+# 1916-10-01 00:00 standard time. The article also reports that some
+# people thought the switch to standard time would take place already
+# at 1916-10-01 00:00 summer time, but they had to wait for another
+# hour before the event took place.
+#
+# Source: The newspaper "Dagens Nyheter", 1916-10-01, page 7 upper left.
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Stockholm 1:12:12 - LMT 1879 Jan 1
+ 1:00:14 - SET 1900 Jan 1 # Swedish Time
+ 1:00 - CET 1916 May 14 23:00
+ 1:00 1:00 CEST 1916 Oct 1 01:00
+ 1:00 - CET 1980
+ 1:00 EU CE%sT
+
+# Switzerland
+# From Howse:
+# By the end of the 18th century clocks and watches became commonplace
+# and their performance improved enormously. Communities began to keep
+# mean time in preference to apparent time -- Geneva from 1780 ....
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+# From Whitman (who writes ``Midnight?''):
+Rule Swiss 1940 only - Nov 2 0:00 1:00 S
+Rule Swiss 1940 only - Dec 31 0:00 0 -
+# From Shanks & Pottenger:
+Rule Swiss 1941 1942 - May Sun>=1 2:00 1:00 S
+Rule Swiss 1941 1942 - Oct Sun>=1 0:00 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Zurich 0:34:08 - LMT 1848 Sep 12
+ 0:29:44 - BMT 1894 Jun # Bern Mean Time
+ 1:00 Swiss CE%sT 1981
+ 1:00 EU CE%sT
+
+# Turkey
+
+# From Amar Devegowda (2007-01-03):
+# The time zone rules for Istanbul, Turkey have not been changed for years now.
+# ... The latest rules are available at -
+# http://www.timeanddate.com/worldclock/timezone.html?n=107
+# From Steffen Thorsen (2007-01-03):
+# I have been able to find press records back to 1996 which all say that
+# DST started 01:00 local time and end at 02:00 local time. I am not sure
+# what happened before that. One example for each year from 1996 to 2001:
+# http://newspot.byegm.gov.tr/arsiv/1996/21/N4.htm
+# http://www.byegm.gov.tr/YAYINLARIMIZ/CHR/ING97/03/97X03X25.TXT
+# http://www.byegm.gov.tr/YAYINLARIMIZ/CHR/ING98/03/98X03X02.HTM
+# http://www.byegm.gov.tr/YAYINLARIMIZ/CHR/ING99/10/99X10X26.HTM#%2016
+# http://www.byegm.gov.tr/YAYINLARIMIZ/CHR/ING2000/03/00X03X06.HTM#%2021
+# http://www.byegm.gov.tr/YAYINLARIMIZ/CHR/ING2001/03/23x03x01.HTM#%2027
+# From Paul Eggert (2007-01-03):
+# Prefer the above source to Shanks & Pottenger for time stamps after 1990.
+
+# From Steffen Thorsen (2007-03-09):
+# Starting 2007 though, it seems that they are adopting EU's 1:00 UTC
+# start/end time, according to the following page (2007-03-07):
+# http://www.ntvmsnbc.com/news/402029.asp
+# The official document is located here - it is in Turkish...:
+# http://rega.basbakanlik.gov.tr/eskiler/2007/03/20070307-7.htm
+# I was able to locate the following seemingly official document
+# (on a non-government server though) describing dates between 2002 and 2006:
+# http://www.alomaliye.com/bkk_2002_3769.htm
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Turkey 1916 only - May 1 0:00 1:00 S
+Rule Turkey 1916 only - Oct 1 0:00 0 -
+Rule Turkey 1920 only - Mar 28 0:00 1:00 S
+Rule Turkey 1920 only - Oct 25 0:00 0 -
+Rule Turkey 1921 only - Apr 3 0:00 1:00 S
+Rule Turkey 1921 only - Oct 3 0:00 0 -
+Rule Turkey 1922 only - Mar 26 0:00 1:00 S
+Rule Turkey 1922 only - Oct 8 0:00 0 -
+# Whitman gives 1923 Apr 28 - Sep 16 and no DST in 1924-1925;
+# go with Shanks & Pottenger.
+Rule Turkey 1924 only - May 13 0:00 1:00 S
+Rule Turkey 1924 1925 - Oct 1 0:00 0 -
+Rule Turkey 1925 only - May 1 0:00 1:00 S
+Rule Turkey 1940 only - Jun 30 0:00 1:00 S
+Rule Turkey 1940 only - Oct 5 0:00 0 -
+Rule Turkey 1940 only - Dec 1 0:00 1:00 S
+Rule Turkey 1941 only - Sep 21 0:00 0 -
+Rule Turkey 1942 only - Apr 1 0:00 1:00 S
+# Whitman omits the next two transition and gives 1945 Oct 1;
+# go with Shanks & Pottenger.
+Rule Turkey 1942 only - Nov 1 0:00 0 -
+Rule Turkey 1945 only - Apr 2 0:00 1:00 S
+Rule Turkey 1945 only - Oct 8 0:00 0 -
+Rule Turkey 1946 only - Jun 1 0:00 1:00 S
+Rule Turkey 1946 only - Oct 1 0:00 0 -
+Rule Turkey 1947 1948 - Apr Sun>=16 0:00 1:00 S
+Rule Turkey 1947 1950 - Oct Sun>=2 0:00 0 -
+Rule Turkey 1949 only - Apr 10 0:00 1:00 S
+Rule Turkey 1950 only - Apr 19 0:00 1:00 S
+Rule Turkey 1951 only - Apr 22 0:00 1:00 S
+Rule Turkey 1951 only - Oct 8 0:00 0 -
+Rule Turkey 1962 only - Jul 15 0:00 1:00 S
+Rule Turkey 1962 only - Oct 8 0:00 0 -
+Rule Turkey 1964 only - May 15 0:00 1:00 S
+Rule Turkey 1964 only - Oct 1 0:00 0 -
+Rule Turkey 1970 1972 - May Sun>=2 0:00 1:00 S
+Rule Turkey 1970 1972 - Oct Sun>=2 0:00 0 -
+Rule Turkey 1973 only - Jun 3 1:00 1:00 S
+Rule Turkey 1973 only - Nov 4 3:00 0 -
+Rule Turkey 1974 only - Mar 31 2:00 1:00 S
+Rule Turkey 1974 only - Nov 3 5:00 0 -
+Rule Turkey 1975 only - Mar 30 0:00 1:00 S
+Rule Turkey 1975 1976 - Oct lastSun 0:00 0 -
+Rule Turkey 1976 only - Jun 1 0:00 1:00 S
+Rule Turkey 1977 1978 - Apr Sun>=1 0:00 1:00 S
+Rule Turkey 1977 only - Oct 16 0:00 0 -
+Rule Turkey 1979 1980 - Apr Sun>=1 3:00 1:00 S
+Rule Turkey 1979 1982 - Oct Mon>=11 0:00 0 -
+Rule Turkey 1981 1982 - Mar lastSun 3:00 1:00 S
+Rule Turkey 1983 only - Jul 31 0:00 1:00 S
+Rule Turkey 1983 only - Oct 2 0:00 0 -
+Rule Turkey 1985 only - Apr 20 0:00 1:00 S
+Rule Turkey 1985 only - Sep 28 0:00 0 -
+Rule Turkey 1986 1990 - Mar lastSun 2:00s 1:00 S
+Rule Turkey 1986 1990 - Sep lastSun 2:00s 0 -
+Rule Turkey 1991 2006 - Mar lastSun 1:00s 1:00 S
+Rule Turkey 1991 1995 - Sep lastSun 1:00s 0 -
+Rule Turkey 1996 2006 - Oct lastSun 1:00s 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Istanbul 1:55:52 - LMT 1880
+ 1:56:56 - IMT 1910 Oct # Istanbul Mean Time?
+ 2:00 Turkey EE%sT 1978 Oct 15
+ 3:00 Turkey TR%sT 1985 Apr 20 # Turkey Time
+ 2:00 Turkey EE%sT 2007
+ 2:00 EU EE%sT
+Link Europe/Istanbul Asia/Istanbul # Istanbul is in both continents.
+
+# Ukraine
+#
+# From Igor Karpov, who works for the Ukranian Ministry of Justice,
+# via Garrett Wollman (2003-01-27):
+# BTW, I've found the official document on this matter. It's goverment
+# regulations number 509, May 13, 1996. In my poor translation it says:
+# "Time in Ukraine is set to second timezone (Kiev time). Each last Sunday
+# of March at 3am the time is changing to 4am and each last Sunday of
+# October the time at 4am is changing to 3am"
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+# Most of Ukraine since 1970 has been like Kiev.
+# "Kyiv" is the transliteration of the Ukrainian name, but
+# "Kiev" is more common in English.
+Zone Europe/Kiev 2:02:04 - LMT 1880
+ 2:02:04 - KMT 1924 May 2 # Kiev Mean Time
+ 2:00 - EET 1930 Jun 21
+ 3:00 - MSK 1941 Sep 20
+ 1:00 C-Eur CE%sT 1943 Nov 6
+ 3:00 Russia MSK/MSD 1990
+ 3:00 - MSK 1990 Jul 1 2:00
+ 2:00 - EET 1992
+ 2:00 E-Eur EE%sT 1995
+ 2:00 EU EE%sT
+# Ruthenia used CET 1990/1991.
+# "Uzhhorod" is the transliteration of the Ukrainian name, but
+# "Uzhgorod" is more common in English.
+Zone Europe/Uzhgorod 1:29:12 - LMT 1890 Oct
+ 1:00 - CET 1940
+ 1:00 C-Eur CE%sT 1944 Oct
+ 1:00 1:00 CEST 1944 Oct 26
+ 1:00 - CET 1945 Jun 29
+ 3:00 Russia MSK/MSD 1990
+ 3:00 - MSK 1990 Jul 1 2:00
+ 1:00 - CET 1991 Mar 31 3:00
+ 2:00 - EET 1992
+ 2:00 E-Eur EE%sT 1995
+ 2:00 EU EE%sT
+# Zaporozh'ye and eastern Lugansk oblasts observed DST 1990/1991.
+# "Zaporizhia" is the transliteration of the Ukrainian name, but
+# "Zaporozh'ye" is more common in English. Use the common English
+# spelling, except omit the apostrophe as it is not allowed in
+# portable Posix file names.
+Zone Europe/Zaporozhye 2:20:40 - LMT 1880
+ 2:20 - CUT 1924 May 2 # Central Ukraine T
+ 2:00 - EET 1930 Jun 21
+ 3:00 - MSK 1941 Aug 25
+ 1:00 C-Eur CE%sT 1943 Oct 25
+ 3:00 Russia MSK/MSD 1991 Mar 31 2:00
+ 2:00 E-Eur EE%sT 1995
+ 2:00 EU EE%sT
+# Central Crimea used Moscow time 1994/1997.
+Zone Europe/Simferopol 2:16:24 - LMT 1880
+ 2:16 - SMT 1924 May 2 # Simferopol Mean T
+ 2:00 - EET 1930 Jun 21
+ 3:00 - MSK 1941 Nov
+ 1:00 C-Eur CE%sT 1944 Apr 13
+ 3:00 Russia MSK/MSD 1990
+ 3:00 - MSK 1990 Jul 1 2:00
+ 2:00 - EET 1992
+# From Paul Eggert (2006-03-22):
+# The _Economist_ (1994-05-28, p 45) reports that central Crimea switched
+# from Kiev to Moscow time sometime after the January 1994 elections.
+# Shanks (1999) says ``date of change uncertain'', but implies that it happened
+# sometime between the 1994 DST switches. Shanks & Pottenger simply say
+# 1994-09-25 03:00, but that can't be right. For now, guess it
+# changed in May.
+ 2:00 E-Eur EE%sT 1994 May
+# From IATA SSIM (1994/1997), which also says that Kerch is still like Kiev.
+ 3:00 E-Eur MSK/MSD 1996 Mar 31 3:00s
+ 3:00 1:00 MSD 1996 Oct 27 3:00s
+# IATA SSIM (1997-09) says Crimea switched to EET/EEST.
+# Assume it happened in March by not changing the clocks.
+ 3:00 Russia MSK/MSD 1997
+ 3:00 - MSK 1997 Mar lastSun 1:00u
+ 2:00 EU EE%sT
+
+###############################################################################
+
+# One source shows that Bulgaria, Cyprus, Finland, and Greece observe DST from
+# the last Sunday in March to the last Sunday in September in 1986.
+# The source shows Romania changing a day later than everybody else.
+#
+# According to Bernard Sieloff's source, Poland is in the MET time zone but
+# uses the WE DST rules. The Western USSR uses EET+1 and ME DST rules.
+# Bernard Sieloff's source claims Romania switches on the same day, but at
+# 00:00 standard time (i.e., 01:00 DST). It also claims that Turkey
+# switches on the same day, but switches on at 01:00 standard time
+# and off at 00:00 standard time (i.e., 01:00 DST)
+
+# ...
+# Date: Wed, 28 Jan 87 16:56:27 -0100
+# From: Tom Hofmann
+# ...
+#
+# ...the European time rules are...standardized since 1981, when
+# most European coun[tr]ies started DST. Before that year, only
+# a few countries (UK, France, Italy) had DST, each according
+# to own national rules. In 1981, however, DST started on
+# 'Apr firstSun', and not on 'Mar lastSun' as in the following
+# years...
+# But also since 1981 there are some more national exceptions
+# than listed in 'europe': Switzerland, for example, joined DST
+# one year later, Denmark ended DST on 'Oct 1' instead of 'Sep
+# lastSun' in 1981---I don't know how they handle now.
+#
+# Finally, DST ist always from 'Apr 1' to 'Oct 1' in the
+# Soviet Union (as far as I know).
+#
+# Tom Hofmann, Scientific Computer Center, CIBA-GEIGY AG,
+# 4002 Basle, Switzerland
+# ...
+
+# ...
+# Date: Wed, 4 Feb 87 22:35:22 +0100
+# From: Dik T. Winter
+# ...
+#
+# The information from Tom Hofmann is (as far as I know) not entirely correct.
+# After a request from chongo at amdahl I tried to retrieve all information
+# about DST in Europe. I was able to find all from about 1969.
+#
+# ...standardization on DST in Europe started in about 1977 with switches on
+# first Sunday in April and last Sunday in September...
+# In 1981 UK joined Europe insofar that
+# the starting day for both shifted to last Sunday in March. And from 1982
+# the whole of Europe used DST, with switch dates April 1 and October 1 in
+# the Sov[i]et Union. In 1985 the SU reverted to standard Europe[a]n switch
+# dates...
+#
+# It should also be remembered that time-zones are not constants; e.g.
+# Portugal switched in 1976 from MET (or CET) to WET with DST...
+# Note also that though there were rules for switch dates not
+# all countries abided to these dates, and many individual deviations
+# occurred, though not since 1982 I believe. Another note: it is always
+# assumed that DST is 1 hour ahead of normal time, this need not be the
+# case; at least in the Netherlands there have been times when DST was 2 hours
+# in advance of normal time.
+#
+# ...
+# dik t. winter, cwi, amsterdam, nederland
+# ...
+
+# From Bob Devine (1988-01-28):
+# ...
+# Greece: Last Sunday in April to last Sunday in September (iffy on dates).
+# Since 1978. Change at midnight.
+# ...
+# Monaco: has same DST as France.
+# ...
diff --git a/libkcal/libical/tzdata/factory b/libkcal/libical/tzdata/factory
new file mode 100644
index 00000000..946063c0
--- /dev/null
+++ b/libkcal/libical/tzdata/factory
@@ -0,0 +1,8 @@
+# @(#)factory 8.1
+
+# For companies who don't want to put time zone specification in
+# their installation procedures. When users run date, they'll get the message.
+# Also useful for the "comp.sources" version.
+
+# Zone NAME GMTOFF RULES FORMAT
+Zone Factory 0 - "Local time zone must be set--see zic manual page"
diff --git a/libkcal/libical/tzdata/iso3166.tab b/libkcal/libical/tzdata/iso3166.tab
new file mode 100644
index 00000000..8d623995
--- /dev/null
+++ b/libkcal/libical/tzdata/iso3166.tab
@@ -0,0 +1,269 @@
+# ISO 3166 alpha-2 country codes
+#
+# @(#)iso3166.tab 8.5
+#
+# From Paul Eggert (2006-09-27):
+#
+# This file contains a table with the following columns:
+# 1. ISO 3166-1 alpha-2 country code, current as of
+# ISO 3166-1 Newsletter VI-1 (2007-09-21). See:
+# <a href="http://www.iso.org/iso/en/prods-services/iso3166ma/index.html">
+# ISO 3166 Maintenance agency (ISO 3166/MA)
+# </a>.
+# 2. The usual English name for the country,
+# chosen so that alphabetic sorting of subsets produces helpful lists.
+# This is not the same as the English name in the ISO 3166 tables.
+#
+# Columns are separated by a single tab.
+# The table is sorted by country code.
+#
+# Lines beginning with `#' are comments.
+#
+#country-
+#code country name
+AD Andorra
+AE United Arab Emirates
+AF Afghanistan
+AG Antigua & Barbuda
+AI Anguilla
+AL Albania
+AM Armenia
+AN Netherlands Antilles
+AO Angola
+AQ Antarctica
+AR Argentina
+AS Samoa (American)
+AT Austria
+AU Australia
+AW Aruba
+AX Aaland Islands
+AZ Azerbaijan
+BA Bosnia & Herzegovina
+BB Barbados
+BD Bangladesh
+BE Belgium
+BF Burkina Faso
+BG Bulgaria
+BH Bahrain
+BI Burundi
+BJ Benin
+BL St Barthelemy
+BM Bermuda
+BN Brunei
+BO Bolivia
+BR Brazil
+BS Bahamas
+BT Bhutan
+BV Bouvet Island
+BW Botswana
+BY Belarus
+BZ Belize
+CA Canada
+CC Cocos (Keeling) Islands
+CD Congo (Dem. Rep.)
+CF Central African Rep.
+CG Congo (Rep.)
+CH Switzerland
+CI Cote d'Ivoire
+CK Cook Islands
+CL Chile
+CM Cameroon
+CN China
+CO Colombia
+CR Costa Rica
+CU Cuba
+CV Cape Verde
+CX Christmas Island
+CY Cyprus
+CZ Czech Republic
+DE Germany
+DJ Djibouti
+DK Denmark
+DM Dominica
+DO Dominican Republic
+DZ Algeria
+EC Ecuador
+EE Estonia
+EG Egypt
+EH Western Sahara
+ER Eritrea
+ES Spain
+ET Ethiopia
+FI Finland
+FJ Fiji
+FK Falkland Islands
+FM Micronesia
+FO Faroe Islands
+FR France
+GA Gabon
+GB Britain (UK)
+GD Grenada
+GE Georgia
+GF French Guiana
+GG Guernsey
+GH Ghana
+GI Gibraltar
+GL Greenland
+GM Gambia
+GN Guinea
+GP Guadeloupe
+GQ Equatorial Guinea
+GR Greece
+GS South Georgia & the South Sandwich Islands
+GT Guatemala
+GU Guam
+GW Guinea-Bissau
+GY Guyana
+HK Hong Kong
+HM Heard Island & McDonald Islands
+HN Honduras
+HR Croatia
+HT Haiti
+HU Hungary
+ID Indonesia
+IE Ireland
+IL Israel
+IM Isle of Man
+IN India
+IO British Indian Ocean Territory
+IQ Iraq
+IR Iran
+IS Iceland
+IT Italy
+JE Jersey
+JM Jamaica
+JO Jordan
+JP Japan
+KE Kenya
+KG Kyrgyzstan
+KH Cambodia
+KI Kiribati
+KM Comoros
+KN St Kitts & Nevis
+KP Korea (North)
+KR Korea (South)
+KW Kuwait
+KY Cayman Islands
+KZ Kazakhstan
+LA Laos
+LB Lebanon
+LC St Lucia
+LI Liechtenstein
+LK Sri Lanka
+LR Liberia
+LS Lesotho
+LT Lithuania
+LU Luxembourg
+LV Latvia
+LY Libya
+MA Morocco
+MC Monaco
+MD Moldova
+ME Montenegro
+MF St Martin (French part)
+MG Madagascar
+MH Marshall Islands
+MK Macedonia
+ML Mali
+MM Myanmar (Burma)
+MN Mongolia
+MO Macau
+MP Northern Mariana Islands
+MQ Martinique
+MR Mauritania
+MS Montserrat
+MT Malta
+MU Mauritius
+MV Maldives
+MW Malawi
+MX Mexico
+MY Malaysia
+MZ Mozambique
+NA Namibia
+NC New Caledonia
+NE Niger
+NF Norfolk Island
+NG Nigeria
+NI Nicaragua
+NL Netherlands
+NO Norway
+NP Nepal
+NR Nauru
+NU Niue
+NZ New Zealand
+OM Oman
+PA Panama
+PE Peru
+PF French Polynesia
+PG Papua New Guinea
+PH Philippines
+PK Pakistan
+PL Poland
+PM St Pierre & Miquelon
+PN Pitcairn
+PR Puerto Rico
+PS Palestine
+PT Portugal
+PW Palau
+PY Paraguay
+QA Qatar
+RE Reunion
+RO Romania
+RS Serbia
+RU Russia
+RW Rwanda
+SA Saudi Arabia
+SB Solomon Islands
+SC Seychelles
+SD Sudan
+SE Sweden
+SG Singapore
+SH St Helena
+SI Slovenia
+SJ Svalbard & Jan Mayen
+SK Slovakia
+SL Sierra Leone
+SM San Marino
+SN Senegal
+SO Somalia
+SR Suriname
+ST Sao Tome & Principe
+SV El Salvador
+SY Syria
+SZ Swaziland
+TC Turks & Caicos Is
+TD Chad
+TF French Southern & Antarctic Lands
+TG Togo
+TH Thailand
+TJ Tajikistan
+TK Tokelau
+TL East Timor
+TM Turkmenistan
+TN Tunisia
+TO Tonga
+TR Turkey
+TT Trinidad & Tobago
+TV Tuvalu
+TW Taiwan
+TZ Tanzania
+UA Ukraine
+UG Uganda
+UM US minor outlying islands
+US United States
+UY Uruguay
+UZ Uzbekistan
+VA Vatican City
+VC St Vincent
+VE Venezuela
+VG Virgin Islands (UK)
+VI Virgin Islands (US)
+VN Vietnam
+VU Vanuatu
+WF Wallis & Futuna
+WS Samoa (western)
+YE Yemen
+YT Mayotte
+ZA South Africa
+ZM Zambia
+ZW Zimbabwe
diff --git a/libkcal/libical/tzdata/leapseconds b/libkcal/libical/tzdata/leapseconds
new file mode 100644
index 00000000..35df858d
--- /dev/null
+++ b/libkcal/libical/tzdata/leapseconds
@@ -0,0 +1,83 @@
+# @(#)leapseconds 8.5
+
+# Allowance for leapseconds added to each timezone file.
+
+# The International Earth Rotation Service periodically uses leap seconds
+# to keep UTC to within 0.9 s of UT1
+# (which measures the true angular orientation of the earth in space); see
+# Terry J Quinn, The BIPM and the accurate measure of time,
+# Proc IEEE 79, 7 (July 1991), 894-905.
+# There were no leap seconds before 1972, because the official mechanism
+# accounting for the discrepancy between atomic time and the earth's rotation
+# did not exist until the early 1970s.
+
+# The correction (+ or -) is made at the given time, so lines
+# will typically look like:
+# Leap YEAR MON DAY 23:59:60 + R/S
+# or
+# Leap YEAR MON DAY 23:59:59 - R/S
+
+# If the leapsecond is Rolling (R) the given time is local time
+# If the leapsecond is Stationary (S) the given time is UTC
+
+# Leap YEAR MONTH DAY HH:MM:SS CORR R/S
+Leap 1972 Jun 30 23:59:60 + S
+Leap 1972 Dec 31 23:59:60 + S
+Leap 1973 Dec 31 23:59:60 + S
+Leap 1974 Dec 31 23:59:60 + S
+Leap 1975 Dec 31 23:59:60 + S
+Leap 1976 Dec 31 23:59:60 + S
+Leap 1977 Dec 31 23:59:60 + S
+Leap 1978 Dec 31 23:59:60 + S
+Leap 1979 Dec 31 23:59:60 + S
+Leap 1981 Jun 30 23:59:60 + S
+Leap 1982 Jun 30 23:59:60 + S
+Leap 1983 Jun 30 23:59:60 + S
+Leap 1985 Jun 30 23:59:60 + S
+Leap 1987 Dec 31 23:59:60 + S
+Leap 1989 Dec 31 23:59:60 + S
+Leap 1990 Dec 31 23:59:60 + S
+Leap 1992 Jun 30 23:59:60 + S
+Leap 1993 Jun 30 23:59:60 + S
+Leap 1994 Jun 30 23:59:60 + S
+Leap 1995 Dec 31 23:59:60 + S
+Leap 1997 Jun 30 23:59:60 + S
+Leap 1998 Dec 31 23:59:60 + S
+Leap 2005 Dec 31 23:59:60 + S
+
+# INTERNATIONAL EARTH ROTATION AND REFERENCE SYSTEMS SERVICE (IERS)
+#
+# SERVICE INTERNATIONAL DE LA ROTATION TERRESTRE ET DES SYSTEMES DE REFERENCE
+#
+# SERVICE DE LA ROTATION TERRESTRE
+# OBSERVATOIRE DE PARIS
+# 61, Av. de l'Observatoire 75014 PARIS (France)
+# Tel. : 33 (0) 1 40 51 22 26
+# FAX : 33 (0) 1 40 51 22 91
+# Internet : services.iers@obspm.fr
+#
+# Paris, 18 January 2008
+#
+# Bulletin C 35
+#
+# To authorities responsible
+# for the measurement and
+# distribution of time
+#
+# INFORMATION ON UTC - TAI
+#
+# NO positive leap second will be introduced at the end of June 2008.
+# The difference between Coordinated Universal Time UTC and the
+# International Atomic Time TAI is :
+#
+# from 2006 January 1, 0h UTC, until further notice : UTC-TAI = -33 s
+#
+# Leap seconds can be introduced in UTC at the end of the months of December
+# or June, depending on the evolution of UT1-TAI. Bulletin C is mailed every
+# six months, either to announce a time step in UTC, or to confirm that there
+# will be no time step at the next possible date.
+#
+# Daniel GAMBIS
+# Head
+# Earth Orientation Center of the IERS
+# Observatoire de Paris, France
diff --git a/libkcal/libical/tzdata/northamerica b/libkcal/libical/tzdata/northamerica
new file mode 100644
index 00000000..60e5d51e
--- /dev/null
+++ b/libkcal/libical/tzdata/northamerica
@@ -0,0 +1,2651 @@
+# @(#)northamerica 8.23
+# <pre>
+
+# also includes Central America and the Caribbean
+
+# This data is by no means authoritative; if you think you know better,
+# go ahead and edit the file (and please send any changes to
+# tz@elsie.nci.nih.gov for general use in the future).
+
+# From Paul Eggert (1999-03-22):
+# A reliable and entertaining source about time zones is
+# Derek Howse, Greenwich time and longitude, Philip Wilson Publishers (1997).
+
+###############################################################################
+
+# United States
+
+# From Paul Eggert (1999-03-31):
+# Howse writes (pp 121-125) that time zones were invented by
+# Professor Charles Ferdinand Dowd (1825-1904),
+# Principal of Temple Grove Ladies' Seminary (Saratoga Springs, NY).
+# His pamphlet ``A System of National Time for Railroads'' (1870)
+# was the result of his proposals at the Convention of Railroad Trunk Lines
+# in New York City (1869-10). His 1870 proposal was based on Washington, DC,
+# but in 1872-05 he moved the proposed origin to Greenwich.
+# His proposal was adopted by the railroads on 1883-11-18 at 12:00,
+# and the most of the country soon followed suit.
+
+# From Paul Eggert (2005-04-16):
+# That 1883 transition occurred at 12:00 new time, not at 12:00 old time.
+# See p 46 of David Prerau, Seize the daylight, Thunder's Mouth Press (2005).
+
+# From Paul Eggert (2006-03-22):
+# A good source for time zone historical data in the US is
+# Thomas G. Shanks, The American Atlas (5th edition),
+# San Diego: ACS Publications, Inc. (1991).
+# Make sure you have the errata sheet; the book is somewhat useless without it.
+# It is the source for most of the pre-1991 US entries below.
+
+# From Paul Eggert (2001-03-06):
+# Daylight Saving Time was first suggested as a joke by Benjamin Franklin
+# in his whimsical essay ``An Economical Project for Diminishing the Cost
+# of Light'' published in the Journal de Paris (1784-04-26).
+# Not everyone is happy with the results:
+#
+# I don't really care how time is reckoned so long as there is some
+# agreement about it, but I object to being told that I am saving
+# daylight when my reason tells me that I am doing nothing of the kind.
+# I even object to the implication that I am wasting something
+# valuable if I stay in bed after the sun has risen. As an admirer
+# of moonlight I resent the bossy insistence of those who want to
+# reduce my time for enjoying it. At the back of the Daylight Saving
+# scheme I detect the bony, blue-fingered hand of Puritanism, eager
+# to push people into bed earlier, and get them up earlier, to make
+# them healthy, wealthy and wise in spite of themselves.
+#
+# -- Robertson Davies, The diary of Samuel Marchbanks,
+# Clarke, Irwin (1947), XIX, Sunday
+#
+# For more about the first ten years of DST in the United States, see
+# Robert Garland's <a href="http://www.clpgh.org/exhibit/dst.html">
+# Ten years of daylight saving from the Pittsburgh standpoint
+# (Carnegie Library of Pittsburgh, 1927)</a>.
+#
+# Shanks says that DST was called "War Time" in the US in 1918 and 1919.
+# However, DST was imposed by the Standard Time Act of 1918, which
+# was the first nationwide legal time standard, and apparently
+# time was just called "Standard Time" or "Daylight Saving Time".
+
+# From Arthur David Olson:
+# US Daylight Saving Time ended on the last Sunday of *October* in 1974.
+# See, for example, the front page of the Saturday, 1974-10-26
+# and Sunday, 1974-10-27 editions of the Washington Post.
+
+# From Arthur David Olson:
+# Before the Uniform Time Act of 1966 took effect in 1967, observance of
+# Daylight Saving Time in the US was by local option, except during wartime.
+
+# From Arthur David Olson (2000-09-25):
+# Last night I heard part of a rebroadcast of a 1945 Arch Oboler radio drama.
+# In the introduction, Oboler spoke of "Eastern Peace Time."
+# An AltaVista search turned up
+# <a href="http://rowayton.org/rhs/hstaug45.html">:
+# "When the time is announced over the radio now, it is 'Eastern Peace
+# Time' instead of the old familiar 'Eastern War Time.' Peace is wonderful."
+# </a> (August 1945) by way of confirmation.
+
+# From Joseph Gallant citing
+# George H. Douglas, _The Early Days of Radio Broadcasting_ (1987):
+# At 7 P.M. (Eastern War Time) [on 1945-08-14], the networks were set
+# to switch to London for Attlee's address, but the American people
+# never got to hear his speech live. According to one press account,
+# CBS' Bob Trout was first to announce the word of Japan's surrender,
+# but a few seconds later, NBC, ABC and Mutual also flashed the word
+# of surrender, all of whom interrupting the bells of Big Ben in
+# London which were to precede Mr. Attlee's speech.
+
+# From Paul Eggert (2003-02-09): It was Robert St John, not Bob Trout. From
+# Myrna Oliver's obituary of St John on page B16 of today's Los Angeles Times:
+#
+# ... a war-weary U.S. clung to radios, awaiting word of Japan's surrender.
+# Any announcement from Asia would reach St. John's New York newsroom on a
+# wire service teletype machine, which had prescribed signals for major news.
+# Associated Press, for example, would ring five bells before spewing out
+# typed copy of an important story, and 10 bells for news "of transcendental
+# importance."
+#
+# On Aug. 14, stalling while talking steadily into the NBC networks' open
+# microphone, St. John heard five bells and waited only to hear a sixth bell,
+# before announcing confidently: "Ladies and gentlemen, World War II is over.
+# The Japanese have agreed to our surrender terms."
+#
+# He had scored a 20-second scoop on other broadcasters.
+
+# From Arthur David Olson (2005-08-22):
+# Paul has been careful to use the "US" rules only in those locations
+# that are part of the United States; this reflects the real scope of
+# U.S. government action. So even though the "US" rules have changed
+# in the latest release, other countries won't be affected.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule US 1918 1919 - Mar lastSun 2:00 1:00 D
+Rule US 1918 1919 - Oct lastSun 2:00 0 S
+Rule US 1942 only - Feb 9 2:00 1:00 W # War
+Rule US 1945 only - Aug 14 23:00u 1:00 P # Peace
+Rule US 1945 only - Sep 30 2:00 0 S
+Rule US 1967 2006 - Oct lastSun 2:00 0 S
+Rule US 1967 1973 - Apr lastSun 2:00 1:00 D
+Rule US 1974 only - Jan 6 2:00 1:00 D
+Rule US 1975 only - Feb 23 2:00 1:00 D
+Rule US 1976 1986 - Apr lastSun 2:00 1:00 D
+Rule US 1987 2006 - Apr Sun>=1 2:00 1:00 D
+Rule US 2007 max - Mar Sun>=8 2:00 1:00 D
+Rule US 2007 max - Nov Sun>=1 2:00 0 S
+
+# From Arthur David Olson, 2005-12-19
+# We generate the files specified below to guard against old files with
+# obsolete information being left in the time zone binary directory.
+# We limit the list to names that have appeared in previous versions of
+# this time zone package.
+# We do these as separate Zones rather than as Links to avoid problems if
+# a particular place changes whether it observes DST.
+# We put these specifications here in the northamerica file both to
+# increase the chances that they'll actually get compiled and to
+# avoid the need to duplicate the US rules in another file.
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone EST -5:00 - EST
+Zone MST -7:00 - MST
+Zone HST -10:00 - HST
+Zone EST5EDT -5:00 US E%sT
+Zone CST6CDT -6:00 US C%sT
+Zone MST7MDT -7:00 US M%sT
+Zone PST8PDT -8:00 US P%sT
+
+# From Bob Devine (1988-01-28):
+# ...Alaska (and Hawaii) had the timezone names changed in 1967.
+# old new
+# Pacific Standard Time(PST) -same-
+# Yukon Standard Time(YST) -same-
+# Central Alaska S.T. (CAT) Alaska-Hawaii St[an]dard Time (AHST)
+# Nome Standard Time (NT) Bering Standard Time (BST)
+#
+# ...Alaska's timezone lines were redrawn in 1983 to give only 2 tz.
+# The YST zone now covers nearly all of the state, AHST just part
+# of the Aleutian islands. No DST.
+
+# From Paul Eggert (1995-12-19):
+# The tables below use `NST', not `NT', for Nome Standard Time.
+# I invented `CAWT' for Central Alaska War Time.
+
+# From U. S. Naval Observatory (1989-01-19):
+# USA EASTERN 5 H BEHIND UTC NEW YORK, WASHINGTON
+# USA EASTERN 4 H BEHIND UTC APR 3 - OCT 30
+# USA CENTRAL 6 H BEHIND UTC CHICAGO, HOUSTON
+# USA CENTRAL 5 H BEHIND UTC APR 3 - OCT 30
+# USA MOUNTAIN 7 H BEHIND UTC DENVER
+# USA MOUNTAIN 6 H BEHIND UTC APR 3 - OCT 30
+# USA PACIFIC 8 H BEHIND UTC L.A., SAN FRANCISCO
+# USA PACIFIC 7 H BEHIND UTC APR 3 - OCT 30
+# USA ALASKA STD 9 H BEHIND UTC MOST OF ALASKA (AKST)
+# USA ALASKA STD 8 H BEHIND UTC APR 3 - OCT 30 (AKDT)
+# USA ALEUTIAN 10 H BEHIND UTC ISLANDS WEST OF 170W
+# USA - " - 9 H BEHIND UTC APR 3 - OCT 30
+# USA HAWAII 10 H BEHIND UTC
+# USA BERING 11 H BEHIND UTC SAMOA, MIDWAY
+
+# From Arthur David Olson (1989-01-21):
+# The above dates are for 1988.
+# Note the "AKST" and "AKDT" abbreviations, the claim that there's
+# no DST in Samoa, and the claim that there is DST in Alaska and the
+# Aleutians.
+
+# From Arthur David Olson (1988-02-13):
+# Legal standard time zone names, from United States Code (1982 Edition and
+# Supplement III), Title 15, Chapter 6, Section 260 and forward. First, names
+# up to 1967-04-01 (when most provisions of the Uniform Time Act of 1966
+# took effect), as explained in sections 263 and 261:
+# (none)
+# United States standard eastern time
+# United States standard mountain time
+# United States standard central time
+# United States standard Pacific time
+# (none)
+# United States standard Alaska time
+# (none)
+# Next, names from 1967-04-01 until 1983-11-30 (the date for
+# public law 98-181):
+# Atlantic standard time
+# eastern standard time
+# central standard time
+# mountain standard time
+# Pacific standard time
+# Yukon standard time
+# Alaska-Hawaii standard time
+# Bering standard time
+# And after 1983-11-30:
+# Atlantic standard time
+# eastern standard time
+# central standard time
+# mountain standard time
+# Pacific standard time
+# Alaska standard time
+# Hawaii-Aleutian standard time
+# Samoa standard time
+# The law doesn't give abbreviations.
+#
+# From Paul Eggert (2000-01-08), following a heads-up from Rives McDow:
+# Public law 106-564 (2000-12-23) introduced the abbreviation
+# "Chamorro Standard Time" for time in Guam and the Northern Marianas.
+# See the file "australasia".
+
+# From Arthur David Olson, 2005-08-09
+# The following was signed into law on 2005-08-08.
+#
+# H.R. 6, Energy Policy Act of 2005, SEC. 110. DAYLIGHT SAVINGS.
+# (a) Amendment- Section 3(a) of the Uniform Time Act of 1966 (15
+# U.S.C. 260a(a)) is amended--
+# (1) by striking `first Sunday of April' and inserting `second
+# Sunday of March'; and
+# (2) by striking `last Sunday of October' and inserting `first
+# Sunday of November'.
+# (b) Effective Date- Subsection (a) shall take effect 1 year after the
+# date of enactment of this Act or March 1, 2007, whichever is later.
+# (c) Report to Congress- Not later than 9 months after the effective
+# date stated in subsection (b), the Secretary shall report to Congress
+# on the impact of this section on energy consumption in the United
+# States.
+# (d) Right to Revert- Congress retains the right to revert the
+# Daylight Saving Time back to the 2005 time schedules once the
+# Department study is complete.
+
+# US eastern time, represented by New York
+
+# Connecticut, Delaware, District of Columbia, most of Florida,
+# Georgia, southeast Indiana (Dearborn and Ohio counties), eastern Kentucky
+# (except America/Kentucky/Louisville below), Maine, Maryland, Massachusetts,
+# New Hampshire, New Jersey, New York, North Carolina, Ohio,
+# Pennsylvania, Rhode Island, South Carolina, eastern Tennessee,
+# Vermont, Virginia, West Virginia
+
+# From Dave Cantor (2004-11-02):
+# Early this summer I had the occasion to visit the Mount Washington
+# Observatory weather station atop (of course!) Mount Washington [, NH]....
+# One of the staff members said that the station was on Eastern Standard Time
+# and didn't change their clocks for Daylight Saving ... so that their
+# reports will always have times which are 5 hours behind UTC.
+
+# From Paul Eggert (2005-08-26):
+# According to today's Huntsville Times
+# <http://www.al.com/news/huntsvilletimes/index.ssf?/base/news/1125047783228320.xml&coll=1>
+# a few towns on Alabama's "eastern border with Georgia, such as Phenix City
+# in Russell County, Lanett in Chambers County and some towns in Lee County,
+# set their watches and clocks on Eastern time." It quotes H.H. "Bubba"
+# Roberts, city administrator in Phenix City. as saying "We are in the Central
+# time zone, but we do go by the Eastern time zone because so many people work
+# in Columbus."
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER
+Rule NYC 1920 only - Mar lastSun 2:00 1:00 D
+Rule NYC 1920 only - Oct lastSun 2:00 0 S
+Rule NYC 1921 1966 - Apr lastSun 2:00 1:00 D
+Rule NYC 1921 1954 - Sep lastSun 2:00 0 S
+Rule NYC 1955 1966 - Oct lastSun 2:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/New_York -4:56:02 - LMT 1883 Nov 18 12:03:58
+ -5:00 US E%sT 1920
+ -5:00 NYC E%sT 1942
+ -5:00 US E%sT 1946
+ -5:00 NYC E%sT 1967
+ -5:00 US E%sT
+
+# US central time, represented by Chicago
+
+# Alabama, Arkansas, Florida panhandle (Bay, Calhoun, Escambia,
+# Gulf, Holmes, Jackson, Okaloosa, Santa Rosa, Walton, and
+# Washington counties), Illinois, western Indiana
+# (Gibson, Jasper, Lake, LaPorte, Newton, Porter, Posey, Spencer,
+# Vanderburgh, and Warrick counties), Iowa, most of Kansas, western
+# Kentucky, Louisiana, Minnesota, Mississippi, Missouri, eastern
+# Nebraska, eastern North Dakota, Oklahoma, eastern South Dakota,
+# western Tennessee, most of Texas, Wisconsin
+
+# From Larry M. Smith (2006-04-26) re Wisconsin:
+# http://www.legis.state.wi.us/statutes/Stat0175.pdf ...
+# is currently enforced at the 01:00 time of change. Because the local
+# "bar time" in the state corresponds to 02:00, a number of citations
+# are issued for the "sale of class 'B' alcohol after prohibited
+# hours" within the deviated hour of this change every year....
+#
+# From Douglas R. Bomberg (2007-03-12):
+# Wisconsin has enacted (nearly eleventh-hour) legislation to get WI
+# Statue 175 closer in synch with the US Congress' intent....
+# http://www.legis.state.wi.us/2007/data/acts/07Act3.pdf
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER
+Rule Chicago 1920 only - Jun 13 2:00 1:00 D
+Rule Chicago 1920 1921 - Oct lastSun 2:00 0 S
+Rule Chicago 1921 only - Mar lastSun 2:00 1:00 D
+Rule Chicago 1922 1966 - Apr lastSun 2:00 1:00 D
+Rule Chicago 1922 1954 - Sep lastSun 2:00 0 S
+Rule Chicago 1955 1966 - Oct lastSun 2:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Chicago -5:50:36 - LMT 1883 Nov 18 12:09:24
+ -6:00 US C%sT 1920
+ -6:00 Chicago C%sT 1936 Mar 1 2:00
+ -5:00 - EST 1936 Nov 15 2:00
+ -6:00 Chicago C%sT 1942
+ -6:00 US C%sT 1946
+ -6:00 Chicago C%sT 1967
+ -6:00 US C%sT
+# Oliver County, ND switched from mountain to central time on 1992-10-25.
+Zone America/North_Dakota/Center -6:45:12 - LMT 1883 Nov 18 12:14:48
+ -7:00 US M%sT 1992 Oct 25 02:00
+ -6:00 US C%sT
+# Morton County, ND, switched from mountain to central time on
+# 2003-10-26, except for the area around Mandan which was already central time.
+# See <http://dmses.dot.gov/docimages/p63/135818.pdf>.
+# Officially this switch also included part of Sioux County, and
+# Jones, Mellette, and Todd Counties in South Dakota;
+# but in practice these other counties were already observing central time.
+# See <http://www.epa.gov/fedrgstr/EPA-IMPACT/2003/October/Day-28/i27056.htm>.
+Zone America/North_Dakota/New_Salem -6:45:39 - LMT 1883 Nov 18 12:14:21
+ -7:00 US M%sT 2003 Oct 26 02:00
+ -6:00 US C%sT
+
+# US mountain time, represented by Denver
+#
+# Colorado, far western Kansas, Montana, western
+# Nebraska, Nevada border (Jackpot, Owyhee, and Mountain City),
+# New Mexico, southwestern North Dakota,
+# western South Dakota, far western Texas (El Paso County, Hudspeth County,
+# and Pine Springs and Nickel Creek in Culberson County), Utah, Wyoming
+#
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER
+Rule Denver 1920 1921 - Mar lastSun 2:00 1:00 D
+Rule Denver 1920 only - Oct lastSun 2:00 0 S
+Rule Denver 1921 only - May 22 2:00 0 S
+Rule Denver 1965 1966 - Apr lastSun 2:00 1:00 D
+Rule Denver 1965 1966 - Oct lastSun 2:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Denver -6:59:56 - LMT 1883 Nov 18 12:00:04
+ -7:00 US M%sT 1920
+ -7:00 Denver M%sT 1942
+ -7:00 US M%sT 1946
+ -7:00 Denver M%sT 1967
+ -7:00 US M%sT
+
+# US Pacific time, represented by Los Angeles
+#
+# California, northern Idaho (Benewah, Bonner, Boundary, Clearwater,
+# Idaho, Kootenai, Latah, Lewis, Nez Perce, and Shoshone counties,
+# and the northern three-quarters of Idaho county),
+# most of Nevada, most of Oregon, and Washington
+#
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER
+Rule CA 1948 only - Mar 14 2:00 1:00 D
+Rule CA 1949 only - Jan 1 2:00 0 S
+Rule CA 1950 1966 - Apr lastSun 2:00 1:00 D
+Rule CA 1950 1961 - Sep lastSun 2:00 0 S
+Rule CA 1962 1966 - Oct lastSun 2:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Los_Angeles -7:52:58 - LMT 1883 Nov 18 12:07:02
+ -8:00 US P%sT 1946
+ -8:00 CA P%sT 1967
+ -8:00 US P%sT
+
+# Alaska
+# AK%sT is the modern abbreviation for -9:00 per USNO.
+#
+# From Paul Eggert (2001-05-30):
+# Howse writes that Alaska switched from the Julian to the Gregorian calendar,
+# and from east-of-GMT to west-of-GMT days, when the US bought it from Russia.
+# This was on 1867-10-18, a Friday; the previous day was 1867-10-06 Julian,
+# also a Friday. Include only the time zone part of this transition,
+# ignoring the switch from Julian to Gregorian, since we can't represent
+# the Julian calendar.
+#
+# As far as we know, none of the exact locations mentioned below were
+# permanently inhabited in 1867 by anyone using either calendar.
+# (Yakutat was colonized by the Russians in 1799, but the settlement
+# was destroyed in 1805 by a Yakutat-kon war party.) However, there
+# were nearby inhabitants in some cases and for our purposes perhaps
+# it's best to simply use the official transition.
+#
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Juneau 15:02:19 - LMT 1867 Oct 18
+ -8:57:41 - LMT 1900 Aug 20 12:00
+ -8:00 - PST 1942
+ -8:00 US P%sT 1946
+ -8:00 - PST 1969
+ -8:00 US P%sT 1983 Oct 30 2:00
+ -9:00 US Y%sT 1983 Nov 30
+ -9:00 US AK%sT
+Zone America/Yakutat 14:41:05 - LMT 1867 Oct 18
+ -9:18:55 - LMT 1900 Aug 20 12:00
+ -9:00 - YST 1942
+ -9:00 US Y%sT 1946
+ -9:00 - YST 1969
+ -9:00 US Y%sT 1983 Nov 30
+ -9:00 US AK%sT
+Zone America/Anchorage 14:00:24 - LMT 1867 Oct 18
+ -9:59:36 - LMT 1900 Aug 20 12:00
+ -10:00 - CAT 1942
+ -10:00 US CAT/CAWT 1945 Aug 14 23:00u
+ -10:00 US CAT/CAPT 1946 # Peace
+ -10:00 - CAT 1967 Apr
+ -10:00 - AHST 1969
+ -10:00 US AH%sT 1983 Oct 30 2:00
+ -9:00 US Y%sT 1983 Nov 30
+ -9:00 US AK%sT
+Zone America/Nome 12:58:21 - LMT 1867 Oct 18
+ -11:01:38 - LMT 1900 Aug 20 12:00
+ -11:00 - NST 1942
+ -11:00 US N%sT 1946
+ -11:00 - NST 1967 Apr
+ -11:00 - BST 1969
+ -11:00 US B%sT 1983 Oct 30 2:00
+ -9:00 US Y%sT 1983 Nov 30
+ -9:00 US AK%sT
+Zone America/Adak 12:13:21 - LMT 1867 Oct 18
+ -11:46:38 - LMT 1900 Aug 20 12:00
+ -11:00 - NST 1942
+ -11:00 US N%sT 1946
+ -11:00 - NST 1967 Apr
+ -11:00 - BST 1969
+ -11:00 US B%sT 1983 Oct 30 2:00
+ -10:00 US AH%sT 1983 Nov 30
+ -10:00 US HA%sT
+# The following switches don't quite make our 1970 cutoff.
+#
+# Shanks writes that part of southwest Alaska (e.g. Aniak)
+# switched from -11:00 to -10:00 on 1968-09-22 at 02:00,
+# and another part (e.g. Akiak) made the same switch five weeks later.
+#
+# From David Flater (2004-11-09):
+# In e-mail, 2004-11-02, Ray Hudson, historian/liaison to the Unalaska
+# Historic Preservation Commission, provided this information, which
+# suggests that Unalaska deviated from statutory time from early 1967
+# possibly until 1983:
+#
+# Minutes of the Unalaska City Council Meeting, January 10, 1967:
+# "Except for St. Paul and Akutan, Unalaska is the only important
+# location not on Alaska Standard Time. The following resolution was
+# made by William Robinson and seconded by Henry Swanson: Be it
+# resolved that the City of Unalaska hereby goes to Alaska Standard
+# Time as of midnight Friday, January 13, 1967 (1 A.M. Saturday,
+# January 14, Alaska Standard Time.) This resolution was passed with
+# three votes for and one against."
+
+# Hawaii
+#
+# From Arthur David Olson:
+# And then there's Hawaii.
+# DST was observed for one day in 1933;
+# standard time was changed by half an hour in 1947;
+# it's always standard as of 1986.
+#
+# From Paul Eggert:
+# Shanks says the 1933 experiment lasted for three weeks. Go with Shanks.
+#
+Zone Pacific/Honolulu -10:31:26 - LMT 1900 Jan 1 12:00
+ -10:30 - HST 1933 Apr 30 2:00
+ -10:30 1:00 HDT 1933 May 21 2:00
+ -10:30 US H%sT 1947 Jun 8 2:00
+ -10:00 - HST
+
+# Now we turn to US areas that have diverged from the consensus since 1970.
+
+# Arizona mostly uses MST.
+
+# From Paul Eggert (2002-10-20):
+#
+# The information in the rest of this paragraph is derived from the
+# <a href="http://www.dlapr.lib.az.us/links/daylight.htm">
+# Daylight Saving Time web page (2002-01-23)</a> maintained by the
+# Arizona State Library, Archives and Public Records.
+# Between 1944-01-01 and 1944-04-01 the State of Arizona used standard
+# time, but by federal law railroads, airlines, bus lines, military
+# personnel, and some engaged in interstate commerce continued to
+# observe war (i.e., daylight saving) time. The 1944-03-17 Phoenix
+# Gazette says that was the date the law changed, and that 04-01 was
+# the date the state's clocks would change. In 1945 the State of
+# Arizona used standard time all year, again with exceptions only as
+# mandated by federal law. Arizona observed DST in 1967, but Arizona
+# Laws 1968, ch. 183 (effective 1968-03-21) repealed DST.
+#
+# Shanks says the 1944 experiment came to an end on 1944-03-17.
+# Go with the Arizona State Library instead.
+
+Zone America/Phoenix -7:28:18 - LMT 1883 Nov 18 11:31:42
+ -7:00 US M%sT 1944 Jan 1 00:01
+ -7:00 - MST 1944 Apr 1 00:01
+ -7:00 US M%sT 1944 Oct 1 00:01
+ -7:00 - MST 1967
+ -7:00 US M%sT 1968 Mar 21
+ -7:00 - MST
+# From Arthur David Olson (1988-02-13):
+# A writer from the Inter Tribal Council of Arizona, Inc.,
+# notes in private correspondence dated 1987-12-28 that "Presently, only the
+# Navajo Nation participates in the Daylight Saving Time policy, due to its
+# large size and location in three states." (The "only" means that other
+# tribal nations don't use DST.)
+
+Link America/Denver America/Shiprock
+
+# Southern Idaho (Ada, Adams, Bannock, Bear Lake, Bingham, Blaine,
+# Boise, Bonneville, Butte, Camas, Canyon, Caribou, Cassia, Clark,
+# Custer, Elmore, Franklin, Fremont, Gem, Gooding, Jefferson, Jerome,
+# Lemhi, Lincoln, Madison, Minidoka, Oneida, Owyhee, Payette, Power,
+# Teton, Twin Falls, Valley, Washington counties, and the southern
+# quarter of Idaho county) and eastern Oregon (most of Malheur County)
+# switched four weeks late in 1974.
+#
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Boise -7:44:49 - LMT 1883 Nov 18 12:15:11
+ -8:00 US P%sT 1923 May 13 2:00
+ -7:00 US M%sT 1974
+ -7:00 - MST 1974 Feb 3 2:00
+ -7:00 US M%sT
+
+# Indiana
+#
+# For a map of Indiana's time zone regions, see:
+# <a href="http://www.mccsc.edu/time.html">
+# What time is it in Indiana?
+# </a> (2006-03-01)
+#
+# From Paul Eggert (2007-08-17):
+# Since 1970, most of Indiana has been like America/Indiana/Indianapolis,
+# with the following exceptions:
+#
+# - Gibson, Jasper, Lake, LaPorte, Newton, Porter, Posey, Spencer,
+# Vandenburgh, and Warrick counties have been like America/Chicago.
+#
+# - Dearborn and Ohio counties have been like America/New_York.
+#
+# - Clark, Floyd, and Harrison counties have been like
+# America/Kentucky/Louisville.
+#
+# - Crawford, Daviess, Dubois, Knox, Martin, Perry, Pike, Pulaski, Starke,
+# and Switzerland counties have their own time zone histories as noted below.
+#
+# Shanks partitioned Indiana into 345 regions, each with its own time history,
+# and wrote ``Even newspaper reports present contradictory information.''
+# Those Hoosiers! Such a flighty and changeable people!
+# Fortunately, most of the complexity occurred before our cutoff date of 1970.
+#
+# Other than Indianapolis, the Indiana place names are so nondescript
+# that they would be ambiguous if we left them at the `America' level.
+# So we reluctantly put them all in a subdirectory `America/Indiana'.
+
+# From Paul Eggert (2005-08-16):
+# http://www.mccsc.edu/time.html says that Indiana will use DST starting 2006.
+
+# From Nathan Stratton Treadway (2006-03-30):
+# http://www.dot.gov/affairs/dot0406.htm [3705 B]
+# From Deborah Goldsmith (2006-01-18):
+# http://dmses.dot.gov/docimages/pdf95/382329_web.pdf [2.9 MB]
+# From Paul Eggert (2006-01-20):
+# It says "DOT is relocating the time zone boundary in Indiana to move Starke,
+# Pulaski, Knox, Daviess, Martin, Pike, Dubois, and Perry Counties from the
+# Eastern Time Zone to the Central Time Zone.... The effective date of
+# this rule is 2:OO a.m. EST Sunday, April 2, 2006, which is the
+# changeover date from standard time to Daylight Saving Time."
+# Strictly speaking, this means the affected counties will change their
+# clocks twice that night, but this obviously is in error. The intent
+# is that 01:59:59 EST be followed by 02:00:00 CDT.
+
+# From Gwillim Law (2007-02-10):
+# The Associated Press has been reporting that Pulaski County, Indiana is
+# going to switch from Central to Eastern Time on March 11, 2007....
+# http://www.indystar.com/apps/pbcs.dll/article?AID=/20070207/LOCAL190108/702070524/0/LOCAL
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER
+Rule Indianapolis 1941 only - Jun 22 2:00 1:00 D
+Rule Indianapolis 1941 1954 - Sep lastSun 2:00 0 S
+Rule Indianapolis 1946 1954 - Apr lastSun 2:00 1:00 D
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Indiana/Indianapolis -5:44:38 - LMT 1883 Nov 18 12:15:22
+ -6:00 US C%sT 1920
+ -6:00 Indianapolis C%sT 1942
+ -6:00 US C%sT 1946
+ -6:00 Indianapolis C%sT 1955 Apr 24 2:00
+ -5:00 - EST 1957 Sep 29 2:00
+ -6:00 - CST 1958 Apr 27 2:00
+ -5:00 - EST 1969
+ -5:00 US E%sT 1971
+ -5:00 - EST 2006
+ -5:00 US E%sT
+#
+# Eastern Crawford County, Indiana, left its clocks alone in 1974,
+# as well as from 1976 through 2005.
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER
+Rule Marengo 1951 only - Apr lastSun 2:00 1:00 D
+Rule Marengo 1951 only - Sep lastSun 2:00 0 S
+Rule Marengo 1954 1960 - Apr lastSun 2:00 1:00 D
+Rule Marengo 1954 1960 - Sep lastSun 2:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Indiana/Marengo -5:45:23 - LMT 1883 Nov 18 12:14:37
+ -6:00 US C%sT 1951
+ -6:00 Marengo C%sT 1961 Apr 30 2:00
+ -5:00 - EST 1969
+ -5:00 US E%sT 1974 Jan 6 2:00
+ -6:00 1:00 CDT 1974 Oct 27 2:00
+ -5:00 US E%sT 1976
+ -5:00 - EST 2006
+ -5:00 US E%sT
+#
+# Daviess, Dubois, Knox, and Martin Counties, Indiana,
+# switched from eastern to central time in April 2006, then switched back
+# in November 2007.
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER
+Rule Vincennes 1946 only - Apr lastSun 2:00 1:00 D
+Rule Vincennes 1946 only - Sep lastSun 2:00 0 S
+Rule Vincennes 1953 1954 - Apr lastSun 2:00 1:00 D
+Rule Vincennes 1953 1959 - Sep lastSun 2:00 0 S
+Rule Vincennes 1955 only - May 1 0:00 1:00 D
+Rule Vincennes 1956 1963 - Apr lastSun 2:00 1:00 D
+Rule Vincennes 1960 only - Oct lastSun 2:00 0 S
+Rule Vincennes 1961 only - Sep lastSun 2:00 0 S
+Rule Vincennes 1962 1963 - Oct lastSun 2:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Indiana/Vincennes -5:50:07 - LMT 1883 Nov 18 12:09:53
+ -6:00 US C%sT 1946
+ -6:00 Vincennes C%sT 1964 Apr 26 2:00
+ -5:00 - EST 1969
+ -5:00 US E%sT 1971
+ -5:00 - EST 2006 Apr 2 2:00
+ -6:00 US C%sT 2007 Nov 4 2:00
+ -5:00 US E%sT
+#
+# Perry County, Indiana, switched from eastern to central time in April 2006.
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER
+Rule Perry 1946 only - Apr lastSun 2:00 1:00 D
+Rule Perry 1946 only - Sep lastSun 2:00 0 S
+Rule Perry 1953 1954 - Apr lastSun 2:00 1:00 D
+Rule Perry 1953 1959 - Sep lastSun 2:00 0 S
+Rule Perry 1955 only - May 1 0:00 1:00 D
+Rule Perry 1956 1963 - Apr lastSun 2:00 1:00 D
+Rule Perry 1960 only - Oct lastSun 2:00 0 S
+Rule Perry 1961 only - Sep lastSun 2:00 0 S
+Rule Perry 1962 1963 - Oct lastSun 2:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Indiana/Tell_City -5:47:03 - LMT 1883 Nov 18 12:12:57
+ -6:00 US C%sT 1946
+ -6:00 Perry C%sT 1964 Apr 26 2:00
+ -5:00 - EST 1969
+ -5:00 US E%sT 1971
+ -5:00 - EST 2006 Apr 2 2:00
+ -6:00 US C%sT
+#
+# Pike County, Indiana moved from central to eastern time in 1977,
+# then switched back in 2006, then switched back again in 2007.
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER
+Rule Pike 1955 only - May 1 0:00 1:00 D
+Rule Pike 1955 1960 - Sep lastSun 2:00 0 S
+Rule Pike 1956 1964 - Apr lastSun 2:00 1:00 D
+Rule Pike 1961 1964 - Oct lastSun 2:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Indiana/Petersburg -5:49:07 - LMT 1883 Nov 18 12:10:53
+ -6:00 US C%sT 1955
+ -6:00 Pike C%sT 1965 Apr 25 2:00
+ -5:00 - EST 1966 Oct 30 2:00
+ -6:00 US C%sT 1977 Oct 30 2:00
+ -5:00 - EST 2006 Apr 2 2:00
+ -6:00 US C%sT 2007 Nov 4 2:00
+ -5:00 US E%sT
+#
+# Starke County, Indiana moved from central to eastern time in 1991,
+# then switched back in 2006.
+# From Arthur David Olson (1991-10-28):
+# An article on page A3 of the Sunday, 1991-10-27 Washington Post
+# notes that Starke County switched from Central time to Eastern time as of
+# 1991-10-27.
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER
+Rule Starke 1947 1961 - Apr lastSun 2:00 1:00 D
+Rule Starke 1947 1954 - Sep lastSun 2:00 0 S
+Rule Starke 1955 1956 - Oct lastSun 2:00 0 S
+Rule Starke 1957 1958 - Sep lastSun 2:00 0 S
+Rule Starke 1959 1961 - Oct lastSun 2:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Indiana/Knox -5:46:30 - LMT 1883 Nov 18 12:13:30
+ -6:00 US C%sT 1947
+ -6:00 Starke C%sT 1962 Apr 29 2:00
+ -5:00 - EST 1963 Oct 27 2:00
+ -6:00 US C%sT 1991 Oct 27 2:00
+ -5:00 - EST 2006 Apr 2 2:00
+ -6:00 US C%sT
+#
+# Pulaski County, Indiana, switched from eastern to central time in
+# April 2006 and then switched back in March 2007.
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER
+Rule Pulaski 1946 1960 - Apr lastSun 2:00 1:00 D
+Rule Pulaski 1946 1954 - Sep lastSun 2:00 0 S
+Rule Pulaski 1955 1956 - Oct lastSun 2:00 0 S
+Rule Pulaski 1957 1960 - Sep lastSun 2:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Indiana/Winamac -5:46:25 - LMT 1883 Nov 18 12:13:35
+ -6:00 US C%sT 1946
+ -6:00 Pulaski C%sT 1961 Apr 30 2:00
+ -5:00 - EST 1969
+ -5:00 US E%sT 1971
+ -5:00 - EST 2006 Apr 2 2:00
+ -6:00 US C%sT 2007 Mar 11 2:00
+ -5:00 US E%sT
+#
+# Switzerland County, Indiana, did not observe DST from 1973 through 2005.
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Indiana/Vevay -5:40:16 - LMT 1883 Nov 18 12:19:44
+ -6:00 US C%sT 1954 Apr 25 2:00
+ -5:00 - EST 1969
+ -5:00 US E%sT 1973
+ -5:00 - EST 2006
+ -5:00 US E%sT
+
+# Part of Kentucky left its clocks alone in 1974.
+# This also includes Clark, Floyd, and Harrison counties in Indiana.
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER
+Rule Louisville 1921 only - May 1 2:00 1:00 D
+Rule Louisville 1921 only - Sep 1 2:00 0 S
+Rule Louisville 1941 1961 - Apr lastSun 2:00 1:00 D
+Rule Louisville 1941 only - Sep lastSun 2:00 0 S
+Rule Louisville 1946 only - Jun 2 2:00 0 S
+Rule Louisville 1950 1955 - Sep lastSun 2:00 0 S
+Rule Louisville 1956 1960 - Oct lastSun 2:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Kentucky/Louisville -5:43:02 - LMT 1883 Nov 18 12:16:58
+ -6:00 US C%sT 1921
+ -6:00 Louisville C%sT 1942
+ -6:00 US C%sT 1946
+ -6:00 Louisville C%sT 1961 Jul 23 2:00
+ -5:00 - EST 1968
+ -5:00 US E%sT 1974 Jan 6 2:00
+ -6:00 1:00 CDT 1974 Oct 27 2:00
+ -5:00 US E%sT
+#
+# Wayne County, Kentucky
+#
+# From
+# <a href="http://www.lake-cumberland.com/life/archive/news990129time.shtml">
+# Lake Cumberland LIFE
+# </a> (1999-01-29) via WKYM-101.7:
+# Clinton County has joined Wayne County in asking the DoT to change from
+# the Central to the Eastern time zone.... The Wayne County government made
+# the same request in December. And while Russell County officials have not
+# taken action, the majority of respondents to a poll conducted there in
+# August indicated they would like to change to "fast time" also.
+# The three Lake Cumberland counties are the farthest east of any U.S.
+# location in the Central time zone.
+#
+# From Rich Wales (2000-08-29):
+# After prolonged debate, and despite continuing deep differences of opinion,
+# Wayne County (central Kentucky) is switching from Central (-0600) to Eastern
+# (-0500) time. They won't "fall back" this year. See Sara Shipley,
+# The difference an hour makes, Nando Times (2000-08-29 15:33 -0400).
+#
+# From Paul Eggert (2001-07-16):
+# The final rule was published in the
+# <a href="http://frwebgate.access.gpo.gov/cgi-bin/getdoc.cgi?dbname=2000_register&docid=fr17au00-22">
+# Federal Register 65, 160 (2000-08-17), page 50154-50158.
+# </a>
+#
+Zone America/Kentucky/Monticello -5:39:24 - LMT 1883 Nov 18 12:20:36
+ -6:00 US C%sT 1946
+ -6:00 - CST 1968
+ -6:00 US C%sT 2000 Oct 29 2:00
+ -5:00 US E%sT
+
+
+# From Rives McDow (2000-08-30):
+# Here ... are all the changes in the US since 1985.
+# Kearny County, KS (put all of county on central;
+# previously split between MST and CST) ... 1990-10
+# Starke County, IN (from CST to EST) ... 1991-10
+# Oliver County, ND (from MST to CST) ... 1992-10
+# West Wendover, NV (from PST TO MST) ... 1999-10
+# Wayne County, KY (from CST to EST) ... 2000-10
+#
+# From Paul Eggert (2001-07-17):
+# We don't know where the line used to be within Kearny County, KS,
+# so omit that change for now.
+# See America/Indiana/Knox for the Starke County, IN change.
+# See America/North_Dakota/Center for the Oliver County, ND change.
+# West Wendover, NV officially switched from Pacific to mountain time on
+# 1999-10-31. See the
+# <a href="http://frwebgate.access.gpo.gov/cgi-bin/getdoc.cgi?dbname=1999_register&docid=fr21oc99-15">
+# Federal Register 64, 203 (1999-10-21), page 56705-56707.
+# </a>
+# However, the Federal Register says that West Wendover already operated
+# on mountain time, and the rule merely made this official;
+# hence a separate tz entry is not needed.
+
+# Michigan
+#
+# From Bob Devine (1988-01-28):
+# Michigan didn't observe DST from 1968 to 1973.
+#
+# From Paul Eggert (1999-03-31):
+# Shanks writes that Michigan started using standard time on 1885-09-18,
+# but Howse writes (pp 124-125, referring to Popular Astronomy, 1901-01)
+# that Detroit kept
+#
+# local time until 1900 when the City Council decreed that clocks should
+# be put back twenty-eight minutes to Central Standard Time. Half the
+# city obeyed, half refused. After considerable debate, the decision
+# was rescinded and the city reverted to Sun time. A derisive offer to
+# erect a sundial in front of the city hall was referred to the
+# Committee on Sewers. Then, in 1905, Central time was adopted
+# by city vote.
+#
+# This story is too entertaining to be false, so go with Howse over Shanks.
+#
+# From Paul Eggert (2001-03-06):
+# Garland (1927) writes ``Cleveland and Detroit advanced their clocks
+# one hour in 1914.'' This change is not in Shanks. We have no more
+# info, so omit this for now.
+#
+# Most of Michigan observed DST from 1973 on, but was a bit late in 1975.
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER
+Rule Detroit 1948 only - Apr lastSun 2:00 1:00 D
+Rule Detroit 1948 only - Sep lastSun 2:00 0 S
+Rule Detroit 1967 only - Jun 14 2:00 1:00 D
+Rule Detroit 1967 only - Oct lastSun 2:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Detroit -5:32:11 - LMT 1905
+ -6:00 - CST 1915 May 15 2:00
+ -5:00 - EST 1942
+ -5:00 US E%sT 1946
+ -5:00 Detroit E%sT 1973
+ -5:00 US E%sT 1975
+ -5:00 - EST 1975 Apr 27 2:00
+ -5:00 US E%sT
+#
+# Dickinson, Gogebic, Iron, and Menominee Counties, Michigan,
+# switched from EST to CST/CDT in 1973.
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER
+Rule Menominee 1946 only - Apr lastSun 2:00 1:00 D
+Rule Menominee 1946 only - Sep lastSun 2:00 0 S
+Rule Menominee 1966 only - Apr lastSun 2:00 1:00 D
+Rule Menominee 1966 only - Oct lastSun 2:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Menominee -5:50:27 - LMT 1885 Sep 18 12:00
+ -6:00 US C%sT 1946
+ -6:00 Menominee C%sT 1969 Apr 27 2:00
+ -5:00 - EST 1973 Apr 29 2:00
+ -6:00 US C%sT
+
+# Navassa
+# administered by the US Fish and Wildlife Service
+# claimed by US under the provisions of the 1856 Guano Islands Act
+# also claimed by Haiti
+# occupied 1857/1900 by the Navassa Phosphate Co
+# US lighthouse 1917/1996-09
+# currently uninhabited
+# see Mark Fineman, ``An Isle Rich in Guano and Discord'',
+# _Los Angeles Times_ (1998-11-10), A1, A10; it cites
+# Jimmy Skaggs, _The Great Guano Rush_ (1994).
+
+################################################################################
+
+
+# From Paul Eggert (2006-03-22):
+# A good source for time zone historical data outside the U.S. is
+# Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition),
+# San Diego: ACS Publications, Inc. (2003).
+#
+# Gwillim Law writes that a good source
+# for recent time zone data is the International Air Transport
+# Association's Standard Schedules Information Manual (IATA SSIM),
+# published semiannually. Law sent in several helpful summaries
+# of the IATA's data after 1990.
+#
+# Except where otherwise noted, Shanks & Pottenger is the source for
+# entries through 1990, and IATA SSIM is the source for entries afterwards.
+#
+# Other sources occasionally used include:
+#
+# Edward W. Whitman, World Time Differences,
+# Whitman Publishing Co, 2 Niagara Av, Ealing, London (undated),
+# which I found in the UCLA library.
+#
+# <a href="http://www.pettswoodvillage.co.uk/Daylight_Savings_William_Willett.pdf">
+# William Willett, The Waste of Daylight, 19th edition
+# </a> (1914-03)
+#
+# See the `europe' file for Greenland.
+
+# Canada
+
+# From Alain LaBont<e'> (1994-11-14):
+# I post here the time zone abbreviations standardized in Canada
+# for both English and French in the CAN/CSA-Z234.4-89 standard....
+#
+# UTC Standard time Daylight savings time
+# offset French English French English
+# -2:30 - - HAT NDT
+# -3 - - HAA ADT
+# -3:30 HNT NST - -
+# -4 HNA AST HAE EDT
+# -5 HNE EST HAC CDT
+# -6 HNC CST HAR MDT
+# -7 HNR MST HAP PDT
+# -8 HNP PST HAY YDT
+# -9 HNY YST - -
+#
+# HN: Heure Normale ST: Standard Time
+# HA: Heure Avanc<e'>e DT: Daylight saving Time
+#
+# A: de l'Atlantique Atlantic
+# C: du Centre Central
+# E: de l'Est Eastern
+# M: Mountain
+# N: Newfoundland
+# P: du Pacifique Pacific
+# R: des Rocheuses
+# T: de Terre-Neuve
+# Y: du Yukon Yukon
+#
+# From Paul Eggert (1994-11-22):
+# Alas, this sort of thing must be handled by localization software.
+
+# Unless otherwise specified, the data for Canada are all from Shanks
+# & Pottenger.
+
+# From Chris Walton (2006-04-01, 2006-04-25, 2006-06-26, 2007-01-31,
+# 2007-03-01):
+# The British Columbia government announced yesterday that it will
+# adjust daylight savings next year to align with changes in the
+# U.S. and the rest of Canada....
+# http://www2.news.gov.bc.ca/news_releases_2005-2009/2006AG0014-000330.htm
+# ...
+# Nova Scotia
+# Daylight saving time will be extended by four weeks starting in 2007....
+# http://www.gov.ns.ca/just/regulations/rg2/2006/ma1206.pdf
+#
+# [For New Brunswick] the new legislation dictates that the time change is to
+# be done at 02:00 instead of 00:01.
+# http://www.gnb.ca/0062/acts/BBA-2006/Chap-19.pdf
+# ...
+# Manitoba has traditionally changed the clock every fall at 03:00.
+# As of 2006, the transition is to take place one hour earlier at 02:00.
+# http://web2.gov.mb.ca/laws/statutes/ccsm/o030e.php
+# ...
+# [Alberta, Ontario, Quebec] will follow US rules.
+# http://www.qp.gov.ab.ca/documents/spring/CH03_06.CFM
+# http://www.e-laws.gov.on.ca/DBLaws/Source/Regs/English/2006/R06111_e.htm
+# http://www2.publicationsduquebec.gouv.qc.ca/dynamicSearch/telecharge.php?type=5&file=2006C39A.PDF
+# ...
+# P.E.I. will follow US rules....
+# http://www.assembly.pe.ca/bills/pdf_chapter/62/3/chapter-41.pdf
+# ...
+# Province of Newfoundland and Labrador....
+# http://www.hoa.gov.nl.ca/hoa/bills/Bill0634.htm
+# ...
+# Yukon
+# http://www.gov.yk.ca/legislation/regs/oic2006_127.pdf
+# ...
+# N.W.T. will follow US rules. Whoever maintains the government web site
+# does not seem to believe in bookmarks. To see the news release, click the
+# following link and search for "Daylight Savings Time Change". Press the
+# "Daylight Savings Time Change" link; it will fire off a popup using
+# JavaScript.
+# http://www.exec.gov.nt.ca/currentnews/currentPR.asp?mode=archive
+# ...
+# Nunavut
+# An amendment to the Interpretation Act was registered on February 19/2007....
+# http://action.attavik.ca/home/justice-gn/attach/2007/gaz02part2.pdf
+
+# From Paul Eggert (2006-04-25):
+# H. David Matthews and Mary Vincent's map
+# <a href="http://www.canadiangeographic.ca/Magazine/SO98/geomap.asp">
+# "It's about TIME", _Canadian Geographic_ (September-October 1998)
+# </a> contains detailed boundaries for regions observing nonstandard
+# time and daylight saving time arrangements in Canada circa 1998.
+#
+# INMS, the Institute for National Measurement Standards in Ottawa, has <a
+# href="http://inms-ienm.nrc-cnrc.gc.ca/en/time_services/daylight_saving_e.php">
+# information about standard and daylight saving time zones in Canada.
+# </a> (updated periodically).
+# Its unofficial information is often taken from Matthews and Vincent.
+
+# From Paul Eggert (2006-06-27):
+# For now, assume all of DST-observing Canada will fall into line with the
+# new US DST rules,
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Canada 1918 only - Apr 14 2:00 1:00 D
+Rule Canada 1918 only - Oct 31 2:00 0 S
+Rule Canada 1942 only - Feb 9 2:00 1:00 W # War
+Rule Canada 1945 only - Aug 14 23:00u 1:00 P # Peace
+Rule Canada 1945 only - Sep 30 2:00 0 S
+Rule Canada 1974 1986 - Apr lastSun 2:00 1:00 D
+Rule Canada 1974 2006 - Oct lastSun 2:00 0 S
+Rule Canada 1987 2006 - Apr Sun>=1 2:00 1:00 D
+Rule Canada 2007 max - Mar Sun>=8 2:00 1:00 D
+Rule Canada 2007 max - Nov Sun>=1 2:00 0 S
+
+
+# Newfoundland and Labrador
+
+# From Paul Eggert (2000-10-02):
+# Matthews and Vincent (1998) write that Labrador should use NST/NDT,
+# but the only part of Labrador that follows the rules is the
+# southeast corner, including Port Hope Simpson and Mary's Harbour,
+# but excluding, say, Black Tickle.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule StJohns 1917 only - Apr 8 2:00 1:00 D
+Rule StJohns 1917 only - Sep 17 2:00 0 S
+# Whitman gives 1919 Apr 5 and 1920 Apr 5; go with Shanks & Pottenger.
+Rule StJohns 1919 only - May 5 23:00 1:00 D
+Rule StJohns 1919 only - Aug 12 23:00 0 S
+# For 1931-1935 Whitman gives Apr same date; go with Shanks & Pottenger.
+Rule StJohns 1920 1935 - May Sun>=1 23:00 1:00 D
+Rule StJohns 1920 1935 - Oct lastSun 23:00 0 S
+# For 1936-1941 Whitman gives May Sun>=8 and Oct Sun>=1; go with Shanks &
+# Pottenger.
+Rule StJohns 1936 1941 - May Mon>=9 0:00 1:00 D
+Rule StJohns 1936 1941 - Oct Mon>=2 0:00 0 S
+# Whitman gives the following transitions:
+# 1942 03-01/12-31, 1943 05-30/09-05, 1944 07-10/09-02, 1945 01-01/10-07
+# but go with Shanks & Pottenger and assume they used Canadian rules.
+# For 1946-9 Whitman gives May 5,4,9,1 - Oct 1,5,3,2, and for 1950 he gives
+# Apr 30 - Sep 24; go with Shanks & Pottenger.
+Rule StJohns 1946 1950 - May Sun>=8 2:00 1:00 D
+Rule StJohns 1946 1950 - Oct Sun>=2 2:00 0 S
+Rule StJohns 1951 1986 - Apr lastSun 2:00 1:00 D
+Rule StJohns 1951 1959 - Sep lastSun 2:00 0 S
+Rule StJohns 1960 1986 - Oct lastSun 2:00 0 S
+# From Paul Eggert (2000-10-02):
+# INMS (2000-09-12) says that, since 1988 at least, Newfoundland switches
+# at 00:01 local time. For now, assume it started in 1987.
+Rule StJohns 1987 only - Apr Sun>=1 0:01 1:00 D
+Rule StJohns 1987 2006 - Oct lastSun 0:01 0 S
+Rule StJohns 1988 only - Apr Sun>=1 0:01 2:00 DD
+Rule StJohns 1989 2006 - Apr Sun>=1 0:01 1:00 D
+Rule StJohns 2007 max - Mar Sun>=8 0:01 1:00 D
+Rule StJohns 2007 max - Nov Sun>=1 0:01 0 S
+#
+# St John's has an apostrophe, but Posix file names can't have apostrophes.
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/St_Johns -3:30:52 - LMT 1884
+ -3:30:52 StJohns N%sT 1918
+ -3:30:52 Canada N%sT 1919
+ -3:30:52 StJohns N%sT 1935 Mar 30
+ -3:30 StJohns N%sT 1942 May 11
+ -3:30 Canada N%sT 1946
+ -3:30 StJohns N%sT
+
+# most of east Labrador
+
+# The name `Happy Valley-Goose Bay' is too long; use `Goose Bay'.
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Goose_Bay -4:01:40 - LMT 1884 # Happy Valley-Goose Bay
+ -3:30:52 - NST 1918
+ -3:30:52 Canada N%sT 1919
+ -3:30:52 - NST 1935 Mar 30
+ -3:30 - NST 1936
+ -3:30 StJohns N%sT 1942 May 11
+ -3:30 Canada N%sT 1946
+ -3:30 StJohns N%sT 1966 Mar 15 2:00
+ -4:00 StJohns A%sT
+
+
+# west Labrador, Nova Scotia, Prince Edward I
+
+# From Paul Eggert (2006-03-22):
+# Shanks & Pottenger write that since 1970 most of this region has been like
+# Halifax. Many locales did not observe peacetime DST until 1972;
+# Glace Bay, NS is the largest that we know of.
+# Shanks & Pottenger also write that Liverpool, NS was the only town
+# in Canada to observe DST in 1971 but not 1970; for now we'll assume
+# this is a typo.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Halifax 1916 only - Apr 1 0:00 1:00 D
+Rule Halifax 1916 only - Oct 1 0:00 0 S
+Rule Halifax 1920 only - May 9 0:00 1:00 D
+Rule Halifax 1920 only - Aug 29 0:00 0 S
+Rule Halifax 1921 only - May 6 0:00 1:00 D
+Rule Halifax 1921 1922 - Sep 5 0:00 0 S
+Rule Halifax 1922 only - Apr 30 0:00 1:00 D
+Rule Halifax 1923 1925 - May Sun>=1 0:00 1:00 D
+Rule Halifax 1923 only - Sep 4 0:00 0 S
+Rule Halifax 1924 only - Sep 15 0:00 0 S
+Rule Halifax 1925 only - Sep 28 0:00 0 S
+Rule Halifax 1926 only - May 16 0:00 1:00 D
+Rule Halifax 1926 only - Sep 13 0:00 0 S
+Rule Halifax 1927 only - May 1 0:00 1:00 D
+Rule Halifax 1927 only - Sep 26 0:00 0 S
+Rule Halifax 1928 1931 - May Sun>=8 0:00 1:00 D
+Rule Halifax 1928 only - Sep 9 0:00 0 S
+Rule Halifax 1929 only - Sep 3 0:00 0 S
+Rule Halifax 1930 only - Sep 15 0:00 0 S
+Rule Halifax 1931 1932 - Sep Mon>=24 0:00 0 S
+Rule Halifax 1932 only - May 1 0:00 1:00 D
+Rule Halifax 1933 only - Apr 30 0:00 1:00 D
+Rule Halifax 1933 only - Oct 2 0:00 0 S
+Rule Halifax 1934 only - May 20 0:00 1:00 D
+Rule Halifax 1934 only - Sep 16 0:00 0 S
+Rule Halifax 1935 only - Jun 2 0:00 1:00 D
+Rule Halifax 1935 only - Sep 30 0:00 0 S
+Rule Halifax 1936 only - Jun 1 0:00 1:00 D
+Rule Halifax 1936 only - Sep 14 0:00 0 S
+Rule Halifax 1937 1938 - May Sun>=1 0:00 1:00 D
+Rule Halifax 1937 1941 - Sep Mon>=24 0:00 0 S
+Rule Halifax 1939 only - May 28 0:00 1:00 D
+Rule Halifax 1940 1941 - May Sun>=1 0:00 1:00 D
+Rule Halifax 1946 1949 - Apr lastSun 2:00 1:00 D
+Rule Halifax 1946 1949 - Sep lastSun 2:00 0 S
+Rule Halifax 1951 1954 - Apr lastSun 2:00 1:00 D
+Rule Halifax 1951 1954 - Sep lastSun 2:00 0 S
+Rule Halifax 1956 1959 - Apr lastSun 2:00 1:00 D
+Rule Halifax 1956 1959 - Sep lastSun 2:00 0 S
+Rule Halifax 1962 1973 - Apr lastSun 2:00 1:00 D
+Rule Halifax 1962 1973 - Oct lastSun 2:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Halifax -4:14:24 - LMT 1902 Jun 15
+ -4:00 Halifax A%sT 1918
+ -4:00 Canada A%sT 1919
+ -4:00 Halifax A%sT 1942 Feb 9 2:00s
+ -4:00 Canada A%sT 1946
+ -4:00 Halifax A%sT 1974
+ -4:00 Canada A%sT
+Zone America/Glace_Bay -3:59:48 - LMT 1902 Jun 15
+ -4:00 Canada A%sT 1953
+ -4:00 Halifax A%sT 1954
+ -4:00 - AST 1972
+ -4:00 Halifax A%sT 1974
+ -4:00 Canada A%sT
+
+# New Brunswick
+
+# From Paul Eggert (2007-01-31):
+# The Time Definition Act <http://www.gnb.ca/0062/PDF-acts/t-06.pdf>
+# says they changed at 00:01 through 2006, and
+# <http://www.canlii.org/nb/laws/sta/t-6/20030127/whole.html> makes it
+# clear that this was the case since at least 1993.
+# For now, assume it started in 1993.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Moncton 1933 1935 - Jun Sun>=8 1:00 1:00 D
+Rule Moncton 1933 1935 - Sep Sun>=8 1:00 0 S
+Rule Moncton 1936 1938 - Jun Sun>=1 1:00 1:00 D
+Rule Moncton 1936 1938 - Sep Sun>=1 1:00 0 S
+Rule Moncton 1939 only - May 27 1:00 1:00 D
+Rule Moncton 1939 1941 - Sep Sat>=21 1:00 0 S
+Rule Moncton 1940 only - May 19 1:00 1:00 D
+Rule Moncton 1941 only - May 4 1:00 1:00 D
+Rule Moncton 1946 1972 - Apr lastSun 2:00 1:00 D
+Rule Moncton 1946 1956 - Sep lastSun 2:00 0 S
+Rule Moncton 1957 1972 - Oct lastSun 2:00 0 S
+Rule Moncton 1993 2006 - Apr Sun>=1 0:01 1:00 D
+Rule Moncton 1993 2006 - Oct lastSun 0:01 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Moncton -4:19:08 - LMT 1883 Dec 9
+ -5:00 - EST 1902 Jun 15
+ -4:00 Canada A%sT 1933
+ -4:00 Moncton A%sT 1942
+ -4:00 Canada A%sT 1946
+ -4:00 Moncton A%sT 1973
+ -4:00 Canada A%sT 1993
+ -4:00 Moncton A%sT 2007
+ -4:00 Canada A%sT
+
+# Quebec
+
+# From Paul Eggert (2006-07-09):
+# Shanks & Pottenger write that since 1970 most of Quebec has been
+# like Montreal.
+
+# From Paul Eggert (2006-06-27):
+# Matthews and Vincent (1998) also write that Quebec east of the -63
+# meridian is supposed to observe AST, but residents as far east as
+# Natashquan use EST/EDT, and residents east of Natashquan use AST.
+# In "Official time in Quebec" the Quebec department of justice writes in
+# http://www.justice.gouv.qc.ca/english/publications/generale/temps-regl-1-a.htm
+# that "The residents of the Municipality of the
+# Cote-Nord-du-Golfe-Saint-Laurent and the municipalities of Saint-Augustin,
+# Bonne-Esperance and Blanc-Sablon apply the Official Time Act as it is
+# written and use Atlantic standard time all year round. The same applies to
+# the residents of the Native facilities along the lower North Shore."
+# <http://www.assnat.qc.ca/eng/37legislature2/Projets-loi/Publics/06-a002.htm>
+# says this common practice was codified into law as of 2007.
+# For lack of better info, guess this practice began around 1970, contra to
+# Shanks & Pottenger who have this region observing AST/ADT.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Mont 1917 only - Mar 25 2:00 1:00 D
+Rule Mont 1917 only - Apr 24 0:00 0 S
+Rule Mont 1919 only - Mar 31 2:30 1:00 D
+Rule Mont 1919 only - Oct 25 2:30 0 S
+Rule Mont 1920 only - May 2 2:30 1:00 D
+Rule Mont 1920 1922 - Oct Sun>=1 2:30 0 S
+Rule Mont 1921 only - May 1 2:00 1:00 D
+Rule Mont 1922 only - Apr 30 2:00 1:00 D
+Rule Mont 1924 only - May 17 2:00 1:00 D
+Rule Mont 1924 1926 - Sep lastSun 2:30 0 S
+Rule Mont 1925 1926 - May Sun>=1 2:00 1:00 D
+# The 1927-to-1937 rules can be expressed more simply as
+# Rule Mont 1927 1937 - Apr lastSat 24:00 1:00 D
+# Rule Mont 1927 1937 - Sep lastSat 24:00 0 S
+# The rules below avoid use of 24:00
+# (which pre-1998 versions of zic cannot handle).
+Rule Mont 1927 only - May 1 0:00 1:00 D
+Rule Mont 1927 1932 - Sep lastSun 0:00 0 S
+Rule Mont 1928 1931 - Apr lastSun 0:00 1:00 D
+Rule Mont 1932 only - May 1 0:00 1:00 D
+Rule Mont 1933 1940 - Apr lastSun 0:00 1:00 D
+Rule Mont 1933 only - Oct 1 0:00 0 S
+Rule Mont 1934 1939 - Sep lastSun 0:00 0 S
+Rule Mont 1946 1973 - Apr lastSun 2:00 1:00 D
+Rule Mont 1945 1948 - Sep lastSun 2:00 0 S
+Rule Mont 1949 1950 - Oct lastSun 2:00 0 S
+Rule Mont 1951 1956 - Sep lastSun 2:00 0 S
+Rule Mont 1957 1973 - Oct lastSun 2:00 0 S
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Blanc-Sablon -3:48:28 - LMT 1884
+ -4:00 Canada A%sT 1970
+ -4:00 - AST
+Zone America/Montreal -4:54:16 - LMT 1884
+ -5:00 Mont E%sT 1918
+ -5:00 Canada E%sT 1919
+ -5:00 Mont E%sT 1942 Feb 9 2:00s
+ -5:00 Canada E%sT 1946
+ -5:00 Mont E%sT 1974
+ -5:00 Canada E%sT
+
+
+# Ontario
+
+# From Paul Eggert (2006-07-09):
+# Shanks & Pottenger write that since 1970 most of Ontario has been like
+# Toronto.
+# Thunder Bay skipped DST in 1973.
+# Many smaller locales did not observe peacetime DST until 1974;
+# Nipigon (EST) and Rainy River (CST) are the largest that we know of.
+# Far west Ontario is like Winnipeg; far east Quebec is like Halifax.
+
+# From Mark Brader (2003-07-26):
+# [According to the Toronto Star] Orillia, Ontario, adopted DST
+# effective Saturday, 1912-06-22, 22:00; the article mentions that
+# Port Arthur (now part of Thunder Bay, Ontario) as well as Moose Jaw
+# have already done so. In Orillia DST was to run until Saturday,
+# 1912-08-31 (no time mentioned), but it was met with considerable
+# hostility from certain segments of the public, and was revoked after
+# only two weeks -- I copied it as Saturday, 1912-07-07, 22:00, but
+# presumably that should be -07-06. (1912-06-19, -07-12; also letters
+# earlier in June).
+#
+# Kenora, Ontario, was to abandon DST on 1914-06-01 (-05-21).
+
+# From Paul Eggert (1997-10-17):
+# Mark Brader writes that an article in the 1997-10-14 Toronto Star
+# says that Atikokan, Ontario currently does not observe DST,
+# but will vote on 11-10 whether to use EST/EDT.
+# He also writes that the
+# <a href="http://www.gov.on.ca/MBS/english/publications/statregs/conttext.html">
+# Ontario Time Act (1990, Chapter T.9)
+# </a>
+# says that Ontario east of 90W uses EST/EDT, and west of 90W uses CST/CDT.
+# Officially Atikokan is therefore on CST/CDT, and most likely this report
+# concerns a non-official time observed as a matter of local practice.
+#
+# From Paul Eggert (2000-10-02):
+# Matthews and Vincent (1998) write that Atikokan, Pickle Lake, and
+# New Osnaburgh observe CST all year, that Big Trout Lake observes
+# CST/CDT, and that Upsala and Shebandowan observe EST/EDT, all in
+# violation of the official Ontario rules.
+#
+# From Paul Eggert (2006-07-09):
+# Chris Walton (2006-07-06) mentioned an article by Stephanie MacLellan in the
+# 2005-07-21 Chronicle-Journal, which said:
+#
+# The clocks in Atikokan stay set on standard time year-round.
+# This means they spend about half the time on central time and
+# the other half on eastern time.
+#
+# For the most part, the system works, Mayor Dennis Brown said.
+#
+# "The majority of businesses in Atikokan deal more with Eastern
+# Canada, but there are some that deal with Western Canada," he
+# said. "I don't see any changes happening here."
+#
+# Walton also writes "Supposedly Pickle Lake and Mishkeegogamang
+# [New Osnaburgh] follow the same practice."
+
+# From Garry McKinnon (2006-07-14) via Chris Walton:
+# I chatted with a member of my board who has an outstanding memory
+# and a long history in Atikokan (and in the telecom industry) and he
+# can say for certain that Atikokan has been practicing the current
+# time keeping since 1952, at least.
+
+# From Paul Eggert (2006-07-17):
+# Shanks & Pottenger say that Atikokan has agreed with Rainy River
+# ever since standard time was introduced, but the information from
+# McKinnon sounds more authoritative. For now, assume that Atikokan
+# switched to EST immediately after WWII era daylight saving time
+# ended. This matches the old (less-populous) America/Coral_Harbour
+# entry since our cutoff date of 1970, so we can move
+# America/Coral_Harbour to the 'backward' file.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Toronto 1919 only - Mar 30 23:30 1:00 D
+Rule Toronto 1919 only - Oct 26 0:00 0 S
+Rule Toronto 1920 only - May 2 2:00 1:00 D
+Rule Toronto 1920 only - Sep 26 0:00 0 S
+Rule Toronto 1921 only - May 15 2:00 1:00 D
+Rule Toronto 1921 only - Sep 15 2:00 0 S
+Rule Toronto 1922 1923 - May Sun>=8 2:00 1:00 D
+# Shanks & Pottenger say 1923-09-19; assume it's a typo and that "-16"
+# was meant.
+Rule Toronto 1922 1926 - Sep Sun>=15 2:00 0 S
+Rule Toronto 1924 1927 - May Sun>=1 2:00 1:00 D
+# The 1927-to-1939 rules can be expressed more simply as
+# Rule Toronto 1927 1937 - Sep Sun>=25 2:00 0 S
+# Rule Toronto 1928 1937 - Apr Sun>=25 2:00 1:00 D
+# Rule Toronto 1938 1940 - Apr lastSun 2:00 1:00 D
+# Rule Toronto 1938 1939 - Sep lastSun 2:00 0 S
+# The rules below avoid use of Sun>=25
+# (which pre-2004 versions of zic cannot handle).
+Rule Toronto 1927 1932 - Sep lastSun 2:00 0 S
+Rule Toronto 1928 1931 - Apr lastSun 2:00 1:00 D
+Rule Toronto 1932 only - May 1 2:00 1:00 D
+Rule Toronto 1933 1940 - Apr lastSun 2:00 1:00 D
+Rule Toronto 1933 only - Oct 1 2:00 0 S
+Rule Toronto 1934 1939 - Sep lastSun 2:00 0 S
+Rule Toronto 1945 1946 - Sep lastSun 2:00 0 S
+Rule Toronto 1946 only - Apr lastSun 2:00 1:00 D
+Rule Toronto 1947 1949 - Apr lastSun 0:00 1:00 D
+Rule Toronto 1947 1948 - Sep lastSun 0:00 0 S
+Rule Toronto 1949 only - Nov lastSun 0:00 0 S
+Rule Toronto 1950 1973 - Apr lastSun 2:00 1:00 D
+Rule Toronto 1950 only - Nov lastSun 2:00 0 S
+Rule Toronto 1951 1956 - Sep lastSun 2:00 0 S
+# Shanks & Pottenger say Toronto ended DST a week early in 1971,
+# namely on 1971-10-24, but Mark Brader wrote (2003-05-31) that this
+# is wrong, and that he had confirmed it by checking the 1971-10-30
+# Toronto Star, which said that DST was ending 1971-10-31 as usual.
+Rule Toronto 1957 1973 - Oct lastSun 2:00 0 S
+
+# From Paul Eggert (2003-07-27):
+# Willett (1914-03) writes (p. 17) "In the Cities of Fort William, and
+# Port Arthur, Ontario, the principle of the Bill has been in
+# operation for the past three years, and in the City of Moose Jaw,
+# Saskatchewan, for one year."
+
+# From David Bryan via Tory Tronrud, Director/Curator,
+# Thunder Bay Museum (2003-11-12):
+# There is some suggestion, however, that, by-law or not, daylight
+# savings time was being practiced in Fort William and Port Arthur
+# before 1909.... [I]n 1910, the line between the Eastern and Central
+# Time Zones was permanently moved about two hundred miles west to
+# include the Thunder Bay area.... When Canada adopted daylight
+# savings time in 1916, Fort William and Port Arthur, having done so
+# already, did not change their clocks.... During the Second World
+# War,... [t]he cities agreed to implement DST during the summer
+# months for the remainder of the war years.
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Toronto -5:17:32 - LMT 1895
+ -5:00 Canada E%sT 1919
+ -5:00 Toronto E%sT 1942 Feb 9 2:00s
+ -5:00 Canada E%sT 1946
+ -5:00 Toronto E%sT 1974
+ -5:00 Canada E%sT
+Zone America/Thunder_Bay -5:57:00 - LMT 1895
+ -6:00 - CST 1910
+ -5:00 - EST 1942
+ -5:00 Canada E%sT 1970
+ -5:00 Mont E%sT 1973
+ -5:00 - EST 1974
+ -5:00 Canada E%sT
+Zone America/Nipigon -5:53:04 - LMT 1895
+ -5:00 Canada E%sT 1940 Sep 29
+ -5:00 1:00 EDT 1942 Feb 9 2:00s
+ -5:00 Canada E%sT
+Zone America/Rainy_River -6:18:16 - LMT 1895
+ -6:00 Canada C%sT 1940 Sep 29
+ -6:00 1:00 CDT 1942 Feb 9 2:00s
+ -6:00 Canada C%sT
+Zone America/Atikokan -6:06:28 - LMT 1895
+ -6:00 Canada C%sT 1940 Sep 29
+ -6:00 1:00 CDT 1942 Feb 9 2:00s
+ -6:00 Canada C%sT 1945 Sep 30 2:00
+ -5:00 - EST
+
+
+# Manitoba
+
+# From Rob Douglas (2006-04-06):
+# the old Manitoba Time Act - as amended by Bill 2, assented to
+# March 27, 1987 ... said ...
+# "between two o'clock Central Standard Time in the morning of
+# the first Sunday of April of each year and two o'clock Central
+# Standard Time in the morning of the last Sunday of October next
+# following, one hour in advance of Central Standard Time."...
+# I believe that the English legislation [of the old time act] had =
+# been assented to (March 22, 1967)....
+# Also, as far as I can tell, there was no order-in-council varying
+# the time of Daylight Saving Time for 2005 and so the provisions of
+# the 1987 version would apply - the changeover was at 2:00 Central
+# Standard Time (i.e. not until 3:00 Central Daylight Time).
+
+# From Paul Eggert (2006-04-10):
+# Shanks & Pottenger say Manitoba switched at 02:00 (not 02:00s)
+# starting 1966. Since 02:00s is clearly correct for 1967 on, assume
+# it was also 02:00s in 1966.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Winn 1916 only - Apr 23 0:00 1:00 D
+Rule Winn 1916 only - Sep 17 0:00 0 S
+Rule Winn 1918 only - Apr 14 2:00 1:00 D
+Rule Winn 1918 only - Oct 31 2:00 0 S
+Rule Winn 1937 only - May 16 2:00 1:00 D
+Rule Winn 1937 only - Sep 26 2:00 0 S
+Rule Winn 1942 only - Feb 9 2:00 1:00 W # War
+Rule Winn 1945 only - Aug 14 23:00u 1:00 P # Peace
+Rule Winn 1945 only - Sep lastSun 2:00 0 S
+Rule Winn 1946 only - May 12 2:00 1:00 D
+Rule Winn 1946 only - Oct 13 2:00 0 S
+Rule Winn 1947 1949 - Apr lastSun 2:00 1:00 D
+Rule Winn 1947 1949 - Sep lastSun 2:00 0 S
+Rule Winn 1950 only - May 1 2:00 1:00 D
+Rule Winn 1950 only - Sep 30 2:00 0 S
+Rule Winn 1951 1960 - Apr lastSun 2:00 1:00 D
+Rule Winn 1951 1958 - Sep lastSun 2:00 0 S
+Rule Winn 1959 only - Oct lastSun 2:00 0 S
+Rule Winn 1960 only - Sep lastSun 2:00 0 S
+Rule Winn 1963 only - Apr lastSun 2:00 1:00 D
+Rule Winn 1963 only - Sep 22 2:00 0 S
+Rule Winn 1966 1986 - Apr lastSun 2:00s 1:00 D
+Rule Winn 1966 2005 - Oct lastSun 2:00s 0 S
+Rule Winn 1987 2005 - Apr Sun>=1 2:00s 1:00 D
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Winnipeg -6:28:36 - LMT 1887 Jul 16
+ -6:00 Winn C%sT 2006
+ -6:00 Canada C%sT
+
+
+# Saskatchewan
+
+# From Mark Brader (2003-07-26):
+# The first actual adoption of DST in Canada was at the municipal
+# level. As the [Toronto] Star put it (1912-06-07), "While people
+# elsewhere have long been talking of legislation to save daylight,
+# the city of Moose Jaw [Saskatchewan] has acted on its own hook."
+# DST in Moose Jaw began on Saturday, 1912-06-01 (no time mentioned:
+# presumably late evening, as below), and would run until "the end of
+# the summer". The discrepancy between municipal time and railroad
+# time was noted.
+
+# From Paul Eggert (2003-07-27):
+# Willett (1914-03) notes that DST "has been in operation ... in the
+# City of Moose Jaw, Saskatchewan, for one year."
+
+# From Paul Eggert (2006-03-22):
+# Shanks & Pottenger say that since 1970 this region has mostly been as Regina.
+# Some western towns (e.g. Swift Current) switched from MST/MDT to CST in 1972.
+# Other western towns (e.g. Lloydminster) are like Edmonton.
+# Matthews and Vincent (1998) write that Denare Beach and Creighton
+# are like Winnipeg, in violation of Saskatchewan law.
+
+# From W. Jones (1992-11-06):
+# The. . .below is based on information I got from our law library, the
+# provincial archives, and the provincial Community Services department.
+# A precise history would require digging through newspaper archives, and
+# since you didn't say what you wanted, I didn't bother.
+#
+# Saskatchewan is split by a time zone meridian (105W) and over the years
+# the boundary became pretty ragged as communities near it reevaluated
+# their affiliations in one direction or the other. In 1965 a provincial
+# referendum favoured legislating common time practices.
+#
+# On 15 April 1966 the Time Act (c. T-14, Revised Statutes of
+# Saskatchewan 1978) was proclaimed, and established that the eastern
+# part of Saskatchewan would use CST year round, that districts in
+# northwest Saskatchewan would by default follow CST but could opt to
+# follow Mountain Time rules (thus 1 hour difference in the winter and
+# zero in the summer), and that districts in southwest Saskatchewan would
+# by default follow MT but could opt to follow CST.
+#
+# It took a few years for the dust to settle (I know one story of a town
+# on one time zone having its school in another, such that a mom had to
+# serve her family lunch in two shifts), but presently it seems that only
+# a few towns on the border with Alberta (e.g. Lloydminster) follow MT
+# rules any more; all other districts appear to have used CST year round
+# since sometime in the 1960s.
+
+# From Chris Walton (2006-06-26):
+# The Saskatchewan time act which was last updated in 1996 is about 30 pages
+# long and rather painful to read.
+# http://www.qp.gov.sk.ca/documents/English/Statutes/Statutes/T14.pdf
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Regina 1918 only - Apr 14 2:00 1:00 D
+Rule Regina 1918 only - Oct 31 2:00 0 S
+Rule Regina 1930 1934 - May Sun>=1 0:00 1:00 D
+Rule Regina 1930 1934 - Oct Sun>=1 0:00 0 S
+Rule Regina 1937 1941 - Apr Sun>=8 0:00 1:00 D
+Rule Regina 1937 only - Oct Sun>=8 0:00 0 S
+Rule Regina 1938 only - Oct Sun>=1 0:00 0 S
+Rule Regina 1939 1941 - Oct Sun>=8 0:00 0 S
+Rule Regina 1942 only - Feb 9 2:00 1:00 W # War
+Rule Regina 1945 only - Aug 14 23:00u 1:00 P # Peace
+Rule Regina 1945 only - Sep lastSun 2:00 0 S
+Rule Regina 1946 only - Apr Sun>=8 2:00 1:00 D
+Rule Regina 1946 only - Oct Sun>=8 2:00 0 S
+Rule Regina 1947 1957 - Apr lastSun 2:00 1:00 D
+Rule Regina 1947 1957 - Sep lastSun 2:00 0 S
+Rule Regina 1959 only - Apr lastSun 2:00 1:00 D
+Rule Regina 1959 only - Oct lastSun 2:00 0 S
+#
+Rule Swift 1957 only - Apr lastSun 2:00 1:00 D
+Rule Swift 1957 only - Oct lastSun 2:00 0 S
+Rule Swift 1959 1961 - Apr lastSun 2:00 1:00 D
+Rule Swift 1959 only - Oct lastSun 2:00 0 S
+Rule Swift 1960 1961 - Sep lastSun 2:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Regina -6:58:36 - LMT 1905 Sep
+ -7:00 Regina M%sT 1960 Apr lastSun 2:00
+ -6:00 - CST
+Zone America/Swift_Current -7:11:20 - LMT 1905 Sep
+ -7:00 Canada M%sT 1946 Apr lastSun 2:00
+ -7:00 Regina M%sT 1950
+ -7:00 Swift M%sT 1972 Apr lastSun 2:00
+ -6:00 - CST
+
+
+# Alberta
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Edm 1918 1919 - Apr Sun>=8 2:00 1:00 D
+Rule Edm 1918 only - Oct 31 2:00 0 S
+Rule Edm 1919 only - May 27 2:00 0 S
+Rule Edm 1920 1923 - Apr lastSun 2:00 1:00 D
+Rule Edm 1920 only - Oct lastSun 2:00 0 S
+Rule Edm 1921 1923 - Sep lastSun 2:00 0 S
+Rule Edm 1942 only - Feb 9 2:00 1:00 W # War
+Rule Edm 1945 only - Aug 14 23:00u 1:00 P # Peace
+Rule Edm 1945 only - Sep lastSun 2:00 0 S
+Rule Edm 1947 only - Apr lastSun 2:00 1:00 D
+Rule Edm 1947 only - Sep lastSun 2:00 0 S
+Rule Edm 1967 only - Apr lastSun 2:00 1:00 D
+Rule Edm 1967 only - Oct lastSun 2:00 0 S
+Rule Edm 1969 only - Apr lastSun 2:00 1:00 D
+Rule Edm 1969 only - Oct lastSun 2:00 0 S
+Rule Edm 1972 1986 - Apr lastSun 2:00 1:00 D
+Rule Edm 1972 2006 - Oct lastSun 2:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Edmonton -7:33:52 - LMT 1906 Sep
+ -7:00 Edm M%sT 1987
+ -7:00 Canada M%sT
+
+
+# British Columbia
+
+# From Paul Eggert (2006-03-22):
+# Shanks & Pottenger write that since 1970 most of this region has
+# been like Vancouver.
+# Dawson Creek uses MST. Much of east BC is like Edmonton.
+# Matthews and Vincent (1998) write that Creston is like Dawson Creek.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Vanc 1918 only - Apr 14 2:00 1:00 D
+Rule Vanc 1918 only - Oct 31 2:00 0 S
+Rule Vanc 1942 only - Feb 9 2:00 1:00 W # War
+Rule Vanc 1945 only - Aug 14 23:00u 1:00 P # Peace
+Rule Vanc 1945 only - Sep 30 2:00 0 S
+Rule Vanc 1946 1986 - Apr lastSun 2:00 1:00 D
+Rule Vanc 1946 only - Oct 13 2:00 0 S
+Rule Vanc 1947 1961 - Sep lastSun 2:00 0 S
+Rule Vanc 1962 2006 - Oct lastSun 2:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Vancouver -8:12:28 - LMT 1884
+ -8:00 Vanc P%sT 1987
+ -8:00 Canada P%sT
+Zone America/Dawson_Creek -8:00:56 - LMT 1884
+ -8:00 Canada P%sT 1947
+ -8:00 Vanc P%sT 1972 Aug 30 2:00
+ -7:00 - MST
+
+
+# Northwest Territories, Nunavut, Yukon
+
+# From Paul Eggert (2006-03-22):
+# Dawson switched to PST in 1973. Inuvik switched to MST in 1979.
+# Mathew Englander (1996-10-07) gives the following refs:
+# * 1967. Paragraph 28(34)(g) of the Interpretation Act, S.C. 1967-68,
+# c. 7 defines Yukon standard time as UTC-9. This is still valid;
+# see Interpretation Act, R.S.C. 1985, c. I-21, s. 35(1).
+# * C.O. 1973/214 switched Yukon to PST on 1973-10-28 00:00.
+# * O.I.C. 1980/02 established DST.
+# * O.I.C. 1987/056 changed DST to Apr firstSun 2:00 to Oct lastSun 2:00.
+# Shanks & Pottenger say Yukon's 1973-10-28 switch was at 2:00; go
+# with Englander.
+# From Chris Walton (2006-06-26):
+# Here is a link to the old daylight saving portion of the interpretation
+# act which was last updated in 1987:
+# http://www.gov.yk.ca/legislation/regs/oic1987_056.pdf
+
+# From Rives McDow (1999-09-04):
+# Nunavut ... moved ... to incorporate the whole territory into one time zone.
+# <a href="http://www.nunatsiaq.com/nunavut/nvt90903_13.html">
+# Nunavut moves to single time zone Oct. 31
+# </a>
+#
+# From Antoine Leca (1999-09-06):
+# We then need to create a new timezone for the Kitikmeot region of Nunavut
+# to differentiate it from the Yellowknife region.
+
+# From Paul Eggert (1999-09-20):
+# <a href="http://www.nunavut.com/basicfacts/english/basicfacts_1territory.html">
+# Basic Facts: The New Territory
+# </a> (1999) reports that Pangnirtung operates on eastern time,
+# and that Coral Harbour does not observe DST. We don't know when
+# Pangnirtung switched to eastern time; we'll guess 1995.
+
+# From Rives McDow (1999-11-08):
+# On October 31, when the rest of Nunavut went to Central time,
+# Pangnirtung wobbled. Here is the result of their wobble:
+#
+# The following businesses and organizations in Pangnirtung use Central Time:
+#
+# First Air, Power Corp, Nunavut Construction, Health Center, RCMP,
+# Eastern Arctic National Parks, A & D Specialist
+#
+# The following businesses and organizations in Pangnirtung use Eastern Time:
+#
+# Hamlet office, All other businesses, Both schools, Airport operator
+#
+# This has made for an interesting situation there, which warranted the news.
+# No one there that I spoke with seems concerned, or has plans to
+# change the local methods of keeping time, as it evidently does not
+# really interfere with any activities or make things difficult locally.
+# They plan to celebrate New Year's turn-over twice, one hour apart,
+# so it appears that the situation will last at least that long.
+# The Nunavut Intergovernmental Affairs hopes that they will "come to
+# their senses", but the locals evidently don't see any problem with
+# the current state of affairs.
+
+# From Michaela Rodrigue, writing in the
+# <a href="http://www.nunatsiaq.com/archives/nunavut991130/nvt91119_17.html">
+# Nunatsiaq News (1999-11-19)</a>:
+# Clyde River, Pangnirtung and Sanikiluaq now operate with two time zones,
+# central - or Nunavut time - for government offices, and eastern time
+# for municipal offices and schools.... Igloolik [was similar but then]
+# made the switch to central time on Saturday, Nov. 6.
+
+# From Paul Eggert (2000-10-02):
+# Matthews and Vincent (1998) say the following, but we lack histories
+# for these potential new Zones.
+#
+# The Canadian Forces station at Alert uses Eastern Time while the
+# handful of residents at the Eureka weather station [in the Central
+# zone] skip daylight savings. Baffin Island, which is crossed by the
+# Central, Eastern and Atlantic Time zones only uses Eastern Time.
+# Gjoa Haven, Taloyoak and Pelly Bay all use Mountain instead of
+# Central Time and Southampton Island [in the Central zone] is not
+# required to use daylight savings.
+
+# From
+# <a href="http://www.nunatsiaq.com/archives/nunavut001130/nvt21110_02.html">
+# Nunavut now has two time zones
+# </a> (2000-11-10):
+# The Nunavut government would allow its employees in Kugluktuk and
+# Cambridge Bay to operate on central time year-round, putting them
+# one hour behind the rest of Nunavut for six months during the winter.
+# At the end of October the two communities had rebelled against
+# Nunavut's unified time zone, refusing to shift to eastern time with
+# the rest of the territory for the winter. Cambridge Bay remained on
+# central time, while Kugluktuk, even farther west, reverted to
+# mountain time, which they had used before the advent of Nunavut's
+# unified time zone in 1999.
+#
+# From Rives McDow (2001-01-20), quoting the Nunavut government:
+# The preceding decision came into effect at midnight, Saturday Nov 4, 2000.
+
+# From Paul Eggert (2000-12-04):
+# Let's just keep track of the official times for now.
+
+# From Rives McDow (2001-03-07):
+# The premier of Nunavut has issued a ministerial statement advising
+# that effective 2001-04-01, the territory of Nunavut will revert
+# back to three time zones (mountain, central, and eastern). Of the
+# cities in Nunavut, Coral Harbor is the only one that I know of that
+# has said it will not observe dst, staying on EST year round. I'm
+# checking for more info, and will get back to you if I come up with
+# more.
+# [Also see <http://www.nunatsiaq.com/nunavut/nvt10309_06.html> (2001-03-09).]
+
+# From Gwillim Law (2005-05-21):
+# According to maps at
+# http://inms-ienm.nrc-cnrc.gc.ca/images/time_services/TZ01SWE.jpg
+# http://inms-ienm.nrc-cnrc.gc.ca/images/time_services/TZ01SSE.jpg
+# (both dated 2003), and
+# http://www.canadiangeographic.ca/Magazine/SO98/geomap.asp
+# (from a 1998 Canadian Geographic article), the de facto and de jure time
+# for Southampton Island (at the north end of Hudson Bay) is UTC-5 all year
+# round. Using Google, it's easy to find other websites that confirm this.
+# I wasn't able to find how far back this time regimen goes, but since it
+# predates the creation of Nunavut, it probably goes back many years....
+# The Inuktitut name of Coral Harbour is Sallit, but it's rarely used.
+#
+# From Paul Eggert (2005-07-26):
+# For lack of better information, assume that Southampton Island observed
+# daylight saving only during wartime.
+
+# From Chris Walton (2007-03-01):
+# ... the community of Resolute (located on Cornwallis Island in
+# Nunavut) moved from Central Time to Eastern Time last November.
+# Basically the community did not change its clocks at the end of
+# daylight saving....
+# http://www.nnsl.com/frames/newspapers/2006-11/nov13_06none.html
+
+# From Chris Walton (2007-03-14):
+# Today I phoned the "hamlet office" to find out what Resolute was doing with
+# its clocks.
+#
+# The individual that answered the phone confirmed that the clocks did not
+# move at the end of daylight saving on October 29/2006. He also told me that
+# the clocks did not move this past weekend (March 11/2007)....
+#
+# America/Resolute should use the "Canada" Rule up to October 29/2006.
+# After that it should be fixed on Eastern Standard Time until further notice.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule NT_YK 1918 only - Apr 14 2:00 1:00 D
+Rule NT_YK 1918 only - Oct 27 2:00 0 S
+Rule NT_YK 1919 only - May 25 2:00 1:00 D
+Rule NT_YK 1919 only - Nov 1 0:00 0 S
+Rule NT_YK 1942 only - Feb 9 2:00 1:00 W # War
+Rule NT_YK 1945 only - Aug 14 23:00u 1:00 P # Peace
+Rule NT_YK 1945 only - Sep 30 2:00 0 S
+Rule NT_YK 1965 only - Apr lastSun 0:00 2:00 DD
+Rule NT_YK 1965 only - Oct lastSun 2:00 0 S
+Rule NT_YK 1980 1986 - Apr lastSun 2:00 1:00 D
+Rule NT_YK 1980 2006 - Oct lastSun 2:00 0 S
+Rule NT_YK 1987 2006 - Apr Sun>=1 2:00 1:00 D
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+# aka Panniqtuuq
+Zone America/Pangnirtung 0 - zzz 1921 # trading post est.
+ -4:00 NT_YK A%sT 1995 Apr Sun>=1 2:00
+ -5:00 Canada E%sT 1999 Oct 31 2:00
+ -6:00 Canada C%sT 2000 Oct 29 2:00
+ -5:00 Canada E%sT
+# formerly Frobisher Bay
+Zone America/Iqaluit 0 - zzz 1942 Aug # Frobisher Bay est.
+ -5:00 NT_YK E%sT 1999 Oct 31 2:00
+ -6:00 Canada C%sT 2000 Oct 29 2:00
+ -5:00 Canada E%sT
+# aka Qausuittuq
+Zone America/Resolute 0 - zzz 1947 Aug 31 # Resolute founded
+ -6:00 NT_YK C%sT 2000 Oct 29 2:00
+ -5:00 - EST 2001 Apr 1 3:00
+ -6:00 Canada C%sT 2006 Oct 29 2:00
+ -5:00 - EST
+# aka Kangiqiniq
+Zone America/Rankin_Inlet 0 - zzz 1957 # Rankin Inlet founded
+ -6:00 NT_YK C%sT 2000 Oct 29 2:00
+ -5:00 - EST 2001 Apr 1 3:00
+ -6:00 Canada C%sT
+# aka Iqaluktuuttiaq
+Zone America/Cambridge_Bay 0 - zzz 1920 # trading post est.?
+ -7:00 NT_YK M%sT 1999 Oct 31 2:00
+ -6:00 Canada C%sT 2000 Oct 29 2:00
+ -5:00 - EST 2000 Nov 5 0:00
+ -6:00 - CST 2001 Apr 1 3:00
+ -7:00 Canada M%sT
+Zone America/Yellowknife 0 - zzz 1935 # Yellowknife founded?
+ -7:00 NT_YK M%sT 1980
+ -7:00 Canada M%sT
+Zone America/Inuvik 0 - zzz 1953 # Inuvik founded
+ -8:00 NT_YK P%sT 1979 Apr lastSun 2:00
+ -7:00 NT_YK M%sT 1980
+ -7:00 Canada M%sT
+Zone America/Whitehorse -9:00:12 - LMT 1900 Aug 20
+ -9:00 NT_YK Y%sT 1966 Jul 1 2:00
+ -8:00 NT_YK P%sT 1980
+ -8:00 Canada P%sT
+Zone America/Dawson -9:17:40 - LMT 1900 Aug 20
+ -9:00 NT_YK Y%sT 1973 Oct 28 0:00
+ -8:00 NT_YK P%sT 1980
+ -8:00 Canada P%sT
+
+
+###############################################################################
+
+# Mexico
+
+# From Paul Eggert (2001-03-05):
+# The Investigation and Analysis Service of the
+# Mexican Library of Congress (MLoC) has published a
+# <a href="http://www.cddhcu.gob.mx/bibliot/publica/inveyana/polisoc/horver/">
+# history of Mexican local time (in Spanish)
+# </a>.
+#
+# Here are the discrepancies between Shanks & Pottenger (S&P) and the MLoC.
+# (In all cases we go with the MLoC.)
+# S&P report that Baja was at -8:00 in 1922/1923.
+# S&P say the 1930 transition in Baja was 1930-11-16.
+# S&P report no DST during summer 1931.
+# S&P report a transition at 1932-03-30 23:00, not 1932-04-01.
+
+# From Gwillim Law (2001-02-20):
+# There are some other discrepancies between the Decrees page and the
+# tz database. I think they can best be explained by supposing that
+# the researchers who prepared the Decrees page failed to find some of
+# the relevant documents.
+
+# From Alan Perry (1996-02-15):
+# A guy from our Mexico subsidiary finally found the Presidential Decree
+# outlining the timezone changes in Mexico.
+#
+# ------------- Begin Forwarded Message -------------
+#
+# I finally got my hands on the Official Presidential Decree that sets up the
+# rules for the DST changes. The rules are:
+#
+# 1. The country is divided in 3 timezones:
+# - Baja California Norte (the Mexico/BajaNorte TZ)
+# - Baja California Sur, Nayarit, Sinaloa and Sonora (the Mexico/BajaSur TZ)
+# - The rest of the country (the Mexico/General TZ)
+#
+# 2. From the first Sunday in April at 2:00 AM to the last Sunday in October
+# at 2:00 AM, the times in each zone are as follows:
+# BajaNorte: GMT+7
+# BajaSur: GMT+6
+# General: GMT+5
+#
+# 3. The rest of the year, the times are as follows:
+# BajaNorte: GMT+8
+# BajaSur: GMT+7
+# General: GMT+6
+#
+# The Decree was published in Mexico's Official Newspaper on January 4th.
+#
+# -------------- End Forwarded Message --------------
+# From Paul Eggert (1996-06-12):
+# For an English translation of the decree, see
+# <a href="http://mexico-travel.com/extra/timezone_eng.html">
+# ``Diario Oficial: Time Zone Changeover'' (1996-01-04).
+# </a>
+
+# From Rives McDow (1998-10-08):
+# The State of Quintana Roo has reverted back to central STD and DST times
+# (i.e. UTC -0600 and -0500 as of 1998-08-02).
+
+# From Rives McDow (2000-01-10):
+# Effective April 4, 1999 at 2:00 AM local time, Sonora changed to the time
+# zone 5 hours from the International Date Line, and will not observe daylight
+# savings time so as to stay on the same time zone as the southern part of
+# Arizona year round.
+
+# From Jesper Norgaard, translating
+# <http://www.reforma.com/nacional/articulo/064327/> (2001-01-17):
+# In Oaxaca, the 55.000 teachers from the Section 22 of the National
+# Syndicate of Education Workers, refuse to apply daylight saving each
+# year, so that the more than 10,000 schools work at normal hour the
+# whole year.
+
+# From Gwillim Law (2001-01-19):
+# <http://www.reforma.com/negocios_y_dinero/articulo/064481/> ... says
+# (translated):...
+# January 17, 2000 - The Energy Secretary, Ernesto Martens, announced
+# that Summer Time will be reduced from seven to five months, starting
+# this year....
+# <http://www.publico.com.mx/scripts/texto3.asp?action=pagina&pag=21&pos=p&secc=naci&date=01/17/2001>
+# [translated], says "summer time will ... take effect on the first Sunday
+# in May, and end on the last Sunday of September.
+
+# From Arthur David Olson (2001-01-25):
+# The 2001-01-24 traditional Washington Post contained the page one
+# story "Timely Issue Divides Mexicans."...
+# http://www.washingtonpost.com/wp-dyn/articles/A37383-2001Jan23.html
+# ... Mexico City Mayor Lopez Obrador "...is threatening to keep
+# Mexico City and its 20 million residents on a different time than
+# the rest of the country..." In particular, Lopez Obrador would abolish
+# observation of Daylight Saving Time.
+
+# <a href="http://www.conae.gob.mx/ahorro/decretohorver2001.html#decre">
+# Official statute published by the Energy Department
+# </a> (2001-02-01) shows Baja and Chihauhua as still using US DST rules,
+# and Sonora with no DST. This was reported by Jesper Norgaard (2001-02-03).
+
+# From Paul Eggert (2001-03-03):
+#
+# <a href="http://www.latimes.com/news/nation/20010303/t000018766.html">
+# James F. Smith writes in today's LA Times
+# </a>
+# * Sonora will continue to observe standard time.
+# * Last week Mexico City's mayor Andres Manuel Lopez Obrador decreed that
+# the Federal District will not adopt DST.
+# * 4 of 16 district leaders announced they'll ignore the decree.
+# * The decree does not affect federal-controlled facilities including
+# the airport, banks, hospitals, and schools.
+#
+# For now we'll assume that the Federal District will bow to federal rules.
+
+# From Jesper Norgaard (2001-04-01):
+# I found some references to the Mexican application of daylight
+# saving, which modifies what I had already sent you, stating earlier
+# that a number of northern Mexican states would go on daylight
+# saving. The modification reverts this to only cover Baja California
+# (Norte), while all other states (except Sonora, who has no daylight
+# saving all year) will follow the original decree of president
+# Vicente Fox, starting daylight saving May 6, 2001 and ending
+# September 30, 2001.
+# References: "Diario de Monterrey" <www.diariodemonterrey.com/index.asp>
+# Palabra <http://palabra.infosel.com/010331/primera/ppri3101.pdf> (2001-03-31)
+
+# From Reuters (2001-09-04):
+# Mexico's Supreme Court on Tuesday declared that daylight savings was
+# unconstitutional in Mexico City, creating the possibility the
+# capital will be in a different time zone from the rest of the nation
+# next year.... The Supreme Court's ruling takes effect at 2:00
+# a.m. (0800 GMT) on Sept. 30, when Mexico is scheduled to revert to
+# standard time. "This is so residents of the Federal District are not
+# subject to unexpected time changes," a statement from the court said.
+
+# From Jesper Norgaard Welen (2002-03-12):
+# ... consulting my local grocery store(!) and my coworkers, they all insisted
+# that a new decision had been made to reinstate US style DST in Mexico....
+# http://www.conae.gob.mx/ahorro/horaver2001_m1_2002.html (2002-02-20)
+# confirms this. Sonora as usual is the only state where DST is not applied.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Mexico 1939 only - Feb 5 0:00 1:00 D
+Rule Mexico 1939 only - Jun 25 0:00 0 S
+Rule Mexico 1940 only - Dec 9 0:00 1:00 D
+Rule Mexico 1941 only - Apr 1 0:00 0 S
+Rule Mexico 1943 only - Dec 16 0:00 1:00 W # War
+Rule Mexico 1944 only - May 1 0:00 0 S
+Rule Mexico 1950 only - Feb 12 0:00 1:00 D
+Rule Mexico 1950 only - Jul 30 0:00 0 S
+Rule Mexico 1996 2000 - Apr Sun>=1 2:00 1:00 D
+Rule Mexico 1996 2000 - Oct lastSun 2:00 0 S
+Rule Mexico 2001 only - May Sun>=1 2:00 1:00 D
+Rule Mexico 2001 only - Sep lastSun 2:00 0 S
+Rule Mexico 2002 max - Apr Sun>=1 2:00 1:00 D
+Rule Mexico 2002 max - Oct lastSun 2:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+# Quintana Roo
+Zone America/Cancun -5:47:04 - LMT 1922 Jan 1 0:12:56
+ -6:00 - CST 1981 Dec 23
+ -5:00 Mexico E%sT 1998 Aug 2 2:00
+ -6:00 Mexico C%sT
+# Campeche, Yucatan
+Zone America/Merida -5:58:28 - LMT 1922 Jan 1 0:01:32
+ -6:00 - CST 1981 Dec 23
+ -5:00 - EST 1982 Dec 2
+ -6:00 Mexico C%sT
+# Coahuila, Durango, Nuevo Leon, Tamaulipas
+Zone America/Monterrey -6:41:16 - LMT 1921 Dec 31 23:18:44
+ -6:00 - CST 1988
+ -6:00 US C%sT 1989
+ -6:00 Mexico C%sT
+# Central Mexico
+Zone America/Mexico_City -6:36:36 - LMT 1922 Jan 1 0:23:24
+ -7:00 - MST 1927 Jun 10 23:00
+ -6:00 - CST 1930 Nov 15
+ -7:00 - MST 1931 May 1 23:00
+ -6:00 - CST 1931 Oct
+ -7:00 - MST 1932 Apr 1
+ -6:00 Mexico C%sT 2001 Sep 30 02:00
+ -6:00 - CST 2002 Feb 20
+ -6:00 Mexico C%sT
+# Chihuahua
+Zone America/Chihuahua -7:04:20 - LMT 1921 Dec 31 23:55:40
+ -7:00 - MST 1927 Jun 10 23:00
+ -6:00 - CST 1930 Nov 15
+ -7:00 - MST 1931 May 1 23:00
+ -6:00 - CST 1931 Oct
+ -7:00 - MST 1932 Apr 1
+ -6:00 - CST 1996
+ -6:00 Mexico C%sT 1998
+ -6:00 - CST 1998 Apr Sun>=1 3:00
+ -7:00 Mexico M%sT
+# Sonora
+Zone America/Hermosillo -7:23:52 - LMT 1921 Dec 31 23:36:08
+ -7:00 - MST 1927 Jun 10 23:00
+ -6:00 - CST 1930 Nov 15
+ -7:00 - MST 1931 May 1 23:00
+ -6:00 - CST 1931 Oct
+ -7:00 - MST 1932 Apr 1
+ -6:00 - CST 1942 Apr 24
+ -7:00 - MST 1949 Jan 14
+ -8:00 - PST 1970
+ -7:00 Mexico M%sT 1999
+ -7:00 - MST
+# Baja California Sur, Nayarit, Sinaloa
+Zone America/Mazatlan -7:05:40 - LMT 1921 Dec 31 23:54:20
+ -7:00 - MST 1927 Jun 10 23:00
+ -6:00 - CST 1930 Nov 15
+ -7:00 - MST 1931 May 1 23:00
+ -6:00 - CST 1931 Oct
+ -7:00 - MST 1932 Apr 1
+ -6:00 - CST 1942 Apr 24
+ -7:00 - MST 1949 Jan 14
+ -8:00 - PST 1970
+ -7:00 Mexico M%sT
+# Baja California
+Zone America/Tijuana -7:48:04 - LMT 1922 Jan 1 0:11:56
+ -7:00 - MST 1924
+ -8:00 - PST 1927 Jun 10 23:00
+ -7:00 - MST 1930 Nov 15
+ -8:00 - PST 1931 Apr 1
+ -8:00 1:00 PDT 1931 Sep 30
+ -8:00 - PST 1942 Apr 24
+ -8:00 1:00 PWT 1945 Aug 14 23:00u
+ -8:00 1:00 PPT 1945 Nov 12 # Peace
+ -8:00 - PST 1948 Apr 5
+ -8:00 1:00 PDT 1949 Jan 14
+ -8:00 - PST 1954
+ -8:00 CA P%sT 1961
+ -8:00 - PST 1976
+ -8:00 US P%sT 1996
+ -8:00 Mexico P%sT 2001
+ -8:00 US P%sT 2002 Feb 20
+ -8:00 Mexico P%sT
+# From Paul Eggert (2006-03-22):
+# Formerly there was an America/Ensenada zone, which differed from
+# America/Tijuana only in that it did not observe DST from 1976
+# through 1995. This was as per Shanks (1999). But Shanks & Pottenger say
+# Ensenada did not observe DST from 1948 through 1975. Guy Harris reports
+# that the 1987 OAG says "Only Ensenada, Mexicale, San Felipe and
+# Tijuana observe DST," which agrees with Shanks & Pottenger but implies that
+# DST-observance was a town-by-town matter back then. This concerns
+# data after 1970 so most likely there should be at least one Zone
+# other than America/Tijuana for Baja, but it's not clear yet what its
+# name or contents should be.
+#
+# Revillagigedo Is
+# no information
+
+###############################################################################
+
+# Anguilla
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Anguilla -4:12:16 - LMT 1912 Mar 2
+ -4:00 - AST
+
+# Antigua and Barbuda
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Antigua -4:07:12 - LMT 1912 Mar 2
+ -5:00 - EST 1951
+ -4:00 - AST
+
+# Bahamas
+#
+# From Sue Williams (2006-12-07):
+# The Bahamas announced about a month ago that they plan to change their DST
+# rules to sync with the U.S. starting in 2007....
+# http://www.jonesbahamas.com/?c=45&a=10412
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Bahamas 1964 2006 - Oct lastSun 2:00 0 S
+Rule Bahamas 1964 1986 - Apr lastSun 2:00 1:00 D
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Nassau -5:09:24 - LMT 1912 Mar 2
+ -5:00 Bahamas E%sT 1976
+ -5:00 US E%sT
+
+# Barbados
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Barb 1977 only - Jun 12 2:00 1:00 D
+Rule Barb 1977 1978 - Oct Sun>=1 2:00 0 S
+Rule Barb 1978 1980 - Apr Sun>=15 2:00 1:00 D
+Rule Barb 1979 only - Sep 30 2:00 0 S
+Rule Barb 1980 only - Sep 25 2:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Barbados -3:58:28 - LMT 1924 # Bridgetown
+ -3:58:28 - BMT 1932 # Bridgetown Mean Time
+ -4:00 Barb A%sT
+
+# Belize
+# Whitman entirely disagrees with Shanks; go with Shanks & Pottenger.
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Belize 1918 1942 - Oct Sun>=2 0:00 0:30 HD
+Rule Belize 1919 1943 - Feb Sun>=9 0:00 0 S
+Rule Belize 1973 only - Dec 5 0:00 1:00 D
+Rule Belize 1974 only - Feb 9 0:00 0 S
+Rule Belize 1982 only - Dec 18 0:00 1:00 D
+Rule Belize 1983 only - Feb 12 0:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Belize -5:52:48 - LMT 1912 Apr
+ -6:00 Belize C%sT
+
+# Bermuda
+
+# From Dan Jones, reporting in The Royal Gazette (2006-06-26):
+
+# Next year, however, clocks in the US will go forward on the second Sunday
+# in March, until the first Sunday in November. And, after the Time Zone
+# (Seasonal Variation) Bill 2006 was passed in the House of Assembly on
+# Friday, the same thing will happen in Bermuda.
+# http://www.theroyalgazette.com/apps/pbcs.dll/article?AID=/20060529/NEWS/105290135
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Atlantic/Bermuda -4:19:04 - LMT 1930 Jan 1 2:00 # Hamilton
+ -4:00 - AST 1974 Apr 28 2:00
+ -4:00 Bahamas A%sT 1976
+ -4:00 US A%sT
+
+# Cayman Is
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Cayman -5:25:32 - LMT 1890 # Georgetown
+ -5:07:12 - KMT 1912 Feb # Kingston Mean Time
+ -5:00 - EST
+
+# Costa Rica
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule CR 1979 1980 - Feb lastSun 0:00 1:00 D
+Rule CR 1979 1980 - Jun Sun>=1 0:00 0 S
+Rule CR 1991 1992 - Jan Sat>=15 0:00 1:00 D
+# IATA SSIM (1991-09) says the following was at 1:00;
+# go with Shanks & Pottenger.
+Rule CR 1991 only - Jul 1 0:00 0 S
+Rule CR 1992 only - Mar 15 0:00 0 S
+# There are too many San Joses elsewhere, so we'll use `Costa Rica'.
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Costa_Rica -5:36:20 - LMT 1890 # San Jose
+ -5:36:20 - SJMT 1921 Jan 15 # San Jose Mean Time
+ -6:00 CR C%sT
+# Coco
+# no information; probably like America/Costa_Rica
+
+# Cuba
+
+# From Arthur David Olson (1999-03-29):
+# The 1999-03-28 exhibition baseball game held in Havana, Cuba, between
+# the Cuban National Team and the Baltimore Orioles was carried live on
+# the Orioles Radio Network, including affiliate WTOP in Washington, DC.
+# During the game, play-by-play announcer Jim Hunter noted that
+# "We'll be losing two hours of sleep...Cuba switched to Daylight Saving
+# Time today." (The "two hour" remark referred to losing one hour of
+# sleep on 1999-03-28--when the announcers were in Cuba as it switched
+# to DST--and one more hour on 1999-04-04--when the announcers will have
+# returned to Baltimore, which switches on that date.)
+
+# From Evert van der Veer via Steffen Thorsen (2004-10-28):
+# Cuba is not going back to standard time this year.
+# From Paul Eggert (2006-03-22):
+# http://www.granma.cu/ingles/2004/septiembre/juev30/41medid-i.html
+# says that it's due to a problem at the Antonio Guiteras
+# thermoelectric plant, and says "This October there will be no return
+# to normal hours (after daylight saving time)".
+# For now, let's assume that it's a temporary measure.
+
+# From Carlos A. Carnero Delgado (2005-11-12):
+# This year (just like in 2004-2005) there's no change in time zone
+# adjustment in Cuba. We will stay in daylight saving time:
+# http://www.granma.cu/espanol/2005/noviembre/mier9/horario.html
+
+# From Jesper Norgaard Welen (2006-10-21):
+# An article in GRANMA INTERNACIONAL claims that Cuba will end
+# the 3 years of permanent DST next weekend, see
+# http://www.granma.cu/ingles/2006/octubre/lun16/43horario.html
+# "On Saturday night, October 28 going into Sunday, October 29, at 01:00,
+# watches should be set back one hour -- going back to 00:00 hours -- returning
+# to the normal schedule....
+
+# From Paul Eggert (2007-03-02):
+# http://www.granma.cubaweb.cu/english/news/art89.html, dated yesterday,
+# says Cuban clocks will advance at midnight on March 10.
+# For lack of better information, assume Cuba will use US rules,
+# except that it switches at midnight standard time as usual.
+#
+# From Steffen Thorsen (2007-10-25):
+# Carlos Alberto Fonseca Arauz informed me that Cuba will end DST one week
+# earlier - on the last Sunday of October, just like in 2006.
+#
+# He supplied these references:
+#
+# http://www.prensalatina.com.mx/article.asp?ID=%7B4CC32C1B-A9F7-42FB-8A07-8631AFC923AF%7D&language=ES
+# http://actualidad.terra.es/sociedad/articulo/cuba_llama_ahorrar_energia_cambio_1957044.htm
+#
+# From Alex Kryvenishev (2007-10-25):
+# Here is also article from Granma (Cuba):
+#
+# [Regira] el Horario Normal desde el [proximo] domingo 28 de octubre
+# http://www.granma.cubaweb.cu/2007/10/24/nacional/artic07.html
+#
+# http://www.worldtimezone.com/dst_news/dst_news_cuba03.html
+
+# From Arthur David Olson (2008-03-09):
+# I'm in Maryland which is now observing United States Eastern Daylight
+# Time. At 9:44 local time I used RealPlayer to listen to
+# <a href="http://media.enet.cu/radioreloj">
+# http://media.enet.cu/radioreloj
+# </a>, a Cuban information station, and heard
+# the time announced as "ocho cuarenta y cuatro" ("eight forty-four"),
+# indicating that Cuba is still on standard time.
+
+# From Steffen Thorsen (2008-03-12):
+# It seems that Cuba will start DST on Sunday, 2007-03-16...
+# It was announced yesterday, according to this source (in Spanish):
+# <a href="http://www.nnc.cubaweb.cu/marzo-2008/cien-1-11-3-08.htm">
+# http://www.nnc.cubaweb.cu/marzo-2008/cien-1-11-3-08.htm
+# </a>
+#
+# Some more background information is posted here:
+# <a href="http://www.timeanddate.com/news/time/cuba-starts-dst-march-16.html">
+# http://www.timeanddate.com/news/time/cuba-starts-dst-march-16.html
+# </a>
+#
+# The article also says that Cuba has been observing DST since 1963,
+# while Shanks (and tzdata) has 1965 as the first date (except in the
+# 1940's). Many other web pages in Cuba also claim that it has been
+# observed since 1963, but with the exception of 1970 - an exception
+# which is not present in tzdata/Shanks. So there is a chance we need to
+# change some historic records as well.
+#
+# One example:
+# <a href="http://www.radiohc.cu/espanol/noticias/mar07/11mar/hor.htm">
+# http://www.radiohc.cu/espanol/noticias/mar07/11mar/hor.htm
+# </a>
+
+# From Jesper Norgaard Welen (2008-03-13):
+# The Cuban time change has just been confirmed on the most authoritative
+# web site, the Granma. Please check out
+# <a href="http://www.granma.cubaweb.cu/2008/03/13/nacional/artic10.html">
+# http://www.granma.cubaweb.cu/2008/03/13/nacional/artic10.html
+# </a>
+#
+# Basically as expected after Steffen Thorsens information, the change
+# will take place midnight between Saturday and Sunday.
+
+# From Arthur David Olson (2008-03-12):
+# Assume Sun>=15 (third Sunday) going forward.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Cuba 1928 only - Jun 10 0:00 1:00 D
+Rule Cuba 1928 only - Oct 10 0:00 0 S
+Rule Cuba 1940 1942 - Jun Sun>=1 0:00 1:00 D
+Rule Cuba 1940 1942 - Sep Sun>=1 0:00 0 S
+Rule Cuba 1945 1946 - Jun Sun>=1 0:00 1:00 D
+Rule Cuba 1945 1946 - Sep Sun>=1 0:00 0 S
+Rule Cuba 1965 only - Jun 1 0:00 1:00 D
+Rule Cuba 1965 only - Sep 30 0:00 0 S
+Rule Cuba 1966 only - May 29 0:00 1:00 D
+Rule Cuba 1966 only - Oct 2 0:00 0 S
+Rule Cuba 1967 only - Apr 8 0:00 1:00 D
+Rule Cuba 1967 1968 - Sep Sun>=8 0:00 0 S
+Rule Cuba 1968 only - Apr 14 0:00 1:00 D
+Rule Cuba 1969 1977 - Apr lastSun 0:00 1:00 D
+Rule Cuba 1969 1971 - Oct lastSun 0:00 0 S
+Rule Cuba 1972 1974 - Oct 8 0:00 0 S
+Rule Cuba 1975 1977 - Oct lastSun 0:00 0 S
+Rule Cuba 1978 only - May 7 0:00 1:00 D
+Rule Cuba 1978 1990 - Oct Sun>=8 0:00 0 S
+Rule Cuba 1979 1980 - Mar Sun>=15 0:00 1:00 D
+Rule Cuba 1981 1985 - May Sun>=5 0:00 1:00 D
+Rule Cuba 1986 1989 - Mar Sun>=14 0:00 1:00 D
+Rule Cuba 1990 1997 - Apr Sun>=1 0:00 1:00 D
+Rule Cuba 1991 1995 - Oct Sun>=8 0:00s 0 S
+Rule Cuba 1996 only - Oct 6 0:00s 0 S
+Rule Cuba 1997 only - Oct 12 0:00s 0 S
+Rule Cuba 1998 1999 - Mar lastSun 0:00s 1:00 D
+Rule Cuba 1998 2003 - Oct lastSun 0:00s 0 S
+Rule Cuba 2000 2006 - Apr Sun>=1 0:00s 1:00 D
+Rule Cuba 2006 max - Oct lastSun 0:00s 0 S
+Rule Cuba 2007 only - Mar Sun>=8 0:00s 1:00 D
+Rule Cuba 2008 max - Mar Sun>=15 0:00s 1:00 D
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Havana -5:29:28 - LMT 1890
+ -5:29:36 - HMT 1925 Jul 19 12:00 # Havana MT
+ -5:00 Cuba C%sT
+
+# Dominica
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Dominica -4:05:36 - LMT 1911 Jul 1 0:01 # Roseau
+ -4:00 - AST
+
+# Dominican Republic
+
+# From Steffen Thorsen (2000-10-30):
+# Enrique Morales reported to me that the Dominican Republic has changed the
+# time zone to Eastern Standard Time as of Sunday 29 at 2 am....
+# http://www.listin.com.do/antes/261000/republica/princi.html
+
+# From Paul Eggert (2000-12-04):
+# That URL (2000-10-26, in Spanish) says they planned to use US-style DST.
+
+# From Rives McDow (2000-12-01):
+# Dominican Republic changed its mind and presidential decree on Tuesday,
+# November 28, 2000, with a new decree. On Sunday, December 3 at 1:00 AM the
+# Dominican Republic will be reverting to 8 hours from the International Date
+# Line, and will not be using DST in the foreseeable future. The reason they
+# decided to use DST was to be in synch with Puerto Rico, who was also going
+# to implement DST. When Puerto Rico didn't implement DST, the president
+# decided to revert.
+
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule DR 1966 only - Oct 30 0:00 1:00 D
+Rule DR 1967 only - Feb 28 0:00 0 S
+Rule DR 1969 1973 - Oct lastSun 0:00 0:30 HD
+Rule DR 1970 only - Feb 21 0:00 0 S
+Rule DR 1971 only - Jan 20 0:00 0 S
+Rule DR 1972 1974 - Jan 21 0:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Santo_Domingo -4:39:36 - LMT 1890
+ -4:40 - SDMT 1933 Apr 1 12:00 # S. Dom. MT
+ -5:00 DR E%sT 1974 Oct 27
+ -4:00 - AST 2000 Oct 29 02:00
+ -5:00 US E%sT 2000 Dec 3 01:00
+ -4:00 - AST
+
+# El Salvador
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Salv 1987 1988 - May Sun>=1 0:00 1:00 D
+Rule Salv 1987 1988 - Sep lastSun 0:00 0 S
+# There are too many San Salvadors elsewhere, so use America/El_Salvador
+# instead of America/San_Salvador.
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/El_Salvador -5:56:48 - LMT 1921 # San Salvador
+ -6:00 Salv C%sT
+
+# Grenada
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Grenada -4:07:00 - LMT 1911 Jul # St George's
+ -4:00 - AST
+
+# Guadeloupe
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Guadeloupe -4:06:08 - LMT 1911 Jun 8 # Pointe a Pitre
+ -4:00 - AST
+# St Barthelemy
+Link America/Guadeloupe America/St_Barthelemy
+# St Martin (French part)
+Link America/Guadeloupe America/Marigot
+
+# Guatemala
+#
+# From Gwillim Law (2006-04-22), after a heads-up from Oscar van Vlijmen:
+# Diario Co Latino, at
+# http://www.diariocolatino.com/internacionales/detalles.asp?NewsID=8079,
+# says in an article dated 2006-04-19 that the Guatemalan government had
+# decided on that date to advance official time by 60 minutes, to lessen the
+# impact of the elevated cost of oil.... Daylight saving time will last from
+# 2006-04-29 24:00 (Guatemalan standard time) to 2006-09-30 (time unspecified).
+# From Paul Eggert (2006-06-22):
+# The Ministry of Energy and Mines, press release CP-15/2006
+# (2006-04-19), says DST ends at 24:00. See
+# <http://www.sieca.org.gt/Sitio_publico/Energeticos/Doc/Medidas/Cambio_Horario_Nac_190406.pdf>.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Guat 1973 only - Nov 25 0:00 1:00 D
+Rule Guat 1974 only - Feb 24 0:00 0 S
+Rule Guat 1983 only - May 21 0:00 1:00 D
+Rule Guat 1983 only - Sep 22 0:00 0 S
+Rule Guat 1991 only - Mar 23 0:00 1:00 D
+Rule Guat 1991 only - Sep 7 0:00 0 S
+Rule Guat 2006 only - Apr 30 0:00 1:00 D
+Rule Guat 2006 only - Oct 1 0:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Guatemala -6:02:04 - LMT 1918 Oct 5
+ -6:00 Guat C%sT
+
+# Haiti
+# From Gwillim Law (2005-04-15):
+# Risto O. Nykanen wrote me that Haiti is now on DST.
+# I searched for confirmation, and I found a
+# <a href="http://www.haitianconsulate.org/time.doc"> press release
+# on the Web page of the Haitian Consulate in Chicago (2005-03-31),
+# </a>. Translated from French, it says:
+#
+# "The Prime Minister's Communication Office notifies the public in general
+# and the press in particular that, following a decision of the Interior
+# Ministry and the Territorial Collectivities [I suppose that means the
+# provinces], Haiti will move to Eastern Daylight Time in the night from next
+# Saturday the 2nd to Sunday the 3rd.
+#
+# "Consequently, the Prime Minister's Communication Office wishes to inform
+# the population that the country's clocks will be set forward one hour
+# starting at midnight. This provision will hold until the last Saturday in
+# October 2005.
+#
+# "Port-au-Prince, March 31, 2005"
+#
+# From Steffen Thorsen (2006-04-04):
+# I have been informed by users that Haiti observes DST this year like
+# last year, so the current "only" rule for 2005 might be changed to a
+# "max" rule or to last until 2006. (Who knows if they will observe DST
+# next year or if they will extend their DST like US/Canada next year).
+#
+# I have found this article about it (in French):
+# http://www.haitipressnetwork.com/news.cfm?articleID=7612
+#
+# The reason seems to be an energy crisis.
+
+# From Stephen Colebourne (2007-02-22):
+# Some IATA info: Haiti won't be having DST in 2007.
+
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Haiti 1983 only - May 8 0:00 1:00 D
+Rule Haiti 1984 1987 - Apr lastSun 0:00 1:00 D
+Rule Haiti 1983 1987 - Oct lastSun 0:00 0 S
+# Shanks & Pottenger say AT is 2:00, but IATA SSIM (1991/1997) says 1:00s.
+# Go with IATA.
+Rule Haiti 1988 1997 - Apr Sun>=1 1:00s 1:00 D
+Rule Haiti 1988 1997 - Oct lastSun 1:00s 0 S
+Rule Haiti 2005 2006 - Apr Sun>=1 0:00 1:00 D
+Rule Haiti 2005 2006 - Oct lastSun 0:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Port-au-Prince -4:49:20 - LMT 1890
+ -4:49 - PPMT 1917 Jan 24 12:00 # P-a-P MT
+ -5:00 Haiti E%sT
+
+# Honduras
+# Shanks & Pottenger say 1921 Jan 1; go with Whitman's more precise Apr 1.
+
+# From Paul Eggert (2006-05-05):
+# worldtimezone.com reports a 2006-05-02 Spanish-language AP article
+# saying Honduras will start using DST midnight Saturday, effective 4
+# months until September. La Tribuna reported today
+# <http://www.latribuna.hn/99299.html> that Manuel Zelaya, the president
+# of Honduras, refused to back down on this.
+
+# From Jesper Norgaard Welen (2006-08-08):
+# It seems that Honduras has returned from DST to standard time this Monday at
+# 00:00 hours (prolonging Sunday to 25 hours duration).
+# http://www.worldtimezone.com/dst_news/dst_news_honduras04.html
+
+# From Paul Eggert (2006-08-08):
+# Also see Diario El Heraldo, The country returns to standard time (2006-08-08)
+# <http://www.elheraldo.hn/nota.php?nid=54941&sec=12>.
+# It mentions executive decree 18-2006.
+
+# From Steffen Thorsen (2006-08-17):
+# Honduras will observe DST from 2007 to 2009, exact dates are not
+# published, I have located this authoritative source:
+# http://www.presidencia.gob.hn/noticia.aspx?nId=47
+
+# From Steffen Thorsen (2007-03-30):
+# http://www.laprensahn.com/pais_nota.php?id04962=7386
+# So it seems that Honduras will not enter DST this year....
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Hond 1987 1988 - May Sun>=1 0:00 1:00 D
+Rule Hond 1987 1988 - Sep lastSun 0:00 0 S
+Rule Hond 2006 only - May Sun>=1 0:00 1:00 D
+Rule Hond 2006 only - Aug Mon>=1 0:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Tegucigalpa -5:48:52 - LMT 1921 Apr
+ -6:00 Hond C%sT
+#
+# Great Swan I ceded by US to Honduras in 1972
+
+# Jamaica
+
+# From Bob Devine (1988-01-28):
+# Follows US rules.
+
+# From U. S. Naval Observatory (1989-01-19):
+# JAMAICA 5 H BEHIND UTC
+
+# From Shanks & Pottenger:
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Jamaica -5:07:12 - LMT 1890 # Kingston
+ -5:07:12 - KMT 1912 Feb # Kingston Mean Time
+ -5:00 - EST 1974 Apr 28 2:00
+ -5:00 US E%sT 1984
+ -5:00 - EST
+
+# Martinique
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Martinique -4:04:20 - LMT 1890 # Fort-de-France
+ -4:04:20 - FFMT 1911 May # Fort-de-France MT
+ -4:00 - AST 1980 Apr 6
+ -4:00 1:00 ADT 1980 Sep 28
+ -4:00 - AST
+
+# Montserrat
+# From Paul Eggert (2006-03-22):
+# In 1995 volcanic eruptions forced evacuation of Plymouth, the capital.
+# world.gazetteer.com says Cork Hill is the most populous location now.
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Montserrat -4:08:52 - LMT 1911 Jul 1 0:01 # Cork Hill
+ -4:00 - AST
+
+# Nicaragua
+#
+# This uses Shanks & Pottenger for times before 2005.
+#
+# From Steffen Thorsen (2005-04-12):
+# I've got reports from 8 different people that Nicaragua just started
+# DST on Sunday 2005-04-10, in order to save energy because of
+# expensive petroleum. The exact end date for DST is not yet
+# announced, only "September" but some sites also say "mid-September".
+# Some background information is available on the President's official site:
+# http://www.presidencia.gob.ni/Presidencia/Files_index/Secretaria/Notas%20de%20Prensa/Presidente/2005/ABRIL/Gobierno-de-nicaragua-adelanta-hora-oficial-06abril.htm
+# The Decree, no 23-2005 is available here:
+# http://www.presidencia.gob.ni/buscador_gaceta/BD/DECRETOS/2005/Decreto%2023-2005%20Se%20adelanta%20en%20una%20hora%20en%20todo%20el%20territorio%20nacional%20apartir%20de%20las%2024horas%20del%2009%20de%20Abril.pdf
+#
+# From Paul Eggert (2005-05-01):
+# The decree doesn't say anything about daylight saving, but for now let's
+# assume that it is daylight saving....
+#
+# From Gwillim Law (2005-04-21):
+# The Associated Press story on the time change, which can be found at
+# http://www.lapalmainteractivo.com/guias/content/gen/ap/America_Latina/AMC_GEN_NICARAGUA_HORA.html
+# and elsewhere, says (fifth paragraph, translated from Spanish): "The last
+# time that a change of clocks was applied to save energy was in the year 2000
+# during the Arnoldo Aleman administration."...
+# The northamerica file says that Nicaragua has been on UTC-6 continuously
+# since December 1998. I wasn't able to find any details of Nicaraguan time
+# changes in 2000. Perhaps a note could be added to the northamerica file, to
+# the effect that we have indirect evidence that DST was observed in 2000.
+#
+# From Jesper Norgaard Welen (2005-11-02):
+# Nicaragua left DST the 2005-10-02 at 00:00 (local time).
+# http://www.presidencia.gob.ni/presidencia/files_index/secretaria/comunicados/2005/septiembre/26septiembre-cambio-hora.htm
+# (2005-09-26)
+#
+# From Jesper Norgaard Welen (2006-05-05):
+# http://www.elnuevodiario.com.ni/2006/05/01/nacionales/18410
+# (my informal translation)
+# By order of the president of the republic, Enrique Bolanos, Nicaragua
+# advanced by sixty minutes their official time, yesterday at 2 in the
+# morning, and will stay that way until 30.th. of september.
+#
+# From Jesper Norgaard Welen (2006-09-30):
+# http://www.presidencia.gob.ni/buscador_gaceta/BD/DECRETOS/2006/D-063-2006P-PRN-Cambio-Hora.pdf
+# My informal translation runs:
+# The natural sun time is restored in all the national territory, in that the
+# time is returned one hour at 01:00 am of October 1 of 2006.
+#
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Nic 1979 1980 - Mar Sun>=16 0:00 1:00 D
+Rule Nic 1979 1980 - Jun Mon>=23 0:00 0 S
+Rule Nic 2005 only - Apr 10 0:00 1:00 D
+Rule Nic 2005 only - Oct Sun>=1 0:00 0 S
+Rule Nic 2006 only - Apr 30 2:00 1:00 D
+Rule Nic 2006 only - Oct Sun>=1 1:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Managua -5:45:08 - LMT 1890
+ -5:45:12 - MMT 1934 Jun 23 # Managua Mean Time?
+ -6:00 - CST 1973 May
+ -5:00 - EST 1975 Feb 16
+ -6:00 Nic C%sT 1992 Jan 1 4:00
+ -5:00 - EST 1992 Sep 24
+ -6:00 - CST 1993
+ -5:00 - EST 1997
+ -6:00 Nic C%sT
+
+# Panama
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Panama -5:18:08 - LMT 1890
+ -5:19:36 - CMT 1908 Apr 22 # Colon Mean Time
+ -5:00 - EST
+
+# Puerto Rico
+# There are too many San Juans elsewhere, so we'll use `Puerto_Rico'.
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Puerto_Rico -4:24:25 - LMT 1899 Mar 28 12:00 # San Juan
+ -4:00 - AST 1942 May 3
+ -4:00 US A%sT 1946
+ -4:00 - AST
+
+# St Kitts-Nevis
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/St_Kitts -4:10:52 - LMT 1912 Mar 2 # Basseterre
+ -4:00 - AST
+
+# St Lucia
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/St_Lucia -4:04:00 - LMT 1890 # Castries
+ -4:04:00 - CMT 1912 # Castries Mean Time
+ -4:00 - AST
+
+# St Pierre and Miquelon
+# There are too many St Pierres elsewhere, so we'll use `Miquelon'.
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Miquelon -3:44:40 - LMT 1911 May 15 # St Pierre
+ -4:00 - AST 1980 May
+ -3:00 - PMST 1987 # Pierre & Miquelon Time
+ -3:00 Canada PM%sT
+
+# St Vincent and the Grenadines
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/St_Vincent -4:04:56 - LMT 1890 # Kingstown
+ -4:04:56 - KMT 1912 # Kingstown Mean Time
+ -4:00 - AST
+
+# Turks and Caicos
+#
+# From Chris Dunn in
+# <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=415007>
+# (2007-03-15): In the Turks & Caicos Islands (America/Grand_Turk) the
+# daylight saving dates for time changes have been adjusted to match
+# the recent U.S. change of dates.
+#
+# From Brian Inglis (2007-04-28):
+# http://www.turksandcaicos.tc/calendar/index.htm [2007-04-26]
+# there is an entry for Nov 4 "Daylight Savings Time Ends 2007" and three
+# rows before that there is an out of date entry for Oct:
+# "Eastern Standard Times Begins 2007
+# Clocks are set back one hour at 2:00 a.m. local Daylight Saving Time"
+# indicating that the normal ET rules are followed.
+#
+# From Paul Eggert (2006-05-01):
+# Shanks & Pottenger say they use US DST rules, but IATA SSIM (1991/1998)
+# says they switch at midnight. Go with Shanks & Pottenger.
+#
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule TC 1979 1986 - Apr lastSun 2:00 1:00 D
+Rule TC 1979 2006 - Oct lastSun 2:00 0 S
+Rule TC 1987 2006 - Apr Sun>=1 2:00 1:00 D
+Rule TC 2007 max - Mar Sun>=8 2:00 1:00 D
+Rule TC 2007 max - Nov Sun>=1 2:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Grand_Turk -4:44:32 - LMT 1890
+ -5:07:12 - KMT 1912 Feb # Kingston Mean Time
+ -5:00 TC E%sT
+
+# British Virgin Is
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Tortola -4:18:28 - LMT 1911 Jul # Road Town
+ -4:00 - AST
+
+# Virgin Is
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/St_Thomas -4:19:44 - LMT 1911 Jul # Charlotte Amalie
+ -4:00 - AST
diff --git a/libkcal/libical/tzdata/pacificnew b/libkcal/libical/tzdata/pacificnew
new file mode 100644
index 00000000..667940bf
--- /dev/null
+++ b/libkcal/libical/tzdata/pacificnew
@@ -0,0 +1,26 @@
+# @(#)pacificnew 8.1
+
+# From Arthur David Olson (1989-04-05):
+# On 1989-04-05, the U. S. House of Representatives passed (238-154) a bill
+# establishing "Pacific Presidential Election Time"; it was not acted on
+# by the Senate or signed into law by the President.
+# You might want to change the "PE" (Presidential Election) below to
+# "Q" (Quadrennial) to maintain three-character zone abbreviations.
+# If you're really conservative, you might want to change it to "D".
+# Avoid "L" (Leap Year), which won't be true in 2100.
+
+# If Presidential Election Time is ever established, replace "XXXX" below
+# with the year the law takes effect and uncomment the "##" lines.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+## Rule Twilite XXXX max - Apr Sun>=1 2:00 1:00 D
+## Rule Twilite XXXX max uspres Oct lastSun 2:00 1:00 PE
+## Rule Twilite XXXX max uspres Nov Sun>=7 2:00 0 S
+## Rule Twilite XXXX max nonpres Oct lastSun 2:00 0 S
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+## Zone America/Los_Angeles-PET -8:00 US P%sT XXXX
+## -8:00 Twilite P%sT
+
+# For now...
+Link America/Los_Angeles US/Pacific-New ##
diff --git a/libkcal/libical/tzdata/solar87 b/libkcal/libical/tzdata/solar87
new file mode 100644
index 00000000..71839320
--- /dev/null
+++ b/libkcal/libical/tzdata/solar87
@@ -0,0 +1,388 @@
+# @(#)solar87 8.1
+
+# So much for footnotes about Saudi Arabia.
+# Apparent noon times below are for Riyadh; your mileage will vary.
+# Times were computed using formulas in the U.S. Naval Observatory's
+# Almanac for Computers 1987; the formulas "will give EqT to an accuracy of
+# [plus or minus two] seconds during the current year."
+#
+# Rounding to the nearest five seconds results in fewer than
+# 256 different "time types"--a limit that's faced because time types are
+# stored on disk as unsigned chars.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule sol87 1987 only - Jan 1 12:03:20s -0:03:20 -
+Rule sol87 1987 only - Jan 2 12:03:50s -0:03:50 -
+Rule sol87 1987 only - Jan 3 12:04:15s -0:04:15 -
+Rule sol87 1987 only - Jan 4 12:04:45s -0:04:45 -
+Rule sol87 1987 only - Jan 5 12:05:10s -0:05:10 -
+Rule sol87 1987 only - Jan 6 12:05:40s -0:05:40 -
+Rule sol87 1987 only - Jan 7 12:06:05s -0:06:05 -
+Rule sol87 1987 only - Jan 8 12:06:30s -0:06:30 -
+Rule sol87 1987 only - Jan 9 12:06:55s -0:06:55 -
+Rule sol87 1987 only - Jan 10 12:07:20s -0:07:20 -
+Rule sol87 1987 only - Jan 11 12:07:45s -0:07:45 -
+Rule sol87 1987 only - Jan 12 12:08:10s -0:08:10 -
+Rule sol87 1987 only - Jan 13 12:08:30s -0:08:30 -
+Rule sol87 1987 only - Jan 14 12:08:55s -0:08:55 -
+Rule sol87 1987 only - Jan 15 12:09:15s -0:09:15 -
+Rule sol87 1987 only - Jan 16 12:09:35s -0:09:35 -
+Rule sol87 1987 only - Jan 17 12:09:55s -0:09:55 -
+Rule sol87 1987 only - Jan 18 12:10:15s -0:10:15 -
+Rule sol87 1987 only - Jan 19 12:10:35s -0:10:35 -
+Rule sol87 1987 only - Jan 20 12:10:55s -0:10:55 -
+Rule sol87 1987 only - Jan 21 12:11:10s -0:11:10 -
+Rule sol87 1987 only - Jan 22 12:11:30s -0:11:30 -
+Rule sol87 1987 only - Jan 23 12:11:45s -0:11:45 -
+Rule sol87 1987 only - Jan 24 12:12:00s -0:12:00 -
+Rule sol87 1987 only - Jan 25 12:12:15s -0:12:15 -
+Rule sol87 1987 only - Jan 26 12:12:30s -0:12:30 -
+Rule sol87 1987 only - Jan 27 12:12:40s -0:12:40 -
+Rule sol87 1987 only - Jan 28 12:12:55s -0:12:55 -
+Rule sol87 1987 only - Jan 29 12:13:05s -0:13:05 -
+Rule sol87 1987 only - Jan 30 12:13:15s -0:13:15 -
+Rule sol87 1987 only - Jan 31 12:13:25s -0:13:25 -
+Rule sol87 1987 only - Feb 1 12:13:35s -0:13:35 -
+Rule sol87 1987 only - Feb 2 12:13:40s -0:13:40 -
+Rule sol87 1987 only - Feb 3 12:13:50s -0:13:50 -
+Rule sol87 1987 only - Feb 4 12:13:55s -0:13:55 -
+Rule sol87 1987 only - Feb 5 12:14:00s -0:14:00 -
+Rule sol87 1987 only - Feb 6 12:14:05s -0:14:05 -
+Rule sol87 1987 only - Feb 7 12:14:10s -0:14:10 -
+Rule sol87 1987 only - Feb 8 12:14:10s -0:14:10 -
+Rule sol87 1987 only - Feb 9 12:14:15s -0:14:15 -
+Rule sol87 1987 only - Feb 10 12:14:15s -0:14:15 -
+Rule sol87 1987 only - Feb 11 12:14:15s -0:14:15 -
+Rule sol87 1987 only - Feb 12 12:14:15s -0:14:15 -
+Rule sol87 1987 only - Feb 13 12:14:15s -0:14:15 -
+Rule sol87 1987 only - Feb 14 12:14:15s -0:14:15 -
+Rule sol87 1987 only - Feb 15 12:14:10s -0:14:10 -
+Rule sol87 1987 only - Feb 16 12:14:10s -0:14:10 -
+Rule sol87 1987 only - Feb 17 12:14:05s -0:14:05 -
+Rule sol87 1987 only - Feb 18 12:14:00s -0:14:00 -
+Rule sol87 1987 only - Feb 19 12:13:55s -0:13:55 -
+Rule sol87 1987 only - Feb 20 12:13:50s -0:13:50 -
+Rule sol87 1987 only - Feb 21 12:13:45s -0:13:45 -
+Rule sol87 1987 only - Feb 22 12:13:35s -0:13:35 -
+Rule sol87 1987 only - Feb 23 12:13:30s -0:13:30 -
+Rule sol87 1987 only - Feb 24 12:13:20s -0:13:20 -
+Rule sol87 1987 only - Feb 25 12:13:10s -0:13:10 -
+Rule sol87 1987 only - Feb 26 12:13:00s -0:13:00 -
+Rule sol87 1987 only - Feb 27 12:12:50s -0:12:50 -
+Rule sol87 1987 only - Feb 28 12:12:40s -0:12:40 -
+Rule sol87 1987 only - Mar 1 12:12:30s -0:12:30 -
+Rule sol87 1987 only - Mar 2 12:12:20s -0:12:20 -
+Rule sol87 1987 only - Mar 3 12:12:05s -0:12:05 -
+Rule sol87 1987 only - Mar 4 12:11:55s -0:11:55 -
+Rule sol87 1987 only - Mar 5 12:11:40s -0:11:40 -
+Rule sol87 1987 only - Mar 6 12:11:25s -0:11:25 -
+Rule sol87 1987 only - Mar 7 12:11:15s -0:11:15 -
+Rule sol87 1987 only - Mar 8 12:11:00s -0:11:00 -
+Rule sol87 1987 only - Mar 9 12:10:45s -0:10:45 -
+Rule sol87 1987 only - Mar 10 12:10:30s -0:10:30 -
+Rule sol87 1987 only - Mar 11 12:10:15s -0:10:15 -
+Rule sol87 1987 only - Mar 12 12:09:55s -0:09:55 -
+Rule sol87 1987 only - Mar 13 12:09:40s -0:09:40 -
+Rule sol87 1987 only - Mar 14 12:09:25s -0:09:25 -
+Rule sol87 1987 only - Mar 15 12:09:10s -0:09:10 -
+Rule sol87 1987 only - Mar 16 12:08:50s -0:08:50 -
+Rule sol87 1987 only - Mar 17 12:08:35s -0:08:35 -
+Rule sol87 1987 only - Mar 18 12:08:15s -0:08:15 -
+Rule sol87 1987 only - Mar 19 12:08:00s -0:08:00 -
+Rule sol87 1987 only - Mar 20 12:07:40s -0:07:40 -
+Rule sol87 1987 only - Mar 21 12:07:25s -0:07:25 -
+Rule sol87 1987 only - Mar 22 12:07:05s -0:07:05 -
+Rule sol87 1987 only - Mar 23 12:06:50s -0:06:50 -
+Rule sol87 1987 only - Mar 24 12:06:30s -0:06:30 -
+Rule sol87 1987 only - Mar 25 12:06:10s -0:06:10 -
+Rule sol87 1987 only - Mar 26 12:05:55s -0:05:55 -
+Rule sol87 1987 only - Mar 27 12:05:35s -0:05:35 -
+Rule sol87 1987 only - Mar 28 12:05:15s -0:05:15 -
+Rule sol87 1987 only - Mar 29 12:05:00s -0:05:00 -
+Rule sol87 1987 only - Mar 30 12:04:40s -0:04:40 -
+Rule sol87 1987 only - Mar 31 12:04:25s -0:04:25 -
+Rule sol87 1987 only - Apr 1 12:04:05s -0:04:05 -
+Rule sol87 1987 only - Apr 2 12:03:45s -0:03:45 -
+Rule sol87 1987 only - Apr 3 12:03:30s -0:03:30 -
+Rule sol87 1987 only - Apr 4 12:03:10s -0:03:10 -
+Rule sol87 1987 only - Apr 5 12:02:55s -0:02:55 -
+Rule sol87 1987 only - Apr 6 12:02:35s -0:02:35 -
+Rule sol87 1987 only - Apr 7 12:02:20s -0:02:20 -
+Rule sol87 1987 only - Apr 8 12:02:05s -0:02:05 -
+Rule sol87 1987 only - Apr 9 12:01:45s -0:01:45 -
+Rule sol87 1987 only - Apr 10 12:01:30s -0:01:30 -
+Rule sol87 1987 only - Apr 11 12:01:15s -0:01:15 -
+Rule sol87 1987 only - Apr 12 12:00:55s -0:00:55 -
+Rule sol87 1987 only - Apr 13 12:00:40s -0:00:40 -
+Rule sol87 1987 only - Apr 14 12:00:25s -0:00:25 -
+Rule sol87 1987 only - Apr 15 12:00:10s -0:00:10 -
+Rule sol87 1987 only - Apr 16 11:59:55s 0:00:05 -
+Rule sol87 1987 only - Apr 17 11:59:45s 0:00:15 -
+Rule sol87 1987 only - Apr 18 11:59:30s 0:00:30 -
+Rule sol87 1987 only - Apr 19 11:59:15s 0:00:45 -
+Rule sol87 1987 only - Apr 20 11:59:05s 0:00:55 -
+Rule sol87 1987 only - Apr 21 11:58:50s 0:01:10 -
+Rule sol87 1987 only - Apr 22 11:58:40s 0:01:20 -
+Rule sol87 1987 only - Apr 23 11:58:25s 0:01:35 -
+Rule sol87 1987 only - Apr 24 11:58:15s 0:01:45 -
+Rule sol87 1987 only - Apr 25 11:58:05s 0:01:55 -
+Rule sol87 1987 only - Apr 26 11:57:55s 0:02:05 -
+Rule sol87 1987 only - Apr 27 11:57:45s 0:02:15 -
+Rule sol87 1987 only - Apr 28 11:57:35s 0:02:25 -
+Rule sol87 1987 only - Apr 29 11:57:25s 0:02:35 -
+Rule sol87 1987 only - Apr 30 11:57:15s 0:02:45 -
+Rule sol87 1987 only - May 1 11:57:10s 0:02:50 -
+Rule sol87 1987 only - May 2 11:57:00s 0:03:00 -
+Rule sol87 1987 only - May 3 11:56:55s 0:03:05 -
+Rule sol87 1987 only - May 4 11:56:50s 0:03:10 -
+Rule sol87 1987 only - May 5 11:56:45s 0:03:15 -
+Rule sol87 1987 only - May 6 11:56:40s 0:03:20 -
+Rule sol87 1987 only - May 7 11:56:35s 0:03:25 -
+Rule sol87 1987 only - May 8 11:56:30s 0:03:30 -
+Rule sol87 1987 only - May 9 11:56:25s 0:03:35 -
+Rule sol87 1987 only - May 10 11:56:25s 0:03:35 -
+Rule sol87 1987 only - May 11 11:56:20s 0:03:40 -
+Rule sol87 1987 only - May 12 11:56:20s 0:03:40 -
+Rule sol87 1987 only - May 13 11:56:20s 0:03:40 -
+Rule sol87 1987 only - May 14 11:56:20s 0:03:40 -
+Rule sol87 1987 only - May 15 11:56:20s 0:03:40 -
+Rule sol87 1987 only - May 16 11:56:20s 0:03:40 -
+Rule sol87 1987 only - May 17 11:56:20s 0:03:40 -
+Rule sol87 1987 only - May 18 11:56:20s 0:03:40 -
+Rule sol87 1987 only - May 19 11:56:25s 0:03:35 -
+Rule sol87 1987 only - May 20 11:56:25s 0:03:35 -
+Rule sol87 1987 only - May 21 11:56:30s 0:03:30 -
+Rule sol87 1987 only - May 22 11:56:35s 0:03:25 -
+Rule sol87 1987 only - May 23 11:56:40s 0:03:20 -
+Rule sol87 1987 only - May 24 11:56:45s 0:03:15 -
+Rule sol87 1987 only - May 25 11:56:50s 0:03:10 -
+Rule sol87 1987 only - May 26 11:56:55s 0:03:05 -
+Rule sol87 1987 only - May 27 11:57:00s 0:03:00 -
+Rule sol87 1987 only - May 28 11:57:10s 0:02:50 -
+Rule sol87 1987 only - May 29 11:57:15s 0:02:45 -
+Rule sol87 1987 only - May 30 11:57:25s 0:02:35 -
+Rule sol87 1987 only - May 31 11:57:30s 0:02:30 -
+Rule sol87 1987 only - Jun 1 11:57:40s 0:02:20 -
+Rule sol87 1987 only - Jun 2 11:57:50s 0:02:10 -
+Rule sol87 1987 only - Jun 3 11:58:00s 0:02:00 -
+Rule sol87 1987 only - Jun 4 11:58:10s 0:01:50 -
+Rule sol87 1987 only - Jun 5 11:58:20s 0:01:40 -
+Rule sol87 1987 only - Jun 6 11:58:30s 0:01:30 -
+Rule sol87 1987 only - Jun 7 11:58:40s 0:01:20 -
+Rule sol87 1987 only - Jun 8 11:58:50s 0:01:10 -
+Rule sol87 1987 only - Jun 9 11:59:05s 0:00:55 -
+Rule sol87 1987 only - Jun 10 11:59:15s 0:00:45 -
+Rule sol87 1987 only - Jun 11 11:59:30s 0:00:30 -
+Rule sol87 1987 only - Jun 12 11:59:40s 0:00:20 -
+Rule sol87 1987 only - Jun 13 11:59:50s 0:00:10 -
+Rule sol87 1987 only - Jun 14 12:00:05s -0:00:05 -
+Rule sol87 1987 only - Jun 15 12:00:15s -0:00:15 -
+Rule sol87 1987 only - Jun 16 12:00:30s -0:00:30 -
+Rule sol87 1987 only - Jun 17 12:00:45s -0:00:45 -
+Rule sol87 1987 only - Jun 18 12:00:55s -0:00:55 -
+Rule sol87 1987 only - Jun 19 12:01:10s -0:01:10 -
+Rule sol87 1987 only - Jun 20 12:01:20s -0:01:20 -
+Rule sol87 1987 only - Jun 21 12:01:35s -0:01:35 -
+Rule sol87 1987 only - Jun 22 12:01:50s -0:01:50 -
+Rule sol87 1987 only - Jun 23 12:02:00s -0:02:00 -
+Rule sol87 1987 only - Jun 24 12:02:15s -0:02:15 -
+Rule sol87 1987 only - Jun 25 12:02:25s -0:02:25 -
+Rule sol87 1987 only - Jun 26 12:02:40s -0:02:40 -
+Rule sol87 1987 only - Jun 27 12:02:50s -0:02:50 -
+Rule sol87 1987 only - Jun 28 12:03:05s -0:03:05 -
+Rule sol87 1987 only - Jun 29 12:03:15s -0:03:15 -
+Rule sol87 1987 only - Jun 30 12:03:30s -0:03:30 -
+Rule sol87 1987 only - Jul 1 12:03:40s -0:03:40 -
+Rule sol87 1987 only - Jul 2 12:03:50s -0:03:50 -
+Rule sol87 1987 only - Jul 3 12:04:05s -0:04:05 -
+Rule sol87 1987 only - Jul 4 12:04:15s -0:04:15 -
+Rule sol87 1987 only - Jul 5 12:04:25s -0:04:25 -
+Rule sol87 1987 only - Jul 6 12:04:35s -0:04:35 -
+Rule sol87 1987 only - Jul 7 12:04:45s -0:04:45 -
+Rule sol87 1987 only - Jul 8 12:04:55s -0:04:55 -
+Rule sol87 1987 only - Jul 9 12:05:05s -0:05:05 -
+Rule sol87 1987 only - Jul 10 12:05:15s -0:05:15 -
+Rule sol87 1987 only - Jul 11 12:05:20s -0:05:20 -
+Rule sol87 1987 only - Jul 12 12:05:30s -0:05:30 -
+Rule sol87 1987 only - Jul 13 12:05:40s -0:05:40 -
+Rule sol87 1987 only - Jul 14 12:05:45s -0:05:45 -
+Rule sol87 1987 only - Jul 15 12:05:50s -0:05:50 -
+Rule sol87 1987 only - Jul 16 12:06:00s -0:06:00 -
+Rule sol87 1987 only - Jul 17 12:06:05s -0:06:05 -
+Rule sol87 1987 only - Jul 18 12:06:10s -0:06:10 -
+Rule sol87 1987 only - Jul 19 12:06:15s -0:06:15 -
+Rule sol87 1987 only - Jul 20 12:06:15s -0:06:15 -
+Rule sol87 1987 only - Jul 21 12:06:20s -0:06:20 -
+Rule sol87 1987 only - Jul 22 12:06:25s -0:06:25 -
+Rule sol87 1987 only - Jul 23 12:06:25s -0:06:25 -
+Rule sol87 1987 only - Jul 24 12:06:25s -0:06:25 -
+Rule sol87 1987 only - Jul 25 12:06:30s -0:06:30 -
+Rule sol87 1987 only - Jul 26 12:06:30s -0:06:30 -
+Rule sol87 1987 only - Jul 27 12:06:30s -0:06:30 -
+Rule sol87 1987 only - Jul 28 12:06:30s -0:06:30 -
+Rule sol87 1987 only - Jul 29 12:06:25s -0:06:25 -
+Rule sol87 1987 only - Jul 30 12:06:25s -0:06:25 -
+Rule sol87 1987 only - Jul 31 12:06:25s -0:06:25 -
+Rule sol87 1987 only - Aug 1 12:06:20s -0:06:20 -
+Rule sol87 1987 only - Aug 2 12:06:15s -0:06:15 -
+Rule sol87 1987 only - Aug 3 12:06:10s -0:06:10 -
+Rule sol87 1987 only - Aug 4 12:06:05s -0:06:05 -
+Rule sol87 1987 only - Aug 5 12:06:00s -0:06:00 -
+Rule sol87 1987 only - Aug 6 12:05:55s -0:05:55 -
+Rule sol87 1987 only - Aug 7 12:05:50s -0:05:50 -
+Rule sol87 1987 only - Aug 8 12:05:40s -0:05:40 -
+Rule sol87 1987 only - Aug 9 12:05:35s -0:05:35 -
+Rule sol87 1987 only - Aug 10 12:05:25s -0:05:25 -
+Rule sol87 1987 only - Aug 11 12:05:15s -0:05:15 -
+Rule sol87 1987 only - Aug 12 12:05:05s -0:05:05 -
+Rule sol87 1987 only - Aug 13 12:04:55s -0:04:55 -
+Rule sol87 1987 only - Aug 14 12:04:45s -0:04:45 -
+Rule sol87 1987 only - Aug 15 12:04:35s -0:04:35 -
+Rule sol87 1987 only - Aug 16 12:04:25s -0:04:25 -
+Rule sol87 1987 only - Aug 17 12:04:10s -0:04:10 -
+Rule sol87 1987 only - Aug 18 12:04:00s -0:04:00 -
+Rule sol87 1987 only - Aug 19 12:03:45s -0:03:45 -
+Rule sol87 1987 only - Aug 20 12:03:30s -0:03:30 -
+Rule sol87 1987 only - Aug 21 12:03:15s -0:03:15 -
+Rule sol87 1987 only - Aug 22 12:03:00s -0:03:00 -
+Rule sol87 1987 only - Aug 23 12:02:45s -0:02:45 -
+Rule sol87 1987 only - Aug 24 12:02:30s -0:02:30 -
+Rule sol87 1987 only - Aug 25 12:02:15s -0:02:15 -
+Rule sol87 1987 only - Aug 26 12:02:00s -0:02:00 -
+Rule sol87 1987 only - Aug 27 12:01:40s -0:01:40 -
+Rule sol87 1987 only - Aug 28 12:01:25s -0:01:25 -
+Rule sol87 1987 only - Aug 29 12:01:05s -0:01:05 -
+Rule sol87 1987 only - Aug 30 12:00:50s -0:00:50 -
+Rule sol87 1987 only - Aug 31 12:00:30s -0:00:30 -
+Rule sol87 1987 only - Sep 1 12:00:10s -0:00:10 -
+Rule sol87 1987 only - Sep 2 11:59:50s 0:00:10 -
+Rule sol87 1987 only - Sep 3 11:59:35s 0:00:25 -
+Rule sol87 1987 only - Sep 4 11:59:15s 0:00:45 -
+Rule sol87 1987 only - Sep 5 11:58:55s 0:01:05 -
+Rule sol87 1987 only - Sep 6 11:58:35s 0:01:25 -
+Rule sol87 1987 only - Sep 7 11:58:15s 0:01:45 -
+Rule sol87 1987 only - Sep 8 11:57:55s 0:02:05 -
+Rule sol87 1987 only - Sep 9 11:57:30s 0:02:30 -
+Rule sol87 1987 only - Sep 10 11:57:10s 0:02:50 -
+Rule sol87 1987 only - Sep 11 11:56:50s 0:03:10 -
+Rule sol87 1987 only - Sep 12 11:56:30s 0:03:30 -
+Rule sol87 1987 only - Sep 13 11:56:10s 0:03:50 -
+Rule sol87 1987 only - Sep 14 11:55:45s 0:04:15 -
+Rule sol87 1987 only - Sep 15 11:55:25s 0:04:35 -
+Rule sol87 1987 only - Sep 16 11:55:05s 0:04:55 -
+Rule sol87 1987 only - Sep 17 11:54:45s 0:05:15 -
+Rule sol87 1987 only - Sep 18 11:54:20s 0:05:40 -
+Rule sol87 1987 only - Sep 19 11:54:00s 0:06:00 -
+Rule sol87 1987 only - Sep 20 11:53:40s 0:06:20 -
+Rule sol87 1987 only - Sep 21 11:53:15s 0:06:45 -
+Rule sol87 1987 only - Sep 22 11:52:55s 0:07:05 -
+Rule sol87 1987 only - Sep 23 11:52:35s 0:07:25 -
+Rule sol87 1987 only - Sep 24 11:52:15s 0:07:45 -
+Rule sol87 1987 only - Sep 25 11:51:55s 0:08:05 -
+Rule sol87 1987 only - Sep 26 11:51:35s 0:08:25 -
+Rule sol87 1987 only - Sep 27 11:51:10s 0:08:50 -
+Rule sol87 1987 only - Sep 28 11:50:50s 0:09:10 -
+Rule sol87 1987 only - Sep 29 11:50:30s 0:09:30 -
+Rule sol87 1987 only - Sep 30 11:50:10s 0:09:50 -
+Rule sol87 1987 only - Oct 1 11:49:50s 0:10:10 -
+Rule sol87 1987 only - Oct 2 11:49:35s 0:10:25 -
+Rule sol87 1987 only - Oct 3 11:49:15s 0:10:45 -
+Rule sol87 1987 only - Oct 4 11:48:55s 0:11:05 -
+Rule sol87 1987 only - Oct 5 11:48:35s 0:11:25 -
+Rule sol87 1987 only - Oct 6 11:48:20s 0:11:40 -
+Rule sol87 1987 only - Oct 7 11:48:00s 0:12:00 -
+Rule sol87 1987 only - Oct 8 11:47:45s 0:12:15 -
+Rule sol87 1987 only - Oct 9 11:47:25s 0:12:35 -
+Rule sol87 1987 only - Oct 10 11:47:10s 0:12:50 -
+Rule sol87 1987 only - Oct 11 11:46:55s 0:13:05 -
+Rule sol87 1987 only - Oct 12 11:46:40s 0:13:20 -
+Rule sol87 1987 only - Oct 13 11:46:25s 0:13:35 -
+Rule sol87 1987 only - Oct 14 11:46:10s 0:13:50 -
+Rule sol87 1987 only - Oct 15 11:45:55s 0:14:05 -
+Rule sol87 1987 only - Oct 16 11:45:45s 0:14:15 -
+Rule sol87 1987 only - Oct 17 11:45:30s 0:14:30 -
+Rule sol87 1987 only - Oct 18 11:45:20s 0:14:40 -
+Rule sol87 1987 only - Oct 19 11:45:05s 0:14:55 -
+Rule sol87 1987 only - Oct 20 11:44:55s 0:15:05 -
+Rule sol87 1987 only - Oct 21 11:44:45s 0:15:15 -
+Rule sol87 1987 only - Oct 22 11:44:35s 0:15:25 -
+Rule sol87 1987 only - Oct 23 11:44:25s 0:15:35 -
+Rule sol87 1987 only - Oct 24 11:44:20s 0:15:40 -
+Rule sol87 1987 only - Oct 25 11:44:10s 0:15:50 -
+Rule sol87 1987 only - Oct 26 11:44:05s 0:15:55 -
+Rule sol87 1987 only - Oct 27 11:43:55s 0:16:05 -
+Rule sol87 1987 only - Oct 28 11:43:50s 0:16:10 -
+Rule sol87 1987 only - Oct 29 11:43:45s 0:16:15 -
+Rule sol87 1987 only - Oct 30 11:43:45s 0:16:15 -
+Rule sol87 1987 only - Oct 31 11:43:40s 0:16:20 -
+Rule sol87 1987 only - Nov 1 11:43:40s 0:16:20 -
+Rule sol87 1987 only - Nov 2 11:43:35s 0:16:25 -
+Rule sol87 1987 only - Nov 3 11:43:35s 0:16:25 -
+Rule sol87 1987 only - Nov 4 11:43:35s 0:16:25 -
+Rule sol87 1987 only - Nov 5 11:43:35s 0:16:25 -
+Rule sol87 1987 only - Nov 6 11:43:40s 0:16:20 -
+Rule sol87 1987 only - Nov 7 11:43:40s 0:16:20 -
+Rule sol87 1987 only - Nov 8 11:43:45s 0:16:15 -
+Rule sol87 1987 only - Nov 9 11:43:50s 0:16:10 -
+Rule sol87 1987 only - Nov 10 11:43:55s 0:16:05 -
+Rule sol87 1987 only - Nov 11 11:44:00s 0:16:00 -
+Rule sol87 1987 only - Nov 12 11:44:05s 0:15:55 -
+Rule sol87 1987 only - Nov 13 11:44:15s 0:15:45 -
+Rule sol87 1987 only - Nov 14 11:44:20s 0:15:40 -
+Rule sol87 1987 only - Nov 15 11:44:30s 0:15:30 -
+Rule sol87 1987 only - Nov 16 11:44:40s 0:15:20 -
+Rule sol87 1987 only - Nov 17 11:44:50s 0:15:10 -
+Rule sol87 1987 only - Nov 18 11:45:05s 0:14:55 -
+Rule sol87 1987 only - Nov 19 11:45:15s 0:14:45 -
+Rule sol87 1987 only - Nov 20 11:45:30s 0:14:30 -
+Rule sol87 1987 only - Nov 21 11:45:45s 0:14:15 -
+Rule sol87 1987 only - Nov 22 11:46:00s 0:14:00 -
+Rule sol87 1987 only - Nov 23 11:46:15s 0:13:45 -
+Rule sol87 1987 only - Nov 24 11:46:30s 0:13:30 -
+Rule sol87 1987 only - Nov 25 11:46:50s 0:13:10 -
+Rule sol87 1987 only - Nov 26 11:47:10s 0:12:50 -
+Rule sol87 1987 only - Nov 27 11:47:25s 0:12:35 -
+Rule sol87 1987 only - Nov 28 11:47:45s 0:12:15 -
+Rule sol87 1987 only - Nov 29 11:48:05s 0:11:55 -
+Rule sol87 1987 only - Nov 30 11:48:30s 0:11:30 -
+Rule sol87 1987 only - Dec 1 11:48:50s 0:11:10 -
+Rule sol87 1987 only - Dec 2 11:49:10s 0:10:50 -
+Rule sol87 1987 only - Dec 3 11:49:35s 0:10:25 -
+Rule sol87 1987 only - Dec 4 11:50:00s 0:10:00 -
+Rule sol87 1987 only - Dec 5 11:50:25s 0:09:35 -
+Rule sol87 1987 only - Dec 6 11:50:50s 0:09:10 -
+Rule sol87 1987 only - Dec 7 11:51:15s 0:08:45 -
+Rule sol87 1987 only - Dec 8 11:51:40s 0:08:20 -
+Rule sol87 1987 only - Dec 9 11:52:05s 0:07:55 -
+Rule sol87 1987 only - Dec 10 11:52:30s 0:07:30 -
+Rule sol87 1987 only - Dec 11 11:53:00s 0:07:00 -
+Rule sol87 1987 only - Dec 12 11:53:25s 0:06:35 -
+Rule sol87 1987 only - Dec 13 11:53:55s 0:06:05 -
+Rule sol87 1987 only - Dec 14 11:54:25s 0:05:35 -
+Rule sol87 1987 only - Dec 15 11:54:50s 0:05:10 -
+Rule sol87 1987 only - Dec 16 11:55:20s 0:04:40 -
+Rule sol87 1987 only - Dec 17 11:55:50s 0:04:10 -
+Rule sol87 1987 only - Dec 18 11:56:20s 0:03:40 -
+Rule sol87 1987 only - Dec 19 11:56:50s 0:03:10 -
+Rule sol87 1987 only - Dec 20 11:57:20s 0:02:40 -
+Rule sol87 1987 only - Dec 21 11:57:50s 0:02:10 -
+Rule sol87 1987 only - Dec 22 11:58:20s 0:01:40 -
+Rule sol87 1987 only - Dec 23 11:58:50s 0:01:10 -
+Rule sol87 1987 only - Dec 24 11:59:20s 0:00:40 -
+Rule sol87 1987 only - Dec 25 11:59:50s 0:00:10 -
+Rule sol87 1987 only - Dec 26 12:00:20s -0:00:20 -
+Rule sol87 1987 only - Dec 27 12:00:45s -0:00:45 -
+Rule sol87 1987 only - Dec 28 12:01:15s -0:01:15 -
+Rule sol87 1987 only - Dec 29 12:01:45s -0:01:45 -
+Rule sol87 1987 only - Dec 30 12:02:15s -0:02:15 -
+Rule sol87 1987 only - Dec 31 12:02:45s -0:02:45 -
+
+# Riyadh is at about 46 degrees 46 minutes East: 3 hrs, 7 mins, 4 secs
+# Before and after 1987, we'll operate on local mean solar time.
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+Zone Asia/Riyadh87 3:07:04 - zzz 1987
+ 3:07:04 sol87 zzz 1988
+ 3:07:04 - zzz
+# For backward compatibility...
+Link Asia/Riyadh87 Mideast/Riyadh87
diff --git a/libkcal/libical/tzdata/solar88 b/libkcal/libical/tzdata/solar88
new file mode 100644
index 00000000..b4cfe8e3
--- /dev/null
+++ b/libkcal/libical/tzdata/solar88
@@ -0,0 +1,388 @@
+# @(#)solar88 8.1
+
+# Apparent noon times below are for Riyadh; they're a bit off for other places.
+# Times were computed using formulas in the U.S. Naval Observatory's
+# Almanac for Computers 1988; the formulas "will give EqT to an accuracy of
+# [plus or minus two] seconds during the current year."
+#
+# Rounding to the nearest five seconds results in fewer than
+# 256 different "time types"--a limit that's faced because time types are
+# stored on disk as unsigned chars.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule sol88 1988 only - Jan 1 12:03:15s -0:03:15 -
+Rule sol88 1988 only - Jan 2 12:03:40s -0:03:40 -
+Rule sol88 1988 only - Jan 3 12:04:10s -0:04:10 -
+Rule sol88 1988 only - Jan 4 12:04:40s -0:04:40 -
+Rule sol88 1988 only - Jan 5 12:05:05s -0:05:05 -
+Rule sol88 1988 only - Jan 6 12:05:30s -0:05:30 -
+Rule sol88 1988 only - Jan 7 12:06:00s -0:06:00 -
+Rule sol88 1988 only - Jan 8 12:06:25s -0:06:25 -
+Rule sol88 1988 only - Jan 9 12:06:50s -0:06:50 -
+Rule sol88 1988 only - Jan 10 12:07:15s -0:07:15 -
+Rule sol88 1988 only - Jan 11 12:07:40s -0:07:40 -
+Rule sol88 1988 only - Jan 12 12:08:05s -0:08:05 -
+Rule sol88 1988 only - Jan 13 12:08:25s -0:08:25 -
+Rule sol88 1988 only - Jan 14 12:08:50s -0:08:50 -
+Rule sol88 1988 only - Jan 15 12:09:10s -0:09:10 -
+Rule sol88 1988 only - Jan 16 12:09:30s -0:09:30 -
+Rule sol88 1988 only - Jan 17 12:09:50s -0:09:50 -
+Rule sol88 1988 only - Jan 18 12:10:10s -0:10:10 -
+Rule sol88 1988 only - Jan 19 12:10:30s -0:10:30 -
+Rule sol88 1988 only - Jan 20 12:10:50s -0:10:50 -
+Rule sol88 1988 only - Jan 21 12:11:05s -0:11:05 -
+Rule sol88 1988 only - Jan 22 12:11:25s -0:11:25 -
+Rule sol88 1988 only - Jan 23 12:11:40s -0:11:40 -
+Rule sol88 1988 only - Jan 24 12:11:55s -0:11:55 -
+Rule sol88 1988 only - Jan 25 12:12:10s -0:12:10 -
+Rule sol88 1988 only - Jan 26 12:12:25s -0:12:25 -
+Rule sol88 1988 only - Jan 27 12:12:40s -0:12:40 -
+Rule sol88 1988 only - Jan 28 12:12:50s -0:12:50 -
+Rule sol88 1988 only - Jan 29 12:13:00s -0:13:00 -
+Rule sol88 1988 only - Jan 30 12:13:10s -0:13:10 -
+Rule sol88 1988 only - Jan 31 12:13:20s -0:13:20 -
+Rule sol88 1988 only - Feb 1 12:13:30s -0:13:30 -
+Rule sol88 1988 only - Feb 2 12:13:40s -0:13:40 -
+Rule sol88 1988 only - Feb 3 12:13:45s -0:13:45 -
+Rule sol88 1988 only - Feb 4 12:13:55s -0:13:55 -
+Rule sol88 1988 only - Feb 5 12:14:00s -0:14:00 -
+Rule sol88 1988 only - Feb 6 12:14:05s -0:14:05 -
+Rule sol88 1988 only - Feb 7 12:14:10s -0:14:10 -
+Rule sol88 1988 only - Feb 8 12:14:10s -0:14:10 -
+Rule sol88 1988 only - Feb 9 12:14:15s -0:14:15 -
+Rule sol88 1988 only - Feb 10 12:14:15s -0:14:15 -
+Rule sol88 1988 only - Feb 11 12:14:15s -0:14:15 -
+Rule sol88 1988 only - Feb 12 12:14:15s -0:14:15 -
+Rule sol88 1988 only - Feb 13 12:14:15s -0:14:15 -
+Rule sol88 1988 only - Feb 14 12:14:15s -0:14:15 -
+Rule sol88 1988 only - Feb 15 12:14:10s -0:14:10 -
+Rule sol88 1988 only - Feb 16 12:14:10s -0:14:10 -
+Rule sol88 1988 only - Feb 17 12:14:05s -0:14:05 -
+Rule sol88 1988 only - Feb 18 12:14:00s -0:14:00 -
+Rule sol88 1988 only - Feb 19 12:13:55s -0:13:55 -
+Rule sol88 1988 only - Feb 20 12:13:50s -0:13:50 -
+Rule sol88 1988 only - Feb 21 12:13:45s -0:13:45 -
+Rule sol88 1988 only - Feb 22 12:13:40s -0:13:40 -
+Rule sol88 1988 only - Feb 23 12:13:30s -0:13:30 -
+Rule sol88 1988 only - Feb 24 12:13:20s -0:13:20 -
+Rule sol88 1988 only - Feb 25 12:13:15s -0:13:15 -
+Rule sol88 1988 only - Feb 26 12:13:05s -0:13:05 -
+Rule sol88 1988 only - Feb 27 12:12:55s -0:12:55 -
+Rule sol88 1988 only - Feb 28 12:12:45s -0:12:45 -
+Rule sol88 1988 only - Feb 29 12:12:30s -0:12:30 -
+Rule sol88 1988 only - Mar 1 12:12:20s -0:12:20 -
+Rule sol88 1988 only - Mar 2 12:12:10s -0:12:10 -
+Rule sol88 1988 only - Mar 3 12:11:55s -0:11:55 -
+Rule sol88 1988 only - Mar 4 12:11:45s -0:11:45 -
+Rule sol88 1988 only - Mar 5 12:11:30s -0:11:30 -
+Rule sol88 1988 only - Mar 6 12:11:15s -0:11:15 -
+Rule sol88 1988 only - Mar 7 12:11:00s -0:11:00 -
+Rule sol88 1988 only - Mar 8 12:10:45s -0:10:45 -
+Rule sol88 1988 only - Mar 9 12:10:30s -0:10:30 -
+Rule sol88 1988 only - Mar 10 12:10:15s -0:10:15 -
+Rule sol88 1988 only - Mar 11 12:10:00s -0:10:00 -
+Rule sol88 1988 only - Mar 12 12:09:45s -0:09:45 -
+Rule sol88 1988 only - Mar 13 12:09:30s -0:09:30 -
+Rule sol88 1988 only - Mar 14 12:09:10s -0:09:10 -
+Rule sol88 1988 only - Mar 15 12:08:55s -0:08:55 -
+Rule sol88 1988 only - Mar 16 12:08:40s -0:08:40 -
+Rule sol88 1988 only - Mar 17 12:08:20s -0:08:20 -
+Rule sol88 1988 only - Mar 18 12:08:05s -0:08:05 -
+Rule sol88 1988 only - Mar 19 12:07:45s -0:07:45 -
+Rule sol88 1988 only - Mar 20 12:07:30s -0:07:30 -
+Rule sol88 1988 only - Mar 21 12:07:10s -0:07:10 -
+Rule sol88 1988 only - Mar 22 12:06:50s -0:06:50 -
+Rule sol88 1988 only - Mar 23 12:06:35s -0:06:35 -
+Rule sol88 1988 only - Mar 24 12:06:15s -0:06:15 -
+Rule sol88 1988 only - Mar 25 12:06:00s -0:06:00 -
+Rule sol88 1988 only - Mar 26 12:05:40s -0:05:40 -
+Rule sol88 1988 only - Mar 27 12:05:20s -0:05:20 -
+Rule sol88 1988 only - Mar 28 12:05:05s -0:05:05 -
+Rule sol88 1988 only - Mar 29 12:04:45s -0:04:45 -
+Rule sol88 1988 only - Mar 30 12:04:25s -0:04:25 -
+Rule sol88 1988 only - Mar 31 12:04:10s -0:04:10 -
+Rule sol88 1988 only - Apr 1 12:03:50s -0:03:50 -
+Rule sol88 1988 only - Apr 2 12:03:35s -0:03:35 -
+Rule sol88 1988 only - Apr 3 12:03:15s -0:03:15 -
+Rule sol88 1988 only - Apr 4 12:03:00s -0:03:00 -
+Rule sol88 1988 only - Apr 5 12:02:40s -0:02:40 -
+Rule sol88 1988 only - Apr 6 12:02:25s -0:02:25 -
+Rule sol88 1988 only - Apr 7 12:02:05s -0:02:05 -
+Rule sol88 1988 only - Apr 8 12:01:50s -0:01:50 -
+Rule sol88 1988 only - Apr 9 12:01:35s -0:01:35 -
+Rule sol88 1988 only - Apr 10 12:01:15s -0:01:15 -
+Rule sol88 1988 only - Apr 11 12:01:00s -0:01:00 -
+Rule sol88 1988 only - Apr 12 12:00:45s -0:00:45 -
+Rule sol88 1988 only - Apr 13 12:00:30s -0:00:30 -
+Rule sol88 1988 only - Apr 14 12:00:15s -0:00:15 -
+Rule sol88 1988 only - Apr 15 12:00:00s 0:00:00 -
+Rule sol88 1988 only - Apr 16 11:59:45s 0:00:15 -
+Rule sol88 1988 only - Apr 17 11:59:30s 0:00:30 -
+Rule sol88 1988 only - Apr 18 11:59:20s 0:00:40 -
+Rule sol88 1988 only - Apr 19 11:59:05s 0:00:55 -
+Rule sol88 1988 only - Apr 20 11:58:55s 0:01:05 -
+Rule sol88 1988 only - Apr 21 11:58:40s 0:01:20 -
+Rule sol88 1988 only - Apr 22 11:58:30s 0:01:30 -
+Rule sol88 1988 only - Apr 23 11:58:15s 0:01:45 -
+Rule sol88 1988 only - Apr 24 11:58:05s 0:01:55 -
+Rule sol88 1988 only - Apr 25 11:57:55s 0:02:05 -
+Rule sol88 1988 only - Apr 26 11:57:45s 0:02:15 -
+Rule sol88 1988 only - Apr 27 11:57:35s 0:02:25 -
+Rule sol88 1988 only - Apr 28 11:57:30s 0:02:30 -
+Rule sol88 1988 only - Apr 29 11:57:20s 0:02:40 -
+Rule sol88 1988 only - Apr 30 11:57:10s 0:02:50 -
+Rule sol88 1988 only - May 1 11:57:05s 0:02:55 -
+Rule sol88 1988 only - May 2 11:56:55s 0:03:05 -
+Rule sol88 1988 only - May 3 11:56:50s 0:03:10 -
+Rule sol88 1988 only - May 4 11:56:45s 0:03:15 -
+Rule sol88 1988 only - May 5 11:56:40s 0:03:20 -
+Rule sol88 1988 only - May 6 11:56:35s 0:03:25 -
+Rule sol88 1988 only - May 7 11:56:30s 0:03:30 -
+Rule sol88 1988 only - May 8 11:56:25s 0:03:35 -
+Rule sol88 1988 only - May 9 11:56:25s 0:03:35 -
+Rule sol88 1988 only - May 10 11:56:20s 0:03:40 -
+Rule sol88 1988 only - May 11 11:56:20s 0:03:40 -
+Rule sol88 1988 only - May 12 11:56:20s 0:03:40 -
+Rule sol88 1988 only - May 13 11:56:20s 0:03:40 -
+Rule sol88 1988 only - May 14 11:56:20s 0:03:40 -
+Rule sol88 1988 only - May 15 11:56:20s 0:03:40 -
+Rule sol88 1988 only - May 16 11:56:20s 0:03:40 -
+Rule sol88 1988 only - May 17 11:56:20s 0:03:40 -
+Rule sol88 1988 only - May 18 11:56:25s 0:03:35 -
+Rule sol88 1988 only - May 19 11:56:25s 0:03:35 -
+Rule sol88 1988 only - May 20 11:56:30s 0:03:30 -
+Rule sol88 1988 only - May 21 11:56:35s 0:03:25 -
+Rule sol88 1988 only - May 22 11:56:40s 0:03:20 -
+Rule sol88 1988 only - May 23 11:56:45s 0:03:15 -
+Rule sol88 1988 only - May 24 11:56:50s 0:03:10 -
+Rule sol88 1988 only - May 25 11:56:55s 0:03:05 -
+Rule sol88 1988 only - May 26 11:57:00s 0:03:00 -
+Rule sol88 1988 only - May 27 11:57:05s 0:02:55 -
+Rule sol88 1988 only - May 28 11:57:15s 0:02:45 -
+Rule sol88 1988 only - May 29 11:57:20s 0:02:40 -
+Rule sol88 1988 only - May 30 11:57:30s 0:02:30 -
+Rule sol88 1988 only - May 31 11:57:40s 0:02:20 -
+Rule sol88 1988 only - Jun 1 11:57:50s 0:02:10 -
+Rule sol88 1988 only - Jun 2 11:57:55s 0:02:05 -
+Rule sol88 1988 only - Jun 3 11:58:05s 0:01:55 -
+Rule sol88 1988 only - Jun 4 11:58:15s 0:01:45 -
+Rule sol88 1988 only - Jun 5 11:58:30s 0:01:30 -
+Rule sol88 1988 only - Jun 6 11:58:40s 0:01:20 -
+Rule sol88 1988 only - Jun 7 11:58:50s 0:01:10 -
+Rule sol88 1988 only - Jun 8 11:59:00s 0:01:00 -
+Rule sol88 1988 only - Jun 9 11:59:15s 0:00:45 -
+Rule sol88 1988 only - Jun 10 11:59:25s 0:00:35 -
+Rule sol88 1988 only - Jun 11 11:59:35s 0:00:25 -
+Rule sol88 1988 only - Jun 12 11:59:50s 0:00:10 -
+Rule sol88 1988 only - Jun 13 12:00:00s 0:00:00 -
+Rule sol88 1988 only - Jun 14 12:00:15s -0:00:15 -
+Rule sol88 1988 only - Jun 15 12:00:25s -0:00:25 -
+Rule sol88 1988 only - Jun 16 12:00:40s -0:00:40 -
+Rule sol88 1988 only - Jun 17 12:00:55s -0:00:55 -
+Rule sol88 1988 only - Jun 18 12:01:05s -0:01:05 -
+Rule sol88 1988 only - Jun 19 12:01:20s -0:01:20 -
+Rule sol88 1988 only - Jun 20 12:01:30s -0:01:30 -
+Rule sol88 1988 only - Jun 21 12:01:45s -0:01:45 -
+Rule sol88 1988 only - Jun 22 12:02:00s -0:02:00 -
+Rule sol88 1988 only - Jun 23 12:02:10s -0:02:10 -
+Rule sol88 1988 only - Jun 24 12:02:25s -0:02:25 -
+Rule sol88 1988 only - Jun 25 12:02:35s -0:02:35 -
+Rule sol88 1988 only - Jun 26 12:02:50s -0:02:50 -
+Rule sol88 1988 only - Jun 27 12:03:00s -0:03:00 -
+Rule sol88 1988 only - Jun 28 12:03:15s -0:03:15 -
+Rule sol88 1988 only - Jun 29 12:03:25s -0:03:25 -
+Rule sol88 1988 only - Jun 30 12:03:40s -0:03:40 -
+Rule sol88 1988 only - Jul 1 12:03:50s -0:03:50 -
+Rule sol88 1988 only - Jul 2 12:04:00s -0:04:00 -
+Rule sol88 1988 only - Jul 3 12:04:10s -0:04:10 -
+Rule sol88 1988 only - Jul 4 12:04:25s -0:04:25 -
+Rule sol88 1988 only - Jul 5 12:04:35s -0:04:35 -
+Rule sol88 1988 only - Jul 6 12:04:45s -0:04:45 -
+Rule sol88 1988 only - Jul 7 12:04:55s -0:04:55 -
+Rule sol88 1988 only - Jul 8 12:05:05s -0:05:05 -
+Rule sol88 1988 only - Jul 9 12:05:10s -0:05:10 -
+Rule sol88 1988 only - Jul 10 12:05:20s -0:05:20 -
+Rule sol88 1988 only - Jul 11 12:05:30s -0:05:30 -
+Rule sol88 1988 only - Jul 12 12:05:35s -0:05:35 -
+Rule sol88 1988 only - Jul 13 12:05:45s -0:05:45 -
+Rule sol88 1988 only - Jul 14 12:05:50s -0:05:50 -
+Rule sol88 1988 only - Jul 15 12:05:55s -0:05:55 -
+Rule sol88 1988 only - Jul 16 12:06:00s -0:06:00 -
+Rule sol88 1988 only - Jul 17 12:06:05s -0:06:05 -
+Rule sol88 1988 only - Jul 18 12:06:10s -0:06:10 -
+Rule sol88 1988 only - Jul 19 12:06:15s -0:06:15 -
+Rule sol88 1988 only - Jul 20 12:06:20s -0:06:20 -
+Rule sol88 1988 only - Jul 21 12:06:25s -0:06:25 -
+Rule sol88 1988 only - Jul 22 12:06:25s -0:06:25 -
+Rule sol88 1988 only - Jul 23 12:06:25s -0:06:25 -
+Rule sol88 1988 only - Jul 24 12:06:30s -0:06:30 -
+Rule sol88 1988 only - Jul 25 12:06:30s -0:06:30 -
+Rule sol88 1988 only - Jul 26 12:06:30s -0:06:30 -
+Rule sol88 1988 only - Jul 27 12:06:30s -0:06:30 -
+Rule sol88 1988 only - Jul 28 12:06:30s -0:06:30 -
+Rule sol88 1988 only - Jul 29 12:06:25s -0:06:25 -
+Rule sol88 1988 only - Jul 30 12:06:25s -0:06:25 -
+Rule sol88 1988 only - Jul 31 12:06:20s -0:06:20 -
+Rule sol88 1988 only - Aug 1 12:06:15s -0:06:15 -
+Rule sol88 1988 only - Aug 2 12:06:15s -0:06:15 -
+Rule sol88 1988 only - Aug 3 12:06:10s -0:06:10 -
+Rule sol88 1988 only - Aug 4 12:06:05s -0:06:05 -
+Rule sol88 1988 only - Aug 5 12:05:55s -0:05:55 -
+Rule sol88 1988 only - Aug 6 12:05:50s -0:05:50 -
+Rule sol88 1988 only - Aug 7 12:05:45s -0:05:45 -
+Rule sol88 1988 only - Aug 8 12:05:35s -0:05:35 -
+Rule sol88 1988 only - Aug 9 12:05:25s -0:05:25 -
+Rule sol88 1988 only - Aug 10 12:05:20s -0:05:20 -
+Rule sol88 1988 only - Aug 11 12:05:10s -0:05:10 -
+Rule sol88 1988 only - Aug 12 12:05:00s -0:05:00 -
+Rule sol88 1988 only - Aug 13 12:04:50s -0:04:50 -
+Rule sol88 1988 only - Aug 14 12:04:35s -0:04:35 -
+Rule sol88 1988 only - Aug 15 12:04:25s -0:04:25 -
+Rule sol88 1988 only - Aug 16 12:04:15s -0:04:15 -
+Rule sol88 1988 only - Aug 17 12:04:00s -0:04:00 -
+Rule sol88 1988 only - Aug 18 12:03:50s -0:03:50 -
+Rule sol88 1988 only - Aug 19 12:03:35s -0:03:35 -
+Rule sol88 1988 only - Aug 20 12:03:20s -0:03:20 -
+Rule sol88 1988 only - Aug 21 12:03:05s -0:03:05 -
+Rule sol88 1988 only - Aug 22 12:02:50s -0:02:50 -
+Rule sol88 1988 only - Aug 23 12:02:35s -0:02:35 -
+Rule sol88 1988 only - Aug 24 12:02:20s -0:02:20 -
+Rule sol88 1988 only - Aug 25 12:02:00s -0:02:00 -
+Rule sol88 1988 only - Aug 26 12:01:45s -0:01:45 -
+Rule sol88 1988 only - Aug 27 12:01:30s -0:01:30 -
+Rule sol88 1988 only - Aug 28 12:01:10s -0:01:10 -
+Rule sol88 1988 only - Aug 29 12:00:50s -0:00:50 -
+Rule sol88 1988 only - Aug 30 12:00:35s -0:00:35 -
+Rule sol88 1988 only - Aug 31 12:00:15s -0:00:15 -
+Rule sol88 1988 only - Sep 1 11:59:55s 0:00:05 -
+Rule sol88 1988 only - Sep 2 11:59:35s 0:00:25 -
+Rule sol88 1988 only - Sep 3 11:59:20s 0:00:40 -
+Rule sol88 1988 only - Sep 4 11:59:00s 0:01:00 -
+Rule sol88 1988 only - Sep 5 11:58:40s 0:01:20 -
+Rule sol88 1988 only - Sep 6 11:58:20s 0:01:40 -
+Rule sol88 1988 only - Sep 7 11:58:00s 0:02:00 -
+Rule sol88 1988 only - Sep 8 11:57:35s 0:02:25 -
+Rule sol88 1988 only - Sep 9 11:57:15s 0:02:45 -
+Rule sol88 1988 only - Sep 10 11:56:55s 0:03:05 -
+Rule sol88 1988 only - Sep 11 11:56:35s 0:03:25 -
+Rule sol88 1988 only - Sep 12 11:56:15s 0:03:45 -
+Rule sol88 1988 only - Sep 13 11:55:50s 0:04:10 -
+Rule sol88 1988 only - Sep 14 11:55:30s 0:04:30 -
+Rule sol88 1988 only - Sep 15 11:55:10s 0:04:50 -
+Rule sol88 1988 only - Sep 16 11:54:50s 0:05:10 -
+Rule sol88 1988 only - Sep 17 11:54:25s 0:05:35 -
+Rule sol88 1988 only - Sep 18 11:54:05s 0:05:55 -
+Rule sol88 1988 only - Sep 19 11:53:45s 0:06:15 -
+Rule sol88 1988 only - Sep 20 11:53:25s 0:06:35 -
+Rule sol88 1988 only - Sep 21 11:53:00s 0:07:00 -
+Rule sol88 1988 only - Sep 22 11:52:40s 0:07:20 -
+Rule sol88 1988 only - Sep 23 11:52:20s 0:07:40 -
+Rule sol88 1988 only - Sep 24 11:52:00s 0:08:00 -
+Rule sol88 1988 only - Sep 25 11:51:40s 0:08:20 -
+Rule sol88 1988 only - Sep 26 11:51:15s 0:08:45 -
+Rule sol88 1988 only - Sep 27 11:50:55s 0:09:05 -
+Rule sol88 1988 only - Sep 28 11:50:35s 0:09:25 -
+Rule sol88 1988 only - Sep 29 11:50:15s 0:09:45 -
+Rule sol88 1988 only - Sep 30 11:49:55s 0:10:05 -
+Rule sol88 1988 only - Oct 1 11:49:35s 0:10:25 -
+Rule sol88 1988 only - Oct 2 11:49:20s 0:10:40 -
+Rule sol88 1988 only - Oct 3 11:49:00s 0:11:00 -
+Rule sol88 1988 only - Oct 4 11:48:40s 0:11:20 -
+Rule sol88 1988 only - Oct 5 11:48:25s 0:11:35 -
+Rule sol88 1988 only - Oct 6 11:48:05s 0:11:55 -
+Rule sol88 1988 only - Oct 7 11:47:50s 0:12:10 -
+Rule sol88 1988 only - Oct 8 11:47:30s 0:12:30 -
+Rule sol88 1988 only - Oct 9 11:47:15s 0:12:45 -
+Rule sol88 1988 only - Oct 10 11:47:00s 0:13:00 -
+Rule sol88 1988 only - Oct 11 11:46:45s 0:13:15 -
+Rule sol88 1988 only - Oct 12 11:46:30s 0:13:30 -
+Rule sol88 1988 only - Oct 13 11:46:15s 0:13:45 -
+Rule sol88 1988 only - Oct 14 11:46:00s 0:14:00 -
+Rule sol88 1988 only - Oct 15 11:45:45s 0:14:15 -
+Rule sol88 1988 only - Oct 16 11:45:35s 0:14:25 -
+Rule sol88 1988 only - Oct 17 11:45:20s 0:14:40 -
+Rule sol88 1988 only - Oct 18 11:45:10s 0:14:50 -
+Rule sol88 1988 only - Oct 19 11:45:00s 0:15:00 -
+Rule sol88 1988 only - Oct 20 11:44:45s 0:15:15 -
+Rule sol88 1988 only - Oct 21 11:44:40s 0:15:20 -
+Rule sol88 1988 only - Oct 22 11:44:30s 0:15:30 -
+Rule sol88 1988 only - Oct 23 11:44:20s 0:15:40 -
+Rule sol88 1988 only - Oct 24 11:44:10s 0:15:50 -
+Rule sol88 1988 only - Oct 25 11:44:05s 0:15:55 -
+Rule sol88 1988 only - Oct 26 11:44:00s 0:16:00 -
+Rule sol88 1988 only - Oct 27 11:43:55s 0:16:05 -
+Rule sol88 1988 only - Oct 28 11:43:50s 0:16:10 -
+Rule sol88 1988 only - Oct 29 11:43:45s 0:16:15 -
+Rule sol88 1988 only - Oct 30 11:43:40s 0:16:20 -
+Rule sol88 1988 only - Oct 31 11:43:40s 0:16:20 -
+Rule sol88 1988 only - Nov 1 11:43:35s 0:16:25 -
+Rule sol88 1988 only - Nov 2 11:43:35s 0:16:25 -
+Rule sol88 1988 only - Nov 3 11:43:35s 0:16:25 -
+Rule sol88 1988 only - Nov 4 11:43:35s 0:16:25 -
+Rule sol88 1988 only - Nov 5 11:43:40s 0:16:20 -
+Rule sol88 1988 only - Nov 6 11:43:40s 0:16:20 -
+Rule sol88 1988 only - Nov 7 11:43:45s 0:16:15 -
+Rule sol88 1988 only - Nov 8 11:43:45s 0:16:15 -
+Rule sol88 1988 only - Nov 9 11:43:50s 0:16:10 -
+Rule sol88 1988 only - Nov 10 11:44:00s 0:16:00 -
+Rule sol88 1988 only - Nov 11 11:44:05s 0:15:55 -
+Rule sol88 1988 only - Nov 12 11:44:10s 0:15:50 -
+Rule sol88 1988 only - Nov 13 11:44:20s 0:15:40 -
+Rule sol88 1988 only - Nov 14 11:44:30s 0:15:30 -
+Rule sol88 1988 only - Nov 15 11:44:40s 0:15:20 -
+Rule sol88 1988 only - Nov 16 11:44:50s 0:15:10 -
+Rule sol88 1988 only - Nov 17 11:45:00s 0:15:00 -
+Rule sol88 1988 only - Nov 18 11:45:15s 0:14:45 -
+Rule sol88 1988 only - Nov 19 11:45:25s 0:14:35 -
+Rule sol88 1988 only - Nov 20 11:45:40s 0:14:20 -
+Rule sol88 1988 only - Nov 21 11:45:55s 0:14:05 -
+Rule sol88 1988 only - Nov 22 11:46:10s 0:13:50 -
+Rule sol88 1988 only - Nov 23 11:46:30s 0:13:30 -
+Rule sol88 1988 only - Nov 24 11:46:45s 0:13:15 -
+Rule sol88 1988 only - Nov 25 11:47:05s 0:12:55 -
+Rule sol88 1988 only - Nov 26 11:47:20s 0:12:40 -
+Rule sol88 1988 only - Nov 27 11:47:40s 0:12:20 -
+Rule sol88 1988 only - Nov 28 11:48:00s 0:12:00 -
+Rule sol88 1988 only - Nov 29 11:48:25s 0:11:35 -
+Rule sol88 1988 only - Nov 30 11:48:45s 0:11:15 -
+Rule sol88 1988 only - Dec 1 11:49:05s 0:10:55 -
+Rule sol88 1988 only - Dec 2 11:49:30s 0:10:30 -
+Rule sol88 1988 only - Dec 3 11:49:55s 0:10:05 -
+Rule sol88 1988 only - Dec 4 11:50:15s 0:09:45 -
+Rule sol88 1988 only - Dec 5 11:50:40s 0:09:20 -
+Rule sol88 1988 only - Dec 6 11:51:05s 0:08:55 -
+Rule sol88 1988 only - Dec 7 11:51:35s 0:08:25 -
+Rule sol88 1988 only - Dec 8 11:52:00s 0:08:00 -
+Rule sol88 1988 only - Dec 9 11:52:25s 0:07:35 -
+Rule sol88 1988 only - Dec 10 11:52:55s 0:07:05 -
+Rule sol88 1988 only - Dec 11 11:53:20s 0:06:40 -
+Rule sol88 1988 only - Dec 12 11:53:50s 0:06:10 -
+Rule sol88 1988 only - Dec 13 11:54:15s 0:05:45 -
+Rule sol88 1988 only - Dec 14 11:54:45s 0:05:15 -
+Rule sol88 1988 only - Dec 15 11:55:15s 0:04:45 -
+Rule sol88 1988 only - Dec 16 11:55:45s 0:04:15 -
+Rule sol88 1988 only - Dec 17 11:56:15s 0:03:45 -
+Rule sol88 1988 only - Dec 18 11:56:40s 0:03:20 -
+Rule sol88 1988 only - Dec 19 11:57:10s 0:02:50 -
+Rule sol88 1988 only - Dec 20 11:57:40s 0:02:20 -
+Rule sol88 1988 only - Dec 21 11:58:10s 0:01:50 -
+Rule sol88 1988 only - Dec 22 11:58:40s 0:01:20 -
+Rule sol88 1988 only - Dec 23 11:59:10s 0:00:50 -
+Rule sol88 1988 only - Dec 24 11:59:40s 0:00:20 -
+Rule sol88 1988 only - Dec 25 12:00:10s -0:00:10 -
+Rule sol88 1988 only - Dec 26 12:00:40s -0:00:40 -
+Rule sol88 1988 only - Dec 27 12:01:10s -0:01:10 -
+Rule sol88 1988 only - Dec 28 12:01:40s -0:01:40 -
+Rule sol88 1988 only - Dec 29 12:02:10s -0:02:10 -
+Rule sol88 1988 only - Dec 30 12:02:35s -0:02:35 -
+Rule sol88 1988 only - Dec 31 12:03:05s -0:03:05 -
+
+# Riyadh is at about 46 degrees 46 minutes East: 3 hrs, 7 mins, 4 secs
+# Before and after 1988, we'll operate on local mean solar time.
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+Zone Asia/Riyadh88 3:07:04 - zzz 1988
+ 3:07:04 sol88 zzz 1989
+ 3:07:04 - zzz
+# For backward compatibility...
+Link Asia/Riyadh88 Mideast/Riyadh88
diff --git a/libkcal/libical/tzdata/solar89 b/libkcal/libical/tzdata/solar89
new file mode 100644
index 00000000..8c485314
--- /dev/null
+++ b/libkcal/libical/tzdata/solar89
@@ -0,0 +1,393 @@
+# @(#)solar89 8.1
+
+# Apparent noon times below are for Riyadh; they're a bit off for other places.
+# Times were computed using a formula provided by the U. S. Naval Observatory:
+# eqt = -105.8 * sin(l) + 596.2 * sin(2 * l) + 4.4 * sin(3 * l)
+# -12.7 * sin(4 * l) - 429.0 * cos(l) - 2.1 * cos (2 * l)
+# + 19.3 * cos(3 * l);
+# where l is the "mean longitude of the Sun" given by
+# l = 279.642 degrees + 0.985647 * d
+# and d is the interval in days from January 0, 0 hours Universal Time
+# (equaling the day of the year plus the fraction of a day from zero hours).
+# The accuracy of the formula is plus or minus three seconds.
+#
+# Rounding to the nearest five seconds results in fewer than
+# 256 different "time types"--a limit that's faced because time types are
+# stored on disk as unsigned chars.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule sol89 1989 only - Jan 1 12:03:35s -0:03:35 -
+Rule sol89 1989 only - Jan 2 12:04:05s -0:04:05 -
+Rule sol89 1989 only - Jan 3 12:04:30s -0:04:30 -
+Rule sol89 1989 only - Jan 4 12:05:00s -0:05:00 -
+Rule sol89 1989 only - Jan 5 12:05:25s -0:05:25 -
+Rule sol89 1989 only - Jan 6 12:05:50s -0:05:50 -
+Rule sol89 1989 only - Jan 7 12:06:15s -0:06:15 -
+Rule sol89 1989 only - Jan 8 12:06:45s -0:06:45 -
+Rule sol89 1989 only - Jan 9 12:07:10s -0:07:10 -
+Rule sol89 1989 only - Jan 10 12:07:35s -0:07:35 -
+Rule sol89 1989 only - Jan 11 12:07:55s -0:07:55 -
+Rule sol89 1989 only - Jan 12 12:08:20s -0:08:20 -
+Rule sol89 1989 only - Jan 13 12:08:45s -0:08:45 -
+Rule sol89 1989 only - Jan 14 12:09:05s -0:09:05 -
+Rule sol89 1989 only - Jan 15 12:09:25s -0:09:25 -
+Rule sol89 1989 only - Jan 16 12:09:45s -0:09:45 -
+Rule sol89 1989 only - Jan 17 12:10:05s -0:10:05 -
+Rule sol89 1989 only - Jan 18 12:10:25s -0:10:25 -
+Rule sol89 1989 only - Jan 19 12:10:45s -0:10:45 -
+Rule sol89 1989 only - Jan 20 12:11:05s -0:11:05 -
+Rule sol89 1989 only - Jan 21 12:11:20s -0:11:20 -
+Rule sol89 1989 only - Jan 22 12:11:35s -0:11:35 -
+Rule sol89 1989 only - Jan 23 12:11:55s -0:11:55 -
+Rule sol89 1989 only - Jan 24 12:12:10s -0:12:10 -
+Rule sol89 1989 only - Jan 25 12:12:20s -0:12:20 -
+Rule sol89 1989 only - Jan 26 12:12:35s -0:12:35 -
+Rule sol89 1989 only - Jan 27 12:12:50s -0:12:50 -
+Rule sol89 1989 only - Jan 28 12:13:00s -0:13:00 -
+Rule sol89 1989 only - Jan 29 12:13:10s -0:13:10 -
+Rule sol89 1989 only - Jan 30 12:13:20s -0:13:20 -
+Rule sol89 1989 only - Jan 31 12:13:30s -0:13:30 -
+Rule sol89 1989 only - Feb 1 12:13:40s -0:13:40 -
+Rule sol89 1989 only - Feb 2 12:13:45s -0:13:45 -
+Rule sol89 1989 only - Feb 3 12:13:55s -0:13:55 -
+Rule sol89 1989 only - Feb 4 12:14:00s -0:14:00 -
+Rule sol89 1989 only - Feb 5 12:14:05s -0:14:05 -
+Rule sol89 1989 only - Feb 6 12:14:10s -0:14:10 -
+Rule sol89 1989 only - Feb 7 12:14:10s -0:14:10 -
+Rule sol89 1989 only - Feb 8 12:14:15s -0:14:15 -
+Rule sol89 1989 only - Feb 9 12:14:15s -0:14:15 -
+Rule sol89 1989 only - Feb 10 12:14:20s -0:14:20 -
+Rule sol89 1989 only - Feb 11 12:14:20s -0:14:20 -
+Rule sol89 1989 only - Feb 12 12:14:20s -0:14:20 -
+Rule sol89 1989 only - Feb 13 12:14:15s -0:14:15 -
+Rule sol89 1989 only - Feb 14 12:14:15s -0:14:15 -
+Rule sol89 1989 only - Feb 15 12:14:10s -0:14:10 -
+Rule sol89 1989 only - Feb 16 12:14:10s -0:14:10 -
+Rule sol89 1989 only - Feb 17 12:14:05s -0:14:05 -
+Rule sol89 1989 only - Feb 18 12:14:00s -0:14:00 -
+Rule sol89 1989 only - Feb 19 12:13:55s -0:13:55 -
+Rule sol89 1989 only - Feb 20 12:13:50s -0:13:50 -
+Rule sol89 1989 only - Feb 21 12:13:40s -0:13:40 -
+Rule sol89 1989 only - Feb 22 12:13:35s -0:13:35 -
+Rule sol89 1989 only - Feb 23 12:13:25s -0:13:25 -
+Rule sol89 1989 only - Feb 24 12:13:15s -0:13:15 -
+Rule sol89 1989 only - Feb 25 12:13:05s -0:13:05 -
+Rule sol89 1989 only - Feb 26 12:12:55s -0:12:55 -
+Rule sol89 1989 only - Feb 27 12:12:45s -0:12:45 -
+Rule sol89 1989 only - Feb 28 12:12:35s -0:12:35 -
+Rule sol89 1989 only - Mar 1 12:12:25s -0:12:25 -
+Rule sol89 1989 only - Mar 2 12:12:10s -0:12:10 -
+Rule sol89 1989 only - Mar 3 12:12:00s -0:12:00 -
+Rule sol89 1989 only - Mar 4 12:11:45s -0:11:45 -
+Rule sol89 1989 only - Mar 5 12:11:35s -0:11:35 -
+Rule sol89 1989 only - Mar 6 12:11:20s -0:11:20 -
+Rule sol89 1989 only - Mar 7 12:11:05s -0:11:05 -
+Rule sol89 1989 only - Mar 8 12:10:50s -0:10:50 -
+Rule sol89 1989 only - Mar 9 12:10:35s -0:10:35 -
+Rule sol89 1989 only - Mar 10 12:10:20s -0:10:20 -
+Rule sol89 1989 only - Mar 11 12:10:05s -0:10:05 -
+Rule sol89 1989 only - Mar 12 12:09:50s -0:09:50 -
+Rule sol89 1989 only - Mar 13 12:09:30s -0:09:30 -
+Rule sol89 1989 only - Mar 14 12:09:15s -0:09:15 -
+Rule sol89 1989 only - Mar 15 12:09:00s -0:09:00 -
+Rule sol89 1989 only - Mar 16 12:08:40s -0:08:40 -
+Rule sol89 1989 only - Mar 17 12:08:25s -0:08:25 -
+Rule sol89 1989 only - Mar 18 12:08:05s -0:08:05 -
+Rule sol89 1989 only - Mar 19 12:07:50s -0:07:50 -
+Rule sol89 1989 only - Mar 20 12:07:30s -0:07:30 -
+Rule sol89 1989 only - Mar 21 12:07:15s -0:07:15 -
+Rule sol89 1989 only - Mar 22 12:06:55s -0:06:55 -
+Rule sol89 1989 only - Mar 23 12:06:35s -0:06:35 -
+Rule sol89 1989 only - Mar 24 12:06:20s -0:06:20 -
+Rule sol89 1989 only - Mar 25 12:06:00s -0:06:00 -
+Rule sol89 1989 only - Mar 26 12:05:40s -0:05:40 -
+Rule sol89 1989 only - Mar 27 12:05:25s -0:05:25 -
+Rule sol89 1989 only - Mar 28 12:05:05s -0:05:05 -
+Rule sol89 1989 only - Mar 29 12:04:50s -0:04:50 -
+Rule sol89 1989 only - Mar 30 12:04:30s -0:04:30 -
+Rule sol89 1989 only - Mar 31 12:04:10s -0:04:10 -
+Rule sol89 1989 only - Apr 1 12:03:55s -0:03:55 -
+Rule sol89 1989 only - Apr 2 12:03:35s -0:03:35 -
+Rule sol89 1989 only - Apr 3 12:03:20s -0:03:20 -
+Rule sol89 1989 only - Apr 4 12:03:00s -0:03:00 -
+Rule sol89 1989 only - Apr 5 12:02:45s -0:02:45 -
+Rule sol89 1989 only - Apr 6 12:02:25s -0:02:25 -
+Rule sol89 1989 only - Apr 7 12:02:10s -0:02:10 -
+Rule sol89 1989 only - Apr 8 12:01:50s -0:01:50 -
+Rule sol89 1989 only - Apr 9 12:01:35s -0:01:35 -
+Rule sol89 1989 only - Apr 10 12:01:20s -0:01:20 -
+Rule sol89 1989 only - Apr 11 12:01:05s -0:01:05 -
+Rule sol89 1989 only - Apr 12 12:00:50s -0:00:50 -
+Rule sol89 1989 only - Apr 13 12:00:35s -0:00:35 -
+Rule sol89 1989 only - Apr 14 12:00:20s -0:00:20 -
+Rule sol89 1989 only - Apr 15 12:00:05s -0:00:05 -
+Rule sol89 1989 only - Apr 16 11:59:50s 0:00:10 -
+Rule sol89 1989 only - Apr 17 11:59:35s 0:00:25 -
+Rule sol89 1989 only - Apr 18 11:59:20s 0:00:40 -
+Rule sol89 1989 only - Apr 19 11:59:10s 0:00:50 -
+Rule sol89 1989 only - Apr 20 11:58:55s 0:01:05 -
+Rule sol89 1989 only - Apr 21 11:58:45s 0:01:15 -
+Rule sol89 1989 only - Apr 22 11:58:30s 0:01:30 -
+Rule sol89 1989 only - Apr 23 11:58:20s 0:01:40 -
+Rule sol89 1989 only - Apr 24 11:58:10s 0:01:50 -
+Rule sol89 1989 only - Apr 25 11:58:00s 0:02:00 -
+Rule sol89 1989 only - Apr 26 11:57:50s 0:02:10 -
+Rule sol89 1989 only - Apr 27 11:57:40s 0:02:20 -
+Rule sol89 1989 only - Apr 28 11:57:30s 0:02:30 -
+Rule sol89 1989 only - Apr 29 11:57:20s 0:02:40 -
+Rule sol89 1989 only - Apr 30 11:57:15s 0:02:45 -
+Rule sol89 1989 only - May 1 11:57:05s 0:02:55 -
+Rule sol89 1989 only - May 2 11:57:00s 0:03:00 -
+Rule sol89 1989 only - May 3 11:56:50s 0:03:10 -
+Rule sol89 1989 only - May 4 11:56:45s 0:03:15 -
+Rule sol89 1989 only - May 5 11:56:40s 0:03:20 -
+Rule sol89 1989 only - May 6 11:56:35s 0:03:25 -
+Rule sol89 1989 only - May 7 11:56:30s 0:03:30 -
+Rule sol89 1989 only - May 8 11:56:30s 0:03:30 -
+Rule sol89 1989 only - May 9 11:56:25s 0:03:35 -
+Rule sol89 1989 only - May 10 11:56:25s 0:03:35 -
+Rule sol89 1989 only - May 11 11:56:20s 0:03:40 -
+Rule sol89 1989 only - May 12 11:56:20s 0:03:40 -
+Rule sol89 1989 only - May 13 11:56:20s 0:03:40 -
+Rule sol89 1989 only - May 14 11:56:20s 0:03:40 -
+Rule sol89 1989 only - May 15 11:56:20s 0:03:40 -
+Rule sol89 1989 only - May 16 11:56:20s 0:03:40 -
+Rule sol89 1989 only - May 17 11:56:20s 0:03:40 -
+Rule sol89 1989 only - May 18 11:56:25s 0:03:35 -
+Rule sol89 1989 only - May 19 11:56:25s 0:03:35 -
+Rule sol89 1989 only - May 20 11:56:30s 0:03:30 -
+Rule sol89 1989 only - May 21 11:56:35s 0:03:25 -
+Rule sol89 1989 only - May 22 11:56:35s 0:03:25 -
+Rule sol89 1989 only - May 23 11:56:40s 0:03:20 -
+Rule sol89 1989 only - May 24 11:56:45s 0:03:15 -
+Rule sol89 1989 only - May 25 11:56:55s 0:03:05 -
+Rule sol89 1989 only - May 26 11:57:00s 0:03:00 -
+Rule sol89 1989 only - May 27 11:57:05s 0:02:55 -
+Rule sol89 1989 only - May 28 11:57:15s 0:02:45 -
+Rule sol89 1989 only - May 29 11:57:20s 0:02:40 -
+Rule sol89 1989 only - May 30 11:57:30s 0:02:30 -
+Rule sol89 1989 only - May 31 11:57:35s 0:02:25 -
+Rule sol89 1989 only - Jun 1 11:57:45s 0:02:15 -
+Rule sol89 1989 only - Jun 2 11:57:55s 0:02:05 -
+Rule sol89 1989 only - Jun 3 11:58:05s 0:01:55 -
+Rule sol89 1989 only - Jun 4 11:58:15s 0:01:45 -
+Rule sol89 1989 only - Jun 5 11:58:25s 0:01:35 -
+Rule sol89 1989 only - Jun 6 11:58:35s 0:01:25 -
+Rule sol89 1989 only - Jun 7 11:58:45s 0:01:15 -
+Rule sol89 1989 only - Jun 8 11:59:00s 0:01:00 -
+Rule sol89 1989 only - Jun 9 11:59:10s 0:00:50 -
+Rule sol89 1989 only - Jun 10 11:59:20s 0:00:40 -
+Rule sol89 1989 only - Jun 11 11:59:35s 0:00:25 -
+Rule sol89 1989 only - Jun 12 11:59:45s 0:00:15 -
+Rule sol89 1989 only - Jun 13 12:00:00s 0:00:00 -
+Rule sol89 1989 only - Jun 14 12:00:10s -0:00:10 -
+Rule sol89 1989 only - Jun 15 12:00:25s -0:00:25 -
+Rule sol89 1989 only - Jun 16 12:00:35s -0:00:35 -
+Rule sol89 1989 only - Jun 17 12:00:50s -0:00:50 -
+Rule sol89 1989 only - Jun 18 12:01:05s -0:01:05 -
+Rule sol89 1989 only - Jun 19 12:01:15s -0:01:15 -
+Rule sol89 1989 only - Jun 20 12:01:30s -0:01:30 -
+Rule sol89 1989 only - Jun 21 12:01:40s -0:01:40 -
+Rule sol89 1989 only - Jun 22 12:01:55s -0:01:55 -
+Rule sol89 1989 only - Jun 23 12:02:10s -0:02:10 -
+Rule sol89 1989 only - Jun 24 12:02:20s -0:02:20 -
+Rule sol89 1989 only - Jun 25 12:02:35s -0:02:35 -
+Rule sol89 1989 only - Jun 26 12:02:45s -0:02:45 -
+Rule sol89 1989 only - Jun 27 12:03:00s -0:03:00 -
+Rule sol89 1989 only - Jun 28 12:03:10s -0:03:10 -
+Rule sol89 1989 only - Jun 29 12:03:25s -0:03:25 -
+Rule sol89 1989 only - Jun 30 12:03:35s -0:03:35 -
+Rule sol89 1989 only - Jul 1 12:03:45s -0:03:45 -
+Rule sol89 1989 only - Jul 2 12:04:00s -0:04:00 -
+Rule sol89 1989 only - Jul 3 12:04:10s -0:04:10 -
+Rule sol89 1989 only - Jul 4 12:04:20s -0:04:20 -
+Rule sol89 1989 only - Jul 5 12:04:30s -0:04:30 -
+Rule sol89 1989 only - Jul 6 12:04:40s -0:04:40 -
+Rule sol89 1989 only - Jul 7 12:04:50s -0:04:50 -
+Rule sol89 1989 only - Jul 8 12:05:00s -0:05:00 -
+Rule sol89 1989 only - Jul 9 12:05:10s -0:05:10 -
+Rule sol89 1989 only - Jul 10 12:05:20s -0:05:20 -
+Rule sol89 1989 only - Jul 11 12:05:25s -0:05:25 -
+Rule sol89 1989 only - Jul 12 12:05:35s -0:05:35 -
+Rule sol89 1989 only - Jul 13 12:05:40s -0:05:40 -
+Rule sol89 1989 only - Jul 14 12:05:50s -0:05:50 -
+Rule sol89 1989 only - Jul 15 12:05:55s -0:05:55 -
+Rule sol89 1989 only - Jul 16 12:06:00s -0:06:00 -
+Rule sol89 1989 only - Jul 17 12:06:05s -0:06:05 -
+Rule sol89 1989 only - Jul 18 12:06:10s -0:06:10 -
+Rule sol89 1989 only - Jul 19 12:06:15s -0:06:15 -
+Rule sol89 1989 only - Jul 20 12:06:20s -0:06:20 -
+Rule sol89 1989 only - Jul 21 12:06:20s -0:06:20 -
+Rule sol89 1989 only - Jul 22 12:06:25s -0:06:25 -
+Rule sol89 1989 only - Jul 23 12:06:25s -0:06:25 -
+Rule sol89 1989 only - Jul 24 12:06:30s -0:06:30 -
+Rule sol89 1989 only - Jul 25 12:06:30s -0:06:30 -
+Rule sol89 1989 only - Jul 26 12:06:30s -0:06:30 -
+Rule sol89 1989 only - Jul 27 12:06:30s -0:06:30 -
+Rule sol89 1989 only - Jul 28 12:06:30s -0:06:30 -
+Rule sol89 1989 only - Jul 29 12:06:25s -0:06:25 -
+Rule sol89 1989 only - Jul 30 12:06:25s -0:06:25 -
+Rule sol89 1989 only - Jul 31 12:06:20s -0:06:20 -
+Rule sol89 1989 only - Aug 1 12:06:20s -0:06:20 -
+Rule sol89 1989 only - Aug 2 12:06:15s -0:06:15 -
+Rule sol89 1989 only - Aug 3 12:06:10s -0:06:10 -
+Rule sol89 1989 only - Aug 4 12:06:05s -0:06:05 -
+Rule sol89 1989 only - Aug 5 12:06:00s -0:06:00 -
+Rule sol89 1989 only - Aug 6 12:05:50s -0:05:50 -
+Rule sol89 1989 only - Aug 7 12:05:45s -0:05:45 -
+Rule sol89 1989 only - Aug 8 12:05:35s -0:05:35 -
+Rule sol89 1989 only - Aug 9 12:05:30s -0:05:30 -
+Rule sol89 1989 only - Aug 10 12:05:20s -0:05:20 -
+Rule sol89 1989 only - Aug 11 12:05:10s -0:05:10 -
+Rule sol89 1989 only - Aug 12 12:05:00s -0:05:00 -
+Rule sol89 1989 only - Aug 13 12:04:50s -0:04:50 -
+Rule sol89 1989 only - Aug 14 12:04:40s -0:04:40 -
+Rule sol89 1989 only - Aug 15 12:04:30s -0:04:30 -
+Rule sol89 1989 only - Aug 16 12:04:15s -0:04:15 -
+Rule sol89 1989 only - Aug 17 12:04:05s -0:04:05 -
+Rule sol89 1989 only - Aug 18 12:03:50s -0:03:50 -
+Rule sol89 1989 only - Aug 19 12:03:35s -0:03:35 -
+Rule sol89 1989 only - Aug 20 12:03:25s -0:03:25 -
+Rule sol89 1989 only - Aug 21 12:03:10s -0:03:10 -
+Rule sol89 1989 only - Aug 22 12:02:55s -0:02:55 -
+Rule sol89 1989 only - Aug 23 12:02:40s -0:02:40 -
+Rule sol89 1989 only - Aug 24 12:02:20s -0:02:20 -
+Rule sol89 1989 only - Aug 25 12:02:05s -0:02:05 -
+Rule sol89 1989 only - Aug 26 12:01:50s -0:01:50 -
+Rule sol89 1989 only - Aug 27 12:01:30s -0:01:30 -
+Rule sol89 1989 only - Aug 28 12:01:15s -0:01:15 -
+Rule sol89 1989 only - Aug 29 12:00:55s -0:00:55 -
+Rule sol89 1989 only - Aug 30 12:00:40s -0:00:40 -
+Rule sol89 1989 only - Aug 31 12:00:20s -0:00:20 -
+Rule sol89 1989 only - Sep 1 12:00:00s 0:00:00 -
+Rule sol89 1989 only - Sep 2 11:59:45s 0:00:15 -
+Rule sol89 1989 only - Sep 3 11:59:25s 0:00:35 -
+Rule sol89 1989 only - Sep 4 11:59:05s 0:00:55 -
+Rule sol89 1989 only - Sep 5 11:58:45s 0:01:15 -
+Rule sol89 1989 only - Sep 6 11:58:25s 0:01:35 -
+Rule sol89 1989 only - Sep 7 11:58:05s 0:01:55 -
+Rule sol89 1989 only - Sep 8 11:57:45s 0:02:15 -
+Rule sol89 1989 only - Sep 9 11:57:20s 0:02:40 -
+Rule sol89 1989 only - Sep 10 11:57:00s 0:03:00 -
+Rule sol89 1989 only - Sep 11 11:56:40s 0:03:20 -
+Rule sol89 1989 only - Sep 12 11:56:20s 0:03:40 -
+Rule sol89 1989 only - Sep 13 11:56:00s 0:04:00 -
+Rule sol89 1989 only - Sep 14 11:55:35s 0:04:25 -
+Rule sol89 1989 only - Sep 15 11:55:15s 0:04:45 -
+Rule sol89 1989 only - Sep 16 11:54:55s 0:05:05 -
+Rule sol89 1989 only - Sep 17 11:54:35s 0:05:25 -
+Rule sol89 1989 only - Sep 18 11:54:10s 0:05:50 -
+Rule sol89 1989 only - Sep 19 11:53:50s 0:06:10 -
+Rule sol89 1989 only - Sep 20 11:53:30s 0:06:30 -
+Rule sol89 1989 only - Sep 21 11:53:10s 0:06:50 -
+Rule sol89 1989 only - Sep 22 11:52:45s 0:07:15 -
+Rule sol89 1989 only - Sep 23 11:52:25s 0:07:35 -
+Rule sol89 1989 only - Sep 24 11:52:05s 0:07:55 -
+Rule sol89 1989 only - Sep 25 11:51:45s 0:08:15 -
+Rule sol89 1989 only - Sep 26 11:51:25s 0:08:35 -
+Rule sol89 1989 only - Sep 27 11:51:05s 0:08:55 -
+Rule sol89 1989 only - Sep 28 11:50:40s 0:09:20 -
+Rule sol89 1989 only - Sep 29 11:50:20s 0:09:40 -
+Rule sol89 1989 only - Sep 30 11:50:00s 0:10:00 -
+Rule sol89 1989 only - Oct 1 11:49:45s 0:10:15 -
+Rule sol89 1989 only - Oct 2 11:49:25s 0:10:35 -
+Rule sol89 1989 only - Oct 3 11:49:05s 0:10:55 -
+Rule sol89 1989 only - Oct 4 11:48:45s 0:11:15 -
+Rule sol89 1989 only - Oct 5 11:48:30s 0:11:30 -
+Rule sol89 1989 only - Oct 6 11:48:10s 0:11:50 -
+Rule sol89 1989 only - Oct 7 11:47:50s 0:12:10 -
+Rule sol89 1989 only - Oct 8 11:47:35s 0:12:25 -
+Rule sol89 1989 only - Oct 9 11:47:20s 0:12:40 -
+Rule sol89 1989 only - Oct 10 11:47:00s 0:13:00 -
+Rule sol89 1989 only - Oct 11 11:46:45s 0:13:15 -
+Rule sol89 1989 only - Oct 12 11:46:30s 0:13:30 -
+Rule sol89 1989 only - Oct 13 11:46:15s 0:13:45 -
+Rule sol89 1989 only - Oct 14 11:46:00s 0:14:00 -
+Rule sol89 1989 only - Oct 15 11:45:50s 0:14:10 -
+Rule sol89 1989 only - Oct 16 11:45:35s 0:14:25 -
+Rule sol89 1989 only - Oct 17 11:45:20s 0:14:40 -
+Rule sol89 1989 only - Oct 18 11:45:10s 0:14:50 -
+Rule sol89 1989 only - Oct 19 11:45:00s 0:15:00 -
+Rule sol89 1989 only - Oct 20 11:44:50s 0:15:10 -
+Rule sol89 1989 only - Oct 21 11:44:40s 0:15:20 -
+Rule sol89 1989 only - Oct 22 11:44:30s 0:15:30 -
+Rule sol89 1989 only - Oct 23 11:44:20s 0:15:40 -
+Rule sol89 1989 only - Oct 24 11:44:10s 0:15:50 -
+Rule sol89 1989 only - Oct 25 11:44:05s 0:15:55 -
+Rule sol89 1989 only - Oct 26 11:44:00s 0:16:00 -
+Rule sol89 1989 only - Oct 27 11:43:50s 0:16:10 -
+Rule sol89 1989 only - Oct 28 11:43:45s 0:16:15 -
+Rule sol89 1989 only - Oct 29 11:43:40s 0:16:20 -
+Rule sol89 1989 only - Oct 30 11:43:40s 0:16:20 -
+Rule sol89 1989 only - Oct 31 11:43:35s 0:16:25 -
+Rule sol89 1989 only - Nov 1 11:43:35s 0:16:25 -
+Rule sol89 1989 only - Nov 2 11:43:35s 0:16:25 -
+Rule sol89 1989 only - Nov 3 11:43:30s 0:16:30 -
+Rule sol89 1989 only - Nov 4 11:43:35s 0:16:25 -
+Rule sol89 1989 only - Nov 5 11:43:35s 0:16:25 -
+Rule sol89 1989 only - Nov 6 11:43:35s 0:16:25 -
+Rule sol89 1989 only - Nov 7 11:43:40s 0:16:20 -
+Rule sol89 1989 only - Nov 8 11:43:45s 0:16:15 -
+Rule sol89 1989 only - Nov 9 11:43:50s 0:16:10 -
+Rule sol89 1989 only - Nov 10 11:43:55s 0:16:05 -
+Rule sol89 1989 only - Nov 11 11:44:00s 0:16:00 -
+Rule sol89 1989 only - Nov 12 11:44:05s 0:15:55 -
+Rule sol89 1989 only - Nov 13 11:44:15s 0:15:45 -
+Rule sol89 1989 only - Nov 14 11:44:25s 0:15:35 -
+Rule sol89 1989 only - Nov 15 11:44:35s 0:15:25 -
+Rule sol89 1989 only - Nov 16 11:44:45s 0:15:15 -
+Rule sol89 1989 only - Nov 17 11:44:55s 0:15:05 -
+Rule sol89 1989 only - Nov 18 11:45:10s 0:14:50 -
+Rule sol89 1989 only - Nov 19 11:45:20s 0:14:40 -
+Rule sol89 1989 only - Nov 20 11:45:35s 0:14:25 -
+Rule sol89 1989 only - Nov 21 11:45:50s 0:14:10 -
+Rule sol89 1989 only - Nov 22 11:46:05s 0:13:55 -
+Rule sol89 1989 only - Nov 23 11:46:25s 0:13:35 -
+Rule sol89 1989 only - Nov 24 11:46:40s 0:13:20 -
+Rule sol89 1989 only - Nov 25 11:47:00s 0:13:00 -
+Rule sol89 1989 only - Nov 26 11:47:20s 0:12:40 -
+Rule sol89 1989 only - Nov 27 11:47:35s 0:12:25 -
+Rule sol89 1989 only - Nov 28 11:47:55s 0:12:05 -
+Rule sol89 1989 only - Nov 29 11:48:20s 0:11:40 -
+Rule sol89 1989 only - Nov 30 11:48:40s 0:11:20 -
+Rule sol89 1989 only - Dec 1 11:49:00s 0:11:00 -
+Rule sol89 1989 only - Dec 2 11:49:25s 0:10:35 -
+Rule sol89 1989 only - Dec 3 11:49:50s 0:10:10 -
+Rule sol89 1989 only - Dec 4 11:50:15s 0:09:45 -
+Rule sol89 1989 only - Dec 5 11:50:35s 0:09:25 -
+Rule sol89 1989 only - Dec 6 11:51:00s 0:09:00 -
+Rule sol89 1989 only - Dec 7 11:51:30s 0:08:30 -
+Rule sol89 1989 only - Dec 8 11:51:55s 0:08:05 -
+Rule sol89 1989 only - Dec 9 11:52:20s 0:07:40 -
+Rule sol89 1989 only - Dec 10 11:52:50s 0:07:10 -
+Rule sol89 1989 only - Dec 11 11:53:15s 0:06:45 -
+Rule sol89 1989 only - Dec 12 11:53:45s 0:06:15 -
+Rule sol89 1989 only - Dec 13 11:54:10s 0:05:50 -
+Rule sol89 1989 only - Dec 14 11:54:40s 0:05:20 -
+Rule sol89 1989 only - Dec 15 11:55:10s 0:04:50 -
+Rule sol89 1989 only - Dec 16 11:55:40s 0:04:20 -
+Rule sol89 1989 only - Dec 17 11:56:05s 0:03:55 -
+Rule sol89 1989 only - Dec 18 11:56:35s 0:03:25 -
+Rule sol89 1989 only - Dec 19 11:57:05s 0:02:55 -
+Rule sol89 1989 only - Dec 20 11:57:35s 0:02:25 -
+Rule sol89 1989 only - Dec 21 11:58:05s 0:01:55 -
+Rule sol89 1989 only - Dec 22 11:58:35s 0:01:25 -
+Rule sol89 1989 only - Dec 23 11:59:05s 0:00:55 -
+Rule sol89 1989 only - Dec 24 11:59:35s 0:00:25 -
+Rule sol89 1989 only - Dec 25 12:00:05s -0:00:05 -
+Rule sol89 1989 only - Dec 26 12:00:35s -0:00:35 -
+Rule sol89 1989 only - Dec 27 12:01:05s -0:01:05 -
+Rule sol89 1989 only - Dec 28 12:01:35s -0:01:35 -
+Rule sol89 1989 only - Dec 29 12:02:00s -0:02:00 -
+Rule sol89 1989 only - Dec 30 12:02:30s -0:02:30 -
+Rule sol89 1989 only - Dec 31 12:03:00s -0:03:00 -
+
+# Riyadh is at about 46 degrees 46 minutes East: 3 hrs, 7 mins, 4 secs
+# Before and after 1989, we'll operate on local mean solar time.
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+Zone Asia/Riyadh89 3:07:04 - zzz 1989
+ 3:07:04 sol89 zzz 1990
+ 3:07:04 - zzz
+# For backward compatibility...
+Link Asia/Riyadh89 Mideast/Riyadh89
diff --git a/libkcal/libical/tzdata/southamerica b/libkcal/libical/tzdata/southamerica
new file mode 100644
index 00000000..43f73d32
--- /dev/null
+++ b/libkcal/libical/tzdata/southamerica
@@ -0,0 +1,1259 @@
+# @(#)southamerica 8.19
+# <pre>
+
+# This data is by no means authoritative; if you think you know better,
+# go ahead and edit the file (and please send any changes to
+# tz@elsie.nci.nih.gov for general use in the future).
+
+# From Paul Eggert (2006-03-22):
+# A good source for time zone historical data outside the U.S. is
+# Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition),
+# San Diego: ACS Publications, Inc. (2003).
+#
+# Gwillim Law writes that a good source
+# for recent time zone data is the International Air Transport
+# Association's Standard Schedules Information Manual (IATA SSIM),
+# published semiannually. Law sent in several helpful summaries
+# of the IATA's data after 1990.
+#
+# Except where otherwise noted, Shanks & Pottenger is the source for
+# entries through 1990, and IATA SSIM is the source for entries afterwards.
+#
+# Earlier editions of these tables used the North American style (e.g. ARST and
+# ARDT for Argentine Standard and Daylight Time), but the following quote
+# suggests that it's better to use European style (e.g. ART and ARST).
+# I suggest the use of _Summer time_ instead of the more cumbersome
+# _daylight-saving time_. _Summer time_ seems to be in general use
+# in Europe and South America.
+# -- E O Cutler, _New York Times_ (1937-02-14), quoted in
+# H L Mencken, _The American Language: Supplement I_ (1960), p 466
+#
+# Earlier editions of these tables also used the North American style
+# for time zones in Brazil, but this was incorrect, as Brazilians say
+# "summer time". Reinaldo Goulart, a Sao Paulo businessman active in
+# the railroad sector, writes (1999-07-06):
+# The subject of time zones is currently a matter of discussion/debate in
+# Brazil. Let's say that "the Brasilia time" is considered the
+# "official time" because Brasilia is the capital city.
+# The other three time zones are called "Brasilia time "minus one" or
+# "plus one" or "plus two". As far as I know there is no such
+# name/designation as "Eastern Time" or "Central Time".
+# So I invented the following (English-language) abbreviations for now.
+# Corrections are welcome!
+# std dst
+# -2:00 FNT FNST Fernando de Noronha
+# -3:00 BRT BRST Brasilia
+# -4:00 AMT AMST Amazon
+# -5:00 ACT ACST Acre
+
+###############################################################################
+
+###############################################################################
+
+# Argentina
+
+# From Bob Devine (1988-01-28):
+# Argentina: first Sunday in October to first Sunday in April since 1976.
+# Double Summer time from 1969 to 1974. Switches at midnight.
+
+# From U. S. Naval Observatory (1988-01-199):
+# ARGENTINA 3 H BEHIND UTC
+
+# From Hernan G. Otero (1995-06-26):
+# I am sending modifications to the Argentine time zone table...
+# AR was chosen because they are the ISO letters that represent Argentina.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Arg 1930 only - Dec 1 0:00 1:00 S
+Rule Arg 1931 only - Apr 1 0:00 0 -
+Rule Arg 1931 only - Oct 15 0:00 1:00 S
+Rule Arg 1932 1940 - Mar 1 0:00 0 -
+Rule Arg 1932 1939 - Nov 1 0:00 1:00 S
+Rule Arg 1940 only - Jul 1 0:00 1:00 S
+Rule Arg 1941 only - Jun 15 0:00 0 -
+Rule Arg 1941 only - Oct 15 0:00 1:00 S
+Rule Arg 1943 only - Aug 1 0:00 0 -
+Rule Arg 1943 only - Oct 15 0:00 1:00 S
+Rule Arg 1946 only - Mar 1 0:00 0 -
+Rule Arg 1946 only - Oct 1 0:00 1:00 S
+Rule Arg 1963 only - Oct 1 0:00 0 -
+Rule Arg 1963 only - Dec 15 0:00 1:00 S
+Rule Arg 1964 1966 - Mar 1 0:00 0 -
+Rule Arg 1964 1966 - Oct 15 0:00 1:00 S
+Rule Arg 1967 only - Apr 2 0:00 0 -
+Rule Arg 1967 1968 - Oct Sun>=1 0:00 1:00 S
+Rule Arg 1968 1969 - Apr Sun>=1 0:00 0 -
+Rule Arg 1974 only - Jan 23 0:00 1:00 S
+Rule Arg 1974 only - May 1 0:00 0 -
+Rule Arg 1988 only - Dec 1 0:00 1:00 S
+#
+# From Hernan G. Otero (1995-06-26):
+# These corrections were contributed by InterSoft Argentina S.A.,
+# obtaining the data from the:
+# Talleres de Hidrografia Naval Argentina
+# (Argentine Naval Hydrography Institute)
+Rule Arg 1989 1993 - Mar Sun>=1 0:00 0 -
+Rule Arg 1989 1992 - Oct Sun>=15 0:00 1:00 S
+#
+# From Hernan G. Otero (1995-06-26):
+# From this moment on, the law that mandated the daylight saving
+# time corrections was derogated and no more modifications
+# to the time zones (for daylight saving) are now made.
+#
+# From Rives McDow (2000-01-10):
+# On October 3, 1999, 0:00 local, Argentina implemented daylight savings time,
+# which did not result in the switch of a time zone, as they stayed 9 hours
+# from the International Date Line.
+Rule Arg 1999 only - Oct Sun>=1 0:00 1:00 S
+# From Paul Eggert (2007-12-28):
+# DST was set to expire on March 5, not March 3, but since it was converted
+# to standard time on March 3 it's more convenient for us to pretend that
+# it ended on March 3.
+Rule Arg 2000 only - Mar 3 0:00 0 -
+#
+# From Peter Gradelski via Steffen Thorsen (2000-03-01):
+# We just checked with our Sao Paulo office and they say the government of
+# Argentina decided not to become one of the countries that go on or off DST.
+# So Buenos Aires should be -3 hours from GMT at all times.
+#
+# From Fabian L. Arce Jofre (2000-04-04):
+# The law that claimed DST for Argentina was derogated by President Fernando
+# de la Rua on March 2, 2000, because it would make people spend more energy
+# in the winter time, rather than less. The change took effect on March 3.
+#
+# From Mariano Absatz (2001-06-06):
+# one of the major newspapers here in Argentina said that the 1999
+# Timezone Law (which never was effectively applied) will (would?) be
+# in effect.... The article is at
+# http://ar.clarin.com/diario/2001-06-06/e-01701.htm
+# ... The Law itself is "Ley No 25155", sanctioned on 1999-08-25, enacted
+# 1999-09-17, and published 1999-09-21. The official publication is at:
+# http://www.boletin.jus.gov.ar/BON/Primera/1999/09-Septiembre/21/PDF/BO21-09-99LEG.PDF
+# Regretfully, you have to subscribe (and pay) for the on-line version....
+#
+# (2001-06-12):
+# the timezone for Argentina will not change next Sunday.
+# Apparently it will do so on Sunday 24th....
+# http://ar.clarin.com/diario/2001-06-12/s-03501.htm
+#
+# (2001-06-25):
+# Last Friday (yes, the last working day before the date of the change), the
+# Senate annulled the 1999 law that introduced the changes later postponed.
+# http://www.clarin.com.ar/diario/2001-06-22/s-03601.htm
+# It remains the vote of the Deputies..., but it will be the same....
+# This kind of things had always been done this way in Argentina.
+# We are still -03:00 all year round in all of the country.
+#
+# From Steffen Thorsen (2007-12-21):
+# A user (Leonardo Chaim) reported that Argentina will adopt DST....
+# all of the country (all Zone-entries) are affected. News reports like
+# http://www.lanacion.com.ar/opinion/nota.asp?nota_id=973037 indicate
+# that Argentina will use DST next year as well, from October to
+# March, although exact rules are not given.
+#
+# From Jesper Norgaard Welen (2007-12-26)
+# The last hurdle of Argentina DST is over, the proposal was approved in
+# the lower chamber too (Deputados) with a vote 192 for and 2 against.
+# By the way thanks to Mariano Absatz and Daniel Mario Vega for the link to
+# the original scanned proposal, where the dates and the zero hours are
+# clear and unambiguous...This is the article about final approval:
+# <a href="http://www.lanacion.com.ar/politica/nota.asp?nota_id=973996">
+# http://www.lanacion.com.ar/politica/nota.asp?nota_id=973996
+# </a>
+#
+# From Paul Eggert (2007-12-22):
+# For dates after mid-2008, the following rules are my guesses and
+# are quite possibly wrong, but are more likely than no DST at all.
+Rule Arg 2007 only - Dec 30 0:00 1:00 S
+Rule Arg 2008 max - Mar Sun>=15 0:00 0 -
+Rule Arg 2008 max - Oct Sun>=1 0:00 1:00 S
+
+# From Mariano Absatz (2004-05-21):
+# Today it was officially published that the Province of Mendoza is changing
+# its timezone this winter... starting tomorrow night....
+# http://www.gobernac.mendoza.gov.ar/boletin/pdf/20040521-27158-normas.pdf
+# From Paul Eggert (2004-05-24):
+# It's Law No. 7,210. This change is due to a public power emergency, so for
+# now we'll assume it's for this year only.
+#
+# From Paul Eggert (2006-03-22):
+# <a href="http://www.spicasc.net/horvera.html">
+# Hora de verano para la Republica Argentina (2003-06-08)
+# </a> says that standard time in Argentina from 1894-10-31
+# to 1920-05-01 was -4:16:48.25. Go with this more-precise value
+# over Shanks & Pottenger.
+#
+# From Mariano Absatz (2004-06-05):
+# These media articles from a major newspaper mostly cover the current state:
+# http://www.lanacion.com.ar/04/05/27/de_604825.asp
+# http://www.lanacion.com.ar/04/05/28/de_605203.asp
+#
+# The following eight (8) provinces pulled clocks back to UTC-04:00 at
+# midnight Monday May 31st. (that is, the night between 05/31 and 06/01).
+# Apparently, all nine provinces would go back to UTC-03:00 at the same
+# time in October 17th.
+#
+# Catamarca, Chubut, La Rioja, San Juan, San Luis, Santa Cruz,
+# Tierra del Fuego, Tucuman.
+#
+# From Mariano Absatz (2004-06-14):
+# ... this weekend, the Province of Tucuman decided it'd go back to UTC-03:00
+# yesterday midnight (that is, at 24:00 Saturday 12th), since the people's
+# annoyance with the change is much higher than the power savings obtained....
+#
+# From Gwillim Law (2004-06-14):
+# http://www.lanacion.com.ar/04/06/10/de_609078.asp ...
+# "The time change in Tierra del Fuego was a conflicted decision from
+# the start. The government had decreed that the measure would take
+# effect on June 1, but a normative error forced the new time to begin
+# three days earlier, from a Saturday to a Sunday....
+# Our understanding was that the change was originally scheduled to take place
+# on June 1 at 00:00 in Chubut, Santa Cruz, Tierra del Fuego (and some other
+# provinces). Sunday was May 30, only two days earlier. So the article
+# contains a contradiction. I would give more credence to the Saturday/Sunday
+# date than the "three days earlier" phrase, and conclude that Tierra del
+# Fuego set its clocks back at 2004-05-30 00:00.
+#
+# From Steffen Thorsen (2004-10-05):
+# The previous law 7210 which changed the province of Mendoza's time zone
+# back in May have been modified slightly in a new law 7277, which set the
+# new end date to 2004-09-26 (original date was 2004-10-17).
+# http://www.gobernac.mendoza.gov.ar/boletin/pdf/20040924-27244-normas.pdf
+#
+# From Mariano Absatz (2004-10-05):
+# San Juan changed from UTC-03:00 to UTC-04:00 at midnight between
+# Sunday, May 30th and Monday, May 31st. It changed back to UTC-03:00
+# at midnight between Saturday, July 24th and Sunday, July 25th....
+# http://www.sanjuan.gov.ar/prensa/archivo/000329.html
+# http://www.sanjuan.gov.ar/prensa/archivo/000426.html
+# http://www.sanjuan.gov.ar/prensa/archivo/000441.html
+
+# From Alex Krivenyshev (2008-01-17):
+# Here are articles that Argentina Province San Luis is planning to end DST
+# as earlier as upcoming Monday January 21, 2008 or February 2008:
+#
+# Provincia argentina retrasa reloj y marca diferencia con resto del pais
+# (Argentine Province delayed clock and mark difference with the rest of the
+# country)
+# <a href="http://cl.invertia.com/noticias/noticia.aspx?idNoticia=200801171849_EFE_ET4373&idtel">
+# http://cl.invertia.com/noticias/noticia.aspx?idNoticia=200801171849_EFE_ET4373&idtel
+# </a>
+#
+# Es inminente que en San Luis atrasen una hora los relojes
+# (It is imminent in San Luis clocks one hour delay)
+# <a href="http://www.lagaceta.com.ar/vernotae.asp?id_nota=253414">
+# http://www.lagaceta.com.ar/vernotae.asp?id_nota=253414
+# </a>
+#
+# <a href="http://www.worldtimezone.net/dst_news/dst_news_argentina02.html">
+# http://www.worldtimezone.net/dst_news/dst_news_argentina02.html
+# </a>
+
+# From Jesper Norgaard Welen (2008-01-18):
+# The page of the San Luis provincial government
+# <a href="http://www.sanluis.gov.ar/notas.asp?idCanal=0&id=22812">
+# http://www.sanluis.gov.ar/notas.asp?idCanal=0&id=22812
+# </a>
+# confirms what Alex Krivenyshev has earlier sent to the tz
+# emailing list about that San Luis plans to return to standard
+# time much earlier than the rest of the country. It also
+# confirms that upon request the provinces San Juan and Mendoza
+# refused to follow San Luis in this change.
+#
+# The change is supposed to take place Monday the 21.st at 0:00
+# hours. As far as I understand it if this goes ahead, we need
+# a new timezone for San Luis (although there are also documented
+# independent changes in the southamerica file of San Luis in
+# 1990 and 1991 which has not been confirmed).
+
+# From Jesper Norgaard Welen (2008-01-25):
+# Unfortunately the below page has become defunct, about the San Luis
+# time change. Perhaps because it now is part of a group of pages "Most
+# important pages of 2008."
+#
+# You can use
+# <a href="http://www.sanluis.gov.ar/notas.asp?idCanal=8141&id=22834">
+# http://www.sanluis.gov.ar/notas.asp?idCanal=8141&id=22834
+# </a>
+# instead it seems. Or use "Buscador" from the main page of the San Luis
+# government, and fill in "huso" and click OK, and you will get 3 pages
+# from which the first one is identical to the above.
+
+# From Mariano Absatz (2008-01-28):
+# I can confirm that the Province of San Luis (and so far only that
+# province) decided to go back to UTC-3 effective midnight Jan 20th 2008
+# (that is, Monday 21st at 0:00 is the time the clocks were delayed back
+# 1 hour), and they intend to keep UTC-3 as their timezone all year round
+# (that is, unless they change their mind any minute now).
+#
+# So we'll have to add yet another city to 'southamerica' (I think San
+# Luis city is the mos populated city in the Province, so it'd be
+# America/Argentina/San_Luis... of course I can't remember if San Luis's
+# history of particular changes goes along with Mendoza or San Juan :-(
+# (I only remember not being able to collect hard facts about San Luis
+# back in 2004, when these provinces changed to UTC-4 for a few days, I
+# mailed them personally and never got an answer).
+
+# From Arthur David Olson (2008-03-15):
+# Until there's better information, asssume San Luis was like San Juan
+# rather than Mendoza (since San Juan has a simpler DST history).
+
+# Unless otherwise specified, data are from Shanks & Pottenger through 1992,
+# from the IATA otherwise. As noted below, Shanks & Pottenger say that
+# America/Cordoba split into 6 subregions during 1991/1992, but we
+# haven't verified this yet so for now we'll keep it a single region.
+#
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+#
+# Buenos Aires (BA), Capital Federal (CF),
+Zone America/Argentina/Buenos_Aires -3:53:48 - LMT 1894 Oct 31
+ -4:16:48 - CMT 1920 May # Cordoba Mean Time
+ -4:00 - ART 1930 Dec
+ -4:00 Arg AR%sT 1969 Oct 5
+ -3:00 Arg AR%sT 1999 Oct 3
+ -4:00 Arg AR%sT 2000 Mar 3
+ -3:00 Arg AR%sT
+#
+# Santa Fe (SF), Entre Rios (ER), Corrientes (CN), Misiones (MN), Chaco (CC),
+# Formosa (FM), Salta (SA), Santiago del Estero (SE), Cordoba (CB),
+# San Luis (SL), La Pampa (LP), Neuquen (NQ), Rio Negro (RN)
+#
+# Shanks & Pottenger also make the following claims, which we haven't verified:
+# - Formosa switched to -3:00 on 1991-01-07.
+# - Misiones switched to -3:00 on 1990-12-29.
+# - Chaco switched to -3:00 on 1991-01-04.
+# - San Luis switched to -4:00 on 1990-03-14, then to -3:00 on 1990-10-15,
+# then to -4:00 on 1991-03-01, then to -3:00 on 1991-06-01.
+# - Santiago del Estero switched to -4:00 on 1991-04-01,
+# then to -3:00 on 1991-04-26.
+#
+Zone America/Argentina/Cordoba -4:16:48 - LMT 1894 Oct 31
+ -4:16:48 - CMT 1920 May
+ -4:00 - ART 1930 Dec
+ -4:00 Arg AR%sT 1969 Oct 5
+ -3:00 Arg AR%sT 1991 Mar 3
+ -4:00 - WART 1991 Oct 20
+ -3:00 Arg AR%sT 1999 Oct 3
+ -4:00 Arg AR%sT 2000 Mar 3
+ -3:00 Arg AR%sT
+#
+# Tucuman (TM)
+Zone America/Argentina/Tucuman -4:20:52 - LMT 1894 Oct 31
+ -4:16:48 - CMT 1920 May
+ -4:00 - ART 1930 Dec
+ -4:00 Arg AR%sT 1969 Oct 5
+ -3:00 Arg AR%sT 1991 Mar 3
+ -4:00 - WART 1991 Oct 20
+ -3:00 Arg AR%sT 1999 Oct 3
+ -4:00 Arg AR%sT 2000 Mar 3
+ -3:00 - ART 2004 Jun 1
+ -4:00 - WART 2004 Jun 13
+ -3:00 Arg AR%sT
+#
+# La Rioja (LR)
+Zone America/Argentina/La_Rioja -4:27:24 - LMT 1894 Oct 31
+ -4:16:48 - CMT 1920 May
+ -4:00 - ART 1930 Dec
+ -4:00 Arg AR%sT 1969 Oct 5
+ -3:00 Arg AR%sT 1991 Mar 1
+ -4:00 - WART 1991 May 7
+ -3:00 Arg AR%sT 1999 Oct 3
+ -4:00 Arg AR%sT 2000 Mar 3
+ -3:00 - ART 2004 Jun 1
+ -4:00 - WART 2004 Jun 20
+ -3:00 Arg AR%sT
+#
+# San Juan (SJ)
+Zone America/Argentina/San_Juan -4:34:04 - LMT 1894 Oct 31
+ -4:16:48 - CMT 1920 May
+ -4:00 - ART 1930 Dec
+ -4:00 Arg AR%sT 1969 Oct 5
+ -3:00 Arg AR%sT 1991 Mar 1
+ -4:00 - WART 1991 May 7
+ -3:00 Arg AR%sT 1999 Oct 3
+ -4:00 Arg AR%sT 2000 Mar 3
+ -3:00 - ART 2004 May 31
+ -4:00 - WART 2004 Jul 25
+ -3:00 Arg AR%sT
+#
+# Jujuy (JY)
+Zone America/Argentina/Jujuy -4:21:12 - LMT 1894 Oct 31
+ -4:16:48 - CMT 1920 May
+ -4:00 - ART 1930 Dec
+ -4:00 Arg AR%sT 1969 Oct 5
+ -3:00 Arg AR%sT 1990 Mar 4
+ -4:00 - WART 1990 Oct 28
+ -4:00 1:00 WARST 1991 Mar 17
+ -4:00 - WART 1991 Oct 6
+ -3:00 1:00 ARST 1992
+ -3:00 Arg AR%sT 1999 Oct 3
+ -4:00 Arg AR%sT 2000 Mar 3
+ -3:00 Arg AR%sT
+#
+# Catamarca (CT), Chubut (CH)
+Zone America/Argentina/Catamarca -4:23:08 - LMT 1894 Oct 31
+ -4:16:48 - CMT 1920 May
+ -4:00 - ART 1930 Dec
+ -4:00 Arg AR%sT 1969 Oct 5
+ -3:00 Arg AR%sT 1991 Mar 3
+ -4:00 - WART 1991 Oct 20
+ -3:00 Arg AR%sT 1999 Oct 3
+ -4:00 Arg AR%sT 2000 Mar 3
+ -3:00 - ART 2004 Jun 1
+ -4:00 - WART 2004 Jun 20
+ -3:00 Arg AR%sT
+#
+# Mendoza (MZ)
+Zone America/Argentina/Mendoza -4:35:16 - LMT 1894 Oct 31
+ -4:16:48 - CMT 1920 May
+ -4:00 - ART 1930 Dec
+ -4:00 Arg AR%sT 1969 Oct 5
+ -3:00 Arg AR%sT 1990 Mar 4
+ -4:00 - WART 1990 Oct 15
+ -4:00 1:00 WARST 1991 Mar 1
+ -4:00 - WART 1991 Oct 15
+ -4:00 1:00 WARST 1992 Mar 1
+ -4:00 - WART 1992 Oct 18
+ -3:00 Arg AR%sT 1999 Oct 3
+ -4:00 Arg AR%sT 2000 Mar 3
+ -3:00 - ART 2004 May 23
+ -4:00 - WART 2004 Sep 26
+ -3:00 Arg AR%sT
+#
+# San Luis (SL)
+Zone America/Argentina/San_Luis -4:25:24 - LMT 1894 Oct 31
+ -4:16:48 - CMT 1920 May
+ -4:00 - ART 1930 Dec
+ -4:00 Arg AR%sT 1969 Oct 5
+ -3:00 Arg AR%sT 1991 Mar 1
+ -4:00 - WART 1991 May 7
+ -3:00 Arg AR%sT 1999 Oct 3
+ -4:00 Arg AR%sT 2000 Mar 3
+ -3:00 - ART 2004 May 31
+ -4:00 - WART 2004 Jul 25
+ -3:00 Arg AR%sT 2008 Jan 21
+ -3:00 - ART
+#
+# Santa Cruz (SC)
+Zone America/Argentina/Rio_Gallegos -4:36:52 - LMT 1894 Oct 31
+ -4:16:48 - CMT 1920 May # Cordoba Mean Time
+ -4:00 - ART 1930 Dec
+ -4:00 Arg AR%sT 1969 Oct 5
+ -3:00 Arg AR%sT 1999 Oct 3
+ -4:00 Arg AR%sT 2000 Mar 3
+ -3:00 - ART 2004 Jun 1
+ -4:00 - WART 2004 Jun 20
+ -3:00 Arg AR%sT
+#
+# Tierra del Fuego, Antartida e Islas del Atlantico Sur (TF)
+Zone America/Argentina/Ushuaia -4:33:12 - LMT 1894 Oct 31
+ -4:16:48 - CMT 1920 May # Cordoba Mean Time
+ -4:00 - ART 1930 Dec
+ -4:00 Arg AR%sT 1969 Oct 5
+ -3:00 Arg AR%sT 1999 Oct 3
+ -4:00 Arg AR%sT 2000 Mar 3
+ -3:00 - ART 2004 May 30
+ -4:00 - WART 2004 Jun 20
+ -3:00 Arg AR%sT
+
+# Aruba
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Aruba -4:40:24 - LMT 1912 Feb 12 # Oranjestad
+ -4:30 - ANT 1965 # Netherlands Antilles Time
+ -4:00 - AST
+
+# Bolivia
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/La_Paz -4:32:36 - LMT 1890
+ -4:32:36 - CMT 1931 Oct 15 # Calamarca MT
+ -4:32:36 1:00 BOST 1932 Mar 21 # Bolivia ST
+ -4:00 - BOT # Bolivia Time
+
+# Brazil
+
+# From Paul Eggert (1993-11-18):
+# The mayor of Rio recently attempted to change the time zone rules
+# just in his city, in order to leave more summer time for the tourist trade.
+# The rule change lasted only part of the day;
+# the federal government refused to follow the city's rules, and business
+# was in a chaos, so the mayor backed down that afternoon.
+
+# From IATA SSIM (1996-02):
+# _Only_ the following states in BR1 observe DST: Rio Grande do Sul (RS),
+# Santa Catarina (SC), Parana (PR), Sao Paulo (SP), Rio de Janeiro (RJ),
+# Espirito Santo (ES), Minas Gerais (MG), Bahia (BA), Goias (GO),
+# Distrito Federal (DF), Tocantins (TO), Sergipe [SE] and Alagoas [AL].
+# [The last three states are new to this issue of the IATA SSIM.]
+
+# From Gwillim Law (1996-10-07):
+# Geography, history (Tocantins was part of Goias until 1989), and other
+# sources of time zone information lead me to believe that AL, SE, and TO were
+# always in BR1, and so the only change was whether or not they observed DST....
+# The earliest issue of the SSIM I have is 2/91. Each issue from then until
+# 9/95 says that DST is observed only in the ten states I quoted from 9/95,
+# along with Mato Grosso (MT) and Mato Grosso do Sul (MS), which are in BR2
+# (UTC-4).... The other two time zones given for Brazil are BR3, which is
+# UTC-5, no DST, and applies only in the state of Acre (AC); and BR4, which is
+# UTC-2, and applies to Fernando de Noronha (formerly FN, but I believe it's
+# become part of the state of Pernambuco). The boundary between BR1 and BR2
+# has never been clearly stated. They've simply been called East and West.
+# However, some conclusions can be drawn from another IATA manual: the Airline
+# Coding Directory, which lists close to 400 airports in Brazil. For each
+# airport it gives a time zone which is coded to the SSIM. From that
+# information, I'm led to conclude that the states of Amapa (AP), Ceara (CE),
+# Maranhao (MA), Paraiba (PR), Pernambuco (PE), Piaui (PI), and Rio Grande do
+# Norte (RN), and the eastern part of Para (PA) are all in BR1 without DST.
+
+# From Marcos Tadeu (1998-09-27):
+# <a href="http://pcdsh01.on.br/verao1.html">
+# Brazilian official page
+# </a>
+
+# From Jesper Norgaard (2000-11-03):
+# [For an official list of which regions in Brazil use which time zones, see:]
+# http://pcdsh01.on.br/Fusbr.htm
+# http://pcdsh01.on.br/Fusbrhv.htm
+
+# From Celso Doria via David Madeo (2002-10-09):
+# The reason for the delay this year has to do with elections in Brazil.
+#
+# Unlike in the United States, elections in Brazil are 100% computerized and
+# the results are known almost immediately. Yesterday, it was the first
+# round of the elections when 115 million Brazilians voted for President,
+# Governor, Senators, Federal Deputies, and State Deputies. Nobody is
+# counting (or re-counting) votes anymore and we know there will be a second
+# round for the Presidency and also for some Governors. The 2nd round will
+# take place on October 27th.
+#
+# The reason why the DST will only begin November 3rd is that the thousands
+# of electoral machines used cannot have their time changed, and since the
+# Constitution says the elections must begin at 8:00 AM and end at 5:00 PM,
+# the Government decided to postpone DST, instead of changing the Constitution
+# (maybe, for the next elections, it will be possible to change the clock)...
+
+# From Rodrigo Severo (2004-10-04):
+# It's just the biannual change made necessary by the much hyped, supposedly
+# modern Brazilian eletronic voting machines which, apparently, can't deal
+# with a time change between the first and the second rounds of the elections.
+
+# From Steffen Thorsen (2007-09-20):
+# Brazil will start DST on 2007-10-14 00:00 and end on 2008-02-17 00:00:
+# http://www.mme.gov.br/site/news/detail.do;jsessionid=BBA06811AFCAAC28F0285210913513DA?newsId=13975
+
+# From Paul Eggert (2002-10-10):
+# The official decrees referenced below are mostly taken from
+# <a href="http://pcdsh01.on.br/DecHV.html">
+# Decretos sobre o Horario de Verao no Brasil
+# </a>.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+# Decree <a href="http://pcdsh01.on.br/HV20466.htm">20,466</a> (1931-10-01)
+# Decree <a href="http://pcdsh01.on.br/HV21896.htm">21,896</a> (1932-01-10)
+Rule Brazil 1931 only - Oct 3 11:00 1:00 S
+Rule Brazil 1932 1933 - Apr 1 0:00 0 -
+Rule Brazil 1932 only - Oct 3 0:00 1:00 S
+# Decree <a href="http://pcdsh01.on.br/HV23195.htm">23,195</a> (1933-10-10)
+# revoked DST.
+# Decree <a href="http://pcdsh01.on.br/HV27496.htm">27,496</a> (1949-11-24)
+# Decree <a href="http://pcdsh01.on.br/HV27998.htm">27,998</a> (1950-04-13)
+Rule Brazil 1949 1952 - Dec 1 0:00 1:00 S
+Rule Brazil 1950 only - Apr 16 1:00 0 -
+Rule Brazil 1951 1952 - Apr 1 0:00 0 -
+# Decree <a href="http://pcdsh01.on.br/HV32308.htm">32,308</a> (1953-02-24)
+Rule Brazil 1953 only - Mar 1 0:00 0 -
+# Decree <a href="http://pcdsh01.on.br/HV34724.htm">34,724</a> (1953-11-30)
+# revoked DST.
+# Decree <a href="http://pcdsh01.on.br/HV52700.htm">52,700</a> (1963-10-18)
+# established DST from 1963-10-23 00:00 to 1964-02-29 00:00
+# in SP, RJ, GB, MG, ES, due to the prolongation of the drought.
+# Decree <a href="http://pcdsh01.on.br/HV53071.htm">53,071</a> (1963-12-03)
+# extended the above decree to all of the national territory on 12-09.
+Rule Brazil 1963 only - Dec 9 0:00 1:00 S
+# Decree <a href="http://pcdsh01.on.br/HV53604.htm">53,604</a> (1964-02-25)
+# extended summer time by one day to 1964-03-01 00:00 (start of school).
+Rule Brazil 1964 only - Mar 1 0:00 0 -
+# Decree <a href="http://pcdsh01.on.br/HV55639.htm">55,639</a> (1965-01-27)
+Rule Brazil 1965 only - Jan 31 0:00 1:00 S
+Rule Brazil 1965 only - Mar 31 0:00 0 -
+# Decree <a href="http://pcdsh01.on.br/HV57303.htm">57,303</a> (1965-11-22)
+Rule Brazil 1965 only - Dec 1 0:00 1:00 S
+# Decree <a href="http://pcdsh01.on.br/HV57843.htm">57,843</a> (1966-02-18)
+Rule Brazil 1966 1968 - Mar 1 0:00 0 -
+Rule Brazil 1966 1967 - Nov 1 0:00 1:00 S
+# Decree <a href="http://pcdsh01.on.br/HV63429.htm">63,429</a> (1968-10-15)
+# revoked DST.
+# Decree <a href="http://pcdsh01.on.br/HV91698.htm">91,698</a> (1985-09-27)
+Rule Brazil 1985 only - Nov 2 0:00 1:00 S
+# Decree 92,310 (1986-01-21)
+# Decree 92,463 (1986-03-13)
+Rule Brazil 1986 only - Mar 15 0:00 0 -
+# Decree 93,316 (1986-10-01)
+Rule Brazil 1986 only - Oct 25 0:00 1:00 S
+Rule Brazil 1987 only - Feb 14 0:00 0 -
+# Decree <a href="http://pcdsh01.on.br/HV94922.htm">94,922</a> (1987-09-22)
+Rule Brazil 1987 only - Oct 25 0:00 1:00 S
+Rule Brazil 1988 only - Feb 7 0:00 0 -
+# Decree <a href="http://pcdsh01.on.br/HV96676.htm">96,676</a> (1988-09-12)
+# except for the states of AC, AM, PA, RR, RO, and AP (then a territory)
+Rule Brazil 1988 only - Oct 16 0:00 1:00 S
+Rule Brazil 1989 only - Jan 29 0:00 0 -
+# Decree <a href="http://pcdsh01.on.br/HV98077.htm">98,077</a> (1989-08-21)
+# with the same exceptions
+Rule Brazil 1989 only - Oct 15 0:00 1:00 S
+Rule Brazil 1990 only - Feb 11 0:00 0 -
+# Decree <a href="http://pcdsh01.on.br/HV99530.htm">99,530</a> (1990-09-17)
+# adopted by RS, SC, PR, SP, RJ, ES, MG, GO, MS, DF.
+# Decree 99,629 (1990-10-19) adds BA, MT.
+Rule Brazil 1990 only - Oct 21 0:00 1:00 S
+Rule Brazil 1991 only - Feb 17 0:00 0 -
+# <a href="http://pcdsh01.on.br/HV1991.htm">Unnumbered decree</a> (1991-09-25)
+# adopted by RS, SC, PR, SP, RJ, ES, MG, BA, GO, MT, MS, DF.
+Rule Brazil 1991 only - Oct 20 0:00 1:00 S
+Rule Brazil 1992 only - Feb 9 0:00 0 -
+# <a href="http://pcdsh01.on.br/HV1992.htm">Unnumbered decree</a> (1992-10-16)
+# adopted by same states.
+Rule Brazil 1992 only - Oct 25 0:00 1:00 S
+Rule Brazil 1993 only - Jan 31 0:00 0 -
+# Decree <a href="http://pcdsh01.on.br/HV942.htm">942</a> (1993-09-28)
+# adopted by same states, plus AM.
+# Decree <a href="http://pcdsh01.on.br/HV1252.htm">1,252</a> (1994-09-22;
+# web page corrected 2004-01-07) adopted by same states, minus AM.
+# Decree <a href="http://pcdsh01.on.br/HV1636.htm">1,636</a> (1995-09-14)
+# adopted by same states, plus MT and TO.
+# Decree <a href="http://pcdsh01.on.br/HV1674.htm">1,674</a> (1995-10-13)
+# adds AL, SE.
+Rule Brazil 1993 1995 - Oct Sun>=11 0:00 1:00 S
+Rule Brazil 1994 1995 - Feb Sun>=15 0:00 0 -
+Rule Brazil 1996 only - Feb 11 0:00 0 -
+# Decree <a href="http://pcdsh01.on.br/HV2000.htm">2,000</a> (1996-09-04)
+# adopted by same states, minus AL, SE.
+Rule Brazil 1996 only - Oct 6 0:00 1:00 S
+Rule Brazil 1997 only - Feb 16 0:00 0 -
+# From Daniel C. Sobral (1998-02-12):
+# In 1997, the DS began on October 6. The stated reason was that
+# because international television networks ignored Brazil's policy on DS,
+# they bought the wrong times on satellite for coverage of Pope's visit.
+# This year, the ending date of DS was postponed to March 1
+# to help dealing with the shortages of electric power.
+#
+# Decree 2,317 (1997-09-04), adopted by same states.
+Rule Brazil 1997 only - Oct 6 0:00 1:00 S
+# Decree <a href="http://pcdsh01.on.br/figuras/HV2495.JPG">2,495</a>
+# (1998-02-10)
+Rule Brazil 1998 only - Mar 1 0:00 0 -
+# Decree <a href="http://pcdsh01.on.br/figuras/Hv98.jpg">2,780</a> (1998-09-11)
+# adopted by the same states as before.
+Rule Brazil 1998 only - Oct 11 0:00 1:00 S
+Rule Brazil 1999 only - Feb 21 0:00 0 -
+# Decree <a href="http://pcdsh01.on.br/figuras/HV3150.gif">3,150</a>
+# (1999-08-23) adopted by same states.
+# Decree <a href="http://pcdsh01.on.br/DecHV99.gif">3,188</a> (1999-09-30)
+# adds SE, AL, PB, PE, RN, CE, PI, MA and RR.
+Rule Brazil 1999 only - Oct 3 0:00 1:00 S
+Rule Brazil 2000 only - Feb 27 0:00 0 -
+# Decree <a href="http://pcdsh01.on.br/DEC3592.htm">3,592</a> (2000-09-06)
+# adopted by the same states as before.
+# Decree <a href="http://pcdsh01.on.br/Dec3630.jpg">3,630</a> (2000-10-13)
+# repeals DST in PE and RR, effective 2000-10-15 00:00.
+# Decree <a href="http://pcdsh01.on.br/Dec3632.jpg">3,632</a> (2000-10-17)
+# repeals DST in SE, AL, PB, RN, CE, PI and MA, effective 2000-10-22 00:00.
+# Decree <a href="http://pcdsh01.on.br/figuras/HV3916.gif">3,916</a>
+# (2001-09-13) reestablishes DST in AL, CE, MA, PB, PE, PI, RN, SE.
+Rule Brazil 2000 2001 - Oct Sun>=8 0:00 1:00 S
+Rule Brazil 2001 2006 - Feb Sun>=15 0:00 0 -
+# Decree 4,399 (2002-10-01) repeals DST in AL, CE, MA, PB, PE, PI, RN, SE.
+# <a href="http://www.presidencia.gov.br/CCIVIL/decreto/2002/D4399.htm"></a>
+Rule Brazil 2002 only - Nov 3 0:00 1:00 S
+# Decree 4,844 (2003-09-24; corrected 2003-09-26) repeals DST in BA, MT, TO.
+# <a href="http://www.presidencia.gov.br/CCIVIL/decreto/2003/D4844.htm"></a>
+Rule Brazil 2003 only - Oct 19 0:00 1:00 S
+# Decree 5,223 (2004-10-01) reestablishes DST in MT.
+# <a href="http://www.planalto.gov.br/ccivil_03/_Ato2004-2006/2004/Decreto/D5223.htm"></a>
+Rule Brazil 2004 only - Nov 2 0:00 1:00 S
+# Decree <a href="http://pcdsh01.on.br/DecHV5539.gif">5,539</a> (2005-09-19),
+# adopted by the same states as before.
+Rule Brazil 2005 only - Oct 16 0:00 1:00 S
+# Decree <a href="http://pcdsh01.on.br/DecHV5920.gif">5,920</a> (2006-10-03),
+# adopted by the same states as before.
+Rule Brazil 2006 only - Nov 5 0:00 1:00 S
+Rule Brazil 2007 only - Feb 25 0:00 0 -
+# (Decree number not yet known)
+# http://www.brasil.gov.br/noticias/ultimas_noticias/horario_verao070920/
+# (2007-09-20) after a heads-up from Steffen Thorsen:
+Rule Brazil 2007 max - Oct Sun>=8 0:00 1:00 S
+Rule Brazil 2008 max - Feb Sun>=15 0:00 0 -
+# The latest ruleset listed above says that the following states observe DST:
+# DF, ES, GO, MG, MS, MT, PR, RJ, RS, SC, SP.
+# For dates after mid-2008, the above rules with TO="max" are guesses
+# and are quite possibly wrong, but are more likely than no DST at all.
+
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+#
+# Fernando de Noronha (administratively part of PE)
+Zone America/Noronha -2:09:40 - LMT 1914
+ -2:00 Brazil FN%sT 1990 Sep 17
+ -2:00 - FNT 1999 Sep 30
+ -2:00 Brazil FN%sT 2000 Oct 15
+ -2:00 - FNT 2001 Sep 13
+ -2:00 Brazil FN%sT 2002 Oct 1
+ -2:00 - FNT
+# Other Atlantic islands have no permanent settlement.
+# These include Trindade and Martin Vaz (administratively part of ES),
+# Atol das Rocas (RN), and Penedos de Sao Pedro e Sao Paulo (PE).
+# Fernando de Noronha was a separate territory from 1942-09-02 to 1989-01-01;
+# it also included the Penedos.
+#
+# Amapa (AP), east Para (PA)
+# East Para includes Belem, Maraba, Serra Norte, and Sao Felix do Xingu.
+# The division between east and west Para is the river Xingu.
+# In the north a very small part from the river Javary (now Jari I guess,
+# the border with Amapa) to the Amazon, then to the Xingu.
+Zone America/Belem -3:13:56 - LMT 1914
+ -3:00 Brazil BR%sT 1988 Sep 12
+ -3:00 - BRT
+#
+# Maranhao (MA), Piaui (PI), Ceara (CE), Rio Grande do Norte (RN),
+# Paraiba (PB)
+Zone America/Fortaleza -2:34:00 - LMT 1914
+ -3:00 Brazil BR%sT 1990 Sep 17
+ -3:00 - BRT 1999 Sep 30
+ -3:00 Brazil BR%sT 2000 Oct 22
+ -3:00 - BRT 2001 Sep 13
+ -3:00 Brazil BR%sT 2002 Oct 1
+ -3:00 - BRT
+#
+# Pernambuco (PE) (except Atlantic islands)
+Zone America/Recife -2:19:36 - LMT 1914
+ -3:00 Brazil BR%sT 1990 Sep 17
+ -3:00 - BRT 1999 Sep 30
+ -3:00 Brazil BR%sT 2000 Oct 15
+ -3:00 - BRT 2001 Sep 13
+ -3:00 Brazil BR%sT 2002 Oct 1
+ -3:00 - BRT
+#
+# Tocantins (TO)
+Zone America/Araguaina -3:12:48 - LMT 1914
+ -3:00 Brazil BR%sT 1990 Sep 17
+ -3:00 - BRT 1995 Sep 14
+ -3:00 Brazil BR%sT 2003 Sep 24
+ -3:00 - BRT
+#
+# Alagoas (AL), Sergipe (SE)
+Zone America/Maceio -2:22:52 - LMT 1914
+ -3:00 Brazil BR%sT 1990 Sep 17
+ -3:00 - BRT 1995 Oct 13
+ -3:00 Brazil BR%sT 1996 Sep 4
+ -3:00 - BRT 1999 Sep 30
+ -3:00 Brazil BR%sT 2000 Oct 22
+ -3:00 - BRT 2001 Sep 13
+ -3:00 Brazil BR%sT 2002 Oct 1
+ -3:00 - BRT
+#
+# Bahia (BA)
+# There are too many Salvadors elsewhere, so use America/Bahia instead
+# of America/Salvador.
+Zone America/Bahia -2:34:04 - LMT 1914
+ -3:00 Brazil BR%sT 2003 Sep 24
+ -3:00 - BRT
+#
+# Goias (GO), Distrito Federal (DF), Minas Gerais (MG),
+# Espirito Santo (ES), Rio de Janeiro (RJ), Sao Paulo (SP), Parana (PR),
+# Santa Catarina (SC), Rio Grande do Sul (RS)
+Zone America/Sao_Paulo -3:06:28 - LMT 1914
+ -3:00 Brazil BR%sT 1963 Oct 23 00:00
+ -3:00 1:00 BRST 1964
+ -3:00 Brazil BR%sT
+#
+# Mato Grosso do Sul (MS)
+Zone America/Campo_Grande -3:38:28 - LMT 1914
+ -4:00 Brazil AM%sT
+#
+# Mato Grosso (MT)
+Zone America/Cuiaba -3:44:20 - LMT 1914
+ -4:00 Brazil AM%sT 2003 Sep 24
+ -4:00 - AMT 2004 Oct 1
+ -4:00 Brazil AM%sT
+#
+# west Para (PA), Rondonia (RO)
+# West Para includes Altamira, Oribidos, Prainha, Oriximina, and Santarem.
+Zone America/Porto_Velho -4:15:36 - LMT 1914
+ -4:00 Brazil AM%sT 1988 Sep 12
+ -4:00 - AMT
+#
+# Roraima (RR)
+Zone America/Boa_Vista -4:02:40 - LMT 1914
+ -4:00 Brazil AM%sT 1988 Sep 12
+ -4:00 - AMT 1999 Sep 30
+ -4:00 Brazil AM%sT 2000 Oct 15
+ -4:00 - AMT
+#
+# east Amazonas (AM): Boca do Acre, Jutai, Manaus, Floriano Peixoto
+# The great circle line from Tabatinga to Porto Acre divides
+# east from west Amazonas.
+Zone America/Manaus -4:00:04 - LMT 1914
+ -4:00 Brazil AM%sT 1988 Sep 12
+ -4:00 - AMT 1993 Sep 28
+ -4:00 Brazil AM%sT 1994 Sep 22
+ -4:00 - AMT
+#
+# west Amazonas (AM): Atalaia do Norte, Boca do Maoco, Benjamin Constant,
+# Eirunepe, Envira, Ipixuna
+Zone America/Eirunepe -4:39:28 - LMT 1914
+ -5:00 Brazil AC%sT 1988 Sep 12
+ -5:00 - ACT 1993 Sep 28
+ -5:00 Brazil AC%sT 1994 Sep 22
+ -5:00 - ACT
+#
+# Acre (AC)
+Zone America/Rio_Branco -4:31:12 - LMT 1914
+ -5:00 Brazil AC%sT 1988 Sep 12
+ -5:00 - ACT
+
+
+# Chile
+
+# From Eduardo Krell (1995-10-19):
+# The law says to switch to DST at midnight [24:00] on the second SATURDAY
+# of October.... The law is the same for March and October.
+# (1998-09-29):
+# Because of the drought this year, the government decided to go into
+# DST earlier (saturday 9/26 at 24:00). This is a one-time change only ...
+# (unless there's another dry season next year, I guess).
+
+# From Julio I. Pacheco Troncoso (1999-03-18):
+# Because of the same drought, the government decided to end DST later,
+# on April 3, (one-time change).
+
+# From Oscar van Vlijmen (2006-10-08):
+# http://www.horaoficial.cl/cambio.htm
+
+# From Jesper Norgaard Welen (2006-10-08):
+# I think that there are some obvious mistakes in the suggested link
+# from Oscar van Vlijmen,... for instance entry 66 says that GMT-4
+# ended 1990-09-12 while entry 67 only begins GMT-3 at 1990-09-15
+# (they should have been 1990-09-15 and 1990-09-16 respectively), but
+# anyhow it clears up some doubts too.
+
+# From Paul Eggert (2006-12-27):
+# The following data for Chile and America/Santiago are from
+# <http://www.horaoficial.cl/horaof.htm> (2006-09-20), transcribed by
+# Jesper Norgaard Welen. The data for Pacific/Easter are from Shanks
+# & Pottenger, except with DST transitions after 1932 cloned from
+# America/Santiago. The pre-1980 Pacific/Easter data are dubious,
+# but we have no other source.
+
+# From German Poo-Caaman~o (2008-03-03):
+# Due to drought, Chile extends Daylight Time in three weeks. This
+# is one-time change (Saturday 3/29 at 24:00 for America/Santiago
+# and Saturday 3/29 at 22:00 for Pacific/Easter)
+# The Supreme Decree is located at
+# <a href="http://www.shoa.cl/servicios/supremo316.pdf">
+# http://www.shoa.cl/servicios/supremo316.pdf
+# </a>
+# and the instructions for 2008 are located in:
+# <a href="http://www.horaoficial.cl/cambio.htm">
+# http://www.horaoficial.cl/cambio.htm
+# </a>.
+
+# From José Miguel Garrido (2008-03-05):
+# ...
+# You could see the announces of the change on
+# <a href="http://www.shoa.cl/noticias/2008/04hora/hora.htm">
+# http://www.shoa.cl/noticias/2008/04hora/hora.htm
+# </a>.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Chile 1927 1932 - Sep 1 0:00 1:00 S
+Rule Chile 1928 1932 - Apr 1 0:00 0 -
+Rule Chile 1942 only - Jun 1 4:00u 0 -
+Rule Chile 1942 only - Aug 1 5:00u 1:00 S
+Rule Chile 1946 only - Jul 15 4:00u 1:00 S
+Rule Chile 1946 only - Sep 1 3:00u 0:00 -
+Rule Chile 1947 only - Apr 1 4:00u 0 -
+Rule Chile 1968 only - Nov 3 4:00u 1:00 S
+Rule Chile 1969 only - Mar 30 3:00u 0 -
+Rule Chile 1969 only - Nov 23 4:00u 1:00 S
+Rule Chile 1970 only - Mar 29 3:00u 0 -
+Rule Chile 1971 only - Mar 14 3:00u 0 -
+Rule Chile 1970 1972 - Oct Sun>=9 4:00u 1:00 S
+Rule Chile 1972 1986 - Mar Sun>=9 3:00u 0 -
+Rule Chile 1973 only - Sep 30 4:00u 1:00 S
+Rule Chile 1974 1987 - Oct Sun>=9 4:00u 1:00 S
+Rule Chile 1987 only - Apr 12 3:00u 0 -
+Rule Chile 1988 1989 - Mar Sun>=9 3:00u 0 -
+Rule Chile 1988 only - Oct Sun>=1 4:00u 1:00 S
+Rule Chile 1989 only - Oct Sun>=9 4:00u 1:00 S
+Rule Chile 1990 only - Mar 18 3:00u 0 -
+Rule Chile 1990 only - Sep 16 4:00u 1:00 S
+Rule Chile 1991 1996 - Mar Sun>=9 3:00u 0 -
+Rule Chile 1991 1997 - Oct Sun>=9 4:00u 1:00 S
+Rule Chile 1997 only - Mar 30 3:00u 0 -
+Rule Chile 1998 only - Mar Sun>=9 3:00u 0 -
+Rule Chile 1998 only - Sep 27 4:00u 1:00 S
+Rule Chile 1999 only - Apr 4 3:00u 0 -
+Rule Chile 1999 max - Oct Sun>=9 4:00u 1:00 S
+Rule Chile 2000 2007 - Mar Sun>=9 3:00u 0 -
+# N.B.: the end of March 29 in Chile is March 30 in Universal time,
+# which is used below in specifying the transition.
+Rule Chile 2008 only - Mar 30 3:00u 0 -
+Rule Chile 2009 max - Mar Sun>=9 3:00u 0 -
+# IATA SSIM anomalies: (1992-02) says 1992-03-14;
+# (1996-09) says 1998-03-08. Ignore these.
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Santiago -4:42:46 - LMT 1890
+ -4:42:46 - SMT 1910 # Santiago Mean Time
+ -5:00 - CLT 1916 Jul 1 # Chile Time
+ -4:42:46 - SMT 1918 Sep 1 # Santiago Mean Time
+ -4:00 - CLT 1919 Jul 1 # Chile Time
+ -4:42:46 - SMT 1927 Sep 1 # Santiago Mean Time
+ -5:00 Chile CL%sT 1947 May 22 # Chile Time
+ -4:00 Chile CL%sT
+Zone Pacific/Easter -7:17:44 - LMT 1890
+ -7:17:28 - EMT 1932 Sep # Easter Mean Time
+ -7:00 Chile EAS%sT 1982 Mar 13 21:00 # Easter I Time
+ -6:00 Chile EAS%sT
+#
+# Sala y Gomez Island is like Pacific/Easter.
+# Other Chilean locations, including Juan Fernandez Is, San Ambrosio,
+# San Felix, and Antarctic bases, are like America/Santiago.
+
+# Colombia
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule CO 1992 only - May 3 0:00 1:00 S
+Rule CO 1993 only - Apr 4 0:00 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Bogota -4:56:20 - LMT 1884 Mar 13
+ -4:56:20 - BMT 1914 Nov 23 # Bogota Mean Time
+ -5:00 CO CO%sT # Colombia Time
+# Malpelo, Providencia, San Andres
+# no information; probably like America/Bogota
+
+# Curacao
+#
+# From Paul Eggert (2006-03-22):
+# Shanks & Pottenger say that The Bottom and Philipsburg have been at
+# -4:00 since standard time was introduced on 1912-03-02; and that
+# Kralendijk and Rincon used Kralendijk Mean Time (-4:33:08) from
+# 1912-02-02 to 1965-01-01. The former is dubious, since S&P also say
+# Saba Island has been like Curacao.
+# This all predates our 1970 cutoff, though.
+#
+# By July 2007 Curacao and St Maarten are planned to become
+# associated states within the Netherlands, much like Aruba;
+# Bonaire, Saba and St Eustatius would become directly part of the
+# Netherlands as Kingdom Islands. This won't affect their time zones
+# though, as far as we know.
+#
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Curacao -4:35:44 - LMT 1912 Feb 12 # Willemstad
+ -4:30 - ANT 1965 # Netherlands Antilles Time
+ -4:00 - AST
+
+# Ecuador
+#
+# From Paul Eggert (2007-03-04):
+# Apparently Ecuador had a failed experiment with DST in 1992.
+# <http://midena.gov.ec/content/view/1261/208/> (2007-02-27) and
+# <http://www.hoy.com.ec/NoticiaNue.asp?row_id=249856> (2006-11-06) both
+# talk about "hora Sixto". Leave this alone for now, as we have no data.
+#
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Guayaquil -5:19:20 - LMT 1890
+ -5:14:00 - QMT 1931 # Quito Mean Time
+ -5:00 - ECT # Ecuador Time
+Zone Pacific/Galapagos -5:58:24 - LMT 1931 # Puerto Baquerizo Moreno
+ -5:00 - ECT 1986
+ -6:00 - GALT # Galapagos Time
+
+# Falklands
+
+# From Paul Eggert (2006-03-22):
+# Between 1990 and 2000 inclusive, Shanks & Pottenger and the IATA agree except
+# the IATA gives 1996-09-08. Go with Shanks & Pottenger.
+
+# From Falkland Islands Government Office, London (2001-01-22)
+# via Jesper Norgaard:
+# ... the clocks revert back to Local Mean Time at 2 am on Sunday 15
+# April 2001 and advance one hour to summer time at 2 am on Sunday 2
+# September. It is anticipated that the clocks will revert back at 2
+# am on Sunday 21 April 2002 and advance to summer time at 2 am on
+# Sunday 1 September.
+
+# From Rives McDow (2001-02-13):
+#
+# I have communicated several times with people there, and the last
+# time I had communications that was helpful was in 1998. Here is
+# what was said then:
+#
+# "The general rule was that Stanley used daylight saving and the Camp
+# did not. However for various reasons many people in the Camp have
+# started to use daylight saving (known locally as 'Stanley Time')
+# There is no rule as to who uses daylight saving - it is a matter of
+# personal choice and so it is impossible to draw a map showing who
+# uses it and who does not. Any list would be out of date as soon as
+# it was produced. This year daylight saving ended on April 18/19th
+# and started again on September 12/13th. I do not know what the rule
+# is, but can find out if you like. We do not change at the same time
+# as UK or Chile."
+#
+# I did have in my notes that the rule was "Second Saturday in Sep at
+# 0:00 until third Saturday in Apr at 0:00". I think that this does
+# not agree in some cases with Shanks; is this true?
+#
+# Also, there is no mention in the list that some areas in the
+# Falklands do not use DST. I have found in my communications there
+# that these areas are on the western half of East Falkland and all of
+# West Falkland. Stanley is the only place that consistently observes
+# DST. Again, as in other places in the world, the farmers don't like
+# it. West Falkland is almost entirely sheep farmers.
+#
+# I know one lady there that keeps a list of which farm keeps DST and
+# which doesn't each year. She runs a shop in Stanley, and says that
+# the list changes each year. She uses it to communicate to her
+# customers, catching them when they are home for lunch or dinner.
+
+# From Paul Eggert (2001-03-05):
+# For now, we'll just record the time in Stanley, since we have no
+# better info.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Falk 1937 1938 - Sep lastSun 0:00 1:00 S
+Rule Falk 1938 1942 - Mar Sun>=19 0:00 0 -
+Rule Falk 1939 only - Oct 1 0:00 1:00 S
+Rule Falk 1940 1942 - Sep lastSun 0:00 1:00 S
+Rule Falk 1943 only - Jan 1 0:00 0 -
+Rule Falk 1983 only - Sep lastSun 0:00 1:00 S
+Rule Falk 1984 1985 - Apr lastSun 0:00 0 -
+Rule Falk 1984 only - Sep 16 0:00 1:00 S
+Rule Falk 1985 2000 - Sep Sun>=9 0:00 1:00 S
+Rule Falk 1986 2000 - Apr Sun>=16 0:00 0 -
+Rule Falk 2001 max - Apr Sun>=15 2:00 0 -
+Rule Falk 2001 max - Sep Sun>=1 2:00 1:00 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Atlantic/Stanley -3:51:24 - LMT 1890
+ -3:51:24 - SMT 1912 Mar 12 # Stanley Mean Time
+ -4:00 Falk FK%sT 1983 May # Falkland Is Time
+ -3:00 Falk FK%sT 1985 Sep 15
+ -4:00 Falk FK%sT
+
+# French Guiana
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Cayenne -3:29:20 - LMT 1911 Jul
+ -4:00 - GFT 1967 Oct # French Guiana Time
+ -3:00 - GFT
+
+# Guyana
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Guyana -3:52:40 - LMT 1915 Mar # Georgetown
+ -3:45 - GBGT 1966 May 26 # Br Guiana Time
+ -3:45 - GYT 1975 Jul 31 # Guyana Time
+ -3:00 - GYT 1991
+# IATA SSIM (1996-06) says -4:00. Assume a 1991 switch.
+ -4:00 - GYT
+
+# Paraguay
+# From Paul Eggert (2006-03-22):
+# Shanks & Pottenger say that spring transitions are from 01:00 -> 02:00,
+# and autumn transitions are from 00:00 -> 23:00. Go with pre-1999
+# editions of Shanks, and with the IATA, who say transitions occur at 00:00.
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Para 1975 1988 - Oct 1 0:00 1:00 S
+Rule Para 1975 1978 - Mar 1 0:00 0 -
+Rule Para 1979 1991 - Apr 1 0:00 0 -
+Rule Para 1989 only - Oct 22 0:00 1:00 S
+Rule Para 1990 only - Oct 1 0:00 1:00 S
+Rule Para 1991 only - Oct 6 0:00 1:00 S
+Rule Para 1992 only - Mar 1 0:00 0 -
+Rule Para 1992 only - Oct 5 0:00 1:00 S
+Rule Para 1993 only - Mar 31 0:00 0 -
+Rule Para 1993 1995 - Oct 1 0:00 1:00 S
+Rule Para 1994 1995 - Feb lastSun 0:00 0 -
+Rule Para 1996 only - Mar 1 0:00 0 -
+# IATA SSIM (2000-02) says 1999-10-10; ignore this for now.
+# From Steffen Thorsen (2000-10-02):
+# I have three independent reports that Paraguay changed to DST this Sunday
+# (10-01).
+#
+# Translated by Gwillim Law (2001-02-27) from
+# <a href="http://www.diarionoticias.com.py/011000/nacional/naciona1.htm">
+# Noticias, a daily paper in Asuncion, Paraguay (2000-10-01)
+# </a>:
+# Starting at 0:00 today, the clock will be set forward 60 minutes, in
+# fulfillment of Decree No. 7,273 of the Executive Power.... The time change
+# system has been operating for several years. Formerly there was a separate
+# decree each year; the new law has the same effect, but permanently. Every
+# year, the time will change on the first Sunday of October; likewise, the
+# clock will be set back on the first Sunday of March.
+#
+Rule Para 1996 2001 - Oct Sun>=1 0:00 1:00 S
+# IATA SSIM (1997-09) says Mar 1; go with Shanks & Pottenger.
+Rule Para 1997 only - Feb lastSun 0:00 0 -
+# Shanks & Pottenger say 1999-02-28; IATA SSIM (1999-02) says 1999-02-27, but
+# (1999-09) reports no date; go with above sources and Gerd Knops (2001-02-27).
+Rule Para 1998 2001 - Mar Sun>=1 0:00 0 -
+# From Rives McDow (2002-02-28):
+# A decree was issued in Paraguay (no. 16350) on 2002-02-26 that changed the
+# dst method to be from the first Sunday in September to the first Sunday in
+# April.
+Rule Para 2002 2004 - Apr Sun>=1 0:00 0 -
+Rule Para 2002 2003 - Sep Sun>=1 0:00 1:00 S
+#
+# From Jesper Norgaard Welen (2005-01-02):
+# There are several sources that claim that Paraguay made
+# a timezone rule change in autumn 2004.
+# From Steffen Thorsen (2005-01-05):
+# Decree 1,867 (2004-03-05)
+# From Carlos Raul Perasso via Jesper Norgaard Welen (2006-10-13)
+# <http://www.presidencia.gov.py/decretos/D1867.pdf>
+Rule Para 2004 max - Oct Sun>=15 0:00 1:00 S
+Rule Para 2005 max - Mar Sun>=8 0:00 0 -
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Asuncion -3:50:40 - LMT 1890
+ -3:50:40 - AMT 1931 Oct 10 # Asuncion Mean Time
+ -4:00 - PYT 1972 Oct # Paraguay Time
+ -3:00 - PYT 1974 Apr
+ -4:00 Para PY%sT
+
+# Peru
+#
+# <a href="news:xrGmb.39935$gA1.13896113@news4.srv.hcvlny.cv.net">
+# From Evelyn C. Leeper via Mark Brader (2003-10-26):</a>
+# When we were in Peru in 1985-1986, they apparently switched over
+# sometime between December 29 and January 3 while we were on the Amazon.
+#
+# From Paul Eggert (2006-03-22):
+# Shanks & Pottenger don't have this transition. Assume 1986 was like 1987.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Peru 1938 only - Jan 1 0:00 1:00 S
+Rule Peru 1938 only - Apr 1 0:00 0 -
+Rule Peru 1938 1939 - Sep lastSun 0:00 1:00 S
+Rule Peru 1939 1940 - Mar Sun>=24 0:00 0 -
+Rule Peru 1986 1987 - Jan 1 0:00 1:00 S
+Rule Peru 1986 1987 - Apr 1 0:00 0 -
+Rule Peru 1990 only - Jan 1 0:00 1:00 S
+Rule Peru 1990 only - Apr 1 0:00 0 -
+# IATA is ambiguous for 1993/1995; go with Shanks & Pottenger.
+Rule Peru 1994 only - Jan 1 0:00 1:00 S
+Rule Peru 1994 only - Apr 1 0:00 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Lima -5:08:12 - LMT 1890
+ -5:08:36 - LMT 1908 Jul 28 # Lima Mean Time?
+ -5:00 Peru PE%sT # Peru Time
+
+# South Georgia
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Atlantic/South_Georgia -2:26:08 - LMT 1890 # Grytviken
+ -2:00 - GST # South Georgia Time
+
+# South Sandwich Is
+# uninhabited; scientific personnel have wintered
+
+# Suriname
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Paramaribo -3:40:40 - LMT 1911
+ -3:40:52 - PMT 1935 # Paramaribo Mean Time
+ -3:40:36 - PMT 1945 Oct # The capital moved?
+ -3:30 - NEGT 1975 Nov 20 # Dutch Guiana Time
+ -3:30 - SRT 1984 Oct # Suriname Time
+ -3:00 - SRT
+
+# Trinidad and Tobago
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Port_of_Spain -4:06:04 - LMT 1912 Mar 2
+ -4:00 - AST
+
+# Uruguay
+# From Paul Eggert (1993-11-18):
+# Uruguay wins the prize for the strangest peacetime manipulation of the rules.
+# From Shanks & Pottenger:
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+# Whitman gives 1923 Oct 1; go with Shanks & Pottenger.
+Rule Uruguay 1923 only - Oct 2 0:00 0:30 HS
+Rule Uruguay 1924 1926 - Apr 1 0:00 0 -
+Rule Uruguay 1924 1925 - Oct 1 0:00 0:30 HS
+Rule Uruguay 1933 1935 - Oct lastSun 0:00 0:30 HS
+# Shanks & Pottenger give 1935 Apr 1 0:00 & 1936 Mar 30 0:00; go with Whitman.
+Rule Uruguay 1934 1936 - Mar Sat>=25 23:30s 0 -
+Rule Uruguay 1936 only - Nov 1 0:00 0:30 HS
+Rule Uruguay 1937 1941 - Mar lastSun 0:00 0 -
+# Whitman gives 1937 Oct 3; go with Shanks & Pottenger.
+Rule Uruguay 1937 1940 - Oct lastSun 0:00 0:30 HS
+# Whitman gives 1941 Oct 24 - 1942 Mar 27, 1942 Dec 14 - 1943 Apr 13,
+# and 1943 Apr 13 ``to present time''; go with Shanks & Pottenger.
+Rule Uruguay 1941 only - Aug 1 0:00 0:30 HS
+Rule Uruguay 1942 only - Jan 1 0:00 0 -
+Rule Uruguay 1942 only - Dec 14 0:00 1:00 S
+Rule Uruguay 1943 only - Mar 14 0:00 0 -
+Rule Uruguay 1959 only - May 24 0:00 1:00 S
+Rule Uruguay 1959 only - Nov 15 0:00 0 -
+Rule Uruguay 1960 only - Jan 17 0:00 1:00 S
+Rule Uruguay 1960 only - Mar 6 0:00 0 -
+Rule Uruguay 1965 1967 - Apr Sun>=1 0:00 1:00 S
+Rule Uruguay 1965 only - Sep 26 0:00 0 -
+Rule Uruguay 1966 1967 - Oct 31 0:00 0 -
+Rule Uruguay 1968 1970 - May 27 0:00 0:30 HS
+Rule Uruguay 1968 1970 - Dec 2 0:00 0 -
+Rule Uruguay 1972 only - Apr 24 0:00 1:00 S
+Rule Uruguay 1972 only - Aug 15 0:00 0 -
+Rule Uruguay 1974 only - Mar 10 0:00 0:30 HS
+Rule Uruguay 1974 only - Dec 22 0:00 1:00 S
+Rule Uruguay 1976 only - Oct 1 0:00 0 -
+Rule Uruguay 1977 only - Dec 4 0:00 1:00 S
+Rule Uruguay 1978 only - Apr 1 0:00 0 -
+Rule Uruguay 1979 only - Oct 1 0:00 1:00 S
+Rule Uruguay 1980 only - May 1 0:00 0 -
+Rule Uruguay 1987 only - Dec 14 0:00 1:00 S
+Rule Uruguay 1988 only - Mar 14 0:00 0 -
+Rule Uruguay 1988 only - Dec 11 0:00 1:00 S
+Rule Uruguay 1989 only - Mar 12 0:00 0 -
+Rule Uruguay 1989 only - Oct 29 0:00 1:00 S
+# Shanks & Pottenger say no DST was observed in 1990/1 and 1991/2,
+# and that 1992/3's DST was from 10-25 to 03-01. Go with IATA.
+Rule Uruguay 1990 1992 - Mar Sun>=1 0:00 0 -
+Rule Uruguay 1990 1991 - Oct Sun>=21 0:00 1:00 S
+Rule Uruguay 1992 only - Oct 18 0:00 1:00 S
+Rule Uruguay 1993 only - Feb 28 0:00 0 -
+# From Eduardo Cota (2004-09-20):
+# The uruguayan government has decreed a change in the local time....
+# http://www.presidencia.gub.uy/decretos/2004091502.htm
+Rule Uruguay 2004 only - Sep 19 0:00 1:00 S
+# From Steffen Thorsen (2005-03-11):
+# Uruguay's DST was scheduled to end on Sunday, 2005-03-13, but in order to
+# save energy ... it was postponed two weeks....
+# http://www.presidencia.gub.uy/_Web/noticias/2005/03/2005031005.htm
+Rule Uruguay 2005 only - Mar 27 2:00 0 -
+# From Eduardo Cota (2005-09-27):
+# http://www.presidencia.gub.uy/_Web/decretos/2005/09/CM%20119_09%2009%202005_00001.PDF
+# This means that from 2005-10-09 at 02:00 local time, until 2006-03-12 at
+# 02:00 local time, official time in Uruguay will be at GMT -2.
+Rule Uruguay 2005 only - Oct 9 2:00 1:00 S
+Rule Uruguay 2006 only - Mar 12 2:00 0 -
+# From Jesper Norgaard Welen (2006-09-06):
+# http://www.presidencia.gub.uy/_web/decretos/2006/09/CM%20210_08%2006%202006_00001.PDF
+Rule Uruguay 2006 max - Oct Sun>=1 2:00 1:00 S
+Rule Uruguay 2007 max - Mar Sun>=8 2:00 0 -
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Montevideo -3:44:44 - LMT 1898 Jun 28
+ -3:44:44 - MMT 1920 May 1 # Montevideo MT
+ -3:30 Uruguay UY%sT 1942 Dec 14 # Uruguay Time
+ -3:00 Uruguay UY%sT
+
+# Venezuela
+#
+# From John Stainforth (2007-11-28):
+# ... the change for Venezuela originally expected for 2007-12-31 has
+# been brought forward to 2007-12-09. The official announcement was
+# published today in the "Gaceta Oficial de la Republica Bolivariana
+# de Venezuela, numero 38.819" (official document for all laws or
+# resolution publication)
+# http://www.globovision.com/news.php?nid=72208
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Caracas -4:27:44 - LMT 1890
+ -4:27:40 - CMT 1912 Feb 12 # Caracas Mean Time?
+ -4:30 - VET 1965 # Venezuela Time
+ -4:00 - VET 2007 Dec 9 03:00
+ -4:30 - VET
diff --git a/libkcal/libical/tzdata/systemv b/libkcal/libical/tzdata/systemv
new file mode 100644
index 00000000..6cf9645d
--- /dev/null
+++ b/libkcal/libical/tzdata/systemv
@@ -0,0 +1,36 @@
+# @(#)systemv 8.1
+
+# Old rules, should the need arise.
+# No attempt is made to handle Newfoundland, since it cannot be expressed
+# using the System V "TZ" scheme (half-hour offset), or anything outside
+# North America (no support for non-standard DST start/end dates), nor
+# the changes in the DST rules in the US after 1976 (which occurred after
+# the old rules were written).
+#
+# If you need the old rules, uncomment ## lines.
+# Compile this *without* leap second correction for true conformance.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule SystemV min 1973 - Apr lastSun 2:00 1:00 D
+Rule SystemV min 1973 - Oct lastSun 2:00 0 S
+Rule SystemV 1974 only - Jan 6 2:00 1:00 D
+Rule SystemV 1974 only - Nov lastSun 2:00 0 S
+Rule SystemV 1975 only - Feb 23 2:00 1:00 D
+Rule SystemV 1975 only - Oct lastSun 2:00 0 S
+Rule SystemV 1976 max - Apr lastSun 2:00 1:00 D
+Rule SystemV 1976 max - Oct lastSun 2:00 0 S
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+## Zone SystemV/AST4ADT -4:00 SystemV A%sT
+## Zone SystemV/EST5EDT -5:00 SystemV E%sT
+## Zone SystemV/CST6CDT -6:00 SystemV C%sT
+## Zone SystemV/MST7MDT -7:00 SystemV M%sT
+## Zone SystemV/PST8PDT -8:00 SystemV P%sT
+## Zone SystemV/YST9YDT -9:00 SystemV Y%sT
+## Zone SystemV/AST4 -4:00 - AST
+## Zone SystemV/EST5 -5:00 - EST
+## Zone SystemV/CST6 -6:00 - CST
+## Zone SystemV/MST7 -7:00 - MST
+## Zone SystemV/PST8 -8:00 - PST
+## Zone SystemV/YST9 -9:00 - YST
+## Zone SystemV/HST10 -10:00 - HST
diff --git a/libkcal/libical/tzdata/yearistype.sh b/libkcal/libical/tzdata/yearistype.sh
new file mode 100644
index 00000000..66dbf89a
--- /dev/null
+++ b/libkcal/libical/tzdata/yearistype.sh
@@ -0,0 +1,40 @@
+#! /bin/sh
+
+: 'This file is in the public domain, so clarified as of'
+: '2006-07-17 by Arthur David Olson.'
+
+: '@(#)yearistype.sh 8.2'
+
+case $#-$1 in
+ 2-|2-0*|2-*[!0-9]*)
+ echo "$0: wild year - $1" >&2
+ exit 1 ;;
+esac
+
+case $#-$2 in
+ 2-even)
+ case $1 in
+ *[24680]) exit 0 ;;
+ *) exit 1 ;;
+ esac ;;
+ 2-nonpres|2-nonuspres)
+ case $1 in
+ *[02468][048]|*[13579][26]) exit 1 ;;
+ *) exit 0 ;;
+ esac ;;
+ 2-odd)
+ case $1 in
+ *[13579]) exit 0 ;;
+ *) exit 1 ;;
+ esac ;;
+ 2-uspres)
+ case $1 in
+ *[02468][048]|*[13579][26]) exit 0 ;;
+ *) exit 1 ;;
+ esac ;;
+ 2-*)
+ echo "$0: wild type - $2" >&2 ;;
+esac
+
+echo "$0: usage is $0 year even|odd|uspres|nonpres|nonuspres" >&2
+exit 1
diff --git a/libkcal/libical/tzdata/zone.tab b/libkcal/libical/tzdata/zone.tab
new file mode 100644
index 00000000..1647036c
--- /dev/null
+++ b/libkcal/libical/tzdata/zone.tab
@@ -0,0 +1,423 @@
+# @(#)zone.tab 8.16
+#
+# TZ zone descriptions
+#
+# From Paul Eggert (1996-08-05):
+#
+# This file contains a table with the following columns:
+# 1. ISO 3166 2-character country code. See the file `iso3166.tab'.
+# 2. Latitude and longitude of the zone's principal location
+# in ISO 6709 sign-degrees-minutes-seconds format,
+# either +-DDMM+-DDDMM or +-DDMMSS+-DDDMMSS,
+# first latitude (+ is north), then longitude (+ is east).
+# 3. Zone name used in value of TZ environment variable.
+# 4. Comments; present if and only if the country has multiple rows.
+#
+# Columns are separated by a single tab.
+# The table is sorted first by country, then an order within the country that
+# (1) makes some geographical sense, and
+# (2) puts the most populous zones first, where that does not contradict (1).
+#
+# Lines beginning with `#' are comments.
+#
+#country-
+#code coordinates TZ comments
+AD +4230+00131 Europe/Andorra
+AE +2518+05518 Asia/Dubai
+AF +3431+06912 Asia/Kabul
+AG +1703-06148 America/Antigua
+AI +1812-06304 America/Anguilla
+AL +4120+01950 Europe/Tirane
+AM +4011+04430 Asia/Yerevan
+AN +1211-06900 America/Curacao
+AO -0848+01314 Africa/Luanda
+AQ -7750+16636 Antarctica/McMurdo McMurdo Station, Ross Island
+AQ -9000+00000 Antarctica/South_Pole Amundsen-Scott Station, South Pole
+AQ -6734-06808 Antarctica/Rothera Rothera Station, Adelaide Island
+AQ -6448-06406 Antarctica/Palmer Palmer Station, Anvers Island
+AQ -6736+06253 Antarctica/Mawson Mawson Station, Holme Bay
+AQ -6835+07758 Antarctica/Davis Davis Station, Vestfold Hills
+AQ -6617+11031 Antarctica/Casey Casey Station, Bailey Peninsula
+AQ -7824+10654 Antarctica/Vostok Vostok Station, S Magnetic Pole
+AQ -6640+14001 Antarctica/DumontDUrville Dumont-d'Urville Station, Terre Adelie
+AQ -690022+0393524 Antarctica/Syowa Syowa Station, E Ongul I
+AR -3436-05827 America/Argentina/Buenos_Aires Buenos Aires (BA, CF)
+AR -3124-06411 America/Argentina/Cordoba most locations (CB, CC, CN, ER, FM, LP, MN, NQ, RN, SA, SE, SF)
+AR -3319-06621 America/Argentina/San_Luis San Luis (SL)
+AR -2411-06518 America/Argentina/Jujuy Jujuy (JY)
+AR -2649-06513 America/Argentina/Tucuman Tucuman (TM)
+AR -2828-06547 America/Argentina/Catamarca Catamarca (CT), Chubut (CH)
+AR -2926-06651 America/Argentina/La_Rioja La Rioja (LR)
+AR -3132-06831 America/Argentina/San_Juan San Juan (SJ)
+AR -3253-06849 America/Argentina/Mendoza Mendoza (MZ)
+AR -5138-06913 America/Argentina/Rio_Gallegos Santa Cruz (SC)
+AR -5448-06818 America/Argentina/Ushuaia Tierra del Fuego (TF)
+AS -1416-17042 Pacific/Pago_Pago
+AT +4813+01620 Europe/Vienna
+AU -3133+15905 Australia/Lord_Howe Lord Howe Island
+AU -4253+14719 Australia/Hobart Tasmania - most locations
+AU -3956+14352 Australia/Currie Tasmania - King Island
+AU -3749+14458 Australia/Melbourne Victoria
+AU -3352+15113 Australia/Sydney New South Wales - most locations
+AU -3157+14127 Australia/Broken_Hill New South Wales - Yancowinna
+AU -2728+15302 Australia/Brisbane Queensland - most locations
+AU -2016+14900 Australia/Lindeman Queensland - Holiday Islands
+AU -3455+13835 Australia/Adelaide South Australia
+AU -1228+13050 Australia/Darwin Northern Territory
+AU -3157+11551 Australia/Perth Western Australia - most locations
+AU -3143+12852 Australia/Eucla Western Australia - Eucla area
+AW +1230-06958 America/Aruba
+AX +6006+01957 Europe/Mariehamn
+AZ +4023+04951 Asia/Baku
+BA +4352+01825 Europe/Sarajevo
+BB +1306-05937 America/Barbados
+BD +2343+09025 Asia/Dhaka
+BE +5050+00420 Europe/Brussels
+BF +1222-00131 Africa/Ouagadougou
+BG +4241+02319 Europe/Sofia
+BH +2623+05035 Asia/Bahrain
+BI -0323+02922 Africa/Bujumbura
+BJ +0629+00237 Africa/Porto-Novo
+BL +1753-06251 America/St_Barthelemy
+BM +3217-06446 Atlantic/Bermuda
+BN +0456+11455 Asia/Brunei
+BO -1630-06809 America/La_Paz
+BR -0351-03225 America/Noronha Atlantic islands
+BR -0127-04829 America/Belem Amapa, E Para
+BR -0343-03830 America/Fortaleza NE Brazil (MA, PI, CE, RN, PB)
+BR -0803-03454 America/Recife Pernambuco
+BR -0712-04812 America/Araguaina Tocantins
+BR -0940-03543 America/Maceio Alagoas, Sergipe
+BR -1259-03831 America/Bahia Bahia
+BR -2332-04637 America/Sao_Paulo S & SE Brazil (GO, DF, MG, ES, RJ, SP, PR, SC, RS)
+BR -2027-05437 America/Campo_Grande Mato Grosso do Sul
+BR -1535-05605 America/Cuiaba Mato Grosso
+BR -0846-06354 America/Porto_Velho W Para, Rondonia
+BR +0249-06040 America/Boa_Vista Roraima
+BR -0308-06001 America/Manaus E Amazonas
+BR -0640-06952 America/Eirunepe W Amazonas
+BR -0958-06748 America/Rio_Branco Acre
+BS +2505-07721 America/Nassau
+BT +2728+08939 Asia/Thimphu
+BW -2545+02555 Africa/Gaborone
+BY +5354+02734 Europe/Minsk
+BZ +1730-08812 America/Belize
+CA +4734-05243 America/St_Johns Newfoundland Time, including SE Labrador
+CA +4439-06336 America/Halifax Atlantic Time - Nova Scotia (most places), PEI
+CA +4612-05957 America/Glace_Bay Atlantic Time - Nova Scotia - places that did not observe DST 1966-1971
+CA +4606-06447 America/Moncton Atlantic Time - New Brunswick
+CA +5320-06025 America/Goose_Bay Atlantic Time - Labrador - most locations
+CA +5125-05707 America/Blanc-Sablon Atlantic Standard Time - Quebec - Lower North Shore
+CA +4531-07334 America/Montreal Eastern Time - Quebec - most locations
+CA +4339-07923 America/Toronto Eastern Time - Ontario - most locations
+CA +4901-08816 America/Nipigon Eastern Time - Ontario & Quebec - places that did not observe DST 1967-1973
+CA +4823-08915 America/Thunder_Bay Eastern Time - Thunder Bay, Ontario
+CA +6344-06828 America/Iqaluit Eastern Time - east Nunavut - most locations
+CA +6608-06544 America/Pangnirtung Eastern Time - Pangnirtung, Nunavut
+CA +744144-0944945 America/Resolute Eastern Time - Resolute, Nunavut
+CA +484531-0913718 America/Atikokan Eastern Standard Time - Atikokan, Ontario and Southampton I, Nunavut
+CA +624900-0920459 America/Rankin_Inlet Central Time - central Nunavut
+CA +4953-09709 America/Winnipeg Central Time - Manitoba & west Ontario
+CA +4843-09434 America/Rainy_River Central Time - Rainy River & Fort Frances, Ontario
+CA +5024-10439 America/Regina Central Standard Time - Saskatchewan - most locations
+CA +5017-10750 America/Swift_Current Central Standard Time - Saskatchewan - midwest
+CA +5333-11328 America/Edmonton Mountain Time - Alberta, east British Columbia & west Saskatchewan
+CA +690650-1050310 America/Cambridge_Bay Mountain Time - west Nunavut
+CA +6227-11421 America/Yellowknife Mountain Time - central Northwest Territories
+CA +682059-1334300 America/Inuvik Mountain Time - west Northwest Territories
+CA +5946-12014 America/Dawson_Creek Mountain Standard Time - Dawson Creek & Fort Saint John, British Columbia
+CA +4916-12307 America/Vancouver Pacific Time - west British Columbia
+CA +6043-13503 America/Whitehorse Pacific Time - south Yukon
+CA +6404-13925 America/Dawson Pacific Time - north Yukon
+CC -1210+09655 Indian/Cocos
+CD -0418+01518 Africa/Kinshasa west Dem. Rep. of Congo
+CD -1140+02728 Africa/Lubumbashi east Dem. Rep. of Congo
+CF +0422+01835 Africa/Bangui
+CG -0416+01517 Africa/Brazzaville
+CH +4723+00832 Europe/Zurich
+CI +0519-00402 Africa/Abidjan
+CK -2114-15946 Pacific/Rarotonga
+CL -3327-07040 America/Santiago most locations
+CL -2709-10926 Pacific/Easter Easter Island & Sala y Gomez
+CM +0403+00942 Africa/Douala
+CN +3114+12128 Asia/Shanghai east China - Beijing, Guangdong, Shanghai, etc.
+CN +4545+12641 Asia/Harbin Heilongjiang (except Mohe), Jilin
+CN +2934+10635 Asia/Chongqing central China - Sichuan, Yunnan, Guangxi, Shaanxi, Guizhou, etc.
+CN +4348+08735 Asia/Urumqi most of Tibet & Xinjiang
+CN +3929+07559 Asia/Kashgar west Tibet & Xinjiang
+CO +0436-07405 America/Bogota
+CR +0956-08405 America/Costa_Rica
+CU +2308-08222 America/Havana
+CV +1455-02331 Atlantic/Cape_Verde
+CX -1025+10543 Indian/Christmas
+CY +3510+03322 Asia/Nicosia
+CZ +5005+01426 Europe/Prague
+DE +5230+01322 Europe/Berlin
+DJ +1136+04309 Africa/Djibouti
+DK +5540+01235 Europe/Copenhagen
+DM +1518-06124 America/Dominica
+DO +1828-06954 America/Santo_Domingo
+DZ +3647+00303 Africa/Algiers
+EC -0210-07950 America/Guayaquil mainland
+EC -0054-08936 Pacific/Galapagos Galapagos Islands
+EE +5925+02445 Europe/Tallinn
+EG +3003+03115 Africa/Cairo
+EH +2709-01312 Africa/El_Aaiun
+ER +1520+03853 Africa/Asmara
+ES +4024-00341 Europe/Madrid mainland
+ES +3553-00519 Africa/Ceuta Ceuta & Melilla
+ES +2806-01524 Atlantic/Canary Canary Islands
+ET +0902+03842 Africa/Addis_Ababa
+FI +6010+02458 Europe/Helsinki
+FJ -1808+17825 Pacific/Fiji
+FK -5142-05751 Atlantic/Stanley
+FM +0725+15147 Pacific/Truk Truk (Chuuk) and Yap
+FM +0658+15813 Pacific/Ponape Ponape (Pohnpei)
+FM +0519+16259 Pacific/Kosrae Kosrae
+FO +6201-00646 Atlantic/Faroe
+FR +4852+00220 Europe/Paris
+GA +0023+00927 Africa/Libreville
+GB +513030-0000731 Europe/London
+GD +1203-06145 America/Grenada
+GE +4143+04449 Asia/Tbilisi
+GF +0456-05220 America/Cayenne
+GG +4927-00232 Europe/Guernsey
+GH +0533-00013 Africa/Accra
+GI +3608-00521 Europe/Gibraltar
+GL +6411-05144 America/Godthab most locations
+GL +7646-01840 America/Danmarkshavn east coast, north of Scoresbysund
+GL +7029-02158 America/Scoresbysund Scoresbysund / Ittoqqortoormiit
+GL +7634-06847 America/Thule Thule / Pituffik
+GM +1328-01639 Africa/Banjul
+GN +0931-01343 Africa/Conakry
+GP +1614-06132 America/Guadeloupe
+GQ +0345+00847 Africa/Malabo
+GR +3758+02343 Europe/Athens
+GS -5416-03632 Atlantic/South_Georgia
+GT +1438-09031 America/Guatemala
+GU +1328+14445 Pacific/Guam
+GW +1151-01535 Africa/Bissau
+GY +0648-05810 America/Guyana
+HK +2217+11409 Asia/Hong_Kong
+HN +1406-08713 America/Tegucigalpa
+HR +4548+01558 Europe/Zagreb
+HT +1832-07220 America/Port-au-Prince
+HU +4730+01905 Europe/Budapest
+ID -0610+10648 Asia/Jakarta Java & Sumatra
+ID -0002+10920 Asia/Pontianak west & central Borneo
+ID -0507+11924 Asia/Makassar east & south Borneo, Celebes, Bali, Nusa Tengarra, west Timor
+ID -0232+14042 Asia/Jayapura Irian Jaya & the Moluccas
+IE +5320-00615 Europe/Dublin
+IL +3146+03514 Asia/Jerusalem
+IM +5409-00428 Europe/Isle_of_Man
+IN +2232+08822 Asia/Kolkata
+IO -0720+07225 Indian/Chagos
+IQ +3321+04425 Asia/Baghdad
+IR +3540+05126 Asia/Tehran
+IS +6409-02151 Atlantic/Reykjavik
+IT +4154+01229 Europe/Rome
+JE +4912-00207 Europe/Jersey
+JM +1800-07648 America/Jamaica
+JO +3157+03556 Asia/Amman
+JP +353916+1394441 Asia/Tokyo
+KE -0117+03649 Africa/Nairobi
+KG +4254+07436 Asia/Bishkek
+KH +1133+10455 Asia/Phnom_Penh
+KI +0125+17300 Pacific/Tarawa Gilbert Islands
+KI -0308-17105 Pacific/Enderbury Phoenix Islands
+KI +0152-15720 Pacific/Kiritimati Line Islands
+KM -1141+04316 Indian/Comoro
+KN +1718-06243 America/St_Kitts
+KP +3901+12545 Asia/Pyongyang
+KR +3733+12658 Asia/Seoul
+KW +2920+04759 Asia/Kuwait
+KY +1918-08123 America/Cayman
+KZ +4315+07657 Asia/Almaty most locations
+KZ +4448+06528 Asia/Qyzylorda Qyzylorda (Kyzylorda, Kzyl-Orda)
+KZ +5017+05710 Asia/Aqtobe Aqtobe (Aktobe)
+KZ +4431+05016 Asia/Aqtau Atyrau (Atirau, Gur'yev), Mangghystau (Mankistau)
+KZ +5113+05121 Asia/Oral West Kazakhstan
+LA +1758+10236 Asia/Vientiane
+LB +3353+03530 Asia/Beirut
+LC +1401-06100 America/St_Lucia
+LI +4709+00931 Europe/Vaduz
+LK +0656+07951 Asia/Colombo
+LR +0618-01047 Africa/Monrovia
+LS -2928+02730 Africa/Maseru
+LT +5441+02519 Europe/Vilnius
+LU +4936+00609 Europe/Luxembourg
+LV +5657+02406 Europe/Riga
+LY +3254+01311 Africa/Tripoli
+MA +3339-00735 Africa/Casablanca
+MC +4342+00723 Europe/Monaco
+MD +4700+02850 Europe/Chisinau
+ME +4226+01916 Europe/Podgorica
+MF +1804-06305 America/Marigot
+MG -1855+04731 Indian/Antananarivo
+MH +0709+17112 Pacific/Majuro most locations
+MH +0905+16720 Pacific/Kwajalein Kwajalein
+MK +4159+02126 Europe/Skopje
+ML +1239-00800 Africa/Bamako
+MM +1647+09610 Asia/Rangoon
+MN +4755+10653 Asia/Ulaanbaatar most locations
+MN +4801+09139 Asia/Hovd Bayan-Olgiy, Govi-Altai, Hovd, Uvs, Zavkhan
+MN +4804+11430 Asia/Choibalsan Dornod, Sukhbaatar
+MO +2214+11335 Asia/Macau
+MP +1512+14545 Pacific/Saipan
+MQ +1436-06105 America/Martinique
+MR +1806-01557 Africa/Nouakchott
+MS +1643-06213 America/Montserrat
+MT +3554+01431 Europe/Malta
+MU -2010+05730 Indian/Mauritius
+MV +0410+07330 Indian/Maldives
+MW -1547+03500 Africa/Blantyre
+MX +1924-09909 America/Mexico_City Central Time - most locations
+MX +2105-08646 America/Cancun Central Time - Quintana Roo
+MX +2058-08937 America/Merida Central Time - Campeche, Yucatan
+MX +2540-10019 America/Monterrey Central Time - Coahuila, Durango, Nuevo Leon, Tamaulipas
+MX +2313-10625 America/Mazatlan Mountain Time - S Baja, Nayarit, Sinaloa
+MX +2838-10605 America/Chihuahua Mountain Time - Chihuahua
+MX +2904-11058 America/Hermosillo Mountain Standard Time - Sonora
+MX +3232-11701 America/Tijuana Pacific Time
+MY +0310+10142 Asia/Kuala_Lumpur peninsular Malaysia
+MY +0133+11020 Asia/Kuching Sabah & Sarawak
+MZ -2558+03235 Africa/Maputo
+NA -2234+01706 Africa/Windhoek
+NC -2216+16530 Pacific/Noumea
+NE +1331+00207 Africa/Niamey
+NF -2903+16758 Pacific/Norfolk
+NG +0627+00324 Africa/Lagos
+NI +1209-08617 America/Managua
+NL +5222+00454 Europe/Amsterdam
+NO +5955+01045 Europe/Oslo
+NP +2743+08519 Asia/Katmandu
+NR -0031+16655 Pacific/Nauru
+NU -1901+16955 Pacific/Niue
+NZ -3652+17446 Pacific/Auckland most locations
+NZ -4357-17633 Pacific/Chatham Chatham Islands
+OM +2336+05835 Asia/Muscat
+PA +0858-07932 America/Panama
+PE -1203-07703 America/Lima
+PF -1732-14934 Pacific/Tahiti Society Islands
+PF -0900-13930 Pacific/Marquesas Marquesas Islands
+PF -2308-13457 Pacific/Gambier Gambier Islands
+PG -0930+14710 Pacific/Port_Moresby
+PH +1435+12100 Asia/Manila
+PK +2452+06703 Asia/Karachi
+PL +5215+02100 Europe/Warsaw
+PM +4703-05620 America/Miquelon
+PN -2504-13005 Pacific/Pitcairn
+PR +182806-0660622 America/Puerto_Rico
+PS +3130+03428 Asia/Gaza
+PT +3843-00908 Europe/Lisbon mainland
+PT +3238-01654 Atlantic/Madeira Madeira Islands
+PT +3744-02540 Atlantic/Azores Azores
+PW +0720+13429 Pacific/Palau
+PY -2516-05740 America/Asuncion
+QA +2517+05132 Asia/Qatar
+RE -2052+05528 Indian/Reunion
+RO +4426+02606 Europe/Bucharest
+RS +4450+02030 Europe/Belgrade
+RU +5443+02030 Europe/Kaliningrad Moscow-01 - Kaliningrad
+RU +5545+03735 Europe/Moscow Moscow+00 - west Russia
+RU +4844+04425 Europe/Volgograd Moscow+00 - Caspian Sea
+RU +5312+05009 Europe/Samara Moscow+01 - Samara, Udmurtia
+RU +5651+06036 Asia/Yekaterinburg Moscow+02 - Urals
+RU +5500+07324 Asia/Omsk Moscow+03 - west Siberia
+RU +5502+08255 Asia/Novosibirsk Moscow+03 - Novosibirsk
+RU +5601+09250 Asia/Krasnoyarsk Moscow+04 - Yenisei River
+RU +5216+10420 Asia/Irkutsk Moscow+05 - Lake Baikal
+RU +6200+12940 Asia/Yakutsk Moscow+06 - Lena River
+RU +4310+13156 Asia/Vladivostok Moscow+07 - Amur River
+RU +4658+14242 Asia/Sakhalin Moscow+07 - Sakhalin Island
+RU +5934+15048 Asia/Magadan Moscow+08 - Magadan
+RU +5301+15839 Asia/Kamchatka Moscow+09 - Kamchatka
+RU +6445+17729 Asia/Anadyr Moscow+10 - Bering Sea
+RW -0157+03004 Africa/Kigali
+SA +2438+04643 Asia/Riyadh
+SB -0932+16012 Pacific/Guadalcanal
+SC -0440+05528 Indian/Mahe
+SD +1536+03232 Africa/Khartoum
+SE +5920+01803 Europe/Stockholm
+SG +0117+10351 Asia/Singapore
+SH -1555-00542 Atlantic/St_Helena
+SI +4603+01431 Europe/Ljubljana
+SJ +7800+01600 Arctic/Longyearbyen
+SK +4809+01707 Europe/Bratislava
+SL +0830-01315 Africa/Freetown
+SM +4355+01228 Europe/San_Marino
+SN +1440-01726 Africa/Dakar
+SO +0204+04522 Africa/Mogadishu
+SR +0550-05510 America/Paramaribo
+ST +0020+00644 Africa/Sao_Tome
+SV +1342-08912 America/El_Salvador
+SY +3330+03618 Asia/Damascus
+SZ -2618+03106 Africa/Mbabane
+TC +2128-07108 America/Grand_Turk
+TD +1207+01503 Africa/Ndjamena
+TF -492110+0701303 Indian/Kerguelen
+TG +0608+00113 Africa/Lome
+TH +1345+10031 Asia/Bangkok
+TJ +3835+06848 Asia/Dushanbe
+TK -0922-17114 Pacific/Fakaofo
+TL -0833+12535 Asia/Dili
+TM +3757+05823 Asia/Ashgabat
+TN +3648+01011 Africa/Tunis
+TO -2110+17510 Pacific/Tongatapu
+TR +4101+02858 Europe/Istanbul
+TT +1039-06131 America/Port_of_Spain
+TV -0831+17913 Pacific/Funafuti
+TW +2503+12130 Asia/Taipei
+TZ -0648+03917 Africa/Dar_es_Salaam
+UA +5026+03031 Europe/Kiev most locations
+UA +4837+02218 Europe/Uzhgorod Ruthenia
+UA +4750+03510 Europe/Zaporozhye Zaporozh'ye, E Lugansk / Zaporizhia, E Luhansk
+UA +4457+03406 Europe/Simferopol central Crimea
+UG +0019+03225 Africa/Kampala
+UM +1645-16931 Pacific/Johnston Johnston Atoll
+UM +2813-17722 Pacific/Midway Midway Islands
+UM +1917+16637 Pacific/Wake Wake Island
+US +404251-0740023 America/New_York Eastern Time
+US +421953-0830245 America/Detroit Eastern Time - Michigan - most locations
+US +381515-0854534 America/Kentucky/Louisville Eastern Time - Kentucky - Louisville area
+US +364947-0845057 America/Kentucky/Monticello Eastern Time - Kentucky - Wayne County
+US +394606-0860929 America/Indiana/Indianapolis Eastern Time - Indiana - most locations
+US +384038-0873143 America/Indiana/Vincennes Eastern Time - Indiana - Daviess, Dubois, Knox & Martin Counties
+US +411745-0863730 America/Indiana/Knox Eastern Time - Indiana - Starke County
+US +410305-0863611 America/Indiana/Winamac Eastern Time - Indiana - Pulaski County
+US +382232-0862041 America/Indiana/Marengo Eastern Time - Indiana - Crawford County
+US +384452-0850402 America/Indiana/Vevay Eastern Time - Indiana - Switzerland County
+US +415100-0873900 America/Chicago Central Time
+US +375711-0864541 America/Indiana/Tell_City Central Time - Indiana - Perry County
+US +382931-0871643 America/Indiana/Petersburg Central Time - Indiana - Pike County
+US +450628-0873651 America/Menominee Central Time - Michigan - Dickinson, Gogebic, Iron & Menominee Counties
+US +470659-1011757 America/North_Dakota/Center Central Time - North Dakota - Oliver County
+US +465042-1012439 America/North_Dakota/New_Salem Central Time - North Dakota - Morton County (except Mandan area)
+US +394421-1045903 America/Denver Mountain Time
+US +433649-1161209 America/Boise Mountain Time - south Idaho & east Oregon
+US +364708-1084111 America/Shiprock Mountain Time - Navajo
+US +332654-1120424 America/Phoenix Mountain Standard Time - Arizona
+US +340308-1181434 America/Los_Angeles Pacific Time
+US +611305-1495401 America/Anchorage Alaska Time
+US +581807-1342511 America/Juneau Alaska Time - Alaska panhandle
+US +593249-1394338 America/Yakutat Alaska Time - Alaska panhandle neck
+US +643004-1652423 America/Nome Alaska Time - west Alaska
+US +515248-1763929 America/Adak Aleutian Islands
+US +211825-1575130 Pacific/Honolulu Hawaii
+UY -3453-05611 America/Montevideo
+UZ +3940+06648 Asia/Samarkand west Uzbekistan
+UZ +4120+06918 Asia/Tashkent east Uzbekistan
+VA +4154+01227 Europe/Vatican
+VC +1309-06114 America/St_Vincent
+VE +1030-06656 America/Caracas
+VG +1827-06437 America/Tortola
+VI +1821-06456 America/St_Thomas
+VN +1045+10640 Asia/Ho_Chi_Minh
+VU -1740+16825 Pacific/Efate
+WF -1318-17610 Pacific/Wallis
+WS -1350-17144 Pacific/Apia
+YE +1245+04512 Asia/Aden
+YT -1247+04514 Indian/Mayotte
+ZA -2615+02800 Africa/Johannesburg
+ZM -1525+02817 Africa/Lusaka
+ZW -1750+03103 Africa/Harare
diff --git a/libkcal/libical/vzic-1.3/ChangeLog b/libkcal/libical/vzic-1.3/ChangeLog
new file mode 100644
index 00000000..f2d9569e
--- /dev/null
+++ b/libkcal/libical/vzic-1.3/ChangeLog
@@ -0,0 +1,57 @@
+2006-03-18 Damon Chaplin <damon@gnome.org>
+
+ * Released Vzic 1.3
+
+2006-03-18 Damon Chaplin <damon@gnome.org>
+
+ * vzic-output.c (expand_tzname): added special case for America/Nome.
+ (output_rrule): made hacks a bit more general, to handle Asia/Gaza
+ which now has a day=4 rule. At some point we should check what newer
+ versions of Outlook can handle so we can be more accurate.
+
+ * vzic-dump.c (dump_time_zone_names): try looking for timezone info
+ using original and linked name.
+
+ * README, *.c: fixed spelling 'compatable' -> 'compatible'.
+
+ * vzic.c: patch from Jonathan Guthrie to support a --olson-dir option.
+
+2003-10-25 Damon Chaplin <damon@gnome.org>
+
+ * Released Vzic 1.2
+
+2003-10-25 Damon Chaplin <damon@gnome.org>
+
+ * vzic-output.c:
+ * Makefile: moved the PRODUCT_ID and TZID_PREFIX settings to the
+ Makefile and changed the default so people don't accidentally use
+ the same IDs as Evolution.
+
+ * vzic-parse.c (parse_time): substitute 23:59:59 when we read a time
+ of 24:00:00. This is a bit of a kludge to avoid problems, since
+ 24:00:00 is not a valid iCalendar time. Since 24:00:00 is only used
+ for a few timezones in the 1930s it doesn't matter too much.
+
+ To write a correct fix we'd need to review all the code that deals
+ with times to see if it would be affected, e.g. a time of 24:00 on
+ one day should be considered equal to 0:00 the next day.
+
+ We'd also need to adjust the output times to use 0:00 the next day
+ rather than 24:00. If we need to output recurrence rules that would
+ be a problem, since 'last saturday at 24:00' can't be easily
+ converted to another rule that uses 0:00 instead.
+
+2003-10-22 Damon Chaplin <damon@gnome.org>
+
+ * Released Vzic 1.1
+
+2003-10-22 Damon Chaplin <damon@gnome.org>
+
+ * vzic-parse.c (parse_time): allow a time of 24:00, as used in
+ the America/Montreal and America/Toronto rules in the 1930s!
+ I'm not 100% sure the rest of the code will handle this OK, but
+ it only affects the 'pure' output.
+
+2003-09-01 Damon Chaplin <damon@gnome.org>
+
+ * Released Vzic 1.0
diff --git a/libkcal/libical/vzic-1.3/Makefile b/libkcal/libical/vzic-1.3/Makefile
new file mode 100644
index 00000000..7196c152
--- /dev/null
+++ b/libkcal/libical/vzic-1.3/Makefile
@@ -0,0 +1,83 @@
+
+#
+# You will need to set this to the directory that the Olson timezone data
+# files are in.
+#
+OLSON_DIR = ../tzdata
+
+
+# This is used as the PRODID property on the iCalendar files output.
+# It identifies the product which created the iCalendar objects.
+# So you need to substitute your own organization name and product.
+PRODUCT_ID = -//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+
+
+# This is used to create unique IDs for each VTIMEZONE component.
+# The prefix is put before each timezone city name. It should start and end
+# with a '/'. The first part, i.e. 'myorganization.org' below, should be
+# a unique vendor ID, e.g. use a hostname. The part after that can be
+# anything you want. We use a date and version number for libical. The %D
+# gets expanded to today's date. There is also a vzic-merge.pl which can be
+# used to merge changes into a master set of VTIMEZONEs. If a VTIMEZONE has
+# changed, it bumps the version number on the end of this prefix. */
+TZID_PREFIX = /kde.org/Olson_%D_1/
+
+
+# Set any -I include directories to find the libical header files, and the
+# libical library to link with. You only need these if you want to run the
+# tests. You may need to change the '#include <ical.h>' line at the top of
+# test-vzic.c as well.
+LIBICAL_CFLAGS =
+LIBICAL_LDADD = -lical-evolution
+
+
+#
+# You shouldn't need to change the rest of the file.
+#
+
+GLIB_CFLAGS = `pkg-config --cflags glib-2.0`
+GLIB_LDADD = `pkg-config --libs glib-2.0`
+
+CFLAGS = -g -DOLSON_DIR=\"$(OLSON_DIR)\" -DPRODUCT_ID='"$(PRODUCT_ID)"' -DTZID_PREFIX='"$(TZID_PREFIX)"' $(GLIB_CFLAGS) $(LIBICAL_CFLAGS)
+
+OBJECTS = vzic.o vzic-parse.o vzic-dump.o vzic-output.o
+
+all: vzic
+
+vzic: $(OBJECTS)
+ $(CC) $(OBJECTS) $(GLIB_LDADD) -o vzic
+
+test-vzic: test-vzic.o
+ $(CC) test-vzic.o $(LIBICAL_LDADD) -o test-vzic
+
+# Dependencies.
+$(OBJECTS): vzic.h
+vzic.o vzic-parse.o: vzic-parse.h
+vzic.o vzic-dump.o: vzic-dump.h
+vzic.o vzic-output.o: vzic-output.h
+
+test-parse: vzic
+ ./vzic-dump.pl $(OLSON_DIR)
+ ./vzic --dump --pure
+ @echo
+ @echo "#"
+ @echo "# If either of these diff commands outputs anything there may be a problem."
+ @echo "#"
+ diff -ru zoneinfo/ZonesPerl zoneinfo/ZonesVzic
+ diff -ru zoneinfo/RulesPerl zoneinfo/RulesVzic
+
+test-changes: vzic test-vzic
+ ./test-vzic --dump-changes
+ ./vzic --dump-changes --pure
+ @echo
+ @echo "#"
+ @echo "# If this diff command outputs anything there may be a problem."
+ @echo "#"
+ diff -ru zoneinfo/ChangesVzic test-output
+
+clean:
+ -rm -rf vzic $(OBJECTS) *~ ChangesVzic RulesVzic ZonesVzic RulesPerl ZonesPerl test-vzic test-vzic.o
+
+.PHONY: clean perl-dump test-parse
+
+
diff --git a/libkcal/libical/vzic-1.3/Makefile.org b/libkcal/libical/vzic-1.3/Makefile.org
new file mode 100644
index 00000000..4b5917c2
--- /dev/null
+++ b/libkcal/libical/vzic-1.3/Makefile.org
@@ -0,0 +1,89 @@
+
+#
+# You will need to set this to the directory that the Olson timezone data
+# files are in.
+#
+OLSON_DIR = /home/damon/src/olson/tzdata2006b
+
+
+# This is used as the PRODID property on the iCalendar files output.
+# It identifies the product which created the iCalendar objects.
+# So you need to substitute your own organization name and product.
+PRODUCT_ID = -//My Organization//NONSGML My Product//EN
+
+# This is what libical-evolution uses.
+#PRODUCT_ID = -//Ximian//NONSGML Evolution Olson-VTIMEZONE Converter//EN
+
+
+# This is used to create unique IDs for each VTIMEZONE component.
+# The prefix is put before each timezone city name. It should start and end
+# with a '/'. The first part, i.e. 'myorganization.org' below, should be
+# a unique vendor ID, e.g. use a hostname. The part after that can be
+# anything you want. We use a date and version number for libical. The %D
+# gets expanded to today's date. There is also a vzic-merge.pl which can be
+# used to merge changes into a master set of VTIMEZONEs. If a VTIMEZONE has
+# changed, it bumps the version number on the end of this prefix. */
+TZID_PREFIX = /myorganization.org/%D_1/
+
+# This is what libical-evolution uses.
+#TZID_PREFIX = /softwarestudio.org/Olson_%D_1/
+
+
+# Set any -I include directories to find the libical header files, and the
+# libical library to link with. You only need these if you want to run the
+# tests. You may need to change the '#include <ical.h>' line at the top of
+# test-vzic.c as well.
+LIBICAL_CFLAGS =
+LIBICAL_LDADD = -lical-evolution
+
+
+#
+# You shouldn't need to change the rest of the file.
+#
+
+GLIB_CFLAGS = `pkg-config --cflags glib-2.0`
+GLIB_LDADD = `pkg-config --libs glib-2.0`
+
+CFLAGS = -g -DOLSON_DIR=\"$(OLSON_DIR)\" -DPRODUCT_ID='"$(PRODUCT_ID)"' -DTZID_PREFIX='"$(TZID_PREFIX)"' $(GLIB_CFLAGS) $(LIBICAL_CFLAGS)
+
+OBJECTS = vzic.o vzic-parse.o vzic-dump.o vzic-output.o
+
+all: vzic
+
+vzic: $(OBJECTS)
+ $(CC) $(OBJECTS) $(GLIB_LDADD) -o vzic
+
+test-vzic: test-vzic.o
+ $(CC) test-vzic.o $(LIBICAL_LDADD) -o test-vzic
+
+# Dependencies.
+$(OBJECTS): vzic.h
+vzic.o vzic-parse.o: vzic-parse.h
+vzic.o vzic-dump.o: vzic-dump.h
+vzic.o vzic-output.o: vzic-output.h
+
+test-parse: vzic
+ ./vzic-dump.pl $(OLSON_DIR)
+ ./vzic --dump --pure
+ @echo
+ @echo "#"
+ @echo "# If either of these diff commands outputs anything there may be a problem."
+ @echo "#"
+ diff -ru zoneinfo/ZonesPerl zoneinfo/ZonesVzic
+ diff -ru zoneinfo/RulesPerl zoneinfo/RulesVzic
+
+test-changes: vzic test-vzic
+ ./test-vzic --dump-changes
+ ./vzic --dump-changes --pure
+ @echo
+ @echo "#"
+ @echo "# If this diff command outputs anything there may be a problem."
+ @echo "#"
+ diff -ru zoneinfo/ChangesVzic test-output
+
+clean:
+ -rm -rf vzic $(OBJECTS) *~ ChangesVzic RulesVzic ZonesVzic RulesPerl ZonesPerl test-vzic test-vzic.o
+
+.PHONY: clean perl-dump test-parse
+
+
diff --git a/libkcal/libical/vzic-1.3/README b/libkcal/libical/vzic-1.3/README
new file mode 100644
index 00000000..962ff2e6
--- /dev/null
+++ b/libkcal/libical/vzic-1.3/README
@@ -0,0 +1,202 @@
+
+
+VZIC README
+===========
+
+This is 'vzic', a program to convert the Olson timezone database files into
+VTIMEZONE files compatible with the iCalendar specification (RFC2445).
+
+(The name is based on the 'zic' program which converts the Olson files into
+time zone information files used by several Unix C libraries, including
+glibc. See zic(8) and tzfile(5).)
+
+
+
+REQUIREMENTS
+============
+
+You need the Olson timezone database files, which can be found at:
+
+ ftp://elsie.nci.nih.gov/pub/
+
+ (Old versions can be found at ftp://munnari.oz.au/pub/oldtz/)
+
+
+Vzic also uses the GLib library (for hash tables, dynamic arrays, and date
+calculations). You need version 2.0 or higher. You can get this from:
+
+ http://www.gtk.org
+
+
+
+BUILDING
+========
+
+Edit the Makefile to set the OLSON_DIR, PRODUCT_ID and TZID_PREFIX variables.
+
+Then run 'make'.
+
+
+
+RUNNING
+=======
+
+Run 'vzic'.
+
+The output is placed in the zoneinfo subdirectory by default,
+but you can use the --output-dir options to set another toplevel output
+directory.
+
+By default it outputs VTIMEZONEs that try to be compatible with Outlook
+(2000, at least). Outlook can't handle certain iCalendar constructs in
+VTIMEZONEs, such as RRULEs using BYMONTHDAY, so it has to adjust the RRULEs
+slightly to get Outlook to parse them. Unfortunately this means they are
+slightly wrong. If given the --pure option, vzic outputs the exact data,
+without worrying about compatability.
+
+NOTE: We don't convert all the Olson files. We skip 'backward', 'etcetera',
+'leapseconds', 'pacificnew', 'solar87', 'solar88' and 'solar89', 'factory'
+and 'systemv', since these don't really provide any useful timezones.
+See vzic.c.
+
+
+
+MERGING CHANGES INTO A MASTER SET OF VTIMEZONES
+===============================================
+
+The Olson timezone files are updated fairly often, so we need to build new
+sets of VTIMEZONE files. Though we have to be careful to ensure that the TZID
+of updated timezones is also updated, since it must remain unique.
+
+We use a version number on the end of the TZID prefix (see the TZIDPrefix
+variable in vzic-output.c) to ensure this uniqueness.
+
+But we don't want to update the version numbers of VTIMEZONEs which have not
+changed. So we use the vzic-merge.pl Perl script. This merges in the new set
+of VTIMEZONEs with a 'master' set. It compares each new VTIMEZONE file with
+the one in the master set (ignoring changes to the TZID). If the new
+VTIMEZONE file is different, it copies it to the master set and sets the
+version number to the old VTIMEZONE's version number + 1.
+
+To use vzic-merge.pl you must change the $MASTER_ZONEINFO_DIR and
+$NEW_ZONEINFO_DIR variables at the top of the file to point to your 2 sets of
+VTIMEZONEs. You then just run the script. (I recommend you keep a backup of
+the old master VTIMEZONE files, and use diff to compare the new master set
+with the old one, in case anything goes wrong.)
+
+You must merge in changes to the zones.tab file by hand.
+
+Note that some timezones are renamed or removed occasionally, so applications
+should be able to cope with this.
+
+
+
+COMPATABILITY NOTES
+===================
+
+It seems that Microsoft Outlook is very picky about the iCalendar files it
+will accept. (I've been testing with Outlook 2000. I hope the other versions
+are no worse.) Here's a few problems we've had with the VTIMEZONEs:
+
+ o Outlook doesn't like any years before 1600. We were using '1st Jan 0001'
+ in all VTIMEZONEs to specify the first UTC offset known for the timezone.
+ (The Olson data does not give a start date for this.)
+
+ Now we just skip this first component for most timezones. The UTC offset
+ can still be found from the TZOFFSETFROM property of the first component.
+
+ Though some timezones only specify one UTC offset that applies forever,
+ so in these cases we output '1st Jan 1970' (Indian/Cocos,
+ Pacific/Johnston).
+
+ o Outlook doesn't like the BYMONTHDAY specifier in RRULEs.
+
+ We have changed most of the VTIMEZONEs to use things like 'BYDAY=2SU'
+ rather than 'BYMONTHDAY=8,9,10,11,12,13,14;BYDAY=SU', though some of
+ them were impossible to convert correctly so they are not always correct.
+
+ o Outlook doesn't like TZOFFSETFROM/TZOFFSETTO properties which include a
+ seconds component, e.g. 'TZOFFSETFROM:+110628'.
+ Quite a lot of the Olson timezones include seconds in their UTC offsets,
+ though no timezones currently have a UTC offset that uses the seconds
+ value.
+
+ We've rounded all UTC offsets to the nearest minute. Since all timezone
+ offsets currently used have '00' as the seconds offset, this doesn't lose
+ us much.
+
+ o Outlook doesn't like lines being split in certain places, even though
+ the iCalendar spec says they can be split anywhere.
+
+ o Outlook can only handle one RDATE or a pair of RRULEs. So we had to remove
+ all historical data.
+
+
+TESTING
+=======
+
+Do a 'make test-vic', then run ./test-vic.
+
+The test-vzic program compares our libical code and VTIMEZONE data against
+the Unix functions like mktime(). It steps over a period of time (1970-2037)
+converting from UTC to a given timezone and back again every 15 minutes.
+Any differences are output into the test-output directory.
+
+The output matches for all of the timezones, except in a few places where the
+result can't be determined. So I think we can be fairly confident that the
+VTIMEZONEs are correct.
+
+Note that you must use the same Olson data in libical that the OS is using
+for mktime() etc. For example, I am using RedHat 9 which uses tzdata2002d,
+so I converted this to VTIMEZONE files and installed it into the libical
+timezone data directory before testing. (You need to use '--pure' when
+creating the VTIMEZONE files as well.)
+
+
+Testing the Parsing Code
+------------------------
+
+Run 'make test-parse'.
+
+This runs 'vzic --dump' and 'perl-dump' and compares the output. The diff
+commands should not produce any output.
+
+'vzic --dump' dumps all the parsed data out in the original Olson format,
+but without comments. The files are written into the ZonesVzic and RulesVzic
+subdirectories of the zoneinfo directory.
+
+'make perl-dump' runs the vzic-dump.pl perl script which outputs the files
+in the same format as 'vzic --dump' in the ZonesPerl and RulesPerl
+subdirectories. The perl script doesn't actually parse the fields; it only
+strips comments and massages the fields so we have the same output format.
+
+Currently they both produce exactly the same output so we know the parsing
+code is OK.
+
+
+Testing the VTIMEZONE Files
+---------------------------
+
+Run 'make test-changes'.
+
+This runs 'vzic --dump-changes' and 'test-vzic --dump-changes' and compares
+the output. The diff command should not produce any output.
+
+Both commands output timezone changes for each zone up to a specific year
+(2030) into files for each timezone. It outputs the timezone changes in a
+list in this format:
+
+ Timezone Name Date and Time of Change in UTC New Offset from UTC
+
+ America/Dawson 26 Oct 1986 2:00:00 -0800
+
+Unfortunately there are some differences here, but they all happen before
+1970 so it doesn't matter too much. It looks like the libical code has
+problems determining things like 'last Sunday of the month' before 1970.
+This is because it uses mktime() etc. which can't really handle dates
+before 1970.
+
+
+
+Damon Chaplin <damon@gnome.org>, 25 Oct 2003.
+
diff --git a/libkcal/libical/vzic-1.3/test-vzic.c b/libkcal/libical/vzic-1.3/test-vzic.c
new file mode 100644
index 00000000..9da1abe1
--- /dev/null
+++ b/libkcal/libical/vzic-1.3/test-vzic.c
@@ -0,0 +1,422 @@
+/*
+ * Vzic - a program to convert Olson timezone database files into VZTIMEZONE
+ * files compatible with the iCalendar specification (RFC2445).
+ *
+ * Copyright (C) 2000-2001 Ximian, Inc.
+ * Copyright (C) 2003 Damon Chaplin.
+ *
+ * Author: Damon Chaplin <damon@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * test-vzic.c - test vzic + libical against mktime() and friends.
+ *
+ * Note that when we output VCALENDAR data compatible with Outlook the
+ * results aren't all correct.
+ *
+ * We have to modify some RRULEs which makes these timezones incorrect:
+ *
+ * Africa/Cairo
+ * America/Godthab
+ * America/Santiago
+ * Antarctica/Palmer
+ * Asia/Baghdad
+ * Asia/Damascus
+ * Asia/Jerusalem
+ *
+ * Also, we can only output one RDATE or a pair of RRULEs which may make some
+ * other timezones incorrect sometimes (e.g. if they change).
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include <ical.h>
+/*#include <evolution/ical.h>*/
+
+#define CHANGES_MAX_YEAR 2030
+
+/* These are the years between which we test against the Unix timezone
+ functions, inclusive. When using 'vzic --pure' you can test the full
+ range from 1970 to 2037 and it should match against mktime() etc.
+ (assuming you are using the same Olson timezone data for both).
+
+ But when using VTIMEZONE's that are compatible with Outlook, it is only
+ worth testing times in the future. There will be lots of differences in
+ the past, since we can't include any historical changes in the files. */
+#if 1
+#define DUMP_START_YEAR 2003
+#define DUMP_END_YEAR 2037
+#else
+#define DUMP_START_YEAR 1970
+#define DUMP_END_YEAR 2037
+#endif
+
+/* The maximum size of any complete pathname. */
+#define PATHNAME_BUFFER_SIZE 1024
+
+#ifndef FALSE
+#define FALSE (0)
+#endif
+
+#ifndef TRUE
+#define TRUE (!FALSE)
+#endif
+
+int VzicDumpChanges = FALSE;
+
+/* We output beneath the current directory for now. */
+char *directory = "test-output";
+
+static void usage (void);
+static int parse_zone_name (char *name,
+ char **directory,
+ char **subdirectory,
+ char **filename);
+static void ensure_directory_exists (char *directory);
+static void dump_local_times (icaltimezone *zone,
+ FILE *fp);
+
+
+int main(int argc, char* argv[])
+{
+ icalarray *zones;
+ icaltimezone *zone;
+ char *zone_directory, *zone_subdirectory, *zone_filename, *location;
+ char output_directory[PATHNAME_BUFFER_SIZE];
+ char filename[PATHNAME_BUFFER_SIZE];
+ FILE *fp;
+ int i;
+ int skipping = TRUE;
+
+ /*
+ * Command-Line Option Parsing.
+ */
+ for (i = 1; i < argc; i++) {
+ /* --dump-changes: Dumps a list of times when each timezone changed,
+ and the new local time offset from UTC. */
+ if (!strcmp (argv[i], "--dump-changes"))
+ VzicDumpChanges = TRUE;
+
+ else
+ usage ();
+ }
+
+
+ zones = icaltimezone_get_builtin_timezones ();
+
+ ensure_directory_exists (directory);
+
+ for (i = 0; i < zones->num_elements; i++) {
+ zone = icalarray_element_at (zones, i);
+
+ location = icaltimezone_get_location (zone);
+
+#if 0
+ /* Use this to start at a certain zone. */
+ if (skipping && strcmp (location, "America/Boise"))
+ continue;
+#endif
+
+ skipping = FALSE;
+
+ /* Use this to only output data for certain timezones. */
+#if 0
+ if (strcmp (location, "America/Cancun")
+ && strcmp (location, "Asia/Baku")
+ && strcmp (location, "Asia/Nicosia")
+ && strcmp (location, "Asia/Novosibirsk")
+ && strcmp (location, "Asia/Samarkand")
+ && strcmp (location, "Asia/Tashkent")
+ && strcmp (location, "Asia/Tbilisi")
+ && strcmp (location, "Asia/Yerevan")
+ && strcmp (location, "Australia/Broken_Hill")
+ && strcmp (location, "Europe/Simferopol")
+ && strcmp (location, "Europe/Tallinn")
+ && strcmp (location, "Europe/Zaporozhye")
+ )
+ continue;
+#endif
+
+#if 0
+ printf ("%s\n", location);
+#endif
+
+ parse_zone_name (location, &zone_directory, &zone_subdirectory,
+ &zone_filename);
+
+ sprintf (output_directory, "%s/%s", directory, zone_directory);
+ ensure_directory_exists (output_directory);
+ sprintf (filename, "%s/%s", output_directory, zone_filename);
+
+ if (zone_subdirectory) {
+ sprintf (output_directory, "%s/%s/%s", directory, zone_directory,
+ zone_subdirectory);
+ ensure_directory_exists (output_directory);
+ sprintf (filename, "%s/%s", output_directory, zone_filename);
+ }
+
+ fp = fopen (filename, "w");
+ if (!fp) {
+ fprintf (stderr, "Couldn't create file: %s\n", filename);
+ exit (1);
+ }
+
+ /* We can run 2 different tests - output all changes for each zone, or
+ test against mktime()/localtime(). Should have a command-line option
+ or something. */
+ if (VzicDumpChanges)
+ icaltimezone_dump_changes (zone, CHANGES_MAX_YEAR, fp);
+ else
+ dump_local_times (zone, fp);
+
+ if (ferror (fp)) {
+ fprintf (stderr, "Error writing file: %s\n", filename);
+ exit (1);
+ }
+
+ fclose (fp);
+ }
+
+ return 0;
+}
+
+
+static void
+usage (void)
+{
+ fprintf (stderr, "Usage: test-vzic [--dump-changes]\n");
+
+ exit (1);
+}
+
+
+/* This checks that the Zone name only uses the characters in [-+_/a-zA-Z0-9],
+ and outputs a warning if it isn't. */
+static int
+parse_zone_name (char *name,
+ char **directory,
+ char **subdirectory,
+ char **filename)
+{
+ static int invalid_zone_num = 1;
+
+ char *p, ch, *first_slash_pos = NULL, *second_slash_pos = NULL;
+ int invalid = FALSE;
+
+ for (p = name; (ch = *p) != 0; p++) {
+ if ((ch < 'a' || ch > 'z') && (ch < 'A' || ch > 'Z')
+ && (ch < '0' || ch > '9') && ch != '/' && ch != '_'
+ && ch != '-' && ch != '+') {
+ fprintf (stderr, "Warning: Unusual Zone name: %s\n", name);
+ invalid = TRUE;
+ break;
+ }
+
+ if (ch == '/') {
+ if (!first_slash_pos) {
+ first_slash_pos = p;
+ } else if (!second_slash_pos) {
+ second_slash_pos = p;
+ } else {
+ fprintf (stderr, "Warning: More than 2 '/' characters in Zone name: %s\n", name);
+ invalid = TRUE;
+ break;
+ }
+ }
+ }
+
+ if (!first_slash_pos) {
+ fprintf (stderr, "No '/' character in Zone name: %s. Skipping.\n", name);
+ return FALSE;
+ }
+
+ if (invalid) {
+ fprintf (stderr, "Invalid zone name: %s\n", name);
+ exit (0);
+ } else {
+ *first_slash_pos = '\0';
+ *directory = icalmemory_strdup (name);
+ *first_slash_pos = '/';
+
+ if (second_slash_pos) {
+ *second_slash_pos = '\0';
+ *subdirectory = icalmemory_strdup (first_slash_pos + 1);
+ *second_slash_pos = '/';
+
+ *filename = icalmemory_strdup (second_slash_pos + 1);
+ } else {
+ *subdirectory = NULL;
+ *filename = icalmemory_strdup (first_slash_pos + 1);
+ }
+ }
+}
+
+
+static void
+ensure_directory_exists (char *directory)
+{
+ struct stat filestat;
+
+ if (stat (directory, &filestat) != 0) {
+ /* If the directory doesn't exist, try to create it. */
+ if (errno == ENOENT) {
+ if (mkdir (directory, 0777) != 0) {
+ fprintf (stderr, "Can't create directory: %s\n", directory);
+ exit (1);
+ }
+ } else {
+ fprintf (stderr, "Error calling stat() on directory: %s\n", directory);
+ exit (1);
+ }
+ } else if (!S_ISDIR (filestat.st_mode)) {
+ fprintf (stderr, "Can't create directory, already exists: %s\n",
+ directory);
+ exit (1);
+ }
+}
+
+
+static void
+dump_local_times (icaltimezone *zone, FILE *fp)
+{
+ static char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
+ icaltimezone *utc_timezone;
+ struct icaltimetype tt, tt_copy;
+ struct tm tm, local_tm;
+ time_t t;
+ char tzstring[256], *location;
+ int last_year_output = 0;
+ int total_error = 0, total_error2 = 0;
+
+ utc_timezone = icaltimezone_get_utc_timezone ();
+
+ /* This is our UTC time that we will use to iterate over the period. */
+ tt.year = DUMP_START_YEAR;
+ tt.month = 1;
+ tt.day = 1;
+ tt.hour = 0;
+ tt.minute = 0;
+ tt.second = 0;
+ tt.is_utc = 0;
+ tt.is_date = 0;
+ tt.zone = "";
+
+ tm.tm_year = tt.year - 1900;
+ tm.tm_mon = tt.month - 1;
+ tm.tm_mday = tt.day;
+ tm.tm_hour = tt.hour;
+ tm.tm_min = tt.minute;
+ tm.tm_sec = tt.second;
+ tm.tm_isdst = -1;
+
+ /* Convert it to a time_t by saying it is in UTC. */
+ putenv ("TZ=UTC");
+ t = mktime (&tm);
+
+ location = icaltimezone_get_location (zone);
+ sprintf (tzstring, "TZ=%s", location);
+
+ /*printf ("Zone: %s\n", location);*/
+ putenv (tzstring);
+
+ /* Loop around converting the UTC time to local time, outputting it, and
+ then adding on 15 minutes to the UTC time. */
+ while (tt.year <= DUMP_END_YEAR) {
+ if (tt.year > last_year_output) {
+ last_year_output = tt.year;
+#if 0
+ printf (" %i\n", last_year_output);
+ fprintf (fp, " %i\n", last_year_output);
+#endif
+ }
+
+#if 1
+ /* First use the Unix functions. */
+ /* Now convert it to a local time in the given timezone. */
+ local_tm = *localtime (&t);
+#endif
+
+#if 1
+ /* Now use libical. */
+ tt_copy = tt;
+ icaltimezone_convert_time (&tt_copy, utc_timezone, zone);
+#endif
+
+#if 1
+ if (local_tm.tm_year + 1900 != tt_copy.year
+ || local_tm.tm_mon + 1 != tt_copy.month
+ || local_tm.tm_mday != tt_copy.day
+ || local_tm.tm_hour != tt_copy.hour
+ || local_tm.tm_min != tt_copy.minute
+ || local_tm.tm_sec != tt_copy.second) {
+
+ /* The error format is:
+
+ ERROR: Original-UTC-Time Local-Time-From-mktime Local-Time-From-Libical
+
+ */
+
+ total_error++;
+
+ fprintf (fp, "ERROR:%2i %s %04i %2i:%02i:%02i UTC",
+ tt.day, months[tt.month - 1], tt.year,
+ tt.hour, tt.minute, tt.second);
+ fprintf (fp, " ->%2i %s %04i %2i:%02i:%02i",
+ local_tm.tm_mday, months[local_tm.tm_mon],
+ local_tm.tm_year + 1900,
+ local_tm.tm_hour, local_tm.tm_min, local_tm.tm_sec);
+ fprintf (fp, " Us:%2i %s %04i %2i:%02i:%02i\n",
+ tt_copy.day, months[tt_copy.month - 1], tt_copy.year,
+ tt_copy.hour, tt_copy.minute, tt_copy.second);
+ }
+#endif
+
+ /* Now convert it back, and check we get the original time. */
+ icaltimezone_convert_time (&tt_copy, zone, utc_timezone);
+ if (tt.year != tt_copy.year
+ || tt.month != tt_copy.month
+ || tt.day != tt_copy.day
+ || tt.hour != tt_copy.hour
+ || tt.minute != tt_copy.minute
+ || tt.second != tt_copy.second) {
+
+ total_error2++;
+
+ fprintf (fp, "ERROR 2: %2i %s %04i %2i:%02i:%02i UTC",
+ tt.day, months[tt.month - 1], tt.year,
+ tt.hour, tt.minute, tt.second);
+ fprintf (fp, " Us:%2i %s %04i %2i:%02i:%02i UTC\n",
+ tt_copy.day, months[tt_copy.month - 1], tt_copy.year,
+ tt_copy.hour, tt_copy.minute, tt_copy.second);
+ }
+
+
+ /* Increment the time. */
+ icaltime_adjust (&tt, 0, 0, 15, 0);
+
+ /* We assume leap seconds are not included in time_t values, which should
+ be true on POSIX systems. */
+ t += 15 * 60;
+ }
+
+ printf ("Zone: %40s Errors: %i (%i)\n", icaltimezone_get_location (zone),
+ total_error, total_error2);
+}
diff --git a/libkcal/libical/vzic-1.3/vzic-dump.c b/libkcal/libical/vzic-1.3/vzic-dump.c
new file mode 100644
index 00000000..405d7eef
--- /dev/null
+++ b/libkcal/libical/vzic-1.3/vzic-dump.c
@@ -0,0 +1,409 @@
+/*
+ * Vzic - a program to convert Olson timezone database files into VZTIMEZONE
+ * files compatible with the iCalendar specification (RFC2445).
+ *
+ * Copyright (C) 2000-2001 Ximian, Inc.
+ * Copyright (C) 2003 Damon Chaplin.
+ *
+ * Author: Damon Chaplin <damon@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * These functions are for dumping all the parsed Zones and Rules to
+ * files, to be compared with the output of vzic-dump.pl to check our parsing
+ * code is OK. Some of the functions are also used for producing debugging
+ * output.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "vzic.h"
+#include "vzic-dump.h"
+
+
+static void dump_add_rule (char *name,
+ GArray *rule_array,
+ GPtrArray *name_array);
+static int dump_compare_strings (const void *arg1,
+ const void *arg2);
+
+
+void
+dump_zone_data (GArray *zone_data,
+ char *filename)
+{
+ static char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
+ FILE *fp;
+ ZoneData *zone;
+ ZoneLineData *zone_line;
+ int i, j;
+ gboolean output_month, output_day, output_time;
+
+ fp = fopen (filename, "w");
+ if (!fp) {
+ fprintf (stderr, "Couldn't create file: %s\n", filename);
+ exit (1);
+ }
+
+ for (i = 0; i < zone_data->len; i++) {
+ zone = &g_array_index (zone_data, ZoneData, i);
+
+ fprintf (fp, "Zone\t%s\t", zone->zone_name);
+
+ for (j = 0; j < zone->zone_line_data->len; j++) {
+ zone_line = &g_array_index (zone->zone_line_data, ZoneLineData, j);
+
+ if (j != 0)
+ fprintf (fp, "\t\t\t");
+
+ fprintf (fp, "%s\t", dump_time (zone_line->stdoff_seconds, TIME_WALL,
+ FALSE));
+
+ if (zone_line->rules)
+ fprintf (fp, "%s\t", zone_line->rules);
+ else if (zone_line->save_seconds != 0)
+ fprintf (fp, "%s\t", dump_time (zone_line->save_seconds, TIME_WALL,
+ FALSE));
+ else
+ fprintf (fp, "-\t");
+
+ fprintf (fp, "%s\t", zone_line->format ? zone_line->format : "-");
+
+ if (zone_line->until_set) {
+ fprintf (fp, "%s\t", dump_year (zone_line->until_year));
+
+ output_month = output_day = output_time = FALSE;
+
+ if (zone_line->until_time_code != TIME_WALL
+ || zone_line->until_time_seconds != 0)
+ output_month = output_day = output_time = TRUE;
+ else if (zone_line->until_day_code != DAY_SIMPLE
+ || zone_line->until_day_number != 1)
+ output_month = output_day = TRUE;
+ else if (zone_line->until_month != 0)
+ output_month = TRUE;
+
+ if (output_month)
+ fprintf (fp, "%s", months[zone_line->until_month]);
+
+ fprintf (fp, "\t");
+
+ if (output_day)
+ fprintf (fp, "%s", dump_day_coded (zone_line->until_day_code,
+ zone_line->until_day_number,
+ zone_line->until_day_weekday));
+
+ fprintf (fp, "\t");
+
+ if (output_time)
+ fprintf (fp, "%s", dump_time (zone_line->until_time_seconds,
+ zone_line->until_time_code, FALSE));
+
+ } else {
+ fprintf (fp, "\t\t\t");
+ }
+
+ fprintf (fp, "\n");
+ }
+ }
+
+ fclose (fp);
+}
+
+
+void
+dump_rule_data (GHashTable *rule_data,
+ char *filename)
+{
+ FILE *fp;
+ GPtrArray *name_array;
+ GArray *rule_array;
+ int i;
+ char *name;
+
+ fp = fopen (filename, "w");
+ if (!fp) {
+ fprintf (stderr, "Couldn't create file: %s\n", filename);
+ exit (1);
+ }
+
+ /* We need to sort the rules by their names, so they are in the same order
+ as the Perl output. So we place all the names in a temporary GPtrArray,
+ sort it, then output them. */
+ name_array = g_ptr_array_new ();
+ g_hash_table_foreach (rule_data, (GHFunc) dump_add_rule, name_array);
+ qsort (name_array->pdata, name_array->len, sizeof (char*),
+ dump_compare_strings);
+
+ for (i = 0; i < name_array->len; i++) {
+ name = g_ptr_array_index (name_array, i);
+ rule_array = g_hash_table_lookup (rule_data, name);
+ if (!rule_array) {
+ fprintf (stderr, "Couldn't access rules: %s\n", name);
+ exit (1);
+ }
+ dump_rule_array (name, rule_array, fp);
+ }
+
+ g_ptr_array_free (name_array, TRUE);
+
+ fclose (fp);
+}
+
+
+static void
+dump_add_rule (char *name,
+ GArray *rule_array,
+ GPtrArray *name_array)
+{
+ g_ptr_array_add (name_array, name);
+}
+
+
+static int
+dump_compare_strings (const void *arg1,
+ const void *arg2)
+{
+ char **a, **b;
+
+ a = (char**) arg1;
+ b = (char**) arg2;
+
+ return strcmp (*a, *b);
+}
+
+
+void
+dump_rule_array (char *name,
+ GArray *rule_array,
+ FILE *fp)
+{
+ static char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
+
+ RuleData *rule;
+ int i;
+
+#if 0
+ fprintf (fp, "\n# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S");
+#endif
+
+ for (i = 0; i < rule_array->len; i++) {
+ rule = &g_array_index (rule_array, RuleData, i);
+
+ fprintf (fp, "Rule\t%s\t%s\t", name, dump_year (rule->from_year));
+
+ if (rule->to_year == rule->from_year)
+ fprintf (fp, "only\t");
+ else
+ fprintf (fp, "%s\t", dump_year (rule->to_year));
+
+ fprintf (fp, "%s\t", rule->type ? rule->type : "-");
+
+ fprintf (fp, "%s\t", months[rule->in_month]);
+
+ fprintf (fp, "%s\t",
+ dump_day_coded (rule->on_day_code, rule->on_day_number,
+ rule->on_day_weekday));
+
+ fprintf (fp, "%s\t", dump_time (rule->at_time_seconds, rule->at_time_code,
+ FALSE));
+
+ fprintf (fp, "%s\t", dump_time (rule->save_seconds, TIME_WALL, TRUE));
+
+ fprintf (fp, "%s", rule->letter_s ? rule->letter_s : "-");
+
+ fprintf (fp, "\n");
+ }
+}
+
+
+char*
+dump_time (int seconds,
+ TimeCode time_code,
+ gboolean use_zero)
+{
+ static char buffer[256], *sign;
+ int hours, minutes;
+ char *code;
+
+ if (time_code == TIME_STANDARD)
+ code = "s";
+ else if (time_code == TIME_UNIVERSAL)
+ code = "u";
+ else
+ code = "";
+
+ if (seconds < 0) {
+ seconds = -seconds;
+ sign = "-";
+ } else {
+ sign = "";
+ }
+
+ hours = seconds / 3600;
+ minutes = (seconds % 3600) / 60;
+ seconds = seconds % 60;
+
+ if (use_zero && hours == 0 && minutes == 0 && seconds == 0)
+ return "0";
+ else if (seconds == 0)
+ sprintf (buffer, "%s%i:%02i%s", sign, hours, minutes, code);
+ else
+ sprintf (buffer, "%s%i:%02i:%02i%s", sign, hours, minutes, seconds, code);
+
+ return buffer;
+}
+
+
+char*
+dump_day_coded (DayCode day_code,
+ int day_number,
+ int day_weekday)
+{
+ static char buffer[256];
+ static char *weekdays[] = { "Sun", "Mon", "Tue", "Wed",
+ "Thu", "Fri", "Sat" };
+
+ switch (day_code) {
+ case DAY_SIMPLE:
+ sprintf (buffer, "%i", day_number);
+ break;
+ case DAY_WEEKDAY_ON_OR_AFTER:
+ sprintf (buffer, "%s>=%i", weekdays[day_weekday], day_number);
+ break;
+ case DAY_WEEKDAY_ON_OR_BEFORE:
+ sprintf (buffer, "%s<=%i", weekdays[day_weekday], day_number);
+ break;
+ case DAY_LAST_WEEKDAY:
+ sprintf (buffer, "last%s", weekdays[day_weekday]);
+ break;
+ default:
+ fprintf (stderr, "Invalid day code: %i\n", day_code);
+ exit (1);
+ }
+
+ return buffer;
+}
+
+
+char*
+dump_year (int year)
+{
+ static char buffer[256];
+
+ if (year == YEAR_MINIMUM)
+ return "min";
+ if (year == YEAR_MAXIMUM)
+ return "max";
+
+ sprintf (buffer, "%i", year);
+ return buffer;
+}
+
+
+void
+dump_time_zone_names (GList *names,
+ char *output_dir,
+ GHashTable *zones_hash)
+{
+ char filename[PATHNAME_BUFFER_SIZE], *zone_name, *zone_name_in_hash = NULL;
+ char strings_filename[PATHNAME_BUFFER_SIZE];
+ FILE *fp, *strings_fp = NULL;
+ GList *elem;
+ ZoneDescription *zone_desc;
+
+ sprintf (filename, "%s/zones.tab", output_dir);
+ sprintf (strings_filename, "%s/zones.h", output_dir);
+
+ fp = fopen (filename, "w");
+ if (!fp) {
+ fprintf (stderr, "Couldn't create file: %s\n", filename);
+ exit (1);
+ }
+
+ if (VzicDumpZoneTranslatableStrings) {
+ strings_fp = fopen (strings_filename, "w");
+ if (!strings_fp) {
+ fprintf (stderr, "Couldn't create file: %s\n", strings_filename);
+ exit (1);
+ }
+ }
+
+ names = g_list_sort (names, (GCompareFunc) strcmp);
+
+ elem = names;
+ while (elem) {
+ zone_name = (char*) elem->data;
+
+ zone_desc = g_hash_table_lookup (zones_hash, zone_name);
+
+ /* SPECIAL CASES: These timezones are links from other zones and are
+ almost exactly the same - they are basically there so users can find
+ them a bit easier. But they don't have entries in the zone.tab file,
+ so we use the entry from the timezone linked from. */
+ if (!zone_desc) {
+ if (!strcmp (zone_name, "America/Indiana/Indianapolis"))
+ zone_name_in_hash = "America/Indianapolis";
+ else if (!strcmp (zone_name, "America/Kentucky/Louisville"))
+ zone_name_in_hash = "America/Louisville";
+ else if (!strcmp (zone_name, "Asia/Istanbul"))
+ zone_name_in_hash = "Europe/Istanbul";
+ else if (!strcmp (zone_name, "Europe/Nicosia"))
+ zone_name_in_hash = "Asia/Nicosia";
+
+ if (zone_name_in_hash)
+ zone_desc = g_hash_table_lookup (zones_hash, zone_name_in_hash);
+ }
+
+ if (zone_desc) {
+ fprintf (fp, "%+04i%02i%02i %+04i%02i%02i %s\n",
+ zone_desc->latitude[0], zone_desc->latitude[1],
+ zone_desc->latitude[2],
+ zone_desc->longitude[0], zone_desc->longitude[1],
+ zone_desc->longitude[2],
+ zone_name);
+ } else {
+ g_print ("Zone description not found for: %s\n", zone_name);
+ fprintf (fp, "%s\n", zone_name);
+ }
+
+
+ if (VzicDumpZoneTranslatableStrings) {
+#if 0
+ char zone_name_buffer[1024], *src, *dest;
+
+ for (src = zone_name, dest = zone_name_buffer; *src; src++, dest++)
+ *dest = (*src == '_') ? ' ' : *src;
+ *dest = '\0';
+#endif
+
+ fprintf (strings_fp, "N_(\"%s\");\n", zone_name);
+ }
+
+ elem = elem->next;
+ }
+
+ fclose (fp);
+
+ if (VzicDumpZoneTranslatableStrings)
+ fclose (strings_fp);
+}
+
diff --git a/libkcal/libical/vzic-1.3/vzic-dump.h b/libkcal/libical/vzic-1.3/vzic-dump.h
new file mode 100644
index 00000000..ab9fe001
--- /dev/null
+++ b/libkcal/libical/vzic-1.3/vzic-dump.h
@@ -0,0 +1,58 @@
+/*
+ * Vzic - a program to convert Olson timezone database files into VZTIMEZONE
+ * files compatible with the iCalendar specification (RFC2445).
+ *
+ * Copyright (C) 2000-2001 Ximian, Inc.
+ * Copyright (C) 2003 Damon Chaplin.
+ *
+ * Author: Damon Chaplin <damon@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * These functions are for dumping all the parsed Zones and Rules to
+ * files, to be compared with the output of vzic-dump.pl to check our parsing
+ * code is OK. Some of the functions are also used for producing debugging
+ * output.
+ */
+
+#ifndef _VZIC_DUMP_H_
+#define _VZIC_DUMP_H_
+
+#include <glib.h>
+
+void dump_zone_data (GArray *zone_data,
+ char *filename);
+void dump_rule_data (GHashTable *rule_data,
+ char *filename);
+
+void dump_rule_array (char *name,
+ GArray *rule_array,
+ FILE *fp);
+
+char* dump_year (int year);
+char* dump_day_coded (DayCode day_code,
+ int day_number,
+ int day_weekday);
+char* dump_time (int seconds,
+ TimeCode time_code,
+ gboolean use_zero);
+
+void dump_time_zone_names (GList *names,
+ char *output_dir,
+ GHashTable *zones_hash);
+
+#endif /* _VZIC_DUMP_H_ */
diff --git a/libkcal/libical/vzic-1.3/vzic-dump.pl b/libkcal/libical/vzic-1.3/vzic-dump.pl
new file mode 100755
index 00000000..dc789bc8
--- /dev/null
+++ b/libkcal/libical/vzic-1.3/vzic-dump.pl
@@ -0,0 +1,222 @@
+#!/usr/bin/perl -w
+
+#
+# Vzic - a program to convert Olson timezone database files into VZTIMEZONE
+# files compatible with the iCalendar specification (RFC2445).
+#
+# Copyright (C) 2000-2001 Ximian, Inc.
+# Copyright (C) 2003 Damon Chaplin.
+#
+# Author: Damon Chaplin <damon@gnome.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+
+#
+# This reads the Olson timezone files, strips any comments, and outputs them
+# in a very simple format with tab-separated fields. It is used to compare
+# with the output of dump_zone_data() and dump_rule_data() to double-check
+# that we have parsed the files correctly.
+#
+
+my $zones_fh = "zonesfile";
+my $rules_fh = "rulesfile";
+
+my %Rules;
+
+if ($#ARGV != 0) {
+ die "Usage: $0 <OlsonDirectory>";
+}
+
+my $OLSON_DIR = $ARGV[0];
+
+# We place output in subdirectories of the current directory.
+my $OUTPUT_DIR = "zoneinfo";
+
+if (! -d "$OUTPUT_DIR") {
+ mkdir ("$OUTPUT_DIR", 0777)
+ || die "Can't create directory: $OUTPUT_DIR";
+}
+if (! -d "$OUTPUT_DIR/ZonesPerl") {
+ mkdir ("$OUTPUT_DIR/ZonesPerl", 0777)
+ || die "Can't create directory: $OUTPUT_DIR/ZonesPerl";
+}
+if (! -d "$OUTPUT_DIR/RulesPerl") {
+ mkdir ("$OUTPUT_DIR/RulesPerl", 0777)
+ || die "Can't create directory: $OUTPUT_DIR/RulesPerl";
+}
+
+
+&ReadOlsonFile ("africa");
+&ReadOlsonFile ("antarctica");
+&ReadOlsonFile ("asia");
+&ReadOlsonFile ("australasia");
+&ReadOlsonFile ("europe");
+&ReadOlsonFile ("northamerica");
+&ReadOlsonFile ("southamerica");
+
+# These are backwards-compatability and weird stuff.
+#&ReadOlsonFile ("backward");
+#&ReadOlsonFile ("etcetera");
+#&ReadOlsonFile ("leapseconds");
+#&ReadOlsonFile ("pacificnew");
+#&ReadOlsonFile ("solar87");
+#&ReadOlsonFile ("solar88");
+#&ReadOlsonFile ("solar89");
+
+# We don't do this one since it is not useful and the use of '"' in the Zone
+# line messes up our split() command.
+#&ReadOlsonFile ("factory");
+
+# We don't do this since the vzic program can't do it.
+#&ReadOlsonFile ("systemv");
+
+
+
+
+1;
+
+
+sub ReadOlsonFile {
+ my ($file) = @_;
+
+# print ("Reading olson file: $file\n");
+
+ open (OLSONFILE, "$OLSON_DIR/$file")
+ || die "Can't open file: $file";
+
+ open ($zones_fh, ">$OUTPUT_DIR/ZonesPerl/$file")
+ || die "Can't open file: $OUTPUT_DIR/ZonesPerl/$file";
+
+ open ($rules_fh, ">$OUTPUT_DIR/RulesPerl/$file")
+ || die "Can't open file: $OUTPUT_DIR/RulesPerl/$file";
+
+ %Rules = ();
+
+ my $zone_continues = 0;
+
+ while (<OLSONFILE>) {
+ next if (m/^#/);
+
+ # '#' characters can appear in strings, but the Olson files don't use
+ # that feature at present so we treat all '#' as comments for now.
+ s/#.*//;
+
+ next if (m/^\s*$/);
+
+ if ($zone_continues) {
+ $zone_continues = &ReadZoneContinuationLine;
+
+ } elsif (m/^Rule\s/) {
+ &ReadRuleLine;
+
+ } elsif (m/^Zone\s/) {
+ $zone_continues = &ReadZoneLine;
+
+ } elsif (m/^Link\s/) {
+# print "Link: $link_from, $link_to\n";
+
+ } elsif (m/^Leap\s/) {
+# print "Leap\n";
+
+ } else {
+ die "Invalid line: $_";
+ }
+ }
+
+# print ("Read olson file: $file\n");
+
+ foreach $key (sort (keys (%Rules))) {
+ print $rules_fh "$Rules{$key}"
+ }
+
+ close ($zones_fh);
+ close ($rules_fh);
+ close (OLSONFILE);
+}
+
+
+sub ReadZoneLine {
+ my ($zone, $name, $gmtoff, $rules_save, $format,
+ $until_year, $until_month, $until_day, $until_time, $remainder)
+ = split ' ', $_, 10;
+
+ return &ReadZoneLineCommon ($zone, $name, $gmtoff, $rules_save, $format,
+ $until_year, $until_month, $until_day,
+ $until_time);
+}
+
+
+sub ReadZoneContinuationLine {
+ my ($gmtoff, $rules_save, $format,
+ $until_year, $until_month, $until_day, $until_time, $remainder)
+ = split ' ', $_, 8;
+
+ return &ReadZoneLineCommon ("", "", $gmtoff, $rules_save, $format,
+ $until_year, $until_month, $until_day,
+ $until_time);
+}
+
+
+sub ReadZoneLineCommon {
+ my ($zone, $name, $gmtoff, $rules_save, $format,
+ $until_year, $until_month, $until_day, $until_time) = @_;
+
+ if (!defined ($until_year)) { $until_year = ""; }
+ if (!defined ($until_month)) { $until_month = ""; }
+ if (!defined ($until_day)) { $until_day = ""; }
+ if (!defined ($until_time)) { $until_time = ""; }
+
+ # A few of the gmtoffsets have an unnecessary :00 seconds.
+ $gmtoff =~ s/(\d+):(\d+):00/$1:$2/;
+
+ # Make sure the gmtoff does have minutes.
+ $gmtoff =~ s/^(-?\d+)$/$1:00/;
+
+ # Fix a few other bits so they all use the same format.
+ if ($gmtoff eq "0") { $gmtoff = "0:00"; }
+ $until_time =~ s/^0(\d):/$1:/;
+ if ($until_time eq "0:00") { $until_time = ""; }
+ if ($until_day eq "1" && $until_time eq "") { $until_day = ""; }
+ if ($until_month eq "Jan" && $until_day eq "" && $until_time eq "") {
+ $until_month = "";
+ }
+
+ # For Zone continuation lines we need to insert an extra TAB.
+ if (!$zone) { $zone = "\t" };
+
+ print $zones_fh "$zone\t$name\t$gmtoff\t$rules_save\t$format\t$until_year\t$until_month\t$until_day\t$until_time\n";
+
+ if (defined ($until_year) && $until_year) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+
+sub ReadRuleLine {
+ my ($rule, $name, $from, $to, $type, $in, $on, $at, $save, $letter_s,
+ $remainder) = split;
+
+ $at =~ s/(\d+:\d+):00/$1/;
+ $save =~ s/(\d+:\d+):00/$1/;
+ if ($save eq "0:00") { $save = "0"; }
+
+ $Rules{$name} .= "$rule\t$name\t$from\t$to\t$type\t$in\t$on\t$at\t$save\t$letter_s\n";
+
+# print $rules_fh "$rule\t$name\t$from\t$to\t$type\t$in\t$on\t$at\t$save\t$letter_s\n";
+}
+
diff --git a/libkcal/libical/vzic-1.3/vzic-merge.pl b/libkcal/libical/vzic-1.3/vzic-merge.pl
new file mode 100755
index 00000000..d1e545ee
--- /dev/null
+++ b/libkcal/libical/vzic-1.3/vzic-merge.pl
@@ -0,0 +1,127 @@
+#!/usr/bin/perl -w
+
+#
+# Vzic - a program to convert Olson timezone database files into VZTIMEZONE
+# files compatible with the iCalendar specification (RFC2445).
+#
+# Copyright (C) 2001 Ximian, Inc.
+# Copyright (C) 2003 Damon Chaplin.
+#
+# Author: Damon Chaplin <damon@gnome.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+
+#
+# This merges in a new set of VTIMEZONE files with the 'master' set. It only
+# updates the files in the master set if the VTIMEZONE component has really
+# been changes. Note that the TZID normally includes the date the VTIMEZONE
+# file was generated on, so we have to ignore this when comparing the files.
+#
+
+# Set these to the toplevel directories of the 2 sets of VTIMEZONE files.
+#$MASTER_ZONEINFO_DIR = "/home/damon/cvs/libical/zoneinfo";
+$MASTER_ZONEINFO_DIR = "/usr/share/libical-evolution/zoneinfo";
+$NEW_ZONEINFO_DIR = "/home/damon/src/vzic-1.0/zoneinfo";
+
+# Set this to 1 if you have version numbers in the TZID like libical.
+$LIBICAL_VERSIONING = 1;
+
+# Set this to 0 for dry-runs, and 1 to actually update.
+$DO_UPDATES = 1;
+
+# Save this so we can restore it later.
+$input_record_separator = $/;
+
+chdir $NEW_ZONEINFO_DIR
+ || die "Can't cd to $NEW_ZONEINFO_DIR";
+
+foreach $new_file (`find -name "*.ics"`) {
+ # Get rid of './' at start and whitespace at end.
+ $new_file =~ s/^\.\///;
+ $new_file =~ s/\s+$//;
+
+# print "File: $new_file\n";
+
+ open (NEWZONEFILE, "$new_file")
+ || die "Can't open file: $NEW_ZONEINFO_DIR/$new_file";
+ undef $/;
+ $new_contents = <NEWZONEFILE>;
+ $/ = $input_record_separator;
+ close (NEWZONEFILE);
+
+ $master_file = $MASTER_ZONEINFO_DIR . "/$new_file";
+
+# print "Master File: $master_file\n";
+
+ $copy_to_master = 0;
+
+ # If the ics file exists in the master copy we have to compare them,
+ # otherwise we can just copy the new file into the master directory.
+ if (-e $master_file) {
+ open (MASTERZONEFILE, "$master_file")
+ || die "Can't open file: $master_file";
+ undef $/;
+ $master_contents = <MASTERZONEFILE>;
+ $/ = $input_record_separator;
+ close (MASTERZONEFILE);
+
+ $new_contents_copy = $new_contents;
+
+ # Strip the TZID from both contents.
+ $new_contents_copy =~ s/^TZID:\S+$//m;
+ $new_tzid = $&;
+ $master_contents =~ s/^TZID:\S+$//m;
+ $master_tzid = $&;
+
+# print "Matched: $master_tzid\n";
+
+
+ if ($new_contents_copy ne $master_contents) {
+ print "$new_file has changed. Updating...\n";
+ $copy_to_master = 1;
+
+ if ($LIBICAL_VERSIONING) {
+ # We bump the version number in the new file.
+ $master_tzid =~ m%_(\d+)/%;
+ $version_num = $1;
+# print "Version: $version_num\n";
+
+ $version_num++;
+ $new_tzid =~ s%_(\d+)/%_$version_num/%;
+
+# print "New TZID: $new_tzid\n";
+ $new_contents =~ s/^TZID:\S+$/$new_tzid/m;
+ }
+ }
+
+ } else {
+ print "$new_file doesn't exist in master directory. Copying...\n";
+ $copy_to_master = 1;
+ }
+
+ if ($copy_to_master) {
+# print "Updating: $new_file\n";
+
+ if ($DO_UPDATES) {
+ open (MASTERZONEFILE, ">$master_file")
+ || die "Can't create file: $master_file";
+ print MASTERZONEFILE $new_contents;
+ close (MASTERZONEFILE);
+ }
+ }
+
+}
+
diff --git a/libkcal/libical/vzic-1.3/vzic-output.c b/libkcal/libical/vzic-1.3/vzic-output.c
new file mode 100644
index 00000000..a23ece13
--- /dev/null
+++ b/libkcal/libical/vzic-1.3/vzic-output.c
@@ -0,0 +1,2325 @@
+/*
+ * Vzic - a program to convert Olson timezone database files into VZTIMEZONE
+ * files compatible with the iCalendar specification (RFC2445).
+ *
+ * Copyright (C) 2000-2001 Ximian, Inc.
+ * Copyright (C) 2003 Damon Chaplin.
+ *
+ * Author: Damon Chaplin <damon@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/* ALGORITHM:
+ *
+ * First we expand all the Rule arrays, so that each element only represents 1
+ * year. If a Rule extends to infinity we expand it up to a few years past the
+ * maximum UNTIL year used in any of the timezones. We do this to make sure
+ * that the last of the expanded Rules (which may be infinite) is only used
+ * in the last of the time periods (i.e. the last Zone line).
+ *
+ * The Rule arrays are also sorted by the start time (FROM + IN + ON + AT).
+ * Doing all this makes it much easier to find which rules apply to which
+ * periods.
+ *
+ * For each timezone (i.e. ZoneData element), we step through each of the
+ * time periods, the ZoneLineData elements (which represent each Zone line
+ * from the Olson file.)
+ *
+ * We calculate the start & end time of the period.
+ * - For the first line the start time is -infinity.
+ * - For the last line the end time is +infinity.
+ * - The end time of each line is also the start time of the next.
+ *
+ * We create an array of time changes which occur in this period, including
+ * the one implied by the Zone line itself (though this is later taken out
+ * if it is found to be at exactly the same time as the first Rule).
+ *
+ * Now we iterate over the time changes, outputting them as STANDARD or
+ * DAYLIGHT components. We also try to merge them together into RRULEs or
+ * use RDATEs.
+ */
+
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "vzic.h"
+#include "vzic-output.h"
+
+#include "vzic-dump.h"
+
+
+/* These come from the Makefile. See the comments there. */
+char *ProductID = PRODUCT_ID;
+char *TZIDPrefix = TZID_PREFIX;
+
+/* We expand the TZIDPrefix, replacing %D with the date, in here. */
+char TZIDPrefixExpanded[1024];
+
+
+/* We only use RRULEs if there are at least MIN_RRULE_OCCURRENCES occurrences,
+ since otherwise RDATEs are more efficient. Actually, I've set this high
+ so we only use RRULEs for infinite recurrences. Since expanding RRULEs is
+ very time-consuming, this seems sensible. */
+#define MIN_RRULE_OCCURRENCES 100
+
+
+/* The year we go up to when dumping the list of timezone changes (used
+ for testing & debugging). */
+#define MAX_CHANGES_YEAR 2030
+
+/* This is the maximum year that time_t value can typically hold on 32-bit
+ systems. */
+#define MAX_TIME_T_YEAR 2037
+
+
+/* The year we use to start RRULEs. */
+#define RRULE_START_YEAR 1970
+
+/* The year we use for RDATEs. */
+#define RDATE_YEAR 1970
+
+
+static char *WeekDays[] = { "SU", "MO", "TU", "WE", "TH", "FR", "SA" };
+static int DaysInMonth[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+
+char *CurrentZoneName;
+
+
+typedef struct _VzicTime VzicTime;
+struct _VzicTime
+{
+ /* Normal years, e.g. 2001. */
+ int year;
+
+ /* 0 (Jan) to 11 (Dec). */
+ int month;
+
+ /* The day, either a simple month day number, 1-31, or a rule such as
+ the last Sunday, or the first Monday on or after the 8th. */
+ DayCode day_code;
+ int day_number; /* 1 to 31. */
+ int day_weekday; /* 0 (Sun) to 6 (Sat). */
+
+ /* The time, in seconds from midnight. The code specifies whether the
+ time is a wall clock time, local standard time, or universal time. */
+ int time_seconds;
+ TimeCode time_code;
+
+ /* The offset from UTC for local standard time. */
+ int stdoff;
+
+ /* The offset from UTC for local wall clock time. If this is different to
+ stdoff then this is a DAYLIGHT component. This is TZOFFSETTO. */
+ int walloff;
+
+ /* TRUE if the time change recurs every year to infinity. */
+ gboolean is_infinite;
+
+ /* TRUE if the change has already been output. */
+ gboolean output;
+
+ /* These are the offsets of the previous VzicTime, and are used when
+ calculating the time of the change. We place them here in
+ output_zone_components() to simplify the output code. */
+ int prev_stdoff;
+ int prev_walloff;
+
+ /* The abbreviated form of the timezone name. Note that this may not be
+ unique. */
+ char *tzname;
+};
+
+
+static void expand_and_sort_rule_array (gpointer key,
+ gpointer value,
+ gpointer data);
+static int rule_sort_func (const void *arg1,
+ const void *arg2);
+static void output_zone (char *directory,
+ ZoneData *zone,
+ char *zone_name,
+ GHashTable *rule_data);
+static gboolean parse_zone_name (char *name,
+ char **directory,
+ char **subdirectory,
+ char **filename);
+static void output_zone_to_files (ZoneData *zone,
+ char *zone_name,
+ GHashTable *rule_data,
+ FILE *fp,
+ FILE *changes_fp);
+static gboolean add_rule_changes (ZoneLineData *zone_line,
+ char *zone_name,
+ GArray *changes,
+ GHashTable *rule_data,
+ VzicTime *start,
+ VzicTime *end,
+ char **start_letter_s,
+ int *save_seconds);
+static char* expand_tzname (char *zone_name,
+ char *format,
+ gboolean have_letter_s,
+ char *letter_s,
+ gboolean is_daylight);
+static int compare_times (VzicTime *time1,
+ int stdoff1,
+ int walloff1,
+ VzicTime *time2,
+ int stdoff2,
+ int walloff2);
+static gboolean times_match (VzicTime *time1,
+ int stdoff1,
+ int walloff1,
+ VzicTime *time2,
+ int stdoff2,
+ int walloff2);
+static void output_zone_components (FILE *fp,
+ char *name,
+ GArray *changes);
+static void set_previous_offsets (GArray *changes);
+static gboolean check_for_recurrence (FILE *fp,
+ GArray *changes,
+ int idx);
+static void check_for_rdates (FILE *fp,
+ GArray *changes,
+ int idx);
+static gboolean timezones_match (char *tzname1,
+ char *tzname2);
+static int output_component_start (char *buffer,
+ VzicTime *vzictime,
+ gboolean output_rdate,
+ gboolean use_same_tz_offset);
+static void output_component_end (FILE *fp,
+ VzicTime *vzictime);
+
+static void vzictime_init (VzicTime *vzictime);
+static int calculate_actual_time (VzicTime *vzictime,
+ TimeCode time_code,
+ int stdoff,
+ int walloff);
+static int calculate_wall_time (int time,
+ TimeCode time_code,
+ int stdoff,
+ int walloff,
+ int *day_offset);
+static int calculate_until_time (int time,
+ TimeCode time_code,
+ int stdoff,
+ int walloff,
+ int *year,
+ int *month,
+ int *day);
+static void fix_time_overflow (int *year,
+ int *month,
+ int *day,
+ int day_offset);
+
+static char* format_time (int year,
+ int month,
+ int day,
+ int time);
+static char* format_tz_offset (int tz_offset,
+ gboolean round_seconds);
+static gboolean output_rrule (char *rrule_buffer,
+ int month,
+ DayCode day_code,
+ int day_number,
+ int day_weekday,
+ int day_offset,
+ char *until);
+static gboolean output_rrule_2 (char *buffer,
+ int month,
+ int day_number,
+ int day_weekday);
+
+static char* format_vzictime (VzicTime *vzictime);
+
+static void dump_changes (FILE *fp,
+ char *zone_name,
+ GArray *changes);
+static void dump_change (FILE *fp,
+ char *zone_name,
+ VzicTime *vzictime,
+ int year);
+
+static void expand_tzid_prefix (void);
+
+
+void
+output_vtimezone_files (char *directory,
+ GArray *zone_data,
+ GHashTable *rule_data,
+ GHashTable *link_data,
+ int max_until_year)
+{
+ ZoneData *zone;
+ GList *links;
+ char *link_to;
+ int i;
+
+ /* Insert today's date into the TZIDs we output. */
+ expand_tzid_prefix ();
+
+ /* Expand the rule data so that each entry specifies only one year, and
+ sort it so we can easily find the rules applicable to each Zone span. */
+ g_hash_table_foreach (rule_data, expand_and_sort_rule_array,
+ GINT_TO_POINTER (max_until_year));
+
+ /* Output each timezone. */
+ for (i = 0; i < zone_data->len; i++) {
+ zone = &g_array_index (zone_data, ZoneData, i);
+ output_zone (directory, zone, zone->zone_name, rule_data);
+
+ /* Look for any links from this zone. */
+ links = g_hash_table_lookup (link_data, zone->zone_name);
+
+ while (links) {
+ link_to = links->data;
+
+ /* We ignore Links that don't have a '/' in them (things like 'EST5EDT').
+ */
+ if (strchr (link_to, '/')) {
+ output_zone (directory, zone, link_to, rule_data);
+ }
+
+ links = links->next;
+ }
+ }
+}
+
+
+static void
+expand_and_sort_rule_array (gpointer key,
+ gpointer value,
+ gpointer data)
+{
+ char *name = key;
+ GArray *rule_array = value;
+ RuleData *rule, tmp_rule;
+ int len, max_year, i, from, to, year;
+ gboolean is_infinite;
+
+ /* We expand the rule data to a year greater than any year used in a Zone
+ UNTIL value. This is so that we can easily get parts of the array to
+ use for each Zone line. */
+ max_year = GPOINTER_TO_INT (data) + 2;
+
+ /* If any of the rules apply to several years, we turn it into a single rule
+ for each year. If the Rule is infinite we go up to max_year.
+ We change the FROM field in the copies of the Rule, setting it to each
+ of the years, and set TO to FROM, except if TO was YEAR_MAXIMUM we set
+ the last TO to YEAR_MAXIMUM, so we still know the Rule is infinite. */
+ len = rule_array->len;
+ for (i = 0; i < len; i++) {
+ rule = &g_array_index (rule_array, RuleData, i);
+
+ /* None of the Rules currently use the TYPE field, but we'd better check.
+ */
+ if (rule->type) {
+ fprintf (stderr, "Rules %s has a TYPE: %s\n", name, rule->type);
+ exit (1);
+ }
+
+ if (rule->from_year != rule->to_year) {
+ from = rule->from_year;
+ to = rule->to_year;
+
+ tmp_rule = *rule;
+
+ /* Flag that this is a shallow copy so we don't free anything twice. */
+ tmp_rule.is_shallow_copy = TRUE;
+
+ /* See if it is an infinite Rule. */
+ if (to == YEAR_MAXIMUM) {
+ is_infinite = TRUE;
+ to = max_year;
+ if (from < to)
+ rule->to_year = rule->from_year;
+ } else {
+ is_infinite = FALSE;
+ }
+
+ /* Create a copy of the Rule for each year. */
+ for (year = from + 1; year <= to; year++) {
+ tmp_rule.from_year = year;
+
+ /* If the Rule is infinite, mark the last copy as infinite. */
+ if (year == to && is_infinite)
+ tmp_rule.to_year = YEAR_MAXIMUM;
+ else
+ tmp_rule.to_year = year;
+
+ g_array_append_val (rule_array, tmp_rule);
+ }
+ }
+ }
+
+ /* Now sort the rules. */
+ qsort (rule_array->data, rule_array->len, sizeof (RuleData), rule_sort_func);
+
+#if 0
+ dump_rule_array (name, rule_array, stdout);
+#endif
+}
+
+
+/* This is used to sort the rules, after the rules have all been expanded so
+ that each one is only for one year. */
+static int
+rule_sort_func (const void *arg1,
+ const void *arg2)
+{
+ RuleData *rule1, *rule2;
+ int time1_year, time1_month, time1_day;
+ int time2_year, time2_month, time2_day;
+ int month_diff, result;
+ VzicTime t1, t2;
+
+ rule1 = (RuleData*) arg1;
+ rule2 = (RuleData*) arg2;
+
+ time1_year = rule1->from_year;
+ time1_month = rule1->in_month;
+ time2_year = rule2->from_year;
+ time2_month = rule2->in_month;
+
+ /* If there is more that one month difference we don't need to calculate
+ the day or time. */
+ month_diff = (time1_year - time2_year) * 12 + time1_month - time2_month;
+
+ if (month_diff > 1)
+ return 1;
+ if (month_diff < -1)
+ return -1;
+
+ /* Now we have to calculate the day and time of the Rule start and the
+ VzicTime, using the given offsets. */
+ t1.year = time1_year;
+ t1.month = time1_month;
+ t1.day_code = rule1->on_day_code;
+ t1.day_number = rule1->on_day_number;
+ t1.day_weekday = rule1->on_day_weekday;
+ t1.time_code = rule1->at_time_code;
+ t1.time_seconds = rule1->at_time_seconds;
+
+ t2.year = time2_year;
+ t2.month = time2_month;
+ t2.day_code = rule2->on_day_code;
+ t2.day_number = rule2->on_day_number;
+ t2.day_weekday = rule2->on_day_weekday;
+ t2.time_code = rule2->at_time_code;
+ t2.time_seconds = rule2->at_time_seconds;
+
+ /* FIXME: We don't know the offsets yet, but I don't think any Rules are
+ close enough together that the offsets can make a difference. Should
+ check this. */
+ calculate_actual_time (&t1, TIME_WALL, 0, 0);
+ calculate_actual_time (&t2, TIME_WALL, 0, 0);
+
+ /* Now we can compare the entire time. */
+ if (t1.year > t2.year)
+ result = 1;
+ else if (t1.year < t2.year)
+ result = -1;
+
+ else if (t1.month > t2.month)
+ result = 1;
+ else if (t1.month < t2.month)
+ result = -1;
+
+ else if (t1.day_number > t2.day_number)
+ result = 1;
+ else if (t1.day_number < t2.day_number)
+ result = -1;
+
+ else if (t1.time_seconds > t2.time_seconds)
+ result = 1;
+ else if (t1.time_seconds < t2.time_seconds)
+ result = -1;
+
+ else {
+ printf ("WARNING: Rule dates matched.\n");
+ result = 0;
+ }
+
+ return result;
+}
+
+
+static void
+output_zone (char *directory,
+ ZoneData *zone,
+ char *zone_name,
+ GHashTable *rule_data)
+{
+ FILE *fp, *changes_fp = NULL;
+ char output_directory[PATHNAME_BUFFER_SIZE];
+ char filename[PATHNAME_BUFFER_SIZE];
+ char changes_filename[PATHNAME_BUFFER_SIZE];
+ char *zone_directory, *zone_subdirectory, *zone_filename;
+
+ /* Set a global for the zone_name, to be used only for debug messages. */
+ CurrentZoneName = zone_name;
+
+ /* Use this to only output a particular zone. */
+#if 0
+ if (strcmp (zone_name, "Atlantic/Azores"))
+ return;
+#endif
+
+#if 0
+ printf ("Outputting Zone: %s\n", zone_name);
+#endif
+
+ if (!parse_zone_name (zone_name, &zone_directory, &zone_subdirectory,
+ &zone_filename))
+ return;
+
+ if (VzicDumpZoneNamesAndCoords) {
+ VzicTimeZoneNames = g_list_prepend (VzicTimeZoneNames,
+ g_strdup (zone_name));
+ }
+
+ sprintf (output_directory, "%s/%s", directory, zone_directory);
+ ensure_directory_exists (output_directory);
+ sprintf (filename, "%s/%s.ics", output_directory, zone_filename);
+
+ if (VzicDumpChanges) {
+ sprintf (output_directory, "%s/ChangesVzic/%s", directory, zone_directory);
+ ensure_directory_exists (output_directory);
+ sprintf (changes_filename, "%s/%s", output_directory, zone_filename);
+ }
+
+ if (zone_subdirectory) {
+ sprintf (output_directory, "%s/%s/%s", directory, zone_directory,
+ zone_subdirectory);
+ ensure_directory_exists (output_directory);
+ sprintf (filename, "%s/%s.ics", output_directory, zone_filename);
+
+ if (VzicDumpChanges) {
+ sprintf (output_directory, "%s/ChangesVzic/%s/%s", directory,
+ zone_directory, zone_subdirectory);
+ ensure_directory_exists (output_directory);
+ sprintf (changes_filename, "%s/%s", output_directory, zone_filename);
+ }
+ }
+
+ /* Create the files. */
+ fp = fopen (filename, "w");
+ if (!fp) {
+ fprintf (stderr, "Couldn't create file: %s\n", filename);
+ exit (1);
+ }
+
+ if (VzicDumpChanges) {
+ changes_fp = fopen (changes_filename, "w");
+ if (!changes_fp) {
+ fprintf (stderr, "Couldn't create file: %s\n", changes_filename);
+ exit (1);
+ }
+ }
+
+ fprintf (fp, "BEGIN:VCALENDAR\nPRODID:%s\nVERSION:2.0\n", ProductID);
+
+ output_zone_to_files (zone, zone_name, rule_data, fp, changes_fp);
+
+ if (ferror (fp)) {
+ fprintf (stderr, "Error writing file: %s\n", filename);
+ exit (1);
+ }
+
+ fprintf (fp, "END:VCALENDAR\n");
+
+ fclose (fp);
+
+ g_free (zone_directory);
+ g_free (zone_subdirectory);
+ g_free (zone_filename);
+}
+
+
+/* This checks that the Zone name only uses the characters in [-+_/a-zA-Z0-9],
+ and outputs a warning if it isn't. */
+static gboolean
+parse_zone_name (char *name,
+ char **directory,
+ char **subdirectory,
+ char **filename)
+{
+ static int invalid_zone_num = 1;
+
+ char *p, ch, *first_slash_pos = NULL, *second_slash_pos = NULL;
+ gboolean invalid = FALSE;
+
+ for (p = name; (ch = *p) != 0; p++) {
+ if ((ch < 'a' || ch > 'z') && (ch < 'A' || ch > 'Z')
+ && (ch < '0' || ch > '9') && ch != '/' && ch != '_'
+ && ch != '-' && ch != '+') {
+ fprintf (stderr, "WARNING: Unusual Zone name: %s\n", name);
+ invalid = TRUE;
+ break;
+ }
+
+ if (ch == '/') {
+ if (!first_slash_pos) {
+ first_slash_pos = p;
+ } else if (!second_slash_pos) {
+ second_slash_pos = p;
+ } else {
+ fprintf (stderr, "WARNING: More than 2 '/' characters in Zone name: %s\n", name);
+ invalid = TRUE;
+ break;
+ }
+ }
+ }
+
+ if (!first_slash_pos) {
+#if 0
+ fprintf (stderr, "No '/' character in Zone name: %s. Skipping.\n", name);
+#endif
+ return FALSE;
+ }
+
+ if (invalid) {
+ *directory = g_strdup ("Invalid");
+ *filename = g_strdup_printf ("Zone%i", invalid_zone_num++);
+ } else {
+ *first_slash_pos = '\0';
+ *directory = g_strdup (name);
+ *first_slash_pos = '/';
+
+ if (second_slash_pos) {
+ *second_slash_pos = '\0';
+ *subdirectory = g_strdup (first_slash_pos + 1);
+ *second_slash_pos = '/';
+
+ *filename = g_strdup (second_slash_pos + 1);
+ } else {
+ *subdirectory = NULL;
+ *filename = g_strdup (first_slash_pos + 1);
+ }
+ }
+
+ return invalid ? FALSE : TRUE;
+}
+
+
+static void
+output_zone_to_files (ZoneData *zone,
+ char *zone_name,
+ GHashTable *rule_data,
+ FILE *fp,
+ FILE *changes_fp)
+{
+ ZoneLineData *zone_line;
+ GArray *changes;
+ int i, stdoff, walloff, start_index, save_seconds;
+ VzicTime start, end, *vzictime_start, *vzictime, *vzictime_first_rule_change;
+ gboolean is_daylight, found_letter_s;
+ char *start_letter_s;
+
+ changes = g_array_new (FALSE, FALSE, sizeof (VzicTime));
+
+ vzictime_init (&start);
+ vzictime_init (&end);
+
+ /* The first period starts at -infinity. */
+ start.year = YEAR_MINIMUM;
+
+ for (i = 0; i < zone->zone_line_data->len; i++) {
+ zone_line = &g_array_index (zone->zone_line_data, ZoneLineData, i);
+
+ /* This is the local standard time offset from GMT for this period. */
+ start.stdoff = stdoff = zone_line->stdoff_seconds;
+ start.walloff = walloff = stdoff + zone_line->save_seconds;
+
+ if (zone_line->until_set) {
+ end.year = zone_line->until_year;
+ end.month = zone_line->until_month;
+ end.day_code = zone_line->until_day_code;
+ end.day_number = zone_line->until_day_number;
+ end.day_weekday = zone_line->until_day_weekday;
+ end.time_seconds = zone_line->until_time_seconds;
+ end.time_code = zone_line->until_time_code;
+ } else {
+ /* The last period ends at +infinity. */
+ end.year = YEAR_MAXIMUM;
+ }
+
+ /* Add a time change for the start of the period. This may be removed
+ later if one of the rules expands to exactly the same time. */
+ start_index = changes->len;
+ g_array_append_val (changes, start);
+
+ /* If there are Rules associated with this period, add all the relevant
+ time changes. */
+ save_seconds = 0;
+ if (zone_line->rules)
+ found_letter_s = add_rule_changes (zone_line, zone_name, changes,
+ rule_data, &start, &end,
+ &start_letter_s, &save_seconds);
+ else
+ found_letter_s = FALSE;
+
+ /* FIXME: I'm not really sure what to do about finding a LETTER_S for the
+ first part of the period (i.e. before the first Rule comes into effect).
+ Currently we try to use the same LETTER_S as the first Rule of the
+ period which is in local standard time. */
+ if (zone_line->save_seconds)
+ save_seconds = zone_line->save_seconds;
+ is_daylight = save_seconds ? TRUE : FALSE;
+ vzictime_start = &g_array_index (changes, VzicTime, start_index);
+ walloff = vzictime_start->walloff = stdoff + save_seconds;
+
+ /* TEST: See if the first Rule time is exactly the same as the change from
+ the Zone line. In which case we can remove the Zone line change. */
+ if (changes->len > start_index + 1) {
+ int prev_stdoff, prev_walloff;
+
+ if (start_index > 0) {
+ VzicTime *v = &g_array_index (changes, VzicTime, start_index - 1);
+ prev_stdoff = v->stdoff;
+ prev_walloff = v->walloff;
+ } else {
+ prev_stdoff = 0;
+ prev_walloff = 0;
+ }
+ vzictime_first_rule_change = &g_array_index (changes, VzicTime,
+ start_index + 1);
+ if (times_match (vzictime_start, prev_stdoff, prev_walloff,
+ vzictime_first_rule_change, stdoff, walloff)) {
+#if 0
+ printf ("Removing zone-line change (using new offsets)\n");
+#endif
+ g_array_remove_index (changes, start_index);
+ vzictime_start = NULL;
+ } else if (times_match (vzictime_start, prev_stdoff, prev_walloff,
+ vzictime_first_rule_change, prev_stdoff, prev_walloff)) {
+#if 0
+ printf ("Removing zone-line change (using previous offsets)\n");
+#endif
+ g_array_remove_index (changes, start_index);
+ vzictime_start = NULL;
+ }
+ }
+
+
+ if (vzictime_start) {
+ vzictime_start->tzname = expand_tzname (zone_name, zone_line->format,
+ found_letter_s,
+ start_letter_s, is_daylight);
+ }
+
+ /* The start of the next Zone line is the end time of this one. */
+ start = end;
+ }
+
+ set_previous_offsets (changes);
+
+ output_zone_components (fp, zone_name, changes);
+
+ if (VzicDumpChanges)
+ dump_changes (changes_fp, zone_name, changes);
+
+ /* Free all the TZNAME fields. */
+ for (i = 0; i < changes->len; i++) {
+ vzictime = &g_array_index (changes, VzicTime, i);
+ g_free (vzictime->tzname);
+ }
+
+ g_array_free (changes, TRUE);
+}
+
+
+/* This appends any timezone changes specified by the rules associated with
+ the timezone, that happen between the start and end times.
+ It returns the letter_s field of the first STANDARD rule found in the
+ search. We need this to fill in any %s in the FORMAT field of the first
+ component of the time period (the Zone line). */
+static gboolean
+add_rule_changes (ZoneLineData *zone_line,
+ char *zone_name,
+ GArray *changes,
+ GHashTable *rule_data,
+ VzicTime *start,
+ VzicTime *end,
+ char **start_letter_s,
+ int *save_seconds)
+{
+ GArray *rule_array;
+ RuleData *rule, *prev_rule = NULL;
+ int stdoff, walloff, i, prev_stdoff, prev_walloff;
+ VzicTime vzictime;
+ gboolean is_daylight, found_start_letter_s = FALSE;
+ gboolean checked_for_previous = FALSE;
+
+ *save_seconds = 0;
+
+ rule_array = g_hash_table_lookup (rule_data, zone_line->rules);
+ if (!rule_array) {
+ fprintf (stderr, "Couldn't access rules: %s\n", zone_line->rules);
+ exit (1);
+ }
+
+ /* The stdoff is the same for all the rules. */
+ stdoff = start->stdoff;
+
+ /* The walloff changes as we go through the rules. */
+ walloff = start->walloff;
+
+ /* Get the stdoff & walloff from the last change before this period. */
+ if (changes->len >= 2) {
+ VzicTime *change = &g_array_index (changes, VzicTime, changes->len - 2);
+ prev_stdoff = change->stdoff;
+ prev_walloff = change->walloff;
+ } else {
+ prev_stdoff = prev_walloff = 0;
+ }
+
+
+ for (i = 0; i < rule_array->len; i++) {
+ rule = &g_array_index (rule_array, RuleData, i);
+
+ is_daylight = rule->save_seconds != 0 ? TRUE : FALSE;
+
+ vzictime_init (&vzictime);
+ vzictime.year = rule->from_year;
+ vzictime.month = rule->in_month;
+ vzictime.day_code = rule->on_day_code;
+ vzictime.day_number = rule->on_day_number;
+ vzictime.day_weekday = rule->on_day_weekday;
+ vzictime.time_seconds = rule->at_time_seconds;
+ vzictime.time_code = rule->at_time_code;
+ vzictime.stdoff = stdoff;
+ vzictime.walloff = stdoff + rule->save_seconds;
+ vzictime.is_infinite = (rule->to_year == YEAR_MAXIMUM) ? TRUE : FALSE;
+
+ /* If the rule time is before the given start time, skip it. */
+ if (compare_times (&vzictime, stdoff, walloff,
+ start, prev_stdoff, prev_walloff) < 0)
+ continue;
+
+ /* If the previous Rule was a daylight Rule, then we may want to use the
+ walloff from that. */
+ if (!checked_for_previous) {
+ checked_for_previous = TRUE;
+ if (i > 0) {
+ prev_rule = &g_array_index (rule_array, RuleData, i - 1);
+ if (prev_rule->save_seconds) {
+ walloff = start->walloff = stdoff + prev_rule->save_seconds;
+ *save_seconds = prev_rule->save_seconds;
+ found_start_letter_s = TRUE;
+ *start_letter_s = prev_rule->letter_s;
+#if 0
+ printf ("Could use save_seconds from previous Rule: %s\n",
+ zone_name);
+#endif
+ }
+ }
+ }
+
+ /* If an end time has been given, then if the rule time is on or after it
+ break out of the loop. */
+ if (end->year != YEAR_MAXIMUM
+ && compare_times (&vzictime, stdoff, walloff,
+ end, stdoff, walloff) >= 0)
+ break;
+
+ vzictime.tzname = expand_tzname (zone_name, zone_line->format, TRUE,
+ rule->letter_s, is_daylight);
+
+ g_array_append_val (changes, vzictime);
+
+ /* When we find the first STANDARD time we set letter_s. */
+ if (!found_start_letter_s && !is_daylight) {
+ found_start_letter_s = TRUE;
+ *start_letter_s = rule->letter_s;
+ }
+
+ /* Now that we have added the Rule, the new walloff comes into effect
+ for any following Rules. */
+ walloff = vzictime.walloff;
+ }
+
+ return found_start_letter_s;
+}
+
+
+/* This expands the Zone line FORMAT field, using the given LETTER_S from a
+ Rule line. There are 3 types of FORMAT field:
+ 1. a string with an %s in, e.g. "WE%sT". The %s is replaced with LETTER_S.
+ 2. a string with an '/' in, e.g. "CAT/CAWT". The first part is used for
+ standard time and the second part for when daylight-saving is in effect.
+ 3. a plain string, e.g. "LMT", which we leave as-is.
+ Note that (1) is the only type in which letter_s is required.
+*/
+static char*
+expand_tzname (char *zone_name,
+ char *format,
+ gboolean have_letter_s,
+ char *letter_s,
+ gboolean is_daylight)
+{
+ char *p, buffer[256], *guess = NULL;
+ int len;
+
+#if 0
+ printf ("Expanding %s with %s\n", format, letter_s);
+#endif
+
+ if (!format || !format[0]) {
+ fprintf (stderr, "Missing FORMAT\n");
+ exit (1);
+ }
+
+ /* 1. Look for a "%s". */
+ p = strchr (format, '%');
+ if (p && *(p + 1) == 's') {
+ if (!have_letter_s) {
+
+ /* NOTE: These are a few hard-coded TZNAMEs that I've looked up myself.
+ These are needed in a few places where a Zone line comes into effect
+ but no Rule has been found, so we have no LETTER_S to use.
+ I've tried to use whatever is the normal LETTER_S in the Rules for
+ the particular zone, in local standard time. */
+ if (!strcmp (zone_name, "Asia/Macao")
+ && !strcmp (format, "C%sT"))
+ guess = "CST";
+ else if (!strcmp (zone_name, "Asia/Macau")
+ && !strcmp (format, "C%sT"))
+ guess = "CST";
+ else if (!strcmp (zone_name, "Asia/Ashgabat")
+ && !strcmp (format, "ASH%sT"))
+ guess = "ASHT";
+ else if (!strcmp (zone_name, "Asia/Ashgabat")
+ && !strcmp (format, "TM%sT"))
+ guess = "TMT";
+ else if (!strcmp (zone_name, "Asia/Samarkand")
+ && !strcmp (format, "TAS%sT"))
+ guess = "TAST";
+ else if (!strcmp (zone_name, "Atlantic/Azores")
+ && !strcmp (format, "WE%sT"))
+ guess = "WET";
+ else if (!strcmp (zone_name, "Europe/Paris")
+ && !strcmp (format, "WE%sT"))
+ guess = "WET";
+ else if (!strcmp (zone_name, "Europe/Warsaw")
+ && !strcmp (format, "CE%sT"))
+ guess = "CET";
+ else if (!strcmp (zone_name, "America/Phoenix")
+ && !strcmp (format, "M%sT"))
+ guess = "MST";
+ else if (!strcmp (zone_name, "America/Nome")
+ && !strcmp (format, "Y%sT"))
+ guess = "YST";
+
+ if (guess) {
+#if 0
+ fprintf (stderr,
+ "WARNING: Couldn't find a LETTER_S to use in FORMAT: %s in Zone: %s Guessing: %s\n",
+ format, zone_name, guess);
+#endif
+ return g_strdup (guess);
+ }
+
+#if 1
+ fprintf (stderr,
+ "WARNING: Couldn't find a LETTER_S to use in FORMAT: %s in Zone: %s Leaving TZNAME empty\n",
+ format, zone_name);
+#endif
+
+#if 0
+ /* This is useful to spot exactly which component had a problem. */
+ sprintf (buffer, "FIXME: %s", format);
+ return g_strdup (buffer);
+#else
+ /* We give up and don't output a TZNAME. */
+ return NULL;
+#endif
+ }
+
+ sprintf (buffer, format, letter_s ? letter_s : "");
+ return g_strdup (buffer);
+ }
+
+ /* 2. Look for a "/". */
+ p = strchr (format, '/');
+ if (p) {
+ if (is_daylight) {
+ return g_strdup (p + 1);
+ } else {
+ len = p - format;
+ strncpy (buffer, format, len);
+ buffer[len] = '\0';
+ return g_strdup (buffer);
+ }
+ }
+
+ /* 3. Just use format as it is. */
+ return g_strdup (format);
+}
+
+
+/* Compares 2 VzicTimes, returning strcmp()-like values, i.e. 0 if equal,
+ 1 if the 1st is after the 2nd and -1 if the 1st is before the 2nd. */
+static int
+compare_times (VzicTime *time1,
+ int stdoff1,
+ int walloff1,
+ VzicTime *time2,
+ int stdoff2,
+ int walloff2)
+{
+ VzicTime t1, t2;
+ int result;
+
+ t1 = *time1;
+ t2 = *time2;
+
+ calculate_actual_time (&t1, TIME_UNIVERSAL, stdoff1, walloff1);
+ calculate_actual_time (&t2, TIME_UNIVERSAL, stdoff2, walloff2);
+
+ /* Now we can compare the entire time. */
+ if (t1.year > t2.year)
+ result = 1;
+ else if (t1.year < t2.year)
+ result = -1;
+
+ else if (t1.month > t2.month)
+ result = 1;
+ else if (t1.month < t2.month)
+ result = -1;
+
+ else if (t1.day_number > t2.day_number)
+ result = 1;
+ else if (t1.day_number < t2.day_number)
+ result = -1;
+
+ else if (t1.time_seconds > t2.time_seconds)
+ result = 1;
+ else if (t1.time_seconds < t2.time_seconds)
+ result = -1;
+
+ else
+ result = 0;
+
+#if 0
+ printf ("%i/%i/%i %i <=> %i/%i/%i %i -> %i\n",
+ t1.day_number, t1.month + 1, t1.year, t1.time_seconds,
+ t2.day_number, t2.month + 1, t2.year, t2.time_seconds,
+ result);
+#endif
+
+ return result;
+}
+
+
+/* Returns TRUE if the 2 times are exactly the same. It will calculate the
+ actual day, but doesn't convert times. */
+static gboolean
+times_match (VzicTime *time1,
+ int stdoff1,
+ int walloff1,
+ VzicTime *time2,
+ int stdoff2,
+ int walloff2)
+{
+ VzicTime t1, t2;
+
+ t1 = *time1;
+ t2 = *time2;
+
+ calculate_actual_time (&t1, TIME_UNIVERSAL, stdoff1, walloff1);
+ calculate_actual_time (&t2, TIME_UNIVERSAL, stdoff2, walloff2);
+
+ if (t1.year == t2.year
+ && t1.month == t2.month
+ && t1.day_number == t2.day_number
+ && t1.time_seconds == t2.time_seconds)
+ return TRUE;
+
+ return FALSE;
+}
+
+
+static void
+output_zone_components (FILE *fp,
+ char *name,
+ GArray *changes)
+{
+ VzicTime *vzictime;
+ int i, start_index = 0;
+ gboolean only_one_change = FALSE;
+ char start_buffer[1024];
+
+ fprintf (fp, "BEGIN:VTIMEZONE\nTZID:%s%s\n", TZIDPrefixExpanded, name);
+
+ if (VzicUrlPrefix != NULL)
+ fprintf (fp, "TZURL:%s/%s\n", VzicUrlPrefix, name);
+
+ /* We use an 'X-' property to place the city name in. */
+ fprintf (fp, "X-LIC-LOCATION:%s\n", name);
+
+ /* We try to find any recurring components first, or they may get output
+ as lots of RDATES instead. */
+ if (!VzicNoRRules) {
+ int num_rrules_output = 0;
+
+ for (i = 1; i < changes->len; i++) {
+ if (check_for_recurrence (fp, changes, i)) {
+ num_rrules_output++;
+ }
+ }
+
+#if 0
+ printf ("Zone: %s had %i infinite RRULEs\n", CurrentZoneName,
+ num_rrules_output);
+#endif
+
+ if (!VzicPureOutput && num_rrules_output == 2) {
+#if 0
+ printf ("Zone: %s using 2 RRULEs\n", CurrentZoneName);
+#endif
+ fprintf (fp, "END:VTIMEZONE\n");
+ return;
+ }
+ }
+
+ /* We skip the first change, which starts at -infinity, unless it is the only
+ change for the timezone. */
+ if (changes->len > 1)
+ start_index = 1;
+ else
+ only_one_change = TRUE;
+
+ /* For pure output, we start at the start of the array and step through it
+ outputting RDATEs. For Outlook-compatible output we start at the end
+ and step backwards to find the first STANDARD time to output. */
+ if (VzicPureOutput)
+ i = start_index - 1;
+ else
+ i = changes->len;
+
+ for (;;) {
+ if (VzicPureOutput)
+ i++;
+ else
+ i--;
+
+ if (VzicPureOutput) {
+ if (i >= changes->len)
+ break;
+ } else {
+ if (i < start_index)
+ break;
+ }
+
+ vzictime = &g_array_index (changes, VzicTime, i);
+
+ /* If we have already output this component as part of an RRULE or RDATE,
+ then we skip it. */
+ if (vzictime->output)
+ continue;
+
+ /* For Outlook-compatible output we only want to output the last STANDARD
+ time as a DTSTART, so skip any DAYLIGHT changes. */
+ if (!VzicPureOutput && vzictime->stdoff != vzictime->walloff) {
+ printf ("Skipping DAYLIGHT change\n");
+ continue;
+ }
+
+#if 0
+ printf ("Zone: %s using DTSTART Year: %i\n", CurrentZoneName,
+ vzictime->year);
+#endif
+
+ if (VzicPureOutput) {
+ output_component_start (start_buffer, vzictime, TRUE, only_one_change);
+ } else {
+ /* For Outlook compatability we don't output the RDATE and use the same
+ TZOFFSET for TZOFFSETFROM and TZOFFSETTO. */
+ vzictime->year = RDATE_YEAR;
+ vzictime->month = 0;
+ vzictime->day_code = DAY_SIMPLE;
+ vzictime->day_number = 1;
+ vzictime->time_code = TIME_WALL;
+ vzictime->time_seconds = 0;
+
+ output_component_start (start_buffer, vzictime, FALSE, TRUE);
+ }
+
+ fprintf (fp, "%s", start_buffer);
+
+ /* This will look for matching components and output them as RDATEs
+ instead of separate components. */
+ if (VzicPureOutput && !VzicNoRDates)
+ check_for_rdates (fp, changes, i);
+
+ output_component_end (fp, vzictime);
+
+ vzictime->output = TRUE;
+
+ if (!VzicPureOutput)
+ break;
+ }
+
+ fprintf (fp, "END:VTIMEZONE\n");
+}
+
+
+/* This sets the prev_stdoff and prev_walloff (i.e. the TZOFFSETFROM) of each
+ VzicTime, using the stdoff and walloff of the previous VzicTime. It makes
+ the rest of the code much simpler. */
+static void
+set_previous_offsets (GArray *changes)
+{
+ VzicTime *vzictime, *prev_vzictime;
+ int i;
+
+ prev_vzictime = &g_array_index (changes, VzicTime, 0);
+ prev_vzictime->prev_stdoff = 0;
+ prev_vzictime->prev_walloff = 0;
+
+ for (i = 1; i < changes->len; i++) {
+ vzictime = &g_array_index (changes, VzicTime, i);
+
+ vzictime->prev_stdoff = prev_vzictime->stdoff;
+ vzictime->prev_walloff = prev_vzictime->walloff;
+
+ prev_vzictime = vzictime;
+ }
+}
+
+
+/* Returns TRUE if we output an infinite recurrence. */
+static gboolean
+check_for_recurrence (FILE *fp,
+ GArray *changes,
+ int idx)
+{
+ VzicTime *vzictime_start, *vzictime, vzictime_start_copy;
+ gboolean is_daylight_start, is_daylight;
+ int last_match, i, next_year, day_offset;
+ char until[256], rrule_buffer[2048], start_buffer[1024];
+ GList *matching_elements = NULL, *elem;
+
+ vzictime_start = &g_array_index (changes, VzicTime, idx);
+
+ /* If this change has already been output, skip it. */
+ if (vzictime_start->output)
+ return FALSE;
+
+ /* There can't possibly be an RRULE starting from YEAR_MINIMUM. */
+ if (vzictime_start->year == YEAR_MINIMUM)
+ return FALSE;
+
+ is_daylight_start = (vzictime_start->stdoff != vzictime_start->walloff)
+ ? TRUE : FALSE;
+
+#if 0
+ printf ("\nChecking: %s OFFSETFROM: %i %s\n",
+ format_vzictime (vzictime_start), vzictime_start->prev_walloff,
+ is_daylight_start ? "DAYLIGHT" : "");
+#endif
+
+ /* If this is an infinitely recurring change, output the RRULE and return.
+ There won't be any changes after it that we could merge. */
+ if (vzictime_start->is_infinite) {
+
+ /* Change the year to our minimum start year. */
+ vzictime_start_copy = *vzictime_start;
+ if (!VzicPureOutput)
+ vzictime_start_copy.year = RRULE_START_YEAR;
+
+ day_offset = output_component_start (start_buffer, &vzictime_start_copy,
+ FALSE, FALSE);
+
+ if (!output_rrule (rrule_buffer, vzictime_start_copy.month,
+ vzictime_start_copy.day_code,
+ vzictime_start_copy.day_number,
+ vzictime_start_copy.day_weekday, day_offset, "")) {
+ if (vzictime_start->year != MAX_TIME_T_YEAR) {
+ fprintf (stderr, "WARNING: Failed to output infinite recurrence with start year: %i\n", vzictime_start->year);
+ }
+ return TRUE;
+ }
+
+ fprintf (fp, "%s%s", start_buffer, rrule_buffer);
+ output_component_end (fp, vzictime_start);
+ vzictime_start->output = TRUE;
+ return TRUE;
+ }
+
+ last_match = idx;
+ next_year = vzictime_start->year + 1;
+ for (i = idx + 1; i < changes->len; i++) {
+ vzictime = &g_array_index (changes, VzicTime, i);
+
+ is_daylight = (vzictime->stdoff != vzictime->walloff) ? TRUE : FALSE;
+
+ if (vzictime->output)
+ continue;
+
+#if 0
+ printf (" %s OFFSETFROM: %i %s\n",
+ format_vzictime (vzictime), vzictime->prev_walloff,
+ is_daylight ? "DAYLIGHT" : "");
+#endif
+
+ /* If it is more than one year ahead, we are finished, since we want
+ consecutive years. */
+ if (vzictime->year > next_year) {
+ break;
+ }
+
+ /* It must be the same type of component - STANDARD or DAYLIGHT. */
+ if (is_daylight != is_daylight_start) {
+ continue;
+ }
+
+ /* It must be the following year, with the same month, day & time.
+ It is possible that the time has a different code but does in fact
+ match when normalized, but we don't care (for now at least). */
+ if (vzictime->year != next_year
+ || vzictime->month != vzictime_start->month
+ || vzictime->day_code != vzictime_start->day_code
+ || vzictime->day_number != vzictime_start->day_number
+ || vzictime->day_weekday != vzictime_start->day_weekday
+ || vzictime->time_seconds != vzictime_start->time_seconds
+ || vzictime->time_code != vzictime_start->time_code) {
+ continue;
+ }
+
+ /* The TZOFFSETFROM and TZOFFSETTO must match. */
+ if (vzictime->prev_walloff != vzictime_start->prev_walloff) {
+ continue;
+ }
+
+ if (vzictime->walloff != vzictime_start->walloff) {
+ continue;
+ }
+
+ /* TZNAME must match. */
+ if (!timezones_match (vzictime->tzname, vzictime_start->tzname)) {
+ continue;
+ }
+
+ /* We have a match. */
+ last_match = i;
+ next_year = vzictime->year + 1;
+
+ matching_elements = g_list_prepend (matching_elements, vzictime);
+ }
+
+ if (last_match == idx)
+ return FALSE;
+
+#if 0
+ printf ("Found recurrence %i - %i!!!\n", vzictime_start->year,
+ next_year - 1);
+#endif
+
+ vzictime = &g_array_index (changes, VzicTime, last_match);
+
+/* We only use RRULEs if there are at least MIN_RRULE_OCCURRENCES occurrences,
+ since otherwise RDATEs are more efficient. */
+ if (!vzictime->is_infinite) {
+ int years = vzictime->year - vzictime_start->year + 1;
+#if 0
+ printf ("RRULE Years: %i\n", years);
+#endif
+ if (years < MIN_RRULE_OCCURRENCES)
+ return FALSE;
+ }
+
+ if (vzictime->is_infinite) {
+ until[0] = '\0';
+ } else {
+ VzicTime t1 = *vzictime;
+
+ printf ("RRULE with UNTIL - aborting\n");
+ abort ();
+
+ calculate_actual_time (&t1, TIME_UNIVERSAL, vzictime->prev_stdoff,
+ vzictime->prev_walloff);
+
+ /* Output UNTIL, in UTC. */
+ sprintf (until, ";UNTIL=%sZ", format_time (t1.year, t1.month,
+ t1.day_number,
+ t1.time_seconds));
+ }
+
+ /* Change the year to our minimum start year. */
+ vzictime_start_copy = *vzictime_start;
+ if (!VzicPureOutput)
+ vzictime_start_copy.year = RRULE_START_YEAR;
+
+ day_offset = output_component_start (start_buffer, &vzictime_start_copy,
+ FALSE, FALSE);
+ if (output_rrule (rrule_buffer, vzictime_start_copy.month,
+ vzictime_start_copy.day_code,
+ vzictime_start_copy.day_number,
+ vzictime_start_copy.day_weekday, day_offset, until)) {
+ fprintf (fp, "%s%s", start_buffer, rrule_buffer);
+ output_component_end (fp, vzictime_start);
+
+ /* Mark all the changes as output. */
+ vzictime_start->output = TRUE;
+ for (elem = matching_elements; elem; elem = elem->next) {
+ vzictime = elem->data;
+ vzictime->output = TRUE;
+ }
+ }
+
+ g_list_free (matching_elements);
+
+ return TRUE;
+}
+
+
+static void
+check_for_rdates (FILE *fp,
+ GArray *changes,
+ int idx)
+{
+ VzicTime *vzictime_start, *vzictime, tmp_vzictime;
+ gboolean is_daylight_start, is_daylight;
+ int i, year, month, day, time;
+
+ vzictime_start = &g_array_index (changes, VzicTime, idx);
+
+ is_daylight_start = (vzictime_start->stdoff != vzictime_start->walloff)
+ ? TRUE : FALSE;
+
+#if 0
+ printf ("\nChecking: %s OFFSETFROM: %i %s\n",
+ format_vzictime (vzictime_start), vzictime_start->prev_walloff,
+ is_daylight_start ? "DAYLIGHT" : "");
+#endif
+
+ /* We want to go backwards through the array now, for Outlook compatability.
+ (It only looks at the first DTSTART/RDATE.) */
+ for (i = idx + 1; i < changes->len; i++) {
+ vzictime = &g_array_index (changes, VzicTime, i);
+
+ is_daylight = (vzictime->stdoff != vzictime->walloff) ? TRUE : FALSE;
+
+ if (vzictime->output)
+ continue;
+
+#if 0
+ printf (" %s OFFSETFROM: %i %s\n", format_vzictime (vzictime),
+ vzictime->prev_walloff, is_daylight ? "DAYLIGHT" : "");
+#endif
+
+ /* It must be the same type of component - STANDARD or DAYLIGHT. */
+ if (is_daylight != is_daylight_start) {
+ continue;
+ }
+
+ /* The TZOFFSETFROM and TZOFFSETTO must match. */
+ if (vzictime->prev_walloff != vzictime_start->prev_walloff) {
+ continue;
+ }
+
+ if (vzictime->walloff != vzictime_start->walloff) {
+ continue;
+ }
+
+ /* TZNAME must match. */
+ if (!timezones_match (vzictime->tzname, vzictime_start->tzname)) {
+ continue;
+ }
+
+ /* We have a match. */
+
+ tmp_vzictime = *vzictime;
+ calculate_actual_time (&tmp_vzictime, TIME_WALL, vzictime->prev_stdoff,
+ vzictime->prev_walloff);
+
+ fprintf (fp, "RDATE:%s\n", format_time (tmp_vzictime.year,
+ tmp_vzictime.month,
+ tmp_vzictime.day_number,
+ tmp_vzictime.time_seconds));
+
+ vzictime->output = TRUE;
+ }
+}
+
+
+static gboolean
+timezones_match (char *tzname1,
+ char *tzname2)
+{
+ if (tzname1 && tzname2 && !strcmp (tzname1, tzname2))
+ return TRUE;
+
+ if (!tzname1 && !tzname2)
+ return TRUE;
+
+ return FALSE;
+}
+
+
+/* Outputs the start of a VTIMEZONE component, with the BEGIN line,
+ the DTSTART, TZOFFSETFROM, TZOFFSETTO & TZNAME properties. */
+static int
+output_component_start (char *buffer,
+ VzicTime *vzictime,
+ gboolean output_rdate,
+ gboolean use_same_tz_offset)
+{
+ gboolean is_daylight, skip_day_offset = FALSE;
+ gint year, month, day, time, day_offset = 0;
+ GDate old_date, new_date;
+ char *formatted_time;
+ char line1[1024], line2[1024], line3[1024];
+ char line4[1024], line5[1024], line6[1024];
+ VzicTime tmp_vzictime;
+ int prev_walloff;
+
+ is_daylight = (vzictime->stdoff != vzictime->walloff) ? TRUE : FALSE;
+
+ tmp_vzictime = *vzictime;
+ day_offset = calculate_actual_time (&tmp_vzictime, TIME_WALL,
+ vzictime->prev_stdoff,
+ vzictime->prev_walloff);
+
+ sprintf (line1, "BEGIN:%s\n", is_daylight ? "DAYLIGHT" : "STANDARD");
+
+ /* If the timezone only has one change, that means it uses the same offset
+ forever, so we use the same TZOFFSETFROM as the TZOFFSETTO. (If the zone
+ has more than one change, we don't output the first one.) */
+ if (use_same_tz_offset)
+ prev_walloff = vzictime->walloff;
+ else
+ prev_walloff = vzictime->prev_walloff;
+
+ sprintf (line2, "TZOFFSETFROM:%s\n",
+ format_tz_offset (prev_walloff, !VzicPureOutput));
+
+ sprintf (line3, "TZOFFSETTO:%s\n",
+ format_tz_offset (vzictime->walloff, !VzicPureOutput));
+
+ if (vzictime->tzname)
+ sprintf (line4, "TZNAME:%s\n", vzictime->tzname);
+ else
+ line4[0] = '\0';
+
+ formatted_time = format_time (tmp_vzictime.year, tmp_vzictime.month,
+ tmp_vzictime.day_number,
+ tmp_vzictime.time_seconds);
+ sprintf (line5, "DTSTART:%s\n", formatted_time);
+ if (output_rdate)
+ sprintf (line6, "RDATE:%s\n", formatted_time);
+ else
+ line6[0] = '\0';
+
+ sprintf (buffer, "%s%s%s%s%s%s", line1, line2, line3, line4, line5, line6);
+
+ return day_offset;
+}
+
+
+/* Outputs the END line of the VTIMEZONE component. */
+static void
+output_component_end (FILE *fp,
+ VzicTime *vzictime)
+{
+ gboolean is_daylight;
+
+ is_daylight = (vzictime->stdoff != vzictime->walloff) ? TRUE : FALSE;
+
+ fprintf (fp, "END:%s\n", is_daylight ? "DAYLIGHT" : "STANDARD");
+}
+
+
+/* Initializes a VzicTime to 1st Jan in YEAR_MINIMUM at midnight, with all
+ offsets set to 0. */
+static void
+vzictime_init (VzicTime *vzictime)
+{
+ vzictime->year = YEAR_MINIMUM;
+ vzictime->month = 0;
+ vzictime->day_code = DAY_SIMPLE;
+ vzictime->day_number = 1;
+ vzictime->day_weekday = 0;
+ vzictime->time_seconds = 0;
+ vzictime->time_code = TIME_UNIVERSAL;
+ vzictime->stdoff = 0;
+ vzictime->walloff = 0;
+ vzictime->is_infinite = FALSE;
+ vzictime->output = FALSE;
+ vzictime->prev_stdoff = 0;
+ vzictime->prev_walloff = 0;
+ vzictime->tzname = NULL;
+}
+
+
+/* This calculates the actual local time that a change will occur, given
+ the offsets from standard and wall-clock time. It returns -1 or 1 if it
+ had to move backwards or forwards one day while converting to local time.
+ If it does this then we need to change the RRULEs we output. */
+static int
+calculate_actual_time (VzicTime *vzictime,
+ TimeCode time_code,
+ int stdoff,
+ int walloff)
+{
+ GDate date;
+ gint day_offset, days_in_month, weekday, offset, result;
+
+ vzictime->time_seconds = calculate_wall_time (vzictime->time_seconds,
+ vzictime->time_code,
+ stdoff, walloff, &day_offset);
+
+ if (vzictime->day_code != DAY_SIMPLE) {
+ if (vzictime->year == YEAR_MINIMUM || vzictime->year == YEAR_MAXIMUM) {
+ fprintf (stderr, "In calculate_actual_time: invalid year\n");
+ exit (0);
+ }
+
+ g_date_clear (&date, 1);
+ days_in_month = g_date_days_in_month (vzictime->month + 1, vzictime->year);
+
+ /* Note that the day_code refers to the date before we convert it to
+ a wall-clock date and time. So we find the day it was referring to,
+ then make any adjustments needed due to converting the time. */
+ if (vzictime->day_code == DAY_LAST_WEEKDAY) {
+ /* Find out what day the last day of the month is. */
+ g_date_set_dmy (&date, days_in_month, vzictime->month + 1,
+ vzictime->year);
+ weekday = g_date_weekday (&date) % 7;
+
+ /* Calculate how many days we have to go back to get to day_weekday. */
+ offset = (weekday + 7 - vzictime->day_weekday) % 7;
+
+ vzictime->day_number = days_in_month - offset;
+ } else {
+ /* Find out what day day_number actually is. */
+ g_date_set_dmy (&date, vzictime->day_number, vzictime->month + 1,
+ vzictime->year);
+ weekday = g_date_weekday (&date) % 7;
+
+ if (vzictime->day_code == DAY_WEEKDAY_ON_OR_AFTER)
+ offset = (vzictime->day_weekday + 7 - weekday) % 7;
+ else
+ offset = - ((weekday + 7 - vzictime->day_weekday) % 7);
+
+ vzictime->day_number = vzictime->day_number + offset;
+ }
+
+ vzictime->day_code = DAY_SIMPLE;
+
+ if (vzictime->day_number <= 0 || vzictime->day_number > days_in_month) {
+ fprintf (stderr, "Day overflow: %i\n", vzictime->day_number);
+ exit (1);
+ }
+ }
+
+#if 0
+ fprintf (stderr, "%s -> %i/%i/%i\n",
+ dump_day_coded (vzictime->day_code, vzictime->day_number,
+ vzictime->day_weekday),
+ vzictime->day_number, vzictime->month + 1, vzictime->year);
+#endif
+
+ fix_time_overflow (&vzictime->year, &vzictime->month,
+ &vzictime->day_number, day_offset);
+
+ /* If we want UTC time, we have to convert it now. */
+ if (time_code == TIME_UNIVERSAL) {
+ vzictime->time_seconds = calculate_until_time (vzictime->time_seconds,
+ TIME_WALL, stdoff, walloff,
+ &vzictime->year,
+ &vzictime->month,
+ &vzictime->day_number);
+ }
+
+ return day_offset;
+}
+
+
+/* This converts the given time into universal time (UTC), to be used in
+ the UNTIL property. */
+static int
+calculate_until_time (int time,
+ TimeCode time_code,
+ int stdoff,
+ int walloff,
+ int *year,
+ int *month,
+ int *day)
+{
+ int result, day_offset;
+
+ day_offset = 0;
+
+ switch (time_code) {
+ case TIME_WALL:
+ result = time - walloff;
+ break;
+ case TIME_STANDARD:
+ result = time - stdoff;
+ break;
+ case TIME_UNIVERSAL:
+ return time;
+ default:
+ fprintf (stderr, "Invalid time code\n");
+ exit (1);
+ }
+
+ if (result < 0) {
+ result += 24 * 60 * 60;
+ day_offset = -1;
+ } else if (result >= 24 * 60 * 60) {
+ result -= 24 * 60 * 60;
+ day_offset = 1;
+ }
+
+ /* Sanity check - we shouldn't have an overflow any more. */
+ if (result < 0 || result >= 24 * 60 * 60) {
+ fprintf (stderr, "Time overflow: %i\n", result);
+ abort ();
+ }
+
+ fix_time_overflow (year, month, day, day_offset);
+
+ return result;
+}
+
+
+/* This converts the given time into wall clock time (the local standard time
+ with any adjustment for daylight-saving). */
+static int
+calculate_wall_time (int time,
+ TimeCode time_code,
+ int stdoff,
+ int walloff,
+ int *day_offset)
+{
+ int result;
+
+ *day_offset = 0;
+
+ switch (time_code) {
+ case TIME_WALL:
+ return time;
+ case TIME_STANDARD:
+ /* We have a local standard time, so we have to subtract stdoff to get
+ back to UTC, then add walloff to get wall time. */
+ result = time - stdoff + walloff;
+ break;
+ case TIME_UNIVERSAL:
+ result = time + walloff;
+ break;
+ default:
+ fprintf (stderr, "Invalid time code\n");
+ exit (1);
+ }
+
+ if (result < 0) {
+ result += 24 * 60 * 60;
+ *day_offset = -1;
+ } else if (result >= 24 * 60 * 60) {
+ result -= 24 * 60 * 60;
+ *day_offset = 1;
+ }
+
+ /* Sanity check - we shouldn't have an overflow any more. */
+ if (result < 0 || result >= 24 * 60 * 60) {
+ fprintf (stderr, "Time overflow: %i\n", result);
+ exit (1);
+ }
+
+#if 0
+ printf ("%s -> ", dump_time (time, time_code, TRUE));
+ printf ("%s (%i)\n", dump_time (result, TIME_WALL, TRUE), *day_offset);
+#endif
+
+ return result;
+}
+
+
+static void
+fix_time_overflow (int *year,
+ int *month,
+ int *day,
+ int day_offset)
+{
+ if (day_offset == -1) {
+ *day = *day - 1;
+
+ if (*day == 0) {
+ *month = *month - 1;
+ if (*month == -1) {
+ *month = 11;
+ *year = *year - 1;
+ }
+ *day = g_date_days_in_month (*month + 1, *year);
+ }
+ } else if (day_offset == 1) {
+ *day = *day + 1;
+
+ if (*day > g_date_days_in_month (*month + 1, *year)) {
+ *month = *month + 1;
+ if (*month == 12) {
+ *month = 0;
+ *year = *year + 1;
+ }
+ *day = 1;
+ }
+ }
+}
+
+
+static char*
+format_time (int year,
+ int month,
+ int day,
+ int time)
+{
+ static char buffer[128];
+ int hour, minute, second;
+
+ /* When we are outputting the first component year will be YEAR_MINIMUM.
+ We used to use 1 when outputting this, but Outlook doesn't like any years
+ less that 1600, so we use 1600 instead. We don't output the first change
+ for most zones now, so it doesn't matter too much. */
+ if (year == YEAR_MINIMUM)
+ year = 1601;
+
+ /* We just use 9999 here, so we keep to 4 characters. But this should only
+ be needed when debugging - it shouldn't be needed in the VTIMEZONEs. */
+ if (year == YEAR_MAXIMUM) {
+ fprintf (stderr, "format_time: YEAR_MAXIMUM used\n");
+ year = 9999;
+ }
+
+ hour = time / 3600;
+ minute = (time % 3600) / 60;
+ second = time % 60;
+
+ sprintf (buffer, "%04i%02i%02iT%02i%02i%02i",
+ year, month + 1, day, hour, minute, second);
+
+ return buffer;
+}
+
+
+/* Outlook doesn't support 6-digit values, i.e. including the seconds, so
+ we round to the nearest minute. No current offsets use the seconds value,
+ so we aren't losing much. */
+static char*
+format_tz_offset (int tz_offset,
+ gboolean round_seconds)
+{
+ static char buffer[128];
+ char *sign = "+";
+ int hours, minutes, seconds;
+
+ if (tz_offset < 0) {
+ tz_offset = -tz_offset;
+ sign = "-";
+ }
+
+ if (round_seconds)
+ tz_offset += 30;
+
+ hours = tz_offset / 3600;
+ minutes = (tz_offset % 3600) / 60;
+ seconds = tz_offset % 60;
+
+ if (round_seconds)
+ seconds = 0;
+
+ /* Sanity check. Standard timezone offsets shouldn't be much more than 12
+ hours, and daylight saving shouldn't change it by more than a few hours.
+ (The maximum offset is 15 hours 56 minutes at present.) */
+ if (hours < 0 || hours >= 24 || minutes < 0 || minutes >= 60
+ || seconds < 0 || seconds >= 60) {
+ fprintf (stderr, "WARNING: Strange timezone offset: H:%i M:%i S:%i\n",
+ hours, minutes, seconds);
+ }
+
+ if (seconds == 0)
+ sprintf (buffer, "%s%02i%02i", sign, hours, minutes);
+ else
+ sprintf (buffer, "%s%02i%02i%02i", sign, hours, minutes, seconds);
+
+ return buffer;
+}
+
+
+static gboolean
+output_rrule (char *rrule_buffer,
+ int month,
+ DayCode day_code,
+ int day_number,
+ int day_weekday,
+ int day_offset,
+ char *until)
+{
+ char buffer[1024], buffer2[1024];
+
+ buffer[0] = '\0';
+
+ if (day_offset > 1 || day_offset < -1) {
+ fprintf (stderr, "Invalid day_offset: %i\n", day_offset);
+ exit (0);
+ }
+
+ /* If the DTSTART time was moved to another day when converting to local
+ time, we need to adjust the RRULE accordingly. e.g. If the original RRULE
+ was on the 19th of the month, but DTSTART was moved 1 day forward, then
+ we output the 20th of the month instead. */
+ if (day_offset == 1) {
+ if (day_code != DAY_LAST_WEEKDAY)
+ day_number++;
+ day_weekday = (day_weekday + 1) % 7;
+
+ /* Check we don't use February 29th. */
+ if (month == 1 && day_number > 28) {
+ fprintf (stderr, "Can't format RRULE - out of bounds. Month: %i Day number: %i\n", month + 1, day_number);
+ exit (0);
+ }
+
+ /* If we go past the end of the month, move to the next month. */
+ if (day_code != DAY_LAST_WEEKDAY && day_number > DaysInMonth[month]) {
+ month++;
+ day_number = 1;
+ }
+
+ } else if (day_offset == -1) {
+ if (day_code != DAY_LAST_WEEKDAY)
+ day_number--;
+ day_weekday = (day_weekday + 6) % 7;
+
+ if (day_code != DAY_LAST_WEEKDAY && day_number < 1)
+ fprintf (stderr, "Month: %i Day number: %i\n", month + 1, day_number);
+ }
+
+ switch (day_code) {
+ case DAY_SIMPLE:
+ /* Outlook (2000) will not parse the simple YEARLY RRULEs in VTIMEZONEs,
+ or BYMONTHDAY, or BYYEARDAY, which makes this option difficult!
+ Currently we use something like BYDAY=1SU, which will be incorrect
+ at times. This only affects Asia/Baghdad, Asia/Gaza, Asia/Jerusalem &
+ Asia/Damascus at present (and Jerusalem doesn't have specific rules
+ at the moment anyway, so that isn't a big loss). */
+ if (!VzicPureOutput) {
+ if (day_number < 8) {
+ printf ("WARNING: %s: Outputting BYDAY=1SU instead of BYMONTHDAY=1-7 for Outlook compatability\n", CurrentZoneName);
+ sprintf (buffer, "RRULE:FREQ=YEARLY;BYMONTH=%i;BYDAY=1SU",
+ month + 1);
+ } else if (day_number < 15) {
+ printf ("WARNING: %s: Outputting BYDAY=2SU instead of BYMONTHDAY=8-14 for Outlook compatability\n", CurrentZoneName);
+ sprintf (buffer, "RRULE:FREQ=YEARLY;BYMONTH=%i;BYDAY=2SU",
+ month + 1);
+ } else if (day_number < 22) {
+ printf ("WARNING: %s: Outputting BYDAY=3SU instead of BYMONTHDAY=15-21 for Outlook compatability\n", CurrentZoneName);
+ sprintf (buffer, "RRULE:FREQ=YEARLY;BYMONTH=%i;BYDAY=3SU",
+ month + 1);
+ } else {
+ printf ("ERROR: %s: Couldn't output RRULE (day=%i) compatible with Outlook\n", CurrentZoneName, day_number);
+ exit (1);
+ }
+ } else {
+ sprintf (buffer, "RRULE:FREQ=YEARLY");
+ }
+ break;
+
+ case DAY_WEEKDAY_ON_OR_AFTER:
+ if (day_number > DaysInMonth[month] - 6) {
+ /* This isn't actually needed at present. */
+#if 0
+ fprintf (stderr, "DAY_WEEKDAY_ON_OR_AFTER: %i %i\n", day_number,
+ month + 1);
+#endif
+
+ if (!VzicPureOutput) {
+ printf ("ERROR: %s: Couldn't output RRULE (day>=x) compatible with Outlook\n", CurrentZoneName);
+ exit (1);
+ } else {
+ /* We do 6 days at the end of this month, and 1 at the start of the
+ next. We can't do this if we want Outlook compatability, as it
+ needs BYMONTHDAY, which Outlook doesn't support. */
+ sprintf (buffer,
+ "RRULE:FREQ=YEARLY;BYMONTH=%i;BYMONTHDAY=%i,%i,%i,%i,%i,%i;BYDAY=%s",
+ month + 1,
+ day_number, day_number + 1, day_number + 2, day_number + 3,
+ day_number + 4, day_number + 5,
+ WeekDays[day_weekday]);
+
+ sprintf (buffer2,
+ "RRULE:FREQ=YEARLY;BYMONTH=%i;BYMONTHDAY=1;BYDAY=%s",
+ (month + 1) % 12 + 1,
+ WeekDays[day_weekday]);
+
+ sprintf (rrule_buffer, "%s%s\n%s%s\n",
+ buffer, until, buffer2, until);
+
+ return TRUE;
+ }
+ }
+
+ if (!output_rrule_2 (buffer, month, day_number, day_weekday))
+ return FALSE;
+
+ break;
+
+ case DAY_WEEKDAY_ON_OR_BEFORE:
+ if (day_number < 7) {
+ /* FIXME: This is unimplemented, but it isn't needed at present anway. */
+ fprintf (stderr, "DAY_WEEKDAY_ON_OR_BEFORE: %i. Unimplemented. Exiting...\n", day_number);
+ exit (0);
+ }
+
+ if (!output_rrule_2 (buffer, month, day_number - 6, day_weekday))
+ return FALSE;
+
+ break;
+
+ case DAY_LAST_WEEKDAY:
+ if (day_offset == 1) {
+ if (month == 1) {
+ fprintf (stderr, "DAY_LAST_WEEKDAY - day moved, in February - can't fix\n");
+ exit (0);
+ }
+
+ /* This is only used once at present, for Africa/Cairo. */
+#if 0
+ fprintf (stderr, "DAY_LAST_WEEKDAY - day moved\n");
+#endif
+
+ if (!VzicPureOutput) {
+ printf ("WARNING: %s: Modifying RRULE (last weekday) for Outlook compatability\n", CurrentZoneName);
+ sprintf (buffer,
+ "RRULE:FREQ=YEARLY;BYMONTH=%i;BYDAY=-1%s",
+ month + 1, WeekDays[day_weekday]);
+ printf (" Outputting: %s\n", buffer);
+ } else {
+ /* We do 6 days at the end of this month, and 1 at the start of the
+ next. We can't do this if we want Outlook compatability, as it needs
+ BYMONTHDAY, which Outlook doesn't support. */
+ day_number = DaysInMonth[month];
+ sprintf (buffer,
+ "RRULE:FREQ=YEARLY;BYMONTH=%i;BYMONTHDAY=%i,%i,%i,%i,%i,%i;BYDAY=%s",
+ month + 1,
+ day_number - 5, day_number - 4, day_number - 3,
+ day_number - 2, day_number - 1, day_number,
+ WeekDays[day_weekday]);
+
+ sprintf (buffer2,
+ "RRULE:FREQ=YEARLY;BYMONTH=%i;BYMONTHDAY=1;BYDAY=%s",
+ (month + 1) % 12 + 1,
+ WeekDays[day_weekday]);
+
+ sprintf (rrule_buffer, "%s%s\n%s%s\n",
+ buffer, until, buffer2, until);
+
+ return TRUE;
+ }
+
+ } else if (day_offset == -1) {
+ /* We do 7 days 1 day before the end of this month. */
+ day_number = DaysInMonth[month];
+
+ if (!output_rrule_2 (buffer, month, day_number - 7, day_weekday))
+ return FALSE;
+
+ sprintf (rrule_buffer, "%s%s\n", buffer, until);
+ return TRUE;
+ }
+
+ sprintf (buffer,
+ "RRULE:FREQ=YEARLY;BYMONTH=%i;BYDAY=-1%s",
+ month + 1, WeekDays[day_weekday]);
+ break;
+
+ default:
+ fprintf (stderr, "Invalid day code\n");
+ exit (1);
+ }
+
+ sprintf (rrule_buffer, "%s%s\n", buffer, until);
+ return TRUE;
+}
+
+
+/* This tries to convert a RRULE like 'BYMONTHDAY=8,9,10,11,12,13,14;BYDAY=FR'
+ into 'BYDAY=2FR'. We need this since Outlook doesn't accept BYMONTHDAY.
+ It returns FALSE if conversion is not possible. */
+static gboolean
+output_rrule_2 (char *buffer,
+ int month,
+ int day_number,
+ int day_weekday)
+{
+
+ if (day_number == 1) {
+ /* Convert it to a BYDAY=1SU type of RRULE. */
+ sprintf (buffer, "RRULE:FREQ=YEARLY;BYMONTH=%i;BYDAY=1%s",
+ month + 1, WeekDays[day_weekday]);
+
+ } else if (day_number == 8) {
+ /* Convert it to a BYDAY=2SU type of RRULE. */
+ sprintf (buffer, "RRULE:FREQ=YEARLY;BYMONTH=%i;BYDAY=2%s",
+ month + 1, WeekDays[day_weekday]);
+
+ } else if (day_number == 15) {
+ /* Convert it to a BYDAY=3SU type of RRULE. */
+ sprintf (buffer, "RRULE:FREQ=YEARLY;BYMONTH=%i;BYDAY=3%s",
+ month + 1, WeekDays[day_weekday]);
+
+ } else if (day_number == 22) {
+ /* Convert it to a BYDAY=4SU type of RRULE. (Currently not used.) */
+ sprintf (buffer, "RRULE:FREQ=YEARLY;BYMONTH=%i;BYDAY=4%s",
+ month + 1, WeekDays[day_weekday]);
+
+ } else if (month != 1 && day_number == DaysInMonth[month] - 6) {
+ /* Convert it to a BYDAY=-1SU type of RRULE. (But never for February.) */
+ sprintf (buffer, "RRULE:FREQ=YEARLY;BYMONTH=%i;BYDAY=-1%s",
+ month + 1, WeekDays[day_weekday]);
+
+ } else {
+ /* Can't convert to a correct RRULE. If we want Outlook compatability we
+ have to use a slightly incorrect RRULE, so the time change will be 1
+ week out every 7 or so years. Alternatively we could possibly move the
+ change by an hour or so so we would always be 1 or 2 hours out, but
+ never 1 week out. Yes, that sounds a better idea. */
+ if (!VzicPureOutput) {
+ printf ("WARNING: %s: Modifying RRULE to be compatible with Outlook (day >= %i, month = %i)\n", CurrentZoneName, day_number, month + 1);
+
+ if (day_number == 2) {
+ /* Convert it to a BYDAY=1SU type of RRULE.
+ This is needed for Asia/Karachi. */
+ sprintf (buffer, "RRULE:FREQ=YEARLY;BYMONTH=%i;BYDAY=1%s",
+ month + 1, WeekDays[day_weekday]);
+ } else if (day_number == 9) {
+ /* Convert it to a BYDAY=2SU type of RRULE.
+ This is needed for Antarctica/Palmer & America/Santiago. */
+ sprintf (buffer, "RRULE:FREQ=YEARLY;BYMONTH=%i;BYDAY=2%s",
+ month + 1, WeekDays[day_weekday]);
+ } else if (month != 1 && day_number == DaysInMonth[month] - 7) {
+ /* Convert it to a BYDAY=-1SU type of RRULE. (But never for February.)
+ This is needed for America/Godthab. */
+ sprintf (buffer, "RRULE:FREQ=YEARLY;BYMONTH=%i;BYDAY=-1%s",
+ month + 1, WeekDays[day_weekday]);
+ } else {
+ printf ("ERROR: %s: Couldn't modify RRULE to be compatible with Outlook (day >= %i, month = %i)\n", CurrentZoneName, day_number, month + 1);
+ exit (1);
+ }
+
+ } else {
+ sprintf (buffer,
+ "RRULE:FREQ=YEARLY;BYMONTH=%i;BYMONTHDAY=%i,%i,%i,%i,%i,%i,%i;BYDAY=%s",
+ month + 1,
+ day_number, day_number + 1, day_number + 2, day_number + 3,
+ day_number + 4, day_number + 5, day_number + 6,
+ WeekDays[day_weekday]);
+ }
+ }
+
+ return TRUE;
+}
+
+
+static char*
+format_vzictime (VzicTime *vzictime)
+{
+ static char buffer[1024];
+
+ sprintf (buffer, "%s %2i %s %s %i %i %s",
+ dump_year (vzictime->year), vzictime->month + 1,
+ dump_day_coded (vzictime->day_code, vzictime->day_number,
+ vzictime->day_weekday),
+ dump_time (vzictime->time_seconds, vzictime->time_code, TRUE),
+ vzictime->stdoff, vzictime->walloff,
+ vzictime->is_infinite ? "INFINITE" : "");
+
+ return buffer;
+}
+
+
+static void
+dump_changes (FILE *fp,
+ char *zone_name,
+ GArray *changes)
+{
+ VzicTime *vzictime, *vzictime2 = NULL;
+ int i, year_offset, year;
+
+ for (i = 0; i < changes->len; i++) {
+ vzictime = &g_array_index (changes, VzicTime, i);
+
+ if (vzictime->year > MAX_CHANGES_YEAR)
+ return;
+
+ dump_change (fp, zone_name, vzictime, vzictime->year);
+ }
+
+ if (changes->len < 2)
+ return;
+
+ /* Now see if the changes array ends with a pair of recurring changes. */
+ vzictime = &g_array_index (changes, VzicTime, changes->len - 2);
+ vzictime2 = &g_array_index (changes, VzicTime, changes->len - 1);
+ if (!vzictime->is_infinite || !vzictime2->is_infinite)
+ return;
+
+ year_offset = 1;
+ for (;;) {
+ year = vzictime->year + year_offset;
+ if (year > MAX_CHANGES_YEAR)
+ break;
+ dump_change (fp, zone_name, vzictime, year);
+
+ year = vzictime2->year + year_offset;
+ if (year > MAX_CHANGES_YEAR)
+ break;
+ dump_change (fp, zone_name, vzictime2, year);
+
+ year_offset++;
+ }
+}
+
+
+static void
+dump_change (FILE *fp,
+ char *zone_name,
+ VzicTime *vzictime,
+ int year)
+{
+ int hour, minute, second;
+ VzicTime tmp_vzictime;
+ static char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
+
+ /* Output format is:
+
+ Zone-Name [tab] Date [tab] Time [tab] UTC-Offset
+
+ The Date and Time fields specify the time change in UTC.
+
+ The UTC Offset is for local (wall-clock) time. It is the amount of time
+ to add to UTC to get local time.
+ */
+
+ fprintf (fp, "%s\t", zone_name);
+
+ if (year == YEAR_MINIMUM) {
+ fprintf (fp, " 1 Jan 0001\t 0:00:00", zone_name);
+ } else if (year == YEAR_MAXIMUM) {
+ fprintf (stderr, "Maximum year found in change time\n");
+ exit (1);
+ } else {
+ tmp_vzictime = *vzictime;
+ tmp_vzictime.year = year;
+ calculate_actual_time (&tmp_vzictime, TIME_UNIVERSAL,
+ vzictime->prev_stdoff, vzictime->prev_walloff);
+
+ hour = tmp_vzictime.time_seconds / 3600;
+ minute = (tmp_vzictime.time_seconds % 3600) / 60;
+ second = tmp_vzictime.time_seconds % 60;
+
+ fprintf (fp, "%2i %s %04i\t%2i:%02i:%02i",
+ tmp_vzictime.day_number, months[tmp_vzictime.month],
+ tmp_vzictime.year, hour, minute, second);
+ }
+
+ fprintf (fp, "\t%s", format_tz_offset (vzictime->walloff, FALSE));
+
+ fprintf (fp, "\n");
+}
+
+
+void
+ensure_directory_exists (char *directory)
+{
+ struct stat filestat;
+
+ if (stat (directory, &filestat) != 0) {
+ /* If the directory doesn't exist, try to create it. */
+ if (errno == ENOENT) {
+ if (mkdir (directory, 0777) != 0) {
+ fprintf (stderr, "Can't create directory: %s\n", directory);
+ exit (1);
+ }
+ } else {
+ fprintf (stderr, "Error calling stat() on directory: %s\n", directory);
+ exit (1);
+ }
+ } else if (!S_ISDIR (filestat.st_mode)) {
+ fprintf (stderr, "Can't create directory, already exists: %s\n",
+ directory);
+ exit (1);
+ }
+}
+
+
+static void
+expand_tzid_prefix (void)
+{
+ char *src, *dest;
+ char date_buf[16];
+ char ch1, ch2;
+ time_t t;
+ struct tm *tm;
+
+ /* Get today's date as a string in the format "YYYYMMDD". */
+ t = time (NULL);
+ tm = localtime (&t);
+ sprintf (date_buf, "%4i%02i%02i", tm->tm_year + 1900,
+ tm->tm_mon + 1, tm->tm_mday);
+
+ src = TZIDPrefix;
+ dest = TZIDPrefixExpanded;
+
+ while (ch1 = *src++) {
+
+ /* Look for a '%'. */
+ if (ch1 == '%') {
+ ch2 = *src++;
+
+ if (ch2 == 'D') {
+ /* '%D' gets expanded into the date string. */
+ strcpy (dest, date_buf);
+ dest += strlen (dest);
+ } else if (ch2 == '%') {
+ /* '%%' gets converted into one '%'. */
+ *dest++ = '%';
+ } else {
+ /* Anything else is output as is. */
+ *dest++ = '%';
+ *dest++ = ch2;
+ }
+ } else {
+ *dest++ = ch1;
+ }
+ }
+
+#if 0
+ printf ("TZID : %s\n", TZIDPrefix);
+ printf ("Expanded: %s\n", TZIDPrefixExpanded);
+#endif
+}
diff --git a/libkcal/libical/vzic-1.3/vzic-output.h b/libkcal/libical/vzic-1.3/vzic-output.h
new file mode 100644
index 00000000..4552ac7b
--- /dev/null
+++ b/libkcal/libical/vzic-1.3/vzic-output.h
@@ -0,0 +1,38 @@
+/*
+ * Vzic - a program to convert Olson timezone database files into VZTIMEZONE
+ * files compatible with the iCalendar specification (RFC2445).
+ *
+ * Copyright (C) 2000-2001 Ximian, Inc.
+ * Copyright (C) 2003 Damon Chaplin.
+ *
+ * Author: Damon Chaplin <damon@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _VZIC_OUTPUT_H_
+#define _VZIC_OUTPUT_H_
+
+#include <glib.h>
+
+void output_vtimezone_files (char *directory,
+ GArray *zone_data,
+ GHashTable *rule_data,
+ GHashTable *link_data,
+ int max_until_year);
+
+void ensure_directory_exists (char *directory);
+
+#endif /* _VZIC_OUTPUT_H_ */
diff --git a/libkcal/libical/vzic-1.3/vzic-parse.c b/libkcal/libical/vzic-1.3/vzic-parse.c
new file mode 100644
index 00000000..6ecdb721
--- /dev/null
+++ b/libkcal/libical/vzic-1.3/vzic-parse.c
@@ -0,0 +1,901 @@
+/*
+ * Vzic - a program to convert Olson timezone database files into VZTIMEZONE
+ * files compatible with the iCalendar specification (RFC2445).
+ *
+ * Copyright (C) 2000-2001 Ximian, Inc.
+ * Copyright (C) 2003 Damon Chaplin.
+ *
+ * Author: Damon Chaplin <damon@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <ctype.h>
+#include <limits.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "vzic.h"
+#include "vzic-parse.h"
+
+/* This is the maximum line length we allow. */
+#define MAX_LINE_LEN 1024
+
+/* The maximum number of fields on a line. */
+#define MAX_FIELDS 12
+
+
+typedef enum
+{
+ ZONE_ID = 0, /* The 'Zone' at the start of the line. */
+ ZONE_NAME = 1,
+ ZONE_GMTOFF = 2,
+ ZONE_RULES_SAVE = 3,
+ ZONE_FORMAT = 4,
+ ZONE_UNTIL_YEAR = 5,
+ ZONE_UNTIL_MONTH = 6,
+ ZONE_UNTIL_DAY = 7,
+ ZONE_UNTIL_TIME = 8
+} ZoneFieldNumber;
+
+
+typedef enum
+{
+ RULE_ID = 0, /* The 'Rule' at the start of the line. */
+ RULE_NAME = 1,
+ RULE_FROM = 2,
+ RULE_TO = 3,
+ RULE_TYPE = 4,
+ RULE_IN = 5,
+ RULE_ON = 6,
+ RULE_AT = 7,
+ RULE_SAVE = 8,
+ RULE_LETTER_S = 9
+} RuleFieldNumber;
+
+
+typedef enum
+{
+ LINK_ID = 0, /* The 'Link' at the start of the line. */
+ LINK_FROM = 1,
+ LINK_TO = 2
+} LinkFieldNumber;
+
+
+/* This struct contains information used while parsing the files, and is
+ passed to most parsing functions. */
+typedef struct _ParsingData ParsingData;
+struct _ParsingData
+{
+ /* This is the line being parsed. buffer is a copy that we break into fields
+ and sub-fields as it is parsed. */
+ char line[MAX_LINE_LEN];
+ char buffer[MAX_LINE_LEN];
+
+ /* These are pointers to the start of each field in buffer. */
+ char *fields[MAX_FIELDS];
+ int num_fields;
+
+ /* These are just for producing error messages. */
+ char *filename;
+ int line_number;
+
+
+ /* This is an array of ZoneData structs, 1 for each timezone read. */
+ GArray *zone_data;
+
+ /* This is a hash table of arrays of RuleData structs. As each Rule line is
+ read in, a new RuleData struct is filled in and appended to the
+ appropriate GArray in the hash table. */
+ GHashTable *rule_data;
+
+ /* A hash containing data on the Link lines. The keys are the timezones
+ where the link is from (i.e. the timezone we will be outputting anyway)
+ and the data is a GList of timezones to link to (where we will copy the
+ timezone data to). */
+ GHashTable *link_data;
+
+ int max_until_year;
+};
+
+
+/*
+ * Parsing functions, used when reading the Olson timezone data file.
+ */
+static void parse_fields (ParsingData *data);
+static gboolean parse_zone_line (ParsingData *data);
+static gboolean parse_zone_continuation_line (ParsingData *data);
+static gboolean parse_zone_common (ParsingData *data,
+ int offset);
+static void parse_rule_line (ParsingData *data);
+static void parse_link_line (ParsingData *data);
+
+static int parse_year (ParsingData *data,
+ char *field,
+ gboolean accept_only,
+ int only_value);
+static int parse_month (ParsingData *data,
+ char *field);
+static DayCode parse_day (ParsingData *data,
+ char *field,
+ int *day,
+ int *weekday);
+static int parse_weekday (ParsingData *data,
+ char *field);
+static int parse_time (ParsingData *data,
+ char *field,
+ TimeCode *time_code);
+static int parse_number (ParsingData *data,
+ char **num);
+static int parse_rules_save (ParsingData *data,
+ char *field,
+ char **rules);
+
+static void parse_coord (char *coord,
+ int len,
+ int *result);
+
+void
+parse_olson_file (char *filename,
+ GArray **zone_data,
+ GHashTable **rule_data,
+ GHashTable **link_data,
+ int *max_until_year)
+{
+ ParsingData data;
+ FILE *fp;
+ int zone_continues = 0;
+
+ *zone_data = g_array_new (FALSE, FALSE, sizeof (ZoneData));
+ *rule_data = g_hash_table_new (g_str_hash, g_str_equal);
+ *link_data = g_hash_table_new (g_str_hash, g_str_equal);
+
+ fp = fopen (filename, "r");
+ if (!fp) {
+ fprintf (stderr, "Couldn't open file: %s\n", filename);
+ exit (1);
+ }
+
+ data.filename = filename;
+ data.zone_data = *zone_data;
+ data.rule_data = *rule_data;
+ data.link_data = *link_data;
+ data.max_until_year = 0;
+
+ for (data.line_number = 0; ; data.line_number++) {
+ if (fgets (data.line, sizeof (data.line), fp) != data.line)
+ break;
+
+ strcpy (data.buffer, data.line);
+
+ parse_fields (&data);
+ if (data.num_fields == 0)
+ continue;
+
+ if (zone_continues) {
+ zone_continues = parse_zone_continuation_line (&data);
+ } else if (!strcmp (data.fields[0], "Zone")) {
+ zone_continues = parse_zone_line (&data);
+ } else if (!strcmp (data.fields[0], "Rule")) {
+ parse_rule_line (&data);
+ } else if (!strcmp (data.fields[0], "Link")) {
+ parse_link_line (&data);
+ } else if (!strcmp (data.fields[0], "Leap")) {
+ /* We don't care about Leap lines. */
+ } else {
+ fprintf (stderr, "%s:%i: Invalid line.\n%s\n", filename,
+ data.line_number, data.line);
+ exit (1);
+ }
+ }
+
+ if (ferror (fp)) {
+ fprintf (stderr, "Error reading file: %s\n", filename);
+ exit (1);
+ }
+
+ if (zone_continues) {
+ fprintf (stderr, "%s:%i: Zone continuation line expected.\n%s\n",
+ filename, data.line_number, data.line);
+ exit (1);
+ }
+
+ fclose (fp);
+
+#if 0
+ printf ("Max UNTIL year: %i\n", data.max_until_year);
+#endif
+ *max_until_year = data.max_until_year;
+}
+
+
+/* Converts the line into fields. */
+static void
+parse_fields (ParsingData *data)
+{
+ int i;
+ char *p, *s, ch;
+
+ /* Reset all fields to NULL. */
+ for (i = 0; i < MAX_FIELDS; i++)
+ data->fields[i] = 0;
+
+ data->num_fields = 0;
+ p = data->buffer;
+
+ for (;;) {
+ /* Skip whitespace. */
+ while (isspace (*p))
+ p++;
+
+ /* See if we have reached the end of the line or a comment. */
+ if (*p == '\0' || *p == '#')
+ break;
+
+ /* We must have another field, so save the start position. */
+ data->fields[data->num_fields++] = p;
+
+ /* Now find the end of the field. If the field contains '"' characters
+ they are removed and we have to move the rest of the chars back. */
+ s = p;
+ for (;;) {
+ ch = *p;
+ if (ch == '\0' || ch == '#') {
+ /* Don't move p on since this is the end of the line. */
+ *s = '\0';
+ break;
+ } else if (isspace (ch)) {
+ *s = '\0';
+ p++;
+ break;
+ } else if (ch == '"') {
+ p++;
+ for (;;) {
+ ch = *p;
+ if (ch == '\0') {
+ fprintf (stderr,
+ "%s:%i: Closing quote character ('\"') missing.\n%s\n",
+ data->filename, data->line_number, data->line);
+ exit (1);
+ } else if (ch == '"') {
+ p++;
+ break;
+ } else {
+ *s++ = ch;
+ }
+ p++;
+ }
+ } else {
+ *s++ = ch;
+ }
+ p++;
+ }
+ }
+
+#if 0
+ printf ("%i fields: ", data->num_fields);
+ for (i = 0; i < data->num_fields; i++)
+ printf ("'%s' ", data->fields[i]);
+ printf ("\n");
+#endif
+}
+
+
+static gboolean
+parse_zone_line (ParsingData *data)
+{
+ ZoneData zone;
+
+ /* All 5 fields up to FORMAT must be present. */
+ if (data->num_fields < 5 || data->num_fields > 9) {
+ fprintf (stderr, "%s:%i: Invalid Zone line - %i fields.\n%s\n",
+ data->filename, data->line_number, data->num_fields,
+ data->line);
+ exit (1);
+ }
+
+ zone.zone_name = g_strdup (data->fields[ZONE_NAME]);
+ zone.zone_line_data = g_array_new (FALSE, FALSE, sizeof (ZoneLineData));
+
+ g_array_append_val (data->zone_data, zone);
+
+ return parse_zone_common (data, 0);
+}
+
+
+static gboolean
+parse_zone_continuation_line (ParsingData *data)
+{
+ /* All 3 fields up to FORMAT must be present. */
+ if (data->num_fields < 3 || data->num_fields > 7) {
+ fprintf (stderr,
+ "%s:%i: Invalid Zone continuation line - %i fields.\n%s\n",
+ data->filename, data->line_number, data->num_fields,
+ data->line);
+ exit (1);
+ }
+
+ return parse_zone_common (data, -2);
+}
+
+
+static gboolean
+parse_zone_common (ParsingData *data,
+ int offset)
+{
+ ZoneData *zone;
+ ZoneLineData zone_line;
+ TimeCode time_code;
+
+ zone_line.stdoff_seconds = parse_time (data,
+ data->fields[ZONE_GMTOFF + offset],
+ &time_code);
+ zone_line.save_seconds = parse_rules_save (data,
+ data->fields[ZONE_RULES_SAVE + offset],
+ &zone_line.rules);
+
+ if (!VzicPureOutput) {
+ /* We round the UTC offsets to the nearest minute, to be compatible with
+ Outlook. This also works with -ve numbers, I think.
+ -56 % 60 = -59. -61 % 60 = -1. */
+ if (zone_line.stdoff_seconds >= 0)
+ zone_line.stdoff_seconds += 30;
+ else
+ zone_line.stdoff_seconds -= 29;
+ zone_line.stdoff_seconds -= zone_line.stdoff_seconds % 60;
+
+ if (zone_line.save_seconds >= 0)
+ zone_line.save_seconds += 30;
+ else
+ zone_line.save_seconds -= 29;
+ zone_line.save_seconds -= zone_line.save_seconds % 60;
+ }
+
+ zone_line.format = g_strdup (data->fields[ZONE_FORMAT + offset]);
+
+ if (data->num_fields - offset >= 6) {
+ zone_line.until_set = TRUE;
+ zone_line.until_year = parse_year (data,
+ data->fields[ZONE_UNTIL_YEAR + offset],
+ FALSE, 0);
+ zone_line.until_month = parse_month (data,
+ data->fields[ZONE_UNTIL_MONTH + offset]);
+ zone_line.until_day_code = parse_day (data,
+ data->fields[ZONE_UNTIL_DAY + offset],
+ &zone_line.until_day_number,
+ &zone_line.until_day_weekday);
+ zone_line.until_time_seconds = parse_time (data,
+ data->fields[ZONE_UNTIL_TIME + offset],
+ &zone_line.until_time_code);
+
+ /* We also want to know the maximum year used in any UNTIL value, so we
+ know where to expand all the infinite Rule data to. */
+ if (zone_line.until_year != YEAR_MAXIMUM
+ && zone_line.until_year != YEAR_MINIMUM)
+ data->max_until_year = MAX (data->max_until_year, zone_line.until_year);
+
+ } else {
+ zone_line.until_set = FALSE;
+ }
+
+ /* Append it to the last Zone, since that is the one we are currently
+ reading. */
+ zone = &g_array_index (data->zone_data, ZoneData, data->zone_data->len - 1);
+ g_array_append_val (zone->zone_line_data, zone_line);
+
+ return zone_line.until_set;
+}
+
+
+static void
+parse_rule_line (ParsingData *data)
+{
+ GArray *rule_array;
+ RuleData rule;
+ char *name;
+ TimeCode time_code;
+
+ /* All 10 fields must be present. */
+ if (data->num_fields != 10) {
+ fprintf (stderr, "%s:%i: Invalid Rule line - %i fields.\n%s\n",
+ data->filename, data->line_number, data->num_fields,
+ data->line);
+ exit (1);
+ }
+
+ name = data->fields[RULE_NAME];
+
+ /* Create the GArray and add it to the hash table if it doesn't already
+ exist. */
+ rule_array = g_hash_table_lookup (data->rule_data, name);
+ if (!rule_array) {
+ rule_array = g_array_new (FALSE, FALSE, sizeof (RuleData));
+ g_hash_table_insert (data->rule_data, g_strdup (name), rule_array);
+ }
+
+ rule.from_year = parse_year (data, data->fields[RULE_FROM], FALSE, 0);
+ if (rule.from_year == YEAR_MAXIMUM) {
+ fprintf (stderr, "%s:%i: Invalid Rule FROM value: '%s'\n",
+ data->filename, data->line_number, data->fields[RULE_FROM]);
+ exit (1);
+ }
+
+ rule.to_year = parse_year (data, data->fields[RULE_TO], TRUE,
+ rule.from_year);
+ if (rule.to_year == YEAR_MINIMUM) {
+ fprintf (stderr, "%s:%i: Invalid Rule TO value: %s\n",
+ data->filename, data->line_number, data->fields[RULE_TO]);
+ exit (1);
+ }
+
+ if (!strcmp (data->fields[RULE_TYPE], "-"))
+ rule.type = NULL;
+ else {
+ printf ("Type: %s\n", data->fields[RULE_TYPE]);
+ rule.type = g_strdup (data->fields[RULE_TYPE]);
+ }
+
+ rule.in_month = parse_month (data, data->fields[RULE_IN]);
+ rule.on_day_code = parse_day (data, data->fields[RULE_ON],
+ &rule.on_day_number, &rule.on_day_weekday);
+ rule.at_time_seconds = parse_time (data, data->fields[RULE_AT],
+ &rule.at_time_code);
+ rule.save_seconds = parse_time (data, data->fields[RULE_SAVE], &time_code);
+
+ if (!strcmp (data->fields[RULE_LETTER_S], "-")) {
+ rule.letter_s = NULL;
+ } else {
+ rule.letter_s = g_strdup (data->fields[RULE_LETTER_S]);
+ }
+
+ rule.is_shallow_copy = FALSE;
+
+ g_array_append_val (rule_array, rule);
+}
+
+
+static void
+parse_link_line (ParsingData *data)
+{
+ char *from, *to, *old_from;
+ GList *zone_list;
+
+ /* We must have 3 fields for a Link. */
+ if (data->num_fields != 3) {
+ fprintf (stderr, "%s:%i: Invalid Rule line - %i fields.\n%s\n",
+ data->filename, data->line_number, data->num_fields,
+ data->line);
+ exit (1);
+ }
+
+ from = data->fields[LINK_FROM];
+ to = data->fields[LINK_TO];
+
+#if 0
+ printf ("LINK FROM: %s\tTO: %s\n", from, to);
+#endif
+
+ if (g_hash_table_lookup_extended (data->link_data, from,
+ (gpointer) &old_from,
+ (gpointer) &zone_list)) {
+ from = old_from;
+ } else {
+ from = g_strdup (from);
+ zone_list = NULL;
+ }
+
+ zone_list = g_list_prepend (zone_list, g_strdup (to));
+
+ g_hash_table_insert (data->link_data, from, zone_list);
+}
+
+
+static int
+parse_year (ParsingData *data,
+ char *field,
+ gboolean accept_only,
+ int only_value)
+{
+ int len, year = 0;
+ char *p;
+
+ if (!field) {
+ fprintf (stderr, "%s:%i: Missing year.\n%s\n", data->filename,
+ data->line_number, data->line);
+ exit (1);
+ }
+
+ len = strlen (field);
+ if (accept_only && !strncmp (field, "only", len))
+ return only_value;
+ if (len >= 2) {
+ if (!strncmp (field, "maximum", len))
+ return YEAR_MAXIMUM;
+ else if (!strncmp (field, "minimum", len))
+ return YEAR_MINIMUM;
+ }
+
+ for (p = field; *p; p++) {
+ if (*p < '0' || *p > '9') {
+ fprintf (stderr, "%s:%i: Invalid year: %s\n%s\n", data->filename,
+ data->line_number, field, data->line);
+ exit (1);
+ }
+
+ year = year * 10 + *p - '0';
+ }
+
+ if (year < 1000 || year > 2037) {
+ fprintf (stderr, "%s:%i: Strange year: %s\n%s\n", data->filename,
+ data->line_number, field, data->line);
+ exit (1);
+ }
+
+ return year;
+}
+
+
+/* Parses a month name, returning 0 (Jan) to 11 (Dec). */
+static int
+parse_month (ParsingData *data,
+ char *field)
+{
+ static char* months[] = { "january", "february", "march", "april", "may",
+ "june", "july", "august", "september", "october",
+ "november", "december" };
+ char *p;
+ int len, i;
+
+ /* If the field is missing, it must be the optional UNTIL month, so we return
+ 0 for January. */
+ if (!field)
+ return 0;
+
+ for (p = field, len = 0; *p; p++, len++) {
+ *p = tolower (*p);
+ }
+
+ for (i = 0; i < 12; i++) {
+ if (!strncmp (field, months[i], len))
+ return i;
+ }
+
+ fprintf (stderr, "%s:%i: Invalid month: %s\n%s\n", data->filename,
+ data->line_number, field, data->line);
+ exit (1);
+}
+
+
+/* Parses a day specifier, returning a code representing the type of match
+ together with a day of the month and a weekday number (0=Sun). */
+static DayCode
+parse_day (ParsingData *data,
+ char *field,
+ int *day,
+ int *weekday)
+{
+ char *day_part, *p;
+ DayCode day_code;
+
+ if (!field) {
+ *day = 1;
+ return DAY_SIMPLE;
+ }
+
+ *day = *weekday = 0;
+
+ if (!strncmp (field, "last", 4)) {
+ *weekday = parse_weekday (data, field + 4);
+ /* We set the day to the end of the month to make sorting Rules easy. */
+ *day = 31;
+ return DAY_LAST_WEEKDAY;
+ }
+
+ day_part = field;
+ day_code = DAY_SIMPLE;
+
+ for (p = field; *p; p++) {
+ if (*p == '<' || *p == '>') {
+ if (*(p + 1) == '=') {
+ day_code = (*p == '<') ? DAY_WEEKDAY_ON_OR_BEFORE
+ : DAY_WEEKDAY_ON_OR_AFTER;
+ *p = '\0';
+ *weekday = parse_weekday (data, field);
+ day_part = p + 2;
+ break;
+ }
+
+ fprintf (stderr, "%s:%i: Invalid day: %s\n%s\n", data->filename,
+ data->line_number, field, data->line);
+ exit (1);
+ }
+ }
+
+ for (p = day_part; *p; p++) {
+ if (*p < '0' || *p > '9') {
+ fprintf (stderr, "%s:%i: Invalid day: %s\n%s\n", data->filename,
+ data->line_number, field, data->line);
+ exit (1);
+ }
+
+ *day = *day * 10 + *p - '0';
+ }
+
+ if (*day < 1 || *day > 31) {
+ fprintf (stderr, "%s:%i: Invalid day: %s\n%s\n", data->filename,
+ data->line_number, field, data->line);
+ exit (1);
+ }
+
+ return day_code;
+}
+
+
+/* Parses a weekday name, returning 0 (Sun) to 6 (Sat). */
+static int
+parse_weekday (ParsingData *data,
+ char *field)
+{
+ static char* weekdays[] = { "sunday", "monday", "tuesday", "wednesday",
+ "thursday", "friday", "saturday" };
+ char *p;
+ int len, i;
+
+ for (p = field, len = 0; *p; p++, len++) {
+ *p = tolower (*p);
+ }
+
+ for (i = 0; i < 7; i++) {
+ if (!strncmp (field, weekdays[i], len))
+ return i;
+ }
+
+ fprintf (stderr, "%s:%i: Invalid weekday: %s\n%s\n", data->filename,
+ data->line_number, field, data->line);
+ exit (1);
+}
+
+
+/* Parses a time (hour + minute + second) and returns the result in seconds,
+ together with a time code specifying whether it is Wall clock time,
+ local standard time, or universal time.
+ The time can start with a '-' in which case it will be negative. */
+static int
+parse_time (ParsingData *data,
+ char *field,
+ TimeCode *time_code)
+{
+ char *p;
+ int hours = 0, minutes = 0, seconds = 0, result, negative = 0;
+
+ if (!field) {
+ *time_code = TIME_WALL;
+ return 0;
+ }
+
+ p = field;
+ if (*p == '-') {
+ p++;
+ negative = 1;
+ }
+
+ hours = parse_number (data, &p);
+
+ if (*p == ':') {
+ p++;
+ minutes = parse_number (data, &p);
+
+ if (*p == ':') {
+ p++;
+ seconds = parse_number (data, &p);
+ }
+ }
+
+ if (hours < 0 || hours > 24
+ || minutes < 0 || minutes > 59
+ || seconds < 0 || seconds > 59
+ || (hours == 24 && (minutes != 0 || seconds != 0))) {
+ fprintf (stderr, "%s:%i: Invalid time: %s\n%s\n", data->filename,
+ data->line_number, field, data->line);
+ exit (1);
+ }
+
+ if (hours == 24) {
+ hours = 23;
+ minutes = 59;
+ seconds = 59;
+ }
+
+#if 0
+ printf ("Time: %s -> %i:%02i:%02i\n", field, hours, minutes, seconds);
+#endif
+
+ result = hours * 3600 + minutes * 60 + seconds;
+ if (negative)
+ result = -result;
+
+ if (*p == '\0') {
+ *time_code = TIME_WALL;
+ return result;
+ }
+
+ if (*(p + 1) == '\0') {
+ if (*p == 'w') {
+ *time_code = TIME_WALL;
+ return result;
+ } else if (*p == 's') {
+ *time_code = TIME_STANDARD;
+ return result;
+ } else if (*p == 'u' || *p == 'g' || *p == 'z') {
+ *time_code = TIME_UNIVERSAL;
+ return result;
+ }
+ }
+
+ fprintf (stderr, "%s:%i: Invalid time: %s\n%s\n", data->filename,
+ data->line_number, field, data->line);
+ exit (1);
+}
+
+
+/* Parses a simple number and returns the result. The pointer argument
+ is moved to the first character after the number. */
+static int
+parse_number (ParsingData *data,
+ char **num)
+{
+ char *p;
+ int result;
+
+ p = *num;
+
+#if 0
+ printf ("In parse_number p:%s\n", p);
+#endif
+
+ if (*p < '0' || *p > '9') {
+ fprintf (stderr, "%s:%i: Invalid number: %s\n%s\n", data->filename,
+ data->line_number, *num, data->line);
+ exit (1);
+ }
+
+ result = *p++ - '0';
+
+ while (*p >= '0' && *p <= '9')
+ result = result * 10 + *p++ - '0';
+
+ *num = p;
+ return result;
+}
+
+
+static int
+parse_rules_save (ParsingData *data,
+ char *field,
+ char **rules)
+{
+ TimeCode time_code;
+
+ *rules = NULL;
+
+ /* Check for just "-". */
+ if (field[0] == '-' && field[1] == '\0')
+ return 0;
+
+ /* Check for a time to add to local standard time. We don't care about a
+ time code here, since it is just an offset. */
+ if (*field == '-' || (*field >= '0' && *field <= '9'))
+ return parse_time (data, field, &time_code);
+
+ /* It must be a rules name. */
+ *rules = g_strdup (field);
+ return 0;
+}
+
+
+
+
+
+GHashTable*
+parse_zone_tab (char *filename)
+{
+ GHashTable *zones_hash;
+ ZoneDescription *zone_desc;
+ FILE *fp;
+ char buf[4096];
+ gchar **fields, *zone_name, *latitude, *longitude, *p;
+
+
+ fp = fopen (filename, "r");
+ if (!fp) {
+ fprintf (stderr, "Couldn't open file: %s\n", filename);
+ exit (1);
+ }
+
+ zones_hash = g_hash_table_new (g_str_hash, g_str_equal);
+
+ while (fgets (buf, sizeof(buf), fp)) {
+ if (*buf == '#') continue;
+
+ g_strchomp (buf);
+ fields = g_strsplit (buf,"\t", 4);
+
+ if (strlen (fields[0]) != 2) {
+ fprintf (stderr, "Invalid zone description line: %s\n", buf);
+ exit (1);
+ }
+
+ zone_name = g_strdup (fields[2]);
+
+ zone_desc = g_new (ZoneDescription, 1);
+ zone_desc->country_code[0] = fields[0][0];
+ zone_desc->country_code[1] = fields[0][1];
+ zone_desc->comment = (fields[3] && fields[3][0]) ? g_strdup (fields[3])
+ : NULL;
+
+ /* Now parse the latitude and longitude. */
+ latitude = fields[1];
+ longitude = latitude + 1;
+ while (*longitude != '+' && *longitude != '-')
+ longitude++;
+
+ parse_coord (latitude, longitude - latitude, zone_desc->latitude);
+ parse_coord (longitude, strlen (longitude), zone_desc->longitude);
+
+ g_hash_table_insert (zones_hash, zone_name, zone_desc);
+
+#if 0
+ g_print ("Found zone: %s %i %02i %02i,%i %02i %02i\n", zone_name,
+ zone_desc->latitude[0], zone_desc->latitude[1],
+ zone_desc->latitude[2],
+ zone_desc->longitude[0], zone_desc->longitude[1],
+ zone_desc->longitude[2]);
+#endif
+ }
+
+ fclose (fp);
+
+ return zones_hash;
+}
+
+
+static void
+parse_coord (char *coord,
+ int len,
+ int *result)
+{
+ int degrees = 0, minutes = 0, seconds = 0;
+
+ if (len == 5)
+ sscanf (coord + 1, "%2d%2d", &degrees, &minutes);
+ else if (len == 6)
+ sscanf (coord + 1, "%3d%2d", &degrees, &minutes);
+ else if (len == 7)
+ sscanf (coord + 1, "%2d%2d%2d", &degrees, &minutes, &seconds);
+ else if (len == 8)
+ sscanf (coord + 1, "%3d%2d%2d", &degrees, &minutes, &seconds);
+ else {
+ fprintf (stderr, "Invalid coordinate: %s\n", coord);
+ exit (1);
+ }
+
+ if (coord[0] == '-')
+ degrees = -degrees;
+
+ result[0] = degrees;
+ result[1] = minutes;
+ result[2] = seconds;
+}
+
diff --git a/libkcal/libical/vzic-1.3/vzic-parse.h b/libkcal/libical/vzic-1.3/vzic-parse.h
new file mode 100644
index 00000000..fde3b2c7
--- /dev/null
+++ b/libkcal/libical/vzic-1.3/vzic-parse.h
@@ -0,0 +1,38 @@
+/*
+ * Vzic - a program to convert Olson timezone database files into VZTIMEZONE
+ * files compatible with the iCalendar specification (RFC2445).
+ *
+ * Copyright (C) 2000-2001 Ximian, Inc.
+ * Copyright (C) 2003 Damon Chaplin.
+ *
+ * Author: Damon Chaplin <damon@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _VZIC_PARSE_H_
+#define _VZIC_PARSE_H_
+
+#include <glib.h>
+
+void parse_olson_file (char *filename,
+ GArray **zone_data,
+ GHashTable **rule_data,
+ GHashTable **link_data,
+ int *max_until_year);
+
+GHashTable* parse_zone_tab (char *filename);
+
+#endif /* _VZIC_PARSE_H_ */
diff --git a/libkcal/libical/vzic-1.3/vzic-test.pl b/libkcal/libical/vzic-1.3/vzic-test.pl
new file mode 100755
index 00000000..cebac79f
--- /dev/null
+++ b/libkcal/libical/vzic-1.3/vzic-test.pl
@@ -0,0 +1,164 @@
+#!/usr/bin/perl -w
+
+#
+# Vzic - a program to convert Olson timezone database files into VZTIMEZONE
+# files compatible with the iCalendar specification (RFC2445).
+#
+# Copyright (C) 2001 Ximian, Inc.
+# Copyright (C) 2003 Damon Chaplin.
+#
+# Author: Damon Chaplin <damon@gnome.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+
+#
+# This outputs an iCalendar file containing one event in each timezone,
+# as well as all the VTIMEZONEs. We use it for testing compatability with
+# other iCalendar apps like Outlook, by trying to import it there.
+#
+# Currently we have 377 timezones (with tzdata2001d).
+#
+
+# Set this to the toplevel directory of the VTIMEZONE files.
+$ZONEINFO_DIR = "/home/damon/src/zoneinfo";
+
+$output_file = "calendar.ics";
+
+
+# Save this so we can restore it later.
+$input_record_separator = $/;
+
+chdir $ZONEINFO_DIR
+ || die "Can't cd to $ZONEINFO_DIR";
+
+# Create the output file, to contain all the VEVENTs & VTIMEZONEs.
+open (OUTPUTFILE, ">$output_file")
+ || die "Can't create file: $output_file";
+
+# Output the standard header.
+ print OUTPUTFILE <<EOF;
+BEGIN:VCALENDAR
+PRODID:-//Ximian//NONSGML Vzic Test//EN
+VERSION:2.0
+METHOD:PUBLISH
+EOF
+
+$zone_num = 0;
+
+# 365 days in a non-leap year.
+@days_in_month = ( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 );
+
+foreach $file (`find -name "*.ics"`) {
+ # Get rid of './' at start and whitespace at end.
+ $file =~ s/^\.\///;
+ $file =~ s/\s+$//;
+
+ if ($file eq $output_file) {
+ next;
+ }
+
+# print "File: $file\n";
+
+ # Get the VTIMEZONE data.
+ open (ZONEFILE, "$file")
+ || die "Can't open file: $ZONEINFO_DIR/$file";
+ undef $/;
+ $vtimezone = <ZONEFILE>;
+ $/ = $input_record_separator;
+ close (ZONEFILE);
+
+ # Strip the stuff before and after the VTIMEZONE component
+ $vtimezone =~ s/^.*BEGIN:VTIMEZONE/BEGIN:VTIMEZONE/s;
+ $vtimezone =~ s/END:VTIMEZONE.*$/END:VTIMEZONE\n/s;
+
+ print OUTPUTFILE $vtimezone;
+
+ # Find the TZID.
+ $vtimezone =~ m/TZID:(.*)/;
+ $tzid = $1;
+# print "TZID: $tzid\n";
+
+ # Find the location.
+ $file =~ m/(.*)\.ics/;
+ $location = $1;
+# print "LOCATION: $location\n";
+
+ # Try to find the current UTC offset that Outlook will use.
+ # If there is an RRULE, we look for the first 2 TZOFFSETTO properties,
+ # else we just get the first one.
+ if ($vtimezone =~ m/RRULE/) {
+ $vtimezone =~ m/TZOFFSETTO:([+-]?\d+)/;
+ $tzoffsetto = $1;
+ $vtimezone =~ m/TZOFFSETFROM:([+-]?\d+)/;
+ $tzoffsetfrom = $1;
+ $tzoffset = "$tzoffsetfrom/$tzoffsetto";
+ } else {
+ $vtimezone =~ m/TZOFFSETTO:([+-]?\d+)/s;
+ $tzoffset = $1;
+ }
+# print "TZOFFSET: $tzoffset\n";
+
+ # We put each event on a separate day in 2001 and Jan 2002.
+ $day_num = $zone_num;
+ if ($day_num >= 365) {
+ $year = 2002;
+ $day_num -= 365;
+ } else {
+ $year = 2001;
+ }
+ $month = -1;
+ for ($i = 0; $i < 12; $i++) {
+ if ($day_num < $days_in_month[$i]) {
+ $month = $i;
+ last;
+ }
+ $day_num -= $days_in_month[$i]
+ }
+ if ($month == -1) {
+ die "month = -1";
+ }
+
+ $month++;
+ $day_num++;
+ $date = sprintf ("%i%02i%02i", $year, $month, $day_num);
+# print "Date: $date\n";
+
+ # Output a VEVENT using the timezone.
+ print OUTPUTFILE <<EOF;
+BEGIN:VEVENT
+UID:vzic-test-${zone_num}
+DTSTAMP:20010101T000000Z
+DTSTART;TZID=${tzid}:${date}T120000
+DTEND;TZID=${tzid}:${date}T130000
+RRULE:FREQ=MONTHLY;BYMONTHDAY=${day_num}
+SUMMARY:($tzoffset) ${location} 12:00-13:00 UTC
+SEQUENCE:1
+END:VEVENT
+EOF
+
+ $zone_num++;
+
+ # Use this to stop after a certain number.
+# last if ($zone_num == 100);
+}
+
+# Output the standard footer.
+ print OUTPUTFILE <<EOF;
+END:VCALENDAR
+EOF
+
+close (OUTPUTFILE);
+
diff --git a/libkcal/libical/vzic-1.3/vzic.c b/libkcal/libical/vzic-1.3/vzic.c
new file mode 100644
index 00000000..1108d877
--- /dev/null
+++ b/libkcal/libical/vzic-1.3/vzic.c
@@ -0,0 +1,320 @@
+/*
+ * Vzic - a program to convert Olson timezone database files into VZTIMEZONE
+ * files compatible with the iCalendar specification (RFC2445).
+ *
+ * Copyright (C) 2000-2001 Ximian, Inc.
+ * Copyright (C) 2003 Damon Chaplin.
+ *
+ * Author: Damon Chaplin <damon@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include "vzic.h"
+#include "vzic-parse.h"
+#include "vzic-dump.h"
+#include "vzic-output.h"
+
+
+/*
+ * Global command-line options.
+ */
+
+/* By default we output Outlook-compatible output. If --pure is used we
+ output pure output, with no changes to be compatible with Outlook. */
+gboolean VzicPureOutput = FALSE;
+
+gboolean VzicDumpOutput = FALSE;
+gboolean VzicDumpChanges = FALSE;
+gboolean VzicDumpZoneNamesAndCoords = TRUE;
+gboolean VzicDumpZoneTranslatableStrings= TRUE;
+gboolean VzicNoRRules = FALSE;
+gboolean VzicNoRDates = FALSE;
+char* VzicOutputDir = "zoneinfo";
+char* VzicUrlPrefix = NULL;
+char* VzicOlsonDir = OLSON_DIR;
+
+GList* VzicTimeZoneNames = NULL;
+
+static void convert_olson_file (char *olson_file);
+
+static void usage (void);
+
+static void free_zone_data (GArray *zone_data);
+static void free_rule_array (gpointer key,
+ gpointer value,
+ gpointer data);
+static void free_link_data (gpointer key,
+ gpointer value,
+ gpointer data);
+
+
+int
+main (int argc,
+ char *argv[])
+{
+ int i;
+ char directory[PATHNAME_BUFFER_SIZE];
+ char filename[PATHNAME_BUFFER_SIZE];
+ GHashTable *zones_hash;
+
+ /*
+ * Command-Line Option Parsing.
+ */
+ for (i = 1; i < argc; i++) {
+ /*
+ * User Options.
+ */
+
+ /* --pure: Output the perfect VCALENDAR data, which Outlook won't parse
+ as it has problems with certain iCalendar constructs. */
+ if (!strcmp (argv[i], "--pure"))
+ VzicPureOutput = TRUE;
+
+ /* --output-dir: specify where to output all the files beneath. The
+ default is the current directory. */
+ else if (argc > i + 1 && !strcmp (argv[i], "--output-dir"))
+ VzicOutputDir = argv[++i];
+
+ /* --url-prefix: Used as the base for the TZURL property in each
+ VTIMEZONE. The default is to not output TZURL properties. */
+ else if (argc > i + 1 && !strcmp (argv[i], "--url-prefix")) {
+ int length;
+ VzicUrlPrefix = argv[++i];
+ /* remove the trailing '/' if there is one */
+ length = strlen (VzicUrlPrefix);
+ if (VzicUrlPrefix[length - 1] == '/')
+ VzicUrlPrefix[length - 1] = '\0';
+ }
+
+ else if (argc > i + 1 && !strcmp (argv[i], "--olson-dir")) {
+ VzicOlsonDir = argv[++i];
+ }
+
+ /*
+ * Debugging Options.
+ */
+
+ /* --dump: Dump the Rule and Zone data that we parsed from the Olson
+ timezone files. This is used to test the parsing code. */
+ else if (!strcmp (argv[i], "--dump"))
+ VzicDumpOutput = TRUE;
+
+ /* --dump-changes: Dumps a list of times when each timezone changed,
+ and the new local time offset from UTC. */
+ else if (!strcmp (argv[i], "--dump-changes"))
+ VzicDumpChanges = TRUE;
+
+ /* --no-rrules: Don't output RRULE properties in the VTIMEZONEs. Instead
+ it will just output RDATEs for each year up to a certain year. */
+ else if (!strcmp (argv[i], "--no-rrules"))
+ VzicNoRRules = TRUE;
+
+ /* --no-rdates: Don't output multiple RDATEs in a single VTIMEZONE
+ component. Instead they will be output separately. */
+ else if (!strcmp (argv[i], "--no-rdates"))
+ VzicNoRDates = TRUE;
+
+ else
+ usage ();
+ }
+
+ /*
+ * Create any necessary directories.
+ */
+ ensure_directory_exists (VzicOutputDir);
+
+ if (VzicDumpOutput) {
+ /* Create the directories for the dump output, if they don't exist. */
+ sprintf (directory, "%s/ZonesVzic", VzicOutputDir);
+ ensure_directory_exists (directory);
+ sprintf (directory, "%s/RulesVzic", VzicOutputDir);
+ ensure_directory_exists (directory);
+ }
+
+ if (VzicDumpChanges) {
+ /* Create the directory for the changes output, if it doesn't exist. */
+ sprintf (directory, "%s/ChangesVzic", VzicOutputDir);
+ ensure_directory_exists (directory);
+ }
+
+ /*
+ * Convert the Olson timezone files.
+ */
+ convert_olson_file ("africa");
+ convert_olson_file ("antarctica");
+ convert_olson_file ("asia");
+ convert_olson_file ("australasia");
+ convert_olson_file ("europe");
+ convert_olson_file ("northamerica");
+ convert_olson_file ("southamerica");
+
+ /* These are backwards-compatability and weird stuff. */
+#if 0
+ convert_olson_file ("backward");
+ convert_olson_file ("etcetera");
+ convert_olson_file ("leapseconds");
+ convert_olson_file ("pacificnew");
+ convert_olson_file ("solar87");
+ convert_olson_file ("solar88");
+ convert_olson_file ("solar89");
+#endif
+
+ /* This doesn't really do anything and it messes up vzic-dump.pl so we
+ don't bother. */
+#if 0
+ convert_olson_file ("factory");
+#endif
+
+ /* This is old System V stuff, which we don't currently support since it
+ uses 'min' as a Rule FROM value which messes up our algorithm, making
+ it too slow and use too much memory. */
+#if 0
+ convert_olson_file ("systemv");
+#endif
+
+ /* Output the timezone names and coordinates in a zone.tab file, and
+ the translatable strings to feed to gettext. */
+ if (VzicDumpZoneNamesAndCoords) {
+ sprintf (filename, "%s/zone.tab", VzicOlsonDir);
+ zones_hash = parse_zone_tab (filename);
+
+ dump_time_zone_names (VzicTimeZoneNames, VzicOutputDir, zones_hash);
+ }
+
+ return 0;
+}
+
+
+static void
+convert_olson_file (char *olson_file)
+{
+ char input_filename[PATHNAME_BUFFER_SIZE];
+ GArray *zone_data;
+ GHashTable *rule_data, *link_data;
+ char dump_filename[PATHNAME_BUFFER_SIZE];
+ ZoneData *zone;
+ int i, max_until_year;
+
+ sprintf (input_filename, "%s/%s", VzicOlsonDir, olson_file);
+
+ parse_olson_file (input_filename, &zone_data, &rule_data, &link_data,
+ &max_until_year);
+
+ if (VzicDumpOutput) {
+ sprintf (dump_filename, "%s/ZonesVzic/%s", VzicOutputDir, olson_file);
+ dump_zone_data (zone_data, dump_filename);
+
+ sprintf (dump_filename, "%s/RulesVzic/%s", VzicOutputDir, olson_file);
+ dump_rule_data (rule_data, dump_filename);
+ }
+
+ output_vtimezone_files (VzicOutputDir, zone_data, rule_data, link_data,
+ max_until_year);
+
+ free_zone_data (zone_data);
+ g_hash_table_foreach (rule_data, free_rule_array, NULL);
+ g_hash_table_destroy (rule_data);
+ g_hash_table_foreach (link_data, free_link_data, NULL);
+ g_hash_table_destroy (link_data);
+}
+
+
+static void
+usage (void)
+{
+ fprintf (stderr, "Usage: vzic [--dump] [--dump-changes] [--no-rrules] [--no-rdates] [--pure] [--output-dir <directory>] [--url-prefix <url>] [--olson-dir <directory>]\n");
+
+ exit (1);
+}
+
+
+
+
+/*
+ * Functions to free the data structures.
+ */
+
+static void
+free_zone_data (GArray *zone_data)
+{
+ ZoneData *zone;
+ ZoneLineData *zone_line;
+ int i, j;
+
+ for (i = 0; i < zone_data->len; i++) {
+ zone = &g_array_index (zone_data, ZoneData, i);
+
+ g_free (zone->zone_name);
+
+ for (j = 0; j < zone->zone_line_data->len; j++) {
+ zone_line = &g_array_index (zone->zone_line_data, ZoneLineData, j);
+
+ g_free (zone_line->rules);
+ g_free (zone_line->format);
+ }
+
+ g_array_free (zone->zone_line_data, TRUE);
+ }
+
+ g_array_free (zone_data, TRUE);
+}
+
+
+static void
+free_rule_array (gpointer key,
+ gpointer value,
+ gpointer data)
+{
+ char *name = key;
+ GArray *rule_array = value;
+ RuleData *rule;
+ int i;
+
+ for (i = 0; i < rule_array->len; i++) {
+ rule = &g_array_index (rule_array, RuleData, i);
+
+ if (!rule->is_shallow_copy) {
+ g_free (rule->type);
+ g_free (rule->letter_s);
+ }
+ }
+
+ g_array_free (rule_array, TRUE);
+
+ g_free (name);
+}
+
+
+static void
+free_link_data (gpointer key,
+ gpointer value,
+ gpointer data)
+{
+ GList *link = data;
+
+ g_free (key);
+
+ while (link) {
+ g_free (link->data);
+ link = link->next;
+ }
+
+ g_list_free (data);
+}
+
diff --git a/libkcal/libical/vzic-1.3/vzic.h b/libkcal/libical/vzic-1.3/vzic.h
new file mode 100644
index 00000000..afa84d67
--- /dev/null
+++ b/libkcal/libical/vzic-1.3/vzic.h
@@ -0,0 +1,196 @@
+/*
+ * Vzic - a program to convert Olson timezone database files into VZTIMEZONE
+ * files compatible with the iCalendar specification (RFC2445).
+ *
+ * Copyright (C) 2000-2001 Ximian, Inc.
+ * Copyright (C) 2003 Damon Chaplin.
+ *
+ * Author: Damon Chaplin <damon@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _VZIC_H_
+#define _VZIC_H_
+
+#include <glib.h>
+
+
+/*
+ * Global command-line options.
+ */
+
+/* By default we output Outlook-compatible output. If --pure is used we output
+ pure output, with no changes to be compatible with Outlook. */
+extern gboolean VzicPureOutput;
+
+extern gboolean VzicDumpOutput;
+extern gboolean VzicDumpChanges;
+extern gboolean VzicDumpZoneNamesAndCoords;
+extern gboolean VzicDumpZoneTranslatableStrings;
+extern gboolean VzicNoRRules;
+extern gboolean VzicNoRDates;
+extern char* VzicUrlPrefix;
+
+extern GList* VzicTimeZoneNames;
+
+/* The minimum & maximum years we can use. */
+#define YEAR_MINIMUM G_MININT
+#define YEAR_MAXIMUM G_MAXINT
+
+/* The maximum size of any complete pathname. */
+#define PATHNAME_BUFFER_SIZE 1024
+
+/* Days can be expressed either as a simple month day number, 1-31, or a rule
+ such as the last Sunday, or the first Monday on or after the 8th. */
+typedef enum
+{
+ DAY_SIMPLE,
+ DAY_WEEKDAY_ON_OR_AFTER,
+ DAY_WEEKDAY_ON_OR_BEFORE,
+ DAY_LAST_WEEKDAY
+} DayCode;
+
+
+/* Times can be given either as universal time (UTC), local standard time
+ (without daylight-saving adjustments) or wall clock time (local standard
+ time plus daylight-saving adjustments, i.e. what you would see on a clock
+ on the wall!). */
+typedef enum
+{
+ TIME_WALL,
+ TIME_STANDARD,
+ TIME_UNIVERSAL
+} TimeCode;
+
+
+/* This represents one timezone, e.g. "Africa/Algiers".
+ It contains the timezone name, and an array of ZoneLineData structs which
+ hold data from each Zone line, including the continuation lines. */
+typedef struct _ZoneData ZoneData;
+struct _ZoneData
+{
+ char *zone_name;
+
+ /* An array of ZoneLineData, one for each Zone & Zone continuation line
+ read in. */
+ GArray *zone_line_data;
+};
+
+
+typedef struct _ZoneLineData ZoneLineData;
+struct _ZoneLineData
+{
+ /* The amount of time to add to UTC to get local standard time for the
+ current time range, in seconds. */
+ int stdoff_seconds;
+
+ /* Either rules is set to the name of a set of rules, or rules is NULL and
+ save is set to the time to add to local standard time to get wall time, in
+ seconds. If save is 0 as well, then standard time always applies. */
+ char *rules;
+ int save_seconds;
+
+ /* The format to use for the abbreviated timezone name, e.g. WE%sT.
+ The %s is replaced by variable part of the name. (See the letter_s field
+ in the RuleData struct below). */
+ char *format;
+
+ /* TRUE if an UNTIL time is given. */
+ gboolean until_set;
+
+ /* The UNTIL year, e.g. 2000. */
+ int until_year;
+
+ /* The UNTIL month 0 (Jan) to 11 (Dec). */
+ int until_month;
+
+ /* The UNTIL day, either a simple month day number, 1-31, or a rule such as
+ the last Sunday, or the first Monday on or after the 8th. */
+ DayCode until_day_code;
+ int until_day_number; /* 1 to 31. */
+ int until_day_weekday; /* 0 (Sun) to 6 (Sat). */
+
+ /* The UNTIL time, in seconds from midnight. The code specifies whether the
+ time is a wall clock time, local standard time, or universal time. */
+ int until_time_seconds;
+ TimeCode until_time_code;
+};
+
+
+typedef struct _RuleData RuleData;
+struct _RuleData
+{
+ /* The first year that the rule applies to, e.g. 1996.
+ Can also be YEAR_MINIMUM. */
+ int from_year;
+
+ /* The last year that the rule applies to, e.g. 1996.
+ Can also be YEAR_MAXIMUM. */
+ int to_year;
+
+ /* A string used to only match certain years between from and to.
+ The rule only applies to the years which match. If type is NULL the rule
+ applies to all years betweeen from and to.
+ zic uses an external program called yearistype to check the string.
+ Currently it is not used in the Olson database. */
+ char *type;
+
+ /* The month of the rule 0 (Jan) to 11 (Dec). */
+ int in_month;
+
+ /* The day, either a simple month day number, 1-31, or a rule such as
+ the last Sunday, or the first Monday on or after the 8th. */
+ DayCode on_day_code;
+ int on_day_number;
+ int on_day_weekday; /* 0 (Sun) to 6 (Sat). */
+
+ /* The time, in seconds from midnight. The code specifies whether the
+ time is a wall clock time, local standard time, or universal time. */
+ int at_time_seconds;
+ TimeCode at_time_code;
+
+ /* The amount of time to add to local standard time when the rule is in
+ effect, in seconds. If this is not 0 then it must be a daylight-saving
+ time. */
+ int save_seconds;
+
+ /* The letter(s) to use as the variable part in the abbreviated timezone
+ name. If this is NULL then no variable part is used. (See the format field
+ in the ZoneLineData struct above.) */
+ char *letter_s;
+
+
+ /* This is set to TRUE if this element is a shallow copy of another one,
+ in which case we don't free any of the fields. */
+ gboolean is_shallow_copy;
+};
+
+
+typedef struct _ZoneDescription ZoneDescription;
+struct _ZoneDescription
+{
+ /* 2-letter ISO 3166 country code. */
+ char country_code[2];
+
+ /* latitude and longitude in degrees, minutes & seconds. The degrees value
+ holds the sign of the entire latitude/longitude. */
+ int latitude[3];
+ int longitude[3];
+
+ char *comment;
+};
+
+#endif /* _VZIC_H_ */
diff --git a/libkcal/libical/zoneinfo/Africa/Abidjan.ics b/libkcal/libical/zoneinfo/Africa/Abidjan.ics
new file mode 100644
index 00000000..9eef562f
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Abidjan.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Abidjan
+X-LIC-LOCATION:Africa/Abidjan
+BEGIN:STANDARD
+TZOFFSETFROM:-001608
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19120101T000000
+RDATE:19120101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Accra.ics b/libkcal/libical/zoneinfo/Africa/Accra.ics
new file mode 100644
index 00000000..93bb65bc
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Accra.ics
@@ -0,0 +1,41 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Accra
+X-LIC-LOCATION:Africa/Accra
+BEGIN:STANDARD
+TZOFFSETFROM:-000052
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19180101T000000
+RDATE:19180101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0020
+TZNAME:GHST
+DTSTART:19360901T000000
+RDATE:19360901T000000
+RDATE:19370901T000000
+RDATE:19380901T000000
+RDATE:19390901T000000
+RDATE:19400901T000000
+RDATE:19410901T000000
+RDATE:19420901T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0020
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19361231T000000
+RDATE:19361231T000000
+RDATE:19371231T000000
+RDATE:19381231T000000
+RDATE:19391231T000000
+RDATE:19401231T000000
+RDATE:19411231T000000
+RDATE:19421231T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Addis_Ababa.ics b/libkcal/libical/zoneinfo/Africa/Addis_Ababa.ics
new file mode 100644
index 00000000..7cc623ee
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Addis_Ababa.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Addis_Ababa
+X-LIC-LOCATION:Africa/Addis_Ababa
+BEGIN:STANDARD
+TZOFFSETFROM:+023448
+TZOFFSETTO:+023520
+TZNAME:ADMT
+DTSTART:18700101T000000
+RDATE:18700101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+023520
+TZOFFSETTO:+0300
+TZNAME:EAT
+DTSTART:19360505T000000
+RDATE:19360505T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Algiers.ics b/libkcal/libical/zoneinfo/Africa/Algiers.ics
new file mode 100644
index 00000000..2a9b039f
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Algiers.ics
@@ -0,0 +1,90 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Algiers
+X-LIC-LOCATION:Africa/Algiers
+BEGIN:STANDARD
+TZOFFSETFROM:+001212
+TZOFFSETTO:+000921
+TZNAME:PMT
+DTSTART:18910315T000100
+RDATE:18910315T000100
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+000921
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19110311T000000
+RDATE:19110311T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:WEST
+DTSTART:19160614T230000
+RDATE:19160614T230000
+RDATE:19170324T230000
+RDATE:19180309T230000
+RDATE:19190301T230000
+RDATE:19200214T230000
+RDATE:19210314T230000
+RDATE:19390911T230000
+RDATE:19710425T230000
+RDATE:19770506T000000
+RDATE:19800425T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19161002T000000
+RDATE:19161002T000000
+RDATE:19171008T000000
+RDATE:19181007T000000
+RDATE:19191006T000000
+RDATE:19201024T000000
+RDATE:19210622T000000
+RDATE:19391119T010000
+RDATE:19461007T000000
+RDATE:19630414T000000
+RDATE:19710927T000000
+RDATE:19791026T000000
+RDATE:19801031T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19400225T020000
+RDATE:19400225T020000
+RDATE:19560129T000000
+RDATE:19810501T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19440403T020000
+RDATE:19440403T020000
+RDATE:19450402T020000
+RDATE:19780324T010000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19441008T020000
+RDATE:19441008T020000
+RDATE:19450916T010000
+RDATE:19780922T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19771021T000000
+RDATE:19771021T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Asmara.ics b/libkcal/libical/zoneinfo/Africa/Asmara.ics
new file mode 100644
index 00000000..dadf9b1e
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Asmara.ics
@@ -0,0 +1,29 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Asmara
+X-LIC-LOCATION:Africa/Asmara
+BEGIN:STANDARD
+TZOFFSETFROM:+023532
+TZOFFSETTO:+023532
+TZNAME:AMT
+DTSTART:18700101T000000
+RDATE:18700101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+023532
+TZOFFSETTO:+023520
+TZNAME:ADMT
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+023520
+TZOFFSETTO:+0300
+TZNAME:EAT
+DTSTART:19360505T000000
+RDATE:19360505T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Bamako.ics b/libkcal/libical/zoneinfo/Africa/Bamako.ics
new file mode 100644
index 00000000..72b75fcc
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Bamako.ics
@@ -0,0 +1,29 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Bamako
+X-LIC-LOCATION:Africa/Bamako
+BEGIN:STANDARD
+TZOFFSETFROM:-0032
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19120101T000000
+RDATE:19120101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:-0100
+TZNAME:WAT
+DTSTART:19340226T000000
+RDATE:19340226T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0100
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19600620T000000
+RDATE:19600620T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Bangui.ics b/libkcal/libical/zoneinfo/Africa/Bangui.ics
new file mode 100644
index 00000000..27ce2e16
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Bangui.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Bangui
+X-LIC-LOCATION:Africa/Bangui
+BEGIN:STANDARD
+TZOFFSETFROM:+011420
+TZOFFSETTO:+0100
+TZNAME:WAT
+DTSTART:19120101T000000
+RDATE:19120101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Banjul.ics b/libkcal/libical/zoneinfo/Africa/Banjul.ics
new file mode 100644
index 00000000..e5a52982
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Banjul.ics
@@ -0,0 +1,29 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Banjul
+X-LIC-LOCATION:Africa/Banjul
+BEGIN:STANDARD
+TZOFFSETFROM:-010636
+TZOFFSETTO:-010636
+TZNAME:BMT
+DTSTART:19120101T000000
+RDATE:19120101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-010636
+TZOFFSETTO:-0100
+TZNAME:WAT
+DTSTART:19350101T000000
+RDATE:19350101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0100
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19640101T000000
+RDATE:19640101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Bissau.ics b/libkcal/libical/zoneinfo/Africa/Bissau.ics
new file mode 100644
index 00000000..bc50677b
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Bissau.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Bissau
+X-LIC-LOCATION:Africa/Bissau
+BEGIN:STANDARD
+TZOFFSETFROM:-010220
+TZOFFSETTO:-0100
+TZNAME:WAT
+DTSTART:19110526T000000
+RDATE:19110526T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0100
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19750101T000000
+RDATE:19750101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Blantyre.ics b/libkcal/libical/zoneinfo/Africa/Blantyre.ics
new file mode 100644
index 00000000..3a88e08b
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Blantyre.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Blantyre
+X-LIC-LOCATION:Africa/Blantyre
+BEGIN:STANDARD
+TZOFFSETFROM:+0220
+TZOFFSETTO:+0200
+TZNAME:CAT
+DTSTART:19030301T000000
+RDATE:19030301T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Brazzaville.ics b/libkcal/libical/zoneinfo/Africa/Brazzaville.ics
new file mode 100644
index 00000000..fec4b9ea
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Brazzaville.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Brazzaville
+X-LIC-LOCATION:Africa/Brazzaville
+BEGIN:STANDARD
+TZOFFSETFROM:+010108
+TZOFFSETTO:+0100
+TZNAME:WAT
+DTSTART:19120101T000000
+RDATE:19120101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Bujumbura.ics b/libkcal/libical/zoneinfo/Africa/Bujumbura.ics
new file mode 100644
index 00000000..e9d5e0ac
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Bujumbura.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Bujumbura
+X-LIC-LOCATION:Africa/Bujumbura
+BEGIN:STANDARD
+TZOFFSETFROM:+015728
+TZOFFSETTO:+0200
+TZNAME:CAT
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Cairo.ics b/libkcal/libical/zoneinfo/Africa/Cairo.ics
new file mode 100644
index 00000000..4ee8198e
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Cairo.ics
@@ -0,0 +1,148 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Cairo
+X-LIC-LOCATION:Africa/Cairo
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19950428T000000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=-1FR
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:20080828T230000
+RRULE:FREQ=YEARLY;BYMONTH=8;BYDAY=-1TH
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0205
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19001001T000000
+RDATE:19001001T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19400715T000000
+RDATE:19400715T000000
+RDATE:19410415T000000
+RDATE:19420401T000000
+RDATE:19430401T000000
+RDATE:19440401T000000
+RDATE:19450416T000000
+RDATE:19570510T000000
+RDATE:19580501T000000
+RDATE:19590501T010000
+RDATE:19600501T010000
+RDATE:19610501T010000
+RDATE:19620501T010000
+RDATE:19630501T010000
+RDATE:19640501T010000
+RDATE:19650501T010000
+RDATE:19660501T010000
+RDATE:19670501T010000
+RDATE:19680501T010000
+RDATE:19690501T010000
+RDATE:19700501T010000
+RDATE:19710501T010000
+RDATE:19720501T010000
+RDATE:19730501T010000
+RDATE:19740501T010000
+RDATE:19750501T010000
+RDATE:19760501T010000
+RDATE:19770501T010000
+RDATE:19780501T010000
+RDATE:19790501T010000
+RDATE:19800501T010000
+RDATE:19810501T010000
+RDATE:19820725T010000
+RDATE:19830712T010000
+RDATE:19840501T010000
+RDATE:19850501T010000
+RDATE:19860501T010000
+RDATE:19870501T010000
+RDATE:19880501T010000
+RDATE:19890506T010000
+RDATE:19900501T010000
+RDATE:19910501T010000
+RDATE:19920501T010000
+RDATE:19930501T010000
+RDATE:19940501T010000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19401001T000000
+RDATE:19401001T000000
+RDATE:19410916T000000
+RDATE:19421027T000000
+RDATE:19431101T000000
+RDATE:19441101T000000
+RDATE:19451101T000000
+RDATE:19571001T000000
+RDATE:19581001T000000
+RDATE:19590930T030000
+RDATE:19600930T030000
+RDATE:19610930T030000
+RDATE:19620930T030000
+RDATE:19630930T030000
+RDATE:19640930T030000
+RDATE:19650930T030000
+RDATE:19661001T030000
+RDATE:19671001T030000
+RDATE:19681001T030000
+RDATE:19691001T030000
+RDATE:19701001T030000
+RDATE:19711001T030000
+RDATE:19721001T030000
+RDATE:19731001T030000
+RDATE:19741001T030000
+RDATE:19751001T030000
+RDATE:19761001T030000
+RDATE:19771001T030000
+RDATE:19781001T030000
+RDATE:19791001T030000
+RDATE:19801001T030000
+RDATE:19811001T030000
+RDATE:19821001T030000
+RDATE:19831001T030000
+RDATE:19841001T030000
+RDATE:19851001T030000
+RDATE:19861001T030000
+RDATE:19871001T030000
+RDATE:19881001T030000
+RDATE:19891001T030000
+RDATE:19901001T030000
+RDATE:19911001T030000
+RDATE:19921001T030000
+RDATE:19931001T030000
+RDATE:19941001T030000
+RDATE:19950929T000000
+RDATE:19960927T000000
+RDATE:19970926T000000
+RDATE:19980925T000000
+RDATE:19991001T000000
+RDATE:20000929T000000
+RDATE:20010928T000000
+RDATE:20020927T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:20030925T230000
+RDATE:20030925T230000
+RDATE:20040930T230000
+RDATE:20050929T230000
+RDATE:20060921T230000
+RDATE:20070906T230000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Casablanca.ics b/libkcal/libical/zoneinfo/Africa/Casablanca.ics
new file mode 100644
index 00000000..0ba6bd00
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Casablanca.ics
@@ -0,0 +1,51 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Casablanca
+X-LIC-LOCATION:Africa/Casablanca
+BEGIN:STANDARD
+TZOFFSETFROM:-003020
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19131026T000000
+RDATE:19131026T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:WEST
+DTSTART:19390912T000000
+RDATE:19390912T000000
+RDATE:19400225T000000
+RDATE:19500611T000000
+RDATE:19670603T120000
+RDATE:19740624T000000
+RDATE:19760501T000000
+RDATE:19770501T000000
+RDATE:19780601T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19391119T000000
+RDATE:19391119T000000
+RDATE:19451118T000000
+RDATE:19501029T000000
+RDATE:19671001T000000
+RDATE:19740901T000000
+RDATE:19760801T000000
+RDATE:19770928T000000
+RDATE:19780804T000000
+RDATE:19860101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19840316T000000
+RDATE:19840316T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Ceuta.ics b/libkcal/libical/zoneinfo/Africa/Ceuta.ics
new file mode 100644
index 00000000..adf26c99
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Ceuta.ics
@@ -0,0 +1,99 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Ceuta
+X-LIC-LOCATION:Africa/Ceuta
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19860330T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-002116
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19010101T000000
+RDATE:19010101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:WEST
+DTSTART:19180506T230000
+RDATE:19180506T230000
+RDATE:19240416T230000
+RDATE:19260417T230000
+RDATE:19270409T230000
+RDATE:19280414T230000
+RDATE:19670603T120000
+RDATE:19740624T000000
+RDATE:19760501T000000
+RDATE:19770501T000000
+RDATE:19780601T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19181007T230000
+RDATE:19181007T230000
+RDATE:19241005T000000
+RDATE:19261003T000000
+RDATE:19271002T000000
+RDATE:19281007T000000
+RDATE:19671001T000000
+RDATE:19740901T000000
+RDATE:19760801T000000
+RDATE:19770928T000000
+RDATE:19780804T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19240101T000000
+RDATE:19240101T000000
+RDATE:19290101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19840316T000000
+RDATE:19840316T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19860101T000000
+RDATE:19860101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19860928T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Conakry.ics b/libkcal/libical/zoneinfo/Africa/Conakry.ics
new file mode 100644
index 00000000..ad55c750
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Conakry.ics
@@ -0,0 +1,29 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Conakry
+X-LIC-LOCATION:Africa/Conakry
+BEGIN:STANDARD
+TZOFFSETFROM:-005452
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19120101T000000
+RDATE:19120101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:-0100
+TZNAME:WAT
+DTSTART:19340226T000000
+RDATE:19340226T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0100
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19600101T000000
+RDATE:19600101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Dakar.ics b/libkcal/libical/zoneinfo/Africa/Dakar.ics
new file mode 100644
index 00000000..f7920fd9
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Dakar.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Dakar
+X-LIC-LOCATION:Africa/Dakar
+BEGIN:STANDARD
+TZOFFSETFROM:-010944
+TZOFFSETTO:-0100
+TZNAME:WAT
+DTSTART:19120101T000000
+RDATE:19120101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0100
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19410601T000000
+RDATE:19410601T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Dar_es_Salaam.ics b/libkcal/libical/zoneinfo/Africa/Dar_es_Salaam.ics
new file mode 100644
index 00000000..9a55ed72
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Dar_es_Salaam.ics
@@ -0,0 +1,29 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Dar_es_Salaam
+X-LIC-LOCATION:Africa/Dar_es_Salaam
+BEGIN:STANDARD
+TZOFFSETFROM:+023708
+TZOFFSETTO:+0300
+TZNAME:EAT
+DTSTART:19310101T000000
+RDATE:19310101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+024445
+TZNAME:BEAUT
+DTSTART:19480101T000000
+RDATE:19480101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+024445
+TZOFFSETTO:+0300
+TZNAME:EAT
+DTSTART:19610101T000000
+RDATE:19610101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Djibouti.ics b/libkcal/libical/zoneinfo/Africa/Djibouti.ics
new file mode 100644
index 00000000..a3cec464
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Djibouti.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Djibouti
+X-LIC-LOCATION:Africa/Djibouti
+BEGIN:STANDARD
+TZOFFSETFROM:+025236
+TZOFFSETTO:+0300
+TZNAME:EAT
+DTSTART:19110701T000000
+RDATE:19110701T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Douala.ics b/libkcal/libical/zoneinfo/Africa/Douala.ics
new file mode 100644
index 00000000..c3a7b7a6
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Douala.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Douala
+X-LIC-LOCATION:Africa/Douala
+BEGIN:STANDARD
+TZOFFSETFROM:+003848
+TZOFFSETTO:+0100
+TZNAME:WAT
+DTSTART:19120101T000000
+RDATE:19120101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/El_Aaiun.ics b/libkcal/libical/zoneinfo/Africa/El_Aaiun.ics
new file mode 100644
index 00000000..aca7b03f
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/El_Aaiun.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/El_Aaiun
+X-LIC-LOCATION:Africa/El_Aaiun
+BEGIN:STANDARD
+TZOFFSETFROM:-005248
+TZOFFSETTO:-0100
+TZNAME:WAT
+DTSTART:19340101T000000
+RDATE:19340101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0100
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19760414T000000
+RDATE:19760414T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Freetown.ics b/libkcal/libical/zoneinfo/Africa/Freetown.ics
new file mode 100644
index 00000000..492a464a
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Freetown.ics
@@ -0,0 +1,81 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Freetown
+X-LIC-LOCATION:Africa/Freetown
+BEGIN:STANDARD
+TZOFFSETFROM:-0053
+TZOFFSETTO:-0053
+TZNAME:FMT
+DTSTART:18820101T000000
+RDATE:18820101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0053
+TZOFFSETTO:-0100
+TZNAME:WAT
+DTSTART:19130601T000000
+RDATE:19130601T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0100
+TZOFFSETTO:-0020
+TZNAME:SLST
+DTSTART:19350601T000000
+RDATE:19350601T000000
+RDATE:19360601T000000
+RDATE:19370601T000000
+RDATE:19380601T000000
+RDATE:19390601T000000
+RDATE:19400601T000000
+RDATE:19410601T000000
+RDATE:19420601T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0020
+TZOFFSETTO:-0100
+TZNAME:WAT
+DTSTART:19351001T000000
+RDATE:19351001T000000
+RDATE:19361001T000000
+RDATE:19371001T000000
+RDATE:19381001T000000
+RDATE:19391001T000000
+RDATE:19401001T000000
+RDATE:19411001T000000
+RDATE:19421001T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0100
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19570101T000000
+RDATE:19570101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:SLST
+DTSTART:19570601T000000
+RDATE:19570601T000000
+RDATE:19580601T000000
+RDATE:19590601T000000
+RDATE:19600601T000000
+RDATE:19610601T000000
+RDATE:19620601T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19570901T000000
+RDATE:19570901T000000
+RDATE:19580901T000000
+RDATE:19590901T000000
+RDATE:19600901T000000
+RDATE:19610901T000000
+RDATE:19620901T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Gaborone.ics b/libkcal/libical/zoneinfo/Africa/Gaborone.ics
new file mode 100644
index 00000000..91c494ab
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Gaborone.ics
@@ -0,0 +1,29 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Gaborone
+X-LIC-LOCATION:Africa/Gaborone
+BEGIN:STANDARD
+TZOFFSETFROM:+014340
+TZOFFSETTO:+0200
+TZNAME:CAT
+DTSTART:18850101T000000
+RDATE:18850101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:CAST
+DTSTART:19430919T020000
+RDATE:19430919T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:CAT
+DTSTART:19440319T020000
+RDATE:19440319T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Harare.ics b/libkcal/libical/zoneinfo/Africa/Harare.ics
new file mode 100644
index 00000000..264796d7
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Harare.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Harare
+X-LIC-LOCATION:Africa/Harare
+BEGIN:STANDARD
+TZOFFSETFROM:+020412
+TZOFFSETTO:+0200
+TZNAME:CAT
+DTSTART:19030301T000000
+RDATE:19030301T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Johannesburg.ics b/libkcal/libical/zoneinfo/Africa/Johannesburg.ics
new file mode 100644
index 00000000..95a0eb5c
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Johannesburg.ics
@@ -0,0 +1,38 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Johannesburg
+X-LIC-LOCATION:Africa/Johannesburg
+BEGIN:STANDARD
+TZOFFSETFROM:+0152
+TZOFFSETTO:+0130
+TZNAME:SAST
+DTSTART:18920208T000000
+RDATE:18920208T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0130
+TZOFFSETTO:+0200
+TZNAME:SAST
+DTSTART:19030301T000000
+RDATE:19030301T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:SAST
+DTSTART:19420920T020000
+RDATE:19420920T020000
+RDATE:19430919T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:SAST
+DTSTART:19430321T020000
+RDATE:19430321T020000
+RDATE:19440319T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Kampala.ics b/libkcal/libical/zoneinfo/Africa/Kampala.ics
new file mode 100644
index 00000000..c332713d
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Kampala.ics
@@ -0,0 +1,36 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Kampala
+X-LIC-LOCATION:Africa/Kampala
+BEGIN:STANDARD
+TZOFFSETFROM:+020940
+TZOFFSETTO:+0300
+TZNAME:EAT
+DTSTART:19280701T000000
+RDATE:19280701T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0230
+TZNAME:BEAT
+DTSTART:19300101T000000
+RDATE:19300101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0230
+TZOFFSETTO:+024445
+TZNAME:BEAUT
+DTSTART:19480101T000000
+RDATE:19480101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+024445
+TZOFFSETTO:+0300
+TZNAME:EAT
+DTSTART:19570101T000000
+RDATE:19570101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Khartoum.ics b/libkcal/libical/zoneinfo/Africa/Khartoum.ics
new file mode 100644
index 00000000..7b1aa4c5
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Khartoum.ics
@@ -0,0 +1,66 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Khartoum
+X-LIC-LOCATION:Africa/Khartoum
+BEGIN:STANDARD
+TZOFFSETFROM:+021008
+TZOFFSETTO:+0200
+TZNAME:CAT
+DTSTART:19310101T000000
+RDATE:19310101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:CAST
+DTSTART:19700501T000000
+RDATE:19700501T000000
+RDATE:19710430T000000
+RDATE:19720430T000000
+RDATE:19730429T000000
+RDATE:19740428T000000
+RDATE:19750427T000000
+RDATE:19760425T000000
+RDATE:19770424T000000
+RDATE:19780430T000000
+RDATE:19790429T000000
+RDATE:19800427T000000
+RDATE:19810426T000000
+RDATE:19820425T000000
+RDATE:19830424T000000
+RDATE:19840429T000000
+RDATE:19850428T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:CAT
+DTSTART:19701015T000000
+RDATE:19701015T000000
+RDATE:19711015T000000
+RDATE:19721015T000000
+RDATE:19731015T000000
+RDATE:19741015T000000
+RDATE:19751015T000000
+RDATE:19761015T000000
+RDATE:19771015T000000
+RDATE:19781015T000000
+RDATE:19791015T000000
+RDATE:19801015T000000
+RDATE:19811015T000000
+RDATE:19821015T000000
+RDATE:19831015T000000
+RDATE:19841015T000000
+RDATE:19851015T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EAT
+DTSTART:20000115T120000
+RDATE:20000115T120000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Kigali.ics b/libkcal/libical/zoneinfo/Africa/Kigali.ics
new file mode 100644
index 00000000..5a88f680
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Kigali.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Kigali
+X-LIC-LOCATION:Africa/Kigali
+BEGIN:STANDARD
+TZOFFSETFROM:+020016
+TZOFFSETTO:+0200
+TZNAME:CAT
+DTSTART:19350601T000000
+RDATE:19350601T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Kinshasa.ics b/libkcal/libical/zoneinfo/Africa/Kinshasa.ics
new file mode 100644
index 00000000..1120c1a9
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Kinshasa.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Kinshasa
+X-LIC-LOCATION:Africa/Kinshasa
+BEGIN:STANDARD
+TZOFFSETFROM:+010112
+TZOFFSETTO:+0100
+TZNAME:WAT
+DTSTART:18971109T000000
+RDATE:18971109T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Lagos.ics b/libkcal/libical/zoneinfo/Africa/Lagos.ics
new file mode 100644
index 00000000..66b9a040
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Lagos.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Lagos
+X-LIC-LOCATION:Africa/Lagos
+BEGIN:STANDARD
+TZOFFSETFROM:+001336
+TZOFFSETTO:+0100
+TZNAME:WAT
+DTSTART:19190901T000000
+RDATE:19190901T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Libreville.ics b/libkcal/libical/zoneinfo/Africa/Libreville.ics
new file mode 100644
index 00000000..937dc157
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Libreville.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Libreville
+X-LIC-LOCATION:Africa/Libreville
+BEGIN:STANDARD
+TZOFFSETFROM:+003748
+TZOFFSETTO:+0100
+TZNAME:WAT
+DTSTART:19120101T000000
+RDATE:19120101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Lome.ics b/libkcal/libical/zoneinfo/Africa/Lome.ics
new file mode 100644
index 00000000..8b535f82
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Lome.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Lome
+X-LIC-LOCATION:Africa/Lome
+BEGIN:STANDARD
+TZOFFSETFROM:+000452
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:18930101T000000
+RDATE:18930101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Luanda.ics b/libkcal/libical/zoneinfo/Africa/Luanda.ics
new file mode 100644
index 00000000..d48392b1
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Luanda.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Luanda
+X-LIC-LOCATION:Africa/Luanda
+BEGIN:STANDARD
+TZOFFSETFROM:+005256
+TZOFFSETTO:+005204
+TZNAME:AOT
+DTSTART:18920101T000000
+RDATE:18920101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+005204
+TZOFFSETTO:+0100
+TZNAME:WAT
+DTSTART:19110526T000000
+RDATE:19110526T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Lubumbashi.ics b/libkcal/libical/zoneinfo/Africa/Lubumbashi.ics
new file mode 100644
index 00000000..9ea66469
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Lubumbashi.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Lubumbashi
+X-LIC-LOCATION:Africa/Lubumbashi
+BEGIN:STANDARD
+TZOFFSETFROM:+014952
+TZOFFSETTO:+0200
+TZNAME:CAT
+DTSTART:18971109T000000
+RDATE:18971109T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Lusaka.ics b/libkcal/libical/zoneinfo/Africa/Lusaka.ics
new file mode 100644
index 00000000..9f2c43aa
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Lusaka.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Lusaka
+X-LIC-LOCATION:Africa/Lusaka
+BEGIN:STANDARD
+TZOFFSETFROM:+015308
+TZOFFSETTO:+0200
+TZNAME:CAT
+DTSTART:19030301T000000
+RDATE:19030301T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Malabo.ics b/libkcal/libical/zoneinfo/Africa/Malabo.ics
new file mode 100644
index 00000000..0f057dfb
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Malabo.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Malabo
+X-LIC-LOCATION:Africa/Malabo
+BEGIN:STANDARD
+TZOFFSETFROM:+003508
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19120101T000000
+RDATE:19120101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:WAT
+DTSTART:19631215T000000
+RDATE:19631215T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Maputo.ics b/libkcal/libical/zoneinfo/Africa/Maputo.ics
new file mode 100644
index 00000000..63cfe3ae
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Maputo.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Maputo
+X-LIC-LOCATION:Africa/Maputo
+BEGIN:STANDARD
+TZOFFSETFROM:+021020
+TZOFFSETTO:+0200
+TZNAME:CAT
+DTSTART:19030301T000000
+RDATE:19030301T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Maseru.ics b/libkcal/libical/zoneinfo/Africa/Maseru.ics
new file mode 100644
index 00000000..ea185e3f
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Maseru.ics
@@ -0,0 +1,29 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Maseru
+X-LIC-LOCATION:Africa/Maseru
+BEGIN:STANDARD
+TZOFFSETFROM:+0150
+TZOFFSETTO:+0200
+TZNAME:SAST
+DTSTART:19030301T000000
+RDATE:19030301T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:SAST
+DTSTART:19430919T020000
+RDATE:19430919T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:SAST
+DTSTART:19440319T020000
+RDATE:19440319T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Mbabane.ics b/libkcal/libical/zoneinfo/Africa/Mbabane.ics
new file mode 100644
index 00000000..808b6a7a
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Mbabane.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Mbabane
+X-LIC-LOCATION:Africa/Mbabane
+BEGIN:STANDARD
+TZOFFSETFROM:+020424
+TZOFFSETTO:+0200
+TZNAME:SAST
+DTSTART:19030301T000000
+RDATE:19030301T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Mogadishu.ics b/libkcal/libical/zoneinfo/Africa/Mogadishu.ics
new file mode 100644
index 00000000..941a65ae
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Mogadishu.ics
@@ -0,0 +1,29 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Mogadishu
+X-LIC-LOCATION:Africa/Mogadishu
+BEGIN:STANDARD
+TZOFFSETFROM:+030128
+TZOFFSETTO:+0300
+TZNAME:EAT
+DTSTART:18931101T000000
+RDATE:18931101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0230
+TZNAME:BEAT
+DTSTART:19310101T000000
+RDATE:19310101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0230
+TZOFFSETTO:+0300
+TZNAME:EAT
+DTSTART:19570101T000000
+RDATE:19570101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Monrovia.ics b/libkcal/libical/zoneinfo/Africa/Monrovia.ics
new file mode 100644
index 00000000..9a36a003
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Monrovia.ics
@@ -0,0 +1,29 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Monrovia
+X-LIC-LOCATION:Africa/Monrovia
+BEGIN:STANDARD
+TZOFFSETFROM:-004308
+TZOFFSETTO:-004308
+TZNAME:MMT
+DTSTART:18820101T000000
+RDATE:18820101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-004308
+TZOFFSETTO:-004430
+TZNAME:LRT
+DTSTART:19190301T000000
+RDATE:19190301T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-004430
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19720501T000000
+RDATE:19720501T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Nairobi.ics b/libkcal/libical/zoneinfo/Africa/Nairobi.ics
new file mode 100644
index 00000000..a9b3c728
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Nairobi.ics
@@ -0,0 +1,36 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Nairobi
+X-LIC-LOCATION:Africa/Nairobi
+BEGIN:STANDARD
+TZOFFSETFROM:+022716
+TZOFFSETTO:+0300
+TZNAME:EAT
+DTSTART:19280701T000000
+RDATE:19280701T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0230
+TZNAME:BEAT
+DTSTART:19300101T000000
+RDATE:19300101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0230
+TZOFFSETTO:+024445
+TZNAME:BEAUT
+DTSTART:19400101T000000
+RDATE:19400101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+024445
+TZOFFSETTO:+0300
+TZNAME:EAT
+DTSTART:19600101T000000
+RDATE:19600101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Ndjamena.ics b/libkcal/libical/zoneinfo/Africa/Ndjamena.ics
new file mode 100644
index 00000000..afb48661
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Ndjamena.ics
@@ -0,0 +1,29 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Ndjamena
+X-LIC-LOCATION:Africa/Ndjamena
+BEGIN:STANDARD
+TZOFFSETFROM:+010012
+TZOFFSETTO:+0100
+TZNAME:WAT
+DTSTART:19120101T000000
+RDATE:19120101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:WAST
+DTSTART:19791014T000000
+RDATE:19791014T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:WAT
+DTSTART:19800308T000000
+RDATE:19800308T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Niamey.ics b/libkcal/libical/zoneinfo/Africa/Niamey.ics
new file mode 100644
index 00000000..09248ce9
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Niamey.ics
@@ -0,0 +1,29 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Niamey
+X-LIC-LOCATION:Africa/Niamey
+BEGIN:STANDARD
+TZOFFSETFROM:+000828
+TZOFFSETTO:-0100
+TZNAME:WAT
+DTSTART:19120101T000000
+RDATE:19120101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0100
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19340226T000000
+RDATE:19340226T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:WAT
+DTSTART:19600101T000000
+RDATE:19600101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Nouakchott.ics b/libkcal/libical/zoneinfo/Africa/Nouakchott.ics
new file mode 100644
index 00000000..4ee701a2
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Nouakchott.ics
@@ -0,0 +1,29 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Nouakchott
+X-LIC-LOCATION:Africa/Nouakchott
+BEGIN:STANDARD
+TZOFFSETFROM:-010348
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19120101T000000
+RDATE:19120101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:-0100
+TZNAME:WAT
+DTSTART:19340226T000000
+RDATE:19340226T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0100
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19601128T000000
+RDATE:19601128T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Ouagadougou.ics b/libkcal/libical/zoneinfo/Africa/Ouagadougou.ics
new file mode 100644
index 00000000..5e6d2256
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Ouagadougou.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Ouagadougou
+X-LIC-LOCATION:Africa/Ouagadougou
+BEGIN:STANDARD
+TZOFFSETFROM:-000604
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19120101T000000
+RDATE:19120101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Porto-Novo.ics b/libkcal/libical/zoneinfo/Africa/Porto-Novo.ics
new file mode 100644
index 00000000..60dec201
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Porto-Novo.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Porto-Novo
+X-LIC-LOCATION:Africa/Porto-Novo
+BEGIN:STANDARD
+TZOFFSETFROM:+001028
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19120101T000000
+RDATE:19120101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:WAT
+DTSTART:19340226T000000
+RDATE:19340226T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Sao_Tome.ics b/libkcal/libical/zoneinfo/Africa/Sao_Tome.ics
new file mode 100644
index 00000000..9135c17a
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Sao_Tome.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Sao_Tome
+X-LIC-LOCATION:Africa/Sao_Tome
+BEGIN:STANDARD
+TZOFFSETFROM:+002656
+TZOFFSETTO:-003632
+TZNAME:LMT
+DTSTART:18840101T000000
+RDATE:18840101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-003632
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19120101T000000
+RDATE:19120101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Tripoli.ics b/libkcal/libical/zoneinfo/Africa/Tripoli.ics
new file mode 100644
index 00000000..0398b040
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Tripoli.ics
@@ -0,0 +1,67 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Tripoli
+X-LIC-LOCATION:Africa/Tripoli
+BEGIN:STANDARD
+TZOFFSETFROM:+005244
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19200101T000000
+RDATE:19200101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19511014T020000
+RDATE:19511014T020000
+RDATE:19531009T020000
+RDATE:19550930T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850406T000000
+RDATE:19860404T000000
+RDATE:19870401T000000
+RDATE:19880401T000000
+RDATE:19890401T000000
+RDATE:19970404T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19520101T000000
+RDATE:19520101T000000
+RDATE:19540101T000000
+RDATE:19560101T000000
+RDATE:19820101T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19841001T000000
+RDATE:19851001T000000
+RDATE:19861003T000000
+RDATE:19871001T000000
+RDATE:19881001T000000
+RDATE:19891001T000000
+RDATE:19960930T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19590101T000000
+RDATE:19590101T000000
+RDATE:19900504T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19971004T000000
+RDATE:19971004T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Tunis.ics b/libkcal/libical/zoneinfo/Africa/Tunis.ics
new file mode 100644
index 00000000..6029fff7
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Tunis.ics
@@ -0,0 +1,74 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Tunis
+X-LIC-LOCATION:Africa/Tunis
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:20060326T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:20061029T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+004044
+TZOFFSETTO:+000921
+TZNAME:PMT
+DTSTART:18810512T000000
+RDATE:18810512T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+000921
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19110311T000000
+RDATE:19110311T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19390415T230000
+RDATE:19390415T230000
+RDATE:19400225T230000
+RDATE:19420309T000000
+RDATE:19430329T020000
+RDATE:19430425T020000
+RDATE:19440403T020000
+RDATE:19450402T020000
+RDATE:19770430T000000
+RDATE:19780501T000000
+RDATE:19880601T000000
+RDATE:19890326T000000
+RDATE:19900501T000000
+RDATE:20050501T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19391119T000000
+RDATE:19391119T000000
+RDATE:19411006T000000
+RDATE:19421102T030000
+RDATE:19430417T020000
+RDATE:19431004T020000
+RDATE:19441008T000000
+RDATE:19450916T000000
+RDATE:19770924T010000
+RDATE:19781001T010000
+RDATE:19880925T010000
+RDATE:19890924T010000
+RDATE:19900930T010000
+RDATE:20050930T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Africa/Windhoek.ics b/libkcal/libical/zoneinfo/Africa/Windhoek.ics
new file mode 100644
index 00000000..b9faf0bf
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Africa/Windhoek.ics
@@ -0,0 +1,64 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Africa/Windhoek
+X-LIC-LOCATION:Africa/Windhoek
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:WAST
+DTSTART:19940904T020000
+RRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:WAT
+DTSTART:19950402T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+010824
+TZOFFSETTO:+0130
+TZNAME:SWAT
+DTSTART:18920208T000000
+RDATE:18920208T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0130
+TZOFFSETTO:+0200
+TZNAME:SAST
+DTSTART:19030301T000000
+RDATE:19030301T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:SAST
+DTSTART:19420920T020000
+RDATE:19420920T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:SAST
+DTSTART:19430321T020000
+RDATE:19430321T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:CAT
+DTSTART:19900321T000000
+RDATE:19900321T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:WAT
+DTSTART:19940403T000000
+RDATE:19940403T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Adak.ics b/libkcal/libical/zoneinfo/America/Adak.ics
new file mode 100644
index 00000000..2350c268
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Adak.ics
@@ -0,0 +1,186 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Adak
+X-LIC-LOCATION:America/Adak
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-1000
+TZOFFSETTO:-0900
+TZNAME:HADT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0900
+TZOFFSETTO:-1000
+TZNAME:HAST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+121321
+TZOFFSETTO:-114638
+TZNAME:LMT
+DTSTART:18671018T000000
+RDATE:18671018T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-114638
+TZOFFSETTO:-1100
+TZNAME:NST
+DTSTART:19000820T120000
+RDATE:19000820T120000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-1100
+TZOFFSETTO:-1100
+TZNAME:NST
+DTSTART:19420101T000000
+RDATE:19420101T000000
+RDATE:19460101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-1100
+TZOFFSETTO:-1000
+TZNAME:NWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-1000
+TZOFFSETTO:-1000
+TZNAME:NPT
+DTSTART:19450814T130000
+RDATE:19450814T130000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-1000
+TZOFFSETTO:-1100
+TZNAME:NST
+DTSTART:19450930T020000
+RDATE:19450930T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-1100
+TZOFFSETTO:-1100
+TZNAME:BST
+DTSTART:19670401T000000
+RDATE:19670401T000000
+RDATE:19690101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-1100
+TZOFFSETTO:-1000
+TZNAME:BDT
+DTSTART:19690427T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19740106T020000
+RDATE:19750223T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-1000
+TZOFFSETTO:-1100
+TZNAME:BST
+DTSTART:19691026T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-1000
+TZOFFSETTO:-1000
+TZNAME:AHST
+DTSTART:19831030T020000
+RDATE:19831030T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-1000
+TZOFFSETTO:-1000
+TZNAME:HAST
+DTSTART:19831130T000000
+RDATE:19831130T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-1000
+TZOFFSETTO:-0900
+TZNAME:HADT
+DTSTART:19840429T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0900
+TZOFFSETTO:-1000
+TZNAME:HAST
+DTSTART:19841028T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Anchorage.ics b/libkcal/libical/zoneinfo/America/Anchorage.ics
new file mode 100644
index 00000000..d3c83bed
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Anchorage.ics
@@ -0,0 +1,186 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Anchorage
+X-LIC-LOCATION:America/Anchorage
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0800
+TZNAME:AKDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0900
+TZNAME:AKST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+140024
+TZOFFSETTO:-095936
+TZNAME:LMT
+DTSTART:18671018T000000
+RDATE:18671018T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-095936
+TZOFFSETTO:-1000
+TZNAME:CAT
+DTSTART:19000820T120000
+RDATE:19000820T120000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-1000
+TZOFFSETTO:-1000
+TZNAME:CAT
+DTSTART:19420101T000000
+RDATE:19420101T000000
+RDATE:19460101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-1000
+TZOFFSETTO:-0900
+TZNAME:CAWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0900
+TZNAME:CAPT
+DTSTART:19450814T140000
+RDATE:19450814T140000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0900
+TZOFFSETTO:-1000
+TZNAME:CAT
+DTSTART:19450930T020000
+RDATE:19450930T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-1000
+TZOFFSETTO:-1000
+TZNAME:AHST
+DTSTART:19670401T000000
+RDATE:19670401T000000
+RDATE:19690101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-1000
+TZOFFSETTO:-0900
+TZNAME:AHDT
+DTSTART:19690427T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19740106T020000
+RDATE:19750223T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0900
+TZOFFSETTO:-1000
+TZNAME:AHST
+DTSTART:19691026T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0900
+TZNAME:YST
+DTSTART:19831030T020000
+RDATE:19831030T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0900
+TZNAME:AKST
+DTSTART:19831130T000000
+RDATE:19831130T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0800
+TZNAME:AKDT
+DTSTART:19840429T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0900
+TZNAME:AKST
+DTSTART:19841028T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Anguilla.ics b/libkcal/libical/zoneinfo/America/Anguilla.ics
new file mode 100644
index 00000000..040235f8
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Anguilla.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Anguilla
+X-LIC-LOCATION:America/Anguilla
+BEGIN:STANDARD
+TZOFFSETFROM:-041216
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19120302T000000
+RDATE:19120302T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Antigua.ics b/libkcal/libical/zoneinfo/America/Antigua.ics
new file mode 100644
index 00000000..bb999579
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Antigua.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Antigua
+X-LIC-LOCATION:America/Antigua
+BEGIN:STANDARD
+TZOFFSETFROM:-040712
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19120302T000000
+RDATE:19120302T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19510101T000000
+RDATE:19510101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Araguaina.ics b/libkcal/libical/zoneinfo/America/Araguaina.ics
new file mode 100644
index 00000000..7bb34fba
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Araguaina.ics
@@ -0,0 +1,84 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Araguaina
+X-LIC-LOCATION:America/Araguaina
+BEGIN:STANDARD
+TZOFFSETFROM:-031248
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:19140101T000000
+RDATE:19140101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:BRST
+DTSTART:19311003T110000
+RDATE:19311003T110000
+RDATE:19321003T000000
+RDATE:19491201T000000
+RDATE:19501201T000000
+RDATE:19511201T000000
+RDATE:19521201T000000
+RDATE:19631209T000000
+RDATE:19650131T000000
+RDATE:19651201T000000
+RDATE:19661101T000000
+RDATE:19671101T000000
+RDATE:19851102T000000
+RDATE:19861025T000000
+RDATE:19871025T000000
+RDATE:19881016T000000
+RDATE:19891015T000000
+RDATE:19951015T000000
+RDATE:19961006T000000
+RDATE:19971006T000000
+RDATE:19981011T000000
+RDATE:19991003T000000
+RDATE:20001008T000000
+RDATE:20011014T000000
+RDATE:20021103T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:19320401T000000
+RDATE:19320401T000000
+RDATE:19330401T000000
+RDATE:19500416T010000
+RDATE:19510401T000000
+RDATE:19520401T000000
+RDATE:19530301T000000
+RDATE:19640301T000000
+RDATE:19650331T000000
+RDATE:19660301T000000
+RDATE:19670301T000000
+RDATE:19680301T000000
+RDATE:19860315T000000
+RDATE:19870214T000000
+RDATE:19880207T000000
+RDATE:19890129T000000
+RDATE:19900211T000000
+RDATE:19960211T000000
+RDATE:19970216T000000
+RDATE:19980301T000000
+RDATE:19990221T000000
+RDATE:20000227T000000
+RDATE:20010218T000000
+RDATE:20020217T000000
+RDATE:20030216T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:19900917T000000
+RDATE:19900917T000000
+RDATE:19950914T000000
+RDATE:20030924T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Argentina/Buenos_Aires.ics b/libkcal/libical/zoneinfo/America/Argentina/Buenos_Aires.ics
new file mode 100644
index 00000000..0a53523f
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Argentina/Buenos_Aires.ics
@@ -0,0 +1,134 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Argentina/Buenos_Aires
+X-LIC-LOCATION:America/Argentina/Buenos_Aires
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:20080316T000000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=3SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:20081005T000000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-035348
+TZOFFSETTO:-041648
+TZNAME:CMT
+DTSTART:18941031T000000
+RDATE:18941031T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-041648
+TZOFFSETTO:-0400
+TZNAME:ART
+DTSTART:19200501T000000
+RDATE:19200501T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ARST
+DTSTART:19301201T000000
+RDATE:19301201T000000
+RDATE:19311015T000000
+RDATE:19321101T000000
+RDATE:19331101T000000
+RDATE:19341101T000000
+RDATE:19351101T000000
+RDATE:19361101T000000
+RDATE:19371101T000000
+RDATE:19381101T000000
+RDATE:19391101T000000
+RDATE:19400701T000000
+RDATE:19411015T000000
+RDATE:19431015T000000
+RDATE:19461001T000000
+RDATE:19631215T000000
+RDATE:19641015T000000
+RDATE:19651015T000000
+RDATE:19661015T000000
+RDATE:19671001T000000
+RDATE:19681006T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:ART
+DTSTART:19310401T000000
+RDATE:19310401T000000
+RDATE:19320301T000000
+RDATE:19330301T000000
+RDATE:19340301T000000
+RDATE:19350301T000000
+RDATE:19360301T000000
+RDATE:19370301T000000
+RDATE:19380301T000000
+RDATE:19390301T000000
+RDATE:19400301T000000
+RDATE:19410615T000000
+RDATE:19430801T000000
+RDATE:19460301T000000
+RDATE:19631001T000000
+RDATE:19640301T000000
+RDATE:19650301T000000
+RDATE:19660301T000000
+RDATE:19670402T000000
+RDATE:19680407T000000
+RDATE:19690406T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19691005T000000
+RDATE:19691005T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:19740123T000000
+RDATE:19740123T000000
+RDATE:19881201T000000
+RDATE:19891015T000000
+RDATE:19901021T000000
+RDATE:19911020T000000
+RDATE:19921018T000000
+RDATE:20071230T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19740501T000000
+RDATE:19740501T000000
+RDATE:19890305T000000
+RDATE:19900304T000000
+RDATE:19910303T000000
+RDATE:19920301T000000
+RDATE:19930307T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ARST
+DTSTART:19991003T000000
+RDATE:19991003T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:20000303T000000
+RDATE:20000303T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Argentina/Catamarca.ics b/libkcal/libical/zoneinfo/America/Argentina/Catamarca.ics
new file mode 100644
index 00000000..362f94d4
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Argentina/Catamarca.ics
@@ -0,0 +1,154 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Argentina/Catamarca
+X-LIC-LOCATION:America/Argentina/Catamarca
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:20080316T000000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=3SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:20081005T000000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-042308
+TZOFFSETTO:-041648
+TZNAME:CMT
+DTSTART:18941031T000000
+RDATE:18941031T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-041648
+TZOFFSETTO:-0400
+TZNAME:ART
+DTSTART:19200501T000000
+RDATE:19200501T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ARST
+DTSTART:19301201T000000
+RDATE:19301201T000000
+RDATE:19311015T000000
+RDATE:19321101T000000
+RDATE:19331101T000000
+RDATE:19341101T000000
+RDATE:19351101T000000
+RDATE:19361101T000000
+RDATE:19371101T000000
+RDATE:19381101T000000
+RDATE:19391101T000000
+RDATE:19400701T000000
+RDATE:19411015T000000
+RDATE:19431015T000000
+RDATE:19461001T000000
+RDATE:19631215T000000
+RDATE:19641015T000000
+RDATE:19651015T000000
+RDATE:19661015T000000
+RDATE:19671001T000000
+RDATE:19681006T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:ART
+DTSTART:19310401T000000
+RDATE:19310401T000000
+RDATE:19320301T000000
+RDATE:19330301T000000
+RDATE:19340301T000000
+RDATE:19350301T000000
+RDATE:19360301T000000
+RDATE:19370301T000000
+RDATE:19380301T000000
+RDATE:19390301T000000
+RDATE:19400301T000000
+RDATE:19410615T000000
+RDATE:19430801T000000
+RDATE:19460301T000000
+RDATE:19631001T000000
+RDATE:19640301T000000
+RDATE:19650301T000000
+RDATE:19660301T000000
+RDATE:19670402T000000
+RDATE:19680407T000000
+RDATE:19690406T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19691005T000000
+RDATE:19691005T000000
+RDATE:20040620T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:19740123T000000
+RDATE:19740123T000000
+RDATE:19881201T000000
+RDATE:19891015T000000
+RDATE:19901021T000000
+RDATE:19921018T000000
+RDATE:20071230T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19740501T000000
+RDATE:19740501T000000
+RDATE:19890305T000000
+RDATE:19900304T000000
+RDATE:19920301T000000
+RDATE:19930307T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0400
+TZNAME:WART
+DTSTART:19910303T000000
+RDATE:19910303T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:19911020T000000
+RDATE:19911020T000000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ARST
+DTSTART:19991003T000000
+RDATE:19991003T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:20000303T000000
+RDATE:20000303T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:WART
+DTSTART:20040601T000000
+RDATE:20040601T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Argentina/Cordoba.ics b/libkcal/libical/zoneinfo/America/Argentina/Cordoba.ics
new file mode 100644
index 00000000..923fcafc
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Argentina/Cordoba.ics
@@ -0,0 +1,146 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Argentina/Cordoba
+X-LIC-LOCATION:America/Argentina/Cordoba
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:20080316T000000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=3SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:20081005T000000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-041648
+TZOFFSETTO:-041648
+TZNAME:CMT
+DTSTART:18941031T000000
+RDATE:18941031T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-041648
+TZOFFSETTO:-0400
+TZNAME:ART
+DTSTART:19200501T000000
+RDATE:19200501T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ARST
+DTSTART:19301201T000000
+RDATE:19301201T000000
+RDATE:19311015T000000
+RDATE:19321101T000000
+RDATE:19331101T000000
+RDATE:19341101T000000
+RDATE:19351101T000000
+RDATE:19361101T000000
+RDATE:19371101T000000
+RDATE:19381101T000000
+RDATE:19391101T000000
+RDATE:19400701T000000
+RDATE:19411015T000000
+RDATE:19431015T000000
+RDATE:19461001T000000
+RDATE:19631215T000000
+RDATE:19641015T000000
+RDATE:19651015T000000
+RDATE:19661015T000000
+RDATE:19671001T000000
+RDATE:19681006T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:ART
+DTSTART:19310401T000000
+RDATE:19310401T000000
+RDATE:19320301T000000
+RDATE:19330301T000000
+RDATE:19340301T000000
+RDATE:19350301T000000
+RDATE:19360301T000000
+RDATE:19370301T000000
+RDATE:19380301T000000
+RDATE:19390301T000000
+RDATE:19400301T000000
+RDATE:19410615T000000
+RDATE:19430801T000000
+RDATE:19460301T000000
+RDATE:19631001T000000
+RDATE:19640301T000000
+RDATE:19650301T000000
+RDATE:19660301T000000
+RDATE:19670402T000000
+RDATE:19680407T000000
+RDATE:19690406T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19691005T000000
+RDATE:19691005T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:19740123T000000
+RDATE:19740123T000000
+RDATE:19881201T000000
+RDATE:19891015T000000
+RDATE:19901021T000000
+RDATE:19921018T000000
+RDATE:20071230T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19740501T000000
+RDATE:19740501T000000
+RDATE:19890305T000000
+RDATE:19900304T000000
+RDATE:19920301T000000
+RDATE:19930307T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0400
+TZNAME:WART
+DTSTART:19910303T000000
+RDATE:19910303T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:19911020T000000
+RDATE:19911020T000000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ARST
+DTSTART:19991003T000000
+RDATE:19991003T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:20000303T000000
+RDATE:20000303T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Argentina/Jujuy.ics b/libkcal/libical/zoneinfo/America/Argentina/Jujuy.ics
new file mode 100644
index 00000000..f3fc0abe
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Argentina/Jujuy.ics
@@ -0,0 +1,165 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Argentina/Jujuy
+X-LIC-LOCATION:America/Argentina/Jujuy
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:20080316T000000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=3SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:20081005T000000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-042112
+TZOFFSETTO:-041648
+TZNAME:CMT
+DTSTART:18941031T000000
+RDATE:18941031T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-041648
+TZOFFSETTO:-0400
+TZNAME:ART
+DTSTART:19200501T000000
+RDATE:19200501T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ARST
+DTSTART:19301201T000000
+RDATE:19301201T000000
+RDATE:19311015T000000
+RDATE:19321101T000000
+RDATE:19331101T000000
+RDATE:19341101T000000
+RDATE:19351101T000000
+RDATE:19361101T000000
+RDATE:19371101T000000
+RDATE:19381101T000000
+RDATE:19391101T000000
+RDATE:19400701T000000
+RDATE:19411015T000000
+RDATE:19431015T000000
+RDATE:19461001T000000
+RDATE:19631215T000000
+RDATE:19641015T000000
+RDATE:19651015T000000
+RDATE:19661015T000000
+RDATE:19671001T000000
+RDATE:19681006T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:ART
+DTSTART:19310401T000000
+RDATE:19310401T000000
+RDATE:19320301T000000
+RDATE:19330301T000000
+RDATE:19340301T000000
+RDATE:19350301T000000
+RDATE:19360301T000000
+RDATE:19370301T000000
+RDATE:19380301T000000
+RDATE:19390301T000000
+RDATE:19400301T000000
+RDATE:19410615T000000
+RDATE:19430801T000000
+RDATE:19460301T000000
+RDATE:19631001T000000
+RDATE:19640301T000000
+RDATE:19650301T000000
+RDATE:19660301T000000
+RDATE:19670402T000000
+RDATE:19680407T000000
+RDATE:19690406T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19691005T000000
+RDATE:19691005T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:19740123T000000
+RDATE:19740123T000000
+RDATE:19881201T000000
+RDATE:19891015T000000
+RDATE:19921018T000000
+RDATE:20071230T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19740501T000000
+RDATE:19740501T000000
+RDATE:19890305T000000
+RDATE:19920301T000000
+RDATE:19930307T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0400
+TZNAME:WART
+DTSTART:19900304T000000
+RDATE:19900304T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:WARST
+DTSTART:19901028T000000
+RDATE:19901028T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:WART
+DTSTART:19910317T000000
+RDATE:19910317T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:19911006T000000
+RDATE:19911006T000000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:19920101T000000
+RDATE:19920101T000000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ARST
+DTSTART:19991003T000000
+RDATE:19991003T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:20000303T000000
+RDATE:20000303T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Argentina/La_Rioja.ics b/libkcal/libical/zoneinfo/America/Argentina/La_Rioja.ics
new file mode 100644
index 00000000..7a0b3bc5
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Argentina/La_Rioja.ics
@@ -0,0 +1,149 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Argentina/La_Rioja
+X-LIC-LOCATION:America/Argentina/La_Rioja
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:20080316T000000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=3SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:20081005T000000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-042724
+TZOFFSETTO:-041648
+TZNAME:CMT
+DTSTART:18941031T000000
+RDATE:18941031T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-041648
+TZOFFSETTO:-0400
+TZNAME:ART
+DTSTART:19200501T000000
+RDATE:19200501T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ARST
+DTSTART:19301201T000000
+RDATE:19301201T000000
+RDATE:19311015T000000
+RDATE:19321101T000000
+RDATE:19331101T000000
+RDATE:19341101T000000
+RDATE:19351101T000000
+RDATE:19361101T000000
+RDATE:19371101T000000
+RDATE:19381101T000000
+RDATE:19391101T000000
+RDATE:19400701T000000
+RDATE:19411015T000000
+RDATE:19431015T000000
+RDATE:19461001T000000
+RDATE:19631215T000000
+RDATE:19641015T000000
+RDATE:19651015T000000
+RDATE:19661015T000000
+RDATE:19671001T000000
+RDATE:19681006T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:ART
+DTSTART:19310401T000000
+RDATE:19310401T000000
+RDATE:19320301T000000
+RDATE:19330301T000000
+RDATE:19340301T000000
+RDATE:19350301T000000
+RDATE:19360301T000000
+RDATE:19370301T000000
+RDATE:19380301T000000
+RDATE:19390301T000000
+RDATE:19400301T000000
+RDATE:19410615T000000
+RDATE:19430801T000000
+RDATE:19460301T000000
+RDATE:19631001T000000
+RDATE:19640301T000000
+RDATE:19650301T000000
+RDATE:19660301T000000
+RDATE:19670402T000000
+RDATE:19680407T000000
+RDATE:19690406T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19691005T000000
+RDATE:19691005T000000
+RDATE:19910507T000000
+RDATE:20040620T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:19740123T000000
+RDATE:19740123T000000
+RDATE:19881201T000000
+RDATE:19891015T000000
+RDATE:19901021T000000
+RDATE:19911020T000000
+RDATE:19921018T000000
+RDATE:20071230T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19740501T000000
+RDATE:19740501T000000
+RDATE:19890305T000000
+RDATE:19900304T000000
+RDATE:19920301T000000
+RDATE:19930307T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0400
+TZNAME:WART
+DTSTART:19910301T000000
+RDATE:19910301T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ARST
+DTSTART:19991003T000000
+RDATE:19991003T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:20000303T000000
+RDATE:20000303T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:WART
+DTSTART:20040601T000000
+RDATE:20040601T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Argentina/Mendoza.ics b/libkcal/libical/zoneinfo/America/Argentina/Mendoza.ics
new file mode 100644
index 00000000..43c632e7
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Argentina/Mendoza.ics
@@ -0,0 +1,160 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Argentina/Mendoza
+X-LIC-LOCATION:America/Argentina/Mendoza
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:20080316T000000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=3SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:20081005T000000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-043516
+TZOFFSETTO:-041648
+TZNAME:CMT
+DTSTART:18941031T000000
+RDATE:18941031T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-041648
+TZOFFSETTO:-0400
+TZNAME:ART
+DTSTART:19200501T000000
+RDATE:19200501T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ARST
+DTSTART:19301201T000000
+RDATE:19301201T000000
+RDATE:19311015T000000
+RDATE:19321101T000000
+RDATE:19331101T000000
+RDATE:19341101T000000
+RDATE:19351101T000000
+RDATE:19361101T000000
+RDATE:19371101T000000
+RDATE:19381101T000000
+RDATE:19391101T000000
+RDATE:19400701T000000
+RDATE:19411015T000000
+RDATE:19431015T000000
+RDATE:19461001T000000
+RDATE:19631215T000000
+RDATE:19641015T000000
+RDATE:19651015T000000
+RDATE:19661015T000000
+RDATE:19671001T000000
+RDATE:19681006T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:ART
+DTSTART:19310401T000000
+RDATE:19310401T000000
+RDATE:19320301T000000
+RDATE:19330301T000000
+RDATE:19340301T000000
+RDATE:19350301T000000
+RDATE:19360301T000000
+RDATE:19370301T000000
+RDATE:19380301T000000
+RDATE:19390301T000000
+RDATE:19400301T000000
+RDATE:19410615T000000
+RDATE:19430801T000000
+RDATE:19460301T000000
+RDATE:19631001T000000
+RDATE:19640301T000000
+RDATE:19650301T000000
+RDATE:19660301T000000
+RDATE:19670402T000000
+RDATE:19680407T000000
+RDATE:19690406T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19691005T000000
+RDATE:19691005T000000
+RDATE:20040926T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:19740123T000000
+RDATE:19740123T000000
+RDATE:19881201T000000
+RDATE:19891015T000000
+RDATE:20071230T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19740501T000000
+RDATE:19740501T000000
+RDATE:19890305T000000
+RDATE:19930307T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0400
+TZNAME:WART
+DTSTART:19900304T000000
+RDATE:19900304T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:WARST
+DTSTART:19901015T000000
+RDATE:19901015T000000
+RDATE:19911015T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:WART
+DTSTART:19910301T000000
+RDATE:19910301T000000
+RDATE:19920301T000000
+RDATE:20040523T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:19921018T000000
+RDATE:19921018T000000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ARST
+DTSTART:19991003T000000
+RDATE:19991003T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:20000303T000000
+RDATE:20000303T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Argentina/Rio_Gallegos.ics b/libkcal/libical/zoneinfo/America/Argentina/Rio_Gallegos.ics
new file mode 100644
index 00000000..b2a59cd2
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Argentina/Rio_Gallegos.ics
@@ -0,0 +1,142 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Argentina/Rio_Gallegos
+X-LIC-LOCATION:America/Argentina/Rio_Gallegos
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:20080316T000000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=3SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:20081005T000000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-043652
+TZOFFSETTO:-041648
+TZNAME:CMT
+DTSTART:18941031T000000
+RDATE:18941031T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-041648
+TZOFFSETTO:-0400
+TZNAME:ART
+DTSTART:19200501T000000
+RDATE:19200501T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ARST
+DTSTART:19301201T000000
+RDATE:19301201T000000
+RDATE:19311015T000000
+RDATE:19321101T000000
+RDATE:19331101T000000
+RDATE:19341101T000000
+RDATE:19351101T000000
+RDATE:19361101T000000
+RDATE:19371101T000000
+RDATE:19381101T000000
+RDATE:19391101T000000
+RDATE:19400701T000000
+RDATE:19411015T000000
+RDATE:19431015T000000
+RDATE:19461001T000000
+RDATE:19631215T000000
+RDATE:19641015T000000
+RDATE:19651015T000000
+RDATE:19661015T000000
+RDATE:19671001T000000
+RDATE:19681006T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:ART
+DTSTART:19310401T000000
+RDATE:19310401T000000
+RDATE:19320301T000000
+RDATE:19330301T000000
+RDATE:19340301T000000
+RDATE:19350301T000000
+RDATE:19360301T000000
+RDATE:19370301T000000
+RDATE:19380301T000000
+RDATE:19390301T000000
+RDATE:19400301T000000
+RDATE:19410615T000000
+RDATE:19430801T000000
+RDATE:19460301T000000
+RDATE:19631001T000000
+RDATE:19640301T000000
+RDATE:19650301T000000
+RDATE:19660301T000000
+RDATE:19670402T000000
+RDATE:19680407T000000
+RDATE:19690406T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19691005T000000
+RDATE:19691005T000000
+RDATE:20040620T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:19740123T000000
+RDATE:19740123T000000
+RDATE:19881201T000000
+RDATE:19891015T000000
+RDATE:19901021T000000
+RDATE:19911020T000000
+RDATE:19921018T000000
+RDATE:20071230T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19740501T000000
+RDATE:19740501T000000
+RDATE:19890305T000000
+RDATE:19900304T000000
+RDATE:19910303T000000
+RDATE:19920301T000000
+RDATE:19930307T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ARST
+DTSTART:19991003T000000
+RDATE:19991003T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:20000303T000000
+RDATE:20000303T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:WART
+DTSTART:20040601T000000
+RDATE:20040601T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Argentina/San_Juan.ics b/libkcal/libical/zoneinfo/America/Argentina/San_Juan.ics
new file mode 100644
index 00000000..29641141
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Argentina/San_Juan.ics
@@ -0,0 +1,149 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Argentina/San_Juan
+X-LIC-LOCATION:America/Argentina/San_Juan
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:20080316T000000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=3SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:20081005T000000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-043404
+TZOFFSETTO:-041648
+TZNAME:CMT
+DTSTART:18941031T000000
+RDATE:18941031T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-041648
+TZOFFSETTO:-0400
+TZNAME:ART
+DTSTART:19200501T000000
+RDATE:19200501T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ARST
+DTSTART:19301201T000000
+RDATE:19301201T000000
+RDATE:19311015T000000
+RDATE:19321101T000000
+RDATE:19331101T000000
+RDATE:19341101T000000
+RDATE:19351101T000000
+RDATE:19361101T000000
+RDATE:19371101T000000
+RDATE:19381101T000000
+RDATE:19391101T000000
+RDATE:19400701T000000
+RDATE:19411015T000000
+RDATE:19431015T000000
+RDATE:19461001T000000
+RDATE:19631215T000000
+RDATE:19641015T000000
+RDATE:19651015T000000
+RDATE:19661015T000000
+RDATE:19671001T000000
+RDATE:19681006T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:ART
+DTSTART:19310401T000000
+RDATE:19310401T000000
+RDATE:19320301T000000
+RDATE:19330301T000000
+RDATE:19340301T000000
+RDATE:19350301T000000
+RDATE:19360301T000000
+RDATE:19370301T000000
+RDATE:19380301T000000
+RDATE:19390301T000000
+RDATE:19400301T000000
+RDATE:19410615T000000
+RDATE:19430801T000000
+RDATE:19460301T000000
+RDATE:19631001T000000
+RDATE:19640301T000000
+RDATE:19650301T000000
+RDATE:19660301T000000
+RDATE:19670402T000000
+RDATE:19680407T000000
+RDATE:19690406T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19691005T000000
+RDATE:19691005T000000
+RDATE:19910507T000000
+RDATE:20040725T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:19740123T000000
+RDATE:19740123T000000
+RDATE:19881201T000000
+RDATE:19891015T000000
+RDATE:19901021T000000
+RDATE:19911020T000000
+RDATE:19921018T000000
+RDATE:20071230T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19740501T000000
+RDATE:19740501T000000
+RDATE:19890305T000000
+RDATE:19900304T000000
+RDATE:19920301T000000
+RDATE:19930307T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0400
+TZNAME:WART
+DTSTART:19910301T000000
+RDATE:19910301T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ARST
+DTSTART:19991003T000000
+RDATE:19991003T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:20000303T000000
+RDATE:20000303T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:WART
+DTSTART:20040531T000000
+RDATE:20040531T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Argentina/San_Luis.ics b/libkcal/libical/zoneinfo/America/Argentina/San_Luis.ics
new file mode 100644
index 00000000..cefad3a9
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Argentina/San_Luis.ics
@@ -0,0 +1,141 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Argentina/San_Luis
+X-LIC-LOCATION:America/Argentina/San_Luis
+BEGIN:STANDARD
+TZOFFSETFROM:-042524
+TZOFFSETTO:-041648
+TZNAME:CMT
+DTSTART:18941031T000000
+RDATE:18941031T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-041648
+TZOFFSETTO:-0400
+TZNAME:ART
+DTSTART:19200501T000000
+RDATE:19200501T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ARST
+DTSTART:19301201T000000
+RDATE:19301201T000000
+RDATE:19311015T000000
+RDATE:19321101T000000
+RDATE:19331101T000000
+RDATE:19341101T000000
+RDATE:19351101T000000
+RDATE:19361101T000000
+RDATE:19371101T000000
+RDATE:19381101T000000
+RDATE:19391101T000000
+RDATE:19400701T000000
+RDATE:19411015T000000
+RDATE:19431015T000000
+RDATE:19461001T000000
+RDATE:19631215T000000
+RDATE:19641015T000000
+RDATE:19651015T000000
+RDATE:19661015T000000
+RDATE:19671001T000000
+RDATE:19681006T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:ART
+DTSTART:19310401T000000
+RDATE:19310401T000000
+RDATE:19320301T000000
+RDATE:19330301T000000
+RDATE:19340301T000000
+RDATE:19350301T000000
+RDATE:19360301T000000
+RDATE:19370301T000000
+RDATE:19380301T000000
+RDATE:19390301T000000
+RDATE:19400301T000000
+RDATE:19410615T000000
+RDATE:19430801T000000
+RDATE:19460301T000000
+RDATE:19631001T000000
+RDATE:19640301T000000
+RDATE:19650301T000000
+RDATE:19660301T000000
+RDATE:19670402T000000
+RDATE:19680407T000000
+RDATE:19690406T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19691005T000000
+RDATE:19691005T000000
+RDATE:19910507T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:19740123T000000
+RDATE:19740123T000000
+RDATE:19881201T000000
+RDATE:19891015T000000
+RDATE:19901021T000000
+RDATE:19911020T000000
+RDATE:19921018T000000
+RDATE:20071230T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19740501T000000
+RDATE:19740501T000000
+RDATE:19890305T000000
+RDATE:19900304T000000
+RDATE:19920301T000000
+RDATE:19930307T000000
+RDATE:20080121T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0400
+TZNAME:WART
+DTSTART:19910301T000000
+RDATE:19910301T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ARST
+DTSTART:19991003T000000
+RDATE:19991003T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:20000303T000000
+RDATE:20000303T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:WART
+DTSTART:20040531T000000
+RDATE:20040531T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+DTSTART:20040725T000000
+RDATE:20040725T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Argentina/Tucuman.ics b/libkcal/libical/zoneinfo/America/Argentina/Tucuman.ics
new file mode 100644
index 00000000..0a49b030
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Argentina/Tucuman.ics
@@ -0,0 +1,154 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Argentina/Tucuman
+X-LIC-LOCATION:America/Argentina/Tucuman
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:20080316T000000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=3SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:20081005T000000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-042052
+TZOFFSETTO:-041648
+TZNAME:CMT
+DTSTART:18941031T000000
+RDATE:18941031T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-041648
+TZOFFSETTO:-0400
+TZNAME:ART
+DTSTART:19200501T000000
+RDATE:19200501T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ARST
+DTSTART:19301201T000000
+RDATE:19301201T000000
+RDATE:19311015T000000
+RDATE:19321101T000000
+RDATE:19331101T000000
+RDATE:19341101T000000
+RDATE:19351101T000000
+RDATE:19361101T000000
+RDATE:19371101T000000
+RDATE:19381101T000000
+RDATE:19391101T000000
+RDATE:19400701T000000
+RDATE:19411015T000000
+RDATE:19431015T000000
+RDATE:19461001T000000
+RDATE:19631215T000000
+RDATE:19641015T000000
+RDATE:19651015T000000
+RDATE:19661015T000000
+RDATE:19671001T000000
+RDATE:19681006T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:ART
+DTSTART:19310401T000000
+RDATE:19310401T000000
+RDATE:19320301T000000
+RDATE:19330301T000000
+RDATE:19340301T000000
+RDATE:19350301T000000
+RDATE:19360301T000000
+RDATE:19370301T000000
+RDATE:19380301T000000
+RDATE:19390301T000000
+RDATE:19400301T000000
+RDATE:19410615T000000
+RDATE:19430801T000000
+RDATE:19460301T000000
+RDATE:19631001T000000
+RDATE:19640301T000000
+RDATE:19650301T000000
+RDATE:19660301T000000
+RDATE:19670402T000000
+RDATE:19680407T000000
+RDATE:19690406T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19691005T000000
+RDATE:19691005T000000
+RDATE:20040613T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:19740123T000000
+RDATE:19740123T000000
+RDATE:19881201T000000
+RDATE:19891015T000000
+RDATE:19901021T000000
+RDATE:19921018T000000
+RDATE:20071230T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19740501T000000
+RDATE:19740501T000000
+RDATE:19890305T000000
+RDATE:19900304T000000
+RDATE:19920301T000000
+RDATE:19930307T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0400
+TZNAME:WART
+DTSTART:19910303T000000
+RDATE:19910303T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:19911020T000000
+RDATE:19911020T000000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ARST
+DTSTART:19991003T000000
+RDATE:19991003T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:20000303T000000
+RDATE:20000303T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:WART
+DTSTART:20040601T000000
+RDATE:20040601T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Argentina/Ushuaia.ics b/libkcal/libical/zoneinfo/America/Argentina/Ushuaia.ics
new file mode 100644
index 00000000..615a9b80
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Argentina/Ushuaia.ics
@@ -0,0 +1,142 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Argentina/Ushuaia
+X-LIC-LOCATION:America/Argentina/Ushuaia
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:20080316T000000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=3SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:20081005T000000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-043312
+TZOFFSETTO:-041648
+TZNAME:CMT
+DTSTART:18941031T000000
+RDATE:18941031T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-041648
+TZOFFSETTO:-0400
+TZNAME:ART
+DTSTART:19200501T000000
+RDATE:19200501T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ARST
+DTSTART:19301201T000000
+RDATE:19301201T000000
+RDATE:19311015T000000
+RDATE:19321101T000000
+RDATE:19331101T000000
+RDATE:19341101T000000
+RDATE:19351101T000000
+RDATE:19361101T000000
+RDATE:19371101T000000
+RDATE:19381101T000000
+RDATE:19391101T000000
+RDATE:19400701T000000
+RDATE:19411015T000000
+RDATE:19431015T000000
+RDATE:19461001T000000
+RDATE:19631215T000000
+RDATE:19641015T000000
+RDATE:19651015T000000
+RDATE:19661015T000000
+RDATE:19671001T000000
+RDATE:19681006T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:ART
+DTSTART:19310401T000000
+RDATE:19310401T000000
+RDATE:19320301T000000
+RDATE:19330301T000000
+RDATE:19340301T000000
+RDATE:19350301T000000
+RDATE:19360301T000000
+RDATE:19370301T000000
+RDATE:19380301T000000
+RDATE:19390301T000000
+RDATE:19400301T000000
+RDATE:19410615T000000
+RDATE:19430801T000000
+RDATE:19460301T000000
+RDATE:19631001T000000
+RDATE:19640301T000000
+RDATE:19650301T000000
+RDATE:19660301T000000
+RDATE:19670402T000000
+RDATE:19680407T000000
+RDATE:19690406T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19691005T000000
+RDATE:19691005T000000
+RDATE:20040620T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:19740123T000000
+RDATE:19740123T000000
+RDATE:19881201T000000
+RDATE:19891015T000000
+RDATE:19901021T000000
+RDATE:19911020T000000
+RDATE:19921018T000000
+RDATE:20071230T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19740501T000000
+RDATE:19740501T000000
+RDATE:19890305T000000
+RDATE:19900304T000000
+RDATE:19910303T000000
+RDATE:19920301T000000
+RDATE:19930307T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ARST
+DTSTART:19991003T000000
+RDATE:19991003T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:20000303T000000
+RDATE:20000303T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:WART
+DTSTART:20040530T000000
+RDATE:20040530T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Aruba.ics b/libkcal/libical/zoneinfo/America/Aruba.ics
new file mode 100644
index 00000000..dd17d79e
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Aruba.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Aruba
+X-LIC-LOCATION:America/Aruba
+BEGIN:STANDARD
+TZOFFSETFROM:-044024
+TZOFFSETTO:-0430
+TZNAME:ANT
+DTSTART:19120212T000000
+RDATE:19120212T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0430
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19650101T000000
+RDATE:19650101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Asuncion.ics b/libkcal/libical/zoneinfo/America/Asuncion.ics
new file mode 100644
index 00000000..041f5532
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Asuncion.ics
@@ -0,0 +1,121 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Asuncion
+X-LIC-LOCATION:America/Asuncion
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:PYST
+DTSTART:20041017T000000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=3SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:PYT
+DTSTART:20050313T000000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-035040
+TZOFFSETTO:-035040
+TZNAME:AMT
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-035040
+TZOFFSETTO:-0400
+TZNAME:PYT
+DTSTART:19311010T000000
+RDATE:19311010T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:PYT
+DTSTART:19721001T000000
+RDATE:19721001T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:PYT
+DTSTART:19740401T000000
+RDATE:19740401T000000
+RDATE:19760301T000000
+RDATE:19770301T000000
+RDATE:19780301T000000
+RDATE:19790401T000000
+RDATE:19800401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850401T000000
+RDATE:19860401T000000
+RDATE:19870401T000000
+RDATE:19880401T000000
+RDATE:19890401T000000
+RDATE:19900401T000000
+RDATE:19910401T000000
+RDATE:19920301T000000
+RDATE:19930331T000000
+RDATE:19940227T000000
+RDATE:19950226T000000
+RDATE:19960301T000000
+RDATE:19970223T000000
+RDATE:19980301T000000
+RDATE:19990307T000000
+RDATE:20000305T000000
+RDATE:20010304T000000
+RDATE:20020407T000000
+RDATE:20030406T000000
+RDATE:20040404T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:PYT
+DTSTART:19750301T000000
+RDATE:19750301T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:PYST
+DTSTART:19751001T000000
+RDATE:19751001T000000
+RDATE:19761001T000000
+RDATE:19771001T000000
+RDATE:19781001T000000
+RDATE:19791001T000000
+RDATE:19801001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19841001T000000
+RDATE:19851001T000000
+RDATE:19861001T000000
+RDATE:19871001T000000
+RDATE:19881001T000000
+RDATE:19891022T000000
+RDATE:19901001T000000
+RDATE:19911006T000000
+RDATE:19921005T000000
+RDATE:19931001T000000
+RDATE:19941001T000000
+RDATE:19951001T000000
+RDATE:19961006T000000
+RDATE:19971005T000000
+RDATE:19981004T000000
+RDATE:19991003T000000
+RDATE:20001001T000000
+RDATE:20011007T000000
+RDATE:20020901T000000
+RDATE:20030907T000000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Atikokan.ics b/libkcal/libical/zoneinfo/America/Atikokan.ics
new file mode 100644
index 00000000..3bb60bd1
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Atikokan.ics
@@ -0,0 +1,51 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Atikokan
+X-LIC-LOCATION:America/Atikokan
+BEGIN:STANDARD
+TZOFFSETFROM:-060628
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:18950101T000000
+RDATE:18950101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19180414T020000
+RDATE:19180414T020000
+RDATE:19400929T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19181031T020000
+RDATE:19181031T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CPT
+DTSTART:19450814T180000
+RDATE:19450814T180000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19450930T020000
+RDATE:19450930T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Bahia.ics b/libkcal/libical/zoneinfo/America/Bahia.ics
new file mode 100644
index 00000000..a9583408
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Bahia.ics
@@ -0,0 +1,92 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Bahia
+X-LIC-LOCATION:America/Bahia
+BEGIN:STANDARD
+TZOFFSETFROM:-023404
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:19140101T000000
+RDATE:19140101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:BRST
+DTSTART:19311003T110000
+RDATE:19311003T110000
+RDATE:19321003T000000
+RDATE:19491201T000000
+RDATE:19501201T000000
+RDATE:19511201T000000
+RDATE:19521201T000000
+RDATE:19631209T000000
+RDATE:19650131T000000
+RDATE:19651201T000000
+RDATE:19661101T000000
+RDATE:19671101T000000
+RDATE:19851102T000000
+RDATE:19861025T000000
+RDATE:19871025T000000
+RDATE:19881016T000000
+RDATE:19891015T000000
+RDATE:19901021T000000
+RDATE:19911020T000000
+RDATE:19921025T000000
+RDATE:19931017T000000
+RDATE:19941016T000000
+RDATE:19951015T000000
+RDATE:19961006T000000
+RDATE:19971006T000000
+RDATE:19981011T000000
+RDATE:19991003T000000
+RDATE:20001008T000000
+RDATE:20011014T000000
+RDATE:20021103T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:19320401T000000
+RDATE:19320401T000000
+RDATE:19330401T000000
+RDATE:19500416T010000
+RDATE:19510401T000000
+RDATE:19520401T000000
+RDATE:19530301T000000
+RDATE:19640301T000000
+RDATE:19650331T000000
+RDATE:19660301T000000
+RDATE:19670301T000000
+RDATE:19680301T000000
+RDATE:19860315T000000
+RDATE:19870214T000000
+RDATE:19880207T000000
+RDATE:19890129T000000
+RDATE:19900211T000000
+RDATE:19910217T000000
+RDATE:19920209T000000
+RDATE:19930131T000000
+RDATE:19940220T000000
+RDATE:19950219T000000
+RDATE:19960211T000000
+RDATE:19970216T000000
+RDATE:19980301T000000
+RDATE:19990221T000000
+RDATE:20000227T000000
+RDATE:20010218T000000
+RDATE:20020217T000000
+RDATE:20030216T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:20030924T000000
+RDATE:20030924T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Barbados.ics b/libkcal/libical/zoneinfo/America/Barbados.ics
new file mode 100644
index 00000000..e28d7fa7
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Barbados.ics
@@ -0,0 +1,42 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Barbados
+X-LIC-LOCATION:America/Barbados
+BEGIN:STANDARD
+TZOFFSETFROM:-035828
+TZOFFSETTO:-035828
+TZNAME:BMT
+DTSTART:19240101T000000
+RDATE:19240101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-035828
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19320101T000000
+RDATE:19320101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ADT
+DTSTART:19770612T020000
+RDATE:19770612T020000
+RDATE:19780416T020000
+RDATE:19790415T020000
+RDATE:19800420T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19771002T020000
+RDATE:19771002T020000
+RDATE:19781001T020000
+RDATE:19790930T020000
+RDATE:19800925T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Belem.ics b/libkcal/libical/zoneinfo/America/Belem.ics
new file mode 100644
index 00000000..5a437224
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Belem.ics
@@ -0,0 +1,62 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Belem
+X-LIC-LOCATION:America/Belem
+BEGIN:STANDARD
+TZOFFSETFROM:-031356
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:19140101T000000
+RDATE:19140101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:BRST
+DTSTART:19311003T110000
+RDATE:19311003T110000
+RDATE:19321003T000000
+RDATE:19491201T000000
+RDATE:19501201T000000
+RDATE:19511201T000000
+RDATE:19521201T000000
+RDATE:19631209T000000
+RDATE:19650131T000000
+RDATE:19651201T000000
+RDATE:19661101T000000
+RDATE:19671101T000000
+RDATE:19851102T000000
+RDATE:19861025T000000
+RDATE:19871025T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:19320401T000000
+RDATE:19320401T000000
+RDATE:19330401T000000
+RDATE:19500416T010000
+RDATE:19510401T000000
+RDATE:19520401T000000
+RDATE:19530301T000000
+RDATE:19640301T000000
+RDATE:19650331T000000
+RDATE:19660301T000000
+RDATE:19670301T000000
+RDATE:19680301T000000
+RDATE:19860315T000000
+RDATE:19870214T000000
+RDATE:19880207T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:19880912T000000
+RDATE:19880912T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Belize.ics b/libkcal/libical/zoneinfo/America/Belize.ics
new file mode 100644
index 00000000..b1b5fef8
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Belize.ics
@@ -0,0 +1,93 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Belize
+X-LIC-LOCATION:America/Belize
+BEGIN:STANDARD
+TZOFFSETFROM:-055248
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19120401T000000
+RDATE:19120401T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0530
+TZNAME:CHDT
+DTSTART:19181006T000000
+RDATE:19181006T000000
+RDATE:19191005T000000
+RDATE:19201003T000000
+RDATE:19211002T000000
+RDATE:19221008T000000
+RDATE:19231007T000000
+RDATE:19241005T000000
+RDATE:19251004T000000
+RDATE:19261003T000000
+RDATE:19271002T000000
+RDATE:19281007T000000
+RDATE:19291006T000000
+RDATE:19301005T000000
+RDATE:19311004T000000
+RDATE:19321002T000000
+RDATE:19331008T000000
+RDATE:19341007T000000
+RDATE:19351006T000000
+RDATE:19361004T000000
+RDATE:19371003T000000
+RDATE:19381002T000000
+RDATE:19391008T000000
+RDATE:19401006T000000
+RDATE:19411005T000000
+RDATE:19421004T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0530
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19190209T000000
+RDATE:19190209T000000
+RDATE:19200215T000000
+RDATE:19210213T000000
+RDATE:19220212T000000
+RDATE:19230211T000000
+RDATE:19240210T000000
+RDATE:19250215T000000
+RDATE:19260214T000000
+RDATE:19270213T000000
+RDATE:19280212T000000
+RDATE:19290210T000000
+RDATE:19300209T000000
+RDATE:19310215T000000
+RDATE:19320214T000000
+RDATE:19330212T000000
+RDATE:19340211T000000
+RDATE:19350210T000000
+RDATE:19360209T000000
+RDATE:19370214T000000
+RDATE:19380213T000000
+RDATE:19390212T000000
+RDATE:19400211T000000
+RDATE:19410209T000000
+RDATE:19420215T000000
+RDATE:19430214T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19731205T000000
+RDATE:19731205T000000
+RDATE:19821218T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19740209T000000
+RDATE:19740209T000000
+RDATE:19830212T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Blanc-Sablon.ics b/libkcal/libical/zoneinfo/America/Blanc-Sablon.ics
new file mode 100644
index 00000000..5d5304f0
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Blanc-Sablon.ics
@@ -0,0 +1,51 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Blanc-Sablon
+X-LIC-LOCATION:America/Blanc-Sablon
+BEGIN:STANDARD
+TZOFFSETFROM:-034828
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:18840101T000000
+RDATE:18840101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ADT
+DTSTART:19180414T020000
+RDATE:19180414T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19181031T020000
+RDATE:19181031T020000
+RDATE:19450930T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:AWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:APT
+DTSTART:19450814T200000
+RDATE:19450814T200000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19700101T000000
+RDATE:19700101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Boa_Vista.ics b/libkcal/libical/zoneinfo/America/Boa_Vista.ics
new file mode 100644
index 00000000..155c5a56
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Boa_Vista.ics
@@ -0,0 +1,67 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Boa_Vista
+X-LIC-LOCATION:America/Boa_Vista
+BEGIN:STANDARD
+TZOFFSETFROM:-040240
+TZOFFSETTO:-0400
+TZNAME:AMT
+DTSTART:19140101T000000
+RDATE:19140101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:AMST
+DTSTART:19311003T110000
+RDATE:19311003T110000
+RDATE:19321003T000000
+RDATE:19491201T000000
+RDATE:19501201T000000
+RDATE:19511201T000000
+RDATE:19521201T000000
+RDATE:19631209T000000
+RDATE:19650131T000000
+RDATE:19651201T000000
+RDATE:19661101T000000
+RDATE:19671101T000000
+RDATE:19851102T000000
+RDATE:19861025T000000
+RDATE:19871025T000000
+RDATE:19991003T000000
+RDATE:20001008T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AMT
+DTSTART:19320401T000000
+RDATE:19320401T000000
+RDATE:19330401T000000
+RDATE:19500416T010000
+RDATE:19510401T000000
+RDATE:19520401T000000
+RDATE:19530301T000000
+RDATE:19640301T000000
+RDATE:19650331T000000
+RDATE:19660301T000000
+RDATE:19670301T000000
+RDATE:19680301T000000
+RDATE:19860315T000000
+RDATE:19870214T000000
+RDATE:19880207T000000
+RDATE:20000227T000000
+RDATE:20001015T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AMT
+DTSTART:19880912T000000
+RDATE:19880912T000000
+RDATE:19990930T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Bogota.ics b/libkcal/libical/zoneinfo/America/Bogota.ics
new file mode 100644
index 00000000..4ce5b467
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Bogota.ics
@@ -0,0 +1,36 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Bogota
+X-LIC-LOCATION:America/Bogota
+BEGIN:STANDARD
+TZOFFSETFROM:-045620
+TZOFFSETTO:-045620
+TZNAME:BMT
+DTSTART:18840313T000000
+RDATE:18840313T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-045620
+TZOFFSETTO:-0500
+TZNAME:COT
+DTSTART:19141123T000000
+RDATE:19141123T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:COST
+DTSTART:19920503T000000
+RDATE:19920503T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:COT
+DTSTART:19930404T000000
+RDATE:19930404T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Boise.ics b/libkcal/libical/zoneinfo/America/Boise.ics
new file mode 100644
index 00000000..1572dfa0
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Boise.ics
@@ -0,0 +1,166 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Boise
+X-LIC-LOCATION:America/Boise
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-074449
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:18831118T121511
+RDATE:18831118T121511
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:PDT
+DTSTART:19180331T020000
+RDATE:19180331T020000
+RDATE:19190330T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19181027T020000
+RDATE:19181027T020000
+RDATE:19191026T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19230513T020000
+RDATE:19230513T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:MPT
+DTSTART:19450814T170000
+RDATE:19450814T170000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19450930T020000
+RDATE:19450930T020000
+RDATE:19671029T020000
+RDATE:19681027T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:19670430T020000
+RDATE:19670430T020000
+RDATE:19680428T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19740203T020000
+RDATE:19750223T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19740101T000000
+RDATE:19740101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Cambridge_Bay.ics b/libkcal/libical/zoneinfo/America/Cambridge_Bay.ics
new file mode 100644
index 00000000..63ac1725
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Cambridge_Bay.ics
@@ -0,0 +1,155 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Cambridge_Bay
+X-LIC-LOCATION:America/Cambridge_Bay
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19200101T000000
+RDATE:19200101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:MPT
+DTSTART:19450814T170000
+RDATE:19450814T170000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19450930T020000
+RDATE:19450930T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0500
+TZNAME:MDDT
+DTSTART:19650425T000000
+RDATE:19650425T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19651031T020000
+RDATE:19651031T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:19800427T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19991031T020000
+RDATE:19991031T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:20000402T020000
+RDATE:20000402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:20001029T020000
+RDATE:20001029T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:20001105T000000
+RDATE:20001105T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:20010401T020000
+RDATE:20010401T020000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Campo_Grande.ics b/libkcal/libical/zoneinfo/America/Campo_Grande.ics
new file mode 100644
index 00000000..cdc28226
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Campo_Grande.ics
@@ -0,0 +1,107 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Campo_Grande
+X-LIC-LOCATION:America/Campo_Grande
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:AMST
+DTSTART:20071014T000000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AMT
+DTSTART:20080217T000000
+RRULE:FREQ=YEARLY;BYMONTH=2;BYDAY=3SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-033828
+TZOFFSETTO:-0400
+TZNAME:AMT
+DTSTART:19140101T000000
+RDATE:19140101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:AMST
+DTSTART:19311003T110000
+RDATE:19311003T110000
+RDATE:19321003T000000
+RDATE:19491201T000000
+RDATE:19501201T000000
+RDATE:19511201T000000
+RDATE:19521201T000000
+RDATE:19631209T000000
+RDATE:19650131T000000
+RDATE:19651201T000000
+RDATE:19661101T000000
+RDATE:19671101T000000
+RDATE:19851102T000000
+RDATE:19861025T000000
+RDATE:19871025T000000
+RDATE:19881016T000000
+RDATE:19891015T000000
+RDATE:19901021T000000
+RDATE:19911020T000000
+RDATE:19921025T000000
+RDATE:19931017T000000
+RDATE:19941016T000000
+RDATE:19951015T000000
+RDATE:19961006T000000
+RDATE:19971006T000000
+RDATE:19981011T000000
+RDATE:19991003T000000
+RDATE:20001008T000000
+RDATE:20011014T000000
+RDATE:20021103T000000
+RDATE:20031019T000000
+RDATE:20041102T000000
+RDATE:20051016T000000
+RDATE:20061105T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AMT
+DTSTART:19320401T000000
+RDATE:19320401T000000
+RDATE:19330401T000000
+RDATE:19500416T010000
+RDATE:19510401T000000
+RDATE:19520401T000000
+RDATE:19530301T000000
+RDATE:19640301T000000
+RDATE:19650331T000000
+RDATE:19660301T000000
+RDATE:19670301T000000
+RDATE:19680301T000000
+RDATE:19860315T000000
+RDATE:19870214T000000
+RDATE:19880207T000000
+RDATE:19890129T000000
+RDATE:19900211T000000
+RDATE:19910217T000000
+RDATE:19920209T000000
+RDATE:19930131T000000
+RDATE:19940220T000000
+RDATE:19950219T000000
+RDATE:19960211T000000
+RDATE:19970216T000000
+RDATE:19980301T000000
+RDATE:19990221T000000
+RDATE:20000227T000000
+RDATE:20010218T000000
+RDATE:20020217T000000
+RDATE:20030216T000000
+RDATE:20040215T000000
+RDATE:20050220T000000
+RDATE:20060219T000000
+RDATE:20070225T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Cancun.ics b/libkcal/libical/zoneinfo/America/Cancun.ics
new file mode 100644
index 00000000..841c7b31
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Cancun.ics
@@ -0,0 +1,79 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Cancun
+X-LIC-LOCATION:America/Cancun
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:20020407T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:20021027T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-054704
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19220101T001256
+RDATE:19220101T001256
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19811223T000000
+RDATE:19811223T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19960407T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19961027T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19980802T020000
+RDATE:19980802T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19981025T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20010930T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19990404T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010506T020000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Caracas.ics b/libkcal/libical/zoneinfo/America/Caracas.ics
new file mode 100644
index 00000000..0cb8bbd8
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Caracas.ics
@@ -0,0 +1,36 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Caracas
+X-LIC-LOCATION:America/Caracas
+BEGIN:STANDARD
+TZOFFSETFROM:-042744
+TZOFFSETTO:-042740
+TZNAME:CMT
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-042740
+TZOFFSETTO:-0430
+TZNAME:VET
+DTSTART:19120212T000000
+RDATE:19120212T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0430
+TZOFFSETTO:-0400
+TZNAME:VET
+DTSTART:19650101T000000
+RDATE:19650101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0430
+TZNAME:VET
+DTSTART:20071209T030000
+RDATE:20071209T030000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Cayenne.ics b/libkcal/libical/zoneinfo/America/Cayenne.ics
new file mode 100644
index 00000000..1f800ffb
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Cayenne.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Cayenne
+X-LIC-LOCATION:America/Cayenne
+BEGIN:STANDARD
+TZOFFSETFROM:-032920
+TZOFFSETTO:-0400
+TZNAME:GFT
+DTSTART:19110701T000000
+RDATE:19110701T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:GFT
+DTSTART:19671001T000000
+RDATE:19671001T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Cayman.ics b/libkcal/libical/zoneinfo/America/Cayman.ics
new file mode 100644
index 00000000..8509d674
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Cayman.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Cayman
+X-LIC-LOCATION:America/Cayman
+BEGIN:STANDARD
+TZOFFSETFROM:-052532
+TZOFFSETTO:-050712
+TZNAME:KMT
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-050712
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19120201T000000
+RDATE:19120201T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Chicago.ics b/libkcal/libical/zoneinfo/America/Chicago.ics
new file mode 100644
index 00000000..3de82b36
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Chicago.ics
@@ -0,0 +1,242 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Chicago
+X-LIC-LOCATION:America/Chicago
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-055036
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:18831118T120924
+RDATE:18831118T120924
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19180331T020000
+RDATE:19180331T020000
+RDATE:19190330T020000
+RDATE:19200613T020000
+RDATE:19210327T020000
+RDATE:19220430T020000
+RDATE:19230429T020000
+RDATE:19240427T020000
+RDATE:19250426T020000
+RDATE:19260425T020000
+RDATE:19270424T020000
+RDATE:19280429T020000
+RDATE:19290428T020000
+RDATE:19300427T020000
+RDATE:19310426T020000
+RDATE:19320424T020000
+RDATE:19330430T020000
+RDATE:19340429T020000
+RDATE:19350428T020000
+RDATE:19370425T020000
+RDATE:19380424T020000
+RDATE:19390430T020000
+RDATE:19400428T020000
+RDATE:19410427T020000
+RDATE:19460428T020000
+RDATE:19470427T020000
+RDATE:19480425T020000
+RDATE:19490424T020000
+RDATE:19500430T020000
+RDATE:19510429T020000
+RDATE:19520427T020000
+RDATE:19530426T020000
+RDATE:19540425T020000
+RDATE:19550424T020000
+RDATE:19560429T020000
+RDATE:19570428T020000
+RDATE:19580427T020000
+RDATE:19590426T020000
+RDATE:19600424T020000
+RDATE:19610430T020000
+RDATE:19620429T020000
+RDATE:19630428T020000
+RDATE:19640426T020000
+RDATE:19650425T020000
+RDATE:19660424T020000
+RDATE:19670430T020000
+RDATE:19680428T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19740106T020000
+RDATE:19750223T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19181027T020000
+RDATE:19181027T020000
+RDATE:19191026T020000
+RDATE:19201031T020000
+RDATE:19211030T020000
+RDATE:19220924T020000
+RDATE:19230930T020000
+RDATE:19240928T020000
+RDATE:19250927T020000
+RDATE:19260926T020000
+RDATE:19270925T020000
+RDATE:19280930T020000
+RDATE:19290929T020000
+RDATE:19300928T020000
+RDATE:19310927T020000
+RDATE:19320925T020000
+RDATE:19330924T020000
+RDATE:19340930T020000
+RDATE:19350929T020000
+RDATE:19361115T020000
+RDATE:19370926T020000
+RDATE:19380925T020000
+RDATE:19390924T020000
+RDATE:19400929T020000
+RDATE:19410928T020000
+RDATE:19450930T020000
+RDATE:19460929T020000
+RDATE:19470928T020000
+RDATE:19480926T020000
+RDATE:19490925T020000
+RDATE:19500924T020000
+RDATE:19510930T020000
+RDATE:19520928T020000
+RDATE:19530927T020000
+RDATE:19540926T020000
+RDATE:19551030T020000
+RDATE:19561028T020000
+RDATE:19571027T020000
+RDATE:19581026T020000
+RDATE:19591025T020000
+RDATE:19601030T020000
+RDATE:19611029T020000
+RDATE:19621028T020000
+RDATE:19631027T020000
+RDATE:19641025T020000
+RDATE:19651031T020000
+RDATE:19661030T020000
+RDATE:19671029T020000
+RDATE:19681027T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19200101T000000
+RDATE:19200101T000000
+RDATE:19420101T000000
+RDATE:19460101T000000
+RDATE:19670101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19360301T020000
+RDATE:19360301T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CPT
+DTSTART:19450814T180000
+RDATE:19450814T180000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Chihuahua.ics b/libkcal/libical/zoneinfo/America/Chihuahua.ics
new file mode 100644
index 00000000..97fbedcc
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Chihuahua.ics
@@ -0,0 +1,90 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Chihuahua
+X-LIC-LOCATION:America/Chihuahua
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:20020407T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:20021027T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-070420
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19211231T235540
+RDATE:19211231T235540
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19270610T230000
+RDATE:19270610T230000
+RDATE:19310501T230000
+RDATE:19320401T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19301115T000000
+RDATE:19301115T000000
+RDATE:19311001T000000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20010930T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19960101T000000
+RDATE:19960101T000000
+RDATE:19980101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19960407T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19961027T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:19980405T020000
+RDATE:19980405T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:19990404T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010506T020000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Costa_Rica.ics b/libkcal/libical/zoneinfo/America/Costa_Rica.ics
new file mode 100644
index 00000000..7c667f6a
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Costa_Rica.ics
@@ -0,0 +1,42 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Costa_Rica
+X-LIC-LOCATION:America/Costa_Rica
+BEGIN:STANDARD
+TZOFFSETFROM:-053620
+TZOFFSETTO:-053620
+TZNAME:SJMT
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-053620
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19210115T000000
+RDATE:19210115T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19790225T000000
+RDATE:19790225T000000
+RDATE:19800224T000000
+RDATE:19910119T000000
+RDATE:19920118T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19790603T000000
+RDATE:19790603T000000
+RDATE:19800601T000000
+RDATE:19910701T000000
+RDATE:19920315T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Cuiaba.ics b/libkcal/libical/zoneinfo/America/Cuiaba.ics
new file mode 100644
index 00000000..58583970
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Cuiaba.ics
@@ -0,0 +1,113 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Cuiaba
+X-LIC-LOCATION:America/Cuiaba
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:AMST
+DTSTART:20071014T000000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AMT
+DTSTART:20080217T000000
+RRULE:FREQ=YEARLY;BYMONTH=2;BYDAY=3SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-034420
+TZOFFSETTO:-0400
+TZNAME:AMT
+DTSTART:19140101T000000
+RDATE:19140101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:AMST
+DTSTART:19311003T110000
+RDATE:19311003T110000
+RDATE:19321003T000000
+RDATE:19491201T000000
+RDATE:19501201T000000
+RDATE:19511201T000000
+RDATE:19521201T000000
+RDATE:19631209T000000
+RDATE:19650131T000000
+RDATE:19651201T000000
+RDATE:19661101T000000
+RDATE:19671101T000000
+RDATE:19851102T000000
+RDATE:19861025T000000
+RDATE:19871025T000000
+RDATE:19881016T000000
+RDATE:19891015T000000
+RDATE:19901021T000000
+RDATE:19911020T000000
+RDATE:19921025T000000
+RDATE:19931017T000000
+RDATE:19941016T000000
+RDATE:19951015T000000
+RDATE:19961006T000000
+RDATE:19971006T000000
+RDATE:19981011T000000
+RDATE:19991003T000000
+RDATE:20001008T000000
+RDATE:20011014T000000
+RDATE:20021103T000000
+RDATE:20041102T000000
+RDATE:20051016T000000
+RDATE:20061105T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AMT
+DTSTART:19320401T000000
+RDATE:19320401T000000
+RDATE:19330401T000000
+RDATE:19500416T010000
+RDATE:19510401T000000
+RDATE:19520401T000000
+RDATE:19530301T000000
+RDATE:19640301T000000
+RDATE:19650331T000000
+RDATE:19660301T000000
+RDATE:19670301T000000
+RDATE:19680301T000000
+RDATE:19860315T000000
+RDATE:19870214T000000
+RDATE:19880207T000000
+RDATE:19890129T000000
+RDATE:19900211T000000
+RDATE:19910217T000000
+RDATE:19920209T000000
+RDATE:19930131T000000
+RDATE:19940220T000000
+RDATE:19950219T000000
+RDATE:19960211T000000
+RDATE:19970216T000000
+RDATE:19980301T000000
+RDATE:19990221T000000
+RDATE:20000227T000000
+RDATE:20010218T000000
+RDATE:20020217T000000
+RDATE:20030216T000000
+RDATE:20050220T000000
+RDATE:20060219T000000
+RDATE:20070225T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AMT
+DTSTART:20030924T000000
+RDATE:20030924T000000
+RDATE:20041001T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Curacao.ics b/libkcal/libical/zoneinfo/America/Curacao.ics
new file mode 100644
index 00000000..2bf9aa06
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Curacao.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Curacao
+X-LIC-LOCATION:America/Curacao
+BEGIN:STANDARD
+TZOFFSETFROM:-043544
+TZOFFSETTO:-0430
+TZNAME:ANT
+DTSTART:19120212T000000
+RDATE:19120212T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0430
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19650101T000000
+RDATE:19650101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Danmarkshavn.ics b/libkcal/libical/zoneinfo/America/Danmarkshavn.ics
new file mode 100644
index 00000000..cf26fd4a
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Danmarkshavn.ics
@@ -0,0 +1,66 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Danmarkshavn
+X-LIC-LOCATION:America/Danmarkshavn
+BEGIN:STANDARD
+TZOFFSETFROM:-011440
+TZOFFSETTO:-0300
+TZNAME:WGT
+DTSTART:19160728T000000
+RDATE:19160728T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:WGST
+DTSTART:19800406T020000
+RDATE:19800406T020000
+RDATE:19810328T220000
+RDATE:19820327T220000
+RDATE:19830326T220000
+RDATE:19840324T220000
+RDATE:19850330T220000
+RDATE:19860329T220000
+RDATE:19870328T220000
+RDATE:19880326T220000
+RDATE:19890325T220000
+RDATE:19900324T220000
+RDATE:19910330T220000
+RDATE:19920328T220000
+RDATE:19930327T220000
+RDATE:19940326T220000
+RDATE:19950325T220000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:WGT
+DTSTART:19800927T230000
+RDATE:19800927T230000
+RDATE:19810926T230000
+RDATE:19820925T230000
+RDATE:19830924T230000
+RDATE:19840929T230000
+RDATE:19850928T230000
+RDATE:19860927T230000
+RDATE:19870926T230000
+RDATE:19880924T230000
+RDATE:19890923T230000
+RDATE:19900929T230000
+RDATE:19910928T230000
+RDATE:19920926T230000
+RDATE:19930925T230000
+RDATE:19940924T230000
+RDATE:19950923T230000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19960101T000000
+RDATE:19960101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Dawson.ics b/libkcal/libical/zoneinfo/America/Dawson.ics
new file mode 100644
index 00000000..8ab18cd3
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Dawson.ics
@@ -0,0 +1,153 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Dawson
+X-LIC-LOCATION:America/Dawson
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:PDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-091740
+TZOFFSETTO:-0900
+TZNAME:YST
+DTSTART:19000820T000000
+RDATE:19000820T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0800
+TZNAME:YDT
+DTSTART:19180414T020000
+RDATE:19180414T020000
+RDATE:19190525T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0900
+TZNAME:YST
+DTSTART:19181027T020000
+RDATE:19181027T020000
+RDATE:19191101T000000
+RDATE:19450930T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0800
+TZNAME:YWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0800
+TZNAME:YPT
+DTSTART:19450814T150000
+RDATE:19450814T150000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0700
+TZNAME:YDDT
+DTSTART:19650425T000000
+RDATE:19650425T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0900
+TZNAME:YST
+DTSTART:19651031T020000
+RDATE:19651031T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0800
+DTSTART:19731028T000000
+RDATE:19731028T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19800101T000000
+RDATE:19800101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:PDT
+DTSTART:19800427T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19801026T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Dawson_Creek.ics b/libkcal/libical/zoneinfo/America/Dawson_Creek.ics
new file mode 100644
index 00000000..9b27cc19
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Dawson_Creek.ics
@@ -0,0 +1,109 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Dawson_Creek
+X-LIC-LOCATION:America/Dawson_Creek
+BEGIN:STANDARD
+TZOFFSETFROM:-080056
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:18840101T000000
+RDATE:18840101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:PDT
+DTSTART:19180414T020000
+RDATE:19180414T020000
+RDATE:19470427T020000
+RDATE:19480425T020000
+RDATE:19490424T020000
+RDATE:19500430T020000
+RDATE:19510429T020000
+RDATE:19520427T020000
+RDATE:19530426T020000
+RDATE:19540425T020000
+RDATE:19550424T020000
+RDATE:19560429T020000
+RDATE:19570428T020000
+RDATE:19580427T020000
+RDATE:19590426T020000
+RDATE:19600424T020000
+RDATE:19610430T020000
+RDATE:19620429T020000
+RDATE:19630428T020000
+RDATE:19640426T020000
+RDATE:19650425T020000
+RDATE:19660424T020000
+RDATE:19670430T020000
+RDATE:19680428T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19181031T020000
+RDATE:19181031T020000
+RDATE:19450930T020000
+RDATE:19470928T020000
+RDATE:19480926T020000
+RDATE:19490925T020000
+RDATE:19500924T020000
+RDATE:19510930T020000
+RDATE:19520928T020000
+RDATE:19530927T020000
+RDATE:19540926T020000
+RDATE:19550925T020000
+RDATE:19560930T020000
+RDATE:19570929T020000
+RDATE:19580928T020000
+RDATE:19590927T020000
+RDATE:19600925T020000
+RDATE:19610924T020000
+RDATE:19621028T020000
+RDATE:19631027T020000
+RDATE:19641025T020000
+RDATE:19651031T020000
+RDATE:19661030T020000
+RDATE:19671029T020000
+RDATE:19681027T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:PWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0700
+TZNAME:PPT
+DTSTART:19450814T160000
+RDATE:19450814T160000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19470101T000000
+RDATE:19470101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19720830T020000
+RDATE:19720830T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Denver.ics b/libkcal/libical/zoneinfo/America/Denver.ics
new file mode 100644
index 00000000..0dfeb68e
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Denver.ics
@@ -0,0 +1,158 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Denver
+X-LIC-LOCATION:America/Denver
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-065956
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:18831118T120004
+RDATE:18831118T120004
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:19180331T020000
+RDATE:19180331T020000
+RDATE:19190330T020000
+RDATE:19200328T020000
+RDATE:19210327T020000
+RDATE:19650425T020000
+RDATE:19660424T020000
+RDATE:19670430T020000
+RDATE:19680428T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19740106T020000
+RDATE:19750223T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19181027T020000
+RDATE:19181027T020000
+RDATE:19191026T020000
+RDATE:19201031T020000
+RDATE:19210522T020000
+RDATE:19450930T020000
+RDATE:19651031T020000
+RDATE:19661030T020000
+RDATE:19671029T020000
+RDATE:19681027T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19200101T000000
+RDATE:19200101T000000
+RDATE:19420101T000000
+RDATE:19460101T000000
+RDATE:19670101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:MPT
+DTSTART:19450814T170000
+RDATE:19450814T170000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Detroit.ics b/libkcal/libical/zoneinfo/America/Detroit.ics
new file mode 100644
index 00000000..0930f31e
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Detroit.ics
@@ -0,0 +1,145 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Detroit
+X-LIC-LOCATION:America/Detroit
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-053211
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19050101T000000
+RDATE:19050101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19150515T020000
+RDATE:19150515T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19420101T000000
+RDATE:19420101T000000
+RDATE:19460101T000000
+RDATE:19730101T000000
+RDATE:19750101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:EPT
+DTSTART:19450814T190000
+RDATE:19450814T190000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19450930T020000
+RDATE:19450930T020000
+RDATE:19480926T020000
+RDATE:19671029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19480425T020000
+RDATE:19480425T020000
+RDATE:19670614T020000
+RDATE:19730429T020000
+RDATE:19740106T020000
+RDATE:19750427T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Dominica.ics b/libkcal/libical/zoneinfo/America/Dominica.ics
new file mode 100644
index 00000000..bb08df29
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Dominica.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Dominica
+X-LIC-LOCATION:America/Dominica
+BEGIN:STANDARD
+TZOFFSETFROM:-040536
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19110701T000100
+RDATE:19110701T000100
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Edmonton.ics b/libkcal/libical/zoneinfo/America/Edmonton.ics
new file mode 100644
index 00000000..5ed27cd4
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Edmonton.ics
@@ -0,0 +1,151 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Edmonton
+X-LIC-LOCATION:America/Edmonton
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-073352
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19060901T000000
+RDATE:19060901T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:19180414T020000
+RDATE:19180414T020000
+RDATE:19190413T020000
+RDATE:19200425T020000
+RDATE:19210424T020000
+RDATE:19220430T020000
+RDATE:19230429T020000
+RDATE:19470427T020000
+RDATE:19670430T020000
+RDATE:19690427T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19740428T020000
+RDATE:19750427T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19181031T020000
+RDATE:19181031T020000
+RDATE:19190527T020000
+RDATE:19201031T020000
+RDATE:19210925T020000
+RDATE:19220924T020000
+RDATE:19230930T020000
+RDATE:19450930T020000
+RDATE:19470928T020000
+RDATE:19671029T020000
+RDATE:19691026T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:MPT
+DTSTART:19450814T170000
+RDATE:19450814T170000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19870101T000000
+RDATE:19870101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Eirunepe.ics b/libkcal/libical/zoneinfo/America/Eirunepe.ics
new file mode 100644
index 00000000..6cdfe44b
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Eirunepe.ics
@@ -0,0 +1,66 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Eirunepe
+X-LIC-LOCATION:America/Eirunepe
+BEGIN:STANDARD
+TZOFFSETFROM:-043928
+TZOFFSETTO:-0500
+TZNAME:ACT
+DTSTART:19140101T000000
+RDATE:19140101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:ACST
+DTSTART:19311003T110000
+RDATE:19311003T110000
+RDATE:19321003T000000
+RDATE:19491201T000000
+RDATE:19501201T000000
+RDATE:19511201T000000
+RDATE:19521201T000000
+RDATE:19631209T000000
+RDATE:19650131T000000
+RDATE:19651201T000000
+RDATE:19661101T000000
+RDATE:19671101T000000
+RDATE:19851102T000000
+RDATE:19861025T000000
+RDATE:19871025T000000
+RDATE:19931017T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:ACT
+DTSTART:19320401T000000
+RDATE:19320401T000000
+RDATE:19330401T000000
+RDATE:19500416T010000
+RDATE:19510401T000000
+RDATE:19520401T000000
+RDATE:19530301T000000
+RDATE:19640301T000000
+RDATE:19650331T000000
+RDATE:19660301T000000
+RDATE:19670301T000000
+RDATE:19680301T000000
+RDATE:19860315T000000
+RDATE:19870214T000000
+RDATE:19880207T000000
+RDATE:19940220T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:ACT
+DTSTART:19880912T000000
+RDATE:19880912T000000
+RDATE:19930928T000000
+RDATE:19940922T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/El_Salvador.ics b/libkcal/libical/zoneinfo/America/El_Salvador.ics
new file mode 100644
index 00000000..ed412780
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/El_Salvador.ics
@@ -0,0 +1,31 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/El_Salvador
+X-LIC-LOCATION:America/El_Salvador
+BEGIN:STANDARD
+TZOFFSETFROM:-055648
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19210101T000000
+RDATE:19210101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19870503T000000
+RDATE:19870503T000000
+RDATE:19880501T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19870927T000000
+RDATE:19870927T000000
+RDATE:19880925T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Fortaleza.ics b/libkcal/libical/zoneinfo/America/Fortaleza.ics
new file mode 100644
index 00000000..a72a627b
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Fortaleza.ics
@@ -0,0 +1,75 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Fortaleza
+X-LIC-LOCATION:America/Fortaleza
+BEGIN:STANDARD
+TZOFFSETFROM:-0234
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:19140101T000000
+RDATE:19140101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:BRST
+DTSTART:19311003T110000
+RDATE:19311003T110000
+RDATE:19321003T000000
+RDATE:19491201T000000
+RDATE:19501201T000000
+RDATE:19511201T000000
+RDATE:19521201T000000
+RDATE:19631209T000000
+RDATE:19650131T000000
+RDATE:19651201T000000
+RDATE:19661101T000000
+RDATE:19671101T000000
+RDATE:19851102T000000
+RDATE:19861025T000000
+RDATE:19871025T000000
+RDATE:19881016T000000
+RDATE:19891015T000000
+RDATE:19991003T000000
+RDATE:20001008T000000
+RDATE:20011014T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:19320401T000000
+RDATE:19320401T000000
+RDATE:19330401T000000
+RDATE:19500416T010000
+RDATE:19510401T000000
+RDATE:19520401T000000
+RDATE:19530301T000000
+RDATE:19640301T000000
+RDATE:19650331T000000
+RDATE:19660301T000000
+RDATE:19670301T000000
+RDATE:19680301T000000
+RDATE:19860315T000000
+RDATE:19870214T000000
+RDATE:19880207T000000
+RDATE:19890129T000000
+RDATE:19900211T000000
+RDATE:20000227T000000
+RDATE:20001022T000000
+RDATE:20020217T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:19900917T000000
+RDATE:19900917T000000
+RDATE:19990930T000000
+RDATE:20010913T000000
+RDATE:20021001T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Glace_Bay.ics b/libkcal/libical/zoneinfo/America/Glace_Bay.ics
new file mode 100644
index 00000000..5c025d90
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Glace_Bay.ics
@@ -0,0 +1,140 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Glace_Bay
+X-LIC-LOCATION:America/Glace_Bay
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ADT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-035948
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19020615T000000
+RDATE:19020615T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ADT
+DTSTART:19180414T020000
+RDATE:19180414T020000
+RDATE:19530426T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19740428T020000
+RDATE:19750427T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19181031T020000
+RDATE:19181031T020000
+RDATE:19450930T020000
+RDATE:19530927T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:AWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:APT
+DTSTART:19450814T200000
+RDATE:19450814T200000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19530101T000000
+RDATE:19530101T000000
+RDATE:19540101T000000
+RDATE:19720101T000000
+RDATE:19740101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Godthab.ics b/libkcal/libical/zoneinfo/America/Godthab.ics
new file mode 100644
index 00000000..9e562d22
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Godthab.ics
@@ -0,0 +1,58 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Godthab
+X-LIC-LOCATION:America/Godthab
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:WGST
+DTSTART:19810328T220000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYMONTHDAY=24,25,26,27,28,29,30;BYDAY=SA
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:WGT
+DTSTART:19961026T230000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYMONTHDAY=24,25,26,27,28,29,30;BYDAY=SA
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-032656
+TZOFFSETTO:-0300
+TZNAME:WGT
+DTSTART:19160728T000000
+RDATE:19160728T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:WGST
+DTSTART:19800406T020000
+RDATE:19800406T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:WGT
+DTSTART:19800927T230000
+RDATE:19800927T230000
+RDATE:19810926T230000
+RDATE:19820925T230000
+RDATE:19830924T230000
+RDATE:19840929T230000
+RDATE:19850928T230000
+RDATE:19860927T230000
+RDATE:19870926T230000
+RDATE:19880924T230000
+RDATE:19890923T230000
+RDATE:19900929T230000
+RDATE:19910928T230000
+RDATE:19920926T230000
+RDATE:19930925T230000
+RDATE:19940924T230000
+RDATE:19950923T230000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Goose_Bay.ics b/libkcal/libical/zoneinfo/America/Goose_Bay.ics
new file mode 100644
index 00000000..fde693a2
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Goose_Bay.ics
@@ -0,0 +1,258 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Goose_Bay
+X-LIC-LOCATION:America/Goose_Bay
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ADT
+DTSTART:20070311T000100
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:20071104T000100
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-040140
+TZOFFSETTO:-033052
+TZNAME:NST
+DTSTART:18840101T000000
+RDATE:18840101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-033052
+TZOFFSETTO:-033052
+TZNAME:NST
+DTSTART:19180101T000000
+RDATE:19180101T000000
+RDATE:19190101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-033052
+TZOFFSETTO:-023052
+TZNAME:NDT
+DTSTART:19180414T020000
+RDATE:19180414T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-023052
+TZOFFSETTO:-033052
+TZNAME:NST
+DTSTART:19181031T020000
+RDATE:19181031T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-033052
+TZOFFSETTO:-0330
+TZNAME:NST
+DTSTART:19350330T000000
+RDATE:19350330T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0330
+TZOFFSETTO:-0330
+TZNAME:NST
+DTSTART:19360101T000000
+RDATE:19360101T000000
+RDATE:19460101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0330
+TZOFFSETTO:-0230
+TZNAME:NDT
+DTSTART:19360511T000000
+RDATE:19360511T000000
+RDATE:19370510T000000
+RDATE:19380509T000000
+RDATE:19390515T000000
+RDATE:19400513T000000
+RDATE:19410512T000000
+RDATE:19460512T020000
+RDATE:19470511T020000
+RDATE:19480509T020000
+RDATE:19490508T020000
+RDATE:19500514T020000
+RDATE:19510429T020000
+RDATE:19520427T020000
+RDATE:19530426T020000
+RDATE:19540425T020000
+RDATE:19550424T020000
+RDATE:19560429T020000
+RDATE:19570428T020000
+RDATE:19580427T020000
+RDATE:19590426T020000
+RDATE:19600424T020000
+RDATE:19610430T020000
+RDATE:19620429T020000
+RDATE:19630428T020000
+RDATE:19640426T020000
+RDATE:19650425T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0230
+TZOFFSETTO:-0330
+TZNAME:NST
+DTSTART:19361005T000000
+RDATE:19361005T000000
+RDATE:19371004T000000
+RDATE:19381003T000000
+RDATE:19391002T000000
+RDATE:19401007T000000
+RDATE:19411006T000000
+RDATE:19450930T020000
+RDATE:19461006T020000
+RDATE:19471005T020000
+RDATE:19481003T020000
+RDATE:19491002T020000
+RDATE:19501008T020000
+RDATE:19510930T020000
+RDATE:19520928T020000
+RDATE:19530927T020000
+RDATE:19540926T020000
+RDATE:19550925T020000
+RDATE:19560930T020000
+RDATE:19570929T020000
+RDATE:19580928T020000
+RDATE:19590927T020000
+RDATE:19601030T020000
+RDATE:19611029T020000
+RDATE:19621028T020000
+RDATE:19631027T020000
+RDATE:19641025T020000
+RDATE:19651031T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0330
+TZOFFSETTO:-0230
+TZNAME:NWT
+DTSTART:19420511T000000
+RDATE:19420511T000000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0230
+TZOFFSETTO:-0230
+TZNAME:NPT
+DTSTART:19450814T203000
+RDATE:19450814T203000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0330
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19660315T020000
+RDATE:19660315T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ADT
+DTSTART:19660424T020000
+RDATE:19660424T020000
+RDATE:19670430T020000
+RDATE:19680428T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19740428T020000
+RDATE:19750427T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T000100
+RDATE:19890402T000100
+RDATE:19900401T000100
+RDATE:19910407T000100
+RDATE:19920405T000100
+RDATE:19930404T000100
+RDATE:19940403T000100
+RDATE:19950402T000100
+RDATE:19960407T000100
+RDATE:19970406T000100
+RDATE:19980405T000100
+RDATE:19990404T000100
+RDATE:20000402T000100
+RDATE:20010401T000100
+RDATE:20020407T000100
+RDATE:20030406T000100
+RDATE:20040404T000100
+RDATE:20050403T000100
+RDATE:20060402T000100
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19661030T020000
+RDATE:19661030T020000
+RDATE:19671029T020000
+RDATE:19681027T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T000100
+RDATE:19891029T000100
+RDATE:19901028T000100
+RDATE:19911027T000100
+RDATE:19921025T000100
+RDATE:19931031T000100
+RDATE:19941030T000100
+RDATE:19951029T000100
+RDATE:19961027T000100
+RDATE:19971026T000100
+RDATE:19981025T000100
+RDATE:19991031T000100
+RDATE:20001029T000100
+RDATE:20011028T000100
+RDATE:20021027T000100
+RDATE:20031026T000100
+RDATE:20041031T000100
+RDATE:20051030T000100
+RDATE:20061029T000100
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0200
+TZNAME:ADDT
+DTSTART:19880403T000100
+RDATE:19880403T000100
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19881030T000100
+RDATE:19881030T000100
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Grand_Turk.ics b/libkcal/libical/zoneinfo/America/Grand_Turk.ics
new file mode 100644
index 00000000..d36e4eaf
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Grand_Turk.ics
@@ -0,0 +1,104 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Grand_Turk
+X-LIC-LOCATION:America/Grand_Turk
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-044432
+TZOFFSETTO:-050712
+TZNAME:KMT
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-050712
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19120201T000000
+RDATE:19120201T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19790429T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19791028T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Grenada.ics b/libkcal/libical/zoneinfo/America/Grenada.ics
new file mode 100644
index 00000000..da3fefcc
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Grenada.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Grenada
+X-LIC-LOCATION:America/Grenada
+BEGIN:STANDARD
+TZOFFSETFROM:-0407
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19110701T000000
+RDATE:19110701T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Guadeloupe.ics b/libkcal/libical/zoneinfo/America/Guadeloupe.ics
new file mode 100644
index 00000000..a5dc937f
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Guadeloupe.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Guadeloupe
+X-LIC-LOCATION:America/Guadeloupe
+BEGIN:STANDARD
+TZOFFSETFROM:-040608
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19110608T000000
+RDATE:19110608T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Guatemala.ics b/libkcal/libical/zoneinfo/America/Guatemala.ics
new file mode 100644
index 00000000..2357724b
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Guatemala.ics
@@ -0,0 +1,35 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Guatemala
+X-LIC-LOCATION:America/Guatemala
+BEGIN:STANDARD
+TZOFFSETFROM:-060204
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19181005T000000
+RDATE:19181005T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19731125T000000
+RDATE:19731125T000000
+RDATE:19830521T000000
+RDATE:19910323T000000
+RDATE:20060430T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19740224T000000
+RDATE:19740224T000000
+RDATE:19830922T000000
+RDATE:19910907T000000
+RDATE:20061001T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Guayaquil.ics b/libkcal/libical/zoneinfo/America/Guayaquil.ics
new file mode 100644
index 00000000..621b18f6
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Guayaquil.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Guayaquil
+X-LIC-LOCATION:America/Guayaquil
+BEGIN:STANDARD
+TZOFFSETFROM:-051920
+TZOFFSETTO:-0514
+TZNAME:QMT
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0514
+TZOFFSETTO:-0500
+TZNAME:ECT
+DTSTART:19310101T000000
+RDATE:19310101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Guyana.ics b/libkcal/libical/zoneinfo/America/Guyana.ics
new file mode 100644
index 00000000..4177e407
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Guyana.ics
@@ -0,0 +1,36 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Guyana
+X-LIC-LOCATION:America/Guyana
+BEGIN:STANDARD
+TZOFFSETFROM:-035240
+TZOFFSETTO:-0345
+TZNAME:GBGT
+DTSTART:19150301T000000
+RDATE:19150301T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0345
+TZOFFSETTO:-0345
+TZNAME:GYT
+DTSTART:19660526T000000
+RDATE:19660526T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0345
+TZOFFSETTO:-0300
+TZNAME:GYT
+DTSTART:19750731T000000
+RDATE:19750731T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:GYT
+DTSTART:19910101T000000
+RDATE:19910101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Halifax.ics b/libkcal/libical/zoneinfo/America/Halifax.ics
new file mode 100644
index 00000000..cff8c41f
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Halifax.ics
@@ -0,0 +1,228 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Halifax
+X-LIC-LOCATION:America/Halifax
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ADT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-041424
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19020615T000000
+RDATE:19020615T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ADT
+DTSTART:19160401T000000
+RDATE:19160401T000000
+RDATE:19180414T020000
+RDATE:19200509T000000
+RDATE:19210506T000000
+RDATE:19220430T000000
+RDATE:19230506T000000
+RDATE:19240504T000000
+RDATE:19250503T000000
+RDATE:19260516T000000
+RDATE:19270501T000000
+RDATE:19280513T000000
+RDATE:19290512T000000
+RDATE:19300511T000000
+RDATE:19310510T000000
+RDATE:19320501T000000
+RDATE:19330430T000000
+RDATE:19340520T000000
+RDATE:19350602T000000
+RDATE:19360601T000000
+RDATE:19370502T000000
+RDATE:19380501T000000
+RDATE:19390528T000000
+RDATE:19400505T000000
+RDATE:19410504T000000
+RDATE:19460428T020000
+RDATE:19470427T020000
+RDATE:19480425T020000
+RDATE:19490424T020000
+RDATE:19510429T020000
+RDATE:19520427T020000
+RDATE:19530426T020000
+RDATE:19540425T020000
+RDATE:19560429T020000
+RDATE:19570428T020000
+RDATE:19580427T020000
+RDATE:19590426T020000
+RDATE:19620429T020000
+RDATE:19630428T020000
+RDATE:19640426T020000
+RDATE:19650425T020000
+RDATE:19660424T020000
+RDATE:19670430T020000
+RDATE:19680428T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19740428T020000
+RDATE:19750427T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19161001T000000
+RDATE:19161001T000000
+RDATE:19181031T020000
+RDATE:19200829T000000
+RDATE:19210905T000000
+RDATE:19220905T000000
+RDATE:19230904T000000
+RDATE:19240915T000000
+RDATE:19250928T000000
+RDATE:19260913T000000
+RDATE:19270926T000000
+RDATE:19280909T000000
+RDATE:19290903T000000
+RDATE:19300915T000000
+RDATE:19310928T000000
+RDATE:19320926T000000
+RDATE:19331002T000000
+RDATE:19340916T000000
+RDATE:19350930T000000
+RDATE:19360914T000000
+RDATE:19370927T000000
+RDATE:19380926T000000
+RDATE:19390925T000000
+RDATE:19400930T000000
+RDATE:19410929T000000
+RDATE:19450930T020000
+RDATE:19460929T020000
+RDATE:19470928T020000
+RDATE:19480926T020000
+RDATE:19490925T020000
+RDATE:19510930T020000
+RDATE:19520928T020000
+RDATE:19530927T020000
+RDATE:19540926T020000
+RDATE:19560930T020000
+RDATE:19570929T020000
+RDATE:19580928T020000
+RDATE:19590927T020000
+RDATE:19621028T020000
+RDATE:19631027T020000
+RDATE:19641025T020000
+RDATE:19651031T020000
+RDATE:19661030T020000
+RDATE:19671029T020000
+RDATE:19681027T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19180101T000000
+RDATE:19180101T000000
+RDATE:19190101T000000
+RDATE:19460101T000000
+RDATE:19740101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:AWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:APT
+DTSTART:19450814T200000
+RDATE:19450814T200000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Havana.ics b/libkcal/libical/zoneinfo/America/Havana.ics
new file mode 100644
index 00000000..f75460b5
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Havana.ics
@@ -0,0 +1,148 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Havana
+X-LIC-LOCATION:America/Havana
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:CST
+DTSTART:20061029T010000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:CDT
+DTSTART:20080316T000000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=3SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-052928
+TZOFFSETTO:-052936
+TZNAME:HMT
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-052936
+TZOFFSETTO:-0500
+TZNAME:CST
+DTSTART:19250719T120000
+RDATE:19250719T120000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:CDT
+DTSTART:19280610T000000
+RDATE:19280610T000000
+RDATE:19400602T000000
+RDATE:19410601T000000
+RDATE:19420607T000000
+RDATE:19450603T000000
+RDATE:19460602T000000
+RDATE:19650601T000000
+RDATE:19660529T000000
+RDATE:19670408T000000
+RDATE:19680414T000000
+RDATE:19690427T000000
+RDATE:19700426T000000
+RDATE:19710425T000000
+RDATE:19720430T000000
+RDATE:19730429T000000
+RDATE:19740428T000000
+RDATE:19750427T000000
+RDATE:19760425T000000
+RDATE:19770424T000000
+RDATE:19780507T000000
+RDATE:19790318T000000
+RDATE:19800316T000000
+RDATE:19810510T000000
+RDATE:19820509T000000
+RDATE:19830508T000000
+RDATE:19840506T000000
+RDATE:19850505T000000
+RDATE:19860316T000000
+RDATE:19870315T000000
+RDATE:19880320T000000
+RDATE:19890319T000000
+RDATE:19900401T000000
+RDATE:19910407T000000
+RDATE:19920405T000000
+RDATE:19930404T000000
+RDATE:19940403T000000
+RDATE:19950402T000000
+RDATE:19960407T000000
+RDATE:19970406T000000
+RDATE:19980329T000000
+RDATE:19990328T000000
+RDATE:20000402T000000
+RDATE:20010401T000000
+RDATE:20020407T000000
+RDATE:20030406T000000
+RDATE:20040404T000000
+RDATE:20070311T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:CST
+DTSTART:19281010T000000
+RDATE:19281010T000000
+RDATE:19400901T000000
+RDATE:19410907T000000
+RDATE:19420906T000000
+RDATE:19450902T000000
+RDATE:19460901T000000
+RDATE:19650930T000000
+RDATE:19661002T000000
+RDATE:19670910T000000
+RDATE:19680908T000000
+RDATE:19691026T000000
+RDATE:19701025T000000
+RDATE:19711031T000000
+RDATE:19721008T000000
+RDATE:19731008T000000
+RDATE:19741008T000000
+RDATE:19751026T000000
+RDATE:19761031T000000
+RDATE:19771030T000000
+RDATE:19781008T000000
+RDATE:19791014T000000
+RDATE:19801012T000000
+RDATE:19811011T000000
+RDATE:19821010T000000
+RDATE:19831009T000000
+RDATE:19841014T000000
+RDATE:19851013T000000
+RDATE:19861012T000000
+RDATE:19871011T000000
+RDATE:19881009T000000
+RDATE:19891008T000000
+RDATE:19901014T000000
+RDATE:19911013T010000
+RDATE:19921011T010000
+RDATE:19931010T010000
+RDATE:19941009T010000
+RDATE:19951008T010000
+RDATE:19961006T010000
+RDATE:19971012T010000
+RDATE:19981025T010000
+RDATE:19991031T010000
+RDATE:20001029T010000
+RDATE:20011028T010000
+RDATE:20021027T010000
+RDATE:20031026T010000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:CDT
+DTSTART:20050403T010000
+RDATE:20050403T010000
+RDATE:20060402T010000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Hermosillo.ics b/libkcal/libical/zoneinfo/America/Hermosillo.ics
new file mode 100644
index 00000000..ca07efe8
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Hermosillo.ics
@@ -0,0 +1,66 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Hermosillo
+X-LIC-LOCATION:America/Hermosillo
+BEGIN:STANDARD
+TZOFFSETFROM:-072352
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19211231T233608
+RDATE:19211231T233608
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19270610T230000
+RDATE:19270610T230000
+RDATE:19310501T230000
+RDATE:19320401T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19301115T000000
+RDATE:19301115T000000
+RDATE:19311001T000000
+RDATE:19420424T000000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19490114T000000
+RDATE:19490114T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19700101T000000
+RDATE:19700101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:19960407T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19990101T000000
+RDATE:19990101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Indiana/Indianapolis.ics b/libkcal/libical/zoneinfo/America/Indiana/Indianapolis.ics
new file mode 100644
index 00000000..5df8b898
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Indiana/Indianapolis.ics
@@ -0,0 +1,125 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Indiana/Indianapolis
+X-LIC-LOCATION:America/Indiana/Indianapolis
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-054438
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:18831118T121522
+RDATE:18831118T121522
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19180331T020000
+RDATE:19180331T020000
+RDATE:19190330T020000
+RDATE:19410622T020000
+RDATE:19460428T020000
+RDATE:19470427T020000
+RDATE:19480425T020000
+RDATE:19490424T020000
+RDATE:19500430T020000
+RDATE:19510429T020000
+RDATE:19520427T020000
+RDATE:19530426T020000
+RDATE:19540425T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19181027T020000
+RDATE:19181027T020000
+RDATE:19191026T020000
+RDATE:19410928T020000
+RDATE:19450930T020000
+RDATE:19460929T020000
+RDATE:19470928T020000
+RDATE:19480926T020000
+RDATE:19490925T020000
+RDATE:19500924T020000
+RDATE:19510930T020000
+RDATE:19520928T020000
+RDATE:19530927T020000
+RDATE:19540926T020000
+RDATE:19570929T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19200101T000000
+RDATE:19200101T000000
+RDATE:19420101T000000
+RDATE:19460101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CPT
+DTSTART:19450814T180000
+RDATE:19450814T180000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19550424T020000
+RDATE:19550424T020000
+RDATE:19580427T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19690101T000000
+RDATE:19690101T000000
+RDATE:19710101T000000
+RDATE:20060101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19690427T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19691026T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:20061029T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Indiana/Knox.ics b/libkcal/libical/zoneinfo/America/Indiana/Knox.ics
new file mode 100644
index 00000000..91b9e238
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Indiana/Knox.ics
@@ -0,0 +1,169 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Indiana/Knox
+X-LIC-LOCATION:America/Indiana/Knox
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-054630
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:18831118T121330
+RDATE:18831118T121330
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19180331T020000
+RDATE:19180331T020000
+RDATE:19190330T020000
+RDATE:19470427T020000
+RDATE:19480425T020000
+RDATE:19490424T020000
+RDATE:19500430T020000
+RDATE:19510429T020000
+RDATE:19520427T020000
+RDATE:19530426T020000
+RDATE:19540425T020000
+RDATE:19550424T020000
+RDATE:19560429T020000
+RDATE:19570428T020000
+RDATE:19580427T020000
+RDATE:19590426T020000
+RDATE:19600424T020000
+RDATE:19610430T020000
+RDATE:19670430T020000
+RDATE:19680428T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19740106T020000
+RDATE:19750223T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19181027T020000
+RDATE:19181027T020000
+RDATE:19191026T020000
+RDATE:19450930T020000
+RDATE:19470928T020000
+RDATE:19480926T020000
+RDATE:19490925T020000
+RDATE:19500924T020000
+RDATE:19510930T020000
+RDATE:19520928T020000
+RDATE:19530927T020000
+RDATE:19540926T020000
+RDATE:19551030T020000
+RDATE:19561028T020000
+RDATE:19570929T020000
+RDATE:19580928T020000
+RDATE:19591025T020000
+RDATE:19601030T020000
+RDATE:19611029T020000
+RDATE:19631027T020000
+RDATE:19671029T020000
+RDATE:19681027T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CPT
+DTSTART:19450814T180000
+RDATE:19450814T180000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19470101T000000
+RDATE:19470101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19620429T020000
+RDATE:19620429T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19911027T020000
+RDATE:19911027T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:20060402T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Indiana/Marengo.ics b/libkcal/libical/zoneinfo/America/Indiana/Marengo.ics
new file mode 100644
index 00000000..11e41f7f
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Indiana/Marengo.ics
@@ -0,0 +1,133 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Indiana/Marengo
+X-LIC-LOCATION:America/Indiana/Marengo
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-054523
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:18831118T121437
+RDATE:18831118T121437
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19180331T020000
+RDATE:19180331T020000
+RDATE:19190330T020000
+RDATE:19510429T020000
+RDATE:19540425T020000
+RDATE:19550424T020000
+RDATE:19560429T020000
+RDATE:19570428T020000
+RDATE:19580427T020000
+RDATE:19590426T020000
+RDATE:19600424T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19181027T020000
+RDATE:19181027T020000
+RDATE:19191026T020000
+RDATE:19450930T020000
+RDATE:19510930T020000
+RDATE:19540926T020000
+RDATE:19550925T020000
+RDATE:19560930T020000
+RDATE:19570929T020000
+RDATE:19580928T020000
+RDATE:19590927T020000
+RDATE:19600925T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CPT
+DTSTART:19450814T180000
+RDATE:19450814T180000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19510101T000000
+RDATE:19510101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19610430T020000
+RDATE:19610430T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19690101T000000
+RDATE:19690101T000000
+RDATE:19741027T020000
+RDATE:19760101T000000
+RDATE:20060101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19690427T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19750223T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19691026T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19751026T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19740106T020000
+RDATE:19740106T020000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Indiana/Petersburg.ics b/libkcal/libical/zoneinfo/America/Indiana/Petersburg.ics
new file mode 100644
index 00000000..8427c1aa
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Indiana/Petersburg.ics
@@ -0,0 +1,133 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Indiana/Petersburg
+X-LIC-LOCATION:America/Indiana/Petersburg
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:20080309T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:20081102T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-054907
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:18831118T121053
+RDATE:18831118T121053
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19180331T020000
+RDATE:19180331T020000
+RDATE:19190330T020000
+RDATE:19550501T000000
+RDATE:19560429T020000
+RDATE:19570428T020000
+RDATE:19580427T020000
+RDATE:19590426T020000
+RDATE:19600424T020000
+RDATE:19610430T020000
+RDATE:19620429T020000
+RDATE:19630428T020000
+RDATE:19640426T020000
+RDATE:19670430T020000
+RDATE:19680428T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19740106T020000
+RDATE:19750223T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:20070311T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19181027T020000
+RDATE:19181027T020000
+RDATE:19191026T020000
+RDATE:19450930T020000
+RDATE:19550925T020000
+RDATE:19560930T020000
+RDATE:19570929T020000
+RDATE:19580928T020000
+RDATE:19590927T020000
+RDATE:19600925T020000
+RDATE:19611029T020000
+RDATE:19621028T020000
+RDATE:19631027T020000
+RDATE:19641025T020000
+RDATE:19661030T020000
+RDATE:19671029T020000
+RDATE:19681027T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CPT
+DTSTART:19450814T180000
+RDATE:19450814T180000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19550101T000000
+RDATE:19550101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19650425T020000
+RDATE:19650425T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19771030T020000
+RDATE:19771030T020000
+RDATE:20071104T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:20060402T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Indiana/Tell_City.ics b/libkcal/libical/zoneinfo/America/Indiana/Tell_City.ics
new file mode 100644
index 00000000..3c431cd7
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Indiana/Tell_City.ics
@@ -0,0 +1,130 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Indiana/Tell_City
+X-LIC-LOCATION:America/Indiana/Tell_City
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-054703
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:18831118T121257
+RDATE:18831118T121257
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19180331T020000
+RDATE:19180331T020000
+RDATE:19190330T020000
+RDATE:19460428T020000
+RDATE:19530426T020000
+RDATE:19540425T020000
+RDATE:19550501T000000
+RDATE:19560429T020000
+RDATE:19570428T020000
+RDATE:19580427T020000
+RDATE:19590426T020000
+RDATE:19600424T020000
+RDATE:19610430T020000
+RDATE:19620429T020000
+RDATE:19630428T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19181027T020000
+RDATE:19181027T020000
+RDATE:19191026T020000
+RDATE:19450930T020000
+RDATE:19460929T020000
+RDATE:19530927T020000
+RDATE:19540926T020000
+RDATE:19550925T020000
+RDATE:19560930T020000
+RDATE:19570929T020000
+RDATE:19580928T020000
+RDATE:19590927T020000
+RDATE:19601030T020000
+RDATE:19610924T020000
+RDATE:19621028T020000
+RDATE:19631027T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CPT
+DTSTART:19450814T180000
+RDATE:19450814T180000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19460101T000000
+RDATE:19460101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19640426T020000
+RDATE:19640426T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19690101T000000
+RDATE:19690101T000000
+RDATE:19710101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19690427T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19691026T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:20060402T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Indiana/Vevay.ics b/libkcal/libical/zoneinfo/America/Indiana/Vevay.ics
new file mode 100644
index 00000000..40cd5e63
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Indiana/Vevay.ics
@@ -0,0 +1,98 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Indiana/Vevay
+X-LIC-LOCATION:America/Indiana/Vevay
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-054016
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:18831118T121944
+RDATE:18831118T121944
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19180331T020000
+RDATE:19180331T020000
+RDATE:19190330T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19181027T020000
+RDATE:19181027T020000
+RDATE:19191026T020000
+RDATE:19450930T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CPT
+DTSTART:19450814T180000
+RDATE:19450814T180000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19540425T020000
+RDATE:19540425T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19690101T000000
+RDATE:19690101T000000
+RDATE:19730101T000000
+RDATE:20060101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19690427T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19691026T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:20061029T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Indiana/Vincennes.ics b/libkcal/libical/zoneinfo/America/Indiana/Vincennes.ics
new file mode 100644
index 00000000..3cdf3805
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Indiana/Vincennes.ics
@@ -0,0 +1,132 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Indiana/Vincennes
+X-LIC-LOCATION:America/Indiana/Vincennes
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:20080309T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:20081102T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-055007
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:18831118T120953
+RDATE:18831118T120953
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19180331T020000
+RDATE:19180331T020000
+RDATE:19190330T020000
+RDATE:19460428T020000
+RDATE:19530426T020000
+RDATE:19540425T020000
+RDATE:19550501T000000
+RDATE:19560429T020000
+RDATE:19570428T020000
+RDATE:19580427T020000
+RDATE:19590426T020000
+RDATE:19600424T020000
+RDATE:19610430T020000
+RDATE:19620429T020000
+RDATE:19630428T020000
+RDATE:20070311T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19181027T020000
+RDATE:19181027T020000
+RDATE:19191026T020000
+RDATE:19450930T020000
+RDATE:19460929T020000
+RDATE:19530927T020000
+RDATE:19540926T020000
+RDATE:19550925T020000
+RDATE:19560930T020000
+RDATE:19570929T020000
+RDATE:19580928T020000
+RDATE:19590927T020000
+RDATE:19601030T020000
+RDATE:19610924T020000
+RDATE:19621028T020000
+RDATE:19631027T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CPT
+DTSTART:19450814T180000
+RDATE:19450814T180000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19460101T000000
+RDATE:19460101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19640426T020000
+RDATE:19640426T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19690101T000000
+RDATE:19690101T000000
+RDATE:19710101T000000
+RDATE:20071104T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19690427T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19691026T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:20060402T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Indiana/Winamac.ics b/libkcal/libical/zoneinfo/America/Indiana/Winamac.ics
new file mode 100644
index 00000000..935f4530
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Indiana/Winamac.ics
@@ -0,0 +1,143 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Indiana/Winamac
+X-LIC-LOCATION:America/Indiana/Winamac
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:20080309T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-054625
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:18831118T121335
+RDATE:18831118T121335
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19180331T020000
+RDATE:19180331T020000
+RDATE:19190330T020000
+RDATE:19460428T020000
+RDATE:19470427T020000
+RDATE:19480425T020000
+RDATE:19490424T020000
+RDATE:19500430T020000
+RDATE:19510429T020000
+RDATE:19520427T020000
+RDATE:19530426T020000
+RDATE:19540425T020000
+RDATE:19550424T020000
+RDATE:19560429T020000
+RDATE:19570428T020000
+RDATE:19580427T020000
+RDATE:19590426T020000
+RDATE:19600424T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19181027T020000
+RDATE:19181027T020000
+RDATE:19191026T020000
+RDATE:19450930T020000
+RDATE:19460929T020000
+RDATE:19470928T020000
+RDATE:19480926T020000
+RDATE:19490925T020000
+RDATE:19500924T020000
+RDATE:19510930T020000
+RDATE:19520928T020000
+RDATE:19530927T020000
+RDATE:19540926T020000
+RDATE:19551030T020000
+RDATE:19561028T020000
+RDATE:19570929T020000
+RDATE:19580928T020000
+RDATE:19590927T020000
+RDATE:19600925T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CPT
+DTSTART:19450814T180000
+RDATE:19450814T180000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19460101T000000
+RDATE:19460101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19610430T020000
+RDATE:19610430T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19690101T000000
+RDATE:19690101T000000
+RDATE:19710101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19690427T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19691026T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:20060402T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:20070311T020000
+RDATE:20070311T020000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Inuvik.ics b/libkcal/libical/zoneinfo/America/Inuvik.ics
new file mode 100644
index 00000000..bbbb49e0
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Inuvik.ics
@@ -0,0 +1,122 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Inuvik
+X-LIC-LOCATION:America/Inuvik
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19530101T000000
+RDATE:19530101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0600
+TZNAME:PDDT
+DTSTART:19650425T000000
+RDATE:19650425T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19651031T020000
+RDATE:19651031T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+DTSTART:19790429T020000
+RDATE:19790429T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19800101T000000
+RDATE:19800101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:19800427T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19801026T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Iqaluit.ics b/libkcal/libical/zoneinfo/America/Iqaluit.ics
new file mode 100644
index 00000000..a6d927ca
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Iqaluit.ics
@@ -0,0 +1,135 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Iqaluit
+X-LIC-LOCATION:America/Iqaluit
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:-0400
+TZNAME:EWT
+DTSTART:19420801T000000
+RDATE:19420801T000000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:EPT
+DTSTART:19450814T190000
+RDATE:19450814T190000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19450930T020000
+RDATE:19450930T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0300
+TZNAME:EDDT
+DTSTART:19650425T000000
+RDATE:19650425T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19651031T020000
+RDATE:19651031T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19800427T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19991031T020000
+RDATE:19991031T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:20000402T020000
+RDATE:20000402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:20001029T020000
+RDATE:20001029T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Jamaica.ics b/libkcal/libical/zoneinfo/America/Jamaica.ics
new file mode 100644
index 00000000..d70aa9ae
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Jamaica.ics
@@ -0,0 +1,61 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Jamaica
+X-LIC-LOCATION:America/Jamaica
+BEGIN:STANDARD
+TZOFFSETFROM:-050712
+TZOFFSETTO:-050712
+TZNAME:KMT
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-050712
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19120201T000000
+RDATE:19120201T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19740428T020000
+RDATE:19740428T020000
+RDATE:19750223T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19741027T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19840101T000000
+RDATE:19840101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Juneau.ics b/libkcal/libical/zoneinfo/America/Juneau.ics
new file mode 100644
index 00000000..3b98b229
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Juneau.ics
@@ -0,0 +1,173 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Juneau
+X-LIC-LOCATION:America/Juneau
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0800
+TZNAME:AKDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0900
+TZNAME:AKST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+150219
+TZOFFSETTO:-085741
+TZNAME:LMT
+DTSTART:18671018T000000
+RDATE:18671018T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-085741
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19000820T120000
+RDATE:19000820T120000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19420101T000000
+RDATE:19420101T000000
+RDATE:19460101T000000
+RDATE:19690101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:PWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0700
+TZNAME:PPT
+DTSTART:19450814T160000
+RDATE:19450814T160000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19450930T020000
+RDATE:19450930T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:PDT
+DTSTART:19690427T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19740106T020000
+RDATE:19750223T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0900
+TZNAME:YST
+DTSTART:19831030T020000
+RDATE:19831030T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0900
+TZNAME:AKST
+DTSTART:19831130T000000
+RDATE:19831130T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0800
+TZNAME:AKDT
+DTSTART:19840429T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0900
+TZNAME:AKST
+DTSTART:19841028T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Kentucky/Louisville.ics b/libkcal/libical/zoneinfo/America/Kentucky/Louisville.ics
new file mode 100644
index 00000000..14e07ac2
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Kentucky/Louisville.ics
@@ -0,0 +1,205 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Kentucky/Louisville
+X-LIC-LOCATION:America/Kentucky/Louisville
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-054302
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:18831118T121658
+RDATE:18831118T121658
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19180331T020000
+RDATE:19180331T020000
+RDATE:19190330T020000
+RDATE:19210501T020000
+RDATE:19410427T020000
+RDATE:19460101T000000
+RDATE:19470427T020000
+RDATE:19510429T020000
+RDATE:19520427T020000
+RDATE:19530426T020000
+RDATE:19540425T020000
+RDATE:19550424T020000
+RDATE:19560429T020000
+RDATE:19570428T020000
+RDATE:19580427T020000
+RDATE:19590426T020000
+RDATE:19600424T020000
+RDATE:19610430T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19181027T020000
+RDATE:19181027T020000
+RDATE:19191026T020000
+RDATE:19210901T020000
+RDATE:19410928T020000
+RDATE:19450930T020000
+RDATE:19460602T020000
+RDATE:19500924T020000
+RDATE:19510930T020000
+RDATE:19520928T020000
+RDATE:19530927T020000
+RDATE:19540926T020000
+RDATE:19550925T020000
+RDATE:19561028T020000
+RDATE:19571027T020000
+RDATE:19581026T020000
+RDATE:19591025T020000
+RDATE:19601030T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19210101T000000
+RDATE:19210101T000000
+RDATE:19420101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CPT
+DTSTART:19450814T180000
+RDATE:19450814T180000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19460428T020000
+RDATE:19460428T020000
+RDATE:19480425T020000
+RDATE:19490424T020000
+RDATE:19500430T020000
+RDATE:19740106T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19610723T020000
+RDATE:19610723T020000
+RDATE:19680101T000000
+RDATE:19741027T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19680428T020000
+RDATE:19680428T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19750223T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19681027T020000
+RDATE:19681027T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Kentucky/Monticello.ics b/libkcal/libical/zoneinfo/America/Kentucky/Monticello.ics
new file mode 100644
index 00000000..99f05c82
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Kentucky/Monticello.ics
@@ -0,0 +1,164 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Kentucky/Monticello
+X-LIC-LOCATION:America/Kentucky/Monticello
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-053924
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:18831118T122036
+RDATE:18831118T122036
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19180331T020000
+RDATE:19180331T020000
+RDATE:19190330T020000
+RDATE:19680428T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19740106T020000
+RDATE:19750223T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19181027T020000
+RDATE:19181027T020000
+RDATE:19191026T020000
+RDATE:19450930T020000
+RDATE:19681027T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CPT
+DTSTART:19450814T180000
+RDATE:19450814T180000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19460101T000000
+RDATE:19460101T000000
+RDATE:19680101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:20001029T020000
+RDATE:20001029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:20010401T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:20011028T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/La_Paz.ics b/libkcal/libical/zoneinfo/America/La_Paz.ics
new file mode 100644
index 00000000..10a92213
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/La_Paz.ics
@@ -0,0 +1,29 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/La_Paz
+X-LIC-LOCATION:America/La_Paz
+BEGIN:STANDARD
+TZOFFSETFROM:-043236
+TZOFFSETTO:-043236
+TZNAME:CMT
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-043236
+TZOFFSETTO:-033236
+TZNAME:BOST
+DTSTART:19311015T000000
+RDATE:19311015T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-033236
+TZOFFSETTO:-0400
+TZNAME:BOT
+DTSTART:19320321T000000
+RDATE:19320321T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Lima.ics b/libkcal/libical/zoneinfo/America/Lima.ics
new file mode 100644
index 00000000..ce63f4f4
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Lima.ics
@@ -0,0 +1,48 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Lima
+X-LIC-LOCATION:America/Lima
+BEGIN:STANDARD
+TZOFFSETFROM:-050812
+TZOFFSETTO:-050836
+TZNAME:LMT
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-050836
+TZOFFSETTO:-0500
+TZNAME:PET
+DTSTART:19080728T000000
+RDATE:19080728T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:PEST
+DTSTART:19380101T000000
+RDATE:19380101T000000
+RDATE:19380925T000000
+RDATE:19390924T000000
+RDATE:19860101T000000
+RDATE:19870101T000000
+RDATE:19900101T000000
+RDATE:19940101T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:PET
+DTSTART:19380401T000000
+RDATE:19380401T000000
+RDATE:19390326T000000
+RDATE:19400324T000000
+RDATE:19860401T000000
+RDATE:19870401T000000
+RDATE:19900401T000000
+RDATE:19940401T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Los_Angeles.ics b/libkcal/libical/zoneinfo/America/Los_Angeles.ics
new file mode 100644
index 00000000..15f048fd
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Los_Angeles.ics
@@ -0,0 +1,184 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Los_Angeles
+X-LIC-LOCATION:America/Los_Angeles
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:PDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-075258
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:18831118T120702
+RDATE:18831118T120702
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:PDT
+DTSTART:19180331T020000
+RDATE:19180331T020000
+RDATE:19190330T020000
+RDATE:19480314T020000
+RDATE:19500430T020000
+RDATE:19510429T020000
+RDATE:19520427T020000
+RDATE:19530426T020000
+RDATE:19540425T020000
+RDATE:19550424T020000
+RDATE:19560429T020000
+RDATE:19570428T020000
+RDATE:19580427T020000
+RDATE:19590426T020000
+RDATE:19600424T020000
+RDATE:19610430T020000
+RDATE:19620429T020000
+RDATE:19630428T020000
+RDATE:19640426T020000
+RDATE:19650425T020000
+RDATE:19660424T020000
+RDATE:19670430T020000
+RDATE:19680428T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19740106T020000
+RDATE:19750223T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19181027T020000
+RDATE:19181027T020000
+RDATE:19191026T020000
+RDATE:19450930T020000
+RDATE:19490101T020000
+RDATE:19500924T020000
+RDATE:19510930T020000
+RDATE:19520928T020000
+RDATE:19530927T020000
+RDATE:19540926T020000
+RDATE:19550925T020000
+RDATE:19560930T020000
+RDATE:19570929T020000
+RDATE:19580928T020000
+RDATE:19590927T020000
+RDATE:19600925T020000
+RDATE:19610924T020000
+RDATE:19621028T020000
+RDATE:19631027T020000
+RDATE:19641025T020000
+RDATE:19651031T020000
+RDATE:19661030T020000
+RDATE:19671029T020000
+RDATE:19681027T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:PWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0700
+TZNAME:PPT
+DTSTART:19450814T160000
+RDATE:19450814T160000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19460101T000000
+RDATE:19460101T000000
+RDATE:19670101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Maceio.ics b/libkcal/libical/zoneinfo/America/Maceio.ics
new file mode 100644
index 00000000..f03e5d4c
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Maceio.ics
@@ -0,0 +1,79 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Maceio
+X-LIC-LOCATION:America/Maceio
+BEGIN:STANDARD
+TZOFFSETFROM:-022252
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:19140101T000000
+RDATE:19140101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:BRST
+DTSTART:19311003T110000
+RDATE:19311003T110000
+RDATE:19321003T000000
+RDATE:19491201T000000
+RDATE:19501201T000000
+RDATE:19511201T000000
+RDATE:19521201T000000
+RDATE:19631209T000000
+RDATE:19650131T000000
+RDATE:19651201T000000
+RDATE:19661101T000000
+RDATE:19671101T000000
+RDATE:19851102T000000
+RDATE:19861025T000000
+RDATE:19871025T000000
+RDATE:19881016T000000
+RDATE:19891015T000000
+RDATE:19951015T000000
+RDATE:19991003T000000
+RDATE:20001008T000000
+RDATE:20011014T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:19320401T000000
+RDATE:19320401T000000
+RDATE:19330401T000000
+RDATE:19500416T010000
+RDATE:19510401T000000
+RDATE:19520401T000000
+RDATE:19530301T000000
+RDATE:19640301T000000
+RDATE:19650331T000000
+RDATE:19660301T000000
+RDATE:19670301T000000
+RDATE:19680301T000000
+RDATE:19860315T000000
+RDATE:19870214T000000
+RDATE:19880207T000000
+RDATE:19890129T000000
+RDATE:19900211T000000
+RDATE:19960211T000000
+RDATE:20000227T000000
+RDATE:20001022T000000
+RDATE:20020217T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:19900917T000000
+RDATE:19900917T000000
+RDATE:19951013T000000
+RDATE:19960904T000000
+RDATE:19990930T000000
+RDATE:20010913T000000
+RDATE:20021001T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Managua.ics b/libkcal/libical/zoneinfo/America/Managua.ics
new file mode 100644
index 00000000..7645bb9c
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Managua.ics
@@ -0,0 +1,54 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Managua
+X-LIC-LOCATION:America/Managua
+BEGIN:STANDARD
+TZOFFSETFROM:-054508
+TZOFFSETTO:-054512
+TZNAME:MMT
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-054512
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19340623T000000
+RDATE:19340623T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19730501T000000
+RDATE:19730501T000000
+RDATE:19920101T040000
+RDATE:19930101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19750216T000000
+RDATE:19750216T000000
+RDATE:19790625T000000
+RDATE:19800623T000000
+RDATE:19920924T000000
+RDATE:19970101T000000
+RDATE:20051002T000000
+RDATE:20061001T010000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19790318T000000
+RDATE:19790318T000000
+RDATE:19800316T000000
+RDATE:20050410T000000
+RDATE:20060430T020000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Manaus.ics b/libkcal/libical/zoneinfo/America/Manaus.ics
new file mode 100644
index 00000000..08bc9532
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Manaus.ics
@@ -0,0 +1,66 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Manaus
+X-LIC-LOCATION:America/Manaus
+BEGIN:STANDARD
+TZOFFSETFROM:-040004
+TZOFFSETTO:-0400
+TZNAME:AMT
+DTSTART:19140101T000000
+RDATE:19140101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:AMST
+DTSTART:19311003T110000
+RDATE:19311003T110000
+RDATE:19321003T000000
+RDATE:19491201T000000
+RDATE:19501201T000000
+RDATE:19511201T000000
+RDATE:19521201T000000
+RDATE:19631209T000000
+RDATE:19650131T000000
+RDATE:19651201T000000
+RDATE:19661101T000000
+RDATE:19671101T000000
+RDATE:19851102T000000
+RDATE:19861025T000000
+RDATE:19871025T000000
+RDATE:19931017T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AMT
+DTSTART:19320401T000000
+RDATE:19320401T000000
+RDATE:19330401T000000
+RDATE:19500416T010000
+RDATE:19510401T000000
+RDATE:19520401T000000
+RDATE:19530301T000000
+RDATE:19640301T000000
+RDATE:19650331T000000
+RDATE:19660301T000000
+RDATE:19670301T000000
+RDATE:19680301T000000
+RDATE:19860315T000000
+RDATE:19870214T000000
+RDATE:19880207T000000
+RDATE:19940220T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AMT
+DTSTART:19880912T000000
+RDATE:19880912T000000
+RDATE:19930928T000000
+RDATE:19940922T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Marigot.ics b/libkcal/libical/zoneinfo/America/Marigot.ics
new file mode 100644
index 00000000..8fa755a5
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Marigot.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Marigot
+X-LIC-LOCATION:America/Marigot
+BEGIN:STANDARD
+TZOFFSETFROM:-040608
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19110608T000000
+RDATE:19110608T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Martinique.ics b/libkcal/libical/zoneinfo/America/Martinique.ics
new file mode 100644
index 00000000..d5abdcd1
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Martinique.ics
@@ -0,0 +1,36 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Martinique
+X-LIC-LOCATION:America/Martinique
+BEGIN:STANDARD
+TZOFFSETFROM:-040420
+TZOFFSETTO:-040420
+TZNAME:FFMT
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-040420
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19110501T000000
+RDATE:19110501T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ADT
+DTSTART:19800406T000000
+RDATE:19800406T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19800928T000000
+RDATE:19800928T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Mazatlan.ics b/libkcal/libical/zoneinfo/America/Mazatlan.ics
new file mode 100644
index 00000000..fcd4c1a1
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Mazatlan.ics
@@ -0,0 +1,79 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Mazatlan
+X-LIC-LOCATION:America/Mazatlan
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:20020407T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:20021027T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-070540
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19211231T235420
+RDATE:19211231T235420
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19270610T230000
+RDATE:19270610T230000
+RDATE:19310501T230000
+RDATE:19320401T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19301115T000000
+RDATE:19301115T000000
+RDATE:19311001T000000
+RDATE:19420424T000000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20010930T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19490114T000000
+RDATE:19490114T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19700101T000000
+RDATE:19700101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:19960407T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010506T020000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Menominee.ics b/libkcal/libical/zoneinfo/America/Menominee.ics
new file mode 100644
index 00000000..1b02d706
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Menominee.ics
@@ -0,0 +1,152 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Menominee
+X-LIC-LOCATION:America/Menominee
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-055027
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:18850918T120000
+RDATE:18850918T120000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19180331T020000
+RDATE:19180331T020000
+RDATE:19190330T020000
+RDATE:19460428T020000
+RDATE:19660424T020000
+RDATE:19740106T020000
+RDATE:19750223T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19181027T020000
+RDATE:19181027T020000
+RDATE:19191026T020000
+RDATE:19450930T020000
+RDATE:19460929T020000
+RDATE:19661030T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CPT
+DTSTART:19450814T180000
+RDATE:19450814T180000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19460101T000000
+RDATE:19460101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19690427T020000
+RDATE:19690427T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19730429T020000
+RDATE:19730429T020000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Merida.ics b/libkcal/libical/zoneinfo/America/Merida.ics
new file mode 100644
index 00000000..97db7d99
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Merida.ics
@@ -0,0 +1,61 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Merida
+X-LIC-LOCATION:America/Merida
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:20020407T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:20021027T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-055828
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19220101T000132
+RDATE:19220101T000132
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19811223T000000
+RDATE:19811223T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19821202T000000
+RDATE:19821202T000000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20010930T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19960407T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010506T020000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Mexico_City.ics b/libkcal/libical/zoneinfo/America/Mexico_City.ics
new file mode 100644
index 00000000..a825c018
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Mexico_City.ics
@@ -0,0 +1,91 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Mexico_City
+X-LIC-LOCATION:America/Mexico_City
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:20020407T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:20021027T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-063636
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19220101T002324
+RDATE:19220101T002324
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19270610T230000
+RDATE:19270610T230000
+RDATE:19310501T230000
+RDATE:19320401T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19301115T000000
+RDATE:19301115T000000
+RDATE:19311001T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19390205T000000
+RDATE:19390205T000000
+RDATE:19401209T000000
+RDATE:19500212T000000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010506T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19390625T000000
+RDATE:19390625T000000
+RDATE:19410401T000000
+RDATE:19440501T000000
+RDATE:19500730T000000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20010930T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CWT
+DTSTART:19431216T000000
+RDATE:19431216T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:20020220T000000
+RDATE:20020220T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Miquelon.ics b/libkcal/libical/zoneinfo/America/Miquelon.ics
new file mode 100644
index 00000000..131e2618
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Miquelon.ics
@@ -0,0 +1,95 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Miquelon
+X-LIC-LOCATION:America/Miquelon
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:PMDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:PMST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-034440
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19110515T000000
+RDATE:19110515T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:PMST
+DTSTART:19800501T000000
+RDATE:19800501T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:PMST
+DTSTART:19870101T000000
+RDATE:19870101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:PMDT
+DTSTART:19870405T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:PMST
+DTSTART:19871025T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Moncton.ics b/libkcal/libical/zoneinfo/America/Moncton.ics
new file mode 100644
index 00000000..a6cc7786
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Moncton.ics
@@ -0,0 +1,215 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Moncton
+X-LIC-LOCATION:America/Moncton
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ADT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-041908
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:18831209T000000
+RDATE:18831209T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19020615T000000
+RDATE:19020615T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ADT
+DTSTART:19180414T020000
+RDATE:19180414T020000
+RDATE:19330611T010000
+RDATE:19340610T010000
+RDATE:19350609T010000
+RDATE:19360607T010000
+RDATE:19370606T010000
+RDATE:19380605T010000
+RDATE:19390527T010000
+RDATE:19400519T010000
+RDATE:19410504T010000
+RDATE:19460428T020000
+RDATE:19470427T020000
+RDATE:19480425T020000
+RDATE:19490424T020000
+RDATE:19500430T020000
+RDATE:19510429T020000
+RDATE:19520427T020000
+RDATE:19530426T020000
+RDATE:19540425T020000
+RDATE:19550424T020000
+RDATE:19560429T020000
+RDATE:19570428T020000
+RDATE:19580427T020000
+RDATE:19590426T020000
+RDATE:19600424T020000
+RDATE:19610430T020000
+RDATE:19620429T020000
+RDATE:19630428T020000
+RDATE:19640426T020000
+RDATE:19650425T020000
+RDATE:19660424T020000
+RDATE:19670430T020000
+RDATE:19680428T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19740428T020000
+RDATE:19750427T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T000100
+RDATE:19940403T000100
+RDATE:19950402T000100
+RDATE:19960407T000100
+RDATE:19970406T000100
+RDATE:19980405T000100
+RDATE:19990404T000100
+RDATE:20000402T000100
+RDATE:20010401T000100
+RDATE:20020407T000100
+RDATE:20030406T000100
+RDATE:20040404T000100
+RDATE:20050403T000100
+RDATE:20060402T000100
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19181031T020000
+RDATE:19181031T020000
+RDATE:19330910T010000
+RDATE:19340909T010000
+RDATE:19350908T010000
+RDATE:19360906T010000
+RDATE:19370905T010000
+RDATE:19380904T010000
+RDATE:19390923T010000
+RDATE:19400921T010000
+RDATE:19410927T010000
+RDATE:19450930T020000
+RDATE:19460929T020000
+RDATE:19470928T020000
+RDATE:19480926T020000
+RDATE:19490925T020000
+RDATE:19500924T020000
+RDATE:19510930T020000
+RDATE:19520928T020000
+RDATE:19530927T020000
+RDATE:19540926T020000
+RDATE:19550925T020000
+RDATE:19560930T020000
+RDATE:19571027T020000
+RDATE:19581026T020000
+RDATE:19591025T020000
+RDATE:19601030T020000
+RDATE:19611029T020000
+RDATE:19621028T020000
+RDATE:19631027T020000
+RDATE:19641025T020000
+RDATE:19651031T020000
+RDATE:19661030T020000
+RDATE:19671029T020000
+RDATE:19681027T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T000100
+RDATE:19941030T000100
+RDATE:19951029T000100
+RDATE:19961027T000100
+RDATE:19971026T000100
+RDATE:19981025T000100
+RDATE:19991031T000100
+RDATE:20001029T000100
+RDATE:20011028T000100
+RDATE:20021027T000100
+RDATE:20031026T000100
+RDATE:20041031T000100
+RDATE:20051030T000100
+RDATE:20061029T000100
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19330101T000000
+RDATE:19330101T000000
+RDATE:19420101T000000
+RDATE:19460101T000000
+RDATE:19730101T000000
+RDATE:19930101T000000
+RDATE:20070101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:AWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:APT
+DTSTART:19450814T200000
+RDATE:19450814T200000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Monterrey.ics b/libkcal/libical/zoneinfo/America/Monterrey.ics
new file mode 100644
index 00000000..d7a76004
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Monterrey.ics
@@ -0,0 +1,63 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Monterrey
+X-LIC-LOCATION:America/Monterrey
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:20020407T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:20021027T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-064116
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19211231T231844
+RDATE:19211231T231844
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19880101T000000
+RDATE:19880101T000000
+RDATE:19890101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19880403T020000
+RDATE:19880403T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010506T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19881030T020000
+RDATE:19881030T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20010930T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Montevideo.ics b/libkcal/libical/zoneinfo/America/Montevideo.ics
new file mode 100644
index 00000000..be87059b
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Montevideo.ics
@@ -0,0 +1,151 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Montevideo
+X-LIC-LOCATION:America/Montevideo
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:UYST
+DTSTART:20061001T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:UYT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-034444
+TZOFFSETTO:-034444
+TZNAME:MMT
+DTSTART:18980628T000000
+RDATE:18980628T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-034444
+TZOFFSETTO:-0330
+TZNAME:UYT
+DTSTART:19200501T000000
+RDATE:19200501T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0330
+TZOFFSETTO:-0300
+TZNAME:UYHST
+DTSTART:19231002T000000
+RDATE:19231002T000000
+RDATE:19241001T000000
+RDATE:19251001T000000
+RDATE:19331029T000000
+RDATE:19341028T000000
+RDATE:19351027T000000
+RDATE:19361101T000000
+RDATE:19371031T000000
+RDATE:19381030T000000
+RDATE:19391029T000000
+RDATE:19401027T000000
+RDATE:19410801T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0330
+TZNAME:UYT
+DTSTART:19240401T000000
+RDATE:19240401T000000
+RDATE:19250401T000000
+RDATE:19260401T000000
+RDATE:19340401T000000
+RDATE:19350331T000000
+RDATE:19360329T000000
+RDATE:19370328T000000
+RDATE:19380327T000000
+RDATE:19390326T000000
+RDATE:19400331T000000
+RDATE:19410330T000000
+RDATE:19420101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0330
+TZOFFSETTO:-0200
+TZNAME:UYST
+DTSTART:19421214T000000
+RDATE:19421214T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:UYT
+DTSTART:19430314T000000
+RDATE:19430314T000000
+RDATE:19591115T000000
+RDATE:19600306T000000
+RDATE:19650926T000000
+RDATE:19661031T000000
+RDATE:19671031T000000
+RDATE:19720815T000000
+RDATE:19761001T000000
+RDATE:19780401T000000
+RDATE:19800501T000000
+RDATE:19880314T000000
+RDATE:19890312T000000
+RDATE:19900304T000000
+RDATE:19910303T000000
+RDATE:19920301T000000
+RDATE:19930228T000000
+RDATE:20050327T020000
+RDATE:20060312T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:UYST
+DTSTART:19590524T000000
+RDATE:19590524T000000
+RDATE:19600117T000000
+RDATE:19650404T000000
+RDATE:19660403T000000
+RDATE:19670402T000000
+RDATE:19720424T000000
+RDATE:19771204T000000
+RDATE:19791001T000000
+RDATE:19871214T000000
+RDATE:19881211T000000
+RDATE:19891029T000000
+RDATE:19901021T000000
+RDATE:19911027T000000
+RDATE:19921018T000000
+RDATE:20040919T000000
+RDATE:20051009T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0230
+TZNAME:UYHST
+DTSTART:19680527T000000
+RDATE:19680527T000000
+RDATE:19690527T000000
+RDATE:19700527T000000
+RDATE:19740310T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0230
+TZOFFSETTO:-0300
+TZNAME:UYT
+DTSTART:19681202T000000
+RDATE:19681202T000000
+RDATE:19691202T000000
+RDATE:19701202T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0230
+TZOFFSETTO:-0200
+TZNAME:UYST
+DTSTART:19741222T000000
+RDATE:19741222T000000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Montreal.ics b/libkcal/libical/zoneinfo/America/Montreal.ics
new file mode 100644
index 00000000..03b2719b
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Montreal.ics
@@ -0,0 +1,233 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Montreal
+X-LIC-LOCATION:America/Montreal
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-045416
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:18840101T000000
+RDATE:18840101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19170325T020000
+RDATE:19170325T020000
+RDATE:19180414T020000
+RDATE:19190331T023000
+RDATE:19200502T023000
+RDATE:19210501T020000
+RDATE:19220430T020000
+RDATE:19240517T020000
+RDATE:19250503T020000
+RDATE:19260502T020000
+RDATE:19270501T000000
+RDATE:19280429T000000
+RDATE:19290428T000000
+RDATE:19300427T000000
+RDATE:19310426T000000
+RDATE:19320501T000000
+RDATE:19330430T000000
+RDATE:19340429T000000
+RDATE:19350428T000000
+RDATE:19360426T000000
+RDATE:19370425T000000
+RDATE:19380424T000000
+RDATE:19390430T000000
+RDATE:19400428T000000
+RDATE:19460428T020000
+RDATE:19470427T020000
+RDATE:19480425T020000
+RDATE:19490424T020000
+RDATE:19500430T020000
+RDATE:19510429T020000
+RDATE:19520427T020000
+RDATE:19530426T020000
+RDATE:19540425T020000
+RDATE:19550424T020000
+RDATE:19560429T020000
+RDATE:19570428T020000
+RDATE:19580427T020000
+RDATE:19590426T020000
+RDATE:19600424T020000
+RDATE:19610430T020000
+RDATE:19620429T020000
+RDATE:19630428T020000
+RDATE:19640426T020000
+RDATE:19650425T020000
+RDATE:19660424T020000
+RDATE:19670430T020000
+RDATE:19680428T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19740428T020000
+RDATE:19750427T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19170424T000000
+RDATE:19170424T000000
+RDATE:19181031T020000
+RDATE:19191025T023000
+RDATE:19201003T023000
+RDATE:19211002T023000
+RDATE:19221001T023000
+RDATE:19240928T023000
+RDATE:19250927T023000
+RDATE:19260926T023000
+RDATE:19270925T000000
+RDATE:19280930T000000
+RDATE:19290929T000000
+RDATE:19300928T000000
+RDATE:19310927T000000
+RDATE:19320925T000000
+RDATE:19331001T000000
+RDATE:19340930T000000
+RDATE:19350929T000000
+RDATE:19360927T000000
+RDATE:19370926T000000
+RDATE:19380925T000000
+RDATE:19390924T000000
+RDATE:19450930T020000
+RDATE:19460929T020000
+RDATE:19470928T020000
+RDATE:19480926T020000
+RDATE:19491030T020000
+RDATE:19501029T020000
+RDATE:19510930T020000
+RDATE:19520928T020000
+RDATE:19530927T020000
+RDATE:19540926T020000
+RDATE:19550925T020000
+RDATE:19560930T020000
+RDATE:19571027T020000
+RDATE:19581026T020000
+RDATE:19591025T020000
+RDATE:19601030T020000
+RDATE:19611029T020000
+RDATE:19621028T020000
+RDATE:19631027T020000
+RDATE:19641025T020000
+RDATE:19651031T020000
+RDATE:19661030T020000
+RDATE:19671029T020000
+RDATE:19681027T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19180101T000000
+RDATE:19180101T000000
+RDATE:19190101T000000
+RDATE:19460101T000000
+RDATE:19740101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:EWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:EPT
+DTSTART:19450814T190000
+RDATE:19450814T190000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Montserrat.ics b/libkcal/libical/zoneinfo/America/Montserrat.ics
new file mode 100644
index 00000000..178aed90
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Montserrat.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Montserrat
+X-LIC-LOCATION:America/Montserrat
+BEGIN:STANDARD
+TZOFFSETFROM:-040852
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19110701T000100
+RDATE:19110701T000100
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Nassau.ics b/libkcal/libical/zoneinfo/America/Nassau.ics
new file mode 100644
index 00000000..bba157cb
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Nassau.ics
@@ -0,0 +1,134 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Nassau
+X-LIC-LOCATION:America/Nassau
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-050924
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19120302T000000
+RDATE:19120302T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19640426T020000
+RDATE:19640426T020000
+RDATE:19650425T020000
+RDATE:19660424T020000
+RDATE:19670430T020000
+RDATE:19680428T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19740428T020000
+RDATE:19750427T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19641025T020000
+RDATE:19641025T020000
+RDATE:19651031T020000
+RDATE:19661030T020000
+RDATE:19671029T020000
+RDATE:19681027T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19760101T000000
+RDATE:19760101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/New_York.ics b/libkcal/libical/zoneinfo/America/New_York.ics
new file mode 100644
index 00000000..5167c498
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/New_York.ics
@@ -0,0 +1,236 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/New_York
+X-LIC-LOCATION:America/New_York
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-045602
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:18831118T120358
+RDATE:18831118T120358
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19180331T020000
+RDATE:19180331T020000
+RDATE:19190330T020000
+RDATE:19200328T020000
+RDATE:19210424T020000
+RDATE:19220430T020000
+RDATE:19230429T020000
+RDATE:19240427T020000
+RDATE:19250426T020000
+RDATE:19260425T020000
+RDATE:19270424T020000
+RDATE:19280429T020000
+RDATE:19290428T020000
+RDATE:19300427T020000
+RDATE:19310426T020000
+RDATE:19320424T020000
+RDATE:19330430T020000
+RDATE:19340429T020000
+RDATE:19350428T020000
+RDATE:19360426T020000
+RDATE:19370425T020000
+RDATE:19380424T020000
+RDATE:19390430T020000
+RDATE:19400428T020000
+RDATE:19410427T020000
+RDATE:19460428T020000
+RDATE:19470427T020000
+RDATE:19480425T020000
+RDATE:19490424T020000
+RDATE:19500430T020000
+RDATE:19510429T020000
+RDATE:19520427T020000
+RDATE:19530426T020000
+RDATE:19540425T020000
+RDATE:19550424T020000
+RDATE:19560429T020000
+RDATE:19570428T020000
+RDATE:19580427T020000
+RDATE:19590426T020000
+RDATE:19600424T020000
+RDATE:19610430T020000
+RDATE:19620429T020000
+RDATE:19630428T020000
+RDATE:19640426T020000
+RDATE:19650425T020000
+RDATE:19660424T020000
+RDATE:19670430T020000
+RDATE:19680428T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19740106T020000
+RDATE:19750223T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19181027T020000
+RDATE:19181027T020000
+RDATE:19191026T020000
+RDATE:19201031T020000
+RDATE:19210925T020000
+RDATE:19220924T020000
+RDATE:19230930T020000
+RDATE:19240928T020000
+RDATE:19250927T020000
+RDATE:19260926T020000
+RDATE:19270925T020000
+RDATE:19280930T020000
+RDATE:19290929T020000
+RDATE:19300928T020000
+RDATE:19310927T020000
+RDATE:19320925T020000
+RDATE:19330924T020000
+RDATE:19340930T020000
+RDATE:19350929T020000
+RDATE:19360927T020000
+RDATE:19370926T020000
+RDATE:19380925T020000
+RDATE:19390924T020000
+RDATE:19400929T020000
+RDATE:19410928T020000
+RDATE:19450930T020000
+RDATE:19460929T020000
+RDATE:19470928T020000
+RDATE:19480926T020000
+RDATE:19490925T020000
+RDATE:19500924T020000
+RDATE:19510930T020000
+RDATE:19520928T020000
+RDATE:19530927T020000
+RDATE:19540926T020000
+RDATE:19551030T020000
+RDATE:19561028T020000
+RDATE:19571027T020000
+RDATE:19581026T020000
+RDATE:19591025T020000
+RDATE:19601030T020000
+RDATE:19611029T020000
+RDATE:19621028T020000
+RDATE:19631027T020000
+RDATE:19641025T020000
+RDATE:19651031T020000
+RDATE:19661030T020000
+RDATE:19671029T020000
+RDATE:19681027T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19200101T000000
+RDATE:19200101T000000
+RDATE:19420101T000000
+RDATE:19460101T000000
+RDATE:19670101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:EPT
+DTSTART:19450814T190000
+RDATE:19450814T190000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Nipigon.ics b/libkcal/libical/zoneinfo/America/Nipigon.ics
new file mode 100644
index 00000000..d82cb2fe
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Nipigon.ics
@@ -0,0 +1,125 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Nipigon
+X-LIC-LOCATION:America/Nipigon
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-055304
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:18950101T000000
+RDATE:18950101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19180414T020000
+RDATE:19180414T020000
+RDATE:19400929T000000
+RDATE:19740428T020000
+RDATE:19750427T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19181031T020000
+RDATE:19181031T020000
+RDATE:19450930T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:EWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:EPT
+DTSTART:19450814T190000
+RDATE:19450814T190000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Nome.ics b/libkcal/libical/zoneinfo/America/Nome.ics
new file mode 100644
index 00000000..a3965435
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Nome.ics
@@ -0,0 +1,186 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Nome
+X-LIC-LOCATION:America/Nome
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0800
+TZNAME:AKDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0900
+TZNAME:AKST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+125821
+TZOFFSETTO:-110138
+TZNAME:LMT
+DTSTART:18671018T000000
+RDATE:18671018T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-110138
+TZOFFSETTO:-1100
+TZNAME:NST
+DTSTART:19000820T120000
+RDATE:19000820T120000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-1100
+TZOFFSETTO:-1100
+TZNAME:NST
+DTSTART:19420101T000000
+RDATE:19420101T000000
+RDATE:19460101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-1100
+TZOFFSETTO:-1000
+TZNAME:NWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-1000
+TZOFFSETTO:-1000
+TZNAME:NPT
+DTSTART:19450814T130000
+RDATE:19450814T130000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-1000
+TZOFFSETTO:-1100
+TZNAME:NST
+DTSTART:19450930T020000
+RDATE:19450930T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-1100
+TZOFFSETTO:-1100
+TZNAME:BST
+DTSTART:19670401T000000
+RDATE:19670401T000000
+RDATE:19690101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-1100
+TZOFFSETTO:-1000
+TZNAME:BDT
+DTSTART:19690427T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19740106T020000
+RDATE:19750223T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-1000
+TZOFFSETTO:-1100
+TZNAME:BST
+DTSTART:19691026T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-1000
+TZOFFSETTO:-0900
+TZNAME:YST
+DTSTART:19831030T020000
+RDATE:19831030T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0900
+TZNAME:AKST
+DTSTART:19831130T000000
+RDATE:19831130T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0800
+TZNAME:AKDT
+DTSTART:19840429T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0900
+TZNAME:AKST
+DTSTART:19841028T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Noronha.ics b/libkcal/libical/zoneinfo/America/Noronha.ics
new file mode 100644
index 00000000..f73e93ec
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Noronha.ics
@@ -0,0 +1,75 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Noronha
+X-LIC-LOCATION:America/Noronha
+BEGIN:STANDARD
+TZOFFSETFROM:-020940
+TZOFFSETTO:-0200
+TZNAME:FNT
+DTSTART:19140101T000000
+RDATE:19140101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0100
+TZNAME:FNST
+DTSTART:19311003T110000
+RDATE:19311003T110000
+RDATE:19321003T000000
+RDATE:19491201T000000
+RDATE:19501201T000000
+RDATE:19511201T000000
+RDATE:19521201T000000
+RDATE:19631209T000000
+RDATE:19650131T000000
+RDATE:19651201T000000
+RDATE:19661101T000000
+RDATE:19671101T000000
+RDATE:19851102T000000
+RDATE:19861025T000000
+RDATE:19871025T000000
+RDATE:19881016T000000
+RDATE:19891015T000000
+RDATE:19991003T000000
+RDATE:20001008T000000
+RDATE:20011014T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0100
+TZOFFSETTO:-0200
+TZNAME:FNT
+DTSTART:19320401T000000
+RDATE:19320401T000000
+RDATE:19330401T000000
+RDATE:19500416T010000
+RDATE:19510401T000000
+RDATE:19520401T000000
+RDATE:19530301T000000
+RDATE:19640301T000000
+RDATE:19650331T000000
+RDATE:19660301T000000
+RDATE:19670301T000000
+RDATE:19680301T000000
+RDATE:19860315T000000
+RDATE:19870214T000000
+RDATE:19880207T000000
+RDATE:19890129T000000
+RDATE:19900211T000000
+RDATE:20000227T000000
+RDATE:20001015T000000
+RDATE:20020217T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0200
+TZNAME:FNT
+DTSTART:19900917T000000
+RDATE:19900917T000000
+RDATE:19990930T000000
+RDATE:20010913T000000
+RDATE:20021001T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/North_Dakota/Center.ics b/libkcal/libical/zoneinfo/America/North_Dakota/Center.ics
new file mode 100644
index 00000000..8270353c
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/North_Dakota/Center.ics
@@ -0,0 +1,158 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/North_Dakota/Center
+X-LIC-LOCATION:America/North_Dakota/Center
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-064512
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:18831118T121448
+RDATE:18831118T121448
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:19180331T020000
+RDATE:19180331T020000
+RDATE:19190330T020000
+RDATE:19670430T020000
+RDATE:19680428T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19740106T020000
+RDATE:19750223T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19181027T020000
+RDATE:19181027T020000
+RDATE:19191026T020000
+RDATE:19450930T020000
+RDATE:19671029T020000
+RDATE:19681027T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:MPT
+DTSTART:19450814T170000
+RDATE:19450814T170000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19921025T020000
+RDATE:19921025T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19930404T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19931031T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/North_Dakota/New_Salem.ics b/libkcal/libical/zoneinfo/America/North_Dakota/New_Salem.ics
new file mode 100644
index 00000000..45eb0175
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/North_Dakota/New_Salem.ics
@@ -0,0 +1,158 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/North_Dakota/New_Salem
+X-LIC-LOCATION:America/North_Dakota/New_Salem
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-064539
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:18831118T121421
+RDATE:18831118T121421
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:19180331T020000
+RDATE:19180331T020000
+RDATE:19190330T020000
+RDATE:19670430T020000
+RDATE:19680428T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19740106T020000
+RDATE:19750223T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19181027T020000
+RDATE:19181027T020000
+RDATE:19191026T020000
+RDATE:19450930T020000
+RDATE:19671029T020000
+RDATE:19681027T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:MPT
+DTSTART:19450814T170000
+RDATE:19450814T170000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:20031026T020000
+RDATE:20031026T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:20040404T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:20041031T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Panama.ics b/libkcal/libical/zoneinfo/America/Panama.ics
new file mode 100644
index 00000000..b31674d7
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Panama.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Panama
+X-LIC-LOCATION:America/Panama
+BEGIN:STANDARD
+TZOFFSETFROM:-051808
+TZOFFSETTO:-051936
+TZNAME:CMT
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-051936
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19080422T000000
+RDATE:19080422T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Pangnirtung.ics b/libkcal/libical/zoneinfo/America/Pangnirtung.ics
new file mode 100644
index 00000000..e73db19c
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Pangnirtung.ics
@@ -0,0 +1,160 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Pangnirtung
+X-LIC-LOCATION:America/Pangnirtung
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19210101T000000
+RDATE:19210101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:AWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:APT
+DTSTART:19450814T200000
+RDATE:19450814T200000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19450930T020000
+RDATE:19450930T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0200
+TZNAME:ADDT
+DTSTART:19650425T000000
+RDATE:19650425T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19651031T020000
+RDATE:19651031T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ADT
+DTSTART:19800427T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19950402T020000
+RDATE:19950402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19951029T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19960407T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19991031T020000
+RDATE:19991031T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:20000402T020000
+RDATE:20000402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:20001029T020000
+RDATE:20001029T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Paramaribo.ics b/libkcal/libical/zoneinfo/America/Paramaribo.ics
new file mode 100644
index 00000000..1a0afa2f
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Paramaribo.ics
@@ -0,0 +1,43 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Paramaribo
+X-LIC-LOCATION:America/Paramaribo
+BEGIN:STANDARD
+TZOFFSETFROM:-034040
+TZOFFSETTO:-034052
+TZNAME:PMT
+DTSTART:19110101T000000
+RDATE:19110101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-034052
+TZOFFSETTO:-034036
+TZNAME:PMT
+DTSTART:19350101T000000
+RDATE:19350101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-034036
+TZOFFSETTO:-0330
+TZNAME:NEGT
+DTSTART:19451001T000000
+RDATE:19451001T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0330
+TZOFFSETTO:-0330
+TZNAME:SRT
+DTSTART:19751120T000000
+RDATE:19751120T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0330
+TZOFFSETTO:-0300
+TZNAME:SRT
+DTSTART:19841001T000000
+RDATE:19841001T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Phoenix.ics b/libkcal/libical/zoneinfo/America/Phoenix.ics
new file mode 100644
index 00000000..359a5c25
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Phoenix.ics
@@ -0,0 +1,51 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Phoenix
+X-LIC-LOCATION:America/Phoenix
+BEGIN:STANDARD
+TZOFFSETFROM:-072818
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:18831118T113142
+RDATE:18831118T113142
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:19180331T020000
+RDATE:19180331T020000
+RDATE:19190330T020000
+RDATE:19670430T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19181027T020000
+RDATE:19181027T020000
+RDATE:19191026T020000
+RDATE:19440101T000100
+RDATE:19441001T000100
+RDATE:19671029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+RDATE:19440401T000100
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19670101T000000
+RDATE:19670101T000000
+RDATE:19680321T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Port-au-Prince.ics b/libkcal/libical/zoneinfo/America/Port-au-Prince.ics
new file mode 100644
index 00000000..886e9273
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Port-au-Prince.ics
@@ -0,0 +1,68 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Port-au-Prince
+X-LIC-LOCATION:America/Port-au-Prince
+BEGIN:STANDARD
+TZOFFSETFROM:-044920
+TZOFFSETTO:-0449
+TZNAME:PPMT
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0449
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19170124T120000
+RDATE:19170124T120000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19830508T000000
+RDATE:19830508T000000
+RDATE:19840429T000000
+RDATE:19850428T000000
+RDATE:19860427T000000
+RDATE:19870426T000000
+RDATE:19880403T010000
+RDATE:19890402T010000
+RDATE:19900401T010000
+RDATE:19910407T010000
+RDATE:19920405T010000
+RDATE:19930404T010000
+RDATE:19940403T010000
+RDATE:19950402T010000
+RDATE:19960407T010000
+RDATE:19970406T010000
+RDATE:20050403T000000
+RDATE:20060402T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19831030T000000
+RDATE:19831030T000000
+RDATE:19841028T000000
+RDATE:19851027T000000
+RDATE:19861026T000000
+RDATE:19871025T000000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:20051030T000000
+RDATE:20061029T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Port_of_Spain.ics b/libkcal/libical/zoneinfo/America/Port_of_Spain.ics
new file mode 100644
index 00000000..2b8a39ae
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Port_of_Spain.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Port_of_Spain
+X-LIC-LOCATION:America/Port_of_Spain
+BEGIN:STANDARD
+TZOFFSETFROM:-040604
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19120302T000000
+RDATE:19120302T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Porto_Velho.ics b/libkcal/libical/zoneinfo/America/Porto_Velho.ics
new file mode 100644
index 00000000..2036bb9a
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Porto_Velho.ics
@@ -0,0 +1,62 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Porto_Velho
+X-LIC-LOCATION:America/Porto_Velho
+BEGIN:STANDARD
+TZOFFSETFROM:-041536
+TZOFFSETTO:-0400
+TZNAME:AMT
+DTSTART:19140101T000000
+RDATE:19140101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:AMST
+DTSTART:19311003T110000
+RDATE:19311003T110000
+RDATE:19321003T000000
+RDATE:19491201T000000
+RDATE:19501201T000000
+RDATE:19511201T000000
+RDATE:19521201T000000
+RDATE:19631209T000000
+RDATE:19650131T000000
+RDATE:19651201T000000
+RDATE:19661101T000000
+RDATE:19671101T000000
+RDATE:19851102T000000
+RDATE:19861025T000000
+RDATE:19871025T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AMT
+DTSTART:19320401T000000
+RDATE:19320401T000000
+RDATE:19330401T000000
+RDATE:19500416T010000
+RDATE:19510401T000000
+RDATE:19520401T000000
+RDATE:19530301T000000
+RDATE:19640301T000000
+RDATE:19650331T000000
+RDATE:19660301T000000
+RDATE:19670301T000000
+RDATE:19680301T000000
+RDATE:19860315T000000
+RDATE:19870214T000000
+RDATE:19880207T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AMT
+DTSTART:19880912T000000
+RDATE:19880912T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Puerto_Rico.ics b/libkcal/libical/zoneinfo/America/Puerto_Rico.ics
new file mode 100644
index 00000000..d8ad163a
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Puerto_Rico.ics
@@ -0,0 +1,43 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Puerto_Rico
+X-LIC-LOCATION:America/Puerto_Rico
+BEGIN:STANDARD
+TZOFFSETFROM:-042425
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:18990328T120000
+RDATE:18990328T120000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:AWT
+DTSTART:19420503T000000
+RDATE:19420503T000000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:APT
+DTSTART:19450814T200000
+RDATE:19450814T200000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19450930T020000
+RDATE:19450930T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19460101T000000
+RDATE:19460101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Rainy_River.ics b/libkcal/libical/zoneinfo/America/Rainy_River.ics
new file mode 100644
index 00000000..63eef3cb
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Rainy_River.ics
@@ -0,0 +1,125 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Rainy_River
+X-LIC-LOCATION:America/Rainy_River
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-061816
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:18950101T000000
+RDATE:18950101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19180414T020000
+RDATE:19180414T020000
+RDATE:19400929T000000
+RDATE:19740428T020000
+RDATE:19750427T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19181031T020000
+RDATE:19181031T020000
+RDATE:19450930T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CPT
+DTSTART:19450814T180000
+RDATE:19450814T180000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Rankin_Inlet.ics b/libkcal/libical/zoneinfo/America/Rankin_Inlet.ics
new file mode 100644
index 00000000..613981b1
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Rankin_Inlet.ics
@@ -0,0 +1,121 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Rankin_Inlet
+X-LIC-LOCATION:America/Rankin_Inlet
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19570101T000000
+RDATE:19570101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0400
+TZNAME:CDDT
+DTSTART:19650425T000000
+RDATE:19650425T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19651031T020000
+RDATE:19651031T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19800427T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19801026T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:20001029T020000
+RDATE:20001029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:20010401T020000
+RDATE:20010401T020000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Recife.ics b/libkcal/libical/zoneinfo/America/Recife.ics
new file mode 100644
index 00000000..f7e938dd
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Recife.ics
@@ -0,0 +1,75 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Recife
+X-LIC-LOCATION:America/Recife
+BEGIN:STANDARD
+TZOFFSETFROM:-021936
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:19140101T000000
+RDATE:19140101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:BRST
+DTSTART:19311003T110000
+RDATE:19311003T110000
+RDATE:19321003T000000
+RDATE:19491201T000000
+RDATE:19501201T000000
+RDATE:19511201T000000
+RDATE:19521201T000000
+RDATE:19631209T000000
+RDATE:19650131T000000
+RDATE:19651201T000000
+RDATE:19661101T000000
+RDATE:19671101T000000
+RDATE:19851102T000000
+RDATE:19861025T000000
+RDATE:19871025T000000
+RDATE:19881016T000000
+RDATE:19891015T000000
+RDATE:19991003T000000
+RDATE:20001008T000000
+RDATE:20011014T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:19320401T000000
+RDATE:19320401T000000
+RDATE:19330401T000000
+RDATE:19500416T010000
+RDATE:19510401T000000
+RDATE:19520401T000000
+RDATE:19530301T000000
+RDATE:19640301T000000
+RDATE:19650331T000000
+RDATE:19660301T000000
+RDATE:19670301T000000
+RDATE:19680301T000000
+RDATE:19860315T000000
+RDATE:19870214T000000
+RDATE:19880207T000000
+RDATE:19890129T000000
+RDATE:19900211T000000
+RDATE:20000227T000000
+RDATE:20001015T000000
+RDATE:20020217T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:19900917T000000
+RDATE:19900917T000000
+RDATE:19990930T000000
+RDATE:20010913T000000
+RDATE:20021001T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Regina.ics b/libkcal/libical/zoneinfo/America/Regina.ics
new file mode 100644
index 00000000..fe23ab8c
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Regina.ics
@@ -0,0 +1,97 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Regina
+X-LIC-LOCATION:America/Regina
+BEGIN:STANDARD
+TZOFFSETFROM:-065836
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19050901T000000
+RDATE:19050901T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:19180414T020000
+RDATE:19180414T020000
+RDATE:19300504T000000
+RDATE:19310503T000000
+RDATE:19320501T000000
+RDATE:19330507T000000
+RDATE:19340506T000000
+RDATE:19370411T000000
+RDATE:19380410T000000
+RDATE:19390409T000000
+RDATE:19400414T000000
+RDATE:19410413T000000
+RDATE:19460414T020000
+RDATE:19470427T020000
+RDATE:19480425T020000
+RDATE:19490424T020000
+RDATE:19500430T020000
+RDATE:19510429T020000
+RDATE:19520427T020000
+RDATE:19530426T020000
+RDATE:19540425T020000
+RDATE:19550424T020000
+RDATE:19560429T020000
+RDATE:19570428T020000
+RDATE:19590426T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19181031T020000
+RDATE:19181031T020000
+RDATE:19301005T000000
+RDATE:19311004T000000
+RDATE:19321002T000000
+RDATE:19331001T000000
+RDATE:19341007T000000
+RDATE:19371010T000000
+RDATE:19381002T000000
+RDATE:19391008T000000
+RDATE:19401013T000000
+RDATE:19411012T000000
+RDATE:19450930T020000
+RDATE:19461013T020000
+RDATE:19470928T020000
+RDATE:19480926T020000
+RDATE:19490925T020000
+RDATE:19500924T020000
+RDATE:19510930T020000
+RDATE:19520928T020000
+RDATE:19530927T020000
+RDATE:19540926T020000
+RDATE:19550925T020000
+RDATE:19560930T020000
+RDATE:19570929T020000
+RDATE:19591025T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:MPT
+DTSTART:19450814T170000
+RDATE:19450814T170000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19600424T020000
+RDATE:19600424T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Resolute.ics b/libkcal/libical/zoneinfo/America/Resolute.ics
new file mode 100644
index 00000000..73729801
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Resolute.ics
@@ -0,0 +1,107 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Resolute
+X-LIC-LOCATION:America/Resolute
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19470831T000000
+RDATE:19470831T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0400
+TZNAME:CDDT
+DTSTART:19650425T000000
+RDATE:19650425T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19651031T020000
+RDATE:19651031T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19800427T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19801026T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:20001029T020000
+RDATE:20001029T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:20010401T020000
+RDATE:20010401T020000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Rio_Branco.ics b/libkcal/libical/zoneinfo/America/Rio_Branco.ics
new file mode 100644
index 00000000..ec3a8644
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Rio_Branco.ics
@@ -0,0 +1,62 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Rio_Branco
+X-LIC-LOCATION:America/Rio_Branco
+BEGIN:STANDARD
+TZOFFSETFROM:-043112
+TZOFFSETTO:-0500
+TZNAME:ACT
+DTSTART:19140101T000000
+RDATE:19140101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:ACST
+DTSTART:19311003T110000
+RDATE:19311003T110000
+RDATE:19321003T000000
+RDATE:19491201T000000
+RDATE:19501201T000000
+RDATE:19511201T000000
+RDATE:19521201T000000
+RDATE:19631209T000000
+RDATE:19650131T000000
+RDATE:19651201T000000
+RDATE:19661101T000000
+RDATE:19671101T000000
+RDATE:19851102T000000
+RDATE:19861025T000000
+RDATE:19871025T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:ACT
+DTSTART:19320401T000000
+RDATE:19320401T000000
+RDATE:19330401T000000
+RDATE:19500416T010000
+RDATE:19510401T000000
+RDATE:19520401T000000
+RDATE:19530301T000000
+RDATE:19640301T000000
+RDATE:19650331T000000
+RDATE:19660301T000000
+RDATE:19670301T000000
+RDATE:19680301T000000
+RDATE:19860315T000000
+RDATE:19870214T000000
+RDATE:19880207T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:ACT
+DTSTART:19880912T000000
+RDATE:19880912T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Santiago.ics b/libkcal/libical/zoneinfo/America/Santiago.ics
new file mode 100644
index 00000000..5132714f
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Santiago.ics
@@ -0,0 +1,193 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Santiago
+X-LIC-LOCATION:America/Santiago
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:CLST
+DTSTART:19991010T000000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYMONTHDAY=9,10,11,12,13,14,15;BYDAY=SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:CLT
+DTSTART:20090315T000000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYMONTHDAY=9,10,11,12,13,14,15;BYDAY=SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-044246
+TZOFFSETTO:-044246
+TZNAME:SMT
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-044246
+TZOFFSETTO:-0500
+TZNAME:CLT
+DTSTART:19100101T000000
+RDATE:19100101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-044246
+TZNAME:SMT
+DTSTART:19160701T000000
+RDATE:19160701T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-044246
+TZOFFSETTO:-0400
+TZNAME:CLT
+DTSTART:19180901T000000
+RDATE:19180901T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-044246
+TZNAME:SMT
+DTSTART:19190701T000000
+RDATE:19190701T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-044246
+TZOFFSETTO:-0400
+TZNAME:CLST
+DTSTART:19270901T000000
+RDATE:19270901T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:CLT
+DTSTART:19280401T000000
+RDATE:19280401T000000
+RDATE:19290401T000000
+RDATE:19300401T000000
+RDATE:19310401T000000
+RDATE:19320401T000000
+RDATE:19420601T000000
+RDATE:19460831T230000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:CLST
+DTSTART:19280901T000000
+RDATE:19280901T000000
+RDATE:19290901T000000
+RDATE:19300901T000000
+RDATE:19310901T000000
+RDATE:19320901T000000
+RDATE:19420801T000000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:CLST
+DTSTART:19460715T000000
+RDATE:19460715T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CLT
+DTSTART:19470331T230000
+RDATE:19470331T230000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:CLT
+DTSTART:19470522T000000
+RDATE:19470522T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:CLST
+DTSTART:19681103T000000
+RDATE:19681103T000000
+RDATE:19691123T000000
+RDATE:19701011T000000
+RDATE:19711010T000000
+RDATE:19721015T000000
+RDATE:19730930T000000
+RDATE:19741013T000000
+RDATE:19751012T000000
+RDATE:19761010T000000
+RDATE:19771009T000000
+RDATE:19781015T000000
+RDATE:19791014T000000
+RDATE:19801012T000000
+RDATE:19811011T000000
+RDATE:19821010T000000
+RDATE:19831009T000000
+RDATE:19841014T000000
+RDATE:19851013T000000
+RDATE:19861012T000000
+RDATE:19871011T000000
+RDATE:19881002T000000
+RDATE:19891015T000000
+RDATE:19900916T000000
+RDATE:19911013T000000
+RDATE:19921011T000000
+RDATE:19931010T000000
+RDATE:19941009T000000
+RDATE:19951015T000000
+RDATE:19961013T000000
+RDATE:19971012T000000
+RDATE:19980927T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:CLT
+DTSTART:19690330T000000
+RDATE:19690330T000000
+RDATE:19700329T000000
+RDATE:19710314T000000
+RDATE:19720312T000000
+RDATE:19730311T000000
+RDATE:19740310T000000
+RDATE:19750309T000000
+RDATE:19760314T000000
+RDATE:19770313T000000
+RDATE:19780312T000000
+RDATE:19790311T000000
+RDATE:19800309T000000
+RDATE:19810315T000000
+RDATE:19820314T000000
+RDATE:19830313T000000
+RDATE:19840311T000000
+RDATE:19850310T000000
+RDATE:19860309T000000
+RDATE:19870412T000000
+RDATE:19880313T000000
+RDATE:19890312T000000
+RDATE:19900318T000000
+RDATE:19910310T000000
+RDATE:19920315T000000
+RDATE:19930314T000000
+RDATE:19940313T000000
+RDATE:19950312T000000
+RDATE:19960310T000000
+RDATE:19970330T000000
+RDATE:19980315T000000
+RDATE:19990404T000000
+RDATE:20000312T000000
+RDATE:20010311T000000
+RDATE:20020310T000000
+RDATE:20030309T000000
+RDATE:20040314T000000
+RDATE:20050313T000000
+RDATE:20060312T000000
+RDATE:20070311T000000
+RDATE:20080330T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Santo_Domingo.ics b/libkcal/libical/zoneinfo/America/Santo_Domingo.ics
new file mode 100644
index 00000000..49772186
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Santo_Domingo.ics
@@ -0,0 +1,67 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Santo_Domingo
+X-LIC-LOCATION:America/Santo_Domingo
+BEGIN:STANDARD
+TZOFFSETFROM:-043936
+TZOFFSETTO:-0440
+TZNAME:SDMT
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0440
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19330401T120000
+RDATE:19330401T120000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19661030T000000
+RDATE:19661030T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19670228T000000
+RDATE:19670228T000000
+RDATE:20001029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0430
+TZNAME:EHDT
+DTSTART:19691026T000000
+RDATE:19691026T000000
+RDATE:19701025T000000
+RDATE:19711031T000000
+RDATE:19721029T000000
+RDATE:19731028T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0430
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19700221T000000
+RDATE:19700221T000000
+RDATE:19710120T000000
+RDATE:19720121T000000
+RDATE:19730121T000000
+RDATE:19740121T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19741027T000000
+RDATE:19741027T000000
+RDATE:20001203T010000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Sao_Paulo.ics b/libkcal/libical/zoneinfo/America/Sao_Paulo.ics
new file mode 100644
index 00000000..9f9ff52b
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Sao_Paulo.ics
@@ -0,0 +1,114 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Sao_Paulo
+X-LIC-LOCATION:America/Sao_Paulo
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:BRST
+DTSTART:20071014T000000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:20080217T000000
+RRULE:FREQ=YEARLY;BYMONTH=2;BYDAY=3SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-030628
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:19140101T000000
+RDATE:19140101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:BRST
+DTSTART:19311003T110000
+RDATE:19311003T110000
+RDATE:19321003T000000
+RDATE:19491201T000000
+RDATE:19501201T000000
+RDATE:19511201T000000
+RDATE:19521201T000000
+RDATE:19631023T000000
+RDATE:19650131T000000
+RDATE:19651201T000000
+RDATE:19661101T000000
+RDATE:19671101T000000
+RDATE:19851102T000000
+RDATE:19861025T000000
+RDATE:19871025T000000
+RDATE:19881016T000000
+RDATE:19891015T000000
+RDATE:19901021T000000
+RDATE:19911020T000000
+RDATE:19921025T000000
+RDATE:19931017T000000
+RDATE:19941016T000000
+RDATE:19951015T000000
+RDATE:19961006T000000
+RDATE:19971006T000000
+RDATE:19981011T000000
+RDATE:19991003T000000
+RDATE:20001008T000000
+RDATE:20011014T000000
+RDATE:20021103T000000
+RDATE:20031019T000000
+RDATE:20041102T000000
+RDATE:20051016T000000
+RDATE:20061105T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:19320401T000000
+RDATE:19320401T000000
+RDATE:19330401T000000
+RDATE:19500416T010000
+RDATE:19510401T000000
+RDATE:19520401T000000
+RDATE:19530301T000000
+RDATE:19640301T000000
+RDATE:19650331T000000
+RDATE:19660301T000000
+RDATE:19670301T000000
+RDATE:19680301T000000
+RDATE:19860315T000000
+RDATE:19870214T000000
+RDATE:19880207T000000
+RDATE:19890129T000000
+RDATE:19900211T000000
+RDATE:19910217T000000
+RDATE:19920209T000000
+RDATE:19930131T000000
+RDATE:19940220T000000
+RDATE:19950219T000000
+RDATE:19960211T000000
+RDATE:19970216T000000
+RDATE:19980301T000000
+RDATE:19990221T000000
+RDATE:20000227T000000
+RDATE:20010218T000000
+RDATE:20020217T000000
+RDATE:20030216T000000
+RDATE:20040215T000000
+RDATE:20050220T000000
+RDATE:20060219T000000
+RDATE:20070225T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0200
+TZNAME:BRST
+DTSTART:19640101T000000
+RDATE:19640101T000000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Scoresbysund.ics b/libkcal/libical/zoneinfo/America/Scoresbysund.ics
new file mode 100644
index 00000000..b8b3f298
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Scoresbysund.ics
@@ -0,0 +1,71 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Scoresbysund
+X-LIC-LOCATION:America/Scoresbysund
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0100
+TZOFFSETTO:+0000
+TZNAME:EGST
+DTSTART:19820328T000000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:-0100
+TZNAME:EGT
+DTSTART:19961027T010000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-012752
+TZOFFSETTO:-0200
+TZNAME:CGT
+DTSTART:19160728T000000
+RDATE:19160728T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0100
+TZNAME:CGST
+DTSTART:19800406T020000
+RDATE:19800406T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0100
+TZOFFSETTO:-0200
+TZNAME:CGT
+DTSTART:19800928T030000
+RDATE:19800928T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0200
+TZOFFSETTO:+0000
+TZNAME:EGST
+DTSTART:19810329T000000
+RDATE:19810329T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:-0100
+TZNAME:EGT
+DTSTART:19810927T010000
+RDATE:19810927T010000
+RDATE:19820926T010000
+RDATE:19830925T010000
+RDATE:19840930T010000
+RDATE:19850929T010000
+RDATE:19860928T010000
+RDATE:19870927T010000
+RDATE:19880925T010000
+RDATE:19890924T010000
+RDATE:19900930T010000
+RDATE:19910929T010000
+RDATE:19920927T010000
+RDATE:19930926T010000
+RDATE:19940925T010000
+RDATE:19950924T010000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Shiprock.ics b/libkcal/libical/zoneinfo/America/Shiprock.ics
new file mode 100644
index 00000000..f79d50cc
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Shiprock.ics
@@ -0,0 +1,158 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Shiprock
+X-LIC-LOCATION:America/Shiprock
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-065956
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:18831118T120004
+RDATE:18831118T120004
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:19180331T020000
+RDATE:19180331T020000
+RDATE:19190330T020000
+RDATE:19200328T020000
+RDATE:19210327T020000
+RDATE:19650425T020000
+RDATE:19660424T020000
+RDATE:19670430T020000
+RDATE:19680428T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19740106T020000
+RDATE:19750223T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19181027T020000
+RDATE:19181027T020000
+RDATE:19191026T020000
+RDATE:19201031T020000
+RDATE:19210522T020000
+RDATE:19450930T020000
+RDATE:19651031T020000
+RDATE:19661030T020000
+RDATE:19671029T020000
+RDATE:19681027T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19200101T000000
+RDATE:19200101T000000
+RDATE:19420101T000000
+RDATE:19460101T000000
+RDATE:19670101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:MPT
+DTSTART:19450814T170000
+RDATE:19450814T170000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/St_Barthelemy.ics b/libkcal/libical/zoneinfo/America/St_Barthelemy.ics
new file mode 100644
index 00000000..97a1e4e8
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/St_Barthelemy.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/St_Barthelemy
+X-LIC-LOCATION:America/St_Barthelemy
+BEGIN:STANDARD
+TZOFFSETFROM:-040608
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19110608T000000
+RDATE:19110608T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/St_Johns.ics b/libkcal/libical/zoneinfo/America/St_Johns.ics
new file mode 100644
index 00000000..bb5f01cc
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/St_Johns.ics
@@ -0,0 +1,268 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/St_Johns
+X-LIC-LOCATION:America/St_Johns
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0330
+TZOFFSETTO:-0230
+TZNAME:NDT
+DTSTART:20070311T000100
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0230
+TZOFFSETTO:-0330
+TZNAME:NST
+DTSTART:20071104T000100
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-033052
+TZOFFSETTO:-033052
+TZNAME:NST
+DTSTART:18840101T000000
+RDATE:18840101T000000
+RDATE:19180101T000000
+RDATE:19190101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-033052
+TZOFFSETTO:-023052
+TZNAME:NDT
+DTSTART:19170408T020000
+RDATE:19170408T020000
+RDATE:19180414T020000
+RDATE:19190505T230000
+RDATE:19200502T230000
+RDATE:19210501T230000
+RDATE:19220507T230000
+RDATE:19230506T230000
+RDATE:19240504T230000
+RDATE:19250503T230000
+RDATE:19260502T230000
+RDATE:19270501T230000
+RDATE:19280506T230000
+RDATE:19290505T230000
+RDATE:19300504T230000
+RDATE:19310503T230000
+RDATE:19320501T230000
+RDATE:19330507T230000
+RDATE:19340506T230000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-023052
+TZOFFSETTO:-033052
+TZNAME:NST
+DTSTART:19170917T020000
+RDATE:19170917T020000
+RDATE:19181031T020000
+RDATE:19190812T230000
+RDATE:19201031T230000
+RDATE:19211030T230000
+RDATE:19221029T230000
+RDATE:19231028T230000
+RDATE:19241026T230000
+RDATE:19251025T230000
+RDATE:19261031T230000
+RDATE:19271030T230000
+RDATE:19281028T230000
+RDATE:19291027T230000
+RDATE:19301026T230000
+RDATE:19311025T230000
+RDATE:19321030T230000
+RDATE:19331029T230000
+RDATE:19341028T230000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-033052
+TZOFFSETTO:-0330
+TZNAME:NST
+DTSTART:19350330T000000
+RDATE:19350330T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0330
+TZOFFSETTO:-0230
+TZNAME:NDT
+DTSTART:19350505T230000
+RDATE:19350505T230000
+RDATE:19360511T000000
+RDATE:19370510T000000
+RDATE:19380509T000000
+RDATE:19390515T000000
+RDATE:19400513T000000
+RDATE:19410512T000000
+RDATE:19460512T020000
+RDATE:19470511T020000
+RDATE:19480509T020000
+RDATE:19490508T020000
+RDATE:19500514T020000
+RDATE:19510429T020000
+RDATE:19520427T020000
+RDATE:19530426T020000
+RDATE:19540425T020000
+RDATE:19550424T020000
+RDATE:19560429T020000
+RDATE:19570428T020000
+RDATE:19580427T020000
+RDATE:19590426T020000
+RDATE:19600424T020000
+RDATE:19610430T020000
+RDATE:19620429T020000
+RDATE:19630428T020000
+RDATE:19640426T020000
+RDATE:19650425T020000
+RDATE:19660424T020000
+RDATE:19670430T020000
+RDATE:19680428T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19740428T020000
+RDATE:19750427T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T000100
+RDATE:19890402T000100
+RDATE:19900401T000100
+RDATE:19910407T000100
+RDATE:19920405T000100
+RDATE:19930404T000100
+RDATE:19940403T000100
+RDATE:19950402T000100
+RDATE:19960407T000100
+RDATE:19970406T000100
+RDATE:19980405T000100
+RDATE:19990404T000100
+RDATE:20000402T000100
+RDATE:20010401T000100
+RDATE:20020407T000100
+RDATE:20030406T000100
+RDATE:20040404T000100
+RDATE:20050403T000100
+RDATE:20060402T000100
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0230
+TZOFFSETTO:-0330
+TZNAME:NST
+DTSTART:19351027T230000
+RDATE:19351027T230000
+RDATE:19361005T000000
+RDATE:19371004T000000
+RDATE:19381003T000000
+RDATE:19391002T000000
+RDATE:19401007T000000
+RDATE:19411006T000000
+RDATE:19450930T020000
+RDATE:19461006T020000
+RDATE:19471005T020000
+RDATE:19481003T020000
+RDATE:19491002T020000
+RDATE:19501008T020000
+RDATE:19510930T020000
+RDATE:19520928T020000
+RDATE:19530927T020000
+RDATE:19540926T020000
+RDATE:19550925T020000
+RDATE:19560930T020000
+RDATE:19570929T020000
+RDATE:19580928T020000
+RDATE:19590927T020000
+RDATE:19601030T020000
+RDATE:19611029T020000
+RDATE:19621028T020000
+RDATE:19631027T020000
+RDATE:19641025T020000
+RDATE:19651031T020000
+RDATE:19661030T020000
+RDATE:19671029T020000
+RDATE:19681027T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T000100
+RDATE:19891029T000100
+RDATE:19901028T000100
+RDATE:19911027T000100
+RDATE:19921025T000100
+RDATE:19931031T000100
+RDATE:19941030T000100
+RDATE:19951029T000100
+RDATE:19961027T000100
+RDATE:19971026T000100
+RDATE:19981025T000100
+RDATE:19991031T000100
+RDATE:20001029T000100
+RDATE:20011028T000100
+RDATE:20021027T000100
+RDATE:20031026T000100
+RDATE:20041031T000100
+RDATE:20051030T000100
+RDATE:20061029T000100
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0330
+TZOFFSETTO:-0230
+TZNAME:NWT
+DTSTART:19420511T000000
+RDATE:19420511T000000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0230
+TZOFFSETTO:-0230
+TZNAME:NPT
+DTSTART:19450814T203000
+RDATE:19450814T203000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0330
+TZOFFSETTO:-0330
+TZNAME:NST
+DTSTART:19460101T000000
+RDATE:19460101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0330
+TZOFFSETTO:-0130
+TZNAME:NDDT
+DTSTART:19880403T000100
+RDATE:19880403T000100
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0130
+TZOFFSETTO:-0330
+TZNAME:NST
+DTSTART:19881030T000100
+RDATE:19881030T000100
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/St_Kitts.ics b/libkcal/libical/zoneinfo/America/St_Kitts.ics
new file mode 100644
index 00000000..2860c855
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/St_Kitts.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/St_Kitts
+X-LIC-LOCATION:America/St_Kitts
+BEGIN:STANDARD
+TZOFFSETFROM:-041052
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19120302T000000
+RDATE:19120302T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/St_Lucia.ics b/libkcal/libical/zoneinfo/America/St_Lucia.ics
new file mode 100644
index 00000000..805c2f96
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/St_Lucia.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/St_Lucia
+X-LIC-LOCATION:America/St_Lucia
+BEGIN:STANDARD
+TZOFFSETFROM:-0404
+TZOFFSETTO:-0404
+TZNAME:CMT
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0404
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19120101T000000
+RDATE:19120101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/St_Thomas.ics b/libkcal/libical/zoneinfo/America/St_Thomas.ics
new file mode 100644
index 00000000..35b110da
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/St_Thomas.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/St_Thomas
+X-LIC-LOCATION:America/St_Thomas
+BEGIN:STANDARD
+TZOFFSETFROM:-041944
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19110701T000000
+RDATE:19110701T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/St_Vincent.ics b/libkcal/libical/zoneinfo/America/St_Vincent.ics
new file mode 100644
index 00000000..edacd437
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/St_Vincent.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/St_Vincent
+X-LIC-LOCATION:America/St_Vincent
+BEGIN:STANDARD
+TZOFFSETFROM:-040456
+TZOFFSETTO:-040456
+TZNAME:KMT
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-040456
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19120101T000000
+RDATE:19120101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Swift_Current.ics b/libkcal/libical/zoneinfo/America/Swift_Current.ics
new file mode 100644
index 00000000..b8ab459b
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Swift_Current.ics
@@ -0,0 +1,74 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Swift_Current
+X-LIC-LOCATION:America/Swift_Current
+BEGIN:STANDARD
+TZOFFSETFROM:-071120
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19050901T000000
+RDATE:19050901T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:19180414T020000
+RDATE:19180414T020000
+RDATE:19460428T020000
+RDATE:19470427T020000
+RDATE:19480425T020000
+RDATE:19490424T020000
+RDATE:19570428T020000
+RDATE:19590426T020000
+RDATE:19600424T020000
+RDATE:19610430T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19181031T020000
+RDATE:19181031T020000
+RDATE:19450930T020000
+RDATE:19461013T020000
+RDATE:19470928T020000
+RDATE:19480926T020000
+RDATE:19490925T020000
+RDATE:19571027T020000
+RDATE:19591025T020000
+RDATE:19600925T020000
+RDATE:19610924T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:MPT
+DTSTART:19450814T170000
+RDATE:19450814T170000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19500101T000000
+RDATE:19500101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19720430T020000
+RDATE:19720430T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Tegucigalpa.ics b/libkcal/libical/zoneinfo/America/Tegucigalpa.ics
new file mode 100644
index 00000000..e5ec1e0a
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Tegucigalpa.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Tegucigalpa
+X-LIC-LOCATION:America/Tegucigalpa
+BEGIN:STANDARD
+TZOFFSETFROM:-054852
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19210401T000000
+RDATE:19210401T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19870503T000000
+RDATE:19870503T000000
+RDATE:19880501T000000
+RDATE:20060507T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19870927T000000
+RDATE:19870927T000000
+RDATE:19880925T000000
+RDATE:20060807T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Thule.ics b/libkcal/libical/zoneinfo/America/Thule.ics
new file mode 100644
index 00000000..7da99f4d
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Thule.ics
@@ -0,0 +1,73 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Thule
+X-LIC-LOCATION:America/Thule
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ADT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-043508
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19160728T000000
+RDATE:19160728T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ADT
+DTSTART:19910331T020000
+RDATE:19910331T020000
+RDATE:19920329T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19910929T020000
+RDATE:19910929T020000
+RDATE:19920927T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Thunder_Bay.ics b/libkcal/libical/zoneinfo/America/Thunder_Bay.ics
new file mode 100644
index 00000000..1c54083f
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Thunder_Bay.ics
@@ -0,0 +1,145 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Thunder_Bay
+X-LIC-LOCATION:America/Thunder_Bay
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0557
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:18950101T000000
+RDATE:18950101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19100101T000000
+RDATE:19100101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19420101T000000
+RDATE:19420101T000000
+RDATE:19700101T000000
+RDATE:19730101T000000
+RDATE:19740101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:EPT
+DTSTART:19450814T190000
+RDATE:19450814T190000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19450930T020000
+RDATE:19450930T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700426T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19740428T020000
+RDATE:19750427T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Tijuana.ics b/libkcal/libical/zoneinfo/America/Tijuana.ics
new file mode 100644
index 00000000..cf02aace
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Tijuana.ics
@@ -0,0 +1,106 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Tijuana
+X-LIC-LOCATION:America/Tijuana
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19761031T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:PDT
+DTSTART:19870405T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-074804
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19220101T001156
+RDATE:19220101T001156
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19240101T000000
+RDATE:19240101T000000
+RDATE:19301115T000000
+RDATE:19310930T000000
+RDATE:19451112T000000
+RDATE:19490114T000000
+RDATE:19540926T020000
+RDATE:19550925T020000
+RDATE:19560930T020000
+RDATE:19570929T020000
+RDATE:19580928T020000
+RDATE:19590927T020000
+RDATE:19600925T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19270610T230000
+RDATE:19270610T230000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:PDT
+DTSTART:19310401T000000
+RDATE:19310401T000000
+RDATE:19480405T000000
+RDATE:19540425T020000
+RDATE:19550424T020000
+RDATE:19560429T020000
+RDATE:19570428T020000
+RDATE:19580427T020000
+RDATE:19590426T020000
+RDATE:19600424T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:PWT
+DTSTART:19420424T000000
+RDATE:19420424T000000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0700
+TZNAME:PPT
+DTSTART:19450814T160000
+RDATE:19450814T160000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19540101T000000
+RDATE:19540101T000000
+RDATE:19610101T000000
+RDATE:19760101T000000
+RDATE:19960101T000000
+RDATE:20010101T000000
+RDATE:20020220T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Toronto.ics b/libkcal/libical/zoneinfo/America/Toronto.ics
new file mode 100644
index 00000000..d6a31435
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Toronto.ics
@@ -0,0 +1,232 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Toronto
+X-LIC-LOCATION:America/Toronto
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-051732
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:18950101T000000
+RDATE:18950101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19180414T020000
+RDATE:19180414T020000
+RDATE:19190330T233000
+RDATE:19200502T020000
+RDATE:19210515T020000
+RDATE:19220514T020000
+RDATE:19230513T020000
+RDATE:19240504T020000
+RDATE:19250503T020000
+RDATE:19260502T020000
+RDATE:19270501T020000
+RDATE:19280429T020000
+RDATE:19290428T020000
+RDATE:19300427T020000
+RDATE:19310426T020000
+RDATE:19320501T020000
+RDATE:19330430T020000
+RDATE:19340429T020000
+RDATE:19350428T020000
+RDATE:19360426T020000
+RDATE:19370425T020000
+RDATE:19380424T020000
+RDATE:19390430T020000
+RDATE:19400428T020000
+RDATE:19460428T020000
+RDATE:19470427T000000
+RDATE:19480425T000000
+RDATE:19490424T000000
+RDATE:19500430T020000
+RDATE:19510429T020000
+RDATE:19520427T020000
+RDATE:19530426T020000
+RDATE:19540425T020000
+RDATE:19550424T020000
+RDATE:19560429T020000
+RDATE:19570428T020000
+RDATE:19580427T020000
+RDATE:19590426T020000
+RDATE:19600424T020000
+RDATE:19610430T020000
+RDATE:19620429T020000
+RDATE:19630428T020000
+RDATE:19640426T020000
+RDATE:19650425T020000
+RDATE:19660424T020000
+RDATE:19670430T020000
+RDATE:19680428T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19740428T020000
+RDATE:19750427T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19181031T020000
+RDATE:19181031T020000
+RDATE:19191026T000000
+RDATE:19200926T000000
+RDATE:19210915T020000
+RDATE:19220917T020000
+RDATE:19230916T020000
+RDATE:19240921T020000
+RDATE:19250920T020000
+RDATE:19260919T020000
+RDATE:19270925T020000
+RDATE:19280930T020000
+RDATE:19290929T020000
+RDATE:19300928T020000
+RDATE:19310927T020000
+RDATE:19320925T020000
+RDATE:19331001T020000
+RDATE:19340930T020000
+RDATE:19350929T020000
+RDATE:19360927T020000
+RDATE:19370926T020000
+RDATE:19380925T020000
+RDATE:19390924T020000
+RDATE:19450930T020000
+RDATE:19460929T020000
+RDATE:19470928T000000
+RDATE:19480926T000000
+RDATE:19491127T000000
+RDATE:19501126T020000
+RDATE:19510930T020000
+RDATE:19520928T020000
+RDATE:19530927T020000
+RDATE:19540926T020000
+RDATE:19550925T020000
+RDATE:19560930T020000
+RDATE:19571027T020000
+RDATE:19581026T020000
+RDATE:19591025T020000
+RDATE:19601030T020000
+RDATE:19611029T020000
+RDATE:19621028T020000
+RDATE:19631027T020000
+RDATE:19641025T020000
+RDATE:19651031T020000
+RDATE:19661030T020000
+RDATE:19671029T020000
+RDATE:19681027T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19190101T000000
+RDATE:19190101T000000
+RDATE:19460101T000000
+RDATE:19740101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:EWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:EPT
+DTSTART:19450814T190000
+RDATE:19450814T190000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Tortola.ics b/libkcal/libical/zoneinfo/America/Tortola.ics
new file mode 100644
index 00000000..be30bd5b
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Tortola.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Tortola
+X-LIC-LOCATION:America/Tortola
+BEGIN:STANDARD
+TZOFFSETFROM:-041828
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19110701T000000
+RDATE:19110701T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Vancouver.ics b/libkcal/libical/zoneinfo/America/Vancouver.ics
new file mode 100644
index 00000000..725387c9
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Vancouver.ics
@@ -0,0 +1,187 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Vancouver
+X-LIC-LOCATION:America/Vancouver
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:PDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-081228
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:18840101T000000
+RDATE:18840101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:PDT
+DTSTART:19180414T020000
+RDATE:19180414T020000
+RDATE:19460428T020000
+RDATE:19470427T020000
+RDATE:19480425T020000
+RDATE:19490424T020000
+RDATE:19500430T020000
+RDATE:19510429T020000
+RDATE:19520427T020000
+RDATE:19530426T020000
+RDATE:19540425T020000
+RDATE:19550424T020000
+RDATE:19560429T020000
+RDATE:19570428T020000
+RDATE:19580427T020000
+RDATE:19590426T020000
+RDATE:19600424T020000
+RDATE:19610430T020000
+RDATE:19620429T020000
+RDATE:19630428T020000
+RDATE:19640426T020000
+RDATE:19650425T020000
+RDATE:19660424T020000
+RDATE:19670430T020000
+RDATE:19680428T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19740428T020000
+RDATE:19750427T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19181031T020000
+RDATE:19181031T020000
+RDATE:19450930T020000
+RDATE:19461013T020000
+RDATE:19470928T020000
+RDATE:19480926T020000
+RDATE:19490925T020000
+RDATE:19500924T020000
+RDATE:19510930T020000
+RDATE:19520928T020000
+RDATE:19530927T020000
+RDATE:19540926T020000
+RDATE:19550925T020000
+RDATE:19560930T020000
+RDATE:19570929T020000
+RDATE:19580928T020000
+RDATE:19590927T020000
+RDATE:19600925T020000
+RDATE:19610924T020000
+RDATE:19621028T020000
+RDATE:19631027T020000
+RDATE:19641025T020000
+RDATE:19651031T020000
+RDATE:19661030T020000
+RDATE:19671029T020000
+RDATE:19681027T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:PWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0700
+TZNAME:PPT
+DTSTART:19450814T160000
+RDATE:19450814T160000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19870101T000000
+RDATE:19870101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Whitehorse.ics b/libkcal/libical/zoneinfo/America/Whitehorse.ics
new file mode 100644
index 00000000..e93d8aad
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Whitehorse.ics
@@ -0,0 +1,153 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Whitehorse
+X-LIC-LOCATION:America/Whitehorse
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:PDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-090012
+TZOFFSETTO:-0900
+TZNAME:YST
+DTSTART:19000820T000000
+RDATE:19000820T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0800
+TZNAME:YDT
+DTSTART:19180414T020000
+RDATE:19180414T020000
+RDATE:19190525T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0900
+TZNAME:YST
+DTSTART:19181027T020000
+RDATE:19181027T020000
+RDATE:19191101T000000
+RDATE:19450930T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0800
+TZNAME:YWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0800
+TZNAME:YPT
+DTSTART:19450814T150000
+RDATE:19450814T150000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0700
+TZNAME:YDDT
+DTSTART:19650425T000000
+RDATE:19650425T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0900
+TZNAME:YST
+DTSTART:19651031T020000
+RDATE:19651031T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0800
+DTSTART:19660701T020000
+RDATE:19660701T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19800101T000000
+RDATE:19800101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:PDT
+DTSTART:19800427T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19801026T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Winnipeg.ics b/libkcal/libical/zoneinfo/America/Winnipeg.ics
new file mode 100644
index 00000000..e75440d5
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Winnipeg.ics
@@ -0,0 +1,183 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Winnipeg
+X-LIC-LOCATION:America/Winnipeg
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-062836
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:18870716T000000
+RDATE:18870716T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19160423T000000
+RDATE:19160423T000000
+RDATE:19180414T020000
+RDATE:19370516T020000
+RDATE:19460512T020000
+RDATE:19470427T020000
+RDATE:19480425T020000
+RDATE:19490424T020000
+RDATE:19500501T020000
+RDATE:19510429T020000
+RDATE:19520427T020000
+RDATE:19530426T020000
+RDATE:19540425T020000
+RDATE:19550424T020000
+RDATE:19560429T020000
+RDATE:19570428T020000
+RDATE:19580427T020000
+RDATE:19590426T020000
+RDATE:19600424T020000
+RDATE:19630428T020000
+RDATE:19660424T020000
+RDATE:19670430T020000
+RDATE:19680428T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19740428T020000
+RDATE:19750427T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19160917T000000
+RDATE:19160917T000000
+RDATE:19181031T020000
+RDATE:19370926T020000
+RDATE:19450930T020000
+RDATE:19461013T020000
+RDATE:19470928T020000
+RDATE:19480926T020000
+RDATE:19490925T020000
+RDATE:19500930T020000
+RDATE:19510930T020000
+RDATE:19520928T020000
+RDATE:19530927T020000
+RDATE:19540926T020000
+RDATE:19550925T020000
+RDATE:19560930T020000
+RDATE:19570929T020000
+RDATE:19580928T020000
+RDATE:19591025T020000
+RDATE:19600925T020000
+RDATE:19630922T020000
+RDATE:19661030T030000
+RDATE:19671029T030000
+RDATE:19681027T030000
+RDATE:19691026T030000
+RDATE:19701025T030000
+RDATE:19711031T030000
+RDATE:19721029T030000
+RDATE:19731028T030000
+RDATE:19741027T030000
+RDATE:19751026T030000
+RDATE:19761031T030000
+RDATE:19771030T030000
+RDATE:19781029T030000
+RDATE:19791028T030000
+RDATE:19801026T030000
+RDATE:19811025T030000
+RDATE:19821031T030000
+RDATE:19831030T030000
+RDATE:19841028T030000
+RDATE:19851027T030000
+RDATE:19861026T030000
+RDATE:19871025T030000
+RDATE:19881030T030000
+RDATE:19891029T030000
+RDATE:19901028T030000
+RDATE:19911027T030000
+RDATE:19921025T030000
+RDATE:19931031T030000
+RDATE:19941030T030000
+RDATE:19951029T030000
+RDATE:19961027T030000
+RDATE:19971026T030000
+RDATE:19981025T030000
+RDATE:19991031T030000
+RDATE:20001029T030000
+RDATE:20011028T030000
+RDATE:20021027T030000
+RDATE:20031026T030000
+RDATE:20041031T030000
+RDATE:20051030T030000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:CPT
+DTSTART:19450814T180000
+RDATE:19450814T180000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:20060101T000000
+RDATE:20060101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Yakutat.ics b/libkcal/libical/zoneinfo/America/Yakutat.ics
new file mode 100644
index 00000000..894ead5c
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Yakutat.ics
@@ -0,0 +1,167 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Yakutat
+X-LIC-LOCATION:America/Yakutat
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0800
+TZNAME:AKDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0900
+TZNAME:AKST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+144105
+TZOFFSETTO:-091855
+TZNAME:LMT
+DTSTART:18671018T000000
+RDATE:18671018T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-091855
+TZOFFSETTO:-0900
+TZNAME:YST
+DTSTART:19000820T120000
+RDATE:19000820T120000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0900
+TZNAME:YST
+DTSTART:19420101T000000
+RDATE:19420101T000000
+RDATE:19460101T000000
+RDATE:19690101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0800
+TZNAME:YWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0800
+TZNAME:YPT
+DTSTART:19450814T150000
+RDATE:19450814T150000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0900
+TZNAME:YST
+DTSTART:19450930T020000
+RDATE:19450930T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0800
+TZNAME:YDT
+DTSTART:19690427T020000
+RDATE:19690427T020000
+RDATE:19700426T020000
+RDATE:19710425T020000
+RDATE:19720430T020000
+RDATE:19730429T020000
+RDATE:19740106T020000
+RDATE:19750223T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0900
+TZNAME:AKST
+DTSTART:19831130T000000
+RDATE:19831130T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0800
+TZNAME:AKDT
+DTSTART:19840429T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0900
+TZNAME:AKST
+DTSTART:19841028T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/America/Yellowknife.ics b/libkcal/libical/zoneinfo/America/Yellowknife.ics
new file mode 100644
index 00000000..6d3e45b1
--- /dev/null
+++ b/libkcal/libical/zoneinfo/America/Yellowknife.ics
@@ -0,0 +1,131 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/America/Yellowknife
+X-LIC-LOCATION:America/Yellowknife
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19350101T000000
+RDATE:19350101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:MPT
+DTSTART:19450814T170000
+RDATE:19450814T170000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19450930T020000
+RDATE:19450930T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0500
+TZNAME:MDDT
+DTSTART:19650425T000000
+RDATE:19650425T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19651031T020000
+RDATE:19651031T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19800101T000000
+RDATE:19800101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:19800427T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Antarctica/Casey.ics b/libkcal/libical/zoneinfo/Antarctica/Casey.ics
new file mode 100644
index 00000000..09a83226
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Antarctica/Casey.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Antarctica/Casey
+X-LIC-LOCATION:Antarctica/Casey
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0800
+TZNAME:WST
+DTSTART:19690101T000000
+RDATE:19690101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Antarctica/Davis.ics b/libkcal/libical/zoneinfo/Antarctica/Davis.ics
new file mode 100644
index 00000000..a7ac261a
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Antarctica/Davis.ics
@@ -0,0 +1,23 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Antarctica/Davis
+X-LIC-LOCATION:Antarctica/Davis
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0700
+TZNAME:DAVT
+DTSTART:19570113T000000
+RDATE:19570113T000000
+RDATE:19690201T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0000
+TZNAME:zzz
+DTSTART:19641101T000000
+RDATE:19641101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Antarctica/DumontDUrville.ics b/libkcal/libical/zoneinfo/Antarctica/DumontDUrville.ics
new file mode 100644
index 00000000..05d3681f
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Antarctica/DumontDUrville.ics
@@ -0,0 +1,29 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Antarctica/DumontDUrville
+X-LIC-LOCATION:Antarctica/DumontDUrville
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+1000
+TZNAME:PMT
+DTSTART:19470101T000000
+RDATE:19470101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+0000
+TZNAME:zzz
+DTSTART:19520114T000000
+RDATE:19520114T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+1000
+TZNAME:DDUT
+DTSTART:19561101T000000
+RDATE:19561101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Antarctica/Mawson.ics b/libkcal/libical/zoneinfo/Antarctica/Mawson.ics
new file mode 100644
index 00000000..92d091cc
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Antarctica/Mawson.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Antarctica/Mawson
+X-LIC-LOCATION:Antarctica/Mawson
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0600
+TZNAME:MAWT
+DTSTART:19540213T000000
+RDATE:19540213T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Antarctica/McMurdo.ics b/libkcal/libical/zoneinfo/Antarctica/McMurdo.ics
new file mode 100644
index 00000000..7fa4368c
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Antarctica/McMurdo.ics
@@ -0,0 +1,107 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Antarctica/McMurdo
+X-LIC-LOCATION:Antarctica/McMurdo
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1300
+TZNAME:NZDT
+DTSTART:20070930T020000
+RRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1300
+TZOFFSETTO:+1200
+TZNAME:NZST
+DTSTART:20080406T030000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+1200
+TZNAME:NZST
+DTSTART:19560101T000000
+RDATE:19560101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1300
+TZNAME:NZDT
+DTSTART:19741103T020000
+RDATE:19741103T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891008T020000
+RDATE:19901007T020000
+RDATE:19911006T020000
+RDATE:19921004T020000
+RDATE:19931003T020000
+RDATE:19941002T020000
+RDATE:19951001T020000
+RDATE:19961006T020000
+RDATE:19971005T020000
+RDATE:19981004T020000
+RDATE:19991003T020000
+RDATE:20001001T020000
+RDATE:20011007T020000
+RDATE:20021006T020000
+RDATE:20031005T020000
+RDATE:20041003T020000
+RDATE:20051002T020000
+RDATE:20061001T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1300
+TZOFFSETTO:+1200
+TZNAME:NZST
+DTSTART:19750223T030000
+RDATE:19750223T030000
+RDATE:19760307T030000
+RDATE:19770306T030000
+RDATE:19780305T030000
+RDATE:19790304T030000
+RDATE:19800302T030000
+RDATE:19810301T030000
+RDATE:19820307T030000
+RDATE:19830306T030000
+RDATE:19840304T030000
+RDATE:19850303T030000
+RDATE:19860302T030000
+RDATE:19870301T030000
+RDATE:19880306T030000
+RDATE:19890305T030000
+RDATE:19900318T030000
+RDATE:19910317T030000
+RDATE:19920315T030000
+RDATE:19930321T030000
+RDATE:19940320T030000
+RDATE:19950319T030000
+RDATE:19960317T030000
+RDATE:19970316T030000
+RDATE:19980315T030000
+RDATE:19990321T030000
+RDATE:20000319T030000
+RDATE:20010318T030000
+RDATE:20020317T030000
+RDATE:20030316T030000
+RDATE:20040321T030000
+RDATE:20050320T030000
+RDATE:20060319T030000
+RDATE:20070318T030000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Antarctica/Palmer.ics b/libkcal/libical/zoneinfo/Antarctica/Palmer.ics
new file mode 100644
index 00000000..a4fa54f7
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Antarctica/Palmer.ics
@@ -0,0 +1,118 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Antarctica/Palmer
+X-LIC-LOCATION:Antarctica/Palmer
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:CLST
+DTSTART:19991010T000000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYMONTHDAY=9,10,11,12,13,14,15;BYDAY=SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:CLT
+DTSTART:20000312T000000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYMONTHDAY=9,10,11,12,13,14,15;BYDAY=SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:-0300
+TZNAME:ARST
+DTSTART:19650101T000000
+RDATE:19650101T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:ART
+DTSTART:19650301T000000
+RDATE:19650301T000000
+RDATE:19660301T000000
+RDATE:19670402T000000
+RDATE:19680407T000000
+RDATE:19690406T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ARST
+DTSTART:19651015T000000
+RDATE:19651015T000000
+RDATE:19661015T000000
+RDATE:19671001T000000
+RDATE:19681006T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19691005T000000
+RDATE:19691005T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:ARST
+DTSTART:19740123T000000
+RDATE:19740123T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19740501T000000
+RDATE:19740501T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:CLT
+DTSTART:19820501T000000
+RDATE:19820501T000000
+RDATE:19830313T000000
+RDATE:19840311T000000
+RDATE:19850310T000000
+RDATE:19860309T000000
+RDATE:19870412T000000
+RDATE:19880313T000000
+RDATE:19890312T000000
+RDATE:19900318T000000
+RDATE:19910310T000000
+RDATE:19920315T000000
+RDATE:19930314T000000
+RDATE:19940313T000000
+RDATE:19950312T000000
+RDATE:19960310T000000
+RDATE:19970330T000000
+RDATE:19980315T000000
+RDATE:19990404T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:CLST
+DTSTART:19821010T000000
+RDATE:19821010T000000
+RDATE:19831009T000000
+RDATE:19841014T000000
+RDATE:19851013T000000
+RDATE:19861012T000000
+RDATE:19871011T000000
+RDATE:19881002T000000
+RDATE:19891015T000000
+RDATE:19900916T000000
+RDATE:19911013T000000
+RDATE:19921011T000000
+RDATE:19931010T000000
+RDATE:19941009T000000
+RDATE:19951015T000000
+RDATE:19961013T000000
+RDATE:19971012T000000
+RDATE:19980927T000000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Antarctica/Rothera.ics b/libkcal/libical/zoneinfo/Antarctica/Rothera.ics
new file mode 100644
index 00000000..03c1c5a3
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Antarctica/Rothera.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Antarctica/Rothera
+X-LIC-LOCATION:Antarctica/Rothera
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:-0300
+TZNAME:ROTT
+DTSTART:19761201T000000
+RDATE:19761201T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Antarctica/South_Pole.ics b/libkcal/libical/zoneinfo/Antarctica/South_Pole.ics
new file mode 100644
index 00000000..bda8f362
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Antarctica/South_Pole.ics
@@ -0,0 +1,107 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Antarctica/South_Pole
+X-LIC-LOCATION:Antarctica/South_Pole
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1300
+TZNAME:NZDT
+DTSTART:20070930T020000
+RRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1300
+TZOFFSETTO:+1200
+TZNAME:NZST
+DTSTART:20080406T030000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+1200
+TZNAME:NZST
+DTSTART:19560101T000000
+RDATE:19560101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1300
+TZNAME:NZDT
+DTSTART:19741103T020000
+RDATE:19741103T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891008T020000
+RDATE:19901007T020000
+RDATE:19911006T020000
+RDATE:19921004T020000
+RDATE:19931003T020000
+RDATE:19941002T020000
+RDATE:19951001T020000
+RDATE:19961006T020000
+RDATE:19971005T020000
+RDATE:19981004T020000
+RDATE:19991003T020000
+RDATE:20001001T020000
+RDATE:20011007T020000
+RDATE:20021006T020000
+RDATE:20031005T020000
+RDATE:20041003T020000
+RDATE:20051002T020000
+RDATE:20061001T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1300
+TZOFFSETTO:+1200
+TZNAME:NZST
+DTSTART:19750223T030000
+RDATE:19750223T030000
+RDATE:19760307T030000
+RDATE:19770306T030000
+RDATE:19780305T030000
+RDATE:19790304T030000
+RDATE:19800302T030000
+RDATE:19810301T030000
+RDATE:19820307T030000
+RDATE:19830306T030000
+RDATE:19840304T030000
+RDATE:19850303T030000
+RDATE:19860302T030000
+RDATE:19870301T030000
+RDATE:19880306T030000
+RDATE:19890305T030000
+RDATE:19900318T030000
+RDATE:19910317T030000
+RDATE:19920315T030000
+RDATE:19930321T030000
+RDATE:19940320T030000
+RDATE:19950319T030000
+RDATE:19960317T030000
+RDATE:19970316T030000
+RDATE:19980315T030000
+RDATE:19990321T030000
+RDATE:20000319T030000
+RDATE:20010318T030000
+RDATE:20020317T030000
+RDATE:20030316T030000
+RDATE:20040321T030000
+RDATE:20050320T030000
+RDATE:20060319T030000
+RDATE:20070318T030000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Antarctica/Syowa.ics b/libkcal/libical/zoneinfo/Antarctica/Syowa.ics
new file mode 100644
index 00000000..93c9576b
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Antarctica/Syowa.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Antarctica/Syowa
+X-LIC-LOCATION:Antarctica/Syowa
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0300
+TZNAME:SYOT
+DTSTART:19570129T000000
+RDATE:19570129T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Antarctica/Vostok.ics b/libkcal/libical/zoneinfo/Antarctica/Vostok.ics
new file mode 100644
index 00000000..0bbbca64
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Antarctica/Vostok.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Antarctica/Vostok
+X-LIC-LOCATION:Antarctica/Vostok
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0600
+TZNAME:VOST
+DTSTART:19571216T000000
+RDATE:19571216T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Arctic/Longyearbyen.ics b/libkcal/libical/zoneinfo/Arctic/Longyearbyen.ics
new file mode 100644
index 00000000..467d6e47
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Arctic/Longyearbyen.ics
@@ -0,0 +1,89 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Arctic/Longyearbyen
+X-LIC-LOCATION:Arctic/Longyearbyen
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19810329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0043
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:18950101T000000
+RDATE:18950101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19160522T010000
+RDATE:19160522T010000
+RDATE:19400810T230000
+RDATE:19430329T020000
+RDATE:19440403T020000
+RDATE:19450402T020000
+RDATE:19590315T020000
+RDATE:19600320T020000
+RDATE:19610319T020000
+RDATE:19620318T020000
+RDATE:19630317T020000
+RDATE:19640315T020000
+RDATE:19650425T020000
+RDATE:19800406T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19160930T000000
+RDATE:19160930T000000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19441002T030000
+RDATE:19451001T030000
+RDATE:19590920T030000
+RDATE:19600918T030000
+RDATE:19610917T030000
+RDATE:19620916T030000
+RDATE:19630915T030000
+RDATE:19640920T030000
+RDATE:19650919T030000
+RDATE:19800928T030000
+RDATE:19810927T030000
+RDATE:19820926T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19800101T000000
+RDATE:19800101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Aden.ics b/libkcal/libical/zoneinfo/Asia/Aden.ics
new file mode 100644
index 00000000..4050107b
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Aden.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Aden
+X-LIC-LOCATION:Asia/Aden
+BEGIN:STANDARD
+TZOFFSETFROM:+030048
+TZOFFSETTO:+0300
+TZNAME:AST
+DTSTART:19500101T000000
+RDATE:19500101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Almaty.ics b/libkcal/libical/zoneinfo/Asia/Almaty.ics
new file mode 100644
index 00000000..8092271a
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Almaty.ics
@@ -0,0 +1,89 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Almaty
+X-LIC-LOCATION:Asia/Almaty
+BEGIN:STANDARD
+TZOFFSETFROM:+050748
+TZOFFSETTO:+0500
+TZNAME:ALMT
+DTSTART:19240502T000000
+RDATE:19240502T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0600
+TZNAME:ALMT
+DTSTART:19300621T000000
+RDATE:19300621T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0700
+TZNAME:ALMST
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+RDATE:19920328T230000
+RDATE:19930328T020000
+RDATE:19940327T020000
+RDATE:19950326T020000
+RDATE:19960331T020000
+RDATE:19970330T020000
+RDATE:19980329T020000
+RDATE:19990328T020000
+RDATE:20000326T020000
+RDATE:20010325T020000
+RDATE:20020331T020000
+RDATE:20030330T020000
+RDATE:20040328T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0600
+TZNAME:ALMT
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19920926T230000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+RDATE:19961027T030000
+RDATE:19971026T030000
+RDATE:19981025T030000
+RDATE:19991031T030000
+RDATE:20001029T030000
+RDATE:20011028T030000
+RDATE:20021027T030000
+RDATE:20031026T030000
+RDATE:20041031T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:ALMT
+DTSTART:19910101T000000
+RDATE:19910101T000000
+RDATE:19920101T000000
+RDATE:20050315T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Amman.ics b/libkcal/libical/zoneinfo/Asia/Amman.ics
new file mode 100644
index 00000000..d474239a
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Amman.ics
@@ -0,0 +1,89 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Amman
+X-LIC-LOCATION:Asia/Amman
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:20000330T000000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1TH
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:20061027T010000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1FR
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+022344
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19310101T000000
+RDATE:19310101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19730606T000000
+RDATE:19730606T000000
+RDATE:19740501T000000
+RDATE:19750501T000000
+RDATE:19760501T000000
+RDATE:19770501T000000
+RDATE:19780430T000000
+RDATE:19850401T000000
+RDATE:19860404T000000
+RDATE:19870403T000000
+RDATE:19880401T000000
+RDATE:19890508T000000
+RDATE:19900427T000000
+RDATE:19910417T000000
+RDATE:19920410T000000
+RDATE:19930402T000000
+RDATE:19940401T000000
+RDATE:19950407T000000
+RDATE:19960405T000000
+RDATE:19970404T000000
+RDATE:19980403T000000
+RDATE:19990701T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19731001T000000
+RDATE:19731001T000000
+RDATE:19741001T000000
+RDATE:19751001T000000
+RDATE:19761101T000000
+RDATE:19771001T000000
+RDATE:19780930T000000
+RDATE:19851001T000000
+RDATE:19861003T000000
+RDATE:19871002T000000
+RDATE:19881007T000000
+RDATE:19891006T000000
+RDATE:19901005T000000
+RDATE:19910927T000000
+RDATE:19921002T000000
+RDATE:19931001T000000
+RDATE:19940916T000000
+RDATE:19950915T010000
+RDATE:19960920T010000
+RDATE:19970919T010000
+RDATE:19980918T010000
+RDATE:19990930T010000
+RDATE:20000928T010000
+RDATE:20010927T010000
+RDATE:20020926T010000
+RDATE:20031024T010000
+RDATE:20041015T010000
+RDATE:20050930T010000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Anadyr.ics b/libkcal/libical/zoneinfo/Asia/Anadyr.ics
new file mode 100644
index 00000000..df535644
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Anadyr.ics
@@ -0,0 +1,112 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Anadyr
+X-LIC-LOCATION:Asia/Anadyr
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1300
+TZNAME:ANAST
+DTSTART:19930328T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1300
+TZOFFSETTO:+1200
+TZNAME:ANAT
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+114956
+TZOFFSETTO:+1200
+TZNAME:ANAT
+DTSTART:19240502T000000
+RDATE:19240502T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1300
+TZNAME:ANAT
+DTSTART:19300621T000000
+RDATE:19300621T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1300
+TZOFFSETTO:+1400
+TZNAME:ANAST
+DTSTART:19810401T000000
+RDATE:19810401T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1400
+TZOFFSETTO:+1300
+TZNAME:ANAT
+DTSTART:19811001T000000
+RDATE:19811001T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1300
+TZOFFSETTO:+1300
+TZNAME:ANAST
+DTSTART:19820401T000000
+RDATE:19820401T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1300
+TZOFFSETTO:+1200
+TZNAME:ANAT
+DTSTART:19821001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19920926T230000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1300
+TZNAME:ANAST
+DTSTART:19830401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+RDATE:19920328T230000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1200
+TZNAME:ANAST
+DTSTART:19910331T020000
+RDATE:19910331T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1100
+TZNAME:ANAT
+DTSTART:19910929T030000
+RDATE:19910929T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1200
+TZNAME:ANAT
+DTSTART:19920119T020000
+RDATE:19920119T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Aqtau.ics b/libkcal/libical/zoneinfo/Asia/Aqtau.ics
new file mode 100644
index 00000000..c9062a81
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Aqtau.ics
@@ -0,0 +1,143 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Aqtau
+X-LIC-LOCATION:Asia/Aqtau
+BEGIN:STANDARD
+TZOFFSETFROM:+032104
+TZOFFSETTO:+0400
+TZNAME:FORT
+DTSTART:19240502T000000
+RDATE:19240502T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:FORT
+DTSTART:19300621T000000
+RDATE:19300621T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0500
+TZNAME:SHET
+DTSTART:19630101T000000
+RDATE:19630101T000000
+RDATE:19910101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0600
+TZNAME:SHET
+DTSTART:19811001T000000
+RDATE:19811001T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:SHEST
+DTSTART:19820401T000000
+RDATE:19820401T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0500
+TZNAME:SHET
+DTSTART:19821001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0600
+TZNAME:SHEST
+DTSTART:19830401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0500
+TZNAME:AQTT
+DTSTART:19911216T000000
+RDATE:19911216T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0600
+TZNAME:AQTST
+DTSTART:19920328T230000
+RDATE:19920328T230000
+RDATE:19930328T020000
+RDATE:19940327T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0500
+TZNAME:AQTT
+DTSTART:19920926T230000
+RDATE:19920926T230000
+RDATE:19930926T030000
+RDATE:19940925T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0500
+TZNAME:AQTST
+DTSTART:19950326T020000
+RDATE:19950326T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0400
+TZNAME:AQTT
+DTSTART:19950924T030000
+RDATE:19950924T030000
+RDATE:19961027T030000
+RDATE:19971026T030000
+RDATE:19981025T030000
+RDATE:19991031T030000
+RDATE:20001029T030000
+RDATE:20011028T030000
+RDATE:20021027T030000
+RDATE:20031026T030000
+RDATE:20041031T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:AQTST
+DTSTART:19960331T020000
+RDATE:19960331T020000
+RDATE:19970330T020000
+RDATE:19980329T020000
+RDATE:19990328T020000
+RDATE:20000326T020000
+RDATE:20010325T020000
+RDATE:20020331T020000
+RDATE:20030330T020000
+RDATE:20040328T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:AQTT
+DTSTART:20050315T000000
+RDATE:20050315T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Aqtobe.ics b/libkcal/libical/zoneinfo/Asia/Aqtobe.ics
new file mode 100644
index 00000000..35dba9c1
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Aqtobe.ics
@@ -0,0 +1,119 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Aqtobe
+X-LIC-LOCATION:Asia/Aqtobe
+BEGIN:STANDARD
+TZOFFSETFROM:+034840
+TZOFFSETTO:+0400
+TZNAME:AKTT
+DTSTART:19240502T000000
+RDATE:19240502T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:AKTT
+DTSTART:19300621T000000
+RDATE:19300621T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0600
+TZNAME:AKTST
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:AKTT
+DTSTART:19811001T000000
+RDATE:19811001T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:AKTST
+DTSTART:19820401T000000
+RDATE:19820401T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0500
+TZNAME:AKTT
+DTSTART:19821001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0500
+TZNAME:AKTT
+DTSTART:19910101T000000
+RDATE:19910101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0500
+TZNAME:AQTT
+DTSTART:19911216T000000
+RDATE:19911216T000000
+RDATE:20050315T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0600
+TZNAME:AQTST
+DTSTART:19920328T230000
+RDATE:19920328T230000
+RDATE:19930328T020000
+RDATE:19940327T020000
+RDATE:19950326T020000
+RDATE:19960331T020000
+RDATE:19970330T020000
+RDATE:19980329T020000
+RDATE:19990328T020000
+RDATE:20000326T020000
+RDATE:20010325T020000
+RDATE:20020331T020000
+RDATE:20030330T020000
+RDATE:20040328T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0500
+TZNAME:AQTT
+DTSTART:19920926T230000
+RDATE:19920926T230000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+RDATE:19961027T030000
+RDATE:19971026T030000
+RDATE:19981025T030000
+RDATE:19991031T030000
+RDATE:20001029T030000
+RDATE:20011028T030000
+RDATE:20021027T030000
+RDATE:20031026T030000
+RDATE:20041031T030000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Ashgabat.ics b/libkcal/libical/zoneinfo/Asia/Ashgabat.ics
new file mode 100644
index 00000000..b8a3f633
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Ashgabat.ics
@@ -0,0 +1,82 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Ashgabat
+X-LIC-LOCATION:Asia/Ashgabat
+BEGIN:STANDARD
+TZOFFSETFROM:+035332
+TZOFFSETTO:+0400
+TZNAME:ASHT
+DTSTART:19240502T000000
+RDATE:19240502T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:ASHT
+DTSTART:19300621T000000
+RDATE:19300621T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0600
+TZNAME:ASHST
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0500
+TZNAME:ASHT
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0500
+TZNAME:ASHST
+DTSTART:19910331T020000
+RDATE:19910331T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0400
+TZNAME:ASHT
+DTSTART:19910929T030000
+RDATE:19910929T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0400
+TZNAME:TMT
+DTSTART:19911027T000000
+RDATE:19911027T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:TMT
+DTSTART:19920119T020000
+RDATE:19920119T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Baghdad.ics b/libkcal/libical/zoneinfo/Asia/Baghdad.ics
new file mode 100644
index 00000000..f84e6167
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Baghdad.ics
@@ -0,0 +1,86 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Baghdad
+X-LIC-LOCATION:Asia/Baghdad
+BEGIN:STANDARD
+TZOFFSETFROM:+025740
+TZOFFSETTO:+025736
+TZNAME:BMT
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+025736
+TZOFFSETTO:+0300
+TZNAME:AST
+DTSTART:19180101T000000
+RDATE:19180101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:ADT
+DTSTART:19820501T000000
+RDATE:19820501T000000
+RDATE:19830331T000000
+RDATE:19840401T000000
+RDATE:19850401T000000
+RDATE:19860330T010000
+RDATE:19870329T010000
+RDATE:19880327T010000
+RDATE:19890326T010000
+RDATE:19900325T010000
+RDATE:19910401T030000
+RDATE:19920401T030000
+RDATE:19930401T030000
+RDATE:19940401T030000
+RDATE:19950401T030000
+RDATE:19960401T030000
+RDATE:19970401T030000
+RDATE:19980401T030000
+RDATE:19990401T030000
+RDATE:20000401T030000
+RDATE:20010401T030000
+RDATE:20020401T030000
+RDATE:20030401T030000
+RDATE:20040401T030000
+RDATE:20050401T030000
+RDATE:20060401T030000
+RDATE:20070401T030000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0300
+TZNAME:AST
+DTSTART:19821001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19841001T000000
+RDATE:19850929T020000
+RDATE:19860928T020000
+RDATE:19870927T020000
+RDATE:19880925T020000
+RDATE:19890924T020000
+RDATE:19900930T020000
+RDATE:19911001T040000
+RDATE:19921001T040000
+RDATE:19931001T040000
+RDATE:19941001T040000
+RDATE:19951001T040000
+RDATE:19961001T040000
+RDATE:19971001T040000
+RDATE:19981001T040000
+RDATE:19991001T040000
+RDATE:20001001T040000
+RDATE:20011001T040000
+RDATE:20021001T040000
+RDATE:20031001T040000
+RDATE:20041001T040000
+RDATE:20051001T040000
+RDATE:20061001T040000
+RDATE:20071001T040000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Bahrain.ics b/libkcal/libical/zoneinfo/Asia/Bahrain.ics
new file mode 100644
index 00000000..312e64a9
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Bahrain.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Bahrain
+X-LIC-LOCATION:Asia/Bahrain
+BEGIN:STANDARD
+TZOFFSETFROM:+032220
+TZOFFSETTO:+0400
+TZNAME:GST
+DTSTART:19200101T000000
+RDATE:19200101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0300
+TZNAME:AST
+DTSTART:19720601T000000
+RDATE:19720601T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Baku.ics b/libkcal/libical/zoneinfo/Asia/Baku.ics
new file mode 100644
index 00000000..d839342c
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Baku.ics
@@ -0,0 +1,119 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Baku
+X-LIC-LOCATION:Asia/Baku
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:AZST
+DTSTART:19970330T040000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0400
+TZNAME:AZT
+DTSTART:19971026T050000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+031924
+TZOFFSETTO:+0300
+TZNAME:BAKT
+DTSTART:19240502T000000
+RDATE:19240502T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:BAKT
+DTSTART:19570301T000000
+RDATE:19570301T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:BAKST
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0400
+TZNAME:BAKT
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0400
+TZNAME:BAKST
+DTSTART:19910331T020000
+RDATE:19910331T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0400
+TZNAME:AZST
+DTSTART:19910830T000000
+RDATE:19910830T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0300
+TZNAME:AZT
+DTSTART:19910929T030000
+RDATE:19910929T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:AZST
+DTSTART:19920328T230000
+RDATE:19920328T230000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0400
+TZNAME:AZT
+DTSTART:19920926T230000
+RDATE:19920926T230000
+RDATE:19960101T000000
+RDATE:19970101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:AZST
+DTSTART:19960331T050000
+RDATE:19960331T050000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0400
+TZNAME:AZT
+DTSTART:19961027T060000
+RDATE:19961027T060000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Bangkok.ics b/libkcal/libical/zoneinfo/Asia/Bangkok.ics
new file mode 100644
index 00000000..bc40b4ff
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Bangkok.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Bangkok
+X-LIC-LOCATION:Asia/Bangkok
+BEGIN:STANDARD
+TZOFFSETFROM:+064204
+TZOFFSETTO:+064204
+TZNAME:BMT
+DTSTART:18800101T000000
+RDATE:18800101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+064204
+TZOFFSETTO:+0700
+TZNAME:ICT
+DTSTART:19200401T000000
+RDATE:19200401T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Beirut.ics b/libkcal/libical/zoneinfo/Asia/Beirut.ics
new file mode 100644
index 00000000..92e51eb7
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Beirut.ics
@@ -0,0 +1,97 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Beirut
+X-LIC-LOCATION:Asia/Beirut
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19930328T000000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19991031T000000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0222
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:18800101T000000
+RDATE:18800101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19200328T000000
+RDATE:19200328T000000
+RDATE:19210403T000000
+RDATE:19220326T000000
+RDATE:19230422T000000
+RDATE:19570501T000000
+RDATE:19580501T000000
+RDATE:19590501T000000
+RDATE:19600501T000000
+RDATE:19610501T000000
+RDATE:19720622T000000
+RDATE:19730501T000000
+RDATE:19740501T000000
+RDATE:19750501T000000
+RDATE:19760501T000000
+RDATE:19770501T000000
+RDATE:19780430T000000
+RDATE:19840501T000000
+RDATE:19850501T000000
+RDATE:19860501T000000
+RDATE:19870501T000000
+RDATE:19880601T000000
+RDATE:19890510T000000
+RDATE:19900501T000000
+RDATE:19910501T000000
+RDATE:19920501T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19201025T000000
+RDATE:19201025T000000
+RDATE:19211003T000000
+RDATE:19221008T000000
+RDATE:19230916T000000
+RDATE:19571001T000000
+RDATE:19581001T000000
+RDATE:19591001T000000
+RDATE:19601001T000000
+RDATE:19611001T000000
+RDATE:19721001T000000
+RDATE:19731001T000000
+RDATE:19741001T000000
+RDATE:19751001T000000
+RDATE:19761001T000000
+RDATE:19771001T000000
+RDATE:19780930T000000
+RDATE:19841016T000000
+RDATE:19851016T000000
+RDATE:19861016T000000
+RDATE:19871016T000000
+RDATE:19881016T000000
+RDATE:19891016T000000
+RDATE:19901016T000000
+RDATE:19911016T000000
+RDATE:19921004T000000
+RDATE:19930926T000000
+RDATE:19940925T000000
+RDATE:19950924T000000
+RDATE:19960929T000000
+RDATE:19970928T000000
+RDATE:19980927T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Bishkek.ics b/libkcal/libical/zoneinfo/Asia/Bishkek.ics
new file mode 100644
index 00000000..68ebab26
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Bishkek.ics
@@ -0,0 +1,108 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Bishkek
+X-LIC-LOCATION:Asia/Bishkek
+BEGIN:STANDARD
+TZOFFSETFROM:+045824
+TZOFFSETTO:+0500
+TZNAME:FRUT
+DTSTART:19240502T000000
+RDATE:19240502T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0600
+TZNAME:FRUT
+DTSTART:19300621T000000
+RDATE:19300621T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0700
+TZNAME:FRUST
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0600
+TZNAME:FRUT
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:FRUST
+DTSTART:19910331T020000
+RDATE:19910331T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0500
+TZNAME:KGT
+DTSTART:19910831T020000
+RDATE:19910831T020000
+RDATE:19920927T000000
+RDATE:19930926T000000
+RDATE:19940925T000000
+RDATE:19950924T000000
+RDATE:19960929T000000
+RDATE:19971026T023000
+RDATE:19981025T023000
+RDATE:19991031T023000
+RDATE:20001029T023000
+RDATE:20011028T023000
+RDATE:20021027T023000
+RDATE:20031026T023000
+RDATE:20041031T023000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0600
+TZNAME:KGST
+DTSTART:19920412T000000
+RDATE:19920412T000000
+RDATE:19930411T000000
+RDATE:19940410T000000
+RDATE:19950409T000000
+RDATE:19960407T000000
+RDATE:19970330T023000
+RDATE:19980329T023000
+RDATE:19990328T023000
+RDATE:20000326T023000
+RDATE:20010325T023000
+RDATE:20020331T023000
+RDATE:20030330T023000
+RDATE:20040328T023000
+RDATE:20050327T023000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:KGT
+DTSTART:20050812T000000
+RDATE:20050812T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Brunei.ics b/libkcal/libical/zoneinfo/Asia/Brunei.ics
new file mode 100644
index 00000000..37a10a38
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Brunei.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Brunei
+X-LIC-LOCATION:Asia/Brunei
+BEGIN:STANDARD
+TZOFFSETFROM:+073940
+TZOFFSETTO:+0730
+TZNAME:BNT
+DTSTART:19260301T000000
+RDATE:19260301T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0730
+TZOFFSETTO:+0800
+TZNAME:BNT
+DTSTART:19330101T000000
+RDATE:19330101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Calcutta.ics b/libkcal/libical/zoneinfo/Asia/Calcutta.ics
new file mode 100644
index 00000000..8940799d
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Calcutta.ics
@@ -0,0 +1,37 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20071016_1/Asia/Calcutta
+X-LIC-LOCATION:Asia/Calcutta
+BEGIN:STANDARD
+TZOFFSETFROM:+055328
+TZOFFSETTO:+055320
+TZNAME:HMT
+DTSTART:18800101T000000
+RDATE:18800101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+055320
+TZOFFSETTO:+0630
+TZNAME:BURT
+DTSTART:19411001T000000
+RDATE:19411001T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0630
+TZOFFSETTO:+0530
+TZNAME:IST
+DTSTART:19420515T000000
+RDATE:19420515T000000
+RDATE:19451015T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0530
+TZOFFSETTO:+0630
+TZNAME:IST
+DTSTART:19420901T000000
+RDATE:19420901T000000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Choibalsan.ics b/libkcal/libical/zoneinfo/Asia/Choibalsan.ics
new file mode 100644
index 00000000..b15a710f
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Choibalsan.ics
@@ -0,0 +1,84 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Choibalsan
+X-LIC-LOCATION:Asia/Choibalsan
+BEGIN:STANDARD
+TZOFFSETFROM:+0738
+TZOFFSETTO:+0700
+TZNAME:ULAT
+DTSTART:19050801T000000
+RDATE:19050801T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0800
+TZNAME:ULAT
+DTSTART:19780101T000000
+RDATE:19780101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0800
+TZOFFSETTO:+1000
+TZNAME:CHOST
+DTSTART:19830401T000000
+RDATE:19830401T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+0900
+TZNAME:CHOT
+DTSTART:19831001T000000
+RDATE:19831001T000000
+RDATE:19840930T000000
+RDATE:19850929T000000
+RDATE:19860928T000000
+RDATE:19870927T000000
+RDATE:19880925T000000
+RDATE:19890924T000000
+RDATE:19900930T000000
+RDATE:19910929T000000
+RDATE:19920927T000000
+RDATE:19930926T000000
+RDATE:19940925T000000
+RDATE:19950924T000000
+RDATE:19960929T000000
+RDATE:19970928T000000
+RDATE:19980927T000000
+RDATE:20010929T020000
+RDATE:20020928T020000
+RDATE:20030927T020000
+RDATE:20040925T020000
+RDATE:20050924T020000
+RDATE:20060930T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0900
+TZOFFSETTO:+1000
+TZNAME:CHOST
+DTSTART:19840401T000000
+RDATE:19840401T000000
+RDATE:19850331T000000
+RDATE:19860330T000000
+RDATE:19870329T000000
+RDATE:19880327T000000
+RDATE:19890326T000000
+RDATE:19900325T000000
+RDATE:19910331T000000
+RDATE:19920329T000000
+RDATE:19930328T000000
+RDATE:19940327T000000
+RDATE:19950326T000000
+RDATE:19960331T000000
+RDATE:19970330T000000
+RDATE:19980329T000000
+RDATE:20010428T020000
+RDATE:20020330T020000
+RDATE:20030329T020000
+RDATE:20040327T020000
+RDATE:20050326T020000
+RDATE:20060325T020000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Chongqing.ics b/libkcal/libical/zoneinfo/Asia/Chongqing.ics
new file mode 100644
index 00000000..77ec16b6
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Chongqing.ics
@@ -0,0 +1,46 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Chongqing
+X-LIC-LOCATION:Asia/Chongqing
+BEGIN:STANDARD
+TZOFFSETFROM:+070620
+TZOFFSETTO:+0700
+TZNAME:LONT
+DTSTART:19280101T000000
+RDATE:19280101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0800
+TZNAME:CST
+DTSTART:19800501T000000
+RDATE:19800501T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0900
+TZNAME:CDT
+DTSTART:19860504T000000
+RDATE:19860504T000000
+RDATE:19870412T000000
+RDATE:19880410T000000
+RDATE:19890416T000000
+RDATE:19900415T000000
+RDATE:19910414T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0800
+TZNAME:CST
+DTSTART:19860914T000000
+RDATE:19860914T000000
+RDATE:19870913T000000
+RDATE:19880911T000000
+RDATE:19890917T000000
+RDATE:19900916T000000
+RDATE:19910915T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Colombo.ics b/libkcal/libical/zoneinfo/Asia/Colombo.ics
new file mode 100644
index 00000000..de2cd619
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Colombo.ics
@@ -0,0 +1,64 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Colombo
+X-LIC-LOCATION:Asia/Colombo
+BEGIN:STANDARD
+TZOFFSETFROM:+051924
+TZOFFSETTO:+051932
+TZNAME:MMT
+DTSTART:18800101T000000
+RDATE:18800101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+051932
+TZOFFSETTO:+0530
+TZNAME:IST
+DTSTART:19060101T000000
+RDATE:19060101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0530
+TZOFFSETTO:+0600
+TZNAME:IHST
+DTSTART:19420105T000000
+RDATE:19420105T000000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0630
+TZNAME:IST
+DTSTART:19420901T000000
+RDATE:19420901T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0630
+TZOFFSETTO:+0530
+TZNAME:IST
+DTSTART:19451016T020000
+RDATE:19451016T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0530
+TZOFFSETTO:+0630
+TZNAME:LKT
+DTSTART:19960525T000000
+RDATE:19960525T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0630
+TZOFFSETTO:+0600
+TZNAME:LKT
+DTSTART:19961026T003000
+RDATE:19961026T003000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0530
+TZNAME:IST
+DTSTART:20060415T003000
+RDATE:20060415T003000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Damascus.ics b/libkcal/libical/zoneinfo/Asia/Damascus.ics
new file mode 100644
index 00000000..017e0870
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Damascus.ics
@@ -0,0 +1,131 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Damascus
+X-LIC-LOCATION:Asia/Damascus
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:20080404T000000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1FR
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:20081001T000000
+RRULE:FREQ=YEARLY
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+022512
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19200101T000000
+RDATE:19200101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19200418T020000
+RDATE:19200418T020000
+RDATE:19210417T020000
+RDATE:19220416T020000
+RDATE:19230415T020000
+RDATE:19620429T020000
+RDATE:19630501T020000
+RDATE:19640501T020000
+RDATE:19650501T020000
+RDATE:19660424T020000
+RDATE:19670501T020000
+RDATE:19680501T020000
+RDATE:19690501T020000
+RDATE:19700501T020000
+RDATE:19710501T020000
+RDATE:19720501T020000
+RDATE:19730501T020000
+RDATE:19740501T020000
+RDATE:19750501T020000
+RDATE:19760501T020000
+RDATE:19770501T020000
+RDATE:19780501T020000
+RDATE:19830409T020000
+RDATE:19840409T020000
+RDATE:19860216T020000
+RDATE:19870301T020000
+RDATE:19880315T020000
+RDATE:19890331T020000
+RDATE:19900401T020000
+RDATE:19910401T000000
+RDATE:19920408T000000
+RDATE:19930326T000000
+RDATE:19940401T000000
+RDATE:19950401T000000
+RDATE:19960401T000000
+RDATE:19970331T000000
+RDATE:19980330T000000
+RDATE:19990401T000000
+RDATE:20000401T000000
+RDATE:20010401T000000
+RDATE:20020401T000000
+RDATE:20030401T000000
+RDATE:20040401T000000
+RDATE:20050401T000000
+RDATE:20060401T000000
+RDATE:20070330T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19201003T020000
+RDATE:19201003T020000
+RDATE:19211002T020000
+RDATE:19221001T020000
+RDATE:19231007T020000
+RDATE:19621001T020000
+RDATE:19630930T020000
+RDATE:19641001T020000
+RDATE:19650930T020000
+RDATE:19661001T020000
+RDATE:19671001T020000
+RDATE:19681001T020000
+RDATE:19691001T020000
+RDATE:19701001T020000
+RDATE:19711001T020000
+RDATE:19721001T020000
+RDATE:19731001T020000
+RDATE:19741001T020000
+RDATE:19751001T020000
+RDATE:19761001T020000
+RDATE:19770901T020000
+RDATE:19780901T020000
+RDATE:19831001T020000
+RDATE:19841001T020000
+RDATE:19861009T020000
+RDATE:19871031T020000
+RDATE:19881031T020000
+RDATE:19891001T020000
+RDATE:19900930T020000
+RDATE:19911001T000000
+RDATE:19921001T000000
+RDATE:19930925T000000
+RDATE:19941001T000000
+RDATE:19951001T000000
+RDATE:19961001T000000
+RDATE:19971001T000000
+RDATE:19981001T000000
+RDATE:19991001T000000
+RDATE:20001001T000000
+RDATE:20011001T000000
+RDATE:20021001T000000
+RDATE:20031001T000000
+RDATE:20041001T000000
+RDATE:20051001T000000
+RDATE:20060922T000000
+RDATE:20071102T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Dhaka.ics b/libkcal/libical/zoneinfo/Asia/Dhaka.ics
new file mode 100644
index 00000000..950f7c6d
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Dhaka.ics
@@ -0,0 +1,50 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Dhaka
+X-LIC-LOCATION:Asia/Dhaka
+BEGIN:STANDARD
+TZOFFSETFROM:+060140
+TZOFFSETTO:+055320
+TZNAME:HMT
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+055320
+TZOFFSETTO:+0630
+TZNAME:BURT
+DTSTART:19411001T000000
+RDATE:19411001T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0630
+TZOFFSETTO:+0530
+TZNAME:IST
+DTSTART:19420515T000000
+RDATE:19420515T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0530
+TZOFFSETTO:+0630
+TZNAME:BURT
+DTSTART:19420901T000000
+RDATE:19420901T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0630
+TZOFFSETTO:+0600
+TZNAME:DACT
+DTSTART:19510930T000000
+RDATE:19510930T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:BDT
+DTSTART:19710326T000000
+RDATE:19710326T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Dili.ics b/libkcal/libical/zoneinfo/Asia/Dili.ics
new file mode 100644
index 00000000..d3783b05
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Dili.ics
@@ -0,0 +1,43 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Dili
+X-LIC-LOCATION:Asia/Dili
+BEGIN:STANDARD
+TZOFFSETFROM:+082220
+TZOFFSETTO:+0800
+TZNAME:TLT
+DTSTART:19120101T000000
+RDATE:19120101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0900
+TZNAME:JST
+DTSTART:19420221T230000
+RDATE:19420221T230000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0900
+TZNAME:TLT
+DTSTART:19450923T000000
+RDATE:19450923T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0800
+TZNAME:CIT
+DTSTART:19760503T000000
+RDATE:19760503T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0900
+TZNAME:TLT
+DTSTART:20000917T000000
+RDATE:20000917T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Dubai.ics b/libkcal/libical/zoneinfo/Asia/Dubai.ics
new file mode 100644
index 00000000..89964513
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Dubai.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Dubai
+X-LIC-LOCATION:Asia/Dubai
+BEGIN:STANDARD
+TZOFFSETFROM:+034112
+TZOFFSETTO:+0400
+TZNAME:GST
+DTSTART:19200101T000000
+RDATE:19200101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Dushanbe.ics b/libkcal/libical/zoneinfo/Asia/Dushanbe.ics
new file mode 100644
index 00000000..6e5bb620
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Dushanbe.ics
@@ -0,0 +1,68 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Dushanbe
+X-LIC-LOCATION:Asia/Dushanbe
+BEGIN:STANDARD
+TZOFFSETFROM:+043512
+TZOFFSETTO:+0500
+TZNAME:DUST
+DTSTART:19240502T000000
+RDATE:19240502T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0600
+TZNAME:DUST
+DTSTART:19300621T000000
+RDATE:19300621T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0700
+TZNAME:DUSST
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0600
+TZNAME:DUST
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:DUSST
+DTSTART:19910331T020000
+RDATE:19910331T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0500
+TZNAME:TJT
+DTSTART:19910909T030000
+RDATE:19910909T030000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Gaza.ics b/libkcal/libical/zoneinfo/Asia/Gaza.ics
new file mode 100644
index 00000000..d1d34719
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Gaza.ics
@@ -0,0 +1,147 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Gaza
+X-LIC-LOCATION:Asia/Gaza
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:20060401T000000
+RRULE:FREQ=YEARLY
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:20070913T020000
+RRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=2TH
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+021752
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19001001T000000
+RDATE:19001001T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EET
+DTSTART:19400601T000000
+RDATE:19400601T000000
+RDATE:19430401T020000
+RDATE:19440401T000000
+RDATE:19450416T000000
+RDATE:19460416T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19421101T000000
+RDATE:19421101T000000
+RDATE:19431101T000000
+RDATE:19441101T000000
+RDATE:19451101T020000
+RDATE:19461101T000000
+RDATE:19571001T000000
+RDATE:19581001T000000
+RDATE:19590930T030000
+RDATE:19600930T030000
+RDATE:19610930T030000
+RDATE:19620930T030000
+RDATE:19630930T030000
+RDATE:19640930T030000
+RDATE:19650930T030000
+RDATE:19661001T030000
+RDATE:19960920T010000
+RDATE:19970919T010000
+RDATE:19980918T010000
+RDATE:19991015T000000
+RDATE:20001020T000000
+RDATE:20011019T000000
+RDATE:20021018T000000
+RDATE:20031017T000000
+RDATE:20041001T010000
+RDATE:20051004T020000
+RDATE:20060922T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19480515T000000
+RDATE:19480515T000000
+RDATE:19960101T000000
+RDATE:19990101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19570510T000000
+RDATE:19570510T000000
+RDATE:19580501T000000
+RDATE:19590501T010000
+RDATE:19600501T010000
+RDATE:19610501T010000
+RDATE:19620501T010000
+RDATE:19630501T010000
+RDATE:19640501T010000
+RDATE:19650501T010000
+RDATE:19660501T010000
+RDATE:19670501T010000
+RDATE:19960405T000000
+RDATE:19970404T000000
+RDATE:19980403T000000
+RDATE:19990416T000000
+RDATE:20000421T000000
+RDATE:20010420T000000
+RDATE:20020419T000000
+RDATE:20030418T000000
+RDATE:20040416T000000
+RDATE:20050415T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:IST
+DTSTART:19670605T000000
+RDATE:19670605T000000
+RDATE:19741013T000000
+RDATE:19750831T000000
+RDATE:19850915T000000
+RDATE:19860907T000000
+RDATE:19870913T000000
+RDATE:19880903T000000
+RDATE:19890903T000000
+RDATE:19900826T000000
+RDATE:19910901T000000
+RDATE:19920906T000000
+RDATE:19930905T000000
+RDATE:19940828T000000
+RDATE:19950903T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:IDT
+DTSTART:19740707T000000
+RDATE:19740707T000000
+RDATE:19750420T000000
+RDATE:19850414T000000
+RDATE:19860518T000000
+RDATE:19870415T000000
+RDATE:19880409T000000
+RDATE:19890430T000000
+RDATE:19900325T000000
+RDATE:19910324T000000
+RDATE:19920329T000000
+RDATE:19930402T000000
+RDATE:19940401T000000
+RDATE:19950331T000000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Harbin.ics b/libkcal/libical/zoneinfo/Asia/Harbin.ics
new file mode 100644
index 00000000..c3e4213e
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Harbin.ics
@@ -0,0 +1,61 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Harbin
+X-LIC-LOCATION:Asia/Harbin
+BEGIN:STANDARD
+TZOFFSETFROM:+082644
+TZOFFSETTO:+0830
+TZNAME:CHAT
+DTSTART:19280101T000000
+RDATE:19280101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0830
+TZOFFSETTO:+0800
+TZNAME:CST
+DTSTART:19320301T000000
+RDATE:19320301T000000
+RDATE:19800501T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0900
+TZNAME:CHAT
+DTSTART:19400101T000000
+RDATE:19400101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0830
+TZNAME:CHAT
+DTSTART:19660501T000000
+RDATE:19660501T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0900
+TZNAME:CDT
+DTSTART:19860504T000000
+RDATE:19860504T000000
+RDATE:19870412T000000
+RDATE:19880410T000000
+RDATE:19890416T000000
+RDATE:19900415T000000
+RDATE:19910414T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0800
+TZNAME:CST
+DTSTART:19860914T000000
+RDATE:19860914T000000
+RDATE:19870913T000000
+RDATE:19880911T000000
+RDATE:19890917T000000
+RDATE:19900916T000000
+RDATE:19910915T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Ho_Chi_Minh.ics b/libkcal/libical/zoneinfo/Asia/Ho_Chi_Minh.ics
new file mode 100644
index 00000000..47dd9749
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Ho_Chi_Minh.ics
@@ -0,0 +1,36 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Ho_Chi_Minh
+X-LIC-LOCATION:Asia/Ho_Chi_Minh
+BEGIN:STANDARD
+TZOFFSETFROM:+070640
+TZOFFSETTO:+070620
+TZNAME:SMT
+DTSTART:19060609T000000
+RDATE:19060609T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+070620
+TZOFFSETTO:+0700
+TZNAME:ICT
+DTSTART:19110311T000100
+RDATE:19110311T000100
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0800
+TZNAME:ICT
+DTSTART:19120501T000000
+RDATE:19120501T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0700
+TZNAME:ICT
+DTSTART:19310501T000000
+RDATE:19310501T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Hong_Kong.ics b/libkcal/libical/zoneinfo/Asia/Hong_Kong.ics
new file mode 100644
index 00000000..aab7b56b
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Hong_Kong.ics
@@ -0,0 +1,95 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Hong_Kong
+X-LIC-LOCATION:Asia/Hong_Kong
+BEGIN:STANDARD
+TZOFFSETFROM:+073636
+TZOFFSETTO:+0800
+TZNAME:HKT
+DTSTART:19041030T000000
+RDATE:19041030T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0900
+TZNAME:HKST
+DTSTART:19460420T033000
+RDATE:19460420T033000
+RDATE:19470413T033000
+RDATE:19480502T033000
+RDATE:19490403T033000
+RDATE:19500402T033000
+RDATE:19510401T033000
+RDATE:19520406T033000
+RDATE:19530405T033000
+RDATE:19540321T033000
+RDATE:19550320T033000
+RDATE:19560318T033000
+RDATE:19570324T033000
+RDATE:19580323T033000
+RDATE:19590322T033000
+RDATE:19600320T033000
+RDATE:19610319T033000
+RDATE:19620318T033000
+RDATE:19630324T033000
+RDATE:19640322T033000
+RDATE:19650418T033000
+RDATE:19660417T033000
+RDATE:19670416T033000
+RDATE:19680421T033000
+RDATE:19690420T033000
+RDATE:19700419T033000
+RDATE:19710418T033000
+RDATE:19720416T033000
+RDATE:19730422T033000
+RDATE:19740421T033000
+RDATE:19750420T033000
+RDATE:19760418T033000
+RDATE:19770417T033000
+RDATE:19790513T033000
+RDATE:19800511T033000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0800
+TZNAME:HKT
+DTSTART:19461201T033000
+RDATE:19461201T033000
+RDATE:19471230T033000
+RDATE:19481031T033000
+RDATE:19491030T033000
+RDATE:19501029T033000
+RDATE:19511028T033000
+RDATE:19521026T033000
+RDATE:19531101T033000
+RDATE:19541031T033000
+RDATE:19551106T033000
+RDATE:19561104T033000
+RDATE:19571103T033000
+RDATE:19581102T033000
+RDATE:19591101T033000
+RDATE:19601106T033000
+RDATE:19611105T033000
+RDATE:19621104T033000
+RDATE:19631103T033000
+RDATE:19641101T033000
+RDATE:19651017T033000
+RDATE:19661016T033000
+RDATE:19671022T033000
+RDATE:19681020T033000
+RDATE:19691019T033000
+RDATE:19701018T033000
+RDATE:19711017T033000
+RDATE:19721022T033000
+RDATE:19731021T033000
+RDATE:19741020T033000
+RDATE:19751019T033000
+RDATE:19761017T033000
+RDATE:19771016T033000
+RDATE:19791021T033000
+RDATE:19801019T033000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Hovd.ics b/libkcal/libical/zoneinfo/Asia/Hovd.ics
new file mode 100644
index 00000000..7cd0a3a7
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Hovd.ics
@@ -0,0 +1,78 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Hovd
+X-LIC-LOCATION:Asia/Hovd
+BEGIN:STANDARD
+TZOFFSETFROM:+060636
+TZOFFSETTO:+0600
+TZNAME:HOVT
+DTSTART:19050801T000000
+RDATE:19050801T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0700
+TZNAME:HOVT
+DTSTART:19780101T000000
+RDATE:19780101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0800
+TZNAME:HOVST
+DTSTART:19830401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T000000
+RDATE:19860330T000000
+RDATE:19870329T000000
+RDATE:19880327T000000
+RDATE:19890326T000000
+RDATE:19900325T000000
+RDATE:19910331T000000
+RDATE:19920329T000000
+RDATE:19930328T000000
+RDATE:19940327T000000
+RDATE:19950326T000000
+RDATE:19960331T000000
+RDATE:19970330T000000
+RDATE:19980329T000000
+RDATE:20010428T020000
+RDATE:20020330T020000
+RDATE:20030329T020000
+RDATE:20040327T020000
+RDATE:20050326T020000
+RDATE:20060325T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0700
+TZNAME:HOVT
+DTSTART:19831001T000000
+RDATE:19831001T000000
+RDATE:19840930T000000
+RDATE:19850929T000000
+RDATE:19860928T000000
+RDATE:19870927T000000
+RDATE:19880925T000000
+RDATE:19890924T000000
+RDATE:19900930T000000
+RDATE:19910929T000000
+RDATE:19920927T000000
+RDATE:19930926T000000
+RDATE:19940925T000000
+RDATE:19950924T000000
+RDATE:19960929T000000
+RDATE:19970928T000000
+RDATE:19980927T000000
+RDATE:20010929T020000
+RDATE:20020928T020000
+RDATE:20030927T020000
+RDATE:20040925T020000
+RDATE:20050924T020000
+RDATE:20060930T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Irkutsk.ics b/libkcal/libical/zoneinfo/Asia/Irkutsk.ics
new file mode 100644
index 00000000..df1ce38b
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Irkutsk.ics
@@ -0,0 +1,95 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Irkutsk
+X-LIC-LOCATION:Asia/Irkutsk
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0900
+TZNAME:IRKST
+DTSTART:19930328T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0800
+TZNAME:IRKT
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+065720
+TZOFFSETTO:+065720
+TZNAME:IMT
+DTSTART:18800101T000000
+RDATE:18800101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+065720
+TZOFFSETTO:+0700
+TZNAME:IRKT
+DTSTART:19200125T000000
+RDATE:19200125T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0800
+TZNAME:IRKT
+DTSTART:19300621T000000
+RDATE:19300621T000000
+RDATE:19920119T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0900
+TZNAME:IRKST
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+RDATE:19920328T230000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0800
+TZNAME:IRKT
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19920926T230000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0800
+TZNAME:IRKST
+DTSTART:19910331T020000
+RDATE:19910331T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0700
+TZNAME:IRKT
+DTSTART:19910929T030000
+RDATE:19910929T030000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Istanbul.ics b/libkcal/libical/zoneinfo/Asia/Istanbul.ics
new file mode 100644
index 00000000..fa0d2752
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Istanbul.ics
@@ -0,0 +1,187 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Istanbul
+X-LIC-LOCATION:Asia/Istanbul
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:20070325T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:20071028T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+015552
+TZOFFSETTO:+015656
+TZNAME:IMT
+DTSTART:18800101T000000
+RDATE:18800101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+015656
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19101001T000000
+RDATE:19101001T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19160501T000000
+RDATE:19160501T000000
+RDATE:19200328T000000
+RDATE:19210403T000000
+RDATE:19220326T000000
+RDATE:19240513T000000
+RDATE:19250501T000000
+RDATE:19400630T000000
+RDATE:19401201T000000
+RDATE:19420401T000000
+RDATE:19450402T000000
+RDATE:19460601T000000
+RDATE:19470420T000000
+RDATE:19480418T000000
+RDATE:19490410T000000
+RDATE:19500419T000000
+RDATE:19510422T000000
+RDATE:19620715T000000
+RDATE:19640515T000000
+RDATE:19700503T000000
+RDATE:19710502T000000
+RDATE:19720507T000000
+RDATE:19730603T010000
+RDATE:19740331T020000
+RDATE:19750330T000000
+RDATE:19760601T000000
+RDATE:19770403T000000
+RDATE:19780402T000000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+RDATE:19910331T010000
+RDATE:19920329T010000
+RDATE:19930328T010000
+RDATE:19940327T010000
+RDATE:19950326T010000
+RDATE:19960331T010000
+RDATE:19970330T010000
+RDATE:19980329T010000
+RDATE:19990328T010000
+RDATE:20000326T010000
+RDATE:20010325T010000
+RDATE:20020331T010000
+RDATE:20030330T010000
+RDATE:20040328T010000
+RDATE:20050327T010000
+RDATE:20060326T010000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19161001T000000
+RDATE:19161001T000000
+RDATE:19201025T000000
+RDATE:19211003T000000
+RDATE:19221008T000000
+RDATE:19241001T000000
+RDATE:19251001T000000
+RDATE:19401005T000000
+RDATE:19410921T000000
+RDATE:19421101T000000
+RDATE:19451008T000000
+RDATE:19461001T000000
+RDATE:19471005T000000
+RDATE:19481003T000000
+RDATE:19491002T000000
+RDATE:19501008T000000
+RDATE:19511008T000000
+RDATE:19621008T000000
+RDATE:19641001T000000
+RDATE:19701004T000000
+RDATE:19711003T000000
+RDATE:19721008T000000
+RDATE:19731104T030000
+RDATE:19741103T050000
+RDATE:19751026T000000
+RDATE:19761031T000000
+RDATE:19771016T000000
+RDATE:19850928T000000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T020000
+RDATE:19920927T020000
+RDATE:19930926T020000
+RDATE:19940925T020000
+RDATE:19950924T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:TRST
+DTSTART:19781015T000000
+RDATE:19781015T000000
+RDATE:19800406T030000
+RDATE:19810329T030000
+RDATE:19820328T030000
+RDATE:19830731T000000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0400
+TZNAME:TRST
+DTSTART:19790401T030000
+RDATE:19790401T030000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0300
+TZNAME:TRT
+DTSTART:19791015T000000
+RDATE:19791015T000000
+RDATE:19801013T000000
+RDATE:19811012T000000
+RDATE:19821011T000000
+RDATE:19831002T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19850420T000000
+RDATE:19850420T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:20070101T000000
+RDATE:20070101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Jakarta.ics b/libkcal/libical/zoneinfo/Asia/Jakarta.ics
new file mode 100644
index 00000000..e5037cc0
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Jakarta.ics
@@ -0,0 +1,64 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Jakarta
+X-LIC-LOCATION:Asia/Jakarta
+BEGIN:STANDARD
+TZOFFSETFROM:+070712
+TZOFFSETTO:+070712
+TZNAME:JMT
+DTSTART:18670810T000000
+RDATE:18670810T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+070712
+TZOFFSETTO:+0720
+TZNAME:JAVT
+DTSTART:19231231T234712
+RDATE:19231231T234712
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0720
+TZOFFSETTO:+0730
+TZNAME:WIT
+DTSTART:19321101T000000
+RDATE:19321101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0730
+TZOFFSETTO:+0900
+TZNAME:JST
+DTSTART:19420323T000000
+RDATE:19420323T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0730
+TZNAME:WIT
+DTSTART:19450923T000000
+RDATE:19450923T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0730
+TZOFFSETTO:+0800
+TZNAME:WIT
+DTSTART:19480501T000000
+RDATE:19480501T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0730
+TZNAME:WIT
+DTSTART:19500501T000000
+RDATE:19500501T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0730
+TZOFFSETTO:+0700
+TZNAME:WIT
+DTSTART:19640101T000000
+RDATE:19640101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Jayapura.ics b/libkcal/libical/zoneinfo/Asia/Jayapura.ics
new file mode 100644
index 00000000..dc56e9af
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Jayapura.ics
@@ -0,0 +1,29 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Jayapura
+X-LIC-LOCATION:Asia/Jayapura
+BEGIN:STANDARD
+TZOFFSETFROM:+092248
+TZOFFSETTO:+0900
+TZNAME:EIT
+DTSTART:19321101T000000
+RDATE:19321101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0930
+TZNAME:CST
+DTSTART:19440901T000000
+RDATE:19440901T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0930
+TZOFFSETTO:+0900
+TZNAME:EIT
+DTSTART:19640101T000000
+RDATE:19640101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Jerusalem.ics b/libkcal/libical/zoneinfo/Asia/Jerusalem.ics
new file mode 100644
index 00000000..3c1149eb
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Jerusalem.ics
@@ -0,0 +1,187 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Jerusalem
+X-LIC-LOCATION:Asia/Jerusalem
+BEGIN:STANDARD
+TZOFFSETFROM:+022056
+TZOFFSETTO:+022040
+TZNAME:JMT
+DTSTART:18800101T000000
+RDATE:18800101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+022040
+TZOFFSETTO:+0200
+TZNAME:IST
+DTSTART:19180101T000000
+RDATE:19180101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:IDT
+DTSTART:19400601T000000
+RDATE:19400601T000000
+RDATE:19430401T020000
+RDATE:19440401T000000
+RDATE:19450416T000000
+RDATE:19460416T020000
+RDATE:19490501T000000
+RDATE:19500416T000000
+RDATE:19510401T000000
+RDATE:19520420T020000
+RDATE:19530412T020000
+RDATE:19540613T000000
+RDATE:19550611T020000
+RDATE:19560603T000000
+RDATE:19570429T020000
+RDATE:19740707T000000
+RDATE:19750420T000000
+RDATE:19850414T000000
+RDATE:19860518T000000
+RDATE:19870415T000000
+RDATE:19880409T000000
+RDATE:19890430T000000
+RDATE:19900325T000000
+RDATE:19910324T000000
+RDATE:19920329T000000
+RDATE:19930402T000000
+RDATE:19940401T000000
+RDATE:19950331T000000
+RDATE:19960315T000000
+RDATE:19970321T000000
+RDATE:19980320T000000
+RDATE:19990402T020000
+RDATE:20000414T020000
+RDATE:20010409T010000
+RDATE:20020329T010000
+RDATE:20030328T010000
+RDATE:20040407T010000
+RDATE:20050401T020000
+RDATE:20060331T020000
+RDATE:20070330T020000
+RDATE:20080328T020000
+RDATE:20090327T020000
+RDATE:20100326T020000
+RDATE:20110401T020000
+RDATE:20120330T020000
+RDATE:20130329T020000
+RDATE:20140328T020000
+RDATE:20150327T020000
+RDATE:20160401T020000
+RDATE:20170331T020000
+RDATE:20180330T020000
+RDATE:20190329T020000
+RDATE:20200327T020000
+RDATE:20210326T020000
+RDATE:20220401T020000
+RDATE:20230331T020000
+RDATE:20240329T020000
+RDATE:20250328T020000
+RDATE:20260327T020000
+RDATE:20270326T020000
+RDATE:20280331T020000
+RDATE:20290330T020000
+RDATE:20300329T020000
+RDATE:20310328T020000
+RDATE:20320326T020000
+RDATE:20330401T020000
+RDATE:20340331T020000
+RDATE:20350330T020000
+RDATE:20360328T020000
+RDATE:20370327T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:IST
+DTSTART:19421101T000000
+RDATE:19421101T000000
+RDATE:19431101T000000
+RDATE:19441101T000000
+RDATE:19451101T020000
+RDATE:19461101T000000
+RDATE:19481101T020000
+RDATE:19491101T020000
+RDATE:19500915T030000
+RDATE:19511111T030000
+RDATE:19521019T030000
+RDATE:19530913T030000
+RDATE:19540912T000000
+RDATE:19550911T000000
+RDATE:19560930T030000
+RDATE:19570922T000000
+RDATE:19741013T000000
+RDATE:19750831T000000
+RDATE:19850915T000000
+RDATE:19860907T000000
+RDATE:19870913T000000
+RDATE:19880903T000000
+RDATE:19890903T000000
+RDATE:19900826T000000
+RDATE:19910901T000000
+RDATE:19920906T000000
+RDATE:19930905T000000
+RDATE:19940828T000000
+RDATE:19950903T000000
+RDATE:19960916T000000
+RDATE:19970914T000000
+RDATE:19980906T000000
+RDATE:19990903T020000
+RDATE:20001006T010000
+RDATE:20010924T010000
+RDATE:20021007T010000
+RDATE:20031003T010000
+RDATE:20040922T010000
+RDATE:20051009T020000
+RDATE:20061001T020000
+RDATE:20070916T020000
+RDATE:20081005T020000
+RDATE:20090927T020000
+RDATE:20100912T020000
+RDATE:20111002T020000
+RDATE:20120923T020000
+RDATE:20130908T020000
+RDATE:20140928T020000
+RDATE:20150920T020000
+RDATE:20161009T020000
+RDATE:20170924T020000
+RDATE:20180916T020000
+RDATE:20191006T020000
+RDATE:20200927T020000
+RDATE:20210912T020000
+RDATE:20221002T020000
+RDATE:20230924T020000
+RDATE:20241006T020000
+RDATE:20250928T020000
+RDATE:20260920T020000
+RDATE:20271010T020000
+RDATE:20280924T020000
+RDATE:20290916T020000
+RDATE:20301006T020000
+RDATE:20310921T020000
+RDATE:20320912T020000
+RDATE:20331002T020000
+RDATE:20340917T020000
+RDATE:20351007T020000
+RDATE:20360928T020000
+RDATE:20370913T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0400
+TZNAME:IDDT
+DTSTART:19480523T000000
+RDATE:19480523T000000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0300
+TZNAME:IDT
+DTSTART:19480901T000000
+RDATE:19480901T000000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Kabul.ics b/libkcal/libical/zoneinfo/Asia/Kabul.ics
new file mode 100644
index 00000000..60f7d892
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Kabul.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Kabul
+X-LIC-LOCATION:Asia/Kabul
+BEGIN:STANDARD
+TZOFFSETFROM:+043648
+TZOFFSETTO:+0400
+TZNAME:AFT
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0430
+TZNAME:AFT
+DTSTART:19450101T000000
+RDATE:19450101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Kamchatka.ics b/libkcal/libical/zoneinfo/Asia/Kamchatka.ics
new file mode 100644
index 00000000..9e5b1c30
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Kamchatka.ics
@@ -0,0 +1,88 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Kamchatka
+X-LIC-LOCATION:Asia/Kamchatka
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1300
+TZNAME:PETST
+DTSTART:19930328T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1300
+TZOFFSETTO:+1200
+TZNAME:PETT
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+103436
+TZOFFSETTO:+1100
+TZNAME:PETT
+DTSTART:19221110T000000
+RDATE:19221110T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1200
+TZNAME:PETT
+DTSTART:19300621T000000
+RDATE:19300621T000000
+RDATE:19920119T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1300
+TZNAME:PETST
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+RDATE:19920328T230000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1300
+TZOFFSETTO:+1200
+TZNAME:PETT
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19920926T230000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1200
+TZNAME:PETST
+DTSTART:19910331T020000
+RDATE:19910331T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1100
+TZNAME:PETT
+DTSTART:19910929T030000
+RDATE:19910929T030000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Karachi.ics b/libkcal/libical/zoneinfo/Asia/Karachi.ics
new file mode 100644
index 00000000..e07bc9ad
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Karachi.ics
@@ -0,0 +1,57 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Karachi
+X-LIC-LOCATION:Asia/Karachi
+BEGIN:STANDARD
+TZOFFSETFROM:+042812
+TZOFFSETTO:+0530
+TZNAME:IST
+DTSTART:19070101T000000
+RDATE:19070101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0530
+TZOFFSETTO:+0630
+TZNAME:IST
+DTSTART:19420901T000000
+RDATE:19420901T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0630
+TZOFFSETTO:+0530
+TZNAME:IST
+DTSTART:19451015T000000
+RDATE:19451015T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0530
+TZOFFSETTO:+0500
+TZNAME:KART
+DTSTART:19510930T000000
+RDATE:19510930T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0500
+TZNAME:PKT
+DTSTART:19710326T000000
+RDATE:19710326T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0600
+TZNAME:PKST
+DTSTART:20020407T000100
+RDATE:20020407T000100
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0500
+TZNAME:PKT
+DTSTART:20021006T000100
+RDATE:20021006T000100
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Kashgar.ics b/libkcal/libical/zoneinfo/Asia/Kashgar.ics
new file mode 100644
index 00000000..6ddbce63
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Kashgar.ics
@@ -0,0 +1,53 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Kashgar
+X-LIC-LOCATION:Asia/Kashgar
+BEGIN:STANDARD
+TZOFFSETFROM:+050356
+TZOFFSETTO:+0530
+TZNAME:KAST
+DTSTART:19280101T000000
+RDATE:19280101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0530
+TZOFFSETTO:+0500
+TZNAME:KAST
+DTSTART:19400101T000000
+RDATE:19400101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0800
+TZNAME:CST
+DTSTART:19800501T000000
+RDATE:19800501T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0900
+TZNAME:CDT
+DTSTART:19860504T000000
+RDATE:19860504T000000
+RDATE:19870412T000000
+RDATE:19880410T000000
+RDATE:19890416T000000
+RDATE:19900415T000000
+RDATE:19910414T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0800
+TZNAME:CST
+DTSTART:19860914T000000
+RDATE:19860914T000000
+RDATE:19870913T000000
+RDATE:19880911T000000
+RDATE:19890917T000000
+RDATE:19900916T000000
+RDATE:19910915T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Katmandu.ics b/libkcal/libical/zoneinfo/Asia/Katmandu.ics
new file mode 100644
index 00000000..c469dea2
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Katmandu.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Katmandu
+X-LIC-LOCATION:Asia/Katmandu
+BEGIN:STANDARD
+TZOFFSETFROM:+054116
+TZOFFSETTO:+0530
+TZNAME:IST
+DTSTART:19200101T000000
+RDATE:19200101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0530
+TZOFFSETTO:+0545
+TZNAME:NPT
+DTSTART:19860101T000000
+RDATE:19860101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Kolkata.ics b/libkcal/libical/zoneinfo/Asia/Kolkata.ics
new file mode 100644
index 00000000..d170cb4f
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Kolkata.ics
@@ -0,0 +1,37 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Kolkata
+X-LIC-LOCATION:Asia/Kolkata
+BEGIN:STANDARD
+TZOFFSETFROM:+055328
+TZOFFSETTO:+055320
+TZNAME:HMT
+DTSTART:18800101T000000
+RDATE:18800101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+055320
+TZOFFSETTO:+0630
+TZNAME:BURT
+DTSTART:19411001T000000
+RDATE:19411001T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0630
+TZOFFSETTO:+0530
+TZNAME:IST
+DTSTART:19420515T000000
+RDATE:19420515T000000
+RDATE:19451015T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0530
+TZOFFSETTO:+0630
+TZNAME:IST
+DTSTART:19420901T000000
+RDATE:19420901T000000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Krasnoyarsk.ics b/libkcal/libical/zoneinfo/Asia/Krasnoyarsk.ics
new file mode 100644
index 00000000..aab8fa26
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Krasnoyarsk.ics
@@ -0,0 +1,88 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Krasnoyarsk
+X-LIC-LOCATION:Asia/Krasnoyarsk
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0800
+TZNAME:KRAST
+DTSTART:19930328T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0700
+TZNAME:KRAT
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+061120
+TZOFFSETTO:+0600
+TZNAME:KRAT
+DTSTART:19200106T000000
+RDATE:19200106T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0700
+TZNAME:KRAT
+DTSTART:19300621T000000
+RDATE:19300621T000000
+RDATE:19920119T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0800
+TZNAME:KRAST
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+RDATE:19920328T230000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0700
+TZNAME:KRAT
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19920926T230000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0700
+TZNAME:KRAST
+DTSTART:19910331T020000
+RDATE:19910331T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0600
+TZNAME:KRAT
+DTSTART:19910929T030000
+RDATE:19910929T030000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Kuala_Lumpur.ics b/libkcal/libical/zoneinfo/Asia/Kuala_Lumpur.ics
new file mode 100644
index 00000000..73323663
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Kuala_Lumpur.ics
@@ -0,0 +1,64 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Kuala_Lumpur
+X-LIC-LOCATION:Asia/Kuala_Lumpur
+BEGIN:STANDARD
+TZOFFSETFROM:+064646
+TZOFFSETTO:+065525
+TZNAME:SMT
+DTSTART:19010101T000000
+RDATE:19010101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+065525
+TZOFFSETTO:+0700
+TZNAME:MALT
+DTSTART:19050601T000000
+RDATE:19050601T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0720
+TZNAME:MALST
+DTSTART:19330101T000000
+RDATE:19330101T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0720
+TZOFFSETTO:+0720
+TZNAME:MALT
+DTSTART:19360101T000000
+RDATE:19360101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0720
+TZOFFSETTO:+0730
+TZNAME:MALT
+DTSTART:19410901T000000
+RDATE:19410901T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0730
+TZOFFSETTO:+0900
+TZNAME:JST
+DTSTART:19420216T000000
+RDATE:19420216T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0730
+TZNAME:MALT
+DTSTART:19450912T000000
+RDATE:19450912T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0730
+TZOFFSETTO:+0800
+TZNAME:MYT
+DTSTART:19820101T000000
+RDATE:19820101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Kuching.ics b/libkcal/libical/zoneinfo/Asia/Kuching.ics
new file mode 100644
index 00000000..73d83795
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Kuching.ics
@@ -0,0 +1,69 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Kuching
+X-LIC-LOCATION:Asia/Kuching
+BEGIN:STANDARD
+TZOFFSETFROM:+072120
+TZOFFSETTO:+0730
+TZNAME:BORT
+DTSTART:19260301T000000
+RDATE:19260301T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0730
+TZOFFSETTO:+0800
+TZNAME:BORT
+DTSTART:19330101T000000
+RDATE:19330101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0820
+TZNAME:BORTST
+DTSTART:19350914T000000
+RDATE:19350914T000000
+RDATE:19360914T000000
+RDATE:19370914T000000
+RDATE:19380914T000000
+RDATE:19390914T000000
+RDATE:19400914T000000
+RDATE:19410914T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0820
+TZOFFSETTO:+0800
+TZNAME:BORT
+DTSTART:19351214T000000
+RDATE:19351214T000000
+RDATE:19361214T000000
+RDATE:19371214T000000
+RDATE:19381214T000000
+RDATE:19391214T000000
+RDATE:19401214T000000
+RDATE:19411214T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0900
+TZNAME:JST
+DTSTART:19420216T000000
+RDATE:19420216T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0800
+TZNAME:BORT
+DTSTART:19450912T000000
+RDATE:19450912T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0800
+TZNAME:MYT
+DTSTART:19820101T000000
+RDATE:19820101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Kuwait.ics b/libkcal/libical/zoneinfo/Asia/Kuwait.ics
new file mode 100644
index 00000000..6c974846
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Kuwait.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Kuwait
+X-LIC-LOCATION:Asia/Kuwait
+BEGIN:STANDARD
+TZOFFSETFROM:+031156
+TZOFFSETTO:+0300
+TZNAME:AST
+DTSTART:19500101T000000
+RDATE:19500101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Macau.ics b/libkcal/libical/zoneinfo/Asia/Macau.ics
new file mode 100644
index 00000000..b5683941
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Macau.ics
@@ -0,0 +1,74 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Macau
+X-LIC-LOCATION:Asia/Macau
+BEGIN:STANDARD
+TZOFFSETFROM:+073420
+TZOFFSETTO:+0800
+TZNAME:MOT
+DTSTART:19120101T000000
+RDATE:19120101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0900
+TZNAME:MOST
+DTSTART:19610319T033000
+RDATE:19610319T033000
+RDATE:19620318T033000
+RDATE:19630317T000000
+RDATE:19640322T033000
+RDATE:19650321T000000
+RDATE:19660417T033000
+RDATE:19670416T033000
+RDATE:19680421T033000
+RDATE:19690420T033000
+RDATE:19700419T033000
+RDATE:19710418T033000
+RDATE:19720416T000000
+RDATE:19730415T000000
+RDATE:19740421T000000
+RDATE:19750420T033000
+RDATE:19760418T033000
+RDATE:19770417T033000
+RDATE:19780416T000000
+RDATE:19790415T000000
+RDATE:19800420T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0800
+TZNAME:MOT
+DTSTART:19611105T033000
+RDATE:19611105T033000
+RDATE:19621104T033000
+RDATE:19631103T033000
+RDATE:19641101T033000
+RDATE:19651031T000000
+RDATE:19661016T033000
+RDATE:19671022T033000
+RDATE:19681020T033000
+RDATE:19691019T033000
+RDATE:19701018T033000
+RDATE:19711017T033000
+RDATE:19721015T000000
+RDATE:19731021T000000
+RDATE:19741020T033000
+RDATE:19751019T033000
+RDATE:19761017T033000
+RDATE:19771016T033000
+RDATE:19781015T000000
+RDATE:19791021T000000
+RDATE:19801019T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0800
+TZNAME:CST
+DTSTART:19991220T000000
+RDATE:19991220T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Magadan.ics b/libkcal/libical/zoneinfo/Asia/Magadan.ics
new file mode 100644
index 00000000..e20093ca
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Magadan.ics
@@ -0,0 +1,88 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Magadan
+X-LIC-LOCATION:Asia/Magadan
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1200
+TZNAME:MAGST
+DTSTART:19930328T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1100
+TZNAME:MAGT
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+100312
+TZOFFSETTO:+1000
+TZNAME:MAGT
+DTSTART:19240502T000000
+RDATE:19240502T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1100
+TZNAME:MAGT
+DTSTART:19300621T000000
+RDATE:19300621T000000
+RDATE:19920119T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1200
+TZNAME:MAGST
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+RDATE:19920328T230000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1100
+TZNAME:MAGT
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19920926T230000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1100
+TZNAME:MAGST
+DTSTART:19910331T020000
+RDATE:19910331T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1000
+TZNAME:MAGT
+DTSTART:19910929T030000
+RDATE:19910929T030000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Makassar.ics b/libkcal/libical/zoneinfo/Asia/Makassar.ics
new file mode 100644
index 00000000..50edb205
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Makassar.ics
@@ -0,0 +1,36 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Makassar
+X-LIC-LOCATION:Asia/Makassar
+BEGIN:STANDARD
+TZOFFSETFROM:+075736
+TZOFFSETTO:+075736
+TZNAME:MMT
+DTSTART:19200101T000000
+RDATE:19200101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+075736
+TZOFFSETTO:+0800
+TZNAME:CIT
+DTSTART:19321101T000000
+RDATE:19321101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0900
+TZNAME:JST
+DTSTART:19420209T000000
+RDATE:19420209T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0800
+TZNAME:CIT
+DTSTART:19450923T000000
+RDATE:19450923T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Manila.ics b/libkcal/libical/zoneinfo/Asia/Manila.ics
new file mode 100644
index 00000000..5e8daf63
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Manila.ics
@@ -0,0 +1,48 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Manila
+X-LIC-LOCATION:Asia/Manila
+BEGIN:STANDARD
+TZOFFSETFROM:-1556
+TZOFFSETTO:+0804
+TZNAME:LMT
+DTSTART:18441231T000000
+RDATE:18441231T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0804
+TZOFFSETTO:+0800
+TZNAME:PHT
+DTSTART:18990511T000000
+RDATE:18990511T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0900
+TZNAME:PHST
+DTSTART:19361101T000000
+RDATE:19361101T000000
+RDATE:19540412T000000
+RDATE:19780322T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0800
+TZNAME:PHT
+DTSTART:19370201T000000
+RDATE:19370201T000000
+RDATE:19441101T000000
+RDATE:19540701T000000
+RDATE:19780921T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0900
+TZNAME:JST
+DTSTART:19420501T000000
+RDATE:19420501T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Muscat.ics b/libkcal/libical/zoneinfo/Asia/Muscat.ics
new file mode 100644
index 00000000..8039649d
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Muscat.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Muscat
+X-LIC-LOCATION:Asia/Muscat
+BEGIN:STANDARD
+TZOFFSETFROM:+035420
+TZOFFSETTO:+0400
+TZNAME:GST
+DTSTART:19200101T000000
+RDATE:19200101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Nicosia.ics b/libkcal/libical/zoneinfo/Asia/Nicosia.ics
new file mode 100644
index 00000000..b0dd7b97
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Nicosia.ics
@@ -0,0 +1,95 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Nicosia
+X-LIC-LOCATION:Asia/Nicosia
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19981025T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19990328T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+021328
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19211114T000000
+RDATE:19211114T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19750413T000000
+RDATE:19750413T000000
+RDATE:19760515T000000
+RDATE:19770403T000000
+RDATE:19780402T000000
+RDATE:19790401T000000
+RDATE:19800406T000000
+RDATE:19810329T000000
+RDATE:19820328T000000
+RDATE:19830327T000000
+RDATE:19840325T000000
+RDATE:19850331T000000
+RDATE:19860330T000000
+RDATE:19870329T000000
+RDATE:19880327T000000
+RDATE:19890326T000000
+RDATE:19900325T000000
+RDATE:19910331T000000
+RDATE:19920329T000000
+RDATE:19930328T000000
+RDATE:19940327T000000
+RDATE:19950326T000000
+RDATE:19960331T000000
+RDATE:19970330T000000
+RDATE:19980329T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19751012T000000
+RDATE:19751012T000000
+RDATE:19761011T000000
+RDATE:19770925T000000
+RDATE:19781002T000000
+RDATE:19790930T000000
+RDATE:19800928T000000
+RDATE:19810927T000000
+RDATE:19820926T000000
+RDATE:19830925T000000
+RDATE:19840930T000000
+RDATE:19850929T000000
+RDATE:19860928T000000
+RDATE:19870927T000000
+RDATE:19880925T000000
+RDATE:19890924T000000
+RDATE:19900930T000000
+RDATE:19910929T000000
+RDATE:19920927T000000
+RDATE:19930926T000000
+RDATE:19940925T000000
+RDATE:19950924T000000
+RDATE:19960929T000000
+RDATE:19970928T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19980901T000000
+RDATE:19980901T000000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Novosibirsk.ics b/libkcal/libical/zoneinfo/Asia/Novosibirsk.ics
new file mode 100644
index 00000000..02e7a844
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Novosibirsk.ics
@@ -0,0 +1,96 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Novosibirsk
+X-LIC-LOCATION:Asia/Novosibirsk
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0700
+TZNAME:NOVST
+DTSTART:19940327T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0600
+TZNAME:NOVT
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+053140
+TZOFFSETTO:+0600
+TZNAME:NOVT
+DTSTART:19191214T060000
+RDATE:19191214T060000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0700
+TZNAME:NOVT
+DTSTART:19300621T000000
+RDATE:19300621T000000
+RDATE:19920119T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0800
+TZNAME:NOVST
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+RDATE:19920328T230000
+RDATE:19930328T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0700
+TZNAME:NOVT
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19920926T230000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0700
+TZNAME:NOVST
+DTSTART:19910331T020000
+RDATE:19910331T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0600
+TZNAME:NOVT
+DTSTART:19910929T030000
+RDATE:19910929T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0700
+TZNAME:NOVST
+DTSTART:19930523T000000
+RDATE:19930523T000000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Omsk.ics b/libkcal/libical/zoneinfo/Asia/Omsk.ics
new file mode 100644
index 00000000..ebce6e36
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Omsk.ics
@@ -0,0 +1,88 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Omsk
+X-LIC-LOCATION:Asia/Omsk
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0700
+TZNAME:OMSST
+DTSTART:19930328T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0600
+TZNAME:OMST
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+045336
+TZOFFSETTO:+0500
+TZNAME:OMST
+DTSTART:19191114T000000
+RDATE:19191114T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0600
+TZNAME:OMST
+DTSTART:19300621T000000
+RDATE:19300621T000000
+RDATE:19920119T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0700
+TZNAME:OMSST
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+RDATE:19920328T230000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0600
+TZNAME:OMST
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19920926T230000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:OMSST
+DTSTART:19910331T020000
+RDATE:19910331T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0500
+TZNAME:OMST
+DTSTART:19910929T030000
+RDATE:19910929T030000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Oral.ics b/libkcal/libical/zoneinfo/Asia/Oral.ics
new file mode 100644
index 00000000..8b954d61
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Oral.ics
@@ -0,0 +1,143 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Oral
+X-LIC-LOCATION:Asia/Oral
+BEGIN:STANDARD
+TZOFFSETFROM:+032524
+TZOFFSETTO:+0400
+TZNAME:URAT
+DTSTART:19240502T000000
+RDATE:19240502T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:URAT
+DTSTART:19300621T000000
+RDATE:19300621T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0600
+TZNAME:URAST
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:URAT
+DTSTART:19811001T000000
+RDATE:19811001T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:URAST
+DTSTART:19820401T000000
+RDATE:19820401T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0500
+TZNAME:URAT
+DTSTART:19821001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0500
+TZNAME:URAST
+DTSTART:19890326T020000
+RDATE:19890326T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0400
+TZNAME:URAT
+DTSTART:19890924T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:URAST
+DTSTART:19900325T020000
+RDATE:19900325T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0400
+TZNAME:URAT
+DTSTART:19910101T000000
+RDATE:19910101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0400
+TZNAME:ORAT
+DTSTART:19911216T000000
+RDATE:19911216T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:ORAST
+DTSTART:19920328T230000
+RDATE:19920328T230000
+RDATE:19930328T020000
+RDATE:19940327T020000
+RDATE:19950326T020000
+RDATE:19960331T020000
+RDATE:19970330T020000
+RDATE:19980329T020000
+RDATE:19990328T020000
+RDATE:20000326T020000
+RDATE:20010325T020000
+RDATE:20020331T020000
+RDATE:20030330T020000
+RDATE:20040328T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0400
+TZNAME:ORAT
+DTSTART:19920926T230000
+RDATE:19920926T230000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+RDATE:19961027T030000
+RDATE:19971026T030000
+RDATE:19981025T030000
+RDATE:19991031T030000
+RDATE:20001029T030000
+RDATE:20011028T030000
+RDATE:20021027T030000
+RDATE:20031026T030000
+RDATE:20041031T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:ORAT
+DTSTART:20050315T000000
+RDATE:20050315T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Phnom_Penh.ics b/libkcal/libical/zoneinfo/Asia/Phnom_Penh.ics
new file mode 100644
index 00000000..d1afc820
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Phnom_Penh.ics
@@ -0,0 +1,36 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Phnom_Penh
+X-LIC-LOCATION:Asia/Phnom_Penh
+BEGIN:STANDARD
+TZOFFSETFROM:+065940
+TZOFFSETTO:+070620
+TZNAME:SMT
+DTSTART:19060609T000000
+RDATE:19060609T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+070620
+TZOFFSETTO:+0700
+TZNAME:ICT
+DTSTART:19110311T000100
+RDATE:19110311T000100
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0800
+TZNAME:ICT
+DTSTART:19120501T000000
+RDATE:19120501T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0700
+TZNAME:ICT
+DTSTART:19310501T000000
+RDATE:19310501T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Pontianak.ics b/libkcal/libical/zoneinfo/Asia/Pontianak.ics
new file mode 100644
index 00000000..01b5b44d
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Pontianak.ics
@@ -0,0 +1,64 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Pontianak
+X-LIC-LOCATION:Asia/Pontianak
+BEGIN:STANDARD
+TZOFFSETFROM:+071720
+TZOFFSETTO:+071720
+TZNAME:PMT
+DTSTART:19080501T000000
+RDATE:19080501T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+071720
+TZOFFSETTO:+0730
+TZNAME:WIT
+DTSTART:19321101T000000
+RDATE:19321101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0730
+TZOFFSETTO:+0900
+TZNAME:JST
+DTSTART:19420129T000000
+RDATE:19420129T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0730
+TZNAME:WIT
+DTSTART:19450923T000000
+RDATE:19450923T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0730
+TZOFFSETTO:+0800
+TZNAME:WIT
+DTSTART:19480501T000000
+RDATE:19480501T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0730
+TZNAME:WIT
+DTSTART:19500501T000000
+RDATE:19500501T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0730
+TZOFFSETTO:+0800
+TZNAME:CIT
+DTSTART:19640101T000000
+RDATE:19640101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0700
+TZNAME:WIT
+DTSTART:19880101T000000
+RDATE:19880101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Pyongyang.ics b/libkcal/libical/zoneinfo/Asia/Pyongyang.ics
new file mode 100644
index 00000000..9d22c6f4
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Pyongyang.ics
@@ -0,0 +1,44 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Pyongyang
+X-LIC-LOCATION:Asia/Pyongyang
+BEGIN:STANDARD
+TZOFFSETFROM:+0823
+TZOFFSETTO:+0830
+TZNAME:KST
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0830
+TZOFFSETTO:+0900
+TZNAME:KST
+DTSTART:19041201T000000
+RDATE:19041201T000000
+RDATE:19320101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0830
+TZNAME:KST
+DTSTART:19280101T000000
+RDATE:19280101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0800
+TZNAME:KST
+DTSTART:19540321T000000
+RDATE:19540321T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0900
+TZNAME:KST
+DTSTART:19610810T000000
+RDATE:19610810T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Qatar.ics b/libkcal/libical/zoneinfo/Asia/Qatar.ics
new file mode 100644
index 00000000..d545c5cd
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Qatar.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Qatar
+X-LIC-LOCATION:Asia/Qatar
+BEGIN:STANDARD
+TZOFFSETFROM:+032608
+TZOFFSETTO:+0400
+TZNAME:GST
+DTSTART:19200101T000000
+RDATE:19200101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0300
+TZNAME:AST
+DTSTART:19720601T000000
+RDATE:19720601T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Qyzylorda.ics b/libkcal/libical/zoneinfo/Asia/Qyzylorda.ics
new file mode 100644
index 00000000..d3924978
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Qyzylorda.ics
@@ -0,0 +1,132 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Qyzylorda
+X-LIC-LOCATION:Asia/Qyzylorda
+BEGIN:STANDARD
+TZOFFSETFROM:+042152
+TZOFFSETTO:+0400
+TZNAME:KIZT
+DTSTART:19240502T000000
+RDATE:19240502T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:KIZT
+DTSTART:19300621T000000
+RDATE:19300621T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0600
+TZNAME:KIZST
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:KIZT
+DTSTART:19811001T000000
+RDATE:19811001T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:KIZST
+DTSTART:19820401T000000
+RDATE:19820401T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0500
+TZNAME:KIZT
+DTSTART:19821001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0500
+TZNAME:KIZT
+DTSTART:19910101T000000
+RDATE:19910101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0500
+TZNAME:QYZT
+DTSTART:19911216T000000
+RDATE:19911216T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0600
+TZNAME:QYZT
+DTSTART:19920119T020000
+RDATE:19920119T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0700
+TZNAME:QYZST
+DTSTART:19920328T230000
+RDATE:19920328T230000
+RDATE:19930328T020000
+RDATE:19940327T020000
+RDATE:19950326T020000
+RDATE:19960331T020000
+RDATE:19970330T020000
+RDATE:19980329T020000
+RDATE:19990328T020000
+RDATE:20000326T020000
+RDATE:20010325T020000
+RDATE:20020331T020000
+RDATE:20030330T020000
+RDATE:20040328T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0600
+TZNAME:QYZT
+DTSTART:19920926T230000
+RDATE:19920926T230000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+RDATE:19961027T030000
+RDATE:19971026T030000
+RDATE:19981025T030000
+RDATE:19991031T030000
+RDATE:20001029T030000
+RDATE:20011028T030000
+RDATE:20021027T030000
+RDATE:20031026T030000
+RDATE:20041031T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:QYZT
+DTSTART:20050315T000000
+RDATE:20050315T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Rangoon.ics b/libkcal/libical/zoneinfo/Asia/Rangoon.ics
new file mode 100644
index 00000000..5aa260ae
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Rangoon.ics
@@ -0,0 +1,36 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Rangoon
+X-LIC-LOCATION:Asia/Rangoon
+BEGIN:STANDARD
+TZOFFSETFROM:+062440
+TZOFFSETTO:+062436
+TZNAME:RMT
+DTSTART:18800101T000000
+RDATE:18800101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+062436
+TZOFFSETTO:+0630
+TZNAME:BURT
+DTSTART:19200101T000000
+RDATE:19200101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0630
+TZOFFSETTO:+0900
+TZNAME:JST
+DTSTART:19420501T000000
+RDATE:19420501T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0630
+TZNAME:MMT
+DTSTART:19450503T000000
+RDATE:19450503T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Riyadh.ics b/libkcal/libical/zoneinfo/Asia/Riyadh.ics
new file mode 100644
index 00000000..35537135
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Riyadh.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Riyadh
+X-LIC-LOCATION:Asia/Riyadh
+BEGIN:STANDARD
+TZOFFSETFROM:+030652
+TZOFFSETTO:+0300
+TZNAME:AST
+DTSTART:19500101T000000
+RDATE:19500101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Saigon.ics b/libkcal/libical/zoneinfo/Asia/Saigon.ics
new file mode 100644
index 00000000..f7b076ae
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Saigon.ics
@@ -0,0 +1,36 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20071016_1/Asia/Saigon
+X-LIC-LOCATION:Asia/Saigon
+BEGIN:STANDARD
+TZOFFSETFROM:+070640
+TZOFFSETTO:+070620
+TZNAME:SMT
+DTSTART:19060609T000000
+RDATE:19060609T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+070620
+TZOFFSETTO:+0700
+TZNAME:ICT
+DTSTART:19110311T000100
+RDATE:19110311T000100
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0800
+TZNAME:ICT
+DTSTART:19120501T000000
+RDATE:19120501T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0700
+TZNAME:ICT
+DTSTART:19310501T000000
+RDATE:19310501T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Sakhalin.ics b/libkcal/libical/zoneinfo/Asia/Sakhalin.ics
new file mode 100644
index 00000000..2d7ac40d
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Sakhalin.ics
@@ -0,0 +1,107 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Sakhalin
+X-LIC-LOCATION:Asia/Sakhalin
+BEGIN:STANDARD
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1000
+TZNAME:SAKT
+DTSTART:19971026T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1100
+TZNAME:SAKST
+DTSTART:19980329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+093048
+TZOFFSETTO:+0900
+TZNAME:CJT
+DTSTART:19050823T000000
+RDATE:19050823T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0900
+TZNAME:JST
+DTSTART:19380101T000000
+RDATE:19380101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+1100
+TZNAME:SAKT
+DTSTART:19450825T000000
+RDATE:19450825T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1200
+TZNAME:SAKST
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+RDATE:19920328T230000
+RDATE:19930328T020000
+RDATE:19940327T020000
+RDATE:19950326T020000
+RDATE:19960331T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1100
+TZNAME:SAKT
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19920926T230000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+RDATE:19961027T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1100
+TZNAME:SAKST
+DTSTART:19910331T020000
+RDATE:19910331T020000
+RDATE:19970330T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1000
+TZNAME:SAKT
+DTSTART:19910929T030000
+RDATE:19910929T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1100
+TZNAME:SAKT
+DTSTART:19920119T020000
+RDATE:19920119T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Samarkand.ics b/libkcal/libical/zoneinfo/Asia/Samarkand.ics
new file mode 100644
index 00000000..5aa8f36b
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Samarkand.ics
@@ -0,0 +1,88 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Samarkand
+X-LIC-LOCATION:Asia/Samarkand
+BEGIN:STANDARD
+TZOFFSETFROM:+042712
+TZOFFSETTO:+0400
+TZNAME:SAMT
+DTSTART:19240502T000000
+RDATE:19240502T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:SAMT
+DTSTART:19300621T000000
+RDATE:19300621T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0600
+TZNAME:SAMST
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+RDATE:19910331T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:TAST
+DTSTART:19811001T000000
+RDATE:19811001T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:SAMST
+DTSTART:19820401T000000
+RDATE:19820401T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0500
+TZNAME:SAMT
+DTSTART:19821001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:UZST
+DTSTART:19910901T000000
+RDATE:19910901T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0500
+TZNAME:UZT
+DTSTART:19910929T030000
+RDATE:19910929T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0500
+TZNAME:UZT
+DTSTART:19920101T000000
+RDATE:19920101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Seoul.ics b/libkcal/libical/zoneinfo/Asia/Seoul.ics
new file mode 100644
index 00000000..98334fe1
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Seoul.ics
@@ -0,0 +1,69 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Seoul
+X-LIC-LOCATION:Asia/Seoul
+BEGIN:STANDARD
+TZOFFSETFROM:+082752
+TZOFFSETTO:+0830
+TZNAME:KST
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0830
+TZOFFSETTO:+0900
+TZNAME:KST
+DTSTART:19041201T000000
+RDATE:19041201T000000
+RDATE:19320101T000000
+RDATE:19681001T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0830
+TZNAME:KST
+DTSTART:19280101T000000
+RDATE:19280101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0800
+TZNAME:KST
+DTSTART:19540321T000000
+RDATE:19540321T000000
+RDATE:19600913T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0900
+TZNAME:KDT
+DTSTART:19600515T000000
+RDATE:19600515T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0830
+TZNAME:KST
+DTSTART:19610810T000000
+RDATE:19610810T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0900
+TZOFFSETTO:+1000
+TZNAME:KDT
+DTSTART:19870510T000000
+RDATE:19870510T000000
+RDATE:19880508T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+0900
+TZNAME:KST
+DTSTART:19871011T000000
+RDATE:19871011T000000
+RDATE:19881009T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Shanghai.ics b/libkcal/libical/zoneinfo/Asia/Shanghai.ics
new file mode 100644
index 00000000..f58f2650
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Shanghai.ics
@@ -0,0 +1,50 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Shanghai
+X-LIC-LOCATION:Asia/Shanghai
+BEGIN:STANDARD
+TZOFFSETFROM:+080552
+TZOFFSETTO:+0800
+TZNAME:CST
+DTSTART:19280101T000000
+RDATE:19280101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0900
+TZNAME:CDT
+DTSTART:19400603T000000
+RDATE:19400603T000000
+RDATE:19410316T000000
+RDATE:19860504T000000
+RDATE:19870412T000000
+RDATE:19880410T000000
+RDATE:19890416T000000
+RDATE:19900415T000000
+RDATE:19910414T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0800
+TZNAME:CST
+DTSTART:19401001T000000
+RDATE:19401001T000000
+RDATE:19411001T000000
+RDATE:19860914T000000
+RDATE:19870913T000000
+RDATE:19880911T000000
+RDATE:19890917T000000
+RDATE:19900916T000000
+RDATE:19910915T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0800
+TZNAME:CST
+DTSTART:19490101T000000
+RDATE:19490101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Singapore.ics b/libkcal/libical/zoneinfo/Asia/Singapore.ics
new file mode 100644
index 00000000..ff2b6172
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Singapore.ics
@@ -0,0 +1,71 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Singapore
+X-LIC-LOCATION:Asia/Singapore
+BEGIN:STANDARD
+TZOFFSETFROM:+065525
+TZOFFSETTO:+065525
+TZNAME:SMT
+DTSTART:19010101T000000
+RDATE:19010101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+065525
+TZOFFSETTO:+0700
+TZNAME:MALT
+DTSTART:19050601T000000
+RDATE:19050601T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0720
+TZNAME:MALST
+DTSTART:19330101T000000
+RDATE:19330101T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0720
+TZOFFSETTO:+0720
+TZNAME:MALT
+DTSTART:19360101T000000
+RDATE:19360101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0720
+TZOFFSETTO:+0730
+TZNAME:MALT
+DTSTART:19410901T000000
+RDATE:19410901T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0730
+TZOFFSETTO:+0900
+TZNAME:JST
+DTSTART:19420216T000000
+RDATE:19420216T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0730
+TZNAME:MALT
+DTSTART:19450912T000000
+RDATE:19450912T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0730
+TZOFFSETTO:+0730
+TZNAME:SGT
+DTSTART:19650809T000000
+RDATE:19650809T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0730
+TZOFFSETTO:+0800
+TZNAME:SGT
+DTSTART:19820101T000000
+RDATE:19820101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Taipei.ics b/libkcal/libical/zoneinfo/Asia/Taipei.ics
new file mode 100644
index 00000000..327a5dc3
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Taipei.ics
@@ -0,0 +1,67 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Taipei
+X-LIC-LOCATION:Asia/Taipei
+BEGIN:STANDARD
+TZOFFSETFROM:+0806
+TZOFFSETTO:+0800
+TZNAME:CST
+DTSTART:18960101T000000
+RDATE:18960101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0900
+TZNAME:CDT
+DTSTART:19450501T000000
+RDATE:19450501T000000
+RDATE:19460501T000000
+RDATE:19470501T000000
+RDATE:19480501T000000
+RDATE:19490501T000000
+RDATE:19500501T000000
+RDATE:19510501T000000
+RDATE:19520301T000000
+RDATE:19530401T000000
+RDATE:19540401T000000
+RDATE:19550401T000000
+RDATE:19560401T000000
+RDATE:19570401T000000
+RDATE:19580401T000000
+RDATE:19590401T000000
+RDATE:19600601T000000
+RDATE:19610601T000000
+RDATE:19740401T000000
+RDATE:19750401T000000
+RDATE:19800630T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0800
+TZNAME:CST
+DTSTART:19451001T000000
+RDATE:19451001T000000
+RDATE:19461001T000000
+RDATE:19471001T000000
+RDATE:19481001T000000
+RDATE:19491001T000000
+RDATE:19501001T000000
+RDATE:19511001T000000
+RDATE:19521101T000000
+RDATE:19531101T000000
+RDATE:19541101T000000
+RDATE:19551001T000000
+RDATE:19561001T000000
+RDATE:19571001T000000
+RDATE:19581001T000000
+RDATE:19591001T000000
+RDATE:19601001T000000
+RDATE:19611001T000000
+RDATE:19741001T000000
+RDATE:19751001T000000
+RDATE:19800930T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Tashkent.ics b/libkcal/libical/zoneinfo/Asia/Tashkent.ics
new file mode 100644
index 00000000..c4cfe3b3
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Tashkent.ics
@@ -0,0 +1,82 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Tashkent
+X-LIC-LOCATION:Asia/Tashkent
+BEGIN:STANDARD
+TZOFFSETFROM:+043712
+TZOFFSETTO:+0500
+TZNAME:TAST
+DTSTART:19240502T000000
+RDATE:19240502T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0600
+TZNAME:TAST
+DTSTART:19300621T000000
+RDATE:19300621T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0700
+TZNAME:TASST
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0600
+TZNAME:TAST
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:TASST
+DTSTART:19910331T020000
+RDATE:19910331T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:UZST
+DTSTART:19910901T000000
+RDATE:19910901T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0500
+TZNAME:UZT
+DTSTART:19910929T030000
+RDATE:19910929T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0500
+TZNAME:UZT
+DTSTART:19920101T000000
+RDATE:19920101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Tbilisi.ics b/libkcal/libical/zoneinfo/Asia/Tbilisi.ics
new file mode 100644
index 00000000..f08ef59d
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Tbilisi.ics
@@ -0,0 +1,159 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Tbilisi
+X-LIC-LOCATION:Asia/Tbilisi
+BEGIN:STANDARD
+TZOFFSETFROM:+025916
+TZOFFSETTO:+025916
+TZNAME:TBMT
+DTSTART:18800101T000000
+RDATE:18800101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+025916
+TZOFFSETTO:+0300
+TZNAME:TBIT
+DTSTART:19240502T000000
+RDATE:19240502T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:TBIT
+DTSTART:19570301T000000
+RDATE:19570301T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:TBIST
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0400
+TZNAME:TBIT
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0400
+TZNAME:TBIST
+DTSTART:19910331T020000
+RDATE:19910331T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0400
+TZNAME:GEST
+DTSTART:19910409T000000
+RDATE:19910409T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0300
+TZNAME:GET
+DTSTART:19910929T030000
+RDATE:19910929T030000
+RDATE:19920927T000000
+RDATE:19930926T000000
+RDATE:20041031T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:GET
+DTSTART:19920101T000000
+RDATE:19920101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:GEST
+DTSTART:19920329T000000
+RDATE:19920329T000000
+RDATE:19930328T000000
+RDATE:19940327T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0400
+TZNAME:GET
+DTSTART:19940925T000000
+RDATE:19940925T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:GEST
+DTSTART:19950326T000000
+RDATE:19950326T000000
+RDATE:19960331T000000
+RDATE:19980329T000000
+RDATE:19990328T000000
+RDATE:20000326T000000
+RDATE:20010325T000000
+RDATE:20020331T000000
+RDATE:20030330T000000
+RDATE:20040328T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0400
+TZNAME:GET
+DTSTART:19950924T000000
+RDATE:19950924T000000
+RDATE:19971026T000000
+RDATE:19981025T000000
+RDATE:19991031T000000
+RDATE:20001029T000000
+RDATE:20011028T000000
+RDATE:20021027T000000
+RDATE:20031026T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0500
+TZNAME:GEST
+DTSTART:19961027T000000
+RDATE:19961027T000000
+RDATE:19970330T000000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0400
+TZNAME:GEST
+DTSTART:20040627T000000
+RDATE:20040627T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:GET
+DTSTART:20050327T020000
+RDATE:20050327T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Tehran.ics b/libkcal/libical/zoneinfo/Asia/Tehran.ics
new file mode 100644
index 00000000..d09cc9f3
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Tehran.ics
@@ -0,0 +1,156 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Tehran
+X-LIC-LOCATION:Asia/Tehran
+BEGIN:STANDARD
+TZOFFSETFROM:+032544
+TZOFFSETTO:+032544
+TZNAME:TMT
+DTSTART:19160101T000000
+RDATE:19160101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+032544
+TZOFFSETTO:+0330
+TZNAME:IRST
+DTSTART:19460101T000000
+RDATE:19460101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0330
+TZOFFSETTO:+0400
+TZNAME:IRST
+DTSTART:19771101T000000
+RDATE:19771101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:IRDT
+DTSTART:19780321T000000
+RDATE:19780321T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0400
+TZNAME:IRST
+DTSTART:19781021T000000
+RDATE:19781021T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0330
+TZNAME:IRST
+DTSTART:19790101T000000
+RDATE:19790101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0330
+TZOFFSETTO:+0430
+TZNAME:IRDT
+DTSTART:19790321T000000
+RDATE:19790321T000000
+RDATE:19800321T000000
+RDATE:19910503T000000
+RDATE:19920322T000000
+RDATE:19930322T000000
+RDATE:19940322T000000
+RDATE:19950322T000000
+RDATE:19960321T000000
+RDATE:19970322T000000
+RDATE:19980322T000000
+RDATE:19990322T000000
+RDATE:20000321T000000
+RDATE:20010322T000000
+RDATE:20020322T000000
+RDATE:20030322T000000
+RDATE:20040321T000000
+RDATE:20050322T000000
+RDATE:20080321T000000
+RDATE:20090322T000000
+RDATE:20100322T000000
+RDATE:20110322T000000
+RDATE:20120321T000000
+RDATE:20130322T000000
+RDATE:20140322T000000
+RDATE:20150322T000000
+RDATE:20160321T000000
+RDATE:20170322T000000
+RDATE:20180322T000000
+RDATE:20190322T000000
+RDATE:20200321T000000
+RDATE:20210322T000000
+RDATE:20220322T000000
+RDATE:20230322T000000
+RDATE:20240321T000000
+RDATE:20250322T000000
+RDATE:20260322T000000
+RDATE:20270322T000000
+RDATE:20280321T000000
+RDATE:20290321T000000
+RDATE:20300322T000000
+RDATE:20310322T000000
+RDATE:20320321T000000
+RDATE:20330321T000000
+RDATE:20340322T000000
+RDATE:20350322T000000
+RDATE:20360321T000000
+RDATE:20370321T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0430
+TZOFFSETTO:+0330
+TZNAME:IRST
+DTSTART:19790919T000000
+RDATE:19790919T000000
+RDATE:19800923T000000
+RDATE:19910922T000000
+RDATE:19920922T000000
+RDATE:19930922T000000
+RDATE:19940922T000000
+RDATE:19950922T000000
+RDATE:19960921T000000
+RDATE:19970922T000000
+RDATE:19980922T000000
+RDATE:19990922T000000
+RDATE:20000921T000000
+RDATE:20010922T000000
+RDATE:20020922T000000
+RDATE:20030922T000000
+RDATE:20040921T000000
+RDATE:20050922T000000
+RDATE:20080921T000000
+RDATE:20090922T000000
+RDATE:20100922T000000
+RDATE:20110922T000000
+RDATE:20120921T000000
+RDATE:20130922T000000
+RDATE:20140922T000000
+RDATE:20150922T000000
+RDATE:20160921T000000
+RDATE:20170922T000000
+RDATE:20180922T000000
+RDATE:20190922T000000
+RDATE:20200921T000000
+RDATE:20210922T000000
+RDATE:20220922T000000
+RDATE:20230922T000000
+RDATE:20240921T000000
+RDATE:20250922T000000
+RDATE:20260922T000000
+RDATE:20270922T000000
+RDATE:20280921T000000
+RDATE:20290921T000000
+RDATE:20300922T000000
+RDATE:20310922T000000
+RDATE:20320921T000000
+RDATE:20330921T000000
+RDATE:20340922T000000
+RDATE:20350922T000000
+RDATE:20360921T000000
+RDATE:20370921T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Thimphu.ics b/libkcal/libical/zoneinfo/Asia/Thimphu.ics
new file mode 100644
index 00000000..1a6f5620
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Thimphu.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Thimphu
+X-LIC-LOCATION:Asia/Thimphu
+BEGIN:STANDARD
+TZOFFSETFROM:+055836
+TZOFFSETTO:+0530
+TZNAME:IST
+DTSTART:19470815T000000
+RDATE:19470815T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0530
+TZOFFSETTO:+0600
+TZNAME:BTT
+DTSTART:19871001T000000
+RDATE:19871001T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Tokyo.ics b/libkcal/libical/zoneinfo/Asia/Tokyo.ics
new file mode 100644
index 00000000..e59ad3f2
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Tokyo.ics
@@ -0,0 +1,49 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Tokyo
+X-LIC-LOCATION:Asia/Tokyo
+BEGIN:STANDARD
+TZOFFSETFROM:+091859
+TZOFFSETTO:+0900
+TZNAME:JST
+DTSTART:18880101T001859
+RDATE:18880101T001859
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0900
+TZNAME:CJT
+DTSTART:18960101T000000
+RDATE:18960101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0900
+TZNAME:JST
+DTSTART:19380101T000000
+RDATE:19380101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0900
+TZOFFSETTO:+1000
+TZNAME:JDT
+DTSTART:19480502T020000
+RDATE:19480502T020000
+RDATE:19490403T020000
+RDATE:19500507T020000
+RDATE:19510506T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+0900
+TZNAME:JST
+DTSTART:19480911T020000
+RDATE:19480911T020000
+RDATE:19490910T020000
+RDATE:19500909T020000
+RDATE:19510908T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Ulaanbaatar.ics b/libkcal/libical/zoneinfo/Asia/Ulaanbaatar.ics
new file mode 100644
index 00000000..cd6d869a
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Ulaanbaatar.ics
@@ -0,0 +1,78 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Ulaanbaatar
+X-LIC-LOCATION:Asia/Ulaanbaatar
+BEGIN:STANDARD
+TZOFFSETFROM:+070732
+TZOFFSETTO:+0700
+TZNAME:ULAT
+DTSTART:19050801T000000
+RDATE:19050801T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0800
+TZNAME:ULAT
+DTSTART:19780101T000000
+RDATE:19780101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0900
+TZNAME:ULAST
+DTSTART:19830401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T000000
+RDATE:19860330T000000
+RDATE:19870329T000000
+RDATE:19880327T000000
+RDATE:19890326T000000
+RDATE:19900325T000000
+RDATE:19910331T000000
+RDATE:19920329T000000
+RDATE:19930328T000000
+RDATE:19940327T000000
+RDATE:19950326T000000
+RDATE:19960331T000000
+RDATE:19970330T000000
+RDATE:19980329T000000
+RDATE:20010428T020000
+RDATE:20020330T020000
+RDATE:20030329T020000
+RDATE:20040327T020000
+RDATE:20050326T020000
+RDATE:20060325T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0800
+TZNAME:ULAT
+DTSTART:19831001T000000
+RDATE:19831001T000000
+RDATE:19840930T000000
+RDATE:19850929T000000
+RDATE:19860928T000000
+RDATE:19870927T000000
+RDATE:19880925T000000
+RDATE:19890924T000000
+RDATE:19900930T000000
+RDATE:19910929T000000
+RDATE:19920927T000000
+RDATE:19930926T000000
+RDATE:19940925T000000
+RDATE:19950924T000000
+RDATE:19960929T000000
+RDATE:19970928T000000
+RDATE:19980927T000000
+RDATE:20010929T020000
+RDATE:20020928T020000
+RDATE:20030927T020000
+RDATE:20040925T020000
+RDATE:20050924T020000
+RDATE:20060930T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Urumqi.ics b/libkcal/libical/zoneinfo/Asia/Urumqi.ics
new file mode 100644
index 00000000..fc4318b2
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Urumqi.ics
@@ -0,0 +1,46 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Urumqi
+X-LIC-LOCATION:Asia/Urumqi
+BEGIN:STANDARD
+TZOFFSETFROM:+055020
+TZOFFSETTO:+0600
+TZNAME:URUT
+DTSTART:19280101T000000
+RDATE:19280101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0800
+TZNAME:CST
+DTSTART:19800501T000000
+RDATE:19800501T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0900
+TZNAME:CDT
+DTSTART:19860504T000000
+RDATE:19860504T000000
+RDATE:19870412T000000
+RDATE:19880410T000000
+RDATE:19890416T000000
+RDATE:19900415T000000
+RDATE:19910414T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0800
+TZNAME:CST
+DTSTART:19860914T000000
+RDATE:19860914T000000
+RDATE:19870913T000000
+RDATE:19880911T000000
+RDATE:19890917T000000
+RDATE:19900916T000000
+RDATE:19910915T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Vientiane.ics b/libkcal/libical/zoneinfo/Asia/Vientiane.ics
new file mode 100644
index 00000000..2b6f1309
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Vientiane.ics
@@ -0,0 +1,36 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Vientiane
+X-LIC-LOCATION:Asia/Vientiane
+BEGIN:STANDARD
+TZOFFSETFROM:+065024
+TZOFFSETTO:+070620
+TZNAME:SMT
+DTSTART:19060609T000000
+RDATE:19060609T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+070620
+TZOFFSETTO:+0700
+TZNAME:ICT
+DTSTART:19110311T000100
+RDATE:19110311T000100
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0800
+TZNAME:ICT
+DTSTART:19120501T000000
+RDATE:19120501T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0700
+TZNAME:ICT
+DTSTART:19310501T000000
+RDATE:19310501T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Vladivostok.ics b/libkcal/libical/zoneinfo/Asia/Vladivostok.ics
new file mode 100644
index 00000000..313a97e0
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Vladivostok.ics
@@ -0,0 +1,88 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Vladivostok
+X-LIC-LOCATION:Asia/Vladivostok
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1100
+TZNAME:VLAST
+DTSTART:19930328T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1000
+TZNAME:VLAT
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+084744
+TZOFFSETTO:+0900
+TZNAME:VLAT
+DTSTART:19221115T000000
+RDATE:19221115T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+1000
+TZNAME:VLAT
+DTSTART:19300621T000000
+RDATE:19300621T000000
+RDATE:19920119T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1100
+TZNAME:VLAST
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+RDATE:19920328T230000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1000
+TZNAME:VLAT
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19920926T230000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1000
+TZNAME:VLASST
+DTSTART:19910331T020000
+RDATE:19910331T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+0900
+TZNAME:VLAST
+DTSTART:19910929T030000
+RDATE:19910929T030000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Yakutsk.ics b/libkcal/libical/zoneinfo/Asia/Yakutsk.ics
new file mode 100644
index 00000000..ee4c8500
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Yakutsk.ics
@@ -0,0 +1,88 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Yakutsk
+X-LIC-LOCATION:Asia/Yakutsk
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0900
+TZOFFSETTO:+1000
+TZNAME:YAKST
+DTSTART:19930328T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+0900
+TZNAME:YAKT
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+083840
+TZOFFSETTO:+0800
+TZNAME:YAKT
+DTSTART:19191215T000000
+RDATE:19191215T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0900
+TZNAME:YAKT
+DTSTART:19300621T000000
+RDATE:19300621T000000
+RDATE:19920119T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0900
+TZOFFSETTO:+1000
+TZNAME:YAKST
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+RDATE:19920328T230000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+0900
+TZNAME:YAKT
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19920926T230000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0900
+TZNAME:YAKST
+DTSTART:19910331T020000
+RDATE:19910331T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0800
+TZNAME:YAKT
+DTSTART:19910929T030000
+RDATE:19910929T030000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Yekaterinburg.ics b/libkcal/libical/zoneinfo/Asia/Yekaterinburg.ics
new file mode 100644
index 00000000..1ef52437
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Yekaterinburg.ics
@@ -0,0 +1,106 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Yekaterinburg
+X-LIC-LOCATION:Asia/Yekaterinburg
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0600
+TZNAME:YEKST
+DTSTART:19930328T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0500
+TZNAME:YEKT
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+040224
+TZOFFSETTO:+0400
+TZNAME:SVET
+DTSTART:19190715T040000
+RDATE:19190715T040000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:SVET
+DTSTART:19300621T000000
+RDATE:19300621T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0600
+TZNAME:SVEST
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0500
+TZNAME:SVET
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0500
+TZNAME:SVEST
+DTSTART:19910331T020000
+RDATE:19910331T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0400
+TZNAME:SVET
+DTSTART:19910929T030000
+RDATE:19910929T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:YEKT
+DTSTART:19920119T020000
+RDATE:19920119T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0600
+TZNAME:YEKST
+DTSTART:19920328T230000
+RDATE:19920328T230000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0500
+TZNAME:YEKT
+DTSTART:19920926T230000
+RDATE:19920926T230000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Asia/Yerevan.ics b/libkcal/libical/zoneinfo/Asia/Yerevan.ics
new file mode 100644
index 00000000..57093217
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Asia/Yerevan.ics
@@ -0,0 +1,110 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Asia/Yerevan
+X-LIC-LOCATION:Asia/Yerevan
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:AMST
+DTSTART:19970330T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0400
+TZNAME:AMT
+DTSTART:19971026T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0258
+TZOFFSETTO:+0300
+TZNAME:YERT
+DTSTART:19240502T000000
+RDATE:19240502T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:YERT
+DTSTART:19570301T000000
+RDATE:19570301T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:YERST
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0400
+TZNAME:YERT
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0400
+TZNAME:YERST
+DTSTART:19910331T020000
+RDATE:19910331T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0400
+TZNAME:AMST
+DTSTART:19910923T000000
+RDATE:19910923T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0300
+TZNAME:AMT
+DTSTART:19910929T030000
+RDATE:19910929T030000
+RDATE:19920926T230000
+RDATE:19930926T030000
+RDATE:19940925T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:AMST
+DTSTART:19920328T230000
+RDATE:19920328T230000
+RDATE:19930328T020000
+RDATE:19940327T020000
+RDATE:19950326T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0400
+TZNAME:AMT
+DTSTART:19950924T030000
+RDATE:19950924T030000
+RDATE:19970101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Atlantic/Azores.ics b/libkcal/libical/zoneinfo/Atlantic/Azores.ics
new file mode 100644
index 00000000..e5734da8
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Atlantic/Azores.ics
@@ -0,0 +1,223 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Atlantic/Azores
+X-LIC-LOCATION:Atlantic/Azores
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0100
+TZOFFSETTO:+0000
+TZNAME:AZOST
+DTSTART:19940327T000000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:-0100
+TZNAME:AZOT
+DTSTART:19961027T010000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-014240
+TZOFFSETTO:-015432
+TZNAME:HMT
+DTSTART:18840101T000000
+RDATE:18840101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-015432
+TZOFFSETTO:-0200
+TZNAME:AZOT
+DTSTART:19110524T000000
+RDATE:19110524T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0100
+TZNAME:AZOST
+DTSTART:19160617T230000
+RDATE:19160617T230000
+RDATE:19170228T230000
+RDATE:19180301T230000
+RDATE:19190228T230000
+RDATE:19200229T230000
+RDATE:19210228T230000
+RDATE:19240416T230000
+RDATE:19260417T230000
+RDATE:19270409T230000
+RDATE:19280414T230000
+RDATE:19290420T230000
+RDATE:19310418T230000
+RDATE:19320402T230000
+RDATE:19340407T230000
+RDATE:19350330T230000
+RDATE:19360418T230000
+RDATE:19370403T230000
+RDATE:19380326T230000
+RDATE:19390415T230000
+RDATE:19400224T230000
+RDATE:19410405T230000
+RDATE:19420314T230000
+RDATE:19430313T230000
+RDATE:19440311T230000
+RDATE:19450310T230000
+RDATE:19460406T230000
+RDATE:19470406T020000
+RDATE:19480404T020000
+RDATE:19490403T020000
+RDATE:19510401T020000
+RDATE:19520406T020000
+RDATE:19530405T020000
+RDATE:19540404T020000
+RDATE:19550403T020000
+RDATE:19560401T020000
+RDATE:19570407T020000
+RDATE:19580406T020000
+RDATE:19590405T020000
+RDATE:19600403T020000
+RDATE:19610402T020000
+RDATE:19620401T020000
+RDATE:19630407T020000
+RDATE:19640405T020000
+RDATE:19650404T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0100
+TZOFFSETTO:-0200
+TZNAME:AZOT
+DTSTART:19161101T010000
+RDATE:19161101T010000
+RDATE:19171015T000000
+RDATE:19181015T000000
+RDATE:19191015T000000
+RDATE:19201015T000000
+RDATE:19211015T000000
+RDATE:19241015T000000
+RDATE:19261003T000000
+RDATE:19271002T000000
+RDATE:19281007T000000
+RDATE:19291006T000000
+RDATE:19311004T000000
+RDATE:19321002T000000
+RDATE:19341007T000000
+RDATE:19351006T000000
+RDATE:19361004T000000
+RDATE:19371003T000000
+RDATE:19381002T000000
+RDATE:19391119T000000
+RDATE:19401006T000000
+RDATE:19411006T000000
+RDATE:19421025T000000
+RDATE:19431031T000000
+RDATE:19441029T000000
+RDATE:19451028T000000
+RDATE:19461006T000000
+RDATE:19471005T030000
+RDATE:19481003T030000
+RDATE:19491002T030000
+RDATE:19511007T030000
+RDATE:19521005T030000
+RDATE:19531004T030000
+RDATE:19541003T030000
+RDATE:19551002T030000
+RDATE:19561007T030000
+RDATE:19571006T030000
+RDATE:19581005T030000
+RDATE:19591004T030000
+RDATE:19601002T030000
+RDATE:19611001T030000
+RDATE:19621007T030000
+RDATE:19631006T030000
+RDATE:19641004T030000
+RDATE:19651003T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0100
+TZOFFSETTO:+0000
+TZNAME:AZOMT
+DTSTART:19420425T230000
+RDATE:19420425T230000
+RDATE:19430417T230000
+RDATE:19440422T230000
+RDATE:19450421T230000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:-0100
+TZNAME:AZOST
+DTSTART:19420816T000000
+RDATE:19420816T000000
+RDATE:19430829T000000
+RDATE:19440827T000000
+RDATE:19450826T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0100
+TZNAME:AZOT
+DTSTART:19660403T020000
+RDATE:19660403T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0100
+TZOFFSETTO:+0000
+TZNAME:AZOST
+DTSTART:19770327T000000
+RDATE:19770327T000000
+RDATE:19780402T000000
+RDATE:19790401T000000
+RDATE:19800330T000000
+RDATE:19810329T010000
+RDATE:19820328T010000
+RDATE:19830327T020000
+RDATE:19840325T010000
+RDATE:19850331T010000
+RDATE:19860330T010000
+RDATE:19870329T010000
+RDATE:19880327T010000
+RDATE:19890326T010000
+RDATE:19900325T010000
+RDATE:19910331T010000
+RDATE:19920329T010000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:-0100
+TZNAME:AZOT
+DTSTART:19770925T010000
+RDATE:19770925T010000
+RDATE:19781001T010000
+RDATE:19790930T020000
+RDATE:19800928T020000
+RDATE:19810927T020000
+RDATE:19820926T020000
+RDATE:19830925T020000
+RDATE:19840930T020000
+RDATE:19850929T020000
+RDATE:19860928T020000
+RDATE:19870927T020000
+RDATE:19880925T020000
+RDATE:19890924T020000
+RDATE:19900930T020000
+RDATE:19910929T020000
+RDATE:19930926T010000
+RDATE:19940925T010000
+RDATE:19950924T010000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19920927T020000
+RDATE:19920927T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+TZNAME:AZOST
+DTSTART:19930328T010000
+RDATE:19930328T010000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Atlantic/Bermuda.ics b/libkcal/libical/zoneinfo/Atlantic/Bermuda.ics
new file mode 100644
index 00000000..dab6b812
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Atlantic/Bermuda.ics
@@ -0,0 +1,114 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Atlantic/Bermuda
+X-LIC-LOCATION:Atlantic/Bermuda
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ADT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-041904
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19300101T020000
+RDATE:19300101T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ADT
+DTSTART:19740428T020000
+RDATE:19740428T020000
+RDATE:19750427T020000
+RDATE:19760425T020000
+RDATE:19770424T020000
+RDATE:19780430T020000
+RDATE:19790429T020000
+RDATE:19800427T020000
+RDATE:19810426T020000
+RDATE:19820425T020000
+RDATE:19830424T020000
+RDATE:19840429T020000
+RDATE:19850428T020000
+RDATE:19860427T020000
+RDATE:19870405T020000
+RDATE:19880403T020000
+RDATE:19890402T020000
+RDATE:19900401T020000
+RDATE:19910407T020000
+RDATE:19920405T020000
+RDATE:19930404T020000
+RDATE:19940403T020000
+RDATE:19950402T020000
+RDATE:19960407T020000
+RDATE:19970406T020000
+RDATE:19980405T020000
+RDATE:19990404T020000
+RDATE:20000402T020000
+RDATE:20010401T020000
+RDATE:20020407T020000
+RDATE:20030406T020000
+RDATE:20040404T020000
+RDATE:20050403T020000
+RDATE:20060402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19741027T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19760101T000000
+RDATE:19760101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Atlantic/Canary.ics b/libkcal/libical/zoneinfo/Atlantic/Canary.ics
new file mode 100644
index 00000000..66c83a27
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Atlantic/Canary.ics
@@ -0,0 +1,72 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Atlantic/Canary
+X-LIC-LOCATION:Atlantic/Canary
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:WEST
+DTSTART:19810329T010000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19961027T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-010136
+TZOFFSETTO:-0100
+TZNAME:CANT
+DTSTART:19220301T000000
+RDATE:19220301T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0100
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19460930T010000
+RDATE:19460930T010000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:WEST
+DTSTART:19800406T000000
+RDATE:19800406T000000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:WEST
+DTSTART:19800928T010000
+RDATE:19800928T010000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19800928T020000
+RDATE:19800928T020000
+RDATE:19810927T020000
+RDATE:19820926T020000
+RDATE:19830925T020000
+RDATE:19840930T020000
+RDATE:19850929T020000
+RDATE:19860928T020000
+RDATE:19870927T020000
+RDATE:19880925T020000
+RDATE:19890924T020000
+RDATE:19900930T020000
+RDATE:19910929T020000
+RDATE:19920927T020000
+RDATE:19930926T020000
+RDATE:19940925T020000
+RDATE:19950924T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Atlantic/Cape_Verde.ics b/libkcal/libical/zoneinfo/Atlantic/Cape_Verde.ics
new file mode 100644
index 00000000..0d82f58e
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Atlantic/Cape_Verde.ics
@@ -0,0 +1,36 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Atlantic/Cape_Verde
+X-LIC-LOCATION:Atlantic/Cape_Verde
+BEGIN:STANDARD
+TZOFFSETFROM:-013404
+TZOFFSETTO:-0200
+TZNAME:CVT
+DTSTART:19070101T000000
+RDATE:19070101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0100
+TZNAME:CVST
+DTSTART:19420901T000000
+RDATE:19420901T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0100
+TZOFFSETTO:-0200
+TZNAME:CVT
+DTSTART:19451015T000000
+RDATE:19451015T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0100
+TZNAME:CVT
+DTSTART:19751125T020000
+RDATE:19751125T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Atlantic/Faroe.ics b/libkcal/libical/zoneinfo/Atlantic/Faroe.ics
new file mode 100644
index 00000000..56820c51
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Atlantic/Faroe.ics
@@ -0,0 +1,57 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Atlantic/Faroe
+X-LIC-LOCATION:Atlantic/Faroe
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:WEST
+DTSTART:19810329T010000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19961027T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-002704
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19080111T000000
+RDATE:19080111T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19810101T000000
+RDATE:19810101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19810927T020000
+RDATE:19810927T020000
+RDATE:19820926T020000
+RDATE:19830925T020000
+RDATE:19840930T020000
+RDATE:19850929T020000
+RDATE:19860928T020000
+RDATE:19870927T020000
+RDATE:19880925T020000
+RDATE:19890924T020000
+RDATE:19900930T020000
+RDATE:19910929T020000
+RDATE:19920927T020000
+RDATE:19930926T020000
+RDATE:19940925T020000
+RDATE:19950924T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Atlantic/Jan_Mayen.ics b/libkcal/libical/zoneinfo/Atlantic/Jan_Mayen.ics
new file mode 100644
index 00000000..eb92a1e9
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Atlantic/Jan_Mayen.ics
@@ -0,0 +1,89 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20071016_1/Atlantic/Jan_Mayen
+X-LIC-LOCATION:Atlantic/Jan_Mayen
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19810329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0043
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:18950101T000000
+RDATE:18950101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19160522T010000
+RDATE:19160522T010000
+RDATE:19400810T230000
+RDATE:19430329T020000
+RDATE:19440403T020000
+RDATE:19450402T020000
+RDATE:19590315T020000
+RDATE:19600320T020000
+RDATE:19610319T020000
+RDATE:19620318T020000
+RDATE:19630317T020000
+RDATE:19640315T020000
+RDATE:19650425T020000
+RDATE:19800406T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19160930T000000
+RDATE:19160930T000000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19441002T030000
+RDATE:19451001T030000
+RDATE:19590920T030000
+RDATE:19600918T030000
+RDATE:19610917T030000
+RDATE:19620916T030000
+RDATE:19630915T030000
+RDATE:19640920T030000
+RDATE:19650919T030000
+RDATE:19800928T030000
+RDATE:19810927T030000
+RDATE:19820926T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19800101T000000
+RDATE:19800101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Atlantic/Madeira.ics b/libkcal/libical/zoneinfo/Atlantic/Madeira.ics
new file mode 100644
index 00000000..7c60c58b
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Atlantic/Madeira.ics
@@ -0,0 +1,201 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Atlantic/Madeira
+X-LIC-LOCATION:Atlantic/Madeira
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:WEST
+DTSTART:19840325T010000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19961027T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-010736
+TZOFFSETTO:-010736
+TZNAME:FMT
+DTSTART:18840101T000000
+RDATE:18840101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-010736
+TZOFFSETTO:-0100
+TZNAME:MADT
+DTSTART:19110524T000000
+RDATE:19110524T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0100
+TZOFFSETTO:+0000
+TZNAME:MADST
+DTSTART:19160617T230000
+RDATE:19160617T230000
+RDATE:19170228T230000
+RDATE:19180301T230000
+RDATE:19190228T230000
+RDATE:19200229T230000
+RDATE:19210228T230000
+RDATE:19240416T230000
+RDATE:19260417T230000
+RDATE:19270409T230000
+RDATE:19280414T230000
+RDATE:19290420T230000
+RDATE:19310418T230000
+RDATE:19320402T230000
+RDATE:19340407T230000
+RDATE:19350330T230000
+RDATE:19360418T230000
+RDATE:19370403T230000
+RDATE:19380326T230000
+RDATE:19390415T230000
+RDATE:19400224T230000
+RDATE:19410405T230000
+RDATE:19420314T230000
+RDATE:19430313T230000
+RDATE:19440311T230000
+RDATE:19450310T230000
+RDATE:19460406T230000
+RDATE:19470406T020000
+RDATE:19480404T020000
+RDATE:19490403T020000
+RDATE:19510401T020000
+RDATE:19520406T020000
+RDATE:19530405T020000
+RDATE:19540404T020000
+RDATE:19550403T020000
+RDATE:19560401T020000
+RDATE:19570407T020000
+RDATE:19580406T020000
+RDATE:19590405T020000
+RDATE:19600403T020000
+RDATE:19610402T020000
+RDATE:19620401T020000
+RDATE:19630407T020000
+RDATE:19640405T020000
+RDATE:19650404T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:-0100
+TZNAME:MADT
+DTSTART:19161101T010000
+RDATE:19161101T010000
+RDATE:19171015T000000
+RDATE:19181015T000000
+RDATE:19191015T000000
+RDATE:19201015T000000
+RDATE:19211015T000000
+RDATE:19241015T000000
+RDATE:19261003T000000
+RDATE:19271002T000000
+RDATE:19281007T000000
+RDATE:19291006T000000
+RDATE:19311004T000000
+RDATE:19321002T000000
+RDATE:19341007T000000
+RDATE:19351006T000000
+RDATE:19361004T000000
+RDATE:19371003T000000
+RDATE:19381002T000000
+RDATE:19391119T000000
+RDATE:19401006T000000
+RDATE:19411006T000000
+RDATE:19421025T000000
+RDATE:19431031T000000
+RDATE:19441029T000000
+RDATE:19451028T000000
+RDATE:19461006T000000
+RDATE:19471005T030000
+RDATE:19481003T030000
+RDATE:19491002T030000
+RDATE:19511007T030000
+RDATE:19521005T030000
+RDATE:19531004T030000
+RDATE:19541003T030000
+RDATE:19551002T030000
+RDATE:19561007T030000
+RDATE:19571006T030000
+RDATE:19581005T030000
+RDATE:19591004T030000
+RDATE:19601002T030000
+RDATE:19611001T030000
+RDATE:19621007T030000
+RDATE:19631006T030000
+RDATE:19641004T030000
+RDATE:19651003T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:MADMT
+DTSTART:19420425T230000
+RDATE:19420425T230000
+RDATE:19430417T230000
+RDATE:19440422T230000
+RDATE:19450421T230000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:MADST
+DTSTART:19420816T000000
+RDATE:19420816T000000
+RDATE:19430829T000000
+RDATE:19440827T000000
+RDATE:19450826T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0100
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19660403T020000
+RDATE:19660403T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:WEST
+DTSTART:19770327T000000
+RDATE:19770327T000000
+RDATE:19780402T000000
+RDATE:19790401T000000
+RDATE:19800330T000000
+RDATE:19810329T010000
+RDATE:19820328T010000
+RDATE:19830327T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19770925T010000
+RDATE:19770925T010000
+RDATE:19781001T010000
+RDATE:19790930T020000
+RDATE:19800928T020000
+RDATE:19810927T020000
+RDATE:19820926T020000
+RDATE:19830925T020000
+RDATE:19840930T020000
+RDATE:19850929T020000
+RDATE:19860928T020000
+RDATE:19870927T020000
+RDATE:19880925T020000
+RDATE:19890924T020000
+RDATE:19900930T020000
+RDATE:19910929T020000
+RDATE:19920927T020000
+RDATE:19930926T020000
+RDATE:19940925T020000
+RDATE:19950924T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Atlantic/Reykjavik.ics b/libkcal/libical/zoneinfo/Atlantic/Reykjavik.ics
new file mode 100644
index 00000000..adbde80f
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Atlantic/Reykjavik.ics
@@ -0,0 +1,103 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Atlantic/Reykjavik
+X-LIC-LOCATION:Atlantic/Reykjavik
+BEGIN:STANDARD
+TZOFFSETFROM:-012724
+TZOFFSETTO:-012748
+TZNAME:RMT
+DTSTART:18370101T000000
+RDATE:18370101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-012748
+TZOFFSETTO:-0100
+TZNAME:IST
+DTSTART:19080101T000000
+RDATE:19080101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0100
+TZOFFSETTO:+0000
+TZNAME:ISST
+DTSTART:19170219T230000
+RDATE:19170219T230000
+RDATE:19180219T230000
+RDATE:19390429T230000
+RDATE:19400225T020000
+RDATE:19410302T010000
+RDATE:19420308T010000
+RDATE:19430307T010000
+RDATE:19440305T010000
+RDATE:19450304T010000
+RDATE:19460303T010000
+RDATE:19470406T010000
+RDATE:19480404T010000
+RDATE:19490403T010000
+RDATE:19500402T010000
+RDATE:19510401T010000
+RDATE:19520406T010000
+RDATE:19530405T010000
+RDATE:19540404T010000
+RDATE:19550403T010000
+RDATE:19560401T010000
+RDATE:19570407T010000
+RDATE:19580406T010000
+RDATE:19590405T010000
+RDATE:19600403T010000
+RDATE:19610402T010000
+RDATE:19620401T010000
+RDATE:19630407T010000
+RDATE:19640405T010000
+RDATE:19650404T010000
+RDATE:19660403T010000
+RDATE:19670402T010000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:-0100
+TZNAME:IST
+DTSTART:19171021T010000
+RDATE:19171021T010000
+RDATE:19181116T010000
+RDATE:19391129T020000
+RDATE:19401103T020000
+RDATE:19411102T020000
+RDATE:19421025T020000
+RDATE:19431024T020000
+RDATE:19441022T020000
+RDATE:19451028T020000
+RDATE:19461027T020000
+RDATE:19471026T020000
+RDATE:19481024T020000
+RDATE:19491030T020000
+RDATE:19501022T020000
+RDATE:19511028T020000
+RDATE:19521026T020000
+RDATE:19531025T020000
+RDATE:19541024T020000
+RDATE:19551023T020000
+RDATE:19561028T020000
+RDATE:19571027T020000
+RDATE:19581026T020000
+RDATE:19591025T020000
+RDATE:19601023T020000
+RDATE:19611022T020000
+RDATE:19621028T020000
+RDATE:19631027T020000
+RDATE:19641025T020000
+RDATE:19651024T020000
+RDATE:19661023T020000
+RDATE:19671029T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0100
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19680407T010000
+RDATE:19680407T010000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Atlantic/South_Georgia.ics b/libkcal/libical/zoneinfo/Atlantic/South_Georgia.ics
new file mode 100644
index 00000000..0c6baa90
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Atlantic/South_Georgia.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Atlantic/South_Georgia
+X-LIC-LOCATION:Atlantic/South_Georgia
+BEGIN:STANDARD
+TZOFFSETFROM:-022608
+TZOFFSETTO:-0200
+TZNAME:GST
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Atlantic/St_Helena.ics b/libkcal/libical/zoneinfo/Atlantic/St_Helena.ics
new file mode 100644
index 00000000..c61644bd
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Atlantic/St_Helena.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Atlantic/St_Helena
+X-LIC-LOCATION:Atlantic/St_Helena
+BEGIN:STANDARD
+TZOFFSETFROM:-002248
+TZOFFSETTO:-002248
+TZNAME:JMT
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-002248
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19510101T000000
+RDATE:19510101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Atlantic/Stanley.ics b/libkcal/libical/zoneinfo/Atlantic/Stanley.ics
new file mode 100644
index 00000000..08e74197
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Atlantic/Stanley.ics
@@ -0,0 +1,120 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Atlantic/Stanley
+X-LIC-LOCATION:Atlantic/Stanley
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:FKT
+DTSTART:20010415T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=3SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:FKST
+DTSTART:20010902T020000
+RRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-035124
+TZOFFSETTO:-035124
+TZNAME:SMT
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-035124
+TZOFFSETTO:-0400
+TZNAME:FKT
+DTSTART:19120312T000000
+RDATE:19120312T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:FKST
+DTSTART:19370926T000000
+RDATE:19370926T000000
+RDATE:19380925T000000
+RDATE:19391001T000000
+RDATE:19400929T000000
+RDATE:19410928T000000
+RDATE:19420927T000000
+RDATE:19860914T000000
+RDATE:19870913T000000
+RDATE:19880911T000000
+RDATE:19890910T000000
+RDATE:19900909T000000
+RDATE:19910915T000000
+RDATE:19920913T000000
+RDATE:19930912T000000
+RDATE:19940911T000000
+RDATE:19950910T000000
+RDATE:19960915T000000
+RDATE:19970914T000000
+RDATE:19980913T000000
+RDATE:19990912T000000
+RDATE:20000910T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:FKT
+DTSTART:19380320T000000
+RDATE:19380320T000000
+RDATE:19390319T000000
+RDATE:19400324T000000
+RDATE:19410323T000000
+RDATE:19420322T000000
+RDATE:19430101T000000
+RDATE:19860420T000000
+RDATE:19870419T000000
+RDATE:19880417T000000
+RDATE:19890416T000000
+RDATE:19900422T000000
+RDATE:19910421T000000
+RDATE:19920419T000000
+RDATE:19930418T000000
+RDATE:19940417T000000
+RDATE:19950416T000000
+RDATE:19960421T000000
+RDATE:19970420T000000
+RDATE:19980419T000000
+RDATE:19990418T000000
+RDATE:20000416T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:FKT
+DTSTART:19830501T000000
+RDATE:19830501T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:FKST
+DTSTART:19830925T000000
+RDATE:19830925T000000
+RDATE:19840916T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:FKT
+DTSTART:19840429T000000
+RDATE:19840429T000000
+RDATE:19850428T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:FKST
+DTSTART:19850915T000000
+RDATE:19850915T000000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Australia/Adelaide.ics b/libkcal/libical/zoneinfo/Australia/Adelaide.ics
new file mode 100644
index 00000000..e842a0c0
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Australia/Adelaide.ics
@@ -0,0 +1,136 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Australia/Adelaide
+X-LIC-LOCATION:Australia/Adelaide
+BEGIN:STANDARD
+TZOFFSETFROM:+1030
+TZOFFSETTO:+0930
+TZNAME:CST
+DTSTART:20080406T030000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0930
+TZOFFSETTO:+1030
+TZNAME:CST
+DTSTART:20081005T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+091420
+TZOFFSETTO:+0900
+TZNAME:CST
+DTSTART:18950201T000000
+RDATE:18950201T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0930
+TZNAME:CST
+DTSTART:18990501T000000
+RDATE:18990501T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0930
+TZOFFSETTO:+1030
+TZNAME:CST
+DTSTART:19170101T000100
+RDATE:19170101T000100
+RDATE:19420101T020000
+RDATE:19420927T020000
+RDATE:19431003T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861019T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+RDATE:20071028T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1030
+TZOFFSETTO:+0930
+TZNAME:CST
+DTSTART:19170325T020000
+RDATE:19170325T020000
+RDATE:19420329T020000
+RDATE:19430328T020000
+RDATE:19440326T020000
+RDATE:19720227T030000
+RDATE:19730304T030000
+RDATE:19740303T030000
+RDATE:19750302T030000
+RDATE:19760307T030000
+RDATE:19770306T030000
+RDATE:19780305T030000
+RDATE:19790304T030000
+RDATE:19800302T030000
+RDATE:19810301T030000
+RDATE:19820307T030000
+RDATE:19830306T030000
+RDATE:19840304T030000
+RDATE:19850303T030000
+RDATE:19860316T030000
+RDATE:19870315T030000
+RDATE:19880320T030000
+RDATE:19890319T030000
+RDATE:19900318T030000
+RDATE:19910303T030000
+RDATE:19920322T030000
+RDATE:19930307T030000
+RDATE:19940320T030000
+RDATE:19950326T030000
+RDATE:19960331T030000
+RDATE:19970330T030000
+RDATE:19980329T030000
+RDATE:19990328T030000
+RDATE:20000326T030000
+RDATE:20010325T030000
+RDATE:20020331T030000
+RDATE:20030330T030000
+RDATE:20040328T030000
+RDATE:20050327T030000
+RDATE:20060402T030000
+RDATE:20070325T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0930
+TZOFFSETTO:+0930
+TZNAME:CST
+DTSTART:19710101T000000
+RDATE:19710101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Australia/Brisbane.ics b/libkcal/libical/zoneinfo/Australia/Brisbane.ics
new file mode 100644
index 00000000..d5fd2700
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Australia/Brisbane.ics
@@ -0,0 +1,50 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Australia/Brisbane
+X-LIC-LOCATION:Australia/Brisbane
+BEGIN:STANDARD
+TZOFFSETFROM:+101208
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:18950101T000000
+RDATE:18950101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1100
+TZNAME:EST
+DTSTART:19170101T000100
+RDATE:19170101T000100
+RDATE:19420101T020000
+RDATE:19420927T020000
+RDATE:19431003T020000
+RDATE:19711031T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:19170325T020000
+RDATE:19170325T020000
+RDATE:19420329T020000
+RDATE:19430328T020000
+RDATE:19440326T020000
+RDATE:19720227T030000
+RDATE:19900304T030000
+RDATE:19910303T030000
+RDATE:19920301T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:19710101T000000
+RDATE:19710101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Australia/Broken_Hill.ics b/libkcal/libical/zoneinfo/Australia/Broken_Hill.ics
new file mode 100644
index 00000000..16282c68
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Australia/Broken_Hill.ics
@@ -0,0 +1,150 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Australia/Broken_Hill
+X-LIC-LOCATION:Australia/Broken_Hill
+BEGIN:STANDARD
+TZOFFSETFROM:+1030
+TZOFFSETTO:+0930
+TZNAME:CST
+DTSTART:20080406T030000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0930
+TZOFFSETTO:+1030
+TZNAME:CST
+DTSTART:20081005T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+092548
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:18950201T000000
+RDATE:18950201T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+0900
+TZNAME:CST
+DTSTART:18960823T000000
+RDATE:18960823T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0930
+TZNAME:CST
+DTSTART:18990501T000000
+RDATE:18990501T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0930
+TZOFFSETTO:+1030
+TZNAME:CST
+DTSTART:19170101T000100
+RDATE:19170101T000100
+RDATE:19420101T020000
+RDATE:19420927T020000
+RDATE:19431003T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861019T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+RDATE:20071028T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1030
+TZOFFSETTO:+0930
+TZNAME:CST
+DTSTART:19170325T020000
+RDATE:19170325T020000
+RDATE:19420329T020000
+RDATE:19430328T020000
+RDATE:19440326T020000
+RDATE:19720227T030000
+RDATE:19730304T030000
+RDATE:19740303T030000
+RDATE:19750302T030000
+RDATE:19760307T030000
+RDATE:19770306T030000
+RDATE:19780305T030000
+RDATE:19790304T030000
+RDATE:19800302T030000
+RDATE:19810301T030000
+RDATE:19820404T030000
+RDATE:19830306T030000
+RDATE:19840304T030000
+RDATE:19850303T030000
+RDATE:19860316T030000
+RDATE:19870315T030000
+RDATE:19880320T030000
+RDATE:19890319T030000
+RDATE:19900304T030000
+RDATE:19910303T030000
+RDATE:19920301T030000
+RDATE:19930307T030000
+RDATE:19940306T030000
+RDATE:19950305T030000
+RDATE:19960331T030000
+RDATE:19970330T030000
+RDATE:19980329T030000
+RDATE:19990328T030000
+RDATE:20000326T030000
+RDATE:20010325T030000
+RDATE:20020331T030000
+RDATE:20030330T030000
+RDATE:20040328T030000
+RDATE:20050327T030000
+RDATE:20060402T030000
+RDATE:20070325T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0930
+TZOFFSETTO:+0930
+TZNAME:CST
+DTSTART:19710101T000000
+RDATE:19710101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1030
+TZOFFSETTO:+1030
+TZNAME:CST
+DTSTART:20000101T000000
+RDATE:20000101T000000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Australia/Currie.ics b/libkcal/libical/zoneinfo/Australia/Currie.ics
new file mode 100644
index 00000000..a6501384
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Australia/Currie.ics
@@ -0,0 +1,129 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Australia/Currie
+X-LIC-LOCATION:Australia/Currie
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1100
+TZNAME:EST
+DTSTART:20011007T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:20080406T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+093528
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:18950901T000000
+RDATE:18950901T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1100
+TZNAME:EST
+DTSTART:19161001T020000
+RDATE:19161001T020000
+RDATE:19420101T020000
+RDATE:19420927T020000
+RDATE:19431003T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861019T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911006T020000
+RDATE:19921004T020000
+RDATE:19931003T020000
+RDATE:19941002T020000
+RDATE:19951001T020000
+RDATE:19961006T020000
+RDATE:19971005T020000
+RDATE:19981004T020000
+RDATE:19991003T020000
+RDATE:20000827T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1100
+TZNAME:EST
+DTSTART:19170201T000000
+RDATE:19170201T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:19170325T020000
+RDATE:19170325T020000
+RDATE:19420329T020000
+RDATE:19430328T020000
+RDATE:19440326T020000
+RDATE:19720227T030000
+RDATE:19730304T030000
+RDATE:19740303T030000
+RDATE:19750302T030000
+RDATE:19760307T030000
+RDATE:19770306T030000
+RDATE:19780305T030000
+RDATE:19790304T030000
+RDATE:19800302T030000
+RDATE:19810301T030000
+RDATE:19820328T030000
+RDATE:19830327T030000
+RDATE:19840304T030000
+RDATE:19850303T030000
+RDATE:19860302T030000
+RDATE:19870315T030000
+RDATE:19880320T030000
+RDATE:19890319T030000
+RDATE:19900318T030000
+RDATE:19910331T030000
+RDATE:19920329T030000
+RDATE:19930328T030000
+RDATE:19940327T030000
+RDATE:19950326T030000
+RDATE:19960331T030000
+RDATE:19970330T030000
+RDATE:19980329T030000
+RDATE:19990328T030000
+RDATE:20000326T030000
+RDATE:20010325T030000
+RDATE:20020331T030000
+RDATE:20030330T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:19710701T000000
+RDATE:19710701T000000
+RDATE:20040328T020000
+RDATE:20050327T020000
+RDATE:20060402T020000
+RDATE:20070325T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Australia/Darwin.ics b/libkcal/libical/zoneinfo/Australia/Darwin.ics
new file mode 100644
index 00000000..9023bd23
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Australia/Darwin.ics
@@ -0,0 +1,42 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Australia/Darwin
+X-LIC-LOCATION:Australia/Darwin
+BEGIN:STANDARD
+TZOFFSETFROM:+084320
+TZOFFSETTO:+0900
+TZNAME:CST
+DTSTART:18950201T000000
+RDATE:18950201T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0930
+TZNAME:CST
+DTSTART:18990501T000000
+RDATE:18990501T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0930
+TZOFFSETTO:+1030
+TZNAME:CST
+DTSTART:19170101T000100
+RDATE:19170101T000100
+RDATE:19420101T020000
+RDATE:19420927T020000
+RDATE:19431003T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1030
+TZOFFSETTO:+0930
+TZNAME:CST
+DTSTART:19170325T020000
+RDATE:19170325T020000
+RDATE:19420329T020000
+RDATE:19430328T020000
+RDATE:19440326T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Australia/Eucla.ics b/libkcal/libical/zoneinfo/Australia/Eucla.ics
new file mode 100644
index 00000000..f938227e
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Australia/Eucla.ics
@@ -0,0 +1,52 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Australia/Eucla
+X-LIC-LOCATION:Australia/Eucla
+BEGIN:STANDARD
+TZOFFSETFROM:+083528
+TZOFFSETTO:+0845
+TZNAME:CWST
+DTSTART:18951201T000000
+RDATE:18951201T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0845
+TZOFFSETTO:+0945
+TZNAME:CWST
+DTSTART:19170101T000100
+RDATE:19170101T000100
+RDATE:19420101T020000
+RDATE:19420927T020000
+RDATE:19741027T020000
+RDATE:19831030T020000
+RDATE:19911117T020000
+RDATE:20061203T020000
+RDATE:20071028T020000
+RDATE:20081026T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0945
+TZOFFSETTO:+0845
+TZNAME:CWST
+DTSTART:19170325T020000
+RDATE:19170325T020000
+RDATE:19420329T020000
+RDATE:19430328T020000
+RDATE:19750302T030000
+RDATE:19840304T030000
+RDATE:19920301T030000
+RDATE:20070325T030000
+RDATE:20080330T030000
+RDATE:20090329T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0845
+TZOFFSETTO:+0845
+TZNAME:CWST
+DTSTART:19430701T000000
+RDATE:19430701T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Australia/Hobart.ics b/libkcal/libical/zoneinfo/Australia/Hobart.ics
new file mode 100644
index 00000000..8e0e97f4
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Australia/Hobart.ics
@@ -0,0 +1,137 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Australia/Hobart
+X-LIC-LOCATION:Australia/Hobart
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1100
+TZNAME:EST
+DTSTART:20011007T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:20080406T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+094916
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:18950901T000000
+RDATE:18950901T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1100
+TZNAME:EST
+DTSTART:19161001T020000
+RDATE:19161001T020000
+RDATE:19420101T020000
+RDATE:19420927T020000
+RDATE:19431003T020000
+RDATE:19671001T020000
+RDATE:19681027T020000
+RDATE:19691026T020000
+RDATE:19701025T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861019T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911006T020000
+RDATE:19921004T020000
+RDATE:19931003T020000
+RDATE:19941002T020000
+RDATE:19951001T020000
+RDATE:19961006T020000
+RDATE:19971005T020000
+RDATE:19981004T020000
+RDATE:19991003T020000
+RDATE:20000827T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1100
+TZNAME:EST
+DTSTART:19170201T000000
+RDATE:19170201T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:19170325T020000
+RDATE:19170325T020000
+RDATE:19420329T020000
+RDATE:19430328T020000
+RDATE:19440326T020000
+RDATE:19680331T030000
+RDATE:19690309T030000
+RDATE:19700308T030000
+RDATE:19710314T030000
+RDATE:19720227T030000
+RDATE:19730304T030000
+RDATE:19740303T030000
+RDATE:19750302T030000
+RDATE:19760307T030000
+RDATE:19770306T030000
+RDATE:19780305T030000
+RDATE:19790304T030000
+RDATE:19800302T030000
+RDATE:19810301T030000
+RDATE:19820328T030000
+RDATE:19830327T030000
+RDATE:19840304T030000
+RDATE:19850303T030000
+RDATE:19860302T030000
+RDATE:19870315T030000
+RDATE:19880320T030000
+RDATE:19890319T030000
+RDATE:19900318T030000
+RDATE:19910331T030000
+RDATE:19920329T030000
+RDATE:19930328T030000
+RDATE:19940327T030000
+RDATE:19950326T030000
+RDATE:19960331T030000
+RDATE:19970330T030000
+RDATE:19980329T030000
+RDATE:19990328T030000
+RDATE:20000326T030000
+RDATE:20010325T030000
+RDATE:20020331T030000
+RDATE:20030330T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:19670101T000000
+RDATE:19670101T000000
+RDATE:20040328T020000
+RDATE:20050327T020000
+RDATE:20060402T020000
+RDATE:20070325T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Australia/Lindeman.ics b/libkcal/libical/zoneinfo/Australia/Lindeman.ics
new file mode 100644
index 00000000..d1cb4f71
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Australia/Lindeman.ics
@@ -0,0 +1,55 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Australia/Lindeman
+X-LIC-LOCATION:Australia/Lindeman
+BEGIN:STANDARD
+TZOFFSETFROM:+095556
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:18950101T000000
+RDATE:18950101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1100
+TZNAME:EST
+DTSTART:19170101T000100
+RDATE:19170101T000100
+RDATE:19420101T020000
+RDATE:19420927T020000
+RDATE:19431003T020000
+RDATE:19711031T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:19170325T020000
+RDATE:19170325T020000
+RDATE:19420329T020000
+RDATE:19430328T020000
+RDATE:19440326T020000
+RDATE:19720227T030000
+RDATE:19900304T030000
+RDATE:19910303T030000
+RDATE:19920301T030000
+RDATE:19930307T030000
+RDATE:19940306T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:19710101T000000
+RDATE:19710101T000000
+RDATE:19920701T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Australia/Lord_Howe.ics b/libkcal/libical/zoneinfo/Australia/Lord_Howe.ics
new file mode 100644
index 00000000..75f33da0
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Australia/Lord_Howe.ics
@@ -0,0 +1,113 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Australia/Lord_Howe
+X-LIC-LOCATION:Australia/Lord_Howe
+BEGIN:STANDARD
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1030
+TZNAME:LHST
+DTSTART:20080406T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1030
+TZOFFSETTO:+1100
+TZNAME:LHST
+DTSTART:20081005T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+103620
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:18950201T000000
+RDATE:18950201T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1030
+TZNAME:LHST
+DTSTART:19810301T000000
+RDATE:19810301T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1030
+TZOFFSETTO:+1130
+TZNAME:LHST
+DTSTART:19811025T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1130
+TZOFFSETTO:+1030
+TZNAME:LHST
+DTSTART:19820307T020000
+RDATE:19820307T020000
+RDATE:19830306T020000
+RDATE:19840304T020000
+RDATE:19850303T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1030
+TZOFFSETTO:+1100
+TZNAME:LHST
+DTSTART:19851027T020000
+RDATE:19851027T020000
+RDATE:19861019T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20000827T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+RDATE:20071028T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1030
+TZNAME:LHST
+DTSTART:19860316T020000
+RDATE:19860316T020000
+RDATE:19870315T020000
+RDATE:19880320T020000
+RDATE:19890319T020000
+RDATE:19900304T020000
+RDATE:19910303T020000
+RDATE:19920301T020000
+RDATE:19930307T020000
+RDATE:19940306T020000
+RDATE:19950305T020000
+RDATE:19960331T020000
+RDATE:19970330T020000
+RDATE:19980329T020000
+RDATE:19990328T020000
+RDATE:20000326T020000
+RDATE:20010325T020000
+RDATE:20020331T020000
+RDATE:20030330T020000
+RDATE:20040328T020000
+RDATE:20050327T020000
+RDATE:20060402T020000
+RDATE:20070325T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Australia/Melbourne.ics b/libkcal/libical/zoneinfo/Australia/Melbourne.ics
new file mode 100644
index 00000000..e1408a35
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Australia/Melbourne.ics
@@ -0,0 +1,129 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Australia/Melbourne
+X-LIC-LOCATION:Australia/Melbourne
+BEGIN:STANDARD
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:20080406T030000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1100
+TZNAME:EST
+DTSTART:20081005T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+093952
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:18950201T000000
+RDATE:18950201T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1100
+TZNAME:EST
+DTSTART:19170101T000100
+RDATE:19170101T000100
+RDATE:19420101T020000
+RDATE:19420927T020000
+RDATE:19431003T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861019T020000
+RDATE:19871018T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20000827T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+RDATE:20071028T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:19170325T020000
+RDATE:19170325T020000
+RDATE:19420329T020000
+RDATE:19430328T020000
+RDATE:19440326T020000
+RDATE:19720227T030000
+RDATE:19730304T030000
+RDATE:19740303T030000
+RDATE:19750302T030000
+RDATE:19760307T030000
+RDATE:19770306T030000
+RDATE:19780305T030000
+RDATE:19790304T030000
+RDATE:19800302T030000
+RDATE:19810301T030000
+RDATE:19820307T030000
+RDATE:19830306T030000
+RDATE:19840304T030000
+RDATE:19850303T030000
+RDATE:19860316T030000
+RDATE:19870315T030000
+RDATE:19880320T030000
+RDATE:19890319T030000
+RDATE:19900318T030000
+RDATE:19910303T030000
+RDATE:19920301T030000
+RDATE:19930307T030000
+RDATE:19940306T030000
+RDATE:19950326T030000
+RDATE:19960331T030000
+RDATE:19970330T030000
+RDATE:19980329T030000
+RDATE:19990328T030000
+RDATE:20000326T030000
+RDATE:20010325T030000
+RDATE:20020331T030000
+RDATE:20030330T030000
+RDATE:20040328T030000
+RDATE:20050327T030000
+RDATE:20060402T030000
+RDATE:20070325T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:19710101T000000
+RDATE:19710101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Australia/Perth.ics b/libkcal/libical/zoneinfo/Australia/Perth.ics
new file mode 100644
index 00000000..9202df18
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Australia/Perth.ics
@@ -0,0 +1,52 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Australia/Perth
+X-LIC-LOCATION:Australia/Perth
+BEGIN:STANDARD
+TZOFFSETFROM:+074324
+TZOFFSETTO:+0800
+TZNAME:WST
+DTSTART:18951201T000000
+RDATE:18951201T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0900
+TZNAME:WST
+DTSTART:19170101T000100
+RDATE:19170101T000100
+RDATE:19420101T020000
+RDATE:19420927T020000
+RDATE:19741027T020000
+RDATE:19831030T020000
+RDATE:19911117T020000
+RDATE:20061203T020000
+RDATE:20071028T020000
+RDATE:20081026T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0800
+TZNAME:WST
+DTSTART:19170325T020000
+RDATE:19170325T020000
+RDATE:19420329T020000
+RDATE:19430328T020000
+RDATE:19750302T030000
+RDATE:19840304T030000
+RDATE:19920301T030000
+RDATE:20070325T030000
+RDATE:20080330T030000
+RDATE:20090329T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0800
+TZNAME:WST
+DTSTART:19430701T000000
+RDATE:19430701T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Australia/Sydney.ics b/libkcal/libical/zoneinfo/Australia/Sydney.ics
new file mode 100644
index 00000000..8c340a0a
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Australia/Sydney.ics
@@ -0,0 +1,129 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Australia/Sydney
+X-LIC-LOCATION:Australia/Sydney
+BEGIN:STANDARD
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:20080406T030000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1100
+TZNAME:EST
+DTSTART:20081005T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+100452
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:18950201T000000
+RDATE:18950201T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1100
+TZNAME:EST
+DTSTART:19170101T000100
+RDATE:19170101T000100
+RDATE:19420101T020000
+RDATE:19420927T020000
+RDATE:19431003T020000
+RDATE:19711031T020000
+RDATE:19721029T020000
+RDATE:19731028T020000
+RDATE:19741027T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861019T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931031T020000
+RDATE:19941030T020000
+RDATE:19951029T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20000827T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+RDATE:20071028T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:19170325T020000
+RDATE:19170325T020000
+RDATE:19420329T020000
+RDATE:19430328T020000
+RDATE:19440326T020000
+RDATE:19720227T030000
+RDATE:19730304T030000
+RDATE:19740303T030000
+RDATE:19750302T030000
+RDATE:19760307T030000
+RDATE:19770306T030000
+RDATE:19780305T030000
+RDATE:19790304T030000
+RDATE:19800302T030000
+RDATE:19810301T030000
+RDATE:19820404T030000
+RDATE:19830306T030000
+RDATE:19840304T030000
+RDATE:19850303T030000
+RDATE:19860316T030000
+RDATE:19870315T030000
+RDATE:19880320T030000
+RDATE:19890319T030000
+RDATE:19900304T030000
+RDATE:19910303T030000
+RDATE:19920301T030000
+RDATE:19930307T030000
+RDATE:19940306T030000
+RDATE:19950305T030000
+RDATE:19960331T030000
+RDATE:19970330T030000
+RDATE:19980329T030000
+RDATE:19990328T030000
+RDATE:20000326T030000
+RDATE:20010325T030000
+RDATE:20020331T030000
+RDATE:20030330T030000
+RDATE:20040328T030000
+RDATE:20050327T030000
+RDATE:20060402T030000
+RDATE:20070325T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:19710101T000000
+RDATE:19710101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Amsterdam.ics b/libkcal/libical/zoneinfo/Europe/Amsterdam.ics
new file mode 100644
index 00000000..206edf49
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Amsterdam.ics
@@ -0,0 +1,164 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Amsterdam
+X-LIC-LOCATION:Europe/Amsterdam
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19810329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+001932
+TZOFFSETTO:+001932
+TZNAME:AMT
+DTSTART:18350101T000000
+RDATE:18350101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+001932
+TZOFFSETTO:+011932
+TZNAME:NST
+DTSTART:19160501T000000
+RDATE:19160501T000000
+RDATE:19170416T020000
+RDATE:19180401T020000
+RDATE:19190407T020000
+RDATE:19200405T020000
+RDATE:19210404T020000
+RDATE:19220326T020000
+RDATE:19230601T020000
+RDATE:19240330T020000
+RDATE:19250605T020000
+RDATE:19260515T020000
+RDATE:19270515T020000
+RDATE:19280515T020000
+RDATE:19290515T020000
+RDATE:19300515T020000
+RDATE:19310515T020000
+RDATE:19320522T020000
+RDATE:19330515T020000
+RDATE:19340515T020000
+RDATE:19350515T020000
+RDATE:19360515T020000
+RDATE:19370522T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+011932
+TZOFFSETTO:+001932
+TZNAME:AMT
+DTSTART:19161001T000000
+RDATE:19161001T000000
+RDATE:19170917T030000
+RDATE:19180930T030000
+RDATE:19190929T030000
+RDATE:19200927T030000
+RDATE:19210926T030000
+RDATE:19221008T030000
+RDATE:19231007T030000
+RDATE:19241005T030000
+RDATE:19251004T030000
+RDATE:19261003T030000
+RDATE:19271002T030000
+RDATE:19281007T030000
+RDATE:19291006T030000
+RDATE:19301005T030000
+RDATE:19311004T030000
+RDATE:19321002T030000
+RDATE:19331008T030000
+RDATE:19341007T030000
+RDATE:19351006T030000
+RDATE:19361004T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+011932
+TZOFFSETTO:+0120
+TZNAME:NEST
+DTSTART:19370701T000000
+RDATE:19370701T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0120
+TZOFFSETTO:+0020
+TZNAME:NET
+DTSTART:19371003T030000
+RDATE:19371003T030000
+RDATE:19381002T030000
+RDATE:19391008T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0020
+TZOFFSETTO:+0120
+TZNAME:NEST
+DTSTART:19380515T020000
+RDATE:19380515T020000
+RDATE:19390515T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0020
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19400516T000000
+RDATE:19400516T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19421102T030000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19441002T030000
+RDATE:19450916T030000
+RDATE:19770925T030000
+RDATE:19781001T030000
+RDATE:19790930T030000
+RDATE:19800928T030000
+RDATE:19810927T030000
+RDATE:19820926T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19430329T020000
+RDATE:19430329T020000
+RDATE:19440403T020000
+RDATE:19450402T020000
+RDATE:19770403T020000
+RDATE:19780402T020000
+RDATE:19790401T020000
+RDATE:19800406T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19770101T000000
+RDATE:19770101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Andorra.ics b/libkcal/libical/zoneinfo/Europe/Andorra.ics
new file mode 100644
index 00000000..524cd116
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Andorra.ics
@@ -0,0 +1,53 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Andorra
+X-LIC-LOCATION:Europe/Andorra
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19850331T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+000604
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19010101T000000
+RDATE:19010101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19460930T000000
+RDATE:19460930T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19850929T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Athens.ics b/libkcal/libical/zoneinfo/Europe/Athens.ics
new file mode 100644
index 00000000..81d4609a
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Athens.ics
@@ -0,0 +1,116 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Athens
+X-LIC-LOCATION:Europe/Athens
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19810329T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19961027T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+013452
+TZOFFSETTO:+013452
+TZNAME:AMT
+DTSTART:18950914T000000
+RDATE:18950914T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+013452
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19160728T000100
+RDATE:19160728T000100
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19320707T000000
+RDATE:19320707T000000
+RDATE:19410407T000000
+RDATE:19520701T000000
+RDATE:19750412T000000
+RDATE:19760411T020000
+RDATE:19770403T020000
+RDATE:19780402T020000
+RDATE:19790401T090000
+RDATE:19800401T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19320901T000000
+RDATE:19320901T000000
+RDATE:19521102T000000
+RDATE:19751126T010000
+RDATE:19761010T030000
+RDATE:19770926T030000
+RDATE:19780924T040000
+RDATE:19790929T020000
+RDATE:19800928T000000
+RDATE:19810927T040000
+RDATE:19820926T040000
+RDATE:19830925T040000
+RDATE:19840930T040000
+RDATE:19850929T040000
+RDATE:19860928T040000
+RDATE:19870927T040000
+RDATE:19880925T040000
+RDATE:19890924T040000
+RDATE:19900930T040000
+RDATE:19910929T040000
+RDATE:19920927T040000
+RDATE:19930926T040000
+RDATE:19940925T040000
+RDATE:19950924T040000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19410430T000000
+RDATE:19410430T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19421102T030000
+RDATE:19421102T030000
+RDATE:19431004T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19430330T000000
+RDATE:19430330T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19440404T000000
+RDATE:19440404T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19810101T000000
+RDATE:19810101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Belgrade.ics b/libkcal/libical/zoneinfo/Europe/Belgrade.ics
new file mode 100644
index 00000000..ee1ad80d
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Belgrade.ics
@@ -0,0 +1,69 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Belgrade
+X-LIC-LOCATION:Europe/Belgrade
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19830327T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0122
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:18840101T000000
+RDATE:18840101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19410418T230000
+RDATE:19410418T230000
+RDATE:19430329T020000
+RDATE:19440403T020000
+RDATE:19450508T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19421102T030000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19441002T030000
+RDATE:19450916T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19821127T000000
+RDATE:19821127T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Berlin.ics b/libkcal/libical/zoneinfo/Europe/Berlin.ics
new file mode 100644
index 00000000..31f98f59
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Berlin.ics
@@ -0,0 +1,103 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Berlin
+X-LIC-LOCATION:Europe/Berlin
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19810329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+005328
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:18930401T000000
+RDATE:18930401T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19160430T230000
+RDATE:19160430T230000
+RDATE:19170416T020000
+RDATE:19180415T020000
+RDATE:19400401T020000
+RDATE:19430329T020000
+RDATE:19440403T020000
+RDATE:19450402T020000
+RDATE:19460414T020000
+RDATE:19470406T020000
+RDATE:19480418T020000
+RDATE:19490410T020000
+RDATE:19800406T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19161001T010000
+RDATE:19161001T010000
+RDATE:19170917T030000
+RDATE:19180916T030000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19441002T030000
+RDATE:19451118T030000
+RDATE:19461007T030000
+RDATE:19471005T030000
+RDATE:19481003T030000
+RDATE:19491002T030000
+RDATE:19800928T030000
+RDATE:19810927T030000
+RDATE:19820926T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:CEMT
+DTSTART:19450524T020000
+RDATE:19450524T020000
+RDATE:19470511T030000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19450924T030000
+RDATE:19450924T030000
+RDATE:19470629T030000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19800101T000000
+RDATE:19800101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Bratislava.ics b/libkcal/libical/zoneinfo/Europe/Bratislava.ics
new file mode 100644
index 00000000..9be30ffa
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Bratislava.ics
@@ -0,0 +1,96 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Bratislava
+X-LIC-LOCATION:Europe/Bratislava
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19810329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+005744
+TZOFFSETTO:+005744
+TZNAME:PMT
+DTSTART:18500101T000000
+RDATE:18500101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+005744
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:18911001T000000
+RDATE:18911001T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19160430T230000
+RDATE:19160430T230000
+RDATE:19170416T020000
+RDATE:19180415T020000
+RDATE:19400401T020000
+RDATE:19430329T020000
+RDATE:19440403T020000
+RDATE:19450408T020000
+RDATE:19460506T020000
+RDATE:19470420T020000
+RDATE:19480418T020000
+RDATE:19490409T020000
+RDATE:19790401T020000
+RDATE:19800406T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19161001T010000
+RDATE:19161001T010000
+RDATE:19170917T030000
+RDATE:19180916T030000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19440917T030000
+RDATE:19451118T030000
+RDATE:19461006T030000
+RDATE:19471005T030000
+RDATE:19481003T030000
+RDATE:19491002T030000
+RDATE:19790930T030000
+RDATE:19800928T030000
+RDATE:19810927T030000
+RDATE:19820926T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19790101T000000
+RDATE:19790101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Brussels.ics b/libkcal/libical/zoneinfo/Europe/Brussels.ics
new file mode 100644
index 00000000..c3bb7ab2
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Brussels.ics
@@ -0,0 +1,164 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Brussels
+X-LIC-LOCATION:Europe/Brussels
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19810329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+001730
+TZOFFSETTO:+001730
+TZNAME:BMT
+DTSTART:18800101T000000
+RDATE:18800101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+001730
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:18920501T120000
+RDATE:18920501T120000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19141108T000000
+RDATE:19141108T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19160501T000000
+RDATE:19160501T000000
+RDATE:19170416T020000
+RDATE:19180415T020000
+RDATE:19400520T030000
+RDATE:19430329T020000
+RDATE:19440403T020000
+RDATE:19450402T020000
+RDATE:19460519T020000
+RDATE:19770403T020000
+RDATE:19780402T020000
+RDATE:19790401T020000
+RDATE:19800406T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19161001T010000
+RDATE:19161001T010000
+RDATE:19170917T030000
+RDATE:19180916T030000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19440917T030000
+RDATE:19450916T030000
+RDATE:19461007T030000
+RDATE:19770925T030000
+RDATE:19781001T030000
+RDATE:19790930T030000
+RDATE:19800928T030000
+RDATE:19810927T030000
+RDATE:19820926T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19181111T120000
+RDATE:19181111T120000
+RDATE:19191005T000000
+RDATE:19201024T000000
+RDATE:19211026T000000
+RDATE:19221008T000000
+RDATE:19231007T000000
+RDATE:19241005T000000
+RDATE:19251004T000000
+RDATE:19261003T000000
+RDATE:19271002T000000
+RDATE:19281007T030000
+RDATE:19291006T030000
+RDATE:19301005T030000
+RDATE:19311004T030000
+RDATE:19321002T030000
+RDATE:19331008T030000
+RDATE:19341007T030000
+RDATE:19351006T030000
+RDATE:19361004T030000
+RDATE:19371003T030000
+RDATE:19381002T030000
+RDATE:19391119T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:WEST
+DTSTART:19190301T230000
+RDATE:19190301T230000
+RDATE:19200214T230000
+RDATE:19210314T230000
+RDATE:19220325T230000
+RDATE:19230421T230000
+RDATE:19240329T230000
+RDATE:19250404T230000
+RDATE:19260417T230000
+RDATE:19270409T230000
+RDATE:19280414T230000
+RDATE:19290421T020000
+RDATE:19300413T020000
+RDATE:19310419T020000
+RDATE:19320403T020000
+RDATE:19330326T020000
+RDATE:19340408T020000
+RDATE:19350331T020000
+RDATE:19360419T020000
+RDATE:19370404T020000
+RDATE:19380327T020000
+RDATE:19390416T020000
+RDATE:19400225T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19440903T000000
+RDATE:19440903T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19770101T000000
+RDATE:19770101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Bucharest.ics b/libkcal/libical/zoneinfo/Europe/Bucharest.ics
new file mode 100644
index 00000000..008e60a1
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Bucharest.ics
@@ -0,0 +1,109 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Bucharest
+X-LIC-LOCATION:Europe/Bucharest
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19970330T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19971026T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+014424
+TZOFFSETTO:+014424
+TZNAME:BMT
+DTSTART:18911001T000000
+RDATE:18911001T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+014424
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19310724T000000
+RDATE:19310724T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19320521T000000
+RDATE:19320521T000000
+RDATE:19330402T000000
+RDATE:19340408T000000
+RDATE:19350407T000000
+RDATE:19360405T000000
+RDATE:19370404T000000
+RDATE:19380403T000000
+RDATE:19390402T000000
+RDATE:19790527T000000
+RDATE:19800405T230000
+RDATE:19810329T020000
+RDATE:19820328T020000
+RDATE:19830327T020000
+RDATE:19840325T020000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+RDATE:19910331T000000
+RDATE:19920329T000000
+RDATE:19930328T000000
+RDATE:19940327T000000
+RDATE:19950326T000000
+RDATE:19960331T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19321002T010000
+RDATE:19321002T010000
+RDATE:19331001T010000
+RDATE:19341007T010000
+RDATE:19351006T010000
+RDATE:19361004T010000
+RDATE:19371003T010000
+RDATE:19381002T010000
+RDATE:19391001T010000
+RDATE:19790930T000000
+RDATE:19800928T010000
+RDATE:19810927T030000
+RDATE:19820926T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T010000
+RDATE:19920927T010000
+RDATE:19930926T010000
+RDATE:19940925T000000
+RDATE:19950924T000000
+RDATE:19961027T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19910101T000000
+RDATE:19910101T000000
+RDATE:19940101T000000
+RDATE:19970101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Budapest.ics b/libkcal/libical/zoneinfo/Europe/Budapest.ics
new file mode 100644
index 00000000..23625345
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Budapest.ics
@@ -0,0 +1,101 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Budapest
+X-LIC-LOCATION:Europe/Budapest
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19810329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+011620
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:18901001T000000
+RDATE:18901001T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19160430T230000
+RDATE:19160430T230000
+RDATE:19170416T020000
+RDATE:19180401T030000
+RDATE:19190415T030000
+RDATE:19200405T030000
+RDATE:19410406T020000
+RDATE:19430329T020000
+RDATE:19440403T020000
+RDATE:19450501T230000
+RDATE:19460331T020000
+RDATE:19470406T020000
+RDATE:19480404T020000
+RDATE:19490410T020000
+RDATE:19500417T020000
+RDATE:19540523T000000
+RDATE:19550523T000000
+RDATE:19560603T000000
+RDATE:19570602T010000
+RDATE:19800406T010000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19161001T010000
+RDATE:19161001T010000
+RDATE:19170917T030000
+RDATE:19180929T030000
+RDATE:19190915T030000
+RDATE:19200930T030000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19441002T030000
+RDATE:19451103T000000
+RDATE:19461006T030000
+RDATE:19471005T030000
+RDATE:19481003T030000
+RDATE:19491002T030000
+RDATE:19501023T030000
+RDATE:19541003T000000
+RDATE:19551003T000000
+RDATE:19560930T000000
+RDATE:19570929T030000
+RDATE:19800928T030000
+RDATE:19810927T030000
+RDATE:19820926T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19180101T000000
+RDATE:19180101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Chisinau.ics b/libkcal/libical/zoneinfo/Europe/Chisinau.ics
new file mode 100644
index 00000000..a0c4ec4d
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Chisinau.ics
@@ -0,0 +1,161 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Chisinau
+X-LIC-LOCATION:Europe/Chisinau
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19970330T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19971026T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+015520
+TZOFFSETTO:+0155
+TZNAME:CMT
+DTSTART:18800101T000000
+RDATE:18800101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0155
+TZOFFSETTO:+014424
+TZNAME:BMT
+DTSTART:19180215T000000
+RDATE:19180215T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+014424
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19310724T000000
+RDATE:19310724T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19320521T000000
+RDATE:19320521T000000
+RDATE:19330402T000000
+RDATE:19340408T000000
+RDATE:19350407T000000
+RDATE:19360405T000000
+RDATE:19370404T000000
+RDATE:19380403T000000
+RDATE:19390402T000000
+RDATE:19400815T000000
+RDATE:19910331T020000
+RDATE:19920329T000000
+RDATE:19930328T000000
+RDATE:19940327T000000
+RDATE:19950326T000000
+RDATE:19960331T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19321002T010000
+RDATE:19321002T010000
+RDATE:19331001T010000
+RDATE:19341007T010000
+RDATE:19351006T010000
+RDATE:19361004T010000
+RDATE:19371003T010000
+RDATE:19381002T010000
+RDATE:19391001T010000
+RDATE:19900506T000000
+RDATE:19910929T030000
+RDATE:19920927T000000
+RDATE:19930926T000000
+RDATE:19940925T000000
+RDATE:19950924T000000
+RDATE:19961027T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19410717T000000
+RDATE:19410717T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19421102T030000
+RDATE:19421102T030000
+RDATE:19431004T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19430329T020000
+RDATE:19430329T020000
+RDATE:19440403T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19440824T000000
+RDATE:19440824T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:MSD
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19900101T000000
+RDATE:19900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19910101T000000
+RDATE:19910101T000000
+RDATE:19920101T000000
+RDATE:19970101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Copenhagen.ics b/libkcal/libical/zoneinfo/Europe/Copenhagen.ics
new file mode 100644
index 00000000..060c3e09
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Copenhagen.ics
@@ -0,0 +1,88 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Copenhagen
+X-LIC-LOCATION:Europe/Copenhagen
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19810329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+005020
+TZOFFSETTO:+005020
+TZNAME:CMT
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+005020
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:18940101T000000
+RDATE:18940101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19160514T230000
+RDATE:19160514T230000
+RDATE:19400515T000000
+RDATE:19430329T020000
+RDATE:19440403T020000
+RDATE:19450402T020000
+RDATE:19460501T020000
+RDATE:19470504T020000
+RDATE:19480509T020000
+RDATE:19800406T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19160930T230000
+RDATE:19160930T230000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19441002T030000
+RDATE:19450815T030000
+RDATE:19460901T030000
+RDATE:19470810T030000
+RDATE:19480808T030000
+RDATE:19800928T030000
+RDATE:19810927T030000
+RDATE:19820926T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19800101T000000
+RDATE:19800101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Dublin.ics b/libkcal/libical/zoneinfo/Europe/Dublin.ics
new file mode 100644
index 00000000..3be21d73
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Dublin.ics
@@ -0,0 +1,201 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Dublin
+X-LIC-LOCATION:Europe/Dublin
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:IST
+DTSTART:19810329T010000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19961027T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0025
+TZOFFSETTO:-002521
+TZNAME:DMT
+DTSTART:18800802T000000
+RDATE:18800802T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-002521
+TZOFFSETTO:+003439
+TZNAME:IST
+DTSTART:19160521T020000
+RDATE:19160521T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+003439
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19161001T030000
+RDATE:19161001T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:BST
+DTSTART:19170408T020000
+RDATE:19170408T020000
+RDATE:19180324T020000
+RDATE:19190330T020000
+RDATE:19200328T020000
+RDATE:19210403T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19170917T030000
+RDATE:19170917T030000
+RDATE:19180930T030000
+RDATE:19190929T030000
+RDATE:19201025T030000
+RDATE:19211003T030000
+RDATE:19221008T030000
+RDATE:19230916T030000
+RDATE:19240921T030000
+RDATE:19251004T030000
+RDATE:19261003T030000
+RDATE:19271002T030000
+RDATE:19281007T030000
+RDATE:19291006T030000
+RDATE:19301005T030000
+RDATE:19311004T030000
+RDATE:19321002T030000
+RDATE:19331008T030000
+RDATE:19341007T030000
+RDATE:19351006T030000
+RDATE:19361004T030000
+RDATE:19371003T030000
+RDATE:19381002T030000
+RDATE:19391119T030000
+RDATE:19461006T020000
+RDATE:19471102T020000
+RDATE:19481031T030000
+RDATE:19491030T030000
+RDATE:19501022T030000
+RDATE:19511021T030000
+RDATE:19521026T030000
+RDATE:19531004T030000
+RDATE:19541003T030000
+RDATE:19551002T030000
+RDATE:19561007T030000
+RDATE:19571006T030000
+RDATE:19581005T030000
+RDATE:19591004T030000
+RDATE:19601002T030000
+RDATE:19611029T030000
+RDATE:19621028T030000
+RDATE:19631027T030000
+RDATE:19641025T030000
+RDATE:19651024T030000
+RDATE:19661023T030000
+RDATE:19671029T030000
+RDATE:19711031T030000
+RDATE:19721029T030000
+RDATE:19731028T030000
+RDATE:19741027T030000
+RDATE:19751026T030000
+RDATE:19761024T030000
+RDATE:19771023T030000
+RDATE:19781029T030000
+RDATE:19791028T030000
+RDATE:19801026T030000
+RDATE:19811025T020000
+RDATE:19821024T020000
+RDATE:19831023T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881023T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931024T020000
+RDATE:19941023T020000
+RDATE:19951022T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19211206T000000
+RDATE:19211206T000000
+RDATE:19960101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:IST
+DTSTART:19220326T020000
+RDATE:19220326T020000
+RDATE:19230422T020000
+RDATE:19240413T020000
+RDATE:19250419T020000
+RDATE:19260418T020000
+RDATE:19270410T020000
+RDATE:19280422T020000
+RDATE:19290421T020000
+RDATE:19300413T020000
+RDATE:19310419T020000
+RDATE:19320417T020000
+RDATE:19330409T020000
+RDATE:19340422T020000
+RDATE:19350414T020000
+RDATE:19360419T020000
+RDATE:19370418T020000
+RDATE:19380410T020000
+RDATE:19390416T020000
+RDATE:19400225T020000
+RDATE:19470316T020000
+RDATE:19480418T020000
+RDATE:19490403T020000
+RDATE:19500416T020000
+RDATE:19510415T020000
+RDATE:19520420T020000
+RDATE:19530419T020000
+RDATE:19540411T020000
+RDATE:19550417T020000
+RDATE:19560422T020000
+RDATE:19570414T020000
+RDATE:19580420T020000
+RDATE:19590419T020000
+RDATE:19600410T020000
+RDATE:19610326T020000
+RDATE:19620325T020000
+RDATE:19630331T020000
+RDATE:19640322T020000
+RDATE:19650321T020000
+RDATE:19660320T020000
+RDATE:19670319T020000
+RDATE:19680218T020000
+RDATE:19720319T020000
+RDATE:19730318T020000
+RDATE:19740317T020000
+RDATE:19750316T020000
+RDATE:19760321T020000
+RDATE:19770320T020000
+RDATE:19780319T020000
+RDATE:19790318T020000
+RDATE:19800316T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:IST
+DTSTART:19681027T000000
+RDATE:19681027T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Gibraltar.ics b/libkcal/libical/zoneinfo/Europe/Gibraltar.ics
new file mode 100644
index 00000000..f33980a4
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Gibraltar.ics
@@ -0,0 +1,171 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Gibraltar
+X-LIC-LOCATION:Europe/Gibraltar
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19820328T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-002124
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:18800802T000000
+RDATE:18800802T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:BST
+DTSTART:19160521T020000
+RDATE:19160521T020000
+RDATE:19170408T020000
+RDATE:19180324T020000
+RDATE:19190330T020000
+RDATE:19200328T020000
+RDATE:19210403T020000
+RDATE:19220326T020000
+RDATE:19230422T020000
+RDATE:19240413T020000
+RDATE:19250419T020000
+RDATE:19260418T020000
+RDATE:19270410T020000
+RDATE:19280422T020000
+RDATE:19290421T020000
+RDATE:19300413T020000
+RDATE:19310419T020000
+RDATE:19320417T020000
+RDATE:19330409T020000
+RDATE:19340422T020000
+RDATE:19350414T020000
+RDATE:19360419T020000
+RDATE:19370418T020000
+RDATE:19380410T020000
+RDATE:19390416T020000
+RDATE:19400225T020000
+RDATE:19460414T020000
+RDATE:19470316T020000
+RDATE:19480314T020000
+RDATE:19490403T020000
+RDATE:19500416T020000
+RDATE:19510415T020000
+RDATE:19520420T020000
+RDATE:19530419T020000
+RDATE:19540411T020000
+RDATE:19550417T020000
+RDATE:19560422T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19161001T030000
+RDATE:19161001T030000
+RDATE:19170917T030000
+RDATE:19180930T030000
+RDATE:19190929T030000
+RDATE:19201025T030000
+RDATE:19211003T030000
+RDATE:19221008T030000
+RDATE:19230916T030000
+RDATE:19240921T030000
+RDATE:19251004T030000
+RDATE:19261003T030000
+RDATE:19271002T030000
+RDATE:19281007T030000
+RDATE:19291006T030000
+RDATE:19301005T030000
+RDATE:19311004T030000
+RDATE:19321002T030000
+RDATE:19331008T030000
+RDATE:19341007T030000
+RDATE:19351006T030000
+RDATE:19361004T030000
+RDATE:19371003T030000
+RDATE:19381002T030000
+RDATE:19391119T030000
+RDATE:19451007T030000
+RDATE:19461006T030000
+RDATE:19471102T030000
+RDATE:19481031T030000
+RDATE:19491030T030000
+RDATE:19501022T030000
+RDATE:19511021T030000
+RDATE:19521026T030000
+RDATE:19531004T030000
+RDATE:19541003T030000
+RDATE:19551002T030000
+RDATE:19561007T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:BDST
+DTSTART:19410504T020000
+RDATE:19410504T020000
+RDATE:19420405T020000
+RDATE:19430404T020000
+RDATE:19440402T020000
+RDATE:19450402T020000
+RDATE:19470413T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:BST
+DTSTART:19410810T030000
+RDATE:19410810T030000
+RDATE:19420809T030000
+RDATE:19430815T030000
+RDATE:19440917T030000
+RDATE:19450715T030000
+RDATE:19470810T030000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19570414T020000
+RDATE:19570414T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19820101T000000
+RDATE:19820101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19820926T030000
+RDATE:19820926T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Guernsey.ics b/libkcal/libical/zoneinfo/Europe/Guernsey.ics
new file mode 100644
index 00000000..5aa50be2
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Guernsey.ics
@@ -0,0 +1,208 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Guernsey
+X-LIC-LOCATION:Europe/Guernsey
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:BST
+DTSTART:19810329T010000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19961027T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-000115
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:18471201T000000
+RDATE:18471201T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:BST
+DTSTART:19160521T020000
+RDATE:19160521T020000
+RDATE:19170408T020000
+RDATE:19180324T020000
+RDATE:19190330T020000
+RDATE:19200328T020000
+RDATE:19210403T020000
+RDATE:19220326T020000
+RDATE:19230422T020000
+RDATE:19240413T020000
+RDATE:19250419T020000
+RDATE:19260418T020000
+RDATE:19270410T020000
+RDATE:19280422T020000
+RDATE:19290421T020000
+RDATE:19300413T020000
+RDATE:19310419T020000
+RDATE:19320417T020000
+RDATE:19330409T020000
+RDATE:19340422T020000
+RDATE:19350414T020000
+RDATE:19360419T020000
+RDATE:19370418T020000
+RDATE:19380410T020000
+RDATE:19390416T020000
+RDATE:19400225T020000
+RDATE:19460414T020000
+RDATE:19470316T020000
+RDATE:19480314T020000
+RDATE:19490403T020000
+RDATE:19500416T020000
+RDATE:19510415T020000
+RDATE:19520420T020000
+RDATE:19530419T020000
+RDATE:19540411T020000
+RDATE:19550417T020000
+RDATE:19560422T020000
+RDATE:19570414T020000
+RDATE:19580420T020000
+RDATE:19590419T020000
+RDATE:19600410T020000
+RDATE:19610326T020000
+RDATE:19620325T020000
+RDATE:19630331T020000
+RDATE:19640322T020000
+RDATE:19650321T020000
+RDATE:19660320T020000
+RDATE:19670319T020000
+RDATE:19680218T020000
+RDATE:19720319T020000
+RDATE:19730318T020000
+RDATE:19740317T020000
+RDATE:19750316T020000
+RDATE:19760321T020000
+RDATE:19770320T020000
+RDATE:19780319T020000
+RDATE:19790318T020000
+RDATE:19800316T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19161001T030000
+RDATE:19161001T030000
+RDATE:19170917T030000
+RDATE:19180930T030000
+RDATE:19190929T030000
+RDATE:19201025T030000
+RDATE:19211003T030000
+RDATE:19221008T030000
+RDATE:19230916T030000
+RDATE:19240921T030000
+RDATE:19251004T030000
+RDATE:19261003T030000
+RDATE:19271002T030000
+RDATE:19281007T030000
+RDATE:19291006T030000
+RDATE:19301005T030000
+RDATE:19311004T030000
+RDATE:19321002T030000
+RDATE:19331008T030000
+RDATE:19341007T030000
+RDATE:19351006T030000
+RDATE:19361004T030000
+RDATE:19371003T030000
+RDATE:19381002T030000
+RDATE:19391119T030000
+RDATE:19451007T030000
+RDATE:19461006T030000
+RDATE:19471102T030000
+RDATE:19481031T030000
+RDATE:19491030T030000
+RDATE:19501022T030000
+RDATE:19511021T030000
+RDATE:19521026T030000
+RDATE:19531004T030000
+RDATE:19541003T030000
+RDATE:19551002T030000
+RDATE:19561007T030000
+RDATE:19571006T030000
+RDATE:19581005T030000
+RDATE:19591004T030000
+RDATE:19601002T030000
+RDATE:19611029T030000
+RDATE:19621028T030000
+RDATE:19631027T030000
+RDATE:19641025T030000
+RDATE:19651024T030000
+RDATE:19661023T030000
+RDATE:19671029T030000
+RDATE:19711031T030000
+RDATE:19721029T030000
+RDATE:19731028T030000
+RDATE:19741027T030000
+RDATE:19751026T030000
+RDATE:19761024T030000
+RDATE:19771023T030000
+RDATE:19781029T030000
+RDATE:19791028T030000
+RDATE:19801026T030000
+RDATE:19811025T020000
+RDATE:19821024T020000
+RDATE:19831023T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881023T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931024T020000
+RDATE:19941023T020000
+RDATE:19951022T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:BDST
+DTSTART:19410504T020000
+RDATE:19410504T020000
+RDATE:19420405T020000
+RDATE:19430404T020000
+RDATE:19440402T020000
+RDATE:19450402T020000
+RDATE:19470413T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:BST
+DTSTART:19410810T030000
+RDATE:19410810T030000
+RDATE:19420809T030000
+RDATE:19430815T030000
+RDATE:19440917T030000
+RDATE:19450715T030000
+RDATE:19470810T030000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:BST
+DTSTART:19681027T000000
+RDATE:19681027T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19960101T000000
+RDATE:19960101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Helsinki.ics b/libkcal/libical/zoneinfo/Europe/Helsinki.ics
new file mode 100644
index 00000000..113b0e62
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Helsinki.ics
@@ -0,0 +1,72 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Helsinki
+X-LIC-LOCATION:Europe/Helsinki
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19810329T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19961027T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+013952
+TZOFFSETTO:+013952
+TZNAME:HMT
+DTSTART:18780531T000000
+RDATE:18780531T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+013952
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19210501T000000
+RDATE:19210501T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19420403T000000
+RDATE:19420403T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19421003T000000
+RDATE:19421003T000000
+RDATE:19810927T040000
+RDATE:19820926T040000
+RDATE:19830925T040000
+RDATE:19840930T040000
+RDATE:19850929T040000
+RDATE:19860928T040000
+RDATE:19870927T040000
+RDATE:19880925T040000
+RDATE:19890924T040000
+RDATE:19900930T040000
+RDATE:19910929T040000
+RDATE:19920927T040000
+RDATE:19930926T040000
+RDATE:19940925T040000
+RDATE:19950924T040000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19810329T020000
+RDATE:19810329T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Isle_of_Man.ics b/libkcal/libical/zoneinfo/Europe/Isle_of_Man.ics
new file mode 100644
index 00000000..9b80ac70
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Isle_of_Man.ics
@@ -0,0 +1,208 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Isle_of_Man
+X-LIC-LOCATION:Europe/Isle_of_Man
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:BST
+DTSTART:19810329T010000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19961027T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-000115
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:18471201T000000
+RDATE:18471201T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:BST
+DTSTART:19160521T020000
+RDATE:19160521T020000
+RDATE:19170408T020000
+RDATE:19180324T020000
+RDATE:19190330T020000
+RDATE:19200328T020000
+RDATE:19210403T020000
+RDATE:19220326T020000
+RDATE:19230422T020000
+RDATE:19240413T020000
+RDATE:19250419T020000
+RDATE:19260418T020000
+RDATE:19270410T020000
+RDATE:19280422T020000
+RDATE:19290421T020000
+RDATE:19300413T020000
+RDATE:19310419T020000
+RDATE:19320417T020000
+RDATE:19330409T020000
+RDATE:19340422T020000
+RDATE:19350414T020000
+RDATE:19360419T020000
+RDATE:19370418T020000
+RDATE:19380410T020000
+RDATE:19390416T020000
+RDATE:19400225T020000
+RDATE:19460414T020000
+RDATE:19470316T020000
+RDATE:19480314T020000
+RDATE:19490403T020000
+RDATE:19500416T020000
+RDATE:19510415T020000
+RDATE:19520420T020000
+RDATE:19530419T020000
+RDATE:19540411T020000
+RDATE:19550417T020000
+RDATE:19560422T020000
+RDATE:19570414T020000
+RDATE:19580420T020000
+RDATE:19590419T020000
+RDATE:19600410T020000
+RDATE:19610326T020000
+RDATE:19620325T020000
+RDATE:19630331T020000
+RDATE:19640322T020000
+RDATE:19650321T020000
+RDATE:19660320T020000
+RDATE:19670319T020000
+RDATE:19680218T020000
+RDATE:19720319T020000
+RDATE:19730318T020000
+RDATE:19740317T020000
+RDATE:19750316T020000
+RDATE:19760321T020000
+RDATE:19770320T020000
+RDATE:19780319T020000
+RDATE:19790318T020000
+RDATE:19800316T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19161001T030000
+RDATE:19161001T030000
+RDATE:19170917T030000
+RDATE:19180930T030000
+RDATE:19190929T030000
+RDATE:19201025T030000
+RDATE:19211003T030000
+RDATE:19221008T030000
+RDATE:19230916T030000
+RDATE:19240921T030000
+RDATE:19251004T030000
+RDATE:19261003T030000
+RDATE:19271002T030000
+RDATE:19281007T030000
+RDATE:19291006T030000
+RDATE:19301005T030000
+RDATE:19311004T030000
+RDATE:19321002T030000
+RDATE:19331008T030000
+RDATE:19341007T030000
+RDATE:19351006T030000
+RDATE:19361004T030000
+RDATE:19371003T030000
+RDATE:19381002T030000
+RDATE:19391119T030000
+RDATE:19451007T030000
+RDATE:19461006T030000
+RDATE:19471102T030000
+RDATE:19481031T030000
+RDATE:19491030T030000
+RDATE:19501022T030000
+RDATE:19511021T030000
+RDATE:19521026T030000
+RDATE:19531004T030000
+RDATE:19541003T030000
+RDATE:19551002T030000
+RDATE:19561007T030000
+RDATE:19571006T030000
+RDATE:19581005T030000
+RDATE:19591004T030000
+RDATE:19601002T030000
+RDATE:19611029T030000
+RDATE:19621028T030000
+RDATE:19631027T030000
+RDATE:19641025T030000
+RDATE:19651024T030000
+RDATE:19661023T030000
+RDATE:19671029T030000
+RDATE:19711031T030000
+RDATE:19721029T030000
+RDATE:19731028T030000
+RDATE:19741027T030000
+RDATE:19751026T030000
+RDATE:19761024T030000
+RDATE:19771023T030000
+RDATE:19781029T030000
+RDATE:19791028T030000
+RDATE:19801026T030000
+RDATE:19811025T020000
+RDATE:19821024T020000
+RDATE:19831023T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881023T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931024T020000
+RDATE:19941023T020000
+RDATE:19951022T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:BDST
+DTSTART:19410504T020000
+RDATE:19410504T020000
+RDATE:19420405T020000
+RDATE:19430404T020000
+RDATE:19440402T020000
+RDATE:19450402T020000
+RDATE:19470413T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:BST
+DTSTART:19410810T030000
+RDATE:19410810T030000
+RDATE:19420809T030000
+RDATE:19430815T030000
+RDATE:19440917T030000
+RDATE:19450715T030000
+RDATE:19470810T030000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:BST
+DTSTART:19681027T000000
+RDATE:19681027T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19960101T000000
+RDATE:19960101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Istanbul.ics b/libkcal/libical/zoneinfo/Europe/Istanbul.ics
new file mode 100644
index 00000000..f5db8665
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Istanbul.ics
@@ -0,0 +1,187 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Istanbul
+X-LIC-LOCATION:Europe/Istanbul
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:20070325T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:20071028T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+015552
+TZOFFSETTO:+015656
+TZNAME:IMT
+DTSTART:18800101T000000
+RDATE:18800101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+015656
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19101001T000000
+RDATE:19101001T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19160501T000000
+RDATE:19160501T000000
+RDATE:19200328T000000
+RDATE:19210403T000000
+RDATE:19220326T000000
+RDATE:19240513T000000
+RDATE:19250501T000000
+RDATE:19400630T000000
+RDATE:19401201T000000
+RDATE:19420401T000000
+RDATE:19450402T000000
+RDATE:19460601T000000
+RDATE:19470420T000000
+RDATE:19480418T000000
+RDATE:19490410T000000
+RDATE:19500419T000000
+RDATE:19510422T000000
+RDATE:19620715T000000
+RDATE:19640515T000000
+RDATE:19700503T000000
+RDATE:19710502T000000
+RDATE:19720507T000000
+RDATE:19730603T010000
+RDATE:19740331T020000
+RDATE:19750330T000000
+RDATE:19760601T000000
+RDATE:19770403T000000
+RDATE:19780402T000000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+RDATE:19910331T010000
+RDATE:19920329T010000
+RDATE:19930328T010000
+RDATE:19940327T010000
+RDATE:19950326T010000
+RDATE:19960331T010000
+RDATE:19970330T010000
+RDATE:19980329T010000
+RDATE:19990328T010000
+RDATE:20000326T010000
+RDATE:20010325T010000
+RDATE:20020331T010000
+RDATE:20030330T010000
+RDATE:20040328T010000
+RDATE:20050327T010000
+RDATE:20060326T010000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19161001T000000
+RDATE:19161001T000000
+RDATE:19201025T000000
+RDATE:19211003T000000
+RDATE:19221008T000000
+RDATE:19241001T000000
+RDATE:19251001T000000
+RDATE:19401005T000000
+RDATE:19410921T000000
+RDATE:19421101T000000
+RDATE:19451008T000000
+RDATE:19461001T000000
+RDATE:19471005T000000
+RDATE:19481003T000000
+RDATE:19491002T000000
+RDATE:19501008T000000
+RDATE:19511008T000000
+RDATE:19621008T000000
+RDATE:19641001T000000
+RDATE:19701004T000000
+RDATE:19711003T000000
+RDATE:19721008T000000
+RDATE:19731104T030000
+RDATE:19741103T050000
+RDATE:19751026T000000
+RDATE:19761031T000000
+RDATE:19771016T000000
+RDATE:19850928T000000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T020000
+RDATE:19920927T020000
+RDATE:19930926T020000
+RDATE:19940925T020000
+RDATE:19950924T020000
+RDATE:19961027T020000
+RDATE:19971026T020000
+RDATE:19981025T020000
+RDATE:19991031T020000
+RDATE:20001029T020000
+RDATE:20011028T020000
+RDATE:20021027T020000
+RDATE:20031026T020000
+RDATE:20041031T020000
+RDATE:20051030T020000
+RDATE:20061029T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:TRST
+DTSTART:19781015T000000
+RDATE:19781015T000000
+RDATE:19800406T030000
+RDATE:19810329T030000
+RDATE:19820328T030000
+RDATE:19830731T000000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0400
+TZNAME:TRST
+DTSTART:19790401T030000
+RDATE:19790401T030000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0300
+TZNAME:TRT
+DTSTART:19791015T000000
+RDATE:19791015T000000
+RDATE:19801013T000000
+RDATE:19811012T000000
+RDATE:19821011T000000
+RDATE:19831002T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19850420T000000
+RDATE:19850420T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:20070101T000000
+RDATE:20070101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Jersey.ics b/libkcal/libical/zoneinfo/Europe/Jersey.ics
new file mode 100644
index 00000000..7c11f794
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Jersey.ics
@@ -0,0 +1,208 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Jersey
+X-LIC-LOCATION:Europe/Jersey
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:BST
+DTSTART:19810329T010000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19961027T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-000115
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:18471201T000000
+RDATE:18471201T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:BST
+DTSTART:19160521T020000
+RDATE:19160521T020000
+RDATE:19170408T020000
+RDATE:19180324T020000
+RDATE:19190330T020000
+RDATE:19200328T020000
+RDATE:19210403T020000
+RDATE:19220326T020000
+RDATE:19230422T020000
+RDATE:19240413T020000
+RDATE:19250419T020000
+RDATE:19260418T020000
+RDATE:19270410T020000
+RDATE:19280422T020000
+RDATE:19290421T020000
+RDATE:19300413T020000
+RDATE:19310419T020000
+RDATE:19320417T020000
+RDATE:19330409T020000
+RDATE:19340422T020000
+RDATE:19350414T020000
+RDATE:19360419T020000
+RDATE:19370418T020000
+RDATE:19380410T020000
+RDATE:19390416T020000
+RDATE:19400225T020000
+RDATE:19460414T020000
+RDATE:19470316T020000
+RDATE:19480314T020000
+RDATE:19490403T020000
+RDATE:19500416T020000
+RDATE:19510415T020000
+RDATE:19520420T020000
+RDATE:19530419T020000
+RDATE:19540411T020000
+RDATE:19550417T020000
+RDATE:19560422T020000
+RDATE:19570414T020000
+RDATE:19580420T020000
+RDATE:19590419T020000
+RDATE:19600410T020000
+RDATE:19610326T020000
+RDATE:19620325T020000
+RDATE:19630331T020000
+RDATE:19640322T020000
+RDATE:19650321T020000
+RDATE:19660320T020000
+RDATE:19670319T020000
+RDATE:19680218T020000
+RDATE:19720319T020000
+RDATE:19730318T020000
+RDATE:19740317T020000
+RDATE:19750316T020000
+RDATE:19760321T020000
+RDATE:19770320T020000
+RDATE:19780319T020000
+RDATE:19790318T020000
+RDATE:19800316T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19161001T030000
+RDATE:19161001T030000
+RDATE:19170917T030000
+RDATE:19180930T030000
+RDATE:19190929T030000
+RDATE:19201025T030000
+RDATE:19211003T030000
+RDATE:19221008T030000
+RDATE:19230916T030000
+RDATE:19240921T030000
+RDATE:19251004T030000
+RDATE:19261003T030000
+RDATE:19271002T030000
+RDATE:19281007T030000
+RDATE:19291006T030000
+RDATE:19301005T030000
+RDATE:19311004T030000
+RDATE:19321002T030000
+RDATE:19331008T030000
+RDATE:19341007T030000
+RDATE:19351006T030000
+RDATE:19361004T030000
+RDATE:19371003T030000
+RDATE:19381002T030000
+RDATE:19391119T030000
+RDATE:19451007T030000
+RDATE:19461006T030000
+RDATE:19471102T030000
+RDATE:19481031T030000
+RDATE:19491030T030000
+RDATE:19501022T030000
+RDATE:19511021T030000
+RDATE:19521026T030000
+RDATE:19531004T030000
+RDATE:19541003T030000
+RDATE:19551002T030000
+RDATE:19561007T030000
+RDATE:19571006T030000
+RDATE:19581005T030000
+RDATE:19591004T030000
+RDATE:19601002T030000
+RDATE:19611029T030000
+RDATE:19621028T030000
+RDATE:19631027T030000
+RDATE:19641025T030000
+RDATE:19651024T030000
+RDATE:19661023T030000
+RDATE:19671029T030000
+RDATE:19711031T030000
+RDATE:19721029T030000
+RDATE:19731028T030000
+RDATE:19741027T030000
+RDATE:19751026T030000
+RDATE:19761024T030000
+RDATE:19771023T030000
+RDATE:19781029T030000
+RDATE:19791028T030000
+RDATE:19801026T030000
+RDATE:19811025T020000
+RDATE:19821024T020000
+RDATE:19831023T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881023T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931024T020000
+RDATE:19941023T020000
+RDATE:19951022T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:BDST
+DTSTART:19410504T020000
+RDATE:19410504T020000
+RDATE:19420405T020000
+RDATE:19430404T020000
+RDATE:19440402T020000
+RDATE:19450402T020000
+RDATE:19470413T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:BST
+DTSTART:19410810T030000
+RDATE:19410810T030000
+RDATE:19420809T030000
+RDATE:19430815T030000
+RDATE:19440917T030000
+RDATE:19450715T030000
+RDATE:19470810T030000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:BST
+DTSTART:19681027T000000
+RDATE:19681027T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19960101T000000
+RDATE:19960101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Kaliningrad.ics b/libkcal/libical/zoneinfo/Europe/Kaliningrad.ics
new file mode 100644
index 00000000..a9db994a
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Kaliningrad.ics
@@ -0,0 +1,138 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Kaliningrad
+X-LIC-LOCATION:Europe/Kaliningrad
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19930328T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0122
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:18930401T000000
+RDATE:18930401T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19160430T230000
+RDATE:19160430T230000
+RDATE:19170416T020000
+RDATE:19180415T020000
+RDATE:19400401T020000
+RDATE:19430329T020000
+RDATE:19440403T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19161001T010000
+RDATE:19161001T010000
+RDATE:19170917T030000
+RDATE:19180916T030000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19441002T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CET
+DTSTART:19450101T000000
+RDATE:19450101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:CEST
+DTSTART:19450429T000000
+RDATE:19450429T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:CET
+DTSTART:19451101T000000
+RDATE:19451101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19460101T000000
+RDATE:19460101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:MSD
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19910331T020000
+RDATE:19910331T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19910929T030000
+RDATE:19910929T030000
+RDATE:19920926T230000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19920328T230000
+RDATE:19920328T230000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Kiev.ics b/libkcal/libical/zoneinfo/Europe/Kiev.ics
new file mode 100644
index 00000000..5c85fca6
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Kiev.ics
@@ -0,0 +1,137 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Kiev
+X-LIC-LOCATION:Europe/Kiev
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19950326T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19961027T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+020204
+TZOFFSETTO:+020204
+TZNAME:KMT
+DTSTART:18800101T000000
+RDATE:18800101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+020204
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19240502T000000
+RDATE:19240502T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19300621T000000
+RDATE:19300621T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19410920T000000
+RDATE:19410920T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19421102T030000
+RDATE:19421102T030000
+RDATE:19431004T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19430329T020000
+RDATE:19430329T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19431106T000000
+RDATE:19431106T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:MSD
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19900101T000000
+RDATE:19900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19900701T020000
+RDATE:19900701T020000
+RDATE:19920927T000000
+RDATE:19930926T000000
+RDATE:19940925T000000
+RDATE:19950924T040000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19920101T000000
+RDATE:19920101T000000
+RDATE:19950101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19920329T000000
+RDATE:19920329T000000
+RDATE:19930328T000000
+RDATE:19940327T000000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Lisbon.ics b/libkcal/libical/zoneinfo/Europe/Lisbon.ics
new file mode 100644
index 00000000..e957eb6d
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Lisbon.ics
@@ -0,0 +1,227 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Lisbon
+X-LIC-LOCATION:Europe/Lisbon
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19961027T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:WEST
+DTSTART:19970330T010000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-003632
+TZOFFSETTO:-003632
+TZNAME:LMT
+DTSTART:18840101T000000
+RDATE:18840101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-003632
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19120101T000000
+RDATE:19120101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:WEST
+DTSTART:19160617T230000
+RDATE:19160617T230000
+RDATE:19170228T230000
+RDATE:19180301T230000
+RDATE:19190228T230000
+RDATE:19200229T230000
+RDATE:19210228T230000
+RDATE:19240416T230000
+RDATE:19260417T230000
+RDATE:19270409T230000
+RDATE:19280414T230000
+RDATE:19290420T230000
+RDATE:19310418T230000
+RDATE:19320402T230000
+RDATE:19340407T230000
+RDATE:19350330T230000
+RDATE:19360418T230000
+RDATE:19370403T230000
+RDATE:19380326T230000
+RDATE:19390415T230000
+RDATE:19400224T230000
+RDATE:19410405T230000
+RDATE:19420314T230000
+RDATE:19430313T230000
+RDATE:19440311T230000
+RDATE:19450310T230000
+RDATE:19460406T230000
+RDATE:19470406T020000
+RDATE:19480404T020000
+RDATE:19490403T020000
+RDATE:19510401T020000
+RDATE:19520406T020000
+RDATE:19530405T020000
+RDATE:19540404T020000
+RDATE:19550403T020000
+RDATE:19560401T020000
+RDATE:19570407T020000
+RDATE:19580406T020000
+RDATE:19590405T020000
+RDATE:19600403T020000
+RDATE:19610402T020000
+RDATE:19620401T020000
+RDATE:19630407T020000
+RDATE:19640405T020000
+RDATE:19650404T020000
+RDATE:19770327T000000
+RDATE:19780402T000000
+RDATE:19790401T000000
+RDATE:19800330T000000
+RDATE:19810329T010000
+RDATE:19820328T010000
+RDATE:19830327T020000
+RDATE:19840325T010000
+RDATE:19850331T010000
+RDATE:19860330T010000
+RDATE:19870329T010000
+RDATE:19880327T010000
+RDATE:19890326T010000
+RDATE:19900325T010000
+RDATE:19910331T010000
+RDATE:19920329T010000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19161101T010000
+RDATE:19161101T010000
+RDATE:19171015T000000
+RDATE:19181015T000000
+RDATE:19191015T000000
+RDATE:19201015T000000
+RDATE:19211015T000000
+RDATE:19241015T000000
+RDATE:19261003T000000
+RDATE:19271002T000000
+RDATE:19281007T000000
+RDATE:19291006T000000
+RDATE:19311004T000000
+RDATE:19321002T000000
+RDATE:19341007T000000
+RDATE:19351006T000000
+RDATE:19361004T000000
+RDATE:19371003T000000
+RDATE:19381002T000000
+RDATE:19391119T000000
+RDATE:19401006T000000
+RDATE:19411006T000000
+RDATE:19421025T000000
+RDATE:19431031T000000
+RDATE:19441029T000000
+RDATE:19451028T000000
+RDATE:19461006T000000
+RDATE:19471005T030000
+RDATE:19481003T030000
+RDATE:19491002T030000
+RDATE:19511007T030000
+RDATE:19521005T030000
+RDATE:19531004T030000
+RDATE:19541003T030000
+RDATE:19551002T030000
+RDATE:19561007T030000
+RDATE:19571006T030000
+RDATE:19581005T030000
+RDATE:19591004T030000
+RDATE:19601002T030000
+RDATE:19611001T030000
+RDATE:19621007T030000
+RDATE:19631006T030000
+RDATE:19641004T030000
+RDATE:19651003T030000
+RDATE:19760926T010000
+RDATE:19770925T010000
+RDATE:19781001T010000
+RDATE:19790930T020000
+RDATE:19800928T020000
+RDATE:19810927T020000
+RDATE:19820926T020000
+RDATE:19830925T020000
+RDATE:19840930T020000
+RDATE:19850929T020000
+RDATE:19860928T020000
+RDATE:19870927T020000
+RDATE:19880925T020000
+RDATE:19890924T020000
+RDATE:19900930T020000
+RDATE:19910929T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:WEMT
+DTSTART:19420425T230000
+RDATE:19420425T230000
+RDATE:19430417T230000
+RDATE:19440422T230000
+RDATE:19450421T230000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:WEST
+DTSTART:19420816T000000
+RDATE:19420816T000000
+RDATE:19430829T000000
+RDATE:19440827T000000
+RDATE:19450826T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19660403T020000
+RDATE:19660403T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19920927T020000
+RDATE:19920927T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19930328T020000
+RDATE:19930328T020000
+RDATE:19940327T020000
+RDATE:19950326T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19930926T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:WEST
+DTSTART:19960331T020000
+RDATE:19960331T020000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Ljubljana.ics b/libkcal/libical/zoneinfo/Europe/Ljubljana.ics
new file mode 100644
index 00000000..61e267e1
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Ljubljana.ics
@@ -0,0 +1,69 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Ljubljana
+X-LIC-LOCATION:Europe/Ljubljana
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19830327T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0122
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:18840101T000000
+RDATE:18840101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19410418T230000
+RDATE:19410418T230000
+RDATE:19430329T020000
+RDATE:19440403T020000
+RDATE:19450508T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19421102T030000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19441002T030000
+RDATE:19450916T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19821127T000000
+RDATE:19821127T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/London.ics b/libkcal/libical/zoneinfo/Europe/London.ics
new file mode 100644
index 00000000..56bca0cf
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/London.ics
@@ -0,0 +1,208 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/London
+X-LIC-LOCATION:Europe/London
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:BST
+DTSTART:19810329T010000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19961027T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-000115
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:18471201T000000
+RDATE:18471201T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:BST
+DTSTART:19160521T020000
+RDATE:19160521T020000
+RDATE:19170408T020000
+RDATE:19180324T020000
+RDATE:19190330T020000
+RDATE:19200328T020000
+RDATE:19210403T020000
+RDATE:19220326T020000
+RDATE:19230422T020000
+RDATE:19240413T020000
+RDATE:19250419T020000
+RDATE:19260418T020000
+RDATE:19270410T020000
+RDATE:19280422T020000
+RDATE:19290421T020000
+RDATE:19300413T020000
+RDATE:19310419T020000
+RDATE:19320417T020000
+RDATE:19330409T020000
+RDATE:19340422T020000
+RDATE:19350414T020000
+RDATE:19360419T020000
+RDATE:19370418T020000
+RDATE:19380410T020000
+RDATE:19390416T020000
+RDATE:19400225T020000
+RDATE:19460414T020000
+RDATE:19470316T020000
+RDATE:19480314T020000
+RDATE:19490403T020000
+RDATE:19500416T020000
+RDATE:19510415T020000
+RDATE:19520420T020000
+RDATE:19530419T020000
+RDATE:19540411T020000
+RDATE:19550417T020000
+RDATE:19560422T020000
+RDATE:19570414T020000
+RDATE:19580420T020000
+RDATE:19590419T020000
+RDATE:19600410T020000
+RDATE:19610326T020000
+RDATE:19620325T020000
+RDATE:19630331T020000
+RDATE:19640322T020000
+RDATE:19650321T020000
+RDATE:19660320T020000
+RDATE:19670319T020000
+RDATE:19680218T020000
+RDATE:19720319T020000
+RDATE:19730318T020000
+RDATE:19740317T020000
+RDATE:19750316T020000
+RDATE:19760321T020000
+RDATE:19770320T020000
+RDATE:19780319T020000
+RDATE:19790318T020000
+RDATE:19800316T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19161001T030000
+RDATE:19161001T030000
+RDATE:19170917T030000
+RDATE:19180930T030000
+RDATE:19190929T030000
+RDATE:19201025T030000
+RDATE:19211003T030000
+RDATE:19221008T030000
+RDATE:19230916T030000
+RDATE:19240921T030000
+RDATE:19251004T030000
+RDATE:19261003T030000
+RDATE:19271002T030000
+RDATE:19281007T030000
+RDATE:19291006T030000
+RDATE:19301005T030000
+RDATE:19311004T030000
+RDATE:19321002T030000
+RDATE:19331008T030000
+RDATE:19341007T030000
+RDATE:19351006T030000
+RDATE:19361004T030000
+RDATE:19371003T030000
+RDATE:19381002T030000
+RDATE:19391119T030000
+RDATE:19451007T030000
+RDATE:19461006T030000
+RDATE:19471102T030000
+RDATE:19481031T030000
+RDATE:19491030T030000
+RDATE:19501022T030000
+RDATE:19511021T030000
+RDATE:19521026T030000
+RDATE:19531004T030000
+RDATE:19541003T030000
+RDATE:19551002T030000
+RDATE:19561007T030000
+RDATE:19571006T030000
+RDATE:19581005T030000
+RDATE:19591004T030000
+RDATE:19601002T030000
+RDATE:19611029T030000
+RDATE:19621028T030000
+RDATE:19631027T030000
+RDATE:19641025T030000
+RDATE:19651024T030000
+RDATE:19661023T030000
+RDATE:19671029T030000
+RDATE:19711031T030000
+RDATE:19721029T030000
+RDATE:19731028T030000
+RDATE:19741027T030000
+RDATE:19751026T030000
+RDATE:19761024T030000
+RDATE:19771023T030000
+RDATE:19781029T030000
+RDATE:19791028T030000
+RDATE:19801026T030000
+RDATE:19811025T020000
+RDATE:19821024T020000
+RDATE:19831023T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881023T020000
+RDATE:19891029T020000
+RDATE:19901028T020000
+RDATE:19911027T020000
+RDATE:19921025T020000
+RDATE:19931024T020000
+RDATE:19941023T020000
+RDATE:19951022T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:BDST
+DTSTART:19410504T020000
+RDATE:19410504T020000
+RDATE:19420405T020000
+RDATE:19430404T020000
+RDATE:19440402T020000
+RDATE:19450402T020000
+RDATE:19470413T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:BST
+DTSTART:19410810T030000
+RDATE:19410810T030000
+RDATE:19420809T030000
+RDATE:19430815T030000
+RDATE:19440917T030000
+RDATE:19450715T030000
+RDATE:19470810T030000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:BST
+DTSTART:19681027T000000
+RDATE:19681027T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19960101T000000
+RDATE:19960101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Luxembourg.ics b/libkcal/libical/zoneinfo/Europe/Luxembourg.ics
new file mode 100644
index 00000000..35405628
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Luxembourg.ics
@@ -0,0 +1,155 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Luxembourg
+X-LIC-LOCATION:Europe/Luxembourg
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19810329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+002436
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19040601T000000
+RDATE:19040601T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19160514T230000
+RDATE:19160514T230000
+RDATE:19170428T230000
+RDATE:19180415T020000
+RDATE:19450402T020000
+RDATE:19460519T020000
+RDATE:19770403T020000
+RDATE:19780402T020000
+RDATE:19790401T020000
+RDATE:19800406T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19161001T010000
+RDATE:19161001T010000
+RDATE:19170917T010000
+RDATE:19180916T030000
+RDATE:19440918T030000
+RDATE:19450916T030000
+RDATE:19461007T030000
+RDATE:19770925T030000
+RDATE:19781001T030000
+RDATE:19790930T030000
+RDATE:19800928T030000
+RDATE:19810927T030000
+RDATE:19820926T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19181125T000000
+RDATE:19181125T000000
+RDATE:19191005T030000
+RDATE:19201024T020000
+RDATE:19211026T020000
+RDATE:19221008T010000
+RDATE:19231007T020000
+RDATE:19241005T010000
+RDATE:19251004T010000
+RDATE:19261003T010000
+RDATE:19271002T010000
+RDATE:19281007T010000
+RDATE:19291006T030000
+RDATE:19301005T030000
+RDATE:19311004T030000
+RDATE:19321002T030000
+RDATE:19331008T030000
+RDATE:19341007T030000
+RDATE:19351006T030000
+RDATE:19361004T030000
+RDATE:19371003T030000
+RDATE:19381002T030000
+RDATE:19391119T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:WEST
+DTSTART:19190301T230000
+RDATE:19190301T230000
+RDATE:19200214T230000
+RDATE:19210314T230000
+RDATE:19220325T230000
+RDATE:19230421T230000
+RDATE:19240329T230000
+RDATE:19250405T230000
+RDATE:19260417T230000
+RDATE:19270409T230000
+RDATE:19280414T230000
+RDATE:19290420T230000
+RDATE:19300413T020000
+RDATE:19310419T020000
+RDATE:19320403T020000
+RDATE:19330326T020000
+RDATE:19340408T020000
+RDATE:19350331T020000
+RDATE:19360419T020000
+RDATE:19370404T020000
+RDATE:19380327T020000
+RDATE:19390416T020000
+RDATE:19400225T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:WEST
+DTSTART:19400514T030000
+RDATE:19400514T030000
+RDATE:19430329T020000
+RDATE:19440403T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:WET
+DTSTART:19421102T030000
+RDATE:19421102T030000
+RDATE:19431004T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19770101T000000
+RDATE:19770101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Madrid.ics b/libkcal/libical/zoneinfo/Europe/Madrid.ics
new file mode 100644
index 00000000..82125070
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Madrid.ics
@@ -0,0 +1,136 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Madrid
+X-LIC-LOCATION:Europe/Madrid
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19810329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-001444
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19010101T000000
+RDATE:19010101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:WEST
+DTSTART:19170505T230000
+RDATE:19170505T230000
+RDATE:19180415T230000
+RDATE:19190405T230000
+RDATE:19240416T230000
+RDATE:19260417T230000
+RDATE:19270409T230000
+RDATE:19280414T230000
+RDATE:19290420T230000
+RDATE:19370522T230000
+RDATE:19380322T230000
+RDATE:19390415T230000
+RDATE:19400316T230000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19171007T000000
+RDATE:19171007T000000
+RDATE:19181007T000000
+RDATE:19191007T000000
+RDATE:19241005T000000
+RDATE:19261003T000000
+RDATE:19271002T000000
+RDATE:19281007T000000
+RDATE:19291006T000000
+RDATE:19371003T000000
+RDATE:19381002T000000
+RDATE:19391008T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:WEMT
+DTSTART:19420502T230000
+RDATE:19420502T230000
+RDATE:19430417T230000
+RDATE:19440415T230000
+RDATE:19450414T230000
+RDATE:19460413T230000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:WEST
+DTSTART:19420902T000000
+RDATE:19420902T000000
+RDATE:19431004T000000
+RDATE:19441011T000000
+RDATE:19450930T010000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19460930T000000
+RDATE:19460930T000000
+RDATE:19490930T010000
+RDATE:19741006T010000
+RDATE:19751005T010000
+RDATE:19760926T010000
+RDATE:19770925T010000
+RDATE:19781001T010000
+RDATE:19790930T030000
+RDATE:19800928T030000
+RDATE:19810927T030000
+RDATE:19820926T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19490430T230000
+RDATE:19490430T230000
+RDATE:19740413T230000
+RDATE:19750419T230000
+RDATE:19760327T230000
+RDATE:19770402T230000
+RDATE:19780402T230000
+RDATE:19790401T020000
+RDATE:19800406T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19790101T000000
+RDATE:19790101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Malta.ics b/libkcal/libical/zoneinfo/Europe/Malta.ics
new file mode 100644
index 00000000..14a292a6
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Malta.ics
@@ -0,0 +1,117 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Malta
+X-LIC-LOCATION:Europe/Malta
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19810329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+005804
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:18931102T000000
+RDATE:18931102T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19160603T000000
+RDATE:19160603T000000
+RDATE:19170401T000000
+RDATE:19180310T000000
+RDATE:19190302T000000
+RDATE:19200321T000000
+RDATE:19400615T000000
+RDATE:19430329T020000
+RDATE:19440403T020000
+RDATE:19450402T020000
+RDATE:19460317T020000
+RDATE:19470316T000000
+RDATE:19480229T020000
+RDATE:19660522T000000
+RDATE:19670528T000000
+RDATE:19680526T000000
+RDATE:19690601T000000
+RDATE:19700531T000000
+RDATE:19710523T000000
+RDATE:19720528T000000
+RDATE:19730331T000000
+RDATE:19740421T000000
+RDATE:19750420T020000
+RDATE:19760418T020000
+RDATE:19770417T020000
+RDATE:19780416T020000
+RDATE:19790415T020000
+RDATE:19800331T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19161001T010000
+RDATE:19161001T010000
+RDATE:19170930T010000
+RDATE:19181006T010000
+RDATE:19191005T010000
+RDATE:19200919T010000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19441002T030000
+RDATE:19450915T010000
+RDATE:19461006T030000
+RDATE:19471005T010000
+RDATE:19481003T030000
+RDATE:19660925T000000
+RDATE:19670924T000000
+RDATE:19680922T000000
+RDATE:19690928T000000
+RDATE:19700927T000000
+RDATE:19710926T010000
+RDATE:19721001T000000
+RDATE:19730929T010000
+RDATE:19740916T010000
+RDATE:19750921T020000
+RDATE:19760919T020000
+RDATE:19770918T020000
+RDATE:19780917T020000
+RDATE:19790916T020000
+RDATE:19800921T020000
+RDATE:19810927T030000
+RDATE:19820926T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19810101T000000
+RDATE:19810101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Mariehamn.ics b/libkcal/libical/zoneinfo/Europe/Mariehamn.ics
new file mode 100644
index 00000000..9b2b31a3
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Mariehamn.ics
@@ -0,0 +1,72 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Mariehamn
+X-LIC-LOCATION:Europe/Mariehamn
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19810329T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19961027T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+013952
+TZOFFSETTO:+013952
+TZNAME:HMT
+DTSTART:18780531T000000
+RDATE:18780531T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+013952
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19210501T000000
+RDATE:19210501T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19420403T000000
+RDATE:19420403T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19421003T000000
+RDATE:19421003T000000
+RDATE:19810927T040000
+RDATE:19820926T040000
+RDATE:19830925T040000
+RDATE:19840930T040000
+RDATE:19850929T040000
+RDATE:19860928T040000
+RDATE:19870927T040000
+RDATE:19880925T040000
+RDATE:19890924T040000
+RDATE:19900930T040000
+RDATE:19910929T040000
+RDATE:19920927T040000
+RDATE:19930926T040000
+RDATE:19940925T040000
+RDATE:19950924T040000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19810329T020000
+RDATE:19810329T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Minsk.ics b/libkcal/libical/zoneinfo/Europe/Minsk.ics
new file mode 100644
index 00000000..8039f595
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Minsk.ics
@@ -0,0 +1,129 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Minsk
+X-LIC-LOCATION:Europe/Minsk
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19930328T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+015016
+TZOFFSETTO:+0150
+TZNAME:MMT
+DTSTART:18800101T000000
+RDATE:18800101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0150
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19240502T000000
+RDATE:19240502T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19300621T000000
+RDATE:19300621T000000
+RDATE:19440703T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19410628T000000
+RDATE:19410628T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19421102T030000
+RDATE:19421102T030000
+RDATE:19431004T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19430329T020000
+RDATE:19430329T020000
+RDATE:19440403T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:MSD
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19900101T000000
+RDATE:19900101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19910331T020000
+RDATE:19910331T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19910929T030000
+RDATE:19910929T030000
+RDATE:19920927T010000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19920329T000000
+RDATE:19920329T000000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Monaco.ics b/libkcal/libical/zoneinfo/Europe/Monaco.ics
new file mode 100644
index 00000000..d7aedb7d
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Monaco.ics
@@ -0,0 +1,163 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Monaco
+X-LIC-LOCATION:Europe/Monaco
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19810329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+002932
+TZOFFSETTO:+000921
+TZNAME:PMT
+DTSTART:18910315T000000
+RDATE:18910315T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+000921
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19110311T000000
+RDATE:19110311T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:WEST
+DTSTART:19160614T230000
+RDATE:19160614T230000
+RDATE:19170324T230000
+RDATE:19180309T230000
+RDATE:19190301T230000
+RDATE:19200214T230000
+RDATE:19210314T230000
+RDATE:19220325T230000
+RDATE:19230526T230000
+RDATE:19240329T230000
+RDATE:19250404T230000
+RDATE:19260417T230000
+RDATE:19270409T230000
+RDATE:19280414T230000
+RDATE:19290420T230000
+RDATE:19300412T230000
+RDATE:19310418T230000
+RDATE:19320402T230000
+RDATE:19330325T230000
+RDATE:19340407T230000
+RDATE:19350330T230000
+RDATE:19360418T230000
+RDATE:19370403T230000
+RDATE:19380326T230000
+RDATE:19390415T230000
+RDATE:19400225T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19161002T000000
+RDATE:19161002T000000
+RDATE:19171008T000000
+RDATE:19181007T000000
+RDATE:19191006T000000
+RDATE:19201024T000000
+RDATE:19211026T000000
+RDATE:19221008T000000
+RDATE:19231007T000000
+RDATE:19241005T000000
+RDATE:19251004T000000
+RDATE:19261003T000000
+RDATE:19271002T000000
+RDATE:19281007T000000
+RDATE:19291006T000000
+RDATE:19301005T000000
+RDATE:19311004T000000
+RDATE:19321002T000000
+RDATE:19331008T000000
+RDATE:19341007T000000
+RDATE:19351006T000000
+RDATE:19361004T000000
+RDATE:19371003T000000
+RDATE:19381002T000000
+RDATE:19391119T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:WEMT
+DTSTART:19410505T000000
+RDATE:19410505T000000
+RDATE:19420309T000000
+RDATE:19430329T020000
+RDATE:19440403T020000
+RDATE:19450402T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:WEST
+DTSTART:19411006T000000
+RDATE:19411006T000000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19441008T010000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19450916T030000
+RDATE:19450916T030000
+RDATE:19760926T010000
+RDATE:19770925T030000
+RDATE:19781001T030000
+RDATE:19790930T030000
+RDATE:19800928T030000
+RDATE:19810927T030000
+RDATE:19820926T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19760328T010000
+RDATE:19760328T010000
+RDATE:19770403T020000
+RDATE:19780402T020000
+RDATE:19790401T020000
+RDATE:19800406T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19770101T000000
+RDATE:19770101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Moscow.ics b/libkcal/libical/zoneinfo/Europe/Moscow.ics
new file mode 100644
index 00000000..59f01771
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Moscow.ics
@@ -0,0 +1,155 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Moscow
+X-LIC-LOCATION:Europe/Moscow
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:MSD
+DTSTART:19930328T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+023020
+TZOFFSETTO:+0230
+TZNAME:MMT
+DTSTART:18800101T000000
+RDATE:18800101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0230
+TZOFFSETTO:+023048
+TZNAME:MMT
+DTSTART:19160703T000000
+RDATE:19160703T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+023048
+TZOFFSETTO:+033048
+TZNAME:MST
+DTSTART:19170701T230000
+RDATE:19170701T230000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+033048
+TZOFFSETTO:+023048
+TZNAME:MMT
+DTSTART:19171228T000000
+RDATE:19171228T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+023048
+TZOFFSETTO:+043048
+TZNAME:MDST
+DTSTART:19180531T220000
+RDATE:19180531T220000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+043048
+TZOFFSETTO:+033048
+TZNAME:MST
+DTSTART:19180916T010000
+RDATE:19180916T010000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+033048
+TZOFFSETTO:+043048
+TZNAME:MDST
+DTSTART:19190531T230000
+RDATE:19190531T230000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+043048
+TZOFFSETTO:+0400
+TZNAME:MSD
+DTSTART:19190701T020000
+RDATE:19190701T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19190816T000000
+RDATE:19190816T000000
+RDATE:19211001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19920926T230000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:MSD
+DTSTART:19210214T230000
+RDATE:19210214T230000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+RDATE:19920328T230000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:MSD
+DTSTART:19210320T230000
+RDATE:19210320T230000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0400
+TZNAME:MSD
+DTSTART:19210901T000000
+RDATE:19210901T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19221001T000000
+RDATE:19221001T000000
+RDATE:19910929T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19300621T000000
+RDATE:19300621T000000
+RDATE:19920119T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19910331T020000
+RDATE:19910331T020000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Nicosia.ics b/libkcal/libical/zoneinfo/Europe/Nicosia.ics
new file mode 100644
index 00000000..d3302576
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Nicosia.ics
@@ -0,0 +1,95 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Nicosia
+X-LIC-LOCATION:Europe/Nicosia
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19981025T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19990328T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+021328
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19211114T000000
+RDATE:19211114T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19750413T000000
+RDATE:19750413T000000
+RDATE:19760515T000000
+RDATE:19770403T000000
+RDATE:19780402T000000
+RDATE:19790401T000000
+RDATE:19800406T000000
+RDATE:19810329T000000
+RDATE:19820328T000000
+RDATE:19830327T000000
+RDATE:19840325T000000
+RDATE:19850331T000000
+RDATE:19860330T000000
+RDATE:19870329T000000
+RDATE:19880327T000000
+RDATE:19890326T000000
+RDATE:19900325T000000
+RDATE:19910331T000000
+RDATE:19920329T000000
+RDATE:19930328T000000
+RDATE:19940327T000000
+RDATE:19950326T000000
+RDATE:19960331T000000
+RDATE:19970330T000000
+RDATE:19980329T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19751012T000000
+RDATE:19751012T000000
+RDATE:19761011T000000
+RDATE:19770925T000000
+RDATE:19781002T000000
+RDATE:19790930T000000
+RDATE:19800928T000000
+RDATE:19810927T000000
+RDATE:19820926T000000
+RDATE:19830925T000000
+RDATE:19840930T000000
+RDATE:19850929T000000
+RDATE:19860928T000000
+RDATE:19870927T000000
+RDATE:19880925T000000
+RDATE:19890924T000000
+RDATE:19900930T000000
+RDATE:19910929T000000
+RDATE:19920927T000000
+RDATE:19930926T000000
+RDATE:19940925T000000
+RDATE:19950924T000000
+RDATE:19960929T000000
+RDATE:19970928T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19980901T000000
+RDATE:19980901T000000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Oslo.ics b/libkcal/libical/zoneinfo/Europe/Oslo.ics
new file mode 100644
index 00000000..38b5fc85
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Oslo.ics
@@ -0,0 +1,89 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Oslo
+X-LIC-LOCATION:Europe/Oslo
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19810329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0043
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:18950101T000000
+RDATE:18950101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19160522T010000
+RDATE:19160522T010000
+RDATE:19400810T230000
+RDATE:19430329T020000
+RDATE:19440403T020000
+RDATE:19450402T020000
+RDATE:19590315T020000
+RDATE:19600320T020000
+RDATE:19610319T020000
+RDATE:19620318T020000
+RDATE:19630317T020000
+RDATE:19640315T020000
+RDATE:19650425T020000
+RDATE:19800406T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19160930T000000
+RDATE:19160930T000000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19441002T030000
+RDATE:19451001T030000
+RDATE:19590920T030000
+RDATE:19600918T030000
+RDATE:19610917T030000
+RDATE:19620916T030000
+RDATE:19630915T030000
+RDATE:19640920T030000
+RDATE:19650919T030000
+RDATE:19800928T030000
+RDATE:19810927T030000
+RDATE:19820926T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19800101T000000
+RDATE:19800101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Paris.ics b/libkcal/libical/zoneinfo/Europe/Paris.ics
new file mode 100644
index 00000000..19f268a8
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Paris.ics
@@ -0,0 +1,168 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Paris
+X-LIC-LOCATION:Europe/Paris
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19810329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+000921
+TZOFFSETTO:+000921
+TZNAME:PMT
+DTSTART:18910315T000100
+RDATE:18910315T000100
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+000921
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19110311T000100
+RDATE:19110311T000100
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:WEST
+DTSTART:19160614T230000
+RDATE:19160614T230000
+RDATE:19170324T230000
+RDATE:19180309T230000
+RDATE:19190301T230000
+RDATE:19200214T230000
+RDATE:19210314T230000
+RDATE:19220325T230000
+RDATE:19230526T230000
+RDATE:19240329T230000
+RDATE:19250404T230000
+RDATE:19260417T230000
+RDATE:19270409T230000
+RDATE:19280414T230000
+RDATE:19290420T230000
+RDATE:19300412T230000
+RDATE:19310418T230000
+RDATE:19320402T230000
+RDATE:19330325T230000
+RDATE:19340407T230000
+RDATE:19350330T230000
+RDATE:19360418T230000
+RDATE:19370403T230000
+RDATE:19380326T230000
+RDATE:19390415T230000
+RDATE:19400225T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19161002T000000
+RDATE:19161002T000000
+RDATE:19171008T000000
+RDATE:19181007T000000
+RDATE:19191006T000000
+RDATE:19201024T000000
+RDATE:19211026T000000
+RDATE:19221008T000000
+RDATE:19231007T000000
+RDATE:19241005T000000
+RDATE:19251004T000000
+RDATE:19261003T000000
+RDATE:19271002T000000
+RDATE:19281007T000000
+RDATE:19291006T000000
+RDATE:19301005T000000
+RDATE:19311004T000000
+RDATE:19321002T000000
+RDATE:19331008T000000
+RDATE:19341007T000000
+RDATE:19351006T000000
+RDATE:19361004T000000
+RDATE:19371003T000000
+RDATE:19381002T000000
+RDATE:19391119T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19400614T230000
+RDATE:19400614T230000
+RDATE:19430329T020000
+RDATE:19440403T020000
+RDATE:19760328T010000
+RDATE:19770403T020000
+RDATE:19780402T020000
+RDATE:19790401T020000
+RDATE:19800406T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19421102T030000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19450916T030000
+RDATE:19760926T010000
+RDATE:19770925T030000
+RDATE:19781001T030000
+RDATE:19790930T030000
+RDATE:19800928T030000
+RDATE:19810927T030000
+RDATE:19820926T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:WEMT
+DTSTART:19440825T000000
+RDATE:19440825T000000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:WEST
+DTSTART:19441008T010000
+RDATE:19441008T010000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:WEMT
+DTSTART:19450402T020000
+RDATE:19450402T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19770101T000000
+RDATE:19770101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Podgorica.ics b/libkcal/libical/zoneinfo/Europe/Podgorica.ics
new file mode 100644
index 00000000..fef823b7
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Podgorica.ics
@@ -0,0 +1,69 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Podgorica
+X-LIC-LOCATION:Europe/Podgorica
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19830327T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0122
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:18840101T000000
+RDATE:18840101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19410418T230000
+RDATE:19410418T230000
+RDATE:19430329T020000
+RDATE:19440403T020000
+RDATE:19450508T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19421102T030000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19441002T030000
+RDATE:19450916T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19821127T000000
+RDATE:19821127T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Prague.ics b/libkcal/libical/zoneinfo/Europe/Prague.ics
new file mode 100644
index 00000000..b88970b2
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Prague.ics
@@ -0,0 +1,96 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Prague
+X-LIC-LOCATION:Europe/Prague
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19810329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+005744
+TZOFFSETTO:+005744
+TZNAME:PMT
+DTSTART:18500101T000000
+RDATE:18500101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+005744
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:18911001T000000
+RDATE:18911001T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19160430T230000
+RDATE:19160430T230000
+RDATE:19170416T020000
+RDATE:19180415T020000
+RDATE:19400401T020000
+RDATE:19430329T020000
+RDATE:19440403T020000
+RDATE:19450408T020000
+RDATE:19460506T020000
+RDATE:19470420T020000
+RDATE:19480418T020000
+RDATE:19490409T020000
+RDATE:19790401T020000
+RDATE:19800406T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19161001T010000
+RDATE:19161001T010000
+RDATE:19170917T030000
+RDATE:19180916T030000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19440917T030000
+RDATE:19451118T030000
+RDATE:19461006T030000
+RDATE:19471005T030000
+RDATE:19481003T030000
+RDATE:19491002T030000
+RDATE:19790930T030000
+RDATE:19800928T030000
+RDATE:19810927T030000
+RDATE:19820926T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19790101T000000
+RDATE:19790101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Riga.ics b/libkcal/libical/zoneinfo/Europe/Riga.ics
new file mode 100644
index 00000000..46c61b93
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Riga.ics
@@ -0,0 +1,167 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Riga
+X-LIC-LOCATION:Europe/Riga
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:20010325T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:20011028T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+013624
+TZOFFSETTO:+013624
+TZNAME:RMT
+DTSTART:18800101T000000
+RDATE:18800101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+013624
+TZOFFSETTO:+023624
+TZNAME:LST
+DTSTART:19180415T020000
+RDATE:19180415T020000
+RDATE:19190401T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+023624
+TZOFFSETTO:+013624
+TZNAME:RMT
+DTSTART:19180916T030000
+RDATE:19180916T030000
+RDATE:19190522T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+013624
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19260511T000000
+RDATE:19260511T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19400805T000000
+RDATE:19400805T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19410701T000000
+RDATE:19410701T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19421102T030000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19441002T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19430329T020000
+RDATE:19430329T020000
+RDATE:19440403T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19441013T000000
+RDATE:19441013T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:MSD
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19890326T020000
+RDATE:19890326T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19890924T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+RDATE:19960929T030000
+RDATE:19971026T040000
+RDATE:19981025T040000
+RDATE:19991031T040000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19900325T020000
+RDATE:19900325T020000
+RDATE:19910331T020000
+RDATE:19920329T020000
+RDATE:19930328T020000
+RDATE:19940327T020000
+RDATE:19950326T020000
+RDATE:19960331T020000
+RDATE:19970330T030000
+RDATE:19980329T030000
+RDATE:19990328T030000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19970121T000000
+RDATE:19970121T000000
+RDATE:20000229T000000
+RDATE:20010102T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Rome.ics b/libkcal/libical/zoneinfo/Europe/Rome.ics
new file mode 100644
index 00000000..3e7d7db3
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Rome.ics
@@ -0,0 +1,131 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Rome
+X-LIC-LOCATION:Europe/Rome
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19810329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+004956
+TZOFFSETTO:+004956
+TZNAME:RMT
+DTSTART:18660922T000000
+RDATE:18660922T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+004956
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:18931101T000000
+RDATE:18931101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19160603T000000
+RDATE:19160603T000000
+RDATE:19170401T000000
+RDATE:19180310T000000
+RDATE:19190302T000000
+RDATE:19200321T000000
+RDATE:19400615T000000
+RDATE:19430329T020000
+RDATE:19440403T020000
+RDATE:19450402T020000
+RDATE:19460317T020000
+RDATE:19470316T000000
+RDATE:19480229T020000
+RDATE:19660522T000000
+RDATE:19670528T000000
+RDATE:19680526T000000
+RDATE:19690601T000000
+RDATE:19700531T000000
+RDATE:19710523T000000
+RDATE:19720528T000000
+RDATE:19730603T000000
+RDATE:19740526T000000
+RDATE:19750601T000000
+RDATE:19760530T000000
+RDATE:19770522T000000
+RDATE:19780528T000000
+RDATE:19790527T000000
+RDATE:19800406T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19161001T010000
+RDATE:19161001T010000
+RDATE:19170930T010000
+RDATE:19181006T010000
+RDATE:19191005T010000
+RDATE:19200919T010000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19440917T010000
+RDATE:19450915T010000
+RDATE:19461006T030000
+RDATE:19471005T010000
+RDATE:19481003T030000
+RDATE:19660925T000000
+RDATE:19670924T000000
+RDATE:19680922T000000
+RDATE:19690928T000000
+RDATE:19700927T000000
+RDATE:19710926T010000
+RDATE:19721001T000000
+RDATE:19730930T000000
+RDATE:19740929T000000
+RDATE:19750928T010000
+RDATE:19760926T010000
+RDATE:19770925T010000
+RDATE:19781001T010000
+RDATE:19790930T010000
+RDATE:19800928T030000
+RDATE:19810927T030000
+RDATE:19820926T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19440701T000000
+RDATE:19440701T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19800101T000000
+RDATE:19800101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Samara.ics b/libkcal/libical/zoneinfo/Europe/Samara.ics
new file mode 100644
index 00000000..703f948a
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Samara.ics
@@ -0,0 +1,125 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Samara
+X-LIC-LOCATION:Europe/Samara
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:SAMST
+DTSTART:19930328T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0400
+TZNAME:SAMT
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+032036
+TZOFFSETTO:+0300
+TZNAME:SAMT
+DTSTART:19190701T020000
+RDATE:19190701T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:SAMT
+DTSTART:19300621T000000
+RDATE:19300621T000000
+RDATE:19911020T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0400
+TZNAME:KUYT
+DTSTART:19350127T000000
+RDATE:19350127T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:KUYST
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0400
+TZNAME:KUYT
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0400
+TZNAME:KUYST
+DTSTART:19890326T020000
+RDATE:19890326T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0300
+TZNAME:KUYT
+DTSTART:19890924T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:KUYST
+DTSTART:19900325T020000
+RDATE:19900325T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:KUYST
+DTSTART:19910331T020000
+RDATE:19910331T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:KUYT
+DTSTART:19910929T030000
+RDATE:19910929T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:SAMST
+DTSTART:19920328T230000
+RDATE:19920328T230000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0400
+TZNAME:SAMT
+DTSTART:19920926T230000
+RDATE:19920926T230000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/San_Marino.ics b/libkcal/libical/zoneinfo/Europe/San_Marino.ics
new file mode 100644
index 00000000..e112b390
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/San_Marino.ics
@@ -0,0 +1,131 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/San_Marino
+X-LIC-LOCATION:Europe/San_Marino
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19810329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+004956
+TZOFFSETTO:+004956
+TZNAME:RMT
+DTSTART:18660922T000000
+RDATE:18660922T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+004956
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:18931101T000000
+RDATE:18931101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19160603T000000
+RDATE:19160603T000000
+RDATE:19170401T000000
+RDATE:19180310T000000
+RDATE:19190302T000000
+RDATE:19200321T000000
+RDATE:19400615T000000
+RDATE:19430329T020000
+RDATE:19440403T020000
+RDATE:19450402T020000
+RDATE:19460317T020000
+RDATE:19470316T000000
+RDATE:19480229T020000
+RDATE:19660522T000000
+RDATE:19670528T000000
+RDATE:19680526T000000
+RDATE:19690601T000000
+RDATE:19700531T000000
+RDATE:19710523T000000
+RDATE:19720528T000000
+RDATE:19730603T000000
+RDATE:19740526T000000
+RDATE:19750601T000000
+RDATE:19760530T000000
+RDATE:19770522T000000
+RDATE:19780528T000000
+RDATE:19790527T000000
+RDATE:19800406T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19161001T010000
+RDATE:19161001T010000
+RDATE:19170930T010000
+RDATE:19181006T010000
+RDATE:19191005T010000
+RDATE:19200919T010000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19440917T010000
+RDATE:19450915T010000
+RDATE:19461006T030000
+RDATE:19471005T010000
+RDATE:19481003T030000
+RDATE:19660925T000000
+RDATE:19670924T000000
+RDATE:19680922T000000
+RDATE:19690928T000000
+RDATE:19700927T000000
+RDATE:19710926T010000
+RDATE:19721001T000000
+RDATE:19730930T000000
+RDATE:19740929T000000
+RDATE:19750928T010000
+RDATE:19760926T010000
+RDATE:19770925T010000
+RDATE:19781001T010000
+RDATE:19790930T010000
+RDATE:19800928T030000
+RDATE:19810927T030000
+RDATE:19820926T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19440701T000000
+RDATE:19440701T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19800101T000000
+RDATE:19800101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Sarajevo.ics b/libkcal/libical/zoneinfo/Europe/Sarajevo.ics
new file mode 100644
index 00000000..aa8898d2
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Sarajevo.ics
@@ -0,0 +1,69 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Sarajevo
+X-LIC-LOCATION:Europe/Sarajevo
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19830327T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0122
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:18840101T000000
+RDATE:18840101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19410418T230000
+RDATE:19410418T230000
+RDATE:19430329T020000
+RDATE:19440403T020000
+RDATE:19450508T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19421102T030000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19441002T030000
+RDATE:19450916T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19821127T000000
+RDATE:19821127T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Simferopol.ics b/libkcal/libical/zoneinfo/Europe/Simferopol.ics
new file mode 100644
index 00000000..543e9217
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Simferopol.ics
@@ -0,0 +1,150 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Simferopol
+X-LIC-LOCATION:Europe/Simferopol
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19971026T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19980329T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+021624
+TZOFFSETTO:+0216
+TZNAME:SMT
+DTSTART:18800101T000000
+RDATE:18800101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0216
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19240502T000000
+RDATE:19240502T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19300621T000000
+RDATE:19300621T000000
+RDATE:19440413T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19411101T000000
+RDATE:19411101T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19421102T030000
+RDATE:19421102T030000
+RDATE:19431004T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19430329T020000
+RDATE:19430329T020000
+RDATE:19440403T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:MSD
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19940501T000000
+RDATE:19950326T000000
+RDATE:19960331T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19940925T000000
+RDATE:19950924T000000
+RDATE:19961027T040000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19900101T000000
+RDATE:19900101T000000
+RDATE:19970101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19900701T020000
+RDATE:19900701T020000
+RDATE:19920927T000000
+RDATE:19930926T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19920101T000000
+RDATE:19920101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19920329T000000
+RDATE:19920329T000000
+RDATE:19930328T000000
+RDATE:19940327T000000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0400
+TZNAME:MSD
+DTSTART:19960331T040000
+RDATE:19960331T040000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19970330T040000
+RDATE:19970330T040000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Skopje.ics b/libkcal/libical/zoneinfo/Europe/Skopje.ics
new file mode 100644
index 00000000..d3924c74
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Skopje.ics
@@ -0,0 +1,69 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Skopje
+X-LIC-LOCATION:Europe/Skopje
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19830327T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0122
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:18840101T000000
+RDATE:18840101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19410418T230000
+RDATE:19410418T230000
+RDATE:19430329T020000
+RDATE:19440403T020000
+RDATE:19450508T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19421102T030000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19441002T030000
+RDATE:19450916T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19821127T000000
+RDATE:19821127T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Sofia.ics b/libkcal/libical/zoneinfo/Europe/Sofia.ics
new file mode 100644
index 00000000..0e7b6242
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Sofia.ics
@@ -0,0 +1,123 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Sofia
+X-LIC-LOCATION:Europe/Sofia
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19970330T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19971026T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+013316
+TZOFFSETTO:+015656
+TZNAME:IMT
+DTSTART:18800101T000000
+RDATE:18800101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+015656
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:18941130T000000
+RDATE:18941130T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19421102T020000
+RDATE:19421102T020000
+RDATE:19431004T030000
+RDATE:19441002T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19430329T020000
+RDATE:19430329T020000
+RDATE:19440403T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19450402T030000
+RDATE:19450402T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19790331T230000
+RDATE:19790331T230000
+RDATE:19800405T230000
+RDATE:19810404T230000
+RDATE:19820403T230000
+RDATE:19830327T020000
+RDATE:19840325T020000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+RDATE:19910331T000000
+RDATE:19920329T000000
+RDATE:19930328T000000
+RDATE:19940327T000000
+RDATE:19950326T000000
+RDATE:19960331T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19791001T010000
+RDATE:19791001T010000
+RDATE:19800929T010000
+RDATE:19810927T020000
+RDATE:19820926T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T000000
+RDATE:19920927T000000
+RDATE:19930926T000000
+RDATE:19940925T000000
+RDATE:19950924T000000
+RDATE:19961027T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19820926T020000
+RDATE:19820926T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19910101T000000
+RDATE:19910101T000000
+RDATE:19970101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Stockholm.ics b/libkcal/libical/zoneinfo/Europe/Stockholm.ics
new file mode 100644
index 00000000..e9ca91ae
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Stockholm.ics
@@ -0,0 +1,74 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Stockholm
+X-LIC-LOCATION:Europe/Stockholm
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19810329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+011212
+TZOFFSETTO:+010014
+TZNAME:SET
+DTSTART:18790101T000000
+RDATE:18790101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+010014
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19000101T000000
+RDATE:19000101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19160514T230000
+RDATE:19160514T230000
+RDATE:19800406T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19161001T010000
+RDATE:19161001T010000
+RDATE:19800928T030000
+RDATE:19810927T030000
+RDATE:19820926T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19800101T000000
+RDATE:19800101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Tallinn.ics b/libkcal/libical/zoneinfo/Europe/Tallinn.ics
new file mode 100644
index 00000000..1fcb6975
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Tallinn.ics
@@ -0,0 +1,160 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Tallinn
+X-LIC-LOCATION:Europe/Tallinn
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:20020331T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:20021027T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0139
+TZOFFSETTO:+0139
+TZNAME:TMT
+DTSTART:18800101T000000
+RDATE:18800101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0139
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19180201T000000
+RDATE:19180201T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19180415T020000
+RDATE:19180415T020000
+RDATE:19430329T020000
+RDATE:19440403T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19180916T030000
+RDATE:19180916T030000
+RDATE:19421102T030000
+RDATE:19431004T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0139
+TZNAME:TMT
+DTSTART:19190701T000000
+RDATE:19190701T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0139
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19210501T000000
+RDATE:19210501T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19400806T000000
+RDATE:19400806T000000
+RDATE:19440922T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19410915T000000
+RDATE:19410915T000000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:MSD
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19890326T020000
+RDATE:19890326T020000
+RDATE:19980922T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19890924T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+RDATE:19961027T030000
+RDATE:19971026T030000
+RDATE:19981025T040000
+RDATE:19991031T040000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19900325T020000
+RDATE:19900325T020000
+RDATE:19910331T020000
+RDATE:19920329T020000
+RDATE:19930328T020000
+RDATE:19940327T020000
+RDATE:19950326T020000
+RDATE:19960331T020000
+RDATE:19970330T020000
+RDATE:19980329T020000
+RDATE:19990328T030000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19991101T000000
+RDATE:19991101T000000
+RDATE:20020221T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Tirane.ics b/libkcal/libical/zoneinfo/Europe/Tirane.ics
new file mode 100644
index 00000000..1759f11f
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Tirane.ics
@@ -0,0 +1,85 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Tirane
+X-LIC-LOCATION:Europe/Tirane
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19850331T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+011920
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19140101T000000
+RDATE:19140101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19400616T000000
+RDATE:19400616T000000
+RDATE:19430329T020000
+RDATE:19740504T000000
+RDATE:19750501T000000
+RDATE:19760502T000000
+RDATE:19770508T000000
+RDATE:19780506T000000
+RDATE:19790505T000000
+RDATE:19800503T000000
+RDATE:19810426T000000
+RDATE:19820502T000000
+RDATE:19830418T000000
+RDATE:19840401T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19421102T030000
+RDATE:19421102T030000
+RDATE:19430410T030000
+RDATE:19741002T000000
+RDATE:19751002T000000
+RDATE:19761003T000000
+RDATE:19771002T000000
+RDATE:19781001T000000
+RDATE:19790930T000000
+RDATE:19801004T000000
+RDATE:19810927T000000
+RDATE:19821003T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19840701T000000
+RDATE:19840701T000000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Uzhgorod.ics b/libkcal/libical/zoneinfo/Europe/Uzhgorod.ics
new file mode 100644
index 00000000..26ca4e57
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Uzhgorod.ics
@@ -0,0 +1,146 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Uzhgorod
+X-LIC-LOCATION:Europe/Uzhgorod
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19950326T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19961027T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+012912
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:18901001T000000
+RDATE:18901001T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19400101T000000
+RDATE:19400101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19400401T020000
+RDATE:19400401T020000
+RDATE:19430329T020000
+RDATE:19440403T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19421102T030000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19441026T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19441001T000000
+RDATE:19441001T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19450629T000000
+RDATE:19450629T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:MSD
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19900101T000000
+RDATE:19900101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19900701T020000
+RDATE:19900701T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19910331T030000
+RDATE:19910331T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19920101T000000
+RDATE:19920101T000000
+RDATE:19950101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19920329T000000
+RDATE:19920329T000000
+RDATE:19930328T000000
+RDATE:19940327T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19920927T000000
+RDATE:19920927T000000
+RDATE:19930926T000000
+RDATE:19940925T000000
+RDATE:19950924T040000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Vaduz.ics b/libkcal/libical/zoneinfo/Europe/Vaduz.ics
new file mode 100644
index 00000000..7feee448
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Vaduz.ics
@@ -0,0 +1,57 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Vaduz
+X-LIC-LOCATION:Europe/Vaduz
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19810329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+003804
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:18940601T000000
+RDATE:18940601T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19810101T000000
+RDATE:19810101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19810927T030000
+RDATE:19810927T030000
+RDATE:19820926T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Vatican.ics b/libkcal/libical/zoneinfo/Europe/Vatican.ics
new file mode 100644
index 00000000..d1e83ebb
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Vatican.ics
@@ -0,0 +1,131 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Vatican
+X-LIC-LOCATION:Europe/Vatican
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19810329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+004956
+TZOFFSETTO:+004956
+TZNAME:RMT
+DTSTART:18660922T000000
+RDATE:18660922T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+004956
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:18931101T000000
+RDATE:18931101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19160603T000000
+RDATE:19160603T000000
+RDATE:19170401T000000
+RDATE:19180310T000000
+RDATE:19190302T000000
+RDATE:19200321T000000
+RDATE:19400615T000000
+RDATE:19430329T020000
+RDATE:19440403T020000
+RDATE:19450402T020000
+RDATE:19460317T020000
+RDATE:19470316T000000
+RDATE:19480229T020000
+RDATE:19660522T000000
+RDATE:19670528T000000
+RDATE:19680526T000000
+RDATE:19690601T000000
+RDATE:19700531T000000
+RDATE:19710523T000000
+RDATE:19720528T000000
+RDATE:19730603T000000
+RDATE:19740526T000000
+RDATE:19750601T000000
+RDATE:19760530T000000
+RDATE:19770522T000000
+RDATE:19780528T000000
+RDATE:19790527T000000
+RDATE:19800406T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19161001T010000
+RDATE:19161001T010000
+RDATE:19170930T010000
+RDATE:19181006T010000
+RDATE:19191005T010000
+RDATE:19200919T010000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19440917T010000
+RDATE:19450915T010000
+RDATE:19461006T030000
+RDATE:19471005T010000
+RDATE:19481003T030000
+RDATE:19660925T000000
+RDATE:19670924T000000
+RDATE:19680922T000000
+RDATE:19690928T000000
+RDATE:19700927T000000
+RDATE:19710926T010000
+RDATE:19721001T000000
+RDATE:19730930T000000
+RDATE:19740929T000000
+RDATE:19750928T010000
+RDATE:19760926T010000
+RDATE:19770925T010000
+RDATE:19781001T010000
+RDATE:19790930T010000
+RDATE:19800928T030000
+RDATE:19810927T030000
+RDATE:19820926T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19440701T000000
+RDATE:19440701T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19800101T000000
+RDATE:19800101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Vienna.ics b/libkcal/libical/zoneinfo/Europe/Vienna.ics
new file mode 100644
index 00000000..a18861c2
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Vienna.ics
@@ -0,0 +1,89 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Vienna
+X-LIC-LOCATION:Europe/Vienna
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19810329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+010520
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:18930401T000000
+RDATE:18930401T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19160430T230000
+RDATE:19160430T230000
+RDATE:19170416T020000
+RDATE:19180415T020000
+RDATE:19200405T020000
+RDATE:19400401T020000
+RDATE:19430329T020000
+RDATE:19440403T020000
+RDATE:19450402T020000
+RDATE:19460414T020000
+RDATE:19470406T020000
+RDATE:19480418T020000
+RDATE:19800406T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19161001T010000
+RDATE:19161001T010000
+RDATE:19170917T030000
+RDATE:19180916T030000
+RDATE:19200913T030000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19441002T030000
+RDATE:19450412T030000
+RDATE:19461006T030000
+RDATE:19471005T030000
+RDATE:19481003T030000
+RDATE:19800928T000000
+RDATE:19810927T030000
+RDATE:19820926T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19200101T000000
+RDATE:19200101T000000
+RDATE:19460101T000000
+RDATE:19810101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Vilnius.ics b/libkcal/libical/zoneinfo/Europe/Vilnius.ics
new file mode 100644
index 00000000..a2cf346f
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Vilnius.ics
@@ -0,0 +1,170 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Vilnius
+X-LIC-LOCATION:Europe/Vilnius
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:20030330T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:20031026T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+014116
+TZOFFSETTO:+0124
+TZNAME:WMT
+DTSTART:18800101T000000
+RDATE:18800101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0124
+TZOFFSETTO:+013536
+TZNAME:KMT
+DTSTART:19170101T000000
+RDATE:19170101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+013536
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19191010T000000
+RDATE:19191010T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19200712T000000
+RDATE:19200712T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19201009T000000
+RDATE:19201009T000000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19981025T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19400803T000000
+RDATE:19400803T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19410624T000000
+RDATE:19410624T000000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19430329T020000
+RDATE:19430329T020000
+RDATE:19440403T020000
+RDATE:19990328T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19440801T000000
+RDATE:19440801T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:MSD
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19910331T020000
+RDATE:19910331T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19910929T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+RDATE:19961027T030000
+RDATE:19971026T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19920329T020000
+RDATE:19920329T020000
+RDATE:19930328T020000
+RDATE:19940327T020000
+RDATE:19950326T020000
+RDATE:19960331T020000
+RDATE:19970330T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19980101T000000
+RDATE:19980101T000000
+RDATE:19991031T030000
+RDATE:20030101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19980329T030000
+RDATE:19980329T030000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Volgograd.ics b/libkcal/libical/zoneinfo/Europe/Volgograd.ics
new file mode 100644
index 00000000..7d9090d5
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Volgograd.ics
@@ -0,0 +1,112 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Volgograd
+X-LIC-LOCATION:Europe/Volgograd
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:VOLST
+DTSTART:19930328T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0300
+TZNAME:VOLT
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+025740
+TZOFFSETTO:+0300
+TZNAME:TSAT
+DTSTART:19200103T000000
+RDATE:19200103T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:STAT
+DTSTART:19250406T000000
+RDATE:19250406T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:STAT
+DTSTART:19300621T000000
+RDATE:19300621T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0400
+TZNAME:VOLT
+DTSTART:19611111T000000
+RDATE:19611111T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:VOLST
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0400
+TZNAME:VOLT
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0400
+TZNAME:VOLST
+DTSTART:19890326T020000
+RDATE:19890326T020000
+RDATE:19920329T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0300
+TZNAME:VOLT
+DTSTART:19890924T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19920926T230000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:VOLST
+DTSTART:19900325T020000
+RDATE:19900325T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:VOLT
+DTSTART:19910331T020000
+RDATE:19910331T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Warsaw.ics b/libkcal/libical/zoneinfo/Europe/Warsaw.ics
new file mode 100644
index 00000000..166995a5
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Warsaw.ics
@@ -0,0 +1,152 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Warsaw
+X-LIC-LOCATION:Europe/Warsaw
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19880327T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0124
+TZOFFSETTO:+0124
+TZNAME:WMT
+DTSTART:18800101T000000
+RDATE:18800101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0124
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19150805T000000
+RDATE:19150805T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19160430T230000
+RDATE:19160430T230000
+RDATE:19170416T020000
+RDATE:19180415T020000
+RDATE:19400623T020000
+RDATE:19430329T020000
+RDATE:19440403T020000
+RDATE:19450429T000000
+RDATE:19460414T000000
+RDATE:19470504T020000
+RDATE:19480418T020000
+RDATE:19490410T020000
+RDATE:19570602T010000
+RDATE:19580330T010000
+RDATE:19590531T010000
+RDATE:19600403T010000
+RDATE:19610528T010000
+RDATE:19620527T010000
+RDATE:19630526T010000
+RDATE:19640531T010000
+RDATE:19770403T010000
+RDATE:19780402T010000
+RDATE:19790401T010000
+RDATE:19800406T010000
+RDATE:19810329T010000
+RDATE:19820328T010000
+RDATE:19830327T010000
+RDATE:19840325T010000
+RDATE:19850331T010000
+RDATE:19860330T010000
+RDATE:19870329T010000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19161001T010000
+RDATE:19161001T010000
+RDATE:19170917T030000
+RDATE:19220601T000000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19441004T020000
+RDATE:19451101T000000
+RDATE:19461007T030000
+RDATE:19471005T030000
+RDATE:19481003T030000
+RDATE:19491002T030000
+RDATE:19570929T020000
+RDATE:19580928T020000
+RDATE:19591004T020000
+RDATE:19601002T020000
+RDATE:19611001T020000
+RDATE:19620930T020000
+RDATE:19630929T020000
+RDATE:19640927T020000
+RDATE:19770925T020000
+RDATE:19781001T020000
+RDATE:19790930T020000
+RDATE:19800928T020000
+RDATE:19810927T020000
+RDATE:19820926T020000
+RDATE:19830925T020000
+RDATE:19840930T020000
+RDATE:19850929T020000
+RDATE:19860928T020000
+RDATE:19870927T020000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19180916T030000
+RDATE:19180916T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19190415T020000
+RDATE:19190415T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19190916T030000
+RDATE:19190916T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19441001T000000
+RDATE:19441001T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19770101T000000
+RDATE:19770101T000000
+RDATE:19880101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Zagreb.ics b/libkcal/libical/zoneinfo/Europe/Zagreb.ics
new file mode 100644
index 00000000..ae215dde
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Zagreb.ics
@@ -0,0 +1,69 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Zagreb
+X-LIC-LOCATION:Europe/Zagreb
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19830327T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0122
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:18840101T000000
+RDATE:18840101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19410418T230000
+RDATE:19410418T230000
+RDATE:19430329T020000
+RDATE:19440403T020000
+RDATE:19450508T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19421102T030000
+RDATE:19421102T030000
+RDATE:19431004T030000
+RDATE:19441002T030000
+RDATE:19450916T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19821127T000000
+RDATE:19821127T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Zaporozhye.ics b/libkcal/libical/zoneinfo/Europe/Zaporozhye.ics
new file mode 100644
index 00000000..e58e1328
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Zaporozhye.ics
@@ -0,0 +1,138 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Zaporozhye
+X-LIC-LOCATION:Europe/Zaporozhye
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19950326T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19961027T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+022040
+TZOFFSETTO:+0220
+TZNAME:CUT
+DTSTART:18800101T000000
+RDATE:18800101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0220
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19240502T000000
+RDATE:19240502T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19300621T000000
+RDATE:19300621T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19410825T000000
+RDATE:19410825T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19421102T030000
+RDATE:19421102T030000
+RDATE:19431004T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19430329T020000
+RDATE:19430329T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19431025T000000
+RDATE:19431025T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:MSD
+DTSTART:19810401T000000
+RDATE:19810401T000000
+RDATE:19820401T000000
+RDATE:19830401T000000
+RDATE:19840401T000000
+RDATE:19850331T020000
+RDATE:19860330T020000
+RDATE:19870329T020000
+RDATE:19880327T020000
+RDATE:19890326T020000
+RDATE:19900325T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19811001T000000
+RDATE:19811001T000000
+RDATE:19821001T000000
+RDATE:19831001T000000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19910331T020000
+RDATE:19910331T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19910929T000000
+RDATE:19910929T000000
+RDATE:19920927T000000
+RDATE:19930926T000000
+RDATE:19940925T000000
+RDATE:19950924T040000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19920329T000000
+RDATE:19920329T000000
+RDATE:19930328T000000
+RDATE:19940327T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19950101T000000
+RDATE:19950101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Europe/Zurich.ics b/libkcal/libical/zoneinfo/Europe/Zurich.ics
new file mode 100644
index 00000000..ace550df
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Europe/Zurich.ics
@@ -0,0 +1,76 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Europe/Zurich
+X-LIC-LOCATION:Europe/Zurich
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19810329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+003408
+TZOFFSETTO:+002944
+TZNAME:BMT
+DTSTART:18480912T000000
+RDATE:18480912T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+002944
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:18940601T000000
+RDATE:18940601T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19401102T000000
+RDATE:19401102T000000
+RDATE:19410504T020000
+RDATE:19420503T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19401231T000000
+RDATE:19401231T000000
+RDATE:19411005T000000
+RDATE:19421004T000000
+RDATE:19810927T030000
+RDATE:19820926T030000
+RDATE:19830925T030000
+RDATE:19840930T030000
+RDATE:19850929T030000
+RDATE:19860928T030000
+RDATE:19870927T030000
+RDATE:19880925T030000
+RDATE:19890924T030000
+RDATE:19900930T030000
+RDATE:19910929T030000
+RDATE:19920927T030000
+RDATE:19930926T030000
+RDATE:19940925T030000
+RDATE:19950924T030000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19810101T000000
+RDATE:19810101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Indian/Antananarivo.ics b/libkcal/libical/zoneinfo/Indian/Antananarivo.ics
new file mode 100644
index 00000000..62dd8960
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Indian/Antananarivo.ics
@@ -0,0 +1,29 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Indian/Antananarivo
+X-LIC-LOCATION:Indian/Antananarivo
+BEGIN:STANDARD
+TZOFFSETFROM:+031004
+TZOFFSETTO:+0300
+TZNAME:EAT
+DTSTART:19110701T000000
+RDATE:19110701T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:EAST
+DTSTART:19540227T230000
+RDATE:19540227T230000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0300
+TZNAME:EAT
+DTSTART:19540530T000000
+RDATE:19540530T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Indian/Chagos.ics b/libkcal/libical/zoneinfo/Indian/Chagos.ics
new file mode 100644
index 00000000..0f9392c1
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Indian/Chagos.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Indian/Chagos
+X-LIC-LOCATION:Indian/Chagos
+BEGIN:STANDARD
+TZOFFSETFROM:+044940
+TZOFFSETTO:+0500
+TZNAME:IOT
+DTSTART:19070101T000000
+RDATE:19070101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0600
+TZNAME:IOT
+DTSTART:19960101T000000
+RDATE:19960101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Indian/Christmas.ics b/libkcal/libical/zoneinfo/Indian/Christmas.ics
new file mode 100644
index 00000000..057f9752
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Indian/Christmas.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Indian/Christmas
+X-LIC-LOCATION:Indian/Christmas
+BEGIN:STANDARD
+TZOFFSETFROM:+070252
+TZOFFSETTO:+0700
+TZNAME:CXT
+DTSTART:18950201T000000
+RDATE:18950201T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Indian/Cocos.ics b/libkcal/libical/zoneinfo/Indian/Cocos.ics
new file mode 100644
index 00000000..071096cb
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Indian/Cocos.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Indian/Cocos
+X-LIC-LOCATION:Indian/Cocos
+BEGIN:STANDARD
+TZOFFSETFROM:+062740
+TZOFFSETTO:+0630
+TZNAME:CCT
+DTSTART:19000101T000000
+RDATE:19000101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Indian/Comoro.ics b/libkcal/libical/zoneinfo/Indian/Comoro.ics
new file mode 100644
index 00000000..c30abcca
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Indian/Comoro.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Indian/Comoro
+X-LIC-LOCATION:Indian/Comoro
+BEGIN:STANDARD
+TZOFFSETFROM:+025304
+TZOFFSETTO:+0300
+TZNAME:EAT
+DTSTART:19110701T000000
+RDATE:19110701T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Indian/Kerguelen.ics b/libkcal/libical/zoneinfo/Indian/Kerguelen.ics
new file mode 100644
index 00000000..ed3d1801
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Indian/Kerguelen.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Indian/Kerguelen
+X-LIC-LOCATION:Indian/Kerguelen
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0500
+TZNAME:TFT
+DTSTART:19500101T000000
+RDATE:19500101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Indian/Mahe.ics b/libkcal/libical/zoneinfo/Indian/Mahe.ics
new file mode 100644
index 00000000..87ef36b0
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Indian/Mahe.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Indian/Mahe
+X-LIC-LOCATION:Indian/Mahe
+BEGIN:STANDARD
+TZOFFSETFROM:+034148
+TZOFFSETTO:+0400
+TZNAME:SCT
+DTSTART:19060601T000000
+RDATE:19060601T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Indian/Maldives.ics b/libkcal/libical/zoneinfo/Indian/Maldives.ics
new file mode 100644
index 00000000..4b0efb98
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Indian/Maldives.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Indian/Maldives
+X-LIC-LOCATION:Indian/Maldives
+BEGIN:STANDARD
+TZOFFSETFROM:+0454
+TZOFFSETTO:+0454
+TZNAME:MMT
+DTSTART:18800101T000000
+RDATE:18800101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0454
+TZOFFSETTO:+0500
+TZNAME:MVT
+DTSTART:19600101T000000
+RDATE:19600101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Indian/Mauritius.ics b/libkcal/libical/zoneinfo/Indian/Mauritius.ics
new file mode 100644
index 00000000..0a12e950
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Indian/Mauritius.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Indian/Mauritius
+X-LIC-LOCATION:Indian/Mauritius
+BEGIN:STANDARD
+TZOFFSETFROM:+0350
+TZOFFSETTO:+0400
+TZNAME:MUT
+DTSTART:19070101T000000
+RDATE:19070101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Indian/Mayotte.ics b/libkcal/libical/zoneinfo/Indian/Mayotte.ics
new file mode 100644
index 00000000..f4df8428
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Indian/Mayotte.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Indian/Mayotte
+X-LIC-LOCATION:Indian/Mayotte
+BEGIN:STANDARD
+TZOFFSETFROM:+030056
+TZOFFSETTO:+0300
+TZNAME:EAT
+DTSTART:19110701T000000
+RDATE:19110701T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Indian/Reunion.ics b/libkcal/libical/zoneinfo/Indian/Reunion.ics
new file mode 100644
index 00000000..028dbe53
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Indian/Reunion.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Indian/Reunion
+X-LIC-LOCATION:Indian/Reunion
+BEGIN:STANDARD
+TZOFFSETFROM:+034152
+TZOFFSETTO:+0400
+TZNAME:RET
+DTSTART:19110601T000000
+RDATE:19110601T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Makefile.am b/libkcal/libical/zoneinfo/Makefile.am
new file mode 100644
index 00000000..db05f174
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Makefile.am
@@ -0,0 +1,39 @@
+
+zoneinfodir = $(kde_datadir)/libical/zoneinfo
+
+zoneinfo_DATA = zones.tab
+
+DIRS = \
+ Africa \
+ America \
+ America/Argentina \
+ America/Indiana \
+ America/Kentucky \
+ America/North_Dakota \
+ Antarctica \
+ Arctic \
+ Asia \
+ Atlantic \
+ Australia \
+ Europe \
+ Indian \
+ Pacific
+
+
+install-data-local:
+ for dir in $(DIRS); do \
+ $(mkinstalldirs) $(DESTDIR)$(zoneinfodir)/$$dir; \
+ for tzfile in $(srcdir)/$$dir/*.ics; do \
+ $(INSTALL_DATA) $$tzfile $(DESTDIR)$(zoneinfodir)/$$dir; \
+ done \
+ done
+
+dist-hook:
+ for dir in $(DIRS); do \
+ mkdir $(distdir)/$$dir; \
+ for tzfile in $(srcdir)/$$dir/*.ics; do \
+ cp -p $$tzfile $(distdir)/$$dir; \
+ done \
+ done
+
+EXTRA_DIST = $(zoneinfo_DATA)
diff --git a/libkcal/libical/zoneinfo/Pacific/Apia.ics b/libkcal/libical/zoneinfo/Pacific/Apia.ics
new file mode 100644
index 00000000..acb433c8
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Apia.ics
@@ -0,0 +1,29 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Apia
+X-LIC-LOCATION:Pacific/Apia
+BEGIN:STANDARD
+TZOFFSETFROM:+123304
+TZOFFSETTO:-112656
+TZNAME:LMT
+DTSTART:18790705T000000
+RDATE:18790705T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-112656
+TZOFFSETTO:-1130
+TZNAME:SAMT
+DTSTART:19110101T000000
+RDATE:19110101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-1130
+TZOFFSETTO:-1100
+TZNAME:WST
+DTSTART:19500101T000000
+RDATE:19500101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Auckland.ics b/libkcal/libical/zoneinfo/Pacific/Auckland.ics
new file mode 100644
index 00000000..27a70166
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Auckland.ics
@@ -0,0 +1,165 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Auckland
+X-LIC-LOCATION:Pacific/Auckland
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1300
+TZNAME:NZDT
+DTSTART:20070930T020000
+RRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1300
+TZOFFSETTO:+1200
+TZNAME:NZST
+DTSTART:20080406T030000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+113904
+TZOFFSETTO:+1130
+TZNAME:NZMT
+DTSTART:18681102T000000
+RDATE:18681102T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1130
+TZOFFSETTO:+1230
+TZNAME:NZST
+DTSTART:19271106T020000
+RDATE:19271106T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1230
+TZOFFSETTO:+1130
+TZNAME:NZMT
+DTSTART:19280304T020000
+RDATE:19280304T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1130
+TZOFFSETTO:+1200
+TZNAME:NZST
+DTSTART:19281014T020000
+RDATE:19281014T020000
+RDATE:19291013T020000
+RDATE:19301012T020000
+RDATE:19311011T020000
+RDATE:19321009T020000
+RDATE:19331008T020000
+RDATE:19340930T020000
+RDATE:19350929T020000
+RDATE:19360927T020000
+RDATE:19370926T020000
+RDATE:19380925T020000
+RDATE:19390924T020000
+RDATE:19400929T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1130
+TZNAME:NZMT
+DTSTART:19290317T020000
+RDATE:19290317T020000
+RDATE:19300316T020000
+RDATE:19310315T020000
+RDATE:19320320T020000
+RDATE:19330319T020000
+RDATE:19340429T020000
+RDATE:19350428T020000
+RDATE:19360426T020000
+RDATE:19370425T020000
+RDATE:19380424T020000
+RDATE:19390430T020000
+RDATE:19400428T020000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1200
+TZNAME:NZST
+DTSTART:19460101T000000
+RDATE:19460101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1300
+TZNAME:NZDT
+DTSTART:19741103T020000
+RDATE:19741103T020000
+RDATE:19751026T020000
+RDATE:19761031T020000
+RDATE:19771030T020000
+RDATE:19781029T020000
+RDATE:19791028T020000
+RDATE:19801026T020000
+RDATE:19811025T020000
+RDATE:19821031T020000
+RDATE:19831030T020000
+RDATE:19841028T020000
+RDATE:19851027T020000
+RDATE:19861026T020000
+RDATE:19871025T020000
+RDATE:19881030T020000
+RDATE:19891008T020000
+RDATE:19901007T020000
+RDATE:19911006T020000
+RDATE:19921004T020000
+RDATE:19931003T020000
+RDATE:19941002T020000
+RDATE:19951001T020000
+RDATE:19961006T020000
+RDATE:19971005T020000
+RDATE:19981004T020000
+RDATE:19991003T020000
+RDATE:20001001T020000
+RDATE:20011007T020000
+RDATE:20021006T020000
+RDATE:20031005T020000
+RDATE:20041003T020000
+RDATE:20051002T020000
+RDATE:20061001T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1300
+TZOFFSETTO:+1200
+TZNAME:NZST
+DTSTART:19750223T030000
+RDATE:19750223T030000
+RDATE:19760307T030000
+RDATE:19770306T030000
+RDATE:19780305T030000
+RDATE:19790304T030000
+RDATE:19800302T030000
+RDATE:19810301T030000
+RDATE:19820307T030000
+RDATE:19830306T030000
+RDATE:19840304T030000
+RDATE:19850303T030000
+RDATE:19860302T030000
+RDATE:19870301T030000
+RDATE:19880306T030000
+RDATE:19890305T030000
+RDATE:19900318T030000
+RDATE:19910317T030000
+RDATE:19920315T030000
+RDATE:19930321T030000
+RDATE:19940320T030000
+RDATE:19950319T030000
+RDATE:19960317T030000
+RDATE:19970316T030000
+RDATE:19980315T030000
+RDATE:19990321T030000
+RDATE:20000319T030000
+RDATE:20010318T030000
+RDATE:20020317T030000
+RDATE:20030316T030000
+RDATE:20040321T030000
+RDATE:20050320T030000
+RDATE:20060319T030000
+RDATE:20070318T030000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Chatham.ics b/libkcal/libical/zoneinfo/Pacific/Chatham.ics
new file mode 100644
index 00000000..7ea62d9a
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Chatham.ics
@@ -0,0 +1,107 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Chatham
+X-LIC-LOCATION:Pacific/Chatham
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1245
+TZOFFSETTO:+1345
+TZNAME:CHADT
+DTSTART:20070930T024500
+RRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1345
+TZOFFSETTO:+1245
+TZNAME:CHAST
+DTSTART:20080406T034500
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+121348
+TZOFFSETTO:+1245
+TZNAME:CHAST
+DTSTART:19570101T000000
+RDATE:19570101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1245
+TZOFFSETTO:+1345
+TZNAME:CHADT
+DTSTART:19741103T024500
+RDATE:19741103T024500
+RDATE:19751026T024500
+RDATE:19761031T024500
+RDATE:19771030T024500
+RDATE:19781029T024500
+RDATE:19791028T024500
+RDATE:19801026T024500
+RDATE:19811025T024500
+RDATE:19821031T024500
+RDATE:19831030T024500
+RDATE:19841028T024500
+RDATE:19851027T024500
+RDATE:19861026T024500
+RDATE:19871025T024500
+RDATE:19881030T024500
+RDATE:19891008T024500
+RDATE:19901007T024500
+RDATE:19911006T024500
+RDATE:19921004T024500
+RDATE:19931003T024500
+RDATE:19941002T024500
+RDATE:19951001T024500
+RDATE:19961006T024500
+RDATE:19971005T024500
+RDATE:19981004T024500
+RDATE:19991003T024500
+RDATE:20001001T024500
+RDATE:20011007T024500
+RDATE:20021006T024500
+RDATE:20031005T024500
+RDATE:20041003T024500
+RDATE:20051002T024500
+RDATE:20061001T024500
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1345
+TZOFFSETTO:+1245
+TZNAME:CHAST
+DTSTART:19750223T034500
+RDATE:19750223T034500
+RDATE:19760307T034500
+RDATE:19770306T034500
+RDATE:19780305T034500
+RDATE:19790304T034500
+RDATE:19800302T034500
+RDATE:19810301T034500
+RDATE:19820307T034500
+RDATE:19830306T034500
+RDATE:19840304T034500
+RDATE:19850303T034500
+RDATE:19860302T034500
+RDATE:19870301T034500
+RDATE:19880306T034500
+RDATE:19890305T034500
+RDATE:19900318T034500
+RDATE:19910317T034500
+RDATE:19920315T034500
+RDATE:19930321T034500
+RDATE:19940320T034500
+RDATE:19950319T034500
+RDATE:19960317T034500
+RDATE:19970316T034500
+RDATE:19980315T034500
+RDATE:19990321T034500
+RDATE:20000319T034500
+RDATE:20010318T034500
+RDATE:20020317T034500
+RDATE:20030316T034500
+RDATE:20040321T034500
+RDATE:20050320T034500
+RDATE:20060319T034500
+RDATE:20070318T034500
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Easter.ics b/libkcal/libical/zoneinfo/Pacific/Easter.ics
new file mode 100644
index 00000000..586d695e
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Easter.ics
@@ -0,0 +1,154 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Easter
+X-LIC-LOCATION:Pacific/Easter
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:EASST
+DTSTART:19991009T220000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=2SA
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:EAST
+DTSTART:20090314T220000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SA
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-071744
+TZOFFSETTO:-071728
+TZNAME:EMT
+DTSTART:18900101T000000
+RDATE:18900101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-071728
+TZOFFSETTO:-0600
+TZNAME:EASST
+DTSTART:19320901T000000
+RDATE:19320901T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:EAST
+DTSTART:19420531T220000
+RDATE:19420531T220000
+RDATE:19460831T210000
+RDATE:19690329T210000
+RDATE:19700328T210000
+RDATE:19710313T210000
+RDATE:19720311T210000
+RDATE:19730310T210000
+RDATE:19740309T210000
+RDATE:19750308T210000
+RDATE:19760313T210000
+RDATE:19770312T210000
+RDATE:19780311T210000
+RDATE:19790310T210000
+RDATE:19800308T210000
+RDATE:19810314T210000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:EASST
+DTSTART:19420731T220000
+RDATE:19420731T220000
+RDATE:19681102T210000
+RDATE:19691122T210000
+RDATE:19701010T210000
+RDATE:19711009T210000
+RDATE:19721014T210000
+RDATE:19730929T210000
+RDATE:19741012T210000
+RDATE:19751011T210000
+RDATE:19761009T210000
+RDATE:19771008T210000
+RDATE:19781014T210000
+RDATE:19791013T210000
+RDATE:19801011T210000
+RDATE:19811010T210000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:EASST
+DTSTART:19460714T220000
+RDATE:19460714T220000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0700
+TZNAME:EAST
+DTSTART:19470331T210000
+RDATE:19470331T210000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:EAST
+DTSTART:19820313T210000
+RDATE:19820313T210000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:EASST
+DTSTART:19821009T220000
+RDATE:19821009T220000
+RDATE:19831008T220000
+RDATE:19841013T220000
+RDATE:19851012T220000
+RDATE:19861011T220000
+RDATE:19871010T220000
+RDATE:19881001T220000
+RDATE:19891014T220000
+RDATE:19900915T220000
+RDATE:19911012T220000
+RDATE:19921010T220000
+RDATE:19931009T220000
+RDATE:19941008T220000
+RDATE:19951014T220000
+RDATE:19961012T220000
+RDATE:19971011T220000
+RDATE:19980926T220000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:EAST
+DTSTART:19830312T220000
+RDATE:19830312T220000
+RDATE:19840310T220000
+RDATE:19850309T220000
+RDATE:19860308T220000
+RDATE:19870411T220000
+RDATE:19880312T220000
+RDATE:19890311T220000
+RDATE:19900317T220000
+RDATE:19910309T220000
+RDATE:19920314T220000
+RDATE:19930313T220000
+RDATE:19940312T220000
+RDATE:19950311T220000
+RDATE:19960309T220000
+RDATE:19970329T220000
+RDATE:19980314T220000
+RDATE:19990403T220000
+RDATE:20000311T220000
+RDATE:20010310T220000
+RDATE:20020309T220000
+RDATE:20030308T220000
+RDATE:20040313T220000
+RDATE:20050312T220000
+RDATE:20060311T220000
+RDATE:20070310T220000
+RDATE:20080329T220000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Efate.ics b/libkcal/libical/zoneinfo/Pacific/Efate.ics
new file mode 100644
index 00000000..8e948a45
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Efate.ics
@@ -0,0 +1,47 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Efate
+X-LIC-LOCATION:Pacific/Efate
+BEGIN:STANDARD
+TZOFFSETFROM:+111316
+TZOFFSETTO:+1100
+TZNAME:VUT
+DTSTART:19120113T000000
+RDATE:19120113T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1200
+TZNAME:VUST
+DTSTART:19830925T000000
+RDATE:19830925T000000
+RDATE:19841023T000000
+RDATE:19850929T000000
+RDATE:19860928T000000
+RDATE:19870927T000000
+RDATE:19880925T000000
+RDATE:19890924T000000
+RDATE:19900923T000000
+RDATE:19910929T000000
+RDATE:19921025T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1100
+TZNAME:VUT
+DTSTART:19840325T000000
+RDATE:19840325T000000
+RDATE:19850324T000000
+RDATE:19860323T000000
+RDATE:19870329T000000
+RDATE:19880327T000000
+RDATE:19890326T000000
+RDATE:19900325T000000
+RDATE:19910324T000000
+RDATE:19920126T000000
+RDATE:19930124T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Enderbury.ics b/libkcal/libical/zoneinfo/Pacific/Enderbury.ics
new file mode 100644
index 00000000..8cd36380
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Enderbury.ics
@@ -0,0 +1,29 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Enderbury
+X-LIC-LOCATION:Pacific/Enderbury
+BEGIN:STANDARD
+TZOFFSETFROM:-112420
+TZOFFSETTO:-1200
+TZNAME:PHOT
+DTSTART:19010101T000000
+RDATE:19010101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-1200
+TZOFFSETTO:-1100
+TZNAME:PHOT
+DTSTART:19791001T000000
+RDATE:19791001T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-1100
+TZOFFSETTO:+1300
+TZNAME:PHOT
+DTSTART:19950101T000000
+RDATE:19950101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Fakaofo.ics b/libkcal/libical/zoneinfo/Pacific/Fakaofo.ics
new file mode 100644
index 00000000..7596b339
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Fakaofo.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Fakaofo
+X-LIC-LOCATION:Pacific/Fakaofo
+BEGIN:STANDARD
+TZOFFSETFROM:-112456
+TZOFFSETTO:-1000
+TZNAME:TKT
+DTSTART:19010101T000000
+RDATE:19010101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Fiji.ics b/libkcal/libical/zoneinfo/Pacific/Fiji.ics
new file mode 100644
index 00000000..d1360ead
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Fiji.ics
@@ -0,0 +1,31 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Fiji
+X-LIC-LOCATION:Pacific/Fiji
+BEGIN:STANDARD
+TZOFFSETFROM:+115340
+TZOFFSETTO:+1200
+TZNAME:FJT
+DTSTART:19151026T000000
+RDATE:19151026T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1300
+TZNAME:FJST
+DTSTART:19981101T020000
+RDATE:19981101T020000
+RDATE:19991107T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1300
+TZOFFSETTO:+1200
+TZNAME:FJT
+DTSTART:19990228T030000
+RDATE:19990228T030000
+RDATE:20000227T030000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Funafuti.ics b/libkcal/libical/zoneinfo/Pacific/Funafuti.ics
new file mode 100644
index 00000000..d9635414
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Funafuti.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Funafuti
+X-LIC-LOCATION:Pacific/Funafuti
+BEGIN:STANDARD
+TZOFFSETFROM:+115652
+TZOFFSETTO:+1200
+TZNAME:TVT
+DTSTART:19010101T000000
+RDATE:19010101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Galapagos.ics b/libkcal/libical/zoneinfo/Pacific/Galapagos.ics
new file mode 100644
index 00000000..d046d8a7
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Galapagos.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Galapagos
+X-LIC-LOCATION:Pacific/Galapagos
+BEGIN:STANDARD
+TZOFFSETFROM:-055824
+TZOFFSETTO:-0500
+TZNAME:ECT
+DTSTART:19310101T000000
+RDATE:19310101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:GALT
+DTSTART:19860101T000000
+RDATE:19860101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Gambier.ics b/libkcal/libical/zoneinfo/Pacific/Gambier.ics
new file mode 100644
index 00000000..ee42de04
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Gambier.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Gambier
+X-LIC-LOCATION:Pacific/Gambier
+BEGIN:STANDARD
+TZOFFSETFROM:-085948
+TZOFFSETTO:-0900
+TZNAME:GAMT
+DTSTART:19121001T000000
+RDATE:19121001T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Guadalcanal.ics b/libkcal/libical/zoneinfo/Pacific/Guadalcanal.ics
new file mode 100644
index 00000000..2ee7a6c0
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Guadalcanal.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Guadalcanal
+X-LIC-LOCATION:Pacific/Guadalcanal
+BEGIN:STANDARD
+TZOFFSETFROM:+103948
+TZOFFSETTO:+1100
+TZNAME:SBT
+DTSTART:19121001T000000
+RDATE:19121001T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Guam.ics b/libkcal/libical/zoneinfo/Pacific/Guam.ics
new file mode 100644
index 00000000..da6526a7
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Guam.ics
@@ -0,0 +1,29 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Guam
+X-LIC-LOCATION:Pacific/Guam
+BEGIN:STANDARD
+TZOFFSETFROM:-1421
+TZOFFSETTO:+0939
+TZNAME:LMT
+DTSTART:18441231T000000
+RDATE:18441231T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0939
+TZOFFSETTO:+1000
+TZNAME:GST
+DTSTART:19010101T000000
+RDATE:19010101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1000
+TZNAME:ChST
+DTSTART:20001223T000000
+RDATE:20001223T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Honolulu.ics b/libkcal/libical/zoneinfo/Pacific/Honolulu.ics
new file mode 100644
index 00000000..dc714faf
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Honolulu.ics
@@ -0,0 +1,51 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Honolulu
+X-LIC-LOCATION:Pacific/Honolulu
+BEGIN:STANDARD
+TZOFFSETFROM:-103126
+TZOFFSETTO:-1030
+TZNAME:HST
+DTSTART:19000101T120000
+RDATE:19000101T120000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-1030
+TZOFFSETTO:-0930
+TZNAME:HDT
+DTSTART:19330430T020000
+RDATE:19330430T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0930
+TZOFFSETTO:-1030
+TZNAME:HST
+DTSTART:19330521T020000
+RDATE:19330521T020000
+RDATE:19450930T020000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-1030
+TZOFFSETTO:-0930
+TZNAME:HWT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0930
+TZOFFSETTO:-0930
+TZNAME:HPT
+DTSTART:19450814T133000
+RDATE:19450814T133000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-1030
+TZOFFSETTO:-1000
+TZNAME:HST
+DTSTART:19470608T020000
+RDATE:19470608T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Johnston.ics b/libkcal/libical/zoneinfo/Pacific/Johnston.ics
new file mode 100644
index 00000000..bc249368
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Johnston.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Johnston
+X-LIC-LOCATION:Pacific/Johnston
+BEGIN:STANDARD
+TZOFFSETFROM:-1000
+TZOFFSETTO:-1000
+TZNAME:HST
+DTSTART:16010101T000000
+RDATE:16010101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Kiritimati.ics b/libkcal/libical/zoneinfo/Pacific/Kiritimati.ics
new file mode 100644
index 00000000..2dc18c73
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Kiritimati.ics
@@ -0,0 +1,29 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Kiritimati
+X-LIC-LOCATION:Pacific/Kiritimati
+BEGIN:STANDARD
+TZOFFSETFROM:-102920
+TZOFFSETTO:-1040
+TZNAME:LINT
+DTSTART:19010101T000000
+RDATE:19010101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-1040
+TZOFFSETTO:-1000
+TZNAME:LINT
+DTSTART:19791001T000000
+RDATE:19791001T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-1000
+TZOFFSETTO:+1400
+TZNAME:LINT
+DTSTART:19950101T000000
+RDATE:19950101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Kosrae.ics b/libkcal/libical/zoneinfo/Pacific/Kosrae.ics
new file mode 100644
index 00000000..1dc914cc
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Kosrae.ics
@@ -0,0 +1,29 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Kosrae
+X-LIC-LOCATION:Pacific/Kosrae
+BEGIN:STANDARD
+TZOFFSETFROM:+105156
+TZOFFSETTO:+1100
+TZNAME:KOST
+DTSTART:19010101T000000
+RDATE:19010101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1200
+TZNAME:KOST
+DTSTART:19691001T000000
+RDATE:19691001T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1100
+TZNAME:KOST
+DTSTART:19990101T000000
+RDATE:19990101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Kwajalein.ics b/libkcal/libical/zoneinfo/Pacific/Kwajalein.ics
new file mode 100644
index 00000000..9ec5dd3c
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Kwajalein.ics
@@ -0,0 +1,29 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Kwajalein
+X-LIC-LOCATION:Pacific/Kwajalein
+BEGIN:STANDARD
+TZOFFSETFROM:+110920
+TZOFFSETTO:+1100
+TZNAME:MHT
+DTSTART:19010101T000000
+RDATE:19010101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+1100
+TZOFFSETTO:-1200
+TZNAME:KWAT
+DTSTART:19691001T000000
+RDATE:19691001T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-1200
+TZOFFSETTO:+1200
+TZNAME:MHT
+DTSTART:19930820T000000
+RDATE:19930820T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Majuro.ics b/libkcal/libical/zoneinfo/Pacific/Majuro.ics
new file mode 100644
index 00000000..8c9d6fc3
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Majuro.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Majuro
+X-LIC-LOCATION:Pacific/Majuro
+BEGIN:STANDARD
+TZOFFSETFROM:+112448
+TZOFFSETTO:+1100
+TZNAME:MHT
+DTSTART:19010101T000000
+RDATE:19010101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1200
+TZNAME:MHT
+DTSTART:19691001T000000
+RDATE:19691001T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Marquesas.ics b/libkcal/libical/zoneinfo/Pacific/Marquesas.ics
new file mode 100644
index 00000000..e827d745
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Marquesas.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Marquesas
+X-LIC-LOCATION:Pacific/Marquesas
+BEGIN:STANDARD
+TZOFFSETFROM:-0918
+TZOFFSETTO:-0930
+TZNAME:MART
+DTSTART:19121001T000000
+RDATE:19121001T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Midway.ics b/libkcal/libical/zoneinfo/Pacific/Midway.ics
new file mode 100644
index 00000000..9f83ccc6
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Midway.ics
@@ -0,0 +1,43 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Midway
+X-LIC-LOCATION:Pacific/Midway
+BEGIN:STANDARD
+TZOFFSETFROM:-114928
+TZOFFSETTO:-1100
+TZNAME:NST
+DTSTART:19010101T000000
+RDATE:19010101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-1100
+TZOFFSETTO:-1000
+TZNAME:NDT
+DTSTART:19560603T000000
+RDATE:19560603T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-1000
+TZOFFSETTO:-1100
+TZNAME:NST
+DTSTART:19560902T000000
+RDATE:19560902T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-1100
+TZOFFSETTO:-1100
+TZNAME:BST
+DTSTART:19670401T000000
+RDATE:19670401T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-1100
+TZOFFSETTO:-1100
+TZNAME:SST
+DTSTART:19831130T000000
+RDATE:19831130T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Nauru.ics b/libkcal/libical/zoneinfo/Pacific/Nauru.ics
new file mode 100644
index 00000000..d3e600da
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Nauru.ics
@@ -0,0 +1,36 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Nauru
+X-LIC-LOCATION:Pacific/Nauru
+BEGIN:STANDARD
+TZOFFSETFROM:+110740
+TZOFFSETTO:+1130
+TZNAME:NRT
+DTSTART:19210115T000000
+RDATE:19210115T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+1130
+TZOFFSETTO:+0900
+TZNAME:JST
+DTSTART:19420315T000000
+RDATE:19420315T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+1130
+TZNAME:NRT
+DTSTART:19440815T000000
+RDATE:19440815T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+1130
+TZOFFSETTO:+1200
+TZNAME:NRT
+DTSTART:19790501T000000
+RDATE:19790501T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Niue.ics b/libkcal/libical/zoneinfo/Pacific/Niue.ics
new file mode 100644
index 00000000..11e0a909
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Niue.ics
@@ -0,0 +1,29 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Niue
+X-LIC-LOCATION:Pacific/Niue
+BEGIN:STANDARD
+TZOFFSETFROM:-111940
+TZOFFSETTO:-1120
+TZNAME:NUT
+DTSTART:19010101T000000
+RDATE:19010101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-1120
+TZOFFSETTO:-1130
+TZNAME:NUT
+DTSTART:19510101T000000
+RDATE:19510101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-1130
+TZOFFSETTO:-1100
+TZNAME:NUT
+DTSTART:19781001T000000
+RDATE:19781001T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Norfolk.ics b/libkcal/libical/zoneinfo/Pacific/Norfolk.ics
new file mode 100644
index 00000000..186b7743
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Norfolk.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Norfolk
+X-LIC-LOCATION:Pacific/Norfolk
+BEGIN:STANDARD
+TZOFFSETFROM:+111152
+TZOFFSETTO:+1112
+TZNAME:NMT
+DTSTART:19010101T000000
+RDATE:19010101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+1112
+TZOFFSETTO:+1130
+TZNAME:NFT
+DTSTART:19510101T000000
+RDATE:19510101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Noumea.ics b/libkcal/libical/zoneinfo/Pacific/Noumea.ics
new file mode 100644
index 00000000..fc61fb84
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Noumea.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Noumea
+X-LIC-LOCATION:Pacific/Noumea
+BEGIN:STANDARD
+TZOFFSETFROM:+110548
+TZOFFSETTO:+1100
+TZNAME:NCT
+DTSTART:19120113T000000
+RDATE:19120113T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1200
+TZNAME:NCST
+DTSTART:19771204T000000
+RDATE:19771204T000000
+RDATE:19781203T000000
+RDATE:19961201T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1100
+TZNAME:NCT
+DTSTART:19780227T000000
+RDATE:19780227T000000
+RDATE:19790227T000000
+RDATE:19970302T030000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Pago_Pago.ics b/libkcal/libical/zoneinfo/Pacific/Pago_Pago.ics
new file mode 100644
index 00000000..d46cfa32
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Pago_Pago.ics
@@ -0,0 +1,43 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Pago_Pago
+X-LIC-LOCATION:Pacific/Pago_Pago
+BEGIN:STANDARD
+TZOFFSETFROM:+123712
+TZOFFSETTO:-112248
+TZNAME:LMT
+DTSTART:18790705T000000
+RDATE:18790705T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-112248
+TZOFFSETTO:-1130
+TZNAME:SAMT
+DTSTART:19110101T000000
+RDATE:19110101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-1130
+TZOFFSETTO:-1100
+TZNAME:NST
+DTSTART:19500101T000000
+RDATE:19500101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-1100
+TZOFFSETTO:-1100
+TZNAME:BST
+DTSTART:19670401T000000
+RDATE:19670401T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-1100
+TZOFFSETTO:-1100
+TZNAME:SST
+DTSTART:19831130T000000
+RDATE:19831130T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Palau.ics b/libkcal/libical/zoneinfo/Pacific/Palau.ics
new file mode 100644
index 00000000..3ab5df8f
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Palau.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Palau
+X-LIC-LOCATION:Pacific/Palau
+BEGIN:STANDARD
+TZOFFSETFROM:+085756
+TZOFFSETTO:+0900
+TZNAME:PWT
+DTSTART:19010101T000000
+RDATE:19010101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Pitcairn.ics b/libkcal/libical/zoneinfo/Pacific/Pitcairn.ics
new file mode 100644
index 00000000..13b9b743
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Pitcairn.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Pitcairn
+X-LIC-LOCATION:Pacific/Pitcairn
+BEGIN:STANDARD
+TZOFFSETFROM:-084020
+TZOFFSETTO:-0830
+TZNAME:PNT
+DTSTART:19010101T000000
+RDATE:19010101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:-0830
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19980427T000000
+RDATE:19980427T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Ponape.ics b/libkcal/libical/zoneinfo/Pacific/Ponape.ics
new file mode 100644
index 00000000..0aeb6fac
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Ponape.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Ponape
+X-LIC-LOCATION:Pacific/Ponape
+BEGIN:STANDARD
+TZOFFSETFROM:+103252
+TZOFFSETTO:+1100
+TZNAME:PONT
+DTSTART:19010101T000000
+RDATE:19010101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Port_Moresby.ics b/libkcal/libical/zoneinfo/Pacific/Port_Moresby.ics
new file mode 100644
index 00000000..eb782f1a
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Port_Moresby.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Port_Moresby
+X-LIC-LOCATION:Pacific/Port_Moresby
+BEGIN:STANDARD
+TZOFFSETFROM:+094840
+TZOFFSETTO:+094832
+TZNAME:PMMT
+DTSTART:18800101T000000
+RDATE:18800101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+094832
+TZOFFSETTO:+1000
+TZNAME:PGT
+DTSTART:18950101T000000
+RDATE:18950101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Rarotonga.ics b/libkcal/libical/zoneinfo/Pacific/Rarotonga.ics
new file mode 100644
index 00000000..e074a0be
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Rarotonga.ics
@@ -0,0 +1,59 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Rarotonga
+X-LIC-LOCATION:Pacific/Rarotonga
+BEGIN:STANDARD
+TZOFFSETFROM:-103904
+TZOFFSETTO:-1030
+TZNAME:CKT
+DTSTART:19010101T000000
+RDATE:19010101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-1030
+TZOFFSETTO:-0930
+TZNAME:CKHST
+DTSTART:19781112T000000
+RDATE:19781112T000000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0930
+TZOFFSETTO:-1000
+TZNAME:CKT
+DTSTART:19790304T000000
+RDATE:19790304T000000
+RDATE:19800302T000000
+RDATE:19810301T000000
+RDATE:19820307T000000
+RDATE:19830306T000000
+RDATE:19840304T000000
+RDATE:19850303T000000
+RDATE:19860302T000000
+RDATE:19870301T000000
+RDATE:19880306T000000
+RDATE:19890305T000000
+RDATE:19900304T000000
+RDATE:19910303T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-1000
+TZOFFSETTO:-0930
+TZNAME:CKHST
+DTSTART:19791028T000000
+RDATE:19791028T000000
+RDATE:19801026T000000
+RDATE:19811025T000000
+RDATE:19821031T000000
+RDATE:19831030T000000
+RDATE:19841028T000000
+RDATE:19851027T000000
+RDATE:19861026T000000
+RDATE:19871025T000000
+RDATE:19881030T000000
+RDATE:19891029T000000
+RDATE:19901028T000000
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Saipan.ics b/libkcal/libical/zoneinfo/Pacific/Saipan.ics
new file mode 100644
index 00000000..b26a4381
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Saipan.ics
@@ -0,0 +1,36 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Saipan
+X-LIC-LOCATION:Pacific/Saipan
+BEGIN:STANDARD
+TZOFFSETFROM:-1417
+TZOFFSETTO:+0943
+TZNAME:LMT
+DTSTART:18441231T000000
+RDATE:18441231T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0943
+TZOFFSETTO:+0900
+TZNAME:MPT
+DTSTART:19010101T000000
+RDATE:19010101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+1000
+TZNAME:MPT
+DTSTART:19691001T000000
+RDATE:19691001T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1000
+TZNAME:ChST
+DTSTART:20001223T000000
+RDATE:20001223T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Tahiti.ics b/libkcal/libical/zoneinfo/Pacific/Tahiti.ics
new file mode 100644
index 00000000..61ad21c4
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Tahiti.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Tahiti
+X-LIC-LOCATION:Pacific/Tahiti
+BEGIN:STANDARD
+TZOFFSETFROM:-095816
+TZOFFSETTO:-1000
+TZNAME:TAHT
+DTSTART:19121001T000000
+RDATE:19121001T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Tarawa.ics b/libkcal/libical/zoneinfo/Pacific/Tarawa.ics
new file mode 100644
index 00000000..084dd648
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Tarawa.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Tarawa
+X-LIC-LOCATION:Pacific/Tarawa
+BEGIN:STANDARD
+TZOFFSETFROM:+113204
+TZOFFSETTO:+1200
+TZNAME:GILT
+DTSTART:19010101T000000
+RDATE:19010101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Tongatapu.ics b/libkcal/libical/zoneinfo/Pacific/Tongatapu.ics
new file mode 100644
index 00000000..b5ccc03f
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Tongatapu.ics
@@ -0,0 +1,47 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Tongatapu
+X-LIC-LOCATION:Pacific/Tongatapu
+BEGIN:STANDARD
+TZOFFSETFROM:+121920
+TZOFFSETTO:+1220
+TZNAME:TOT
+DTSTART:19010101T000000
+RDATE:19010101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+1220
+TZOFFSETTO:+1300
+TZNAME:TOT
+DTSTART:19410101T000000
+RDATE:19410101T000000
+END:STANDARD
+BEGIN:STANDARD
+TZOFFSETFROM:+1300
+TZOFFSETTO:+1300
+TZNAME:TOT
+DTSTART:19990101T000000
+RDATE:19990101T000000
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1300
+TZOFFSETTO:+1400
+TZNAME:TOST
+DTSTART:19991007T020000
+RDATE:19991007T020000
+RDATE:20001105T020000
+RDATE:20011104T020000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1400
+TZOFFSETTO:+1300
+TZNAME:TOT
+DTSTART:20000319T030000
+RDATE:20000319T030000
+RDATE:20010128T020000
+RDATE:20020127T020000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Truk.ics b/libkcal/libical/zoneinfo/Pacific/Truk.ics
new file mode 100644
index 00000000..a4183533
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Truk.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Truk
+X-LIC-LOCATION:Pacific/Truk
+BEGIN:STANDARD
+TZOFFSETFROM:+100708
+TZOFFSETTO:+1000
+TZNAME:TRUT
+DTSTART:19010101T000000
+RDATE:19010101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Wake.ics b/libkcal/libical/zoneinfo/Pacific/Wake.ics
new file mode 100644
index 00000000..c4ab5bc4
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Wake.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Wake
+X-LIC-LOCATION:Pacific/Wake
+BEGIN:STANDARD
+TZOFFSETFROM:+110628
+TZOFFSETTO:+1200
+TZNAME:WAKT
+DTSTART:19010101T000000
+RDATE:19010101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/Pacific/Wallis.ics b/libkcal/libical/zoneinfo/Pacific/Wallis.ics
new file mode 100644
index 00000000..83d5d3f0
--- /dev/null
+++ b/libkcal/libical/zoneinfo/Pacific/Wallis.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//KDE//NONSGML KCal Olson-VTIMEZONE Converter//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/kde.org/Olson_20080523_1/Pacific/Wallis
+X-LIC-LOCATION:Pacific/Wallis
+BEGIN:STANDARD
+TZOFFSETFROM:+121520
+TZOFFSETTO:+1200
+TZNAME:WFT
+DTSTART:19010101T000000
+RDATE:19010101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/libkcal/libical/zoneinfo/zones.h b/libkcal/libical/zoneinfo/zones.h
new file mode 100644
index 00000000..46c09b16
--- /dev/null
+++ b/libkcal/libical/zoneinfo/zones.h
@@ -0,0 +1,401 @@
+N_("Africa/Abidjan");
+N_("Africa/Accra");
+N_("Africa/Addis_Ababa");
+N_("Africa/Algiers");
+N_("Africa/Asmara");
+N_("Africa/Bamako");
+N_("Africa/Bangui");
+N_("Africa/Banjul");
+N_("Africa/Bissau");
+N_("Africa/Blantyre");
+N_("Africa/Brazzaville");
+N_("Africa/Bujumbura");
+N_("Africa/Cairo");
+N_("Africa/Casablanca");
+N_("Africa/Ceuta");
+N_("Africa/Conakry");
+N_("Africa/Dakar");
+N_("Africa/Dar_es_Salaam");
+N_("Africa/Djibouti");
+N_("Africa/Douala");
+N_("Africa/El_Aaiun");
+N_("Africa/Freetown");
+N_("Africa/Gaborone");
+N_("Africa/Harare");
+N_("Africa/Johannesburg");
+N_("Africa/Kampala");
+N_("Africa/Khartoum");
+N_("Africa/Kigali");
+N_("Africa/Kinshasa");
+N_("Africa/Lagos");
+N_("Africa/Libreville");
+N_("Africa/Lome");
+N_("Africa/Luanda");
+N_("Africa/Lubumbashi");
+N_("Africa/Lusaka");
+N_("Africa/Malabo");
+N_("Africa/Maputo");
+N_("Africa/Maseru");
+N_("Africa/Mbabane");
+N_("Africa/Mogadishu");
+N_("Africa/Monrovia");
+N_("Africa/Nairobi");
+N_("Africa/Ndjamena");
+N_("Africa/Niamey");
+N_("Africa/Nouakchott");
+N_("Africa/Ouagadougou");
+N_("Africa/Porto-Novo");
+N_("Africa/Sao_Tome");
+N_("Africa/Tripoli");
+N_("Africa/Tunis");
+N_("Africa/Windhoek");
+N_("America/Adak");
+N_("America/Anchorage");
+N_("America/Anguilla");
+N_("America/Antigua");
+N_("America/Araguaina");
+N_("America/Argentina/Buenos_Aires");
+N_("America/Argentina/Catamarca");
+N_("America/Argentina/Cordoba");
+N_("America/Argentina/Jujuy");
+N_("America/Argentina/La_Rioja");
+N_("America/Argentina/Mendoza");
+N_("America/Argentina/Rio_Gallegos");
+N_("America/Argentina/San_Juan");
+N_("America/Argentina/San_Luis");
+N_("America/Argentina/Tucuman");
+N_("America/Argentina/Ushuaia");
+N_("America/Aruba");
+N_("America/Asuncion");
+N_("America/Atikokan");
+N_("America/Bahia");
+N_("America/Barbados");
+N_("America/Belem");
+N_("America/Belize");
+N_("America/Blanc-Sablon");
+N_("America/Boa_Vista");
+N_("America/Bogota");
+N_("America/Boise");
+N_("America/Cambridge_Bay");
+N_("America/Campo_Grande");
+N_("America/Cancun");
+N_("America/Caracas");
+N_("America/Cayenne");
+N_("America/Cayman");
+N_("America/Chicago");
+N_("America/Chihuahua");
+N_("America/Costa_Rica");
+N_("America/Cuiaba");
+N_("America/Curacao");
+N_("America/Danmarkshavn");
+N_("America/Dawson");
+N_("America/Dawson_Creek");
+N_("America/Denver");
+N_("America/Detroit");
+N_("America/Dominica");
+N_("America/Edmonton");
+N_("America/Eirunepe");
+N_("America/El_Salvador");
+N_("America/Fortaleza");
+N_("America/Glace_Bay");
+N_("America/Godthab");
+N_("America/Goose_Bay");
+N_("America/Grand_Turk");
+N_("America/Grenada");
+N_("America/Guadeloupe");
+N_("America/Guatemala");
+N_("America/Guayaquil");
+N_("America/Guyana");
+N_("America/Halifax");
+N_("America/Havana");
+N_("America/Hermosillo");
+N_("America/Indiana/Indianapolis");
+N_("America/Indiana/Knox");
+N_("America/Indiana/Marengo");
+N_("America/Indiana/Petersburg");
+N_("America/Indiana/Tell_City");
+N_("America/Indiana/Vevay");
+N_("America/Indiana/Vincennes");
+N_("America/Indiana/Winamac");
+N_("America/Inuvik");
+N_("America/Iqaluit");
+N_("America/Jamaica");
+N_("America/Juneau");
+N_("America/Kentucky/Louisville");
+N_("America/Kentucky/Monticello");
+N_("America/La_Paz");
+N_("America/Lima");
+N_("America/Los_Angeles");
+N_("America/Maceio");
+N_("America/Managua");
+N_("America/Manaus");
+N_("America/Marigot");
+N_("America/Martinique");
+N_("America/Mazatlan");
+N_("America/Menominee");
+N_("America/Merida");
+N_("America/Mexico_City");
+N_("America/Miquelon");
+N_("America/Moncton");
+N_("America/Monterrey");
+N_("America/Montevideo");
+N_("America/Montreal");
+N_("America/Montserrat");
+N_("America/Nassau");
+N_("America/New_York");
+N_("America/Nipigon");
+N_("America/Nome");
+N_("America/Noronha");
+N_("America/North_Dakota/Center");
+N_("America/North_Dakota/New_Salem");
+N_("America/Panama");
+N_("America/Pangnirtung");
+N_("America/Paramaribo");
+N_("America/Phoenix");
+N_("America/Port-au-Prince");
+N_("America/Port_of_Spain");
+N_("America/Porto_Velho");
+N_("America/Puerto_Rico");
+N_("America/Rainy_River");
+N_("America/Rankin_Inlet");
+N_("America/Recife");
+N_("America/Regina");
+N_("America/Resolute");
+N_("America/Rio_Branco");
+N_("America/Santiago");
+N_("America/Santo_Domingo");
+N_("America/Sao_Paulo");
+N_("America/Scoresbysund");
+N_("America/Shiprock");
+N_("America/St_Barthelemy");
+N_("America/St_Johns");
+N_("America/St_Kitts");
+N_("America/St_Lucia");
+N_("America/St_Thomas");
+N_("America/St_Vincent");
+N_("America/Swift_Current");
+N_("America/Tegucigalpa");
+N_("America/Thule");
+N_("America/Thunder_Bay");
+N_("America/Tijuana");
+N_("America/Toronto");
+N_("America/Tortola");
+N_("America/Vancouver");
+N_("America/Whitehorse");
+N_("America/Winnipeg");
+N_("America/Yakutat");
+N_("America/Yellowknife");
+N_("Antarctica/Casey");
+N_("Antarctica/Davis");
+N_("Antarctica/DumontDUrville");
+N_("Antarctica/Mawson");
+N_("Antarctica/McMurdo");
+N_("Antarctica/Palmer");
+N_("Antarctica/Rothera");
+N_("Antarctica/South_Pole");
+N_("Antarctica/Syowa");
+N_("Antarctica/Vostok");
+N_("Arctic/Longyearbyen");
+N_("Asia/Aden");
+N_("Asia/Almaty");
+N_("Asia/Amman");
+N_("Asia/Anadyr");
+N_("Asia/Aqtau");
+N_("Asia/Aqtobe");
+N_("Asia/Ashgabat");
+N_("Asia/Baghdad");
+N_("Asia/Bahrain");
+N_("Asia/Baku");
+N_("Asia/Bangkok");
+N_("Asia/Beirut");
+N_("Asia/Bishkek");
+N_("Asia/Brunei");
+N_("Asia/Choibalsan");
+N_("Asia/Chongqing");
+N_("Asia/Colombo");
+N_("Asia/Damascus");
+N_("Asia/Dhaka");
+N_("Asia/Dili");
+N_("Asia/Dubai");
+N_("Asia/Dushanbe");
+N_("Asia/Gaza");
+N_("Asia/Harbin");
+N_("Asia/Ho_Chi_Minh");
+N_("Asia/Hong_Kong");
+N_("Asia/Hovd");
+N_("Asia/Irkutsk");
+N_("Asia/Istanbul");
+N_("Asia/Jakarta");
+N_("Asia/Jayapura");
+N_("Asia/Jerusalem");
+N_("Asia/Kabul");
+N_("Asia/Kamchatka");
+N_("Asia/Karachi");
+N_("Asia/Kashgar");
+N_("Asia/Katmandu");
+N_("Asia/Kolkata");
+N_("Asia/Krasnoyarsk");
+N_("Asia/Kuala_Lumpur");
+N_("Asia/Kuching");
+N_("Asia/Kuwait");
+N_("Asia/Macau");
+N_("Asia/Magadan");
+N_("Asia/Makassar");
+N_("Asia/Manila");
+N_("Asia/Muscat");
+N_("Asia/Nicosia");
+N_("Asia/Novosibirsk");
+N_("Asia/Omsk");
+N_("Asia/Oral");
+N_("Asia/Phnom_Penh");
+N_("Asia/Pontianak");
+N_("Asia/Pyongyang");
+N_("Asia/Qatar");
+N_("Asia/Qyzylorda");
+N_("Asia/Rangoon");
+N_("Asia/Riyadh");
+N_("Asia/Sakhalin");
+N_("Asia/Samarkand");
+N_("Asia/Seoul");
+N_("Asia/Shanghai");
+N_("Asia/Singapore");
+N_("Asia/Taipei");
+N_("Asia/Tashkent");
+N_("Asia/Tbilisi");
+N_("Asia/Tehran");
+N_("Asia/Thimphu");
+N_("Asia/Tokyo");
+N_("Asia/Ulaanbaatar");
+N_("Asia/Urumqi");
+N_("Asia/Vientiane");
+N_("Asia/Vladivostok");
+N_("Asia/Yakutsk");
+N_("Asia/Yekaterinburg");
+N_("Asia/Yerevan");
+N_("Atlantic/Azores");
+N_("Atlantic/Bermuda");
+N_("Atlantic/Canary");
+N_("Atlantic/Cape_Verde");
+N_("Atlantic/Faroe");
+N_("Atlantic/Madeira");
+N_("Atlantic/Reykjavik");
+N_("Atlantic/South_Georgia");
+N_("Atlantic/St_Helena");
+N_("Atlantic/Stanley");
+N_("Australia/Adelaide");
+N_("Australia/Brisbane");
+N_("Australia/Broken_Hill");
+N_("Australia/Currie");
+N_("Australia/Darwin");
+N_("Australia/Eucla");
+N_("Australia/Hobart");
+N_("Australia/Lindeman");
+N_("Australia/Lord_Howe");
+N_("Australia/Melbourne");
+N_("Australia/Perth");
+N_("Australia/Sydney");
+N_("Europe/Amsterdam");
+N_("Europe/Andorra");
+N_("Europe/Athens");
+N_("Europe/Belgrade");
+N_("Europe/Berlin");
+N_("Europe/Bratislava");
+N_("Europe/Brussels");
+N_("Europe/Bucharest");
+N_("Europe/Budapest");
+N_("Europe/Chisinau");
+N_("Europe/Copenhagen");
+N_("Europe/Dublin");
+N_("Europe/Gibraltar");
+N_("Europe/Guernsey");
+N_("Europe/Helsinki");
+N_("Europe/Isle_of_Man");
+N_("Europe/Istanbul");
+N_("Europe/Jersey");
+N_("Europe/Kaliningrad");
+N_("Europe/Kiev");
+N_("Europe/Lisbon");
+N_("Europe/Ljubljana");
+N_("Europe/London");
+N_("Europe/Luxembourg");
+N_("Europe/Madrid");
+N_("Europe/Malta");
+N_("Europe/Mariehamn");
+N_("Europe/Minsk");
+N_("Europe/Monaco");
+N_("Europe/Moscow");
+N_("Europe/Nicosia");
+N_("Europe/Oslo");
+N_("Europe/Paris");
+N_("Europe/Podgorica");
+N_("Europe/Prague");
+N_("Europe/Riga");
+N_("Europe/Rome");
+N_("Europe/Samara");
+N_("Europe/San_Marino");
+N_("Europe/Sarajevo");
+N_("Europe/Simferopol");
+N_("Europe/Skopje");
+N_("Europe/Sofia");
+N_("Europe/Stockholm");
+N_("Europe/Tallinn");
+N_("Europe/Tirane");
+N_("Europe/Uzhgorod");
+N_("Europe/Vaduz");
+N_("Europe/Vatican");
+N_("Europe/Vienna");
+N_("Europe/Vilnius");
+N_("Europe/Volgograd");
+N_("Europe/Warsaw");
+N_("Europe/Zagreb");
+N_("Europe/Zaporozhye");
+N_("Europe/Zurich");
+N_("Indian/Antananarivo");
+N_("Indian/Chagos");
+N_("Indian/Christmas");
+N_("Indian/Cocos");
+N_("Indian/Comoro");
+N_("Indian/Kerguelen");
+N_("Indian/Mahe");
+N_("Indian/Maldives");
+N_("Indian/Mauritius");
+N_("Indian/Mayotte");
+N_("Indian/Reunion");
+N_("Pacific/Apia");
+N_("Pacific/Auckland");
+N_("Pacific/Chatham");
+N_("Pacific/Easter");
+N_("Pacific/Efate");
+N_("Pacific/Enderbury");
+N_("Pacific/Fakaofo");
+N_("Pacific/Fiji");
+N_("Pacific/Funafuti");
+N_("Pacific/Galapagos");
+N_("Pacific/Gambier");
+N_("Pacific/Guadalcanal");
+N_("Pacific/Guam");
+N_("Pacific/Honolulu");
+N_("Pacific/Johnston");
+N_("Pacific/Kiritimati");
+N_("Pacific/Kosrae");
+N_("Pacific/Kwajalein");
+N_("Pacific/Majuro");
+N_("Pacific/Marquesas");
+N_("Pacific/Midway");
+N_("Pacific/Nauru");
+N_("Pacific/Niue");
+N_("Pacific/Norfolk");
+N_("Pacific/Noumea");
+N_("Pacific/Pago_Pago");
+N_("Pacific/Palau");
+N_("Pacific/Pitcairn");
+N_("Pacific/Ponape");
+N_("Pacific/Port_Moresby");
+N_("Pacific/Rarotonga");
+N_("Pacific/Saipan");
+N_("Pacific/Tahiti");
+N_("Pacific/Tarawa");
+N_("Pacific/Tongatapu");
+N_("Pacific/Truk");
+N_("Pacific/Wake");
+N_("Pacific/Wallis");
diff --git a/libkcal/libical/zoneinfo/zones.tab b/libkcal/libical/zoneinfo/zones.tab
new file mode 100644
index 00000000..1aae2c41
--- /dev/null
+++ b/libkcal/libical/zoneinfo/zones.tab
@@ -0,0 +1,401 @@
++0051900 -0040200 Africa/Abidjan
++0053300 +0001300 Africa/Accra
++0090200 +0384200 Africa/Addis_Ababa
++0364700 +0030300 Africa/Algiers
++0152000 +0385300 Africa/Asmara
++0123900 -0080000 Africa/Bamako
++0042200 +0183500 Africa/Bangui
++0132800 -0163900 Africa/Banjul
++0115100 -0153500 Africa/Bissau
+-0154700 +0350000 Africa/Blantyre
+-0041600 +0151700 Africa/Brazzaville
+-0032300 +0292200 Africa/Bujumbura
++0300300 +0311500 Africa/Cairo
++0333900 -0073500 Africa/Casablanca
++0355300 -0051900 Africa/Ceuta
++0093100 -0134300 Africa/Conakry
++0144000 -0172600 Africa/Dakar
+-0064800 +0391700 Africa/Dar_es_Salaam
++0113600 +0430900 Africa/Djibouti
++0040300 +0094200 Africa/Douala
++0270900 -0131200 Africa/El_Aaiun
++0083000 -0131500 Africa/Freetown
+-0254500 +0255500 Africa/Gaborone
+-0175000 +0310300 Africa/Harare
+-0261500 +0280000 Africa/Johannesburg
++0001900 +0322500 Africa/Kampala
++0153600 +0323200 Africa/Khartoum
+-0015700 +0300400 Africa/Kigali
+-0041800 +0151800 Africa/Kinshasa
++0062700 +0032400 Africa/Lagos
++0002300 +0092700 Africa/Libreville
++0060800 +0011300 Africa/Lome
+-0084800 +0131400 Africa/Luanda
+-0114000 +0272800 Africa/Lubumbashi
+-0152500 +0281700 Africa/Lusaka
++0034500 +0084700 Africa/Malabo
+-0255800 +0323500 Africa/Maputo
+-0292800 +0273000 Africa/Maseru
+-0261800 +0310600 Africa/Mbabane
++0020400 +0452200 Africa/Mogadishu
++0061800 -0104700 Africa/Monrovia
+-0011700 +0364900 Africa/Nairobi
++0120700 +0150300 Africa/Ndjamena
++0133100 +0020700 Africa/Niamey
++0180600 -0155700 Africa/Nouakchott
++0122200 -0013100 Africa/Ouagadougou
++0062900 +0023700 Africa/Porto-Novo
++0002000 +0064400 Africa/Sao_Tome
++0325400 +0131100 Africa/Tripoli
++0364800 +0101100 Africa/Tunis
+-0223400 +0170600 Africa/Windhoek
++0515248 -1763929 America/Adak
++0611305 -1495401 America/Anchorage
++0181200 -0630400 America/Anguilla
++0170300 -0614800 America/Antigua
+-0071200 -0481200 America/Araguaina
+-0343600 -0582700 America/Argentina/Buenos_Aires
+-0282800 -0654700 America/Argentina/Catamarca
+-0312400 -0641100 America/Argentina/Cordoba
+-0241100 -0651800 America/Argentina/Jujuy
+-0292600 -0665100 America/Argentina/La_Rioja
+-0325300 -0684900 America/Argentina/Mendoza
+-0513800 -0691300 America/Argentina/Rio_Gallegos
+-0313200 -0683100 America/Argentina/San_Juan
+-0331900 -0662100 America/Argentina/San_Luis
+-0264900 -0651300 America/Argentina/Tucuman
+-0544800 -0681800 America/Argentina/Ushuaia
++0123000 -0695800 America/Aruba
+-0251600 -0574000 America/Asuncion
++0484531 -0913718 America/Atikokan
+-0125900 -0383100 America/Bahia
++0130600 -0593700 America/Barbados
+-0012700 -0482900 America/Belem
++0173000 -0881200 America/Belize
++0512500 -0570700 America/Blanc-Sablon
++0024900 -0604000 America/Boa_Vista
++0043600 -0740500 America/Bogota
++0433649 -1161209 America/Boise
++0690650 -1050310 America/Cambridge_Bay
+-0202700 -0543700 America/Campo_Grande
++0210500 -0864600 America/Cancun
++0103000 -0665600 America/Caracas
++0045600 -0522000 America/Cayenne
++0191800 -0812300 America/Cayman
++0415100 -0873900 America/Chicago
++0283800 -1060500 America/Chihuahua
++0095600 -0840500 America/Costa_Rica
+-0153500 -0560500 America/Cuiaba
++0121100 -0690000 America/Curacao
++0764600 -0184000 America/Danmarkshavn
++0640400 -1392500 America/Dawson
++0594600 -1201400 America/Dawson_Creek
++0394421 -1045903 America/Denver
++0421953 -0830245 America/Detroit
++0151800 -0612400 America/Dominica
++0533300 -1132800 America/Edmonton
+-0064000 -0695200 America/Eirunepe
++0134200 -0891200 America/El_Salvador
+-0034300 -0383000 America/Fortaleza
++0461200 -0595700 America/Glace_Bay
++0641100 -0514400 America/Godthab
++0532000 -0602500 America/Goose_Bay
++0212800 -0710800 America/Grand_Turk
++0120300 -0614500 America/Grenada
++0161400 -0613200 America/Guadeloupe
++0143800 -0903100 America/Guatemala
+-0021000 -0795000 America/Guayaquil
++0064800 -0581000 America/Guyana
++0443900 -0633600 America/Halifax
++0230800 -0822200 America/Havana
++0290400 -1105800 America/Hermosillo
++0394606 -0860929 America/Indiana/Indianapolis
++0411745 -0863730 America/Indiana/Knox
++0382232 -0862041 America/Indiana/Marengo
++0382931 -0871643 America/Indiana/Petersburg
++0375711 -0864541 America/Indiana/Tell_City
++0384452 -0850402 America/Indiana/Vevay
++0384038 -0873143 America/Indiana/Vincennes
++0410305 -0863611 America/Indiana/Winamac
++0682059 -1334300 America/Inuvik
++0634400 -0682800 America/Iqaluit
++0180000 -0764800 America/Jamaica
++0581807 -1342511 America/Juneau
++0381515 -0854534 America/Kentucky/Louisville
++0364947 -0845057 America/Kentucky/Monticello
+-0163000 -0680900 America/La_Paz
+-0120300 -0770300 America/Lima
++0340308 -1181434 America/Los_Angeles
+-0094000 -0354300 America/Maceio
++0120900 -0861700 America/Managua
+-0030800 -0600100 America/Manaus
++0180400 -0630500 America/Marigot
++0143600 -0610500 America/Martinique
++0231300 -1062500 America/Mazatlan
++0450628 -0873651 America/Menominee
++0205800 -0893700 America/Merida
++0192400 -0990900 America/Mexico_City
++0470300 -0562000 America/Miquelon
++0460600 -0644700 America/Moncton
++0254000 -1001900 America/Monterrey
+-0345300 -0561100 America/Montevideo
++0453100 -0733400 America/Montreal
++0164300 -0621300 America/Montserrat
++0250500 -0772100 America/Nassau
++0404251 -0740023 America/New_York
++0490100 -0881600 America/Nipigon
++0643004 -1652423 America/Nome
+-0035100 -0322500 America/Noronha
++0470659 -1011757 America/North_Dakota/Center
++0465042 -1012439 America/North_Dakota/New_Salem
++0085800 -0793200 America/Panama
++0660800 -0654400 America/Pangnirtung
++0055000 -0551000 America/Paramaribo
++0332654 -1120424 America/Phoenix
++0183200 -0722000 America/Port-au-Prince
++0103900 -0613100 America/Port_of_Spain
+-0084600 -0635400 America/Porto_Velho
++0182806 -0660622 America/Puerto_Rico
++0484300 -0943400 America/Rainy_River
++0624900 -0920459 America/Rankin_Inlet
+-0080300 -0345400 America/Recife
++0502400 -1043900 America/Regina
++0744144 -0944945 America/Resolute
+-0095800 -0674800 America/Rio_Branco
+-0332700 -0704000 America/Santiago
++0182800 -0695400 America/Santo_Domingo
+-0233200 -0463700 America/Sao_Paulo
++0702900 -0215800 America/Scoresbysund
++0364708 -1084111 America/Shiprock
++0175300 -0625100 America/St_Barthelemy
++0473400 -0524300 America/St_Johns
++0171800 -0624300 America/St_Kitts
++0140100 -0610000 America/St_Lucia
++0182100 -0645600 America/St_Thomas
++0130900 -0611400 America/St_Vincent
++0501700 -1075000 America/Swift_Current
++0140600 -0871300 America/Tegucigalpa
++0763400 -0684700 America/Thule
++0482300 -0891500 America/Thunder_Bay
++0323200 -1170100 America/Tijuana
++0433900 -0792300 America/Toronto
++0182700 -0643700 America/Tortola
++0491600 -1230700 America/Vancouver
++0604300 -1350300 America/Whitehorse
++0495300 -0970900 America/Winnipeg
++0593249 -1394338 America/Yakutat
++0622700 -1142100 America/Yellowknife
+-0661700 +1103100 Antarctica/Casey
+-0683500 +0775800 Antarctica/Davis
+-0664000 +1400100 Antarctica/DumontDUrville
+-0673600 +0625300 Antarctica/Mawson
+-0775000 +1663600 Antarctica/McMurdo
+-0644800 -0640600 Antarctica/Palmer
+-0673400 -0680800 Antarctica/Rothera
+-0900000 +0000000 Antarctica/South_Pole
+-0690022 +0393524 Antarctica/Syowa
+-0782400 +1065400 Antarctica/Vostok
++0780000 +0160000 Arctic/Longyearbyen
++0124500 +0451200 Asia/Aden
++0431500 +0765700 Asia/Almaty
++0315700 +0355600 Asia/Amman
++0644500 +1772900 Asia/Anadyr
++0443100 +0501600 Asia/Aqtau
++0501700 +0571000 Asia/Aqtobe
++0375700 +0582300 Asia/Ashgabat
++0332100 +0442500 Asia/Baghdad
++0262300 +0503500 Asia/Bahrain
++0402300 +0495100 Asia/Baku
++0134500 +1003100 Asia/Bangkok
++0335300 +0353000 Asia/Beirut
++0425400 +0743600 Asia/Bishkek
++0045600 +1145500 Asia/Brunei
++0480400 +1143000 Asia/Choibalsan
++0293400 +1063500 Asia/Chongqing
++0065600 +0795100 Asia/Colombo
++0333000 +0361800 Asia/Damascus
++0234300 +0902500 Asia/Dhaka
+-0083300 +1253500 Asia/Dili
++0251800 +0551800 Asia/Dubai
++0383500 +0684800 Asia/Dushanbe
++0313000 +0342800 Asia/Gaza
++0454500 +1264100 Asia/Harbin
++0104500 +1064000 Asia/Ho_Chi_Minh
++0221700 +1140900 Asia/Hong_Kong
++0480100 +0913900 Asia/Hovd
++0521600 +1042000 Asia/Irkutsk
++0410100 +0285800 Asia/Istanbul
+-0061000 +1064800 Asia/Jakarta
+-0023200 +1404200 Asia/Jayapura
++0314600 +0351400 Asia/Jerusalem
++0343100 +0691200 Asia/Kabul
++0530100 +1583900 Asia/Kamchatka
++0245200 +0670300 Asia/Karachi
++0392900 +0755900 Asia/Kashgar
++0274300 +0851900 Asia/Katmandu
++0223200 +0882200 Asia/Kolkata
++0560100 +0925000 Asia/Krasnoyarsk
++0031000 +1014200 Asia/Kuala_Lumpur
++0013300 +1102000 Asia/Kuching
++0292000 +0475900 Asia/Kuwait
++0221400 +1133500 Asia/Macau
++0593400 +1504800 Asia/Magadan
+-0050700 +1192400 Asia/Makassar
++0143500 +1210000 Asia/Manila
++0233600 +0583500 Asia/Muscat
++0351000 +0332200 Asia/Nicosia
++0550200 +0825500 Asia/Novosibirsk
++0550000 +0732400 Asia/Omsk
++0511300 +0512100 Asia/Oral
++0113300 +1045500 Asia/Phnom_Penh
++0000200 +1092000 Asia/Pontianak
++0390100 +1254500 Asia/Pyongyang
++0251700 +0513200 Asia/Qatar
++0444800 +0652800 Asia/Qyzylorda
++0164700 +0961000 Asia/Rangoon
++0243800 +0464300 Asia/Riyadh
++0465800 +1424200 Asia/Sakhalin
++0394000 +0664800 Asia/Samarkand
++0373300 +1265800 Asia/Seoul
++0311400 +1212800 Asia/Shanghai
++0011700 +1035100 Asia/Singapore
++0250300 +1213000 Asia/Taipei
++0412000 +0691800 Asia/Tashkent
++0414300 +0444900 Asia/Tbilisi
++0354000 +0512600 Asia/Tehran
++0272800 +0893900 Asia/Thimphu
++0353916 +1394441 Asia/Tokyo
++0475500 +1065300 Asia/Ulaanbaatar
++0434800 +0873500 Asia/Urumqi
++0175800 +1023600 Asia/Vientiane
++0431000 +1315600 Asia/Vladivostok
++0620000 +1294000 Asia/Yakutsk
++0565100 +0603600 Asia/Yekaterinburg
++0401100 +0443000 Asia/Yerevan
++0374400 -0254000 Atlantic/Azores
++0321700 -0644600 Atlantic/Bermuda
++0280600 -0152400 Atlantic/Canary
++0145500 -0233100 Atlantic/Cape_Verde
++0620100 -0064600 Atlantic/Faroe
++0323800 -0165400 Atlantic/Madeira
++0640900 -0215100 Atlantic/Reykjavik
+-0541600 -0363200 Atlantic/South_Georgia
+-0155500 -0054200 Atlantic/St_Helena
+-0514200 -0575100 Atlantic/Stanley
+-0345500 +1383500 Australia/Adelaide
+-0272800 +1530200 Australia/Brisbane
+-0315700 +1412700 Australia/Broken_Hill
+-0395600 +1435200 Australia/Currie
+-0122800 +1305000 Australia/Darwin
+-0314300 +1285200 Australia/Eucla
+-0425300 +1471900 Australia/Hobart
+-0201600 +1490000 Australia/Lindeman
+-0313300 +1590500 Australia/Lord_Howe
+-0374900 +1445800 Australia/Melbourne
+-0315700 +1155100 Australia/Perth
+-0335200 +1511300 Australia/Sydney
++0522200 +0045400 Europe/Amsterdam
++0423000 +0013100 Europe/Andorra
++0375800 +0234300 Europe/Athens
++0445000 +0203000 Europe/Belgrade
++0523000 +0132200 Europe/Berlin
++0480900 +0170700 Europe/Bratislava
++0505000 +0042000 Europe/Brussels
++0442600 +0260600 Europe/Bucharest
++0473000 +0190500 Europe/Budapest
++0470000 +0285000 Europe/Chisinau
++0554000 +0123500 Europe/Copenhagen
++0532000 -0061500 Europe/Dublin
++0360800 -0052100 Europe/Gibraltar
++0492700 -0023200 Europe/Guernsey
++0601000 +0245800 Europe/Helsinki
++0540900 -0042800 Europe/Isle_of_Man
++0410100 +0285800 Europe/Istanbul
++0491200 -0020700 Europe/Jersey
++0544300 +0203000 Europe/Kaliningrad
++0502600 +0303100 Europe/Kiev
++0384300 -0090800 Europe/Lisbon
++0460300 +0143100 Europe/Ljubljana
++0513030 +0000731 Europe/London
++0493600 +0060900 Europe/Luxembourg
++0402400 -0034100 Europe/Madrid
++0355400 +0143100 Europe/Malta
++0600600 +0195700 Europe/Mariehamn
++0535400 +0273400 Europe/Minsk
++0434200 +0072300 Europe/Monaco
++0554500 +0373500 Europe/Moscow
++0351000 +0332200 Europe/Nicosia
++0595500 +0104500 Europe/Oslo
++0485200 +0022000 Europe/Paris
++0422600 +0191600 Europe/Podgorica
++0500500 +0142600 Europe/Prague
++0565700 +0240600 Europe/Riga
++0415400 +0122900 Europe/Rome
++0531200 +0500900 Europe/Samara
++0435500 +0122800 Europe/San_Marino
++0435200 +0182500 Europe/Sarajevo
++0445700 +0340600 Europe/Simferopol
++0415900 +0212600 Europe/Skopje
++0424100 +0231900 Europe/Sofia
++0592000 +0180300 Europe/Stockholm
++0592500 +0244500 Europe/Tallinn
++0412000 +0195000 Europe/Tirane
++0483700 +0221800 Europe/Uzhgorod
++0470900 +0093100 Europe/Vaduz
++0415400 +0122700 Europe/Vatican
++0481300 +0162000 Europe/Vienna
++0544100 +0251900 Europe/Vilnius
++0484400 +0442500 Europe/Volgograd
++0521500 +0210000 Europe/Warsaw
++0454800 +0155800 Europe/Zagreb
++0475000 +0351000 Europe/Zaporozhye
++0472300 +0083200 Europe/Zurich
+-0185500 +0473100 Indian/Antananarivo
+-0072000 +0722500 Indian/Chagos
+-0102500 +1054300 Indian/Christmas
+-0121000 +0965500 Indian/Cocos
+-0114100 +0431600 Indian/Comoro
+-0492110 +0701303 Indian/Kerguelen
+-0044000 +0552800 Indian/Mahe
++0041000 +0733000 Indian/Maldives
+-0201000 +0573000 Indian/Mauritius
+-0124700 +0451400 Indian/Mayotte
+-0205200 +0552800 Indian/Reunion
+-0135000 -1714400 Pacific/Apia
+-0365200 +1744600 Pacific/Auckland
+-0435700 -1763300 Pacific/Chatham
+-0270900 -1092600 Pacific/Easter
+-0174000 +1682500 Pacific/Efate
+-0030800 -1710500 Pacific/Enderbury
+-0092200 -1711400 Pacific/Fakaofo
+-0180800 +1782500 Pacific/Fiji
+-0083100 +1791300 Pacific/Funafuti
++0005400 -0893600 Pacific/Galapagos
+-0230800 -1345700 Pacific/Gambier
+-0093200 +1601200 Pacific/Guadalcanal
++0132800 +1444500 Pacific/Guam
++0211825 -1575130 Pacific/Honolulu
++0164500 -1693100 Pacific/Johnston
++0015200 -1572000 Pacific/Kiritimati
++0051900 +1625900 Pacific/Kosrae
++0090500 +1672000 Pacific/Kwajalein
++0070900 +1711200 Pacific/Majuro
+-0090000 -1393000 Pacific/Marquesas
++0281300 -1772200 Pacific/Midway
++0003100 +1665500 Pacific/Nauru
+-0190100 +1695500 Pacific/Niue
+-0290300 +1675800 Pacific/Norfolk
+-0221600 +1653000 Pacific/Noumea
+-0141600 -1704200 Pacific/Pago_Pago
++0072000 +1342900 Pacific/Palau
+-0250400 -1300500 Pacific/Pitcairn
++0065800 +1581300 Pacific/Ponape
+-0093000 +1471000 Pacific/Port_Moresby
+-0211400 -1594600 Pacific/Rarotonga
++0151200 +1454500 Pacific/Saipan
+-0173200 -1493400 Pacific/Tahiti
++0012500 +1730000 Pacific/Tarawa
+-0211000 +1751000 Pacific/Tongatapu
++0072500 +1514700 Pacific/Truk
++0191700 +1663700 Pacific/Wake
+-0131800 -1761000 Pacific/Wallis
diff --git a/libkcal/libkcal_export.h b/libkcal/libkcal_export.h
new file mode 100644
index 00000000..0a1f184c
--- /dev/null
+++ b/libkcal/libkcal_export.h
@@ -0,0 +1,28 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (C) 2004 Dirk Mueller <mueller@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_KCALEXPORT_H
+#define KCAL_KCALEXPORT_H
+
+#include <kdepimmacros.h>
+
+#define LIBKCAL_EXPORT KDE_EXPORT
+
+#endif
diff --git a/libkcal/listbase.h b/libkcal/listbase.h
new file mode 100644
index 00000000..71a22816
--- /dev/null
+++ b/libkcal/listbase.h
@@ -0,0 +1,97 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_LISTBASE_H
+#define KCAL_LISTBASE_H
+
+#include <qvaluelist.h>
+
+namespace KCal {
+
+/**
+ This class provides a template for lists of pointers.
+ It extends QValueList<T *> by auto delete funtionality known from QPtrList.
+*/
+template<class T>
+class ListBase : public QValueList<T *>
+{
+ public:
+ ListBase()
+ : QValueList<T *>(), mAutoDelete( false )
+ {
+ }
+
+ ListBase( const ListBase &l )
+ : QValueList<T *>( l ), mAutoDelete( false )
+ {
+ }
+
+ ~ListBase()
+ {
+ if ( mAutoDelete ) {
+ QValueListIterator<T *> it;
+ for( it = QValueList<T*>::begin(); it != QValueList<T*>::end(); ++it ) {
+ delete *it;
+ }
+ }
+ }
+
+ ListBase &operator=( const ListBase &l )
+ {
+ if ( this == &l ) return *this;
+ QValueList<T *>::operator=( l );
+ return *this;
+ }
+
+ void setAutoDelete( bool autoDelete )
+ {
+ mAutoDelete = autoDelete;
+ }
+
+ bool removeRef( T *t )
+ {
+ QValueListIterator<T *> it = find( t );
+ if ( it == QValueList<T*>::end() ) {
+ return false;
+ } else {
+ if ( mAutoDelete ) delete t;
+ this->remove( it );
+ return true;
+ }
+ }
+
+ void clearAll()
+ {
+ if ( mAutoDelete ) {
+ for ( QValueListIterator<T*> it = QValueList<T*>::begin();
+ it != QValueList<T*>::end(); ++it ) {
+ delete *it;
+ }
+ }
+ QValueList<T*>::clear();
+ }
+
+ private:
+ bool mAutoDelete;
+};
+
+}
+
+#endif
diff --git a/libkcal/local.desktop b/libkcal/local.desktop
new file mode 100644
index 00000000..66956592
--- /dev/null
+++ b/libkcal/local.desktop
@@ -0,0 +1,60 @@
+[Desktop Entry]
+Name=Calendar in Local File
+Name[af]=Kalender in plaaslike lêer
+Name[be]=КалÑндар у лÑкальным файле
+Name[bg]=Календар в локален файл
+Name[br]=Deiziadur e restr lec'hel
+Name[bs]=Kalendar u lokalnoj datoteci
+Name[ca]=Calendari a un fitxer local
+Name[cs]=Kalendář v lokálním souboru
+Name[cy]=Calendr mewn Ffeil Lleol
+Name[da]=Kalender i lokal fil
+Name[de]=Kalender in lokaler Datei
+Name[el]=ΗμεÏολόγιο σε τοπικό αÏχείο
+Name[eo]=Kalendaro en loka dosiero
+Name[es]=Calendario en archivo local
+Name[et]=Kalender kohalikus failis
+Name[eu]=Egutegia fitxategi lokalean
+Name[fa]=تقویم در پروندۀ محلی
+Name[fi]=Kalenteri paikallisessa tiedostossa
+Name[fr]=Calendrier dans un fichier local
+Name[fy]=Aginda yn lokaal triem
+Name[ga]=Féilire i gComhad Logánta
+Name[gl]=Calendario nun Ficheiro Local
+Name[hi]=सà¥à¤¥à¤¾à¤¨à¥€à¤¯ फ़ाइल में कैलेनà¥à¤¡à¤°
+Name[hu]=Helyi fájlban tárolt naptár
+Name[is]=Dagatal í staðbundinni skrá
+Name[it]=Calendario in file locale
+Name[ja]=ローカルファイルã®ã‚«ãƒ¬ãƒ³ãƒ€ãƒ¼
+Name[ka]=კáƒáƒšáƒ”ნდáƒáƒ áƒ˜ ლáƒáƒ™áƒáƒšáƒ£áƒ  ფáƒáƒ˜áƒšáƒ¨áƒ˜
+Name[kk]=Жергілікті файлдағы күнтізбе
+Name[km]=ប្រážáž·áž‘ិន​នៅ​ក្នុង​ឯកសារ​មូលដ្ឋាន
+Name[lt]=Kalendorius vietinÄ—je byloje
+Name[mk]=Календар во локална датотека
+Name[ms]=Kalendar dalam Fail Setempat
+Name[nb]=Kalender i lokal fil
+Name[nds]=Kalenner as lokaal Datei
+Name[ne]=सà¥à¤¥à¤¾à¤¨à¥€à¤¯ फाइलको कà¥à¤¯à¤¾à¤²à¥‡à¤¨à¥à¤¡à¤°
+Name[nl]=Agenda in lokaal bestand
+Name[nn]=Kalender i lokal fil
+Name[pl]=Kalendarz w pliku lokalnym
+Name[pt]=Calendário num Ficheiro Local
+Name[pt_BR]=Calendário em Arquivo Local
+Name[ro]=Calendar în fişier local
+Name[ru]=Календарь в локальном файле
+Name[sk]=Kalendár v lokálnom súbore
+Name[sl]=Koledar v krajevni datoteki
+Name[sr]=Календар у локалном фајлу
+Name[sr@Latn]=Kalendar u lokalnom fajlu
+Name[sv]=Kalender i lokal fil
+Name[ta]=பொத௠அடைவில௠உளà¯à®³ நாளà¯à®•à®¾à®Ÿà¯à®Ÿà®¿
+Name[tg]=Тақвимот дар файли локалӣ
+Name[tr]=Yerel Dosyadaki Takvim
+Name[uk]=Календар у локальному файлі
+Name[zh_CN]=本地文件中的日历
+Name[zh_TW]=本地檔案中的行事曆
+X-KDE-Library=kcal_local
+Type=Service
+ServiceTypes=KResources/Plugin
+X-KDE-ResourceFamily=calendar
+X-KDE-ResourceType=file
diff --git a/libkcal/localdir.desktop b/libkcal/localdir.desktop
new file mode 100644
index 00000000..f65fe745
--- /dev/null
+++ b/libkcal/localdir.desktop
@@ -0,0 +1,60 @@
+[Desktop Entry]
+Name=Calendar in Local Directory
+Name[af]=Kalender in plaaslike gids
+Name[be]=КалÑндар у лÑкальным каталёгу
+Name[bg]=Календар в локална директориÑ
+Name[br]=Deiziadur en ur restr lec'hel
+Name[bs]=Kalendar u lokalnom direktoriju
+Name[ca]=Calendari a un directori local
+Name[cs]=Kalendář v lokální složce
+Name[cy]=Calendr mewn Cyfeiriadur Lleol
+Name[da]=Kalender i lokal mappe
+Name[de]=Kalender in lokalem Ordner
+Name[el]=ΗμεÏολόγιο σε τοπικό κατάλογο
+Name[eo]=Kalendaro en loka dosierujo
+Name[es]=Calendario en el directorio local
+Name[et]=Kalender kohalikus kataloogis
+Name[eu]=Egutegia direktorio lokalean
+Name[fa]=تقویم در Ùهرست راهنمای محلی
+Name[fi]=Kalenteri paikallisessa kansiossa
+Name[fr]=Calendrier dans un dossier local
+Name[fy]=Aginda yn lokale triemtafel
+Name[ga]=Féilire i gComhadlann Logánta
+Name[gl]=Calendario nun Cartafol Local
+Name[hi]=सà¥à¤¥à¤¾à¤¨à¥€à¤¯ डिरेकà¥à¤Ÿà¥à¤°à¥€ में कैलेनà¥à¤¡à¤°
+Name[hu]=Helyi könyvtárban tárolt naptár
+Name[is]=Dagatal í staðbundinni möppu
+Name[it]=Calendario nella directory locale
+Name[ja]=ローカルディレクトリã®ã‚«ãƒ¬ãƒ³ãƒ€ãƒ¼
+Name[ka]=კáƒáƒšáƒ”ნდáƒáƒ áƒ˜ ლáƒáƒ™áƒáƒšáƒ£áƒ  დირექტáƒáƒ áƒ˜áƒáƒ¨áƒ˜
+Name[kk]=Жергілікті каталогтағы күнтізбе
+Name[km]=ប្រážáž·áž‘ិន​នៅ​ក្នុង​ážážâ€‹áž˜áž¼áž›ážŠáŸ’ឋាន
+Name[lt]=Kalendorius vietiniame aplanke
+Name[mk]=Календар во локална папка
+Name[ms]=Kalendar dalam Direktori Setempat
+Name[nb]=Kalender i lokal katalog
+Name[nds]=Kalenner in lokaal Orner
+Name[ne]=सà¥à¤¥à¤¾à¤¨à¥€à¤¯ डाइरेकà¥à¤Ÿà¤°à¥€à¤•à¥‹ कà¥à¤¯à¤¾à¤²à¥‡à¤¨à¥à¤¡à¤°
+Name[nl]=Agenda in lokale map
+Name[nn]=Kalender i lokal mappe
+Name[pl]=Kalendarz w katalogu lokalnym
+Name[pt]=Calendário numa Directoria Local
+Name[pt_BR]=Calendário em Diretório Local
+Name[ro]=Calendar în director local
+Name[ru]=Календарь в локальной папке
+Name[sk]=Kalendár v lokálnom prieÄinku
+Name[sl]=Koledar v krajevnem imeniku
+Name[sr]=Календар у локалном директоријуму
+Name[sr@Latn]=Kalendar u lokalnom direktorijumu
+Name[sv]=Kalender i lokal katalog
+Name[ta]=பொத௠அடைவில௠உளà¯à®³ நாளà¯à®•à®¾à®Ÿà¯à®Ÿà®¿
+Name[tg]=Тақвимот дар каталоги локалӣ
+Name[tr]=Yerel Dizindeki Takvim
+Name[uk]=Календар у локальному каталозі
+Name[zh_CN]=本地目录中的日历
+Name[zh_TW]=本地目錄中的行事曆
+X-KDE-Library=kcal_localdir
+Type=Service
+ServiceTypes=KResources/Plugin
+X-KDE-ResourceFamily=calendar
+X-KDE-ResourceType=localdir
diff --git a/libkcal/period.cpp b/libkcal/period.cpp
new file mode 100644
index 00000000..9d37aba4
--- /dev/null
+++ b/libkcal/period.cpp
@@ -0,0 +1,92 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+#include <klocale.h>
+
+#include "period.h"
+
+using namespace KCal;
+
+Period::Period()
+{
+ mHasDuration = false;
+}
+
+Period::Period( const QDateTime &start, const QDateTime &end )
+{
+ mStart = start;
+ mEnd = end;
+ mHasDuration = false;
+}
+
+Period::Period( const QDateTime &start, const Duration &duration )
+{
+ mStart = start;
+ mEnd = duration.end( start );
+ mHasDuration = true;
+}
+
+
+bool Period::operator<( const Period& other )
+{
+ return start() < other.start();
+}
+
+QDateTime Period::start() const
+{
+ return mStart;
+}
+
+QDateTime Period::end()const
+{
+ return mEnd;
+}
+
+Duration Period::duration()
+{
+ return Duration( mStart, mEnd );
+}
+
+bool Period::hasDuration()const
+{
+ return mHasDuration;
+}
+
+QString KCal::Period::summary() const
+{
+ return mSummary;
+}
+
+void KCal::Period::setSummary(const QString & summary)
+{
+ mSummary = summary;
+}
+
+QString KCal::Period::location() const
+{
+ return mLocation;
+}
+
+void KCal::Period::setLocation(const QString & location)
+{
+ mLocation = location;
+}
diff --git a/libkcal/period.h b/libkcal/period.h
new file mode 100644
index 00000000..aa87bfc9
--- /dev/null
+++ b/libkcal/period.h
@@ -0,0 +1,70 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001-2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_PERIOD_H
+#define KCAL_PERIOD_H
+
+#include <qdatetime.h>
+#include "libkcal_export.h"
+
+#include "duration.h"
+
+namespace KCal {
+
+/**
+ This class represents a period of time. The period can be defined by either a
+ start time and an end time or by a start time and a duration.
+*/
+class KDE_EXPORT Period
+{
+ public:
+ Period();
+ Period( const QDateTime &start, const QDateTime &end );
+ Period( const QDateTime &start, const Duration &duration );
+
+ /** Returns true if this element is smaller than the @param other one */
+ bool operator<( const Period& other );
+
+ QDateTime start() const;
+ QDateTime end() const;
+ Duration duration();
+
+ bool hasDuration()const;
+
+ QString summary() const;
+ void setSummary( const QString &summary );
+ QString location() const;
+ void setLocation( const QString &location );
+
+ private:
+ QDateTime mStart;
+ QDateTime mEnd;
+
+ bool mHasDuration;
+ QString mSummary;
+ QString mLocation;
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/person.cpp b/libkcal/person.cpp
new file mode 100644
index 00000000..687ec6db
--- /dev/null
+++ b/libkcal/person.cpp
@@ -0,0 +1,96 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "person.h"
+
+#include <kdebug.h>
+#include <klocale.h>
+
+#include <libemailfunctions/email.h>
+
+#include <qregexp.h>
+
+using namespace KCal;
+
+Person::Person( const QString &fullName )
+{
+ QString name, email;
+ KPIM::getNameAndMail( fullName, name, email );
+ setName( name );
+ setEmail( email );
+}
+
+Person::Person( const QString &name, const QString &email )
+{
+ setName( name );
+ setEmail( email );
+}
+
+
+bool KCal::operator==( const Person& p1, const Person& p2 )
+{
+ return ( p1.name() == p2.name() &&
+ p1.email() == p2.email() );
+}
+
+
+QString Person::fullName() const
+{
+ if( mName.isEmpty() ) {
+ return mEmail;
+ } else {
+ if( mEmail.isEmpty() )
+ return mName;
+ else {
+ // Taken from KABC::Addressee::fullEmail
+ QString name = mName;
+ QRegExp needQuotes( "[^ 0-9A-Za-z\\x0080-\\xFFFF]" );
+ bool weNeedToQuote = name.find( needQuotes ) != -1;
+ if ( weNeedToQuote ) {
+ if ( name[0] != '"' )
+ name.prepend( '"' );
+ if ( name[ name.length()-1 ] != '"' )
+ name.append( '"' );
+ }
+ return name + " <" + mEmail + ">";
+ }
+ }
+}
+
+bool Person::isEmpty() const
+{
+ return mEmail.isEmpty() && mName.isEmpty();
+}
+
+void Person::setName(const QString &name)
+{
+ mName = name;
+}
+
+void Person::setEmail(const QString &email)
+{
+ if ( email.startsWith( "mailto:", false ) ) {
+ mEmail = email.mid(7);
+ } else {
+ mEmail = email;
+ }
+}
diff --git a/libkcal/person.h b/libkcal/person.h
new file mode 100644
index 00000000..55b16707
--- /dev/null
+++ b/libkcal/person.h
@@ -0,0 +1,62 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001-2003 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_PERSON_H
+#define KCAL_PERSON_H
+
+#include <qstring.h>
+
+#include "libkcal_export.h"
+
+namespace KCal {
+
+/**
+ This class represents a person. A person has a name and an email address.
+*/
+class LIBKCAL_EXPORT Person
+{
+ public:
+ Person() {}
+ Person( const QString &fullName );
+ Person( const QString &name, const QString &email );
+ bool isEmpty() const;
+
+ QString fullName( ) const;
+
+ void setName(const QString &);
+ QString name() const { return mName; }
+
+ void setEmail(const QString &);
+ QString email() const { return mEmail; }
+
+ private:
+ QString mName;
+ QString mEmail;
+
+ class Private;
+ Private *d;
+};
+
+bool operator==( const Person& p1, const Person& p2 );
+
+}
+
+#endif
diff --git a/libkcal/qtopiaformat.cpp b/libkcal/qtopiaformat.cpp
new file mode 100644
index 00000000..b7a7b392
--- /dev/null
+++ b/libkcal/qtopiaformat.cpp
@@ -0,0 +1,316 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qdatetime.h>
+#include <qstring.h>
+#include <qptrlist.h>
+#include <qregexp.h>
+#include <qclipboard.h>
+#include <qfile.h>
+#include <qtextstream.h>
+#include <qxml.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+
+#include "calendar.h"
+#include "calendarlocal.h"
+
+#include "qtopiaformat.h"
+
+using namespace KCal;
+
+class QtopiaParser : public QXmlDefaultHandler
+{
+ public:
+ QtopiaParser( Calendar *calendar ) : mCalendar( calendar ) {}
+
+ bool startElement( const QString &, const QString &, const QString & qName,
+ const QXmlAttributes &attributes )
+ {
+ if ( qName == "event" ) {
+ Event *event = new Event;
+ QString uid = "Qtopia" + attributes.value( "uid" );
+ event->setUid( uid );
+
+ event->setSummary( attributes.value( "description" ) );
+ event->setLocation( attributes.value( "location" ) );
+ event->setDescription( attributes.value( "note" ) );
+ event->setDtStart( toDateTime( attributes.value( "start" ) ) );
+ event->setDtEnd( toDateTime( attributes.value( "end" ) ) );
+
+ if ( attributes.value( "type" ) == "AllDay" ) {
+ event->setFloats( true );
+ } else {
+ event->setFloats( false );
+ }
+
+ QString rtype = attributes.value( "rtype" );
+ if ( !rtype.isEmpty() ) {
+ QDate startDate = event->dtStart().date();
+
+ QString freqStr = attributes.value( "rfreq" );
+ int freq = freqStr.toInt();
+
+ QString hasEndDateStr = attributes.value( "rhasenddate" );
+ bool hasEndDate = hasEndDateStr == "1";
+
+ QString endDateStr = attributes.value( "enddt" );
+ QDate endDate = toDateTime( endDateStr ).date();
+
+ QString weekDaysStr = attributes.value( "rweekdays" );
+ int weekDaysNum = weekDaysStr.toInt();
+ QBitArray weekDays( 7 );
+ int i;
+ for( i = 1; i <= 7; ++i ) {
+ weekDays.setBit( i - 1, ( 2 << i ) & weekDaysNum );
+ }
+
+ QString posStr = attributes.value( "rposition" );
+ int pos = posStr.toInt();
+
+ Recurrence *r = event->recurrence();
+
+ if ( rtype == "Daily" ) {
+ r->setDaily( freq );
+ if ( hasEndDate ) r->setEndDate( endDate );
+ } else if ( rtype == "Weekly" ) {
+ r->setWeekly( freq, weekDays );
+ if ( hasEndDate ) r->setEndDate( endDate );
+ } else if ( rtype == "MonthlyDate" ) {
+ r->setMonthly( freq );
+ if ( hasEndDate )
+ r->setEndDate( endDate );
+ r->addMonthlyDate( startDate.day() );
+ } else if ( rtype == "MonthlyDay" ) {
+ r->setMonthly( freq );
+ if ( hasEndDate )
+ r->setEndDate( endDate );
+ QBitArray days( 7 );
+ days.fill( false );
+ days.setBit( startDate.dayOfWeek() - 1 );
+ r->addMonthlyPos( pos, days );
+ } else if ( rtype == "Yearly" ) {
+ r->setYearly( freq );
+ if ( hasEndDate )
+ r->setEndDate( endDate );
+ }
+ }
+
+ QString categoryList = attributes.value( "categories" );
+ event->setCategories( lookupCategories( categoryList ) );
+
+ QString alarmStr = attributes.value( "alarm" );
+ if ( !alarmStr.isEmpty() ) {
+ kdDebug(5800) << "Alarm: " << alarmStr << endl;
+ Alarm *alarm = new Alarm( event );
+ alarm->setType( Alarm::Display );
+ alarm->setEnabled( true );
+ int alarmOffset = alarmStr.toInt();
+ alarm->setStartOffset( alarmOffset * -60 );
+ event->addAlarm( alarm );
+ }
+
+ Event *oldEvent = mCalendar->event( uid );
+ if ( oldEvent ) mCalendar->deleteEvent( oldEvent );
+
+ mCalendar->addEvent( event );
+ } else if ( qName == "Task" ) {
+ Todo *todo = new Todo;
+
+ QString uid = "Qtopia" + attributes.value( "Uid" );
+ todo->setUid( uid );
+
+ QString description = attributes.value( "Description" );
+ int pos = description.find( '\n' );
+ if ( pos > 0 ) {
+ QString summary = description.left( pos );
+ todo->setSummary( summary );
+ todo->setDescription( description );
+ } else {
+ todo->setSummary( description );
+ }
+
+ int priority = attributes.value( "Priority" ).toInt();
+// if ( priority == 0 ) priority = 3;
+ todo->setPriority( priority );
+
+ QString categoryList = attributes.value( "Categories" );
+ todo->setCategories( lookupCategories( categoryList ) );
+
+ QString completedStr = attributes.value( "Completed" );
+ if ( completedStr == "1" ) todo->setCompleted( true );
+
+ QString hasDateStr = attributes.value( "HasDate" );
+ if ( hasDateStr == "1" ) {
+ int year = attributes.value( "DateYear" ).toInt();
+ int month = attributes.value( "DateMonth" ).toInt();
+ int day = attributes.value( "DateDay" ).toInt();
+
+ todo->setDtDue( QDateTime( QDate( year, month, day ) ) );
+ todo->setHasDueDate( true );
+ }
+
+ Todo *oldTodo = mCalendar->todo( uid );
+ if ( oldTodo ) mCalendar->deleteTodo( oldTodo );
+
+ mCalendar->addTodo( todo );
+ } else if ( qName == "Category" ) {
+ QString id = attributes.value( "id" );
+ QString name = attributes.value( "name" );
+ setCategory( id, name );
+ }
+
+ return true;
+ }
+
+ bool warning ( const QXmlParseException &exception )
+ {
+ kdDebug(5800) << "WARNING" << endl;
+ printException( exception );
+ return true;
+ }
+
+ bool error ( const QXmlParseException &exception )
+ {
+ kdDebug(5800) << "ERROR" << endl;
+ printException( exception );
+ return false;
+ }
+
+ bool fatalError ( const QXmlParseException &exception )
+ {
+ kdDebug(5800) << "FATALERROR" << endl;
+ printException( exception );
+ return false;
+ }
+
+ QString errorString ()
+ {
+ return "QtopiaParser: Error!";
+ }
+
+ protected:
+ void printException( const QXmlParseException &exception )
+ {
+ kdError() << "XML Parse Error (line " << exception.lineNumber()
+ << ", col " << exception.columnNumber() << "): "
+ << exception.message() << "(public ID: '"
+ << exception.publicId() << "' system ID: '"
+ << exception.systemId() << "')" << endl;
+ }
+
+ QDateTime toDateTime( const QString &value )
+ {
+ QDateTime dt;
+ dt.setTime_t( value.toUInt() );
+
+ return dt;
+ }
+
+ QStringList lookupCategories( const QString &categoryList )
+ {
+ QStringList categoryIds = QStringList::split( ";", categoryList );
+ QStringList categories;
+ QStringList::ConstIterator it;
+ for( it = categoryIds.begin(); it != categoryIds.end(); ++it ) {
+ categories.append( category( *it ) );
+ }
+ return categories;
+ }
+
+ private:
+ Calendar *mCalendar;
+
+ static QString category( const QString &id )
+ {
+ QMap<QString,QString>::ConstIterator it = mCategoriesMap.find( id );
+ if ( it == mCategoriesMap.end() ) return id;
+ else return *it;
+ }
+
+ static void setCategory( const QString &id, const QString &name )
+ {
+ mCategoriesMap.insert( id, name );
+ }
+
+ static QMap<QString,QString> mCategoriesMap;
+};
+
+QMap<QString,QString> QtopiaParser::mCategoriesMap;
+
+QtopiaFormat::QtopiaFormat()
+{
+}
+
+QtopiaFormat::~QtopiaFormat()
+{
+}
+
+bool QtopiaFormat::load( Calendar *calendar, const QString &fileName)
+{
+ kdDebug(5800) << "QtopiaFormat::load() " << fileName << endl;
+
+ clearException();
+
+ QtopiaParser handler( calendar );
+ QFile xmlFile( fileName );
+ QXmlInputSource source( xmlFile );
+ QXmlSimpleReader reader;
+ reader.setContentHandler( &handler );
+ return reader.parse( source );
+}
+
+bool QtopiaFormat::save( Calendar *calendar, const QString &fileName )
+{
+ kdDebug(5800) << "QtopiaFormat::save(): " << fileName << endl;
+
+ clearException();
+
+ QString text = toString( calendar );
+
+ if ( text.isNull() ) return false;
+
+ // TODO: write backup file
+
+ QFile file( fileName );
+ if (!file.open( IO_WriteOnly ) ) {
+ setException(new ErrorFormat(ErrorFormat::SaveError,
+ i18n("Could not open file '%1'").arg(fileName)));
+ return false;
+ }
+ QTextStream ts( &file );
+ ts << text;
+ file.close();
+
+ return true;
+}
+
+bool QtopiaFormat::fromString( Calendar *, const QString & )
+{
+ kdDebug(5800) << "QtopiaFormat::fromString() not yet implemented." << endl;
+ return false;
+}
+
+QString QtopiaFormat::toString( Calendar * )
+{
+ return QString::null;
+}
diff --git a/libkcal/qtopiaformat.h b/libkcal/qtopiaformat.h
new file mode 100644
index 00000000..ed054d00
--- /dev/null
+++ b/libkcal/qtopiaformat.h
@@ -0,0 +1,55 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_QTOPIAFORMAT_H
+#define KCAL_QTOPIAFORMAT_H
+
+#include <qstring.h>
+
+#include "scheduler.h"
+
+#include "libkcal_export.h"
+#include "calformat.h"
+
+namespace KCal {
+
+/**
+ This class implements the calendar format used by Qtopia.
+*/
+class LIBKCAL_EXPORT QtopiaFormat : public CalFormat
+{
+ public:
+ QtopiaFormat();
+ virtual ~QtopiaFormat();
+
+ bool load( Calendar *, const QString &fileName );
+ bool save( Calendar *, const QString &fileName );
+
+ bool fromString( Calendar *, const QString & );
+ QString toString( Calendar * );
+
+ private:
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/recurrence.cpp b/libkcal/recurrence.cpp
new file mode 100644
index 00000000..5d1505df
--- /dev/null
+++ b/libkcal/recurrence.cpp
@@ -0,0 +1,1079 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 1998 Preston Brown <pbrown@kde.org>
+ Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (c) 2002 David Jarvie <software@astrojar.org.uk>
+ Copyright (C) 2005 Reinhold Kainhofer <kainhofer@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <limits.h>
+
+#include <kdebug.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <qbitarray.h>
+
+#include "recurrence.h"
+#include "recurrencerule.h"
+
+using namespace KCal;
+
+
+Recurrence::Recurrence()
+: mFloating( false ),
+ mRecurReadOnly(false),
+ mCachedType(rMax)
+{
+ mExRules.setAutoDelete( true );
+ mRRules.setAutoDelete( true );
+}
+
+Recurrence::Recurrence( const Recurrence &r )
+: RecurrenceRule::Observer(),
+ mRDateTimes( r.mRDateTimes ), mRDates( r.mRDates ),
+ mExDateTimes( r.mExDateTimes ), mExDates( r.mExDates ),
+ mStartDateTime( r.mStartDateTime ),
+ mFloating( r.mFloating ),
+ mRecurReadOnly(r.mRecurReadOnly),
+ mCachedType( r.mCachedType )
+{
+ mExRules.setAutoDelete( true );
+ mRRules.setAutoDelete( true );
+ RecurrenceRule::List::ConstIterator rr;
+ for ( rr = r.mRRules.begin(); rr != r.mRRules.end(); ++rr ) {
+ RecurrenceRule *rule = new RecurrenceRule( *(*rr) );
+ mRRules.append( rule );
+ rule->addObserver( this );
+ }
+ for ( rr = r.mExRules.begin(); rr != r.mExRules.end(); ++rr ) {
+ RecurrenceRule *rule = new RecurrenceRule( *(*rr) );
+ mExRules.append( rule );
+ rule->addObserver( this );
+ }
+}
+
+Recurrence::~Recurrence()
+{
+}
+
+
+
+bool Recurrence::operator==( const Recurrence& r2 ) const
+{
+ if ( mStartDateTime != r2.mStartDateTime
+ || mFloating != r2.mFloating
+ || mRecurReadOnly != r2.mRecurReadOnly )
+ return false;
+ if ( mExDates != r2.mExDates ) return false;
+ if ( mExDateTimes != r2.mExDateTimes ) return false;
+ if ( mRDates != r2.mRDates ) return false;
+ if ( mRDateTimes != r2.mRDateTimes ) return false;
+
+// Compare the rrules, exrules! Assume they have the same order... This only
+// matters if we have more than one rule (which shouldn't be the default anyway)
+ if ( mRRules.count() != r2.mRRules.count() ) return false;
+ RecurrenceRule::List::ConstIterator rit1 = mRRules.begin();
+ RecurrenceRule::List::ConstIterator rit2 = r2.mRRules.begin();
+
+ while ( rit1 != mRRules.end() && rit2 != r2.mRRules.end() ) {
+ // dereference the iterator to the RecurrenceRule*, and that once again
+ // to RecurrenceRule...
+ if ( *(*rit1) != *(*rit2) ) return false;
+ ++rit1;
+ ++rit2;
+ }
+ RecurrenceRule::List::ConstIterator exit1 = mExRules.begin();
+ RecurrenceRule::List::ConstIterator exit2 = r2.mExRules.begin();
+
+ while ( exit1 != mExRules.end() && exit2 != r2.mExRules.end() ) {
+ // dereference the iterator to the RecurrenceRule*, and that once again
+ // to RecurrenceRule...
+ if ( *(*exit1) != *(*exit2) ) return false;
+ ++exit1;
+ ++exit2;
+ }
+ return true;
+}
+
+void Recurrence::addObserver( Observer *observer )
+{
+ if ( !mObservers.contains( observer ) )
+ mObservers.append( observer );
+}
+
+void Recurrence::removeObserver( Observer *observer )
+{
+ if ( mObservers.contains( observer ) )
+ mObservers.remove( observer );
+}
+
+
+QDateTime Recurrence::startDateTime() const
+{
+ if ( mFloating )
+ return QDateTime( mStartDateTime.date(), QTime( 0, 0, 0 ) );
+ else return mStartDateTime;
+}
+
+void Recurrence::setFloats( bool floats )
+{
+ if ( mRecurReadOnly ) return;
+ if ( floats == mFloating ) return;
+ mFloating = floats;
+
+
+ RecurrenceRule::List::ConstIterator it;
+ for ( it = mRRules.begin(); it != mRRules.end(); ++it ) {
+ (*it)->setFloats( floats );
+ }
+
+ RecurrenceRule::List::ConstIterator it1;
+ for ( it1 = mExRules.begin(); it1 != mExRules.end(); ++it1 ) {
+ (*it1)->setFloats( floats );
+ }
+ updated();
+}
+
+RecurrenceRule *Recurrence::defaultRRule( bool create ) const
+{
+ if ( mRRules.isEmpty() ) {
+ if ( !create || mRecurReadOnly ) return 0;
+ RecurrenceRule *rrule = new RecurrenceRule();
+ rrule->setStartDt( startDateTime() );
+ const_cast<KCal::Recurrence*>(this)->addRRule( rrule );
+ return rrule;
+ } else {
+ return mRRules.first();
+ }
+}
+
+RecurrenceRule *Recurrence::defaultRRuleConst() const
+{
+ if ( mRRules.isEmpty() ) {
+ return 0;
+ } else {
+ return mRRules.first();
+ }
+}
+
+void Recurrence::updated()
+{
+ // recurrenceType() re-calculates the type if it's rMax
+ mCachedType = rMax;
+ for ( QValueList<Observer*>::ConstIterator it = mObservers.begin();
+ it != mObservers.end(); ++it ) {
+ if ( (*it) ) (*it)->recurrenceUpdated( this );
+ }
+}
+
+bool Recurrence::doesRecur() const
+{
+ return !mRRules.isEmpty() || !mRDates.isEmpty() || !mRDateTimes.isEmpty();
+}
+
+ushort Recurrence::recurrenceType() const
+{
+ if ( mCachedType == rMax ) {
+ mCachedType = recurrenceType( defaultRRuleConst() );
+ }
+ return mCachedType;
+}
+
+ushort Recurrence::recurrenceType( const RecurrenceRule *rrule )
+{
+ if ( !rrule ) return rNone;
+ RecurrenceRule::PeriodType type = rrule->recurrenceType();
+
+ // BYSETPOS, BYWEEKNUMBER and BYSECOND were not supported in old versions
+ if ( !rrule->bySetPos().isEmpty() )
+ return rOther;
+ if ( !rrule->bySeconds().isEmpty() )
+ return rOther;
+ if ( !rrule->byWeekNumbers().isEmpty() )
+ return rOther;
+
+ // It wasn't possible to set BYMINUTES, BYHOUR etc. by the old code. So if
+ // it's set, it's none of the old types
+ if ( !rrule->byMinutes().isEmpty() )
+ return rOther;
+ if ( !rrule->byHours().isEmpty() )
+ return rOther;
+
+ // Possible combinations were:
+ // BYDAY: with WEEKLY, MONTHLY, YEARLY
+ // BYMONTHDAY: with MONTHLY, YEARLY
+ // BYMONTH: with YEARLY
+ // BYYEARDAY: with YEARLY
+ if ( !rrule->byYearDays().isEmpty() && type != RecurrenceRule::rYearly )
+ return rOther;
+ if ( !rrule->byMonths().isEmpty() && type != RecurrenceRule::rYearly )
+ return rOther;
+ if ( !rrule->byDays().isEmpty() ) {
+ if ( type != RecurrenceRule::rYearly && type != RecurrenceRule::rMonthly &&
+ type != RecurrenceRule::rWeekly )
+ return rOther;
+ }
+
+ switch ( type ) {
+ case RecurrenceRule::rNone: return rNone;
+ case RecurrenceRule::rMinutely: return rMinutely;
+ case RecurrenceRule::rHourly: return rHourly;
+ case RecurrenceRule::rDaily: return rDaily;
+ case RecurrenceRule::rWeekly: return rWeekly;
+ case RecurrenceRule::rMonthly: {
+ if ( rrule->byDays().isEmpty() ) return rMonthlyDay;
+ else if ( rrule->byMonthDays().isEmpty() ) return rMonthlyPos;
+ else return rOther; // both position and date specified
+ }
+ case RecurrenceRule::rYearly: {
+ // Possible combinations:
+ // rYearlyMonth: [BYMONTH &] BYMONTHDAY
+ // rYearlyDay: BYYEARDAY
+ // rYearlyPos: [BYMONTH &] BYDAY
+ if ( !rrule->byDays().isEmpty() ) {
+ // can only by rYearlyPos
+ if ( rrule->byMonthDays().isEmpty() && rrule->byYearDays().isEmpty() )
+ return rYearlyPos;
+ else return rOther;
+ } else if ( !rrule->byYearDays().isEmpty() ) {
+ // Can only be rYearlyDay
+ if ( rrule->byMonths().isEmpty() && rrule->byMonthDays().isEmpty() )
+ return rYearlyDay;
+ else return rOther;
+ } else {
+ return rYearlyMonth;
+ }
+ break;
+ }
+ default: return rOther;
+ }
+ return rOther;
+}
+
+bool Recurrence::recursOn(const QDate &qd) const
+{
+ TimeList tms;
+ // First handle dates. Exrules override
+ if ( mExDates.contains( qd ) ) return false;
+ // For all-day events a matching exrule excludes the whole day
+ // since exclusions take precedence over inclusions, we know it can't occur on that day.
+ if ( doesFloat() ) {
+ for ( RecurrenceRule::List::ConstIterator rr = mExRules.begin(); rr != mExRules.end(); ++rr ) {
+ if ( (*rr)->recursOn( qd ) )
+ return false;
+ }
+ }
+
+ if ( mRDates.contains( qd ) ) return true;
+
+ // Check if it might recur today at all.
+ bool recurs = false;
+ if ( startDate() == qd ) recurs = true;
+ for ( RecurrenceRule::List::ConstIterator rr = mRRules.begin(); rr != mRRules.end(); ++rr ) {
+ recurs = recurs || (*rr)->recursOn( qd );
+ }
+ // If we already know it recurs, no need to check the rdate list too.
+ if ( !recurs ) {
+ for ( DateTimeList::ConstIterator rit = mRDateTimes.begin();
+ rit != mRDateTimes.end(); ++rit ) {
+ if ( (*rit).date() == qd ) {
+ recurs = true;
+ break;
+ }
+ }
+ }
+ // If the event wouldn't recur at all, simply return false, don't check ex*
+ if ( !recurs ) return false;
+
+ // Check if there are any times for this day excluded, either by exdate or exrule:
+ bool exon = false;
+ for ( DateTimeList::ConstIterator exit = mExDateTimes.begin();
+ exit != mExDateTimes.end(); ++exit ) {
+ if ( (*exit).date() == qd ) {
+ exon = true;
+ break;
+ }
+ }
+ if ( !doesFloat() ) { // we have already checked floating times above
+ for ( RecurrenceRule::List::ConstIterator rr = mExRules.begin(); rr != mExRules.end(); ++rr ) {
+ exon = exon || (*rr)->recursOn( qd );
+ }
+ }
+
+ if ( !exon ) {
+ // Simple case, nothing on that day excluded, return the value from before
+ return recurs;
+ } else {
+ // Harder part: I don't think there is any way other than to calculate the
+ // whole list of items for that day.
+ TimeList timesForDay( recurTimesOn( qd ) );
+ return !timesForDay.isEmpty();
+ }
+}
+
+bool Recurrence::recursAt( const QDateTime &dt ) const
+{
+ // if it's excluded anyway, don't bother to check if it recurs at all.
+ if ( mExDateTimes.contains( dt )) return false;
+ if ( mExDates.contains( dt.date() )) return false;
+ for ( RecurrenceRule::List::ConstIterator rr = mExRules.begin(); rr != mExRules.end(); ++rr ) {
+ if ( (*rr)->recursAt( dt ) ) return false;
+ }
+
+ // Check explicit recurrences, then rrules.
+ bool occurs = ( startDateTime() == dt ) || mRDateTimes.contains( dt );
+ if ( occurs )
+ return true;
+ for ( RecurrenceRule::List::ConstIterator rr = mRRules.begin(); rr != mRRules.end(); ++rr ) {
+ if ( (*rr)->recursAt( dt ) ) return true;
+ }
+
+ return false;
+}
+
+/** Calculates the cumulative end of the whole recurrence (rdates and rrules).
+ If any rrule is infinite, or the recurrence doesn't have any rrules or
+ rdates, an invalid date is returned. */
+QDateTime Recurrence::endDateTime() const
+{
+ DateTimeList dts;
+ dts << startDateTime();
+ if ( !mRDates.isEmpty() ) dts << QDateTime( mRDates.last(), QTime( 0, 0, 0 ) );
+ if ( !mRDateTimes.isEmpty() ) dts << mRDateTimes.last();
+ for ( RecurrenceRule::List::ConstIterator rr = mRRules.begin(); rr != mRRules.end(); ++rr ) {
+ QDateTime rl( (*rr)->endDt() );
+ // if any of the rules is infinite, the whole recurrence is
+ if ( !rl.isValid() ) return QDateTime();
+ dts << rl;
+ }
+ qSortUnique( dts );
+ if ( dts.isEmpty() ) return QDateTime();
+ else return dts.last();
+}
+
+/** Calculates the cumulative end of the whole recurrence (rdates and rrules).
+ If any rrule is infinite, or the recurrence doesn't have any rrules or
+ rdates, an invalid date is returned. */
+QDate Recurrence::endDate() const
+{
+ QDateTime end( endDateTime() );
+ if ( end.isValid() ) { return end.date(); }
+ else return QDate();
+}
+
+void Recurrence::setEndDate( const QDate &date )
+{
+ if ( doesFloat() )
+ setEndDateTime( QDateTime( date, QTime( 23, 59, 59 ) ) );
+ else
+ setEndDateTime( QDateTime( date, mStartDateTime.time() ) );
+}
+
+void Recurrence::setEndDateTime( const QDateTime &dateTime )
+{
+ if ( mRecurReadOnly ) return;
+ RecurrenceRule *rrule = defaultRRule( true );
+ if ( !rrule ) return;
+ rrule->setEndDt( dateTime );
+ updated();
+}
+
+int Recurrence::duration() const
+{
+ RecurrenceRule *rrule = defaultRRuleConst();
+ if ( rrule ) return rrule->duration();
+ else return 0;
+}
+
+// int Recurrence::durationTo( const QDate &/*date*/ ) const
+// {
+// return 0;
+// }
+
+int Recurrence::durationTo( const QDateTime &datetime ) const
+{
+ // Emulate old behavior: This is just an interface to the first rule!
+ RecurrenceRule *rrule = defaultRRuleConst();
+ if ( !rrule ) return 0;
+ else return rrule->durationTo( datetime );
+}
+
+void Recurrence::setDuration( int duration )
+{
+ if ( mRecurReadOnly ) return;
+ RecurrenceRule *rrule = defaultRRule( true );
+ if ( !rrule ) return;
+ rrule->setDuration( duration );
+ updated();
+}
+
+void Recurrence::unsetRecurs()
+{
+ if ( mRecurReadOnly ) return;
+ mRRules.clearAll();
+ updated();
+}
+
+void Recurrence::clear()
+{
+ if ( mRecurReadOnly ) return;
+ mRRules.clearAll();
+ mExRules.clearAll();
+ mRDates.clear();
+ mRDateTimes.clear();
+ mExDates.clear();
+ mExDateTimes.clear();
+ mCachedType = rMax;
+ updated();
+}
+
+void Recurrence::setStartDateTime( const QDateTime &start )
+{
+ if ( mRecurReadOnly ) return;
+ mStartDateTime = start;
+ setFloats( false ); // set all RRULEs and EXRULEs
+
+ for ( RecurrenceRule::List::ConstIterator rr = mRRules.begin(); rr != mRRules.end(); ++rr ) {
+ (*rr)->setStartDt( start );
+ }
+ for ( RecurrenceRule::List::ConstIterator rr = mExRules.begin(); rr != mExRules.end(); ++rr ) {
+ (*rr)->setStartDt( start );
+ }
+ updated();
+}
+
+void Recurrence::setStartDate( const QDate &start )
+{
+ setStartDateTime( QDateTime( start, QTime(0,0,0) ) );
+ setFloats( true );
+}
+
+int Recurrence::frequency() const
+{
+ RecurrenceRule *rrule = defaultRRuleConst();
+ if ( rrule ) return rrule->frequency();
+ else return 0;
+}
+
+// Emulate the old behaviour. Make this methods just an interface to the
+// first rrule
+void Recurrence::setFrequency( int freq )
+{
+ if ( mRecurReadOnly || freq <= 0 ) return;
+ RecurrenceRule *rrule = defaultRRule( true );
+ if ( rrule )
+ rrule->setFrequency( freq );
+ updated();
+}
+
+
+// WEEKLY
+
+int Recurrence::weekStart() const
+{
+ RecurrenceRule *rrule = defaultRRuleConst();
+ if ( rrule ) return rrule->weekStart();
+ else return 1;
+}
+
+// Emulate the old behavior
+QBitArray Recurrence::days() const
+{
+ QBitArray days( 7 );
+ days.fill( 0 );
+ RecurrenceRule *rrule = defaultRRuleConst();
+ if ( rrule ) {
+ QValueList<RecurrenceRule::WDayPos> bydays = rrule->byDays();
+ for ( QValueListConstIterator<RecurrenceRule::WDayPos> it = bydays.begin();
+ it != bydays.end(); ++it ) {
+ if ( (*it).pos() == 0 ) {
+ days.setBit( (*it).day() - 1 );
+ }
+ }
+ }
+ return days;
+}
+
+
+// MONTHLY
+
+// Emulate the old behavior
+QValueList<int> Recurrence::monthDays() const
+{
+ RecurrenceRule *rrule = defaultRRuleConst();
+ if ( rrule ) return rrule->byMonthDays();
+ else return QValueList<int>();
+}
+
+// Emulate the old behavior
+QValueList<RecurrenceRule::WDayPos> Recurrence::monthPositions() const
+{
+ RecurrenceRule *rrule = defaultRRuleConst();
+ if ( rrule ) return rrule->byDays();
+ else return QValueList<RecurrenceRule::WDayPos>();
+}
+
+
+// YEARLY
+
+QValueList<int> Recurrence::yearDays() const
+{
+ RecurrenceRule *rrule = defaultRRuleConst();
+ if ( rrule ) return rrule->byYearDays();
+ else return QValueList<int>();
+}
+
+QValueList<int> Recurrence::yearDates() const
+{
+ return monthDays();
+}
+
+QValueList<int> Recurrence::yearMonths() const
+{
+ RecurrenceRule *rrule = defaultRRuleConst();
+ if ( rrule ) return rrule->byMonths();
+ else return QValueList<int>();
+}
+
+QValueList<RecurrenceRule::WDayPos> Recurrence::yearPositions() const
+{
+ return monthPositions();
+}
+
+
+
+RecurrenceRule *Recurrence::setNewRecurrenceType( RecurrenceRule::PeriodType type, int freq )
+{
+ if ( mRecurReadOnly || freq <= 0 ) return 0;
+ mRRules.clearAll();
+ updated();
+ RecurrenceRule *rrule = defaultRRule( true );
+ if ( !rrule ) return 0;
+ rrule->setRecurrenceType( type );
+ rrule->setFrequency( freq );
+ rrule->setDuration( -1 );
+ return rrule;
+}
+
+void Recurrence::setMinutely( int _rFreq )
+{
+ if ( setNewRecurrenceType( RecurrenceRule::rMinutely, _rFreq ) )
+ updated();
+}
+
+void Recurrence::setHourly( int _rFreq )
+{
+ if ( setNewRecurrenceType( RecurrenceRule::rHourly, _rFreq ) )
+ updated();
+}
+
+void Recurrence::setDaily( int _rFreq )
+{
+ if ( setNewRecurrenceType( RecurrenceRule::rDaily, _rFreq ) )
+ updated();
+}
+
+void Recurrence::setWeekly( int freq, int weekStart )
+{
+ RecurrenceRule *rrule = setNewRecurrenceType( RecurrenceRule::rWeekly, freq );
+ if ( !rrule ) return;
+ rrule->setWeekStart( weekStart );
+ updated();
+}
+
+void Recurrence::setWeekly( int freq, const QBitArray &days, int weekStart )
+{
+ setWeekly( freq, weekStart );
+ addMonthlyPos( 0, days );
+}
+
+void Recurrence::addWeeklyDays( const QBitArray &days )
+{
+ addMonthlyPos( 0, days );
+}
+
+void Recurrence::setMonthly( int freq )
+{
+ if ( setNewRecurrenceType( RecurrenceRule::rMonthly, freq ) )
+ updated();
+}
+
+void Recurrence::addMonthlyPos( short pos, const QBitArray &days )
+{
+ // Allow 53 for yearly!
+ if ( mRecurReadOnly || pos > 53 || pos < -53 ) return;
+ RecurrenceRule *rrule = defaultRRule( false );
+ if ( !rrule ) return;
+ bool changed = false;
+ QValueList<RecurrenceRule::WDayPos> positions = rrule->byDays();
+
+ for ( int i = 0; i < 7; ++i ) {
+ if ( days.testBit(i) ) {
+ RecurrenceRule::WDayPos p( pos, i + 1 );
+ if ( !positions.contains( p ) ) {
+ changed = true;
+ positions.append( p );
+ }
+ }
+ }
+ if ( changed ) {
+ rrule->setByDays( positions );
+ updated();
+ }
+}
+
+
+void Recurrence::addMonthlyPos( short pos, ushort day )
+{
+ // Allow 53 for yearly!
+ if ( mRecurReadOnly || pos > 53 || pos < -53 ) return;
+ RecurrenceRule *rrule = defaultRRule( false );
+ if ( !rrule ) return;
+ QValueList<RecurrenceRule::WDayPos> positions = rrule->byDays();
+
+ RecurrenceRule::WDayPos p( pos, day );
+ if ( !positions.contains( p ) ) {
+ positions.append( p );
+ rrule->setByDays( positions );
+ updated();
+ }
+}
+
+
+void Recurrence::addMonthlyDate( short day )
+{
+ if ( mRecurReadOnly || day > 31 || day < -31 ) return;
+ RecurrenceRule *rrule = defaultRRule( true );
+ if ( !rrule ) return;
+
+ QValueList<int> monthDays = rrule->byMonthDays();
+ if ( !monthDays.contains( day ) ) {
+ monthDays.append( day );
+ rrule->setByMonthDays( monthDays );
+ updated();
+ }
+}
+
+void Recurrence::setYearly( int freq )
+{
+ if ( setNewRecurrenceType( RecurrenceRule::rYearly, freq ) )
+ updated();
+}
+
+
+// Daynumber within year
+void Recurrence::addYearlyDay( int day )
+{
+ RecurrenceRule *rrule = defaultRRule( false ); // It must already exist!
+ if ( !rrule ) return;
+
+ QValueList<int> days = rrule->byYearDays();
+ if ( !days.contains( day ) ) {
+ days << day;
+ rrule->setByYearDays( days );
+ updated();
+ }
+}
+
+// day part of date within year
+void Recurrence::addYearlyDate( int day )
+{
+ addMonthlyDate( day );
+}
+
+// day part of date within year, given as position (n-th weekday)
+void Recurrence::addYearlyPos( short pos, const QBitArray &days )
+{
+ addMonthlyPos( pos, days );
+}
+
+
+// month part of date within year
+void Recurrence::addYearlyMonth( short month )
+{
+ if ( mRecurReadOnly || month < 1 || month > 12 ) return;
+ RecurrenceRule *rrule = defaultRRule( false );
+ if ( !rrule ) return;
+
+ QValueList<int> months = rrule->byMonths();
+ if ( !months.contains(month) ) {
+ months << month;
+ rrule->setByMonths( months );
+ updated();
+ }
+}
+
+
+TimeList Recurrence::recurTimesOn( const QDate &date ) const
+{
+ TimeList times;
+ // The whole day is excepted
+ if ( mExDates.contains( date ) ) return times;
+ // EXRULE takes precedence over RDATE entries, so for floating events,
+ // a matching excule also excludes the whole day automatically
+ if ( doesFloat() ) {
+ for ( RecurrenceRule::List::ConstIterator rr = mExRules.begin(); rr != mExRules.end(); ++rr ) {
+ if ( (*rr)->recursOn( date ) )
+ return times;
+ }
+ }
+
+ if ( startDate() == date ) times << startDateTime().time();
+ bool foundDate = false;
+ for ( DateTimeList::ConstIterator it = mRDateTimes.begin();
+ it != mRDateTimes.end(); ++it ) {
+ if ( (*it).date() == date ) {
+ times << (*it).time();
+ foundDate = true;
+ } else if (foundDate) break; // <= Assume that the rdatetime list is sorted
+ }
+ for ( RecurrenceRule::List::ConstIterator rr = mRRules.begin(); rr != mRRules.end(); ++rr ) {
+ times += (*rr)->recurTimesOn( date );
+ }
+ qSortUnique( times );
+
+ foundDate = false;
+ TimeList extimes;
+ for ( DateTimeList::ConstIterator it = mExDateTimes.begin();
+ it != mExDateTimes.end(); ++it ) {
+ if ( (*it).date() == date ) {
+ extimes << (*it).time();
+ foundDate = true;
+ } else if (foundDate) break;
+ }
+ if ( !doesFloat() ) { // we have already checked floating times above
+ for ( RecurrenceRule::List::ConstIterator rr = mExRules.begin(); rr != mExRules.end(); ++rr ) {
+ extimes += (*rr)->recurTimesOn( date );
+ }
+ }
+ qSortUnique( extimes );
+
+ for ( TimeList::Iterator it = extimes.begin(); it != extimes.end(); ++it ) {
+ times.remove( (*it) );
+ }
+ return times;
+}
+
+
+QDateTime Recurrence::getNextDateTime( const QDateTime &preDateTime ) const
+{
+//kdDebug(5800) << " Recurrence::getNextDateTime after " << preDateTime << endl;
+ QDateTime nextDT = preDateTime;
+ // prevent infinite loops, e.g. when an exrule extinguishes an rrule (e.g.
+ // the exrule is identical to the rrule). If an occurrence is found, break
+ // out of the loop by returning that QDateTime
+// TODO_Recurrence: Is a loop counter of 1000 really okay? I mean for secondly
+// recurrence, an exdate might exclude more than 1000 intervals!
+ int loop = 0;
+ while ( loop < 1000 ) {
+ // Outline of the algo:
+ // 1) Find the next date/time after preDateTime when the event could recur
+ // 1.0) Add the start date if it's after preDateTime
+ // 1.1) Use the next occurrence from the explicit RDATE lists
+ // 1.2) Add the next recurrence for each of the RRULEs
+ // 2) Take the earliest recurrence of these = QDateTime nextDT
+ // 3) If that date/time is not excluded, either explicitly by an EXDATE or
+ // by an EXRULE, return nextDT as the next date/time of the recurrence
+ // 4) If it's excluded, start all at 1), but starting at nextDT (instead
+ // of preDateTime). Loop at most 1000 times.
+ ++loop;
+ // First, get the next recurrence from the RDate lists
+ DateTimeList dates;
+ if ( nextDT < startDateTime() ) dates << startDateTime();
+ DateTimeList::ConstIterator it = mRDateTimes.begin();
+ // Assume that the rdatetime list is sorted
+ while ( it != mRDateTimes.end() && (*it) <= nextDT ) ++it;
+ if ( it != mRDateTimes.end() ) dates << (*it);
+
+/*kdDebug(5800) << " nextDT: " << nextDT << ", startDT: " << startDateTime() << endl;
+kdDebug(5800) << " getNextDateTime: found " << dates.count() << " RDATES and DTSTART in loop " << loop << endl;*/
+ DateList::ConstIterator dit = mRDates.begin();
+ while ( dit != mRDates.end() && QDateTime( (*dit), startDateTime().time() ) <= nextDT ) ++dit;
+ if ( dit != mRDates.end() ) dates << QDateTime( (*dit), startDateTime().time() );
+
+ // Add the next occurrences from all RRULEs.
+ for ( RecurrenceRule::List::ConstIterator rr = mRRules.begin(); rr != mRRules.end(); ++rr ) {
+ QDateTime dt = (*rr)->getNextDate( nextDT );
+ if ( dt.isValid() ) dates << dt;
+ }
+
+ // Take the first of these (all others can't be used later on)
+ qSortUnique( dates );
+// kdDebug(5800) << " getNextDateTime: found " << dates.count() << " dates in loop " << loop << endl;
+
+ if ( dates.isEmpty() ) return QDateTime();
+ nextDT = dates.first();
+
+ // Check if that date/time is excluded explicitly or by an exrule:
+ if ( !mExDates.contains( nextDT.date() ) && !mExDateTimes.contains( nextDT ) ) {
+// kdDebug(5800) << " NextDT" << nextDT << " not excluded by EXDATE " << endl;
+ bool allowed = true;
+ for ( RecurrenceRule::List::ConstIterator rr = mExRules.begin(); rr != mExRules.end(); ++rr ) {
+ allowed = allowed && !( (*rr)->recursAt( nextDT ) );
+ }
+// kdDebug(5800) << " NextDT " << nextDT << ", allowed=" << allowed << endl;
+ if ( allowed ) return nextDT;
+ }
+ }
+
+ // Couldn't find a valid occurrences in 1000 loops, something is wrong!
+ return QDateTime();
+}
+
+QDateTime Recurrence::getPreviousDateTime( const QDateTime &afterDateTime ) const
+{
+ QDateTime prevDT = afterDateTime;
+ // prevent infinite loops, e.g. when an exrule extinguishes an rrule (e.g.
+ // the exrule is identical to the rrule). If an occurrence is found, break
+ // out of the loop by returning that QDateTime
+ int loop = 0;
+ while ( loop < 1000 ) {
+ // Outline of the algo:
+ // 1) Find the next date/time after preDateTime when the event could recur
+ // 1.1) Use the next occurrence from the explicit RDATE lists
+ // 1.2) Add the next recurrence for each of the RRULEs
+ // 2) Take the earliest recurrence of these = QDateTime nextDT
+ // 3) If that date/time is not excluded, either explicitly by an EXDATE or
+ // by an EXRULE, return nextDT as the next date/time of the recurrence
+ // 4) If it's excluded, start all at 1), but starting at nextDT (instead
+ // of preDateTime). Loop at most 1000 times.
+ ++loop;
+ // First, get the next recurrence from the RDate lists
+ DateTimeList dates;
+ if ( prevDT > startDateTime() ) dates << startDateTime();
+
+ DateTimeList::ConstIterator dtit = mRDateTimes.end();
+ if ( dtit != mRDateTimes.begin() ) {
+ do {
+ --dtit;
+ } while ( dtit != mRDateTimes.begin() && (*dtit) >= prevDT );
+ if ( (*dtit) < prevDT ) dates << (*dtit);
+ }
+
+ DateList::ConstIterator dit = mRDates.end();
+ if ( dit != mRDates.begin() ) {
+ do {
+ --dit;
+ } while ( dit != mRDates.begin() && QDateTime((*dit), startDateTime().time()) >= prevDT );
+ if ( QDateTime((*dit), startDateTime().time()) < prevDT )
+ dates << QDateTime( (*dit), startDateTime().time() );
+ }
+
+ // Add the previous occurrences from all RRULEs.
+ for ( RecurrenceRule::List::ConstIterator rr = mRRules.begin(); rr != mRRules.end(); ++rr ) {
+ QDateTime dt = (*rr)->getPreviousDate( prevDT );
+ if ( dt.isValid() ) dates << dt;
+ }
+//kdDebug(5800) << " getPreviousDateTime: found " << dates.count() << " dates in loop " << loop << endl;
+
+ // Take the last of these (all others can't be used later on)
+ qSortUnique( dates );
+ if ( dates.isEmpty() ) return QDateTime();
+ prevDT = dates.last();
+
+ // Check if that date/time is excluded explicitly or by an exrule:
+ if ( !mExDates.contains( prevDT.date() ) && !mExDateTimes.contains( prevDT ) ) {
+ bool allowed = true;
+ for ( RecurrenceRule::List::ConstIterator rr = mExRules.begin(); rr != mExRules.end(); ++rr ) {
+ allowed = allowed && !( (*rr)->recursAt( prevDT ) );
+ }
+ if ( allowed ) return prevDT;
+ }
+ }
+
+ // Couldn't find a valid occurrences in 1000 loops, something is wrong!
+ return QDateTime();
+}
+
+
+/***************************** PROTECTED FUNCTIONS ***************************/
+
+
+RecurrenceRule::List Recurrence::rRules() const
+{
+ return mRRules;
+}
+
+void Recurrence::addRRule( RecurrenceRule *rrule )
+{
+ if ( mRecurReadOnly || !rrule ) return;
+ rrule->setFloats( mFloating );
+ mRRules.append( rrule );
+ rrule->addObserver( this );
+ updated();
+}
+
+void Recurrence::removeRRule( RecurrenceRule *rrule )
+{
+ if (mRecurReadOnly) return;
+ mRRules.remove( rrule );
+ rrule->removeObserver( this );
+ updated();
+}
+
+RecurrenceRule::List Recurrence::exRules() const
+{
+ return mExRules;
+}
+
+void Recurrence::addExRule( RecurrenceRule *exrule )
+{
+ if ( mRecurReadOnly || !exrule ) return;
+ exrule->setFloats( mFloating );
+ mExRules.append( exrule );
+ exrule->addObserver( this );
+ updated();
+}
+
+void Recurrence::removeExRule( RecurrenceRule *exrule )
+{
+ if (mRecurReadOnly) return;
+ mExRules.remove( exrule );
+ exrule->removeObserver( this );
+ updated();
+}
+
+
+DateTimeList Recurrence::rDateTimes() const
+{
+ return mRDateTimes;
+}
+
+void Recurrence::setRDateTimes( const DateTimeList &rdates )
+{
+ if ( mRecurReadOnly ) return;
+ mRDateTimes = rdates;
+ qSortUnique( mRDateTimes );
+ updated();
+}
+
+void Recurrence::addRDateTime( const QDateTime &rdate )
+{
+ if ( mRecurReadOnly ) return;
+ mRDateTimes.append( rdate );
+ qSortUnique( mRDateTimes );
+ updated();
+}
+
+
+DateList Recurrence::rDates() const
+{
+ return mRDates;
+}
+
+void Recurrence::setRDates( const DateList &rdates )
+{
+ if ( mRecurReadOnly ) return;
+ mRDates = rdates;
+ qSortUnique( mRDates );
+ updated();
+}
+
+void Recurrence::addRDate( const QDate &rdate )
+{
+ if ( mRecurReadOnly ) return;
+ mRDates.append( rdate );
+ qSortUnique( mRDates );
+ updated();
+}
+
+
+DateTimeList Recurrence::exDateTimes() const
+{
+ return mExDateTimes;
+}
+
+void Recurrence::setExDateTimes( const DateTimeList &exdates )
+{
+ if ( mRecurReadOnly ) return;
+ mExDateTimes = exdates;
+ qSortUnique( mExDateTimes );
+}
+
+void Recurrence::addExDateTime( const QDateTime &exdate )
+{
+ if ( mRecurReadOnly ) return;
+ mExDateTimes.append( exdate );
+ qSortUnique( mExDateTimes );
+ updated();
+}
+
+
+DateList Recurrence::exDates() const
+{
+ return mExDates;
+}
+
+void Recurrence::setExDates( const DateList &exdates )
+{
+ if ( mRecurReadOnly ) return;
+ mExDates = exdates;
+ qSortUnique( mExDates );
+ updated();
+}
+
+void Recurrence::addExDate( const QDate &exdate )
+{
+ if ( mRecurReadOnly ) return;
+ mExDates.append( exdate );
+ qSortUnique( mExDates );
+ updated();
+}
+
+void Recurrence::recurrenceChanged( RecurrenceRule * )
+{
+ updated();
+}
+
+
+// %%%%%%%%%%%%%%%%%% end:Recurrencerule %%%%%%%%%%%%%%%%%%
+
+void Recurrence::dump() const
+{
+ kdDebug(5800) << "Recurrence::dump():" << endl;
+
+ kdDebug(5800) << " -) " << mRRules.count() << " RRULEs: " << endl;
+ for ( RecurrenceRule::List::ConstIterator rr = mRRules.begin(); rr != mRRules.end(); ++rr ) {
+ kdDebug(5800) << " -) RecurrenceRule : " << endl;
+ (*rr)->dump();
+ }
+ kdDebug(5800) << " -) " << mExRules.count() << " EXRULEs: " << endl;
+ for ( RecurrenceRule::List::ConstIterator rr = mExRules.begin(); rr != mExRules.end(); ++rr ) {
+ kdDebug(5800) << " -) ExceptionRule : " << endl;
+ (*rr)->dump();
+ }
+
+
+ kdDebug(5800) << endl << " -) " << mRDates.count() << " Recurrence Dates: " << endl;
+ for ( DateList::ConstIterator it = mRDates.begin(); it != mRDates.end(); ++it ) {
+ kdDebug(5800) << " " << (*it) << endl;
+ }
+ kdDebug(5800) << endl << " -) " << mRDateTimes.count() << " Recurrence Date/Times: " << endl;
+ for ( DateTimeList::ConstIterator it = mRDateTimes.begin(); it != mRDateTimes.end(); ++it ) {
+ kdDebug(5800) << " " << (*it) << endl;
+ }
+ kdDebug(5800) << endl << " -) " << mExDates.count() << " Exceptions Dates: " << endl;
+ for ( DateList::ConstIterator it = mExDates.begin(); it != mExDates.end(); ++it ) {
+ kdDebug(5800) << " " << (*it) << endl;
+ }
+ kdDebug(5800) << endl << " -) " << mExDateTimes.count() << " Exception Date/Times: " << endl;
+ for ( DateTimeList::ConstIterator it = mExDateTimes.begin(); it != mExDateTimes.end(); ++it ) {
+ kdDebug(5800) << " " << (*it) << endl;
+ }
+}
diff --git a/libkcal/recurrence.h b/libkcal/recurrence.h
new file mode 100644
index 00000000..773a9d63
--- /dev/null
+++ b/libkcal/recurrence.h
@@ -0,0 +1,513 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 1998 Preston Brown <pbrown@kde.org>
+ Copyright (c) 2001,2003 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (c) 2002 David Jarvie <software@astrojar.org.uk>
+ Copyright (C) 2005 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_RECURRENCE_H
+#define KCAL_RECURRENCE_H
+
+#include <qstring.h>
+#include <qbitarray.h>
+#include <qptrlist.h>
+
+#include "libkcal_export.h"
+#include "recurrencerule.h"
+
+namespace KCal {
+
+class RecurrenceRule;
+
+/**
+ This class represents a recurrence rule for a calendar incidence.
+
+ It manages all recurrence rules, recurrence date/times, exception rules
+ and exception date times that can appear inside calendar items.
+ Each recurrence rule and exception rule is represented as an object
+ of type RecurrenceRule.
+
+ For the simple case where at most one recurrence
+ rule is present, this class provides shortcut methods to set the type:
+ setMinutely()
+ setHourly()
+ setDaily()
+ setWeekly()
+ setMonthly()
+ setYearly()
+ to set/get general information about the recurrence:
+ setEndDate()
+ setEndDateTime()
+ duration()
+ durationTo()
+ setDuration()
+ frequency()
+ setFrequency()
+ and to set/get specific information about the recurrence within the interval:
+ days()
+ monthDays()
+ monthPositions()
+ yearDays()
+ yearDates()
+ yearMonths()
+ yearPositions()
+ addMonthlyPos()
+ addMonthlyDate()
+ addYearlyDay()
+ addYearlyDate()
+ addYearlyPos()
+ addYearlyMonth()
+ These are all available so that you don't have to work on the RecurrenceRule
+ objects themselves.
+ In other words, in that simple situation the interface stays almost the
+ same compared to the old Recurrence class, which allowed only one
+ recurrence rule.
+
+ As soon as your recurrence consists of multiple recurrence rules or exception
+ rules, you cannot use the methods mentioned above any more (since each rule
+ will have a different type and different settings). If you still call
+ any of them, the set*ly methods will remove all rules and add one rule with
+ the specified type. The add* and the other set* methods will change only
+ the first recurrence rule, but leave the others untouched.
+*/
+class LIBKCAL_EXPORT Recurrence : public RecurrenceRule::Observer
+{
+ public:
+ class Observer {
+ public:
+ virtual ~Observer() {}
+ /** This method will be called on each change of the recurrence object */
+ virtual void recurrenceUpdated( Recurrence * ) = 0;
+ };
+
+ /** enumeration for describing how an event recurs, if at all. */
+ enum { rNone = 0, rMinutely = 0x001, rHourly = 0x0002, rDaily = 0x0003,
+ rWeekly = 0x0004, rMonthlyPos = 0x0005, rMonthlyDay = 0x0006,
+ rYearlyMonth = 0x0007, rYearlyDay = 0x0008, rYearlyPos = 0x0009,
+ rOther = 0x000A, rMax=0x00FF };
+
+ Recurrence();
+ Recurrence( const Recurrence& );
+ virtual ~Recurrence();
+
+ bool operator==( const Recurrence& ) const;
+ bool operator!=( const Recurrence& r ) const { return !operator==(r); }
+
+ /** Return the start date/time of the recurrence (Time for floating incidences will be 0:00).
+ @return the current start/time of the recurrence. */
+ QDateTime startDateTime() const;
+ /** Return the start date/time of the recurrence */
+ QDate startDate() const { return mStartDateTime.date(); }
+ /** Set start of recurrence, as a date and time. Also sets the incidence to non-floating.
+ @param start the new start date/time of the incidence.
+ */
+ void setStartDateTime( const QDateTime &start );
+ /** Set start of recurrence, as a date. Also sets the incidence to floating.
+ @param start The new start date of the incidence.
+ */
+ void setStartDate( const QDate &start );
+
+ /** Set whether the recurrence has no time, just a date.
+ * Floating means -- according to rfc2445 -- that the event has no time
+ * associated.
+ * N.B. This property is derived by default from whether setStartDateTime() or
+ * setStartDate() is called.
+ * @return whether the recurrence has a time (false) or it is just a date (true). */
+ bool doesFloat() const { return mFloating; }
+ /** Sets whether the dtstart is a floating time (i.e. has no time attached)
+ @param floats If the recurrence is for all-day item (true) or has a time associated (false).
+ */
+ void setFloats( bool floats );
+
+ /** Set if recurrence is read-only or can be changed. */
+ void setRecurReadOnly(bool readOnly) { mRecurReadOnly = readOnly; }
+ /** Returns true if the recurrence is read-only, or false if it can be changed. */
+ bool recurReadOnly() const { return mRecurReadOnly; }
+
+ /** Returns whether the event recurs at all. */
+ bool doesRecur() const;
+ /** Returns the event's recurrence status. See the enumeration at the top
+ * of this file for possible values. */
+ ushort recurrenceType() const;
+ /** Returns the recurrence status for a recurrence rule.
+ * See the enumeration at the top of this file for possible values. */
+ static ushort recurrenceType( const RecurrenceRule *rrule );
+ /** Returns true if the date specified is one on which the event will
+ * recur. */
+ bool recursOn( const QDate &qd ) const;
+ /** Returns true if the date/time specified is one at which the event will
+ * recur. Times are rounded down to the nearest minute to determine the result. */
+ bool recursAt( const QDateTime & ) const;
+ /** Removes all recurrence rules. Recurrence dates and exceptions are
+ not removed. */
+ void unsetRecurs();
+ /** Removes all recurrence and exception rules and dates. */
+ void clear();
+
+ /** Returns a list of the times on the specified date at which the
+ * recurrence will occur.
+ * @param date the date for which to find the recurrence times.
+ */
+ QValueList<QTime> recurTimesOn(const QDate &date) const;
+
+ /** Returns the date and time of the next recurrence, after the specified date/time.
+ * If the recurrence has no time, the next date after the specified date is returned.
+ * @param preDateTime the date/time after which to find the recurrence.
+ * @return date/time of next recurrence (strictly later than the given QDateTiem), or invalid date if none.
+ */
+ QDateTime getNextDateTime( const QDateTime& preDateTime ) const;
+ /** Returns the date and time of the last previous recurrence, before the specified date/time.
+ * If a time later than 00:00:00 is specified and the recurrence has no time, 00:00:00 on
+ * the specified date is returned if that date recurs.
+ * @param afterDateTime the date/time before which to find the recurrence.
+ * @return date/time of previous recurrence (strictly earlier than the given QDateTime), or invalid date if none.
+ */
+ QDateTime getPreviousDateTime( const QDateTime& afterDateTime ) const;
+
+ /** Returns frequency of recurrence, in terms of the recurrence time period type. */
+ int frequency() const;
+ /** Sets the frequency of recurrence, in terms of the recurrence time period type. */
+ void setFrequency(int freq);
+
+ /**
+ * Returns -1 if the event recurs infinitely, 0 if the end date is set,
+ * otherwise the total number of recurrences, including the initial occurrence.
+ */
+ int duration() const;
+ /** Sets the total number of times the event is to occur, including both the
+ * first and last. */
+ void setDuration(int duration);
+ /** Returns the number of recurrences up to and including the date/time specified. */
+ int durationTo(const QDateTime &) const;
+ /** Returns the number of recurrences up to and including the date specified. */
+ int durationTo( const QDate &date ) const { return durationTo( QDateTime( date, QTime( 23, 59, 59 ) ) ); }
+
+ /** Returns the date/time of the last recurrence.
+ * An invalid date is returned if the recurrence has no end.
+ */
+ QDateTime endDateTime() const;
+ /** Returns the date of the last recurrence.
+ * An invalid date is returned if the recurrence has no end.
+ */
+ QDate endDate() const;
+ /** Sets the date of the last recurrence. The end time is set to the recurrence start time.
+ * @param endDate the ending date after which to stop recurring. If the
+ * incidence is not floating, the end time will be 23:59.*/
+ void setEndDate( const QDate &endDate );
+ /** Sets the date and time of the last recurrence.
+ * @param endDateTime the ending date/time after which to stop recurring. */
+ void setEndDateTime( const QDateTime &endDateTime );
+
+
+
+ /** Sets an event to recur minutely. By default infinite recurrence is used.
+ To set an end date use the method setEndDate and to set the number
+ of occurrences use setDuration.
+
+ This method clears all recurrence rules and adds one rule with a
+ minutely recurrence. All other recurrence components (recurrence
+ date/times, exception date/times and exception rules) are not
+ modified.
+ * @param freq the frequency to recur, e.g. 2 is every other minute
+ */
+ void setMinutely( int freq );
+
+ /** Sets an event to recur hourly. By default infinite recurrence is used.
+ The minute of the recurrence is taken from the start date (if you
+ need to change it, you will have to modify the defaultRRule's
+ byMinute list manually.
+ To set an end date use the method setEndDate and to set the number
+ of occurrences use setDuration.
+
+ This method clears all recurrence rules and adds one rule with a
+ hourly recurrence. All other recurrence components (recurrence
+ date/times, exception date/times and exception rules) are not
+ modified.
+ * @param freq the frequency to recur, e.g. 2 is every other hour
+ */
+ void setHourly( int freq );
+
+ /** Sets an event to recur daily. By default infinite recurrence is used.
+ The minute and second of the recurrence is taken from the start date
+ (if you need to change them, you will have to modify the defaultRRule's
+ byMinute list manually.
+ To set an end date use the method setEndDate and to set the number
+ of occurrences use setDuration.
+
+ This method clears all recurrence rules and adds one rule with a
+ daily recurrence. All other recurrence components (recurrence
+ date/times, exception date/times and exception rules) are not
+ modified.
+ * @param freq the frequency to recur, e.g. 2 is every other day
+ */
+ void setDaily( int freq );
+
+ /** Sets an event to recur weekly. By default infinite recurrence is used.
+ To set an end date use the method setEndDate and to set the number
+ of occurrences use setDuration.
+
+ This method clears all recurrence rules and adds one rule with a
+ weekly recurrence. All other recurrence components (recurrence
+ date/times, exception date/times and exception rules) are not
+ modified.
+ * @param freq the frequency to recur, e.g. every other week etc.
+ * @param weekStart the first day of the week (Monday=1 .. Sunday=7, default is Monday).
+ */
+ void setWeekly( int freq, int weekStart = 1 );
+ /** Sets an event to recur weekly. By default infinite recurrence is used.
+ To set an end date use the method setEndDate and to set the number
+ of occurrences use setDuration.
+
+ This method clears all recurrence rules and adds one rule with a
+ weekly recurrence. All other recurrence components (recurrence
+ date/times, exception date/times and exception rules) are not
+ modified.
+ * @param freq the frequency to recur, e.g. every other week etc.
+ * @param days a 7 bit array indicating which days on which to recur (bit 0 = Monday).
+ * @param weekStart the first day of the week (Monday=1 .. Sunday=7, default is Monday).
+ */
+ void setWeekly( int freq, const QBitArray &days, int weekStart = 1 );
+ /** Adds days to the weekly day recurrence list.
+ * @param days a 7 bit array indicating which days on which to recur (bit 0 = Monday).
+ */
+ void addWeeklyDays( const QBitArray &days );
+ /** Returns the first day of the week. Uses only the
+ * first RRULE if present (i.e. a second RRULE as well as all EXRULES are
+ * ignored!
+ * @return Weekday of the first day of the week (Monday=1 .. Sunday=7)
+ */
+ int weekStart() const;
+ /** Returns week day mask (bit 0 = Monday). */
+ QBitArray days() const; // Emulate the old behavior
+
+ /** Sets an event to recur monthly. By default infinite recurrence is used.
+ The date of the monthly recurrence will be taken from the start date
+ unless you explicitly add one or more recurrence dates with
+ addMonthlyDate or a recurrence position in the month (e.g. first
+ monday) using addMonthlyPos.
+ To set an end date use the method setEndDate and to set the number
+ of occurrences use setDuration.
+
+ This method clears all recurrence rules and adds one rule with a
+ monthly recurrence. All other recurrence components (recurrence
+ date/times, exception date/times and exception rules) are not
+ modified.
+ * @param freq the frequency to recur, e.g. 3 for every third month.
+ */
+ void setMonthly( int freq );
+ /** Adds a position (e.g. first monday) to the monthly recurrence rule.
+ * @param pos the position in the month for the recurrence, with valid
+ * values being 1-5 (5 weeks max in a month).
+ * @param days the days for the position to recur on (bit 0 = Monday).
+ * Example: pos = 2, and bits 0 and 2 are set in days:
+ * the rule is to repeat every 2nd Monday and Wednesday in the month.
+ */
+ void addMonthlyPos( short pos, const QBitArray &days );
+ void addMonthlyPos( short pos, ushort day );
+ /** Adds a date (e.g. the 15th of each month) to the monthly day
+ * recurrence list.
+ * @param day the date in the month to recur.
+ */
+ void addMonthlyDate( short day );
+ /** Returns list of day positions in months. */
+ QValueList<RecurrenceRule::WDayPos> monthPositions() const;
+ /** Returns list of day numbers of a month. */
+ // Emulate old behavior
+ QValueList<int> monthDays() const;
+
+ /** Sets an event to recur yearly. By default, this will recur every year
+ * on the same date (e.g. every year on April 15 if the start date was
+ * April 15).
+ * The day of the year can be specified with addYearlyDay().
+ * The day of the month can be specified with addYearlyByDate
+ * If both a month and a day ar specified with addYearlyMonth and
+ * addYearlyDay, the day is understood as day number within the month.
+ *
+ * A position (e.g. 3rd Sunday of year/month, or last Friday of year/month)
+ * can be specified with addYearlyPos. Again, if a month is specified,
+ * this position is understood as within that month, otherwise within
+ * the year.
+ *
+ * By default infinite recurrence is used. To set an end date use the
+ * method setEndDate and to set the number of occurrences use setDuration.
+
+ This method clears all recurrence rules and adds one rule with a
+ yearly recurrence. All other recurrence components (recurrence
+ date/times, exception date/times and exception rules) are not
+ modified.
+ * @param freq the frequency to recur, e.g. 3 for every third year.
+ */
+ void setYearly( int freq );
+ /** Adds day number of year within a yearly recurrence.
+ * By default infinite recurrence is used. To set an end date use the
+ * method setEndDate and to set the number of occurrences use setDuration.
+ * @param day the day of the year for the event. E.g. if day is 60, this
+ * means Feb 29 in leap years and March 1 in non-leap years.
+ */
+ void addYearlyDay( int day );
+ /** Adds date within a yearly recurrence. The month(s) for the recurrence
+ * can be specified with addYearlyMonth(), otherwise the month of the
+ * start date is used.
+ *
+ * By default infinite recurrence is used. To set an end date use the
+ * method setEndDate and to set the number of occurrences use setDuration.
+ * @param date the day of the month for the event
+ */
+ void addYearlyDate( int date );
+ /** Adds month in yearly recurrence. You can specify specific day numbers
+ * within the months (by calling addYearlyDate()) or specific day positions
+ * within the month (by calling addYearlyPos).
+ * @param _rNum the month in which the event shall recur.
+ */
+ void addYearlyMonth( short _rNum );
+ /** Adds position within month/year within a yearly recurrence. If months
+ * are specified (via addYearlyMonth()), the parameters are understood as
+ * position within these months, otherwise within the year.
+ *
+ * By default infinite recurrence is used.
+ * To set an end date use the method setEndDate and to set the number
+ * of occurrences use setDuration.
+ * @param pos the position in the month/year for the recurrence, with valid
+ * values being 1 to 53 and -1 to -53 (53 weeks max in a year).
+ * @param days the days for the position to recur on (bit 0 = Monday).
+ * Example: pos = 2, and bits 0 and 2 are set in days
+ * If months are specified (via addYearlyMonth), e.g. March, the rule is
+ * to repeat every year on the 2nd Monday and Wednesday of March.
+ * If no months are specified, the fule is to repeat every year on the
+ * 2nd Monday and Wednesday of the year.
+ */
+ void addYearlyPos( short pos, const QBitArray &days );
+
+ /** Returns the day numbers within a yearly recurrence.
+ * @return the days of the year for the event. E.g. if the list contains
+ * 60, this means the recurrence happens on day 60 of the year, i.e.
+ * on Feb 29 in leap years and March 1 in non-leap years.
+ */
+ QValueList<int> yearDays() const;
+ /** Returns the dates within a yearly recurrence.
+ * @return the days of the month for the event. E.g. if the list contains
+ * 13, this means the recurrence happens on the 13th of the month.
+ * The months for the recurrence can be obtained through
+ * yearlyMonths(). If this list is empty, the month of the start
+ * date is used.
+ */
+ QValueList<int> yearDates() const;
+ /** Returns the months within a yearly recurrence.
+ * @return the months for the event. E.g. if the list contains
+ * 11, this means the recurrence happens in November.
+ * The days for the recurrence can be obtained either through
+ * yearDates() if they are given as dates within the month or
+ * through yearlyPositions() if they are given as positions within the
+ * month. If none is specified, the date of the start date is used.
+ */
+ QValueList<int> yearMonths() const;
+ /** Returns the positions within a yearly recurrence.
+ * @return the positions for the event, either within a month (if months
+ * are set through addYearlyMonth()) or within the year.
+ * E.g. if the list contains {Pos=3, Day=5}, this means the third
+ * friday. If a month is set this position is understoodas third
+ * Friday in the given months, otherwise as third Friday of the
+ * year.
+ */
+ /** Returns list of day positions in months, for a recursYearlyPos recurrence rule. */
+ QValueList<RecurrenceRule::WDayPos> yearPositions() const;
+
+ /** Upper date limit for recurrences */
+ static const QDate MAX_DATE;
+
+ /**
+ Debug output.
+ */
+ void dump() const;
+
+
+ // RRULE
+ RecurrenceRule::List rRules() const;
+ void addRRule( RecurrenceRule *rrule );
+ void removeRRule( RecurrenceRule *rrule );
+ // EXRULE
+ RecurrenceRule::List exRules() const;
+ void addExRule( RecurrenceRule *exrule );
+ void removeExRule( RecurrenceRule *exrule );
+
+ // RDATE
+ DateTimeList rDateTimes() const;
+ DateList rDates() const;
+ void setRDateTimes( const DateTimeList &rdates);
+ void setRDates( const DateList &rdates);
+ void addRDateTime( const QDateTime &rdate );
+ void addRDate( const QDate &rdate );
+
+ // ExDATE
+ DateTimeList exDateTimes() const;
+ DateList exDates() const;
+ void setExDateTimes( const DateTimeList &exdates);
+ void setExDates( const DateList &exdates);
+ void addExDateTime( const QDateTime &exdate );
+ void addExDate( const QDate &exdate );
+
+ RecurrenceRule *defaultRRule( bool create = false ) const;
+ RecurrenceRule *defaultRRuleConst() const;
+ void updated();
+
+ /**
+ Installs an observer. Whenever some setting of this recurrence
+ object is changed, the recurrenceUpdated( Recurrence* ) method
+ of each observer will be called to inform it of changes.
+ @param observer the Recurrence::Observer-derived object, which
+ will be installed as an observer of this object.
+ */
+ void addObserver( Observer *observer );
+ /**
+ Removes an observer that was added with addObserver. If the
+ given object was not an observer, it does nothing.
+ @param observer the Recurrence::Observer-derived object to
+ be removed from the list of observers of this object.
+ */
+ void removeObserver( Observer *observer );
+
+ void recurrenceChanged( RecurrenceRule * );
+
+ protected:
+ RecurrenceRule *setNewRecurrenceType( RecurrenceRule::PeriodType type, int freq );
+
+ private:
+ RecurrenceRule::List mExRules;
+ RecurrenceRule::List mRRules;
+ QValueList<QDateTime>mRDateTimes;
+ QValueList<QDate> mRDates;
+ QValueList<QDateTime> mExDateTimes;
+ QValueList<QDate> mExDates;
+
+ QDateTime mStartDateTime; // date/time of first recurrence
+ bool mFloating; // the recurrence has no time, just a date
+ bool mRecurReadOnly;
+
+ // Cache the type of the recurrence with the old system (e.g. MonthlyPos)
+ mutable ushort mCachedType;
+
+ QValueList<Observer*> mObservers;
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/recurrencerule.cpp b/libkcal/recurrencerule.cpp
new file mode 100644
index 00000000..ef6f9ccd
--- /dev/null
+++ b/libkcal/recurrencerule.cpp
@@ -0,0 +1,1428 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2005 Reinhold Kainhofer <reinhold@kainhofe.com>
+
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "recurrencerule.h"
+
+#include <kdebug.h>
+#include <kglobal.h>
+#include <qdatetime.h>
+#include <qstringlist.h>
+
+#include <limits.h>
+#include <math.h>
+
+using namespace KCal;
+
+
+// FIXME: If Qt is ever changed so that QDateTime:::addSecs takes into account
+// DST shifts, we need to use our own addSecs method, too, since we
+// need to caalculate things in UTC!
+/** Workaround for broken QDateTime::secsTo (at least in Qt 3.3). While
+ QDateTime::secsTo does take time zones into account, QDateTime::addSecs
+ does not, so we have a problem:
+ QDateTime d1(QDate(2005, 10, 30), QTime(1, 30, 0) );
+ QDateTime d2(QDate(2005, 10, 30), QTime(3, 30, 0) );
+
+ kdDebug(5800) << "d1=" << d1 << ", d2=" << d2 << endl;
+ kdDebug(5800) << "d1.secsTo(d2)=" << d1.secsTo(d2) << endl;
+ kdDebug(5800) << "d1.addSecs(d1.secsTo(d2))=" << d1.addSecs(d1.secsTo(d2)) << endl;
+ This code generates the following output:
+ libkcal: d1=Son Okt 30 01:30:00 2005, d2=Son Okt 30 03:30:00 2005
+ libkcal: d1.secsTo(d2)=10800
+ libkcal: d1.addSecs(d1.secsTo(d2))=Son Okt 30 04:30:00 2005
+ Notice that secsTo counts the hour between 2:00 and 3:00 twice, while
+ adddSecs doesn't and so has one additional hour. This basically makes it
+ impossible to use QDateTime for *any* calculations, in local time zone as
+ well as in UTC. Since we don't want to use
+ time zones anyway, but do all secondsly/minutely/hourly calculations in UTC,
+ we simply use our own secsTo, which ignores all time zone shifts. */
+long long ownSecsTo( const QDateTime &dt1, const QDateTime &dt2 )
+{
+ long long res = static_cast<long long>( dt1.date().daysTo( dt2.date() ) ) * 24*3600;
+ res += dt1.time().secsTo( dt2.time() );
+ return res;
+}
+
+
+
+/**************************************************************************
+ * DateHelper *
+ **************************************************************************/
+
+
+class DateHelper {
+ public:
+#ifndef NDEBUG
+ static QString dayName( short day );
+#endif
+ static QDate getNthWeek( int year, int weeknumber, short weekstart = 1 );
+ static int weekNumbersInYear( int year, short weekstart = 1 );
+ static int getWeekNumber( const QDate &date, short weekstart, int *year = 0 );
+ static int getWeekNumberNeg( const QDate &date, short weekstart, int *year = 0 );
+};
+
+
+#ifndef NDEBUG
+QString DateHelper::dayName( short day )
+{
+ switch ( day ) {
+ case 1: return "MO"; break;
+ case 2: return "TU"; break;
+ case 3: return "WE"; break;
+ case 4: return "TH"; break;
+ case 5: return "FR"; break;
+ case 6: return "SA"; break;
+ case 7: return "SU"; break;
+ default: return "??";
+ }
+}
+#endif
+
+
+QDate DateHelper::getNthWeek( int year, int weeknumber, short weekstart )
+{
+ if ( weeknumber == 0 ) return QDate();
+ // Adjust this to the first day of week #1 of the year and add 7*weekno days.
+ QDate dt( year, 1, 4 ); // Week #1 is the week that contains Jan 4
+ int adjust = -(7 + dt.dayOfWeek() - weekstart) % 7;
+ if ( weeknumber > 0 ) {
+ dt = dt.addDays( 7 * (weeknumber-1) + adjust );
+ } else if ( weeknumber < 0 ) {
+ dt = dt.addYears( 1 );
+ dt = dt.addDays( 7 * weeknumber + adjust );
+ }
+ return dt;
+}
+
+
+int DateHelper::getWeekNumber( const QDate &date, short weekstart, int *year )
+{
+// kdDebug(5800) << "Getting week number for " << date << " with weekstart="<<weekstart<<endl;
+ if ( year ) *year = date.year();
+ QDate dt( date.year(), 1, 4 ); // <= definitely in week #1
+ dt = dt.addDays( -(7 + dt.dayOfWeek() - weekstart) % 7 ); // begin of week #1
+ QDate dtn( date.year()+1, 1, 4 ); // <= definitely first week of next year
+ dtn = dtn.addDays( -(7 + dtn.dayOfWeek() - weekstart) % 7 );
+
+ int daysto = dt.daysTo( date );
+ int dayston = dtn.daysTo( date );
+ if ( daysto < 0 ) {
+ if ( year ) *year = date.year()-1;
+ dt = QDate( date.year()-1, 1, 4 );
+ dt = dt.addDays( -(7 + dt.dayOfWeek() - weekstart) % 7 ); // begin of week #1
+ daysto = dt.daysTo( date );
+ } else if ( dayston >= 0 ) {
+ // in first week of next year;
+ if ( year ) *year = date.year() + 1;
+ dt = dtn;
+ daysto = dayston;
+ }
+ return daysto / 7 + 1;
+}
+
+int DateHelper::weekNumbersInYear( int year, short weekstart )
+{
+ QDate dt( year, 1, weekstart );
+ QDate dt1( year + 1, 1, weekstart );
+ return dt.daysTo( dt1 ) / 7;
+}
+
+// Week number from the end of the year
+int DateHelper::getWeekNumberNeg( const QDate &date, short weekstart, int *year )
+{
+ int weekpos = getWeekNumber( date, weekstart, year );
+ return weekNumbersInYear( *year, weekstart ) - weekpos - 1;
+}
+
+
+
+
+
+/**************************************************************************
+ * RecurrenceRule::Constraint *
+ **************************************************************************/
+
+
+RecurrenceRule::Constraint::Constraint( int wkst )
+{
+ weekstart = wkst;
+ clear();
+}
+
+RecurrenceRule::Constraint::Constraint( const QDateTime &preDate, PeriodType type, int wkst )
+{
+ weekstart = wkst;
+ readDateTime( preDate, type );
+}
+
+void RecurrenceRule::Constraint::clear()
+{
+ year = 0;
+ month = 0;
+ day = 0;
+ hour = -1;
+ minute = -1;
+ second = -1;
+ weekday = 0;
+ weekdaynr = 0;
+ weeknumber = 0;
+ yearday = 0;
+}
+
+bool RecurrenceRule::Constraint::matches( const QDate &dt, RecurrenceRule::PeriodType type ) const
+{
+ // If the event recurs in week 53 or 1, the day might not belong to the same
+ // year as the week it is in. E.g. Jan 1, 2005 is in week 53 of year 2004.
+ // So we can't simply check the year in that case!
+ if ( weeknumber == 0 ) {
+ if ( year > 0 && year != dt.year() ) return false;
+ } else {
+ int y;
+ if ( weeknumber > 0 &&
+ weeknumber != DateHelper::getWeekNumber( dt, weekstart, &y ) ) return false;
+ if ( weeknumber < 0 &&
+ weeknumber != DateHelper::getWeekNumberNeg( dt, weekstart, &y ) ) return false;
+ if ( year > 0 && year != y ) return false;
+ }
+
+ if ( month > 0 && month != dt.month() ) return false;
+ if ( day > 0 && day != dt.day() ) return false;
+ if ( day < 0 && dt.day() != (dt.daysInMonth() + day + 1 ) ) return false;
+ if ( weekday > 0 ) {
+ if ( weekday != dt.dayOfWeek() ) return false;
+ if ( weekdaynr != 0 ) {
+ // If it's a yearly recurrence and a month is given, the position is
+ // still in the month, not in the year.
+ bool inMonth = (type == rMonthly) || ( type == rYearly && month > 0 );
+ // Monthly
+ if ( weekdaynr > 0 && inMonth &&
+ weekdaynr != (dt.day() - 1)/7 + 1 ) return false;
+ if ( weekdaynr < 0 && inMonth &&
+ weekdaynr != -((dt.daysInMonth() - dt.day() )/7 + 1 ) )
+ return false;
+ // Yearly
+ if ( weekdaynr > 0 && !inMonth &&
+ weekdaynr != (dt.dayOfYear() - 1)/7 + 1 ) return false;
+ if ( weekdaynr < 0 && !inMonth &&
+ weekdaynr != -((dt.daysInYear() - dt.dayOfYear() )/7 + 1 ) )
+ return false;
+ }
+ }
+ if ( yearday > 0 && yearday != dt.dayOfYear() ) return false;
+ if ( yearday < 0 && yearday != dt.daysInYear() - dt.dayOfYear() + 1 )
+ return false;
+ return true;
+}
+
+bool RecurrenceRule::Constraint::matches( const QDateTime &dt, RecurrenceRule::PeriodType type ) const
+{
+ if ( !matches( dt.date(), type ) ) return false;
+ if ( hour >= 0 && hour != dt.time().hour() ) return false;
+ if ( minute >= 0 && minute != dt.time().minute() ) return false;
+ if ( second >= 0 && second != dt.time().second() ) return false;
+ return true;
+}
+
+bool RecurrenceRule::Constraint::isConsistent( PeriodType /*period*/) const
+{
+ // TODO: Check for consistency, e.g. byyearday=3 and bymonth=10
+ return true;
+}
+
+QDateTime RecurrenceRule::Constraint::intervalDateTime( RecurrenceRule::PeriodType type ) const
+{
+ QDateTime dt;
+ dt.setTime( QTime( 0, 0, 0 ) );
+ dt.setDate( QDate( year, (month>0)?month:1, (day>0)?day:1 ) );
+ if ( day < 0 )
+ dt = dt.addDays( dt.date().daysInMonth() + day );
+ switch ( type ) {
+ case rSecondly:
+ dt.setTime( QTime( hour, minute, second ) ); break;
+ case rMinutely:
+ dt.setTime( QTime( hour, minute, 1 ) ); break;
+ case rHourly:
+ dt.setTime( QTime( hour, 1, 1 ) ); break;
+ case rDaily:
+ break;
+ case rWeekly:
+ dt = DateHelper::getNthWeek( year, weeknumber, weekstart ); break;
+ case rMonthly:
+ dt.setDate( QDate( year, month, 1 ) ); break;
+ case rYearly:
+ dt.setDate( QDate( year, 1, 1 ) ); break;
+ default:
+ break;
+ }
+ return dt;
+}
+
+
+// Y M D | H Mn S | WD #WD | WN | YD
+// required:
+// x | x x x | | |
+// 0) Trivial: Exact date given, maybe other restrictions
+// x x x | x x x | | |
+// 1) Easy case: no weekly restrictions -> at most a loop through possible dates
+// x + + | x x x | - - | - | -
+// 2) Year day is given -> date known
+// x | x x x | | | +
+// 3) week number is given -> loop through all days of that week. Further
+// restrictions will be applied in the end, when we check all dates for
+// consistency with the constraints
+// x | x x x | | + | (-)
+// 4) week day is specified ->
+// x | x x x | x ? | (-)| (-)
+// 5) All possiblecases have already been treated, so this must be an error!
+
+DateTimeList RecurrenceRule::Constraint::dateTimes( RecurrenceRule::PeriodType type ) const
+{
+// kdDebug(5800) << " RecurrenceRule::Constraint::dateTimes: " << endl;
+ DateTimeList result;
+ bool done = false;
+ // TODO_Recurrence: Handle floating
+ QTime tm( hour, minute, second );
+ if ( !isConsistent( type ) ) return result;
+
+ if ( !done && day > 0 && month > 0 ) {
+ QDateTime dt( QDate( year, month, day ), tm );
+ if ( dt.isValid() ) result.append( dt );
+ done = true;
+ }
+ if ( !done && day < 0 && month > 0 ) {
+ QDateTime dt( QDate( year, month, 1 ), tm );
+ dt = dt.addDays( dt.date().daysInMonth() + day );
+ if ( dt.isValid() ) result.append( dt );
+ done = true;
+ }
+
+
+ if ( !done && weekday == 0 && weeknumber == 0 && yearday == 0 ) {
+ // Easy case: date is given, not restrictions by week or yearday
+ uint mstart = (month>0) ? month : 1;
+ uint mend = (month <= 0) ? 12 : month;
+ for ( uint m = mstart; m <= mend; ++m ) {
+ uint dstart, dend;
+ if ( day > 0 ) {
+ dstart = dend = day;
+ } else if ( day < 0 ) {
+ QDate date( year, month, 1 );
+ dstart = dend = date.daysInMonth() + day + 1;
+ } else {
+ QDate date( year, month, 1 );
+ dstart = 1;
+ dend = date.daysInMonth();
+ }
+ for ( uint d = dstart; d <= dend; ++d ) {
+ QDateTime dt( QDate( year, m, d ), tm );
+ if ( dt.isValid() ) result.append( dt );
+ }
+ }
+ done = true;
+ }
+
+ // Else: At least one of the week / yearday restrictions was given...
+ // If we have a yearday (and of course a year), we know the exact date
+ if ( !done && yearday != 0 ) {
+ // yearday < 0 means from end of year, so we'll need Jan 1 of the next year
+ QDate d( year + ((yearday>0)?0:1), 1, 1 );
+ d = d.addDays( yearday - ((yearday>0)?1:0) );
+ result.append( QDateTime( d, tm ) );
+ done = true;
+ }
+
+ // Else: If we have a weeknumber, we have at most 7 possible dates, loop through them
+ if ( !done && weeknumber != 0 ) {
+ QDate wst( DateHelper::getNthWeek( year, weeknumber, weekstart ) );
+ if ( weekday != 0 ) {
+ wst = wst.addDays( (7 + weekday - weekstart ) % 7 );
+ result.append( QDateTime( wst, tm ) );
+ } else {
+ for ( int i = 0; i < 7; ++i ) {
+ result.append( QDateTime( wst, tm ) );
+ wst = wst.addDays( 1 );
+ }
+ }
+ done = true;
+ }
+
+ // weekday is given
+ if ( !done && weekday != 0 ) {
+ QDate dt( year, 1, 1 );
+ // If type == yearly and month is given, pos is still in month not year!
+ // TODO_Recurrence: Correct handling of n-th BYDAY...
+ int maxloop = 53;
+ bool inMonth = ( type == rMonthly) || ( type == rYearly && month > 0 );
+ if ( inMonth && month > 0 ) {
+ dt = QDate( year, month, 1 );
+ maxloop = 5;
+ }
+ if ( weekdaynr < 0 ) {
+ // From end of period (month, year) => relative to begin of next period
+ if ( inMonth )
+ dt = dt.addMonths( 1 );
+ else
+ dt = dt.addYears( 1 );
+ }
+ int adj = ( 7 + weekday - dt.dayOfWeek() ) % 7;
+ dt = dt.addDays( adj ); // correct first weekday of the period
+
+ if ( weekdaynr > 0 ) {
+ dt = dt.addDays( ( weekdaynr - 1 ) * 7 );
+ result.append( QDateTime( dt, tm ) );
+ } else if ( weekdaynr < 0 ) {
+ dt = dt.addDays( weekdaynr * 7 );
+ result.append( QDateTime( dt, tm ) );
+ } else {
+ // loop through all possible weeks, non-matching will be filtered later
+ for ( int i = 0; i < maxloop; ++i ) {
+ result.append( QDateTime( dt, tm ) );
+ dt = dt.addDays( 7 );
+ }
+ }
+ } // weekday != 0
+
+
+ // Only use those times that really match all other constraints, too
+ DateTimeList valid;
+ DateTimeList::Iterator it;
+ for ( it = result.begin(); it != result.end(); ++it ) {
+ if ( matches( *it, type ) ) valid.append( *it );
+ }
+ // Don't sort it here, would be unnecessary work. The results from all
+ // constraints will be merged to one big list of the interval. Sort that one!
+ return valid;
+}
+
+
+bool RecurrenceRule::Constraint::increase( RecurrenceRule::PeriodType type, int freq )
+{
+ // convert the first day of the interval to QDateTime
+ // Sub-daily types need to be converted to UTC to correctly handle DST shifts
+ QDateTime dt( intervalDateTime( type ) );
+
+ // Now add the intervals
+ switch ( type ) {
+ case rSecondly:
+ dt = dt.addSecs( freq ); break;
+ case rMinutely:
+ dt = dt.addSecs( 60*freq ); break;
+ case rHourly:
+ dt = dt.addSecs( 3600 * freq ); break;
+ case rDaily:
+ dt = dt.addDays( freq ); break;
+ case rWeekly:
+ dt = dt.addDays( 7*freq ); break;
+ case rMonthly:
+ dt = dt.addMonths( freq ); break;
+ case rYearly:
+ dt = dt.addYears( freq ); break;
+ default:
+ break;
+ }
+ // Convert back from QDateTime to the Constraint class
+ readDateTime( dt, type );
+
+ return true;
+}
+
+bool RecurrenceRule::Constraint::readDateTime( const QDateTime &preDate, PeriodType type )
+{
+ clear();
+ switch ( type ) {
+ // Really fall through! Only weekly needs to be treated differentely!
+ case rSecondly:
+ second = preDate.time().second();
+ case rMinutely:
+ minute = preDate.time().minute();
+ case rHourly:
+ hour = preDate.time().hour();
+ case rDaily:
+ day = preDate.date().day();
+ case rMonthly:
+ month = preDate.date().month();
+ case rYearly:
+ year = preDate.date().year();
+ break;
+
+ case rWeekly:
+ // Determine start day of the current week, calculate the week number from that
+ weeknumber = DateHelper::getWeekNumber( preDate.date(), weekstart, &year );
+ break;
+ default:
+ break;
+ }
+ return true;
+}
+
+
+RecurrenceRule::RecurrenceRule( )
+: mPeriod( rNone ), mFrequency( 0 ), mIsReadOnly( false ),
+ mFloating( false ),
+ mWeekStart(1)
+{
+}
+
+RecurrenceRule::RecurrenceRule( const RecurrenceRule &r )
+{
+ mRRule = r.mRRule;
+ mPeriod = r.mPeriod;
+ mDateStart = r.mDateStart;
+ mDuration = r.mDuration;
+ mDateEnd = r.mDateEnd;
+ mFrequency = r.mFrequency;
+
+ mIsReadOnly = r.mIsReadOnly;
+ mFloating = r.mFloating;
+
+ mBySeconds = r.mBySeconds;
+ mByMinutes = r.mByMinutes;
+ mByHours = r.mByHours;
+ mByDays = r.mByDays;
+ mByMonthDays = r.mByMonthDays;
+ mByYearDays = r.mByYearDays;
+ mByWeekNumbers = r.mByWeekNumbers;
+ mByMonths = r.mByMonths;
+ mBySetPos = r.mBySetPos;
+ mWeekStart = r.mWeekStart;
+
+ setDirty();
+}
+
+RecurrenceRule::~RecurrenceRule()
+{
+}
+
+bool RecurrenceRule::operator==( const RecurrenceRule& r ) const
+{
+ if ( mPeriod != r.mPeriod ) return false;
+ if ( mDateStart != r.mDateStart ) return false;
+ if ( mDuration != r.mDuration ) return false;
+ if ( mDateEnd != r.mDateEnd ) return false;
+ if ( mFrequency != r.mFrequency ) return false;
+
+ if ( mIsReadOnly != r.mIsReadOnly ) return false;
+ if ( mFloating != r.mFloating ) return false;
+
+ if ( mBySeconds != r.mBySeconds ) return false;
+ if ( mByMinutes != r.mByMinutes ) return false;
+ if ( mByHours != r.mByHours ) return false;
+ if ( mByDays != r.mByDays ) return false;
+ if ( mByMonthDays != r.mByMonthDays ) return false;
+ if ( mByYearDays != r.mByYearDays ) return false;
+ if ( mByWeekNumbers != r.mByWeekNumbers ) return false;
+ if ( mByMonths != r.mByMonths ) return false;
+ if ( mBySetPos != r.mBySetPos ) return false;
+ if ( mWeekStart != r.mWeekStart ) return false;
+
+ return true;
+}
+
+void RecurrenceRule::addObserver( Observer *observer )
+{
+ if ( !mObservers.contains( observer ) )
+ mObservers.append( observer );
+}
+
+void RecurrenceRule::removeObserver( Observer *observer )
+{
+ if ( mObservers.contains( observer ) )
+ mObservers.remove( observer );
+}
+
+
+
+void RecurrenceRule::setRecurrenceType( PeriodType period )
+{
+ if ( isReadOnly() ) return;
+ mPeriod = period;
+ setDirty();
+}
+
+QDateTime RecurrenceRule::endDt( bool *result ) const
+{
+ if ( result ) *result = false;
+ if ( mPeriod == rNone ) return QDateTime();
+ if ( mDuration < 0 ) return QDateTime();
+ if ( mDuration == 0 ) {
+ if ( result ) *result = true;
+ return mDateEnd;
+ }
+ // N occurrences. Check if we have a full cache. If so, return the cached end date.
+ if ( ! mCached ) {
+ // If not enough occurrences can be found (i.e. inconsistent constraints)
+ if ( !buildCache() ) return QDateTime();
+ }
+ if ( result ) *result = true;
+ return mCachedDateEnd;
+}
+
+void RecurrenceRule::setEndDt( const QDateTime &dateTime )
+{
+ if ( isReadOnly() ) return;
+ mDateEnd = dateTime;
+ mDuration = 0; // set to 0 because there is an end date/time
+ setDirty();
+}
+
+void RecurrenceRule::setDuration(int duration)
+{
+ if ( isReadOnly() ) return;
+ mDuration = duration;
+ setDirty();
+}
+
+void RecurrenceRule::setFloats( bool floats )
+{
+ if ( isReadOnly() ) return;
+ mFloating = floats;
+ setDirty();
+}
+
+void RecurrenceRule::clear()
+{
+ if ( isReadOnly() ) return;
+ mPeriod = rNone;
+ mBySeconds.clear();
+ mByMinutes.clear();
+ mByHours.clear();
+ mByDays.clear();
+ mByMonthDays.clear();
+ mByYearDays.clear();
+ mByWeekNumbers.clear();
+ mByMonths.clear();
+ mBySetPos.clear();
+ mWeekStart = 1;
+
+ setDirty();
+}
+
+void RecurrenceRule::setDirty()
+{
+ mConstraints.clear();
+ buildConstraints();
+ mDirty = true;
+ mCached = false;
+ mCachedDates.clear();
+ for ( QValueList<Observer*>::ConstIterator it = mObservers.begin();
+ it != mObservers.end(); ++it ) {
+ if ( (*it) ) (*it)->recurrenceChanged( this );
+ }
+}
+
+void RecurrenceRule::setStartDt( const QDateTime &start )
+{
+ if ( isReadOnly() ) return;
+ mDateStart = start;
+ setDirty();
+}
+
+void RecurrenceRule::setFrequency(int freq)
+{
+ if ( isReadOnly() || freq <= 0 ) return;
+ mFrequency = freq;
+ setDirty();
+}
+
+void RecurrenceRule::setBySeconds( const QValueList<int> bySeconds )
+{
+ if ( isReadOnly() ) return;
+ mBySeconds = bySeconds;
+ setDirty();
+}
+
+void RecurrenceRule::setByMinutes( const QValueList<int> byMinutes )
+{
+ if ( isReadOnly() ) return;
+ mByMinutes = byMinutes;
+ setDirty();
+}
+
+void RecurrenceRule::setByHours( const QValueList<int> byHours )
+{
+ if ( isReadOnly() ) return;
+ mByHours = byHours;
+ setDirty();
+}
+
+
+void RecurrenceRule::setByDays( const QValueList<WDayPos> byDays )
+{
+ if ( isReadOnly() ) return;
+ mByDays = byDays;
+ setDirty();
+}
+
+void RecurrenceRule::setByMonthDays( const QValueList<int> byMonthDays )
+{
+ if ( isReadOnly() ) return;
+ mByMonthDays = byMonthDays;
+ setDirty();
+}
+
+void RecurrenceRule::setByYearDays( const QValueList<int> byYearDays )
+{
+ if ( isReadOnly() ) return;
+ mByYearDays = byYearDays;
+ setDirty();
+}
+
+void RecurrenceRule::setByWeekNumbers( const QValueList<int> byWeekNumbers )
+{
+ if ( isReadOnly() ) return;
+ mByWeekNumbers = byWeekNumbers;
+ setDirty();
+}
+
+void RecurrenceRule::setByMonths( const QValueList<int> byMonths )
+{
+ if ( isReadOnly() ) return;
+ mByMonths = byMonths;
+ setDirty();
+}
+
+void RecurrenceRule::setBySetPos( const QValueList<int> bySetPos )
+{
+ if ( isReadOnly() ) return;
+ mBySetPos = bySetPos;
+ setDirty();
+}
+
+void RecurrenceRule::setWeekStart( short weekStart )
+{
+ if ( isReadOnly() ) return;
+ mWeekStart = weekStart;
+ setDirty();
+}
+
+
+
+// Taken from recurrence.cpp
+// int RecurrenceRule::maxIterations() const
+// {
+// /* Find the maximum number of iterations which may be needed to reach the
+// * next actual occurrence of a monthly or yearly recurrence.
+// * More than one iteration may be needed if, for example, it's the 29th February,
+// * the 31st day of the month or the 5th Monday, and the month being checked is
+// * February or a 30-day month.
+// * The following recurrences may never occur:
+// * - For rMonthlyDay: if the frequency is a whole number of years.
+// * - For rMonthlyPos: if the frequency is an even whole number of years.
+// * - For rYearlyDay, rYearlyMonth: if the frequeny is a multiple of 4 years.
+// * - For rYearlyPos: if the frequency is an even number of years.
+// * The maximum number of iterations needed, assuming that it does actually occur,
+// * was found empirically.
+// */
+// switch (recurs) {
+// case rMonthlyDay:
+// return (rFreq % 12) ? 6 : 8;
+//
+// case rMonthlyPos:
+// if (rFreq % 12 == 0) {
+// // Some of these frequencies may never occur
+// return (rFreq % 84 == 0) ? 364 // frequency = multiple of 7 years
+// : (rFreq % 48 == 0) ? 7 // frequency = multiple of 4 years
+// : (rFreq % 24 == 0) ? 14 : 28; // frequency = multiple of 2 or 1 year
+// }
+// // All other frequencies will occur sometime
+// if (rFreq > 120)
+// return 364; // frequencies of > 10 years will hit the date limit first
+// switch (rFreq) {
+// case 23: return 50;
+// case 46: return 38;
+// case 56: return 138;
+// case 66: return 36;
+// case 89: return 54;
+// case 112: return 253;
+// default: return 25; // most frequencies will need < 25 iterations
+// }
+//
+// case rYearlyMonth:
+// case rYearlyDay:
+// return 8; // only 29th Feb or day 366 will need more than one iteration
+//
+// case rYearlyPos:
+// if (rFreq % 7 == 0)
+// return 364; // frequencies of a multiple of 7 years will hit the date limit first
+// if (rFreq % 2 == 0) {
+// // Some of these frequencies may never occur
+// return (rFreq % 4 == 0) ? 7 : 14; // frequency = even number of years
+// }
+// return 28;
+// }
+// return 1;
+// }
+
+void RecurrenceRule::buildConstraints()
+{
+ mConstraints.clear();
+ Constraint con;
+ if ( mWeekStart > 0 ) con.weekstart = mWeekStart;
+ mConstraints.append( con );
+
+ Constraint::List tmp;
+ Constraint::List::const_iterator it;
+ QValueList<int>::const_iterator intit;
+
+ #define intConstraint( list, element ) \
+ if ( !list.isEmpty() ) { \
+ for ( it = mConstraints.constBegin(); it != mConstraints.constEnd(); ++it ) { \
+ for ( intit = list.constBegin(); intit != list.constEnd(); ++intit ) { \
+ con = (*it); \
+ con.element = (*intit); \
+ tmp.append( con ); \
+ } \
+ } \
+ mConstraints = tmp; \
+ tmp.clear(); \
+ }
+
+ intConstraint( mBySeconds, second );
+ intConstraint( mByMinutes, minute );
+ intConstraint( mByHours, hour );
+ intConstraint( mByMonthDays, day );
+ intConstraint( mByMonths, month );
+ intConstraint( mByYearDays, yearday );
+ intConstraint( mByWeekNumbers, weeknumber );
+ #undef intConstraint
+
+ if ( !mByDays.isEmpty() ) {
+ for ( it = mConstraints.constBegin(); it != mConstraints.constEnd(); ++it ) {
+ QValueList<WDayPos>::const_iterator dayit;
+ for ( dayit = mByDays.constBegin(); dayit != mByDays.constEnd(); ++dayit ) {
+ con = (*it);
+ con.weekday = (*dayit).day();
+ con.weekdaynr = (*dayit).pos();
+ tmp.append( con );
+ }
+ }
+ mConstraints = tmp;
+ tmp.clear();
+ }
+
+ #define fixConstraint( element, value ) \
+ { \
+ tmp.clear(); \
+ for ( it = mConstraints.constBegin(); it != mConstraints.constEnd(); ++it ) { \
+ con = (*it); con.element = value; tmp.append( con ); \
+ } \
+ mConstraints = tmp; \
+ }
+ // Now determine missing values from DTSTART. This can speed up things,
+ // because we have more restrictions and save some loops.
+
+ // TODO: Does RFC 2445 intend to restrict the weekday in all cases of weekly?
+ if ( mPeriod == rWeekly && mByDays.isEmpty() ) {
+ fixConstraint( weekday, mDateStart.date().dayOfWeek() );
+ }
+
+ // Really fall through in the cases, because all smaller time intervals are
+ // constrained from dtstart
+ switch ( mPeriod ) {
+ case rYearly:
+ if ( mByDays.isEmpty() && mByWeekNumbers.isEmpty() && mByYearDays.isEmpty() && mByMonths.isEmpty() ) {
+ fixConstraint( month, mDateStart.date().month() );
+ }
+ case rMonthly:
+ if ( mByDays.isEmpty() && mByWeekNumbers.isEmpty() && mByYearDays.isEmpty() && mByMonthDays.isEmpty() ) {
+ fixConstraint( day, mDateStart.date().day() );
+ }
+
+ case rWeekly:
+ case rDaily:
+ if ( mByHours.isEmpty() ) {
+ fixConstraint( hour, mDateStart.time().hour() );
+ }
+ case rHourly:
+ if ( mByMinutes.isEmpty() ) {
+ fixConstraint( minute, mDateStart.time().minute() );
+ }
+ case rMinutely:
+ if ( mBySeconds.isEmpty() ) {
+ fixConstraint( second, mDateStart.time().second() );
+ }
+ case rSecondly:
+ default:
+ break;
+ }
+ #undef fixConstraint
+
+ Constraint::List::Iterator conit = mConstraints.begin();
+ while ( conit != mConstraints.end() ) {
+ if ( (*conit).isConsistent( mPeriod ) ) {
+ ++conit;
+ } else {
+ conit = mConstraints.remove( conit );
+ }
+ }
+}
+
+bool RecurrenceRule::buildCache() const
+{
+kdDebug(5800) << " RecurrenceRule::buildCache: " << endl;
+ // Build the list of all occurrences of this event (we need that to determine
+ // the end date!)
+ Constraint interval( getNextValidDateInterval( startDt(), recurrenceType() ) );
+ QDateTime next;
+
+ DateTimeList dts = datesForInterval( interval, recurrenceType() );
+ DateTimeList::Iterator it = dts.begin();
+ // Only use dates after the event has started (start date is only included
+ // if it matches)
+ while ( it != dts.end() ) {
+ if ( (*it) < startDt() ) it = dts.remove( it );
+ else ++it;
+ }
+// dts.prepend( startDt() ); // the start date is always the first occurrence
+
+
+ int loopnr = 0;
+ int dtnr = dts.count();
+ // some validity checks to avoid infinite loops (i.e. if we have
+ // done this loop already 10000 times and found no occurrence, bail out )
+ while ( loopnr < 10000 && dtnr < mDuration ) {
+ interval.increase( recurrenceType(), frequency() );
+ // The returned date list is already sorted!
+ dts += datesForInterval( interval, recurrenceType() );
+ dtnr = dts.count();
+ ++loopnr;
+ }
+ if ( int(dts.count()) > mDuration ) {
+ // we have picked up more occurrences than necessary, remove them
+ it = dts.at( mDuration );
+ while ( it != dts.end() ) it = dts.remove( it );
+ }
+ mCached = true;
+ mCachedDates = dts;
+
+kdDebug(5800) << " Finished Building Cache, cache has " << dts.count() << " entries:" << endl;
+// it = dts.begin();
+// while ( it != dts.end() ) {
+// kdDebug(5800) << " -=> " << (*it) << endl;
+// ++it;
+// }
+ if ( int(dts.count()) == mDuration ) {
+ mCachedDateEnd = dts.last();
+ return true;
+ } else {
+ mCachedDateEnd = QDateTime();
+ return false;
+ }
+}
+
+bool RecurrenceRule::dateMatchesRules( const QDateTime &qdt ) const
+{
+ bool match = false;
+ for ( Constraint::List::ConstIterator it = mConstraints.begin();
+ it!=mConstraints.end(); ++it ) {
+ match = match || ( (*it).matches( qdt, recurrenceType() ) );
+ }
+ return match;
+}
+
+bool RecurrenceRule::recursOn( const QDate &qd ) const
+{
+// kdDebug(5800) << " RecurrenceRule::recursOn: " << qd << endl;
+ if ( qd < startDt().date() ) return false;
+ // Start date is only included if it really matches
+// if ( qd == startDt().date() ) return true;
+ if ( mDuration >= 0 && qd > endDt().date() ) return false;
+
+ // The date must be in an appropriate interval (getNextValidDateInterval),
+ // Plus it must match at least one of the constraints
+ bool match = false;
+ for ( Constraint::List::ConstIterator it = mConstraints.begin();
+ it!=mConstraints.end(); ++it ) {
+ match = match || ( (*it).matches( qd, recurrenceType() ) );
+ }
+ if ( !match ) return false;
+ QDateTime tmp( qd, QTime( 0, 0, 0 ) );
+ Constraint interval( getNextValidDateInterval( tmp, recurrenceType() ) );
+ // Constraint::matches is quite efficient, so first check if it can occur at
+ // all before we calculate all actual dates.
+ if ( !interval.matches( qd, recurrenceType() ) ) return false;
+ // We really need to obtain the list of dates in this interval, since
+ // otherwise BYSETPOS will not work (i.e. the date will match the interval,
+ // but BYSETPOS selects only one of these matching dates!
+ DateTimeList times = datesForInterval( interval, recurrenceType() );
+ DateTimeList::ConstIterator it = times.begin();
+ while ( ( it != times.end() ) && ( (*it).date() < qd ) )
+ ++it;
+ if ( it != times.end() ) {
+ // If we are beyond the end...
+ if ( mDuration >= 0 && (*it) > endDt() )
+ return false;
+ if ( (*it).date() == qd )
+ return true;
+ }
+ return false;
+}
+
+
+bool RecurrenceRule::recursAt( const QDateTime &qd ) const
+{
+// kdDebug(5800) << " RecurrenceRule::recursAt: " << qd << endl;
+ if ( doesFloat() ) return recursOn( qd.date() );
+ if ( qd < startDt() ) return false;
+ // Start date is only included if it really matches
+// if ( qd == startDt() ) return true;
+ if ( mDuration >= 0 && qd > endDt() ) return false;
+
+ // The date must be in an appropriate interval (getNextValidDateInterval),
+ // Plus it must match at least one of the constraints
+ bool match = dateMatchesRules( qd );
+ if ( !match ) return false;
+ // if it recurs every interval, speed things up...
+// if ( mFrequency == 1 && mBySetPos.isEmpty() && mByDays.isEmpty() ) return true;
+ Constraint interval( getNextValidDateInterval( qd, recurrenceType() ) );
+ // TODO_Recurrence: Does this work with BySetPos???
+ if ( interval.matches( qd, recurrenceType() ) ) return true;
+
+ return false;
+}
+
+
+TimeList RecurrenceRule::recurTimesOn( const QDate &date ) const
+{
+// kdDebug(5800) << " RecurrenceRule::recurTimesOn: " << date << endl;
+ TimeList lst;
+ if ( !recursOn( date ) ) return lst;
+
+ if ( doesFloat() ) return lst;
+
+ QDateTime dt( date, QTime( 0, 0, 0 ) );
+ bool valid = dt.isValid() && ( dt.date() == date );
+ while ( valid ) {
+ // TODO: Add a flag so that the date is never increased!
+ dt = getNextDate( dt );
+ valid = dt.isValid() && ( dt.date() == date );
+ if ( valid ) lst.append( dt.time() );
+ }
+ return lst;
+}
+
+/** Returns the number of recurrences up to and including the date/time specified. */
+int RecurrenceRule::durationTo( const QDateTime &dt ) const
+{
+// kdDebug(5800) << " RecurrenceRule::durationTo: " << dt << endl;
+ // Easy cases: either before start, or after all recurrences and we know
+ // their number
+ if ( dt < startDt() ) return 0;
+ // Start date is only included if it really matches
+// if ( dt == startDt() ) return 1;
+ if ( mDuration > 0 && dt >= endDt() ) return mDuration;
+
+ QDateTime next( startDt() );
+ int found = 0;
+ while ( next.isValid() && next <= dt ) {
+ ++found;
+ next = getNextDate( next );
+ }
+ return found;
+}
+
+
+QDateTime RecurrenceRule::getPreviousDate( const QDateTime& afterDate ) const
+{
+// kdDebug(5800) << " RecurrenceRule::getPreviousDate: " << afterDate << endl;
+ // Beyond end of recurrence
+ if ( afterDate < startDt() )
+ return QDateTime();
+
+ // If we have a cache (duration given), use that
+ QDateTime prev;
+ if ( mDuration > 0 ) {
+ if ( !mCached ) buildCache();
+ DateTimeList::ConstIterator it = mCachedDates.begin();
+ while ( it != mCachedDates.end() && (*it) < afterDate ) {
+ prev = *it;
+ ++it;
+ }
+ if ( prev.isValid() && prev < afterDate ) return prev;
+ else return QDateTime();
+ }
+
+// kdDebug(5800) << " getNext date after " << preDate << endl;
+ prev = afterDate;
+ if ( mDuration >= 0 && endDt().isValid() && afterDate > endDt() )
+ prev = endDt().addSecs( 1 );
+
+ Constraint interval( getPreviousValidDateInterval( prev, recurrenceType() ) );
+// kdDebug(5800) << "Previous Valid Date Interval for date " << prev << ": " << endl;
+// interval.dump();
+ DateTimeList dts = datesForInterval( interval, recurrenceType() );
+ DateTimeList::Iterator dtit = dts.end();
+ if ( dtit != dts.begin() ) {
+ do {
+ --dtit;
+ } while ( dtit != dts.begin() && (*dtit) >= prev );
+ if ( (*dtit) < prev ) {
+ if ( (*dtit) >= startDt() ) return (*dtit);
+ else return QDateTime();
+ }
+ }
+
+ // Previous interval. As soon as we find an occurrence, we're done.
+ while ( interval.intervalDateTime( recurrenceType() ) > startDt() ) {
+ interval.increase( recurrenceType(), -frequency() );
+// kdDebug(5800) << "Decreased interval: " << endl;
+// interval.dump();
+ // The returned date list is sorted
+ DateTimeList dts = datesForInterval( interval, recurrenceType() );
+ // The list is sorted, so take the last one.
+ if ( dts.count() > 0 ) {
+ prev = dts.last();
+ if ( prev.isValid() && prev >= startDt() ) return prev;
+ else return QDateTime();
+ }
+ }
+ return QDateTime();
+}
+
+
+QDateTime RecurrenceRule::getNextDate( const QDateTime &preDate ) const
+{
+// kdDebug(5800) << " RecurrenceRule::getNextDate: " << preDate << endl;
+ // Beyond end of recurrence
+ if ( mDuration >= 0 && endDt().isValid() && preDate >= endDt() )
+ return QDateTime();
+
+ // Start date is only included if it really matches
+ QDateTime adjustedPreDate;
+ if ( preDate < startDt() )
+ adjustedPreDate = startDt().addSecs( -1 );
+ else
+ adjustedPreDate = preDate;
+
+ if ( mDuration > 0 ) {
+ if ( !mCached ) buildCache();
+ DateTimeList::ConstIterator it = mCachedDates.begin();
+ while ( it != mCachedDates.end() && (*it) <= adjustedPreDate ) ++it;
+ if ( it != mCachedDates.end() ) {
+// kdDebug(5800) << " getNext date after " << adjustedPreDate << ", cached date: " << *it << endl;
+ return (*it);
+ }
+ }
+
+// kdDebug(5800) << " getNext date after " << adjustedPreDate << endl;
+ Constraint interval( getNextValidDateInterval( adjustedPreDate, recurrenceType() ) );
+ DateTimeList dts = datesForInterval( interval, recurrenceType() );
+ DateTimeList::Iterator dtit = dts.begin();
+ while ( dtit != dts.end() && (*dtit) <= adjustedPreDate ) ++dtit;
+ if ( dtit != dts.end() ) {
+ if ( mDuration >= 0 && (*dtit) > endDt() ) return QDateTime();
+ else return (*dtit);
+ }
+
+ // Increase the interval. The first occurrence that we find is the result (if
+ // if's before the end date).
+ // TODO: some validity checks to avoid infinite loops for contradictory constraints
+ int loopnr = 0;
+ while ( loopnr < 10000 ) {
+ interval.increase( recurrenceType(), frequency() );
+ DateTimeList dts = datesForInterval( interval, recurrenceType() );
+ if ( dts.count() > 0 ) {
+ QDateTime ret( dts.first() );
+ if ( mDuration >= 0 && ret > endDt() ) return QDateTime();
+ else return ret;
+ }
+ ++loopnr;
+ }
+ return QDateTime();
+}
+
+RecurrenceRule::Constraint RecurrenceRule::getPreviousValidDateInterval( const QDateTime &preDate, PeriodType type ) const
+{
+// kdDebug(5800) << " (o) getPreviousValidDateInterval after " << preDate << ", type=" << type << endl;
+ long periods = 0;
+ QDateTime nextValid = startDt();
+ QDateTime start = startDt();
+ int modifier = 1;
+ QDateTime toDate( preDate );
+ // for super-daily recurrences, don't care about the time part
+
+ // Find the #intervals since the dtstart and round to the next multiple of
+ // the frequency
+ // FIXME: All sub-daily periods need to convert to UTC, do the calculations
+ // in UTC, then convert back to the local time zone. Otherwise,
+ // recurrences across DST changes will be determined wrongly
+ switch ( type ) {
+ // Really fall through for sub-daily, since the calculations only differ
+ // by the factor 60 and 60*60! Same for weekly and daily (factor 7)
+ case rHourly: modifier *= 60;
+ case rMinutely: modifier *= 60;
+ case rSecondly:
+ periods = ownSecsTo( start, toDate ) / modifier;
+ // round it down to the next lower multiple of frequency():
+ periods = ( periods / frequency() ) * frequency();
+ nextValid = start.addSecs( modifier * periods );
+ break;
+
+ case rWeekly:
+ toDate = toDate.addDays( -(7 + toDate.date().dayOfWeek() - mWeekStart) % 7 );
+ start = start.addDays( -(7 + start.date().dayOfWeek() - mWeekStart) % 7 );
+ modifier *= 7;
+ case rDaily:
+ periods = start.daysTo( toDate ) / modifier;
+ // round it down to the next lower multiple of frequency():
+ periods = ( periods / frequency() ) * frequency();
+ nextValid = start.addDays( modifier * periods );
+ break;
+
+ case rMonthly: {
+ periods = 12*( toDate.date().year() - start.date().year() ) +
+ ( toDate.date().month() - start.date().month() );
+ // round it down to the next lower multiple of frequency():
+ periods = ( periods / frequency() ) * frequency();
+ // set the day to the first day of the month, so we don't have problems
+ // with non-existent days like Feb 30 or April 31
+ start.setDate( QDate( start.date().year(), start.date().month(), 1 ) );
+ nextValid.setDate( start.date().addMonths( periods ) );
+ break; }
+ case rYearly:
+ periods = ( toDate.date().year() - start.date().year() );
+ // round it down to the next lower multiple of frequency():
+ periods = ( periods / frequency() ) * frequency();
+ nextValid.setDate( start.date().addYears( periods ) );
+ break;
+ default:
+ break;
+ }
+// kdDebug(5800) << " ~~~> date in previous interval is: : " << nextValid << endl;
+
+ return Constraint( nextValid, type, mWeekStart );
+}
+
+RecurrenceRule::Constraint RecurrenceRule::getNextValidDateInterval( const QDateTime &preDate, PeriodType type ) const
+{
+ // TODO: Simplify this!
+ kdDebug(5800) << " (o) getNextValidDateInterval after " << preDate << ", type=" << type << endl;
+ long periods = 0;
+ QDateTime start = startDt();
+ QDateTime nextValid( start );
+ int modifier = 1;
+ QDateTime toDate( preDate );
+ // for super-daily recurrences, don't care about the time part
+
+ // Find the #intervals since the dtstart and round to the next multiple of
+ // the frequency
+ // FIXME: All sub-daily periods need to convert to UTC, do the calculations
+ // in UTC, then convert back to the local time zone. Otherwise,
+ // recurrences across DST changes will be determined wrongly
+ switch ( type ) {
+ // Really fall through for sub-daily, since the calculations only differ
+ // by the factor 60 and 60*60! Same for weekly and daily (factor 7)
+ case rHourly: modifier *= 60;
+ case rMinutely: modifier *= 60;
+ case rSecondly:
+ periods = ownSecsTo( start, toDate ) / modifier;
+ periods = QMAX( 0, periods);
+ if ( periods > 0 )
+ periods += ( frequency() - 1 - ( (periods - 1) % frequency() ) );
+ nextValid = start.addSecs( modifier * periods );
+ break;
+
+ case rWeekly:
+ // correct both start date and current date to start of week
+ toDate = toDate.addDays( -(7 + toDate.date().dayOfWeek() - mWeekStart) % 7 );
+ start = start.addDays( -(7 + start.date().dayOfWeek() - mWeekStart) % 7 );
+ modifier *= 7;
+ case rDaily:
+ periods = start.daysTo( toDate ) / modifier;
+ periods = QMAX( 0, periods);
+ if ( periods > 0 )
+ periods += (frequency() - 1 - ( (periods - 1) % frequency() ) );
+ nextValid = start.addDays( modifier * periods );
+ break;
+
+ case rMonthly: {
+ periods = 12*( toDate.date().year() - start.date().year() ) +
+ ( toDate.date().month() - start.date().month() );
+ periods = QMAX( 0, periods);
+ if ( periods > 0 )
+ periods += (frequency() - 1 - ( (periods - 1) % frequency() ) );
+ // set the day to the first day of the month, so we don't have problems
+ // with non-existent days like Feb 30 or April 31
+ start.setDate( QDate( start.date().year(), start.date().month(), 1 ) );
+ nextValid.setDate( start.date().addMonths( periods ) );
+ break; }
+ case rYearly:
+ periods = ( toDate.date().year() - start.date().year() );
+ periods = QMAX( 0, periods);
+ if ( periods > 0 )
+ periods += ( frequency() - 1 - ( (periods - 1) % frequency() ) );
+ nextValid.setDate( start.date().addYears( periods ) );
+ break;
+ default:
+ break;
+ }
+// kdDebug(5800) << " ~~~> date in next interval is: : " << nextValid << endl;
+
+ return Constraint( nextValid, type, mWeekStart );
+}
+
+bool RecurrenceRule::mergeIntervalConstraint( Constraint *merged,
+ const Constraint &conit, const Constraint &interval ) const
+{
+ Constraint result( interval );
+
+#define mergeConstraint( name, cmparison ) \
+ if ( conit.name cmparison ) { \
+ if ( !(result.name cmparison) || result.name == conit.name ) { \
+ result.name = conit.name; \
+ } else return false;\
+ }
+
+ mergeConstraint( year, > 0 );
+ mergeConstraint( month, > 0 );
+ mergeConstraint( day, != 0 );
+ mergeConstraint( hour, >= 0 );
+ mergeConstraint( minute, >= 0 );
+ mergeConstraint( second, >= 0 );
+
+ mergeConstraint( weekday, != 0 );
+ mergeConstraint( weekdaynr, != 0 );
+ mergeConstraint( weeknumber, != 0 );
+ mergeConstraint( yearday, != 0 );
+
+ #undef mergeConstraint
+ if ( merged ) *merged = result;
+ return true;
+}
+
+
+DateTimeList RecurrenceRule::datesForInterval( const Constraint &interval, PeriodType type ) const
+{
+ /* -) Loop through constraints,
+ -) merge interval with each constraint
+ -) if merged constraint is not consistent => ignore that constraint
+ -) if complete => add that one date to the date list
+ -) Loop through all missing fields => For each add the resulting
+ */
+// kdDebug(5800) << " RecurrenceRule::datesForInterval: " << endl;
+// interval.dump();
+ DateTimeList lst;
+ Constraint::List::ConstIterator conit = mConstraints.begin();
+ for ( ; conit != mConstraints.end(); ++conit ) {
+ Constraint merged;
+ bool mergeok = mergeIntervalConstraint( &merged, *conit, interval );
+ // If the information is incomplete, we can't use this constraint
+ if ( merged.year <= 0 || merged.hour < 0 || merged.minute < 0 || merged.second < 0 )
+ mergeok = false;
+ if ( mergeok ) {
+// kdDebug(5800) << " -) merged constraint: " << endl;
+// merged.dump();
+ // We have a valid constraint, so get all datetimes that match it andd
+ // append it to all date/times of this interval
+ DateTimeList lstnew = merged.dateTimes( type );
+ lst += lstnew;
+ }
+ }
+ // Sort it so we can apply the BySetPos. Also some logic relies on this being sorted
+ qSortUnique( lst );
+
+
+/*if ( lst.isEmpty() ) {
+ kdDebug(5800) << " No Dates in Interval " << endl;
+} else {
+ kdDebug(5800) << " Dates: " << endl;
+ for ( DateTimeList::Iterator it = lst.begin(); it != lst.end(); ++it ) {
+ kdDebug(5800)<< " -) " << (*it).toString() << endl;
+ }
+ kdDebug(5800) << " ---------------------" << endl;
+}*/
+ if ( !mBySetPos.isEmpty() ) {
+ DateTimeList tmplst = lst;
+ lst.clear();
+ QValueList<int>::ConstIterator it;
+ for ( it = mBySetPos.begin(); it != mBySetPos.end(); ++it ) {
+ int pos = *it;
+ if ( pos > 0 ) --pos;
+ if ( pos < 0 ) pos += tmplst.count();
+ if ( pos >= 0 && uint(pos) < tmplst.count() ) {
+ lst.append( tmplst[pos] );
+ }
+ }
+ qSortUnique( lst );
+ }
+
+ return lst;
+}
+
+
+void RecurrenceRule::dump() const
+{
+#ifndef NDEBUG
+ kdDebug(5800) << "RecurrenceRule::dump():" << endl;
+ if ( !mRRule.isEmpty() )
+ kdDebug(5800) << " RRULE=" << mRRule << endl;
+ kdDebug(5800) << " Read-Only: " << isReadOnly() <<
+ ", dirty: " << mDirty << endl;
+
+ kdDebug(5800) << " Period type: " << recurrenceType() << ", frequency: " << frequency() << endl;
+ kdDebug(5800) << " #occurrences: " << duration() << endl;
+ kdDebug(5800) << " start date: " << startDt() <<", end date: " << endDt() << endl;
+
+
+#define dumpByIntList(list,label) \
+ if ( !list.isEmpty() ) {\
+ QStringList lst;\
+ for ( QValueList<int>::ConstIterator it = list.begin();\
+ it != list.end(); ++it ) {\
+ lst.append( QString::number( *it ) );\
+ }\
+ kdDebug(5800) << " " << label << lst.join(", ") << endl;\
+ }
+ dumpByIntList( mBySeconds, "BySeconds: " );
+ dumpByIntList( mByMinutes, "ByMinutes: " );
+ dumpByIntList( mByHours, "ByHours: " );
+ if ( !mByDays.isEmpty() ) {
+ QStringList lst;
+ for ( QValueList<WDayPos>::ConstIterator it = mByDays.begin();
+ it != mByDays.end(); ++it ) {
+ lst.append( ( ((*it).pos()!=0) ? QString::number( (*it).pos() ) : "" ) +
+ DateHelper::dayName( (*it).day() ) );
+ }
+ kdDebug(5800) << " ByDays: " << lst.join(", ") << endl;
+ }
+ dumpByIntList( mByMonthDays, "ByMonthDays:" );
+ dumpByIntList( mByYearDays, "ByYearDays: " );
+ dumpByIntList( mByWeekNumbers,"ByWeekNr: " );
+ dumpByIntList( mByMonths, "ByMonths: " );
+ dumpByIntList( mBySetPos, "BySetPos: " );
+ #undef dumpByIntList
+
+ kdDebug(5800) << " Week start: " << DateHelper::dayName( mWeekStart ) << endl;
+
+ kdDebug(5800) << " Constraints:" << endl;
+ // dump constraints
+ for ( Constraint::List::ConstIterator it = mConstraints.begin();
+ it!=mConstraints.end(); ++it ) {
+ (*it).dump();
+ }
+#endif
+}
+
+void RecurrenceRule::Constraint::dump() const
+{
+ kdDebug(5800) << " ~> Y="<<year<<", M="<<month<<", D="<<day<<", H="<<hour<<", m="<<minute<<", S="<<second<<", wd="<<weekday<<",#wd="<<weekdaynr<<", #w="<<weeknumber<<", yd="<<yearday<<endl;
+}
diff --git a/libkcal/recurrencerule.h b/libkcal/recurrencerule.h
new file mode 100644
index 00000000..ad72f256
--- /dev/null
+++ b/libkcal/recurrencerule.h
@@ -0,0 +1,343 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 1998 Preston Brown <pbrown@kde.org>
+ Copyright (c) 2001,2003 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (c) 2002 David Jarvie <software@astrojar.org.uk>
+ Copyright (c) 2005, Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_RECURRENCERULE_H
+#define KCAL_RECURRENCERULE_H
+
+#include <qdatetime.h>
+#include <libkcal/listbase.h>
+
+#include "libkcal_export.h"
+
+template <class T>
+Q_INLINE_TEMPLATES void qSortUnique( QValueList<T> &lst )
+{
+ qHeapSort( lst );
+ if ( lst.isEmpty() ) return;
+ // Remove all duplicates from the times list
+ // TODO: Make this more efficient!
+ QValueListIterator<T> it = lst.begin();
+ T last = *it;
+ ++it;
+ T newlast;
+ while ( it != lst.end() ) {
+ newlast = (*it);
+ if ( newlast == last ) it = lst.remove( it );
+ else {
+ last = newlast;
+ ++it;
+ }
+ }
+}
+
+
+namespace KCal {
+
+typedef QValueList<QDateTime> DateTimeList;
+typedef QValueList<QDate> DateList;
+typedef QValueList<QTime> TimeList;
+
+
+
+
+/**
+ This class represents a recurrence rule for a calendar incidence.
+*/
+class LIBKCAL_EXPORT RecurrenceRule
+{
+ public:
+ class Observer {
+ public:
+ virtual ~Observer() {}
+ /** This method will be called on each change of the recurrence object */
+ virtual void recurrenceChanged( RecurrenceRule * ) = 0;
+ };
+ typedef ListBase<RecurrenceRule> List;
+ /** enum for describing the frequency how an event recurs, if at all. */
+ enum PeriodType { rNone = 0,
+ rSecondly, rMinutely, rHourly,
+ rDaily, rWeekly, rMonthly, rYearly
+ };
+ /** structure for describing the n-th weekday of the month/year. */
+ class WDayPos {
+ public:
+ WDayPos( int ps = 0 , short dy = 0 ) : mDay(dy), mPos(ps) {}
+ short day() const { return mDay; }
+ int pos() const { return mPos; }
+ void setDay( short dy ) { mDay = dy; }
+ void setPos( int ps ) { mPos = ps; }
+
+ bool operator==( const RecurrenceRule::WDayPos &pos2 ) const {
+ return ( mDay == pos2.mDay ) && ( mPos == pos2.mPos );
+ }
+ protected:
+ short mDay; // Weekday, 1=monday, 7=sunday
+ int mPos; // week of the day (-1 for last, 1 for first, 0 for all weeks)
+ // Bounded by -366 and +366, 0 means all weeks in that period
+ };
+
+ RecurrenceRule( /*Incidence *parent, int compatVersion = 0*/ );
+ RecurrenceRule(const RecurrenceRule&);
+ ~RecurrenceRule();
+
+ bool operator==( const RecurrenceRule& ) const;
+ bool operator!=( const RecurrenceRule& r ) const { return !operator==(r); }
+ RecurrenceRule &operator=(const RecurrenceRule&);
+
+// Incidence *parent() const { return mParent; }
+
+
+ /** Set if recurrence is read-only or can be changed. */
+ void setReadOnly(bool readOnly) { mIsReadOnly = readOnly; }
+ /** Returns true if the recurrence is read-only, or false if it can be changed. */
+ bool isReadOnly() const { return mIsReadOnly; }
+
+
+ /** Returns the event's recurrence status. See the enumeration at the top
+ * of this file for possible values. */
+ bool doesRecur() const { return mPeriod!=rNone; }
+ void setRecurrenceType( PeriodType period );
+ PeriodType recurrenceType() const { return mPeriod; }
+ /** Turns off recurrence for the event. */
+ void clear();
+
+
+ /** Returns frequency of recurrence, in terms of the recurrence time period type. */
+ uint frequency() const { return mFrequency; }
+ /** Sets the frequency of recurrence, in terms of the recurrence time period type. */
+ void setFrequency( int freq );
+
+
+ /** Return the start of the recurrence */
+ QDateTime startDt() const { return mDateStart; }
+ /** Set start of recurrence, as a date and time. */
+ void setStartDt(const QDateTime &start);
+
+ /** Returns whether the start date has no time associated. Floating
+ means -- according to rfc2445 -- that the event has no time associate. */
+ bool doesFloat() const { return mFloating; }
+ /** Sets whether the dtstart is a floating time (i.e. has no time attached) */
+ void setFloats( bool floats );
+
+
+ /** Returns the date and time of the last recurrence.
+ * An invalid date is returned if the recurrence has no end.
+ * @param result if non-null, *result is updated to true if successful,
+ * or false if there is no recurrence.
+ */
+ QDateTime endDt( bool* result = 0 ) const;
+ /** Sets the date and time of the last recurrence.
+ * @param endDateTime the ending date/time after which to stop recurring. */
+ void setEndDt(const QDateTime &endDateTime);
+
+
+ /**
+ * Returns -1 if the event recurs infinitely, 0 if the end date is set,
+ * otherwise the total number of recurrences, including the initial occurrence.
+ */
+ int duration() const { return mDuration; }
+ /** Sets the total number of times the event is to occur, including both the
+ * first and last. */
+ void setDuration(int duration);
+// /** Returns the number of recurrences up to and including the date specified. */
+// int durationTo(const QDate &) const;
+ /** Returns the number of recurrences up to and including the date/time specified. */
+ int durationTo(const QDateTime &) const;
+ /** Returns the number of recurrences up to and including the date specified. */
+ int durationTo( const QDate &date ) const { return durationTo( QDateTime( date, QTime( 23, 59, 59 ) ) ); }
+
+
+
+ /** Returns true if the date specified is one on which the event will
+ * recur. The start date returns true only if it actually matches the rule. */
+ bool recursOn( const QDate &qd ) const;
+ /** Returns true if the date/time specified is one at which the event will
+ * recur. Times are rounded down to the nearest minute to determine the result.
+ * The start date/time returns true only if it actually matches the rule. */
+ bool recursAt( const QDateTime & ) const;
+ /** Returns true if the date matches the rules. It does not necessarily
+ mean that this is an actual occurrence. In particular, the method does
+ not check if the date is after the end date, or if the frequency interval
+ matches */
+ bool dateMatchesRules( const QDateTime &qdt ) const;
+
+
+ /** Returns a list of the times on the specified date at which the
+ * recurrence will occur.
+ * @param date the date for which to find the recurrence times.
+ */
+ TimeList recurTimesOn( const QDate &date ) const;
+
+
+ /** Returns the date and time of the next recurrence, after the specified date/time.
+ * If the recurrence has no time, the next date after the specified date is returned.
+ * @param preDateTime the date/time after which to find the recurrence.
+ * @return date/time of next recurrence, or invalid date if none.
+ */
+ QDateTime getNextDate( const QDateTime& preDateTime ) const;
+ /** Returns the date and time of the last previous recurrence, before the specified date/time.
+ * If a time later than 00:00:00 is specified and the recurrence has no time, 00:00:00 on
+ * the specified date is returned if that date recurs.
+ * @param afterDateTime the date/time before which to find the recurrence.
+ * @return date/time of previous recurrence, or invalid date if none.
+ */
+ QDateTime getPreviousDate( const QDateTime& afterDateTime ) const;
+
+
+
+
+ void setBySeconds( const QValueList<int> bySeconds );
+ void setByMinutes( const QValueList<int> byMinutes );
+ void setByHours( const QValueList<int> byHours );
+
+ void setByDays( const QValueList<WDayPos> byDays );
+ void setByMonthDays( const QValueList<int> byMonthDays );
+ void setByYearDays( const QValueList<int> byYearDays );
+ void setByWeekNumbers( const QValueList<int> byWeekNumbers );
+ void setByMonths( const QValueList<int> byMonths );
+ void setBySetPos( const QValueList<int> bySetPos );
+ void setWeekStart( short weekStart );
+
+ const QValueList<int> &bySeconds() const { return mBySeconds; }
+ const QValueList<int> &byMinutes() const { return mByMinutes; }
+ const QValueList<int> &byHours() const { return mByHours; }
+
+ const QValueList<WDayPos> &byDays() const { return mByDays; }
+ const QValueList<int> &byMonthDays() const { return mByMonthDays; }
+ const QValueList<int> &byYearDays() const { return mByYearDays; }
+ const QValueList<int> &byWeekNumbers() const { return mByWeekNumbers; }
+ const QValueList<int> &byMonths() const { return mByMonths; }
+ const QValueList<int> &bySetPos() const { return mBySetPos; }
+ short weekStart() const { return mWeekStart; }
+
+
+ void setDirty();
+ /**
+ Installs an observer. Whenever some setting of this recurrence
+ object is changed, the recurrenceUpdated( Recurrence* ) method
+ of each observer will be called to inform it of changes.
+ @param observer the Recurrence::Observer-derived object, which
+ will be installed as an observer of this object.
+ */
+ void addObserver( Observer *observer );
+ /**
+ Removes an observer that was added with addObserver. If the
+ given object was not an observer, it does nothing.
+ @param observer the Recurrence::Observer-derived object to
+ be removed from the list of observers of this object.
+ */
+ void removeObserver( Observer *observer );
+
+ /**
+ Debug output.
+ */
+ void dump() const;
+ QString mRRule;
+
+ private:
+ class Constraint {
+ public:
+ typedef QValueList<Constraint> List;
+
+ Constraint( int wkst = 1 );
+/* Constraint( const Constraint &con ) :
+ year(con.year), month(con.month), day(con.day),
+ hour(con.hour), minute(con.minute), second(con.second),
+ weekday(con.weekday), weeknumber(con.weeknumber),
+ yearday(con.yearday), weekstart(con.weekstart) {}*/
+ Constraint( const QDateTime &preDate, PeriodType type, int wkst );
+ void clear();
+
+ int year; // 0 means unspecified
+ int month; // 0 means unspecified
+ int day; // 0 means unspecified
+ int hour; // -1 means unspecified
+ int minute; // -1 means unspecified
+ int second; // -1 means unspecified
+ int weekday; // 0 means unspecified
+ int weekdaynr; // index of weekday in month/year (0=unspecified)
+ int weeknumber; // 0 means unspecified
+ int yearday; // 0 means unspecified
+ int weekstart; // first day of week (1=monday, 7=sunday, 0=unspec.)
+
+ bool readDateTime( const QDateTime &preDate, PeriodType type );
+ bool matches( const QDate &dt, RecurrenceRule::PeriodType type ) const;
+ bool matches( const QDateTime &dt, RecurrenceRule::PeriodType type ) const;
+ bool isConsistent() const;
+ bool isConsistent( PeriodType period ) const;
+ bool increase( PeriodType type, int freq );
+ QDateTime intervalDateTime( PeriodType type ) const;
+ DateTimeList dateTimes( PeriodType type ) const;
+ void dump() const;
+ };
+
+ Constraint getNextValidDateInterval( const QDateTime &preDate, PeriodType type ) const;
+ Constraint getPreviousValidDateInterval( const QDateTime &preDate, PeriodType type ) const;
+ DateTimeList datesForInterval( const Constraint &interval, PeriodType type ) const;
+ bool mergeIntervalConstraint( Constraint *merged, const Constraint &conit,
+ const Constraint &interval ) const;
+ bool buildCache() const;
+
+
+ PeriodType mPeriod;
+ QDateTime mDateStart;
+ /** how often it recurs (including dtstart):
+ -1 means infinitely,
+ 0 means an explicit end date,
+ positive values give the number of occurrences */
+ int mDuration;
+ QDateTime mDateEnd;
+ uint mFrequency;
+
+ bool mIsReadOnly;
+ bool mFloating;
+
+ QValueList<int> mBySeconds; // values: second 0-59
+ QValueList<int> mByMinutes; // values: minute 0-59
+ QValueList<int> mByHours; // values: hour 0-23
+
+ QValueList<WDayPos> mByDays; // n-th weekday of the month or year
+ QValueList<int> mByMonthDays; // values: day -31 to -1 and 1-31
+ QValueList<int> mByYearDays; // values: day -366 to -1 and 1-366
+ QValueList<int> mByWeekNumbers; // values: week -53 to -1 and 1-53
+ QValueList<int> mByMonths; // values: month 1-12
+ QValueList<int> mBySetPos; // values: position -366 to -1 and 1-366
+ short mWeekStart; // first day of the week (1=Monday, 7=Sunday)
+
+ Constraint::List mConstraints;
+ void buildConstraints();
+ bool mDirty;
+ QValueList<Observer*> mObservers;
+
+ // Cache for duration
+ mutable DateTimeList mCachedDates;
+ mutable bool mCached;
+ mutable QDateTime mCachedDateEnd;
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/resourcecached.cpp b/libkcal/resourcecached.cpp
new file mode 100644
index 00000000..09862b25
--- /dev/null
+++ b/libkcal/resourcecached.cpp
@@ -0,0 +1,661 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2003,2004 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qdatastream.h>
+#include <qdatetime.h>
+#include <qfile.h>
+#include <qstring.h>
+#include <qptrlist.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kurl.h>
+#include <kstandarddirs.h>
+
+#include "event.h"
+#include "exceptions.h"
+#include "incidence.h"
+#include "journal.h"
+#include "todo.h"
+#include <unistd.h>
+
+
+#include "resourcecached.h"
+
+using namespace KCal;
+
+ResourceCached::ResourceCached( const KConfig* config )
+ : ResourceCalendar( config ), mCalendar( QString::fromLatin1( "UTC" ) ),
+ mReloadPolicy( ReloadNever ), mReloadInterval( 10 ),
+ mReloadTimer( 0, "mReloadTimer" ), mReloaded( false ),
+ mSavePolicy( SaveNever ), mSaveInterval( 10 ),
+ mSaveTimer( 0, "mSaveTimer" ), mIdMapper( "kcal/uidmaps/" )
+{
+ connect( &mReloadTimer, SIGNAL( timeout() ), SLOT( slotReload() ) );
+ connect( &mSaveTimer, SIGNAL( timeout() ), SLOT( slotSave() ) );
+}
+
+ResourceCached::~ResourceCached()
+{
+}
+
+void ResourceCached::setReloadPolicy( int i )
+{
+ mReloadPolicy = i;
+
+ setupReloadTimer();
+}
+
+int ResourceCached::reloadPolicy() const
+{
+ return mReloadPolicy;
+}
+
+void ResourceCached::setReloadInterval( int minutes )
+{
+ mReloadInterval = minutes;
+}
+
+int ResourceCached::reloadInterval() const
+{
+ return mReloadInterval;
+}
+
+void ResourceCached::setSavePolicy( int i )
+{
+ mSavePolicy = i;
+
+ setupSaveTimer();
+}
+
+int ResourceCached::savePolicy() const
+{
+ return mSavePolicy;
+}
+
+void ResourceCached::setSaveInterval( int minutes )
+{
+ mSaveInterval = minutes;
+}
+
+int ResourceCached::saveInterval() const
+{
+ return mSaveInterval;
+}
+
+void ResourceCached::readConfig( const KConfig *config )
+{
+ mReloadPolicy = config->readNumEntry( "ReloadPolicy", ReloadNever );
+ mReloadInterval = config->readNumEntry( "ReloadInterval", 10 );
+
+ mSaveInterval = config->readNumEntry( "SaveInterval", 10 );
+ mSavePolicy = config->readNumEntry( "SavePolicy", SaveNever );
+
+ mLastLoad = config->readDateTimeEntry( "LastLoad" );
+ mLastSave = config->readDateTimeEntry( "LastSave" );
+
+ setupSaveTimer();
+ setupReloadTimer();
+}
+
+void ResourceCached::setupSaveTimer()
+{
+ if ( mSavePolicy == SaveInterval ) {
+ kdDebug(5800) << "ResourceCached::setSavePolicy(): start save timer (interval "
+ << mSaveInterval << " minutes)." << endl;
+ mSaveTimer.start( mSaveInterval * 60 * 1000 ); // n minutes
+ } else {
+ mSaveTimer.stop();
+ }
+}
+
+void ResourceCached::setupReloadTimer()
+{
+ if ( mReloadPolicy == ReloadInterval ) {
+ kdDebug(5800) << "ResourceCached::setSavePolicy(): start reload timer "
+ "(interval " << mReloadInterval << " minutes)" << endl;
+ mReloadTimer.start( mReloadInterval * 60 * 1000 ); // n minutes
+ } else {
+ mReloadTimer.stop();
+ }
+}
+
+void ResourceCached::writeConfig( KConfig *config )
+{
+ config->writeEntry( "ReloadPolicy", mReloadPolicy );
+ config->writeEntry( "ReloadInterval", mReloadInterval );
+
+ config->writeEntry( "SavePolicy", mSavePolicy );
+ config->writeEntry( "SaveInterval", mSaveInterval );
+
+ config->writeEntry( "LastLoad", mLastLoad );
+ config->writeEntry( "LastSave", mLastSave );
+}
+
+bool ResourceCached::addEvent(Event *event)
+{
+ return mCalendar.addEvent( event );
+}
+
+// probably not really efficient, but...it works for now.
+bool ResourceCached::deleteEvent( Event *event )
+{
+ kdDebug(5800) << "ResourceCached::deleteEvent" << endl;
+
+ return mCalendar.deleteEvent( event );
+}
+
+
+Event *ResourceCached::event( const QString &uid )
+{
+ return mCalendar.event( uid );
+}
+
+Event::List ResourceCached::rawEventsForDate( const QDate &qd,
+ EventSortField sortField,
+ SortDirection sortDirection )
+{
+ Event::List list = mCalendar.rawEventsForDate( qd, sortField, sortDirection );
+
+ return list;
+}
+
+Event::List ResourceCached::rawEvents( const QDate &start, const QDate &end,
+ bool inclusive )
+{
+ return mCalendar.rawEvents( start, end, inclusive );
+}
+
+Event::List ResourceCached::rawEventsForDate( const QDateTime &qdt )
+{
+ return mCalendar.rawEventsForDate( qdt.date() );
+}
+
+Event::List ResourceCached::rawEvents( EventSortField sortField, SortDirection sortDirection )
+{
+ return mCalendar.rawEvents( sortField, sortDirection );
+}
+
+bool ResourceCached::addTodo( Todo *todo )
+{
+ return mCalendar.addTodo( todo );
+}
+
+bool ResourceCached::deleteTodo( Todo *todo )
+{
+ return mCalendar.deleteTodo( todo );
+}
+
+bool ResourceCached::deleteJournal( Journal *journal )
+{
+ return mCalendar.deleteJournal( journal );
+}
+
+
+Todo::List ResourceCached::rawTodos( TodoSortField sortField, SortDirection sortDirection )
+{
+ return mCalendar.rawTodos( sortField, sortDirection );
+}
+
+Todo *ResourceCached::todo( const QString &uid )
+{
+ return mCalendar.todo( uid );
+}
+
+Todo::List ResourceCached::rawTodosForDate( const QDate &date )
+{
+ return mCalendar.rawTodosForDate( date );
+}
+
+
+bool ResourceCached::addJournal( Journal *journal )
+{
+ kdDebug(5800) << "Adding Journal on " << journal->dtStart().toString() << endl;
+
+ return mCalendar.addJournal( journal );
+}
+
+Journal *ResourceCached::journal( const QString &uid )
+{
+ return mCalendar.journal( uid );
+}
+
+Journal::List ResourceCached::rawJournals( JournalSortField sortField, SortDirection sortDirection )
+{
+ return mCalendar.rawJournals( sortField, sortDirection );
+}
+
+Journal::List ResourceCached::rawJournalsForDate( const QDate &date )
+{
+ return mCalendar.rawJournalsForDate( date );
+}
+
+
+Alarm::List ResourceCached::alarmsTo( const QDateTime &to )
+{
+ return mCalendar.alarmsTo( to );
+}
+
+Alarm::List ResourceCached::alarms( const QDateTime &from, const QDateTime &to )
+{
+ // kdDebug(5800) << "ResourceCached::alarms(" << from.toString() << " - " << to.toString() << ")\n";
+ return mCalendar.alarms( from, to );
+}
+
+
+void ResourceCached::setTimeZoneId( const QString& tzid )
+{
+ mCalendar.setTimeZoneId( tzid );
+}
+
+QString ResourceCached::timeZoneId() const
+{
+ return mCalendar.timeZoneId();
+}
+
+void ResourceCached::clearChanges()
+{
+ mAddedIncidences.clear();
+ mChangedIncidences.clear();
+ mDeletedIncidences.clear();
+}
+
+void ResourceCached::loadCache()
+{
+ setIdMapperIdentifier();
+ mIdMapper.load();
+
+ if ( KStandardDirs::exists( cacheFile() ) ) {
+ mCalendar.load( cacheFile() );
+ if ( readOnly() ) {
+ Incidence::List incidences( rawIncidences() );
+ Incidence::List::Iterator it;
+ for ( it = incidences.begin(); it != incidences.end(); ++it ) {
+ (*it)->setReadOnly( true );
+ }
+ }
+ }
+}
+
+void ResourceCached::saveCache()
+{
+ kdDebug(5800) << "ResourceCached::saveCache(): " << cacheFile() << endl;
+
+ setIdMapperIdentifier();
+ mIdMapper.save();
+
+ mCalendar.save( cacheFile() );
+}
+
+void ResourceCached::setIdMapperIdentifier()
+{
+ mIdMapper.setIdentifier( type() + "_" + identifier() );
+}
+
+void ResourceCached::clearCache()
+{
+ mCalendar.close();
+}
+
+void ResourceCached::cleanUpEventCache( const Event::List &eventList )
+{
+ CalendarLocal calendar ( QString::fromLatin1( "UTC" ) );
+
+ if ( KStandardDirs::exists( cacheFile() ) )
+ calendar.load( cacheFile() );
+ else
+ return;
+
+ Event::List list = calendar.events();
+ Event::List::ConstIterator cacheIt, it;
+ for ( cacheIt = list.begin(); cacheIt != list.end(); ++cacheIt ) {
+ bool found = false;
+ for ( it = eventList.begin(); it != eventList.end(); ++it ) {
+ if ( (*it)->uid() == (*cacheIt)->uid() )
+ found = true;
+ }
+
+ if ( !found ) {
+ mIdMapper.removeRemoteId( mIdMapper.remoteId( (*cacheIt)->uid() ) );
+ Event *event = mCalendar.event( (*cacheIt)->uid() );
+ if ( event )
+ mCalendar.deleteEvent( event );
+ }
+ }
+
+ calendar.close();
+}
+
+void ResourceCached::cleanUpTodoCache( const Todo::List &todoList )
+{
+ CalendarLocal calendar ( QString::fromLatin1( "UTC" ) );
+
+ if ( KStandardDirs::exists( cacheFile() ) )
+ calendar.load( cacheFile() );
+ else
+ return;
+
+ Todo::List list = calendar.todos();
+ Todo::List::ConstIterator cacheIt, it;
+ for ( cacheIt = list.begin(); cacheIt != list.end(); ++cacheIt ) {
+
+ bool found = false;
+ for ( it = todoList.begin(); it != todoList.end(); ++it ) {
+ if ( (*it)->uid() == (*cacheIt)->uid() )
+ found = true;
+ }
+
+ if ( !found ) {
+ mIdMapper.removeRemoteId( mIdMapper.remoteId( (*cacheIt)->uid() ) );
+ Todo *todo = mCalendar.todo( (*cacheIt)->uid() );
+ if ( todo )
+ mCalendar.deleteTodo( todo );
+ }
+ }
+
+ calendar.close();
+}
+
+KPIM::IdMapper& ResourceCached::idMapper()
+{
+ return mIdMapper;
+}
+
+QString ResourceCached::cacheFile() const
+{
+ return locateLocal( "cache", "kcal/kresources/" + identifier() );
+}
+
+QString ResourceCached::changesCacheFile( const QString &type ) const
+{
+ return locateLocal( "cache", "kcal/changescache/" + identifier() + "_" + type );
+}
+
+void ResourceCached::saveChangesCache( const QMap<Incidence*, bool> &map, const QString &type )
+{
+ CalendarLocal calendar ( QString::fromLatin1( "UTC" ) );
+
+ bool isEmpty = true;
+ QMap<Incidence *,bool>::ConstIterator it;
+ for ( it = map.begin(); it != map.end(); ++it ) {
+ isEmpty = false;
+ calendar.addIncidence( it.key()->clone() );
+ }
+
+ if ( !isEmpty ) {
+ calendar.save( changesCacheFile( type ) );
+ } else {
+ QFile file( changesCacheFile( type ) );
+ file.remove();
+ }
+
+ calendar.close();
+}
+
+void ResourceCached::saveChangesCache()
+{
+ saveChangesCache( mAddedIncidences, "added" );
+ saveChangesCache( mDeletedIncidences, "deleted" );
+ saveChangesCache( mChangedIncidences, "changed" );
+}
+
+void ResourceCached::loadChangesCache( QMap<Incidence*, bool> &map, const QString &type )
+{
+ CalendarLocal calendar ( QString::fromLatin1( "UTC" ) );
+
+ if ( KStandardDirs::exists( changesCacheFile( type ) ) )
+ calendar.load( changesCacheFile( type ) );
+ else
+ return;
+
+ const Incidence::List list = calendar.incidences();
+ Incidence::List::ConstIterator it;
+ for ( it = list.begin(); it != list.end(); ++it )
+ map.insert( (*it)->clone(), true );
+
+ calendar.close();
+}
+
+void ResourceCached::loadChangesCache()
+{
+ loadChangesCache( mAddedIncidences, "added" );
+ loadChangesCache( mDeletedIncidences, "deleted" );
+ loadChangesCache( mChangedIncidences, "changed" );
+}
+
+void ResourceCached::calendarIncidenceAdded( Incidence *i )
+{
+#if 1
+ kdDebug(5800) << "ResourceCached::calendarIncidenceAdded(): "
+ << i->uid() << endl;
+#endif
+
+ QMap<Incidence *,bool>::ConstIterator it;
+ it = mAddedIncidences.find( i );
+ if ( it == mAddedIncidences.end() ) {
+ mAddedIncidences.insert( i, true );
+ }
+
+ checkForAutomaticSave();
+}
+
+void ResourceCached::calendarIncidenceChanged( Incidence *i )
+{
+#if 1
+ kdDebug(5800) << "ResourceCached::calendarIncidenceChanged(): "
+ << i->uid() << endl;
+#endif
+
+ QMap<Incidence *,bool>::ConstIterator it;
+ it = mChangedIncidences.find( i );
+ // FIXME: If you modify an added incidence, there's no need to add it to mChangedIncidences!
+ if ( it == mChangedIncidences.end() ) {
+ mChangedIncidences.insert( i, true );
+ }
+
+ checkForAutomaticSave();
+}
+
+void ResourceCached::calendarIncidenceDeleted( Incidence *i )
+{
+#if 1
+ kdDebug(5800) << "ResourceCached::calendarIncidenceDeleted(): "
+ << i->uid() << endl;
+#endif
+
+ QMap<Incidence *,bool>::ConstIterator it;
+ it = mDeletedIncidences.find( i );
+ if ( it == mDeletedIncidences.end() ) {
+ mDeletedIncidences.insert( i, true );
+ }
+
+ checkForAutomaticSave();
+}
+
+Incidence::List ResourceCached::addedIncidences() const
+{
+ Incidence::List added;
+ QMap<Incidence *,bool>::ConstIterator it;
+ for( it = mAddedIncidences.begin(); it != mAddedIncidences.end(); ++it ) {
+ added.append( it.key() );
+ }
+ return added;
+}
+
+Incidence::List ResourceCached::changedIncidences() const
+{
+ Incidence::List changed;
+ QMap<Incidence *,bool>::ConstIterator it;
+ for( it = mChangedIncidences.begin(); it != mChangedIncidences.end(); ++it ) {
+ changed.append( it.key() );
+ }
+ return changed;
+}
+
+Incidence::List ResourceCached::deletedIncidences() const
+{
+ Incidence::List deleted;
+ QMap<Incidence *,bool>::ConstIterator it;
+ for( it = mDeletedIncidences.begin(); it != mDeletedIncidences.end(); ++it ) {
+ deleted.append( it.key() );
+ }
+ return deleted;
+}
+
+Incidence::List ResourceCached::allChanges() const
+{
+ Incidence::List changes;
+ QMap<Incidence *,bool>::ConstIterator it;
+ for( it = mAddedIncidences.begin(); it != mAddedIncidences.end(); ++it ) {
+ changes.append( it.key() );
+ }
+ for( it = mChangedIncidences.begin(); it != mChangedIncidences.end(); ++it ) {
+ changes.append( it.key() );
+ }
+ for( it = mDeletedIncidences.begin(); it != mDeletedIncidences.end(); ++it ) {
+ changes.append( it.key() );
+ }
+ return changes;
+}
+
+bool ResourceCached::hasChanges() const
+{
+ return !( mAddedIncidences.isEmpty() && mChangedIncidences.isEmpty() &&
+ mDeletedIncidences.isEmpty() );
+}
+
+void ResourceCached::clearChange( Incidence *incidence )
+{
+ clearChange( incidence->uid() );
+}
+
+void ResourceCached::clearChange( const QString &uid )
+{
+ QMap<Incidence*, bool>::Iterator it;
+
+ for ( it = mAddedIncidences.begin(); it != mAddedIncidences.end(); ++it )
+ if ( it.key()->uid() == uid ) {
+ mAddedIncidences.remove( it );
+ break;
+ }
+
+ for ( it = mChangedIncidences.begin(); it != mChangedIncidences.end(); ++it )
+ if ( it.key()->uid() == uid ) {
+ mChangedIncidences.remove( it );
+ break;
+ }
+
+ for ( it = mDeletedIncidences.begin(); it != mDeletedIncidences.end(); ++it )
+ if ( it.key()->uid() == uid ) {
+ mDeletedIncidences.remove( it );
+ break;
+ }
+}
+
+void ResourceCached::enableChangeNotification()
+{
+ mCalendar.registerObserver( this );
+}
+
+void ResourceCached::disableChangeNotification()
+{
+ mCalendar.unregisterObserver( this );
+}
+
+void ResourceCached::slotReload()
+{
+ if ( !isActive() ) return;
+
+ kdDebug(5800) << "ResourceCached::slotReload()" << endl;
+
+ load();
+}
+
+void ResourceCached::slotSave()
+{
+ if ( !isActive() ) return;
+
+ kdDebug(5800) << "ResourceCached::slotSave()" << endl;
+
+ save();
+}
+
+void ResourceCached::checkForAutomaticSave()
+{
+ if ( mSavePolicy == SaveAlways ) {
+ kdDebug(5800) << "ResourceCached::checkForAutomaticSave(): save now" << endl;
+ mSaveTimer.start( 1 * 1000, true ); // 1 second
+ } else if ( mSavePolicy == SaveDelayed ) {
+ kdDebug(5800) << "ResourceCached::checkForAutomaticSave(): save delayed"
+ << endl;
+ mSaveTimer.start( 15 * 1000, true ); // 15 seconds
+ }
+}
+
+bool ResourceCached::checkForReload()
+{
+ if ( mReloadPolicy == ReloadNever ) return false;
+ if ( mReloadPolicy == ReloadOnStartup ) return !mReloaded;
+ return true;
+}
+
+bool ResourceCached::checkForSave()
+{
+ if ( mSavePolicy == SaveNever ) return false;
+ return true;
+}
+
+void ResourceCached::addInfoText( QString &txt ) const
+{
+ if ( mLastLoad.isValid() ) {
+ txt += "<br>";
+ txt += i18n("Last loaded: %1")
+ .arg( KGlobal::locale()->formatDateTime( mLastLoad ) );
+ }
+ if ( mLastSave.isValid() ) {
+ txt += "<br>";
+ txt += i18n("Last saved: %1")
+ .arg( KGlobal::locale()->formatDateTime( mLastSave ) );
+ }
+}
+
+void ResourceCached::doClose()
+{
+ mCalendar.close();
+}
+
+bool ResourceCached::doOpen()
+{
+ kdDebug(5800) << "Opening resource " << resourceName() << endl;
+ return true;
+}
+
+void KCal::ResourceCached::setOwner( const Person &owner )
+{
+ mCalendar.setOwner( owner );
+}
+
+const Person & KCal::ResourceCached::getOwner() const
+{
+ return mCalendar.getOwner();
+}
+
+#include "resourcecached.moc"
diff --git a/libkcal/resourcecached.h b/libkcal/resourcecached.h
new file mode 100644
index 00000000..bd997da5
--- /dev/null
+++ b/libkcal/resourcecached.h
@@ -0,0 +1,358 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2003,2004 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_RESOURCECACHED_H
+#define KCAL_RESOURCECACHED_H
+
+#include "resourcecalendar.h"
+
+#include "libemailfunctions/idmapper.h"
+#include "incidence.h"
+#include "calendarlocal.h"
+
+#include <kconfig.h>
+
+#include <qptrlist.h>
+#include <qstring.h>
+#include <qdatetime.h>
+#include <qtimer.h>
+
+#include <kdepimmacros.h>
+
+namespace KCal {
+
+/**
+ This class provides a calendar resource using a local CalendarLocal object to
+ cache the calendar data.
+*/
+class KDE_EXPORT ResourceCached : public ResourceCalendar,
+ public KCal::Calendar::Observer
+{
+ Q_OBJECT
+ public:
+ /**
+ Reload policy.
+
+ @see setReloadPolicy(), reloadPolicy()
+ */
+ enum { ReloadNever, ReloadOnStartup, ReloadInterval };
+ /**
+ Save policy.
+
+ @see setSavePolicy(), savePolicy()
+ */
+ enum { SaveNever, SaveOnExit, SaveInterval, SaveDelayed, SaveAlways };
+
+ ResourceCached( const KConfig * );
+ virtual ~ResourceCached();
+
+ void readConfig( const KConfig *config );
+ void writeConfig( KConfig *config );
+
+ /**
+ Set reload policy. This controls when the cache is refreshed.
+
+ ReloadNever never reload
+ ReloadOnStartup reload when resource is started
+ ReloadInterval reload regularly after given interval
+ */
+ void setReloadPolicy( int policy );
+ /**
+ Return reload policy.
+
+ @see setReloadPolicy()
+ */
+ int reloadPolicy() const;
+
+ /**
+ Set reload interval in minutes which is used when reload policy is
+ ReloadInterval.
+ */
+ void setReloadInterval( int minutes );
+
+ /**
+ Return reload interval in minutes.
+ */
+ int reloadInterval() const;
+
+ /**
+ Set save policy. This controls when the cache is refreshed.
+
+ SaveNever never save
+ SaveOnExit save when resource is exited
+ SaveInterval save regularly after given interval
+ SaveDelayed save after small delay
+ SaveAlways save on every change
+ */
+ void setSavePolicy( int policy );
+ /**
+ Return save policy.
+
+ @see setsavePolicy()
+ */
+ int savePolicy() const;
+
+ /**
+ Set save interval in minutes which is used when save policy is
+ SaveInterval.
+ */
+ void setSaveInterval( int minutes );
+
+ /**
+ Return save interval in minutes.
+ */
+ int saveInterval() const;
+
+ /**
+ Return time of last load.
+ */
+ QDateTime lastLoad() const;
+
+ /**
+ Return time of last save.
+ */
+ QDateTime lastSave() const;
+
+ /**
+ Add event to calendar.
+ */
+ bool addEvent(Event *anEvent);
+ /**
+ Deletes an event from this calendar.
+ */
+ bool deleteEvent(Event *);
+
+ /**
+ Retrieves an event on the basis of the unique string ID.
+ */
+ Event *event(const QString &UniqueStr);
+ /**
+ Return filtered list of all events in calendar.
+ */
+ Event::List events();
+ /**
+ Return unfiltered list of all events in calendar.
+ */
+ Event::List rawEvents( EventSortField sortField = EventSortUnsorted, SortDirection sortDirection = SortDirectionAscending );
+ /**
+ Builds and then returns a list of all events that match for the
+ date specified. useful for dayView, etc. etc.
+ */
+ Event::List rawEventsForDate( const QDate &date, EventSortField sortField = EventSortUnsorted, SortDirection sortDirection = SortDirectionAscending );
+
+ /**
+ Get unfiltered events for date \a qdt.
+ */
+ Event::List rawEventsForDate( const QDateTime &qdt );
+ /**
+ Get unfiltered events in a range of dates. If inclusive is set to true,
+ only events are returned, which are completely included in the range.
+ */
+ Event::List rawEvents( const QDate &start, const QDate &end,
+ bool inclusive = false );
+
+ /**
+ Add a todo to the todolist.
+ */
+ bool addTodo( Todo *todo );
+ /**
+ Remove a todo from the todolist.
+ */
+ bool deleteTodo( Todo * );
+ /**
+ Searches todolist for an event with this unique string identifier,
+ returns a pointer or null.
+ */
+ Todo *todo( const QString &uid );
+ /**
+ Return list of all todos.
+ */
+ Todo::List rawTodos( TodoSortField sortField = TodoSortUnsorted, SortDirection sortDirection = SortDirectionAscending );
+ /**
+ Returns list of todos due on the specified date.
+ */
+ Todo::List rawTodosForDate( const QDate &date );
+ /**
+ Add a Journal entry to calendar
+ */
+ virtual bool addJournal( Journal * );
+ /**
+ Remove a Journal from the calendar
+ */
+ virtual bool deleteJournal( Journal * );
+ /**
+ Return Journal with given unique id.
+ */
+ virtual Journal *journal( const QString &uid );
+ /**
+ Return list of all journals.
+ */
+ Journal::List rawJournals( JournalSortField sortField = JournalSortUnsorted,SortDirection sortDirection = SortDirectionAscending );
+ /**
+ Return list of journals for the given date.
+ */
+ Journal::List rawJournalsForDate( const QDate &date );
+
+ /**
+ Return all alarms, which ocur in the given time interval.
+ */
+ Alarm::List alarms( const QDateTime &from, const QDateTime &to );
+
+ /**
+ Return all alarms, which ocur before given date.
+ */
+ Alarm::List alarmsTo( const QDateTime &to );
+
+ /**
+ Set id of timezone, e.g. "Europe/Berlin"
+ */
+ void setTimeZoneId( const QString &timeZoneId );
+
+ QString timeZoneId() const;
+
+ /**
+ Return the owner of the calendar's full name.
+ */
+ const Person &getOwner() const;
+ /**
+ Set the owner of the calendar. Should be owner's full name.
+ */
+ void setOwner( const Person &owner );
+
+ void enableChangeNotification();
+ void disableChangeNotification();
+
+ void clearChange( Incidence * );
+ void clearChange( const QString &uid );
+
+ void clearChanges();
+
+ bool hasChanges() const;
+
+ Incidence::List allChanges() const;
+
+ Incidence::List addedIncidences() const;
+ Incidence::List changedIncidences() const;
+ Incidence::List deletedIncidences() const;
+
+ /**
+ Loads the cache, this method should be called on load.
+ */
+ void loadCache();
+
+ /**
+ Saves the cache back.
+ */
+ void saveCache();
+
+ /**
+ Clear cache.
+ */
+ void clearCache();
+
+ void cleanUpEventCache( const KCal::Event::List &eventList );
+ void cleanUpTodoCache( const KCal::Todo::List &todoList );
+
+ /**
+ Returns a reference to the id mapper.
+ */
+ KPIM::IdMapper& idMapper();
+
+ protected:
+ // From Calendar::Observer
+ void calendarIncidenceAdded( KCal::Incidence *incidence );
+ void calendarIncidenceChanged( KCal::Incidence *incidence );
+ void calendarIncidenceDeleted( KCal::Incidence *incidence );
+
+ CalendarLocal mCalendar;
+
+ /**
+ Virtual method from KRES::Resource, called when the last instace of the
+ resource is closed
+ */
+ virtual void doClose();
+ /**
+ Opens the resource. Dummy implementation, so child classes don't have to
+ reimplement this method. By default, this does not do anything, but can be reimplemented in child classes
+ */
+ virtual bool doOpen();
+ /**
+ Check if reload required according to reload policy.
+ */
+ bool checkForReload();
+ /**
+ Check if save required according to save policy.
+ */
+ bool checkForSave();
+
+ void checkForAutomaticSave();
+
+ void addInfoText( QString & ) const;
+
+ void setupSaveTimer();
+ void setupReloadTimer();
+
+ /**
+ This method is used by loadCache() and saveCache(), reimplement
+ it to change the location of the cache.
+ */
+ virtual QString cacheFile() const;
+
+ /**
+ Functions for keeping the changes persistent.
+ */
+ virtual QString changesCacheFile( const QString& ) const;
+ void loadChangesCache( QMap<Incidence*, bool>&, const QString& );
+ void loadChangesCache();
+ void saveChangesCache( const QMap<Incidence*, bool>&, const QString& );
+ void saveChangesCache();
+
+ protected slots:
+ void slotReload();
+ void slotSave();
+
+ void setIdMapperIdentifier();
+
+ private:
+ int mReloadPolicy;
+ int mReloadInterval;
+ QTimer mReloadTimer;
+ bool mReloaded;
+
+ int mSavePolicy;
+ int mSaveInterval;
+ QTimer mSaveTimer;
+
+ QDateTime mLastLoad;
+ QDateTime mLastSave;
+
+ QMap<KCal::Incidence *,bool> mAddedIncidences;
+ QMap<KCal::Incidence *,bool> mChangedIncidences;
+ QMap<KCal::Incidence *,bool> mDeletedIncidences;
+
+ KPIM::IdMapper mIdMapper;
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/resourcecachedconfig.cpp b/libkcal/resourcecachedconfig.cpp
new file mode 100644
index 00000000..4e701db3
--- /dev/null
+++ b/libkcal/resourcecachedconfig.cpp
@@ -0,0 +1,120 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2004 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qbuttongroup.h>
+#include <qlayout.h>
+#include <qradiobutton.h>
+#include <qspinbox.h>
+#include <qhbox.h>
+#include <qlabel.h>
+
+#include <klocale.h>
+#include <kdebug.h>
+
+#include "resourcecached.h"
+
+#include "resourcecachedconfig.h"
+
+using namespace KCal;
+
+ResourceCachedReloadConfig::ResourceCachedReloadConfig( QWidget *parent,
+ const char *name )
+ : QWidget( parent, name )
+{
+ QBoxLayout *topLayout = new QVBoxLayout( this );
+
+ mGroup = new QButtonGroup( 1, Horizontal, i18n("Automatic Reload"), this );
+ topLayout->addWidget( mGroup );
+ new QRadioButton( i18n("Never"), mGroup );
+ new QRadioButton( i18n("On startup"), mGroup );
+
+ QRadioButton *intervalRadio = new QRadioButton( i18n("Regular interval"),
+ mGroup );
+ connect( intervalRadio, SIGNAL( stateChanged( int ) ),
+ SLOT( slotIntervalStateChanged( int ) ) );
+ QHBox *intervalBox = new QHBox( mGroup );
+ new QLabel( i18n("Interval in minutes"), intervalBox );
+ mIntervalSpin = new QSpinBox( 1,900, 1,intervalBox );
+ mIntervalSpin->setEnabled( false );
+}
+
+void ResourceCachedReloadConfig::loadSettings( ResourceCached *resource )
+{
+ mGroup->setButton( resource->reloadPolicy() );
+ mIntervalSpin->setValue( resource->reloadInterval() );
+}
+
+void ResourceCachedReloadConfig::saveSettings( ResourceCached *resource )
+{
+ resource->setReloadPolicy( mGroup->selectedId() );
+ resource->setReloadInterval( mIntervalSpin->value() );
+}
+
+void ResourceCachedReloadConfig::slotIntervalStateChanged( int state )
+{
+ if ( state == QButton::On ) mIntervalSpin->setEnabled( true );
+ else mIntervalSpin->setEnabled( false );
+}
+
+
+ResourceCachedSaveConfig::ResourceCachedSaveConfig( QWidget *parent,
+ const char *name )
+ : QWidget( parent, name )
+{
+ QBoxLayout *topLayout = new QVBoxLayout( this );
+
+ mGroup = new QButtonGroup( 1, Horizontal, i18n("Automatic Save"), this );
+ topLayout->addWidget( mGroup );
+ new QRadioButton( i18n("Never"), mGroup );
+ new QRadioButton( i18n("On exit"), mGroup );
+
+ QRadioButton *intervalRadio = new QRadioButton( i18n("Regular interval"),
+ mGroup );
+ connect( intervalRadio, SIGNAL( stateChanged( int ) ),
+ SLOT( slotIntervalStateChanged( int ) ) );
+ QHBox *intervalBox = new QHBox( mGroup );
+ new QLabel( i18n("Interval in minutes"), intervalBox );
+ mIntervalSpin = new QSpinBox( 1,900, 1,intervalBox );
+ mIntervalSpin->setEnabled( false );
+
+ new QRadioButton( i18n("Delayed after changes"), mGroup );
+ new QRadioButton( i18n("On every change"), mGroup );
+}
+
+void ResourceCachedSaveConfig::loadSettings( ResourceCached *resource )
+{
+ mGroup->setButton( resource->savePolicy() );
+ mIntervalSpin->setValue( resource->saveInterval() );
+}
+
+void ResourceCachedSaveConfig::saveSettings( ResourceCached *resource )
+{
+ resource->setSavePolicy( mGroup->selectedId() );
+ resource->setSaveInterval( mIntervalSpin->value() );
+}
+
+void ResourceCachedSaveConfig::slotIntervalStateChanged( int state )
+{
+ if ( state == QButton::On ) mIntervalSpin->setEnabled( true );
+ else mIntervalSpin->setEnabled( false );
+}
+
+#include "resourcecachedconfig.moc"
diff --git a/libkcal/resourcecachedconfig.h b/libkcal/resourcecachedconfig.h
new file mode 100644
index 00000000..3eb05e05
--- /dev/null
+++ b/libkcal/resourcecachedconfig.h
@@ -0,0 +1,88 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2004 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_RESOURCECACHEDCONFIG_H
+#define KCAL_RESOURCECACHEDCONFIG_H
+
+#include <qwidget.h>
+#include <kdepimmacros.h>
+
+class QButtonGroup;
+class QSpinBox;
+
+namespace KCal {
+
+class ResourceCached;
+
+/**
+ Configuration widget for reload policy
+
+ @see ResourceCached
+*/
+class KDE_EXPORT ResourceCachedReloadConfig : public QWidget
+{
+ Q_OBJECT
+ public:
+ ResourceCachedReloadConfig( QWidget *parent = 0, const char *name = 0 );
+
+ public slots:
+ void loadSettings( ResourceCached *resource );
+ void saveSettings( ResourceCached *resource );
+
+ protected slots:
+ void slotIntervalStateChanged( int );
+
+ private:
+ QButtonGroup *mGroup;
+ QSpinBox *mIntervalSpin;
+
+ class Private;
+ Private *d;
+};
+
+/**
+ Configuration widget for save policy
+
+ @see ResourceCached
+*/
+class KDE_EXPORT ResourceCachedSaveConfig : public QWidget
+{
+ Q_OBJECT
+ public:
+ ResourceCachedSaveConfig( QWidget *parent = 0, const char *name = 0 );
+
+ public slots:
+ void loadSettings( ResourceCached *resource );
+ void saveSettings( ResourceCached *resource );
+
+ protected slots:
+ void slotIntervalStateChanged( int );
+
+ private:
+ QButtonGroup *mGroup;
+ QSpinBox *mIntervalSpin;
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/resourcecalendar.cpp b/libkcal/resourcecalendar.cpp
new file mode 100644
index 00000000..0b994a26
--- /dev/null
+++ b/libkcal/resourcecalendar.cpp
@@ -0,0 +1,205 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 1998 Preston Brown <pbrown@kde.org>
+ Copyright (c) 2001-2004 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (c) 2002 Jan-Pascal van Best <janpascal@vanbest.org>
+ Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kconfig.h>
+#include <kdebug.h>
+#include <klocale.h>
+
+#include "calendar.h"
+
+#include "resourcecalendar.h"
+
+using namespace KCal;
+
+ResourceCalendar::ResourceCalendar( const KConfig *config )
+ : KRES::Resource( config ),mResolveConflict( false )
+{
+}
+
+ResourceCalendar::~ResourceCalendar()
+{
+}
+
+void ResourceCalendar::setResolveConflict( bool b)
+{
+ mResolveConflict = b;
+}
+QString ResourceCalendar::infoText() const
+{
+ QString txt;
+
+ txt += "<b>" + resourceName() + "</b>";
+ txt += "<br>";
+
+ KRES::Factory *factory = KRES::Factory::self( "calendar" );
+ QString t = factory->typeName( type() );
+ txt += i18n("Type: %1").arg( t );
+
+ addInfoText( txt );
+
+ return txt;
+}
+
+void ResourceCalendar::writeConfig( KConfig* config )
+{
+// kdDebug(5800) << "ResourceCalendar::writeConfig()" << endl;
+
+ KRES::Resource::writeConfig( config );
+}
+
+Incidence *ResourceCalendar::incidence( const QString &uid )
+{
+ Incidence *i = event( uid );
+ if ( i ) return i;
+ i = todo( uid );
+ if ( i ) return i;
+ i = journal( uid );
+ return i;
+}
+
+bool ResourceCalendar::addIncidence( Incidence *incidence )
+{
+ Incidence::AddVisitor<ResourceCalendar> v( this );
+ return incidence->accept( v );
+}
+
+bool ResourceCalendar::deleteIncidence( Incidence *incidence )
+{
+ Incidence::DeleteVisitor<ResourceCalendar> v( this );
+ return incidence->accept( v );
+}
+
+Incidence::List ResourceCalendar::rawIncidences()
+{
+ return Calendar::mergeIncidenceList( rawEvents(), rawTodos(), rawJournals() );
+}
+
+void ResourceCalendar::setSubresourceActive( const QString &, bool )
+{
+}
+
+bool ResourceCalendar::addSubresource( const QString &, const QString & )
+{
+ return true;
+}
+
+bool ResourceCalendar::removeSubresource( const QString & )
+{
+ return true;
+}
+
+bool ResourceCalendar::load()
+{
+ kdDebug(5800) << "Loading resource " + resourceName() << endl;
+
+ mReceivedLoadError = false;
+
+ bool success = true;
+ if ( !isOpen() )
+ success = open();
+ if ( success )
+ success = doLoad();
+
+ if ( !success && !mReceivedLoadError )
+ loadError();
+
+ // If the resource is read-only, we need to set its incidences to read-only,
+ // too. This can't be done at a lower-level, since the read-only setting
+ // happens at this level
+ if ( readOnly() ) {
+ Incidence::List incidences( rawIncidences() );
+ Incidence::List::Iterator it;
+ for ( it = incidences.begin(); it != incidences.end(); ++it ) {
+ (*it)->setReadOnly( true );
+ }
+ }
+
+ kdDebug(5800) << "Done loading resource " + resourceName() << endl;
+
+ return success;
+}
+
+void ResourceCalendar::loadError( const QString &err )
+{
+ kdDebug(5800) << "Error loading resource: " << err << endl;
+
+ mReceivedLoadError = true;
+
+ QString msg = i18n("Error while loading %1.\n") .arg( resourceName() );
+ if ( !err.isEmpty() ) {
+ msg += err;
+ }
+ emit resourceLoadError( this, msg );
+}
+
+bool ResourceCalendar::save( Incidence *incidence )
+{
+ if ( !readOnly() ) {
+ kdDebug(5800) << "Save resource " + resourceName() << endl;
+
+ mReceivedSaveError = false;
+
+ if ( !isOpen() ) return true;
+ bool success = incidence ? doSave(incidence) : doSave();
+ if ( !success && !mReceivedSaveError ) saveError();
+
+ return success;
+ } else {
+ // Read-only, just don't save...
+ kdDebug(5800) << "Don't save read-only resource " + resourceName() << endl;
+ return true;
+ }
+}
+
+bool ResourceCalendar::doSave( Incidence * )
+{
+ return doSave();
+}
+
+void ResourceCalendar::saveError( const QString &err )
+{
+ kdDebug(5800) << "Error saving resource: " << err << endl;
+
+ mReceivedSaveError = true;
+
+ QString msg = i18n("Error while saving %1.\n") .arg( resourceName() );
+ if ( !err.isEmpty() ) {
+ msg += err;
+ }
+ emit resourceSaveError( this, msg );
+}
+
+bool ResourceCalendar::setValue( const QString &key, const QString &value )
+{
+ return false;
+}
+
+QString ResourceCalendar::subresourceType( const QString &resource )
+{
+ Q_UNUSED( resource );
+ return QString();
+}
+
+
+#include "resourcecalendar.moc"
diff --git a/libkcal/resourcecalendar.h b/libkcal/resourcecalendar.h
new file mode 100644
index 00000000..4cd4d91e
--- /dev/null
+++ b/libkcal/resourcecalendar.h
@@ -0,0 +1,413 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 1998 Preston Brown <pbrown@kde.org>
+ Copyright (c) 2001,2003 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (c) 2002 Jan-Pascal van Best <janpascal@vanbest.org>
+ Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef KCAL_RESOURCECALENDAR_H
+#define KCAL_RESOURCECALENDAR_H
+
+#include <qstring.h>
+#include <qdatetime.h>
+#include <qptrlist.h>
+
+#include <kconfig.h>
+
+#include "alarm.h"
+#include "todo.h"
+#include "event.h"
+#include "journal.h"
+#include "calendar.h"
+
+#include <kresources/resource.h>
+#include <kresources/manager.h>
+#include <kabc/lock.h>
+#include <kdepimmacros.h>
+
+namespace KCal {
+
+class CalFormat;
+
+/**
+ This class provides the interfaces for a calendar resource. It makes use of
+ the kresources framework.
+
+ \warning This code is still under heavy development. Don't expect source or
+ binary compatibility in future versions.
+*/
+class LIBKCAL_EXPORT ResourceCalendar : public KRES::Resource
+{
+ Q_OBJECT
+ public:
+ ResourceCalendar( const KConfig * );
+ virtual ~ResourceCalendar();
+
+ void setResolveConflict( bool b);
+
+ virtual void writeConfig( KConfig* config );
+
+ /**
+ Return rich text with info about the resource. Adds standard info and
+ then calls addInfoText() to add info about concrete resources.
+ */
+ virtual QString infoText() const;
+
+ /**
+ Load resource data. After calling this function all data is accessible by
+ calling the incidence/event/todo/etc. accessor functions.
+
+ Whether data is actually loaded within this function or the loading is delayed
+ until it is accessed by another function depends on the implementation of
+ the resource.
+
+ If loading the data takes significant time, the resource should return
+ cached values if available, and return the results via the resourceChanged
+ signal. When the resource has finished loading, the resourceLoaded() signal
+ is emitted.
+
+ Calling this function multiple times should have the same effect as
+ calling it once, given that the data isn't changed between calls.
+
+ This function calls doLoad() which has to be reimplented by the resource
+ to do the actual loading.
+ */
+ bool load();
+
+ /**
+ Save resource data. After calling this function it is safe to close the
+ resource without losing data.
+
+ Whether data is actually saved within this function or saving is delayed
+ depends on the implementation of the resource.
+
+ If saving the data takes significant time, the resource should return from
+ the function, do the saving in the background and notify the end of the
+ save by emitting the signal resourceSaved().
+
+ This function calls doSave() which has to be reimplented by the resource
+ to do the actual saving.
+
+ @param incidence if given as 0, doSave() is called to save all incidences,
+ else doSave(incidence) is called to save only the given one
+ */
+ bool save( Incidence *incidence = 0 );
+
+ /**
+ Return true if a save operation is still in progress, otherwise return
+ false.
+ */
+ virtual bool isSaving() { return false; }
+
+ /**
+ Return object for locking the resource.
+ */
+ virtual KABC::Lock *lock() = 0;
+
+ /**
+ Add incidence to resource.
+ */
+ virtual bool addIncidence( Incidence * );
+
+ /**
+ Delete incidence from resource.
+ */
+ virtual bool deleteIncidence( Incidence * );
+
+ /**
+ Return incidence with given unique id. If there is no incidence with that
+ uid, return 0.
+ */
+ Incidence *incidence( const QString &uid );
+
+ /**
+ Add event to resource.
+ */
+ virtual bool addEvent( Event *event ) = 0;
+
+ /**
+ Delete event from this resource.
+ */
+ virtual bool deleteEvent( Event * ) = 0;
+
+ /**
+ Retrieves an event on the basis of the unique string ID.
+ */
+ virtual Event *event( const QString &uid ) = 0;
+
+ /**
+ Return unfiltered list of all events in calendar. Use with care,
+ this can be a bad idea for server-based calendars.
+ */
+ virtual Event::List rawEvents( EventSortField sortField = EventSortUnsorted, SortDirection sortDirection = SortDirectionAscending ) = 0;
+
+ /**
+ Builds and then returns a list of all events that match the
+ date specified. Useful for dayView, etc. etc.
+ */
+ virtual Event::List rawEventsForDate( const QDate &date, EventSortField sortField = EventSortUnsorted, SortDirection sortDirection = SortDirectionAscending ) = 0;
+
+ /**
+ Get unfiltered events for date \a qdt.
+ */
+ virtual Event::List rawEventsForDate( const QDateTime &qdt ) = 0;
+
+ /**
+ Get unfiltered events in a range of dates. If inclusive is set to true,
+ only events which are completely included in the range are returned.
+ */
+ virtual Event::List rawEvents( const QDate &start, const QDate &end,
+ bool inclusive = false ) = 0;
+
+ /**
+ Sets a particular value of the resource's configuration. The possible
+ keys are resource specific.
+
+ This method is provided to make it possible
+ to set resource-type specific settings without actually linking to
+ the resource's library. Its use is discouraged, but in
+ some situations the only possibility to avoid unwanted compiling and
+ linking dependencies. E.g. if you don't want to link to the remote
+ resource, but need to create a remote resource at the URL given in
+ yourURL, you can use code like the following:
+ KCal::ResourceCalendar *res = manager->createResource( "remote" );
+ if ( res ) {
+ res->setTimeZoneId( timezone );
+ res->setResourceName( i18n("Test resource") );
+ res->setValue( "DownloadURL", yourURL );
+ manager->add( res );
+ }
+ */
+ virtual bool setValue( const QString &key, const QString &value );
+
+ signals:
+ /**
+ This signal is emitted when the data in the resource has changed. The
+ resource has to make sure that this signal is emitted whenever any
+ pointers to incidences which the resource has previously given to the
+ calling code, become invalid.
+ */
+ void resourceChanged( ResourceCalendar * );
+
+ /**
+ This signal is emitted when loading data into the resource has been
+ finished.
+ */
+ void resourceLoaded( ResourceCalendar * );
+ /**
+ This signal is emitted when saving the data of the resource has been
+ finished.
+ */
+ void resourceSaved( ResourceCalendar * );
+
+ /**
+ This signal is emitted when an error occurs during loading.
+ */
+ void resourceLoadError( ResourceCalendar *, const QString &error );
+ /**
+ This signal is emitted when an error occurs during saving.
+ */
+ void resourceSaveError( ResourceCalendar *, const QString &error );
+
+ /**
+ This signal is emitted when a subresource is added.
+ */
+ void signalSubresourceAdded( ResourceCalendar *, const QString& type,
+ const QString& subresource, const QString& label );
+
+ /**
+ This signal is emitted when a subresource is removed.
+ */
+ void signalSubresourceRemoved( ResourceCalendar *, const QString &,
+ const QString & );
+
+ public:
+ /**
+ Add a todo to the todolist.
+ */
+ virtual bool addTodo( Todo *todo ) = 0;
+ /**
+ Remove a todo from the todolist.
+ */
+ virtual bool deleteTodo( Todo * ) = 0;
+ /**
+ Searches todolist for an event with this unique id.
+
+ @return pointer to todo or 0 if todo wasn't found
+ */
+ virtual Todo *todo( const QString &uid ) = 0;
+ /**
+ Return list of all todos.
+ */
+ virtual Todo::List rawTodos( TodoSortField sortField = TodoSortUnsorted, SortDirection sortDirection = SortDirectionAscending ) = 0;
+ /**
+ Returns list of todos due on the specified date.
+ */
+ virtual Todo::List rawTodosForDate( const QDate &date ) = 0;
+
+
+ /**
+ Add a Journal entry to the resource.
+ */
+ virtual bool addJournal( Journal * ) = 0;
+
+ /**
+ Remove a Journal entry from calendar.
+ */
+ virtual bool deleteJournal( Journal * ) = 0;
+
+ /**
+ Return Journal with given unique id.
+ */
+ virtual Journal *journal( const QString &uid ) = 0;
+ /**
+ Return list of all journals.
+ */
+ virtual Journal::List rawJournals( JournalSortField sortField = JournalSortUnsorted, SortDirection sortDirection = SortDirectionAscending ) = 0;
+ /**
+ Returns list of journals for the given date.
+ */
+ virtual Journal::List rawJournalsForDate( const QDate &date ) = 0;
+
+ /**
+ Return all alarms which occur in the given time interval.
+ */
+ virtual Alarm::List alarms( const QDateTime &from,
+ const QDateTime &to ) = 0;
+
+ /**
+ Return all alarms which occur before given date.
+ */
+ virtual Alarm::List alarmsTo( const QDateTime &to ) = 0;
+
+
+ /** Returns a list of all incideces */
+ Incidence::List rawIncidences();
+
+ /**
+ Set time zone id used by this resource, e.g. "Europe/Berlin".
+ */
+ virtual void setTimeZoneId( const QString &timeZoneId ) = 0;
+
+ /**
+ If this resource has subresources, return a QStringList of them.
+ In most cases, resources do not have subresources, so this is
+ by default just empty.
+ */
+ virtual QStringList subresources() const { return QStringList(); }
+
+ /**
+ Is this subresource capable of having subresources or not?
+ */
+ virtual bool canHaveSubresources() const { return false; }
+
+ /**
+ Is this subresource active or not?
+ */
+ virtual bool subresourceActive( const QString& ) const { return true; }
+
+ /**
+ What is the label for this subresource?
+ */
+ virtual const QString labelForSubresource( const QString& resource ) const
+ {
+ // the resource identifier is a sane fallback
+ return resource;
+ };
+
+ /**
+ Get the identifier of the subresource associated with a specified
+ incidence.
+
+ @return the identifier of the subresource or an empty string.
+ */
+ virtual QString subresourceIdentifier( Incidence *incidence )
+ { Q_UNUSED( incidence ); return QString(); }
+
+
+
+ /**
+ * Remove a subresource with the id @param resource
+ */
+ virtual bool removeSubresource( const QString& resource );
+
+ /**
+ * Add a subresource with the name @param resource and the parent
+ * id @param parent.
+ */
+ virtual bool addSubresource( const QString& resource, const QString& parent );
+
+ /**
+ * Returns the type of the subresource: "event", "todo" or "journal",
+ * QString() if unknown/mixed.
+ */
+ virtual QString subresourceType( const QString &resource );
+
+ public slots:
+ /**
+ (De-)activate a subresource.
+ */
+ virtual void setSubresourceActive( const QString &, bool active );
+
+ protected:
+
+ bool mResolveConflict;
+ /**
+ Do the actual loading of the resource data. Called by load().
+ */
+ virtual bool doLoad() = 0;
+ /**
+ Do the actual saving of the resource data. Called by save().
+ */
+ virtual bool doSave() = 0;
+
+ /**
+ Do the actual saving of the resource data. Called by save().
+ Save one Incidence. The default implementation calls doSave() to save everything
+ */
+ virtual bool doSave( Incidence * );
+
+ /**
+ Add info text for concrete resources. Called by infoText().
+ */
+ virtual void addInfoText( QString & ) const {};
+
+ /**
+ A resource should call this function if a load error happens.
+ */
+ void loadError( const QString &errorMessage = QString::null );
+ /**
+ A resource should call this function if a save error happens.
+ */
+ void saveError( const QString &errorMessage = QString::null );
+
+ private:
+ bool mReceivedLoadError;
+ bool mReceivedSaveError;
+
+ class Private;
+ Private *d;
+};
+
+typedef KRES::Manager<ResourceCalendar> CalendarResourceManager;
+
+}
+
+#endif
diff --git a/libkcal/resourcelocal.cpp b/libkcal/resourcelocal.cpp
new file mode 100644
index 00000000..cb61cd1a
--- /dev/null
+++ b/libkcal/resourcelocal.cpp
@@ -0,0 +1,231 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 1998 Preston Brown <pbrown@kde.org>
+ Copyright (c) 2001,2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <typeinfo>
+#include <stdlib.h>
+
+#include <qdatetime.h>
+#include <qstring.h>
+#include <qptrlist.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kurl.h>
+#include <kstandarddirs.h>
+
+#include "vcaldrag.h"
+#include "vcalformat.h"
+#include "icalformat.h"
+#include "exceptions.h"
+#include "incidence.h"
+#include "event.h"
+#include "todo.h"
+#include "journal.h"
+#include "filestorage.h"
+
+#include <kresources/configwidget.h>
+
+#include "resourcelocalconfig.h"
+
+#include "resourcelocal.h"
+
+using namespace KCal;
+
+class ResourceLocal::Private
+{
+ public:
+ QDateTime mLastModified;
+};
+
+ResourceLocal::ResourceLocal( const KConfig* config )
+ : ResourceCached( config ), mLock( 0 )
+{
+ if ( config ) {
+ QString url = config->readPathEntry( "CalendarURL" );
+ mURL = KURL( url );
+
+ QString format = config->readEntry( "Format" );
+ if ( format == "ical" )
+ mFormat = new ICalFormat();
+ else if ( format == "vcal" )
+ mFormat = new VCalFormat();
+ else {
+ mFormat = new ICalFormat();
+ }
+ } else {
+ mURL = KURL();
+ mFormat = new ICalFormat();
+ }
+ init();
+}
+
+ResourceLocal::ResourceLocal( const QString& fileName )
+ : ResourceCached( 0 )
+{
+ mURL = KURL( fileName );
+ mFormat = new ICalFormat();
+ init();
+}
+
+
+void ResourceLocal::writeConfig( KConfig* config )
+{
+ kdDebug(5800) << "ResourceLocal::writeConfig()" << endl;
+
+ ResourceCalendar::writeConfig( config );
+ config->writePathEntry( "CalendarURL", mURL.prettyURL() );
+ QString typeID = typeid( *mFormat ).name();
+
+ if ( typeid( *mFormat ) == typeid( ICalFormat ) )
+ config->writeEntry( "Format", "ical" );
+ else if ( typeid( *mFormat ) == typeid( VCalFormat ) ) // if ( typeID == "ICalFormat" )
+ config->writeEntry( "Format", "vcal" );
+ else
+ kdDebug(5800) << "ERROR: Unknown format type" << endl;
+}
+
+void ResourceLocal::init()
+{
+ d = new ResourceLocal::Private;
+
+ setType( "file" );
+
+ setSavePolicy( SaveDelayed );
+
+ connect( &mDirWatch, SIGNAL( dirty( const QString & ) ),
+ SLOT( reload() ) );
+ connect( &mDirWatch, SIGNAL( created( const QString & ) ),
+ SLOT( reload() ) );
+ connect( &mDirWatch, SIGNAL( deleted( const QString & ) ),
+ SLOT( reload() ) );
+
+ mLock = new KABC::Lock( mURL.path() );
+
+ mDirWatch.addFile( mURL.path() );
+ mDirWatch.startScan();
+}
+
+
+ResourceLocal::~ResourceLocal()
+{
+ mDirWatch.stopScan();
+
+ close();
+
+ delete mLock;
+
+ delete d;
+}
+
+QDateTime ResourceLocal::readLastModified()
+{
+ QFileInfo fi( mURL.path() );
+ return fi.lastModified();
+}
+
+bool ResourceLocal::doLoad()
+{
+ bool success;
+
+ if ( !KStandardDirs::exists( mURL.path() ) ) {
+ kdDebug(5800) << "ResourceLocal::load(): File doesn't exist yet." << endl;
+ // Save the empty calendar, so the calendar file will be created.
+ success = doSave();
+ } else {
+ success = mCalendar.load( mURL.path() );
+ if ( success ) d->mLastModified = readLastModified();
+ }
+
+ return success;
+}
+
+bool ResourceLocal::doSave()
+{
+ bool success = mCalendar.save( mURL.path() );
+ d->mLastModified = readLastModified();
+
+ return success;
+}
+
+KABC::Lock *ResourceLocal::lock()
+{
+ return mLock;
+}
+
+bool ResourceLocal::doReload()
+{
+ kdDebug(5800) << "ResourceLocal::doReload()" << endl;
+
+ if ( !isOpen() ) return false;
+
+ if ( d->mLastModified == readLastModified() ) {
+ kdDebug(5800) << "ResourceLocal::reload(): file not modified since last read."
+ << endl;
+ return false;
+ }
+
+ mCalendar.close();
+ mCalendar.load( mURL.path() );
+ return true;
+}
+
+void ResourceLocal::reload()
+{
+ if ( doReload() )
+ emit resourceChanged( this );
+}
+
+void ResourceLocal::dump() const
+{
+ ResourceCalendar::dump();
+ kdDebug(5800) << " Url: " << mURL.url() << endl;
+}
+
+QString ResourceLocal::fileName() const
+{
+ return mURL.path();
+}
+
+bool ResourceLocal::setFileName( const QString &fileName )
+{
+ bool open = isOpen();
+ if ( open ) close();
+ delete mLock;
+ mDirWatch.stopScan();
+ mDirWatch.removeFile( mURL.path() );
+ mURL = KURL( fileName );
+ mLock = new KABC::Lock( mURL.path() );
+ mDirWatch.addFile( mURL.path() );
+ mDirWatch.startScan();
+ return true;
+}
+
+bool ResourceLocal::setValue( const QString &key, const QString &value )
+{
+ if ( key == "File" ) {
+ return setFileName( value );
+ } else return false;
+}
+
+
+
+#include "resourcelocal.moc"
diff --git a/libkcal/resourcelocal.h b/libkcal/resourcelocal.h
new file mode 100644
index 00000000..c5bf9c42
--- /dev/null
+++ b/libkcal/resourcelocal.h
@@ -0,0 +1,104 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 1998 Preston Brown <pbrown@kde.org>
+ Copyright (c) 2001,2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_RESOURCELOCAL_H
+#define KCAL_RESOURCELOCAL_H
+
+#include <qstring.h>
+#include <qdatetime.h>
+
+#include <kurl.h>
+#include <kdirwatch.h>
+#include <kdepimmacros.h>
+class KConfig;
+
+#include "calendarlocal.h"
+#include "libkcal_export.h"
+
+#include "resourcecached.h"
+
+namespace KCal {
+
+class CalFormat;
+
+/**
+ This class provides a calendar resource stored as a local file.
+*/
+class LIBKCAL_EXPORT ResourceLocal : public ResourceCached
+{
+ Q_OBJECT
+
+ friend class ResourceLocalConfig;
+
+ public:
+ /**
+ Create resource from configuration information stored in a KConfig object.
+ */
+ ResourceLocal( const KConfig * );
+ /**
+ Create resource for file named @a fileName.
+ */
+ ResourceLocal( const QString& fileName );
+ virtual ~ResourceLocal();
+
+ virtual void writeConfig( KConfig* config );
+
+ KABC::Lock *lock();
+
+ QString fileName() const;
+ bool setFileName( const QString &fileName );
+ bool setValue( const QString &key, const QString &value );
+
+
+ void dump() const;
+
+ protected slots:
+ void reload();
+
+ protected:
+ virtual bool doLoad();
+ virtual bool doSave();
+ /**
+ Called by reload() to reload the resource, if it is already open.
+ @return true if successful, else false. If true is returned,
+ reload() will emit a resourceChanged() signal.
+ */
+ virtual bool doReload();
+
+ QDateTime readLastModified();
+
+ private:
+ void init();
+
+ KURL mURL;
+ CalFormat *mFormat;
+
+ KDirWatch mDirWatch;
+
+ KABC::Lock *mLock;
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/resourcelocal_plugin.cpp b/libkcal/resourcelocal_plugin.cpp
new file mode 100644
index 00000000..9880fd50
--- /dev/null
+++ b/libkcal/resourcelocal_plugin.cpp
@@ -0,0 +1,34 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 1998 Preston Brown <pbrown@kde.org>
+ Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "resourcelocalconfig.h"
+#include "resourcelocal.h"
+
+using namespace KCal;
+
+extern "C"
+{
+ void *init_kcal_local()
+ {
+ return new KRES::PluginFactory<ResourceLocal,ResourceLocalConfig>();
+ }
+}
diff --git a/libkcal/resourcelocalconfig.cpp b/libkcal/resourcelocalconfig.cpp
new file mode 100644
index 00000000..cfeadf78
--- /dev/null
+++ b/libkcal/resourcelocalconfig.cpp
@@ -0,0 +1,110 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2002 Tobias Koenig <tokoe@kde.org>
+ Copyright (c) 2002 Jan-Pascal van Best <janpascal@vanbest.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <typeinfo>
+
+#include <qlabel.h>
+#include <qlayout.h>
+
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kdebug.h>
+#include <kstandarddirs.h>
+
+#include "vcaldrag.h"
+#include "vcalformat.h"
+#include "icalformat.h"
+
+#include "resourcelocal.h"
+
+#include "resourcelocalconfig.h"
+
+using namespace KCal;
+
+ResourceLocalConfig::ResourceLocalConfig( QWidget* parent, const char* name )
+ : KRES::ConfigWidget( parent, name )
+{
+ resize( 245, 115 );
+ QGridLayout *mainLayout = new QGridLayout( this, 2, 2 );
+
+ QLabel *label = new QLabel( i18n( "Location:" ), this );
+ mURL = new KURLRequester( this );
+ mainLayout->addWidget( label, 1, 0 );
+ mainLayout->addWidget( mURL, 1, 1 );
+
+ formatGroup = new QButtonGroup( 1, Horizontal, i18n( "Calendar Format" ), this );
+
+ icalButton = new QRadioButton( i18n("iCalendar"), formatGroup );
+ vcalButton = new QRadioButton( i18n("vCalendar"), formatGroup );
+
+ mainLayout->addWidget( formatGroup, 2, 1 );
+}
+
+void ResourceLocalConfig::loadSettings( KRES::Resource *resource )
+{
+ ResourceLocal* res = static_cast<ResourceLocal*>( resource );
+ if ( res ) {
+ mURL->setURL( res->mURL.prettyURL() );
+ kdDebug(5800) << "Format typeid().name(): " << typeid( res->mFormat ).name() << endl;
+ if ( typeid( *(res->mFormat) ) == typeid( ICalFormat ) )
+ formatGroup->setButton( 0 );
+ else if ( typeid( *(res->mFormat) ) == typeid( VCalFormat ) )
+ formatGroup->setButton( 1 );
+ else
+ kdDebug(5800) << "ERROR: ResourceLocalConfig::loadSettings(): Unknown format type" << endl;
+ } else
+ kdDebug(5800) << "ERROR: ResourceLocalConfig::loadSettings(): no ResourceLocal, cast failed" << endl;
+}
+
+void ResourceLocalConfig::saveSettings( KRES::Resource *resource )
+{
+ QString url = mURL->url();
+
+ if( url.isEmpty() ) {
+ KStandardDirs dirs;
+ QString saveFolder = dirs.saveLocation( "data", "korganizer" );
+ QFile file( saveFolder + "/std.ics" );
+
+ // find a non-existent name
+ for( int i = 0; file.exists(); ++i )
+ file.setName( saveFolder + "/std" + QString::number(i) + ".ics" );
+
+ KMessageBox::information( this, i18n( "You did not specify a URL for this resource. Therefore, the resource will be saved in %1. It is still possible to change this location by editing the resource properties." ).arg( file.name() ) );
+
+ url = file.name();
+ }
+
+ ResourceLocal* res = static_cast<ResourceLocal*>( resource );
+ if (res) {
+ res->mURL = url;
+
+ delete res->mFormat;
+ if ( icalButton->isOn() ) {
+ res->mFormat = new ICalFormat();
+ } else {
+ res->mFormat = new VCalFormat();
+ }
+ } else
+ kdDebug(5800) << "ERROR: ResourceLocalConfig::saveSettings(): no ResourceLocal, cast failed" << endl;
+}
+
+#include "resourcelocalconfig.moc"
diff --git a/libkcal/resourcelocalconfig.h b/libkcal/resourcelocalconfig.h
new file mode 100644
index 00000000..4752b131
--- /dev/null
+++ b/libkcal/resourcelocalconfig.h
@@ -0,0 +1,63 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2002 Tobias Koenig <tokoe@kde.org>
+ Copyright (c) 2002 Jan-Pascal van Best <janpascal@vanbest.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_RESOURCELOCALCONFIG_H
+#define KCAL_RESOURCELOCALCONFIG_H
+
+#include <qradiobutton.h>
+#include <qbuttongroup.h>
+#include <kurlrequester.h>
+
+#include <kresources/resource.h>
+#include <kresources/configwidget.h>
+#include <kdepimmacros.h>
+
+#include "libkcal_export.h"
+
+namespace KCal {
+
+/**
+ Configuration widget for local file resource.
+
+ @see ResourceLocal
+*/
+class LIBKCAL_EXPORT ResourceLocalConfig : public KRES::ConfigWidget
+{
+ Q_OBJECT
+ public:
+ ResourceLocalConfig( QWidget* parent = 0, const char* name = 0 );
+
+ public slots:
+ virtual void loadSettings( KRES::Resource *resource);
+ virtual void saveSettings( KRES::Resource *resource );
+
+ private:
+ KURLRequester *mURL;
+ QButtonGroup *formatGroup;
+ QRadioButton *icalButton;
+ QRadioButton *vcalButton;
+
+ class Private;
+ Private *d;
+};
+
+}
+#endif
diff --git a/libkcal/resourcelocaldir.cpp b/libkcal/resourcelocaldir.cpp
new file mode 100644
index 00000000..5e6528e8
--- /dev/null
+++ b/libkcal/resourcelocaldir.cpp
@@ -0,0 +1,277 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <typeinfo>
+#include <stdlib.h>
+
+#include <qdatetime.h>
+#include <qfileinfo.h>
+#include <qstring.h>
+#include <qptrlist.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kurl.h>
+#include <kconfig.h>
+#include <kstandarddirs.h>
+
+#include "vcaldrag.h"
+#include "vcalformat.h"
+#include "icalformat.h"
+#include "exceptions.h"
+#include "calendarlocal.h"
+#include "incidence.h"
+#include "event.h"
+#include "todo.h"
+#include "journal.h"
+#include "filestorage.h"
+
+#include <kresources/configwidget.h>
+
+#include "resourcelocaldirconfig.h"
+
+#include "resourcelocaldir.h"
+
+using namespace KCal;
+
+ResourceLocalDir::ResourceLocalDir( const KConfig* config )
+ : ResourceCached( config ), mLock( 0 )
+{
+ if ( config ) {
+ readConfig( config );
+ }
+
+ init();
+}
+
+ResourceLocalDir::ResourceLocalDir( const QString& dirName )
+ : ResourceCached( 0 )
+{
+ mURL = KURL( dirName );
+
+ init();
+}
+
+
+void ResourceLocalDir::readConfig( const KConfig *config )
+{
+ QString url = config->readPathEntry( "CalendarURL" );
+ mURL = KURL( url );
+}
+
+void ResourceLocalDir::writeConfig( KConfig *config )
+{
+ kdDebug(5800) << "ResourceLocalDir::writeConfig()" << endl;
+
+ ResourceCalendar::writeConfig( config );
+
+ config->writePathEntry( "CalendarURL", mURL.prettyURL() );
+}
+
+void ResourceLocalDir::init()
+{
+ setType( "dir" );
+
+ setSavePolicy( SaveDelayed );
+
+ connect( &mDirWatch, SIGNAL( dirty( const QString & ) ),
+ SLOT( reload( const QString & ) ) );
+ connect( &mDirWatch, SIGNAL( created( const QString & ) ),
+ SLOT( reload( const QString & ) ) );
+ connect( &mDirWatch, SIGNAL( deleted( const QString & ) ),
+ SLOT( reload( const QString & ) ) );
+
+ mLock = new KABC::Lock( mURL.path() );
+
+ mDirWatch.addDir( mURL.path(), true );
+ mDirWatch.startScan();
+}
+
+
+ResourceLocalDir::~ResourceLocalDir()
+{
+ close();
+
+ delete mLock;
+}
+
+bool ResourceLocalDir::doOpen()
+{
+ QFileInfo dirInfo( mURL.path() );
+ return dirInfo.isDir() && dirInfo.isReadable() &&
+ ( dirInfo.isWritable() || readOnly() );
+}
+
+bool ResourceLocalDir::doLoad()
+{
+ kdDebug(5800) << "ResourceLocalDir::load()" << endl;
+
+ mCalendar.close();
+ QString dirName = mURL.path();
+
+ if ( !( KStandardDirs::exists( dirName ) || KStandardDirs::exists( dirName + "/") ) ) {
+ kdDebug(5800) << "ResourceLocalDir::load(): Directory '" << dirName
+ << "' doesn't exist yet. Creating it..." << endl;
+ // Create the directory. Use 0775 to allow group-writable if the umask
+ // allows it (permissions will be 0775 & ~umask). This is desired e.g. for
+ // group-shared directories!
+ return KStandardDirs::makeDir( dirName, 0775 );
+ }
+
+ // The directory exists. Now try to open (the files in) it.
+ kdDebug(5800) << "ResourceLocalDir::load(): '" << dirName << "'" << endl;
+ QFileInfo dirInfo( dirName );
+ if ( !( dirInfo.isDir() && dirInfo.isReadable() &&
+ ( dirInfo.isWritable() || readOnly() ) ) )
+ return false;
+
+ QDir dir( dirName );
+ QStringList entries = dir.entryList( QDir::Files | QDir::Readable );
+
+ bool success = true;
+ QStringList::ConstIterator it;
+ for( it = entries.constBegin(); it != entries.constEnd(); ++it ) {
+ if ( (*it).endsWith( "~" ) ) // is backup file, ignore it
+ continue;
+
+ QString fileName = dirName + "/" + *it;
+ kdDebug(5800) << " read '" << fileName << "'" << endl;
+ CalendarLocal cal( mCalendar.timeZoneId() );
+ if ( !doFileLoad( cal, fileName ) ) {
+ success = false;
+ }
+ }
+
+ return success;
+}
+
+bool ResourceLocalDir::doFileLoad( CalendarLocal &cal, const QString &fileName )
+{
+ if ( !cal.load( fileName ) )
+ return false;
+ Incidence::List incidences = cal.rawIncidences();
+ Incidence::List::ConstIterator it;
+ for ( it = incidences.constBegin(); it != incidences.constEnd(); ++it ) {
+ Incidence *i = *it;
+ if ( i ) mCalendar.addIncidence( i->clone() );
+ }
+ return true;
+}
+
+bool ResourceLocalDir::doSave()
+{
+ Incidence::List list;
+ bool success = true;
+
+ list = addedIncidences();
+ list += changedIncidences();
+
+ for ( Incidence::List::iterator it = list.begin(); it != list.end(); ++it )
+ if ( !doSave( *it ) )
+ success = false;
+
+ return success;
+}
+
+bool ResourceLocalDir::doSave( Incidence *incidence )
+{
+ mDirWatch.stopScan(); // do prohibit the dirty() signal and a following reload()
+
+ QString fileName = mURL.path() + "/" + incidence->uid();
+ kdDebug(5800) << "writing '" << fileName << "'" << endl;
+
+ CalendarLocal cal( mCalendar.timeZoneId() );
+ cal.addIncidence( incidence->clone() );
+ const bool ret = cal.save( fileName );
+
+ mDirWatch.startScan();
+
+ return ret;
+}
+
+KABC::Lock *ResourceLocalDir::lock()
+{
+ return mLock;
+}
+
+void ResourceLocalDir::reload( const QString &file )
+{
+ kdDebug(5800) << "ResourceLocalDir::reload()" << endl;
+
+ if ( !isOpen() )
+ return;
+
+ kdDebug(5800) << " File: '" << file << "'" << endl;
+
+ mCalendar.close();
+ load();
+
+ emit resourceChanged( this );
+}
+
+
+bool ResourceLocalDir::deleteEvent(Event *event)
+{
+ kdDebug(5800) << "ResourceLocalDir::deleteEvent" << endl;
+ if ( deleteIncidenceFile(event) )
+ return( mCalendar.deleteEvent( event ) );
+ else
+ return( false );
+}
+
+
+bool ResourceLocalDir::deleteTodo(Todo *todo)
+{
+ if ( deleteIncidenceFile(todo) )
+ return( mCalendar.deleteTodo( todo ) );
+ else
+ return( false );
+}
+
+
+bool ResourceLocalDir::deleteJournal( Journal *journal )
+{
+ if ( deleteIncidenceFile( journal ) )
+ return( mCalendar.deleteJournal( journal ) );
+ else
+ return( false );
+}
+
+
+void ResourceLocalDir::dump() const
+{
+ ResourceCalendar::dump();
+ kdDebug(5800) << " Url: " << mURL.url() << endl;
+}
+
+bool ResourceLocalDir::deleteIncidenceFile(Incidence *incidence)
+{
+ QFile file( mURL.path() + "/" + incidence->uid() );
+ if ( !file.exists() )
+ return true;
+
+ mDirWatch.stopScan();
+ bool removed = file.remove();
+ mDirWatch.startScan();
+ return removed;
+}
+
+#include "resourcelocaldir.moc"
diff --git a/libkcal/resourcelocaldir.h b/libkcal/resourcelocaldir.h
new file mode 100644
index 00000000..da498a8a
--- /dev/null
+++ b/libkcal/resourcelocaldir.h
@@ -0,0 +1,103 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_RESOURCELOCALDIRDIR_H
+#define KCAL_RESOURCELOCALDIRDIR_H
+
+#include <kurl.h>
+#include <kdirwatch.h>
+#include <kdepimmacros.h>
+
+#include "resourcecached.h"
+
+#include "libkcal_export.h"
+
+class QString;
+class KConfig;
+
+namespace KCal {
+
+class CalendarLocal;
+class Incidence;
+
+/**
+ \internal
+
+ This class provides a calendar stored as a file per incidence in a directory.
+*/
+class LIBKCAL_EXPORT ResourceLocalDir : public ResourceCached
+{
+ Q_OBJECT
+
+ friend class ResourceLocalDirConfig;
+
+ public:
+ ResourceLocalDir( const KConfig * );
+ ResourceLocalDir( const QString& fileName );
+ virtual ~ResourceLocalDir();
+
+ void readConfig( const KConfig *config );
+ void writeConfig( KConfig* config );
+
+ KABC::Lock *lock();
+
+ /** deletes an event from this calendar. */
+ bool deleteEvent(Event *);
+
+ /**
+ Remove a todo from the todolist.
+ */
+ bool deleteTodo( Todo * );
+
+ /**
+ Remove a journal from the journallist.
+ */
+ bool deleteJournal( Journal * );
+
+ void dump() const;
+
+ protected slots:
+ void reload( const QString & );
+
+ protected:
+ virtual bool doOpen();
+ virtual bool doLoad();
+ virtual bool doSave();
+ bool doSave( Incidence * );
+ virtual bool doFileLoad( CalendarLocal &, const QString &fileName );
+
+ private:
+ void init();
+ bool deleteIncidenceFile(Incidence *incidence);
+
+ KURL mURL;
+// ICalFormat mFormat;
+
+ KDirWatch mDirWatch;
+
+ KABC::Lock *mLock;
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/resourcelocaldir_plugin.cpp b/libkcal/resourcelocaldir_plugin.cpp
new file mode 100644
index 00000000..1e087757
--- /dev/null
+++ b/libkcal/resourcelocaldir_plugin.cpp
@@ -0,0 +1,33 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "resourcelocaldirconfig.h"
+#include "resourcelocaldir.h"
+
+using namespace KCal;
+
+extern "C"
+{
+ void *init_kcal_localdir()
+ {
+ return new KRES::PluginFactory<ResourceLocalDir,ResourceLocalDirConfig>();
+ }
+}
diff --git a/libkcal/resourcelocaldirconfig.cpp b/libkcal/resourcelocaldirconfig.cpp
new file mode 100644
index 00000000..5d044454
--- /dev/null
+++ b/libkcal/resourcelocaldirconfig.cpp
@@ -0,0 +1,72 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <typeinfo>
+
+#include <qlabel.h>
+#include <qlayout.h>
+
+#include <klocale.h>
+#include <kdebug.h>
+#include <kstandarddirs.h>
+
+#include "vcaldrag.h"
+#include "vcalformat.h"
+#include "icalformat.h"
+
+#include "resourcelocaldir.h"
+
+#include "resourcelocaldirconfig.h"
+
+using namespace KCal;
+
+ResourceLocalDirConfig::ResourceLocalDirConfig( QWidget* parent, const char* name )
+ : KRES::ConfigWidget( parent, name )
+{
+ resize( 245, 115 );
+ QGridLayout *mainLayout = new QGridLayout( this, 2, 2 );
+
+ QLabel *label = new QLabel( i18n( "Location:" ), this );
+ mURL = new KURLRequester( this );
+ mURL->setMode( KFile::Directory | KFile::LocalOnly );
+ mainLayout->addWidget( label, 1, 0 );
+ mainLayout->addWidget( mURL, 1, 1 );
+}
+
+void ResourceLocalDirConfig::loadSettings( KRES::Resource *resource )
+{
+ ResourceLocalDir* res = static_cast<ResourceLocalDir*>( resource );
+ if ( res ) {
+ mURL->setURL( res->mURL.prettyURL() );
+ } else
+ kdDebug(5700) << "ERROR: ResourceLocalDirConfig::loadSettings(): no ResourceLocalDir, cast failed" << endl;
+}
+
+void ResourceLocalDirConfig::saveSettings( KRES::Resource *resource )
+{
+ ResourceLocalDir* res = static_cast<ResourceLocalDir*>( resource );
+ if (res) {
+ res->mURL = mURL->url();
+ } else
+ kdDebug(5700) << "ERROR: ResourceLocalDirConfig::saveSettings(): no ResourceLocalDir, cast failed" << endl;
+}
+
+#include "resourcelocaldirconfig.moc"
diff --git a/libkcal/resourcelocaldirconfig.h b/libkcal/resourcelocaldirconfig.h
new file mode 100644
index 00000000..3c88a9d9
--- /dev/null
+++ b/libkcal/resourcelocaldirconfig.h
@@ -0,0 +1,66 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2002 Tobias Koenig <tokoe@kde.org>
+ Copyright (c) 2002 Jan-Pascal van Best <janpascal@vanbest.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef KCAL_RESOURCELOCALDIRCONFIG_H
+#define KCAL_RESOURCELOCALDIRCONFIG_H
+
+#include <qradiobutton.h>
+#include <qbuttongroup.h>
+#include <kurlrequester.h>
+
+#include <kresources/resource.h>
+#include <kresources/configwidget.h>
+
+#include "libkcal_export.h"
+
+namespace KCal {
+
+/**
+ \internal
+
+ Configuration widget for local dir resource.
+
+ @see ResourceLocalDir
+*/
+class LIBKCAL_EXPORT ResourceLocalDirConfig : public KRES::ConfigWidget
+{
+ Q_OBJECT
+ public:
+ ResourceLocalDirConfig( QWidget *parent = 0, const char *name = 0 );
+
+ public slots:
+ virtual void loadSettings( KRES::Resource *resource);
+ virtual void saveSettings( KRES::Resource *resource );
+
+ private:
+ KURLRequester *mURL;
+ QButtonGroup *formatGroup;
+ QRadioButton *icalButton;
+ QRadioButton *vcalButton;
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/scheduler.cpp b/libkcal/scheduler.cpp
new file mode 100644
index 00000000..5a29ad8c
--- /dev/null
+++ b/libkcal/scheduler.cpp
@@ -0,0 +1,444 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001,2004 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <klocale.h>
+#include <kdebug.h>
+#include <kmessagebox.h>
+#include <kstandarddirs.h>
+
+#include "event.h"
+#include "todo.h"
+#include "freebusy.h"
+#include "icalformat.h"
+#include "calendar.h"
+#include "freebusycache.h"
+
+#include "scheduler.h"
+
+using namespace KCal;
+
+ScheduleMessage::ScheduleMessage(IncidenceBase *incidence,int method,ScheduleMessage::Status status)
+{
+ mIncidence = incidence;
+ mMethod = method;
+ mStatus = status;
+}
+
+QString ScheduleMessage::statusName(ScheduleMessage::Status status)
+{
+ switch (status) {
+ case PublishUpdate:
+ return i18n("Updated Publish");
+ case PublishNew:
+ return i18n("Publish");
+ case Obsolete:
+ return i18n("Obsolete");
+ case RequestNew:
+ return i18n("New Request");
+ case RequestUpdate:
+ return i18n("Updated Request");
+ default:
+ return i18n("Unknown Status: %1").arg(QString::number(status));
+ }
+}
+
+struct Scheduler::Private
+{
+ Private() : mFreeBusyCache( 0 ) {}
+
+ FreeBusyCache *mFreeBusyCache;
+};
+
+Scheduler::Scheduler(Calendar *calendar)
+{
+ mCalendar = calendar;
+ mFormat = new ICalFormat();
+ mFormat->setTimeZone( calendar->timeZoneId(), !calendar->isLocalTime() );
+
+ d = new Private;
+}
+
+Scheduler::~Scheduler()
+{
+ delete d;
+
+ delete mFormat;
+}
+
+void Scheduler::setFreeBusyCache( FreeBusyCache *c )
+{
+ d->mFreeBusyCache = c;
+}
+
+FreeBusyCache *Scheduler::freeBusyCache() const
+{
+ return d->mFreeBusyCache;
+}
+
+bool Scheduler::acceptTransaction(IncidenceBase *incidence,Method method,ScheduleMessage::Status status)
+{
+ kdDebug(5800) << "Scheduler::acceptTransaction, method="
+ << methodName( method ) << endl;
+
+ switch (method) {
+ case Publish:
+ return acceptPublish(incidence, status, method);
+ case Request:
+ return acceptRequest(incidence, status);
+ case Add:
+ return acceptAdd(incidence, status);
+ case Cancel:
+ return acceptCancel(incidence, status);
+ case Declinecounter:
+ return acceptDeclineCounter(incidence, status);
+ case Reply:
+ return acceptReply(incidence, status, method);
+ case Refresh:
+ return acceptRefresh(incidence, status);
+ case Counter:
+ return acceptCounter(incidence, status);
+ default:
+ break;
+ }
+ deleteTransaction(incidence);
+ return false;
+}
+
+QString Scheduler::methodName(Method method)
+{
+ switch (method) {
+ case Publish:
+ return QString::fromLatin1("Publish");
+ case Request:
+ return QString::fromLatin1("Request");
+ case Refresh:
+ return QString::fromLatin1("Refresh");
+ case Cancel:
+ return QString::fromLatin1("Cancel");
+ case Add:
+ return QString::fromLatin1("Add");
+ case Reply:
+ return QString::fromLatin1("Reply");
+ case Counter:
+ return QString::fromLatin1("Counter");
+ case Declinecounter:
+ return QString::fromLatin1("Decline Counter");
+ default:
+ return QString::fromLatin1("Unknown");
+ }
+}
+
+QString Scheduler::translatedMethodName(Method method)
+{
+ switch (method) {
+ case Publish:
+ return i18n("Publish");
+ case Request:
+ return i18n("Request");
+ case Refresh:
+ return i18n("Refresh");
+ case Cancel:
+ return i18n("Cancel");
+ case Add:
+ return i18n("Add");
+ case Reply:
+ return i18n("Reply");
+ case Counter:
+ return i18n("counter proposal","Counter");
+ case Declinecounter:
+ return i18n("decline counter proposal","Decline Counter");
+ default:
+ return i18n("Unknown");
+ }
+}
+
+bool Scheduler::deleteTransaction(IncidenceBase *)
+{
+ return true;
+}
+
+bool Scheduler::acceptPublish( IncidenceBase *newIncBase,
+ ScheduleMessage::Status status, Method method )
+{
+ if( newIncBase->type() == "FreeBusy" ) {
+ return acceptFreeBusy( newIncBase, method );
+ }
+
+ bool res = false;
+ kdDebug(5800) << "Scheduler::acceptPublish, status="
+ << ScheduleMessage::statusName( status ) << endl;
+ Incidence *newInc = static_cast<Incidence *>( newIncBase );
+ Incidence *calInc = mCalendar->incidence( newIncBase->uid() );
+ switch ( status ) {
+ case ScheduleMessage::Unknown:
+ case ScheduleMessage::PublishNew:
+ case ScheduleMessage::PublishUpdate:
+ res = true;
+ if ( calInc ) {
+ if ( (newInc->revision() > calInc->revision()) ||
+ (newInc->revision() == calInc->revision() &&
+ newInc->lastModified() > calInc->lastModified() ) ) {
+ mCalendar->deleteIncidence( calInc );
+ } else
+ res = false;
+ }
+ if ( res )
+ mCalendar->addIncidence( newInc );
+ break;
+ case ScheduleMessage::Obsolete:
+ res = true;
+ break;
+ default:
+ break;
+ }
+ deleteTransaction( newIncBase );
+ return res;
+}
+
+bool Scheduler::acceptRequest(IncidenceBase *newIncBase, ScheduleMessage::Status /* status */)
+{
+ if (newIncBase->type()=="FreeBusy") {
+ // reply to this request is handled in korganizer's incomingdialog
+ return true;
+ }
+ Incidence *newInc = dynamic_cast<Incidence *>( newIncBase );
+ if ( newInc ) {
+ bool res = true;
+ Incidence *exInc = mCalendar->incidenceFromSchedulingID( newIncBase->uid() );
+ if ( exInc ) {
+ res = false;
+ if ( (newInc->revision() > exInc->revision()) ||
+ (newInc->revision() == exInc->revision() &&
+ newInc->lastModified()>exInc->lastModified()) ) {
+ mCalendar->deleteIncidence( exInc );
+ res = true;
+ }
+ }
+ if ( res ) {
+ // Move the uid to be the schedulingID and make a unique UID
+ newInc->setSchedulingID( newInc->uid() );
+ newInc->setUid( CalFormat::createUniqueId() );
+
+ mCalendar->addIncidence(newInc);
+ }
+ deleteTransaction( newIncBase );
+ return res;
+ }
+ return false;
+}
+
+bool Scheduler::acceptAdd(IncidenceBase *incidence,ScheduleMessage::Status /* status */)
+{
+ deleteTransaction(incidence);
+ return false;
+}
+
+bool Scheduler::acceptCancel(IncidenceBase *incidence,ScheduleMessage::Status /* status */)
+{
+ bool ret = false;
+ const IncidenceBase *toDelete = mCalendar->incidenceFromSchedulingID( incidence->uid() );
+ if ( toDelete ) {
+ Event *even = mCalendar->event(toDelete->uid());
+ if (even) {
+ mCalendar->deleteEvent(even);
+ ret = true;
+ } else {
+ Todo *todo = mCalendar->todo(toDelete->uid());
+ if (todo) {
+ mCalendar->deleteTodo(todo);
+ ret = true;
+ }
+ }
+ }
+ deleteTransaction(incidence);
+ return ret;
+}
+
+bool Scheduler::acceptDeclineCounter(IncidenceBase *incidence,ScheduleMessage::Status /* status */)
+{
+ deleteTransaction(incidence);
+ return false;
+}
+
+//bool Scheduler::acceptFreeBusy(Incidence *incidence,ScheduleMessage::Status status)
+//{
+// deleteTransaction(incidence);
+// return false;
+//}
+
+bool Scheduler::acceptReply(IncidenceBase *incidence,ScheduleMessage::Status /* status */, Method method)
+{
+ if(incidence->type()=="FreeBusy") {
+ return acceptFreeBusy(incidence, method);
+ }
+ bool ret = false;
+ Event *ev = mCalendar->event(incidence->uid());
+ Todo *to = mCalendar->todo(incidence->uid());
+
+ // try harder to find the correct incidence
+ if ( !ev && !to ) {
+ const Incidence::List list = mCalendar->incidences();
+ for ( Incidence::List::ConstIterator it = list.begin(), end = list.end(); it != end; ++it ) {
+ if ( (*it)->schedulingID() == incidence->uid() ) {
+ ev = dynamic_cast<Event*>( *it );
+ to = dynamic_cast<Todo*>( *it );
+ break;
+ }
+ }
+ }
+
+ if (ev || to) {
+ //get matching attendee in calendar
+ kdDebug(5800) << "Scheduler::acceptTransaction match found!" << endl;
+ Attendee::List attendeesIn = incidence->attendees();
+ Attendee::List attendeesEv;
+ Attendee::List attendeesNew;
+ if (ev) attendeesEv = ev->attendees();
+ if (to) attendeesEv = to->attendees();
+ Attendee::List::ConstIterator inIt;
+ Attendee::List::ConstIterator evIt;
+ for ( inIt = attendeesIn.begin(); inIt != attendeesIn.end(); ++inIt ) {
+ Attendee *attIn = *inIt;
+ bool found = false;
+ for ( evIt = attendeesEv.begin(); evIt != attendeesEv.end(); ++evIt ) {
+ Attendee *attEv = *evIt;
+ if (attIn->email().lower()==attEv->email().lower()) {
+ //update attendee-info
+ kdDebug(5800) << "Scheduler::acceptTransaction update attendee" << endl;
+ attEv->setStatus(attIn->status());
+ attEv->setDelegate(attIn->delegate());
+ attEv->setDelegator(attIn->delegator());
+ ret = true;
+ found = true;
+ }
+ }
+ if ( !found && attIn->status() != Attendee::Declined )
+ attendeesNew.append( attIn );
+ }
+
+ bool attendeeAdded = false;
+ for ( Attendee::List::ConstIterator it = attendeesNew.constBegin(); it != attendeesNew.constEnd(); ++it ) {
+ Attendee* attNew = *it;
+ QString msg = i18n("%1 wants to attend %2 but was not invited.").arg( attNew->fullName() )
+ .arg( ev ? ev->summary() : to->summary() );
+ if ( !attNew->delegator().isEmpty() )
+ msg = i18n("%1 wants to attend %2 on behalf of %3.").arg( attNew->fullName() )
+ .arg( ev ? ev->summary() : to->summary() )
+ .arg( attNew->delegator() );
+ if ( KMessageBox::questionYesNo( 0, msg, i18n("Uninvited attendee"),
+ KGuiItem(i18n("Accept Attendance")), KGuiItem(i18n("Reject Attendance")) )
+ != KMessageBox::Yes )
+ {
+ KCal::Incidence *cancel = dynamic_cast<Incidence*>( incidence );
+ if ( cancel )
+ cancel->addComment( i18n( "The organizer rejected your attendance at this meeting." ) );
+ performTransaction( cancel ? cancel : incidence, Scheduler::Cancel, attNew->fullName() );
+ delete cancel;
+ continue;
+ }
+
+ Attendee *a = new Attendee( attNew->name(), attNew->email(), attNew->RSVP(),
+ attNew->status(), attNew->role(), attNew->uid() );
+ a->setDelegate( attNew->delegate() );
+ a->setDelegator( attNew->delegator() );
+ if ( ev )
+ ev->addAttendee( a );
+ else if ( to )
+ to->addAttendee( a );
+ ret = true;
+ attendeeAdded = true;
+ }
+
+ // send update about new participants
+ if ( attendeeAdded ) {
+ if ( ev ) {
+ ev->setRevision( ev->revision() + 1 );
+ performTransaction( ev, Scheduler::Request );
+ }
+ if ( to ) {
+ to->setRevision( ev->revision() + 1 );
+ performTransaction( to, Scheduler::Request );
+ }
+ }
+
+ if ( ret ) {
+ // We set at least one of the attendees, so the incidence changed
+ // Note: This should not result in a sequence number bump
+ if ( ev )
+ ev->updated();
+ else if ( to )
+ to->updated();
+ }
+ if ( to ) {
+ // for VTODO a REPLY can be used to update the completion status of
+ // a task. see RFC2446 3.4.3
+ Todo *update = dynamic_cast<Todo*> ( incidence );
+ Q_ASSERT( update );
+ if ( update && ( to->percentComplete() != update->percentComplete() ) ) {
+ to->setPercentComplete( update->percentComplete() );
+ to->updated();
+ }
+ }
+ } else
+ kdError(5800) << "No incidence for scheduling\n";
+ if (ret) deleteTransaction(incidence);
+ return ret;
+}
+
+bool Scheduler::acceptRefresh(IncidenceBase *incidence,ScheduleMessage::Status /* status */)
+{
+ // handled in korganizer's IncomingDialog
+ deleteTransaction(incidence);
+ return false;
+}
+
+bool Scheduler::acceptCounter(IncidenceBase *incidence,ScheduleMessage::Status /* status */)
+{
+ deleteTransaction(incidence);
+ return false;
+}
+
+bool Scheduler::acceptFreeBusy(IncidenceBase *incidence, Method method)
+{
+ if ( !d->mFreeBusyCache ) {
+ kdError() << "KCal::Scheduler: no FreeBusyCache." << endl;
+ return false;
+ }
+
+ FreeBusy *freebusy = static_cast<FreeBusy *>(incidence);
+
+ kdDebug(5800) << "acceptFreeBusy:: freeBusyDirName: " << freeBusyDir() << endl;
+
+ Person from;
+ if(method == Scheduler::Publish) {
+ from = freebusy->organizer();
+ }
+ if((method == Scheduler::Reply) && (freebusy->attendeeCount() == 1)) {
+ Attendee *attendee = freebusy->attendees().first();
+ from = attendee->email();
+ }
+
+ if ( !d->mFreeBusyCache->saveFreeBusy( freebusy, from ) ) return false;
+
+ deleteTransaction(incidence);
+ return true;
+}
diff --git a/libkcal/scheduler.h b/libkcal/scheduler.h
new file mode 100644
index 00000000..0aa4b366
--- /dev/null
+++ b/libkcal/scheduler.h
@@ -0,0 +1,193 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001-2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_SCHEDULER_H
+#define KCAL_SCHEDULER_H
+
+#include <qstring.h>
+#include <qptrlist.h>
+
+#include "libkcal_export.h"
+
+namespace KCal {
+
+class IncidenceBase;
+class Event;
+class Calendar;
+class ICalFormat;
+class FreeBusyCache;
+
+/**
+ This class provides an encapsulation of a scheduling message. It associates an
+ incidence with a method and status information. This class is used by the
+ Scheduler class.
+
+ @short A Scheduling message
+*/
+class ScheduleMessage
+{
+ public:
+ /**
+ Message status.
+ */
+ enum Status { PublishNew, PublishUpdate, Obsolete, RequestNew,
+ RequestUpdate, Unknown };
+
+ /**
+ Create a scheduling message with method as defined in Scheduler::Method
+ and a status.
+ */
+ ScheduleMessage( IncidenceBase *, int method, Status status );
+ ~ScheduleMessage() {};
+
+ /**
+ Return event associated with this message.
+ */
+ IncidenceBase *event() { return mIncidence; }
+ /**
+ Return iTIP method associated with this message.
+ */
+ int method() { return mMethod; }
+ /**
+ Return status of this message.
+ */
+ Status status() { return mStatus; }
+ /**
+ Return error message if there is any.
+ */
+ QString error() { return mError; }
+
+ /**
+ Return a human-readable name for an iTIP message status.
+ */
+ static QString statusName( Status status );
+
+ private:
+ IncidenceBase *mIncidence;
+ int mMethod;
+ Status mStatus;
+ QString mError;
+
+ class Private;
+ Private *d;
+};
+
+/**
+ This class provides an encapsulation of iTIP transactions. It is an abstract
+ base class for inheritance by implementations of the iTIP scheme like iMIP or
+ iRIP.
+*/
+class LIBKCAL_EXPORT Scheduler
+{
+ public:
+ /**
+ iTIP methods.
+ */
+ enum Method { Publish,Request,Refresh,Cancel,Add,Reply,Counter,
+ Declinecounter,NoMethod };
+
+ /**
+ Create scheduler for calendar specified as argument.
+ */
+ Scheduler( Calendar *calendar );
+ virtual ~Scheduler();
+
+ /**
+ iTIP publish action
+ */
+ virtual bool publish( IncidenceBase *incidence,
+ const QString &recipients ) = 0;
+ /**
+ Perform iTIP transaction on incidence. The method is specified as the
+ method argument and can be any valid iTIP method.
+ */
+ virtual bool performTransaction( IncidenceBase *incidence,
+ Method method ) = 0;
+ /**
+ Perform iTIP transaction on incidence to specified recipient(s). The
+ method is specified as the method argumanet and can be any valid iTIP
+ method.
+ */
+ virtual bool performTransaction( IncidenceBase *incidence, Method method,
+ const QString &recipients ) = 0;
+ /**
+ Retrieve incoming iTIP transactions.
+ */
+ virtual QPtrList<ScheduleMessage> retrieveTransactions() = 0;
+
+ /**
+ Accept transaction. The incidence argument specifies the iCal compoennt
+ on which the transaction acts. The status is the result of processing a
+ iTIP message with the current calendar and specifies the action to be
+ taken for this incidence.
+ */
+ bool acceptTransaction( IncidenceBase *, Method method,
+ ScheduleMessage::Status status );
+
+ /**
+ Return a machine-readable name for a iTIP method.
+ */
+ static QString methodName( Method );
+ /**
+ Return a translated human-readable name for a iTIP method.
+ */
+ static QString translatedMethodName( Method );
+
+ virtual bool deleteTransaction( IncidenceBase *incidence );
+
+ /**
+ Returns the directory where the free-busy information is stored.
+ */
+ virtual QString freeBusyDir() = 0;
+
+ /**
+ Set free/busy cache used to store free/busy information.
+ */
+ void setFreeBusyCache( FreeBusyCache * );
+ /**
+ Return free/busy cache.
+ */
+ FreeBusyCache *freeBusyCache() const;
+
+ protected:
+ bool acceptPublish( IncidenceBase *, ScheduleMessage::Status status,
+ Method method );
+ bool acceptRequest( IncidenceBase *, ScheduleMessage::Status status );
+ bool acceptAdd( IncidenceBase *, ScheduleMessage::Status status );
+ bool acceptCancel( IncidenceBase *, ScheduleMessage::Status status );
+ bool acceptDeclineCounter( IncidenceBase *,
+ ScheduleMessage::Status status );
+ bool acceptReply( IncidenceBase *, ScheduleMessage::Status status,
+ Method method );
+ bool acceptRefresh( IncidenceBase *, ScheduleMessage::Status status );
+ bool acceptCounter( IncidenceBase *, ScheduleMessage::Status status );
+ bool acceptFreeBusy( IncidenceBase *, Method method );
+
+ Calendar *mCalendar;
+ ICalFormat *mFormat;
+
+ private:
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/tests/Makefile.am b/libkcal/tests/Makefile.am
new file mode 100644
index 00000000..6e7096a1
--- /dev/null
+++ b/libkcal/tests/Makefile.am
@@ -0,0 +1,102 @@
+INCLUDES = -I$(top_srcdir)/libkcal \
+ -I$(srcdir)/../libical/src/libical \
+ -I$(srcdir)/../libical/src/libicalss -I../libical/src/libical \
+ -I../libical/src/libicalss -I$(srcdir)/../versit \
+ -I$(top_srcdir) $(all_includes)
+
+AM_CPPFLAGS = -DKDETOPSRCDIR=\"$(top_srcdir)\"
+
+check_PROGRAMS = testtostring \
+ testincidence \
+ testcalendar \
+ fbrecurring \
+ readandwrite \
+ testresource \
+ testfields \
+ testrecurrence \
+ testrecurprevious \
+ testrecurson \
+ testrecurrencetype \
+ testvcalexport \
+ testfb
+
+
+METASOURCES = AUTO
+
+testincidence_SOURCES = testincidence.cpp
+testincidence_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+testincidence_LDADD = ../libkcal.la
+
+testcalendar_SOURCES = testcalendar.cpp
+testcalendar_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+testcalendar_LDADD = ../libkcal.la
+
+testtostring_SOURCES = testtostring.cpp
+testtostring_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+testtostring_LDADD = ../libkcal.la
+
+fbrecurring_SOURCES = fbrecurring.cpp
+fbrecurring_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+fbrecurring_LDADD = ../libkcal.la
+
+readandwrite_SOURCES = readandwrite.cpp
+readandwrite_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+readandwrite_LDADD = ../libkcal.la
+
+testresource_SOURCES = testresource.cpp
+testresource_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+testresource_LDADD = ../libkcal.la
+
+testrecurrence_SOURCES = testrecurrence.cpp
+testrecurrence_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+testrecurrence_LDADD = ../libkcal.la
+
+testrecurprevious_SOURCES = testrecurprevious.cpp
+testrecurprevious_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+testrecurprevious_LDADD = ../libkcal.la
+
+testrecurson_SOURCES = testrecurson.cpp
+testrecurson_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+testrecurson_LDADD = ../libkcal.la
+
+testrecurrencetype_SOURCES = testrecurrencetype.cpp
+testrecurrencetype_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+testrecurrencetype_LDADD = ../libkcal.la
+
+testvcalexport_SOURCES = testvcalexport.cpp
+testvcalexport_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+testvcalexport_LDADD = ../libkcal.la
+
+testfields_SOURCES = testfields.cpp
+testfields_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+testfields_LDADD = ../libkcal.la
+testfields_CXXFLAGS= -DINPUT='"$(srcdir)/data/test_pilot.ics"'
+
+testfb_SOURCES = testfb.cpp
+testfb_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+testfb_LDADD = ../libkcal.la
+
+TESTFILES = test1.ics test2.ics test3.ics test4.ics test5.ics test_Mozilla.ics
+
+check-local: readandwrite testrecurrence testrecurprevious testrecurson testvcalexport
+ rm -f FAILED;
+ for i in `find $(srcdir)/data/RecurrenceRule/ -name "*.ics"`; do \
+ perl $(srcdir)/runtestcase.pl testrecurrence "next" $$i; \
+ done;
+ for i in `find $(srcdir)/data/RecurrenceRule/ -name "*.ics"`; do \
+ perl $(srcdir)/runtestcase.pl testrecurprevious "prev" $$i; \
+ done;
+ for i in `find $(srcdir)/data/RecurrenceRule/ -name "*.ics"`; do \
+ perl $(srcdir)/runtestcase.pl testrecurson "recurson" $$i; \
+ done;
+# for i in `find $(srcdir)/data/Compat/ -name "*.ics"`; do \
+# perl $(srcdir)/runtestcase.pl readandwrite "ical" $$i; \
+# done;
+ for i in `find $(srcdir)/data/vCalendar/ -name "*.ics"`; do \
+ perl $(srcdir)/runtestcase.pl testvcalexport "vcal" $$i; \
+ done;
+ for i in `find $(srcdir)/data/vCalendar/ -name "*.vcs"`; do \
+ perl $(srcdir)/runtestcase.pl readandwrite "ical" $$i; \
+ done;
+ [ ! -e FAILED ]
+
diff --git a/libkcal/tests/createref.sh b/libkcal/tests/createref.sh
new file mode 100755
index 00000000..a7f8911c
--- /dev/null
+++ b/libkcal/tests/createref.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+file=$1
+sort -r $1.next.ref | grep -v "^3" | grep -v "^2[1-9].*" | grep -v "^20[2-9].*" | grep -v "^201[1-9].*"> $1.prev.ref
+sed 's/T.*$//' $1.next.ref | uniq | grep -v "^3" | grep -v "^2[1-9].*" | grep -v "^20[2-9].*" | grep -v "^201[1-9].*" > $1.recurson.ref
+
+diff $file.prev.ref $file.prev.out > /dev/null 2>&1 && rm $file.prev.out;
+diff $file.next.ref $file.next.out > /dev/null 2>&1 && rm $file.next.out;
+diff $file.recurson.ref $file.recurson.out > /dev/null 2>&1 && rm $file.recurson.out;
+
+
+# cat $i |grep -v "^2[1-9].*" | grep -v "^20[2-9].*" | grep -v "^201[1-9].*" > $i.new; \ No newline at end of file
diff --git a/libkcal/tests/createtestcases.pl b/libkcal/tests/createtestcases.pl
new file mode 100755
index 00000000..35e624e6
--- /dev/null
+++ b/libkcal/tests/createtestcases.pl
@@ -0,0 +1,82 @@
+#!/usr/bin/perl
+
+# Written 2005 Reinhold Kainhofer <reinhold@kainhofer.com>
+# This file is put into the public domain, I claim no copyright on that code
+#
+# This little (really dumb) script can be used to split a large calendar file
+# up into several small files each containing one event/journal/todo/freebusy.
+# All lines before the first VEVENT/VTODO/VJOURNAL/VFREEBUSY will be copied to
+# every file, so timezones should be fine.
+#
+# Usage:
+# createtestcases.pl InputFile.ics OutputBaseFileName [ext]
+#
+# InputFile.ics .. The large calendar file containing multiple incidences
+# OutputBaseFileName .. The base name of the output files. They will be
+# numbered sequentially, i.e. OutputBaseFileName1.ext,
+# OutputBaseFileName2.ext, etc.
+# [ext].. optional file name extension for the output files. If none is given,
+# ics is used.
+#
+# Disclaimer: This script exists merely for development purposes to help us
+# KDE developer generate atomic test cases for libkcal's test suite.
+
+
+use Cwd;
+
+my $infile=shift @ARGV;
+my $filebase=shift @ARGV;
+my $ext=shift @ARGV;
+if ( !$ext ) {
+ $ext = "ics";
+}
+my $filenr=0;
+my $filename="$filebase$filenr.$ext";
+
+print "Infile: $infile\n";
+print "filebase: $filebase\n";
+print "filenr: $filenr\n";
+print "filename: $filename\n";
+
+my $pre = 1;
+my $inevent = 0;
+my $pretext = "";
+my $opened = 0;
+
+
+open(INFILE, $infile);
+while (<INFILE>) {
+ my $line = $_;
+
+ if ( !$inevent && ($line =~ m/BEGIN:V(EVENT|TODO|FREEBUSY|JOURNAL)/) ) {
+ if ( !$opened ) {
+ $opened = 1;
+ $filenr=$filenr+1;
+ $filename="$filebase$filenr.$ext";
+ open fh, "> $filename";
+ if ( $pretext ) {
+ print fh $pretext;
+ } else {
+ # TODO: close file, open new file
+ print fh "BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN\n\n";
+ }
+
+ }
+ $pre = 0;
+ $inevent = 1;
+ print fh $line;
+ } elsif ( $inevent && ($line =~ m/END:V(EVENT|TODO|FREEBUSY|JOURNAL)/) ) {
+ $inevent = 0;
+ print fh $line;
+ print fh "END:VCALENDAR\n";
+ close fh;
+ $opened = 0;
+ } elsif ( $inevent ) {
+ print fh $line;
+ } elsif ( $pre ) {
+ $pretext="$pretext$line";
+print "PRE: $pretext";
+ }
+
+}
+
diff --git a/libkcal/tests/data/Compat/Evolution_2.8.2_timezone_test.ics b/libkcal/tests/data/Compat/Evolution_2.8.2_timezone_test.ics
new file mode 100755
index 00000000..ff355bfd
--- /dev/null
+++ b/libkcal/tests/data/Compat/Evolution_2.8.2_timezone_test.ics
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Ximian//NONSGML Evolution Calendar//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/London
+BEGIN:VEVENT
+UID:20070127T211005Z-13428-100-1-0@emsig
+DTSTAMP:20070127T211005Z
+DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/Europe/London:
+ 20070127T120000
+DTEND;TZID=/softwarestudio.org/Olson_20011030_5/Europe/London:
+ 20070127T123000
+TRANSP:OPAQUE
+SEQUENCE:2
+SUMMARY:Nominal is 1200 to 1230 _GMT_ on 27 Jan 2007
+CLASS:PUBLIC
+CREATED:20070127T211013
+LAST-MODIFIED:20070127T211124
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/Compat/Evolution_2.8.2_timezone_test.ics.ical.ref b/libkcal/tests/data/Compat/Evolution_2.8.2_timezone_test.ics.ical.ref
new file mode 100644
index 00000000..b1d0b1d2
--- /dev/null
+++ b/libkcal/tests/data/Compat/Evolution_2.8.2_timezone_test.ics.ical.ref
@@ -0,0 +1,18 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/London
+BEGIN:VEVENT
+DTSTAMP:20070127T211005Z
+CREATED:20070127T211013
+UID:20070127T211005Z-13428-100-1-0@emsig
+SEQUENCE:2
+LAST-MODIFIED:20070127T211124
+SUMMARY:Nominal is 1200 to 1230 _GMT_ on 27 Jan 2007
+DTSTART:20070127T120000Z
+DTEND:20070127T123000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/Compat/KOrganizer_3.1.ics b/libkcal/tests/data/Compat/KOrganizer_3.1.ics
new file mode 100644
index 00000000..2c764d95
--- /dev/null
+++ b/libkcal/tests/data/Compat/KOrganizer_3.1.ics
@@ -0,0 +1,465 @@
+BEGIN:VCALENDAR
+PRODID
+ :-//K Desktop Environment//NONSGML KOrganizer 3.1//EN
+VERSION
+ :2.0
+BEGIN:VEVENT
+CREATED
+ :20031213T212250Z
+UID
+ :KOrganizer-1744115041.851
+SEQUENCE
+ :2
+LAST-MODIFIED
+ :20031213T212259Z
+DTSTAMP
+ :20031213T213432Z
+ORGANIZER
+ :MAILTO:nobody@nowhere
+DESCRIPTION
+ :Two day all-day event.\n
+SUMMARY
+ :All Day 2
+CLASS
+ :PUBLIC
+PRIORITY
+ :3
+X-PILOTID
+ :0
+X-PILOTSTAT
+ :1
+DTSTART
+ ;VALUE=DATE
+ :20031209
+DTEND
+ ;VALUE=DATE
+ :20031211
+END:VEVENT
+BEGIN:VEVENT
+CREATED
+ :20031213T212311Z
+UID
+ :KOrganizer-1927781860.81
+SEQUENCE
+ :2
+LAST-MODIFIED
+ :20031213T212315Z
+DTSTAMP
+ :20031213T213432Z
+ORGANIZER
+ :MAILTO:nobody@nowhere
+DESCRIPTION
+ :Three day all-day event.\n
+SUMMARY
+ :All day 3
+CLASS
+ :PUBLIC
+PRIORITY
+ :3
+X-PILOTID
+ :0
+X-PILOTSTAT
+ :1
+DTSTART
+ ;VALUE=DATE
+ :20031210
+DTEND
+ ;VALUE=DATE
+ :20031213
+END:VEVENT
+BEGIN:VEVENT
+CREATED
+ :20031213T212528Z
+UID
+ :KOrganizer-2056335629.565
+SEQUENCE
+ :1
+LAST-MODIFIED
+ :20031213T212636Z
+DTSTAMP
+ :20031213T213432Z
+ORGANIZER
+ :MAILTO:nobody@nowhere
+ATTENDEE
+ ;CN=Another Name
+ ;RSVP=TRUE
+ ;PARTSTAT=ACCEPTED
+ ;ROLE=NON-PARTICIPANT
+ :mailto:two@yyy.yy
+ATTENDEE
+ ;CN=One Name
+ ;RSVP=FALSE
+ ;PARTSTAT=NEEDS-ACTION
+ ;ROLE=REQ-PARTICIPANT
+ :mailto:one@xxx.xx
+DESCRIPTION
+ :Reminder 13 minutes\nShow time as free\nCategory Special Occasion\nAccess
+ Private\nTwo attendees.\nAlert.wav sound alarm\n
+SUMMARY
+ :Full Information Event
+LOCATION
+ :This is a location
+CLASS
+ :PRIVATE
+PRIORITY
+ :3
+CATEGORIES
+ :Special Occasion
+X-PILOTID
+ :0
+X-PILOTSTAT
+ :1
+DTSTART
+ :20031211T133000Z
+DTEND
+ :20031211T154500Z
+BEGIN:VALARM
+ATTACH
+ :/usr/share/apps/korganizer/sounds/alert.wav
+ACTION
+ :AUDIO
+TRIGGER
+ ;VALUE=DURATION
+ :-PT13M
+END:VALARM
+END:VEVENT
+BEGIN:VEVENT
+CREATED
+ :20031213T212219Z
+UID
+ :KOrganizer-182017314.321
+SEQUENCE
+ :2
+LAST-MODIFIED
+ :20031213T212229Z
+DTSTAMP
+ :20031213T213432Z
+ORGANIZER
+ :MAILTO:nobody@nowhere
+DESCRIPTION
+ :One day all-day event.\nCategories Birthday\, Personal\n
+SUMMARY
+ :All Day
+CLASS
+ :PUBLIC
+PRIORITY
+ :3
+CATEGORIES
+ :Birthday
+CATEGORIES
+ :Personal
+X-PILOTID
+ :0
+X-PILOTSTAT
+ :1
+DTSTART
+ ;VALUE=DATE
+ :20031212
+DTEND
+ ;VALUE=DATE
+ :20031213
+END:VEVENT
+BEGIN:VEVENT
+CREATED
+ :20031213T213054Z
+UID
+ :KOrganizer-1149443407.784
+SEQUENCE
+ :1
+LAST-MODIFIED
+ :20031213T213109Z
+DTSTAMP
+ :20031213T213432Z
+ORGANIZER
+ :MAILTO:nobody@nowhere
+DESCRIPTION
+ :12.12. 17:15 to 13.12. 19:15\n1 hour alarm
+SUMMARY
+ :Multi-Day Event with Start/End Time
+CLASS
+ :PUBLIC
+PRIORITY
+ :3
+X-PILOTID
+ :0
+X-PILOTSTAT
+ :1
+DTSTART
+ :20031212T171500Z
+DTEND
+ :20031213T191500Z
+BEGIN:VALARM
+DESCRIPTION
+ :
+ACTION
+ :DISPLAY
+TRIGGER
+ ;VALUE=DURATION
+ :-PT1H
+END:VALARM
+END:VEVENT
+BEGIN:VEVENT
+CREATED
+ :20031213T162226Z
+UID
+ :KOrganizer-406380218.717
+SEQUENCE
+ :1
+LAST-MODIFIED
+ :20031213T212040Z
+DTSTAMP
+ :20031213T213432Z
+ORGANIZER
+ :MAILTO:nobody@nowhere
+DESCRIPTION
+ :10:00 - 13:30 (UTC)\n
+SUMMARY
+ :An Event
+CLASS
+ :PUBLIC
+PRIORITY
+ :3
+X-PILOTID
+ :0
+X-PILOTSTAT
+ :1
+DTSTART
+ :20031213T100000Z
+DTEND
+ :20031213T133000Z
+END:VEVENT
+BEGIN:VEVENT
+CREATED
+ :20031213T212117Z
+UID
+ :KOrganizer-856020879.491
+SEQUENCE
+ :0
+LAST-MODIFIED
+ :20031213T212117Z
+DTSTAMP
+ :20031213T213432Z
+ORGANIZER
+ :MAILTO:nobody@nowhere
+DESCRIPTION
+ :9:30 - 11:15 (UTC)\nRecurring twice
+SUMMARY
+ :Another Event
+CLASS
+ :PUBLIC
+PRIORITY
+ :3
+X-PILOTID
+ :0
+X-PILOTSTAT
+ :1
+RRULE
+ :FREQ=DAILY;COUNT=2;INTERVAL=1
+DTSTART
+ :20031209T093000Z
+DTEND
+ :20031209T111500Z
+END:VEVENT
+BEGIN:VEVENT
+CREATED
+ :20031213T212707Z
+UID
+ :KOrganizer-1025455571.504
+SEQUENCE
+ :1
+LAST-MODIFIED
+ :20031213T212727Z
+DTSTAMP
+ :20031213T213432Z
+ORGANIZER
+ :MAILTO:nobody@nowhere
+DESCRIPTION
+ :Recurring weekly three times on wednesday
+SUMMARY
+ :Recurring weekly
+CLASS
+ :PUBLIC
+PRIORITY
+ :3
+X-PILOTID
+ :0
+X-PILOTSTAT
+ :1
+RRULE
+ :FREQ=WEEKLY;COUNT=3;INTERVAL=1;BYDAY=WE
+DTSTART
+ :20031210T073000Z
+DTEND
+ :20031210T083000Z
+END:VEVENT
+BEGIN:VEVENT
+CREATED
+ :20031213T212804Z
+UID
+ :KOrganizer-465691683.1018
+SEQUENCE
+ :0
+LAST-MODIFIED
+ :20031213T212804Z
+DTSTAMP
+ :20031213T213432Z
+ORGANIZER
+ :MAILTO:nobody@nowhere
+SUMMARY
+ :Recurring monthly until 1.1.2005
+CLASS
+ :PUBLIC
+PRIORITY
+ :3
+X-PILOTID
+ :0
+X-PILOTSTAT
+ :1
+RRULE
+ :FREQ=MONTHLY;UNTIL=20050101T000000;INTERVAL=1;BYMONTHDAY=11
+DTSTART
+ :20031211T084500Z
+DTEND
+ :20031211T103000Z
+END:VEVENT
+BEGIN:VEVENT
+CREATED
+ :20031213T212933Z
+UID
+ :KOrganizer-475330509.201
+SEQUENCE
+ :0
+LAST-MODIFIED
+ :20031213T212933Z
+DTSTAMP
+ :20031213T213432Z
+ORGANIZER
+ :MAILTO:nobody@nowhere
+DESCRIPTION
+ :See Week 50 2003 for more events.\nRecur daily forever.\n
+SUMMARY
+ :NAVIGATION EVENT
+CLASS
+ :PUBLIC
+PRIORITY
+ :3
+X-PILOTID
+ :0
+X-PILOTSTAT
+ :1
+RRULE
+ :FREQ=DAILY;INTERVAL=1
+DTSTART
+ :20031208T120000Z
+DTEND
+ :20031208T130000Z
+END:VEVENT
+BEGIN:VEVENT
+CREATED
+ :20031213T213154Z
+UID
+ :KOrganizer-1952016504.437
+SEQUENCE
+ :1
+LAST-MODIFIED
+ :20031213T213204Z
+DTSTAMP
+ :20031213T213432Z
+ORGANIZER
+ :MAILTO:nobody@nowhere
+SUMMARY
+ :Birthday
+CLASS
+ :PUBLIC
+PRIORITY
+ :3
+CATEGORIES
+ :Birthday
+X-PILOTID
+ :0
+X-PILOTSTAT
+ :1
+RRULE
+ :FREQ=YEARLY;INTERVAL=1;BYMONTH=12
+DTSTART
+ ;VALUE=DATE
+ :20031208
+DTEND
+ ;VALUE=DATE
+ :20031209
+BEGIN:VALARM
+DESCRIPTION
+ :
+ACTION
+ :DISPLAY
+TRIGGER
+ ;VALUE=DURATION
+ :-P1D
+END:VALARM
+END:VEVENT
+BEGIN:VEVENT
+CREATED
+ :20031213T213318Z
+UID
+ :KOrganizer-951116794.484
+SEQUENCE
+ :0
+LAST-MODIFIED
+ :20031213T213318Z
+DTSTAMP
+ :20031213T213432Z
+ORGANIZER
+ :MAILTO:nobody@nowhere
+DESCRIPTION
+ :Recurring until 10.12.\nException 9.12.\n
+SUMMARY
+ :Recurring with exception
+CLASS
+ :PUBLIC
+PRIORITY
+ :3
+X-PILOTID
+ :0
+X-PILOTSTAT
+ :1
+RRULE
+ :FREQ=DAILY;UNTIL=20031210T000000;INTERVAL=1
+EXDATE
+ ;VALUE=DATE
+ :20031209
+DTSTART
+ :20031208T163000Z
+DTEND
+ :20031208T184500Z
+END:VEVENT
+BEGIN:VEVENT
+CREATED
+ :20031213T213357Z
+UID
+ :KOrganizer-659286401.509
+SEQUENCE
+ :1
+LAST-MODIFIED
+ :20031213T213426Z
+DTSTAMP
+ :20031213T213432Z
+ORGANIZER
+ :MAILTO:nobody@nowhere
+SUMMARY
+ :Recurring three times two days interval
+CLASS
+ :PUBLIC
+PRIORITY
+ :3
+X-PILOTID
+ :0
+X-PILOTSTAT
+ :1
+RRULE
+ :FREQ=DAILY;COUNT=3;INTERVAL=2
+DTSTART
+ :20031208T194500Z
+DTEND
+ :20031208T213000Z
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/Compat/KOrganizer_3.1.ics.ical.ref b/libkcal/tests/data/Compat/KOrganizer_3.1.ics.ical.ref
new file mode 100644
index 00000000..18049001
--- /dev/null
+++ b/libkcal/tests/data/Compat/KOrganizer_3.1.ics.ical.ref
@@ -0,0 +1,256 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20040122T092700Z
+ORGANIZER:MAILTO:nobody@nowhere
+X-PILOTID:0
+X-PILOTSTAT:1
+CREATED:20031213T212933Z
+UID:KOrganizer-475330509.201
+LAST-MODIFIED:20031213T212933Z
+DESCRIPTION:See Week 50 2003 for more events.\nRecur daily forever.\n
+SUMMARY:NAVIGATION EVENT
+PRIORITY:5
+RRULE:FREQ=DAILY
+DTSTART:20031208T120000Z
+DTEND:20031208T130000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20040122T092700Z
+ORGANIZER:MAILTO:nobody@nowhere
+X-PILOTID:0
+X-PILOTSTAT:1
+CREATED:20031213T212804Z
+UID:KOrganizer-465691683.1018
+LAST-MODIFIED:20031213T212804Z
+SUMMARY:Recurring monthly until 1.1.2005
+PRIORITY:5
+RRULE:FREQ=MONTHLY;UNTIL=20050101;BYMONTHDAY=11
+DTSTART:20031211T084500Z
+DTEND:20031211T103000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20040122T092700Z
+ORGANIZER:MAILTO:nobody@nowhere
+X-PILOTID:0
+X-PILOTSTAT:1
+CREATED:20031213T213154Z
+UID:KOrganizer-1952016504.437
+SEQUENCE:1
+LAST-MODIFIED:20031213T213204Z
+SUMMARY:Birthday
+PRIORITY:5
+CATEGORIES:Birthday
+RRULE:FREQ=YEARLY;BYMONTH=12
+DTSTART;VALUE=DATE:20031208
+DTEND;VALUE=DATE:20031209
+TRANSP:OPAQUE
+BEGIN:VALARM
+DESCRIPTION:
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:-P1D
+END:VALARM
+
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20040122T092700Z
+ORGANIZER:MAILTO:nobody@nowhere
+X-PILOTID:0
+X-PILOTSTAT:1
+CREATED:20031213T212117Z
+UID:KOrganizer-856020879.491
+LAST-MODIFIED:20031213T212117Z
+DESCRIPTION:9:30 - 11:15 (UTC)\nRecurring twice
+SUMMARY:Another Event
+PRIORITY:5
+RRULE:FREQ=DAILY;COUNT=2
+DTSTART:20031209T093000Z
+DTEND:20031209T111500Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20040122T092700Z
+ORGANIZER:MAILTO:nobody@nowhere
+ATTENDEE;CN=Another Name;RSVP=TRUE;PARTSTAT=ACCEPTED;ROLE=NON-PARTICIPANT:
+ mailto:two@yyy.yy
+ATTENDEE;CN=One Name;RSVP=FALSE;PARTSTAT=NEEDS-ACTION;
+ ROLE=REQ-PARTICIPANT:mailto:one@xxx.xx
+X-PILOTID:0
+X-PILOTSTAT:1
+CREATED:20031213T212528Z
+UID:KOrganizer-2056335629.565
+SEQUENCE:1
+LAST-MODIFIED:20031213T212636Z
+DESCRIPTION:Reminder 13 minutes\nShow time as free\nCategory Special
+ Occasion\nAccess Private\nTwo attendees.\nAlert.wav sound alarm\n
+SUMMARY:Full Information Event
+LOCATION:This is a location
+CLASS:PRIVATE
+PRIORITY:5
+CATEGORIES:Special Occasion
+DTSTART:20031211T133000Z
+DTEND:20031211T154500Z
+TRANSP:OPAQUE
+BEGIN:VALARM
+ATTACH:/usr/share/apps/korganizer/sounds/alert.wav
+ACTION:AUDIO
+TRIGGER;VALUE=DURATION:-PT13M
+END:VALARM
+
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20040122T092700Z
+ORGANIZER:MAILTO:nobody@nowhere
+X-PILOTID:0
+X-PILOTSTAT:1
+CREATED:20031213T213318Z
+UID:KOrganizer-951116794.484
+LAST-MODIFIED:20031213T213318Z
+DESCRIPTION:Recurring until 10.12.\nException 9.12.\n
+SUMMARY:Recurring with exception
+PRIORITY:5
+RRULE:FREQ=DAILY;UNTIL=20031210
+EXDATE;VALUE=DATE:20031209
+DTSTART:20031208T163000Z
+DTEND:20031208T184500Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20040122T092700Z
+ORGANIZER:MAILTO:nobody@nowhere
+X-PILOTID:0
+X-PILOTSTAT:1
+CREATED:20031213T213357Z
+UID:KOrganizer-659286401.509
+SEQUENCE:1
+LAST-MODIFIED:20031213T213426Z
+SUMMARY:Recurring three times two days interval
+PRIORITY:5
+RRULE:FREQ=DAILY;COUNT=3;INTERVAL=2
+DTSTART:20031208T194500Z
+DTEND:20031208T213000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20040122T092700Z
+ORGANIZER:MAILTO:nobody@nowhere
+X-PILOTID:0
+X-PILOTSTAT:1
+CREATED:20031213T212707Z
+UID:KOrganizer-1025455571.504
+SEQUENCE:1
+LAST-MODIFIED:20031213T212727Z
+DESCRIPTION:Recurring weekly three times on wednesday
+SUMMARY:Recurring weekly
+PRIORITY:5
+RRULE:FREQ=WEEKLY;COUNT=3;BYDAY=WE
+DTSTART:20031210T073000Z
+DTEND:20031210T083000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20040122T092700Z
+ORGANIZER:MAILTO:nobody@nowhere
+X-PILOTID:0
+X-PILOTSTAT:1
+CREATED:20031213T162226Z
+UID:KOrganizer-406380218.717
+SEQUENCE:1
+LAST-MODIFIED:20031213T212040Z
+DESCRIPTION:10:00 - 13:30 (UTC)\n
+SUMMARY:An Event
+PRIORITY:5
+DTSTART:20031213T100000Z
+DTEND:20031213T133000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20040122T092700Z
+ORGANIZER:MAILTO:nobody@nowhere
+X-PILOTID:0
+X-PILOTSTAT:1
+CREATED:20031213T212311Z
+UID:KOrganizer-1927781860.81
+SEQUENCE:2
+LAST-MODIFIED:20031213T212315Z
+DESCRIPTION:Three day all-day event.\n
+SUMMARY:All day 3
+PRIORITY:5
+DTSTART;VALUE=DATE:20031210
+DTEND;VALUE=DATE:20031213
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20040122T092700Z
+ORGANIZER:MAILTO:nobody@nowhere
+X-PILOTID:0
+X-PILOTSTAT:1
+CREATED:20031213T212250Z
+UID:KOrganizer-1744115041.851
+SEQUENCE:2
+LAST-MODIFIED:20031213T212259Z
+DESCRIPTION:Two day all-day event.\n
+SUMMARY:All Day 2
+PRIORITY:5
+DTSTART;VALUE=DATE:20031209
+DTEND;VALUE=DATE:20031211
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20040122T092700Z
+ORGANIZER:MAILTO:nobody@nowhere
+X-PILOTID:0
+X-PILOTSTAT:1
+CREATED:20031213T213054Z
+UID:KOrganizer-1149443407.784
+SEQUENCE:1
+LAST-MODIFIED:20031213T213109Z
+DESCRIPTION:12.12. 17:15 to 13.12. 19:15\n1 hour alarm
+SUMMARY:Multi-Day Event with Start/End Time
+PRIORITY:5
+DTSTART:20031212T171500Z
+DTEND:20031213T191500Z
+TRANSP:OPAQUE
+BEGIN:VALARM
+DESCRIPTION:
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:-PT1H
+END:VALARM
+
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20040122T092700Z
+ORGANIZER:MAILTO:nobody@nowhere
+X-PILOTID:0
+X-PILOTSTAT:1
+CREATED:20031213T212219Z
+UID:KOrganizer-182017314.321
+SEQUENCE:2
+LAST-MODIFIED:20031213T212229Z
+DESCRIPTION:One day all-day event.\nCategories Birthday\, Personal\n
+SUMMARY:All Day
+PRIORITY:5
+CATEGORIES:Birthday
+CATEGORIES:Personal
+DTSTART;VALUE=DATE:20031212
+DTEND;VALUE=DATE:20031213
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/Compat/KOrganizer_3.1a.ics b/libkcal/tests/data/Compat/KOrganizer_3.1a.ics
new file mode 100644
index 00000000..e35af420
--- /dev/null
+++ b/libkcal/tests/data/Compat/KOrganizer_3.1a.ics
@@ -0,0 +1,70 @@
+BEGIN:VCALENDAR
+PRODID
+ :-//K Desktop Environment//NONSGML KOrganizer 3.1//EN
+VERSION
+ :2.0
+BEGIN:VEVENT
+CREATED
+ :20031213T215123Z
+UID
+ :KOrganizer-676656311.951
+SEQUENCE
+ :1
+LAST-MODIFIED
+ :20031213T215131Z
+DTSTAMP
+ :20031213T215503Z
+ORGANIZER
+ :MAILTO:nobody@nowhere
+DESCRIPTION
+ :Can you spell utf8?\nÄÖÜäöüß\nCan you escape?\nSlash:/\,Backslash
+ :\\\,Quotes:"\nComma:\,\nSemicolon:\;
+SUMMARY
+ :Umlaut test aäöüßÄÖÜ - does it work?
+CLASS
+ :PUBLIC
+PRIORITY
+ :3
+X-PILOTID
+ :0
+X-PILOTSTAT
+ :1
+DTSTART
+ :20031211T101500Z
+DTEND
+ :20031211T143000Z
+END:VEVENT
+BEGIN:VEVENT
+CREATED
+ :20031213T215230Z
+UID
+ :KOrganizer-1343647538.858
+SEQUENCE
+ :6
+LAST-MODIFIED
+ :20031213T215439Z
+DTSTAMP
+ :20031213T215503Z
+ORGANIZER
+ :MAILTO:nobody@nowhere
+DESCRIPTION
+ :Recur Mon\, Tue\, Wed six times\nThis doesn't seem to be correctly
+ handled by the view.\n
+SUMMARY
+ :Recurring weekly
+CLASS
+ :PUBLIC
+PRIORITY
+ :3
+X-PILOTID
+ :0
+X-PILOTSTAT
+ :1
+RRULE
+ :FREQ=WEEKLY;COUNT=6;INTERVAL=1;BYDAY=MO,TU,WE
+DTSTART
+ :20031209T090000Z
+DTEND
+ :20031209T113000Z
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/Compat/KOrganizer_3.1a.ics.ical.ref b/libkcal/tests/data/Compat/KOrganizer_3.1a.ics.ical.ref
new file mode 100644
index 00000000..eb968011
--- /dev/null
+++ b/libkcal/tests/data/Compat/KOrganizer_3.1a.ics.ical.ref
@@ -0,0 +1,42 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20040122T092701Z
+ORGANIZER:MAILTO:nobody@nowhere
+X-PILOTID:0
+X-PILOTSTAT:1
+CREATED:20031213T215123Z
+UID:KOrganizer-676656311.951
+SEQUENCE:1
+LAST-MODIFIED:20031213T215131Z
+DESCRIPTION:Can you spell utf8?\nÄÖÜäöüß\nCan you escape?\nSlash:
+ /\,Backslash:\\\,Quotes:\"\nComma:\,\nSemicolon:\;
+SUMMARY:Umlaut test aäöüßÄÖÜ - does it work?
+PRIORITY:5
+DTSTART:20031211T101500Z
+DTEND:20031211T143000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20040122T092701Z
+ORGANIZER:MAILTO:nobody@nowhere
+X-PILOTID:0
+X-PILOTSTAT:1
+CREATED:20031213T215230Z
+UID:KOrganizer-1343647538.858
+SEQUENCE:6
+LAST-MODIFIED:20031213T215439Z
+DESCRIPTION:Recur Mon\, Tue\, Wed six times\nThis doesn't seem to be
+ correctly handled by the view.\n
+SUMMARY:Recurring weekly
+PRIORITY:5
+RRULE:FREQ=WEEKLY;COUNT=6;BYDAY=MO,TU,WE
+DTSTART:20031209T090000Z
+DTEND:20031209T113000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/Compat/KOrganizer_3.2.ics b/libkcal/tests/data/Compat/KOrganizer_3.2.ics
new file mode 100644
index 00000000..1e73607c
--- /dev/null
+++ b/libkcal/tests/data/Compat/KOrganizer_3.2.ics
@@ -0,0 +1,87 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.2//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20031213T204753Z
+ORGANIZER:MAILTO:nobody@nowhere
+CREATED:20031213T204152Z
+UID:KOrganizer-101218390.515
+SEQUENCE:0
+LAST-MODIFIED:20031213T204152Z
+SUMMARY:Holladiho
+CLASS:PUBLIC
+PRIORITY:3
+DTSTART:20031213T071500Z
+DTEND:20031213T104500Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20031213T204753Z
+ORGANIZER:MAILTO:nobody@nowhere
+CREATED:20031213T204326Z
+UID:KOrganizer-178854360.121
+SEQUENCE:0
+LAST-MODIFIED:20031213T204326Z
+DESCRIPTION:Reminder 2 hours\nShow time as free\nCategories meeting\, phone
+ call\nUmlauts: äöüÄÖÜß\nAccess: confidential\nRecurrence:
+ twice weekly on monday.\n
+SUMMARY:Full Info
+LOCATION:location
+CLASS:CONFIDENTIAL
+PRIORITY:3
+CATEGORIES:Meeting
+CATEGORIES:Phone Call
+RRULE:FREQ=WEEKLY;COUNT=2;INTERVAL=1;BYDAY=MO
+DTSTART:20031209T091500Z
+DTEND:20031209T113000Z
+TRANSP:TRANSPARENT
+BEGIN:VALARM
+DESCRIPTION:
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:-PT2H
+END:VALARM
+
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20031213T204753Z
+ORGANIZER:MAILTO:nobody@nowhere
+ATTENDEE;CN=Hans Wurst;RSVP=TRUE;PARTSTAT=TENTATIVE;ROLE=CHAIR:mailto:hw@abc.de
+CREATED:20031213T204544Z
+UID:KOrganizer-581715779.572
+SEQUENCE:0
+LAST-MODIFIED:20031213T204544Z
+DESCRIPTION:8.12. - 11.12 13:30 - 10:30\nreminder 40 hours\nOne Attendee
+SUMMARY:Multi-Day Event
+CLASS:PUBLIC
+PRIORITY:3
+DTSTART:20031208T123000Z
+DTEND:20031211T093000Z
+TRANSP:OPAQUE
+BEGIN:VALARM
+DESCRIPTION:
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:-P1DT16H
+END:VALARM
+
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20031213T204753Z
+ORGANIZER:MAILTO:nobody@nowhere
+CREATED:20031213T204645Z
+UID:KOrganizer-367556625.513
+SEQUENCE:2
+LAST-MODIFIED:20031213T204657Z
+SUMMARY:Two-day all day event recurring twice every second month
+CLASS:PUBLIC
+PRIORITY:3
+RRULE:FREQ=MONTHLY;COUNT=2;INTERVAL=2;BYMONTHDAY=10
+DTSTART;VALUE=DATE:20031210
+DTEND;VALUE=DATE:20031212
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/Compat/KOrganizer_3.2.ics.ical.ref b/libkcal/tests/data/Compat/KOrganizer_3.2.ics.ical.ref
new file mode 100644
index 00000000..95aa38b9
--- /dev/null
+++ b/libkcal/tests/data/Compat/KOrganizer_3.2.ics.ical.ref
@@ -0,0 +1,83 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20040122T092701Z
+ORGANIZER:MAILTO:nobody@nowhere
+ATTENDEE;CN=Hans Wurst;RSVP=TRUE;PARTSTAT=TENTATIVE;ROLE=CHAIR:mailto:
+ hw@abc.de
+CREATED:20031213T204544Z
+UID:KOrganizer-581715779.572
+LAST-MODIFIED:20031213T204544Z
+DESCRIPTION:8.12. - 11.12 13:30 - 10:30\nreminder 40 hours\nOne Attendee
+SUMMARY:Multi-Day Event
+PRIORITY:5
+DTSTART:20031208T123000Z
+DTEND:20031211T093000Z
+TRANSP:OPAQUE
+BEGIN:VALARM
+DESCRIPTION:
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:-P1DT16H
+END:VALARM
+
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20040122T092701Z
+ORGANIZER:MAILTO:nobody@nowhere
+CREATED:20031213T204152Z
+UID:KOrganizer-101218390.515
+LAST-MODIFIED:20031213T204152Z
+SUMMARY:Holladiho
+PRIORITY:5
+DTSTART:20031213T071500Z
+DTEND:20031213T104500Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20040122T092701Z
+ORGANIZER:MAILTO:nobody@nowhere
+CREATED:20031213T204326Z
+UID:KOrganizer-178854360.121
+LAST-MODIFIED:20031213T204326Z
+DESCRIPTION:Reminder 2 hours\nShow time as free\nCategories meeting\,
+ phone call\nUmlauts: äöüÄÖÜß\nAccess: confidential\nRecurrence:
+ twice weekly on monday.\n
+SUMMARY:Full Info
+LOCATION:location
+CLASS:CONFIDENTIAL
+PRIORITY:5
+CATEGORIES:Meeting
+CATEGORIES:Phone Call
+RRULE:FREQ=WEEKLY;COUNT=2;BYDAY=MO
+EXDATE:20031209T091500Z
+DTSTART:20031209T091500Z
+DTEND:20031209T113000Z
+TRANSP:TRANSPARENT
+BEGIN:VALARM
+DESCRIPTION:
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:-PT2H
+END:VALARM
+
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20040122T092701Z
+ORGANIZER:MAILTO:nobody@nowhere
+CREATED:20031213T204645Z
+UID:KOrganizer-367556625.513
+SEQUENCE:2
+LAST-MODIFIED:20031213T204657Z
+SUMMARY:Two-day all day event recurring twice every second month
+PRIORITY:5
+RRULE:FREQ=MONTHLY;COUNT=2;INTERVAL=2;BYMONTHDAY=10
+DTSTART;VALUE=DATE:20031210
+DTEND;VALUE=DATE:20031212
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/Compat/MSExchange.ics b/libkcal/tests/data/Compat/MSExchange.ics
new file mode 100644
index 00000000..451b8e59
--- /dev/null
+++ b/libkcal/tests/data/Compat/MSExchange.ics
@@ -0,0 +1,44 @@
+BEGIN:VCALENDAR
+METHOD:REQUEST
+PRODID:Microsoft CDO for Microsoft Exchange
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+TZID:GMT -0800 (Standard) / GMT -0700 (Daylight)
+BEGIN:STANDARD
+DTSTART:16010101T020000
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:16010101T020000
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20031116T052056Z
+DTSTART;TZID="GMT -0800 (Standard) / GMT -0700 (Daylight)":20031110T100000
+SUMMARY:Bob Bond's staff
+UID:CD0000008B9511D182D800C04FB1625D2F076BC90B1B8C4E89EAD0A2BC0FC5B7
+ORGANIZER;CN="Shaheedur Haque":MAILTO:srhaque@ncube.com
+LOCATION:
+DTEND;TZID="GMT -0800 (Standard) / GMT -0700 (Daylight)":20031110T110000
+RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO;WKST=SU
+SEQUENCE:0
+PRIORITY:5
+CLASS:
+CREATED:20031111T180542Z
+LAST-MODIFIED:20031111T180554Z
+STATUS:TENTATIVE
+TRANSP:OPAQUE
+X-MICROSOFT-CDO-BUSYSTATUS:BUSY
+X-MICROSOFT-CDO-INSTTYPE:1
+X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
+X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
+X-MICROSOFT-CDO-IMPORTANCE:1
+X-MICROSOFT-CDO-OWNERAPPTID:-1
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/Compat/MSExchange.ics.ical.fixme b/libkcal/tests/data/Compat/MSExchange.ics.ical.fixme
new file mode 100644
index 00000000..c54ea3b6
--- /dev/null
+++ b/libkcal/tests/data/Compat/MSExchange.ics.ical.fixme
@@ -0,0 +1,2 @@
+2 known errors:
+-) time zone doesn't seem to be applied (twice)
diff --git a/libkcal/tests/data/Compat/MSExchange.ics.ical.ref b/libkcal/tests/data/Compat/MSExchange.ics.ical.ref
new file mode 100644
index 00000000..10833066
--- /dev/null
+++ b/libkcal/tests/data/Compat/MSExchange.ics.ical.ref
@@ -0,0 +1,27 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VEVENT
+DTSTAMP:20040122T092702Z
+ORGANIZER;CN=Shaheedur Haque:MAILTO:srhaque@ncube.com
+X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
+X-MICROSOFT-CDO-BUSYSTATUS:BUSY
+X-MICROSOFT-CDO-IMPORTANCE:1
+X-MICROSOFT-CDO-INSTTYPE:1
+X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
+X-MICROSOFT-CDO-OWNERAPPTID:-1
+CREATED:20031111T180542Z
+UID:CD0000008B9511D182D800C04FB1625D2F076BC90B1B8C4E89EAD0A2BC0FC5B7
+LAST-MODIFIED:20031111T180554Z
+SUMMARY:Bob Bond's staff
+STATUS:TENTATIVE
+PRIORITY:5
+RRULE:FREQ=WEEKLY;BYDAY=MO;WKST=SU
+DTSTART:20031110T180000Z
+DTEND:20031110T190000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/Compat/Mozilla_1.0.ics b/libkcal/tests/data/Compat/Mozilla_1.0.ics
new file mode 100644
index 00000000..d03ec011
--- /dev/null
+++ b/libkcal/tests/data/Compat/Mozilla_1.0.ics
@@ -0,0 +1,61 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN
+
+BEGIN:VEVENT
+UID:06ef0474-1dd2-11b2-853d-cc63771f70dd
+SUMMARY:Convivium at 2707 Anderson Dr\, Raleigh\, 27608
+STATUS:CONFIRMED
+CLASS:PRIVATE
+DTSTART:20040516T200000Z
+DTEND:20040516T220000Z
+DTSTAMP:20040503T035553Z
+LAST-MODIFIED:20040504T211728Z
+END:VEVENT
+
+BEGIN:VEVENT
+UID:918141053
+SUMMARY:Performance with Anne
+LOCATION:Raleigh
+STATUS:CONFIRMED
+CLASS:PRIVATE
+DTSTART:20040523T170000Z
+DTEND:20040523T200000Z
+DTSTAMP:20040503T134500Z
+LAST-MODIFIED:20040503T202715Z
+END:VEVENT
+
+BEGIN:VTODO
+UID:26110226-9e9e-11d8-90c9-e6c8f9becdf7
+SUMMARY:Call Beacon to transfer funds
+STATUS:NEEDS-ACTION
+CLASS:PRIVATE
+DTSTART:20040505T101500
+DUE:20040505T111500
+DTSTAMP:20040505T141108Z
+END:VTODO
+
+BEGIN:VEVENT
+UID:9387e0e8-9ea1-11d8-86ed-b77ddbb7d081
+SUMMARY:Yemassee Graduation
+STATUS:CONFIRMED
+CLASS:PRIVATE
+DTSTART;VALUE=DATE:20040528
+DTEND;VALUE=DATE:20040529
+DTSTAMP:20040505T143541Z
+END:VEVENT
+
+BEGIN:VEVENT
+UID:896c9eb4-1dd2-11b2-b487-b1bef43989c3
+SUMMARY:Dental Exam
+DESCRIPTION:15-501 E Durham\, lt Easttowne Dr\, 3rd left Providence\, 3rd drive
+ rt\, up on ste 200
+STATUS:CONFIRMED
+CLASS:PRIVATE
+X-MOZILLA-ALARM-DEFAULT-LENGTH:0
+DTSTART:20040510T090000
+DTEND:20040510T110000
+DTSTAMP:20040507T011646Z
+END:VEVENT
+
+END:VCALENDAR
diff --git a/libkcal/tests/data/Compat/Mozilla_1.0.ics.ical.ref b/libkcal/tests/data/Compat/Mozilla_1.0.ics.ical.ref
new file mode 100644
index 00000000..309c10b0
--- /dev/null
+++ b/libkcal/tests/data/Compat/Mozilla_1.0.ics.ical.ref
@@ -0,0 +1,74 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:2.0
+BEGIN:VTODO
+DTSTAMP:20040518T105729Z
+CREATED:20040501T080000Z
+UID:26110226-9e9e-11d8-90c9-e6c8f9becdf7
+LAST-MODIFIED:20040518T105729Z
+SUMMARY:Call Beacon to transfer funds
+STATUS:NEEDS-ACTION
+CLASS:PRIVATE
+DUE:20040505T111500Z
+DTSTART:20040505T101500Z
+PERCENT-COMPLETE:0
+END:VTODO
+
+BEGIN:VEVENT
+DTSTAMP:20040518T105729Z
+CREATED:20040518T105729Z
+UID:06ef0474-1dd2-11b2-853d-cc63771f70dd
+LAST-MODIFIED:20040504T211728Z
+SUMMARY:Convivium at 2707 Anderson Dr\, Raleigh\, 27608
+STATUS:CONFIRMED
+CLASS:PRIVATE
+DTSTART:20040516T200000Z
+DTEND:20040516T220000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20040518T105729Z
+X-MOZILLA-ALARM-DEFAULT-LENGTH:0
+CREATED:20040518T105729Z
+UID:896c9eb4-1dd2-11b2-b487-b1bef43989c3
+LAST-MODIFIED:20040518T105729Z
+DESCRIPTION:15-501 E Durham\, lt Easttowne Dr\, 3rd left Providence\, 3rd
+ drive rt\, up on ste 200
+SUMMARY:Dental Exam
+STATUS:CONFIRMED
+CLASS:PRIVATE
+DTSTART:20040510T090000Z
+DTEND:20040510T110000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20040518T105729Z
+CREATED:20040518T105729Z
+UID:918141053
+LAST-MODIFIED:20040503T202715Z
+SUMMARY:Performance with Anne
+LOCATION:Raleigh
+STATUS:CONFIRMED
+CLASS:PRIVATE
+DTSTART:20040523T170000Z
+DTEND:20040523T200000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20040518T105729Z
+CREATED:20040518T105729Z
+UID:9387e0e8-9ea1-11d8-86ed-b77ddbb7d081
+LAST-MODIFIED:20040518T105729Z
+SUMMARY:Yemassee Graduation
+STATUS:CONFIRMED
+CLASS:PRIVATE
+DTSTART;VALUE=DATE:20040528
+DTEND;VALUE=DATE:20040529
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/Compat/eGroupware.ics b/libkcal/tests/data/Compat/eGroupware.ics
new file mode 100644
index 00000000..12f1bbc2
--- /dev/null
+++ b/libkcal/tests/data/Compat/eGroupware.ics
@@ -0,0 +1,23 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//eGroupWare//NONSGML eGroupWare Calendar 1.2.001//DE
+METHOD:PUBLISH
+BEGIN:VEVENT
+ATTENDEE;CN=Tobias König;ROLE=CHAIR;RSVP=FALSE;CUTYPE=INDIVIDUAL;PARTSTAT=
+ ACCEPTED:MAILTO:tobias.koenig@kde.de
+UID:calendar-4862-e77d247cfc15c40e485acfa65f636e29
+CLASS:PUBLIC
+SUMMARY:12345
+DESCRIPTION;CHARSET=UTF-8:
+ Das ist eine längere Notiz\ndie über meherer Zeilen geht\nmit +49 192830981
+ 2/09283498
+LOCATION:Dresden
+DTSTART:20070301T100000Z
+DTEND:20070301T110000Z
+PRIORITY:5
+TRANSP:OPAQUE
+CREATED:20070228T090007Z
+LAST-MODIFIED:20070228T090006Z
+DTSTAMP:20070228T090253Z
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/Compat/eGroupware.ics.ical.ref b/libkcal/tests/data/Compat/eGroupware.ics.ical.ref
new file mode 100644
index 00000000..b9d0c82b
--- /dev/null
+++ b/libkcal/tests/data/Compat/eGroupware.ics.ical.ref
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20070228T155530Z
+ATTENDEE;CN=Tobias König;RSVP=FALSE;PARTSTAT=ACCEPTED;ROLE=CHAIR:mailto:
+ tobias.koenig@kde.de
+CREATED:20070228T090007Z
+UID:calendar-4862-e77d247cfc15c40e485acfa65f636e29
+LAST-MODIFIED:20070228T090006Z
+DESCRIPTION:Das ist eine längere Notiz\ndie über meherer Zeilen
+ geht\nmit +49 1928309812/09283498
+SUMMARY:12345
+LOCATION:Dresden
+PRIORITY:5
+DTSTART:20070301T100000Z
+DTEND:20070301T110000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily-3.0.7.ics.saved b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily-3.0.7.ics.saved
new file mode 100644
index 00000000..bd408e22
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily-3.0.7.ics.saved
@@ -0,0 +1,123 @@
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+VERSION:2.0
+PRODID:-//MH Software Inc//Connect Daily - 3.0.7//EN
+
+BEGIN:VTIMEZONE
+TZID:America/Denver
+BEGIN:STANDARD
+DTSTART:19671029T020000
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE
+
+BEGIN:VEVENT
+UID:1213@67.154.139.115
+RECURRENCE-ID:19700102T010000Z
+SUMMARY:Every Wednesday
+DTSTART;TZID=America/Denver:20040714T180000
+RRULE:FREQ=WEEKLY;BYDAY=WE;INTERVAL=1;UNTIL=20051101T200000
+EXDATE;TZID=America/Denver:20040728T180000
+DURATION:PT2H
+DESCRIPTION:Every Wednesday until 1 November\, except July 28th.
+END:VEVENT
+
+BEGIN:VEVENT
+UID:1206@67.154.139.115
+RECURRENCE-ID:19700101T070000Z
+SUMMARY:1st and 3rd Monday
+DTSTART;TZID=America/Denver;VALUE=DATE:20040503
+RRULE:FREQ=MONTHLY;BYDAY=1MO,3MO
+DURATION:P1D
+END:VEVENT
+
+BEGIN:VEVENT
+UID:1207@67.154.139.115
+RECURRENCE-ID:19700101T070000Z
+SUMMARY:2nd and 4th Thursday
+DTSTART;TZID=America/Denver;VALUE=DATE:20040513
+RRULE:FREQ=MONTHLY;BYDAY=2TH,4TH
+DURATION:P1D
+END:VEVENT
+
+BEGIN:VEVENT
+UID:1210@67.154.139.115
+RECURRENCE-ID:20040504T060000Z
+SUMMARY:Every Other Tuesday
+DTSTART;TZID=America/Denver;VALUE=DATE:20040504
+RRULE:FREQ=WEEKLY;BYDAY=TU;INTERVAL=2
+DURATION:P1D
+END:VEVENT
+
+BEGIN:VEVENT
+UID:1211@67.154.139.115
+RECURRENCE-ID:19700101T070000Z
+SUMMARY:First Day
+DTSTART;TZID=America/Denver;VALUE=DATE:20040501
+RRULE:FREQ=MONTHLY;BYMONTHDAY=1
+DURATION:P1D
+END:VEVENT
+
+BEGIN:VEVENT
+UID:1212@67.154.139.115
+RECURRENCE-ID:19700101T070000Z
+SUMMARY:First Weekday
+DTSTART;TZID=America/Denver;VALUE=DATE:20040503
+RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=1
+DURATION:P1D
+END:VEVENT
+
+BEGIN:VEVENT
+UID:1208@67.154.139.115
+RECURRENCE-ID:19700101T070000Z
+SUMMARY:Last Day
+DTSTART;TZID=America/Denver;VALUE=DATE:20040531
+RRULE:FREQ=MONTHLY;BYMONTHDAY=-1
+DURATION:P1D
+END:VEVENT
+
+BEGIN:VEVENT
+UID:1209@67.154.139.115
+RECURRENCE-ID:19700101T070000Z
+SUMMARY:Last Weekday
+DTSTART;TZID=America/Denver;VALUE=DATE:20040531
+RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1
+DURATION:P1D
+END:VEVENT
+
+BEGIN:VEVENT
+UID:1268@67.154.139.115
+RECURRENCE-ID:19700101T070000Z
+SUMMARY:Kwanzaa
+DTSTART;TZID=America/Denver;VALUE=DATE:20041226
+RRULE:FREQ=MONTHLY;INTERVAL=12;BYMONTHDAY=26;BYMONTH=12
+DURATION:P7D
+END:VEVENT
+
+BEGIN:VEVENT
+UID:1214@67.154.139.115
+RECURRENCE-ID:19700101T070000Z
+SUMMARY:Thanksgiving
+DTSTART;TZID=America/Denver;VALUE=DATE:20041125
+RRULE:FREQ=MONTHLY;INTERVAL=12;BYDAY=4TH;BYMONTH=11
+DURATION:P1D
+END:VEVENT
+
+BEGIN:VEVENT
+UID:1214@67.154.139.115
+RECURRENCE-ID:19700101T070000Z
+SUMMARY:Thanksgiving
+DTSTART;TZID=America/Denver;VALUE=DATE:20050401
+RRULE:FREQ=WEEKLY;INTERVAL=5;BYDAY=TU,TH
+DURATION:P1D
+END:VEVENT
+
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily1.ics b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily1.ics
new file mode 100644
index 00000000..4842f80c
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily1.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+VERSION:2.0
+PRODID:-//MH Software Inc//Connect Daily - 3.0.7//EN
+X-LibKCal-Testsuite-OutTZ:America/Denver
+
+BEGIN:VTIMEZONE
+TZID:America/Denver
+BEGIN:STANDARD
+DTSTART:19671029T020000
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE
+
+BEGIN:VEVENT
+UID:1213@67.154.139.115
+RECURRENCE-ID:19700102T010000Z
+SUMMARY:Every Wednesday
+DTSTART;TZID=America/Denver:20040714T180000
+RRULE:FREQ=WEEKLY;BYDAY=WE;INTERVAL=1;UNTIL=20051101T200000
+EXDATE;TZID=America/Denver:20040728T180000
+DURATION:PT2H
+DESCRIPTION:Every Wednesday until 1 November\, except July 28th.
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily1.ics.next.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily1.ics.next.ref
new file mode 100644
index 00000000..141555ce
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily1.ics.next.ref
@@ -0,0 +1,68 @@
+2004-07-14T18:00:00
+2004-07-21T18:00:00
+2004-08-04T18:00:00
+2004-08-11T18:00:00
+2004-08-18T18:00:00
+2004-08-25T18:00:00
+2004-09-01T18:00:00
+2004-09-08T18:00:00
+2004-09-15T18:00:00
+2004-09-22T18:00:00
+2004-09-29T18:00:00
+2004-10-06T18:00:00
+2004-10-13T18:00:00
+2004-10-20T18:00:00
+2004-10-27T18:00:00
+2004-11-03T18:00:00
+2004-11-10T18:00:00
+2004-11-17T18:00:00
+2004-11-24T18:00:00
+2004-12-01T18:00:00
+2004-12-08T18:00:00
+2004-12-15T18:00:00
+2004-12-22T18:00:00
+2004-12-29T18:00:00
+2005-01-05T18:00:00
+2005-01-12T18:00:00
+2005-01-19T18:00:00
+2005-01-26T18:00:00
+2005-02-02T18:00:00
+2005-02-09T18:00:00
+2005-02-16T18:00:00
+2005-02-23T18:00:00
+2005-03-02T18:00:00
+2005-03-09T18:00:00
+2005-03-16T18:00:00
+2005-03-23T18:00:00
+2005-03-30T18:00:00
+2005-04-06T18:00:00
+2005-04-13T18:00:00
+2005-04-20T18:00:00
+2005-04-27T18:00:00
+2005-05-04T18:00:00
+2005-05-11T18:00:00
+2005-05-18T18:00:00
+2005-05-25T18:00:00
+2005-06-01T18:00:00
+2005-06-08T18:00:00
+2005-06-15T18:00:00
+2005-06-22T18:00:00
+2005-06-29T18:00:00
+2005-07-06T18:00:00
+2005-07-13T18:00:00
+2005-07-20T18:00:00
+2005-07-27T18:00:00
+2005-08-03T18:00:00
+2005-08-10T18:00:00
+2005-08-17T18:00:00
+2005-08-24T18:00:00
+2005-08-31T18:00:00
+2005-09-07T18:00:00
+2005-09-14T18:00:00
+2005-09-21T18:00:00
+2005-09-28T18:00:00
+2005-10-05T18:00:00
+2005-10-12T18:00:00
+2005-10-19T18:00:00
+2005-10-26T18:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily1.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily1.ics.prev.ref
new file mode 100644
index 00000000..cfb1b29f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily1.ics.prev.ref
@@ -0,0 +1,68 @@
+2005-10-26T18:00:00
+2005-10-19T18:00:00
+2005-10-12T18:00:00
+2005-10-05T18:00:00
+2005-09-28T18:00:00
+2005-09-21T18:00:00
+2005-09-14T18:00:00
+2005-09-07T18:00:00
+2005-08-31T18:00:00
+2005-08-24T18:00:00
+2005-08-17T18:00:00
+2005-08-10T18:00:00
+2005-08-03T18:00:00
+2005-07-27T18:00:00
+2005-07-20T18:00:00
+2005-07-13T18:00:00
+2005-07-06T18:00:00
+2005-06-29T18:00:00
+2005-06-22T18:00:00
+2005-06-15T18:00:00
+2005-06-08T18:00:00
+2005-06-01T18:00:00
+2005-05-25T18:00:00
+2005-05-18T18:00:00
+2005-05-11T18:00:00
+2005-05-04T18:00:00
+2005-04-27T18:00:00
+2005-04-20T18:00:00
+2005-04-13T18:00:00
+2005-04-06T18:00:00
+2005-03-30T18:00:00
+2005-03-23T18:00:00
+2005-03-16T18:00:00
+2005-03-09T18:00:00
+2005-03-02T18:00:00
+2005-02-23T18:00:00
+2005-02-16T18:00:00
+2005-02-09T18:00:00
+2005-02-02T18:00:00
+2005-01-26T18:00:00
+2005-01-19T18:00:00
+2005-01-12T18:00:00
+2005-01-05T18:00:00
+2004-12-29T18:00:00
+2004-12-22T18:00:00
+2004-12-15T18:00:00
+2004-12-08T18:00:00
+2004-12-01T18:00:00
+2004-11-24T18:00:00
+2004-11-17T18:00:00
+2004-11-10T18:00:00
+2004-11-03T18:00:00
+2004-10-27T18:00:00
+2004-10-20T18:00:00
+2004-10-13T18:00:00
+2004-10-06T18:00:00
+2004-09-29T18:00:00
+2004-09-22T18:00:00
+2004-09-15T18:00:00
+2004-09-08T18:00:00
+2004-09-01T18:00:00
+2004-08-25T18:00:00
+2004-08-18T18:00:00
+2004-08-11T18:00:00
+2004-08-04T18:00:00
+2004-07-21T18:00:00
+2004-07-14T18:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily1.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily1.ics.recurson.ref
new file mode 100644
index 00000000..1441cbf3
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily1.ics.recurson.ref
@@ -0,0 +1,68 @@
+2004-07-14
+2004-07-21
+2004-08-04
+2004-08-11
+2004-08-18
+2004-08-25
+2004-09-01
+2004-09-08
+2004-09-15
+2004-09-22
+2004-09-29
+2004-10-06
+2004-10-13
+2004-10-20
+2004-10-27
+2004-11-03
+2004-11-10
+2004-11-17
+2004-11-24
+2004-12-01
+2004-12-08
+2004-12-15
+2004-12-22
+2004-12-29
+2005-01-05
+2005-01-12
+2005-01-19
+2005-01-26
+2005-02-02
+2005-02-09
+2005-02-16
+2005-02-23
+2005-03-02
+2005-03-09
+2005-03-16
+2005-03-23
+2005-03-30
+2005-04-06
+2005-04-13
+2005-04-20
+2005-04-27
+2005-05-04
+2005-05-11
+2005-05-18
+2005-05-25
+2005-06-01
+2005-06-08
+2005-06-15
+2005-06-22
+2005-06-29
+2005-07-06
+2005-07-13
+2005-07-20
+2005-07-27
+2005-08-03
+2005-08-10
+2005-08-17
+2005-08-24
+2005-08-31
+2005-09-07
+2005-09-14
+2005-09-21
+2005-09-28
+2005-10-05
+2005-10-12
+2005-10-19
+2005-10-26
+
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily10.ics b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily10.ics
new file mode 100644
index 00000000..a148ade7
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily10.ics
@@ -0,0 +1,31 @@
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+VERSION:2.0
+PRODID:-//MH Software Inc//Connect Daily - 3.0.7//EN
+X-LibKCal-Testsuite-OutTZ:America/Denver
+
+BEGIN:VTIMEZONE
+TZID:America/Denver
+BEGIN:STANDARD
+DTSTART:19671029T020000
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE
+
+BEGIN:VEVENT
+UID:1214@67.154.139.115
+RECURRENCE-ID:19700101T070000Z
+SUMMARY:Thanksgiving
+DTSTART;TZID=America/Denver;VALUE=DATE:20041125
+RRULE:FREQ=MONTHLY;INTERVAL=12;BYDAY=4TH;BYMONTH=11
+DURATION:P1D
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily10.ics.next.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily10.ics.next.ref
new file mode 100644
index 00000000..3dc95454
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily10.ics.next.ref
@@ -0,0 +1,500 @@
+2004-11-25T00:00:00
+2005-11-24T00:00:00
+2006-11-23T00:00:00
+2007-11-22T00:00:00
+2008-11-27T00:00:00
+2009-11-26T00:00:00
+2010-11-25T00:00:00
+2011-11-24T00:00:00
+2012-11-22T00:00:00
+2013-11-28T00:00:00
+2014-11-27T00:00:00
+2015-11-26T00:00:00
+2016-11-24T00:00:00
+2017-11-23T00:00:00
+2018-11-22T00:00:00
+2019-11-28T00:00:00
+2020-11-26T00:00:00
+2021-11-25T00:00:00
+2022-11-24T00:00:00
+2023-11-23T00:00:00
+2024-11-28T00:00:00
+2025-11-27T00:00:00
+2026-11-26T00:00:00
+2027-11-25T00:00:00
+2028-11-23T00:00:00
+2029-11-22T00:00:00
+2030-11-28T00:00:00
+2031-11-27T00:00:00
+2032-11-25T00:00:00
+2033-11-24T00:00:00
+2034-11-23T00:00:00
+2035-11-22T00:00:00
+2036-11-27T00:00:00
+2037-11-26T00:00:00
+2038-11-25T00:00:00
+2039-11-24T00:00:00
+2040-11-22T00:00:00
+2041-11-28T00:00:00
+2042-11-27T00:00:00
+2043-11-26T00:00:00
+2044-11-24T00:00:00
+2045-11-23T00:00:00
+2046-11-22T00:00:00
+2047-11-28T00:00:00
+2048-11-26T00:00:00
+2049-11-25T00:00:00
+2050-11-24T00:00:00
+2051-11-23T00:00:00
+2052-11-28T00:00:00
+2053-11-27T00:00:00
+2054-11-26T00:00:00
+2055-11-25T00:00:00
+2056-11-23T00:00:00
+2057-11-22T00:00:00
+2058-11-28T00:00:00
+2059-11-27T00:00:00
+2060-11-25T00:00:00
+2061-11-24T00:00:00
+2062-11-23T00:00:00
+2063-11-22T00:00:00
+2064-11-27T00:00:00
+2065-11-26T00:00:00
+2066-11-25T00:00:00
+2067-11-24T00:00:00
+2068-11-22T00:00:00
+2069-11-28T00:00:00
+2070-11-27T00:00:00
+2071-11-26T00:00:00
+2072-11-24T00:00:00
+2073-11-23T00:00:00
+2074-11-22T00:00:00
+2075-11-28T00:00:00
+2076-11-26T00:00:00
+2077-11-25T00:00:00
+2078-11-24T00:00:00
+2079-11-23T00:00:00
+2080-11-28T00:00:00
+2081-11-27T00:00:00
+2082-11-26T00:00:00
+2083-11-25T00:00:00
+2084-11-23T00:00:00
+2085-11-22T00:00:00
+2086-11-28T00:00:00
+2087-11-27T00:00:00
+2088-11-25T00:00:00
+2089-11-24T00:00:00
+2090-11-23T00:00:00
+2091-11-22T00:00:00
+2092-11-27T00:00:00
+2093-11-26T00:00:00
+2094-11-25T00:00:00
+2095-11-24T00:00:00
+2096-11-22T00:00:00
+2097-11-28T00:00:00
+2098-11-27T00:00:00
+2099-11-26T00:00:00
+2100-11-25T00:00:00
+2101-11-24T00:00:00
+2102-11-23T00:00:00
+2103-11-22T00:00:00
+2104-11-27T00:00:00
+2105-11-26T00:00:00
+2106-11-25T00:00:00
+2107-11-24T00:00:00
+2108-11-22T00:00:00
+2109-11-28T00:00:00
+2110-11-27T00:00:00
+2111-11-26T00:00:00
+2112-11-24T00:00:00
+2113-11-23T00:00:00
+2114-11-22T00:00:00
+2115-11-28T00:00:00
+2116-11-26T00:00:00
+2117-11-25T00:00:00
+2118-11-24T00:00:00
+2119-11-23T00:00:00
+2120-11-28T00:00:00
+2121-11-27T00:00:00
+2122-11-26T00:00:00
+2123-11-25T00:00:00
+2124-11-23T00:00:00
+2125-11-22T00:00:00
+2126-11-28T00:00:00
+2127-11-27T00:00:00
+2128-11-25T00:00:00
+2129-11-24T00:00:00
+2130-11-23T00:00:00
+2131-11-22T00:00:00
+2132-11-27T00:00:00
+2133-11-26T00:00:00
+2134-11-25T00:00:00
+2135-11-24T00:00:00
+2136-11-22T00:00:00
+2137-11-28T00:00:00
+2138-11-27T00:00:00
+2139-11-26T00:00:00
+2140-11-24T00:00:00
+2141-11-23T00:00:00
+2142-11-22T00:00:00
+2143-11-28T00:00:00
+2144-11-26T00:00:00
+2145-11-25T00:00:00
+2146-11-24T00:00:00
+2147-11-23T00:00:00
+2148-11-28T00:00:00
+2149-11-27T00:00:00
+2150-11-26T00:00:00
+2151-11-25T00:00:00
+2152-11-23T00:00:00
+2153-11-22T00:00:00
+2154-11-28T00:00:00
+2155-11-27T00:00:00
+2156-11-25T00:00:00
+2157-11-24T00:00:00
+2158-11-23T00:00:00
+2159-11-22T00:00:00
+2160-11-27T00:00:00
+2161-11-26T00:00:00
+2162-11-25T00:00:00
+2163-11-24T00:00:00
+2164-11-22T00:00:00
+2165-11-28T00:00:00
+2166-11-27T00:00:00
+2167-11-26T00:00:00
+2168-11-24T00:00:00
+2169-11-23T00:00:00
+2170-11-22T00:00:00
+2171-11-28T00:00:00
+2172-11-26T00:00:00
+2173-11-25T00:00:00
+2174-11-24T00:00:00
+2175-11-23T00:00:00
+2176-11-28T00:00:00
+2177-11-27T00:00:00
+2178-11-26T00:00:00
+2179-11-25T00:00:00
+2180-11-23T00:00:00
+2181-11-22T00:00:00
+2182-11-28T00:00:00
+2183-11-27T00:00:00
+2184-11-25T00:00:00
+2185-11-24T00:00:00
+2186-11-23T00:00:00
+2187-11-22T00:00:00
+2188-11-27T00:00:00
+2189-11-26T00:00:00
+2190-11-25T00:00:00
+2191-11-24T00:00:00
+2192-11-22T00:00:00
+2193-11-28T00:00:00
+2194-11-27T00:00:00
+2195-11-26T00:00:00
+2196-11-24T00:00:00
+2197-11-23T00:00:00
+2198-11-22T00:00:00
+2199-11-28T00:00:00
+2200-11-27T00:00:00
+2201-11-26T00:00:00
+2202-11-25T00:00:00
+2203-11-24T00:00:00
+2204-11-22T00:00:00
+2205-11-28T00:00:00
+2206-11-27T00:00:00
+2207-11-26T00:00:00
+2208-11-24T00:00:00
+2209-11-23T00:00:00
+2210-11-22T00:00:00
+2211-11-28T00:00:00
+2212-11-26T00:00:00
+2213-11-25T00:00:00
+2214-11-24T00:00:00
+2215-11-23T00:00:00
+2216-11-28T00:00:00
+2217-11-27T00:00:00
+2218-11-26T00:00:00
+2219-11-25T00:00:00
+2220-11-23T00:00:00
+2221-11-22T00:00:00
+2222-11-28T00:00:00
+2223-11-27T00:00:00
+2224-11-25T00:00:00
+2225-11-24T00:00:00
+2226-11-23T00:00:00
+2227-11-22T00:00:00
+2228-11-27T00:00:00
+2229-11-26T00:00:00
+2230-11-25T00:00:00
+2231-11-24T00:00:00
+2232-11-22T00:00:00
+2233-11-28T00:00:00
+2234-11-27T00:00:00
+2235-11-26T00:00:00
+2236-11-24T00:00:00
+2237-11-23T00:00:00
+2238-11-22T00:00:00
+2239-11-28T00:00:00
+2240-11-26T00:00:00
+2241-11-25T00:00:00
+2242-11-24T00:00:00
+2243-11-23T00:00:00
+2244-11-28T00:00:00
+2245-11-27T00:00:00
+2246-11-26T00:00:00
+2247-11-25T00:00:00
+2248-11-23T00:00:00
+2249-11-22T00:00:00
+2250-11-28T00:00:00
+2251-11-27T00:00:00
+2252-11-25T00:00:00
+2253-11-24T00:00:00
+2254-11-23T00:00:00
+2255-11-22T00:00:00
+2256-11-27T00:00:00
+2257-11-26T00:00:00
+2258-11-25T00:00:00
+2259-11-24T00:00:00
+2260-11-22T00:00:00
+2261-11-28T00:00:00
+2262-11-27T00:00:00
+2263-11-26T00:00:00
+2264-11-24T00:00:00
+2265-11-23T00:00:00
+2266-11-22T00:00:00
+2267-11-28T00:00:00
+2268-11-26T00:00:00
+2269-11-25T00:00:00
+2270-11-24T00:00:00
+2271-11-23T00:00:00
+2272-11-28T00:00:00
+2273-11-27T00:00:00
+2274-11-26T00:00:00
+2275-11-25T00:00:00
+2276-11-23T00:00:00
+2277-11-22T00:00:00
+2278-11-28T00:00:00
+2279-11-27T00:00:00
+2280-11-25T00:00:00
+2281-11-24T00:00:00
+2282-11-23T00:00:00
+2283-11-22T00:00:00
+2284-11-27T00:00:00
+2285-11-26T00:00:00
+2286-11-25T00:00:00
+2287-11-24T00:00:00
+2288-11-22T00:00:00
+2289-11-28T00:00:00
+2290-11-27T00:00:00
+2291-11-26T00:00:00
+2292-11-24T00:00:00
+2293-11-23T00:00:00
+2294-11-22T00:00:00
+2295-11-28T00:00:00
+2296-11-26T00:00:00
+2297-11-25T00:00:00
+2298-11-24T00:00:00
+2299-11-23T00:00:00
+2300-11-22T00:00:00
+2301-11-28T00:00:00
+2302-11-27T00:00:00
+2303-11-26T00:00:00
+2304-11-24T00:00:00
+2305-11-23T00:00:00
+2306-11-22T00:00:00
+2307-11-28T00:00:00
+2308-11-26T00:00:00
+2309-11-25T00:00:00
+2310-11-24T00:00:00
+2311-11-23T00:00:00
+2312-11-28T00:00:00
+2313-11-27T00:00:00
+2314-11-26T00:00:00
+2315-11-25T00:00:00
+2316-11-23T00:00:00
+2317-11-22T00:00:00
+2318-11-28T00:00:00
+2319-11-27T00:00:00
+2320-11-25T00:00:00
+2321-11-24T00:00:00
+2322-11-23T00:00:00
+2323-11-22T00:00:00
+2324-11-27T00:00:00
+2325-11-26T00:00:00
+2326-11-25T00:00:00
+2327-11-24T00:00:00
+2328-11-22T00:00:00
+2329-11-28T00:00:00
+2330-11-27T00:00:00
+2331-11-26T00:00:00
+2332-11-24T00:00:00
+2333-11-23T00:00:00
+2334-11-22T00:00:00
+2335-11-28T00:00:00
+2336-11-26T00:00:00
+2337-11-25T00:00:00
+2338-11-24T00:00:00
+2339-11-23T00:00:00
+2340-11-28T00:00:00
+2341-11-27T00:00:00
+2342-11-26T00:00:00
+2343-11-25T00:00:00
+2344-11-23T00:00:00
+2345-11-22T00:00:00
+2346-11-28T00:00:00
+2347-11-27T00:00:00
+2348-11-25T00:00:00
+2349-11-24T00:00:00
+2350-11-23T00:00:00
+2351-11-22T00:00:00
+2352-11-27T00:00:00
+2353-11-26T00:00:00
+2354-11-25T00:00:00
+2355-11-24T00:00:00
+2356-11-22T00:00:00
+2357-11-28T00:00:00
+2358-11-27T00:00:00
+2359-11-26T00:00:00
+2360-11-24T00:00:00
+2361-11-23T00:00:00
+2362-11-22T00:00:00
+2363-11-28T00:00:00
+2364-11-26T00:00:00
+2365-11-25T00:00:00
+2366-11-24T00:00:00
+2367-11-23T00:00:00
+2368-11-28T00:00:00
+2369-11-27T00:00:00
+2370-11-26T00:00:00
+2371-11-25T00:00:00
+2372-11-23T00:00:00
+2373-11-22T00:00:00
+2374-11-28T00:00:00
+2375-11-27T00:00:00
+2376-11-25T00:00:00
+2377-11-24T00:00:00
+2378-11-23T00:00:00
+2379-11-22T00:00:00
+2380-11-27T00:00:00
+2381-11-26T00:00:00
+2382-11-25T00:00:00
+2383-11-24T00:00:00
+2384-11-22T00:00:00
+2385-11-28T00:00:00
+2386-11-27T00:00:00
+2387-11-26T00:00:00
+2388-11-24T00:00:00
+2389-11-23T00:00:00
+2390-11-22T00:00:00
+2391-11-28T00:00:00
+2392-11-26T00:00:00
+2393-11-25T00:00:00
+2394-11-24T00:00:00
+2395-11-23T00:00:00
+2396-11-28T00:00:00
+2397-11-27T00:00:00
+2398-11-26T00:00:00
+2399-11-25T00:00:00
+2400-11-23T00:00:00
+2401-11-22T00:00:00
+2402-11-28T00:00:00
+2403-11-27T00:00:00
+2404-11-25T00:00:00
+2405-11-24T00:00:00
+2406-11-23T00:00:00
+2407-11-22T00:00:00
+2408-11-27T00:00:00
+2409-11-26T00:00:00
+2410-11-25T00:00:00
+2411-11-24T00:00:00
+2412-11-22T00:00:00
+2413-11-28T00:00:00
+2414-11-27T00:00:00
+2415-11-26T00:00:00
+2416-11-24T00:00:00
+2417-11-23T00:00:00
+2418-11-22T00:00:00
+2419-11-28T00:00:00
+2420-11-26T00:00:00
+2421-11-25T00:00:00
+2422-11-24T00:00:00
+2423-11-23T00:00:00
+2424-11-28T00:00:00
+2425-11-27T00:00:00
+2426-11-26T00:00:00
+2427-11-25T00:00:00
+2428-11-23T00:00:00
+2429-11-22T00:00:00
+2430-11-28T00:00:00
+2431-11-27T00:00:00
+2432-11-25T00:00:00
+2433-11-24T00:00:00
+2434-11-23T00:00:00
+2435-11-22T00:00:00
+2436-11-27T00:00:00
+2437-11-26T00:00:00
+2438-11-25T00:00:00
+2439-11-24T00:00:00
+2440-11-22T00:00:00
+2441-11-28T00:00:00
+2442-11-27T00:00:00
+2443-11-26T00:00:00
+2444-11-24T00:00:00
+2445-11-23T00:00:00
+2446-11-22T00:00:00
+2447-11-28T00:00:00
+2448-11-26T00:00:00
+2449-11-25T00:00:00
+2450-11-24T00:00:00
+2451-11-23T00:00:00
+2452-11-28T00:00:00
+2453-11-27T00:00:00
+2454-11-26T00:00:00
+2455-11-25T00:00:00
+2456-11-23T00:00:00
+2457-11-22T00:00:00
+2458-11-28T00:00:00
+2459-11-27T00:00:00
+2460-11-25T00:00:00
+2461-11-24T00:00:00
+2462-11-23T00:00:00
+2463-11-22T00:00:00
+2464-11-27T00:00:00
+2465-11-26T00:00:00
+2466-11-25T00:00:00
+2467-11-24T00:00:00
+2468-11-22T00:00:00
+2469-11-28T00:00:00
+2470-11-27T00:00:00
+2471-11-26T00:00:00
+2472-11-24T00:00:00
+2473-11-23T00:00:00
+2474-11-22T00:00:00
+2475-11-28T00:00:00
+2476-11-26T00:00:00
+2477-11-25T00:00:00
+2478-11-24T00:00:00
+2479-11-23T00:00:00
+2480-11-28T00:00:00
+2481-11-27T00:00:00
+2482-11-26T00:00:00
+2483-11-25T00:00:00
+2484-11-23T00:00:00
+2485-11-22T00:00:00
+2486-11-28T00:00:00
+2487-11-27T00:00:00
+2488-11-25T00:00:00
+2489-11-24T00:00:00
+2490-11-23T00:00:00
+2491-11-22T00:00:00
+2492-11-27T00:00:00
+2493-11-26T00:00:00
+2494-11-25T00:00:00
+2495-11-24T00:00:00
+2496-11-22T00:00:00
+2497-11-28T00:00:00
+2498-11-27T00:00:00
+2499-11-26T00:00:00
+2500-11-25T00:00:00
+2501-11-24T00:00:00
+2502-11-23T00:00:00
+2503-11-22T00:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily10.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily10.ics.prev.ref
new file mode 100644
index 00000000..83a64100
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily10.ics.prev.ref
@@ -0,0 +1,8 @@
+2010-11-25T00:00:00
+2009-11-26T00:00:00
+2008-11-27T00:00:00
+2007-11-22T00:00:00
+2006-11-23T00:00:00
+2005-11-24T00:00:00
+2004-11-25T00:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily10.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily10.ics.recurson.ref
new file mode 100644
index 00000000..c00bf9fb
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily10.ics.recurson.ref
@@ -0,0 +1,500 @@
+2004-11-25
+2005-11-24
+2006-11-23
+2007-11-22
+2008-11-27
+2009-11-26
+2010-11-25
+2011-11-24
+2012-11-22
+2013-11-28
+2014-11-27
+2015-11-26
+2016-11-24
+2017-11-23
+2018-11-22
+2019-11-28
+2020-11-26
+2021-11-25
+2022-11-24
+2023-11-23
+2024-11-28
+2025-11-27
+2026-11-26
+2027-11-25
+2028-11-23
+2029-11-22
+2030-11-28
+2031-11-27
+2032-11-25
+2033-11-24
+2034-11-23
+2035-11-22
+2036-11-27
+2037-11-26
+2038-11-25
+2039-11-24
+2040-11-22
+2041-11-28
+2042-11-27
+2043-11-26
+2044-11-24
+2045-11-23
+2046-11-22
+2047-11-28
+2048-11-26
+2049-11-25
+2050-11-24
+2051-11-23
+2052-11-28
+2053-11-27
+2054-11-26
+2055-11-25
+2056-11-23
+2057-11-22
+2058-11-28
+2059-11-27
+2060-11-25
+2061-11-24
+2062-11-23
+2063-11-22
+2064-11-27
+2065-11-26
+2066-11-25
+2067-11-24
+2068-11-22
+2069-11-28
+2070-11-27
+2071-11-26
+2072-11-24
+2073-11-23
+2074-11-22
+2075-11-28
+2076-11-26
+2077-11-25
+2078-11-24
+2079-11-23
+2080-11-28
+2081-11-27
+2082-11-26
+2083-11-25
+2084-11-23
+2085-11-22
+2086-11-28
+2087-11-27
+2088-11-25
+2089-11-24
+2090-11-23
+2091-11-22
+2092-11-27
+2093-11-26
+2094-11-25
+2095-11-24
+2096-11-22
+2097-11-28
+2098-11-27
+2099-11-26
+2100-11-25
+2101-11-24
+2102-11-23
+2103-11-22
+2104-11-27
+2105-11-26
+2106-11-25
+2107-11-24
+2108-11-22
+2109-11-28
+2110-11-27
+2111-11-26
+2112-11-24
+2113-11-23
+2114-11-22
+2115-11-28
+2116-11-26
+2117-11-25
+2118-11-24
+2119-11-23
+2120-11-28
+2121-11-27
+2122-11-26
+2123-11-25
+2124-11-23
+2125-11-22
+2126-11-28
+2127-11-27
+2128-11-25
+2129-11-24
+2130-11-23
+2131-11-22
+2132-11-27
+2133-11-26
+2134-11-25
+2135-11-24
+2136-11-22
+2137-11-28
+2138-11-27
+2139-11-26
+2140-11-24
+2141-11-23
+2142-11-22
+2143-11-28
+2144-11-26
+2145-11-25
+2146-11-24
+2147-11-23
+2148-11-28
+2149-11-27
+2150-11-26
+2151-11-25
+2152-11-23
+2153-11-22
+2154-11-28
+2155-11-27
+2156-11-25
+2157-11-24
+2158-11-23
+2159-11-22
+2160-11-27
+2161-11-26
+2162-11-25
+2163-11-24
+2164-11-22
+2165-11-28
+2166-11-27
+2167-11-26
+2168-11-24
+2169-11-23
+2170-11-22
+2171-11-28
+2172-11-26
+2173-11-25
+2174-11-24
+2175-11-23
+2176-11-28
+2177-11-27
+2178-11-26
+2179-11-25
+2180-11-23
+2181-11-22
+2182-11-28
+2183-11-27
+2184-11-25
+2185-11-24
+2186-11-23
+2187-11-22
+2188-11-27
+2189-11-26
+2190-11-25
+2191-11-24
+2192-11-22
+2193-11-28
+2194-11-27
+2195-11-26
+2196-11-24
+2197-11-23
+2198-11-22
+2199-11-28
+2200-11-27
+2201-11-26
+2202-11-25
+2203-11-24
+2204-11-22
+2205-11-28
+2206-11-27
+2207-11-26
+2208-11-24
+2209-11-23
+2210-11-22
+2211-11-28
+2212-11-26
+2213-11-25
+2214-11-24
+2215-11-23
+2216-11-28
+2217-11-27
+2218-11-26
+2219-11-25
+2220-11-23
+2221-11-22
+2222-11-28
+2223-11-27
+2224-11-25
+2225-11-24
+2226-11-23
+2227-11-22
+2228-11-27
+2229-11-26
+2230-11-25
+2231-11-24
+2232-11-22
+2233-11-28
+2234-11-27
+2235-11-26
+2236-11-24
+2237-11-23
+2238-11-22
+2239-11-28
+2240-11-26
+2241-11-25
+2242-11-24
+2243-11-23
+2244-11-28
+2245-11-27
+2246-11-26
+2247-11-25
+2248-11-23
+2249-11-22
+2250-11-28
+2251-11-27
+2252-11-25
+2253-11-24
+2254-11-23
+2255-11-22
+2256-11-27
+2257-11-26
+2258-11-25
+2259-11-24
+2260-11-22
+2261-11-28
+2262-11-27
+2263-11-26
+2264-11-24
+2265-11-23
+2266-11-22
+2267-11-28
+2268-11-26
+2269-11-25
+2270-11-24
+2271-11-23
+2272-11-28
+2273-11-27
+2274-11-26
+2275-11-25
+2276-11-23
+2277-11-22
+2278-11-28
+2279-11-27
+2280-11-25
+2281-11-24
+2282-11-23
+2283-11-22
+2284-11-27
+2285-11-26
+2286-11-25
+2287-11-24
+2288-11-22
+2289-11-28
+2290-11-27
+2291-11-26
+2292-11-24
+2293-11-23
+2294-11-22
+2295-11-28
+2296-11-26
+2297-11-25
+2298-11-24
+2299-11-23
+2300-11-22
+2301-11-28
+2302-11-27
+2303-11-26
+2304-11-24
+2305-11-23
+2306-11-22
+2307-11-28
+2308-11-26
+2309-11-25
+2310-11-24
+2311-11-23
+2312-11-28
+2313-11-27
+2314-11-26
+2315-11-25
+2316-11-23
+2317-11-22
+2318-11-28
+2319-11-27
+2320-11-25
+2321-11-24
+2322-11-23
+2323-11-22
+2324-11-27
+2325-11-26
+2326-11-25
+2327-11-24
+2328-11-22
+2329-11-28
+2330-11-27
+2331-11-26
+2332-11-24
+2333-11-23
+2334-11-22
+2335-11-28
+2336-11-26
+2337-11-25
+2338-11-24
+2339-11-23
+2340-11-28
+2341-11-27
+2342-11-26
+2343-11-25
+2344-11-23
+2345-11-22
+2346-11-28
+2347-11-27
+2348-11-25
+2349-11-24
+2350-11-23
+2351-11-22
+2352-11-27
+2353-11-26
+2354-11-25
+2355-11-24
+2356-11-22
+2357-11-28
+2358-11-27
+2359-11-26
+2360-11-24
+2361-11-23
+2362-11-22
+2363-11-28
+2364-11-26
+2365-11-25
+2366-11-24
+2367-11-23
+2368-11-28
+2369-11-27
+2370-11-26
+2371-11-25
+2372-11-23
+2373-11-22
+2374-11-28
+2375-11-27
+2376-11-25
+2377-11-24
+2378-11-23
+2379-11-22
+2380-11-27
+2381-11-26
+2382-11-25
+2383-11-24
+2384-11-22
+2385-11-28
+2386-11-27
+2387-11-26
+2388-11-24
+2389-11-23
+2390-11-22
+2391-11-28
+2392-11-26
+2393-11-25
+2394-11-24
+2395-11-23
+2396-11-28
+2397-11-27
+2398-11-26
+2399-11-25
+2400-11-23
+2401-11-22
+2402-11-28
+2403-11-27
+2404-11-25
+2405-11-24
+2406-11-23
+2407-11-22
+2408-11-27
+2409-11-26
+2410-11-25
+2411-11-24
+2412-11-22
+2413-11-28
+2414-11-27
+2415-11-26
+2416-11-24
+2417-11-23
+2418-11-22
+2419-11-28
+2420-11-26
+2421-11-25
+2422-11-24
+2423-11-23
+2424-11-28
+2425-11-27
+2426-11-26
+2427-11-25
+2428-11-23
+2429-11-22
+2430-11-28
+2431-11-27
+2432-11-25
+2433-11-24
+2434-11-23
+2435-11-22
+2436-11-27
+2437-11-26
+2438-11-25
+2439-11-24
+2440-11-22
+2441-11-28
+2442-11-27
+2443-11-26
+2444-11-24
+2445-11-23
+2446-11-22
+2447-11-28
+2448-11-26
+2449-11-25
+2450-11-24
+2451-11-23
+2452-11-28
+2453-11-27
+2454-11-26
+2455-11-25
+2456-11-23
+2457-11-22
+2458-11-28
+2459-11-27
+2460-11-25
+2461-11-24
+2462-11-23
+2463-11-22
+2464-11-27
+2465-11-26
+2466-11-25
+2467-11-24
+2468-11-22
+2469-11-28
+2470-11-27
+2471-11-26
+2472-11-24
+2473-11-23
+2474-11-22
+2475-11-28
+2476-11-26
+2477-11-25
+2478-11-24
+2479-11-23
+2480-11-28
+2481-11-27
+2482-11-26
+2483-11-25
+2484-11-23
+2485-11-22
+2486-11-28
+2487-11-27
+2488-11-25
+2489-11-24
+2490-11-23
+2491-11-22
+2492-11-27
+2493-11-26
+2494-11-25
+2495-11-24
+2496-11-22
+2497-11-28
+2498-11-27
+2499-11-26
+2500-11-25
+2501-11-24
+2502-11-23
+2503-11-22
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily11.ics b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily11.ics
new file mode 100644
index 00000000..5d841daf
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily11.ics
@@ -0,0 +1,31 @@
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+VERSION:2.0
+PRODID:-//MH Software Inc//Connect Daily - 3.0.7//EN
+X-LibKCal-Testsuite-OutTZ:America/Denver
+
+BEGIN:VTIMEZONE
+TZID:America/Denver
+BEGIN:STANDARD
+DTSTART:19671029T020000
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE
+
+BEGIN:VEVENT
+UID:1214@67.154.139.115
+RECURRENCE-ID:19700101T070000Z
+SUMMARY:Thanksgiving
+DTSTART;TZID=America/Denver;VALUE=DATE:20050401
+RRULE:FREQ=WEEKLY;INTERVAL=5;BYDAY=TU,TH
+DURATION:P1D
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily11.ics.next.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily11.ics.next.ref
new file mode 100644
index 00000000..1e26be5b
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily11.ics.next.ref
@@ -0,0 +1,500 @@
+2005-04-01T00:00:00
+2005-05-03T00:00:00
+2005-05-05T00:00:00
+2005-06-07T00:00:00
+2005-06-09T00:00:00
+2005-07-12T00:00:00
+2005-07-14T00:00:00
+2005-08-16T00:00:00
+2005-08-18T00:00:00
+2005-09-20T00:00:00
+2005-09-22T00:00:00
+2005-10-25T00:00:00
+2005-10-27T00:00:00
+2005-11-29T00:00:00
+2005-12-01T00:00:00
+2006-01-03T00:00:00
+2006-01-05T00:00:00
+2006-02-07T00:00:00
+2006-02-09T00:00:00
+2006-03-14T00:00:00
+2006-03-16T00:00:00
+2006-04-18T00:00:00
+2006-04-20T00:00:00
+2006-05-23T00:00:00
+2006-05-25T00:00:00
+2006-06-27T00:00:00
+2006-06-29T00:00:00
+2006-08-01T00:00:00
+2006-08-03T00:00:00
+2006-09-05T00:00:00
+2006-09-07T00:00:00
+2006-10-10T00:00:00
+2006-10-12T00:00:00
+2006-11-14T00:00:00
+2006-11-16T00:00:00
+2006-12-19T00:00:00
+2006-12-21T00:00:00
+2007-01-23T00:00:00
+2007-01-25T00:00:00
+2007-02-27T00:00:00
+2007-03-01T00:00:00
+2007-04-03T00:00:00
+2007-04-05T00:00:00
+2007-05-08T00:00:00
+2007-05-10T00:00:00
+2007-06-12T00:00:00
+2007-06-14T00:00:00
+2007-07-17T00:00:00
+2007-07-19T00:00:00
+2007-08-21T00:00:00
+2007-08-23T00:00:00
+2007-09-25T00:00:00
+2007-09-27T00:00:00
+2007-10-30T00:00:00
+2007-11-01T00:00:00
+2007-12-04T00:00:00
+2007-12-06T00:00:00
+2008-01-08T00:00:00
+2008-01-10T00:00:00
+2008-02-12T00:00:00
+2008-02-14T00:00:00
+2008-03-18T00:00:00
+2008-03-20T00:00:00
+2008-04-22T00:00:00
+2008-04-24T00:00:00
+2008-05-27T00:00:00
+2008-05-29T00:00:00
+2008-07-01T00:00:00
+2008-07-03T00:00:00
+2008-08-05T00:00:00
+2008-08-07T00:00:00
+2008-09-09T00:00:00
+2008-09-11T00:00:00
+2008-10-14T00:00:00
+2008-10-16T00:00:00
+2008-11-18T00:00:00
+2008-11-20T00:00:00
+2008-12-23T00:00:00
+2008-12-25T00:00:00
+2009-01-27T00:00:00
+2009-01-29T00:00:00
+2009-03-03T00:00:00
+2009-03-05T00:00:00
+2009-04-07T00:00:00
+2009-04-09T00:00:00
+2009-05-12T00:00:00
+2009-05-14T00:00:00
+2009-06-16T00:00:00
+2009-06-18T00:00:00
+2009-07-21T00:00:00
+2009-07-23T00:00:00
+2009-08-25T00:00:00
+2009-08-27T00:00:00
+2009-09-29T00:00:00
+2009-10-01T00:00:00
+2009-11-03T00:00:00
+2009-11-05T00:00:00
+2009-12-08T00:00:00
+2009-12-10T00:00:00
+2010-01-12T00:00:00
+2010-01-14T00:00:00
+2010-02-16T00:00:00
+2010-02-18T00:00:00
+2010-03-23T00:00:00
+2010-03-25T00:00:00
+2010-04-27T00:00:00
+2010-04-29T00:00:00
+2010-06-01T00:00:00
+2010-06-03T00:00:00
+2010-07-06T00:00:00
+2010-07-08T00:00:00
+2010-08-10T00:00:00
+2010-08-12T00:00:00
+2010-09-14T00:00:00
+2010-09-16T00:00:00
+2010-10-19T00:00:00
+2010-10-21T00:00:00
+2010-11-23T00:00:00
+2010-11-25T00:00:00
+2010-12-28T00:00:00
+2010-12-30T00:00:00
+2011-02-01T00:00:00
+2011-02-03T00:00:00
+2011-03-08T00:00:00
+2011-03-10T00:00:00
+2011-04-12T00:00:00
+2011-04-14T00:00:00
+2011-05-17T00:00:00
+2011-05-19T00:00:00
+2011-06-21T00:00:00
+2011-06-23T00:00:00
+2011-07-26T00:00:00
+2011-07-28T00:00:00
+2011-08-30T00:00:00
+2011-09-01T00:00:00
+2011-10-04T00:00:00
+2011-10-06T00:00:00
+2011-11-08T00:00:00
+2011-11-10T00:00:00
+2011-12-13T00:00:00
+2011-12-15T00:00:00
+2012-01-17T00:00:00
+2012-01-19T00:00:00
+2012-02-21T00:00:00
+2012-02-23T00:00:00
+2012-03-27T00:00:00
+2012-03-29T00:00:00
+2012-05-01T00:00:00
+2012-05-03T00:00:00
+2012-06-05T00:00:00
+2012-06-07T00:00:00
+2012-07-10T00:00:00
+2012-07-12T00:00:00
+2012-08-14T00:00:00
+2012-08-16T00:00:00
+2012-09-18T00:00:00
+2012-09-20T00:00:00
+2012-10-23T00:00:00
+2012-10-25T00:00:00
+2012-11-27T00:00:00
+2012-11-29T00:00:00
+2013-01-01T00:00:00
+2013-01-03T00:00:00
+2013-02-05T00:00:00
+2013-02-07T00:00:00
+2013-03-12T00:00:00
+2013-03-14T00:00:00
+2013-04-16T00:00:00
+2013-04-18T00:00:00
+2013-05-21T00:00:00
+2013-05-23T00:00:00
+2013-06-25T00:00:00
+2013-06-27T00:00:00
+2013-07-30T00:00:00
+2013-08-01T00:00:00
+2013-09-03T00:00:00
+2013-09-05T00:00:00
+2013-10-08T00:00:00
+2013-10-10T00:00:00
+2013-11-12T00:00:00
+2013-11-14T00:00:00
+2013-12-17T00:00:00
+2013-12-19T00:00:00
+2014-01-21T00:00:00
+2014-01-23T00:00:00
+2014-02-25T00:00:00
+2014-02-27T00:00:00
+2014-04-01T00:00:00
+2014-04-03T00:00:00
+2014-05-06T00:00:00
+2014-05-08T00:00:00
+2014-06-10T00:00:00
+2014-06-12T00:00:00
+2014-07-15T00:00:00
+2014-07-17T00:00:00
+2014-08-19T00:00:00
+2014-08-21T00:00:00
+2014-09-23T00:00:00
+2014-09-25T00:00:00
+2014-10-28T00:00:00
+2014-10-30T00:00:00
+2014-12-02T00:00:00
+2014-12-04T00:00:00
+2015-01-06T00:00:00
+2015-01-08T00:00:00
+2015-02-10T00:00:00
+2015-02-12T00:00:00
+2015-03-17T00:00:00
+2015-03-19T00:00:00
+2015-04-21T00:00:00
+2015-04-23T00:00:00
+2015-05-26T00:00:00
+2015-05-28T00:00:00
+2015-06-30T00:00:00
+2015-07-02T00:00:00
+2015-08-04T00:00:00
+2015-08-06T00:00:00
+2015-09-08T00:00:00
+2015-09-10T00:00:00
+2015-10-13T00:00:00
+2015-10-15T00:00:00
+2015-11-17T00:00:00
+2015-11-19T00:00:00
+2015-12-22T00:00:00
+2015-12-24T00:00:00
+2016-01-26T00:00:00
+2016-01-28T00:00:00
+2016-03-01T00:00:00
+2016-03-03T00:00:00
+2016-04-05T00:00:00
+2016-04-07T00:00:00
+2016-05-10T00:00:00
+2016-05-12T00:00:00
+2016-06-14T00:00:00
+2016-06-16T00:00:00
+2016-07-19T00:00:00
+2016-07-21T00:00:00
+2016-08-23T00:00:00
+2016-08-25T00:00:00
+2016-09-27T00:00:00
+2016-09-29T00:00:00
+2016-11-01T00:00:00
+2016-11-03T00:00:00
+2016-12-06T00:00:00
+2016-12-08T00:00:00
+2017-01-10T00:00:00
+2017-01-12T00:00:00
+2017-02-14T00:00:00
+2017-02-16T00:00:00
+2017-03-21T00:00:00
+2017-03-23T00:00:00
+2017-04-25T00:00:00
+2017-04-27T00:00:00
+2017-05-30T00:00:00
+2017-06-01T00:00:00
+2017-07-04T00:00:00
+2017-07-06T00:00:00
+2017-08-08T00:00:00
+2017-08-10T00:00:00
+2017-09-12T00:00:00
+2017-09-14T00:00:00
+2017-10-17T00:00:00
+2017-10-19T00:00:00
+2017-11-21T00:00:00
+2017-11-23T00:00:00
+2017-12-26T00:00:00
+2017-12-28T00:00:00
+2018-01-30T00:00:00
+2018-02-01T00:00:00
+2018-03-06T00:00:00
+2018-03-08T00:00:00
+2018-04-10T00:00:00
+2018-04-12T00:00:00
+2018-05-15T00:00:00
+2018-05-17T00:00:00
+2018-06-19T00:00:00
+2018-06-21T00:00:00
+2018-07-24T00:00:00
+2018-07-26T00:00:00
+2018-08-28T00:00:00
+2018-08-30T00:00:00
+2018-10-02T00:00:00
+2018-10-04T00:00:00
+2018-11-06T00:00:00
+2018-11-08T00:00:00
+2018-12-11T00:00:00
+2018-12-13T00:00:00
+2019-01-15T00:00:00
+2019-01-17T00:00:00
+2019-02-19T00:00:00
+2019-02-21T00:00:00
+2019-03-26T00:00:00
+2019-03-28T00:00:00
+2019-04-30T00:00:00
+2019-05-02T00:00:00
+2019-06-04T00:00:00
+2019-06-06T00:00:00
+2019-07-09T00:00:00
+2019-07-11T00:00:00
+2019-08-13T00:00:00
+2019-08-15T00:00:00
+2019-09-17T00:00:00
+2019-09-19T00:00:00
+2019-10-22T00:00:00
+2019-10-24T00:00:00
+2019-11-26T00:00:00
+2019-11-28T00:00:00
+2019-12-31T00:00:00
+2020-01-02T00:00:00
+2020-02-04T00:00:00
+2020-02-06T00:00:00
+2020-03-10T00:00:00
+2020-03-12T00:00:00
+2020-04-14T00:00:00
+2020-04-16T00:00:00
+2020-05-19T00:00:00
+2020-05-21T00:00:00
+2020-06-23T00:00:00
+2020-06-25T00:00:00
+2020-07-28T00:00:00
+2020-07-30T00:00:00
+2020-09-01T00:00:00
+2020-09-03T00:00:00
+2020-10-06T00:00:00
+2020-10-08T00:00:00
+2020-11-10T00:00:00
+2020-11-12T00:00:00
+2020-12-15T00:00:00
+2020-12-17T00:00:00
+2021-01-19T00:00:00
+2021-01-21T00:00:00
+2021-02-23T00:00:00
+2021-02-25T00:00:00
+2021-03-30T00:00:00
+2021-04-01T00:00:00
+2021-05-04T00:00:00
+2021-05-06T00:00:00
+2021-06-08T00:00:00
+2021-06-10T00:00:00
+2021-07-13T00:00:00
+2021-07-15T00:00:00
+2021-08-17T00:00:00
+2021-08-19T00:00:00
+2021-09-21T00:00:00
+2021-09-23T00:00:00
+2021-10-26T00:00:00
+2021-10-28T00:00:00
+2021-11-30T00:00:00
+2021-12-02T00:00:00
+2022-01-04T00:00:00
+2022-01-06T00:00:00
+2022-02-08T00:00:00
+2022-02-10T00:00:00
+2022-03-15T00:00:00
+2022-03-17T00:00:00
+2022-04-19T00:00:00
+2022-04-21T00:00:00
+2022-05-24T00:00:00
+2022-05-26T00:00:00
+2022-06-28T00:00:00
+2022-06-30T00:00:00
+2022-08-02T00:00:00
+2022-08-04T00:00:00
+2022-09-06T00:00:00
+2022-09-08T00:00:00
+2022-10-11T00:00:00
+2022-10-13T00:00:00
+2022-11-15T00:00:00
+2022-11-17T00:00:00
+2022-12-20T00:00:00
+2022-12-22T00:00:00
+2023-01-24T00:00:00
+2023-01-26T00:00:00
+2023-02-28T00:00:00
+2023-03-02T00:00:00
+2023-04-04T00:00:00
+2023-04-06T00:00:00
+2023-05-09T00:00:00
+2023-05-11T00:00:00
+2023-06-13T00:00:00
+2023-06-15T00:00:00
+2023-07-18T00:00:00
+2023-07-20T00:00:00
+2023-08-22T00:00:00
+2023-08-24T00:00:00
+2023-09-26T00:00:00
+2023-09-28T00:00:00
+2023-10-31T00:00:00
+2023-11-02T00:00:00
+2023-12-05T00:00:00
+2023-12-07T00:00:00
+2024-01-09T00:00:00
+2024-01-11T00:00:00
+2024-02-13T00:00:00
+2024-02-15T00:00:00
+2024-03-19T00:00:00
+2024-03-21T00:00:00
+2024-04-23T00:00:00
+2024-04-25T00:00:00
+2024-05-28T00:00:00
+2024-05-30T00:00:00
+2024-07-02T00:00:00
+2024-07-04T00:00:00
+2024-08-06T00:00:00
+2024-08-08T00:00:00
+2024-09-10T00:00:00
+2024-09-12T00:00:00
+2024-10-15T00:00:00
+2024-10-17T00:00:00
+2024-11-19T00:00:00
+2024-11-21T00:00:00
+2024-12-24T00:00:00
+2024-12-26T00:00:00
+2025-01-28T00:00:00
+2025-01-30T00:00:00
+2025-03-04T00:00:00
+2025-03-06T00:00:00
+2025-04-08T00:00:00
+2025-04-10T00:00:00
+2025-05-13T00:00:00
+2025-05-15T00:00:00
+2025-06-17T00:00:00
+2025-06-19T00:00:00
+2025-07-22T00:00:00
+2025-07-24T00:00:00
+2025-08-26T00:00:00
+2025-08-28T00:00:00
+2025-09-30T00:00:00
+2025-10-02T00:00:00
+2025-11-04T00:00:00
+2025-11-06T00:00:00
+2025-12-09T00:00:00
+2025-12-11T00:00:00
+2026-01-13T00:00:00
+2026-01-15T00:00:00
+2026-02-17T00:00:00
+2026-02-19T00:00:00
+2026-03-24T00:00:00
+2026-03-26T00:00:00
+2026-04-28T00:00:00
+2026-04-30T00:00:00
+2026-06-02T00:00:00
+2026-06-04T00:00:00
+2026-07-07T00:00:00
+2026-07-09T00:00:00
+2026-08-11T00:00:00
+2026-08-13T00:00:00
+2026-09-15T00:00:00
+2026-09-17T00:00:00
+2026-10-20T00:00:00
+2026-10-22T00:00:00
+2026-11-24T00:00:00
+2026-11-26T00:00:00
+2026-12-29T00:00:00
+2026-12-31T00:00:00
+2027-02-02T00:00:00
+2027-02-04T00:00:00
+2027-03-09T00:00:00
+2027-03-11T00:00:00
+2027-04-13T00:00:00
+2027-04-15T00:00:00
+2027-05-18T00:00:00
+2027-05-20T00:00:00
+2027-06-22T00:00:00
+2027-06-24T00:00:00
+2027-07-27T00:00:00
+2027-07-29T00:00:00
+2027-08-31T00:00:00
+2027-09-02T00:00:00
+2027-10-05T00:00:00
+2027-10-07T00:00:00
+2027-11-09T00:00:00
+2027-11-11T00:00:00
+2027-12-14T00:00:00
+2027-12-16T00:00:00
+2028-01-18T00:00:00
+2028-01-20T00:00:00
+2028-02-22T00:00:00
+2028-02-24T00:00:00
+2028-03-28T00:00:00
+2028-03-30T00:00:00
+2028-05-02T00:00:00
+2028-05-04T00:00:00
+2028-06-06T00:00:00
+2028-06-08T00:00:00
+2028-07-11T00:00:00
+2028-07-13T00:00:00
+2028-08-15T00:00:00
+2028-08-17T00:00:00
+2028-09-19T00:00:00
+2028-09-21T00:00:00
+2028-10-24T00:00:00
+2028-10-26T00:00:00
+2028-11-28T00:00:00
+2028-11-30T00:00:00
+2029-01-02T00:00:00
+2029-01-04T00:00:00
+2029-02-06T00:00:00
+2029-02-08T00:00:00
+2029-03-13T00:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily11.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily11.ics.prev.ref
new file mode 100644
index 00000000..7f75da06
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily11.ics.prev.ref
@@ -0,0 +1,122 @@
+2010-12-30T00:00:00
+2010-12-28T00:00:00
+2010-11-25T00:00:00
+2010-11-23T00:00:00
+2010-10-21T00:00:00
+2010-10-19T00:00:00
+2010-09-16T00:00:00
+2010-09-14T00:00:00
+2010-08-12T00:00:00
+2010-08-10T00:00:00
+2010-07-08T00:00:00
+2010-07-06T00:00:00
+2010-06-03T00:00:00
+2010-06-01T00:00:00
+2010-04-29T00:00:00
+2010-04-27T00:00:00
+2010-03-25T00:00:00
+2010-03-23T00:00:00
+2010-02-18T00:00:00
+2010-02-16T00:00:00
+2010-01-14T00:00:00
+2010-01-12T00:00:00
+2009-12-10T00:00:00
+2009-12-08T00:00:00
+2009-11-05T00:00:00
+2009-11-03T00:00:00
+2009-10-01T00:00:00
+2009-09-29T00:00:00
+2009-08-27T00:00:00
+2009-08-25T00:00:00
+2009-07-23T00:00:00
+2009-07-21T00:00:00
+2009-06-18T00:00:00
+2009-06-16T00:00:00
+2009-05-14T00:00:00
+2009-05-12T00:00:00
+2009-04-09T00:00:00
+2009-04-07T00:00:00
+2009-03-05T00:00:00
+2009-03-03T00:00:00
+2009-01-29T00:00:00
+2009-01-27T00:00:00
+2008-12-25T00:00:00
+2008-12-23T00:00:00
+2008-11-20T00:00:00
+2008-11-18T00:00:00
+2008-10-16T00:00:00
+2008-10-14T00:00:00
+2008-09-11T00:00:00
+2008-09-09T00:00:00
+2008-08-07T00:00:00
+2008-08-05T00:00:00
+2008-07-03T00:00:00
+2008-07-01T00:00:00
+2008-05-29T00:00:00
+2008-05-27T00:00:00
+2008-04-24T00:00:00
+2008-04-22T00:00:00
+2008-03-20T00:00:00
+2008-03-18T00:00:00
+2008-02-14T00:00:00
+2008-02-12T00:00:00
+2008-01-10T00:00:00
+2008-01-08T00:00:00
+2007-12-06T00:00:00
+2007-12-04T00:00:00
+2007-11-01T00:00:00
+2007-10-30T00:00:00
+2007-09-27T00:00:00
+2007-09-25T00:00:00
+2007-08-23T00:00:00
+2007-08-21T00:00:00
+2007-07-19T00:00:00
+2007-07-17T00:00:00
+2007-06-14T00:00:00
+2007-06-12T00:00:00
+2007-05-10T00:00:00
+2007-05-08T00:00:00
+2007-04-05T00:00:00
+2007-04-03T00:00:00
+2007-03-01T00:00:00
+2007-02-27T00:00:00
+2007-01-25T00:00:00
+2007-01-23T00:00:00
+2006-12-21T00:00:00
+2006-12-19T00:00:00
+2006-11-16T00:00:00
+2006-11-14T00:00:00
+2006-10-12T00:00:00
+2006-10-10T00:00:00
+2006-09-07T00:00:00
+2006-09-05T00:00:00
+2006-08-03T00:00:00
+2006-08-01T00:00:00
+2006-06-29T00:00:00
+2006-06-27T00:00:00
+2006-05-25T00:00:00
+2006-05-23T00:00:00
+2006-04-20T00:00:00
+2006-04-18T00:00:00
+2006-03-16T00:00:00
+2006-03-14T00:00:00
+2006-02-09T00:00:00
+2006-02-07T00:00:00
+2006-01-05T00:00:00
+2006-01-03T00:00:00
+2005-12-01T00:00:00
+2005-11-29T00:00:00
+2005-10-27T00:00:00
+2005-10-25T00:00:00
+2005-09-22T00:00:00
+2005-09-20T00:00:00
+2005-08-18T00:00:00
+2005-08-16T00:00:00
+2005-07-14T00:00:00
+2005-07-12T00:00:00
+2005-06-09T00:00:00
+2005-06-07T00:00:00
+2005-05-05T00:00:00
+2005-05-03T00:00:00
+2005-04-01T00:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily11.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily11.ics.recurson.ref
new file mode 100644
index 00000000..1698d7d2
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily11.ics.recurson.ref
@@ -0,0 +1,500 @@
+2005-04-01
+2005-05-03
+2005-05-05
+2005-06-07
+2005-06-09
+2005-07-12
+2005-07-14
+2005-08-16
+2005-08-18
+2005-09-20
+2005-09-22
+2005-10-25
+2005-10-27
+2005-11-29
+2005-12-01
+2006-01-03
+2006-01-05
+2006-02-07
+2006-02-09
+2006-03-14
+2006-03-16
+2006-04-18
+2006-04-20
+2006-05-23
+2006-05-25
+2006-06-27
+2006-06-29
+2006-08-01
+2006-08-03
+2006-09-05
+2006-09-07
+2006-10-10
+2006-10-12
+2006-11-14
+2006-11-16
+2006-12-19
+2006-12-21
+2007-01-23
+2007-01-25
+2007-02-27
+2007-03-01
+2007-04-03
+2007-04-05
+2007-05-08
+2007-05-10
+2007-06-12
+2007-06-14
+2007-07-17
+2007-07-19
+2007-08-21
+2007-08-23
+2007-09-25
+2007-09-27
+2007-10-30
+2007-11-01
+2007-12-04
+2007-12-06
+2008-01-08
+2008-01-10
+2008-02-12
+2008-02-14
+2008-03-18
+2008-03-20
+2008-04-22
+2008-04-24
+2008-05-27
+2008-05-29
+2008-07-01
+2008-07-03
+2008-08-05
+2008-08-07
+2008-09-09
+2008-09-11
+2008-10-14
+2008-10-16
+2008-11-18
+2008-11-20
+2008-12-23
+2008-12-25
+2009-01-27
+2009-01-29
+2009-03-03
+2009-03-05
+2009-04-07
+2009-04-09
+2009-05-12
+2009-05-14
+2009-06-16
+2009-06-18
+2009-07-21
+2009-07-23
+2009-08-25
+2009-08-27
+2009-09-29
+2009-10-01
+2009-11-03
+2009-11-05
+2009-12-08
+2009-12-10
+2010-01-12
+2010-01-14
+2010-02-16
+2010-02-18
+2010-03-23
+2010-03-25
+2010-04-27
+2010-04-29
+2010-06-01
+2010-06-03
+2010-07-06
+2010-07-08
+2010-08-10
+2010-08-12
+2010-09-14
+2010-09-16
+2010-10-19
+2010-10-21
+2010-11-23
+2010-11-25
+2010-12-28
+2010-12-30
+2011-02-01
+2011-02-03
+2011-03-08
+2011-03-10
+2011-04-12
+2011-04-14
+2011-05-17
+2011-05-19
+2011-06-21
+2011-06-23
+2011-07-26
+2011-07-28
+2011-08-30
+2011-09-01
+2011-10-04
+2011-10-06
+2011-11-08
+2011-11-10
+2011-12-13
+2011-12-15
+2012-01-17
+2012-01-19
+2012-02-21
+2012-02-23
+2012-03-27
+2012-03-29
+2012-05-01
+2012-05-03
+2012-06-05
+2012-06-07
+2012-07-10
+2012-07-12
+2012-08-14
+2012-08-16
+2012-09-18
+2012-09-20
+2012-10-23
+2012-10-25
+2012-11-27
+2012-11-29
+2013-01-01
+2013-01-03
+2013-02-05
+2013-02-07
+2013-03-12
+2013-03-14
+2013-04-16
+2013-04-18
+2013-05-21
+2013-05-23
+2013-06-25
+2013-06-27
+2013-07-30
+2013-08-01
+2013-09-03
+2013-09-05
+2013-10-08
+2013-10-10
+2013-11-12
+2013-11-14
+2013-12-17
+2013-12-19
+2014-01-21
+2014-01-23
+2014-02-25
+2014-02-27
+2014-04-01
+2014-04-03
+2014-05-06
+2014-05-08
+2014-06-10
+2014-06-12
+2014-07-15
+2014-07-17
+2014-08-19
+2014-08-21
+2014-09-23
+2014-09-25
+2014-10-28
+2014-10-30
+2014-12-02
+2014-12-04
+2015-01-06
+2015-01-08
+2015-02-10
+2015-02-12
+2015-03-17
+2015-03-19
+2015-04-21
+2015-04-23
+2015-05-26
+2015-05-28
+2015-06-30
+2015-07-02
+2015-08-04
+2015-08-06
+2015-09-08
+2015-09-10
+2015-10-13
+2015-10-15
+2015-11-17
+2015-11-19
+2015-12-22
+2015-12-24
+2016-01-26
+2016-01-28
+2016-03-01
+2016-03-03
+2016-04-05
+2016-04-07
+2016-05-10
+2016-05-12
+2016-06-14
+2016-06-16
+2016-07-19
+2016-07-21
+2016-08-23
+2016-08-25
+2016-09-27
+2016-09-29
+2016-11-01
+2016-11-03
+2016-12-06
+2016-12-08
+2017-01-10
+2017-01-12
+2017-02-14
+2017-02-16
+2017-03-21
+2017-03-23
+2017-04-25
+2017-04-27
+2017-05-30
+2017-06-01
+2017-07-04
+2017-07-06
+2017-08-08
+2017-08-10
+2017-09-12
+2017-09-14
+2017-10-17
+2017-10-19
+2017-11-21
+2017-11-23
+2017-12-26
+2017-12-28
+2018-01-30
+2018-02-01
+2018-03-06
+2018-03-08
+2018-04-10
+2018-04-12
+2018-05-15
+2018-05-17
+2018-06-19
+2018-06-21
+2018-07-24
+2018-07-26
+2018-08-28
+2018-08-30
+2018-10-02
+2018-10-04
+2018-11-06
+2018-11-08
+2018-12-11
+2018-12-13
+2019-01-15
+2019-01-17
+2019-02-19
+2019-02-21
+2019-03-26
+2019-03-28
+2019-04-30
+2019-05-02
+2019-06-04
+2019-06-06
+2019-07-09
+2019-07-11
+2019-08-13
+2019-08-15
+2019-09-17
+2019-09-19
+2019-10-22
+2019-10-24
+2019-11-26
+2019-11-28
+2019-12-31
+2020-01-02
+2020-02-04
+2020-02-06
+2020-03-10
+2020-03-12
+2020-04-14
+2020-04-16
+2020-05-19
+2020-05-21
+2020-06-23
+2020-06-25
+2020-07-28
+2020-07-30
+2020-09-01
+2020-09-03
+2020-10-06
+2020-10-08
+2020-11-10
+2020-11-12
+2020-12-15
+2020-12-17
+2021-01-19
+2021-01-21
+2021-02-23
+2021-02-25
+2021-03-30
+2021-04-01
+2021-05-04
+2021-05-06
+2021-06-08
+2021-06-10
+2021-07-13
+2021-07-15
+2021-08-17
+2021-08-19
+2021-09-21
+2021-09-23
+2021-10-26
+2021-10-28
+2021-11-30
+2021-12-02
+2022-01-04
+2022-01-06
+2022-02-08
+2022-02-10
+2022-03-15
+2022-03-17
+2022-04-19
+2022-04-21
+2022-05-24
+2022-05-26
+2022-06-28
+2022-06-30
+2022-08-02
+2022-08-04
+2022-09-06
+2022-09-08
+2022-10-11
+2022-10-13
+2022-11-15
+2022-11-17
+2022-12-20
+2022-12-22
+2023-01-24
+2023-01-26
+2023-02-28
+2023-03-02
+2023-04-04
+2023-04-06
+2023-05-09
+2023-05-11
+2023-06-13
+2023-06-15
+2023-07-18
+2023-07-20
+2023-08-22
+2023-08-24
+2023-09-26
+2023-09-28
+2023-10-31
+2023-11-02
+2023-12-05
+2023-12-07
+2024-01-09
+2024-01-11
+2024-02-13
+2024-02-15
+2024-03-19
+2024-03-21
+2024-04-23
+2024-04-25
+2024-05-28
+2024-05-30
+2024-07-02
+2024-07-04
+2024-08-06
+2024-08-08
+2024-09-10
+2024-09-12
+2024-10-15
+2024-10-17
+2024-11-19
+2024-11-21
+2024-12-24
+2024-12-26
+2025-01-28
+2025-01-30
+2025-03-04
+2025-03-06
+2025-04-08
+2025-04-10
+2025-05-13
+2025-05-15
+2025-06-17
+2025-06-19
+2025-07-22
+2025-07-24
+2025-08-26
+2025-08-28
+2025-09-30
+2025-10-02
+2025-11-04
+2025-11-06
+2025-12-09
+2025-12-11
+2026-01-13
+2026-01-15
+2026-02-17
+2026-02-19
+2026-03-24
+2026-03-26
+2026-04-28
+2026-04-30
+2026-06-02
+2026-06-04
+2026-07-07
+2026-07-09
+2026-08-11
+2026-08-13
+2026-09-15
+2026-09-17
+2026-10-20
+2026-10-22
+2026-11-24
+2026-11-26
+2026-12-29
+2026-12-31
+2027-02-02
+2027-02-04
+2027-03-09
+2027-03-11
+2027-04-13
+2027-04-15
+2027-05-18
+2027-05-20
+2027-06-22
+2027-06-24
+2027-07-27
+2027-07-29
+2027-08-31
+2027-09-02
+2027-10-05
+2027-10-07
+2027-11-09
+2027-11-11
+2027-12-14
+2027-12-16
+2028-01-18
+2028-01-20
+2028-02-22
+2028-02-24
+2028-03-28
+2028-03-30
+2028-05-02
+2028-05-04
+2028-06-06
+2028-06-08
+2028-07-11
+2028-07-13
+2028-08-15
+2028-08-17
+2028-09-19
+2028-09-21
+2028-10-24
+2028-10-26
+2028-11-28
+2028-11-30
+2029-01-02
+2029-01-04
+2029-02-06
+2029-02-08
+2029-03-13
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily2.ics b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily2.ics
new file mode 100644
index 00000000..349a6438
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily2.ics
@@ -0,0 +1,31 @@
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+VERSION:2.0
+PRODID:-//MH Software Inc//Connect Daily - 3.0.7//EN
+X-LibKCal-Testsuite-OutTZ:America/Denver
+
+BEGIN:VTIMEZONE
+TZID:America/Denver
+BEGIN:STANDARD
+DTSTART:19671029T020000
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE
+
+BEGIN:VEVENT
+UID:1206@67.154.139.115
+RECURRENCE-ID:19700101T070000Z
+SUMMARY:1st and 3rd Monday
+DTSTART;TZID=America/Denver;VALUE=DATE:20040503
+RRULE:FREQ=MONTHLY;BYDAY=1MO,3MO
+DURATION:P1D
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily2.ics.next.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily2.ics.next.ref
new file mode 100644
index 00000000..0a97b833
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily2.ics.next.ref
@@ -0,0 +1,500 @@
+2004-05-03T00:00:00
+2004-05-17T00:00:00
+2004-06-07T00:00:00
+2004-06-21T00:00:00
+2004-07-05T00:00:00
+2004-07-19T00:00:00
+2004-08-02T00:00:00
+2004-08-16T00:00:00
+2004-09-06T00:00:00
+2004-09-20T00:00:00
+2004-10-04T00:00:00
+2004-10-18T00:00:00
+2004-11-01T00:00:00
+2004-11-15T00:00:00
+2004-12-06T00:00:00
+2004-12-20T00:00:00
+2005-01-03T00:00:00
+2005-01-17T00:00:00
+2005-02-07T00:00:00
+2005-02-21T00:00:00
+2005-03-07T00:00:00
+2005-03-21T00:00:00
+2005-04-04T00:00:00
+2005-04-18T00:00:00
+2005-05-02T00:00:00
+2005-05-16T00:00:00
+2005-06-06T00:00:00
+2005-06-20T00:00:00
+2005-07-04T00:00:00
+2005-07-18T00:00:00
+2005-08-01T00:00:00
+2005-08-15T00:00:00
+2005-09-05T00:00:00
+2005-09-19T00:00:00
+2005-10-03T00:00:00
+2005-10-17T00:00:00
+2005-11-07T00:00:00
+2005-11-21T00:00:00
+2005-12-05T00:00:00
+2005-12-19T00:00:00
+2006-01-02T00:00:00
+2006-01-16T00:00:00
+2006-02-06T00:00:00
+2006-02-20T00:00:00
+2006-03-06T00:00:00
+2006-03-20T00:00:00
+2006-04-03T00:00:00
+2006-04-17T00:00:00
+2006-05-01T00:00:00
+2006-05-15T00:00:00
+2006-06-05T00:00:00
+2006-06-19T00:00:00
+2006-07-03T00:00:00
+2006-07-17T00:00:00
+2006-08-07T00:00:00
+2006-08-21T00:00:00
+2006-09-04T00:00:00
+2006-09-18T00:00:00
+2006-10-02T00:00:00
+2006-10-16T00:00:00
+2006-11-06T00:00:00
+2006-11-20T00:00:00
+2006-12-04T00:00:00
+2006-12-18T00:00:00
+2007-01-01T00:00:00
+2007-01-15T00:00:00
+2007-02-05T00:00:00
+2007-02-19T00:00:00
+2007-03-05T00:00:00
+2007-03-19T00:00:00
+2007-04-02T00:00:00
+2007-04-16T00:00:00
+2007-05-07T00:00:00
+2007-05-21T00:00:00
+2007-06-04T00:00:00
+2007-06-18T00:00:00
+2007-07-02T00:00:00
+2007-07-16T00:00:00
+2007-08-06T00:00:00
+2007-08-20T00:00:00
+2007-09-03T00:00:00
+2007-09-17T00:00:00
+2007-10-01T00:00:00
+2007-10-15T00:00:00
+2007-11-05T00:00:00
+2007-11-19T00:00:00
+2007-12-03T00:00:00
+2007-12-17T00:00:00
+2008-01-07T00:00:00
+2008-01-21T00:00:00
+2008-02-04T00:00:00
+2008-02-18T00:00:00
+2008-03-03T00:00:00
+2008-03-17T00:00:00
+2008-04-07T00:00:00
+2008-04-21T00:00:00
+2008-05-05T00:00:00
+2008-05-19T00:00:00
+2008-06-02T00:00:00
+2008-06-16T00:00:00
+2008-07-07T00:00:00
+2008-07-21T00:00:00
+2008-08-04T00:00:00
+2008-08-18T00:00:00
+2008-09-01T00:00:00
+2008-09-15T00:00:00
+2008-10-06T00:00:00
+2008-10-20T00:00:00
+2008-11-03T00:00:00
+2008-11-17T00:00:00
+2008-12-01T00:00:00
+2008-12-15T00:00:00
+2009-01-05T00:00:00
+2009-01-19T00:00:00
+2009-02-02T00:00:00
+2009-02-16T00:00:00
+2009-03-02T00:00:00
+2009-03-16T00:00:00
+2009-04-06T00:00:00
+2009-04-20T00:00:00
+2009-05-04T00:00:00
+2009-05-18T00:00:00
+2009-06-01T00:00:00
+2009-06-15T00:00:00
+2009-07-06T00:00:00
+2009-07-20T00:00:00
+2009-08-03T00:00:00
+2009-08-17T00:00:00
+2009-09-07T00:00:00
+2009-09-21T00:00:00
+2009-10-05T00:00:00
+2009-10-19T00:00:00
+2009-11-02T00:00:00
+2009-11-16T00:00:00
+2009-12-07T00:00:00
+2009-12-21T00:00:00
+2010-01-04T00:00:00
+2010-01-18T00:00:00
+2010-02-01T00:00:00
+2010-02-15T00:00:00
+2010-03-01T00:00:00
+2010-03-15T00:00:00
+2010-04-05T00:00:00
+2010-04-19T00:00:00
+2010-05-03T00:00:00
+2010-05-17T00:00:00
+2010-06-07T00:00:00
+2010-06-21T00:00:00
+2010-07-05T00:00:00
+2010-07-19T00:00:00
+2010-08-02T00:00:00
+2010-08-16T00:00:00
+2010-09-06T00:00:00
+2010-09-20T00:00:00
+2010-10-04T00:00:00
+2010-10-18T00:00:00
+2010-11-01T00:00:00
+2010-11-15T00:00:00
+2010-12-06T00:00:00
+2010-12-20T00:00:00
+2011-01-03T00:00:00
+2011-01-17T00:00:00
+2011-02-07T00:00:00
+2011-02-21T00:00:00
+2011-03-07T00:00:00
+2011-03-21T00:00:00
+2011-04-04T00:00:00
+2011-04-18T00:00:00
+2011-05-02T00:00:00
+2011-05-16T00:00:00
+2011-06-06T00:00:00
+2011-06-20T00:00:00
+2011-07-04T00:00:00
+2011-07-18T00:00:00
+2011-08-01T00:00:00
+2011-08-15T00:00:00
+2011-09-05T00:00:00
+2011-09-19T00:00:00
+2011-10-03T00:00:00
+2011-10-17T00:00:00
+2011-11-07T00:00:00
+2011-11-21T00:00:00
+2011-12-05T00:00:00
+2011-12-19T00:00:00
+2012-01-02T00:00:00
+2012-01-16T00:00:00
+2012-02-06T00:00:00
+2012-02-20T00:00:00
+2012-03-05T00:00:00
+2012-03-19T00:00:00
+2012-04-02T00:00:00
+2012-04-16T00:00:00
+2012-05-07T00:00:00
+2012-05-21T00:00:00
+2012-06-04T00:00:00
+2012-06-18T00:00:00
+2012-07-02T00:00:00
+2012-07-16T00:00:00
+2012-08-06T00:00:00
+2012-08-20T00:00:00
+2012-09-03T00:00:00
+2012-09-17T00:00:00
+2012-10-01T00:00:00
+2012-10-15T00:00:00
+2012-11-05T00:00:00
+2012-11-19T00:00:00
+2012-12-03T00:00:00
+2012-12-17T00:00:00
+2013-01-07T00:00:00
+2013-01-21T00:00:00
+2013-02-04T00:00:00
+2013-02-18T00:00:00
+2013-03-04T00:00:00
+2013-03-18T00:00:00
+2013-04-01T00:00:00
+2013-04-15T00:00:00
+2013-05-06T00:00:00
+2013-05-20T00:00:00
+2013-06-03T00:00:00
+2013-06-17T00:00:00
+2013-07-01T00:00:00
+2013-07-15T00:00:00
+2013-08-05T00:00:00
+2013-08-19T00:00:00
+2013-09-02T00:00:00
+2013-09-16T00:00:00
+2013-10-07T00:00:00
+2013-10-21T00:00:00
+2013-11-04T00:00:00
+2013-11-18T00:00:00
+2013-12-02T00:00:00
+2013-12-16T00:00:00
+2014-01-06T00:00:00
+2014-01-20T00:00:00
+2014-02-03T00:00:00
+2014-02-17T00:00:00
+2014-03-03T00:00:00
+2014-03-17T00:00:00
+2014-04-07T00:00:00
+2014-04-21T00:00:00
+2014-05-05T00:00:00
+2014-05-19T00:00:00
+2014-06-02T00:00:00
+2014-06-16T00:00:00
+2014-07-07T00:00:00
+2014-07-21T00:00:00
+2014-08-04T00:00:00
+2014-08-18T00:00:00
+2014-09-01T00:00:00
+2014-09-15T00:00:00
+2014-10-06T00:00:00
+2014-10-20T00:00:00
+2014-11-03T00:00:00
+2014-11-17T00:00:00
+2014-12-01T00:00:00
+2014-12-15T00:00:00
+2015-01-05T00:00:00
+2015-01-19T00:00:00
+2015-02-02T00:00:00
+2015-02-16T00:00:00
+2015-03-02T00:00:00
+2015-03-16T00:00:00
+2015-04-06T00:00:00
+2015-04-20T00:00:00
+2015-05-04T00:00:00
+2015-05-18T00:00:00
+2015-06-01T00:00:00
+2015-06-15T00:00:00
+2015-07-06T00:00:00
+2015-07-20T00:00:00
+2015-08-03T00:00:00
+2015-08-17T00:00:00
+2015-09-07T00:00:00
+2015-09-21T00:00:00
+2015-10-05T00:00:00
+2015-10-19T00:00:00
+2015-11-02T00:00:00
+2015-11-16T00:00:00
+2015-12-07T00:00:00
+2015-12-21T00:00:00
+2016-01-04T00:00:00
+2016-01-18T00:00:00
+2016-02-01T00:00:00
+2016-02-15T00:00:00
+2016-03-07T00:00:00
+2016-03-21T00:00:00
+2016-04-04T00:00:00
+2016-04-18T00:00:00
+2016-05-02T00:00:00
+2016-05-16T00:00:00
+2016-06-06T00:00:00
+2016-06-20T00:00:00
+2016-07-04T00:00:00
+2016-07-18T00:00:00
+2016-08-01T00:00:00
+2016-08-15T00:00:00
+2016-09-05T00:00:00
+2016-09-19T00:00:00
+2016-10-03T00:00:00
+2016-10-17T00:00:00
+2016-11-07T00:00:00
+2016-11-21T00:00:00
+2016-12-05T00:00:00
+2016-12-19T00:00:00
+2017-01-02T00:00:00
+2017-01-16T00:00:00
+2017-02-06T00:00:00
+2017-02-20T00:00:00
+2017-03-06T00:00:00
+2017-03-20T00:00:00
+2017-04-03T00:00:00
+2017-04-17T00:00:00
+2017-05-01T00:00:00
+2017-05-15T00:00:00
+2017-06-05T00:00:00
+2017-06-19T00:00:00
+2017-07-03T00:00:00
+2017-07-17T00:00:00
+2017-08-07T00:00:00
+2017-08-21T00:00:00
+2017-09-04T00:00:00
+2017-09-18T00:00:00
+2017-10-02T00:00:00
+2017-10-16T00:00:00
+2017-11-06T00:00:00
+2017-11-20T00:00:00
+2017-12-04T00:00:00
+2017-12-18T00:00:00
+2018-01-01T00:00:00
+2018-01-15T00:00:00
+2018-02-05T00:00:00
+2018-02-19T00:00:00
+2018-03-05T00:00:00
+2018-03-19T00:00:00
+2018-04-02T00:00:00
+2018-04-16T00:00:00
+2018-05-07T00:00:00
+2018-05-21T00:00:00
+2018-06-04T00:00:00
+2018-06-18T00:00:00
+2018-07-02T00:00:00
+2018-07-16T00:00:00
+2018-08-06T00:00:00
+2018-08-20T00:00:00
+2018-09-03T00:00:00
+2018-09-17T00:00:00
+2018-10-01T00:00:00
+2018-10-15T00:00:00
+2018-11-05T00:00:00
+2018-11-19T00:00:00
+2018-12-03T00:00:00
+2018-12-17T00:00:00
+2019-01-07T00:00:00
+2019-01-21T00:00:00
+2019-02-04T00:00:00
+2019-02-18T00:00:00
+2019-03-04T00:00:00
+2019-03-18T00:00:00
+2019-04-01T00:00:00
+2019-04-15T00:00:00
+2019-05-06T00:00:00
+2019-05-20T00:00:00
+2019-06-03T00:00:00
+2019-06-17T00:00:00
+2019-07-01T00:00:00
+2019-07-15T00:00:00
+2019-08-05T00:00:00
+2019-08-19T00:00:00
+2019-09-02T00:00:00
+2019-09-16T00:00:00
+2019-10-07T00:00:00
+2019-10-21T00:00:00
+2019-11-04T00:00:00
+2019-11-18T00:00:00
+2019-12-02T00:00:00
+2019-12-16T00:00:00
+2020-01-06T00:00:00
+2020-01-20T00:00:00
+2020-02-03T00:00:00
+2020-02-17T00:00:00
+2020-03-02T00:00:00
+2020-03-16T00:00:00
+2020-04-06T00:00:00
+2020-04-20T00:00:00
+2020-05-04T00:00:00
+2020-05-18T00:00:00
+2020-06-01T00:00:00
+2020-06-15T00:00:00
+2020-07-06T00:00:00
+2020-07-20T00:00:00
+2020-08-03T00:00:00
+2020-08-17T00:00:00
+2020-09-07T00:00:00
+2020-09-21T00:00:00
+2020-10-05T00:00:00
+2020-10-19T00:00:00
+2020-11-02T00:00:00
+2020-11-16T00:00:00
+2020-12-07T00:00:00
+2020-12-21T00:00:00
+2021-01-04T00:00:00
+2021-01-18T00:00:00
+2021-02-01T00:00:00
+2021-02-15T00:00:00
+2021-03-01T00:00:00
+2021-03-15T00:00:00
+2021-04-05T00:00:00
+2021-04-19T00:00:00
+2021-05-03T00:00:00
+2021-05-17T00:00:00
+2021-06-07T00:00:00
+2021-06-21T00:00:00
+2021-07-05T00:00:00
+2021-07-19T00:00:00
+2021-08-02T00:00:00
+2021-08-16T00:00:00
+2021-09-06T00:00:00
+2021-09-20T00:00:00
+2021-10-04T00:00:00
+2021-10-18T00:00:00
+2021-11-01T00:00:00
+2021-11-15T00:00:00
+2021-12-06T00:00:00
+2021-12-20T00:00:00
+2022-01-03T00:00:00
+2022-01-17T00:00:00
+2022-02-07T00:00:00
+2022-02-21T00:00:00
+2022-03-07T00:00:00
+2022-03-21T00:00:00
+2022-04-04T00:00:00
+2022-04-18T00:00:00
+2022-05-02T00:00:00
+2022-05-16T00:00:00
+2022-06-06T00:00:00
+2022-06-20T00:00:00
+2022-07-04T00:00:00
+2022-07-18T00:00:00
+2022-08-01T00:00:00
+2022-08-15T00:00:00
+2022-09-05T00:00:00
+2022-09-19T00:00:00
+2022-10-03T00:00:00
+2022-10-17T00:00:00
+2022-11-07T00:00:00
+2022-11-21T00:00:00
+2022-12-05T00:00:00
+2022-12-19T00:00:00
+2023-01-02T00:00:00
+2023-01-16T00:00:00
+2023-02-06T00:00:00
+2023-02-20T00:00:00
+2023-03-06T00:00:00
+2023-03-20T00:00:00
+2023-04-03T00:00:00
+2023-04-17T00:00:00
+2023-05-01T00:00:00
+2023-05-15T00:00:00
+2023-06-05T00:00:00
+2023-06-19T00:00:00
+2023-07-03T00:00:00
+2023-07-17T00:00:00
+2023-08-07T00:00:00
+2023-08-21T00:00:00
+2023-09-04T00:00:00
+2023-09-18T00:00:00
+2023-10-02T00:00:00
+2023-10-16T00:00:00
+2023-11-06T00:00:00
+2023-11-20T00:00:00
+2023-12-04T00:00:00
+2023-12-18T00:00:00
+2024-01-01T00:00:00
+2024-01-15T00:00:00
+2024-02-05T00:00:00
+2024-02-19T00:00:00
+2024-03-04T00:00:00
+2024-03-18T00:00:00
+2024-04-01T00:00:00
+2024-04-15T00:00:00
+2024-05-06T00:00:00
+2024-05-20T00:00:00
+2024-06-03T00:00:00
+2024-06-17T00:00:00
+2024-07-01T00:00:00
+2024-07-15T00:00:00
+2024-08-05T00:00:00
+2024-08-19T00:00:00
+2024-09-02T00:00:00
+2024-09-16T00:00:00
+2024-10-07T00:00:00
+2024-10-21T00:00:00
+2024-11-04T00:00:00
+2024-11-18T00:00:00
+2024-12-02T00:00:00
+2024-12-16T00:00:00
+2025-01-06T00:00:00
+2025-01-20T00:00:00
+2025-02-03T00:00:00
+2025-02-17T00:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily2.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily2.ics.prev.ref
new file mode 100644
index 00000000..8d5ed114
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily2.ics.prev.ref
@@ -0,0 +1,161 @@
+2010-12-20T00:00:00
+2010-12-06T00:00:00
+2010-11-15T00:00:00
+2010-11-01T00:00:00
+2010-10-18T00:00:00
+2010-10-04T00:00:00
+2010-09-20T00:00:00
+2010-09-06T00:00:00
+2010-08-16T00:00:00
+2010-08-02T00:00:00
+2010-07-19T00:00:00
+2010-07-05T00:00:00
+2010-06-21T00:00:00
+2010-06-07T00:00:00
+2010-05-17T00:00:00
+2010-05-03T00:00:00
+2010-04-19T00:00:00
+2010-04-05T00:00:00
+2010-03-15T00:00:00
+2010-03-01T00:00:00
+2010-02-15T00:00:00
+2010-02-01T00:00:00
+2010-01-18T00:00:00
+2010-01-04T00:00:00
+2009-12-21T00:00:00
+2009-12-07T00:00:00
+2009-11-16T00:00:00
+2009-11-02T00:00:00
+2009-10-19T00:00:00
+2009-10-05T00:00:00
+2009-09-21T00:00:00
+2009-09-07T00:00:00
+2009-08-17T00:00:00
+2009-08-03T00:00:00
+2009-07-20T00:00:00
+2009-07-06T00:00:00
+2009-06-15T00:00:00
+2009-06-01T00:00:00
+2009-05-18T00:00:00
+2009-05-04T00:00:00
+2009-04-20T00:00:00
+2009-04-06T00:00:00
+2009-03-16T00:00:00
+2009-03-02T00:00:00
+2009-02-16T00:00:00
+2009-02-02T00:00:00
+2009-01-19T00:00:00
+2009-01-05T00:00:00
+2008-12-15T00:00:00
+2008-12-01T00:00:00
+2008-11-17T00:00:00
+2008-11-03T00:00:00
+2008-10-20T00:00:00
+2008-10-06T00:00:00
+2008-09-15T00:00:00
+2008-09-01T00:00:00
+2008-08-18T00:00:00
+2008-08-04T00:00:00
+2008-07-21T00:00:00
+2008-07-07T00:00:00
+2008-06-16T00:00:00
+2008-06-02T00:00:00
+2008-05-19T00:00:00
+2008-05-05T00:00:00
+2008-04-21T00:00:00
+2008-04-07T00:00:00
+2008-03-17T00:00:00
+2008-03-03T00:00:00
+2008-02-18T00:00:00
+2008-02-04T00:00:00
+2008-01-21T00:00:00
+2008-01-07T00:00:00
+2007-12-17T00:00:00
+2007-12-03T00:00:00
+2007-11-19T00:00:00
+2007-11-05T00:00:00
+2007-10-15T00:00:00
+2007-10-01T00:00:00
+2007-09-17T00:00:00
+2007-09-03T00:00:00
+2007-08-20T00:00:00
+2007-08-06T00:00:00
+2007-07-16T00:00:00
+2007-07-02T00:00:00
+2007-06-18T00:00:00
+2007-06-04T00:00:00
+2007-05-21T00:00:00
+2007-05-07T00:00:00
+2007-04-16T00:00:00
+2007-04-02T00:00:00
+2007-03-19T00:00:00
+2007-03-05T00:00:00
+2007-02-19T00:00:00
+2007-02-05T00:00:00
+2007-01-15T00:00:00
+2007-01-01T00:00:00
+2006-12-18T00:00:00
+2006-12-04T00:00:00
+2006-11-20T00:00:00
+2006-11-06T00:00:00
+2006-10-16T00:00:00
+2006-10-02T00:00:00
+2006-09-18T00:00:00
+2006-09-04T00:00:00
+2006-08-21T00:00:00
+2006-08-07T00:00:00
+2006-07-17T00:00:00
+2006-07-03T00:00:00
+2006-06-19T00:00:00
+2006-06-05T00:00:00
+2006-05-15T00:00:00
+2006-05-01T00:00:00
+2006-04-17T00:00:00
+2006-04-03T00:00:00
+2006-03-20T00:00:00
+2006-03-06T00:00:00
+2006-02-20T00:00:00
+2006-02-06T00:00:00
+2006-01-16T00:00:00
+2006-01-02T00:00:00
+2005-12-19T00:00:00
+2005-12-05T00:00:00
+2005-11-21T00:00:00
+2005-11-07T00:00:00
+2005-10-17T00:00:00
+2005-10-03T00:00:00
+2005-09-19T00:00:00
+2005-09-05T00:00:00
+2005-08-15T00:00:00
+2005-08-01T00:00:00
+2005-07-18T00:00:00
+2005-07-04T00:00:00
+2005-06-20T00:00:00
+2005-06-06T00:00:00
+2005-05-16T00:00:00
+2005-05-02T00:00:00
+2005-04-18T00:00:00
+2005-04-04T00:00:00
+2005-03-21T00:00:00
+2005-03-07T00:00:00
+2005-02-21T00:00:00
+2005-02-07T00:00:00
+2005-01-17T00:00:00
+2005-01-03T00:00:00
+2004-12-20T00:00:00
+2004-12-06T00:00:00
+2004-11-15T00:00:00
+2004-11-01T00:00:00
+2004-10-18T00:00:00
+2004-10-04T00:00:00
+2004-09-20T00:00:00
+2004-09-06T00:00:00
+2004-08-16T00:00:00
+2004-08-02T00:00:00
+2004-07-19T00:00:00
+2004-07-05T00:00:00
+2004-06-21T00:00:00
+2004-06-07T00:00:00
+2004-05-17T00:00:00
+2004-05-03T00:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily2.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily2.ics.recurson.ref
new file mode 100644
index 00000000..87c5ade5
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily2.ics.recurson.ref
@@ -0,0 +1,500 @@
+2004-05-03
+2004-05-17
+2004-06-07
+2004-06-21
+2004-07-05
+2004-07-19
+2004-08-02
+2004-08-16
+2004-09-06
+2004-09-20
+2004-10-04
+2004-10-18
+2004-11-01
+2004-11-15
+2004-12-06
+2004-12-20
+2005-01-03
+2005-01-17
+2005-02-07
+2005-02-21
+2005-03-07
+2005-03-21
+2005-04-04
+2005-04-18
+2005-05-02
+2005-05-16
+2005-06-06
+2005-06-20
+2005-07-04
+2005-07-18
+2005-08-01
+2005-08-15
+2005-09-05
+2005-09-19
+2005-10-03
+2005-10-17
+2005-11-07
+2005-11-21
+2005-12-05
+2005-12-19
+2006-01-02
+2006-01-16
+2006-02-06
+2006-02-20
+2006-03-06
+2006-03-20
+2006-04-03
+2006-04-17
+2006-05-01
+2006-05-15
+2006-06-05
+2006-06-19
+2006-07-03
+2006-07-17
+2006-08-07
+2006-08-21
+2006-09-04
+2006-09-18
+2006-10-02
+2006-10-16
+2006-11-06
+2006-11-20
+2006-12-04
+2006-12-18
+2007-01-01
+2007-01-15
+2007-02-05
+2007-02-19
+2007-03-05
+2007-03-19
+2007-04-02
+2007-04-16
+2007-05-07
+2007-05-21
+2007-06-04
+2007-06-18
+2007-07-02
+2007-07-16
+2007-08-06
+2007-08-20
+2007-09-03
+2007-09-17
+2007-10-01
+2007-10-15
+2007-11-05
+2007-11-19
+2007-12-03
+2007-12-17
+2008-01-07
+2008-01-21
+2008-02-04
+2008-02-18
+2008-03-03
+2008-03-17
+2008-04-07
+2008-04-21
+2008-05-05
+2008-05-19
+2008-06-02
+2008-06-16
+2008-07-07
+2008-07-21
+2008-08-04
+2008-08-18
+2008-09-01
+2008-09-15
+2008-10-06
+2008-10-20
+2008-11-03
+2008-11-17
+2008-12-01
+2008-12-15
+2009-01-05
+2009-01-19
+2009-02-02
+2009-02-16
+2009-03-02
+2009-03-16
+2009-04-06
+2009-04-20
+2009-05-04
+2009-05-18
+2009-06-01
+2009-06-15
+2009-07-06
+2009-07-20
+2009-08-03
+2009-08-17
+2009-09-07
+2009-09-21
+2009-10-05
+2009-10-19
+2009-11-02
+2009-11-16
+2009-12-07
+2009-12-21
+2010-01-04
+2010-01-18
+2010-02-01
+2010-02-15
+2010-03-01
+2010-03-15
+2010-04-05
+2010-04-19
+2010-05-03
+2010-05-17
+2010-06-07
+2010-06-21
+2010-07-05
+2010-07-19
+2010-08-02
+2010-08-16
+2010-09-06
+2010-09-20
+2010-10-04
+2010-10-18
+2010-11-01
+2010-11-15
+2010-12-06
+2010-12-20
+2011-01-03
+2011-01-17
+2011-02-07
+2011-02-21
+2011-03-07
+2011-03-21
+2011-04-04
+2011-04-18
+2011-05-02
+2011-05-16
+2011-06-06
+2011-06-20
+2011-07-04
+2011-07-18
+2011-08-01
+2011-08-15
+2011-09-05
+2011-09-19
+2011-10-03
+2011-10-17
+2011-11-07
+2011-11-21
+2011-12-05
+2011-12-19
+2012-01-02
+2012-01-16
+2012-02-06
+2012-02-20
+2012-03-05
+2012-03-19
+2012-04-02
+2012-04-16
+2012-05-07
+2012-05-21
+2012-06-04
+2012-06-18
+2012-07-02
+2012-07-16
+2012-08-06
+2012-08-20
+2012-09-03
+2012-09-17
+2012-10-01
+2012-10-15
+2012-11-05
+2012-11-19
+2012-12-03
+2012-12-17
+2013-01-07
+2013-01-21
+2013-02-04
+2013-02-18
+2013-03-04
+2013-03-18
+2013-04-01
+2013-04-15
+2013-05-06
+2013-05-20
+2013-06-03
+2013-06-17
+2013-07-01
+2013-07-15
+2013-08-05
+2013-08-19
+2013-09-02
+2013-09-16
+2013-10-07
+2013-10-21
+2013-11-04
+2013-11-18
+2013-12-02
+2013-12-16
+2014-01-06
+2014-01-20
+2014-02-03
+2014-02-17
+2014-03-03
+2014-03-17
+2014-04-07
+2014-04-21
+2014-05-05
+2014-05-19
+2014-06-02
+2014-06-16
+2014-07-07
+2014-07-21
+2014-08-04
+2014-08-18
+2014-09-01
+2014-09-15
+2014-10-06
+2014-10-20
+2014-11-03
+2014-11-17
+2014-12-01
+2014-12-15
+2015-01-05
+2015-01-19
+2015-02-02
+2015-02-16
+2015-03-02
+2015-03-16
+2015-04-06
+2015-04-20
+2015-05-04
+2015-05-18
+2015-06-01
+2015-06-15
+2015-07-06
+2015-07-20
+2015-08-03
+2015-08-17
+2015-09-07
+2015-09-21
+2015-10-05
+2015-10-19
+2015-11-02
+2015-11-16
+2015-12-07
+2015-12-21
+2016-01-04
+2016-01-18
+2016-02-01
+2016-02-15
+2016-03-07
+2016-03-21
+2016-04-04
+2016-04-18
+2016-05-02
+2016-05-16
+2016-06-06
+2016-06-20
+2016-07-04
+2016-07-18
+2016-08-01
+2016-08-15
+2016-09-05
+2016-09-19
+2016-10-03
+2016-10-17
+2016-11-07
+2016-11-21
+2016-12-05
+2016-12-19
+2017-01-02
+2017-01-16
+2017-02-06
+2017-02-20
+2017-03-06
+2017-03-20
+2017-04-03
+2017-04-17
+2017-05-01
+2017-05-15
+2017-06-05
+2017-06-19
+2017-07-03
+2017-07-17
+2017-08-07
+2017-08-21
+2017-09-04
+2017-09-18
+2017-10-02
+2017-10-16
+2017-11-06
+2017-11-20
+2017-12-04
+2017-12-18
+2018-01-01
+2018-01-15
+2018-02-05
+2018-02-19
+2018-03-05
+2018-03-19
+2018-04-02
+2018-04-16
+2018-05-07
+2018-05-21
+2018-06-04
+2018-06-18
+2018-07-02
+2018-07-16
+2018-08-06
+2018-08-20
+2018-09-03
+2018-09-17
+2018-10-01
+2018-10-15
+2018-11-05
+2018-11-19
+2018-12-03
+2018-12-17
+2019-01-07
+2019-01-21
+2019-02-04
+2019-02-18
+2019-03-04
+2019-03-18
+2019-04-01
+2019-04-15
+2019-05-06
+2019-05-20
+2019-06-03
+2019-06-17
+2019-07-01
+2019-07-15
+2019-08-05
+2019-08-19
+2019-09-02
+2019-09-16
+2019-10-07
+2019-10-21
+2019-11-04
+2019-11-18
+2019-12-02
+2019-12-16
+2020-01-06
+2020-01-20
+2020-02-03
+2020-02-17
+2020-03-02
+2020-03-16
+2020-04-06
+2020-04-20
+2020-05-04
+2020-05-18
+2020-06-01
+2020-06-15
+2020-07-06
+2020-07-20
+2020-08-03
+2020-08-17
+2020-09-07
+2020-09-21
+2020-10-05
+2020-10-19
+2020-11-02
+2020-11-16
+2020-12-07
+2020-12-21
+2021-01-04
+2021-01-18
+2021-02-01
+2021-02-15
+2021-03-01
+2021-03-15
+2021-04-05
+2021-04-19
+2021-05-03
+2021-05-17
+2021-06-07
+2021-06-21
+2021-07-05
+2021-07-19
+2021-08-02
+2021-08-16
+2021-09-06
+2021-09-20
+2021-10-04
+2021-10-18
+2021-11-01
+2021-11-15
+2021-12-06
+2021-12-20
+2022-01-03
+2022-01-17
+2022-02-07
+2022-02-21
+2022-03-07
+2022-03-21
+2022-04-04
+2022-04-18
+2022-05-02
+2022-05-16
+2022-06-06
+2022-06-20
+2022-07-04
+2022-07-18
+2022-08-01
+2022-08-15
+2022-09-05
+2022-09-19
+2022-10-03
+2022-10-17
+2022-11-07
+2022-11-21
+2022-12-05
+2022-12-19
+2023-01-02
+2023-01-16
+2023-02-06
+2023-02-20
+2023-03-06
+2023-03-20
+2023-04-03
+2023-04-17
+2023-05-01
+2023-05-15
+2023-06-05
+2023-06-19
+2023-07-03
+2023-07-17
+2023-08-07
+2023-08-21
+2023-09-04
+2023-09-18
+2023-10-02
+2023-10-16
+2023-11-06
+2023-11-20
+2023-12-04
+2023-12-18
+2024-01-01
+2024-01-15
+2024-02-05
+2024-02-19
+2024-03-04
+2024-03-18
+2024-04-01
+2024-04-15
+2024-05-06
+2024-05-20
+2024-06-03
+2024-06-17
+2024-07-01
+2024-07-15
+2024-08-05
+2024-08-19
+2024-09-02
+2024-09-16
+2024-10-07
+2024-10-21
+2024-11-04
+2024-11-18
+2024-12-02
+2024-12-16
+2025-01-06
+2025-01-20
+2025-02-03
+2025-02-17
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily3.ics b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily3.ics
new file mode 100644
index 00000000..ee9e672b
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily3.ics
@@ -0,0 +1,31 @@
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+VERSION:2.0
+PRODID:-//MH Software Inc//Connect Daily - 3.0.7//EN
+X-LibKCal-Testsuite-OutTZ:America/Denver
+
+BEGIN:VTIMEZONE
+TZID:America/Denver
+BEGIN:STANDARD
+DTSTART:19671029T020000
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE
+
+BEGIN:VEVENT
+UID:1207@67.154.139.115
+RECURRENCE-ID:19700101T070000Z
+SUMMARY:2nd and 4th Thursday
+DTSTART;TZID=America/Denver;VALUE=DATE:20040513
+RRULE:FREQ=MONTHLY;BYDAY=2TH,4TH
+DURATION:P1D
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily3.ics.next.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily3.ics.next.ref
new file mode 100644
index 00000000..8d112597
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily3.ics.next.ref
@@ -0,0 +1,500 @@
+2004-05-13T00:00:00
+2004-05-27T00:00:00
+2004-06-10T00:00:00
+2004-06-24T00:00:00
+2004-07-08T00:00:00
+2004-07-22T00:00:00
+2004-08-12T00:00:00
+2004-08-26T00:00:00
+2004-09-09T00:00:00
+2004-09-23T00:00:00
+2004-10-14T00:00:00
+2004-10-28T00:00:00
+2004-11-11T00:00:00
+2004-11-25T00:00:00
+2004-12-09T00:00:00
+2004-12-23T00:00:00
+2005-01-13T00:00:00
+2005-01-27T00:00:00
+2005-02-10T00:00:00
+2005-02-24T00:00:00
+2005-03-10T00:00:00
+2005-03-24T00:00:00
+2005-04-14T00:00:00
+2005-04-28T00:00:00
+2005-05-12T00:00:00
+2005-05-26T00:00:00
+2005-06-09T00:00:00
+2005-06-23T00:00:00
+2005-07-14T00:00:00
+2005-07-28T00:00:00
+2005-08-11T00:00:00
+2005-08-25T00:00:00
+2005-09-08T00:00:00
+2005-09-22T00:00:00
+2005-10-13T00:00:00
+2005-10-27T00:00:00
+2005-11-10T00:00:00
+2005-11-24T00:00:00
+2005-12-08T00:00:00
+2005-12-22T00:00:00
+2006-01-12T00:00:00
+2006-01-26T00:00:00
+2006-02-09T00:00:00
+2006-02-23T00:00:00
+2006-03-09T00:00:00
+2006-03-23T00:00:00
+2006-04-13T00:00:00
+2006-04-27T00:00:00
+2006-05-11T00:00:00
+2006-05-25T00:00:00
+2006-06-08T00:00:00
+2006-06-22T00:00:00
+2006-07-13T00:00:00
+2006-07-27T00:00:00
+2006-08-10T00:00:00
+2006-08-24T00:00:00
+2006-09-14T00:00:00
+2006-09-28T00:00:00
+2006-10-12T00:00:00
+2006-10-26T00:00:00
+2006-11-09T00:00:00
+2006-11-23T00:00:00
+2006-12-14T00:00:00
+2006-12-28T00:00:00
+2007-01-11T00:00:00
+2007-01-25T00:00:00
+2007-02-08T00:00:00
+2007-02-22T00:00:00
+2007-03-08T00:00:00
+2007-03-22T00:00:00
+2007-04-12T00:00:00
+2007-04-26T00:00:00
+2007-05-10T00:00:00
+2007-05-24T00:00:00
+2007-06-14T00:00:00
+2007-06-28T00:00:00
+2007-07-12T00:00:00
+2007-07-26T00:00:00
+2007-08-09T00:00:00
+2007-08-23T00:00:00
+2007-09-13T00:00:00
+2007-09-27T00:00:00
+2007-10-11T00:00:00
+2007-10-25T00:00:00
+2007-11-08T00:00:00
+2007-11-22T00:00:00
+2007-12-13T00:00:00
+2007-12-27T00:00:00
+2008-01-10T00:00:00
+2008-01-24T00:00:00
+2008-02-14T00:00:00
+2008-02-28T00:00:00
+2008-03-13T00:00:00
+2008-03-27T00:00:00
+2008-04-10T00:00:00
+2008-04-24T00:00:00
+2008-05-08T00:00:00
+2008-05-22T00:00:00
+2008-06-12T00:00:00
+2008-06-26T00:00:00
+2008-07-10T00:00:00
+2008-07-24T00:00:00
+2008-08-14T00:00:00
+2008-08-28T00:00:00
+2008-09-11T00:00:00
+2008-09-25T00:00:00
+2008-10-09T00:00:00
+2008-10-23T00:00:00
+2008-11-13T00:00:00
+2008-11-27T00:00:00
+2008-12-11T00:00:00
+2008-12-25T00:00:00
+2009-01-08T00:00:00
+2009-01-22T00:00:00
+2009-02-12T00:00:00
+2009-02-26T00:00:00
+2009-03-12T00:00:00
+2009-03-26T00:00:00
+2009-04-09T00:00:00
+2009-04-23T00:00:00
+2009-05-14T00:00:00
+2009-05-28T00:00:00
+2009-06-11T00:00:00
+2009-06-25T00:00:00
+2009-07-09T00:00:00
+2009-07-23T00:00:00
+2009-08-13T00:00:00
+2009-08-27T00:00:00
+2009-09-10T00:00:00
+2009-09-24T00:00:00
+2009-10-08T00:00:00
+2009-10-22T00:00:00
+2009-11-12T00:00:00
+2009-11-26T00:00:00
+2009-12-10T00:00:00
+2009-12-24T00:00:00
+2010-01-14T00:00:00
+2010-01-28T00:00:00
+2010-02-11T00:00:00
+2010-02-25T00:00:00
+2010-03-11T00:00:00
+2010-03-25T00:00:00
+2010-04-08T00:00:00
+2010-04-22T00:00:00
+2010-05-13T00:00:00
+2010-05-27T00:00:00
+2010-06-10T00:00:00
+2010-06-24T00:00:00
+2010-07-08T00:00:00
+2010-07-22T00:00:00
+2010-08-12T00:00:00
+2010-08-26T00:00:00
+2010-09-09T00:00:00
+2010-09-23T00:00:00
+2010-10-14T00:00:00
+2010-10-28T00:00:00
+2010-11-11T00:00:00
+2010-11-25T00:00:00
+2010-12-09T00:00:00
+2010-12-23T00:00:00
+2011-01-13T00:00:00
+2011-01-27T00:00:00
+2011-02-10T00:00:00
+2011-02-24T00:00:00
+2011-03-10T00:00:00
+2011-03-24T00:00:00
+2011-04-14T00:00:00
+2011-04-28T00:00:00
+2011-05-12T00:00:00
+2011-05-26T00:00:00
+2011-06-09T00:00:00
+2011-06-23T00:00:00
+2011-07-14T00:00:00
+2011-07-28T00:00:00
+2011-08-11T00:00:00
+2011-08-25T00:00:00
+2011-09-08T00:00:00
+2011-09-22T00:00:00
+2011-10-13T00:00:00
+2011-10-27T00:00:00
+2011-11-10T00:00:00
+2011-11-24T00:00:00
+2011-12-08T00:00:00
+2011-12-22T00:00:00
+2012-01-12T00:00:00
+2012-01-26T00:00:00
+2012-02-09T00:00:00
+2012-02-23T00:00:00
+2012-03-08T00:00:00
+2012-03-22T00:00:00
+2012-04-12T00:00:00
+2012-04-26T00:00:00
+2012-05-10T00:00:00
+2012-05-24T00:00:00
+2012-06-14T00:00:00
+2012-06-28T00:00:00
+2012-07-12T00:00:00
+2012-07-26T00:00:00
+2012-08-09T00:00:00
+2012-08-23T00:00:00
+2012-09-13T00:00:00
+2012-09-27T00:00:00
+2012-10-11T00:00:00
+2012-10-25T00:00:00
+2012-11-08T00:00:00
+2012-11-22T00:00:00
+2012-12-13T00:00:00
+2012-12-27T00:00:00
+2013-01-10T00:00:00
+2013-01-24T00:00:00
+2013-02-14T00:00:00
+2013-02-28T00:00:00
+2013-03-14T00:00:00
+2013-03-28T00:00:00
+2013-04-11T00:00:00
+2013-04-25T00:00:00
+2013-05-09T00:00:00
+2013-05-23T00:00:00
+2013-06-13T00:00:00
+2013-06-27T00:00:00
+2013-07-11T00:00:00
+2013-07-25T00:00:00
+2013-08-08T00:00:00
+2013-08-22T00:00:00
+2013-09-12T00:00:00
+2013-09-26T00:00:00
+2013-10-10T00:00:00
+2013-10-24T00:00:00
+2013-11-14T00:00:00
+2013-11-28T00:00:00
+2013-12-12T00:00:00
+2013-12-26T00:00:00
+2014-01-09T00:00:00
+2014-01-23T00:00:00
+2014-02-13T00:00:00
+2014-02-27T00:00:00
+2014-03-13T00:00:00
+2014-03-27T00:00:00
+2014-04-10T00:00:00
+2014-04-24T00:00:00
+2014-05-08T00:00:00
+2014-05-22T00:00:00
+2014-06-12T00:00:00
+2014-06-26T00:00:00
+2014-07-10T00:00:00
+2014-07-24T00:00:00
+2014-08-14T00:00:00
+2014-08-28T00:00:00
+2014-09-11T00:00:00
+2014-09-25T00:00:00
+2014-10-09T00:00:00
+2014-10-23T00:00:00
+2014-11-13T00:00:00
+2014-11-27T00:00:00
+2014-12-11T00:00:00
+2014-12-25T00:00:00
+2015-01-08T00:00:00
+2015-01-22T00:00:00
+2015-02-12T00:00:00
+2015-02-26T00:00:00
+2015-03-12T00:00:00
+2015-03-26T00:00:00
+2015-04-09T00:00:00
+2015-04-23T00:00:00
+2015-05-14T00:00:00
+2015-05-28T00:00:00
+2015-06-11T00:00:00
+2015-06-25T00:00:00
+2015-07-09T00:00:00
+2015-07-23T00:00:00
+2015-08-13T00:00:00
+2015-08-27T00:00:00
+2015-09-10T00:00:00
+2015-09-24T00:00:00
+2015-10-08T00:00:00
+2015-10-22T00:00:00
+2015-11-12T00:00:00
+2015-11-26T00:00:00
+2015-12-10T00:00:00
+2015-12-24T00:00:00
+2016-01-14T00:00:00
+2016-01-28T00:00:00
+2016-02-11T00:00:00
+2016-02-25T00:00:00
+2016-03-10T00:00:00
+2016-03-24T00:00:00
+2016-04-14T00:00:00
+2016-04-28T00:00:00
+2016-05-12T00:00:00
+2016-05-26T00:00:00
+2016-06-09T00:00:00
+2016-06-23T00:00:00
+2016-07-14T00:00:00
+2016-07-28T00:00:00
+2016-08-11T00:00:00
+2016-08-25T00:00:00
+2016-09-08T00:00:00
+2016-09-22T00:00:00
+2016-10-13T00:00:00
+2016-10-27T00:00:00
+2016-11-10T00:00:00
+2016-11-24T00:00:00
+2016-12-08T00:00:00
+2016-12-22T00:00:00
+2017-01-12T00:00:00
+2017-01-26T00:00:00
+2017-02-09T00:00:00
+2017-02-23T00:00:00
+2017-03-09T00:00:00
+2017-03-23T00:00:00
+2017-04-13T00:00:00
+2017-04-27T00:00:00
+2017-05-11T00:00:00
+2017-05-25T00:00:00
+2017-06-08T00:00:00
+2017-06-22T00:00:00
+2017-07-13T00:00:00
+2017-07-27T00:00:00
+2017-08-10T00:00:00
+2017-08-24T00:00:00
+2017-09-14T00:00:00
+2017-09-28T00:00:00
+2017-10-12T00:00:00
+2017-10-26T00:00:00
+2017-11-09T00:00:00
+2017-11-23T00:00:00
+2017-12-14T00:00:00
+2017-12-28T00:00:00
+2018-01-11T00:00:00
+2018-01-25T00:00:00
+2018-02-08T00:00:00
+2018-02-22T00:00:00
+2018-03-08T00:00:00
+2018-03-22T00:00:00
+2018-04-12T00:00:00
+2018-04-26T00:00:00
+2018-05-10T00:00:00
+2018-05-24T00:00:00
+2018-06-14T00:00:00
+2018-06-28T00:00:00
+2018-07-12T00:00:00
+2018-07-26T00:00:00
+2018-08-09T00:00:00
+2018-08-23T00:00:00
+2018-09-13T00:00:00
+2018-09-27T00:00:00
+2018-10-11T00:00:00
+2018-10-25T00:00:00
+2018-11-08T00:00:00
+2018-11-22T00:00:00
+2018-12-13T00:00:00
+2018-12-27T00:00:00
+2019-01-10T00:00:00
+2019-01-24T00:00:00
+2019-02-14T00:00:00
+2019-02-28T00:00:00
+2019-03-14T00:00:00
+2019-03-28T00:00:00
+2019-04-11T00:00:00
+2019-04-25T00:00:00
+2019-05-09T00:00:00
+2019-05-23T00:00:00
+2019-06-13T00:00:00
+2019-06-27T00:00:00
+2019-07-11T00:00:00
+2019-07-25T00:00:00
+2019-08-08T00:00:00
+2019-08-22T00:00:00
+2019-09-12T00:00:00
+2019-09-26T00:00:00
+2019-10-10T00:00:00
+2019-10-24T00:00:00
+2019-11-14T00:00:00
+2019-11-28T00:00:00
+2019-12-12T00:00:00
+2019-12-26T00:00:00
+2020-01-09T00:00:00
+2020-01-23T00:00:00
+2020-02-13T00:00:00
+2020-02-27T00:00:00
+2020-03-12T00:00:00
+2020-03-26T00:00:00
+2020-04-09T00:00:00
+2020-04-23T00:00:00
+2020-05-14T00:00:00
+2020-05-28T00:00:00
+2020-06-11T00:00:00
+2020-06-25T00:00:00
+2020-07-09T00:00:00
+2020-07-23T00:00:00
+2020-08-13T00:00:00
+2020-08-27T00:00:00
+2020-09-10T00:00:00
+2020-09-24T00:00:00
+2020-10-08T00:00:00
+2020-10-22T00:00:00
+2020-11-12T00:00:00
+2020-11-26T00:00:00
+2020-12-10T00:00:00
+2020-12-24T00:00:00
+2021-01-14T00:00:00
+2021-01-28T00:00:00
+2021-02-11T00:00:00
+2021-02-25T00:00:00
+2021-03-11T00:00:00
+2021-03-25T00:00:00
+2021-04-08T00:00:00
+2021-04-22T00:00:00
+2021-05-13T00:00:00
+2021-05-27T00:00:00
+2021-06-10T00:00:00
+2021-06-24T00:00:00
+2021-07-08T00:00:00
+2021-07-22T00:00:00
+2021-08-12T00:00:00
+2021-08-26T00:00:00
+2021-09-09T00:00:00
+2021-09-23T00:00:00
+2021-10-14T00:00:00
+2021-10-28T00:00:00
+2021-11-11T00:00:00
+2021-11-25T00:00:00
+2021-12-09T00:00:00
+2021-12-23T00:00:00
+2022-01-13T00:00:00
+2022-01-27T00:00:00
+2022-02-10T00:00:00
+2022-02-24T00:00:00
+2022-03-10T00:00:00
+2022-03-24T00:00:00
+2022-04-14T00:00:00
+2022-04-28T00:00:00
+2022-05-12T00:00:00
+2022-05-26T00:00:00
+2022-06-09T00:00:00
+2022-06-23T00:00:00
+2022-07-14T00:00:00
+2022-07-28T00:00:00
+2022-08-11T00:00:00
+2022-08-25T00:00:00
+2022-09-08T00:00:00
+2022-09-22T00:00:00
+2022-10-13T00:00:00
+2022-10-27T00:00:00
+2022-11-10T00:00:00
+2022-11-24T00:00:00
+2022-12-08T00:00:00
+2022-12-22T00:00:00
+2023-01-12T00:00:00
+2023-01-26T00:00:00
+2023-02-09T00:00:00
+2023-02-23T00:00:00
+2023-03-09T00:00:00
+2023-03-23T00:00:00
+2023-04-13T00:00:00
+2023-04-27T00:00:00
+2023-05-11T00:00:00
+2023-05-25T00:00:00
+2023-06-08T00:00:00
+2023-06-22T00:00:00
+2023-07-13T00:00:00
+2023-07-27T00:00:00
+2023-08-10T00:00:00
+2023-08-24T00:00:00
+2023-09-14T00:00:00
+2023-09-28T00:00:00
+2023-10-12T00:00:00
+2023-10-26T00:00:00
+2023-11-09T00:00:00
+2023-11-23T00:00:00
+2023-12-14T00:00:00
+2023-12-28T00:00:00
+2024-01-11T00:00:00
+2024-01-25T00:00:00
+2024-02-08T00:00:00
+2024-02-22T00:00:00
+2024-03-14T00:00:00
+2024-03-28T00:00:00
+2024-04-11T00:00:00
+2024-04-25T00:00:00
+2024-05-09T00:00:00
+2024-05-23T00:00:00
+2024-06-13T00:00:00
+2024-06-27T00:00:00
+2024-07-11T00:00:00
+2024-07-25T00:00:00
+2024-08-08T00:00:00
+2024-08-22T00:00:00
+2024-09-12T00:00:00
+2024-09-26T00:00:00
+2024-10-10T00:00:00
+2024-10-24T00:00:00
+2024-11-14T00:00:00
+2024-11-28T00:00:00
+2024-12-12T00:00:00
+2024-12-26T00:00:00
+2025-01-09T00:00:00
+2025-01-23T00:00:00
+2025-02-13T00:00:00
+2025-02-27T00:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily3.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily3.ics.prev.ref
new file mode 100644
index 00000000..914fbf89
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily3.ics.prev.ref
@@ -0,0 +1,161 @@
+2010-12-23T00:00:00
+2010-12-09T00:00:00
+2010-11-25T00:00:00
+2010-11-11T00:00:00
+2010-10-28T00:00:00
+2010-10-14T00:00:00
+2010-09-23T00:00:00
+2010-09-09T00:00:00
+2010-08-26T00:00:00
+2010-08-12T00:00:00
+2010-07-22T00:00:00
+2010-07-08T00:00:00
+2010-06-24T00:00:00
+2010-06-10T00:00:00
+2010-05-27T00:00:00
+2010-05-13T00:00:00
+2010-04-22T00:00:00
+2010-04-08T00:00:00
+2010-03-25T00:00:00
+2010-03-11T00:00:00
+2010-02-25T00:00:00
+2010-02-11T00:00:00
+2010-01-28T00:00:00
+2010-01-14T00:00:00
+2009-12-24T00:00:00
+2009-12-10T00:00:00
+2009-11-26T00:00:00
+2009-11-12T00:00:00
+2009-10-22T00:00:00
+2009-10-08T00:00:00
+2009-09-24T00:00:00
+2009-09-10T00:00:00
+2009-08-27T00:00:00
+2009-08-13T00:00:00
+2009-07-23T00:00:00
+2009-07-09T00:00:00
+2009-06-25T00:00:00
+2009-06-11T00:00:00
+2009-05-28T00:00:00
+2009-05-14T00:00:00
+2009-04-23T00:00:00
+2009-04-09T00:00:00
+2009-03-26T00:00:00
+2009-03-12T00:00:00
+2009-02-26T00:00:00
+2009-02-12T00:00:00
+2009-01-22T00:00:00
+2009-01-08T00:00:00
+2008-12-25T00:00:00
+2008-12-11T00:00:00
+2008-11-27T00:00:00
+2008-11-13T00:00:00
+2008-10-23T00:00:00
+2008-10-09T00:00:00
+2008-09-25T00:00:00
+2008-09-11T00:00:00
+2008-08-28T00:00:00
+2008-08-14T00:00:00
+2008-07-24T00:00:00
+2008-07-10T00:00:00
+2008-06-26T00:00:00
+2008-06-12T00:00:00
+2008-05-22T00:00:00
+2008-05-08T00:00:00
+2008-04-24T00:00:00
+2008-04-10T00:00:00
+2008-03-27T00:00:00
+2008-03-13T00:00:00
+2008-02-28T00:00:00
+2008-02-14T00:00:00
+2008-01-24T00:00:00
+2008-01-10T00:00:00
+2007-12-27T00:00:00
+2007-12-13T00:00:00
+2007-11-22T00:00:00
+2007-11-08T00:00:00
+2007-10-25T00:00:00
+2007-10-11T00:00:00
+2007-09-27T00:00:00
+2007-09-13T00:00:00
+2007-08-23T00:00:00
+2007-08-09T00:00:00
+2007-07-26T00:00:00
+2007-07-12T00:00:00
+2007-06-28T00:00:00
+2007-06-14T00:00:00
+2007-05-24T00:00:00
+2007-05-10T00:00:00
+2007-04-26T00:00:00
+2007-04-12T00:00:00
+2007-03-22T00:00:00
+2007-03-08T00:00:00
+2007-02-22T00:00:00
+2007-02-08T00:00:00
+2007-01-25T00:00:00
+2007-01-11T00:00:00
+2006-12-28T00:00:00
+2006-12-14T00:00:00
+2006-11-23T00:00:00
+2006-11-09T00:00:00
+2006-10-26T00:00:00
+2006-10-12T00:00:00
+2006-09-28T00:00:00
+2006-09-14T00:00:00
+2006-08-24T00:00:00
+2006-08-10T00:00:00
+2006-07-27T00:00:00
+2006-07-13T00:00:00
+2006-06-22T00:00:00
+2006-06-08T00:00:00
+2006-05-25T00:00:00
+2006-05-11T00:00:00
+2006-04-27T00:00:00
+2006-04-13T00:00:00
+2006-03-23T00:00:00
+2006-03-09T00:00:00
+2006-02-23T00:00:00
+2006-02-09T00:00:00
+2006-01-26T00:00:00
+2006-01-12T00:00:00
+2005-12-22T00:00:00
+2005-12-08T00:00:00
+2005-11-24T00:00:00
+2005-11-10T00:00:00
+2005-10-27T00:00:00
+2005-10-13T00:00:00
+2005-09-22T00:00:00
+2005-09-08T00:00:00
+2005-08-25T00:00:00
+2005-08-11T00:00:00
+2005-07-28T00:00:00
+2005-07-14T00:00:00
+2005-06-23T00:00:00
+2005-06-09T00:00:00
+2005-05-26T00:00:00
+2005-05-12T00:00:00
+2005-04-28T00:00:00
+2005-04-14T00:00:00
+2005-03-24T00:00:00
+2005-03-10T00:00:00
+2005-02-24T00:00:00
+2005-02-10T00:00:00
+2005-01-27T00:00:00
+2005-01-13T00:00:00
+2004-12-23T00:00:00
+2004-12-09T00:00:00
+2004-11-25T00:00:00
+2004-11-11T00:00:00
+2004-10-28T00:00:00
+2004-10-14T00:00:00
+2004-09-23T00:00:00
+2004-09-09T00:00:00
+2004-08-26T00:00:00
+2004-08-12T00:00:00
+2004-07-22T00:00:00
+2004-07-08T00:00:00
+2004-06-24T00:00:00
+2004-06-10T00:00:00
+2004-05-27T00:00:00
+2004-05-13T00:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily3.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily3.ics.recurson.ref
new file mode 100644
index 00000000..b3883d95
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily3.ics.recurson.ref
@@ -0,0 +1,500 @@
+2004-05-13
+2004-05-27
+2004-06-10
+2004-06-24
+2004-07-08
+2004-07-22
+2004-08-12
+2004-08-26
+2004-09-09
+2004-09-23
+2004-10-14
+2004-10-28
+2004-11-11
+2004-11-25
+2004-12-09
+2004-12-23
+2005-01-13
+2005-01-27
+2005-02-10
+2005-02-24
+2005-03-10
+2005-03-24
+2005-04-14
+2005-04-28
+2005-05-12
+2005-05-26
+2005-06-09
+2005-06-23
+2005-07-14
+2005-07-28
+2005-08-11
+2005-08-25
+2005-09-08
+2005-09-22
+2005-10-13
+2005-10-27
+2005-11-10
+2005-11-24
+2005-12-08
+2005-12-22
+2006-01-12
+2006-01-26
+2006-02-09
+2006-02-23
+2006-03-09
+2006-03-23
+2006-04-13
+2006-04-27
+2006-05-11
+2006-05-25
+2006-06-08
+2006-06-22
+2006-07-13
+2006-07-27
+2006-08-10
+2006-08-24
+2006-09-14
+2006-09-28
+2006-10-12
+2006-10-26
+2006-11-09
+2006-11-23
+2006-12-14
+2006-12-28
+2007-01-11
+2007-01-25
+2007-02-08
+2007-02-22
+2007-03-08
+2007-03-22
+2007-04-12
+2007-04-26
+2007-05-10
+2007-05-24
+2007-06-14
+2007-06-28
+2007-07-12
+2007-07-26
+2007-08-09
+2007-08-23
+2007-09-13
+2007-09-27
+2007-10-11
+2007-10-25
+2007-11-08
+2007-11-22
+2007-12-13
+2007-12-27
+2008-01-10
+2008-01-24
+2008-02-14
+2008-02-28
+2008-03-13
+2008-03-27
+2008-04-10
+2008-04-24
+2008-05-08
+2008-05-22
+2008-06-12
+2008-06-26
+2008-07-10
+2008-07-24
+2008-08-14
+2008-08-28
+2008-09-11
+2008-09-25
+2008-10-09
+2008-10-23
+2008-11-13
+2008-11-27
+2008-12-11
+2008-12-25
+2009-01-08
+2009-01-22
+2009-02-12
+2009-02-26
+2009-03-12
+2009-03-26
+2009-04-09
+2009-04-23
+2009-05-14
+2009-05-28
+2009-06-11
+2009-06-25
+2009-07-09
+2009-07-23
+2009-08-13
+2009-08-27
+2009-09-10
+2009-09-24
+2009-10-08
+2009-10-22
+2009-11-12
+2009-11-26
+2009-12-10
+2009-12-24
+2010-01-14
+2010-01-28
+2010-02-11
+2010-02-25
+2010-03-11
+2010-03-25
+2010-04-08
+2010-04-22
+2010-05-13
+2010-05-27
+2010-06-10
+2010-06-24
+2010-07-08
+2010-07-22
+2010-08-12
+2010-08-26
+2010-09-09
+2010-09-23
+2010-10-14
+2010-10-28
+2010-11-11
+2010-11-25
+2010-12-09
+2010-12-23
+2011-01-13
+2011-01-27
+2011-02-10
+2011-02-24
+2011-03-10
+2011-03-24
+2011-04-14
+2011-04-28
+2011-05-12
+2011-05-26
+2011-06-09
+2011-06-23
+2011-07-14
+2011-07-28
+2011-08-11
+2011-08-25
+2011-09-08
+2011-09-22
+2011-10-13
+2011-10-27
+2011-11-10
+2011-11-24
+2011-12-08
+2011-12-22
+2012-01-12
+2012-01-26
+2012-02-09
+2012-02-23
+2012-03-08
+2012-03-22
+2012-04-12
+2012-04-26
+2012-05-10
+2012-05-24
+2012-06-14
+2012-06-28
+2012-07-12
+2012-07-26
+2012-08-09
+2012-08-23
+2012-09-13
+2012-09-27
+2012-10-11
+2012-10-25
+2012-11-08
+2012-11-22
+2012-12-13
+2012-12-27
+2013-01-10
+2013-01-24
+2013-02-14
+2013-02-28
+2013-03-14
+2013-03-28
+2013-04-11
+2013-04-25
+2013-05-09
+2013-05-23
+2013-06-13
+2013-06-27
+2013-07-11
+2013-07-25
+2013-08-08
+2013-08-22
+2013-09-12
+2013-09-26
+2013-10-10
+2013-10-24
+2013-11-14
+2013-11-28
+2013-12-12
+2013-12-26
+2014-01-09
+2014-01-23
+2014-02-13
+2014-02-27
+2014-03-13
+2014-03-27
+2014-04-10
+2014-04-24
+2014-05-08
+2014-05-22
+2014-06-12
+2014-06-26
+2014-07-10
+2014-07-24
+2014-08-14
+2014-08-28
+2014-09-11
+2014-09-25
+2014-10-09
+2014-10-23
+2014-11-13
+2014-11-27
+2014-12-11
+2014-12-25
+2015-01-08
+2015-01-22
+2015-02-12
+2015-02-26
+2015-03-12
+2015-03-26
+2015-04-09
+2015-04-23
+2015-05-14
+2015-05-28
+2015-06-11
+2015-06-25
+2015-07-09
+2015-07-23
+2015-08-13
+2015-08-27
+2015-09-10
+2015-09-24
+2015-10-08
+2015-10-22
+2015-11-12
+2015-11-26
+2015-12-10
+2015-12-24
+2016-01-14
+2016-01-28
+2016-02-11
+2016-02-25
+2016-03-10
+2016-03-24
+2016-04-14
+2016-04-28
+2016-05-12
+2016-05-26
+2016-06-09
+2016-06-23
+2016-07-14
+2016-07-28
+2016-08-11
+2016-08-25
+2016-09-08
+2016-09-22
+2016-10-13
+2016-10-27
+2016-11-10
+2016-11-24
+2016-12-08
+2016-12-22
+2017-01-12
+2017-01-26
+2017-02-09
+2017-02-23
+2017-03-09
+2017-03-23
+2017-04-13
+2017-04-27
+2017-05-11
+2017-05-25
+2017-06-08
+2017-06-22
+2017-07-13
+2017-07-27
+2017-08-10
+2017-08-24
+2017-09-14
+2017-09-28
+2017-10-12
+2017-10-26
+2017-11-09
+2017-11-23
+2017-12-14
+2017-12-28
+2018-01-11
+2018-01-25
+2018-02-08
+2018-02-22
+2018-03-08
+2018-03-22
+2018-04-12
+2018-04-26
+2018-05-10
+2018-05-24
+2018-06-14
+2018-06-28
+2018-07-12
+2018-07-26
+2018-08-09
+2018-08-23
+2018-09-13
+2018-09-27
+2018-10-11
+2018-10-25
+2018-11-08
+2018-11-22
+2018-12-13
+2018-12-27
+2019-01-10
+2019-01-24
+2019-02-14
+2019-02-28
+2019-03-14
+2019-03-28
+2019-04-11
+2019-04-25
+2019-05-09
+2019-05-23
+2019-06-13
+2019-06-27
+2019-07-11
+2019-07-25
+2019-08-08
+2019-08-22
+2019-09-12
+2019-09-26
+2019-10-10
+2019-10-24
+2019-11-14
+2019-11-28
+2019-12-12
+2019-12-26
+2020-01-09
+2020-01-23
+2020-02-13
+2020-02-27
+2020-03-12
+2020-03-26
+2020-04-09
+2020-04-23
+2020-05-14
+2020-05-28
+2020-06-11
+2020-06-25
+2020-07-09
+2020-07-23
+2020-08-13
+2020-08-27
+2020-09-10
+2020-09-24
+2020-10-08
+2020-10-22
+2020-11-12
+2020-11-26
+2020-12-10
+2020-12-24
+2021-01-14
+2021-01-28
+2021-02-11
+2021-02-25
+2021-03-11
+2021-03-25
+2021-04-08
+2021-04-22
+2021-05-13
+2021-05-27
+2021-06-10
+2021-06-24
+2021-07-08
+2021-07-22
+2021-08-12
+2021-08-26
+2021-09-09
+2021-09-23
+2021-10-14
+2021-10-28
+2021-11-11
+2021-11-25
+2021-12-09
+2021-12-23
+2022-01-13
+2022-01-27
+2022-02-10
+2022-02-24
+2022-03-10
+2022-03-24
+2022-04-14
+2022-04-28
+2022-05-12
+2022-05-26
+2022-06-09
+2022-06-23
+2022-07-14
+2022-07-28
+2022-08-11
+2022-08-25
+2022-09-08
+2022-09-22
+2022-10-13
+2022-10-27
+2022-11-10
+2022-11-24
+2022-12-08
+2022-12-22
+2023-01-12
+2023-01-26
+2023-02-09
+2023-02-23
+2023-03-09
+2023-03-23
+2023-04-13
+2023-04-27
+2023-05-11
+2023-05-25
+2023-06-08
+2023-06-22
+2023-07-13
+2023-07-27
+2023-08-10
+2023-08-24
+2023-09-14
+2023-09-28
+2023-10-12
+2023-10-26
+2023-11-09
+2023-11-23
+2023-12-14
+2023-12-28
+2024-01-11
+2024-01-25
+2024-02-08
+2024-02-22
+2024-03-14
+2024-03-28
+2024-04-11
+2024-04-25
+2024-05-09
+2024-05-23
+2024-06-13
+2024-06-27
+2024-07-11
+2024-07-25
+2024-08-08
+2024-08-22
+2024-09-12
+2024-09-26
+2024-10-10
+2024-10-24
+2024-11-14
+2024-11-28
+2024-12-12
+2024-12-26
+2025-01-09
+2025-01-23
+2025-02-13
+2025-02-27
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily4.ics b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily4.ics
new file mode 100644
index 00000000..780b9039
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily4.ics
@@ -0,0 +1,31 @@
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+VERSION:2.0
+PRODID:-//MH Software Inc//Connect Daily - 3.0.7//EN
+X-LibKCal-Testsuite-OutTZ:America/Denver
+
+BEGIN:VTIMEZONE
+TZID:America/Denver
+BEGIN:STANDARD
+DTSTART:19671029T020000
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE
+
+BEGIN:VEVENT
+UID:1210@67.154.139.115
+RECURRENCE-ID:20040504T060000Z
+SUMMARY:Every Other Tuesday
+DTSTART;TZID=America/Denver;VALUE=DATE:20040504
+RRULE:FREQ=WEEKLY;BYDAY=TU;INTERVAL=2
+DURATION:P1D
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily4.ics.next.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily4.ics.next.ref
new file mode 100644
index 00000000..5e5439b7
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily4.ics.next.ref
@@ -0,0 +1,500 @@
+2004-05-04T00:00:00
+2004-05-18T00:00:00
+2004-06-01T00:00:00
+2004-06-15T00:00:00
+2004-06-29T00:00:00
+2004-07-13T00:00:00
+2004-07-27T00:00:00
+2004-08-10T00:00:00
+2004-08-24T00:00:00
+2004-09-07T00:00:00
+2004-09-21T00:00:00
+2004-10-05T00:00:00
+2004-10-19T00:00:00
+2004-11-02T00:00:00
+2004-11-16T00:00:00
+2004-11-30T00:00:00
+2004-12-14T00:00:00
+2004-12-28T00:00:00
+2005-01-11T00:00:00
+2005-01-25T00:00:00
+2005-02-08T00:00:00
+2005-02-22T00:00:00
+2005-03-08T00:00:00
+2005-03-22T00:00:00
+2005-04-05T00:00:00
+2005-04-19T00:00:00
+2005-05-03T00:00:00
+2005-05-17T00:00:00
+2005-05-31T00:00:00
+2005-06-14T00:00:00
+2005-06-28T00:00:00
+2005-07-12T00:00:00
+2005-07-26T00:00:00
+2005-08-09T00:00:00
+2005-08-23T00:00:00
+2005-09-06T00:00:00
+2005-09-20T00:00:00
+2005-10-04T00:00:00
+2005-10-18T00:00:00
+2005-11-01T00:00:00
+2005-11-15T00:00:00
+2005-11-29T00:00:00
+2005-12-13T00:00:00
+2005-12-27T00:00:00
+2006-01-10T00:00:00
+2006-01-24T00:00:00
+2006-02-07T00:00:00
+2006-02-21T00:00:00
+2006-03-07T00:00:00
+2006-03-21T00:00:00
+2006-04-04T00:00:00
+2006-04-18T00:00:00
+2006-05-02T00:00:00
+2006-05-16T00:00:00
+2006-05-30T00:00:00
+2006-06-13T00:00:00
+2006-06-27T00:00:00
+2006-07-11T00:00:00
+2006-07-25T00:00:00
+2006-08-08T00:00:00
+2006-08-22T00:00:00
+2006-09-05T00:00:00
+2006-09-19T00:00:00
+2006-10-03T00:00:00
+2006-10-17T00:00:00
+2006-10-31T00:00:00
+2006-11-14T00:00:00
+2006-11-28T00:00:00
+2006-12-12T00:00:00
+2006-12-26T00:00:00
+2007-01-09T00:00:00
+2007-01-23T00:00:00
+2007-02-06T00:00:00
+2007-02-20T00:00:00
+2007-03-06T00:00:00
+2007-03-20T00:00:00
+2007-04-03T00:00:00
+2007-04-17T00:00:00
+2007-05-01T00:00:00
+2007-05-15T00:00:00
+2007-05-29T00:00:00
+2007-06-12T00:00:00
+2007-06-26T00:00:00
+2007-07-10T00:00:00
+2007-07-24T00:00:00
+2007-08-07T00:00:00
+2007-08-21T00:00:00
+2007-09-04T00:00:00
+2007-09-18T00:00:00
+2007-10-02T00:00:00
+2007-10-16T00:00:00
+2007-10-30T00:00:00
+2007-11-13T00:00:00
+2007-11-27T00:00:00
+2007-12-11T00:00:00
+2007-12-25T00:00:00
+2008-01-08T00:00:00
+2008-01-22T00:00:00
+2008-02-05T00:00:00
+2008-02-19T00:00:00
+2008-03-04T00:00:00
+2008-03-18T00:00:00
+2008-04-01T00:00:00
+2008-04-15T00:00:00
+2008-04-29T00:00:00
+2008-05-13T00:00:00
+2008-05-27T00:00:00
+2008-06-10T00:00:00
+2008-06-24T00:00:00
+2008-07-08T00:00:00
+2008-07-22T00:00:00
+2008-08-05T00:00:00
+2008-08-19T00:00:00
+2008-09-02T00:00:00
+2008-09-16T00:00:00
+2008-09-30T00:00:00
+2008-10-14T00:00:00
+2008-10-28T00:00:00
+2008-11-11T00:00:00
+2008-11-25T00:00:00
+2008-12-09T00:00:00
+2008-12-23T00:00:00
+2009-01-06T00:00:00
+2009-01-20T00:00:00
+2009-02-03T00:00:00
+2009-02-17T00:00:00
+2009-03-03T00:00:00
+2009-03-17T00:00:00
+2009-03-31T00:00:00
+2009-04-14T00:00:00
+2009-04-28T00:00:00
+2009-05-12T00:00:00
+2009-05-26T00:00:00
+2009-06-09T00:00:00
+2009-06-23T00:00:00
+2009-07-07T00:00:00
+2009-07-21T00:00:00
+2009-08-04T00:00:00
+2009-08-18T00:00:00
+2009-09-01T00:00:00
+2009-09-15T00:00:00
+2009-09-29T00:00:00
+2009-10-13T00:00:00
+2009-10-27T00:00:00
+2009-11-10T00:00:00
+2009-11-24T00:00:00
+2009-12-08T00:00:00
+2009-12-22T00:00:00
+2010-01-05T00:00:00
+2010-01-19T00:00:00
+2010-02-02T00:00:00
+2010-02-16T00:00:00
+2010-03-02T00:00:00
+2010-03-16T00:00:00
+2010-03-30T00:00:00
+2010-04-13T00:00:00
+2010-04-27T00:00:00
+2010-05-11T00:00:00
+2010-05-25T00:00:00
+2010-06-08T00:00:00
+2010-06-22T00:00:00
+2010-07-06T00:00:00
+2010-07-20T00:00:00
+2010-08-03T00:00:00
+2010-08-17T00:00:00
+2010-08-31T00:00:00
+2010-09-14T00:00:00
+2010-09-28T00:00:00
+2010-10-12T00:00:00
+2010-10-26T00:00:00
+2010-11-09T00:00:00
+2010-11-23T00:00:00
+2010-12-07T00:00:00
+2010-12-21T00:00:00
+2011-01-04T00:00:00
+2011-01-18T00:00:00
+2011-02-01T00:00:00
+2011-02-15T00:00:00
+2011-03-01T00:00:00
+2011-03-15T00:00:00
+2011-03-29T00:00:00
+2011-04-12T00:00:00
+2011-04-26T00:00:00
+2011-05-10T00:00:00
+2011-05-24T00:00:00
+2011-06-07T00:00:00
+2011-06-21T00:00:00
+2011-07-05T00:00:00
+2011-07-19T00:00:00
+2011-08-02T00:00:00
+2011-08-16T00:00:00
+2011-08-30T00:00:00
+2011-09-13T00:00:00
+2011-09-27T00:00:00
+2011-10-11T00:00:00
+2011-10-25T00:00:00
+2011-11-08T00:00:00
+2011-11-22T00:00:00
+2011-12-06T00:00:00
+2011-12-20T00:00:00
+2012-01-03T00:00:00
+2012-01-17T00:00:00
+2012-01-31T00:00:00
+2012-02-14T00:00:00
+2012-02-28T00:00:00
+2012-03-13T00:00:00
+2012-03-27T00:00:00
+2012-04-10T00:00:00
+2012-04-24T00:00:00
+2012-05-08T00:00:00
+2012-05-22T00:00:00
+2012-06-05T00:00:00
+2012-06-19T00:00:00
+2012-07-03T00:00:00
+2012-07-17T00:00:00
+2012-07-31T00:00:00
+2012-08-14T00:00:00
+2012-08-28T00:00:00
+2012-09-11T00:00:00
+2012-09-25T00:00:00
+2012-10-09T00:00:00
+2012-10-23T00:00:00
+2012-11-06T00:00:00
+2012-11-20T00:00:00
+2012-12-04T00:00:00
+2012-12-18T00:00:00
+2013-01-01T00:00:00
+2013-01-15T00:00:00
+2013-01-29T00:00:00
+2013-02-12T00:00:00
+2013-02-26T00:00:00
+2013-03-12T00:00:00
+2013-03-26T00:00:00
+2013-04-09T00:00:00
+2013-04-23T00:00:00
+2013-05-07T00:00:00
+2013-05-21T00:00:00
+2013-06-04T00:00:00
+2013-06-18T00:00:00
+2013-07-02T00:00:00
+2013-07-16T00:00:00
+2013-07-30T00:00:00
+2013-08-13T00:00:00
+2013-08-27T00:00:00
+2013-09-10T00:00:00
+2013-09-24T00:00:00
+2013-10-08T00:00:00
+2013-10-22T00:00:00
+2013-11-05T00:00:00
+2013-11-19T00:00:00
+2013-12-03T00:00:00
+2013-12-17T00:00:00
+2013-12-31T00:00:00
+2014-01-14T00:00:00
+2014-01-28T00:00:00
+2014-02-11T00:00:00
+2014-02-25T00:00:00
+2014-03-11T00:00:00
+2014-03-25T00:00:00
+2014-04-08T00:00:00
+2014-04-22T00:00:00
+2014-05-06T00:00:00
+2014-05-20T00:00:00
+2014-06-03T00:00:00
+2014-06-17T00:00:00
+2014-07-01T00:00:00
+2014-07-15T00:00:00
+2014-07-29T00:00:00
+2014-08-12T00:00:00
+2014-08-26T00:00:00
+2014-09-09T00:00:00
+2014-09-23T00:00:00
+2014-10-07T00:00:00
+2014-10-21T00:00:00
+2014-11-04T00:00:00
+2014-11-18T00:00:00
+2014-12-02T00:00:00
+2014-12-16T00:00:00
+2014-12-30T00:00:00
+2015-01-13T00:00:00
+2015-01-27T00:00:00
+2015-02-10T00:00:00
+2015-02-24T00:00:00
+2015-03-10T00:00:00
+2015-03-24T00:00:00
+2015-04-07T00:00:00
+2015-04-21T00:00:00
+2015-05-05T00:00:00
+2015-05-19T00:00:00
+2015-06-02T00:00:00
+2015-06-16T00:00:00
+2015-06-30T00:00:00
+2015-07-14T00:00:00
+2015-07-28T00:00:00
+2015-08-11T00:00:00
+2015-08-25T00:00:00
+2015-09-08T00:00:00
+2015-09-22T00:00:00
+2015-10-06T00:00:00
+2015-10-20T00:00:00
+2015-11-03T00:00:00
+2015-11-17T00:00:00
+2015-12-01T00:00:00
+2015-12-15T00:00:00
+2015-12-29T00:00:00
+2016-01-12T00:00:00
+2016-01-26T00:00:00
+2016-02-09T00:00:00
+2016-02-23T00:00:00
+2016-03-08T00:00:00
+2016-03-22T00:00:00
+2016-04-05T00:00:00
+2016-04-19T00:00:00
+2016-05-03T00:00:00
+2016-05-17T00:00:00
+2016-05-31T00:00:00
+2016-06-14T00:00:00
+2016-06-28T00:00:00
+2016-07-12T00:00:00
+2016-07-26T00:00:00
+2016-08-09T00:00:00
+2016-08-23T00:00:00
+2016-09-06T00:00:00
+2016-09-20T00:00:00
+2016-10-04T00:00:00
+2016-10-18T00:00:00
+2016-11-01T00:00:00
+2016-11-15T00:00:00
+2016-11-29T00:00:00
+2016-12-13T00:00:00
+2016-12-27T00:00:00
+2017-01-10T00:00:00
+2017-01-24T00:00:00
+2017-02-07T00:00:00
+2017-02-21T00:00:00
+2017-03-07T00:00:00
+2017-03-21T00:00:00
+2017-04-04T00:00:00
+2017-04-18T00:00:00
+2017-05-02T00:00:00
+2017-05-16T00:00:00
+2017-05-30T00:00:00
+2017-06-13T00:00:00
+2017-06-27T00:00:00
+2017-07-11T00:00:00
+2017-07-25T00:00:00
+2017-08-08T00:00:00
+2017-08-22T00:00:00
+2017-09-05T00:00:00
+2017-09-19T00:00:00
+2017-10-03T00:00:00
+2017-10-17T00:00:00
+2017-10-31T00:00:00
+2017-11-14T00:00:00
+2017-11-28T00:00:00
+2017-12-12T00:00:00
+2017-12-26T00:00:00
+2018-01-09T00:00:00
+2018-01-23T00:00:00
+2018-02-06T00:00:00
+2018-02-20T00:00:00
+2018-03-06T00:00:00
+2018-03-20T00:00:00
+2018-04-03T00:00:00
+2018-04-17T00:00:00
+2018-05-01T00:00:00
+2018-05-15T00:00:00
+2018-05-29T00:00:00
+2018-06-12T00:00:00
+2018-06-26T00:00:00
+2018-07-10T00:00:00
+2018-07-24T00:00:00
+2018-08-07T00:00:00
+2018-08-21T00:00:00
+2018-09-04T00:00:00
+2018-09-18T00:00:00
+2018-10-02T00:00:00
+2018-10-16T00:00:00
+2018-10-30T00:00:00
+2018-11-13T00:00:00
+2018-11-27T00:00:00
+2018-12-11T00:00:00
+2018-12-25T00:00:00
+2019-01-08T00:00:00
+2019-01-22T00:00:00
+2019-02-05T00:00:00
+2019-02-19T00:00:00
+2019-03-05T00:00:00
+2019-03-19T00:00:00
+2019-04-02T00:00:00
+2019-04-16T00:00:00
+2019-04-30T00:00:00
+2019-05-14T00:00:00
+2019-05-28T00:00:00
+2019-06-11T00:00:00
+2019-06-25T00:00:00
+2019-07-09T00:00:00
+2019-07-23T00:00:00
+2019-08-06T00:00:00
+2019-08-20T00:00:00
+2019-09-03T00:00:00
+2019-09-17T00:00:00
+2019-10-01T00:00:00
+2019-10-15T00:00:00
+2019-10-29T00:00:00
+2019-11-12T00:00:00
+2019-11-26T00:00:00
+2019-12-10T00:00:00
+2019-12-24T00:00:00
+2020-01-07T00:00:00
+2020-01-21T00:00:00
+2020-02-04T00:00:00
+2020-02-18T00:00:00
+2020-03-03T00:00:00
+2020-03-17T00:00:00
+2020-03-31T00:00:00
+2020-04-14T00:00:00
+2020-04-28T00:00:00
+2020-05-12T00:00:00
+2020-05-26T00:00:00
+2020-06-09T00:00:00
+2020-06-23T00:00:00
+2020-07-07T00:00:00
+2020-07-21T00:00:00
+2020-08-04T00:00:00
+2020-08-18T00:00:00
+2020-09-01T00:00:00
+2020-09-15T00:00:00
+2020-09-29T00:00:00
+2020-10-13T00:00:00
+2020-10-27T00:00:00
+2020-11-10T00:00:00
+2020-11-24T00:00:00
+2020-12-08T00:00:00
+2020-12-22T00:00:00
+2021-01-05T00:00:00
+2021-01-19T00:00:00
+2021-02-02T00:00:00
+2021-02-16T00:00:00
+2021-03-02T00:00:00
+2021-03-16T00:00:00
+2021-03-30T00:00:00
+2021-04-13T00:00:00
+2021-04-27T00:00:00
+2021-05-11T00:00:00
+2021-05-25T00:00:00
+2021-06-08T00:00:00
+2021-06-22T00:00:00
+2021-07-06T00:00:00
+2021-07-20T00:00:00
+2021-08-03T00:00:00
+2021-08-17T00:00:00
+2021-08-31T00:00:00
+2021-09-14T00:00:00
+2021-09-28T00:00:00
+2021-10-12T00:00:00
+2021-10-26T00:00:00
+2021-11-09T00:00:00
+2021-11-23T00:00:00
+2021-12-07T00:00:00
+2021-12-21T00:00:00
+2022-01-04T00:00:00
+2022-01-18T00:00:00
+2022-02-01T00:00:00
+2022-02-15T00:00:00
+2022-03-01T00:00:00
+2022-03-15T00:00:00
+2022-03-29T00:00:00
+2022-04-12T00:00:00
+2022-04-26T00:00:00
+2022-05-10T00:00:00
+2022-05-24T00:00:00
+2022-06-07T00:00:00
+2022-06-21T00:00:00
+2022-07-05T00:00:00
+2022-07-19T00:00:00
+2022-08-02T00:00:00
+2022-08-16T00:00:00
+2022-08-30T00:00:00
+2022-09-13T00:00:00
+2022-09-27T00:00:00
+2022-10-11T00:00:00
+2022-10-25T00:00:00
+2022-11-08T00:00:00
+2022-11-22T00:00:00
+2022-12-06T00:00:00
+2022-12-20T00:00:00
+2023-01-03T00:00:00
+2023-01-17T00:00:00
+2023-01-31T00:00:00
+2023-02-14T00:00:00
+2023-02-28T00:00:00
+2023-03-14T00:00:00
+2023-03-28T00:00:00
+2023-04-11T00:00:00
+2023-04-25T00:00:00
+2023-05-09T00:00:00
+2023-05-23T00:00:00
+2023-06-06T00:00:00
+2023-06-20T00:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily4.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily4.ics.prev.ref
new file mode 100644
index 00000000..2cc91c1b
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily4.ics.prev.ref
@@ -0,0 +1,175 @@
+2010-12-21T00:00:00
+2010-12-07T00:00:00
+2010-11-23T00:00:00
+2010-11-09T00:00:00
+2010-10-26T00:00:00
+2010-10-12T00:00:00
+2010-09-28T00:00:00
+2010-09-14T00:00:00
+2010-08-31T00:00:00
+2010-08-17T00:00:00
+2010-08-03T00:00:00
+2010-07-20T00:00:00
+2010-07-06T00:00:00
+2010-06-22T00:00:00
+2010-06-08T00:00:00
+2010-05-25T00:00:00
+2010-05-11T00:00:00
+2010-04-27T00:00:00
+2010-04-13T00:00:00
+2010-03-30T00:00:00
+2010-03-16T00:00:00
+2010-03-02T00:00:00
+2010-02-16T00:00:00
+2010-02-02T00:00:00
+2010-01-19T00:00:00
+2010-01-05T00:00:00
+2009-12-22T00:00:00
+2009-12-08T00:00:00
+2009-11-24T00:00:00
+2009-11-10T00:00:00
+2009-10-27T00:00:00
+2009-10-13T00:00:00
+2009-09-29T00:00:00
+2009-09-15T00:00:00
+2009-09-01T00:00:00
+2009-08-18T00:00:00
+2009-08-04T00:00:00
+2009-07-21T00:00:00
+2009-07-07T00:00:00
+2009-06-23T00:00:00
+2009-06-09T00:00:00
+2009-05-26T00:00:00
+2009-05-12T00:00:00
+2009-04-28T00:00:00
+2009-04-14T00:00:00
+2009-03-31T00:00:00
+2009-03-17T00:00:00
+2009-03-03T00:00:00
+2009-02-17T00:00:00
+2009-02-03T00:00:00
+2009-01-20T00:00:00
+2009-01-06T00:00:00
+2008-12-23T00:00:00
+2008-12-09T00:00:00
+2008-11-25T00:00:00
+2008-11-11T00:00:00
+2008-10-28T00:00:00
+2008-10-14T00:00:00
+2008-09-30T00:00:00
+2008-09-16T00:00:00
+2008-09-02T00:00:00
+2008-08-19T00:00:00
+2008-08-05T00:00:00
+2008-07-22T00:00:00
+2008-07-08T00:00:00
+2008-06-24T00:00:00
+2008-06-10T00:00:00
+2008-05-27T00:00:00
+2008-05-13T00:00:00
+2008-04-29T00:00:00
+2008-04-15T00:00:00
+2008-04-01T00:00:00
+2008-03-18T00:00:00
+2008-03-04T00:00:00
+2008-02-19T00:00:00
+2008-02-05T00:00:00
+2008-01-22T00:00:00
+2008-01-08T00:00:00
+2007-12-25T00:00:00
+2007-12-11T00:00:00
+2007-11-27T00:00:00
+2007-11-13T00:00:00
+2007-10-30T00:00:00
+2007-10-16T00:00:00
+2007-10-02T00:00:00
+2007-09-18T00:00:00
+2007-09-04T00:00:00
+2007-08-21T00:00:00
+2007-08-07T00:00:00
+2007-07-24T00:00:00
+2007-07-10T00:00:00
+2007-06-26T00:00:00
+2007-06-12T00:00:00
+2007-05-29T00:00:00
+2007-05-15T00:00:00
+2007-05-01T00:00:00
+2007-04-17T00:00:00
+2007-04-03T00:00:00
+2007-03-20T00:00:00
+2007-03-06T00:00:00
+2007-02-20T00:00:00
+2007-02-06T00:00:00
+2007-01-23T00:00:00
+2007-01-09T00:00:00
+2006-12-26T00:00:00
+2006-12-12T00:00:00
+2006-11-28T00:00:00
+2006-11-14T00:00:00
+2006-10-31T00:00:00
+2006-10-17T00:00:00
+2006-10-03T00:00:00
+2006-09-19T00:00:00
+2006-09-05T00:00:00
+2006-08-22T00:00:00
+2006-08-08T00:00:00
+2006-07-25T00:00:00
+2006-07-11T00:00:00
+2006-06-27T00:00:00
+2006-06-13T00:00:00
+2006-05-30T00:00:00
+2006-05-16T00:00:00
+2006-05-02T00:00:00
+2006-04-18T00:00:00
+2006-04-04T00:00:00
+2006-03-21T00:00:00
+2006-03-07T00:00:00
+2006-02-21T00:00:00
+2006-02-07T00:00:00
+2006-01-24T00:00:00
+2006-01-10T00:00:00
+2005-12-27T00:00:00
+2005-12-13T00:00:00
+2005-11-29T00:00:00
+2005-11-15T00:00:00
+2005-11-01T00:00:00
+2005-10-18T00:00:00
+2005-10-04T00:00:00
+2005-09-20T00:00:00
+2005-09-06T00:00:00
+2005-08-23T00:00:00
+2005-08-09T00:00:00
+2005-07-26T00:00:00
+2005-07-12T00:00:00
+2005-06-28T00:00:00
+2005-06-14T00:00:00
+2005-05-31T00:00:00
+2005-05-17T00:00:00
+2005-05-03T00:00:00
+2005-04-19T00:00:00
+2005-04-05T00:00:00
+2005-03-22T00:00:00
+2005-03-08T00:00:00
+2005-02-22T00:00:00
+2005-02-08T00:00:00
+2005-01-25T00:00:00
+2005-01-11T00:00:00
+2004-12-28T00:00:00
+2004-12-14T00:00:00
+2004-11-30T00:00:00
+2004-11-16T00:00:00
+2004-11-02T00:00:00
+2004-10-19T00:00:00
+2004-10-05T00:00:00
+2004-09-21T00:00:00
+2004-09-07T00:00:00
+2004-08-24T00:00:00
+2004-08-10T00:00:00
+2004-07-27T00:00:00
+2004-07-13T00:00:00
+2004-06-29T00:00:00
+2004-06-15T00:00:00
+2004-06-01T00:00:00
+2004-05-18T00:00:00
+2004-05-04T00:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily4.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily4.ics.recurson.ref
new file mode 100644
index 00000000..86fca834
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily4.ics.recurson.ref
@@ -0,0 +1,500 @@
+2004-05-04
+2004-05-18
+2004-06-01
+2004-06-15
+2004-06-29
+2004-07-13
+2004-07-27
+2004-08-10
+2004-08-24
+2004-09-07
+2004-09-21
+2004-10-05
+2004-10-19
+2004-11-02
+2004-11-16
+2004-11-30
+2004-12-14
+2004-12-28
+2005-01-11
+2005-01-25
+2005-02-08
+2005-02-22
+2005-03-08
+2005-03-22
+2005-04-05
+2005-04-19
+2005-05-03
+2005-05-17
+2005-05-31
+2005-06-14
+2005-06-28
+2005-07-12
+2005-07-26
+2005-08-09
+2005-08-23
+2005-09-06
+2005-09-20
+2005-10-04
+2005-10-18
+2005-11-01
+2005-11-15
+2005-11-29
+2005-12-13
+2005-12-27
+2006-01-10
+2006-01-24
+2006-02-07
+2006-02-21
+2006-03-07
+2006-03-21
+2006-04-04
+2006-04-18
+2006-05-02
+2006-05-16
+2006-05-30
+2006-06-13
+2006-06-27
+2006-07-11
+2006-07-25
+2006-08-08
+2006-08-22
+2006-09-05
+2006-09-19
+2006-10-03
+2006-10-17
+2006-10-31
+2006-11-14
+2006-11-28
+2006-12-12
+2006-12-26
+2007-01-09
+2007-01-23
+2007-02-06
+2007-02-20
+2007-03-06
+2007-03-20
+2007-04-03
+2007-04-17
+2007-05-01
+2007-05-15
+2007-05-29
+2007-06-12
+2007-06-26
+2007-07-10
+2007-07-24
+2007-08-07
+2007-08-21
+2007-09-04
+2007-09-18
+2007-10-02
+2007-10-16
+2007-10-30
+2007-11-13
+2007-11-27
+2007-12-11
+2007-12-25
+2008-01-08
+2008-01-22
+2008-02-05
+2008-02-19
+2008-03-04
+2008-03-18
+2008-04-01
+2008-04-15
+2008-04-29
+2008-05-13
+2008-05-27
+2008-06-10
+2008-06-24
+2008-07-08
+2008-07-22
+2008-08-05
+2008-08-19
+2008-09-02
+2008-09-16
+2008-09-30
+2008-10-14
+2008-10-28
+2008-11-11
+2008-11-25
+2008-12-09
+2008-12-23
+2009-01-06
+2009-01-20
+2009-02-03
+2009-02-17
+2009-03-03
+2009-03-17
+2009-03-31
+2009-04-14
+2009-04-28
+2009-05-12
+2009-05-26
+2009-06-09
+2009-06-23
+2009-07-07
+2009-07-21
+2009-08-04
+2009-08-18
+2009-09-01
+2009-09-15
+2009-09-29
+2009-10-13
+2009-10-27
+2009-11-10
+2009-11-24
+2009-12-08
+2009-12-22
+2010-01-05
+2010-01-19
+2010-02-02
+2010-02-16
+2010-03-02
+2010-03-16
+2010-03-30
+2010-04-13
+2010-04-27
+2010-05-11
+2010-05-25
+2010-06-08
+2010-06-22
+2010-07-06
+2010-07-20
+2010-08-03
+2010-08-17
+2010-08-31
+2010-09-14
+2010-09-28
+2010-10-12
+2010-10-26
+2010-11-09
+2010-11-23
+2010-12-07
+2010-12-21
+2011-01-04
+2011-01-18
+2011-02-01
+2011-02-15
+2011-03-01
+2011-03-15
+2011-03-29
+2011-04-12
+2011-04-26
+2011-05-10
+2011-05-24
+2011-06-07
+2011-06-21
+2011-07-05
+2011-07-19
+2011-08-02
+2011-08-16
+2011-08-30
+2011-09-13
+2011-09-27
+2011-10-11
+2011-10-25
+2011-11-08
+2011-11-22
+2011-12-06
+2011-12-20
+2012-01-03
+2012-01-17
+2012-01-31
+2012-02-14
+2012-02-28
+2012-03-13
+2012-03-27
+2012-04-10
+2012-04-24
+2012-05-08
+2012-05-22
+2012-06-05
+2012-06-19
+2012-07-03
+2012-07-17
+2012-07-31
+2012-08-14
+2012-08-28
+2012-09-11
+2012-09-25
+2012-10-09
+2012-10-23
+2012-11-06
+2012-11-20
+2012-12-04
+2012-12-18
+2013-01-01
+2013-01-15
+2013-01-29
+2013-02-12
+2013-02-26
+2013-03-12
+2013-03-26
+2013-04-09
+2013-04-23
+2013-05-07
+2013-05-21
+2013-06-04
+2013-06-18
+2013-07-02
+2013-07-16
+2013-07-30
+2013-08-13
+2013-08-27
+2013-09-10
+2013-09-24
+2013-10-08
+2013-10-22
+2013-11-05
+2013-11-19
+2013-12-03
+2013-12-17
+2013-12-31
+2014-01-14
+2014-01-28
+2014-02-11
+2014-02-25
+2014-03-11
+2014-03-25
+2014-04-08
+2014-04-22
+2014-05-06
+2014-05-20
+2014-06-03
+2014-06-17
+2014-07-01
+2014-07-15
+2014-07-29
+2014-08-12
+2014-08-26
+2014-09-09
+2014-09-23
+2014-10-07
+2014-10-21
+2014-11-04
+2014-11-18
+2014-12-02
+2014-12-16
+2014-12-30
+2015-01-13
+2015-01-27
+2015-02-10
+2015-02-24
+2015-03-10
+2015-03-24
+2015-04-07
+2015-04-21
+2015-05-05
+2015-05-19
+2015-06-02
+2015-06-16
+2015-06-30
+2015-07-14
+2015-07-28
+2015-08-11
+2015-08-25
+2015-09-08
+2015-09-22
+2015-10-06
+2015-10-20
+2015-11-03
+2015-11-17
+2015-12-01
+2015-12-15
+2015-12-29
+2016-01-12
+2016-01-26
+2016-02-09
+2016-02-23
+2016-03-08
+2016-03-22
+2016-04-05
+2016-04-19
+2016-05-03
+2016-05-17
+2016-05-31
+2016-06-14
+2016-06-28
+2016-07-12
+2016-07-26
+2016-08-09
+2016-08-23
+2016-09-06
+2016-09-20
+2016-10-04
+2016-10-18
+2016-11-01
+2016-11-15
+2016-11-29
+2016-12-13
+2016-12-27
+2017-01-10
+2017-01-24
+2017-02-07
+2017-02-21
+2017-03-07
+2017-03-21
+2017-04-04
+2017-04-18
+2017-05-02
+2017-05-16
+2017-05-30
+2017-06-13
+2017-06-27
+2017-07-11
+2017-07-25
+2017-08-08
+2017-08-22
+2017-09-05
+2017-09-19
+2017-10-03
+2017-10-17
+2017-10-31
+2017-11-14
+2017-11-28
+2017-12-12
+2017-12-26
+2018-01-09
+2018-01-23
+2018-02-06
+2018-02-20
+2018-03-06
+2018-03-20
+2018-04-03
+2018-04-17
+2018-05-01
+2018-05-15
+2018-05-29
+2018-06-12
+2018-06-26
+2018-07-10
+2018-07-24
+2018-08-07
+2018-08-21
+2018-09-04
+2018-09-18
+2018-10-02
+2018-10-16
+2018-10-30
+2018-11-13
+2018-11-27
+2018-12-11
+2018-12-25
+2019-01-08
+2019-01-22
+2019-02-05
+2019-02-19
+2019-03-05
+2019-03-19
+2019-04-02
+2019-04-16
+2019-04-30
+2019-05-14
+2019-05-28
+2019-06-11
+2019-06-25
+2019-07-09
+2019-07-23
+2019-08-06
+2019-08-20
+2019-09-03
+2019-09-17
+2019-10-01
+2019-10-15
+2019-10-29
+2019-11-12
+2019-11-26
+2019-12-10
+2019-12-24
+2020-01-07
+2020-01-21
+2020-02-04
+2020-02-18
+2020-03-03
+2020-03-17
+2020-03-31
+2020-04-14
+2020-04-28
+2020-05-12
+2020-05-26
+2020-06-09
+2020-06-23
+2020-07-07
+2020-07-21
+2020-08-04
+2020-08-18
+2020-09-01
+2020-09-15
+2020-09-29
+2020-10-13
+2020-10-27
+2020-11-10
+2020-11-24
+2020-12-08
+2020-12-22
+2021-01-05
+2021-01-19
+2021-02-02
+2021-02-16
+2021-03-02
+2021-03-16
+2021-03-30
+2021-04-13
+2021-04-27
+2021-05-11
+2021-05-25
+2021-06-08
+2021-06-22
+2021-07-06
+2021-07-20
+2021-08-03
+2021-08-17
+2021-08-31
+2021-09-14
+2021-09-28
+2021-10-12
+2021-10-26
+2021-11-09
+2021-11-23
+2021-12-07
+2021-12-21
+2022-01-04
+2022-01-18
+2022-02-01
+2022-02-15
+2022-03-01
+2022-03-15
+2022-03-29
+2022-04-12
+2022-04-26
+2022-05-10
+2022-05-24
+2022-06-07
+2022-06-21
+2022-07-05
+2022-07-19
+2022-08-02
+2022-08-16
+2022-08-30
+2022-09-13
+2022-09-27
+2022-10-11
+2022-10-25
+2022-11-08
+2022-11-22
+2022-12-06
+2022-12-20
+2023-01-03
+2023-01-17
+2023-01-31
+2023-02-14
+2023-02-28
+2023-03-14
+2023-03-28
+2023-04-11
+2023-04-25
+2023-05-09
+2023-05-23
+2023-06-06
+2023-06-20
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily5.ics b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily5.ics
new file mode 100644
index 00000000..eb922d5d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily5.ics
@@ -0,0 +1,31 @@
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+VERSION:2.0
+PRODID:-//MH Software Inc//Connect Daily - 3.0.7//EN
+X-LibKCal-Testsuite-OutTZ:America/Denver
+
+BEGIN:VTIMEZONE
+TZID:America/Denver
+BEGIN:STANDARD
+DTSTART:19671029T020000
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE
+
+BEGIN:VEVENT
+UID:1211@67.154.139.115
+RECURRENCE-ID:19700101T070000Z
+SUMMARY:First Day
+DTSTART;TZID=America/Denver;VALUE=DATE:20040501
+RRULE:FREQ=MONTHLY;BYMONTHDAY=1
+DURATION:P1D
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily5.ics.next.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily5.ics.next.ref
new file mode 100644
index 00000000..c4025c3a
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily5.ics.next.ref
@@ -0,0 +1,500 @@
+2004-05-01T00:00:00
+2004-06-01T00:00:00
+2004-07-01T00:00:00
+2004-08-01T00:00:00
+2004-09-01T00:00:00
+2004-10-01T00:00:00
+2004-11-01T00:00:00
+2004-12-01T00:00:00
+2005-01-01T00:00:00
+2005-02-01T00:00:00
+2005-03-01T00:00:00
+2005-04-01T00:00:00
+2005-05-01T00:00:00
+2005-06-01T00:00:00
+2005-07-01T00:00:00
+2005-08-01T00:00:00
+2005-09-01T00:00:00
+2005-10-01T00:00:00
+2005-11-01T00:00:00
+2005-12-01T00:00:00
+2006-01-01T00:00:00
+2006-02-01T00:00:00
+2006-03-01T00:00:00
+2006-04-01T00:00:00
+2006-05-01T00:00:00
+2006-06-01T00:00:00
+2006-07-01T00:00:00
+2006-08-01T00:00:00
+2006-09-01T00:00:00
+2006-10-01T00:00:00
+2006-11-01T00:00:00
+2006-12-01T00:00:00
+2007-01-01T00:00:00
+2007-02-01T00:00:00
+2007-03-01T00:00:00
+2007-04-01T00:00:00
+2007-05-01T00:00:00
+2007-06-01T00:00:00
+2007-07-01T00:00:00
+2007-08-01T00:00:00
+2007-09-01T00:00:00
+2007-10-01T00:00:00
+2007-11-01T00:00:00
+2007-12-01T00:00:00
+2008-01-01T00:00:00
+2008-02-01T00:00:00
+2008-03-01T00:00:00
+2008-04-01T00:00:00
+2008-05-01T00:00:00
+2008-06-01T00:00:00
+2008-07-01T00:00:00
+2008-08-01T00:00:00
+2008-09-01T00:00:00
+2008-10-01T00:00:00
+2008-11-01T00:00:00
+2008-12-01T00:00:00
+2009-01-01T00:00:00
+2009-02-01T00:00:00
+2009-03-01T00:00:00
+2009-04-01T00:00:00
+2009-05-01T00:00:00
+2009-06-01T00:00:00
+2009-07-01T00:00:00
+2009-08-01T00:00:00
+2009-09-01T00:00:00
+2009-10-01T00:00:00
+2009-11-01T00:00:00
+2009-12-01T00:00:00
+2010-01-01T00:00:00
+2010-02-01T00:00:00
+2010-03-01T00:00:00
+2010-04-01T00:00:00
+2010-05-01T00:00:00
+2010-06-01T00:00:00
+2010-07-01T00:00:00
+2010-08-01T00:00:00
+2010-09-01T00:00:00
+2010-10-01T00:00:00
+2010-11-01T00:00:00
+2010-12-01T00:00:00
+2011-01-01T00:00:00
+2011-02-01T00:00:00
+2011-03-01T00:00:00
+2011-04-01T00:00:00
+2011-05-01T00:00:00
+2011-06-01T00:00:00
+2011-07-01T00:00:00
+2011-08-01T00:00:00
+2011-09-01T00:00:00
+2011-10-01T00:00:00
+2011-11-01T00:00:00
+2011-12-01T00:00:00
+2012-01-01T00:00:00
+2012-02-01T00:00:00
+2012-03-01T00:00:00
+2012-04-01T00:00:00
+2012-05-01T00:00:00
+2012-06-01T00:00:00
+2012-07-01T00:00:00
+2012-08-01T00:00:00
+2012-09-01T00:00:00
+2012-10-01T00:00:00
+2012-11-01T00:00:00
+2012-12-01T00:00:00
+2013-01-01T00:00:00
+2013-02-01T00:00:00
+2013-03-01T00:00:00
+2013-04-01T00:00:00
+2013-05-01T00:00:00
+2013-06-01T00:00:00
+2013-07-01T00:00:00
+2013-08-01T00:00:00
+2013-09-01T00:00:00
+2013-10-01T00:00:00
+2013-11-01T00:00:00
+2013-12-01T00:00:00
+2014-01-01T00:00:00
+2014-02-01T00:00:00
+2014-03-01T00:00:00
+2014-04-01T00:00:00
+2014-05-01T00:00:00
+2014-06-01T00:00:00
+2014-07-01T00:00:00
+2014-08-01T00:00:00
+2014-09-01T00:00:00
+2014-10-01T00:00:00
+2014-11-01T00:00:00
+2014-12-01T00:00:00
+2015-01-01T00:00:00
+2015-02-01T00:00:00
+2015-03-01T00:00:00
+2015-04-01T00:00:00
+2015-05-01T00:00:00
+2015-06-01T00:00:00
+2015-07-01T00:00:00
+2015-08-01T00:00:00
+2015-09-01T00:00:00
+2015-10-01T00:00:00
+2015-11-01T00:00:00
+2015-12-01T00:00:00
+2016-01-01T00:00:00
+2016-02-01T00:00:00
+2016-03-01T00:00:00
+2016-04-01T00:00:00
+2016-05-01T00:00:00
+2016-06-01T00:00:00
+2016-07-01T00:00:00
+2016-08-01T00:00:00
+2016-09-01T00:00:00
+2016-10-01T00:00:00
+2016-11-01T00:00:00
+2016-12-01T00:00:00
+2017-01-01T00:00:00
+2017-02-01T00:00:00
+2017-03-01T00:00:00
+2017-04-01T00:00:00
+2017-05-01T00:00:00
+2017-06-01T00:00:00
+2017-07-01T00:00:00
+2017-08-01T00:00:00
+2017-09-01T00:00:00
+2017-10-01T00:00:00
+2017-11-01T00:00:00
+2017-12-01T00:00:00
+2018-01-01T00:00:00
+2018-02-01T00:00:00
+2018-03-01T00:00:00
+2018-04-01T00:00:00
+2018-05-01T00:00:00
+2018-06-01T00:00:00
+2018-07-01T00:00:00
+2018-08-01T00:00:00
+2018-09-01T00:00:00
+2018-10-01T00:00:00
+2018-11-01T00:00:00
+2018-12-01T00:00:00
+2019-01-01T00:00:00
+2019-02-01T00:00:00
+2019-03-01T00:00:00
+2019-04-01T00:00:00
+2019-05-01T00:00:00
+2019-06-01T00:00:00
+2019-07-01T00:00:00
+2019-08-01T00:00:00
+2019-09-01T00:00:00
+2019-10-01T00:00:00
+2019-11-01T00:00:00
+2019-12-01T00:00:00
+2020-01-01T00:00:00
+2020-02-01T00:00:00
+2020-03-01T00:00:00
+2020-04-01T00:00:00
+2020-05-01T00:00:00
+2020-06-01T00:00:00
+2020-07-01T00:00:00
+2020-08-01T00:00:00
+2020-09-01T00:00:00
+2020-10-01T00:00:00
+2020-11-01T00:00:00
+2020-12-01T00:00:00
+2021-01-01T00:00:00
+2021-02-01T00:00:00
+2021-03-01T00:00:00
+2021-04-01T00:00:00
+2021-05-01T00:00:00
+2021-06-01T00:00:00
+2021-07-01T00:00:00
+2021-08-01T00:00:00
+2021-09-01T00:00:00
+2021-10-01T00:00:00
+2021-11-01T00:00:00
+2021-12-01T00:00:00
+2022-01-01T00:00:00
+2022-02-01T00:00:00
+2022-03-01T00:00:00
+2022-04-01T00:00:00
+2022-05-01T00:00:00
+2022-06-01T00:00:00
+2022-07-01T00:00:00
+2022-08-01T00:00:00
+2022-09-01T00:00:00
+2022-10-01T00:00:00
+2022-11-01T00:00:00
+2022-12-01T00:00:00
+2023-01-01T00:00:00
+2023-02-01T00:00:00
+2023-03-01T00:00:00
+2023-04-01T00:00:00
+2023-05-01T00:00:00
+2023-06-01T00:00:00
+2023-07-01T00:00:00
+2023-08-01T00:00:00
+2023-09-01T00:00:00
+2023-10-01T00:00:00
+2023-11-01T00:00:00
+2023-12-01T00:00:00
+2024-01-01T00:00:00
+2024-02-01T00:00:00
+2024-03-01T00:00:00
+2024-04-01T00:00:00
+2024-05-01T00:00:00
+2024-06-01T00:00:00
+2024-07-01T00:00:00
+2024-08-01T00:00:00
+2024-09-01T00:00:00
+2024-10-01T00:00:00
+2024-11-01T00:00:00
+2024-12-01T00:00:00
+2025-01-01T00:00:00
+2025-02-01T00:00:00
+2025-03-01T00:00:00
+2025-04-01T00:00:00
+2025-05-01T00:00:00
+2025-06-01T00:00:00
+2025-07-01T00:00:00
+2025-08-01T00:00:00
+2025-09-01T00:00:00
+2025-10-01T00:00:00
+2025-11-01T00:00:00
+2025-12-01T00:00:00
+2026-01-01T00:00:00
+2026-02-01T00:00:00
+2026-03-01T00:00:00
+2026-04-01T00:00:00
+2026-05-01T00:00:00
+2026-06-01T00:00:00
+2026-07-01T00:00:00
+2026-08-01T00:00:00
+2026-09-01T00:00:00
+2026-10-01T00:00:00
+2026-11-01T00:00:00
+2026-12-01T00:00:00
+2027-01-01T00:00:00
+2027-02-01T00:00:00
+2027-03-01T00:00:00
+2027-04-01T00:00:00
+2027-05-01T00:00:00
+2027-06-01T00:00:00
+2027-07-01T00:00:00
+2027-08-01T00:00:00
+2027-09-01T00:00:00
+2027-10-01T00:00:00
+2027-11-01T00:00:00
+2027-12-01T00:00:00
+2028-01-01T00:00:00
+2028-02-01T00:00:00
+2028-03-01T00:00:00
+2028-04-01T00:00:00
+2028-05-01T00:00:00
+2028-06-01T00:00:00
+2028-07-01T00:00:00
+2028-08-01T00:00:00
+2028-09-01T00:00:00
+2028-10-01T00:00:00
+2028-11-01T00:00:00
+2028-12-01T00:00:00
+2029-01-01T00:00:00
+2029-02-01T00:00:00
+2029-03-01T00:00:00
+2029-04-01T00:00:00
+2029-05-01T00:00:00
+2029-06-01T00:00:00
+2029-07-01T00:00:00
+2029-08-01T00:00:00
+2029-09-01T00:00:00
+2029-10-01T00:00:00
+2029-11-01T00:00:00
+2029-12-01T00:00:00
+2030-01-01T00:00:00
+2030-02-01T00:00:00
+2030-03-01T00:00:00
+2030-04-01T00:00:00
+2030-05-01T00:00:00
+2030-06-01T00:00:00
+2030-07-01T00:00:00
+2030-08-01T00:00:00
+2030-09-01T00:00:00
+2030-10-01T00:00:00
+2030-11-01T00:00:00
+2030-12-01T00:00:00
+2031-01-01T00:00:00
+2031-02-01T00:00:00
+2031-03-01T00:00:00
+2031-04-01T00:00:00
+2031-05-01T00:00:00
+2031-06-01T00:00:00
+2031-07-01T00:00:00
+2031-08-01T00:00:00
+2031-09-01T00:00:00
+2031-10-01T00:00:00
+2031-11-01T00:00:00
+2031-12-01T00:00:00
+2032-01-01T00:00:00
+2032-02-01T00:00:00
+2032-03-01T00:00:00
+2032-04-01T00:00:00
+2032-05-01T00:00:00
+2032-06-01T00:00:00
+2032-07-01T00:00:00
+2032-08-01T00:00:00
+2032-09-01T00:00:00
+2032-10-01T00:00:00
+2032-11-01T00:00:00
+2032-12-01T00:00:00
+2033-01-01T00:00:00
+2033-02-01T00:00:00
+2033-03-01T00:00:00
+2033-04-01T00:00:00
+2033-05-01T00:00:00
+2033-06-01T00:00:00
+2033-07-01T00:00:00
+2033-08-01T00:00:00
+2033-09-01T00:00:00
+2033-10-01T00:00:00
+2033-11-01T00:00:00
+2033-12-01T00:00:00
+2034-01-01T00:00:00
+2034-02-01T00:00:00
+2034-03-01T00:00:00
+2034-04-01T00:00:00
+2034-05-01T00:00:00
+2034-06-01T00:00:00
+2034-07-01T00:00:00
+2034-08-01T00:00:00
+2034-09-01T00:00:00
+2034-10-01T00:00:00
+2034-11-01T00:00:00
+2034-12-01T00:00:00
+2035-01-01T00:00:00
+2035-02-01T00:00:00
+2035-03-01T00:00:00
+2035-04-01T00:00:00
+2035-05-01T00:00:00
+2035-06-01T00:00:00
+2035-07-01T00:00:00
+2035-08-01T00:00:00
+2035-09-01T00:00:00
+2035-10-01T00:00:00
+2035-11-01T00:00:00
+2035-12-01T00:00:00
+2036-01-01T00:00:00
+2036-02-01T00:00:00
+2036-03-01T00:00:00
+2036-04-01T00:00:00
+2036-05-01T00:00:00
+2036-06-01T00:00:00
+2036-07-01T00:00:00
+2036-08-01T00:00:00
+2036-09-01T00:00:00
+2036-10-01T00:00:00
+2036-11-01T00:00:00
+2036-12-01T00:00:00
+2037-01-01T00:00:00
+2037-02-01T00:00:00
+2037-03-01T00:00:00
+2037-04-01T00:00:00
+2037-05-01T00:00:00
+2037-06-01T00:00:00
+2037-07-01T00:00:00
+2037-08-01T00:00:00
+2037-09-01T00:00:00
+2037-10-01T00:00:00
+2037-11-01T00:00:00
+2037-12-01T00:00:00
+2038-01-01T00:00:00
+2038-02-01T00:00:00
+2038-03-01T00:00:00
+2038-04-01T00:00:00
+2038-05-01T00:00:00
+2038-06-01T00:00:00
+2038-07-01T00:00:00
+2038-08-01T00:00:00
+2038-09-01T00:00:00
+2038-10-01T00:00:00
+2038-11-01T00:00:00
+2038-12-01T00:00:00
+2039-01-01T00:00:00
+2039-02-01T00:00:00
+2039-03-01T00:00:00
+2039-04-01T00:00:00
+2039-05-01T00:00:00
+2039-06-01T00:00:00
+2039-07-01T00:00:00
+2039-08-01T00:00:00
+2039-09-01T00:00:00
+2039-10-01T00:00:00
+2039-11-01T00:00:00
+2039-12-01T00:00:00
+2040-01-01T00:00:00
+2040-02-01T00:00:00
+2040-03-01T00:00:00
+2040-04-01T00:00:00
+2040-05-01T00:00:00
+2040-06-01T00:00:00
+2040-07-01T00:00:00
+2040-08-01T00:00:00
+2040-09-01T00:00:00
+2040-10-01T00:00:00
+2040-11-01T00:00:00
+2040-12-01T00:00:00
+2041-01-01T00:00:00
+2041-02-01T00:00:00
+2041-03-01T00:00:00
+2041-04-01T00:00:00
+2041-05-01T00:00:00
+2041-06-01T00:00:00
+2041-07-01T00:00:00
+2041-08-01T00:00:00
+2041-09-01T00:00:00
+2041-10-01T00:00:00
+2041-11-01T00:00:00
+2041-12-01T00:00:00
+2042-01-01T00:00:00
+2042-02-01T00:00:00
+2042-03-01T00:00:00
+2042-04-01T00:00:00
+2042-05-01T00:00:00
+2042-06-01T00:00:00
+2042-07-01T00:00:00
+2042-08-01T00:00:00
+2042-09-01T00:00:00
+2042-10-01T00:00:00
+2042-11-01T00:00:00
+2042-12-01T00:00:00
+2043-01-01T00:00:00
+2043-02-01T00:00:00
+2043-03-01T00:00:00
+2043-04-01T00:00:00
+2043-05-01T00:00:00
+2043-06-01T00:00:00
+2043-07-01T00:00:00
+2043-08-01T00:00:00
+2043-09-01T00:00:00
+2043-10-01T00:00:00
+2043-11-01T00:00:00
+2043-12-01T00:00:00
+2044-01-01T00:00:00
+2044-02-01T00:00:00
+2044-03-01T00:00:00
+2044-04-01T00:00:00
+2044-05-01T00:00:00
+2044-06-01T00:00:00
+2044-07-01T00:00:00
+2044-08-01T00:00:00
+2044-09-01T00:00:00
+2044-10-01T00:00:00
+2044-11-01T00:00:00
+2044-12-01T00:00:00
+2045-01-01T00:00:00
+2045-02-01T00:00:00
+2045-03-01T00:00:00
+2045-04-01T00:00:00
+2045-05-01T00:00:00
+2045-06-01T00:00:00
+2045-07-01T00:00:00
+2045-08-01T00:00:00
+2045-09-01T00:00:00
+2045-10-01T00:00:00
+2045-11-01T00:00:00
+2045-12-01T00:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily5.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily5.ics.prev.ref
new file mode 100644
index 00000000..1e77bbea
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily5.ics.prev.ref
@@ -0,0 +1,81 @@
+2010-12-01T00:00:00
+2010-11-01T00:00:00
+2010-10-01T00:00:00
+2010-09-01T00:00:00
+2010-08-01T00:00:00
+2010-07-01T00:00:00
+2010-06-01T00:00:00
+2010-05-01T00:00:00
+2010-04-01T00:00:00
+2010-03-01T00:00:00
+2010-02-01T00:00:00
+2010-01-01T00:00:00
+2009-12-01T00:00:00
+2009-11-01T00:00:00
+2009-10-01T00:00:00
+2009-09-01T00:00:00
+2009-08-01T00:00:00
+2009-07-01T00:00:00
+2009-06-01T00:00:00
+2009-05-01T00:00:00
+2009-04-01T00:00:00
+2009-03-01T00:00:00
+2009-02-01T00:00:00
+2009-01-01T00:00:00
+2008-12-01T00:00:00
+2008-11-01T00:00:00
+2008-10-01T00:00:00
+2008-09-01T00:00:00
+2008-08-01T00:00:00
+2008-07-01T00:00:00
+2008-06-01T00:00:00
+2008-05-01T00:00:00
+2008-04-01T00:00:00
+2008-03-01T00:00:00
+2008-02-01T00:00:00
+2008-01-01T00:00:00
+2007-12-01T00:00:00
+2007-11-01T00:00:00
+2007-10-01T00:00:00
+2007-09-01T00:00:00
+2007-08-01T00:00:00
+2007-07-01T00:00:00
+2007-06-01T00:00:00
+2007-05-01T00:00:00
+2007-04-01T00:00:00
+2007-03-01T00:00:00
+2007-02-01T00:00:00
+2007-01-01T00:00:00
+2006-12-01T00:00:00
+2006-11-01T00:00:00
+2006-10-01T00:00:00
+2006-09-01T00:00:00
+2006-08-01T00:00:00
+2006-07-01T00:00:00
+2006-06-01T00:00:00
+2006-05-01T00:00:00
+2006-04-01T00:00:00
+2006-03-01T00:00:00
+2006-02-01T00:00:00
+2006-01-01T00:00:00
+2005-12-01T00:00:00
+2005-11-01T00:00:00
+2005-10-01T00:00:00
+2005-09-01T00:00:00
+2005-08-01T00:00:00
+2005-07-01T00:00:00
+2005-06-01T00:00:00
+2005-05-01T00:00:00
+2005-04-01T00:00:00
+2005-03-01T00:00:00
+2005-02-01T00:00:00
+2005-01-01T00:00:00
+2004-12-01T00:00:00
+2004-11-01T00:00:00
+2004-10-01T00:00:00
+2004-09-01T00:00:00
+2004-08-01T00:00:00
+2004-07-01T00:00:00
+2004-06-01T00:00:00
+2004-05-01T00:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily5.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily5.ics.recurson.ref
new file mode 100644
index 00000000..8f6eaf08
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily5.ics.recurson.ref
@@ -0,0 +1,500 @@
+2004-05-01
+2004-06-01
+2004-07-01
+2004-08-01
+2004-09-01
+2004-10-01
+2004-11-01
+2004-12-01
+2005-01-01
+2005-02-01
+2005-03-01
+2005-04-01
+2005-05-01
+2005-06-01
+2005-07-01
+2005-08-01
+2005-09-01
+2005-10-01
+2005-11-01
+2005-12-01
+2006-01-01
+2006-02-01
+2006-03-01
+2006-04-01
+2006-05-01
+2006-06-01
+2006-07-01
+2006-08-01
+2006-09-01
+2006-10-01
+2006-11-01
+2006-12-01
+2007-01-01
+2007-02-01
+2007-03-01
+2007-04-01
+2007-05-01
+2007-06-01
+2007-07-01
+2007-08-01
+2007-09-01
+2007-10-01
+2007-11-01
+2007-12-01
+2008-01-01
+2008-02-01
+2008-03-01
+2008-04-01
+2008-05-01
+2008-06-01
+2008-07-01
+2008-08-01
+2008-09-01
+2008-10-01
+2008-11-01
+2008-12-01
+2009-01-01
+2009-02-01
+2009-03-01
+2009-04-01
+2009-05-01
+2009-06-01
+2009-07-01
+2009-08-01
+2009-09-01
+2009-10-01
+2009-11-01
+2009-12-01
+2010-01-01
+2010-02-01
+2010-03-01
+2010-04-01
+2010-05-01
+2010-06-01
+2010-07-01
+2010-08-01
+2010-09-01
+2010-10-01
+2010-11-01
+2010-12-01
+2011-01-01
+2011-02-01
+2011-03-01
+2011-04-01
+2011-05-01
+2011-06-01
+2011-07-01
+2011-08-01
+2011-09-01
+2011-10-01
+2011-11-01
+2011-12-01
+2012-01-01
+2012-02-01
+2012-03-01
+2012-04-01
+2012-05-01
+2012-06-01
+2012-07-01
+2012-08-01
+2012-09-01
+2012-10-01
+2012-11-01
+2012-12-01
+2013-01-01
+2013-02-01
+2013-03-01
+2013-04-01
+2013-05-01
+2013-06-01
+2013-07-01
+2013-08-01
+2013-09-01
+2013-10-01
+2013-11-01
+2013-12-01
+2014-01-01
+2014-02-01
+2014-03-01
+2014-04-01
+2014-05-01
+2014-06-01
+2014-07-01
+2014-08-01
+2014-09-01
+2014-10-01
+2014-11-01
+2014-12-01
+2015-01-01
+2015-02-01
+2015-03-01
+2015-04-01
+2015-05-01
+2015-06-01
+2015-07-01
+2015-08-01
+2015-09-01
+2015-10-01
+2015-11-01
+2015-12-01
+2016-01-01
+2016-02-01
+2016-03-01
+2016-04-01
+2016-05-01
+2016-06-01
+2016-07-01
+2016-08-01
+2016-09-01
+2016-10-01
+2016-11-01
+2016-12-01
+2017-01-01
+2017-02-01
+2017-03-01
+2017-04-01
+2017-05-01
+2017-06-01
+2017-07-01
+2017-08-01
+2017-09-01
+2017-10-01
+2017-11-01
+2017-12-01
+2018-01-01
+2018-02-01
+2018-03-01
+2018-04-01
+2018-05-01
+2018-06-01
+2018-07-01
+2018-08-01
+2018-09-01
+2018-10-01
+2018-11-01
+2018-12-01
+2019-01-01
+2019-02-01
+2019-03-01
+2019-04-01
+2019-05-01
+2019-06-01
+2019-07-01
+2019-08-01
+2019-09-01
+2019-10-01
+2019-11-01
+2019-12-01
+2020-01-01
+2020-02-01
+2020-03-01
+2020-04-01
+2020-05-01
+2020-06-01
+2020-07-01
+2020-08-01
+2020-09-01
+2020-10-01
+2020-11-01
+2020-12-01
+2021-01-01
+2021-02-01
+2021-03-01
+2021-04-01
+2021-05-01
+2021-06-01
+2021-07-01
+2021-08-01
+2021-09-01
+2021-10-01
+2021-11-01
+2021-12-01
+2022-01-01
+2022-02-01
+2022-03-01
+2022-04-01
+2022-05-01
+2022-06-01
+2022-07-01
+2022-08-01
+2022-09-01
+2022-10-01
+2022-11-01
+2022-12-01
+2023-01-01
+2023-02-01
+2023-03-01
+2023-04-01
+2023-05-01
+2023-06-01
+2023-07-01
+2023-08-01
+2023-09-01
+2023-10-01
+2023-11-01
+2023-12-01
+2024-01-01
+2024-02-01
+2024-03-01
+2024-04-01
+2024-05-01
+2024-06-01
+2024-07-01
+2024-08-01
+2024-09-01
+2024-10-01
+2024-11-01
+2024-12-01
+2025-01-01
+2025-02-01
+2025-03-01
+2025-04-01
+2025-05-01
+2025-06-01
+2025-07-01
+2025-08-01
+2025-09-01
+2025-10-01
+2025-11-01
+2025-12-01
+2026-01-01
+2026-02-01
+2026-03-01
+2026-04-01
+2026-05-01
+2026-06-01
+2026-07-01
+2026-08-01
+2026-09-01
+2026-10-01
+2026-11-01
+2026-12-01
+2027-01-01
+2027-02-01
+2027-03-01
+2027-04-01
+2027-05-01
+2027-06-01
+2027-07-01
+2027-08-01
+2027-09-01
+2027-10-01
+2027-11-01
+2027-12-01
+2028-01-01
+2028-02-01
+2028-03-01
+2028-04-01
+2028-05-01
+2028-06-01
+2028-07-01
+2028-08-01
+2028-09-01
+2028-10-01
+2028-11-01
+2028-12-01
+2029-01-01
+2029-02-01
+2029-03-01
+2029-04-01
+2029-05-01
+2029-06-01
+2029-07-01
+2029-08-01
+2029-09-01
+2029-10-01
+2029-11-01
+2029-12-01
+2030-01-01
+2030-02-01
+2030-03-01
+2030-04-01
+2030-05-01
+2030-06-01
+2030-07-01
+2030-08-01
+2030-09-01
+2030-10-01
+2030-11-01
+2030-12-01
+2031-01-01
+2031-02-01
+2031-03-01
+2031-04-01
+2031-05-01
+2031-06-01
+2031-07-01
+2031-08-01
+2031-09-01
+2031-10-01
+2031-11-01
+2031-12-01
+2032-01-01
+2032-02-01
+2032-03-01
+2032-04-01
+2032-05-01
+2032-06-01
+2032-07-01
+2032-08-01
+2032-09-01
+2032-10-01
+2032-11-01
+2032-12-01
+2033-01-01
+2033-02-01
+2033-03-01
+2033-04-01
+2033-05-01
+2033-06-01
+2033-07-01
+2033-08-01
+2033-09-01
+2033-10-01
+2033-11-01
+2033-12-01
+2034-01-01
+2034-02-01
+2034-03-01
+2034-04-01
+2034-05-01
+2034-06-01
+2034-07-01
+2034-08-01
+2034-09-01
+2034-10-01
+2034-11-01
+2034-12-01
+2035-01-01
+2035-02-01
+2035-03-01
+2035-04-01
+2035-05-01
+2035-06-01
+2035-07-01
+2035-08-01
+2035-09-01
+2035-10-01
+2035-11-01
+2035-12-01
+2036-01-01
+2036-02-01
+2036-03-01
+2036-04-01
+2036-05-01
+2036-06-01
+2036-07-01
+2036-08-01
+2036-09-01
+2036-10-01
+2036-11-01
+2036-12-01
+2037-01-01
+2037-02-01
+2037-03-01
+2037-04-01
+2037-05-01
+2037-06-01
+2037-07-01
+2037-08-01
+2037-09-01
+2037-10-01
+2037-11-01
+2037-12-01
+2038-01-01
+2038-02-01
+2038-03-01
+2038-04-01
+2038-05-01
+2038-06-01
+2038-07-01
+2038-08-01
+2038-09-01
+2038-10-01
+2038-11-01
+2038-12-01
+2039-01-01
+2039-02-01
+2039-03-01
+2039-04-01
+2039-05-01
+2039-06-01
+2039-07-01
+2039-08-01
+2039-09-01
+2039-10-01
+2039-11-01
+2039-12-01
+2040-01-01
+2040-02-01
+2040-03-01
+2040-04-01
+2040-05-01
+2040-06-01
+2040-07-01
+2040-08-01
+2040-09-01
+2040-10-01
+2040-11-01
+2040-12-01
+2041-01-01
+2041-02-01
+2041-03-01
+2041-04-01
+2041-05-01
+2041-06-01
+2041-07-01
+2041-08-01
+2041-09-01
+2041-10-01
+2041-11-01
+2041-12-01
+2042-01-01
+2042-02-01
+2042-03-01
+2042-04-01
+2042-05-01
+2042-06-01
+2042-07-01
+2042-08-01
+2042-09-01
+2042-10-01
+2042-11-01
+2042-12-01
+2043-01-01
+2043-02-01
+2043-03-01
+2043-04-01
+2043-05-01
+2043-06-01
+2043-07-01
+2043-08-01
+2043-09-01
+2043-10-01
+2043-11-01
+2043-12-01
+2044-01-01
+2044-02-01
+2044-03-01
+2044-04-01
+2044-05-01
+2044-06-01
+2044-07-01
+2044-08-01
+2044-09-01
+2044-10-01
+2044-11-01
+2044-12-01
+2045-01-01
+2045-02-01
+2045-03-01
+2045-04-01
+2045-05-01
+2045-06-01
+2045-07-01
+2045-08-01
+2045-09-01
+2045-10-01
+2045-11-01
+2045-12-01
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily6.ics b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily6.ics
new file mode 100644
index 00000000..77c16530
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily6.ics
@@ -0,0 +1,31 @@
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+VERSION:2.0
+PRODID:-//MH Software Inc//Connect Daily - 3.0.7//EN
+X-LibKCal-Testsuite-OutTZ:America/Denver
+
+BEGIN:VTIMEZONE
+TZID:America/Denver
+BEGIN:STANDARD
+DTSTART:19671029T020000
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE
+
+BEGIN:VEVENT
+UID:1212@67.154.139.115
+RECURRENCE-ID:19700101T070000Z
+SUMMARY:First Weekday
+DTSTART;TZID=America/Denver;VALUE=DATE:20040503
+RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=1
+DURATION:P1D
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily6.ics.next.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily6.ics.next.ref
new file mode 100644
index 00000000..4884ce35
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily6.ics.next.ref
@@ -0,0 +1,500 @@
+2004-05-03T00:00:00
+2004-06-01T00:00:00
+2004-07-01T00:00:00
+2004-08-02T00:00:00
+2004-09-01T00:00:00
+2004-10-01T00:00:00
+2004-11-01T00:00:00
+2004-12-01T00:00:00
+2005-01-03T00:00:00
+2005-02-01T00:00:00
+2005-03-01T00:00:00
+2005-04-01T00:00:00
+2005-05-02T00:00:00
+2005-06-01T00:00:00
+2005-07-01T00:00:00
+2005-08-01T00:00:00
+2005-09-01T00:00:00
+2005-10-03T00:00:00
+2005-11-01T00:00:00
+2005-12-01T00:00:00
+2006-01-02T00:00:00
+2006-02-01T00:00:00
+2006-03-01T00:00:00
+2006-04-03T00:00:00
+2006-05-01T00:00:00
+2006-06-01T00:00:00
+2006-07-03T00:00:00
+2006-08-01T00:00:00
+2006-09-01T00:00:00
+2006-10-02T00:00:00
+2006-11-01T00:00:00
+2006-12-01T00:00:00
+2007-01-01T00:00:00
+2007-02-01T00:00:00
+2007-03-01T00:00:00
+2007-04-02T00:00:00
+2007-05-01T00:00:00
+2007-06-01T00:00:00
+2007-07-02T00:00:00
+2007-08-01T00:00:00
+2007-09-03T00:00:00
+2007-10-01T00:00:00
+2007-11-01T00:00:00
+2007-12-03T00:00:00
+2008-01-01T00:00:00
+2008-02-01T00:00:00
+2008-03-03T00:00:00
+2008-04-01T00:00:00
+2008-05-01T00:00:00
+2008-06-02T00:00:00
+2008-07-01T00:00:00
+2008-08-01T00:00:00
+2008-09-01T00:00:00
+2008-10-01T00:00:00
+2008-11-03T00:00:00
+2008-12-01T00:00:00
+2009-01-01T00:00:00
+2009-02-02T00:00:00
+2009-03-02T00:00:00
+2009-04-01T00:00:00
+2009-05-01T00:00:00
+2009-06-01T00:00:00
+2009-07-01T00:00:00
+2009-08-03T00:00:00
+2009-09-01T00:00:00
+2009-10-01T00:00:00
+2009-11-02T00:00:00
+2009-12-01T00:00:00
+2010-01-01T00:00:00
+2010-02-01T00:00:00
+2010-03-01T00:00:00
+2010-04-01T00:00:00
+2010-05-03T00:00:00
+2010-06-01T00:00:00
+2010-07-01T00:00:00
+2010-08-02T00:00:00
+2010-09-01T00:00:00
+2010-10-01T00:00:00
+2010-11-01T00:00:00
+2010-12-01T00:00:00
+2011-01-03T00:00:00
+2011-02-01T00:00:00
+2011-03-01T00:00:00
+2011-04-01T00:00:00
+2011-05-02T00:00:00
+2011-06-01T00:00:00
+2011-07-01T00:00:00
+2011-08-01T00:00:00
+2011-09-01T00:00:00
+2011-10-03T00:00:00
+2011-11-01T00:00:00
+2011-12-01T00:00:00
+2012-01-02T00:00:00
+2012-02-01T00:00:00
+2012-03-01T00:00:00
+2012-04-02T00:00:00
+2012-05-01T00:00:00
+2012-06-01T00:00:00
+2012-07-02T00:00:00
+2012-08-01T00:00:00
+2012-09-03T00:00:00
+2012-10-01T00:00:00
+2012-11-01T00:00:00
+2012-12-03T00:00:00
+2013-01-01T00:00:00
+2013-02-01T00:00:00
+2013-03-01T00:00:00
+2013-04-01T00:00:00
+2013-05-01T00:00:00
+2013-06-03T00:00:00
+2013-07-01T00:00:00
+2013-08-01T00:00:00
+2013-09-02T00:00:00
+2013-10-01T00:00:00
+2013-11-01T00:00:00
+2013-12-02T00:00:00
+2014-01-01T00:00:00
+2014-02-03T00:00:00
+2014-03-03T00:00:00
+2014-04-01T00:00:00
+2014-05-01T00:00:00
+2014-06-02T00:00:00
+2014-07-01T00:00:00
+2014-08-01T00:00:00
+2014-09-01T00:00:00
+2014-10-01T00:00:00
+2014-11-03T00:00:00
+2014-12-01T00:00:00
+2015-01-01T00:00:00
+2015-02-02T00:00:00
+2015-03-02T00:00:00
+2015-04-01T00:00:00
+2015-05-01T00:00:00
+2015-06-01T00:00:00
+2015-07-01T00:00:00
+2015-08-03T00:00:00
+2015-09-01T00:00:00
+2015-10-01T00:00:00
+2015-11-02T00:00:00
+2015-12-01T00:00:00
+2016-01-01T00:00:00
+2016-02-01T00:00:00
+2016-03-01T00:00:00
+2016-04-01T00:00:00
+2016-05-02T00:00:00
+2016-06-01T00:00:00
+2016-07-01T00:00:00
+2016-08-01T00:00:00
+2016-09-01T00:00:00
+2016-10-03T00:00:00
+2016-11-01T00:00:00
+2016-12-01T00:00:00
+2017-01-02T00:00:00
+2017-02-01T00:00:00
+2017-03-01T00:00:00
+2017-04-03T00:00:00
+2017-05-01T00:00:00
+2017-06-01T00:00:00
+2017-07-03T00:00:00
+2017-08-01T00:00:00
+2017-09-01T00:00:00
+2017-10-02T00:00:00
+2017-11-01T00:00:00
+2017-12-01T00:00:00
+2018-01-01T00:00:00
+2018-02-01T00:00:00
+2018-03-01T00:00:00
+2018-04-02T00:00:00
+2018-05-01T00:00:00
+2018-06-01T00:00:00
+2018-07-02T00:00:00
+2018-08-01T00:00:00
+2018-09-03T00:00:00
+2018-10-01T00:00:00
+2018-11-01T00:00:00
+2018-12-03T00:00:00
+2019-01-01T00:00:00
+2019-02-01T00:00:00
+2019-03-01T00:00:00
+2019-04-01T00:00:00
+2019-05-01T00:00:00
+2019-06-03T00:00:00
+2019-07-01T00:00:00
+2019-08-01T00:00:00
+2019-09-02T00:00:00
+2019-10-01T00:00:00
+2019-11-01T00:00:00
+2019-12-02T00:00:00
+2020-01-01T00:00:00
+2020-02-03T00:00:00
+2020-03-02T00:00:00
+2020-04-01T00:00:00
+2020-05-01T00:00:00
+2020-06-01T00:00:00
+2020-07-01T00:00:00
+2020-08-03T00:00:00
+2020-09-01T00:00:00
+2020-10-01T00:00:00
+2020-11-02T00:00:00
+2020-12-01T00:00:00
+2021-01-01T00:00:00
+2021-02-01T00:00:00
+2021-03-01T00:00:00
+2021-04-01T00:00:00
+2021-05-03T00:00:00
+2021-06-01T00:00:00
+2021-07-01T00:00:00
+2021-08-02T00:00:00
+2021-09-01T00:00:00
+2021-10-01T00:00:00
+2021-11-01T00:00:00
+2021-12-01T00:00:00
+2022-01-03T00:00:00
+2022-02-01T00:00:00
+2022-03-01T00:00:00
+2022-04-01T00:00:00
+2022-05-02T00:00:00
+2022-06-01T00:00:00
+2022-07-01T00:00:00
+2022-08-01T00:00:00
+2022-09-01T00:00:00
+2022-10-03T00:00:00
+2022-11-01T00:00:00
+2022-12-01T00:00:00
+2023-01-02T00:00:00
+2023-02-01T00:00:00
+2023-03-01T00:00:00
+2023-04-03T00:00:00
+2023-05-01T00:00:00
+2023-06-01T00:00:00
+2023-07-03T00:00:00
+2023-08-01T00:00:00
+2023-09-01T00:00:00
+2023-10-02T00:00:00
+2023-11-01T00:00:00
+2023-12-01T00:00:00
+2024-01-01T00:00:00
+2024-02-01T00:00:00
+2024-03-01T00:00:00
+2024-04-01T00:00:00
+2024-05-01T00:00:00
+2024-06-03T00:00:00
+2024-07-01T00:00:00
+2024-08-01T00:00:00
+2024-09-02T00:00:00
+2024-10-01T00:00:00
+2024-11-01T00:00:00
+2024-12-02T00:00:00
+2025-01-01T00:00:00
+2025-02-03T00:00:00
+2025-03-03T00:00:00
+2025-04-01T00:00:00
+2025-05-01T00:00:00
+2025-06-02T00:00:00
+2025-07-01T00:00:00
+2025-08-01T00:00:00
+2025-09-01T00:00:00
+2025-10-01T00:00:00
+2025-11-03T00:00:00
+2025-12-01T00:00:00
+2026-01-01T00:00:00
+2026-02-02T00:00:00
+2026-03-02T00:00:00
+2026-04-01T00:00:00
+2026-05-01T00:00:00
+2026-06-01T00:00:00
+2026-07-01T00:00:00
+2026-08-03T00:00:00
+2026-09-01T00:00:00
+2026-10-01T00:00:00
+2026-11-02T00:00:00
+2026-12-01T00:00:00
+2027-01-01T00:00:00
+2027-02-01T00:00:00
+2027-03-01T00:00:00
+2027-04-01T00:00:00
+2027-05-03T00:00:00
+2027-06-01T00:00:00
+2027-07-01T00:00:00
+2027-08-02T00:00:00
+2027-09-01T00:00:00
+2027-10-01T00:00:00
+2027-11-01T00:00:00
+2027-12-01T00:00:00
+2028-01-03T00:00:00
+2028-02-01T00:00:00
+2028-03-01T00:00:00
+2028-04-03T00:00:00
+2028-05-01T00:00:00
+2028-06-01T00:00:00
+2028-07-03T00:00:00
+2028-08-01T00:00:00
+2028-09-01T00:00:00
+2028-10-02T00:00:00
+2028-11-01T00:00:00
+2028-12-01T00:00:00
+2029-01-01T00:00:00
+2029-02-01T00:00:00
+2029-03-01T00:00:00
+2029-04-02T00:00:00
+2029-05-01T00:00:00
+2029-06-01T00:00:00
+2029-07-02T00:00:00
+2029-08-01T00:00:00
+2029-09-03T00:00:00
+2029-10-01T00:00:00
+2029-11-01T00:00:00
+2029-12-03T00:00:00
+2030-01-01T00:00:00
+2030-02-01T00:00:00
+2030-03-01T00:00:00
+2030-04-01T00:00:00
+2030-05-01T00:00:00
+2030-06-03T00:00:00
+2030-07-01T00:00:00
+2030-08-01T00:00:00
+2030-09-02T00:00:00
+2030-10-01T00:00:00
+2030-11-01T00:00:00
+2030-12-02T00:00:00
+2031-01-01T00:00:00
+2031-02-03T00:00:00
+2031-03-03T00:00:00
+2031-04-01T00:00:00
+2031-05-01T00:00:00
+2031-06-02T00:00:00
+2031-07-01T00:00:00
+2031-08-01T00:00:00
+2031-09-01T00:00:00
+2031-10-01T00:00:00
+2031-11-03T00:00:00
+2031-12-01T00:00:00
+2032-01-01T00:00:00
+2032-02-02T00:00:00
+2032-03-01T00:00:00
+2032-04-01T00:00:00
+2032-05-03T00:00:00
+2032-06-01T00:00:00
+2032-07-01T00:00:00
+2032-08-02T00:00:00
+2032-09-01T00:00:00
+2032-10-01T00:00:00
+2032-11-01T00:00:00
+2032-12-01T00:00:00
+2033-01-03T00:00:00
+2033-02-01T00:00:00
+2033-03-01T00:00:00
+2033-04-01T00:00:00
+2033-05-02T00:00:00
+2033-06-01T00:00:00
+2033-07-01T00:00:00
+2033-08-01T00:00:00
+2033-09-01T00:00:00
+2033-10-03T00:00:00
+2033-11-01T00:00:00
+2033-12-01T00:00:00
+2034-01-02T00:00:00
+2034-02-01T00:00:00
+2034-03-01T00:00:00
+2034-04-03T00:00:00
+2034-05-01T00:00:00
+2034-06-01T00:00:00
+2034-07-03T00:00:00
+2034-08-01T00:00:00
+2034-09-01T00:00:00
+2034-10-02T00:00:00
+2034-11-01T00:00:00
+2034-12-01T00:00:00
+2035-01-01T00:00:00
+2035-02-01T00:00:00
+2035-03-01T00:00:00
+2035-04-02T00:00:00
+2035-05-01T00:00:00
+2035-06-01T00:00:00
+2035-07-02T00:00:00
+2035-08-01T00:00:00
+2035-09-03T00:00:00
+2035-10-01T00:00:00
+2035-11-01T00:00:00
+2035-12-03T00:00:00
+2036-01-01T00:00:00
+2036-02-01T00:00:00
+2036-03-03T00:00:00
+2036-04-01T00:00:00
+2036-05-01T00:00:00
+2036-06-02T00:00:00
+2036-07-01T00:00:00
+2036-08-01T00:00:00
+2036-09-01T00:00:00
+2036-10-01T00:00:00
+2036-11-03T00:00:00
+2036-12-01T00:00:00
+2037-01-01T00:00:00
+2037-02-02T00:00:00
+2037-03-02T00:00:00
+2037-04-01T00:00:00
+2037-05-01T00:00:00
+2037-06-01T00:00:00
+2037-07-01T00:00:00
+2037-08-03T00:00:00
+2037-09-01T00:00:00
+2037-10-01T00:00:00
+2037-11-02T00:00:00
+2037-12-01T00:00:00
+2038-01-01T00:00:00
+2038-02-01T00:00:00
+2038-03-01T00:00:00
+2038-04-01T00:00:00
+2038-05-03T00:00:00
+2038-06-01T00:00:00
+2038-07-01T00:00:00
+2038-08-02T00:00:00
+2038-09-01T00:00:00
+2038-10-01T00:00:00
+2038-11-01T00:00:00
+2038-12-01T00:00:00
+2039-01-03T00:00:00
+2039-02-01T00:00:00
+2039-03-01T00:00:00
+2039-04-01T00:00:00
+2039-05-02T00:00:00
+2039-06-01T00:00:00
+2039-07-01T00:00:00
+2039-08-01T00:00:00
+2039-09-01T00:00:00
+2039-10-03T00:00:00
+2039-11-01T00:00:00
+2039-12-01T00:00:00
+2040-01-02T00:00:00
+2040-02-01T00:00:00
+2040-03-01T00:00:00
+2040-04-02T00:00:00
+2040-05-01T00:00:00
+2040-06-01T00:00:00
+2040-07-02T00:00:00
+2040-08-01T00:00:00
+2040-09-03T00:00:00
+2040-10-01T00:00:00
+2040-11-01T00:00:00
+2040-12-03T00:00:00
+2041-01-01T00:00:00
+2041-02-01T00:00:00
+2041-03-01T00:00:00
+2041-04-01T00:00:00
+2041-05-01T00:00:00
+2041-06-03T00:00:00
+2041-07-01T00:00:00
+2041-08-01T00:00:00
+2041-09-02T00:00:00
+2041-10-01T00:00:00
+2041-11-01T00:00:00
+2041-12-02T00:00:00
+2042-01-01T00:00:00
+2042-02-03T00:00:00
+2042-03-03T00:00:00
+2042-04-01T00:00:00
+2042-05-01T00:00:00
+2042-06-02T00:00:00
+2042-07-01T00:00:00
+2042-08-01T00:00:00
+2042-09-01T00:00:00
+2042-10-01T00:00:00
+2042-11-03T00:00:00
+2042-12-01T00:00:00
+2043-01-01T00:00:00
+2043-02-02T00:00:00
+2043-03-02T00:00:00
+2043-04-01T00:00:00
+2043-05-01T00:00:00
+2043-06-01T00:00:00
+2043-07-01T00:00:00
+2043-08-03T00:00:00
+2043-09-01T00:00:00
+2043-10-01T00:00:00
+2043-11-02T00:00:00
+2043-12-01T00:00:00
+2044-01-01T00:00:00
+2044-02-01T00:00:00
+2044-03-01T00:00:00
+2044-04-01T00:00:00
+2044-05-02T00:00:00
+2044-06-01T00:00:00
+2044-07-01T00:00:00
+2044-08-01T00:00:00
+2044-09-01T00:00:00
+2044-10-03T00:00:00
+2044-11-01T00:00:00
+2044-12-01T00:00:00
+2045-01-02T00:00:00
+2045-02-01T00:00:00
+2045-03-01T00:00:00
+2045-04-03T00:00:00
+2045-05-01T00:00:00
+2045-06-01T00:00:00
+2045-07-03T00:00:00
+2045-08-01T00:00:00
+2045-09-01T00:00:00
+2045-10-02T00:00:00
+2045-11-01T00:00:00
+2045-12-01T00:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily6.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily6.ics.prev.ref
new file mode 100644
index 00000000..8321de62
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily6.ics.prev.ref
@@ -0,0 +1,81 @@
+2010-12-01T00:00:00
+2010-11-01T00:00:00
+2010-10-01T00:00:00
+2010-09-01T00:00:00
+2010-08-02T00:00:00
+2010-07-01T00:00:00
+2010-06-01T00:00:00
+2010-05-03T00:00:00
+2010-04-01T00:00:00
+2010-03-01T00:00:00
+2010-02-01T00:00:00
+2010-01-01T00:00:00
+2009-12-01T00:00:00
+2009-11-02T00:00:00
+2009-10-01T00:00:00
+2009-09-01T00:00:00
+2009-08-03T00:00:00
+2009-07-01T00:00:00
+2009-06-01T00:00:00
+2009-05-01T00:00:00
+2009-04-01T00:00:00
+2009-03-02T00:00:00
+2009-02-02T00:00:00
+2009-01-01T00:00:00
+2008-12-01T00:00:00
+2008-11-03T00:00:00
+2008-10-01T00:00:00
+2008-09-01T00:00:00
+2008-08-01T00:00:00
+2008-07-01T00:00:00
+2008-06-02T00:00:00
+2008-05-01T00:00:00
+2008-04-01T00:00:00
+2008-03-03T00:00:00
+2008-02-01T00:00:00
+2008-01-01T00:00:00
+2007-12-03T00:00:00
+2007-11-01T00:00:00
+2007-10-01T00:00:00
+2007-09-03T00:00:00
+2007-08-01T00:00:00
+2007-07-02T00:00:00
+2007-06-01T00:00:00
+2007-05-01T00:00:00
+2007-04-02T00:00:00
+2007-03-01T00:00:00
+2007-02-01T00:00:00
+2007-01-01T00:00:00
+2006-12-01T00:00:00
+2006-11-01T00:00:00
+2006-10-02T00:00:00
+2006-09-01T00:00:00
+2006-08-01T00:00:00
+2006-07-03T00:00:00
+2006-06-01T00:00:00
+2006-05-01T00:00:00
+2006-04-03T00:00:00
+2006-03-01T00:00:00
+2006-02-01T00:00:00
+2006-01-02T00:00:00
+2005-12-01T00:00:00
+2005-11-01T00:00:00
+2005-10-03T00:00:00
+2005-09-01T00:00:00
+2005-08-01T00:00:00
+2005-07-01T00:00:00
+2005-06-01T00:00:00
+2005-05-02T00:00:00
+2005-04-01T00:00:00
+2005-03-01T00:00:00
+2005-02-01T00:00:00
+2005-01-03T00:00:00
+2004-12-01T00:00:00
+2004-11-01T00:00:00
+2004-10-01T00:00:00
+2004-09-01T00:00:00
+2004-08-02T00:00:00
+2004-07-01T00:00:00
+2004-06-01T00:00:00
+2004-05-03T00:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily6.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily6.ics.recurson.ref
new file mode 100644
index 00000000..713fac68
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily6.ics.recurson.ref
@@ -0,0 +1,80 @@
+2004-05-03
+2004-06-01
+2004-07-01
+2004-08-02
+2004-09-01
+2004-10-01
+2004-11-01
+2004-12-01
+2005-01-03
+2005-02-01
+2005-03-01
+2005-04-01
+2005-05-02
+2005-06-01
+2005-07-01
+2005-08-01
+2005-09-01
+2005-10-03
+2005-11-01
+2005-12-01
+2006-01-02
+2006-02-01
+2006-03-01
+2006-04-03
+2006-05-01
+2006-06-01
+2006-07-03
+2006-08-01
+2006-09-01
+2006-10-02
+2006-11-01
+2006-12-01
+2007-01-01
+2007-02-01
+2007-03-01
+2007-04-02
+2007-05-01
+2007-06-01
+2007-07-02
+2007-08-01
+2007-09-03
+2007-10-01
+2007-11-01
+2007-12-03
+2008-01-01
+2008-02-01
+2008-03-03
+2008-04-01
+2008-05-01
+2008-06-02
+2008-07-01
+2008-08-01
+2008-09-01
+2008-10-01
+2008-11-03
+2008-12-01
+2009-01-01
+2009-02-02
+2009-03-02
+2009-04-01
+2009-05-01
+2009-06-01
+2009-07-01
+2009-08-03
+2009-09-01
+2009-10-01
+2009-11-02
+2009-12-01
+2010-01-01
+2010-02-01
+2010-03-01
+2010-04-01
+2010-05-03
+2010-06-01
+2010-07-01
+2010-08-02
+2010-09-01
+2010-10-01
+2010-11-01
+2010-12-01
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily7.ics b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily7.ics
new file mode 100644
index 00000000..515cef99
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily7.ics
@@ -0,0 +1,31 @@
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+VERSION:2.0
+PRODID:-//MH Software Inc//Connect Daily - 3.0.7//EN
+X-LibKCal-Testsuite-OutTZ:America/Denver
+
+BEGIN:VTIMEZONE
+TZID:America/Denver
+BEGIN:STANDARD
+DTSTART:19671029T020000
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE
+
+BEGIN:VEVENT
+UID:1208@67.154.139.115
+RECURRENCE-ID:19700101T070000Z
+SUMMARY:Last Day
+DTSTART;TZID=America/Denver;VALUE=DATE:20040531
+RRULE:FREQ=MONTHLY;BYMONTHDAY=-1
+DURATION:P1D
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily7.ics.next.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily7.ics.next.ref
new file mode 100644
index 00000000..28c155d0
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily7.ics.next.ref
@@ -0,0 +1,500 @@
+2004-05-31T00:00:00
+2004-06-30T00:00:00
+2004-07-31T00:00:00
+2004-08-31T00:00:00
+2004-09-30T00:00:00
+2004-10-31T00:00:00
+2004-11-30T00:00:00
+2004-12-31T00:00:00
+2005-01-31T00:00:00
+2005-02-28T00:00:00
+2005-03-31T00:00:00
+2005-04-30T00:00:00
+2005-05-31T00:00:00
+2005-06-30T00:00:00
+2005-07-31T00:00:00
+2005-08-31T00:00:00
+2005-09-30T00:00:00
+2005-10-31T00:00:00
+2005-11-30T00:00:00
+2005-12-31T00:00:00
+2006-01-31T00:00:00
+2006-02-28T00:00:00
+2006-03-31T00:00:00
+2006-04-30T00:00:00
+2006-05-31T00:00:00
+2006-06-30T00:00:00
+2006-07-31T00:00:00
+2006-08-31T00:00:00
+2006-09-30T00:00:00
+2006-10-31T00:00:00
+2006-11-30T00:00:00
+2006-12-31T00:00:00
+2007-01-31T00:00:00
+2007-02-28T00:00:00
+2007-03-31T00:00:00
+2007-04-30T00:00:00
+2007-05-31T00:00:00
+2007-06-30T00:00:00
+2007-07-31T00:00:00
+2007-08-31T00:00:00
+2007-09-30T00:00:00
+2007-10-31T00:00:00
+2007-11-30T00:00:00
+2007-12-31T00:00:00
+2008-01-31T00:00:00
+2008-02-29T00:00:00
+2008-03-31T00:00:00
+2008-04-30T00:00:00
+2008-05-31T00:00:00
+2008-06-30T00:00:00
+2008-07-31T00:00:00
+2008-08-31T00:00:00
+2008-09-30T00:00:00
+2008-10-31T00:00:00
+2008-11-30T00:00:00
+2008-12-31T00:00:00
+2009-01-31T00:00:00
+2009-02-28T00:00:00
+2009-03-31T00:00:00
+2009-04-30T00:00:00
+2009-05-31T00:00:00
+2009-06-30T00:00:00
+2009-07-31T00:00:00
+2009-08-31T00:00:00
+2009-09-30T00:00:00
+2009-10-31T00:00:00
+2009-11-30T00:00:00
+2009-12-31T00:00:00
+2010-01-31T00:00:00
+2010-02-28T00:00:00
+2010-03-31T00:00:00
+2010-04-30T00:00:00
+2010-05-31T00:00:00
+2010-06-30T00:00:00
+2010-07-31T00:00:00
+2010-08-31T00:00:00
+2010-09-30T00:00:00
+2010-10-31T00:00:00
+2010-11-30T00:00:00
+2010-12-31T00:00:00
+2011-01-31T00:00:00
+2011-02-28T00:00:00
+2011-03-31T00:00:00
+2011-04-30T00:00:00
+2011-05-31T00:00:00
+2011-06-30T00:00:00
+2011-07-31T00:00:00
+2011-08-31T00:00:00
+2011-09-30T00:00:00
+2011-10-31T00:00:00
+2011-11-30T00:00:00
+2011-12-31T00:00:00
+2012-01-31T00:00:00
+2012-02-29T00:00:00
+2012-03-31T00:00:00
+2012-04-30T00:00:00
+2012-05-31T00:00:00
+2012-06-30T00:00:00
+2012-07-31T00:00:00
+2012-08-31T00:00:00
+2012-09-30T00:00:00
+2012-10-31T00:00:00
+2012-11-30T00:00:00
+2012-12-31T00:00:00
+2013-01-31T00:00:00
+2013-02-28T00:00:00
+2013-03-31T00:00:00
+2013-04-30T00:00:00
+2013-05-31T00:00:00
+2013-06-30T00:00:00
+2013-07-31T00:00:00
+2013-08-31T00:00:00
+2013-09-30T00:00:00
+2013-10-31T00:00:00
+2013-11-30T00:00:00
+2013-12-31T00:00:00
+2014-01-31T00:00:00
+2014-02-28T00:00:00
+2014-03-31T00:00:00
+2014-04-30T00:00:00
+2014-05-31T00:00:00
+2014-06-30T00:00:00
+2014-07-31T00:00:00
+2014-08-31T00:00:00
+2014-09-30T00:00:00
+2014-10-31T00:00:00
+2014-11-30T00:00:00
+2014-12-31T00:00:00
+2015-01-31T00:00:00
+2015-02-28T00:00:00
+2015-03-31T00:00:00
+2015-04-30T00:00:00
+2015-05-31T00:00:00
+2015-06-30T00:00:00
+2015-07-31T00:00:00
+2015-08-31T00:00:00
+2015-09-30T00:00:00
+2015-10-31T00:00:00
+2015-11-30T00:00:00
+2015-12-31T00:00:00
+2016-01-31T00:00:00
+2016-02-29T00:00:00
+2016-03-31T00:00:00
+2016-04-30T00:00:00
+2016-05-31T00:00:00
+2016-06-30T00:00:00
+2016-07-31T00:00:00
+2016-08-31T00:00:00
+2016-09-30T00:00:00
+2016-10-31T00:00:00
+2016-11-30T00:00:00
+2016-12-31T00:00:00
+2017-01-31T00:00:00
+2017-02-28T00:00:00
+2017-03-31T00:00:00
+2017-04-30T00:00:00
+2017-05-31T00:00:00
+2017-06-30T00:00:00
+2017-07-31T00:00:00
+2017-08-31T00:00:00
+2017-09-30T00:00:00
+2017-10-31T00:00:00
+2017-11-30T00:00:00
+2017-12-31T00:00:00
+2018-01-31T00:00:00
+2018-02-28T00:00:00
+2018-03-31T00:00:00
+2018-04-30T00:00:00
+2018-05-31T00:00:00
+2018-06-30T00:00:00
+2018-07-31T00:00:00
+2018-08-31T00:00:00
+2018-09-30T00:00:00
+2018-10-31T00:00:00
+2018-11-30T00:00:00
+2018-12-31T00:00:00
+2019-01-31T00:00:00
+2019-02-28T00:00:00
+2019-03-31T00:00:00
+2019-04-30T00:00:00
+2019-05-31T00:00:00
+2019-06-30T00:00:00
+2019-07-31T00:00:00
+2019-08-31T00:00:00
+2019-09-30T00:00:00
+2019-10-31T00:00:00
+2019-11-30T00:00:00
+2019-12-31T00:00:00
+2020-01-31T00:00:00
+2020-02-29T00:00:00
+2020-03-31T00:00:00
+2020-04-30T00:00:00
+2020-05-31T00:00:00
+2020-06-30T00:00:00
+2020-07-31T00:00:00
+2020-08-31T00:00:00
+2020-09-30T00:00:00
+2020-10-31T00:00:00
+2020-11-30T00:00:00
+2020-12-31T00:00:00
+2021-01-31T00:00:00
+2021-02-28T00:00:00
+2021-03-31T00:00:00
+2021-04-30T00:00:00
+2021-05-31T00:00:00
+2021-06-30T00:00:00
+2021-07-31T00:00:00
+2021-08-31T00:00:00
+2021-09-30T00:00:00
+2021-10-31T00:00:00
+2021-11-30T00:00:00
+2021-12-31T00:00:00
+2022-01-31T00:00:00
+2022-02-28T00:00:00
+2022-03-31T00:00:00
+2022-04-30T00:00:00
+2022-05-31T00:00:00
+2022-06-30T00:00:00
+2022-07-31T00:00:00
+2022-08-31T00:00:00
+2022-09-30T00:00:00
+2022-10-31T00:00:00
+2022-11-30T00:00:00
+2022-12-31T00:00:00
+2023-01-31T00:00:00
+2023-02-28T00:00:00
+2023-03-31T00:00:00
+2023-04-30T00:00:00
+2023-05-31T00:00:00
+2023-06-30T00:00:00
+2023-07-31T00:00:00
+2023-08-31T00:00:00
+2023-09-30T00:00:00
+2023-10-31T00:00:00
+2023-11-30T00:00:00
+2023-12-31T00:00:00
+2024-01-31T00:00:00
+2024-02-29T00:00:00
+2024-03-31T00:00:00
+2024-04-30T00:00:00
+2024-05-31T00:00:00
+2024-06-30T00:00:00
+2024-07-31T00:00:00
+2024-08-31T00:00:00
+2024-09-30T00:00:00
+2024-10-31T00:00:00
+2024-11-30T00:00:00
+2024-12-31T00:00:00
+2025-01-31T00:00:00
+2025-02-28T00:00:00
+2025-03-31T00:00:00
+2025-04-30T00:00:00
+2025-05-31T00:00:00
+2025-06-30T00:00:00
+2025-07-31T00:00:00
+2025-08-31T00:00:00
+2025-09-30T00:00:00
+2025-10-31T00:00:00
+2025-11-30T00:00:00
+2025-12-31T00:00:00
+2026-01-31T00:00:00
+2026-02-28T00:00:00
+2026-03-31T00:00:00
+2026-04-30T00:00:00
+2026-05-31T00:00:00
+2026-06-30T00:00:00
+2026-07-31T00:00:00
+2026-08-31T00:00:00
+2026-09-30T00:00:00
+2026-10-31T00:00:00
+2026-11-30T00:00:00
+2026-12-31T00:00:00
+2027-01-31T00:00:00
+2027-02-28T00:00:00
+2027-03-31T00:00:00
+2027-04-30T00:00:00
+2027-05-31T00:00:00
+2027-06-30T00:00:00
+2027-07-31T00:00:00
+2027-08-31T00:00:00
+2027-09-30T00:00:00
+2027-10-31T00:00:00
+2027-11-30T00:00:00
+2027-12-31T00:00:00
+2028-01-31T00:00:00
+2028-02-29T00:00:00
+2028-03-31T00:00:00
+2028-04-30T00:00:00
+2028-05-31T00:00:00
+2028-06-30T00:00:00
+2028-07-31T00:00:00
+2028-08-31T00:00:00
+2028-09-30T00:00:00
+2028-10-31T00:00:00
+2028-11-30T00:00:00
+2028-12-31T00:00:00
+2029-01-31T00:00:00
+2029-02-28T00:00:00
+2029-03-31T00:00:00
+2029-04-30T00:00:00
+2029-05-31T00:00:00
+2029-06-30T00:00:00
+2029-07-31T00:00:00
+2029-08-31T00:00:00
+2029-09-30T00:00:00
+2029-10-31T00:00:00
+2029-11-30T00:00:00
+2029-12-31T00:00:00
+2030-01-31T00:00:00
+2030-02-28T00:00:00
+2030-03-31T00:00:00
+2030-04-30T00:00:00
+2030-05-31T00:00:00
+2030-06-30T00:00:00
+2030-07-31T00:00:00
+2030-08-31T00:00:00
+2030-09-30T00:00:00
+2030-10-31T00:00:00
+2030-11-30T00:00:00
+2030-12-31T00:00:00
+2031-01-31T00:00:00
+2031-02-28T00:00:00
+2031-03-31T00:00:00
+2031-04-30T00:00:00
+2031-05-31T00:00:00
+2031-06-30T00:00:00
+2031-07-31T00:00:00
+2031-08-31T00:00:00
+2031-09-30T00:00:00
+2031-10-31T00:00:00
+2031-11-30T00:00:00
+2031-12-31T00:00:00
+2032-01-31T00:00:00
+2032-02-29T00:00:00
+2032-03-31T00:00:00
+2032-04-30T00:00:00
+2032-05-31T00:00:00
+2032-06-30T00:00:00
+2032-07-31T00:00:00
+2032-08-31T00:00:00
+2032-09-30T00:00:00
+2032-10-31T00:00:00
+2032-11-30T00:00:00
+2032-12-31T00:00:00
+2033-01-31T00:00:00
+2033-02-28T00:00:00
+2033-03-31T00:00:00
+2033-04-30T00:00:00
+2033-05-31T00:00:00
+2033-06-30T00:00:00
+2033-07-31T00:00:00
+2033-08-31T00:00:00
+2033-09-30T00:00:00
+2033-10-31T00:00:00
+2033-11-30T00:00:00
+2033-12-31T00:00:00
+2034-01-31T00:00:00
+2034-02-28T00:00:00
+2034-03-31T00:00:00
+2034-04-30T00:00:00
+2034-05-31T00:00:00
+2034-06-30T00:00:00
+2034-07-31T00:00:00
+2034-08-31T00:00:00
+2034-09-30T00:00:00
+2034-10-31T00:00:00
+2034-11-30T00:00:00
+2034-12-31T00:00:00
+2035-01-31T00:00:00
+2035-02-28T00:00:00
+2035-03-31T00:00:00
+2035-04-30T00:00:00
+2035-05-31T00:00:00
+2035-06-30T00:00:00
+2035-07-31T00:00:00
+2035-08-31T00:00:00
+2035-09-30T00:00:00
+2035-10-31T00:00:00
+2035-11-30T00:00:00
+2035-12-31T00:00:00
+2036-01-31T00:00:00
+2036-02-29T00:00:00
+2036-03-31T00:00:00
+2036-04-30T00:00:00
+2036-05-31T00:00:00
+2036-06-30T00:00:00
+2036-07-31T00:00:00
+2036-08-31T00:00:00
+2036-09-30T00:00:00
+2036-10-31T00:00:00
+2036-11-30T00:00:00
+2036-12-31T00:00:00
+2037-01-31T00:00:00
+2037-02-28T00:00:00
+2037-03-31T00:00:00
+2037-04-30T00:00:00
+2037-05-31T00:00:00
+2037-06-30T00:00:00
+2037-07-31T00:00:00
+2037-08-31T00:00:00
+2037-09-30T00:00:00
+2037-10-31T00:00:00
+2037-11-30T00:00:00
+2037-12-31T00:00:00
+2038-01-31T00:00:00
+2038-02-28T00:00:00
+2038-03-31T00:00:00
+2038-04-30T00:00:00
+2038-05-31T00:00:00
+2038-06-30T00:00:00
+2038-07-31T00:00:00
+2038-08-31T00:00:00
+2038-09-30T00:00:00
+2038-10-31T00:00:00
+2038-11-30T00:00:00
+2038-12-31T00:00:00
+2039-01-31T00:00:00
+2039-02-28T00:00:00
+2039-03-31T00:00:00
+2039-04-30T00:00:00
+2039-05-31T00:00:00
+2039-06-30T00:00:00
+2039-07-31T00:00:00
+2039-08-31T00:00:00
+2039-09-30T00:00:00
+2039-10-31T00:00:00
+2039-11-30T00:00:00
+2039-12-31T00:00:00
+2040-01-31T00:00:00
+2040-02-29T00:00:00
+2040-03-31T00:00:00
+2040-04-30T00:00:00
+2040-05-31T00:00:00
+2040-06-30T00:00:00
+2040-07-31T00:00:00
+2040-08-31T00:00:00
+2040-09-30T00:00:00
+2040-10-31T00:00:00
+2040-11-30T00:00:00
+2040-12-31T00:00:00
+2041-01-31T00:00:00
+2041-02-28T00:00:00
+2041-03-31T00:00:00
+2041-04-30T00:00:00
+2041-05-31T00:00:00
+2041-06-30T00:00:00
+2041-07-31T00:00:00
+2041-08-31T00:00:00
+2041-09-30T00:00:00
+2041-10-31T00:00:00
+2041-11-30T00:00:00
+2041-12-31T00:00:00
+2042-01-31T00:00:00
+2042-02-28T00:00:00
+2042-03-31T00:00:00
+2042-04-30T00:00:00
+2042-05-31T00:00:00
+2042-06-30T00:00:00
+2042-07-31T00:00:00
+2042-08-31T00:00:00
+2042-09-30T00:00:00
+2042-10-31T00:00:00
+2042-11-30T00:00:00
+2042-12-31T00:00:00
+2043-01-31T00:00:00
+2043-02-28T00:00:00
+2043-03-31T00:00:00
+2043-04-30T00:00:00
+2043-05-31T00:00:00
+2043-06-30T00:00:00
+2043-07-31T00:00:00
+2043-08-31T00:00:00
+2043-09-30T00:00:00
+2043-10-31T00:00:00
+2043-11-30T00:00:00
+2043-12-31T00:00:00
+2044-01-31T00:00:00
+2044-02-29T00:00:00
+2044-03-31T00:00:00
+2044-04-30T00:00:00
+2044-05-31T00:00:00
+2044-06-30T00:00:00
+2044-07-31T00:00:00
+2044-08-31T00:00:00
+2044-09-30T00:00:00
+2044-10-31T00:00:00
+2044-11-30T00:00:00
+2044-12-31T00:00:00
+2045-01-31T00:00:00
+2045-02-28T00:00:00
+2045-03-31T00:00:00
+2045-04-30T00:00:00
+2045-05-31T00:00:00
+2045-06-30T00:00:00
+2045-07-31T00:00:00
+2045-08-31T00:00:00
+2045-09-30T00:00:00
+2045-10-31T00:00:00
+2045-11-30T00:00:00
+2045-12-31T00:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily7.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily7.ics.prev.ref
new file mode 100644
index 00000000..49625b59
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily7.ics.prev.ref
@@ -0,0 +1,81 @@
+2010-12-31T00:00:00
+2010-11-30T00:00:00
+2010-10-31T00:00:00
+2010-09-30T00:00:00
+2010-08-31T00:00:00
+2010-07-31T00:00:00
+2010-06-30T00:00:00
+2010-05-31T00:00:00
+2010-04-30T00:00:00
+2010-03-31T00:00:00
+2010-02-28T00:00:00
+2010-01-31T00:00:00
+2009-12-31T00:00:00
+2009-11-30T00:00:00
+2009-10-31T00:00:00
+2009-09-30T00:00:00
+2009-08-31T00:00:00
+2009-07-31T00:00:00
+2009-06-30T00:00:00
+2009-05-31T00:00:00
+2009-04-30T00:00:00
+2009-03-31T00:00:00
+2009-02-28T00:00:00
+2009-01-31T00:00:00
+2008-12-31T00:00:00
+2008-11-30T00:00:00
+2008-10-31T00:00:00
+2008-09-30T00:00:00
+2008-08-31T00:00:00
+2008-07-31T00:00:00
+2008-06-30T00:00:00
+2008-05-31T00:00:00
+2008-04-30T00:00:00
+2008-03-31T00:00:00
+2008-02-29T00:00:00
+2008-01-31T00:00:00
+2007-12-31T00:00:00
+2007-11-30T00:00:00
+2007-10-31T00:00:00
+2007-09-30T00:00:00
+2007-08-31T00:00:00
+2007-07-31T00:00:00
+2007-06-30T00:00:00
+2007-05-31T00:00:00
+2007-04-30T00:00:00
+2007-03-31T00:00:00
+2007-02-28T00:00:00
+2007-01-31T00:00:00
+2006-12-31T00:00:00
+2006-11-30T00:00:00
+2006-10-31T00:00:00
+2006-09-30T00:00:00
+2006-08-31T00:00:00
+2006-07-31T00:00:00
+2006-06-30T00:00:00
+2006-05-31T00:00:00
+2006-04-30T00:00:00
+2006-03-31T00:00:00
+2006-02-28T00:00:00
+2006-01-31T00:00:00
+2005-12-31T00:00:00
+2005-11-30T00:00:00
+2005-10-31T00:00:00
+2005-09-30T00:00:00
+2005-08-31T00:00:00
+2005-07-31T00:00:00
+2005-06-30T00:00:00
+2005-05-31T00:00:00
+2005-04-30T00:00:00
+2005-03-31T00:00:00
+2005-02-28T00:00:00
+2005-01-31T00:00:00
+2004-12-31T00:00:00
+2004-11-30T00:00:00
+2004-10-31T00:00:00
+2004-09-30T00:00:00
+2004-08-31T00:00:00
+2004-07-31T00:00:00
+2004-06-30T00:00:00
+2004-05-31T00:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily7.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily7.ics.recurson.ref
new file mode 100644
index 00000000..3c8ff807
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily7.ics.recurson.ref
@@ -0,0 +1,500 @@
+2004-05-31
+2004-06-30
+2004-07-31
+2004-08-31
+2004-09-30
+2004-10-31
+2004-11-30
+2004-12-31
+2005-01-31
+2005-02-28
+2005-03-31
+2005-04-30
+2005-05-31
+2005-06-30
+2005-07-31
+2005-08-31
+2005-09-30
+2005-10-31
+2005-11-30
+2005-12-31
+2006-01-31
+2006-02-28
+2006-03-31
+2006-04-30
+2006-05-31
+2006-06-30
+2006-07-31
+2006-08-31
+2006-09-30
+2006-10-31
+2006-11-30
+2006-12-31
+2007-01-31
+2007-02-28
+2007-03-31
+2007-04-30
+2007-05-31
+2007-06-30
+2007-07-31
+2007-08-31
+2007-09-30
+2007-10-31
+2007-11-30
+2007-12-31
+2008-01-31
+2008-02-29
+2008-03-31
+2008-04-30
+2008-05-31
+2008-06-30
+2008-07-31
+2008-08-31
+2008-09-30
+2008-10-31
+2008-11-30
+2008-12-31
+2009-01-31
+2009-02-28
+2009-03-31
+2009-04-30
+2009-05-31
+2009-06-30
+2009-07-31
+2009-08-31
+2009-09-30
+2009-10-31
+2009-11-30
+2009-12-31
+2010-01-31
+2010-02-28
+2010-03-31
+2010-04-30
+2010-05-31
+2010-06-30
+2010-07-31
+2010-08-31
+2010-09-30
+2010-10-31
+2010-11-30
+2010-12-31
+2011-01-31
+2011-02-28
+2011-03-31
+2011-04-30
+2011-05-31
+2011-06-30
+2011-07-31
+2011-08-31
+2011-09-30
+2011-10-31
+2011-11-30
+2011-12-31
+2012-01-31
+2012-02-29
+2012-03-31
+2012-04-30
+2012-05-31
+2012-06-30
+2012-07-31
+2012-08-31
+2012-09-30
+2012-10-31
+2012-11-30
+2012-12-31
+2013-01-31
+2013-02-28
+2013-03-31
+2013-04-30
+2013-05-31
+2013-06-30
+2013-07-31
+2013-08-31
+2013-09-30
+2013-10-31
+2013-11-30
+2013-12-31
+2014-01-31
+2014-02-28
+2014-03-31
+2014-04-30
+2014-05-31
+2014-06-30
+2014-07-31
+2014-08-31
+2014-09-30
+2014-10-31
+2014-11-30
+2014-12-31
+2015-01-31
+2015-02-28
+2015-03-31
+2015-04-30
+2015-05-31
+2015-06-30
+2015-07-31
+2015-08-31
+2015-09-30
+2015-10-31
+2015-11-30
+2015-12-31
+2016-01-31
+2016-02-29
+2016-03-31
+2016-04-30
+2016-05-31
+2016-06-30
+2016-07-31
+2016-08-31
+2016-09-30
+2016-10-31
+2016-11-30
+2016-12-31
+2017-01-31
+2017-02-28
+2017-03-31
+2017-04-30
+2017-05-31
+2017-06-30
+2017-07-31
+2017-08-31
+2017-09-30
+2017-10-31
+2017-11-30
+2017-12-31
+2018-01-31
+2018-02-28
+2018-03-31
+2018-04-30
+2018-05-31
+2018-06-30
+2018-07-31
+2018-08-31
+2018-09-30
+2018-10-31
+2018-11-30
+2018-12-31
+2019-01-31
+2019-02-28
+2019-03-31
+2019-04-30
+2019-05-31
+2019-06-30
+2019-07-31
+2019-08-31
+2019-09-30
+2019-10-31
+2019-11-30
+2019-12-31
+2020-01-31
+2020-02-29
+2020-03-31
+2020-04-30
+2020-05-31
+2020-06-30
+2020-07-31
+2020-08-31
+2020-09-30
+2020-10-31
+2020-11-30
+2020-12-31
+2021-01-31
+2021-02-28
+2021-03-31
+2021-04-30
+2021-05-31
+2021-06-30
+2021-07-31
+2021-08-31
+2021-09-30
+2021-10-31
+2021-11-30
+2021-12-31
+2022-01-31
+2022-02-28
+2022-03-31
+2022-04-30
+2022-05-31
+2022-06-30
+2022-07-31
+2022-08-31
+2022-09-30
+2022-10-31
+2022-11-30
+2022-12-31
+2023-01-31
+2023-02-28
+2023-03-31
+2023-04-30
+2023-05-31
+2023-06-30
+2023-07-31
+2023-08-31
+2023-09-30
+2023-10-31
+2023-11-30
+2023-12-31
+2024-01-31
+2024-02-29
+2024-03-31
+2024-04-30
+2024-05-31
+2024-06-30
+2024-07-31
+2024-08-31
+2024-09-30
+2024-10-31
+2024-11-30
+2024-12-31
+2025-01-31
+2025-02-28
+2025-03-31
+2025-04-30
+2025-05-31
+2025-06-30
+2025-07-31
+2025-08-31
+2025-09-30
+2025-10-31
+2025-11-30
+2025-12-31
+2026-01-31
+2026-02-28
+2026-03-31
+2026-04-30
+2026-05-31
+2026-06-30
+2026-07-31
+2026-08-31
+2026-09-30
+2026-10-31
+2026-11-30
+2026-12-31
+2027-01-31
+2027-02-28
+2027-03-31
+2027-04-30
+2027-05-31
+2027-06-30
+2027-07-31
+2027-08-31
+2027-09-30
+2027-10-31
+2027-11-30
+2027-12-31
+2028-01-31
+2028-02-29
+2028-03-31
+2028-04-30
+2028-05-31
+2028-06-30
+2028-07-31
+2028-08-31
+2028-09-30
+2028-10-31
+2028-11-30
+2028-12-31
+2029-01-31
+2029-02-28
+2029-03-31
+2029-04-30
+2029-05-31
+2029-06-30
+2029-07-31
+2029-08-31
+2029-09-30
+2029-10-31
+2029-11-30
+2029-12-31
+2030-01-31
+2030-02-28
+2030-03-31
+2030-04-30
+2030-05-31
+2030-06-30
+2030-07-31
+2030-08-31
+2030-09-30
+2030-10-31
+2030-11-30
+2030-12-31
+2031-01-31
+2031-02-28
+2031-03-31
+2031-04-30
+2031-05-31
+2031-06-30
+2031-07-31
+2031-08-31
+2031-09-30
+2031-10-31
+2031-11-30
+2031-12-31
+2032-01-31
+2032-02-29
+2032-03-31
+2032-04-30
+2032-05-31
+2032-06-30
+2032-07-31
+2032-08-31
+2032-09-30
+2032-10-31
+2032-11-30
+2032-12-31
+2033-01-31
+2033-02-28
+2033-03-31
+2033-04-30
+2033-05-31
+2033-06-30
+2033-07-31
+2033-08-31
+2033-09-30
+2033-10-31
+2033-11-30
+2033-12-31
+2034-01-31
+2034-02-28
+2034-03-31
+2034-04-30
+2034-05-31
+2034-06-30
+2034-07-31
+2034-08-31
+2034-09-30
+2034-10-31
+2034-11-30
+2034-12-31
+2035-01-31
+2035-02-28
+2035-03-31
+2035-04-30
+2035-05-31
+2035-06-30
+2035-07-31
+2035-08-31
+2035-09-30
+2035-10-31
+2035-11-30
+2035-12-31
+2036-01-31
+2036-02-29
+2036-03-31
+2036-04-30
+2036-05-31
+2036-06-30
+2036-07-31
+2036-08-31
+2036-09-30
+2036-10-31
+2036-11-30
+2036-12-31
+2037-01-31
+2037-02-28
+2037-03-31
+2037-04-30
+2037-05-31
+2037-06-30
+2037-07-31
+2037-08-31
+2037-09-30
+2037-10-31
+2037-11-30
+2037-12-31
+2038-01-31
+2038-02-28
+2038-03-31
+2038-04-30
+2038-05-31
+2038-06-30
+2038-07-31
+2038-08-31
+2038-09-30
+2038-10-31
+2038-11-30
+2038-12-31
+2039-01-31
+2039-02-28
+2039-03-31
+2039-04-30
+2039-05-31
+2039-06-30
+2039-07-31
+2039-08-31
+2039-09-30
+2039-10-31
+2039-11-30
+2039-12-31
+2040-01-31
+2040-02-29
+2040-03-31
+2040-04-30
+2040-05-31
+2040-06-30
+2040-07-31
+2040-08-31
+2040-09-30
+2040-10-31
+2040-11-30
+2040-12-31
+2041-01-31
+2041-02-28
+2041-03-31
+2041-04-30
+2041-05-31
+2041-06-30
+2041-07-31
+2041-08-31
+2041-09-30
+2041-10-31
+2041-11-30
+2041-12-31
+2042-01-31
+2042-02-28
+2042-03-31
+2042-04-30
+2042-05-31
+2042-06-30
+2042-07-31
+2042-08-31
+2042-09-30
+2042-10-31
+2042-11-30
+2042-12-31
+2043-01-31
+2043-02-28
+2043-03-31
+2043-04-30
+2043-05-31
+2043-06-30
+2043-07-31
+2043-08-31
+2043-09-30
+2043-10-31
+2043-11-30
+2043-12-31
+2044-01-31
+2044-02-29
+2044-03-31
+2044-04-30
+2044-05-31
+2044-06-30
+2044-07-31
+2044-08-31
+2044-09-30
+2044-10-31
+2044-11-30
+2044-12-31
+2045-01-31
+2045-02-28
+2045-03-31
+2045-04-30
+2045-05-31
+2045-06-30
+2045-07-31
+2045-08-31
+2045-09-30
+2045-10-31
+2045-11-30
+2045-12-31
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily8.ics b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily8.ics
new file mode 100644
index 00000000..36373cb0
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily8.ics
@@ -0,0 +1,31 @@
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+VERSION:2.0
+PRODID:-//MH Software Inc//Connect Daily - 3.0.7//EN
+X-LibKCal-Testsuite-OutTZ:America/Denver
+
+BEGIN:VTIMEZONE
+TZID:America/Denver
+BEGIN:STANDARD
+DTSTART:19671029T020000
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE
+
+BEGIN:VEVENT
+UID:1209@67.154.139.115
+RECURRENCE-ID:19700101T070000Z
+SUMMARY:Last Weekday
+DTSTART;TZID=America/Denver;VALUE=DATE:20040531
+RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1
+DURATION:P1D
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily8.ics.next.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily8.ics.next.ref
new file mode 100644
index 00000000..45271917
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily8.ics.next.ref
@@ -0,0 +1,500 @@
+2004-05-31T00:00:00
+2004-06-30T00:00:00
+2004-07-30T00:00:00
+2004-08-31T00:00:00
+2004-09-30T00:00:00
+2004-10-29T00:00:00
+2004-11-30T00:00:00
+2004-12-31T00:00:00
+2005-01-31T00:00:00
+2005-02-28T00:00:00
+2005-03-31T00:00:00
+2005-04-29T00:00:00
+2005-05-31T00:00:00
+2005-06-30T00:00:00
+2005-07-29T00:00:00
+2005-08-31T00:00:00
+2005-09-30T00:00:00
+2005-10-31T00:00:00
+2005-11-30T00:00:00
+2005-12-30T00:00:00
+2006-01-31T00:00:00
+2006-02-28T00:00:00
+2006-03-31T00:00:00
+2006-04-28T00:00:00
+2006-05-31T00:00:00
+2006-06-30T00:00:00
+2006-07-31T00:00:00
+2006-08-31T00:00:00
+2006-09-29T00:00:00
+2006-10-31T00:00:00
+2006-11-30T00:00:00
+2006-12-29T00:00:00
+2007-01-31T00:00:00
+2007-02-28T00:00:00
+2007-03-30T00:00:00
+2007-04-30T00:00:00
+2007-05-31T00:00:00
+2007-06-29T00:00:00
+2007-07-31T00:00:00
+2007-08-31T00:00:00
+2007-09-28T00:00:00
+2007-10-31T00:00:00
+2007-11-30T00:00:00
+2007-12-31T00:00:00
+2008-01-31T00:00:00
+2008-02-29T00:00:00
+2008-03-31T00:00:00
+2008-04-30T00:00:00
+2008-05-30T00:00:00
+2008-06-30T00:00:00
+2008-07-31T00:00:00
+2008-08-29T00:00:00
+2008-09-30T00:00:00
+2008-10-31T00:00:00
+2008-11-28T00:00:00
+2008-12-31T00:00:00
+2009-01-30T00:00:00
+2009-02-27T00:00:00
+2009-03-31T00:00:00
+2009-04-30T00:00:00
+2009-05-29T00:00:00
+2009-06-30T00:00:00
+2009-07-31T00:00:00
+2009-08-31T00:00:00
+2009-09-30T00:00:00
+2009-10-30T00:00:00
+2009-11-30T00:00:00
+2009-12-31T00:00:00
+2010-01-29T00:00:00
+2010-02-26T00:00:00
+2010-03-31T00:00:00
+2010-04-30T00:00:00
+2010-05-31T00:00:00
+2010-06-30T00:00:00
+2010-07-30T00:00:00
+2010-08-31T00:00:00
+2010-09-30T00:00:00
+2010-10-29T00:00:00
+2010-11-30T00:00:00
+2010-12-31T00:00:00
+2011-01-31T00:00:00
+2011-02-28T00:00:00
+2011-03-31T00:00:00
+2011-04-29T00:00:00
+2011-05-31T00:00:00
+2011-06-30T00:00:00
+2011-07-29T00:00:00
+2011-08-31T00:00:00
+2011-09-30T00:00:00
+2011-10-31T00:00:00
+2011-11-30T00:00:00
+2011-12-30T00:00:00
+2012-01-31T00:00:00
+2012-02-29T00:00:00
+2012-03-30T00:00:00
+2012-04-30T00:00:00
+2012-05-31T00:00:00
+2012-06-29T00:00:00
+2012-07-31T00:00:00
+2012-08-31T00:00:00
+2012-09-28T00:00:00
+2012-10-31T00:00:00
+2012-11-30T00:00:00
+2012-12-31T00:00:00
+2013-01-31T00:00:00
+2013-02-28T00:00:00
+2013-03-29T00:00:00
+2013-04-30T00:00:00
+2013-05-31T00:00:00
+2013-06-28T00:00:00
+2013-07-31T00:00:00
+2013-08-30T00:00:00
+2013-09-30T00:00:00
+2013-10-31T00:00:00
+2013-11-29T00:00:00
+2013-12-31T00:00:00
+2014-01-31T00:00:00
+2014-02-28T00:00:00
+2014-03-31T00:00:00
+2014-04-30T00:00:00
+2014-05-30T00:00:00
+2014-06-30T00:00:00
+2014-07-31T00:00:00
+2014-08-29T00:00:00
+2014-09-30T00:00:00
+2014-10-31T00:00:00
+2014-11-28T00:00:00
+2014-12-31T00:00:00
+2015-01-30T00:00:00
+2015-02-27T00:00:00
+2015-03-31T00:00:00
+2015-04-30T00:00:00
+2015-05-29T00:00:00
+2015-06-30T00:00:00
+2015-07-31T00:00:00
+2015-08-31T00:00:00
+2015-09-30T00:00:00
+2015-10-30T00:00:00
+2015-11-30T00:00:00
+2015-12-31T00:00:00
+2016-01-29T00:00:00
+2016-02-29T00:00:00
+2016-03-31T00:00:00
+2016-04-29T00:00:00
+2016-05-31T00:00:00
+2016-06-30T00:00:00
+2016-07-29T00:00:00
+2016-08-31T00:00:00
+2016-09-30T00:00:00
+2016-10-31T00:00:00
+2016-11-30T00:00:00
+2016-12-30T00:00:00
+2017-01-31T00:00:00
+2017-02-28T00:00:00
+2017-03-31T00:00:00
+2017-04-28T00:00:00
+2017-05-31T00:00:00
+2017-06-30T00:00:00
+2017-07-31T00:00:00
+2017-08-31T00:00:00
+2017-09-29T00:00:00
+2017-10-31T00:00:00
+2017-11-30T00:00:00
+2017-12-29T00:00:00
+2018-01-31T00:00:00
+2018-02-28T00:00:00
+2018-03-30T00:00:00
+2018-04-30T00:00:00
+2018-05-31T00:00:00
+2018-06-29T00:00:00
+2018-07-31T00:00:00
+2018-08-31T00:00:00
+2018-09-28T00:00:00
+2018-10-31T00:00:00
+2018-11-30T00:00:00
+2018-12-31T00:00:00
+2019-01-31T00:00:00
+2019-02-28T00:00:00
+2019-03-29T00:00:00
+2019-04-30T00:00:00
+2019-05-31T00:00:00
+2019-06-28T00:00:00
+2019-07-31T00:00:00
+2019-08-30T00:00:00
+2019-09-30T00:00:00
+2019-10-31T00:00:00
+2019-11-29T00:00:00
+2019-12-31T00:00:00
+2020-01-31T00:00:00
+2020-02-28T00:00:00
+2020-03-31T00:00:00
+2020-04-30T00:00:00
+2020-05-29T00:00:00
+2020-06-30T00:00:00
+2020-07-31T00:00:00
+2020-08-31T00:00:00
+2020-09-30T00:00:00
+2020-10-30T00:00:00
+2020-11-30T00:00:00
+2020-12-31T00:00:00
+2021-01-29T00:00:00
+2021-02-26T00:00:00
+2021-03-31T00:00:00
+2021-04-30T00:00:00
+2021-05-31T00:00:00
+2021-06-30T00:00:00
+2021-07-30T00:00:00
+2021-08-31T00:00:00
+2021-09-30T00:00:00
+2021-10-29T00:00:00
+2021-11-30T00:00:00
+2021-12-31T00:00:00
+2022-01-31T00:00:00
+2022-02-28T00:00:00
+2022-03-31T00:00:00
+2022-04-29T00:00:00
+2022-05-31T00:00:00
+2022-06-30T00:00:00
+2022-07-29T00:00:00
+2022-08-31T00:00:00
+2022-09-30T00:00:00
+2022-10-31T00:00:00
+2022-11-30T00:00:00
+2022-12-30T00:00:00
+2023-01-31T00:00:00
+2023-02-28T00:00:00
+2023-03-31T00:00:00
+2023-04-28T00:00:00
+2023-05-31T00:00:00
+2023-06-30T00:00:00
+2023-07-31T00:00:00
+2023-08-31T00:00:00
+2023-09-29T00:00:00
+2023-10-31T00:00:00
+2023-11-30T00:00:00
+2023-12-29T00:00:00
+2024-01-31T00:00:00
+2024-02-29T00:00:00
+2024-03-29T00:00:00
+2024-04-30T00:00:00
+2024-05-31T00:00:00
+2024-06-28T00:00:00
+2024-07-31T00:00:00
+2024-08-30T00:00:00
+2024-09-30T00:00:00
+2024-10-31T00:00:00
+2024-11-29T00:00:00
+2024-12-31T00:00:00
+2025-01-31T00:00:00
+2025-02-28T00:00:00
+2025-03-31T00:00:00
+2025-04-30T00:00:00
+2025-05-30T00:00:00
+2025-06-30T00:00:00
+2025-07-31T00:00:00
+2025-08-29T00:00:00
+2025-09-30T00:00:00
+2025-10-31T00:00:00
+2025-11-28T00:00:00
+2025-12-31T00:00:00
+2026-01-30T00:00:00
+2026-02-27T00:00:00
+2026-03-31T00:00:00
+2026-04-30T00:00:00
+2026-05-29T00:00:00
+2026-06-30T00:00:00
+2026-07-31T00:00:00
+2026-08-31T00:00:00
+2026-09-30T00:00:00
+2026-10-30T00:00:00
+2026-11-30T00:00:00
+2026-12-31T00:00:00
+2027-01-29T00:00:00
+2027-02-26T00:00:00
+2027-03-31T00:00:00
+2027-04-30T00:00:00
+2027-05-31T00:00:00
+2027-06-30T00:00:00
+2027-07-30T00:00:00
+2027-08-31T00:00:00
+2027-09-30T00:00:00
+2027-10-29T00:00:00
+2027-11-30T00:00:00
+2027-12-31T00:00:00
+2028-01-31T00:00:00
+2028-02-29T00:00:00
+2028-03-31T00:00:00
+2028-04-28T00:00:00
+2028-05-31T00:00:00
+2028-06-30T00:00:00
+2028-07-31T00:00:00
+2028-08-31T00:00:00
+2028-09-29T00:00:00
+2028-10-31T00:00:00
+2028-11-30T00:00:00
+2028-12-29T00:00:00
+2029-01-31T00:00:00
+2029-02-28T00:00:00
+2029-03-30T00:00:00
+2029-04-30T00:00:00
+2029-05-31T00:00:00
+2029-06-29T00:00:00
+2029-07-31T00:00:00
+2029-08-31T00:00:00
+2029-09-28T00:00:00
+2029-10-31T00:00:00
+2029-11-30T00:00:00
+2029-12-31T00:00:00
+2030-01-31T00:00:00
+2030-02-28T00:00:00
+2030-03-29T00:00:00
+2030-04-30T00:00:00
+2030-05-31T00:00:00
+2030-06-28T00:00:00
+2030-07-31T00:00:00
+2030-08-30T00:00:00
+2030-09-30T00:00:00
+2030-10-31T00:00:00
+2030-11-29T00:00:00
+2030-12-31T00:00:00
+2031-01-31T00:00:00
+2031-02-28T00:00:00
+2031-03-31T00:00:00
+2031-04-30T00:00:00
+2031-05-30T00:00:00
+2031-06-30T00:00:00
+2031-07-31T00:00:00
+2031-08-29T00:00:00
+2031-09-30T00:00:00
+2031-10-31T00:00:00
+2031-11-28T00:00:00
+2031-12-31T00:00:00
+2032-01-30T00:00:00
+2032-02-27T00:00:00
+2032-03-31T00:00:00
+2032-04-30T00:00:00
+2032-05-31T00:00:00
+2032-06-30T00:00:00
+2032-07-30T00:00:00
+2032-08-31T00:00:00
+2032-09-30T00:00:00
+2032-10-29T00:00:00
+2032-11-30T00:00:00
+2032-12-31T00:00:00
+2033-01-31T00:00:00
+2033-02-28T00:00:00
+2033-03-31T00:00:00
+2033-04-29T00:00:00
+2033-05-31T00:00:00
+2033-06-30T00:00:00
+2033-07-29T00:00:00
+2033-08-31T00:00:00
+2033-09-30T00:00:00
+2033-10-31T00:00:00
+2033-11-30T00:00:00
+2033-12-30T00:00:00
+2034-01-31T00:00:00
+2034-02-28T00:00:00
+2034-03-31T00:00:00
+2034-04-28T00:00:00
+2034-05-31T00:00:00
+2034-06-30T00:00:00
+2034-07-31T00:00:00
+2034-08-31T00:00:00
+2034-09-29T00:00:00
+2034-10-31T00:00:00
+2034-11-30T00:00:00
+2034-12-29T00:00:00
+2035-01-31T00:00:00
+2035-02-28T00:00:00
+2035-03-30T00:00:00
+2035-04-30T00:00:00
+2035-05-31T00:00:00
+2035-06-29T00:00:00
+2035-07-31T00:00:00
+2035-08-31T00:00:00
+2035-09-28T00:00:00
+2035-10-31T00:00:00
+2035-11-30T00:00:00
+2035-12-31T00:00:00
+2036-01-31T00:00:00
+2036-02-29T00:00:00
+2036-03-31T00:00:00
+2036-04-30T00:00:00
+2036-05-30T00:00:00
+2036-06-30T00:00:00
+2036-07-31T00:00:00
+2036-08-29T00:00:00
+2036-09-30T00:00:00
+2036-10-31T00:00:00
+2036-11-28T00:00:00
+2036-12-31T00:00:00
+2037-01-30T00:00:00
+2037-02-27T00:00:00
+2037-03-31T00:00:00
+2037-04-30T00:00:00
+2037-05-29T00:00:00
+2037-06-30T00:00:00
+2037-07-31T00:00:00
+2037-08-31T00:00:00
+2037-09-30T00:00:00
+2037-10-30T00:00:00
+2037-11-30T00:00:00
+2037-12-31T00:00:00
+2038-01-29T00:00:00
+2038-02-26T00:00:00
+2038-03-31T00:00:00
+2038-04-30T00:00:00
+2038-05-31T00:00:00
+2038-06-30T00:00:00
+2038-07-30T00:00:00
+2038-08-31T00:00:00
+2038-09-30T00:00:00
+2038-10-29T00:00:00
+2038-11-30T00:00:00
+2038-12-31T00:00:00
+2039-01-31T00:00:00
+2039-02-28T00:00:00
+2039-03-31T00:00:00
+2039-04-29T00:00:00
+2039-05-31T00:00:00
+2039-06-30T00:00:00
+2039-07-29T00:00:00
+2039-08-31T00:00:00
+2039-09-30T00:00:00
+2039-10-31T00:00:00
+2039-11-30T00:00:00
+2039-12-30T00:00:00
+2040-01-31T00:00:00
+2040-02-29T00:00:00
+2040-03-30T00:00:00
+2040-04-30T00:00:00
+2040-05-31T00:00:00
+2040-06-29T00:00:00
+2040-07-31T00:00:00
+2040-08-31T00:00:00
+2040-09-28T00:00:00
+2040-10-31T00:00:00
+2040-11-30T00:00:00
+2040-12-31T00:00:00
+2041-01-31T00:00:00
+2041-02-28T00:00:00
+2041-03-29T00:00:00
+2041-04-30T00:00:00
+2041-05-31T00:00:00
+2041-06-28T00:00:00
+2041-07-31T00:00:00
+2041-08-30T00:00:00
+2041-09-30T00:00:00
+2041-10-31T00:00:00
+2041-11-29T00:00:00
+2041-12-31T00:00:00
+2042-01-31T00:00:00
+2042-02-28T00:00:00
+2042-03-31T00:00:00
+2042-04-30T00:00:00
+2042-05-30T00:00:00
+2042-06-30T00:00:00
+2042-07-31T00:00:00
+2042-08-29T00:00:00
+2042-09-30T00:00:00
+2042-10-31T00:00:00
+2042-11-28T00:00:00
+2042-12-31T00:00:00
+2043-01-30T00:00:00
+2043-02-27T00:00:00
+2043-03-31T00:00:00
+2043-04-30T00:00:00
+2043-05-29T00:00:00
+2043-06-30T00:00:00
+2043-07-31T00:00:00
+2043-08-31T00:00:00
+2043-09-30T00:00:00
+2043-10-30T00:00:00
+2043-11-30T00:00:00
+2043-12-31T00:00:00
+2044-01-29T00:00:00
+2044-02-29T00:00:00
+2044-03-31T00:00:00
+2044-04-29T00:00:00
+2044-05-31T00:00:00
+2044-06-30T00:00:00
+2044-07-29T00:00:00
+2044-08-31T00:00:00
+2044-09-30T00:00:00
+2044-10-31T00:00:00
+2044-11-30T00:00:00
+2044-12-30T00:00:00
+2045-01-31T00:00:00
+2045-02-28T00:00:00
+2045-03-31T00:00:00
+2045-04-28T00:00:00
+2045-05-31T00:00:00
+2045-06-30T00:00:00
+2045-07-31T00:00:00
+2045-08-31T00:00:00
+2045-09-29T00:00:00
+2045-10-31T00:00:00
+2045-11-30T00:00:00
+2045-12-29T00:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily8.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily8.ics.prev.ref
new file mode 100644
index 00000000..b4360bd1
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily8.ics.prev.ref
@@ -0,0 +1,81 @@
+2010-12-31T00:00:00
+2010-11-30T00:00:00
+2010-10-29T00:00:00
+2010-09-30T00:00:00
+2010-08-31T00:00:00
+2010-07-30T00:00:00
+2010-06-30T00:00:00
+2010-05-31T00:00:00
+2010-04-30T00:00:00
+2010-03-31T00:00:00
+2010-02-26T00:00:00
+2010-01-29T00:00:00
+2009-12-31T00:00:00
+2009-11-30T00:00:00
+2009-10-30T00:00:00
+2009-09-30T00:00:00
+2009-08-31T00:00:00
+2009-07-31T00:00:00
+2009-06-30T00:00:00
+2009-05-29T00:00:00
+2009-04-30T00:00:00
+2009-03-31T00:00:00
+2009-02-27T00:00:00
+2009-01-30T00:00:00
+2008-12-31T00:00:00
+2008-11-28T00:00:00
+2008-10-31T00:00:00
+2008-09-30T00:00:00
+2008-08-29T00:00:00
+2008-07-31T00:00:00
+2008-06-30T00:00:00
+2008-05-30T00:00:00
+2008-04-30T00:00:00
+2008-03-31T00:00:00
+2008-02-29T00:00:00
+2008-01-31T00:00:00
+2007-12-31T00:00:00
+2007-11-30T00:00:00
+2007-10-31T00:00:00
+2007-09-28T00:00:00
+2007-08-31T00:00:00
+2007-07-31T00:00:00
+2007-06-29T00:00:00
+2007-05-31T00:00:00
+2007-04-30T00:00:00
+2007-03-30T00:00:00
+2007-02-28T00:00:00
+2007-01-31T00:00:00
+2006-12-29T00:00:00
+2006-11-30T00:00:00
+2006-10-31T00:00:00
+2006-09-29T00:00:00
+2006-08-31T00:00:00
+2006-07-31T00:00:00
+2006-06-30T00:00:00
+2006-05-31T00:00:00
+2006-04-28T00:00:00
+2006-03-31T00:00:00
+2006-02-28T00:00:00
+2006-01-31T00:00:00
+2005-12-30T00:00:00
+2005-11-30T00:00:00
+2005-10-31T00:00:00
+2005-09-30T00:00:00
+2005-08-31T00:00:00
+2005-07-29T00:00:00
+2005-06-30T00:00:00
+2005-05-31T00:00:00
+2005-04-29T00:00:00
+2005-03-31T00:00:00
+2005-02-28T00:00:00
+2005-01-31T00:00:00
+2004-12-31T00:00:00
+2004-11-30T00:00:00
+2004-10-29T00:00:00
+2004-09-30T00:00:00
+2004-08-31T00:00:00
+2004-07-30T00:00:00
+2004-06-30T00:00:00
+2004-05-31T00:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily8.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily8.ics.recurson.ref
new file mode 100644
index 00000000..24ac270f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily8.ics.recurson.ref
@@ -0,0 +1,500 @@
+2004-05-31
+2004-06-30
+2004-07-30
+2004-08-31
+2004-09-30
+2004-10-29
+2004-11-30
+2004-12-31
+2005-01-31
+2005-02-28
+2005-03-31
+2005-04-29
+2005-05-31
+2005-06-30
+2005-07-29
+2005-08-31
+2005-09-30
+2005-10-31
+2005-11-30
+2005-12-30
+2006-01-31
+2006-02-28
+2006-03-31
+2006-04-28
+2006-05-31
+2006-06-30
+2006-07-31
+2006-08-31
+2006-09-29
+2006-10-31
+2006-11-30
+2006-12-29
+2007-01-31
+2007-02-28
+2007-03-30
+2007-04-30
+2007-05-31
+2007-06-29
+2007-07-31
+2007-08-31
+2007-09-28
+2007-10-31
+2007-11-30
+2007-12-31
+2008-01-31
+2008-02-29
+2008-03-31
+2008-04-30
+2008-05-30
+2008-06-30
+2008-07-31
+2008-08-29
+2008-09-30
+2008-10-31
+2008-11-28
+2008-12-31
+2009-01-30
+2009-02-27
+2009-03-31
+2009-04-30
+2009-05-29
+2009-06-30
+2009-07-31
+2009-08-31
+2009-09-30
+2009-10-30
+2009-11-30
+2009-12-31
+2010-01-29
+2010-02-26
+2010-03-31
+2010-04-30
+2010-05-31
+2010-06-30
+2010-07-30
+2010-08-31
+2010-09-30
+2010-10-29
+2010-11-30
+2010-12-31
+2011-01-31
+2011-02-28
+2011-03-31
+2011-04-29
+2011-05-31
+2011-06-30
+2011-07-29
+2011-08-31
+2011-09-30
+2011-10-31
+2011-11-30
+2011-12-30
+2012-01-31
+2012-02-29
+2012-03-30
+2012-04-30
+2012-05-31
+2012-06-29
+2012-07-31
+2012-08-31
+2012-09-28
+2012-10-31
+2012-11-30
+2012-12-31
+2013-01-31
+2013-02-28
+2013-03-29
+2013-04-30
+2013-05-31
+2013-06-28
+2013-07-31
+2013-08-30
+2013-09-30
+2013-10-31
+2013-11-29
+2013-12-31
+2014-01-31
+2014-02-28
+2014-03-31
+2014-04-30
+2014-05-30
+2014-06-30
+2014-07-31
+2014-08-29
+2014-09-30
+2014-10-31
+2014-11-28
+2014-12-31
+2015-01-30
+2015-02-27
+2015-03-31
+2015-04-30
+2015-05-29
+2015-06-30
+2015-07-31
+2015-08-31
+2015-09-30
+2015-10-30
+2015-11-30
+2015-12-31
+2016-01-29
+2016-02-29
+2016-03-31
+2016-04-29
+2016-05-31
+2016-06-30
+2016-07-29
+2016-08-31
+2016-09-30
+2016-10-31
+2016-11-30
+2016-12-30
+2017-01-31
+2017-02-28
+2017-03-31
+2017-04-28
+2017-05-31
+2017-06-30
+2017-07-31
+2017-08-31
+2017-09-29
+2017-10-31
+2017-11-30
+2017-12-29
+2018-01-31
+2018-02-28
+2018-03-30
+2018-04-30
+2018-05-31
+2018-06-29
+2018-07-31
+2018-08-31
+2018-09-28
+2018-10-31
+2018-11-30
+2018-12-31
+2019-01-31
+2019-02-28
+2019-03-29
+2019-04-30
+2019-05-31
+2019-06-28
+2019-07-31
+2019-08-30
+2019-09-30
+2019-10-31
+2019-11-29
+2019-12-31
+2020-01-31
+2020-02-28
+2020-03-31
+2020-04-30
+2020-05-29
+2020-06-30
+2020-07-31
+2020-08-31
+2020-09-30
+2020-10-30
+2020-11-30
+2020-12-31
+2021-01-29
+2021-02-26
+2021-03-31
+2021-04-30
+2021-05-31
+2021-06-30
+2021-07-30
+2021-08-31
+2021-09-30
+2021-10-29
+2021-11-30
+2021-12-31
+2022-01-31
+2022-02-28
+2022-03-31
+2022-04-29
+2022-05-31
+2022-06-30
+2022-07-29
+2022-08-31
+2022-09-30
+2022-10-31
+2022-11-30
+2022-12-30
+2023-01-31
+2023-02-28
+2023-03-31
+2023-04-28
+2023-05-31
+2023-06-30
+2023-07-31
+2023-08-31
+2023-09-29
+2023-10-31
+2023-11-30
+2023-12-29
+2024-01-31
+2024-02-29
+2024-03-29
+2024-04-30
+2024-05-31
+2024-06-28
+2024-07-31
+2024-08-30
+2024-09-30
+2024-10-31
+2024-11-29
+2024-12-31
+2025-01-31
+2025-02-28
+2025-03-31
+2025-04-30
+2025-05-30
+2025-06-30
+2025-07-31
+2025-08-29
+2025-09-30
+2025-10-31
+2025-11-28
+2025-12-31
+2026-01-30
+2026-02-27
+2026-03-31
+2026-04-30
+2026-05-29
+2026-06-30
+2026-07-31
+2026-08-31
+2026-09-30
+2026-10-30
+2026-11-30
+2026-12-31
+2027-01-29
+2027-02-26
+2027-03-31
+2027-04-30
+2027-05-31
+2027-06-30
+2027-07-30
+2027-08-31
+2027-09-30
+2027-10-29
+2027-11-30
+2027-12-31
+2028-01-31
+2028-02-29
+2028-03-31
+2028-04-28
+2028-05-31
+2028-06-30
+2028-07-31
+2028-08-31
+2028-09-29
+2028-10-31
+2028-11-30
+2028-12-29
+2029-01-31
+2029-02-28
+2029-03-30
+2029-04-30
+2029-05-31
+2029-06-29
+2029-07-31
+2029-08-31
+2029-09-28
+2029-10-31
+2029-11-30
+2029-12-31
+2030-01-31
+2030-02-28
+2030-03-29
+2030-04-30
+2030-05-31
+2030-06-28
+2030-07-31
+2030-08-30
+2030-09-30
+2030-10-31
+2030-11-29
+2030-12-31
+2031-01-31
+2031-02-28
+2031-03-31
+2031-04-30
+2031-05-30
+2031-06-30
+2031-07-31
+2031-08-29
+2031-09-30
+2031-10-31
+2031-11-28
+2031-12-31
+2032-01-30
+2032-02-27
+2032-03-31
+2032-04-30
+2032-05-31
+2032-06-30
+2032-07-30
+2032-08-31
+2032-09-30
+2032-10-29
+2032-11-30
+2032-12-31
+2033-01-31
+2033-02-28
+2033-03-31
+2033-04-29
+2033-05-31
+2033-06-30
+2033-07-29
+2033-08-31
+2033-09-30
+2033-10-31
+2033-11-30
+2033-12-30
+2034-01-31
+2034-02-28
+2034-03-31
+2034-04-28
+2034-05-31
+2034-06-30
+2034-07-31
+2034-08-31
+2034-09-29
+2034-10-31
+2034-11-30
+2034-12-29
+2035-01-31
+2035-02-28
+2035-03-30
+2035-04-30
+2035-05-31
+2035-06-29
+2035-07-31
+2035-08-31
+2035-09-28
+2035-10-31
+2035-11-30
+2035-12-31
+2036-01-31
+2036-02-29
+2036-03-31
+2036-04-30
+2036-05-30
+2036-06-30
+2036-07-31
+2036-08-29
+2036-09-30
+2036-10-31
+2036-11-28
+2036-12-31
+2037-01-30
+2037-02-27
+2037-03-31
+2037-04-30
+2037-05-29
+2037-06-30
+2037-07-31
+2037-08-31
+2037-09-30
+2037-10-30
+2037-11-30
+2037-12-31
+2038-01-29
+2038-02-26
+2038-03-31
+2038-04-30
+2038-05-31
+2038-06-30
+2038-07-30
+2038-08-31
+2038-09-30
+2038-10-29
+2038-11-30
+2038-12-31
+2039-01-31
+2039-02-28
+2039-03-31
+2039-04-29
+2039-05-31
+2039-06-30
+2039-07-29
+2039-08-31
+2039-09-30
+2039-10-31
+2039-11-30
+2039-12-30
+2040-01-31
+2040-02-29
+2040-03-30
+2040-04-30
+2040-05-31
+2040-06-29
+2040-07-31
+2040-08-31
+2040-09-28
+2040-10-31
+2040-11-30
+2040-12-31
+2041-01-31
+2041-02-28
+2041-03-29
+2041-04-30
+2041-05-31
+2041-06-28
+2041-07-31
+2041-08-30
+2041-09-30
+2041-10-31
+2041-11-29
+2041-12-31
+2042-01-31
+2042-02-28
+2042-03-31
+2042-04-30
+2042-05-30
+2042-06-30
+2042-07-31
+2042-08-29
+2042-09-30
+2042-10-31
+2042-11-28
+2042-12-31
+2043-01-30
+2043-02-27
+2043-03-31
+2043-04-30
+2043-05-29
+2043-06-30
+2043-07-31
+2043-08-31
+2043-09-30
+2043-10-30
+2043-11-30
+2043-12-31
+2044-01-29
+2044-02-29
+2044-03-31
+2044-04-29
+2044-05-31
+2044-06-30
+2044-07-29
+2044-08-31
+2044-09-30
+2044-10-31
+2044-11-30
+2044-12-30
+2045-01-31
+2045-02-28
+2045-03-31
+2045-04-28
+2045-05-31
+2045-06-30
+2045-07-31
+2045-08-31
+2045-09-29
+2045-10-31
+2045-11-30
+2045-12-29
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily9.ics b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily9.ics
new file mode 100644
index 00000000..f087a1e7
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily9.ics
@@ -0,0 +1,31 @@
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+VERSION:2.0
+PRODID:-//MH Software Inc//Connect Daily - 3.0.7//EN
+X-LibKCal-Testsuite-OutTZ:America/Denver
+
+BEGIN:VTIMEZONE
+TZID:America/Denver
+BEGIN:STANDARD
+DTSTART:19671029T020000
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE
+
+BEGIN:VEVENT
+UID:1268@67.154.139.115
+RECURRENCE-ID:19700101T070000Z
+SUMMARY:Kwanzaa
+DTSTART;TZID=America/Denver;VALUE=DATE:20041226
+RRULE:FREQ=MONTHLY;INTERVAL=12;BYMONTHDAY=26;BYMONTH=12
+DURATION:P7D
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily9.ics.next.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily9.ics.next.ref
new file mode 100644
index 00000000..229e8cb9
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily9.ics.next.ref
@@ -0,0 +1,500 @@
+2004-12-26T00:00:00
+2005-12-26T00:00:00
+2006-12-26T00:00:00
+2007-12-26T00:00:00
+2008-12-26T00:00:00
+2009-12-26T00:00:00
+2010-12-26T00:00:00
+2011-12-26T00:00:00
+2012-12-26T00:00:00
+2013-12-26T00:00:00
+2014-12-26T00:00:00
+2015-12-26T00:00:00
+2016-12-26T00:00:00
+2017-12-26T00:00:00
+2018-12-26T00:00:00
+2019-12-26T00:00:00
+2020-12-26T00:00:00
+2021-12-26T00:00:00
+2022-12-26T00:00:00
+2023-12-26T00:00:00
+2024-12-26T00:00:00
+2025-12-26T00:00:00
+2026-12-26T00:00:00
+2027-12-26T00:00:00
+2028-12-26T00:00:00
+2029-12-26T00:00:00
+2030-12-26T00:00:00
+2031-12-26T00:00:00
+2032-12-26T00:00:00
+2033-12-26T00:00:00
+2034-12-26T00:00:00
+2035-12-26T00:00:00
+2036-12-26T00:00:00
+2037-12-26T00:00:00
+2038-12-26T00:00:00
+2039-12-26T00:00:00
+2040-12-26T00:00:00
+2041-12-26T00:00:00
+2042-12-26T00:00:00
+2043-12-26T00:00:00
+2044-12-26T00:00:00
+2045-12-26T00:00:00
+2046-12-26T00:00:00
+2047-12-26T00:00:00
+2048-12-26T00:00:00
+2049-12-26T00:00:00
+2050-12-26T00:00:00
+2051-12-26T00:00:00
+2052-12-26T00:00:00
+2053-12-26T00:00:00
+2054-12-26T00:00:00
+2055-12-26T00:00:00
+2056-12-26T00:00:00
+2057-12-26T00:00:00
+2058-12-26T00:00:00
+2059-12-26T00:00:00
+2060-12-26T00:00:00
+2061-12-26T00:00:00
+2062-12-26T00:00:00
+2063-12-26T00:00:00
+2064-12-26T00:00:00
+2065-12-26T00:00:00
+2066-12-26T00:00:00
+2067-12-26T00:00:00
+2068-12-26T00:00:00
+2069-12-26T00:00:00
+2070-12-26T00:00:00
+2071-12-26T00:00:00
+2072-12-26T00:00:00
+2073-12-26T00:00:00
+2074-12-26T00:00:00
+2075-12-26T00:00:00
+2076-12-26T00:00:00
+2077-12-26T00:00:00
+2078-12-26T00:00:00
+2079-12-26T00:00:00
+2080-12-26T00:00:00
+2081-12-26T00:00:00
+2082-12-26T00:00:00
+2083-12-26T00:00:00
+2084-12-26T00:00:00
+2085-12-26T00:00:00
+2086-12-26T00:00:00
+2087-12-26T00:00:00
+2088-12-26T00:00:00
+2089-12-26T00:00:00
+2090-12-26T00:00:00
+2091-12-26T00:00:00
+2092-12-26T00:00:00
+2093-12-26T00:00:00
+2094-12-26T00:00:00
+2095-12-26T00:00:00
+2096-12-26T00:00:00
+2097-12-26T00:00:00
+2098-12-26T00:00:00
+2099-12-26T00:00:00
+2100-12-26T00:00:00
+2101-12-26T00:00:00
+2102-12-26T00:00:00
+2103-12-26T00:00:00
+2104-12-26T00:00:00
+2105-12-26T00:00:00
+2106-12-26T00:00:00
+2107-12-26T00:00:00
+2108-12-26T00:00:00
+2109-12-26T00:00:00
+2110-12-26T00:00:00
+2111-12-26T00:00:00
+2112-12-26T00:00:00
+2113-12-26T00:00:00
+2114-12-26T00:00:00
+2115-12-26T00:00:00
+2116-12-26T00:00:00
+2117-12-26T00:00:00
+2118-12-26T00:00:00
+2119-12-26T00:00:00
+2120-12-26T00:00:00
+2121-12-26T00:00:00
+2122-12-26T00:00:00
+2123-12-26T00:00:00
+2124-12-26T00:00:00
+2125-12-26T00:00:00
+2126-12-26T00:00:00
+2127-12-26T00:00:00
+2128-12-26T00:00:00
+2129-12-26T00:00:00
+2130-12-26T00:00:00
+2131-12-26T00:00:00
+2132-12-26T00:00:00
+2133-12-26T00:00:00
+2134-12-26T00:00:00
+2135-12-26T00:00:00
+2136-12-26T00:00:00
+2137-12-26T00:00:00
+2138-12-26T00:00:00
+2139-12-26T00:00:00
+2140-12-26T00:00:00
+2141-12-26T00:00:00
+2142-12-26T00:00:00
+2143-12-26T00:00:00
+2144-12-26T00:00:00
+2145-12-26T00:00:00
+2146-12-26T00:00:00
+2147-12-26T00:00:00
+2148-12-26T00:00:00
+2149-12-26T00:00:00
+2150-12-26T00:00:00
+2151-12-26T00:00:00
+2152-12-26T00:00:00
+2153-12-26T00:00:00
+2154-12-26T00:00:00
+2155-12-26T00:00:00
+2156-12-26T00:00:00
+2157-12-26T00:00:00
+2158-12-26T00:00:00
+2159-12-26T00:00:00
+2160-12-26T00:00:00
+2161-12-26T00:00:00
+2162-12-26T00:00:00
+2163-12-26T00:00:00
+2164-12-26T00:00:00
+2165-12-26T00:00:00
+2166-12-26T00:00:00
+2167-12-26T00:00:00
+2168-12-26T00:00:00
+2169-12-26T00:00:00
+2170-12-26T00:00:00
+2171-12-26T00:00:00
+2172-12-26T00:00:00
+2173-12-26T00:00:00
+2174-12-26T00:00:00
+2175-12-26T00:00:00
+2176-12-26T00:00:00
+2177-12-26T00:00:00
+2178-12-26T00:00:00
+2179-12-26T00:00:00
+2180-12-26T00:00:00
+2181-12-26T00:00:00
+2182-12-26T00:00:00
+2183-12-26T00:00:00
+2184-12-26T00:00:00
+2185-12-26T00:00:00
+2186-12-26T00:00:00
+2187-12-26T00:00:00
+2188-12-26T00:00:00
+2189-12-26T00:00:00
+2190-12-26T00:00:00
+2191-12-26T00:00:00
+2192-12-26T00:00:00
+2193-12-26T00:00:00
+2194-12-26T00:00:00
+2195-12-26T00:00:00
+2196-12-26T00:00:00
+2197-12-26T00:00:00
+2198-12-26T00:00:00
+2199-12-26T00:00:00
+2200-12-26T00:00:00
+2201-12-26T00:00:00
+2202-12-26T00:00:00
+2203-12-26T00:00:00
+2204-12-26T00:00:00
+2205-12-26T00:00:00
+2206-12-26T00:00:00
+2207-12-26T00:00:00
+2208-12-26T00:00:00
+2209-12-26T00:00:00
+2210-12-26T00:00:00
+2211-12-26T00:00:00
+2212-12-26T00:00:00
+2213-12-26T00:00:00
+2214-12-26T00:00:00
+2215-12-26T00:00:00
+2216-12-26T00:00:00
+2217-12-26T00:00:00
+2218-12-26T00:00:00
+2219-12-26T00:00:00
+2220-12-26T00:00:00
+2221-12-26T00:00:00
+2222-12-26T00:00:00
+2223-12-26T00:00:00
+2224-12-26T00:00:00
+2225-12-26T00:00:00
+2226-12-26T00:00:00
+2227-12-26T00:00:00
+2228-12-26T00:00:00
+2229-12-26T00:00:00
+2230-12-26T00:00:00
+2231-12-26T00:00:00
+2232-12-26T00:00:00
+2233-12-26T00:00:00
+2234-12-26T00:00:00
+2235-12-26T00:00:00
+2236-12-26T00:00:00
+2237-12-26T00:00:00
+2238-12-26T00:00:00
+2239-12-26T00:00:00
+2240-12-26T00:00:00
+2241-12-26T00:00:00
+2242-12-26T00:00:00
+2243-12-26T00:00:00
+2244-12-26T00:00:00
+2245-12-26T00:00:00
+2246-12-26T00:00:00
+2247-12-26T00:00:00
+2248-12-26T00:00:00
+2249-12-26T00:00:00
+2250-12-26T00:00:00
+2251-12-26T00:00:00
+2252-12-26T00:00:00
+2253-12-26T00:00:00
+2254-12-26T00:00:00
+2255-12-26T00:00:00
+2256-12-26T00:00:00
+2257-12-26T00:00:00
+2258-12-26T00:00:00
+2259-12-26T00:00:00
+2260-12-26T00:00:00
+2261-12-26T00:00:00
+2262-12-26T00:00:00
+2263-12-26T00:00:00
+2264-12-26T00:00:00
+2265-12-26T00:00:00
+2266-12-26T00:00:00
+2267-12-26T00:00:00
+2268-12-26T00:00:00
+2269-12-26T00:00:00
+2270-12-26T00:00:00
+2271-12-26T00:00:00
+2272-12-26T00:00:00
+2273-12-26T00:00:00
+2274-12-26T00:00:00
+2275-12-26T00:00:00
+2276-12-26T00:00:00
+2277-12-26T00:00:00
+2278-12-26T00:00:00
+2279-12-26T00:00:00
+2280-12-26T00:00:00
+2281-12-26T00:00:00
+2282-12-26T00:00:00
+2283-12-26T00:00:00
+2284-12-26T00:00:00
+2285-12-26T00:00:00
+2286-12-26T00:00:00
+2287-12-26T00:00:00
+2288-12-26T00:00:00
+2289-12-26T00:00:00
+2290-12-26T00:00:00
+2291-12-26T00:00:00
+2292-12-26T00:00:00
+2293-12-26T00:00:00
+2294-12-26T00:00:00
+2295-12-26T00:00:00
+2296-12-26T00:00:00
+2297-12-26T00:00:00
+2298-12-26T00:00:00
+2299-12-26T00:00:00
+2300-12-26T00:00:00
+2301-12-26T00:00:00
+2302-12-26T00:00:00
+2303-12-26T00:00:00
+2304-12-26T00:00:00
+2305-12-26T00:00:00
+2306-12-26T00:00:00
+2307-12-26T00:00:00
+2308-12-26T00:00:00
+2309-12-26T00:00:00
+2310-12-26T00:00:00
+2311-12-26T00:00:00
+2312-12-26T00:00:00
+2313-12-26T00:00:00
+2314-12-26T00:00:00
+2315-12-26T00:00:00
+2316-12-26T00:00:00
+2317-12-26T00:00:00
+2318-12-26T00:00:00
+2319-12-26T00:00:00
+2320-12-26T00:00:00
+2321-12-26T00:00:00
+2322-12-26T00:00:00
+2323-12-26T00:00:00
+2324-12-26T00:00:00
+2325-12-26T00:00:00
+2326-12-26T00:00:00
+2327-12-26T00:00:00
+2328-12-26T00:00:00
+2329-12-26T00:00:00
+2330-12-26T00:00:00
+2331-12-26T00:00:00
+2332-12-26T00:00:00
+2333-12-26T00:00:00
+2334-12-26T00:00:00
+2335-12-26T00:00:00
+2336-12-26T00:00:00
+2337-12-26T00:00:00
+2338-12-26T00:00:00
+2339-12-26T00:00:00
+2340-12-26T00:00:00
+2341-12-26T00:00:00
+2342-12-26T00:00:00
+2343-12-26T00:00:00
+2344-12-26T00:00:00
+2345-12-26T00:00:00
+2346-12-26T00:00:00
+2347-12-26T00:00:00
+2348-12-26T00:00:00
+2349-12-26T00:00:00
+2350-12-26T00:00:00
+2351-12-26T00:00:00
+2352-12-26T00:00:00
+2353-12-26T00:00:00
+2354-12-26T00:00:00
+2355-12-26T00:00:00
+2356-12-26T00:00:00
+2357-12-26T00:00:00
+2358-12-26T00:00:00
+2359-12-26T00:00:00
+2360-12-26T00:00:00
+2361-12-26T00:00:00
+2362-12-26T00:00:00
+2363-12-26T00:00:00
+2364-12-26T00:00:00
+2365-12-26T00:00:00
+2366-12-26T00:00:00
+2367-12-26T00:00:00
+2368-12-26T00:00:00
+2369-12-26T00:00:00
+2370-12-26T00:00:00
+2371-12-26T00:00:00
+2372-12-26T00:00:00
+2373-12-26T00:00:00
+2374-12-26T00:00:00
+2375-12-26T00:00:00
+2376-12-26T00:00:00
+2377-12-26T00:00:00
+2378-12-26T00:00:00
+2379-12-26T00:00:00
+2380-12-26T00:00:00
+2381-12-26T00:00:00
+2382-12-26T00:00:00
+2383-12-26T00:00:00
+2384-12-26T00:00:00
+2385-12-26T00:00:00
+2386-12-26T00:00:00
+2387-12-26T00:00:00
+2388-12-26T00:00:00
+2389-12-26T00:00:00
+2390-12-26T00:00:00
+2391-12-26T00:00:00
+2392-12-26T00:00:00
+2393-12-26T00:00:00
+2394-12-26T00:00:00
+2395-12-26T00:00:00
+2396-12-26T00:00:00
+2397-12-26T00:00:00
+2398-12-26T00:00:00
+2399-12-26T00:00:00
+2400-12-26T00:00:00
+2401-12-26T00:00:00
+2402-12-26T00:00:00
+2403-12-26T00:00:00
+2404-12-26T00:00:00
+2405-12-26T00:00:00
+2406-12-26T00:00:00
+2407-12-26T00:00:00
+2408-12-26T00:00:00
+2409-12-26T00:00:00
+2410-12-26T00:00:00
+2411-12-26T00:00:00
+2412-12-26T00:00:00
+2413-12-26T00:00:00
+2414-12-26T00:00:00
+2415-12-26T00:00:00
+2416-12-26T00:00:00
+2417-12-26T00:00:00
+2418-12-26T00:00:00
+2419-12-26T00:00:00
+2420-12-26T00:00:00
+2421-12-26T00:00:00
+2422-12-26T00:00:00
+2423-12-26T00:00:00
+2424-12-26T00:00:00
+2425-12-26T00:00:00
+2426-12-26T00:00:00
+2427-12-26T00:00:00
+2428-12-26T00:00:00
+2429-12-26T00:00:00
+2430-12-26T00:00:00
+2431-12-26T00:00:00
+2432-12-26T00:00:00
+2433-12-26T00:00:00
+2434-12-26T00:00:00
+2435-12-26T00:00:00
+2436-12-26T00:00:00
+2437-12-26T00:00:00
+2438-12-26T00:00:00
+2439-12-26T00:00:00
+2440-12-26T00:00:00
+2441-12-26T00:00:00
+2442-12-26T00:00:00
+2443-12-26T00:00:00
+2444-12-26T00:00:00
+2445-12-26T00:00:00
+2446-12-26T00:00:00
+2447-12-26T00:00:00
+2448-12-26T00:00:00
+2449-12-26T00:00:00
+2450-12-26T00:00:00
+2451-12-26T00:00:00
+2452-12-26T00:00:00
+2453-12-26T00:00:00
+2454-12-26T00:00:00
+2455-12-26T00:00:00
+2456-12-26T00:00:00
+2457-12-26T00:00:00
+2458-12-26T00:00:00
+2459-12-26T00:00:00
+2460-12-26T00:00:00
+2461-12-26T00:00:00
+2462-12-26T00:00:00
+2463-12-26T00:00:00
+2464-12-26T00:00:00
+2465-12-26T00:00:00
+2466-12-26T00:00:00
+2467-12-26T00:00:00
+2468-12-26T00:00:00
+2469-12-26T00:00:00
+2470-12-26T00:00:00
+2471-12-26T00:00:00
+2472-12-26T00:00:00
+2473-12-26T00:00:00
+2474-12-26T00:00:00
+2475-12-26T00:00:00
+2476-12-26T00:00:00
+2477-12-26T00:00:00
+2478-12-26T00:00:00
+2479-12-26T00:00:00
+2480-12-26T00:00:00
+2481-12-26T00:00:00
+2482-12-26T00:00:00
+2483-12-26T00:00:00
+2484-12-26T00:00:00
+2485-12-26T00:00:00
+2486-12-26T00:00:00
+2487-12-26T00:00:00
+2488-12-26T00:00:00
+2489-12-26T00:00:00
+2490-12-26T00:00:00
+2491-12-26T00:00:00
+2492-12-26T00:00:00
+2493-12-26T00:00:00
+2494-12-26T00:00:00
+2495-12-26T00:00:00
+2496-12-26T00:00:00
+2497-12-26T00:00:00
+2498-12-26T00:00:00
+2499-12-26T00:00:00
+2500-12-26T00:00:00
+2501-12-26T00:00:00
+2502-12-26T00:00:00
+2503-12-26T00:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily9.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily9.ics.prev.ref
new file mode 100644
index 00000000..2142fccb
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily9.ics.prev.ref
@@ -0,0 +1,8 @@
+2010-12-26T00:00:00
+2009-12-26T00:00:00
+2008-12-26T00:00:00
+2007-12-26T00:00:00
+2006-12-26T00:00:00
+2005-12-26T00:00:00
+2004-12-26T00:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily9.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily9.ics.recurson.ref
new file mode 100644
index 00000000..6e3750f2
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily9.ics.recurson.ref
@@ -0,0 +1,500 @@
+2004-12-26
+2005-12-26
+2006-12-26
+2007-12-26
+2008-12-26
+2009-12-26
+2010-12-26
+2011-12-26
+2012-12-26
+2013-12-26
+2014-12-26
+2015-12-26
+2016-12-26
+2017-12-26
+2018-12-26
+2019-12-26
+2020-12-26
+2021-12-26
+2022-12-26
+2023-12-26
+2024-12-26
+2025-12-26
+2026-12-26
+2027-12-26
+2028-12-26
+2029-12-26
+2030-12-26
+2031-12-26
+2032-12-26
+2033-12-26
+2034-12-26
+2035-12-26
+2036-12-26
+2037-12-26
+2038-12-26
+2039-12-26
+2040-12-26
+2041-12-26
+2042-12-26
+2043-12-26
+2044-12-26
+2045-12-26
+2046-12-26
+2047-12-26
+2048-12-26
+2049-12-26
+2050-12-26
+2051-12-26
+2052-12-26
+2053-12-26
+2054-12-26
+2055-12-26
+2056-12-26
+2057-12-26
+2058-12-26
+2059-12-26
+2060-12-26
+2061-12-26
+2062-12-26
+2063-12-26
+2064-12-26
+2065-12-26
+2066-12-26
+2067-12-26
+2068-12-26
+2069-12-26
+2070-12-26
+2071-12-26
+2072-12-26
+2073-12-26
+2074-12-26
+2075-12-26
+2076-12-26
+2077-12-26
+2078-12-26
+2079-12-26
+2080-12-26
+2081-12-26
+2082-12-26
+2083-12-26
+2084-12-26
+2085-12-26
+2086-12-26
+2087-12-26
+2088-12-26
+2089-12-26
+2090-12-26
+2091-12-26
+2092-12-26
+2093-12-26
+2094-12-26
+2095-12-26
+2096-12-26
+2097-12-26
+2098-12-26
+2099-12-26
+2100-12-26
+2101-12-26
+2102-12-26
+2103-12-26
+2104-12-26
+2105-12-26
+2106-12-26
+2107-12-26
+2108-12-26
+2109-12-26
+2110-12-26
+2111-12-26
+2112-12-26
+2113-12-26
+2114-12-26
+2115-12-26
+2116-12-26
+2117-12-26
+2118-12-26
+2119-12-26
+2120-12-26
+2121-12-26
+2122-12-26
+2123-12-26
+2124-12-26
+2125-12-26
+2126-12-26
+2127-12-26
+2128-12-26
+2129-12-26
+2130-12-26
+2131-12-26
+2132-12-26
+2133-12-26
+2134-12-26
+2135-12-26
+2136-12-26
+2137-12-26
+2138-12-26
+2139-12-26
+2140-12-26
+2141-12-26
+2142-12-26
+2143-12-26
+2144-12-26
+2145-12-26
+2146-12-26
+2147-12-26
+2148-12-26
+2149-12-26
+2150-12-26
+2151-12-26
+2152-12-26
+2153-12-26
+2154-12-26
+2155-12-26
+2156-12-26
+2157-12-26
+2158-12-26
+2159-12-26
+2160-12-26
+2161-12-26
+2162-12-26
+2163-12-26
+2164-12-26
+2165-12-26
+2166-12-26
+2167-12-26
+2168-12-26
+2169-12-26
+2170-12-26
+2171-12-26
+2172-12-26
+2173-12-26
+2174-12-26
+2175-12-26
+2176-12-26
+2177-12-26
+2178-12-26
+2179-12-26
+2180-12-26
+2181-12-26
+2182-12-26
+2183-12-26
+2184-12-26
+2185-12-26
+2186-12-26
+2187-12-26
+2188-12-26
+2189-12-26
+2190-12-26
+2191-12-26
+2192-12-26
+2193-12-26
+2194-12-26
+2195-12-26
+2196-12-26
+2197-12-26
+2198-12-26
+2199-12-26
+2200-12-26
+2201-12-26
+2202-12-26
+2203-12-26
+2204-12-26
+2205-12-26
+2206-12-26
+2207-12-26
+2208-12-26
+2209-12-26
+2210-12-26
+2211-12-26
+2212-12-26
+2213-12-26
+2214-12-26
+2215-12-26
+2216-12-26
+2217-12-26
+2218-12-26
+2219-12-26
+2220-12-26
+2221-12-26
+2222-12-26
+2223-12-26
+2224-12-26
+2225-12-26
+2226-12-26
+2227-12-26
+2228-12-26
+2229-12-26
+2230-12-26
+2231-12-26
+2232-12-26
+2233-12-26
+2234-12-26
+2235-12-26
+2236-12-26
+2237-12-26
+2238-12-26
+2239-12-26
+2240-12-26
+2241-12-26
+2242-12-26
+2243-12-26
+2244-12-26
+2245-12-26
+2246-12-26
+2247-12-26
+2248-12-26
+2249-12-26
+2250-12-26
+2251-12-26
+2252-12-26
+2253-12-26
+2254-12-26
+2255-12-26
+2256-12-26
+2257-12-26
+2258-12-26
+2259-12-26
+2260-12-26
+2261-12-26
+2262-12-26
+2263-12-26
+2264-12-26
+2265-12-26
+2266-12-26
+2267-12-26
+2268-12-26
+2269-12-26
+2270-12-26
+2271-12-26
+2272-12-26
+2273-12-26
+2274-12-26
+2275-12-26
+2276-12-26
+2277-12-26
+2278-12-26
+2279-12-26
+2280-12-26
+2281-12-26
+2282-12-26
+2283-12-26
+2284-12-26
+2285-12-26
+2286-12-26
+2287-12-26
+2288-12-26
+2289-12-26
+2290-12-26
+2291-12-26
+2292-12-26
+2293-12-26
+2294-12-26
+2295-12-26
+2296-12-26
+2297-12-26
+2298-12-26
+2299-12-26
+2300-12-26
+2301-12-26
+2302-12-26
+2303-12-26
+2304-12-26
+2305-12-26
+2306-12-26
+2307-12-26
+2308-12-26
+2309-12-26
+2310-12-26
+2311-12-26
+2312-12-26
+2313-12-26
+2314-12-26
+2315-12-26
+2316-12-26
+2317-12-26
+2318-12-26
+2319-12-26
+2320-12-26
+2321-12-26
+2322-12-26
+2323-12-26
+2324-12-26
+2325-12-26
+2326-12-26
+2327-12-26
+2328-12-26
+2329-12-26
+2330-12-26
+2331-12-26
+2332-12-26
+2333-12-26
+2334-12-26
+2335-12-26
+2336-12-26
+2337-12-26
+2338-12-26
+2339-12-26
+2340-12-26
+2341-12-26
+2342-12-26
+2343-12-26
+2344-12-26
+2345-12-26
+2346-12-26
+2347-12-26
+2348-12-26
+2349-12-26
+2350-12-26
+2351-12-26
+2352-12-26
+2353-12-26
+2354-12-26
+2355-12-26
+2356-12-26
+2357-12-26
+2358-12-26
+2359-12-26
+2360-12-26
+2361-12-26
+2362-12-26
+2363-12-26
+2364-12-26
+2365-12-26
+2366-12-26
+2367-12-26
+2368-12-26
+2369-12-26
+2370-12-26
+2371-12-26
+2372-12-26
+2373-12-26
+2374-12-26
+2375-12-26
+2376-12-26
+2377-12-26
+2378-12-26
+2379-12-26
+2380-12-26
+2381-12-26
+2382-12-26
+2383-12-26
+2384-12-26
+2385-12-26
+2386-12-26
+2387-12-26
+2388-12-26
+2389-12-26
+2390-12-26
+2391-12-26
+2392-12-26
+2393-12-26
+2394-12-26
+2395-12-26
+2396-12-26
+2397-12-26
+2398-12-26
+2399-12-26
+2400-12-26
+2401-12-26
+2402-12-26
+2403-12-26
+2404-12-26
+2405-12-26
+2406-12-26
+2407-12-26
+2408-12-26
+2409-12-26
+2410-12-26
+2411-12-26
+2412-12-26
+2413-12-26
+2414-12-26
+2415-12-26
+2416-12-26
+2417-12-26
+2418-12-26
+2419-12-26
+2420-12-26
+2421-12-26
+2422-12-26
+2423-12-26
+2424-12-26
+2425-12-26
+2426-12-26
+2427-12-26
+2428-12-26
+2429-12-26
+2430-12-26
+2431-12-26
+2432-12-26
+2433-12-26
+2434-12-26
+2435-12-26
+2436-12-26
+2437-12-26
+2438-12-26
+2439-12-26
+2440-12-26
+2441-12-26
+2442-12-26
+2443-12-26
+2444-12-26
+2445-12-26
+2446-12-26
+2447-12-26
+2448-12-26
+2449-12-26
+2450-12-26
+2451-12-26
+2452-12-26
+2453-12-26
+2454-12-26
+2455-12-26
+2456-12-26
+2457-12-26
+2458-12-26
+2459-12-26
+2460-12-26
+2461-12-26
+2462-12-26
+2463-12-26
+2464-12-26
+2465-12-26
+2466-12-26
+2467-12-26
+2468-12-26
+2469-12-26
+2470-12-26
+2471-12-26
+2472-12-26
+2473-12-26
+2474-12-26
+2475-12-26
+2476-12-26
+2477-12-26
+2478-12-26
+2479-12-26
+2480-12-26
+2481-12-26
+2482-12-26
+2483-12-26
+2484-12-26
+2485-12-26
+2486-12-26
+2487-12-26
+2488-12-26
+2489-12-26
+2490-12-26
+2491-12-26
+2492-12-26
+2493-12-26
+2494-12-26
+2495-12-26
+2496-12-26
+2497-12-26
+2498-12-26
+2499-12-26
+2500-12-26
+2501-12-26
+2502-12-26
+2503-12-26
diff --git a/libkcal/tests/data/RecurrenceRule/ConnectDaily/readme.txt b/libkcal/tests/data/RecurrenceRule/ConnectDaily/readme.txt
new file mode 100644
index 00000000..26f75691
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/ConnectDaily/readme.txt
@@ -0,0 +1 @@
+Some test event from ConnectDaily.
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase01.ics b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase01.ics
new file mode 100644
index 00000000..3e8d8684
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase01.ics
@@ -0,0 +1,23 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KAlarm 1.2.6//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20050522T130601
+CREATED:20050522T130311
+UID:KAlarm-2080187732.550
+SEQUENCE:0
+LAST-MODIFIED:20050522T130311
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=DAILY;INTERVAL=4
+DTSTART:20050526T130300
+TRANSP:OPAQUE
+BEGIN:VALARM
+DESCRIPTION:Every 4 days
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:PT0S
+X-KDE-KALARM-FONTCOLOR:#ff0000\;#000000\;
+END:VALARM
+
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase01.ics.next.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase01.ics.next.ref
new file mode 100644
index 00000000..64c76db9
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase01.ics.next.ref
@@ -0,0 +1,500 @@
+2005-05-26T13:03:00
+2005-05-30T13:03:00
+2005-06-03T13:03:00
+2005-06-07T13:03:00
+2005-06-11T13:03:00
+2005-06-15T13:03:00
+2005-06-19T13:03:00
+2005-06-23T13:03:00
+2005-06-27T13:03:00
+2005-07-01T13:03:00
+2005-07-05T13:03:00
+2005-07-09T13:03:00
+2005-07-13T13:03:00
+2005-07-17T13:03:00
+2005-07-21T13:03:00
+2005-07-25T13:03:00
+2005-07-29T13:03:00
+2005-08-02T13:03:00
+2005-08-06T13:03:00
+2005-08-10T13:03:00
+2005-08-14T13:03:00
+2005-08-18T13:03:00
+2005-08-22T13:03:00
+2005-08-26T13:03:00
+2005-08-30T13:03:00
+2005-09-03T13:03:00
+2005-09-07T13:03:00
+2005-09-11T13:03:00
+2005-09-15T13:03:00
+2005-09-19T13:03:00
+2005-09-23T13:03:00
+2005-09-27T13:03:00
+2005-10-01T13:03:00
+2005-10-05T13:03:00
+2005-10-09T13:03:00
+2005-10-13T13:03:00
+2005-10-17T13:03:00
+2005-10-21T13:03:00
+2005-10-25T13:03:00
+2005-10-29T13:03:00
+2005-11-02T13:03:00
+2005-11-06T13:03:00
+2005-11-10T13:03:00
+2005-11-14T13:03:00
+2005-11-18T13:03:00
+2005-11-22T13:03:00
+2005-11-26T13:03:00
+2005-11-30T13:03:00
+2005-12-04T13:03:00
+2005-12-08T13:03:00
+2005-12-12T13:03:00
+2005-12-16T13:03:00
+2005-12-20T13:03:00
+2005-12-24T13:03:00
+2005-12-28T13:03:00
+2006-01-01T13:03:00
+2006-01-05T13:03:00
+2006-01-09T13:03:00
+2006-01-13T13:03:00
+2006-01-17T13:03:00
+2006-01-21T13:03:00
+2006-01-25T13:03:00
+2006-01-29T13:03:00
+2006-02-02T13:03:00
+2006-02-06T13:03:00
+2006-02-10T13:03:00
+2006-02-14T13:03:00
+2006-02-18T13:03:00
+2006-02-22T13:03:00
+2006-02-26T13:03:00
+2006-03-02T13:03:00
+2006-03-06T13:03:00
+2006-03-10T13:03:00
+2006-03-14T13:03:00
+2006-03-18T13:03:00
+2006-03-22T13:03:00
+2006-03-26T13:03:00
+2006-03-30T13:03:00
+2006-04-03T13:03:00
+2006-04-07T13:03:00
+2006-04-11T13:03:00
+2006-04-15T13:03:00
+2006-04-19T13:03:00
+2006-04-23T13:03:00
+2006-04-27T13:03:00
+2006-05-01T13:03:00
+2006-05-05T13:03:00
+2006-05-09T13:03:00
+2006-05-13T13:03:00
+2006-05-17T13:03:00
+2006-05-21T13:03:00
+2006-05-25T13:03:00
+2006-05-29T13:03:00
+2006-06-02T13:03:00
+2006-06-06T13:03:00
+2006-06-10T13:03:00
+2006-06-14T13:03:00
+2006-06-18T13:03:00
+2006-06-22T13:03:00
+2006-06-26T13:03:00
+2006-06-30T13:03:00
+2006-07-04T13:03:00
+2006-07-08T13:03:00
+2006-07-12T13:03:00
+2006-07-16T13:03:00
+2006-07-20T13:03:00
+2006-07-24T13:03:00
+2006-07-28T13:03:00
+2006-08-01T13:03:00
+2006-08-05T13:03:00
+2006-08-09T13:03:00
+2006-08-13T13:03:00
+2006-08-17T13:03:00
+2006-08-21T13:03:00
+2006-08-25T13:03:00
+2006-08-29T13:03:00
+2006-09-02T13:03:00
+2006-09-06T13:03:00
+2006-09-10T13:03:00
+2006-09-14T13:03:00
+2006-09-18T13:03:00
+2006-09-22T13:03:00
+2006-09-26T13:03:00
+2006-09-30T13:03:00
+2006-10-04T13:03:00
+2006-10-08T13:03:00
+2006-10-12T13:03:00
+2006-10-16T13:03:00
+2006-10-20T13:03:00
+2006-10-24T13:03:00
+2006-10-28T13:03:00
+2006-11-01T13:03:00
+2006-11-05T13:03:00
+2006-11-09T13:03:00
+2006-11-13T13:03:00
+2006-11-17T13:03:00
+2006-11-21T13:03:00
+2006-11-25T13:03:00
+2006-11-29T13:03:00
+2006-12-03T13:03:00
+2006-12-07T13:03:00
+2006-12-11T13:03:00
+2006-12-15T13:03:00
+2006-12-19T13:03:00
+2006-12-23T13:03:00
+2006-12-27T13:03:00
+2006-12-31T13:03:00
+2007-01-04T13:03:00
+2007-01-08T13:03:00
+2007-01-12T13:03:00
+2007-01-16T13:03:00
+2007-01-20T13:03:00
+2007-01-24T13:03:00
+2007-01-28T13:03:00
+2007-02-01T13:03:00
+2007-02-05T13:03:00
+2007-02-09T13:03:00
+2007-02-13T13:03:00
+2007-02-17T13:03:00
+2007-02-21T13:03:00
+2007-02-25T13:03:00
+2007-03-01T13:03:00
+2007-03-05T13:03:00
+2007-03-09T13:03:00
+2007-03-13T13:03:00
+2007-03-17T13:03:00
+2007-03-21T13:03:00
+2007-03-25T13:03:00
+2007-03-29T13:03:00
+2007-04-02T13:03:00
+2007-04-06T13:03:00
+2007-04-10T13:03:00
+2007-04-14T13:03:00
+2007-04-18T13:03:00
+2007-04-22T13:03:00
+2007-04-26T13:03:00
+2007-04-30T13:03:00
+2007-05-04T13:03:00
+2007-05-08T13:03:00
+2007-05-12T13:03:00
+2007-05-16T13:03:00
+2007-05-20T13:03:00
+2007-05-24T13:03:00
+2007-05-28T13:03:00
+2007-06-01T13:03:00
+2007-06-05T13:03:00
+2007-06-09T13:03:00
+2007-06-13T13:03:00
+2007-06-17T13:03:00
+2007-06-21T13:03:00
+2007-06-25T13:03:00
+2007-06-29T13:03:00
+2007-07-03T13:03:00
+2007-07-07T13:03:00
+2007-07-11T13:03:00
+2007-07-15T13:03:00
+2007-07-19T13:03:00
+2007-07-23T13:03:00
+2007-07-27T13:03:00
+2007-07-31T13:03:00
+2007-08-04T13:03:00
+2007-08-08T13:03:00
+2007-08-12T13:03:00
+2007-08-16T13:03:00
+2007-08-20T13:03:00
+2007-08-24T13:03:00
+2007-08-28T13:03:00
+2007-09-01T13:03:00
+2007-09-05T13:03:00
+2007-09-09T13:03:00
+2007-09-13T13:03:00
+2007-09-17T13:03:00
+2007-09-21T13:03:00
+2007-09-25T13:03:00
+2007-09-29T13:03:00
+2007-10-03T13:03:00
+2007-10-07T13:03:00
+2007-10-11T13:03:00
+2007-10-15T13:03:00
+2007-10-19T13:03:00
+2007-10-23T13:03:00
+2007-10-27T13:03:00
+2007-10-31T13:03:00
+2007-11-04T13:03:00
+2007-11-08T13:03:00
+2007-11-12T13:03:00
+2007-11-16T13:03:00
+2007-11-20T13:03:00
+2007-11-24T13:03:00
+2007-11-28T13:03:00
+2007-12-02T13:03:00
+2007-12-06T13:03:00
+2007-12-10T13:03:00
+2007-12-14T13:03:00
+2007-12-18T13:03:00
+2007-12-22T13:03:00
+2007-12-26T13:03:00
+2007-12-30T13:03:00
+2008-01-03T13:03:00
+2008-01-07T13:03:00
+2008-01-11T13:03:00
+2008-01-15T13:03:00
+2008-01-19T13:03:00
+2008-01-23T13:03:00
+2008-01-27T13:03:00
+2008-01-31T13:03:00
+2008-02-04T13:03:00
+2008-02-08T13:03:00
+2008-02-12T13:03:00
+2008-02-16T13:03:00
+2008-02-20T13:03:00
+2008-02-24T13:03:00
+2008-02-28T13:03:00
+2008-03-03T13:03:00
+2008-03-07T13:03:00
+2008-03-11T13:03:00
+2008-03-15T13:03:00
+2008-03-19T13:03:00
+2008-03-23T13:03:00
+2008-03-27T13:03:00
+2008-03-31T13:03:00
+2008-04-04T13:03:00
+2008-04-08T13:03:00
+2008-04-12T13:03:00
+2008-04-16T13:03:00
+2008-04-20T13:03:00
+2008-04-24T13:03:00
+2008-04-28T13:03:00
+2008-05-02T13:03:00
+2008-05-06T13:03:00
+2008-05-10T13:03:00
+2008-05-14T13:03:00
+2008-05-18T13:03:00
+2008-05-22T13:03:00
+2008-05-26T13:03:00
+2008-05-30T13:03:00
+2008-06-03T13:03:00
+2008-06-07T13:03:00
+2008-06-11T13:03:00
+2008-06-15T13:03:00
+2008-06-19T13:03:00
+2008-06-23T13:03:00
+2008-06-27T13:03:00
+2008-07-01T13:03:00
+2008-07-05T13:03:00
+2008-07-09T13:03:00
+2008-07-13T13:03:00
+2008-07-17T13:03:00
+2008-07-21T13:03:00
+2008-07-25T13:03:00
+2008-07-29T13:03:00
+2008-08-02T13:03:00
+2008-08-06T13:03:00
+2008-08-10T13:03:00
+2008-08-14T13:03:00
+2008-08-18T13:03:00
+2008-08-22T13:03:00
+2008-08-26T13:03:00
+2008-08-30T13:03:00
+2008-09-03T13:03:00
+2008-09-07T13:03:00
+2008-09-11T13:03:00
+2008-09-15T13:03:00
+2008-09-19T13:03:00
+2008-09-23T13:03:00
+2008-09-27T13:03:00
+2008-10-01T13:03:00
+2008-10-05T13:03:00
+2008-10-09T13:03:00
+2008-10-13T13:03:00
+2008-10-17T13:03:00
+2008-10-21T13:03:00
+2008-10-25T13:03:00
+2008-10-29T13:03:00
+2008-11-02T13:03:00
+2008-11-06T13:03:00
+2008-11-10T13:03:00
+2008-11-14T13:03:00
+2008-11-18T13:03:00
+2008-11-22T13:03:00
+2008-11-26T13:03:00
+2008-11-30T13:03:00
+2008-12-04T13:03:00
+2008-12-08T13:03:00
+2008-12-12T13:03:00
+2008-12-16T13:03:00
+2008-12-20T13:03:00
+2008-12-24T13:03:00
+2008-12-28T13:03:00
+2009-01-01T13:03:00
+2009-01-05T13:03:00
+2009-01-09T13:03:00
+2009-01-13T13:03:00
+2009-01-17T13:03:00
+2009-01-21T13:03:00
+2009-01-25T13:03:00
+2009-01-29T13:03:00
+2009-02-02T13:03:00
+2009-02-06T13:03:00
+2009-02-10T13:03:00
+2009-02-14T13:03:00
+2009-02-18T13:03:00
+2009-02-22T13:03:00
+2009-02-26T13:03:00
+2009-03-02T13:03:00
+2009-03-06T13:03:00
+2009-03-10T13:03:00
+2009-03-14T13:03:00
+2009-03-18T13:03:00
+2009-03-22T13:03:00
+2009-03-26T13:03:00
+2009-03-30T13:03:00
+2009-04-03T13:03:00
+2009-04-07T13:03:00
+2009-04-11T13:03:00
+2009-04-15T13:03:00
+2009-04-19T13:03:00
+2009-04-23T13:03:00
+2009-04-27T13:03:00
+2009-05-01T13:03:00
+2009-05-05T13:03:00
+2009-05-09T13:03:00
+2009-05-13T13:03:00
+2009-05-17T13:03:00
+2009-05-21T13:03:00
+2009-05-25T13:03:00
+2009-05-29T13:03:00
+2009-06-02T13:03:00
+2009-06-06T13:03:00
+2009-06-10T13:03:00
+2009-06-14T13:03:00
+2009-06-18T13:03:00
+2009-06-22T13:03:00
+2009-06-26T13:03:00
+2009-06-30T13:03:00
+2009-07-04T13:03:00
+2009-07-08T13:03:00
+2009-07-12T13:03:00
+2009-07-16T13:03:00
+2009-07-20T13:03:00
+2009-07-24T13:03:00
+2009-07-28T13:03:00
+2009-08-01T13:03:00
+2009-08-05T13:03:00
+2009-08-09T13:03:00
+2009-08-13T13:03:00
+2009-08-17T13:03:00
+2009-08-21T13:03:00
+2009-08-25T13:03:00
+2009-08-29T13:03:00
+2009-09-02T13:03:00
+2009-09-06T13:03:00
+2009-09-10T13:03:00
+2009-09-14T13:03:00
+2009-09-18T13:03:00
+2009-09-22T13:03:00
+2009-09-26T13:03:00
+2009-09-30T13:03:00
+2009-10-04T13:03:00
+2009-10-08T13:03:00
+2009-10-12T13:03:00
+2009-10-16T13:03:00
+2009-10-20T13:03:00
+2009-10-24T13:03:00
+2009-10-28T13:03:00
+2009-11-01T13:03:00
+2009-11-05T13:03:00
+2009-11-09T13:03:00
+2009-11-13T13:03:00
+2009-11-17T13:03:00
+2009-11-21T13:03:00
+2009-11-25T13:03:00
+2009-11-29T13:03:00
+2009-12-03T13:03:00
+2009-12-07T13:03:00
+2009-12-11T13:03:00
+2009-12-15T13:03:00
+2009-12-19T13:03:00
+2009-12-23T13:03:00
+2009-12-27T13:03:00
+2009-12-31T13:03:00
+2010-01-04T13:03:00
+2010-01-08T13:03:00
+2010-01-12T13:03:00
+2010-01-16T13:03:00
+2010-01-20T13:03:00
+2010-01-24T13:03:00
+2010-01-28T13:03:00
+2010-02-01T13:03:00
+2010-02-05T13:03:00
+2010-02-09T13:03:00
+2010-02-13T13:03:00
+2010-02-17T13:03:00
+2010-02-21T13:03:00
+2010-02-25T13:03:00
+2010-03-01T13:03:00
+2010-03-05T13:03:00
+2010-03-09T13:03:00
+2010-03-13T13:03:00
+2010-03-17T13:03:00
+2010-03-21T13:03:00
+2010-03-25T13:03:00
+2010-03-29T13:03:00
+2010-04-02T13:03:00
+2010-04-06T13:03:00
+2010-04-10T13:03:00
+2010-04-14T13:03:00
+2010-04-18T13:03:00
+2010-04-22T13:03:00
+2010-04-26T13:03:00
+2010-04-30T13:03:00
+2010-05-04T13:03:00
+2010-05-08T13:03:00
+2010-05-12T13:03:00
+2010-05-16T13:03:00
+2010-05-20T13:03:00
+2010-05-24T13:03:00
+2010-05-28T13:03:00
+2010-06-01T13:03:00
+2010-06-05T13:03:00
+2010-06-09T13:03:00
+2010-06-13T13:03:00
+2010-06-17T13:03:00
+2010-06-21T13:03:00
+2010-06-25T13:03:00
+2010-06-29T13:03:00
+2010-07-03T13:03:00
+2010-07-07T13:03:00
+2010-07-11T13:03:00
+2010-07-15T13:03:00
+2010-07-19T13:03:00
+2010-07-23T13:03:00
+2010-07-27T13:03:00
+2010-07-31T13:03:00
+2010-08-04T13:03:00
+2010-08-08T13:03:00
+2010-08-12T13:03:00
+2010-08-16T13:03:00
+2010-08-20T13:03:00
+2010-08-24T13:03:00
+2010-08-28T13:03:00
+2010-09-01T13:03:00
+2010-09-05T13:03:00
+2010-09-09T13:03:00
+2010-09-13T13:03:00
+2010-09-17T13:03:00
+2010-09-21T13:03:00
+2010-09-25T13:03:00
+2010-09-29T13:03:00
+2010-10-03T13:03:00
+2010-10-07T13:03:00
+2010-10-11T13:03:00
+2010-10-15T13:03:00
+2010-10-19T13:03:00
+2010-10-23T13:03:00
+2010-10-27T13:03:00
+2010-10-31T13:03:00
+2010-11-04T13:03:00
+2010-11-08T13:03:00
+2010-11-12T13:03:00
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase01.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase01.ics.prev.ref
new file mode 100644
index 00000000..f47ac25b
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase01.ics.prev.ref
@@ -0,0 +1,500 @@
+2010-12-30T13:03:00
+2010-12-26T13:03:00
+2010-12-22T13:03:00
+2010-12-18T13:03:00
+2010-12-14T13:03:00
+2010-12-10T13:03:00
+2010-12-06T13:03:00
+2010-12-02T13:03:00
+2010-11-28T13:03:00
+2010-11-24T13:03:00
+2010-11-20T13:03:00
+2010-11-16T13:03:00
+2010-11-12T13:03:00
+2010-11-08T13:03:00
+2010-11-04T13:03:00
+2010-10-31T13:03:00
+2010-10-27T13:03:00
+2010-10-23T13:03:00
+2010-10-19T13:03:00
+2010-10-15T13:03:00
+2010-10-11T13:03:00
+2010-10-07T13:03:00
+2010-10-03T13:03:00
+2010-09-29T13:03:00
+2010-09-25T13:03:00
+2010-09-21T13:03:00
+2010-09-17T13:03:00
+2010-09-13T13:03:00
+2010-09-09T13:03:00
+2010-09-05T13:03:00
+2010-09-01T13:03:00
+2010-08-28T13:03:00
+2010-08-24T13:03:00
+2010-08-20T13:03:00
+2010-08-16T13:03:00
+2010-08-12T13:03:00
+2010-08-08T13:03:00
+2010-08-04T13:03:00
+2010-07-31T13:03:00
+2010-07-27T13:03:00
+2010-07-23T13:03:00
+2010-07-19T13:03:00
+2010-07-15T13:03:00
+2010-07-11T13:03:00
+2010-07-07T13:03:00
+2010-07-03T13:03:00
+2010-06-29T13:03:00
+2010-06-25T13:03:00
+2010-06-21T13:03:00
+2010-06-17T13:03:00
+2010-06-13T13:03:00
+2010-06-09T13:03:00
+2010-06-05T13:03:00
+2010-06-01T13:03:00
+2010-05-28T13:03:00
+2010-05-24T13:03:00
+2010-05-20T13:03:00
+2010-05-16T13:03:00
+2010-05-12T13:03:00
+2010-05-08T13:03:00
+2010-05-04T13:03:00
+2010-04-30T13:03:00
+2010-04-26T13:03:00
+2010-04-22T13:03:00
+2010-04-18T13:03:00
+2010-04-14T13:03:00
+2010-04-10T13:03:00
+2010-04-06T13:03:00
+2010-04-02T13:03:00
+2010-03-29T13:03:00
+2010-03-25T13:03:00
+2010-03-21T13:03:00
+2010-03-17T13:03:00
+2010-03-13T13:03:00
+2010-03-09T13:03:00
+2010-03-05T13:03:00
+2010-03-01T13:03:00
+2010-02-25T13:03:00
+2010-02-21T13:03:00
+2010-02-17T13:03:00
+2010-02-13T13:03:00
+2010-02-09T13:03:00
+2010-02-05T13:03:00
+2010-02-01T13:03:00
+2010-01-28T13:03:00
+2010-01-24T13:03:00
+2010-01-20T13:03:00
+2010-01-16T13:03:00
+2010-01-12T13:03:00
+2010-01-08T13:03:00
+2010-01-04T13:03:00
+2009-12-31T13:03:00
+2009-12-27T13:03:00
+2009-12-23T13:03:00
+2009-12-19T13:03:00
+2009-12-15T13:03:00
+2009-12-11T13:03:00
+2009-12-07T13:03:00
+2009-12-03T13:03:00
+2009-11-29T13:03:00
+2009-11-25T13:03:00
+2009-11-21T13:03:00
+2009-11-17T13:03:00
+2009-11-13T13:03:00
+2009-11-09T13:03:00
+2009-11-05T13:03:00
+2009-11-01T13:03:00
+2009-10-28T13:03:00
+2009-10-24T13:03:00
+2009-10-20T13:03:00
+2009-10-16T13:03:00
+2009-10-12T13:03:00
+2009-10-08T13:03:00
+2009-10-04T13:03:00
+2009-09-30T13:03:00
+2009-09-26T13:03:00
+2009-09-22T13:03:00
+2009-09-18T13:03:00
+2009-09-14T13:03:00
+2009-09-10T13:03:00
+2009-09-06T13:03:00
+2009-09-02T13:03:00
+2009-08-29T13:03:00
+2009-08-25T13:03:00
+2009-08-21T13:03:00
+2009-08-17T13:03:00
+2009-08-13T13:03:00
+2009-08-09T13:03:00
+2009-08-05T13:03:00
+2009-08-01T13:03:00
+2009-07-28T13:03:00
+2009-07-24T13:03:00
+2009-07-20T13:03:00
+2009-07-16T13:03:00
+2009-07-12T13:03:00
+2009-07-08T13:03:00
+2009-07-04T13:03:00
+2009-06-30T13:03:00
+2009-06-26T13:03:00
+2009-06-22T13:03:00
+2009-06-18T13:03:00
+2009-06-14T13:03:00
+2009-06-10T13:03:00
+2009-06-06T13:03:00
+2009-06-02T13:03:00
+2009-05-29T13:03:00
+2009-05-25T13:03:00
+2009-05-21T13:03:00
+2009-05-17T13:03:00
+2009-05-13T13:03:00
+2009-05-09T13:03:00
+2009-05-05T13:03:00
+2009-05-01T13:03:00
+2009-04-27T13:03:00
+2009-04-23T13:03:00
+2009-04-19T13:03:00
+2009-04-15T13:03:00
+2009-04-11T13:03:00
+2009-04-07T13:03:00
+2009-04-03T13:03:00
+2009-03-30T13:03:00
+2009-03-26T13:03:00
+2009-03-22T13:03:00
+2009-03-18T13:03:00
+2009-03-14T13:03:00
+2009-03-10T13:03:00
+2009-03-06T13:03:00
+2009-03-02T13:03:00
+2009-02-26T13:03:00
+2009-02-22T13:03:00
+2009-02-18T13:03:00
+2009-02-14T13:03:00
+2009-02-10T13:03:00
+2009-02-06T13:03:00
+2009-02-02T13:03:00
+2009-01-29T13:03:00
+2009-01-25T13:03:00
+2009-01-21T13:03:00
+2009-01-17T13:03:00
+2009-01-13T13:03:00
+2009-01-09T13:03:00
+2009-01-05T13:03:00
+2009-01-01T13:03:00
+2008-12-28T13:03:00
+2008-12-24T13:03:00
+2008-12-20T13:03:00
+2008-12-16T13:03:00
+2008-12-12T13:03:00
+2008-12-08T13:03:00
+2008-12-04T13:03:00
+2008-11-30T13:03:00
+2008-11-26T13:03:00
+2008-11-22T13:03:00
+2008-11-18T13:03:00
+2008-11-14T13:03:00
+2008-11-10T13:03:00
+2008-11-06T13:03:00
+2008-11-02T13:03:00
+2008-10-29T13:03:00
+2008-10-25T13:03:00
+2008-10-21T13:03:00
+2008-10-17T13:03:00
+2008-10-13T13:03:00
+2008-10-09T13:03:00
+2008-10-05T13:03:00
+2008-10-01T13:03:00
+2008-09-27T13:03:00
+2008-09-23T13:03:00
+2008-09-19T13:03:00
+2008-09-15T13:03:00
+2008-09-11T13:03:00
+2008-09-07T13:03:00
+2008-09-03T13:03:00
+2008-08-30T13:03:00
+2008-08-26T13:03:00
+2008-08-22T13:03:00
+2008-08-18T13:03:00
+2008-08-14T13:03:00
+2008-08-10T13:03:00
+2008-08-06T13:03:00
+2008-08-02T13:03:00
+2008-07-29T13:03:00
+2008-07-25T13:03:00
+2008-07-21T13:03:00
+2008-07-17T13:03:00
+2008-07-13T13:03:00
+2008-07-09T13:03:00
+2008-07-05T13:03:00
+2008-07-01T13:03:00
+2008-06-27T13:03:00
+2008-06-23T13:03:00
+2008-06-19T13:03:00
+2008-06-15T13:03:00
+2008-06-11T13:03:00
+2008-06-07T13:03:00
+2008-06-03T13:03:00
+2008-05-30T13:03:00
+2008-05-26T13:03:00
+2008-05-22T13:03:00
+2008-05-18T13:03:00
+2008-05-14T13:03:00
+2008-05-10T13:03:00
+2008-05-06T13:03:00
+2008-05-02T13:03:00
+2008-04-28T13:03:00
+2008-04-24T13:03:00
+2008-04-20T13:03:00
+2008-04-16T13:03:00
+2008-04-12T13:03:00
+2008-04-08T13:03:00
+2008-04-04T13:03:00
+2008-03-31T13:03:00
+2008-03-27T13:03:00
+2008-03-23T13:03:00
+2008-03-19T13:03:00
+2008-03-15T13:03:00
+2008-03-11T13:03:00
+2008-03-07T13:03:00
+2008-03-03T13:03:00
+2008-02-28T13:03:00
+2008-02-24T13:03:00
+2008-02-20T13:03:00
+2008-02-16T13:03:00
+2008-02-12T13:03:00
+2008-02-08T13:03:00
+2008-02-04T13:03:00
+2008-01-31T13:03:00
+2008-01-27T13:03:00
+2008-01-23T13:03:00
+2008-01-19T13:03:00
+2008-01-15T13:03:00
+2008-01-11T13:03:00
+2008-01-07T13:03:00
+2008-01-03T13:03:00
+2007-12-30T13:03:00
+2007-12-26T13:03:00
+2007-12-22T13:03:00
+2007-12-18T13:03:00
+2007-12-14T13:03:00
+2007-12-10T13:03:00
+2007-12-06T13:03:00
+2007-12-02T13:03:00
+2007-11-28T13:03:00
+2007-11-24T13:03:00
+2007-11-20T13:03:00
+2007-11-16T13:03:00
+2007-11-12T13:03:00
+2007-11-08T13:03:00
+2007-11-04T13:03:00
+2007-10-31T13:03:00
+2007-10-27T13:03:00
+2007-10-23T13:03:00
+2007-10-19T13:03:00
+2007-10-15T13:03:00
+2007-10-11T13:03:00
+2007-10-07T13:03:00
+2007-10-03T13:03:00
+2007-09-29T13:03:00
+2007-09-25T13:03:00
+2007-09-21T13:03:00
+2007-09-17T13:03:00
+2007-09-13T13:03:00
+2007-09-09T13:03:00
+2007-09-05T13:03:00
+2007-09-01T13:03:00
+2007-08-28T13:03:00
+2007-08-24T13:03:00
+2007-08-20T13:03:00
+2007-08-16T13:03:00
+2007-08-12T13:03:00
+2007-08-08T13:03:00
+2007-08-04T13:03:00
+2007-07-31T13:03:00
+2007-07-27T13:03:00
+2007-07-23T13:03:00
+2007-07-19T13:03:00
+2007-07-15T13:03:00
+2007-07-11T13:03:00
+2007-07-07T13:03:00
+2007-07-03T13:03:00
+2007-06-29T13:03:00
+2007-06-25T13:03:00
+2007-06-21T13:03:00
+2007-06-17T13:03:00
+2007-06-13T13:03:00
+2007-06-09T13:03:00
+2007-06-05T13:03:00
+2007-06-01T13:03:00
+2007-05-28T13:03:00
+2007-05-24T13:03:00
+2007-05-20T13:03:00
+2007-05-16T13:03:00
+2007-05-12T13:03:00
+2007-05-08T13:03:00
+2007-05-04T13:03:00
+2007-04-30T13:03:00
+2007-04-26T13:03:00
+2007-04-22T13:03:00
+2007-04-18T13:03:00
+2007-04-14T13:03:00
+2007-04-10T13:03:00
+2007-04-06T13:03:00
+2007-04-02T13:03:00
+2007-03-29T13:03:00
+2007-03-25T13:03:00
+2007-03-21T13:03:00
+2007-03-17T13:03:00
+2007-03-13T13:03:00
+2007-03-09T13:03:00
+2007-03-05T13:03:00
+2007-03-01T13:03:00
+2007-02-25T13:03:00
+2007-02-21T13:03:00
+2007-02-17T13:03:00
+2007-02-13T13:03:00
+2007-02-09T13:03:00
+2007-02-05T13:03:00
+2007-02-01T13:03:00
+2007-01-28T13:03:00
+2007-01-24T13:03:00
+2007-01-20T13:03:00
+2007-01-16T13:03:00
+2007-01-12T13:03:00
+2007-01-08T13:03:00
+2007-01-04T13:03:00
+2006-12-31T13:03:00
+2006-12-27T13:03:00
+2006-12-23T13:03:00
+2006-12-19T13:03:00
+2006-12-15T13:03:00
+2006-12-11T13:03:00
+2006-12-07T13:03:00
+2006-12-03T13:03:00
+2006-11-29T13:03:00
+2006-11-25T13:03:00
+2006-11-21T13:03:00
+2006-11-17T13:03:00
+2006-11-13T13:03:00
+2006-11-09T13:03:00
+2006-11-05T13:03:00
+2006-11-01T13:03:00
+2006-10-28T13:03:00
+2006-10-24T13:03:00
+2006-10-20T13:03:00
+2006-10-16T13:03:00
+2006-10-12T13:03:00
+2006-10-08T13:03:00
+2006-10-04T13:03:00
+2006-09-30T13:03:00
+2006-09-26T13:03:00
+2006-09-22T13:03:00
+2006-09-18T13:03:00
+2006-09-14T13:03:00
+2006-09-10T13:03:00
+2006-09-06T13:03:00
+2006-09-02T13:03:00
+2006-08-29T13:03:00
+2006-08-25T13:03:00
+2006-08-21T13:03:00
+2006-08-17T13:03:00
+2006-08-13T13:03:00
+2006-08-09T13:03:00
+2006-08-05T13:03:00
+2006-08-01T13:03:00
+2006-07-28T13:03:00
+2006-07-24T13:03:00
+2006-07-20T13:03:00
+2006-07-16T13:03:00
+2006-07-12T13:03:00
+2006-07-08T13:03:00
+2006-07-04T13:03:00
+2006-06-30T13:03:00
+2006-06-26T13:03:00
+2006-06-22T13:03:00
+2006-06-18T13:03:00
+2006-06-14T13:03:00
+2006-06-10T13:03:00
+2006-06-06T13:03:00
+2006-06-02T13:03:00
+2006-05-29T13:03:00
+2006-05-25T13:03:00
+2006-05-21T13:03:00
+2006-05-17T13:03:00
+2006-05-13T13:03:00
+2006-05-09T13:03:00
+2006-05-05T13:03:00
+2006-05-01T13:03:00
+2006-04-27T13:03:00
+2006-04-23T13:03:00
+2006-04-19T13:03:00
+2006-04-15T13:03:00
+2006-04-11T13:03:00
+2006-04-07T13:03:00
+2006-04-03T13:03:00
+2006-03-30T13:03:00
+2006-03-26T13:03:00
+2006-03-22T13:03:00
+2006-03-18T13:03:00
+2006-03-14T13:03:00
+2006-03-10T13:03:00
+2006-03-06T13:03:00
+2006-03-02T13:03:00
+2006-02-26T13:03:00
+2006-02-22T13:03:00
+2006-02-18T13:03:00
+2006-02-14T13:03:00
+2006-02-10T13:03:00
+2006-02-06T13:03:00
+2006-02-02T13:03:00
+2006-01-29T13:03:00
+2006-01-25T13:03:00
+2006-01-21T13:03:00
+2006-01-17T13:03:00
+2006-01-13T13:03:00
+2006-01-09T13:03:00
+2006-01-05T13:03:00
+2006-01-01T13:03:00
+2005-12-28T13:03:00
+2005-12-24T13:03:00
+2005-12-20T13:03:00
+2005-12-16T13:03:00
+2005-12-12T13:03:00
+2005-12-08T13:03:00
+2005-12-04T13:03:00
+2005-11-30T13:03:00
+2005-11-26T13:03:00
+2005-11-22T13:03:00
+2005-11-18T13:03:00
+2005-11-14T13:03:00
+2005-11-10T13:03:00
+2005-11-06T13:03:00
+2005-11-02T13:03:00
+2005-10-29T13:03:00
+2005-10-25T13:03:00
+2005-10-21T13:03:00
+2005-10-17T13:03:00
+2005-10-13T13:03:00
+2005-10-09T13:03:00
+2005-10-05T13:03:00
+2005-10-01T13:03:00
+2005-09-27T13:03:00
+2005-09-23T13:03:00
+2005-09-19T13:03:00
+2005-09-15T13:03:00
+2005-09-11T13:03:00
+2005-09-07T13:03:00
+2005-09-03T13:03:00
+2005-08-30T13:03:00
+2005-08-26T13:03:00
+2005-08-22T13:03:00
+2005-08-18T13:03:00
+2005-08-14T13:03:00
+2005-08-10T13:03:00
+2005-08-06T13:03:00
+2005-08-02T13:03:00
+2005-07-29T13:03:00
+2005-07-25T13:03:00
+2005-07-21T13:03:00
+2005-07-17T13:03:00
+2005-07-13T13:03:00
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase01.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase01.ics.recurson.ref
new file mode 100644
index 00000000..144db345
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase01.ics.recurson.ref
@@ -0,0 +1,512 @@
+2005-05-26
+2005-05-30
+2005-06-03
+2005-06-07
+2005-06-11
+2005-06-15
+2005-06-19
+2005-06-23
+2005-06-27
+2005-07-01
+2005-07-05
+2005-07-09
+2005-07-13
+2005-07-17
+2005-07-21
+2005-07-25
+2005-07-29
+2005-08-02
+2005-08-06
+2005-08-10
+2005-08-14
+2005-08-18
+2005-08-22
+2005-08-26
+2005-08-30
+2005-09-03
+2005-09-07
+2005-09-11
+2005-09-15
+2005-09-19
+2005-09-23
+2005-09-27
+2005-10-01
+2005-10-05
+2005-10-09
+2005-10-13
+2005-10-17
+2005-10-21
+2005-10-25
+2005-10-29
+2005-11-02
+2005-11-06
+2005-11-10
+2005-11-14
+2005-11-18
+2005-11-22
+2005-11-26
+2005-11-30
+2005-12-04
+2005-12-08
+2005-12-12
+2005-12-16
+2005-12-20
+2005-12-24
+2005-12-28
+2006-01-01
+2006-01-05
+2006-01-09
+2006-01-13
+2006-01-17
+2006-01-21
+2006-01-25
+2006-01-29
+2006-02-02
+2006-02-06
+2006-02-10
+2006-02-14
+2006-02-18
+2006-02-22
+2006-02-26
+2006-03-02
+2006-03-06
+2006-03-10
+2006-03-14
+2006-03-18
+2006-03-22
+2006-03-26
+2006-03-30
+2006-04-03
+2006-04-07
+2006-04-11
+2006-04-15
+2006-04-19
+2006-04-23
+2006-04-27
+2006-05-01
+2006-05-05
+2006-05-09
+2006-05-13
+2006-05-17
+2006-05-21
+2006-05-25
+2006-05-29
+2006-06-02
+2006-06-06
+2006-06-10
+2006-06-14
+2006-06-18
+2006-06-22
+2006-06-26
+2006-06-30
+2006-07-04
+2006-07-08
+2006-07-12
+2006-07-16
+2006-07-20
+2006-07-24
+2006-07-28
+2006-08-01
+2006-08-05
+2006-08-09
+2006-08-13
+2006-08-17
+2006-08-21
+2006-08-25
+2006-08-29
+2006-09-02
+2006-09-06
+2006-09-10
+2006-09-14
+2006-09-18
+2006-09-22
+2006-09-26
+2006-09-30
+2006-10-04
+2006-10-08
+2006-10-12
+2006-10-16
+2006-10-20
+2006-10-24
+2006-10-28
+2006-11-01
+2006-11-05
+2006-11-09
+2006-11-13
+2006-11-17
+2006-11-21
+2006-11-25
+2006-11-29
+2006-12-03
+2006-12-07
+2006-12-11
+2006-12-15
+2006-12-19
+2006-12-23
+2006-12-27
+2006-12-31
+2007-01-04
+2007-01-08
+2007-01-12
+2007-01-16
+2007-01-20
+2007-01-24
+2007-01-28
+2007-02-01
+2007-02-05
+2007-02-09
+2007-02-13
+2007-02-17
+2007-02-21
+2007-02-25
+2007-03-01
+2007-03-05
+2007-03-09
+2007-03-13
+2007-03-17
+2007-03-21
+2007-03-25
+2007-03-29
+2007-04-02
+2007-04-06
+2007-04-10
+2007-04-14
+2007-04-18
+2007-04-22
+2007-04-26
+2007-04-30
+2007-05-04
+2007-05-08
+2007-05-12
+2007-05-16
+2007-05-20
+2007-05-24
+2007-05-28
+2007-06-01
+2007-06-05
+2007-06-09
+2007-06-13
+2007-06-17
+2007-06-21
+2007-06-25
+2007-06-29
+2007-07-03
+2007-07-07
+2007-07-11
+2007-07-15
+2007-07-19
+2007-07-23
+2007-07-27
+2007-07-31
+2007-08-04
+2007-08-08
+2007-08-12
+2007-08-16
+2007-08-20
+2007-08-24
+2007-08-28
+2007-09-01
+2007-09-05
+2007-09-09
+2007-09-13
+2007-09-17
+2007-09-21
+2007-09-25
+2007-09-29
+2007-10-03
+2007-10-07
+2007-10-11
+2007-10-15
+2007-10-19
+2007-10-23
+2007-10-27
+2007-10-31
+2007-11-04
+2007-11-08
+2007-11-12
+2007-11-16
+2007-11-20
+2007-11-24
+2007-11-28
+2007-12-02
+2007-12-06
+2007-12-10
+2007-12-14
+2007-12-18
+2007-12-22
+2007-12-26
+2007-12-30
+2008-01-03
+2008-01-07
+2008-01-11
+2008-01-15
+2008-01-19
+2008-01-23
+2008-01-27
+2008-01-31
+2008-02-04
+2008-02-08
+2008-02-12
+2008-02-16
+2008-02-20
+2008-02-24
+2008-02-28
+2008-03-03
+2008-03-07
+2008-03-11
+2008-03-15
+2008-03-19
+2008-03-23
+2008-03-27
+2008-03-31
+2008-04-04
+2008-04-08
+2008-04-12
+2008-04-16
+2008-04-20
+2008-04-24
+2008-04-28
+2008-05-02
+2008-05-06
+2008-05-10
+2008-05-14
+2008-05-18
+2008-05-22
+2008-05-26
+2008-05-30
+2008-06-03
+2008-06-07
+2008-06-11
+2008-06-15
+2008-06-19
+2008-06-23
+2008-06-27
+2008-07-01
+2008-07-05
+2008-07-09
+2008-07-13
+2008-07-17
+2008-07-21
+2008-07-25
+2008-07-29
+2008-08-02
+2008-08-06
+2008-08-10
+2008-08-14
+2008-08-18
+2008-08-22
+2008-08-26
+2008-08-30
+2008-09-03
+2008-09-07
+2008-09-11
+2008-09-15
+2008-09-19
+2008-09-23
+2008-09-27
+2008-10-01
+2008-10-05
+2008-10-09
+2008-10-13
+2008-10-17
+2008-10-21
+2008-10-25
+2008-10-29
+2008-11-02
+2008-11-06
+2008-11-10
+2008-11-14
+2008-11-18
+2008-11-22
+2008-11-26
+2008-11-30
+2008-12-04
+2008-12-08
+2008-12-12
+2008-12-16
+2008-12-20
+2008-12-24
+2008-12-28
+2009-01-01
+2009-01-05
+2009-01-09
+2009-01-13
+2009-01-17
+2009-01-21
+2009-01-25
+2009-01-29
+2009-02-02
+2009-02-06
+2009-02-10
+2009-02-14
+2009-02-18
+2009-02-22
+2009-02-26
+2009-03-02
+2009-03-06
+2009-03-10
+2009-03-14
+2009-03-18
+2009-03-22
+2009-03-26
+2009-03-30
+2009-04-03
+2009-04-07
+2009-04-11
+2009-04-15
+2009-04-19
+2009-04-23
+2009-04-27
+2009-05-01
+2009-05-05
+2009-05-09
+2009-05-13
+2009-05-17
+2009-05-21
+2009-05-25
+2009-05-29
+2009-06-02
+2009-06-06
+2009-06-10
+2009-06-14
+2009-06-18
+2009-06-22
+2009-06-26
+2009-06-30
+2009-07-04
+2009-07-08
+2009-07-12
+2009-07-16
+2009-07-20
+2009-07-24
+2009-07-28
+2009-08-01
+2009-08-05
+2009-08-09
+2009-08-13
+2009-08-17
+2009-08-21
+2009-08-25
+2009-08-29
+2009-09-02
+2009-09-06
+2009-09-10
+2009-09-14
+2009-09-18
+2009-09-22
+2009-09-26
+2009-09-30
+2009-10-04
+2009-10-08
+2009-10-12
+2009-10-16
+2009-10-20
+2009-10-24
+2009-10-28
+2009-11-01
+2009-11-05
+2009-11-09
+2009-11-13
+2009-11-17
+2009-11-21
+2009-11-25
+2009-11-29
+2009-12-03
+2009-12-07
+2009-12-11
+2009-12-15
+2009-12-19
+2009-12-23
+2009-12-27
+2009-12-31
+2010-01-04
+2010-01-08
+2010-01-12
+2010-01-16
+2010-01-20
+2010-01-24
+2010-01-28
+2010-02-01
+2010-02-05
+2010-02-09
+2010-02-13
+2010-02-17
+2010-02-21
+2010-02-25
+2010-03-01
+2010-03-05
+2010-03-09
+2010-03-13
+2010-03-17
+2010-03-21
+2010-03-25
+2010-03-29
+2010-04-02
+2010-04-06
+2010-04-10
+2010-04-14
+2010-04-18
+2010-04-22
+2010-04-26
+2010-04-30
+2010-05-04
+2010-05-08
+2010-05-12
+2010-05-16
+2010-05-20
+2010-05-24
+2010-05-28
+2010-06-01
+2010-06-05
+2010-06-09
+2010-06-13
+2010-06-17
+2010-06-21
+2010-06-25
+2010-06-29
+2010-07-03
+2010-07-07
+2010-07-11
+2010-07-15
+2010-07-19
+2010-07-23
+2010-07-27
+2010-07-31
+2010-08-04
+2010-08-08
+2010-08-12
+2010-08-16
+2010-08-20
+2010-08-24
+2010-08-28
+2010-09-01
+2010-09-05
+2010-09-09
+2010-09-13
+2010-09-17
+2010-09-21
+2010-09-25
+2010-09-29
+2010-10-03
+2010-10-07
+2010-10-11
+2010-10-15
+2010-10-19
+2010-10-23
+2010-10-27
+2010-10-31
+2010-11-04
+2010-11-08
+2010-11-12
+2010-11-16
+2010-11-20
+2010-11-24
+2010-11-28
+2010-12-02
+2010-12-06
+2010-12-10
+2010-12-14
+2010-12-18
+2010-12-22
+2010-12-26
+2010-12-30
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase02.ics b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase02.ics
new file mode 100644
index 00000000..84ff2b68
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase02.ics
@@ -0,0 +1,23 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KAlarm 1.2.6//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20050522T130601
+CREATED:20050522T130341
+UID:KAlarm-758521161.1036
+SEQUENCE:0
+LAST-MODIFIED:20050522T130341
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=WEEKLY;INTERVAL=3;BYDAY=TU,SA,SU
+DTSTART:20050522T130400
+TRANSP:OPAQUE
+BEGIN:VALARM
+DESCRIPTION:Every 3 weeks on Tu\, Sa and Su
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:PT0S
+X-KDE-KALARM-FONTCOLOR:#ff0000\;#000000\;
+END:VALARM
+
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase02.ics.next.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase02.ics.next.ref
new file mode 100644
index 00000000..2bac06aa
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase02.ics.next.ref
@@ -0,0 +1,500 @@
+2005-05-22T13:04:00
+2005-06-07T13:04:00
+2005-06-11T13:04:00
+2005-06-12T13:04:00
+2005-06-28T13:04:00
+2005-07-02T13:04:00
+2005-07-03T13:04:00
+2005-07-19T13:04:00
+2005-07-23T13:04:00
+2005-07-24T13:04:00
+2005-08-09T13:04:00
+2005-08-13T13:04:00
+2005-08-14T13:04:00
+2005-08-30T13:04:00
+2005-09-03T13:04:00
+2005-09-04T13:04:00
+2005-09-20T13:04:00
+2005-09-24T13:04:00
+2005-09-25T13:04:00
+2005-10-11T13:04:00
+2005-10-15T13:04:00
+2005-10-16T13:04:00
+2005-11-01T13:04:00
+2005-11-05T13:04:00
+2005-11-06T13:04:00
+2005-11-22T13:04:00
+2005-11-26T13:04:00
+2005-11-27T13:04:00
+2005-12-13T13:04:00
+2005-12-17T13:04:00
+2005-12-18T13:04:00
+2006-01-03T13:04:00
+2006-01-07T13:04:00
+2006-01-08T13:04:00
+2006-01-24T13:04:00
+2006-01-28T13:04:00
+2006-01-29T13:04:00
+2006-02-14T13:04:00
+2006-02-18T13:04:00
+2006-02-19T13:04:00
+2006-03-07T13:04:00
+2006-03-11T13:04:00
+2006-03-12T13:04:00
+2006-03-28T13:04:00
+2006-04-01T13:04:00
+2006-04-02T13:04:00
+2006-04-18T13:04:00
+2006-04-22T13:04:00
+2006-04-23T13:04:00
+2006-05-09T13:04:00
+2006-05-13T13:04:00
+2006-05-14T13:04:00
+2006-05-30T13:04:00
+2006-06-03T13:04:00
+2006-06-04T13:04:00
+2006-06-20T13:04:00
+2006-06-24T13:04:00
+2006-06-25T13:04:00
+2006-07-11T13:04:00
+2006-07-15T13:04:00
+2006-07-16T13:04:00
+2006-08-01T13:04:00
+2006-08-05T13:04:00
+2006-08-06T13:04:00
+2006-08-22T13:04:00
+2006-08-26T13:04:00
+2006-08-27T13:04:00
+2006-09-12T13:04:00
+2006-09-16T13:04:00
+2006-09-17T13:04:00
+2006-10-03T13:04:00
+2006-10-07T13:04:00
+2006-10-08T13:04:00
+2006-10-24T13:04:00
+2006-10-28T13:04:00
+2006-10-29T13:04:00
+2006-11-14T13:04:00
+2006-11-18T13:04:00
+2006-11-19T13:04:00
+2006-12-05T13:04:00
+2006-12-09T13:04:00
+2006-12-10T13:04:00
+2006-12-26T13:04:00
+2006-12-30T13:04:00
+2006-12-31T13:04:00
+2007-01-16T13:04:00
+2007-01-20T13:04:00
+2007-01-21T13:04:00
+2007-02-06T13:04:00
+2007-02-10T13:04:00
+2007-02-11T13:04:00
+2007-02-27T13:04:00
+2007-03-03T13:04:00
+2007-03-04T13:04:00
+2007-03-20T13:04:00
+2007-03-24T13:04:00
+2007-03-25T13:04:00
+2007-04-10T13:04:00
+2007-04-14T13:04:00
+2007-04-15T13:04:00
+2007-05-01T13:04:00
+2007-05-05T13:04:00
+2007-05-06T13:04:00
+2007-05-22T13:04:00
+2007-05-26T13:04:00
+2007-05-27T13:04:00
+2007-06-12T13:04:00
+2007-06-16T13:04:00
+2007-06-17T13:04:00
+2007-07-03T13:04:00
+2007-07-07T13:04:00
+2007-07-08T13:04:00
+2007-07-24T13:04:00
+2007-07-28T13:04:00
+2007-07-29T13:04:00
+2007-08-14T13:04:00
+2007-08-18T13:04:00
+2007-08-19T13:04:00
+2007-09-04T13:04:00
+2007-09-08T13:04:00
+2007-09-09T13:04:00
+2007-09-25T13:04:00
+2007-09-29T13:04:00
+2007-09-30T13:04:00
+2007-10-16T13:04:00
+2007-10-20T13:04:00
+2007-10-21T13:04:00
+2007-11-06T13:04:00
+2007-11-10T13:04:00
+2007-11-11T13:04:00
+2007-11-27T13:04:00
+2007-12-01T13:04:00
+2007-12-02T13:04:00
+2007-12-18T13:04:00
+2007-12-22T13:04:00
+2007-12-23T13:04:00
+2008-01-08T13:04:00
+2008-01-12T13:04:00
+2008-01-13T13:04:00
+2008-01-29T13:04:00
+2008-02-02T13:04:00
+2008-02-03T13:04:00
+2008-02-19T13:04:00
+2008-02-23T13:04:00
+2008-02-24T13:04:00
+2008-03-11T13:04:00
+2008-03-15T13:04:00
+2008-03-16T13:04:00
+2008-04-01T13:04:00
+2008-04-05T13:04:00
+2008-04-06T13:04:00
+2008-04-22T13:04:00
+2008-04-26T13:04:00
+2008-04-27T13:04:00
+2008-05-13T13:04:00
+2008-05-17T13:04:00
+2008-05-18T13:04:00
+2008-06-03T13:04:00
+2008-06-07T13:04:00
+2008-06-08T13:04:00
+2008-06-24T13:04:00
+2008-06-28T13:04:00
+2008-06-29T13:04:00
+2008-07-15T13:04:00
+2008-07-19T13:04:00
+2008-07-20T13:04:00
+2008-08-05T13:04:00
+2008-08-09T13:04:00
+2008-08-10T13:04:00
+2008-08-26T13:04:00
+2008-08-30T13:04:00
+2008-08-31T13:04:00
+2008-09-16T13:04:00
+2008-09-20T13:04:00
+2008-09-21T13:04:00
+2008-10-07T13:04:00
+2008-10-11T13:04:00
+2008-10-12T13:04:00
+2008-10-28T13:04:00
+2008-11-01T13:04:00
+2008-11-02T13:04:00
+2008-11-18T13:04:00
+2008-11-22T13:04:00
+2008-11-23T13:04:00
+2008-12-09T13:04:00
+2008-12-13T13:04:00
+2008-12-14T13:04:00
+2008-12-30T13:04:00
+2009-01-03T13:04:00
+2009-01-04T13:04:00
+2009-01-20T13:04:00
+2009-01-24T13:04:00
+2009-01-25T13:04:00
+2009-02-10T13:04:00
+2009-02-14T13:04:00
+2009-02-15T13:04:00
+2009-03-03T13:04:00
+2009-03-07T13:04:00
+2009-03-08T13:04:00
+2009-03-24T13:04:00
+2009-03-28T13:04:00
+2009-03-29T13:04:00
+2009-04-14T13:04:00
+2009-04-18T13:04:00
+2009-04-19T13:04:00
+2009-05-05T13:04:00
+2009-05-09T13:04:00
+2009-05-10T13:04:00
+2009-05-26T13:04:00
+2009-05-30T13:04:00
+2009-05-31T13:04:00
+2009-06-16T13:04:00
+2009-06-20T13:04:00
+2009-06-21T13:04:00
+2009-07-07T13:04:00
+2009-07-11T13:04:00
+2009-07-12T13:04:00
+2009-07-28T13:04:00
+2009-08-01T13:04:00
+2009-08-02T13:04:00
+2009-08-18T13:04:00
+2009-08-22T13:04:00
+2009-08-23T13:04:00
+2009-09-08T13:04:00
+2009-09-12T13:04:00
+2009-09-13T13:04:00
+2009-09-29T13:04:00
+2009-10-03T13:04:00
+2009-10-04T13:04:00
+2009-10-20T13:04:00
+2009-10-24T13:04:00
+2009-10-25T13:04:00
+2009-11-10T13:04:00
+2009-11-14T13:04:00
+2009-11-15T13:04:00
+2009-12-01T13:04:00
+2009-12-05T13:04:00
+2009-12-06T13:04:00
+2009-12-22T13:04:00
+2009-12-26T13:04:00
+2009-12-27T13:04:00
+2010-01-12T13:04:00
+2010-01-16T13:04:00
+2010-01-17T13:04:00
+2010-02-02T13:04:00
+2010-02-06T13:04:00
+2010-02-07T13:04:00
+2010-02-23T13:04:00
+2010-02-27T13:04:00
+2010-02-28T13:04:00
+2010-03-16T13:04:00
+2010-03-20T13:04:00
+2010-03-21T13:04:00
+2010-04-06T13:04:00
+2010-04-10T13:04:00
+2010-04-11T13:04:00
+2010-04-27T13:04:00
+2010-05-01T13:04:00
+2010-05-02T13:04:00
+2010-05-18T13:04:00
+2010-05-22T13:04:00
+2010-05-23T13:04:00
+2010-06-08T13:04:00
+2010-06-12T13:04:00
+2010-06-13T13:04:00
+2010-06-29T13:04:00
+2010-07-03T13:04:00
+2010-07-04T13:04:00
+2010-07-20T13:04:00
+2010-07-24T13:04:00
+2010-07-25T13:04:00
+2010-08-10T13:04:00
+2010-08-14T13:04:00
+2010-08-15T13:04:00
+2010-08-31T13:04:00
+2010-09-04T13:04:00
+2010-09-05T13:04:00
+2010-09-21T13:04:00
+2010-09-25T13:04:00
+2010-09-26T13:04:00
+2010-10-12T13:04:00
+2010-10-16T13:04:00
+2010-10-17T13:04:00
+2010-11-02T13:04:00
+2010-11-06T13:04:00
+2010-11-07T13:04:00
+2010-11-23T13:04:00
+2010-11-27T13:04:00
+2010-11-28T13:04:00
+2010-12-14T13:04:00
+2010-12-18T13:04:00
+2010-12-19T13:04:00
+2011-01-04T13:04:00
+2011-01-08T13:04:00
+2011-01-09T13:04:00
+2011-01-25T13:04:00
+2011-01-29T13:04:00
+2011-01-30T13:04:00
+2011-02-15T13:04:00
+2011-02-19T13:04:00
+2011-02-20T13:04:00
+2011-03-08T13:04:00
+2011-03-12T13:04:00
+2011-03-13T13:04:00
+2011-03-29T13:04:00
+2011-04-02T13:04:00
+2011-04-03T13:04:00
+2011-04-19T13:04:00
+2011-04-23T13:04:00
+2011-04-24T13:04:00
+2011-05-10T13:04:00
+2011-05-14T13:04:00
+2011-05-15T13:04:00
+2011-05-31T13:04:00
+2011-06-04T13:04:00
+2011-06-05T13:04:00
+2011-06-21T13:04:00
+2011-06-25T13:04:00
+2011-06-26T13:04:00
+2011-07-12T13:04:00
+2011-07-16T13:04:00
+2011-07-17T13:04:00
+2011-08-02T13:04:00
+2011-08-06T13:04:00
+2011-08-07T13:04:00
+2011-08-23T13:04:00
+2011-08-27T13:04:00
+2011-08-28T13:04:00
+2011-09-13T13:04:00
+2011-09-17T13:04:00
+2011-09-18T13:04:00
+2011-10-04T13:04:00
+2011-10-08T13:04:00
+2011-10-09T13:04:00
+2011-10-25T13:04:00
+2011-10-29T13:04:00
+2011-10-30T13:04:00
+2011-11-15T13:04:00
+2011-11-19T13:04:00
+2011-11-20T13:04:00
+2011-12-06T13:04:00
+2011-12-10T13:04:00
+2011-12-11T13:04:00
+2011-12-27T13:04:00
+2011-12-31T13:04:00
+2012-01-01T13:04:00
+2012-01-17T13:04:00
+2012-01-21T13:04:00
+2012-01-22T13:04:00
+2012-02-07T13:04:00
+2012-02-11T13:04:00
+2012-02-12T13:04:00
+2012-02-28T13:04:00
+2012-03-03T13:04:00
+2012-03-04T13:04:00
+2012-03-20T13:04:00
+2012-03-24T13:04:00
+2012-03-25T13:04:00
+2012-04-10T13:04:00
+2012-04-14T13:04:00
+2012-04-15T13:04:00
+2012-05-01T13:04:00
+2012-05-05T13:04:00
+2012-05-06T13:04:00
+2012-05-22T13:04:00
+2012-05-26T13:04:00
+2012-05-27T13:04:00
+2012-06-12T13:04:00
+2012-06-16T13:04:00
+2012-06-17T13:04:00
+2012-07-03T13:04:00
+2012-07-07T13:04:00
+2012-07-08T13:04:00
+2012-07-24T13:04:00
+2012-07-28T13:04:00
+2012-07-29T13:04:00
+2012-08-14T13:04:00
+2012-08-18T13:04:00
+2012-08-19T13:04:00
+2012-09-04T13:04:00
+2012-09-08T13:04:00
+2012-09-09T13:04:00
+2012-09-25T13:04:00
+2012-09-29T13:04:00
+2012-09-30T13:04:00
+2012-10-16T13:04:00
+2012-10-20T13:04:00
+2012-10-21T13:04:00
+2012-11-06T13:04:00
+2012-11-10T13:04:00
+2012-11-11T13:04:00
+2012-11-27T13:04:00
+2012-12-01T13:04:00
+2012-12-02T13:04:00
+2012-12-18T13:04:00
+2012-12-22T13:04:00
+2012-12-23T13:04:00
+2013-01-08T13:04:00
+2013-01-12T13:04:00
+2013-01-13T13:04:00
+2013-01-29T13:04:00
+2013-02-02T13:04:00
+2013-02-03T13:04:00
+2013-02-19T13:04:00
+2013-02-23T13:04:00
+2013-02-24T13:04:00
+2013-03-12T13:04:00
+2013-03-16T13:04:00
+2013-03-17T13:04:00
+2013-04-02T13:04:00
+2013-04-06T13:04:00
+2013-04-07T13:04:00
+2013-04-23T13:04:00
+2013-04-27T13:04:00
+2013-04-28T13:04:00
+2013-05-14T13:04:00
+2013-05-18T13:04:00
+2013-05-19T13:04:00
+2013-06-04T13:04:00
+2013-06-08T13:04:00
+2013-06-09T13:04:00
+2013-06-25T13:04:00
+2013-06-29T13:04:00
+2013-06-30T13:04:00
+2013-07-16T13:04:00
+2013-07-20T13:04:00
+2013-07-21T13:04:00
+2013-08-06T13:04:00
+2013-08-10T13:04:00
+2013-08-11T13:04:00
+2013-08-27T13:04:00
+2013-08-31T13:04:00
+2013-09-01T13:04:00
+2013-09-17T13:04:00
+2013-09-21T13:04:00
+2013-09-22T13:04:00
+2013-10-08T13:04:00
+2013-10-12T13:04:00
+2013-10-13T13:04:00
+2013-10-29T13:04:00
+2013-11-02T13:04:00
+2013-11-03T13:04:00
+2013-11-19T13:04:00
+2013-11-23T13:04:00
+2013-11-24T13:04:00
+2013-12-10T13:04:00
+2013-12-14T13:04:00
+2013-12-15T13:04:00
+2013-12-31T13:04:00
+2014-01-04T13:04:00
+2014-01-05T13:04:00
+2014-01-21T13:04:00
+2014-01-25T13:04:00
+2014-01-26T13:04:00
+2014-02-11T13:04:00
+2014-02-15T13:04:00
+2014-02-16T13:04:00
+2014-03-04T13:04:00
+2014-03-08T13:04:00
+2014-03-09T13:04:00
+2014-03-25T13:04:00
+2014-03-29T13:04:00
+2014-03-30T13:04:00
+2014-04-15T13:04:00
+2014-04-19T13:04:00
+2014-04-20T13:04:00
+2014-05-06T13:04:00
+2014-05-10T13:04:00
+2014-05-11T13:04:00
+2014-05-27T13:04:00
+2014-05-31T13:04:00
+2014-06-01T13:04:00
+2014-06-17T13:04:00
+2014-06-21T13:04:00
+2014-06-22T13:04:00
+2014-07-08T13:04:00
+2014-07-12T13:04:00
+2014-07-13T13:04:00
+2014-07-29T13:04:00
+2014-08-02T13:04:00
+2014-08-03T13:04:00
+2014-08-19T13:04:00
+2014-08-23T13:04:00
+2014-08-24T13:04:00
+2014-09-09T13:04:00
+2014-09-13T13:04:00
+2014-09-14T13:04:00
+2014-09-30T13:04:00
+2014-10-04T13:04:00
+2014-10-05T13:04:00
+2014-10-21T13:04:00
+2014-10-25T13:04:00
+2014-10-26T13:04:00
+2014-11-11T13:04:00
+2014-11-15T13:04:00
+2014-11-16T13:04:00
+2014-12-02T13:04:00
+2014-12-06T13:04:00
+2014-12-07T13:04:00
+2014-12-23T13:04:00
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase02.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase02.ics.prev.ref
new file mode 100644
index 00000000..5521c21d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase02.ics.prev.ref
@@ -0,0 +1,293 @@
+2010-12-19T13:04:00
+2010-12-18T13:04:00
+2010-12-14T13:04:00
+2010-11-28T13:04:00
+2010-11-27T13:04:00
+2010-11-23T13:04:00
+2010-11-07T13:04:00
+2010-11-06T13:04:00
+2010-11-02T13:04:00
+2010-10-17T13:04:00
+2010-10-16T13:04:00
+2010-10-12T13:04:00
+2010-09-26T13:04:00
+2010-09-25T13:04:00
+2010-09-21T13:04:00
+2010-09-05T13:04:00
+2010-09-04T13:04:00
+2010-08-31T13:04:00
+2010-08-15T13:04:00
+2010-08-14T13:04:00
+2010-08-10T13:04:00
+2010-07-25T13:04:00
+2010-07-24T13:04:00
+2010-07-20T13:04:00
+2010-07-04T13:04:00
+2010-07-03T13:04:00
+2010-06-29T13:04:00
+2010-06-13T13:04:00
+2010-06-12T13:04:00
+2010-06-08T13:04:00
+2010-05-23T13:04:00
+2010-05-22T13:04:00
+2010-05-18T13:04:00
+2010-05-02T13:04:00
+2010-05-01T13:04:00
+2010-04-27T13:04:00
+2010-04-11T13:04:00
+2010-04-10T13:04:00
+2010-04-06T13:04:00
+2010-03-21T13:04:00
+2010-03-20T13:04:00
+2010-03-16T13:04:00
+2010-02-28T13:04:00
+2010-02-27T13:04:00
+2010-02-23T13:04:00
+2010-02-07T13:04:00
+2010-02-06T13:04:00
+2010-02-02T13:04:00
+2010-01-17T13:04:00
+2010-01-16T13:04:00
+2010-01-12T13:04:00
+2009-12-27T13:04:00
+2009-12-26T13:04:00
+2009-12-22T13:04:00
+2009-12-06T13:04:00
+2009-12-05T13:04:00
+2009-12-01T13:04:00
+2009-11-15T13:04:00
+2009-11-14T13:04:00
+2009-11-10T13:04:00
+2009-10-25T13:04:00
+2009-10-24T13:04:00
+2009-10-20T13:04:00
+2009-10-04T13:04:00
+2009-10-03T13:04:00
+2009-09-29T13:04:00
+2009-09-13T13:04:00
+2009-09-12T13:04:00
+2009-09-08T13:04:00
+2009-08-23T13:04:00
+2009-08-22T13:04:00
+2009-08-18T13:04:00
+2009-08-02T13:04:00
+2009-08-01T13:04:00
+2009-07-28T13:04:00
+2009-07-12T13:04:00
+2009-07-11T13:04:00
+2009-07-07T13:04:00
+2009-06-21T13:04:00
+2009-06-20T13:04:00
+2009-06-16T13:04:00
+2009-05-31T13:04:00
+2009-05-30T13:04:00
+2009-05-26T13:04:00
+2009-05-10T13:04:00
+2009-05-09T13:04:00
+2009-05-05T13:04:00
+2009-04-19T13:04:00
+2009-04-18T13:04:00
+2009-04-14T13:04:00
+2009-03-29T13:04:00
+2009-03-28T13:04:00
+2009-03-24T13:04:00
+2009-03-08T13:04:00
+2009-03-07T13:04:00
+2009-03-03T13:04:00
+2009-02-15T13:04:00
+2009-02-14T13:04:00
+2009-02-10T13:04:00
+2009-01-25T13:04:00
+2009-01-24T13:04:00
+2009-01-20T13:04:00
+2009-01-04T13:04:00
+2009-01-03T13:04:00
+2008-12-30T13:04:00
+2008-12-14T13:04:00
+2008-12-13T13:04:00
+2008-12-09T13:04:00
+2008-11-23T13:04:00
+2008-11-22T13:04:00
+2008-11-18T13:04:00
+2008-11-02T13:04:00
+2008-11-01T13:04:00
+2008-10-28T13:04:00
+2008-10-12T13:04:00
+2008-10-11T13:04:00
+2008-10-07T13:04:00
+2008-09-21T13:04:00
+2008-09-20T13:04:00
+2008-09-16T13:04:00
+2008-08-31T13:04:00
+2008-08-30T13:04:00
+2008-08-26T13:04:00
+2008-08-10T13:04:00
+2008-08-09T13:04:00
+2008-08-05T13:04:00
+2008-07-20T13:04:00
+2008-07-19T13:04:00
+2008-07-15T13:04:00
+2008-06-29T13:04:00
+2008-06-28T13:04:00
+2008-06-24T13:04:00
+2008-06-08T13:04:00
+2008-06-07T13:04:00
+2008-06-03T13:04:00
+2008-05-18T13:04:00
+2008-05-17T13:04:00
+2008-05-13T13:04:00
+2008-04-27T13:04:00
+2008-04-26T13:04:00
+2008-04-22T13:04:00
+2008-04-06T13:04:00
+2008-04-05T13:04:00
+2008-04-01T13:04:00
+2008-03-16T13:04:00
+2008-03-15T13:04:00
+2008-03-11T13:04:00
+2008-02-24T13:04:00
+2008-02-23T13:04:00
+2008-02-19T13:04:00
+2008-02-03T13:04:00
+2008-02-02T13:04:00
+2008-01-29T13:04:00
+2008-01-13T13:04:00
+2008-01-12T13:04:00
+2008-01-08T13:04:00
+2007-12-23T13:04:00
+2007-12-22T13:04:00
+2007-12-18T13:04:00
+2007-12-02T13:04:00
+2007-12-01T13:04:00
+2007-11-27T13:04:00
+2007-11-11T13:04:00
+2007-11-10T13:04:00
+2007-11-06T13:04:00
+2007-10-21T13:04:00
+2007-10-20T13:04:00
+2007-10-16T13:04:00
+2007-09-30T13:04:00
+2007-09-29T13:04:00
+2007-09-25T13:04:00
+2007-09-09T13:04:00
+2007-09-08T13:04:00
+2007-09-04T13:04:00
+2007-08-19T13:04:00
+2007-08-18T13:04:00
+2007-08-14T13:04:00
+2007-07-29T13:04:00
+2007-07-28T13:04:00
+2007-07-24T13:04:00
+2007-07-08T13:04:00
+2007-07-07T13:04:00
+2007-07-03T13:04:00
+2007-06-17T13:04:00
+2007-06-16T13:04:00
+2007-06-12T13:04:00
+2007-05-27T13:04:00
+2007-05-26T13:04:00
+2007-05-22T13:04:00
+2007-05-06T13:04:00
+2007-05-05T13:04:00
+2007-05-01T13:04:00
+2007-04-15T13:04:00
+2007-04-14T13:04:00
+2007-04-10T13:04:00
+2007-03-25T13:04:00
+2007-03-24T13:04:00
+2007-03-20T13:04:00
+2007-03-04T13:04:00
+2007-03-03T13:04:00
+2007-02-27T13:04:00
+2007-02-11T13:04:00
+2007-02-10T13:04:00
+2007-02-06T13:04:00
+2007-01-21T13:04:00
+2007-01-20T13:04:00
+2007-01-16T13:04:00
+2006-12-31T13:04:00
+2006-12-30T13:04:00
+2006-12-26T13:04:00
+2006-12-10T13:04:00
+2006-12-09T13:04:00
+2006-12-05T13:04:00
+2006-11-19T13:04:00
+2006-11-18T13:04:00
+2006-11-14T13:04:00
+2006-10-29T13:04:00
+2006-10-28T13:04:00
+2006-10-24T13:04:00
+2006-10-08T13:04:00
+2006-10-07T13:04:00
+2006-10-03T13:04:00
+2006-09-17T13:04:00
+2006-09-16T13:04:00
+2006-09-12T13:04:00
+2006-08-27T13:04:00
+2006-08-26T13:04:00
+2006-08-22T13:04:00
+2006-08-06T13:04:00
+2006-08-05T13:04:00
+2006-08-01T13:04:00
+2006-07-16T13:04:00
+2006-07-15T13:04:00
+2006-07-11T13:04:00
+2006-06-25T13:04:00
+2006-06-24T13:04:00
+2006-06-20T13:04:00
+2006-06-04T13:04:00
+2006-06-03T13:04:00
+2006-05-30T13:04:00
+2006-05-14T13:04:00
+2006-05-13T13:04:00
+2006-05-09T13:04:00
+2006-04-23T13:04:00
+2006-04-22T13:04:00
+2006-04-18T13:04:00
+2006-04-02T13:04:00
+2006-04-01T13:04:00
+2006-03-28T13:04:00
+2006-03-12T13:04:00
+2006-03-11T13:04:00
+2006-03-07T13:04:00
+2006-02-19T13:04:00
+2006-02-18T13:04:00
+2006-02-14T13:04:00
+2006-01-29T13:04:00
+2006-01-28T13:04:00
+2006-01-24T13:04:00
+2006-01-08T13:04:00
+2006-01-07T13:04:00
+2006-01-03T13:04:00
+2005-12-18T13:04:00
+2005-12-17T13:04:00
+2005-12-13T13:04:00
+2005-11-27T13:04:00
+2005-11-26T13:04:00
+2005-11-22T13:04:00
+2005-11-06T13:04:00
+2005-11-05T13:04:00
+2005-11-01T13:04:00
+2005-10-16T13:04:00
+2005-10-15T13:04:00
+2005-10-11T13:04:00
+2005-09-25T13:04:00
+2005-09-24T13:04:00
+2005-09-20T13:04:00
+2005-09-04T13:04:00
+2005-09-03T13:04:00
+2005-08-30T13:04:00
+2005-08-14T13:04:00
+2005-08-13T13:04:00
+2005-08-09T13:04:00
+2005-07-24T13:04:00
+2005-07-23T13:04:00
+2005-07-19T13:04:00
+2005-07-03T13:04:00
+2005-07-02T13:04:00
+2005-06-28T13:04:00
+2005-06-12T13:04:00
+2005-06-11T13:04:00
+2005-06-07T13:04:00
+2005-05-22T13:04:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase02.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase02.ics.recurson.ref
new file mode 100644
index 00000000..8135c314
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase02.ics.recurson.ref
@@ -0,0 +1,292 @@
+2005-05-22
+2005-06-07
+2005-06-11
+2005-06-12
+2005-06-28
+2005-07-02
+2005-07-03
+2005-07-19
+2005-07-23
+2005-07-24
+2005-08-09
+2005-08-13
+2005-08-14
+2005-08-30
+2005-09-03
+2005-09-04
+2005-09-20
+2005-09-24
+2005-09-25
+2005-10-11
+2005-10-15
+2005-10-16
+2005-11-01
+2005-11-05
+2005-11-06
+2005-11-22
+2005-11-26
+2005-11-27
+2005-12-13
+2005-12-17
+2005-12-18
+2006-01-03
+2006-01-07
+2006-01-08
+2006-01-24
+2006-01-28
+2006-01-29
+2006-02-14
+2006-02-18
+2006-02-19
+2006-03-07
+2006-03-11
+2006-03-12
+2006-03-28
+2006-04-01
+2006-04-02
+2006-04-18
+2006-04-22
+2006-04-23
+2006-05-09
+2006-05-13
+2006-05-14
+2006-05-30
+2006-06-03
+2006-06-04
+2006-06-20
+2006-06-24
+2006-06-25
+2006-07-11
+2006-07-15
+2006-07-16
+2006-08-01
+2006-08-05
+2006-08-06
+2006-08-22
+2006-08-26
+2006-08-27
+2006-09-12
+2006-09-16
+2006-09-17
+2006-10-03
+2006-10-07
+2006-10-08
+2006-10-24
+2006-10-28
+2006-10-29
+2006-11-14
+2006-11-18
+2006-11-19
+2006-12-05
+2006-12-09
+2006-12-10
+2006-12-26
+2006-12-30
+2006-12-31
+2007-01-16
+2007-01-20
+2007-01-21
+2007-02-06
+2007-02-10
+2007-02-11
+2007-02-27
+2007-03-03
+2007-03-04
+2007-03-20
+2007-03-24
+2007-03-25
+2007-04-10
+2007-04-14
+2007-04-15
+2007-05-01
+2007-05-05
+2007-05-06
+2007-05-22
+2007-05-26
+2007-05-27
+2007-06-12
+2007-06-16
+2007-06-17
+2007-07-03
+2007-07-07
+2007-07-08
+2007-07-24
+2007-07-28
+2007-07-29
+2007-08-14
+2007-08-18
+2007-08-19
+2007-09-04
+2007-09-08
+2007-09-09
+2007-09-25
+2007-09-29
+2007-09-30
+2007-10-16
+2007-10-20
+2007-10-21
+2007-11-06
+2007-11-10
+2007-11-11
+2007-11-27
+2007-12-01
+2007-12-02
+2007-12-18
+2007-12-22
+2007-12-23
+2008-01-08
+2008-01-12
+2008-01-13
+2008-01-29
+2008-02-02
+2008-02-03
+2008-02-19
+2008-02-23
+2008-02-24
+2008-03-11
+2008-03-15
+2008-03-16
+2008-04-01
+2008-04-05
+2008-04-06
+2008-04-22
+2008-04-26
+2008-04-27
+2008-05-13
+2008-05-17
+2008-05-18
+2008-06-03
+2008-06-07
+2008-06-08
+2008-06-24
+2008-06-28
+2008-06-29
+2008-07-15
+2008-07-19
+2008-07-20
+2008-08-05
+2008-08-09
+2008-08-10
+2008-08-26
+2008-08-30
+2008-08-31
+2008-09-16
+2008-09-20
+2008-09-21
+2008-10-07
+2008-10-11
+2008-10-12
+2008-10-28
+2008-11-01
+2008-11-02
+2008-11-18
+2008-11-22
+2008-11-23
+2008-12-09
+2008-12-13
+2008-12-14
+2008-12-30
+2009-01-03
+2009-01-04
+2009-01-20
+2009-01-24
+2009-01-25
+2009-02-10
+2009-02-14
+2009-02-15
+2009-03-03
+2009-03-07
+2009-03-08
+2009-03-24
+2009-03-28
+2009-03-29
+2009-04-14
+2009-04-18
+2009-04-19
+2009-05-05
+2009-05-09
+2009-05-10
+2009-05-26
+2009-05-30
+2009-05-31
+2009-06-16
+2009-06-20
+2009-06-21
+2009-07-07
+2009-07-11
+2009-07-12
+2009-07-28
+2009-08-01
+2009-08-02
+2009-08-18
+2009-08-22
+2009-08-23
+2009-09-08
+2009-09-12
+2009-09-13
+2009-09-29
+2009-10-03
+2009-10-04
+2009-10-20
+2009-10-24
+2009-10-25
+2009-11-10
+2009-11-14
+2009-11-15
+2009-12-01
+2009-12-05
+2009-12-06
+2009-12-22
+2009-12-26
+2009-12-27
+2010-01-12
+2010-01-16
+2010-01-17
+2010-02-02
+2010-02-06
+2010-02-07
+2010-02-23
+2010-02-27
+2010-02-28
+2010-03-16
+2010-03-20
+2010-03-21
+2010-04-06
+2010-04-10
+2010-04-11
+2010-04-27
+2010-05-01
+2010-05-02
+2010-05-18
+2010-05-22
+2010-05-23
+2010-06-08
+2010-06-12
+2010-06-13
+2010-06-29
+2010-07-03
+2010-07-04
+2010-07-20
+2010-07-24
+2010-07-25
+2010-08-10
+2010-08-14
+2010-08-15
+2010-08-31
+2010-09-04
+2010-09-05
+2010-09-21
+2010-09-25
+2010-09-26
+2010-10-12
+2010-10-16
+2010-10-17
+2010-11-02
+2010-11-06
+2010-11-07
+2010-11-23
+2010-11-27
+2010-11-28
+2010-12-14
+2010-12-18
+2010-12-19
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase03.ics b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase03.ics
new file mode 100644
index 00000000..d2065905
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase03.ics
@@ -0,0 +1,23 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KAlarm 1.2.6//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20050522T130601
+CREATED:20050522T130245
+UID:KAlarm-898217824.835
+SEQUENCE:0
+LAST-MODIFIED:20050522T130245
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=MINUTELY;INTERVAL=240
+DTSTART:20050522T130300
+TRANSP:OPAQUE
+BEGIN:VALARM
+DESCRIPTION:Every 4 hours
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:PT0S
+X-KDE-KALARM-FONTCOLOR:#ff0000\;#000000\;
+END:VALARM
+
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase03.ics.next.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase03.ics.next.ref
new file mode 100644
index 00000000..0d52ed79
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase03.ics.next.ref
@@ -0,0 +1,500 @@
+2005-05-22T13:03:00
+2005-05-22T17:03:00
+2005-05-22T21:03:00
+2005-05-23T01:03:00
+2005-05-23T05:03:00
+2005-05-23T09:03:00
+2005-05-23T13:03:00
+2005-05-23T17:03:00
+2005-05-23T21:03:00
+2005-05-24T01:03:00
+2005-05-24T05:03:00
+2005-05-24T09:03:00
+2005-05-24T13:03:00
+2005-05-24T17:03:00
+2005-05-24T21:03:00
+2005-05-25T01:03:00
+2005-05-25T05:03:00
+2005-05-25T09:03:00
+2005-05-25T13:03:00
+2005-05-25T17:03:00
+2005-05-25T21:03:00
+2005-05-26T01:03:00
+2005-05-26T05:03:00
+2005-05-26T09:03:00
+2005-05-26T13:03:00
+2005-05-26T17:03:00
+2005-05-26T21:03:00
+2005-05-27T01:03:00
+2005-05-27T05:03:00
+2005-05-27T09:03:00
+2005-05-27T13:03:00
+2005-05-27T17:03:00
+2005-05-27T21:03:00
+2005-05-28T01:03:00
+2005-05-28T05:03:00
+2005-05-28T09:03:00
+2005-05-28T13:03:00
+2005-05-28T17:03:00
+2005-05-28T21:03:00
+2005-05-29T01:03:00
+2005-05-29T05:03:00
+2005-05-29T09:03:00
+2005-05-29T13:03:00
+2005-05-29T17:03:00
+2005-05-29T21:03:00
+2005-05-30T01:03:00
+2005-05-30T05:03:00
+2005-05-30T09:03:00
+2005-05-30T13:03:00
+2005-05-30T17:03:00
+2005-05-30T21:03:00
+2005-05-31T01:03:00
+2005-05-31T05:03:00
+2005-05-31T09:03:00
+2005-05-31T13:03:00
+2005-05-31T17:03:00
+2005-05-31T21:03:00
+2005-06-01T01:03:00
+2005-06-01T05:03:00
+2005-06-01T09:03:00
+2005-06-01T13:03:00
+2005-06-01T17:03:00
+2005-06-01T21:03:00
+2005-06-02T01:03:00
+2005-06-02T05:03:00
+2005-06-02T09:03:00
+2005-06-02T13:03:00
+2005-06-02T17:03:00
+2005-06-02T21:03:00
+2005-06-03T01:03:00
+2005-06-03T05:03:00
+2005-06-03T09:03:00
+2005-06-03T13:03:00
+2005-06-03T17:03:00
+2005-06-03T21:03:00
+2005-06-04T01:03:00
+2005-06-04T05:03:00
+2005-06-04T09:03:00
+2005-06-04T13:03:00
+2005-06-04T17:03:00
+2005-06-04T21:03:00
+2005-06-05T01:03:00
+2005-06-05T05:03:00
+2005-06-05T09:03:00
+2005-06-05T13:03:00
+2005-06-05T17:03:00
+2005-06-05T21:03:00
+2005-06-06T01:03:00
+2005-06-06T05:03:00
+2005-06-06T09:03:00
+2005-06-06T13:03:00
+2005-06-06T17:03:00
+2005-06-06T21:03:00
+2005-06-07T01:03:00
+2005-06-07T05:03:00
+2005-06-07T09:03:00
+2005-06-07T13:03:00
+2005-06-07T17:03:00
+2005-06-07T21:03:00
+2005-06-08T01:03:00
+2005-06-08T05:03:00
+2005-06-08T09:03:00
+2005-06-08T13:03:00
+2005-06-08T17:03:00
+2005-06-08T21:03:00
+2005-06-09T01:03:00
+2005-06-09T05:03:00
+2005-06-09T09:03:00
+2005-06-09T13:03:00
+2005-06-09T17:03:00
+2005-06-09T21:03:00
+2005-06-10T01:03:00
+2005-06-10T05:03:00
+2005-06-10T09:03:00
+2005-06-10T13:03:00
+2005-06-10T17:03:00
+2005-06-10T21:03:00
+2005-06-11T01:03:00
+2005-06-11T05:03:00
+2005-06-11T09:03:00
+2005-06-11T13:03:00
+2005-06-11T17:03:00
+2005-06-11T21:03:00
+2005-06-12T01:03:00
+2005-06-12T05:03:00
+2005-06-12T09:03:00
+2005-06-12T13:03:00
+2005-06-12T17:03:00
+2005-06-12T21:03:00
+2005-06-13T01:03:00
+2005-06-13T05:03:00
+2005-06-13T09:03:00
+2005-06-13T13:03:00
+2005-06-13T17:03:00
+2005-06-13T21:03:00
+2005-06-14T01:03:00
+2005-06-14T05:03:00
+2005-06-14T09:03:00
+2005-06-14T13:03:00
+2005-06-14T17:03:00
+2005-06-14T21:03:00
+2005-06-15T01:03:00
+2005-06-15T05:03:00
+2005-06-15T09:03:00
+2005-06-15T13:03:00
+2005-06-15T17:03:00
+2005-06-15T21:03:00
+2005-06-16T01:03:00
+2005-06-16T05:03:00
+2005-06-16T09:03:00
+2005-06-16T13:03:00
+2005-06-16T17:03:00
+2005-06-16T21:03:00
+2005-06-17T01:03:00
+2005-06-17T05:03:00
+2005-06-17T09:03:00
+2005-06-17T13:03:00
+2005-06-17T17:03:00
+2005-06-17T21:03:00
+2005-06-18T01:03:00
+2005-06-18T05:03:00
+2005-06-18T09:03:00
+2005-06-18T13:03:00
+2005-06-18T17:03:00
+2005-06-18T21:03:00
+2005-06-19T01:03:00
+2005-06-19T05:03:00
+2005-06-19T09:03:00
+2005-06-19T13:03:00
+2005-06-19T17:03:00
+2005-06-19T21:03:00
+2005-06-20T01:03:00
+2005-06-20T05:03:00
+2005-06-20T09:03:00
+2005-06-20T13:03:00
+2005-06-20T17:03:00
+2005-06-20T21:03:00
+2005-06-21T01:03:00
+2005-06-21T05:03:00
+2005-06-21T09:03:00
+2005-06-21T13:03:00
+2005-06-21T17:03:00
+2005-06-21T21:03:00
+2005-06-22T01:03:00
+2005-06-22T05:03:00
+2005-06-22T09:03:00
+2005-06-22T13:03:00
+2005-06-22T17:03:00
+2005-06-22T21:03:00
+2005-06-23T01:03:00
+2005-06-23T05:03:00
+2005-06-23T09:03:00
+2005-06-23T13:03:00
+2005-06-23T17:03:00
+2005-06-23T21:03:00
+2005-06-24T01:03:00
+2005-06-24T05:03:00
+2005-06-24T09:03:00
+2005-06-24T13:03:00
+2005-06-24T17:03:00
+2005-06-24T21:03:00
+2005-06-25T01:03:00
+2005-06-25T05:03:00
+2005-06-25T09:03:00
+2005-06-25T13:03:00
+2005-06-25T17:03:00
+2005-06-25T21:03:00
+2005-06-26T01:03:00
+2005-06-26T05:03:00
+2005-06-26T09:03:00
+2005-06-26T13:03:00
+2005-06-26T17:03:00
+2005-06-26T21:03:00
+2005-06-27T01:03:00
+2005-06-27T05:03:00
+2005-06-27T09:03:00
+2005-06-27T13:03:00
+2005-06-27T17:03:00
+2005-06-27T21:03:00
+2005-06-28T01:03:00
+2005-06-28T05:03:00
+2005-06-28T09:03:00
+2005-06-28T13:03:00
+2005-06-28T17:03:00
+2005-06-28T21:03:00
+2005-06-29T01:03:00
+2005-06-29T05:03:00
+2005-06-29T09:03:00
+2005-06-29T13:03:00
+2005-06-29T17:03:00
+2005-06-29T21:03:00
+2005-06-30T01:03:00
+2005-06-30T05:03:00
+2005-06-30T09:03:00
+2005-06-30T13:03:00
+2005-06-30T17:03:00
+2005-06-30T21:03:00
+2005-07-01T01:03:00
+2005-07-01T05:03:00
+2005-07-01T09:03:00
+2005-07-01T13:03:00
+2005-07-01T17:03:00
+2005-07-01T21:03:00
+2005-07-02T01:03:00
+2005-07-02T05:03:00
+2005-07-02T09:03:00
+2005-07-02T13:03:00
+2005-07-02T17:03:00
+2005-07-02T21:03:00
+2005-07-03T01:03:00
+2005-07-03T05:03:00
+2005-07-03T09:03:00
+2005-07-03T13:03:00
+2005-07-03T17:03:00
+2005-07-03T21:03:00
+2005-07-04T01:03:00
+2005-07-04T05:03:00
+2005-07-04T09:03:00
+2005-07-04T13:03:00
+2005-07-04T17:03:00
+2005-07-04T21:03:00
+2005-07-05T01:03:00
+2005-07-05T05:03:00
+2005-07-05T09:03:00
+2005-07-05T13:03:00
+2005-07-05T17:03:00
+2005-07-05T21:03:00
+2005-07-06T01:03:00
+2005-07-06T05:03:00
+2005-07-06T09:03:00
+2005-07-06T13:03:00
+2005-07-06T17:03:00
+2005-07-06T21:03:00
+2005-07-07T01:03:00
+2005-07-07T05:03:00
+2005-07-07T09:03:00
+2005-07-07T13:03:00
+2005-07-07T17:03:00
+2005-07-07T21:03:00
+2005-07-08T01:03:00
+2005-07-08T05:03:00
+2005-07-08T09:03:00
+2005-07-08T13:03:00
+2005-07-08T17:03:00
+2005-07-08T21:03:00
+2005-07-09T01:03:00
+2005-07-09T05:03:00
+2005-07-09T09:03:00
+2005-07-09T13:03:00
+2005-07-09T17:03:00
+2005-07-09T21:03:00
+2005-07-10T01:03:00
+2005-07-10T05:03:00
+2005-07-10T09:03:00
+2005-07-10T13:03:00
+2005-07-10T17:03:00
+2005-07-10T21:03:00
+2005-07-11T01:03:00
+2005-07-11T05:03:00
+2005-07-11T09:03:00
+2005-07-11T13:03:00
+2005-07-11T17:03:00
+2005-07-11T21:03:00
+2005-07-12T01:03:00
+2005-07-12T05:03:00
+2005-07-12T09:03:00
+2005-07-12T13:03:00
+2005-07-12T17:03:00
+2005-07-12T21:03:00
+2005-07-13T01:03:00
+2005-07-13T05:03:00
+2005-07-13T09:03:00
+2005-07-13T13:03:00
+2005-07-13T17:03:00
+2005-07-13T21:03:00
+2005-07-14T01:03:00
+2005-07-14T05:03:00
+2005-07-14T09:03:00
+2005-07-14T13:03:00
+2005-07-14T17:03:00
+2005-07-14T21:03:00
+2005-07-15T01:03:00
+2005-07-15T05:03:00
+2005-07-15T09:03:00
+2005-07-15T13:03:00
+2005-07-15T17:03:00
+2005-07-15T21:03:00
+2005-07-16T01:03:00
+2005-07-16T05:03:00
+2005-07-16T09:03:00
+2005-07-16T13:03:00
+2005-07-16T17:03:00
+2005-07-16T21:03:00
+2005-07-17T01:03:00
+2005-07-17T05:03:00
+2005-07-17T09:03:00
+2005-07-17T13:03:00
+2005-07-17T17:03:00
+2005-07-17T21:03:00
+2005-07-18T01:03:00
+2005-07-18T05:03:00
+2005-07-18T09:03:00
+2005-07-18T13:03:00
+2005-07-18T17:03:00
+2005-07-18T21:03:00
+2005-07-19T01:03:00
+2005-07-19T05:03:00
+2005-07-19T09:03:00
+2005-07-19T13:03:00
+2005-07-19T17:03:00
+2005-07-19T21:03:00
+2005-07-20T01:03:00
+2005-07-20T05:03:00
+2005-07-20T09:03:00
+2005-07-20T13:03:00
+2005-07-20T17:03:00
+2005-07-20T21:03:00
+2005-07-21T01:03:00
+2005-07-21T05:03:00
+2005-07-21T09:03:00
+2005-07-21T13:03:00
+2005-07-21T17:03:00
+2005-07-21T21:03:00
+2005-07-22T01:03:00
+2005-07-22T05:03:00
+2005-07-22T09:03:00
+2005-07-22T13:03:00
+2005-07-22T17:03:00
+2005-07-22T21:03:00
+2005-07-23T01:03:00
+2005-07-23T05:03:00
+2005-07-23T09:03:00
+2005-07-23T13:03:00
+2005-07-23T17:03:00
+2005-07-23T21:03:00
+2005-07-24T01:03:00
+2005-07-24T05:03:00
+2005-07-24T09:03:00
+2005-07-24T13:03:00
+2005-07-24T17:03:00
+2005-07-24T21:03:00
+2005-07-25T01:03:00
+2005-07-25T05:03:00
+2005-07-25T09:03:00
+2005-07-25T13:03:00
+2005-07-25T17:03:00
+2005-07-25T21:03:00
+2005-07-26T01:03:00
+2005-07-26T05:03:00
+2005-07-26T09:03:00
+2005-07-26T13:03:00
+2005-07-26T17:03:00
+2005-07-26T21:03:00
+2005-07-27T01:03:00
+2005-07-27T05:03:00
+2005-07-27T09:03:00
+2005-07-27T13:03:00
+2005-07-27T17:03:00
+2005-07-27T21:03:00
+2005-07-28T01:03:00
+2005-07-28T05:03:00
+2005-07-28T09:03:00
+2005-07-28T13:03:00
+2005-07-28T17:03:00
+2005-07-28T21:03:00
+2005-07-29T01:03:00
+2005-07-29T05:03:00
+2005-07-29T09:03:00
+2005-07-29T13:03:00
+2005-07-29T17:03:00
+2005-07-29T21:03:00
+2005-07-30T01:03:00
+2005-07-30T05:03:00
+2005-07-30T09:03:00
+2005-07-30T13:03:00
+2005-07-30T17:03:00
+2005-07-30T21:03:00
+2005-07-31T01:03:00
+2005-07-31T05:03:00
+2005-07-31T09:03:00
+2005-07-31T13:03:00
+2005-07-31T17:03:00
+2005-07-31T21:03:00
+2005-08-01T01:03:00
+2005-08-01T05:03:00
+2005-08-01T09:03:00
+2005-08-01T13:03:00
+2005-08-01T17:03:00
+2005-08-01T21:03:00
+2005-08-02T01:03:00
+2005-08-02T05:03:00
+2005-08-02T09:03:00
+2005-08-02T13:03:00
+2005-08-02T17:03:00
+2005-08-02T21:03:00
+2005-08-03T01:03:00
+2005-08-03T05:03:00
+2005-08-03T09:03:00
+2005-08-03T13:03:00
+2005-08-03T17:03:00
+2005-08-03T21:03:00
+2005-08-04T01:03:00
+2005-08-04T05:03:00
+2005-08-04T09:03:00
+2005-08-04T13:03:00
+2005-08-04T17:03:00
+2005-08-04T21:03:00
+2005-08-05T01:03:00
+2005-08-05T05:03:00
+2005-08-05T09:03:00
+2005-08-05T13:03:00
+2005-08-05T17:03:00
+2005-08-05T21:03:00
+2005-08-06T01:03:00
+2005-08-06T05:03:00
+2005-08-06T09:03:00
+2005-08-06T13:03:00
+2005-08-06T17:03:00
+2005-08-06T21:03:00
+2005-08-07T01:03:00
+2005-08-07T05:03:00
+2005-08-07T09:03:00
+2005-08-07T13:03:00
+2005-08-07T17:03:00
+2005-08-07T21:03:00
+2005-08-08T01:03:00
+2005-08-08T05:03:00
+2005-08-08T09:03:00
+2005-08-08T13:03:00
+2005-08-08T17:03:00
+2005-08-08T21:03:00
+2005-08-09T01:03:00
+2005-08-09T05:03:00
+2005-08-09T09:03:00
+2005-08-09T13:03:00
+2005-08-09T17:03:00
+2005-08-09T21:03:00
+2005-08-10T01:03:00
+2005-08-10T05:03:00
+2005-08-10T09:03:00
+2005-08-10T13:03:00
+2005-08-10T17:03:00
+2005-08-10T21:03:00
+2005-08-11T01:03:00
+2005-08-11T05:03:00
+2005-08-11T09:03:00
+2005-08-11T13:03:00
+2005-08-11T17:03:00
+2005-08-11T21:03:00
+2005-08-12T01:03:00
+2005-08-12T05:03:00
+2005-08-12T09:03:00
+2005-08-12T13:03:00
+2005-08-12T17:03:00
+2005-08-12T21:03:00
+2005-08-13T01:03:00
+2005-08-13T05:03:00
+2005-08-13T09:03:00
+2005-08-13T13:03:00
+2005-08-13T17:03:00
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase03.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase03.ics.prev.ref
new file mode 100644
index 00000000..a86a1cb8
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase03.ics.prev.ref
@@ -0,0 +1,500 @@
+2010-12-31T21:03:00
+2010-12-31T17:03:00
+2010-12-31T13:03:00
+2010-12-31T09:03:00
+2010-12-31T05:03:00
+2010-12-31T01:03:00
+2010-12-30T21:03:00
+2010-12-30T17:03:00
+2010-12-30T13:03:00
+2010-12-30T09:03:00
+2010-12-30T05:03:00
+2010-12-30T01:03:00
+2010-12-29T21:03:00
+2010-12-29T17:03:00
+2010-12-29T13:03:00
+2010-12-29T09:03:00
+2010-12-29T05:03:00
+2010-12-29T01:03:00
+2010-12-28T21:03:00
+2010-12-28T17:03:00
+2010-12-28T13:03:00
+2010-12-28T09:03:00
+2010-12-28T05:03:00
+2010-12-28T01:03:00
+2010-12-27T21:03:00
+2010-12-27T17:03:00
+2010-12-27T13:03:00
+2010-12-27T09:03:00
+2010-12-27T05:03:00
+2010-12-27T01:03:00
+2010-12-26T21:03:00
+2010-12-26T17:03:00
+2010-12-26T13:03:00
+2010-12-26T09:03:00
+2010-12-26T05:03:00
+2010-12-26T01:03:00
+2010-12-25T21:03:00
+2010-12-25T17:03:00
+2010-12-25T13:03:00
+2010-12-25T09:03:00
+2010-12-25T05:03:00
+2010-12-25T01:03:00
+2010-12-24T21:03:00
+2010-12-24T17:03:00
+2010-12-24T13:03:00
+2010-12-24T09:03:00
+2010-12-24T05:03:00
+2010-12-24T01:03:00
+2010-12-23T21:03:00
+2010-12-23T17:03:00
+2010-12-23T13:03:00
+2010-12-23T09:03:00
+2010-12-23T05:03:00
+2010-12-23T01:03:00
+2010-12-22T21:03:00
+2010-12-22T17:03:00
+2010-12-22T13:03:00
+2010-12-22T09:03:00
+2010-12-22T05:03:00
+2010-12-22T01:03:00
+2010-12-21T21:03:00
+2010-12-21T17:03:00
+2010-12-21T13:03:00
+2010-12-21T09:03:00
+2010-12-21T05:03:00
+2010-12-21T01:03:00
+2010-12-20T21:03:00
+2010-12-20T17:03:00
+2010-12-20T13:03:00
+2010-12-20T09:03:00
+2010-12-20T05:03:00
+2010-12-20T01:03:00
+2010-12-19T21:03:00
+2010-12-19T17:03:00
+2010-12-19T13:03:00
+2010-12-19T09:03:00
+2010-12-19T05:03:00
+2010-12-19T01:03:00
+2010-12-18T21:03:00
+2010-12-18T17:03:00
+2010-12-18T13:03:00
+2010-12-18T09:03:00
+2010-12-18T05:03:00
+2010-12-18T01:03:00
+2010-12-17T21:03:00
+2010-12-17T17:03:00
+2010-12-17T13:03:00
+2010-12-17T09:03:00
+2010-12-17T05:03:00
+2010-12-17T01:03:00
+2010-12-16T21:03:00
+2010-12-16T17:03:00
+2010-12-16T13:03:00
+2010-12-16T09:03:00
+2010-12-16T05:03:00
+2010-12-16T01:03:00
+2010-12-15T21:03:00
+2010-12-15T17:03:00
+2010-12-15T13:03:00
+2010-12-15T09:03:00
+2010-12-15T05:03:00
+2010-12-15T01:03:00
+2010-12-14T21:03:00
+2010-12-14T17:03:00
+2010-12-14T13:03:00
+2010-12-14T09:03:00
+2010-12-14T05:03:00
+2010-12-14T01:03:00
+2010-12-13T21:03:00
+2010-12-13T17:03:00
+2010-12-13T13:03:00
+2010-12-13T09:03:00
+2010-12-13T05:03:00
+2010-12-13T01:03:00
+2010-12-12T21:03:00
+2010-12-12T17:03:00
+2010-12-12T13:03:00
+2010-12-12T09:03:00
+2010-12-12T05:03:00
+2010-12-12T01:03:00
+2010-12-11T21:03:00
+2010-12-11T17:03:00
+2010-12-11T13:03:00
+2010-12-11T09:03:00
+2010-12-11T05:03:00
+2010-12-11T01:03:00
+2010-12-10T21:03:00
+2010-12-10T17:03:00
+2010-12-10T13:03:00
+2010-12-10T09:03:00
+2010-12-10T05:03:00
+2010-12-10T01:03:00
+2010-12-09T21:03:00
+2010-12-09T17:03:00
+2010-12-09T13:03:00
+2010-12-09T09:03:00
+2010-12-09T05:03:00
+2010-12-09T01:03:00
+2010-12-08T21:03:00
+2010-12-08T17:03:00
+2010-12-08T13:03:00
+2010-12-08T09:03:00
+2010-12-08T05:03:00
+2010-12-08T01:03:00
+2010-12-07T21:03:00
+2010-12-07T17:03:00
+2010-12-07T13:03:00
+2010-12-07T09:03:00
+2010-12-07T05:03:00
+2010-12-07T01:03:00
+2010-12-06T21:03:00
+2010-12-06T17:03:00
+2010-12-06T13:03:00
+2010-12-06T09:03:00
+2010-12-06T05:03:00
+2010-12-06T01:03:00
+2010-12-05T21:03:00
+2010-12-05T17:03:00
+2010-12-05T13:03:00
+2010-12-05T09:03:00
+2010-12-05T05:03:00
+2010-12-05T01:03:00
+2010-12-04T21:03:00
+2010-12-04T17:03:00
+2010-12-04T13:03:00
+2010-12-04T09:03:00
+2010-12-04T05:03:00
+2010-12-04T01:03:00
+2010-12-03T21:03:00
+2010-12-03T17:03:00
+2010-12-03T13:03:00
+2010-12-03T09:03:00
+2010-12-03T05:03:00
+2010-12-03T01:03:00
+2010-12-02T21:03:00
+2010-12-02T17:03:00
+2010-12-02T13:03:00
+2010-12-02T09:03:00
+2010-12-02T05:03:00
+2010-12-02T01:03:00
+2010-12-01T21:03:00
+2010-12-01T17:03:00
+2010-12-01T13:03:00
+2010-12-01T09:03:00
+2010-12-01T05:03:00
+2010-12-01T01:03:00
+2010-11-30T21:03:00
+2010-11-30T17:03:00
+2010-11-30T13:03:00
+2010-11-30T09:03:00
+2010-11-30T05:03:00
+2010-11-30T01:03:00
+2010-11-29T21:03:00
+2010-11-29T17:03:00
+2010-11-29T13:03:00
+2010-11-29T09:03:00
+2010-11-29T05:03:00
+2010-11-29T01:03:00
+2010-11-28T21:03:00
+2010-11-28T17:03:00
+2010-11-28T13:03:00
+2010-11-28T09:03:00
+2010-11-28T05:03:00
+2010-11-28T01:03:00
+2010-11-27T21:03:00
+2010-11-27T17:03:00
+2010-11-27T13:03:00
+2010-11-27T09:03:00
+2010-11-27T05:03:00
+2010-11-27T01:03:00
+2010-11-26T21:03:00
+2010-11-26T17:03:00
+2010-11-26T13:03:00
+2010-11-26T09:03:00
+2010-11-26T05:03:00
+2010-11-26T01:03:00
+2010-11-25T21:03:00
+2010-11-25T17:03:00
+2010-11-25T13:03:00
+2010-11-25T09:03:00
+2010-11-25T05:03:00
+2010-11-25T01:03:00
+2010-11-24T21:03:00
+2010-11-24T17:03:00
+2010-11-24T13:03:00
+2010-11-24T09:03:00
+2010-11-24T05:03:00
+2010-11-24T01:03:00
+2010-11-23T21:03:00
+2010-11-23T17:03:00
+2010-11-23T13:03:00
+2010-11-23T09:03:00
+2010-11-23T05:03:00
+2010-11-23T01:03:00
+2010-11-22T21:03:00
+2010-11-22T17:03:00
+2010-11-22T13:03:00
+2010-11-22T09:03:00
+2010-11-22T05:03:00
+2010-11-22T01:03:00
+2010-11-21T21:03:00
+2010-11-21T17:03:00
+2010-11-21T13:03:00
+2010-11-21T09:03:00
+2010-11-21T05:03:00
+2010-11-21T01:03:00
+2010-11-20T21:03:00
+2010-11-20T17:03:00
+2010-11-20T13:03:00
+2010-11-20T09:03:00
+2010-11-20T05:03:00
+2010-11-20T01:03:00
+2010-11-19T21:03:00
+2010-11-19T17:03:00
+2010-11-19T13:03:00
+2010-11-19T09:03:00
+2010-11-19T05:03:00
+2010-11-19T01:03:00
+2010-11-18T21:03:00
+2010-11-18T17:03:00
+2010-11-18T13:03:00
+2010-11-18T09:03:00
+2010-11-18T05:03:00
+2010-11-18T01:03:00
+2010-11-17T21:03:00
+2010-11-17T17:03:00
+2010-11-17T13:03:00
+2010-11-17T09:03:00
+2010-11-17T05:03:00
+2010-11-17T01:03:00
+2010-11-16T21:03:00
+2010-11-16T17:03:00
+2010-11-16T13:03:00
+2010-11-16T09:03:00
+2010-11-16T05:03:00
+2010-11-16T01:03:00
+2010-11-15T21:03:00
+2010-11-15T17:03:00
+2010-11-15T13:03:00
+2010-11-15T09:03:00
+2010-11-15T05:03:00
+2010-11-15T01:03:00
+2010-11-14T21:03:00
+2010-11-14T17:03:00
+2010-11-14T13:03:00
+2010-11-14T09:03:00
+2010-11-14T05:03:00
+2010-11-14T01:03:00
+2010-11-13T21:03:00
+2010-11-13T17:03:00
+2010-11-13T13:03:00
+2010-11-13T09:03:00
+2010-11-13T05:03:00
+2010-11-13T01:03:00
+2010-11-12T21:03:00
+2010-11-12T17:03:00
+2010-11-12T13:03:00
+2010-11-12T09:03:00
+2010-11-12T05:03:00
+2010-11-12T01:03:00
+2010-11-11T21:03:00
+2010-11-11T17:03:00
+2010-11-11T13:03:00
+2010-11-11T09:03:00
+2010-11-11T05:03:00
+2010-11-11T01:03:00
+2010-11-10T21:03:00
+2010-11-10T17:03:00
+2010-11-10T13:03:00
+2010-11-10T09:03:00
+2010-11-10T05:03:00
+2010-11-10T01:03:00
+2010-11-09T21:03:00
+2010-11-09T17:03:00
+2010-11-09T13:03:00
+2010-11-09T09:03:00
+2010-11-09T05:03:00
+2010-11-09T01:03:00
+2010-11-08T21:03:00
+2010-11-08T17:03:00
+2010-11-08T13:03:00
+2010-11-08T09:03:00
+2010-11-08T05:03:00
+2010-11-08T01:03:00
+2010-11-07T21:03:00
+2010-11-07T17:03:00
+2010-11-07T13:03:00
+2010-11-07T09:03:00
+2010-11-07T05:03:00
+2010-11-07T01:03:00
+2010-11-06T21:03:00
+2010-11-06T17:03:00
+2010-11-06T13:03:00
+2010-11-06T09:03:00
+2010-11-06T05:03:00
+2010-11-06T01:03:00
+2010-11-05T21:03:00
+2010-11-05T17:03:00
+2010-11-05T13:03:00
+2010-11-05T09:03:00
+2010-11-05T05:03:00
+2010-11-05T01:03:00
+2010-11-04T21:03:00
+2010-11-04T17:03:00
+2010-11-04T13:03:00
+2010-11-04T09:03:00
+2010-11-04T05:03:00
+2010-11-04T01:03:00
+2010-11-03T21:03:00
+2010-11-03T17:03:00
+2010-11-03T13:03:00
+2010-11-03T09:03:00
+2010-11-03T05:03:00
+2010-11-03T01:03:00
+2010-11-02T21:03:00
+2010-11-02T17:03:00
+2010-11-02T13:03:00
+2010-11-02T09:03:00
+2010-11-02T05:03:00
+2010-11-02T01:03:00
+2010-11-01T21:03:00
+2010-11-01T17:03:00
+2010-11-01T13:03:00
+2010-11-01T09:03:00
+2010-11-01T05:03:00
+2010-11-01T01:03:00
+2010-10-31T21:03:00
+2010-10-31T17:03:00
+2010-10-31T13:03:00
+2010-10-31T09:03:00
+2010-10-31T05:03:00
+2010-10-31T01:03:00
+2010-10-30T21:03:00
+2010-10-30T17:03:00
+2010-10-30T13:03:00
+2010-10-30T09:03:00
+2010-10-30T05:03:00
+2010-10-30T01:03:00
+2010-10-29T21:03:00
+2010-10-29T17:03:00
+2010-10-29T13:03:00
+2010-10-29T09:03:00
+2010-10-29T05:03:00
+2010-10-29T01:03:00
+2010-10-28T21:03:00
+2010-10-28T17:03:00
+2010-10-28T13:03:00
+2010-10-28T09:03:00
+2010-10-28T05:03:00
+2010-10-28T01:03:00
+2010-10-27T21:03:00
+2010-10-27T17:03:00
+2010-10-27T13:03:00
+2010-10-27T09:03:00
+2010-10-27T05:03:00
+2010-10-27T01:03:00
+2010-10-26T21:03:00
+2010-10-26T17:03:00
+2010-10-26T13:03:00
+2010-10-26T09:03:00
+2010-10-26T05:03:00
+2010-10-26T01:03:00
+2010-10-25T21:03:00
+2010-10-25T17:03:00
+2010-10-25T13:03:00
+2010-10-25T09:03:00
+2010-10-25T05:03:00
+2010-10-25T01:03:00
+2010-10-24T21:03:00
+2010-10-24T17:03:00
+2010-10-24T13:03:00
+2010-10-24T09:03:00
+2010-10-24T05:03:00
+2010-10-24T01:03:00
+2010-10-23T21:03:00
+2010-10-23T17:03:00
+2010-10-23T13:03:00
+2010-10-23T09:03:00
+2010-10-23T05:03:00
+2010-10-23T01:03:00
+2010-10-22T21:03:00
+2010-10-22T17:03:00
+2010-10-22T13:03:00
+2010-10-22T09:03:00
+2010-10-22T05:03:00
+2010-10-22T01:03:00
+2010-10-21T21:03:00
+2010-10-21T17:03:00
+2010-10-21T13:03:00
+2010-10-21T09:03:00
+2010-10-21T05:03:00
+2010-10-21T01:03:00
+2010-10-20T21:03:00
+2010-10-20T17:03:00
+2010-10-20T13:03:00
+2010-10-20T09:03:00
+2010-10-20T05:03:00
+2010-10-20T01:03:00
+2010-10-19T21:03:00
+2010-10-19T17:03:00
+2010-10-19T13:03:00
+2010-10-19T09:03:00
+2010-10-19T05:03:00
+2010-10-19T01:03:00
+2010-10-18T21:03:00
+2010-10-18T17:03:00
+2010-10-18T13:03:00
+2010-10-18T09:03:00
+2010-10-18T05:03:00
+2010-10-18T01:03:00
+2010-10-17T21:03:00
+2010-10-17T17:03:00
+2010-10-17T13:03:00
+2010-10-17T09:03:00
+2010-10-17T05:03:00
+2010-10-17T01:03:00
+2010-10-16T21:03:00
+2010-10-16T17:03:00
+2010-10-16T13:03:00
+2010-10-16T09:03:00
+2010-10-16T05:03:00
+2010-10-16T01:03:00
+2010-10-15T21:03:00
+2010-10-15T17:03:00
+2010-10-15T13:03:00
+2010-10-15T09:03:00
+2010-10-15T05:03:00
+2010-10-15T01:03:00
+2010-10-14T21:03:00
+2010-10-14T17:03:00
+2010-10-14T13:03:00
+2010-10-14T09:03:00
+2010-10-14T05:03:00
+2010-10-14T01:03:00
+2010-10-13T21:03:00
+2010-10-13T17:03:00
+2010-10-13T13:03:00
+2010-10-13T09:03:00
+2010-10-13T05:03:00
+2010-10-13T01:03:00
+2010-10-12T21:03:00
+2010-10-12T17:03:00
+2010-10-12T13:03:00
+2010-10-12T09:03:00
+2010-10-12T05:03:00
+2010-10-12T01:03:00
+2010-10-11T21:03:00
+2010-10-11T17:03:00
+2010-10-11T13:03:00
+2010-10-11T09:03:00
+2010-10-11T05:03:00
+2010-10-11T01:03:00
+2010-10-10T21:03:00
+2010-10-10T17:03:00
+2010-10-10T13:03:00
+2010-10-10T09:03:00
+2010-10-10T05:03:00
+2010-10-10T01:03:00
+2010-10-09T21:03:00
+2010-10-09T17:03:00
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase03.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase03.ics.recurson.ref
new file mode 100644
index 00000000..04ba619c
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase03.ics.recurson.ref
@@ -0,0 +1,2050 @@
+2005-05-22
+2005-05-23
+2005-05-24
+2005-05-25
+2005-05-26
+2005-05-27
+2005-05-28
+2005-05-29
+2005-05-30
+2005-05-31
+2005-06-01
+2005-06-02
+2005-06-03
+2005-06-04
+2005-06-05
+2005-06-06
+2005-06-07
+2005-06-08
+2005-06-09
+2005-06-10
+2005-06-11
+2005-06-12
+2005-06-13
+2005-06-14
+2005-06-15
+2005-06-16
+2005-06-17
+2005-06-18
+2005-06-19
+2005-06-20
+2005-06-21
+2005-06-22
+2005-06-23
+2005-06-24
+2005-06-25
+2005-06-26
+2005-06-27
+2005-06-28
+2005-06-29
+2005-06-30
+2005-07-01
+2005-07-02
+2005-07-03
+2005-07-04
+2005-07-05
+2005-07-06
+2005-07-07
+2005-07-08
+2005-07-09
+2005-07-10
+2005-07-11
+2005-07-12
+2005-07-13
+2005-07-14
+2005-07-15
+2005-07-16
+2005-07-17
+2005-07-18
+2005-07-19
+2005-07-20
+2005-07-21
+2005-07-22
+2005-07-23
+2005-07-24
+2005-07-25
+2005-07-26
+2005-07-27
+2005-07-28
+2005-07-29
+2005-07-30
+2005-07-31
+2005-08-01
+2005-08-02
+2005-08-03
+2005-08-04
+2005-08-05
+2005-08-06
+2005-08-07
+2005-08-08
+2005-08-09
+2005-08-10
+2005-08-11
+2005-08-12
+2005-08-13
+2005-08-14
+2005-08-15
+2005-08-16
+2005-08-17
+2005-08-18
+2005-08-19
+2005-08-20
+2005-08-21
+2005-08-22
+2005-08-23
+2005-08-24
+2005-08-25
+2005-08-26
+2005-08-27
+2005-08-28
+2005-08-29
+2005-08-30
+2005-08-31
+2005-09-01
+2005-09-02
+2005-09-03
+2005-09-04
+2005-09-05
+2005-09-06
+2005-09-07
+2005-09-08
+2005-09-09
+2005-09-10
+2005-09-11
+2005-09-12
+2005-09-13
+2005-09-14
+2005-09-15
+2005-09-16
+2005-09-17
+2005-09-18
+2005-09-19
+2005-09-20
+2005-09-21
+2005-09-22
+2005-09-23
+2005-09-24
+2005-09-25
+2005-09-26
+2005-09-27
+2005-09-28
+2005-09-29
+2005-09-30
+2005-10-01
+2005-10-02
+2005-10-03
+2005-10-04
+2005-10-05
+2005-10-06
+2005-10-07
+2005-10-08
+2005-10-09
+2005-10-10
+2005-10-11
+2005-10-12
+2005-10-13
+2005-10-14
+2005-10-15
+2005-10-16
+2005-10-17
+2005-10-18
+2005-10-19
+2005-10-20
+2005-10-21
+2005-10-22
+2005-10-23
+2005-10-24
+2005-10-25
+2005-10-26
+2005-10-27
+2005-10-28
+2005-10-29
+2005-10-30
+2005-10-31
+2005-11-01
+2005-11-02
+2005-11-03
+2005-11-04
+2005-11-05
+2005-11-06
+2005-11-07
+2005-11-08
+2005-11-09
+2005-11-10
+2005-11-11
+2005-11-12
+2005-11-13
+2005-11-14
+2005-11-15
+2005-11-16
+2005-11-17
+2005-11-18
+2005-11-19
+2005-11-20
+2005-11-21
+2005-11-22
+2005-11-23
+2005-11-24
+2005-11-25
+2005-11-26
+2005-11-27
+2005-11-28
+2005-11-29
+2005-11-30
+2005-12-01
+2005-12-02
+2005-12-03
+2005-12-04
+2005-12-05
+2005-12-06
+2005-12-07
+2005-12-08
+2005-12-09
+2005-12-10
+2005-12-11
+2005-12-12
+2005-12-13
+2005-12-14
+2005-12-15
+2005-12-16
+2005-12-17
+2005-12-18
+2005-12-19
+2005-12-20
+2005-12-21
+2005-12-22
+2005-12-23
+2005-12-24
+2005-12-25
+2005-12-26
+2005-12-27
+2005-12-28
+2005-12-29
+2005-12-30
+2005-12-31
+2006-01-01
+2006-01-02
+2006-01-03
+2006-01-04
+2006-01-05
+2006-01-06
+2006-01-07
+2006-01-08
+2006-01-09
+2006-01-10
+2006-01-11
+2006-01-12
+2006-01-13
+2006-01-14
+2006-01-15
+2006-01-16
+2006-01-17
+2006-01-18
+2006-01-19
+2006-01-20
+2006-01-21
+2006-01-22
+2006-01-23
+2006-01-24
+2006-01-25
+2006-01-26
+2006-01-27
+2006-01-28
+2006-01-29
+2006-01-30
+2006-01-31
+2006-02-01
+2006-02-02
+2006-02-03
+2006-02-04
+2006-02-05
+2006-02-06
+2006-02-07
+2006-02-08
+2006-02-09
+2006-02-10
+2006-02-11
+2006-02-12
+2006-02-13
+2006-02-14
+2006-02-15
+2006-02-16
+2006-02-17
+2006-02-18
+2006-02-19
+2006-02-20
+2006-02-21
+2006-02-22
+2006-02-23
+2006-02-24
+2006-02-25
+2006-02-26
+2006-02-27
+2006-02-28
+2006-03-01
+2006-03-02
+2006-03-03
+2006-03-04
+2006-03-05
+2006-03-06
+2006-03-07
+2006-03-08
+2006-03-09
+2006-03-10
+2006-03-11
+2006-03-12
+2006-03-13
+2006-03-14
+2006-03-15
+2006-03-16
+2006-03-17
+2006-03-18
+2006-03-19
+2006-03-20
+2006-03-21
+2006-03-22
+2006-03-23
+2006-03-24
+2006-03-25
+2006-03-26
+2006-03-27
+2006-03-28
+2006-03-29
+2006-03-30
+2006-03-31
+2006-04-01
+2006-04-02
+2006-04-03
+2006-04-04
+2006-04-05
+2006-04-06
+2006-04-07
+2006-04-08
+2006-04-09
+2006-04-10
+2006-04-11
+2006-04-12
+2006-04-13
+2006-04-14
+2006-04-15
+2006-04-16
+2006-04-17
+2006-04-18
+2006-04-19
+2006-04-20
+2006-04-21
+2006-04-22
+2006-04-23
+2006-04-24
+2006-04-25
+2006-04-26
+2006-04-27
+2006-04-28
+2006-04-29
+2006-04-30
+2006-05-01
+2006-05-02
+2006-05-03
+2006-05-04
+2006-05-05
+2006-05-06
+2006-05-07
+2006-05-08
+2006-05-09
+2006-05-10
+2006-05-11
+2006-05-12
+2006-05-13
+2006-05-14
+2006-05-15
+2006-05-16
+2006-05-17
+2006-05-18
+2006-05-19
+2006-05-20
+2006-05-21
+2006-05-22
+2006-05-23
+2006-05-24
+2006-05-25
+2006-05-26
+2006-05-27
+2006-05-28
+2006-05-29
+2006-05-30
+2006-05-31
+2006-06-01
+2006-06-02
+2006-06-03
+2006-06-04
+2006-06-05
+2006-06-06
+2006-06-07
+2006-06-08
+2006-06-09
+2006-06-10
+2006-06-11
+2006-06-12
+2006-06-13
+2006-06-14
+2006-06-15
+2006-06-16
+2006-06-17
+2006-06-18
+2006-06-19
+2006-06-20
+2006-06-21
+2006-06-22
+2006-06-23
+2006-06-24
+2006-06-25
+2006-06-26
+2006-06-27
+2006-06-28
+2006-06-29
+2006-06-30
+2006-07-01
+2006-07-02
+2006-07-03
+2006-07-04
+2006-07-05
+2006-07-06
+2006-07-07
+2006-07-08
+2006-07-09
+2006-07-10
+2006-07-11
+2006-07-12
+2006-07-13
+2006-07-14
+2006-07-15
+2006-07-16
+2006-07-17
+2006-07-18
+2006-07-19
+2006-07-20
+2006-07-21
+2006-07-22
+2006-07-23
+2006-07-24
+2006-07-25
+2006-07-26
+2006-07-27
+2006-07-28
+2006-07-29
+2006-07-30
+2006-07-31
+2006-08-01
+2006-08-02
+2006-08-03
+2006-08-04
+2006-08-05
+2006-08-06
+2006-08-07
+2006-08-08
+2006-08-09
+2006-08-10
+2006-08-11
+2006-08-12
+2006-08-13
+2006-08-14
+2006-08-15
+2006-08-16
+2006-08-17
+2006-08-18
+2006-08-19
+2006-08-20
+2006-08-21
+2006-08-22
+2006-08-23
+2006-08-24
+2006-08-25
+2006-08-26
+2006-08-27
+2006-08-28
+2006-08-29
+2006-08-30
+2006-08-31
+2006-09-01
+2006-09-02
+2006-09-03
+2006-09-04
+2006-09-05
+2006-09-06
+2006-09-07
+2006-09-08
+2006-09-09
+2006-09-10
+2006-09-11
+2006-09-12
+2006-09-13
+2006-09-14
+2006-09-15
+2006-09-16
+2006-09-17
+2006-09-18
+2006-09-19
+2006-09-20
+2006-09-21
+2006-09-22
+2006-09-23
+2006-09-24
+2006-09-25
+2006-09-26
+2006-09-27
+2006-09-28
+2006-09-29
+2006-09-30
+2006-10-01
+2006-10-02
+2006-10-03
+2006-10-04
+2006-10-05
+2006-10-06
+2006-10-07
+2006-10-08
+2006-10-09
+2006-10-10
+2006-10-11
+2006-10-12
+2006-10-13
+2006-10-14
+2006-10-15
+2006-10-16
+2006-10-17
+2006-10-18
+2006-10-19
+2006-10-20
+2006-10-21
+2006-10-22
+2006-10-23
+2006-10-24
+2006-10-25
+2006-10-26
+2006-10-27
+2006-10-28
+2006-10-29
+2006-10-30
+2006-10-31
+2006-11-01
+2006-11-02
+2006-11-03
+2006-11-04
+2006-11-05
+2006-11-06
+2006-11-07
+2006-11-08
+2006-11-09
+2006-11-10
+2006-11-11
+2006-11-12
+2006-11-13
+2006-11-14
+2006-11-15
+2006-11-16
+2006-11-17
+2006-11-18
+2006-11-19
+2006-11-20
+2006-11-21
+2006-11-22
+2006-11-23
+2006-11-24
+2006-11-25
+2006-11-26
+2006-11-27
+2006-11-28
+2006-11-29
+2006-11-30
+2006-12-01
+2006-12-02
+2006-12-03
+2006-12-04
+2006-12-05
+2006-12-06
+2006-12-07
+2006-12-08
+2006-12-09
+2006-12-10
+2006-12-11
+2006-12-12
+2006-12-13
+2006-12-14
+2006-12-15
+2006-12-16
+2006-12-17
+2006-12-18
+2006-12-19
+2006-12-20
+2006-12-21
+2006-12-22
+2006-12-23
+2006-12-24
+2006-12-25
+2006-12-26
+2006-12-27
+2006-12-28
+2006-12-29
+2006-12-30
+2006-12-31
+2007-01-01
+2007-01-02
+2007-01-03
+2007-01-04
+2007-01-05
+2007-01-06
+2007-01-07
+2007-01-08
+2007-01-09
+2007-01-10
+2007-01-11
+2007-01-12
+2007-01-13
+2007-01-14
+2007-01-15
+2007-01-16
+2007-01-17
+2007-01-18
+2007-01-19
+2007-01-20
+2007-01-21
+2007-01-22
+2007-01-23
+2007-01-24
+2007-01-25
+2007-01-26
+2007-01-27
+2007-01-28
+2007-01-29
+2007-01-30
+2007-01-31
+2007-02-01
+2007-02-02
+2007-02-03
+2007-02-04
+2007-02-05
+2007-02-06
+2007-02-07
+2007-02-08
+2007-02-09
+2007-02-10
+2007-02-11
+2007-02-12
+2007-02-13
+2007-02-14
+2007-02-15
+2007-02-16
+2007-02-17
+2007-02-18
+2007-02-19
+2007-02-20
+2007-02-21
+2007-02-22
+2007-02-23
+2007-02-24
+2007-02-25
+2007-02-26
+2007-02-27
+2007-02-28
+2007-03-01
+2007-03-02
+2007-03-03
+2007-03-04
+2007-03-05
+2007-03-06
+2007-03-07
+2007-03-08
+2007-03-09
+2007-03-10
+2007-03-11
+2007-03-12
+2007-03-13
+2007-03-14
+2007-03-15
+2007-03-16
+2007-03-17
+2007-03-18
+2007-03-19
+2007-03-20
+2007-03-21
+2007-03-22
+2007-03-23
+2007-03-24
+2007-03-25
+2007-03-26
+2007-03-27
+2007-03-28
+2007-03-29
+2007-03-30
+2007-03-31
+2007-04-01
+2007-04-02
+2007-04-03
+2007-04-04
+2007-04-05
+2007-04-06
+2007-04-07
+2007-04-08
+2007-04-09
+2007-04-10
+2007-04-11
+2007-04-12
+2007-04-13
+2007-04-14
+2007-04-15
+2007-04-16
+2007-04-17
+2007-04-18
+2007-04-19
+2007-04-20
+2007-04-21
+2007-04-22
+2007-04-23
+2007-04-24
+2007-04-25
+2007-04-26
+2007-04-27
+2007-04-28
+2007-04-29
+2007-04-30
+2007-05-01
+2007-05-02
+2007-05-03
+2007-05-04
+2007-05-05
+2007-05-06
+2007-05-07
+2007-05-08
+2007-05-09
+2007-05-10
+2007-05-11
+2007-05-12
+2007-05-13
+2007-05-14
+2007-05-15
+2007-05-16
+2007-05-17
+2007-05-18
+2007-05-19
+2007-05-20
+2007-05-21
+2007-05-22
+2007-05-23
+2007-05-24
+2007-05-25
+2007-05-26
+2007-05-27
+2007-05-28
+2007-05-29
+2007-05-30
+2007-05-31
+2007-06-01
+2007-06-02
+2007-06-03
+2007-06-04
+2007-06-05
+2007-06-06
+2007-06-07
+2007-06-08
+2007-06-09
+2007-06-10
+2007-06-11
+2007-06-12
+2007-06-13
+2007-06-14
+2007-06-15
+2007-06-16
+2007-06-17
+2007-06-18
+2007-06-19
+2007-06-20
+2007-06-21
+2007-06-22
+2007-06-23
+2007-06-24
+2007-06-25
+2007-06-26
+2007-06-27
+2007-06-28
+2007-06-29
+2007-06-30
+2007-07-01
+2007-07-02
+2007-07-03
+2007-07-04
+2007-07-05
+2007-07-06
+2007-07-07
+2007-07-08
+2007-07-09
+2007-07-10
+2007-07-11
+2007-07-12
+2007-07-13
+2007-07-14
+2007-07-15
+2007-07-16
+2007-07-17
+2007-07-18
+2007-07-19
+2007-07-20
+2007-07-21
+2007-07-22
+2007-07-23
+2007-07-24
+2007-07-25
+2007-07-26
+2007-07-27
+2007-07-28
+2007-07-29
+2007-07-30
+2007-07-31
+2007-08-01
+2007-08-02
+2007-08-03
+2007-08-04
+2007-08-05
+2007-08-06
+2007-08-07
+2007-08-08
+2007-08-09
+2007-08-10
+2007-08-11
+2007-08-12
+2007-08-13
+2007-08-14
+2007-08-15
+2007-08-16
+2007-08-17
+2007-08-18
+2007-08-19
+2007-08-20
+2007-08-21
+2007-08-22
+2007-08-23
+2007-08-24
+2007-08-25
+2007-08-26
+2007-08-27
+2007-08-28
+2007-08-29
+2007-08-30
+2007-08-31
+2007-09-01
+2007-09-02
+2007-09-03
+2007-09-04
+2007-09-05
+2007-09-06
+2007-09-07
+2007-09-08
+2007-09-09
+2007-09-10
+2007-09-11
+2007-09-12
+2007-09-13
+2007-09-14
+2007-09-15
+2007-09-16
+2007-09-17
+2007-09-18
+2007-09-19
+2007-09-20
+2007-09-21
+2007-09-22
+2007-09-23
+2007-09-24
+2007-09-25
+2007-09-26
+2007-09-27
+2007-09-28
+2007-09-29
+2007-09-30
+2007-10-01
+2007-10-02
+2007-10-03
+2007-10-04
+2007-10-05
+2007-10-06
+2007-10-07
+2007-10-08
+2007-10-09
+2007-10-10
+2007-10-11
+2007-10-12
+2007-10-13
+2007-10-14
+2007-10-15
+2007-10-16
+2007-10-17
+2007-10-18
+2007-10-19
+2007-10-20
+2007-10-21
+2007-10-22
+2007-10-23
+2007-10-24
+2007-10-25
+2007-10-26
+2007-10-27
+2007-10-28
+2007-10-29
+2007-10-30
+2007-10-31
+2007-11-01
+2007-11-02
+2007-11-03
+2007-11-04
+2007-11-05
+2007-11-06
+2007-11-07
+2007-11-08
+2007-11-09
+2007-11-10
+2007-11-11
+2007-11-12
+2007-11-13
+2007-11-14
+2007-11-15
+2007-11-16
+2007-11-17
+2007-11-18
+2007-11-19
+2007-11-20
+2007-11-21
+2007-11-22
+2007-11-23
+2007-11-24
+2007-11-25
+2007-11-26
+2007-11-27
+2007-11-28
+2007-11-29
+2007-11-30
+2007-12-01
+2007-12-02
+2007-12-03
+2007-12-04
+2007-12-05
+2007-12-06
+2007-12-07
+2007-12-08
+2007-12-09
+2007-12-10
+2007-12-11
+2007-12-12
+2007-12-13
+2007-12-14
+2007-12-15
+2007-12-16
+2007-12-17
+2007-12-18
+2007-12-19
+2007-12-20
+2007-12-21
+2007-12-22
+2007-12-23
+2007-12-24
+2007-12-25
+2007-12-26
+2007-12-27
+2007-12-28
+2007-12-29
+2007-12-30
+2007-12-31
+2008-01-01
+2008-01-02
+2008-01-03
+2008-01-04
+2008-01-05
+2008-01-06
+2008-01-07
+2008-01-08
+2008-01-09
+2008-01-10
+2008-01-11
+2008-01-12
+2008-01-13
+2008-01-14
+2008-01-15
+2008-01-16
+2008-01-17
+2008-01-18
+2008-01-19
+2008-01-20
+2008-01-21
+2008-01-22
+2008-01-23
+2008-01-24
+2008-01-25
+2008-01-26
+2008-01-27
+2008-01-28
+2008-01-29
+2008-01-30
+2008-01-31
+2008-02-01
+2008-02-02
+2008-02-03
+2008-02-04
+2008-02-05
+2008-02-06
+2008-02-07
+2008-02-08
+2008-02-09
+2008-02-10
+2008-02-11
+2008-02-12
+2008-02-13
+2008-02-14
+2008-02-15
+2008-02-16
+2008-02-17
+2008-02-18
+2008-02-19
+2008-02-20
+2008-02-21
+2008-02-22
+2008-02-23
+2008-02-24
+2008-02-25
+2008-02-26
+2008-02-27
+2008-02-28
+2008-02-29
+2008-03-01
+2008-03-02
+2008-03-03
+2008-03-04
+2008-03-05
+2008-03-06
+2008-03-07
+2008-03-08
+2008-03-09
+2008-03-10
+2008-03-11
+2008-03-12
+2008-03-13
+2008-03-14
+2008-03-15
+2008-03-16
+2008-03-17
+2008-03-18
+2008-03-19
+2008-03-20
+2008-03-21
+2008-03-22
+2008-03-23
+2008-03-24
+2008-03-25
+2008-03-26
+2008-03-27
+2008-03-28
+2008-03-29
+2008-03-30
+2008-03-31
+2008-04-01
+2008-04-02
+2008-04-03
+2008-04-04
+2008-04-05
+2008-04-06
+2008-04-07
+2008-04-08
+2008-04-09
+2008-04-10
+2008-04-11
+2008-04-12
+2008-04-13
+2008-04-14
+2008-04-15
+2008-04-16
+2008-04-17
+2008-04-18
+2008-04-19
+2008-04-20
+2008-04-21
+2008-04-22
+2008-04-23
+2008-04-24
+2008-04-25
+2008-04-26
+2008-04-27
+2008-04-28
+2008-04-29
+2008-04-30
+2008-05-01
+2008-05-02
+2008-05-03
+2008-05-04
+2008-05-05
+2008-05-06
+2008-05-07
+2008-05-08
+2008-05-09
+2008-05-10
+2008-05-11
+2008-05-12
+2008-05-13
+2008-05-14
+2008-05-15
+2008-05-16
+2008-05-17
+2008-05-18
+2008-05-19
+2008-05-20
+2008-05-21
+2008-05-22
+2008-05-23
+2008-05-24
+2008-05-25
+2008-05-26
+2008-05-27
+2008-05-28
+2008-05-29
+2008-05-30
+2008-05-31
+2008-06-01
+2008-06-02
+2008-06-03
+2008-06-04
+2008-06-05
+2008-06-06
+2008-06-07
+2008-06-08
+2008-06-09
+2008-06-10
+2008-06-11
+2008-06-12
+2008-06-13
+2008-06-14
+2008-06-15
+2008-06-16
+2008-06-17
+2008-06-18
+2008-06-19
+2008-06-20
+2008-06-21
+2008-06-22
+2008-06-23
+2008-06-24
+2008-06-25
+2008-06-26
+2008-06-27
+2008-06-28
+2008-06-29
+2008-06-30
+2008-07-01
+2008-07-02
+2008-07-03
+2008-07-04
+2008-07-05
+2008-07-06
+2008-07-07
+2008-07-08
+2008-07-09
+2008-07-10
+2008-07-11
+2008-07-12
+2008-07-13
+2008-07-14
+2008-07-15
+2008-07-16
+2008-07-17
+2008-07-18
+2008-07-19
+2008-07-20
+2008-07-21
+2008-07-22
+2008-07-23
+2008-07-24
+2008-07-25
+2008-07-26
+2008-07-27
+2008-07-28
+2008-07-29
+2008-07-30
+2008-07-31
+2008-08-01
+2008-08-02
+2008-08-03
+2008-08-04
+2008-08-05
+2008-08-06
+2008-08-07
+2008-08-08
+2008-08-09
+2008-08-10
+2008-08-11
+2008-08-12
+2008-08-13
+2008-08-14
+2008-08-15
+2008-08-16
+2008-08-17
+2008-08-18
+2008-08-19
+2008-08-20
+2008-08-21
+2008-08-22
+2008-08-23
+2008-08-24
+2008-08-25
+2008-08-26
+2008-08-27
+2008-08-28
+2008-08-29
+2008-08-30
+2008-08-31
+2008-09-01
+2008-09-02
+2008-09-03
+2008-09-04
+2008-09-05
+2008-09-06
+2008-09-07
+2008-09-08
+2008-09-09
+2008-09-10
+2008-09-11
+2008-09-12
+2008-09-13
+2008-09-14
+2008-09-15
+2008-09-16
+2008-09-17
+2008-09-18
+2008-09-19
+2008-09-20
+2008-09-21
+2008-09-22
+2008-09-23
+2008-09-24
+2008-09-25
+2008-09-26
+2008-09-27
+2008-09-28
+2008-09-29
+2008-09-30
+2008-10-01
+2008-10-02
+2008-10-03
+2008-10-04
+2008-10-05
+2008-10-06
+2008-10-07
+2008-10-08
+2008-10-09
+2008-10-10
+2008-10-11
+2008-10-12
+2008-10-13
+2008-10-14
+2008-10-15
+2008-10-16
+2008-10-17
+2008-10-18
+2008-10-19
+2008-10-20
+2008-10-21
+2008-10-22
+2008-10-23
+2008-10-24
+2008-10-25
+2008-10-26
+2008-10-27
+2008-10-28
+2008-10-29
+2008-10-30
+2008-10-31
+2008-11-01
+2008-11-02
+2008-11-03
+2008-11-04
+2008-11-05
+2008-11-06
+2008-11-07
+2008-11-08
+2008-11-09
+2008-11-10
+2008-11-11
+2008-11-12
+2008-11-13
+2008-11-14
+2008-11-15
+2008-11-16
+2008-11-17
+2008-11-18
+2008-11-19
+2008-11-20
+2008-11-21
+2008-11-22
+2008-11-23
+2008-11-24
+2008-11-25
+2008-11-26
+2008-11-27
+2008-11-28
+2008-11-29
+2008-11-30
+2008-12-01
+2008-12-02
+2008-12-03
+2008-12-04
+2008-12-05
+2008-12-06
+2008-12-07
+2008-12-08
+2008-12-09
+2008-12-10
+2008-12-11
+2008-12-12
+2008-12-13
+2008-12-14
+2008-12-15
+2008-12-16
+2008-12-17
+2008-12-18
+2008-12-19
+2008-12-20
+2008-12-21
+2008-12-22
+2008-12-23
+2008-12-24
+2008-12-25
+2008-12-26
+2008-12-27
+2008-12-28
+2008-12-29
+2008-12-30
+2008-12-31
+2009-01-01
+2009-01-02
+2009-01-03
+2009-01-04
+2009-01-05
+2009-01-06
+2009-01-07
+2009-01-08
+2009-01-09
+2009-01-10
+2009-01-11
+2009-01-12
+2009-01-13
+2009-01-14
+2009-01-15
+2009-01-16
+2009-01-17
+2009-01-18
+2009-01-19
+2009-01-20
+2009-01-21
+2009-01-22
+2009-01-23
+2009-01-24
+2009-01-25
+2009-01-26
+2009-01-27
+2009-01-28
+2009-01-29
+2009-01-30
+2009-01-31
+2009-02-01
+2009-02-02
+2009-02-03
+2009-02-04
+2009-02-05
+2009-02-06
+2009-02-07
+2009-02-08
+2009-02-09
+2009-02-10
+2009-02-11
+2009-02-12
+2009-02-13
+2009-02-14
+2009-02-15
+2009-02-16
+2009-02-17
+2009-02-18
+2009-02-19
+2009-02-20
+2009-02-21
+2009-02-22
+2009-02-23
+2009-02-24
+2009-02-25
+2009-02-26
+2009-02-27
+2009-02-28
+2009-03-01
+2009-03-02
+2009-03-03
+2009-03-04
+2009-03-05
+2009-03-06
+2009-03-07
+2009-03-08
+2009-03-09
+2009-03-10
+2009-03-11
+2009-03-12
+2009-03-13
+2009-03-14
+2009-03-15
+2009-03-16
+2009-03-17
+2009-03-18
+2009-03-19
+2009-03-20
+2009-03-21
+2009-03-22
+2009-03-23
+2009-03-24
+2009-03-25
+2009-03-26
+2009-03-27
+2009-03-28
+2009-03-29
+2009-03-30
+2009-03-31
+2009-04-01
+2009-04-02
+2009-04-03
+2009-04-04
+2009-04-05
+2009-04-06
+2009-04-07
+2009-04-08
+2009-04-09
+2009-04-10
+2009-04-11
+2009-04-12
+2009-04-13
+2009-04-14
+2009-04-15
+2009-04-16
+2009-04-17
+2009-04-18
+2009-04-19
+2009-04-20
+2009-04-21
+2009-04-22
+2009-04-23
+2009-04-24
+2009-04-25
+2009-04-26
+2009-04-27
+2009-04-28
+2009-04-29
+2009-04-30
+2009-05-01
+2009-05-02
+2009-05-03
+2009-05-04
+2009-05-05
+2009-05-06
+2009-05-07
+2009-05-08
+2009-05-09
+2009-05-10
+2009-05-11
+2009-05-12
+2009-05-13
+2009-05-14
+2009-05-15
+2009-05-16
+2009-05-17
+2009-05-18
+2009-05-19
+2009-05-20
+2009-05-21
+2009-05-22
+2009-05-23
+2009-05-24
+2009-05-25
+2009-05-26
+2009-05-27
+2009-05-28
+2009-05-29
+2009-05-30
+2009-05-31
+2009-06-01
+2009-06-02
+2009-06-03
+2009-06-04
+2009-06-05
+2009-06-06
+2009-06-07
+2009-06-08
+2009-06-09
+2009-06-10
+2009-06-11
+2009-06-12
+2009-06-13
+2009-06-14
+2009-06-15
+2009-06-16
+2009-06-17
+2009-06-18
+2009-06-19
+2009-06-20
+2009-06-21
+2009-06-22
+2009-06-23
+2009-06-24
+2009-06-25
+2009-06-26
+2009-06-27
+2009-06-28
+2009-06-29
+2009-06-30
+2009-07-01
+2009-07-02
+2009-07-03
+2009-07-04
+2009-07-05
+2009-07-06
+2009-07-07
+2009-07-08
+2009-07-09
+2009-07-10
+2009-07-11
+2009-07-12
+2009-07-13
+2009-07-14
+2009-07-15
+2009-07-16
+2009-07-17
+2009-07-18
+2009-07-19
+2009-07-20
+2009-07-21
+2009-07-22
+2009-07-23
+2009-07-24
+2009-07-25
+2009-07-26
+2009-07-27
+2009-07-28
+2009-07-29
+2009-07-30
+2009-07-31
+2009-08-01
+2009-08-02
+2009-08-03
+2009-08-04
+2009-08-05
+2009-08-06
+2009-08-07
+2009-08-08
+2009-08-09
+2009-08-10
+2009-08-11
+2009-08-12
+2009-08-13
+2009-08-14
+2009-08-15
+2009-08-16
+2009-08-17
+2009-08-18
+2009-08-19
+2009-08-20
+2009-08-21
+2009-08-22
+2009-08-23
+2009-08-24
+2009-08-25
+2009-08-26
+2009-08-27
+2009-08-28
+2009-08-29
+2009-08-30
+2009-08-31
+2009-09-01
+2009-09-02
+2009-09-03
+2009-09-04
+2009-09-05
+2009-09-06
+2009-09-07
+2009-09-08
+2009-09-09
+2009-09-10
+2009-09-11
+2009-09-12
+2009-09-13
+2009-09-14
+2009-09-15
+2009-09-16
+2009-09-17
+2009-09-18
+2009-09-19
+2009-09-20
+2009-09-21
+2009-09-22
+2009-09-23
+2009-09-24
+2009-09-25
+2009-09-26
+2009-09-27
+2009-09-28
+2009-09-29
+2009-09-30
+2009-10-01
+2009-10-02
+2009-10-03
+2009-10-04
+2009-10-05
+2009-10-06
+2009-10-07
+2009-10-08
+2009-10-09
+2009-10-10
+2009-10-11
+2009-10-12
+2009-10-13
+2009-10-14
+2009-10-15
+2009-10-16
+2009-10-17
+2009-10-18
+2009-10-19
+2009-10-20
+2009-10-21
+2009-10-22
+2009-10-23
+2009-10-24
+2009-10-25
+2009-10-26
+2009-10-27
+2009-10-28
+2009-10-29
+2009-10-30
+2009-10-31
+2009-11-01
+2009-11-02
+2009-11-03
+2009-11-04
+2009-11-05
+2009-11-06
+2009-11-07
+2009-11-08
+2009-11-09
+2009-11-10
+2009-11-11
+2009-11-12
+2009-11-13
+2009-11-14
+2009-11-15
+2009-11-16
+2009-11-17
+2009-11-18
+2009-11-19
+2009-11-20
+2009-11-21
+2009-11-22
+2009-11-23
+2009-11-24
+2009-11-25
+2009-11-26
+2009-11-27
+2009-11-28
+2009-11-29
+2009-11-30
+2009-12-01
+2009-12-02
+2009-12-03
+2009-12-04
+2009-12-05
+2009-12-06
+2009-12-07
+2009-12-08
+2009-12-09
+2009-12-10
+2009-12-11
+2009-12-12
+2009-12-13
+2009-12-14
+2009-12-15
+2009-12-16
+2009-12-17
+2009-12-18
+2009-12-19
+2009-12-20
+2009-12-21
+2009-12-22
+2009-12-23
+2009-12-24
+2009-12-25
+2009-12-26
+2009-12-27
+2009-12-28
+2009-12-29
+2009-12-30
+2009-12-31
+2010-01-01
+2010-01-02
+2010-01-03
+2010-01-04
+2010-01-05
+2010-01-06
+2010-01-07
+2010-01-08
+2010-01-09
+2010-01-10
+2010-01-11
+2010-01-12
+2010-01-13
+2010-01-14
+2010-01-15
+2010-01-16
+2010-01-17
+2010-01-18
+2010-01-19
+2010-01-20
+2010-01-21
+2010-01-22
+2010-01-23
+2010-01-24
+2010-01-25
+2010-01-26
+2010-01-27
+2010-01-28
+2010-01-29
+2010-01-30
+2010-01-31
+2010-02-01
+2010-02-02
+2010-02-03
+2010-02-04
+2010-02-05
+2010-02-06
+2010-02-07
+2010-02-08
+2010-02-09
+2010-02-10
+2010-02-11
+2010-02-12
+2010-02-13
+2010-02-14
+2010-02-15
+2010-02-16
+2010-02-17
+2010-02-18
+2010-02-19
+2010-02-20
+2010-02-21
+2010-02-22
+2010-02-23
+2010-02-24
+2010-02-25
+2010-02-26
+2010-02-27
+2010-02-28
+2010-03-01
+2010-03-02
+2010-03-03
+2010-03-04
+2010-03-05
+2010-03-06
+2010-03-07
+2010-03-08
+2010-03-09
+2010-03-10
+2010-03-11
+2010-03-12
+2010-03-13
+2010-03-14
+2010-03-15
+2010-03-16
+2010-03-17
+2010-03-18
+2010-03-19
+2010-03-20
+2010-03-21
+2010-03-22
+2010-03-23
+2010-03-24
+2010-03-25
+2010-03-26
+2010-03-27
+2010-03-28
+2010-03-29
+2010-03-30
+2010-03-31
+2010-04-01
+2010-04-02
+2010-04-03
+2010-04-04
+2010-04-05
+2010-04-06
+2010-04-07
+2010-04-08
+2010-04-09
+2010-04-10
+2010-04-11
+2010-04-12
+2010-04-13
+2010-04-14
+2010-04-15
+2010-04-16
+2010-04-17
+2010-04-18
+2010-04-19
+2010-04-20
+2010-04-21
+2010-04-22
+2010-04-23
+2010-04-24
+2010-04-25
+2010-04-26
+2010-04-27
+2010-04-28
+2010-04-29
+2010-04-30
+2010-05-01
+2010-05-02
+2010-05-03
+2010-05-04
+2010-05-05
+2010-05-06
+2010-05-07
+2010-05-08
+2010-05-09
+2010-05-10
+2010-05-11
+2010-05-12
+2010-05-13
+2010-05-14
+2010-05-15
+2010-05-16
+2010-05-17
+2010-05-18
+2010-05-19
+2010-05-20
+2010-05-21
+2010-05-22
+2010-05-23
+2010-05-24
+2010-05-25
+2010-05-26
+2010-05-27
+2010-05-28
+2010-05-29
+2010-05-30
+2010-05-31
+2010-06-01
+2010-06-02
+2010-06-03
+2010-06-04
+2010-06-05
+2010-06-06
+2010-06-07
+2010-06-08
+2010-06-09
+2010-06-10
+2010-06-11
+2010-06-12
+2010-06-13
+2010-06-14
+2010-06-15
+2010-06-16
+2010-06-17
+2010-06-18
+2010-06-19
+2010-06-20
+2010-06-21
+2010-06-22
+2010-06-23
+2010-06-24
+2010-06-25
+2010-06-26
+2010-06-27
+2010-06-28
+2010-06-29
+2010-06-30
+2010-07-01
+2010-07-02
+2010-07-03
+2010-07-04
+2010-07-05
+2010-07-06
+2010-07-07
+2010-07-08
+2010-07-09
+2010-07-10
+2010-07-11
+2010-07-12
+2010-07-13
+2010-07-14
+2010-07-15
+2010-07-16
+2010-07-17
+2010-07-18
+2010-07-19
+2010-07-20
+2010-07-21
+2010-07-22
+2010-07-23
+2010-07-24
+2010-07-25
+2010-07-26
+2010-07-27
+2010-07-28
+2010-07-29
+2010-07-30
+2010-07-31
+2010-08-01
+2010-08-02
+2010-08-03
+2010-08-04
+2010-08-05
+2010-08-06
+2010-08-07
+2010-08-08
+2010-08-09
+2010-08-10
+2010-08-11
+2010-08-12
+2010-08-13
+2010-08-14
+2010-08-15
+2010-08-16
+2010-08-17
+2010-08-18
+2010-08-19
+2010-08-20
+2010-08-21
+2010-08-22
+2010-08-23
+2010-08-24
+2010-08-25
+2010-08-26
+2010-08-27
+2010-08-28
+2010-08-29
+2010-08-30
+2010-08-31
+2010-09-01
+2010-09-02
+2010-09-03
+2010-09-04
+2010-09-05
+2010-09-06
+2010-09-07
+2010-09-08
+2010-09-09
+2010-09-10
+2010-09-11
+2010-09-12
+2010-09-13
+2010-09-14
+2010-09-15
+2010-09-16
+2010-09-17
+2010-09-18
+2010-09-19
+2010-09-20
+2010-09-21
+2010-09-22
+2010-09-23
+2010-09-24
+2010-09-25
+2010-09-26
+2010-09-27
+2010-09-28
+2010-09-29
+2010-09-30
+2010-10-01
+2010-10-02
+2010-10-03
+2010-10-04
+2010-10-05
+2010-10-06
+2010-10-07
+2010-10-08
+2010-10-09
+2010-10-10
+2010-10-11
+2010-10-12
+2010-10-13
+2010-10-14
+2010-10-15
+2010-10-16
+2010-10-17
+2010-10-18
+2010-10-19
+2010-10-20
+2010-10-21
+2010-10-22
+2010-10-23
+2010-10-24
+2010-10-25
+2010-10-26
+2010-10-27
+2010-10-28
+2010-10-29
+2010-10-30
+2010-10-31
+2010-11-01
+2010-11-02
+2010-11-03
+2010-11-04
+2010-11-05
+2010-11-06
+2010-11-07
+2010-11-08
+2010-11-09
+2010-11-10
+2010-11-11
+2010-11-12
+2010-11-13
+2010-11-14
+2010-11-15
+2010-11-16
+2010-11-17
+2010-11-18
+2010-11-19
+2010-11-20
+2010-11-21
+2010-11-22
+2010-11-23
+2010-11-24
+2010-11-25
+2010-11-26
+2010-11-27
+2010-11-28
+2010-11-29
+2010-11-30
+2010-12-01
+2010-12-02
+2010-12-03
+2010-12-04
+2010-12-05
+2010-12-06
+2010-12-07
+2010-12-08
+2010-12-09
+2010-12-10
+2010-12-11
+2010-12-12
+2010-12-13
+2010-12-14
+2010-12-15
+2010-12-16
+2010-12-17
+2010-12-18
+2010-12-19
+2010-12-20
+2010-12-21
+2010-12-22
+2010-12-23
+2010-12-24
+2010-12-25
+2010-12-26
+2010-12-27
+2010-12-28
+2010-12-29
+2010-12-30
+2010-12-31
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase04.ics b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase04.ics
new file mode 100644
index 00000000..f2a55fd4
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase04.ics
@@ -0,0 +1,24 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KAlarm 1.2.6//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20050522T130601
+CREATED:20050522T124630
+UID:KAlarm-333577782.218
+SEQUENCE:1
+LAST-MODIFIED:20050522T124702
+CLASS:PUBLIC
+PRIORITY:5
+CATEGORIES:SAVE
+RRULE:FREQ=MINUTELY;INTERVAL=243
+DTSTART:20050522T124700
+TRANSP:OPAQUE
+BEGIN:VALARM
+DESCRIPTION:Every 4 hours 3 minutes
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:PT4H3M
+X-KDE-KALARM-FONTCOLOR:#ff0000\;#000000\;
+END:VALARM
+
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase04.ics.next.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase04.ics.next.ref
new file mode 100644
index 00000000..d06ef546
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase04.ics.next.ref
@@ -0,0 +1,500 @@
+2005-05-22T12:47:00
+2005-05-22T16:50:00
+2005-05-22T20:53:00
+2005-05-23T00:56:00
+2005-05-23T04:59:00
+2005-05-23T09:02:00
+2005-05-23T13:05:00
+2005-05-23T17:08:00
+2005-05-23T21:11:00
+2005-05-24T01:14:00
+2005-05-24T05:17:00
+2005-05-24T09:20:00
+2005-05-24T13:23:00
+2005-05-24T17:26:00
+2005-05-24T21:29:00
+2005-05-25T01:32:00
+2005-05-25T05:35:00
+2005-05-25T09:38:00
+2005-05-25T13:41:00
+2005-05-25T17:44:00
+2005-05-25T21:47:00
+2005-05-26T01:50:00
+2005-05-26T05:53:00
+2005-05-26T09:56:00
+2005-05-26T13:59:00
+2005-05-26T18:02:00
+2005-05-26T22:05:00
+2005-05-27T02:08:00
+2005-05-27T06:11:00
+2005-05-27T10:14:00
+2005-05-27T14:17:00
+2005-05-27T18:20:00
+2005-05-27T22:23:00
+2005-05-28T02:26:00
+2005-05-28T06:29:00
+2005-05-28T10:32:00
+2005-05-28T14:35:00
+2005-05-28T18:38:00
+2005-05-28T22:41:00
+2005-05-29T02:44:00
+2005-05-29T06:47:00
+2005-05-29T10:50:00
+2005-05-29T14:53:00
+2005-05-29T18:56:00
+2005-05-29T22:59:00
+2005-05-30T03:02:00
+2005-05-30T07:05:00
+2005-05-30T11:08:00
+2005-05-30T15:11:00
+2005-05-30T19:14:00
+2005-05-30T23:17:00
+2005-05-31T03:20:00
+2005-05-31T07:23:00
+2005-05-31T11:26:00
+2005-05-31T15:29:00
+2005-05-31T19:32:00
+2005-05-31T23:35:00
+2005-06-01T03:38:00
+2005-06-01T07:41:00
+2005-06-01T11:44:00
+2005-06-01T15:47:00
+2005-06-01T19:50:00
+2005-06-01T23:53:00
+2005-06-02T03:56:00
+2005-06-02T07:59:00
+2005-06-02T12:02:00
+2005-06-02T16:05:00
+2005-06-02T20:08:00
+2005-06-03T00:11:00
+2005-06-03T04:14:00
+2005-06-03T08:17:00
+2005-06-03T12:20:00
+2005-06-03T16:23:00
+2005-06-03T20:26:00
+2005-06-04T00:29:00
+2005-06-04T04:32:00
+2005-06-04T08:35:00
+2005-06-04T12:38:00
+2005-06-04T16:41:00
+2005-06-04T20:44:00
+2005-06-05T00:47:00
+2005-06-05T04:50:00
+2005-06-05T08:53:00
+2005-06-05T12:56:00
+2005-06-05T16:59:00
+2005-06-05T21:02:00
+2005-06-06T01:05:00
+2005-06-06T05:08:00
+2005-06-06T09:11:00
+2005-06-06T13:14:00
+2005-06-06T17:17:00
+2005-06-06T21:20:00
+2005-06-07T01:23:00
+2005-06-07T05:26:00
+2005-06-07T09:29:00
+2005-06-07T13:32:00
+2005-06-07T17:35:00
+2005-06-07T21:38:00
+2005-06-08T01:41:00
+2005-06-08T05:44:00
+2005-06-08T09:47:00
+2005-06-08T13:50:00
+2005-06-08T17:53:00
+2005-06-08T21:56:00
+2005-06-09T01:59:00
+2005-06-09T06:02:00
+2005-06-09T10:05:00
+2005-06-09T14:08:00
+2005-06-09T18:11:00
+2005-06-09T22:14:00
+2005-06-10T02:17:00
+2005-06-10T06:20:00
+2005-06-10T10:23:00
+2005-06-10T14:26:00
+2005-06-10T18:29:00
+2005-06-10T22:32:00
+2005-06-11T02:35:00
+2005-06-11T06:38:00
+2005-06-11T10:41:00
+2005-06-11T14:44:00
+2005-06-11T18:47:00
+2005-06-11T22:50:00
+2005-06-12T02:53:00
+2005-06-12T06:56:00
+2005-06-12T10:59:00
+2005-06-12T15:02:00
+2005-06-12T19:05:00
+2005-06-12T23:08:00
+2005-06-13T03:11:00
+2005-06-13T07:14:00
+2005-06-13T11:17:00
+2005-06-13T15:20:00
+2005-06-13T19:23:00
+2005-06-13T23:26:00
+2005-06-14T03:29:00
+2005-06-14T07:32:00
+2005-06-14T11:35:00
+2005-06-14T15:38:00
+2005-06-14T19:41:00
+2005-06-14T23:44:00
+2005-06-15T03:47:00
+2005-06-15T07:50:00
+2005-06-15T11:53:00
+2005-06-15T15:56:00
+2005-06-15T19:59:00
+2005-06-16T00:02:00
+2005-06-16T04:05:00
+2005-06-16T08:08:00
+2005-06-16T12:11:00
+2005-06-16T16:14:00
+2005-06-16T20:17:00
+2005-06-17T00:20:00
+2005-06-17T04:23:00
+2005-06-17T08:26:00
+2005-06-17T12:29:00
+2005-06-17T16:32:00
+2005-06-17T20:35:00
+2005-06-18T00:38:00
+2005-06-18T04:41:00
+2005-06-18T08:44:00
+2005-06-18T12:47:00
+2005-06-18T16:50:00
+2005-06-18T20:53:00
+2005-06-19T00:56:00
+2005-06-19T04:59:00
+2005-06-19T09:02:00
+2005-06-19T13:05:00
+2005-06-19T17:08:00
+2005-06-19T21:11:00
+2005-06-20T01:14:00
+2005-06-20T05:17:00
+2005-06-20T09:20:00
+2005-06-20T13:23:00
+2005-06-20T17:26:00
+2005-06-20T21:29:00
+2005-06-21T01:32:00
+2005-06-21T05:35:00
+2005-06-21T09:38:00
+2005-06-21T13:41:00
+2005-06-21T17:44:00
+2005-06-21T21:47:00
+2005-06-22T01:50:00
+2005-06-22T05:53:00
+2005-06-22T09:56:00
+2005-06-22T13:59:00
+2005-06-22T18:02:00
+2005-06-22T22:05:00
+2005-06-23T02:08:00
+2005-06-23T06:11:00
+2005-06-23T10:14:00
+2005-06-23T14:17:00
+2005-06-23T18:20:00
+2005-06-23T22:23:00
+2005-06-24T02:26:00
+2005-06-24T06:29:00
+2005-06-24T10:32:00
+2005-06-24T14:35:00
+2005-06-24T18:38:00
+2005-06-24T22:41:00
+2005-06-25T02:44:00
+2005-06-25T06:47:00
+2005-06-25T10:50:00
+2005-06-25T14:53:00
+2005-06-25T18:56:00
+2005-06-25T22:59:00
+2005-06-26T03:02:00
+2005-06-26T07:05:00
+2005-06-26T11:08:00
+2005-06-26T15:11:00
+2005-06-26T19:14:00
+2005-06-26T23:17:00
+2005-06-27T03:20:00
+2005-06-27T07:23:00
+2005-06-27T11:26:00
+2005-06-27T15:29:00
+2005-06-27T19:32:00
+2005-06-27T23:35:00
+2005-06-28T03:38:00
+2005-06-28T07:41:00
+2005-06-28T11:44:00
+2005-06-28T15:47:00
+2005-06-28T19:50:00
+2005-06-28T23:53:00
+2005-06-29T03:56:00
+2005-06-29T07:59:00
+2005-06-29T12:02:00
+2005-06-29T16:05:00
+2005-06-29T20:08:00
+2005-06-30T00:11:00
+2005-06-30T04:14:00
+2005-06-30T08:17:00
+2005-06-30T12:20:00
+2005-06-30T16:23:00
+2005-06-30T20:26:00
+2005-07-01T00:29:00
+2005-07-01T04:32:00
+2005-07-01T08:35:00
+2005-07-01T12:38:00
+2005-07-01T16:41:00
+2005-07-01T20:44:00
+2005-07-02T00:47:00
+2005-07-02T04:50:00
+2005-07-02T08:53:00
+2005-07-02T12:56:00
+2005-07-02T16:59:00
+2005-07-02T21:02:00
+2005-07-03T01:05:00
+2005-07-03T05:08:00
+2005-07-03T09:11:00
+2005-07-03T13:14:00
+2005-07-03T17:17:00
+2005-07-03T21:20:00
+2005-07-04T01:23:00
+2005-07-04T05:26:00
+2005-07-04T09:29:00
+2005-07-04T13:32:00
+2005-07-04T17:35:00
+2005-07-04T21:38:00
+2005-07-05T01:41:00
+2005-07-05T05:44:00
+2005-07-05T09:47:00
+2005-07-05T13:50:00
+2005-07-05T17:53:00
+2005-07-05T21:56:00
+2005-07-06T01:59:00
+2005-07-06T06:02:00
+2005-07-06T10:05:00
+2005-07-06T14:08:00
+2005-07-06T18:11:00
+2005-07-06T22:14:00
+2005-07-07T02:17:00
+2005-07-07T06:20:00
+2005-07-07T10:23:00
+2005-07-07T14:26:00
+2005-07-07T18:29:00
+2005-07-07T22:32:00
+2005-07-08T02:35:00
+2005-07-08T06:38:00
+2005-07-08T10:41:00
+2005-07-08T14:44:00
+2005-07-08T18:47:00
+2005-07-08T22:50:00
+2005-07-09T02:53:00
+2005-07-09T06:56:00
+2005-07-09T10:59:00
+2005-07-09T15:02:00
+2005-07-09T19:05:00
+2005-07-09T23:08:00
+2005-07-10T03:11:00
+2005-07-10T07:14:00
+2005-07-10T11:17:00
+2005-07-10T15:20:00
+2005-07-10T19:23:00
+2005-07-10T23:26:00
+2005-07-11T03:29:00
+2005-07-11T07:32:00
+2005-07-11T11:35:00
+2005-07-11T15:38:00
+2005-07-11T19:41:00
+2005-07-11T23:44:00
+2005-07-12T03:47:00
+2005-07-12T07:50:00
+2005-07-12T11:53:00
+2005-07-12T15:56:00
+2005-07-12T19:59:00
+2005-07-13T00:02:00
+2005-07-13T04:05:00
+2005-07-13T08:08:00
+2005-07-13T12:11:00
+2005-07-13T16:14:00
+2005-07-13T20:17:00
+2005-07-14T00:20:00
+2005-07-14T04:23:00
+2005-07-14T08:26:00
+2005-07-14T12:29:00
+2005-07-14T16:32:00
+2005-07-14T20:35:00
+2005-07-15T00:38:00
+2005-07-15T04:41:00
+2005-07-15T08:44:00
+2005-07-15T12:47:00
+2005-07-15T16:50:00
+2005-07-15T20:53:00
+2005-07-16T00:56:00
+2005-07-16T04:59:00
+2005-07-16T09:02:00
+2005-07-16T13:05:00
+2005-07-16T17:08:00
+2005-07-16T21:11:00
+2005-07-17T01:14:00
+2005-07-17T05:17:00
+2005-07-17T09:20:00
+2005-07-17T13:23:00
+2005-07-17T17:26:00
+2005-07-17T21:29:00
+2005-07-18T01:32:00
+2005-07-18T05:35:00
+2005-07-18T09:38:00
+2005-07-18T13:41:00
+2005-07-18T17:44:00
+2005-07-18T21:47:00
+2005-07-19T01:50:00
+2005-07-19T05:53:00
+2005-07-19T09:56:00
+2005-07-19T13:59:00
+2005-07-19T18:02:00
+2005-07-19T22:05:00
+2005-07-20T02:08:00
+2005-07-20T06:11:00
+2005-07-20T10:14:00
+2005-07-20T14:17:00
+2005-07-20T18:20:00
+2005-07-20T22:23:00
+2005-07-21T02:26:00
+2005-07-21T06:29:00
+2005-07-21T10:32:00
+2005-07-21T14:35:00
+2005-07-21T18:38:00
+2005-07-21T22:41:00
+2005-07-22T02:44:00
+2005-07-22T06:47:00
+2005-07-22T10:50:00
+2005-07-22T14:53:00
+2005-07-22T18:56:00
+2005-07-22T22:59:00
+2005-07-23T03:02:00
+2005-07-23T07:05:00
+2005-07-23T11:08:00
+2005-07-23T15:11:00
+2005-07-23T19:14:00
+2005-07-23T23:17:00
+2005-07-24T03:20:00
+2005-07-24T07:23:00
+2005-07-24T11:26:00
+2005-07-24T15:29:00
+2005-07-24T19:32:00
+2005-07-24T23:35:00
+2005-07-25T03:38:00
+2005-07-25T07:41:00
+2005-07-25T11:44:00
+2005-07-25T15:47:00
+2005-07-25T19:50:00
+2005-07-25T23:53:00
+2005-07-26T03:56:00
+2005-07-26T07:59:00
+2005-07-26T12:02:00
+2005-07-26T16:05:00
+2005-07-26T20:08:00
+2005-07-27T00:11:00
+2005-07-27T04:14:00
+2005-07-27T08:17:00
+2005-07-27T12:20:00
+2005-07-27T16:23:00
+2005-07-27T20:26:00
+2005-07-28T00:29:00
+2005-07-28T04:32:00
+2005-07-28T08:35:00
+2005-07-28T12:38:00
+2005-07-28T16:41:00
+2005-07-28T20:44:00
+2005-07-29T00:47:00
+2005-07-29T04:50:00
+2005-07-29T08:53:00
+2005-07-29T12:56:00
+2005-07-29T16:59:00
+2005-07-29T21:02:00
+2005-07-30T01:05:00
+2005-07-30T05:08:00
+2005-07-30T09:11:00
+2005-07-30T13:14:00
+2005-07-30T17:17:00
+2005-07-30T21:20:00
+2005-07-31T01:23:00
+2005-07-31T05:26:00
+2005-07-31T09:29:00
+2005-07-31T13:32:00
+2005-07-31T17:35:00
+2005-07-31T21:38:00
+2005-08-01T01:41:00
+2005-08-01T05:44:00
+2005-08-01T09:47:00
+2005-08-01T13:50:00
+2005-08-01T17:53:00
+2005-08-01T21:56:00
+2005-08-02T01:59:00
+2005-08-02T06:02:00
+2005-08-02T10:05:00
+2005-08-02T14:08:00
+2005-08-02T18:11:00
+2005-08-02T22:14:00
+2005-08-03T02:17:00
+2005-08-03T06:20:00
+2005-08-03T10:23:00
+2005-08-03T14:26:00
+2005-08-03T18:29:00
+2005-08-03T22:32:00
+2005-08-04T02:35:00
+2005-08-04T06:38:00
+2005-08-04T10:41:00
+2005-08-04T14:44:00
+2005-08-04T18:47:00
+2005-08-04T22:50:00
+2005-08-05T02:53:00
+2005-08-05T06:56:00
+2005-08-05T10:59:00
+2005-08-05T15:02:00
+2005-08-05T19:05:00
+2005-08-05T23:08:00
+2005-08-06T03:11:00
+2005-08-06T07:14:00
+2005-08-06T11:17:00
+2005-08-06T15:20:00
+2005-08-06T19:23:00
+2005-08-06T23:26:00
+2005-08-07T03:29:00
+2005-08-07T07:32:00
+2005-08-07T11:35:00
+2005-08-07T15:38:00
+2005-08-07T19:41:00
+2005-08-07T23:44:00
+2005-08-08T03:47:00
+2005-08-08T07:50:00
+2005-08-08T11:53:00
+2005-08-08T15:56:00
+2005-08-08T19:59:00
+2005-08-09T00:02:00
+2005-08-09T04:05:00
+2005-08-09T08:08:00
+2005-08-09T12:11:00
+2005-08-09T16:14:00
+2005-08-09T20:17:00
+2005-08-10T00:20:00
+2005-08-10T04:23:00
+2005-08-10T08:26:00
+2005-08-10T12:29:00
+2005-08-10T16:32:00
+2005-08-10T20:35:00
+2005-08-11T00:38:00
+2005-08-11T04:41:00
+2005-08-11T08:44:00
+2005-08-11T12:47:00
+2005-08-11T16:50:00
+2005-08-11T20:53:00
+2005-08-12T00:56:00
+2005-08-12T04:59:00
+2005-08-12T09:02:00
+2005-08-12T13:05:00
+2005-08-12T17:08:00
+2005-08-12T21:11:00
+2005-08-13T01:14:00
+2005-08-13T05:17:00
+2005-08-13T09:20:00
+2005-08-13T13:23:00
+2005-08-13T17:26:00
+2005-08-13T21:29:00
+2005-08-14T01:32:00
+2005-08-14T05:35:00
+2005-08-14T09:38:00
+2005-08-14T13:41:00
+2005-08-14T17:44:00
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase04.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase04.ics.prev.ref
new file mode 100644
index 00000000..7b9ee4a5
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase04.ics.prev.ref
@@ -0,0 +1,500 @@
+2010-12-31T19:59:00
+2010-12-31T15:56:00
+2010-12-31T11:53:00
+2010-12-31T07:50:00
+2010-12-31T03:47:00
+2010-12-30T23:44:00
+2010-12-30T19:41:00
+2010-12-30T15:38:00
+2010-12-30T11:35:00
+2010-12-30T07:32:00
+2010-12-30T03:29:00
+2010-12-29T23:26:00
+2010-12-29T19:23:00
+2010-12-29T15:20:00
+2010-12-29T11:17:00
+2010-12-29T07:14:00
+2010-12-29T03:11:00
+2010-12-28T23:08:00
+2010-12-28T19:05:00
+2010-12-28T15:02:00
+2010-12-28T10:59:00
+2010-12-28T06:56:00
+2010-12-28T02:53:00
+2010-12-27T22:50:00
+2010-12-27T18:47:00
+2010-12-27T14:44:00
+2010-12-27T10:41:00
+2010-12-27T06:38:00
+2010-12-27T02:35:00
+2010-12-26T22:32:00
+2010-12-26T18:29:00
+2010-12-26T14:26:00
+2010-12-26T10:23:00
+2010-12-26T06:20:00
+2010-12-26T02:17:00
+2010-12-25T22:14:00
+2010-12-25T18:11:00
+2010-12-25T14:08:00
+2010-12-25T10:05:00
+2010-12-25T06:02:00
+2010-12-25T01:59:00
+2010-12-24T21:56:00
+2010-12-24T17:53:00
+2010-12-24T13:50:00
+2010-12-24T09:47:00
+2010-12-24T05:44:00
+2010-12-24T01:41:00
+2010-12-23T21:38:00
+2010-12-23T17:35:00
+2010-12-23T13:32:00
+2010-12-23T09:29:00
+2010-12-23T05:26:00
+2010-12-23T01:23:00
+2010-12-22T21:20:00
+2010-12-22T17:17:00
+2010-12-22T13:14:00
+2010-12-22T09:11:00
+2010-12-22T05:08:00
+2010-12-22T01:05:00
+2010-12-21T21:02:00
+2010-12-21T16:59:00
+2010-12-21T12:56:00
+2010-12-21T08:53:00
+2010-12-21T04:50:00
+2010-12-21T00:47:00
+2010-12-20T20:44:00
+2010-12-20T16:41:00
+2010-12-20T12:38:00
+2010-12-20T08:35:00
+2010-12-20T04:32:00
+2010-12-20T00:29:00
+2010-12-19T20:26:00
+2010-12-19T16:23:00
+2010-12-19T12:20:00
+2010-12-19T08:17:00
+2010-12-19T04:14:00
+2010-12-19T00:11:00
+2010-12-18T20:08:00
+2010-12-18T16:05:00
+2010-12-18T12:02:00
+2010-12-18T07:59:00
+2010-12-18T03:56:00
+2010-12-17T23:53:00
+2010-12-17T19:50:00
+2010-12-17T15:47:00
+2010-12-17T11:44:00
+2010-12-17T07:41:00
+2010-12-17T03:38:00
+2010-12-16T23:35:00
+2010-12-16T19:32:00
+2010-12-16T15:29:00
+2010-12-16T11:26:00
+2010-12-16T07:23:00
+2010-12-16T03:20:00
+2010-12-15T23:17:00
+2010-12-15T19:14:00
+2010-12-15T15:11:00
+2010-12-15T11:08:00
+2010-12-15T07:05:00
+2010-12-15T03:02:00
+2010-12-14T22:59:00
+2010-12-14T18:56:00
+2010-12-14T14:53:00
+2010-12-14T10:50:00
+2010-12-14T06:47:00
+2010-12-14T02:44:00
+2010-12-13T22:41:00
+2010-12-13T18:38:00
+2010-12-13T14:35:00
+2010-12-13T10:32:00
+2010-12-13T06:29:00
+2010-12-13T02:26:00
+2010-12-12T22:23:00
+2010-12-12T18:20:00
+2010-12-12T14:17:00
+2010-12-12T10:14:00
+2010-12-12T06:11:00
+2010-12-12T02:08:00
+2010-12-11T22:05:00
+2010-12-11T18:02:00
+2010-12-11T13:59:00
+2010-12-11T09:56:00
+2010-12-11T05:53:00
+2010-12-11T01:50:00
+2010-12-10T21:47:00
+2010-12-10T17:44:00
+2010-12-10T13:41:00
+2010-12-10T09:38:00
+2010-12-10T05:35:00
+2010-12-10T01:32:00
+2010-12-09T21:29:00
+2010-12-09T17:26:00
+2010-12-09T13:23:00
+2010-12-09T09:20:00
+2010-12-09T05:17:00
+2010-12-09T01:14:00
+2010-12-08T21:11:00
+2010-12-08T17:08:00
+2010-12-08T13:05:00
+2010-12-08T09:02:00
+2010-12-08T04:59:00
+2010-12-08T00:56:00
+2010-12-07T20:53:00
+2010-12-07T16:50:00
+2010-12-07T12:47:00
+2010-12-07T08:44:00
+2010-12-07T04:41:00
+2010-12-07T00:38:00
+2010-12-06T20:35:00
+2010-12-06T16:32:00
+2010-12-06T12:29:00
+2010-12-06T08:26:00
+2010-12-06T04:23:00
+2010-12-06T00:20:00
+2010-12-05T20:17:00
+2010-12-05T16:14:00
+2010-12-05T12:11:00
+2010-12-05T08:08:00
+2010-12-05T04:05:00
+2010-12-05T00:02:00
+2010-12-04T19:59:00
+2010-12-04T15:56:00
+2010-12-04T11:53:00
+2010-12-04T07:50:00
+2010-12-04T03:47:00
+2010-12-03T23:44:00
+2010-12-03T19:41:00
+2010-12-03T15:38:00
+2010-12-03T11:35:00
+2010-12-03T07:32:00
+2010-12-03T03:29:00
+2010-12-02T23:26:00
+2010-12-02T19:23:00
+2010-12-02T15:20:00
+2010-12-02T11:17:00
+2010-12-02T07:14:00
+2010-12-02T03:11:00
+2010-12-01T23:08:00
+2010-12-01T19:05:00
+2010-12-01T15:02:00
+2010-12-01T10:59:00
+2010-12-01T06:56:00
+2010-12-01T02:53:00
+2010-11-30T22:50:00
+2010-11-30T18:47:00
+2010-11-30T14:44:00
+2010-11-30T10:41:00
+2010-11-30T06:38:00
+2010-11-30T02:35:00
+2010-11-29T22:32:00
+2010-11-29T18:29:00
+2010-11-29T14:26:00
+2010-11-29T10:23:00
+2010-11-29T06:20:00
+2010-11-29T02:17:00
+2010-11-28T22:14:00
+2010-11-28T18:11:00
+2010-11-28T14:08:00
+2010-11-28T10:05:00
+2010-11-28T06:02:00
+2010-11-28T01:59:00
+2010-11-27T21:56:00
+2010-11-27T17:53:00
+2010-11-27T13:50:00
+2010-11-27T09:47:00
+2010-11-27T05:44:00
+2010-11-27T01:41:00
+2010-11-26T21:38:00
+2010-11-26T17:35:00
+2010-11-26T13:32:00
+2010-11-26T09:29:00
+2010-11-26T05:26:00
+2010-11-26T01:23:00
+2010-11-25T21:20:00
+2010-11-25T17:17:00
+2010-11-25T13:14:00
+2010-11-25T09:11:00
+2010-11-25T05:08:00
+2010-11-25T01:05:00
+2010-11-24T21:02:00
+2010-11-24T16:59:00
+2010-11-24T12:56:00
+2010-11-24T08:53:00
+2010-11-24T04:50:00
+2010-11-24T00:47:00
+2010-11-23T20:44:00
+2010-11-23T16:41:00
+2010-11-23T12:38:00
+2010-11-23T08:35:00
+2010-11-23T04:32:00
+2010-11-23T00:29:00
+2010-11-22T20:26:00
+2010-11-22T16:23:00
+2010-11-22T12:20:00
+2010-11-22T08:17:00
+2010-11-22T04:14:00
+2010-11-22T00:11:00
+2010-11-21T20:08:00
+2010-11-21T16:05:00
+2010-11-21T12:02:00
+2010-11-21T07:59:00
+2010-11-21T03:56:00
+2010-11-20T23:53:00
+2010-11-20T19:50:00
+2010-11-20T15:47:00
+2010-11-20T11:44:00
+2010-11-20T07:41:00
+2010-11-20T03:38:00
+2010-11-19T23:35:00
+2010-11-19T19:32:00
+2010-11-19T15:29:00
+2010-11-19T11:26:00
+2010-11-19T07:23:00
+2010-11-19T03:20:00
+2010-11-18T23:17:00
+2010-11-18T19:14:00
+2010-11-18T15:11:00
+2010-11-18T11:08:00
+2010-11-18T07:05:00
+2010-11-18T03:02:00
+2010-11-17T22:59:00
+2010-11-17T18:56:00
+2010-11-17T14:53:00
+2010-11-17T10:50:00
+2010-11-17T06:47:00
+2010-11-17T02:44:00
+2010-11-16T22:41:00
+2010-11-16T18:38:00
+2010-11-16T14:35:00
+2010-11-16T10:32:00
+2010-11-16T06:29:00
+2010-11-16T02:26:00
+2010-11-15T22:23:00
+2010-11-15T18:20:00
+2010-11-15T14:17:00
+2010-11-15T10:14:00
+2010-11-15T06:11:00
+2010-11-15T02:08:00
+2010-11-14T22:05:00
+2010-11-14T18:02:00
+2010-11-14T13:59:00
+2010-11-14T09:56:00
+2010-11-14T05:53:00
+2010-11-14T01:50:00
+2010-11-13T21:47:00
+2010-11-13T17:44:00
+2010-11-13T13:41:00
+2010-11-13T09:38:00
+2010-11-13T05:35:00
+2010-11-13T01:32:00
+2010-11-12T21:29:00
+2010-11-12T17:26:00
+2010-11-12T13:23:00
+2010-11-12T09:20:00
+2010-11-12T05:17:00
+2010-11-12T01:14:00
+2010-11-11T21:11:00
+2010-11-11T17:08:00
+2010-11-11T13:05:00
+2010-11-11T09:02:00
+2010-11-11T04:59:00
+2010-11-11T00:56:00
+2010-11-10T20:53:00
+2010-11-10T16:50:00
+2010-11-10T12:47:00
+2010-11-10T08:44:00
+2010-11-10T04:41:00
+2010-11-10T00:38:00
+2010-11-09T20:35:00
+2010-11-09T16:32:00
+2010-11-09T12:29:00
+2010-11-09T08:26:00
+2010-11-09T04:23:00
+2010-11-09T00:20:00
+2010-11-08T20:17:00
+2010-11-08T16:14:00
+2010-11-08T12:11:00
+2010-11-08T08:08:00
+2010-11-08T04:05:00
+2010-11-08T00:02:00
+2010-11-07T19:59:00
+2010-11-07T15:56:00
+2010-11-07T11:53:00
+2010-11-07T07:50:00
+2010-11-07T03:47:00
+2010-11-06T23:44:00
+2010-11-06T19:41:00
+2010-11-06T15:38:00
+2010-11-06T11:35:00
+2010-11-06T07:32:00
+2010-11-06T03:29:00
+2010-11-05T23:26:00
+2010-11-05T19:23:00
+2010-11-05T15:20:00
+2010-11-05T11:17:00
+2010-11-05T07:14:00
+2010-11-05T03:11:00
+2010-11-04T23:08:00
+2010-11-04T19:05:00
+2010-11-04T15:02:00
+2010-11-04T10:59:00
+2010-11-04T06:56:00
+2010-11-04T02:53:00
+2010-11-03T22:50:00
+2010-11-03T18:47:00
+2010-11-03T14:44:00
+2010-11-03T10:41:00
+2010-11-03T06:38:00
+2010-11-03T02:35:00
+2010-11-02T22:32:00
+2010-11-02T18:29:00
+2010-11-02T14:26:00
+2010-11-02T10:23:00
+2010-11-02T06:20:00
+2010-11-02T02:17:00
+2010-11-01T22:14:00
+2010-11-01T18:11:00
+2010-11-01T14:08:00
+2010-11-01T10:05:00
+2010-11-01T06:02:00
+2010-11-01T01:59:00
+2010-10-31T21:56:00
+2010-10-31T17:53:00
+2010-10-31T13:50:00
+2010-10-31T09:47:00
+2010-10-31T05:44:00
+2010-10-31T01:41:00
+2010-10-30T21:38:00
+2010-10-30T17:35:00
+2010-10-30T13:32:00
+2010-10-30T09:29:00
+2010-10-30T05:26:00
+2010-10-30T01:23:00
+2010-10-29T21:20:00
+2010-10-29T17:17:00
+2010-10-29T13:14:00
+2010-10-29T09:11:00
+2010-10-29T05:08:00
+2010-10-29T01:05:00
+2010-10-28T21:02:00
+2010-10-28T16:59:00
+2010-10-28T12:56:00
+2010-10-28T08:53:00
+2010-10-28T04:50:00
+2010-10-28T00:47:00
+2010-10-27T20:44:00
+2010-10-27T16:41:00
+2010-10-27T12:38:00
+2010-10-27T08:35:00
+2010-10-27T04:32:00
+2010-10-27T00:29:00
+2010-10-26T20:26:00
+2010-10-26T16:23:00
+2010-10-26T12:20:00
+2010-10-26T08:17:00
+2010-10-26T04:14:00
+2010-10-26T00:11:00
+2010-10-25T20:08:00
+2010-10-25T16:05:00
+2010-10-25T12:02:00
+2010-10-25T07:59:00
+2010-10-25T03:56:00
+2010-10-24T23:53:00
+2010-10-24T19:50:00
+2010-10-24T15:47:00
+2010-10-24T11:44:00
+2010-10-24T07:41:00
+2010-10-24T03:38:00
+2010-10-23T23:35:00
+2010-10-23T19:32:00
+2010-10-23T15:29:00
+2010-10-23T11:26:00
+2010-10-23T07:23:00
+2010-10-23T03:20:00
+2010-10-22T23:17:00
+2010-10-22T19:14:00
+2010-10-22T15:11:00
+2010-10-22T11:08:00
+2010-10-22T07:05:00
+2010-10-22T03:02:00
+2010-10-21T22:59:00
+2010-10-21T18:56:00
+2010-10-21T14:53:00
+2010-10-21T10:50:00
+2010-10-21T06:47:00
+2010-10-21T02:44:00
+2010-10-20T22:41:00
+2010-10-20T18:38:00
+2010-10-20T14:35:00
+2010-10-20T10:32:00
+2010-10-20T06:29:00
+2010-10-20T02:26:00
+2010-10-19T22:23:00
+2010-10-19T18:20:00
+2010-10-19T14:17:00
+2010-10-19T10:14:00
+2010-10-19T06:11:00
+2010-10-19T02:08:00
+2010-10-18T22:05:00
+2010-10-18T18:02:00
+2010-10-18T13:59:00
+2010-10-18T09:56:00
+2010-10-18T05:53:00
+2010-10-18T01:50:00
+2010-10-17T21:47:00
+2010-10-17T17:44:00
+2010-10-17T13:41:00
+2010-10-17T09:38:00
+2010-10-17T05:35:00
+2010-10-17T01:32:00
+2010-10-16T21:29:00
+2010-10-16T17:26:00
+2010-10-16T13:23:00
+2010-10-16T09:20:00
+2010-10-16T05:17:00
+2010-10-16T01:14:00
+2010-10-15T21:11:00
+2010-10-15T17:08:00
+2010-10-15T13:05:00
+2010-10-15T09:02:00
+2010-10-15T04:59:00
+2010-10-15T00:56:00
+2010-10-14T20:53:00
+2010-10-14T16:50:00
+2010-10-14T12:47:00
+2010-10-14T08:44:00
+2010-10-14T04:41:00
+2010-10-14T00:38:00
+2010-10-13T20:35:00
+2010-10-13T16:32:00
+2010-10-13T12:29:00
+2010-10-13T08:26:00
+2010-10-13T04:23:00
+2010-10-13T00:20:00
+2010-10-12T20:17:00
+2010-10-12T16:14:00
+2010-10-12T12:11:00
+2010-10-12T08:08:00
+2010-10-12T04:05:00
+2010-10-12T00:02:00
+2010-10-11T19:59:00
+2010-10-11T15:56:00
+2010-10-11T11:53:00
+2010-10-11T07:50:00
+2010-10-11T03:47:00
+2010-10-10T23:44:00
+2010-10-10T19:41:00
+2010-10-10T15:38:00
+2010-10-10T11:35:00
+2010-10-10T07:32:00
+2010-10-10T03:29:00
+2010-10-09T23:26:00
+2010-10-09T19:23:00
+2010-10-09T15:20:00
+2010-10-09T11:17:00
+2010-10-09T07:14:00
+2010-10-09T03:11:00
+2010-10-08T23:08:00
+2010-10-08T19:05:00
+2010-10-08T15:02:00
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase04.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase04.ics.recurson.ref
new file mode 100644
index 00000000..04ba619c
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase04.ics.recurson.ref
@@ -0,0 +1,2050 @@
+2005-05-22
+2005-05-23
+2005-05-24
+2005-05-25
+2005-05-26
+2005-05-27
+2005-05-28
+2005-05-29
+2005-05-30
+2005-05-31
+2005-06-01
+2005-06-02
+2005-06-03
+2005-06-04
+2005-06-05
+2005-06-06
+2005-06-07
+2005-06-08
+2005-06-09
+2005-06-10
+2005-06-11
+2005-06-12
+2005-06-13
+2005-06-14
+2005-06-15
+2005-06-16
+2005-06-17
+2005-06-18
+2005-06-19
+2005-06-20
+2005-06-21
+2005-06-22
+2005-06-23
+2005-06-24
+2005-06-25
+2005-06-26
+2005-06-27
+2005-06-28
+2005-06-29
+2005-06-30
+2005-07-01
+2005-07-02
+2005-07-03
+2005-07-04
+2005-07-05
+2005-07-06
+2005-07-07
+2005-07-08
+2005-07-09
+2005-07-10
+2005-07-11
+2005-07-12
+2005-07-13
+2005-07-14
+2005-07-15
+2005-07-16
+2005-07-17
+2005-07-18
+2005-07-19
+2005-07-20
+2005-07-21
+2005-07-22
+2005-07-23
+2005-07-24
+2005-07-25
+2005-07-26
+2005-07-27
+2005-07-28
+2005-07-29
+2005-07-30
+2005-07-31
+2005-08-01
+2005-08-02
+2005-08-03
+2005-08-04
+2005-08-05
+2005-08-06
+2005-08-07
+2005-08-08
+2005-08-09
+2005-08-10
+2005-08-11
+2005-08-12
+2005-08-13
+2005-08-14
+2005-08-15
+2005-08-16
+2005-08-17
+2005-08-18
+2005-08-19
+2005-08-20
+2005-08-21
+2005-08-22
+2005-08-23
+2005-08-24
+2005-08-25
+2005-08-26
+2005-08-27
+2005-08-28
+2005-08-29
+2005-08-30
+2005-08-31
+2005-09-01
+2005-09-02
+2005-09-03
+2005-09-04
+2005-09-05
+2005-09-06
+2005-09-07
+2005-09-08
+2005-09-09
+2005-09-10
+2005-09-11
+2005-09-12
+2005-09-13
+2005-09-14
+2005-09-15
+2005-09-16
+2005-09-17
+2005-09-18
+2005-09-19
+2005-09-20
+2005-09-21
+2005-09-22
+2005-09-23
+2005-09-24
+2005-09-25
+2005-09-26
+2005-09-27
+2005-09-28
+2005-09-29
+2005-09-30
+2005-10-01
+2005-10-02
+2005-10-03
+2005-10-04
+2005-10-05
+2005-10-06
+2005-10-07
+2005-10-08
+2005-10-09
+2005-10-10
+2005-10-11
+2005-10-12
+2005-10-13
+2005-10-14
+2005-10-15
+2005-10-16
+2005-10-17
+2005-10-18
+2005-10-19
+2005-10-20
+2005-10-21
+2005-10-22
+2005-10-23
+2005-10-24
+2005-10-25
+2005-10-26
+2005-10-27
+2005-10-28
+2005-10-29
+2005-10-30
+2005-10-31
+2005-11-01
+2005-11-02
+2005-11-03
+2005-11-04
+2005-11-05
+2005-11-06
+2005-11-07
+2005-11-08
+2005-11-09
+2005-11-10
+2005-11-11
+2005-11-12
+2005-11-13
+2005-11-14
+2005-11-15
+2005-11-16
+2005-11-17
+2005-11-18
+2005-11-19
+2005-11-20
+2005-11-21
+2005-11-22
+2005-11-23
+2005-11-24
+2005-11-25
+2005-11-26
+2005-11-27
+2005-11-28
+2005-11-29
+2005-11-30
+2005-12-01
+2005-12-02
+2005-12-03
+2005-12-04
+2005-12-05
+2005-12-06
+2005-12-07
+2005-12-08
+2005-12-09
+2005-12-10
+2005-12-11
+2005-12-12
+2005-12-13
+2005-12-14
+2005-12-15
+2005-12-16
+2005-12-17
+2005-12-18
+2005-12-19
+2005-12-20
+2005-12-21
+2005-12-22
+2005-12-23
+2005-12-24
+2005-12-25
+2005-12-26
+2005-12-27
+2005-12-28
+2005-12-29
+2005-12-30
+2005-12-31
+2006-01-01
+2006-01-02
+2006-01-03
+2006-01-04
+2006-01-05
+2006-01-06
+2006-01-07
+2006-01-08
+2006-01-09
+2006-01-10
+2006-01-11
+2006-01-12
+2006-01-13
+2006-01-14
+2006-01-15
+2006-01-16
+2006-01-17
+2006-01-18
+2006-01-19
+2006-01-20
+2006-01-21
+2006-01-22
+2006-01-23
+2006-01-24
+2006-01-25
+2006-01-26
+2006-01-27
+2006-01-28
+2006-01-29
+2006-01-30
+2006-01-31
+2006-02-01
+2006-02-02
+2006-02-03
+2006-02-04
+2006-02-05
+2006-02-06
+2006-02-07
+2006-02-08
+2006-02-09
+2006-02-10
+2006-02-11
+2006-02-12
+2006-02-13
+2006-02-14
+2006-02-15
+2006-02-16
+2006-02-17
+2006-02-18
+2006-02-19
+2006-02-20
+2006-02-21
+2006-02-22
+2006-02-23
+2006-02-24
+2006-02-25
+2006-02-26
+2006-02-27
+2006-02-28
+2006-03-01
+2006-03-02
+2006-03-03
+2006-03-04
+2006-03-05
+2006-03-06
+2006-03-07
+2006-03-08
+2006-03-09
+2006-03-10
+2006-03-11
+2006-03-12
+2006-03-13
+2006-03-14
+2006-03-15
+2006-03-16
+2006-03-17
+2006-03-18
+2006-03-19
+2006-03-20
+2006-03-21
+2006-03-22
+2006-03-23
+2006-03-24
+2006-03-25
+2006-03-26
+2006-03-27
+2006-03-28
+2006-03-29
+2006-03-30
+2006-03-31
+2006-04-01
+2006-04-02
+2006-04-03
+2006-04-04
+2006-04-05
+2006-04-06
+2006-04-07
+2006-04-08
+2006-04-09
+2006-04-10
+2006-04-11
+2006-04-12
+2006-04-13
+2006-04-14
+2006-04-15
+2006-04-16
+2006-04-17
+2006-04-18
+2006-04-19
+2006-04-20
+2006-04-21
+2006-04-22
+2006-04-23
+2006-04-24
+2006-04-25
+2006-04-26
+2006-04-27
+2006-04-28
+2006-04-29
+2006-04-30
+2006-05-01
+2006-05-02
+2006-05-03
+2006-05-04
+2006-05-05
+2006-05-06
+2006-05-07
+2006-05-08
+2006-05-09
+2006-05-10
+2006-05-11
+2006-05-12
+2006-05-13
+2006-05-14
+2006-05-15
+2006-05-16
+2006-05-17
+2006-05-18
+2006-05-19
+2006-05-20
+2006-05-21
+2006-05-22
+2006-05-23
+2006-05-24
+2006-05-25
+2006-05-26
+2006-05-27
+2006-05-28
+2006-05-29
+2006-05-30
+2006-05-31
+2006-06-01
+2006-06-02
+2006-06-03
+2006-06-04
+2006-06-05
+2006-06-06
+2006-06-07
+2006-06-08
+2006-06-09
+2006-06-10
+2006-06-11
+2006-06-12
+2006-06-13
+2006-06-14
+2006-06-15
+2006-06-16
+2006-06-17
+2006-06-18
+2006-06-19
+2006-06-20
+2006-06-21
+2006-06-22
+2006-06-23
+2006-06-24
+2006-06-25
+2006-06-26
+2006-06-27
+2006-06-28
+2006-06-29
+2006-06-30
+2006-07-01
+2006-07-02
+2006-07-03
+2006-07-04
+2006-07-05
+2006-07-06
+2006-07-07
+2006-07-08
+2006-07-09
+2006-07-10
+2006-07-11
+2006-07-12
+2006-07-13
+2006-07-14
+2006-07-15
+2006-07-16
+2006-07-17
+2006-07-18
+2006-07-19
+2006-07-20
+2006-07-21
+2006-07-22
+2006-07-23
+2006-07-24
+2006-07-25
+2006-07-26
+2006-07-27
+2006-07-28
+2006-07-29
+2006-07-30
+2006-07-31
+2006-08-01
+2006-08-02
+2006-08-03
+2006-08-04
+2006-08-05
+2006-08-06
+2006-08-07
+2006-08-08
+2006-08-09
+2006-08-10
+2006-08-11
+2006-08-12
+2006-08-13
+2006-08-14
+2006-08-15
+2006-08-16
+2006-08-17
+2006-08-18
+2006-08-19
+2006-08-20
+2006-08-21
+2006-08-22
+2006-08-23
+2006-08-24
+2006-08-25
+2006-08-26
+2006-08-27
+2006-08-28
+2006-08-29
+2006-08-30
+2006-08-31
+2006-09-01
+2006-09-02
+2006-09-03
+2006-09-04
+2006-09-05
+2006-09-06
+2006-09-07
+2006-09-08
+2006-09-09
+2006-09-10
+2006-09-11
+2006-09-12
+2006-09-13
+2006-09-14
+2006-09-15
+2006-09-16
+2006-09-17
+2006-09-18
+2006-09-19
+2006-09-20
+2006-09-21
+2006-09-22
+2006-09-23
+2006-09-24
+2006-09-25
+2006-09-26
+2006-09-27
+2006-09-28
+2006-09-29
+2006-09-30
+2006-10-01
+2006-10-02
+2006-10-03
+2006-10-04
+2006-10-05
+2006-10-06
+2006-10-07
+2006-10-08
+2006-10-09
+2006-10-10
+2006-10-11
+2006-10-12
+2006-10-13
+2006-10-14
+2006-10-15
+2006-10-16
+2006-10-17
+2006-10-18
+2006-10-19
+2006-10-20
+2006-10-21
+2006-10-22
+2006-10-23
+2006-10-24
+2006-10-25
+2006-10-26
+2006-10-27
+2006-10-28
+2006-10-29
+2006-10-30
+2006-10-31
+2006-11-01
+2006-11-02
+2006-11-03
+2006-11-04
+2006-11-05
+2006-11-06
+2006-11-07
+2006-11-08
+2006-11-09
+2006-11-10
+2006-11-11
+2006-11-12
+2006-11-13
+2006-11-14
+2006-11-15
+2006-11-16
+2006-11-17
+2006-11-18
+2006-11-19
+2006-11-20
+2006-11-21
+2006-11-22
+2006-11-23
+2006-11-24
+2006-11-25
+2006-11-26
+2006-11-27
+2006-11-28
+2006-11-29
+2006-11-30
+2006-12-01
+2006-12-02
+2006-12-03
+2006-12-04
+2006-12-05
+2006-12-06
+2006-12-07
+2006-12-08
+2006-12-09
+2006-12-10
+2006-12-11
+2006-12-12
+2006-12-13
+2006-12-14
+2006-12-15
+2006-12-16
+2006-12-17
+2006-12-18
+2006-12-19
+2006-12-20
+2006-12-21
+2006-12-22
+2006-12-23
+2006-12-24
+2006-12-25
+2006-12-26
+2006-12-27
+2006-12-28
+2006-12-29
+2006-12-30
+2006-12-31
+2007-01-01
+2007-01-02
+2007-01-03
+2007-01-04
+2007-01-05
+2007-01-06
+2007-01-07
+2007-01-08
+2007-01-09
+2007-01-10
+2007-01-11
+2007-01-12
+2007-01-13
+2007-01-14
+2007-01-15
+2007-01-16
+2007-01-17
+2007-01-18
+2007-01-19
+2007-01-20
+2007-01-21
+2007-01-22
+2007-01-23
+2007-01-24
+2007-01-25
+2007-01-26
+2007-01-27
+2007-01-28
+2007-01-29
+2007-01-30
+2007-01-31
+2007-02-01
+2007-02-02
+2007-02-03
+2007-02-04
+2007-02-05
+2007-02-06
+2007-02-07
+2007-02-08
+2007-02-09
+2007-02-10
+2007-02-11
+2007-02-12
+2007-02-13
+2007-02-14
+2007-02-15
+2007-02-16
+2007-02-17
+2007-02-18
+2007-02-19
+2007-02-20
+2007-02-21
+2007-02-22
+2007-02-23
+2007-02-24
+2007-02-25
+2007-02-26
+2007-02-27
+2007-02-28
+2007-03-01
+2007-03-02
+2007-03-03
+2007-03-04
+2007-03-05
+2007-03-06
+2007-03-07
+2007-03-08
+2007-03-09
+2007-03-10
+2007-03-11
+2007-03-12
+2007-03-13
+2007-03-14
+2007-03-15
+2007-03-16
+2007-03-17
+2007-03-18
+2007-03-19
+2007-03-20
+2007-03-21
+2007-03-22
+2007-03-23
+2007-03-24
+2007-03-25
+2007-03-26
+2007-03-27
+2007-03-28
+2007-03-29
+2007-03-30
+2007-03-31
+2007-04-01
+2007-04-02
+2007-04-03
+2007-04-04
+2007-04-05
+2007-04-06
+2007-04-07
+2007-04-08
+2007-04-09
+2007-04-10
+2007-04-11
+2007-04-12
+2007-04-13
+2007-04-14
+2007-04-15
+2007-04-16
+2007-04-17
+2007-04-18
+2007-04-19
+2007-04-20
+2007-04-21
+2007-04-22
+2007-04-23
+2007-04-24
+2007-04-25
+2007-04-26
+2007-04-27
+2007-04-28
+2007-04-29
+2007-04-30
+2007-05-01
+2007-05-02
+2007-05-03
+2007-05-04
+2007-05-05
+2007-05-06
+2007-05-07
+2007-05-08
+2007-05-09
+2007-05-10
+2007-05-11
+2007-05-12
+2007-05-13
+2007-05-14
+2007-05-15
+2007-05-16
+2007-05-17
+2007-05-18
+2007-05-19
+2007-05-20
+2007-05-21
+2007-05-22
+2007-05-23
+2007-05-24
+2007-05-25
+2007-05-26
+2007-05-27
+2007-05-28
+2007-05-29
+2007-05-30
+2007-05-31
+2007-06-01
+2007-06-02
+2007-06-03
+2007-06-04
+2007-06-05
+2007-06-06
+2007-06-07
+2007-06-08
+2007-06-09
+2007-06-10
+2007-06-11
+2007-06-12
+2007-06-13
+2007-06-14
+2007-06-15
+2007-06-16
+2007-06-17
+2007-06-18
+2007-06-19
+2007-06-20
+2007-06-21
+2007-06-22
+2007-06-23
+2007-06-24
+2007-06-25
+2007-06-26
+2007-06-27
+2007-06-28
+2007-06-29
+2007-06-30
+2007-07-01
+2007-07-02
+2007-07-03
+2007-07-04
+2007-07-05
+2007-07-06
+2007-07-07
+2007-07-08
+2007-07-09
+2007-07-10
+2007-07-11
+2007-07-12
+2007-07-13
+2007-07-14
+2007-07-15
+2007-07-16
+2007-07-17
+2007-07-18
+2007-07-19
+2007-07-20
+2007-07-21
+2007-07-22
+2007-07-23
+2007-07-24
+2007-07-25
+2007-07-26
+2007-07-27
+2007-07-28
+2007-07-29
+2007-07-30
+2007-07-31
+2007-08-01
+2007-08-02
+2007-08-03
+2007-08-04
+2007-08-05
+2007-08-06
+2007-08-07
+2007-08-08
+2007-08-09
+2007-08-10
+2007-08-11
+2007-08-12
+2007-08-13
+2007-08-14
+2007-08-15
+2007-08-16
+2007-08-17
+2007-08-18
+2007-08-19
+2007-08-20
+2007-08-21
+2007-08-22
+2007-08-23
+2007-08-24
+2007-08-25
+2007-08-26
+2007-08-27
+2007-08-28
+2007-08-29
+2007-08-30
+2007-08-31
+2007-09-01
+2007-09-02
+2007-09-03
+2007-09-04
+2007-09-05
+2007-09-06
+2007-09-07
+2007-09-08
+2007-09-09
+2007-09-10
+2007-09-11
+2007-09-12
+2007-09-13
+2007-09-14
+2007-09-15
+2007-09-16
+2007-09-17
+2007-09-18
+2007-09-19
+2007-09-20
+2007-09-21
+2007-09-22
+2007-09-23
+2007-09-24
+2007-09-25
+2007-09-26
+2007-09-27
+2007-09-28
+2007-09-29
+2007-09-30
+2007-10-01
+2007-10-02
+2007-10-03
+2007-10-04
+2007-10-05
+2007-10-06
+2007-10-07
+2007-10-08
+2007-10-09
+2007-10-10
+2007-10-11
+2007-10-12
+2007-10-13
+2007-10-14
+2007-10-15
+2007-10-16
+2007-10-17
+2007-10-18
+2007-10-19
+2007-10-20
+2007-10-21
+2007-10-22
+2007-10-23
+2007-10-24
+2007-10-25
+2007-10-26
+2007-10-27
+2007-10-28
+2007-10-29
+2007-10-30
+2007-10-31
+2007-11-01
+2007-11-02
+2007-11-03
+2007-11-04
+2007-11-05
+2007-11-06
+2007-11-07
+2007-11-08
+2007-11-09
+2007-11-10
+2007-11-11
+2007-11-12
+2007-11-13
+2007-11-14
+2007-11-15
+2007-11-16
+2007-11-17
+2007-11-18
+2007-11-19
+2007-11-20
+2007-11-21
+2007-11-22
+2007-11-23
+2007-11-24
+2007-11-25
+2007-11-26
+2007-11-27
+2007-11-28
+2007-11-29
+2007-11-30
+2007-12-01
+2007-12-02
+2007-12-03
+2007-12-04
+2007-12-05
+2007-12-06
+2007-12-07
+2007-12-08
+2007-12-09
+2007-12-10
+2007-12-11
+2007-12-12
+2007-12-13
+2007-12-14
+2007-12-15
+2007-12-16
+2007-12-17
+2007-12-18
+2007-12-19
+2007-12-20
+2007-12-21
+2007-12-22
+2007-12-23
+2007-12-24
+2007-12-25
+2007-12-26
+2007-12-27
+2007-12-28
+2007-12-29
+2007-12-30
+2007-12-31
+2008-01-01
+2008-01-02
+2008-01-03
+2008-01-04
+2008-01-05
+2008-01-06
+2008-01-07
+2008-01-08
+2008-01-09
+2008-01-10
+2008-01-11
+2008-01-12
+2008-01-13
+2008-01-14
+2008-01-15
+2008-01-16
+2008-01-17
+2008-01-18
+2008-01-19
+2008-01-20
+2008-01-21
+2008-01-22
+2008-01-23
+2008-01-24
+2008-01-25
+2008-01-26
+2008-01-27
+2008-01-28
+2008-01-29
+2008-01-30
+2008-01-31
+2008-02-01
+2008-02-02
+2008-02-03
+2008-02-04
+2008-02-05
+2008-02-06
+2008-02-07
+2008-02-08
+2008-02-09
+2008-02-10
+2008-02-11
+2008-02-12
+2008-02-13
+2008-02-14
+2008-02-15
+2008-02-16
+2008-02-17
+2008-02-18
+2008-02-19
+2008-02-20
+2008-02-21
+2008-02-22
+2008-02-23
+2008-02-24
+2008-02-25
+2008-02-26
+2008-02-27
+2008-02-28
+2008-02-29
+2008-03-01
+2008-03-02
+2008-03-03
+2008-03-04
+2008-03-05
+2008-03-06
+2008-03-07
+2008-03-08
+2008-03-09
+2008-03-10
+2008-03-11
+2008-03-12
+2008-03-13
+2008-03-14
+2008-03-15
+2008-03-16
+2008-03-17
+2008-03-18
+2008-03-19
+2008-03-20
+2008-03-21
+2008-03-22
+2008-03-23
+2008-03-24
+2008-03-25
+2008-03-26
+2008-03-27
+2008-03-28
+2008-03-29
+2008-03-30
+2008-03-31
+2008-04-01
+2008-04-02
+2008-04-03
+2008-04-04
+2008-04-05
+2008-04-06
+2008-04-07
+2008-04-08
+2008-04-09
+2008-04-10
+2008-04-11
+2008-04-12
+2008-04-13
+2008-04-14
+2008-04-15
+2008-04-16
+2008-04-17
+2008-04-18
+2008-04-19
+2008-04-20
+2008-04-21
+2008-04-22
+2008-04-23
+2008-04-24
+2008-04-25
+2008-04-26
+2008-04-27
+2008-04-28
+2008-04-29
+2008-04-30
+2008-05-01
+2008-05-02
+2008-05-03
+2008-05-04
+2008-05-05
+2008-05-06
+2008-05-07
+2008-05-08
+2008-05-09
+2008-05-10
+2008-05-11
+2008-05-12
+2008-05-13
+2008-05-14
+2008-05-15
+2008-05-16
+2008-05-17
+2008-05-18
+2008-05-19
+2008-05-20
+2008-05-21
+2008-05-22
+2008-05-23
+2008-05-24
+2008-05-25
+2008-05-26
+2008-05-27
+2008-05-28
+2008-05-29
+2008-05-30
+2008-05-31
+2008-06-01
+2008-06-02
+2008-06-03
+2008-06-04
+2008-06-05
+2008-06-06
+2008-06-07
+2008-06-08
+2008-06-09
+2008-06-10
+2008-06-11
+2008-06-12
+2008-06-13
+2008-06-14
+2008-06-15
+2008-06-16
+2008-06-17
+2008-06-18
+2008-06-19
+2008-06-20
+2008-06-21
+2008-06-22
+2008-06-23
+2008-06-24
+2008-06-25
+2008-06-26
+2008-06-27
+2008-06-28
+2008-06-29
+2008-06-30
+2008-07-01
+2008-07-02
+2008-07-03
+2008-07-04
+2008-07-05
+2008-07-06
+2008-07-07
+2008-07-08
+2008-07-09
+2008-07-10
+2008-07-11
+2008-07-12
+2008-07-13
+2008-07-14
+2008-07-15
+2008-07-16
+2008-07-17
+2008-07-18
+2008-07-19
+2008-07-20
+2008-07-21
+2008-07-22
+2008-07-23
+2008-07-24
+2008-07-25
+2008-07-26
+2008-07-27
+2008-07-28
+2008-07-29
+2008-07-30
+2008-07-31
+2008-08-01
+2008-08-02
+2008-08-03
+2008-08-04
+2008-08-05
+2008-08-06
+2008-08-07
+2008-08-08
+2008-08-09
+2008-08-10
+2008-08-11
+2008-08-12
+2008-08-13
+2008-08-14
+2008-08-15
+2008-08-16
+2008-08-17
+2008-08-18
+2008-08-19
+2008-08-20
+2008-08-21
+2008-08-22
+2008-08-23
+2008-08-24
+2008-08-25
+2008-08-26
+2008-08-27
+2008-08-28
+2008-08-29
+2008-08-30
+2008-08-31
+2008-09-01
+2008-09-02
+2008-09-03
+2008-09-04
+2008-09-05
+2008-09-06
+2008-09-07
+2008-09-08
+2008-09-09
+2008-09-10
+2008-09-11
+2008-09-12
+2008-09-13
+2008-09-14
+2008-09-15
+2008-09-16
+2008-09-17
+2008-09-18
+2008-09-19
+2008-09-20
+2008-09-21
+2008-09-22
+2008-09-23
+2008-09-24
+2008-09-25
+2008-09-26
+2008-09-27
+2008-09-28
+2008-09-29
+2008-09-30
+2008-10-01
+2008-10-02
+2008-10-03
+2008-10-04
+2008-10-05
+2008-10-06
+2008-10-07
+2008-10-08
+2008-10-09
+2008-10-10
+2008-10-11
+2008-10-12
+2008-10-13
+2008-10-14
+2008-10-15
+2008-10-16
+2008-10-17
+2008-10-18
+2008-10-19
+2008-10-20
+2008-10-21
+2008-10-22
+2008-10-23
+2008-10-24
+2008-10-25
+2008-10-26
+2008-10-27
+2008-10-28
+2008-10-29
+2008-10-30
+2008-10-31
+2008-11-01
+2008-11-02
+2008-11-03
+2008-11-04
+2008-11-05
+2008-11-06
+2008-11-07
+2008-11-08
+2008-11-09
+2008-11-10
+2008-11-11
+2008-11-12
+2008-11-13
+2008-11-14
+2008-11-15
+2008-11-16
+2008-11-17
+2008-11-18
+2008-11-19
+2008-11-20
+2008-11-21
+2008-11-22
+2008-11-23
+2008-11-24
+2008-11-25
+2008-11-26
+2008-11-27
+2008-11-28
+2008-11-29
+2008-11-30
+2008-12-01
+2008-12-02
+2008-12-03
+2008-12-04
+2008-12-05
+2008-12-06
+2008-12-07
+2008-12-08
+2008-12-09
+2008-12-10
+2008-12-11
+2008-12-12
+2008-12-13
+2008-12-14
+2008-12-15
+2008-12-16
+2008-12-17
+2008-12-18
+2008-12-19
+2008-12-20
+2008-12-21
+2008-12-22
+2008-12-23
+2008-12-24
+2008-12-25
+2008-12-26
+2008-12-27
+2008-12-28
+2008-12-29
+2008-12-30
+2008-12-31
+2009-01-01
+2009-01-02
+2009-01-03
+2009-01-04
+2009-01-05
+2009-01-06
+2009-01-07
+2009-01-08
+2009-01-09
+2009-01-10
+2009-01-11
+2009-01-12
+2009-01-13
+2009-01-14
+2009-01-15
+2009-01-16
+2009-01-17
+2009-01-18
+2009-01-19
+2009-01-20
+2009-01-21
+2009-01-22
+2009-01-23
+2009-01-24
+2009-01-25
+2009-01-26
+2009-01-27
+2009-01-28
+2009-01-29
+2009-01-30
+2009-01-31
+2009-02-01
+2009-02-02
+2009-02-03
+2009-02-04
+2009-02-05
+2009-02-06
+2009-02-07
+2009-02-08
+2009-02-09
+2009-02-10
+2009-02-11
+2009-02-12
+2009-02-13
+2009-02-14
+2009-02-15
+2009-02-16
+2009-02-17
+2009-02-18
+2009-02-19
+2009-02-20
+2009-02-21
+2009-02-22
+2009-02-23
+2009-02-24
+2009-02-25
+2009-02-26
+2009-02-27
+2009-02-28
+2009-03-01
+2009-03-02
+2009-03-03
+2009-03-04
+2009-03-05
+2009-03-06
+2009-03-07
+2009-03-08
+2009-03-09
+2009-03-10
+2009-03-11
+2009-03-12
+2009-03-13
+2009-03-14
+2009-03-15
+2009-03-16
+2009-03-17
+2009-03-18
+2009-03-19
+2009-03-20
+2009-03-21
+2009-03-22
+2009-03-23
+2009-03-24
+2009-03-25
+2009-03-26
+2009-03-27
+2009-03-28
+2009-03-29
+2009-03-30
+2009-03-31
+2009-04-01
+2009-04-02
+2009-04-03
+2009-04-04
+2009-04-05
+2009-04-06
+2009-04-07
+2009-04-08
+2009-04-09
+2009-04-10
+2009-04-11
+2009-04-12
+2009-04-13
+2009-04-14
+2009-04-15
+2009-04-16
+2009-04-17
+2009-04-18
+2009-04-19
+2009-04-20
+2009-04-21
+2009-04-22
+2009-04-23
+2009-04-24
+2009-04-25
+2009-04-26
+2009-04-27
+2009-04-28
+2009-04-29
+2009-04-30
+2009-05-01
+2009-05-02
+2009-05-03
+2009-05-04
+2009-05-05
+2009-05-06
+2009-05-07
+2009-05-08
+2009-05-09
+2009-05-10
+2009-05-11
+2009-05-12
+2009-05-13
+2009-05-14
+2009-05-15
+2009-05-16
+2009-05-17
+2009-05-18
+2009-05-19
+2009-05-20
+2009-05-21
+2009-05-22
+2009-05-23
+2009-05-24
+2009-05-25
+2009-05-26
+2009-05-27
+2009-05-28
+2009-05-29
+2009-05-30
+2009-05-31
+2009-06-01
+2009-06-02
+2009-06-03
+2009-06-04
+2009-06-05
+2009-06-06
+2009-06-07
+2009-06-08
+2009-06-09
+2009-06-10
+2009-06-11
+2009-06-12
+2009-06-13
+2009-06-14
+2009-06-15
+2009-06-16
+2009-06-17
+2009-06-18
+2009-06-19
+2009-06-20
+2009-06-21
+2009-06-22
+2009-06-23
+2009-06-24
+2009-06-25
+2009-06-26
+2009-06-27
+2009-06-28
+2009-06-29
+2009-06-30
+2009-07-01
+2009-07-02
+2009-07-03
+2009-07-04
+2009-07-05
+2009-07-06
+2009-07-07
+2009-07-08
+2009-07-09
+2009-07-10
+2009-07-11
+2009-07-12
+2009-07-13
+2009-07-14
+2009-07-15
+2009-07-16
+2009-07-17
+2009-07-18
+2009-07-19
+2009-07-20
+2009-07-21
+2009-07-22
+2009-07-23
+2009-07-24
+2009-07-25
+2009-07-26
+2009-07-27
+2009-07-28
+2009-07-29
+2009-07-30
+2009-07-31
+2009-08-01
+2009-08-02
+2009-08-03
+2009-08-04
+2009-08-05
+2009-08-06
+2009-08-07
+2009-08-08
+2009-08-09
+2009-08-10
+2009-08-11
+2009-08-12
+2009-08-13
+2009-08-14
+2009-08-15
+2009-08-16
+2009-08-17
+2009-08-18
+2009-08-19
+2009-08-20
+2009-08-21
+2009-08-22
+2009-08-23
+2009-08-24
+2009-08-25
+2009-08-26
+2009-08-27
+2009-08-28
+2009-08-29
+2009-08-30
+2009-08-31
+2009-09-01
+2009-09-02
+2009-09-03
+2009-09-04
+2009-09-05
+2009-09-06
+2009-09-07
+2009-09-08
+2009-09-09
+2009-09-10
+2009-09-11
+2009-09-12
+2009-09-13
+2009-09-14
+2009-09-15
+2009-09-16
+2009-09-17
+2009-09-18
+2009-09-19
+2009-09-20
+2009-09-21
+2009-09-22
+2009-09-23
+2009-09-24
+2009-09-25
+2009-09-26
+2009-09-27
+2009-09-28
+2009-09-29
+2009-09-30
+2009-10-01
+2009-10-02
+2009-10-03
+2009-10-04
+2009-10-05
+2009-10-06
+2009-10-07
+2009-10-08
+2009-10-09
+2009-10-10
+2009-10-11
+2009-10-12
+2009-10-13
+2009-10-14
+2009-10-15
+2009-10-16
+2009-10-17
+2009-10-18
+2009-10-19
+2009-10-20
+2009-10-21
+2009-10-22
+2009-10-23
+2009-10-24
+2009-10-25
+2009-10-26
+2009-10-27
+2009-10-28
+2009-10-29
+2009-10-30
+2009-10-31
+2009-11-01
+2009-11-02
+2009-11-03
+2009-11-04
+2009-11-05
+2009-11-06
+2009-11-07
+2009-11-08
+2009-11-09
+2009-11-10
+2009-11-11
+2009-11-12
+2009-11-13
+2009-11-14
+2009-11-15
+2009-11-16
+2009-11-17
+2009-11-18
+2009-11-19
+2009-11-20
+2009-11-21
+2009-11-22
+2009-11-23
+2009-11-24
+2009-11-25
+2009-11-26
+2009-11-27
+2009-11-28
+2009-11-29
+2009-11-30
+2009-12-01
+2009-12-02
+2009-12-03
+2009-12-04
+2009-12-05
+2009-12-06
+2009-12-07
+2009-12-08
+2009-12-09
+2009-12-10
+2009-12-11
+2009-12-12
+2009-12-13
+2009-12-14
+2009-12-15
+2009-12-16
+2009-12-17
+2009-12-18
+2009-12-19
+2009-12-20
+2009-12-21
+2009-12-22
+2009-12-23
+2009-12-24
+2009-12-25
+2009-12-26
+2009-12-27
+2009-12-28
+2009-12-29
+2009-12-30
+2009-12-31
+2010-01-01
+2010-01-02
+2010-01-03
+2010-01-04
+2010-01-05
+2010-01-06
+2010-01-07
+2010-01-08
+2010-01-09
+2010-01-10
+2010-01-11
+2010-01-12
+2010-01-13
+2010-01-14
+2010-01-15
+2010-01-16
+2010-01-17
+2010-01-18
+2010-01-19
+2010-01-20
+2010-01-21
+2010-01-22
+2010-01-23
+2010-01-24
+2010-01-25
+2010-01-26
+2010-01-27
+2010-01-28
+2010-01-29
+2010-01-30
+2010-01-31
+2010-02-01
+2010-02-02
+2010-02-03
+2010-02-04
+2010-02-05
+2010-02-06
+2010-02-07
+2010-02-08
+2010-02-09
+2010-02-10
+2010-02-11
+2010-02-12
+2010-02-13
+2010-02-14
+2010-02-15
+2010-02-16
+2010-02-17
+2010-02-18
+2010-02-19
+2010-02-20
+2010-02-21
+2010-02-22
+2010-02-23
+2010-02-24
+2010-02-25
+2010-02-26
+2010-02-27
+2010-02-28
+2010-03-01
+2010-03-02
+2010-03-03
+2010-03-04
+2010-03-05
+2010-03-06
+2010-03-07
+2010-03-08
+2010-03-09
+2010-03-10
+2010-03-11
+2010-03-12
+2010-03-13
+2010-03-14
+2010-03-15
+2010-03-16
+2010-03-17
+2010-03-18
+2010-03-19
+2010-03-20
+2010-03-21
+2010-03-22
+2010-03-23
+2010-03-24
+2010-03-25
+2010-03-26
+2010-03-27
+2010-03-28
+2010-03-29
+2010-03-30
+2010-03-31
+2010-04-01
+2010-04-02
+2010-04-03
+2010-04-04
+2010-04-05
+2010-04-06
+2010-04-07
+2010-04-08
+2010-04-09
+2010-04-10
+2010-04-11
+2010-04-12
+2010-04-13
+2010-04-14
+2010-04-15
+2010-04-16
+2010-04-17
+2010-04-18
+2010-04-19
+2010-04-20
+2010-04-21
+2010-04-22
+2010-04-23
+2010-04-24
+2010-04-25
+2010-04-26
+2010-04-27
+2010-04-28
+2010-04-29
+2010-04-30
+2010-05-01
+2010-05-02
+2010-05-03
+2010-05-04
+2010-05-05
+2010-05-06
+2010-05-07
+2010-05-08
+2010-05-09
+2010-05-10
+2010-05-11
+2010-05-12
+2010-05-13
+2010-05-14
+2010-05-15
+2010-05-16
+2010-05-17
+2010-05-18
+2010-05-19
+2010-05-20
+2010-05-21
+2010-05-22
+2010-05-23
+2010-05-24
+2010-05-25
+2010-05-26
+2010-05-27
+2010-05-28
+2010-05-29
+2010-05-30
+2010-05-31
+2010-06-01
+2010-06-02
+2010-06-03
+2010-06-04
+2010-06-05
+2010-06-06
+2010-06-07
+2010-06-08
+2010-06-09
+2010-06-10
+2010-06-11
+2010-06-12
+2010-06-13
+2010-06-14
+2010-06-15
+2010-06-16
+2010-06-17
+2010-06-18
+2010-06-19
+2010-06-20
+2010-06-21
+2010-06-22
+2010-06-23
+2010-06-24
+2010-06-25
+2010-06-26
+2010-06-27
+2010-06-28
+2010-06-29
+2010-06-30
+2010-07-01
+2010-07-02
+2010-07-03
+2010-07-04
+2010-07-05
+2010-07-06
+2010-07-07
+2010-07-08
+2010-07-09
+2010-07-10
+2010-07-11
+2010-07-12
+2010-07-13
+2010-07-14
+2010-07-15
+2010-07-16
+2010-07-17
+2010-07-18
+2010-07-19
+2010-07-20
+2010-07-21
+2010-07-22
+2010-07-23
+2010-07-24
+2010-07-25
+2010-07-26
+2010-07-27
+2010-07-28
+2010-07-29
+2010-07-30
+2010-07-31
+2010-08-01
+2010-08-02
+2010-08-03
+2010-08-04
+2010-08-05
+2010-08-06
+2010-08-07
+2010-08-08
+2010-08-09
+2010-08-10
+2010-08-11
+2010-08-12
+2010-08-13
+2010-08-14
+2010-08-15
+2010-08-16
+2010-08-17
+2010-08-18
+2010-08-19
+2010-08-20
+2010-08-21
+2010-08-22
+2010-08-23
+2010-08-24
+2010-08-25
+2010-08-26
+2010-08-27
+2010-08-28
+2010-08-29
+2010-08-30
+2010-08-31
+2010-09-01
+2010-09-02
+2010-09-03
+2010-09-04
+2010-09-05
+2010-09-06
+2010-09-07
+2010-09-08
+2010-09-09
+2010-09-10
+2010-09-11
+2010-09-12
+2010-09-13
+2010-09-14
+2010-09-15
+2010-09-16
+2010-09-17
+2010-09-18
+2010-09-19
+2010-09-20
+2010-09-21
+2010-09-22
+2010-09-23
+2010-09-24
+2010-09-25
+2010-09-26
+2010-09-27
+2010-09-28
+2010-09-29
+2010-09-30
+2010-10-01
+2010-10-02
+2010-10-03
+2010-10-04
+2010-10-05
+2010-10-06
+2010-10-07
+2010-10-08
+2010-10-09
+2010-10-10
+2010-10-11
+2010-10-12
+2010-10-13
+2010-10-14
+2010-10-15
+2010-10-16
+2010-10-17
+2010-10-18
+2010-10-19
+2010-10-20
+2010-10-21
+2010-10-22
+2010-10-23
+2010-10-24
+2010-10-25
+2010-10-26
+2010-10-27
+2010-10-28
+2010-10-29
+2010-10-30
+2010-10-31
+2010-11-01
+2010-11-02
+2010-11-03
+2010-11-04
+2010-11-05
+2010-11-06
+2010-11-07
+2010-11-08
+2010-11-09
+2010-11-10
+2010-11-11
+2010-11-12
+2010-11-13
+2010-11-14
+2010-11-15
+2010-11-16
+2010-11-17
+2010-11-18
+2010-11-19
+2010-11-20
+2010-11-21
+2010-11-22
+2010-11-23
+2010-11-24
+2010-11-25
+2010-11-26
+2010-11-27
+2010-11-28
+2010-11-29
+2010-11-30
+2010-12-01
+2010-12-02
+2010-12-03
+2010-12-04
+2010-12-05
+2010-12-06
+2010-12-07
+2010-12-08
+2010-12-09
+2010-12-10
+2010-12-11
+2010-12-12
+2010-12-13
+2010-12-14
+2010-12-15
+2010-12-16
+2010-12-17
+2010-12-18
+2010-12-19
+2010-12-20
+2010-12-21
+2010-12-22
+2010-12-23
+2010-12-24
+2010-12-25
+2010-12-26
+2010-12-27
+2010-12-28
+2010-12-29
+2010-12-30
+2010-12-31
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase05.ics b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase05.ics
new file mode 100644
index 00000000..ef7311eb
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase05.ics
@@ -0,0 +1,23 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KAlarm 1.2.6//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20050522T130601
+CREATED:20050522T130409
+UID:KAlarm-1322911691.873
+SEQUENCE:0
+LAST-MODIFIED:20050522T130409
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=MONTHLY;INTERVAL=2;BYMONTHDAY=24
+DTSTART:20050524T130400
+TRANSP:OPAQUE
+BEGIN:VALARM
+DESCRIPTION:Every 2 months on the 24th
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:PT0S
+X-KDE-KALARM-FONTCOLOR:#ff0000\;#000000\;
+END:VALARM
+
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase05.ics.next.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase05.ics.next.ref
new file mode 100644
index 00000000..a7ccbccc
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase05.ics.next.ref
@@ -0,0 +1,500 @@
+2005-05-24T13:04:00
+2005-07-24T13:04:00
+2005-09-24T13:04:00
+2005-11-24T13:04:00
+2006-01-24T13:04:00
+2006-03-24T13:04:00
+2006-05-24T13:04:00
+2006-07-24T13:04:00
+2006-09-24T13:04:00
+2006-11-24T13:04:00
+2007-01-24T13:04:00
+2007-03-24T13:04:00
+2007-05-24T13:04:00
+2007-07-24T13:04:00
+2007-09-24T13:04:00
+2007-11-24T13:04:00
+2008-01-24T13:04:00
+2008-03-24T13:04:00
+2008-05-24T13:04:00
+2008-07-24T13:04:00
+2008-09-24T13:04:00
+2008-11-24T13:04:00
+2009-01-24T13:04:00
+2009-03-24T13:04:00
+2009-05-24T13:04:00
+2009-07-24T13:04:00
+2009-09-24T13:04:00
+2009-11-24T13:04:00
+2010-01-24T13:04:00
+2010-03-24T13:04:00
+2010-05-24T13:04:00
+2010-07-24T13:04:00
+2010-09-24T13:04:00
+2010-11-24T13:04:00
+2011-01-24T13:04:00
+2011-03-24T13:04:00
+2011-05-24T13:04:00
+2011-07-24T13:04:00
+2011-09-24T13:04:00
+2011-11-24T13:04:00
+2012-01-24T13:04:00
+2012-03-24T13:04:00
+2012-05-24T13:04:00
+2012-07-24T13:04:00
+2012-09-24T13:04:00
+2012-11-24T13:04:00
+2013-01-24T13:04:00
+2013-03-24T13:04:00
+2013-05-24T13:04:00
+2013-07-24T13:04:00
+2013-09-24T13:04:00
+2013-11-24T13:04:00
+2014-01-24T13:04:00
+2014-03-24T13:04:00
+2014-05-24T13:04:00
+2014-07-24T13:04:00
+2014-09-24T13:04:00
+2014-11-24T13:04:00
+2015-01-24T13:04:00
+2015-03-24T13:04:00
+2015-05-24T13:04:00
+2015-07-24T13:04:00
+2015-09-24T13:04:00
+2015-11-24T13:04:00
+2016-01-24T13:04:00
+2016-03-24T13:04:00
+2016-05-24T13:04:00
+2016-07-24T13:04:00
+2016-09-24T13:04:00
+2016-11-24T13:04:00
+2017-01-24T13:04:00
+2017-03-24T13:04:00
+2017-05-24T13:04:00
+2017-07-24T13:04:00
+2017-09-24T13:04:00
+2017-11-24T13:04:00
+2018-01-24T13:04:00
+2018-03-24T13:04:00
+2018-05-24T13:04:00
+2018-07-24T13:04:00
+2018-09-24T13:04:00
+2018-11-24T13:04:00
+2019-01-24T13:04:00
+2019-03-24T13:04:00
+2019-05-24T13:04:00
+2019-07-24T13:04:00
+2019-09-24T13:04:00
+2019-11-24T13:04:00
+2020-01-24T13:04:00
+2020-03-24T13:04:00
+2020-05-24T13:04:00
+2020-07-24T13:04:00
+2020-09-24T13:04:00
+2020-11-24T13:04:00
+2021-01-24T13:04:00
+2021-03-24T13:04:00
+2021-05-24T13:04:00
+2021-07-24T13:04:00
+2021-09-24T13:04:00
+2021-11-24T13:04:00
+2022-01-24T13:04:00
+2022-03-24T13:04:00
+2022-05-24T13:04:00
+2022-07-24T13:04:00
+2022-09-24T13:04:00
+2022-11-24T13:04:00
+2023-01-24T13:04:00
+2023-03-24T13:04:00
+2023-05-24T13:04:00
+2023-07-24T13:04:00
+2023-09-24T13:04:00
+2023-11-24T13:04:00
+2024-01-24T13:04:00
+2024-03-24T13:04:00
+2024-05-24T13:04:00
+2024-07-24T13:04:00
+2024-09-24T13:04:00
+2024-11-24T13:04:00
+2025-01-24T13:04:00
+2025-03-24T13:04:00
+2025-05-24T13:04:00
+2025-07-24T13:04:00
+2025-09-24T13:04:00
+2025-11-24T13:04:00
+2026-01-24T13:04:00
+2026-03-24T13:04:00
+2026-05-24T13:04:00
+2026-07-24T13:04:00
+2026-09-24T13:04:00
+2026-11-24T13:04:00
+2027-01-24T13:04:00
+2027-03-24T13:04:00
+2027-05-24T13:04:00
+2027-07-24T13:04:00
+2027-09-24T13:04:00
+2027-11-24T13:04:00
+2028-01-24T13:04:00
+2028-03-24T13:04:00
+2028-05-24T13:04:00
+2028-07-24T13:04:00
+2028-09-24T13:04:00
+2028-11-24T13:04:00
+2029-01-24T13:04:00
+2029-03-24T13:04:00
+2029-05-24T13:04:00
+2029-07-24T13:04:00
+2029-09-24T13:04:00
+2029-11-24T13:04:00
+2030-01-24T13:04:00
+2030-03-24T13:04:00
+2030-05-24T13:04:00
+2030-07-24T13:04:00
+2030-09-24T13:04:00
+2030-11-24T13:04:00
+2031-01-24T13:04:00
+2031-03-24T13:04:00
+2031-05-24T13:04:00
+2031-07-24T13:04:00
+2031-09-24T13:04:00
+2031-11-24T13:04:00
+2032-01-24T13:04:00
+2032-03-24T13:04:00
+2032-05-24T13:04:00
+2032-07-24T13:04:00
+2032-09-24T13:04:00
+2032-11-24T13:04:00
+2033-01-24T13:04:00
+2033-03-24T13:04:00
+2033-05-24T13:04:00
+2033-07-24T13:04:00
+2033-09-24T13:04:00
+2033-11-24T13:04:00
+2034-01-24T13:04:00
+2034-03-24T13:04:00
+2034-05-24T13:04:00
+2034-07-24T13:04:00
+2034-09-24T13:04:00
+2034-11-24T13:04:00
+2035-01-24T13:04:00
+2035-03-24T13:04:00
+2035-05-24T13:04:00
+2035-07-24T13:04:00
+2035-09-24T13:04:00
+2035-11-24T13:04:00
+2036-01-24T13:04:00
+2036-03-24T13:04:00
+2036-05-24T13:04:00
+2036-07-24T13:04:00
+2036-09-24T13:04:00
+2036-11-24T13:04:00
+2037-01-24T13:04:00
+2037-03-24T13:04:00
+2037-05-24T13:04:00
+2037-07-24T13:04:00
+2037-09-24T13:04:00
+2037-11-24T13:04:00
+2038-01-24T13:04:00
+2038-03-24T13:04:00
+2038-05-24T13:04:00
+2038-07-24T13:04:00
+2038-09-24T13:04:00
+2038-11-24T13:04:00
+2039-01-24T13:04:00
+2039-03-24T13:04:00
+2039-05-24T13:04:00
+2039-07-24T13:04:00
+2039-09-24T13:04:00
+2039-11-24T13:04:00
+2040-01-24T13:04:00
+2040-03-24T13:04:00
+2040-05-24T13:04:00
+2040-07-24T13:04:00
+2040-09-24T13:04:00
+2040-11-24T13:04:00
+2041-01-24T13:04:00
+2041-03-24T13:04:00
+2041-05-24T13:04:00
+2041-07-24T13:04:00
+2041-09-24T13:04:00
+2041-11-24T13:04:00
+2042-01-24T13:04:00
+2042-03-24T13:04:00
+2042-05-24T13:04:00
+2042-07-24T13:04:00
+2042-09-24T13:04:00
+2042-11-24T13:04:00
+2043-01-24T13:04:00
+2043-03-24T13:04:00
+2043-05-24T13:04:00
+2043-07-24T13:04:00
+2043-09-24T13:04:00
+2043-11-24T13:04:00
+2044-01-24T13:04:00
+2044-03-24T13:04:00
+2044-05-24T13:04:00
+2044-07-24T13:04:00
+2044-09-24T13:04:00
+2044-11-24T13:04:00
+2045-01-24T13:04:00
+2045-03-24T13:04:00
+2045-05-24T13:04:00
+2045-07-24T13:04:00
+2045-09-24T13:04:00
+2045-11-24T13:04:00
+2046-01-24T13:04:00
+2046-03-24T13:04:00
+2046-05-24T13:04:00
+2046-07-24T13:04:00
+2046-09-24T13:04:00
+2046-11-24T13:04:00
+2047-01-24T13:04:00
+2047-03-24T13:04:00
+2047-05-24T13:04:00
+2047-07-24T13:04:00
+2047-09-24T13:04:00
+2047-11-24T13:04:00
+2048-01-24T13:04:00
+2048-03-24T13:04:00
+2048-05-24T13:04:00
+2048-07-24T13:04:00
+2048-09-24T13:04:00
+2048-11-24T13:04:00
+2049-01-24T13:04:00
+2049-03-24T13:04:00
+2049-05-24T13:04:00
+2049-07-24T13:04:00
+2049-09-24T13:04:00
+2049-11-24T13:04:00
+2050-01-24T13:04:00
+2050-03-24T13:04:00
+2050-05-24T13:04:00
+2050-07-24T13:04:00
+2050-09-24T13:04:00
+2050-11-24T13:04:00
+2051-01-24T13:04:00
+2051-03-24T13:04:00
+2051-05-24T13:04:00
+2051-07-24T13:04:00
+2051-09-24T13:04:00
+2051-11-24T13:04:00
+2052-01-24T13:04:00
+2052-03-24T13:04:00
+2052-05-24T13:04:00
+2052-07-24T13:04:00
+2052-09-24T13:04:00
+2052-11-24T13:04:00
+2053-01-24T13:04:00
+2053-03-24T13:04:00
+2053-05-24T13:04:00
+2053-07-24T13:04:00
+2053-09-24T13:04:00
+2053-11-24T13:04:00
+2054-01-24T13:04:00
+2054-03-24T13:04:00
+2054-05-24T13:04:00
+2054-07-24T13:04:00
+2054-09-24T13:04:00
+2054-11-24T13:04:00
+2055-01-24T13:04:00
+2055-03-24T13:04:00
+2055-05-24T13:04:00
+2055-07-24T13:04:00
+2055-09-24T13:04:00
+2055-11-24T13:04:00
+2056-01-24T13:04:00
+2056-03-24T13:04:00
+2056-05-24T13:04:00
+2056-07-24T13:04:00
+2056-09-24T13:04:00
+2056-11-24T13:04:00
+2057-01-24T13:04:00
+2057-03-24T13:04:00
+2057-05-24T13:04:00
+2057-07-24T13:04:00
+2057-09-24T13:04:00
+2057-11-24T13:04:00
+2058-01-24T13:04:00
+2058-03-24T13:04:00
+2058-05-24T13:04:00
+2058-07-24T13:04:00
+2058-09-24T13:04:00
+2058-11-24T13:04:00
+2059-01-24T13:04:00
+2059-03-24T13:04:00
+2059-05-24T13:04:00
+2059-07-24T13:04:00
+2059-09-24T13:04:00
+2059-11-24T13:04:00
+2060-01-24T13:04:00
+2060-03-24T13:04:00
+2060-05-24T13:04:00
+2060-07-24T13:04:00
+2060-09-24T13:04:00
+2060-11-24T13:04:00
+2061-01-24T13:04:00
+2061-03-24T13:04:00
+2061-05-24T13:04:00
+2061-07-24T13:04:00
+2061-09-24T13:04:00
+2061-11-24T13:04:00
+2062-01-24T13:04:00
+2062-03-24T13:04:00
+2062-05-24T13:04:00
+2062-07-24T13:04:00
+2062-09-24T13:04:00
+2062-11-24T13:04:00
+2063-01-24T13:04:00
+2063-03-24T13:04:00
+2063-05-24T13:04:00
+2063-07-24T13:04:00
+2063-09-24T13:04:00
+2063-11-24T13:04:00
+2064-01-24T13:04:00
+2064-03-24T13:04:00
+2064-05-24T13:04:00
+2064-07-24T13:04:00
+2064-09-24T13:04:00
+2064-11-24T13:04:00
+2065-01-24T13:04:00
+2065-03-24T13:04:00
+2065-05-24T13:04:00
+2065-07-24T13:04:00
+2065-09-24T13:04:00
+2065-11-24T13:04:00
+2066-01-24T13:04:00
+2066-03-24T13:04:00
+2066-05-24T13:04:00
+2066-07-24T13:04:00
+2066-09-24T13:04:00
+2066-11-24T13:04:00
+2067-01-24T13:04:00
+2067-03-24T13:04:00
+2067-05-24T13:04:00
+2067-07-24T13:04:00
+2067-09-24T13:04:00
+2067-11-24T13:04:00
+2068-01-24T13:04:00
+2068-03-24T13:04:00
+2068-05-24T13:04:00
+2068-07-24T13:04:00
+2068-09-24T13:04:00
+2068-11-24T13:04:00
+2069-01-24T13:04:00
+2069-03-24T13:04:00
+2069-05-24T13:04:00
+2069-07-24T13:04:00
+2069-09-24T13:04:00
+2069-11-24T13:04:00
+2070-01-24T13:04:00
+2070-03-24T13:04:00
+2070-05-24T13:04:00
+2070-07-24T13:04:00
+2070-09-24T13:04:00
+2070-11-24T13:04:00
+2071-01-24T13:04:00
+2071-03-24T13:04:00
+2071-05-24T13:04:00
+2071-07-24T13:04:00
+2071-09-24T13:04:00
+2071-11-24T13:04:00
+2072-01-24T13:04:00
+2072-03-24T13:04:00
+2072-05-24T13:04:00
+2072-07-24T13:04:00
+2072-09-24T13:04:00
+2072-11-24T13:04:00
+2073-01-24T13:04:00
+2073-03-24T13:04:00
+2073-05-24T13:04:00
+2073-07-24T13:04:00
+2073-09-24T13:04:00
+2073-11-24T13:04:00
+2074-01-24T13:04:00
+2074-03-24T13:04:00
+2074-05-24T13:04:00
+2074-07-24T13:04:00
+2074-09-24T13:04:00
+2074-11-24T13:04:00
+2075-01-24T13:04:00
+2075-03-24T13:04:00
+2075-05-24T13:04:00
+2075-07-24T13:04:00
+2075-09-24T13:04:00
+2075-11-24T13:04:00
+2076-01-24T13:04:00
+2076-03-24T13:04:00
+2076-05-24T13:04:00
+2076-07-24T13:04:00
+2076-09-24T13:04:00
+2076-11-24T13:04:00
+2077-01-24T13:04:00
+2077-03-24T13:04:00
+2077-05-24T13:04:00
+2077-07-24T13:04:00
+2077-09-24T13:04:00
+2077-11-24T13:04:00
+2078-01-24T13:04:00
+2078-03-24T13:04:00
+2078-05-24T13:04:00
+2078-07-24T13:04:00
+2078-09-24T13:04:00
+2078-11-24T13:04:00
+2079-01-24T13:04:00
+2079-03-24T13:04:00
+2079-05-24T13:04:00
+2079-07-24T13:04:00
+2079-09-24T13:04:00
+2079-11-24T13:04:00
+2080-01-24T13:04:00
+2080-03-24T13:04:00
+2080-05-24T13:04:00
+2080-07-24T13:04:00
+2080-09-24T13:04:00
+2080-11-24T13:04:00
+2081-01-24T13:04:00
+2081-03-24T13:04:00
+2081-05-24T13:04:00
+2081-07-24T13:04:00
+2081-09-24T13:04:00
+2081-11-24T13:04:00
+2082-01-24T13:04:00
+2082-03-24T13:04:00
+2082-05-24T13:04:00
+2082-07-24T13:04:00
+2082-09-24T13:04:00
+2082-11-24T13:04:00
+2083-01-24T13:04:00
+2083-03-24T13:04:00
+2083-05-24T13:04:00
+2083-07-24T13:04:00
+2083-09-24T13:04:00
+2083-11-24T13:04:00
+2084-01-24T13:04:00
+2084-03-24T13:04:00
+2084-05-24T13:04:00
+2084-07-24T13:04:00
+2084-09-24T13:04:00
+2084-11-24T13:04:00
+2085-01-24T13:04:00
+2085-03-24T13:04:00
+2085-05-24T13:04:00
+2085-07-24T13:04:00
+2085-09-24T13:04:00
+2085-11-24T13:04:00
+2086-01-24T13:04:00
+2086-03-24T13:04:00
+2086-05-24T13:04:00
+2086-07-24T13:04:00
+2086-09-24T13:04:00
+2086-11-24T13:04:00
+2087-01-24T13:04:00
+2087-03-24T13:04:00
+2087-05-24T13:04:00
+2087-07-24T13:04:00
+2087-09-24T13:04:00
+2087-11-24T13:04:00
+2088-01-24T13:04:00
+2088-03-24T13:04:00
+2088-05-24T13:04:00
+2088-07-24T13:04:00
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase05.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase05.ics.prev.ref
new file mode 100644
index 00000000..4bb23ae0
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase05.ics.prev.ref
@@ -0,0 +1,35 @@
+2010-11-24T13:04:00
+2010-09-24T13:04:00
+2010-07-24T13:04:00
+2010-05-24T13:04:00
+2010-03-24T13:04:00
+2010-01-24T13:04:00
+2009-11-24T13:04:00
+2009-09-24T13:04:00
+2009-07-24T13:04:00
+2009-05-24T13:04:00
+2009-03-24T13:04:00
+2009-01-24T13:04:00
+2008-11-24T13:04:00
+2008-09-24T13:04:00
+2008-07-24T13:04:00
+2008-05-24T13:04:00
+2008-03-24T13:04:00
+2008-01-24T13:04:00
+2007-11-24T13:04:00
+2007-09-24T13:04:00
+2007-07-24T13:04:00
+2007-05-24T13:04:00
+2007-03-24T13:04:00
+2007-01-24T13:04:00
+2006-11-24T13:04:00
+2006-09-24T13:04:00
+2006-07-24T13:04:00
+2006-05-24T13:04:00
+2006-03-24T13:04:00
+2006-01-24T13:04:00
+2005-11-24T13:04:00
+2005-09-24T13:04:00
+2005-07-24T13:04:00
+2005-05-24T13:04:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase05.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase05.ics.recurson.ref
new file mode 100644
index 00000000..63de1ee6
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase05.ics.recurson.ref
@@ -0,0 +1,34 @@
+2005-05-24
+2005-07-24
+2005-09-24
+2005-11-24
+2006-01-24
+2006-03-24
+2006-05-24
+2006-07-24
+2006-09-24
+2006-11-24
+2007-01-24
+2007-03-24
+2007-05-24
+2007-07-24
+2007-09-24
+2007-11-24
+2008-01-24
+2008-03-24
+2008-05-24
+2008-07-24
+2008-09-24
+2008-11-24
+2009-01-24
+2009-03-24
+2009-05-24
+2009-07-24
+2009-09-24
+2009-11-24
+2010-01-24
+2010-03-24
+2010-05-24
+2010-07-24
+2010-09-24
+2010-11-24
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase06.ics b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase06.ics
new file mode 100644
index 00000000..4d65ed9a
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase06.ics
@@ -0,0 +1,30 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KAlarm 1.2.6//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20050522T130601
+CREATED:20050522T124525
+UID:KAlarm-1195473896.721
+SEQUENCE:0
+LAST-MODIFIED:20050522T124525
+CLASS:PUBLIC
+PRIORITY:5
+DTSTART:20050531T124600
+TRANSP:OPAQUE
+BEGIN:VALARM
+DESCRIPTION:At login
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:PT0S
+X-KDE-KALARM-FONTCOLOR:#ff0000\;#000000\;
+END:VALARM
+
+BEGIN:VALARM
+DESCRIPTION:At login
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:-P9DT35S
+X-KDE-KALARM-FONTCOLOR:#ff0000\;#000000\;
+X-KDE-KALARM-TYPE:LOGIN
+END:VALARM
+
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase06.ics.next.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase06.ics.next.ref
new file mode 100644
index 00000000..877babbe
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase06.ics.next.ref
@@ -0,0 +1,2 @@
+2005-05-31T12:46:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase06.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase06.ics.prev.ref
new file mode 100644
index 00000000..877babbe
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase06.ics.prev.ref
@@ -0,0 +1,2 @@
+2005-05-31T12:46:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase06.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase06.ics.recurson.ref
new file mode 100644
index 00000000..2562eae7
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase06.ics.recurson.ref
@@ -0,0 +1,2 @@
+2005-05-31
+
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase07.ics b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase07.ics
new file mode 100644
index 00000000..f141388f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase07.ics
@@ -0,0 +1,23 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KAlarm 1.2.6//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20050522T130601
+CREATED:20050522T130601
+UID:KAlarm-287267280.549
+SEQUENCE:0
+LAST-MODIFIED:20050522T130601
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=YEARLY;INTERVAL=3;BYDAY=3TU;BYMONTH=5,11
+DTSTART:20051115T130600
+TRANSP:OPAQUE
+BEGIN:VALARM
+DESCRIPTION:every 3 years on the 3. tuesday in may and november
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:PT0S
+X-KDE-KALARM-FONTCOLOR:#ff0000\;#000000\;
+END:VALARM
+
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase07.ics.next.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase07.ics.next.ref
new file mode 100644
index 00000000..30bc377f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase07.ics.next.ref
@@ -0,0 +1,500 @@
+2005-11-15T13:06:00
+2008-05-20T13:06:00
+2008-11-18T13:06:00
+2011-05-17T13:06:00
+2011-11-15T13:06:00
+2014-05-20T13:06:00
+2014-11-18T13:06:00
+2017-05-16T13:06:00
+2017-11-21T13:06:00
+2020-05-19T13:06:00
+2020-11-17T13:06:00
+2023-05-16T13:06:00
+2023-11-21T13:06:00
+2026-05-19T13:06:00
+2026-11-17T13:06:00
+2029-05-15T13:06:00
+2029-11-20T13:06:00
+2032-05-18T13:06:00
+2032-11-16T13:06:00
+2035-05-15T13:06:00
+2035-11-20T13:06:00
+2038-05-18T13:06:00
+2038-11-16T13:06:00
+2041-05-21T13:06:00
+2041-11-19T13:06:00
+2044-05-17T13:06:00
+2044-11-15T13:06:00
+2047-05-21T13:06:00
+2047-11-19T13:06:00
+2050-05-17T13:06:00
+2050-11-15T13:06:00
+2053-05-20T13:06:00
+2053-11-18T13:06:00
+2056-05-16T13:06:00
+2056-11-21T13:06:00
+2059-05-20T13:06:00
+2059-11-18T13:06:00
+2062-05-16T13:06:00
+2062-11-21T13:06:00
+2065-05-19T13:06:00
+2065-11-17T13:06:00
+2068-05-15T13:06:00
+2068-11-20T13:06:00
+2071-05-19T13:06:00
+2071-11-17T13:06:00
+2074-05-15T13:06:00
+2074-11-20T13:06:00
+2077-05-18T13:06:00
+2077-11-16T13:06:00
+2080-05-21T13:06:00
+2080-11-19T13:06:00
+2083-05-18T13:06:00
+2083-11-16T13:06:00
+2086-05-21T13:06:00
+2086-11-19T13:06:00
+2089-05-17T13:06:00
+2089-11-15T13:06:00
+2092-05-20T13:06:00
+2092-11-18T13:06:00
+2095-05-17T13:06:00
+2095-11-15T13:06:00
+2098-05-20T13:06:00
+2098-11-18T13:06:00
+2101-05-17T13:06:00
+2101-11-15T13:06:00
+2104-05-20T13:06:00
+2104-11-18T13:06:00
+2107-05-17T13:06:00
+2107-11-15T13:06:00
+2110-05-20T13:06:00
+2110-11-18T13:06:00
+2113-05-16T13:06:00
+2113-11-21T13:06:00
+2116-05-19T13:06:00
+2116-11-17T13:06:00
+2119-05-16T13:06:00
+2119-11-21T13:06:00
+2122-05-19T13:06:00
+2122-11-17T13:06:00
+2125-05-15T13:06:00
+2125-11-20T13:06:00
+2128-05-18T13:06:00
+2128-11-16T13:06:00
+2131-05-15T13:06:00
+2131-11-20T13:06:00
+2134-05-18T13:06:00
+2134-11-16T13:06:00
+2137-05-21T13:06:00
+2137-11-19T13:06:00
+2140-05-17T13:06:00
+2140-11-15T13:06:00
+2143-05-21T13:06:00
+2143-11-19T13:06:00
+2146-05-17T13:06:00
+2146-11-15T13:06:00
+2149-05-20T13:06:00
+2149-11-18T13:06:00
+2152-05-16T13:06:00
+2152-11-21T13:06:00
+2155-05-20T13:06:00
+2155-11-18T13:06:00
+2158-05-16T13:06:00
+2158-11-21T13:06:00
+2161-05-19T13:06:00
+2161-11-17T13:06:00
+2164-05-15T13:06:00
+2164-11-20T13:06:00
+2167-05-19T13:06:00
+2167-11-17T13:06:00
+2170-05-15T13:06:00
+2170-11-20T13:06:00
+2173-05-18T13:06:00
+2173-11-16T13:06:00
+2176-05-21T13:06:00
+2176-11-19T13:06:00
+2179-05-18T13:06:00
+2179-11-16T13:06:00
+2182-05-21T13:06:00
+2182-11-19T13:06:00
+2185-05-17T13:06:00
+2185-11-15T13:06:00
+2188-05-20T13:06:00
+2188-11-18T13:06:00
+2191-05-17T13:06:00
+2191-11-15T13:06:00
+2194-05-20T13:06:00
+2194-11-18T13:06:00
+2197-05-16T13:06:00
+2197-11-21T13:06:00
+2200-05-20T13:06:00
+2200-11-18T13:06:00
+2203-05-17T13:06:00
+2203-11-15T13:06:00
+2206-05-20T13:06:00
+2206-11-18T13:06:00
+2209-05-16T13:06:00
+2209-11-21T13:06:00
+2212-05-19T13:06:00
+2212-11-17T13:06:00
+2215-05-16T13:06:00
+2215-11-21T13:06:00
+2218-05-19T13:06:00
+2218-11-17T13:06:00
+2221-05-15T13:06:00
+2221-11-20T13:06:00
+2224-05-18T13:06:00
+2224-11-16T13:06:00
+2227-05-15T13:06:00
+2227-11-20T13:06:00
+2230-05-18T13:06:00
+2230-11-16T13:06:00
+2233-05-21T13:06:00
+2233-11-19T13:06:00
+2236-05-17T13:06:00
+2236-11-15T13:06:00
+2239-05-21T13:06:00
+2239-11-19T13:06:00
+2242-05-17T13:06:00
+2242-11-15T13:06:00
+2245-05-20T13:06:00
+2245-11-18T13:06:00
+2248-05-16T13:06:00
+2248-11-21T13:06:00
+2251-05-20T13:06:00
+2251-11-18T13:06:00
+2254-05-16T13:06:00
+2254-11-21T13:06:00
+2257-05-19T13:06:00
+2257-11-17T13:06:00
+2260-05-15T13:06:00
+2260-11-20T13:06:00
+2263-05-19T13:06:00
+2263-11-17T13:06:00
+2266-05-15T13:06:00
+2266-11-20T13:06:00
+2269-05-18T13:06:00
+2269-11-16T13:06:00
+2272-05-21T13:06:00
+2272-11-19T13:06:00
+2275-05-18T13:06:00
+2275-11-16T13:06:00
+2278-05-21T13:06:00
+2278-11-19T13:06:00
+2281-05-17T13:06:00
+2281-11-15T13:06:00
+2284-05-20T13:06:00
+2284-11-18T13:06:00
+2287-05-17T13:06:00
+2287-11-15T13:06:00
+2290-05-20T13:06:00
+2290-11-18T13:06:00
+2293-05-16T13:06:00
+2293-11-21T13:06:00
+2296-05-19T13:06:00
+2296-11-17T13:06:00
+2299-05-16T13:06:00
+2299-11-21T13:06:00
+2302-05-20T13:06:00
+2302-11-18T13:06:00
+2305-05-16T13:06:00
+2305-11-21T13:06:00
+2308-05-19T13:06:00
+2308-11-17T13:06:00
+2311-05-16T13:06:00
+2311-11-21T13:06:00
+2314-05-19T13:06:00
+2314-11-17T13:06:00
+2317-05-15T13:06:00
+2317-11-20T13:06:00
+2320-05-18T13:06:00
+2320-11-16T13:06:00
+2323-05-15T13:06:00
+2323-11-20T13:06:00
+2326-05-18T13:06:00
+2326-11-16T13:06:00
+2329-05-21T13:06:00
+2329-11-19T13:06:00
+2332-05-17T13:06:00
+2332-11-15T13:06:00
+2335-05-21T13:06:00
+2335-11-19T13:06:00
+2338-05-17T13:06:00
+2338-11-15T13:06:00
+2341-05-20T13:06:00
+2341-11-18T13:06:00
+2344-05-16T13:06:00
+2344-11-21T13:06:00
+2347-05-20T13:06:00
+2347-11-18T13:06:00
+2350-05-16T13:06:00
+2350-11-21T13:06:00
+2353-05-19T13:06:00
+2353-11-17T13:06:00
+2356-05-15T13:06:00
+2356-11-20T13:06:00
+2359-05-19T13:06:00
+2359-11-17T13:06:00
+2362-05-15T13:06:00
+2362-11-20T13:06:00
+2365-05-18T13:06:00
+2365-11-16T13:06:00
+2368-05-21T13:06:00
+2368-11-19T13:06:00
+2371-05-18T13:06:00
+2371-11-16T13:06:00
+2374-05-21T13:06:00
+2374-11-19T13:06:00
+2377-05-17T13:06:00
+2377-11-15T13:06:00
+2380-05-20T13:06:00
+2380-11-18T13:06:00
+2383-05-17T13:06:00
+2383-11-15T13:06:00
+2386-05-20T13:06:00
+2386-11-18T13:06:00
+2389-05-16T13:06:00
+2389-11-21T13:06:00
+2392-05-19T13:06:00
+2392-11-17T13:06:00
+2395-05-16T13:06:00
+2395-11-21T13:06:00
+2398-05-19T13:06:00
+2398-11-17T13:06:00
+2401-05-15T13:06:00
+2401-11-20T13:06:00
+2404-05-18T13:06:00
+2404-11-16T13:06:00
+2407-05-15T13:06:00
+2407-11-20T13:06:00
+2410-05-18T13:06:00
+2410-11-16T13:06:00
+2413-05-21T13:06:00
+2413-11-19T13:06:00
+2416-05-17T13:06:00
+2416-11-15T13:06:00
+2419-05-21T13:06:00
+2419-11-19T13:06:00
+2422-05-17T13:06:00
+2422-11-15T13:06:00
+2425-05-20T13:06:00
+2425-11-18T13:06:00
+2428-05-16T13:06:00
+2428-11-21T13:06:00
+2431-05-20T13:06:00
+2431-11-18T13:06:00
+2434-05-16T13:06:00
+2434-11-21T13:06:00
+2437-05-19T13:06:00
+2437-11-17T13:06:00
+2440-05-15T13:06:00
+2440-11-20T13:06:00
+2443-05-19T13:06:00
+2443-11-17T13:06:00
+2446-05-15T13:06:00
+2446-11-20T13:06:00
+2449-05-18T13:06:00
+2449-11-16T13:06:00
+2452-05-21T13:06:00
+2452-11-19T13:06:00
+2455-05-18T13:06:00
+2455-11-16T13:06:00
+2458-05-21T13:06:00
+2458-11-19T13:06:00
+2461-05-17T13:06:00
+2461-11-15T13:06:00
+2464-05-20T13:06:00
+2464-11-18T13:06:00
+2467-05-17T13:06:00
+2467-11-15T13:06:00
+2470-05-20T13:06:00
+2470-11-18T13:06:00
+2473-05-16T13:06:00
+2473-11-21T13:06:00
+2476-05-19T13:06:00
+2476-11-17T13:06:00
+2479-05-16T13:06:00
+2479-11-21T13:06:00
+2482-05-19T13:06:00
+2482-11-17T13:06:00
+2485-05-15T13:06:00
+2485-11-20T13:06:00
+2488-05-18T13:06:00
+2488-11-16T13:06:00
+2491-05-15T13:06:00
+2491-11-20T13:06:00
+2494-05-18T13:06:00
+2494-11-16T13:06:00
+2497-05-21T13:06:00
+2497-11-19T13:06:00
+2500-05-18T13:06:00
+2500-11-16T13:06:00
+2503-05-15T13:06:00
+2503-11-20T13:06:00
+2506-05-18T13:06:00
+2506-11-16T13:06:00
+2509-05-21T13:06:00
+2509-11-19T13:06:00
+2512-05-17T13:06:00
+2512-11-15T13:06:00
+2515-05-21T13:06:00
+2515-11-19T13:06:00
+2518-05-17T13:06:00
+2518-11-15T13:06:00
+2521-05-20T13:06:00
+2521-11-18T13:06:00
+2524-05-16T13:06:00
+2524-11-21T13:06:00
+2527-05-20T13:06:00
+2527-11-18T13:06:00
+2530-05-16T13:06:00
+2530-11-21T13:06:00
+2533-05-19T13:06:00
+2533-11-17T13:06:00
+2536-05-15T13:06:00
+2536-11-20T13:06:00
+2539-05-19T13:06:00
+2539-11-17T13:06:00
+2542-05-15T13:06:00
+2542-11-20T13:06:00
+2545-05-18T13:06:00
+2545-11-16T13:06:00
+2548-05-21T13:06:00
+2548-11-19T13:06:00
+2551-05-18T13:06:00
+2551-11-16T13:06:00
+2554-05-21T13:06:00
+2554-11-19T13:06:00
+2557-05-17T13:06:00
+2557-11-15T13:06:00
+2560-05-20T13:06:00
+2560-11-18T13:06:00
+2563-05-17T13:06:00
+2563-11-15T13:06:00
+2566-05-20T13:06:00
+2566-11-18T13:06:00
+2569-05-16T13:06:00
+2569-11-21T13:06:00
+2572-05-19T13:06:00
+2572-11-17T13:06:00
+2575-05-16T13:06:00
+2575-11-21T13:06:00
+2578-05-19T13:06:00
+2578-11-17T13:06:00
+2581-05-15T13:06:00
+2581-11-20T13:06:00
+2584-05-18T13:06:00
+2584-11-16T13:06:00
+2587-05-15T13:06:00
+2587-11-20T13:06:00
+2590-05-18T13:06:00
+2590-11-16T13:06:00
+2593-05-21T13:06:00
+2593-11-19T13:06:00
+2596-05-17T13:06:00
+2596-11-15T13:06:00
+2599-05-21T13:06:00
+2599-11-19T13:06:00
+2602-05-18T13:06:00
+2602-11-16T13:06:00
+2605-05-21T13:06:00
+2605-11-19T13:06:00
+2608-05-17T13:06:00
+2608-11-15T13:06:00
+2611-05-21T13:06:00
+2611-11-19T13:06:00
+2614-05-17T13:06:00
+2614-11-15T13:06:00
+2617-05-20T13:06:00
+2617-11-18T13:06:00
+2620-05-16T13:06:00
+2620-11-21T13:06:00
+2623-05-20T13:06:00
+2623-11-18T13:06:00
+2626-05-16T13:06:00
+2626-11-21T13:06:00
+2629-05-19T13:06:00
+2629-11-17T13:06:00
+2632-05-15T13:06:00
+2632-11-20T13:06:00
+2635-05-19T13:06:00
+2635-11-17T13:06:00
+2638-05-15T13:06:00
+2638-11-20T13:06:00
+2641-05-18T13:06:00
+2641-11-16T13:06:00
+2644-05-21T13:06:00
+2644-11-19T13:06:00
+2647-05-18T13:06:00
+2647-11-16T13:06:00
+2650-05-21T13:06:00
+2650-11-19T13:06:00
+2653-05-17T13:06:00
+2653-11-15T13:06:00
+2656-05-20T13:06:00
+2656-11-18T13:06:00
+2659-05-17T13:06:00
+2659-11-15T13:06:00
+2662-05-20T13:06:00
+2662-11-18T13:06:00
+2665-05-16T13:06:00
+2665-11-21T13:06:00
+2668-05-19T13:06:00
+2668-11-17T13:06:00
+2671-05-16T13:06:00
+2671-11-21T13:06:00
+2674-05-19T13:06:00
+2674-11-17T13:06:00
+2677-05-15T13:06:00
+2677-11-20T13:06:00
+2680-05-18T13:06:00
+2680-11-16T13:06:00
+2683-05-15T13:06:00
+2683-11-20T13:06:00
+2686-05-18T13:06:00
+2686-11-16T13:06:00
+2689-05-21T13:06:00
+2689-11-19T13:06:00
+2692-05-17T13:06:00
+2692-11-15T13:06:00
+2695-05-21T13:06:00
+2695-11-19T13:06:00
+2698-05-17T13:06:00
+2698-11-15T13:06:00
+2701-05-21T13:06:00
+2701-11-19T13:06:00
+2704-05-17T13:06:00
+2704-11-15T13:06:00
+2707-05-21T13:06:00
+2707-11-19T13:06:00
+2710-05-17T13:06:00
+2710-11-15T13:06:00
+2713-05-20T13:06:00
+2713-11-18T13:06:00
+2716-05-16T13:06:00
+2716-11-21T13:06:00
+2719-05-20T13:06:00
+2719-11-18T13:06:00
+2722-05-16T13:06:00
+2722-11-21T13:06:00
+2725-05-19T13:06:00
+2725-11-17T13:06:00
+2728-05-15T13:06:00
+2728-11-20T13:06:00
+2731-05-19T13:06:00
+2731-11-17T13:06:00
+2734-05-15T13:06:00
+2734-11-20T13:06:00
+2737-05-18T13:06:00
+2737-11-16T13:06:00
+2740-05-21T13:06:00
+2740-11-19T13:06:00
+2743-05-18T13:06:00
+2743-11-16T13:06:00
+2746-05-21T13:06:00
+2746-11-19T13:06:00
+2749-05-17T13:06:00
+2749-11-15T13:06:00
+2752-05-20T13:06:00
+2752-11-18T13:06:00
+2755-05-17T13:06:00
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase07.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase07.ics.prev.ref
new file mode 100644
index 00000000..9f6f94a0
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase07.ics.prev.ref
@@ -0,0 +1,4 @@
+2008-11-18T13:06:00
+2008-05-20T13:06:00
+2005-11-15T13:06:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase07.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase07.ics.recurson.ref
new file mode 100644
index 00000000..8ab527dc
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase07.ics.recurson.ref
@@ -0,0 +1,4 @@
+2005-11-15
+2008-05-20
+2008-11-18
+
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase08.ics b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase08.ics
new file mode 100644
index 00000000..3f71409d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase08.ics
@@ -0,0 +1,23 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KAlarm 1.2.6//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20050522T130601
+CREATED:20050522T130440
+UID:KAlarm-651624348.728
+SEQUENCE:0
+LAST-MODIFIED:20050522T130440
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=MONTHLY;INTERVAL=1;BYDAY=-2WE
+DTSTART:20050622T130500
+TRANSP:OPAQUE
+BEGIN:VALARM
+DESCRIPTION:every 2 months on the 2nd-to-last wednesday
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:PT0S
+X-KDE-KALARM-FONTCOLOR:#ff0000\;#000000\;
+END:VALARM
+
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase08.ics.next.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase08.ics.next.ref
new file mode 100644
index 00000000..cb40dcf1
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase08.ics.next.ref
@@ -0,0 +1,500 @@
+2005-06-22T13:05:00
+2005-07-20T13:05:00
+2005-08-24T13:05:00
+2005-09-21T13:05:00
+2005-10-19T13:05:00
+2005-11-23T13:05:00
+2005-12-21T13:05:00
+2006-01-18T13:05:00
+2006-02-15T13:05:00
+2006-03-22T13:05:00
+2006-04-19T13:05:00
+2006-05-24T13:05:00
+2006-06-21T13:05:00
+2006-07-19T13:05:00
+2006-08-23T13:05:00
+2006-09-20T13:05:00
+2006-10-18T13:05:00
+2006-11-22T13:05:00
+2006-12-20T13:05:00
+2007-01-24T13:05:00
+2007-02-21T13:05:00
+2007-03-21T13:05:00
+2007-04-18T13:05:00
+2007-05-23T13:05:00
+2007-06-20T13:05:00
+2007-07-18T13:05:00
+2007-08-22T13:05:00
+2007-09-19T13:05:00
+2007-10-24T13:05:00
+2007-11-21T13:05:00
+2007-12-19T13:05:00
+2008-01-23T13:05:00
+2008-02-20T13:05:00
+2008-03-19T13:05:00
+2008-04-23T13:05:00
+2008-05-21T13:05:00
+2008-06-18T13:05:00
+2008-07-23T13:05:00
+2008-08-20T13:05:00
+2008-09-17T13:05:00
+2008-10-22T13:05:00
+2008-11-19T13:05:00
+2008-12-24T13:05:00
+2009-01-21T13:05:00
+2009-02-18T13:05:00
+2009-03-18T13:05:00
+2009-04-22T13:05:00
+2009-05-20T13:05:00
+2009-06-17T13:05:00
+2009-07-22T13:05:00
+2009-08-19T13:05:00
+2009-09-23T13:05:00
+2009-10-21T13:05:00
+2009-11-18T13:05:00
+2009-12-23T13:05:00
+2010-01-20T13:05:00
+2010-02-17T13:05:00
+2010-03-24T13:05:00
+2010-04-21T13:05:00
+2010-05-19T13:05:00
+2010-06-23T13:05:00
+2010-07-21T13:05:00
+2010-08-18T13:05:00
+2010-09-22T13:05:00
+2010-10-20T13:05:00
+2010-11-17T13:05:00
+2010-12-22T13:05:00
+2011-01-19T13:05:00
+2011-02-16T13:05:00
+2011-03-23T13:05:00
+2011-04-20T13:05:00
+2011-05-18T13:05:00
+2011-06-22T13:05:00
+2011-07-20T13:05:00
+2011-08-24T13:05:00
+2011-09-21T13:05:00
+2011-10-19T13:05:00
+2011-11-23T13:05:00
+2011-12-21T13:05:00
+2012-01-18T13:05:00
+2012-02-22T13:05:00
+2012-03-21T13:05:00
+2012-04-18T13:05:00
+2012-05-23T13:05:00
+2012-06-20T13:05:00
+2012-07-18T13:05:00
+2012-08-22T13:05:00
+2012-09-19T13:05:00
+2012-10-24T13:05:00
+2012-11-21T13:05:00
+2012-12-19T13:05:00
+2013-01-23T13:05:00
+2013-02-20T13:05:00
+2013-03-20T13:05:00
+2013-04-17T13:05:00
+2013-05-22T13:05:00
+2013-06-19T13:05:00
+2013-07-24T13:05:00
+2013-08-21T13:05:00
+2013-09-18T13:05:00
+2013-10-23T13:05:00
+2013-11-20T13:05:00
+2013-12-18T13:05:00
+2014-01-22T13:05:00
+2014-02-19T13:05:00
+2014-03-19T13:05:00
+2014-04-23T13:05:00
+2014-05-21T13:05:00
+2014-06-18T13:05:00
+2014-07-23T13:05:00
+2014-08-20T13:05:00
+2014-09-17T13:05:00
+2014-10-22T13:05:00
+2014-11-19T13:05:00
+2014-12-24T13:05:00
+2015-01-21T13:05:00
+2015-02-18T13:05:00
+2015-03-18T13:05:00
+2015-04-22T13:05:00
+2015-05-20T13:05:00
+2015-06-17T13:05:00
+2015-07-22T13:05:00
+2015-08-19T13:05:00
+2015-09-23T13:05:00
+2015-10-21T13:05:00
+2015-11-18T13:05:00
+2015-12-23T13:05:00
+2016-01-20T13:05:00
+2016-02-17T13:05:00
+2016-03-23T13:05:00
+2016-04-20T13:05:00
+2016-05-18T13:05:00
+2016-06-22T13:05:00
+2016-07-20T13:05:00
+2016-08-24T13:05:00
+2016-09-21T13:05:00
+2016-10-19T13:05:00
+2016-11-23T13:05:00
+2016-12-21T13:05:00
+2017-01-18T13:05:00
+2017-02-15T13:05:00
+2017-03-22T13:05:00
+2017-04-19T13:05:00
+2017-05-24T13:05:00
+2017-06-21T13:05:00
+2017-07-19T13:05:00
+2017-08-23T13:05:00
+2017-09-20T13:05:00
+2017-10-18T13:05:00
+2017-11-22T13:05:00
+2017-12-20T13:05:00
+2018-01-24T13:05:00
+2018-02-21T13:05:00
+2018-03-21T13:05:00
+2018-04-18T13:05:00
+2018-05-23T13:05:00
+2018-06-20T13:05:00
+2018-07-18T13:05:00
+2018-08-22T13:05:00
+2018-09-19T13:05:00
+2018-10-24T13:05:00
+2018-11-21T13:05:00
+2018-12-19T13:05:00
+2019-01-23T13:05:00
+2019-02-20T13:05:00
+2019-03-20T13:05:00
+2019-04-17T13:05:00
+2019-05-22T13:05:00
+2019-06-19T13:05:00
+2019-07-24T13:05:00
+2019-08-21T13:05:00
+2019-09-18T13:05:00
+2019-10-23T13:05:00
+2019-11-20T13:05:00
+2019-12-18T13:05:00
+2020-01-22T13:05:00
+2020-02-19T13:05:00
+2020-03-18T13:05:00
+2020-04-22T13:05:00
+2020-05-20T13:05:00
+2020-06-17T13:05:00
+2020-07-22T13:05:00
+2020-08-19T13:05:00
+2020-09-23T13:05:00
+2020-10-21T13:05:00
+2020-11-18T13:05:00
+2020-12-23T13:05:00
+2021-01-20T13:05:00
+2021-02-17T13:05:00
+2021-03-24T13:05:00
+2021-04-21T13:05:00
+2021-05-19T13:05:00
+2021-06-23T13:05:00
+2021-07-21T13:05:00
+2021-08-18T13:05:00
+2021-09-22T13:05:00
+2021-10-20T13:05:00
+2021-11-17T13:05:00
+2021-12-22T13:05:00
+2022-01-19T13:05:00
+2022-02-16T13:05:00
+2022-03-23T13:05:00
+2022-04-20T13:05:00
+2022-05-18T13:05:00
+2022-06-22T13:05:00
+2022-07-20T13:05:00
+2022-08-24T13:05:00
+2022-09-21T13:05:00
+2022-10-19T13:05:00
+2022-11-23T13:05:00
+2022-12-21T13:05:00
+2023-01-18T13:05:00
+2023-02-15T13:05:00
+2023-03-22T13:05:00
+2023-04-19T13:05:00
+2023-05-24T13:05:00
+2023-06-21T13:05:00
+2023-07-19T13:05:00
+2023-08-23T13:05:00
+2023-09-20T13:05:00
+2023-10-18T13:05:00
+2023-11-22T13:05:00
+2023-12-20T13:05:00
+2024-01-24T13:05:00
+2024-02-21T13:05:00
+2024-03-20T13:05:00
+2024-04-17T13:05:00
+2024-05-22T13:05:00
+2024-06-19T13:05:00
+2024-07-24T13:05:00
+2024-08-21T13:05:00
+2024-09-18T13:05:00
+2024-10-23T13:05:00
+2024-11-20T13:05:00
+2024-12-18T13:05:00
+2025-01-22T13:05:00
+2025-02-19T13:05:00
+2025-03-19T13:05:00
+2025-04-23T13:05:00
+2025-05-21T13:05:00
+2025-06-18T13:05:00
+2025-07-23T13:05:00
+2025-08-20T13:05:00
+2025-09-17T13:05:00
+2025-10-22T13:05:00
+2025-11-19T13:05:00
+2025-12-24T13:05:00
+2026-01-21T13:05:00
+2026-02-18T13:05:00
+2026-03-18T13:05:00
+2026-04-22T13:05:00
+2026-05-20T13:05:00
+2026-06-17T13:05:00
+2026-07-22T13:05:00
+2026-08-19T13:05:00
+2026-09-23T13:05:00
+2026-10-21T13:05:00
+2026-11-18T13:05:00
+2026-12-23T13:05:00
+2027-01-20T13:05:00
+2027-02-17T13:05:00
+2027-03-24T13:05:00
+2027-04-21T13:05:00
+2027-05-19T13:05:00
+2027-06-23T13:05:00
+2027-07-21T13:05:00
+2027-08-18T13:05:00
+2027-09-22T13:05:00
+2027-10-20T13:05:00
+2027-11-17T13:05:00
+2027-12-22T13:05:00
+2028-01-19T13:05:00
+2028-02-16T13:05:00
+2028-03-22T13:05:00
+2028-04-19T13:05:00
+2028-05-24T13:05:00
+2028-06-21T13:05:00
+2028-07-19T13:05:00
+2028-08-23T13:05:00
+2028-09-20T13:05:00
+2028-10-18T13:05:00
+2028-11-22T13:05:00
+2028-12-20T13:05:00
+2029-01-24T13:05:00
+2029-02-21T13:05:00
+2029-03-21T13:05:00
+2029-04-18T13:05:00
+2029-05-23T13:05:00
+2029-06-20T13:05:00
+2029-07-18T13:05:00
+2029-08-22T13:05:00
+2029-09-19T13:05:00
+2029-10-24T13:05:00
+2029-11-21T13:05:00
+2029-12-19T13:05:00
+2030-01-23T13:05:00
+2030-02-20T13:05:00
+2030-03-20T13:05:00
+2030-04-17T13:05:00
+2030-05-22T13:05:00
+2030-06-19T13:05:00
+2030-07-24T13:05:00
+2030-08-21T13:05:00
+2030-09-18T13:05:00
+2030-10-23T13:05:00
+2030-11-20T13:05:00
+2030-12-18T13:05:00
+2031-01-22T13:05:00
+2031-02-19T13:05:00
+2031-03-19T13:05:00
+2031-04-23T13:05:00
+2031-05-21T13:05:00
+2031-06-18T13:05:00
+2031-07-23T13:05:00
+2031-08-20T13:05:00
+2031-09-17T13:05:00
+2031-10-22T13:05:00
+2031-11-19T13:05:00
+2031-12-24T13:05:00
+2032-01-21T13:05:00
+2032-02-18T13:05:00
+2032-03-24T13:05:00
+2032-04-21T13:05:00
+2032-05-19T13:05:00
+2032-06-23T13:05:00
+2032-07-21T13:05:00
+2032-08-18T13:05:00
+2032-09-22T13:05:00
+2032-10-20T13:05:00
+2032-11-17T13:05:00
+2032-12-22T13:05:00
+2033-01-19T13:05:00
+2033-02-16T13:05:00
+2033-03-23T13:05:00
+2033-04-20T13:05:00
+2033-05-18T13:05:00
+2033-06-22T13:05:00
+2033-07-20T13:05:00
+2033-08-24T13:05:00
+2033-09-21T13:05:00
+2033-10-19T13:05:00
+2033-11-23T13:05:00
+2033-12-21T13:05:00
+2034-01-18T13:05:00
+2034-02-15T13:05:00
+2034-03-22T13:05:00
+2034-04-19T13:05:00
+2034-05-24T13:05:00
+2034-06-21T13:05:00
+2034-07-19T13:05:00
+2034-08-23T13:05:00
+2034-09-20T13:05:00
+2034-10-18T13:05:00
+2034-11-22T13:05:00
+2034-12-20T13:05:00
+2035-01-24T13:05:00
+2035-02-21T13:05:00
+2035-03-21T13:05:00
+2035-04-18T13:05:00
+2035-05-23T13:05:00
+2035-06-20T13:05:00
+2035-07-18T13:05:00
+2035-08-22T13:05:00
+2035-09-19T13:05:00
+2035-10-24T13:05:00
+2035-11-21T13:05:00
+2035-12-19T13:05:00
+2036-01-23T13:05:00
+2036-02-20T13:05:00
+2036-03-19T13:05:00
+2036-04-23T13:05:00
+2036-05-21T13:05:00
+2036-06-18T13:05:00
+2036-07-23T13:05:00
+2036-08-20T13:05:00
+2036-09-17T13:05:00
+2036-10-22T13:05:00
+2036-11-19T13:05:00
+2036-12-24T13:05:00
+2037-01-21T13:05:00
+2037-02-18T13:05:00
+2037-03-18T13:05:00
+2037-04-22T13:05:00
+2037-05-20T13:05:00
+2037-06-17T13:05:00
+2037-07-22T13:05:00
+2037-08-19T13:05:00
+2037-09-23T13:05:00
+2037-10-21T13:05:00
+2037-11-18T13:05:00
+2037-12-23T13:05:00
+2038-01-20T13:05:00
+2038-02-17T13:05:00
+2038-03-24T13:05:00
+2038-04-21T13:05:00
+2038-05-19T13:05:00
+2038-06-23T13:05:00
+2038-07-21T13:05:00
+2038-08-18T13:05:00
+2038-09-22T13:05:00
+2038-10-20T13:05:00
+2038-11-17T13:05:00
+2038-12-22T13:05:00
+2039-01-19T13:05:00
+2039-02-16T13:05:00
+2039-03-23T13:05:00
+2039-04-20T13:05:00
+2039-05-18T13:05:00
+2039-06-22T13:05:00
+2039-07-20T13:05:00
+2039-08-24T13:05:00
+2039-09-21T13:05:00
+2039-10-19T13:05:00
+2039-11-23T13:05:00
+2039-12-21T13:05:00
+2040-01-18T13:05:00
+2040-02-22T13:05:00
+2040-03-21T13:05:00
+2040-04-18T13:05:00
+2040-05-23T13:05:00
+2040-06-20T13:05:00
+2040-07-18T13:05:00
+2040-08-22T13:05:00
+2040-09-19T13:05:00
+2040-10-24T13:05:00
+2040-11-21T13:05:00
+2040-12-19T13:05:00
+2041-01-23T13:05:00
+2041-02-20T13:05:00
+2041-03-20T13:05:00
+2041-04-17T13:05:00
+2041-05-22T13:05:00
+2041-06-19T13:05:00
+2041-07-24T13:05:00
+2041-08-21T13:05:00
+2041-09-18T13:05:00
+2041-10-23T13:05:00
+2041-11-20T13:05:00
+2041-12-18T13:05:00
+2042-01-22T13:05:00
+2042-02-19T13:05:00
+2042-03-19T13:05:00
+2042-04-23T13:05:00
+2042-05-21T13:05:00
+2042-06-18T13:05:00
+2042-07-23T13:05:00
+2042-08-20T13:05:00
+2042-09-17T13:05:00
+2042-10-22T13:05:00
+2042-11-19T13:05:00
+2042-12-24T13:05:00
+2043-01-21T13:05:00
+2043-02-18T13:05:00
+2043-03-18T13:05:00
+2043-04-22T13:05:00
+2043-05-20T13:05:00
+2043-06-17T13:05:00
+2043-07-22T13:05:00
+2043-08-19T13:05:00
+2043-09-23T13:05:00
+2043-10-21T13:05:00
+2043-11-18T13:05:00
+2043-12-23T13:05:00
+2044-01-20T13:05:00
+2044-02-17T13:05:00
+2044-03-23T13:05:00
+2044-04-20T13:05:00
+2044-05-18T13:05:00
+2044-06-22T13:05:00
+2044-07-20T13:05:00
+2044-08-24T13:05:00
+2044-09-21T13:05:00
+2044-10-19T13:05:00
+2044-11-23T13:05:00
+2044-12-21T13:05:00
+2045-01-18T13:05:00
+2045-02-15T13:05:00
+2045-03-22T13:05:00
+2045-04-19T13:05:00
+2045-05-24T13:05:00
+2045-06-21T13:05:00
+2045-07-19T13:05:00
+2045-08-23T13:05:00
+2045-09-20T13:05:00
+2045-10-18T13:05:00
+2045-11-22T13:05:00
+2045-12-20T13:05:00
+2046-01-24T13:05:00
+2046-02-21T13:05:00
+2046-03-21T13:05:00
+2046-04-18T13:05:00
+2046-05-23T13:05:00
+2046-06-20T13:05:00
+2046-07-18T13:05:00
+2046-08-22T13:05:00
+2046-09-19T13:05:00
+2046-10-24T13:05:00
+2046-11-21T13:05:00
+2046-12-19T13:05:00
+2047-01-23T13:05:00
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase08.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase08.ics.prev.ref
new file mode 100644
index 00000000..015200c8
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase08.ics.prev.ref
@@ -0,0 +1,68 @@
+2010-12-22T13:05:00
+2010-11-17T13:05:00
+2010-10-20T13:05:00
+2010-09-22T13:05:00
+2010-08-18T13:05:00
+2010-07-21T13:05:00
+2010-06-23T13:05:00
+2010-05-19T13:05:00
+2010-04-21T13:05:00
+2010-03-24T13:05:00
+2010-02-17T13:05:00
+2010-01-20T13:05:00
+2009-12-23T13:05:00
+2009-11-18T13:05:00
+2009-10-21T13:05:00
+2009-09-23T13:05:00
+2009-08-19T13:05:00
+2009-07-22T13:05:00
+2009-06-17T13:05:00
+2009-05-20T13:05:00
+2009-04-22T13:05:00
+2009-03-18T13:05:00
+2009-02-18T13:05:00
+2009-01-21T13:05:00
+2008-12-24T13:05:00
+2008-11-19T13:05:00
+2008-10-22T13:05:00
+2008-09-17T13:05:00
+2008-08-20T13:05:00
+2008-07-23T13:05:00
+2008-06-18T13:05:00
+2008-05-21T13:05:00
+2008-04-23T13:05:00
+2008-03-19T13:05:00
+2008-02-20T13:05:00
+2008-01-23T13:05:00
+2007-12-19T13:05:00
+2007-11-21T13:05:00
+2007-10-24T13:05:00
+2007-09-19T13:05:00
+2007-08-22T13:05:00
+2007-07-18T13:05:00
+2007-06-20T13:05:00
+2007-05-23T13:05:00
+2007-04-18T13:05:00
+2007-03-21T13:05:00
+2007-02-21T13:05:00
+2007-01-24T13:05:00
+2006-12-20T13:05:00
+2006-11-22T13:05:00
+2006-10-18T13:05:00
+2006-09-20T13:05:00
+2006-08-23T13:05:00
+2006-07-19T13:05:00
+2006-06-21T13:05:00
+2006-05-24T13:05:00
+2006-04-19T13:05:00
+2006-03-22T13:05:00
+2006-02-15T13:05:00
+2006-01-18T13:05:00
+2005-12-21T13:05:00
+2005-11-23T13:05:00
+2005-10-19T13:05:00
+2005-09-21T13:05:00
+2005-08-24T13:05:00
+2005-07-20T13:05:00
+2005-06-22T13:05:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase08.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase08.ics.recurson.ref
new file mode 100644
index 00000000..379519c3
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase08.ics.recurson.ref
@@ -0,0 +1,67 @@
+2005-06-22
+2005-07-20
+2005-08-24
+2005-09-21
+2005-10-19
+2005-11-23
+2005-12-21
+2006-01-18
+2006-02-15
+2006-03-22
+2006-04-19
+2006-05-24
+2006-06-21
+2006-07-19
+2006-08-23
+2006-09-20
+2006-10-18
+2006-11-22
+2006-12-20
+2007-01-24
+2007-02-21
+2007-03-21
+2007-04-18
+2007-05-23
+2007-06-20
+2007-07-18
+2007-08-22
+2007-09-19
+2007-10-24
+2007-11-21
+2007-12-19
+2008-01-23
+2008-02-20
+2008-03-19
+2008-04-23
+2008-05-21
+2008-06-18
+2008-07-23
+2008-08-20
+2008-09-17
+2008-10-22
+2008-11-19
+2008-12-24
+2009-01-21
+2009-02-18
+2009-03-18
+2009-04-22
+2009-05-20
+2009-06-17
+2009-07-22
+2009-08-19
+2009-09-23
+2009-10-21
+2009-11-18
+2009-12-23
+2010-01-20
+2010-02-17
+2010-03-24
+2010-04-21
+2010-05-19
+2010-06-23
+2010-07-21
+2010-08-18
+2010-09-22
+2010-10-20
+2010-11-17
+2010-12-22
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase09.ics b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase09.ics
new file mode 100644
index 00000000..8912493e
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase09.ics
@@ -0,0 +1,24 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KAlarm 1.2.6//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20050522T130601
+CREATED:20050522T124600
+UID:KAlarm-1071184954.82
+SEQUENCE:4
+LAST-MODIFIED:20050522T130201
+CLASS:PUBLIC
+PRIORITY:5
+CATEGORIES:SAVE
+RRULE:FREQ=MINUTELY;INTERVAL=4
+DTSTART:20050522T125000
+TRANSP:OPAQUE
+BEGIN:VALARM
+DESCRIPTION:Every 4 minutes
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:PT16M
+X-KDE-KALARM-FONTCOLOR:#ff0000\;#000000\;
+END:VALARM
+
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase09.ics.next.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase09.ics.next.ref
new file mode 100644
index 00000000..e402d708
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase09.ics.next.ref
@@ -0,0 +1,500 @@
+2005-05-22T12:50:00
+2005-05-22T12:54:00
+2005-05-22T12:58:00
+2005-05-22T13:02:00
+2005-05-22T13:06:00
+2005-05-22T13:10:00
+2005-05-22T13:14:00
+2005-05-22T13:18:00
+2005-05-22T13:22:00
+2005-05-22T13:26:00
+2005-05-22T13:30:00
+2005-05-22T13:34:00
+2005-05-22T13:38:00
+2005-05-22T13:42:00
+2005-05-22T13:46:00
+2005-05-22T13:50:00
+2005-05-22T13:54:00
+2005-05-22T13:58:00
+2005-05-22T14:02:00
+2005-05-22T14:06:00
+2005-05-22T14:10:00
+2005-05-22T14:14:00
+2005-05-22T14:18:00
+2005-05-22T14:22:00
+2005-05-22T14:26:00
+2005-05-22T14:30:00
+2005-05-22T14:34:00
+2005-05-22T14:38:00
+2005-05-22T14:42:00
+2005-05-22T14:46:00
+2005-05-22T14:50:00
+2005-05-22T14:54:00
+2005-05-22T14:58:00
+2005-05-22T15:02:00
+2005-05-22T15:06:00
+2005-05-22T15:10:00
+2005-05-22T15:14:00
+2005-05-22T15:18:00
+2005-05-22T15:22:00
+2005-05-22T15:26:00
+2005-05-22T15:30:00
+2005-05-22T15:34:00
+2005-05-22T15:38:00
+2005-05-22T15:42:00
+2005-05-22T15:46:00
+2005-05-22T15:50:00
+2005-05-22T15:54:00
+2005-05-22T15:58:00
+2005-05-22T16:02:00
+2005-05-22T16:06:00
+2005-05-22T16:10:00
+2005-05-22T16:14:00
+2005-05-22T16:18:00
+2005-05-22T16:22:00
+2005-05-22T16:26:00
+2005-05-22T16:30:00
+2005-05-22T16:34:00
+2005-05-22T16:38:00
+2005-05-22T16:42:00
+2005-05-22T16:46:00
+2005-05-22T16:50:00
+2005-05-22T16:54:00
+2005-05-22T16:58:00
+2005-05-22T17:02:00
+2005-05-22T17:06:00
+2005-05-22T17:10:00
+2005-05-22T17:14:00
+2005-05-22T17:18:00
+2005-05-22T17:22:00
+2005-05-22T17:26:00
+2005-05-22T17:30:00
+2005-05-22T17:34:00
+2005-05-22T17:38:00
+2005-05-22T17:42:00
+2005-05-22T17:46:00
+2005-05-22T17:50:00
+2005-05-22T17:54:00
+2005-05-22T17:58:00
+2005-05-22T18:02:00
+2005-05-22T18:06:00
+2005-05-22T18:10:00
+2005-05-22T18:14:00
+2005-05-22T18:18:00
+2005-05-22T18:22:00
+2005-05-22T18:26:00
+2005-05-22T18:30:00
+2005-05-22T18:34:00
+2005-05-22T18:38:00
+2005-05-22T18:42:00
+2005-05-22T18:46:00
+2005-05-22T18:50:00
+2005-05-22T18:54:00
+2005-05-22T18:58:00
+2005-05-22T19:02:00
+2005-05-22T19:06:00
+2005-05-22T19:10:00
+2005-05-22T19:14:00
+2005-05-22T19:18:00
+2005-05-22T19:22:00
+2005-05-22T19:26:00
+2005-05-22T19:30:00
+2005-05-22T19:34:00
+2005-05-22T19:38:00
+2005-05-22T19:42:00
+2005-05-22T19:46:00
+2005-05-22T19:50:00
+2005-05-22T19:54:00
+2005-05-22T19:58:00
+2005-05-22T20:02:00
+2005-05-22T20:06:00
+2005-05-22T20:10:00
+2005-05-22T20:14:00
+2005-05-22T20:18:00
+2005-05-22T20:22:00
+2005-05-22T20:26:00
+2005-05-22T20:30:00
+2005-05-22T20:34:00
+2005-05-22T20:38:00
+2005-05-22T20:42:00
+2005-05-22T20:46:00
+2005-05-22T20:50:00
+2005-05-22T20:54:00
+2005-05-22T20:58:00
+2005-05-22T21:02:00
+2005-05-22T21:06:00
+2005-05-22T21:10:00
+2005-05-22T21:14:00
+2005-05-22T21:18:00
+2005-05-22T21:22:00
+2005-05-22T21:26:00
+2005-05-22T21:30:00
+2005-05-22T21:34:00
+2005-05-22T21:38:00
+2005-05-22T21:42:00
+2005-05-22T21:46:00
+2005-05-22T21:50:00
+2005-05-22T21:54:00
+2005-05-22T21:58:00
+2005-05-22T22:02:00
+2005-05-22T22:06:00
+2005-05-22T22:10:00
+2005-05-22T22:14:00
+2005-05-22T22:18:00
+2005-05-22T22:22:00
+2005-05-22T22:26:00
+2005-05-22T22:30:00
+2005-05-22T22:34:00
+2005-05-22T22:38:00
+2005-05-22T22:42:00
+2005-05-22T22:46:00
+2005-05-22T22:50:00
+2005-05-22T22:54:00
+2005-05-22T22:58:00
+2005-05-22T23:02:00
+2005-05-22T23:06:00
+2005-05-22T23:10:00
+2005-05-22T23:14:00
+2005-05-22T23:18:00
+2005-05-22T23:22:00
+2005-05-22T23:26:00
+2005-05-22T23:30:00
+2005-05-22T23:34:00
+2005-05-22T23:38:00
+2005-05-22T23:42:00
+2005-05-22T23:46:00
+2005-05-22T23:50:00
+2005-05-22T23:54:00
+2005-05-22T23:58:00
+2005-05-23T00:02:00
+2005-05-23T00:06:00
+2005-05-23T00:10:00
+2005-05-23T00:14:00
+2005-05-23T00:18:00
+2005-05-23T00:22:00
+2005-05-23T00:26:00
+2005-05-23T00:30:00
+2005-05-23T00:34:00
+2005-05-23T00:38:00
+2005-05-23T00:42:00
+2005-05-23T00:46:00
+2005-05-23T00:50:00
+2005-05-23T00:54:00
+2005-05-23T00:58:00
+2005-05-23T01:02:00
+2005-05-23T01:06:00
+2005-05-23T01:10:00
+2005-05-23T01:14:00
+2005-05-23T01:18:00
+2005-05-23T01:22:00
+2005-05-23T01:26:00
+2005-05-23T01:30:00
+2005-05-23T01:34:00
+2005-05-23T01:38:00
+2005-05-23T01:42:00
+2005-05-23T01:46:00
+2005-05-23T01:50:00
+2005-05-23T01:54:00
+2005-05-23T01:58:00
+2005-05-23T02:02:00
+2005-05-23T02:06:00
+2005-05-23T02:10:00
+2005-05-23T02:14:00
+2005-05-23T02:18:00
+2005-05-23T02:22:00
+2005-05-23T02:26:00
+2005-05-23T02:30:00
+2005-05-23T02:34:00
+2005-05-23T02:38:00
+2005-05-23T02:42:00
+2005-05-23T02:46:00
+2005-05-23T02:50:00
+2005-05-23T02:54:00
+2005-05-23T02:58:00
+2005-05-23T03:02:00
+2005-05-23T03:06:00
+2005-05-23T03:10:00
+2005-05-23T03:14:00
+2005-05-23T03:18:00
+2005-05-23T03:22:00
+2005-05-23T03:26:00
+2005-05-23T03:30:00
+2005-05-23T03:34:00
+2005-05-23T03:38:00
+2005-05-23T03:42:00
+2005-05-23T03:46:00
+2005-05-23T03:50:00
+2005-05-23T03:54:00
+2005-05-23T03:58:00
+2005-05-23T04:02:00
+2005-05-23T04:06:00
+2005-05-23T04:10:00
+2005-05-23T04:14:00
+2005-05-23T04:18:00
+2005-05-23T04:22:00
+2005-05-23T04:26:00
+2005-05-23T04:30:00
+2005-05-23T04:34:00
+2005-05-23T04:38:00
+2005-05-23T04:42:00
+2005-05-23T04:46:00
+2005-05-23T04:50:00
+2005-05-23T04:54:00
+2005-05-23T04:58:00
+2005-05-23T05:02:00
+2005-05-23T05:06:00
+2005-05-23T05:10:00
+2005-05-23T05:14:00
+2005-05-23T05:18:00
+2005-05-23T05:22:00
+2005-05-23T05:26:00
+2005-05-23T05:30:00
+2005-05-23T05:34:00
+2005-05-23T05:38:00
+2005-05-23T05:42:00
+2005-05-23T05:46:00
+2005-05-23T05:50:00
+2005-05-23T05:54:00
+2005-05-23T05:58:00
+2005-05-23T06:02:00
+2005-05-23T06:06:00
+2005-05-23T06:10:00
+2005-05-23T06:14:00
+2005-05-23T06:18:00
+2005-05-23T06:22:00
+2005-05-23T06:26:00
+2005-05-23T06:30:00
+2005-05-23T06:34:00
+2005-05-23T06:38:00
+2005-05-23T06:42:00
+2005-05-23T06:46:00
+2005-05-23T06:50:00
+2005-05-23T06:54:00
+2005-05-23T06:58:00
+2005-05-23T07:02:00
+2005-05-23T07:06:00
+2005-05-23T07:10:00
+2005-05-23T07:14:00
+2005-05-23T07:18:00
+2005-05-23T07:22:00
+2005-05-23T07:26:00
+2005-05-23T07:30:00
+2005-05-23T07:34:00
+2005-05-23T07:38:00
+2005-05-23T07:42:00
+2005-05-23T07:46:00
+2005-05-23T07:50:00
+2005-05-23T07:54:00
+2005-05-23T07:58:00
+2005-05-23T08:02:00
+2005-05-23T08:06:00
+2005-05-23T08:10:00
+2005-05-23T08:14:00
+2005-05-23T08:18:00
+2005-05-23T08:22:00
+2005-05-23T08:26:00
+2005-05-23T08:30:00
+2005-05-23T08:34:00
+2005-05-23T08:38:00
+2005-05-23T08:42:00
+2005-05-23T08:46:00
+2005-05-23T08:50:00
+2005-05-23T08:54:00
+2005-05-23T08:58:00
+2005-05-23T09:02:00
+2005-05-23T09:06:00
+2005-05-23T09:10:00
+2005-05-23T09:14:00
+2005-05-23T09:18:00
+2005-05-23T09:22:00
+2005-05-23T09:26:00
+2005-05-23T09:30:00
+2005-05-23T09:34:00
+2005-05-23T09:38:00
+2005-05-23T09:42:00
+2005-05-23T09:46:00
+2005-05-23T09:50:00
+2005-05-23T09:54:00
+2005-05-23T09:58:00
+2005-05-23T10:02:00
+2005-05-23T10:06:00
+2005-05-23T10:10:00
+2005-05-23T10:14:00
+2005-05-23T10:18:00
+2005-05-23T10:22:00
+2005-05-23T10:26:00
+2005-05-23T10:30:00
+2005-05-23T10:34:00
+2005-05-23T10:38:00
+2005-05-23T10:42:00
+2005-05-23T10:46:00
+2005-05-23T10:50:00
+2005-05-23T10:54:00
+2005-05-23T10:58:00
+2005-05-23T11:02:00
+2005-05-23T11:06:00
+2005-05-23T11:10:00
+2005-05-23T11:14:00
+2005-05-23T11:18:00
+2005-05-23T11:22:00
+2005-05-23T11:26:00
+2005-05-23T11:30:00
+2005-05-23T11:34:00
+2005-05-23T11:38:00
+2005-05-23T11:42:00
+2005-05-23T11:46:00
+2005-05-23T11:50:00
+2005-05-23T11:54:00
+2005-05-23T11:58:00
+2005-05-23T12:02:00
+2005-05-23T12:06:00
+2005-05-23T12:10:00
+2005-05-23T12:14:00
+2005-05-23T12:18:00
+2005-05-23T12:22:00
+2005-05-23T12:26:00
+2005-05-23T12:30:00
+2005-05-23T12:34:00
+2005-05-23T12:38:00
+2005-05-23T12:42:00
+2005-05-23T12:46:00
+2005-05-23T12:50:00
+2005-05-23T12:54:00
+2005-05-23T12:58:00
+2005-05-23T13:02:00
+2005-05-23T13:06:00
+2005-05-23T13:10:00
+2005-05-23T13:14:00
+2005-05-23T13:18:00
+2005-05-23T13:22:00
+2005-05-23T13:26:00
+2005-05-23T13:30:00
+2005-05-23T13:34:00
+2005-05-23T13:38:00
+2005-05-23T13:42:00
+2005-05-23T13:46:00
+2005-05-23T13:50:00
+2005-05-23T13:54:00
+2005-05-23T13:58:00
+2005-05-23T14:02:00
+2005-05-23T14:06:00
+2005-05-23T14:10:00
+2005-05-23T14:14:00
+2005-05-23T14:18:00
+2005-05-23T14:22:00
+2005-05-23T14:26:00
+2005-05-23T14:30:00
+2005-05-23T14:34:00
+2005-05-23T14:38:00
+2005-05-23T14:42:00
+2005-05-23T14:46:00
+2005-05-23T14:50:00
+2005-05-23T14:54:00
+2005-05-23T14:58:00
+2005-05-23T15:02:00
+2005-05-23T15:06:00
+2005-05-23T15:10:00
+2005-05-23T15:14:00
+2005-05-23T15:18:00
+2005-05-23T15:22:00
+2005-05-23T15:26:00
+2005-05-23T15:30:00
+2005-05-23T15:34:00
+2005-05-23T15:38:00
+2005-05-23T15:42:00
+2005-05-23T15:46:00
+2005-05-23T15:50:00
+2005-05-23T15:54:00
+2005-05-23T15:58:00
+2005-05-23T16:02:00
+2005-05-23T16:06:00
+2005-05-23T16:10:00
+2005-05-23T16:14:00
+2005-05-23T16:18:00
+2005-05-23T16:22:00
+2005-05-23T16:26:00
+2005-05-23T16:30:00
+2005-05-23T16:34:00
+2005-05-23T16:38:00
+2005-05-23T16:42:00
+2005-05-23T16:46:00
+2005-05-23T16:50:00
+2005-05-23T16:54:00
+2005-05-23T16:58:00
+2005-05-23T17:02:00
+2005-05-23T17:06:00
+2005-05-23T17:10:00
+2005-05-23T17:14:00
+2005-05-23T17:18:00
+2005-05-23T17:22:00
+2005-05-23T17:26:00
+2005-05-23T17:30:00
+2005-05-23T17:34:00
+2005-05-23T17:38:00
+2005-05-23T17:42:00
+2005-05-23T17:46:00
+2005-05-23T17:50:00
+2005-05-23T17:54:00
+2005-05-23T17:58:00
+2005-05-23T18:02:00
+2005-05-23T18:06:00
+2005-05-23T18:10:00
+2005-05-23T18:14:00
+2005-05-23T18:18:00
+2005-05-23T18:22:00
+2005-05-23T18:26:00
+2005-05-23T18:30:00
+2005-05-23T18:34:00
+2005-05-23T18:38:00
+2005-05-23T18:42:00
+2005-05-23T18:46:00
+2005-05-23T18:50:00
+2005-05-23T18:54:00
+2005-05-23T18:58:00
+2005-05-23T19:02:00
+2005-05-23T19:06:00
+2005-05-23T19:10:00
+2005-05-23T19:14:00
+2005-05-23T19:18:00
+2005-05-23T19:22:00
+2005-05-23T19:26:00
+2005-05-23T19:30:00
+2005-05-23T19:34:00
+2005-05-23T19:38:00
+2005-05-23T19:42:00
+2005-05-23T19:46:00
+2005-05-23T19:50:00
+2005-05-23T19:54:00
+2005-05-23T19:58:00
+2005-05-23T20:02:00
+2005-05-23T20:06:00
+2005-05-23T20:10:00
+2005-05-23T20:14:00
+2005-05-23T20:18:00
+2005-05-23T20:22:00
+2005-05-23T20:26:00
+2005-05-23T20:30:00
+2005-05-23T20:34:00
+2005-05-23T20:38:00
+2005-05-23T20:42:00
+2005-05-23T20:46:00
+2005-05-23T20:50:00
+2005-05-23T20:54:00
+2005-05-23T20:58:00
+2005-05-23T21:02:00
+2005-05-23T21:06:00
+2005-05-23T21:10:00
+2005-05-23T21:14:00
+2005-05-23T21:18:00
+2005-05-23T21:22:00
+2005-05-23T21:26:00
+2005-05-23T21:30:00
+2005-05-23T21:34:00
+2005-05-23T21:38:00
+2005-05-23T21:42:00
+2005-05-23T21:46:00
+2005-05-23T21:50:00
+2005-05-23T21:54:00
+2005-05-23T21:58:00
+2005-05-23T22:02:00
+2005-05-23T22:06:00
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase09.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase09.ics.prev.ref
new file mode 100644
index 00000000..f8c261cb
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase09.ics.prev.ref
@@ -0,0 +1,500 @@
+2010-12-31T23:58:00
+2010-12-31T23:54:00
+2010-12-31T23:50:00
+2010-12-31T23:46:00
+2010-12-31T23:42:00
+2010-12-31T23:38:00
+2010-12-31T23:34:00
+2010-12-31T23:30:00
+2010-12-31T23:26:00
+2010-12-31T23:22:00
+2010-12-31T23:18:00
+2010-12-31T23:14:00
+2010-12-31T23:10:00
+2010-12-31T23:06:00
+2010-12-31T23:02:00
+2010-12-31T22:58:00
+2010-12-31T22:54:00
+2010-12-31T22:50:00
+2010-12-31T22:46:00
+2010-12-31T22:42:00
+2010-12-31T22:38:00
+2010-12-31T22:34:00
+2010-12-31T22:30:00
+2010-12-31T22:26:00
+2010-12-31T22:22:00
+2010-12-31T22:18:00
+2010-12-31T22:14:00
+2010-12-31T22:10:00
+2010-12-31T22:06:00
+2010-12-31T22:02:00
+2010-12-31T21:58:00
+2010-12-31T21:54:00
+2010-12-31T21:50:00
+2010-12-31T21:46:00
+2010-12-31T21:42:00
+2010-12-31T21:38:00
+2010-12-31T21:34:00
+2010-12-31T21:30:00
+2010-12-31T21:26:00
+2010-12-31T21:22:00
+2010-12-31T21:18:00
+2010-12-31T21:14:00
+2010-12-31T21:10:00
+2010-12-31T21:06:00
+2010-12-31T21:02:00
+2010-12-31T20:58:00
+2010-12-31T20:54:00
+2010-12-31T20:50:00
+2010-12-31T20:46:00
+2010-12-31T20:42:00
+2010-12-31T20:38:00
+2010-12-31T20:34:00
+2010-12-31T20:30:00
+2010-12-31T20:26:00
+2010-12-31T20:22:00
+2010-12-31T20:18:00
+2010-12-31T20:14:00
+2010-12-31T20:10:00
+2010-12-31T20:06:00
+2010-12-31T20:02:00
+2010-12-31T19:58:00
+2010-12-31T19:54:00
+2010-12-31T19:50:00
+2010-12-31T19:46:00
+2010-12-31T19:42:00
+2010-12-31T19:38:00
+2010-12-31T19:34:00
+2010-12-31T19:30:00
+2010-12-31T19:26:00
+2010-12-31T19:22:00
+2010-12-31T19:18:00
+2010-12-31T19:14:00
+2010-12-31T19:10:00
+2010-12-31T19:06:00
+2010-12-31T19:02:00
+2010-12-31T18:58:00
+2010-12-31T18:54:00
+2010-12-31T18:50:00
+2010-12-31T18:46:00
+2010-12-31T18:42:00
+2010-12-31T18:38:00
+2010-12-31T18:34:00
+2010-12-31T18:30:00
+2010-12-31T18:26:00
+2010-12-31T18:22:00
+2010-12-31T18:18:00
+2010-12-31T18:14:00
+2010-12-31T18:10:00
+2010-12-31T18:06:00
+2010-12-31T18:02:00
+2010-12-31T17:58:00
+2010-12-31T17:54:00
+2010-12-31T17:50:00
+2010-12-31T17:46:00
+2010-12-31T17:42:00
+2010-12-31T17:38:00
+2010-12-31T17:34:00
+2010-12-31T17:30:00
+2010-12-31T17:26:00
+2010-12-31T17:22:00
+2010-12-31T17:18:00
+2010-12-31T17:14:00
+2010-12-31T17:10:00
+2010-12-31T17:06:00
+2010-12-31T17:02:00
+2010-12-31T16:58:00
+2010-12-31T16:54:00
+2010-12-31T16:50:00
+2010-12-31T16:46:00
+2010-12-31T16:42:00
+2010-12-31T16:38:00
+2010-12-31T16:34:00
+2010-12-31T16:30:00
+2010-12-31T16:26:00
+2010-12-31T16:22:00
+2010-12-31T16:18:00
+2010-12-31T16:14:00
+2010-12-31T16:10:00
+2010-12-31T16:06:00
+2010-12-31T16:02:00
+2010-12-31T15:58:00
+2010-12-31T15:54:00
+2010-12-31T15:50:00
+2010-12-31T15:46:00
+2010-12-31T15:42:00
+2010-12-31T15:38:00
+2010-12-31T15:34:00
+2010-12-31T15:30:00
+2010-12-31T15:26:00
+2010-12-31T15:22:00
+2010-12-31T15:18:00
+2010-12-31T15:14:00
+2010-12-31T15:10:00
+2010-12-31T15:06:00
+2010-12-31T15:02:00
+2010-12-31T14:58:00
+2010-12-31T14:54:00
+2010-12-31T14:50:00
+2010-12-31T14:46:00
+2010-12-31T14:42:00
+2010-12-31T14:38:00
+2010-12-31T14:34:00
+2010-12-31T14:30:00
+2010-12-31T14:26:00
+2010-12-31T14:22:00
+2010-12-31T14:18:00
+2010-12-31T14:14:00
+2010-12-31T14:10:00
+2010-12-31T14:06:00
+2010-12-31T14:02:00
+2010-12-31T13:58:00
+2010-12-31T13:54:00
+2010-12-31T13:50:00
+2010-12-31T13:46:00
+2010-12-31T13:42:00
+2010-12-31T13:38:00
+2010-12-31T13:34:00
+2010-12-31T13:30:00
+2010-12-31T13:26:00
+2010-12-31T13:22:00
+2010-12-31T13:18:00
+2010-12-31T13:14:00
+2010-12-31T13:10:00
+2010-12-31T13:06:00
+2010-12-31T13:02:00
+2010-12-31T12:58:00
+2010-12-31T12:54:00
+2010-12-31T12:50:00
+2010-12-31T12:46:00
+2010-12-31T12:42:00
+2010-12-31T12:38:00
+2010-12-31T12:34:00
+2010-12-31T12:30:00
+2010-12-31T12:26:00
+2010-12-31T12:22:00
+2010-12-31T12:18:00
+2010-12-31T12:14:00
+2010-12-31T12:10:00
+2010-12-31T12:06:00
+2010-12-31T12:02:00
+2010-12-31T11:58:00
+2010-12-31T11:54:00
+2010-12-31T11:50:00
+2010-12-31T11:46:00
+2010-12-31T11:42:00
+2010-12-31T11:38:00
+2010-12-31T11:34:00
+2010-12-31T11:30:00
+2010-12-31T11:26:00
+2010-12-31T11:22:00
+2010-12-31T11:18:00
+2010-12-31T11:14:00
+2010-12-31T11:10:00
+2010-12-31T11:06:00
+2010-12-31T11:02:00
+2010-12-31T10:58:00
+2010-12-31T10:54:00
+2010-12-31T10:50:00
+2010-12-31T10:46:00
+2010-12-31T10:42:00
+2010-12-31T10:38:00
+2010-12-31T10:34:00
+2010-12-31T10:30:00
+2010-12-31T10:26:00
+2010-12-31T10:22:00
+2010-12-31T10:18:00
+2010-12-31T10:14:00
+2010-12-31T10:10:00
+2010-12-31T10:06:00
+2010-12-31T10:02:00
+2010-12-31T09:58:00
+2010-12-31T09:54:00
+2010-12-31T09:50:00
+2010-12-31T09:46:00
+2010-12-31T09:42:00
+2010-12-31T09:38:00
+2010-12-31T09:34:00
+2010-12-31T09:30:00
+2010-12-31T09:26:00
+2010-12-31T09:22:00
+2010-12-31T09:18:00
+2010-12-31T09:14:00
+2010-12-31T09:10:00
+2010-12-31T09:06:00
+2010-12-31T09:02:00
+2010-12-31T08:58:00
+2010-12-31T08:54:00
+2010-12-31T08:50:00
+2010-12-31T08:46:00
+2010-12-31T08:42:00
+2010-12-31T08:38:00
+2010-12-31T08:34:00
+2010-12-31T08:30:00
+2010-12-31T08:26:00
+2010-12-31T08:22:00
+2010-12-31T08:18:00
+2010-12-31T08:14:00
+2010-12-31T08:10:00
+2010-12-31T08:06:00
+2010-12-31T08:02:00
+2010-12-31T07:58:00
+2010-12-31T07:54:00
+2010-12-31T07:50:00
+2010-12-31T07:46:00
+2010-12-31T07:42:00
+2010-12-31T07:38:00
+2010-12-31T07:34:00
+2010-12-31T07:30:00
+2010-12-31T07:26:00
+2010-12-31T07:22:00
+2010-12-31T07:18:00
+2010-12-31T07:14:00
+2010-12-31T07:10:00
+2010-12-31T07:06:00
+2010-12-31T07:02:00
+2010-12-31T06:58:00
+2010-12-31T06:54:00
+2010-12-31T06:50:00
+2010-12-31T06:46:00
+2010-12-31T06:42:00
+2010-12-31T06:38:00
+2010-12-31T06:34:00
+2010-12-31T06:30:00
+2010-12-31T06:26:00
+2010-12-31T06:22:00
+2010-12-31T06:18:00
+2010-12-31T06:14:00
+2010-12-31T06:10:00
+2010-12-31T06:06:00
+2010-12-31T06:02:00
+2010-12-31T05:58:00
+2010-12-31T05:54:00
+2010-12-31T05:50:00
+2010-12-31T05:46:00
+2010-12-31T05:42:00
+2010-12-31T05:38:00
+2010-12-31T05:34:00
+2010-12-31T05:30:00
+2010-12-31T05:26:00
+2010-12-31T05:22:00
+2010-12-31T05:18:00
+2010-12-31T05:14:00
+2010-12-31T05:10:00
+2010-12-31T05:06:00
+2010-12-31T05:02:00
+2010-12-31T04:58:00
+2010-12-31T04:54:00
+2010-12-31T04:50:00
+2010-12-31T04:46:00
+2010-12-31T04:42:00
+2010-12-31T04:38:00
+2010-12-31T04:34:00
+2010-12-31T04:30:00
+2010-12-31T04:26:00
+2010-12-31T04:22:00
+2010-12-31T04:18:00
+2010-12-31T04:14:00
+2010-12-31T04:10:00
+2010-12-31T04:06:00
+2010-12-31T04:02:00
+2010-12-31T03:58:00
+2010-12-31T03:54:00
+2010-12-31T03:50:00
+2010-12-31T03:46:00
+2010-12-31T03:42:00
+2010-12-31T03:38:00
+2010-12-31T03:34:00
+2010-12-31T03:30:00
+2010-12-31T03:26:00
+2010-12-31T03:22:00
+2010-12-31T03:18:00
+2010-12-31T03:14:00
+2010-12-31T03:10:00
+2010-12-31T03:06:00
+2010-12-31T03:02:00
+2010-12-31T02:58:00
+2010-12-31T02:54:00
+2010-12-31T02:50:00
+2010-12-31T02:46:00
+2010-12-31T02:42:00
+2010-12-31T02:38:00
+2010-12-31T02:34:00
+2010-12-31T02:30:00
+2010-12-31T02:26:00
+2010-12-31T02:22:00
+2010-12-31T02:18:00
+2010-12-31T02:14:00
+2010-12-31T02:10:00
+2010-12-31T02:06:00
+2010-12-31T02:02:00
+2010-12-31T01:58:00
+2010-12-31T01:54:00
+2010-12-31T01:50:00
+2010-12-31T01:46:00
+2010-12-31T01:42:00
+2010-12-31T01:38:00
+2010-12-31T01:34:00
+2010-12-31T01:30:00
+2010-12-31T01:26:00
+2010-12-31T01:22:00
+2010-12-31T01:18:00
+2010-12-31T01:14:00
+2010-12-31T01:10:00
+2010-12-31T01:06:00
+2010-12-31T01:02:00
+2010-12-31T00:58:00
+2010-12-31T00:54:00
+2010-12-31T00:50:00
+2010-12-31T00:46:00
+2010-12-31T00:42:00
+2010-12-31T00:38:00
+2010-12-31T00:34:00
+2010-12-31T00:30:00
+2010-12-31T00:26:00
+2010-12-31T00:22:00
+2010-12-31T00:18:00
+2010-12-31T00:14:00
+2010-12-31T00:10:00
+2010-12-31T00:06:00
+2010-12-31T00:02:00
+2010-12-30T23:58:00
+2010-12-30T23:54:00
+2010-12-30T23:50:00
+2010-12-30T23:46:00
+2010-12-30T23:42:00
+2010-12-30T23:38:00
+2010-12-30T23:34:00
+2010-12-30T23:30:00
+2010-12-30T23:26:00
+2010-12-30T23:22:00
+2010-12-30T23:18:00
+2010-12-30T23:14:00
+2010-12-30T23:10:00
+2010-12-30T23:06:00
+2010-12-30T23:02:00
+2010-12-30T22:58:00
+2010-12-30T22:54:00
+2010-12-30T22:50:00
+2010-12-30T22:46:00
+2010-12-30T22:42:00
+2010-12-30T22:38:00
+2010-12-30T22:34:00
+2010-12-30T22:30:00
+2010-12-30T22:26:00
+2010-12-30T22:22:00
+2010-12-30T22:18:00
+2010-12-30T22:14:00
+2010-12-30T22:10:00
+2010-12-30T22:06:00
+2010-12-30T22:02:00
+2010-12-30T21:58:00
+2010-12-30T21:54:00
+2010-12-30T21:50:00
+2010-12-30T21:46:00
+2010-12-30T21:42:00
+2010-12-30T21:38:00
+2010-12-30T21:34:00
+2010-12-30T21:30:00
+2010-12-30T21:26:00
+2010-12-30T21:22:00
+2010-12-30T21:18:00
+2010-12-30T21:14:00
+2010-12-30T21:10:00
+2010-12-30T21:06:00
+2010-12-30T21:02:00
+2010-12-30T20:58:00
+2010-12-30T20:54:00
+2010-12-30T20:50:00
+2010-12-30T20:46:00
+2010-12-30T20:42:00
+2010-12-30T20:38:00
+2010-12-30T20:34:00
+2010-12-30T20:30:00
+2010-12-30T20:26:00
+2010-12-30T20:22:00
+2010-12-30T20:18:00
+2010-12-30T20:14:00
+2010-12-30T20:10:00
+2010-12-30T20:06:00
+2010-12-30T20:02:00
+2010-12-30T19:58:00
+2010-12-30T19:54:00
+2010-12-30T19:50:00
+2010-12-30T19:46:00
+2010-12-30T19:42:00
+2010-12-30T19:38:00
+2010-12-30T19:34:00
+2010-12-30T19:30:00
+2010-12-30T19:26:00
+2010-12-30T19:22:00
+2010-12-30T19:18:00
+2010-12-30T19:14:00
+2010-12-30T19:10:00
+2010-12-30T19:06:00
+2010-12-30T19:02:00
+2010-12-30T18:58:00
+2010-12-30T18:54:00
+2010-12-30T18:50:00
+2010-12-30T18:46:00
+2010-12-30T18:42:00
+2010-12-30T18:38:00
+2010-12-30T18:34:00
+2010-12-30T18:30:00
+2010-12-30T18:26:00
+2010-12-30T18:22:00
+2010-12-30T18:18:00
+2010-12-30T18:14:00
+2010-12-30T18:10:00
+2010-12-30T18:06:00
+2010-12-30T18:02:00
+2010-12-30T17:58:00
+2010-12-30T17:54:00
+2010-12-30T17:50:00
+2010-12-30T17:46:00
+2010-12-30T17:42:00
+2010-12-30T17:38:00
+2010-12-30T17:34:00
+2010-12-30T17:30:00
+2010-12-30T17:26:00
+2010-12-30T17:22:00
+2010-12-30T17:18:00
+2010-12-30T17:14:00
+2010-12-30T17:10:00
+2010-12-30T17:06:00
+2010-12-30T17:02:00
+2010-12-30T16:58:00
+2010-12-30T16:54:00
+2010-12-30T16:50:00
+2010-12-30T16:46:00
+2010-12-30T16:42:00
+2010-12-30T16:38:00
+2010-12-30T16:34:00
+2010-12-30T16:30:00
+2010-12-30T16:26:00
+2010-12-30T16:22:00
+2010-12-30T16:18:00
+2010-12-30T16:14:00
+2010-12-30T16:10:00
+2010-12-30T16:06:00
+2010-12-30T16:02:00
+2010-12-30T15:58:00
+2010-12-30T15:54:00
+2010-12-30T15:50:00
+2010-12-30T15:46:00
+2010-12-30T15:42:00
+2010-12-30T15:38:00
+2010-12-30T15:34:00
+2010-12-30T15:30:00
+2010-12-30T15:26:00
+2010-12-30T15:22:00
+2010-12-30T15:18:00
+2010-12-30T15:14:00
+2010-12-30T15:10:00
+2010-12-30T15:06:00
+2010-12-30T15:02:00
+2010-12-30T14:58:00
+2010-12-30T14:54:00
+2010-12-30T14:50:00
+2010-12-30T14:46:00
+2010-12-30T14:42:00
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase09.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase09.ics.recurson.ref
new file mode 100644
index 00000000..04ba619c
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase09.ics.recurson.ref
@@ -0,0 +1,2050 @@
+2005-05-22
+2005-05-23
+2005-05-24
+2005-05-25
+2005-05-26
+2005-05-27
+2005-05-28
+2005-05-29
+2005-05-30
+2005-05-31
+2005-06-01
+2005-06-02
+2005-06-03
+2005-06-04
+2005-06-05
+2005-06-06
+2005-06-07
+2005-06-08
+2005-06-09
+2005-06-10
+2005-06-11
+2005-06-12
+2005-06-13
+2005-06-14
+2005-06-15
+2005-06-16
+2005-06-17
+2005-06-18
+2005-06-19
+2005-06-20
+2005-06-21
+2005-06-22
+2005-06-23
+2005-06-24
+2005-06-25
+2005-06-26
+2005-06-27
+2005-06-28
+2005-06-29
+2005-06-30
+2005-07-01
+2005-07-02
+2005-07-03
+2005-07-04
+2005-07-05
+2005-07-06
+2005-07-07
+2005-07-08
+2005-07-09
+2005-07-10
+2005-07-11
+2005-07-12
+2005-07-13
+2005-07-14
+2005-07-15
+2005-07-16
+2005-07-17
+2005-07-18
+2005-07-19
+2005-07-20
+2005-07-21
+2005-07-22
+2005-07-23
+2005-07-24
+2005-07-25
+2005-07-26
+2005-07-27
+2005-07-28
+2005-07-29
+2005-07-30
+2005-07-31
+2005-08-01
+2005-08-02
+2005-08-03
+2005-08-04
+2005-08-05
+2005-08-06
+2005-08-07
+2005-08-08
+2005-08-09
+2005-08-10
+2005-08-11
+2005-08-12
+2005-08-13
+2005-08-14
+2005-08-15
+2005-08-16
+2005-08-17
+2005-08-18
+2005-08-19
+2005-08-20
+2005-08-21
+2005-08-22
+2005-08-23
+2005-08-24
+2005-08-25
+2005-08-26
+2005-08-27
+2005-08-28
+2005-08-29
+2005-08-30
+2005-08-31
+2005-09-01
+2005-09-02
+2005-09-03
+2005-09-04
+2005-09-05
+2005-09-06
+2005-09-07
+2005-09-08
+2005-09-09
+2005-09-10
+2005-09-11
+2005-09-12
+2005-09-13
+2005-09-14
+2005-09-15
+2005-09-16
+2005-09-17
+2005-09-18
+2005-09-19
+2005-09-20
+2005-09-21
+2005-09-22
+2005-09-23
+2005-09-24
+2005-09-25
+2005-09-26
+2005-09-27
+2005-09-28
+2005-09-29
+2005-09-30
+2005-10-01
+2005-10-02
+2005-10-03
+2005-10-04
+2005-10-05
+2005-10-06
+2005-10-07
+2005-10-08
+2005-10-09
+2005-10-10
+2005-10-11
+2005-10-12
+2005-10-13
+2005-10-14
+2005-10-15
+2005-10-16
+2005-10-17
+2005-10-18
+2005-10-19
+2005-10-20
+2005-10-21
+2005-10-22
+2005-10-23
+2005-10-24
+2005-10-25
+2005-10-26
+2005-10-27
+2005-10-28
+2005-10-29
+2005-10-30
+2005-10-31
+2005-11-01
+2005-11-02
+2005-11-03
+2005-11-04
+2005-11-05
+2005-11-06
+2005-11-07
+2005-11-08
+2005-11-09
+2005-11-10
+2005-11-11
+2005-11-12
+2005-11-13
+2005-11-14
+2005-11-15
+2005-11-16
+2005-11-17
+2005-11-18
+2005-11-19
+2005-11-20
+2005-11-21
+2005-11-22
+2005-11-23
+2005-11-24
+2005-11-25
+2005-11-26
+2005-11-27
+2005-11-28
+2005-11-29
+2005-11-30
+2005-12-01
+2005-12-02
+2005-12-03
+2005-12-04
+2005-12-05
+2005-12-06
+2005-12-07
+2005-12-08
+2005-12-09
+2005-12-10
+2005-12-11
+2005-12-12
+2005-12-13
+2005-12-14
+2005-12-15
+2005-12-16
+2005-12-17
+2005-12-18
+2005-12-19
+2005-12-20
+2005-12-21
+2005-12-22
+2005-12-23
+2005-12-24
+2005-12-25
+2005-12-26
+2005-12-27
+2005-12-28
+2005-12-29
+2005-12-30
+2005-12-31
+2006-01-01
+2006-01-02
+2006-01-03
+2006-01-04
+2006-01-05
+2006-01-06
+2006-01-07
+2006-01-08
+2006-01-09
+2006-01-10
+2006-01-11
+2006-01-12
+2006-01-13
+2006-01-14
+2006-01-15
+2006-01-16
+2006-01-17
+2006-01-18
+2006-01-19
+2006-01-20
+2006-01-21
+2006-01-22
+2006-01-23
+2006-01-24
+2006-01-25
+2006-01-26
+2006-01-27
+2006-01-28
+2006-01-29
+2006-01-30
+2006-01-31
+2006-02-01
+2006-02-02
+2006-02-03
+2006-02-04
+2006-02-05
+2006-02-06
+2006-02-07
+2006-02-08
+2006-02-09
+2006-02-10
+2006-02-11
+2006-02-12
+2006-02-13
+2006-02-14
+2006-02-15
+2006-02-16
+2006-02-17
+2006-02-18
+2006-02-19
+2006-02-20
+2006-02-21
+2006-02-22
+2006-02-23
+2006-02-24
+2006-02-25
+2006-02-26
+2006-02-27
+2006-02-28
+2006-03-01
+2006-03-02
+2006-03-03
+2006-03-04
+2006-03-05
+2006-03-06
+2006-03-07
+2006-03-08
+2006-03-09
+2006-03-10
+2006-03-11
+2006-03-12
+2006-03-13
+2006-03-14
+2006-03-15
+2006-03-16
+2006-03-17
+2006-03-18
+2006-03-19
+2006-03-20
+2006-03-21
+2006-03-22
+2006-03-23
+2006-03-24
+2006-03-25
+2006-03-26
+2006-03-27
+2006-03-28
+2006-03-29
+2006-03-30
+2006-03-31
+2006-04-01
+2006-04-02
+2006-04-03
+2006-04-04
+2006-04-05
+2006-04-06
+2006-04-07
+2006-04-08
+2006-04-09
+2006-04-10
+2006-04-11
+2006-04-12
+2006-04-13
+2006-04-14
+2006-04-15
+2006-04-16
+2006-04-17
+2006-04-18
+2006-04-19
+2006-04-20
+2006-04-21
+2006-04-22
+2006-04-23
+2006-04-24
+2006-04-25
+2006-04-26
+2006-04-27
+2006-04-28
+2006-04-29
+2006-04-30
+2006-05-01
+2006-05-02
+2006-05-03
+2006-05-04
+2006-05-05
+2006-05-06
+2006-05-07
+2006-05-08
+2006-05-09
+2006-05-10
+2006-05-11
+2006-05-12
+2006-05-13
+2006-05-14
+2006-05-15
+2006-05-16
+2006-05-17
+2006-05-18
+2006-05-19
+2006-05-20
+2006-05-21
+2006-05-22
+2006-05-23
+2006-05-24
+2006-05-25
+2006-05-26
+2006-05-27
+2006-05-28
+2006-05-29
+2006-05-30
+2006-05-31
+2006-06-01
+2006-06-02
+2006-06-03
+2006-06-04
+2006-06-05
+2006-06-06
+2006-06-07
+2006-06-08
+2006-06-09
+2006-06-10
+2006-06-11
+2006-06-12
+2006-06-13
+2006-06-14
+2006-06-15
+2006-06-16
+2006-06-17
+2006-06-18
+2006-06-19
+2006-06-20
+2006-06-21
+2006-06-22
+2006-06-23
+2006-06-24
+2006-06-25
+2006-06-26
+2006-06-27
+2006-06-28
+2006-06-29
+2006-06-30
+2006-07-01
+2006-07-02
+2006-07-03
+2006-07-04
+2006-07-05
+2006-07-06
+2006-07-07
+2006-07-08
+2006-07-09
+2006-07-10
+2006-07-11
+2006-07-12
+2006-07-13
+2006-07-14
+2006-07-15
+2006-07-16
+2006-07-17
+2006-07-18
+2006-07-19
+2006-07-20
+2006-07-21
+2006-07-22
+2006-07-23
+2006-07-24
+2006-07-25
+2006-07-26
+2006-07-27
+2006-07-28
+2006-07-29
+2006-07-30
+2006-07-31
+2006-08-01
+2006-08-02
+2006-08-03
+2006-08-04
+2006-08-05
+2006-08-06
+2006-08-07
+2006-08-08
+2006-08-09
+2006-08-10
+2006-08-11
+2006-08-12
+2006-08-13
+2006-08-14
+2006-08-15
+2006-08-16
+2006-08-17
+2006-08-18
+2006-08-19
+2006-08-20
+2006-08-21
+2006-08-22
+2006-08-23
+2006-08-24
+2006-08-25
+2006-08-26
+2006-08-27
+2006-08-28
+2006-08-29
+2006-08-30
+2006-08-31
+2006-09-01
+2006-09-02
+2006-09-03
+2006-09-04
+2006-09-05
+2006-09-06
+2006-09-07
+2006-09-08
+2006-09-09
+2006-09-10
+2006-09-11
+2006-09-12
+2006-09-13
+2006-09-14
+2006-09-15
+2006-09-16
+2006-09-17
+2006-09-18
+2006-09-19
+2006-09-20
+2006-09-21
+2006-09-22
+2006-09-23
+2006-09-24
+2006-09-25
+2006-09-26
+2006-09-27
+2006-09-28
+2006-09-29
+2006-09-30
+2006-10-01
+2006-10-02
+2006-10-03
+2006-10-04
+2006-10-05
+2006-10-06
+2006-10-07
+2006-10-08
+2006-10-09
+2006-10-10
+2006-10-11
+2006-10-12
+2006-10-13
+2006-10-14
+2006-10-15
+2006-10-16
+2006-10-17
+2006-10-18
+2006-10-19
+2006-10-20
+2006-10-21
+2006-10-22
+2006-10-23
+2006-10-24
+2006-10-25
+2006-10-26
+2006-10-27
+2006-10-28
+2006-10-29
+2006-10-30
+2006-10-31
+2006-11-01
+2006-11-02
+2006-11-03
+2006-11-04
+2006-11-05
+2006-11-06
+2006-11-07
+2006-11-08
+2006-11-09
+2006-11-10
+2006-11-11
+2006-11-12
+2006-11-13
+2006-11-14
+2006-11-15
+2006-11-16
+2006-11-17
+2006-11-18
+2006-11-19
+2006-11-20
+2006-11-21
+2006-11-22
+2006-11-23
+2006-11-24
+2006-11-25
+2006-11-26
+2006-11-27
+2006-11-28
+2006-11-29
+2006-11-30
+2006-12-01
+2006-12-02
+2006-12-03
+2006-12-04
+2006-12-05
+2006-12-06
+2006-12-07
+2006-12-08
+2006-12-09
+2006-12-10
+2006-12-11
+2006-12-12
+2006-12-13
+2006-12-14
+2006-12-15
+2006-12-16
+2006-12-17
+2006-12-18
+2006-12-19
+2006-12-20
+2006-12-21
+2006-12-22
+2006-12-23
+2006-12-24
+2006-12-25
+2006-12-26
+2006-12-27
+2006-12-28
+2006-12-29
+2006-12-30
+2006-12-31
+2007-01-01
+2007-01-02
+2007-01-03
+2007-01-04
+2007-01-05
+2007-01-06
+2007-01-07
+2007-01-08
+2007-01-09
+2007-01-10
+2007-01-11
+2007-01-12
+2007-01-13
+2007-01-14
+2007-01-15
+2007-01-16
+2007-01-17
+2007-01-18
+2007-01-19
+2007-01-20
+2007-01-21
+2007-01-22
+2007-01-23
+2007-01-24
+2007-01-25
+2007-01-26
+2007-01-27
+2007-01-28
+2007-01-29
+2007-01-30
+2007-01-31
+2007-02-01
+2007-02-02
+2007-02-03
+2007-02-04
+2007-02-05
+2007-02-06
+2007-02-07
+2007-02-08
+2007-02-09
+2007-02-10
+2007-02-11
+2007-02-12
+2007-02-13
+2007-02-14
+2007-02-15
+2007-02-16
+2007-02-17
+2007-02-18
+2007-02-19
+2007-02-20
+2007-02-21
+2007-02-22
+2007-02-23
+2007-02-24
+2007-02-25
+2007-02-26
+2007-02-27
+2007-02-28
+2007-03-01
+2007-03-02
+2007-03-03
+2007-03-04
+2007-03-05
+2007-03-06
+2007-03-07
+2007-03-08
+2007-03-09
+2007-03-10
+2007-03-11
+2007-03-12
+2007-03-13
+2007-03-14
+2007-03-15
+2007-03-16
+2007-03-17
+2007-03-18
+2007-03-19
+2007-03-20
+2007-03-21
+2007-03-22
+2007-03-23
+2007-03-24
+2007-03-25
+2007-03-26
+2007-03-27
+2007-03-28
+2007-03-29
+2007-03-30
+2007-03-31
+2007-04-01
+2007-04-02
+2007-04-03
+2007-04-04
+2007-04-05
+2007-04-06
+2007-04-07
+2007-04-08
+2007-04-09
+2007-04-10
+2007-04-11
+2007-04-12
+2007-04-13
+2007-04-14
+2007-04-15
+2007-04-16
+2007-04-17
+2007-04-18
+2007-04-19
+2007-04-20
+2007-04-21
+2007-04-22
+2007-04-23
+2007-04-24
+2007-04-25
+2007-04-26
+2007-04-27
+2007-04-28
+2007-04-29
+2007-04-30
+2007-05-01
+2007-05-02
+2007-05-03
+2007-05-04
+2007-05-05
+2007-05-06
+2007-05-07
+2007-05-08
+2007-05-09
+2007-05-10
+2007-05-11
+2007-05-12
+2007-05-13
+2007-05-14
+2007-05-15
+2007-05-16
+2007-05-17
+2007-05-18
+2007-05-19
+2007-05-20
+2007-05-21
+2007-05-22
+2007-05-23
+2007-05-24
+2007-05-25
+2007-05-26
+2007-05-27
+2007-05-28
+2007-05-29
+2007-05-30
+2007-05-31
+2007-06-01
+2007-06-02
+2007-06-03
+2007-06-04
+2007-06-05
+2007-06-06
+2007-06-07
+2007-06-08
+2007-06-09
+2007-06-10
+2007-06-11
+2007-06-12
+2007-06-13
+2007-06-14
+2007-06-15
+2007-06-16
+2007-06-17
+2007-06-18
+2007-06-19
+2007-06-20
+2007-06-21
+2007-06-22
+2007-06-23
+2007-06-24
+2007-06-25
+2007-06-26
+2007-06-27
+2007-06-28
+2007-06-29
+2007-06-30
+2007-07-01
+2007-07-02
+2007-07-03
+2007-07-04
+2007-07-05
+2007-07-06
+2007-07-07
+2007-07-08
+2007-07-09
+2007-07-10
+2007-07-11
+2007-07-12
+2007-07-13
+2007-07-14
+2007-07-15
+2007-07-16
+2007-07-17
+2007-07-18
+2007-07-19
+2007-07-20
+2007-07-21
+2007-07-22
+2007-07-23
+2007-07-24
+2007-07-25
+2007-07-26
+2007-07-27
+2007-07-28
+2007-07-29
+2007-07-30
+2007-07-31
+2007-08-01
+2007-08-02
+2007-08-03
+2007-08-04
+2007-08-05
+2007-08-06
+2007-08-07
+2007-08-08
+2007-08-09
+2007-08-10
+2007-08-11
+2007-08-12
+2007-08-13
+2007-08-14
+2007-08-15
+2007-08-16
+2007-08-17
+2007-08-18
+2007-08-19
+2007-08-20
+2007-08-21
+2007-08-22
+2007-08-23
+2007-08-24
+2007-08-25
+2007-08-26
+2007-08-27
+2007-08-28
+2007-08-29
+2007-08-30
+2007-08-31
+2007-09-01
+2007-09-02
+2007-09-03
+2007-09-04
+2007-09-05
+2007-09-06
+2007-09-07
+2007-09-08
+2007-09-09
+2007-09-10
+2007-09-11
+2007-09-12
+2007-09-13
+2007-09-14
+2007-09-15
+2007-09-16
+2007-09-17
+2007-09-18
+2007-09-19
+2007-09-20
+2007-09-21
+2007-09-22
+2007-09-23
+2007-09-24
+2007-09-25
+2007-09-26
+2007-09-27
+2007-09-28
+2007-09-29
+2007-09-30
+2007-10-01
+2007-10-02
+2007-10-03
+2007-10-04
+2007-10-05
+2007-10-06
+2007-10-07
+2007-10-08
+2007-10-09
+2007-10-10
+2007-10-11
+2007-10-12
+2007-10-13
+2007-10-14
+2007-10-15
+2007-10-16
+2007-10-17
+2007-10-18
+2007-10-19
+2007-10-20
+2007-10-21
+2007-10-22
+2007-10-23
+2007-10-24
+2007-10-25
+2007-10-26
+2007-10-27
+2007-10-28
+2007-10-29
+2007-10-30
+2007-10-31
+2007-11-01
+2007-11-02
+2007-11-03
+2007-11-04
+2007-11-05
+2007-11-06
+2007-11-07
+2007-11-08
+2007-11-09
+2007-11-10
+2007-11-11
+2007-11-12
+2007-11-13
+2007-11-14
+2007-11-15
+2007-11-16
+2007-11-17
+2007-11-18
+2007-11-19
+2007-11-20
+2007-11-21
+2007-11-22
+2007-11-23
+2007-11-24
+2007-11-25
+2007-11-26
+2007-11-27
+2007-11-28
+2007-11-29
+2007-11-30
+2007-12-01
+2007-12-02
+2007-12-03
+2007-12-04
+2007-12-05
+2007-12-06
+2007-12-07
+2007-12-08
+2007-12-09
+2007-12-10
+2007-12-11
+2007-12-12
+2007-12-13
+2007-12-14
+2007-12-15
+2007-12-16
+2007-12-17
+2007-12-18
+2007-12-19
+2007-12-20
+2007-12-21
+2007-12-22
+2007-12-23
+2007-12-24
+2007-12-25
+2007-12-26
+2007-12-27
+2007-12-28
+2007-12-29
+2007-12-30
+2007-12-31
+2008-01-01
+2008-01-02
+2008-01-03
+2008-01-04
+2008-01-05
+2008-01-06
+2008-01-07
+2008-01-08
+2008-01-09
+2008-01-10
+2008-01-11
+2008-01-12
+2008-01-13
+2008-01-14
+2008-01-15
+2008-01-16
+2008-01-17
+2008-01-18
+2008-01-19
+2008-01-20
+2008-01-21
+2008-01-22
+2008-01-23
+2008-01-24
+2008-01-25
+2008-01-26
+2008-01-27
+2008-01-28
+2008-01-29
+2008-01-30
+2008-01-31
+2008-02-01
+2008-02-02
+2008-02-03
+2008-02-04
+2008-02-05
+2008-02-06
+2008-02-07
+2008-02-08
+2008-02-09
+2008-02-10
+2008-02-11
+2008-02-12
+2008-02-13
+2008-02-14
+2008-02-15
+2008-02-16
+2008-02-17
+2008-02-18
+2008-02-19
+2008-02-20
+2008-02-21
+2008-02-22
+2008-02-23
+2008-02-24
+2008-02-25
+2008-02-26
+2008-02-27
+2008-02-28
+2008-02-29
+2008-03-01
+2008-03-02
+2008-03-03
+2008-03-04
+2008-03-05
+2008-03-06
+2008-03-07
+2008-03-08
+2008-03-09
+2008-03-10
+2008-03-11
+2008-03-12
+2008-03-13
+2008-03-14
+2008-03-15
+2008-03-16
+2008-03-17
+2008-03-18
+2008-03-19
+2008-03-20
+2008-03-21
+2008-03-22
+2008-03-23
+2008-03-24
+2008-03-25
+2008-03-26
+2008-03-27
+2008-03-28
+2008-03-29
+2008-03-30
+2008-03-31
+2008-04-01
+2008-04-02
+2008-04-03
+2008-04-04
+2008-04-05
+2008-04-06
+2008-04-07
+2008-04-08
+2008-04-09
+2008-04-10
+2008-04-11
+2008-04-12
+2008-04-13
+2008-04-14
+2008-04-15
+2008-04-16
+2008-04-17
+2008-04-18
+2008-04-19
+2008-04-20
+2008-04-21
+2008-04-22
+2008-04-23
+2008-04-24
+2008-04-25
+2008-04-26
+2008-04-27
+2008-04-28
+2008-04-29
+2008-04-30
+2008-05-01
+2008-05-02
+2008-05-03
+2008-05-04
+2008-05-05
+2008-05-06
+2008-05-07
+2008-05-08
+2008-05-09
+2008-05-10
+2008-05-11
+2008-05-12
+2008-05-13
+2008-05-14
+2008-05-15
+2008-05-16
+2008-05-17
+2008-05-18
+2008-05-19
+2008-05-20
+2008-05-21
+2008-05-22
+2008-05-23
+2008-05-24
+2008-05-25
+2008-05-26
+2008-05-27
+2008-05-28
+2008-05-29
+2008-05-30
+2008-05-31
+2008-06-01
+2008-06-02
+2008-06-03
+2008-06-04
+2008-06-05
+2008-06-06
+2008-06-07
+2008-06-08
+2008-06-09
+2008-06-10
+2008-06-11
+2008-06-12
+2008-06-13
+2008-06-14
+2008-06-15
+2008-06-16
+2008-06-17
+2008-06-18
+2008-06-19
+2008-06-20
+2008-06-21
+2008-06-22
+2008-06-23
+2008-06-24
+2008-06-25
+2008-06-26
+2008-06-27
+2008-06-28
+2008-06-29
+2008-06-30
+2008-07-01
+2008-07-02
+2008-07-03
+2008-07-04
+2008-07-05
+2008-07-06
+2008-07-07
+2008-07-08
+2008-07-09
+2008-07-10
+2008-07-11
+2008-07-12
+2008-07-13
+2008-07-14
+2008-07-15
+2008-07-16
+2008-07-17
+2008-07-18
+2008-07-19
+2008-07-20
+2008-07-21
+2008-07-22
+2008-07-23
+2008-07-24
+2008-07-25
+2008-07-26
+2008-07-27
+2008-07-28
+2008-07-29
+2008-07-30
+2008-07-31
+2008-08-01
+2008-08-02
+2008-08-03
+2008-08-04
+2008-08-05
+2008-08-06
+2008-08-07
+2008-08-08
+2008-08-09
+2008-08-10
+2008-08-11
+2008-08-12
+2008-08-13
+2008-08-14
+2008-08-15
+2008-08-16
+2008-08-17
+2008-08-18
+2008-08-19
+2008-08-20
+2008-08-21
+2008-08-22
+2008-08-23
+2008-08-24
+2008-08-25
+2008-08-26
+2008-08-27
+2008-08-28
+2008-08-29
+2008-08-30
+2008-08-31
+2008-09-01
+2008-09-02
+2008-09-03
+2008-09-04
+2008-09-05
+2008-09-06
+2008-09-07
+2008-09-08
+2008-09-09
+2008-09-10
+2008-09-11
+2008-09-12
+2008-09-13
+2008-09-14
+2008-09-15
+2008-09-16
+2008-09-17
+2008-09-18
+2008-09-19
+2008-09-20
+2008-09-21
+2008-09-22
+2008-09-23
+2008-09-24
+2008-09-25
+2008-09-26
+2008-09-27
+2008-09-28
+2008-09-29
+2008-09-30
+2008-10-01
+2008-10-02
+2008-10-03
+2008-10-04
+2008-10-05
+2008-10-06
+2008-10-07
+2008-10-08
+2008-10-09
+2008-10-10
+2008-10-11
+2008-10-12
+2008-10-13
+2008-10-14
+2008-10-15
+2008-10-16
+2008-10-17
+2008-10-18
+2008-10-19
+2008-10-20
+2008-10-21
+2008-10-22
+2008-10-23
+2008-10-24
+2008-10-25
+2008-10-26
+2008-10-27
+2008-10-28
+2008-10-29
+2008-10-30
+2008-10-31
+2008-11-01
+2008-11-02
+2008-11-03
+2008-11-04
+2008-11-05
+2008-11-06
+2008-11-07
+2008-11-08
+2008-11-09
+2008-11-10
+2008-11-11
+2008-11-12
+2008-11-13
+2008-11-14
+2008-11-15
+2008-11-16
+2008-11-17
+2008-11-18
+2008-11-19
+2008-11-20
+2008-11-21
+2008-11-22
+2008-11-23
+2008-11-24
+2008-11-25
+2008-11-26
+2008-11-27
+2008-11-28
+2008-11-29
+2008-11-30
+2008-12-01
+2008-12-02
+2008-12-03
+2008-12-04
+2008-12-05
+2008-12-06
+2008-12-07
+2008-12-08
+2008-12-09
+2008-12-10
+2008-12-11
+2008-12-12
+2008-12-13
+2008-12-14
+2008-12-15
+2008-12-16
+2008-12-17
+2008-12-18
+2008-12-19
+2008-12-20
+2008-12-21
+2008-12-22
+2008-12-23
+2008-12-24
+2008-12-25
+2008-12-26
+2008-12-27
+2008-12-28
+2008-12-29
+2008-12-30
+2008-12-31
+2009-01-01
+2009-01-02
+2009-01-03
+2009-01-04
+2009-01-05
+2009-01-06
+2009-01-07
+2009-01-08
+2009-01-09
+2009-01-10
+2009-01-11
+2009-01-12
+2009-01-13
+2009-01-14
+2009-01-15
+2009-01-16
+2009-01-17
+2009-01-18
+2009-01-19
+2009-01-20
+2009-01-21
+2009-01-22
+2009-01-23
+2009-01-24
+2009-01-25
+2009-01-26
+2009-01-27
+2009-01-28
+2009-01-29
+2009-01-30
+2009-01-31
+2009-02-01
+2009-02-02
+2009-02-03
+2009-02-04
+2009-02-05
+2009-02-06
+2009-02-07
+2009-02-08
+2009-02-09
+2009-02-10
+2009-02-11
+2009-02-12
+2009-02-13
+2009-02-14
+2009-02-15
+2009-02-16
+2009-02-17
+2009-02-18
+2009-02-19
+2009-02-20
+2009-02-21
+2009-02-22
+2009-02-23
+2009-02-24
+2009-02-25
+2009-02-26
+2009-02-27
+2009-02-28
+2009-03-01
+2009-03-02
+2009-03-03
+2009-03-04
+2009-03-05
+2009-03-06
+2009-03-07
+2009-03-08
+2009-03-09
+2009-03-10
+2009-03-11
+2009-03-12
+2009-03-13
+2009-03-14
+2009-03-15
+2009-03-16
+2009-03-17
+2009-03-18
+2009-03-19
+2009-03-20
+2009-03-21
+2009-03-22
+2009-03-23
+2009-03-24
+2009-03-25
+2009-03-26
+2009-03-27
+2009-03-28
+2009-03-29
+2009-03-30
+2009-03-31
+2009-04-01
+2009-04-02
+2009-04-03
+2009-04-04
+2009-04-05
+2009-04-06
+2009-04-07
+2009-04-08
+2009-04-09
+2009-04-10
+2009-04-11
+2009-04-12
+2009-04-13
+2009-04-14
+2009-04-15
+2009-04-16
+2009-04-17
+2009-04-18
+2009-04-19
+2009-04-20
+2009-04-21
+2009-04-22
+2009-04-23
+2009-04-24
+2009-04-25
+2009-04-26
+2009-04-27
+2009-04-28
+2009-04-29
+2009-04-30
+2009-05-01
+2009-05-02
+2009-05-03
+2009-05-04
+2009-05-05
+2009-05-06
+2009-05-07
+2009-05-08
+2009-05-09
+2009-05-10
+2009-05-11
+2009-05-12
+2009-05-13
+2009-05-14
+2009-05-15
+2009-05-16
+2009-05-17
+2009-05-18
+2009-05-19
+2009-05-20
+2009-05-21
+2009-05-22
+2009-05-23
+2009-05-24
+2009-05-25
+2009-05-26
+2009-05-27
+2009-05-28
+2009-05-29
+2009-05-30
+2009-05-31
+2009-06-01
+2009-06-02
+2009-06-03
+2009-06-04
+2009-06-05
+2009-06-06
+2009-06-07
+2009-06-08
+2009-06-09
+2009-06-10
+2009-06-11
+2009-06-12
+2009-06-13
+2009-06-14
+2009-06-15
+2009-06-16
+2009-06-17
+2009-06-18
+2009-06-19
+2009-06-20
+2009-06-21
+2009-06-22
+2009-06-23
+2009-06-24
+2009-06-25
+2009-06-26
+2009-06-27
+2009-06-28
+2009-06-29
+2009-06-30
+2009-07-01
+2009-07-02
+2009-07-03
+2009-07-04
+2009-07-05
+2009-07-06
+2009-07-07
+2009-07-08
+2009-07-09
+2009-07-10
+2009-07-11
+2009-07-12
+2009-07-13
+2009-07-14
+2009-07-15
+2009-07-16
+2009-07-17
+2009-07-18
+2009-07-19
+2009-07-20
+2009-07-21
+2009-07-22
+2009-07-23
+2009-07-24
+2009-07-25
+2009-07-26
+2009-07-27
+2009-07-28
+2009-07-29
+2009-07-30
+2009-07-31
+2009-08-01
+2009-08-02
+2009-08-03
+2009-08-04
+2009-08-05
+2009-08-06
+2009-08-07
+2009-08-08
+2009-08-09
+2009-08-10
+2009-08-11
+2009-08-12
+2009-08-13
+2009-08-14
+2009-08-15
+2009-08-16
+2009-08-17
+2009-08-18
+2009-08-19
+2009-08-20
+2009-08-21
+2009-08-22
+2009-08-23
+2009-08-24
+2009-08-25
+2009-08-26
+2009-08-27
+2009-08-28
+2009-08-29
+2009-08-30
+2009-08-31
+2009-09-01
+2009-09-02
+2009-09-03
+2009-09-04
+2009-09-05
+2009-09-06
+2009-09-07
+2009-09-08
+2009-09-09
+2009-09-10
+2009-09-11
+2009-09-12
+2009-09-13
+2009-09-14
+2009-09-15
+2009-09-16
+2009-09-17
+2009-09-18
+2009-09-19
+2009-09-20
+2009-09-21
+2009-09-22
+2009-09-23
+2009-09-24
+2009-09-25
+2009-09-26
+2009-09-27
+2009-09-28
+2009-09-29
+2009-09-30
+2009-10-01
+2009-10-02
+2009-10-03
+2009-10-04
+2009-10-05
+2009-10-06
+2009-10-07
+2009-10-08
+2009-10-09
+2009-10-10
+2009-10-11
+2009-10-12
+2009-10-13
+2009-10-14
+2009-10-15
+2009-10-16
+2009-10-17
+2009-10-18
+2009-10-19
+2009-10-20
+2009-10-21
+2009-10-22
+2009-10-23
+2009-10-24
+2009-10-25
+2009-10-26
+2009-10-27
+2009-10-28
+2009-10-29
+2009-10-30
+2009-10-31
+2009-11-01
+2009-11-02
+2009-11-03
+2009-11-04
+2009-11-05
+2009-11-06
+2009-11-07
+2009-11-08
+2009-11-09
+2009-11-10
+2009-11-11
+2009-11-12
+2009-11-13
+2009-11-14
+2009-11-15
+2009-11-16
+2009-11-17
+2009-11-18
+2009-11-19
+2009-11-20
+2009-11-21
+2009-11-22
+2009-11-23
+2009-11-24
+2009-11-25
+2009-11-26
+2009-11-27
+2009-11-28
+2009-11-29
+2009-11-30
+2009-12-01
+2009-12-02
+2009-12-03
+2009-12-04
+2009-12-05
+2009-12-06
+2009-12-07
+2009-12-08
+2009-12-09
+2009-12-10
+2009-12-11
+2009-12-12
+2009-12-13
+2009-12-14
+2009-12-15
+2009-12-16
+2009-12-17
+2009-12-18
+2009-12-19
+2009-12-20
+2009-12-21
+2009-12-22
+2009-12-23
+2009-12-24
+2009-12-25
+2009-12-26
+2009-12-27
+2009-12-28
+2009-12-29
+2009-12-30
+2009-12-31
+2010-01-01
+2010-01-02
+2010-01-03
+2010-01-04
+2010-01-05
+2010-01-06
+2010-01-07
+2010-01-08
+2010-01-09
+2010-01-10
+2010-01-11
+2010-01-12
+2010-01-13
+2010-01-14
+2010-01-15
+2010-01-16
+2010-01-17
+2010-01-18
+2010-01-19
+2010-01-20
+2010-01-21
+2010-01-22
+2010-01-23
+2010-01-24
+2010-01-25
+2010-01-26
+2010-01-27
+2010-01-28
+2010-01-29
+2010-01-30
+2010-01-31
+2010-02-01
+2010-02-02
+2010-02-03
+2010-02-04
+2010-02-05
+2010-02-06
+2010-02-07
+2010-02-08
+2010-02-09
+2010-02-10
+2010-02-11
+2010-02-12
+2010-02-13
+2010-02-14
+2010-02-15
+2010-02-16
+2010-02-17
+2010-02-18
+2010-02-19
+2010-02-20
+2010-02-21
+2010-02-22
+2010-02-23
+2010-02-24
+2010-02-25
+2010-02-26
+2010-02-27
+2010-02-28
+2010-03-01
+2010-03-02
+2010-03-03
+2010-03-04
+2010-03-05
+2010-03-06
+2010-03-07
+2010-03-08
+2010-03-09
+2010-03-10
+2010-03-11
+2010-03-12
+2010-03-13
+2010-03-14
+2010-03-15
+2010-03-16
+2010-03-17
+2010-03-18
+2010-03-19
+2010-03-20
+2010-03-21
+2010-03-22
+2010-03-23
+2010-03-24
+2010-03-25
+2010-03-26
+2010-03-27
+2010-03-28
+2010-03-29
+2010-03-30
+2010-03-31
+2010-04-01
+2010-04-02
+2010-04-03
+2010-04-04
+2010-04-05
+2010-04-06
+2010-04-07
+2010-04-08
+2010-04-09
+2010-04-10
+2010-04-11
+2010-04-12
+2010-04-13
+2010-04-14
+2010-04-15
+2010-04-16
+2010-04-17
+2010-04-18
+2010-04-19
+2010-04-20
+2010-04-21
+2010-04-22
+2010-04-23
+2010-04-24
+2010-04-25
+2010-04-26
+2010-04-27
+2010-04-28
+2010-04-29
+2010-04-30
+2010-05-01
+2010-05-02
+2010-05-03
+2010-05-04
+2010-05-05
+2010-05-06
+2010-05-07
+2010-05-08
+2010-05-09
+2010-05-10
+2010-05-11
+2010-05-12
+2010-05-13
+2010-05-14
+2010-05-15
+2010-05-16
+2010-05-17
+2010-05-18
+2010-05-19
+2010-05-20
+2010-05-21
+2010-05-22
+2010-05-23
+2010-05-24
+2010-05-25
+2010-05-26
+2010-05-27
+2010-05-28
+2010-05-29
+2010-05-30
+2010-05-31
+2010-06-01
+2010-06-02
+2010-06-03
+2010-06-04
+2010-06-05
+2010-06-06
+2010-06-07
+2010-06-08
+2010-06-09
+2010-06-10
+2010-06-11
+2010-06-12
+2010-06-13
+2010-06-14
+2010-06-15
+2010-06-16
+2010-06-17
+2010-06-18
+2010-06-19
+2010-06-20
+2010-06-21
+2010-06-22
+2010-06-23
+2010-06-24
+2010-06-25
+2010-06-26
+2010-06-27
+2010-06-28
+2010-06-29
+2010-06-30
+2010-07-01
+2010-07-02
+2010-07-03
+2010-07-04
+2010-07-05
+2010-07-06
+2010-07-07
+2010-07-08
+2010-07-09
+2010-07-10
+2010-07-11
+2010-07-12
+2010-07-13
+2010-07-14
+2010-07-15
+2010-07-16
+2010-07-17
+2010-07-18
+2010-07-19
+2010-07-20
+2010-07-21
+2010-07-22
+2010-07-23
+2010-07-24
+2010-07-25
+2010-07-26
+2010-07-27
+2010-07-28
+2010-07-29
+2010-07-30
+2010-07-31
+2010-08-01
+2010-08-02
+2010-08-03
+2010-08-04
+2010-08-05
+2010-08-06
+2010-08-07
+2010-08-08
+2010-08-09
+2010-08-10
+2010-08-11
+2010-08-12
+2010-08-13
+2010-08-14
+2010-08-15
+2010-08-16
+2010-08-17
+2010-08-18
+2010-08-19
+2010-08-20
+2010-08-21
+2010-08-22
+2010-08-23
+2010-08-24
+2010-08-25
+2010-08-26
+2010-08-27
+2010-08-28
+2010-08-29
+2010-08-30
+2010-08-31
+2010-09-01
+2010-09-02
+2010-09-03
+2010-09-04
+2010-09-05
+2010-09-06
+2010-09-07
+2010-09-08
+2010-09-09
+2010-09-10
+2010-09-11
+2010-09-12
+2010-09-13
+2010-09-14
+2010-09-15
+2010-09-16
+2010-09-17
+2010-09-18
+2010-09-19
+2010-09-20
+2010-09-21
+2010-09-22
+2010-09-23
+2010-09-24
+2010-09-25
+2010-09-26
+2010-09-27
+2010-09-28
+2010-09-29
+2010-09-30
+2010-10-01
+2010-10-02
+2010-10-03
+2010-10-04
+2010-10-05
+2010-10-06
+2010-10-07
+2010-10-08
+2010-10-09
+2010-10-10
+2010-10-11
+2010-10-12
+2010-10-13
+2010-10-14
+2010-10-15
+2010-10-16
+2010-10-17
+2010-10-18
+2010-10-19
+2010-10-20
+2010-10-21
+2010-10-22
+2010-10-23
+2010-10-24
+2010-10-25
+2010-10-26
+2010-10-27
+2010-10-28
+2010-10-29
+2010-10-30
+2010-10-31
+2010-11-01
+2010-11-02
+2010-11-03
+2010-11-04
+2010-11-05
+2010-11-06
+2010-11-07
+2010-11-08
+2010-11-09
+2010-11-10
+2010-11-11
+2010-11-12
+2010-11-13
+2010-11-14
+2010-11-15
+2010-11-16
+2010-11-17
+2010-11-18
+2010-11-19
+2010-11-20
+2010-11-21
+2010-11-22
+2010-11-23
+2010-11-24
+2010-11-25
+2010-11-26
+2010-11-27
+2010-11-28
+2010-11-29
+2010-11-30
+2010-12-01
+2010-12-02
+2010-12-03
+2010-12-04
+2010-12-05
+2010-12-06
+2010-12-07
+2010-12-08
+2010-12-09
+2010-12-10
+2010-12-11
+2010-12-12
+2010-12-13
+2010-12-14
+2010-12-15
+2010-12-16
+2010-12-17
+2010-12-18
+2010-12-19
+2010-12-20
+2010-12-21
+2010-12-22
+2010-12-23
+2010-12-24
+2010-12-25
+2010-12-26
+2010-12-27
+2010-12-28
+2010-12-29
+2010-12-30
+2010-12-31
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase10.ics b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase10.ics
new file mode 100644
index 00000000..db2b5eb8
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase10.ics
@@ -0,0 +1,23 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KAlarm 1.2.6//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20050522T130601
+CREATED:20050522T130525
+UID:KAlarm-1044160066.1024
+SEQUENCE:0
+LAST-MODIFIED:20050522T130525
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=YEARLY;INTERVAL=2;BYMONTHDAY=27;BYMONTH=3,7,11
+DTSTART:20050727T130500
+TRANSP:OPAQUE
+BEGIN:VALARM
+DESCRIPTION:every 2 years on the 27. of march\, july and november
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:PT0S
+X-KDE-KALARM-FONTCOLOR:#ff0000\;#000000\;
+END:VALARM
+
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase10.ics.next.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase10.ics.next.ref
new file mode 100644
index 00000000..4f8dbcb6
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase10.ics.next.ref
@@ -0,0 +1,500 @@
+2005-07-27T13:05:00
+2005-11-27T13:05:00
+2007-03-27T13:05:00
+2007-07-27T13:05:00
+2007-11-27T13:05:00
+2009-03-27T13:05:00
+2009-07-27T13:05:00
+2009-11-27T13:05:00
+2011-03-27T13:05:00
+2011-07-27T13:05:00
+2011-11-27T13:05:00
+2013-03-27T13:05:00
+2013-07-27T13:05:00
+2013-11-27T13:05:00
+2015-03-27T13:05:00
+2015-07-27T13:05:00
+2015-11-27T13:05:00
+2017-03-27T13:05:00
+2017-07-27T13:05:00
+2017-11-27T13:05:00
+2019-03-27T13:05:00
+2019-07-27T13:05:00
+2019-11-27T13:05:00
+2021-03-27T13:05:00
+2021-07-27T13:05:00
+2021-11-27T13:05:00
+2023-03-27T13:05:00
+2023-07-27T13:05:00
+2023-11-27T13:05:00
+2025-03-27T13:05:00
+2025-07-27T13:05:00
+2025-11-27T13:05:00
+2027-03-27T13:05:00
+2027-07-27T13:05:00
+2027-11-27T13:05:00
+2029-03-27T13:05:00
+2029-07-27T13:05:00
+2029-11-27T13:05:00
+2031-03-27T13:05:00
+2031-07-27T13:05:00
+2031-11-27T13:05:00
+2033-03-27T13:05:00
+2033-07-27T13:05:00
+2033-11-27T13:05:00
+2035-03-27T13:05:00
+2035-07-27T13:05:00
+2035-11-27T13:05:00
+2037-03-27T13:05:00
+2037-07-27T13:05:00
+2037-11-27T13:05:00
+2039-03-27T13:05:00
+2039-07-27T13:05:00
+2039-11-27T13:05:00
+2041-03-27T13:05:00
+2041-07-27T13:05:00
+2041-11-27T13:05:00
+2043-03-27T13:05:00
+2043-07-27T13:05:00
+2043-11-27T13:05:00
+2045-03-27T13:05:00
+2045-07-27T13:05:00
+2045-11-27T13:05:00
+2047-03-27T13:05:00
+2047-07-27T13:05:00
+2047-11-27T13:05:00
+2049-03-27T13:05:00
+2049-07-27T13:05:00
+2049-11-27T13:05:00
+2051-03-27T13:05:00
+2051-07-27T13:05:00
+2051-11-27T13:05:00
+2053-03-27T13:05:00
+2053-07-27T13:05:00
+2053-11-27T13:05:00
+2055-03-27T13:05:00
+2055-07-27T13:05:00
+2055-11-27T13:05:00
+2057-03-27T13:05:00
+2057-07-27T13:05:00
+2057-11-27T13:05:00
+2059-03-27T13:05:00
+2059-07-27T13:05:00
+2059-11-27T13:05:00
+2061-03-27T13:05:00
+2061-07-27T13:05:00
+2061-11-27T13:05:00
+2063-03-27T13:05:00
+2063-07-27T13:05:00
+2063-11-27T13:05:00
+2065-03-27T13:05:00
+2065-07-27T13:05:00
+2065-11-27T13:05:00
+2067-03-27T13:05:00
+2067-07-27T13:05:00
+2067-11-27T13:05:00
+2069-03-27T13:05:00
+2069-07-27T13:05:00
+2069-11-27T13:05:00
+2071-03-27T13:05:00
+2071-07-27T13:05:00
+2071-11-27T13:05:00
+2073-03-27T13:05:00
+2073-07-27T13:05:00
+2073-11-27T13:05:00
+2075-03-27T13:05:00
+2075-07-27T13:05:00
+2075-11-27T13:05:00
+2077-03-27T13:05:00
+2077-07-27T13:05:00
+2077-11-27T13:05:00
+2079-03-27T13:05:00
+2079-07-27T13:05:00
+2079-11-27T13:05:00
+2081-03-27T13:05:00
+2081-07-27T13:05:00
+2081-11-27T13:05:00
+2083-03-27T13:05:00
+2083-07-27T13:05:00
+2083-11-27T13:05:00
+2085-03-27T13:05:00
+2085-07-27T13:05:00
+2085-11-27T13:05:00
+2087-03-27T13:05:00
+2087-07-27T13:05:00
+2087-11-27T13:05:00
+2089-03-27T13:05:00
+2089-07-27T13:05:00
+2089-11-27T13:05:00
+2091-03-27T13:05:00
+2091-07-27T13:05:00
+2091-11-27T13:05:00
+2093-03-27T13:05:00
+2093-07-27T13:05:00
+2093-11-27T13:05:00
+2095-03-27T13:05:00
+2095-07-27T13:05:00
+2095-11-27T13:05:00
+2097-03-27T13:05:00
+2097-07-27T13:05:00
+2097-11-27T13:05:00
+2099-03-27T13:05:00
+2099-07-27T13:05:00
+2099-11-27T13:05:00
+2101-03-27T13:05:00
+2101-07-27T13:05:00
+2101-11-27T13:05:00
+2103-03-27T13:05:00
+2103-07-27T13:05:00
+2103-11-27T13:05:00
+2105-03-27T13:05:00
+2105-07-27T13:05:00
+2105-11-27T13:05:00
+2107-03-27T13:05:00
+2107-07-27T13:05:00
+2107-11-27T13:05:00
+2109-03-27T13:05:00
+2109-07-27T13:05:00
+2109-11-27T13:05:00
+2111-03-27T13:05:00
+2111-07-27T13:05:00
+2111-11-27T13:05:00
+2113-03-27T13:05:00
+2113-07-27T13:05:00
+2113-11-27T13:05:00
+2115-03-27T13:05:00
+2115-07-27T13:05:00
+2115-11-27T13:05:00
+2117-03-27T13:05:00
+2117-07-27T13:05:00
+2117-11-27T13:05:00
+2119-03-27T13:05:00
+2119-07-27T13:05:00
+2119-11-27T13:05:00
+2121-03-27T13:05:00
+2121-07-27T13:05:00
+2121-11-27T13:05:00
+2123-03-27T13:05:00
+2123-07-27T13:05:00
+2123-11-27T13:05:00
+2125-03-27T13:05:00
+2125-07-27T13:05:00
+2125-11-27T13:05:00
+2127-03-27T13:05:00
+2127-07-27T13:05:00
+2127-11-27T13:05:00
+2129-03-27T13:05:00
+2129-07-27T13:05:00
+2129-11-27T13:05:00
+2131-03-27T13:05:00
+2131-07-27T13:05:00
+2131-11-27T13:05:00
+2133-03-27T13:05:00
+2133-07-27T13:05:00
+2133-11-27T13:05:00
+2135-03-27T13:05:00
+2135-07-27T13:05:00
+2135-11-27T13:05:00
+2137-03-27T13:05:00
+2137-07-27T13:05:00
+2137-11-27T13:05:00
+2139-03-27T13:05:00
+2139-07-27T13:05:00
+2139-11-27T13:05:00
+2141-03-27T13:05:00
+2141-07-27T13:05:00
+2141-11-27T13:05:00
+2143-03-27T13:05:00
+2143-07-27T13:05:00
+2143-11-27T13:05:00
+2145-03-27T13:05:00
+2145-07-27T13:05:00
+2145-11-27T13:05:00
+2147-03-27T13:05:00
+2147-07-27T13:05:00
+2147-11-27T13:05:00
+2149-03-27T13:05:00
+2149-07-27T13:05:00
+2149-11-27T13:05:00
+2151-03-27T13:05:00
+2151-07-27T13:05:00
+2151-11-27T13:05:00
+2153-03-27T13:05:00
+2153-07-27T13:05:00
+2153-11-27T13:05:00
+2155-03-27T13:05:00
+2155-07-27T13:05:00
+2155-11-27T13:05:00
+2157-03-27T13:05:00
+2157-07-27T13:05:00
+2157-11-27T13:05:00
+2159-03-27T13:05:00
+2159-07-27T13:05:00
+2159-11-27T13:05:00
+2161-03-27T13:05:00
+2161-07-27T13:05:00
+2161-11-27T13:05:00
+2163-03-27T13:05:00
+2163-07-27T13:05:00
+2163-11-27T13:05:00
+2165-03-27T13:05:00
+2165-07-27T13:05:00
+2165-11-27T13:05:00
+2167-03-27T13:05:00
+2167-07-27T13:05:00
+2167-11-27T13:05:00
+2169-03-27T13:05:00
+2169-07-27T13:05:00
+2169-11-27T13:05:00
+2171-03-27T13:05:00
+2171-07-27T13:05:00
+2171-11-27T13:05:00
+2173-03-27T13:05:00
+2173-07-27T13:05:00
+2173-11-27T13:05:00
+2175-03-27T13:05:00
+2175-07-27T13:05:00
+2175-11-27T13:05:00
+2177-03-27T13:05:00
+2177-07-27T13:05:00
+2177-11-27T13:05:00
+2179-03-27T13:05:00
+2179-07-27T13:05:00
+2179-11-27T13:05:00
+2181-03-27T13:05:00
+2181-07-27T13:05:00
+2181-11-27T13:05:00
+2183-03-27T13:05:00
+2183-07-27T13:05:00
+2183-11-27T13:05:00
+2185-03-27T13:05:00
+2185-07-27T13:05:00
+2185-11-27T13:05:00
+2187-03-27T13:05:00
+2187-07-27T13:05:00
+2187-11-27T13:05:00
+2189-03-27T13:05:00
+2189-07-27T13:05:00
+2189-11-27T13:05:00
+2191-03-27T13:05:00
+2191-07-27T13:05:00
+2191-11-27T13:05:00
+2193-03-27T13:05:00
+2193-07-27T13:05:00
+2193-11-27T13:05:00
+2195-03-27T13:05:00
+2195-07-27T13:05:00
+2195-11-27T13:05:00
+2197-03-27T13:05:00
+2197-07-27T13:05:00
+2197-11-27T13:05:00
+2199-03-27T13:05:00
+2199-07-27T13:05:00
+2199-11-27T13:05:00
+2201-03-27T13:05:00
+2201-07-27T13:05:00
+2201-11-27T13:05:00
+2203-03-27T13:05:00
+2203-07-27T13:05:00
+2203-11-27T13:05:00
+2205-03-27T13:05:00
+2205-07-27T13:05:00
+2205-11-27T13:05:00
+2207-03-27T13:05:00
+2207-07-27T13:05:00
+2207-11-27T13:05:00
+2209-03-27T13:05:00
+2209-07-27T13:05:00
+2209-11-27T13:05:00
+2211-03-27T13:05:00
+2211-07-27T13:05:00
+2211-11-27T13:05:00
+2213-03-27T13:05:00
+2213-07-27T13:05:00
+2213-11-27T13:05:00
+2215-03-27T13:05:00
+2215-07-27T13:05:00
+2215-11-27T13:05:00
+2217-03-27T13:05:00
+2217-07-27T13:05:00
+2217-11-27T13:05:00
+2219-03-27T13:05:00
+2219-07-27T13:05:00
+2219-11-27T13:05:00
+2221-03-27T13:05:00
+2221-07-27T13:05:00
+2221-11-27T13:05:00
+2223-03-27T13:05:00
+2223-07-27T13:05:00
+2223-11-27T13:05:00
+2225-03-27T13:05:00
+2225-07-27T13:05:00
+2225-11-27T13:05:00
+2227-03-27T13:05:00
+2227-07-27T13:05:00
+2227-11-27T13:05:00
+2229-03-27T13:05:00
+2229-07-27T13:05:00
+2229-11-27T13:05:00
+2231-03-27T13:05:00
+2231-07-27T13:05:00
+2231-11-27T13:05:00
+2233-03-27T13:05:00
+2233-07-27T13:05:00
+2233-11-27T13:05:00
+2235-03-27T13:05:00
+2235-07-27T13:05:00
+2235-11-27T13:05:00
+2237-03-27T13:05:00
+2237-07-27T13:05:00
+2237-11-27T13:05:00
+2239-03-27T13:05:00
+2239-07-27T13:05:00
+2239-11-27T13:05:00
+2241-03-27T13:05:00
+2241-07-27T13:05:00
+2241-11-27T13:05:00
+2243-03-27T13:05:00
+2243-07-27T13:05:00
+2243-11-27T13:05:00
+2245-03-27T13:05:00
+2245-07-27T13:05:00
+2245-11-27T13:05:00
+2247-03-27T13:05:00
+2247-07-27T13:05:00
+2247-11-27T13:05:00
+2249-03-27T13:05:00
+2249-07-27T13:05:00
+2249-11-27T13:05:00
+2251-03-27T13:05:00
+2251-07-27T13:05:00
+2251-11-27T13:05:00
+2253-03-27T13:05:00
+2253-07-27T13:05:00
+2253-11-27T13:05:00
+2255-03-27T13:05:00
+2255-07-27T13:05:00
+2255-11-27T13:05:00
+2257-03-27T13:05:00
+2257-07-27T13:05:00
+2257-11-27T13:05:00
+2259-03-27T13:05:00
+2259-07-27T13:05:00
+2259-11-27T13:05:00
+2261-03-27T13:05:00
+2261-07-27T13:05:00
+2261-11-27T13:05:00
+2263-03-27T13:05:00
+2263-07-27T13:05:00
+2263-11-27T13:05:00
+2265-03-27T13:05:00
+2265-07-27T13:05:00
+2265-11-27T13:05:00
+2267-03-27T13:05:00
+2267-07-27T13:05:00
+2267-11-27T13:05:00
+2269-03-27T13:05:00
+2269-07-27T13:05:00
+2269-11-27T13:05:00
+2271-03-27T13:05:00
+2271-07-27T13:05:00
+2271-11-27T13:05:00
+2273-03-27T13:05:00
+2273-07-27T13:05:00
+2273-11-27T13:05:00
+2275-03-27T13:05:00
+2275-07-27T13:05:00
+2275-11-27T13:05:00
+2277-03-27T13:05:00
+2277-07-27T13:05:00
+2277-11-27T13:05:00
+2279-03-27T13:05:00
+2279-07-27T13:05:00
+2279-11-27T13:05:00
+2281-03-27T13:05:00
+2281-07-27T13:05:00
+2281-11-27T13:05:00
+2283-03-27T13:05:00
+2283-07-27T13:05:00
+2283-11-27T13:05:00
+2285-03-27T13:05:00
+2285-07-27T13:05:00
+2285-11-27T13:05:00
+2287-03-27T13:05:00
+2287-07-27T13:05:00
+2287-11-27T13:05:00
+2289-03-27T13:05:00
+2289-07-27T13:05:00
+2289-11-27T13:05:00
+2291-03-27T13:05:00
+2291-07-27T13:05:00
+2291-11-27T13:05:00
+2293-03-27T13:05:00
+2293-07-27T13:05:00
+2293-11-27T13:05:00
+2295-03-27T13:05:00
+2295-07-27T13:05:00
+2295-11-27T13:05:00
+2297-03-27T13:05:00
+2297-07-27T13:05:00
+2297-11-27T13:05:00
+2299-03-27T13:05:00
+2299-07-27T13:05:00
+2299-11-27T13:05:00
+2301-03-27T13:05:00
+2301-07-27T13:05:00
+2301-11-27T13:05:00
+2303-03-27T13:05:00
+2303-07-27T13:05:00
+2303-11-27T13:05:00
+2305-03-27T13:05:00
+2305-07-27T13:05:00
+2305-11-27T13:05:00
+2307-03-27T13:05:00
+2307-07-27T13:05:00
+2307-11-27T13:05:00
+2309-03-27T13:05:00
+2309-07-27T13:05:00
+2309-11-27T13:05:00
+2311-03-27T13:05:00
+2311-07-27T13:05:00
+2311-11-27T13:05:00
+2313-03-27T13:05:00
+2313-07-27T13:05:00
+2313-11-27T13:05:00
+2315-03-27T13:05:00
+2315-07-27T13:05:00
+2315-11-27T13:05:00
+2317-03-27T13:05:00
+2317-07-27T13:05:00
+2317-11-27T13:05:00
+2319-03-27T13:05:00
+2319-07-27T13:05:00
+2319-11-27T13:05:00
+2321-03-27T13:05:00
+2321-07-27T13:05:00
+2321-11-27T13:05:00
+2323-03-27T13:05:00
+2323-07-27T13:05:00
+2323-11-27T13:05:00
+2325-03-27T13:05:00
+2325-07-27T13:05:00
+2325-11-27T13:05:00
+2327-03-27T13:05:00
+2327-07-27T13:05:00
+2327-11-27T13:05:00
+2329-03-27T13:05:00
+2329-07-27T13:05:00
+2329-11-27T13:05:00
+2331-03-27T13:05:00
+2331-07-27T13:05:00
+2331-11-27T13:05:00
+2333-03-27T13:05:00
+2333-07-27T13:05:00
+2333-11-27T13:05:00
+2335-03-27T13:05:00
+2335-07-27T13:05:00
+2335-11-27T13:05:00
+2337-03-27T13:05:00
+2337-07-27T13:05:00
+2337-11-27T13:05:00
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase10.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase10.ics.prev.ref
new file mode 100644
index 00000000..abef94f1
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase10.ics.prev.ref
@@ -0,0 +1,9 @@
+2009-11-27T13:05:00
+2009-07-27T13:05:00
+2009-03-27T13:05:00
+2007-11-27T13:05:00
+2007-07-27T13:05:00
+2007-03-27T13:05:00
+2005-11-27T13:05:00
+2005-07-27T13:05:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase10.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase10.ics.recurson.ref
new file mode 100644
index 00000000..476af859
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase10.ics.recurson.ref
@@ -0,0 +1,9 @@
+2005-07-27
+2005-11-27
+2007-03-27
+2007-07-27
+2007-11-27
+2009-03-27
+2009-07-27
+2009-11-27
+
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCases.ics.all b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCases.ics.all
new file mode 100644
index 00000000..da63af3f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCases.ics.all
@@ -0,0 +1,214 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KAlarm 1.2.6//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20050522T130601
+CREATED:20050522T130311
+UID:KAlarm-2080187732.550
+SEQUENCE:0
+LAST-MODIFIED:20050522T130311
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=DAILY;INTERVAL=4
+DTSTART:20050526T130300
+TRANSP:OPAQUE
+BEGIN:VALARM
+DESCRIPTION:Every 4 days
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:PT0S
+X-KDE-KALARM-FONTCOLOR:#ff0000\;#000000\;
+END:VALARM
+
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050522T130601
+CREATED:20050522T130341
+UID:KAlarm-758521161.1036
+SEQUENCE:0
+LAST-MODIFIED:20050522T130341
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=WEEKLY;INTERVAL=3;BYDAY=TU,SA,SU
+DTSTART:20050522T130400
+TRANSP:OPAQUE
+BEGIN:VALARM
+DESCRIPTION:Every 3 weeks on Tu\, Sa and Su
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:PT0S
+X-KDE-KALARM-FONTCOLOR:#ff0000\;#000000\;
+END:VALARM
+
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050522T130601
+CREATED:20050522T130245
+UID:KAlarm-898217824.835
+SEQUENCE:0
+LAST-MODIFIED:20050522T130245
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=MINUTELY;INTERVAL=240
+DTSTART:20050522T130300
+TRANSP:OPAQUE
+BEGIN:VALARM
+DESCRIPTION:Every 4 hours
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:PT0S
+X-KDE-KALARM-FONTCOLOR:#ff0000\;#000000\;
+END:VALARM
+
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050522T130601
+CREATED:20050522T124630
+UID:KAlarm-333577782.218
+SEQUENCE:1
+LAST-MODIFIED:20050522T124702
+CLASS:PUBLIC
+PRIORITY:5
+CATEGORIES:SAVE
+RRULE:FREQ=MINUTELY;INTERVAL=243
+DTSTART:20050522T124700
+TRANSP:OPAQUE
+BEGIN:VALARM
+DESCRIPTION:Every 4 hours 3 minutes
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:PT4H3M
+X-KDE-KALARM-FONTCOLOR:#ff0000\;#000000\;
+END:VALARM
+
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050522T130601
+CREATED:20050522T130409
+UID:KAlarm-1322911691.873
+SEQUENCE:0
+LAST-MODIFIED:20050522T130409
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=MONTHLY;INTERVAL=2;BYMONTHDAY=24
+DTSTART:20050524T130400
+TRANSP:OPAQUE
+BEGIN:VALARM
+DESCRIPTION:Every 2 months on the 24th
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:PT0S
+X-KDE-KALARM-FONTCOLOR:#ff0000\;#000000\;
+END:VALARM
+
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050522T130601
+CREATED:20050522T124525
+UID:KAlarm-1195473896.721
+SEQUENCE:0
+LAST-MODIFIED:20050522T124525
+CLASS:PUBLIC
+PRIORITY:5
+DTSTART:20050531T124600
+TRANSP:OPAQUE
+BEGIN:VALARM
+DESCRIPTION:At login
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:PT0S
+X-KDE-KALARM-FONTCOLOR:#ff0000\;#000000\;
+END:VALARM
+
+BEGIN:VALARM
+DESCRIPTION:At login
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:-P9DT35S
+X-KDE-KALARM-FONTCOLOR:#ff0000\;#000000\;
+X-KDE-KALARM-TYPE:LOGIN
+END:VALARM
+
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050522T130601
+CREATED:20050522T130601
+UID:KAlarm-287267280.549
+SEQUENCE:0
+LAST-MODIFIED:20050522T130601
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=YEARLY;INTERVAL=3;BYDAY=3TU;BYMONTH=5,11
+DTSTART:20051115T130600
+TRANSP:OPAQUE
+BEGIN:VALARM
+DESCRIPTION:every 3 years on the 3. tuesday in may and november
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:PT0S
+X-KDE-KALARM-FONTCOLOR:#ff0000\;#000000\;
+END:VALARM
+
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050522T130601
+CREATED:20050522T130440
+UID:KAlarm-651624348.728
+SEQUENCE:0
+LAST-MODIFIED:20050522T130440
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=MONTHLY;INTERVAL=1;BYDAY=-2WE
+DTSTART:20050622T130500
+TRANSP:OPAQUE
+BEGIN:VALARM
+DESCRIPTION:every 2 months on the 2nd-to-last wednesday
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:PT0S
+X-KDE-KALARM-FONTCOLOR:#ff0000\;#000000\;
+END:VALARM
+
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050522T130601
+CREATED:20050522T124600
+UID:KAlarm-1071184954.82
+SEQUENCE:4
+LAST-MODIFIED:20050522T130201
+CLASS:PUBLIC
+PRIORITY:5
+CATEGORIES:SAVE
+RRULE:FREQ=MINUTELY;INTERVAL=4
+DTSTART:20050522T125000
+TRANSP:OPAQUE
+BEGIN:VALARM
+DESCRIPTION:Every 4 minutes
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:PT16M
+X-KDE-KALARM-FONTCOLOR:#ff0000\;#000000\;
+END:VALARM
+
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050522T130601
+CREATED:20050522T130525
+UID:KAlarm-1044160066.1024
+SEQUENCE:0
+LAST-MODIFIED:20050522T130525
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=YEARLY;INTERVAL=2;BYMONTHDAY=27;BYMONTH=3,7,11
+DTSTART:20050727T130500
+TRANSP:OPAQUE
+BEGIN:VALARM
+DESCRIPTION:every 2 years on the 27. of march\, july and november
+ACTION:DISPLAY
+TRIGGER;VALUE=DURATION:PT0S
+X-KDE-KALARM-FONTCOLOR:#ff0000\;#000000\;
+END:VALARM
+
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/readme.txt b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/readme.txt
new file mode 100644
index 00000000..26c180da
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KAlarm_3.4/readme.txt
@@ -0,0 +1,10 @@
+These files are intended to check which things break on an upgrade and
+if our compat classes are working.
+The files cover all different cases of recurrence rules that could be
+produced by KAlarm from KDE 3.4.
+
+
+The reference data are the occurrences that were generated with
+KOrganizer from KDE 3.4. They do not alway follow the RFC, but we need
+to ensure that the rrule is adjusted by a Compat class
+so that the new version produces the same set of occurrences.
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase01.ics b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase01.ics
new file mode 100644
index 00000000..bc90f1e0
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase01.ics
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/Vienna
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T104909Z
+UID:KOrganizer-1943919749.348
+SEQUENCE:2
+LAST-MODIFIED:20050520T105735Z
+SUMMARY:Fr 20. Mai 2005\, 14-15 Uhr\, alle 2 Wochen am Di/Do\, 27 Mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=WEEKLY;COUNT=27;INTERVAL=2;BYDAY=TU,TH
+DTSTART:20050520T120000Z
+DTEND:20050520T130000Z
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase01.ics.next.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase01.ics.next.ref
new file mode 100644
index 00000000..7c77b300
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase01.ics.next.ref
@@ -0,0 +1,28 @@
+2005-05-31T14:00:00
+2005-06-02T14:00:00
+2005-06-14T14:00:00
+2005-06-16T14:00:00
+2005-06-28T14:00:00
+2005-06-30T14:00:00
+2005-07-12T14:00:00
+2005-07-14T14:00:00
+2005-07-26T14:00:00
+2005-07-28T14:00:00
+2005-08-09T14:00:00
+2005-08-11T14:00:00
+2005-08-23T14:00:00
+2005-08-25T14:00:00
+2005-09-06T14:00:00
+2005-09-08T14:00:00
+2005-09-20T14:00:00
+2005-09-22T14:00:00
+2005-10-04T14:00:00
+2005-10-06T14:00:00
+2005-10-18T14:00:00
+2005-10-20T14:00:00
+2005-11-01T14:00:00
+2005-11-03T14:00:00
+2005-11-15T14:00:00
+2005-11-17T14:00:00
+2005-11-29T14:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase01.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase01.ics.prev.ref
new file mode 100644
index 00000000..7ec99b2b
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase01.ics.prev.ref
@@ -0,0 +1,28 @@
+2005-11-29T14:00:00
+2005-11-17T14:00:00
+2005-11-15T14:00:00
+2005-11-03T14:00:00
+2005-11-01T14:00:00
+2005-10-20T14:00:00
+2005-10-18T14:00:00
+2005-10-06T14:00:00
+2005-10-04T14:00:00
+2005-09-22T14:00:00
+2005-09-20T14:00:00
+2005-09-08T14:00:00
+2005-09-06T14:00:00
+2005-08-25T14:00:00
+2005-08-23T14:00:00
+2005-08-11T14:00:00
+2005-08-09T14:00:00
+2005-07-28T14:00:00
+2005-07-26T14:00:00
+2005-07-14T14:00:00
+2005-07-12T14:00:00
+2005-06-30T14:00:00
+2005-06-28T14:00:00
+2005-06-16T14:00:00
+2005-06-14T14:00:00
+2005-06-02T14:00:00
+2005-05-31T14:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase01.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase01.ics.recurson.ref
new file mode 100644
index 00000000..eddc62a8
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase01.ics.recurson.ref
@@ -0,0 +1,28 @@
+2005-05-31
+2005-06-02
+2005-06-14
+2005-06-16
+2005-06-28
+2005-06-30
+2005-07-12
+2005-07-14
+2005-07-26
+2005-07-28
+2005-08-09
+2005-08-11
+2005-08-23
+2005-08-25
+2005-09-06
+2005-09-08
+2005-09-20
+2005-09-22
+2005-10-04
+2005-10-06
+2005-10-18
+2005-10-20
+2005-11-01
+2005-11-03
+2005-11-15
+2005-11-17
+2005-11-29
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase02.ics b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase02.ics
new file mode 100644
index 00000000..4a26e0c1
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase02.ics
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/Vienna
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105130Z
+UID:KOrganizer-1286451532.549
+SEQUENCE:2
+LAST-MODIFIED:20050520T105759Z
+SUMMARY:20. Mai 2005\, 17-18 Uhr\, alle 3 Monate am 20.\, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=MONTHLY;COUNT=17;INTERVAL=3;BYMONTHDAY=20
+DTSTART:20050520T150000Z
+DTEND:20050520T160000Z
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase02.ics.next.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase02.ics.next.ref
new file mode 100644
index 00000000..147b5808
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase02.ics.next.ref
@@ -0,0 +1,18 @@
+2005-05-20T17:00:00
+2005-08-20T17:00:00
+2005-11-20T17:00:00
+2006-02-20T17:00:00
+2006-05-20T17:00:00
+2006-08-20T17:00:00
+2006-11-20T17:00:00
+2007-02-20T17:00:00
+2007-05-20T17:00:00
+2007-08-20T17:00:00
+2007-11-20T17:00:00
+2008-02-20T17:00:00
+2008-05-20T17:00:00
+2008-08-20T17:00:00
+2008-11-20T17:00:00
+2009-02-20T17:00:00
+2009-05-20T17:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase02.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase02.ics.prev.ref
new file mode 100644
index 00000000..2558a548
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase02.ics.prev.ref
@@ -0,0 +1,18 @@
+2009-05-20T17:00:00
+2009-02-20T17:00:00
+2008-11-20T17:00:00
+2008-08-20T17:00:00
+2008-05-20T17:00:00
+2008-02-20T17:00:00
+2007-11-20T17:00:00
+2007-08-20T17:00:00
+2007-05-20T17:00:00
+2007-02-20T17:00:00
+2006-11-20T17:00:00
+2006-08-20T17:00:00
+2006-05-20T17:00:00
+2006-02-20T17:00:00
+2005-11-20T17:00:00
+2005-08-20T17:00:00
+2005-05-20T17:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase02.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase02.ics.recurson.ref
new file mode 100644
index 00000000..0afa681a
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase02.ics.recurson.ref
@@ -0,0 +1,18 @@
+2005-05-20
+2005-08-20
+2005-11-20
+2006-02-20
+2006-05-20
+2006-08-20
+2006-11-20
+2007-02-20
+2007-05-20
+2007-08-20
+2007-11-20
+2008-02-20
+2008-05-20
+2008-08-20
+2008-11-20
+2009-02-20
+2009-05-20
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase03.ics b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase03.ics
new file mode 100644
index 00000000..57e3516a
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase03.ics
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/Vienna
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105219Z
+UID:KOrganizer-45214176.303
+SEQUENCE:2
+LAST-MODIFIED:20050520T105815Z
+SUMMARY:20. Mai 2005\, 19-20 Uhr\, alle 3 Monate am -2. Fr\, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=MONTHLY;COUNT=17;INTERVAL=3;BYDAY=-2FR
+DTSTART:20050520T170000Z
+DTEND:20050520T180000Z
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase03.ics.next.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase03.ics.next.ref
new file mode 100644
index 00000000..7a9d6802
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase03.ics.next.ref
@@ -0,0 +1,18 @@
+2005-05-20T19:00:00
+2005-08-19T19:00:00
+2005-11-18T19:00:00
+2006-02-17T19:00:00
+2006-05-19T19:00:00
+2006-08-18T19:00:00
+2006-11-17T19:00:00
+2007-02-16T19:00:00
+2007-05-18T19:00:00
+2007-08-24T19:00:00
+2007-11-23T19:00:00
+2008-02-22T19:00:00
+2008-05-23T19:00:00
+2008-08-22T19:00:00
+2008-11-21T19:00:00
+2009-02-20T19:00:00
+2009-05-22T19:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase03.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase03.ics.prev.ref
new file mode 100644
index 00000000..26522792
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase03.ics.prev.ref
@@ -0,0 +1,18 @@
+2009-05-22T19:00:00
+2009-02-20T19:00:00
+2008-11-21T19:00:00
+2008-08-22T19:00:00
+2008-05-23T19:00:00
+2008-02-22T19:00:00
+2007-11-23T19:00:00
+2007-08-24T19:00:00
+2007-05-18T19:00:00
+2007-02-16T19:00:00
+2006-11-17T19:00:00
+2006-08-18T19:00:00
+2006-05-19T19:00:00
+2006-02-17T19:00:00
+2005-11-18T19:00:00
+2005-08-19T19:00:00
+2005-05-20T19:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase03.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase03.ics.recurson.ref
new file mode 100644
index 00000000..d1da3d8e
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase03.ics.recurson.ref
@@ -0,0 +1,18 @@
+2005-05-20
+2005-08-19
+2005-11-18
+2006-02-17
+2006-05-19
+2006-08-18
+2006-11-17
+2007-02-16
+2007-05-18
+2007-08-24
+2007-11-23
+2008-02-22
+2008-05-23
+2008-08-22
+2008-11-21
+2009-02-20
+2009-05-22
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase04.ics b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase04.ics
new file mode 100644
index 00000000..4e25d915
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase04.ics
@@ -0,0 +1,21 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/Vienna
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T104822Z
+UID:KOrganizer-428202830.752
+SEQUENCE:2
+LAST-MODIFIED:20050520T105740Z
+SUMMARY:20. Mai 2005\, 14-15 Uhr\, alle 2 Wochen am Mo/Mi/Fr\, bis 30.
+ Juni 2005
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=WEEKLY;UNTIL=20050630;INTERVAL=2;BYDAY=MO,WE,FR
+DTSTART:20050520T120000Z
+DTEND:20050520T130000Z
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase04.ics.next.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase04.ics.next.ref
new file mode 100644
index 00000000..9f658851
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase04.ics.next.ref
@@ -0,0 +1,10 @@
+2005-05-20T14:00:00
+2005-05-30T14:00:00
+2005-06-01T14:00:00
+2005-06-03T14:00:00
+2005-06-13T14:00:00
+2005-06-15T14:00:00
+2005-06-17T14:00:00
+2005-06-27T14:00:00
+2005-06-29T14:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase04.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase04.ics.prev.ref
new file mode 100644
index 00000000..d0111c3f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase04.ics.prev.ref
@@ -0,0 +1,10 @@
+2005-06-29T14:00:00
+2005-06-27T14:00:00
+2005-06-17T14:00:00
+2005-06-15T14:00:00
+2005-06-13T14:00:00
+2005-06-03T14:00:00
+2005-06-01T14:00:00
+2005-05-30T14:00:00
+2005-05-20T14:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase04.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase04.ics.recurson.ref
new file mode 100644
index 00000000..d2539ae6
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase04.ics.recurson.ref
@@ -0,0 +1,10 @@
+2005-05-20
+2005-05-30
+2005-06-01
+2005-06-03
+2005-06-13
+2005-06-15
+2005-06-17
+2005-06-27
+2005-06-29
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase05.ics b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase05.ics
new file mode 100644
index 00000000..b79c9e42
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase05.ics
@@ -0,0 +1,21 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/Vienna
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105002Z
+UID:KOrganizer-776556232.395
+SEQUENCE:4
+LAST-MODIFIED:20050520T105750Z
+SUMMARY:20. Mai 2005\, 16-17 Uhr\, alle 3 Monate am 20.\, bis 30. Juni
+ 2006
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=MONTHLY;UNTIL=20060630;INTERVAL=3;BYMONTHDAY=20
+DTSTART:20050520T140000Z
+DTEND:20050520T150000Z
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase05.ics.next.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase05.ics.next.ref
new file mode 100644
index 00000000..c7339ae0
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase05.ics.next.ref
@@ -0,0 +1,6 @@
+2005-05-20T16:00:00
+2005-08-20T16:00:00
+2005-11-20T16:00:00
+2006-02-20T16:00:00
+2006-05-20T16:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase05.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase05.ics.prev.ref
new file mode 100644
index 00000000..957d974c
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase05.ics.prev.ref
@@ -0,0 +1,6 @@
+2006-05-20T16:00:00
+2006-02-20T16:00:00
+2005-11-20T16:00:00
+2005-08-20T16:00:00
+2005-05-20T16:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase05.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase05.ics.recurson.ref
new file mode 100644
index 00000000..e385de94
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase05.ics.recurson.ref
@@ -0,0 +1,6 @@
+2005-05-20
+2005-08-20
+2005-11-20
+2006-02-20
+2006-05-20
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase06.ics b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase06.ics
new file mode 100644
index 00000000..9e470851
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase06.ics
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/Vienna
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T104755Z
+UID:KOrganizer-872504546.272
+SEQUENCE:0
+LAST-MODIFIED:20050520T104755Z
+SUMMARY:20. Mai 2005\, 12-13 Uhr\, alle 3 Tage\, 50 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=DAILY;COUNT=50;INTERVAL=3
+DTSTART:20050520T100000Z
+DTEND:20050520T110000Z
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase06.ics.next.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase06.ics.next.ref
new file mode 100644
index 00000000..deebb8b0
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase06.ics.next.ref
@@ -0,0 +1,51 @@
+2005-05-20T12:00:00
+2005-05-23T12:00:00
+2005-05-26T12:00:00
+2005-05-29T12:00:00
+2005-06-01T12:00:00
+2005-06-04T12:00:00
+2005-06-07T12:00:00
+2005-06-10T12:00:00
+2005-06-13T12:00:00
+2005-06-16T12:00:00
+2005-06-19T12:00:00
+2005-06-22T12:00:00
+2005-06-25T12:00:00
+2005-06-28T12:00:00
+2005-07-01T12:00:00
+2005-07-04T12:00:00
+2005-07-07T12:00:00
+2005-07-10T12:00:00
+2005-07-13T12:00:00
+2005-07-16T12:00:00
+2005-07-19T12:00:00
+2005-07-22T12:00:00
+2005-07-25T12:00:00
+2005-07-28T12:00:00
+2005-07-31T12:00:00
+2005-08-03T12:00:00
+2005-08-06T12:00:00
+2005-08-09T12:00:00
+2005-08-12T12:00:00
+2005-08-15T12:00:00
+2005-08-18T12:00:00
+2005-08-21T12:00:00
+2005-08-24T12:00:00
+2005-08-27T12:00:00
+2005-08-30T12:00:00
+2005-09-02T12:00:00
+2005-09-05T12:00:00
+2005-09-08T12:00:00
+2005-09-11T12:00:00
+2005-09-14T12:00:00
+2005-09-17T12:00:00
+2005-09-20T12:00:00
+2005-09-23T12:00:00
+2005-09-26T12:00:00
+2005-09-29T12:00:00
+2005-10-02T12:00:00
+2005-10-05T12:00:00
+2005-10-08T12:00:00
+2005-10-11T12:00:00
+2005-10-14T12:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase06.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase06.ics.prev.ref
new file mode 100644
index 00000000..80806d0c
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase06.ics.prev.ref
@@ -0,0 +1,51 @@
+2005-10-14T12:00:00
+2005-10-11T12:00:00
+2005-10-08T12:00:00
+2005-10-05T12:00:00
+2005-10-02T12:00:00
+2005-09-29T12:00:00
+2005-09-26T12:00:00
+2005-09-23T12:00:00
+2005-09-20T12:00:00
+2005-09-17T12:00:00
+2005-09-14T12:00:00
+2005-09-11T12:00:00
+2005-09-08T12:00:00
+2005-09-05T12:00:00
+2005-09-02T12:00:00
+2005-08-30T12:00:00
+2005-08-27T12:00:00
+2005-08-24T12:00:00
+2005-08-21T12:00:00
+2005-08-18T12:00:00
+2005-08-15T12:00:00
+2005-08-12T12:00:00
+2005-08-09T12:00:00
+2005-08-06T12:00:00
+2005-08-03T12:00:00
+2005-07-31T12:00:00
+2005-07-28T12:00:00
+2005-07-25T12:00:00
+2005-07-22T12:00:00
+2005-07-19T12:00:00
+2005-07-16T12:00:00
+2005-07-13T12:00:00
+2005-07-10T12:00:00
+2005-07-07T12:00:00
+2005-07-04T12:00:00
+2005-07-01T12:00:00
+2005-06-28T12:00:00
+2005-06-25T12:00:00
+2005-06-22T12:00:00
+2005-06-19T12:00:00
+2005-06-16T12:00:00
+2005-06-13T12:00:00
+2005-06-10T12:00:00
+2005-06-07T12:00:00
+2005-06-04T12:00:00
+2005-06-01T12:00:00
+2005-05-29T12:00:00
+2005-05-26T12:00:00
+2005-05-23T12:00:00
+2005-05-20T12:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase06.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase06.ics.recurson.ref
new file mode 100644
index 00000000..21a20f2d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase06.ics.recurson.ref
@@ -0,0 +1,51 @@
+2005-05-20
+2005-05-23
+2005-05-26
+2005-05-29
+2005-06-01
+2005-06-04
+2005-06-07
+2005-06-10
+2005-06-13
+2005-06-16
+2005-06-19
+2005-06-22
+2005-06-25
+2005-06-28
+2005-07-01
+2005-07-04
+2005-07-07
+2005-07-10
+2005-07-13
+2005-07-16
+2005-07-19
+2005-07-22
+2005-07-25
+2005-07-28
+2005-07-31
+2005-08-03
+2005-08-06
+2005-08-09
+2005-08-12
+2005-08-15
+2005-08-18
+2005-08-21
+2005-08-24
+2005-08-27
+2005-08-30
+2005-09-02
+2005-09-05
+2005-09-08
+2005-09-11
+2005-09-14
+2005-09-17
+2005-09-20
+2005-09-23
+2005-09-26
+2005-09-29
+2005-10-02
+2005-10-05
+2005-10-08
+2005-10-11
+2005-10-14
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase07.ics b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase07.ics
new file mode 100644
index 00000000..5a269b7f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase07.ics
@@ -0,0 +1,21 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/Vienna
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105402Z
+UID:KOrganizer-1016383107.562
+SEQUENCE:3
+LAST-MODIFIED:20050520T105836Z
+SUMMARY:20. Mai 2005\, 22-23 Uhr\, alle 3 Jahre am 3. Freitag im Mai\,
+ 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=YEARLY;COUNT=17;INTERVAL=3;BYDAY=3FR;BYMONTH=5
+DTSTART:20050520T200000Z
+DTEND:20050520T210000Z
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase07.ics.next.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase07.ics.next.ref
new file mode 100644
index 00000000..9b3f587c
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase07.ics.next.ref
@@ -0,0 +1,18 @@
+2005-05-20T22:00:00
+2008-05-16T22:00:00
+2011-05-20T22:00:00
+2014-05-16T22:00:00
+2017-05-19T22:00:00
+2020-05-15T22:00:00
+2023-05-19T22:00:00
+2026-05-15T22:00:00
+2029-05-18T22:00:00
+2032-05-21T22:00:00
+2035-05-18T22:00:00
+2038-05-21T22:00:00
+2041-05-17T22:00:00
+2044-05-20T22:00:00
+2047-05-17T22:00:00
+2050-05-20T22:00:00
+2053-05-16T22:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase07.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase07.ics.prev.ref
new file mode 100644
index 00000000..1777a8f4
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase07.ics.prev.ref
@@ -0,0 +1,18 @@
+2053-05-16T22:00:00
+2050-05-20T22:00:00
+2047-05-17T22:00:00
+2044-05-20T22:00:00
+2041-05-17T22:00:00
+2038-05-21T22:00:00
+2035-05-18T22:00:00
+2032-05-21T22:00:00
+2029-05-18T22:00:00
+2026-05-15T22:00:00
+2023-05-19T22:00:00
+2020-05-15T22:00:00
+2017-05-19T22:00:00
+2014-05-16T22:00:00
+2011-05-20T22:00:00
+2008-05-16T22:00:00
+2005-05-20T22:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase07.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase07.ics.recurson.ref
new file mode 100644
index 00000000..41636340
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase07.ics.recurson.ref
@@ -0,0 +1,18 @@
+2005-05-20
+2008-05-16
+2011-05-20
+2014-05-16
+2017-05-19
+2020-05-15
+2023-05-19
+2026-05-15
+2029-05-18
+2032-05-21
+2035-05-18
+2038-05-21
+2041-05-17
+2044-05-20
+2047-05-17
+2050-05-20
+2053-05-16
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase08.ics b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase08.ics
new file mode 100644
index 00000000..50e49bad
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase08.ics
@@ -0,0 +1,21 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/Vienna
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105442Z
+UID:KOrganizer-1832470339.751
+SEQUENCE:1
+LAST-MODIFIED:20050520T105511Z
+SUMMARY:20. Mai 2005\, 23-24 Uhr\, alle 3 Jahre am vorletzten Freitag im
+ Mai\, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=YEARLY;COUNT=17;INTERVAL=3;BYDAY=-2FR;BYMONTH=5
+DTSTART:20050520T210000Z
+DTEND:20050520T215900Z
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase08.ics.next.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase08.ics.next.ref
new file mode 100644
index 00000000..96f00ff9
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase08.ics.next.ref
@@ -0,0 +1,18 @@
+2005-05-20T23:00:00
+2008-05-23T23:00:00
+2011-05-20T23:00:00
+2014-05-23T23:00:00
+2017-05-19T23:00:00
+2020-05-22T23:00:00
+2023-05-19T23:00:00
+2026-05-22T23:00:00
+2029-05-18T23:00:00
+2032-05-21T23:00:00
+2035-05-18T23:00:00
+2038-05-21T23:00:00
+2041-05-24T23:00:00
+2044-05-20T23:00:00
+2047-05-24T23:00:00
+2050-05-20T23:00:00
+2053-05-23T23:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase08.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase08.ics.prev.ref
new file mode 100644
index 00000000..0a3998b4
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase08.ics.prev.ref
@@ -0,0 +1,18 @@
+2053-05-23T23:00:00
+2050-05-20T23:00:00
+2047-05-24T23:00:00
+2044-05-20T23:00:00
+2041-05-24T23:00:00
+2038-05-21T23:00:00
+2035-05-18T23:00:00
+2032-05-21T23:00:00
+2029-05-18T23:00:00
+2026-05-22T23:00:00
+2023-05-19T23:00:00
+2020-05-22T23:00:00
+2017-05-19T23:00:00
+2014-05-23T23:00:00
+2011-05-20T23:00:00
+2008-05-23T23:00:00
+2005-05-20T23:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase08.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase08.ics.recurson.ref
new file mode 100644
index 00000000..3bcbf7e2
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase08.ics.recurson.ref
@@ -0,0 +1,18 @@
+2005-05-20
+2008-05-23
+2011-05-20
+2014-05-23
+2017-05-19
+2020-05-22
+2023-05-19
+2026-05-22
+2029-05-18
+2032-05-21
+2035-05-18
+2038-05-21
+2041-05-24
+2044-05-20
+2047-05-24
+2050-05-20
+2053-05-23
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase09.ics b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase09.ics
new file mode 100644
index 00000000..3a31c752
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase09.ics
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/Vienna
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105153Z
+UID:KOrganizer-712420734.1026
+SEQUENCE:3
+LAST-MODIFIED:20050520T105809Z
+SUMMARY:20. Mai 2005\, 18-19 Uhr\, alle 3 Monate am 3. Fr\, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=MONTHLY;COUNT=17;INTERVAL=3;BYDAY=3FR
+DTSTART:20050520T160000Z
+DTEND:20050520T170000Z
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase09.ics.next.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase09.ics.next.ref
new file mode 100644
index 00000000..c780c77d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase09.ics.next.ref
@@ -0,0 +1,18 @@
+2005-05-20T18:00:00
+2005-08-19T18:00:00
+2005-11-18T18:00:00
+2006-02-17T18:00:00
+2006-05-19T18:00:00
+2006-08-18T18:00:00
+2006-11-17T18:00:00
+2007-02-16T18:00:00
+2007-05-18T18:00:00
+2007-08-17T18:00:00
+2007-11-16T18:00:00
+2008-02-15T18:00:00
+2008-05-16T18:00:00
+2008-08-15T18:00:00
+2008-11-21T18:00:00
+2009-02-20T18:00:00
+2009-05-15T18:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase09.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase09.ics.prev.ref
new file mode 100644
index 00000000..0453ba0d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase09.ics.prev.ref
@@ -0,0 +1,18 @@
+2009-05-15T18:00:00
+2009-02-20T18:00:00
+2008-11-21T18:00:00
+2008-08-15T18:00:00
+2008-05-16T18:00:00
+2008-02-15T18:00:00
+2007-11-16T18:00:00
+2007-08-17T18:00:00
+2007-05-18T18:00:00
+2007-02-16T18:00:00
+2006-11-17T18:00:00
+2006-08-18T18:00:00
+2006-05-19T18:00:00
+2006-02-17T18:00:00
+2005-11-18T18:00:00
+2005-08-19T18:00:00
+2005-05-20T18:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase09.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase09.ics.recurson.ref
new file mode 100644
index 00000000..b6f08cd1
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase09.ics.recurson.ref
@@ -0,0 +1,18 @@
+2005-05-20
+2005-08-19
+2005-11-18
+2006-02-17
+2006-05-19
+2006-08-18
+2006-11-17
+2007-02-16
+2007-05-18
+2007-08-17
+2007-11-16
+2008-02-15
+2008-05-16
+2008-08-15
+2008-11-21
+2009-02-20
+2009-05-15
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase10.ics b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase10.ics
new file mode 100644
index 00000000..fa4616aa
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase10.ics
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/Vienna
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105331Z
+UID:KOrganizer-1059871846.769
+SEQUENCE:1
+LAST-MODIFIED:20050520T105400Z
+SUMMARY:20. Mai 2005\, 21-22 Uhr\, alle 2 Jahre am 24. Mai\, 13 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=YEARLY;COUNT=13;INTERVAL=2;BYMONTHDAY=24;BYMONTH=5
+DTSTART:20050520T190000Z
+DTEND:20050520T200000Z
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase10.ics.next.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase10.ics.next.ref
new file mode 100644
index 00000000..28512b65
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase10.ics.next.ref
@@ -0,0 +1,14 @@
+2005-05-24T21:00:00
+2007-05-24T21:00:00
+2009-05-24T21:00:00
+2011-05-24T21:00:00
+2013-05-24T21:00:00
+2015-05-24T21:00:00
+2017-05-24T21:00:00
+2019-05-24T21:00:00
+2021-05-24T21:00:00
+2023-05-24T21:00:00
+2025-05-24T21:00:00
+2027-05-24T21:00:00
+2029-05-24T21:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase10.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase10.ics.prev.ref
new file mode 100644
index 00000000..1f0a9095
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase10.ics.prev.ref
@@ -0,0 +1,14 @@
+2029-05-24T21:00:00
+2027-05-24T21:00:00
+2025-05-24T21:00:00
+2023-05-24T21:00:00
+2021-05-24T21:00:00
+2019-05-24T21:00:00
+2017-05-24T21:00:00
+2015-05-24T21:00:00
+2013-05-24T21:00:00
+2011-05-24T21:00:00
+2009-05-24T21:00:00
+2007-05-24T21:00:00
+2005-05-24T21:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase10.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase10.ics.recurson.ref
new file mode 100644
index 00000000..10a4e1cc
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase10.ics.recurson.ref
@@ -0,0 +1,14 @@
+2005-05-24
+2007-05-24
+2009-05-24
+2011-05-24
+2013-05-24
+2015-05-24
+2017-05-24
+2019-05-24
+2021-05-24
+2023-05-24
+2025-05-24
+2027-05-24
+2029-05-24
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase11.ics b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase11.ics
new file mode 100644
index 00000000..d141ed84
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase11.ics
@@ -0,0 +1,21 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/Vienna
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105525Z
+UID:KOrganizer-881198156.528
+SEQUENCE:3
+LAST-MODIFIED:20050520T105853Z
+SUMMARY:21. Mai 2005\, 12-13 Uhr\, jedes Jahr am 141. Tag im Jahr\, 17
+ mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=YEARLY;COUNT=17;INTERVAL=1;BYYEARDAY=141
+DTSTART:20050521T100000Z
+DTEND:20050521T110000Z
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase11.ics.next.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase11.ics.next.ref
new file mode 100644
index 00000000..a2d288e2
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase11.ics.next.ref
@@ -0,0 +1,18 @@
+2005-05-21T12:00:00
+2006-05-21T12:00:00
+2007-05-21T12:00:00
+2008-05-20T12:00:00
+2009-05-21T12:00:00
+2010-05-21T12:00:00
+2011-05-21T12:00:00
+2012-05-20T12:00:00
+2013-05-21T12:00:00
+2014-05-21T12:00:00
+2015-05-21T12:00:00
+2016-05-20T12:00:00
+2017-05-21T12:00:00
+2018-05-21T12:00:00
+2019-05-21T12:00:00
+2020-05-20T12:00:00
+2021-05-21T12:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase11.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase11.ics.prev.ref
new file mode 100644
index 00000000..d7598129
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase11.ics.prev.ref
@@ -0,0 +1,18 @@
+2021-05-21T12:00:00
+2020-05-20T12:00:00
+2019-05-21T12:00:00
+2018-05-21T12:00:00
+2017-05-21T12:00:00
+2016-05-20T12:00:00
+2015-05-21T12:00:00
+2014-05-21T12:00:00
+2013-05-21T12:00:00
+2012-05-20T12:00:00
+2011-05-21T12:00:00
+2010-05-21T12:00:00
+2009-05-21T12:00:00
+2008-05-20T12:00:00
+2007-05-21T12:00:00
+2006-05-21T12:00:00
+2005-05-21T12:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase11.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase11.ics.recurson.ref
new file mode 100644
index 00000000..c20433a6
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase11.ics.recurson.ref
@@ -0,0 +1,18 @@
+2005-05-21
+2006-05-21
+2007-05-21
+2008-05-20
+2009-05-21
+2010-05-21
+2011-05-21
+2012-05-20
+2013-05-21
+2014-05-21
+2015-05-21
+2016-05-20
+2017-05-21
+2018-05-21
+2019-05-21
+2020-05-20
+2021-05-21
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase12.ics b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase12.ics
new file mode 100644
index 00000000..2869eec1
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase12.ics
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/Vienna
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T104758Z
+UID:KOrganizer-1078681338.495
+SEQUENCE:1
+LAST-MODIFIED:20050520T104819Z
+SUMMARY:20. Mai 2005\, 13-14 Uhr\, alle 3 Tage\, bis 30. Juni 2005
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=DAILY;UNTIL=20050630;INTERVAL=3
+DTSTART:20050520T110000Z
+DTEND:20050520T120000Z
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase12.ics.next.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase12.ics.next.ref
new file mode 100644
index 00000000..5f620e0f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase12.ics.next.ref
@@ -0,0 +1,15 @@
+2005-05-20T13:00:00
+2005-05-23T13:00:00
+2005-05-26T13:00:00
+2005-05-29T13:00:00
+2005-06-01T13:00:00
+2005-06-04T13:00:00
+2005-06-07T13:00:00
+2005-06-10T13:00:00
+2005-06-13T13:00:00
+2005-06-16T13:00:00
+2005-06-19T13:00:00
+2005-06-22T13:00:00
+2005-06-25T13:00:00
+2005-06-28T13:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase12.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase12.ics.prev.ref
new file mode 100644
index 00000000..2bf74469
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase12.ics.prev.ref
@@ -0,0 +1,15 @@
+2005-06-28T13:00:00
+2005-06-25T13:00:00
+2005-06-22T13:00:00
+2005-06-19T13:00:00
+2005-06-16T13:00:00
+2005-06-13T13:00:00
+2005-06-10T13:00:00
+2005-06-07T13:00:00
+2005-06-04T13:00:00
+2005-06-01T13:00:00
+2005-05-29T13:00:00
+2005-05-26T13:00:00
+2005-05-23T13:00:00
+2005-05-20T13:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase12.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase12.ics.recurson.ref
new file mode 100644
index 00000000..71459c77
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase12.ics.recurson.ref
@@ -0,0 +1,15 @@
+2005-05-20
+2005-05-23
+2005-05-26
+2005-05-29
+2005-06-01
+2005-06-04
+2005-06-07
+2005-06-10
+2005-06-13
+2005-06-16
+2005-06-19
+2005-06-22
+2005-06-25
+2005-06-28
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase13.ics b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase13.ics
new file mode 100644
index 00000000..0269bc31
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase13.ics
@@ -0,0 +1,21 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/Vienna
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105244Z
+UID:KOrganizer-1521406395.909
+SEQUENCE:1
+LAST-MODIFIED:20050520T105327Z
+SUMMARY:20. Mai 2005\, 20-21 Uhr\, alle 3 Monate am letzten Do\, bis 31.
+ 12. 2006
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=MONTHLY;UNTIL=20061231;INTERVAL=3;BYDAY=-1TH
+DTSTART:20050520T180000Z
+DTEND:20050520T190000Z
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase13.ics.next.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase13.ics.next.ref
new file mode 100644
index 00000000..c5851553
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase13.ics.next.ref
@@ -0,0 +1,8 @@
+2005-05-26T20:00:00
+2005-08-25T20:00:00
+2005-11-24T20:00:00
+2006-02-23T20:00:00
+2006-05-25T20:00:00
+2006-08-31T20:00:00
+2006-11-30T20:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase13.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase13.ics.prev.ref
new file mode 100644
index 00000000..2173892d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase13.ics.prev.ref
@@ -0,0 +1,8 @@
+2006-11-30T20:00:00
+2006-08-31T20:00:00
+2006-05-25T20:00:00
+2006-02-23T20:00:00
+2005-11-24T20:00:00
+2005-08-25T20:00:00
+2005-05-26T20:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase13.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase13.ics.recurson.ref
new file mode 100644
index 00000000..6a2eafd8
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCase13.ics.recurson.ref
@@ -0,0 +1,8 @@
+2005-05-26
+2005-08-25
+2005-11-24
+2006-02-23
+2006-05-25
+2006-08-31
+2006-11-30
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCases.ics.saved b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCases.ics.saved
new file mode 100644
index 00000000..722e04d3
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/KOrganizer_TestCases.ics.saved
@@ -0,0 +1,219 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T104909Z
+UID:KOrganizer-1943919749.348
+SEQUENCE:2
+LAST-MODIFIED:20050520T105735Z
+SUMMARY:20. Mai 2005\, 14-15 Uhr\, alle 2 Wochen am Di/Do\, 27 Mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=WEEKLY;COUNT=27;INTERVAL=2;BYDAY=TU,TH
+DTSTART:20050520T130000Z
+DTEND:20050520T140000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105130Z
+UID:KOrganizer-1286451532.549
+SEQUENCE:2
+LAST-MODIFIED:20050520T105759Z
+SUMMARY:20. Mai 2005\, 17-18 Uhr\, alle 3 Monate am 20.\, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=MONTHLY;COUNT=17;INTERVAL=3;BYMONTHDAY=20
+DTSTART:20050520T150000Z
+DTEND:20050520T160000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105219Z
+UID:KOrganizer-45214176.303
+SEQUENCE:2
+LAST-MODIFIED:20050520T105815Z
+SUMMARY:20. Mai 2005\, 19-20 Uhr\, alle 3 Monate am -2. Fr\, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=MONTHLY;COUNT=17;INTERVAL=3;BYDAY=-2FR
+DTSTART:20050520T170000Z
+DTEND:20050520T180000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T104822Z
+UID:KOrganizer-428202830.752
+SEQUENCE:2
+LAST-MODIFIED:20050520T105740Z
+SUMMARY:20. Mai 2005\, 14-15 Uhr\, alle 2 Wochen am Mo/Mi/Fr\, bis 30.
+ Juni 2005
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=WEEKLY;UNTIL=20050630;INTERVAL=2;BYDAY=MO,WE,FR
+DTSTART:20050520T120000Z
+DTEND:20050520T130000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105002Z
+UID:KOrganizer-776556232.395
+SEQUENCE:4
+LAST-MODIFIED:20050520T105750Z
+SUMMARY:20. Mai 2005\, 16-17 Uhr\, alle 3 Monate am 20.\, bis 30. Juni
+ 2006
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=MONTHLY;UNTIL=20060630;INTERVAL=3;BYMONTHDAY=20
+DTSTART:20050520T140000Z
+DTEND:20050520T150000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T104755Z
+UID:KOrganizer-872504546.272
+SEQUENCE:0
+LAST-MODIFIED:20050520T104755Z
+SUMMARY:20. Mai 2005\, 12-13 Uhr\, alle 3 Tage\, 50 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=DAILY;COUNT=50;INTERVAL=3
+DTSTART:20050520T100000Z
+DTEND:20050520T110000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105402Z
+UID:KOrganizer-1016383107.562
+SEQUENCE:3
+LAST-MODIFIED:20050520T105836Z
+SUMMARY:20. Mai 2005\, 22-23 Uhr\, alle 3 Jahre am 3. Freitag im Mai\,
+ 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=YEARLY;COUNT=17;INTERVAL=3;BYDAY=3FR;BYMONTH=5
+DTSTART:20050520T200000Z
+DTEND:20050520T210000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105442Z
+UID:KOrganizer-1832470339.751
+SEQUENCE:1
+LAST-MODIFIED:20050520T105511Z
+SUMMARY:20. Mai 2005\, 23-24 Uhr\, alle 3 Jahre am vorletzten Freitag im
+ Mai\, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=YEARLY;COUNT=17;INTERVAL=3;BYDAY=-2FR;BYMONTH=5
+DTSTART:20050520T210000Z
+DTEND:20050520T215900Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105153Z
+UID:KOrganizer-712420734.1026
+SEQUENCE:3
+LAST-MODIFIED:20050520T105809Z
+SUMMARY:20. Mai 2005\, 18-19 Uhr\, alle 3 Monate am 3. Fr\, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=MONTHLY;COUNT=17;INTERVAL=3;BYDAY=3FR
+DTSTART:20050520T160000Z
+DTEND:20050520T170000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105331Z
+UID:KOrganizer-1059871846.769
+SEQUENCE:1
+LAST-MODIFIED:20050520T105400Z
+SUMMARY:20. Mai 2005\, 21-22 Uhr\, alle 2 Jahre am 24. Mai\, 13 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=YEARLY;COUNT=13;INTERVAL=2;BYMONTHDAY=24;BYMONTH=5
+DTSTART:20050520T190000Z
+DTEND:20050520T200000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105525Z
+UID:KOrganizer-881198156.528
+SEQUENCE:3
+LAST-MODIFIED:20050520T105853Z
+SUMMARY:21. Mai 2005\, 12-13 Uhr\, jedes Jahre am 141. Tag im Jahr\, 17
+ mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=YEARLY;COUNT=17;INTERVAL=1;BYYEARDAY=141
+DTSTART:20050521T100000Z
+DTEND:20050521T110000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T104758Z
+UID:KOrganizer-1078681338.495
+SEQUENCE:1
+LAST-MODIFIED:20050520T104819Z
+SUMMARY:20. Mai 2005\, 13-14 Uhr\, alle 3 Tage\, bis 30. Juni 2005
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=DAILY;UNTIL=20050630;INTERVAL=3
+DTSTART:20050520T110000Z
+DTEND:20050520T120000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105244Z
+UID:KOrganizer-1521406395.909
+SEQUENCE:1
+LAST-MODIFIED:20050520T105327Z
+SUMMARY:20. Mai 2005\, 20-21 Uhr\, alle 3 Monate am letzten Do\, bis 31.
+ 12. 2006
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=MONTHLY;UNTIL=20061231;INTERVAL=3;BYDAY=-1TH
+DTSTART:20050520T180000Z
+DTEND:20050520T190000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/readme.txt b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/readme.txt
new file mode 100644
index 00000000..66291728
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/KOrganizer_3.4/readme.txt
@@ -0,0 +1,14 @@
+These files are intended to check which things break on an upgrade and
+if our compat classes are working.
+The files cover all different cases of recurrence rules that could be
+produced by KOrganizer from KDE 3.4.
+
+
+The reference data are the occurrences
+that were generated with KOrganizer from KDE 3.4. They do not alway follow
+the RFC, but we need to ensure that the rrule is adjusted by a Compat class
+so that the new version produces the same set of occurrences. Things that
+are known as broken in KOrganizer from KDE 3.4:
+ 1) If the start date does not match the RRULE, it doesn't appear
+ as an occurrences (rfc 2445 says the DTSTART is always the first
+ occurrence, except when it's excluded by EXDATE or EXRULE).
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase01.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase01.ics
new file mode 100644
index 00000000..d0fa324f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase01.ics
@@ -0,0 +1,13 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+
+X-LibKCal-Testsuite-OutTZ:UTC
+BEGIN:VEVENT
+DESCRIPTION:Repeat every tuesday and wednesday starting Tue 2nd April 2002
+RRULE:FREQ=WEEKLY;INTERVAL=1;COUNT=6;BYDAY=TU,WE
+DTSTART:20020402T114500
+DTEND:20020402T124500
+X-EXPECT-NUMEVENTS: 6
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase01.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase01.ics.next.ref
new file mode 100644
index 00000000..6ce39a7d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase01.ics.next.ref
@@ -0,0 +1,9 @@
+2002-04-02T11:45:00
+2002-04-03T11:45:00
+2002-04-09T11:45:00
+2002-04-10T11:45:00
+2002-04-16T11:45:00
+2002-04-17T11:45:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase01.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase01.ics.prev.ref
new file mode 100644
index 00000000..1f5f03e8
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase01.ics.prev.ref
@@ -0,0 +1,9 @@
+2002-04-17T11:45:00
+2002-04-16T11:45:00
+2002-04-10T11:45:00
+2002-04-09T11:45:00
+2002-04-03T11:45:00
+2002-04-02T11:45:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase01.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase01.ics.recurson.ref
new file mode 100644
index 00000000..9b26c166
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase01.ics.recurson.ref
@@ -0,0 +1,7 @@
+2002-04-02
+2002-04-03
+2002-04-09
+2002-04-10
+2002-04-16
+2002-04-17
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase02.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase02.ics
new file mode 100644
index 00000000..74668577
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase02.ics
@@ -0,0 +1,13 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:UTC
+
+BEGIN:VEVENT
+DESCRIPTION:Repeat every thursday starting Tue 2nd April 2002
+RRULE:FREQ=WEEKLY;INTERVAL=1;COUNT=6;BYDAY=TH
+DTSTART:20020402T114500
+DTEND:20020402T124500
+X-EXPECT-NUMEVENTS: 6
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase02.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase02.ics.next.ref
new file mode 100644
index 00000000..3895ecca
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase02.ics.next.ref
@@ -0,0 +1,10 @@
+2002-04-02T11:45:00
+2002-04-04T11:45:00
+2002-04-11T11:45:00
+2002-04-18T11:45:00
+2002-04-25T11:45:00
+2002-05-02T11:45:00
+2002-05-09T11:45:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase02.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase02.ics.prev.ref
new file mode 100644
index 00000000..603d0443
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase02.ics.prev.ref
@@ -0,0 +1,10 @@
+2002-05-09T11:45:00
+2002-05-02T11:45:00
+2002-04-25T11:45:00
+2002-04-18T11:45:00
+2002-04-11T11:45:00
+2002-04-04T11:45:00
+2002-04-02T11:45:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase02.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase02.ics.recurson.ref
new file mode 100644
index 00000000..eb9f8158
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase02.ics.recurson.ref
@@ -0,0 +1,8 @@
+2002-04-02
+2002-04-04
+2002-04-11
+2002-04-18
+2002-04-25
+2002-05-02
+2002-05-09
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase03.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase03.ics
new file mode 100644
index 00000000..59d50043
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase03.ics
@@ -0,0 +1,13 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+
+X-LibKCal-Testsuite-OutTZ:UTC
+BEGIN:VEVENT
+DESCRIPTION:Every year on the same day\, forever
+RRULE:FREQ=YEARLY;INTERVAL=1
+DTSTART:19990201T172000
+DTEND:19990201T182000
+X-EXPECT-NUMEVENTS: 39
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase03.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase03.ics.next.ref
new file mode 100644
index 00000000..de2a9fa4
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase03.ics.next.ref
@@ -0,0 +1,502 @@
+1999-02-01T17:20:00
+2000-02-01T17:20:00
+2001-02-01T17:20:00
+2002-02-01T17:20:00
+2003-02-01T17:20:00
+2004-02-01T17:20:00
+2005-02-01T17:20:00
+2006-02-01T17:20:00
+2007-02-01T17:20:00
+2008-02-01T17:20:00
+2009-02-01T17:20:00
+2010-02-01T17:20:00
+2011-02-01T17:20:00
+2012-02-01T17:20:00
+2013-02-01T17:20:00
+2014-02-01T17:20:00
+2015-02-01T17:20:00
+2016-02-01T17:20:00
+2017-02-01T17:20:00
+2018-02-01T17:20:00
+2019-02-01T17:20:00
+2020-02-01T17:20:00
+2021-02-01T17:20:00
+2022-02-01T17:20:00
+2023-02-01T17:20:00
+2024-02-01T17:20:00
+2025-02-01T17:20:00
+2026-02-01T17:20:00
+2027-02-01T17:20:00
+2028-02-01T17:20:00
+2029-02-01T17:20:00
+2030-02-01T17:20:00
+2031-02-01T17:20:00
+2032-02-01T17:20:00
+2033-02-01T17:20:00
+2034-02-01T17:20:00
+2035-02-01T17:20:00
+2036-02-01T17:20:00
+2037-02-01T17:20:00
+2038-02-01T17:20:00
+2039-02-01T17:20:00
+2040-02-01T17:20:00
+2041-02-01T17:20:00
+2042-02-01T17:20:00
+2043-02-01T17:20:00
+2044-02-01T17:20:00
+2045-02-01T17:20:00
+2046-02-01T17:20:00
+2047-02-01T17:20:00
+2048-02-01T17:20:00
+2049-02-01T17:20:00
+2050-02-01T17:20:00
+2051-02-01T17:20:00
+2052-02-01T17:20:00
+2053-02-01T17:20:00
+2054-02-01T17:20:00
+2055-02-01T17:20:00
+2056-02-01T17:20:00
+2057-02-01T17:20:00
+2058-02-01T17:20:00
+2059-02-01T17:20:00
+2060-02-01T17:20:00
+2061-02-01T17:20:00
+2062-02-01T17:20:00
+2063-02-01T17:20:00
+2064-02-01T17:20:00
+2065-02-01T17:20:00
+2066-02-01T17:20:00
+2067-02-01T17:20:00
+2068-02-01T17:20:00
+2069-02-01T17:20:00
+2070-02-01T17:20:00
+2071-02-01T17:20:00
+2072-02-01T17:20:00
+2073-02-01T17:20:00
+2074-02-01T17:20:00
+2075-02-01T17:20:00
+2076-02-01T17:20:00
+2077-02-01T17:20:00
+2078-02-01T17:20:00
+2079-02-01T17:20:00
+2080-02-01T17:20:00
+2081-02-01T17:20:00
+2082-02-01T17:20:00
+2083-02-01T17:20:00
+2084-02-01T17:20:00
+2085-02-01T17:20:00
+2086-02-01T17:20:00
+2087-02-01T17:20:00
+2088-02-01T17:20:00
+2089-02-01T17:20:00
+2090-02-01T17:20:00
+2091-02-01T17:20:00
+2092-02-01T17:20:00
+2093-02-01T17:20:00
+2094-02-01T17:20:00
+2095-02-01T17:20:00
+2096-02-01T17:20:00
+2097-02-01T17:20:00
+2098-02-01T17:20:00
+2099-02-01T17:20:00
+2100-02-01T17:20:00
+2101-02-01T17:20:00
+2102-02-01T17:20:00
+2103-02-01T17:20:00
+2104-02-01T17:20:00
+2105-02-01T17:20:00
+2106-02-01T17:20:00
+2107-02-01T17:20:00
+2108-02-01T17:20:00
+2109-02-01T17:20:00
+2110-02-01T17:20:00
+2111-02-01T17:20:00
+2112-02-01T17:20:00
+2113-02-01T17:20:00
+2114-02-01T17:20:00
+2115-02-01T17:20:00
+2116-02-01T17:20:00
+2117-02-01T17:20:00
+2118-02-01T17:20:00
+2119-02-01T17:20:00
+2120-02-01T17:20:00
+2121-02-01T17:20:00
+2122-02-01T17:20:00
+2123-02-01T17:20:00
+2124-02-01T17:20:00
+2125-02-01T17:20:00
+2126-02-01T17:20:00
+2127-02-01T17:20:00
+2128-02-01T17:20:00
+2129-02-01T17:20:00
+2130-02-01T17:20:00
+2131-02-01T17:20:00
+2132-02-01T17:20:00
+2133-02-01T17:20:00
+2134-02-01T17:20:00
+2135-02-01T17:20:00
+2136-02-01T17:20:00
+2137-02-01T17:20:00
+2138-02-01T17:20:00
+2139-02-01T17:20:00
+2140-02-01T17:20:00
+2141-02-01T17:20:00
+2142-02-01T17:20:00
+2143-02-01T17:20:00
+2144-02-01T17:20:00
+2145-02-01T17:20:00
+2146-02-01T17:20:00
+2147-02-01T17:20:00
+2148-02-01T17:20:00
+2149-02-01T17:20:00
+2150-02-01T17:20:00
+2151-02-01T17:20:00
+2152-02-01T17:20:00
+2153-02-01T17:20:00
+2154-02-01T17:20:00
+2155-02-01T17:20:00
+2156-02-01T17:20:00
+2157-02-01T17:20:00
+2158-02-01T17:20:00
+2159-02-01T17:20:00
+2160-02-01T17:20:00
+2161-02-01T17:20:00
+2162-02-01T17:20:00
+2163-02-01T17:20:00
+2164-02-01T17:20:00
+2165-02-01T17:20:00
+2166-02-01T17:20:00
+2167-02-01T17:20:00
+2168-02-01T17:20:00
+2169-02-01T17:20:00
+2170-02-01T17:20:00
+2171-02-01T17:20:00
+2172-02-01T17:20:00
+2173-02-01T17:20:00
+2174-02-01T17:20:00
+2175-02-01T17:20:00
+2176-02-01T17:20:00
+2177-02-01T17:20:00
+2178-02-01T17:20:00
+2179-02-01T17:20:00
+2180-02-01T17:20:00
+2181-02-01T17:20:00
+2182-02-01T17:20:00
+2183-02-01T17:20:00
+2184-02-01T17:20:00
+2185-02-01T17:20:00
+2186-02-01T17:20:00
+2187-02-01T17:20:00
+2188-02-01T17:20:00
+2189-02-01T17:20:00
+2190-02-01T17:20:00
+2191-02-01T17:20:00
+2192-02-01T17:20:00
+2193-02-01T17:20:00
+2194-02-01T17:20:00
+2195-02-01T17:20:00
+2196-02-01T17:20:00
+2197-02-01T17:20:00
+2198-02-01T17:20:00
+2199-02-01T17:20:00
+2200-02-01T17:20:00
+2201-02-01T17:20:00
+2202-02-01T17:20:00
+2203-02-01T17:20:00
+2204-02-01T17:20:00
+2205-02-01T17:20:00
+2206-02-01T17:20:00
+2207-02-01T17:20:00
+2208-02-01T17:20:00
+2209-02-01T17:20:00
+2210-02-01T17:20:00
+2211-02-01T17:20:00
+2212-02-01T17:20:00
+2213-02-01T17:20:00
+2214-02-01T17:20:00
+2215-02-01T17:20:00
+2216-02-01T17:20:00
+2217-02-01T17:20:00
+2218-02-01T17:20:00
+2219-02-01T17:20:00
+2220-02-01T17:20:00
+2221-02-01T17:20:00
+2222-02-01T17:20:00
+2223-02-01T17:20:00
+2224-02-01T17:20:00
+2225-02-01T17:20:00
+2226-02-01T17:20:00
+2227-02-01T17:20:00
+2228-02-01T17:20:00
+2229-02-01T17:20:00
+2230-02-01T17:20:00
+2231-02-01T17:20:00
+2232-02-01T17:20:00
+2233-02-01T17:20:00
+2234-02-01T17:20:00
+2235-02-01T17:20:00
+2236-02-01T17:20:00
+2237-02-01T17:20:00
+2238-02-01T17:20:00
+2239-02-01T17:20:00
+2240-02-01T17:20:00
+2241-02-01T17:20:00
+2242-02-01T17:20:00
+2243-02-01T17:20:00
+2244-02-01T17:20:00
+2245-02-01T17:20:00
+2246-02-01T17:20:00
+2247-02-01T17:20:00
+2248-02-01T17:20:00
+2249-02-01T17:20:00
+2250-02-01T17:20:00
+2251-02-01T17:20:00
+2252-02-01T17:20:00
+2253-02-01T17:20:00
+2254-02-01T17:20:00
+2255-02-01T17:20:00
+2256-02-01T17:20:00
+2257-02-01T17:20:00
+2258-02-01T17:20:00
+2259-02-01T17:20:00
+2260-02-01T17:20:00
+2261-02-01T17:20:00
+2262-02-01T17:20:00
+2263-02-01T17:20:00
+2264-02-01T17:20:00
+2265-02-01T17:20:00
+2266-02-01T17:20:00
+2267-02-01T17:20:00
+2268-02-01T17:20:00
+2269-02-01T17:20:00
+2270-02-01T17:20:00
+2271-02-01T17:20:00
+2272-02-01T17:20:00
+2273-02-01T17:20:00
+2274-02-01T17:20:00
+2275-02-01T17:20:00
+2276-02-01T17:20:00
+2277-02-01T17:20:00
+2278-02-01T17:20:00
+2279-02-01T17:20:00
+2280-02-01T17:20:00
+2281-02-01T17:20:00
+2282-02-01T17:20:00
+2283-02-01T17:20:00
+2284-02-01T17:20:00
+2285-02-01T17:20:00
+2286-02-01T17:20:00
+2287-02-01T17:20:00
+2288-02-01T17:20:00
+2289-02-01T17:20:00
+2290-02-01T17:20:00
+2291-02-01T17:20:00
+2292-02-01T17:20:00
+2293-02-01T17:20:00
+2294-02-01T17:20:00
+2295-02-01T17:20:00
+2296-02-01T17:20:00
+2297-02-01T17:20:00
+2298-02-01T17:20:00
+2299-02-01T17:20:00
+2300-02-01T17:20:00
+2301-02-01T17:20:00
+2302-02-01T17:20:00
+2303-02-01T17:20:00
+2304-02-01T17:20:00
+2305-02-01T17:20:00
+2306-02-01T17:20:00
+2307-02-01T17:20:00
+2308-02-01T17:20:00
+2309-02-01T17:20:00
+2310-02-01T17:20:00
+2311-02-01T17:20:00
+2312-02-01T17:20:00
+2313-02-01T17:20:00
+2314-02-01T17:20:00
+2315-02-01T17:20:00
+2316-02-01T17:20:00
+2317-02-01T17:20:00
+2318-02-01T17:20:00
+2319-02-01T17:20:00
+2320-02-01T17:20:00
+2321-02-01T17:20:00
+2322-02-01T17:20:00
+2323-02-01T17:20:00
+2324-02-01T17:20:00
+2325-02-01T17:20:00
+2326-02-01T17:20:00
+2327-02-01T17:20:00
+2328-02-01T17:20:00
+2329-02-01T17:20:00
+2330-02-01T17:20:00
+2331-02-01T17:20:00
+2332-02-01T17:20:00
+2333-02-01T17:20:00
+2334-02-01T17:20:00
+2335-02-01T17:20:00
+2336-02-01T17:20:00
+2337-02-01T17:20:00
+2338-02-01T17:20:00
+2339-02-01T17:20:00
+2340-02-01T17:20:00
+2341-02-01T17:20:00
+2342-02-01T17:20:00
+2343-02-01T17:20:00
+2344-02-01T17:20:00
+2345-02-01T17:20:00
+2346-02-01T17:20:00
+2347-02-01T17:20:00
+2348-02-01T17:20:00
+2349-02-01T17:20:00
+2350-02-01T17:20:00
+2351-02-01T17:20:00
+2352-02-01T17:20:00
+2353-02-01T17:20:00
+2354-02-01T17:20:00
+2355-02-01T17:20:00
+2356-02-01T17:20:00
+2357-02-01T17:20:00
+2358-02-01T17:20:00
+2359-02-01T17:20:00
+2360-02-01T17:20:00
+2361-02-01T17:20:00
+2362-02-01T17:20:00
+2363-02-01T17:20:00
+2364-02-01T17:20:00
+2365-02-01T17:20:00
+2366-02-01T17:20:00
+2367-02-01T17:20:00
+2368-02-01T17:20:00
+2369-02-01T17:20:00
+2370-02-01T17:20:00
+2371-02-01T17:20:00
+2372-02-01T17:20:00
+2373-02-01T17:20:00
+2374-02-01T17:20:00
+2375-02-01T17:20:00
+2376-02-01T17:20:00
+2377-02-01T17:20:00
+2378-02-01T17:20:00
+2379-02-01T17:20:00
+2380-02-01T17:20:00
+2381-02-01T17:20:00
+2382-02-01T17:20:00
+2383-02-01T17:20:00
+2384-02-01T17:20:00
+2385-02-01T17:20:00
+2386-02-01T17:20:00
+2387-02-01T17:20:00
+2388-02-01T17:20:00
+2389-02-01T17:20:00
+2390-02-01T17:20:00
+2391-02-01T17:20:00
+2392-02-01T17:20:00
+2393-02-01T17:20:00
+2394-02-01T17:20:00
+2395-02-01T17:20:00
+2396-02-01T17:20:00
+2397-02-01T17:20:00
+2398-02-01T17:20:00
+2399-02-01T17:20:00
+2400-02-01T17:20:00
+2401-02-01T17:20:00
+2402-02-01T17:20:00
+2403-02-01T17:20:00
+2404-02-01T17:20:00
+2405-02-01T17:20:00
+2406-02-01T17:20:00
+2407-02-01T17:20:00
+2408-02-01T17:20:00
+2409-02-01T17:20:00
+2410-02-01T17:20:00
+2411-02-01T17:20:00
+2412-02-01T17:20:00
+2413-02-01T17:20:00
+2414-02-01T17:20:00
+2415-02-01T17:20:00
+2416-02-01T17:20:00
+2417-02-01T17:20:00
+2418-02-01T17:20:00
+2419-02-01T17:20:00
+2420-02-01T17:20:00
+2421-02-01T17:20:00
+2422-02-01T17:20:00
+2423-02-01T17:20:00
+2424-02-01T17:20:00
+2425-02-01T17:20:00
+2426-02-01T17:20:00
+2427-02-01T17:20:00
+2428-02-01T17:20:00
+2429-02-01T17:20:00
+2430-02-01T17:20:00
+2431-02-01T17:20:00
+2432-02-01T17:20:00
+2433-02-01T17:20:00
+2434-02-01T17:20:00
+2435-02-01T17:20:00
+2436-02-01T17:20:00
+2437-02-01T17:20:00
+2438-02-01T17:20:00
+2439-02-01T17:20:00
+2440-02-01T17:20:00
+2441-02-01T17:20:00
+2442-02-01T17:20:00
+2443-02-01T17:20:00
+2444-02-01T17:20:00
+2445-02-01T17:20:00
+2446-02-01T17:20:00
+2447-02-01T17:20:00
+2448-02-01T17:20:00
+2449-02-01T17:20:00
+2450-02-01T17:20:00
+2451-02-01T17:20:00
+2452-02-01T17:20:00
+2453-02-01T17:20:00
+2454-02-01T17:20:00
+2455-02-01T17:20:00
+2456-02-01T17:20:00
+2457-02-01T17:20:00
+2458-02-01T17:20:00
+2459-02-01T17:20:00
+2460-02-01T17:20:00
+2461-02-01T17:20:00
+2462-02-01T17:20:00
+2463-02-01T17:20:00
+2464-02-01T17:20:00
+2465-02-01T17:20:00
+2466-02-01T17:20:00
+2467-02-01T17:20:00
+2468-02-01T17:20:00
+2469-02-01T17:20:00
+2470-02-01T17:20:00
+2471-02-01T17:20:00
+2472-02-01T17:20:00
+2473-02-01T17:20:00
+2474-02-01T17:20:00
+2475-02-01T17:20:00
+2476-02-01T17:20:00
+2477-02-01T17:20:00
+2478-02-01T17:20:00
+2479-02-01T17:20:00
+2480-02-01T17:20:00
+2481-02-01T17:20:00
+2482-02-01T17:20:00
+2483-02-01T17:20:00
+2484-02-01T17:20:00
+2485-02-01T17:20:00
+2486-02-01T17:20:00
+2487-02-01T17:20:00
+2488-02-01T17:20:00
+2489-02-01T17:20:00
+2490-02-01T17:20:00
+2491-02-01T17:20:00
+2492-02-01T17:20:00
+2493-02-01T17:20:00
+2494-02-01T17:20:00
+2495-02-01T17:20:00
+2496-02-01T17:20:00
+2497-02-01T17:20:00
+2498-02-01T17:20:00
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase03.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase03.ics.prev.ref
new file mode 100644
index 00000000..fa36e552
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase03.ics.prev.ref
@@ -0,0 +1,15 @@
+2010-02-01T17:20:00
+2009-02-01T17:20:00
+2008-02-01T17:20:00
+2007-02-01T17:20:00
+2006-02-01T17:20:00
+2005-02-01T17:20:00
+2004-02-01T17:20:00
+2003-02-01T17:20:00
+2002-02-01T17:20:00
+2001-02-01T17:20:00
+2000-02-01T17:20:00
+1999-02-01T17:20:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase03.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase03.ics.recurson.ref
new file mode 100644
index 00000000..b683cd9d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase03.ics.recurson.ref
@@ -0,0 +1,12 @@
+1999-02-01
+2000-02-01
+2001-02-01
+2002-02-01
+2003-02-01
+2004-02-01
+2005-02-01
+2006-02-01
+2007-02-01
+2008-02-01
+2009-02-01
+2010-02-01
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase04.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase04.ics
new file mode 100644
index 00000000..c69b7aae
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase04.ics
@@ -0,0 +1,13 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Monday of week number 20 (where the default start of the week is Monday)\,
+ forever:
+DTSTART;TZID=America/Los_Angeles:19970512T090000
+RRULE:FREQ=YEARLY;INTERVAL=1;COUNT=10;BYDAY=MO;BYWEEKNO=20
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase04.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase04.ics.next.ref
new file mode 100644
index 00000000..39486f12
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase04.ics.next.ref
@@ -0,0 +1,13 @@
+1997-05-12T09:00:00
+1998-05-11T09:00:00
+1999-05-17T09:00:00
+2000-05-15T09:00:00
+2001-05-14T09:00:00
+2002-05-13T09:00:00
+2003-05-12T09:00:00
+2004-05-10T09:00:00
+2005-05-16T09:00:00
+2006-05-15T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase04.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase04.ics.prev.ref
new file mode 100644
index 00000000..e8c7fd74
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase04.ics.prev.ref
@@ -0,0 +1,13 @@
+2006-05-15T09:00:00
+2005-05-16T09:00:00
+2004-05-10T09:00:00
+2003-05-12T09:00:00
+2002-05-13T09:00:00
+2001-05-14T09:00:00
+2000-05-15T09:00:00
+1999-05-17T09:00:00
+1998-05-11T09:00:00
+1997-05-12T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase04.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase04.ics.recurson.ref
new file mode 100644
index 00000000..3959a509
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase04.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-05-12
+1998-05-11
+1999-05-17
+2000-05-15
+2001-05-14
+2002-05-13
+2003-05-12
+2004-05-10
+2005-05-16
+2006-05-15
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase05.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase05.ics
new file mode 100644
index 00000000..850c4a77
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase05.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION: Once a Year
+DTSTART;TZID=America/Los_Angeles:20010205T090000
+RRULE:FREQ=YEARLY;INTERVAL=1
+X-EXPECT-NUMEVENTS: 37
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase05.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase05.ics.next.ref
new file mode 100644
index 00000000..52a97be8
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase05.ics.next.ref
@@ -0,0 +1,502 @@
+2001-02-05T09:00:00
+2002-02-05T09:00:00
+2003-02-05T09:00:00
+2004-02-05T09:00:00
+2005-02-05T09:00:00
+2006-02-05T09:00:00
+2007-02-05T09:00:00
+2008-02-05T09:00:00
+2009-02-05T09:00:00
+2010-02-05T09:00:00
+2011-02-05T09:00:00
+2012-02-05T09:00:00
+2013-02-05T09:00:00
+2014-02-05T09:00:00
+2015-02-05T09:00:00
+2016-02-05T09:00:00
+2017-02-05T09:00:00
+2018-02-05T09:00:00
+2019-02-05T09:00:00
+2020-02-05T09:00:00
+2021-02-05T09:00:00
+2022-02-05T09:00:00
+2023-02-05T09:00:00
+2024-02-05T09:00:00
+2025-02-05T09:00:00
+2026-02-05T09:00:00
+2027-02-05T09:00:00
+2028-02-05T09:00:00
+2029-02-05T09:00:00
+2030-02-05T09:00:00
+2031-02-05T09:00:00
+2032-02-05T09:00:00
+2033-02-05T09:00:00
+2034-02-05T09:00:00
+2035-02-05T09:00:00
+2036-02-05T09:00:00
+2037-02-05T09:00:00
+2038-02-05T09:00:00
+2039-02-05T09:00:00
+2040-02-05T09:00:00
+2041-02-05T09:00:00
+2042-02-05T09:00:00
+2043-02-05T09:00:00
+2044-02-05T09:00:00
+2045-02-05T09:00:00
+2046-02-05T09:00:00
+2047-02-05T09:00:00
+2048-02-05T09:00:00
+2049-02-05T09:00:00
+2050-02-05T09:00:00
+2051-02-05T09:00:00
+2052-02-05T09:00:00
+2053-02-05T09:00:00
+2054-02-05T09:00:00
+2055-02-05T09:00:00
+2056-02-05T09:00:00
+2057-02-05T09:00:00
+2058-02-05T09:00:00
+2059-02-05T09:00:00
+2060-02-05T09:00:00
+2061-02-05T09:00:00
+2062-02-05T09:00:00
+2063-02-05T09:00:00
+2064-02-05T09:00:00
+2065-02-05T09:00:00
+2066-02-05T09:00:00
+2067-02-05T09:00:00
+2068-02-05T09:00:00
+2069-02-05T09:00:00
+2070-02-05T09:00:00
+2071-02-05T09:00:00
+2072-02-05T09:00:00
+2073-02-05T09:00:00
+2074-02-05T09:00:00
+2075-02-05T09:00:00
+2076-02-05T09:00:00
+2077-02-05T09:00:00
+2078-02-05T09:00:00
+2079-02-05T09:00:00
+2080-02-05T09:00:00
+2081-02-05T09:00:00
+2082-02-05T09:00:00
+2083-02-05T09:00:00
+2084-02-05T09:00:00
+2085-02-05T09:00:00
+2086-02-05T09:00:00
+2087-02-05T09:00:00
+2088-02-05T09:00:00
+2089-02-05T09:00:00
+2090-02-05T09:00:00
+2091-02-05T09:00:00
+2092-02-05T09:00:00
+2093-02-05T09:00:00
+2094-02-05T09:00:00
+2095-02-05T09:00:00
+2096-02-05T09:00:00
+2097-02-05T09:00:00
+2098-02-05T09:00:00
+2099-02-05T09:00:00
+2100-02-05T09:00:00
+2101-02-05T09:00:00
+2102-02-05T09:00:00
+2103-02-05T09:00:00
+2104-02-05T09:00:00
+2105-02-05T09:00:00
+2106-02-05T09:00:00
+2107-02-05T09:00:00
+2108-02-05T09:00:00
+2109-02-05T09:00:00
+2110-02-05T09:00:00
+2111-02-05T09:00:00
+2112-02-05T09:00:00
+2113-02-05T09:00:00
+2114-02-05T09:00:00
+2115-02-05T09:00:00
+2116-02-05T09:00:00
+2117-02-05T09:00:00
+2118-02-05T09:00:00
+2119-02-05T09:00:00
+2120-02-05T09:00:00
+2121-02-05T09:00:00
+2122-02-05T09:00:00
+2123-02-05T09:00:00
+2124-02-05T09:00:00
+2125-02-05T09:00:00
+2126-02-05T09:00:00
+2127-02-05T09:00:00
+2128-02-05T09:00:00
+2129-02-05T09:00:00
+2130-02-05T09:00:00
+2131-02-05T09:00:00
+2132-02-05T09:00:00
+2133-02-05T09:00:00
+2134-02-05T09:00:00
+2135-02-05T09:00:00
+2136-02-05T09:00:00
+2137-02-05T09:00:00
+2138-02-05T09:00:00
+2139-02-05T09:00:00
+2140-02-05T09:00:00
+2141-02-05T09:00:00
+2142-02-05T09:00:00
+2143-02-05T09:00:00
+2144-02-05T09:00:00
+2145-02-05T09:00:00
+2146-02-05T09:00:00
+2147-02-05T09:00:00
+2148-02-05T09:00:00
+2149-02-05T09:00:00
+2150-02-05T09:00:00
+2151-02-05T09:00:00
+2152-02-05T09:00:00
+2153-02-05T09:00:00
+2154-02-05T09:00:00
+2155-02-05T09:00:00
+2156-02-05T09:00:00
+2157-02-05T09:00:00
+2158-02-05T09:00:00
+2159-02-05T09:00:00
+2160-02-05T09:00:00
+2161-02-05T09:00:00
+2162-02-05T09:00:00
+2163-02-05T09:00:00
+2164-02-05T09:00:00
+2165-02-05T09:00:00
+2166-02-05T09:00:00
+2167-02-05T09:00:00
+2168-02-05T09:00:00
+2169-02-05T09:00:00
+2170-02-05T09:00:00
+2171-02-05T09:00:00
+2172-02-05T09:00:00
+2173-02-05T09:00:00
+2174-02-05T09:00:00
+2175-02-05T09:00:00
+2176-02-05T09:00:00
+2177-02-05T09:00:00
+2178-02-05T09:00:00
+2179-02-05T09:00:00
+2180-02-05T09:00:00
+2181-02-05T09:00:00
+2182-02-05T09:00:00
+2183-02-05T09:00:00
+2184-02-05T09:00:00
+2185-02-05T09:00:00
+2186-02-05T09:00:00
+2187-02-05T09:00:00
+2188-02-05T09:00:00
+2189-02-05T09:00:00
+2190-02-05T09:00:00
+2191-02-05T09:00:00
+2192-02-05T09:00:00
+2193-02-05T09:00:00
+2194-02-05T09:00:00
+2195-02-05T09:00:00
+2196-02-05T09:00:00
+2197-02-05T09:00:00
+2198-02-05T09:00:00
+2199-02-05T09:00:00
+2200-02-05T09:00:00
+2201-02-05T09:00:00
+2202-02-05T09:00:00
+2203-02-05T09:00:00
+2204-02-05T09:00:00
+2205-02-05T09:00:00
+2206-02-05T09:00:00
+2207-02-05T09:00:00
+2208-02-05T09:00:00
+2209-02-05T09:00:00
+2210-02-05T09:00:00
+2211-02-05T09:00:00
+2212-02-05T09:00:00
+2213-02-05T09:00:00
+2214-02-05T09:00:00
+2215-02-05T09:00:00
+2216-02-05T09:00:00
+2217-02-05T09:00:00
+2218-02-05T09:00:00
+2219-02-05T09:00:00
+2220-02-05T09:00:00
+2221-02-05T09:00:00
+2222-02-05T09:00:00
+2223-02-05T09:00:00
+2224-02-05T09:00:00
+2225-02-05T09:00:00
+2226-02-05T09:00:00
+2227-02-05T09:00:00
+2228-02-05T09:00:00
+2229-02-05T09:00:00
+2230-02-05T09:00:00
+2231-02-05T09:00:00
+2232-02-05T09:00:00
+2233-02-05T09:00:00
+2234-02-05T09:00:00
+2235-02-05T09:00:00
+2236-02-05T09:00:00
+2237-02-05T09:00:00
+2238-02-05T09:00:00
+2239-02-05T09:00:00
+2240-02-05T09:00:00
+2241-02-05T09:00:00
+2242-02-05T09:00:00
+2243-02-05T09:00:00
+2244-02-05T09:00:00
+2245-02-05T09:00:00
+2246-02-05T09:00:00
+2247-02-05T09:00:00
+2248-02-05T09:00:00
+2249-02-05T09:00:00
+2250-02-05T09:00:00
+2251-02-05T09:00:00
+2252-02-05T09:00:00
+2253-02-05T09:00:00
+2254-02-05T09:00:00
+2255-02-05T09:00:00
+2256-02-05T09:00:00
+2257-02-05T09:00:00
+2258-02-05T09:00:00
+2259-02-05T09:00:00
+2260-02-05T09:00:00
+2261-02-05T09:00:00
+2262-02-05T09:00:00
+2263-02-05T09:00:00
+2264-02-05T09:00:00
+2265-02-05T09:00:00
+2266-02-05T09:00:00
+2267-02-05T09:00:00
+2268-02-05T09:00:00
+2269-02-05T09:00:00
+2270-02-05T09:00:00
+2271-02-05T09:00:00
+2272-02-05T09:00:00
+2273-02-05T09:00:00
+2274-02-05T09:00:00
+2275-02-05T09:00:00
+2276-02-05T09:00:00
+2277-02-05T09:00:00
+2278-02-05T09:00:00
+2279-02-05T09:00:00
+2280-02-05T09:00:00
+2281-02-05T09:00:00
+2282-02-05T09:00:00
+2283-02-05T09:00:00
+2284-02-05T09:00:00
+2285-02-05T09:00:00
+2286-02-05T09:00:00
+2287-02-05T09:00:00
+2288-02-05T09:00:00
+2289-02-05T09:00:00
+2290-02-05T09:00:00
+2291-02-05T09:00:00
+2292-02-05T09:00:00
+2293-02-05T09:00:00
+2294-02-05T09:00:00
+2295-02-05T09:00:00
+2296-02-05T09:00:00
+2297-02-05T09:00:00
+2298-02-05T09:00:00
+2299-02-05T09:00:00
+2300-02-05T09:00:00
+2301-02-05T09:00:00
+2302-02-05T09:00:00
+2303-02-05T09:00:00
+2304-02-05T09:00:00
+2305-02-05T09:00:00
+2306-02-05T09:00:00
+2307-02-05T09:00:00
+2308-02-05T09:00:00
+2309-02-05T09:00:00
+2310-02-05T09:00:00
+2311-02-05T09:00:00
+2312-02-05T09:00:00
+2313-02-05T09:00:00
+2314-02-05T09:00:00
+2315-02-05T09:00:00
+2316-02-05T09:00:00
+2317-02-05T09:00:00
+2318-02-05T09:00:00
+2319-02-05T09:00:00
+2320-02-05T09:00:00
+2321-02-05T09:00:00
+2322-02-05T09:00:00
+2323-02-05T09:00:00
+2324-02-05T09:00:00
+2325-02-05T09:00:00
+2326-02-05T09:00:00
+2327-02-05T09:00:00
+2328-02-05T09:00:00
+2329-02-05T09:00:00
+2330-02-05T09:00:00
+2331-02-05T09:00:00
+2332-02-05T09:00:00
+2333-02-05T09:00:00
+2334-02-05T09:00:00
+2335-02-05T09:00:00
+2336-02-05T09:00:00
+2337-02-05T09:00:00
+2338-02-05T09:00:00
+2339-02-05T09:00:00
+2340-02-05T09:00:00
+2341-02-05T09:00:00
+2342-02-05T09:00:00
+2343-02-05T09:00:00
+2344-02-05T09:00:00
+2345-02-05T09:00:00
+2346-02-05T09:00:00
+2347-02-05T09:00:00
+2348-02-05T09:00:00
+2349-02-05T09:00:00
+2350-02-05T09:00:00
+2351-02-05T09:00:00
+2352-02-05T09:00:00
+2353-02-05T09:00:00
+2354-02-05T09:00:00
+2355-02-05T09:00:00
+2356-02-05T09:00:00
+2357-02-05T09:00:00
+2358-02-05T09:00:00
+2359-02-05T09:00:00
+2360-02-05T09:00:00
+2361-02-05T09:00:00
+2362-02-05T09:00:00
+2363-02-05T09:00:00
+2364-02-05T09:00:00
+2365-02-05T09:00:00
+2366-02-05T09:00:00
+2367-02-05T09:00:00
+2368-02-05T09:00:00
+2369-02-05T09:00:00
+2370-02-05T09:00:00
+2371-02-05T09:00:00
+2372-02-05T09:00:00
+2373-02-05T09:00:00
+2374-02-05T09:00:00
+2375-02-05T09:00:00
+2376-02-05T09:00:00
+2377-02-05T09:00:00
+2378-02-05T09:00:00
+2379-02-05T09:00:00
+2380-02-05T09:00:00
+2381-02-05T09:00:00
+2382-02-05T09:00:00
+2383-02-05T09:00:00
+2384-02-05T09:00:00
+2385-02-05T09:00:00
+2386-02-05T09:00:00
+2387-02-05T09:00:00
+2388-02-05T09:00:00
+2389-02-05T09:00:00
+2390-02-05T09:00:00
+2391-02-05T09:00:00
+2392-02-05T09:00:00
+2393-02-05T09:00:00
+2394-02-05T09:00:00
+2395-02-05T09:00:00
+2396-02-05T09:00:00
+2397-02-05T09:00:00
+2398-02-05T09:00:00
+2399-02-05T09:00:00
+2400-02-05T09:00:00
+2401-02-05T09:00:00
+2402-02-05T09:00:00
+2403-02-05T09:00:00
+2404-02-05T09:00:00
+2405-02-05T09:00:00
+2406-02-05T09:00:00
+2407-02-05T09:00:00
+2408-02-05T09:00:00
+2409-02-05T09:00:00
+2410-02-05T09:00:00
+2411-02-05T09:00:00
+2412-02-05T09:00:00
+2413-02-05T09:00:00
+2414-02-05T09:00:00
+2415-02-05T09:00:00
+2416-02-05T09:00:00
+2417-02-05T09:00:00
+2418-02-05T09:00:00
+2419-02-05T09:00:00
+2420-02-05T09:00:00
+2421-02-05T09:00:00
+2422-02-05T09:00:00
+2423-02-05T09:00:00
+2424-02-05T09:00:00
+2425-02-05T09:00:00
+2426-02-05T09:00:00
+2427-02-05T09:00:00
+2428-02-05T09:00:00
+2429-02-05T09:00:00
+2430-02-05T09:00:00
+2431-02-05T09:00:00
+2432-02-05T09:00:00
+2433-02-05T09:00:00
+2434-02-05T09:00:00
+2435-02-05T09:00:00
+2436-02-05T09:00:00
+2437-02-05T09:00:00
+2438-02-05T09:00:00
+2439-02-05T09:00:00
+2440-02-05T09:00:00
+2441-02-05T09:00:00
+2442-02-05T09:00:00
+2443-02-05T09:00:00
+2444-02-05T09:00:00
+2445-02-05T09:00:00
+2446-02-05T09:00:00
+2447-02-05T09:00:00
+2448-02-05T09:00:00
+2449-02-05T09:00:00
+2450-02-05T09:00:00
+2451-02-05T09:00:00
+2452-02-05T09:00:00
+2453-02-05T09:00:00
+2454-02-05T09:00:00
+2455-02-05T09:00:00
+2456-02-05T09:00:00
+2457-02-05T09:00:00
+2458-02-05T09:00:00
+2459-02-05T09:00:00
+2460-02-05T09:00:00
+2461-02-05T09:00:00
+2462-02-05T09:00:00
+2463-02-05T09:00:00
+2464-02-05T09:00:00
+2465-02-05T09:00:00
+2466-02-05T09:00:00
+2467-02-05T09:00:00
+2468-02-05T09:00:00
+2469-02-05T09:00:00
+2470-02-05T09:00:00
+2471-02-05T09:00:00
+2472-02-05T09:00:00
+2473-02-05T09:00:00
+2474-02-05T09:00:00
+2475-02-05T09:00:00
+2476-02-05T09:00:00
+2477-02-05T09:00:00
+2478-02-05T09:00:00
+2479-02-05T09:00:00
+2480-02-05T09:00:00
+2481-02-05T09:00:00
+2482-02-05T09:00:00
+2483-02-05T09:00:00
+2484-02-05T09:00:00
+2485-02-05T09:00:00
+2486-02-05T09:00:00
+2487-02-05T09:00:00
+2488-02-05T09:00:00
+2489-02-05T09:00:00
+2490-02-05T09:00:00
+2491-02-05T09:00:00
+2492-02-05T09:00:00
+2493-02-05T09:00:00
+2494-02-05T09:00:00
+2495-02-05T09:00:00
+2496-02-05T09:00:00
+2497-02-05T09:00:00
+2498-02-05T09:00:00
+2499-02-05T09:00:00
+2500-02-05T09:00:00
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase05.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase05.ics.prev.ref
new file mode 100644
index 00000000..95241913
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase05.ics.prev.ref
@@ -0,0 +1,11 @@
+2010-02-05T09:00:00
+2009-02-05T09:00:00
+2008-02-05T09:00:00
+2007-02-05T09:00:00
+2006-02-05T09:00:00
+2005-02-05T09:00:00
+2004-02-05T09:00:00
+2003-02-05T09:00:00
+2002-02-05T09:00:00
+2001-02-05T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase05.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase05.ics.recurson.ref
new file mode 100644
index 00000000..11f30404
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase05.ics.recurson.ref
@@ -0,0 +1,10 @@
+2001-02-05
+2002-02-05
+2003-02-05
+2004-02-05
+2005-02-05
+2006-02-05
+2007-02-05
+2008-02-05
+2009-02-05
+2010-02-05
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase06.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase06.ics
new file mode 100644
index 00000000..74d37f60
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase06.ics
@@ -0,0 +1,13 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Recur every sunday and tuesday
+RRULE:FREQ=WEEKLY;COUNT=10;INTERVAL=1;BYDAY=SU,TU
+DTSTART:20011216T192500
+DTEND:20011216T202500
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase06.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase06.ics.next.ref
new file mode 100644
index 00000000..0abed481
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase06.ics.next.ref
@@ -0,0 +1,13 @@
+2001-12-16T19:25:00
+2001-12-18T19:25:00
+2001-12-23T19:25:00
+2001-12-25T19:25:00
+2001-12-30T19:25:00
+2002-01-01T19:25:00
+2002-01-06T19:25:00
+2002-01-08T19:25:00
+2002-01-13T19:25:00
+2002-01-15T19:25:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase06.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase06.ics.prev.ref
new file mode 100644
index 00000000..5caf88d3
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase06.ics.prev.ref
@@ -0,0 +1,13 @@
+2002-01-15T19:25:00
+2002-01-13T19:25:00
+2002-01-08T19:25:00
+2002-01-06T19:25:00
+2002-01-01T19:25:00
+2001-12-30T19:25:00
+2001-12-25T19:25:00
+2001-12-23T19:25:00
+2001-12-18T19:25:00
+2001-12-16T19:25:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase06.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase06.ics.recurson.ref
new file mode 100644
index 00000000..93b20aca
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase06.ics.recurson.ref
@@ -0,0 +1,11 @@
+2001-12-16
+2001-12-18
+2001-12-23
+2001-12-25
+2001-12-30
+2002-01-01
+2002-01-06
+2002-01-08
+2002-01-13
+2002-01-15
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase07.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase07.ics
new file mode 100644
index 00000000..15d93705
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase07.ics
@@ -0,0 +1,13 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Every first tuesday of the month
+RRULE:FREQ=MONTHLY;INTERVAL=1;COUNT=3;BYDAY=1TU
+DTSTART:20011204T153500
+DTEND:20011204T163500
+X-EXPECT-NUMEVENTS: 3
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase07.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase07.ics.next.ref
new file mode 100644
index 00000000..9a655647
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase07.ics.next.ref
@@ -0,0 +1,6 @@
+2001-12-04T15:35:00
+2002-01-01T15:35:00
+2002-02-05T15:35:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase07.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase07.ics.prev.ref
new file mode 100644
index 00000000..ba0f1078
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase07.ics.prev.ref
@@ -0,0 +1,6 @@
+2002-02-05T15:35:00
+2002-01-01T15:35:00
+2001-12-04T15:35:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase07.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase07.ics.recurson.ref
new file mode 100644
index 00000000..c848b613
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase07.ics.recurson.ref
@@ -0,0 +1,4 @@
+2001-12-04
+2002-01-01
+2002-02-05
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase08.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase08.ics
new file mode 100644
index 00000000..29022df9
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase08.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Daily for 10 occurrences:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=DAILY;COUNT=10;INTERVAL=1
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase08.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase08.ics.next.ref
new file mode 100644
index 00000000..cc480a40
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase08.ics.next.ref
@@ -0,0 +1,13 @@
+1997-09-02T09:00:00
+1997-09-03T09:00:00
+1997-09-04T09:00:00
+1997-09-05T09:00:00
+1997-09-06T09:00:00
+1997-09-07T09:00:00
+1997-09-08T09:00:00
+1997-09-09T09:00:00
+1997-09-10T09:00:00
+1997-09-11T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase08.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase08.ics.prev.ref
new file mode 100644
index 00000000..1fbaacd5
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase08.ics.prev.ref
@@ -0,0 +1,13 @@
+1997-09-11T09:00:00
+1997-09-10T09:00:00
+1997-09-09T09:00:00
+1997-09-08T09:00:00
+1997-09-07T09:00:00
+1997-09-06T09:00:00
+1997-09-05T09:00:00
+1997-09-04T09:00:00
+1997-09-03T09:00:00
+1997-09-02T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase08.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase08.ics.recurson.ref
new file mode 100644
index 00000000..00bc3412
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase08.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-09-02
+1997-09-03
+1997-09-04
+1997-09-05
+1997-09-06
+1997-09-07
+1997-09-08
+1997-09-09
+1997-09-10
+1997-09-11
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase09.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase09.ics
new file mode 100644
index 00000000..a669a571
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase09.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Daily until December 24\, 1997:
+DTSTART;TZID=America/Los_Angeles:19971215T090000
+RRULE:FREQ=DAILY;UNTIL=19971224T000000Z;INTERVAL=1
+X-EXPECT-NUMEVENTS: 9
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase09.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase09.ics.next.ref
new file mode 100644
index 00000000..1e488bbc
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase09.ics.next.ref
@@ -0,0 +1,12 @@
+1997-12-15T09:00:00
+1997-12-16T09:00:00
+1997-12-17T09:00:00
+1997-12-18T09:00:00
+1997-12-19T09:00:00
+1997-12-20T09:00:00
+1997-12-21T09:00:00
+1997-12-22T09:00:00
+1997-12-23T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase09.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase09.ics.prev.ref
new file mode 100644
index 00000000..76491acb
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase09.ics.prev.ref
@@ -0,0 +1,12 @@
+1997-12-23T09:00:00
+1997-12-22T09:00:00
+1997-12-21T09:00:00
+1997-12-20T09:00:00
+1997-12-19T09:00:00
+1997-12-18T09:00:00
+1997-12-17T09:00:00
+1997-12-16T09:00:00
+1997-12-15T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase09.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase09.ics.recurson.ref
new file mode 100644
index 00000000..cdb2ffa0
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase09.ics.recurson.ref
@@ -0,0 +1,10 @@
+1997-12-15
+1997-12-16
+1997-12-17
+1997-12-18
+1997-12-19
+1997-12-20
+1997-12-21
+1997-12-22
+1997-12-23
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase10.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase10.ics
new file mode 100644
index 00000000..9608e8f0
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase10.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Every other day - 10 times:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=DAILY;COUNT=10;INTERVAL=2
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase10.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase10.ics.next.ref
new file mode 100644
index 00000000..00527f4b
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase10.ics.next.ref
@@ -0,0 +1,13 @@
+1997-09-02T09:00:00
+1997-09-04T09:00:00
+1997-09-06T09:00:00
+1997-09-08T09:00:00
+1997-09-10T09:00:00
+1997-09-12T09:00:00
+1997-09-14T09:00:00
+1997-09-16T09:00:00
+1997-09-18T09:00:00
+1997-09-20T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase10.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase10.ics.prev.ref
new file mode 100644
index 00000000..6216cf40
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase10.ics.prev.ref
@@ -0,0 +1,13 @@
+1997-09-20T09:00:00
+1997-09-18T09:00:00
+1997-09-16T09:00:00
+1997-09-14T09:00:00
+1997-09-12T09:00:00
+1997-09-10T09:00:00
+1997-09-08T09:00:00
+1997-09-06T09:00:00
+1997-09-04T09:00:00
+1997-09-02T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase10.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase10.ics.recurson.ref
new file mode 100644
index 00000000..68e01d0d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase10.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-09-02
+1997-09-04
+1997-09-06
+1997-09-08
+1997-09-10
+1997-09-12
+1997-09-14
+1997-09-16
+1997-09-18
+1997-09-20
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase11.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase11.ics
new file mode 100644
index 00000000..3f5ac89e
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase11.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Every 10 days\, 5 occurrences:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=DAILY;COUNT=5;INTERVAL=10
+X-EXPECT-NUMEVENTS: 5
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase11.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase11.ics.next.ref
new file mode 100644
index 00000000..ad315e9f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase11.ics.next.ref
@@ -0,0 +1,8 @@
+1997-09-02T09:00:00
+1997-09-12T09:00:00
+1997-09-22T09:00:00
+1997-10-02T09:00:00
+1997-10-12T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase11.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase11.ics.prev.ref
new file mode 100644
index 00000000..6497bb66
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase11.ics.prev.ref
@@ -0,0 +1,8 @@
+1997-10-12T09:00:00
+1997-10-02T09:00:00
+1997-09-22T09:00:00
+1997-09-12T09:00:00
+1997-09-02T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase11.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase11.ics.recurson.ref
new file mode 100644
index 00000000..89c9c411
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase11.ics.recurson.ref
@@ -0,0 +1,6 @@
+1997-09-02
+1997-09-12
+1997-09-22
+1997-10-02
+1997-10-12
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase12.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase12.ics
new file mode 100644
index 00000000..29022df9
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase12.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Daily for 10 occurrences:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=DAILY;COUNT=10;INTERVAL=1
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase12.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase12.ics.next.ref
new file mode 100644
index 00000000..cc480a40
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase12.ics.next.ref
@@ -0,0 +1,13 @@
+1997-09-02T09:00:00
+1997-09-03T09:00:00
+1997-09-04T09:00:00
+1997-09-05T09:00:00
+1997-09-06T09:00:00
+1997-09-07T09:00:00
+1997-09-08T09:00:00
+1997-09-09T09:00:00
+1997-09-10T09:00:00
+1997-09-11T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase12.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase12.ics.prev.ref
new file mode 100644
index 00000000..1fbaacd5
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase12.ics.prev.ref
@@ -0,0 +1,13 @@
+1997-09-11T09:00:00
+1997-09-10T09:00:00
+1997-09-09T09:00:00
+1997-09-08T09:00:00
+1997-09-07T09:00:00
+1997-09-06T09:00:00
+1997-09-05T09:00:00
+1997-09-04T09:00:00
+1997-09-03T09:00:00
+1997-09-02T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase12.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase12.ics.recurson.ref
new file mode 100644
index 00000000..00bc3412
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase12.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-09-02
+1997-09-03
+1997-09-04
+1997-09-05
+1997-09-06
+1997-09-07
+1997-09-08
+1997-09-09
+1997-09-10
+1997-09-11
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase15.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase15.ics
new file mode 100644
index 00000000..716cda66
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase15.ics
@@ -0,0 +1,13 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Repeat every tuesday and wednesday starting Tue 2nd April 2002
+RRULE:FREQ=WEEKLY;INTERVAL=1;COUNT=6;BYDAY=TU,WE
+DTSTART:20020402T114500
+DTEND:20020402T124500
+X-EXPECT-NUMEVENTS: 6
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase15.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase15.ics.next.ref
new file mode 100644
index 00000000..6ce39a7d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase15.ics.next.ref
@@ -0,0 +1,9 @@
+2002-04-02T11:45:00
+2002-04-03T11:45:00
+2002-04-09T11:45:00
+2002-04-10T11:45:00
+2002-04-16T11:45:00
+2002-04-17T11:45:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase15.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase15.ics.prev.ref
new file mode 100644
index 00000000..1f5f03e8
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase15.ics.prev.ref
@@ -0,0 +1,9 @@
+2002-04-17T11:45:00
+2002-04-16T11:45:00
+2002-04-10T11:45:00
+2002-04-09T11:45:00
+2002-04-03T11:45:00
+2002-04-02T11:45:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase15.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase15.ics.recurson.ref
new file mode 100644
index 00000000..9b26c166
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase15.ics.recurson.ref
@@ -0,0 +1,7 @@
+2002-04-02
+2002-04-03
+2002-04-09
+2002-04-10
+2002-04-16
+2002-04-17
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase16.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase16.ics
new file mode 100644
index 00000000..d0f0f837
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase16.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:UTC
+
+BEGIN:VEVENT
+DESCRIPTION:Every Day start the first day in January\, except saturday and sunday. This should be up to March.
+RRULE:FREQ=DAILY;COUNT=50;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR
+DTSTART:20020101T090000Z
+X-EXPECT-NUMEVENTS: 50
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase16.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase16.ics.next.ref
new file mode 100644
index 00000000..88cfbc92
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase16.ics.next.ref
@@ -0,0 +1,53 @@
+2002-01-01T09:00:00
+2002-01-02T09:00:00
+2002-01-03T09:00:00
+2002-01-04T09:00:00
+2002-01-07T09:00:00
+2002-01-08T09:00:00
+2002-01-09T09:00:00
+2002-01-10T09:00:00
+2002-01-11T09:00:00
+2002-01-14T09:00:00
+2002-01-15T09:00:00
+2002-01-16T09:00:00
+2002-01-17T09:00:00
+2002-01-18T09:00:00
+2002-01-21T09:00:00
+2002-01-22T09:00:00
+2002-01-23T09:00:00
+2002-01-24T09:00:00
+2002-01-25T09:00:00
+2002-01-28T09:00:00
+2002-01-29T09:00:00
+2002-01-30T09:00:00
+2002-01-31T09:00:00
+2002-02-01T09:00:00
+2002-02-04T09:00:00
+2002-02-05T09:00:00
+2002-02-06T09:00:00
+2002-02-07T09:00:00
+2002-02-08T09:00:00
+2002-02-11T09:00:00
+2002-02-12T09:00:00
+2002-02-13T09:00:00
+2002-02-14T09:00:00
+2002-02-15T09:00:00
+2002-02-18T09:00:00
+2002-02-19T09:00:00
+2002-02-20T09:00:00
+2002-02-21T09:00:00
+2002-02-22T09:00:00
+2002-02-25T09:00:00
+2002-02-26T09:00:00
+2002-02-27T09:00:00
+2002-02-28T09:00:00
+2002-03-01T09:00:00
+2002-03-04T09:00:00
+2002-03-05T09:00:00
+2002-03-06T09:00:00
+2002-03-07T09:00:00
+2002-03-08T09:00:00
+2002-03-11T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase16.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase16.ics.prev.ref
new file mode 100644
index 00000000..dde6bbf5
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase16.ics.prev.ref
@@ -0,0 +1,53 @@
+2002-03-11T09:00:00
+2002-03-08T09:00:00
+2002-03-07T09:00:00
+2002-03-06T09:00:00
+2002-03-05T09:00:00
+2002-03-04T09:00:00
+2002-03-01T09:00:00
+2002-02-28T09:00:00
+2002-02-27T09:00:00
+2002-02-26T09:00:00
+2002-02-25T09:00:00
+2002-02-22T09:00:00
+2002-02-21T09:00:00
+2002-02-20T09:00:00
+2002-02-19T09:00:00
+2002-02-18T09:00:00
+2002-02-15T09:00:00
+2002-02-14T09:00:00
+2002-02-13T09:00:00
+2002-02-12T09:00:00
+2002-02-11T09:00:00
+2002-02-08T09:00:00
+2002-02-07T09:00:00
+2002-02-06T09:00:00
+2002-02-05T09:00:00
+2002-02-04T09:00:00
+2002-02-01T09:00:00
+2002-01-31T09:00:00
+2002-01-30T09:00:00
+2002-01-29T09:00:00
+2002-01-28T09:00:00
+2002-01-25T09:00:00
+2002-01-24T09:00:00
+2002-01-23T09:00:00
+2002-01-22T09:00:00
+2002-01-21T09:00:00
+2002-01-18T09:00:00
+2002-01-17T09:00:00
+2002-01-16T09:00:00
+2002-01-15T09:00:00
+2002-01-14T09:00:00
+2002-01-11T09:00:00
+2002-01-10T09:00:00
+2002-01-09T09:00:00
+2002-01-08T09:00:00
+2002-01-07T09:00:00
+2002-01-04T09:00:00
+2002-01-03T09:00:00
+2002-01-02T09:00:00
+2002-01-01T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase16.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase16.ics.recurson.ref
new file mode 100644
index 00000000..f4de1ebc
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase16.ics.recurson.ref
@@ -0,0 +1,51 @@
+2002-01-01
+2002-01-02
+2002-01-03
+2002-01-04
+2002-01-07
+2002-01-08
+2002-01-09
+2002-01-10
+2002-01-11
+2002-01-14
+2002-01-15
+2002-01-16
+2002-01-17
+2002-01-18
+2002-01-21
+2002-01-22
+2002-01-23
+2002-01-24
+2002-01-25
+2002-01-28
+2002-01-29
+2002-01-30
+2002-01-31
+2002-02-01
+2002-02-04
+2002-02-05
+2002-02-06
+2002-02-07
+2002-02-08
+2002-02-11
+2002-02-12
+2002-02-13
+2002-02-14
+2002-02-15
+2002-02-18
+2002-02-19
+2002-02-20
+2002-02-21
+2002-02-22
+2002-02-25
+2002-02-26
+2002-02-27
+2002-02-28
+2002-03-01
+2002-03-04
+2002-03-05
+2002-03-06
+2002-03-07
+2002-03-08
+2002-03-11
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase17.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase17.ics
new file mode 100644
index 00000000..7ff2fba0
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase17.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:UTC
+
+BEGIN:VEVENT
+DESCRIPTION:Every Day in January\, but only in Tuesday\, Wednesday and Thursday
+RRULE:FREQ=DAILY;UNTIL=20020120T090000Z;INTERVAL=1;BYDAY=TU,WE,TH
+DTSTART:20020101T090000Z
+X-EXPECT-NUMEVENTS: 9
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase17.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase17.ics.next.ref
new file mode 100644
index 00000000..9aa7d892
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase17.ics.next.ref
@@ -0,0 +1,12 @@
+2002-01-01T09:00:00
+2002-01-02T09:00:00
+2002-01-03T09:00:00
+2002-01-08T09:00:00
+2002-01-09T09:00:00
+2002-01-10T09:00:00
+2002-01-15T09:00:00
+2002-01-16T09:00:00
+2002-01-17T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase17.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase17.ics.prev.ref
new file mode 100644
index 00000000..1e49f7b8
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase17.ics.prev.ref
@@ -0,0 +1,12 @@
+2002-01-17T09:00:00
+2002-01-16T09:00:00
+2002-01-15T09:00:00
+2002-01-10T09:00:00
+2002-01-09T09:00:00
+2002-01-08T09:00:00
+2002-01-03T09:00:00
+2002-01-02T09:00:00
+2002-01-01T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase17.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase17.ics.recurson.ref
new file mode 100644
index 00000000..b5d09027
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase17.ics.recurson.ref
@@ -0,0 +1,10 @@
+2002-01-01
+2002-01-02
+2002-01-03
+2002-01-08
+2002-01-09
+2002-01-10
+2002-01-15
+2002-01-16
+2002-01-17
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase18.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase18.ics
new file mode 100644
index 00000000..0d31710a
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase18.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:UTC
+
+BEGIN:VEVENT
+DESCRIPTION:Every Day in January\, except saturday and sunday. This is MS Outlook every weekday case.
+RRULE:FREQ=DAILY;UNTIL=20020120T090000Z;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR;WKST=SU
+DTSTART:20020101T090000Z
+X-EXPECT-NUMEVENTS: 14
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase18.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase18.ics.next.ref
new file mode 100644
index 00000000..b193d078
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase18.ics.next.ref
@@ -0,0 +1,17 @@
+2002-01-01T09:00:00
+2002-01-02T09:00:00
+2002-01-03T09:00:00
+2002-01-04T09:00:00
+2002-01-07T09:00:00
+2002-01-08T09:00:00
+2002-01-09T09:00:00
+2002-01-10T09:00:00
+2002-01-11T09:00:00
+2002-01-14T09:00:00
+2002-01-15T09:00:00
+2002-01-16T09:00:00
+2002-01-17T09:00:00
+2002-01-18T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase18.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase18.ics.prev.ref
new file mode 100644
index 00000000..ae894c0f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase18.ics.prev.ref
@@ -0,0 +1,17 @@
+2002-01-18T09:00:00
+2002-01-17T09:00:00
+2002-01-16T09:00:00
+2002-01-15T09:00:00
+2002-01-14T09:00:00
+2002-01-11T09:00:00
+2002-01-10T09:00:00
+2002-01-09T09:00:00
+2002-01-08T09:00:00
+2002-01-07T09:00:00
+2002-01-04T09:00:00
+2002-01-03T09:00:00
+2002-01-02T09:00:00
+2002-01-01T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase18.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase18.ics.recurson.ref
new file mode 100644
index 00000000..c8c129eb
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase18.ics.recurson.ref
@@ -0,0 +1,15 @@
+2002-01-01
+2002-01-02
+2002-01-03
+2002-01-04
+2002-01-07
+2002-01-08
+2002-01-09
+2002-01-10
+2002-01-11
+2002-01-14
+2002-01-15
+2002-01-16
+2002-01-17
+2002-01-18
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase19.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase19.ics
new file mode 100644
index 00000000..ca5b30dc
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase19.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Weekly for 10 occurrences
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=WEEKLY;COUNT=10;INTERVAL=1
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase19.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase19.ics.next.ref
new file mode 100644
index 00000000..8b7bad6e
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase19.ics.next.ref
@@ -0,0 +1,13 @@
+1997-09-02T09:00:00
+1997-09-09T09:00:00
+1997-09-16T09:00:00
+1997-09-23T09:00:00
+1997-09-30T09:00:00
+1997-10-07T09:00:00
+1997-10-14T09:00:00
+1997-10-21T09:00:00
+1997-10-28T09:00:00
+1997-11-04T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase19.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase19.ics.prev.ref
new file mode 100644
index 00000000..d051f0b9
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase19.ics.prev.ref
@@ -0,0 +1,13 @@
+1997-11-04T09:00:00
+1997-10-28T09:00:00
+1997-10-21T09:00:00
+1997-10-14T09:00:00
+1997-10-07T09:00:00
+1997-09-30T09:00:00
+1997-09-23T09:00:00
+1997-09-16T09:00:00
+1997-09-09T09:00:00
+1997-09-02T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase19.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase19.ics.recurson.ref
new file mode 100644
index 00000000..c7235812
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase19.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-09-02
+1997-09-09
+1997-09-16
+1997-09-23
+1997-09-30
+1997-10-07
+1997-10-14
+1997-10-21
+1997-10-28
+1997-11-04
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase20.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase20.ics
new file mode 100644
index 00000000..542ea47c
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase20.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Weekly until December 24\, 1997
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z;INTERVAL=1
+X-EXPECT-NUMEVENTS: 17
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase20.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase20.ics.next.ref
new file mode 100644
index 00000000..c206a9e2
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase20.ics.next.ref
@@ -0,0 +1,20 @@
+1997-09-02T09:00:00
+1997-09-09T09:00:00
+1997-09-16T09:00:00
+1997-09-23T09:00:00
+1997-09-30T09:00:00
+1997-10-07T09:00:00
+1997-10-14T09:00:00
+1997-10-21T09:00:00
+1997-10-28T09:00:00
+1997-11-04T09:00:00
+1997-11-11T09:00:00
+1997-11-18T09:00:00
+1997-11-25T09:00:00
+1997-12-02T09:00:00
+1997-12-09T09:00:00
+1997-12-16T09:00:00
+1997-12-23T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase20.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase20.ics.prev.ref
new file mode 100644
index 00000000..e65c19d3
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase20.ics.prev.ref
@@ -0,0 +1,20 @@
+1997-12-23T09:00:00
+1997-12-16T09:00:00
+1997-12-09T09:00:00
+1997-12-02T09:00:00
+1997-11-25T09:00:00
+1997-11-18T09:00:00
+1997-11-11T09:00:00
+1997-11-04T09:00:00
+1997-10-28T09:00:00
+1997-10-21T09:00:00
+1997-10-14T09:00:00
+1997-10-07T09:00:00
+1997-09-30T09:00:00
+1997-09-23T09:00:00
+1997-09-16T09:00:00
+1997-09-09T09:00:00
+1997-09-02T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase20.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase20.ics.recurson.ref
new file mode 100644
index 00000000..65a03b29
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase20.ics.recurson.ref
@@ -0,0 +1,18 @@
+1997-09-02
+1997-09-09
+1997-09-16
+1997-09-23
+1997-09-30
+1997-10-07
+1997-10-14
+1997-10-21
+1997-10-28
+1997-11-04
+1997-11-11
+1997-11-18
+1997-11-25
+1997-12-02
+1997-12-09
+1997-12-16
+1997-12-23
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase21.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase21.ics
new file mode 100644
index 00000000..648360ec
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase21.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Every other week - 10 times:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=10
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase21.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase21.ics.next.ref
new file mode 100644
index 00000000..f8a9c5a8
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase21.ics.next.ref
@@ -0,0 +1,13 @@
+1997-09-02T09:00:00
+1997-09-16T09:00:00
+1997-09-30T09:00:00
+1997-10-14T09:00:00
+1997-10-28T09:00:00
+1997-11-11T09:00:00
+1997-11-25T09:00:00
+1997-12-09T09:00:00
+1997-12-23T09:00:00
+1998-01-06T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase21.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase21.ics.prev.ref
new file mode 100644
index 00000000..459d9f81
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase21.ics.prev.ref
@@ -0,0 +1,13 @@
+1998-01-06T09:00:00
+1997-12-23T09:00:00
+1997-12-09T09:00:00
+1997-11-25T09:00:00
+1997-11-11T09:00:00
+1997-10-28T09:00:00
+1997-10-14T09:00:00
+1997-09-30T09:00:00
+1997-09-16T09:00:00
+1997-09-02T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase21.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase21.ics.recurson.ref
new file mode 100644
index 00000000..076499f6
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase21.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-09-02
+1997-09-16
+1997-09-30
+1997-10-14
+1997-10-28
+1997-11-11
+1997-11-25
+1997-12-09
+1997-12-23
+1998-01-06
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase23.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase23.ics
new file mode 100644
index 00000000..e74e6c18
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase23.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Weekly on Tuesday and Thursday for 5 weeks:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=WEEKLY;COUNT=10;INTERVAL=1;BYDAY=TU,TH
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase23.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase23.ics.next.ref
new file mode 100644
index 00000000..b05237db
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase23.ics.next.ref
@@ -0,0 +1,13 @@
+1997-09-02T09:00:00
+1997-09-04T09:00:00
+1997-09-09T09:00:00
+1997-09-11T09:00:00
+1997-09-16T09:00:00
+1997-09-18T09:00:00
+1997-09-23T09:00:00
+1997-09-25T09:00:00
+1997-09-30T09:00:00
+1997-10-02T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase23.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase23.ics.prev.ref
new file mode 100644
index 00000000..f17f5b77
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase23.ics.prev.ref
@@ -0,0 +1,13 @@
+1997-10-02T09:00:00
+1997-09-30T09:00:00
+1997-09-25T09:00:00
+1997-09-23T09:00:00
+1997-09-18T09:00:00
+1997-09-16T09:00:00
+1997-09-11T09:00:00
+1997-09-09T09:00:00
+1997-09-04T09:00:00
+1997-09-02T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase23.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase23.ics.recurson.ref
new file mode 100644
index 00000000..bf2c06ab
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase23.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-09-02
+1997-09-04
+1997-09-09
+1997-09-11
+1997-09-16
+1997-09-18
+1997-09-23
+1997-09-25
+1997-09-30
+1997-10-02
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase24.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase24.ics
new file mode 100644
index 00000000..8a2c5fdb
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase24.ics
@@ -0,0 +1,13 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Every other week on Monday\, Wednesday and Friday until December
+ 24\,1997\, but starting on Tuesday\, September 2\, 1997:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;BYDAY=MO,WE,FR;WKST=SU
+X-EXPECT-NUMEVENTS: 24
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase24.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase24.ics.next.ref
new file mode 100644
index 00000000..736e1ae9
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase24.ics.next.ref
@@ -0,0 +1,28 @@
+1997-09-02T09:00:00
+1997-09-03T09:00:00
+1997-09-05T09:00:00
+1997-09-15T09:00:00
+1997-09-17T09:00:00
+1997-09-19T09:00:00
+1997-09-29T09:00:00
+1997-10-01T09:00:00
+1997-10-03T09:00:00
+1997-10-13T09:00:00
+1997-10-15T09:00:00
+1997-10-17T09:00:00
+1997-10-27T09:00:00
+1997-10-29T09:00:00
+1997-10-31T09:00:00
+1997-11-10T09:00:00
+1997-11-12T09:00:00
+1997-11-14T09:00:00
+1997-11-24T09:00:00
+1997-11-26T09:00:00
+1997-11-28T09:00:00
+1997-12-08T09:00:00
+1997-12-10T09:00:00
+1997-12-12T09:00:00
+1997-12-22T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase24.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase24.ics.prev.ref
new file mode 100644
index 00000000..47c0851c
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase24.ics.prev.ref
@@ -0,0 +1,28 @@
+1997-12-22T09:00:00
+1997-12-12T09:00:00
+1997-12-10T09:00:00
+1997-12-08T09:00:00
+1997-11-28T09:00:00
+1997-11-26T09:00:00
+1997-11-24T09:00:00
+1997-11-14T09:00:00
+1997-11-12T09:00:00
+1997-11-10T09:00:00
+1997-10-31T09:00:00
+1997-10-29T09:00:00
+1997-10-27T09:00:00
+1997-10-17T09:00:00
+1997-10-15T09:00:00
+1997-10-13T09:00:00
+1997-10-03T09:00:00
+1997-10-01T09:00:00
+1997-09-29T09:00:00
+1997-09-19T09:00:00
+1997-09-17T09:00:00
+1997-09-15T09:00:00
+1997-09-05T09:00:00
+1997-09-03T09:00:00
+1997-09-02T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase24.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase24.ics.recurson.ref
new file mode 100644
index 00000000..7abf1e5a
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase24.ics.recurson.ref
@@ -0,0 +1,26 @@
+1997-09-02
+1997-09-03
+1997-09-05
+1997-09-15
+1997-09-17
+1997-09-19
+1997-09-29
+1997-10-01
+1997-10-03
+1997-10-13
+1997-10-15
+1997-10-17
+1997-10-27
+1997-10-29
+1997-10-31
+1997-11-10
+1997-11-12
+1997-11-14
+1997-11-24
+1997-11-26
+1997-11-28
+1997-12-08
+1997-12-10
+1997-12-12
+1997-12-22
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase25.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase25.ics
new file mode 100644
index 00000000..d4c67618
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase25.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Every other week on Tuesday and Thursday\, for 8 occurrences:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=WEEKLY;COUNT=8;INTERVAL=2;BYDAY=TU,TH
+X-EXPECT-NUMEVENTS: 8
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase25.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase25.ics.next.ref
new file mode 100644
index 00000000..42606c54
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase25.ics.next.ref
@@ -0,0 +1,11 @@
+1997-09-02T09:00:00
+1997-09-04T09:00:00
+1997-09-16T09:00:00
+1997-09-18T09:00:00
+1997-09-30T09:00:00
+1997-10-02T09:00:00
+1997-10-14T09:00:00
+1997-10-16T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase25.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase25.ics.prev.ref
new file mode 100644
index 00000000..9d3e4cae
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase25.ics.prev.ref
@@ -0,0 +1,11 @@
+1997-10-16T09:00:00
+1997-10-14T09:00:00
+1997-10-02T09:00:00
+1997-09-30T09:00:00
+1997-09-18T09:00:00
+1997-09-16T09:00:00
+1997-09-04T09:00:00
+1997-09-02T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase25.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase25.ics.recurson.ref
new file mode 100644
index 00000000..19dff602
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase25.ics.recurson.ref
@@ -0,0 +1,9 @@
+1997-09-02
+1997-09-04
+1997-09-16
+1997-09-18
+1997-09-30
+1997-10-02
+1997-10-14
+1997-10-16
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase26.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase26.ics
new file mode 100644
index 00000000..0f0ce5da
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase26.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Monthly every Friday for ten occurrences:
+DTSTART;TZID=America/Los_Angeles:19970905T090000
+RRULE:FREQ=MONTHLY;COUNT=10;INTERVAL=1;BYDAY=FR
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase26.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase26.ics.next.ref
new file mode 100644
index 00000000..0f474cf1
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase26.ics.next.ref
@@ -0,0 +1,13 @@
+1997-09-05T09:00:00
+1997-09-12T09:00:00
+1997-09-19T09:00:00
+1997-09-26T09:00:00
+1997-10-03T09:00:00
+1997-10-10T09:00:00
+1997-10-17T09:00:00
+1997-10-24T09:00:00
+1997-10-31T09:00:00
+1997-11-07T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase26.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase26.ics.prev.ref
new file mode 100644
index 00000000..a2da0779
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase26.ics.prev.ref
@@ -0,0 +1,13 @@
+1997-11-07T09:00:00
+1997-10-31T09:00:00
+1997-10-24T09:00:00
+1997-10-17T09:00:00
+1997-10-10T09:00:00
+1997-10-03T09:00:00
+1997-09-26T09:00:00
+1997-09-19T09:00:00
+1997-09-12T09:00:00
+1997-09-05T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase26.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase26.ics.recurson.ref
new file mode 100644
index 00000000..9f4cd063
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase26.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-09-05
+1997-09-12
+1997-09-19
+1997-09-26
+1997-10-03
+1997-10-10
+1997-10-17
+1997-10-24
+1997-10-31
+1997-11-07
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase27.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase27.ics
new file mode 100644
index 00000000..361e89ef
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase27.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Monthly on the 1st Friday until December 24\, 1997:
+DTSTART;TZID=America/Los_Angeles:19970905T090000
+RRULE:FREQ=MONTHLY;UNTIL=19971224T000000Z;INTERVAL=1;BYDAY=1FR
+X-EXPECT-NUMEVENTS: 4
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase27.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase27.ics.next.ref
new file mode 100644
index 00000000..68bd8269
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase27.ics.next.ref
@@ -0,0 +1,7 @@
+1997-09-05T09:00:00
+1997-10-03T09:00:00
+1997-11-07T09:00:00
+1997-12-05T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase27.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase27.ics.prev.ref
new file mode 100644
index 00000000..54e86e6c
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase27.ics.prev.ref
@@ -0,0 +1,7 @@
+1997-12-05T09:00:00
+1997-11-07T09:00:00
+1997-10-03T09:00:00
+1997-09-05T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase27.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase27.ics.recurson.ref
new file mode 100644
index 00000000..e160f8dc
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase27.ics.recurson.ref
@@ -0,0 +1,5 @@
+1997-09-05
+1997-10-03
+1997-11-07
+1997-12-05
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase28.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase28.ics
new file mode 100644
index 00000000..3ff4648c
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase28.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Every other month on the 1st and last Sunday of the month for 10 occurrences:
+DTSTART;TZID=America/Los_Angeles:19970907T090000
+RRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase28.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase28.ics.next.ref
new file mode 100644
index 00000000..cc2f2f28
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase28.ics.next.ref
@@ -0,0 +1,13 @@
+1997-09-07T09:00:00
+1997-09-28T09:00:00
+1997-11-02T09:00:00
+1997-11-30T09:00:00
+1998-01-04T09:00:00
+1998-01-25T09:00:00
+1998-03-01T09:00:00
+1998-03-29T09:00:00
+1998-05-03T09:00:00
+1998-05-31T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase28.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase28.ics.prev.ref
new file mode 100644
index 00000000..8b6705b6
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase28.ics.prev.ref
@@ -0,0 +1,13 @@
+1998-05-31T09:00:00
+1998-05-03T09:00:00
+1998-03-29T09:00:00
+1998-03-01T09:00:00
+1998-01-25T09:00:00
+1998-01-04T09:00:00
+1997-11-30T09:00:00
+1997-11-02T09:00:00
+1997-09-28T09:00:00
+1997-09-07T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase28.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase28.ics.recurson.ref
new file mode 100644
index 00000000..419d31af
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase28.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-09-07
+1997-09-28
+1997-11-02
+1997-11-30
+1998-01-04
+1998-01-25
+1998-03-01
+1998-03-29
+1998-05-03
+1998-05-31
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase29.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase29.ics
new file mode 100644
index 00000000..cb021940
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase29.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Monthly on the second to last Monday of the month for 6 months:
+DTSTART;TZID=America/Los_Angeles:19970922T090000
+RRULE:FREQ=MONTHLY;COUNT=6;INTERVAL=1;BYDAY=-2MO
+X-EXPECT-NUMEVENTS: 6
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase29.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase29.ics.next.ref
new file mode 100644
index 00000000..843298e2
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase29.ics.next.ref
@@ -0,0 +1,9 @@
+1997-09-22T09:00:00
+1997-10-20T09:00:00
+1997-11-17T09:00:00
+1997-12-22T09:00:00
+1998-01-19T09:00:00
+1998-02-16T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase29.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase29.ics.prev.ref
new file mode 100644
index 00000000..e7e2624d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase29.ics.prev.ref
@@ -0,0 +1,9 @@
+1998-02-16T09:00:00
+1998-01-19T09:00:00
+1997-12-22T09:00:00
+1997-11-17T09:00:00
+1997-10-20T09:00:00
+1997-09-22T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase29.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase29.ics.recurson.ref
new file mode 100644
index 00000000..dfbc45c3
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase29.ics.recurson.ref
@@ -0,0 +1,7 @@
+1997-09-22
+1997-10-20
+1997-11-17
+1997-12-22
+1998-01-19
+1998-02-16
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase30.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase30.ics
new file mode 100644
index 00000000..3546a99e
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase30.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Monthly on the third to the last day of the month\, forever:
+DTSTART;TZID=America/Los_Angeles:19970928T090000
+RRULE:FREQ=MONTHLY;INTERVAL=1;COUNT=10;BYMONTHDAY=-3
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase30.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase30.ics.next.ref
new file mode 100644
index 00000000..168f7f5d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase30.ics.next.ref
@@ -0,0 +1,13 @@
+1997-09-28T09:00:00
+1997-10-29T09:00:00
+1997-11-28T09:00:00
+1997-12-29T09:00:00
+1998-01-29T09:00:00
+1998-02-26T09:00:00
+1998-03-29T09:00:00
+1998-04-28T09:00:00
+1998-05-29T09:00:00
+1998-06-28T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase30.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase30.ics.prev.ref
new file mode 100644
index 00000000..ebc77750
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase30.ics.prev.ref
@@ -0,0 +1,13 @@
+1998-06-28T09:00:00
+1998-05-29T09:00:00
+1998-04-28T09:00:00
+1998-03-29T09:00:00
+1998-02-26T09:00:00
+1998-01-29T09:00:00
+1997-12-29T09:00:00
+1997-11-28T09:00:00
+1997-10-29T09:00:00
+1997-09-28T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase30.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase30.ics.recurson.ref
new file mode 100644
index 00000000..039549ce
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase30.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-09-28
+1997-10-29
+1997-11-28
+1997-12-29
+1998-01-29
+1998-02-26
+1998-03-29
+1998-04-28
+1998-05-29
+1998-06-28
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase31.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase31.ics
new file mode 100644
index 00000000..65d15563
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase31.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Monthly on the 2nd and 15th of the month for 10 occurrences:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=MONTHLY;COUNT=10;INTERVAL=1;BYMONTHDAY=2,15
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase31.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase31.ics.next.ref
new file mode 100644
index 00000000..fa3faf24
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase31.ics.next.ref
@@ -0,0 +1,13 @@
+1997-09-02T09:00:00
+1997-09-15T09:00:00
+1997-10-02T09:00:00
+1997-10-15T09:00:00
+1997-11-02T09:00:00
+1997-11-15T09:00:00
+1997-12-02T09:00:00
+1997-12-15T09:00:00
+1998-01-02T09:00:00
+1998-01-15T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase31.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase31.ics.prev.ref
new file mode 100644
index 00000000..11eebe60
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase31.ics.prev.ref
@@ -0,0 +1,13 @@
+1998-01-15T09:00:00
+1998-01-02T09:00:00
+1997-12-15T09:00:00
+1997-12-02T09:00:00
+1997-11-15T09:00:00
+1997-11-02T09:00:00
+1997-10-15T09:00:00
+1997-10-02T09:00:00
+1997-09-15T09:00:00
+1997-09-02T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase31.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase31.ics.recurson.ref
new file mode 100644
index 00000000..7b72c389
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase31.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-09-02
+1997-09-15
+1997-10-02
+1997-10-15
+1997-11-02
+1997-11-15
+1997-12-02
+1997-12-15
+1998-01-02
+1998-01-15
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase32.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase32.ics
new file mode 100644
index 00000000..4a2f29b0
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase32.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Monthly on the first and last day of the month for 10 occurrences:\n
+DTSTART;TZID=America/Los_Angeles:19970930T090000
+RRULE:FREQ=MONTHLY;COUNT=10;INTERVAL=1;BYMONTHDAY=1,-1
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase32.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase32.ics.next.ref
new file mode 100644
index 00000000..2e015f62
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase32.ics.next.ref
@@ -0,0 +1,13 @@
+1997-09-30T09:00:00
+1997-10-01T09:00:00
+1997-10-31T09:00:00
+1997-11-01T09:00:00
+1997-11-30T09:00:00
+1997-12-01T09:00:00
+1997-12-31T09:00:00
+1998-01-01T09:00:00
+1998-01-31T09:00:00
+1998-02-01T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase32.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase32.ics.prev.ref
new file mode 100644
index 00000000..c4417574
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase32.ics.prev.ref
@@ -0,0 +1,13 @@
+1998-02-01T09:00:00
+1998-01-31T09:00:00
+1998-01-01T09:00:00
+1997-12-31T09:00:00
+1997-12-01T09:00:00
+1997-11-30T09:00:00
+1997-11-01T09:00:00
+1997-10-31T09:00:00
+1997-10-01T09:00:00
+1997-09-30T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase32.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase32.ics.recurson.ref
new file mode 100644
index 00000000..6601563b
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase32.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-09-30
+1997-10-01
+1997-10-31
+1997-11-01
+1997-11-30
+1997-12-01
+1997-12-31
+1998-01-01
+1998-01-31
+1998-02-01
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase33.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase33.ics
new file mode 100644
index 00000000..56a23356
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase33.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Every 18 months on the 10th thru 15th of the month for 10 occurrences:
+DTSTART;TZID=America/Los_Angeles:19970910T090000
+RRULE:FREQ=MONTHLY;COUNT=10;INTERVAL=18;BYMONTHDAY=10,11,12,13,14,15
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase33.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase33.ics.next.ref
new file mode 100644
index 00000000..c159266f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase33.ics.next.ref
@@ -0,0 +1,13 @@
+1997-09-10T09:00:00
+1997-09-11T09:00:00
+1997-09-12T09:00:00
+1997-09-13T09:00:00
+1997-09-14T09:00:00
+1997-09-15T09:00:00
+1999-03-10T09:00:00
+1999-03-11T09:00:00
+1999-03-12T09:00:00
+1999-03-13T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase33.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase33.ics.prev.ref
new file mode 100644
index 00000000..18cd2d7c
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase33.ics.prev.ref
@@ -0,0 +1,13 @@
+1999-03-13T09:00:00
+1999-03-12T09:00:00
+1999-03-11T09:00:00
+1999-03-10T09:00:00
+1997-09-15T09:00:00
+1997-09-14T09:00:00
+1997-09-13T09:00:00
+1997-09-12T09:00:00
+1997-09-11T09:00:00
+1997-09-10T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase33.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase33.ics.recurson.ref
new file mode 100644
index 00000000..dcaea76d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase33.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-09-10
+1997-09-11
+1997-09-12
+1997-09-13
+1997-09-14
+1997-09-15
+1999-03-10
+1999-03-11
+1999-03-12
+1999-03-13
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase34.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase34.ics
new file mode 100644
index 00000000..96a161d7
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase34.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Every Tuesday\, every other month:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=TU
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase34.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase34.ics.next.ref
new file mode 100644
index 00000000..be5b65a2
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase34.ics.next.ref
@@ -0,0 +1,13 @@
+1997-09-02T09:00:00
+1997-09-09T09:00:00
+1997-09-16T09:00:00
+1997-09-23T09:00:00
+1997-09-30T09:00:00
+1997-11-04T09:00:00
+1997-11-11T09:00:00
+1997-11-18T09:00:00
+1997-11-25T09:00:00
+1998-01-06T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase34.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase34.ics.prev.ref
new file mode 100644
index 00000000..26ba33a1
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase34.ics.prev.ref
@@ -0,0 +1,13 @@
+1998-01-06T09:00:00
+1997-11-25T09:00:00
+1997-11-18T09:00:00
+1997-11-11T09:00:00
+1997-11-04T09:00:00
+1997-09-30T09:00:00
+1997-09-23T09:00:00
+1997-09-16T09:00:00
+1997-09-09T09:00:00
+1997-09-02T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase34.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase34.ics.recurson.ref
new file mode 100644
index 00000000..b99bbf20
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase34.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-09-02
+1997-09-09
+1997-09-16
+1997-09-23
+1997-09-30
+1997-11-04
+1997-11-11
+1997-11-18
+1997-11-25
+1998-01-06
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase35.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase35.ics
new file mode 100644
index 00000000..7b6627e0
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase35.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Yearly in June and July for 10 occurrences:
+DTSTART;TZID=America/Los_Angeles:19970610T090000
+RRULE:FREQ=YEARLY;COUNT=10;INTERVAL=1;BYMONTH=6,7
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase35.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase35.ics.next.ref
new file mode 100644
index 00000000..50a1a897
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase35.ics.next.ref
@@ -0,0 +1,13 @@
+1997-06-10T09:00:00
+1997-07-10T09:00:00
+1998-06-10T09:00:00
+1998-07-10T09:00:00
+1999-06-10T09:00:00
+1999-07-10T09:00:00
+2000-06-10T09:00:00
+2000-07-10T09:00:00
+2001-06-10T09:00:00
+2001-07-10T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase35.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase35.ics.prev.ref
new file mode 100644
index 00000000..9c56828a
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase35.ics.prev.ref
@@ -0,0 +1,13 @@
+2001-07-10T09:00:00
+2001-06-10T09:00:00
+2000-07-10T09:00:00
+2000-06-10T09:00:00
+1999-07-10T09:00:00
+1999-06-10T09:00:00
+1998-07-10T09:00:00
+1998-06-10T09:00:00
+1997-07-10T09:00:00
+1997-06-10T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase35.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase35.ics.recurson.ref
new file mode 100644
index 00000000..d3ec1d31
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase35.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-06-10
+1997-07-10
+1998-06-10
+1998-07-10
+1999-06-10
+1999-07-10
+2000-06-10
+2000-07-10
+2001-06-10
+2001-07-10
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase36.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase36.ics
new file mode 100644
index 00000000..2d7b092d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase36.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Every other year on January\, February\, and March for 10 occurrences:
+DTSTART;TZID=America/Los_Angeles:19970310T090000
+RRULE:FREQ=YEARLY;COUNT=10;INTERVAL=2;BYMONTH=1,2,3
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase36.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase36.ics.next.ref
new file mode 100644
index 00000000..8aef2a79
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase36.ics.next.ref
@@ -0,0 +1,13 @@
+1997-03-10T09:00:00
+1999-01-10T09:00:00
+1999-02-10T09:00:00
+1999-03-10T09:00:00
+2001-01-10T09:00:00
+2001-02-10T09:00:00
+2001-03-10T09:00:00
+2003-01-10T09:00:00
+2003-02-10T09:00:00
+2003-03-10T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase36.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase36.ics.prev.ref
new file mode 100644
index 00000000..dbb1522d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase36.ics.prev.ref
@@ -0,0 +1,13 @@
+2003-03-10T09:00:00
+2003-02-10T09:00:00
+2003-01-10T09:00:00
+2001-03-10T09:00:00
+2001-02-10T09:00:00
+2001-01-10T09:00:00
+1999-03-10T09:00:00
+1999-02-10T09:00:00
+1999-01-10T09:00:00
+1997-03-10T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase36.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase36.ics.recurson.ref
new file mode 100644
index 00000000..da74b930
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase36.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-03-10
+1999-01-10
+1999-02-10
+1999-03-10
+2001-01-10
+2001-02-10
+2001-03-10
+2003-01-10
+2003-02-10
+2003-03-10
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase37.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase37.ics
new file mode 100644
index 00000000..8b6de9b3
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase37.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Every 3rd year on the 1st\, 100th and 200th day for 10 occurrences:
+DTSTART;TZID=America/Los_Angeles:19970101T090000
+RRULE:FREQ=YEARLY;COUNT=10;INTERVAL=3;BYYEARDAY=1,100,200
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase37.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase37.ics.next.ref
new file mode 100644
index 00000000..127bd087
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase37.ics.next.ref
@@ -0,0 +1,13 @@
+1997-01-01T09:00:00
+1997-04-10T09:00:00
+1997-07-19T09:00:00
+2000-01-01T09:00:00
+2000-04-09T09:00:00
+2000-07-18T09:00:00
+2003-01-01T09:00:00
+2003-04-10T09:00:00
+2003-07-19T09:00:00
+2006-01-01T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase37.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase37.ics.prev.ref
new file mode 100644
index 00000000..3aa770dd
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase37.ics.prev.ref
@@ -0,0 +1,13 @@
+2006-01-01T09:00:00
+2003-07-19T09:00:00
+2003-04-10T09:00:00
+2003-01-01T09:00:00
+2000-07-18T09:00:00
+2000-04-09T09:00:00
+2000-01-01T09:00:00
+1997-07-19T09:00:00
+1997-04-10T09:00:00
+1997-01-01T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase37.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase37.ics.recurson.ref
new file mode 100644
index 00000000..a4826d50
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase37.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-01-01
+1997-04-10
+1997-07-19
+2000-01-01
+2000-04-09
+2000-07-18
+2003-01-01
+2003-04-10
+2003-07-19
+2006-01-01
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase38.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase38.ics
new file mode 100644
index 00000000..443a8e15
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase38.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Every 20th Monday of the year\, forever:
+DTSTART;TZID=America/Los_Angeles:19970519T090000
+RRULE:FREQ=YEARLY;INTERVAL=1;COUNT=10;BYDAY=20MO
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase38.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase38.ics.next.ref
new file mode 100644
index 00000000..b6f28fbc
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase38.ics.next.ref
@@ -0,0 +1,13 @@
+1997-05-19T09:00:00
+1998-05-18T09:00:00
+1999-05-17T09:00:00
+2000-05-15T09:00:00
+2001-05-14T09:00:00
+2002-05-20T09:00:00
+2003-05-19T09:00:00
+2004-05-17T09:00:00
+2005-05-16T09:00:00
+2006-05-15T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase38.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase38.ics.prev.ref
new file mode 100644
index 00000000..5d7fe8ee
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase38.ics.prev.ref
@@ -0,0 +1,13 @@
+2006-05-15T09:00:00
+2005-05-16T09:00:00
+2004-05-17T09:00:00
+2003-05-19T09:00:00
+2002-05-20T09:00:00
+2001-05-14T09:00:00
+2000-05-15T09:00:00
+1999-05-17T09:00:00
+1998-05-18T09:00:00
+1997-05-19T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase38.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase38.ics.recurson.ref
new file mode 100644
index 00000000..f9fd18d4
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase38.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-05-19
+1998-05-18
+1999-05-17
+2000-05-15
+2001-05-14
+2002-05-20
+2003-05-19
+2004-05-17
+2005-05-16
+2006-05-15
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase39.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase39.ics
new file mode 100644
index 00000000..c69b7aae
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase39.ics
@@ -0,0 +1,13 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Monday of week number 20 (where the default start of the week is Monday)\,
+ forever:
+DTSTART;TZID=America/Los_Angeles:19970512T090000
+RRULE:FREQ=YEARLY;INTERVAL=1;COUNT=10;BYDAY=MO;BYWEEKNO=20
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase39.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase39.ics.next.ref
new file mode 100644
index 00000000..39486f12
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase39.ics.next.ref
@@ -0,0 +1,13 @@
+1997-05-12T09:00:00
+1998-05-11T09:00:00
+1999-05-17T09:00:00
+2000-05-15T09:00:00
+2001-05-14T09:00:00
+2002-05-13T09:00:00
+2003-05-12T09:00:00
+2004-05-10T09:00:00
+2005-05-16T09:00:00
+2006-05-15T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase39.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase39.ics.prev.ref
new file mode 100644
index 00000000..e8c7fd74
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase39.ics.prev.ref
@@ -0,0 +1,13 @@
+2006-05-15T09:00:00
+2005-05-16T09:00:00
+2004-05-10T09:00:00
+2003-05-12T09:00:00
+2002-05-13T09:00:00
+2001-05-14T09:00:00
+2000-05-15T09:00:00
+1999-05-17T09:00:00
+1998-05-11T09:00:00
+1997-05-12T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase39.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase39.ics.recurson.ref
new file mode 100644
index 00000000..3959a509
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase39.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-05-12
+1998-05-11
+1999-05-17
+2000-05-15
+2001-05-14
+2002-05-13
+2003-05-12
+2004-05-10
+2005-05-16
+2006-05-15
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase40.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase40.ics
new file mode 100644
index 00000000..43e0058f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase40.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Every Thursday in March\, 10 occurrences:
+DTSTART;TZID=America/Los_Angeles:19970313T090000
+RRULE:FREQ=YEARLY;INTERVAL=1;COUNT=10;BYDAY=TH;BYMONTH=3
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase40.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase40.ics.next.ref
new file mode 100644
index 00000000..e4d1f7e6
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase40.ics.next.ref
@@ -0,0 +1,13 @@
+1997-03-13T09:00:00
+1997-03-20T09:00:00
+1997-03-27T09:00:00
+1998-03-05T09:00:00
+1998-03-12T09:00:00
+1998-03-19T09:00:00
+1998-03-26T09:00:00
+1999-03-04T09:00:00
+1999-03-11T09:00:00
+1999-03-18T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase40.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase40.ics.prev.ref
new file mode 100644
index 00000000..41f549bc
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase40.ics.prev.ref
@@ -0,0 +1,13 @@
+1999-03-18T09:00:00
+1999-03-11T09:00:00
+1999-03-04T09:00:00
+1998-03-26T09:00:00
+1998-03-19T09:00:00
+1998-03-12T09:00:00
+1998-03-05T09:00:00
+1997-03-27T09:00:00
+1997-03-20T09:00:00
+1997-03-13T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase40.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase40.ics.recurson.ref
new file mode 100644
index 00000000..a39e96f6
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase40.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-03-13
+1997-03-20
+1997-03-27
+1998-03-05
+1998-03-12
+1998-03-19
+1998-03-26
+1999-03-04
+1999-03-11
+1999-03-18
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase41.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase41.ics
new file mode 100644
index 00000000..642693a9
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase41.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Every Thursday\, but only during June\, July\, and August\, forever:
+DTSTART;TZID=America/Los_Angeles:19970605T090000
+RRULE:FREQ=YEARLY;INTERVAL=1;COUNT=20;BYDAY=TH;BYMONTH=6,7,8
+X-EXPECT-NUMEVENTS: 20
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase41.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase41.ics.next.ref
new file mode 100644
index 00000000..c7f4824d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase41.ics.next.ref
@@ -0,0 +1,23 @@
+1997-06-05T09:00:00
+1997-06-12T09:00:00
+1997-06-19T09:00:00
+1997-06-26T09:00:00
+1997-07-03T09:00:00
+1997-07-10T09:00:00
+1997-07-17T09:00:00
+1997-07-24T09:00:00
+1997-07-31T09:00:00
+1997-08-07T09:00:00
+1997-08-14T09:00:00
+1997-08-21T09:00:00
+1997-08-28T09:00:00
+1998-06-04T09:00:00
+1998-06-11T09:00:00
+1998-06-18T09:00:00
+1998-06-25T09:00:00
+1998-07-02T09:00:00
+1998-07-09T09:00:00
+1998-07-16T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase41.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase41.ics.prev.ref
new file mode 100644
index 00000000..eb23e73e
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase41.ics.prev.ref
@@ -0,0 +1,23 @@
+1998-07-16T09:00:00
+1998-07-09T09:00:00
+1998-07-02T09:00:00
+1998-06-25T09:00:00
+1998-06-18T09:00:00
+1998-06-11T09:00:00
+1998-06-04T09:00:00
+1997-08-28T09:00:00
+1997-08-21T09:00:00
+1997-08-14T09:00:00
+1997-08-07T09:00:00
+1997-07-31T09:00:00
+1997-07-24T09:00:00
+1997-07-17T09:00:00
+1997-07-10T09:00:00
+1997-07-03T09:00:00
+1997-06-26T09:00:00
+1997-06-19T09:00:00
+1997-06-12T09:00:00
+1997-06-05T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase41.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase41.ics.recurson.ref
new file mode 100644
index 00000000..44f926a8
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase41.ics.recurson.ref
@@ -0,0 +1,21 @@
+1997-06-05
+1997-06-12
+1997-06-19
+1997-06-26
+1997-07-03
+1997-07-10
+1997-07-17
+1997-07-24
+1997-07-31
+1997-08-07
+1997-08-14
+1997-08-21
+1997-08-28
+1998-06-04
+1998-06-11
+1998-06-18
+1998-06-25
+1998-07-02
+1998-07-09
+1998-07-16
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase42.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase42.ics
new file mode 100644
index 00000000..eb04473b
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase42.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Every Friday the 13th\, 10 occurrences:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=MONTHLY;INTERVAL=1;COUNT=10;BYDAY=FR;BYMONTHDAY=13
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase42.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase42.ics.next.ref
new file mode 100644
index 00000000..958a3dc2
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase42.ics.next.ref
@@ -0,0 +1,14 @@
+1997-09-02T09:00:00
+1998-02-13T09:00:00
+1998-03-13T09:00:00
+1998-11-13T09:00:00
+1999-08-13T09:00:00
+2000-10-13T09:00:00
+2001-04-13T09:00:00
+2001-07-13T09:00:00
+2002-09-13T09:00:00
+2002-12-13T09:00:00
+2003-06-13T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase42.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase42.ics.prev.ref
new file mode 100644
index 00000000..1642c34b
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase42.ics.prev.ref
@@ -0,0 +1,14 @@
+2003-06-13T09:00:00
+2002-12-13T09:00:00
+2002-09-13T09:00:00
+2001-07-13T09:00:00
+2001-04-13T09:00:00
+2000-10-13T09:00:00
+1999-08-13T09:00:00
+1998-11-13T09:00:00
+1998-03-13T09:00:00
+1998-02-13T09:00:00
+1997-09-02T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase42.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase42.ics.recurson.ref
new file mode 100644
index 00000000..887df0de
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase42.ics.recurson.ref
@@ -0,0 +1,12 @@
+1997-09-02
+1998-02-13
+1998-03-13
+1998-11-13
+1999-08-13
+2000-10-13
+2001-04-13
+2001-07-13
+2002-09-13
+2002-12-13
+2003-06-13
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase43.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase43.ics
new file mode 100644
index 00000000..13c21123
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase43.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:The first Saturday that follows the first Sunday of the month\,
+DTSTART;TZID=America/Los_Angeles:19970913T090000
+RRULE:FREQ=MONTHLY;INTERVAL=1;COUNT=10;BYDAY=SA;BYMONTHDAY=7,8,9,10,11,12,13
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase43.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase43.ics.next.ref
new file mode 100644
index 00000000..d3a057ec
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase43.ics.next.ref
@@ -0,0 +1,13 @@
+1997-09-13T09:00:00
+1997-10-11T09:00:00
+1997-11-08T09:00:00
+1997-12-13T09:00:00
+1998-01-10T09:00:00
+1998-02-07T09:00:00
+1998-03-07T09:00:00
+1998-04-11T09:00:00
+1998-05-09T09:00:00
+1998-06-13T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase43.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase43.ics.prev.ref
new file mode 100644
index 00000000..8f1a210f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase43.ics.prev.ref
@@ -0,0 +1,13 @@
+1998-06-13T09:00:00
+1998-05-09T09:00:00
+1998-04-11T09:00:00
+1998-03-07T09:00:00
+1998-02-07T09:00:00
+1998-01-10T09:00:00
+1997-12-13T09:00:00
+1997-11-08T09:00:00
+1997-10-11T09:00:00
+1997-09-13T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase43.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase43.ics.recurson.ref
new file mode 100644
index 00000000..fa1acba7
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase43.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-09-13
+1997-10-11
+1997-11-08
+1997-12-13
+1998-01-10
+1998-02-07
+1998-03-07
+1998-04-11
+1998-05-09
+1998-06-13
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase44.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase44.ics
new file mode 100644
index 00000000..eea55140
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase44.ics
@@ -0,0 +1,13 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Every four years\, the first Tuesday after a Monday in November\,
+ 10 times (U.S. Presidential Election day):
+DTSTART;TZID=America/Los_Angeles:19961105T090000
+RRULE:FREQ=YEARLY;INTERVAL=4;COUNT=10;BYDAY=TU;BYMONTHDAY=2,3,4,5,6,7,8;BYMONTH=11
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase44.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase44.ics.next.ref
new file mode 100644
index 00000000..8f3ca672
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase44.ics.next.ref
@@ -0,0 +1,13 @@
+1996-11-05T09:00:00
+2000-11-07T09:00:00
+2004-11-02T09:00:00
+2008-11-04T09:00:00
+2012-11-06T09:00:00
+2016-11-08T09:00:00
+2020-11-03T09:00:00
+2024-11-05T09:00:00
+2028-11-07T09:00:00
+2032-11-02T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase44.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase44.ics.prev.ref
new file mode 100644
index 00000000..8d5466cc
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase44.ics.prev.ref
@@ -0,0 +1,13 @@
+2032-11-02T09:00:00
+2028-11-07T09:00:00
+2024-11-05T09:00:00
+2020-11-03T09:00:00
+2016-11-08T09:00:00
+2012-11-06T09:00:00
+2008-11-04T09:00:00
+2004-11-02T09:00:00
+2000-11-07T09:00:00
+1996-11-05T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase44.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase44.ics.recurson.ref
new file mode 100644
index 00000000..a77c5088
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase44.ics.recurson.ref
@@ -0,0 +1,5 @@
+1996-11-05
+2000-11-07
+2004-11-02
+2008-11-04
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase45.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase45.ics
new file mode 100644
index 00000000..e4fb0e65
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase45.ics
@@ -0,0 +1,13 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:The 3rd instance into the month of one of Tuesday\, Wednesday or
+ Thursday\, for the next 3 months:
+DTSTART;TZID=America/Los_Angeles:19970904T090000
+RRULE:FREQ=MONTHLY;COUNT=3;INTERVAL=1;BYDAY=TU,WE,TH;BYSETPOS=3
+X-EXPECT-NUMEVENTS: 3
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase45.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase45.ics.next.ref
new file mode 100644
index 00000000..9831f70c
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase45.ics.next.ref
@@ -0,0 +1,6 @@
+1997-09-04T09:00:00
+1997-10-07T09:00:00
+1997-11-06T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase45.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase45.ics.prev.ref
new file mode 100644
index 00000000..825e21fd
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase45.ics.prev.ref
@@ -0,0 +1,6 @@
+1997-11-06T09:00:00
+1997-10-07T09:00:00
+1997-09-04T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase45.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase45.ics.recurson.ref
new file mode 100644
index 00000000..49d86222
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase45.ics.recurson.ref
@@ -0,0 +1,4 @@
+1997-09-04
+1997-10-07
+1997-11-06
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase46.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase46.ics
new file mode 100644
index 00000000..b9314ed5
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase46.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:The 2nd to last weekday of the month:
+DTSTART;TZID=America/Los_Angeles:19970929T090000
+RRULE:FREQ=MONTHLY;INTERVAL=1;COUNT=10;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase46.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase46.ics.next.ref
new file mode 100644
index 00000000..4424fdac
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase46.ics.next.ref
@@ -0,0 +1,11 @@
+1997-09-29T09:00:00
+1997-10-30T09:00:00
+1997-11-27T09:00:00
+1997-12-30T09:00:00
+1998-01-29T09:00:00
+1998-02-26T09:00:00
+1998-03-30T09:00:00
+1998-04-29T09:00:00
+1998-05-28T09:00:00
+1998-06-29T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase46.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase46.ics.prev.ref
new file mode 100644
index 00000000..8019fb2f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase46.ics.prev.ref
@@ -0,0 +1,13 @@
+1998-06-29T09:00:00
+1998-05-28T09:00:00
+1998-04-29T09:00:00
+1998-03-30T09:00:00
+1998-02-26T09:00:00
+1998-01-29T09:00:00
+1997-12-30T09:00:00
+1997-11-27T09:00:00
+1997-10-30T09:00:00
+1997-09-29T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase46.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase46.ics.recurson.ref
new file mode 100644
index 00000000..5d2847ad
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase46.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-09-29
+1997-10-30
+1997-11-27
+1997-12-30
+1998-01-29
+1998-02-26
+1998-03-30
+1998-04-29
+1998-05-28
+1998-06-29
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase48.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase48.ics
new file mode 100644
index 00000000..cd87e76a
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase48.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Every 15 minutes for 6 occurrences:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=MINUTELY;COUNT=6;INTERVAL=15
+X-EXPECT-NUMEVENTS: 6
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase48.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase48.ics.next.ref
new file mode 100644
index 00000000..a16c74f8
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase48.ics.next.ref
@@ -0,0 +1,9 @@
+1997-09-02T09:00:00
+1997-09-02T09:15:00
+1997-09-02T09:30:00
+1997-09-02T09:45:00
+1997-09-02T10:00:00
+1997-09-02T10:15:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase48.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase48.ics.prev.ref
new file mode 100644
index 00000000..75cd821e
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase48.ics.prev.ref
@@ -0,0 +1,9 @@
+1997-09-02T10:15:00
+1997-09-02T10:00:00
+1997-09-02T09:45:00
+1997-09-02T09:30:00
+1997-09-02T09:15:00
+1997-09-02T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase48.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase48.ics.recurson.ref
new file mode 100644
index 00000000..6fca0d2f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase48.ics.recurson.ref
@@ -0,0 +1,2 @@
+1997-09-02
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase49.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase49.ics
new file mode 100644
index 00000000..7607a5cb
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase49.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Every hour and a half for 4 occurrences:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=MINUTELY;COUNT=4;INTERVAL=90
+X-EXPECT-NUMEVENTS: 4
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase49.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase49.ics.next.ref
new file mode 100644
index 00000000..537b2b0d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase49.ics.next.ref
@@ -0,0 +1,7 @@
+1997-09-02T09:00:00
+1997-09-02T10:30:00
+1997-09-02T12:00:00
+1997-09-02T13:30:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase49.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase49.ics.prev.ref
new file mode 100644
index 00000000..262f43d2
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase49.ics.prev.ref
@@ -0,0 +1,7 @@
+1997-09-02T13:30:00
+1997-09-02T12:00:00
+1997-09-02T10:30:00
+1997-09-02T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase49.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase49.ics.recurson.ref
new file mode 100644
index 00000000..6fca0d2f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase49.ics.recurson.ref
@@ -0,0 +1,2 @@
+1997-09-02
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase50.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase50.ics
new file mode 100644
index 00000000..f201ff31
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase50.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Every 20 minutes from 9:00 AM to 4:40 PM every day:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=DAILY;COUNT=20;INTERVAL=1;BYMINUTE=0,20,40;BYHOUR=9,10,11,12,13,14,15,16
+X-EXPECT-NUMEVENTS: 20
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase50.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase50.ics.next.ref
new file mode 100644
index 00000000..038d2d6a
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase50.ics.next.ref
@@ -0,0 +1,23 @@
+1997-09-02T09:00:00
+1997-09-02T09:20:00
+1997-09-02T09:40:00
+1997-09-02T10:00:00
+1997-09-02T10:20:00
+1997-09-02T10:40:00
+1997-09-02T11:00:00
+1997-09-02T11:20:00
+1997-09-02T11:40:00
+1997-09-02T12:00:00
+1997-09-02T12:20:00
+1997-09-02T12:40:00
+1997-09-02T13:00:00
+1997-09-02T13:20:00
+1997-09-02T13:40:00
+1997-09-02T14:00:00
+1997-09-02T14:20:00
+1997-09-02T14:40:00
+1997-09-02T15:00:00
+1997-09-02T15:20:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase50.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase50.ics.prev.ref
new file mode 100644
index 00000000..bea2bbcd
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase50.ics.prev.ref
@@ -0,0 +1,23 @@
+1997-09-02T15:20:00
+1997-09-02T15:00:00
+1997-09-02T14:40:00
+1997-09-02T14:20:00
+1997-09-02T14:00:00
+1997-09-02T13:40:00
+1997-09-02T13:20:00
+1997-09-02T13:00:00
+1997-09-02T12:40:00
+1997-09-02T12:20:00
+1997-09-02T12:00:00
+1997-09-02T11:40:00
+1997-09-02T11:20:00
+1997-09-02T11:00:00
+1997-09-02T10:40:00
+1997-09-02T10:20:00
+1997-09-02T10:00:00
+1997-09-02T09:40:00
+1997-09-02T09:20:00
+1997-09-02T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase50.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase50.ics.recurson.ref
new file mode 100644
index 00000000..6fca0d2f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase50.ics.recurson.ref
@@ -0,0 +1,2 @@
+1997-09-02
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase51.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase51.ics
new file mode 100644
index 00000000..80d74d4c
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase51.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Every 20 minutes from 9:00 AM to 4:40 PM every day:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=MINUTELY;COUNT=20;INTERVAL=20;BYHOUR=9,10,11,12,13,14,15,16
+X-EXPECT-NUMEVENTS: 20
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase51.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase51.ics.next.ref
new file mode 100644
index 00000000..038d2d6a
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase51.ics.next.ref
@@ -0,0 +1,23 @@
+1997-09-02T09:00:00
+1997-09-02T09:20:00
+1997-09-02T09:40:00
+1997-09-02T10:00:00
+1997-09-02T10:20:00
+1997-09-02T10:40:00
+1997-09-02T11:00:00
+1997-09-02T11:20:00
+1997-09-02T11:40:00
+1997-09-02T12:00:00
+1997-09-02T12:20:00
+1997-09-02T12:40:00
+1997-09-02T13:00:00
+1997-09-02T13:20:00
+1997-09-02T13:40:00
+1997-09-02T14:00:00
+1997-09-02T14:20:00
+1997-09-02T14:40:00
+1997-09-02T15:00:00
+1997-09-02T15:20:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase51.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase51.ics.prev.ref
new file mode 100644
index 00000000..bea2bbcd
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase51.ics.prev.ref
@@ -0,0 +1,23 @@
+1997-09-02T15:20:00
+1997-09-02T15:00:00
+1997-09-02T14:40:00
+1997-09-02T14:20:00
+1997-09-02T14:00:00
+1997-09-02T13:40:00
+1997-09-02T13:20:00
+1997-09-02T13:00:00
+1997-09-02T12:40:00
+1997-09-02T12:20:00
+1997-09-02T12:00:00
+1997-09-02T11:40:00
+1997-09-02T11:20:00
+1997-09-02T11:00:00
+1997-09-02T10:40:00
+1997-09-02T10:20:00
+1997-09-02T10:00:00
+1997-09-02T09:40:00
+1997-09-02T09:20:00
+1997-09-02T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase51.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase51.ics.recurson.ref
new file mode 100644
index 00000000..6fca0d2f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase51.ics.recurson.ref
@@ -0,0 +1,2 @@
+1997-09-02
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase54.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase54.ics
new file mode 100644
index 00000000..2838ac2d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase54.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Repeat every tuesday and wednesday starting 2 April 2002
+RRULE:FREQ=WEEKLY;INTERVAL=1;COUNT=6;BYDAY=TU,WE
+DTSTART:20020402T114500
+X-EXPECT-NUMEVENTS: 6
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase54.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase54.ics.next.ref
new file mode 100644
index 00000000..6ce39a7d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase54.ics.next.ref
@@ -0,0 +1,9 @@
+2002-04-02T11:45:00
+2002-04-03T11:45:00
+2002-04-09T11:45:00
+2002-04-10T11:45:00
+2002-04-16T11:45:00
+2002-04-17T11:45:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase54.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase54.ics.prev.ref
new file mode 100644
index 00000000..1f5f03e8
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase54.ics.prev.ref
@@ -0,0 +1,9 @@
+2002-04-17T11:45:00
+2002-04-16T11:45:00
+2002-04-10T11:45:00
+2002-04-09T11:45:00
+2002-04-03T11:45:00
+2002-04-02T11:45:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase54.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase54.ics.recurson.ref
new file mode 100644
index 00000000..9b26c166
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase54.ics.recurson.ref
@@ -0,0 +1,7 @@
+2002-04-02
+2002-04-03
+2002-04-09
+2002-04-10
+2002-04-16
+2002-04-17
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase55.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase55.ics
new file mode 100644
index 00000000..361585bf
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase55.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Use count=1 to repeat zero times.
+RRULE:FREQ=DAILY;COUNT=1
+DTSTART:20020402T114500
+X-EXPECT-NUMEVENTS: 1
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase55.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase55.ics.next.ref
new file mode 100644
index 00000000..5be77173
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase55.ics.next.ref
@@ -0,0 +1,4 @@
+2002-04-02T11:45:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase55.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase55.ics.prev.ref
new file mode 100644
index 00000000..5be77173
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase55.ics.prev.ref
@@ -0,0 +1,4 @@
+2002-04-02T11:45:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase55.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase55.ics.recurson.ref
new file mode 100644
index 00000000..beece3ac
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase55.ics.recurson.ref
@@ -0,0 +1,2 @@
+2002-04-02
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase56.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase56.ics
new file mode 100644
index 00000000..26f26421
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase56.ics
@@ -0,0 +1,13 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Use EXDATE to eliminate the base event
+RRULE:FREQ=DAILY;COUNT=1
+DTSTART:20020402T114500Z
+EXDATE:20020402T114500Z
+X-EXPECT-NUMEVENTS: 0
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase56.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase56.ics.next.ref
new file mode 100644
index 00000000..b28b04f6
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase56.ics.next.ref
@@ -0,0 +1,3 @@
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase56.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase56.ics.prev.ref
new file mode 100644
index 00000000..b28b04f6
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase56.ics.prev.ref
@@ -0,0 +1,3 @@
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase56.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase56.ics.recurson.ref
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase56.ics.recurson.ref
@@ -0,0 +1 @@
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase57.ics b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase57.ics
new file mode 100644
index 00000000..d3d9351c
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase57.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:UTC
+
+BEGIN:VEVENT
+DESCRIPTION:Every Day in January\, except saturday and sunday\, using 2 EXRULEs.
+RRULE:FREQ=DAILY;INTERVAL=1;UNTIL=20020201T000000Z
+EXRULE:FREQ=WEEKLY;INTERVAL=1;UNTIL=20020201T000000Z;BYDAY=SU
+EXRULE:FREQ=WEEKLY;INTERVAL=1;UNTIL=20020201T000000Z;BYDAY=SA
+DTSTART:20020101T090000Z
+DURATION:PT1H
+X-EXPECT-NUMEVENTS: 23
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase57.ics.next.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase57.ics.next.ref
new file mode 100644
index 00000000..698a56c8
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase57.ics.next.ref
@@ -0,0 +1,26 @@
+2002-01-01T09:00:00
+2002-01-02T09:00:00
+2002-01-03T09:00:00
+2002-01-04T09:00:00
+2002-01-07T09:00:00
+2002-01-08T09:00:00
+2002-01-09T09:00:00
+2002-01-10T09:00:00
+2002-01-11T09:00:00
+2002-01-14T09:00:00
+2002-01-15T09:00:00
+2002-01-16T09:00:00
+2002-01-17T09:00:00
+2002-01-18T09:00:00
+2002-01-21T09:00:00
+2002-01-22T09:00:00
+2002-01-23T09:00:00
+2002-01-24T09:00:00
+2002-01-25T09:00:00
+2002-01-28T09:00:00
+2002-01-29T09:00:00
+2002-01-30T09:00:00
+2002-01-31T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase57.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase57.ics.prev.ref
new file mode 100644
index 00000000..c234fb95
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase57.ics.prev.ref
@@ -0,0 +1,26 @@
+2002-01-31T09:00:00
+2002-01-30T09:00:00
+2002-01-29T09:00:00
+2002-01-28T09:00:00
+2002-01-25T09:00:00
+2002-01-24T09:00:00
+2002-01-23T09:00:00
+2002-01-22T09:00:00
+2002-01-21T09:00:00
+2002-01-18T09:00:00
+2002-01-17T09:00:00
+2002-01-16T09:00:00
+2002-01-15T09:00:00
+2002-01-14T09:00:00
+2002-01-11T09:00:00
+2002-01-10T09:00:00
+2002-01-09T09:00:00
+2002-01-08T09:00:00
+2002-01-07T09:00:00
+2002-01-04T09:00:00
+2002-01-03T09:00:00
+2002-01-02T09:00:00
+2002-01-01T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase57.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase57.ics.recurson.ref
new file mode 100644
index 00000000..902180ec
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase57.ics.recurson.ref
@@ -0,0 +1,24 @@
+2002-01-01
+2002-01-02
+2002-01-03
+2002-01-04
+2002-01-07
+2002-01-08
+2002-01-09
+2002-01-10
+2002-01-11
+2002-01-14
+2002-01-15
+2002-01-16
+2002-01-17
+2002-01-18
+2002-01-21
+2002-01-22
+2002-01-23
+2002-01-24
+2002-01-25
+2002-01-28
+2002-01-29
+2002-01-30
+2002-01-31
+
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/readme.txt b/libkcal/tests/data/RecurrenceRule/LibICal/readme.txt
new file mode 100644
index 00000000..d1887198
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/readme.txt
@@ -0,0 +1,9 @@
+Some test files that were shipped with libical. They don't have have a
+specific purpose, but server as general tests.
+
+
+Several of the original test cases are moved to other directories of this test suite:
+LibICal_TestCase14.ics: UntilInUTC/Until_TestCase06.ics
+LibICal_TestCase13.ics: UntilInUTC/Until_TestCase05.ics
+LibICal_TestCase47.ics: UntilInUTC/Until_TestCase04.ics
+LibICal_TestCase22.ics: UntilInUTC/Until_TestCase03.ics
diff --git a/libkcal/tests/data/RecurrenceRule/LibICal/recur.ics.saved b/libkcal/tests/data/RecurrenceRule/LibICal/recur.ics.saved
new file mode 100644
index 00000000..723fb3bb
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/LibICal/recur.ics.saved
@@ -0,0 +1,420 @@
+BEGIN:VEVENT
+DESCRIPTION:Repeat every tuesday and wednesday starting Tue 2nd April 2002
+RRULE:FREQ=WEEKLY;INTERVAL=1;COUNT=6;BYDAY=TU,WE
+DTSTART:20020402T114500
+DTEND:20020402T124500
+X-EXPECT-NUMEVENTS: 6
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Repeat every thursday starting Tue 2nd April 2002
+RRULE:FREQ=WEEKLY;INTERVAL=1;COUNT=6;BYDAY=TH
+DTSTART:20020402T114500
+DTEND:20020402T124500
+X-EXPECT-NUMEVENTS: 6
+END:VEVENT
+
+
+BEGIN:VEVENT
+DESCRIPTION:Every year on the same day\, forever
+RRULE:FREQ=YEARLY;INTERVAL=1
+DTSTART:19990201T172000
+DTEND:19990201T182000
+X-EXPECT-NUMEVENTS: 39
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Monday of week number 20 (where the default start of the week is Monday)\,
+ forever:
+DTSTART;TZID=America/Los_Angeles:19970512T090000
+RRULE:FREQ=YEARLY;INTERVAL=1;COUNT=10;BYDAY=MO;BYWEEKNO=20
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+
+
+BEGIN:VEVENT
+DESCRIPTION: Once a Year
+DTSTART;TZID=America/Los_Angeles:20010205T090000
+RRULE:FREQ=YEARLY;INTERVAL=1
+X-EXPECT-NUMEVENTS: 37
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Recur every sunday and tuesday
+RRULE:FREQ=WEEKLY;COUNT=10;INTERVAL=1;BYDAY=SU,TU
+DTSTART:20011216T192500
+DTEND:20011216T202500
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Every first tuesday of the month
+RRULE:FREQ=MONTHLY;INTERVAL=1;COUNT=3;BYDAY=1TU
+DTSTART:20011204T153500
+DTEND:20011204T163500
+X-EXPECT-NUMEVENTS: 3
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Daily for 10 occurrences:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=DAILY;COUNT=10;INTERVAL=1
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Daily until December 24\, 1997:
+DTSTART;TZID=America/Los_Angeles:19971215T090000
+RRULE:FREQ=DAILY;UNTIL=19971224T000000Z;INTERVAL=1
+X-EXPECT-NUMEVENTS: 9
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Every other day - forever:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=DAILY;COUNT=10;INTERVAL=2
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Every 10 days\, 5 occurrences:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=DAILY;COUNT=5;INTERVAL=10
+X-EXPECT-NUMEVENTS: 5
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Daily for 10 occurrences:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=DAILY;COUNT=10;INTERVAL=1
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Every day in January\, for 3 years
+DTSTART;TZID=America/Los_Angeles:19980101T090000
+RRULE:FREQ=YEARLY;UNTIL=20000131T090000Z;INTERVAL=1;BYDAY=SU,MO,TU,WE,TH,FR,SA;BYMONTH=1
+X-EXPECT-NUMEVENTS: 93
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Everyday in January\, for 3 years:
+DTSTART;TZID=America/Los_Angeles:19980101T090000
+RRULE:FREQ=DAILY;UNTIL=20000131T090000Z;INTERVAL=1;BYMONTH=1
+X-EXPECT-NUMEVENTS: 93
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Repeat every tuesday and wednesday starting Tue 2nd April 2002
+RRULE:FREQ=WEEKLY;INTERVAL=1;COUNT=6;BYDAY=TU,WE
+DTSTART:20020402T114500
+DTEND:20020402T124500
+X-EXPECT-NUMEVENTS: 6
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Every Day start the first day in January\, except saturday and sunday. This should be up to March.
+RRULE:FREQ=DAILY;COUNT=50;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR
+DTSTART:20020101T090000Z
+X-EXPECT-NUMEVENTS: 50
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Every Day in January\, but only in Tuesday\, Wednesday and Thursday
+RRULE:FREQ=DAILY;UNTIL=20020120T090000Z;INTERVAL=1;BYDAY=TU,WE,TH
+DTSTART:20020101T090000Z
+X-EXPECT-NUMEVENTS: 9
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Every Day in January\, except saturday and sunday. This is MS Outlook every weekday case.
+RRULE:FREQ=DAILY;UNTIL=20020120T090000Z;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR;WKST=SU
+DTSTART:20020101T090000Z
+X-EXPECT-NUMEVENTS: 14
+END:VEVENT
+
+
+BEGIN:VEVENT
+DESCRIPTION:Weekly for 10 occurrences
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=WEEKLY;COUNT=10;INTERVAL=1
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Weekly until December 24\, 1997
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z;INTERVAL=1
+X-EXPECT-NUMEVENTS: 17
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Every other week - 10 times:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=10
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Weekly on Tuesday and Thursday for 5 weeks:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=WEEKLY;UNTIL=19971007T000000Z;INTERVAL=1;BYDAY=TU,TH
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Weekly on Tuesday and Thursday for 5 weeks:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=WEEKLY;COUNT=10;INTERVAL=1;BYDAY=TU,TH
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Every other week on Monday\, Wednesday and Friday until December
+ 24\,1997\, but starting on Tuesday\, September 2\, 1997:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;BYDAY=MO,WE,FR;WKST=SU
+X-EXPECT-NUMEVENTS: 24
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Every other week on Tuesday and Thursday\, for 8 occurrences:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=WEEKLY;COUNT=8;INTERVAL=2;BYDAY=TU,TH
+X-EXPECT-NUMEVENTS: 8
+END:VEVENT
+
+
+BEGIN:VEVENT
+DESCRIPTION:Monthly on the 1st Friday for ten occurrences:
+DTSTART;TZID=America/Los_Angeles:19970905T090000
+RRULE:FREQ=MONTHLY;COUNT=10;INTERVAL=1;BYDAY=FR
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Monthly on the 1st Friday until December 24\, 1997:
+DTSTART;TZID=America/Los_Angeles:19970905T090000
+RRULE:FREQ=MONTHLY;UNTIL=19971224T000000Z;INTERVAL=1;BYDAY=1FR
+X-EXPECT-NUMEVENTS: 4
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Every other month on the 1st and last Sunday of the month for 10 occurrences:
+DTSTART;TZID=America/Los_Angeles:19970907T090000
+RRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Monthly on the second to last Monday of the month for 6 months:
+DTSTART;TZID=America/Los_Angeles:19970922T090000
+RRULE:FREQ=MONTHLY;COUNT=6;INTERVAL=1;BYDAY=-2MO
+X-EXPECT-NUMEVENTS: 6
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Monthly on the third to the last day of the month\, forever:
+DTSTART;TZID=America/Los_Angeles:19970928T090000
+RRULE:FREQ=MONTHLY;INTERVAL=1;COUNT=10;BYMONTHDAY=-3
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Monthly on the 2nd and 15th of the month for 10 occurrences:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=MONTHLY;COUNT=10;INTERVAL=1;BYMONTHDAY=2,15
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Monthly on the first and last day of the month for 10 occurrences:\n
+DTSTART;TZID=America/Los_Angeles:19970930T090000
+RRULE:FREQ=MONTHLY;COUNT=10;INTERVAL=1;BYMONTHDAY=1,-1
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Every 18 months on the 10th thru 15th of the month for 10 occurrences:
+DTSTART;TZID=America/Los_Angeles:19970910T090000
+RRULE:FREQ=MONTHLY;COUNT=10;INTERVAL=18;BYMONTHDAY=10,11,12,13,14,15
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Every Tuesday\, every other month:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=TU
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Yearly in June and July for 10 occurrences:
+DTSTART;TZID=America/Los_Angeles:19970610T090000
+RRULE:FREQ=YEARLY;COUNT=10;INTERVAL=1;BYMONTH=6,7
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Every other year on January\, February\, and March for 10 occurrences:
+DTSTART;TZID=America/Los_Angeles:19970310T090000
+RRULE:FREQ=YEARLY;COUNT=10;INTERVAL=2;BYMONTH=1,2,3
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Every 3rd year on the 1st\, 100th and 200th day for 10 occurrences:
+DTSTART;TZID=America/Los_Angeles:19970101T090000
+RRULE:FREQ=YEARLY;COUNT=10;INTERVAL=3;BYYEARDAY=1,100,200
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Every 20th Monday of the year\, forever:
+DTSTART;TZID=America/Los_Angeles:19970519T090000
+RRULE:FREQ=YEARLY;INTERVAL=1;COUNT=10;BYDAY=20MO
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Monday of week number 20 (where the default start of the week is Monday)\,
+ forever:
+DTSTART;TZID=America/Los_Angeles:19970512T090000
+RRULE:FREQ=YEARLY;INTERVAL=1;COUNT=10;BYDAY=MO;BYWEEKNO=20
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+
+
+BEGIN:VEVENT
+DESCRIPTION:Every Thursday in March\, forever:
+DTSTART;TZID=America/Los_Angeles:19970313T090000
+RRULE:FREQ=YEARLY;INTERVAL=1;COUNT=10;BYDAY=TH;BYMONTH=3
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Every Thursday\, but only during June\, July\, and August\, forever:
+DTSTART;TZID=America/Los_Angeles:19970605T090000
+RRULE:FREQ=YEARLY;INTERVAL=1;COUNT=10;BYDAY=TH;BYMONTH=6,7,8
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Every Friday the 13th\, forever:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=MONTHLY;INTERVAL=1;COUNT=10;BYDAY=FR;BYMONTHDAY=13
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:The first Saturday that follows the first Sunday of the month\,
+DTSTART;TZID=America/Los_Angeles:19970913T090000
+RRULE:FREQ=MONTHLY;INTERVAL=1;COUNT=10;BYDAY=SA;BYMONTHDAY=7,8,9,10,11,12,13
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Every four years\, the first Tuesday after a Monday in November\,
+ forever (U.S. Presidential Election day):
+DTSTART;TZID=America/Los_Angeles:19961105T090000
+RRULE:FREQ=YEARLY;INTERVAL=4;COUNT=10;BYDAY=TU;BYMONTHDAY=2,3,4,5,6,7,8;BYMONTH=11
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:The 3rd instance into the month of one of Tuesday\, Wednesday or
+ Thursday\, for the next 3 months:
+DTSTART;TZID=America/Los_Angeles:19970904T090000
+RRULE:FREQ=MONTHLY;COUNT=3;INTERVAL=1;BYDAY=TU,WE,TH;BYSETPOS=3
+X-EXPECT-NUMEVENTS: 3
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:The 2nd to last weekday of the month:
+DTSTART;TZID=America/Los_Angeles:19970929T090000
+RRULE:FREQ=MONTHLY;INTERVAL=1;COUNT=10;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Every 3 hours from 9:00 AM to 5:00 PM on a specific day:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=HOURLY;UNTIL=19970902T170000Z;INTERVAL=3
+X-EXPECT-NUMEVENTS: 3
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Every 15 minutes for 6 occurrences:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=MINUTELY;COUNT=6;INTERVAL=15
+X-EXPECT-NUMEVENTS: 6
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Every hour and a half for 4 occurrences:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=MINUTELY;COUNT=4;INTERVAL=90
+X-EXPECT-NUMEVENTS: 4
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Every 20 minutes from 9:00 AM to 4:40 PM every day:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=DAILY;COUNT=20;INTERVAL=1;BYMINUTE=0,20,40;BYHOUR=9,10,11,12,13,14,15,16
+X-EXPECT-NUMEVENTS: 20
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Every 20 minutes from 9:00 AM to 4:40 PM every day:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=MINUTELY;COUNT=20;INTERVAL=20;BYHOUR=9,10,11,12,13,14,15,16
+X-EXPECT-NUMEVENTS: 20
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:An example where the days generated makes a difference because of
+ WKST:
+DTSTART;TZID=America/Los_Angeles:19970805T090000
+RRULE:FREQ=WEEKLY;COUNT=4;INTERVAL=2;BYDAY=TU,SU
+X-EXPECT-NUMEVENTS: 4
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:An example where the days generated makes a difference because of
+ WKST. Changing only WKST from MO to SU yields different results...
+DTSTART;TZID=America/Los_Angeles:19970805T090000
+RRULE:FREQ=WEEKLY;COUNT=4;INTERVAL=2;BYDAY=TU,SU
+X-EXPECT-NUMEVENTS: 4
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Repeat every tuesday and wednesday starting 2 April 2002
+RRULE:FREQ=WEEKLY;INTERVAL=1;COUNT=6;BYDAY=TU,WE
+DTSTART:20020402T114500
+X-EXPECT-NUMEVENTS: 6
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Use count=1 to repeat zero times.
+RRULE:FREQ=DAILY;COUNT=1
+DTSTART:20020402T114500
+X-EXPECT-NUMEVENTS: 1
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Use EXDATE to eliminate the base event
+RRULE:FREQ=DAILY;COUNT=1
+DTSTART:20020402T114500Z
+EXDATE:20020402T114500Z
+X-EXPECT-NUMEVENTS: 0
+END:VEVENT
+
+BEGIN:VEVENT
+DESCRIPTION:Every Day in January\, except saturday and sunday\, using 2 EXRULEs. (NOT IMPLEMENTED)
+RRULE:FREQ=DAILY;INTERVAL=1;UNTIL=20020201T000000Z
+EXRULE:FREQ=WEEKLY;INTERVAL=1;UNTIL=20020201T000000Z;BYDAY=SU
+EXRULE:FREQ=WEEKLY;INTERVAL=1;UNTIL=20020201T000000Z;BYDAY=SA
+DTSTART:20020101T090000Z
+X-EXPECT-NUMEVENTS: 23
+END:VEVENT
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/2445AllExamples.ics.saved b/libkcal/tests/data/RecurrenceRule/RFC2445/2445AllExamples.ics.saved
new file mode 100644
index 00000000..51d9ebfe
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/2445AllExamples.ics.saved
@@ -0,0 +1,367 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Daily for 10 occurrences:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=DAILY;COUNT=10
+SUMMARY:RExample01
+UID:RExample01
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Daily until Dec\, 24 1997
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=DAILY;UNTIL=19971224T000000Z
+SUMMARY:RExample02
+UID:RExample02
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Every other day - forever:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=DAILY;INTERVAL=2
+SUMMARY:RExample03
+UID:RExample03
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Every 10 days\, 5 occurrences:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=DAILY;COUNT=5;INTERVAL=10
+SUMMARY:RExample04
+UID:RExample04
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Everyday in January\, for 3 years:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19980101T090000
+RRULE:FREQ=YEARLY;UNTIL=20000131T090000Z;BYDAY=SU,MO,TU,WE,TH,FR,SA;BYMONT
+ H=1
+SUMMARY:RExample05a
+UID:RExample05a
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Everyday in January\, for 3 years:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19980101T090000
+RRULE:FREQ=DAILY;UNTIL=20000131T090000Z;BYMONTH=1
+SUMMARY:RExample05b
+UID:RExample05b
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Weekly for 10 occurrences
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=WEEKLY;COUNT=10
+SUMMARY:RExample06
+UID:RExample06
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Weekly until December 24\, 1997
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z
+SUMMARY:RExample07
+UID:RExample07
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Every other week - forever:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=WEEKLY;INTERVAL=2;WKST=SU
+SUMMARY:RExample08
+UID:RExample08
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Weekly on Tuesday and Thursday for 5 weeks:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=WEEKLY;UNTIL=19971007T000000Z;BYDAY=TU,TH;WKST=SU
+SUMMARY:RExample09a
+UID:RExample09a
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Weekly on Tuesday and Thursday for 5 weeks:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=WEEKLY;COUNT=10;BYDAY=TU,TH;WKST=SU
+SUMMARY:RExample09b
+UID:RExample09b
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Every other week on Monday\, Wednesday and Friday until Decemb
+ er 24\,1997\, but starting on Tuesday\, September 2\, 1997:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z;INTERVAL=2;BYDAY=MO,WE,FR;WKST=SU
+SUMMARY:RExample10
+UID:RExample10
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Every other week on Tuesday and Thursday\, for 8 occurrences:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=WEEKLY;COUNT=8;INTERVAL=2;BYDAY=TU,TH;WKST=SU
+SUMMARY:RExample11
+UID:RExample11
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Monthly on the 1st Friday for ten occurrences:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970905T090000
+RRULE:FREQ=MONTHLY;COUNT=10;BYDAY=1FR
+SUMMARY:RExample12
+UID:RExample12
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Monthly on the 1st Friday until December 24\, 1997:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970905T090000
+RRULE:FREQ=MONTHLY;UNTIL=19971224T000000Z;BYDAY=1FR
+SUMMARY:RExample13
+UID:RExample13
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Every other month on the 1st and last Sunday of the month for
+ 10occurrences:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970907T090000
+RRULE:FREQ=MONTHLY;COUNT=10;INTERVAL=2;BYDAY=1SU,-1SU
+SUMMARY:RExample14
+UID:RExample14
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Monthly on the second to last Monday of the month for 6 months
+ :
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970922T090000
+RRULE:FREQ=MONTHLY;COUNT=6;BYDAY=-2MO
+SUMMARY:RExample15
+UID:RExample15
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Monthly on the third to the last day of the month\, forever:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970928T090000
+RRULE:FREQ=MONTHLY;BYMONTHDAY=-3
+SUMMARY:RExample16
+UID:RExample16
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Monthly on the 2nd and 15th of the month for 10 occurrences:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=2,15
+SUMMARY:RExample17
+UID:RExample17
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Monthly on the first and last day of the month for 10 occurren
+ ces:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970930T090000
+RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=1,-1
+SUMMARY:RExample18
+UID:RExample18
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Every 18 months on the 10th thru 15th of the month for 10 occu
+ rrences:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970910T090000
+RRULE:FREQ=MONTHLY;COUNT=10;INTERVAL=18;BYMONTHDAY=10,11,12,13,14,15
+SUMMARY:RExample19
+UID:RExample19
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Every Tuesday\, every other month:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=MONTHLY;INTERVAL=2;BYDAY=TU
+SUMMARY:RExample20
+UID:RExample20
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Yearly in June and July for 10 occurrences:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970610T090000
+RRULE:FREQ=YEARLY;COUNT=10;BYMONTH=6,7
+SUMMARY:RExample21
+UID:RExample21
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Every other year on January\, February\, and March for 10 occu
+ rrences:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970310T090000
+RRULE:FREQ=YEARLY;COUNT=10;INTERVAL=2;BYMONTH=1,2,3
+SUMMARY:RExample22
+UID:RExample22
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Every 3rd year on the 1st\, 100th and 200th day for 10 occurre
+ nces:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970101T090000
+RRULE:FREQ=YEARLY;COUNT=10;INTERVAL=3;BYYEARDAY=1,100,200
+SUMMARY:RExample23
+UID:RExample23
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Every 20th Monday of the year\, forever:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970519T090000
+RRULE:FREQ=YEARLY;BYDAY=20MO
+SUMMARY:RExample24
+UID:RExample24
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Monday of week number 20 (where the default start of the week
+ isMonday)\, forever:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970512T090000
+RRULE:FREQ=YEARLY;BYDAY=MO;BYWEEKNO=20
+SUMMARY:RExample25
+UID:RExample25
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Every Thursday in March\, forever:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970313T090000
+RRULE:FREQ=YEARLY;BYDAY=TH;BYMONTH=3
+SUMMARY:RExample26
+UID:RExample26
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Every Thursday\, but only during June\, July\, and August\, fo
+ rever:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970605T090000
+RRULE:FREQ=YEARLY;BYDAY=TH;BYMONTH=6,7,8
+SUMMARY:RExample27
+UID:RExample27
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Every Friday the 13th\, forever:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+EXDATE;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=MONTHLY;BYDAY=FR;BYMONTHDAY=13
+SUMMARY:RExample28
+UID:RExample28
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:The first Saturday that follows the first Sunday of the month\
+ , forever:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970913T090000
+RRULE:FREQ=MONTHLY;BYDAY=SA;BYMONTHDAY=7,8,9,10,11,12,13
+SUMMARY:RExample29
+UID:RExample29
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Every four years\, the first Tuesday after a Monday in Novembe
+ r\,forever (U.S. Presidential Election day):
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19961105T090000
+RRULE:FREQ=YEARLY;INTERVAL=4;BYDAY=TU;BYMONTHDAY=2,3,4,5,6,7,8;BYMONTH=11
+SUMMARY:RExample30
+UID:RExample30
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:The 3rd instance into the month of one of Tuesday\, Wednesday
+ orThursday\, for the next 3 months:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970904T090000
+RRULE:FREQ=MONTHLY;COUNT=3;BYDAY=TU,WE,TH;BYSETPOS=3
+SUMMARY:RExample31
+UID:RExample31
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:The 2nd to last weekday of the month:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970929T090000
+RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2
+SUMMARY:RExample32
+UID:RExample32
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Every 3 hours from 9:00 AM to 5:00 PM on a specific day:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=HOURLY;UNTIL=19970902T170000Z;INTERVAL=3
+SUMMARY:RExample33
+UID:RExample33
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Every 15 minutes for 6 occurrences:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=MINUTELY;COUNT=6;INTERVAL=15
+SUMMARY:RExample34
+UID:RExample34
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Every hour and a half for 4 occurrences:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=MINUTELY;COUNT=4;INTERVAL=90
+SUMMARY:RExample35
+UID:RExample35
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Every 20 minutes from 9:00 AM to 4:40 PM every day:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=DAILY;BYMINUTE=0,20,40;BYHOUR=9,10,11,12,13,14,15,16
+SUMMARY:RExample36a
+UID:RExample36a
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:Every 20 minutes from 9:00 AM to 4:40 PM every day:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=MINUTELY;INTERVAL=20;BYHOUR=9,10,11,12,13,14,15,16
+SUMMARY:RExample36b
+UID:RExample36b
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:An example where the days generated makes a difference because
+ of WKST:
+DTSTAMP:20040102T053656Z
+DTSTART;VALUE=DATE:19970805
+RRULE:FREQ=WEEKLY;COUNT=4;INTERVAL=2;BYDAY=TU,SU
+SUMMARY:RExample37a
+UID:RExample37a
+END:VEVENT
+BEGIN:VEVENT
+DESCRIPTION:changing only WKST from MO to SU\, yields different results...
+DTSTAMP:20040102T053656Z
+DTSTART;VALUE=DATE:19970805
+RRULE:FREQ=WEEKLY;COUNT=4;INTERVAL=2;BYDAY=TU,SU;WKST=SU
+SUMMARY:RExample37b
+UID:RExample37b
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase01.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase01.ics
new file mode 100644
index 00000000..48cc0196
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase01.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Daily for 10 occurrences:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=DAILY;COUNT=10
+SUMMARY:RExample01
+UID:RExample01
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase01.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase01.ics.comp34.ref
new file mode 100644
index 00000000..23442104
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase01.ics.comp34.ref
@@ -0,0 +1,11 @@
+1997-09-02T09:00:00
+1997-09-03T09:00:00
+1997-09-04T09:00:00
+1997-09-05T09:00:00
+1997-09-06T09:00:00
+1997-09-07T09:00:00
+1997-09-08T09:00:00
+1997-09-09T09:00:00
+1997-09-10T09:00:00
+1997-09-11T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase01.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase01.ics.next.ref
new file mode 100644
index 00000000..23442104
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase01.ics.next.ref
@@ -0,0 +1,11 @@
+1997-09-02T09:00:00
+1997-09-03T09:00:00
+1997-09-04T09:00:00
+1997-09-05T09:00:00
+1997-09-06T09:00:00
+1997-09-07T09:00:00
+1997-09-08T09:00:00
+1997-09-09T09:00:00
+1997-09-10T09:00:00
+1997-09-11T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase01.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase01.ics.prev.ref
new file mode 100644
index 00000000..15a7e43d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase01.ics.prev.ref
@@ -0,0 +1,11 @@
+1997-09-11T09:00:00
+1997-09-10T09:00:00
+1997-09-09T09:00:00
+1997-09-08T09:00:00
+1997-09-07T09:00:00
+1997-09-06T09:00:00
+1997-09-05T09:00:00
+1997-09-04T09:00:00
+1997-09-03T09:00:00
+1997-09-02T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase01.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase01.ics.recurson.ref
new file mode 100644
index 00000000..00bc3412
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase01.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-09-02
+1997-09-03
+1997-09-04
+1997-09-05
+1997-09-06
+1997-09-07
+1997-09-08
+1997-09-09
+1997-09-10
+1997-09-11
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase02.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase02.ics
new file mode 100644
index 00000000..1f5827c7
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase02.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Daily until Dec\, 24 1997
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=DAILY;UNTIL=19971224T000000Z
+SUMMARY:RExample02
+UID:RExample02
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase02.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase02.ics.comp34.ref
new file mode 100644
index 00000000..b9248fef
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase02.ics.comp34.ref
@@ -0,0 +1,115 @@
+1997-09-02T09:00:00
+1997-09-03T09:00:00
+1997-09-04T09:00:00
+1997-09-05T09:00:00
+1997-09-06T09:00:00
+1997-09-07T09:00:00
+1997-09-08T09:00:00
+1997-09-09T09:00:00
+1997-09-10T09:00:00
+1997-09-11T09:00:00
+1997-09-12T09:00:00
+1997-09-13T09:00:00
+1997-09-14T09:00:00
+1997-09-15T09:00:00
+1997-09-16T09:00:00
+1997-09-17T09:00:00
+1997-09-18T09:00:00
+1997-09-19T09:00:00
+1997-09-20T09:00:00
+1997-09-21T09:00:00
+1997-09-22T09:00:00
+1997-09-23T09:00:00
+1997-09-24T09:00:00
+1997-09-25T09:00:00
+1997-09-26T09:00:00
+1997-09-27T09:00:00
+1997-09-28T09:00:00
+1997-09-29T09:00:00
+1997-09-30T09:00:00
+1997-10-01T09:00:00
+1997-10-02T09:00:00
+1997-10-03T09:00:00
+1997-10-04T09:00:00
+1997-10-05T09:00:00
+1997-10-06T09:00:00
+1997-10-07T09:00:00
+1997-10-08T09:00:00
+1997-10-09T09:00:00
+1997-10-10T09:00:00
+1997-10-11T09:00:00
+1997-10-12T09:00:00
+1997-10-13T09:00:00
+1997-10-14T09:00:00
+1997-10-15T09:00:00
+1997-10-16T09:00:00
+1997-10-17T09:00:00
+1997-10-18T09:00:00
+1997-10-19T09:00:00
+1997-10-20T09:00:00
+1997-10-21T09:00:00
+1997-10-22T09:00:00
+1997-10-23T09:00:00
+1997-10-24T09:00:00
+1997-10-25T09:00:00
+1997-10-26T09:00:00
+1997-10-27T09:00:00
+1997-10-28T09:00:00
+1997-10-29T09:00:00
+1997-10-30T09:00:00
+1997-10-31T09:00:00
+1997-11-01T09:00:00
+1997-11-02T09:00:00
+1997-11-03T09:00:00
+1997-11-04T09:00:00
+1997-11-05T09:00:00
+1997-11-06T09:00:00
+1997-11-07T09:00:00
+1997-11-08T09:00:00
+1997-11-09T09:00:00
+1997-11-10T09:00:00
+1997-11-11T09:00:00
+1997-11-12T09:00:00
+1997-11-13T09:00:00
+1997-11-14T09:00:00
+1997-11-15T09:00:00
+1997-11-16T09:00:00
+1997-11-17T09:00:00
+1997-11-18T09:00:00
+1997-11-19T09:00:00
+1997-11-20T09:00:00
+1997-11-21T09:00:00
+1997-11-22T09:00:00
+1997-11-23T09:00:00
+1997-11-24T09:00:00
+1997-11-25T09:00:00
+1997-11-26T09:00:00
+1997-11-27T09:00:00
+1997-11-28T09:00:00
+1997-11-29T09:00:00
+1997-11-30T09:00:00
+1997-12-01T09:00:00
+1997-12-02T09:00:00
+1997-12-03T09:00:00
+1997-12-04T09:00:00
+1997-12-05T09:00:00
+1997-12-06T09:00:00
+1997-12-07T09:00:00
+1997-12-08T09:00:00
+1997-12-09T09:00:00
+1997-12-10T09:00:00
+1997-12-11T09:00:00
+1997-12-12T09:00:00
+1997-12-13T09:00:00
+1997-12-14T09:00:00
+1997-12-15T09:00:00
+1997-12-16T09:00:00
+1997-12-17T09:00:00
+1997-12-18T09:00:00
+1997-12-19T09:00:00
+1997-12-20T09:00:00
+1997-12-21T09:00:00
+1997-12-22T09:00:00
+1997-12-23T09:00:00
+1997-12-24T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase02.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase02.ics.next.ref
new file mode 100644
index 00000000..85264382
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase02.ics.next.ref
@@ -0,0 +1,114 @@
+1997-09-02T09:00:00
+1997-09-03T09:00:00
+1997-09-04T09:00:00
+1997-09-05T09:00:00
+1997-09-06T09:00:00
+1997-09-07T09:00:00
+1997-09-08T09:00:00
+1997-09-09T09:00:00
+1997-09-10T09:00:00
+1997-09-11T09:00:00
+1997-09-12T09:00:00
+1997-09-13T09:00:00
+1997-09-14T09:00:00
+1997-09-15T09:00:00
+1997-09-16T09:00:00
+1997-09-17T09:00:00
+1997-09-18T09:00:00
+1997-09-19T09:00:00
+1997-09-20T09:00:00
+1997-09-21T09:00:00
+1997-09-22T09:00:00
+1997-09-23T09:00:00
+1997-09-24T09:00:00
+1997-09-25T09:00:00
+1997-09-26T09:00:00
+1997-09-27T09:00:00
+1997-09-28T09:00:00
+1997-09-29T09:00:00
+1997-09-30T09:00:00
+1997-10-01T09:00:00
+1997-10-02T09:00:00
+1997-10-03T09:00:00
+1997-10-04T09:00:00
+1997-10-05T09:00:00
+1997-10-06T09:00:00
+1997-10-07T09:00:00
+1997-10-08T09:00:00
+1997-10-09T09:00:00
+1997-10-10T09:00:00
+1997-10-11T09:00:00
+1997-10-12T09:00:00
+1997-10-13T09:00:00
+1997-10-14T09:00:00
+1997-10-15T09:00:00
+1997-10-16T09:00:00
+1997-10-17T09:00:00
+1997-10-18T09:00:00
+1997-10-19T09:00:00
+1997-10-20T09:00:00
+1997-10-21T09:00:00
+1997-10-22T09:00:00
+1997-10-23T09:00:00
+1997-10-24T09:00:00
+1997-10-25T09:00:00
+1997-10-26T09:00:00
+1997-10-27T09:00:00
+1997-10-28T09:00:00
+1997-10-29T09:00:00
+1997-10-30T09:00:00
+1997-10-31T09:00:00
+1997-11-01T09:00:00
+1997-11-02T09:00:00
+1997-11-03T09:00:00
+1997-11-04T09:00:00
+1997-11-05T09:00:00
+1997-11-06T09:00:00
+1997-11-07T09:00:00
+1997-11-08T09:00:00
+1997-11-09T09:00:00
+1997-11-10T09:00:00
+1997-11-11T09:00:00
+1997-11-12T09:00:00
+1997-11-13T09:00:00
+1997-11-14T09:00:00
+1997-11-15T09:00:00
+1997-11-16T09:00:00
+1997-11-17T09:00:00
+1997-11-18T09:00:00
+1997-11-19T09:00:00
+1997-11-20T09:00:00
+1997-11-21T09:00:00
+1997-11-22T09:00:00
+1997-11-23T09:00:00
+1997-11-24T09:00:00
+1997-11-25T09:00:00
+1997-11-26T09:00:00
+1997-11-27T09:00:00
+1997-11-28T09:00:00
+1997-11-29T09:00:00
+1997-11-30T09:00:00
+1997-12-01T09:00:00
+1997-12-02T09:00:00
+1997-12-03T09:00:00
+1997-12-04T09:00:00
+1997-12-05T09:00:00
+1997-12-06T09:00:00
+1997-12-07T09:00:00
+1997-12-08T09:00:00
+1997-12-09T09:00:00
+1997-12-10T09:00:00
+1997-12-11T09:00:00
+1997-12-12T09:00:00
+1997-12-13T09:00:00
+1997-12-14T09:00:00
+1997-12-15T09:00:00
+1997-12-16T09:00:00
+1997-12-17T09:00:00
+1997-12-18T09:00:00
+1997-12-19T09:00:00
+1997-12-20T09:00:00
+1997-12-21T09:00:00
+1997-12-22T09:00:00
+1997-12-23T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase02.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase02.ics.prev.ref
new file mode 100644
index 00000000..55ec4ce0
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase02.ics.prev.ref
@@ -0,0 +1,114 @@
+1997-12-23T09:00:00
+1997-12-22T09:00:00
+1997-12-21T09:00:00
+1997-12-20T09:00:00
+1997-12-19T09:00:00
+1997-12-18T09:00:00
+1997-12-17T09:00:00
+1997-12-16T09:00:00
+1997-12-15T09:00:00
+1997-12-14T09:00:00
+1997-12-13T09:00:00
+1997-12-12T09:00:00
+1997-12-11T09:00:00
+1997-12-10T09:00:00
+1997-12-09T09:00:00
+1997-12-08T09:00:00
+1997-12-07T09:00:00
+1997-12-06T09:00:00
+1997-12-05T09:00:00
+1997-12-04T09:00:00
+1997-12-03T09:00:00
+1997-12-02T09:00:00
+1997-12-01T09:00:00
+1997-11-30T09:00:00
+1997-11-29T09:00:00
+1997-11-28T09:00:00
+1997-11-27T09:00:00
+1997-11-26T09:00:00
+1997-11-25T09:00:00
+1997-11-24T09:00:00
+1997-11-23T09:00:00
+1997-11-22T09:00:00
+1997-11-21T09:00:00
+1997-11-20T09:00:00
+1997-11-19T09:00:00
+1997-11-18T09:00:00
+1997-11-17T09:00:00
+1997-11-16T09:00:00
+1997-11-15T09:00:00
+1997-11-14T09:00:00
+1997-11-13T09:00:00
+1997-11-12T09:00:00
+1997-11-11T09:00:00
+1997-11-10T09:00:00
+1997-11-09T09:00:00
+1997-11-08T09:00:00
+1997-11-07T09:00:00
+1997-11-06T09:00:00
+1997-11-05T09:00:00
+1997-11-04T09:00:00
+1997-11-03T09:00:00
+1997-11-02T09:00:00
+1997-11-01T09:00:00
+1997-10-31T09:00:00
+1997-10-30T09:00:00
+1997-10-29T09:00:00
+1997-10-28T09:00:00
+1997-10-27T09:00:00
+1997-10-26T09:00:00
+1997-10-25T09:00:00
+1997-10-24T09:00:00
+1997-10-23T09:00:00
+1997-10-22T09:00:00
+1997-10-21T09:00:00
+1997-10-20T09:00:00
+1997-10-19T09:00:00
+1997-10-18T09:00:00
+1997-10-17T09:00:00
+1997-10-16T09:00:00
+1997-10-15T09:00:00
+1997-10-14T09:00:00
+1997-10-13T09:00:00
+1997-10-12T09:00:00
+1997-10-11T09:00:00
+1997-10-10T09:00:00
+1997-10-09T09:00:00
+1997-10-08T09:00:00
+1997-10-07T09:00:00
+1997-10-06T09:00:00
+1997-10-05T09:00:00
+1997-10-04T09:00:00
+1997-10-03T09:00:00
+1997-10-02T09:00:00
+1997-10-01T09:00:00
+1997-09-30T09:00:00
+1997-09-29T09:00:00
+1997-09-28T09:00:00
+1997-09-27T09:00:00
+1997-09-26T09:00:00
+1997-09-25T09:00:00
+1997-09-24T09:00:00
+1997-09-23T09:00:00
+1997-09-22T09:00:00
+1997-09-21T09:00:00
+1997-09-20T09:00:00
+1997-09-19T09:00:00
+1997-09-18T09:00:00
+1997-09-17T09:00:00
+1997-09-16T09:00:00
+1997-09-15T09:00:00
+1997-09-14T09:00:00
+1997-09-13T09:00:00
+1997-09-12T09:00:00
+1997-09-11T09:00:00
+1997-09-10T09:00:00
+1997-09-09T09:00:00
+1997-09-08T09:00:00
+1997-09-07T09:00:00
+1997-09-06T09:00:00
+1997-09-05T09:00:00
+1997-09-04T09:00:00
+1997-09-03T09:00:00
+1997-09-02T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase02.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase02.ics.recurson.ref
new file mode 100644
index 00000000..8f5962e8
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase02.ics.recurson.ref
@@ -0,0 +1,114 @@
+1997-09-02
+1997-09-03
+1997-09-04
+1997-09-05
+1997-09-06
+1997-09-07
+1997-09-08
+1997-09-09
+1997-09-10
+1997-09-11
+1997-09-12
+1997-09-13
+1997-09-14
+1997-09-15
+1997-09-16
+1997-09-17
+1997-09-18
+1997-09-19
+1997-09-20
+1997-09-21
+1997-09-22
+1997-09-23
+1997-09-24
+1997-09-25
+1997-09-26
+1997-09-27
+1997-09-28
+1997-09-29
+1997-09-30
+1997-10-01
+1997-10-02
+1997-10-03
+1997-10-04
+1997-10-05
+1997-10-06
+1997-10-07
+1997-10-08
+1997-10-09
+1997-10-10
+1997-10-11
+1997-10-12
+1997-10-13
+1997-10-14
+1997-10-15
+1997-10-16
+1997-10-17
+1997-10-18
+1997-10-19
+1997-10-20
+1997-10-21
+1997-10-22
+1997-10-23
+1997-10-24
+1997-10-25
+1997-10-26
+1997-10-27
+1997-10-28
+1997-10-29
+1997-10-30
+1997-10-31
+1997-11-01
+1997-11-02
+1997-11-03
+1997-11-04
+1997-11-05
+1997-11-06
+1997-11-07
+1997-11-08
+1997-11-09
+1997-11-10
+1997-11-11
+1997-11-12
+1997-11-13
+1997-11-14
+1997-11-15
+1997-11-16
+1997-11-17
+1997-11-18
+1997-11-19
+1997-11-20
+1997-11-21
+1997-11-22
+1997-11-23
+1997-11-24
+1997-11-25
+1997-11-26
+1997-11-27
+1997-11-28
+1997-11-29
+1997-11-30
+1997-12-01
+1997-12-02
+1997-12-03
+1997-12-04
+1997-12-05
+1997-12-06
+1997-12-07
+1997-12-08
+1997-12-09
+1997-12-10
+1997-12-11
+1997-12-12
+1997-12-13
+1997-12-14
+1997-12-15
+1997-12-16
+1997-12-17
+1997-12-18
+1997-12-19
+1997-12-20
+1997-12-21
+1997-12-22
+1997-12-23
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase03.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase03.ics
new file mode 100644
index 00000000..53851cff
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase03.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Every other day - forever:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=DAILY;INTERVAL=2
+SUMMARY:RExample03
+UID:RExample03
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase03.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase03.ics.comp34.ref
new file mode 100644
index 00000000..936f574f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase03.ics.comp34.ref
@@ -0,0 +1,500 @@
+1997-09-02T09:00:00
+1997-09-04T09:00:00
+1997-09-06T09:00:00
+1997-09-08T09:00:00
+1997-09-10T09:00:00
+1997-09-12T09:00:00
+1997-09-14T09:00:00
+1997-09-16T09:00:00
+1997-09-18T09:00:00
+1997-09-20T09:00:00
+1997-09-22T09:00:00
+1997-09-24T09:00:00
+1997-09-26T09:00:00
+1997-09-28T09:00:00
+1997-09-30T09:00:00
+1997-10-02T09:00:00
+1997-10-04T09:00:00
+1997-10-06T09:00:00
+1997-10-08T09:00:00
+1997-10-10T09:00:00
+1997-10-12T09:00:00
+1997-10-14T09:00:00
+1997-10-16T09:00:00
+1997-10-18T09:00:00
+1997-10-20T09:00:00
+1997-10-22T09:00:00
+1997-10-24T09:00:00
+1997-10-26T09:00:00
+1997-10-28T09:00:00
+1997-10-30T09:00:00
+1997-11-01T09:00:00
+1997-11-03T09:00:00
+1997-11-05T09:00:00
+1997-11-07T09:00:00
+1997-11-09T09:00:00
+1997-11-11T09:00:00
+1997-11-13T09:00:00
+1997-11-15T09:00:00
+1997-11-17T09:00:00
+1997-11-19T09:00:00
+1997-11-21T09:00:00
+1997-11-23T09:00:00
+1997-11-25T09:00:00
+1997-11-27T09:00:00
+1997-11-29T09:00:00
+1997-12-01T09:00:00
+1997-12-03T09:00:00
+1997-12-05T09:00:00
+1997-12-07T09:00:00
+1997-12-09T09:00:00
+1997-12-11T09:00:00
+1997-12-13T09:00:00
+1997-12-15T09:00:00
+1997-12-17T09:00:00
+1997-12-19T09:00:00
+1997-12-21T09:00:00
+1997-12-23T09:00:00
+1997-12-25T09:00:00
+1997-12-27T09:00:00
+1997-12-29T09:00:00
+1997-12-31T09:00:00
+1998-01-02T09:00:00
+1998-01-04T09:00:00
+1998-01-06T09:00:00
+1998-01-08T09:00:00
+1998-01-10T09:00:00
+1998-01-12T09:00:00
+1998-01-14T09:00:00
+1998-01-16T09:00:00
+1998-01-18T09:00:00
+1998-01-20T09:00:00
+1998-01-22T09:00:00
+1998-01-24T09:00:00
+1998-01-26T09:00:00
+1998-01-28T09:00:00
+1998-01-30T09:00:00
+1998-02-01T09:00:00
+1998-02-03T09:00:00
+1998-02-05T09:00:00
+1998-02-07T09:00:00
+1998-02-09T09:00:00
+1998-02-11T09:00:00
+1998-02-13T09:00:00
+1998-02-15T09:00:00
+1998-02-17T09:00:00
+1998-02-19T09:00:00
+1998-02-21T09:00:00
+1998-02-23T09:00:00
+1998-02-25T09:00:00
+1998-02-27T09:00:00
+1998-03-01T09:00:00
+1998-03-03T09:00:00
+1998-03-05T09:00:00
+1998-03-07T09:00:00
+1998-03-09T09:00:00
+1998-03-11T09:00:00
+1998-03-13T09:00:00
+1998-03-15T09:00:00
+1998-03-17T09:00:00
+1998-03-19T09:00:00
+1998-03-21T09:00:00
+1998-03-23T09:00:00
+1998-03-25T09:00:00
+1998-03-27T09:00:00
+1998-03-29T09:00:00
+1998-03-31T09:00:00
+1998-04-02T09:00:00
+1998-04-04T09:00:00
+1998-04-06T09:00:00
+1998-04-08T09:00:00
+1998-04-10T09:00:00
+1998-04-12T09:00:00
+1998-04-14T09:00:00
+1998-04-16T09:00:00
+1998-04-18T09:00:00
+1998-04-20T09:00:00
+1998-04-22T09:00:00
+1998-04-24T09:00:00
+1998-04-26T09:00:00
+1998-04-28T09:00:00
+1998-04-30T09:00:00
+1998-05-02T09:00:00
+1998-05-04T09:00:00
+1998-05-06T09:00:00
+1998-05-08T09:00:00
+1998-05-10T09:00:00
+1998-05-12T09:00:00
+1998-05-14T09:00:00
+1998-05-16T09:00:00
+1998-05-18T09:00:00
+1998-05-20T09:00:00
+1998-05-22T09:00:00
+1998-05-24T09:00:00
+1998-05-26T09:00:00
+1998-05-28T09:00:00
+1998-05-30T09:00:00
+1998-06-01T09:00:00
+1998-06-03T09:00:00
+1998-06-05T09:00:00
+1998-06-07T09:00:00
+1998-06-09T09:00:00
+1998-06-11T09:00:00
+1998-06-13T09:00:00
+1998-06-15T09:00:00
+1998-06-17T09:00:00
+1998-06-19T09:00:00
+1998-06-21T09:00:00
+1998-06-23T09:00:00
+1998-06-25T09:00:00
+1998-06-27T09:00:00
+1998-06-29T09:00:00
+1998-07-01T09:00:00
+1998-07-03T09:00:00
+1998-07-05T09:00:00
+1998-07-07T09:00:00
+1998-07-09T09:00:00
+1998-07-11T09:00:00
+1998-07-13T09:00:00
+1998-07-15T09:00:00
+1998-07-17T09:00:00
+1998-07-19T09:00:00
+1998-07-21T09:00:00
+1998-07-23T09:00:00
+1998-07-25T09:00:00
+1998-07-27T09:00:00
+1998-07-29T09:00:00
+1998-07-31T09:00:00
+1998-08-02T09:00:00
+1998-08-04T09:00:00
+1998-08-06T09:00:00
+1998-08-08T09:00:00
+1998-08-10T09:00:00
+1998-08-12T09:00:00
+1998-08-14T09:00:00
+1998-08-16T09:00:00
+1998-08-18T09:00:00
+1998-08-20T09:00:00
+1998-08-22T09:00:00
+1998-08-24T09:00:00
+1998-08-26T09:00:00
+1998-08-28T09:00:00
+1998-08-30T09:00:00
+1998-09-01T09:00:00
+1998-09-03T09:00:00
+1998-09-05T09:00:00
+1998-09-07T09:00:00
+1998-09-09T09:00:00
+1998-09-11T09:00:00
+1998-09-13T09:00:00
+1998-09-15T09:00:00
+1998-09-17T09:00:00
+1998-09-19T09:00:00
+1998-09-21T09:00:00
+1998-09-23T09:00:00
+1998-09-25T09:00:00
+1998-09-27T09:00:00
+1998-09-29T09:00:00
+1998-10-01T09:00:00
+1998-10-03T09:00:00
+1998-10-05T09:00:00
+1998-10-07T09:00:00
+1998-10-09T09:00:00
+1998-10-11T09:00:00
+1998-10-13T09:00:00
+1998-10-15T09:00:00
+1998-10-17T09:00:00
+1998-10-19T09:00:00
+1998-10-21T09:00:00
+1998-10-23T09:00:00
+1998-10-25T09:00:00
+1998-10-27T09:00:00
+1998-10-29T09:00:00
+1998-10-31T09:00:00
+1998-11-02T09:00:00
+1998-11-04T09:00:00
+1998-11-06T09:00:00
+1998-11-08T09:00:00
+1998-11-10T09:00:00
+1998-11-12T09:00:00
+1998-11-14T09:00:00
+1998-11-16T09:00:00
+1998-11-18T09:00:00
+1998-11-20T09:00:00
+1998-11-22T09:00:00
+1998-11-24T09:00:00
+1998-11-26T09:00:00
+1998-11-28T09:00:00
+1998-11-30T09:00:00
+1998-12-02T09:00:00
+1998-12-04T09:00:00
+1998-12-06T09:00:00
+1998-12-08T09:00:00
+1998-12-10T09:00:00
+1998-12-12T09:00:00
+1998-12-14T09:00:00
+1998-12-16T09:00:00
+1998-12-18T09:00:00
+1998-12-20T09:00:00
+1998-12-22T09:00:00
+1998-12-24T09:00:00
+1998-12-26T09:00:00
+1998-12-28T09:00:00
+1998-12-30T09:00:00
+1999-01-01T09:00:00
+1999-01-03T09:00:00
+1999-01-05T09:00:00
+1999-01-07T09:00:00
+1999-01-09T09:00:00
+1999-01-11T09:00:00
+1999-01-13T09:00:00
+1999-01-15T09:00:00
+1999-01-17T09:00:00
+1999-01-19T09:00:00
+1999-01-21T09:00:00
+1999-01-23T09:00:00
+1999-01-25T09:00:00
+1999-01-27T09:00:00
+1999-01-29T09:00:00
+1999-01-31T09:00:00
+1999-02-02T09:00:00
+1999-02-04T09:00:00
+1999-02-06T09:00:00
+1999-02-08T09:00:00
+1999-02-10T09:00:00
+1999-02-12T09:00:00
+1999-02-14T09:00:00
+1999-02-16T09:00:00
+1999-02-18T09:00:00
+1999-02-20T09:00:00
+1999-02-22T09:00:00
+1999-02-24T09:00:00
+1999-02-26T09:00:00
+1999-02-28T09:00:00
+1999-03-02T09:00:00
+1999-03-04T09:00:00
+1999-03-06T09:00:00
+1999-03-08T09:00:00
+1999-03-10T09:00:00
+1999-03-12T09:00:00
+1999-03-14T09:00:00
+1999-03-16T09:00:00
+1999-03-18T09:00:00
+1999-03-20T09:00:00
+1999-03-22T09:00:00
+1999-03-24T09:00:00
+1999-03-26T09:00:00
+1999-03-28T09:00:00
+1999-03-30T09:00:00
+1999-04-01T09:00:00
+1999-04-03T09:00:00
+1999-04-05T09:00:00
+1999-04-07T09:00:00
+1999-04-09T09:00:00
+1999-04-11T09:00:00
+1999-04-13T09:00:00
+1999-04-15T09:00:00
+1999-04-17T09:00:00
+1999-04-19T09:00:00
+1999-04-21T09:00:00
+1999-04-23T09:00:00
+1999-04-25T09:00:00
+1999-04-27T09:00:00
+1999-04-29T09:00:00
+1999-05-01T09:00:00
+1999-05-03T09:00:00
+1999-05-05T09:00:00
+1999-05-07T09:00:00
+1999-05-09T09:00:00
+1999-05-11T09:00:00
+1999-05-13T09:00:00
+1999-05-15T09:00:00
+1999-05-17T09:00:00
+1999-05-19T09:00:00
+1999-05-21T09:00:00
+1999-05-23T09:00:00
+1999-05-25T09:00:00
+1999-05-27T09:00:00
+1999-05-29T09:00:00
+1999-05-31T09:00:00
+1999-06-02T09:00:00
+1999-06-04T09:00:00
+1999-06-06T09:00:00
+1999-06-08T09:00:00
+1999-06-10T09:00:00
+1999-06-12T09:00:00
+1999-06-14T09:00:00
+1999-06-16T09:00:00
+1999-06-18T09:00:00
+1999-06-20T09:00:00
+1999-06-22T09:00:00
+1999-06-24T09:00:00
+1999-06-26T09:00:00
+1999-06-28T09:00:00
+1999-06-30T09:00:00
+1999-07-02T09:00:00
+1999-07-04T09:00:00
+1999-07-06T09:00:00
+1999-07-08T09:00:00
+1999-07-10T09:00:00
+1999-07-12T09:00:00
+1999-07-14T09:00:00
+1999-07-16T09:00:00
+1999-07-18T09:00:00
+1999-07-20T09:00:00
+1999-07-22T09:00:00
+1999-07-24T09:00:00
+1999-07-26T09:00:00
+1999-07-28T09:00:00
+1999-07-30T09:00:00
+1999-08-01T09:00:00
+1999-08-03T09:00:00
+1999-08-05T09:00:00
+1999-08-07T09:00:00
+1999-08-09T09:00:00
+1999-08-11T09:00:00
+1999-08-13T09:00:00
+1999-08-15T09:00:00
+1999-08-17T09:00:00
+1999-08-19T09:00:00
+1999-08-21T09:00:00
+1999-08-23T09:00:00
+1999-08-25T09:00:00
+1999-08-27T09:00:00
+1999-08-29T09:00:00
+1999-08-31T09:00:00
+1999-09-02T09:00:00
+1999-09-04T09:00:00
+1999-09-06T09:00:00
+1999-09-08T09:00:00
+1999-09-10T09:00:00
+1999-09-12T09:00:00
+1999-09-14T09:00:00
+1999-09-16T09:00:00
+1999-09-18T09:00:00
+1999-09-20T09:00:00
+1999-09-22T09:00:00
+1999-09-24T09:00:00
+1999-09-26T09:00:00
+1999-09-28T09:00:00
+1999-09-30T09:00:00
+1999-10-02T09:00:00
+1999-10-04T09:00:00
+1999-10-06T09:00:00
+1999-10-08T09:00:00
+1999-10-10T09:00:00
+1999-10-12T09:00:00
+1999-10-14T09:00:00
+1999-10-16T09:00:00
+1999-10-18T09:00:00
+1999-10-20T09:00:00
+1999-10-22T09:00:00
+1999-10-24T09:00:00
+1999-10-26T09:00:00
+1999-10-28T09:00:00
+1999-10-30T09:00:00
+1999-11-01T09:00:00
+1999-11-03T09:00:00
+1999-11-05T09:00:00
+1999-11-07T09:00:00
+1999-11-09T09:00:00
+1999-11-11T09:00:00
+1999-11-13T09:00:00
+1999-11-15T09:00:00
+1999-11-17T09:00:00
+1999-11-19T09:00:00
+1999-11-21T09:00:00
+1999-11-23T09:00:00
+1999-11-25T09:00:00
+1999-11-27T09:00:00
+1999-11-29T09:00:00
+1999-12-01T09:00:00
+1999-12-03T09:00:00
+1999-12-05T09:00:00
+1999-12-07T09:00:00
+1999-12-09T09:00:00
+1999-12-11T09:00:00
+1999-12-13T09:00:00
+1999-12-15T09:00:00
+1999-12-17T09:00:00
+1999-12-19T09:00:00
+1999-12-21T09:00:00
+1999-12-23T09:00:00
+1999-12-25T09:00:00
+1999-12-27T09:00:00
+1999-12-29T09:00:00
+1999-12-31T09:00:00
+2000-01-02T09:00:00
+2000-01-04T09:00:00
+2000-01-06T09:00:00
+2000-01-08T09:00:00
+2000-01-10T09:00:00
+2000-01-12T09:00:00
+2000-01-14T09:00:00
+2000-01-16T09:00:00
+2000-01-18T09:00:00
+2000-01-20T09:00:00
+2000-01-22T09:00:00
+2000-01-24T09:00:00
+2000-01-26T09:00:00
+2000-01-28T09:00:00
+2000-01-30T09:00:00
+2000-02-01T09:00:00
+2000-02-03T09:00:00
+2000-02-05T09:00:00
+2000-02-07T09:00:00
+2000-02-09T09:00:00
+2000-02-11T09:00:00
+2000-02-13T09:00:00
+2000-02-15T09:00:00
+2000-02-17T09:00:00
+2000-02-19T09:00:00
+2000-02-21T09:00:00
+2000-02-23T09:00:00
+2000-02-25T09:00:00
+2000-02-27T09:00:00
+2000-02-29T09:00:00
+2000-03-02T09:00:00
+2000-03-04T09:00:00
+2000-03-06T09:00:00
+2000-03-08T09:00:00
+2000-03-10T09:00:00
+2000-03-12T09:00:00
+2000-03-14T09:00:00
+2000-03-16T09:00:00
+2000-03-18T09:00:00
+2000-03-20T09:00:00
+2000-03-22T09:00:00
+2000-03-24T09:00:00
+2000-03-26T09:00:00
+2000-03-28T09:00:00
+2000-03-30T09:00:00
+2000-04-01T09:00:00
+2000-04-03T09:00:00
+2000-04-05T09:00:00
+2000-04-07T09:00:00
+2000-04-09T09:00:00
+2000-04-11T09:00:00
+2000-04-13T09:00:00
+2000-04-15T09:00:00
+2000-04-17T09:00:00
+2000-04-19T09:00:00
+2000-04-21T09:00:00
+2000-04-23T09:00:00
+2000-04-25T09:00:00
+2000-04-27T09:00:00
+2000-04-29T09:00:00
+2000-05-01T09:00:00
+2000-05-03T09:00:00
+2000-05-05T09:00:00
+2000-05-07T09:00:00
+2000-05-09T09:00:00
+2000-05-11T09:00:00
+2000-05-13T09:00:00
+2000-05-15T09:00:00
+2000-05-17T09:00:00
+2000-05-19T09:00:00
+2000-05-21T09:00:00
+2000-05-23T09:00:00
+2000-05-25T09:00:00
+2000-05-27T09:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase03.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase03.ics.next.ref
new file mode 100644
index 00000000..936f574f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase03.ics.next.ref
@@ -0,0 +1,500 @@
+1997-09-02T09:00:00
+1997-09-04T09:00:00
+1997-09-06T09:00:00
+1997-09-08T09:00:00
+1997-09-10T09:00:00
+1997-09-12T09:00:00
+1997-09-14T09:00:00
+1997-09-16T09:00:00
+1997-09-18T09:00:00
+1997-09-20T09:00:00
+1997-09-22T09:00:00
+1997-09-24T09:00:00
+1997-09-26T09:00:00
+1997-09-28T09:00:00
+1997-09-30T09:00:00
+1997-10-02T09:00:00
+1997-10-04T09:00:00
+1997-10-06T09:00:00
+1997-10-08T09:00:00
+1997-10-10T09:00:00
+1997-10-12T09:00:00
+1997-10-14T09:00:00
+1997-10-16T09:00:00
+1997-10-18T09:00:00
+1997-10-20T09:00:00
+1997-10-22T09:00:00
+1997-10-24T09:00:00
+1997-10-26T09:00:00
+1997-10-28T09:00:00
+1997-10-30T09:00:00
+1997-11-01T09:00:00
+1997-11-03T09:00:00
+1997-11-05T09:00:00
+1997-11-07T09:00:00
+1997-11-09T09:00:00
+1997-11-11T09:00:00
+1997-11-13T09:00:00
+1997-11-15T09:00:00
+1997-11-17T09:00:00
+1997-11-19T09:00:00
+1997-11-21T09:00:00
+1997-11-23T09:00:00
+1997-11-25T09:00:00
+1997-11-27T09:00:00
+1997-11-29T09:00:00
+1997-12-01T09:00:00
+1997-12-03T09:00:00
+1997-12-05T09:00:00
+1997-12-07T09:00:00
+1997-12-09T09:00:00
+1997-12-11T09:00:00
+1997-12-13T09:00:00
+1997-12-15T09:00:00
+1997-12-17T09:00:00
+1997-12-19T09:00:00
+1997-12-21T09:00:00
+1997-12-23T09:00:00
+1997-12-25T09:00:00
+1997-12-27T09:00:00
+1997-12-29T09:00:00
+1997-12-31T09:00:00
+1998-01-02T09:00:00
+1998-01-04T09:00:00
+1998-01-06T09:00:00
+1998-01-08T09:00:00
+1998-01-10T09:00:00
+1998-01-12T09:00:00
+1998-01-14T09:00:00
+1998-01-16T09:00:00
+1998-01-18T09:00:00
+1998-01-20T09:00:00
+1998-01-22T09:00:00
+1998-01-24T09:00:00
+1998-01-26T09:00:00
+1998-01-28T09:00:00
+1998-01-30T09:00:00
+1998-02-01T09:00:00
+1998-02-03T09:00:00
+1998-02-05T09:00:00
+1998-02-07T09:00:00
+1998-02-09T09:00:00
+1998-02-11T09:00:00
+1998-02-13T09:00:00
+1998-02-15T09:00:00
+1998-02-17T09:00:00
+1998-02-19T09:00:00
+1998-02-21T09:00:00
+1998-02-23T09:00:00
+1998-02-25T09:00:00
+1998-02-27T09:00:00
+1998-03-01T09:00:00
+1998-03-03T09:00:00
+1998-03-05T09:00:00
+1998-03-07T09:00:00
+1998-03-09T09:00:00
+1998-03-11T09:00:00
+1998-03-13T09:00:00
+1998-03-15T09:00:00
+1998-03-17T09:00:00
+1998-03-19T09:00:00
+1998-03-21T09:00:00
+1998-03-23T09:00:00
+1998-03-25T09:00:00
+1998-03-27T09:00:00
+1998-03-29T09:00:00
+1998-03-31T09:00:00
+1998-04-02T09:00:00
+1998-04-04T09:00:00
+1998-04-06T09:00:00
+1998-04-08T09:00:00
+1998-04-10T09:00:00
+1998-04-12T09:00:00
+1998-04-14T09:00:00
+1998-04-16T09:00:00
+1998-04-18T09:00:00
+1998-04-20T09:00:00
+1998-04-22T09:00:00
+1998-04-24T09:00:00
+1998-04-26T09:00:00
+1998-04-28T09:00:00
+1998-04-30T09:00:00
+1998-05-02T09:00:00
+1998-05-04T09:00:00
+1998-05-06T09:00:00
+1998-05-08T09:00:00
+1998-05-10T09:00:00
+1998-05-12T09:00:00
+1998-05-14T09:00:00
+1998-05-16T09:00:00
+1998-05-18T09:00:00
+1998-05-20T09:00:00
+1998-05-22T09:00:00
+1998-05-24T09:00:00
+1998-05-26T09:00:00
+1998-05-28T09:00:00
+1998-05-30T09:00:00
+1998-06-01T09:00:00
+1998-06-03T09:00:00
+1998-06-05T09:00:00
+1998-06-07T09:00:00
+1998-06-09T09:00:00
+1998-06-11T09:00:00
+1998-06-13T09:00:00
+1998-06-15T09:00:00
+1998-06-17T09:00:00
+1998-06-19T09:00:00
+1998-06-21T09:00:00
+1998-06-23T09:00:00
+1998-06-25T09:00:00
+1998-06-27T09:00:00
+1998-06-29T09:00:00
+1998-07-01T09:00:00
+1998-07-03T09:00:00
+1998-07-05T09:00:00
+1998-07-07T09:00:00
+1998-07-09T09:00:00
+1998-07-11T09:00:00
+1998-07-13T09:00:00
+1998-07-15T09:00:00
+1998-07-17T09:00:00
+1998-07-19T09:00:00
+1998-07-21T09:00:00
+1998-07-23T09:00:00
+1998-07-25T09:00:00
+1998-07-27T09:00:00
+1998-07-29T09:00:00
+1998-07-31T09:00:00
+1998-08-02T09:00:00
+1998-08-04T09:00:00
+1998-08-06T09:00:00
+1998-08-08T09:00:00
+1998-08-10T09:00:00
+1998-08-12T09:00:00
+1998-08-14T09:00:00
+1998-08-16T09:00:00
+1998-08-18T09:00:00
+1998-08-20T09:00:00
+1998-08-22T09:00:00
+1998-08-24T09:00:00
+1998-08-26T09:00:00
+1998-08-28T09:00:00
+1998-08-30T09:00:00
+1998-09-01T09:00:00
+1998-09-03T09:00:00
+1998-09-05T09:00:00
+1998-09-07T09:00:00
+1998-09-09T09:00:00
+1998-09-11T09:00:00
+1998-09-13T09:00:00
+1998-09-15T09:00:00
+1998-09-17T09:00:00
+1998-09-19T09:00:00
+1998-09-21T09:00:00
+1998-09-23T09:00:00
+1998-09-25T09:00:00
+1998-09-27T09:00:00
+1998-09-29T09:00:00
+1998-10-01T09:00:00
+1998-10-03T09:00:00
+1998-10-05T09:00:00
+1998-10-07T09:00:00
+1998-10-09T09:00:00
+1998-10-11T09:00:00
+1998-10-13T09:00:00
+1998-10-15T09:00:00
+1998-10-17T09:00:00
+1998-10-19T09:00:00
+1998-10-21T09:00:00
+1998-10-23T09:00:00
+1998-10-25T09:00:00
+1998-10-27T09:00:00
+1998-10-29T09:00:00
+1998-10-31T09:00:00
+1998-11-02T09:00:00
+1998-11-04T09:00:00
+1998-11-06T09:00:00
+1998-11-08T09:00:00
+1998-11-10T09:00:00
+1998-11-12T09:00:00
+1998-11-14T09:00:00
+1998-11-16T09:00:00
+1998-11-18T09:00:00
+1998-11-20T09:00:00
+1998-11-22T09:00:00
+1998-11-24T09:00:00
+1998-11-26T09:00:00
+1998-11-28T09:00:00
+1998-11-30T09:00:00
+1998-12-02T09:00:00
+1998-12-04T09:00:00
+1998-12-06T09:00:00
+1998-12-08T09:00:00
+1998-12-10T09:00:00
+1998-12-12T09:00:00
+1998-12-14T09:00:00
+1998-12-16T09:00:00
+1998-12-18T09:00:00
+1998-12-20T09:00:00
+1998-12-22T09:00:00
+1998-12-24T09:00:00
+1998-12-26T09:00:00
+1998-12-28T09:00:00
+1998-12-30T09:00:00
+1999-01-01T09:00:00
+1999-01-03T09:00:00
+1999-01-05T09:00:00
+1999-01-07T09:00:00
+1999-01-09T09:00:00
+1999-01-11T09:00:00
+1999-01-13T09:00:00
+1999-01-15T09:00:00
+1999-01-17T09:00:00
+1999-01-19T09:00:00
+1999-01-21T09:00:00
+1999-01-23T09:00:00
+1999-01-25T09:00:00
+1999-01-27T09:00:00
+1999-01-29T09:00:00
+1999-01-31T09:00:00
+1999-02-02T09:00:00
+1999-02-04T09:00:00
+1999-02-06T09:00:00
+1999-02-08T09:00:00
+1999-02-10T09:00:00
+1999-02-12T09:00:00
+1999-02-14T09:00:00
+1999-02-16T09:00:00
+1999-02-18T09:00:00
+1999-02-20T09:00:00
+1999-02-22T09:00:00
+1999-02-24T09:00:00
+1999-02-26T09:00:00
+1999-02-28T09:00:00
+1999-03-02T09:00:00
+1999-03-04T09:00:00
+1999-03-06T09:00:00
+1999-03-08T09:00:00
+1999-03-10T09:00:00
+1999-03-12T09:00:00
+1999-03-14T09:00:00
+1999-03-16T09:00:00
+1999-03-18T09:00:00
+1999-03-20T09:00:00
+1999-03-22T09:00:00
+1999-03-24T09:00:00
+1999-03-26T09:00:00
+1999-03-28T09:00:00
+1999-03-30T09:00:00
+1999-04-01T09:00:00
+1999-04-03T09:00:00
+1999-04-05T09:00:00
+1999-04-07T09:00:00
+1999-04-09T09:00:00
+1999-04-11T09:00:00
+1999-04-13T09:00:00
+1999-04-15T09:00:00
+1999-04-17T09:00:00
+1999-04-19T09:00:00
+1999-04-21T09:00:00
+1999-04-23T09:00:00
+1999-04-25T09:00:00
+1999-04-27T09:00:00
+1999-04-29T09:00:00
+1999-05-01T09:00:00
+1999-05-03T09:00:00
+1999-05-05T09:00:00
+1999-05-07T09:00:00
+1999-05-09T09:00:00
+1999-05-11T09:00:00
+1999-05-13T09:00:00
+1999-05-15T09:00:00
+1999-05-17T09:00:00
+1999-05-19T09:00:00
+1999-05-21T09:00:00
+1999-05-23T09:00:00
+1999-05-25T09:00:00
+1999-05-27T09:00:00
+1999-05-29T09:00:00
+1999-05-31T09:00:00
+1999-06-02T09:00:00
+1999-06-04T09:00:00
+1999-06-06T09:00:00
+1999-06-08T09:00:00
+1999-06-10T09:00:00
+1999-06-12T09:00:00
+1999-06-14T09:00:00
+1999-06-16T09:00:00
+1999-06-18T09:00:00
+1999-06-20T09:00:00
+1999-06-22T09:00:00
+1999-06-24T09:00:00
+1999-06-26T09:00:00
+1999-06-28T09:00:00
+1999-06-30T09:00:00
+1999-07-02T09:00:00
+1999-07-04T09:00:00
+1999-07-06T09:00:00
+1999-07-08T09:00:00
+1999-07-10T09:00:00
+1999-07-12T09:00:00
+1999-07-14T09:00:00
+1999-07-16T09:00:00
+1999-07-18T09:00:00
+1999-07-20T09:00:00
+1999-07-22T09:00:00
+1999-07-24T09:00:00
+1999-07-26T09:00:00
+1999-07-28T09:00:00
+1999-07-30T09:00:00
+1999-08-01T09:00:00
+1999-08-03T09:00:00
+1999-08-05T09:00:00
+1999-08-07T09:00:00
+1999-08-09T09:00:00
+1999-08-11T09:00:00
+1999-08-13T09:00:00
+1999-08-15T09:00:00
+1999-08-17T09:00:00
+1999-08-19T09:00:00
+1999-08-21T09:00:00
+1999-08-23T09:00:00
+1999-08-25T09:00:00
+1999-08-27T09:00:00
+1999-08-29T09:00:00
+1999-08-31T09:00:00
+1999-09-02T09:00:00
+1999-09-04T09:00:00
+1999-09-06T09:00:00
+1999-09-08T09:00:00
+1999-09-10T09:00:00
+1999-09-12T09:00:00
+1999-09-14T09:00:00
+1999-09-16T09:00:00
+1999-09-18T09:00:00
+1999-09-20T09:00:00
+1999-09-22T09:00:00
+1999-09-24T09:00:00
+1999-09-26T09:00:00
+1999-09-28T09:00:00
+1999-09-30T09:00:00
+1999-10-02T09:00:00
+1999-10-04T09:00:00
+1999-10-06T09:00:00
+1999-10-08T09:00:00
+1999-10-10T09:00:00
+1999-10-12T09:00:00
+1999-10-14T09:00:00
+1999-10-16T09:00:00
+1999-10-18T09:00:00
+1999-10-20T09:00:00
+1999-10-22T09:00:00
+1999-10-24T09:00:00
+1999-10-26T09:00:00
+1999-10-28T09:00:00
+1999-10-30T09:00:00
+1999-11-01T09:00:00
+1999-11-03T09:00:00
+1999-11-05T09:00:00
+1999-11-07T09:00:00
+1999-11-09T09:00:00
+1999-11-11T09:00:00
+1999-11-13T09:00:00
+1999-11-15T09:00:00
+1999-11-17T09:00:00
+1999-11-19T09:00:00
+1999-11-21T09:00:00
+1999-11-23T09:00:00
+1999-11-25T09:00:00
+1999-11-27T09:00:00
+1999-11-29T09:00:00
+1999-12-01T09:00:00
+1999-12-03T09:00:00
+1999-12-05T09:00:00
+1999-12-07T09:00:00
+1999-12-09T09:00:00
+1999-12-11T09:00:00
+1999-12-13T09:00:00
+1999-12-15T09:00:00
+1999-12-17T09:00:00
+1999-12-19T09:00:00
+1999-12-21T09:00:00
+1999-12-23T09:00:00
+1999-12-25T09:00:00
+1999-12-27T09:00:00
+1999-12-29T09:00:00
+1999-12-31T09:00:00
+2000-01-02T09:00:00
+2000-01-04T09:00:00
+2000-01-06T09:00:00
+2000-01-08T09:00:00
+2000-01-10T09:00:00
+2000-01-12T09:00:00
+2000-01-14T09:00:00
+2000-01-16T09:00:00
+2000-01-18T09:00:00
+2000-01-20T09:00:00
+2000-01-22T09:00:00
+2000-01-24T09:00:00
+2000-01-26T09:00:00
+2000-01-28T09:00:00
+2000-01-30T09:00:00
+2000-02-01T09:00:00
+2000-02-03T09:00:00
+2000-02-05T09:00:00
+2000-02-07T09:00:00
+2000-02-09T09:00:00
+2000-02-11T09:00:00
+2000-02-13T09:00:00
+2000-02-15T09:00:00
+2000-02-17T09:00:00
+2000-02-19T09:00:00
+2000-02-21T09:00:00
+2000-02-23T09:00:00
+2000-02-25T09:00:00
+2000-02-27T09:00:00
+2000-02-29T09:00:00
+2000-03-02T09:00:00
+2000-03-04T09:00:00
+2000-03-06T09:00:00
+2000-03-08T09:00:00
+2000-03-10T09:00:00
+2000-03-12T09:00:00
+2000-03-14T09:00:00
+2000-03-16T09:00:00
+2000-03-18T09:00:00
+2000-03-20T09:00:00
+2000-03-22T09:00:00
+2000-03-24T09:00:00
+2000-03-26T09:00:00
+2000-03-28T09:00:00
+2000-03-30T09:00:00
+2000-04-01T09:00:00
+2000-04-03T09:00:00
+2000-04-05T09:00:00
+2000-04-07T09:00:00
+2000-04-09T09:00:00
+2000-04-11T09:00:00
+2000-04-13T09:00:00
+2000-04-15T09:00:00
+2000-04-17T09:00:00
+2000-04-19T09:00:00
+2000-04-21T09:00:00
+2000-04-23T09:00:00
+2000-04-25T09:00:00
+2000-04-27T09:00:00
+2000-04-29T09:00:00
+2000-05-01T09:00:00
+2000-05-03T09:00:00
+2000-05-05T09:00:00
+2000-05-07T09:00:00
+2000-05-09T09:00:00
+2000-05-11T09:00:00
+2000-05-13T09:00:00
+2000-05-15T09:00:00
+2000-05-17T09:00:00
+2000-05-19T09:00:00
+2000-05-21T09:00:00
+2000-05-23T09:00:00
+2000-05-25T09:00:00
+2000-05-27T09:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase03.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase03.ics.prev.ref
new file mode 100644
index 00000000..59d27107
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase03.ics.prev.ref
@@ -0,0 +1,500 @@
+2010-12-31T09:00:00
+2010-12-29T09:00:00
+2010-12-27T09:00:00
+2010-12-25T09:00:00
+2010-12-23T09:00:00
+2010-12-21T09:00:00
+2010-12-19T09:00:00
+2010-12-17T09:00:00
+2010-12-15T09:00:00
+2010-12-13T09:00:00
+2010-12-11T09:00:00
+2010-12-09T09:00:00
+2010-12-07T09:00:00
+2010-12-05T09:00:00
+2010-12-03T09:00:00
+2010-12-01T09:00:00
+2010-11-29T09:00:00
+2010-11-27T09:00:00
+2010-11-25T09:00:00
+2010-11-23T09:00:00
+2010-11-21T09:00:00
+2010-11-19T09:00:00
+2010-11-17T09:00:00
+2010-11-15T09:00:00
+2010-11-13T09:00:00
+2010-11-11T09:00:00
+2010-11-09T09:00:00
+2010-11-07T09:00:00
+2010-11-05T09:00:00
+2010-11-03T09:00:00
+2010-11-01T09:00:00
+2010-10-30T09:00:00
+2010-10-28T09:00:00
+2010-10-26T09:00:00
+2010-10-24T09:00:00
+2010-10-22T09:00:00
+2010-10-20T09:00:00
+2010-10-18T09:00:00
+2010-10-16T09:00:00
+2010-10-14T09:00:00
+2010-10-12T09:00:00
+2010-10-10T09:00:00
+2010-10-08T09:00:00
+2010-10-06T09:00:00
+2010-10-04T09:00:00
+2010-10-02T09:00:00
+2010-09-30T09:00:00
+2010-09-28T09:00:00
+2010-09-26T09:00:00
+2010-09-24T09:00:00
+2010-09-22T09:00:00
+2010-09-20T09:00:00
+2010-09-18T09:00:00
+2010-09-16T09:00:00
+2010-09-14T09:00:00
+2010-09-12T09:00:00
+2010-09-10T09:00:00
+2010-09-08T09:00:00
+2010-09-06T09:00:00
+2010-09-04T09:00:00
+2010-09-02T09:00:00
+2010-08-31T09:00:00
+2010-08-29T09:00:00
+2010-08-27T09:00:00
+2010-08-25T09:00:00
+2010-08-23T09:00:00
+2010-08-21T09:00:00
+2010-08-19T09:00:00
+2010-08-17T09:00:00
+2010-08-15T09:00:00
+2010-08-13T09:00:00
+2010-08-11T09:00:00
+2010-08-09T09:00:00
+2010-08-07T09:00:00
+2010-08-05T09:00:00
+2010-08-03T09:00:00
+2010-08-01T09:00:00
+2010-07-30T09:00:00
+2010-07-28T09:00:00
+2010-07-26T09:00:00
+2010-07-24T09:00:00
+2010-07-22T09:00:00
+2010-07-20T09:00:00
+2010-07-18T09:00:00
+2010-07-16T09:00:00
+2010-07-14T09:00:00
+2010-07-12T09:00:00
+2010-07-10T09:00:00
+2010-07-08T09:00:00
+2010-07-06T09:00:00
+2010-07-04T09:00:00
+2010-07-02T09:00:00
+2010-06-30T09:00:00
+2010-06-28T09:00:00
+2010-06-26T09:00:00
+2010-06-24T09:00:00
+2010-06-22T09:00:00
+2010-06-20T09:00:00
+2010-06-18T09:00:00
+2010-06-16T09:00:00
+2010-06-14T09:00:00
+2010-06-12T09:00:00
+2010-06-10T09:00:00
+2010-06-08T09:00:00
+2010-06-06T09:00:00
+2010-06-04T09:00:00
+2010-06-02T09:00:00
+2010-05-31T09:00:00
+2010-05-29T09:00:00
+2010-05-27T09:00:00
+2010-05-25T09:00:00
+2010-05-23T09:00:00
+2010-05-21T09:00:00
+2010-05-19T09:00:00
+2010-05-17T09:00:00
+2010-05-15T09:00:00
+2010-05-13T09:00:00
+2010-05-11T09:00:00
+2010-05-09T09:00:00
+2010-05-07T09:00:00
+2010-05-05T09:00:00
+2010-05-03T09:00:00
+2010-05-01T09:00:00
+2010-04-29T09:00:00
+2010-04-27T09:00:00
+2010-04-25T09:00:00
+2010-04-23T09:00:00
+2010-04-21T09:00:00
+2010-04-19T09:00:00
+2010-04-17T09:00:00
+2010-04-15T09:00:00
+2010-04-13T09:00:00
+2010-04-11T09:00:00
+2010-04-09T09:00:00
+2010-04-07T09:00:00
+2010-04-05T09:00:00
+2010-04-03T09:00:00
+2010-04-01T09:00:00
+2010-03-30T09:00:00
+2010-03-28T09:00:00
+2010-03-26T09:00:00
+2010-03-24T09:00:00
+2010-03-22T09:00:00
+2010-03-20T09:00:00
+2010-03-18T09:00:00
+2010-03-16T09:00:00
+2010-03-14T09:00:00
+2010-03-12T09:00:00
+2010-03-10T09:00:00
+2010-03-08T09:00:00
+2010-03-06T09:00:00
+2010-03-04T09:00:00
+2010-03-02T09:00:00
+2010-02-28T09:00:00
+2010-02-26T09:00:00
+2010-02-24T09:00:00
+2010-02-22T09:00:00
+2010-02-20T09:00:00
+2010-02-18T09:00:00
+2010-02-16T09:00:00
+2010-02-14T09:00:00
+2010-02-12T09:00:00
+2010-02-10T09:00:00
+2010-02-08T09:00:00
+2010-02-06T09:00:00
+2010-02-04T09:00:00
+2010-02-02T09:00:00
+2010-01-31T09:00:00
+2010-01-29T09:00:00
+2010-01-27T09:00:00
+2010-01-25T09:00:00
+2010-01-23T09:00:00
+2010-01-21T09:00:00
+2010-01-19T09:00:00
+2010-01-17T09:00:00
+2010-01-15T09:00:00
+2010-01-13T09:00:00
+2010-01-11T09:00:00
+2010-01-09T09:00:00
+2010-01-07T09:00:00
+2010-01-05T09:00:00
+2010-01-03T09:00:00
+2010-01-01T09:00:00
+2009-12-30T09:00:00
+2009-12-28T09:00:00
+2009-12-26T09:00:00
+2009-12-24T09:00:00
+2009-12-22T09:00:00
+2009-12-20T09:00:00
+2009-12-18T09:00:00
+2009-12-16T09:00:00
+2009-12-14T09:00:00
+2009-12-12T09:00:00
+2009-12-10T09:00:00
+2009-12-08T09:00:00
+2009-12-06T09:00:00
+2009-12-04T09:00:00
+2009-12-02T09:00:00
+2009-11-30T09:00:00
+2009-11-28T09:00:00
+2009-11-26T09:00:00
+2009-11-24T09:00:00
+2009-11-22T09:00:00
+2009-11-20T09:00:00
+2009-11-18T09:00:00
+2009-11-16T09:00:00
+2009-11-14T09:00:00
+2009-11-12T09:00:00
+2009-11-10T09:00:00
+2009-11-08T09:00:00
+2009-11-06T09:00:00
+2009-11-04T09:00:00
+2009-11-02T09:00:00
+2009-10-31T09:00:00
+2009-10-29T09:00:00
+2009-10-27T09:00:00
+2009-10-25T09:00:00
+2009-10-23T09:00:00
+2009-10-21T09:00:00
+2009-10-19T09:00:00
+2009-10-17T09:00:00
+2009-10-15T09:00:00
+2009-10-13T09:00:00
+2009-10-11T09:00:00
+2009-10-09T09:00:00
+2009-10-07T09:00:00
+2009-10-05T09:00:00
+2009-10-03T09:00:00
+2009-10-01T09:00:00
+2009-09-29T09:00:00
+2009-09-27T09:00:00
+2009-09-25T09:00:00
+2009-09-23T09:00:00
+2009-09-21T09:00:00
+2009-09-19T09:00:00
+2009-09-17T09:00:00
+2009-09-15T09:00:00
+2009-09-13T09:00:00
+2009-09-11T09:00:00
+2009-09-09T09:00:00
+2009-09-07T09:00:00
+2009-09-05T09:00:00
+2009-09-03T09:00:00
+2009-09-01T09:00:00
+2009-08-30T09:00:00
+2009-08-28T09:00:00
+2009-08-26T09:00:00
+2009-08-24T09:00:00
+2009-08-22T09:00:00
+2009-08-20T09:00:00
+2009-08-18T09:00:00
+2009-08-16T09:00:00
+2009-08-14T09:00:00
+2009-08-12T09:00:00
+2009-08-10T09:00:00
+2009-08-08T09:00:00
+2009-08-06T09:00:00
+2009-08-04T09:00:00
+2009-08-02T09:00:00
+2009-07-31T09:00:00
+2009-07-29T09:00:00
+2009-07-27T09:00:00
+2009-07-25T09:00:00
+2009-07-23T09:00:00
+2009-07-21T09:00:00
+2009-07-19T09:00:00
+2009-07-17T09:00:00
+2009-07-15T09:00:00
+2009-07-13T09:00:00
+2009-07-11T09:00:00
+2009-07-09T09:00:00
+2009-07-07T09:00:00
+2009-07-05T09:00:00
+2009-07-03T09:00:00
+2009-07-01T09:00:00
+2009-06-29T09:00:00
+2009-06-27T09:00:00
+2009-06-25T09:00:00
+2009-06-23T09:00:00
+2009-06-21T09:00:00
+2009-06-19T09:00:00
+2009-06-17T09:00:00
+2009-06-15T09:00:00
+2009-06-13T09:00:00
+2009-06-11T09:00:00
+2009-06-09T09:00:00
+2009-06-07T09:00:00
+2009-06-05T09:00:00
+2009-06-03T09:00:00
+2009-06-01T09:00:00
+2009-05-30T09:00:00
+2009-05-28T09:00:00
+2009-05-26T09:00:00
+2009-05-24T09:00:00
+2009-05-22T09:00:00
+2009-05-20T09:00:00
+2009-05-18T09:00:00
+2009-05-16T09:00:00
+2009-05-14T09:00:00
+2009-05-12T09:00:00
+2009-05-10T09:00:00
+2009-05-08T09:00:00
+2009-05-06T09:00:00
+2009-05-04T09:00:00
+2009-05-02T09:00:00
+2009-04-30T09:00:00
+2009-04-28T09:00:00
+2009-04-26T09:00:00
+2009-04-24T09:00:00
+2009-04-22T09:00:00
+2009-04-20T09:00:00
+2009-04-18T09:00:00
+2009-04-16T09:00:00
+2009-04-14T09:00:00
+2009-04-12T09:00:00
+2009-04-10T09:00:00
+2009-04-08T09:00:00
+2009-04-06T09:00:00
+2009-04-04T09:00:00
+2009-04-02T09:00:00
+2009-03-31T09:00:00
+2009-03-29T09:00:00
+2009-03-27T09:00:00
+2009-03-25T09:00:00
+2009-03-23T09:00:00
+2009-03-21T09:00:00
+2009-03-19T09:00:00
+2009-03-17T09:00:00
+2009-03-15T09:00:00
+2009-03-13T09:00:00
+2009-03-11T09:00:00
+2009-03-09T09:00:00
+2009-03-07T09:00:00
+2009-03-05T09:00:00
+2009-03-03T09:00:00
+2009-03-01T09:00:00
+2009-02-27T09:00:00
+2009-02-25T09:00:00
+2009-02-23T09:00:00
+2009-02-21T09:00:00
+2009-02-19T09:00:00
+2009-02-17T09:00:00
+2009-02-15T09:00:00
+2009-02-13T09:00:00
+2009-02-11T09:00:00
+2009-02-09T09:00:00
+2009-02-07T09:00:00
+2009-02-05T09:00:00
+2009-02-03T09:00:00
+2009-02-01T09:00:00
+2009-01-30T09:00:00
+2009-01-28T09:00:00
+2009-01-26T09:00:00
+2009-01-24T09:00:00
+2009-01-22T09:00:00
+2009-01-20T09:00:00
+2009-01-18T09:00:00
+2009-01-16T09:00:00
+2009-01-14T09:00:00
+2009-01-12T09:00:00
+2009-01-10T09:00:00
+2009-01-08T09:00:00
+2009-01-06T09:00:00
+2009-01-04T09:00:00
+2009-01-02T09:00:00
+2008-12-31T09:00:00
+2008-12-29T09:00:00
+2008-12-27T09:00:00
+2008-12-25T09:00:00
+2008-12-23T09:00:00
+2008-12-21T09:00:00
+2008-12-19T09:00:00
+2008-12-17T09:00:00
+2008-12-15T09:00:00
+2008-12-13T09:00:00
+2008-12-11T09:00:00
+2008-12-09T09:00:00
+2008-12-07T09:00:00
+2008-12-05T09:00:00
+2008-12-03T09:00:00
+2008-12-01T09:00:00
+2008-11-29T09:00:00
+2008-11-27T09:00:00
+2008-11-25T09:00:00
+2008-11-23T09:00:00
+2008-11-21T09:00:00
+2008-11-19T09:00:00
+2008-11-17T09:00:00
+2008-11-15T09:00:00
+2008-11-13T09:00:00
+2008-11-11T09:00:00
+2008-11-09T09:00:00
+2008-11-07T09:00:00
+2008-11-05T09:00:00
+2008-11-03T09:00:00
+2008-11-01T09:00:00
+2008-10-30T09:00:00
+2008-10-28T09:00:00
+2008-10-26T09:00:00
+2008-10-24T09:00:00
+2008-10-22T09:00:00
+2008-10-20T09:00:00
+2008-10-18T09:00:00
+2008-10-16T09:00:00
+2008-10-14T09:00:00
+2008-10-12T09:00:00
+2008-10-10T09:00:00
+2008-10-08T09:00:00
+2008-10-06T09:00:00
+2008-10-04T09:00:00
+2008-10-02T09:00:00
+2008-09-30T09:00:00
+2008-09-28T09:00:00
+2008-09-26T09:00:00
+2008-09-24T09:00:00
+2008-09-22T09:00:00
+2008-09-20T09:00:00
+2008-09-18T09:00:00
+2008-09-16T09:00:00
+2008-09-14T09:00:00
+2008-09-12T09:00:00
+2008-09-10T09:00:00
+2008-09-08T09:00:00
+2008-09-06T09:00:00
+2008-09-04T09:00:00
+2008-09-02T09:00:00
+2008-08-31T09:00:00
+2008-08-29T09:00:00
+2008-08-27T09:00:00
+2008-08-25T09:00:00
+2008-08-23T09:00:00
+2008-08-21T09:00:00
+2008-08-19T09:00:00
+2008-08-17T09:00:00
+2008-08-15T09:00:00
+2008-08-13T09:00:00
+2008-08-11T09:00:00
+2008-08-09T09:00:00
+2008-08-07T09:00:00
+2008-08-05T09:00:00
+2008-08-03T09:00:00
+2008-08-01T09:00:00
+2008-07-30T09:00:00
+2008-07-28T09:00:00
+2008-07-26T09:00:00
+2008-07-24T09:00:00
+2008-07-22T09:00:00
+2008-07-20T09:00:00
+2008-07-18T09:00:00
+2008-07-16T09:00:00
+2008-07-14T09:00:00
+2008-07-12T09:00:00
+2008-07-10T09:00:00
+2008-07-08T09:00:00
+2008-07-06T09:00:00
+2008-07-04T09:00:00
+2008-07-02T09:00:00
+2008-06-30T09:00:00
+2008-06-28T09:00:00
+2008-06-26T09:00:00
+2008-06-24T09:00:00
+2008-06-22T09:00:00
+2008-06-20T09:00:00
+2008-06-18T09:00:00
+2008-06-16T09:00:00
+2008-06-14T09:00:00
+2008-06-12T09:00:00
+2008-06-10T09:00:00
+2008-06-08T09:00:00
+2008-06-06T09:00:00
+2008-06-04T09:00:00
+2008-06-02T09:00:00
+2008-05-31T09:00:00
+2008-05-29T09:00:00
+2008-05-27T09:00:00
+2008-05-25T09:00:00
+2008-05-23T09:00:00
+2008-05-21T09:00:00
+2008-05-19T09:00:00
+2008-05-17T09:00:00
+2008-05-15T09:00:00
+2008-05-13T09:00:00
+2008-05-11T09:00:00
+2008-05-09T09:00:00
+2008-05-07T09:00:00
+2008-05-05T09:00:00
+2008-05-03T09:00:00
+2008-05-01T09:00:00
+2008-04-29T09:00:00
+2008-04-27T09:00:00
+2008-04-25T09:00:00
+2008-04-23T09:00:00
+2008-04-21T09:00:00
+2008-04-19T09:00:00
+2008-04-17T09:00:00
+2008-04-15T09:00:00
+2008-04-13T09:00:00
+2008-04-11T09:00:00
+2008-04-09T09:00:00
+2008-04-07T09:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase03.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase03.ics.recurson.ref
new file mode 100644
index 00000000..f881503f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase03.ics.recurson.ref
@@ -0,0 +1,2435 @@
+1997-09-02
+1997-09-04
+1997-09-06
+1997-09-08
+1997-09-10
+1997-09-12
+1997-09-14
+1997-09-16
+1997-09-18
+1997-09-20
+1997-09-22
+1997-09-24
+1997-09-26
+1997-09-28
+1997-09-30
+1997-10-02
+1997-10-04
+1997-10-06
+1997-10-08
+1997-10-10
+1997-10-12
+1997-10-14
+1997-10-16
+1997-10-18
+1997-10-20
+1997-10-22
+1997-10-24
+1997-10-26
+1997-10-28
+1997-10-30
+1997-11-01
+1997-11-03
+1997-11-05
+1997-11-07
+1997-11-09
+1997-11-11
+1997-11-13
+1997-11-15
+1997-11-17
+1997-11-19
+1997-11-21
+1997-11-23
+1997-11-25
+1997-11-27
+1997-11-29
+1997-12-01
+1997-12-03
+1997-12-05
+1997-12-07
+1997-12-09
+1997-12-11
+1997-12-13
+1997-12-15
+1997-12-17
+1997-12-19
+1997-12-21
+1997-12-23
+1997-12-25
+1997-12-27
+1997-12-29
+1997-12-31
+1998-01-02
+1998-01-04
+1998-01-06
+1998-01-08
+1998-01-10
+1998-01-12
+1998-01-14
+1998-01-16
+1998-01-18
+1998-01-20
+1998-01-22
+1998-01-24
+1998-01-26
+1998-01-28
+1998-01-30
+1998-02-01
+1998-02-03
+1998-02-05
+1998-02-07
+1998-02-09
+1998-02-11
+1998-02-13
+1998-02-15
+1998-02-17
+1998-02-19
+1998-02-21
+1998-02-23
+1998-02-25
+1998-02-27
+1998-03-01
+1998-03-03
+1998-03-05
+1998-03-07
+1998-03-09
+1998-03-11
+1998-03-13
+1998-03-15
+1998-03-17
+1998-03-19
+1998-03-21
+1998-03-23
+1998-03-25
+1998-03-27
+1998-03-29
+1998-03-31
+1998-04-02
+1998-04-04
+1998-04-06
+1998-04-08
+1998-04-10
+1998-04-12
+1998-04-14
+1998-04-16
+1998-04-18
+1998-04-20
+1998-04-22
+1998-04-24
+1998-04-26
+1998-04-28
+1998-04-30
+1998-05-02
+1998-05-04
+1998-05-06
+1998-05-08
+1998-05-10
+1998-05-12
+1998-05-14
+1998-05-16
+1998-05-18
+1998-05-20
+1998-05-22
+1998-05-24
+1998-05-26
+1998-05-28
+1998-05-30
+1998-06-01
+1998-06-03
+1998-06-05
+1998-06-07
+1998-06-09
+1998-06-11
+1998-06-13
+1998-06-15
+1998-06-17
+1998-06-19
+1998-06-21
+1998-06-23
+1998-06-25
+1998-06-27
+1998-06-29
+1998-07-01
+1998-07-03
+1998-07-05
+1998-07-07
+1998-07-09
+1998-07-11
+1998-07-13
+1998-07-15
+1998-07-17
+1998-07-19
+1998-07-21
+1998-07-23
+1998-07-25
+1998-07-27
+1998-07-29
+1998-07-31
+1998-08-02
+1998-08-04
+1998-08-06
+1998-08-08
+1998-08-10
+1998-08-12
+1998-08-14
+1998-08-16
+1998-08-18
+1998-08-20
+1998-08-22
+1998-08-24
+1998-08-26
+1998-08-28
+1998-08-30
+1998-09-01
+1998-09-03
+1998-09-05
+1998-09-07
+1998-09-09
+1998-09-11
+1998-09-13
+1998-09-15
+1998-09-17
+1998-09-19
+1998-09-21
+1998-09-23
+1998-09-25
+1998-09-27
+1998-09-29
+1998-10-01
+1998-10-03
+1998-10-05
+1998-10-07
+1998-10-09
+1998-10-11
+1998-10-13
+1998-10-15
+1998-10-17
+1998-10-19
+1998-10-21
+1998-10-23
+1998-10-25
+1998-10-27
+1998-10-29
+1998-10-31
+1998-11-02
+1998-11-04
+1998-11-06
+1998-11-08
+1998-11-10
+1998-11-12
+1998-11-14
+1998-11-16
+1998-11-18
+1998-11-20
+1998-11-22
+1998-11-24
+1998-11-26
+1998-11-28
+1998-11-30
+1998-12-02
+1998-12-04
+1998-12-06
+1998-12-08
+1998-12-10
+1998-12-12
+1998-12-14
+1998-12-16
+1998-12-18
+1998-12-20
+1998-12-22
+1998-12-24
+1998-12-26
+1998-12-28
+1998-12-30
+1999-01-01
+1999-01-03
+1999-01-05
+1999-01-07
+1999-01-09
+1999-01-11
+1999-01-13
+1999-01-15
+1999-01-17
+1999-01-19
+1999-01-21
+1999-01-23
+1999-01-25
+1999-01-27
+1999-01-29
+1999-01-31
+1999-02-02
+1999-02-04
+1999-02-06
+1999-02-08
+1999-02-10
+1999-02-12
+1999-02-14
+1999-02-16
+1999-02-18
+1999-02-20
+1999-02-22
+1999-02-24
+1999-02-26
+1999-02-28
+1999-03-02
+1999-03-04
+1999-03-06
+1999-03-08
+1999-03-10
+1999-03-12
+1999-03-14
+1999-03-16
+1999-03-18
+1999-03-20
+1999-03-22
+1999-03-24
+1999-03-26
+1999-03-28
+1999-03-30
+1999-04-01
+1999-04-03
+1999-04-05
+1999-04-07
+1999-04-09
+1999-04-11
+1999-04-13
+1999-04-15
+1999-04-17
+1999-04-19
+1999-04-21
+1999-04-23
+1999-04-25
+1999-04-27
+1999-04-29
+1999-05-01
+1999-05-03
+1999-05-05
+1999-05-07
+1999-05-09
+1999-05-11
+1999-05-13
+1999-05-15
+1999-05-17
+1999-05-19
+1999-05-21
+1999-05-23
+1999-05-25
+1999-05-27
+1999-05-29
+1999-05-31
+1999-06-02
+1999-06-04
+1999-06-06
+1999-06-08
+1999-06-10
+1999-06-12
+1999-06-14
+1999-06-16
+1999-06-18
+1999-06-20
+1999-06-22
+1999-06-24
+1999-06-26
+1999-06-28
+1999-06-30
+1999-07-02
+1999-07-04
+1999-07-06
+1999-07-08
+1999-07-10
+1999-07-12
+1999-07-14
+1999-07-16
+1999-07-18
+1999-07-20
+1999-07-22
+1999-07-24
+1999-07-26
+1999-07-28
+1999-07-30
+1999-08-01
+1999-08-03
+1999-08-05
+1999-08-07
+1999-08-09
+1999-08-11
+1999-08-13
+1999-08-15
+1999-08-17
+1999-08-19
+1999-08-21
+1999-08-23
+1999-08-25
+1999-08-27
+1999-08-29
+1999-08-31
+1999-09-02
+1999-09-04
+1999-09-06
+1999-09-08
+1999-09-10
+1999-09-12
+1999-09-14
+1999-09-16
+1999-09-18
+1999-09-20
+1999-09-22
+1999-09-24
+1999-09-26
+1999-09-28
+1999-09-30
+1999-10-02
+1999-10-04
+1999-10-06
+1999-10-08
+1999-10-10
+1999-10-12
+1999-10-14
+1999-10-16
+1999-10-18
+1999-10-20
+1999-10-22
+1999-10-24
+1999-10-26
+1999-10-28
+1999-10-30
+1999-11-01
+1999-11-03
+1999-11-05
+1999-11-07
+1999-11-09
+1999-11-11
+1999-11-13
+1999-11-15
+1999-11-17
+1999-11-19
+1999-11-21
+1999-11-23
+1999-11-25
+1999-11-27
+1999-11-29
+1999-12-01
+1999-12-03
+1999-12-05
+1999-12-07
+1999-12-09
+1999-12-11
+1999-12-13
+1999-12-15
+1999-12-17
+1999-12-19
+1999-12-21
+1999-12-23
+1999-12-25
+1999-12-27
+1999-12-29
+1999-12-31
+2000-01-02
+2000-01-04
+2000-01-06
+2000-01-08
+2000-01-10
+2000-01-12
+2000-01-14
+2000-01-16
+2000-01-18
+2000-01-20
+2000-01-22
+2000-01-24
+2000-01-26
+2000-01-28
+2000-01-30
+2000-02-01
+2000-02-03
+2000-02-05
+2000-02-07
+2000-02-09
+2000-02-11
+2000-02-13
+2000-02-15
+2000-02-17
+2000-02-19
+2000-02-21
+2000-02-23
+2000-02-25
+2000-02-27
+2000-02-29
+2000-03-02
+2000-03-04
+2000-03-06
+2000-03-08
+2000-03-10
+2000-03-12
+2000-03-14
+2000-03-16
+2000-03-18
+2000-03-20
+2000-03-22
+2000-03-24
+2000-03-26
+2000-03-28
+2000-03-30
+2000-04-01
+2000-04-03
+2000-04-05
+2000-04-07
+2000-04-09
+2000-04-11
+2000-04-13
+2000-04-15
+2000-04-17
+2000-04-19
+2000-04-21
+2000-04-23
+2000-04-25
+2000-04-27
+2000-04-29
+2000-05-01
+2000-05-03
+2000-05-05
+2000-05-07
+2000-05-09
+2000-05-11
+2000-05-13
+2000-05-15
+2000-05-17
+2000-05-19
+2000-05-21
+2000-05-23
+2000-05-25
+2000-05-27
+2000-05-29
+2000-05-31
+2000-06-02
+2000-06-04
+2000-06-06
+2000-06-08
+2000-06-10
+2000-06-12
+2000-06-14
+2000-06-16
+2000-06-18
+2000-06-20
+2000-06-22
+2000-06-24
+2000-06-26
+2000-06-28
+2000-06-30
+2000-07-02
+2000-07-04
+2000-07-06
+2000-07-08
+2000-07-10
+2000-07-12
+2000-07-14
+2000-07-16
+2000-07-18
+2000-07-20
+2000-07-22
+2000-07-24
+2000-07-26
+2000-07-28
+2000-07-30
+2000-08-01
+2000-08-03
+2000-08-05
+2000-08-07
+2000-08-09
+2000-08-11
+2000-08-13
+2000-08-15
+2000-08-17
+2000-08-19
+2000-08-21
+2000-08-23
+2000-08-25
+2000-08-27
+2000-08-29
+2000-08-31
+2000-09-02
+2000-09-04
+2000-09-06
+2000-09-08
+2000-09-10
+2000-09-12
+2000-09-14
+2000-09-16
+2000-09-18
+2000-09-20
+2000-09-22
+2000-09-24
+2000-09-26
+2000-09-28
+2000-09-30
+2000-10-02
+2000-10-04
+2000-10-06
+2000-10-08
+2000-10-10
+2000-10-12
+2000-10-14
+2000-10-16
+2000-10-18
+2000-10-20
+2000-10-22
+2000-10-24
+2000-10-26
+2000-10-28
+2000-10-30
+2000-11-01
+2000-11-03
+2000-11-05
+2000-11-07
+2000-11-09
+2000-11-11
+2000-11-13
+2000-11-15
+2000-11-17
+2000-11-19
+2000-11-21
+2000-11-23
+2000-11-25
+2000-11-27
+2000-11-29
+2000-12-01
+2000-12-03
+2000-12-05
+2000-12-07
+2000-12-09
+2000-12-11
+2000-12-13
+2000-12-15
+2000-12-17
+2000-12-19
+2000-12-21
+2000-12-23
+2000-12-25
+2000-12-27
+2000-12-29
+2000-12-31
+2001-01-02
+2001-01-04
+2001-01-06
+2001-01-08
+2001-01-10
+2001-01-12
+2001-01-14
+2001-01-16
+2001-01-18
+2001-01-20
+2001-01-22
+2001-01-24
+2001-01-26
+2001-01-28
+2001-01-30
+2001-02-01
+2001-02-03
+2001-02-05
+2001-02-07
+2001-02-09
+2001-02-11
+2001-02-13
+2001-02-15
+2001-02-17
+2001-02-19
+2001-02-21
+2001-02-23
+2001-02-25
+2001-02-27
+2001-03-01
+2001-03-03
+2001-03-05
+2001-03-07
+2001-03-09
+2001-03-11
+2001-03-13
+2001-03-15
+2001-03-17
+2001-03-19
+2001-03-21
+2001-03-23
+2001-03-25
+2001-03-27
+2001-03-29
+2001-03-31
+2001-04-02
+2001-04-04
+2001-04-06
+2001-04-08
+2001-04-10
+2001-04-12
+2001-04-14
+2001-04-16
+2001-04-18
+2001-04-20
+2001-04-22
+2001-04-24
+2001-04-26
+2001-04-28
+2001-04-30
+2001-05-02
+2001-05-04
+2001-05-06
+2001-05-08
+2001-05-10
+2001-05-12
+2001-05-14
+2001-05-16
+2001-05-18
+2001-05-20
+2001-05-22
+2001-05-24
+2001-05-26
+2001-05-28
+2001-05-30
+2001-06-01
+2001-06-03
+2001-06-05
+2001-06-07
+2001-06-09
+2001-06-11
+2001-06-13
+2001-06-15
+2001-06-17
+2001-06-19
+2001-06-21
+2001-06-23
+2001-06-25
+2001-06-27
+2001-06-29
+2001-07-01
+2001-07-03
+2001-07-05
+2001-07-07
+2001-07-09
+2001-07-11
+2001-07-13
+2001-07-15
+2001-07-17
+2001-07-19
+2001-07-21
+2001-07-23
+2001-07-25
+2001-07-27
+2001-07-29
+2001-07-31
+2001-08-02
+2001-08-04
+2001-08-06
+2001-08-08
+2001-08-10
+2001-08-12
+2001-08-14
+2001-08-16
+2001-08-18
+2001-08-20
+2001-08-22
+2001-08-24
+2001-08-26
+2001-08-28
+2001-08-30
+2001-09-01
+2001-09-03
+2001-09-05
+2001-09-07
+2001-09-09
+2001-09-11
+2001-09-13
+2001-09-15
+2001-09-17
+2001-09-19
+2001-09-21
+2001-09-23
+2001-09-25
+2001-09-27
+2001-09-29
+2001-10-01
+2001-10-03
+2001-10-05
+2001-10-07
+2001-10-09
+2001-10-11
+2001-10-13
+2001-10-15
+2001-10-17
+2001-10-19
+2001-10-21
+2001-10-23
+2001-10-25
+2001-10-27
+2001-10-29
+2001-10-31
+2001-11-02
+2001-11-04
+2001-11-06
+2001-11-08
+2001-11-10
+2001-11-12
+2001-11-14
+2001-11-16
+2001-11-18
+2001-11-20
+2001-11-22
+2001-11-24
+2001-11-26
+2001-11-28
+2001-11-30
+2001-12-02
+2001-12-04
+2001-12-06
+2001-12-08
+2001-12-10
+2001-12-12
+2001-12-14
+2001-12-16
+2001-12-18
+2001-12-20
+2001-12-22
+2001-12-24
+2001-12-26
+2001-12-28
+2001-12-30
+2002-01-01
+2002-01-03
+2002-01-05
+2002-01-07
+2002-01-09
+2002-01-11
+2002-01-13
+2002-01-15
+2002-01-17
+2002-01-19
+2002-01-21
+2002-01-23
+2002-01-25
+2002-01-27
+2002-01-29
+2002-01-31
+2002-02-02
+2002-02-04
+2002-02-06
+2002-02-08
+2002-02-10
+2002-02-12
+2002-02-14
+2002-02-16
+2002-02-18
+2002-02-20
+2002-02-22
+2002-02-24
+2002-02-26
+2002-02-28
+2002-03-02
+2002-03-04
+2002-03-06
+2002-03-08
+2002-03-10
+2002-03-12
+2002-03-14
+2002-03-16
+2002-03-18
+2002-03-20
+2002-03-22
+2002-03-24
+2002-03-26
+2002-03-28
+2002-03-30
+2002-04-01
+2002-04-03
+2002-04-05
+2002-04-07
+2002-04-09
+2002-04-11
+2002-04-13
+2002-04-15
+2002-04-17
+2002-04-19
+2002-04-21
+2002-04-23
+2002-04-25
+2002-04-27
+2002-04-29
+2002-05-01
+2002-05-03
+2002-05-05
+2002-05-07
+2002-05-09
+2002-05-11
+2002-05-13
+2002-05-15
+2002-05-17
+2002-05-19
+2002-05-21
+2002-05-23
+2002-05-25
+2002-05-27
+2002-05-29
+2002-05-31
+2002-06-02
+2002-06-04
+2002-06-06
+2002-06-08
+2002-06-10
+2002-06-12
+2002-06-14
+2002-06-16
+2002-06-18
+2002-06-20
+2002-06-22
+2002-06-24
+2002-06-26
+2002-06-28
+2002-06-30
+2002-07-02
+2002-07-04
+2002-07-06
+2002-07-08
+2002-07-10
+2002-07-12
+2002-07-14
+2002-07-16
+2002-07-18
+2002-07-20
+2002-07-22
+2002-07-24
+2002-07-26
+2002-07-28
+2002-07-30
+2002-08-01
+2002-08-03
+2002-08-05
+2002-08-07
+2002-08-09
+2002-08-11
+2002-08-13
+2002-08-15
+2002-08-17
+2002-08-19
+2002-08-21
+2002-08-23
+2002-08-25
+2002-08-27
+2002-08-29
+2002-08-31
+2002-09-02
+2002-09-04
+2002-09-06
+2002-09-08
+2002-09-10
+2002-09-12
+2002-09-14
+2002-09-16
+2002-09-18
+2002-09-20
+2002-09-22
+2002-09-24
+2002-09-26
+2002-09-28
+2002-09-30
+2002-10-02
+2002-10-04
+2002-10-06
+2002-10-08
+2002-10-10
+2002-10-12
+2002-10-14
+2002-10-16
+2002-10-18
+2002-10-20
+2002-10-22
+2002-10-24
+2002-10-26
+2002-10-28
+2002-10-30
+2002-11-01
+2002-11-03
+2002-11-05
+2002-11-07
+2002-11-09
+2002-11-11
+2002-11-13
+2002-11-15
+2002-11-17
+2002-11-19
+2002-11-21
+2002-11-23
+2002-11-25
+2002-11-27
+2002-11-29
+2002-12-01
+2002-12-03
+2002-12-05
+2002-12-07
+2002-12-09
+2002-12-11
+2002-12-13
+2002-12-15
+2002-12-17
+2002-12-19
+2002-12-21
+2002-12-23
+2002-12-25
+2002-12-27
+2002-12-29
+2002-12-31
+2003-01-02
+2003-01-04
+2003-01-06
+2003-01-08
+2003-01-10
+2003-01-12
+2003-01-14
+2003-01-16
+2003-01-18
+2003-01-20
+2003-01-22
+2003-01-24
+2003-01-26
+2003-01-28
+2003-01-30
+2003-02-01
+2003-02-03
+2003-02-05
+2003-02-07
+2003-02-09
+2003-02-11
+2003-02-13
+2003-02-15
+2003-02-17
+2003-02-19
+2003-02-21
+2003-02-23
+2003-02-25
+2003-02-27
+2003-03-01
+2003-03-03
+2003-03-05
+2003-03-07
+2003-03-09
+2003-03-11
+2003-03-13
+2003-03-15
+2003-03-17
+2003-03-19
+2003-03-21
+2003-03-23
+2003-03-25
+2003-03-27
+2003-03-29
+2003-03-31
+2003-04-02
+2003-04-04
+2003-04-06
+2003-04-08
+2003-04-10
+2003-04-12
+2003-04-14
+2003-04-16
+2003-04-18
+2003-04-20
+2003-04-22
+2003-04-24
+2003-04-26
+2003-04-28
+2003-04-30
+2003-05-02
+2003-05-04
+2003-05-06
+2003-05-08
+2003-05-10
+2003-05-12
+2003-05-14
+2003-05-16
+2003-05-18
+2003-05-20
+2003-05-22
+2003-05-24
+2003-05-26
+2003-05-28
+2003-05-30
+2003-06-01
+2003-06-03
+2003-06-05
+2003-06-07
+2003-06-09
+2003-06-11
+2003-06-13
+2003-06-15
+2003-06-17
+2003-06-19
+2003-06-21
+2003-06-23
+2003-06-25
+2003-06-27
+2003-06-29
+2003-07-01
+2003-07-03
+2003-07-05
+2003-07-07
+2003-07-09
+2003-07-11
+2003-07-13
+2003-07-15
+2003-07-17
+2003-07-19
+2003-07-21
+2003-07-23
+2003-07-25
+2003-07-27
+2003-07-29
+2003-07-31
+2003-08-02
+2003-08-04
+2003-08-06
+2003-08-08
+2003-08-10
+2003-08-12
+2003-08-14
+2003-08-16
+2003-08-18
+2003-08-20
+2003-08-22
+2003-08-24
+2003-08-26
+2003-08-28
+2003-08-30
+2003-09-01
+2003-09-03
+2003-09-05
+2003-09-07
+2003-09-09
+2003-09-11
+2003-09-13
+2003-09-15
+2003-09-17
+2003-09-19
+2003-09-21
+2003-09-23
+2003-09-25
+2003-09-27
+2003-09-29
+2003-10-01
+2003-10-03
+2003-10-05
+2003-10-07
+2003-10-09
+2003-10-11
+2003-10-13
+2003-10-15
+2003-10-17
+2003-10-19
+2003-10-21
+2003-10-23
+2003-10-25
+2003-10-27
+2003-10-29
+2003-10-31
+2003-11-02
+2003-11-04
+2003-11-06
+2003-11-08
+2003-11-10
+2003-11-12
+2003-11-14
+2003-11-16
+2003-11-18
+2003-11-20
+2003-11-22
+2003-11-24
+2003-11-26
+2003-11-28
+2003-11-30
+2003-12-02
+2003-12-04
+2003-12-06
+2003-12-08
+2003-12-10
+2003-12-12
+2003-12-14
+2003-12-16
+2003-12-18
+2003-12-20
+2003-12-22
+2003-12-24
+2003-12-26
+2003-12-28
+2003-12-30
+2004-01-01
+2004-01-03
+2004-01-05
+2004-01-07
+2004-01-09
+2004-01-11
+2004-01-13
+2004-01-15
+2004-01-17
+2004-01-19
+2004-01-21
+2004-01-23
+2004-01-25
+2004-01-27
+2004-01-29
+2004-01-31
+2004-02-02
+2004-02-04
+2004-02-06
+2004-02-08
+2004-02-10
+2004-02-12
+2004-02-14
+2004-02-16
+2004-02-18
+2004-02-20
+2004-02-22
+2004-02-24
+2004-02-26
+2004-02-28
+2004-03-01
+2004-03-03
+2004-03-05
+2004-03-07
+2004-03-09
+2004-03-11
+2004-03-13
+2004-03-15
+2004-03-17
+2004-03-19
+2004-03-21
+2004-03-23
+2004-03-25
+2004-03-27
+2004-03-29
+2004-03-31
+2004-04-02
+2004-04-04
+2004-04-06
+2004-04-08
+2004-04-10
+2004-04-12
+2004-04-14
+2004-04-16
+2004-04-18
+2004-04-20
+2004-04-22
+2004-04-24
+2004-04-26
+2004-04-28
+2004-04-30
+2004-05-02
+2004-05-04
+2004-05-06
+2004-05-08
+2004-05-10
+2004-05-12
+2004-05-14
+2004-05-16
+2004-05-18
+2004-05-20
+2004-05-22
+2004-05-24
+2004-05-26
+2004-05-28
+2004-05-30
+2004-06-01
+2004-06-03
+2004-06-05
+2004-06-07
+2004-06-09
+2004-06-11
+2004-06-13
+2004-06-15
+2004-06-17
+2004-06-19
+2004-06-21
+2004-06-23
+2004-06-25
+2004-06-27
+2004-06-29
+2004-07-01
+2004-07-03
+2004-07-05
+2004-07-07
+2004-07-09
+2004-07-11
+2004-07-13
+2004-07-15
+2004-07-17
+2004-07-19
+2004-07-21
+2004-07-23
+2004-07-25
+2004-07-27
+2004-07-29
+2004-07-31
+2004-08-02
+2004-08-04
+2004-08-06
+2004-08-08
+2004-08-10
+2004-08-12
+2004-08-14
+2004-08-16
+2004-08-18
+2004-08-20
+2004-08-22
+2004-08-24
+2004-08-26
+2004-08-28
+2004-08-30
+2004-09-01
+2004-09-03
+2004-09-05
+2004-09-07
+2004-09-09
+2004-09-11
+2004-09-13
+2004-09-15
+2004-09-17
+2004-09-19
+2004-09-21
+2004-09-23
+2004-09-25
+2004-09-27
+2004-09-29
+2004-10-01
+2004-10-03
+2004-10-05
+2004-10-07
+2004-10-09
+2004-10-11
+2004-10-13
+2004-10-15
+2004-10-17
+2004-10-19
+2004-10-21
+2004-10-23
+2004-10-25
+2004-10-27
+2004-10-29
+2004-10-31
+2004-11-02
+2004-11-04
+2004-11-06
+2004-11-08
+2004-11-10
+2004-11-12
+2004-11-14
+2004-11-16
+2004-11-18
+2004-11-20
+2004-11-22
+2004-11-24
+2004-11-26
+2004-11-28
+2004-11-30
+2004-12-02
+2004-12-04
+2004-12-06
+2004-12-08
+2004-12-10
+2004-12-12
+2004-12-14
+2004-12-16
+2004-12-18
+2004-12-20
+2004-12-22
+2004-12-24
+2004-12-26
+2004-12-28
+2004-12-30
+2005-01-01
+2005-01-03
+2005-01-05
+2005-01-07
+2005-01-09
+2005-01-11
+2005-01-13
+2005-01-15
+2005-01-17
+2005-01-19
+2005-01-21
+2005-01-23
+2005-01-25
+2005-01-27
+2005-01-29
+2005-01-31
+2005-02-02
+2005-02-04
+2005-02-06
+2005-02-08
+2005-02-10
+2005-02-12
+2005-02-14
+2005-02-16
+2005-02-18
+2005-02-20
+2005-02-22
+2005-02-24
+2005-02-26
+2005-02-28
+2005-03-02
+2005-03-04
+2005-03-06
+2005-03-08
+2005-03-10
+2005-03-12
+2005-03-14
+2005-03-16
+2005-03-18
+2005-03-20
+2005-03-22
+2005-03-24
+2005-03-26
+2005-03-28
+2005-03-30
+2005-04-01
+2005-04-03
+2005-04-05
+2005-04-07
+2005-04-09
+2005-04-11
+2005-04-13
+2005-04-15
+2005-04-17
+2005-04-19
+2005-04-21
+2005-04-23
+2005-04-25
+2005-04-27
+2005-04-29
+2005-05-01
+2005-05-03
+2005-05-05
+2005-05-07
+2005-05-09
+2005-05-11
+2005-05-13
+2005-05-15
+2005-05-17
+2005-05-19
+2005-05-21
+2005-05-23
+2005-05-25
+2005-05-27
+2005-05-29
+2005-05-31
+2005-06-02
+2005-06-04
+2005-06-06
+2005-06-08
+2005-06-10
+2005-06-12
+2005-06-14
+2005-06-16
+2005-06-18
+2005-06-20
+2005-06-22
+2005-06-24
+2005-06-26
+2005-06-28
+2005-06-30
+2005-07-02
+2005-07-04
+2005-07-06
+2005-07-08
+2005-07-10
+2005-07-12
+2005-07-14
+2005-07-16
+2005-07-18
+2005-07-20
+2005-07-22
+2005-07-24
+2005-07-26
+2005-07-28
+2005-07-30
+2005-08-01
+2005-08-03
+2005-08-05
+2005-08-07
+2005-08-09
+2005-08-11
+2005-08-13
+2005-08-15
+2005-08-17
+2005-08-19
+2005-08-21
+2005-08-23
+2005-08-25
+2005-08-27
+2005-08-29
+2005-08-31
+2005-09-02
+2005-09-04
+2005-09-06
+2005-09-08
+2005-09-10
+2005-09-12
+2005-09-14
+2005-09-16
+2005-09-18
+2005-09-20
+2005-09-22
+2005-09-24
+2005-09-26
+2005-09-28
+2005-09-30
+2005-10-02
+2005-10-04
+2005-10-06
+2005-10-08
+2005-10-10
+2005-10-12
+2005-10-14
+2005-10-16
+2005-10-18
+2005-10-20
+2005-10-22
+2005-10-24
+2005-10-26
+2005-10-28
+2005-10-30
+2005-11-01
+2005-11-03
+2005-11-05
+2005-11-07
+2005-11-09
+2005-11-11
+2005-11-13
+2005-11-15
+2005-11-17
+2005-11-19
+2005-11-21
+2005-11-23
+2005-11-25
+2005-11-27
+2005-11-29
+2005-12-01
+2005-12-03
+2005-12-05
+2005-12-07
+2005-12-09
+2005-12-11
+2005-12-13
+2005-12-15
+2005-12-17
+2005-12-19
+2005-12-21
+2005-12-23
+2005-12-25
+2005-12-27
+2005-12-29
+2005-12-31
+2006-01-02
+2006-01-04
+2006-01-06
+2006-01-08
+2006-01-10
+2006-01-12
+2006-01-14
+2006-01-16
+2006-01-18
+2006-01-20
+2006-01-22
+2006-01-24
+2006-01-26
+2006-01-28
+2006-01-30
+2006-02-01
+2006-02-03
+2006-02-05
+2006-02-07
+2006-02-09
+2006-02-11
+2006-02-13
+2006-02-15
+2006-02-17
+2006-02-19
+2006-02-21
+2006-02-23
+2006-02-25
+2006-02-27
+2006-03-01
+2006-03-03
+2006-03-05
+2006-03-07
+2006-03-09
+2006-03-11
+2006-03-13
+2006-03-15
+2006-03-17
+2006-03-19
+2006-03-21
+2006-03-23
+2006-03-25
+2006-03-27
+2006-03-29
+2006-03-31
+2006-04-02
+2006-04-04
+2006-04-06
+2006-04-08
+2006-04-10
+2006-04-12
+2006-04-14
+2006-04-16
+2006-04-18
+2006-04-20
+2006-04-22
+2006-04-24
+2006-04-26
+2006-04-28
+2006-04-30
+2006-05-02
+2006-05-04
+2006-05-06
+2006-05-08
+2006-05-10
+2006-05-12
+2006-05-14
+2006-05-16
+2006-05-18
+2006-05-20
+2006-05-22
+2006-05-24
+2006-05-26
+2006-05-28
+2006-05-30
+2006-06-01
+2006-06-03
+2006-06-05
+2006-06-07
+2006-06-09
+2006-06-11
+2006-06-13
+2006-06-15
+2006-06-17
+2006-06-19
+2006-06-21
+2006-06-23
+2006-06-25
+2006-06-27
+2006-06-29
+2006-07-01
+2006-07-03
+2006-07-05
+2006-07-07
+2006-07-09
+2006-07-11
+2006-07-13
+2006-07-15
+2006-07-17
+2006-07-19
+2006-07-21
+2006-07-23
+2006-07-25
+2006-07-27
+2006-07-29
+2006-07-31
+2006-08-02
+2006-08-04
+2006-08-06
+2006-08-08
+2006-08-10
+2006-08-12
+2006-08-14
+2006-08-16
+2006-08-18
+2006-08-20
+2006-08-22
+2006-08-24
+2006-08-26
+2006-08-28
+2006-08-30
+2006-09-01
+2006-09-03
+2006-09-05
+2006-09-07
+2006-09-09
+2006-09-11
+2006-09-13
+2006-09-15
+2006-09-17
+2006-09-19
+2006-09-21
+2006-09-23
+2006-09-25
+2006-09-27
+2006-09-29
+2006-10-01
+2006-10-03
+2006-10-05
+2006-10-07
+2006-10-09
+2006-10-11
+2006-10-13
+2006-10-15
+2006-10-17
+2006-10-19
+2006-10-21
+2006-10-23
+2006-10-25
+2006-10-27
+2006-10-29
+2006-10-31
+2006-11-02
+2006-11-04
+2006-11-06
+2006-11-08
+2006-11-10
+2006-11-12
+2006-11-14
+2006-11-16
+2006-11-18
+2006-11-20
+2006-11-22
+2006-11-24
+2006-11-26
+2006-11-28
+2006-11-30
+2006-12-02
+2006-12-04
+2006-12-06
+2006-12-08
+2006-12-10
+2006-12-12
+2006-12-14
+2006-12-16
+2006-12-18
+2006-12-20
+2006-12-22
+2006-12-24
+2006-12-26
+2006-12-28
+2006-12-30
+2007-01-01
+2007-01-03
+2007-01-05
+2007-01-07
+2007-01-09
+2007-01-11
+2007-01-13
+2007-01-15
+2007-01-17
+2007-01-19
+2007-01-21
+2007-01-23
+2007-01-25
+2007-01-27
+2007-01-29
+2007-01-31
+2007-02-02
+2007-02-04
+2007-02-06
+2007-02-08
+2007-02-10
+2007-02-12
+2007-02-14
+2007-02-16
+2007-02-18
+2007-02-20
+2007-02-22
+2007-02-24
+2007-02-26
+2007-02-28
+2007-03-02
+2007-03-04
+2007-03-06
+2007-03-08
+2007-03-10
+2007-03-12
+2007-03-14
+2007-03-16
+2007-03-18
+2007-03-20
+2007-03-22
+2007-03-24
+2007-03-26
+2007-03-28
+2007-03-30
+2007-04-01
+2007-04-03
+2007-04-05
+2007-04-07
+2007-04-09
+2007-04-11
+2007-04-13
+2007-04-15
+2007-04-17
+2007-04-19
+2007-04-21
+2007-04-23
+2007-04-25
+2007-04-27
+2007-04-29
+2007-05-01
+2007-05-03
+2007-05-05
+2007-05-07
+2007-05-09
+2007-05-11
+2007-05-13
+2007-05-15
+2007-05-17
+2007-05-19
+2007-05-21
+2007-05-23
+2007-05-25
+2007-05-27
+2007-05-29
+2007-05-31
+2007-06-02
+2007-06-04
+2007-06-06
+2007-06-08
+2007-06-10
+2007-06-12
+2007-06-14
+2007-06-16
+2007-06-18
+2007-06-20
+2007-06-22
+2007-06-24
+2007-06-26
+2007-06-28
+2007-06-30
+2007-07-02
+2007-07-04
+2007-07-06
+2007-07-08
+2007-07-10
+2007-07-12
+2007-07-14
+2007-07-16
+2007-07-18
+2007-07-20
+2007-07-22
+2007-07-24
+2007-07-26
+2007-07-28
+2007-07-30
+2007-08-01
+2007-08-03
+2007-08-05
+2007-08-07
+2007-08-09
+2007-08-11
+2007-08-13
+2007-08-15
+2007-08-17
+2007-08-19
+2007-08-21
+2007-08-23
+2007-08-25
+2007-08-27
+2007-08-29
+2007-08-31
+2007-09-02
+2007-09-04
+2007-09-06
+2007-09-08
+2007-09-10
+2007-09-12
+2007-09-14
+2007-09-16
+2007-09-18
+2007-09-20
+2007-09-22
+2007-09-24
+2007-09-26
+2007-09-28
+2007-09-30
+2007-10-02
+2007-10-04
+2007-10-06
+2007-10-08
+2007-10-10
+2007-10-12
+2007-10-14
+2007-10-16
+2007-10-18
+2007-10-20
+2007-10-22
+2007-10-24
+2007-10-26
+2007-10-28
+2007-10-30
+2007-11-01
+2007-11-03
+2007-11-05
+2007-11-07
+2007-11-09
+2007-11-11
+2007-11-13
+2007-11-15
+2007-11-17
+2007-11-19
+2007-11-21
+2007-11-23
+2007-11-25
+2007-11-27
+2007-11-29
+2007-12-01
+2007-12-03
+2007-12-05
+2007-12-07
+2007-12-09
+2007-12-11
+2007-12-13
+2007-12-15
+2007-12-17
+2007-12-19
+2007-12-21
+2007-12-23
+2007-12-25
+2007-12-27
+2007-12-29
+2007-12-31
+2008-01-02
+2008-01-04
+2008-01-06
+2008-01-08
+2008-01-10
+2008-01-12
+2008-01-14
+2008-01-16
+2008-01-18
+2008-01-20
+2008-01-22
+2008-01-24
+2008-01-26
+2008-01-28
+2008-01-30
+2008-02-01
+2008-02-03
+2008-02-05
+2008-02-07
+2008-02-09
+2008-02-11
+2008-02-13
+2008-02-15
+2008-02-17
+2008-02-19
+2008-02-21
+2008-02-23
+2008-02-25
+2008-02-27
+2008-02-29
+2008-03-02
+2008-03-04
+2008-03-06
+2008-03-08
+2008-03-10
+2008-03-12
+2008-03-14
+2008-03-16
+2008-03-18
+2008-03-20
+2008-03-22
+2008-03-24
+2008-03-26
+2008-03-28
+2008-03-30
+2008-04-01
+2008-04-03
+2008-04-05
+2008-04-07
+2008-04-09
+2008-04-11
+2008-04-13
+2008-04-15
+2008-04-17
+2008-04-19
+2008-04-21
+2008-04-23
+2008-04-25
+2008-04-27
+2008-04-29
+2008-05-01
+2008-05-03
+2008-05-05
+2008-05-07
+2008-05-09
+2008-05-11
+2008-05-13
+2008-05-15
+2008-05-17
+2008-05-19
+2008-05-21
+2008-05-23
+2008-05-25
+2008-05-27
+2008-05-29
+2008-05-31
+2008-06-02
+2008-06-04
+2008-06-06
+2008-06-08
+2008-06-10
+2008-06-12
+2008-06-14
+2008-06-16
+2008-06-18
+2008-06-20
+2008-06-22
+2008-06-24
+2008-06-26
+2008-06-28
+2008-06-30
+2008-07-02
+2008-07-04
+2008-07-06
+2008-07-08
+2008-07-10
+2008-07-12
+2008-07-14
+2008-07-16
+2008-07-18
+2008-07-20
+2008-07-22
+2008-07-24
+2008-07-26
+2008-07-28
+2008-07-30
+2008-08-01
+2008-08-03
+2008-08-05
+2008-08-07
+2008-08-09
+2008-08-11
+2008-08-13
+2008-08-15
+2008-08-17
+2008-08-19
+2008-08-21
+2008-08-23
+2008-08-25
+2008-08-27
+2008-08-29
+2008-08-31
+2008-09-02
+2008-09-04
+2008-09-06
+2008-09-08
+2008-09-10
+2008-09-12
+2008-09-14
+2008-09-16
+2008-09-18
+2008-09-20
+2008-09-22
+2008-09-24
+2008-09-26
+2008-09-28
+2008-09-30
+2008-10-02
+2008-10-04
+2008-10-06
+2008-10-08
+2008-10-10
+2008-10-12
+2008-10-14
+2008-10-16
+2008-10-18
+2008-10-20
+2008-10-22
+2008-10-24
+2008-10-26
+2008-10-28
+2008-10-30
+2008-11-01
+2008-11-03
+2008-11-05
+2008-11-07
+2008-11-09
+2008-11-11
+2008-11-13
+2008-11-15
+2008-11-17
+2008-11-19
+2008-11-21
+2008-11-23
+2008-11-25
+2008-11-27
+2008-11-29
+2008-12-01
+2008-12-03
+2008-12-05
+2008-12-07
+2008-12-09
+2008-12-11
+2008-12-13
+2008-12-15
+2008-12-17
+2008-12-19
+2008-12-21
+2008-12-23
+2008-12-25
+2008-12-27
+2008-12-29
+2008-12-31
+2009-01-02
+2009-01-04
+2009-01-06
+2009-01-08
+2009-01-10
+2009-01-12
+2009-01-14
+2009-01-16
+2009-01-18
+2009-01-20
+2009-01-22
+2009-01-24
+2009-01-26
+2009-01-28
+2009-01-30
+2009-02-01
+2009-02-03
+2009-02-05
+2009-02-07
+2009-02-09
+2009-02-11
+2009-02-13
+2009-02-15
+2009-02-17
+2009-02-19
+2009-02-21
+2009-02-23
+2009-02-25
+2009-02-27
+2009-03-01
+2009-03-03
+2009-03-05
+2009-03-07
+2009-03-09
+2009-03-11
+2009-03-13
+2009-03-15
+2009-03-17
+2009-03-19
+2009-03-21
+2009-03-23
+2009-03-25
+2009-03-27
+2009-03-29
+2009-03-31
+2009-04-02
+2009-04-04
+2009-04-06
+2009-04-08
+2009-04-10
+2009-04-12
+2009-04-14
+2009-04-16
+2009-04-18
+2009-04-20
+2009-04-22
+2009-04-24
+2009-04-26
+2009-04-28
+2009-04-30
+2009-05-02
+2009-05-04
+2009-05-06
+2009-05-08
+2009-05-10
+2009-05-12
+2009-05-14
+2009-05-16
+2009-05-18
+2009-05-20
+2009-05-22
+2009-05-24
+2009-05-26
+2009-05-28
+2009-05-30
+2009-06-01
+2009-06-03
+2009-06-05
+2009-06-07
+2009-06-09
+2009-06-11
+2009-06-13
+2009-06-15
+2009-06-17
+2009-06-19
+2009-06-21
+2009-06-23
+2009-06-25
+2009-06-27
+2009-06-29
+2009-07-01
+2009-07-03
+2009-07-05
+2009-07-07
+2009-07-09
+2009-07-11
+2009-07-13
+2009-07-15
+2009-07-17
+2009-07-19
+2009-07-21
+2009-07-23
+2009-07-25
+2009-07-27
+2009-07-29
+2009-07-31
+2009-08-02
+2009-08-04
+2009-08-06
+2009-08-08
+2009-08-10
+2009-08-12
+2009-08-14
+2009-08-16
+2009-08-18
+2009-08-20
+2009-08-22
+2009-08-24
+2009-08-26
+2009-08-28
+2009-08-30
+2009-09-01
+2009-09-03
+2009-09-05
+2009-09-07
+2009-09-09
+2009-09-11
+2009-09-13
+2009-09-15
+2009-09-17
+2009-09-19
+2009-09-21
+2009-09-23
+2009-09-25
+2009-09-27
+2009-09-29
+2009-10-01
+2009-10-03
+2009-10-05
+2009-10-07
+2009-10-09
+2009-10-11
+2009-10-13
+2009-10-15
+2009-10-17
+2009-10-19
+2009-10-21
+2009-10-23
+2009-10-25
+2009-10-27
+2009-10-29
+2009-10-31
+2009-11-02
+2009-11-04
+2009-11-06
+2009-11-08
+2009-11-10
+2009-11-12
+2009-11-14
+2009-11-16
+2009-11-18
+2009-11-20
+2009-11-22
+2009-11-24
+2009-11-26
+2009-11-28
+2009-11-30
+2009-12-02
+2009-12-04
+2009-12-06
+2009-12-08
+2009-12-10
+2009-12-12
+2009-12-14
+2009-12-16
+2009-12-18
+2009-12-20
+2009-12-22
+2009-12-24
+2009-12-26
+2009-12-28
+2009-12-30
+2010-01-01
+2010-01-03
+2010-01-05
+2010-01-07
+2010-01-09
+2010-01-11
+2010-01-13
+2010-01-15
+2010-01-17
+2010-01-19
+2010-01-21
+2010-01-23
+2010-01-25
+2010-01-27
+2010-01-29
+2010-01-31
+2010-02-02
+2010-02-04
+2010-02-06
+2010-02-08
+2010-02-10
+2010-02-12
+2010-02-14
+2010-02-16
+2010-02-18
+2010-02-20
+2010-02-22
+2010-02-24
+2010-02-26
+2010-02-28
+2010-03-02
+2010-03-04
+2010-03-06
+2010-03-08
+2010-03-10
+2010-03-12
+2010-03-14
+2010-03-16
+2010-03-18
+2010-03-20
+2010-03-22
+2010-03-24
+2010-03-26
+2010-03-28
+2010-03-30
+2010-04-01
+2010-04-03
+2010-04-05
+2010-04-07
+2010-04-09
+2010-04-11
+2010-04-13
+2010-04-15
+2010-04-17
+2010-04-19
+2010-04-21
+2010-04-23
+2010-04-25
+2010-04-27
+2010-04-29
+2010-05-01
+2010-05-03
+2010-05-05
+2010-05-07
+2010-05-09
+2010-05-11
+2010-05-13
+2010-05-15
+2010-05-17
+2010-05-19
+2010-05-21
+2010-05-23
+2010-05-25
+2010-05-27
+2010-05-29
+2010-05-31
+2010-06-02
+2010-06-04
+2010-06-06
+2010-06-08
+2010-06-10
+2010-06-12
+2010-06-14
+2010-06-16
+2010-06-18
+2010-06-20
+2010-06-22
+2010-06-24
+2010-06-26
+2010-06-28
+2010-06-30
+2010-07-02
+2010-07-04
+2010-07-06
+2010-07-08
+2010-07-10
+2010-07-12
+2010-07-14
+2010-07-16
+2010-07-18
+2010-07-20
+2010-07-22
+2010-07-24
+2010-07-26
+2010-07-28
+2010-07-30
+2010-08-01
+2010-08-03
+2010-08-05
+2010-08-07
+2010-08-09
+2010-08-11
+2010-08-13
+2010-08-15
+2010-08-17
+2010-08-19
+2010-08-21
+2010-08-23
+2010-08-25
+2010-08-27
+2010-08-29
+2010-08-31
+2010-09-02
+2010-09-04
+2010-09-06
+2010-09-08
+2010-09-10
+2010-09-12
+2010-09-14
+2010-09-16
+2010-09-18
+2010-09-20
+2010-09-22
+2010-09-24
+2010-09-26
+2010-09-28
+2010-09-30
+2010-10-02
+2010-10-04
+2010-10-06
+2010-10-08
+2010-10-10
+2010-10-12
+2010-10-14
+2010-10-16
+2010-10-18
+2010-10-20
+2010-10-22
+2010-10-24
+2010-10-26
+2010-10-28
+2010-10-30
+2010-11-01
+2010-11-03
+2010-11-05
+2010-11-07
+2010-11-09
+2010-11-11
+2010-11-13
+2010-11-15
+2010-11-17
+2010-11-19
+2010-11-21
+2010-11-23
+2010-11-25
+2010-11-27
+2010-11-29
+2010-12-01
+2010-12-03
+2010-12-05
+2010-12-07
+2010-12-09
+2010-12-11
+2010-12-13
+2010-12-15
+2010-12-17
+2010-12-19
+2010-12-21
+2010-12-23
+2010-12-25
+2010-12-27
+2010-12-29
+2010-12-31
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase04.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase04.ics
new file mode 100644
index 00000000..6034025d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase04.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Every 10 days\, 5 occurrences:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=DAILY;COUNT=5;INTERVAL=10
+SUMMARY:RExample04
+UID:RExample04
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase04.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase04.ics.comp34.ref
new file mode 100644
index 00000000..51fa5cff
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase04.ics.comp34.ref
@@ -0,0 +1,6 @@
+1997-09-02T09:00:00
+1997-09-12T09:00:00
+1997-09-22T09:00:00
+1997-10-02T09:00:00
+1997-10-12T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase04.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase04.ics.next.ref
new file mode 100644
index 00000000..51fa5cff
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase04.ics.next.ref
@@ -0,0 +1,6 @@
+1997-09-02T09:00:00
+1997-09-12T09:00:00
+1997-09-22T09:00:00
+1997-10-02T09:00:00
+1997-10-12T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase04.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase04.ics.prev.ref
new file mode 100644
index 00000000..5de8dd2a
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase04.ics.prev.ref
@@ -0,0 +1,6 @@
+1997-10-12T09:00:00
+1997-10-02T09:00:00
+1997-09-22T09:00:00
+1997-09-12T09:00:00
+1997-09-02T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase04.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase04.ics.recurson.ref
new file mode 100644
index 00000000..89c9c411
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase04.ics.recurson.ref
@@ -0,0 +1,6 @@
+1997-09-02
+1997-09-12
+1997-09-22
+1997-10-02
+1997-10-12
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase05.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase05.ics
new file mode 100644
index 00000000..7bb29513
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase05.ics
@@ -0,0 +1,34 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Everyday in January\, for 3 years:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19980101T090000
+RRULE:FREQ=YEARLY;UNTIL=20000131T090000Z;BYDAY=SU,MO,TU,WE,TH,FR,SA;BYMONT
+ H=1
+SUMMARY:RExample05a
+UID:RExample05a
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase05.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase05.ics.comp34.ref
new file mode 100644
index 00000000..9b91fdb0
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase05.ics.comp34.ref
@@ -0,0 +1,2 @@
+1998-01-01T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase05.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase05.ics.next.ref
new file mode 100644
index 00000000..cbacb16a
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase05.ics.next.ref
@@ -0,0 +1,93 @@
+1998-01-01T09:00:00
+1998-01-02T09:00:00
+1998-01-03T09:00:00
+1998-01-04T09:00:00
+1998-01-05T09:00:00
+1998-01-06T09:00:00
+1998-01-07T09:00:00
+1998-01-08T09:00:00
+1998-01-09T09:00:00
+1998-01-10T09:00:00
+1998-01-11T09:00:00
+1998-01-12T09:00:00
+1998-01-13T09:00:00
+1998-01-14T09:00:00
+1998-01-15T09:00:00
+1998-01-16T09:00:00
+1998-01-17T09:00:00
+1998-01-18T09:00:00
+1998-01-19T09:00:00
+1998-01-20T09:00:00
+1998-01-21T09:00:00
+1998-01-22T09:00:00
+1998-01-23T09:00:00
+1998-01-24T09:00:00
+1998-01-25T09:00:00
+1998-01-26T09:00:00
+1998-01-27T09:00:00
+1998-01-28T09:00:00
+1998-01-29T09:00:00
+1998-01-30T09:00:00
+1998-01-31T09:00:00
+1999-01-01T09:00:00
+1999-01-02T09:00:00
+1999-01-03T09:00:00
+1999-01-04T09:00:00
+1999-01-05T09:00:00
+1999-01-06T09:00:00
+1999-01-07T09:00:00
+1999-01-08T09:00:00
+1999-01-09T09:00:00
+1999-01-10T09:00:00
+1999-01-11T09:00:00
+1999-01-12T09:00:00
+1999-01-13T09:00:00
+1999-01-14T09:00:00
+1999-01-15T09:00:00
+1999-01-16T09:00:00
+1999-01-17T09:00:00
+1999-01-18T09:00:00
+1999-01-19T09:00:00
+1999-01-20T09:00:00
+1999-01-21T09:00:00
+1999-01-22T09:00:00
+1999-01-23T09:00:00
+1999-01-24T09:00:00
+1999-01-25T09:00:00
+1999-01-26T09:00:00
+1999-01-27T09:00:00
+1999-01-28T09:00:00
+1999-01-29T09:00:00
+1999-01-30T09:00:00
+1999-01-31T09:00:00
+2000-01-01T09:00:00
+2000-01-02T09:00:00
+2000-01-03T09:00:00
+2000-01-04T09:00:00
+2000-01-05T09:00:00
+2000-01-06T09:00:00
+2000-01-07T09:00:00
+2000-01-08T09:00:00
+2000-01-09T09:00:00
+2000-01-10T09:00:00
+2000-01-11T09:00:00
+2000-01-12T09:00:00
+2000-01-13T09:00:00
+2000-01-14T09:00:00
+2000-01-15T09:00:00
+2000-01-16T09:00:00
+2000-01-17T09:00:00
+2000-01-18T09:00:00
+2000-01-19T09:00:00
+2000-01-20T09:00:00
+2000-01-21T09:00:00
+2000-01-22T09:00:00
+2000-01-23T09:00:00
+2000-01-24T09:00:00
+2000-01-25T09:00:00
+2000-01-26T09:00:00
+2000-01-27T09:00:00
+2000-01-28T09:00:00
+2000-01-29T09:00:00
+2000-01-30T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase05.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase05.ics.prev.ref
new file mode 100644
index 00000000..bc435572
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase05.ics.prev.ref
@@ -0,0 +1,93 @@
+2000-01-30T09:00:00
+2000-01-29T09:00:00
+2000-01-28T09:00:00
+2000-01-27T09:00:00
+2000-01-26T09:00:00
+2000-01-25T09:00:00
+2000-01-24T09:00:00
+2000-01-23T09:00:00
+2000-01-22T09:00:00
+2000-01-21T09:00:00
+2000-01-20T09:00:00
+2000-01-19T09:00:00
+2000-01-18T09:00:00
+2000-01-17T09:00:00
+2000-01-16T09:00:00
+2000-01-15T09:00:00
+2000-01-14T09:00:00
+2000-01-13T09:00:00
+2000-01-12T09:00:00
+2000-01-11T09:00:00
+2000-01-10T09:00:00
+2000-01-09T09:00:00
+2000-01-08T09:00:00
+2000-01-07T09:00:00
+2000-01-06T09:00:00
+2000-01-05T09:00:00
+2000-01-04T09:00:00
+2000-01-03T09:00:00
+2000-01-02T09:00:00
+2000-01-01T09:00:00
+1999-01-31T09:00:00
+1999-01-30T09:00:00
+1999-01-29T09:00:00
+1999-01-28T09:00:00
+1999-01-27T09:00:00
+1999-01-26T09:00:00
+1999-01-25T09:00:00
+1999-01-24T09:00:00
+1999-01-23T09:00:00
+1999-01-22T09:00:00
+1999-01-21T09:00:00
+1999-01-20T09:00:00
+1999-01-19T09:00:00
+1999-01-18T09:00:00
+1999-01-17T09:00:00
+1999-01-16T09:00:00
+1999-01-15T09:00:00
+1999-01-14T09:00:00
+1999-01-13T09:00:00
+1999-01-12T09:00:00
+1999-01-11T09:00:00
+1999-01-10T09:00:00
+1999-01-09T09:00:00
+1999-01-08T09:00:00
+1999-01-07T09:00:00
+1999-01-06T09:00:00
+1999-01-05T09:00:00
+1999-01-04T09:00:00
+1999-01-03T09:00:00
+1999-01-02T09:00:00
+1999-01-01T09:00:00
+1998-01-31T09:00:00
+1998-01-30T09:00:00
+1998-01-29T09:00:00
+1998-01-28T09:00:00
+1998-01-27T09:00:00
+1998-01-26T09:00:00
+1998-01-25T09:00:00
+1998-01-24T09:00:00
+1998-01-23T09:00:00
+1998-01-22T09:00:00
+1998-01-21T09:00:00
+1998-01-20T09:00:00
+1998-01-19T09:00:00
+1998-01-18T09:00:00
+1998-01-17T09:00:00
+1998-01-16T09:00:00
+1998-01-15T09:00:00
+1998-01-14T09:00:00
+1998-01-13T09:00:00
+1998-01-12T09:00:00
+1998-01-11T09:00:00
+1998-01-10T09:00:00
+1998-01-09T09:00:00
+1998-01-08T09:00:00
+1998-01-07T09:00:00
+1998-01-06T09:00:00
+1998-01-05T09:00:00
+1998-01-04T09:00:00
+1998-01-03T09:00:00
+1998-01-02T09:00:00
+1998-01-01T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase05.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase05.ics.recurson.ref
new file mode 100644
index 00000000..c4b2c828
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase05.ics.recurson.ref
@@ -0,0 +1,93 @@
+1998-01-01
+1998-01-02
+1998-01-03
+1998-01-04
+1998-01-05
+1998-01-06
+1998-01-07
+1998-01-08
+1998-01-09
+1998-01-10
+1998-01-11
+1998-01-12
+1998-01-13
+1998-01-14
+1998-01-15
+1998-01-16
+1998-01-17
+1998-01-18
+1998-01-19
+1998-01-20
+1998-01-21
+1998-01-22
+1998-01-23
+1998-01-24
+1998-01-25
+1998-01-26
+1998-01-27
+1998-01-28
+1998-01-29
+1998-01-30
+1998-01-31
+1999-01-01
+1999-01-02
+1999-01-03
+1999-01-04
+1999-01-05
+1999-01-06
+1999-01-07
+1999-01-08
+1999-01-09
+1999-01-10
+1999-01-11
+1999-01-12
+1999-01-13
+1999-01-14
+1999-01-15
+1999-01-16
+1999-01-17
+1999-01-18
+1999-01-19
+1999-01-20
+1999-01-21
+1999-01-22
+1999-01-23
+1999-01-24
+1999-01-25
+1999-01-26
+1999-01-27
+1999-01-28
+1999-01-29
+1999-01-30
+1999-01-31
+2000-01-01
+2000-01-02
+2000-01-03
+2000-01-04
+2000-01-05
+2000-01-06
+2000-01-07
+2000-01-08
+2000-01-09
+2000-01-10
+2000-01-11
+2000-01-12
+2000-01-13
+2000-01-14
+2000-01-15
+2000-01-16
+2000-01-17
+2000-01-18
+2000-01-19
+2000-01-20
+2000-01-21
+2000-01-22
+2000-01-23
+2000-01-24
+2000-01-25
+2000-01-26
+2000-01-27
+2000-01-28
+2000-01-29
+2000-01-30
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase06.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase06.ics
new file mode 100644
index 00000000..54db2109
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase06.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Everyday in January\, for 3 years:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19980101T090000
+RRULE:FREQ=DAILY;UNTIL=20000131T090000Z;BYMONTH=1
+SUMMARY:RExample05b
+UID:RExample05b
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase06.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase06.ics.comp34.ref
new file mode 100644
index 00000000..0b1bc308
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase06.ics.comp34.ref
@@ -0,0 +1,500 @@
+1998-01-01T09:00:00
+1998-01-02T09:00:00
+1998-01-03T09:00:00
+1998-01-04T09:00:00
+1998-01-05T09:00:00
+1998-01-06T09:00:00
+1998-01-07T09:00:00
+1998-01-08T09:00:00
+1998-01-09T09:00:00
+1998-01-10T09:00:00
+1998-01-11T09:00:00
+1998-01-12T09:00:00
+1998-01-13T09:00:00
+1998-01-14T09:00:00
+1998-01-15T09:00:00
+1998-01-16T09:00:00
+1998-01-17T09:00:00
+1998-01-18T09:00:00
+1998-01-19T09:00:00
+1998-01-20T09:00:00
+1998-01-21T09:00:00
+1998-01-22T09:00:00
+1998-01-23T09:00:00
+1998-01-24T09:00:00
+1998-01-25T09:00:00
+1998-01-26T09:00:00
+1998-01-27T09:00:00
+1998-01-28T09:00:00
+1998-01-29T09:00:00
+1998-01-30T09:00:00
+1998-01-31T09:00:00
+1998-02-01T09:00:00
+1998-02-02T09:00:00
+1998-02-03T09:00:00
+1998-02-04T09:00:00
+1998-02-05T09:00:00
+1998-02-06T09:00:00
+1998-02-07T09:00:00
+1998-02-08T09:00:00
+1998-02-09T09:00:00
+1998-02-10T09:00:00
+1998-02-11T09:00:00
+1998-02-12T09:00:00
+1998-02-13T09:00:00
+1998-02-14T09:00:00
+1998-02-15T09:00:00
+1998-02-16T09:00:00
+1998-02-17T09:00:00
+1998-02-18T09:00:00
+1998-02-19T09:00:00
+1998-02-20T09:00:00
+1998-02-21T09:00:00
+1998-02-22T09:00:00
+1998-02-23T09:00:00
+1998-02-24T09:00:00
+1998-02-25T09:00:00
+1998-02-26T09:00:00
+1998-02-27T09:00:00
+1998-02-28T09:00:00
+1998-03-01T09:00:00
+1998-03-02T09:00:00
+1998-03-03T09:00:00
+1998-03-04T09:00:00
+1998-03-05T09:00:00
+1998-03-06T09:00:00
+1998-03-07T09:00:00
+1998-03-08T09:00:00
+1998-03-09T09:00:00
+1998-03-10T09:00:00
+1998-03-11T09:00:00
+1998-03-12T09:00:00
+1998-03-13T09:00:00
+1998-03-14T09:00:00
+1998-03-15T09:00:00
+1998-03-16T09:00:00
+1998-03-17T09:00:00
+1998-03-18T09:00:00
+1998-03-19T09:00:00
+1998-03-20T09:00:00
+1998-03-21T09:00:00
+1998-03-22T09:00:00
+1998-03-23T09:00:00
+1998-03-24T09:00:00
+1998-03-25T09:00:00
+1998-03-26T09:00:00
+1998-03-27T09:00:00
+1998-03-28T09:00:00
+1998-03-29T09:00:00
+1998-03-30T09:00:00
+1998-03-31T09:00:00
+1998-04-01T09:00:00
+1998-04-02T09:00:00
+1998-04-03T09:00:00
+1998-04-04T09:00:00
+1998-04-05T09:00:00
+1998-04-06T09:00:00
+1998-04-07T09:00:00
+1998-04-08T09:00:00
+1998-04-09T09:00:00
+1998-04-10T09:00:00
+1998-04-11T09:00:00
+1998-04-12T09:00:00
+1998-04-13T09:00:00
+1998-04-14T09:00:00
+1998-04-15T09:00:00
+1998-04-16T09:00:00
+1998-04-17T09:00:00
+1998-04-18T09:00:00
+1998-04-19T09:00:00
+1998-04-20T09:00:00
+1998-04-21T09:00:00
+1998-04-22T09:00:00
+1998-04-23T09:00:00
+1998-04-24T09:00:00
+1998-04-25T09:00:00
+1998-04-26T09:00:00
+1998-04-27T09:00:00
+1998-04-28T09:00:00
+1998-04-29T09:00:00
+1998-04-30T09:00:00
+1998-05-01T09:00:00
+1998-05-02T09:00:00
+1998-05-03T09:00:00
+1998-05-04T09:00:00
+1998-05-05T09:00:00
+1998-05-06T09:00:00
+1998-05-07T09:00:00
+1998-05-08T09:00:00
+1998-05-09T09:00:00
+1998-05-10T09:00:00
+1998-05-11T09:00:00
+1998-05-12T09:00:00
+1998-05-13T09:00:00
+1998-05-14T09:00:00
+1998-05-15T09:00:00
+1998-05-16T09:00:00
+1998-05-17T09:00:00
+1998-05-18T09:00:00
+1998-05-19T09:00:00
+1998-05-20T09:00:00
+1998-05-21T09:00:00
+1998-05-22T09:00:00
+1998-05-23T09:00:00
+1998-05-24T09:00:00
+1998-05-25T09:00:00
+1998-05-26T09:00:00
+1998-05-27T09:00:00
+1998-05-28T09:00:00
+1998-05-29T09:00:00
+1998-05-30T09:00:00
+1998-05-31T09:00:00
+1998-06-01T09:00:00
+1998-06-02T09:00:00
+1998-06-03T09:00:00
+1998-06-04T09:00:00
+1998-06-05T09:00:00
+1998-06-06T09:00:00
+1998-06-07T09:00:00
+1998-06-08T09:00:00
+1998-06-09T09:00:00
+1998-06-10T09:00:00
+1998-06-11T09:00:00
+1998-06-12T09:00:00
+1998-06-13T09:00:00
+1998-06-14T09:00:00
+1998-06-15T09:00:00
+1998-06-16T09:00:00
+1998-06-17T09:00:00
+1998-06-18T09:00:00
+1998-06-19T09:00:00
+1998-06-20T09:00:00
+1998-06-21T09:00:00
+1998-06-22T09:00:00
+1998-06-23T09:00:00
+1998-06-24T09:00:00
+1998-06-25T09:00:00
+1998-06-26T09:00:00
+1998-06-27T09:00:00
+1998-06-28T09:00:00
+1998-06-29T09:00:00
+1998-06-30T09:00:00
+1998-07-01T09:00:00
+1998-07-02T09:00:00
+1998-07-03T09:00:00
+1998-07-04T09:00:00
+1998-07-05T09:00:00
+1998-07-06T09:00:00
+1998-07-07T09:00:00
+1998-07-08T09:00:00
+1998-07-09T09:00:00
+1998-07-10T09:00:00
+1998-07-11T09:00:00
+1998-07-12T09:00:00
+1998-07-13T09:00:00
+1998-07-14T09:00:00
+1998-07-15T09:00:00
+1998-07-16T09:00:00
+1998-07-17T09:00:00
+1998-07-18T09:00:00
+1998-07-19T09:00:00
+1998-07-20T09:00:00
+1998-07-21T09:00:00
+1998-07-22T09:00:00
+1998-07-23T09:00:00
+1998-07-24T09:00:00
+1998-07-25T09:00:00
+1998-07-26T09:00:00
+1998-07-27T09:00:00
+1998-07-28T09:00:00
+1998-07-29T09:00:00
+1998-07-30T09:00:00
+1998-07-31T09:00:00
+1998-08-01T09:00:00
+1998-08-02T09:00:00
+1998-08-03T09:00:00
+1998-08-04T09:00:00
+1998-08-05T09:00:00
+1998-08-06T09:00:00
+1998-08-07T09:00:00
+1998-08-08T09:00:00
+1998-08-09T09:00:00
+1998-08-10T09:00:00
+1998-08-11T09:00:00
+1998-08-12T09:00:00
+1998-08-13T09:00:00
+1998-08-14T09:00:00
+1998-08-15T09:00:00
+1998-08-16T09:00:00
+1998-08-17T09:00:00
+1998-08-18T09:00:00
+1998-08-19T09:00:00
+1998-08-20T09:00:00
+1998-08-21T09:00:00
+1998-08-22T09:00:00
+1998-08-23T09:00:00
+1998-08-24T09:00:00
+1998-08-25T09:00:00
+1998-08-26T09:00:00
+1998-08-27T09:00:00
+1998-08-28T09:00:00
+1998-08-29T09:00:00
+1998-08-30T09:00:00
+1998-08-31T09:00:00
+1998-09-01T09:00:00
+1998-09-02T09:00:00
+1998-09-03T09:00:00
+1998-09-04T09:00:00
+1998-09-05T09:00:00
+1998-09-06T09:00:00
+1998-09-07T09:00:00
+1998-09-08T09:00:00
+1998-09-09T09:00:00
+1998-09-10T09:00:00
+1998-09-11T09:00:00
+1998-09-12T09:00:00
+1998-09-13T09:00:00
+1998-09-14T09:00:00
+1998-09-15T09:00:00
+1998-09-16T09:00:00
+1998-09-17T09:00:00
+1998-09-18T09:00:00
+1998-09-19T09:00:00
+1998-09-20T09:00:00
+1998-09-21T09:00:00
+1998-09-22T09:00:00
+1998-09-23T09:00:00
+1998-09-24T09:00:00
+1998-09-25T09:00:00
+1998-09-26T09:00:00
+1998-09-27T09:00:00
+1998-09-28T09:00:00
+1998-09-29T09:00:00
+1998-09-30T09:00:00
+1998-10-01T09:00:00
+1998-10-02T09:00:00
+1998-10-03T09:00:00
+1998-10-04T09:00:00
+1998-10-05T09:00:00
+1998-10-06T09:00:00
+1998-10-07T09:00:00
+1998-10-08T09:00:00
+1998-10-09T09:00:00
+1998-10-10T09:00:00
+1998-10-11T09:00:00
+1998-10-12T09:00:00
+1998-10-13T09:00:00
+1998-10-14T09:00:00
+1998-10-15T09:00:00
+1998-10-16T09:00:00
+1998-10-17T09:00:00
+1998-10-18T09:00:00
+1998-10-19T09:00:00
+1998-10-20T09:00:00
+1998-10-21T09:00:00
+1998-10-22T09:00:00
+1998-10-23T09:00:00
+1998-10-24T09:00:00
+1998-10-25T09:00:00
+1998-10-26T09:00:00
+1998-10-27T09:00:00
+1998-10-28T09:00:00
+1998-10-29T09:00:00
+1998-10-30T09:00:00
+1998-10-31T09:00:00
+1998-11-01T09:00:00
+1998-11-02T09:00:00
+1998-11-03T09:00:00
+1998-11-04T09:00:00
+1998-11-05T09:00:00
+1998-11-06T09:00:00
+1998-11-07T09:00:00
+1998-11-08T09:00:00
+1998-11-09T09:00:00
+1998-11-10T09:00:00
+1998-11-11T09:00:00
+1998-11-12T09:00:00
+1998-11-13T09:00:00
+1998-11-14T09:00:00
+1998-11-15T09:00:00
+1998-11-16T09:00:00
+1998-11-17T09:00:00
+1998-11-18T09:00:00
+1998-11-19T09:00:00
+1998-11-20T09:00:00
+1998-11-21T09:00:00
+1998-11-22T09:00:00
+1998-11-23T09:00:00
+1998-11-24T09:00:00
+1998-11-25T09:00:00
+1998-11-26T09:00:00
+1998-11-27T09:00:00
+1998-11-28T09:00:00
+1998-11-29T09:00:00
+1998-11-30T09:00:00
+1998-12-01T09:00:00
+1998-12-02T09:00:00
+1998-12-03T09:00:00
+1998-12-04T09:00:00
+1998-12-05T09:00:00
+1998-12-06T09:00:00
+1998-12-07T09:00:00
+1998-12-08T09:00:00
+1998-12-09T09:00:00
+1998-12-10T09:00:00
+1998-12-11T09:00:00
+1998-12-12T09:00:00
+1998-12-13T09:00:00
+1998-12-14T09:00:00
+1998-12-15T09:00:00
+1998-12-16T09:00:00
+1998-12-17T09:00:00
+1998-12-18T09:00:00
+1998-12-19T09:00:00
+1998-12-20T09:00:00
+1998-12-21T09:00:00
+1998-12-22T09:00:00
+1998-12-23T09:00:00
+1998-12-24T09:00:00
+1998-12-25T09:00:00
+1998-12-26T09:00:00
+1998-12-27T09:00:00
+1998-12-28T09:00:00
+1998-12-29T09:00:00
+1998-12-30T09:00:00
+1998-12-31T09:00:00
+1999-01-01T09:00:00
+1999-01-02T09:00:00
+1999-01-03T09:00:00
+1999-01-04T09:00:00
+1999-01-05T09:00:00
+1999-01-06T09:00:00
+1999-01-07T09:00:00
+1999-01-08T09:00:00
+1999-01-09T09:00:00
+1999-01-10T09:00:00
+1999-01-11T09:00:00
+1999-01-12T09:00:00
+1999-01-13T09:00:00
+1999-01-14T09:00:00
+1999-01-15T09:00:00
+1999-01-16T09:00:00
+1999-01-17T09:00:00
+1999-01-18T09:00:00
+1999-01-19T09:00:00
+1999-01-20T09:00:00
+1999-01-21T09:00:00
+1999-01-22T09:00:00
+1999-01-23T09:00:00
+1999-01-24T09:00:00
+1999-01-25T09:00:00
+1999-01-26T09:00:00
+1999-01-27T09:00:00
+1999-01-28T09:00:00
+1999-01-29T09:00:00
+1999-01-30T09:00:00
+1999-01-31T09:00:00
+1999-02-01T09:00:00
+1999-02-02T09:00:00
+1999-02-03T09:00:00
+1999-02-04T09:00:00
+1999-02-05T09:00:00
+1999-02-06T09:00:00
+1999-02-07T09:00:00
+1999-02-08T09:00:00
+1999-02-09T09:00:00
+1999-02-10T09:00:00
+1999-02-11T09:00:00
+1999-02-12T09:00:00
+1999-02-13T09:00:00
+1999-02-14T09:00:00
+1999-02-15T09:00:00
+1999-02-16T09:00:00
+1999-02-17T09:00:00
+1999-02-18T09:00:00
+1999-02-19T09:00:00
+1999-02-20T09:00:00
+1999-02-21T09:00:00
+1999-02-22T09:00:00
+1999-02-23T09:00:00
+1999-02-24T09:00:00
+1999-02-25T09:00:00
+1999-02-26T09:00:00
+1999-02-27T09:00:00
+1999-02-28T09:00:00
+1999-03-01T09:00:00
+1999-03-02T09:00:00
+1999-03-03T09:00:00
+1999-03-04T09:00:00
+1999-03-05T09:00:00
+1999-03-06T09:00:00
+1999-03-07T09:00:00
+1999-03-08T09:00:00
+1999-03-09T09:00:00
+1999-03-10T09:00:00
+1999-03-11T09:00:00
+1999-03-12T09:00:00
+1999-03-13T09:00:00
+1999-03-14T09:00:00
+1999-03-15T09:00:00
+1999-03-16T09:00:00
+1999-03-17T09:00:00
+1999-03-18T09:00:00
+1999-03-19T09:00:00
+1999-03-20T09:00:00
+1999-03-21T09:00:00
+1999-03-22T09:00:00
+1999-03-23T09:00:00
+1999-03-24T09:00:00
+1999-03-25T09:00:00
+1999-03-26T09:00:00
+1999-03-27T09:00:00
+1999-03-28T09:00:00
+1999-03-29T09:00:00
+1999-03-30T09:00:00
+1999-03-31T09:00:00
+1999-04-01T09:00:00
+1999-04-02T09:00:00
+1999-04-03T09:00:00
+1999-04-04T09:00:00
+1999-04-05T09:00:00
+1999-04-06T09:00:00
+1999-04-07T09:00:00
+1999-04-08T09:00:00
+1999-04-09T09:00:00
+1999-04-10T09:00:00
+1999-04-11T09:00:00
+1999-04-12T09:00:00
+1999-04-13T09:00:00
+1999-04-14T09:00:00
+1999-04-15T09:00:00
+1999-04-16T09:00:00
+1999-04-17T09:00:00
+1999-04-18T09:00:00
+1999-04-19T09:00:00
+1999-04-20T09:00:00
+1999-04-21T09:00:00
+1999-04-22T09:00:00
+1999-04-23T09:00:00
+1999-04-24T09:00:00
+1999-04-25T09:00:00
+1999-04-26T09:00:00
+1999-04-27T09:00:00
+1999-04-28T09:00:00
+1999-04-29T09:00:00
+1999-04-30T09:00:00
+1999-05-01T09:00:00
+1999-05-02T09:00:00
+1999-05-03T09:00:00
+1999-05-04T09:00:00
+1999-05-05T09:00:00
+1999-05-06T09:00:00
+1999-05-07T09:00:00
+1999-05-08T09:00:00
+1999-05-09T09:00:00
+1999-05-10T09:00:00
+1999-05-11T09:00:00
+1999-05-12T09:00:00
+1999-05-13T09:00:00
+1999-05-14T09:00:00
+1999-05-15T09:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase06.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase06.ics.next.ref
new file mode 100644
index 00000000..cbacb16a
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase06.ics.next.ref
@@ -0,0 +1,93 @@
+1998-01-01T09:00:00
+1998-01-02T09:00:00
+1998-01-03T09:00:00
+1998-01-04T09:00:00
+1998-01-05T09:00:00
+1998-01-06T09:00:00
+1998-01-07T09:00:00
+1998-01-08T09:00:00
+1998-01-09T09:00:00
+1998-01-10T09:00:00
+1998-01-11T09:00:00
+1998-01-12T09:00:00
+1998-01-13T09:00:00
+1998-01-14T09:00:00
+1998-01-15T09:00:00
+1998-01-16T09:00:00
+1998-01-17T09:00:00
+1998-01-18T09:00:00
+1998-01-19T09:00:00
+1998-01-20T09:00:00
+1998-01-21T09:00:00
+1998-01-22T09:00:00
+1998-01-23T09:00:00
+1998-01-24T09:00:00
+1998-01-25T09:00:00
+1998-01-26T09:00:00
+1998-01-27T09:00:00
+1998-01-28T09:00:00
+1998-01-29T09:00:00
+1998-01-30T09:00:00
+1998-01-31T09:00:00
+1999-01-01T09:00:00
+1999-01-02T09:00:00
+1999-01-03T09:00:00
+1999-01-04T09:00:00
+1999-01-05T09:00:00
+1999-01-06T09:00:00
+1999-01-07T09:00:00
+1999-01-08T09:00:00
+1999-01-09T09:00:00
+1999-01-10T09:00:00
+1999-01-11T09:00:00
+1999-01-12T09:00:00
+1999-01-13T09:00:00
+1999-01-14T09:00:00
+1999-01-15T09:00:00
+1999-01-16T09:00:00
+1999-01-17T09:00:00
+1999-01-18T09:00:00
+1999-01-19T09:00:00
+1999-01-20T09:00:00
+1999-01-21T09:00:00
+1999-01-22T09:00:00
+1999-01-23T09:00:00
+1999-01-24T09:00:00
+1999-01-25T09:00:00
+1999-01-26T09:00:00
+1999-01-27T09:00:00
+1999-01-28T09:00:00
+1999-01-29T09:00:00
+1999-01-30T09:00:00
+1999-01-31T09:00:00
+2000-01-01T09:00:00
+2000-01-02T09:00:00
+2000-01-03T09:00:00
+2000-01-04T09:00:00
+2000-01-05T09:00:00
+2000-01-06T09:00:00
+2000-01-07T09:00:00
+2000-01-08T09:00:00
+2000-01-09T09:00:00
+2000-01-10T09:00:00
+2000-01-11T09:00:00
+2000-01-12T09:00:00
+2000-01-13T09:00:00
+2000-01-14T09:00:00
+2000-01-15T09:00:00
+2000-01-16T09:00:00
+2000-01-17T09:00:00
+2000-01-18T09:00:00
+2000-01-19T09:00:00
+2000-01-20T09:00:00
+2000-01-21T09:00:00
+2000-01-22T09:00:00
+2000-01-23T09:00:00
+2000-01-24T09:00:00
+2000-01-25T09:00:00
+2000-01-26T09:00:00
+2000-01-27T09:00:00
+2000-01-28T09:00:00
+2000-01-29T09:00:00
+2000-01-30T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase06.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase06.ics.prev.ref
new file mode 100644
index 00000000..bc435572
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase06.ics.prev.ref
@@ -0,0 +1,93 @@
+2000-01-30T09:00:00
+2000-01-29T09:00:00
+2000-01-28T09:00:00
+2000-01-27T09:00:00
+2000-01-26T09:00:00
+2000-01-25T09:00:00
+2000-01-24T09:00:00
+2000-01-23T09:00:00
+2000-01-22T09:00:00
+2000-01-21T09:00:00
+2000-01-20T09:00:00
+2000-01-19T09:00:00
+2000-01-18T09:00:00
+2000-01-17T09:00:00
+2000-01-16T09:00:00
+2000-01-15T09:00:00
+2000-01-14T09:00:00
+2000-01-13T09:00:00
+2000-01-12T09:00:00
+2000-01-11T09:00:00
+2000-01-10T09:00:00
+2000-01-09T09:00:00
+2000-01-08T09:00:00
+2000-01-07T09:00:00
+2000-01-06T09:00:00
+2000-01-05T09:00:00
+2000-01-04T09:00:00
+2000-01-03T09:00:00
+2000-01-02T09:00:00
+2000-01-01T09:00:00
+1999-01-31T09:00:00
+1999-01-30T09:00:00
+1999-01-29T09:00:00
+1999-01-28T09:00:00
+1999-01-27T09:00:00
+1999-01-26T09:00:00
+1999-01-25T09:00:00
+1999-01-24T09:00:00
+1999-01-23T09:00:00
+1999-01-22T09:00:00
+1999-01-21T09:00:00
+1999-01-20T09:00:00
+1999-01-19T09:00:00
+1999-01-18T09:00:00
+1999-01-17T09:00:00
+1999-01-16T09:00:00
+1999-01-15T09:00:00
+1999-01-14T09:00:00
+1999-01-13T09:00:00
+1999-01-12T09:00:00
+1999-01-11T09:00:00
+1999-01-10T09:00:00
+1999-01-09T09:00:00
+1999-01-08T09:00:00
+1999-01-07T09:00:00
+1999-01-06T09:00:00
+1999-01-05T09:00:00
+1999-01-04T09:00:00
+1999-01-03T09:00:00
+1999-01-02T09:00:00
+1999-01-01T09:00:00
+1998-01-31T09:00:00
+1998-01-30T09:00:00
+1998-01-29T09:00:00
+1998-01-28T09:00:00
+1998-01-27T09:00:00
+1998-01-26T09:00:00
+1998-01-25T09:00:00
+1998-01-24T09:00:00
+1998-01-23T09:00:00
+1998-01-22T09:00:00
+1998-01-21T09:00:00
+1998-01-20T09:00:00
+1998-01-19T09:00:00
+1998-01-18T09:00:00
+1998-01-17T09:00:00
+1998-01-16T09:00:00
+1998-01-15T09:00:00
+1998-01-14T09:00:00
+1998-01-13T09:00:00
+1998-01-12T09:00:00
+1998-01-11T09:00:00
+1998-01-10T09:00:00
+1998-01-09T09:00:00
+1998-01-08T09:00:00
+1998-01-07T09:00:00
+1998-01-06T09:00:00
+1998-01-05T09:00:00
+1998-01-04T09:00:00
+1998-01-03T09:00:00
+1998-01-02T09:00:00
+1998-01-01T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase06.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase06.ics.recurson.ref
new file mode 100644
index 00000000..c4b2c828
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase06.ics.recurson.ref
@@ -0,0 +1,93 @@
+1998-01-01
+1998-01-02
+1998-01-03
+1998-01-04
+1998-01-05
+1998-01-06
+1998-01-07
+1998-01-08
+1998-01-09
+1998-01-10
+1998-01-11
+1998-01-12
+1998-01-13
+1998-01-14
+1998-01-15
+1998-01-16
+1998-01-17
+1998-01-18
+1998-01-19
+1998-01-20
+1998-01-21
+1998-01-22
+1998-01-23
+1998-01-24
+1998-01-25
+1998-01-26
+1998-01-27
+1998-01-28
+1998-01-29
+1998-01-30
+1998-01-31
+1999-01-01
+1999-01-02
+1999-01-03
+1999-01-04
+1999-01-05
+1999-01-06
+1999-01-07
+1999-01-08
+1999-01-09
+1999-01-10
+1999-01-11
+1999-01-12
+1999-01-13
+1999-01-14
+1999-01-15
+1999-01-16
+1999-01-17
+1999-01-18
+1999-01-19
+1999-01-20
+1999-01-21
+1999-01-22
+1999-01-23
+1999-01-24
+1999-01-25
+1999-01-26
+1999-01-27
+1999-01-28
+1999-01-29
+1999-01-30
+1999-01-31
+2000-01-01
+2000-01-02
+2000-01-03
+2000-01-04
+2000-01-05
+2000-01-06
+2000-01-07
+2000-01-08
+2000-01-09
+2000-01-10
+2000-01-11
+2000-01-12
+2000-01-13
+2000-01-14
+2000-01-15
+2000-01-16
+2000-01-17
+2000-01-18
+2000-01-19
+2000-01-20
+2000-01-21
+2000-01-22
+2000-01-23
+2000-01-24
+2000-01-25
+2000-01-26
+2000-01-27
+2000-01-28
+2000-01-29
+2000-01-30
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase07.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase07.ics
new file mode 100644
index 00000000..d3745d85
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase07.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Weekly for 10 occurrences
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=WEEKLY;COUNT=10
+SUMMARY:RExample06
+UID:RExample06
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase07.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase07.ics.comp34.ref
new file mode 100644
index 00000000..6d3cbe1f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase07.ics.comp34.ref
@@ -0,0 +1,2 @@
+1997-09-02T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase07.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase07.ics.next.ref
new file mode 100644
index 00000000..de47b09d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase07.ics.next.ref
@@ -0,0 +1,11 @@
+1997-09-02T09:00:00
+1997-09-09T09:00:00
+1997-09-16T09:00:00
+1997-09-23T09:00:00
+1997-09-30T09:00:00
+1997-10-07T09:00:00
+1997-10-14T09:00:00
+1997-10-21T09:00:00
+1997-10-28T09:00:00
+1997-11-04T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase07.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase07.ics.prev.ref
new file mode 100644
index 00000000..f1055326
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase07.ics.prev.ref
@@ -0,0 +1,11 @@
+1997-11-04T09:00:00
+1997-10-28T09:00:00
+1997-10-21T09:00:00
+1997-10-14T09:00:00
+1997-10-07T09:00:00
+1997-09-30T09:00:00
+1997-09-23T09:00:00
+1997-09-16T09:00:00
+1997-09-09T09:00:00
+1997-09-02T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase07.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase07.ics.recurson.ref
new file mode 100644
index 00000000..c7235812
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase07.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-09-02
+1997-09-09
+1997-09-16
+1997-09-23
+1997-09-30
+1997-10-07
+1997-10-14
+1997-10-21
+1997-10-28
+1997-11-04
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase08.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase08.ics
new file mode 100644
index 00000000..ac3eb924
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase08.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Weekly until December 24\, 1997
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z
+SUMMARY:RExample07
+UID:RExample07
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase08.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase08.ics.comp34.ref
new file mode 100644
index 00000000..6ea9e7e7
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase08.ics.comp34.ref
@@ -0,0 +1,18 @@
+1997-09-02T09:00:00
+1997-09-07T09:00:00
+1997-09-14T09:00:00
+1997-09-21T09:00:00
+1997-09-28T09:00:00
+1997-10-05T09:00:00
+1997-10-12T09:00:00
+1997-10-19T09:00:00
+1997-10-26T09:00:00
+1997-11-02T09:00:00
+1997-11-09T09:00:00
+1997-11-16T09:00:00
+1997-11-23T09:00:00
+1997-11-30T09:00:00
+1997-12-07T09:00:00
+1997-12-14T09:00:00
+1997-12-21T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase08.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase08.ics.next.ref
new file mode 100644
index 00000000..b1a49440
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase08.ics.next.ref
@@ -0,0 +1,18 @@
+1997-09-02T09:00:00
+1997-09-09T09:00:00
+1997-09-16T09:00:00
+1997-09-23T09:00:00
+1997-09-30T09:00:00
+1997-10-07T09:00:00
+1997-10-14T09:00:00
+1997-10-21T09:00:00
+1997-10-28T09:00:00
+1997-11-04T09:00:00
+1997-11-11T09:00:00
+1997-11-18T09:00:00
+1997-11-25T09:00:00
+1997-12-02T09:00:00
+1997-12-09T09:00:00
+1997-12-16T09:00:00
+1997-12-23T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase08.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase08.ics.prev.ref
new file mode 100644
index 00000000..6615f5fc
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase08.ics.prev.ref
@@ -0,0 +1,18 @@
+1997-12-23T09:00:00
+1997-12-16T09:00:00
+1997-12-09T09:00:00
+1997-12-02T09:00:00
+1997-11-25T09:00:00
+1997-11-18T09:00:00
+1997-11-11T09:00:00
+1997-11-04T09:00:00
+1997-10-28T09:00:00
+1997-10-21T09:00:00
+1997-10-14T09:00:00
+1997-10-07T09:00:00
+1997-09-30T09:00:00
+1997-09-23T09:00:00
+1997-09-16T09:00:00
+1997-09-09T09:00:00
+1997-09-02T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase08.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase08.ics.recurson.ref
new file mode 100644
index 00000000..65a03b29
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase08.ics.recurson.ref
@@ -0,0 +1,18 @@
+1997-09-02
+1997-09-09
+1997-09-16
+1997-09-23
+1997-09-30
+1997-10-07
+1997-10-14
+1997-10-21
+1997-10-28
+1997-11-04
+1997-11-11
+1997-11-18
+1997-11-25
+1997-12-02
+1997-12-09
+1997-12-16
+1997-12-23
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase09.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase09.ics
new file mode 100644
index 00000000..ca4904aa
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase09.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Every other week - forever:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=WEEKLY;INTERVAL=2;WKST=SU
+SUMMARY:RExample08
+UID:RExample08
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase09.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase09.ics.comp34.ref
new file mode 100644
index 00000000..0fb0f691
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase09.ics.comp34.ref
@@ -0,0 +1,500 @@
+1997-09-02T09:00:00
+1997-09-13T09:00:00
+1997-09-27T09:00:00
+1997-10-11T09:00:00
+1997-10-25T09:00:00
+1997-11-08T09:00:00
+1997-11-22T09:00:00
+1997-12-06T09:00:00
+1997-12-20T09:00:00
+1998-01-03T09:00:00
+1998-01-17T09:00:00
+1998-01-31T09:00:00
+1998-02-14T09:00:00
+1998-02-28T09:00:00
+1998-03-14T09:00:00
+1998-03-28T09:00:00
+1998-04-11T09:00:00
+1998-04-25T09:00:00
+1998-05-09T09:00:00
+1998-05-23T09:00:00
+1998-06-06T09:00:00
+1998-06-20T09:00:00
+1998-07-04T09:00:00
+1998-07-18T09:00:00
+1998-08-01T09:00:00
+1998-08-15T09:00:00
+1998-08-29T09:00:00
+1998-09-12T09:00:00
+1998-09-26T09:00:00
+1998-10-10T09:00:00
+1998-10-24T09:00:00
+1998-11-07T09:00:00
+1998-11-21T09:00:00
+1998-12-05T09:00:00
+1998-12-19T09:00:00
+1999-01-02T09:00:00
+1999-01-16T09:00:00
+1999-01-30T09:00:00
+1999-02-13T09:00:00
+1999-02-27T09:00:00
+1999-03-13T09:00:00
+1999-03-27T09:00:00
+1999-04-10T09:00:00
+1999-04-24T09:00:00
+1999-05-08T09:00:00
+1999-05-22T09:00:00
+1999-06-05T09:00:00
+1999-06-19T09:00:00
+1999-07-03T09:00:00
+1999-07-17T09:00:00
+1999-07-31T09:00:00
+1999-08-14T09:00:00
+1999-08-28T09:00:00
+1999-09-11T09:00:00
+1999-09-25T09:00:00
+1999-10-09T09:00:00
+1999-10-23T09:00:00
+1999-11-06T09:00:00
+1999-11-20T09:00:00
+1999-12-04T09:00:00
+1999-12-18T09:00:00
+2000-01-01T09:00:00
+2000-01-15T09:00:00
+2000-01-29T09:00:00
+2000-02-12T09:00:00
+2000-02-26T09:00:00
+2000-03-11T09:00:00
+2000-03-25T09:00:00
+2000-04-08T09:00:00
+2000-04-22T09:00:00
+2000-05-06T09:00:00
+2000-05-20T09:00:00
+2000-06-03T09:00:00
+2000-06-17T09:00:00
+2000-07-01T09:00:00
+2000-07-15T09:00:00
+2000-07-29T09:00:00
+2000-08-12T09:00:00
+2000-08-26T09:00:00
+2000-09-09T09:00:00
+2000-09-23T09:00:00
+2000-10-07T09:00:00
+2000-10-21T09:00:00
+2000-11-04T09:00:00
+2000-11-18T09:00:00
+2000-12-02T09:00:00
+2000-12-16T09:00:00
+2000-12-30T09:00:00
+2001-01-13T09:00:00
+2001-01-27T09:00:00
+2001-02-10T09:00:00
+2001-02-24T09:00:00
+2001-03-10T09:00:00
+2001-03-24T09:00:00
+2001-04-07T09:00:00
+2001-04-21T09:00:00
+2001-05-05T09:00:00
+2001-05-19T09:00:00
+2001-06-02T09:00:00
+2001-06-16T09:00:00
+2001-06-30T09:00:00
+2001-07-14T09:00:00
+2001-07-28T09:00:00
+2001-08-11T09:00:00
+2001-08-25T09:00:00
+2001-09-08T09:00:00
+2001-09-22T09:00:00
+2001-10-06T09:00:00
+2001-10-20T09:00:00
+2001-11-03T09:00:00
+2001-11-17T09:00:00
+2001-12-01T09:00:00
+2001-12-15T09:00:00
+2001-12-29T09:00:00
+2002-01-12T09:00:00
+2002-01-26T09:00:00
+2002-02-09T09:00:00
+2002-02-23T09:00:00
+2002-03-09T09:00:00
+2002-03-23T09:00:00
+2002-04-06T09:00:00
+2002-04-20T09:00:00
+2002-05-04T09:00:00
+2002-05-18T09:00:00
+2002-06-01T09:00:00
+2002-06-15T09:00:00
+2002-06-29T09:00:00
+2002-07-13T09:00:00
+2002-07-27T09:00:00
+2002-08-10T09:00:00
+2002-08-24T09:00:00
+2002-09-07T09:00:00
+2002-09-21T09:00:00
+2002-10-05T09:00:00
+2002-10-19T09:00:00
+2002-11-02T09:00:00
+2002-11-16T09:00:00
+2002-11-30T09:00:00
+2002-12-14T09:00:00
+2002-12-28T09:00:00
+2003-01-11T09:00:00
+2003-01-25T09:00:00
+2003-02-08T09:00:00
+2003-02-22T09:00:00
+2003-03-08T09:00:00
+2003-03-22T09:00:00
+2003-04-05T09:00:00
+2003-04-19T09:00:00
+2003-05-03T09:00:00
+2003-05-17T09:00:00
+2003-05-31T09:00:00
+2003-06-14T09:00:00
+2003-06-28T09:00:00
+2003-07-12T09:00:00
+2003-07-26T09:00:00
+2003-08-09T09:00:00
+2003-08-23T09:00:00
+2003-09-06T09:00:00
+2003-09-20T09:00:00
+2003-10-04T09:00:00
+2003-10-18T09:00:00
+2003-11-01T09:00:00
+2003-11-15T09:00:00
+2003-11-29T09:00:00
+2003-12-13T09:00:00
+2003-12-27T09:00:00
+2004-01-10T09:00:00
+2004-01-24T09:00:00
+2004-02-07T09:00:00
+2004-02-21T09:00:00
+2004-03-06T09:00:00
+2004-03-20T09:00:00
+2004-04-03T09:00:00
+2004-04-17T09:00:00
+2004-05-01T09:00:00
+2004-05-15T09:00:00
+2004-05-29T09:00:00
+2004-06-12T09:00:00
+2004-06-26T09:00:00
+2004-07-10T09:00:00
+2004-07-24T09:00:00
+2004-08-07T09:00:00
+2004-08-21T09:00:00
+2004-09-04T09:00:00
+2004-09-18T09:00:00
+2004-10-02T09:00:00
+2004-10-16T09:00:00
+2004-10-30T09:00:00
+2004-11-13T09:00:00
+2004-11-27T09:00:00
+2004-12-11T09:00:00
+2004-12-25T09:00:00
+2005-01-08T09:00:00
+2005-01-22T09:00:00
+2005-02-05T09:00:00
+2005-02-19T09:00:00
+2005-03-05T09:00:00
+2005-03-19T09:00:00
+2005-04-02T09:00:00
+2005-04-16T09:00:00
+2005-04-30T09:00:00
+2005-05-14T09:00:00
+2005-05-28T09:00:00
+2005-06-11T09:00:00
+2005-06-25T09:00:00
+2005-07-09T09:00:00
+2005-07-23T09:00:00
+2005-08-06T09:00:00
+2005-08-20T09:00:00
+2005-09-03T09:00:00
+2005-09-17T09:00:00
+2005-10-01T09:00:00
+2005-10-15T09:00:00
+2005-10-29T09:00:00
+2005-11-12T09:00:00
+2005-11-26T09:00:00
+2005-12-10T09:00:00
+2005-12-24T09:00:00
+2006-01-07T09:00:00
+2006-01-21T09:00:00
+2006-02-04T09:00:00
+2006-02-18T09:00:00
+2006-03-04T09:00:00
+2006-03-18T09:00:00
+2006-04-01T09:00:00
+2006-04-15T09:00:00
+2006-04-29T09:00:00
+2006-05-13T09:00:00
+2006-05-27T09:00:00
+2006-06-10T09:00:00
+2006-06-24T09:00:00
+2006-07-08T09:00:00
+2006-07-22T09:00:00
+2006-08-05T09:00:00
+2006-08-19T09:00:00
+2006-09-02T09:00:00
+2006-09-16T09:00:00
+2006-09-30T09:00:00
+2006-10-14T09:00:00
+2006-10-28T09:00:00
+2006-11-11T09:00:00
+2006-11-25T09:00:00
+2006-12-09T09:00:00
+2006-12-23T09:00:00
+2007-01-06T09:00:00
+2007-01-20T09:00:00
+2007-02-03T09:00:00
+2007-02-17T09:00:00
+2007-03-03T09:00:00
+2007-03-17T09:00:00
+2007-03-31T09:00:00
+2007-04-14T09:00:00
+2007-04-28T09:00:00
+2007-05-12T09:00:00
+2007-05-26T09:00:00
+2007-06-09T09:00:00
+2007-06-23T09:00:00
+2007-07-07T09:00:00
+2007-07-21T09:00:00
+2007-08-04T09:00:00
+2007-08-18T09:00:00
+2007-09-01T09:00:00
+2007-09-15T09:00:00
+2007-09-29T09:00:00
+2007-10-13T09:00:00
+2007-10-27T09:00:00
+2007-11-10T09:00:00
+2007-11-24T09:00:00
+2007-12-08T09:00:00
+2007-12-22T09:00:00
+2008-01-05T09:00:00
+2008-01-19T09:00:00
+2008-02-02T09:00:00
+2008-02-16T09:00:00
+2008-03-01T09:00:00
+2008-03-15T09:00:00
+2008-03-29T09:00:00
+2008-04-12T09:00:00
+2008-04-26T09:00:00
+2008-05-10T09:00:00
+2008-05-24T09:00:00
+2008-06-07T09:00:00
+2008-06-21T09:00:00
+2008-07-05T09:00:00
+2008-07-19T09:00:00
+2008-08-02T09:00:00
+2008-08-16T09:00:00
+2008-08-30T09:00:00
+2008-09-13T09:00:00
+2008-09-27T09:00:00
+2008-10-11T09:00:00
+2008-10-25T09:00:00
+2008-11-08T09:00:00
+2008-11-22T09:00:00
+2008-12-06T09:00:00
+2008-12-20T09:00:00
+2009-01-03T09:00:00
+2009-01-17T09:00:00
+2009-01-31T09:00:00
+2009-02-14T09:00:00
+2009-02-28T09:00:00
+2009-03-14T09:00:00
+2009-03-28T09:00:00
+2009-04-11T09:00:00
+2009-04-25T09:00:00
+2009-05-09T09:00:00
+2009-05-23T09:00:00
+2009-06-06T09:00:00
+2009-06-20T09:00:00
+2009-07-04T09:00:00
+2009-07-18T09:00:00
+2009-08-01T09:00:00
+2009-08-15T09:00:00
+2009-08-29T09:00:00
+2009-09-12T09:00:00
+2009-09-26T09:00:00
+2009-10-10T09:00:00
+2009-10-24T09:00:00
+2009-11-07T09:00:00
+2009-11-21T09:00:00
+2009-12-05T09:00:00
+2009-12-19T09:00:00
+2010-01-02T09:00:00
+2010-01-16T09:00:00
+2010-01-30T09:00:00
+2010-02-13T09:00:00
+2010-02-27T09:00:00
+2010-03-13T09:00:00
+2010-03-27T09:00:00
+2010-04-10T09:00:00
+2010-04-24T09:00:00
+2010-05-08T09:00:00
+2010-05-22T09:00:00
+2010-06-05T09:00:00
+2010-06-19T09:00:00
+2010-07-03T09:00:00
+2010-07-17T09:00:00
+2010-07-31T09:00:00
+2010-08-14T09:00:00
+2010-08-28T09:00:00
+2010-09-11T09:00:00
+2010-09-25T09:00:00
+2010-10-09T09:00:00
+2010-10-23T09:00:00
+2010-11-06T09:00:00
+2010-11-20T09:00:00
+2010-12-04T09:00:00
+2010-12-18T09:00:00
+2011-01-01T09:00:00
+2011-01-15T09:00:00
+2011-01-29T09:00:00
+2011-02-12T09:00:00
+2011-02-26T09:00:00
+2011-03-12T09:00:00
+2011-03-26T09:00:00
+2011-04-09T09:00:00
+2011-04-23T09:00:00
+2011-05-07T09:00:00
+2011-05-21T09:00:00
+2011-06-04T09:00:00
+2011-06-18T09:00:00
+2011-07-02T09:00:00
+2011-07-16T09:00:00
+2011-07-30T09:00:00
+2011-08-13T09:00:00
+2011-08-27T09:00:00
+2011-09-10T09:00:00
+2011-09-24T09:00:00
+2011-10-08T09:00:00
+2011-10-22T09:00:00
+2011-11-05T09:00:00
+2011-11-19T09:00:00
+2011-12-03T09:00:00
+2011-12-17T09:00:00
+2011-12-31T09:00:00
+2012-01-14T09:00:00
+2012-01-28T09:00:00
+2012-02-11T09:00:00
+2012-02-25T09:00:00
+2012-03-10T09:00:00
+2012-03-24T09:00:00
+2012-04-07T09:00:00
+2012-04-21T09:00:00
+2012-05-05T09:00:00
+2012-05-19T09:00:00
+2012-06-02T09:00:00
+2012-06-16T09:00:00
+2012-06-30T09:00:00
+2012-07-14T09:00:00
+2012-07-28T09:00:00
+2012-08-11T09:00:00
+2012-08-25T09:00:00
+2012-09-08T09:00:00
+2012-09-22T09:00:00
+2012-10-06T09:00:00
+2012-10-20T09:00:00
+2012-11-03T09:00:00
+2012-11-17T09:00:00
+2012-12-01T09:00:00
+2012-12-15T09:00:00
+2012-12-29T09:00:00
+2013-01-12T09:00:00
+2013-01-26T09:00:00
+2013-02-09T09:00:00
+2013-02-23T09:00:00
+2013-03-09T09:00:00
+2013-03-23T09:00:00
+2013-04-06T09:00:00
+2013-04-20T09:00:00
+2013-05-04T09:00:00
+2013-05-18T09:00:00
+2013-06-01T09:00:00
+2013-06-15T09:00:00
+2013-06-29T09:00:00
+2013-07-13T09:00:00
+2013-07-27T09:00:00
+2013-08-10T09:00:00
+2013-08-24T09:00:00
+2013-09-07T09:00:00
+2013-09-21T09:00:00
+2013-10-05T09:00:00
+2013-10-19T09:00:00
+2013-11-02T09:00:00
+2013-11-16T09:00:00
+2013-11-30T09:00:00
+2013-12-14T09:00:00
+2013-12-28T09:00:00
+2014-01-11T09:00:00
+2014-01-25T09:00:00
+2014-02-08T09:00:00
+2014-02-22T09:00:00
+2014-03-08T09:00:00
+2014-03-22T09:00:00
+2014-04-05T09:00:00
+2014-04-19T09:00:00
+2014-05-03T09:00:00
+2014-05-17T09:00:00
+2014-05-31T09:00:00
+2014-06-14T09:00:00
+2014-06-28T09:00:00
+2014-07-12T09:00:00
+2014-07-26T09:00:00
+2014-08-09T09:00:00
+2014-08-23T09:00:00
+2014-09-06T09:00:00
+2014-09-20T09:00:00
+2014-10-04T09:00:00
+2014-10-18T09:00:00
+2014-11-01T09:00:00
+2014-11-15T09:00:00
+2014-11-29T09:00:00
+2014-12-13T09:00:00
+2014-12-27T09:00:00
+2015-01-10T09:00:00
+2015-01-24T09:00:00
+2015-02-07T09:00:00
+2015-02-21T09:00:00
+2015-03-07T09:00:00
+2015-03-21T09:00:00
+2015-04-04T09:00:00
+2015-04-18T09:00:00
+2015-05-02T09:00:00
+2015-05-16T09:00:00
+2015-05-30T09:00:00
+2015-06-13T09:00:00
+2015-06-27T09:00:00
+2015-07-11T09:00:00
+2015-07-25T09:00:00
+2015-08-08T09:00:00
+2015-08-22T09:00:00
+2015-09-05T09:00:00
+2015-09-19T09:00:00
+2015-10-03T09:00:00
+2015-10-17T09:00:00
+2015-10-31T09:00:00
+2015-11-14T09:00:00
+2015-11-28T09:00:00
+2015-12-12T09:00:00
+2015-12-26T09:00:00
+2016-01-09T09:00:00
+2016-01-23T09:00:00
+2016-02-06T09:00:00
+2016-02-20T09:00:00
+2016-03-05T09:00:00
+2016-03-19T09:00:00
+2016-04-02T09:00:00
+2016-04-16T09:00:00
+2016-04-30T09:00:00
+2016-05-14T09:00:00
+2016-05-28T09:00:00
+2016-06-11T09:00:00
+2016-06-25T09:00:00
+2016-07-09T09:00:00
+2016-07-23T09:00:00
+2016-08-06T09:00:00
+2016-08-20T09:00:00
+2016-09-03T09:00:00
+2016-09-17T09:00:00
+2016-10-01T09:00:00
+2016-10-15T09:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase09.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase09.ics.next.ref
new file mode 100644
index 00000000..ec123511
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase09.ics.next.ref
@@ -0,0 +1,500 @@
+1997-09-02T09:00:00
+1997-09-16T09:00:00
+1997-09-30T09:00:00
+1997-10-14T09:00:00
+1997-10-28T09:00:00
+1997-11-11T09:00:00
+1997-11-25T09:00:00
+1997-12-09T09:00:00
+1997-12-23T09:00:00
+1998-01-06T09:00:00
+1998-01-20T09:00:00
+1998-02-03T09:00:00
+1998-02-17T09:00:00
+1998-03-03T09:00:00
+1998-03-17T09:00:00
+1998-03-31T09:00:00
+1998-04-14T09:00:00
+1998-04-28T09:00:00
+1998-05-12T09:00:00
+1998-05-26T09:00:00
+1998-06-09T09:00:00
+1998-06-23T09:00:00
+1998-07-07T09:00:00
+1998-07-21T09:00:00
+1998-08-04T09:00:00
+1998-08-18T09:00:00
+1998-09-01T09:00:00
+1998-09-15T09:00:00
+1998-09-29T09:00:00
+1998-10-13T09:00:00
+1998-10-27T09:00:00
+1998-11-10T09:00:00
+1998-11-24T09:00:00
+1998-12-08T09:00:00
+1998-12-22T09:00:00
+1999-01-05T09:00:00
+1999-01-19T09:00:00
+1999-02-02T09:00:00
+1999-02-16T09:00:00
+1999-03-02T09:00:00
+1999-03-16T09:00:00
+1999-03-30T09:00:00
+1999-04-13T09:00:00
+1999-04-27T09:00:00
+1999-05-11T09:00:00
+1999-05-25T09:00:00
+1999-06-08T09:00:00
+1999-06-22T09:00:00
+1999-07-06T09:00:00
+1999-07-20T09:00:00
+1999-08-03T09:00:00
+1999-08-17T09:00:00
+1999-08-31T09:00:00
+1999-09-14T09:00:00
+1999-09-28T09:00:00
+1999-10-12T09:00:00
+1999-10-26T09:00:00
+1999-11-09T09:00:00
+1999-11-23T09:00:00
+1999-12-07T09:00:00
+1999-12-21T09:00:00
+2000-01-04T09:00:00
+2000-01-18T09:00:00
+2000-02-01T09:00:00
+2000-02-15T09:00:00
+2000-02-29T09:00:00
+2000-03-14T09:00:00
+2000-03-28T09:00:00
+2000-04-11T09:00:00
+2000-04-25T09:00:00
+2000-05-09T09:00:00
+2000-05-23T09:00:00
+2000-06-06T09:00:00
+2000-06-20T09:00:00
+2000-07-04T09:00:00
+2000-07-18T09:00:00
+2000-08-01T09:00:00
+2000-08-15T09:00:00
+2000-08-29T09:00:00
+2000-09-12T09:00:00
+2000-09-26T09:00:00
+2000-10-10T09:00:00
+2000-10-24T09:00:00
+2000-11-07T09:00:00
+2000-11-21T09:00:00
+2000-12-05T09:00:00
+2000-12-19T09:00:00
+2001-01-02T09:00:00
+2001-01-16T09:00:00
+2001-01-30T09:00:00
+2001-02-13T09:00:00
+2001-02-27T09:00:00
+2001-03-13T09:00:00
+2001-03-27T09:00:00
+2001-04-10T09:00:00
+2001-04-24T09:00:00
+2001-05-08T09:00:00
+2001-05-22T09:00:00
+2001-06-05T09:00:00
+2001-06-19T09:00:00
+2001-07-03T09:00:00
+2001-07-17T09:00:00
+2001-07-31T09:00:00
+2001-08-14T09:00:00
+2001-08-28T09:00:00
+2001-09-11T09:00:00
+2001-09-25T09:00:00
+2001-10-09T09:00:00
+2001-10-23T09:00:00
+2001-11-06T09:00:00
+2001-11-20T09:00:00
+2001-12-04T09:00:00
+2001-12-18T09:00:00
+2002-01-01T09:00:00
+2002-01-15T09:00:00
+2002-01-29T09:00:00
+2002-02-12T09:00:00
+2002-02-26T09:00:00
+2002-03-12T09:00:00
+2002-03-26T09:00:00
+2002-04-09T09:00:00
+2002-04-23T09:00:00
+2002-05-07T09:00:00
+2002-05-21T09:00:00
+2002-06-04T09:00:00
+2002-06-18T09:00:00
+2002-07-02T09:00:00
+2002-07-16T09:00:00
+2002-07-30T09:00:00
+2002-08-13T09:00:00
+2002-08-27T09:00:00
+2002-09-10T09:00:00
+2002-09-24T09:00:00
+2002-10-08T09:00:00
+2002-10-22T09:00:00
+2002-11-05T09:00:00
+2002-11-19T09:00:00
+2002-12-03T09:00:00
+2002-12-17T09:00:00
+2002-12-31T09:00:00
+2003-01-14T09:00:00
+2003-01-28T09:00:00
+2003-02-11T09:00:00
+2003-02-25T09:00:00
+2003-03-11T09:00:00
+2003-03-25T09:00:00
+2003-04-08T09:00:00
+2003-04-22T09:00:00
+2003-05-06T09:00:00
+2003-05-20T09:00:00
+2003-06-03T09:00:00
+2003-06-17T09:00:00
+2003-07-01T09:00:00
+2003-07-15T09:00:00
+2003-07-29T09:00:00
+2003-08-12T09:00:00
+2003-08-26T09:00:00
+2003-09-09T09:00:00
+2003-09-23T09:00:00
+2003-10-07T09:00:00
+2003-10-21T09:00:00
+2003-11-04T09:00:00
+2003-11-18T09:00:00
+2003-12-02T09:00:00
+2003-12-16T09:00:00
+2003-12-30T09:00:00
+2004-01-13T09:00:00
+2004-01-27T09:00:00
+2004-02-10T09:00:00
+2004-02-24T09:00:00
+2004-03-09T09:00:00
+2004-03-23T09:00:00
+2004-04-06T09:00:00
+2004-04-20T09:00:00
+2004-05-04T09:00:00
+2004-05-18T09:00:00
+2004-06-01T09:00:00
+2004-06-15T09:00:00
+2004-06-29T09:00:00
+2004-07-13T09:00:00
+2004-07-27T09:00:00
+2004-08-10T09:00:00
+2004-08-24T09:00:00
+2004-09-07T09:00:00
+2004-09-21T09:00:00
+2004-10-05T09:00:00
+2004-10-19T09:00:00
+2004-11-02T09:00:00
+2004-11-16T09:00:00
+2004-11-30T09:00:00
+2004-12-14T09:00:00
+2004-12-28T09:00:00
+2005-01-11T09:00:00
+2005-01-25T09:00:00
+2005-02-08T09:00:00
+2005-02-22T09:00:00
+2005-03-08T09:00:00
+2005-03-22T09:00:00
+2005-04-05T09:00:00
+2005-04-19T09:00:00
+2005-05-03T09:00:00
+2005-05-17T09:00:00
+2005-05-31T09:00:00
+2005-06-14T09:00:00
+2005-06-28T09:00:00
+2005-07-12T09:00:00
+2005-07-26T09:00:00
+2005-08-09T09:00:00
+2005-08-23T09:00:00
+2005-09-06T09:00:00
+2005-09-20T09:00:00
+2005-10-04T09:00:00
+2005-10-18T09:00:00
+2005-11-01T09:00:00
+2005-11-15T09:00:00
+2005-11-29T09:00:00
+2005-12-13T09:00:00
+2005-12-27T09:00:00
+2006-01-10T09:00:00
+2006-01-24T09:00:00
+2006-02-07T09:00:00
+2006-02-21T09:00:00
+2006-03-07T09:00:00
+2006-03-21T09:00:00
+2006-04-04T09:00:00
+2006-04-18T09:00:00
+2006-05-02T09:00:00
+2006-05-16T09:00:00
+2006-05-30T09:00:00
+2006-06-13T09:00:00
+2006-06-27T09:00:00
+2006-07-11T09:00:00
+2006-07-25T09:00:00
+2006-08-08T09:00:00
+2006-08-22T09:00:00
+2006-09-05T09:00:00
+2006-09-19T09:00:00
+2006-10-03T09:00:00
+2006-10-17T09:00:00
+2006-10-31T09:00:00
+2006-11-14T09:00:00
+2006-11-28T09:00:00
+2006-12-12T09:00:00
+2006-12-26T09:00:00
+2007-01-09T09:00:00
+2007-01-23T09:00:00
+2007-02-06T09:00:00
+2007-02-20T09:00:00
+2007-03-06T09:00:00
+2007-03-20T09:00:00
+2007-04-03T09:00:00
+2007-04-17T09:00:00
+2007-05-01T09:00:00
+2007-05-15T09:00:00
+2007-05-29T09:00:00
+2007-06-12T09:00:00
+2007-06-26T09:00:00
+2007-07-10T09:00:00
+2007-07-24T09:00:00
+2007-08-07T09:00:00
+2007-08-21T09:00:00
+2007-09-04T09:00:00
+2007-09-18T09:00:00
+2007-10-02T09:00:00
+2007-10-16T09:00:00
+2007-10-30T09:00:00
+2007-11-13T09:00:00
+2007-11-27T09:00:00
+2007-12-11T09:00:00
+2007-12-25T09:00:00
+2008-01-08T09:00:00
+2008-01-22T09:00:00
+2008-02-05T09:00:00
+2008-02-19T09:00:00
+2008-03-04T09:00:00
+2008-03-18T09:00:00
+2008-04-01T09:00:00
+2008-04-15T09:00:00
+2008-04-29T09:00:00
+2008-05-13T09:00:00
+2008-05-27T09:00:00
+2008-06-10T09:00:00
+2008-06-24T09:00:00
+2008-07-08T09:00:00
+2008-07-22T09:00:00
+2008-08-05T09:00:00
+2008-08-19T09:00:00
+2008-09-02T09:00:00
+2008-09-16T09:00:00
+2008-09-30T09:00:00
+2008-10-14T09:00:00
+2008-10-28T09:00:00
+2008-11-11T09:00:00
+2008-11-25T09:00:00
+2008-12-09T09:00:00
+2008-12-23T09:00:00
+2009-01-06T09:00:00
+2009-01-20T09:00:00
+2009-02-03T09:00:00
+2009-02-17T09:00:00
+2009-03-03T09:00:00
+2009-03-17T09:00:00
+2009-03-31T09:00:00
+2009-04-14T09:00:00
+2009-04-28T09:00:00
+2009-05-12T09:00:00
+2009-05-26T09:00:00
+2009-06-09T09:00:00
+2009-06-23T09:00:00
+2009-07-07T09:00:00
+2009-07-21T09:00:00
+2009-08-04T09:00:00
+2009-08-18T09:00:00
+2009-09-01T09:00:00
+2009-09-15T09:00:00
+2009-09-29T09:00:00
+2009-10-13T09:00:00
+2009-10-27T09:00:00
+2009-11-10T09:00:00
+2009-11-24T09:00:00
+2009-12-08T09:00:00
+2009-12-22T09:00:00
+2010-01-05T09:00:00
+2010-01-19T09:00:00
+2010-02-02T09:00:00
+2010-02-16T09:00:00
+2010-03-02T09:00:00
+2010-03-16T09:00:00
+2010-03-30T09:00:00
+2010-04-13T09:00:00
+2010-04-27T09:00:00
+2010-05-11T09:00:00
+2010-05-25T09:00:00
+2010-06-08T09:00:00
+2010-06-22T09:00:00
+2010-07-06T09:00:00
+2010-07-20T09:00:00
+2010-08-03T09:00:00
+2010-08-17T09:00:00
+2010-08-31T09:00:00
+2010-09-14T09:00:00
+2010-09-28T09:00:00
+2010-10-12T09:00:00
+2010-10-26T09:00:00
+2010-11-09T09:00:00
+2010-11-23T09:00:00
+2010-12-07T09:00:00
+2010-12-21T09:00:00
+2011-01-04T09:00:00
+2011-01-18T09:00:00
+2011-02-01T09:00:00
+2011-02-15T09:00:00
+2011-03-01T09:00:00
+2011-03-15T09:00:00
+2011-03-29T09:00:00
+2011-04-12T09:00:00
+2011-04-26T09:00:00
+2011-05-10T09:00:00
+2011-05-24T09:00:00
+2011-06-07T09:00:00
+2011-06-21T09:00:00
+2011-07-05T09:00:00
+2011-07-19T09:00:00
+2011-08-02T09:00:00
+2011-08-16T09:00:00
+2011-08-30T09:00:00
+2011-09-13T09:00:00
+2011-09-27T09:00:00
+2011-10-11T09:00:00
+2011-10-25T09:00:00
+2011-11-08T09:00:00
+2011-11-22T09:00:00
+2011-12-06T09:00:00
+2011-12-20T09:00:00
+2012-01-03T09:00:00
+2012-01-17T09:00:00
+2012-01-31T09:00:00
+2012-02-14T09:00:00
+2012-02-28T09:00:00
+2012-03-13T09:00:00
+2012-03-27T09:00:00
+2012-04-10T09:00:00
+2012-04-24T09:00:00
+2012-05-08T09:00:00
+2012-05-22T09:00:00
+2012-06-05T09:00:00
+2012-06-19T09:00:00
+2012-07-03T09:00:00
+2012-07-17T09:00:00
+2012-07-31T09:00:00
+2012-08-14T09:00:00
+2012-08-28T09:00:00
+2012-09-11T09:00:00
+2012-09-25T09:00:00
+2012-10-09T09:00:00
+2012-10-23T09:00:00
+2012-11-06T09:00:00
+2012-11-20T09:00:00
+2012-12-04T09:00:00
+2012-12-18T09:00:00
+2013-01-01T09:00:00
+2013-01-15T09:00:00
+2013-01-29T09:00:00
+2013-02-12T09:00:00
+2013-02-26T09:00:00
+2013-03-12T09:00:00
+2013-03-26T09:00:00
+2013-04-09T09:00:00
+2013-04-23T09:00:00
+2013-05-07T09:00:00
+2013-05-21T09:00:00
+2013-06-04T09:00:00
+2013-06-18T09:00:00
+2013-07-02T09:00:00
+2013-07-16T09:00:00
+2013-07-30T09:00:00
+2013-08-13T09:00:00
+2013-08-27T09:00:00
+2013-09-10T09:00:00
+2013-09-24T09:00:00
+2013-10-08T09:00:00
+2013-10-22T09:00:00
+2013-11-05T09:00:00
+2013-11-19T09:00:00
+2013-12-03T09:00:00
+2013-12-17T09:00:00
+2013-12-31T09:00:00
+2014-01-14T09:00:00
+2014-01-28T09:00:00
+2014-02-11T09:00:00
+2014-02-25T09:00:00
+2014-03-11T09:00:00
+2014-03-25T09:00:00
+2014-04-08T09:00:00
+2014-04-22T09:00:00
+2014-05-06T09:00:00
+2014-05-20T09:00:00
+2014-06-03T09:00:00
+2014-06-17T09:00:00
+2014-07-01T09:00:00
+2014-07-15T09:00:00
+2014-07-29T09:00:00
+2014-08-12T09:00:00
+2014-08-26T09:00:00
+2014-09-09T09:00:00
+2014-09-23T09:00:00
+2014-10-07T09:00:00
+2014-10-21T09:00:00
+2014-11-04T09:00:00
+2014-11-18T09:00:00
+2014-12-02T09:00:00
+2014-12-16T09:00:00
+2014-12-30T09:00:00
+2015-01-13T09:00:00
+2015-01-27T09:00:00
+2015-02-10T09:00:00
+2015-02-24T09:00:00
+2015-03-10T09:00:00
+2015-03-24T09:00:00
+2015-04-07T09:00:00
+2015-04-21T09:00:00
+2015-05-05T09:00:00
+2015-05-19T09:00:00
+2015-06-02T09:00:00
+2015-06-16T09:00:00
+2015-06-30T09:00:00
+2015-07-14T09:00:00
+2015-07-28T09:00:00
+2015-08-11T09:00:00
+2015-08-25T09:00:00
+2015-09-08T09:00:00
+2015-09-22T09:00:00
+2015-10-06T09:00:00
+2015-10-20T09:00:00
+2015-11-03T09:00:00
+2015-11-17T09:00:00
+2015-12-01T09:00:00
+2015-12-15T09:00:00
+2015-12-29T09:00:00
+2016-01-12T09:00:00
+2016-01-26T09:00:00
+2016-02-09T09:00:00
+2016-02-23T09:00:00
+2016-03-08T09:00:00
+2016-03-22T09:00:00
+2016-04-05T09:00:00
+2016-04-19T09:00:00
+2016-05-03T09:00:00
+2016-05-17T09:00:00
+2016-05-31T09:00:00
+2016-06-14T09:00:00
+2016-06-28T09:00:00
+2016-07-12T09:00:00
+2016-07-26T09:00:00
+2016-08-09T09:00:00
+2016-08-23T09:00:00
+2016-09-06T09:00:00
+2016-09-20T09:00:00
+2016-10-04T09:00:00
+2016-10-18T09:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase09.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase09.ics.prev.ref
new file mode 100644
index 00000000..f1bdb5f6
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase09.ics.prev.ref
@@ -0,0 +1,349 @@
+2010-12-21T09:00:00
+2010-12-07T09:00:00
+2010-11-23T09:00:00
+2010-11-09T09:00:00
+2010-10-26T09:00:00
+2010-10-12T09:00:00
+2010-09-28T09:00:00
+2010-09-14T09:00:00
+2010-08-31T09:00:00
+2010-08-17T09:00:00
+2010-08-03T09:00:00
+2010-07-20T09:00:00
+2010-07-06T09:00:00
+2010-06-22T09:00:00
+2010-06-08T09:00:00
+2010-05-25T09:00:00
+2010-05-11T09:00:00
+2010-04-27T09:00:00
+2010-04-13T09:00:00
+2010-03-30T09:00:00
+2010-03-16T09:00:00
+2010-03-02T09:00:00
+2010-02-16T09:00:00
+2010-02-02T09:00:00
+2010-01-19T09:00:00
+2010-01-05T09:00:00
+2009-12-22T09:00:00
+2009-12-08T09:00:00
+2009-11-24T09:00:00
+2009-11-10T09:00:00
+2009-10-27T09:00:00
+2009-10-13T09:00:00
+2009-09-29T09:00:00
+2009-09-15T09:00:00
+2009-09-01T09:00:00
+2009-08-18T09:00:00
+2009-08-04T09:00:00
+2009-07-21T09:00:00
+2009-07-07T09:00:00
+2009-06-23T09:00:00
+2009-06-09T09:00:00
+2009-05-26T09:00:00
+2009-05-12T09:00:00
+2009-04-28T09:00:00
+2009-04-14T09:00:00
+2009-03-31T09:00:00
+2009-03-17T09:00:00
+2009-03-03T09:00:00
+2009-02-17T09:00:00
+2009-02-03T09:00:00
+2009-01-20T09:00:00
+2009-01-06T09:00:00
+2008-12-23T09:00:00
+2008-12-09T09:00:00
+2008-11-25T09:00:00
+2008-11-11T09:00:00
+2008-10-28T09:00:00
+2008-10-14T09:00:00
+2008-09-30T09:00:00
+2008-09-16T09:00:00
+2008-09-02T09:00:00
+2008-08-19T09:00:00
+2008-08-05T09:00:00
+2008-07-22T09:00:00
+2008-07-08T09:00:00
+2008-06-24T09:00:00
+2008-06-10T09:00:00
+2008-05-27T09:00:00
+2008-05-13T09:00:00
+2008-04-29T09:00:00
+2008-04-15T09:00:00
+2008-04-01T09:00:00
+2008-03-18T09:00:00
+2008-03-04T09:00:00
+2008-02-19T09:00:00
+2008-02-05T09:00:00
+2008-01-22T09:00:00
+2008-01-08T09:00:00
+2007-12-25T09:00:00
+2007-12-11T09:00:00
+2007-11-27T09:00:00
+2007-11-13T09:00:00
+2007-10-30T09:00:00
+2007-10-16T09:00:00
+2007-10-02T09:00:00
+2007-09-18T09:00:00
+2007-09-04T09:00:00
+2007-08-21T09:00:00
+2007-08-07T09:00:00
+2007-07-24T09:00:00
+2007-07-10T09:00:00
+2007-06-26T09:00:00
+2007-06-12T09:00:00
+2007-05-29T09:00:00
+2007-05-15T09:00:00
+2007-05-01T09:00:00
+2007-04-17T09:00:00
+2007-04-03T09:00:00
+2007-03-20T09:00:00
+2007-03-06T09:00:00
+2007-02-20T09:00:00
+2007-02-06T09:00:00
+2007-01-23T09:00:00
+2007-01-09T09:00:00
+2006-12-26T09:00:00
+2006-12-12T09:00:00
+2006-11-28T09:00:00
+2006-11-14T09:00:00
+2006-10-31T09:00:00
+2006-10-17T09:00:00
+2006-10-03T09:00:00
+2006-09-19T09:00:00
+2006-09-05T09:00:00
+2006-08-22T09:00:00
+2006-08-08T09:00:00
+2006-07-25T09:00:00
+2006-07-11T09:00:00
+2006-06-27T09:00:00
+2006-06-13T09:00:00
+2006-05-30T09:00:00
+2006-05-16T09:00:00
+2006-05-02T09:00:00
+2006-04-18T09:00:00
+2006-04-04T09:00:00
+2006-03-21T09:00:00
+2006-03-07T09:00:00
+2006-02-21T09:00:00
+2006-02-07T09:00:00
+2006-01-24T09:00:00
+2006-01-10T09:00:00
+2005-12-27T09:00:00
+2005-12-13T09:00:00
+2005-11-29T09:00:00
+2005-11-15T09:00:00
+2005-11-01T09:00:00
+2005-10-18T09:00:00
+2005-10-04T09:00:00
+2005-09-20T09:00:00
+2005-09-06T09:00:00
+2005-08-23T09:00:00
+2005-08-09T09:00:00
+2005-07-26T09:00:00
+2005-07-12T09:00:00
+2005-06-28T09:00:00
+2005-06-14T09:00:00
+2005-05-31T09:00:00
+2005-05-17T09:00:00
+2005-05-03T09:00:00
+2005-04-19T09:00:00
+2005-04-05T09:00:00
+2005-03-22T09:00:00
+2005-03-08T09:00:00
+2005-02-22T09:00:00
+2005-02-08T09:00:00
+2005-01-25T09:00:00
+2005-01-11T09:00:00
+2004-12-28T09:00:00
+2004-12-14T09:00:00
+2004-11-30T09:00:00
+2004-11-16T09:00:00
+2004-11-02T09:00:00
+2004-10-19T09:00:00
+2004-10-05T09:00:00
+2004-09-21T09:00:00
+2004-09-07T09:00:00
+2004-08-24T09:00:00
+2004-08-10T09:00:00
+2004-07-27T09:00:00
+2004-07-13T09:00:00
+2004-06-29T09:00:00
+2004-06-15T09:00:00
+2004-06-01T09:00:00
+2004-05-18T09:00:00
+2004-05-04T09:00:00
+2004-04-20T09:00:00
+2004-04-06T09:00:00
+2004-03-23T09:00:00
+2004-03-09T09:00:00
+2004-02-24T09:00:00
+2004-02-10T09:00:00
+2004-01-27T09:00:00
+2004-01-13T09:00:00
+2003-12-30T09:00:00
+2003-12-16T09:00:00
+2003-12-02T09:00:00
+2003-11-18T09:00:00
+2003-11-04T09:00:00
+2003-10-21T09:00:00
+2003-10-07T09:00:00
+2003-09-23T09:00:00
+2003-09-09T09:00:00
+2003-08-26T09:00:00
+2003-08-12T09:00:00
+2003-07-29T09:00:00
+2003-07-15T09:00:00
+2003-07-01T09:00:00
+2003-06-17T09:00:00
+2003-06-03T09:00:00
+2003-05-20T09:00:00
+2003-05-06T09:00:00
+2003-04-22T09:00:00
+2003-04-08T09:00:00
+2003-03-25T09:00:00
+2003-03-11T09:00:00
+2003-02-25T09:00:00
+2003-02-11T09:00:00
+2003-01-28T09:00:00
+2003-01-14T09:00:00
+2002-12-31T09:00:00
+2002-12-17T09:00:00
+2002-12-03T09:00:00
+2002-11-19T09:00:00
+2002-11-05T09:00:00
+2002-10-22T09:00:00
+2002-10-08T09:00:00
+2002-09-24T09:00:00
+2002-09-10T09:00:00
+2002-08-27T09:00:00
+2002-08-13T09:00:00
+2002-07-30T09:00:00
+2002-07-16T09:00:00
+2002-07-02T09:00:00
+2002-06-18T09:00:00
+2002-06-04T09:00:00
+2002-05-21T09:00:00
+2002-05-07T09:00:00
+2002-04-23T09:00:00
+2002-04-09T09:00:00
+2002-03-26T09:00:00
+2002-03-12T09:00:00
+2002-02-26T09:00:00
+2002-02-12T09:00:00
+2002-01-29T09:00:00
+2002-01-15T09:00:00
+2002-01-01T09:00:00
+2001-12-18T09:00:00
+2001-12-04T09:00:00
+2001-11-20T09:00:00
+2001-11-06T09:00:00
+2001-10-23T09:00:00
+2001-10-09T09:00:00
+2001-09-25T09:00:00
+2001-09-11T09:00:00
+2001-08-28T09:00:00
+2001-08-14T09:00:00
+2001-07-31T09:00:00
+2001-07-17T09:00:00
+2001-07-03T09:00:00
+2001-06-19T09:00:00
+2001-06-05T09:00:00
+2001-05-22T09:00:00
+2001-05-08T09:00:00
+2001-04-24T09:00:00
+2001-04-10T09:00:00
+2001-03-27T09:00:00
+2001-03-13T09:00:00
+2001-02-27T09:00:00
+2001-02-13T09:00:00
+2001-01-30T09:00:00
+2001-01-16T09:00:00
+2001-01-02T09:00:00
+2000-12-19T09:00:00
+2000-12-05T09:00:00
+2000-11-21T09:00:00
+2000-11-07T09:00:00
+2000-10-24T09:00:00
+2000-10-10T09:00:00
+2000-09-26T09:00:00
+2000-09-12T09:00:00
+2000-08-29T09:00:00
+2000-08-15T09:00:00
+2000-08-01T09:00:00
+2000-07-18T09:00:00
+2000-07-04T09:00:00
+2000-06-20T09:00:00
+2000-06-06T09:00:00
+2000-05-23T09:00:00
+2000-05-09T09:00:00
+2000-04-25T09:00:00
+2000-04-11T09:00:00
+2000-03-28T09:00:00
+2000-03-14T09:00:00
+2000-02-29T09:00:00
+2000-02-15T09:00:00
+2000-02-01T09:00:00
+2000-01-18T09:00:00
+2000-01-04T09:00:00
+1999-12-21T09:00:00
+1999-12-07T09:00:00
+1999-11-23T09:00:00
+1999-11-09T09:00:00
+1999-10-26T09:00:00
+1999-10-12T09:00:00
+1999-09-28T09:00:00
+1999-09-14T09:00:00
+1999-08-31T09:00:00
+1999-08-17T09:00:00
+1999-08-03T09:00:00
+1999-07-20T09:00:00
+1999-07-06T09:00:00
+1999-06-22T09:00:00
+1999-06-08T09:00:00
+1999-05-25T09:00:00
+1999-05-11T09:00:00
+1999-04-27T09:00:00
+1999-04-13T09:00:00
+1999-03-30T09:00:00
+1999-03-16T09:00:00
+1999-03-02T09:00:00
+1999-02-16T09:00:00
+1999-02-02T09:00:00
+1999-01-19T09:00:00
+1999-01-05T09:00:00
+1998-12-22T09:00:00
+1998-12-08T09:00:00
+1998-11-24T09:00:00
+1998-11-10T09:00:00
+1998-10-27T09:00:00
+1998-10-13T09:00:00
+1998-09-29T09:00:00
+1998-09-15T09:00:00
+1998-09-01T09:00:00
+1998-08-18T09:00:00
+1998-08-04T09:00:00
+1998-07-21T09:00:00
+1998-07-07T09:00:00
+1998-06-23T09:00:00
+1998-06-09T09:00:00
+1998-05-26T09:00:00
+1998-05-12T09:00:00
+1998-04-28T09:00:00
+1998-04-14T09:00:00
+1998-03-31T09:00:00
+1998-03-17T09:00:00
+1998-03-03T09:00:00
+1998-02-17T09:00:00
+1998-02-03T09:00:00
+1998-01-20T09:00:00
+1998-01-06T09:00:00
+1997-12-23T09:00:00
+1997-12-09T09:00:00
+1997-11-25T09:00:00
+1997-11-11T09:00:00
+1997-10-28T09:00:00
+1997-10-14T09:00:00
+1997-09-30T09:00:00
+1997-09-16T09:00:00
+1997-09-02T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase09.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase09.ics.recurson.ref
new file mode 100644
index 00000000..f0de2e46
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase09.ics.recurson.ref
@@ -0,0 +1,348 @@
+1997-09-02
+1997-09-16
+1997-09-30
+1997-10-14
+1997-10-28
+1997-11-11
+1997-11-25
+1997-12-09
+1997-12-23
+1998-01-06
+1998-01-20
+1998-02-03
+1998-02-17
+1998-03-03
+1998-03-17
+1998-03-31
+1998-04-14
+1998-04-28
+1998-05-12
+1998-05-26
+1998-06-09
+1998-06-23
+1998-07-07
+1998-07-21
+1998-08-04
+1998-08-18
+1998-09-01
+1998-09-15
+1998-09-29
+1998-10-13
+1998-10-27
+1998-11-10
+1998-11-24
+1998-12-08
+1998-12-22
+1999-01-05
+1999-01-19
+1999-02-02
+1999-02-16
+1999-03-02
+1999-03-16
+1999-03-30
+1999-04-13
+1999-04-27
+1999-05-11
+1999-05-25
+1999-06-08
+1999-06-22
+1999-07-06
+1999-07-20
+1999-08-03
+1999-08-17
+1999-08-31
+1999-09-14
+1999-09-28
+1999-10-12
+1999-10-26
+1999-11-09
+1999-11-23
+1999-12-07
+1999-12-21
+2000-01-04
+2000-01-18
+2000-02-01
+2000-02-15
+2000-02-29
+2000-03-14
+2000-03-28
+2000-04-11
+2000-04-25
+2000-05-09
+2000-05-23
+2000-06-06
+2000-06-20
+2000-07-04
+2000-07-18
+2000-08-01
+2000-08-15
+2000-08-29
+2000-09-12
+2000-09-26
+2000-10-10
+2000-10-24
+2000-11-07
+2000-11-21
+2000-12-05
+2000-12-19
+2001-01-02
+2001-01-16
+2001-01-30
+2001-02-13
+2001-02-27
+2001-03-13
+2001-03-27
+2001-04-10
+2001-04-24
+2001-05-08
+2001-05-22
+2001-06-05
+2001-06-19
+2001-07-03
+2001-07-17
+2001-07-31
+2001-08-14
+2001-08-28
+2001-09-11
+2001-09-25
+2001-10-09
+2001-10-23
+2001-11-06
+2001-11-20
+2001-12-04
+2001-12-18
+2002-01-01
+2002-01-15
+2002-01-29
+2002-02-12
+2002-02-26
+2002-03-12
+2002-03-26
+2002-04-09
+2002-04-23
+2002-05-07
+2002-05-21
+2002-06-04
+2002-06-18
+2002-07-02
+2002-07-16
+2002-07-30
+2002-08-13
+2002-08-27
+2002-09-10
+2002-09-24
+2002-10-08
+2002-10-22
+2002-11-05
+2002-11-19
+2002-12-03
+2002-12-17
+2002-12-31
+2003-01-14
+2003-01-28
+2003-02-11
+2003-02-25
+2003-03-11
+2003-03-25
+2003-04-08
+2003-04-22
+2003-05-06
+2003-05-20
+2003-06-03
+2003-06-17
+2003-07-01
+2003-07-15
+2003-07-29
+2003-08-12
+2003-08-26
+2003-09-09
+2003-09-23
+2003-10-07
+2003-10-21
+2003-11-04
+2003-11-18
+2003-12-02
+2003-12-16
+2003-12-30
+2004-01-13
+2004-01-27
+2004-02-10
+2004-02-24
+2004-03-09
+2004-03-23
+2004-04-06
+2004-04-20
+2004-05-04
+2004-05-18
+2004-06-01
+2004-06-15
+2004-06-29
+2004-07-13
+2004-07-27
+2004-08-10
+2004-08-24
+2004-09-07
+2004-09-21
+2004-10-05
+2004-10-19
+2004-11-02
+2004-11-16
+2004-11-30
+2004-12-14
+2004-12-28
+2005-01-11
+2005-01-25
+2005-02-08
+2005-02-22
+2005-03-08
+2005-03-22
+2005-04-05
+2005-04-19
+2005-05-03
+2005-05-17
+2005-05-31
+2005-06-14
+2005-06-28
+2005-07-12
+2005-07-26
+2005-08-09
+2005-08-23
+2005-09-06
+2005-09-20
+2005-10-04
+2005-10-18
+2005-11-01
+2005-11-15
+2005-11-29
+2005-12-13
+2005-12-27
+2006-01-10
+2006-01-24
+2006-02-07
+2006-02-21
+2006-03-07
+2006-03-21
+2006-04-04
+2006-04-18
+2006-05-02
+2006-05-16
+2006-05-30
+2006-06-13
+2006-06-27
+2006-07-11
+2006-07-25
+2006-08-08
+2006-08-22
+2006-09-05
+2006-09-19
+2006-10-03
+2006-10-17
+2006-10-31
+2006-11-14
+2006-11-28
+2006-12-12
+2006-12-26
+2007-01-09
+2007-01-23
+2007-02-06
+2007-02-20
+2007-03-06
+2007-03-20
+2007-04-03
+2007-04-17
+2007-05-01
+2007-05-15
+2007-05-29
+2007-06-12
+2007-06-26
+2007-07-10
+2007-07-24
+2007-08-07
+2007-08-21
+2007-09-04
+2007-09-18
+2007-10-02
+2007-10-16
+2007-10-30
+2007-11-13
+2007-11-27
+2007-12-11
+2007-12-25
+2008-01-08
+2008-01-22
+2008-02-05
+2008-02-19
+2008-03-04
+2008-03-18
+2008-04-01
+2008-04-15
+2008-04-29
+2008-05-13
+2008-05-27
+2008-06-10
+2008-06-24
+2008-07-08
+2008-07-22
+2008-08-05
+2008-08-19
+2008-09-02
+2008-09-16
+2008-09-30
+2008-10-14
+2008-10-28
+2008-11-11
+2008-11-25
+2008-12-09
+2008-12-23
+2009-01-06
+2009-01-20
+2009-02-03
+2009-02-17
+2009-03-03
+2009-03-17
+2009-03-31
+2009-04-14
+2009-04-28
+2009-05-12
+2009-05-26
+2009-06-09
+2009-06-23
+2009-07-07
+2009-07-21
+2009-08-04
+2009-08-18
+2009-09-01
+2009-09-15
+2009-09-29
+2009-10-13
+2009-10-27
+2009-11-10
+2009-11-24
+2009-12-08
+2009-12-22
+2010-01-05
+2010-01-19
+2010-02-02
+2010-02-16
+2010-03-02
+2010-03-16
+2010-03-30
+2010-04-13
+2010-04-27
+2010-05-11
+2010-05-25
+2010-06-08
+2010-06-22
+2010-07-06
+2010-07-20
+2010-08-03
+2010-08-17
+2010-08-31
+2010-09-14
+2010-09-28
+2010-10-12
+2010-10-26
+2010-11-09
+2010-11-23
+2010-12-07
+2010-12-21
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase10.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase10.ics
new file mode 100644
index 00000000..114d4f2a
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase10.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Weekly on Tuesday and Thursday for 5 weeks:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=WEEKLY;UNTIL=19971007T000000Z;BYDAY=TU,TH;WKST=SU
+SUMMARY:RExample09a
+UID:RExample09a
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase10.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase10.ics.comp34.ref
new file mode 100644
index 00000000..64c05a75
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase10.ics.comp34.ref
@@ -0,0 +1,500 @@
+1997-09-02T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase10.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase10.ics.next.ref
new file mode 100644
index 00000000..dd353af5
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase10.ics.next.ref
@@ -0,0 +1,11 @@
+1997-09-02T09:00:00
+1997-09-04T09:00:00
+1997-09-09T09:00:00
+1997-09-11T09:00:00
+1997-09-16T09:00:00
+1997-09-18T09:00:00
+1997-09-23T09:00:00
+1997-09-25T09:00:00
+1997-09-30T09:00:00
+1997-10-02T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase10.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase10.ics.prev.ref
new file mode 100644
index 00000000..7247b95d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase10.ics.prev.ref
@@ -0,0 +1,11 @@
+1997-10-02T09:00:00
+1997-09-30T09:00:00
+1997-09-25T09:00:00
+1997-09-23T09:00:00
+1997-09-18T09:00:00
+1997-09-16T09:00:00
+1997-09-11T09:00:00
+1997-09-09T09:00:00
+1997-09-04T09:00:00
+1997-09-02T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase10.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase10.ics.recurson.ref
new file mode 100644
index 00000000..bf2c06ab
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase10.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-09-02
+1997-09-04
+1997-09-09
+1997-09-11
+1997-09-16
+1997-09-18
+1997-09-23
+1997-09-25
+1997-09-30
+1997-10-02
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase11.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase11.ics
new file mode 100644
index 00000000..1d36d3a2
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase11.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Weekly on Tuesday and Thursday for 5 weeks:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=WEEKLY;COUNT=10;BYDAY=TU,TH;WKST=SU
+SUMMARY:RExample09b
+UID:RExample09b
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase11.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase11.ics.comp34.ref
new file mode 100644
index 00000000..64c05a75
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase11.ics.comp34.ref
@@ -0,0 +1,500 @@
+1997-09-02T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase11.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase11.ics.next.ref
new file mode 100644
index 00000000..dd353af5
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase11.ics.next.ref
@@ -0,0 +1,11 @@
+1997-09-02T09:00:00
+1997-09-04T09:00:00
+1997-09-09T09:00:00
+1997-09-11T09:00:00
+1997-09-16T09:00:00
+1997-09-18T09:00:00
+1997-09-23T09:00:00
+1997-09-25T09:00:00
+1997-09-30T09:00:00
+1997-10-02T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase11.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase11.ics.prev.ref
new file mode 100644
index 00000000..7247b95d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase11.ics.prev.ref
@@ -0,0 +1,11 @@
+1997-10-02T09:00:00
+1997-09-30T09:00:00
+1997-09-25T09:00:00
+1997-09-23T09:00:00
+1997-09-18T09:00:00
+1997-09-16T09:00:00
+1997-09-11T09:00:00
+1997-09-09T09:00:00
+1997-09-04T09:00:00
+1997-09-02T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase11.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase11.ics.recurson.ref
new file mode 100644
index 00000000..bf2c06ab
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase11.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-09-02
+1997-09-04
+1997-09-09
+1997-09-11
+1997-09-16
+1997-09-18
+1997-09-23
+1997-09-25
+1997-09-30
+1997-10-02
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase12.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase12.ics
new file mode 100644
index 00000000..a91521bf
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase12.ics
@@ -0,0 +1,34 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Every other week on Monday\, Wednesday and Friday until Decemb
+ er 24\,1997\, but starting on Tuesday\, September 2\, 1997:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z;INTERVAL=2;BYDAY=MO,WE,FR;WKST=SU
+SUMMARY:RExample10
+UID:RExample10
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase12.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase12.ics.comp34.ref
new file mode 100644
index 00000000..6f234767
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase12.ics.comp34.ref
@@ -0,0 +1,500 @@
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
+1997-09-02T09:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase12.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase12.ics.next.ref
new file mode 100644
index 00000000..06c4f933
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase12.ics.next.ref
@@ -0,0 +1,26 @@
+1997-09-02T09:00:00
+1997-09-03T09:00:00
+1997-09-05T09:00:00
+1997-09-15T09:00:00
+1997-09-17T09:00:00
+1997-09-19T09:00:00
+1997-09-29T09:00:00
+1997-10-01T09:00:00
+1997-10-03T09:00:00
+1997-10-13T09:00:00
+1997-10-15T09:00:00
+1997-10-17T09:00:00
+1997-10-27T09:00:00
+1997-10-29T09:00:00
+1997-10-31T09:00:00
+1997-11-10T09:00:00
+1997-11-12T09:00:00
+1997-11-14T09:00:00
+1997-11-24T09:00:00
+1997-11-26T09:00:00
+1997-11-28T09:00:00
+1997-12-08T09:00:00
+1997-12-10T09:00:00
+1997-12-12T09:00:00
+1997-12-22T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase12.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase12.ics.prev.ref
new file mode 100644
index 00000000..2c1977f5
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase12.ics.prev.ref
@@ -0,0 +1,26 @@
+1997-12-22T09:00:00
+1997-12-12T09:00:00
+1997-12-10T09:00:00
+1997-12-08T09:00:00
+1997-11-28T09:00:00
+1997-11-26T09:00:00
+1997-11-24T09:00:00
+1997-11-14T09:00:00
+1997-11-12T09:00:00
+1997-11-10T09:00:00
+1997-10-31T09:00:00
+1997-10-29T09:00:00
+1997-10-27T09:00:00
+1997-10-17T09:00:00
+1997-10-15T09:00:00
+1997-10-13T09:00:00
+1997-10-03T09:00:00
+1997-10-01T09:00:00
+1997-09-29T09:00:00
+1997-09-19T09:00:00
+1997-09-17T09:00:00
+1997-09-15T09:00:00
+1997-09-05T09:00:00
+1997-09-03T09:00:00
+1997-09-02T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase12.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase12.ics.recurson.ref
new file mode 100644
index 00000000..7abf1e5a
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase12.ics.recurson.ref
@@ -0,0 +1,26 @@
+1997-09-02
+1997-09-03
+1997-09-05
+1997-09-15
+1997-09-17
+1997-09-19
+1997-09-29
+1997-10-01
+1997-10-03
+1997-10-13
+1997-10-15
+1997-10-17
+1997-10-27
+1997-10-29
+1997-10-31
+1997-11-10
+1997-11-12
+1997-11-14
+1997-11-24
+1997-11-26
+1997-11-28
+1997-12-08
+1997-12-10
+1997-12-12
+1997-12-22
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase13.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase13.ics
new file mode 100644
index 00000000..485ab244
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase13.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Every other week on Tuesday and Thursday\, for 8 occurrences:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=WEEKLY;COUNT=8;INTERVAL=2;BYDAY=TU,TH;WKST=SU
+SUMMARY:RExample11
+UID:RExample11
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase13.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase13.ics.comp34.ref
new file mode 100644
index 00000000..64c05a75
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase13.ics.comp34.ref
@@ -0,0 +1,500 @@
+1997-09-02T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
+1997-09-03T09:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase13.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase13.ics.next.ref
new file mode 100644
index 00000000..697918b0
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase13.ics.next.ref
@@ -0,0 +1,9 @@
+1997-09-02T09:00:00
+1997-09-04T09:00:00
+1997-09-16T09:00:00
+1997-09-18T09:00:00
+1997-09-30T09:00:00
+1997-10-02T09:00:00
+1997-10-14T09:00:00
+1997-10-16T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase13.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase13.ics.prev.ref
new file mode 100644
index 00000000..5e1f4982
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase13.ics.prev.ref
@@ -0,0 +1,9 @@
+1997-10-16T09:00:00
+1997-10-14T09:00:00
+1997-10-02T09:00:00
+1997-09-30T09:00:00
+1997-09-18T09:00:00
+1997-09-16T09:00:00
+1997-09-04T09:00:00
+1997-09-02T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase13.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase13.ics.recurson.ref
new file mode 100644
index 00000000..19dff602
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase13.ics.recurson.ref
@@ -0,0 +1,9 @@
+1997-09-02
+1997-09-04
+1997-09-16
+1997-09-18
+1997-09-30
+1997-10-02
+1997-10-14
+1997-10-16
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase14.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase14.ics
new file mode 100644
index 00000000..3a3fadd2
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase14.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Monthly on the 1st Friday for ten occurrences:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970905T090000
+RRULE:FREQ=MONTHLY;COUNT=10;BYDAY=1FR
+SUMMARY:RExample12
+UID:RExample12
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase14.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase14.ics.comp34.ref
new file mode 100644
index 00000000..ff739d9c
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase14.ics.comp34.ref
@@ -0,0 +1,11 @@
+1997-09-05T09:00:00
+1997-10-03T09:00:00
+1997-11-07T09:00:00
+1997-12-05T09:00:00
+1998-01-02T09:00:00
+1998-02-06T09:00:00
+1998-03-06T09:00:00
+1998-04-03T09:00:00
+1998-05-01T09:00:00
+1998-06-05T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase14.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase14.ics.next.ref
new file mode 100644
index 00000000..ff739d9c
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase14.ics.next.ref
@@ -0,0 +1,11 @@
+1997-09-05T09:00:00
+1997-10-03T09:00:00
+1997-11-07T09:00:00
+1997-12-05T09:00:00
+1998-01-02T09:00:00
+1998-02-06T09:00:00
+1998-03-06T09:00:00
+1998-04-03T09:00:00
+1998-05-01T09:00:00
+1998-06-05T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase14.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase14.ics.prev.ref
new file mode 100644
index 00000000..eee97462
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase14.ics.prev.ref
@@ -0,0 +1,11 @@
+1998-06-05T09:00:00
+1998-05-01T09:00:00
+1998-04-03T09:00:00
+1998-03-06T09:00:00
+1998-02-06T09:00:00
+1998-01-02T09:00:00
+1997-12-05T09:00:00
+1997-11-07T09:00:00
+1997-10-03T09:00:00
+1997-09-05T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase14.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase14.ics.recurson.ref
new file mode 100644
index 00000000..ae19710e
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase14.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-09-05
+1997-10-03
+1997-11-07
+1997-12-05
+1998-01-02
+1998-02-06
+1998-03-06
+1998-04-03
+1998-05-01
+1998-06-05
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase15.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase15.ics
new file mode 100644
index 00000000..7e9c3cb9
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase15.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Monthly on the 1st Friday until December 24\, 1997:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970905T090000
+RRULE:FREQ=MONTHLY;UNTIL=19971224T000000Z;BYDAY=1FR
+SUMMARY:RExample13
+UID:RExample13
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase15.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase15.ics.comp34.ref
new file mode 100644
index 00000000..7aedcd93
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase15.ics.comp34.ref
@@ -0,0 +1,5 @@
+1997-09-05T09:00:00
+1997-10-03T09:00:00
+1997-11-07T09:00:00
+1997-12-05T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase15.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase15.ics.next.ref
new file mode 100644
index 00000000..7aedcd93
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase15.ics.next.ref
@@ -0,0 +1,5 @@
+1997-09-05T09:00:00
+1997-10-03T09:00:00
+1997-11-07T09:00:00
+1997-12-05T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase15.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase15.ics.prev.ref
new file mode 100644
index 00000000..cc4bd4cd
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase15.ics.prev.ref
@@ -0,0 +1,5 @@
+1997-12-05T09:00:00
+1997-11-07T09:00:00
+1997-10-03T09:00:00
+1997-09-05T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase15.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase15.ics.recurson.ref
new file mode 100644
index 00000000..e160f8dc
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase15.ics.recurson.ref
@@ -0,0 +1,5 @@
+1997-09-05
+1997-10-03
+1997-11-07
+1997-12-05
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase16.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase16.ics
new file mode 100644
index 00000000..cbc87a0d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase16.ics
@@ -0,0 +1,34 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Every other month on the 1st and last Sunday of the month for
+ 10occurrences:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970907T090000
+RRULE:FREQ=MONTHLY;COUNT=10;INTERVAL=2;BYDAY=1SU,-1SU
+SUMMARY:RExample14
+UID:RExample14
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase16.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase16.ics.comp34.ref
new file mode 100644
index 00000000..47c3c3a1
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase16.ics.comp34.ref
@@ -0,0 +1,11 @@
+1997-09-07T09:00:00
+1997-09-28T09:00:00
+1997-11-02T09:00:00
+1997-11-30T09:00:00
+1998-01-04T09:00:00
+1998-01-25T09:00:00
+1998-03-01T09:00:00
+1998-03-29T09:00:00
+1998-05-03T09:00:00
+1998-05-31T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase16.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase16.ics.next.ref
new file mode 100644
index 00000000..47c3c3a1
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase16.ics.next.ref
@@ -0,0 +1,11 @@
+1997-09-07T09:00:00
+1997-09-28T09:00:00
+1997-11-02T09:00:00
+1997-11-30T09:00:00
+1998-01-04T09:00:00
+1998-01-25T09:00:00
+1998-03-01T09:00:00
+1998-03-29T09:00:00
+1998-05-03T09:00:00
+1998-05-31T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase16.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase16.ics.prev.ref
new file mode 100644
index 00000000..fc8f1e76
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase16.ics.prev.ref
@@ -0,0 +1,11 @@
+1998-05-31T09:00:00
+1998-05-03T09:00:00
+1998-03-29T09:00:00
+1998-03-01T09:00:00
+1998-01-25T09:00:00
+1998-01-04T09:00:00
+1997-11-30T09:00:00
+1997-11-02T09:00:00
+1997-09-28T09:00:00
+1997-09-07T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase16.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase16.ics.recurson.ref
new file mode 100644
index 00000000..419d31af
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase16.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-09-07
+1997-09-28
+1997-11-02
+1997-11-30
+1998-01-04
+1998-01-25
+1998-03-01
+1998-03-29
+1998-05-03
+1998-05-31
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase17.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase17.ics
new file mode 100644
index 00000000..9e4ddc9b
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase17.ics
@@ -0,0 +1,34 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Monthly on the second to last Monday of the month for 6 months
+ :
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970922T090000
+RRULE:FREQ=MONTHLY;COUNT=6;BYDAY=-2MO
+SUMMARY:RExample15
+UID:RExample15
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase17.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase17.ics.comp34.ref
new file mode 100644
index 00000000..eb4ba885
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase17.ics.comp34.ref
@@ -0,0 +1,7 @@
+1997-09-22T09:00:00
+1997-10-20T09:00:00
+1997-11-17T09:00:00
+1997-12-22T09:00:00
+1998-01-19T09:00:00
+1998-02-16T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase17.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase17.ics.next.ref
new file mode 100644
index 00000000..eb4ba885
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase17.ics.next.ref
@@ -0,0 +1,7 @@
+1997-09-22T09:00:00
+1997-10-20T09:00:00
+1997-11-17T09:00:00
+1997-12-22T09:00:00
+1998-01-19T09:00:00
+1998-02-16T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase17.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase17.ics.prev.ref
new file mode 100644
index 00000000..0c722f0c
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase17.ics.prev.ref
@@ -0,0 +1,7 @@
+1998-02-16T09:00:00
+1998-01-19T09:00:00
+1997-12-22T09:00:00
+1997-11-17T09:00:00
+1997-10-20T09:00:00
+1997-09-22T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase17.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase17.ics.recurson.ref
new file mode 100644
index 00000000..dfbc45c3
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase17.ics.recurson.ref
@@ -0,0 +1,7 @@
+1997-09-22
+1997-10-20
+1997-11-17
+1997-12-22
+1998-01-19
+1998-02-16
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase18.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase18.ics
new file mode 100644
index 00000000..2a057238
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase18.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Monthly on the third to the last day of the month\, forever:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970928T090000
+RRULE:FREQ=MONTHLY;BYMONTHDAY=-3
+SUMMARY:RExample16
+UID:RExample16
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase18.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase18.ics.comp34.ref
new file mode 100644
index 00000000..086650be
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase18.ics.comp34.ref
@@ -0,0 +1,500 @@
+1997-09-28T09:00:00
+1997-10-29T09:00:00
+1997-11-28T09:00:00
+1997-12-29T09:00:00
+1998-01-29T09:00:00
+1998-02-26T09:00:00
+1998-03-29T09:00:00
+1998-04-28T09:00:00
+1998-05-29T09:00:00
+1998-06-28T09:00:00
+1998-07-29T09:00:00
+1998-08-29T09:00:00
+1998-09-28T09:00:00
+1998-10-29T09:00:00
+1998-11-28T09:00:00
+1998-12-29T09:00:00
+1999-01-29T09:00:00
+1999-02-26T09:00:00
+1999-03-29T09:00:00
+1999-04-28T09:00:00
+1999-05-29T09:00:00
+1999-06-28T09:00:00
+1999-07-29T09:00:00
+1999-08-29T09:00:00
+1999-09-28T09:00:00
+1999-10-29T09:00:00
+1999-11-28T09:00:00
+1999-12-29T09:00:00
+2000-01-29T09:00:00
+2000-02-27T09:00:00
+2000-03-29T09:00:00
+2000-04-28T09:00:00
+2000-05-29T09:00:00
+2000-06-28T09:00:00
+2000-07-29T09:00:00
+2000-08-29T09:00:00
+2000-09-28T09:00:00
+2000-10-29T09:00:00
+2000-11-28T09:00:00
+2000-12-29T09:00:00
+2001-01-29T09:00:00
+2001-02-26T09:00:00
+2001-03-29T09:00:00
+2001-04-28T09:00:00
+2001-05-29T09:00:00
+2001-06-28T09:00:00
+2001-07-29T09:00:00
+2001-08-29T09:00:00
+2001-09-28T09:00:00
+2001-10-29T09:00:00
+2001-11-28T09:00:00
+2001-12-29T09:00:00
+2002-01-29T09:00:00
+2002-02-26T09:00:00
+2002-03-29T09:00:00
+2002-04-28T09:00:00
+2002-05-29T09:00:00
+2002-06-28T09:00:00
+2002-07-29T09:00:00
+2002-08-29T09:00:00
+2002-09-28T09:00:00
+2002-10-29T09:00:00
+2002-11-28T09:00:00
+2002-12-29T09:00:00
+2003-01-29T09:00:00
+2003-02-26T09:00:00
+2003-03-29T09:00:00
+2003-04-28T09:00:00
+2003-05-29T09:00:00
+2003-06-28T09:00:00
+2003-07-29T09:00:00
+2003-08-29T09:00:00
+2003-09-28T09:00:00
+2003-10-29T09:00:00
+2003-11-28T09:00:00
+2003-12-29T09:00:00
+2004-01-29T09:00:00
+2004-02-27T09:00:00
+2004-03-29T09:00:00
+2004-04-28T09:00:00
+2004-05-29T09:00:00
+2004-06-28T09:00:00
+2004-07-29T09:00:00
+2004-08-29T09:00:00
+2004-09-28T09:00:00
+2004-10-29T09:00:00
+2004-11-28T09:00:00
+2004-12-29T09:00:00
+2005-01-29T09:00:00
+2005-02-26T09:00:00
+2005-03-29T09:00:00
+2005-04-28T09:00:00
+2005-05-29T09:00:00
+2005-06-28T09:00:00
+2005-07-29T09:00:00
+2005-08-29T09:00:00
+2005-09-28T09:00:00
+2005-10-29T09:00:00
+2005-11-28T09:00:00
+2005-12-29T09:00:00
+2006-01-29T09:00:00
+2006-02-26T09:00:00
+2006-03-29T09:00:00
+2006-04-28T09:00:00
+2006-05-29T09:00:00
+2006-06-28T09:00:00
+2006-07-29T09:00:00
+2006-08-29T09:00:00
+2006-09-28T09:00:00
+2006-10-29T09:00:00
+2006-11-28T09:00:00
+2006-12-29T09:00:00
+2007-01-29T09:00:00
+2007-02-26T09:00:00
+2007-03-29T09:00:00
+2007-04-28T09:00:00
+2007-05-29T09:00:00
+2007-06-28T09:00:00
+2007-07-29T09:00:00
+2007-08-29T09:00:00
+2007-09-28T09:00:00
+2007-10-29T09:00:00
+2007-11-28T09:00:00
+2007-12-29T09:00:00
+2008-01-29T09:00:00
+2008-02-27T09:00:00
+2008-03-29T09:00:00
+2008-04-28T09:00:00
+2008-05-29T09:00:00
+2008-06-28T09:00:00
+2008-07-29T09:00:00
+2008-08-29T09:00:00
+2008-09-28T09:00:00
+2008-10-29T09:00:00
+2008-11-28T09:00:00
+2008-12-29T09:00:00
+2009-01-29T09:00:00
+2009-02-26T09:00:00
+2009-03-29T09:00:00
+2009-04-28T09:00:00
+2009-05-29T09:00:00
+2009-06-28T09:00:00
+2009-07-29T09:00:00
+2009-08-29T09:00:00
+2009-09-28T09:00:00
+2009-10-29T09:00:00
+2009-11-28T09:00:00
+2009-12-29T09:00:00
+2010-01-29T09:00:00
+2010-02-26T09:00:00
+2010-03-29T09:00:00
+2010-04-28T09:00:00
+2010-05-29T09:00:00
+2010-06-28T09:00:00
+2010-07-29T09:00:00
+2010-08-29T09:00:00
+2010-09-28T09:00:00
+2010-10-29T09:00:00
+2010-11-28T09:00:00
+2010-12-29T09:00:00
+2011-01-29T09:00:00
+2011-02-26T09:00:00
+2011-03-29T09:00:00
+2011-04-28T09:00:00
+2011-05-29T09:00:00
+2011-06-28T09:00:00
+2011-07-29T09:00:00
+2011-08-29T09:00:00
+2011-09-28T09:00:00
+2011-10-29T09:00:00
+2011-11-28T09:00:00
+2011-12-29T09:00:00
+2012-01-29T09:00:00
+2012-02-27T09:00:00
+2012-03-29T09:00:00
+2012-04-28T09:00:00
+2012-05-29T09:00:00
+2012-06-28T09:00:00
+2012-07-29T09:00:00
+2012-08-29T09:00:00
+2012-09-28T09:00:00
+2012-10-29T09:00:00
+2012-11-28T09:00:00
+2012-12-29T09:00:00
+2013-01-29T09:00:00
+2013-02-26T09:00:00
+2013-03-29T09:00:00
+2013-04-28T09:00:00
+2013-05-29T09:00:00
+2013-06-28T09:00:00
+2013-07-29T09:00:00
+2013-08-29T09:00:00
+2013-09-28T09:00:00
+2013-10-29T09:00:00
+2013-11-28T09:00:00
+2013-12-29T09:00:00
+2014-01-29T09:00:00
+2014-02-26T09:00:00
+2014-03-29T09:00:00
+2014-04-28T09:00:00
+2014-05-29T09:00:00
+2014-06-28T09:00:00
+2014-07-29T09:00:00
+2014-08-29T09:00:00
+2014-09-28T09:00:00
+2014-10-29T09:00:00
+2014-11-28T09:00:00
+2014-12-29T09:00:00
+2015-01-29T09:00:00
+2015-02-26T09:00:00
+2015-03-29T09:00:00
+2015-04-28T09:00:00
+2015-05-29T09:00:00
+2015-06-28T09:00:00
+2015-07-29T09:00:00
+2015-08-29T09:00:00
+2015-09-28T09:00:00
+2015-10-29T09:00:00
+2015-11-28T09:00:00
+2015-12-29T09:00:00
+2016-01-29T09:00:00
+2016-02-27T09:00:00
+2016-03-29T09:00:00
+2016-04-28T09:00:00
+2016-05-29T09:00:00
+2016-06-28T09:00:00
+2016-07-29T09:00:00
+2016-08-29T09:00:00
+2016-09-28T09:00:00
+2016-10-29T09:00:00
+2016-11-28T09:00:00
+2016-12-29T09:00:00
+2017-01-29T09:00:00
+2017-02-26T09:00:00
+2017-03-29T09:00:00
+2017-04-28T09:00:00
+2017-05-29T09:00:00
+2017-06-28T09:00:00
+2017-07-29T09:00:00
+2017-08-29T09:00:00
+2017-09-28T09:00:00
+2017-10-29T09:00:00
+2017-11-28T09:00:00
+2017-12-29T09:00:00
+2018-01-29T09:00:00
+2018-02-26T09:00:00
+2018-03-29T09:00:00
+2018-04-28T09:00:00
+2018-05-29T09:00:00
+2018-06-28T09:00:00
+2018-07-29T09:00:00
+2018-08-29T09:00:00
+2018-09-28T09:00:00
+2018-10-29T09:00:00
+2018-11-28T09:00:00
+2018-12-29T09:00:00
+2019-01-29T09:00:00
+2019-02-26T09:00:00
+2019-03-29T09:00:00
+2019-04-28T09:00:00
+2019-05-29T09:00:00
+2019-06-28T09:00:00
+2019-07-29T09:00:00
+2019-08-29T09:00:00
+2019-09-28T09:00:00
+2019-10-29T09:00:00
+2019-11-28T09:00:00
+2019-12-29T09:00:00
+2020-01-29T09:00:00
+2020-02-27T09:00:00
+2020-03-29T09:00:00
+2020-04-28T09:00:00
+2020-05-29T09:00:00
+2020-06-28T09:00:00
+2020-07-29T09:00:00
+2020-08-29T09:00:00
+2020-09-28T09:00:00
+2020-10-29T09:00:00
+2020-11-28T09:00:00
+2020-12-29T09:00:00
+2021-01-29T09:00:00
+2021-02-26T09:00:00
+2021-03-29T09:00:00
+2021-04-28T09:00:00
+2021-05-29T09:00:00
+2021-06-28T09:00:00
+2021-07-29T09:00:00
+2021-08-29T09:00:00
+2021-09-28T09:00:00
+2021-10-29T09:00:00
+2021-11-28T09:00:00
+2021-12-29T09:00:00
+2022-01-29T09:00:00
+2022-02-26T09:00:00
+2022-03-29T09:00:00
+2022-04-28T09:00:00
+2022-05-29T09:00:00
+2022-06-28T09:00:00
+2022-07-29T09:00:00
+2022-08-29T09:00:00
+2022-09-28T09:00:00
+2022-10-29T09:00:00
+2022-11-28T09:00:00
+2022-12-29T09:00:00
+2023-01-29T09:00:00
+2023-02-26T09:00:00
+2023-03-29T09:00:00
+2023-04-28T09:00:00
+2023-05-29T09:00:00
+2023-06-28T09:00:00
+2023-07-29T09:00:00
+2023-08-29T09:00:00
+2023-09-28T09:00:00
+2023-10-29T09:00:00
+2023-11-28T09:00:00
+2023-12-29T09:00:00
+2024-01-29T09:00:00
+2024-02-27T09:00:00
+2024-03-29T09:00:00
+2024-04-28T09:00:00
+2024-05-29T09:00:00
+2024-06-28T09:00:00
+2024-07-29T09:00:00
+2024-08-29T09:00:00
+2024-09-28T09:00:00
+2024-10-29T09:00:00
+2024-11-28T09:00:00
+2024-12-29T09:00:00
+2025-01-29T09:00:00
+2025-02-26T09:00:00
+2025-03-29T09:00:00
+2025-04-28T09:00:00
+2025-05-29T09:00:00
+2025-06-28T09:00:00
+2025-07-29T09:00:00
+2025-08-29T09:00:00
+2025-09-28T09:00:00
+2025-10-29T09:00:00
+2025-11-28T09:00:00
+2025-12-29T09:00:00
+2026-01-29T09:00:00
+2026-02-26T09:00:00
+2026-03-29T09:00:00
+2026-04-28T09:00:00
+2026-05-29T09:00:00
+2026-06-28T09:00:00
+2026-07-29T09:00:00
+2026-08-29T09:00:00
+2026-09-28T09:00:00
+2026-10-29T09:00:00
+2026-11-28T09:00:00
+2026-12-29T09:00:00
+2027-01-29T09:00:00
+2027-02-26T09:00:00
+2027-03-29T09:00:00
+2027-04-28T09:00:00
+2027-05-29T09:00:00
+2027-06-28T09:00:00
+2027-07-29T09:00:00
+2027-08-29T09:00:00
+2027-09-28T09:00:00
+2027-10-29T09:00:00
+2027-11-28T09:00:00
+2027-12-29T09:00:00
+2028-01-29T09:00:00
+2028-02-27T09:00:00
+2028-03-29T09:00:00
+2028-04-28T09:00:00
+2028-05-29T09:00:00
+2028-06-28T09:00:00
+2028-07-29T09:00:00
+2028-08-29T09:00:00
+2028-09-28T09:00:00
+2028-10-29T09:00:00
+2028-11-28T09:00:00
+2028-12-29T09:00:00
+2029-01-29T09:00:00
+2029-02-26T09:00:00
+2029-03-29T09:00:00
+2029-04-28T09:00:00
+2029-05-29T09:00:00
+2029-06-28T09:00:00
+2029-07-29T09:00:00
+2029-08-29T09:00:00
+2029-09-28T09:00:00
+2029-10-29T09:00:00
+2029-11-28T09:00:00
+2029-12-29T09:00:00
+2030-01-29T09:00:00
+2030-02-26T09:00:00
+2030-03-29T09:00:00
+2030-04-28T09:00:00
+2030-05-29T09:00:00
+2030-06-28T09:00:00
+2030-07-29T09:00:00
+2030-08-29T09:00:00
+2030-09-28T09:00:00
+2030-10-29T09:00:00
+2030-11-28T09:00:00
+2030-12-29T09:00:00
+2031-01-29T09:00:00
+2031-02-26T09:00:00
+2031-03-29T09:00:00
+2031-04-28T09:00:00
+2031-05-29T09:00:00
+2031-06-28T09:00:00
+2031-07-29T09:00:00
+2031-08-29T09:00:00
+2031-09-28T09:00:00
+2031-10-29T09:00:00
+2031-11-28T09:00:00
+2031-12-29T09:00:00
+2032-01-29T09:00:00
+2032-02-27T09:00:00
+2032-03-29T09:00:00
+2032-04-28T09:00:00
+2032-05-29T09:00:00
+2032-06-28T09:00:00
+2032-07-29T09:00:00
+2032-08-29T09:00:00
+2032-09-28T09:00:00
+2032-10-29T09:00:00
+2032-11-28T09:00:00
+2032-12-29T09:00:00
+2033-01-29T09:00:00
+2033-02-26T09:00:00
+2033-03-29T09:00:00
+2033-04-28T09:00:00
+2033-05-29T09:00:00
+2033-06-28T09:00:00
+2033-07-29T09:00:00
+2033-08-29T09:00:00
+2033-09-28T09:00:00
+2033-10-29T09:00:00
+2033-11-28T09:00:00
+2033-12-29T09:00:00
+2034-01-29T09:00:00
+2034-02-26T09:00:00
+2034-03-29T09:00:00
+2034-04-28T09:00:00
+2034-05-29T09:00:00
+2034-06-28T09:00:00
+2034-07-29T09:00:00
+2034-08-29T09:00:00
+2034-09-28T09:00:00
+2034-10-29T09:00:00
+2034-11-28T09:00:00
+2034-12-29T09:00:00
+2035-01-29T09:00:00
+2035-02-26T09:00:00
+2035-03-29T09:00:00
+2035-04-28T09:00:00
+2035-05-29T09:00:00
+2035-06-28T09:00:00
+2035-07-29T09:00:00
+2035-08-29T09:00:00
+2035-09-28T09:00:00
+2035-10-29T09:00:00
+2035-11-28T09:00:00
+2035-12-29T09:00:00
+2036-01-29T09:00:00
+2036-02-27T09:00:00
+2036-03-29T09:00:00
+2036-04-28T09:00:00
+2036-05-29T09:00:00
+2036-06-28T09:00:00
+2036-07-29T09:00:00
+2036-08-29T09:00:00
+2036-09-28T09:00:00
+2036-10-29T09:00:00
+2036-11-28T09:00:00
+2036-12-29T09:00:00
+2037-01-29T09:00:00
+2037-02-26T09:00:00
+2037-03-29T09:00:00
+2037-04-28T09:00:00
+2037-05-29T09:00:00
+2037-06-28T09:00:00
+2037-07-29T09:00:00
+2037-08-29T09:00:00
+2037-09-28T09:00:00
+2037-10-29T09:00:00
+2037-11-28T09:00:00
+2037-12-29T09:00:00
+2038-01-29T09:00:00
+2038-02-26T09:00:00
+2038-03-29T09:00:00
+2038-04-28T09:00:00
+2038-05-29T09:00:00
+2038-06-28T09:00:00
+2038-07-29T09:00:00
+2038-08-29T09:00:00
+2038-09-28T09:00:00
+2038-10-29T09:00:00
+2038-11-28T09:00:00
+2038-12-29T09:00:00
+2039-01-29T09:00:00
+2039-02-26T09:00:00
+2039-03-29T09:00:00
+2039-04-28T09:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase18.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase18.ics.next.ref
new file mode 100644
index 00000000..086650be
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase18.ics.next.ref
@@ -0,0 +1,500 @@
+1997-09-28T09:00:00
+1997-10-29T09:00:00
+1997-11-28T09:00:00
+1997-12-29T09:00:00
+1998-01-29T09:00:00
+1998-02-26T09:00:00
+1998-03-29T09:00:00
+1998-04-28T09:00:00
+1998-05-29T09:00:00
+1998-06-28T09:00:00
+1998-07-29T09:00:00
+1998-08-29T09:00:00
+1998-09-28T09:00:00
+1998-10-29T09:00:00
+1998-11-28T09:00:00
+1998-12-29T09:00:00
+1999-01-29T09:00:00
+1999-02-26T09:00:00
+1999-03-29T09:00:00
+1999-04-28T09:00:00
+1999-05-29T09:00:00
+1999-06-28T09:00:00
+1999-07-29T09:00:00
+1999-08-29T09:00:00
+1999-09-28T09:00:00
+1999-10-29T09:00:00
+1999-11-28T09:00:00
+1999-12-29T09:00:00
+2000-01-29T09:00:00
+2000-02-27T09:00:00
+2000-03-29T09:00:00
+2000-04-28T09:00:00
+2000-05-29T09:00:00
+2000-06-28T09:00:00
+2000-07-29T09:00:00
+2000-08-29T09:00:00
+2000-09-28T09:00:00
+2000-10-29T09:00:00
+2000-11-28T09:00:00
+2000-12-29T09:00:00
+2001-01-29T09:00:00
+2001-02-26T09:00:00
+2001-03-29T09:00:00
+2001-04-28T09:00:00
+2001-05-29T09:00:00
+2001-06-28T09:00:00
+2001-07-29T09:00:00
+2001-08-29T09:00:00
+2001-09-28T09:00:00
+2001-10-29T09:00:00
+2001-11-28T09:00:00
+2001-12-29T09:00:00
+2002-01-29T09:00:00
+2002-02-26T09:00:00
+2002-03-29T09:00:00
+2002-04-28T09:00:00
+2002-05-29T09:00:00
+2002-06-28T09:00:00
+2002-07-29T09:00:00
+2002-08-29T09:00:00
+2002-09-28T09:00:00
+2002-10-29T09:00:00
+2002-11-28T09:00:00
+2002-12-29T09:00:00
+2003-01-29T09:00:00
+2003-02-26T09:00:00
+2003-03-29T09:00:00
+2003-04-28T09:00:00
+2003-05-29T09:00:00
+2003-06-28T09:00:00
+2003-07-29T09:00:00
+2003-08-29T09:00:00
+2003-09-28T09:00:00
+2003-10-29T09:00:00
+2003-11-28T09:00:00
+2003-12-29T09:00:00
+2004-01-29T09:00:00
+2004-02-27T09:00:00
+2004-03-29T09:00:00
+2004-04-28T09:00:00
+2004-05-29T09:00:00
+2004-06-28T09:00:00
+2004-07-29T09:00:00
+2004-08-29T09:00:00
+2004-09-28T09:00:00
+2004-10-29T09:00:00
+2004-11-28T09:00:00
+2004-12-29T09:00:00
+2005-01-29T09:00:00
+2005-02-26T09:00:00
+2005-03-29T09:00:00
+2005-04-28T09:00:00
+2005-05-29T09:00:00
+2005-06-28T09:00:00
+2005-07-29T09:00:00
+2005-08-29T09:00:00
+2005-09-28T09:00:00
+2005-10-29T09:00:00
+2005-11-28T09:00:00
+2005-12-29T09:00:00
+2006-01-29T09:00:00
+2006-02-26T09:00:00
+2006-03-29T09:00:00
+2006-04-28T09:00:00
+2006-05-29T09:00:00
+2006-06-28T09:00:00
+2006-07-29T09:00:00
+2006-08-29T09:00:00
+2006-09-28T09:00:00
+2006-10-29T09:00:00
+2006-11-28T09:00:00
+2006-12-29T09:00:00
+2007-01-29T09:00:00
+2007-02-26T09:00:00
+2007-03-29T09:00:00
+2007-04-28T09:00:00
+2007-05-29T09:00:00
+2007-06-28T09:00:00
+2007-07-29T09:00:00
+2007-08-29T09:00:00
+2007-09-28T09:00:00
+2007-10-29T09:00:00
+2007-11-28T09:00:00
+2007-12-29T09:00:00
+2008-01-29T09:00:00
+2008-02-27T09:00:00
+2008-03-29T09:00:00
+2008-04-28T09:00:00
+2008-05-29T09:00:00
+2008-06-28T09:00:00
+2008-07-29T09:00:00
+2008-08-29T09:00:00
+2008-09-28T09:00:00
+2008-10-29T09:00:00
+2008-11-28T09:00:00
+2008-12-29T09:00:00
+2009-01-29T09:00:00
+2009-02-26T09:00:00
+2009-03-29T09:00:00
+2009-04-28T09:00:00
+2009-05-29T09:00:00
+2009-06-28T09:00:00
+2009-07-29T09:00:00
+2009-08-29T09:00:00
+2009-09-28T09:00:00
+2009-10-29T09:00:00
+2009-11-28T09:00:00
+2009-12-29T09:00:00
+2010-01-29T09:00:00
+2010-02-26T09:00:00
+2010-03-29T09:00:00
+2010-04-28T09:00:00
+2010-05-29T09:00:00
+2010-06-28T09:00:00
+2010-07-29T09:00:00
+2010-08-29T09:00:00
+2010-09-28T09:00:00
+2010-10-29T09:00:00
+2010-11-28T09:00:00
+2010-12-29T09:00:00
+2011-01-29T09:00:00
+2011-02-26T09:00:00
+2011-03-29T09:00:00
+2011-04-28T09:00:00
+2011-05-29T09:00:00
+2011-06-28T09:00:00
+2011-07-29T09:00:00
+2011-08-29T09:00:00
+2011-09-28T09:00:00
+2011-10-29T09:00:00
+2011-11-28T09:00:00
+2011-12-29T09:00:00
+2012-01-29T09:00:00
+2012-02-27T09:00:00
+2012-03-29T09:00:00
+2012-04-28T09:00:00
+2012-05-29T09:00:00
+2012-06-28T09:00:00
+2012-07-29T09:00:00
+2012-08-29T09:00:00
+2012-09-28T09:00:00
+2012-10-29T09:00:00
+2012-11-28T09:00:00
+2012-12-29T09:00:00
+2013-01-29T09:00:00
+2013-02-26T09:00:00
+2013-03-29T09:00:00
+2013-04-28T09:00:00
+2013-05-29T09:00:00
+2013-06-28T09:00:00
+2013-07-29T09:00:00
+2013-08-29T09:00:00
+2013-09-28T09:00:00
+2013-10-29T09:00:00
+2013-11-28T09:00:00
+2013-12-29T09:00:00
+2014-01-29T09:00:00
+2014-02-26T09:00:00
+2014-03-29T09:00:00
+2014-04-28T09:00:00
+2014-05-29T09:00:00
+2014-06-28T09:00:00
+2014-07-29T09:00:00
+2014-08-29T09:00:00
+2014-09-28T09:00:00
+2014-10-29T09:00:00
+2014-11-28T09:00:00
+2014-12-29T09:00:00
+2015-01-29T09:00:00
+2015-02-26T09:00:00
+2015-03-29T09:00:00
+2015-04-28T09:00:00
+2015-05-29T09:00:00
+2015-06-28T09:00:00
+2015-07-29T09:00:00
+2015-08-29T09:00:00
+2015-09-28T09:00:00
+2015-10-29T09:00:00
+2015-11-28T09:00:00
+2015-12-29T09:00:00
+2016-01-29T09:00:00
+2016-02-27T09:00:00
+2016-03-29T09:00:00
+2016-04-28T09:00:00
+2016-05-29T09:00:00
+2016-06-28T09:00:00
+2016-07-29T09:00:00
+2016-08-29T09:00:00
+2016-09-28T09:00:00
+2016-10-29T09:00:00
+2016-11-28T09:00:00
+2016-12-29T09:00:00
+2017-01-29T09:00:00
+2017-02-26T09:00:00
+2017-03-29T09:00:00
+2017-04-28T09:00:00
+2017-05-29T09:00:00
+2017-06-28T09:00:00
+2017-07-29T09:00:00
+2017-08-29T09:00:00
+2017-09-28T09:00:00
+2017-10-29T09:00:00
+2017-11-28T09:00:00
+2017-12-29T09:00:00
+2018-01-29T09:00:00
+2018-02-26T09:00:00
+2018-03-29T09:00:00
+2018-04-28T09:00:00
+2018-05-29T09:00:00
+2018-06-28T09:00:00
+2018-07-29T09:00:00
+2018-08-29T09:00:00
+2018-09-28T09:00:00
+2018-10-29T09:00:00
+2018-11-28T09:00:00
+2018-12-29T09:00:00
+2019-01-29T09:00:00
+2019-02-26T09:00:00
+2019-03-29T09:00:00
+2019-04-28T09:00:00
+2019-05-29T09:00:00
+2019-06-28T09:00:00
+2019-07-29T09:00:00
+2019-08-29T09:00:00
+2019-09-28T09:00:00
+2019-10-29T09:00:00
+2019-11-28T09:00:00
+2019-12-29T09:00:00
+2020-01-29T09:00:00
+2020-02-27T09:00:00
+2020-03-29T09:00:00
+2020-04-28T09:00:00
+2020-05-29T09:00:00
+2020-06-28T09:00:00
+2020-07-29T09:00:00
+2020-08-29T09:00:00
+2020-09-28T09:00:00
+2020-10-29T09:00:00
+2020-11-28T09:00:00
+2020-12-29T09:00:00
+2021-01-29T09:00:00
+2021-02-26T09:00:00
+2021-03-29T09:00:00
+2021-04-28T09:00:00
+2021-05-29T09:00:00
+2021-06-28T09:00:00
+2021-07-29T09:00:00
+2021-08-29T09:00:00
+2021-09-28T09:00:00
+2021-10-29T09:00:00
+2021-11-28T09:00:00
+2021-12-29T09:00:00
+2022-01-29T09:00:00
+2022-02-26T09:00:00
+2022-03-29T09:00:00
+2022-04-28T09:00:00
+2022-05-29T09:00:00
+2022-06-28T09:00:00
+2022-07-29T09:00:00
+2022-08-29T09:00:00
+2022-09-28T09:00:00
+2022-10-29T09:00:00
+2022-11-28T09:00:00
+2022-12-29T09:00:00
+2023-01-29T09:00:00
+2023-02-26T09:00:00
+2023-03-29T09:00:00
+2023-04-28T09:00:00
+2023-05-29T09:00:00
+2023-06-28T09:00:00
+2023-07-29T09:00:00
+2023-08-29T09:00:00
+2023-09-28T09:00:00
+2023-10-29T09:00:00
+2023-11-28T09:00:00
+2023-12-29T09:00:00
+2024-01-29T09:00:00
+2024-02-27T09:00:00
+2024-03-29T09:00:00
+2024-04-28T09:00:00
+2024-05-29T09:00:00
+2024-06-28T09:00:00
+2024-07-29T09:00:00
+2024-08-29T09:00:00
+2024-09-28T09:00:00
+2024-10-29T09:00:00
+2024-11-28T09:00:00
+2024-12-29T09:00:00
+2025-01-29T09:00:00
+2025-02-26T09:00:00
+2025-03-29T09:00:00
+2025-04-28T09:00:00
+2025-05-29T09:00:00
+2025-06-28T09:00:00
+2025-07-29T09:00:00
+2025-08-29T09:00:00
+2025-09-28T09:00:00
+2025-10-29T09:00:00
+2025-11-28T09:00:00
+2025-12-29T09:00:00
+2026-01-29T09:00:00
+2026-02-26T09:00:00
+2026-03-29T09:00:00
+2026-04-28T09:00:00
+2026-05-29T09:00:00
+2026-06-28T09:00:00
+2026-07-29T09:00:00
+2026-08-29T09:00:00
+2026-09-28T09:00:00
+2026-10-29T09:00:00
+2026-11-28T09:00:00
+2026-12-29T09:00:00
+2027-01-29T09:00:00
+2027-02-26T09:00:00
+2027-03-29T09:00:00
+2027-04-28T09:00:00
+2027-05-29T09:00:00
+2027-06-28T09:00:00
+2027-07-29T09:00:00
+2027-08-29T09:00:00
+2027-09-28T09:00:00
+2027-10-29T09:00:00
+2027-11-28T09:00:00
+2027-12-29T09:00:00
+2028-01-29T09:00:00
+2028-02-27T09:00:00
+2028-03-29T09:00:00
+2028-04-28T09:00:00
+2028-05-29T09:00:00
+2028-06-28T09:00:00
+2028-07-29T09:00:00
+2028-08-29T09:00:00
+2028-09-28T09:00:00
+2028-10-29T09:00:00
+2028-11-28T09:00:00
+2028-12-29T09:00:00
+2029-01-29T09:00:00
+2029-02-26T09:00:00
+2029-03-29T09:00:00
+2029-04-28T09:00:00
+2029-05-29T09:00:00
+2029-06-28T09:00:00
+2029-07-29T09:00:00
+2029-08-29T09:00:00
+2029-09-28T09:00:00
+2029-10-29T09:00:00
+2029-11-28T09:00:00
+2029-12-29T09:00:00
+2030-01-29T09:00:00
+2030-02-26T09:00:00
+2030-03-29T09:00:00
+2030-04-28T09:00:00
+2030-05-29T09:00:00
+2030-06-28T09:00:00
+2030-07-29T09:00:00
+2030-08-29T09:00:00
+2030-09-28T09:00:00
+2030-10-29T09:00:00
+2030-11-28T09:00:00
+2030-12-29T09:00:00
+2031-01-29T09:00:00
+2031-02-26T09:00:00
+2031-03-29T09:00:00
+2031-04-28T09:00:00
+2031-05-29T09:00:00
+2031-06-28T09:00:00
+2031-07-29T09:00:00
+2031-08-29T09:00:00
+2031-09-28T09:00:00
+2031-10-29T09:00:00
+2031-11-28T09:00:00
+2031-12-29T09:00:00
+2032-01-29T09:00:00
+2032-02-27T09:00:00
+2032-03-29T09:00:00
+2032-04-28T09:00:00
+2032-05-29T09:00:00
+2032-06-28T09:00:00
+2032-07-29T09:00:00
+2032-08-29T09:00:00
+2032-09-28T09:00:00
+2032-10-29T09:00:00
+2032-11-28T09:00:00
+2032-12-29T09:00:00
+2033-01-29T09:00:00
+2033-02-26T09:00:00
+2033-03-29T09:00:00
+2033-04-28T09:00:00
+2033-05-29T09:00:00
+2033-06-28T09:00:00
+2033-07-29T09:00:00
+2033-08-29T09:00:00
+2033-09-28T09:00:00
+2033-10-29T09:00:00
+2033-11-28T09:00:00
+2033-12-29T09:00:00
+2034-01-29T09:00:00
+2034-02-26T09:00:00
+2034-03-29T09:00:00
+2034-04-28T09:00:00
+2034-05-29T09:00:00
+2034-06-28T09:00:00
+2034-07-29T09:00:00
+2034-08-29T09:00:00
+2034-09-28T09:00:00
+2034-10-29T09:00:00
+2034-11-28T09:00:00
+2034-12-29T09:00:00
+2035-01-29T09:00:00
+2035-02-26T09:00:00
+2035-03-29T09:00:00
+2035-04-28T09:00:00
+2035-05-29T09:00:00
+2035-06-28T09:00:00
+2035-07-29T09:00:00
+2035-08-29T09:00:00
+2035-09-28T09:00:00
+2035-10-29T09:00:00
+2035-11-28T09:00:00
+2035-12-29T09:00:00
+2036-01-29T09:00:00
+2036-02-27T09:00:00
+2036-03-29T09:00:00
+2036-04-28T09:00:00
+2036-05-29T09:00:00
+2036-06-28T09:00:00
+2036-07-29T09:00:00
+2036-08-29T09:00:00
+2036-09-28T09:00:00
+2036-10-29T09:00:00
+2036-11-28T09:00:00
+2036-12-29T09:00:00
+2037-01-29T09:00:00
+2037-02-26T09:00:00
+2037-03-29T09:00:00
+2037-04-28T09:00:00
+2037-05-29T09:00:00
+2037-06-28T09:00:00
+2037-07-29T09:00:00
+2037-08-29T09:00:00
+2037-09-28T09:00:00
+2037-10-29T09:00:00
+2037-11-28T09:00:00
+2037-12-29T09:00:00
+2038-01-29T09:00:00
+2038-02-26T09:00:00
+2038-03-29T09:00:00
+2038-04-28T09:00:00
+2038-05-29T09:00:00
+2038-06-28T09:00:00
+2038-07-29T09:00:00
+2038-08-29T09:00:00
+2038-09-28T09:00:00
+2038-10-29T09:00:00
+2038-11-28T09:00:00
+2038-12-29T09:00:00
+2039-01-29T09:00:00
+2039-02-26T09:00:00
+2039-03-29T09:00:00
+2039-04-28T09:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase18.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase18.ics.prev.ref
new file mode 100644
index 00000000..c18f9686
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase18.ics.prev.ref
@@ -0,0 +1,161 @@
+2010-12-29T09:00:00
+2010-11-28T09:00:00
+2010-10-29T09:00:00
+2010-09-28T09:00:00
+2010-08-29T09:00:00
+2010-07-29T09:00:00
+2010-06-28T09:00:00
+2010-05-29T09:00:00
+2010-04-28T09:00:00
+2010-03-29T09:00:00
+2010-02-26T09:00:00
+2010-01-29T09:00:00
+2009-12-29T09:00:00
+2009-11-28T09:00:00
+2009-10-29T09:00:00
+2009-09-28T09:00:00
+2009-08-29T09:00:00
+2009-07-29T09:00:00
+2009-06-28T09:00:00
+2009-05-29T09:00:00
+2009-04-28T09:00:00
+2009-03-29T09:00:00
+2009-02-26T09:00:00
+2009-01-29T09:00:00
+2008-12-29T09:00:00
+2008-11-28T09:00:00
+2008-10-29T09:00:00
+2008-09-28T09:00:00
+2008-08-29T09:00:00
+2008-07-29T09:00:00
+2008-06-28T09:00:00
+2008-05-29T09:00:00
+2008-04-28T09:00:00
+2008-03-29T09:00:00
+2008-02-27T09:00:00
+2008-01-29T09:00:00
+2007-12-29T09:00:00
+2007-11-28T09:00:00
+2007-10-29T09:00:00
+2007-09-28T09:00:00
+2007-08-29T09:00:00
+2007-07-29T09:00:00
+2007-06-28T09:00:00
+2007-05-29T09:00:00
+2007-04-28T09:00:00
+2007-03-29T09:00:00
+2007-02-26T09:00:00
+2007-01-29T09:00:00
+2006-12-29T09:00:00
+2006-11-28T09:00:00
+2006-10-29T09:00:00
+2006-09-28T09:00:00
+2006-08-29T09:00:00
+2006-07-29T09:00:00
+2006-06-28T09:00:00
+2006-05-29T09:00:00
+2006-04-28T09:00:00
+2006-03-29T09:00:00
+2006-02-26T09:00:00
+2006-01-29T09:00:00
+2005-12-29T09:00:00
+2005-11-28T09:00:00
+2005-10-29T09:00:00
+2005-09-28T09:00:00
+2005-08-29T09:00:00
+2005-07-29T09:00:00
+2005-06-28T09:00:00
+2005-05-29T09:00:00
+2005-04-28T09:00:00
+2005-03-29T09:00:00
+2005-02-26T09:00:00
+2005-01-29T09:00:00
+2004-12-29T09:00:00
+2004-11-28T09:00:00
+2004-10-29T09:00:00
+2004-09-28T09:00:00
+2004-08-29T09:00:00
+2004-07-29T09:00:00
+2004-06-28T09:00:00
+2004-05-29T09:00:00
+2004-04-28T09:00:00
+2004-03-29T09:00:00
+2004-02-27T09:00:00
+2004-01-29T09:00:00
+2003-12-29T09:00:00
+2003-11-28T09:00:00
+2003-10-29T09:00:00
+2003-09-28T09:00:00
+2003-08-29T09:00:00
+2003-07-29T09:00:00
+2003-06-28T09:00:00
+2003-05-29T09:00:00
+2003-04-28T09:00:00
+2003-03-29T09:00:00
+2003-02-26T09:00:00
+2003-01-29T09:00:00
+2002-12-29T09:00:00
+2002-11-28T09:00:00
+2002-10-29T09:00:00
+2002-09-28T09:00:00
+2002-08-29T09:00:00
+2002-07-29T09:00:00
+2002-06-28T09:00:00
+2002-05-29T09:00:00
+2002-04-28T09:00:00
+2002-03-29T09:00:00
+2002-02-26T09:00:00
+2002-01-29T09:00:00
+2001-12-29T09:00:00
+2001-11-28T09:00:00
+2001-10-29T09:00:00
+2001-09-28T09:00:00
+2001-08-29T09:00:00
+2001-07-29T09:00:00
+2001-06-28T09:00:00
+2001-05-29T09:00:00
+2001-04-28T09:00:00
+2001-03-29T09:00:00
+2001-02-26T09:00:00
+2001-01-29T09:00:00
+2000-12-29T09:00:00
+2000-11-28T09:00:00
+2000-10-29T09:00:00
+2000-09-28T09:00:00
+2000-08-29T09:00:00
+2000-07-29T09:00:00
+2000-06-28T09:00:00
+2000-05-29T09:00:00
+2000-04-28T09:00:00
+2000-03-29T09:00:00
+2000-02-27T09:00:00
+2000-01-29T09:00:00
+1999-12-29T09:00:00
+1999-11-28T09:00:00
+1999-10-29T09:00:00
+1999-09-28T09:00:00
+1999-08-29T09:00:00
+1999-07-29T09:00:00
+1999-06-28T09:00:00
+1999-05-29T09:00:00
+1999-04-28T09:00:00
+1999-03-29T09:00:00
+1999-02-26T09:00:00
+1999-01-29T09:00:00
+1998-12-29T09:00:00
+1998-11-28T09:00:00
+1998-10-29T09:00:00
+1998-09-28T09:00:00
+1998-08-29T09:00:00
+1998-07-29T09:00:00
+1998-06-28T09:00:00
+1998-05-29T09:00:00
+1998-04-28T09:00:00
+1998-03-29T09:00:00
+1998-02-26T09:00:00
+1998-01-29T09:00:00
+1997-12-29T09:00:00
+1997-11-28T09:00:00
+1997-10-29T09:00:00
+1997-09-28T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase18.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase18.ics.recurson.ref
new file mode 100644
index 00000000..96048374
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase18.ics.recurson.ref
@@ -0,0 +1,160 @@
+1997-09-28
+1997-10-29
+1997-11-28
+1997-12-29
+1998-01-29
+1998-02-26
+1998-03-29
+1998-04-28
+1998-05-29
+1998-06-28
+1998-07-29
+1998-08-29
+1998-09-28
+1998-10-29
+1998-11-28
+1998-12-29
+1999-01-29
+1999-02-26
+1999-03-29
+1999-04-28
+1999-05-29
+1999-06-28
+1999-07-29
+1999-08-29
+1999-09-28
+1999-10-29
+1999-11-28
+1999-12-29
+2000-01-29
+2000-02-27
+2000-03-29
+2000-04-28
+2000-05-29
+2000-06-28
+2000-07-29
+2000-08-29
+2000-09-28
+2000-10-29
+2000-11-28
+2000-12-29
+2001-01-29
+2001-02-26
+2001-03-29
+2001-04-28
+2001-05-29
+2001-06-28
+2001-07-29
+2001-08-29
+2001-09-28
+2001-10-29
+2001-11-28
+2001-12-29
+2002-01-29
+2002-02-26
+2002-03-29
+2002-04-28
+2002-05-29
+2002-06-28
+2002-07-29
+2002-08-29
+2002-09-28
+2002-10-29
+2002-11-28
+2002-12-29
+2003-01-29
+2003-02-26
+2003-03-29
+2003-04-28
+2003-05-29
+2003-06-28
+2003-07-29
+2003-08-29
+2003-09-28
+2003-10-29
+2003-11-28
+2003-12-29
+2004-01-29
+2004-02-27
+2004-03-29
+2004-04-28
+2004-05-29
+2004-06-28
+2004-07-29
+2004-08-29
+2004-09-28
+2004-10-29
+2004-11-28
+2004-12-29
+2005-01-29
+2005-02-26
+2005-03-29
+2005-04-28
+2005-05-29
+2005-06-28
+2005-07-29
+2005-08-29
+2005-09-28
+2005-10-29
+2005-11-28
+2005-12-29
+2006-01-29
+2006-02-26
+2006-03-29
+2006-04-28
+2006-05-29
+2006-06-28
+2006-07-29
+2006-08-29
+2006-09-28
+2006-10-29
+2006-11-28
+2006-12-29
+2007-01-29
+2007-02-26
+2007-03-29
+2007-04-28
+2007-05-29
+2007-06-28
+2007-07-29
+2007-08-29
+2007-09-28
+2007-10-29
+2007-11-28
+2007-12-29
+2008-01-29
+2008-02-27
+2008-03-29
+2008-04-28
+2008-05-29
+2008-06-28
+2008-07-29
+2008-08-29
+2008-09-28
+2008-10-29
+2008-11-28
+2008-12-29
+2009-01-29
+2009-02-26
+2009-03-29
+2009-04-28
+2009-05-29
+2009-06-28
+2009-07-29
+2009-08-29
+2009-09-28
+2009-10-29
+2009-11-28
+2009-12-29
+2010-01-29
+2010-02-26
+2010-03-29
+2010-04-28
+2010-05-29
+2010-06-28
+2010-07-29
+2010-08-29
+2010-09-28
+2010-10-29
+2010-11-28
+2010-12-29
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase19.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase19.ics
new file mode 100644
index 00000000..1070408d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase19.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Monthly on the 2nd and 15th of the month for 10 occurrences:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=2,15
+SUMMARY:RExample17
+UID:RExample17
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase19.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase19.ics.comp34.ref
new file mode 100644
index 00000000..52445b4a
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase19.ics.comp34.ref
@@ -0,0 +1,11 @@
+1997-09-02T09:00:00
+1997-09-15T09:00:00
+1997-10-02T09:00:00
+1997-10-15T09:00:00
+1997-11-02T09:00:00
+1997-11-15T09:00:00
+1997-12-02T09:00:00
+1997-12-15T09:00:00
+1998-01-02T09:00:00
+1998-01-15T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase19.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase19.ics.next.ref
new file mode 100644
index 00000000..52445b4a
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase19.ics.next.ref
@@ -0,0 +1,11 @@
+1997-09-02T09:00:00
+1997-09-15T09:00:00
+1997-10-02T09:00:00
+1997-10-15T09:00:00
+1997-11-02T09:00:00
+1997-11-15T09:00:00
+1997-12-02T09:00:00
+1997-12-15T09:00:00
+1998-01-02T09:00:00
+1998-01-15T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase19.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase19.ics.prev.ref
new file mode 100644
index 00000000..1e9dd817
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase19.ics.prev.ref
@@ -0,0 +1,11 @@
+1998-01-15T09:00:00
+1998-01-02T09:00:00
+1997-12-15T09:00:00
+1997-12-02T09:00:00
+1997-11-15T09:00:00
+1997-11-02T09:00:00
+1997-10-15T09:00:00
+1997-10-02T09:00:00
+1997-09-15T09:00:00
+1997-09-02T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase19.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase19.ics.recurson.ref
new file mode 100644
index 00000000..7b72c389
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase19.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-09-02
+1997-09-15
+1997-10-02
+1997-10-15
+1997-11-02
+1997-11-15
+1997-12-02
+1997-12-15
+1998-01-02
+1998-01-15
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase20.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase20.ics
new file mode 100644
index 00000000..3fa3f384
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase20.ics
@@ -0,0 +1,34 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Monthly on the first and last day of the month for 10 occurren
+ ces:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970930T090000
+RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=1,-1
+SUMMARY:RExample18
+UID:RExample18
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase20.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase20.ics.comp34.ref
new file mode 100644
index 00000000..d21f813e
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase20.ics.comp34.ref
@@ -0,0 +1,11 @@
+1997-09-30T09:00:00
+1997-10-01T09:00:00
+1997-10-31T09:00:00
+1997-11-01T09:00:00
+1997-11-30T09:00:00
+1997-12-01T09:00:00
+1997-12-31T09:00:00
+1998-01-01T09:00:00
+1998-01-31T09:00:00
+1998-02-01T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase20.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase20.ics.next.ref
new file mode 100644
index 00000000..d21f813e
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase20.ics.next.ref
@@ -0,0 +1,11 @@
+1997-09-30T09:00:00
+1997-10-01T09:00:00
+1997-10-31T09:00:00
+1997-11-01T09:00:00
+1997-11-30T09:00:00
+1997-12-01T09:00:00
+1997-12-31T09:00:00
+1998-01-01T09:00:00
+1998-01-31T09:00:00
+1998-02-01T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase20.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase20.ics.prev.ref
new file mode 100644
index 00000000..677e11bf
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase20.ics.prev.ref
@@ -0,0 +1,11 @@
+1998-02-01T09:00:00
+1998-01-31T09:00:00
+1998-01-01T09:00:00
+1997-12-31T09:00:00
+1997-12-01T09:00:00
+1997-11-30T09:00:00
+1997-11-01T09:00:00
+1997-10-31T09:00:00
+1997-10-01T09:00:00
+1997-09-30T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase20.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase20.ics.recurson.ref
new file mode 100644
index 00000000..6601563b
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase20.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-09-30
+1997-10-01
+1997-10-31
+1997-11-01
+1997-11-30
+1997-12-01
+1997-12-31
+1998-01-01
+1998-01-31
+1998-02-01
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase21.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase21.ics
new file mode 100644
index 00000000..6f86bade
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase21.ics
@@ -0,0 +1,34 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Every 18 months on the 10th thru 15th of the month for 10 occu
+ rrences:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970910T090000
+RRULE:FREQ=MONTHLY;COUNT=10;INTERVAL=18;BYMONTHDAY=10,11,12,13,14,15
+SUMMARY:RExample19
+UID:RExample19
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase21.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase21.ics.comp34.ref
new file mode 100644
index 00000000..b013e791
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase21.ics.comp34.ref
@@ -0,0 +1,11 @@
+1997-09-10T09:00:00
+1997-09-11T09:00:00
+1997-09-12T09:00:00
+1997-09-13T09:00:00
+1997-09-14T09:00:00
+1997-09-15T09:00:00
+1999-03-10T09:00:00
+1999-03-11T09:00:00
+1999-03-12T09:00:00
+1999-03-13T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase21.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase21.ics.next.ref
new file mode 100644
index 00000000..b013e791
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase21.ics.next.ref
@@ -0,0 +1,11 @@
+1997-09-10T09:00:00
+1997-09-11T09:00:00
+1997-09-12T09:00:00
+1997-09-13T09:00:00
+1997-09-14T09:00:00
+1997-09-15T09:00:00
+1999-03-10T09:00:00
+1999-03-11T09:00:00
+1999-03-12T09:00:00
+1999-03-13T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase21.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase21.ics.prev.ref
new file mode 100644
index 00000000..7efafa60
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase21.ics.prev.ref
@@ -0,0 +1,11 @@
+1999-03-13T09:00:00
+1999-03-12T09:00:00
+1999-03-11T09:00:00
+1999-03-10T09:00:00
+1997-09-15T09:00:00
+1997-09-14T09:00:00
+1997-09-13T09:00:00
+1997-09-12T09:00:00
+1997-09-11T09:00:00
+1997-09-10T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase21.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase21.ics.recurson.ref
new file mode 100644
index 00000000..dcaea76d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase21.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-09-10
+1997-09-11
+1997-09-12
+1997-09-13
+1997-09-14
+1997-09-15
+1999-03-10
+1999-03-11
+1999-03-12
+1999-03-13
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase22.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase22.ics
new file mode 100644
index 00000000..487f03a8
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase22.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Every Tuesday\, every other month:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=MONTHLY;INTERVAL=2;BYDAY=TU
+SUMMARY:RExample20
+UID:RExample20
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase22.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase22.ics.comp34.ref
new file mode 100644
index 00000000..6d3cbe1f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase22.ics.comp34.ref
@@ -0,0 +1,2 @@
+1997-09-02T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase22.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase22.ics.next.ref
new file mode 100644
index 00000000..f695b27e
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase22.ics.next.ref
@@ -0,0 +1,500 @@
+1997-09-02T09:00:00
+1997-09-09T09:00:00
+1997-09-16T09:00:00
+1997-09-23T09:00:00
+1997-09-30T09:00:00
+1997-11-04T09:00:00
+1997-11-11T09:00:00
+1997-11-18T09:00:00
+1997-11-25T09:00:00
+1998-01-06T09:00:00
+1998-01-13T09:00:00
+1998-01-20T09:00:00
+1998-01-27T09:00:00
+1998-03-03T09:00:00
+1998-03-10T09:00:00
+1998-03-17T09:00:00
+1998-03-24T09:00:00
+1998-03-31T09:00:00
+1998-05-05T09:00:00
+1998-05-12T09:00:00
+1998-05-19T09:00:00
+1998-05-26T09:00:00
+1998-07-07T09:00:00
+1998-07-14T09:00:00
+1998-07-21T09:00:00
+1998-07-28T09:00:00
+1998-09-01T09:00:00
+1998-09-08T09:00:00
+1998-09-15T09:00:00
+1998-09-22T09:00:00
+1998-09-29T09:00:00
+1998-11-03T09:00:00
+1998-11-10T09:00:00
+1998-11-17T09:00:00
+1998-11-24T09:00:00
+1999-01-05T09:00:00
+1999-01-12T09:00:00
+1999-01-19T09:00:00
+1999-01-26T09:00:00
+1999-03-02T09:00:00
+1999-03-09T09:00:00
+1999-03-16T09:00:00
+1999-03-23T09:00:00
+1999-03-30T09:00:00
+1999-05-04T09:00:00
+1999-05-11T09:00:00
+1999-05-18T09:00:00
+1999-05-25T09:00:00
+1999-07-06T09:00:00
+1999-07-13T09:00:00
+1999-07-20T09:00:00
+1999-07-27T09:00:00
+1999-09-07T09:00:00
+1999-09-14T09:00:00
+1999-09-21T09:00:00
+1999-09-28T09:00:00
+1999-11-02T09:00:00
+1999-11-09T09:00:00
+1999-11-16T09:00:00
+1999-11-23T09:00:00
+1999-11-30T09:00:00
+2000-01-04T09:00:00
+2000-01-11T09:00:00
+2000-01-18T09:00:00
+2000-01-25T09:00:00
+2000-03-07T09:00:00
+2000-03-14T09:00:00
+2000-03-21T09:00:00
+2000-03-28T09:00:00
+2000-05-02T09:00:00
+2000-05-09T09:00:00
+2000-05-16T09:00:00
+2000-05-23T09:00:00
+2000-05-30T09:00:00
+2000-07-04T09:00:00
+2000-07-11T09:00:00
+2000-07-18T09:00:00
+2000-07-25T09:00:00
+2000-09-05T09:00:00
+2000-09-12T09:00:00
+2000-09-19T09:00:00
+2000-09-26T09:00:00
+2000-11-07T09:00:00
+2000-11-14T09:00:00
+2000-11-21T09:00:00
+2000-11-28T09:00:00
+2001-01-02T09:00:00
+2001-01-09T09:00:00
+2001-01-16T09:00:00
+2001-01-23T09:00:00
+2001-01-30T09:00:00
+2001-03-06T09:00:00
+2001-03-13T09:00:00
+2001-03-20T09:00:00
+2001-03-27T09:00:00
+2001-05-01T09:00:00
+2001-05-08T09:00:00
+2001-05-15T09:00:00
+2001-05-22T09:00:00
+2001-05-29T09:00:00
+2001-07-03T09:00:00
+2001-07-10T09:00:00
+2001-07-17T09:00:00
+2001-07-24T09:00:00
+2001-07-31T09:00:00
+2001-09-04T09:00:00
+2001-09-11T09:00:00
+2001-09-18T09:00:00
+2001-09-25T09:00:00
+2001-11-06T09:00:00
+2001-11-13T09:00:00
+2001-11-20T09:00:00
+2001-11-27T09:00:00
+2002-01-01T09:00:00
+2002-01-08T09:00:00
+2002-01-15T09:00:00
+2002-01-22T09:00:00
+2002-01-29T09:00:00
+2002-03-05T09:00:00
+2002-03-12T09:00:00
+2002-03-19T09:00:00
+2002-03-26T09:00:00
+2002-05-07T09:00:00
+2002-05-14T09:00:00
+2002-05-21T09:00:00
+2002-05-28T09:00:00
+2002-07-02T09:00:00
+2002-07-09T09:00:00
+2002-07-16T09:00:00
+2002-07-23T09:00:00
+2002-07-30T09:00:00
+2002-09-03T09:00:00
+2002-09-10T09:00:00
+2002-09-17T09:00:00
+2002-09-24T09:00:00
+2002-11-05T09:00:00
+2002-11-12T09:00:00
+2002-11-19T09:00:00
+2002-11-26T09:00:00
+2003-01-07T09:00:00
+2003-01-14T09:00:00
+2003-01-21T09:00:00
+2003-01-28T09:00:00
+2003-03-04T09:00:00
+2003-03-11T09:00:00
+2003-03-18T09:00:00
+2003-03-25T09:00:00
+2003-05-06T09:00:00
+2003-05-13T09:00:00
+2003-05-20T09:00:00
+2003-05-27T09:00:00
+2003-07-01T09:00:00
+2003-07-08T09:00:00
+2003-07-15T09:00:00
+2003-07-22T09:00:00
+2003-07-29T09:00:00
+2003-09-02T09:00:00
+2003-09-09T09:00:00
+2003-09-16T09:00:00
+2003-09-23T09:00:00
+2003-09-30T09:00:00
+2003-11-04T09:00:00
+2003-11-11T09:00:00
+2003-11-18T09:00:00
+2003-11-25T09:00:00
+2004-01-06T09:00:00
+2004-01-13T09:00:00
+2004-01-20T09:00:00
+2004-01-27T09:00:00
+2004-03-02T09:00:00
+2004-03-09T09:00:00
+2004-03-16T09:00:00
+2004-03-23T09:00:00
+2004-03-30T09:00:00
+2004-05-04T09:00:00
+2004-05-11T09:00:00
+2004-05-18T09:00:00
+2004-05-25T09:00:00
+2004-07-06T09:00:00
+2004-07-13T09:00:00
+2004-07-20T09:00:00
+2004-07-27T09:00:00
+2004-09-07T09:00:00
+2004-09-14T09:00:00
+2004-09-21T09:00:00
+2004-09-28T09:00:00
+2004-11-02T09:00:00
+2004-11-09T09:00:00
+2004-11-16T09:00:00
+2004-11-23T09:00:00
+2004-11-30T09:00:00
+2005-01-04T09:00:00
+2005-01-11T09:00:00
+2005-01-18T09:00:00
+2005-01-25T09:00:00
+2005-03-01T09:00:00
+2005-03-08T09:00:00
+2005-03-15T09:00:00
+2005-03-22T09:00:00
+2005-03-29T09:00:00
+2005-05-03T09:00:00
+2005-05-10T09:00:00
+2005-05-17T09:00:00
+2005-05-24T09:00:00
+2005-05-31T09:00:00
+2005-07-05T09:00:00
+2005-07-12T09:00:00
+2005-07-19T09:00:00
+2005-07-26T09:00:00
+2005-09-06T09:00:00
+2005-09-13T09:00:00
+2005-09-20T09:00:00
+2005-09-27T09:00:00
+2005-11-01T09:00:00
+2005-11-08T09:00:00
+2005-11-15T09:00:00
+2005-11-22T09:00:00
+2005-11-29T09:00:00
+2006-01-03T09:00:00
+2006-01-10T09:00:00
+2006-01-17T09:00:00
+2006-01-24T09:00:00
+2006-01-31T09:00:00
+2006-03-07T09:00:00
+2006-03-14T09:00:00
+2006-03-21T09:00:00
+2006-03-28T09:00:00
+2006-05-02T09:00:00
+2006-05-09T09:00:00
+2006-05-16T09:00:00
+2006-05-23T09:00:00
+2006-05-30T09:00:00
+2006-07-04T09:00:00
+2006-07-11T09:00:00
+2006-07-18T09:00:00
+2006-07-25T09:00:00
+2006-09-05T09:00:00
+2006-09-12T09:00:00
+2006-09-19T09:00:00
+2006-09-26T09:00:00
+2006-11-07T09:00:00
+2006-11-14T09:00:00
+2006-11-21T09:00:00
+2006-11-28T09:00:00
+2007-01-02T09:00:00
+2007-01-09T09:00:00
+2007-01-16T09:00:00
+2007-01-23T09:00:00
+2007-01-30T09:00:00
+2007-03-06T09:00:00
+2007-03-13T09:00:00
+2007-03-20T09:00:00
+2007-03-27T09:00:00
+2007-05-01T09:00:00
+2007-05-08T09:00:00
+2007-05-15T09:00:00
+2007-05-22T09:00:00
+2007-05-29T09:00:00
+2007-07-03T09:00:00
+2007-07-10T09:00:00
+2007-07-17T09:00:00
+2007-07-24T09:00:00
+2007-07-31T09:00:00
+2007-09-04T09:00:00
+2007-09-11T09:00:00
+2007-09-18T09:00:00
+2007-09-25T09:00:00
+2007-11-06T09:00:00
+2007-11-13T09:00:00
+2007-11-20T09:00:00
+2007-11-27T09:00:00
+2008-01-01T09:00:00
+2008-01-08T09:00:00
+2008-01-15T09:00:00
+2008-01-22T09:00:00
+2008-01-29T09:00:00
+2008-03-04T09:00:00
+2008-03-11T09:00:00
+2008-03-18T09:00:00
+2008-03-25T09:00:00
+2008-05-06T09:00:00
+2008-05-13T09:00:00
+2008-05-20T09:00:00
+2008-05-27T09:00:00
+2008-07-01T09:00:00
+2008-07-08T09:00:00
+2008-07-15T09:00:00
+2008-07-22T09:00:00
+2008-07-29T09:00:00
+2008-09-02T09:00:00
+2008-09-09T09:00:00
+2008-09-16T09:00:00
+2008-09-23T09:00:00
+2008-09-30T09:00:00
+2008-11-04T09:00:00
+2008-11-11T09:00:00
+2008-11-18T09:00:00
+2008-11-25T09:00:00
+2009-01-06T09:00:00
+2009-01-13T09:00:00
+2009-01-20T09:00:00
+2009-01-27T09:00:00
+2009-03-03T09:00:00
+2009-03-10T09:00:00
+2009-03-17T09:00:00
+2009-03-24T09:00:00
+2009-03-31T09:00:00
+2009-05-05T09:00:00
+2009-05-12T09:00:00
+2009-05-19T09:00:00
+2009-05-26T09:00:00
+2009-07-07T09:00:00
+2009-07-14T09:00:00
+2009-07-21T09:00:00
+2009-07-28T09:00:00
+2009-09-01T09:00:00
+2009-09-08T09:00:00
+2009-09-15T09:00:00
+2009-09-22T09:00:00
+2009-09-29T09:00:00
+2009-11-03T09:00:00
+2009-11-10T09:00:00
+2009-11-17T09:00:00
+2009-11-24T09:00:00
+2010-01-05T09:00:00
+2010-01-12T09:00:00
+2010-01-19T09:00:00
+2010-01-26T09:00:00
+2010-03-02T09:00:00
+2010-03-09T09:00:00
+2010-03-16T09:00:00
+2010-03-23T09:00:00
+2010-03-30T09:00:00
+2010-05-04T09:00:00
+2010-05-11T09:00:00
+2010-05-18T09:00:00
+2010-05-25T09:00:00
+2010-07-06T09:00:00
+2010-07-13T09:00:00
+2010-07-20T09:00:00
+2010-07-27T09:00:00
+2010-09-07T09:00:00
+2010-09-14T09:00:00
+2010-09-21T09:00:00
+2010-09-28T09:00:00
+2010-11-02T09:00:00
+2010-11-09T09:00:00
+2010-11-16T09:00:00
+2010-11-23T09:00:00
+2010-11-30T09:00:00
+2011-01-04T09:00:00
+2011-01-11T09:00:00
+2011-01-18T09:00:00
+2011-01-25T09:00:00
+2011-03-01T09:00:00
+2011-03-08T09:00:00
+2011-03-15T09:00:00
+2011-03-22T09:00:00
+2011-03-29T09:00:00
+2011-05-03T09:00:00
+2011-05-10T09:00:00
+2011-05-17T09:00:00
+2011-05-24T09:00:00
+2011-05-31T09:00:00
+2011-07-05T09:00:00
+2011-07-12T09:00:00
+2011-07-19T09:00:00
+2011-07-26T09:00:00
+2011-09-06T09:00:00
+2011-09-13T09:00:00
+2011-09-20T09:00:00
+2011-09-27T09:00:00
+2011-11-01T09:00:00
+2011-11-08T09:00:00
+2011-11-15T09:00:00
+2011-11-22T09:00:00
+2011-11-29T09:00:00
+2012-01-03T09:00:00
+2012-01-10T09:00:00
+2012-01-17T09:00:00
+2012-01-24T09:00:00
+2012-01-31T09:00:00
+2012-03-06T09:00:00
+2012-03-13T09:00:00
+2012-03-20T09:00:00
+2012-03-27T09:00:00
+2012-05-01T09:00:00
+2012-05-08T09:00:00
+2012-05-15T09:00:00
+2012-05-22T09:00:00
+2012-05-29T09:00:00
+2012-07-03T09:00:00
+2012-07-10T09:00:00
+2012-07-17T09:00:00
+2012-07-24T09:00:00
+2012-07-31T09:00:00
+2012-09-04T09:00:00
+2012-09-11T09:00:00
+2012-09-18T09:00:00
+2012-09-25T09:00:00
+2012-11-06T09:00:00
+2012-11-13T09:00:00
+2012-11-20T09:00:00
+2012-11-27T09:00:00
+2013-01-01T09:00:00
+2013-01-08T09:00:00
+2013-01-15T09:00:00
+2013-01-22T09:00:00
+2013-01-29T09:00:00
+2013-03-05T09:00:00
+2013-03-12T09:00:00
+2013-03-19T09:00:00
+2013-03-26T09:00:00
+2013-05-07T09:00:00
+2013-05-14T09:00:00
+2013-05-21T09:00:00
+2013-05-28T09:00:00
+2013-07-02T09:00:00
+2013-07-09T09:00:00
+2013-07-16T09:00:00
+2013-07-23T09:00:00
+2013-07-30T09:00:00
+2013-09-03T09:00:00
+2013-09-10T09:00:00
+2013-09-17T09:00:00
+2013-09-24T09:00:00
+2013-11-05T09:00:00
+2013-11-12T09:00:00
+2013-11-19T09:00:00
+2013-11-26T09:00:00
+2014-01-07T09:00:00
+2014-01-14T09:00:00
+2014-01-21T09:00:00
+2014-01-28T09:00:00
+2014-03-04T09:00:00
+2014-03-11T09:00:00
+2014-03-18T09:00:00
+2014-03-25T09:00:00
+2014-05-06T09:00:00
+2014-05-13T09:00:00
+2014-05-20T09:00:00
+2014-05-27T09:00:00
+2014-07-01T09:00:00
+2014-07-08T09:00:00
+2014-07-15T09:00:00
+2014-07-22T09:00:00
+2014-07-29T09:00:00
+2014-09-02T09:00:00
+2014-09-09T09:00:00
+2014-09-16T09:00:00
+2014-09-23T09:00:00
+2014-09-30T09:00:00
+2014-11-04T09:00:00
+2014-11-11T09:00:00
+2014-11-18T09:00:00
+2014-11-25T09:00:00
+2015-01-06T09:00:00
+2015-01-13T09:00:00
+2015-01-20T09:00:00
+2015-01-27T09:00:00
+2015-03-03T09:00:00
+2015-03-10T09:00:00
+2015-03-17T09:00:00
+2015-03-24T09:00:00
+2015-03-31T09:00:00
+2015-05-05T09:00:00
+2015-05-12T09:00:00
+2015-05-19T09:00:00
+2015-05-26T09:00:00
+2015-07-07T09:00:00
+2015-07-14T09:00:00
+2015-07-21T09:00:00
+2015-07-28T09:00:00
+2015-09-01T09:00:00
+2015-09-08T09:00:00
+2015-09-15T09:00:00
+2015-09-22T09:00:00
+2015-09-29T09:00:00
+2015-11-03T09:00:00
+2015-11-10T09:00:00
+2015-11-17T09:00:00
+2015-11-24T09:00:00
+2016-01-05T09:00:00
+2016-01-12T09:00:00
+2016-01-19T09:00:00
+2016-01-26T09:00:00
+2016-03-01T09:00:00
+2016-03-08T09:00:00
+2016-03-15T09:00:00
+2016-03-22T09:00:00
+2016-03-29T09:00:00
+2016-05-03T09:00:00
+2016-05-10T09:00:00
+2016-05-17T09:00:00
+2016-05-24T09:00:00
+2016-05-31T09:00:00
+2016-07-05T09:00:00
+2016-07-12T09:00:00
+2016-07-19T09:00:00
+2016-07-26T09:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase22.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase22.ics.prev.ref
new file mode 100644
index 00000000..1a24d495
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase22.ics.prev.ref
@@ -0,0 +1,351 @@
+2010-11-30T09:00:00
+2010-11-23T09:00:00
+2010-11-16T09:00:00
+2010-11-09T09:00:00
+2010-11-02T09:00:00
+2010-09-28T09:00:00
+2010-09-21T09:00:00
+2010-09-14T09:00:00
+2010-09-07T09:00:00
+2010-07-27T09:00:00
+2010-07-20T09:00:00
+2010-07-13T09:00:00
+2010-07-06T09:00:00
+2010-05-25T09:00:00
+2010-05-18T09:00:00
+2010-05-11T09:00:00
+2010-05-04T09:00:00
+2010-03-30T09:00:00
+2010-03-23T09:00:00
+2010-03-16T09:00:00
+2010-03-09T09:00:00
+2010-03-02T09:00:00
+2010-01-26T09:00:00
+2010-01-19T09:00:00
+2010-01-12T09:00:00
+2010-01-05T09:00:00
+2009-11-24T09:00:00
+2009-11-17T09:00:00
+2009-11-10T09:00:00
+2009-11-03T09:00:00
+2009-09-29T09:00:00
+2009-09-22T09:00:00
+2009-09-15T09:00:00
+2009-09-08T09:00:00
+2009-09-01T09:00:00
+2009-07-28T09:00:00
+2009-07-21T09:00:00
+2009-07-14T09:00:00
+2009-07-07T09:00:00
+2009-05-26T09:00:00
+2009-05-19T09:00:00
+2009-05-12T09:00:00
+2009-05-05T09:00:00
+2009-03-31T09:00:00
+2009-03-24T09:00:00
+2009-03-17T09:00:00
+2009-03-10T09:00:00
+2009-03-03T09:00:00
+2009-01-27T09:00:00
+2009-01-20T09:00:00
+2009-01-13T09:00:00
+2009-01-06T09:00:00
+2008-11-25T09:00:00
+2008-11-18T09:00:00
+2008-11-11T09:00:00
+2008-11-04T09:00:00
+2008-09-30T09:00:00
+2008-09-23T09:00:00
+2008-09-16T09:00:00
+2008-09-09T09:00:00
+2008-09-02T09:00:00
+2008-07-29T09:00:00
+2008-07-22T09:00:00
+2008-07-15T09:00:00
+2008-07-08T09:00:00
+2008-07-01T09:00:00
+2008-05-27T09:00:00
+2008-05-20T09:00:00
+2008-05-13T09:00:00
+2008-05-06T09:00:00
+2008-03-25T09:00:00
+2008-03-18T09:00:00
+2008-03-11T09:00:00
+2008-03-04T09:00:00
+2008-01-29T09:00:00
+2008-01-22T09:00:00
+2008-01-15T09:00:00
+2008-01-08T09:00:00
+2008-01-01T09:00:00
+2007-11-27T09:00:00
+2007-11-20T09:00:00
+2007-11-13T09:00:00
+2007-11-06T09:00:00
+2007-09-25T09:00:00
+2007-09-18T09:00:00
+2007-09-11T09:00:00
+2007-09-04T09:00:00
+2007-07-31T09:00:00
+2007-07-24T09:00:00
+2007-07-17T09:00:00
+2007-07-10T09:00:00
+2007-07-03T09:00:00
+2007-05-29T09:00:00
+2007-05-22T09:00:00
+2007-05-15T09:00:00
+2007-05-08T09:00:00
+2007-05-01T09:00:00
+2007-03-27T09:00:00
+2007-03-20T09:00:00
+2007-03-13T09:00:00
+2007-03-06T09:00:00
+2007-01-30T09:00:00
+2007-01-23T09:00:00
+2007-01-16T09:00:00
+2007-01-09T09:00:00
+2007-01-02T09:00:00
+2006-11-28T09:00:00
+2006-11-21T09:00:00
+2006-11-14T09:00:00
+2006-11-07T09:00:00
+2006-09-26T09:00:00
+2006-09-19T09:00:00
+2006-09-12T09:00:00
+2006-09-05T09:00:00
+2006-07-25T09:00:00
+2006-07-18T09:00:00
+2006-07-11T09:00:00
+2006-07-04T09:00:00
+2006-05-30T09:00:00
+2006-05-23T09:00:00
+2006-05-16T09:00:00
+2006-05-09T09:00:00
+2006-05-02T09:00:00
+2006-03-28T09:00:00
+2006-03-21T09:00:00
+2006-03-14T09:00:00
+2006-03-07T09:00:00
+2006-01-31T09:00:00
+2006-01-24T09:00:00
+2006-01-17T09:00:00
+2006-01-10T09:00:00
+2006-01-03T09:00:00
+2005-11-29T09:00:00
+2005-11-22T09:00:00
+2005-11-15T09:00:00
+2005-11-08T09:00:00
+2005-11-01T09:00:00
+2005-09-27T09:00:00
+2005-09-20T09:00:00
+2005-09-13T09:00:00
+2005-09-06T09:00:00
+2005-07-26T09:00:00
+2005-07-19T09:00:00
+2005-07-12T09:00:00
+2005-07-05T09:00:00
+2005-05-31T09:00:00
+2005-05-24T09:00:00
+2005-05-17T09:00:00
+2005-05-10T09:00:00
+2005-05-03T09:00:00
+2005-03-29T09:00:00
+2005-03-22T09:00:00
+2005-03-15T09:00:00
+2005-03-08T09:00:00
+2005-03-01T09:00:00
+2005-01-25T09:00:00
+2005-01-18T09:00:00
+2005-01-11T09:00:00
+2005-01-04T09:00:00
+2004-11-30T09:00:00
+2004-11-23T09:00:00
+2004-11-16T09:00:00
+2004-11-09T09:00:00
+2004-11-02T09:00:00
+2004-09-28T09:00:00
+2004-09-21T09:00:00
+2004-09-14T09:00:00
+2004-09-07T09:00:00
+2004-07-27T09:00:00
+2004-07-20T09:00:00
+2004-07-13T09:00:00
+2004-07-06T09:00:00
+2004-05-25T09:00:00
+2004-05-18T09:00:00
+2004-05-11T09:00:00
+2004-05-04T09:00:00
+2004-03-30T09:00:00
+2004-03-23T09:00:00
+2004-03-16T09:00:00
+2004-03-09T09:00:00
+2004-03-02T09:00:00
+2004-01-27T09:00:00
+2004-01-20T09:00:00
+2004-01-13T09:00:00
+2004-01-06T09:00:00
+2003-11-25T09:00:00
+2003-11-18T09:00:00
+2003-11-11T09:00:00
+2003-11-04T09:00:00
+2003-09-30T09:00:00
+2003-09-23T09:00:00
+2003-09-16T09:00:00
+2003-09-09T09:00:00
+2003-09-02T09:00:00
+2003-07-29T09:00:00
+2003-07-22T09:00:00
+2003-07-15T09:00:00
+2003-07-08T09:00:00
+2003-07-01T09:00:00
+2003-05-27T09:00:00
+2003-05-20T09:00:00
+2003-05-13T09:00:00
+2003-05-06T09:00:00
+2003-03-25T09:00:00
+2003-03-18T09:00:00
+2003-03-11T09:00:00
+2003-03-04T09:00:00
+2003-01-28T09:00:00
+2003-01-21T09:00:00
+2003-01-14T09:00:00
+2003-01-07T09:00:00
+2002-11-26T09:00:00
+2002-11-19T09:00:00
+2002-11-12T09:00:00
+2002-11-05T09:00:00
+2002-09-24T09:00:00
+2002-09-17T09:00:00
+2002-09-10T09:00:00
+2002-09-03T09:00:00
+2002-07-30T09:00:00
+2002-07-23T09:00:00
+2002-07-16T09:00:00
+2002-07-09T09:00:00
+2002-07-02T09:00:00
+2002-05-28T09:00:00
+2002-05-21T09:00:00
+2002-05-14T09:00:00
+2002-05-07T09:00:00
+2002-03-26T09:00:00
+2002-03-19T09:00:00
+2002-03-12T09:00:00
+2002-03-05T09:00:00
+2002-01-29T09:00:00
+2002-01-22T09:00:00
+2002-01-15T09:00:00
+2002-01-08T09:00:00
+2002-01-01T09:00:00
+2001-11-27T09:00:00
+2001-11-20T09:00:00
+2001-11-13T09:00:00
+2001-11-06T09:00:00
+2001-09-25T09:00:00
+2001-09-18T09:00:00
+2001-09-11T09:00:00
+2001-09-04T09:00:00
+2001-07-31T09:00:00
+2001-07-24T09:00:00
+2001-07-17T09:00:00
+2001-07-10T09:00:00
+2001-07-03T09:00:00
+2001-05-29T09:00:00
+2001-05-22T09:00:00
+2001-05-15T09:00:00
+2001-05-08T09:00:00
+2001-05-01T09:00:00
+2001-03-27T09:00:00
+2001-03-20T09:00:00
+2001-03-13T09:00:00
+2001-03-06T09:00:00
+2001-01-30T09:00:00
+2001-01-23T09:00:00
+2001-01-16T09:00:00
+2001-01-09T09:00:00
+2001-01-02T09:00:00
+2000-11-28T09:00:00
+2000-11-21T09:00:00
+2000-11-14T09:00:00
+2000-11-07T09:00:00
+2000-09-26T09:00:00
+2000-09-19T09:00:00
+2000-09-12T09:00:00
+2000-09-05T09:00:00
+2000-07-25T09:00:00
+2000-07-18T09:00:00
+2000-07-11T09:00:00
+2000-07-04T09:00:00
+2000-05-30T09:00:00
+2000-05-23T09:00:00
+2000-05-16T09:00:00
+2000-05-09T09:00:00
+2000-05-02T09:00:00
+2000-03-28T09:00:00
+2000-03-21T09:00:00
+2000-03-14T09:00:00
+2000-03-07T09:00:00
+2000-01-25T09:00:00
+2000-01-18T09:00:00
+2000-01-11T09:00:00
+2000-01-04T09:00:00
+1999-11-30T09:00:00
+1999-11-23T09:00:00
+1999-11-16T09:00:00
+1999-11-09T09:00:00
+1999-11-02T09:00:00
+1999-09-28T09:00:00
+1999-09-21T09:00:00
+1999-09-14T09:00:00
+1999-09-07T09:00:00
+1999-07-27T09:00:00
+1999-07-20T09:00:00
+1999-07-13T09:00:00
+1999-07-06T09:00:00
+1999-05-25T09:00:00
+1999-05-18T09:00:00
+1999-05-11T09:00:00
+1999-05-04T09:00:00
+1999-03-30T09:00:00
+1999-03-23T09:00:00
+1999-03-16T09:00:00
+1999-03-09T09:00:00
+1999-03-02T09:00:00
+1999-01-26T09:00:00
+1999-01-19T09:00:00
+1999-01-12T09:00:00
+1999-01-05T09:00:00
+1998-11-24T09:00:00
+1998-11-17T09:00:00
+1998-11-10T09:00:00
+1998-11-03T09:00:00
+1998-09-29T09:00:00
+1998-09-22T09:00:00
+1998-09-15T09:00:00
+1998-09-08T09:00:00
+1998-09-01T09:00:00
+1998-07-28T09:00:00
+1998-07-21T09:00:00
+1998-07-14T09:00:00
+1998-07-07T09:00:00
+1998-05-26T09:00:00
+1998-05-19T09:00:00
+1998-05-12T09:00:00
+1998-05-05T09:00:00
+1998-03-31T09:00:00
+1998-03-24T09:00:00
+1998-03-17T09:00:00
+1998-03-10T09:00:00
+1998-03-03T09:00:00
+1998-01-27T09:00:00
+1998-01-20T09:00:00
+1998-01-13T09:00:00
+1998-01-06T09:00:00
+1997-11-25T09:00:00
+1997-11-18T09:00:00
+1997-11-11T09:00:00
+1997-11-04T09:00:00
+1997-09-30T09:00:00
+1997-09-23T09:00:00
+1997-09-16T09:00:00
+1997-09-09T09:00:00
+1997-09-02T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase22.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase22.ics.recurson.ref
new file mode 100644
index 00000000..a555c2bc
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase22.ics.recurson.ref
@@ -0,0 +1,350 @@
+1997-09-02
+1997-09-09
+1997-09-16
+1997-09-23
+1997-09-30
+1997-11-04
+1997-11-11
+1997-11-18
+1997-11-25
+1998-01-06
+1998-01-13
+1998-01-20
+1998-01-27
+1998-03-03
+1998-03-10
+1998-03-17
+1998-03-24
+1998-03-31
+1998-05-05
+1998-05-12
+1998-05-19
+1998-05-26
+1998-07-07
+1998-07-14
+1998-07-21
+1998-07-28
+1998-09-01
+1998-09-08
+1998-09-15
+1998-09-22
+1998-09-29
+1998-11-03
+1998-11-10
+1998-11-17
+1998-11-24
+1999-01-05
+1999-01-12
+1999-01-19
+1999-01-26
+1999-03-02
+1999-03-09
+1999-03-16
+1999-03-23
+1999-03-30
+1999-05-04
+1999-05-11
+1999-05-18
+1999-05-25
+1999-07-06
+1999-07-13
+1999-07-20
+1999-07-27
+1999-09-07
+1999-09-14
+1999-09-21
+1999-09-28
+1999-11-02
+1999-11-09
+1999-11-16
+1999-11-23
+1999-11-30
+2000-01-04
+2000-01-11
+2000-01-18
+2000-01-25
+2000-03-07
+2000-03-14
+2000-03-21
+2000-03-28
+2000-05-02
+2000-05-09
+2000-05-16
+2000-05-23
+2000-05-30
+2000-07-04
+2000-07-11
+2000-07-18
+2000-07-25
+2000-09-05
+2000-09-12
+2000-09-19
+2000-09-26
+2000-11-07
+2000-11-14
+2000-11-21
+2000-11-28
+2001-01-02
+2001-01-09
+2001-01-16
+2001-01-23
+2001-01-30
+2001-03-06
+2001-03-13
+2001-03-20
+2001-03-27
+2001-05-01
+2001-05-08
+2001-05-15
+2001-05-22
+2001-05-29
+2001-07-03
+2001-07-10
+2001-07-17
+2001-07-24
+2001-07-31
+2001-09-04
+2001-09-11
+2001-09-18
+2001-09-25
+2001-11-06
+2001-11-13
+2001-11-20
+2001-11-27
+2002-01-01
+2002-01-08
+2002-01-15
+2002-01-22
+2002-01-29
+2002-03-05
+2002-03-12
+2002-03-19
+2002-03-26
+2002-05-07
+2002-05-14
+2002-05-21
+2002-05-28
+2002-07-02
+2002-07-09
+2002-07-16
+2002-07-23
+2002-07-30
+2002-09-03
+2002-09-10
+2002-09-17
+2002-09-24
+2002-11-05
+2002-11-12
+2002-11-19
+2002-11-26
+2003-01-07
+2003-01-14
+2003-01-21
+2003-01-28
+2003-03-04
+2003-03-11
+2003-03-18
+2003-03-25
+2003-05-06
+2003-05-13
+2003-05-20
+2003-05-27
+2003-07-01
+2003-07-08
+2003-07-15
+2003-07-22
+2003-07-29
+2003-09-02
+2003-09-09
+2003-09-16
+2003-09-23
+2003-09-30
+2003-11-04
+2003-11-11
+2003-11-18
+2003-11-25
+2004-01-06
+2004-01-13
+2004-01-20
+2004-01-27
+2004-03-02
+2004-03-09
+2004-03-16
+2004-03-23
+2004-03-30
+2004-05-04
+2004-05-11
+2004-05-18
+2004-05-25
+2004-07-06
+2004-07-13
+2004-07-20
+2004-07-27
+2004-09-07
+2004-09-14
+2004-09-21
+2004-09-28
+2004-11-02
+2004-11-09
+2004-11-16
+2004-11-23
+2004-11-30
+2005-01-04
+2005-01-11
+2005-01-18
+2005-01-25
+2005-03-01
+2005-03-08
+2005-03-15
+2005-03-22
+2005-03-29
+2005-05-03
+2005-05-10
+2005-05-17
+2005-05-24
+2005-05-31
+2005-07-05
+2005-07-12
+2005-07-19
+2005-07-26
+2005-09-06
+2005-09-13
+2005-09-20
+2005-09-27
+2005-11-01
+2005-11-08
+2005-11-15
+2005-11-22
+2005-11-29
+2006-01-03
+2006-01-10
+2006-01-17
+2006-01-24
+2006-01-31
+2006-03-07
+2006-03-14
+2006-03-21
+2006-03-28
+2006-05-02
+2006-05-09
+2006-05-16
+2006-05-23
+2006-05-30
+2006-07-04
+2006-07-11
+2006-07-18
+2006-07-25
+2006-09-05
+2006-09-12
+2006-09-19
+2006-09-26
+2006-11-07
+2006-11-14
+2006-11-21
+2006-11-28
+2007-01-02
+2007-01-09
+2007-01-16
+2007-01-23
+2007-01-30
+2007-03-06
+2007-03-13
+2007-03-20
+2007-03-27
+2007-05-01
+2007-05-08
+2007-05-15
+2007-05-22
+2007-05-29
+2007-07-03
+2007-07-10
+2007-07-17
+2007-07-24
+2007-07-31
+2007-09-04
+2007-09-11
+2007-09-18
+2007-09-25
+2007-11-06
+2007-11-13
+2007-11-20
+2007-11-27
+2008-01-01
+2008-01-08
+2008-01-15
+2008-01-22
+2008-01-29
+2008-03-04
+2008-03-11
+2008-03-18
+2008-03-25
+2008-05-06
+2008-05-13
+2008-05-20
+2008-05-27
+2008-07-01
+2008-07-08
+2008-07-15
+2008-07-22
+2008-07-29
+2008-09-02
+2008-09-09
+2008-09-16
+2008-09-23
+2008-09-30
+2008-11-04
+2008-11-11
+2008-11-18
+2008-11-25
+2009-01-06
+2009-01-13
+2009-01-20
+2009-01-27
+2009-03-03
+2009-03-10
+2009-03-17
+2009-03-24
+2009-03-31
+2009-05-05
+2009-05-12
+2009-05-19
+2009-05-26
+2009-07-07
+2009-07-14
+2009-07-21
+2009-07-28
+2009-09-01
+2009-09-08
+2009-09-15
+2009-09-22
+2009-09-29
+2009-11-03
+2009-11-10
+2009-11-17
+2009-11-24
+2010-01-05
+2010-01-12
+2010-01-19
+2010-01-26
+2010-03-02
+2010-03-09
+2010-03-16
+2010-03-23
+2010-03-30
+2010-05-04
+2010-05-11
+2010-05-18
+2010-05-25
+2010-07-06
+2010-07-13
+2010-07-20
+2010-07-27
+2010-09-07
+2010-09-14
+2010-09-21
+2010-09-28
+2010-11-02
+2010-11-09
+2010-11-16
+2010-11-23
+2010-11-30
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase23.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase23.ics
new file mode 100644
index 00000000..ad190e29
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase23.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Yearly in June and July for 10 occurrences:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970610T090000
+RRULE:FREQ=YEARLY;COUNT=10;BYMONTH=6,7
+SUMMARY:RExample21
+UID:RExample21
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase23.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase23.ics.comp34.ref
new file mode 100644
index 00000000..24c13944
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase23.ics.comp34.ref
@@ -0,0 +1,11 @@
+1997-06-10T09:00:00
+1997-07-10T09:00:00
+1998-06-10T09:00:00
+1998-07-10T09:00:00
+1999-06-10T09:00:00
+1999-07-10T09:00:00
+2000-06-10T09:00:00
+2000-07-10T09:00:00
+2001-06-10T09:00:00
+2001-07-10T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase23.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase23.ics.next.ref
new file mode 100644
index 00000000..24c13944
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase23.ics.next.ref
@@ -0,0 +1,11 @@
+1997-06-10T09:00:00
+1997-07-10T09:00:00
+1998-06-10T09:00:00
+1998-07-10T09:00:00
+1999-06-10T09:00:00
+1999-07-10T09:00:00
+2000-06-10T09:00:00
+2000-07-10T09:00:00
+2001-06-10T09:00:00
+2001-07-10T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase23.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase23.ics.prev.ref
new file mode 100644
index 00000000..94e45c14
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase23.ics.prev.ref
@@ -0,0 +1,11 @@
+2001-07-10T09:00:00
+2001-06-10T09:00:00
+2000-07-10T09:00:00
+2000-06-10T09:00:00
+1999-07-10T09:00:00
+1999-06-10T09:00:00
+1998-07-10T09:00:00
+1998-06-10T09:00:00
+1997-07-10T09:00:00
+1997-06-10T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase23.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase23.ics.recurson.ref
new file mode 100644
index 00000000..d3ec1d31
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase23.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-06-10
+1997-07-10
+1998-06-10
+1998-07-10
+1999-06-10
+1999-07-10
+2000-06-10
+2000-07-10
+2001-06-10
+2001-07-10
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase24.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase24.ics
new file mode 100644
index 00000000..df8c3a90
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase24.ics
@@ -0,0 +1,34 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Every other year on January\, February\, and March for 10 occu
+ rrences:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970310T090000
+RRULE:FREQ=YEARLY;COUNT=10;INTERVAL=2;BYMONTH=1,2,3
+SUMMARY:RExample22
+UID:RExample22
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase24.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase24.ics.comp34.ref
new file mode 100644
index 00000000..0c8e031f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase24.ics.comp34.ref
@@ -0,0 +1,11 @@
+1997-03-10T09:00:00
+1999-01-10T09:00:00
+1999-02-10T09:00:00
+1999-03-10T09:00:00
+2001-01-10T09:00:00
+2001-02-10T09:00:00
+2001-03-10T09:00:00
+2003-01-10T09:00:00
+2003-02-10T09:00:00
+2003-03-10T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase24.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase24.ics.next.ref
new file mode 100644
index 00000000..0c8e031f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase24.ics.next.ref
@@ -0,0 +1,11 @@
+1997-03-10T09:00:00
+1999-01-10T09:00:00
+1999-02-10T09:00:00
+1999-03-10T09:00:00
+2001-01-10T09:00:00
+2001-02-10T09:00:00
+2001-03-10T09:00:00
+2003-01-10T09:00:00
+2003-02-10T09:00:00
+2003-03-10T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase24.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase24.ics.prev.ref
new file mode 100644
index 00000000..343c318b
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase24.ics.prev.ref
@@ -0,0 +1,11 @@
+2003-03-10T09:00:00
+2003-02-10T09:00:00
+2003-01-10T09:00:00
+2001-03-10T09:00:00
+2001-02-10T09:00:00
+2001-01-10T09:00:00
+1999-03-10T09:00:00
+1999-02-10T09:00:00
+1999-01-10T09:00:00
+1997-03-10T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase24.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase24.ics.recurson.ref
new file mode 100644
index 00000000..da74b930
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase24.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-03-10
+1999-01-10
+1999-02-10
+1999-03-10
+2001-01-10
+2001-02-10
+2001-03-10
+2003-01-10
+2003-02-10
+2003-03-10
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase25.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase25.ics
new file mode 100644
index 00000000..8f34fc67
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase25.ics
@@ -0,0 +1,34 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Every 3rd year on the 1st\, 100th and 200th day for 10 occurre
+ nces:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970101T090000
+RRULE:FREQ=YEARLY;COUNT=10;INTERVAL=3;BYYEARDAY=1,100,200
+SUMMARY:RExample23
+UID:RExample23
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase25.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase25.ics.comp34.ref
new file mode 100644
index 00000000..bd0eab23
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase25.ics.comp34.ref
@@ -0,0 +1,11 @@
+1997-01-01T09:00:00
+1997-04-10T09:00:00
+1997-07-19T09:00:00
+2000-01-01T09:00:00
+2000-04-09T09:00:00
+2000-07-18T09:00:00
+2003-01-01T09:00:00
+2003-04-10T09:00:00
+2003-07-19T09:00:00
+2006-01-01T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase25.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase25.ics.next.ref
new file mode 100644
index 00000000..bd0eab23
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase25.ics.next.ref
@@ -0,0 +1,11 @@
+1997-01-01T09:00:00
+1997-04-10T09:00:00
+1997-07-19T09:00:00
+2000-01-01T09:00:00
+2000-04-09T09:00:00
+2000-07-18T09:00:00
+2003-01-01T09:00:00
+2003-04-10T09:00:00
+2003-07-19T09:00:00
+2006-01-01T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase25.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase25.ics.prev.ref
new file mode 100644
index 00000000..e2ddb5ee
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase25.ics.prev.ref
@@ -0,0 +1,11 @@
+2006-01-01T09:00:00
+2003-07-19T09:00:00
+2003-04-10T09:00:00
+2003-01-01T09:00:00
+2000-07-18T09:00:00
+2000-04-09T09:00:00
+2000-01-01T09:00:00
+1997-07-19T09:00:00
+1997-04-10T09:00:00
+1997-01-01T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase25.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase25.ics.recurson.ref
new file mode 100644
index 00000000..a4826d50
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase25.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-01-01
+1997-04-10
+1997-07-19
+2000-01-01
+2000-04-09
+2000-07-18
+2003-01-01
+2003-04-10
+2003-07-19
+2006-01-01
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase26.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase26.ics
new file mode 100644
index 00000000..ce8936c4
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase26.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Every 20th Monday of the year\, forever:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970519T090000
+RRULE:FREQ=YEARLY;BYDAY=20MO
+SUMMARY:RExample24
+UID:RExample24
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase26.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase26.ics.comp34.ref
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase26.ics.comp34.ref
@@ -0,0 +1 @@
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase26.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase26.ics.next.ref
new file mode 100644
index 00000000..e94c8193
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase26.ics.next.ref
@@ -0,0 +1,500 @@
+1997-05-19T09:00:00
+1998-05-18T09:00:00
+1999-05-17T09:00:00
+2000-05-15T09:00:00
+2001-05-14T09:00:00
+2002-05-20T09:00:00
+2003-05-19T09:00:00
+2004-05-17T09:00:00
+2005-05-16T09:00:00
+2006-05-15T09:00:00
+2007-05-14T09:00:00
+2008-05-19T09:00:00
+2009-05-18T09:00:00
+2010-05-17T09:00:00
+2011-05-16T09:00:00
+2012-05-14T09:00:00
+2013-05-20T09:00:00
+2014-05-19T09:00:00
+2015-05-18T09:00:00
+2016-05-16T09:00:00
+2017-05-15T09:00:00
+2018-05-14T09:00:00
+2019-05-20T09:00:00
+2020-05-18T09:00:00
+2021-05-17T09:00:00
+2022-05-16T09:00:00
+2023-05-15T09:00:00
+2024-05-13T09:00:00
+2025-05-19T09:00:00
+2026-05-18T09:00:00
+2027-05-17T09:00:00
+2028-05-15T09:00:00
+2029-05-14T09:00:00
+2030-05-20T09:00:00
+2031-05-19T09:00:00
+2032-05-17T09:00:00
+2033-05-16T09:00:00
+2034-05-15T09:00:00
+2035-05-14T09:00:00
+2036-05-19T09:00:00
+2037-05-18T09:00:00
+2038-05-17T09:00:00
+2039-05-16T09:00:00
+2040-05-14T09:00:00
+2041-05-20T09:00:00
+2042-05-19T09:00:00
+2043-05-18T09:00:00
+2044-05-16T09:00:00
+2045-05-15T09:00:00
+2046-05-14T09:00:00
+2047-05-20T09:00:00
+2048-05-18T09:00:00
+2049-05-17T09:00:00
+2050-05-16T09:00:00
+2051-05-15T09:00:00
+2052-05-13T09:00:00
+2053-05-19T09:00:00
+2054-05-18T09:00:00
+2055-05-17T09:00:00
+2056-05-15T09:00:00
+2057-05-14T09:00:00
+2058-05-20T09:00:00
+2059-05-19T09:00:00
+2060-05-17T09:00:00
+2061-05-16T09:00:00
+2062-05-15T09:00:00
+2063-05-14T09:00:00
+2064-05-19T09:00:00
+2065-05-18T09:00:00
+2066-05-17T09:00:00
+2067-05-16T09:00:00
+2068-05-14T09:00:00
+2069-05-20T09:00:00
+2070-05-19T09:00:00
+2071-05-18T09:00:00
+2072-05-16T09:00:00
+2073-05-15T09:00:00
+2074-05-14T09:00:00
+2075-05-20T09:00:00
+2076-05-18T09:00:00
+2077-05-17T09:00:00
+2078-05-16T09:00:00
+2079-05-15T09:00:00
+2080-05-13T09:00:00
+2081-05-19T09:00:00
+2082-05-18T09:00:00
+2083-05-17T09:00:00
+2084-05-15T09:00:00
+2085-05-14T09:00:00
+2086-05-20T09:00:00
+2087-05-19T09:00:00
+2088-05-17T09:00:00
+2089-05-16T09:00:00
+2090-05-15T09:00:00
+2091-05-14T09:00:00
+2092-05-19T09:00:00
+2093-05-18T09:00:00
+2094-05-17T09:00:00
+2095-05-16T09:00:00
+2096-05-14T09:00:00
+2097-05-20T09:00:00
+2098-05-19T09:00:00
+2099-05-18T09:00:00
+2100-05-17T09:00:00
+2101-05-16T09:00:00
+2102-05-15T09:00:00
+2103-05-14T09:00:00
+2104-05-19T09:00:00
+2105-05-18T09:00:00
+2106-05-17T09:00:00
+2107-05-16T09:00:00
+2108-05-14T09:00:00
+2109-05-20T09:00:00
+2110-05-19T09:00:00
+2111-05-18T09:00:00
+2112-05-16T09:00:00
+2113-05-15T09:00:00
+2114-05-14T09:00:00
+2115-05-20T09:00:00
+2116-05-18T09:00:00
+2117-05-17T09:00:00
+2118-05-16T09:00:00
+2119-05-15T09:00:00
+2120-05-13T09:00:00
+2121-05-19T09:00:00
+2122-05-18T09:00:00
+2123-05-17T09:00:00
+2124-05-15T09:00:00
+2125-05-14T09:00:00
+2126-05-20T09:00:00
+2127-05-19T09:00:00
+2128-05-17T09:00:00
+2129-05-16T09:00:00
+2130-05-15T09:00:00
+2131-05-14T09:00:00
+2132-05-19T09:00:00
+2133-05-18T09:00:00
+2134-05-17T09:00:00
+2135-05-16T09:00:00
+2136-05-14T09:00:00
+2137-05-20T09:00:00
+2138-05-19T09:00:00
+2139-05-18T09:00:00
+2140-05-16T09:00:00
+2141-05-15T09:00:00
+2142-05-14T09:00:00
+2143-05-20T09:00:00
+2144-05-18T09:00:00
+2145-05-17T09:00:00
+2146-05-16T09:00:00
+2147-05-15T09:00:00
+2148-05-13T09:00:00
+2149-05-19T09:00:00
+2150-05-18T09:00:00
+2151-05-17T09:00:00
+2152-05-15T09:00:00
+2153-05-14T09:00:00
+2154-05-20T09:00:00
+2155-05-19T09:00:00
+2156-05-17T09:00:00
+2157-05-16T09:00:00
+2158-05-15T09:00:00
+2159-05-14T09:00:00
+2160-05-19T09:00:00
+2161-05-18T09:00:00
+2162-05-17T09:00:00
+2163-05-16T09:00:00
+2164-05-14T09:00:00
+2165-05-20T09:00:00
+2166-05-19T09:00:00
+2167-05-18T09:00:00
+2168-05-16T09:00:00
+2169-05-15T09:00:00
+2170-05-14T09:00:00
+2171-05-20T09:00:00
+2172-05-18T09:00:00
+2173-05-17T09:00:00
+2174-05-16T09:00:00
+2175-05-15T09:00:00
+2176-05-13T09:00:00
+2177-05-19T09:00:00
+2178-05-18T09:00:00
+2179-05-17T09:00:00
+2180-05-15T09:00:00
+2181-05-14T09:00:00
+2182-05-20T09:00:00
+2183-05-19T09:00:00
+2184-05-17T09:00:00
+2185-05-16T09:00:00
+2186-05-15T09:00:00
+2187-05-14T09:00:00
+2188-05-19T09:00:00
+2189-05-18T09:00:00
+2190-05-17T09:00:00
+2191-05-16T09:00:00
+2192-05-14T09:00:00
+2193-05-20T09:00:00
+2194-05-19T09:00:00
+2195-05-18T09:00:00
+2196-05-16T09:00:00
+2197-05-15T09:00:00
+2198-05-14T09:00:00
+2199-05-20T09:00:00
+2200-05-19T09:00:00
+2201-05-18T09:00:00
+2202-05-17T09:00:00
+2203-05-16T09:00:00
+2204-05-14T09:00:00
+2205-05-20T09:00:00
+2206-05-19T09:00:00
+2207-05-18T09:00:00
+2208-05-16T09:00:00
+2209-05-15T09:00:00
+2210-05-14T09:00:00
+2211-05-20T09:00:00
+2212-05-18T09:00:00
+2213-05-17T09:00:00
+2214-05-16T09:00:00
+2215-05-15T09:00:00
+2216-05-13T09:00:00
+2217-05-19T09:00:00
+2218-05-18T09:00:00
+2219-05-17T09:00:00
+2220-05-15T09:00:00
+2221-05-14T09:00:00
+2222-05-20T09:00:00
+2223-05-19T09:00:00
+2224-05-17T09:00:00
+2225-05-16T09:00:00
+2226-05-15T09:00:00
+2227-05-14T09:00:00
+2228-05-19T09:00:00
+2229-05-18T09:00:00
+2230-05-17T09:00:00
+2231-05-16T09:00:00
+2232-05-14T09:00:00
+2233-05-20T09:00:00
+2234-05-19T09:00:00
+2235-05-18T09:00:00
+2236-05-16T09:00:00
+2237-05-15T09:00:00
+2238-05-14T09:00:00
+2239-05-20T09:00:00
+2240-05-18T09:00:00
+2241-05-17T09:00:00
+2242-05-16T09:00:00
+2243-05-15T09:00:00
+2244-05-13T09:00:00
+2245-05-19T09:00:00
+2246-05-18T09:00:00
+2247-05-17T09:00:00
+2248-05-15T09:00:00
+2249-05-14T09:00:00
+2250-05-20T09:00:00
+2251-05-19T09:00:00
+2252-05-17T09:00:00
+2253-05-16T09:00:00
+2254-05-15T09:00:00
+2255-05-14T09:00:00
+2256-05-19T09:00:00
+2257-05-18T09:00:00
+2258-05-17T09:00:00
+2259-05-16T09:00:00
+2260-05-14T09:00:00
+2261-05-20T09:00:00
+2262-05-19T09:00:00
+2263-05-18T09:00:00
+2264-05-16T09:00:00
+2265-05-15T09:00:00
+2266-05-14T09:00:00
+2267-05-20T09:00:00
+2268-05-18T09:00:00
+2269-05-17T09:00:00
+2270-05-16T09:00:00
+2271-05-15T09:00:00
+2272-05-13T09:00:00
+2273-05-19T09:00:00
+2274-05-18T09:00:00
+2275-05-17T09:00:00
+2276-05-15T09:00:00
+2277-05-14T09:00:00
+2278-05-20T09:00:00
+2279-05-19T09:00:00
+2280-05-17T09:00:00
+2281-05-16T09:00:00
+2282-05-15T09:00:00
+2283-05-14T09:00:00
+2284-05-19T09:00:00
+2285-05-18T09:00:00
+2286-05-17T09:00:00
+2287-05-16T09:00:00
+2288-05-14T09:00:00
+2289-05-20T09:00:00
+2290-05-19T09:00:00
+2291-05-18T09:00:00
+2292-05-16T09:00:00
+2293-05-15T09:00:00
+2294-05-14T09:00:00
+2295-05-20T09:00:00
+2296-05-18T09:00:00
+2297-05-17T09:00:00
+2298-05-16T09:00:00
+2299-05-15T09:00:00
+2300-05-14T09:00:00
+2301-05-20T09:00:00
+2302-05-19T09:00:00
+2303-05-18T09:00:00
+2304-05-16T09:00:00
+2305-05-15T09:00:00
+2306-05-14T09:00:00
+2307-05-20T09:00:00
+2308-05-18T09:00:00
+2309-05-17T09:00:00
+2310-05-16T09:00:00
+2311-05-15T09:00:00
+2312-05-13T09:00:00
+2313-05-19T09:00:00
+2314-05-18T09:00:00
+2315-05-17T09:00:00
+2316-05-15T09:00:00
+2317-05-14T09:00:00
+2318-05-20T09:00:00
+2319-05-19T09:00:00
+2320-05-17T09:00:00
+2321-05-16T09:00:00
+2322-05-15T09:00:00
+2323-05-14T09:00:00
+2324-05-19T09:00:00
+2325-05-18T09:00:00
+2326-05-17T09:00:00
+2327-05-16T09:00:00
+2328-05-14T09:00:00
+2329-05-20T09:00:00
+2330-05-19T09:00:00
+2331-05-18T09:00:00
+2332-05-16T09:00:00
+2333-05-15T09:00:00
+2334-05-14T09:00:00
+2335-05-20T09:00:00
+2336-05-18T09:00:00
+2337-05-17T09:00:00
+2338-05-16T09:00:00
+2339-05-15T09:00:00
+2340-05-13T09:00:00
+2341-05-19T09:00:00
+2342-05-18T09:00:00
+2343-05-17T09:00:00
+2344-05-15T09:00:00
+2345-05-14T09:00:00
+2346-05-20T09:00:00
+2347-05-19T09:00:00
+2348-05-17T09:00:00
+2349-05-16T09:00:00
+2350-05-15T09:00:00
+2351-05-14T09:00:00
+2352-05-19T09:00:00
+2353-05-18T09:00:00
+2354-05-17T09:00:00
+2355-05-16T09:00:00
+2356-05-14T09:00:00
+2357-05-20T09:00:00
+2358-05-19T09:00:00
+2359-05-18T09:00:00
+2360-05-16T09:00:00
+2361-05-15T09:00:00
+2362-05-14T09:00:00
+2363-05-20T09:00:00
+2364-05-18T09:00:00
+2365-05-17T09:00:00
+2366-05-16T09:00:00
+2367-05-15T09:00:00
+2368-05-13T09:00:00
+2369-05-19T09:00:00
+2370-05-18T09:00:00
+2371-05-17T09:00:00
+2372-05-15T09:00:00
+2373-05-14T09:00:00
+2374-05-20T09:00:00
+2375-05-19T09:00:00
+2376-05-17T09:00:00
+2377-05-16T09:00:00
+2378-05-15T09:00:00
+2379-05-14T09:00:00
+2380-05-19T09:00:00
+2381-05-18T09:00:00
+2382-05-17T09:00:00
+2383-05-16T09:00:00
+2384-05-14T09:00:00
+2385-05-20T09:00:00
+2386-05-19T09:00:00
+2387-05-18T09:00:00
+2388-05-16T09:00:00
+2389-05-15T09:00:00
+2390-05-14T09:00:00
+2391-05-20T09:00:00
+2392-05-18T09:00:00
+2393-05-17T09:00:00
+2394-05-16T09:00:00
+2395-05-15T09:00:00
+2396-05-13T09:00:00
+2397-05-19T09:00:00
+2398-05-18T09:00:00
+2399-05-17T09:00:00
+2400-05-15T09:00:00
+2401-05-14T09:00:00
+2402-05-20T09:00:00
+2403-05-19T09:00:00
+2404-05-17T09:00:00
+2405-05-16T09:00:00
+2406-05-15T09:00:00
+2407-05-14T09:00:00
+2408-05-19T09:00:00
+2409-05-18T09:00:00
+2410-05-17T09:00:00
+2411-05-16T09:00:00
+2412-05-14T09:00:00
+2413-05-20T09:00:00
+2414-05-19T09:00:00
+2415-05-18T09:00:00
+2416-05-16T09:00:00
+2417-05-15T09:00:00
+2418-05-14T09:00:00
+2419-05-20T09:00:00
+2420-05-18T09:00:00
+2421-05-17T09:00:00
+2422-05-16T09:00:00
+2423-05-15T09:00:00
+2424-05-13T09:00:00
+2425-05-19T09:00:00
+2426-05-18T09:00:00
+2427-05-17T09:00:00
+2428-05-15T09:00:00
+2429-05-14T09:00:00
+2430-05-20T09:00:00
+2431-05-19T09:00:00
+2432-05-17T09:00:00
+2433-05-16T09:00:00
+2434-05-15T09:00:00
+2435-05-14T09:00:00
+2436-05-19T09:00:00
+2437-05-18T09:00:00
+2438-05-17T09:00:00
+2439-05-16T09:00:00
+2440-05-14T09:00:00
+2441-05-20T09:00:00
+2442-05-19T09:00:00
+2443-05-18T09:00:00
+2444-05-16T09:00:00
+2445-05-15T09:00:00
+2446-05-14T09:00:00
+2447-05-20T09:00:00
+2448-05-18T09:00:00
+2449-05-17T09:00:00
+2450-05-16T09:00:00
+2451-05-15T09:00:00
+2452-05-13T09:00:00
+2453-05-19T09:00:00
+2454-05-18T09:00:00
+2455-05-17T09:00:00
+2456-05-15T09:00:00
+2457-05-14T09:00:00
+2458-05-20T09:00:00
+2459-05-19T09:00:00
+2460-05-17T09:00:00
+2461-05-16T09:00:00
+2462-05-15T09:00:00
+2463-05-14T09:00:00
+2464-05-19T09:00:00
+2465-05-18T09:00:00
+2466-05-17T09:00:00
+2467-05-16T09:00:00
+2468-05-14T09:00:00
+2469-05-20T09:00:00
+2470-05-19T09:00:00
+2471-05-18T09:00:00
+2472-05-16T09:00:00
+2473-05-15T09:00:00
+2474-05-14T09:00:00
+2475-05-20T09:00:00
+2476-05-18T09:00:00
+2477-05-17T09:00:00
+2478-05-16T09:00:00
+2479-05-15T09:00:00
+2480-05-13T09:00:00
+2481-05-19T09:00:00
+2482-05-18T09:00:00
+2483-05-17T09:00:00
+2484-05-15T09:00:00
+2485-05-14T09:00:00
+2486-05-20T09:00:00
+2487-05-19T09:00:00
+2488-05-17T09:00:00
+2489-05-16T09:00:00
+2490-05-15T09:00:00
+2491-05-14T09:00:00
+2492-05-19T09:00:00
+2493-05-18T09:00:00
+2494-05-17T09:00:00
+2495-05-16T09:00:00
+2496-05-14T09:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase26.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase26.ics.prev.ref
new file mode 100644
index 00000000..7ccf02df
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase26.ics.prev.ref
@@ -0,0 +1,15 @@
+2010-05-17T09:00:00
+2009-05-18T09:00:00
+2008-05-19T09:00:00
+2007-05-14T09:00:00
+2006-05-15T09:00:00
+2005-05-16T09:00:00
+2004-05-17T09:00:00
+2003-05-19T09:00:00
+2002-05-20T09:00:00
+2001-05-14T09:00:00
+2000-05-15T09:00:00
+1999-05-17T09:00:00
+1998-05-18T09:00:00
+1997-05-19T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase26.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase26.ics.recurson.ref
new file mode 100644
index 00000000..ee931583
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase26.ics.recurson.ref
@@ -0,0 +1,14 @@
+1997-05-19
+1998-05-18
+1999-05-17
+2000-05-15
+2001-05-14
+2002-05-20
+2003-05-19
+2004-05-17
+2005-05-16
+2006-05-15
+2007-05-14
+2008-05-19
+2009-05-18
+2010-05-17
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase27.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase27.ics
new file mode 100644
index 00000000..c374a3fb
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase27.ics
@@ -0,0 +1,34 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Monday of week number 20 (where the default start of the week
+ isMonday)\, forever:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970512T090000
+RRULE:FREQ=YEARLY;BYDAY=MO;BYWEEKNO=20
+SUMMARY:RExample25
+UID:RExample25
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase27.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase27.ics.comp34.ref
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase27.ics.comp34.ref
@@ -0,0 +1 @@
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase27.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase27.ics.next.ref
new file mode 100644
index 00000000..7dbcd82a
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase27.ics.next.ref
@@ -0,0 +1,500 @@
+1997-05-12T09:00:00
+1998-05-11T09:00:00
+1999-05-17T09:00:00
+2000-05-15T09:00:00
+2001-05-14T09:00:00
+2002-05-13T09:00:00
+2003-05-12T09:00:00
+2004-05-10T09:00:00
+2005-05-16T09:00:00
+2006-05-15T09:00:00
+2007-05-14T09:00:00
+2008-05-12T09:00:00
+2009-05-11T09:00:00
+2010-05-17T09:00:00
+2011-05-16T09:00:00
+2012-05-14T09:00:00
+2013-05-13T09:00:00
+2014-05-12T09:00:00
+2015-05-11T09:00:00
+2016-05-16T09:00:00
+2017-05-15T09:00:00
+2018-05-14T09:00:00
+2019-05-13T09:00:00
+2020-05-11T09:00:00
+2021-05-17T09:00:00
+2022-05-16T09:00:00
+2023-05-15T09:00:00
+2024-05-13T09:00:00
+2025-05-12T09:00:00
+2026-05-11T09:00:00
+2027-05-17T09:00:00
+2028-05-15T09:00:00
+2029-05-14T09:00:00
+2030-05-13T09:00:00
+2031-05-12T09:00:00
+2032-05-10T09:00:00
+2033-05-16T09:00:00
+2034-05-15T09:00:00
+2035-05-14T09:00:00
+2036-05-12T09:00:00
+2037-05-11T09:00:00
+2038-05-17T09:00:00
+2039-05-16T09:00:00
+2040-05-14T09:00:00
+2041-05-13T09:00:00
+2042-05-12T09:00:00
+2043-05-11T09:00:00
+2044-05-16T09:00:00
+2045-05-15T09:00:00
+2046-05-14T09:00:00
+2047-05-13T09:00:00
+2048-05-11T09:00:00
+2049-05-17T09:00:00
+2050-05-16T09:00:00
+2051-05-15T09:00:00
+2052-05-13T09:00:00
+2053-05-12T09:00:00
+2054-05-11T09:00:00
+2055-05-17T09:00:00
+2056-05-15T09:00:00
+2057-05-14T09:00:00
+2058-05-13T09:00:00
+2059-05-12T09:00:00
+2060-05-10T09:00:00
+2061-05-16T09:00:00
+2062-05-15T09:00:00
+2063-05-14T09:00:00
+2064-05-12T09:00:00
+2065-05-11T09:00:00
+2066-05-17T09:00:00
+2067-05-16T09:00:00
+2068-05-14T09:00:00
+2069-05-13T09:00:00
+2070-05-12T09:00:00
+2071-05-11T09:00:00
+2072-05-16T09:00:00
+2073-05-15T09:00:00
+2074-05-14T09:00:00
+2075-05-13T09:00:00
+2076-05-11T09:00:00
+2077-05-17T09:00:00
+2078-05-16T09:00:00
+2079-05-15T09:00:00
+2080-05-13T09:00:00
+2081-05-12T09:00:00
+2082-05-11T09:00:00
+2083-05-17T09:00:00
+2084-05-15T09:00:00
+2085-05-14T09:00:00
+2086-05-13T09:00:00
+2087-05-12T09:00:00
+2088-05-10T09:00:00
+2089-05-16T09:00:00
+2090-05-15T09:00:00
+2091-05-14T09:00:00
+2092-05-12T09:00:00
+2093-05-11T09:00:00
+2094-05-17T09:00:00
+2095-05-16T09:00:00
+2096-05-14T09:00:00
+2097-05-13T09:00:00
+2098-05-12T09:00:00
+2099-05-11T09:00:00
+2100-05-17T09:00:00
+2101-05-16T09:00:00
+2102-05-15T09:00:00
+2103-05-14T09:00:00
+2104-05-12T09:00:00
+2105-05-11T09:00:00
+2106-05-17T09:00:00
+2107-05-16T09:00:00
+2108-05-14T09:00:00
+2109-05-13T09:00:00
+2110-05-12T09:00:00
+2111-05-11T09:00:00
+2112-05-16T09:00:00
+2113-05-15T09:00:00
+2114-05-14T09:00:00
+2115-05-13T09:00:00
+2116-05-11T09:00:00
+2117-05-17T09:00:00
+2118-05-16T09:00:00
+2119-05-15T09:00:00
+2120-05-13T09:00:00
+2121-05-12T09:00:00
+2122-05-11T09:00:00
+2123-05-17T09:00:00
+2124-05-15T09:00:00
+2125-05-14T09:00:00
+2126-05-13T09:00:00
+2127-05-12T09:00:00
+2128-05-10T09:00:00
+2129-05-16T09:00:00
+2130-05-15T09:00:00
+2131-05-14T09:00:00
+2132-05-12T09:00:00
+2133-05-11T09:00:00
+2134-05-17T09:00:00
+2135-05-16T09:00:00
+2136-05-14T09:00:00
+2137-05-13T09:00:00
+2138-05-12T09:00:00
+2139-05-11T09:00:00
+2140-05-16T09:00:00
+2141-05-15T09:00:00
+2142-05-14T09:00:00
+2143-05-13T09:00:00
+2144-05-11T09:00:00
+2145-05-17T09:00:00
+2146-05-16T09:00:00
+2147-05-15T09:00:00
+2148-05-13T09:00:00
+2149-05-12T09:00:00
+2150-05-11T09:00:00
+2151-05-17T09:00:00
+2152-05-15T09:00:00
+2153-05-14T09:00:00
+2154-05-13T09:00:00
+2155-05-12T09:00:00
+2156-05-10T09:00:00
+2157-05-16T09:00:00
+2158-05-15T09:00:00
+2159-05-14T09:00:00
+2160-05-12T09:00:00
+2161-05-11T09:00:00
+2162-05-17T09:00:00
+2163-05-16T09:00:00
+2164-05-14T09:00:00
+2165-05-13T09:00:00
+2166-05-12T09:00:00
+2167-05-11T09:00:00
+2168-05-16T09:00:00
+2169-05-15T09:00:00
+2170-05-14T09:00:00
+2171-05-13T09:00:00
+2172-05-11T09:00:00
+2173-05-17T09:00:00
+2174-05-16T09:00:00
+2175-05-15T09:00:00
+2176-05-13T09:00:00
+2177-05-12T09:00:00
+2178-05-11T09:00:00
+2179-05-17T09:00:00
+2180-05-15T09:00:00
+2181-05-14T09:00:00
+2182-05-13T09:00:00
+2183-05-12T09:00:00
+2184-05-10T09:00:00
+2185-05-16T09:00:00
+2186-05-15T09:00:00
+2187-05-14T09:00:00
+2188-05-12T09:00:00
+2189-05-11T09:00:00
+2190-05-17T09:00:00
+2191-05-16T09:00:00
+2192-05-14T09:00:00
+2193-05-13T09:00:00
+2194-05-12T09:00:00
+2195-05-11T09:00:00
+2196-05-16T09:00:00
+2197-05-15T09:00:00
+2198-05-14T09:00:00
+2199-05-13T09:00:00
+2200-05-12T09:00:00
+2201-05-11T09:00:00
+2202-05-17T09:00:00
+2203-05-16T09:00:00
+2204-05-14T09:00:00
+2205-05-13T09:00:00
+2206-05-12T09:00:00
+2207-05-11T09:00:00
+2208-05-16T09:00:00
+2209-05-15T09:00:00
+2210-05-14T09:00:00
+2211-05-13T09:00:00
+2212-05-11T09:00:00
+2213-05-17T09:00:00
+2214-05-16T09:00:00
+2215-05-15T09:00:00
+2216-05-13T09:00:00
+2217-05-12T09:00:00
+2218-05-11T09:00:00
+2219-05-17T09:00:00
+2220-05-15T09:00:00
+2221-05-14T09:00:00
+2222-05-13T09:00:00
+2223-05-12T09:00:00
+2224-05-10T09:00:00
+2225-05-16T09:00:00
+2226-05-15T09:00:00
+2227-05-14T09:00:00
+2228-05-12T09:00:00
+2229-05-11T09:00:00
+2230-05-17T09:00:00
+2231-05-16T09:00:00
+2232-05-14T09:00:00
+2233-05-13T09:00:00
+2234-05-12T09:00:00
+2235-05-11T09:00:00
+2236-05-16T09:00:00
+2237-05-15T09:00:00
+2238-05-14T09:00:00
+2239-05-13T09:00:00
+2240-05-11T09:00:00
+2241-05-17T09:00:00
+2242-05-16T09:00:00
+2243-05-15T09:00:00
+2244-05-13T09:00:00
+2245-05-12T09:00:00
+2246-05-11T09:00:00
+2247-05-17T09:00:00
+2248-05-15T09:00:00
+2249-05-14T09:00:00
+2250-05-13T09:00:00
+2251-05-12T09:00:00
+2252-05-10T09:00:00
+2253-05-16T09:00:00
+2254-05-15T09:00:00
+2255-05-14T09:00:00
+2256-05-12T09:00:00
+2257-05-11T09:00:00
+2258-05-17T09:00:00
+2259-05-16T09:00:00
+2260-05-14T09:00:00
+2261-05-13T09:00:00
+2262-05-12T09:00:00
+2263-05-11T09:00:00
+2264-05-16T09:00:00
+2265-05-15T09:00:00
+2266-05-14T09:00:00
+2267-05-13T09:00:00
+2268-05-11T09:00:00
+2269-05-17T09:00:00
+2270-05-16T09:00:00
+2271-05-15T09:00:00
+2272-05-13T09:00:00
+2273-05-12T09:00:00
+2274-05-11T09:00:00
+2275-05-17T09:00:00
+2276-05-15T09:00:00
+2277-05-14T09:00:00
+2278-05-13T09:00:00
+2279-05-12T09:00:00
+2280-05-10T09:00:00
+2281-05-16T09:00:00
+2282-05-15T09:00:00
+2283-05-14T09:00:00
+2284-05-12T09:00:00
+2285-05-11T09:00:00
+2286-05-17T09:00:00
+2287-05-16T09:00:00
+2288-05-14T09:00:00
+2289-05-13T09:00:00
+2290-05-12T09:00:00
+2291-05-11T09:00:00
+2292-05-16T09:00:00
+2293-05-15T09:00:00
+2294-05-14T09:00:00
+2295-05-13T09:00:00
+2296-05-11T09:00:00
+2297-05-17T09:00:00
+2298-05-16T09:00:00
+2299-05-15T09:00:00
+2300-05-14T09:00:00
+2301-05-13T09:00:00
+2302-05-12T09:00:00
+2303-05-11T09:00:00
+2304-05-16T09:00:00
+2305-05-15T09:00:00
+2306-05-14T09:00:00
+2307-05-13T09:00:00
+2308-05-11T09:00:00
+2309-05-17T09:00:00
+2310-05-16T09:00:00
+2311-05-15T09:00:00
+2312-05-13T09:00:00
+2313-05-12T09:00:00
+2314-05-11T09:00:00
+2315-05-17T09:00:00
+2316-05-15T09:00:00
+2317-05-14T09:00:00
+2318-05-13T09:00:00
+2319-05-12T09:00:00
+2320-05-10T09:00:00
+2321-05-16T09:00:00
+2322-05-15T09:00:00
+2323-05-14T09:00:00
+2324-05-12T09:00:00
+2325-05-11T09:00:00
+2326-05-17T09:00:00
+2327-05-16T09:00:00
+2328-05-14T09:00:00
+2329-05-13T09:00:00
+2330-05-12T09:00:00
+2331-05-11T09:00:00
+2332-05-16T09:00:00
+2333-05-15T09:00:00
+2334-05-14T09:00:00
+2335-05-13T09:00:00
+2336-05-11T09:00:00
+2337-05-17T09:00:00
+2338-05-16T09:00:00
+2339-05-15T09:00:00
+2340-05-13T09:00:00
+2341-05-12T09:00:00
+2342-05-11T09:00:00
+2343-05-17T09:00:00
+2344-05-15T09:00:00
+2345-05-14T09:00:00
+2346-05-13T09:00:00
+2347-05-12T09:00:00
+2348-05-10T09:00:00
+2349-05-16T09:00:00
+2350-05-15T09:00:00
+2351-05-14T09:00:00
+2352-05-12T09:00:00
+2353-05-11T09:00:00
+2354-05-17T09:00:00
+2355-05-16T09:00:00
+2356-05-14T09:00:00
+2357-05-13T09:00:00
+2358-05-12T09:00:00
+2359-05-11T09:00:00
+2360-05-16T09:00:00
+2361-05-15T09:00:00
+2362-05-14T09:00:00
+2363-05-13T09:00:00
+2364-05-11T09:00:00
+2365-05-17T09:00:00
+2366-05-16T09:00:00
+2367-05-15T09:00:00
+2368-05-13T09:00:00
+2369-05-12T09:00:00
+2370-05-11T09:00:00
+2371-05-17T09:00:00
+2372-05-15T09:00:00
+2373-05-14T09:00:00
+2374-05-13T09:00:00
+2375-05-12T09:00:00
+2376-05-10T09:00:00
+2377-05-16T09:00:00
+2378-05-15T09:00:00
+2379-05-14T09:00:00
+2380-05-12T09:00:00
+2381-05-11T09:00:00
+2382-05-17T09:00:00
+2383-05-16T09:00:00
+2384-05-14T09:00:00
+2385-05-13T09:00:00
+2386-05-12T09:00:00
+2387-05-11T09:00:00
+2388-05-16T09:00:00
+2389-05-15T09:00:00
+2390-05-14T09:00:00
+2391-05-13T09:00:00
+2392-05-11T09:00:00
+2393-05-17T09:00:00
+2394-05-16T09:00:00
+2395-05-15T09:00:00
+2396-05-13T09:00:00
+2397-05-12T09:00:00
+2398-05-11T09:00:00
+2399-05-17T09:00:00
+2400-05-15T09:00:00
+2401-05-14T09:00:00
+2402-05-13T09:00:00
+2403-05-12T09:00:00
+2404-05-10T09:00:00
+2405-05-16T09:00:00
+2406-05-15T09:00:00
+2407-05-14T09:00:00
+2408-05-12T09:00:00
+2409-05-11T09:00:00
+2410-05-17T09:00:00
+2411-05-16T09:00:00
+2412-05-14T09:00:00
+2413-05-13T09:00:00
+2414-05-12T09:00:00
+2415-05-11T09:00:00
+2416-05-16T09:00:00
+2417-05-15T09:00:00
+2418-05-14T09:00:00
+2419-05-13T09:00:00
+2420-05-11T09:00:00
+2421-05-17T09:00:00
+2422-05-16T09:00:00
+2423-05-15T09:00:00
+2424-05-13T09:00:00
+2425-05-12T09:00:00
+2426-05-11T09:00:00
+2427-05-17T09:00:00
+2428-05-15T09:00:00
+2429-05-14T09:00:00
+2430-05-13T09:00:00
+2431-05-12T09:00:00
+2432-05-10T09:00:00
+2433-05-16T09:00:00
+2434-05-15T09:00:00
+2435-05-14T09:00:00
+2436-05-12T09:00:00
+2437-05-11T09:00:00
+2438-05-17T09:00:00
+2439-05-16T09:00:00
+2440-05-14T09:00:00
+2441-05-13T09:00:00
+2442-05-12T09:00:00
+2443-05-11T09:00:00
+2444-05-16T09:00:00
+2445-05-15T09:00:00
+2446-05-14T09:00:00
+2447-05-13T09:00:00
+2448-05-11T09:00:00
+2449-05-17T09:00:00
+2450-05-16T09:00:00
+2451-05-15T09:00:00
+2452-05-13T09:00:00
+2453-05-12T09:00:00
+2454-05-11T09:00:00
+2455-05-17T09:00:00
+2456-05-15T09:00:00
+2457-05-14T09:00:00
+2458-05-13T09:00:00
+2459-05-12T09:00:00
+2460-05-10T09:00:00
+2461-05-16T09:00:00
+2462-05-15T09:00:00
+2463-05-14T09:00:00
+2464-05-12T09:00:00
+2465-05-11T09:00:00
+2466-05-17T09:00:00
+2467-05-16T09:00:00
+2468-05-14T09:00:00
+2469-05-13T09:00:00
+2470-05-12T09:00:00
+2471-05-11T09:00:00
+2472-05-16T09:00:00
+2473-05-15T09:00:00
+2474-05-14T09:00:00
+2475-05-13T09:00:00
+2476-05-11T09:00:00
+2477-05-17T09:00:00
+2478-05-16T09:00:00
+2479-05-15T09:00:00
+2480-05-13T09:00:00
+2481-05-12T09:00:00
+2482-05-11T09:00:00
+2483-05-17T09:00:00
+2484-05-15T09:00:00
+2485-05-14T09:00:00
+2486-05-13T09:00:00
+2487-05-12T09:00:00
+2488-05-10T09:00:00
+2489-05-16T09:00:00
+2490-05-15T09:00:00
+2491-05-14T09:00:00
+2492-05-12T09:00:00
+2493-05-11T09:00:00
+2494-05-17T09:00:00
+2495-05-16T09:00:00
+2496-05-14T09:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase27.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase27.ics.prev.ref
new file mode 100644
index 00000000..838e05ab
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase27.ics.prev.ref
@@ -0,0 +1,15 @@
+2010-05-17T09:00:00
+2009-05-11T09:00:00
+2008-05-12T09:00:00
+2007-05-14T09:00:00
+2006-05-15T09:00:00
+2005-05-16T09:00:00
+2004-05-10T09:00:00
+2003-05-12T09:00:00
+2002-05-13T09:00:00
+2001-05-14T09:00:00
+2000-05-15T09:00:00
+1999-05-17T09:00:00
+1998-05-11T09:00:00
+1997-05-12T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase27.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase27.ics.recurson.ref
new file mode 100644
index 00000000..de3e6bff
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase27.ics.recurson.ref
@@ -0,0 +1,14 @@
+1997-05-12
+1998-05-11
+1999-05-17
+2000-05-15
+2001-05-14
+2002-05-13
+2003-05-12
+2004-05-10
+2005-05-16
+2006-05-15
+2007-05-14
+2008-05-12
+2009-05-11
+2010-05-17
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase28.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase28.ics
new file mode 100644
index 00000000..e0d154d6
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase28.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Every Thursday in March\, forever:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970313T090000
+RRULE:FREQ=YEARLY;BYDAY=TH;BYMONTH=3
+SUMMARY:RExample26
+UID:RExample26
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase28.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase28.ics.comp34.ref
new file mode 100644
index 00000000..d987cd05
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase28.ics.comp34.ref
@@ -0,0 +1,2 @@
+1997-03-13T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase28.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase28.ics.next.ref
new file mode 100644
index 00000000..961d1583
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase28.ics.next.ref
@@ -0,0 +1,500 @@
+1997-03-13T09:00:00
+1997-03-20T09:00:00
+1997-03-27T09:00:00
+1998-03-05T09:00:00
+1998-03-12T09:00:00
+1998-03-19T09:00:00
+1998-03-26T09:00:00
+1999-03-04T09:00:00
+1999-03-11T09:00:00
+1999-03-18T09:00:00
+1999-03-25T09:00:00
+2000-03-02T09:00:00
+2000-03-09T09:00:00
+2000-03-16T09:00:00
+2000-03-23T09:00:00
+2000-03-30T09:00:00
+2001-03-01T09:00:00
+2001-03-08T09:00:00
+2001-03-15T09:00:00
+2001-03-22T09:00:00
+2001-03-29T09:00:00
+2002-03-07T09:00:00
+2002-03-14T09:00:00
+2002-03-21T09:00:00
+2002-03-28T09:00:00
+2003-03-06T09:00:00
+2003-03-13T09:00:00
+2003-03-20T09:00:00
+2003-03-27T09:00:00
+2004-03-04T09:00:00
+2004-03-11T09:00:00
+2004-03-18T09:00:00
+2004-03-25T09:00:00
+2005-03-03T09:00:00
+2005-03-10T09:00:00
+2005-03-17T09:00:00
+2005-03-24T09:00:00
+2005-03-31T09:00:00
+2006-03-02T09:00:00
+2006-03-09T09:00:00
+2006-03-16T09:00:00
+2006-03-23T09:00:00
+2006-03-30T09:00:00
+2007-03-01T09:00:00
+2007-03-08T09:00:00
+2007-03-15T09:00:00
+2007-03-22T09:00:00
+2007-03-29T09:00:00
+2008-03-06T09:00:00
+2008-03-13T09:00:00
+2008-03-20T09:00:00
+2008-03-27T09:00:00
+2009-03-05T09:00:00
+2009-03-12T09:00:00
+2009-03-19T09:00:00
+2009-03-26T09:00:00
+2010-03-04T09:00:00
+2010-03-11T09:00:00
+2010-03-18T09:00:00
+2010-03-25T09:00:00
+2011-03-03T09:00:00
+2011-03-10T09:00:00
+2011-03-17T09:00:00
+2011-03-24T09:00:00
+2011-03-31T09:00:00
+2012-03-01T09:00:00
+2012-03-08T09:00:00
+2012-03-15T09:00:00
+2012-03-22T09:00:00
+2012-03-29T09:00:00
+2013-03-07T09:00:00
+2013-03-14T09:00:00
+2013-03-21T09:00:00
+2013-03-28T09:00:00
+2014-03-06T09:00:00
+2014-03-13T09:00:00
+2014-03-20T09:00:00
+2014-03-27T09:00:00
+2015-03-05T09:00:00
+2015-03-12T09:00:00
+2015-03-19T09:00:00
+2015-03-26T09:00:00
+2016-03-03T09:00:00
+2016-03-10T09:00:00
+2016-03-17T09:00:00
+2016-03-24T09:00:00
+2016-03-31T09:00:00
+2017-03-02T09:00:00
+2017-03-09T09:00:00
+2017-03-16T09:00:00
+2017-03-23T09:00:00
+2017-03-30T09:00:00
+2018-03-01T09:00:00
+2018-03-08T09:00:00
+2018-03-15T09:00:00
+2018-03-22T09:00:00
+2018-03-29T09:00:00
+2019-03-07T09:00:00
+2019-03-14T09:00:00
+2019-03-21T09:00:00
+2019-03-28T09:00:00
+2020-03-05T09:00:00
+2020-03-12T09:00:00
+2020-03-19T09:00:00
+2020-03-26T09:00:00
+2021-03-04T09:00:00
+2021-03-11T09:00:00
+2021-03-18T09:00:00
+2021-03-25T09:00:00
+2022-03-03T09:00:00
+2022-03-10T09:00:00
+2022-03-17T09:00:00
+2022-03-24T09:00:00
+2022-03-31T09:00:00
+2023-03-02T09:00:00
+2023-03-09T09:00:00
+2023-03-16T09:00:00
+2023-03-23T09:00:00
+2023-03-30T09:00:00
+2024-03-07T09:00:00
+2024-03-14T09:00:00
+2024-03-21T09:00:00
+2024-03-28T09:00:00
+2025-03-06T09:00:00
+2025-03-13T09:00:00
+2025-03-20T09:00:00
+2025-03-27T09:00:00
+2026-03-05T09:00:00
+2026-03-12T09:00:00
+2026-03-19T09:00:00
+2026-03-26T09:00:00
+2027-03-04T09:00:00
+2027-03-11T09:00:00
+2027-03-18T09:00:00
+2027-03-25T09:00:00
+2028-03-02T09:00:00
+2028-03-09T09:00:00
+2028-03-16T09:00:00
+2028-03-23T09:00:00
+2028-03-30T09:00:00
+2029-03-01T09:00:00
+2029-03-08T09:00:00
+2029-03-15T09:00:00
+2029-03-22T09:00:00
+2029-03-29T09:00:00
+2030-03-07T09:00:00
+2030-03-14T09:00:00
+2030-03-21T09:00:00
+2030-03-28T09:00:00
+2031-03-06T09:00:00
+2031-03-13T09:00:00
+2031-03-20T09:00:00
+2031-03-27T09:00:00
+2032-03-04T09:00:00
+2032-03-11T09:00:00
+2032-03-18T09:00:00
+2032-03-25T09:00:00
+2033-03-03T09:00:00
+2033-03-10T09:00:00
+2033-03-17T09:00:00
+2033-03-24T09:00:00
+2033-03-31T09:00:00
+2034-03-02T09:00:00
+2034-03-09T09:00:00
+2034-03-16T09:00:00
+2034-03-23T09:00:00
+2034-03-30T09:00:00
+2035-03-01T09:00:00
+2035-03-08T09:00:00
+2035-03-15T09:00:00
+2035-03-22T09:00:00
+2035-03-29T09:00:00
+2036-03-06T09:00:00
+2036-03-13T09:00:00
+2036-03-20T09:00:00
+2036-03-27T09:00:00
+2037-03-05T09:00:00
+2037-03-12T09:00:00
+2037-03-19T09:00:00
+2037-03-26T09:00:00
+2038-03-04T09:00:00
+2038-03-11T09:00:00
+2038-03-18T09:00:00
+2038-03-25T09:00:00
+2039-03-03T09:00:00
+2039-03-10T09:00:00
+2039-03-17T09:00:00
+2039-03-24T09:00:00
+2039-03-31T09:00:00
+2040-03-01T09:00:00
+2040-03-08T09:00:00
+2040-03-15T09:00:00
+2040-03-22T09:00:00
+2040-03-29T09:00:00
+2041-03-07T09:00:00
+2041-03-14T09:00:00
+2041-03-21T09:00:00
+2041-03-28T09:00:00
+2042-03-06T09:00:00
+2042-03-13T09:00:00
+2042-03-20T09:00:00
+2042-03-27T09:00:00
+2043-03-05T09:00:00
+2043-03-12T09:00:00
+2043-03-19T09:00:00
+2043-03-26T09:00:00
+2044-03-03T09:00:00
+2044-03-10T09:00:00
+2044-03-17T09:00:00
+2044-03-24T09:00:00
+2044-03-31T09:00:00
+2045-03-02T09:00:00
+2045-03-09T09:00:00
+2045-03-16T09:00:00
+2045-03-23T09:00:00
+2045-03-30T09:00:00
+2046-03-01T09:00:00
+2046-03-08T09:00:00
+2046-03-15T09:00:00
+2046-03-22T09:00:00
+2046-03-29T09:00:00
+2047-03-07T09:00:00
+2047-03-14T09:00:00
+2047-03-21T09:00:00
+2047-03-28T09:00:00
+2048-03-05T09:00:00
+2048-03-12T09:00:00
+2048-03-19T09:00:00
+2048-03-26T09:00:00
+2049-03-04T09:00:00
+2049-03-11T09:00:00
+2049-03-18T09:00:00
+2049-03-25T09:00:00
+2050-03-03T09:00:00
+2050-03-10T09:00:00
+2050-03-17T09:00:00
+2050-03-24T09:00:00
+2050-03-31T09:00:00
+2051-03-02T09:00:00
+2051-03-09T09:00:00
+2051-03-16T09:00:00
+2051-03-23T09:00:00
+2051-03-30T09:00:00
+2052-03-07T09:00:00
+2052-03-14T09:00:00
+2052-03-21T09:00:00
+2052-03-28T09:00:00
+2053-03-06T09:00:00
+2053-03-13T09:00:00
+2053-03-20T09:00:00
+2053-03-27T09:00:00
+2054-03-05T09:00:00
+2054-03-12T09:00:00
+2054-03-19T09:00:00
+2054-03-26T09:00:00
+2055-03-04T09:00:00
+2055-03-11T09:00:00
+2055-03-18T09:00:00
+2055-03-25T09:00:00
+2056-03-02T09:00:00
+2056-03-09T09:00:00
+2056-03-16T09:00:00
+2056-03-23T09:00:00
+2056-03-30T09:00:00
+2057-03-01T09:00:00
+2057-03-08T09:00:00
+2057-03-15T09:00:00
+2057-03-22T09:00:00
+2057-03-29T09:00:00
+2058-03-07T09:00:00
+2058-03-14T09:00:00
+2058-03-21T09:00:00
+2058-03-28T09:00:00
+2059-03-06T09:00:00
+2059-03-13T09:00:00
+2059-03-20T09:00:00
+2059-03-27T09:00:00
+2060-03-04T09:00:00
+2060-03-11T09:00:00
+2060-03-18T09:00:00
+2060-03-25T09:00:00
+2061-03-03T09:00:00
+2061-03-10T09:00:00
+2061-03-17T09:00:00
+2061-03-24T09:00:00
+2061-03-31T09:00:00
+2062-03-02T09:00:00
+2062-03-09T09:00:00
+2062-03-16T09:00:00
+2062-03-23T09:00:00
+2062-03-30T09:00:00
+2063-03-01T09:00:00
+2063-03-08T09:00:00
+2063-03-15T09:00:00
+2063-03-22T09:00:00
+2063-03-29T09:00:00
+2064-03-06T09:00:00
+2064-03-13T09:00:00
+2064-03-20T09:00:00
+2064-03-27T09:00:00
+2065-03-05T09:00:00
+2065-03-12T09:00:00
+2065-03-19T09:00:00
+2065-03-26T09:00:00
+2066-03-04T09:00:00
+2066-03-11T09:00:00
+2066-03-18T09:00:00
+2066-03-25T09:00:00
+2067-03-03T09:00:00
+2067-03-10T09:00:00
+2067-03-17T09:00:00
+2067-03-24T09:00:00
+2067-03-31T09:00:00
+2068-03-01T09:00:00
+2068-03-08T09:00:00
+2068-03-15T09:00:00
+2068-03-22T09:00:00
+2068-03-29T09:00:00
+2069-03-07T09:00:00
+2069-03-14T09:00:00
+2069-03-21T09:00:00
+2069-03-28T09:00:00
+2070-03-06T09:00:00
+2070-03-13T09:00:00
+2070-03-20T09:00:00
+2070-03-27T09:00:00
+2071-03-05T09:00:00
+2071-03-12T09:00:00
+2071-03-19T09:00:00
+2071-03-26T09:00:00
+2072-03-03T09:00:00
+2072-03-10T09:00:00
+2072-03-17T09:00:00
+2072-03-24T09:00:00
+2072-03-31T09:00:00
+2073-03-02T09:00:00
+2073-03-09T09:00:00
+2073-03-16T09:00:00
+2073-03-23T09:00:00
+2073-03-30T09:00:00
+2074-03-01T09:00:00
+2074-03-08T09:00:00
+2074-03-15T09:00:00
+2074-03-22T09:00:00
+2074-03-29T09:00:00
+2075-03-07T09:00:00
+2075-03-14T09:00:00
+2075-03-21T09:00:00
+2075-03-28T09:00:00
+2076-03-05T09:00:00
+2076-03-12T09:00:00
+2076-03-19T09:00:00
+2076-03-26T09:00:00
+2077-03-04T09:00:00
+2077-03-11T09:00:00
+2077-03-18T09:00:00
+2077-03-25T09:00:00
+2078-03-03T09:00:00
+2078-03-10T09:00:00
+2078-03-17T09:00:00
+2078-03-24T09:00:00
+2078-03-31T09:00:00
+2079-03-02T09:00:00
+2079-03-09T09:00:00
+2079-03-16T09:00:00
+2079-03-23T09:00:00
+2079-03-30T09:00:00
+2080-03-07T09:00:00
+2080-03-14T09:00:00
+2080-03-21T09:00:00
+2080-03-28T09:00:00
+2081-03-06T09:00:00
+2081-03-13T09:00:00
+2081-03-20T09:00:00
+2081-03-27T09:00:00
+2082-03-05T09:00:00
+2082-03-12T09:00:00
+2082-03-19T09:00:00
+2082-03-26T09:00:00
+2083-03-04T09:00:00
+2083-03-11T09:00:00
+2083-03-18T09:00:00
+2083-03-25T09:00:00
+2084-03-02T09:00:00
+2084-03-09T09:00:00
+2084-03-16T09:00:00
+2084-03-23T09:00:00
+2084-03-30T09:00:00
+2085-03-01T09:00:00
+2085-03-08T09:00:00
+2085-03-15T09:00:00
+2085-03-22T09:00:00
+2085-03-29T09:00:00
+2086-03-07T09:00:00
+2086-03-14T09:00:00
+2086-03-21T09:00:00
+2086-03-28T09:00:00
+2087-03-06T09:00:00
+2087-03-13T09:00:00
+2087-03-20T09:00:00
+2087-03-27T09:00:00
+2088-03-04T09:00:00
+2088-03-11T09:00:00
+2088-03-18T09:00:00
+2088-03-25T09:00:00
+2089-03-03T09:00:00
+2089-03-10T09:00:00
+2089-03-17T09:00:00
+2089-03-24T09:00:00
+2089-03-31T09:00:00
+2090-03-02T09:00:00
+2090-03-09T09:00:00
+2090-03-16T09:00:00
+2090-03-23T09:00:00
+2090-03-30T09:00:00
+2091-03-01T09:00:00
+2091-03-08T09:00:00
+2091-03-15T09:00:00
+2091-03-22T09:00:00
+2091-03-29T09:00:00
+2092-03-06T09:00:00
+2092-03-13T09:00:00
+2092-03-20T09:00:00
+2092-03-27T09:00:00
+2093-03-05T09:00:00
+2093-03-12T09:00:00
+2093-03-19T09:00:00
+2093-03-26T09:00:00
+2094-03-04T09:00:00
+2094-03-11T09:00:00
+2094-03-18T09:00:00
+2094-03-25T09:00:00
+2095-03-03T09:00:00
+2095-03-10T09:00:00
+2095-03-17T09:00:00
+2095-03-24T09:00:00
+2095-03-31T09:00:00
+2096-03-01T09:00:00
+2096-03-08T09:00:00
+2096-03-15T09:00:00
+2096-03-22T09:00:00
+2096-03-29T09:00:00
+2097-03-07T09:00:00
+2097-03-14T09:00:00
+2097-03-21T09:00:00
+2097-03-28T09:00:00
+2098-03-06T09:00:00
+2098-03-13T09:00:00
+2098-03-20T09:00:00
+2098-03-27T09:00:00
+2099-03-05T09:00:00
+2099-03-12T09:00:00
+2099-03-19T09:00:00
+2099-03-26T09:00:00
+2100-03-04T09:00:00
+2100-03-11T09:00:00
+2100-03-18T09:00:00
+2100-03-25T09:00:00
+2101-03-03T09:00:00
+2101-03-10T09:00:00
+2101-03-17T09:00:00
+2101-03-24T09:00:00
+2101-03-31T09:00:00
+2102-03-02T09:00:00
+2102-03-09T09:00:00
+2102-03-16T09:00:00
+2102-03-23T09:00:00
+2102-03-30T09:00:00
+2103-03-01T09:00:00
+2103-03-08T09:00:00
+2103-03-15T09:00:00
+2103-03-22T09:00:00
+2103-03-29T09:00:00
+2104-03-06T09:00:00
+2104-03-13T09:00:00
+2104-03-20T09:00:00
+2104-03-27T09:00:00
+2105-03-05T09:00:00
+2105-03-12T09:00:00
+2105-03-19T09:00:00
+2105-03-26T09:00:00
+2106-03-04T09:00:00
+2106-03-11T09:00:00
+2106-03-18T09:00:00
+2106-03-25T09:00:00
+2107-03-03T09:00:00
+2107-03-10T09:00:00
+2107-03-17T09:00:00
+2107-03-24T09:00:00
+2107-03-31T09:00:00
+2108-03-01T09:00:00
+2108-03-08T09:00:00
+2108-03-15T09:00:00
+2108-03-22T09:00:00
+2108-03-29T09:00:00
+2109-03-07T09:00:00
+2109-03-14T09:00:00
+2109-03-21T09:00:00
+2109-03-28T09:00:00
+2110-03-06T09:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase28.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase28.ics.prev.ref
new file mode 100644
index 00000000..ebe06c09
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase28.ics.prev.ref
@@ -0,0 +1,61 @@
+2010-03-25T09:00:00
+2010-03-18T09:00:00
+2010-03-11T09:00:00
+2010-03-04T09:00:00
+2009-03-26T09:00:00
+2009-03-19T09:00:00
+2009-03-12T09:00:00
+2009-03-05T09:00:00
+2008-03-27T09:00:00
+2008-03-20T09:00:00
+2008-03-13T09:00:00
+2008-03-06T09:00:00
+2007-03-29T09:00:00
+2007-03-22T09:00:00
+2007-03-15T09:00:00
+2007-03-08T09:00:00
+2007-03-01T09:00:00
+2006-03-30T09:00:00
+2006-03-23T09:00:00
+2006-03-16T09:00:00
+2006-03-09T09:00:00
+2006-03-02T09:00:00
+2005-03-31T09:00:00
+2005-03-24T09:00:00
+2005-03-17T09:00:00
+2005-03-10T09:00:00
+2005-03-03T09:00:00
+2004-03-25T09:00:00
+2004-03-18T09:00:00
+2004-03-11T09:00:00
+2004-03-04T09:00:00
+2003-03-27T09:00:00
+2003-03-20T09:00:00
+2003-03-13T09:00:00
+2003-03-06T09:00:00
+2002-03-28T09:00:00
+2002-03-21T09:00:00
+2002-03-14T09:00:00
+2002-03-07T09:00:00
+2001-03-29T09:00:00
+2001-03-22T09:00:00
+2001-03-15T09:00:00
+2001-03-08T09:00:00
+2001-03-01T09:00:00
+2000-03-30T09:00:00
+2000-03-23T09:00:00
+2000-03-16T09:00:00
+2000-03-09T09:00:00
+2000-03-02T09:00:00
+1999-03-25T09:00:00
+1999-03-18T09:00:00
+1999-03-11T09:00:00
+1999-03-04T09:00:00
+1998-03-26T09:00:00
+1998-03-19T09:00:00
+1998-03-12T09:00:00
+1998-03-05T09:00:00
+1997-03-27T09:00:00
+1997-03-20T09:00:00
+1997-03-13T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase28.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase28.ics.recurson.ref
new file mode 100644
index 00000000..7b97b20c
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase28.ics.recurson.ref
@@ -0,0 +1,60 @@
+1997-03-13
+1997-03-20
+1997-03-27
+1998-03-05
+1998-03-12
+1998-03-19
+1998-03-26
+1999-03-04
+1999-03-11
+1999-03-18
+1999-03-25
+2000-03-02
+2000-03-09
+2000-03-16
+2000-03-23
+2000-03-30
+2001-03-01
+2001-03-08
+2001-03-15
+2001-03-22
+2001-03-29
+2002-03-07
+2002-03-14
+2002-03-21
+2002-03-28
+2003-03-06
+2003-03-13
+2003-03-20
+2003-03-27
+2004-03-04
+2004-03-11
+2004-03-18
+2004-03-25
+2005-03-03
+2005-03-10
+2005-03-17
+2005-03-24
+2005-03-31
+2006-03-02
+2006-03-09
+2006-03-16
+2006-03-23
+2006-03-30
+2007-03-01
+2007-03-08
+2007-03-15
+2007-03-22
+2007-03-29
+2008-03-06
+2008-03-13
+2008-03-20
+2008-03-27
+2009-03-05
+2009-03-12
+2009-03-19
+2009-03-26
+2010-03-04
+2010-03-11
+2010-03-18
+2010-03-25
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase29.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase29.ics
new file mode 100644
index 00000000..fc904478
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase29.ics
@@ -0,0 +1,34 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Every Thursday\, but only during June\, July\, and August\, fo
+ rever:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970605T090000
+RRULE:FREQ=YEARLY;BYDAY=TH;BYMONTH=6,7,8
+SUMMARY:RExample27
+UID:RExample27
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase29.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase29.ics.comp34.ref
new file mode 100644
index 00000000..14a1220f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase29.ics.comp34.ref
@@ -0,0 +1,2 @@
+1997-06-05T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase29.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase29.ics.next.ref
new file mode 100644
index 00000000..5165c843
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase29.ics.next.ref
@@ -0,0 +1,500 @@
+1997-06-05T09:00:00
+1997-06-12T09:00:00
+1997-06-19T09:00:00
+1997-06-26T09:00:00
+1997-07-03T09:00:00
+1997-07-10T09:00:00
+1997-07-17T09:00:00
+1997-07-24T09:00:00
+1997-07-31T09:00:00
+1997-08-07T09:00:00
+1997-08-14T09:00:00
+1997-08-21T09:00:00
+1997-08-28T09:00:00
+1998-06-04T09:00:00
+1998-06-11T09:00:00
+1998-06-18T09:00:00
+1998-06-25T09:00:00
+1998-07-02T09:00:00
+1998-07-09T09:00:00
+1998-07-16T09:00:00
+1998-07-23T09:00:00
+1998-07-30T09:00:00
+1998-08-06T09:00:00
+1998-08-13T09:00:00
+1998-08-20T09:00:00
+1998-08-27T09:00:00
+1999-06-03T09:00:00
+1999-06-10T09:00:00
+1999-06-17T09:00:00
+1999-06-24T09:00:00
+1999-07-01T09:00:00
+1999-07-08T09:00:00
+1999-07-15T09:00:00
+1999-07-22T09:00:00
+1999-07-29T09:00:00
+1999-08-05T09:00:00
+1999-08-12T09:00:00
+1999-08-19T09:00:00
+1999-08-26T09:00:00
+2000-06-01T09:00:00
+2000-06-08T09:00:00
+2000-06-15T09:00:00
+2000-06-22T09:00:00
+2000-06-29T09:00:00
+2000-07-06T09:00:00
+2000-07-13T09:00:00
+2000-07-20T09:00:00
+2000-07-27T09:00:00
+2000-08-03T09:00:00
+2000-08-10T09:00:00
+2000-08-17T09:00:00
+2000-08-24T09:00:00
+2000-08-31T09:00:00
+2001-06-07T09:00:00
+2001-06-14T09:00:00
+2001-06-21T09:00:00
+2001-06-28T09:00:00
+2001-07-05T09:00:00
+2001-07-12T09:00:00
+2001-07-19T09:00:00
+2001-07-26T09:00:00
+2001-08-02T09:00:00
+2001-08-09T09:00:00
+2001-08-16T09:00:00
+2001-08-23T09:00:00
+2001-08-30T09:00:00
+2002-06-06T09:00:00
+2002-06-13T09:00:00
+2002-06-20T09:00:00
+2002-06-27T09:00:00
+2002-07-04T09:00:00
+2002-07-11T09:00:00
+2002-07-18T09:00:00
+2002-07-25T09:00:00
+2002-08-01T09:00:00
+2002-08-08T09:00:00
+2002-08-15T09:00:00
+2002-08-22T09:00:00
+2002-08-29T09:00:00
+2003-06-05T09:00:00
+2003-06-12T09:00:00
+2003-06-19T09:00:00
+2003-06-26T09:00:00
+2003-07-03T09:00:00
+2003-07-10T09:00:00
+2003-07-17T09:00:00
+2003-07-24T09:00:00
+2003-07-31T09:00:00
+2003-08-07T09:00:00
+2003-08-14T09:00:00
+2003-08-21T09:00:00
+2003-08-28T09:00:00
+2004-06-03T09:00:00
+2004-06-10T09:00:00
+2004-06-17T09:00:00
+2004-06-24T09:00:00
+2004-07-01T09:00:00
+2004-07-08T09:00:00
+2004-07-15T09:00:00
+2004-07-22T09:00:00
+2004-07-29T09:00:00
+2004-08-05T09:00:00
+2004-08-12T09:00:00
+2004-08-19T09:00:00
+2004-08-26T09:00:00
+2005-06-02T09:00:00
+2005-06-09T09:00:00
+2005-06-16T09:00:00
+2005-06-23T09:00:00
+2005-06-30T09:00:00
+2005-07-07T09:00:00
+2005-07-14T09:00:00
+2005-07-21T09:00:00
+2005-07-28T09:00:00
+2005-08-04T09:00:00
+2005-08-11T09:00:00
+2005-08-18T09:00:00
+2005-08-25T09:00:00
+2006-06-01T09:00:00
+2006-06-08T09:00:00
+2006-06-15T09:00:00
+2006-06-22T09:00:00
+2006-06-29T09:00:00
+2006-07-06T09:00:00
+2006-07-13T09:00:00
+2006-07-20T09:00:00
+2006-07-27T09:00:00
+2006-08-03T09:00:00
+2006-08-10T09:00:00
+2006-08-17T09:00:00
+2006-08-24T09:00:00
+2006-08-31T09:00:00
+2007-06-07T09:00:00
+2007-06-14T09:00:00
+2007-06-21T09:00:00
+2007-06-28T09:00:00
+2007-07-05T09:00:00
+2007-07-12T09:00:00
+2007-07-19T09:00:00
+2007-07-26T09:00:00
+2007-08-02T09:00:00
+2007-08-09T09:00:00
+2007-08-16T09:00:00
+2007-08-23T09:00:00
+2007-08-30T09:00:00
+2008-06-05T09:00:00
+2008-06-12T09:00:00
+2008-06-19T09:00:00
+2008-06-26T09:00:00
+2008-07-03T09:00:00
+2008-07-10T09:00:00
+2008-07-17T09:00:00
+2008-07-24T09:00:00
+2008-07-31T09:00:00
+2008-08-07T09:00:00
+2008-08-14T09:00:00
+2008-08-21T09:00:00
+2008-08-28T09:00:00
+2009-06-04T09:00:00
+2009-06-11T09:00:00
+2009-06-18T09:00:00
+2009-06-25T09:00:00
+2009-07-02T09:00:00
+2009-07-09T09:00:00
+2009-07-16T09:00:00
+2009-07-23T09:00:00
+2009-07-30T09:00:00
+2009-08-06T09:00:00
+2009-08-13T09:00:00
+2009-08-20T09:00:00
+2009-08-27T09:00:00
+2010-06-03T09:00:00
+2010-06-10T09:00:00
+2010-06-17T09:00:00
+2010-06-24T09:00:00
+2010-07-01T09:00:00
+2010-07-08T09:00:00
+2010-07-15T09:00:00
+2010-07-22T09:00:00
+2010-07-29T09:00:00
+2010-08-05T09:00:00
+2010-08-12T09:00:00
+2010-08-19T09:00:00
+2010-08-26T09:00:00
+2011-06-02T09:00:00
+2011-06-09T09:00:00
+2011-06-16T09:00:00
+2011-06-23T09:00:00
+2011-06-30T09:00:00
+2011-07-07T09:00:00
+2011-07-14T09:00:00
+2011-07-21T09:00:00
+2011-07-28T09:00:00
+2011-08-04T09:00:00
+2011-08-11T09:00:00
+2011-08-18T09:00:00
+2011-08-25T09:00:00
+2012-06-07T09:00:00
+2012-06-14T09:00:00
+2012-06-21T09:00:00
+2012-06-28T09:00:00
+2012-07-05T09:00:00
+2012-07-12T09:00:00
+2012-07-19T09:00:00
+2012-07-26T09:00:00
+2012-08-02T09:00:00
+2012-08-09T09:00:00
+2012-08-16T09:00:00
+2012-08-23T09:00:00
+2012-08-30T09:00:00
+2013-06-06T09:00:00
+2013-06-13T09:00:00
+2013-06-20T09:00:00
+2013-06-27T09:00:00
+2013-07-04T09:00:00
+2013-07-11T09:00:00
+2013-07-18T09:00:00
+2013-07-25T09:00:00
+2013-08-01T09:00:00
+2013-08-08T09:00:00
+2013-08-15T09:00:00
+2013-08-22T09:00:00
+2013-08-29T09:00:00
+2014-06-05T09:00:00
+2014-06-12T09:00:00
+2014-06-19T09:00:00
+2014-06-26T09:00:00
+2014-07-03T09:00:00
+2014-07-10T09:00:00
+2014-07-17T09:00:00
+2014-07-24T09:00:00
+2014-07-31T09:00:00
+2014-08-07T09:00:00
+2014-08-14T09:00:00
+2014-08-21T09:00:00
+2014-08-28T09:00:00
+2015-06-04T09:00:00
+2015-06-11T09:00:00
+2015-06-18T09:00:00
+2015-06-25T09:00:00
+2015-07-02T09:00:00
+2015-07-09T09:00:00
+2015-07-16T09:00:00
+2015-07-23T09:00:00
+2015-07-30T09:00:00
+2015-08-06T09:00:00
+2015-08-13T09:00:00
+2015-08-20T09:00:00
+2015-08-27T09:00:00
+2016-06-02T09:00:00
+2016-06-09T09:00:00
+2016-06-16T09:00:00
+2016-06-23T09:00:00
+2016-06-30T09:00:00
+2016-07-07T09:00:00
+2016-07-14T09:00:00
+2016-07-21T09:00:00
+2016-07-28T09:00:00
+2016-08-04T09:00:00
+2016-08-11T09:00:00
+2016-08-18T09:00:00
+2016-08-25T09:00:00
+2017-06-01T09:00:00
+2017-06-08T09:00:00
+2017-06-15T09:00:00
+2017-06-22T09:00:00
+2017-06-29T09:00:00
+2017-07-06T09:00:00
+2017-07-13T09:00:00
+2017-07-20T09:00:00
+2017-07-27T09:00:00
+2017-08-03T09:00:00
+2017-08-10T09:00:00
+2017-08-17T09:00:00
+2017-08-24T09:00:00
+2017-08-31T09:00:00
+2018-06-07T09:00:00
+2018-06-14T09:00:00
+2018-06-21T09:00:00
+2018-06-28T09:00:00
+2018-07-05T09:00:00
+2018-07-12T09:00:00
+2018-07-19T09:00:00
+2018-07-26T09:00:00
+2018-08-02T09:00:00
+2018-08-09T09:00:00
+2018-08-16T09:00:00
+2018-08-23T09:00:00
+2018-08-30T09:00:00
+2019-06-06T09:00:00
+2019-06-13T09:00:00
+2019-06-20T09:00:00
+2019-06-27T09:00:00
+2019-07-04T09:00:00
+2019-07-11T09:00:00
+2019-07-18T09:00:00
+2019-07-25T09:00:00
+2019-08-01T09:00:00
+2019-08-08T09:00:00
+2019-08-15T09:00:00
+2019-08-22T09:00:00
+2019-08-29T09:00:00
+2020-06-04T09:00:00
+2020-06-11T09:00:00
+2020-06-18T09:00:00
+2020-06-25T09:00:00
+2020-07-02T09:00:00
+2020-07-09T09:00:00
+2020-07-16T09:00:00
+2020-07-23T09:00:00
+2020-07-30T09:00:00
+2020-08-06T09:00:00
+2020-08-13T09:00:00
+2020-08-20T09:00:00
+2020-08-27T09:00:00
+2021-06-03T09:00:00
+2021-06-10T09:00:00
+2021-06-17T09:00:00
+2021-06-24T09:00:00
+2021-07-01T09:00:00
+2021-07-08T09:00:00
+2021-07-15T09:00:00
+2021-07-22T09:00:00
+2021-07-29T09:00:00
+2021-08-05T09:00:00
+2021-08-12T09:00:00
+2021-08-19T09:00:00
+2021-08-26T09:00:00
+2022-06-02T09:00:00
+2022-06-09T09:00:00
+2022-06-16T09:00:00
+2022-06-23T09:00:00
+2022-06-30T09:00:00
+2022-07-07T09:00:00
+2022-07-14T09:00:00
+2022-07-21T09:00:00
+2022-07-28T09:00:00
+2022-08-04T09:00:00
+2022-08-11T09:00:00
+2022-08-18T09:00:00
+2022-08-25T09:00:00
+2023-06-01T09:00:00
+2023-06-08T09:00:00
+2023-06-15T09:00:00
+2023-06-22T09:00:00
+2023-06-29T09:00:00
+2023-07-06T09:00:00
+2023-07-13T09:00:00
+2023-07-20T09:00:00
+2023-07-27T09:00:00
+2023-08-03T09:00:00
+2023-08-10T09:00:00
+2023-08-17T09:00:00
+2023-08-24T09:00:00
+2023-08-31T09:00:00
+2024-06-06T09:00:00
+2024-06-13T09:00:00
+2024-06-20T09:00:00
+2024-06-27T09:00:00
+2024-07-04T09:00:00
+2024-07-11T09:00:00
+2024-07-18T09:00:00
+2024-07-25T09:00:00
+2024-08-01T09:00:00
+2024-08-08T09:00:00
+2024-08-15T09:00:00
+2024-08-22T09:00:00
+2024-08-29T09:00:00
+2025-06-05T09:00:00
+2025-06-12T09:00:00
+2025-06-19T09:00:00
+2025-06-26T09:00:00
+2025-07-03T09:00:00
+2025-07-10T09:00:00
+2025-07-17T09:00:00
+2025-07-24T09:00:00
+2025-07-31T09:00:00
+2025-08-07T09:00:00
+2025-08-14T09:00:00
+2025-08-21T09:00:00
+2025-08-28T09:00:00
+2026-06-04T09:00:00
+2026-06-11T09:00:00
+2026-06-18T09:00:00
+2026-06-25T09:00:00
+2026-07-02T09:00:00
+2026-07-09T09:00:00
+2026-07-16T09:00:00
+2026-07-23T09:00:00
+2026-07-30T09:00:00
+2026-08-06T09:00:00
+2026-08-13T09:00:00
+2026-08-20T09:00:00
+2026-08-27T09:00:00
+2027-06-03T09:00:00
+2027-06-10T09:00:00
+2027-06-17T09:00:00
+2027-06-24T09:00:00
+2027-07-01T09:00:00
+2027-07-08T09:00:00
+2027-07-15T09:00:00
+2027-07-22T09:00:00
+2027-07-29T09:00:00
+2027-08-05T09:00:00
+2027-08-12T09:00:00
+2027-08-19T09:00:00
+2027-08-26T09:00:00
+2028-06-01T09:00:00
+2028-06-08T09:00:00
+2028-06-15T09:00:00
+2028-06-22T09:00:00
+2028-06-29T09:00:00
+2028-07-06T09:00:00
+2028-07-13T09:00:00
+2028-07-20T09:00:00
+2028-07-27T09:00:00
+2028-08-03T09:00:00
+2028-08-10T09:00:00
+2028-08-17T09:00:00
+2028-08-24T09:00:00
+2028-08-31T09:00:00
+2029-06-07T09:00:00
+2029-06-14T09:00:00
+2029-06-21T09:00:00
+2029-06-28T09:00:00
+2029-07-05T09:00:00
+2029-07-12T09:00:00
+2029-07-19T09:00:00
+2029-07-26T09:00:00
+2029-08-02T09:00:00
+2029-08-09T09:00:00
+2029-08-16T09:00:00
+2029-08-23T09:00:00
+2029-08-30T09:00:00
+2030-06-06T09:00:00
+2030-06-13T09:00:00
+2030-06-20T09:00:00
+2030-06-27T09:00:00
+2030-07-04T09:00:00
+2030-07-11T09:00:00
+2030-07-18T09:00:00
+2030-07-25T09:00:00
+2030-08-01T09:00:00
+2030-08-08T09:00:00
+2030-08-15T09:00:00
+2030-08-22T09:00:00
+2030-08-29T09:00:00
+2031-06-05T09:00:00
+2031-06-12T09:00:00
+2031-06-19T09:00:00
+2031-06-26T09:00:00
+2031-07-03T09:00:00
+2031-07-10T09:00:00
+2031-07-17T09:00:00
+2031-07-24T09:00:00
+2031-07-31T09:00:00
+2031-08-07T09:00:00
+2031-08-14T09:00:00
+2031-08-21T09:00:00
+2031-08-28T09:00:00
+2032-06-03T09:00:00
+2032-06-10T09:00:00
+2032-06-17T09:00:00
+2032-06-24T09:00:00
+2032-07-01T09:00:00
+2032-07-08T09:00:00
+2032-07-15T09:00:00
+2032-07-22T09:00:00
+2032-07-29T09:00:00
+2032-08-05T09:00:00
+2032-08-12T09:00:00
+2032-08-19T09:00:00
+2032-08-26T09:00:00
+2033-06-02T09:00:00
+2033-06-09T09:00:00
+2033-06-16T09:00:00
+2033-06-23T09:00:00
+2033-06-30T09:00:00
+2033-07-07T09:00:00
+2033-07-14T09:00:00
+2033-07-21T09:00:00
+2033-07-28T09:00:00
+2033-08-04T09:00:00
+2033-08-11T09:00:00
+2033-08-18T09:00:00
+2033-08-25T09:00:00
+2034-06-01T09:00:00
+2034-06-08T09:00:00
+2034-06-15T09:00:00
+2034-06-22T09:00:00
+2034-06-29T09:00:00
+2034-07-06T09:00:00
+2034-07-13T09:00:00
+2034-07-20T09:00:00
+2034-07-27T09:00:00
+2034-08-03T09:00:00
+2034-08-10T09:00:00
+2034-08-17T09:00:00
+2034-08-24T09:00:00
+2034-08-31T09:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase29.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase29.ics.prev.ref
new file mode 100644
index 00000000..099e614f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase29.ics.prev.ref
@@ -0,0 +1,185 @@
+2010-08-26T09:00:00
+2010-08-19T09:00:00
+2010-08-12T09:00:00
+2010-08-05T09:00:00
+2010-07-29T09:00:00
+2010-07-22T09:00:00
+2010-07-15T09:00:00
+2010-07-08T09:00:00
+2010-07-01T09:00:00
+2010-06-24T09:00:00
+2010-06-17T09:00:00
+2010-06-10T09:00:00
+2010-06-03T09:00:00
+2009-08-27T09:00:00
+2009-08-20T09:00:00
+2009-08-13T09:00:00
+2009-08-06T09:00:00
+2009-07-30T09:00:00
+2009-07-23T09:00:00
+2009-07-16T09:00:00
+2009-07-09T09:00:00
+2009-07-02T09:00:00
+2009-06-25T09:00:00
+2009-06-18T09:00:00
+2009-06-11T09:00:00
+2009-06-04T09:00:00
+2008-08-28T09:00:00
+2008-08-21T09:00:00
+2008-08-14T09:00:00
+2008-08-07T09:00:00
+2008-07-31T09:00:00
+2008-07-24T09:00:00
+2008-07-17T09:00:00
+2008-07-10T09:00:00
+2008-07-03T09:00:00
+2008-06-26T09:00:00
+2008-06-19T09:00:00
+2008-06-12T09:00:00
+2008-06-05T09:00:00
+2007-08-30T09:00:00
+2007-08-23T09:00:00
+2007-08-16T09:00:00
+2007-08-09T09:00:00
+2007-08-02T09:00:00
+2007-07-26T09:00:00
+2007-07-19T09:00:00
+2007-07-12T09:00:00
+2007-07-05T09:00:00
+2007-06-28T09:00:00
+2007-06-21T09:00:00
+2007-06-14T09:00:00
+2007-06-07T09:00:00
+2006-08-31T09:00:00
+2006-08-24T09:00:00
+2006-08-17T09:00:00
+2006-08-10T09:00:00
+2006-08-03T09:00:00
+2006-07-27T09:00:00
+2006-07-20T09:00:00
+2006-07-13T09:00:00
+2006-07-06T09:00:00
+2006-06-29T09:00:00
+2006-06-22T09:00:00
+2006-06-15T09:00:00
+2006-06-08T09:00:00
+2006-06-01T09:00:00
+2005-08-25T09:00:00
+2005-08-18T09:00:00
+2005-08-11T09:00:00
+2005-08-04T09:00:00
+2005-07-28T09:00:00
+2005-07-21T09:00:00
+2005-07-14T09:00:00
+2005-07-07T09:00:00
+2005-06-30T09:00:00
+2005-06-23T09:00:00
+2005-06-16T09:00:00
+2005-06-09T09:00:00
+2005-06-02T09:00:00
+2004-08-26T09:00:00
+2004-08-19T09:00:00
+2004-08-12T09:00:00
+2004-08-05T09:00:00
+2004-07-29T09:00:00
+2004-07-22T09:00:00
+2004-07-15T09:00:00
+2004-07-08T09:00:00
+2004-07-01T09:00:00
+2004-06-24T09:00:00
+2004-06-17T09:00:00
+2004-06-10T09:00:00
+2004-06-03T09:00:00
+2003-08-28T09:00:00
+2003-08-21T09:00:00
+2003-08-14T09:00:00
+2003-08-07T09:00:00
+2003-07-31T09:00:00
+2003-07-24T09:00:00
+2003-07-17T09:00:00
+2003-07-10T09:00:00
+2003-07-03T09:00:00
+2003-06-26T09:00:00
+2003-06-19T09:00:00
+2003-06-12T09:00:00
+2003-06-05T09:00:00
+2002-08-29T09:00:00
+2002-08-22T09:00:00
+2002-08-15T09:00:00
+2002-08-08T09:00:00
+2002-08-01T09:00:00
+2002-07-25T09:00:00
+2002-07-18T09:00:00
+2002-07-11T09:00:00
+2002-07-04T09:00:00
+2002-06-27T09:00:00
+2002-06-20T09:00:00
+2002-06-13T09:00:00
+2002-06-06T09:00:00
+2001-08-30T09:00:00
+2001-08-23T09:00:00
+2001-08-16T09:00:00
+2001-08-09T09:00:00
+2001-08-02T09:00:00
+2001-07-26T09:00:00
+2001-07-19T09:00:00
+2001-07-12T09:00:00
+2001-07-05T09:00:00
+2001-06-28T09:00:00
+2001-06-21T09:00:00
+2001-06-14T09:00:00
+2001-06-07T09:00:00
+2000-08-31T09:00:00
+2000-08-24T09:00:00
+2000-08-17T09:00:00
+2000-08-10T09:00:00
+2000-08-03T09:00:00
+2000-07-27T09:00:00
+2000-07-20T09:00:00
+2000-07-13T09:00:00
+2000-07-06T09:00:00
+2000-06-29T09:00:00
+2000-06-22T09:00:00
+2000-06-15T09:00:00
+2000-06-08T09:00:00
+2000-06-01T09:00:00
+1999-08-26T09:00:00
+1999-08-19T09:00:00
+1999-08-12T09:00:00
+1999-08-05T09:00:00
+1999-07-29T09:00:00
+1999-07-22T09:00:00
+1999-07-15T09:00:00
+1999-07-08T09:00:00
+1999-07-01T09:00:00
+1999-06-24T09:00:00
+1999-06-17T09:00:00
+1999-06-10T09:00:00
+1999-06-03T09:00:00
+1998-08-27T09:00:00
+1998-08-20T09:00:00
+1998-08-13T09:00:00
+1998-08-06T09:00:00
+1998-07-30T09:00:00
+1998-07-23T09:00:00
+1998-07-16T09:00:00
+1998-07-09T09:00:00
+1998-07-02T09:00:00
+1998-06-25T09:00:00
+1998-06-18T09:00:00
+1998-06-11T09:00:00
+1998-06-04T09:00:00
+1997-08-28T09:00:00
+1997-08-21T09:00:00
+1997-08-14T09:00:00
+1997-08-07T09:00:00
+1997-07-31T09:00:00
+1997-07-24T09:00:00
+1997-07-17T09:00:00
+1997-07-10T09:00:00
+1997-07-03T09:00:00
+1997-06-26T09:00:00
+1997-06-19T09:00:00
+1997-06-12T09:00:00
+1997-06-05T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase29.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase29.ics.recurson.ref
new file mode 100644
index 00000000..63a0cb72
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase29.ics.recurson.ref
@@ -0,0 +1,184 @@
+1997-06-05
+1997-06-12
+1997-06-19
+1997-06-26
+1997-07-03
+1997-07-10
+1997-07-17
+1997-07-24
+1997-07-31
+1997-08-07
+1997-08-14
+1997-08-21
+1997-08-28
+1998-06-04
+1998-06-11
+1998-06-18
+1998-06-25
+1998-07-02
+1998-07-09
+1998-07-16
+1998-07-23
+1998-07-30
+1998-08-06
+1998-08-13
+1998-08-20
+1998-08-27
+1999-06-03
+1999-06-10
+1999-06-17
+1999-06-24
+1999-07-01
+1999-07-08
+1999-07-15
+1999-07-22
+1999-07-29
+1999-08-05
+1999-08-12
+1999-08-19
+1999-08-26
+2000-06-01
+2000-06-08
+2000-06-15
+2000-06-22
+2000-06-29
+2000-07-06
+2000-07-13
+2000-07-20
+2000-07-27
+2000-08-03
+2000-08-10
+2000-08-17
+2000-08-24
+2000-08-31
+2001-06-07
+2001-06-14
+2001-06-21
+2001-06-28
+2001-07-05
+2001-07-12
+2001-07-19
+2001-07-26
+2001-08-02
+2001-08-09
+2001-08-16
+2001-08-23
+2001-08-30
+2002-06-06
+2002-06-13
+2002-06-20
+2002-06-27
+2002-07-04
+2002-07-11
+2002-07-18
+2002-07-25
+2002-08-01
+2002-08-08
+2002-08-15
+2002-08-22
+2002-08-29
+2003-06-05
+2003-06-12
+2003-06-19
+2003-06-26
+2003-07-03
+2003-07-10
+2003-07-17
+2003-07-24
+2003-07-31
+2003-08-07
+2003-08-14
+2003-08-21
+2003-08-28
+2004-06-03
+2004-06-10
+2004-06-17
+2004-06-24
+2004-07-01
+2004-07-08
+2004-07-15
+2004-07-22
+2004-07-29
+2004-08-05
+2004-08-12
+2004-08-19
+2004-08-26
+2005-06-02
+2005-06-09
+2005-06-16
+2005-06-23
+2005-06-30
+2005-07-07
+2005-07-14
+2005-07-21
+2005-07-28
+2005-08-04
+2005-08-11
+2005-08-18
+2005-08-25
+2006-06-01
+2006-06-08
+2006-06-15
+2006-06-22
+2006-06-29
+2006-07-06
+2006-07-13
+2006-07-20
+2006-07-27
+2006-08-03
+2006-08-10
+2006-08-17
+2006-08-24
+2006-08-31
+2007-06-07
+2007-06-14
+2007-06-21
+2007-06-28
+2007-07-05
+2007-07-12
+2007-07-19
+2007-07-26
+2007-08-02
+2007-08-09
+2007-08-16
+2007-08-23
+2007-08-30
+2008-06-05
+2008-06-12
+2008-06-19
+2008-06-26
+2008-07-03
+2008-07-10
+2008-07-17
+2008-07-24
+2008-07-31
+2008-08-07
+2008-08-14
+2008-08-21
+2008-08-28
+2009-06-04
+2009-06-11
+2009-06-18
+2009-06-25
+2009-07-02
+2009-07-09
+2009-07-16
+2009-07-23
+2009-07-30
+2009-08-06
+2009-08-13
+2009-08-20
+2009-08-27
+2010-06-03
+2010-06-10
+2010-06-17
+2010-06-24
+2010-07-01
+2010-07-08
+2010-07-15
+2010-07-22
+2010-07-29
+2010-08-05
+2010-08-12
+2010-08-19
+2010-08-26
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase30.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase30.ics
new file mode 100644
index 00000000..089d77f9
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase30.ics
@@ -0,0 +1,34 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Every Friday the 13th\, forever:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+EXDATE;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=MONTHLY;BYDAY=FR;BYMONTHDAY=13
+SUMMARY:RExample28
+UID:RExample28
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase30.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase30.ics.comp34.ref
new file mode 100644
index 00000000..6d3cbe1f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase30.ics.comp34.ref
@@ -0,0 +1,2 @@
+1997-09-02T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase30.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase30.ics.next.ref
new file mode 100644
index 00000000..aac9f62c
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase30.ics.next.ref
@@ -0,0 +1,500 @@
+1998-02-13T09:00:00
+1998-03-13T09:00:00
+1998-11-13T09:00:00
+1999-08-13T09:00:00
+2000-10-13T09:00:00
+2001-04-13T09:00:00
+2001-07-13T09:00:00
+2002-09-13T09:00:00
+2002-12-13T09:00:00
+2003-06-13T09:00:00
+2004-02-13T09:00:00
+2004-08-13T09:00:00
+2005-05-13T09:00:00
+2006-01-13T09:00:00
+2006-10-13T09:00:00
+2007-04-13T09:00:00
+2007-07-13T09:00:00
+2008-06-13T09:00:00
+2009-02-13T09:00:00
+2009-03-13T09:00:00
+2009-11-13T09:00:00
+2010-08-13T09:00:00
+2011-05-13T09:00:00
+2012-01-13T09:00:00
+2012-04-13T09:00:00
+2012-07-13T09:00:00
+2013-09-13T09:00:00
+2013-12-13T09:00:00
+2014-06-13T09:00:00
+2015-02-13T09:00:00
+2015-03-13T09:00:00
+2015-11-13T09:00:00
+2016-05-13T09:00:00
+2017-01-13T09:00:00
+2017-10-13T09:00:00
+2018-04-13T09:00:00
+2018-07-13T09:00:00
+2019-09-13T09:00:00
+2019-12-13T09:00:00
+2020-03-13T09:00:00
+2020-11-13T09:00:00
+2021-08-13T09:00:00
+2022-05-13T09:00:00
+2023-01-13T09:00:00
+2023-10-13T09:00:00
+2024-09-13T09:00:00
+2024-12-13T09:00:00
+2025-06-13T09:00:00
+2026-02-13T09:00:00
+2026-03-13T09:00:00
+2026-11-13T09:00:00
+2027-08-13T09:00:00
+2028-10-13T09:00:00
+2029-04-13T09:00:00
+2029-07-13T09:00:00
+2030-09-13T09:00:00
+2030-12-13T09:00:00
+2031-06-13T09:00:00
+2032-02-13T09:00:00
+2032-08-13T09:00:00
+2033-05-13T09:00:00
+2034-01-13T09:00:00
+2034-10-13T09:00:00
+2035-04-13T09:00:00
+2035-07-13T09:00:00
+2036-06-13T09:00:00
+2037-02-13T09:00:00
+2037-03-13T09:00:00
+2037-11-13T09:00:00
+2038-08-13T09:00:00
+2039-05-13T09:00:00
+2040-01-13T09:00:00
+2040-04-13T09:00:00
+2040-07-13T09:00:00
+2041-09-13T09:00:00
+2041-12-13T09:00:00
+2042-06-13T09:00:00
+2043-02-13T09:00:00
+2043-03-13T09:00:00
+2043-11-13T09:00:00
+2044-05-13T09:00:00
+2045-01-13T09:00:00
+2045-10-13T09:00:00
+2046-04-13T09:00:00
+2046-07-13T09:00:00
+2047-09-13T09:00:00
+2047-12-13T09:00:00
+2048-03-13T09:00:00
+2048-11-13T09:00:00
+2049-08-13T09:00:00
+2050-05-13T09:00:00
+2051-01-13T09:00:00
+2051-10-13T09:00:00
+2052-09-13T09:00:00
+2052-12-13T09:00:00
+2053-06-13T09:00:00
+2054-02-13T09:00:00
+2054-03-13T09:00:00
+2054-11-13T09:00:00
+2055-08-13T09:00:00
+2056-10-13T09:00:00
+2057-04-13T09:00:00
+2057-07-13T09:00:00
+2058-09-13T09:00:00
+2058-12-13T09:00:00
+2059-06-13T09:00:00
+2060-02-13T09:00:00
+2060-08-13T09:00:00
+2061-05-13T09:00:00
+2062-01-13T09:00:00
+2062-10-13T09:00:00
+2063-04-13T09:00:00
+2063-07-13T09:00:00
+2064-06-13T09:00:00
+2065-02-13T09:00:00
+2065-03-13T09:00:00
+2065-11-13T09:00:00
+2066-08-13T09:00:00
+2067-05-13T09:00:00
+2068-01-13T09:00:00
+2068-04-13T09:00:00
+2068-07-13T09:00:00
+2069-09-13T09:00:00
+2069-12-13T09:00:00
+2070-06-13T09:00:00
+2071-02-13T09:00:00
+2071-03-13T09:00:00
+2071-11-13T09:00:00
+2072-05-13T09:00:00
+2073-01-13T09:00:00
+2073-10-13T09:00:00
+2074-04-13T09:00:00
+2074-07-13T09:00:00
+2075-09-13T09:00:00
+2075-12-13T09:00:00
+2076-03-13T09:00:00
+2076-11-13T09:00:00
+2077-08-13T09:00:00
+2078-05-13T09:00:00
+2079-01-13T09:00:00
+2079-10-13T09:00:00
+2080-09-13T09:00:00
+2080-12-13T09:00:00
+2081-06-13T09:00:00
+2082-02-13T09:00:00
+2082-03-13T09:00:00
+2082-11-13T09:00:00
+2083-08-13T09:00:00
+2084-10-13T09:00:00
+2085-04-13T09:00:00
+2085-07-13T09:00:00
+2086-09-13T09:00:00
+2086-12-13T09:00:00
+2087-06-13T09:00:00
+2088-02-13T09:00:00
+2088-08-13T09:00:00
+2089-05-13T09:00:00
+2090-01-13T09:00:00
+2090-10-13T09:00:00
+2091-04-13T09:00:00
+2091-07-13T09:00:00
+2092-06-13T09:00:00
+2093-02-13T09:00:00
+2093-03-13T09:00:00
+2093-11-13T09:00:00
+2094-08-13T09:00:00
+2095-05-13T09:00:00
+2096-01-13T09:00:00
+2096-04-13T09:00:00
+2096-07-13T09:00:00
+2097-09-13T09:00:00
+2097-12-13T09:00:00
+2098-06-13T09:00:00
+2099-02-13T09:00:00
+2099-03-13T09:00:00
+2099-11-13T09:00:00
+2100-08-13T09:00:00
+2101-05-13T09:00:00
+2102-01-13T09:00:00
+2102-10-13T09:00:00
+2103-04-13T09:00:00
+2103-07-13T09:00:00
+2104-06-13T09:00:00
+2105-02-13T09:00:00
+2105-03-13T09:00:00
+2105-11-13T09:00:00
+2106-08-13T09:00:00
+2107-05-13T09:00:00
+2108-01-13T09:00:00
+2108-04-13T09:00:00
+2108-07-13T09:00:00
+2109-09-13T09:00:00
+2109-12-13T09:00:00
+2110-06-13T09:00:00
+2111-02-13T09:00:00
+2111-03-13T09:00:00
+2111-11-13T09:00:00
+2112-05-13T09:00:00
+2113-01-13T09:00:00
+2113-10-13T09:00:00
+2114-04-13T09:00:00
+2114-07-13T09:00:00
+2115-09-13T09:00:00
+2115-12-13T09:00:00
+2116-03-13T09:00:00
+2116-11-13T09:00:00
+2117-08-13T09:00:00
+2118-05-13T09:00:00
+2119-01-13T09:00:00
+2119-10-13T09:00:00
+2120-09-13T09:00:00
+2120-12-13T09:00:00
+2121-06-13T09:00:00
+2122-02-13T09:00:00
+2122-03-13T09:00:00
+2122-11-13T09:00:00
+2123-08-13T09:00:00
+2124-10-13T09:00:00
+2125-04-13T09:00:00
+2125-07-13T09:00:00
+2126-09-13T09:00:00
+2126-12-13T09:00:00
+2127-06-13T09:00:00
+2128-02-13T09:00:00
+2128-08-13T09:00:00
+2129-05-13T09:00:00
+2130-01-13T09:00:00
+2130-10-13T09:00:00
+2131-04-13T09:00:00
+2131-07-13T09:00:00
+2132-06-13T09:00:00
+2133-02-13T09:00:00
+2133-03-13T09:00:00
+2133-11-13T09:00:00
+2134-08-13T09:00:00
+2135-05-13T09:00:00
+2136-01-13T09:00:00
+2136-04-13T09:00:00
+2136-07-13T09:00:00
+2137-09-13T09:00:00
+2137-12-13T09:00:00
+2138-06-13T09:00:00
+2139-02-13T09:00:00
+2139-03-13T09:00:00
+2139-11-13T09:00:00
+2140-05-13T09:00:00
+2141-01-13T09:00:00
+2141-10-13T09:00:00
+2142-04-13T09:00:00
+2142-07-13T09:00:00
+2143-09-13T09:00:00
+2143-12-13T09:00:00
+2144-03-13T09:00:00
+2144-11-13T09:00:00
+2145-08-13T09:00:00
+2146-05-13T09:00:00
+2147-01-13T09:00:00
+2147-10-13T09:00:00
+2148-09-13T09:00:00
+2148-12-13T09:00:00
+2149-06-13T09:00:00
+2150-02-13T09:00:00
+2150-03-13T09:00:00
+2150-11-13T09:00:00
+2151-08-13T09:00:00
+2152-10-13T09:00:00
+2153-04-13T09:00:00
+2153-07-13T09:00:00
+2154-09-13T09:00:00
+2154-12-13T09:00:00
+2155-06-13T09:00:00
+2156-02-13T09:00:00
+2156-08-13T09:00:00
+2157-05-13T09:00:00
+2158-01-13T09:00:00
+2158-10-13T09:00:00
+2159-04-13T09:00:00
+2159-07-13T09:00:00
+2160-06-13T09:00:00
+2161-02-13T09:00:00
+2161-03-13T09:00:00
+2161-11-13T09:00:00
+2162-08-13T09:00:00
+2163-05-13T09:00:00
+2164-01-13T09:00:00
+2164-04-13T09:00:00
+2164-07-13T09:00:00
+2165-09-13T09:00:00
+2165-12-13T09:00:00
+2166-06-13T09:00:00
+2167-02-13T09:00:00
+2167-03-13T09:00:00
+2167-11-13T09:00:00
+2168-05-13T09:00:00
+2169-01-13T09:00:00
+2169-10-13T09:00:00
+2170-04-13T09:00:00
+2170-07-13T09:00:00
+2171-09-13T09:00:00
+2171-12-13T09:00:00
+2172-03-13T09:00:00
+2172-11-13T09:00:00
+2173-08-13T09:00:00
+2174-05-13T09:00:00
+2175-01-13T09:00:00
+2175-10-13T09:00:00
+2176-09-13T09:00:00
+2176-12-13T09:00:00
+2177-06-13T09:00:00
+2178-02-13T09:00:00
+2178-03-13T09:00:00
+2178-11-13T09:00:00
+2179-08-13T09:00:00
+2180-10-13T09:00:00
+2181-04-13T09:00:00
+2181-07-13T09:00:00
+2182-09-13T09:00:00
+2182-12-13T09:00:00
+2183-06-13T09:00:00
+2184-02-13T09:00:00
+2184-08-13T09:00:00
+2185-05-13T09:00:00
+2186-01-13T09:00:00
+2186-10-13T09:00:00
+2187-04-13T09:00:00
+2187-07-13T09:00:00
+2188-06-13T09:00:00
+2189-02-13T09:00:00
+2189-03-13T09:00:00
+2189-11-13T09:00:00
+2190-08-13T09:00:00
+2191-05-13T09:00:00
+2192-01-13T09:00:00
+2192-04-13T09:00:00
+2192-07-13T09:00:00
+2193-09-13T09:00:00
+2193-12-13T09:00:00
+2194-06-13T09:00:00
+2195-02-13T09:00:00
+2195-03-13T09:00:00
+2195-11-13T09:00:00
+2196-05-13T09:00:00
+2197-01-13T09:00:00
+2197-10-13T09:00:00
+2198-04-13T09:00:00
+2198-07-13T09:00:00
+2199-09-13T09:00:00
+2199-12-13T09:00:00
+2200-06-13T09:00:00
+2201-02-13T09:00:00
+2201-03-13T09:00:00
+2201-11-13T09:00:00
+2202-08-13T09:00:00
+2203-05-13T09:00:00
+2204-01-13T09:00:00
+2204-04-13T09:00:00
+2204-07-13T09:00:00
+2205-09-13T09:00:00
+2205-12-13T09:00:00
+2206-06-13T09:00:00
+2207-02-13T09:00:00
+2207-03-13T09:00:00
+2207-11-13T09:00:00
+2208-05-13T09:00:00
+2209-01-13T09:00:00
+2209-10-13T09:00:00
+2210-04-13T09:00:00
+2210-07-13T09:00:00
+2211-09-13T09:00:00
+2211-12-13T09:00:00
+2212-03-13T09:00:00
+2212-11-13T09:00:00
+2213-08-13T09:00:00
+2214-05-13T09:00:00
+2215-01-13T09:00:00
+2215-10-13T09:00:00
+2216-09-13T09:00:00
+2216-12-13T09:00:00
+2217-06-13T09:00:00
+2218-02-13T09:00:00
+2218-03-13T09:00:00
+2218-11-13T09:00:00
+2219-08-13T09:00:00
+2220-10-13T09:00:00
+2221-04-13T09:00:00
+2221-07-13T09:00:00
+2222-09-13T09:00:00
+2222-12-13T09:00:00
+2223-06-13T09:00:00
+2224-02-13T09:00:00
+2224-08-13T09:00:00
+2225-05-13T09:00:00
+2226-01-13T09:00:00
+2226-10-13T09:00:00
+2227-04-13T09:00:00
+2227-07-13T09:00:00
+2228-06-13T09:00:00
+2229-02-13T09:00:00
+2229-03-13T09:00:00
+2229-11-13T09:00:00
+2230-08-13T09:00:00
+2231-05-13T09:00:00
+2232-01-13T09:00:00
+2232-04-13T09:00:00
+2232-07-13T09:00:00
+2233-09-13T09:00:00
+2233-12-13T09:00:00
+2234-06-13T09:00:00
+2235-02-13T09:00:00
+2235-03-13T09:00:00
+2235-11-13T09:00:00
+2236-05-13T09:00:00
+2237-01-13T09:00:00
+2237-10-13T09:00:00
+2238-04-13T09:00:00
+2238-07-13T09:00:00
+2239-09-13T09:00:00
+2239-12-13T09:00:00
+2240-03-13T09:00:00
+2240-11-13T09:00:00
+2241-08-13T09:00:00
+2242-05-13T09:00:00
+2243-01-13T09:00:00
+2243-10-13T09:00:00
+2244-09-13T09:00:00
+2244-12-13T09:00:00
+2245-06-13T09:00:00
+2246-02-13T09:00:00
+2246-03-13T09:00:00
+2246-11-13T09:00:00
+2247-08-13T09:00:00
+2248-10-13T09:00:00
+2249-04-13T09:00:00
+2249-07-13T09:00:00
+2250-09-13T09:00:00
+2250-12-13T09:00:00
+2251-06-13T09:00:00
+2252-02-13T09:00:00
+2252-08-13T09:00:00
+2253-05-13T09:00:00
+2254-01-13T09:00:00
+2254-10-13T09:00:00
+2255-04-13T09:00:00
+2255-07-13T09:00:00
+2256-06-13T09:00:00
+2257-02-13T09:00:00
+2257-03-13T09:00:00
+2257-11-13T09:00:00
+2258-08-13T09:00:00
+2259-05-13T09:00:00
+2260-01-13T09:00:00
+2260-04-13T09:00:00
+2260-07-13T09:00:00
+2261-09-13T09:00:00
+2261-12-13T09:00:00
+2262-06-13T09:00:00
+2263-02-13T09:00:00
+2263-03-13T09:00:00
+2263-11-13T09:00:00
+2264-05-13T09:00:00
+2265-01-13T09:00:00
+2265-10-13T09:00:00
+2266-04-13T09:00:00
+2266-07-13T09:00:00
+2267-09-13T09:00:00
+2267-12-13T09:00:00
+2268-03-13T09:00:00
+2268-11-13T09:00:00
+2269-08-13T09:00:00
+2270-05-13T09:00:00
+2271-01-13T09:00:00
+2271-10-13T09:00:00
+2272-09-13T09:00:00
+2272-12-13T09:00:00
+2273-06-13T09:00:00
+2274-02-13T09:00:00
+2274-03-13T09:00:00
+2274-11-13T09:00:00
+2275-08-13T09:00:00
+2276-10-13T09:00:00
+2277-04-13T09:00:00
+2277-07-13T09:00:00
+2278-09-13T09:00:00
+2278-12-13T09:00:00
+2279-06-13T09:00:00
+2280-02-13T09:00:00
+2280-08-13T09:00:00
+2281-05-13T09:00:00
+2282-01-13T09:00:00
+2282-10-13T09:00:00
+2283-04-13T09:00:00
+2283-07-13T09:00:00
+2284-06-13T09:00:00
+2285-02-13T09:00:00
+2285-03-13T09:00:00
+2285-11-13T09:00:00
+2286-08-13T09:00:00
+2287-05-13T09:00:00
+2288-01-13T09:00:00
+2288-04-13T09:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase30.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase30.ics.prev.ref
new file mode 100644
index 00000000..81bf10e4
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase30.ics.prev.ref
@@ -0,0 +1,23 @@
+2010-08-13T09:00:00
+2009-11-13T09:00:00
+2009-03-13T09:00:00
+2009-02-13T09:00:00
+2008-06-13T09:00:00
+2007-07-13T09:00:00
+2007-04-13T09:00:00
+2006-10-13T09:00:00
+2006-01-13T09:00:00
+2005-05-13T09:00:00
+2004-08-13T09:00:00
+2004-02-13T09:00:00
+2003-06-13T09:00:00
+2002-12-13T09:00:00
+2002-09-13T09:00:00
+2001-07-13T09:00:00
+2001-04-13T09:00:00
+2000-10-13T09:00:00
+1999-08-13T09:00:00
+1998-11-13T09:00:00
+1998-03-13T09:00:00
+1998-02-13T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase30.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase30.ics.recurson.ref
new file mode 100644
index 00000000..00203dc5
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase30.ics.recurson.ref
@@ -0,0 +1,22 @@
+1998-02-13
+1998-03-13
+1998-11-13
+1999-08-13
+2000-10-13
+2001-04-13
+2001-07-13
+2002-09-13
+2002-12-13
+2003-06-13
+2004-02-13
+2004-08-13
+2005-05-13
+2006-01-13
+2006-10-13
+2007-04-13
+2007-07-13
+2008-06-13
+2009-02-13
+2009-03-13
+2009-11-13
+2010-08-13
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase31.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase31.ics
new file mode 100644
index 00000000..d3f58351
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase31.ics
@@ -0,0 +1,34 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:The first Saturday that follows the first Sunday of the month\
+ , forever:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970913T090000
+RRULE:FREQ=MONTHLY;BYDAY=SA;BYMONTHDAY=7,8,9,10,11,12,13
+SUMMARY:RExample29
+UID:RExample29
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase31.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase31.ics.comp34.ref
new file mode 100644
index 00000000..16d212e8
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase31.ics.comp34.ref
@@ -0,0 +1,2 @@
+1997-09-13T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase31.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase31.ics.next.ref
new file mode 100644
index 00000000..08522419
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase31.ics.next.ref
@@ -0,0 +1,500 @@
+1997-09-13T09:00:00
+1997-10-11T09:00:00
+1997-11-08T09:00:00
+1997-12-13T09:00:00
+1998-01-10T09:00:00
+1998-02-07T09:00:00
+1998-03-07T09:00:00
+1998-04-11T09:00:00
+1998-05-09T09:00:00
+1998-06-13T09:00:00
+1998-07-11T09:00:00
+1998-08-08T09:00:00
+1998-09-12T09:00:00
+1998-10-10T09:00:00
+1998-11-07T09:00:00
+1998-12-12T09:00:00
+1999-01-09T09:00:00
+1999-02-13T09:00:00
+1999-03-13T09:00:00
+1999-04-10T09:00:00
+1999-05-08T09:00:00
+1999-06-12T09:00:00
+1999-07-10T09:00:00
+1999-08-07T09:00:00
+1999-09-11T09:00:00
+1999-10-09T09:00:00
+1999-11-13T09:00:00
+1999-12-11T09:00:00
+2000-01-08T09:00:00
+2000-02-12T09:00:00
+2000-03-11T09:00:00
+2000-04-08T09:00:00
+2000-05-13T09:00:00
+2000-06-10T09:00:00
+2000-07-08T09:00:00
+2000-08-12T09:00:00
+2000-09-09T09:00:00
+2000-10-07T09:00:00
+2000-11-11T09:00:00
+2000-12-09T09:00:00
+2001-01-13T09:00:00
+2001-02-10T09:00:00
+2001-03-10T09:00:00
+2001-04-07T09:00:00
+2001-05-12T09:00:00
+2001-06-09T09:00:00
+2001-07-07T09:00:00
+2001-08-11T09:00:00
+2001-09-08T09:00:00
+2001-10-13T09:00:00
+2001-11-10T09:00:00
+2001-12-08T09:00:00
+2002-01-12T09:00:00
+2002-02-09T09:00:00
+2002-03-09T09:00:00
+2002-04-13T09:00:00
+2002-05-11T09:00:00
+2002-06-08T09:00:00
+2002-07-13T09:00:00
+2002-08-10T09:00:00
+2002-09-07T09:00:00
+2002-10-12T09:00:00
+2002-11-09T09:00:00
+2002-12-07T09:00:00
+2003-01-11T09:00:00
+2003-02-08T09:00:00
+2003-03-08T09:00:00
+2003-04-12T09:00:00
+2003-05-10T09:00:00
+2003-06-07T09:00:00
+2003-07-12T09:00:00
+2003-08-09T09:00:00
+2003-09-13T09:00:00
+2003-10-11T09:00:00
+2003-11-08T09:00:00
+2003-12-13T09:00:00
+2004-01-10T09:00:00
+2004-02-07T09:00:00
+2004-03-13T09:00:00
+2004-04-10T09:00:00
+2004-05-08T09:00:00
+2004-06-12T09:00:00
+2004-07-10T09:00:00
+2004-08-07T09:00:00
+2004-09-11T09:00:00
+2004-10-09T09:00:00
+2004-11-13T09:00:00
+2004-12-11T09:00:00
+2005-01-08T09:00:00
+2005-02-12T09:00:00
+2005-03-12T09:00:00
+2005-04-09T09:00:00
+2005-05-07T09:00:00
+2005-06-11T09:00:00
+2005-07-09T09:00:00
+2005-08-13T09:00:00
+2005-09-10T09:00:00
+2005-10-08T09:00:00
+2005-11-12T09:00:00
+2005-12-10T09:00:00
+2006-01-07T09:00:00
+2006-02-11T09:00:00
+2006-03-11T09:00:00
+2006-04-08T09:00:00
+2006-05-13T09:00:00
+2006-06-10T09:00:00
+2006-07-08T09:00:00
+2006-08-12T09:00:00
+2006-09-09T09:00:00
+2006-10-07T09:00:00
+2006-11-11T09:00:00
+2006-12-09T09:00:00
+2007-01-13T09:00:00
+2007-02-10T09:00:00
+2007-03-10T09:00:00
+2007-04-07T09:00:00
+2007-05-12T09:00:00
+2007-06-09T09:00:00
+2007-07-07T09:00:00
+2007-08-11T09:00:00
+2007-09-08T09:00:00
+2007-10-13T09:00:00
+2007-11-10T09:00:00
+2007-12-08T09:00:00
+2008-01-12T09:00:00
+2008-02-09T09:00:00
+2008-03-08T09:00:00
+2008-04-12T09:00:00
+2008-05-10T09:00:00
+2008-06-07T09:00:00
+2008-07-12T09:00:00
+2008-08-09T09:00:00
+2008-09-13T09:00:00
+2008-10-11T09:00:00
+2008-11-08T09:00:00
+2008-12-13T09:00:00
+2009-01-10T09:00:00
+2009-02-07T09:00:00
+2009-03-07T09:00:00
+2009-04-11T09:00:00
+2009-05-09T09:00:00
+2009-06-13T09:00:00
+2009-07-11T09:00:00
+2009-08-08T09:00:00
+2009-09-12T09:00:00
+2009-10-10T09:00:00
+2009-11-07T09:00:00
+2009-12-12T09:00:00
+2010-01-09T09:00:00
+2010-02-13T09:00:00
+2010-03-13T09:00:00
+2010-04-10T09:00:00
+2010-05-08T09:00:00
+2010-06-12T09:00:00
+2010-07-10T09:00:00
+2010-08-07T09:00:00
+2010-09-11T09:00:00
+2010-10-09T09:00:00
+2010-11-13T09:00:00
+2010-12-11T09:00:00
+2011-01-08T09:00:00
+2011-02-12T09:00:00
+2011-03-12T09:00:00
+2011-04-09T09:00:00
+2011-05-07T09:00:00
+2011-06-11T09:00:00
+2011-07-09T09:00:00
+2011-08-13T09:00:00
+2011-09-10T09:00:00
+2011-10-08T09:00:00
+2011-11-12T09:00:00
+2011-12-10T09:00:00
+2012-01-07T09:00:00
+2012-02-11T09:00:00
+2012-03-10T09:00:00
+2012-04-07T09:00:00
+2012-05-12T09:00:00
+2012-06-09T09:00:00
+2012-07-07T09:00:00
+2012-08-11T09:00:00
+2012-09-08T09:00:00
+2012-10-13T09:00:00
+2012-11-10T09:00:00
+2012-12-08T09:00:00
+2013-01-12T09:00:00
+2013-02-09T09:00:00
+2013-03-09T09:00:00
+2013-04-13T09:00:00
+2013-05-11T09:00:00
+2013-06-08T09:00:00
+2013-07-13T09:00:00
+2013-08-10T09:00:00
+2013-09-07T09:00:00
+2013-10-12T09:00:00
+2013-11-09T09:00:00
+2013-12-07T09:00:00
+2014-01-11T09:00:00
+2014-02-08T09:00:00
+2014-03-08T09:00:00
+2014-04-12T09:00:00
+2014-05-10T09:00:00
+2014-06-07T09:00:00
+2014-07-12T09:00:00
+2014-08-09T09:00:00
+2014-09-13T09:00:00
+2014-10-11T09:00:00
+2014-11-08T09:00:00
+2014-12-13T09:00:00
+2015-01-10T09:00:00
+2015-02-07T09:00:00
+2015-03-07T09:00:00
+2015-04-11T09:00:00
+2015-05-09T09:00:00
+2015-06-13T09:00:00
+2015-07-11T09:00:00
+2015-08-08T09:00:00
+2015-09-12T09:00:00
+2015-10-10T09:00:00
+2015-11-07T09:00:00
+2015-12-12T09:00:00
+2016-01-09T09:00:00
+2016-02-13T09:00:00
+2016-03-12T09:00:00
+2016-04-09T09:00:00
+2016-05-07T09:00:00
+2016-06-11T09:00:00
+2016-07-09T09:00:00
+2016-08-13T09:00:00
+2016-09-10T09:00:00
+2016-10-08T09:00:00
+2016-11-12T09:00:00
+2016-12-10T09:00:00
+2017-01-07T09:00:00
+2017-02-11T09:00:00
+2017-03-11T09:00:00
+2017-04-08T09:00:00
+2017-05-13T09:00:00
+2017-06-10T09:00:00
+2017-07-08T09:00:00
+2017-08-12T09:00:00
+2017-09-09T09:00:00
+2017-10-07T09:00:00
+2017-11-11T09:00:00
+2017-12-09T09:00:00
+2018-01-13T09:00:00
+2018-02-10T09:00:00
+2018-03-10T09:00:00
+2018-04-07T09:00:00
+2018-05-12T09:00:00
+2018-06-09T09:00:00
+2018-07-07T09:00:00
+2018-08-11T09:00:00
+2018-09-08T09:00:00
+2018-10-13T09:00:00
+2018-11-10T09:00:00
+2018-12-08T09:00:00
+2019-01-12T09:00:00
+2019-02-09T09:00:00
+2019-03-09T09:00:00
+2019-04-13T09:00:00
+2019-05-11T09:00:00
+2019-06-08T09:00:00
+2019-07-13T09:00:00
+2019-08-10T09:00:00
+2019-09-07T09:00:00
+2019-10-12T09:00:00
+2019-11-09T09:00:00
+2019-12-07T09:00:00
+2020-01-11T09:00:00
+2020-02-08T09:00:00
+2020-03-07T09:00:00
+2020-04-11T09:00:00
+2020-05-09T09:00:00
+2020-06-13T09:00:00
+2020-07-11T09:00:00
+2020-08-08T09:00:00
+2020-09-12T09:00:00
+2020-10-10T09:00:00
+2020-11-07T09:00:00
+2020-12-12T09:00:00
+2021-01-09T09:00:00
+2021-02-13T09:00:00
+2021-03-13T09:00:00
+2021-04-10T09:00:00
+2021-05-08T09:00:00
+2021-06-12T09:00:00
+2021-07-10T09:00:00
+2021-08-07T09:00:00
+2021-09-11T09:00:00
+2021-10-09T09:00:00
+2021-11-13T09:00:00
+2021-12-11T09:00:00
+2022-01-08T09:00:00
+2022-02-12T09:00:00
+2022-03-12T09:00:00
+2022-04-09T09:00:00
+2022-05-07T09:00:00
+2022-06-11T09:00:00
+2022-07-09T09:00:00
+2022-08-13T09:00:00
+2022-09-10T09:00:00
+2022-10-08T09:00:00
+2022-11-12T09:00:00
+2022-12-10T09:00:00
+2023-01-07T09:00:00
+2023-02-11T09:00:00
+2023-03-11T09:00:00
+2023-04-08T09:00:00
+2023-05-13T09:00:00
+2023-06-10T09:00:00
+2023-07-08T09:00:00
+2023-08-12T09:00:00
+2023-09-09T09:00:00
+2023-10-07T09:00:00
+2023-11-11T09:00:00
+2023-12-09T09:00:00
+2024-01-13T09:00:00
+2024-02-10T09:00:00
+2024-03-09T09:00:00
+2024-04-13T09:00:00
+2024-05-11T09:00:00
+2024-06-08T09:00:00
+2024-07-13T09:00:00
+2024-08-10T09:00:00
+2024-09-07T09:00:00
+2024-10-12T09:00:00
+2024-11-09T09:00:00
+2024-12-07T09:00:00
+2025-01-11T09:00:00
+2025-02-08T09:00:00
+2025-03-08T09:00:00
+2025-04-12T09:00:00
+2025-05-10T09:00:00
+2025-06-07T09:00:00
+2025-07-12T09:00:00
+2025-08-09T09:00:00
+2025-09-13T09:00:00
+2025-10-11T09:00:00
+2025-11-08T09:00:00
+2025-12-13T09:00:00
+2026-01-10T09:00:00
+2026-02-07T09:00:00
+2026-03-07T09:00:00
+2026-04-11T09:00:00
+2026-05-09T09:00:00
+2026-06-13T09:00:00
+2026-07-11T09:00:00
+2026-08-08T09:00:00
+2026-09-12T09:00:00
+2026-10-10T09:00:00
+2026-11-07T09:00:00
+2026-12-12T09:00:00
+2027-01-09T09:00:00
+2027-02-13T09:00:00
+2027-03-13T09:00:00
+2027-04-10T09:00:00
+2027-05-08T09:00:00
+2027-06-12T09:00:00
+2027-07-10T09:00:00
+2027-08-07T09:00:00
+2027-09-11T09:00:00
+2027-10-09T09:00:00
+2027-11-13T09:00:00
+2027-12-11T09:00:00
+2028-01-08T09:00:00
+2028-02-12T09:00:00
+2028-03-11T09:00:00
+2028-04-08T09:00:00
+2028-05-13T09:00:00
+2028-06-10T09:00:00
+2028-07-08T09:00:00
+2028-08-12T09:00:00
+2028-09-09T09:00:00
+2028-10-07T09:00:00
+2028-11-11T09:00:00
+2028-12-09T09:00:00
+2029-01-13T09:00:00
+2029-02-10T09:00:00
+2029-03-10T09:00:00
+2029-04-07T09:00:00
+2029-05-12T09:00:00
+2029-06-09T09:00:00
+2029-07-07T09:00:00
+2029-08-11T09:00:00
+2029-09-08T09:00:00
+2029-10-13T09:00:00
+2029-11-10T09:00:00
+2029-12-08T09:00:00
+2030-01-12T09:00:00
+2030-02-09T09:00:00
+2030-03-09T09:00:00
+2030-04-13T09:00:00
+2030-05-11T09:00:00
+2030-06-08T09:00:00
+2030-07-13T09:00:00
+2030-08-10T09:00:00
+2030-09-07T09:00:00
+2030-10-12T09:00:00
+2030-11-09T09:00:00
+2030-12-07T09:00:00
+2031-01-11T09:00:00
+2031-02-08T09:00:00
+2031-03-08T09:00:00
+2031-04-12T09:00:00
+2031-05-10T09:00:00
+2031-06-07T09:00:00
+2031-07-12T09:00:00
+2031-08-09T09:00:00
+2031-09-13T09:00:00
+2031-10-11T09:00:00
+2031-11-08T09:00:00
+2031-12-13T09:00:00
+2032-01-10T09:00:00
+2032-02-07T09:00:00
+2032-03-13T09:00:00
+2032-04-10T09:00:00
+2032-05-08T09:00:00
+2032-06-12T09:00:00
+2032-07-10T09:00:00
+2032-08-07T09:00:00
+2032-09-11T09:00:00
+2032-10-09T09:00:00
+2032-11-13T09:00:00
+2032-12-11T09:00:00
+2033-01-08T09:00:00
+2033-02-12T09:00:00
+2033-03-12T09:00:00
+2033-04-09T09:00:00
+2033-05-07T09:00:00
+2033-06-11T09:00:00
+2033-07-09T09:00:00
+2033-08-13T09:00:00
+2033-09-10T09:00:00
+2033-10-08T09:00:00
+2033-11-12T09:00:00
+2033-12-10T09:00:00
+2034-01-07T09:00:00
+2034-02-11T09:00:00
+2034-03-11T09:00:00
+2034-04-08T09:00:00
+2034-05-13T09:00:00
+2034-06-10T09:00:00
+2034-07-08T09:00:00
+2034-08-12T09:00:00
+2034-09-09T09:00:00
+2034-10-07T09:00:00
+2034-11-11T09:00:00
+2034-12-09T09:00:00
+2035-01-13T09:00:00
+2035-02-10T09:00:00
+2035-03-10T09:00:00
+2035-04-07T09:00:00
+2035-05-12T09:00:00
+2035-06-09T09:00:00
+2035-07-07T09:00:00
+2035-08-11T09:00:00
+2035-09-08T09:00:00
+2035-10-13T09:00:00
+2035-11-10T09:00:00
+2035-12-08T09:00:00
+2036-01-12T09:00:00
+2036-02-09T09:00:00
+2036-03-08T09:00:00
+2036-04-12T09:00:00
+2036-05-10T09:00:00
+2036-06-07T09:00:00
+2036-07-12T09:00:00
+2036-08-09T09:00:00
+2036-09-13T09:00:00
+2036-10-11T09:00:00
+2036-11-08T09:00:00
+2036-12-13T09:00:00
+2037-01-10T09:00:00
+2037-02-07T09:00:00
+2037-03-07T09:00:00
+2037-04-11T09:00:00
+2037-05-09T09:00:00
+2037-06-13T09:00:00
+2037-07-11T09:00:00
+2037-08-08T09:00:00
+2037-09-12T09:00:00
+2037-10-10T09:00:00
+2037-11-07T09:00:00
+2037-12-12T09:00:00
+2038-01-09T09:00:00
+2038-02-13T09:00:00
+2038-03-13T09:00:00
+2038-04-10T09:00:00
+2038-05-08T09:00:00
+2038-06-12T09:00:00
+2038-07-10T09:00:00
+2038-08-07T09:00:00
+2038-09-11T09:00:00
+2038-10-09T09:00:00
+2038-11-13T09:00:00
+2038-12-11T09:00:00
+2039-01-08T09:00:00
+2039-02-12T09:00:00
+2039-03-12T09:00:00
+2039-04-09T09:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase31.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase31.ics.prev.ref
new file mode 100644
index 00000000..e2f960ea
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase31.ics.prev.ref
@@ -0,0 +1,161 @@
+2010-12-11T09:00:00
+2010-11-13T09:00:00
+2010-10-09T09:00:00
+2010-09-11T09:00:00
+2010-08-07T09:00:00
+2010-07-10T09:00:00
+2010-06-12T09:00:00
+2010-05-08T09:00:00
+2010-04-10T09:00:00
+2010-03-13T09:00:00
+2010-02-13T09:00:00
+2010-01-09T09:00:00
+2009-12-12T09:00:00
+2009-11-07T09:00:00
+2009-10-10T09:00:00
+2009-09-12T09:00:00
+2009-08-08T09:00:00
+2009-07-11T09:00:00
+2009-06-13T09:00:00
+2009-05-09T09:00:00
+2009-04-11T09:00:00
+2009-03-07T09:00:00
+2009-02-07T09:00:00
+2009-01-10T09:00:00
+2008-12-13T09:00:00
+2008-11-08T09:00:00
+2008-10-11T09:00:00
+2008-09-13T09:00:00
+2008-08-09T09:00:00
+2008-07-12T09:00:00
+2008-06-07T09:00:00
+2008-05-10T09:00:00
+2008-04-12T09:00:00
+2008-03-08T09:00:00
+2008-02-09T09:00:00
+2008-01-12T09:00:00
+2007-12-08T09:00:00
+2007-11-10T09:00:00
+2007-10-13T09:00:00
+2007-09-08T09:00:00
+2007-08-11T09:00:00
+2007-07-07T09:00:00
+2007-06-09T09:00:00
+2007-05-12T09:00:00
+2007-04-07T09:00:00
+2007-03-10T09:00:00
+2007-02-10T09:00:00
+2007-01-13T09:00:00
+2006-12-09T09:00:00
+2006-11-11T09:00:00
+2006-10-07T09:00:00
+2006-09-09T09:00:00
+2006-08-12T09:00:00
+2006-07-08T09:00:00
+2006-06-10T09:00:00
+2006-05-13T09:00:00
+2006-04-08T09:00:00
+2006-03-11T09:00:00
+2006-02-11T09:00:00
+2006-01-07T09:00:00
+2005-12-10T09:00:00
+2005-11-12T09:00:00
+2005-10-08T09:00:00
+2005-09-10T09:00:00
+2005-08-13T09:00:00
+2005-07-09T09:00:00
+2005-06-11T09:00:00
+2005-05-07T09:00:00
+2005-04-09T09:00:00
+2005-03-12T09:00:00
+2005-02-12T09:00:00
+2005-01-08T09:00:00
+2004-12-11T09:00:00
+2004-11-13T09:00:00
+2004-10-09T09:00:00
+2004-09-11T09:00:00
+2004-08-07T09:00:00
+2004-07-10T09:00:00
+2004-06-12T09:00:00
+2004-05-08T09:00:00
+2004-04-10T09:00:00
+2004-03-13T09:00:00
+2004-02-07T09:00:00
+2004-01-10T09:00:00
+2003-12-13T09:00:00
+2003-11-08T09:00:00
+2003-10-11T09:00:00
+2003-09-13T09:00:00
+2003-08-09T09:00:00
+2003-07-12T09:00:00
+2003-06-07T09:00:00
+2003-05-10T09:00:00
+2003-04-12T09:00:00
+2003-03-08T09:00:00
+2003-02-08T09:00:00
+2003-01-11T09:00:00
+2002-12-07T09:00:00
+2002-11-09T09:00:00
+2002-10-12T09:00:00
+2002-09-07T09:00:00
+2002-08-10T09:00:00
+2002-07-13T09:00:00
+2002-06-08T09:00:00
+2002-05-11T09:00:00
+2002-04-13T09:00:00
+2002-03-09T09:00:00
+2002-02-09T09:00:00
+2002-01-12T09:00:00
+2001-12-08T09:00:00
+2001-11-10T09:00:00
+2001-10-13T09:00:00
+2001-09-08T09:00:00
+2001-08-11T09:00:00
+2001-07-07T09:00:00
+2001-06-09T09:00:00
+2001-05-12T09:00:00
+2001-04-07T09:00:00
+2001-03-10T09:00:00
+2001-02-10T09:00:00
+2001-01-13T09:00:00
+2000-12-09T09:00:00
+2000-11-11T09:00:00
+2000-10-07T09:00:00
+2000-09-09T09:00:00
+2000-08-12T09:00:00
+2000-07-08T09:00:00
+2000-06-10T09:00:00
+2000-05-13T09:00:00
+2000-04-08T09:00:00
+2000-03-11T09:00:00
+2000-02-12T09:00:00
+2000-01-08T09:00:00
+1999-12-11T09:00:00
+1999-11-13T09:00:00
+1999-10-09T09:00:00
+1999-09-11T09:00:00
+1999-08-07T09:00:00
+1999-07-10T09:00:00
+1999-06-12T09:00:00
+1999-05-08T09:00:00
+1999-04-10T09:00:00
+1999-03-13T09:00:00
+1999-02-13T09:00:00
+1999-01-09T09:00:00
+1998-12-12T09:00:00
+1998-11-07T09:00:00
+1998-10-10T09:00:00
+1998-09-12T09:00:00
+1998-08-08T09:00:00
+1998-07-11T09:00:00
+1998-06-13T09:00:00
+1998-05-09T09:00:00
+1998-04-11T09:00:00
+1998-03-07T09:00:00
+1998-02-07T09:00:00
+1998-01-10T09:00:00
+1997-12-13T09:00:00
+1997-11-08T09:00:00
+1997-10-11T09:00:00
+1997-09-13T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase31.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase31.ics.recurson.ref
new file mode 100644
index 00000000..13f256bf
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase31.ics.recurson.ref
@@ -0,0 +1,160 @@
+1997-09-13
+1997-10-11
+1997-11-08
+1997-12-13
+1998-01-10
+1998-02-07
+1998-03-07
+1998-04-11
+1998-05-09
+1998-06-13
+1998-07-11
+1998-08-08
+1998-09-12
+1998-10-10
+1998-11-07
+1998-12-12
+1999-01-09
+1999-02-13
+1999-03-13
+1999-04-10
+1999-05-08
+1999-06-12
+1999-07-10
+1999-08-07
+1999-09-11
+1999-10-09
+1999-11-13
+1999-12-11
+2000-01-08
+2000-02-12
+2000-03-11
+2000-04-08
+2000-05-13
+2000-06-10
+2000-07-08
+2000-08-12
+2000-09-09
+2000-10-07
+2000-11-11
+2000-12-09
+2001-01-13
+2001-02-10
+2001-03-10
+2001-04-07
+2001-05-12
+2001-06-09
+2001-07-07
+2001-08-11
+2001-09-08
+2001-10-13
+2001-11-10
+2001-12-08
+2002-01-12
+2002-02-09
+2002-03-09
+2002-04-13
+2002-05-11
+2002-06-08
+2002-07-13
+2002-08-10
+2002-09-07
+2002-10-12
+2002-11-09
+2002-12-07
+2003-01-11
+2003-02-08
+2003-03-08
+2003-04-12
+2003-05-10
+2003-06-07
+2003-07-12
+2003-08-09
+2003-09-13
+2003-10-11
+2003-11-08
+2003-12-13
+2004-01-10
+2004-02-07
+2004-03-13
+2004-04-10
+2004-05-08
+2004-06-12
+2004-07-10
+2004-08-07
+2004-09-11
+2004-10-09
+2004-11-13
+2004-12-11
+2005-01-08
+2005-02-12
+2005-03-12
+2005-04-09
+2005-05-07
+2005-06-11
+2005-07-09
+2005-08-13
+2005-09-10
+2005-10-08
+2005-11-12
+2005-12-10
+2006-01-07
+2006-02-11
+2006-03-11
+2006-04-08
+2006-05-13
+2006-06-10
+2006-07-08
+2006-08-12
+2006-09-09
+2006-10-07
+2006-11-11
+2006-12-09
+2007-01-13
+2007-02-10
+2007-03-10
+2007-04-07
+2007-05-12
+2007-06-09
+2007-07-07
+2007-08-11
+2007-09-08
+2007-10-13
+2007-11-10
+2007-12-08
+2008-01-12
+2008-02-09
+2008-03-08
+2008-04-12
+2008-05-10
+2008-06-07
+2008-07-12
+2008-08-09
+2008-09-13
+2008-10-11
+2008-11-08
+2008-12-13
+2009-01-10
+2009-02-07
+2009-03-07
+2009-04-11
+2009-05-09
+2009-06-13
+2009-07-11
+2009-08-08
+2009-09-12
+2009-10-10
+2009-11-07
+2009-12-12
+2010-01-09
+2010-02-13
+2010-03-13
+2010-04-10
+2010-05-08
+2010-06-12
+2010-07-10
+2010-08-07
+2010-09-11
+2010-10-09
+2010-11-13
+2010-12-11
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase32.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase32.ics
new file mode 100644
index 00000000..7f3ce95a
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase32.ics
@@ -0,0 +1,34 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Every four years\, the first Tuesday after a Monday in Novembe
+ r\,forever (U.S. Presidential Election day):
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19961105T090000
+RRULE:FREQ=YEARLY;INTERVAL=4;BYDAY=TU;BYMONTHDAY=2,3,4,5,6,7,8;BYMONTH=11
+SUMMARY:RExample30
+UID:RExample30
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase32.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase32.ics.comp34.ref
new file mode 100644
index 00000000..c15e41d4
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase32.ics.comp34.ref
@@ -0,0 +1,2 @@
+1996-11-05T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase32.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase32.ics.next.ref
new file mode 100644
index 00000000..e7f7b008
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase32.ics.next.ref
@@ -0,0 +1,500 @@
+1996-11-05T09:00:00
+2000-11-07T09:00:00
+2004-11-02T09:00:00
+2008-11-04T09:00:00
+2012-11-06T09:00:00
+2016-11-08T09:00:00
+2020-11-03T09:00:00
+2024-11-05T09:00:00
+2028-11-07T09:00:00
+2032-11-02T09:00:00
+2036-11-04T09:00:00
+2040-11-06T09:00:00
+2044-11-08T09:00:00
+2048-11-03T09:00:00
+2052-11-05T09:00:00
+2056-11-07T09:00:00
+2060-11-02T09:00:00
+2064-11-04T09:00:00
+2068-11-06T09:00:00
+2072-11-08T09:00:00
+2076-11-03T09:00:00
+2080-11-05T09:00:00
+2084-11-07T09:00:00
+2088-11-02T09:00:00
+2092-11-04T09:00:00
+2096-11-06T09:00:00
+2100-11-02T09:00:00
+2104-11-04T09:00:00
+2108-11-06T09:00:00
+2112-11-08T09:00:00
+2116-11-03T09:00:00
+2120-11-05T09:00:00
+2124-11-07T09:00:00
+2128-11-02T09:00:00
+2132-11-04T09:00:00
+2136-11-06T09:00:00
+2140-11-08T09:00:00
+2144-11-03T09:00:00
+2148-11-05T09:00:00
+2152-11-07T09:00:00
+2156-11-02T09:00:00
+2160-11-04T09:00:00
+2164-11-06T09:00:00
+2168-11-08T09:00:00
+2172-11-03T09:00:00
+2176-11-05T09:00:00
+2180-11-07T09:00:00
+2184-11-02T09:00:00
+2188-11-04T09:00:00
+2192-11-06T09:00:00
+2196-11-08T09:00:00
+2200-11-04T09:00:00
+2204-11-06T09:00:00
+2208-11-08T09:00:00
+2212-11-03T09:00:00
+2216-11-05T09:00:00
+2220-11-07T09:00:00
+2224-11-02T09:00:00
+2228-11-04T09:00:00
+2232-11-06T09:00:00
+2236-11-08T09:00:00
+2240-11-03T09:00:00
+2244-11-05T09:00:00
+2248-11-07T09:00:00
+2252-11-02T09:00:00
+2256-11-04T09:00:00
+2260-11-06T09:00:00
+2264-11-08T09:00:00
+2268-11-03T09:00:00
+2272-11-05T09:00:00
+2276-11-07T09:00:00
+2280-11-02T09:00:00
+2284-11-04T09:00:00
+2288-11-06T09:00:00
+2292-11-08T09:00:00
+2296-11-03T09:00:00
+2300-11-06T09:00:00
+2304-11-08T09:00:00
+2308-11-03T09:00:00
+2312-11-05T09:00:00
+2316-11-07T09:00:00
+2320-11-02T09:00:00
+2324-11-04T09:00:00
+2328-11-06T09:00:00
+2332-11-08T09:00:00
+2336-11-03T09:00:00
+2340-11-05T09:00:00
+2344-11-07T09:00:00
+2348-11-02T09:00:00
+2352-11-04T09:00:00
+2356-11-06T09:00:00
+2360-11-08T09:00:00
+2364-11-03T09:00:00
+2368-11-05T09:00:00
+2372-11-07T09:00:00
+2376-11-02T09:00:00
+2380-11-04T09:00:00
+2384-11-06T09:00:00
+2388-11-08T09:00:00
+2392-11-03T09:00:00
+2396-11-05T09:00:00
+2400-11-07T09:00:00
+2404-11-02T09:00:00
+2408-11-04T09:00:00
+2412-11-06T09:00:00
+2416-11-08T09:00:00
+2420-11-03T09:00:00
+2424-11-05T09:00:00
+2428-11-07T09:00:00
+2432-11-02T09:00:00
+2436-11-04T09:00:00
+2440-11-06T09:00:00
+2444-11-08T09:00:00
+2448-11-03T09:00:00
+2452-11-05T09:00:00
+2456-11-07T09:00:00
+2460-11-02T09:00:00
+2464-11-04T09:00:00
+2468-11-06T09:00:00
+2472-11-08T09:00:00
+2476-11-03T09:00:00
+2480-11-05T09:00:00
+2484-11-07T09:00:00
+2488-11-02T09:00:00
+2492-11-04T09:00:00
+2496-11-06T09:00:00
+2500-11-02T09:00:00
+2504-11-04T09:00:00
+2508-11-06T09:00:00
+2512-11-08T09:00:00
+2516-11-03T09:00:00
+2520-11-05T09:00:00
+2524-11-07T09:00:00
+2528-11-02T09:00:00
+2532-11-04T09:00:00
+2536-11-06T09:00:00
+2540-11-08T09:00:00
+2544-11-03T09:00:00
+2548-11-05T09:00:00
+2552-11-07T09:00:00
+2556-11-02T09:00:00
+2560-11-04T09:00:00
+2564-11-06T09:00:00
+2568-11-08T09:00:00
+2572-11-03T09:00:00
+2576-11-05T09:00:00
+2580-11-07T09:00:00
+2584-11-02T09:00:00
+2588-11-04T09:00:00
+2592-11-06T09:00:00
+2596-11-08T09:00:00
+2600-11-04T09:00:00
+2604-11-06T09:00:00
+2608-11-08T09:00:00
+2612-11-03T09:00:00
+2616-11-05T09:00:00
+2620-11-07T09:00:00
+2624-11-02T09:00:00
+2628-11-04T09:00:00
+2632-11-06T09:00:00
+2636-11-08T09:00:00
+2640-11-03T09:00:00
+2644-11-05T09:00:00
+2648-11-07T09:00:00
+2652-11-02T09:00:00
+2656-11-04T09:00:00
+2660-11-06T09:00:00
+2664-11-08T09:00:00
+2668-11-03T09:00:00
+2672-11-05T09:00:00
+2676-11-07T09:00:00
+2680-11-02T09:00:00
+2684-11-04T09:00:00
+2688-11-06T09:00:00
+2692-11-08T09:00:00
+2696-11-03T09:00:00
+2700-11-06T09:00:00
+2704-11-08T09:00:00
+2708-11-03T09:00:00
+2712-11-05T09:00:00
+2716-11-07T09:00:00
+2720-11-02T09:00:00
+2724-11-04T09:00:00
+2728-11-06T09:00:00
+2732-11-08T09:00:00
+2736-11-03T09:00:00
+2740-11-05T09:00:00
+2744-11-07T09:00:00
+2748-11-02T09:00:00
+2752-11-04T09:00:00
+2756-11-06T09:00:00
+2760-11-08T09:00:00
+2764-11-03T09:00:00
+2768-11-05T09:00:00
+2772-11-07T09:00:00
+2776-11-02T09:00:00
+2780-11-04T09:00:00
+2784-11-06T09:00:00
+2788-11-08T09:00:00
+2792-11-03T09:00:00
+2796-11-05T09:00:00
+2800-11-07T09:00:00
+2804-11-02T09:00:00
+2808-11-04T09:00:00
+2812-11-06T09:00:00
+2816-11-08T09:00:00
+2820-11-03T09:00:00
+2824-11-05T09:00:00
+2828-11-07T09:00:00
+2832-11-02T09:00:00
+2836-11-04T09:00:00
+2840-11-06T09:00:00
+2844-11-08T09:00:00
+2848-11-03T09:00:00
+2852-11-05T09:00:00
+2856-11-07T09:00:00
+2860-11-02T09:00:00
+2864-11-04T09:00:00
+2868-11-06T09:00:00
+2872-11-08T09:00:00
+2876-11-03T09:00:00
+2880-11-05T09:00:00
+2884-11-07T09:00:00
+2888-11-02T09:00:00
+2892-11-04T09:00:00
+2896-11-06T09:00:00
+2900-11-02T09:00:00
+2904-11-04T09:00:00
+2908-11-06T09:00:00
+2912-11-08T09:00:00
+2916-11-03T09:00:00
+2920-11-05T09:00:00
+2924-11-07T09:00:00
+2928-11-02T09:00:00
+2932-11-04T09:00:00
+2936-11-06T09:00:00
+2940-11-08T09:00:00
+2944-11-03T09:00:00
+2948-11-05T09:00:00
+2952-11-07T09:00:00
+2956-11-02T09:00:00
+2960-11-04T09:00:00
+2964-11-06T09:00:00
+2968-11-08T09:00:00
+2972-11-03T09:00:00
+2976-11-05T09:00:00
+2980-11-07T09:00:00
+2984-11-02T09:00:00
+2988-11-04T09:00:00
+2992-11-06T09:00:00
+2996-11-08T09:00:00
+3000-11-04T09:00:00
+3004-11-06T09:00:00
+3008-11-08T09:00:00
+3012-11-03T09:00:00
+3016-11-05T09:00:00
+3020-11-07T09:00:00
+3024-11-02T09:00:00
+3028-11-04T09:00:00
+3032-11-06T09:00:00
+3036-11-08T09:00:00
+3040-11-03T09:00:00
+3044-11-05T09:00:00
+3048-11-07T09:00:00
+3052-11-02T09:00:00
+3056-11-04T09:00:00
+3060-11-06T09:00:00
+3064-11-08T09:00:00
+3068-11-03T09:00:00
+3072-11-05T09:00:00
+3076-11-07T09:00:00
+3080-11-02T09:00:00
+3084-11-04T09:00:00
+3088-11-06T09:00:00
+3092-11-08T09:00:00
+3096-11-03T09:00:00
+3100-11-06T09:00:00
+3104-11-08T09:00:00
+3108-11-03T09:00:00
+3112-11-05T09:00:00
+3116-11-07T09:00:00
+3120-11-02T09:00:00
+3124-11-04T09:00:00
+3128-11-06T09:00:00
+3132-11-08T09:00:00
+3136-11-03T09:00:00
+3140-11-05T09:00:00
+3144-11-07T09:00:00
+3148-11-02T09:00:00
+3152-11-04T09:00:00
+3156-11-06T09:00:00
+3160-11-08T09:00:00
+3164-11-03T09:00:00
+3168-11-05T09:00:00
+3172-11-07T09:00:00
+3176-11-02T09:00:00
+3180-11-04T09:00:00
+3184-11-06T09:00:00
+3188-11-08T09:00:00
+3192-11-03T09:00:00
+3196-11-05T09:00:00
+3200-11-07T09:00:00
+3204-11-02T09:00:00
+3208-11-04T09:00:00
+3212-11-06T09:00:00
+3216-11-08T09:00:00
+3220-11-03T09:00:00
+3224-11-05T09:00:00
+3228-11-07T09:00:00
+3232-11-02T09:00:00
+3236-11-04T09:00:00
+3240-11-06T09:00:00
+3244-11-08T09:00:00
+3248-11-03T09:00:00
+3252-11-05T09:00:00
+3256-11-07T09:00:00
+3260-11-02T09:00:00
+3264-11-04T09:00:00
+3268-11-06T09:00:00
+3272-11-08T09:00:00
+3276-11-03T09:00:00
+3280-11-05T09:00:00
+3284-11-07T09:00:00
+3288-11-02T09:00:00
+3292-11-04T09:00:00
+3296-11-06T09:00:00
+3300-11-02T09:00:00
+3304-11-04T09:00:00
+3308-11-06T09:00:00
+3312-11-08T09:00:00
+3316-11-03T09:00:00
+3320-11-05T09:00:00
+3324-11-07T09:00:00
+3328-11-02T09:00:00
+3332-11-04T09:00:00
+3336-11-06T09:00:00
+3340-11-08T09:00:00
+3344-11-03T09:00:00
+3348-11-05T09:00:00
+3352-11-07T09:00:00
+3356-11-02T09:00:00
+3360-11-04T09:00:00
+3364-11-06T09:00:00
+3368-11-08T09:00:00
+3372-11-03T09:00:00
+3376-11-05T09:00:00
+3380-11-07T09:00:00
+3384-11-02T09:00:00
+3388-11-04T09:00:00
+3392-11-06T09:00:00
+3396-11-08T09:00:00
+3400-11-04T09:00:00
+3404-11-06T09:00:00
+3408-11-08T09:00:00
+3412-11-03T09:00:00
+3416-11-05T09:00:00
+3420-11-07T09:00:00
+3424-11-02T09:00:00
+3428-11-04T09:00:00
+3432-11-06T09:00:00
+3436-11-08T09:00:00
+3440-11-03T09:00:00
+3444-11-05T09:00:00
+3448-11-07T09:00:00
+3452-11-02T09:00:00
+3456-11-04T09:00:00
+3460-11-06T09:00:00
+3464-11-08T09:00:00
+3468-11-03T09:00:00
+3472-11-05T09:00:00
+3476-11-07T09:00:00
+3480-11-02T09:00:00
+3484-11-04T09:00:00
+3488-11-06T09:00:00
+3492-11-08T09:00:00
+3496-11-03T09:00:00
+3500-11-06T09:00:00
+3504-11-08T09:00:00
+3508-11-03T09:00:00
+3512-11-05T09:00:00
+3516-11-07T09:00:00
+3520-11-02T09:00:00
+3524-11-04T09:00:00
+3528-11-06T09:00:00
+3532-11-08T09:00:00
+3536-11-03T09:00:00
+3540-11-05T09:00:00
+3544-11-07T09:00:00
+3548-11-02T09:00:00
+3552-11-04T09:00:00
+3556-11-06T09:00:00
+3560-11-08T09:00:00
+3564-11-03T09:00:00
+3568-11-05T09:00:00
+3572-11-07T09:00:00
+3576-11-02T09:00:00
+3580-11-04T09:00:00
+3584-11-06T09:00:00
+3588-11-08T09:00:00
+3592-11-03T09:00:00
+3596-11-05T09:00:00
+3600-11-07T09:00:00
+3604-11-02T09:00:00
+3608-11-04T09:00:00
+3612-11-06T09:00:00
+3616-11-08T09:00:00
+3620-11-03T09:00:00
+3624-11-05T09:00:00
+3628-11-07T09:00:00
+3632-11-02T09:00:00
+3636-11-04T09:00:00
+3640-11-06T09:00:00
+3644-11-08T09:00:00
+3648-11-03T09:00:00
+3652-11-05T09:00:00
+3656-11-07T09:00:00
+3660-11-02T09:00:00
+3664-11-04T09:00:00
+3668-11-06T09:00:00
+3672-11-08T09:00:00
+3676-11-03T09:00:00
+3680-11-05T09:00:00
+3684-11-07T09:00:00
+3688-11-02T09:00:00
+3692-11-04T09:00:00
+3696-11-06T09:00:00
+3700-11-02T09:00:00
+3704-11-04T09:00:00
+3708-11-06T09:00:00
+3712-11-08T09:00:00
+3716-11-03T09:00:00
+3720-11-05T09:00:00
+3724-11-07T09:00:00
+3728-11-02T09:00:00
+3732-11-04T09:00:00
+3736-11-06T09:00:00
+3740-11-08T09:00:00
+3744-11-03T09:00:00
+3748-11-05T09:00:00
+3752-11-07T09:00:00
+3756-11-02T09:00:00
+3760-11-04T09:00:00
+3764-11-06T09:00:00
+3768-11-08T09:00:00
+3772-11-03T09:00:00
+3776-11-05T09:00:00
+3780-11-07T09:00:00
+3784-11-02T09:00:00
+3788-11-04T09:00:00
+3792-11-06T09:00:00
+3796-11-08T09:00:00
+3800-11-04T09:00:00
+3804-11-06T09:00:00
+3808-11-08T09:00:00
+3812-11-03T09:00:00
+3816-11-05T09:00:00
+3820-11-07T09:00:00
+3824-11-02T09:00:00
+3828-11-04T09:00:00
+3832-11-06T09:00:00
+3836-11-08T09:00:00
+3840-11-03T09:00:00
+3844-11-05T09:00:00
+3848-11-07T09:00:00
+3852-11-02T09:00:00
+3856-11-04T09:00:00
+3860-11-06T09:00:00
+3864-11-08T09:00:00
+3868-11-03T09:00:00
+3872-11-05T09:00:00
+3876-11-07T09:00:00
+3880-11-02T09:00:00
+3884-11-04T09:00:00
+3888-11-06T09:00:00
+3892-11-08T09:00:00
+3896-11-03T09:00:00
+3900-11-06T09:00:00
+3904-11-08T09:00:00
+3908-11-03T09:00:00
+3912-11-05T09:00:00
+3916-11-07T09:00:00
+3920-11-02T09:00:00
+3924-11-04T09:00:00
+3928-11-06T09:00:00
+3932-11-08T09:00:00
+3936-11-03T09:00:00
+3940-11-05T09:00:00
+3944-11-07T09:00:00
+3948-11-02T09:00:00
+3952-11-04T09:00:00
+3956-11-06T09:00:00
+3960-11-08T09:00:00
+3964-11-03T09:00:00
+3968-11-05T09:00:00
+3972-11-07T09:00:00
+3976-11-02T09:00:00
+3980-11-04T09:00:00
+3984-11-06T09:00:00
+3988-11-08T09:00:00
+3992-11-03T09:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase32.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase32.ics.prev.ref
new file mode 100644
index 00000000..442d42d3
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase32.ics.prev.ref
@@ -0,0 +1,5 @@
+2008-11-04T09:00:00
+2004-11-02T09:00:00
+2000-11-07T09:00:00
+1996-11-05T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase32.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase32.ics.recurson.ref
new file mode 100644
index 00000000..df740f80
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase32.ics.recurson.ref
@@ -0,0 +1,4 @@
+1996-11-05
+2000-11-07
+2004-11-02
+2008-11-04
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase33.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase33.ics
new file mode 100644
index 00000000..4ce422bd
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase33.ics
@@ -0,0 +1,34 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:The 3rd instance into the month of one of Tuesday\, Wednesday
+ orThursday\, for the next 3 months:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970904T090000
+RRULE:FREQ=MONTHLY;COUNT=3;BYDAY=TU,WE,TH;BYSETPOS=3
+SUMMARY:RExample31
+UID:RExample31
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase33.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase33.ics.comp34.ref
new file mode 100644
index 00000000..8fbde600
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase33.ics.comp34.ref
@@ -0,0 +1,5 @@
+1997-09-04T09:00:00
+1997-09-16T09:00:00
+1997-09-17T09:00:00
+1997-09-18T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase33.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase33.ics.next.ref
new file mode 100644
index 00000000..182c99a1
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase33.ics.next.ref
@@ -0,0 +1,4 @@
+1997-09-04T09:00:00
+1997-10-07T09:00:00
+1997-11-06T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase33.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase33.ics.prev.ref
new file mode 100644
index 00000000..8eab6ec1
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase33.ics.prev.ref
@@ -0,0 +1,4 @@
+1997-11-06T09:00:00
+1997-10-07T09:00:00
+1997-09-04T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase33.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase33.ics.recurson.ref
new file mode 100644
index 00000000..49d86222
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase33.ics.recurson.ref
@@ -0,0 +1,4 @@
+1997-09-04
+1997-10-07
+1997-11-06
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase34.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase34.ics
new file mode 100644
index 00000000..98a144ca
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase34.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:The 2nd to last weekday of the month:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970929T090000
+RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2
+SUMMARY:RExample32
+UID:RExample32
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase34.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase34.ics.comp34.ref
new file mode 100644
index 00000000..126ed10d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase34.ics.comp34.ref
@@ -0,0 +1,500 @@
+1997-09-29T09:00:00
+1997-10-20T09:00:00
+1997-10-21T09:00:00
+1997-10-22T09:00:00
+1997-10-23T09:00:00
+1997-10-24T09:00:00
+1997-11-17T09:00:00
+1997-11-18T09:00:00
+1997-11-19T09:00:00
+1997-11-20T09:00:00
+1997-11-21T09:00:00
+1997-12-18T09:00:00
+1997-12-19T09:00:00
+1997-12-22T09:00:00
+1997-12-23T09:00:00
+1997-12-24T09:00:00
+1998-01-19T09:00:00
+1998-01-20T09:00:00
+1998-01-21T09:00:00
+1998-01-22T09:00:00
+1998-01-23T09:00:00
+1998-02-16T09:00:00
+1998-02-17T09:00:00
+1998-02-18T09:00:00
+1998-02-19T09:00:00
+1998-02-20T09:00:00
+1998-03-18T09:00:00
+1998-03-19T09:00:00
+1998-03-20T09:00:00
+1998-03-23T09:00:00
+1998-03-24T09:00:00
+1998-04-17T09:00:00
+1998-04-20T09:00:00
+1998-04-21T09:00:00
+1998-04-22T09:00:00
+1998-04-23T09:00:00
+1998-05-18T09:00:00
+1998-05-19T09:00:00
+1998-05-20T09:00:00
+1998-05-21T09:00:00
+1998-05-22T09:00:00
+1998-06-17T09:00:00
+1998-06-18T09:00:00
+1998-06-19T09:00:00
+1998-06-22T09:00:00
+1998-06-23T09:00:00
+1998-07-20T09:00:00
+1998-07-21T09:00:00
+1998-07-22T09:00:00
+1998-07-23T09:00:00
+1998-07-24T09:00:00
+1998-08-18T09:00:00
+1998-08-19T09:00:00
+1998-08-20T09:00:00
+1998-08-21T09:00:00
+1998-08-24T09:00:00
+1998-09-17T09:00:00
+1998-09-18T09:00:00
+1998-09-21T09:00:00
+1998-09-22T09:00:00
+1998-09-23T09:00:00
+1998-10-19T09:00:00
+1998-10-20T09:00:00
+1998-10-21T09:00:00
+1998-10-22T09:00:00
+1998-10-23T09:00:00
+1998-11-17T09:00:00
+1998-11-18T09:00:00
+1998-11-19T09:00:00
+1998-11-20T09:00:00
+1998-11-23T09:00:00
+1998-12-18T09:00:00
+1998-12-21T09:00:00
+1998-12-22T09:00:00
+1998-12-23T09:00:00
+1998-12-24T09:00:00
+1999-01-18T09:00:00
+1999-01-19T09:00:00
+1999-01-20T09:00:00
+1999-01-21T09:00:00
+1999-01-22T09:00:00
+1999-02-15T09:00:00
+1999-02-16T09:00:00
+1999-02-17T09:00:00
+1999-02-18T09:00:00
+1999-02-19T09:00:00
+1999-03-18T09:00:00
+1999-03-19T09:00:00
+1999-03-22T09:00:00
+1999-03-23T09:00:00
+1999-03-24T09:00:00
+1999-04-19T09:00:00
+1999-04-20T09:00:00
+1999-04-21T09:00:00
+1999-04-22T09:00:00
+1999-04-23T09:00:00
+1999-05-18T09:00:00
+1999-05-19T09:00:00
+1999-05-20T09:00:00
+1999-05-21T09:00:00
+1999-05-24T09:00:00
+1999-06-17T09:00:00
+1999-06-18T09:00:00
+1999-06-21T09:00:00
+1999-06-22T09:00:00
+1999-06-23T09:00:00
+1999-07-19T09:00:00
+1999-07-20T09:00:00
+1999-07-21T09:00:00
+1999-07-22T09:00:00
+1999-07-23T09:00:00
+1999-08-18T09:00:00
+1999-08-19T09:00:00
+1999-08-20T09:00:00
+1999-08-23T09:00:00
+1999-08-24T09:00:00
+1999-09-17T09:00:00
+1999-09-20T09:00:00
+1999-09-21T09:00:00
+1999-09-22T09:00:00
+1999-09-23T09:00:00
+1999-10-18T09:00:00
+1999-10-19T09:00:00
+1999-10-20T09:00:00
+1999-10-21T09:00:00
+1999-10-22T09:00:00
+1999-11-17T09:00:00
+1999-11-18T09:00:00
+1999-11-19T09:00:00
+1999-11-22T09:00:00
+1999-11-23T09:00:00
+1999-12-20T09:00:00
+1999-12-21T09:00:00
+1999-12-22T09:00:00
+1999-12-23T09:00:00
+1999-12-24T09:00:00
+2000-01-18T09:00:00
+2000-01-19T09:00:00
+2000-01-20T09:00:00
+2000-01-21T09:00:00
+2000-01-24T09:00:00
+2000-02-16T09:00:00
+2000-02-17T09:00:00
+2000-02-18T09:00:00
+2000-02-21T09:00:00
+2000-02-22T09:00:00
+2000-03-20T09:00:00
+2000-03-21T09:00:00
+2000-03-22T09:00:00
+2000-03-23T09:00:00
+2000-03-24T09:00:00
+2000-04-17T09:00:00
+2000-04-18T09:00:00
+2000-04-19T09:00:00
+2000-04-20T09:00:00
+2000-04-21T09:00:00
+2000-05-18T09:00:00
+2000-05-19T09:00:00
+2000-05-22T09:00:00
+2000-05-23T09:00:00
+2000-05-24T09:00:00
+2000-06-19T09:00:00
+2000-06-20T09:00:00
+2000-06-21T09:00:00
+2000-06-22T09:00:00
+2000-06-23T09:00:00
+2000-07-18T09:00:00
+2000-07-19T09:00:00
+2000-07-20T09:00:00
+2000-07-21T09:00:00
+2000-07-24T09:00:00
+2000-08-18T09:00:00
+2000-08-21T09:00:00
+2000-08-22T09:00:00
+2000-08-23T09:00:00
+2000-08-24T09:00:00
+2000-09-18T09:00:00
+2000-09-19T09:00:00
+2000-09-20T09:00:00
+2000-09-21T09:00:00
+2000-09-22T09:00:00
+2000-10-18T09:00:00
+2000-10-19T09:00:00
+2000-10-20T09:00:00
+2000-10-23T09:00:00
+2000-10-24T09:00:00
+2000-11-17T09:00:00
+2000-11-20T09:00:00
+2000-11-21T09:00:00
+2000-11-22T09:00:00
+2000-11-23T09:00:00
+2000-12-18T09:00:00
+2000-12-19T09:00:00
+2000-12-20T09:00:00
+2000-12-21T09:00:00
+2000-12-22T09:00:00
+2001-01-18T09:00:00
+2001-01-19T09:00:00
+2001-01-22T09:00:00
+2001-01-23T09:00:00
+2001-01-24T09:00:00
+2001-02-15T09:00:00
+2001-02-16T09:00:00
+2001-02-19T09:00:00
+2001-02-20T09:00:00
+2001-02-21T09:00:00
+2001-03-19T09:00:00
+2001-03-20T09:00:00
+2001-03-21T09:00:00
+2001-03-22T09:00:00
+2001-03-23T09:00:00
+2001-04-17T09:00:00
+2001-04-18T09:00:00
+2001-04-19T09:00:00
+2001-04-20T09:00:00
+2001-04-23T09:00:00
+2001-05-18T09:00:00
+2001-05-21T09:00:00
+2001-05-22T09:00:00
+2001-05-23T09:00:00
+2001-05-24T09:00:00
+2001-06-18T09:00:00
+2001-06-19T09:00:00
+2001-06-20T09:00:00
+2001-06-21T09:00:00
+2001-06-22T09:00:00
+2001-07-18T09:00:00
+2001-07-19T09:00:00
+2001-07-20T09:00:00
+2001-07-23T09:00:00
+2001-07-24T09:00:00
+2001-08-20T09:00:00
+2001-08-21T09:00:00
+2001-08-22T09:00:00
+2001-08-23T09:00:00
+2001-08-24T09:00:00
+2001-09-17T09:00:00
+2001-09-18T09:00:00
+2001-09-19T09:00:00
+2001-09-20T09:00:00
+2001-09-21T09:00:00
+2001-10-18T09:00:00
+2001-10-19T09:00:00
+2001-10-22T09:00:00
+2001-10-23T09:00:00
+2001-10-24T09:00:00
+2001-11-19T09:00:00
+2001-11-20T09:00:00
+2001-11-21T09:00:00
+2001-11-22T09:00:00
+2001-11-23T09:00:00
+2001-12-18T09:00:00
+2001-12-19T09:00:00
+2001-12-20T09:00:00
+2001-12-21T09:00:00
+2001-12-24T09:00:00
+2002-01-18T09:00:00
+2002-01-21T09:00:00
+2002-01-22T09:00:00
+2002-01-23T09:00:00
+2002-01-24T09:00:00
+2002-02-15T09:00:00
+2002-02-18T09:00:00
+2002-02-19T09:00:00
+2002-02-20T09:00:00
+2002-02-21T09:00:00
+2002-03-18T09:00:00
+2002-03-19T09:00:00
+2002-03-20T09:00:00
+2002-03-21T09:00:00
+2002-03-22T09:00:00
+2002-04-17T09:00:00
+2002-04-18T09:00:00
+2002-04-19T09:00:00
+2002-04-22T09:00:00
+2002-04-23T09:00:00
+2002-05-20T09:00:00
+2002-05-21T09:00:00
+2002-05-22T09:00:00
+2002-05-23T09:00:00
+2002-05-24T09:00:00
+2002-06-17T09:00:00
+2002-06-18T09:00:00
+2002-06-19T09:00:00
+2002-06-20T09:00:00
+2002-06-21T09:00:00
+2002-07-18T09:00:00
+2002-07-19T09:00:00
+2002-07-22T09:00:00
+2002-07-23T09:00:00
+2002-07-24T09:00:00
+2002-08-19T09:00:00
+2002-08-20T09:00:00
+2002-08-21T09:00:00
+2002-08-22T09:00:00
+2002-08-23T09:00:00
+2002-09-17T09:00:00
+2002-09-18T09:00:00
+2002-09-19T09:00:00
+2002-09-20T09:00:00
+2002-09-23T09:00:00
+2002-10-18T09:00:00
+2002-10-21T09:00:00
+2002-10-22T09:00:00
+2002-10-23T09:00:00
+2002-10-24T09:00:00
+2002-11-18T09:00:00
+2002-11-19T09:00:00
+2002-11-20T09:00:00
+2002-11-21T09:00:00
+2002-11-22T09:00:00
+2002-12-18T09:00:00
+2002-12-19T09:00:00
+2002-12-20T09:00:00
+2002-12-23T09:00:00
+2002-12-24T09:00:00
+2003-01-20T09:00:00
+2003-01-21T09:00:00
+2003-01-22T09:00:00
+2003-01-23T09:00:00
+2003-01-24T09:00:00
+2003-02-17T09:00:00
+2003-02-18T09:00:00
+2003-02-19T09:00:00
+2003-02-20T09:00:00
+2003-02-21T09:00:00
+2003-03-18T09:00:00
+2003-03-19T09:00:00
+2003-03-20T09:00:00
+2003-03-21T09:00:00
+2003-03-24T09:00:00
+2003-04-17T09:00:00
+2003-04-18T09:00:00
+2003-04-21T09:00:00
+2003-04-22T09:00:00
+2003-04-23T09:00:00
+2003-05-19T09:00:00
+2003-05-20T09:00:00
+2003-05-21T09:00:00
+2003-05-22T09:00:00
+2003-05-23T09:00:00
+2003-06-17T09:00:00
+2003-06-18T09:00:00
+2003-06-19T09:00:00
+2003-06-20T09:00:00
+2003-06-23T09:00:00
+2003-07-18T09:00:00
+2003-07-21T09:00:00
+2003-07-22T09:00:00
+2003-07-23T09:00:00
+2003-07-24T09:00:00
+2003-08-18T09:00:00
+2003-08-19T09:00:00
+2003-08-20T09:00:00
+2003-08-21T09:00:00
+2003-08-22T09:00:00
+2003-09-17T09:00:00
+2003-09-18T09:00:00
+2003-09-19T09:00:00
+2003-09-22T09:00:00
+2003-09-23T09:00:00
+2003-10-20T09:00:00
+2003-10-21T09:00:00
+2003-10-22T09:00:00
+2003-10-23T09:00:00
+2003-10-24T09:00:00
+2003-11-17T09:00:00
+2003-11-18T09:00:00
+2003-11-19T09:00:00
+2003-11-20T09:00:00
+2003-11-21T09:00:00
+2003-12-18T09:00:00
+2003-12-19T09:00:00
+2003-12-22T09:00:00
+2003-12-23T09:00:00
+2003-12-24T09:00:00
+2004-01-19T09:00:00
+2004-01-20T09:00:00
+2004-01-21T09:00:00
+2004-01-22T09:00:00
+2004-01-23T09:00:00
+2004-02-16T09:00:00
+2004-02-17T09:00:00
+2004-02-18T09:00:00
+2004-02-19T09:00:00
+2004-02-20T09:00:00
+2004-03-18T09:00:00
+2004-03-19T09:00:00
+2004-03-22T09:00:00
+2004-03-23T09:00:00
+2004-03-24T09:00:00
+2004-04-19T09:00:00
+2004-04-20T09:00:00
+2004-04-21T09:00:00
+2004-04-22T09:00:00
+2004-04-23T09:00:00
+2004-05-18T09:00:00
+2004-05-19T09:00:00
+2004-05-20T09:00:00
+2004-05-21T09:00:00
+2004-05-24T09:00:00
+2004-06-17T09:00:00
+2004-06-18T09:00:00
+2004-06-21T09:00:00
+2004-06-22T09:00:00
+2004-06-23T09:00:00
+2004-07-19T09:00:00
+2004-07-20T09:00:00
+2004-07-21T09:00:00
+2004-07-22T09:00:00
+2004-07-23T09:00:00
+2004-08-18T09:00:00
+2004-08-19T09:00:00
+2004-08-20T09:00:00
+2004-08-23T09:00:00
+2004-08-24T09:00:00
+2004-09-17T09:00:00
+2004-09-20T09:00:00
+2004-09-21T09:00:00
+2004-09-22T09:00:00
+2004-09-23T09:00:00
+2004-10-18T09:00:00
+2004-10-19T09:00:00
+2004-10-20T09:00:00
+2004-10-21T09:00:00
+2004-10-22T09:00:00
+2004-11-17T09:00:00
+2004-11-18T09:00:00
+2004-11-19T09:00:00
+2004-11-22T09:00:00
+2004-11-23T09:00:00
+2004-12-20T09:00:00
+2004-12-21T09:00:00
+2004-12-22T09:00:00
+2004-12-23T09:00:00
+2004-12-24T09:00:00
+2005-01-18T09:00:00
+2005-01-19T09:00:00
+2005-01-20T09:00:00
+2005-01-21T09:00:00
+2005-01-24T09:00:00
+2005-02-15T09:00:00
+2005-02-16T09:00:00
+2005-02-17T09:00:00
+2005-02-18T09:00:00
+2005-02-21T09:00:00
+2005-03-18T09:00:00
+2005-03-21T09:00:00
+2005-03-22T09:00:00
+2005-03-23T09:00:00
+2005-03-24T09:00:00
+2005-04-18T09:00:00
+2005-04-19T09:00:00
+2005-04-20T09:00:00
+2005-04-21T09:00:00
+2005-04-22T09:00:00
+2005-05-18T09:00:00
+2005-05-19T09:00:00
+2005-05-20T09:00:00
+2005-05-23T09:00:00
+2005-05-24T09:00:00
+2005-06-17T09:00:00
+2005-06-20T09:00:00
+2005-06-21T09:00:00
+2005-06-22T09:00:00
+2005-06-23T09:00:00
+2005-07-18T09:00:00
+2005-07-19T09:00:00
+2005-07-20T09:00:00
+2005-07-21T09:00:00
+2005-07-22T09:00:00
+2005-08-18T09:00:00
+2005-08-19T09:00:00
+2005-08-22T09:00:00
+2005-08-23T09:00:00
+2005-08-24T09:00:00
+2005-09-19T09:00:00
+2005-09-20T09:00:00
+2005-09-21T09:00:00
+2005-09-22T09:00:00
+2005-09-23T09:00:00
+2005-10-18T09:00:00
+2005-10-19T09:00:00
+2005-10-20T09:00:00
+2005-10-21T09:00:00
+2005-10-24T09:00:00
+2005-11-17T09:00:00
+2005-11-18T09:00:00
+2005-11-21T09:00:00
+2005-11-22T09:00:00
+2005-11-23T09:00:00
+2005-12-19T09:00:00
+2005-12-20T09:00:00
+2005-12-21T09:00:00
+2005-12-22T09:00:00
+2005-12-23T09:00:00
+2006-01-18T09:00:00
+2006-01-19T09:00:00
+2006-01-20T09:00:00
+2006-01-23T09:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase34.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase34.ics.next.ref
new file mode 100644
index 00000000..07bc90f8
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase34.ics.next.ref
@@ -0,0 +1,500 @@
+1997-09-29T09:00:00
+1997-10-30T09:00:00
+1997-11-27T09:00:00
+1997-12-30T09:00:00
+1998-01-29T09:00:00
+1998-02-26T09:00:00
+1998-03-30T09:00:00
+1998-04-29T09:00:00
+1998-05-28T09:00:00
+1998-06-29T09:00:00
+1998-07-30T09:00:00
+1998-08-28T09:00:00
+1998-09-29T09:00:00
+1998-10-29T09:00:00
+1998-11-27T09:00:00
+1998-12-30T09:00:00
+1999-01-28T09:00:00
+1999-02-25T09:00:00
+1999-03-30T09:00:00
+1999-04-29T09:00:00
+1999-05-28T09:00:00
+1999-06-29T09:00:00
+1999-07-29T09:00:00
+1999-08-30T09:00:00
+1999-09-29T09:00:00
+1999-10-28T09:00:00
+1999-11-29T09:00:00
+1999-12-30T09:00:00
+2000-01-28T09:00:00
+2000-02-28T09:00:00
+2000-03-30T09:00:00
+2000-04-27T09:00:00
+2000-05-30T09:00:00
+2000-06-29T09:00:00
+2000-07-28T09:00:00
+2000-08-30T09:00:00
+2000-09-28T09:00:00
+2000-10-30T09:00:00
+2000-11-29T09:00:00
+2000-12-28T09:00:00
+2001-01-30T09:00:00
+2001-02-27T09:00:00
+2001-03-29T09:00:00
+2001-04-27T09:00:00
+2001-05-30T09:00:00
+2001-06-28T09:00:00
+2001-07-30T09:00:00
+2001-08-30T09:00:00
+2001-09-27T09:00:00
+2001-10-30T09:00:00
+2001-11-29T09:00:00
+2001-12-28T09:00:00
+2002-01-30T09:00:00
+2002-02-27T09:00:00
+2002-03-28T09:00:00
+2002-04-29T09:00:00
+2002-05-30T09:00:00
+2002-06-27T09:00:00
+2002-07-30T09:00:00
+2002-08-29T09:00:00
+2002-09-27T09:00:00
+2002-10-30T09:00:00
+2002-11-28T09:00:00
+2002-12-30T09:00:00
+2003-01-30T09:00:00
+2003-02-27T09:00:00
+2003-03-28T09:00:00
+2003-04-29T09:00:00
+2003-05-29T09:00:00
+2003-06-27T09:00:00
+2003-07-30T09:00:00
+2003-08-28T09:00:00
+2003-09-29T09:00:00
+2003-10-30T09:00:00
+2003-11-27T09:00:00
+2003-12-30T09:00:00
+2004-01-29T09:00:00
+2004-02-26T09:00:00
+2004-03-30T09:00:00
+2004-04-29T09:00:00
+2004-05-28T09:00:00
+2004-06-29T09:00:00
+2004-07-29T09:00:00
+2004-08-30T09:00:00
+2004-09-29T09:00:00
+2004-10-28T09:00:00
+2004-11-29T09:00:00
+2004-12-30T09:00:00
+2005-01-28T09:00:00
+2005-02-25T09:00:00
+2005-03-30T09:00:00
+2005-04-28T09:00:00
+2005-05-30T09:00:00
+2005-06-29T09:00:00
+2005-07-28T09:00:00
+2005-08-30T09:00:00
+2005-09-29T09:00:00
+2005-10-28T09:00:00
+2005-11-29T09:00:00
+2005-12-29T09:00:00
+2006-01-30T09:00:00
+2006-02-27T09:00:00
+2006-03-30T09:00:00
+2006-04-27T09:00:00
+2006-05-30T09:00:00
+2006-06-29T09:00:00
+2006-07-28T09:00:00
+2006-08-30T09:00:00
+2006-09-28T09:00:00
+2006-10-30T09:00:00
+2006-11-29T09:00:00
+2006-12-28T09:00:00
+2007-01-30T09:00:00
+2007-02-27T09:00:00
+2007-03-29T09:00:00
+2007-04-27T09:00:00
+2007-05-30T09:00:00
+2007-06-28T09:00:00
+2007-07-30T09:00:00
+2007-08-30T09:00:00
+2007-09-27T09:00:00
+2007-10-30T09:00:00
+2007-11-29T09:00:00
+2007-12-28T09:00:00
+2008-01-30T09:00:00
+2008-02-28T09:00:00
+2008-03-28T09:00:00
+2008-04-29T09:00:00
+2008-05-29T09:00:00
+2008-06-27T09:00:00
+2008-07-30T09:00:00
+2008-08-28T09:00:00
+2008-09-29T09:00:00
+2008-10-30T09:00:00
+2008-11-27T09:00:00
+2008-12-30T09:00:00
+2009-01-29T09:00:00
+2009-02-26T09:00:00
+2009-03-30T09:00:00
+2009-04-29T09:00:00
+2009-05-28T09:00:00
+2009-06-29T09:00:00
+2009-07-30T09:00:00
+2009-08-28T09:00:00
+2009-09-29T09:00:00
+2009-10-29T09:00:00
+2009-11-27T09:00:00
+2009-12-30T09:00:00
+2010-01-28T09:00:00
+2010-02-25T09:00:00
+2010-03-30T09:00:00
+2010-04-29T09:00:00
+2010-05-28T09:00:00
+2010-06-29T09:00:00
+2010-07-29T09:00:00
+2010-08-30T09:00:00
+2010-09-29T09:00:00
+2010-10-28T09:00:00
+2010-11-29T09:00:00
+2010-12-30T09:00:00
+2011-01-28T09:00:00
+2011-02-25T09:00:00
+2011-03-30T09:00:00
+2011-04-28T09:00:00
+2011-05-30T09:00:00
+2011-06-29T09:00:00
+2011-07-28T09:00:00
+2011-08-30T09:00:00
+2011-09-29T09:00:00
+2011-10-28T09:00:00
+2011-11-29T09:00:00
+2011-12-29T09:00:00
+2012-01-30T09:00:00
+2012-02-28T09:00:00
+2012-03-29T09:00:00
+2012-04-27T09:00:00
+2012-05-30T09:00:00
+2012-06-28T09:00:00
+2012-07-30T09:00:00
+2012-08-30T09:00:00
+2012-09-27T09:00:00
+2012-10-30T09:00:00
+2012-11-29T09:00:00
+2012-12-28T09:00:00
+2013-01-30T09:00:00
+2013-02-27T09:00:00
+2013-03-28T09:00:00
+2013-04-29T09:00:00
+2013-05-30T09:00:00
+2013-06-27T09:00:00
+2013-07-30T09:00:00
+2013-08-29T09:00:00
+2013-09-27T09:00:00
+2013-10-30T09:00:00
+2013-11-28T09:00:00
+2013-12-30T09:00:00
+2014-01-30T09:00:00
+2014-02-27T09:00:00
+2014-03-28T09:00:00
+2014-04-29T09:00:00
+2014-05-29T09:00:00
+2014-06-27T09:00:00
+2014-07-30T09:00:00
+2014-08-28T09:00:00
+2014-09-29T09:00:00
+2014-10-30T09:00:00
+2014-11-27T09:00:00
+2014-12-30T09:00:00
+2015-01-29T09:00:00
+2015-02-26T09:00:00
+2015-03-30T09:00:00
+2015-04-29T09:00:00
+2015-05-28T09:00:00
+2015-06-29T09:00:00
+2015-07-30T09:00:00
+2015-08-28T09:00:00
+2015-09-29T09:00:00
+2015-10-29T09:00:00
+2015-11-27T09:00:00
+2015-12-30T09:00:00
+2016-01-28T09:00:00
+2016-02-26T09:00:00
+2016-03-30T09:00:00
+2016-04-28T09:00:00
+2016-05-30T09:00:00
+2016-06-29T09:00:00
+2016-07-28T09:00:00
+2016-08-30T09:00:00
+2016-09-29T09:00:00
+2016-10-28T09:00:00
+2016-11-29T09:00:00
+2016-12-29T09:00:00
+2017-01-30T09:00:00
+2017-02-27T09:00:00
+2017-03-30T09:00:00
+2017-04-27T09:00:00
+2017-05-30T09:00:00
+2017-06-29T09:00:00
+2017-07-28T09:00:00
+2017-08-30T09:00:00
+2017-09-28T09:00:00
+2017-10-30T09:00:00
+2017-11-29T09:00:00
+2017-12-28T09:00:00
+2018-01-30T09:00:00
+2018-02-27T09:00:00
+2018-03-29T09:00:00
+2018-04-27T09:00:00
+2018-05-30T09:00:00
+2018-06-28T09:00:00
+2018-07-30T09:00:00
+2018-08-30T09:00:00
+2018-09-27T09:00:00
+2018-10-30T09:00:00
+2018-11-29T09:00:00
+2018-12-28T09:00:00
+2019-01-30T09:00:00
+2019-02-27T09:00:00
+2019-03-28T09:00:00
+2019-04-29T09:00:00
+2019-05-30T09:00:00
+2019-06-27T09:00:00
+2019-07-30T09:00:00
+2019-08-29T09:00:00
+2019-09-27T09:00:00
+2019-10-30T09:00:00
+2019-11-28T09:00:00
+2019-12-30T09:00:00
+2020-01-30T09:00:00
+2020-02-27T09:00:00
+2020-03-30T09:00:00
+2020-04-29T09:00:00
+2020-05-28T09:00:00
+2020-06-29T09:00:00
+2020-07-30T09:00:00
+2020-08-28T09:00:00
+2020-09-29T09:00:00
+2020-10-29T09:00:00
+2020-11-27T09:00:00
+2020-12-30T09:00:00
+2021-01-28T09:00:00
+2021-02-25T09:00:00
+2021-03-30T09:00:00
+2021-04-29T09:00:00
+2021-05-28T09:00:00
+2021-06-29T09:00:00
+2021-07-29T09:00:00
+2021-08-30T09:00:00
+2021-09-29T09:00:00
+2021-10-28T09:00:00
+2021-11-29T09:00:00
+2021-12-30T09:00:00
+2022-01-28T09:00:00
+2022-02-25T09:00:00
+2022-03-30T09:00:00
+2022-04-28T09:00:00
+2022-05-30T09:00:00
+2022-06-29T09:00:00
+2022-07-28T09:00:00
+2022-08-30T09:00:00
+2022-09-29T09:00:00
+2022-10-28T09:00:00
+2022-11-29T09:00:00
+2022-12-29T09:00:00
+2023-01-30T09:00:00
+2023-02-27T09:00:00
+2023-03-30T09:00:00
+2023-04-27T09:00:00
+2023-05-30T09:00:00
+2023-06-29T09:00:00
+2023-07-28T09:00:00
+2023-08-30T09:00:00
+2023-09-28T09:00:00
+2023-10-30T09:00:00
+2023-11-29T09:00:00
+2023-12-28T09:00:00
+2024-01-30T09:00:00
+2024-02-28T09:00:00
+2024-03-28T09:00:00
+2024-04-29T09:00:00
+2024-05-30T09:00:00
+2024-06-27T09:00:00
+2024-07-30T09:00:00
+2024-08-29T09:00:00
+2024-09-27T09:00:00
+2024-10-30T09:00:00
+2024-11-28T09:00:00
+2024-12-30T09:00:00
+2025-01-30T09:00:00
+2025-02-27T09:00:00
+2025-03-28T09:00:00
+2025-04-29T09:00:00
+2025-05-29T09:00:00
+2025-06-27T09:00:00
+2025-07-30T09:00:00
+2025-08-28T09:00:00
+2025-09-29T09:00:00
+2025-10-30T09:00:00
+2025-11-27T09:00:00
+2025-12-30T09:00:00
+2026-01-29T09:00:00
+2026-02-26T09:00:00
+2026-03-30T09:00:00
+2026-04-29T09:00:00
+2026-05-28T09:00:00
+2026-06-29T09:00:00
+2026-07-30T09:00:00
+2026-08-28T09:00:00
+2026-09-29T09:00:00
+2026-10-29T09:00:00
+2026-11-27T09:00:00
+2026-12-30T09:00:00
+2027-01-28T09:00:00
+2027-02-25T09:00:00
+2027-03-30T09:00:00
+2027-04-29T09:00:00
+2027-05-28T09:00:00
+2027-06-29T09:00:00
+2027-07-29T09:00:00
+2027-08-30T09:00:00
+2027-09-29T09:00:00
+2027-10-28T09:00:00
+2027-11-29T09:00:00
+2027-12-30T09:00:00
+2028-01-28T09:00:00
+2028-02-28T09:00:00
+2028-03-30T09:00:00
+2028-04-27T09:00:00
+2028-05-30T09:00:00
+2028-06-29T09:00:00
+2028-07-28T09:00:00
+2028-08-30T09:00:00
+2028-09-28T09:00:00
+2028-10-30T09:00:00
+2028-11-29T09:00:00
+2028-12-28T09:00:00
+2029-01-30T09:00:00
+2029-02-27T09:00:00
+2029-03-29T09:00:00
+2029-04-27T09:00:00
+2029-05-30T09:00:00
+2029-06-28T09:00:00
+2029-07-30T09:00:00
+2029-08-30T09:00:00
+2029-09-27T09:00:00
+2029-10-30T09:00:00
+2029-11-29T09:00:00
+2029-12-28T09:00:00
+2030-01-30T09:00:00
+2030-02-27T09:00:00
+2030-03-28T09:00:00
+2030-04-29T09:00:00
+2030-05-30T09:00:00
+2030-06-27T09:00:00
+2030-07-30T09:00:00
+2030-08-29T09:00:00
+2030-09-27T09:00:00
+2030-10-30T09:00:00
+2030-11-28T09:00:00
+2030-12-30T09:00:00
+2031-01-30T09:00:00
+2031-02-27T09:00:00
+2031-03-28T09:00:00
+2031-04-29T09:00:00
+2031-05-29T09:00:00
+2031-06-27T09:00:00
+2031-07-30T09:00:00
+2031-08-28T09:00:00
+2031-09-29T09:00:00
+2031-10-30T09:00:00
+2031-11-27T09:00:00
+2031-12-30T09:00:00
+2032-01-29T09:00:00
+2032-02-26T09:00:00
+2032-03-30T09:00:00
+2032-04-29T09:00:00
+2032-05-28T09:00:00
+2032-06-29T09:00:00
+2032-07-29T09:00:00
+2032-08-30T09:00:00
+2032-09-29T09:00:00
+2032-10-28T09:00:00
+2032-11-29T09:00:00
+2032-12-30T09:00:00
+2033-01-28T09:00:00
+2033-02-25T09:00:00
+2033-03-30T09:00:00
+2033-04-28T09:00:00
+2033-05-30T09:00:00
+2033-06-29T09:00:00
+2033-07-28T09:00:00
+2033-08-30T09:00:00
+2033-09-29T09:00:00
+2033-10-28T09:00:00
+2033-11-29T09:00:00
+2033-12-29T09:00:00
+2034-01-30T09:00:00
+2034-02-27T09:00:00
+2034-03-30T09:00:00
+2034-04-27T09:00:00
+2034-05-30T09:00:00
+2034-06-29T09:00:00
+2034-07-28T09:00:00
+2034-08-30T09:00:00
+2034-09-28T09:00:00
+2034-10-30T09:00:00
+2034-11-29T09:00:00
+2034-12-28T09:00:00
+2035-01-30T09:00:00
+2035-02-27T09:00:00
+2035-03-29T09:00:00
+2035-04-27T09:00:00
+2035-05-30T09:00:00
+2035-06-28T09:00:00
+2035-07-30T09:00:00
+2035-08-30T09:00:00
+2035-09-27T09:00:00
+2035-10-30T09:00:00
+2035-11-29T09:00:00
+2035-12-28T09:00:00
+2036-01-30T09:00:00
+2036-02-28T09:00:00
+2036-03-28T09:00:00
+2036-04-29T09:00:00
+2036-05-29T09:00:00
+2036-06-27T09:00:00
+2036-07-30T09:00:00
+2036-08-28T09:00:00
+2036-09-29T09:00:00
+2036-10-30T09:00:00
+2036-11-27T09:00:00
+2036-12-30T09:00:00
+2037-01-29T09:00:00
+2037-02-26T09:00:00
+2037-03-30T09:00:00
+2037-04-29T09:00:00
+2037-05-28T09:00:00
+2037-06-29T09:00:00
+2037-07-30T09:00:00
+2037-08-28T09:00:00
+2037-09-29T09:00:00
+2037-10-29T09:00:00
+2037-11-27T09:00:00
+2037-12-30T09:00:00
+2038-01-28T09:00:00
+2038-02-25T09:00:00
+2038-03-30T09:00:00
+2038-04-29T09:00:00
+2038-05-28T09:00:00
+2038-06-29T09:00:00
+2038-07-29T09:00:00
+2038-08-30T09:00:00
+2038-09-29T09:00:00
+2038-10-28T09:00:00
+2038-11-29T09:00:00
+2038-12-30T09:00:00
+2039-01-28T09:00:00
+2039-02-25T09:00:00
+2039-03-30T09:00:00
+2039-04-28T09:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase34.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase34.ics.prev.ref
new file mode 100644
index 00000000..f1cc7204
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase34.ics.prev.ref
@@ -0,0 +1,161 @@
+2010-12-30T09:00:00
+2010-11-29T09:00:00
+2010-10-28T09:00:00
+2010-09-29T09:00:00
+2010-08-30T09:00:00
+2010-07-29T09:00:00
+2010-06-29T09:00:00
+2010-05-28T09:00:00
+2010-04-29T09:00:00
+2010-03-30T09:00:00
+2010-02-25T09:00:00
+2010-01-28T09:00:00
+2009-12-30T09:00:00
+2009-11-27T09:00:00
+2009-10-29T09:00:00
+2009-09-29T09:00:00
+2009-08-28T09:00:00
+2009-07-30T09:00:00
+2009-06-29T09:00:00
+2009-05-28T09:00:00
+2009-04-29T09:00:00
+2009-03-30T09:00:00
+2009-02-26T09:00:00
+2009-01-29T09:00:00
+2008-12-30T09:00:00
+2008-11-27T09:00:00
+2008-10-30T09:00:00
+2008-09-29T09:00:00
+2008-08-28T09:00:00
+2008-07-30T09:00:00
+2008-06-27T09:00:00
+2008-05-29T09:00:00
+2008-04-29T09:00:00
+2008-03-28T09:00:00
+2008-02-28T09:00:00
+2008-01-30T09:00:00
+2007-12-28T09:00:00
+2007-11-29T09:00:00
+2007-10-30T09:00:00
+2007-09-27T09:00:00
+2007-08-30T09:00:00
+2007-07-30T09:00:00
+2007-06-28T09:00:00
+2007-05-30T09:00:00
+2007-04-27T09:00:00
+2007-03-29T09:00:00
+2007-02-27T09:00:00
+2007-01-30T09:00:00
+2006-12-28T09:00:00
+2006-11-29T09:00:00
+2006-10-30T09:00:00
+2006-09-28T09:00:00
+2006-08-30T09:00:00
+2006-07-28T09:00:00
+2006-06-29T09:00:00
+2006-05-30T09:00:00
+2006-04-27T09:00:00
+2006-03-30T09:00:00
+2006-02-27T09:00:00
+2006-01-30T09:00:00
+2005-12-29T09:00:00
+2005-11-29T09:00:00
+2005-10-28T09:00:00
+2005-09-29T09:00:00
+2005-08-30T09:00:00
+2005-07-28T09:00:00
+2005-06-29T09:00:00
+2005-05-30T09:00:00
+2005-04-28T09:00:00
+2005-03-30T09:00:00
+2005-02-25T09:00:00
+2005-01-28T09:00:00
+2004-12-30T09:00:00
+2004-11-29T09:00:00
+2004-10-28T09:00:00
+2004-09-29T09:00:00
+2004-08-30T09:00:00
+2004-07-29T09:00:00
+2004-06-29T09:00:00
+2004-05-28T09:00:00
+2004-04-29T09:00:00
+2004-03-30T09:00:00
+2004-02-26T09:00:00
+2004-01-29T09:00:00
+2003-12-30T09:00:00
+2003-11-27T09:00:00
+2003-10-30T09:00:00
+2003-09-29T09:00:00
+2003-08-28T09:00:00
+2003-07-30T09:00:00
+2003-06-27T09:00:00
+2003-05-29T09:00:00
+2003-04-29T09:00:00
+2003-03-28T09:00:00
+2003-02-27T09:00:00
+2003-01-30T09:00:00
+2002-12-30T09:00:00
+2002-11-28T09:00:00
+2002-10-30T09:00:00
+2002-09-27T09:00:00
+2002-08-29T09:00:00
+2002-07-30T09:00:00
+2002-06-27T09:00:00
+2002-05-30T09:00:00
+2002-04-29T09:00:00
+2002-03-28T09:00:00
+2002-02-27T09:00:00
+2002-01-30T09:00:00
+2001-12-28T09:00:00
+2001-11-29T09:00:00
+2001-10-30T09:00:00
+2001-09-27T09:00:00
+2001-08-30T09:00:00
+2001-07-30T09:00:00
+2001-06-28T09:00:00
+2001-05-30T09:00:00
+2001-04-27T09:00:00
+2001-03-29T09:00:00
+2001-02-27T09:00:00
+2001-01-30T09:00:00
+2000-12-28T09:00:00
+2000-11-29T09:00:00
+2000-10-30T09:00:00
+2000-09-28T09:00:00
+2000-08-30T09:00:00
+2000-07-28T09:00:00
+2000-06-29T09:00:00
+2000-05-30T09:00:00
+2000-04-27T09:00:00
+2000-03-30T09:00:00
+2000-02-28T09:00:00
+2000-01-28T09:00:00
+1999-12-30T09:00:00
+1999-11-29T09:00:00
+1999-10-28T09:00:00
+1999-09-29T09:00:00
+1999-08-30T09:00:00
+1999-07-29T09:00:00
+1999-06-29T09:00:00
+1999-05-28T09:00:00
+1999-04-29T09:00:00
+1999-03-30T09:00:00
+1999-02-25T09:00:00
+1999-01-28T09:00:00
+1998-12-30T09:00:00
+1998-11-27T09:00:00
+1998-10-29T09:00:00
+1998-09-29T09:00:00
+1998-08-28T09:00:00
+1998-07-30T09:00:00
+1998-06-29T09:00:00
+1998-05-28T09:00:00
+1998-04-29T09:00:00
+1998-03-30T09:00:00
+1998-02-26T09:00:00
+1998-01-29T09:00:00
+1997-12-30T09:00:00
+1997-11-27T09:00:00
+1997-10-30T09:00:00
+1997-09-29T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase34.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase34.ics.recurson.ref
new file mode 100644
index 00000000..8753b149
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase34.ics.recurson.ref
@@ -0,0 +1,160 @@
+1997-09-29
+1997-10-30
+1997-11-27
+1997-12-30
+1998-01-29
+1998-02-26
+1998-03-30
+1998-04-29
+1998-05-28
+1998-06-29
+1998-07-30
+1998-08-28
+1998-09-29
+1998-10-29
+1998-11-27
+1998-12-30
+1999-01-28
+1999-02-25
+1999-03-30
+1999-04-29
+1999-05-28
+1999-06-29
+1999-07-29
+1999-08-30
+1999-09-29
+1999-10-28
+1999-11-29
+1999-12-30
+2000-01-28
+2000-02-28
+2000-03-30
+2000-04-27
+2000-05-30
+2000-06-29
+2000-07-28
+2000-08-30
+2000-09-28
+2000-10-30
+2000-11-29
+2000-12-28
+2001-01-30
+2001-02-27
+2001-03-29
+2001-04-27
+2001-05-30
+2001-06-28
+2001-07-30
+2001-08-30
+2001-09-27
+2001-10-30
+2001-11-29
+2001-12-28
+2002-01-30
+2002-02-27
+2002-03-28
+2002-04-29
+2002-05-30
+2002-06-27
+2002-07-30
+2002-08-29
+2002-09-27
+2002-10-30
+2002-11-28
+2002-12-30
+2003-01-30
+2003-02-27
+2003-03-28
+2003-04-29
+2003-05-29
+2003-06-27
+2003-07-30
+2003-08-28
+2003-09-29
+2003-10-30
+2003-11-27
+2003-12-30
+2004-01-29
+2004-02-26
+2004-03-30
+2004-04-29
+2004-05-28
+2004-06-29
+2004-07-29
+2004-08-30
+2004-09-29
+2004-10-28
+2004-11-29
+2004-12-30
+2005-01-28
+2005-02-25
+2005-03-30
+2005-04-28
+2005-05-30
+2005-06-29
+2005-07-28
+2005-08-30
+2005-09-29
+2005-10-28
+2005-11-29
+2005-12-29
+2006-01-30
+2006-02-27
+2006-03-30
+2006-04-27
+2006-05-30
+2006-06-29
+2006-07-28
+2006-08-30
+2006-09-28
+2006-10-30
+2006-11-29
+2006-12-28
+2007-01-30
+2007-02-27
+2007-03-29
+2007-04-27
+2007-05-30
+2007-06-28
+2007-07-30
+2007-08-30
+2007-09-27
+2007-10-30
+2007-11-29
+2007-12-28
+2008-01-30
+2008-02-28
+2008-03-28
+2008-04-29
+2008-05-29
+2008-06-27
+2008-07-30
+2008-08-28
+2008-09-29
+2008-10-30
+2008-11-27
+2008-12-30
+2009-01-29
+2009-02-26
+2009-03-30
+2009-04-29
+2009-05-28
+2009-06-29
+2009-07-30
+2009-08-28
+2009-09-29
+2009-10-29
+2009-11-27
+2009-12-30
+2010-01-28
+2010-02-25
+2010-03-30
+2010-04-29
+2010-05-28
+2010-06-29
+2010-07-29
+2010-08-30
+2010-09-29
+2010-10-28
+2010-11-29
+2010-12-30
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase35.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase35.ics
new file mode 100644
index 00000000..ed83e652
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase35.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Every 3 hours from 9:00 AM Eastern time to 5:00 PM UTC on a specific day:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=HOURLY;UNTIL=19970902T170000Z;INTERVAL=3
+SUMMARY:RExample33
+UID:RExample33
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase35.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase35.ics.comp34.ref
new file mode 100644
index 00000000..80375a1b
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase35.ics.comp34.ref
@@ -0,0 +1,3 @@
+1997-09-02T09:00:00
+1997-09-02T12:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase35.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase35.ics.next.ref
new file mode 100644
index 00000000..80375a1b
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase35.ics.next.ref
@@ -0,0 +1,3 @@
+1997-09-02T09:00:00
+1997-09-02T12:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase35.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase35.ics.prev.ref
new file mode 100644
index 00000000..b3b544cb
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase35.ics.prev.ref
@@ -0,0 +1,3 @@
+1997-09-02T12:00:00
+1997-09-02T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase35.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase35.ics.recurson.ref
new file mode 100644
index 00000000..6fca0d2f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase35.ics.recurson.ref
@@ -0,0 +1,2 @@
+1997-09-02
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36.ics
new file mode 100644
index 00000000..416ae4eb
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Every 15 minutes for 6 occurrences:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=MINUTELY;COUNT=6;INTERVAL=15
+SUMMARY:RExample34
+UID:RExample34
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36.ics.comp34.ref
new file mode 100644
index 00000000..5858bfb7
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36.ics.comp34.ref
@@ -0,0 +1,7 @@
+1997-09-02T09:00:00
+1997-09-02T09:15:00
+1997-09-02T09:30:00
+1997-09-02T09:45:00
+1997-09-02T10:00:00
+1997-09-02T10:15:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36.ics.next.ref
new file mode 100644
index 00000000..5858bfb7
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36.ics.next.ref
@@ -0,0 +1,7 @@
+1997-09-02T09:00:00
+1997-09-02T09:15:00
+1997-09-02T09:30:00
+1997-09-02T09:45:00
+1997-09-02T10:00:00
+1997-09-02T10:15:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36.ics.prev.ref
new file mode 100644
index 00000000..e5388f91
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36.ics.prev.ref
@@ -0,0 +1,7 @@
+1997-09-02T10:15:00
+1997-09-02T10:00:00
+1997-09-02T09:45:00
+1997-09-02T09:30:00
+1997-09-02T09:15:00
+1997-09-02T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36.ics.recurson.ref
new file mode 100644
index 00000000..6fca0d2f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36.ics.recurson.ref
@@ -0,0 +1,2 @@
+1997-09-02
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36U.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36U.ics
new file mode 100644
index 00000000..816ce6e2
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36U.ics
@@ -0,0 +1,34 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Every 15 minutes until 10:30
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=MINUTELY;UNTIL=19970902T143000Z;INTERVAL=15
+SUMMARY:RExample36U
+UID:RExample36U
+END:VEVENT
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36U.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36U.ics.comp34.ref
new file mode 100644
index 00000000..7b9d5d5d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36U.ics.comp34.ref
@@ -0,0 +1,8 @@
+1997-09-02T09:00:00
+1997-09-02T09:15:00
+1997-09-02T09:30:00
+1997-09-02T09:45:00
+1997-09-02T10:00:00
+1997-09-02T10:15:00
+1997-09-02T10:30:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36U.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36U.ics.next.ref
new file mode 100644
index 00000000..7b9d5d5d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36U.ics.next.ref
@@ -0,0 +1,8 @@
+1997-09-02T09:00:00
+1997-09-02T09:15:00
+1997-09-02T09:30:00
+1997-09-02T09:45:00
+1997-09-02T10:00:00
+1997-09-02T10:15:00
+1997-09-02T10:30:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36U.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36U.ics.prev.ref
new file mode 100644
index 00000000..30262f4a
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36U.ics.prev.ref
@@ -0,0 +1,8 @@
+1997-09-02T10:30:00
+1997-09-02T10:15:00
+1997-09-02T10:00:00
+1997-09-02T09:45:00
+1997-09-02T09:30:00
+1997-09-02T09:15:00
+1997-09-02T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36U.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36U.ics.recurson.ref
new file mode 100644
index 00000000..6fca0d2f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase36U.ics.recurson.ref
@@ -0,0 +1,2 @@
+1997-09-02
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase37.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase37.ics
new file mode 100644
index 00000000..e8ef5455
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase37.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Every hour and a half for 4 occurrences:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=MINUTELY;COUNT=4;INTERVAL=90
+SUMMARY:RExample35
+UID:RExample35
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase37.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase37.ics.comp34.ref
new file mode 100644
index 00000000..9ed75f74
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase37.ics.comp34.ref
@@ -0,0 +1,5 @@
+1997-09-02T09:00:00
+1997-09-02T10:30:00
+1997-09-02T12:00:00
+1997-09-02T13:30:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase37.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase37.ics.next.ref
new file mode 100644
index 00000000..9ed75f74
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase37.ics.next.ref
@@ -0,0 +1,5 @@
+1997-09-02T09:00:00
+1997-09-02T10:30:00
+1997-09-02T12:00:00
+1997-09-02T13:30:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase37.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase37.ics.prev.ref
new file mode 100644
index 00000000..603fcb7f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase37.ics.prev.ref
@@ -0,0 +1,5 @@
+1997-09-02T13:30:00
+1997-09-02T12:00:00
+1997-09-02T10:30:00
+1997-09-02T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase37.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase37.ics.recurson.ref
new file mode 100644
index 00000000..6fca0d2f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase37.ics.recurson.ref
@@ -0,0 +1,2 @@
+1997-09-02
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase38.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase38.ics
new file mode 100644
index 00000000..0d0ec660
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase38.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Every 20 minutes from 9:00 AM to 4:40 PM every day:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=DAILY;BYMINUTE=0,20,40;BYHOUR=9,10,11,12,13,14,15,16
+SUMMARY:RExample36a
+UID:RExample36a
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase38.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase38.ics.comp34.ref
new file mode 100644
index 00000000..24a6a122
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase38.ics.comp34.ref
@@ -0,0 +1,500 @@
+1997-09-02T09:00:00
+1997-09-03T09:00:00
+1997-09-04T09:00:00
+1997-09-05T09:00:00
+1997-09-06T09:00:00
+1997-09-07T09:00:00
+1997-09-08T09:00:00
+1997-09-09T09:00:00
+1997-09-10T09:00:00
+1997-09-11T09:00:00
+1997-09-12T09:00:00
+1997-09-13T09:00:00
+1997-09-14T09:00:00
+1997-09-15T09:00:00
+1997-09-16T09:00:00
+1997-09-17T09:00:00
+1997-09-18T09:00:00
+1997-09-19T09:00:00
+1997-09-20T09:00:00
+1997-09-21T09:00:00
+1997-09-22T09:00:00
+1997-09-23T09:00:00
+1997-09-24T09:00:00
+1997-09-25T09:00:00
+1997-09-26T09:00:00
+1997-09-27T09:00:00
+1997-09-28T09:00:00
+1997-09-29T09:00:00
+1997-09-30T09:00:00
+1997-10-01T09:00:00
+1997-10-02T09:00:00
+1997-10-03T09:00:00
+1997-10-04T09:00:00
+1997-10-05T09:00:00
+1997-10-06T09:00:00
+1997-10-07T09:00:00
+1997-10-08T09:00:00
+1997-10-09T09:00:00
+1997-10-10T09:00:00
+1997-10-11T09:00:00
+1997-10-12T09:00:00
+1997-10-13T09:00:00
+1997-10-14T09:00:00
+1997-10-15T09:00:00
+1997-10-16T09:00:00
+1997-10-17T09:00:00
+1997-10-18T09:00:00
+1997-10-19T09:00:00
+1997-10-20T09:00:00
+1997-10-21T09:00:00
+1997-10-22T09:00:00
+1997-10-23T09:00:00
+1997-10-24T09:00:00
+1997-10-25T09:00:00
+1997-10-26T09:00:00
+1997-10-27T09:00:00
+1997-10-28T09:00:00
+1997-10-29T09:00:00
+1997-10-30T09:00:00
+1997-10-31T09:00:00
+1997-11-01T09:00:00
+1997-11-02T09:00:00
+1997-11-03T09:00:00
+1997-11-04T09:00:00
+1997-11-05T09:00:00
+1997-11-06T09:00:00
+1997-11-07T09:00:00
+1997-11-08T09:00:00
+1997-11-09T09:00:00
+1997-11-10T09:00:00
+1997-11-11T09:00:00
+1997-11-12T09:00:00
+1997-11-13T09:00:00
+1997-11-14T09:00:00
+1997-11-15T09:00:00
+1997-11-16T09:00:00
+1997-11-17T09:00:00
+1997-11-18T09:00:00
+1997-11-19T09:00:00
+1997-11-20T09:00:00
+1997-11-21T09:00:00
+1997-11-22T09:00:00
+1997-11-23T09:00:00
+1997-11-24T09:00:00
+1997-11-25T09:00:00
+1997-11-26T09:00:00
+1997-11-27T09:00:00
+1997-11-28T09:00:00
+1997-11-29T09:00:00
+1997-11-30T09:00:00
+1997-12-01T09:00:00
+1997-12-02T09:00:00
+1997-12-03T09:00:00
+1997-12-04T09:00:00
+1997-12-05T09:00:00
+1997-12-06T09:00:00
+1997-12-07T09:00:00
+1997-12-08T09:00:00
+1997-12-09T09:00:00
+1997-12-10T09:00:00
+1997-12-11T09:00:00
+1997-12-12T09:00:00
+1997-12-13T09:00:00
+1997-12-14T09:00:00
+1997-12-15T09:00:00
+1997-12-16T09:00:00
+1997-12-17T09:00:00
+1997-12-18T09:00:00
+1997-12-19T09:00:00
+1997-12-20T09:00:00
+1997-12-21T09:00:00
+1997-12-22T09:00:00
+1997-12-23T09:00:00
+1997-12-24T09:00:00
+1997-12-25T09:00:00
+1997-12-26T09:00:00
+1997-12-27T09:00:00
+1997-12-28T09:00:00
+1997-12-29T09:00:00
+1997-12-30T09:00:00
+1997-12-31T09:00:00
+1998-01-01T09:00:00
+1998-01-02T09:00:00
+1998-01-03T09:00:00
+1998-01-04T09:00:00
+1998-01-05T09:00:00
+1998-01-06T09:00:00
+1998-01-07T09:00:00
+1998-01-08T09:00:00
+1998-01-09T09:00:00
+1998-01-10T09:00:00
+1998-01-11T09:00:00
+1998-01-12T09:00:00
+1998-01-13T09:00:00
+1998-01-14T09:00:00
+1998-01-15T09:00:00
+1998-01-16T09:00:00
+1998-01-17T09:00:00
+1998-01-18T09:00:00
+1998-01-19T09:00:00
+1998-01-20T09:00:00
+1998-01-21T09:00:00
+1998-01-22T09:00:00
+1998-01-23T09:00:00
+1998-01-24T09:00:00
+1998-01-25T09:00:00
+1998-01-26T09:00:00
+1998-01-27T09:00:00
+1998-01-28T09:00:00
+1998-01-29T09:00:00
+1998-01-30T09:00:00
+1998-01-31T09:00:00
+1998-02-01T09:00:00
+1998-02-02T09:00:00
+1998-02-03T09:00:00
+1998-02-04T09:00:00
+1998-02-05T09:00:00
+1998-02-06T09:00:00
+1998-02-07T09:00:00
+1998-02-08T09:00:00
+1998-02-09T09:00:00
+1998-02-10T09:00:00
+1998-02-11T09:00:00
+1998-02-12T09:00:00
+1998-02-13T09:00:00
+1998-02-14T09:00:00
+1998-02-15T09:00:00
+1998-02-16T09:00:00
+1998-02-17T09:00:00
+1998-02-18T09:00:00
+1998-02-19T09:00:00
+1998-02-20T09:00:00
+1998-02-21T09:00:00
+1998-02-22T09:00:00
+1998-02-23T09:00:00
+1998-02-24T09:00:00
+1998-02-25T09:00:00
+1998-02-26T09:00:00
+1998-02-27T09:00:00
+1998-02-28T09:00:00
+1998-03-01T09:00:00
+1998-03-02T09:00:00
+1998-03-03T09:00:00
+1998-03-04T09:00:00
+1998-03-05T09:00:00
+1998-03-06T09:00:00
+1998-03-07T09:00:00
+1998-03-08T09:00:00
+1998-03-09T09:00:00
+1998-03-10T09:00:00
+1998-03-11T09:00:00
+1998-03-12T09:00:00
+1998-03-13T09:00:00
+1998-03-14T09:00:00
+1998-03-15T09:00:00
+1998-03-16T09:00:00
+1998-03-17T09:00:00
+1998-03-18T09:00:00
+1998-03-19T09:00:00
+1998-03-20T09:00:00
+1998-03-21T09:00:00
+1998-03-22T09:00:00
+1998-03-23T09:00:00
+1998-03-24T09:00:00
+1998-03-25T09:00:00
+1998-03-26T09:00:00
+1998-03-27T09:00:00
+1998-03-28T09:00:00
+1998-03-29T09:00:00
+1998-03-30T09:00:00
+1998-03-31T09:00:00
+1998-04-01T09:00:00
+1998-04-02T09:00:00
+1998-04-03T09:00:00
+1998-04-04T09:00:00
+1998-04-05T09:00:00
+1998-04-06T09:00:00
+1998-04-07T09:00:00
+1998-04-08T09:00:00
+1998-04-09T09:00:00
+1998-04-10T09:00:00
+1998-04-11T09:00:00
+1998-04-12T09:00:00
+1998-04-13T09:00:00
+1998-04-14T09:00:00
+1998-04-15T09:00:00
+1998-04-16T09:00:00
+1998-04-17T09:00:00
+1998-04-18T09:00:00
+1998-04-19T09:00:00
+1998-04-20T09:00:00
+1998-04-21T09:00:00
+1998-04-22T09:00:00
+1998-04-23T09:00:00
+1998-04-24T09:00:00
+1998-04-25T09:00:00
+1998-04-26T09:00:00
+1998-04-27T09:00:00
+1998-04-28T09:00:00
+1998-04-29T09:00:00
+1998-04-30T09:00:00
+1998-05-01T09:00:00
+1998-05-02T09:00:00
+1998-05-03T09:00:00
+1998-05-04T09:00:00
+1998-05-05T09:00:00
+1998-05-06T09:00:00
+1998-05-07T09:00:00
+1998-05-08T09:00:00
+1998-05-09T09:00:00
+1998-05-10T09:00:00
+1998-05-11T09:00:00
+1998-05-12T09:00:00
+1998-05-13T09:00:00
+1998-05-14T09:00:00
+1998-05-15T09:00:00
+1998-05-16T09:00:00
+1998-05-17T09:00:00
+1998-05-18T09:00:00
+1998-05-19T09:00:00
+1998-05-20T09:00:00
+1998-05-21T09:00:00
+1998-05-22T09:00:00
+1998-05-23T09:00:00
+1998-05-24T09:00:00
+1998-05-25T09:00:00
+1998-05-26T09:00:00
+1998-05-27T09:00:00
+1998-05-28T09:00:00
+1998-05-29T09:00:00
+1998-05-30T09:00:00
+1998-05-31T09:00:00
+1998-06-01T09:00:00
+1998-06-02T09:00:00
+1998-06-03T09:00:00
+1998-06-04T09:00:00
+1998-06-05T09:00:00
+1998-06-06T09:00:00
+1998-06-07T09:00:00
+1998-06-08T09:00:00
+1998-06-09T09:00:00
+1998-06-10T09:00:00
+1998-06-11T09:00:00
+1998-06-12T09:00:00
+1998-06-13T09:00:00
+1998-06-14T09:00:00
+1998-06-15T09:00:00
+1998-06-16T09:00:00
+1998-06-17T09:00:00
+1998-06-18T09:00:00
+1998-06-19T09:00:00
+1998-06-20T09:00:00
+1998-06-21T09:00:00
+1998-06-22T09:00:00
+1998-06-23T09:00:00
+1998-06-24T09:00:00
+1998-06-25T09:00:00
+1998-06-26T09:00:00
+1998-06-27T09:00:00
+1998-06-28T09:00:00
+1998-06-29T09:00:00
+1998-06-30T09:00:00
+1998-07-01T09:00:00
+1998-07-02T09:00:00
+1998-07-03T09:00:00
+1998-07-04T09:00:00
+1998-07-05T09:00:00
+1998-07-06T09:00:00
+1998-07-07T09:00:00
+1998-07-08T09:00:00
+1998-07-09T09:00:00
+1998-07-10T09:00:00
+1998-07-11T09:00:00
+1998-07-12T09:00:00
+1998-07-13T09:00:00
+1998-07-14T09:00:00
+1998-07-15T09:00:00
+1998-07-16T09:00:00
+1998-07-17T09:00:00
+1998-07-18T09:00:00
+1998-07-19T09:00:00
+1998-07-20T09:00:00
+1998-07-21T09:00:00
+1998-07-22T09:00:00
+1998-07-23T09:00:00
+1998-07-24T09:00:00
+1998-07-25T09:00:00
+1998-07-26T09:00:00
+1998-07-27T09:00:00
+1998-07-28T09:00:00
+1998-07-29T09:00:00
+1998-07-30T09:00:00
+1998-07-31T09:00:00
+1998-08-01T09:00:00
+1998-08-02T09:00:00
+1998-08-03T09:00:00
+1998-08-04T09:00:00
+1998-08-05T09:00:00
+1998-08-06T09:00:00
+1998-08-07T09:00:00
+1998-08-08T09:00:00
+1998-08-09T09:00:00
+1998-08-10T09:00:00
+1998-08-11T09:00:00
+1998-08-12T09:00:00
+1998-08-13T09:00:00
+1998-08-14T09:00:00
+1998-08-15T09:00:00
+1998-08-16T09:00:00
+1998-08-17T09:00:00
+1998-08-18T09:00:00
+1998-08-19T09:00:00
+1998-08-20T09:00:00
+1998-08-21T09:00:00
+1998-08-22T09:00:00
+1998-08-23T09:00:00
+1998-08-24T09:00:00
+1998-08-25T09:00:00
+1998-08-26T09:00:00
+1998-08-27T09:00:00
+1998-08-28T09:00:00
+1998-08-29T09:00:00
+1998-08-30T09:00:00
+1998-08-31T09:00:00
+1998-09-01T09:00:00
+1998-09-02T09:00:00
+1998-09-03T09:00:00
+1998-09-04T09:00:00
+1998-09-05T09:00:00
+1998-09-06T09:00:00
+1998-09-07T09:00:00
+1998-09-08T09:00:00
+1998-09-09T09:00:00
+1998-09-10T09:00:00
+1998-09-11T09:00:00
+1998-09-12T09:00:00
+1998-09-13T09:00:00
+1998-09-14T09:00:00
+1998-09-15T09:00:00
+1998-09-16T09:00:00
+1998-09-17T09:00:00
+1998-09-18T09:00:00
+1998-09-19T09:00:00
+1998-09-20T09:00:00
+1998-09-21T09:00:00
+1998-09-22T09:00:00
+1998-09-23T09:00:00
+1998-09-24T09:00:00
+1998-09-25T09:00:00
+1998-09-26T09:00:00
+1998-09-27T09:00:00
+1998-09-28T09:00:00
+1998-09-29T09:00:00
+1998-09-30T09:00:00
+1998-10-01T09:00:00
+1998-10-02T09:00:00
+1998-10-03T09:00:00
+1998-10-04T09:00:00
+1998-10-05T09:00:00
+1998-10-06T09:00:00
+1998-10-07T09:00:00
+1998-10-08T09:00:00
+1998-10-09T09:00:00
+1998-10-10T09:00:00
+1998-10-11T09:00:00
+1998-10-12T09:00:00
+1998-10-13T09:00:00
+1998-10-14T09:00:00
+1998-10-15T09:00:00
+1998-10-16T09:00:00
+1998-10-17T09:00:00
+1998-10-18T09:00:00
+1998-10-19T09:00:00
+1998-10-20T09:00:00
+1998-10-21T09:00:00
+1998-10-22T09:00:00
+1998-10-23T09:00:00
+1998-10-24T09:00:00
+1998-10-25T09:00:00
+1998-10-26T09:00:00
+1998-10-27T09:00:00
+1998-10-28T09:00:00
+1998-10-29T09:00:00
+1998-10-30T09:00:00
+1998-10-31T09:00:00
+1998-11-01T09:00:00
+1998-11-02T09:00:00
+1998-11-03T09:00:00
+1998-11-04T09:00:00
+1998-11-05T09:00:00
+1998-11-06T09:00:00
+1998-11-07T09:00:00
+1998-11-08T09:00:00
+1998-11-09T09:00:00
+1998-11-10T09:00:00
+1998-11-11T09:00:00
+1998-11-12T09:00:00
+1998-11-13T09:00:00
+1998-11-14T09:00:00
+1998-11-15T09:00:00
+1998-11-16T09:00:00
+1998-11-17T09:00:00
+1998-11-18T09:00:00
+1998-11-19T09:00:00
+1998-11-20T09:00:00
+1998-11-21T09:00:00
+1998-11-22T09:00:00
+1998-11-23T09:00:00
+1998-11-24T09:00:00
+1998-11-25T09:00:00
+1998-11-26T09:00:00
+1998-11-27T09:00:00
+1998-11-28T09:00:00
+1998-11-29T09:00:00
+1998-11-30T09:00:00
+1998-12-01T09:00:00
+1998-12-02T09:00:00
+1998-12-03T09:00:00
+1998-12-04T09:00:00
+1998-12-05T09:00:00
+1998-12-06T09:00:00
+1998-12-07T09:00:00
+1998-12-08T09:00:00
+1998-12-09T09:00:00
+1998-12-10T09:00:00
+1998-12-11T09:00:00
+1998-12-12T09:00:00
+1998-12-13T09:00:00
+1998-12-14T09:00:00
+1998-12-15T09:00:00
+1998-12-16T09:00:00
+1998-12-17T09:00:00
+1998-12-18T09:00:00
+1998-12-19T09:00:00
+1998-12-20T09:00:00
+1998-12-21T09:00:00
+1998-12-22T09:00:00
+1998-12-23T09:00:00
+1998-12-24T09:00:00
+1998-12-25T09:00:00
+1998-12-26T09:00:00
+1998-12-27T09:00:00
+1998-12-28T09:00:00
+1998-12-29T09:00:00
+1998-12-30T09:00:00
+1998-12-31T09:00:00
+1999-01-01T09:00:00
+1999-01-02T09:00:00
+1999-01-03T09:00:00
+1999-01-04T09:00:00
+1999-01-05T09:00:00
+1999-01-06T09:00:00
+1999-01-07T09:00:00
+1999-01-08T09:00:00
+1999-01-09T09:00:00
+1999-01-10T09:00:00
+1999-01-11T09:00:00
+1999-01-12T09:00:00
+1999-01-13T09:00:00
+1999-01-14T09:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase38.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase38.ics.next.ref
new file mode 100644
index 00000000..991e6f4d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase38.ics.next.ref
@@ -0,0 +1,500 @@
+1997-09-02T09:00:00
+1997-09-02T09:20:00
+1997-09-02T09:40:00
+1997-09-02T10:00:00
+1997-09-02T10:20:00
+1997-09-02T10:40:00
+1997-09-02T11:00:00
+1997-09-02T11:20:00
+1997-09-02T11:40:00
+1997-09-02T12:00:00
+1997-09-02T12:20:00
+1997-09-02T12:40:00
+1997-09-02T13:00:00
+1997-09-02T13:20:00
+1997-09-02T13:40:00
+1997-09-02T14:00:00
+1997-09-02T14:20:00
+1997-09-02T14:40:00
+1997-09-02T15:00:00
+1997-09-02T15:20:00
+1997-09-02T15:40:00
+1997-09-02T16:00:00
+1997-09-02T16:20:00
+1997-09-02T16:40:00
+1997-09-03T09:00:00
+1997-09-03T09:20:00
+1997-09-03T09:40:00
+1997-09-03T10:00:00
+1997-09-03T10:20:00
+1997-09-03T10:40:00
+1997-09-03T11:00:00
+1997-09-03T11:20:00
+1997-09-03T11:40:00
+1997-09-03T12:00:00
+1997-09-03T12:20:00
+1997-09-03T12:40:00
+1997-09-03T13:00:00
+1997-09-03T13:20:00
+1997-09-03T13:40:00
+1997-09-03T14:00:00
+1997-09-03T14:20:00
+1997-09-03T14:40:00
+1997-09-03T15:00:00
+1997-09-03T15:20:00
+1997-09-03T15:40:00
+1997-09-03T16:00:00
+1997-09-03T16:20:00
+1997-09-03T16:40:00
+1997-09-04T09:00:00
+1997-09-04T09:20:00
+1997-09-04T09:40:00
+1997-09-04T10:00:00
+1997-09-04T10:20:00
+1997-09-04T10:40:00
+1997-09-04T11:00:00
+1997-09-04T11:20:00
+1997-09-04T11:40:00
+1997-09-04T12:00:00
+1997-09-04T12:20:00
+1997-09-04T12:40:00
+1997-09-04T13:00:00
+1997-09-04T13:20:00
+1997-09-04T13:40:00
+1997-09-04T14:00:00
+1997-09-04T14:20:00
+1997-09-04T14:40:00
+1997-09-04T15:00:00
+1997-09-04T15:20:00
+1997-09-04T15:40:00
+1997-09-04T16:00:00
+1997-09-04T16:20:00
+1997-09-04T16:40:00
+1997-09-05T09:00:00
+1997-09-05T09:20:00
+1997-09-05T09:40:00
+1997-09-05T10:00:00
+1997-09-05T10:20:00
+1997-09-05T10:40:00
+1997-09-05T11:00:00
+1997-09-05T11:20:00
+1997-09-05T11:40:00
+1997-09-05T12:00:00
+1997-09-05T12:20:00
+1997-09-05T12:40:00
+1997-09-05T13:00:00
+1997-09-05T13:20:00
+1997-09-05T13:40:00
+1997-09-05T14:00:00
+1997-09-05T14:20:00
+1997-09-05T14:40:00
+1997-09-05T15:00:00
+1997-09-05T15:20:00
+1997-09-05T15:40:00
+1997-09-05T16:00:00
+1997-09-05T16:20:00
+1997-09-05T16:40:00
+1997-09-06T09:00:00
+1997-09-06T09:20:00
+1997-09-06T09:40:00
+1997-09-06T10:00:00
+1997-09-06T10:20:00
+1997-09-06T10:40:00
+1997-09-06T11:00:00
+1997-09-06T11:20:00
+1997-09-06T11:40:00
+1997-09-06T12:00:00
+1997-09-06T12:20:00
+1997-09-06T12:40:00
+1997-09-06T13:00:00
+1997-09-06T13:20:00
+1997-09-06T13:40:00
+1997-09-06T14:00:00
+1997-09-06T14:20:00
+1997-09-06T14:40:00
+1997-09-06T15:00:00
+1997-09-06T15:20:00
+1997-09-06T15:40:00
+1997-09-06T16:00:00
+1997-09-06T16:20:00
+1997-09-06T16:40:00
+1997-09-07T09:00:00
+1997-09-07T09:20:00
+1997-09-07T09:40:00
+1997-09-07T10:00:00
+1997-09-07T10:20:00
+1997-09-07T10:40:00
+1997-09-07T11:00:00
+1997-09-07T11:20:00
+1997-09-07T11:40:00
+1997-09-07T12:00:00
+1997-09-07T12:20:00
+1997-09-07T12:40:00
+1997-09-07T13:00:00
+1997-09-07T13:20:00
+1997-09-07T13:40:00
+1997-09-07T14:00:00
+1997-09-07T14:20:00
+1997-09-07T14:40:00
+1997-09-07T15:00:00
+1997-09-07T15:20:00
+1997-09-07T15:40:00
+1997-09-07T16:00:00
+1997-09-07T16:20:00
+1997-09-07T16:40:00
+1997-09-08T09:00:00
+1997-09-08T09:20:00
+1997-09-08T09:40:00
+1997-09-08T10:00:00
+1997-09-08T10:20:00
+1997-09-08T10:40:00
+1997-09-08T11:00:00
+1997-09-08T11:20:00
+1997-09-08T11:40:00
+1997-09-08T12:00:00
+1997-09-08T12:20:00
+1997-09-08T12:40:00
+1997-09-08T13:00:00
+1997-09-08T13:20:00
+1997-09-08T13:40:00
+1997-09-08T14:00:00
+1997-09-08T14:20:00
+1997-09-08T14:40:00
+1997-09-08T15:00:00
+1997-09-08T15:20:00
+1997-09-08T15:40:00
+1997-09-08T16:00:00
+1997-09-08T16:20:00
+1997-09-08T16:40:00
+1997-09-09T09:00:00
+1997-09-09T09:20:00
+1997-09-09T09:40:00
+1997-09-09T10:00:00
+1997-09-09T10:20:00
+1997-09-09T10:40:00
+1997-09-09T11:00:00
+1997-09-09T11:20:00
+1997-09-09T11:40:00
+1997-09-09T12:00:00
+1997-09-09T12:20:00
+1997-09-09T12:40:00
+1997-09-09T13:00:00
+1997-09-09T13:20:00
+1997-09-09T13:40:00
+1997-09-09T14:00:00
+1997-09-09T14:20:00
+1997-09-09T14:40:00
+1997-09-09T15:00:00
+1997-09-09T15:20:00
+1997-09-09T15:40:00
+1997-09-09T16:00:00
+1997-09-09T16:20:00
+1997-09-09T16:40:00
+1997-09-10T09:00:00
+1997-09-10T09:20:00
+1997-09-10T09:40:00
+1997-09-10T10:00:00
+1997-09-10T10:20:00
+1997-09-10T10:40:00
+1997-09-10T11:00:00
+1997-09-10T11:20:00
+1997-09-10T11:40:00
+1997-09-10T12:00:00
+1997-09-10T12:20:00
+1997-09-10T12:40:00
+1997-09-10T13:00:00
+1997-09-10T13:20:00
+1997-09-10T13:40:00
+1997-09-10T14:00:00
+1997-09-10T14:20:00
+1997-09-10T14:40:00
+1997-09-10T15:00:00
+1997-09-10T15:20:00
+1997-09-10T15:40:00
+1997-09-10T16:00:00
+1997-09-10T16:20:00
+1997-09-10T16:40:00
+1997-09-11T09:00:00
+1997-09-11T09:20:00
+1997-09-11T09:40:00
+1997-09-11T10:00:00
+1997-09-11T10:20:00
+1997-09-11T10:40:00
+1997-09-11T11:00:00
+1997-09-11T11:20:00
+1997-09-11T11:40:00
+1997-09-11T12:00:00
+1997-09-11T12:20:00
+1997-09-11T12:40:00
+1997-09-11T13:00:00
+1997-09-11T13:20:00
+1997-09-11T13:40:00
+1997-09-11T14:00:00
+1997-09-11T14:20:00
+1997-09-11T14:40:00
+1997-09-11T15:00:00
+1997-09-11T15:20:00
+1997-09-11T15:40:00
+1997-09-11T16:00:00
+1997-09-11T16:20:00
+1997-09-11T16:40:00
+1997-09-12T09:00:00
+1997-09-12T09:20:00
+1997-09-12T09:40:00
+1997-09-12T10:00:00
+1997-09-12T10:20:00
+1997-09-12T10:40:00
+1997-09-12T11:00:00
+1997-09-12T11:20:00
+1997-09-12T11:40:00
+1997-09-12T12:00:00
+1997-09-12T12:20:00
+1997-09-12T12:40:00
+1997-09-12T13:00:00
+1997-09-12T13:20:00
+1997-09-12T13:40:00
+1997-09-12T14:00:00
+1997-09-12T14:20:00
+1997-09-12T14:40:00
+1997-09-12T15:00:00
+1997-09-12T15:20:00
+1997-09-12T15:40:00
+1997-09-12T16:00:00
+1997-09-12T16:20:00
+1997-09-12T16:40:00
+1997-09-13T09:00:00
+1997-09-13T09:20:00
+1997-09-13T09:40:00
+1997-09-13T10:00:00
+1997-09-13T10:20:00
+1997-09-13T10:40:00
+1997-09-13T11:00:00
+1997-09-13T11:20:00
+1997-09-13T11:40:00
+1997-09-13T12:00:00
+1997-09-13T12:20:00
+1997-09-13T12:40:00
+1997-09-13T13:00:00
+1997-09-13T13:20:00
+1997-09-13T13:40:00
+1997-09-13T14:00:00
+1997-09-13T14:20:00
+1997-09-13T14:40:00
+1997-09-13T15:00:00
+1997-09-13T15:20:00
+1997-09-13T15:40:00
+1997-09-13T16:00:00
+1997-09-13T16:20:00
+1997-09-13T16:40:00
+1997-09-14T09:00:00
+1997-09-14T09:20:00
+1997-09-14T09:40:00
+1997-09-14T10:00:00
+1997-09-14T10:20:00
+1997-09-14T10:40:00
+1997-09-14T11:00:00
+1997-09-14T11:20:00
+1997-09-14T11:40:00
+1997-09-14T12:00:00
+1997-09-14T12:20:00
+1997-09-14T12:40:00
+1997-09-14T13:00:00
+1997-09-14T13:20:00
+1997-09-14T13:40:00
+1997-09-14T14:00:00
+1997-09-14T14:20:00
+1997-09-14T14:40:00
+1997-09-14T15:00:00
+1997-09-14T15:20:00
+1997-09-14T15:40:00
+1997-09-14T16:00:00
+1997-09-14T16:20:00
+1997-09-14T16:40:00
+1997-09-15T09:00:00
+1997-09-15T09:20:00
+1997-09-15T09:40:00
+1997-09-15T10:00:00
+1997-09-15T10:20:00
+1997-09-15T10:40:00
+1997-09-15T11:00:00
+1997-09-15T11:20:00
+1997-09-15T11:40:00
+1997-09-15T12:00:00
+1997-09-15T12:20:00
+1997-09-15T12:40:00
+1997-09-15T13:00:00
+1997-09-15T13:20:00
+1997-09-15T13:40:00
+1997-09-15T14:00:00
+1997-09-15T14:20:00
+1997-09-15T14:40:00
+1997-09-15T15:00:00
+1997-09-15T15:20:00
+1997-09-15T15:40:00
+1997-09-15T16:00:00
+1997-09-15T16:20:00
+1997-09-15T16:40:00
+1997-09-16T09:00:00
+1997-09-16T09:20:00
+1997-09-16T09:40:00
+1997-09-16T10:00:00
+1997-09-16T10:20:00
+1997-09-16T10:40:00
+1997-09-16T11:00:00
+1997-09-16T11:20:00
+1997-09-16T11:40:00
+1997-09-16T12:00:00
+1997-09-16T12:20:00
+1997-09-16T12:40:00
+1997-09-16T13:00:00
+1997-09-16T13:20:00
+1997-09-16T13:40:00
+1997-09-16T14:00:00
+1997-09-16T14:20:00
+1997-09-16T14:40:00
+1997-09-16T15:00:00
+1997-09-16T15:20:00
+1997-09-16T15:40:00
+1997-09-16T16:00:00
+1997-09-16T16:20:00
+1997-09-16T16:40:00
+1997-09-17T09:00:00
+1997-09-17T09:20:00
+1997-09-17T09:40:00
+1997-09-17T10:00:00
+1997-09-17T10:20:00
+1997-09-17T10:40:00
+1997-09-17T11:00:00
+1997-09-17T11:20:00
+1997-09-17T11:40:00
+1997-09-17T12:00:00
+1997-09-17T12:20:00
+1997-09-17T12:40:00
+1997-09-17T13:00:00
+1997-09-17T13:20:00
+1997-09-17T13:40:00
+1997-09-17T14:00:00
+1997-09-17T14:20:00
+1997-09-17T14:40:00
+1997-09-17T15:00:00
+1997-09-17T15:20:00
+1997-09-17T15:40:00
+1997-09-17T16:00:00
+1997-09-17T16:20:00
+1997-09-17T16:40:00
+1997-09-18T09:00:00
+1997-09-18T09:20:00
+1997-09-18T09:40:00
+1997-09-18T10:00:00
+1997-09-18T10:20:00
+1997-09-18T10:40:00
+1997-09-18T11:00:00
+1997-09-18T11:20:00
+1997-09-18T11:40:00
+1997-09-18T12:00:00
+1997-09-18T12:20:00
+1997-09-18T12:40:00
+1997-09-18T13:00:00
+1997-09-18T13:20:00
+1997-09-18T13:40:00
+1997-09-18T14:00:00
+1997-09-18T14:20:00
+1997-09-18T14:40:00
+1997-09-18T15:00:00
+1997-09-18T15:20:00
+1997-09-18T15:40:00
+1997-09-18T16:00:00
+1997-09-18T16:20:00
+1997-09-18T16:40:00
+1997-09-19T09:00:00
+1997-09-19T09:20:00
+1997-09-19T09:40:00
+1997-09-19T10:00:00
+1997-09-19T10:20:00
+1997-09-19T10:40:00
+1997-09-19T11:00:00
+1997-09-19T11:20:00
+1997-09-19T11:40:00
+1997-09-19T12:00:00
+1997-09-19T12:20:00
+1997-09-19T12:40:00
+1997-09-19T13:00:00
+1997-09-19T13:20:00
+1997-09-19T13:40:00
+1997-09-19T14:00:00
+1997-09-19T14:20:00
+1997-09-19T14:40:00
+1997-09-19T15:00:00
+1997-09-19T15:20:00
+1997-09-19T15:40:00
+1997-09-19T16:00:00
+1997-09-19T16:20:00
+1997-09-19T16:40:00
+1997-09-20T09:00:00
+1997-09-20T09:20:00
+1997-09-20T09:40:00
+1997-09-20T10:00:00
+1997-09-20T10:20:00
+1997-09-20T10:40:00
+1997-09-20T11:00:00
+1997-09-20T11:20:00
+1997-09-20T11:40:00
+1997-09-20T12:00:00
+1997-09-20T12:20:00
+1997-09-20T12:40:00
+1997-09-20T13:00:00
+1997-09-20T13:20:00
+1997-09-20T13:40:00
+1997-09-20T14:00:00
+1997-09-20T14:20:00
+1997-09-20T14:40:00
+1997-09-20T15:00:00
+1997-09-20T15:20:00
+1997-09-20T15:40:00
+1997-09-20T16:00:00
+1997-09-20T16:20:00
+1997-09-20T16:40:00
+1997-09-21T09:00:00
+1997-09-21T09:20:00
+1997-09-21T09:40:00
+1997-09-21T10:00:00
+1997-09-21T10:20:00
+1997-09-21T10:40:00
+1997-09-21T11:00:00
+1997-09-21T11:20:00
+1997-09-21T11:40:00
+1997-09-21T12:00:00
+1997-09-21T12:20:00
+1997-09-21T12:40:00
+1997-09-21T13:00:00
+1997-09-21T13:20:00
+1997-09-21T13:40:00
+1997-09-21T14:00:00
+1997-09-21T14:20:00
+1997-09-21T14:40:00
+1997-09-21T15:00:00
+1997-09-21T15:20:00
+1997-09-21T15:40:00
+1997-09-21T16:00:00
+1997-09-21T16:20:00
+1997-09-21T16:40:00
+1997-09-22T09:00:00
+1997-09-22T09:20:00
+1997-09-22T09:40:00
+1997-09-22T10:00:00
+1997-09-22T10:20:00
+1997-09-22T10:40:00
+1997-09-22T11:00:00
+1997-09-22T11:20:00
+1997-09-22T11:40:00
+1997-09-22T12:00:00
+1997-09-22T12:20:00
+1997-09-22T12:40:00
+1997-09-22T13:00:00
+1997-09-22T13:20:00
+1997-09-22T13:40:00
+1997-09-22T14:00:00
+1997-09-22T14:20:00
+1997-09-22T14:40:00
+1997-09-22T15:00:00
+1997-09-22T15:20:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase38.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase38.ics.prev.ref
new file mode 100644
index 00000000..c7cffef1
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase38.ics.prev.ref
@@ -0,0 +1,500 @@
+2010-12-31T16:40:00
+2010-12-31T16:20:00
+2010-12-31T16:00:00
+2010-12-31T15:40:00
+2010-12-31T15:20:00
+2010-12-31T15:00:00
+2010-12-31T14:40:00
+2010-12-31T14:20:00
+2010-12-31T14:00:00
+2010-12-31T13:40:00
+2010-12-31T13:20:00
+2010-12-31T13:00:00
+2010-12-31T12:40:00
+2010-12-31T12:20:00
+2010-12-31T12:00:00
+2010-12-31T11:40:00
+2010-12-31T11:20:00
+2010-12-31T11:00:00
+2010-12-31T10:40:00
+2010-12-31T10:20:00
+2010-12-31T10:00:00
+2010-12-31T09:40:00
+2010-12-31T09:20:00
+2010-12-31T09:00:00
+2010-12-30T16:40:00
+2010-12-30T16:20:00
+2010-12-30T16:00:00
+2010-12-30T15:40:00
+2010-12-30T15:20:00
+2010-12-30T15:00:00
+2010-12-30T14:40:00
+2010-12-30T14:20:00
+2010-12-30T14:00:00
+2010-12-30T13:40:00
+2010-12-30T13:20:00
+2010-12-30T13:00:00
+2010-12-30T12:40:00
+2010-12-30T12:20:00
+2010-12-30T12:00:00
+2010-12-30T11:40:00
+2010-12-30T11:20:00
+2010-12-30T11:00:00
+2010-12-30T10:40:00
+2010-12-30T10:20:00
+2010-12-30T10:00:00
+2010-12-30T09:40:00
+2010-12-30T09:20:00
+2010-12-30T09:00:00
+2010-12-29T16:40:00
+2010-12-29T16:20:00
+2010-12-29T16:00:00
+2010-12-29T15:40:00
+2010-12-29T15:20:00
+2010-12-29T15:00:00
+2010-12-29T14:40:00
+2010-12-29T14:20:00
+2010-12-29T14:00:00
+2010-12-29T13:40:00
+2010-12-29T13:20:00
+2010-12-29T13:00:00
+2010-12-29T12:40:00
+2010-12-29T12:20:00
+2010-12-29T12:00:00
+2010-12-29T11:40:00
+2010-12-29T11:20:00
+2010-12-29T11:00:00
+2010-12-29T10:40:00
+2010-12-29T10:20:00
+2010-12-29T10:00:00
+2010-12-29T09:40:00
+2010-12-29T09:20:00
+2010-12-29T09:00:00
+2010-12-28T16:40:00
+2010-12-28T16:20:00
+2010-12-28T16:00:00
+2010-12-28T15:40:00
+2010-12-28T15:20:00
+2010-12-28T15:00:00
+2010-12-28T14:40:00
+2010-12-28T14:20:00
+2010-12-28T14:00:00
+2010-12-28T13:40:00
+2010-12-28T13:20:00
+2010-12-28T13:00:00
+2010-12-28T12:40:00
+2010-12-28T12:20:00
+2010-12-28T12:00:00
+2010-12-28T11:40:00
+2010-12-28T11:20:00
+2010-12-28T11:00:00
+2010-12-28T10:40:00
+2010-12-28T10:20:00
+2010-12-28T10:00:00
+2010-12-28T09:40:00
+2010-12-28T09:20:00
+2010-12-28T09:00:00
+2010-12-27T16:40:00
+2010-12-27T16:20:00
+2010-12-27T16:00:00
+2010-12-27T15:40:00
+2010-12-27T15:20:00
+2010-12-27T15:00:00
+2010-12-27T14:40:00
+2010-12-27T14:20:00
+2010-12-27T14:00:00
+2010-12-27T13:40:00
+2010-12-27T13:20:00
+2010-12-27T13:00:00
+2010-12-27T12:40:00
+2010-12-27T12:20:00
+2010-12-27T12:00:00
+2010-12-27T11:40:00
+2010-12-27T11:20:00
+2010-12-27T11:00:00
+2010-12-27T10:40:00
+2010-12-27T10:20:00
+2010-12-27T10:00:00
+2010-12-27T09:40:00
+2010-12-27T09:20:00
+2010-12-27T09:00:00
+2010-12-26T16:40:00
+2010-12-26T16:20:00
+2010-12-26T16:00:00
+2010-12-26T15:40:00
+2010-12-26T15:20:00
+2010-12-26T15:00:00
+2010-12-26T14:40:00
+2010-12-26T14:20:00
+2010-12-26T14:00:00
+2010-12-26T13:40:00
+2010-12-26T13:20:00
+2010-12-26T13:00:00
+2010-12-26T12:40:00
+2010-12-26T12:20:00
+2010-12-26T12:00:00
+2010-12-26T11:40:00
+2010-12-26T11:20:00
+2010-12-26T11:00:00
+2010-12-26T10:40:00
+2010-12-26T10:20:00
+2010-12-26T10:00:00
+2010-12-26T09:40:00
+2010-12-26T09:20:00
+2010-12-26T09:00:00
+2010-12-25T16:40:00
+2010-12-25T16:20:00
+2010-12-25T16:00:00
+2010-12-25T15:40:00
+2010-12-25T15:20:00
+2010-12-25T15:00:00
+2010-12-25T14:40:00
+2010-12-25T14:20:00
+2010-12-25T14:00:00
+2010-12-25T13:40:00
+2010-12-25T13:20:00
+2010-12-25T13:00:00
+2010-12-25T12:40:00
+2010-12-25T12:20:00
+2010-12-25T12:00:00
+2010-12-25T11:40:00
+2010-12-25T11:20:00
+2010-12-25T11:00:00
+2010-12-25T10:40:00
+2010-12-25T10:20:00
+2010-12-25T10:00:00
+2010-12-25T09:40:00
+2010-12-25T09:20:00
+2010-12-25T09:00:00
+2010-12-24T16:40:00
+2010-12-24T16:20:00
+2010-12-24T16:00:00
+2010-12-24T15:40:00
+2010-12-24T15:20:00
+2010-12-24T15:00:00
+2010-12-24T14:40:00
+2010-12-24T14:20:00
+2010-12-24T14:00:00
+2010-12-24T13:40:00
+2010-12-24T13:20:00
+2010-12-24T13:00:00
+2010-12-24T12:40:00
+2010-12-24T12:20:00
+2010-12-24T12:00:00
+2010-12-24T11:40:00
+2010-12-24T11:20:00
+2010-12-24T11:00:00
+2010-12-24T10:40:00
+2010-12-24T10:20:00
+2010-12-24T10:00:00
+2010-12-24T09:40:00
+2010-12-24T09:20:00
+2010-12-24T09:00:00
+2010-12-23T16:40:00
+2010-12-23T16:20:00
+2010-12-23T16:00:00
+2010-12-23T15:40:00
+2010-12-23T15:20:00
+2010-12-23T15:00:00
+2010-12-23T14:40:00
+2010-12-23T14:20:00
+2010-12-23T14:00:00
+2010-12-23T13:40:00
+2010-12-23T13:20:00
+2010-12-23T13:00:00
+2010-12-23T12:40:00
+2010-12-23T12:20:00
+2010-12-23T12:00:00
+2010-12-23T11:40:00
+2010-12-23T11:20:00
+2010-12-23T11:00:00
+2010-12-23T10:40:00
+2010-12-23T10:20:00
+2010-12-23T10:00:00
+2010-12-23T09:40:00
+2010-12-23T09:20:00
+2010-12-23T09:00:00
+2010-12-22T16:40:00
+2010-12-22T16:20:00
+2010-12-22T16:00:00
+2010-12-22T15:40:00
+2010-12-22T15:20:00
+2010-12-22T15:00:00
+2010-12-22T14:40:00
+2010-12-22T14:20:00
+2010-12-22T14:00:00
+2010-12-22T13:40:00
+2010-12-22T13:20:00
+2010-12-22T13:00:00
+2010-12-22T12:40:00
+2010-12-22T12:20:00
+2010-12-22T12:00:00
+2010-12-22T11:40:00
+2010-12-22T11:20:00
+2010-12-22T11:00:00
+2010-12-22T10:40:00
+2010-12-22T10:20:00
+2010-12-22T10:00:00
+2010-12-22T09:40:00
+2010-12-22T09:20:00
+2010-12-22T09:00:00
+2010-12-21T16:40:00
+2010-12-21T16:20:00
+2010-12-21T16:00:00
+2010-12-21T15:40:00
+2010-12-21T15:20:00
+2010-12-21T15:00:00
+2010-12-21T14:40:00
+2010-12-21T14:20:00
+2010-12-21T14:00:00
+2010-12-21T13:40:00
+2010-12-21T13:20:00
+2010-12-21T13:00:00
+2010-12-21T12:40:00
+2010-12-21T12:20:00
+2010-12-21T12:00:00
+2010-12-21T11:40:00
+2010-12-21T11:20:00
+2010-12-21T11:00:00
+2010-12-21T10:40:00
+2010-12-21T10:20:00
+2010-12-21T10:00:00
+2010-12-21T09:40:00
+2010-12-21T09:20:00
+2010-12-21T09:00:00
+2010-12-20T16:40:00
+2010-12-20T16:20:00
+2010-12-20T16:00:00
+2010-12-20T15:40:00
+2010-12-20T15:20:00
+2010-12-20T15:00:00
+2010-12-20T14:40:00
+2010-12-20T14:20:00
+2010-12-20T14:00:00
+2010-12-20T13:40:00
+2010-12-20T13:20:00
+2010-12-20T13:00:00
+2010-12-20T12:40:00
+2010-12-20T12:20:00
+2010-12-20T12:00:00
+2010-12-20T11:40:00
+2010-12-20T11:20:00
+2010-12-20T11:00:00
+2010-12-20T10:40:00
+2010-12-20T10:20:00
+2010-12-20T10:00:00
+2010-12-20T09:40:00
+2010-12-20T09:20:00
+2010-12-20T09:00:00
+2010-12-19T16:40:00
+2010-12-19T16:20:00
+2010-12-19T16:00:00
+2010-12-19T15:40:00
+2010-12-19T15:20:00
+2010-12-19T15:00:00
+2010-12-19T14:40:00
+2010-12-19T14:20:00
+2010-12-19T14:00:00
+2010-12-19T13:40:00
+2010-12-19T13:20:00
+2010-12-19T13:00:00
+2010-12-19T12:40:00
+2010-12-19T12:20:00
+2010-12-19T12:00:00
+2010-12-19T11:40:00
+2010-12-19T11:20:00
+2010-12-19T11:00:00
+2010-12-19T10:40:00
+2010-12-19T10:20:00
+2010-12-19T10:00:00
+2010-12-19T09:40:00
+2010-12-19T09:20:00
+2010-12-19T09:00:00
+2010-12-18T16:40:00
+2010-12-18T16:20:00
+2010-12-18T16:00:00
+2010-12-18T15:40:00
+2010-12-18T15:20:00
+2010-12-18T15:00:00
+2010-12-18T14:40:00
+2010-12-18T14:20:00
+2010-12-18T14:00:00
+2010-12-18T13:40:00
+2010-12-18T13:20:00
+2010-12-18T13:00:00
+2010-12-18T12:40:00
+2010-12-18T12:20:00
+2010-12-18T12:00:00
+2010-12-18T11:40:00
+2010-12-18T11:20:00
+2010-12-18T11:00:00
+2010-12-18T10:40:00
+2010-12-18T10:20:00
+2010-12-18T10:00:00
+2010-12-18T09:40:00
+2010-12-18T09:20:00
+2010-12-18T09:00:00
+2010-12-17T16:40:00
+2010-12-17T16:20:00
+2010-12-17T16:00:00
+2010-12-17T15:40:00
+2010-12-17T15:20:00
+2010-12-17T15:00:00
+2010-12-17T14:40:00
+2010-12-17T14:20:00
+2010-12-17T14:00:00
+2010-12-17T13:40:00
+2010-12-17T13:20:00
+2010-12-17T13:00:00
+2010-12-17T12:40:00
+2010-12-17T12:20:00
+2010-12-17T12:00:00
+2010-12-17T11:40:00
+2010-12-17T11:20:00
+2010-12-17T11:00:00
+2010-12-17T10:40:00
+2010-12-17T10:20:00
+2010-12-17T10:00:00
+2010-12-17T09:40:00
+2010-12-17T09:20:00
+2010-12-17T09:00:00
+2010-12-16T16:40:00
+2010-12-16T16:20:00
+2010-12-16T16:00:00
+2010-12-16T15:40:00
+2010-12-16T15:20:00
+2010-12-16T15:00:00
+2010-12-16T14:40:00
+2010-12-16T14:20:00
+2010-12-16T14:00:00
+2010-12-16T13:40:00
+2010-12-16T13:20:00
+2010-12-16T13:00:00
+2010-12-16T12:40:00
+2010-12-16T12:20:00
+2010-12-16T12:00:00
+2010-12-16T11:40:00
+2010-12-16T11:20:00
+2010-12-16T11:00:00
+2010-12-16T10:40:00
+2010-12-16T10:20:00
+2010-12-16T10:00:00
+2010-12-16T09:40:00
+2010-12-16T09:20:00
+2010-12-16T09:00:00
+2010-12-15T16:40:00
+2010-12-15T16:20:00
+2010-12-15T16:00:00
+2010-12-15T15:40:00
+2010-12-15T15:20:00
+2010-12-15T15:00:00
+2010-12-15T14:40:00
+2010-12-15T14:20:00
+2010-12-15T14:00:00
+2010-12-15T13:40:00
+2010-12-15T13:20:00
+2010-12-15T13:00:00
+2010-12-15T12:40:00
+2010-12-15T12:20:00
+2010-12-15T12:00:00
+2010-12-15T11:40:00
+2010-12-15T11:20:00
+2010-12-15T11:00:00
+2010-12-15T10:40:00
+2010-12-15T10:20:00
+2010-12-15T10:00:00
+2010-12-15T09:40:00
+2010-12-15T09:20:00
+2010-12-15T09:00:00
+2010-12-14T16:40:00
+2010-12-14T16:20:00
+2010-12-14T16:00:00
+2010-12-14T15:40:00
+2010-12-14T15:20:00
+2010-12-14T15:00:00
+2010-12-14T14:40:00
+2010-12-14T14:20:00
+2010-12-14T14:00:00
+2010-12-14T13:40:00
+2010-12-14T13:20:00
+2010-12-14T13:00:00
+2010-12-14T12:40:00
+2010-12-14T12:20:00
+2010-12-14T12:00:00
+2010-12-14T11:40:00
+2010-12-14T11:20:00
+2010-12-14T11:00:00
+2010-12-14T10:40:00
+2010-12-14T10:20:00
+2010-12-14T10:00:00
+2010-12-14T09:40:00
+2010-12-14T09:20:00
+2010-12-14T09:00:00
+2010-12-13T16:40:00
+2010-12-13T16:20:00
+2010-12-13T16:00:00
+2010-12-13T15:40:00
+2010-12-13T15:20:00
+2010-12-13T15:00:00
+2010-12-13T14:40:00
+2010-12-13T14:20:00
+2010-12-13T14:00:00
+2010-12-13T13:40:00
+2010-12-13T13:20:00
+2010-12-13T13:00:00
+2010-12-13T12:40:00
+2010-12-13T12:20:00
+2010-12-13T12:00:00
+2010-12-13T11:40:00
+2010-12-13T11:20:00
+2010-12-13T11:00:00
+2010-12-13T10:40:00
+2010-12-13T10:20:00
+2010-12-13T10:00:00
+2010-12-13T09:40:00
+2010-12-13T09:20:00
+2010-12-13T09:00:00
+2010-12-12T16:40:00
+2010-12-12T16:20:00
+2010-12-12T16:00:00
+2010-12-12T15:40:00
+2010-12-12T15:20:00
+2010-12-12T15:00:00
+2010-12-12T14:40:00
+2010-12-12T14:20:00
+2010-12-12T14:00:00
+2010-12-12T13:40:00
+2010-12-12T13:20:00
+2010-12-12T13:00:00
+2010-12-12T12:40:00
+2010-12-12T12:20:00
+2010-12-12T12:00:00
+2010-12-12T11:40:00
+2010-12-12T11:20:00
+2010-12-12T11:00:00
+2010-12-12T10:40:00
+2010-12-12T10:20:00
+2010-12-12T10:00:00
+2010-12-12T09:40:00
+2010-12-12T09:20:00
+2010-12-12T09:00:00
+2010-12-11T16:40:00
+2010-12-11T16:20:00
+2010-12-11T16:00:00
+2010-12-11T15:40:00
+2010-12-11T15:20:00
+2010-12-11T15:00:00
+2010-12-11T14:40:00
+2010-12-11T14:20:00
+2010-12-11T14:00:00
+2010-12-11T13:40:00
+2010-12-11T13:20:00
+2010-12-11T13:00:00
+2010-12-11T12:40:00
+2010-12-11T12:20:00
+2010-12-11T12:00:00
+2010-12-11T11:40:00
+2010-12-11T11:20:00
+2010-12-11T11:00:00
+2010-12-11T10:40:00
+2010-12-11T10:20:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase38.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase38.ics.recurson.ref
new file mode 100644
index 00000000..3fe99758
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase38.ics.recurson.ref
@@ -0,0 +1,4869 @@
+1997-09-02
+1997-09-03
+1997-09-04
+1997-09-05
+1997-09-06
+1997-09-07
+1997-09-08
+1997-09-09
+1997-09-10
+1997-09-11
+1997-09-12
+1997-09-13
+1997-09-14
+1997-09-15
+1997-09-16
+1997-09-17
+1997-09-18
+1997-09-19
+1997-09-20
+1997-09-21
+1997-09-22
+1997-09-23
+1997-09-24
+1997-09-25
+1997-09-26
+1997-09-27
+1997-09-28
+1997-09-29
+1997-09-30
+1997-10-01
+1997-10-02
+1997-10-03
+1997-10-04
+1997-10-05
+1997-10-06
+1997-10-07
+1997-10-08
+1997-10-09
+1997-10-10
+1997-10-11
+1997-10-12
+1997-10-13
+1997-10-14
+1997-10-15
+1997-10-16
+1997-10-17
+1997-10-18
+1997-10-19
+1997-10-20
+1997-10-21
+1997-10-22
+1997-10-23
+1997-10-24
+1997-10-25
+1997-10-26
+1997-10-27
+1997-10-28
+1997-10-29
+1997-10-30
+1997-10-31
+1997-11-01
+1997-11-02
+1997-11-03
+1997-11-04
+1997-11-05
+1997-11-06
+1997-11-07
+1997-11-08
+1997-11-09
+1997-11-10
+1997-11-11
+1997-11-12
+1997-11-13
+1997-11-14
+1997-11-15
+1997-11-16
+1997-11-17
+1997-11-18
+1997-11-19
+1997-11-20
+1997-11-21
+1997-11-22
+1997-11-23
+1997-11-24
+1997-11-25
+1997-11-26
+1997-11-27
+1997-11-28
+1997-11-29
+1997-11-30
+1997-12-01
+1997-12-02
+1997-12-03
+1997-12-04
+1997-12-05
+1997-12-06
+1997-12-07
+1997-12-08
+1997-12-09
+1997-12-10
+1997-12-11
+1997-12-12
+1997-12-13
+1997-12-14
+1997-12-15
+1997-12-16
+1997-12-17
+1997-12-18
+1997-12-19
+1997-12-20
+1997-12-21
+1997-12-22
+1997-12-23
+1997-12-24
+1997-12-25
+1997-12-26
+1997-12-27
+1997-12-28
+1997-12-29
+1997-12-30
+1997-12-31
+1998-01-01
+1998-01-02
+1998-01-03
+1998-01-04
+1998-01-05
+1998-01-06
+1998-01-07
+1998-01-08
+1998-01-09
+1998-01-10
+1998-01-11
+1998-01-12
+1998-01-13
+1998-01-14
+1998-01-15
+1998-01-16
+1998-01-17
+1998-01-18
+1998-01-19
+1998-01-20
+1998-01-21
+1998-01-22
+1998-01-23
+1998-01-24
+1998-01-25
+1998-01-26
+1998-01-27
+1998-01-28
+1998-01-29
+1998-01-30
+1998-01-31
+1998-02-01
+1998-02-02
+1998-02-03
+1998-02-04
+1998-02-05
+1998-02-06
+1998-02-07
+1998-02-08
+1998-02-09
+1998-02-10
+1998-02-11
+1998-02-12
+1998-02-13
+1998-02-14
+1998-02-15
+1998-02-16
+1998-02-17
+1998-02-18
+1998-02-19
+1998-02-20
+1998-02-21
+1998-02-22
+1998-02-23
+1998-02-24
+1998-02-25
+1998-02-26
+1998-02-27
+1998-02-28
+1998-03-01
+1998-03-02
+1998-03-03
+1998-03-04
+1998-03-05
+1998-03-06
+1998-03-07
+1998-03-08
+1998-03-09
+1998-03-10
+1998-03-11
+1998-03-12
+1998-03-13
+1998-03-14
+1998-03-15
+1998-03-16
+1998-03-17
+1998-03-18
+1998-03-19
+1998-03-20
+1998-03-21
+1998-03-22
+1998-03-23
+1998-03-24
+1998-03-25
+1998-03-26
+1998-03-27
+1998-03-28
+1998-03-29
+1998-03-30
+1998-03-31
+1998-04-01
+1998-04-02
+1998-04-03
+1998-04-04
+1998-04-05
+1998-04-06
+1998-04-07
+1998-04-08
+1998-04-09
+1998-04-10
+1998-04-11
+1998-04-12
+1998-04-13
+1998-04-14
+1998-04-15
+1998-04-16
+1998-04-17
+1998-04-18
+1998-04-19
+1998-04-20
+1998-04-21
+1998-04-22
+1998-04-23
+1998-04-24
+1998-04-25
+1998-04-26
+1998-04-27
+1998-04-28
+1998-04-29
+1998-04-30
+1998-05-01
+1998-05-02
+1998-05-03
+1998-05-04
+1998-05-05
+1998-05-06
+1998-05-07
+1998-05-08
+1998-05-09
+1998-05-10
+1998-05-11
+1998-05-12
+1998-05-13
+1998-05-14
+1998-05-15
+1998-05-16
+1998-05-17
+1998-05-18
+1998-05-19
+1998-05-20
+1998-05-21
+1998-05-22
+1998-05-23
+1998-05-24
+1998-05-25
+1998-05-26
+1998-05-27
+1998-05-28
+1998-05-29
+1998-05-30
+1998-05-31
+1998-06-01
+1998-06-02
+1998-06-03
+1998-06-04
+1998-06-05
+1998-06-06
+1998-06-07
+1998-06-08
+1998-06-09
+1998-06-10
+1998-06-11
+1998-06-12
+1998-06-13
+1998-06-14
+1998-06-15
+1998-06-16
+1998-06-17
+1998-06-18
+1998-06-19
+1998-06-20
+1998-06-21
+1998-06-22
+1998-06-23
+1998-06-24
+1998-06-25
+1998-06-26
+1998-06-27
+1998-06-28
+1998-06-29
+1998-06-30
+1998-07-01
+1998-07-02
+1998-07-03
+1998-07-04
+1998-07-05
+1998-07-06
+1998-07-07
+1998-07-08
+1998-07-09
+1998-07-10
+1998-07-11
+1998-07-12
+1998-07-13
+1998-07-14
+1998-07-15
+1998-07-16
+1998-07-17
+1998-07-18
+1998-07-19
+1998-07-20
+1998-07-21
+1998-07-22
+1998-07-23
+1998-07-24
+1998-07-25
+1998-07-26
+1998-07-27
+1998-07-28
+1998-07-29
+1998-07-30
+1998-07-31
+1998-08-01
+1998-08-02
+1998-08-03
+1998-08-04
+1998-08-05
+1998-08-06
+1998-08-07
+1998-08-08
+1998-08-09
+1998-08-10
+1998-08-11
+1998-08-12
+1998-08-13
+1998-08-14
+1998-08-15
+1998-08-16
+1998-08-17
+1998-08-18
+1998-08-19
+1998-08-20
+1998-08-21
+1998-08-22
+1998-08-23
+1998-08-24
+1998-08-25
+1998-08-26
+1998-08-27
+1998-08-28
+1998-08-29
+1998-08-30
+1998-08-31
+1998-09-01
+1998-09-02
+1998-09-03
+1998-09-04
+1998-09-05
+1998-09-06
+1998-09-07
+1998-09-08
+1998-09-09
+1998-09-10
+1998-09-11
+1998-09-12
+1998-09-13
+1998-09-14
+1998-09-15
+1998-09-16
+1998-09-17
+1998-09-18
+1998-09-19
+1998-09-20
+1998-09-21
+1998-09-22
+1998-09-23
+1998-09-24
+1998-09-25
+1998-09-26
+1998-09-27
+1998-09-28
+1998-09-29
+1998-09-30
+1998-10-01
+1998-10-02
+1998-10-03
+1998-10-04
+1998-10-05
+1998-10-06
+1998-10-07
+1998-10-08
+1998-10-09
+1998-10-10
+1998-10-11
+1998-10-12
+1998-10-13
+1998-10-14
+1998-10-15
+1998-10-16
+1998-10-17
+1998-10-18
+1998-10-19
+1998-10-20
+1998-10-21
+1998-10-22
+1998-10-23
+1998-10-24
+1998-10-25
+1998-10-26
+1998-10-27
+1998-10-28
+1998-10-29
+1998-10-30
+1998-10-31
+1998-11-01
+1998-11-02
+1998-11-03
+1998-11-04
+1998-11-05
+1998-11-06
+1998-11-07
+1998-11-08
+1998-11-09
+1998-11-10
+1998-11-11
+1998-11-12
+1998-11-13
+1998-11-14
+1998-11-15
+1998-11-16
+1998-11-17
+1998-11-18
+1998-11-19
+1998-11-20
+1998-11-21
+1998-11-22
+1998-11-23
+1998-11-24
+1998-11-25
+1998-11-26
+1998-11-27
+1998-11-28
+1998-11-29
+1998-11-30
+1998-12-01
+1998-12-02
+1998-12-03
+1998-12-04
+1998-12-05
+1998-12-06
+1998-12-07
+1998-12-08
+1998-12-09
+1998-12-10
+1998-12-11
+1998-12-12
+1998-12-13
+1998-12-14
+1998-12-15
+1998-12-16
+1998-12-17
+1998-12-18
+1998-12-19
+1998-12-20
+1998-12-21
+1998-12-22
+1998-12-23
+1998-12-24
+1998-12-25
+1998-12-26
+1998-12-27
+1998-12-28
+1998-12-29
+1998-12-30
+1998-12-31
+1999-01-01
+1999-01-02
+1999-01-03
+1999-01-04
+1999-01-05
+1999-01-06
+1999-01-07
+1999-01-08
+1999-01-09
+1999-01-10
+1999-01-11
+1999-01-12
+1999-01-13
+1999-01-14
+1999-01-15
+1999-01-16
+1999-01-17
+1999-01-18
+1999-01-19
+1999-01-20
+1999-01-21
+1999-01-22
+1999-01-23
+1999-01-24
+1999-01-25
+1999-01-26
+1999-01-27
+1999-01-28
+1999-01-29
+1999-01-30
+1999-01-31
+1999-02-01
+1999-02-02
+1999-02-03
+1999-02-04
+1999-02-05
+1999-02-06
+1999-02-07
+1999-02-08
+1999-02-09
+1999-02-10
+1999-02-11
+1999-02-12
+1999-02-13
+1999-02-14
+1999-02-15
+1999-02-16
+1999-02-17
+1999-02-18
+1999-02-19
+1999-02-20
+1999-02-21
+1999-02-22
+1999-02-23
+1999-02-24
+1999-02-25
+1999-02-26
+1999-02-27
+1999-02-28
+1999-03-01
+1999-03-02
+1999-03-03
+1999-03-04
+1999-03-05
+1999-03-06
+1999-03-07
+1999-03-08
+1999-03-09
+1999-03-10
+1999-03-11
+1999-03-12
+1999-03-13
+1999-03-14
+1999-03-15
+1999-03-16
+1999-03-17
+1999-03-18
+1999-03-19
+1999-03-20
+1999-03-21
+1999-03-22
+1999-03-23
+1999-03-24
+1999-03-25
+1999-03-26
+1999-03-27
+1999-03-28
+1999-03-29
+1999-03-30
+1999-03-31
+1999-04-01
+1999-04-02
+1999-04-03
+1999-04-04
+1999-04-05
+1999-04-06
+1999-04-07
+1999-04-08
+1999-04-09
+1999-04-10
+1999-04-11
+1999-04-12
+1999-04-13
+1999-04-14
+1999-04-15
+1999-04-16
+1999-04-17
+1999-04-18
+1999-04-19
+1999-04-20
+1999-04-21
+1999-04-22
+1999-04-23
+1999-04-24
+1999-04-25
+1999-04-26
+1999-04-27
+1999-04-28
+1999-04-29
+1999-04-30
+1999-05-01
+1999-05-02
+1999-05-03
+1999-05-04
+1999-05-05
+1999-05-06
+1999-05-07
+1999-05-08
+1999-05-09
+1999-05-10
+1999-05-11
+1999-05-12
+1999-05-13
+1999-05-14
+1999-05-15
+1999-05-16
+1999-05-17
+1999-05-18
+1999-05-19
+1999-05-20
+1999-05-21
+1999-05-22
+1999-05-23
+1999-05-24
+1999-05-25
+1999-05-26
+1999-05-27
+1999-05-28
+1999-05-29
+1999-05-30
+1999-05-31
+1999-06-01
+1999-06-02
+1999-06-03
+1999-06-04
+1999-06-05
+1999-06-06
+1999-06-07
+1999-06-08
+1999-06-09
+1999-06-10
+1999-06-11
+1999-06-12
+1999-06-13
+1999-06-14
+1999-06-15
+1999-06-16
+1999-06-17
+1999-06-18
+1999-06-19
+1999-06-20
+1999-06-21
+1999-06-22
+1999-06-23
+1999-06-24
+1999-06-25
+1999-06-26
+1999-06-27
+1999-06-28
+1999-06-29
+1999-06-30
+1999-07-01
+1999-07-02
+1999-07-03
+1999-07-04
+1999-07-05
+1999-07-06
+1999-07-07
+1999-07-08
+1999-07-09
+1999-07-10
+1999-07-11
+1999-07-12
+1999-07-13
+1999-07-14
+1999-07-15
+1999-07-16
+1999-07-17
+1999-07-18
+1999-07-19
+1999-07-20
+1999-07-21
+1999-07-22
+1999-07-23
+1999-07-24
+1999-07-25
+1999-07-26
+1999-07-27
+1999-07-28
+1999-07-29
+1999-07-30
+1999-07-31
+1999-08-01
+1999-08-02
+1999-08-03
+1999-08-04
+1999-08-05
+1999-08-06
+1999-08-07
+1999-08-08
+1999-08-09
+1999-08-10
+1999-08-11
+1999-08-12
+1999-08-13
+1999-08-14
+1999-08-15
+1999-08-16
+1999-08-17
+1999-08-18
+1999-08-19
+1999-08-20
+1999-08-21
+1999-08-22
+1999-08-23
+1999-08-24
+1999-08-25
+1999-08-26
+1999-08-27
+1999-08-28
+1999-08-29
+1999-08-30
+1999-08-31
+1999-09-01
+1999-09-02
+1999-09-03
+1999-09-04
+1999-09-05
+1999-09-06
+1999-09-07
+1999-09-08
+1999-09-09
+1999-09-10
+1999-09-11
+1999-09-12
+1999-09-13
+1999-09-14
+1999-09-15
+1999-09-16
+1999-09-17
+1999-09-18
+1999-09-19
+1999-09-20
+1999-09-21
+1999-09-22
+1999-09-23
+1999-09-24
+1999-09-25
+1999-09-26
+1999-09-27
+1999-09-28
+1999-09-29
+1999-09-30
+1999-10-01
+1999-10-02
+1999-10-03
+1999-10-04
+1999-10-05
+1999-10-06
+1999-10-07
+1999-10-08
+1999-10-09
+1999-10-10
+1999-10-11
+1999-10-12
+1999-10-13
+1999-10-14
+1999-10-15
+1999-10-16
+1999-10-17
+1999-10-18
+1999-10-19
+1999-10-20
+1999-10-21
+1999-10-22
+1999-10-23
+1999-10-24
+1999-10-25
+1999-10-26
+1999-10-27
+1999-10-28
+1999-10-29
+1999-10-30
+1999-10-31
+1999-11-01
+1999-11-02
+1999-11-03
+1999-11-04
+1999-11-05
+1999-11-06
+1999-11-07
+1999-11-08
+1999-11-09
+1999-11-10
+1999-11-11
+1999-11-12
+1999-11-13
+1999-11-14
+1999-11-15
+1999-11-16
+1999-11-17
+1999-11-18
+1999-11-19
+1999-11-20
+1999-11-21
+1999-11-22
+1999-11-23
+1999-11-24
+1999-11-25
+1999-11-26
+1999-11-27
+1999-11-28
+1999-11-29
+1999-11-30
+1999-12-01
+1999-12-02
+1999-12-03
+1999-12-04
+1999-12-05
+1999-12-06
+1999-12-07
+1999-12-08
+1999-12-09
+1999-12-10
+1999-12-11
+1999-12-12
+1999-12-13
+1999-12-14
+1999-12-15
+1999-12-16
+1999-12-17
+1999-12-18
+1999-12-19
+1999-12-20
+1999-12-21
+1999-12-22
+1999-12-23
+1999-12-24
+1999-12-25
+1999-12-26
+1999-12-27
+1999-12-28
+1999-12-29
+1999-12-30
+1999-12-31
+2000-01-01
+2000-01-02
+2000-01-03
+2000-01-04
+2000-01-05
+2000-01-06
+2000-01-07
+2000-01-08
+2000-01-09
+2000-01-10
+2000-01-11
+2000-01-12
+2000-01-13
+2000-01-14
+2000-01-15
+2000-01-16
+2000-01-17
+2000-01-18
+2000-01-19
+2000-01-20
+2000-01-21
+2000-01-22
+2000-01-23
+2000-01-24
+2000-01-25
+2000-01-26
+2000-01-27
+2000-01-28
+2000-01-29
+2000-01-30
+2000-01-31
+2000-02-01
+2000-02-02
+2000-02-03
+2000-02-04
+2000-02-05
+2000-02-06
+2000-02-07
+2000-02-08
+2000-02-09
+2000-02-10
+2000-02-11
+2000-02-12
+2000-02-13
+2000-02-14
+2000-02-15
+2000-02-16
+2000-02-17
+2000-02-18
+2000-02-19
+2000-02-20
+2000-02-21
+2000-02-22
+2000-02-23
+2000-02-24
+2000-02-25
+2000-02-26
+2000-02-27
+2000-02-28
+2000-02-29
+2000-03-01
+2000-03-02
+2000-03-03
+2000-03-04
+2000-03-05
+2000-03-06
+2000-03-07
+2000-03-08
+2000-03-09
+2000-03-10
+2000-03-11
+2000-03-12
+2000-03-13
+2000-03-14
+2000-03-15
+2000-03-16
+2000-03-17
+2000-03-18
+2000-03-19
+2000-03-20
+2000-03-21
+2000-03-22
+2000-03-23
+2000-03-24
+2000-03-25
+2000-03-26
+2000-03-27
+2000-03-28
+2000-03-29
+2000-03-30
+2000-03-31
+2000-04-01
+2000-04-02
+2000-04-03
+2000-04-04
+2000-04-05
+2000-04-06
+2000-04-07
+2000-04-08
+2000-04-09
+2000-04-10
+2000-04-11
+2000-04-12
+2000-04-13
+2000-04-14
+2000-04-15
+2000-04-16
+2000-04-17
+2000-04-18
+2000-04-19
+2000-04-20
+2000-04-21
+2000-04-22
+2000-04-23
+2000-04-24
+2000-04-25
+2000-04-26
+2000-04-27
+2000-04-28
+2000-04-29
+2000-04-30
+2000-05-01
+2000-05-02
+2000-05-03
+2000-05-04
+2000-05-05
+2000-05-06
+2000-05-07
+2000-05-08
+2000-05-09
+2000-05-10
+2000-05-11
+2000-05-12
+2000-05-13
+2000-05-14
+2000-05-15
+2000-05-16
+2000-05-17
+2000-05-18
+2000-05-19
+2000-05-20
+2000-05-21
+2000-05-22
+2000-05-23
+2000-05-24
+2000-05-25
+2000-05-26
+2000-05-27
+2000-05-28
+2000-05-29
+2000-05-30
+2000-05-31
+2000-06-01
+2000-06-02
+2000-06-03
+2000-06-04
+2000-06-05
+2000-06-06
+2000-06-07
+2000-06-08
+2000-06-09
+2000-06-10
+2000-06-11
+2000-06-12
+2000-06-13
+2000-06-14
+2000-06-15
+2000-06-16
+2000-06-17
+2000-06-18
+2000-06-19
+2000-06-20
+2000-06-21
+2000-06-22
+2000-06-23
+2000-06-24
+2000-06-25
+2000-06-26
+2000-06-27
+2000-06-28
+2000-06-29
+2000-06-30
+2000-07-01
+2000-07-02
+2000-07-03
+2000-07-04
+2000-07-05
+2000-07-06
+2000-07-07
+2000-07-08
+2000-07-09
+2000-07-10
+2000-07-11
+2000-07-12
+2000-07-13
+2000-07-14
+2000-07-15
+2000-07-16
+2000-07-17
+2000-07-18
+2000-07-19
+2000-07-20
+2000-07-21
+2000-07-22
+2000-07-23
+2000-07-24
+2000-07-25
+2000-07-26
+2000-07-27
+2000-07-28
+2000-07-29
+2000-07-30
+2000-07-31
+2000-08-01
+2000-08-02
+2000-08-03
+2000-08-04
+2000-08-05
+2000-08-06
+2000-08-07
+2000-08-08
+2000-08-09
+2000-08-10
+2000-08-11
+2000-08-12
+2000-08-13
+2000-08-14
+2000-08-15
+2000-08-16
+2000-08-17
+2000-08-18
+2000-08-19
+2000-08-20
+2000-08-21
+2000-08-22
+2000-08-23
+2000-08-24
+2000-08-25
+2000-08-26
+2000-08-27
+2000-08-28
+2000-08-29
+2000-08-30
+2000-08-31
+2000-09-01
+2000-09-02
+2000-09-03
+2000-09-04
+2000-09-05
+2000-09-06
+2000-09-07
+2000-09-08
+2000-09-09
+2000-09-10
+2000-09-11
+2000-09-12
+2000-09-13
+2000-09-14
+2000-09-15
+2000-09-16
+2000-09-17
+2000-09-18
+2000-09-19
+2000-09-20
+2000-09-21
+2000-09-22
+2000-09-23
+2000-09-24
+2000-09-25
+2000-09-26
+2000-09-27
+2000-09-28
+2000-09-29
+2000-09-30
+2000-10-01
+2000-10-02
+2000-10-03
+2000-10-04
+2000-10-05
+2000-10-06
+2000-10-07
+2000-10-08
+2000-10-09
+2000-10-10
+2000-10-11
+2000-10-12
+2000-10-13
+2000-10-14
+2000-10-15
+2000-10-16
+2000-10-17
+2000-10-18
+2000-10-19
+2000-10-20
+2000-10-21
+2000-10-22
+2000-10-23
+2000-10-24
+2000-10-25
+2000-10-26
+2000-10-27
+2000-10-28
+2000-10-29
+2000-10-30
+2000-10-31
+2000-11-01
+2000-11-02
+2000-11-03
+2000-11-04
+2000-11-05
+2000-11-06
+2000-11-07
+2000-11-08
+2000-11-09
+2000-11-10
+2000-11-11
+2000-11-12
+2000-11-13
+2000-11-14
+2000-11-15
+2000-11-16
+2000-11-17
+2000-11-18
+2000-11-19
+2000-11-20
+2000-11-21
+2000-11-22
+2000-11-23
+2000-11-24
+2000-11-25
+2000-11-26
+2000-11-27
+2000-11-28
+2000-11-29
+2000-11-30
+2000-12-01
+2000-12-02
+2000-12-03
+2000-12-04
+2000-12-05
+2000-12-06
+2000-12-07
+2000-12-08
+2000-12-09
+2000-12-10
+2000-12-11
+2000-12-12
+2000-12-13
+2000-12-14
+2000-12-15
+2000-12-16
+2000-12-17
+2000-12-18
+2000-12-19
+2000-12-20
+2000-12-21
+2000-12-22
+2000-12-23
+2000-12-24
+2000-12-25
+2000-12-26
+2000-12-27
+2000-12-28
+2000-12-29
+2000-12-30
+2000-12-31
+2001-01-01
+2001-01-02
+2001-01-03
+2001-01-04
+2001-01-05
+2001-01-06
+2001-01-07
+2001-01-08
+2001-01-09
+2001-01-10
+2001-01-11
+2001-01-12
+2001-01-13
+2001-01-14
+2001-01-15
+2001-01-16
+2001-01-17
+2001-01-18
+2001-01-19
+2001-01-20
+2001-01-21
+2001-01-22
+2001-01-23
+2001-01-24
+2001-01-25
+2001-01-26
+2001-01-27
+2001-01-28
+2001-01-29
+2001-01-30
+2001-01-31
+2001-02-01
+2001-02-02
+2001-02-03
+2001-02-04
+2001-02-05
+2001-02-06
+2001-02-07
+2001-02-08
+2001-02-09
+2001-02-10
+2001-02-11
+2001-02-12
+2001-02-13
+2001-02-14
+2001-02-15
+2001-02-16
+2001-02-17
+2001-02-18
+2001-02-19
+2001-02-20
+2001-02-21
+2001-02-22
+2001-02-23
+2001-02-24
+2001-02-25
+2001-02-26
+2001-02-27
+2001-02-28
+2001-03-01
+2001-03-02
+2001-03-03
+2001-03-04
+2001-03-05
+2001-03-06
+2001-03-07
+2001-03-08
+2001-03-09
+2001-03-10
+2001-03-11
+2001-03-12
+2001-03-13
+2001-03-14
+2001-03-15
+2001-03-16
+2001-03-17
+2001-03-18
+2001-03-19
+2001-03-20
+2001-03-21
+2001-03-22
+2001-03-23
+2001-03-24
+2001-03-25
+2001-03-26
+2001-03-27
+2001-03-28
+2001-03-29
+2001-03-30
+2001-03-31
+2001-04-01
+2001-04-02
+2001-04-03
+2001-04-04
+2001-04-05
+2001-04-06
+2001-04-07
+2001-04-08
+2001-04-09
+2001-04-10
+2001-04-11
+2001-04-12
+2001-04-13
+2001-04-14
+2001-04-15
+2001-04-16
+2001-04-17
+2001-04-18
+2001-04-19
+2001-04-20
+2001-04-21
+2001-04-22
+2001-04-23
+2001-04-24
+2001-04-25
+2001-04-26
+2001-04-27
+2001-04-28
+2001-04-29
+2001-04-30
+2001-05-01
+2001-05-02
+2001-05-03
+2001-05-04
+2001-05-05
+2001-05-06
+2001-05-07
+2001-05-08
+2001-05-09
+2001-05-10
+2001-05-11
+2001-05-12
+2001-05-13
+2001-05-14
+2001-05-15
+2001-05-16
+2001-05-17
+2001-05-18
+2001-05-19
+2001-05-20
+2001-05-21
+2001-05-22
+2001-05-23
+2001-05-24
+2001-05-25
+2001-05-26
+2001-05-27
+2001-05-28
+2001-05-29
+2001-05-30
+2001-05-31
+2001-06-01
+2001-06-02
+2001-06-03
+2001-06-04
+2001-06-05
+2001-06-06
+2001-06-07
+2001-06-08
+2001-06-09
+2001-06-10
+2001-06-11
+2001-06-12
+2001-06-13
+2001-06-14
+2001-06-15
+2001-06-16
+2001-06-17
+2001-06-18
+2001-06-19
+2001-06-20
+2001-06-21
+2001-06-22
+2001-06-23
+2001-06-24
+2001-06-25
+2001-06-26
+2001-06-27
+2001-06-28
+2001-06-29
+2001-06-30
+2001-07-01
+2001-07-02
+2001-07-03
+2001-07-04
+2001-07-05
+2001-07-06
+2001-07-07
+2001-07-08
+2001-07-09
+2001-07-10
+2001-07-11
+2001-07-12
+2001-07-13
+2001-07-14
+2001-07-15
+2001-07-16
+2001-07-17
+2001-07-18
+2001-07-19
+2001-07-20
+2001-07-21
+2001-07-22
+2001-07-23
+2001-07-24
+2001-07-25
+2001-07-26
+2001-07-27
+2001-07-28
+2001-07-29
+2001-07-30
+2001-07-31
+2001-08-01
+2001-08-02
+2001-08-03
+2001-08-04
+2001-08-05
+2001-08-06
+2001-08-07
+2001-08-08
+2001-08-09
+2001-08-10
+2001-08-11
+2001-08-12
+2001-08-13
+2001-08-14
+2001-08-15
+2001-08-16
+2001-08-17
+2001-08-18
+2001-08-19
+2001-08-20
+2001-08-21
+2001-08-22
+2001-08-23
+2001-08-24
+2001-08-25
+2001-08-26
+2001-08-27
+2001-08-28
+2001-08-29
+2001-08-30
+2001-08-31
+2001-09-01
+2001-09-02
+2001-09-03
+2001-09-04
+2001-09-05
+2001-09-06
+2001-09-07
+2001-09-08
+2001-09-09
+2001-09-10
+2001-09-11
+2001-09-12
+2001-09-13
+2001-09-14
+2001-09-15
+2001-09-16
+2001-09-17
+2001-09-18
+2001-09-19
+2001-09-20
+2001-09-21
+2001-09-22
+2001-09-23
+2001-09-24
+2001-09-25
+2001-09-26
+2001-09-27
+2001-09-28
+2001-09-29
+2001-09-30
+2001-10-01
+2001-10-02
+2001-10-03
+2001-10-04
+2001-10-05
+2001-10-06
+2001-10-07
+2001-10-08
+2001-10-09
+2001-10-10
+2001-10-11
+2001-10-12
+2001-10-13
+2001-10-14
+2001-10-15
+2001-10-16
+2001-10-17
+2001-10-18
+2001-10-19
+2001-10-20
+2001-10-21
+2001-10-22
+2001-10-23
+2001-10-24
+2001-10-25
+2001-10-26
+2001-10-27
+2001-10-28
+2001-10-29
+2001-10-30
+2001-10-31
+2001-11-01
+2001-11-02
+2001-11-03
+2001-11-04
+2001-11-05
+2001-11-06
+2001-11-07
+2001-11-08
+2001-11-09
+2001-11-10
+2001-11-11
+2001-11-12
+2001-11-13
+2001-11-14
+2001-11-15
+2001-11-16
+2001-11-17
+2001-11-18
+2001-11-19
+2001-11-20
+2001-11-21
+2001-11-22
+2001-11-23
+2001-11-24
+2001-11-25
+2001-11-26
+2001-11-27
+2001-11-28
+2001-11-29
+2001-11-30
+2001-12-01
+2001-12-02
+2001-12-03
+2001-12-04
+2001-12-05
+2001-12-06
+2001-12-07
+2001-12-08
+2001-12-09
+2001-12-10
+2001-12-11
+2001-12-12
+2001-12-13
+2001-12-14
+2001-12-15
+2001-12-16
+2001-12-17
+2001-12-18
+2001-12-19
+2001-12-20
+2001-12-21
+2001-12-22
+2001-12-23
+2001-12-24
+2001-12-25
+2001-12-26
+2001-12-27
+2001-12-28
+2001-12-29
+2001-12-30
+2001-12-31
+2002-01-01
+2002-01-02
+2002-01-03
+2002-01-04
+2002-01-05
+2002-01-06
+2002-01-07
+2002-01-08
+2002-01-09
+2002-01-10
+2002-01-11
+2002-01-12
+2002-01-13
+2002-01-14
+2002-01-15
+2002-01-16
+2002-01-17
+2002-01-18
+2002-01-19
+2002-01-20
+2002-01-21
+2002-01-22
+2002-01-23
+2002-01-24
+2002-01-25
+2002-01-26
+2002-01-27
+2002-01-28
+2002-01-29
+2002-01-30
+2002-01-31
+2002-02-01
+2002-02-02
+2002-02-03
+2002-02-04
+2002-02-05
+2002-02-06
+2002-02-07
+2002-02-08
+2002-02-09
+2002-02-10
+2002-02-11
+2002-02-12
+2002-02-13
+2002-02-14
+2002-02-15
+2002-02-16
+2002-02-17
+2002-02-18
+2002-02-19
+2002-02-20
+2002-02-21
+2002-02-22
+2002-02-23
+2002-02-24
+2002-02-25
+2002-02-26
+2002-02-27
+2002-02-28
+2002-03-01
+2002-03-02
+2002-03-03
+2002-03-04
+2002-03-05
+2002-03-06
+2002-03-07
+2002-03-08
+2002-03-09
+2002-03-10
+2002-03-11
+2002-03-12
+2002-03-13
+2002-03-14
+2002-03-15
+2002-03-16
+2002-03-17
+2002-03-18
+2002-03-19
+2002-03-20
+2002-03-21
+2002-03-22
+2002-03-23
+2002-03-24
+2002-03-25
+2002-03-26
+2002-03-27
+2002-03-28
+2002-03-29
+2002-03-30
+2002-03-31
+2002-04-01
+2002-04-02
+2002-04-03
+2002-04-04
+2002-04-05
+2002-04-06
+2002-04-07
+2002-04-08
+2002-04-09
+2002-04-10
+2002-04-11
+2002-04-12
+2002-04-13
+2002-04-14
+2002-04-15
+2002-04-16
+2002-04-17
+2002-04-18
+2002-04-19
+2002-04-20
+2002-04-21
+2002-04-22
+2002-04-23
+2002-04-24
+2002-04-25
+2002-04-26
+2002-04-27
+2002-04-28
+2002-04-29
+2002-04-30
+2002-05-01
+2002-05-02
+2002-05-03
+2002-05-04
+2002-05-05
+2002-05-06
+2002-05-07
+2002-05-08
+2002-05-09
+2002-05-10
+2002-05-11
+2002-05-12
+2002-05-13
+2002-05-14
+2002-05-15
+2002-05-16
+2002-05-17
+2002-05-18
+2002-05-19
+2002-05-20
+2002-05-21
+2002-05-22
+2002-05-23
+2002-05-24
+2002-05-25
+2002-05-26
+2002-05-27
+2002-05-28
+2002-05-29
+2002-05-30
+2002-05-31
+2002-06-01
+2002-06-02
+2002-06-03
+2002-06-04
+2002-06-05
+2002-06-06
+2002-06-07
+2002-06-08
+2002-06-09
+2002-06-10
+2002-06-11
+2002-06-12
+2002-06-13
+2002-06-14
+2002-06-15
+2002-06-16
+2002-06-17
+2002-06-18
+2002-06-19
+2002-06-20
+2002-06-21
+2002-06-22
+2002-06-23
+2002-06-24
+2002-06-25
+2002-06-26
+2002-06-27
+2002-06-28
+2002-06-29
+2002-06-30
+2002-07-01
+2002-07-02
+2002-07-03
+2002-07-04
+2002-07-05
+2002-07-06
+2002-07-07
+2002-07-08
+2002-07-09
+2002-07-10
+2002-07-11
+2002-07-12
+2002-07-13
+2002-07-14
+2002-07-15
+2002-07-16
+2002-07-17
+2002-07-18
+2002-07-19
+2002-07-20
+2002-07-21
+2002-07-22
+2002-07-23
+2002-07-24
+2002-07-25
+2002-07-26
+2002-07-27
+2002-07-28
+2002-07-29
+2002-07-30
+2002-07-31
+2002-08-01
+2002-08-02
+2002-08-03
+2002-08-04
+2002-08-05
+2002-08-06
+2002-08-07
+2002-08-08
+2002-08-09
+2002-08-10
+2002-08-11
+2002-08-12
+2002-08-13
+2002-08-14
+2002-08-15
+2002-08-16
+2002-08-17
+2002-08-18
+2002-08-19
+2002-08-20
+2002-08-21
+2002-08-22
+2002-08-23
+2002-08-24
+2002-08-25
+2002-08-26
+2002-08-27
+2002-08-28
+2002-08-29
+2002-08-30
+2002-08-31
+2002-09-01
+2002-09-02
+2002-09-03
+2002-09-04
+2002-09-05
+2002-09-06
+2002-09-07
+2002-09-08
+2002-09-09
+2002-09-10
+2002-09-11
+2002-09-12
+2002-09-13
+2002-09-14
+2002-09-15
+2002-09-16
+2002-09-17
+2002-09-18
+2002-09-19
+2002-09-20
+2002-09-21
+2002-09-22
+2002-09-23
+2002-09-24
+2002-09-25
+2002-09-26
+2002-09-27
+2002-09-28
+2002-09-29
+2002-09-30
+2002-10-01
+2002-10-02
+2002-10-03
+2002-10-04
+2002-10-05
+2002-10-06
+2002-10-07
+2002-10-08
+2002-10-09
+2002-10-10
+2002-10-11
+2002-10-12
+2002-10-13
+2002-10-14
+2002-10-15
+2002-10-16
+2002-10-17
+2002-10-18
+2002-10-19
+2002-10-20
+2002-10-21
+2002-10-22
+2002-10-23
+2002-10-24
+2002-10-25
+2002-10-26
+2002-10-27
+2002-10-28
+2002-10-29
+2002-10-30
+2002-10-31
+2002-11-01
+2002-11-02
+2002-11-03
+2002-11-04
+2002-11-05
+2002-11-06
+2002-11-07
+2002-11-08
+2002-11-09
+2002-11-10
+2002-11-11
+2002-11-12
+2002-11-13
+2002-11-14
+2002-11-15
+2002-11-16
+2002-11-17
+2002-11-18
+2002-11-19
+2002-11-20
+2002-11-21
+2002-11-22
+2002-11-23
+2002-11-24
+2002-11-25
+2002-11-26
+2002-11-27
+2002-11-28
+2002-11-29
+2002-11-30
+2002-12-01
+2002-12-02
+2002-12-03
+2002-12-04
+2002-12-05
+2002-12-06
+2002-12-07
+2002-12-08
+2002-12-09
+2002-12-10
+2002-12-11
+2002-12-12
+2002-12-13
+2002-12-14
+2002-12-15
+2002-12-16
+2002-12-17
+2002-12-18
+2002-12-19
+2002-12-20
+2002-12-21
+2002-12-22
+2002-12-23
+2002-12-24
+2002-12-25
+2002-12-26
+2002-12-27
+2002-12-28
+2002-12-29
+2002-12-30
+2002-12-31
+2003-01-01
+2003-01-02
+2003-01-03
+2003-01-04
+2003-01-05
+2003-01-06
+2003-01-07
+2003-01-08
+2003-01-09
+2003-01-10
+2003-01-11
+2003-01-12
+2003-01-13
+2003-01-14
+2003-01-15
+2003-01-16
+2003-01-17
+2003-01-18
+2003-01-19
+2003-01-20
+2003-01-21
+2003-01-22
+2003-01-23
+2003-01-24
+2003-01-25
+2003-01-26
+2003-01-27
+2003-01-28
+2003-01-29
+2003-01-30
+2003-01-31
+2003-02-01
+2003-02-02
+2003-02-03
+2003-02-04
+2003-02-05
+2003-02-06
+2003-02-07
+2003-02-08
+2003-02-09
+2003-02-10
+2003-02-11
+2003-02-12
+2003-02-13
+2003-02-14
+2003-02-15
+2003-02-16
+2003-02-17
+2003-02-18
+2003-02-19
+2003-02-20
+2003-02-21
+2003-02-22
+2003-02-23
+2003-02-24
+2003-02-25
+2003-02-26
+2003-02-27
+2003-02-28
+2003-03-01
+2003-03-02
+2003-03-03
+2003-03-04
+2003-03-05
+2003-03-06
+2003-03-07
+2003-03-08
+2003-03-09
+2003-03-10
+2003-03-11
+2003-03-12
+2003-03-13
+2003-03-14
+2003-03-15
+2003-03-16
+2003-03-17
+2003-03-18
+2003-03-19
+2003-03-20
+2003-03-21
+2003-03-22
+2003-03-23
+2003-03-24
+2003-03-25
+2003-03-26
+2003-03-27
+2003-03-28
+2003-03-29
+2003-03-30
+2003-03-31
+2003-04-01
+2003-04-02
+2003-04-03
+2003-04-04
+2003-04-05
+2003-04-06
+2003-04-07
+2003-04-08
+2003-04-09
+2003-04-10
+2003-04-11
+2003-04-12
+2003-04-13
+2003-04-14
+2003-04-15
+2003-04-16
+2003-04-17
+2003-04-18
+2003-04-19
+2003-04-20
+2003-04-21
+2003-04-22
+2003-04-23
+2003-04-24
+2003-04-25
+2003-04-26
+2003-04-27
+2003-04-28
+2003-04-29
+2003-04-30
+2003-05-01
+2003-05-02
+2003-05-03
+2003-05-04
+2003-05-05
+2003-05-06
+2003-05-07
+2003-05-08
+2003-05-09
+2003-05-10
+2003-05-11
+2003-05-12
+2003-05-13
+2003-05-14
+2003-05-15
+2003-05-16
+2003-05-17
+2003-05-18
+2003-05-19
+2003-05-20
+2003-05-21
+2003-05-22
+2003-05-23
+2003-05-24
+2003-05-25
+2003-05-26
+2003-05-27
+2003-05-28
+2003-05-29
+2003-05-30
+2003-05-31
+2003-06-01
+2003-06-02
+2003-06-03
+2003-06-04
+2003-06-05
+2003-06-06
+2003-06-07
+2003-06-08
+2003-06-09
+2003-06-10
+2003-06-11
+2003-06-12
+2003-06-13
+2003-06-14
+2003-06-15
+2003-06-16
+2003-06-17
+2003-06-18
+2003-06-19
+2003-06-20
+2003-06-21
+2003-06-22
+2003-06-23
+2003-06-24
+2003-06-25
+2003-06-26
+2003-06-27
+2003-06-28
+2003-06-29
+2003-06-30
+2003-07-01
+2003-07-02
+2003-07-03
+2003-07-04
+2003-07-05
+2003-07-06
+2003-07-07
+2003-07-08
+2003-07-09
+2003-07-10
+2003-07-11
+2003-07-12
+2003-07-13
+2003-07-14
+2003-07-15
+2003-07-16
+2003-07-17
+2003-07-18
+2003-07-19
+2003-07-20
+2003-07-21
+2003-07-22
+2003-07-23
+2003-07-24
+2003-07-25
+2003-07-26
+2003-07-27
+2003-07-28
+2003-07-29
+2003-07-30
+2003-07-31
+2003-08-01
+2003-08-02
+2003-08-03
+2003-08-04
+2003-08-05
+2003-08-06
+2003-08-07
+2003-08-08
+2003-08-09
+2003-08-10
+2003-08-11
+2003-08-12
+2003-08-13
+2003-08-14
+2003-08-15
+2003-08-16
+2003-08-17
+2003-08-18
+2003-08-19
+2003-08-20
+2003-08-21
+2003-08-22
+2003-08-23
+2003-08-24
+2003-08-25
+2003-08-26
+2003-08-27
+2003-08-28
+2003-08-29
+2003-08-30
+2003-08-31
+2003-09-01
+2003-09-02
+2003-09-03
+2003-09-04
+2003-09-05
+2003-09-06
+2003-09-07
+2003-09-08
+2003-09-09
+2003-09-10
+2003-09-11
+2003-09-12
+2003-09-13
+2003-09-14
+2003-09-15
+2003-09-16
+2003-09-17
+2003-09-18
+2003-09-19
+2003-09-20
+2003-09-21
+2003-09-22
+2003-09-23
+2003-09-24
+2003-09-25
+2003-09-26
+2003-09-27
+2003-09-28
+2003-09-29
+2003-09-30
+2003-10-01
+2003-10-02
+2003-10-03
+2003-10-04
+2003-10-05
+2003-10-06
+2003-10-07
+2003-10-08
+2003-10-09
+2003-10-10
+2003-10-11
+2003-10-12
+2003-10-13
+2003-10-14
+2003-10-15
+2003-10-16
+2003-10-17
+2003-10-18
+2003-10-19
+2003-10-20
+2003-10-21
+2003-10-22
+2003-10-23
+2003-10-24
+2003-10-25
+2003-10-26
+2003-10-27
+2003-10-28
+2003-10-29
+2003-10-30
+2003-10-31
+2003-11-01
+2003-11-02
+2003-11-03
+2003-11-04
+2003-11-05
+2003-11-06
+2003-11-07
+2003-11-08
+2003-11-09
+2003-11-10
+2003-11-11
+2003-11-12
+2003-11-13
+2003-11-14
+2003-11-15
+2003-11-16
+2003-11-17
+2003-11-18
+2003-11-19
+2003-11-20
+2003-11-21
+2003-11-22
+2003-11-23
+2003-11-24
+2003-11-25
+2003-11-26
+2003-11-27
+2003-11-28
+2003-11-29
+2003-11-30
+2003-12-01
+2003-12-02
+2003-12-03
+2003-12-04
+2003-12-05
+2003-12-06
+2003-12-07
+2003-12-08
+2003-12-09
+2003-12-10
+2003-12-11
+2003-12-12
+2003-12-13
+2003-12-14
+2003-12-15
+2003-12-16
+2003-12-17
+2003-12-18
+2003-12-19
+2003-12-20
+2003-12-21
+2003-12-22
+2003-12-23
+2003-12-24
+2003-12-25
+2003-12-26
+2003-12-27
+2003-12-28
+2003-12-29
+2003-12-30
+2003-12-31
+2004-01-01
+2004-01-02
+2004-01-03
+2004-01-04
+2004-01-05
+2004-01-06
+2004-01-07
+2004-01-08
+2004-01-09
+2004-01-10
+2004-01-11
+2004-01-12
+2004-01-13
+2004-01-14
+2004-01-15
+2004-01-16
+2004-01-17
+2004-01-18
+2004-01-19
+2004-01-20
+2004-01-21
+2004-01-22
+2004-01-23
+2004-01-24
+2004-01-25
+2004-01-26
+2004-01-27
+2004-01-28
+2004-01-29
+2004-01-30
+2004-01-31
+2004-02-01
+2004-02-02
+2004-02-03
+2004-02-04
+2004-02-05
+2004-02-06
+2004-02-07
+2004-02-08
+2004-02-09
+2004-02-10
+2004-02-11
+2004-02-12
+2004-02-13
+2004-02-14
+2004-02-15
+2004-02-16
+2004-02-17
+2004-02-18
+2004-02-19
+2004-02-20
+2004-02-21
+2004-02-22
+2004-02-23
+2004-02-24
+2004-02-25
+2004-02-26
+2004-02-27
+2004-02-28
+2004-02-29
+2004-03-01
+2004-03-02
+2004-03-03
+2004-03-04
+2004-03-05
+2004-03-06
+2004-03-07
+2004-03-08
+2004-03-09
+2004-03-10
+2004-03-11
+2004-03-12
+2004-03-13
+2004-03-14
+2004-03-15
+2004-03-16
+2004-03-17
+2004-03-18
+2004-03-19
+2004-03-20
+2004-03-21
+2004-03-22
+2004-03-23
+2004-03-24
+2004-03-25
+2004-03-26
+2004-03-27
+2004-03-28
+2004-03-29
+2004-03-30
+2004-03-31
+2004-04-01
+2004-04-02
+2004-04-03
+2004-04-04
+2004-04-05
+2004-04-06
+2004-04-07
+2004-04-08
+2004-04-09
+2004-04-10
+2004-04-11
+2004-04-12
+2004-04-13
+2004-04-14
+2004-04-15
+2004-04-16
+2004-04-17
+2004-04-18
+2004-04-19
+2004-04-20
+2004-04-21
+2004-04-22
+2004-04-23
+2004-04-24
+2004-04-25
+2004-04-26
+2004-04-27
+2004-04-28
+2004-04-29
+2004-04-30
+2004-05-01
+2004-05-02
+2004-05-03
+2004-05-04
+2004-05-05
+2004-05-06
+2004-05-07
+2004-05-08
+2004-05-09
+2004-05-10
+2004-05-11
+2004-05-12
+2004-05-13
+2004-05-14
+2004-05-15
+2004-05-16
+2004-05-17
+2004-05-18
+2004-05-19
+2004-05-20
+2004-05-21
+2004-05-22
+2004-05-23
+2004-05-24
+2004-05-25
+2004-05-26
+2004-05-27
+2004-05-28
+2004-05-29
+2004-05-30
+2004-05-31
+2004-06-01
+2004-06-02
+2004-06-03
+2004-06-04
+2004-06-05
+2004-06-06
+2004-06-07
+2004-06-08
+2004-06-09
+2004-06-10
+2004-06-11
+2004-06-12
+2004-06-13
+2004-06-14
+2004-06-15
+2004-06-16
+2004-06-17
+2004-06-18
+2004-06-19
+2004-06-20
+2004-06-21
+2004-06-22
+2004-06-23
+2004-06-24
+2004-06-25
+2004-06-26
+2004-06-27
+2004-06-28
+2004-06-29
+2004-06-30
+2004-07-01
+2004-07-02
+2004-07-03
+2004-07-04
+2004-07-05
+2004-07-06
+2004-07-07
+2004-07-08
+2004-07-09
+2004-07-10
+2004-07-11
+2004-07-12
+2004-07-13
+2004-07-14
+2004-07-15
+2004-07-16
+2004-07-17
+2004-07-18
+2004-07-19
+2004-07-20
+2004-07-21
+2004-07-22
+2004-07-23
+2004-07-24
+2004-07-25
+2004-07-26
+2004-07-27
+2004-07-28
+2004-07-29
+2004-07-30
+2004-07-31
+2004-08-01
+2004-08-02
+2004-08-03
+2004-08-04
+2004-08-05
+2004-08-06
+2004-08-07
+2004-08-08
+2004-08-09
+2004-08-10
+2004-08-11
+2004-08-12
+2004-08-13
+2004-08-14
+2004-08-15
+2004-08-16
+2004-08-17
+2004-08-18
+2004-08-19
+2004-08-20
+2004-08-21
+2004-08-22
+2004-08-23
+2004-08-24
+2004-08-25
+2004-08-26
+2004-08-27
+2004-08-28
+2004-08-29
+2004-08-30
+2004-08-31
+2004-09-01
+2004-09-02
+2004-09-03
+2004-09-04
+2004-09-05
+2004-09-06
+2004-09-07
+2004-09-08
+2004-09-09
+2004-09-10
+2004-09-11
+2004-09-12
+2004-09-13
+2004-09-14
+2004-09-15
+2004-09-16
+2004-09-17
+2004-09-18
+2004-09-19
+2004-09-20
+2004-09-21
+2004-09-22
+2004-09-23
+2004-09-24
+2004-09-25
+2004-09-26
+2004-09-27
+2004-09-28
+2004-09-29
+2004-09-30
+2004-10-01
+2004-10-02
+2004-10-03
+2004-10-04
+2004-10-05
+2004-10-06
+2004-10-07
+2004-10-08
+2004-10-09
+2004-10-10
+2004-10-11
+2004-10-12
+2004-10-13
+2004-10-14
+2004-10-15
+2004-10-16
+2004-10-17
+2004-10-18
+2004-10-19
+2004-10-20
+2004-10-21
+2004-10-22
+2004-10-23
+2004-10-24
+2004-10-25
+2004-10-26
+2004-10-27
+2004-10-28
+2004-10-29
+2004-10-30
+2004-10-31
+2004-11-01
+2004-11-02
+2004-11-03
+2004-11-04
+2004-11-05
+2004-11-06
+2004-11-07
+2004-11-08
+2004-11-09
+2004-11-10
+2004-11-11
+2004-11-12
+2004-11-13
+2004-11-14
+2004-11-15
+2004-11-16
+2004-11-17
+2004-11-18
+2004-11-19
+2004-11-20
+2004-11-21
+2004-11-22
+2004-11-23
+2004-11-24
+2004-11-25
+2004-11-26
+2004-11-27
+2004-11-28
+2004-11-29
+2004-11-30
+2004-12-01
+2004-12-02
+2004-12-03
+2004-12-04
+2004-12-05
+2004-12-06
+2004-12-07
+2004-12-08
+2004-12-09
+2004-12-10
+2004-12-11
+2004-12-12
+2004-12-13
+2004-12-14
+2004-12-15
+2004-12-16
+2004-12-17
+2004-12-18
+2004-12-19
+2004-12-20
+2004-12-21
+2004-12-22
+2004-12-23
+2004-12-24
+2004-12-25
+2004-12-26
+2004-12-27
+2004-12-28
+2004-12-29
+2004-12-30
+2004-12-31
+2005-01-01
+2005-01-02
+2005-01-03
+2005-01-04
+2005-01-05
+2005-01-06
+2005-01-07
+2005-01-08
+2005-01-09
+2005-01-10
+2005-01-11
+2005-01-12
+2005-01-13
+2005-01-14
+2005-01-15
+2005-01-16
+2005-01-17
+2005-01-18
+2005-01-19
+2005-01-20
+2005-01-21
+2005-01-22
+2005-01-23
+2005-01-24
+2005-01-25
+2005-01-26
+2005-01-27
+2005-01-28
+2005-01-29
+2005-01-30
+2005-01-31
+2005-02-01
+2005-02-02
+2005-02-03
+2005-02-04
+2005-02-05
+2005-02-06
+2005-02-07
+2005-02-08
+2005-02-09
+2005-02-10
+2005-02-11
+2005-02-12
+2005-02-13
+2005-02-14
+2005-02-15
+2005-02-16
+2005-02-17
+2005-02-18
+2005-02-19
+2005-02-20
+2005-02-21
+2005-02-22
+2005-02-23
+2005-02-24
+2005-02-25
+2005-02-26
+2005-02-27
+2005-02-28
+2005-03-01
+2005-03-02
+2005-03-03
+2005-03-04
+2005-03-05
+2005-03-06
+2005-03-07
+2005-03-08
+2005-03-09
+2005-03-10
+2005-03-11
+2005-03-12
+2005-03-13
+2005-03-14
+2005-03-15
+2005-03-16
+2005-03-17
+2005-03-18
+2005-03-19
+2005-03-20
+2005-03-21
+2005-03-22
+2005-03-23
+2005-03-24
+2005-03-25
+2005-03-26
+2005-03-27
+2005-03-28
+2005-03-29
+2005-03-30
+2005-03-31
+2005-04-01
+2005-04-02
+2005-04-03
+2005-04-04
+2005-04-05
+2005-04-06
+2005-04-07
+2005-04-08
+2005-04-09
+2005-04-10
+2005-04-11
+2005-04-12
+2005-04-13
+2005-04-14
+2005-04-15
+2005-04-16
+2005-04-17
+2005-04-18
+2005-04-19
+2005-04-20
+2005-04-21
+2005-04-22
+2005-04-23
+2005-04-24
+2005-04-25
+2005-04-26
+2005-04-27
+2005-04-28
+2005-04-29
+2005-04-30
+2005-05-01
+2005-05-02
+2005-05-03
+2005-05-04
+2005-05-05
+2005-05-06
+2005-05-07
+2005-05-08
+2005-05-09
+2005-05-10
+2005-05-11
+2005-05-12
+2005-05-13
+2005-05-14
+2005-05-15
+2005-05-16
+2005-05-17
+2005-05-18
+2005-05-19
+2005-05-20
+2005-05-21
+2005-05-22
+2005-05-23
+2005-05-24
+2005-05-25
+2005-05-26
+2005-05-27
+2005-05-28
+2005-05-29
+2005-05-30
+2005-05-31
+2005-06-01
+2005-06-02
+2005-06-03
+2005-06-04
+2005-06-05
+2005-06-06
+2005-06-07
+2005-06-08
+2005-06-09
+2005-06-10
+2005-06-11
+2005-06-12
+2005-06-13
+2005-06-14
+2005-06-15
+2005-06-16
+2005-06-17
+2005-06-18
+2005-06-19
+2005-06-20
+2005-06-21
+2005-06-22
+2005-06-23
+2005-06-24
+2005-06-25
+2005-06-26
+2005-06-27
+2005-06-28
+2005-06-29
+2005-06-30
+2005-07-01
+2005-07-02
+2005-07-03
+2005-07-04
+2005-07-05
+2005-07-06
+2005-07-07
+2005-07-08
+2005-07-09
+2005-07-10
+2005-07-11
+2005-07-12
+2005-07-13
+2005-07-14
+2005-07-15
+2005-07-16
+2005-07-17
+2005-07-18
+2005-07-19
+2005-07-20
+2005-07-21
+2005-07-22
+2005-07-23
+2005-07-24
+2005-07-25
+2005-07-26
+2005-07-27
+2005-07-28
+2005-07-29
+2005-07-30
+2005-07-31
+2005-08-01
+2005-08-02
+2005-08-03
+2005-08-04
+2005-08-05
+2005-08-06
+2005-08-07
+2005-08-08
+2005-08-09
+2005-08-10
+2005-08-11
+2005-08-12
+2005-08-13
+2005-08-14
+2005-08-15
+2005-08-16
+2005-08-17
+2005-08-18
+2005-08-19
+2005-08-20
+2005-08-21
+2005-08-22
+2005-08-23
+2005-08-24
+2005-08-25
+2005-08-26
+2005-08-27
+2005-08-28
+2005-08-29
+2005-08-30
+2005-08-31
+2005-09-01
+2005-09-02
+2005-09-03
+2005-09-04
+2005-09-05
+2005-09-06
+2005-09-07
+2005-09-08
+2005-09-09
+2005-09-10
+2005-09-11
+2005-09-12
+2005-09-13
+2005-09-14
+2005-09-15
+2005-09-16
+2005-09-17
+2005-09-18
+2005-09-19
+2005-09-20
+2005-09-21
+2005-09-22
+2005-09-23
+2005-09-24
+2005-09-25
+2005-09-26
+2005-09-27
+2005-09-28
+2005-09-29
+2005-09-30
+2005-10-01
+2005-10-02
+2005-10-03
+2005-10-04
+2005-10-05
+2005-10-06
+2005-10-07
+2005-10-08
+2005-10-09
+2005-10-10
+2005-10-11
+2005-10-12
+2005-10-13
+2005-10-14
+2005-10-15
+2005-10-16
+2005-10-17
+2005-10-18
+2005-10-19
+2005-10-20
+2005-10-21
+2005-10-22
+2005-10-23
+2005-10-24
+2005-10-25
+2005-10-26
+2005-10-27
+2005-10-28
+2005-10-29
+2005-10-30
+2005-10-31
+2005-11-01
+2005-11-02
+2005-11-03
+2005-11-04
+2005-11-05
+2005-11-06
+2005-11-07
+2005-11-08
+2005-11-09
+2005-11-10
+2005-11-11
+2005-11-12
+2005-11-13
+2005-11-14
+2005-11-15
+2005-11-16
+2005-11-17
+2005-11-18
+2005-11-19
+2005-11-20
+2005-11-21
+2005-11-22
+2005-11-23
+2005-11-24
+2005-11-25
+2005-11-26
+2005-11-27
+2005-11-28
+2005-11-29
+2005-11-30
+2005-12-01
+2005-12-02
+2005-12-03
+2005-12-04
+2005-12-05
+2005-12-06
+2005-12-07
+2005-12-08
+2005-12-09
+2005-12-10
+2005-12-11
+2005-12-12
+2005-12-13
+2005-12-14
+2005-12-15
+2005-12-16
+2005-12-17
+2005-12-18
+2005-12-19
+2005-12-20
+2005-12-21
+2005-12-22
+2005-12-23
+2005-12-24
+2005-12-25
+2005-12-26
+2005-12-27
+2005-12-28
+2005-12-29
+2005-12-30
+2005-12-31
+2006-01-01
+2006-01-02
+2006-01-03
+2006-01-04
+2006-01-05
+2006-01-06
+2006-01-07
+2006-01-08
+2006-01-09
+2006-01-10
+2006-01-11
+2006-01-12
+2006-01-13
+2006-01-14
+2006-01-15
+2006-01-16
+2006-01-17
+2006-01-18
+2006-01-19
+2006-01-20
+2006-01-21
+2006-01-22
+2006-01-23
+2006-01-24
+2006-01-25
+2006-01-26
+2006-01-27
+2006-01-28
+2006-01-29
+2006-01-30
+2006-01-31
+2006-02-01
+2006-02-02
+2006-02-03
+2006-02-04
+2006-02-05
+2006-02-06
+2006-02-07
+2006-02-08
+2006-02-09
+2006-02-10
+2006-02-11
+2006-02-12
+2006-02-13
+2006-02-14
+2006-02-15
+2006-02-16
+2006-02-17
+2006-02-18
+2006-02-19
+2006-02-20
+2006-02-21
+2006-02-22
+2006-02-23
+2006-02-24
+2006-02-25
+2006-02-26
+2006-02-27
+2006-02-28
+2006-03-01
+2006-03-02
+2006-03-03
+2006-03-04
+2006-03-05
+2006-03-06
+2006-03-07
+2006-03-08
+2006-03-09
+2006-03-10
+2006-03-11
+2006-03-12
+2006-03-13
+2006-03-14
+2006-03-15
+2006-03-16
+2006-03-17
+2006-03-18
+2006-03-19
+2006-03-20
+2006-03-21
+2006-03-22
+2006-03-23
+2006-03-24
+2006-03-25
+2006-03-26
+2006-03-27
+2006-03-28
+2006-03-29
+2006-03-30
+2006-03-31
+2006-04-01
+2006-04-02
+2006-04-03
+2006-04-04
+2006-04-05
+2006-04-06
+2006-04-07
+2006-04-08
+2006-04-09
+2006-04-10
+2006-04-11
+2006-04-12
+2006-04-13
+2006-04-14
+2006-04-15
+2006-04-16
+2006-04-17
+2006-04-18
+2006-04-19
+2006-04-20
+2006-04-21
+2006-04-22
+2006-04-23
+2006-04-24
+2006-04-25
+2006-04-26
+2006-04-27
+2006-04-28
+2006-04-29
+2006-04-30
+2006-05-01
+2006-05-02
+2006-05-03
+2006-05-04
+2006-05-05
+2006-05-06
+2006-05-07
+2006-05-08
+2006-05-09
+2006-05-10
+2006-05-11
+2006-05-12
+2006-05-13
+2006-05-14
+2006-05-15
+2006-05-16
+2006-05-17
+2006-05-18
+2006-05-19
+2006-05-20
+2006-05-21
+2006-05-22
+2006-05-23
+2006-05-24
+2006-05-25
+2006-05-26
+2006-05-27
+2006-05-28
+2006-05-29
+2006-05-30
+2006-05-31
+2006-06-01
+2006-06-02
+2006-06-03
+2006-06-04
+2006-06-05
+2006-06-06
+2006-06-07
+2006-06-08
+2006-06-09
+2006-06-10
+2006-06-11
+2006-06-12
+2006-06-13
+2006-06-14
+2006-06-15
+2006-06-16
+2006-06-17
+2006-06-18
+2006-06-19
+2006-06-20
+2006-06-21
+2006-06-22
+2006-06-23
+2006-06-24
+2006-06-25
+2006-06-26
+2006-06-27
+2006-06-28
+2006-06-29
+2006-06-30
+2006-07-01
+2006-07-02
+2006-07-03
+2006-07-04
+2006-07-05
+2006-07-06
+2006-07-07
+2006-07-08
+2006-07-09
+2006-07-10
+2006-07-11
+2006-07-12
+2006-07-13
+2006-07-14
+2006-07-15
+2006-07-16
+2006-07-17
+2006-07-18
+2006-07-19
+2006-07-20
+2006-07-21
+2006-07-22
+2006-07-23
+2006-07-24
+2006-07-25
+2006-07-26
+2006-07-27
+2006-07-28
+2006-07-29
+2006-07-30
+2006-07-31
+2006-08-01
+2006-08-02
+2006-08-03
+2006-08-04
+2006-08-05
+2006-08-06
+2006-08-07
+2006-08-08
+2006-08-09
+2006-08-10
+2006-08-11
+2006-08-12
+2006-08-13
+2006-08-14
+2006-08-15
+2006-08-16
+2006-08-17
+2006-08-18
+2006-08-19
+2006-08-20
+2006-08-21
+2006-08-22
+2006-08-23
+2006-08-24
+2006-08-25
+2006-08-26
+2006-08-27
+2006-08-28
+2006-08-29
+2006-08-30
+2006-08-31
+2006-09-01
+2006-09-02
+2006-09-03
+2006-09-04
+2006-09-05
+2006-09-06
+2006-09-07
+2006-09-08
+2006-09-09
+2006-09-10
+2006-09-11
+2006-09-12
+2006-09-13
+2006-09-14
+2006-09-15
+2006-09-16
+2006-09-17
+2006-09-18
+2006-09-19
+2006-09-20
+2006-09-21
+2006-09-22
+2006-09-23
+2006-09-24
+2006-09-25
+2006-09-26
+2006-09-27
+2006-09-28
+2006-09-29
+2006-09-30
+2006-10-01
+2006-10-02
+2006-10-03
+2006-10-04
+2006-10-05
+2006-10-06
+2006-10-07
+2006-10-08
+2006-10-09
+2006-10-10
+2006-10-11
+2006-10-12
+2006-10-13
+2006-10-14
+2006-10-15
+2006-10-16
+2006-10-17
+2006-10-18
+2006-10-19
+2006-10-20
+2006-10-21
+2006-10-22
+2006-10-23
+2006-10-24
+2006-10-25
+2006-10-26
+2006-10-27
+2006-10-28
+2006-10-29
+2006-10-30
+2006-10-31
+2006-11-01
+2006-11-02
+2006-11-03
+2006-11-04
+2006-11-05
+2006-11-06
+2006-11-07
+2006-11-08
+2006-11-09
+2006-11-10
+2006-11-11
+2006-11-12
+2006-11-13
+2006-11-14
+2006-11-15
+2006-11-16
+2006-11-17
+2006-11-18
+2006-11-19
+2006-11-20
+2006-11-21
+2006-11-22
+2006-11-23
+2006-11-24
+2006-11-25
+2006-11-26
+2006-11-27
+2006-11-28
+2006-11-29
+2006-11-30
+2006-12-01
+2006-12-02
+2006-12-03
+2006-12-04
+2006-12-05
+2006-12-06
+2006-12-07
+2006-12-08
+2006-12-09
+2006-12-10
+2006-12-11
+2006-12-12
+2006-12-13
+2006-12-14
+2006-12-15
+2006-12-16
+2006-12-17
+2006-12-18
+2006-12-19
+2006-12-20
+2006-12-21
+2006-12-22
+2006-12-23
+2006-12-24
+2006-12-25
+2006-12-26
+2006-12-27
+2006-12-28
+2006-12-29
+2006-12-30
+2006-12-31
+2007-01-01
+2007-01-02
+2007-01-03
+2007-01-04
+2007-01-05
+2007-01-06
+2007-01-07
+2007-01-08
+2007-01-09
+2007-01-10
+2007-01-11
+2007-01-12
+2007-01-13
+2007-01-14
+2007-01-15
+2007-01-16
+2007-01-17
+2007-01-18
+2007-01-19
+2007-01-20
+2007-01-21
+2007-01-22
+2007-01-23
+2007-01-24
+2007-01-25
+2007-01-26
+2007-01-27
+2007-01-28
+2007-01-29
+2007-01-30
+2007-01-31
+2007-02-01
+2007-02-02
+2007-02-03
+2007-02-04
+2007-02-05
+2007-02-06
+2007-02-07
+2007-02-08
+2007-02-09
+2007-02-10
+2007-02-11
+2007-02-12
+2007-02-13
+2007-02-14
+2007-02-15
+2007-02-16
+2007-02-17
+2007-02-18
+2007-02-19
+2007-02-20
+2007-02-21
+2007-02-22
+2007-02-23
+2007-02-24
+2007-02-25
+2007-02-26
+2007-02-27
+2007-02-28
+2007-03-01
+2007-03-02
+2007-03-03
+2007-03-04
+2007-03-05
+2007-03-06
+2007-03-07
+2007-03-08
+2007-03-09
+2007-03-10
+2007-03-11
+2007-03-12
+2007-03-13
+2007-03-14
+2007-03-15
+2007-03-16
+2007-03-17
+2007-03-18
+2007-03-19
+2007-03-20
+2007-03-21
+2007-03-22
+2007-03-23
+2007-03-24
+2007-03-25
+2007-03-26
+2007-03-27
+2007-03-28
+2007-03-29
+2007-03-30
+2007-03-31
+2007-04-01
+2007-04-02
+2007-04-03
+2007-04-04
+2007-04-05
+2007-04-06
+2007-04-07
+2007-04-08
+2007-04-09
+2007-04-10
+2007-04-11
+2007-04-12
+2007-04-13
+2007-04-14
+2007-04-15
+2007-04-16
+2007-04-17
+2007-04-18
+2007-04-19
+2007-04-20
+2007-04-21
+2007-04-22
+2007-04-23
+2007-04-24
+2007-04-25
+2007-04-26
+2007-04-27
+2007-04-28
+2007-04-29
+2007-04-30
+2007-05-01
+2007-05-02
+2007-05-03
+2007-05-04
+2007-05-05
+2007-05-06
+2007-05-07
+2007-05-08
+2007-05-09
+2007-05-10
+2007-05-11
+2007-05-12
+2007-05-13
+2007-05-14
+2007-05-15
+2007-05-16
+2007-05-17
+2007-05-18
+2007-05-19
+2007-05-20
+2007-05-21
+2007-05-22
+2007-05-23
+2007-05-24
+2007-05-25
+2007-05-26
+2007-05-27
+2007-05-28
+2007-05-29
+2007-05-30
+2007-05-31
+2007-06-01
+2007-06-02
+2007-06-03
+2007-06-04
+2007-06-05
+2007-06-06
+2007-06-07
+2007-06-08
+2007-06-09
+2007-06-10
+2007-06-11
+2007-06-12
+2007-06-13
+2007-06-14
+2007-06-15
+2007-06-16
+2007-06-17
+2007-06-18
+2007-06-19
+2007-06-20
+2007-06-21
+2007-06-22
+2007-06-23
+2007-06-24
+2007-06-25
+2007-06-26
+2007-06-27
+2007-06-28
+2007-06-29
+2007-06-30
+2007-07-01
+2007-07-02
+2007-07-03
+2007-07-04
+2007-07-05
+2007-07-06
+2007-07-07
+2007-07-08
+2007-07-09
+2007-07-10
+2007-07-11
+2007-07-12
+2007-07-13
+2007-07-14
+2007-07-15
+2007-07-16
+2007-07-17
+2007-07-18
+2007-07-19
+2007-07-20
+2007-07-21
+2007-07-22
+2007-07-23
+2007-07-24
+2007-07-25
+2007-07-26
+2007-07-27
+2007-07-28
+2007-07-29
+2007-07-30
+2007-07-31
+2007-08-01
+2007-08-02
+2007-08-03
+2007-08-04
+2007-08-05
+2007-08-06
+2007-08-07
+2007-08-08
+2007-08-09
+2007-08-10
+2007-08-11
+2007-08-12
+2007-08-13
+2007-08-14
+2007-08-15
+2007-08-16
+2007-08-17
+2007-08-18
+2007-08-19
+2007-08-20
+2007-08-21
+2007-08-22
+2007-08-23
+2007-08-24
+2007-08-25
+2007-08-26
+2007-08-27
+2007-08-28
+2007-08-29
+2007-08-30
+2007-08-31
+2007-09-01
+2007-09-02
+2007-09-03
+2007-09-04
+2007-09-05
+2007-09-06
+2007-09-07
+2007-09-08
+2007-09-09
+2007-09-10
+2007-09-11
+2007-09-12
+2007-09-13
+2007-09-14
+2007-09-15
+2007-09-16
+2007-09-17
+2007-09-18
+2007-09-19
+2007-09-20
+2007-09-21
+2007-09-22
+2007-09-23
+2007-09-24
+2007-09-25
+2007-09-26
+2007-09-27
+2007-09-28
+2007-09-29
+2007-09-30
+2007-10-01
+2007-10-02
+2007-10-03
+2007-10-04
+2007-10-05
+2007-10-06
+2007-10-07
+2007-10-08
+2007-10-09
+2007-10-10
+2007-10-11
+2007-10-12
+2007-10-13
+2007-10-14
+2007-10-15
+2007-10-16
+2007-10-17
+2007-10-18
+2007-10-19
+2007-10-20
+2007-10-21
+2007-10-22
+2007-10-23
+2007-10-24
+2007-10-25
+2007-10-26
+2007-10-27
+2007-10-28
+2007-10-29
+2007-10-30
+2007-10-31
+2007-11-01
+2007-11-02
+2007-11-03
+2007-11-04
+2007-11-05
+2007-11-06
+2007-11-07
+2007-11-08
+2007-11-09
+2007-11-10
+2007-11-11
+2007-11-12
+2007-11-13
+2007-11-14
+2007-11-15
+2007-11-16
+2007-11-17
+2007-11-18
+2007-11-19
+2007-11-20
+2007-11-21
+2007-11-22
+2007-11-23
+2007-11-24
+2007-11-25
+2007-11-26
+2007-11-27
+2007-11-28
+2007-11-29
+2007-11-30
+2007-12-01
+2007-12-02
+2007-12-03
+2007-12-04
+2007-12-05
+2007-12-06
+2007-12-07
+2007-12-08
+2007-12-09
+2007-12-10
+2007-12-11
+2007-12-12
+2007-12-13
+2007-12-14
+2007-12-15
+2007-12-16
+2007-12-17
+2007-12-18
+2007-12-19
+2007-12-20
+2007-12-21
+2007-12-22
+2007-12-23
+2007-12-24
+2007-12-25
+2007-12-26
+2007-12-27
+2007-12-28
+2007-12-29
+2007-12-30
+2007-12-31
+2008-01-01
+2008-01-02
+2008-01-03
+2008-01-04
+2008-01-05
+2008-01-06
+2008-01-07
+2008-01-08
+2008-01-09
+2008-01-10
+2008-01-11
+2008-01-12
+2008-01-13
+2008-01-14
+2008-01-15
+2008-01-16
+2008-01-17
+2008-01-18
+2008-01-19
+2008-01-20
+2008-01-21
+2008-01-22
+2008-01-23
+2008-01-24
+2008-01-25
+2008-01-26
+2008-01-27
+2008-01-28
+2008-01-29
+2008-01-30
+2008-01-31
+2008-02-01
+2008-02-02
+2008-02-03
+2008-02-04
+2008-02-05
+2008-02-06
+2008-02-07
+2008-02-08
+2008-02-09
+2008-02-10
+2008-02-11
+2008-02-12
+2008-02-13
+2008-02-14
+2008-02-15
+2008-02-16
+2008-02-17
+2008-02-18
+2008-02-19
+2008-02-20
+2008-02-21
+2008-02-22
+2008-02-23
+2008-02-24
+2008-02-25
+2008-02-26
+2008-02-27
+2008-02-28
+2008-02-29
+2008-03-01
+2008-03-02
+2008-03-03
+2008-03-04
+2008-03-05
+2008-03-06
+2008-03-07
+2008-03-08
+2008-03-09
+2008-03-10
+2008-03-11
+2008-03-12
+2008-03-13
+2008-03-14
+2008-03-15
+2008-03-16
+2008-03-17
+2008-03-18
+2008-03-19
+2008-03-20
+2008-03-21
+2008-03-22
+2008-03-23
+2008-03-24
+2008-03-25
+2008-03-26
+2008-03-27
+2008-03-28
+2008-03-29
+2008-03-30
+2008-03-31
+2008-04-01
+2008-04-02
+2008-04-03
+2008-04-04
+2008-04-05
+2008-04-06
+2008-04-07
+2008-04-08
+2008-04-09
+2008-04-10
+2008-04-11
+2008-04-12
+2008-04-13
+2008-04-14
+2008-04-15
+2008-04-16
+2008-04-17
+2008-04-18
+2008-04-19
+2008-04-20
+2008-04-21
+2008-04-22
+2008-04-23
+2008-04-24
+2008-04-25
+2008-04-26
+2008-04-27
+2008-04-28
+2008-04-29
+2008-04-30
+2008-05-01
+2008-05-02
+2008-05-03
+2008-05-04
+2008-05-05
+2008-05-06
+2008-05-07
+2008-05-08
+2008-05-09
+2008-05-10
+2008-05-11
+2008-05-12
+2008-05-13
+2008-05-14
+2008-05-15
+2008-05-16
+2008-05-17
+2008-05-18
+2008-05-19
+2008-05-20
+2008-05-21
+2008-05-22
+2008-05-23
+2008-05-24
+2008-05-25
+2008-05-26
+2008-05-27
+2008-05-28
+2008-05-29
+2008-05-30
+2008-05-31
+2008-06-01
+2008-06-02
+2008-06-03
+2008-06-04
+2008-06-05
+2008-06-06
+2008-06-07
+2008-06-08
+2008-06-09
+2008-06-10
+2008-06-11
+2008-06-12
+2008-06-13
+2008-06-14
+2008-06-15
+2008-06-16
+2008-06-17
+2008-06-18
+2008-06-19
+2008-06-20
+2008-06-21
+2008-06-22
+2008-06-23
+2008-06-24
+2008-06-25
+2008-06-26
+2008-06-27
+2008-06-28
+2008-06-29
+2008-06-30
+2008-07-01
+2008-07-02
+2008-07-03
+2008-07-04
+2008-07-05
+2008-07-06
+2008-07-07
+2008-07-08
+2008-07-09
+2008-07-10
+2008-07-11
+2008-07-12
+2008-07-13
+2008-07-14
+2008-07-15
+2008-07-16
+2008-07-17
+2008-07-18
+2008-07-19
+2008-07-20
+2008-07-21
+2008-07-22
+2008-07-23
+2008-07-24
+2008-07-25
+2008-07-26
+2008-07-27
+2008-07-28
+2008-07-29
+2008-07-30
+2008-07-31
+2008-08-01
+2008-08-02
+2008-08-03
+2008-08-04
+2008-08-05
+2008-08-06
+2008-08-07
+2008-08-08
+2008-08-09
+2008-08-10
+2008-08-11
+2008-08-12
+2008-08-13
+2008-08-14
+2008-08-15
+2008-08-16
+2008-08-17
+2008-08-18
+2008-08-19
+2008-08-20
+2008-08-21
+2008-08-22
+2008-08-23
+2008-08-24
+2008-08-25
+2008-08-26
+2008-08-27
+2008-08-28
+2008-08-29
+2008-08-30
+2008-08-31
+2008-09-01
+2008-09-02
+2008-09-03
+2008-09-04
+2008-09-05
+2008-09-06
+2008-09-07
+2008-09-08
+2008-09-09
+2008-09-10
+2008-09-11
+2008-09-12
+2008-09-13
+2008-09-14
+2008-09-15
+2008-09-16
+2008-09-17
+2008-09-18
+2008-09-19
+2008-09-20
+2008-09-21
+2008-09-22
+2008-09-23
+2008-09-24
+2008-09-25
+2008-09-26
+2008-09-27
+2008-09-28
+2008-09-29
+2008-09-30
+2008-10-01
+2008-10-02
+2008-10-03
+2008-10-04
+2008-10-05
+2008-10-06
+2008-10-07
+2008-10-08
+2008-10-09
+2008-10-10
+2008-10-11
+2008-10-12
+2008-10-13
+2008-10-14
+2008-10-15
+2008-10-16
+2008-10-17
+2008-10-18
+2008-10-19
+2008-10-20
+2008-10-21
+2008-10-22
+2008-10-23
+2008-10-24
+2008-10-25
+2008-10-26
+2008-10-27
+2008-10-28
+2008-10-29
+2008-10-30
+2008-10-31
+2008-11-01
+2008-11-02
+2008-11-03
+2008-11-04
+2008-11-05
+2008-11-06
+2008-11-07
+2008-11-08
+2008-11-09
+2008-11-10
+2008-11-11
+2008-11-12
+2008-11-13
+2008-11-14
+2008-11-15
+2008-11-16
+2008-11-17
+2008-11-18
+2008-11-19
+2008-11-20
+2008-11-21
+2008-11-22
+2008-11-23
+2008-11-24
+2008-11-25
+2008-11-26
+2008-11-27
+2008-11-28
+2008-11-29
+2008-11-30
+2008-12-01
+2008-12-02
+2008-12-03
+2008-12-04
+2008-12-05
+2008-12-06
+2008-12-07
+2008-12-08
+2008-12-09
+2008-12-10
+2008-12-11
+2008-12-12
+2008-12-13
+2008-12-14
+2008-12-15
+2008-12-16
+2008-12-17
+2008-12-18
+2008-12-19
+2008-12-20
+2008-12-21
+2008-12-22
+2008-12-23
+2008-12-24
+2008-12-25
+2008-12-26
+2008-12-27
+2008-12-28
+2008-12-29
+2008-12-30
+2008-12-31
+2009-01-01
+2009-01-02
+2009-01-03
+2009-01-04
+2009-01-05
+2009-01-06
+2009-01-07
+2009-01-08
+2009-01-09
+2009-01-10
+2009-01-11
+2009-01-12
+2009-01-13
+2009-01-14
+2009-01-15
+2009-01-16
+2009-01-17
+2009-01-18
+2009-01-19
+2009-01-20
+2009-01-21
+2009-01-22
+2009-01-23
+2009-01-24
+2009-01-25
+2009-01-26
+2009-01-27
+2009-01-28
+2009-01-29
+2009-01-30
+2009-01-31
+2009-02-01
+2009-02-02
+2009-02-03
+2009-02-04
+2009-02-05
+2009-02-06
+2009-02-07
+2009-02-08
+2009-02-09
+2009-02-10
+2009-02-11
+2009-02-12
+2009-02-13
+2009-02-14
+2009-02-15
+2009-02-16
+2009-02-17
+2009-02-18
+2009-02-19
+2009-02-20
+2009-02-21
+2009-02-22
+2009-02-23
+2009-02-24
+2009-02-25
+2009-02-26
+2009-02-27
+2009-02-28
+2009-03-01
+2009-03-02
+2009-03-03
+2009-03-04
+2009-03-05
+2009-03-06
+2009-03-07
+2009-03-08
+2009-03-09
+2009-03-10
+2009-03-11
+2009-03-12
+2009-03-13
+2009-03-14
+2009-03-15
+2009-03-16
+2009-03-17
+2009-03-18
+2009-03-19
+2009-03-20
+2009-03-21
+2009-03-22
+2009-03-23
+2009-03-24
+2009-03-25
+2009-03-26
+2009-03-27
+2009-03-28
+2009-03-29
+2009-03-30
+2009-03-31
+2009-04-01
+2009-04-02
+2009-04-03
+2009-04-04
+2009-04-05
+2009-04-06
+2009-04-07
+2009-04-08
+2009-04-09
+2009-04-10
+2009-04-11
+2009-04-12
+2009-04-13
+2009-04-14
+2009-04-15
+2009-04-16
+2009-04-17
+2009-04-18
+2009-04-19
+2009-04-20
+2009-04-21
+2009-04-22
+2009-04-23
+2009-04-24
+2009-04-25
+2009-04-26
+2009-04-27
+2009-04-28
+2009-04-29
+2009-04-30
+2009-05-01
+2009-05-02
+2009-05-03
+2009-05-04
+2009-05-05
+2009-05-06
+2009-05-07
+2009-05-08
+2009-05-09
+2009-05-10
+2009-05-11
+2009-05-12
+2009-05-13
+2009-05-14
+2009-05-15
+2009-05-16
+2009-05-17
+2009-05-18
+2009-05-19
+2009-05-20
+2009-05-21
+2009-05-22
+2009-05-23
+2009-05-24
+2009-05-25
+2009-05-26
+2009-05-27
+2009-05-28
+2009-05-29
+2009-05-30
+2009-05-31
+2009-06-01
+2009-06-02
+2009-06-03
+2009-06-04
+2009-06-05
+2009-06-06
+2009-06-07
+2009-06-08
+2009-06-09
+2009-06-10
+2009-06-11
+2009-06-12
+2009-06-13
+2009-06-14
+2009-06-15
+2009-06-16
+2009-06-17
+2009-06-18
+2009-06-19
+2009-06-20
+2009-06-21
+2009-06-22
+2009-06-23
+2009-06-24
+2009-06-25
+2009-06-26
+2009-06-27
+2009-06-28
+2009-06-29
+2009-06-30
+2009-07-01
+2009-07-02
+2009-07-03
+2009-07-04
+2009-07-05
+2009-07-06
+2009-07-07
+2009-07-08
+2009-07-09
+2009-07-10
+2009-07-11
+2009-07-12
+2009-07-13
+2009-07-14
+2009-07-15
+2009-07-16
+2009-07-17
+2009-07-18
+2009-07-19
+2009-07-20
+2009-07-21
+2009-07-22
+2009-07-23
+2009-07-24
+2009-07-25
+2009-07-26
+2009-07-27
+2009-07-28
+2009-07-29
+2009-07-30
+2009-07-31
+2009-08-01
+2009-08-02
+2009-08-03
+2009-08-04
+2009-08-05
+2009-08-06
+2009-08-07
+2009-08-08
+2009-08-09
+2009-08-10
+2009-08-11
+2009-08-12
+2009-08-13
+2009-08-14
+2009-08-15
+2009-08-16
+2009-08-17
+2009-08-18
+2009-08-19
+2009-08-20
+2009-08-21
+2009-08-22
+2009-08-23
+2009-08-24
+2009-08-25
+2009-08-26
+2009-08-27
+2009-08-28
+2009-08-29
+2009-08-30
+2009-08-31
+2009-09-01
+2009-09-02
+2009-09-03
+2009-09-04
+2009-09-05
+2009-09-06
+2009-09-07
+2009-09-08
+2009-09-09
+2009-09-10
+2009-09-11
+2009-09-12
+2009-09-13
+2009-09-14
+2009-09-15
+2009-09-16
+2009-09-17
+2009-09-18
+2009-09-19
+2009-09-20
+2009-09-21
+2009-09-22
+2009-09-23
+2009-09-24
+2009-09-25
+2009-09-26
+2009-09-27
+2009-09-28
+2009-09-29
+2009-09-30
+2009-10-01
+2009-10-02
+2009-10-03
+2009-10-04
+2009-10-05
+2009-10-06
+2009-10-07
+2009-10-08
+2009-10-09
+2009-10-10
+2009-10-11
+2009-10-12
+2009-10-13
+2009-10-14
+2009-10-15
+2009-10-16
+2009-10-17
+2009-10-18
+2009-10-19
+2009-10-20
+2009-10-21
+2009-10-22
+2009-10-23
+2009-10-24
+2009-10-25
+2009-10-26
+2009-10-27
+2009-10-28
+2009-10-29
+2009-10-30
+2009-10-31
+2009-11-01
+2009-11-02
+2009-11-03
+2009-11-04
+2009-11-05
+2009-11-06
+2009-11-07
+2009-11-08
+2009-11-09
+2009-11-10
+2009-11-11
+2009-11-12
+2009-11-13
+2009-11-14
+2009-11-15
+2009-11-16
+2009-11-17
+2009-11-18
+2009-11-19
+2009-11-20
+2009-11-21
+2009-11-22
+2009-11-23
+2009-11-24
+2009-11-25
+2009-11-26
+2009-11-27
+2009-11-28
+2009-11-29
+2009-11-30
+2009-12-01
+2009-12-02
+2009-12-03
+2009-12-04
+2009-12-05
+2009-12-06
+2009-12-07
+2009-12-08
+2009-12-09
+2009-12-10
+2009-12-11
+2009-12-12
+2009-12-13
+2009-12-14
+2009-12-15
+2009-12-16
+2009-12-17
+2009-12-18
+2009-12-19
+2009-12-20
+2009-12-21
+2009-12-22
+2009-12-23
+2009-12-24
+2009-12-25
+2009-12-26
+2009-12-27
+2009-12-28
+2009-12-29
+2009-12-30
+2009-12-31
+2010-01-01
+2010-01-02
+2010-01-03
+2010-01-04
+2010-01-05
+2010-01-06
+2010-01-07
+2010-01-08
+2010-01-09
+2010-01-10
+2010-01-11
+2010-01-12
+2010-01-13
+2010-01-14
+2010-01-15
+2010-01-16
+2010-01-17
+2010-01-18
+2010-01-19
+2010-01-20
+2010-01-21
+2010-01-22
+2010-01-23
+2010-01-24
+2010-01-25
+2010-01-26
+2010-01-27
+2010-01-28
+2010-01-29
+2010-01-30
+2010-01-31
+2010-02-01
+2010-02-02
+2010-02-03
+2010-02-04
+2010-02-05
+2010-02-06
+2010-02-07
+2010-02-08
+2010-02-09
+2010-02-10
+2010-02-11
+2010-02-12
+2010-02-13
+2010-02-14
+2010-02-15
+2010-02-16
+2010-02-17
+2010-02-18
+2010-02-19
+2010-02-20
+2010-02-21
+2010-02-22
+2010-02-23
+2010-02-24
+2010-02-25
+2010-02-26
+2010-02-27
+2010-02-28
+2010-03-01
+2010-03-02
+2010-03-03
+2010-03-04
+2010-03-05
+2010-03-06
+2010-03-07
+2010-03-08
+2010-03-09
+2010-03-10
+2010-03-11
+2010-03-12
+2010-03-13
+2010-03-14
+2010-03-15
+2010-03-16
+2010-03-17
+2010-03-18
+2010-03-19
+2010-03-20
+2010-03-21
+2010-03-22
+2010-03-23
+2010-03-24
+2010-03-25
+2010-03-26
+2010-03-27
+2010-03-28
+2010-03-29
+2010-03-30
+2010-03-31
+2010-04-01
+2010-04-02
+2010-04-03
+2010-04-04
+2010-04-05
+2010-04-06
+2010-04-07
+2010-04-08
+2010-04-09
+2010-04-10
+2010-04-11
+2010-04-12
+2010-04-13
+2010-04-14
+2010-04-15
+2010-04-16
+2010-04-17
+2010-04-18
+2010-04-19
+2010-04-20
+2010-04-21
+2010-04-22
+2010-04-23
+2010-04-24
+2010-04-25
+2010-04-26
+2010-04-27
+2010-04-28
+2010-04-29
+2010-04-30
+2010-05-01
+2010-05-02
+2010-05-03
+2010-05-04
+2010-05-05
+2010-05-06
+2010-05-07
+2010-05-08
+2010-05-09
+2010-05-10
+2010-05-11
+2010-05-12
+2010-05-13
+2010-05-14
+2010-05-15
+2010-05-16
+2010-05-17
+2010-05-18
+2010-05-19
+2010-05-20
+2010-05-21
+2010-05-22
+2010-05-23
+2010-05-24
+2010-05-25
+2010-05-26
+2010-05-27
+2010-05-28
+2010-05-29
+2010-05-30
+2010-05-31
+2010-06-01
+2010-06-02
+2010-06-03
+2010-06-04
+2010-06-05
+2010-06-06
+2010-06-07
+2010-06-08
+2010-06-09
+2010-06-10
+2010-06-11
+2010-06-12
+2010-06-13
+2010-06-14
+2010-06-15
+2010-06-16
+2010-06-17
+2010-06-18
+2010-06-19
+2010-06-20
+2010-06-21
+2010-06-22
+2010-06-23
+2010-06-24
+2010-06-25
+2010-06-26
+2010-06-27
+2010-06-28
+2010-06-29
+2010-06-30
+2010-07-01
+2010-07-02
+2010-07-03
+2010-07-04
+2010-07-05
+2010-07-06
+2010-07-07
+2010-07-08
+2010-07-09
+2010-07-10
+2010-07-11
+2010-07-12
+2010-07-13
+2010-07-14
+2010-07-15
+2010-07-16
+2010-07-17
+2010-07-18
+2010-07-19
+2010-07-20
+2010-07-21
+2010-07-22
+2010-07-23
+2010-07-24
+2010-07-25
+2010-07-26
+2010-07-27
+2010-07-28
+2010-07-29
+2010-07-30
+2010-07-31
+2010-08-01
+2010-08-02
+2010-08-03
+2010-08-04
+2010-08-05
+2010-08-06
+2010-08-07
+2010-08-08
+2010-08-09
+2010-08-10
+2010-08-11
+2010-08-12
+2010-08-13
+2010-08-14
+2010-08-15
+2010-08-16
+2010-08-17
+2010-08-18
+2010-08-19
+2010-08-20
+2010-08-21
+2010-08-22
+2010-08-23
+2010-08-24
+2010-08-25
+2010-08-26
+2010-08-27
+2010-08-28
+2010-08-29
+2010-08-30
+2010-08-31
+2010-09-01
+2010-09-02
+2010-09-03
+2010-09-04
+2010-09-05
+2010-09-06
+2010-09-07
+2010-09-08
+2010-09-09
+2010-09-10
+2010-09-11
+2010-09-12
+2010-09-13
+2010-09-14
+2010-09-15
+2010-09-16
+2010-09-17
+2010-09-18
+2010-09-19
+2010-09-20
+2010-09-21
+2010-09-22
+2010-09-23
+2010-09-24
+2010-09-25
+2010-09-26
+2010-09-27
+2010-09-28
+2010-09-29
+2010-09-30
+2010-10-01
+2010-10-02
+2010-10-03
+2010-10-04
+2010-10-05
+2010-10-06
+2010-10-07
+2010-10-08
+2010-10-09
+2010-10-10
+2010-10-11
+2010-10-12
+2010-10-13
+2010-10-14
+2010-10-15
+2010-10-16
+2010-10-17
+2010-10-18
+2010-10-19
+2010-10-20
+2010-10-21
+2010-10-22
+2010-10-23
+2010-10-24
+2010-10-25
+2010-10-26
+2010-10-27
+2010-10-28
+2010-10-29
+2010-10-30
+2010-10-31
+2010-11-01
+2010-11-02
+2010-11-03
+2010-11-04
+2010-11-05
+2010-11-06
+2010-11-07
+2010-11-08
+2010-11-09
+2010-11-10
+2010-11-11
+2010-11-12
+2010-11-13
+2010-11-14
+2010-11-15
+2010-11-16
+2010-11-17
+2010-11-18
+2010-11-19
+2010-11-20
+2010-11-21
+2010-11-22
+2010-11-23
+2010-11-24
+2010-11-25
+2010-11-26
+2010-11-27
+2010-11-28
+2010-11-29
+2010-11-30
+2010-12-01
+2010-12-02
+2010-12-03
+2010-12-04
+2010-12-05
+2010-12-06
+2010-12-07
+2010-12-08
+2010-12-09
+2010-12-10
+2010-12-11
+2010-12-12
+2010-12-13
+2010-12-14
+2010-12-15
+2010-12-16
+2010-12-17
+2010-12-18
+2010-12-19
+2010-12-20
+2010-12-21
+2010-12-22
+2010-12-23
+2010-12-24
+2010-12-25
+2010-12-26
+2010-12-27
+2010-12-28
+2010-12-29
+2010-12-30
+2010-12-31
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase39.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase39.ics
new file mode 100644
index 00000000..c2a3c233
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase39.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US-Eastern
+BEGIN:DAYLIGHT
+DTSTART:19900404T010000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19901026T060000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DESCRIPTION:Every 20 minutes from 9:00 AM to 4:40 PM every day:
+DTSTAMP:20040102T053656Z
+DTSTART;TZID=US-Eastern:19970902T090000
+RRULE:FREQ=MINUTELY;INTERVAL=20;BYHOUR=9,10,11,12,13,14,15,16
+SUMMARY:RExample36b
+UID:RExample36b
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase39.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase39.ics.comp34.ref
new file mode 100644
index 00000000..e8b2b6f3
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase39.ics.comp34.ref
@@ -0,0 +1,500 @@
+1997-09-02T09:00:00
+1997-09-02T09:20:00
+1997-09-02T09:40:00
+1997-09-02T10:00:00
+1997-09-02T10:20:00
+1997-09-02T10:40:00
+1997-09-02T11:00:00
+1997-09-02T11:20:00
+1997-09-02T11:40:00
+1997-09-02T12:00:00
+1997-09-02T12:20:00
+1997-09-02T12:40:00
+1997-09-02T13:00:00
+1997-09-02T13:20:00
+1997-09-02T13:40:00
+1997-09-02T14:00:00
+1997-09-02T14:20:00
+1997-09-02T14:40:00
+1997-09-02T15:00:00
+1997-09-02T15:20:00
+1997-09-02T15:40:00
+1997-09-02T16:00:00
+1997-09-02T16:20:00
+1997-09-02T16:40:00
+1997-09-02T17:00:00
+1997-09-02T17:20:00
+1997-09-02T17:40:00
+1997-09-02T18:00:00
+1997-09-02T18:20:00
+1997-09-02T18:40:00
+1997-09-02T19:00:00
+1997-09-02T19:20:00
+1997-09-02T19:40:00
+1997-09-02T20:00:00
+1997-09-02T20:20:00
+1997-09-02T20:40:00
+1997-09-02T21:00:00
+1997-09-02T21:20:00
+1997-09-02T21:40:00
+1997-09-02T22:00:00
+1997-09-02T22:20:00
+1997-09-02T22:40:00
+1997-09-02T23:00:00
+1997-09-02T23:20:00
+1997-09-02T23:40:00
+1997-09-03T00:00:00
+1997-09-03T00:20:00
+1997-09-03T00:40:00
+1997-09-03T01:00:00
+1997-09-03T01:20:00
+1997-09-03T01:40:00
+1997-09-03T02:00:00
+1997-09-03T02:20:00
+1997-09-03T02:40:00
+1997-09-03T03:00:00
+1997-09-03T03:20:00
+1997-09-03T03:40:00
+1997-09-03T04:00:00
+1997-09-03T04:20:00
+1997-09-03T04:40:00
+1997-09-03T05:00:00
+1997-09-03T05:20:00
+1997-09-03T05:40:00
+1997-09-03T06:00:00
+1997-09-03T06:20:00
+1997-09-03T06:40:00
+1997-09-03T07:00:00
+1997-09-03T07:20:00
+1997-09-03T07:40:00
+1997-09-03T08:00:00
+1997-09-03T08:20:00
+1997-09-03T08:40:00
+1997-09-03T09:00:00
+1997-09-03T09:20:00
+1997-09-03T09:40:00
+1997-09-03T10:00:00
+1997-09-03T10:20:00
+1997-09-03T10:40:00
+1997-09-03T11:00:00
+1997-09-03T11:20:00
+1997-09-03T11:40:00
+1997-09-03T12:00:00
+1997-09-03T12:20:00
+1997-09-03T12:40:00
+1997-09-03T13:00:00
+1997-09-03T13:20:00
+1997-09-03T13:40:00
+1997-09-03T14:00:00
+1997-09-03T14:20:00
+1997-09-03T14:40:00
+1997-09-03T15:00:00
+1997-09-03T15:20:00
+1997-09-03T15:40:00
+1997-09-03T16:00:00
+1997-09-03T16:20:00
+1997-09-03T16:40:00
+1997-09-03T17:00:00
+1997-09-03T17:20:00
+1997-09-03T17:40:00
+1997-09-03T18:00:00
+1997-09-03T18:20:00
+1997-09-03T18:40:00
+1997-09-03T19:00:00
+1997-09-03T19:20:00
+1997-09-03T19:40:00
+1997-09-03T20:00:00
+1997-09-03T20:20:00
+1997-09-03T20:40:00
+1997-09-03T21:00:00
+1997-09-03T21:20:00
+1997-09-03T21:40:00
+1997-09-03T22:00:00
+1997-09-03T22:20:00
+1997-09-03T22:40:00
+1997-09-03T23:00:00
+1997-09-03T23:20:00
+1997-09-03T23:40:00
+1997-09-04T00:00:00
+1997-09-04T00:20:00
+1997-09-04T00:40:00
+1997-09-04T01:00:00
+1997-09-04T01:20:00
+1997-09-04T01:40:00
+1997-09-04T02:00:00
+1997-09-04T02:20:00
+1997-09-04T02:40:00
+1997-09-04T03:00:00
+1997-09-04T03:20:00
+1997-09-04T03:40:00
+1997-09-04T04:00:00
+1997-09-04T04:20:00
+1997-09-04T04:40:00
+1997-09-04T05:00:00
+1997-09-04T05:20:00
+1997-09-04T05:40:00
+1997-09-04T06:00:00
+1997-09-04T06:20:00
+1997-09-04T06:40:00
+1997-09-04T07:00:00
+1997-09-04T07:20:00
+1997-09-04T07:40:00
+1997-09-04T08:00:00
+1997-09-04T08:20:00
+1997-09-04T08:40:00
+1997-09-04T09:00:00
+1997-09-04T09:20:00
+1997-09-04T09:40:00
+1997-09-04T10:00:00
+1997-09-04T10:20:00
+1997-09-04T10:40:00
+1997-09-04T11:00:00
+1997-09-04T11:20:00
+1997-09-04T11:40:00
+1997-09-04T12:00:00
+1997-09-04T12:20:00
+1997-09-04T12:40:00
+1997-09-04T13:00:00
+1997-09-04T13:20:00
+1997-09-04T13:40:00
+1997-09-04T14:00:00
+1997-09-04T14:20:00
+1997-09-04T14:40:00
+1997-09-04T15:00:00
+1997-09-04T15:20:00
+1997-09-04T15:40:00
+1997-09-04T16:00:00
+1997-09-04T16:20:00
+1997-09-04T16:40:00
+1997-09-04T17:00:00
+1997-09-04T17:20:00
+1997-09-04T17:40:00
+1997-09-04T18:00:00
+1997-09-04T18:20:00
+1997-09-04T18:40:00
+1997-09-04T19:00:00
+1997-09-04T19:20:00
+1997-09-04T19:40:00
+1997-09-04T20:00:00
+1997-09-04T20:20:00
+1997-09-04T20:40:00
+1997-09-04T21:00:00
+1997-09-04T21:20:00
+1997-09-04T21:40:00
+1997-09-04T22:00:00
+1997-09-04T22:20:00
+1997-09-04T22:40:00
+1997-09-04T23:00:00
+1997-09-04T23:20:00
+1997-09-04T23:40:00
+1997-09-05T00:00:00
+1997-09-05T00:20:00
+1997-09-05T00:40:00
+1997-09-05T01:00:00
+1997-09-05T01:20:00
+1997-09-05T01:40:00
+1997-09-05T02:00:00
+1997-09-05T02:20:00
+1997-09-05T02:40:00
+1997-09-05T03:00:00
+1997-09-05T03:20:00
+1997-09-05T03:40:00
+1997-09-05T04:00:00
+1997-09-05T04:20:00
+1997-09-05T04:40:00
+1997-09-05T05:00:00
+1997-09-05T05:20:00
+1997-09-05T05:40:00
+1997-09-05T06:00:00
+1997-09-05T06:20:00
+1997-09-05T06:40:00
+1997-09-05T07:00:00
+1997-09-05T07:20:00
+1997-09-05T07:40:00
+1997-09-05T08:00:00
+1997-09-05T08:20:00
+1997-09-05T08:40:00
+1997-09-05T09:00:00
+1997-09-05T09:20:00
+1997-09-05T09:40:00
+1997-09-05T10:00:00
+1997-09-05T10:20:00
+1997-09-05T10:40:00
+1997-09-05T11:00:00
+1997-09-05T11:20:00
+1997-09-05T11:40:00
+1997-09-05T12:00:00
+1997-09-05T12:20:00
+1997-09-05T12:40:00
+1997-09-05T13:00:00
+1997-09-05T13:20:00
+1997-09-05T13:40:00
+1997-09-05T14:00:00
+1997-09-05T14:20:00
+1997-09-05T14:40:00
+1997-09-05T15:00:00
+1997-09-05T15:20:00
+1997-09-05T15:40:00
+1997-09-05T16:00:00
+1997-09-05T16:20:00
+1997-09-05T16:40:00
+1997-09-05T17:00:00
+1997-09-05T17:20:00
+1997-09-05T17:40:00
+1997-09-05T18:00:00
+1997-09-05T18:20:00
+1997-09-05T18:40:00
+1997-09-05T19:00:00
+1997-09-05T19:20:00
+1997-09-05T19:40:00
+1997-09-05T20:00:00
+1997-09-05T20:20:00
+1997-09-05T20:40:00
+1997-09-05T21:00:00
+1997-09-05T21:20:00
+1997-09-05T21:40:00
+1997-09-05T22:00:00
+1997-09-05T22:20:00
+1997-09-05T22:40:00
+1997-09-05T23:00:00
+1997-09-05T23:20:00
+1997-09-05T23:40:00
+1997-09-06T00:00:00
+1997-09-06T00:20:00
+1997-09-06T00:40:00
+1997-09-06T01:00:00
+1997-09-06T01:20:00
+1997-09-06T01:40:00
+1997-09-06T02:00:00
+1997-09-06T02:20:00
+1997-09-06T02:40:00
+1997-09-06T03:00:00
+1997-09-06T03:20:00
+1997-09-06T03:40:00
+1997-09-06T04:00:00
+1997-09-06T04:20:00
+1997-09-06T04:40:00
+1997-09-06T05:00:00
+1997-09-06T05:20:00
+1997-09-06T05:40:00
+1997-09-06T06:00:00
+1997-09-06T06:20:00
+1997-09-06T06:40:00
+1997-09-06T07:00:00
+1997-09-06T07:20:00
+1997-09-06T07:40:00
+1997-09-06T08:00:00
+1997-09-06T08:20:00
+1997-09-06T08:40:00
+1997-09-06T09:00:00
+1997-09-06T09:20:00
+1997-09-06T09:40:00
+1997-09-06T10:00:00
+1997-09-06T10:20:00
+1997-09-06T10:40:00
+1997-09-06T11:00:00
+1997-09-06T11:20:00
+1997-09-06T11:40:00
+1997-09-06T12:00:00
+1997-09-06T12:20:00
+1997-09-06T12:40:00
+1997-09-06T13:00:00
+1997-09-06T13:20:00
+1997-09-06T13:40:00
+1997-09-06T14:00:00
+1997-09-06T14:20:00
+1997-09-06T14:40:00
+1997-09-06T15:00:00
+1997-09-06T15:20:00
+1997-09-06T15:40:00
+1997-09-06T16:00:00
+1997-09-06T16:20:00
+1997-09-06T16:40:00
+1997-09-06T17:00:00
+1997-09-06T17:20:00
+1997-09-06T17:40:00
+1997-09-06T18:00:00
+1997-09-06T18:20:00
+1997-09-06T18:40:00
+1997-09-06T19:00:00
+1997-09-06T19:20:00
+1997-09-06T19:40:00
+1997-09-06T20:00:00
+1997-09-06T20:20:00
+1997-09-06T20:40:00
+1997-09-06T21:00:00
+1997-09-06T21:20:00
+1997-09-06T21:40:00
+1997-09-06T22:00:00
+1997-09-06T22:20:00
+1997-09-06T22:40:00
+1997-09-06T23:00:00
+1997-09-06T23:20:00
+1997-09-06T23:40:00
+1997-09-07T00:00:00
+1997-09-07T00:20:00
+1997-09-07T00:40:00
+1997-09-07T01:00:00
+1997-09-07T01:20:00
+1997-09-07T01:40:00
+1997-09-07T02:00:00
+1997-09-07T02:20:00
+1997-09-07T02:40:00
+1997-09-07T03:00:00
+1997-09-07T03:20:00
+1997-09-07T03:40:00
+1997-09-07T04:00:00
+1997-09-07T04:20:00
+1997-09-07T04:40:00
+1997-09-07T05:00:00
+1997-09-07T05:20:00
+1997-09-07T05:40:00
+1997-09-07T06:00:00
+1997-09-07T06:20:00
+1997-09-07T06:40:00
+1997-09-07T07:00:00
+1997-09-07T07:20:00
+1997-09-07T07:40:00
+1997-09-07T08:00:00
+1997-09-07T08:20:00
+1997-09-07T08:40:00
+1997-09-07T09:00:00
+1997-09-07T09:20:00
+1997-09-07T09:40:00
+1997-09-07T10:00:00
+1997-09-07T10:20:00
+1997-09-07T10:40:00
+1997-09-07T11:00:00
+1997-09-07T11:20:00
+1997-09-07T11:40:00
+1997-09-07T12:00:00
+1997-09-07T12:20:00
+1997-09-07T12:40:00
+1997-09-07T13:00:00
+1997-09-07T13:20:00
+1997-09-07T13:40:00
+1997-09-07T14:00:00
+1997-09-07T14:20:00
+1997-09-07T14:40:00
+1997-09-07T15:00:00
+1997-09-07T15:20:00
+1997-09-07T15:40:00
+1997-09-07T16:00:00
+1997-09-07T16:20:00
+1997-09-07T16:40:00
+1997-09-07T17:00:00
+1997-09-07T17:20:00
+1997-09-07T17:40:00
+1997-09-07T18:00:00
+1997-09-07T18:20:00
+1997-09-07T18:40:00
+1997-09-07T19:00:00
+1997-09-07T19:20:00
+1997-09-07T19:40:00
+1997-09-07T20:00:00
+1997-09-07T20:20:00
+1997-09-07T20:40:00
+1997-09-07T21:00:00
+1997-09-07T21:20:00
+1997-09-07T21:40:00
+1997-09-07T22:00:00
+1997-09-07T22:20:00
+1997-09-07T22:40:00
+1997-09-07T23:00:00
+1997-09-07T23:20:00
+1997-09-07T23:40:00
+1997-09-08T00:00:00
+1997-09-08T00:20:00
+1997-09-08T00:40:00
+1997-09-08T01:00:00
+1997-09-08T01:20:00
+1997-09-08T01:40:00
+1997-09-08T02:00:00
+1997-09-08T02:20:00
+1997-09-08T02:40:00
+1997-09-08T03:00:00
+1997-09-08T03:20:00
+1997-09-08T03:40:00
+1997-09-08T04:00:00
+1997-09-08T04:20:00
+1997-09-08T04:40:00
+1997-09-08T05:00:00
+1997-09-08T05:20:00
+1997-09-08T05:40:00
+1997-09-08T06:00:00
+1997-09-08T06:20:00
+1997-09-08T06:40:00
+1997-09-08T07:00:00
+1997-09-08T07:20:00
+1997-09-08T07:40:00
+1997-09-08T08:00:00
+1997-09-08T08:20:00
+1997-09-08T08:40:00
+1997-09-08T09:00:00
+1997-09-08T09:20:00
+1997-09-08T09:40:00
+1997-09-08T10:00:00
+1997-09-08T10:20:00
+1997-09-08T10:40:00
+1997-09-08T11:00:00
+1997-09-08T11:20:00
+1997-09-08T11:40:00
+1997-09-08T12:00:00
+1997-09-08T12:20:00
+1997-09-08T12:40:00
+1997-09-08T13:00:00
+1997-09-08T13:20:00
+1997-09-08T13:40:00
+1997-09-08T14:00:00
+1997-09-08T14:20:00
+1997-09-08T14:40:00
+1997-09-08T15:00:00
+1997-09-08T15:20:00
+1997-09-08T15:40:00
+1997-09-08T16:00:00
+1997-09-08T16:20:00
+1997-09-08T16:40:00
+1997-09-08T17:00:00
+1997-09-08T17:20:00
+1997-09-08T17:40:00
+1997-09-08T18:00:00
+1997-09-08T18:20:00
+1997-09-08T18:40:00
+1997-09-08T19:00:00
+1997-09-08T19:20:00
+1997-09-08T19:40:00
+1997-09-08T20:00:00
+1997-09-08T20:20:00
+1997-09-08T20:40:00
+1997-09-08T21:00:00
+1997-09-08T21:20:00
+1997-09-08T21:40:00
+1997-09-08T22:00:00
+1997-09-08T22:20:00
+1997-09-08T22:40:00
+1997-09-08T23:00:00
+1997-09-08T23:20:00
+1997-09-08T23:40:00
+1997-09-09T00:00:00
+1997-09-09T00:20:00
+1997-09-09T00:40:00
+1997-09-09T01:00:00
+1997-09-09T01:20:00
+1997-09-09T01:40:00
+1997-09-09T02:00:00
+1997-09-09T02:20:00
+1997-09-09T02:40:00
+1997-09-09T03:00:00
+1997-09-09T03:20:00
+1997-09-09T03:40:00
+1997-09-09T04:00:00
+1997-09-09T04:20:00
+1997-09-09T04:40:00
+1997-09-09T05:00:00
+1997-09-09T05:20:00
+1997-09-09T05:40:00
+1997-09-09T06:00:00
+1997-09-09T06:20:00
+1997-09-09T06:40:00
+1997-09-09T07:00:00
+1997-09-09T07:20:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase39.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase39.ics.next.ref
new file mode 100644
index 00000000..991e6f4d
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase39.ics.next.ref
@@ -0,0 +1,500 @@
+1997-09-02T09:00:00
+1997-09-02T09:20:00
+1997-09-02T09:40:00
+1997-09-02T10:00:00
+1997-09-02T10:20:00
+1997-09-02T10:40:00
+1997-09-02T11:00:00
+1997-09-02T11:20:00
+1997-09-02T11:40:00
+1997-09-02T12:00:00
+1997-09-02T12:20:00
+1997-09-02T12:40:00
+1997-09-02T13:00:00
+1997-09-02T13:20:00
+1997-09-02T13:40:00
+1997-09-02T14:00:00
+1997-09-02T14:20:00
+1997-09-02T14:40:00
+1997-09-02T15:00:00
+1997-09-02T15:20:00
+1997-09-02T15:40:00
+1997-09-02T16:00:00
+1997-09-02T16:20:00
+1997-09-02T16:40:00
+1997-09-03T09:00:00
+1997-09-03T09:20:00
+1997-09-03T09:40:00
+1997-09-03T10:00:00
+1997-09-03T10:20:00
+1997-09-03T10:40:00
+1997-09-03T11:00:00
+1997-09-03T11:20:00
+1997-09-03T11:40:00
+1997-09-03T12:00:00
+1997-09-03T12:20:00
+1997-09-03T12:40:00
+1997-09-03T13:00:00
+1997-09-03T13:20:00
+1997-09-03T13:40:00
+1997-09-03T14:00:00
+1997-09-03T14:20:00
+1997-09-03T14:40:00
+1997-09-03T15:00:00
+1997-09-03T15:20:00
+1997-09-03T15:40:00
+1997-09-03T16:00:00
+1997-09-03T16:20:00
+1997-09-03T16:40:00
+1997-09-04T09:00:00
+1997-09-04T09:20:00
+1997-09-04T09:40:00
+1997-09-04T10:00:00
+1997-09-04T10:20:00
+1997-09-04T10:40:00
+1997-09-04T11:00:00
+1997-09-04T11:20:00
+1997-09-04T11:40:00
+1997-09-04T12:00:00
+1997-09-04T12:20:00
+1997-09-04T12:40:00
+1997-09-04T13:00:00
+1997-09-04T13:20:00
+1997-09-04T13:40:00
+1997-09-04T14:00:00
+1997-09-04T14:20:00
+1997-09-04T14:40:00
+1997-09-04T15:00:00
+1997-09-04T15:20:00
+1997-09-04T15:40:00
+1997-09-04T16:00:00
+1997-09-04T16:20:00
+1997-09-04T16:40:00
+1997-09-05T09:00:00
+1997-09-05T09:20:00
+1997-09-05T09:40:00
+1997-09-05T10:00:00
+1997-09-05T10:20:00
+1997-09-05T10:40:00
+1997-09-05T11:00:00
+1997-09-05T11:20:00
+1997-09-05T11:40:00
+1997-09-05T12:00:00
+1997-09-05T12:20:00
+1997-09-05T12:40:00
+1997-09-05T13:00:00
+1997-09-05T13:20:00
+1997-09-05T13:40:00
+1997-09-05T14:00:00
+1997-09-05T14:20:00
+1997-09-05T14:40:00
+1997-09-05T15:00:00
+1997-09-05T15:20:00
+1997-09-05T15:40:00
+1997-09-05T16:00:00
+1997-09-05T16:20:00
+1997-09-05T16:40:00
+1997-09-06T09:00:00
+1997-09-06T09:20:00
+1997-09-06T09:40:00
+1997-09-06T10:00:00
+1997-09-06T10:20:00
+1997-09-06T10:40:00
+1997-09-06T11:00:00
+1997-09-06T11:20:00
+1997-09-06T11:40:00
+1997-09-06T12:00:00
+1997-09-06T12:20:00
+1997-09-06T12:40:00
+1997-09-06T13:00:00
+1997-09-06T13:20:00
+1997-09-06T13:40:00
+1997-09-06T14:00:00
+1997-09-06T14:20:00
+1997-09-06T14:40:00
+1997-09-06T15:00:00
+1997-09-06T15:20:00
+1997-09-06T15:40:00
+1997-09-06T16:00:00
+1997-09-06T16:20:00
+1997-09-06T16:40:00
+1997-09-07T09:00:00
+1997-09-07T09:20:00
+1997-09-07T09:40:00
+1997-09-07T10:00:00
+1997-09-07T10:20:00
+1997-09-07T10:40:00
+1997-09-07T11:00:00
+1997-09-07T11:20:00
+1997-09-07T11:40:00
+1997-09-07T12:00:00
+1997-09-07T12:20:00
+1997-09-07T12:40:00
+1997-09-07T13:00:00
+1997-09-07T13:20:00
+1997-09-07T13:40:00
+1997-09-07T14:00:00
+1997-09-07T14:20:00
+1997-09-07T14:40:00
+1997-09-07T15:00:00
+1997-09-07T15:20:00
+1997-09-07T15:40:00
+1997-09-07T16:00:00
+1997-09-07T16:20:00
+1997-09-07T16:40:00
+1997-09-08T09:00:00
+1997-09-08T09:20:00
+1997-09-08T09:40:00
+1997-09-08T10:00:00
+1997-09-08T10:20:00
+1997-09-08T10:40:00
+1997-09-08T11:00:00
+1997-09-08T11:20:00
+1997-09-08T11:40:00
+1997-09-08T12:00:00
+1997-09-08T12:20:00
+1997-09-08T12:40:00
+1997-09-08T13:00:00
+1997-09-08T13:20:00
+1997-09-08T13:40:00
+1997-09-08T14:00:00
+1997-09-08T14:20:00
+1997-09-08T14:40:00
+1997-09-08T15:00:00
+1997-09-08T15:20:00
+1997-09-08T15:40:00
+1997-09-08T16:00:00
+1997-09-08T16:20:00
+1997-09-08T16:40:00
+1997-09-09T09:00:00
+1997-09-09T09:20:00
+1997-09-09T09:40:00
+1997-09-09T10:00:00
+1997-09-09T10:20:00
+1997-09-09T10:40:00
+1997-09-09T11:00:00
+1997-09-09T11:20:00
+1997-09-09T11:40:00
+1997-09-09T12:00:00
+1997-09-09T12:20:00
+1997-09-09T12:40:00
+1997-09-09T13:00:00
+1997-09-09T13:20:00
+1997-09-09T13:40:00
+1997-09-09T14:00:00
+1997-09-09T14:20:00
+1997-09-09T14:40:00
+1997-09-09T15:00:00
+1997-09-09T15:20:00
+1997-09-09T15:40:00
+1997-09-09T16:00:00
+1997-09-09T16:20:00
+1997-09-09T16:40:00
+1997-09-10T09:00:00
+1997-09-10T09:20:00
+1997-09-10T09:40:00
+1997-09-10T10:00:00
+1997-09-10T10:20:00
+1997-09-10T10:40:00
+1997-09-10T11:00:00
+1997-09-10T11:20:00
+1997-09-10T11:40:00
+1997-09-10T12:00:00
+1997-09-10T12:20:00
+1997-09-10T12:40:00
+1997-09-10T13:00:00
+1997-09-10T13:20:00
+1997-09-10T13:40:00
+1997-09-10T14:00:00
+1997-09-10T14:20:00
+1997-09-10T14:40:00
+1997-09-10T15:00:00
+1997-09-10T15:20:00
+1997-09-10T15:40:00
+1997-09-10T16:00:00
+1997-09-10T16:20:00
+1997-09-10T16:40:00
+1997-09-11T09:00:00
+1997-09-11T09:20:00
+1997-09-11T09:40:00
+1997-09-11T10:00:00
+1997-09-11T10:20:00
+1997-09-11T10:40:00
+1997-09-11T11:00:00
+1997-09-11T11:20:00
+1997-09-11T11:40:00
+1997-09-11T12:00:00
+1997-09-11T12:20:00
+1997-09-11T12:40:00
+1997-09-11T13:00:00
+1997-09-11T13:20:00
+1997-09-11T13:40:00
+1997-09-11T14:00:00
+1997-09-11T14:20:00
+1997-09-11T14:40:00
+1997-09-11T15:00:00
+1997-09-11T15:20:00
+1997-09-11T15:40:00
+1997-09-11T16:00:00
+1997-09-11T16:20:00
+1997-09-11T16:40:00
+1997-09-12T09:00:00
+1997-09-12T09:20:00
+1997-09-12T09:40:00
+1997-09-12T10:00:00
+1997-09-12T10:20:00
+1997-09-12T10:40:00
+1997-09-12T11:00:00
+1997-09-12T11:20:00
+1997-09-12T11:40:00
+1997-09-12T12:00:00
+1997-09-12T12:20:00
+1997-09-12T12:40:00
+1997-09-12T13:00:00
+1997-09-12T13:20:00
+1997-09-12T13:40:00
+1997-09-12T14:00:00
+1997-09-12T14:20:00
+1997-09-12T14:40:00
+1997-09-12T15:00:00
+1997-09-12T15:20:00
+1997-09-12T15:40:00
+1997-09-12T16:00:00
+1997-09-12T16:20:00
+1997-09-12T16:40:00
+1997-09-13T09:00:00
+1997-09-13T09:20:00
+1997-09-13T09:40:00
+1997-09-13T10:00:00
+1997-09-13T10:20:00
+1997-09-13T10:40:00
+1997-09-13T11:00:00
+1997-09-13T11:20:00
+1997-09-13T11:40:00
+1997-09-13T12:00:00
+1997-09-13T12:20:00
+1997-09-13T12:40:00
+1997-09-13T13:00:00
+1997-09-13T13:20:00
+1997-09-13T13:40:00
+1997-09-13T14:00:00
+1997-09-13T14:20:00
+1997-09-13T14:40:00
+1997-09-13T15:00:00
+1997-09-13T15:20:00
+1997-09-13T15:40:00
+1997-09-13T16:00:00
+1997-09-13T16:20:00
+1997-09-13T16:40:00
+1997-09-14T09:00:00
+1997-09-14T09:20:00
+1997-09-14T09:40:00
+1997-09-14T10:00:00
+1997-09-14T10:20:00
+1997-09-14T10:40:00
+1997-09-14T11:00:00
+1997-09-14T11:20:00
+1997-09-14T11:40:00
+1997-09-14T12:00:00
+1997-09-14T12:20:00
+1997-09-14T12:40:00
+1997-09-14T13:00:00
+1997-09-14T13:20:00
+1997-09-14T13:40:00
+1997-09-14T14:00:00
+1997-09-14T14:20:00
+1997-09-14T14:40:00
+1997-09-14T15:00:00
+1997-09-14T15:20:00
+1997-09-14T15:40:00
+1997-09-14T16:00:00
+1997-09-14T16:20:00
+1997-09-14T16:40:00
+1997-09-15T09:00:00
+1997-09-15T09:20:00
+1997-09-15T09:40:00
+1997-09-15T10:00:00
+1997-09-15T10:20:00
+1997-09-15T10:40:00
+1997-09-15T11:00:00
+1997-09-15T11:20:00
+1997-09-15T11:40:00
+1997-09-15T12:00:00
+1997-09-15T12:20:00
+1997-09-15T12:40:00
+1997-09-15T13:00:00
+1997-09-15T13:20:00
+1997-09-15T13:40:00
+1997-09-15T14:00:00
+1997-09-15T14:20:00
+1997-09-15T14:40:00
+1997-09-15T15:00:00
+1997-09-15T15:20:00
+1997-09-15T15:40:00
+1997-09-15T16:00:00
+1997-09-15T16:20:00
+1997-09-15T16:40:00
+1997-09-16T09:00:00
+1997-09-16T09:20:00
+1997-09-16T09:40:00
+1997-09-16T10:00:00
+1997-09-16T10:20:00
+1997-09-16T10:40:00
+1997-09-16T11:00:00
+1997-09-16T11:20:00
+1997-09-16T11:40:00
+1997-09-16T12:00:00
+1997-09-16T12:20:00
+1997-09-16T12:40:00
+1997-09-16T13:00:00
+1997-09-16T13:20:00
+1997-09-16T13:40:00
+1997-09-16T14:00:00
+1997-09-16T14:20:00
+1997-09-16T14:40:00
+1997-09-16T15:00:00
+1997-09-16T15:20:00
+1997-09-16T15:40:00
+1997-09-16T16:00:00
+1997-09-16T16:20:00
+1997-09-16T16:40:00
+1997-09-17T09:00:00
+1997-09-17T09:20:00
+1997-09-17T09:40:00
+1997-09-17T10:00:00
+1997-09-17T10:20:00
+1997-09-17T10:40:00
+1997-09-17T11:00:00
+1997-09-17T11:20:00
+1997-09-17T11:40:00
+1997-09-17T12:00:00
+1997-09-17T12:20:00
+1997-09-17T12:40:00
+1997-09-17T13:00:00
+1997-09-17T13:20:00
+1997-09-17T13:40:00
+1997-09-17T14:00:00
+1997-09-17T14:20:00
+1997-09-17T14:40:00
+1997-09-17T15:00:00
+1997-09-17T15:20:00
+1997-09-17T15:40:00
+1997-09-17T16:00:00
+1997-09-17T16:20:00
+1997-09-17T16:40:00
+1997-09-18T09:00:00
+1997-09-18T09:20:00
+1997-09-18T09:40:00
+1997-09-18T10:00:00
+1997-09-18T10:20:00
+1997-09-18T10:40:00
+1997-09-18T11:00:00
+1997-09-18T11:20:00
+1997-09-18T11:40:00
+1997-09-18T12:00:00
+1997-09-18T12:20:00
+1997-09-18T12:40:00
+1997-09-18T13:00:00
+1997-09-18T13:20:00
+1997-09-18T13:40:00
+1997-09-18T14:00:00
+1997-09-18T14:20:00
+1997-09-18T14:40:00
+1997-09-18T15:00:00
+1997-09-18T15:20:00
+1997-09-18T15:40:00
+1997-09-18T16:00:00
+1997-09-18T16:20:00
+1997-09-18T16:40:00
+1997-09-19T09:00:00
+1997-09-19T09:20:00
+1997-09-19T09:40:00
+1997-09-19T10:00:00
+1997-09-19T10:20:00
+1997-09-19T10:40:00
+1997-09-19T11:00:00
+1997-09-19T11:20:00
+1997-09-19T11:40:00
+1997-09-19T12:00:00
+1997-09-19T12:20:00
+1997-09-19T12:40:00
+1997-09-19T13:00:00
+1997-09-19T13:20:00
+1997-09-19T13:40:00
+1997-09-19T14:00:00
+1997-09-19T14:20:00
+1997-09-19T14:40:00
+1997-09-19T15:00:00
+1997-09-19T15:20:00
+1997-09-19T15:40:00
+1997-09-19T16:00:00
+1997-09-19T16:20:00
+1997-09-19T16:40:00
+1997-09-20T09:00:00
+1997-09-20T09:20:00
+1997-09-20T09:40:00
+1997-09-20T10:00:00
+1997-09-20T10:20:00
+1997-09-20T10:40:00
+1997-09-20T11:00:00
+1997-09-20T11:20:00
+1997-09-20T11:40:00
+1997-09-20T12:00:00
+1997-09-20T12:20:00
+1997-09-20T12:40:00
+1997-09-20T13:00:00
+1997-09-20T13:20:00
+1997-09-20T13:40:00
+1997-09-20T14:00:00
+1997-09-20T14:20:00
+1997-09-20T14:40:00
+1997-09-20T15:00:00
+1997-09-20T15:20:00
+1997-09-20T15:40:00
+1997-09-20T16:00:00
+1997-09-20T16:20:00
+1997-09-20T16:40:00
+1997-09-21T09:00:00
+1997-09-21T09:20:00
+1997-09-21T09:40:00
+1997-09-21T10:00:00
+1997-09-21T10:20:00
+1997-09-21T10:40:00
+1997-09-21T11:00:00
+1997-09-21T11:20:00
+1997-09-21T11:40:00
+1997-09-21T12:00:00
+1997-09-21T12:20:00
+1997-09-21T12:40:00
+1997-09-21T13:00:00
+1997-09-21T13:20:00
+1997-09-21T13:40:00
+1997-09-21T14:00:00
+1997-09-21T14:20:00
+1997-09-21T14:40:00
+1997-09-21T15:00:00
+1997-09-21T15:20:00
+1997-09-21T15:40:00
+1997-09-21T16:00:00
+1997-09-21T16:20:00
+1997-09-21T16:40:00
+1997-09-22T09:00:00
+1997-09-22T09:20:00
+1997-09-22T09:40:00
+1997-09-22T10:00:00
+1997-09-22T10:20:00
+1997-09-22T10:40:00
+1997-09-22T11:00:00
+1997-09-22T11:20:00
+1997-09-22T11:40:00
+1997-09-22T12:00:00
+1997-09-22T12:20:00
+1997-09-22T12:40:00
+1997-09-22T13:00:00
+1997-09-22T13:20:00
+1997-09-22T13:40:00
+1997-09-22T14:00:00
+1997-09-22T14:20:00
+1997-09-22T14:40:00
+1997-09-22T15:00:00
+1997-09-22T15:20:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase39.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase39.ics.prev.ref
new file mode 100644
index 00000000..c7cffef1
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase39.ics.prev.ref
@@ -0,0 +1,500 @@
+2010-12-31T16:40:00
+2010-12-31T16:20:00
+2010-12-31T16:00:00
+2010-12-31T15:40:00
+2010-12-31T15:20:00
+2010-12-31T15:00:00
+2010-12-31T14:40:00
+2010-12-31T14:20:00
+2010-12-31T14:00:00
+2010-12-31T13:40:00
+2010-12-31T13:20:00
+2010-12-31T13:00:00
+2010-12-31T12:40:00
+2010-12-31T12:20:00
+2010-12-31T12:00:00
+2010-12-31T11:40:00
+2010-12-31T11:20:00
+2010-12-31T11:00:00
+2010-12-31T10:40:00
+2010-12-31T10:20:00
+2010-12-31T10:00:00
+2010-12-31T09:40:00
+2010-12-31T09:20:00
+2010-12-31T09:00:00
+2010-12-30T16:40:00
+2010-12-30T16:20:00
+2010-12-30T16:00:00
+2010-12-30T15:40:00
+2010-12-30T15:20:00
+2010-12-30T15:00:00
+2010-12-30T14:40:00
+2010-12-30T14:20:00
+2010-12-30T14:00:00
+2010-12-30T13:40:00
+2010-12-30T13:20:00
+2010-12-30T13:00:00
+2010-12-30T12:40:00
+2010-12-30T12:20:00
+2010-12-30T12:00:00
+2010-12-30T11:40:00
+2010-12-30T11:20:00
+2010-12-30T11:00:00
+2010-12-30T10:40:00
+2010-12-30T10:20:00
+2010-12-30T10:00:00
+2010-12-30T09:40:00
+2010-12-30T09:20:00
+2010-12-30T09:00:00
+2010-12-29T16:40:00
+2010-12-29T16:20:00
+2010-12-29T16:00:00
+2010-12-29T15:40:00
+2010-12-29T15:20:00
+2010-12-29T15:00:00
+2010-12-29T14:40:00
+2010-12-29T14:20:00
+2010-12-29T14:00:00
+2010-12-29T13:40:00
+2010-12-29T13:20:00
+2010-12-29T13:00:00
+2010-12-29T12:40:00
+2010-12-29T12:20:00
+2010-12-29T12:00:00
+2010-12-29T11:40:00
+2010-12-29T11:20:00
+2010-12-29T11:00:00
+2010-12-29T10:40:00
+2010-12-29T10:20:00
+2010-12-29T10:00:00
+2010-12-29T09:40:00
+2010-12-29T09:20:00
+2010-12-29T09:00:00
+2010-12-28T16:40:00
+2010-12-28T16:20:00
+2010-12-28T16:00:00
+2010-12-28T15:40:00
+2010-12-28T15:20:00
+2010-12-28T15:00:00
+2010-12-28T14:40:00
+2010-12-28T14:20:00
+2010-12-28T14:00:00
+2010-12-28T13:40:00
+2010-12-28T13:20:00
+2010-12-28T13:00:00
+2010-12-28T12:40:00
+2010-12-28T12:20:00
+2010-12-28T12:00:00
+2010-12-28T11:40:00
+2010-12-28T11:20:00
+2010-12-28T11:00:00
+2010-12-28T10:40:00
+2010-12-28T10:20:00
+2010-12-28T10:00:00
+2010-12-28T09:40:00
+2010-12-28T09:20:00
+2010-12-28T09:00:00
+2010-12-27T16:40:00
+2010-12-27T16:20:00
+2010-12-27T16:00:00
+2010-12-27T15:40:00
+2010-12-27T15:20:00
+2010-12-27T15:00:00
+2010-12-27T14:40:00
+2010-12-27T14:20:00
+2010-12-27T14:00:00
+2010-12-27T13:40:00
+2010-12-27T13:20:00
+2010-12-27T13:00:00
+2010-12-27T12:40:00
+2010-12-27T12:20:00
+2010-12-27T12:00:00
+2010-12-27T11:40:00
+2010-12-27T11:20:00
+2010-12-27T11:00:00
+2010-12-27T10:40:00
+2010-12-27T10:20:00
+2010-12-27T10:00:00
+2010-12-27T09:40:00
+2010-12-27T09:20:00
+2010-12-27T09:00:00
+2010-12-26T16:40:00
+2010-12-26T16:20:00
+2010-12-26T16:00:00
+2010-12-26T15:40:00
+2010-12-26T15:20:00
+2010-12-26T15:00:00
+2010-12-26T14:40:00
+2010-12-26T14:20:00
+2010-12-26T14:00:00
+2010-12-26T13:40:00
+2010-12-26T13:20:00
+2010-12-26T13:00:00
+2010-12-26T12:40:00
+2010-12-26T12:20:00
+2010-12-26T12:00:00
+2010-12-26T11:40:00
+2010-12-26T11:20:00
+2010-12-26T11:00:00
+2010-12-26T10:40:00
+2010-12-26T10:20:00
+2010-12-26T10:00:00
+2010-12-26T09:40:00
+2010-12-26T09:20:00
+2010-12-26T09:00:00
+2010-12-25T16:40:00
+2010-12-25T16:20:00
+2010-12-25T16:00:00
+2010-12-25T15:40:00
+2010-12-25T15:20:00
+2010-12-25T15:00:00
+2010-12-25T14:40:00
+2010-12-25T14:20:00
+2010-12-25T14:00:00
+2010-12-25T13:40:00
+2010-12-25T13:20:00
+2010-12-25T13:00:00
+2010-12-25T12:40:00
+2010-12-25T12:20:00
+2010-12-25T12:00:00
+2010-12-25T11:40:00
+2010-12-25T11:20:00
+2010-12-25T11:00:00
+2010-12-25T10:40:00
+2010-12-25T10:20:00
+2010-12-25T10:00:00
+2010-12-25T09:40:00
+2010-12-25T09:20:00
+2010-12-25T09:00:00
+2010-12-24T16:40:00
+2010-12-24T16:20:00
+2010-12-24T16:00:00
+2010-12-24T15:40:00
+2010-12-24T15:20:00
+2010-12-24T15:00:00
+2010-12-24T14:40:00
+2010-12-24T14:20:00
+2010-12-24T14:00:00
+2010-12-24T13:40:00
+2010-12-24T13:20:00
+2010-12-24T13:00:00
+2010-12-24T12:40:00
+2010-12-24T12:20:00
+2010-12-24T12:00:00
+2010-12-24T11:40:00
+2010-12-24T11:20:00
+2010-12-24T11:00:00
+2010-12-24T10:40:00
+2010-12-24T10:20:00
+2010-12-24T10:00:00
+2010-12-24T09:40:00
+2010-12-24T09:20:00
+2010-12-24T09:00:00
+2010-12-23T16:40:00
+2010-12-23T16:20:00
+2010-12-23T16:00:00
+2010-12-23T15:40:00
+2010-12-23T15:20:00
+2010-12-23T15:00:00
+2010-12-23T14:40:00
+2010-12-23T14:20:00
+2010-12-23T14:00:00
+2010-12-23T13:40:00
+2010-12-23T13:20:00
+2010-12-23T13:00:00
+2010-12-23T12:40:00
+2010-12-23T12:20:00
+2010-12-23T12:00:00
+2010-12-23T11:40:00
+2010-12-23T11:20:00
+2010-12-23T11:00:00
+2010-12-23T10:40:00
+2010-12-23T10:20:00
+2010-12-23T10:00:00
+2010-12-23T09:40:00
+2010-12-23T09:20:00
+2010-12-23T09:00:00
+2010-12-22T16:40:00
+2010-12-22T16:20:00
+2010-12-22T16:00:00
+2010-12-22T15:40:00
+2010-12-22T15:20:00
+2010-12-22T15:00:00
+2010-12-22T14:40:00
+2010-12-22T14:20:00
+2010-12-22T14:00:00
+2010-12-22T13:40:00
+2010-12-22T13:20:00
+2010-12-22T13:00:00
+2010-12-22T12:40:00
+2010-12-22T12:20:00
+2010-12-22T12:00:00
+2010-12-22T11:40:00
+2010-12-22T11:20:00
+2010-12-22T11:00:00
+2010-12-22T10:40:00
+2010-12-22T10:20:00
+2010-12-22T10:00:00
+2010-12-22T09:40:00
+2010-12-22T09:20:00
+2010-12-22T09:00:00
+2010-12-21T16:40:00
+2010-12-21T16:20:00
+2010-12-21T16:00:00
+2010-12-21T15:40:00
+2010-12-21T15:20:00
+2010-12-21T15:00:00
+2010-12-21T14:40:00
+2010-12-21T14:20:00
+2010-12-21T14:00:00
+2010-12-21T13:40:00
+2010-12-21T13:20:00
+2010-12-21T13:00:00
+2010-12-21T12:40:00
+2010-12-21T12:20:00
+2010-12-21T12:00:00
+2010-12-21T11:40:00
+2010-12-21T11:20:00
+2010-12-21T11:00:00
+2010-12-21T10:40:00
+2010-12-21T10:20:00
+2010-12-21T10:00:00
+2010-12-21T09:40:00
+2010-12-21T09:20:00
+2010-12-21T09:00:00
+2010-12-20T16:40:00
+2010-12-20T16:20:00
+2010-12-20T16:00:00
+2010-12-20T15:40:00
+2010-12-20T15:20:00
+2010-12-20T15:00:00
+2010-12-20T14:40:00
+2010-12-20T14:20:00
+2010-12-20T14:00:00
+2010-12-20T13:40:00
+2010-12-20T13:20:00
+2010-12-20T13:00:00
+2010-12-20T12:40:00
+2010-12-20T12:20:00
+2010-12-20T12:00:00
+2010-12-20T11:40:00
+2010-12-20T11:20:00
+2010-12-20T11:00:00
+2010-12-20T10:40:00
+2010-12-20T10:20:00
+2010-12-20T10:00:00
+2010-12-20T09:40:00
+2010-12-20T09:20:00
+2010-12-20T09:00:00
+2010-12-19T16:40:00
+2010-12-19T16:20:00
+2010-12-19T16:00:00
+2010-12-19T15:40:00
+2010-12-19T15:20:00
+2010-12-19T15:00:00
+2010-12-19T14:40:00
+2010-12-19T14:20:00
+2010-12-19T14:00:00
+2010-12-19T13:40:00
+2010-12-19T13:20:00
+2010-12-19T13:00:00
+2010-12-19T12:40:00
+2010-12-19T12:20:00
+2010-12-19T12:00:00
+2010-12-19T11:40:00
+2010-12-19T11:20:00
+2010-12-19T11:00:00
+2010-12-19T10:40:00
+2010-12-19T10:20:00
+2010-12-19T10:00:00
+2010-12-19T09:40:00
+2010-12-19T09:20:00
+2010-12-19T09:00:00
+2010-12-18T16:40:00
+2010-12-18T16:20:00
+2010-12-18T16:00:00
+2010-12-18T15:40:00
+2010-12-18T15:20:00
+2010-12-18T15:00:00
+2010-12-18T14:40:00
+2010-12-18T14:20:00
+2010-12-18T14:00:00
+2010-12-18T13:40:00
+2010-12-18T13:20:00
+2010-12-18T13:00:00
+2010-12-18T12:40:00
+2010-12-18T12:20:00
+2010-12-18T12:00:00
+2010-12-18T11:40:00
+2010-12-18T11:20:00
+2010-12-18T11:00:00
+2010-12-18T10:40:00
+2010-12-18T10:20:00
+2010-12-18T10:00:00
+2010-12-18T09:40:00
+2010-12-18T09:20:00
+2010-12-18T09:00:00
+2010-12-17T16:40:00
+2010-12-17T16:20:00
+2010-12-17T16:00:00
+2010-12-17T15:40:00
+2010-12-17T15:20:00
+2010-12-17T15:00:00
+2010-12-17T14:40:00
+2010-12-17T14:20:00
+2010-12-17T14:00:00
+2010-12-17T13:40:00
+2010-12-17T13:20:00
+2010-12-17T13:00:00
+2010-12-17T12:40:00
+2010-12-17T12:20:00
+2010-12-17T12:00:00
+2010-12-17T11:40:00
+2010-12-17T11:20:00
+2010-12-17T11:00:00
+2010-12-17T10:40:00
+2010-12-17T10:20:00
+2010-12-17T10:00:00
+2010-12-17T09:40:00
+2010-12-17T09:20:00
+2010-12-17T09:00:00
+2010-12-16T16:40:00
+2010-12-16T16:20:00
+2010-12-16T16:00:00
+2010-12-16T15:40:00
+2010-12-16T15:20:00
+2010-12-16T15:00:00
+2010-12-16T14:40:00
+2010-12-16T14:20:00
+2010-12-16T14:00:00
+2010-12-16T13:40:00
+2010-12-16T13:20:00
+2010-12-16T13:00:00
+2010-12-16T12:40:00
+2010-12-16T12:20:00
+2010-12-16T12:00:00
+2010-12-16T11:40:00
+2010-12-16T11:20:00
+2010-12-16T11:00:00
+2010-12-16T10:40:00
+2010-12-16T10:20:00
+2010-12-16T10:00:00
+2010-12-16T09:40:00
+2010-12-16T09:20:00
+2010-12-16T09:00:00
+2010-12-15T16:40:00
+2010-12-15T16:20:00
+2010-12-15T16:00:00
+2010-12-15T15:40:00
+2010-12-15T15:20:00
+2010-12-15T15:00:00
+2010-12-15T14:40:00
+2010-12-15T14:20:00
+2010-12-15T14:00:00
+2010-12-15T13:40:00
+2010-12-15T13:20:00
+2010-12-15T13:00:00
+2010-12-15T12:40:00
+2010-12-15T12:20:00
+2010-12-15T12:00:00
+2010-12-15T11:40:00
+2010-12-15T11:20:00
+2010-12-15T11:00:00
+2010-12-15T10:40:00
+2010-12-15T10:20:00
+2010-12-15T10:00:00
+2010-12-15T09:40:00
+2010-12-15T09:20:00
+2010-12-15T09:00:00
+2010-12-14T16:40:00
+2010-12-14T16:20:00
+2010-12-14T16:00:00
+2010-12-14T15:40:00
+2010-12-14T15:20:00
+2010-12-14T15:00:00
+2010-12-14T14:40:00
+2010-12-14T14:20:00
+2010-12-14T14:00:00
+2010-12-14T13:40:00
+2010-12-14T13:20:00
+2010-12-14T13:00:00
+2010-12-14T12:40:00
+2010-12-14T12:20:00
+2010-12-14T12:00:00
+2010-12-14T11:40:00
+2010-12-14T11:20:00
+2010-12-14T11:00:00
+2010-12-14T10:40:00
+2010-12-14T10:20:00
+2010-12-14T10:00:00
+2010-12-14T09:40:00
+2010-12-14T09:20:00
+2010-12-14T09:00:00
+2010-12-13T16:40:00
+2010-12-13T16:20:00
+2010-12-13T16:00:00
+2010-12-13T15:40:00
+2010-12-13T15:20:00
+2010-12-13T15:00:00
+2010-12-13T14:40:00
+2010-12-13T14:20:00
+2010-12-13T14:00:00
+2010-12-13T13:40:00
+2010-12-13T13:20:00
+2010-12-13T13:00:00
+2010-12-13T12:40:00
+2010-12-13T12:20:00
+2010-12-13T12:00:00
+2010-12-13T11:40:00
+2010-12-13T11:20:00
+2010-12-13T11:00:00
+2010-12-13T10:40:00
+2010-12-13T10:20:00
+2010-12-13T10:00:00
+2010-12-13T09:40:00
+2010-12-13T09:20:00
+2010-12-13T09:00:00
+2010-12-12T16:40:00
+2010-12-12T16:20:00
+2010-12-12T16:00:00
+2010-12-12T15:40:00
+2010-12-12T15:20:00
+2010-12-12T15:00:00
+2010-12-12T14:40:00
+2010-12-12T14:20:00
+2010-12-12T14:00:00
+2010-12-12T13:40:00
+2010-12-12T13:20:00
+2010-12-12T13:00:00
+2010-12-12T12:40:00
+2010-12-12T12:20:00
+2010-12-12T12:00:00
+2010-12-12T11:40:00
+2010-12-12T11:20:00
+2010-12-12T11:00:00
+2010-12-12T10:40:00
+2010-12-12T10:20:00
+2010-12-12T10:00:00
+2010-12-12T09:40:00
+2010-12-12T09:20:00
+2010-12-12T09:00:00
+2010-12-11T16:40:00
+2010-12-11T16:20:00
+2010-12-11T16:00:00
+2010-12-11T15:40:00
+2010-12-11T15:20:00
+2010-12-11T15:00:00
+2010-12-11T14:40:00
+2010-12-11T14:20:00
+2010-12-11T14:00:00
+2010-12-11T13:40:00
+2010-12-11T13:20:00
+2010-12-11T13:00:00
+2010-12-11T12:40:00
+2010-12-11T12:20:00
+2010-12-11T12:00:00
+2010-12-11T11:40:00
+2010-12-11T11:20:00
+2010-12-11T11:00:00
+2010-12-11T10:40:00
+2010-12-11T10:20:00
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase39.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase39.ics.recurson.ref
new file mode 100644
index 00000000..3fe99758
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase39.ics.recurson.ref
@@ -0,0 +1,4869 @@
+1997-09-02
+1997-09-03
+1997-09-04
+1997-09-05
+1997-09-06
+1997-09-07
+1997-09-08
+1997-09-09
+1997-09-10
+1997-09-11
+1997-09-12
+1997-09-13
+1997-09-14
+1997-09-15
+1997-09-16
+1997-09-17
+1997-09-18
+1997-09-19
+1997-09-20
+1997-09-21
+1997-09-22
+1997-09-23
+1997-09-24
+1997-09-25
+1997-09-26
+1997-09-27
+1997-09-28
+1997-09-29
+1997-09-30
+1997-10-01
+1997-10-02
+1997-10-03
+1997-10-04
+1997-10-05
+1997-10-06
+1997-10-07
+1997-10-08
+1997-10-09
+1997-10-10
+1997-10-11
+1997-10-12
+1997-10-13
+1997-10-14
+1997-10-15
+1997-10-16
+1997-10-17
+1997-10-18
+1997-10-19
+1997-10-20
+1997-10-21
+1997-10-22
+1997-10-23
+1997-10-24
+1997-10-25
+1997-10-26
+1997-10-27
+1997-10-28
+1997-10-29
+1997-10-30
+1997-10-31
+1997-11-01
+1997-11-02
+1997-11-03
+1997-11-04
+1997-11-05
+1997-11-06
+1997-11-07
+1997-11-08
+1997-11-09
+1997-11-10
+1997-11-11
+1997-11-12
+1997-11-13
+1997-11-14
+1997-11-15
+1997-11-16
+1997-11-17
+1997-11-18
+1997-11-19
+1997-11-20
+1997-11-21
+1997-11-22
+1997-11-23
+1997-11-24
+1997-11-25
+1997-11-26
+1997-11-27
+1997-11-28
+1997-11-29
+1997-11-30
+1997-12-01
+1997-12-02
+1997-12-03
+1997-12-04
+1997-12-05
+1997-12-06
+1997-12-07
+1997-12-08
+1997-12-09
+1997-12-10
+1997-12-11
+1997-12-12
+1997-12-13
+1997-12-14
+1997-12-15
+1997-12-16
+1997-12-17
+1997-12-18
+1997-12-19
+1997-12-20
+1997-12-21
+1997-12-22
+1997-12-23
+1997-12-24
+1997-12-25
+1997-12-26
+1997-12-27
+1997-12-28
+1997-12-29
+1997-12-30
+1997-12-31
+1998-01-01
+1998-01-02
+1998-01-03
+1998-01-04
+1998-01-05
+1998-01-06
+1998-01-07
+1998-01-08
+1998-01-09
+1998-01-10
+1998-01-11
+1998-01-12
+1998-01-13
+1998-01-14
+1998-01-15
+1998-01-16
+1998-01-17
+1998-01-18
+1998-01-19
+1998-01-20
+1998-01-21
+1998-01-22
+1998-01-23
+1998-01-24
+1998-01-25
+1998-01-26
+1998-01-27
+1998-01-28
+1998-01-29
+1998-01-30
+1998-01-31
+1998-02-01
+1998-02-02
+1998-02-03
+1998-02-04
+1998-02-05
+1998-02-06
+1998-02-07
+1998-02-08
+1998-02-09
+1998-02-10
+1998-02-11
+1998-02-12
+1998-02-13
+1998-02-14
+1998-02-15
+1998-02-16
+1998-02-17
+1998-02-18
+1998-02-19
+1998-02-20
+1998-02-21
+1998-02-22
+1998-02-23
+1998-02-24
+1998-02-25
+1998-02-26
+1998-02-27
+1998-02-28
+1998-03-01
+1998-03-02
+1998-03-03
+1998-03-04
+1998-03-05
+1998-03-06
+1998-03-07
+1998-03-08
+1998-03-09
+1998-03-10
+1998-03-11
+1998-03-12
+1998-03-13
+1998-03-14
+1998-03-15
+1998-03-16
+1998-03-17
+1998-03-18
+1998-03-19
+1998-03-20
+1998-03-21
+1998-03-22
+1998-03-23
+1998-03-24
+1998-03-25
+1998-03-26
+1998-03-27
+1998-03-28
+1998-03-29
+1998-03-30
+1998-03-31
+1998-04-01
+1998-04-02
+1998-04-03
+1998-04-04
+1998-04-05
+1998-04-06
+1998-04-07
+1998-04-08
+1998-04-09
+1998-04-10
+1998-04-11
+1998-04-12
+1998-04-13
+1998-04-14
+1998-04-15
+1998-04-16
+1998-04-17
+1998-04-18
+1998-04-19
+1998-04-20
+1998-04-21
+1998-04-22
+1998-04-23
+1998-04-24
+1998-04-25
+1998-04-26
+1998-04-27
+1998-04-28
+1998-04-29
+1998-04-30
+1998-05-01
+1998-05-02
+1998-05-03
+1998-05-04
+1998-05-05
+1998-05-06
+1998-05-07
+1998-05-08
+1998-05-09
+1998-05-10
+1998-05-11
+1998-05-12
+1998-05-13
+1998-05-14
+1998-05-15
+1998-05-16
+1998-05-17
+1998-05-18
+1998-05-19
+1998-05-20
+1998-05-21
+1998-05-22
+1998-05-23
+1998-05-24
+1998-05-25
+1998-05-26
+1998-05-27
+1998-05-28
+1998-05-29
+1998-05-30
+1998-05-31
+1998-06-01
+1998-06-02
+1998-06-03
+1998-06-04
+1998-06-05
+1998-06-06
+1998-06-07
+1998-06-08
+1998-06-09
+1998-06-10
+1998-06-11
+1998-06-12
+1998-06-13
+1998-06-14
+1998-06-15
+1998-06-16
+1998-06-17
+1998-06-18
+1998-06-19
+1998-06-20
+1998-06-21
+1998-06-22
+1998-06-23
+1998-06-24
+1998-06-25
+1998-06-26
+1998-06-27
+1998-06-28
+1998-06-29
+1998-06-30
+1998-07-01
+1998-07-02
+1998-07-03
+1998-07-04
+1998-07-05
+1998-07-06
+1998-07-07
+1998-07-08
+1998-07-09
+1998-07-10
+1998-07-11
+1998-07-12
+1998-07-13
+1998-07-14
+1998-07-15
+1998-07-16
+1998-07-17
+1998-07-18
+1998-07-19
+1998-07-20
+1998-07-21
+1998-07-22
+1998-07-23
+1998-07-24
+1998-07-25
+1998-07-26
+1998-07-27
+1998-07-28
+1998-07-29
+1998-07-30
+1998-07-31
+1998-08-01
+1998-08-02
+1998-08-03
+1998-08-04
+1998-08-05
+1998-08-06
+1998-08-07
+1998-08-08
+1998-08-09
+1998-08-10
+1998-08-11
+1998-08-12
+1998-08-13
+1998-08-14
+1998-08-15
+1998-08-16
+1998-08-17
+1998-08-18
+1998-08-19
+1998-08-20
+1998-08-21
+1998-08-22
+1998-08-23
+1998-08-24
+1998-08-25
+1998-08-26
+1998-08-27
+1998-08-28
+1998-08-29
+1998-08-30
+1998-08-31
+1998-09-01
+1998-09-02
+1998-09-03
+1998-09-04
+1998-09-05
+1998-09-06
+1998-09-07
+1998-09-08
+1998-09-09
+1998-09-10
+1998-09-11
+1998-09-12
+1998-09-13
+1998-09-14
+1998-09-15
+1998-09-16
+1998-09-17
+1998-09-18
+1998-09-19
+1998-09-20
+1998-09-21
+1998-09-22
+1998-09-23
+1998-09-24
+1998-09-25
+1998-09-26
+1998-09-27
+1998-09-28
+1998-09-29
+1998-09-30
+1998-10-01
+1998-10-02
+1998-10-03
+1998-10-04
+1998-10-05
+1998-10-06
+1998-10-07
+1998-10-08
+1998-10-09
+1998-10-10
+1998-10-11
+1998-10-12
+1998-10-13
+1998-10-14
+1998-10-15
+1998-10-16
+1998-10-17
+1998-10-18
+1998-10-19
+1998-10-20
+1998-10-21
+1998-10-22
+1998-10-23
+1998-10-24
+1998-10-25
+1998-10-26
+1998-10-27
+1998-10-28
+1998-10-29
+1998-10-30
+1998-10-31
+1998-11-01
+1998-11-02
+1998-11-03
+1998-11-04
+1998-11-05
+1998-11-06
+1998-11-07
+1998-11-08
+1998-11-09
+1998-11-10
+1998-11-11
+1998-11-12
+1998-11-13
+1998-11-14
+1998-11-15
+1998-11-16
+1998-11-17
+1998-11-18
+1998-11-19
+1998-11-20
+1998-11-21
+1998-11-22
+1998-11-23
+1998-11-24
+1998-11-25
+1998-11-26
+1998-11-27
+1998-11-28
+1998-11-29
+1998-11-30
+1998-12-01
+1998-12-02
+1998-12-03
+1998-12-04
+1998-12-05
+1998-12-06
+1998-12-07
+1998-12-08
+1998-12-09
+1998-12-10
+1998-12-11
+1998-12-12
+1998-12-13
+1998-12-14
+1998-12-15
+1998-12-16
+1998-12-17
+1998-12-18
+1998-12-19
+1998-12-20
+1998-12-21
+1998-12-22
+1998-12-23
+1998-12-24
+1998-12-25
+1998-12-26
+1998-12-27
+1998-12-28
+1998-12-29
+1998-12-30
+1998-12-31
+1999-01-01
+1999-01-02
+1999-01-03
+1999-01-04
+1999-01-05
+1999-01-06
+1999-01-07
+1999-01-08
+1999-01-09
+1999-01-10
+1999-01-11
+1999-01-12
+1999-01-13
+1999-01-14
+1999-01-15
+1999-01-16
+1999-01-17
+1999-01-18
+1999-01-19
+1999-01-20
+1999-01-21
+1999-01-22
+1999-01-23
+1999-01-24
+1999-01-25
+1999-01-26
+1999-01-27
+1999-01-28
+1999-01-29
+1999-01-30
+1999-01-31
+1999-02-01
+1999-02-02
+1999-02-03
+1999-02-04
+1999-02-05
+1999-02-06
+1999-02-07
+1999-02-08
+1999-02-09
+1999-02-10
+1999-02-11
+1999-02-12
+1999-02-13
+1999-02-14
+1999-02-15
+1999-02-16
+1999-02-17
+1999-02-18
+1999-02-19
+1999-02-20
+1999-02-21
+1999-02-22
+1999-02-23
+1999-02-24
+1999-02-25
+1999-02-26
+1999-02-27
+1999-02-28
+1999-03-01
+1999-03-02
+1999-03-03
+1999-03-04
+1999-03-05
+1999-03-06
+1999-03-07
+1999-03-08
+1999-03-09
+1999-03-10
+1999-03-11
+1999-03-12
+1999-03-13
+1999-03-14
+1999-03-15
+1999-03-16
+1999-03-17
+1999-03-18
+1999-03-19
+1999-03-20
+1999-03-21
+1999-03-22
+1999-03-23
+1999-03-24
+1999-03-25
+1999-03-26
+1999-03-27
+1999-03-28
+1999-03-29
+1999-03-30
+1999-03-31
+1999-04-01
+1999-04-02
+1999-04-03
+1999-04-04
+1999-04-05
+1999-04-06
+1999-04-07
+1999-04-08
+1999-04-09
+1999-04-10
+1999-04-11
+1999-04-12
+1999-04-13
+1999-04-14
+1999-04-15
+1999-04-16
+1999-04-17
+1999-04-18
+1999-04-19
+1999-04-20
+1999-04-21
+1999-04-22
+1999-04-23
+1999-04-24
+1999-04-25
+1999-04-26
+1999-04-27
+1999-04-28
+1999-04-29
+1999-04-30
+1999-05-01
+1999-05-02
+1999-05-03
+1999-05-04
+1999-05-05
+1999-05-06
+1999-05-07
+1999-05-08
+1999-05-09
+1999-05-10
+1999-05-11
+1999-05-12
+1999-05-13
+1999-05-14
+1999-05-15
+1999-05-16
+1999-05-17
+1999-05-18
+1999-05-19
+1999-05-20
+1999-05-21
+1999-05-22
+1999-05-23
+1999-05-24
+1999-05-25
+1999-05-26
+1999-05-27
+1999-05-28
+1999-05-29
+1999-05-30
+1999-05-31
+1999-06-01
+1999-06-02
+1999-06-03
+1999-06-04
+1999-06-05
+1999-06-06
+1999-06-07
+1999-06-08
+1999-06-09
+1999-06-10
+1999-06-11
+1999-06-12
+1999-06-13
+1999-06-14
+1999-06-15
+1999-06-16
+1999-06-17
+1999-06-18
+1999-06-19
+1999-06-20
+1999-06-21
+1999-06-22
+1999-06-23
+1999-06-24
+1999-06-25
+1999-06-26
+1999-06-27
+1999-06-28
+1999-06-29
+1999-06-30
+1999-07-01
+1999-07-02
+1999-07-03
+1999-07-04
+1999-07-05
+1999-07-06
+1999-07-07
+1999-07-08
+1999-07-09
+1999-07-10
+1999-07-11
+1999-07-12
+1999-07-13
+1999-07-14
+1999-07-15
+1999-07-16
+1999-07-17
+1999-07-18
+1999-07-19
+1999-07-20
+1999-07-21
+1999-07-22
+1999-07-23
+1999-07-24
+1999-07-25
+1999-07-26
+1999-07-27
+1999-07-28
+1999-07-29
+1999-07-30
+1999-07-31
+1999-08-01
+1999-08-02
+1999-08-03
+1999-08-04
+1999-08-05
+1999-08-06
+1999-08-07
+1999-08-08
+1999-08-09
+1999-08-10
+1999-08-11
+1999-08-12
+1999-08-13
+1999-08-14
+1999-08-15
+1999-08-16
+1999-08-17
+1999-08-18
+1999-08-19
+1999-08-20
+1999-08-21
+1999-08-22
+1999-08-23
+1999-08-24
+1999-08-25
+1999-08-26
+1999-08-27
+1999-08-28
+1999-08-29
+1999-08-30
+1999-08-31
+1999-09-01
+1999-09-02
+1999-09-03
+1999-09-04
+1999-09-05
+1999-09-06
+1999-09-07
+1999-09-08
+1999-09-09
+1999-09-10
+1999-09-11
+1999-09-12
+1999-09-13
+1999-09-14
+1999-09-15
+1999-09-16
+1999-09-17
+1999-09-18
+1999-09-19
+1999-09-20
+1999-09-21
+1999-09-22
+1999-09-23
+1999-09-24
+1999-09-25
+1999-09-26
+1999-09-27
+1999-09-28
+1999-09-29
+1999-09-30
+1999-10-01
+1999-10-02
+1999-10-03
+1999-10-04
+1999-10-05
+1999-10-06
+1999-10-07
+1999-10-08
+1999-10-09
+1999-10-10
+1999-10-11
+1999-10-12
+1999-10-13
+1999-10-14
+1999-10-15
+1999-10-16
+1999-10-17
+1999-10-18
+1999-10-19
+1999-10-20
+1999-10-21
+1999-10-22
+1999-10-23
+1999-10-24
+1999-10-25
+1999-10-26
+1999-10-27
+1999-10-28
+1999-10-29
+1999-10-30
+1999-10-31
+1999-11-01
+1999-11-02
+1999-11-03
+1999-11-04
+1999-11-05
+1999-11-06
+1999-11-07
+1999-11-08
+1999-11-09
+1999-11-10
+1999-11-11
+1999-11-12
+1999-11-13
+1999-11-14
+1999-11-15
+1999-11-16
+1999-11-17
+1999-11-18
+1999-11-19
+1999-11-20
+1999-11-21
+1999-11-22
+1999-11-23
+1999-11-24
+1999-11-25
+1999-11-26
+1999-11-27
+1999-11-28
+1999-11-29
+1999-11-30
+1999-12-01
+1999-12-02
+1999-12-03
+1999-12-04
+1999-12-05
+1999-12-06
+1999-12-07
+1999-12-08
+1999-12-09
+1999-12-10
+1999-12-11
+1999-12-12
+1999-12-13
+1999-12-14
+1999-12-15
+1999-12-16
+1999-12-17
+1999-12-18
+1999-12-19
+1999-12-20
+1999-12-21
+1999-12-22
+1999-12-23
+1999-12-24
+1999-12-25
+1999-12-26
+1999-12-27
+1999-12-28
+1999-12-29
+1999-12-30
+1999-12-31
+2000-01-01
+2000-01-02
+2000-01-03
+2000-01-04
+2000-01-05
+2000-01-06
+2000-01-07
+2000-01-08
+2000-01-09
+2000-01-10
+2000-01-11
+2000-01-12
+2000-01-13
+2000-01-14
+2000-01-15
+2000-01-16
+2000-01-17
+2000-01-18
+2000-01-19
+2000-01-20
+2000-01-21
+2000-01-22
+2000-01-23
+2000-01-24
+2000-01-25
+2000-01-26
+2000-01-27
+2000-01-28
+2000-01-29
+2000-01-30
+2000-01-31
+2000-02-01
+2000-02-02
+2000-02-03
+2000-02-04
+2000-02-05
+2000-02-06
+2000-02-07
+2000-02-08
+2000-02-09
+2000-02-10
+2000-02-11
+2000-02-12
+2000-02-13
+2000-02-14
+2000-02-15
+2000-02-16
+2000-02-17
+2000-02-18
+2000-02-19
+2000-02-20
+2000-02-21
+2000-02-22
+2000-02-23
+2000-02-24
+2000-02-25
+2000-02-26
+2000-02-27
+2000-02-28
+2000-02-29
+2000-03-01
+2000-03-02
+2000-03-03
+2000-03-04
+2000-03-05
+2000-03-06
+2000-03-07
+2000-03-08
+2000-03-09
+2000-03-10
+2000-03-11
+2000-03-12
+2000-03-13
+2000-03-14
+2000-03-15
+2000-03-16
+2000-03-17
+2000-03-18
+2000-03-19
+2000-03-20
+2000-03-21
+2000-03-22
+2000-03-23
+2000-03-24
+2000-03-25
+2000-03-26
+2000-03-27
+2000-03-28
+2000-03-29
+2000-03-30
+2000-03-31
+2000-04-01
+2000-04-02
+2000-04-03
+2000-04-04
+2000-04-05
+2000-04-06
+2000-04-07
+2000-04-08
+2000-04-09
+2000-04-10
+2000-04-11
+2000-04-12
+2000-04-13
+2000-04-14
+2000-04-15
+2000-04-16
+2000-04-17
+2000-04-18
+2000-04-19
+2000-04-20
+2000-04-21
+2000-04-22
+2000-04-23
+2000-04-24
+2000-04-25
+2000-04-26
+2000-04-27
+2000-04-28
+2000-04-29
+2000-04-30
+2000-05-01
+2000-05-02
+2000-05-03
+2000-05-04
+2000-05-05
+2000-05-06
+2000-05-07
+2000-05-08
+2000-05-09
+2000-05-10
+2000-05-11
+2000-05-12
+2000-05-13
+2000-05-14
+2000-05-15
+2000-05-16
+2000-05-17
+2000-05-18
+2000-05-19
+2000-05-20
+2000-05-21
+2000-05-22
+2000-05-23
+2000-05-24
+2000-05-25
+2000-05-26
+2000-05-27
+2000-05-28
+2000-05-29
+2000-05-30
+2000-05-31
+2000-06-01
+2000-06-02
+2000-06-03
+2000-06-04
+2000-06-05
+2000-06-06
+2000-06-07
+2000-06-08
+2000-06-09
+2000-06-10
+2000-06-11
+2000-06-12
+2000-06-13
+2000-06-14
+2000-06-15
+2000-06-16
+2000-06-17
+2000-06-18
+2000-06-19
+2000-06-20
+2000-06-21
+2000-06-22
+2000-06-23
+2000-06-24
+2000-06-25
+2000-06-26
+2000-06-27
+2000-06-28
+2000-06-29
+2000-06-30
+2000-07-01
+2000-07-02
+2000-07-03
+2000-07-04
+2000-07-05
+2000-07-06
+2000-07-07
+2000-07-08
+2000-07-09
+2000-07-10
+2000-07-11
+2000-07-12
+2000-07-13
+2000-07-14
+2000-07-15
+2000-07-16
+2000-07-17
+2000-07-18
+2000-07-19
+2000-07-20
+2000-07-21
+2000-07-22
+2000-07-23
+2000-07-24
+2000-07-25
+2000-07-26
+2000-07-27
+2000-07-28
+2000-07-29
+2000-07-30
+2000-07-31
+2000-08-01
+2000-08-02
+2000-08-03
+2000-08-04
+2000-08-05
+2000-08-06
+2000-08-07
+2000-08-08
+2000-08-09
+2000-08-10
+2000-08-11
+2000-08-12
+2000-08-13
+2000-08-14
+2000-08-15
+2000-08-16
+2000-08-17
+2000-08-18
+2000-08-19
+2000-08-20
+2000-08-21
+2000-08-22
+2000-08-23
+2000-08-24
+2000-08-25
+2000-08-26
+2000-08-27
+2000-08-28
+2000-08-29
+2000-08-30
+2000-08-31
+2000-09-01
+2000-09-02
+2000-09-03
+2000-09-04
+2000-09-05
+2000-09-06
+2000-09-07
+2000-09-08
+2000-09-09
+2000-09-10
+2000-09-11
+2000-09-12
+2000-09-13
+2000-09-14
+2000-09-15
+2000-09-16
+2000-09-17
+2000-09-18
+2000-09-19
+2000-09-20
+2000-09-21
+2000-09-22
+2000-09-23
+2000-09-24
+2000-09-25
+2000-09-26
+2000-09-27
+2000-09-28
+2000-09-29
+2000-09-30
+2000-10-01
+2000-10-02
+2000-10-03
+2000-10-04
+2000-10-05
+2000-10-06
+2000-10-07
+2000-10-08
+2000-10-09
+2000-10-10
+2000-10-11
+2000-10-12
+2000-10-13
+2000-10-14
+2000-10-15
+2000-10-16
+2000-10-17
+2000-10-18
+2000-10-19
+2000-10-20
+2000-10-21
+2000-10-22
+2000-10-23
+2000-10-24
+2000-10-25
+2000-10-26
+2000-10-27
+2000-10-28
+2000-10-29
+2000-10-30
+2000-10-31
+2000-11-01
+2000-11-02
+2000-11-03
+2000-11-04
+2000-11-05
+2000-11-06
+2000-11-07
+2000-11-08
+2000-11-09
+2000-11-10
+2000-11-11
+2000-11-12
+2000-11-13
+2000-11-14
+2000-11-15
+2000-11-16
+2000-11-17
+2000-11-18
+2000-11-19
+2000-11-20
+2000-11-21
+2000-11-22
+2000-11-23
+2000-11-24
+2000-11-25
+2000-11-26
+2000-11-27
+2000-11-28
+2000-11-29
+2000-11-30
+2000-12-01
+2000-12-02
+2000-12-03
+2000-12-04
+2000-12-05
+2000-12-06
+2000-12-07
+2000-12-08
+2000-12-09
+2000-12-10
+2000-12-11
+2000-12-12
+2000-12-13
+2000-12-14
+2000-12-15
+2000-12-16
+2000-12-17
+2000-12-18
+2000-12-19
+2000-12-20
+2000-12-21
+2000-12-22
+2000-12-23
+2000-12-24
+2000-12-25
+2000-12-26
+2000-12-27
+2000-12-28
+2000-12-29
+2000-12-30
+2000-12-31
+2001-01-01
+2001-01-02
+2001-01-03
+2001-01-04
+2001-01-05
+2001-01-06
+2001-01-07
+2001-01-08
+2001-01-09
+2001-01-10
+2001-01-11
+2001-01-12
+2001-01-13
+2001-01-14
+2001-01-15
+2001-01-16
+2001-01-17
+2001-01-18
+2001-01-19
+2001-01-20
+2001-01-21
+2001-01-22
+2001-01-23
+2001-01-24
+2001-01-25
+2001-01-26
+2001-01-27
+2001-01-28
+2001-01-29
+2001-01-30
+2001-01-31
+2001-02-01
+2001-02-02
+2001-02-03
+2001-02-04
+2001-02-05
+2001-02-06
+2001-02-07
+2001-02-08
+2001-02-09
+2001-02-10
+2001-02-11
+2001-02-12
+2001-02-13
+2001-02-14
+2001-02-15
+2001-02-16
+2001-02-17
+2001-02-18
+2001-02-19
+2001-02-20
+2001-02-21
+2001-02-22
+2001-02-23
+2001-02-24
+2001-02-25
+2001-02-26
+2001-02-27
+2001-02-28
+2001-03-01
+2001-03-02
+2001-03-03
+2001-03-04
+2001-03-05
+2001-03-06
+2001-03-07
+2001-03-08
+2001-03-09
+2001-03-10
+2001-03-11
+2001-03-12
+2001-03-13
+2001-03-14
+2001-03-15
+2001-03-16
+2001-03-17
+2001-03-18
+2001-03-19
+2001-03-20
+2001-03-21
+2001-03-22
+2001-03-23
+2001-03-24
+2001-03-25
+2001-03-26
+2001-03-27
+2001-03-28
+2001-03-29
+2001-03-30
+2001-03-31
+2001-04-01
+2001-04-02
+2001-04-03
+2001-04-04
+2001-04-05
+2001-04-06
+2001-04-07
+2001-04-08
+2001-04-09
+2001-04-10
+2001-04-11
+2001-04-12
+2001-04-13
+2001-04-14
+2001-04-15
+2001-04-16
+2001-04-17
+2001-04-18
+2001-04-19
+2001-04-20
+2001-04-21
+2001-04-22
+2001-04-23
+2001-04-24
+2001-04-25
+2001-04-26
+2001-04-27
+2001-04-28
+2001-04-29
+2001-04-30
+2001-05-01
+2001-05-02
+2001-05-03
+2001-05-04
+2001-05-05
+2001-05-06
+2001-05-07
+2001-05-08
+2001-05-09
+2001-05-10
+2001-05-11
+2001-05-12
+2001-05-13
+2001-05-14
+2001-05-15
+2001-05-16
+2001-05-17
+2001-05-18
+2001-05-19
+2001-05-20
+2001-05-21
+2001-05-22
+2001-05-23
+2001-05-24
+2001-05-25
+2001-05-26
+2001-05-27
+2001-05-28
+2001-05-29
+2001-05-30
+2001-05-31
+2001-06-01
+2001-06-02
+2001-06-03
+2001-06-04
+2001-06-05
+2001-06-06
+2001-06-07
+2001-06-08
+2001-06-09
+2001-06-10
+2001-06-11
+2001-06-12
+2001-06-13
+2001-06-14
+2001-06-15
+2001-06-16
+2001-06-17
+2001-06-18
+2001-06-19
+2001-06-20
+2001-06-21
+2001-06-22
+2001-06-23
+2001-06-24
+2001-06-25
+2001-06-26
+2001-06-27
+2001-06-28
+2001-06-29
+2001-06-30
+2001-07-01
+2001-07-02
+2001-07-03
+2001-07-04
+2001-07-05
+2001-07-06
+2001-07-07
+2001-07-08
+2001-07-09
+2001-07-10
+2001-07-11
+2001-07-12
+2001-07-13
+2001-07-14
+2001-07-15
+2001-07-16
+2001-07-17
+2001-07-18
+2001-07-19
+2001-07-20
+2001-07-21
+2001-07-22
+2001-07-23
+2001-07-24
+2001-07-25
+2001-07-26
+2001-07-27
+2001-07-28
+2001-07-29
+2001-07-30
+2001-07-31
+2001-08-01
+2001-08-02
+2001-08-03
+2001-08-04
+2001-08-05
+2001-08-06
+2001-08-07
+2001-08-08
+2001-08-09
+2001-08-10
+2001-08-11
+2001-08-12
+2001-08-13
+2001-08-14
+2001-08-15
+2001-08-16
+2001-08-17
+2001-08-18
+2001-08-19
+2001-08-20
+2001-08-21
+2001-08-22
+2001-08-23
+2001-08-24
+2001-08-25
+2001-08-26
+2001-08-27
+2001-08-28
+2001-08-29
+2001-08-30
+2001-08-31
+2001-09-01
+2001-09-02
+2001-09-03
+2001-09-04
+2001-09-05
+2001-09-06
+2001-09-07
+2001-09-08
+2001-09-09
+2001-09-10
+2001-09-11
+2001-09-12
+2001-09-13
+2001-09-14
+2001-09-15
+2001-09-16
+2001-09-17
+2001-09-18
+2001-09-19
+2001-09-20
+2001-09-21
+2001-09-22
+2001-09-23
+2001-09-24
+2001-09-25
+2001-09-26
+2001-09-27
+2001-09-28
+2001-09-29
+2001-09-30
+2001-10-01
+2001-10-02
+2001-10-03
+2001-10-04
+2001-10-05
+2001-10-06
+2001-10-07
+2001-10-08
+2001-10-09
+2001-10-10
+2001-10-11
+2001-10-12
+2001-10-13
+2001-10-14
+2001-10-15
+2001-10-16
+2001-10-17
+2001-10-18
+2001-10-19
+2001-10-20
+2001-10-21
+2001-10-22
+2001-10-23
+2001-10-24
+2001-10-25
+2001-10-26
+2001-10-27
+2001-10-28
+2001-10-29
+2001-10-30
+2001-10-31
+2001-11-01
+2001-11-02
+2001-11-03
+2001-11-04
+2001-11-05
+2001-11-06
+2001-11-07
+2001-11-08
+2001-11-09
+2001-11-10
+2001-11-11
+2001-11-12
+2001-11-13
+2001-11-14
+2001-11-15
+2001-11-16
+2001-11-17
+2001-11-18
+2001-11-19
+2001-11-20
+2001-11-21
+2001-11-22
+2001-11-23
+2001-11-24
+2001-11-25
+2001-11-26
+2001-11-27
+2001-11-28
+2001-11-29
+2001-11-30
+2001-12-01
+2001-12-02
+2001-12-03
+2001-12-04
+2001-12-05
+2001-12-06
+2001-12-07
+2001-12-08
+2001-12-09
+2001-12-10
+2001-12-11
+2001-12-12
+2001-12-13
+2001-12-14
+2001-12-15
+2001-12-16
+2001-12-17
+2001-12-18
+2001-12-19
+2001-12-20
+2001-12-21
+2001-12-22
+2001-12-23
+2001-12-24
+2001-12-25
+2001-12-26
+2001-12-27
+2001-12-28
+2001-12-29
+2001-12-30
+2001-12-31
+2002-01-01
+2002-01-02
+2002-01-03
+2002-01-04
+2002-01-05
+2002-01-06
+2002-01-07
+2002-01-08
+2002-01-09
+2002-01-10
+2002-01-11
+2002-01-12
+2002-01-13
+2002-01-14
+2002-01-15
+2002-01-16
+2002-01-17
+2002-01-18
+2002-01-19
+2002-01-20
+2002-01-21
+2002-01-22
+2002-01-23
+2002-01-24
+2002-01-25
+2002-01-26
+2002-01-27
+2002-01-28
+2002-01-29
+2002-01-30
+2002-01-31
+2002-02-01
+2002-02-02
+2002-02-03
+2002-02-04
+2002-02-05
+2002-02-06
+2002-02-07
+2002-02-08
+2002-02-09
+2002-02-10
+2002-02-11
+2002-02-12
+2002-02-13
+2002-02-14
+2002-02-15
+2002-02-16
+2002-02-17
+2002-02-18
+2002-02-19
+2002-02-20
+2002-02-21
+2002-02-22
+2002-02-23
+2002-02-24
+2002-02-25
+2002-02-26
+2002-02-27
+2002-02-28
+2002-03-01
+2002-03-02
+2002-03-03
+2002-03-04
+2002-03-05
+2002-03-06
+2002-03-07
+2002-03-08
+2002-03-09
+2002-03-10
+2002-03-11
+2002-03-12
+2002-03-13
+2002-03-14
+2002-03-15
+2002-03-16
+2002-03-17
+2002-03-18
+2002-03-19
+2002-03-20
+2002-03-21
+2002-03-22
+2002-03-23
+2002-03-24
+2002-03-25
+2002-03-26
+2002-03-27
+2002-03-28
+2002-03-29
+2002-03-30
+2002-03-31
+2002-04-01
+2002-04-02
+2002-04-03
+2002-04-04
+2002-04-05
+2002-04-06
+2002-04-07
+2002-04-08
+2002-04-09
+2002-04-10
+2002-04-11
+2002-04-12
+2002-04-13
+2002-04-14
+2002-04-15
+2002-04-16
+2002-04-17
+2002-04-18
+2002-04-19
+2002-04-20
+2002-04-21
+2002-04-22
+2002-04-23
+2002-04-24
+2002-04-25
+2002-04-26
+2002-04-27
+2002-04-28
+2002-04-29
+2002-04-30
+2002-05-01
+2002-05-02
+2002-05-03
+2002-05-04
+2002-05-05
+2002-05-06
+2002-05-07
+2002-05-08
+2002-05-09
+2002-05-10
+2002-05-11
+2002-05-12
+2002-05-13
+2002-05-14
+2002-05-15
+2002-05-16
+2002-05-17
+2002-05-18
+2002-05-19
+2002-05-20
+2002-05-21
+2002-05-22
+2002-05-23
+2002-05-24
+2002-05-25
+2002-05-26
+2002-05-27
+2002-05-28
+2002-05-29
+2002-05-30
+2002-05-31
+2002-06-01
+2002-06-02
+2002-06-03
+2002-06-04
+2002-06-05
+2002-06-06
+2002-06-07
+2002-06-08
+2002-06-09
+2002-06-10
+2002-06-11
+2002-06-12
+2002-06-13
+2002-06-14
+2002-06-15
+2002-06-16
+2002-06-17
+2002-06-18
+2002-06-19
+2002-06-20
+2002-06-21
+2002-06-22
+2002-06-23
+2002-06-24
+2002-06-25
+2002-06-26
+2002-06-27
+2002-06-28
+2002-06-29
+2002-06-30
+2002-07-01
+2002-07-02
+2002-07-03
+2002-07-04
+2002-07-05
+2002-07-06
+2002-07-07
+2002-07-08
+2002-07-09
+2002-07-10
+2002-07-11
+2002-07-12
+2002-07-13
+2002-07-14
+2002-07-15
+2002-07-16
+2002-07-17
+2002-07-18
+2002-07-19
+2002-07-20
+2002-07-21
+2002-07-22
+2002-07-23
+2002-07-24
+2002-07-25
+2002-07-26
+2002-07-27
+2002-07-28
+2002-07-29
+2002-07-30
+2002-07-31
+2002-08-01
+2002-08-02
+2002-08-03
+2002-08-04
+2002-08-05
+2002-08-06
+2002-08-07
+2002-08-08
+2002-08-09
+2002-08-10
+2002-08-11
+2002-08-12
+2002-08-13
+2002-08-14
+2002-08-15
+2002-08-16
+2002-08-17
+2002-08-18
+2002-08-19
+2002-08-20
+2002-08-21
+2002-08-22
+2002-08-23
+2002-08-24
+2002-08-25
+2002-08-26
+2002-08-27
+2002-08-28
+2002-08-29
+2002-08-30
+2002-08-31
+2002-09-01
+2002-09-02
+2002-09-03
+2002-09-04
+2002-09-05
+2002-09-06
+2002-09-07
+2002-09-08
+2002-09-09
+2002-09-10
+2002-09-11
+2002-09-12
+2002-09-13
+2002-09-14
+2002-09-15
+2002-09-16
+2002-09-17
+2002-09-18
+2002-09-19
+2002-09-20
+2002-09-21
+2002-09-22
+2002-09-23
+2002-09-24
+2002-09-25
+2002-09-26
+2002-09-27
+2002-09-28
+2002-09-29
+2002-09-30
+2002-10-01
+2002-10-02
+2002-10-03
+2002-10-04
+2002-10-05
+2002-10-06
+2002-10-07
+2002-10-08
+2002-10-09
+2002-10-10
+2002-10-11
+2002-10-12
+2002-10-13
+2002-10-14
+2002-10-15
+2002-10-16
+2002-10-17
+2002-10-18
+2002-10-19
+2002-10-20
+2002-10-21
+2002-10-22
+2002-10-23
+2002-10-24
+2002-10-25
+2002-10-26
+2002-10-27
+2002-10-28
+2002-10-29
+2002-10-30
+2002-10-31
+2002-11-01
+2002-11-02
+2002-11-03
+2002-11-04
+2002-11-05
+2002-11-06
+2002-11-07
+2002-11-08
+2002-11-09
+2002-11-10
+2002-11-11
+2002-11-12
+2002-11-13
+2002-11-14
+2002-11-15
+2002-11-16
+2002-11-17
+2002-11-18
+2002-11-19
+2002-11-20
+2002-11-21
+2002-11-22
+2002-11-23
+2002-11-24
+2002-11-25
+2002-11-26
+2002-11-27
+2002-11-28
+2002-11-29
+2002-11-30
+2002-12-01
+2002-12-02
+2002-12-03
+2002-12-04
+2002-12-05
+2002-12-06
+2002-12-07
+2002-12-08
+2002-12-09
+2002-12-10
+2002-12-11
+2002-12-12
+2002-12-13
+2002-12-14
+2002-12-15
+2002-12-16
+2002-12-17
+2002-12-18
+2002-12-19
+2002-12-20
+2002-12-21
+2002-12-22
+2002-12-23
+2002-12-24
+2002-12-25
+2002-12-26
+2002-12-27
+2002-12-28
+2002-12-29
+2002-12-30
+2002-12-31
+2003-01-01
+2003-01-02
+2003-01-03
+2003-01-04
+2003-01-05
+2003-01-06
+2003-01-07
+2003-01-08
+2003-01-09
+2003-01-10
+2003-01-11
+2003-01-12
+2003-01-13
+2003-01-14
+2003-01-15
+2003-01-16
+2003-01-17
+2003-01-18
+2003-01-19
+2003-01-20
+2003-01-21
+2003-01-22
+2003-01-23
+2003-01-24
+2003-01-25
+2003-01-26
+2003-01-27
+2003-01-28
+2003-01-29
+2003-01-30
+2003-01-31
+2003-02-01
+2003-02-02
+2003-02-03
+2003-02-04
+2003-02-05
+2003-02-06
+2003-02-07
+2003-02-08
+2003-02-09
+2003-02-10
+2003-02-11
+2003-02-12
+2003-02-13
+2003-02-14
+2003-02-15
+2003-02-16
+2003-02-17
+2003-02-18
+2003-02-19
+2003-02-20
+2003-02-21
+2003-02-22
+2003-02-23
+2003-02-24
+2003-02-25
+2003-02-26
+2003-02-27
+2003-02-28
+2003-03-01
+2003-03-02
+2003-03-03
+2003-03-04
+2003-03-05
+2003-03-06
+2003-03-07
+2003-03-08
+2003-03-09
+2003-03-10
+2003-03-11
+2003-03-12
+2003-03-13
+2003-03-14
+2003-03-15
+2003-03-16
+2003-03-17
+2003-03-18
+2003-03-19
+2003-03-20
+2003-03-21
+2003-03-22
+2003-03-23
+2003-03-24
+2003-03-25
+2003-03-26
+2003-03-27
+2003-03-28
+2003-03-29
+2003-03-30
+2003-03-31
+2003-04-01
+2003-04-02
+2003-04-03
+2003-04-04
+2003-04-05
+2003-04-06
+2003-04-07
+2003-04-08
+2003-04-09
+2003-04-10
+2003-04-11
+2003-04-12
+2003-04-13
+2003-04-14
+2003-04-15
+2003-04-16
+2003-04-17
+2003-04-18
+2003-04-19
+2003-04-20
+2003-04-21
+2003-04-22
+2003-04-23
+2003-04-24
+2003-04-25
+2003-04-26
+2003-04-27
+2003-04-28
+2003-04-29
+2003-04-30
+2003-05-01
+2003-05-02
+2003-05-03
+2003-05-04
+2003-05-05
+2003-05-06
+2003-05-07
+2003-05-08
+2003-05-09
+2003-05-10
+2003-05-11
+2003-05-12
+2003-05-13
+2003-05-14
+2003-05-15
+2003-05-16
+2003-05-17
+2003-05-18
+2003-05-19
+2003-05-20
+2003-05-21
+2003-05-22
+2003-05-23
+2003-05-24
+2003-05-25
+2003-05-26
+2003-05-27
+2003-05-28
+2003-05-29
+2003-05-30
+2003-05-31
+2003-06-01
+2003-06-02
+2003-06-03
+2003-06-04
+2003-06-05
+2003-06-06
+2003-06-07
+2003-06-08
+2003-06-09
+2003-06-10
+2003-06-11
+2003-06-12
+2003-06-13
+2003-06-14
+2003-06-15
+2003-06-16
+2003-06-17
+2003-06-18
+2003-06-19
+2003-06-20
+2003-06-21
+2003-06-22
+2003-06-23
+2003-06-24
+2003-06-25
+2003-06-26
+2003-06-27
+2003-06-28
+2003-06-29
+2003-06-30
+2003-07-01
+2003-07-02
+2003-07-03
+2003-07-04
+2003-07-05
+2003-07-06
+2003-07-07
+2003-07-08
+2003-07-09
+2003-07-10
+2003-07-11
+2003-07-12
+2003-07-13
+2003-07-14
+2003-07-15
+2003-07-16
+2003-07-17
+2003-07-18
+2003-07-19
+2003-07-20
+2003-07-21
+2003-07-22
+2003-07-23
+2003-07-24
+2003-07-25
+2003-07-26
+2003-07-27
+2003-07-28
+2003-07-29
+2003-07-30
+2003-07-31
+2003-08-01
+2003-08-02
+2003-08-03
+2003-08-04
+2003-08-05
+2003-08-06
+2003-08-07
+2003-08-08
+2003-08-09
+2003-08-10
+2003-08-11
+2003-08-12
+2003-08-13
+2003-08-14
+2003-08-15
+2003-08-16
+2003-08-17
+2003-08-18
+2003-08-19
+2003-08-20
+2003-08-21
+2003-08-22
+2003-08-23
+2003-08-24
+2003-08-25
+2003-08-26
+2003-08-27
+2003-08-28
+2003-08-29
+2003-08-30
+2003-08-31
+2003-09-01
+2003-09-02
+2003-09-03
+2003-09-04
+2003-09-05
+2003-09-06
+2003-09-07
+2003-09-08
+2003-09-09
+2003-09-10
+2003-09-11
+2003-09-12
+2003-09-13
+2003-09-14
+2003-09-15
+2003-09-16
+2003-09-17
+2003-09-18
+2003-09-19
+2003-09-20
+2003-09-21
+2003-09-22
+2003-09-23
+2003-09-24
+2003-09-25
+2003-09-26
+2003-09-27
+2003-09-28
+2003-09-29
+2003-09-30
+2003-10-01
+2003-10-02
+2003-10-03
+2003-10-04
+2003-10-05
+2003-10-06
+2003-10-07
+2003-10-08
+2003-10-09
+2003-10-10
+2003-10-11
+2003-10-12
+2003-10-13
+2003-10-14
+2003-10-15
+2003-10-16
+2003-10-17
+2003-10-18
+2003-10-19
+2003-10-20
+2003-10-21
+2003-10-22
+2003-10-23
+2003-10-24
+2003-10-25
+2003-10-26
+2003-10-27
+2003-10-28
+2003-10-29
+2003-10-30
+2003-10-31
+2003-11-01
+2003-11-02
+2003-11-03
+2003-11-04
+2003-11-05
+2003-11-06
+2003-11-07
+2003-11-08
+2003-11-09
+2003-11-10
+2003-11-11
+2003-11-12
+2003-11-13
+2003-11-14
+2003-11-15
+2003-11-16
+2003-11-17
+2003-11-18
+2003-11-19
+2003-11-20
+2003-11-21
+2003-11-22
+2003-11-23
+2003-11-24
+2003-11-25
+2003-11-26
+2003-11-27
+2003-11-28
+2003-11-29
+2003-11-30
+2003-12-01
+2003-12-02
+2003-12-03
+2003-12-04
+2003-12-05
+2003-12-06
+2003-12-07
+2003-12-08
+2003-12-09
+2003-12-10
+2003-12-11
+2003-12-12
+2003-12-13
+2003-12-14
+2003-12-15
+2003-12-16
+2003-12-17
+2003-12-18
+2003-12-19
+2003-12-20
+2003-12-21
+2003-12-22
+2003-12-23
+2003-12-24
+2003-12-25
+2003-12-26
+2003-12-27
+2003-12-28
+2003-12-29
+2003-12-30
+2003-12-31
+2004-01-01
+2004-01-02
+2004-01-03
+2004-01-04
+2004-01-05
+2004-01-06
+2004-01-07
+2004-01-08
+2004-01-09
+2004-01-10
+2004-01-11
+2004-01-12
+2004-01-13
+2004-01-14
+2004-01-15
+2004-01-16
+2004-01-17
+2004-01-18
+2004-01-19
+2004-01-20
+2004-01-21
+2004-01-22
+2004-01-23
+2004-01-24
+2004-01-25
+2004-01-26
+2004-01-27
+2004-01-28
+2004-01-29
+2004-01-30
+2004-01-31
+2004-02-01
+2004-02-02
+2004-02-03
+2004-02-04
+2004-02-05
+2004-02-06
+2004-02-07
+2004-02-08
+2004-02-09
+2004-02-10
+2004-02-11
+2004-02-12
+2004-02-13
+2004-02-14
+2004-02-15
+2004-02-16
+2004-02-17
+2004-02-18
+2004-02-19
+2004-02-20
+2004-02-21
+2004-02-22
+2004-02-23
+2004-02-24
+2004-02-25
+2004-02-26
+2004-02-27
+2004-02-28
+2004-02-29
+2004-03-01
+2004-03-02
+2004-03-03
+2004-03-04
+2004-03-05
+2004-03-06
+2004-03-07
+2004-03-08
+2004-03-09
+2004-03-10
+2004-03-11
+2004-03-12
+2004-03-13
+2004-03-14
+2004-03-15
+2004-03-16
+2004-03-17
+2004-03-18
+2004-03-19
+2004-03-20
+2004-03-21
+2004-03-22
+2004-03-23
+2004-03-24
+2004-03-25
+2004-03-26
+2004-03-27
+2004-03-28
+2004-03-29
+2004-03-30
+2004-03-31
+2004-04-01
+2004-04-02
+2004-04-03
+2004-04-04
+2004-04-05
+2004-04-06
+2004-04-07
+2004-04-08
+2004-04-09
+2004-04-10
+2004-04-11
+2004-04-12
+2004-04-13
+2004-04-14
+2004-04-15
+2004-04-16
+2004-04-17
+2004-04-18
+2004-04-19
+2004-04-20
+2004-04-21
+2004-04-22
+2004-04-23
+2004-04-24
+2004-04-25
+2004-04-26
+2004-04-27
+2004-04-28
+2004-04-29
+2004-04-30
+2004-05-01
+2004-05-02
+2004-05-03
+2004-05-04
+2004-05-05
+2004-05-06
+2004-05-07
+2004-05-08
+2004-05-09
+2004-05-10
+2004-05-11
+2004-05-12
+2004-05-13
+2004-05-14
+2004-05-15
+2004-05-16
+2004-05-17
+2004-05-18
+2004-05-19
+2004-05-20
+2004-05-21
+2004-05-22
+2004-05-23
+2004-05-24
+2004-05-25
+2004-05-26
+2004-05-27
+2004-05-28
+2004-05-29
+2004-05-30
+2004-05-31
+2004-06-01
+2004-06-02
+2004-06-03
+2004-06-04
+2004-06-05
+2004-06-06
+2004-06-07
+2004-06-08
+2004-06-09
+2004-06-10
+2004-06-11
+2004-06-12
+2004-06-13
+2004-06-14
+2004-06-15
+2004-06-16
+2004-06-17
+2004-06-18
+2004-06-19
+2004-06-20
+2004-06-21
+2004-06-22
+2004-06-23
+2004-06-24
+2004-06-25
+2004-06-26
+2004-06-27
+2004-06-28
+2004-06-29
+2004-06-30
+2004-07-01
+2004-07-02
+2004-07-03
+2004-07-04
+2004-07-05
+2004-07-06
+2004-07-07
+2004-07-08
+2004-07-09
+2004-07-10
+2004-07-11
+2004-07-12
+2004-07-13
+2004-07-14
+2004-07-15
+2004-07-16
+2004-07-17
+2004-07-18
+2004-07-19
+2004-07-20
+2004-07-21
+2004-07-22
+2004-07-23
+2004-07-24
+2004-07-25
+2004-07-26
+2004-07-27
+2004-07-28
+2004-07-29
+2004-07-30
+2004-07-31
+2004-08-01
+2004-08-02
+2004-08-03
+2004-08-04
+2004-08-05
+2004-08-06
+2004-08-07
+2004-08-08
+2004-08-09
+2004-08-10
+2004-08-11
+2004-08-12
+2004-08-13
+2004-08-14
+2004-08-15
+2004-08-16
+2004-08-17
+2004-08-18
+2004-08-19
+2004-08-20
+2004-08-21
+2004-08-22
+2004-08-23
+2004-08-24
+2004-08-25
+2004-08-26
+2004-08-27
+2004-08-28
+2004-08-29
+2004-08-30
+2004-08-31
+2004-09-01
+2004-09-02
+2004-09-03
+2004-09-04
+2004-09-05
+2004-09-06
+2004-09-07
+2004-09-08
+2004-09-09
+2004-09-10
+2004-09-11
+2004-09-12
+2004-09-13
+2004-09-14
+2004-09-15
+2004-09-16
+2004-09-17
+2004-09-18
+2004-09-19
+2004-09-20
+2004-09-21
+2004-09-22
+2004-09-23
+2004-09-24
+2004-09-25
+2004-09-26
+2004-09-27
+2004-09-28
+2004-09-29
+2004-09-30
+2004-10-01
+2004-10-02
+2004-10-03
+2004-10-04
+2004-10-05
+2004-10-06
+2004-10-07
+2004-10-08
+2004-10-09
+2004-10-10
+2004-10-11
+2004-10-12
+2004-10-13
+2004-10-14
+2004-10-15
+2004-10-16
+2004-10-17
+2004-10-18
+2004-10-19
+2004-10-20
+2004-10-21
+2004-10-22
+2004-10-23
+2004-10-24
+2004-10-25
+2004-10-26
+2004-10-27
+2004-10-28
+2004-10-29
+2004-10-30
+2004-10-31
+2004-11-01
+2004-11-02
+2004-11-03
+2004-11-04
+2004-11-05
+2004-11-06
+2004-11-07
+2004-11-08
+2004-11-09
+2004-11-10
+2004-11-11
+2004-11-12
+2004-11-13
+2004-11-14
+2004-11-15
+2004-11-16
+2004-11-17
+2004-11-18
+2004-11-19
+2004-11-20
+2004-11-21
+2004-11-22
+2004-11-23
+2004-11-24
+2004-11-25
+2004-11-26
+2004-11-27
+2004-11-28
+2004-11-29
+2004-11-30
+2004-12-01
+2004-12-02
+2004-12-03
+2004-12-04
+2004-12-05
+2004-12-06
+2004-12-07
+2004-12-08
+2004-12-09
+2004-12-10
+2004-12-11
+2004-12-12
+2004-12-13
+2004-12-14
+2004-12-15
+2004-12-16
+2004-12-17
+2004-12-18
+2004-12-19
+2004-12-20
+2004-12-21
+2004-12-22
+2004-12-23
+2004-12-24
+2004-12-25
+2004-12-26
+2004-12-27
+2004-12-28
+2004-12-29
+2004-12-30
+2004-12-31
+2005-01-01
+2005-01-02
+2005-01-03
+2005-01-04
+2005-01-05
+2005-01-06
+2005-01-07
+2005-01-08
+2005-01-09
+2005-01-10
+2005-01-11
+2005-01-12
+2005-01-13
+2005-01-14
+2005-01-15
+2005-01-16
+2005-01-17
+2005-01-18
+2005-01-19
+2005-01-20
+2005-01-21
+2005-01-22
+2005-01-23
+2005-01-24
+2005-01-25
+2005-01-26
+2005-01-27
+2005-01-28
+2005-01-29
+2005-01-30
+2005-01-31
+2005-02-01
+2005-02-02
+2005-02-03
+2005-02-04
+2005-02-05
+2005-02-06
+2005-02-07
+2005-02-08
+2005-02-09
+2005-02-10
+2005-02-11
+2005-02-12
+2005-02-13
+2005-02-14
+2005-02-15
+2005-02-16
+2005-02-17
+2005-02-18
+2005-02-19
+2005-02-20
+2005-02-21
+2005-02-22
+2005-02-23
+2005-02-24
+2005-02-25
+2005-02-26
+2005-02-27
+2005-02-28
+2005-03-01
+2005-03-02
+2005-03-03
+2005-03-04
+2005-03-05
+2005-03-06
+2005-03-07
+2005-03-08
+2005-03-09
+2005-03-10
+2005-03-11
+2005-03-12
+2005-03-13
+2005-03-14
+2005-03-15
+2005-03-16
+2005-03-17
+2005-03-18
+2005-03-19
+2005-03-20
+2005-03-21
+2005-03-22
+2005-03-23
+2005-03-24
+2005-03-25
+2005-03-26
+2005-03-27
+2005-03-28
+2005-03-29
+2005-03-30
+2005-03-31
+2005-04-01
+2005-04-02
+2005-04-03
+2005-04-04
+2005-04-05
+2005-04-06
+2005-04-07
+2005-04-08
+2005-04-09
+2005-04-10
+2005-04-11
+2005-04-12
+2005-04-13
+2005-04-14
+2005-04-15
+2005-04-16
+2005-04-17
+2005-04-18
+2005-04-19
+2005-04-20
+2005-04-21
+2005-04-22
+2005-04-23
+2005-04-24
+2005-04-25
+2005-04-26
+2005-04-27
+2005-04-28
+2005-04-29
+2005-04-30
+2005-05-01
+2005-05-02
+2005-05-03
+2005-05-04
+2005-05-05
+2005-05-06
+2005-05-07
+2005-05-08
+2005-05-09
+2005-05-10
+2005-05-11
+2005-05-12
+2005-05-13
+2005-05-14
+2005-05-15
+2005-05-16
+2005-05-17
+2005-05-18
+2005-05-19
+2005-05-20
+2005-05-21
+2005-05-22
+2005-05-23
+2005-05-24
+2005-05-25
+2005-05-26
+2005-05-27
+2005-05-28
+2005-05-29
+2005-05-30
+2005-05-31
+2005-06-01
+2005-06-02
+2005-06-03
+2005-06-04
+2005-06-05
+2005-06-06
+2005-06-07
+2005-06-08
+2005-06-09
+2005-06-10
+2005-06-11
+2005-06-12
+2005-06-13
+2005-06-14
+2005-06-15
+2005-06-16
+2005-06-17
+2005-06-18
+2005-06-19
+2005-06-20
+2005-06-21
+2005-06-22
+2005-06-23
+2005-06-24
+2005-06-25
+2005-06-26
+2005-06-27
+2005-06-28
+2005-06-29
+2005-06-30
+2005-07-01
+2005-07-02
+2005-07-03
+2005-07-04
+2005-07-05
+2005-07-06
+2005-07-07
+2005-07-08
+2005-07-09
+2005-07-10
+2005-07-11
+2005-07-12
+2005-07-13
+2005-07-14
+2005-07-15
+2005-07-16
+2005-07-17
+2005-07-18
+2005-07-19
+2005-07-20
+2005-07-21
+2005-07-22
+2005-07-23
+2005-07-24
+2005-07-25
+2005-07-26
+2005-07-27
+2005-07-28
+2005-07-29
+2005-07-30
+2005-07-31
+2005-08-01
+2005-08-02
+2005-08-03
+2005-08-04
+2005-08-05
+2005-08-06
+2005-08-07
+2005-08-08
+2005-08-09
+2005-08-10
+2005-08-11
+2005-08-12
+2005-08-13
+2005-08-14
+2005-08-15
+2005-08-16
+2005-08-17
+2005-08-18
+2005-08-19
+2005-08-20
+2005-08-21
+2005-08-22
+2005-08-23
+2005-08-24
+2005-08-25
+2005-08-26
+2005-08-27
+2005-08-28
+2005-08-29
+2005-08-30
+2005-08-31
+2005-09-01
+2005-09-02
+2005-09-03
+2005-09-04
+2005-09-05
+2005-09-06
+2005-09-07
+2005-09-08
+2005-09-09
+2005-09-10
+2005-09-11
+2005-09-12
+2005-09-13
+2005-09-14
+2005-09-15
+2005-09-16
+2005-09-17
+2005-09-18
+2005-09-19
+2005-09-20
+2005-09-21
+2005-09-22
+2005-09-23
+2005-09-24
+2005-09-25
+2005-09-26
+2005-09-27
+2005-09-28
+2005-09-29
+2005-09-30
+2005-10-01
+2005-10-02
+2005-10-03
+2005-10-04
+2005-10-05
+2005-10-06
+2005-10-07
+2005-10-08
+2005-10-09
+2005-10-10
+2005-10-11
+2005-10-12
+2005-10-13
+2005-10-14
+2005-10-15
+2005-10-16
+2005-10-17
+2005-10-18
+2005-10-19
+2005-10-20
+2005-10-21
+2005-10-22
+2005-10-23
+2005-10-24
+2005-10-25
+2005-10-26
+2005-10-27
+2005-10-28
+2005-10-29
+2005-10-30
+2005-10-31
+2005-11-01
+2005-11-02
+2005-11-03
+2005-11-04
+2005-11-05
+2005-11-06
+2005-11-07
+2005-11-08
+2005-11-09
+2005-11-10
+2005-11-11
+2005-11-12
+2005-11-13
+2005-11-14
+2005-11-15
+2005-11-16
+2005-11-17
+2005-11-18
+2005-11-19
+2005-11-20
+2005-11-21
+2005-11-22
+2005-11-23
+2005-11-24
+2005-11-25
+2005-11-26
+2005-11-27
+2005-11-28
+2005-11-29
+2005-11-30
+2005-12-01
+2005-12-02
+2005-12-03
+2005-12-04
+2005-12-05
+2005-12-06
+2005-12-07
+2005-12-08
+2005-12-09
+2005-12-10
+2005-12-11
+2005-12-12
+2005-12-13
+2005-12-14
+2005-12-15
+2005-12-16
+2005-12-17
+2005-12-18
+2005-12-19
+2005-12-20
+2005-12-21
+2005-12-22
+2005-12-23
+2005-12-24
+2005-12-25
+2005-12-26
+2005-12-27
+2005-12-28
+2005-12-29
+2005-12-30
+2005-12-31
+2006-01-01
+2006-01-02
+2006-01-03
+2006-01-04
+2006-01-05
+2006-01-06
+2006-01-07
+2006-01-08
+2006-01-09
+2006-01-10
+2006-01-11
+2006-01-12
+2006-01-13
+2006-01-14
+2006-01-15
+2006-01-16
+2006-01-17
+2006-01-18
+2006-01-19
+2006-01-20
+2006-01-21
+2006-01-22
+2006-01-23
+2006-01-24
+2006-01-25
+2006-01-26
+2006-01-27
+2006-01-28
+2006-01-29
+2006-01-30
+2006-01-31
+2006-02-01
+2006-02-02
+2006-02-03
+2006-02-04
+2006-02-05
+2006-02-06
+2006-02-07
+2006-02-08
+2006-02-09
+2006-02-10
+2006-02-11
+2006-02-12
+2006-02-13
+2006-02-14
+2006-02-15
+2006-02-16
+2006-02-17
+2006-02-18
+2006-02-19
+2006-02-20
+2006-02-21
+2006-02-22
+2006-02-23
+2006-02-24
+2006-02-25
+2006-02-26
+2006-02-27
+2006-02-28
+2006-03-01
+2006-03-02
+2006-03-03
+2006-03-04
+2006-03-05
+2006-03-06
+2006-03-07
+2006-03-08
+2006-03-09
+2006-03-10
+2006-03-11
+2006-03-12
+2006-03-13
+2006-03-14
+2006-03-15
+2006-03-16
+2006-03-17
+2006-03-18
+2006-03-19
+2006-03-20
+2006-03-21
+2006-03-22
+2006-03-23
+2006-03-24
+2006-03-25
+2006-03-26
+2006-03-27
+2006-03-28
+2006-03-29
+2006-03-30
+2006-03-31
+2006-04-01
+2006-04-02
+2006-04-03
+2006-04-04
+2006-04-05
+2006-04-06
+2006-04-07
+2006-04-08
+2006-04-09
+2006-04-10
+2006-04-11
+2006-04-12
+2006-04-13
+2006-04-14
+2006-04-15
+2006-04-16
+2006-04-17
+2006-04-18
+2006-04-19
+2006-04-20
+2006-04-21
+2006-04-22
+2006-04-23
+2006-04-24
+2006-04-25
+2006-04-26
+2006-04-27
+2006-04-28
+2006-04-29
+2006-04-30
+2006-05-01
+2006-05-02
+2006-05-03
+2006-05-04
+2006-05-05
+2006-05-06
+2006-05-07
+2006-05-08
+2006-05-09
+2006-05-10
+2006-05-11
+2006-05-12
+2006-05-13
+2006-05-14
+2006-05-15
+2006-05-16
+2006-05-17
+2006-05-18
+2006-05-19
+2006-05-20
+2006-05-21
+2006-05-22
+2006-05-23
+2006-05-24
+2006-05-25
+2006-05-26
+2006-05-27
+2006-05-28
+2006-05-29
+2006-05-30
+2006-05-31
+2006-06-01
+2006-06-02
+2006-06-03
+2006-06-04
+2006-06-05
+2006-06-06
+2006-06-07
+2006-06-08
+2006-06-09
+2006-06-10
+2006-06-11
+2006-06-12
+2006-06-13
+2006-06-14
+2006-06-15
+2006-06-16
+2006-06-17
+2006-06-18
+2006-06-19
+2006-06-20
+2006-06-21
+2006-06-22
+2006-06-23
+2006-06-24
+2006-06-25
+2006-06-26
+2006-06-27
+2006-06-28
+2006-06-29
+2006-06-30
+2006-07-01
+2006-07-02
+2006-07-03
+2006-07-04
+2006-07-05
+2006-07-06
+2006-07-07
+2006-07-08
+2006-07-09
+2006-07-10
+2006-07-11
+2006-07-12
+2006-07-13
+2006-07-14
+2006-07-15
+2006-07-16
+2006-07-17
+2006-07-18
+2006-07-19
+2006-07-20
+2006-07-21
+2006-07-22
+2006-07-23
+2006-07-24
+2006-07-25
+2006-07-26
+2006-07-27
+2006-07-28
+2006-07-29
+2006-07-30
+2006-07-31
+2006-08-01
+2006-08-02
+2006-08-03
+2006-08-04
+2006-08-05
+2006-08-06
+2006-08-07
+2006-08-08
+2006-08-09
+2006-08-10
+2006-08-11
+2006-08-12
+2006-08-13
+2006-08-14
+2006-08-15
+2006-08-16
+2006-08-17
+2006-08-18
+2006-08-19
+2006-08-20
+2006-08-21
+2006-08-22
+2006-08-23
+2006-08-24
+2006-08-25
+2006-08-26
+2006-08-27
+2006-08-28
+2006-08-29
+2006-08-30
+2006-08-31
+2006-09-01
+2006-09-02
+2006-09-03
+2006-09-04
+2006-09-05
+2006-09-06
+2006-09-07
+2006-09-08
+2006-09-09
+2006-09-10
+2006-09-11
+2006-09-12
+2006-09-13
+2006-09-14
+2006-09-15
+2006-09-16
+2006-09-17
+2006-09-18
+2006-09-19
+2006-09-20
+2006-09-21
+2006-09-22
+2006-09-23
+2006-09-24
+2006-09-25
+2006-09-26
+2006-09-27
+2006-09-28
+2006-09-29
+2006-09-30
+2006-10-01
+2006-10-02
+2006-10-03
+2006-10-04
+2006-10-05
+2006-10-06
+2006-10-07
+2006-10-08
+2006-10-09
+2006-10-10
+2006-10-11
+2006-10-12
+2006-10-13
+2006-10-14
+2006-10-15
+2006-10-16
+2006-10-17
+2006-10-18
+2006-10-19
+2006-10-20
+2006-10-21
+2006-10-22
+2006-10-23
+2006-10-24
+2006-10-25
+2006-10-26
+2006-10-27
+2006-10-28
+2006-10-29
+2006-10-30
+2006-10-31
+2006-11-01
+2006-11-02
+2006-11-03
+2006-11-04
+2006-11-05
+2006-11-06
+2006-11-07
+2006-11-08
+2006-11-09
+2006-11-10
+2006-11-11
+2006-11-12
+2006-11-13
+2006-11-14
+2006-11-15
+2006-11-16
+2006-11-17
+2006-11-18
+2006-11-19
+2006-11-20
+2006-11-21
+2006-11-22
+2006-11-23
+2006-11-24
+2006-11-25
+2006-11-26
+2006-11-27
+2006-11-28
+2006-11-29
+2006-11-30
+2006-12-01
+2006-12-02
+2006-12-03
+2006-12-04
+2006-12-05
+2006-12-06
+2006-12-07
+2006-12-08
+2006-12-09
+2006-12-10
+2006-12-11
+2006-12-12
+2006-12-13
+2006-12-14
+2006-12-15
+2006-12-16
+2006-12-17
+2006-12-18
+2006-12-19
+2006-12-20
+2006-12-21
+2006-12-22
+2006-12-23
+2006-12-24
+2006-12-25
+2006-12-26
+2006-12-27
+2006-12-28
+2006-12-29
+2006-12-30
+2006-12-31
+2007-01-01
+2007-01-02
+2007-01-03
+2007-01-04
+2007-01-05
+2007-01-06
+2007-01-07
+2007-01-08
+2007-01-09
+2007-01-10
+2007-01-11
+2007-01-12
+2007-01-13
+2007-01-14
+2007-01-15
+2007-01-16
+2007-01-17
+2007-01-18
+2007-01-19
+2007-01-20
+2007-01-21
+2007-01-22
+2007-01-23
+2007-01-24
+2007-01-25
+2007-01-26
+2007-01-27
+2007-01-28
+2007-01-29
+2007-01-30
+2007-01-31
+2007-02-01
+2007-02-02
+2007-02-03
+2007-02-04
+2007-02-05
+2007-02-06
+2007-02-07
+2007-02-08
+2007-02-09
+2007-02-10
+2007-02-11
+2007-02-12
+2007-02-13
+2007-02-14
+2007-02-15
+2007-02-16
+2007-02-17
+2007-02-18
+2007-02-19
+2007-02-20
+2007-02-21
+2007-02-22
+2007-02-23
+2007-02-24
+2007-02-25
+2007-02-26
+2007-02-27
+2007-02-28
+2007-03-01
+2007-03-02
+2007-03-03
+2007-03-04
+2007-03-05
+2007-03-06
+2007-03-07
+2007-03-08
+2007-03-09
+2007-03-10
+2007-03-11
+2007-03-12
+2007-03-13
+2007-03-14
+2007-03-15
+2007-03-16
+2007-03-17
+2007-03-18
+2007-03-19
+2007-03-20
+2007-03-21
+2007-03-22
+2007-03-23
+2007-03-24
+2007-03-25
+2007-03-26
+2007-03-27
+2007-03-28
+2007-03-29
+2007-03-30
+2007-03-31
+2007-04-01
+2007-04-02
+2007-04-03
+2007-04-04
+2007-04-05
+2007-04-06
+2007-04-07
+2007-04-08
+2007-04-09
+2007-04-10
+2007-04-11
+2007-04-12
+2007-04-13
+2007-04-14
+2007-04-15
+2007-04-16
+2007-04-17
+2007-04-18
+2007-04-19
+2007-04-20
+2007-04-21
+2007-04-22
+2007-04-23
+2007-04-24
+2007-04-25
+2007-04-26
+2007-04-27
+2007-04-28
+2007-04-29
+2007-04-30
+2007-05-01
+2007-05-02
+2007-05-03
+2007-05-04
+2007-05-05
+2007-05-06
+2007-05-07
+2007-05-08
+2007-05-09
+2007-05-10
+2007-05-11
+2007-05-12
+2007-05-13
+2007-05-14
+2007-05-15
+2007-05-16
+2007-05-17
+2007-05-18
+2007-05-19
+2007-05-20
+2007-05-21
+2007-05-22
+2007-05-23
+2007-05-24
+2007-05-25
+2007-05-26
+2007-05-27
+2007-05-28
+2007-05-29
+2007-05-30
+2007-05-31
+2007-06-01
+2007-06-02
+2007-06-03
+2007-06-04
+2007-06-05
+2007-06-06
+2007-06-07
+2007-06-08
+2007-06-09
+2007-06-10
+2007-06-11
+2007-06-12
+2007-06-13
+2007-06-14
+2007-06-15
+2007-06-16
+2007-06-17
+2007-06-18
+2007-06-19
+2007-06-20
+2007-06-21
+2007-06-22
+2007-06-23
+2007-06-24
+2007-06-25
+2007-06-26
+2007-06-27
+2007-06-28
+2007-06-29
+2007-06-30
+2007-07-01
+2007-07-02
+2007-07-03
+2007-07-04
+2007-07-05
+2007-07-06
+2007-07-07
+2007-07-08
+2007-07-09
+2007-07-10
+2007-07-11
+2007-07-12
+2007-07-13
+2007-07-14
+2007-07-15
+2007-07-16
+2007-07-17
+2007-07-18
+2007-07-19
+2007-07-20
+2007-07-21
+2007-07-22
+2007-07-23
+2007-07-24
+2007-07-25
+2007-07-26
+2007-07-27
+2007-07-28
+2007-07-29
+2007-07-30
+2007-07-31
+2007-08-01
+2007-08-02
+2007-08-03
+2007-08-04
+2007-08-05
+2007-08-06
+2007-08-07
+2007-08-08
+2007-08-09
+2007-08-10
+2007-08-11
+2007-08-12
+2007-08-13
+2007-08-14
+2007-08-15
+2007-08-16
+2007-08-17
+2007-08-18
+2007-08-19
+2007-08-20
+2007-08-21
+2007-08-22
+2007-08-23
+2007-08-24
+2007-08-25
+2007-08-26
+2007-08-27
+2007-08-28
+2007-08-29
+2007-08-30
+2007-08-31
+2007-09-01
+2007-09-02
+2007-09-03
+2007-09-04
+2007-09-05
+2007-09-06
+2007-09-07
+2007-09-08
+2007-09-09
+2007-09-10
+2007-09-11
+2007-09-12
+2007-09-13
+2007-09-14
+2007-09-15
+2007-09-16
+2007-09-17
+2007-09-18
+2007-09-19
+2007-09-20
+2007-09-21
+2007-09-22
+2007-09-23
+2007-09-24
+2007-09-25
+2007-09-26
+2007-09-27
+2007-09-28
+2007-09-29
+2007-09-30
+2007-10-01
+2007-10-02
+2007-10-03
+2007-10-04
+2007-10-05
+2007-10-06
+2007-10-07
+2007-10-08
+2007-10-09
+2007-10-10
+2007-10-11
+2007-10-12
+2007-10-13
+2007-10-14
+2007-10-15
+2007-10-16
+2007-10-17
+2007-10-18
+2007-10-19
+2007-10-20
+2007-10-21
+2007-10-22
+2007-10-23
+2007-10-24
+2007-10-25
+2007-10-26
+2007-10-27
+2007-10-28
+2007-10-29
+2007-10-30
+2007-10-31
+2007-11-01
+2007-11-02
+2007-11-03
+2007-11-04
+2007-11-05
+2007-11-06
+2007-11-07
+2007-11-08
+2007-11-09
+2007-11-10
+2007-11-11
+2007-11-12
+2007-11-13
+2007-11-14
+2007-11-15
+2007-11-16
+2007-11-17
+2007-11-18
+2007-11-19
+2007-11-20
+2007-11-21
+2007-11-22
+2007-11-23
+2007-11-24
+2007-11-25
+2007-11-26
+2007-11-27
+2007-11-28
+2007-11-29
+2007-11-30
+2007-12-01
+2007-12-02
+2007-12-03
+2007-12-04
+2007-12-05
+2007-12-06
+2007-12-07
+2007-12-08
+2007-12-09
+2007-12-10
+2007-12-11
+2007-12-12
+2007-12-13
+2007-12-14
+2007-12-15
+2007-12-16
+2007-12-17
+2007-12-18
+2007-12-19
+2007-12-20
+2007-12-21
+2007-12-22
+2007-12-23
+2007-12-24
+2007-12-25
+2007-12-26
+2007-12-27
+2007-12-28
+2007-12-29
+2007-12-30
+2007-12-31
+2008-01-01
+2008-01-02
+2008-01-03
+2008-01-04
+2008-01-05
+2008-01-06
+2008-01-07
+2008-01-08
+2008-01-09
+2008-01-10
+2008-01-11
+2008-01-12
+2008-01-13
+2008-01-14
+2008-01-15
+2008-01-16
+2008-01-17
+2008-01-18
+2008-01-19
+2008-01-20
+2008-01-21
+2008-01-22
+2008-01-23
+2008-01-24
+2008-01-25
+2008-01-26
+2008-01-27
+2008-01-28
+2008-01-29
+2008-01-30
+2008-01-31
+2008-02-01
+2008-02-02
+2008-02-03
+2008-02-04
+2008-02-05
+2008-02-06
+2008-02-07
+2008-02-08
+2008-02-09
+2008-02-10
+2008-02-11
+2008-02-12
+2008-02-13
+2008-02-14
+2008-02-15
+2008-02-16
+2008-02-17
+2008-02-18
+2008-02-19
+2008-02-20
+2008-02-21
+2008-02-22
+2008-02-23
+2008-02-24
+2008-02-25
+2008-02-26
+2008-02-27
+2008-02-28
+2008-02-29
+2008-03-01
+2008-03-02
+2008-03-03
+2008-03-04
+2008-03-05
+2008-03-06
+2008-03-07
+2008-03-08
+2008-03-09
+2008-03-10
+2008-03-11
+2008-03-12
+2008-03-13
+2008-03-14
+2008-03-15
+2008-03-16
+2008-03-17
+2008-03-18
+2008-03-19
+2008-03-20
+2008-03-21
+2008-03-22
+2008-03-23
+2008-03-24
+2008-03-25
+2008-03-26
+2008-03-27
+2008-03-28
+2008-03-29
+2008-03-30
+2008-03-31
+2008-04-01
+2008-04-02
+2008-04-03
+2008-04-04
+2008-04-05
+2008-04-06
+2008-04-07
+2008-04-08
+2008-04-09
+2008-04-10
+2008-04-11
+2008-04-12
+2008-04-13
+2008-04-14
+2008-04-15
+2008-04-16
+2008-04-17
+2008-04-18
+2008-04-19
+2008-04-20
+2008-04-21
+2008-04-22
+2008-04-23
+2008-04-24
+2008-04-25
+2008-04-26
+2008-04-27
+2008-04-28
+2008-04-29
+2008-04-30
+2008-05-01
+2008-05-02
+2008-05-03
+2008-05-04
+2008-05-05
+2008-05-06
+2008-05-07
+2008-05-08
+2008-05-09
+2008-05-10
+2008-05-11
+2008-05-12
+2008-05-13
+2008-05-14
+2008-05-15
+2008-05-16
+2008-05-17
+2008-05-18
+2008-05-19
+2008-05-20
+2008-05-21
+2008-05-22
+2008-05-23
+2008-05-24
+2008-05-25
+2008-05-26
+2008-05-27
+2008-05-28
+2008-05-29
+2008-05-30
+2008-05-31
+2008-06-01
+2008-06-02
+2008-06-03
+2008-06-04
+2008-06-05
+2008-06-06
+2008-06-07
+2008-06-08
+2008-06-09
+2008-06-10
+2008-06-11
+2008-06-12
+2008-06-13
+2008-06-14
+2008-06-15
+2008-06-16
+2008-06-17
+2008-06-18
+2008-06-19
+2008-06-20
+2008-06-21
+2008-06-22
+2008-06-23
+2008-06-24
+2008-06-25
+2008-06-26
+2008-06-27
+2008-06-28
+2008-06-29
+2008-06-30
+2008-07-01
+2008-07-02
+2008-07-03
+2008-07-04
+2008-07-05
+2008-07-06
+2008-07-07
+2008-07-08
+2008-07-09
+2008-07-10
+2008-07-11
+2008-07-12
+2008-07-13
+2008-07-14
+2008-07-15
+2008-07-16
+2008-07-17
+2008-07-18
+2008-07-19
+2008-07-20
+2008-07-21
+2008-07-22
+2008-07-23
+2008-07-24
+2008-07-25
+2008-07-26
+2008-07-27
+2008-07-28
+2008-07-29
+2008-07-30
+2008-07-31
+2008-08-01
+2008-08-02
+2008-08-03
+2008-08-04
+2008-08-05
+2008-08-06
+2008-08-07
+2008-08-08
+2008-08-09
+2008-08-10
+2008-08-11
+2008-08-12
+2008-08-13
+2008-08-14
+2008-08-15
+2008-08-16
+2008-08-17
+2008-08-18
+2008-08-19
+2008-08-20
+2008-08-21
+2008-08-22
+2008-08-23
+2008-08-24
+2008-08-25
+2008-08-26
+2008-08-27
+2008-08-28
+2008-08-29
+2008-08-30
+2008-08-31
+2008-09-01
+2008-09-02
+2008-09-03
+2008-09-04
+2008-09-05
+2008-09-06
+2008-09-07
+2008-09-08
+2008-09-09
+2008-09-10
+2008-09-11
+2008-09-12
+2008-09-13
+2008-09-14
+2008-09-15
+2008-09-16
+2008-09-17
+2008-09-18
+2008-09-19
+2008-09-20
+2008-09-21
+2008-09-22
+2008-09-23
+2008-09-24
+2008-09-25
+2008-09-26
+2008-09-27
+2008-09-28
+2008-09-29
+2008-09-30
+2008-10-01
+2008-10-02
+2008-10-03
+2008-10-04
+2008-10-05
+2008-10-06
+2008-10-07
+2008-10-08
+2008-10-09
+2008-10-10
+2008-10-11
+2008-10-12
+2008-10-13
+2008-10-14
+2008-10-15
+2008-10-16
+2008-10-17
+2008-10-18
+2008-10-19
+2008-10-20
+2008-10-21
+2008-10-22
+2008-10-23
+2008-10-24
+2008-10-25
+2008-10-26
+2008-10-27
+2008-10-28
+2008-10-29
+2008-10-30
+2008-10-31
+2008-11-01
+2008-11-02
+2008-11-03
+2008-11-04
+2008-11-05
+2008-11-06
+2008-11-07
+2008-11-08
+2008-11-09
+2008-11-10
+2008-11-11
+2008-11-12
+2008-11-13
+2008-11-14
+2008-11-15
+2008-11-16
+2008-11-17
+2008-11-18
+2008-11-19
+2008-11-20
+2008-11-21
+2008-11-22
+2008-11-23
+2008-11-24
+2008-11-25
+2008-11-26
+2008-11-27
+2008-11-28
+2008-11-29
+2008-11-30
+2008-12-01
+2008-12-02
+2008-12-03
+2008-12-04
+2008-12-05
+2008-12-06
+2008-12-07
+2008-12-08
+2008-12-09
+2008-12-10
+2008-12-11
+2008-12-12
+2008-12-13
+2008-12-14
+2008-12-15
+2008-12-16
+2008-12-17
+2008-12-18
+2008-12-19
+2008-12-20
+2008-12-21
+2008-12-22
+2008-12-23
+2008-12-24
+2008-12-25
+2008-12-26
+2008-12-27
+2008-12-28
+2008-12-29
+2008-12-30
+2008-12-31
+2009-01-01
+2009-01-02
+2009-01-03
+2009-01-04
+2009-01-05
+2009-01-06
+2009-01-07
+2009-01-08
+2009-01-09
+2009-01-10
+2009-01-11
+2009-01-12
+2009-01-13
+2009-01-14
+2009-01-15
+2009-01-16
+2009-01-17
+2009-01-18
+2009-01-19
+2009-01-20
+2009-01-21
+2009-01-22
+2009-01-23
+2009-01-24
+2009-01-25
+2009-01-26
+2009-01-27
+2009-01-28
+2009-01-29
+2009-01-30
+2009-01-31
+2009-02-01
+2009-02-02
+2009-02-03
+2009-02-04
+2009-02-05
+2009-02-06
+2009-02-07
+2009-02-08
+2009-02-09
+2009-02-10
+2009-02-11
+2009-02-12
+2009-02-13
+2009-02-14
+2009-02-15
+2009-02-16
+2009-02-17
+2009-02-18
+2009-02-19
+2009-02-20
+2009-02-21
+2009-02-22
+2009-02-23
+2009-02-24
+2009-02-25
+2009-02-26
+2009-02-27
+2009-02-28
+2009-03-01
+2009-03-02
+2009-03-03
+2009-03-04
+2009-03-05
+2009-03-06
+2009-03-07
+2009-03-08
+2009-03-09
+2009-03-10
+2009-03-11
+2009-03-12
+2009-03-13
+2009-03-14
+2009-03-15
+2009-03-16
+2009-03-17
+2009-03-18
+2009-03-19
+2009-03-20
+2009-03-21
+2009-03-22
+2009-03-23
+2009-03-24
+2009-03-25
+2009-03-26
+2009-03-27
+2009-03-28
+2009-03-29
+2009-03-30
+2009-03-31
+2009-04-01
+2009-04-02
+2009-04-03
+2009-04-04
+2009-04-05
+2009-04-06
+2009-04-07
+2009-04-08
+2009-04-09
+2009-04-10
+2009-04-11
+2009-04-12
+2009-04-13
+2009-04-14
+2009-04-15
+2009-04-16
+2009-04-17
+2009-04-18
+2009-04-19
+2009-04-20
+2009-04-21
+2009-04-22
+2009-04-23
+2009-04-24
+2009-04-25
+2009-04-26
+2009-04-27
+2009-04-28
+2009-04-29
+2009-04-30
+2009-05-01
+2009-05-02
+2009-05-03
+2009-05-04
+2009-05-05
+2009-05-06
+2009-05-07
+2009-05-08
+2009-05-09
+2009-05-10
+2009-05-11
+2009-05-12
+2009-05-13
+2009-05-14
+2009-05-15
+2009-05-16
+2009-05-17
+2009-05-18
+2009-05-19
+2009-05-20
+2009-05-21
+2009-05-22
+2009-05-23
+2009-05-24
+2009-05-25
+2009-05-26
+2009-05-27
+2009-05-28
+2009-05-29
+2009-05-30
+2009-05-31
+2009-06-01
+2009-06-02
+2009-06-03
+2009-06-04
+2009-06-05
+2009-06-06
+2009-06-07
+2009-06-08
+2009-06-09
+2009-06-10
+2009-06-11
+2009-06-12
+2009-06-13
+2009-06-14
+2009-06-15
+2009-06-16
+2009-06-17
+2009-06-18
+2009-06-19
+2009-06-20
+2009-06-21
+2009-06-22
+2009-06-23
+2009-06-24
+2009-06-25
+2009-06-26
+2009-06-27
+2009-06-28
+2009-06-29
+2009-06-30
+2009-07-01
+2009-07-02
+2009-07-03
+2009-07-04
+2009-07-05
+2009-07-06
+2009-07-07
+2009-07-08
+2009-07-09
+2009-07-10
+2009-07-11
+2009-07-12
+2009-07-13
+2009-07-14
+2009-07-15
+2009-07-16
+2009-07-17
+2009-07-18
+2009-07-19
+2009-07-20
+2009-07-21
+2009-07-22
+2009-07-23
+2009-07-24
+2009-07-25
+2009-07-26
+2009-07-27
+2009-07-28
+2009-07-29
+2009-07-30
+2009-07-31
+2009-08-01
+2009-08-02
+2009-08-03
+2009-08-04
+2009-08-05
+2009-08-06
+2009-08-07
+2009-08-08
+2009-08-09
+2009-08-10
+2009-08-11
+2009-08-12
+2009-08-13
+2009-08-14
+2009-08-15
+2009-08-16
+2009-08-17
+2009-08-18
+2009-08-19
+2009-08-20
+2009-08-21
+2009-08-22
+2009-08-23
+2009-08-24
+2009-08-25
+2009-08-26
+2009-08-27
+2009-08-28
+2009-08-29
+2009-08-30
+2009-08-31
+2009-09-01
+2009-09-02
+2009-09-03
+2009-09-04
+2009-09-05
+2009-09-06
+2009-09-07
+2009-09-08
+2009-09-09
+2009-09-10
+2009-09-11
+2009-09-12
+2009-09-13
+2009-09-14
+2009-09-15
+2009-09-16
+2009-09-17
+2009-09-18
+2009-09-19
+2009-09-20
+2009-09-21
+2009-09-22
+2009-09-23
+2009-09-24
+2009-09-25
+2009-09-26
+2009-09-27
+2009-09-28
+2009-09-29
+2009-09-30
+2009-10-01
+2009-10-02
+2009-10-03
+2009-10-04
+2009-10-05
+2009-10-06
+2009-10-07
+2009-10-08
+2009-10-09
+2009-10-10
+2009-10-11
+2009-10-12
+2009-10-13
+2009-10-14
+2009-10-15
+2009-10-16
+2009-10-17
+2009-10-18
+2009-10-19
+2009-10-20
+2009-10-21
+2009-10-22
+2009-10-23
+2009-10-24
+2009-10-25
+2009-10-26
+2009-10-27
+2009-10-28
+2009-10-29
+2009-10-30
+2009-10-31
+2009-11-01
+2009-11-02
+2009-11-03
+2009-11-04
+2009-11-05
+2009-11-06
+2009-11-07
+2009-11-08
+2009-11-09
+2009-11-10
+2009-11-11
+2009-11-12
+2009-11-13
+2009-11-14
+2009-11-15
+2009-11-16
+2009-11-17
+2009-11-18
+2009-11-19
+2009-11-20
+2009-11-21
+2009-11-22
+2009-11-23
+2009-11-24
+2009-11-25
+2009-11-26
+2009-11-27
+2009-11-28
+2009-11-29
+2009-11-30
+2009-12-01
+2009-12-02
+2009-12-03
+2009-12-04
+2009-12-05
+2009-12-06
+2009-12-07
+2009-12-08
+2009-12-09
+2009-12-10
+2009-12-11
+2009-12-12
+2009-12-13
+2009-12-14
+2009-12-15
+2009-12-16
+2009-12-17
+2009-12-18
+2009-12-19
+2009-12-20
+2009-12-21
+2009-12-22
+2009-12-23
+2009-12-24
+2009-12-25
+2009-12-26
+2009-12-27
+2009-12-28
+2009-12-29
+2009-12-30
+2009-12-31
+2010-01-01
+2010-01-02
+2010-01-03
+2010-01-04
+2010-01-05
+2010-01-06
+2010-01-07
+2010-01-08
+2010-01-09
+2010-01-10
+2010-01-11
+2010-01-12
+2010-01-13
+2010-01-14
+2010-01-15
+2010-01-16
+2010-01-17
+2010-01-18
+2010-01-19
+2010-01-20
+2010-01-21
+2010-01-22
+2010-01-23
+2010-01-24
+2010-01-25
+2010-01-26
+2010-01-27
+2010-01-28
+2010-01-29
+2010-01-30
+2010-01-31
+2010-02-01
+2010-02-02
+2010-02-03
+2010-02-04
+2010-02-05
+2010-02-06
+2010-02-07
+2010-02-08
+2010-02-09
+2010-02-10
+2010-02-11
+2010-02-12
+2010-02-13
+2010-02-14
+2010-02-15
+2010-02-16
+2010-02-17
+2010-02-18
+2010-02-19
+2010-02-20
+2010-02-21
+2010-02-22
+2010-02-23
+2010-02-24
+2010-02-25
+2010-02-26
+2010-02-27
+2010-02-28
+2010-03-01
+2010-03-02
+2010-03-03
+2010-03-04
+2010-03-05
+2010-03-06
+2010-03-07
+2010-03-08
+2010-03-09
+2010-03-10
+2010-03-11
+2010-03-12
+2010-03-13
+2010-03-14
+2010-03-15
+2010-03-16
+2010-03-17
+2010-03-18
+2010-03-19
+2010-03-20
+2010-03-21
+2010-03-22
+2010-03-23
+2010-03-24
+2010-03-25
+2010-03-26
+2010-03-27
+2010-03-28
+2010-03-29
+2010-03-30
+2010-03-31
+2010-04-01
+2010-04-02
+2010-04-03
+2010-04-04
+2010-04-05
+2010-04-06
+2010-04-07
+2010-04-08
+2010-04-09
+2010-04-10
+2010-04-11
+2010-04-12
+2010-04-13
+2010-04-14
+2010-04-15
+2010-04-16
+2010-04-17
+2010-04-18
+2010-04-19
+2010-04-20
+2010-04-21
+2010-04-22
+2010-04-23
+2010-04-24
+2010-04-25
+2010-04-26
+2010-04-27
+2010-04-28
+2010-04-29
+2010-04-30
+2010-05-01
+2010-05-02
+2010-05-03
+2010-05-04
+2010-05-05
+2010-05-06
+2010-05-07
+2010-05-08
+2010-05-09
+2010-05-10
+2010-05-11
+2010-05-12
+2010-05-13
+2010-05-14
+2010-05-15
+2010-05-16
+2010-05-17
+2010-05-18
+2010-05-19
+2010-05-20
+2010-05-21
+2010-05-22
+2010-05-23
+2010-05-24
+2010-05-25
+2010-05-26
+2010-05-27
+2010-05-28
+2010-05-29
+2010-05-30
+2010-05-31
+2010-06-01
+2010-06-02
+2010-06-03
+2010-06-04
+2010-06-05
+2010-06-06
+2010-06-07
+2010-06-08
+2010-06-09
+2010-06-10
+2010-06-11
+2010-06-12
+2010-06-13
+2010-06-14
+2010-06-15
+2010-06-16
+2010-06-17
+2010-06-18
+2010-06-19
+2010-06-20
+2010-06-21
+2010-06-22
+2010-06-23
+2010-06-24
+2010-06-25
+2010-06-26
+2010-06-27
+2010-06-28
+2010-06-29
+2010-06-30
+2010-07-01
+2010-07-02
+2010-07-03
+2010-07-04
+2010-07-05
+2010-07-06
+2010-07-07
+2010-07-08
+2010-07-09
+2010-07-10
+2010-07-11
+2010-07-12
+2010-07-13
+2010-07-14
+2010-07-15
+2010-07-16
+2010-07-17
+2010-07-18
+2010-07-19
+2010-07-20
+2010-07-21
+2010-07-22
+2010-07-23
+2010-07-24
+2010-07-25
+2010-07-26
+2010-07-27
+2010-07-28
+2010-07-29
+2010-07-30
+2010-07-31
+2010-08-01
+2010-08-02
+2010-08-03
+2010-08-04
+2010-08-05
+2010-08-06
+2010-08-07
+2010-08-08
+2010-08-09
+2010-08-10
+2010-08-11
+2010-08-12
+2010-08-13
+2010-08-14
+2010-08-15
+2010-08-16
+2010-08-17
+2010-08-18
+2010-08-19
+2010-08-20
+2010-08-21
+2010-08-22
+2010-08-23
+2010-08-24
+2010-08-25
+2010-08-26
+2010-08-27
+2010-08-28
+2010-08-29
+2010-08-30
+2010-08-31
+2010-09-01
+2010-09-02
+2010-09-03
+2010-09-04
+2010-09-05
+2010-09-06
+2010-09-07
+2010-09-08
+2010-09-09
+2010-09-10
+2010-09-11
+2010-09-12
+2010-09-13
+2010-09-14
+2010-09-15
+2010-09-16
+2010-09-17
+2010-09-18
+2010-09-19
+2010-09-20
+2010-09-21
+2010-09-22
+2010-09-23
+2010-09-24
+2010-09-25
+2010-09-26
+2010-09-27
+2010-09-28
+2010-09-29
+2010-09-30
+2010-10-01
+2010-10-02
+2010-10-03
+2010-10-04
+2010-10-05
+2010-10-06
+2010-10-07
+2010-10-08
+2010-10-09
+2010-10-10
+2010-10-11
+2010-10-12
+2010-10-13
+2010-10-14
+2010-10-15
+2010-10-16
+2010-10-17
+2010-10-18
+2010-10-19
+2010-10-20
+2010-10-21
+2010-10-22
+2010-10-23
+2010-10-24
+2010-10-25
+2010-10-26
+2010-10-27
+2010-10-28
+2010-10-29
+2010-10-30
+2010-10-31
+2010-11-01
+2010-11-02
+2010-11-03
+2010-11-04
+2010-11-05
+2010-11-06
+2010-11-07
+2010-11-08
+2010-11-09
+2010-11-10
+2010-11-11
+2010-11-12
+2010-11-13
+2010-11-14
+2010-11-15
+2010-11-16
+2010-11-17
+2010-11-18
+2010-11-19
+2010-11-20
+2010-11-21
+2010-11-22
+2010-11-23
+2010-11-24
+2010-11-25
+2010-11-26
+2010-11-27
+2010-11-28
+2010-11-29
+2010-11-30
+2010-12-01
+2010-12-02
+2010-12-03
+2010-12-04
+2010-12-05
+2010-12-06
+2010-12-07
+2010-12-08
+2010-12-09
+2010-12-10
+2010-12-11
+2010-12-12
+2010-12-13
+2010-12-14
+2010-12-15
+2010-12-16
+2010-12-17
+2010-12-18
+2010-12-19
+2010-12-20
+2010-12-21
+2010-12-22
+2010-12-23
+2010-12-24
+2010-12-25
+2010-12-26
+2010-12-27
+2010-12-28
+2010-12-29
+2010-12-30
+2010-12-31
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase40.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase40.ics
new file mode 100644
index 00000000..73fa494f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase40.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+
+BEGIN:VEVENT
+DESCRIPTION:An example where the days generated makes a difference because
+ of WKST:
+DTSTAMP:20040102T053656Z
+DTSTART;VALUE=DATE:19970805
+RRULE:FREQ=WEEKLY;COUNT=4;INTERVAL=2;BYDAY=TU,SU
+SUMMARY:RExample37a
+UID:RExample37a
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase40.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase40.ics.comp34.ref
new file mode 100644
index 00000000..e82b7e61
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase40.ics.comp34.ref
@@ -0,0 +1,5 @@
+1997-08-05T00:00:00
+1997-08-10T00:00:00
+1997-08-19T00:00:00
+1997-08-24T00:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase40.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase40.ics.next.ref
new file mode 100644
index 00000000..e82b7e61
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase40.ics.next.ref
@@ -0,0 +1,5 @@
+1997-08-05T00:00:00
+1997-08-10T00:00:00
+1997-08-19T00:00:00
+1997-08-24T00:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase40.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase40.ics.prev.ref
new file mode 100644
index 00000000..bc2d6e00
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase40.ics.prev.ref
@@ -0,0 +1,5 @@
+1997-08-24T00:00:00
+1997-08-19T00:00:00
+1997-08-10T00:00:00
+1997-08-05T00:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase40.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase40.ics.recurson.ref
new file mode 100644
index 00000000..2be01514
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase40.ics.recurson.ref
@@ -0,0 +1,5 @@
+1997-08-05
+1997-08-10
+1997-08-19
+1997-08-24
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase41.ics b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase41.ics
new file mode 100644
index 00000000..8f0f3e9b
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase41.ics
@@ -0,0 +1,14 @@
+BEGIN:VCALENDAR
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:America/New_York
+
+BEGIN:VEVENT
+DESCRIPTION:changing only WKST from MO to SU\, yields different results...
+DTSTAMP:20040102T053656Z
+DTSTART;VALUE=DATE:19970805
+RRULE:FREQ=WEEKLY;COUNT=4;INTERVAL=2;BYDAY=TU,SU;WKST=SU
+SUMMARY:RExample37b
+UID:RExample37b
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase41.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase41.ics.comp34.ref
new file mode 100644
index 00000000..97073383
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase41.ics.comp34.ref
@@ -0,0 +1,3 @@
+1997-08-05T00:00:00
+1997-08-23T00:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase41.ics.next.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase41.ics.next.ref
new file mode 100644
index 00000000..011d38f8
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase41.ics.next.ref
@@ -0,0 +1,5 @@
+1997-08-05T00:00:00
+1997-08-17T00:00:00
+1997-08-19T00:00:00
+1997-08-31T00:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase41.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase41.ics.prev.ref
new file mode 100644
index 00000000..90cbb237
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase41.ics.prev.ref
@@ -0,0 +1,5 @@
+1997-08-31T00:00:00
+1997-08-19T00:00:00
+1997-08-17T00:00:00
+1997-08-05T00:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase41.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase41.ics.recurson.ref
new file mode 100644
index 00000000..2f1bc897
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase41.ics.recurson.ref
@@ -0,0 +1,5 @@
+1997-08-05
+1997-08-17
+1997-08-19
+1997-08-31
+
diff --git a/libkcal/tests/data/RecurrenceRule/RFC2445/readme.txt b/libkcal/tests/data/RecurrenceRule/RFC2445/readme.txt
new file mode 100644
index 00000000..92e533c6
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/RFC2445/readme.txt
@@ -0,0 +1,2 @@
+All RRULE examples from RFC 2445. Two examples are wrong in the RFC because
+they didn't consider that UNTIL was given in UTC, not in local time.
diff --git a/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase02.ics b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase02.ics
new file mode 100644
index 00000000..0b448388
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase02.ics
@@ -0,0 +1,11 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:Europe/Vienna
+
+BEGIN:VEVENT
+DESCRIPTION:Daily until June 1 (UNTIL on June 1 0:00 in UTC is after the event starts on December 15 01:00 in local time)
+DTSTART;TZID=Europe/Vienna:19971215T010000
+RRULE:FREQ=DAILY;UNTIL=19970601T000000Z;INTERVAL=1
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase02.ics.next.ref b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase02.ics.next.ref
new file mode 100644
index 00000000..52e3ac3b
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase02.ics.next.ref
@@ -0,0 +1,2 @@
+1997-12-15T01:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase02.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase02.ics.prev.ref
new file mode 100644
index 00000000..52e3ac3b
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase02.ics.prev.ref
@@ -0,0 +1,2 @@
+1997-12-15T01:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase02.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase02.ics.recurson.ref
new file mode 100644
index 00000000..2f3a7e16
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase02.ics.recurson.ref
@@ -0,0 +1 @@
+1997-12-15
diff --git a/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase03.ics b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase03.ics
new file mode 100644
index 00000000..deeffc6a
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase03.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Weekly on Tuesday and Thursday for 5 weeks:
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=WEEKLY;UNTIL=19971007T000000Z;INTERVAL=1;BYDAY=TU,TH
+X-EXPECT-NUMEVENTS: 10
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase03.ics.next.ref b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase03.ics.next.ref
new file mode 100644
index 00000000..b05237db
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase03.ics.next.ref
@@ -0,0 +1,13 @@
+1997-09-02T09:00:00
+1997-09-04T09:00:00
+1997-09-09T09:00:00
+1997-09-11T09:00:00
+1997-09-16T09:00:00
+1997-09-18T09:00:00
+1997-09-23T09:00:00
+1997-09-25T09:00:00
+1997-09-30T09:00:00
+1997-10-02T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase03.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase03.ics.prev.ref
new file mode 100644
index 00000000..f17f5b77
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase03.ics.prev.ref
@@ -0,0 +1,13 @@
+1997-10-02T09:00:00
+1997-09-30T09:00:00
+1997-09-25T09:00:00
+1997-09-23T09:00:00
+1997-09-18T09:00:00
+1997-09-16T09:00:00
+1997-09-11T09:00:00
+1997-09-09T09:00:00
+1997-09-04T09:00:00
+1997-09-02T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase03.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase03.ics.recurson.ref
new file mode 100644
index 00000000..bf2c06ab
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase03.ics.recurson.ref
@@ -0,0 +1,11 @@
+1997-09-02
+1997-09-04
+1997-09-09
+1997-09-11
+1997-09-16
+1997-09-18
+1997-09-23
+1997-09-25
+1997-09-30
+1997-10-02
+
diff --git a/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase04.ics b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase04.ics
new file mode 100644
index 00000000..b71ab489
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase04.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Every 3 hours from 9:00 AM local time to 5:00 PM UTC on a specific day (so it ends 10:00 local time):
+DTSTART;TZID=America/Los_Angeles:19970902T090000
+RRULE:FREQ=HOURLY;UNTIL=19970902T170000Z;INTERVAL=3
+X-EXPECT-NUMEVENTS: 1
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase04.ics.next.fixme b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase04.ics.next.fixme
new file mode 100644
index 00000000..fa3cc637
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase04.ics.next.fixme
@@ -0,0 +1,2 @@
+2 known errors:
+ -) 17:00 UTC is 11:00 pacific time, so there's no recurrence at 12:00 and 15:00 local time in LA
diff --git a/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase04.ics.next.ref b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase04.ics.next.ref
new file mode 100644
index 00000000..ae4cbb78
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase04.ics.next.ref
@@ -0,0 +1,4 @@
+1997-09-02T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase04.ics.prev.fixme b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase04.ics.prev.fixme
new file mode 100644
index 00000000..d566f115
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase04.ics.prev.fixme
@@ -0,0 +1,2 @@
+3 known errors:
+ -) 17:00 UTC is 11:00 pacific time, so there's no recurrence at 12:00 and 15:00 local time in LA
diff --git a/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase04.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase04.ics.prev.ref
new file mode 100644
index 00000000..ae4cbb78
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase04.ics.prev.ref
@@ -0,0 +1,4 @@
+1997-09-02T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase04.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase04.ics.recurson.ref
new file mode 100644
index 00000000..6fca0d2f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase04.ics.recurson.ref
@@ -0,0 +1,2 @@
+1997-09-02
+
diff --git a/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase05.ics b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase05.ics
new file mode 100644
index 00000000..6717e165
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase05.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Every day in January\, for 3 years\, except Jan 31\, 2000
+DTSTART;TZID=America/Los_Angeles:19980101T090000
+RRULE:FREQ=YEARLY;UNTIL=20000131T090000Z;INTERVAL=1;BYDAY=SU,MO,TU,WE,TH,FR,SA;BYMONTH=1
+X-EXPECT-NUMEVENTS: 93
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase05.ics.next.ref b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase05.ics.next.ref
new file mode 100644
index 00000000..cbacb16a
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase05.ics.next.ref
@@ -0,0 +1,93 @@
+1998-01-01T09:00:00
+1998-01-02T09:00:00
+1998-01-03T09:00:00
+1998-01-04T09:00:00
+1998-01-05T09:00:00
+1998-01-06T09:00:00
+1998-01-07T09:00:00
+1998-01-08T09:00:00
+1998-01-09T09:00:00
+1998-01-10T09:00:00
+1998-01-11T09:00:00
+1998-01-12T09:00:00
+1998-01-13T09:00:00
+1998-01-14T09:00:00
+1998-01-15T09:00:00
+1998-01-16T09:00:00
+1998-01-17T09:00:00
+1998-01-18T09:00:00
+1998-01-19T09:00:00
+1998-01-20T09:00:00
+1998-01-21T09:00:00
+1998-01-22T09:00:00
+1998-01-23T09:00:00
+1998-01-24T09:00:00
+1998-01-25T09:00:00
+1998-01-26T09:00:00
+1998-01-27T09:00:00
+1998-01-28T09:00:00
+1998-01-29T09:00:00
+1998-01-30T09:00:00
+1998-01-31T09:00:00
+1999-01-01T09:00:00
+1999-01-02T09:00:00
+1999-01-03T09:00:00
+1999-01-04T09:00:00
+1999-01-05T09:00:00
+1999-01-06T09:00:00
+1999-01-07T09:00:00
+1999-01-08T09:00:00
+1999-01-09T09:00:00
+1999-01-10T09:00:00
+1999-01-11T09:00:00
+1999-01-12T09:00:00
+1999-01-13T09:00:00
+1999-01-14T09:00:00
+1999-01-15T09:00:00
+1999-01-16T09:00:00
+1999-01-17T09:00:00
+1999-01-18T09:00:00
+1999-01-19T09:00:00
+1999-01-20T09:00:00
+1999-01-21T09:00:00
+1999-01-22T09:00:00
+1999-01-23T09:00:00
+1999-01-24T09:00:00
+1999-01-25T09:00:00
+1999-01-26T09:00:00
+1999-01-27T09:00:00
+1999-01-28T09:00:00
+1999-01-29T09:00:00
+1999-01-30T09:00:00
+1999-01-31T09:00:00
+2000-01-01T09:00:00
+2000-01-02T09:00:00
+2000-01-03T09:00:00
+2000-01-04T09:00:00
+2000-01-05T09:00:00
+2000-01-06T09:00:00
+2000-01-07T09:00:00
+2000-01-08T09:00:00
+2000-01-09T09:00:00
+2000-01-10T09:00:00
+2000-01-11T09:00:00
+2000-01-12T09:00:00
+2000-01-13T09:00:00
+2000-01-14T09:00:00
+2000-01-15T09:00:00
+2000-01-16T09:00:00
+2000-01-17T09:00:00
+2000-01-18T09:00:00
+2000-01-19T09:00:00
+2000-01-20T09:00:00
+2000-01-21T09:00:00
+2000-01-22T09:00:00
+2000-01-23T09:00:00
+2000-01-24T09:00:00
+2000-01-25T09:00:00
+2000-01-26T09:00:00
+2000-01-27T09:00:00
+2000-01-28T09:00:00
+2000-01-29T09:00:00
+2000-01-30T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase05.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase05.ics.prev.ref
new file mode 100644
index 00000000..bc435572
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase05.ics.prev.ref
@@ -0,0 +1,93 @@
+2000-01-30T09:00:00
+2000-01-29T09:00:00
+2000-01-28T09:00:00
+2000-01-27T09:00:00
+2000-01-26T09:00:00
+2000-01-25T09:00:00
+2000-01-24T09:00:00
+2000-01-23T09:00:00
+2000-01-22T09:00:00
+2000-01-21T09:00:00
+2000-01-20T09:00:00
+2000-01-19T09:00:00
+2000-01-18T09:00:00
+2000-01-17T09:00:00
+2000-01-16T09:00:00
+2000-01-15T09:00:00
+2000-01-14T09:00:00
+2000-01-13T09:00:00
+2000-01-12T09:00:00
+2000-01-11T09:00:00
+2000-01-10T09:00:00
+2000-01-09T09:00:00
+2000-01-08T09:00:00
+2000-01-07T09:00:00
+2000-01-06T09:00:00
+2000-01-05T09:00:00
+2000-01-04T09:00:00
+2000-01-03T09:00:00
+2000-01-02T09:00:00
+2000-01-01T09:00:00
+1999-01-31T09:00:00
+1999-01-30T09:00:00
+1999-01-29T09:00:00
+1999-01-28T09:00:00
+1999-01-27T09:00:00
+1999-01-26T09:00:00
+1999-01-25T09:00:00
+1999-01-24T09:00:00
+1999-01-23T09:00:00
+1999-01-22T09:00:00
+1999-01-21T09:00:00
+1999-01-20T09:00:00
+1999-01-19T09:00:00
+1999-01-18T09:00:00
+1999-01-17T09:00:00
+1999-01-16T09:00:00
+1999-01-15T09:00:00
+1999-01-14T09:00:00
+1999-01-13T09:00:00
+1999-01-12T09:00:00
+1999-01-11T09:00:00
+1999-01-10T09:00:00
+1999-01-09T09:00:00
+1999-01-08T09:00:00
+1999-01-07T09:00:00
+1999-01-06T09:00:00
+1999-01-05T09:00:00
+1999-01-04T09:00:00
+1999-01-03T09:00:00
+1999-01-02T09:00:00
+1999-01-01T09:00:00
+1998-01-31T09:00:00
+1998-01-30T09:00:00
+1998-01-29T09:00:00
+1998-01-28T09:00:00
+1998-01-27T09:00:00
+1998-01-26T09:00:00
+1998-01-25T09:00:00
+1998-01-24T09:00:00
+1998-01-23T09:00:00
+1998-01-22T09:00:00
+1998-01-21T09:00:00
+1998-01-20T09:00:00
+1998-01-19T09:00:00
+1998-01-18T09:00:00
+1998-01-17T09:00:00
+1998-01-16T09:00:00
+1998-01-15T09:00:00
+1998-01-14T09:00:00
+1998-01-13T09:00:00
+1998-01-12T09:00:00
+1998-01-11T09:00:00
+1998-01-10T09:00:00
+1998-01-09T09:00:00
+1998-01-08T09:00:00
+1998-01-07T09:00:00
+1998-01-06T09:00:00
+1998-01-05T09:00:00
+1998-01-04T09:00:00
+1998-01-03T09:00:00
+1998-01-02T09:00:00
+1998-01-01T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase05.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase05.ics.recurson.ref
new file mode 100644
index 00000000..c4b2c828
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase05.ics.recurson.ref
@@ -0,0 +1,93 @@
+1998-01-01
+1998-01-02
+1998-01-03
+1998-01-04
+1998-01-05
+1998-01-06
+1998-01-07
+1998-01-08
+1998-01-09
+1998-01-10
+1998-01-11
+1998-01-12
+1998-01-13
+1998-01-14
+1998-01-15
+1998-01-16
+1998-01-17
+1998-01-18
+1998-01-19
+1998-01-20
+1998-01-21
+1998-01-22
+1998-01-23
+1998-01-24
+1998-01-25
+1998-01-26
+1998-01-27
+1998-01-28
+1998-01-29
+1998-01-30
+1998-01-31
+1999-01-01
+1999-01-02
+1999-01-03
+1999-01-04
+1999-01-05
+1999-01-06
+1999-01-07
+1999-01-08
+1999-01-09
+1999-01-10
+1999-01-11
+1999-01-12
+1999-01-13
+1999-01-14
+1999-01-15
+1999-01-16
+1999-01-17
+1999-01-18
+1999-01-19
+1999-01-20
+1999-01-21
+1999-01-22
+1999-01-23
+1999-01-24
+1999-01-25
+1999-01-26
+1999-01-27
+1999-01-28
+1999-01-29
+1999-01-30
+1999-01-31
+2000-01-01
+2000-01-02
+2000-01-03
+2000-01-04
+2000-01-05
+2000-01-06
+2000-01-07
+2000-01-08
+2000-01-09
+2000-01-10
+2000-01-11
+2000-01-12
+2000-01-13
+2000-01-14
+2000-01-15
+2000-01-16
+2000-01-17
+2000-01-18
+2000-01-19
+2000-01-20
+2000-01-21
+2000-01-22
+2000-01-23
+2000-01-24
+2000-01-25
+2000-01-26
+2000-01-27
+2000-01-28
+2000-01-29
+2000-01-30
+
diff --git a/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase06.ics b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase06.ics
new file mode 100644
index 00000000..04df2dc2
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase06.ics
@@ -0,0 +1,12 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//K Desktop Environment (KDE)//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:America/Los_Angeles
+
+BEGIN:VEVENT
+DESCRIPTION:Everyday in January\, for 3 years\, ends on Jan 30 (because Jan31 09:00 UTC is befoer Jan31 09:00 local time in Los Angeles):
+DTSTART;TZID=America/Los_Angeles:19980101T090000
+RRULE:FREQ=DAILY;UNTIL=20000131T090000Z;INTERVAL=1;BYMONTH=1
+X-EXPECT-NUMEVENTS: 93
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase06.ics.next.fixme b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase06.ics.next.fixme
new file mode 100644
index 00000000..af0cd2aa
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase06.ics.next.fixme
@@ -0,0 +1,2 @@
+1 known error:
+ -) 31.Jan 09:00 UTC is before 31. Jan 09:00 Pacific time, so there's no recurrence on 31. Jan
diff --git a/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase06.ics.next.ref b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase06.ics.next.ref
new file mode 100644
index 00000000..53bc2682
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase06.ics.next.ref
@@ -0,0 +1,95 @@
+1998-01-01T09:00:00
+1998-01-02T09:00:00
+1998-01-03T09:00:00
+1998-01-04T09:00:00
+1998-01-05T09:00:00
+1998-01-06T09:00:00
+1998-01-07T09:00:00
+1998-01-08T09:00:00
+1998-01-09T09:00:00
+1998-01-10T09:00:00
+1998-01-11T09:00:00
+1998-01-12T09:00:00
+1998-01-13T09:00:00
+1998-01-14T09:00:00
+1998-01-15T09:00:00
+1998-01-16T09:00:00
+1998-01-17T09:00:00
+1998-01-18T09:00:00
+1998-01-19T09:00:00
+1998-01-20T09:00:00
+1998-01-21T09:00:00
+1998-01-22T09:00:00
+1998-01-23T09:00:00
+1998-01-24T09:00:00
+1998-01-25T09:00:00
+1998-01-26T09:00:00
+1998-01-27T09:00:00
+1998-01-28T09:00:00
+1998-01-29T09:00:00
+1998-01-30T09:00:00
+1998-01-31T09:00:00
+1999-01-01T09:00:00
+1999-01-02T09:00:00
+1999-01-03T09:00:00
+1999-01-04T09:00:00
+1999-01-05T09:00:00
+1999-01-06T09:00:00
+1999-01-07T09:00:00
+1999-01-08T09:00:00
+1999-01-09T09:00:00
+1999-01-10T09:00:00
+1999-01-11T09:00:00
+1999-01-12T09:00:00
+1999-01-13T09:00:00
+1999-01-14T09:00:00
+1999-01-15T09:00:00
+1999-01-16T09:00:00
+1999-01-17T09:00:00
+1999-01-18T09:00:00
+1999-01-19T09:00:00
+1999-01-20T09:00:00
+1999-01-21T09:00:00
+1999-01-22T09:00:00
+1999-01-23T09:00:00
+1999-01-24T09:00:00
+1999-01-25T09:00:00
+1999-01-26T09:00:00
+1999-01-27T09:00:00
+1999-01-28T09:00:00
+1999-01-29T09:00:00
+1999-01-30T09:00:00
+1999-01-31T09:00:00
+2000-01-01T09:00:00
+2000-01-02T09:00:00
+2000-01-03T09:00:00
+2000-01-04T09:00:00
+2000-01-05T09:00:00
+2000-01-06T09:00:00
+2000-01-07T09:00:00
+2000-01-08T09:00:00
+2000-01-09T09:00:00
+2000-01-10T09:00:00
+2000-01-11T09:00:00
+2000-01-12T09:00:00
+2000-01-13T09:00:00
+2000-01-14T09:00:00
+2000-01-15T09:00:00
+2000-01-16T09:00:00
+2000-01-17T09:00:00
+2000-01-18T09:00:00
+2000-01-19T09:00:00
+2000-01-20T09:00:00
+2000-01-21T09:00:00
+2000-01-22T09:00:00
+2000-01-23T09:00:00
+2000-01-24T09:00:00
+2000-01-25T09:00:00
+2000-01-26T09:00:00
+2000-01-27T09:00:00
+2000-01-28T09:00:00
+2000-01-29T09:00:00
+2000-01-30T09:00:00
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase06.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase06.ics.prev.ref
new file mode 100644
index 00000000..bc435572
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase06.ics.prev.ref
@@ -0,0 +1,93 @@
+2000-01-30T09:00:00
+2000-01-29T09:00:00
+2000-01-28T09:00:00
+2000-01-27T09:00:00
+2000-01-26T09:00:00
+2000-01-25T09:00:00
+2000-01-24T09:00:00
+2000-01-23T09:00:00
+2000-01-22T09:00:00
+2000-01-21T09:00:00
+2000-01-20T09:00:00
+2000-01-19T09:00:00
+2000-01-18T09:00:00
+2000-01-17T09:00:00
+2000-01-16T09:00:00
+2000-01-15T09:00:00
+2000-01-14T09:00:00
+2000-01-13T09:00:00
+2000-01-12T09:00:00
+2000-01-11T09:00:00
+2000-01-10T09:00:00
+2000-01-09T09:00:00
+2000-01-08T09:00:00
+2000-01-07T09:00:00
+2000-01-06T09:00:00
+2000-01-05T09:00:00
+2000-01-04T09:00:00
+2000-01-03T09:00:00
+2000-01-02T09:00:00
+2000-01-01T09:00:00
+1999-01-31T09:00:00
+1999-01-30T09:00:00
+1999-01-29T09:00:00
+1999-01-28T09:00:00
+1999-01-27T09:00:00
+1999-01-26T09:00:00
+1999-01-25T09:00:00
+1999-01-24T09:00:00
+1999-01-23T09:00:00
+1999-01-22T09:00:00
+1999-01-21T09:00:00
+1999-01-20T09:00:00
+1999-01-19T09:00:00
+1999-01-18T09:00:00
+1999-01-17T09:00:00
+1999-01-16T09:00:00
+1999-01-15T09:00:00
+1999-01-14T09:00:00
+1999-01-13T09:00:00
+1999-01-12T09:00:00
+1999-01-11T09:00:00
+1999-01-10T09:00:00
+1999-01-09T09:00:00
+1999-01-08T09:00:00
+1999-01-07T09:00:00
+1999-01-06T09:00:00
+1999-01-05T09:00:00
+1999-01-04T09:00:00
+1999-01-03T09:00:00
+1999-01-02T09:00:00
+1999-01-01T09:00:00
+1998-01-31T09:00:00
+1998-01-30T09:00:00
+1998-01-29T09:00:00
+1998-01-28T09:00:00
+1998-01-27T09:00:00
+1998-01-26T09:00:00
+1998-01-25T09:00:00
+1998-01-24T09:00:00
+1998-01-23T09:00:00
+1998-01-22T09:00:00
+1998-01-21T09:00:00
+1998-01-20T09:00:00
+1998-01-19T09:00:00
+1998-01-18T09:00:00
+1998-01-17T09:00:00
+1998-01-16T09:00:00
+1998-01-15T09:00:00
+1998-01-14T09:00:00
+1998-01-13T09:00:00
+1998-01-12T09:00:00
+1998-01-11T09:00:00
+1998-01-10T09:00:00
+1998-01-09T09:00:00
+1998-01-08T09:00:00
+1998-01-07T09:00:00
+1998-01-06T09:00:00
+1998-01-05T09:00:00
+1998-01-04T09:00:00
+1998-01-03T09:00:00
+1998-01-02T09:00:00
+1998-01-01T09:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase06.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase06.ics.recurson.ref
new file mode 100644
index 00000000..c4b2c828
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase06.ics.recurson.ref
@@ -0,0 +1,93 @@
+1998-01-01
+1998-01-02
+1998-01-03
+1998-01-04
+1998-01-05
+1998-01-06
+1998-01-07
+1998-01-08
+1998-01-09
+1998-01-10
+1998-01-11
+1998-01-12
+1998-01-13
+1998-01-14
+1998-01-15
+1998-01-16
+1998-01-17
+1998-01-18
+1998-01-19
+1998-01-20
+1998-01-21
+1998-01-22
+1998-01-23
+1998-01-24
+1998-01-25
+1998-01-26
+1998-01-27
+1998-01-28
+1998-01-29
+1998-01-30
+1998-01-31
+1999-01-01
+1999-01-02
+1999-01-03
+1999-01-04
+1999-01-05
+1999-01-06
+1999-01-07
+1999-01-08
+1999-01-09
+1999-01-10
+1999-01-11
+1999-01-12
+1999-01-13
+1999-01-14
+1999-01-15
+1999-01-16
+1999-01-17
+1999-01-18
+1999-01-19
+1999-01-20
+1999-01-21
+1999-01-22
+1999-01-23
+1999-01-24
+1999-01-25
+1999-01-26
+1999-01-27
+1999-01-28
+1999-01-29
+1999-01-30
+1999-01-31
+2000-01-01
+2000-01-02
+2000-01-03
+2000-01-04
+2000-01-05
+2000-01-06
+2000-01-07
+2000-01-08
+2000-01-09
+2000-01-10
+2000-01-11
+2000-01-12
+2000-01-13
+2000-01-14
+2000-01-15
+2000-01-16
+2000-01-17
+2000-01-18
+2000-01-19
+2000-01-20
+2000-01-21
+2000-01-22
+2000-01-23
+2000-01-24
+2000-01-25
+2000-01-26
+2000-01-27
+2000-01-28
+2000-01-29
+2000-01-30
+
diff --git a/libkcal/tests/data/RecurrenceRule/UntilInUTC/readme.txt b/libkcal/tests/data/RecurrenceRule/UntilInUTC/readme.txt
new file mode 100644
index 00000000..15d10953
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/UntilInUTC/readme.txt
@@ -0,0 +1,25 @@
+RFC 2445 says that the UNTIL in an RRULE needs to be given in UTC. The test
+files in this directory check for this.
+
+For example, in the following RRULE the recurrence on Jan 31, 2000, 09:00
+local time would be after Jan 31,2000, 09:00 UTC (=UNTIL). So the last
+occurrence is on jan 30, 2000:
+ DTSTART;TZID=America/Los_Angeles:19980101T090000
+ RRULE:FREQ=YEARLY;UNTIL=20000131T090000Z;INTERVAL=1;BYDAY=SU,MO,TU,WE,TH,FR,SA;BYMONTH=1
+
+Similarly, in this example the UNTIL in UTC is actually before 12:00 local
+time, so the only occurrence is at 09:00:
+ DTSTART;TZID=America/Los_Angeles:19970902T090000
+ RRULE:FREQ=HOURLY;UNTIL=19970902T170000Z;INTERVAL=3
+
+
+Several of these test cases are simply copied from other directories of this test suite:
+Until_TestCase06.ics: LibICal/LibICal_TestCase14.ics
+Until_TestCase05.ics: LibICal/LibICal_TestCase13.ics
+Until_TestCase04.ics: LibICal/LibICal_TestCase47.ics
+Until_TestCase03.ics: LibICal/LibICal_TestCase22.ics
+
+
+
+
+
diff --git a/libkcal/tests/data/RecurrenceRule/readme.txt b/libkcal/tests/data/RecurrenceRule/readme.txt
new file mode 100644
index 00000000..69571fb7
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/readme.txt
@@ -0,0 +1,3 @@
+These files belong to LibKCal's test suite. Their main goal is to check
+various aspects of recurrence rules. See the readme.txt files in each
+subdirectory for more information about the purposes of them.
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/PayDay.ics b/libkcal/tests/data/RecurrenceRule/unsorted/PayDay.ics
new file mode 100644
index 00000000..b9c2fe34
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/PayDay.ics
@@ -0,0 +1,31 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Cyrusoft International\, Inc.//Mulberry v4.0//EN
+VERSION:2.0
+X-WR-CALNAME:PayDay
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US/Eastern
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20050211T173501Z
+DTSTART;VALUE=DATE:20040227
+RRULE:FREQ=MONTHLY;BYDAY=-1MO,-1TU,-1WE,-1TH,-1FR;BYSETPOS=-1
+SUMMARY:PAY DAY
+UID:DC3D0301C7790B38631F1FBB@ninevah.local
+END:VEVENT
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/PayDay.ics.next.ref b/libkcal/tests/data/RecurrenceRule/unsorted/PayDay.ics.next.ref
new file mode 100644
index 00000000..33764760
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/PayDay.ics.next.ref
@@ -0,0 +1,500 @@
+2004-02-27T00:00:00
+2004-03-31T00:00:00
+2004-04-30T00:00:00
+2004-05-31T00:00:00
+2004-06-30T00:00:00
+2004-07-30T00:00:00
+2004-08-31T00:00:00
+2004-09-30T00:00:00
+2004-10-29T00:00:00
+2004-11-30T00:00:00
+2004-12-31T00:00:00
+2005-01-31T00:00:00
+2005-02-28T00:00:00
+2005-03-31T00:00:00
+2005-04-29T00:00:00
+2005-05-31T00:00:00
+2005-06-30T00:00:00
+2005-07-29T00:00:00
+2005-08-31T00:00:00
+2005-09-30T00:00:00
+2005-10-31T00:00:00
+2005-11-30T00:00:00
+2005-12-30T00:00:00
+2006-01-31T00:00:00
+2006-02-28T00:00:00
+2006-03-31T00:00:00
+2006-04-28T00:00:00
+2006-05-31T00:00:00
+2006-06-30T00:00:00
+2006-07-31T00:00:00
+2006-08-31T00:00:00
+2006-09-29T00:00:00
+2006-10-31T00:00:00
+2006-11-30T00:00:00
+2006-12-29T00:00:00
+2007-01-31T00:00:00
+2007-02-28T00:00:00
+2007-03-30T00:00:00
+2007-04-30T00:00:00
+2007-05-31T00:00:00
+2007-06-29T00:00:00
+2007-07-31T00:00:00
+2007-08-31T00:00:00
+2007-09-28T00:00:00
+2007-10-31T00:00:00
+2007-11-30T00:00:00
+2007-12-31T00:00:00
+2008-01-31T00:00:00
+2008-02-29T00:00:00
+2008-03-31T00:00:00
+2008-04-30T00:00:00
+2008-05-30T00:00:00
+2008-06-30T00:00:00
+2008-07-31T00:00:00
+2008-08-29T00:00:00
+2008-09-30T00:00:00
+2008-10-31T00:00:00
+2008-11-28T00:00:00
+2008-12-31T00:00:00
+2009-01-30T00:00:00
+2009-02-27T00:00:00
+2009-03-31T00:00:00
+2009-04-30T00:00:00
+2009-05-29T00:00:00
+2009-06-30T00:00:00
+2009-07-31T00:00:00
+2009-08-31T00:00:00
+2009-09-30T00:00:00
+2009-10-30T00:00:00
+2009-11-30T00:00:00
+2009-12-31T00:00:00
+2010-01-29T00:00:00
+2010-02-26T00:00:00
+2010-03-31T00:00:00
+2010-04-30T00:00:00
+2010-05-31T00:00:00
+2010-06-30T00:00:00
+2010-07-30T00:00:00
+2010-08-31T00:00:00
+2010-09-30T00:00:00
+2010-10-29T00:00:00
+2010-11-30T00:00:00
+2010-12-31T00:00:00
+2011-01-31T00:00:00
+2011-02-28T00:00:00
+2011-03-31T00:00:00
+2011-04-29T00:00:00
+2011-05-31T00:00:00
+2011-06-30T00:00:00
+2011-07-29T00:00:00
+2011-08-31T00:00:00
+2011-09-30T00:00:00
+2011-10-31T00:00:00
+2011-11-30T00:00:00
+2011-12-30T00:00:00
+2012-01-31T00:00:00
+2012-02-29T00:00:00
+2012-03-30T00:00:00
+2012-04-30T00:00:00
+2012-05-31T00:00:00
+2012-06-29T00:00:00
+2012-07-31T00:00:00
+2012-08-31T00:00:00
+2012-09-28T00:00:00
+2012-10-31T00:00:00
+2012-11-30T00:00:00
+2012-12-31T00:00:00
+2013-01-31T00:00:00
+2013-02-28T00:00:00
+2013-03-29T00:00:00
+2013-04-30T00:00:00
+2013-05-31T00:00:00
+2013-06-28T00:00:00
+2013-07-31T00:00:00
+2013-08-30T00:00:00
+2013-09-30T00:00:00
+2013-10-31T00:00:00
+2013-11-29T00:00:00
+2013-12-31T00:00:00
+2014-01-31T00:00:00
+2014-02-28T00:00:00
+2014-03-31T00:00:00
+2014-04-30T00:00:00
+2014-05-30T00:00:00
+2014-06-30T00:00:00
+2014-07-31T00:00:00
+2014-08-29T00:00:00
+2014-09-30T00:00:00
+2014-10-31T00:00:00
+2014-11-28T00:00:00
+2014-12-31T00:00:00
+2015-01-30T00:00:00
+2015-02-27T00:00:00
+2015-03-31T00:00:00
+2015-04-30T00:00:00
+2015-05-29T00:00:00
+2015-06-30T00:00:00
+2015-07-31T00:00:00
+2015-08-31T00:00:00
+2015-09-30T00:00:00
+2015-10-30T00:00:00
+2015-11-30T00:00:00
+2015-12-31T00:00:00
+2016-01-29T00:00:00
+2016-02-29T00:00:00
+2016-03-31T00:00:00
+2016-04-29T00:00:00
+2016-05-31T00:00:00
+2016-06-30T00:00:00
+2016-07-29T00:00:00
+2016-08-31T00:00:00
+2016-09-30T00:00:00
+2016-10-31T00:00:00
+2016-11-30T00:00:00
+2016-12-30T00:00:00
+2017-01-31T00:00:00
+2017-02-28T00:00:00
+2017-03-31T00:00:00
+2017-04-28T00:00:00
+2017-05-31T00:00:00
+2017-06-30T00:00:00
+2017-07-31T00:00:00
+2017-08-31T00:00:00
+2017-09-29T00:00:00
+2017-10-31T00:00:00
+2017-11-30T00:00:00
+2017-12-29T00:00:00
+2018-01-31T00:00:00
+2018-02-28T00:00:00
+2018-03-30T00:00:00
+2018-04-30T00:00:00
+2018-05-31T00:00:00
+2018-06-29T00:00:00
+2018-07-31T00:00:00
+2018-08-31T00:00:00
+2018-09-28T00:00:00
+2018-10-31T00:00:00
+2018-11-30T00:00:00
+2018-12-31T00:00:00
+2019-01-31T00:00:00
+2019-02-28T00:00:00
+2019-03-29T00:00:00
+2019-04-30T00:00:00
+2019-05-31T00:00:00
+2019-06-28T00:00:00
+2019-07-31T00:00:00
+2019-08-30T00:00:00
+2019-09-30T00:00:00
+2019-10-31T00:00:00
+2019-11-29T00:00:00
+2019-12-31T00:00:00
+2020-01-31T00:00:00
+2020-02-28T00:00:00
+2020-03-31T00:00:00
+2020-04-30T00:00:00
+2020-05-29T00:00:00
+2020-06-30T00:00:00
+2020-07-31T00:00:00
+2020-08-31T00:00:00
+2020-09-30T00:00:00
+2020-10-30T00:00:00
+2020-11-30T00:00:00
+2020-12-31T00:00:00
+2021-01-29T00:00:00
+2021-02-26T00:00:00
+2021-03-31T00:00:00
+2021-04-30T00:00:00
+2021-05-31T00:00:00
+2021-06-30T00:00:00
+2021-07-30T00:00:00
+2021-08-31T00:00:00
+2021-09-30T00:00:00
+2021-10-29T00:00:00
+2021-11-30T00:00:00
+2021-12-31T00:00:00
+2022-01-31T00:00:00
+2022-02-28T00:00:00
+2022-03-31T00:00:00
+2022-04-29T00:00:00
+2022-05-31T00:00:00
+2022-06-30T00:00:00
+2022-07-29T00:00:00
+2022-08-31T00:00:00
+2022-09-30T00:00:00
+2022-10-31T00:00:00
+2022-11-30T00:00:00
+2022-12-30T00:00:00
+2023-01-31T00:00:00
+2023-02-28T00:00:00
+2023-03-31T00:00:00
+2023-04-28T00:00:00
+2023-05-31T00:00:00
+2023-06-30T00:00:00
+2023-07-31T00:00:00
+2023-08-31T00:00:00
+2023-09-29T00:00:00
+2023-10-31T00:00:00
+2023-11-30T00:00:00
+2023-12-29T00:00:00
+2024-01-31T00:00:00
+2024-02-29T00:00:00
+2024-03-29T00:00:00
+2024-04-30T00:00:00
+2024-05-31T00:00:00
+2024-06-28T00:00:00
+2024-07-31T00:00:00
+2024-08-30T00:00:00
+2024-09-30T00:00:00
+2024-10-31T00:00:00
+2024-11-29T00:00:00
+2024-12-31T00:00:00
+2025-01-31T00:00:00
+2025-02-28T00:00:00
+2025-03-31T00:00:00
+2025-04-30T00:00:00
+2025-05-30T00:00:00
+2025-06-30T00:00:00
+2025-07-31T00:00:00
+2025-08-29T00:00:00
+2025-09-30T00:00:00
+2025-10-31T00:00:00
+2025-11-28T00:00:00
+2025-12-31T00:00:00
+2026-01-30T00:00:00
+2026-02-27T00:00:00
+2026-03-31T00:00:00
+2026-04-30T00:00:00
+2026-05-29T00:00:00
+2026-06-30T00:00:00
+2026-07-31T00:00:00
+2026-08-31T00:00:00
+2026-09-30T00:00:00
+2026-10-30T00:00:00
+2026-11-30T00:00:00
+2026-12-31T00:00:00
+2027-01-29T00:00:00
+2027-02-26T00:00:00
+2027-03-31T00:00:00
+2027-04-30T00:00:00
+2027-05-31T00:00:00
+2027-06-30T00:00:00
+2027-07-30T00:00:00
+2027-08-31T00:00:00
+2027-09-30T00:00:00
+2027-10-29T00:00:00
+2027-11-30T00:00:00
+2027-12-31T00:00:00
+2028-01-31T00:00:00
+2028-02-29T00:00:00
+2028-03-31T00:00:00
+2028-04-28T00:00:00
+2028-05-31T00:00:00
+2028-06-30T00:00:00
+2028-07-31T00:00:00
+2028-08-31T00:00:00
+2028-09-29T00:00:00
+2028-10-31T00:00:00
+2028-11-30T00:00:00
+2028-12-29T00:00:00
+2029-01-31T00:00:00
+2029-02-28T00:00:00
+2029-03-30T00:00:00
+2029-04-30T00:00:00
+2029-05-31T00:00:00
+2029-06-29T00:00:00
+2029-07-31T00:00:00
+2029-08-31T00:00:00
+2029-09-28T00:00:00
+2029-10-31T00:00:00
+2029-11-30T00:00:00
+2029-12-31T00:00:00
+2030-01-31T00:00:00
+2030-02-28T00:00:00
+2030-03-29T00:00:00
+2030-04-30T00:00:00
+2030-05-31T00:00:00
+2030-06-28T00:00:00
+2030-07-31T00:00:00
+2030-08-30T00:00:00
+2030-09-30T00:00:00
+2030-10-31T00:00:00
+2030-11-29T00:00:00
+2030-12-31T00:00:00
+2031-01-31T00:00:00
+2031-02-28T00:00:00
+2031-03-31T00:00:00
+2031-04-30T00:00:00
+2031-05-30T00:00:00
+2031-06-30T00:00:00
+2031-07-31T00:00:00
+2031-08-29T00:00:00
+2031-09-30T00:00:00
+2031-10-31T00:00:00
+2031-11-28T00:00:00
+2031-12-31T00:00:00
+2032-01-30T00:00:00
+2032-02-27T00:00:00
+2032-03-31T00:00:00
+2032-04-30T00:00:00
+2032-05-31T00:00:00
+2032-06-30T00:00:00
+2032-07-30T00:00:00
+2032-08-31T00:00:00
+2032-09-30T00:00:00
+2032-10-29T00:00:00
+2032-11-30T00:00:00
+2032-12-31T00:00:00
+2033-01-31T00:00:00
+2033-02-28T00:00:00
+2033-03-31T00:00:00
+2033-04-29T00:00:00
+2033-05-31T00:00:00
+2033-06-30T00:00:00
+2033-07-29T00:00:00
+2033-08-31T00:00:00
+2033-09-30T00:00:00
+2033-10-31T00:00:00
+2033-11-30T00:00:00
+2033-12-30T00:00:00
+2034-01-31T00:00:00
+2034-02-28T00:00:00
+2034-03-31T00:00:00
+2034-04-28T00:00:00
+2034-05-31T00:00:00
+2034-06-30T00:00:00
+2034-07-31T00:00:00
+2034-08-31T00:00:00
+2034-09-29T00:00:00
+2034-10-31T00:00:00
+2034-11-30T00:00:00
+2034-12-29T00:00:00
+2035-01-31T00:00:00
+2035-02-28T00:00:00
+2035-03-30T00:00:00
+2035-04-30T00:00:00
+2035-05-31T00:00:00
+2035-06-29T00:00:00
+2035-07-31T00:00:00
+2035-08-31T00:00:00
+2035-09-28T00:00:00
+2035-10-31T00:00:00
+2035-11-30T00:00:00
+2035-12-31T00:00:00
+2036-01-31T00:00:00
+2036-02-29T00:00:00
+2036-03-31T00:00:00
+2036-04-30T00:00:00
+2036-05-30T00:00:00
+2036-06-30T00:00:00
+2036-07-31T00:00:00
+2036-08-29T00:00:00
+2036-09-30T00:00:00
+2036-10-31T00:00:00
+2036-11-28T00:00:00
+2036-12-31T00:00:00
+2037-01-30T00:00:00
+2037-02-27T00:00:00
+2037-03-31T00:00:00
+2037-04-30T00:00:00
+2037-05-29T00:00:00
+2037-06-30T00:00:00
+2037-07-31T00:00:00
+2037-08-31T00:00:00
+2037-09-30T00:00:00
+2037-10-30T00:00:00
+2037-11-30T00:00:00
+2037-12-31T00:00:00
+2038-01-29T00:00:00
+2038-02-26T00:00:00
+2038-03-31T00:00:00
+2038-04-30T00:00:00
+2038-05-31T00:00:00
+2038-06-30T00:00:00
+2038-07-30T00:00:00
+2038-08-31T00:00:00
+2038-09-30T00:00:00
+2038-10-29T00:00:00
+2038-11-30T00:00:00
+2038-12-31T00:00:00
+2039-01-31T00:00:00
+2039-02-28T00:00:00
+2039-03-31T00:00:00
+2039-04-29T00:00:00
+2039-05-31T00:00:00
+2039-06-30T00:00:00
+2039-07-29T00:00:00
+2039-08-31T00:00:00
+2039-09-30T00:00:00
+2039-10-31T00:00:00
+2039-11-30T00:00:00
+2039-12-30T00:00:00
+2040-01-31T00:00:00
+2040-02-29T00:00:00
+2040-03-30T00:00:00
+2040-04-30T00:00:00
+2040-05-31T00:00:00
+2040-06-29T00:00:00
+2040-07-31T00:00:00
+2040-08-31T00:00:00
+2040-09-28T00:00:00
+2040-10-31T00:00:00
+2040-11-30T00:00:00
+2040-12-31T00:00:00
+2041-01-31T00:00:00
+2041-02-28T00:00:00
+2041-03-29T00:00:00
+2041-04-30T00:00:00
+2041-05-31T00:00:00
+2041-06-28T00:00:00
+2041-07-31T00:00:00
+2041-08-30T00:00:00
+2041-09-30T00:00:00
+2041-10-31T00:00:00
+2041-11-29T00:00:00
+2041-12-31T00:00:00
+2042-01-31T00:00:00
+2042-02-28T00:00:00
+2042-03-31T00:00:00
+2042-04-30T00:00:00
+2042-05-30T00:00:00
+2042-06-30T00:00:00
+2042-07-31T00:00:00
+2042-08-29T00:00:00
+2042-09-30T00:00:00
+2042-10-31T00:00:00
+2042-11-28T00:00:00
+2042-12-31T00:00:00
+2043-01-30T00:00:00
+2043-02-27T00:00:00
+2043-03-31T00:00:00
+2043-04-30T00:00:00
+2043-05-29T00:00:00
+2043-06-30T00:00:00
+2043-07-31T00:00:00
+2043-08-31T00:00:00
+2043-09-30T00:00:00
+2043-10-30T00:00:00
+2043-11-30T00:00:00
+2043-12-31T00:00:00
+2044-01-29T00:00:00
+2044-02-29T00:00:00
+2044-03-31T00:00:00
+2044-04-29T00:00:00
+2044-05-31T00:00:00
+2044-06-30T00:00:00
+2044-07-29T00:00:00
+2044-08-31T00:00:00
+2044-09-30T00:00:00
+2044-10-31T00:00:00
+2044-11-30T00:00:00
+2044-12-30T00:00:00
+2045-01-31T00:00:00
+2045-02-28T00:00:00
+2045-03-31T00:00:00
+2045-04-28T00:00:00
+2045-05-31T00:00:00
+2045-06-30T00:00:00
+2045-07-31T00:00:00
+2045-08-31T00:00:00
+2045-09-29T00:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/PayDay.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/unsorted/PayDay.ics.prev.ref
new file mode 100644
index 00000000..b24533d8
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/PayDay.ics.prev.ref
@@ -0,0 +1,84 @@
+2010-12-31T00:00:00
+2010-11-30T00:00:00
+2010-10-29T00:00:00
+2010-09-30T00:00:00
+2010-08-31T00:00:00
+2010-07-30T00:00:00
+2010-06-30T00:00:00
+2010-05-31T00:00:00
+2010-04-30T00:00:00
+2010-03-31T00:00:00
+2010-02-26T00:00:00
+2010-01-29T00:00:00
+2009-12-31T00:00:00
+2009-11-30T00:00:00
+2009-10-30T00:00:00
+2009-09-30T00:00:00
+2009-08-31T00:00:00
+2009-07-31T00:00:00
+2009-06-30T00:00:00
+2009-05-29T00:00:00
+2009-04-30T00:00:00
+2009-03-31T00:00:00
+2009-02-27T00:00:00
+2009-01-30T00:00:00
+2008-12-31T00:00:00
+2008-11-28T00:00:00
+2008-10-31T00:00:00
+2008-09-30T00:00:00
+2008-08-29T00:00:00
+2008-07-31T00:00:00
+2008-06-30T00:00:00
+2008-05-30T00:00:00
+2008-04-30T00:00:00
+2008-03-31T00:00:00
+2008-02-29T00:00:00
+2008-01-31T00:00:00
+2007-12-31T00:00:00
+2007-11-30T00:00:00
+2007-10-31T00:00:00
+2007-09-28T00:00:00
+2007-08-31T00:00:00
+2007-07-31T00:00:00
+2007-06-29T00:00:00
+2007-05-31T00:00:00
+2007-04-30T00:00:00
+2007-03-30T00:00:00
+2007-02-28T00:00:00
+2007-01-31T00:00:00
+2006-12-29T00:00:00
+2006-11-30T00:00:00
+2006-10-31T00:00:00
+2006-09-29T00:00:00
+2006-08-31T00:00:00
+2006-07-31T00:00:00
+2006-06-30T00:00:00
+2006-05-31T00:00:00
+2006-04-28T00:00:00
+2006-03-31T00:00:00
+2006-02-28T00:00:00
+2006-01-31T00:00:00
+2005-12-30T00:00:00
+2005-11-30T00:00:00
+2005-10-31T00:00:00
+2005-09-30T00:00:00
+2005-08-31T00:00:00
+2005-07-29T00:00:00
+2005-06-30T00:00:00
+2005-05-31T00:00:00
+2005-04-29T00:00:00
+2005-03-31T00:00:00
+2005-02-28T00:00:00
+2005-01-31T00:00:00
+2004-12-31T00:00:00
+2004-11-30T00:00:00
+2004-10-29T00:00:00
+2004-09-30T00:00:00
+2004-08-31T00:00:00
+2004-07-30T00:00:00
+2004-06-30T00:00:00
+2004-05-31T00:00:00
+2004-04-30T00:00:00
+2004-03-31T00:00:00
+2004-02-27T00:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/PayDay.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/unsorted/PayDay.ics.recurson.ref
new file mode 100644
index 00000000..92b00d48
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/PayDay.ics.recurson.ref
@@ -0,0 +1,83 @@
+2004-02-27
+2004-03-31
+2004-04-30
+2004-05-31
+2004-06-30
+2004-07-30
+2004-08-31
+2004-09-30
+2004-10-29
+2004-11-30
+2004-12-31
+2005-01-31
+2005-02-28
+2005-03-31
+2005-04-29
+2005-05-31
+2005-06-30
+2005-07-29
+2005-08-31
+2005-09-30
+2005-10-31
+2005-11-30
+2005-12-30
+2006-01-31
+2006-02-28
+2006-03-31
+2006-04-28
+2006-05-31
+2006-06-30
+2006-07-31
+2006-08-31
+2006-09-29
+2006-10-31
+2006-11-30
+2006-12-29
+2007-01-31
+2007-02-28
+2007-03-30
+2007-04-30
+2007-05-31
+2007-06-29
+2007-07-31
+2007-08-31
+2007-09-28
+2007-10-31
+2007-11-30
+2007-12-31
+2008-01-31
+2008-02-29
+2008-03-31
+2008-04-30
+2008-05-30
+2008-06-30
+2008-07-31
+2008-08-29
+2008-09-30
+2008-10-31
+2008-11-28
+2008-12-31
+2009-01-30
+2009-02-27
+2009-03-31
+2009-04-30
+2009-05-29
+2009-06-30
+2009-07-31
+2009-08-31
+2009-09-30
+2009-10-30
+2009-11-30
+2009-12-31
+2010-01-29
+2010-02-26
+2010-03-31
+2010-04-30
+2010-05-31
+2010-06-30
+2010-07-30
+2010-08-31
+2010-09-30
+2010-10-29
+2010-11-30
+2010-12-31
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/anniversary_4.6.1.ics b/libkcal/tests/data/RecurrenceRule/unsorted/anniversary_4.6.1.ics
new file mode 100644
index 00000000..62471fd4
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/anniversary_4.6.1.ics
@@ -0,0 +1,13 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//KDE//LibKCal test cases 1.0//EN
+X-LibKCal-Testsuite-OutTZ:UTC
+
+BEGIN:VEVENT
+UID:19970901T130000Z-123403@host.com
+DTSTART:19971102
+SUMMARY:Yearly, on Nov 2, but date is taken from DTSTART, floating
+RRULE:FREQ=YEARLY
+END:VEVENT
+
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/anniversary_4.6.1.ics.next.ref b/libkcal/tests/data/RecurrenceRule/unsorted/anniversary_4.6.1.ics.next.ref
new file mode 100644
index 00000000..9ee6a573
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/anniversary_4.6.1.ics.next.ref
@@ -0,0 +1,500 @@
+1997-11-02T00:00:00
+1998-11-02T00:00:00
+1999-11-02T00:00:00
+2000-11-02T00:00:00
+2001-11-02T00:00:00
+2002-11-02T00:00:00
+2003-11-02T00:00:00
+2004-11-02T00:00:00
+2005-11-02T00:00:00
+2006-11-02T00:00:00
+2007-11-02T00:00:00
+2008-11-02T00:00:00
+2009-11-02T00:00:00
+2010-11-02T00:00:00
+2011-11-02T00:00:00
+2012-11-02T00:00:00
+2013-11-02T00:00:00
+2014-11-02T00:00:00
+2015-11-02T00:00:00
+2016-11-02T00:00:00
+2017-11-02T00:00:00
+2018-11-02T00:00:00
+2019-11-02T00:00:00
+2020-11-02T00:00:00
+2021-11-02T00:00:00
+2022-11-02T00:00:00
+2023-11-02T00:00:00
+2024-11-02T00:00:00
+2025-11-02T00:00:00
+2026-11-02T00:00:00
+2027-11-02T00:00:00
+2028-11-02T00:00:00
+2029-11-02T00:00:00
+2030-11-02T00:00:00
+2031-11-02T00:00:00
+2032-11-02T00:00:00
+2033-11-02T00:00:00
+2034-11-02T00:00:00
+2035-11-02T00:00:00
+2036-11-02T00:00:00
+2037-11-02T00:00:00
+2038-11-02T00:00:00
+2039-11-02T00:00:00
+2040-11-02T00:00:00
+2041-11-02T00:00:00
+2042-11-02T00:00:00
+2043-11-02T00:00:00
+2044-11-02T00:00:00
+2045-11-02T00:00:00
+2046-11-02T00:00:00
+2047-11-02T00:00:00
+2048-11-02T00:00:00
+2049-11-02T00:00:00
+2050-11-02T00:00:00
+2051-11-02T00:00:00
+2052-11-02T00:00:00
+2053-11-02T00:00:00
+2054-11-02T00:00:00
+2055-11-02T00:00:00
+2056-11-02T00:00:00
+2057-11-02T00:00:00
+2058-11-02T00:00:00
+2059-11-02T00:00:00
+2060-11-02T00:00:00
+2061-11-02T00:00:00
+2062-11-02T00:00:00
+2063-11-02T00:00:00
+2064-11-02T00:00:00
+2065-11-02T00:00:00
+2066-11-02T00:00:00
+2067-11-02T00:00:00
+2068-11-02T00:00:00
+2069-11-02T00:00:00
+2070-11-02T00:00:00
+2071-11-02T00:00:00
+2072-11-02T00:00:00
+2073-11-02T00:00:00
+2074-11-02T00:00:00
+2075-11-02T00:00:00
+2076-11-02T00:00:00
+2077-11-02T00:00:00
+2078-11-02T00:00:00
+2079-11-02T00:00:00
+2080-11-02T00:00:00
+2081-11-02T00:00:00
+2082-11-02T00:00:00
+2083-11-02T00:00:00
+2084-11-02T00:00:00
+2085-11-02T00:00:00
+2086-11-02T00:00:00
+2087-11-02T00:00:00
+2088-11-02T00:00:00
+2089-11-02T00:00:00
+2090-11-02T00:00:00
+2091-11-02T00:00:00
+2092-11-02T00:00:00
+2093-11-02T00:00:00
+2094-11-02T00:00:00
+2095-11-02T00:00:00
+2096-11-02T00:00:00
+2097-11-02T00:00:00
+2098-11-02T00:00:00
+2099-11-02T00:00:00
+2100-11-02T00:00:00
+2101-11-02T00:00:00
+2102-11-02T00:00:00
+2103-11-02T00:00:00
+2104-11-02T00:00:00
+2105-11-02T00:00:00
+2106-11-02T00:00:00
+2107-11-02T00:00:00
+2108-11-02T00:00:00
+2109-11-02T00:00:00
+2110-11-02T00:00:00
+2111-11-02T00:00:00
+2112-11-02T00:00:00
+2113-11-02T00:00:00
+2114-11-02T00:00:00
+2115-11-02T00:00:00
+2116-11-02T00:00:00
+2117-11-02T00:00:00
+2118-11-02T00:00:00
+2119-11-02T00:00:00
+2120-11-02T00:00:00
+2121-11-02T00:00:00
+2122-11-02T00:00:00
+2123-11-02T00:00:00
+2124-11-02T00:00:00
+2125-11-02T00:00:00
+2126-11-02T00:00:00
+2127-11-02T00:00:00
+2128-11-02T00:00:00
+2129-11-02T00:00:00
+2130-11-02T00:00:00
+2131-11-02T00:00:00
+2132-11-02T00:00:00
+2133-11-02T00:00:00
+2134-11-02T00:00:00
+2135-11-02T00:00:00
+2136-11-02T00:00:00
+2137-11-02T00:00:00
+2138-11-02T00:00:00
+2139-11-02T00:00:00
+2140-11-02T00:00:00
+2141-11-02T00:00:00
+2142-11-02T00:00:00
+2143-11-02T00:00:00
+2144-11-02T00:00:00
+2145-11-02T00:00:00
+2146-11-02T00:00:00
+2147-11-02T00:00:00
+2148-11-02T00:00:00
+2149-11-02T00:00:00
+2150-11-02T00:00:00
+2151-11-02T00:00:00
+2152-11-02T00:00:00
+2153-11-02T00:00:00
+2154-11-02T00:00:00
+2155-11-02T00:00:00
+2156-11-02T00:00:00
+2157-11-02T00:00:00
+2158-11-02T00:00:00
+2159-11-02T00:00:00
+2160-11-02T00:00:00
+2161-11-02T00:00:00
+2162-11-02T00:00:00
+2163-11-02T00:00:00
+2164-11-02T00:00:00
+2165-11-02T00:00:00
+2166-11-02T00:00:00
+2167-11-02T00:00:00
+2168-11-02T00:00:00
+2169-11-02T00:00:00
+2170-11-02T00:00:00
+2171-11-02T00:00:00
+2172-11-02T00:00:00
+2173-11-02T00:00:00
+2174-11-02T00:00:00
+2175-11-02T00:00:00
+2176-11-02T00:00:00
+2177-11-02T00:00:00
+2178-11-02T00:00:00
+2179-11-02T00:00:00
+2180-11-02T00:00:00
+2181-11-02T00:00:00
+2182-11-02T00:00:00
+2183-11-02T00:00:00
+2184-11-02T00:00:00
+2185-11-02T00:00:00
+2186-11-02T00:00:00
+2187-11-02T00:00:00
+2188-11-02T00:00:00
+2189-11-02T00:00:00
+2190-11-02T00:00:00
+2191-11-02T00:00:00
+2192-11-02T00:00:00
+2193-11-02T00:00:00
+2194-11-02T00:00:00
+2195-11-02T00:00:00
+2196-11-02T00:00:00
+2197-11-02T00:00:00
+2198-11-02T00:00:00
+2199-11-02T00:00:00
+2200-11-02T00:00:00
+2201-11-02T00:00:00
+2202-11-02T00:00:00
+2203-11-02T00:00:00
+2204-11-02T00:00:00
+2205-11-02T00:00:00
+2206-11-02T00:00:00
+2207-11-02T00:00:00
+2208-11-02T00:00:00
+2209-11-02T00:00:00
+2210-11-02T00:00:00
+2211-11-02T00:00:00
+2212-11-02T00:00:00
+2213-11-02T00:00:00
+2214-11-02T00:00:00
+2215-11-02T00:00:00
+2216-11-02T00:00:00
+2217-11-02T00:00:00
+2218-11-02T00:00:00
+2219-11-02T00:00:00
+2220-11-02T00:00:00
+2221-11-02T00:00:00
+2222-11-02T00:00:00
+2223-11-02T00:00:00
+2224-11-02T00:00:00
+2225-11-02T00:00:00
+2226-11-02T00:00:00
+2227-11-02T00:00:00
+2228-11-02T00:00:00
+2229-11-02T00:00:00
+2230-11-02T00:00:00
+2231-11-02T00:00:00
+2232-11-02T00:00:00
+2233-11-02T00:00:00
+2234-11-02T00:00:00
+2235-11-02T00:00:00
+2236-11-02T00:00:00
+2237-11-02T00:00:00
+2238-11-02T00:00:00
+2239-11-02T00:00:00
+2240-11-02T00:00:00
+2241-11-02T00:00:00
+2242-11-02T00:00:00
+2243-11-02T00:00:00
+2244-11-02T00:00:00
+2245-11-02T00:00:00
+2246-11-02T00:00:00
+2247-11-02T00:00:00
+2248-11-02T00:00:00
+2249-11-02T00:00:00
+2250-11-02T00:00:00
+2251-11-02T00:00:00
+2252-11-02T00:00:00
+2253-11-02T00:00:00
+2254-11-02T00:00:00
+2255-11-02T00:00:00
+2256-11-02T00:00:00
+2257-11-02T00:00:00
+2258-11-02T00:00:00
+2259-11-02T00:00:00
+2260-11-02T00:00:00
+2261-11-02T00:00:00
+2262-11-02T00:00:00
+2263-11-02T00:00:00
+2264-11-02T00:00:00
+2265-11-02T00:00:00
+2266-11-02T00:00:00
+2267-11-02T00:00:00
+2268-11-02T00:00:00
+2269-11-02T00:00:00
+2270-11-02T00:00:00
+2271-11-02T00:00:00
+2272-11-02T00:00:00
+2273-11-02T00:00:00
+2274-11-02T00:00:00
+2275-11-02T00:00:00
+2276-11-02T00:00:00
+2277-11-02T00:00:00
+2278-11-02T00:00:00
+2279-11-02T00:00:00
+2280-11-02T00:00:00
+2281-11-02T00:00:00
+2282-11-02T00:00:00
+2283-11-02T00:00:00
+2284-11-02T00:00:00
+2285-11-02T00:00:00
+2286-11-02T00:00:00
+2287-11-02T00:00:00
+2288-11-02T00:00:00
+2289-11-02T00:00:00
+2290-11-02T00:00:00
+2291-11-02T00:00:00
+2292-11-02T00:00:00
+2293-11-02T00:00:00
+2294-11-02T00:00:00
+2295-11-02T00:00:00
+2296-11-02T00:00:00
+2297-11-02T00:00:00
+2298-11-02T00:00:00
+2299-11-02T00:00:00
+2300-11-02T00:00:00
+2301-11-02T00:00:00
+2302-11-02T00:00:00
+2303-11-02T00:00:00
+2304-11-02T00:00:00
+2305-11-02T00:00:00
+2306-11-02T00:00:00
+2307-11-02T00:00:00
+2308-11-02T00:00:00
+2309-11-02T00:00:00
+2310-11-02T00:00:00
+2311-11-02T00:00:00
+2312-11-02T00:00:00
+2313-11-02T00:00:00
+2314-11-02T00:00:00
+2315-11-02T00:00:00
+2316-11-02T00:00:00
+2317-11-02T00:00:00
+2318-11-02T00:00:00
+2319-11-02T00:00:00
+2320-11-02T00:00:00
+2321-11-02T00:00:00
+2322-11-02T00:00:00
+2323-11-02T00:00:00
+2324-11-02T00:00:00
+2325-11-02T00:00:00
+2326-11-02T00:00:00
+2327-11-02T00:00:00
+2328-11-02T00:00:00
+2329-11-02T00:00:00
+2330-11-02T00:00:00
+2331-11-02T00:00:00
+2332-11-02T00:00:00
+2333-11-02T00:00:00
+2334-11-02T00:00:00
+2335-11-02T00:00:00
+2336-11-02T00:00:00
+2337-11-02T00:00:00
+2338-11-02T00:00:00
+2339-11-02T00:00:00
+2340-11-02T00:00:00
+2341-11-02T00:00:00
+2342-11-02T00:00:00
+2343-11-02T00:00:00
+2344-11-02T00:00:00
+2345-11-02T00:00:00
+2346-11-02T00:00:00
+2347-11-02T00:00:00
+2348-11-02T00:00:00
+2349-11-02T00:00:00
+2350-11-02T00:00:00
+2351-11-02T00:00:00
+2352-11-02T00:00:00
+2353-11-02T00:00:00
+2354-11-02T00:00:00
+2355-11-02T00:00:00
+2356-11-02T00:00:00
+2357-11-02T00:00:00
+2358-11-02T00:00:00
+2359-11-02T00:00:00
+2360-11-02T00:00:00
+2361-11-02T00:00:00
+2362-11-02T00:00:00
+2363-11-02T00:00:00
+2364-11-02T00:00:00
+2365-11-02T00:00:00
+2366-11-02T00:00:00
+2367-11-02T00:00:00
+2368-11-02T00:00:00
+2369-11-02T00:00:00
+2370-11-02T00:00:00
+2371-11-02T00:00:00
+2372-11-02T00:00:00
+2373-11-02T00:00:00
+2374-11-02T00:00:00
+2375-11-02T00:00:00
+2376-11-02T00:00:00
+2377-11-02T00:00:00
+2378-11-02T00:00:00
+2379-11-02T00:00:00
+2380-11-02T00:00:00
+2381-11-02T00:00:00
+2382-11-02T00:00:00
+2383-11-02T00:00:00
+2384-11-02T00:00:00
+2385-11-02T00:00:00
+2386-11-02T00:00:00
+2387-11-02T00:00:00
+2388-11-02T00:00:00
+2389-11-02T00:00:00
+2390-11-02T00:00:00
+2391-11-02T00:00:00
+2392-11-02T00:00:00
+2393-11-02T00:00:00
+2394-11-02T00:00:00
+2395-11-02T00:00:00
+2396-11-02T00:00:00
+2397-11-02T00:00:00
+2398-11-02T00:00:00
+2399-11-02T00:00:00
+2400-11-02T00:00:00
+2401-11-02T00:00:00
+2402-11-02T00:00:00
+2403-11-02T00:00:00
+2404-11-02T00:00:00
+2405-11-02T00:00:00
+2406-11-02T00:00:00
+2407-11-02T00:00:00
+2408-11-02T00:00:00
+2409-11-02T00:00:00
+2410-11-02T00:00:00
+2411-11-02T00:00:00
+2412-11-02T00:00:00
+2413-11-02T00:00:00
+2414-11-02T00:00:00
+2415-11-02T00:00:00
+2416-11-02T00:00:00
+2417-11-02T00:00:00
+2418-11-02T00:00:00
+2419-11-02T00:00:00
+2420-11-02T00:00:00
+2421-11-02T00:00:00
+2422-11-02T00:00:00
+2423-11-02T00:00:00
+2424-11-02T00:00:00
+2425-11-02T00:00:00
+2426-11-02T00:00:00
+2427-11-02T00:00:00
+2428-11-02T00:00:00
+2429-11-02T00:00:00
+2430-11-02T00:00:00
+2431-11-02T00:00:00
+2432-11-02T00:00:00
+2433-11-02T00:00:00
+2434-11-02T00:00:00
+2435-11-02T00:00:00
+2436-11-02T00:00:00
+2437-11-02T00:00:00
+2438-11-02T00:00:00
+2439-11-02T00:00:00
+2440-11-02T00:00:00
+2441-11-02T00:00:00
+2442-11-02T00:00:00
+2443-11-02T00:00:00
+2444-11-02T00:00:00
+2445-11-02T00:00:00
+2446-11-02T00:00:00
+2447-11-02T00:00:00
+2448-11-02T00:00:00
+2449-11-02T00:00:00
+2450-11-02T00:00:00
+2451-11-02T00:00:00
+2452-11-02T00:00:00
+2453-11-02T00:00:00
+2454-11-02T00:00:00
+2455-11-02T00:00:00
+2456-11-02T00:00:00
+2457-11-02T00:00:00
+2458-11-02T00:00:00
+2459-11-02T00:00:00
+2460-11-02T00:00:00
+2461-11-02T00:00:00
+2462-11-02T00:00:00
+2463-11-02T00:00:00
+2464-11-02T00:00:00
+2465-11-02T00:00:00
+2466-11-02T00:00:00
+2467-11-02T00:00:00
+2468-11-02T00:00:00
+2469-11-02T00:00:00
+2470-11-02T00:00:00
+2471-11-02T00:00:00
+2472-11-02T00:00:00
+2473-11-02T00:00:00
+2474-11-02T00:00:00
+2475-11-02T00:00:00
+2476-11-02T00:00:00
+2477-11-02T00:00:00
+2478-11-02T00:00:00
+2479-11-02T00:00:00
+2480-11-02T00:00:00
+2481-11-02T00:00:00
+2482-11-02T00:00:00
+2483-11-02T00:00:00
+2484-11-02T00:00:00
+2485-11-02T00:00:00
+2486-11-02T00:00:00
+2487-11-02T00:00:00
+2488-11-02T00:00:00
+2489-11-02T00:00:00
+2490-11-02T00:00:00
+2491-11-02T00:00:00
+2492-11-02T00:00:00
+2493-11-02T00:00:00
+2494-11-02T00:00:00
+2495-11-02T00:00:00
+2496-11-02T00:00:00
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/anniversary_4.6.1.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/unsorted/anniversary_4.6.1.ics.prev.ref
new file mode 100644
index 00000000..7397200c
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/anniversary_4.6.1.ics.prev.ref
@@ -0,0 +1,15 @@
+2010-11-02T00:00:00
+2009-11-02T00:00:00
+2008-11-02T00:00:00
+2007-11-02T00:00:00
+2006-11-02T00:00:00
+2005-11-02T00:00:00
+2004-11-02T00:00:00
+2003-11-02T00:00:00
+2002-11-02T00:00:00
+2001-11-02T00:00:00
+2000-11-02T00:00:00
+1999-11-02T00:00:00
+1998-11-02T00:00:00
+1997-11-02T00:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/anniversary_4.6.1.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/unsorted/anniversary_4.6.1.ics.recurson.ref
new file mode 100644
index 00000000..8e382633
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/anniversary_4.6.1.ics.recurson.ref
@@ -0,0 +1,14 @@
+1997-11-02
+1998-11-02
+1999-11-02
+2000-11-02
+2001-11-02
+2002-11-02
+2003-11-02
+2004-11-02
+2005-11-02
+2006-11-02
+2007-11-02
+2008-11-02
+2009-11-02
+2010-11-02
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/daily.ics b/libkcal/tests/data/RecurrenceRule/unsorted/daily.ics
new file mode 100644
index 00000000..d820efb2
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/daily.ics
@@ -0,0 +1,16 @@
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+VERSION:2.0
+PRODID:-//MH Software Inc//Connect Daily - 3.0.7//EN
+X-LibKCal-Testsuite-OutTZ:UTC
+
+BEGIN:VEVENT
+UID:1214@67.154.139.115
+SUMMARY:Every 6 days, Month May, starting 12.5.2005
+DTSTART:20050512T031500Z
+RRULE:FREQ=DAILY;INTERVAL=6;BYMONTH=5
+DURATION:PT5H
+END:VEVENT
+
+
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/daily.ics.next.ref b/libkcal/tests/data/RecurrenceRule/unsorted/daily.ics.next.ref
new file mode 100644
index 00000000..80c12d3f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/daily.ics.next.ref
@@ -0,0 +1,500 @@
+2005-05-12T03:15:00
+2005-05-18T03:15:00
+2005-05-24T03:15:00
+2005-05-30T03:15:00
+2006-05-01T03:15:00
+2006-05-07T03:15:00
+2006-05-13T03:15:00
+2006-05-19T03:15:00
+2006-05-25T03:15:00
+2006-05-31T03:15:00
+2007-05-02T03:15:00
+2007-05-08T03:15:00
+2007-05-14T03:15:00
+2007-05-20T03:15:00
+2007-05-26T03:15:00
+2008-05-02T03:15:00
+2008-05-08T03:15:00
+2008-05-14T03:15:00
+2008-05-20T03:15:00
+2008-05-26T03:15:00
+2009-05-03T03:15:00
+2009-05-09T03:15:00
+2009-05-15T03:15:00
+2009-05-21T03:15:00
+2009-05-27T03:15:00
+2010-05-04T03:15:00
+2010-05-10T03:15:00
+2010-05-16T03:15:00
+2010-05-22T03:15:00
+2010-05-28T03:15:00
+2011-05-05T03:15:00
+2011-05-11T03:15:00
+2011-05-17T03:15:00
+2011-05-23T03:15:00
+2011-05-29T03:15:00
+2012-05-05T03:15:00
+2012-05-11T03:15:00
+2012-05-17T03:15:00
+2012-05-23T03:15:00
+2012-05-29T03:15:00
+2013-05-06T03:15:00
+2013-05-12T03:15:00
+2013-05-18T03:15:00
+2013-05-24T03:15:00
+2013-05-30T03:15:00
+2014-05-01T03:15:00
+2014-05-07T03:15:00
+2014-05-13T03:15:00
+2014-05-19T03:15:00
+2014-05-25T03:15:00
+2014-05-31T03:15:00
+2015-05-02T03:15:00
+2015-05-08T03:15:00
+2015-05-14T03:15:00
+2015-05-20T03:15:00
+2015-05-26T03:15:00
+2016-05-02T03:15:00
+2016-05-08T03:15:00
+2016-05-14T03:15:00
+2016-05-20T03:15:00
+2016-05-26T03:15:00
+2017-05-03T03:15:00
+2017-05-09T03:15:00
+2017-05-15T03:15:00
+2017-05-21T03:15:00
+2017-05-27T03:15:00
+2018-05-04T03:15:00
+2018-05-10T03:15:00
+2018-05-16T03:15:00
+2018-05-22T03:15:00
+2018-05-28T03:15:00
+2019-05-05T03:15:00
+2019-05-11T03:15:00
+2019-05-17T03:15:00
+2019-05-23T03:15:00
+2019-05-29T03:15:00
+2020-05-05T03:15:00
+2020-05-11T03:15:00
+2020-05-17T03:15:00
+2020-05-23T03:15:00
+2020-05-29T03:15:00
+2021-05-06T03:15:00
+2021-05-12T03:15:00
+2021-05-18T03:15:00
+2021-05-24T03:15:00
+2021-05-30T03:15:00
+2022-05-01T03:15:00
+2022-05-07T03:15:00
+2022-05-13T03:15:00
+2022-05-19T03:15:00
+2022-05-25T03:15:00
+2022-05-31T03:15:00
+2023-05-02T03:15:00
+2023-05-08T03:15:00
+2023-05-14T03:15:00
+2023-05-20T03:15:00
+2023-05-26T03:15:00
+2024-05-02T03:15:00
+2024-05-08T03:15:00
+2024-05-14T03:15:00
+2024-05-20T03:15:00
+2024-05-26T03:15:00
+2025-05-03T03:15:00
+2025-05-09T03:15:00
+2025-05-15T03:15:00
+2025-05-21T03:15:00
+2025-05-27T03:15:00
+2026-05-04T03:15:00
+2026-05-10T03:15:00
+2026-05-16T03:15:00
+2026-05-22T03:15:00
+2026-05-28T03:15:00
+2027-05-05T03:15:00
+2027-05-11T03:15:00
+2027-05-17T03:15:00
+2027-05-23T03:15:00
+2027-05-29T03:15:00
+2028-05-05T03:15:00
+2028-05-11T03:15:00
+2028-05-17T03:15:00
+2028-05-23T03:15:00
+2028-05-29T03:15:00
+2029-05-06T03:15:00
+2029-05-12T03:15:00
+2029-05-18T03:15:00
+2029-05-24T03:15:00
+2029-05-30T03:15:00
+2030-05-01T03:15:00
+2030-05-07T03:15:00
+2030-05-13T03:15:00
+2030-05-19T03:15:00
+2030-05-25T03:15:00
+2030-05-31T03:15:00
+2031-05-02T03:15:00
+2031-05-08T03:15:00
+2031-05-14T03:15:00
+2031-05-20T03:15:00
+2031-05-26T03:15:00
+2032-05-02T03:15:00
+2032-05-08T03:15:00
+2032-05-14T03:15:00
+2032-05-20T03:15:00
+2032-05-26T03:15:00
+2033-05-03T03:15:00
+2033-05-09T03:15:00
+2033-05-15T03:15:00
+2033-05-21T03:15:00
+2033-05-27T03:15:00
+2034-05-04T03:15:00
+2034-05-10T03:15:00
+2034-05-16T03:15:00
+2034-05-22T03:15:00
+2034-05-28T03:15:00
+2035-05-05T03:15:00
+2035-05-11T03:15:00
+2035-05-17T03:15:00
+2035-05-23T03:15:00
+2035-05-29T03:15:00
+2036-05-05T03:15:00
+2036-05-11T03:15:00
+2036-05-17T03:15:00
+2036-05-23T03:15:00
+2036-05-29T03:15:00
+2037-05-06T03:15:00
+2037-05-12T03:15:00
+2037-05-18T03:15:00
+2037-05-24T03:15:00
+2037-05-30T03:15:00
+2038-05-01T03:15:00
+2038-05-07T03:15:00
+2038-05-13T03:15:00
+2038-05-19T03:15:00
+2038-05-25T03:15:00
+2038-05-31T03:15:00
+2039-05-02T03:15:00
+2039-05-08T03:15:00
+2039-05-14T03:15:00
+2039-05-20T03:15:00
+2039-05-26T03:15:00
+2040-05-02T03:15:00
+2040-05-08T03:15:00
+2040-05-14T03:15:00
+2040-05-20T03:15:00
+2040-05-26T03:15:00
+2041-05-03T03:15:00
+2041-05-09T03:15:00
+2041-05-15T03:15:00
+2041-05-21T03:15:00
+2041-05-27T03:15:00
+2042-05-04T03:15:00
+2042-05-10T03:15:00
+2042-05-16T03:15:00
+2042-05-22T03:15:00
+2042-05-28T03:15:00
+2043-05-05T03:15:00
+2043-05-11T03:15:00
+2043-05-17T03:15:00
+2043-05-23T03:15:00
+2043-05-29T03:15:00
+2044-05-05T03:15:00
+2044-05-11T03:15:00
+2044-05-17T03:15:00
+2044-05-23T03:15:00
+2044-05-29T03:15:00
+2045-05-06T03:15:00
+2045-05-12T03:15:00
+2045-05-18T03:15:00
+2045-05-24T03:15:00
+2045-05-30T03:15:00
+2046-05-01T03:15:00
+2046-05-07T03:15:00
+2046-05-13T03:15:00
+2046-05-19T03:15:00
+2046-05-25T03:15:00
+2046-05-31T03:15:00
+2047-05-02T03:15:00
+2047-05-08T03:15:00
+2047-05-14T03:15:00
+2047-05-20T03:15:00
+2047-05-26T03:15:00
+2048-05-02T03:15:00
+2048-05-08T03:15:00
+2048-05-14T03:15:00
+2048-05-20T03:15:00
+2048-05-26T03:15:00
+2049-05-03T03:15:00
+2049-05-09T03:15:00
+2049-05-15T03:15:00
+2049-05-21T03:15:00
+2049-05-27T03:15:00
+2050-05-04T03:15:00
+2050-05-10T03:15:00
+2050-05-16T03:15:00
+2050-05-22T03:15:00
+2050-05-28T03:15:00
+2051-05-05T03:15:00
+2051-05-11T03:15:00
+2051-05-17T03:15:00
+2051-05-23T03:15:00
+2051-05-29T03:15:00
+2052-05-05T03:15:00
+2052-05-11T03:15:00
+2052-05-17T03:15:00
+2052-05-23T03:15:00
+2052-05-29T03:15:00
+2053-05-06T03:15:00
+2053-05-12T03:15:00
+2053-05-18T03:15:00
+2053-05-24T03:15:00
+2053-05-30T03:15:00
+2054-05-01T03:15:00
+2054-05-07T03:15:00
+2054-05-13T03:15:00
+2054-05-19T03:15:00
+2054-05-25T03:15:00
+2054-05-31T03:15:00
+2055-05-02T03:15:00
+2055-05-08T03:15:00
+2055-05-14T03:15:00
+2055-05-20T03:15:00
+2055-05-26T03:15:00
+2056-05-02T03:15:00
+2056-05-08T03:15:00
+2056-05-14T03:15:00
+2056-05-20T03:15:00
+2056-05-26T03:15:00
+2057-05-03T03:15:00
+2057-05-09T03:15:00
+2057-05-15T03:15:00
+2057-05-21T03:15:00
+2057-05-27T03:15:00
+2058-05-04T03:15:00
+2058-05-10T03:15:00
+2058-05-16T03:15:00
+2058-05-22T03:15:00
+2058-05-28T03:15:00
+2059-05-05T03:15:00
+2059-05-11T03:15:00
+2059-05-17T03:15:00
+2059-05-23T03:15:00
+2059-05-29T03:15:00
+2060-05-05T03:15:00
+2060-05-11T03:15:00
+2060-05-17T03:15:00
+2060-05-23T03:15:00
+2060-05-29T03:15:00
+2061-05-06T03:15:00
+2061-05-12T03:15:00
+2061-05-18T03:15:00
+2061-05-24T03:15:00
+2061-05-30T03:15:00
+2062-05-01T03:15:00
+2062-05-07T03:15:00
+2062-05-13T03:15:00
+2062-05-19T03:15:00
+2062-05-25T03:15:00
+2062-05-31T03:15:00
+2063-05-02T03:15:00
+2063-05-08T03:15:00
+2063-05-14T03:15:00
+2063-05-20T03:15:00
+2063-05-26T03:15:00
+2064-05-02T03:15:00
+2064-05-08T03:15:00
+2064-05-14T03:15:00
+2064-05-20T03:15:00
+2064-05-26T03:15:00
+2065-05-03T03:15:00
+2065-05-09T03:15:00
+2065-05-15T03:15:00
+2065-05-21T03:15:00
+2065-05-27T03:15:00
+2066-05-04T03:15:00
+2066-05-10T03:15:00
+2066-05-16T03:15:00
+2066-05-22T03:15:00
+2066-05-28T03:15:00
+2067-05-05T03:15:00
+2067-05-11T03:15:00
+2067-05-17T03:15:00
+2067-05-23T03:15:00
+2067-05-29T03:15:00
+2068-05-05T03:15:00
+2068-05-11T03:15:00
+2068-05-17T03:15:00
+2068-05-23T03:15:00
+2068-05-29T03:15:00
+2069-05-06T03:15:00
+2069-05-12T03:15:00
+2069-05-18T03:15:00
+2069-05-24T03:15:00
+2069-05-30T03:15:00
+2070-05-01T03:15:00
+2070-05-07T03:15:00
+2070-05-13T03:15:00
+2070-05-19T03:15:00
+2070-05-25T03:15:00
+2070-05-31T03:15:00
+2071-05-02T03:15:00
+2071-05-08T03:15:00
+2071-05-14T03:15:00
+2071-05-20T03:15:00
+2071-05-26T03:15:00
+2072-05-02T03:15:00
+2072-05-08T03:15:00
+2072-05-14T03:15:00
+2072-05-20T03:15:00
+2072-05-26T03:15:00
+2073-05-03T03:15:00
+2073-05-09T03:15:00
+2073-05-15T03:15:00
+2073-05-21T03:15:00
+2073-05-27T03:15:00
+2074-05-04T03:15:00
+2074-05-10T03:15:00
+2074-05-16T03:15:00
+2074-05-22T03:15:00
+2074-05-28T03:15:00
+2075-05-05T03:15:00
+2075-05-11T03:15:00
+2075-05-17T03:15:00
+2075-05-23T03:15:00
+2075-05-29T03:15:00
+2076-05-05T03:15:00
+2076-05-11T03:15:00
+2076-05-17T03:15:00
+2076-05-23T03:15:00
+2076-05-29T03:15:00
+2077-05-06T03:15:00
+2077-05-12T03:15:00
+2077-05-18T03:15:00
+2077-05-24T03:15:00
+2077-05-30T03:15:00
+2078-05-01T03:15:00
+2078-05-07T03:15:00
+2078-05-13T03:15:00
+2078-05-19T03:15:00
+2078-05-25T03:15:00
+2078-05-31T03:15:00
+2079-05-02T03:15:00
+2079-05-08T03:15:00
+2079-05-14T03:15:00
+2079-05-20T03:15:00
+2079-05-26T03:15:00
+2080-05-02T03:15:00
+2080-05-08T03:15:00
+2080-05-14T03:15:00
+2080-05-20T03:15:00
+2080-05-26T03:15:00
+2081-05-03T03:15:00
+2081-05-09T03:15:00
+2081-05-15T03:15:00
+2081-05-21T03:15:00
+2081-05-27T03:15:00
+2082-05-04T03:15:00
+2082-05-10T03:15:00
+2082-05-16T03:15:00
+2082-05-22T03:15:00
+2082-05-28T03:15:00
+2083-05-05T03:15:00
+2083-05-11T03:15:00
+2083-05-17T03:15:00
+2083-05-23T03:15:00
+2083-05-29T03:15:00
+2084-05-05T03:15:00
+2084-05-11T03:15:00
+2084-05-17T03:15:00
+2084-05-23T03:15:00
+2084-05-29T03:15:00
+2085-05-06T03:15:00
+2085-05-12T03:15:00
+2085-05-18T03:15:00
+2085-05-24T03:15:00
+2085-05-30T03:15:00
+2086-05-01T03:15:00
+2086-05-07T03:15:00
+2086-05-13T03:15:00
+2086-05-19T03:15:00
+2086-05-25T03:15:00
+2086-05-31T03:15:00
+2087-05-02T03:15:00
+2087-05-08T03:15:00
+2087-05-14T03:15:00
+2087-05-20T03:15:00
+2087-05-26T03:15:00
+2088-05-02T03:15:00
+2088-05-08T03:15:00
+2088-05-14T03:15:00
+2088-05-20T03:15:00
+2088-05-26T03:15:00
+2089-05-03T03:15:00
+2089-05-09T03:15:00
+2089-05-15T03:15:00
+2089-05-21T03:15:00
+2089-05-27T03:15:00
+2090-05-04T03:15:00
+2090-05-10T03:15:00
+2090-05-16T03:15:00
+2090-05-22T03:15:00
+2090-05-28T03:15:00
+2091-05-05T03:15:00
+2091-05-11T03:15:00
+2091-05-17T03:15:00
+2091-05-23T03:15:00
+2091-05-29T03:15:00
+2092-05-05T03:15:00
+2092-05-11T03:15:00
+2092-05-17T03:15:00
+2092-05-23T03:15:00
+2092-05-29T03:15:00
+2093-05-06T03:15:00
+2093-05-12T03:15:00
+2093-05-18T03:15:00
+2093-05-24T03:15:00
+2093-05-30T03:15:00
+2094-05-01T03:15:00
+2094-05-07T03:15:00
+2094-05-13T03:15:00
+2094-05-19T03:15:00
+2094-05-25T03:15:00
+2094-05-31T03:15:00
+2095-05-02T03:15:00
+2095-05-08T03:15:00
+2095-05-14T03:15:00
+2095-05-20T03:15:00
+2095-05-26T03:15:00
+2096-05-02T03:15:00
+2096-05-08T03:15:00
+2096-05-14T03:15:00
+2096-05-20T03:15:00
+2096-05-26T03:15:00
+2097-05-03T03:15:00
+2097-05-09T03:15:00
+2097-05-15T03:15:00
+2097-05-21T03:15:00
+2097-05-27T03:15:00
+2098-05-04T03:15:00
+2098-05-10T03:15:00
+2098-05-16T03:15:00
+2098-05-22T03:15:00
+2098-05-28T03:15:00
+2099-05-05T03:15:00
+2099-05-11T03:15:00
+2099-05-17T03:15:00
+2099-05-23T03:15:00
+2099-05-29T03:15:00
+2100-05-06T03:15:00
+2100-05-12T03:15:00
+2100-05-18T03:15:00
+2100-05-24T03:15:00
+2100-05-30T03:15:00
+2101-05-01T03:15:00
+2101-05-07T03:15:00
+2101-05-13T03:15:00
+2101-05-19T03:15:00
+2101-05-25T03:15:00
+2101-05-31T03:15:00
+2102-05-02T03:15:00
+2102-05-08T03:15:00
+2102-05-14T03:15:00
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/daily.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/unsorted/daily.ics.prev.ref
new file mode 100644
index 00000000..966032f0
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/daily.ics.prev.ref
@@ -0,0 +1,31 @@
+2010-05-28T03:15:00
+2010-05-22T03:15:00
+2010-05-16T03:15:00
+2010-05-10T03:15:00
+2010-05-04T03:15:00
+2009-05-27T03:15:00
+2009-05-21T03:15:00
+2009-05-15T03:15:00
+2009-05-09T03:15:00
+2009-05-03T03:15:00
+2008-05-26T03:15:00
+2008-05-20T03:15:00
+2008-05-14T03:15:00
+2008-05-08T03:15:00
+2008-05-02T03:15:00
+2007-05-26T03:15:00
+2007-05-20T03:15:00
+2007-05-14T03:15:00
+2007-05-08T03:15:00
+2007-05-02T03:15:00
+2006-05-31T03:15:00
+2006-05-25T03:15:00
+2006-05-19T03:15:00
+2006-05-13T03:15:00
+2006-05-07T03:15:00
+2006-05-01T03:15:00
+2005-05-30T03:15:00
+2005-05-24T03:15:00
+2005-05-18T03:15:00
+2005-05-12T03:15:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/daily.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/unsorted/daily.ics.recurson.ref
new file mode 100644
index 00000000..c0a3729a
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/daily.ics.recurson.ref
@@ -0,0 +1,30 @@
+2005-05-12
+2005-05-18
+2005-05-24
+2005-05-30
+2006-05-01
+2006-05-07
+2006-05-13
+2006-05-19
+2006-05-25
+2006-05-31
+2007-05-02
+2007-05-08
+2007-05-14
+2007-05-20
+2007-05-26
+2008-05-02
+2008-05-08
+2008-05-14
+2008-05-20
+2008-05-26
+2009-05-03
+2009-05-09
+2009-05-15
+2009-05-21
+2009-05-27
+2010-05-04
+2010-05-10
+2010-05-16
+2010-05-22
+2010-05-28
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/exdate.ics b/libkcal/tests/data/RecurrenceRule/unsorted/exdate.ics
new file mode 100644
index 00000000..c2a8bd78
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/exdate.ics
@@ -0,0 +1,24 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:UTC
+BEGIN:VEVENT
+DTSTAMP:20050522T201207Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050522T201119Z
+UID:KOrganizer-557711714.436
+SEQUENCE:0
+LAST-MODIFIED:20050522T201119Z
+SUMMARY:asdfasdf
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=TU
+EXDATE;VALUE=DATE:20050531
+EXDATE;VALUE=DATE:20060516
+DTSTART:20050517T084500Z
+DTEND:20050517T121500Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/exdate.ics.next.ref b/libkcal/tests/data/RecurrenceRule/unsorted/exdate.ics.next.ref
new file mode 100644
index 00000000..10c3a44a
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/exdate.ics.next.ref
@@ -0,0 +1,500 @@
+2005-05-17T08:45:00
+2005-05-24T08:45:00
+2005-06-07T08:45:00
+2005-06-14T08:45:00
+2005-06-21T08:45:00
+2005-06-28T08:45:00
+2005-07-05T08:45:00
+2005-07-12T08:45:00
+2005-07-19T08:45:00
+2005-07-26T08:45:00
+2005-08-02T08:45:00
+2005-08-09T08:45:00
+2005-08-16T08:45:00
+2005-08-23T08:45:00
+2005-08-30T08:45:00
+2005-09-06T08:45:00
+2005-09-13T08:45:00
+2005-09-20T08:45:00
+2005-09-27T08:45:00
+2005-10-04T08:45:00
+2005-10-11T08:45:00
+2005-10-18T08:45:00
+2005-10-25T08:45:00
+2005-11-01T08:45:00
+2005-11-08T08:45:00
+2005-11-15T08:45:00
+2005-11-22T08:45:00
+2005-11-29T08:45:00
+2005-12-06T08:45:00
+2005-12-13T08:45:00
+2005-12-20T08:45:00
+2005-12-27T08:45:00
+2006-01-03T08:45:00
+2006-01-10T08:45:00
+2006-01-17T08:45:00
+2006-01-24T08:45:00
+2006-01-31T08:45:00
+2006-02-07T08:45:00
+2006-02-14T08:45:00
+2006-02-21T08:45:00
+2006-02-28T08:45:00
+2006-03-07T08:45:00
+2006-03-14T08:45:00
+2006-03-21T08:45:00
+2006-03-28T08:45:00
+2006-04-04T08:45:00
+2006-04-11T08:45:00
+2006-04-18T08:45:00
+2006-04-25T08:45:00
+2006-05-02T08:45:00
+2006-05-09T08:45:00
+2006-05-23T08:45:00
+2006-05-30T08:45:00
+2006-06-06T08:45:00
+2006-06-13T08:45:00
+2006-06-20T08:45:00
+2006-06-27T08:45:00
+2006-07-04T08:45:00
+2006-07-11T08:45:00
+2006-07-18T08:45:00
+2006-07-25T08:45:00
+2006-08-01T08:45:00
+2006-08-08T08:45:00
+2006-08-15T08:45:00
+2006-08-22T08:45:00
+2006-08-29T08:45:00
+2006-09-05T08:45:00
+2006-09-12T08:45:00
+2006-09-19T08:45:00
+2006-09-26T08:45:00
+2006-10-03T08:45:00
+2006-10-10T08:45:00
+2006-10-17T08:45:00
+2006-10-24T08:45:00
+2006-10-31T08:45:00
+2006-11-07T08:45:00
+2006-11-14T08:45:00
+2006-11-21T08:45:00
+2006-11-28T08:45:00
+2006-12-05T08:45:00
+2006-12-12T08:45:00
+2006-12-19T08:45:00
+2006-12-26T08:45:00
+2007-01-02T08:45:00
+2007-01-09T08:45:00
+2007-01-16T08:45:00
+2007-01-23T08:45:00
+2007-01-30T08:45:00
+2007-02-06T08:45:00
+2007-02-13T08:45:00
+2007-02-20T08:45:00
+2007-02-27T08:45:00
+2007-03-06T08:45:00
+2007-03-13T08:45:00
+2007-03-20T08:45:00
+2007-03-27T08:45:00
+2007-04-03T08:45:00
+2007-04-10T08:45:00
+2007-04-17T08:45:00
+2007-04-24T08:45:00
+2007-05-01T08:45:00
+2007-05-08T08:45:00
+2007-05-15T08:45:00
+2007-05-22T08:45:00
+2007-05-29T08:45:00
+2007-06-05T08:45:00
+2007-06-12T08:45:00
+2007-06-19T08:45:00
+2007-06-26T08:45:00
+2007-07-03T08:45:00
+2007-07-10T08:45:00
+2007-07-17T08:45:00
+2007-07-24T08:45:00
+2007-07-31T08:45:00
+2007-08-07T08:45:00
+2007-08-14T08:45:00
+2007-08-21T08:45:00
+2007-08-28T08:45:00
+2007-09-04T08:45:00
+2007-09-11T08:45:00
+2007-09-18T08:45:00
+2007-09-25T08:45:00
+2007-10-02T08:45:00
+2007-10-09T08:45:00
+2007-10-16T08:45:00
+2007-10-23T08:45:00
+2007-10-30T08:45:00
+2007-11-06T08:45:00
+2007-11-13T08:45:00
+2007-11-20T08:45:00
+2007-11-27T08:45:00
+2007-12-04T08:45:00
+2007-12-11T08:45:00
+2007-12-18T08:45:00
+2007-12-25T08:45:00
+2008-01-01T08:45:00
+2008-01-08T08:45:00
+2008-01-15T08:45:00
+2008-01-22T08:45:00
+2008-01-29T08:45:00
+2008-02-05T08:45:00
+2008-02-12T08:45:00
+2008-02-19T08:45:00
+2008-02-26T08:45:00
+2008-03-04T08:45:00
+2008-03-11T08:45:00
+2008-03-18T08:45:00
+2008-03-25T08:45:00
+2008-04-01T08:45:00
+2008-04-08T08:45:00
+2008-04-15T08:45:00
+2008-04-22T08:45:00
+2008-04-29T08:45:00
+2008-05-06T08:45:00
+2008-05-13T08:45:00
+2008-05-20T08:45:00
+2008-05-27T08:45:00
+2008-06-03T08:45:00
+2008-06-10T08:45:00
+2008-06-17T08:45:00
+2008-06-24T08:45:00
+2008-07-01T08:45:00
+2008-07-08T08:45:00
+2008-07-15T08:45:00
+2008-07-22T08:45:00
+2008-07-29T08:45:00
+2008-08-05T08:45:00
+2008-08-12T08:45:00
+2008-08-19T08:45:00
+2008-08-26T08:45:00
+2008-09-02T08:45:00
+2008-09-09T08:45:00
+2008-09-16T08:45:00
+2008-09-23T08:45:00
+2008-09-30T08:45:00
+2008-10-07T08:45:00
+2008-10-14T08:45:00
+2008-10-21T08:45:00
+2008-10-28T08:45:00
+2008-11-04T08:45:00
+2008-11-11T08:45:00
+2008-11-18T08:45:00
+2008-11-25T08:45:00
+2008-12-02T08:45:00
+2008-12-09T08:45:00
+2008-12-16T08:45:00
+2008-12-23T08:45:00
+2008-12-30T08:45:00
+2009-01-06T08:45:00
+2009-01-13T08:45:00
+2009-01-20T08:45:00
+2009-01-27T08:45:00
+2009-02-03T08:45:00
+2009-02-10T08:45:00
+2009-02-17T08:45:00
+2009-02-24T08:45:00
+2009-03-03T08:45:00
+2009-03-10T08:45:00
+2009-03-17T08:45:00
+2009-03-24T08:45:00
+2009-03-31T08:45:00
+2009-04-07T08:45:00
+2009-04-14T08:45:00
+2009-04-21T08:45:00
+2009-04-28T08:45:00
+2009-05-05T08:45:00
+2009-05-12T08:45:00
+2009-05-19T08:45:00
+2009-05-26T08:45:00
+2009-06-02T08:45:00
+2009-06-09T08:45:00
+2009-06-16T08:45:00
+2009-06-23T08:45:00
+2009-06-30T08:45:00
+2009-07-07T08:45:00
+2009-07-14T08:45:00
+2009-07-21T08:45:00
+2009-07-28T08:45:00
+2009-08-04T08:45:00
+2009-08-11T08:45:00
+2009-08-18T08:45:00
+2009-08-25T08:45:00
+2009-09-01T08:45:00
+2009-09-08T08:45:00
+2009-09-15T08:45:00
+2009-09-22T08:45:00
+2009-09-29T08:45:00
+2009-10-06T08:45:00
+2009-10-13T08:45:00
+2009-10-20T08:45:00
+2009-10-27T08:45:00
+2009-11-03T08:45:00
+2009-11-10T08:45:00
+2009-11-17T08:45:00
+2009-11-24T08:45:00
+2009-12-01T08:45:00
+2009-12-08T08:45:00
+2009-12-15T08:45:00
+2009-12-22T08:45:00
+2009-12-29T08:45:00
+2010-01-05T08:45:00
+2010-01-12T08:45:00
+2010-01-19T08:45:00
+2010-01-26T08:45:00
+2010-02-02T08:45:00
+2010-02-09T08:45:00
+2010-02-16T08:45:00
+2010-02-23T08:45:00
+2010-03-02T08:45:00
+2010-03-09T08:45:00
+2010-03-16T08:45:00
+2010-03-23T08:45:00
+2010-03-30T08:45:00
+2010-04-06T08:45:00
+2010-04-13T08:45:00
+2010-04-20T08:45:00
+2010-04-27T08:45:00
+2010-05-04T08:45:00
+2010-05-11T08:45:00
+2010-05-18T08:45:00
+2010-05-25T08:45:00
+2010-06-01T08:45:00
+2010-06-08T08:45:00
+2010-06-15T08:45:00
+2010-06-22T08:45:00
+2010-06-29T08:45:00
+2010-07-06T08:45:00
+2010-07-13T08:45:00
+2010-07-20T08:45:00
+2010-07-27T08:45:00
+2010-08-03T08:45:00
+2010-08-10T08:45:00
+2010-08-17T08:45:00
+2010-08-24T08:45:00
+2010-08-31T08:45:00
+2010-09-07T08:45:00
+2010-09-14T08:45:00
+2010-09-21T08:45:00
+2010-09-28T08:45:00
+2010-10-05T08:45:00
+2010-10-12T08:45:00
+2010-10-19T08:45:00
+2010-10-26T08:45:00
+2010-11-02T08:45:00
+2010-11-09T08:45:00
+2010-11-16T08:45:00
+2010-11-23T08:45:00
+2010-11-30T08:45:00
+2010-12-07T08:45:00
+2010-12-14T08:45:00
+2010-12-21T08:45:00
+2010-12-28T08:45:00
+2011-01-04T08:45:00
+2011-01-11T08:45:00
+2011-01-18T08:45:00
+2011-01-25T08:45:00
+2011-02-01T08:45:00
+2011-02-08T08:45:00
+2011-02-15T08:45:00
+2011-02-22T08:45:00
+2011-03-01T08:45:00
+2011-03-08T08:45:00
+2011-03-15T08:45:00
+2011-03-22T08:45:00
+2011-03-29T08:45:00
+2011-04-05T08:45:00
+2011-04-12T08:45:00
+2011-04-19T08:45:00
+2011-04-26T08:45:00
+2011-05-03T08:45:00
+2011-05-10T08:45:00
+2011-05-17T08:45:00
+2011-05-24T08:45:00
+2011-05-31T08:45:00
+2011-06-07T08:45:00
+2011-06-14T08:45:00
+2011-06-21T08:45:00
+2011-06-28T08:45:00
+2011-07-05T08:45:00
+2011-07-12T08:45:00
+2011-07-19T08:45:00
+2011-07-26T08:45:00
+2011-08-02T08:45:00
+2011-08-09T08:45:00
+2011-08-16T08:45:00
+2011-08-23T08:45:00
+2011-08-30T08:45:00
+2011-09-06T08:45:00
+2011-09-13T08:45:00
+2011-09-20T08:45:00
+2011-09-27T08:45:00
+2011-10-04T08:45:00
+2011-10-11T08:45:00
+2011-10-18T08:45:00
+2011-10-25T08:45:00
+2011-11-01T08:45:00
+2011-11-08T08:45:00
+2011-11-15T08:45:00
+2011-11-22T08:45:00
+2011-11-29T08:45:00
+2011-12-06T08:45:00
+2011-12-13T08:45:00
+2011-12-20T08:45:00
+2011-12-27T08:45:00
+2012-01-03T08:45:00
+2012-01-10T08:45:00
+2012-01-17T08:45:00
+2012-01-24T08:45:00
+2012-01-31T08:45:00
+2012-02-07T08:45:00
+2012-02-14T08:45:00
+2012-02-21T08:45:00
+2012-02-28T08:45:00
+2012-03-06T08:45:00
+2012-03-13T08:45:00
+2012-03-20T08:45:00
+2012-03-27T08:45:00
+2012-04-03T08:45:00
+2012-04-10T08:45:00
+2012-04-17T08:45:00
+2012-04-24T08:45:00
+2012-05-01T08:45:00
+2012-05-08T08:45:00
+2012-05-15T08:45:00
+2012-05-22T08:45:00
+2012-05-29T08:45:00
+2012-06-05T08:45:00
+2012-06-12T08:45:00
+2012-06-19T08:45:00
+2012-06-26T08:45:00
+2012-07-03T08:45:00
+2012-07-10T08:45:00
+2012-07-17T08:45:00
+2012-07-24T08:45:00
+2012-07-31T08:45:00
+2012-08-07T08:45:00
+2012-08-14T08:45:00
+2012-08-21T08:45:00
+2012-08-28T08:45:00
+2012-09-04T08:45:00
+2012-09-11T08:45:00
+2012-09-18T08:45:00
+2012-09-25T08:45:00
+2012-10-02T08:45:00
+2012-10-09T08:45:00
+2012-10-16T08:45:00
+2012-10-23T08:45:00
+2012-10-30T08:45:00
+2012-11-06T08:45:00
+2012-11-13T08:45:00
+2012-11-20T08:45:00
+2012-11-27T08:45:00
+2012-12-04T08:45:00
+2012-12-11T08:45:00
+2012-12-18T08:45:00
+2012-12-25T08:45:00
+2013-01-01T08:45:00
+2013-01-08T08:45:00
+2013-01-15T08:45:00
+2013-01-22T08:45:00
+2013-01-29T08:45:00
+2013-02-05T08:45:00
+2013-02-12T08:45:00
+2013-02-19T08:45:00
+2013-02-26T08:45:00
+2013-03-05T08:45:00
+2013-03-12T08:45:00
+2013-03-19T08:45:00
+2013-03-26T08:45:00
+2013-04-02T08:45:00
+2013-04-09T08:45:00
+2013-04-16T08:45:00
+2013-04-23T08:45:00
+2013-04-30T08:45:00
+2013-05-07T08:45:00
+2013-05-14T08:45:00
+2013-05-21T08:45:00
+2013-05-28T08:45:00
+2013-06-04T08:45:00
+2013-06-11T08:45:00
+2013-06-18T08:45:00
+2013-06-25T08:45:00
+2013-07-02T08:45:00
+2013-07-09T08:45:00
+2013-07-16T08:45:00
+2013-07-23T08:45:00
+2013-07-30T08:45:00
+2013-08-06T08:45:00
+2013-08-13T08:45:00
+2013-08-20T08:45:00
+2013-08-27T08:45:00
+2013-09-03T08:45:00
+2013-09-10T08:45:00
+2013-09-17T08:45:00
+2013-09-24T08:45:00
+2013-10-01T08:45:00
+2013-10-08T08:45:00
+2013-10-15T08:45:00
+2013-10-22T08:45:00
+2013-10-29T08:45:00
+2013-11-05T08:45:00
+2013-11-12T08:45:00
+2013-11-19T08:45:00
+2013-11-26T08:45:00
+2013-12-03T08:45:00
+2013-12-10T08:45:00
+2013-12-17T08:45:00
+2013-12-24T08:45:00
+2013-12-31T08:45:00
+2014-01-07T08:45:00
+2014-01-14T08:45:00
+2014-01-21T08:45:00
+2014-01-28T08:45:00
+2014-02-04T08:45:00
+2014-02-11T08:45:00
+2014-02-18T08:45:00
+2014-02-25T08:45:00
+2014-03-04T08:45:00
+2014-03-11T08:45:00
+2014-03-18T08:45:00
+2014-03-25T08:45:00
+2014-04-01T08:45:00
+2014-04-08T08:45:00
+2014-04-15T08:45:00
+2014-04-22T08:45:00
+2014-04-29T08:45:00
+2014-05-06T08:45:00
+2014-05-13T08:45:00
+2014-05-20T08:45:00
+2014-05-27T08:45:00
+2014-06-03T08:45:00
+2014-06-10T08:45:00
+2014-06-17T08:45:00
+2014-06-24T08:45:00
+2014-07-01T08:45:00
+2014-07-08T08:45:00
+2014-07-15T08:45:00
+2014-07-22T08:45:00
+2014-07-29T08:45:00
+2014-08-05T08:45:00
+2014-08-12T08:45:00
+2014-08-19T08:45:00
+2014-08-26T08:45:00
+2014-09-02T08:45:00
+2014-09-09T08:45:00
+2014-09-16T08:45:00
+2014-09-23T08:45:00
+2014-09-30T08:45:00
+2014-10-07T08:45:00
+2014-10-14T08:45:00
+2014-10-21T08:45:00
+2014-10-28T08:45:00
+2014-11-04T08:45:00
+2014-11-11T08:45:00
+2014-11-18T08:45:00
+2014-11-25T08:45:00
+2014-12-02T08:45:00
+2014-12-09T08:45:00
+2014-12-16T08:45:00
+2014-12-23T08:45:00
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/exdate.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/unsorted/exdate.ics.prev.ref
new file mode 100644
index 00000000..1efad69f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/exdate.ics.prev.ref
@@ -0,0 +1,293 @@
+2010-12-28T08:45:00
+2010-12-21T08:45:00
+2010-12-14T08:45:00
+2010-12-07T08:45:00
+2010-11-30T08:45:00
+2010-11-23T08:45:00
+2010-11-16T08:45:00
+2010-11-09T08:45:00
+2010-11-02T08:45:00
+2010-10-26T08:45:00
+2010-10-19T08:45:00
+2010-10-12T08:45:00
+2010-10-05T08:45:00
+2010-09-28T08:45:00
+2010-09-21T08:45:00
+2010-09-14T08:45:00
+2010-09-07T08:45:00
+2010-08-31T08:45:00
+2010-08-24T08:45:00
+2010-08-17T08:45:00
+2010-08-10T08:45:00
+2010-08-03T08:45:00
+2010-07-27T08:45:00
+2010-07-20T08:45:00
+2010-07-13T08:45:00
+2010-07-06T08:45:00
+2010-06-29T08:45:00
+2010-06-22T08:45:00
+2010-06-15T08:45:00
+2010-06-08T08:45:00
+2010-06-01T08:45:00
+2010-05-25T08:45:00
+2010-05-18T08:45:00
+2010-05-11T08:45:00
+2010-05-04T08:45:00
+2010-04-27T08:45:00
+2010-04-20T08:45:00
+2010-04-13T08:45:00
+2010-04-06T08:45:00
+2010-03-30T08:45:00
+2010-03-23T08:45:00
+2010-03-16T08:45:00
+2010-03-09T08:45:00
+2010-03-02T08:45:00
+2010-02-23T08:45:00
+2010-02-16T08:45:00
+2010-02-09T08:45:00
+2010-02-02T08:45:00
+2010-01-26T08:45:00
+2010-01-19T08:45:00
+2010-01-12T08:45:00
+2010-01-05T08:45:00
+2009-12-29T08:45:00
+2009-12-22T08:45:00
+2009-12-15T08:45:00
+2009-12-08T08:45:00
+2009-12-01T08:45:00
+2009-11-24T08:45:00
+2009-11-17T08:45:00
+2009-11-10T08:45:00
+2009-11-03T08:45:00
+2009-10-27T08:45:00
+2009-10-20T08:45:00
+2009-10-13T08:45:00
+2009-10-06T08:45:00
+2009-09-29T08:45:00
+2009-09-22T08:45:00
+2009-09-15T08:45:00
+2009-09-08T08:45:00
+2009-09-01T08:45:00
+2009-08-25T08:45:00
+2009-08-18T08:45:00
+2009-08-11T08:45:00
+2009-08-04T08:45:00
+2009-07-28T08:45:00
+2009-07-21T08:45:00
+2009-07-14T08:45:00
+2009-07-07T08:45:00
+2009-06-30T08:45:00
+2009-06-23T08:45:00
+2009-06-16T08:45:00
+2009-06-09T08:45:00
+2009-06-02T08:45:00
+2009-05-26T08:45:00
+2009-05-19T08:45:00
+2009-05-12T08:45:00
+2009-05-05T08:45:00
+2009-04-28T08:45:00
+2009-04-21T08:45:00
+2009-04-14T08:45:00
+2009-04-07T08:45:00
+2009-03-31T08:45:00
+2009-03-24T08:45:00
+2009-03-17T08:45:00
+2009-03-10T08:45:00
+2009-03-03T08:45:00
+2009-02-24T08:45:00
+2009-02-17T08:45:00
+2009-02-10T08:45:00
+2009-02-03T08:45:00
+2009-01-27T08:45:00
+2009-01-20T08:45:00
+2009-01-13T08:45:00
+2009-01-06T08:45:00
+2008-12-30T08:45:00
+2008-12-23T08:45:00
+2008-12-16T08:45:00
+2008-12-09T08:45:00
+2008-12-02T08:45:00
+2008-11-25T08:45:00
+2008-11-18T08:45:00
+2008-11-11T08:45:00
+2008-11-04T08:45:00
+2008-10-28T08:45:00
+2008-10-21T08:45:00
+2008-10-14T08:45:00
+2008-10-07T08:45:00
+2008-09-30T08:45:00
+2008-09-23T08:45:00
+2008-09-16T08:45:00
+2008-09-09T08:45:00
+2008-09-02T08:45:00
+2008-08-26T08:45:00
+2008-08-19T08:45:00
+2008-08-12T08:45:00
+2008-08-05T08:45:00
+2008-07-29T08:45:00
+2008-07-22T08:45:00
+2008-07-15T08:45:00
+2008-07-08T08:45:00
+2008-07-01T08:45:00
+2008-06-24T08:45:00
+2008-06-17T08:45:00
+2008-06-10T08:45:00
+2008-06-03T08:45:00
+2008-05-27T08:45:00
+2008-05-20T08:45:00
+2008-05-13T08:45:00
+2008-05-06T08:45:00
+2008-04-29T08:45:00
+2008-04-22T08:45:00
+2008-04-15T08:45:00
+2008-04-08T08:45:00
+2008-04-01T08:45:00
+2008-03-25T08:45:00
+2008-03-18T08:45:00
+2008-03-11T08:45:00
+2008-03-04T08:45:00
+2008-02-26T08:45:00
+2008-02-19T08:45:00
+2008-02-12T08:45:00
+2008-02-05T08:45:00
+2008-01-29T08:45:00
+2008-01-22T08:45:00
+2008-01-15T08:45:00
+2008-01-08T08:45:00
+2008-01-01T08:45:00
+2007-12-25T08:45:00
+2007-12-18T08:45:00
+2007-12-11T08:45:00
+2007-12-04T08:45:00
+2007-11-27T08:45:00
+2007-11-20T08:45:00
+2007-11-13T08:45:00
+2007-11-06T08:45:00
+2007-10-30T08:45:00
+2007-10-23T08:45:00
+2007-10-16T08:45:00
+2007-10-09T08:45:00
+2007-10-02T08:45:00
+2007-09-25T08:45:00
+2007-09-18T08:45:00
+2007-09-11T08:45:00
+2007-09-04T08:45:00
+2007-08-28T08:45:00
+2007-08-21T08:45:00
+2007-08-14T08:45:00
+2007-08-07T08:45:00
+2007-07-31T08:45:00
+2007-07-24T08:45:00
+2007-07-17T08:45:00
+2007-07-10T08:45:00
+2007-07-03T08:45:00
+2007-06-26T08:45:00
+2007-06-19T08:45:00
+2007-06-12T08:45:00
+2007-06-05T08:45:00
+2007-05-29T08:45:00
+2007-05-22T08:45:00
+2007-05-15T08:45:00
+2007-05-08T08:45:00
+2007-05-01T08:45:00
+2007-04-24T08:45:00
+2007-04-17T08:45:00
+2007-04-10T08:45:00
+2007-04-03T08:45:00
+2007-03-27T08:45:00
+2007-03-20T08:45:00
+2007-03-13T08:45:00
+2007-03-06T08:45:00
+2007-02-27T08:45:00
+2007-02-20T08:45:00
+2007-02-13T08:45:00
+2007-02-06T08:45:00
+2007-01-30T08:45:00
+2007-01-23T08:45:00
+2007-01-16T08:45:00
+2007-01-09T08:45:00
+2007-01-02T08:45:00
+2006-12-26T08:45:00
+2006-12-19T08:45:00
+2006-12-12T08:45:00
+2006-12-05T08:45:00
+2006-11-28T08:45:00
+2006-11-21T08:45:00
+2006-11-14T08:45:00
+2006-11-07T08:45:00
+2006-10-31T08:45:00
+2006-10-24T08:45:00
+2006-10-17T08:45:00
+2006-10-10T08:45:00
+2006-10-03T08:45:00
+2006-09-26T08:45:00
+2006-09-19T08:45:00
+2006-09-12T08:45:00
+2006-09-05T08:45:00
+2006-08-29T08:45:00
+2006-08-22T08:45:00
+2006-08-15T08:45:00
+2006-08-08T08:45:00
+2006-08-01T08:45:00
+2006-07-25T08:45:00
+2006-07-18T08:45:00
+2006-07-11T08:45:00
+2006-07-04T08:45:00
+2006-06-27T08:45:00
+2006-06-20T08:45:00
+2006-06-13T08:45:00
+2006-06-06T08:45:00
+2006-05-30T08:45:00
+2006-05-23T08:45:00
+2006-05-09T08:45:00
+2006-05-02T08:45:00
+2006-04-25T08:45:00
+2006-04-18T08:45:00
+2006-04-11T08:45:00
+2006-04-04T08:45:00
+2006-03-28T08:45:00
+2006-03-21T08:45:00
+2006-03-14T08:45:00
+2006-03-07T08:45:00
+2006-02-28T08:45:00
+2006-02-21T08:45:00
+2006-02-14T08:45:00
+2006-02-07T08:45:00
+2006-01-31T08:45:00
+2006-01-24T08:45:00
+2006-01-17T08:45:00
+2006-01-10T08:45:00
+2006-01-03T08:45:00
+2005-12-27T08:45:00
+2005-12-20T08:45:00
+2005-12-13T08:45:00
+2005-12-06T08:45:00
+2005-11-29T08:45:00
+2005-11-22T08:45:00
+2005-11-15T08:45:00
+2005-11-08T08:45:00
+2005-11-01T08:45:00
+2005-10-25T08:45:00
+2005-10-18T08:45:00
+2005-10-11T08:45:00
+2005-10-04T08:45:00
+2005-09-27T08:45:00
+2005-09-20T08:45:00
+2005-09-13T08:45:00
+2005-09-06T08:45:00
+2005-08-30T08:45:00
+2005-08-23T08:45:00
+2005-08-16T08:45:00
+2005-08-09T08:45:00
+2005-08-02T08:45:00
+2005-07-26T08:45:00
+2005-07-19T08:45:00
+2005-07-12T08:45:00
+2005-07-05T08:45:00
+2005-06-28T08:45:00
+2005-06-21T08:45:00
+2005-06-14T08:45:00
+2005-06-07T08:45:00
+2005-05-24T08:45:00
+2005-05-17T08:45:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/exdate.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/unsorted/exdate.ics.recurson.ref
new file mode 100644
index 00000000..eaf3bd71
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/exdate.ics.recurson.ref
@@ -0,0 +1,292 @@
+2005-05-17
+2005-05-24
+2005-06-07
+2005-06-14
+2005-06-21
+2005-06-28
+2005-07-05
+2005-07-12
+2005-07-19
+2005-07-26
+2005-08-02
+2005-08-09
+2005-08-16
+2005-08-23
+2005-08-30
+2005-09-06
+2005-09-13
+2005-09-20
+2005-09-27
+2005-10-04
+2005-10-11
+2005-10-18
+2005-10-25
+2005-11-01
+2005-11-08
+2005-11-15
+2005-11-22
+2005-11-29
+2005-12-06
+2005-12-13
+2005-12-20
+2005-12-27
+2006-01-03
+2006-01-10
+2006-01-17
+2006-01-24
+2006-01-31
+2006-02-07
+2006-02-14
+2006-02-21
+2006-02-28
+2006-03-07
+2006-03-14
+2006-03-21
+2006-03-28
+2006-04-04
+2006-04-11
+2006-04-18
+2006-04-25
+2006-05-02
+2006-05-09
+2006-05-23
+2006-05-30
+2006-06-06
+2006-06-13
+2006-06-20
+2006-06-27
+2006-07-04
+2006-07-11
+2006-07-18
+2006-07-25
+2006-08-01
+2006-08-08
+2006-08-15
+2006-08-22
+2006-08-29
+2006-09-05
+2006-09-12
+2006-09-19
+2006-09-26
+2006-10-03
+2006-10-10
+2006-10-17
+2006-10-24
+2006-10-31
+2006-11-07
+2006-11-14
+2006-11-21
+2006-11-28
+2006-12-05
+2006-12-12
+2006-12-19
+2006-12-26
+2007-01-02
+2007-01-09
+2007-01-16
+2007-01-23
+2007-01-30
+2007-02-06
+2007-02-13
+2007-02-20
+2007-02-27
+2007-03-06
+2007-03-13
+2007-03-20
+2007-03-27
+2007-04-03
+2007-04-10
+2007-04-17
+2007-04-24
+2007-05-01
+2007-05-08
+2007-05-15
+2007-05-22
+2007-05-29
+2007-06-05
+2007-06-12
+2007-06-19
+2007-06-26
+2007-07-03
+2007-07-10
+2007-07-17
+2007-07-24
+2007-07-31
+2007-08-07
+2007-08-14
+2007-08-21
+2007-08-28
+2007-09-04
+2007-09-11
+2007-09-18
+2007-09-25
+2007-10-02
+2007-10-09
+2007-10-16
+2007-10-23
+2007-10-30
+2007-11-06
+2007-11-13
+2007-11-20
+2007-11-27
+2007-12-04
+2007-12-11
+2007-12-18
+2007-12-25
+2008-01-01
+2008-01-08
+2008-01-15
+2008-01-22
+2008-01-29
+2008-02-05
+2008-02-12
+2008-02-19
+2008-02-26
+2008-03-04
+2008-03-11
+2008-03-18
+2008-03-25
+2008-04-01
+2008-04-08
+2008-04-15
+2008-04-22
+2008-04-29
+2008-05-06
+2008-05-13
+2008-05-20
+2008-05-27
+2008-06-03
+2008-06-10
+2008-06-17
+2008-06-24
+2008-07-01
+2008-07-08
+2008-07-15
+2008-07-22
+2008-07-29
+2008-08-05
+2008-08-12
+2008-08-19
+2008-08-26
+2008-09-02
+2008-09-09
+2008-09-16
+2008-09-23
+2008-09-30
+2008-10-07
+2008-10-14
+2008-10-21
+2008-10-28
+2008-11-04
+2008-11-11
+2008-11-18
+2008-11-25
+2008-12-02
+2008-12-09
+2008-12-16
+2008-12-23
+2008-12-30
+2009-01-06
+2009-01-13
+2009-01-20
+2009-01-27
+2009-02-03
+2009-02-10
+2009-02-17
+2009-02-24
+2009-03-03
+2009-03-10
+2009-03-17
+2009-03-24
+2009-03-31
+2009-04-07
+2009-04-14
+2009-04-21
+2009-04-28
+2009-05-05
+2009-05-12
+2009-05-19
+2009-05-26
+2009-06-02
+2009-06-09
+2009-06-16
+2009-06-23
+2009-06-30
+2009-07-07
+2009-07-14
+2009-07-21
+2009-07-28
+2009-08-04
+2009-08-11
+2009-08-18
+2009-08-25
+2009-09-01
+2009-09-08
+2009-09-15
+2009-09-22
+2009-09-29
+2009-10-06
+2009-10-13
+2009-10-20
+2009-10-27
+2009-11-03
+2009-11-10
+2009-11-17
+2009-11-24
+2009-12-01
+2009-12-08
+2009-12-15
+2009-12-22
+2009-12-29
+2010-01-05
+2010-01-12
+2010-01-19
+2010-01-26
+2010-02-02
+2010-02-09
+2010-02-16
+2010-02-23
+2010-03-02
+2010-03-09
+2010-03-16
+2010-03-23
+2010-03-30
+2010-04-06
+2010-04-13
+2010-04-20
+2010-04-27
+2010-05-04
+2010-05-11
+2010-05-18
+2010-05-25
+2010-06-01
+2010-06-08
+2010-06-15
+2010-06-22
+2010-06-29
+2010-07-06
+2010-07-13
+2010-07-20
+2010-07-27
+2010-08-03
+2010-08-10
+2010-08-17
+2010-08-24
+2010-08-31
+2010-09-07
+2010-09-14
+2010-09-21
+2010-09-28
+2010-10-05
+2010-10-12
+2010-10-19
+2010-10-26
+2010-11-02
+2010-11-09
+2010-11-16
+2010-11-23
+2010-11-30
+2010-12-07
+2010-12-14
+2010-12-21
+2010-12-28
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/hourly.ics b/libkcal/tests/data/RecurrenceRule/unsorted/hourly.ics
new file mode 100644
index 00000000..933ab7c0
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/hourly.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+VERSION:2.0
+PRODID:-//MH Software Inc//Connect Daily - 3.0.7//EN
+X-LibKCal-Testsuite-OutTZ:UTC
+
+BEGIN:VEVENT
+UID:1214@67.154.139.115
+SUMMARY:Every 6 hours, at 44 min, starting 12.5.05,03:15:00Z
+DTSTART:20050512T031500Z
+RRULE:FREQ=HOURLY;INTERVAL=6;BYMINUTE=44
+DURATION:PT5H
+END:VEVENT
+
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/hourly.ics.next.ref b/libkcal/tests/data/RecurrenceRule/unsorted/hourly.ics.next.ref
new file mode 100644
index 00000000..aa80ccfc
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/hourly.ics.next.ref
@@ -0,0 +1,500 @@
+2005-05-12T03:15:00
+2005-05-12T03:44:00
+2005-05-12T09:44:00
+2005-05-12T15:44:00
+2005-05-12T21:44:00
+2005-05-13T03:44:00
+2005-05-13T09:44:00
+2005-05-13T15:44:00
+2005-05-13T21:44:00
+2005-05-14T03:44:00
+2005-05-14T09:44:00
+2005-05-14T15:44:00
+2005-05-14T21:44:00
+2005-05-15T03:44:00
+2005-05-15T09:44:00
+2005-05-15T15:44:00
+2005-05-15T21:44:00
+2005-05-16T03:44:00
+2005-05-16T09:44:00
+2005-05-16T15:44:00
+2005-05-16T21:44:00
+2005-05-17T03:44:00
+2005-05-17T09:44:00
+2005-05-17T15:44:00
+2005-05-17T21:44:00
+2005-05-18T03:44:00
+2005-05-18T09:44:00
+2005-05-18T15:44:00
+2005-05-18T21:44:00
+2005-05-19T03:44:00
+2005-05-19T09:44:00
+2005-05-19T15:44:00
+2005-05-19T21:44:00
+2005-05-20T03:44:00
+2005-05-20T09:44:00
+2005-05-20T15:44:00
+2005-05-20T21:44:00
+2005-05-21T03:44:00
+2005-05-21T09:44:00
+2005-05-21T15:44:00
+2005-05-21T21:44:00
+2005-05-22T03:44:00
+2005-05-22T09:44:00
+2005-05-22T15:44:00
+2005-05-22T21:44:00
+2005-05-23T03:44:00
+2005-05-23T09:44:00
+2005-05-23T15:44:00
+2005-05-23T21:44:00
+2005-05-24T03:44:00
+2005-05-24T09:44:00
+2005-05-24T15:44:00
+2005-05-24T21:44:00
+2005-05-25T03:44:00
+2005-05-25T09:44:00
+2005-05-25T15:44:00
+2005-05-25T21:44:00
+2005-05-26T03:44:00
+2005-05-26T09:44:00
+2005-05-26T15:44:00
+2005-05-26T21:44:00
+2005-05-27T03:44:00
+2005-05-27T09:44:00
+2005-05-27T15:44:00
+2005-05-27T21:44:00
+2005-05-28T03:44:00
+2005-05-28T09:44:00
+2005-05-28T15:44:00
+2005-05-28T21:44:00
+2005-05-29T03:44:00
+2005-05-29T09:44:00
+2005-05-29T15:44:00
+2005-05-29T21:44:00
+2005-05-30T03:44:00
+2005-05-30T09:44:00
+2005-05-30T15:44:00
+2005-05-30T21:44:00
+2005-05-31T03:44:00
+2005-05-31T09:44:00
+2005-05-31T15:44:00
+2005-05-31T21:44:00
+2005-06-01T03:44:00
+2005-06-01T09:44:00
+2005-06-01T15:44:00
+2005-06-01T21:44:00
+2005-06-02T03:44:00
+2005-06-02T09:44:00
+2005-06-02T15:44:00
+2005-06-02T21:44:00
+2005-06-03T03:44:00
+2005-06-03T09:44:00
+2005-06-03T15:44:00
+2005-06-03T21:44:00
+2005-06-04T03:44:00
+2005-06-04T09:44:00
+2005-06-04T15:44:00
+2005-06-04T21:44:00
+2005-06-05T03:44:00
+2005-06-05T09:44:00
+2005-06-05T15:44:00
+2005-06-05T21:44:00
+2005-06-06T03:44:00
+2005-06-06T09:44:00
+2005-06-06T15:44:00
+2005-06-06T21:44:00
+2005-06-07T03:44:00
+2005-06-07T09:44:00
+2005-06-07T15:44:00
+2005-06-07T21:44:00
+2005-06-08T03:44:00
+2005-06-08T09:44:00
+2005-06-08T15:44:00
+2005-06-08T21:44:00
+2005-06-09T03:44:00
+2005-06-09T09:44:00
+2005-06-09T15:44:00
+2005-06-09T21:44:00
+2005-06-10T03:44:00
+2005-06-10T09:44:00
+2005-06-10T15:44:00
+2005-06-10T21:44:00
+2005-06-11T03:44:00
+2005-06-11T09:44:00
+2005-06-11T15:44:00
+2005-06-11T21:44:00
+2005-06-12T03:44:00
+2005-06-12T09:44:00
+2005-06-12T15:44:00
+2005-06-12T21:44:00
+2005-06-13T03:44:00
+2005-06-13T09:44:00
+2005-06-13T15:44:00
+2005-06-13T21:44:00
+2005-06-14T03:44:00
+2005-06-14T09:44:00
+2005-06-14T15:44:00
+2005-06-14T21:44:00
+2005-06-15T03:44:00
+2005-06-15T09:44:00
+2005-06-15T15:44:00
+2005-06-15T21:44:00
+2005-06-16T03:44:00
+2005-06-16T09:44:00
+2005-06-16T15:44:00
+2005-06-16T21:44:00
+2005-06-17T03:44:00
+2005-06-17T09:44:00
+2005-06-17T15:44:00
+2005-06-17T21:44:00
+2005-06-18T03:44:00
+2005-06-18T09:44:00
+2005-06-18T15:44:00
+2005-06-18T21:44:00
+2005-06-19T03:44:00
+2005-06-19T09:44:00
+2005-06-19T15:44:00
+2005-06-19T21:44:00
+2005-06-20T03:44:00
+2005-06-20T09:44:00
+2005-06-20T15:44:00
+2005-06-20T21:44:00
+2005-06-21T03:44:00
+2005-06-21T09:44:00
+2005-06-21T15:44:00
+2005-06-21T21:44:00
+2005-06-22T03:44:00
+2005-06-22T09:44:00
+2005-06-22T15:44:00
+2005-06-22T21:44:00
+2005-06-23T03:44:00
+2005-06-23T09:44:00
+2005-06-23T15:44:00
+2005-06-23T21:44:00
+2005-06-24T03:44:00
+2005-06-24T09:44:00
+2005-06-24T15:44:00
+2005-06-24T21:44:00
+2005-06-25T03:44:00
+2005-06-25T09:44:00
+2005-06-25T15:44:00
+2005-06-25T21:44:00
+2005-06-26T03:44:00
+2005-06-26T09:44:00
+2005-06-26T15:44:00
+2005-06-26T21:44:00
+2005-06-27T03:44:00
+2005-06-27T09:44:00
+2005-06-27T15:44:00
+2005-06-27T21:44:00
+2005-06-28T03:44:00
+2005-06-28T09:44:00
+2005-06-28T15:44:00
+2005-06-28T21:44:00
+2005-06-29T03:44:00
+2005-06-29T09:44:00
+2005-06-29T15:44:00
+2005-06-29T21:44:00
+2005-06-30T03:44:00
+2005-06-30T09:44:00
+2005-06-30T15:44:00
+2005-06-30T21:44:00
+2005-07-01T03:44:00
+2005-07-01T09:44:00
+2005-07-01T15:44:00
+2005-07-01T21:44:00
+2005-07-02T03:44:00
+2005-07-02T09:44:00
+2005-07-02T15:44:00
+2005-07-02T21:44:00
+2005-07-03T03:44:00
+2005-07-03T09:44:00
+2005-07-03T15:44:00
+2005-07-03T21:44:00
+2005-07-04T03:44:00
+2005-07-04T09:44:00
+2005-07-04T15:44:00
+2005-07-04T21:44:00
+2005-07-05T03:44:00
+2005-07-05T09:44:00
+2005-07-05T15:44:00
+2005-07-05T21:44:00
+2005-07-06T03:44:00
+2005-07-06T09:44:00
+2005-07-06T15:44:00
+2005-07-06T21:44:00
+2005-07-07T03:44:00
+2005-07-07T09:44:00
+2005-07-07T15:44:00
+2005-07-07T21:44:00
+2005-07-08T03:44:00
+2005-07-08T09:44:00
+2005-07-08T15:44:00
+2005-07-08T21:44:00
+2005-07-09T03:44:00
+2005-07-09T09:44:00
+2005-07-09T15:44:00
+2005-07-09T21:44:00
+2005-07-10T03:44:00
+2005-07-10T09:44:00
+2005-07-10T15:44:00
+2005-07-10T21:44:00
+2005-07-11T03:44:00
+2005-07-11T09:44:00
+2005-07-11T15:44:00
+2005-07-11T21:44:00
+2005-07-12T03:44:00
+2005-07-12T09:44:00
+2005-07-12T15:44:00
+2005-07-12T21:44:00
+2005-07-13T03:44:00
+2005-07-13T09:44:00
+2005-07-13T15:44:00
+2005-07-13T21:44:00
+2005-07-14T03:44:00
+2005-07-14T09:44:00
+2005-07-14T15:44:00
+2005-07-14T21:44:00
+2005-07-15T03:44:00
+2005-07-15T09:44:00
+2005-07-15T15:44:00
+2005-07-15T21:44:00
+2005-07-16T03:44:00
+2005-07-16T09:44:00
+2005-07-16T15:44:00
+2005-07-16T21:44:00
+2005-07-17T03:44:00
+2005-07-17T09:44:00
+2005-07-17T15:44:00
+2005-07-17T21:44:00
+2005-07-18T03:44:00
+2005-07-18T09:44:00
+2005-07-18T15:44:00
+2005-07-18T21:44:00
+2005-07-19T03:44:00
+2005-07-19T09:44:00
+2005-07-19T15:44:00
+2005-07-19T21:44:00
+2005-07-20T03:44:00
+2005-07-20T09:44:00
+2005-07-20T15:44:00
+2005-07-20T21:44:00
+2005-07-21T03:44:00
+2005-07-21T09:44:00
+2005-07-21T15:44:00
+2005-07-21T21:44:00
+2005-07-22T03:44:00
+2005-07-22T09:44:00
+2005-07-22T15:44:00
+2005-07-22T21:44:00
+2005-07-23T03:44:00
+2005-07-23T09:44:00
+2005-07-23T15:44:00
+2005-07-23T21:44:00
+2005-07-24T03:44:00
+2005-07-24T09:44:00
+2005-07-24T15:44:00
+2005-07-24T21:44:00
+2005-07-25T03:44:00
+2005-07-25T09:44:00
+2005-07-25T15:44:00
+2005-07-25T21:44:00
+2005-07-26T03:44:00
+2005-07-26T09:44:00
+2005-07-26T15:44:00
+2005-07-26T21:44:00
+2005-07-27T03:44:00
+2005-07-27T09:44:00
+2005-07-27T15:44:00
+2005-07-27T21:44:00
+2005-07-28T03:44:00
+2005-07-28T09:44:00
+2005-07-28T15:44:00
+2005-07-28T21:44:00
+2005-07-29T03:44:00
+2005-07-29T09:44:00
+2005-07-29T15:44:00
+2005-07-29T21:44:00
+2005-07-30T03:44:00
+2005-07-30T09:44:00
+2005-07-30T15:44:00
+2005-07-30T21:44:00
+2005-07-31T03:44:00
+2005-07-31T09:44:00
+2005-07-31T15:44:00
+2005-07-31T21:44:00
+2005-08-01T03:44:00
+2005-08-01T09:44:00
+2005-08-01T15:44:00
+2005-08-01T21:44:00
+2005-08-02T03:44:00
+2005-08-02T09:44:00
+2005-08-02T15:44:00
+2005-08-02T21:44:00
+2005-08-03T03:44:00
+2005-08-03T09:44:00
+2005-08-03T15:44:00
+2005-08-03T21:44:00
+2005-08-04T03:44:00
+2005-08-04T09:44:00
+2005-08-04T15:44:00
+2005-08-04T21:44:00
+2005-08-05T03:44:00
+2005-08-05T09:44:00
+2005-08-05T15:44:00
+2005-08-05T21:44:00
+2005-08-06T03:44:00
+2005-08-06T09:44:00
+2005-08-06T15:44:00
+2005-08-06T21:44:00
+2005-08-07T03:44:00
+2005-08-07T09:44:00
+2005-08-07T15:44:00
+2005-08-07T21:44:00
+2005-08-08T03:44:00
+2005-08-08T09:44:00
+2005-08-08T15:44:00
+2005-08-08T21:44:00
+2005-08-09T03:44:00
+2005-08-09T09:44:00
+2005-08-09T15:44:00
+2005-08-09T21:44:00
+2005-08-10T03:44:00
+2005-08-10T09:44:00
+2005-08-10T15:44:00
+2005-08-10T21:44:00
+2005-08-11T03:44:00
+2005-08-11T09:44:00
+2005-08-11T15:44:00
+2005-08-11T21:44:00
+2005-08-12T03:44:00
+2005-08-12T09:44:00
+2005-08-12T15:44:00
+2005-08-12T21:44:00
+2005-08-13T03:44:00
+2005-08-13T09:44:00
+2005-08-13T15:44:00
+2005-08-13T21:44:00
+2005-08-14T03:44:00
+2005-08-14T09:44:00
+2005-08-14T15:44:00
+2005-08-14T21:44:00
+2005-08-15T03:44:00
+2005-08-15T09:44:00
+2005-08-15T15:44:00
+2005-08-15T21:44:00
+2005-08-16T03:44:00
+2005-08-16T09:44:00
+2005-08-16T15:44:00
+2005-08-16T21:44:00
+2005-08-17T03:44:00
+2005-08-17T09:44:00
+2005-08-17T15:44:00
+2005-08-17T21:44:00
+2005-08-18T03:44:00
+2005-08-18T09:44:00
+2005-08-18T15:44:00
+2005-08-18T21:44:00
+2005-08-19T03:44:00
+2005-08-19T09:44:00
+2005-08-19T15:44:00
+2005-08-19T21:44:00
+2005-08-20T03:44:00
+2005-08-20T09:44:00
+2005-08-20T15:44:00
+2005-08-20T21:44:00
+2005-08-21T03:44:00
+2005-08-21T09:44:00
+2005-08-21T15:44:00
+2005-08-21T21:44:00
+2005-08-22T03:44:00
+2005-08-22T09:44:00
+2005-08-22T15:44:00
+2005-08-22T21:44:00
+2005-08-23T03:44:00
+2005-08-23T09:44:00
+2005-08-23T15:44:00
+2005-08-23T21:44:00
+2005-08-24T03:44:00
+2005-08-24T09:44:00
+2005-08-24T15:44:00
+2005-08-24T21:44:00
+2005-08-25T03:44:00
+2005-08-25T09:44:00
+2005-08-25T15:44:00
+2005-08-25T21:44:00
+2005-08-26T03:44:00
+2005-08-26T09:44:00
+2005-08-26T15:44:00
+2005-08-26T21:44:00
+2005-08-27T03:44:00
+2005-08-27T09:44:00
+2005-08-27T15:44:00
+2005-08-27T21:44:00
+2005-08-28T03:44:00
+2005-08-28T09:44:00
+2005-08-28T15:44:00
+2005-08-28T21:44:00
+2005-08-29T03:44:00
+2005-08-29T09:44:00
+2005-08-29T15:44:00
+2005-08-29T21:44:00
+2005-08-30T03:44:00
+2005-08-30T09:44:00
+2005-08-30T15:44:00
+2005-08-30T21:44:00
+2005-08-31T03:44:00
+2005-08-31T09:44:00
+2005-08-31T15:44:00
+2005-08-31T21:44:00
+2005-09-01T03:44:00
+2005-09-01T09:44:00
+2005-09-01T15:44:00
+2005-09-01T21:44:00
+2005-09-02T03:44:00
+2005-09-02T09:44:00
+2005-09-02T15:44:00
+2005-09-02T21:44:00
+2005-09-03T03:44:00
+2005-09-03T09:44:00
+2005-09-03T15:44:00
+2005-09-03T21:44:00
+2005-09-04T03:44:00
+2005-09-04T09:44:00
+2005-09-04T15:44:00
+2005-09-04T21:44:00
+2005-09-05T03:44:00
+2005-09-05T09:44:00
+2005-09-05T15:44:00
+2005-09-05T21:44:00
+2005-09-06T03:44:00
+2005-09-06T09:44:00
+2005-09-06T15:44:00
+2005-09-06T21:44:00
+2005-09-07T03:44:00
+2005-09-07T09:44:00
+2005-09-07T15:44:00
+2005-09-07T21:44:00
+2005-09-08T03:44:00
+2005-09-08T09:44:00
+2005-09-08T15:44:00
+2005-09-08T21:44:00
+2005-09-09T03:44:00
+2005-09-09T09:44:00
+2005-09-09T15:44:00
+2005-09-09T21:44:00
+2005-09-10T03:44:00
+2005-09-10T09:44:00
+2005-09-10T15:44:00
+2005-09-10T21:44:00
+2005-09-11T03:44:00
+2005-09-11T09:44:00
+2005-09-11T15:44:00
+2005-09-11T21:44:00
+2005-09-12T03:44:00
+2005-09-12T09:44:00
+2005-09-12T15:44:00
+2005-09-12T21:44:00
+2005-09-13T03:44:00
+2005-09-13T09:44:00
+2005-09-13T15:44:00
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/hourly.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/unsorted/hourly.ics.prev.ref
new file mode 100644
index 00000000..8f49adb4
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/hourly.ics.prev.ref
@@ -0,0 +1,500 @@
+2010-12-31T21:44:00
+2010-12-31T15:44:00
+2010-12-31T09:44:00
+2010-12-31T03:44:00
+2010-12-30T21:44:00
+2010-12-30T15:44:00
+2010-12-30T09:44:00
+2010-12-30T03:44:00
+2010-12-29T21:44:00
+2010-12-29T15:44:00
+2010-12-29T09:44:00
+2010-12-29T03:44:00
+2010-12-28T21:44:00
+2010-12-28T15:44:00
+2010-12-28T09:44:00
+2010-12-28T03:44:00
+2010-12-27T21:44:00
+2010-12-27T15:44:00
+2010-12-27T09:44:00
+2010-12-27T03:44:00
+2010-12-26T21:44:00
+2010-12-26T15:44:00
+2010-12-26T09:44:00
+2010-12-26T03:44:00
+2010-12-25T21:44:00
+2010-12-25T15:44:00
+2010-12-25T09:44:00
+2010-12-25T03:44:00
+2010-12-24T21:44:00
+2010-12-24T15:44:00
+2010-12-24T09:44:00
+2010-12-24T03:44:00
+2010-12-23T21:44:00
+2010-12-23T15:44:00
+2010-12-23T09:44:00
+2010-12-23T03:44:00
+2010-12-22T21:44:00
+2010-12-22T15:44:00
+2010-12-22T09:44:00
+2010-12-22T03:44:00
+2010-12-21T21:44:00
+2010-12-21T15:44:00
+2010-12-21T09:44:00
+2010-12-21T03:44:00
+2010-12-20T21:44:00
+2010-12-20T15:44:00
+2010-12-20T09:44:00
+2010-12-20T03:44:00
+2010-12-19T21:44:00
+2010-12-19T15:44:00
+2010-12-19T09:44:00
+2010-12-19T03:44:00
+2010-12-18T21:44:00
+2010-12-18T15:44:00
+2010-12-18T09:44:00
+2010-12-18T03:44:00
+2010-12-17T21:44:00
+2010-12-17T15:44:00
+2010-12-17T09:44:00
+2010-12-17T03:44:00
+2010-12-16T21:44:00
+2010-12-16T15:44:00
+2010-12-16T09:44:00
+2010-12-16T03:44:00
+2010-12-15T21:44:00
+2010-12-15T15:44:00
+2010-12-15T09:44:00
+2010-12-15T03:44:00
+2010-12-14T21:44:00
+2010-12-14T15:44:00
+2010-12-14T09:44:00
+2010-12-14T03:44:00
+2010-12-13T21:44:00
+2010-12-13T15:44:00
+2010-12-13T09:44:00
+2010-12-13T03:44:00
+2010-12-12T21:44:00
+2010-12-12T15:44:00
+2010-12-12T09:44:00
+2010-12-12T03:44:00
+2010-12-11T21:44:00
+2010-12-11T15:44:00
+2010-12-11T09:44:00
+2010-12-11T03:44:00
+2010-12-10T21:44:00
+2010-12-10T15:44:00
+2010-12-10T09:44:00
+2010-12-10T03:44:00
+2010-12-09T21:44:00
+2010-12-09T15:44:00
+2010-12-09T09:44:00
+2010-12-09T03:44:00
+2010-12-08T21:44:00
+2010-12-08T15:44:00
+2010-12-08T09:44:00
+2010-12-08T03:44:00
+2010-12-07T21:44:00
+2010-12-07T15:44:00
+2010-12-07T09:44:00
+2010-12-07T03:44:00
+2010-12-06T21:44:00
+2010-12-06T15:44:00
+2010-12-06T09:44:00
+2010-12-06T03:44:00
+2010-12-05T21:44:00
+2010-12-05T15:44:00
+2010-12-05T09:44:00
+2010-12-05T03:44:00
+2010-12-04T21:44:00
+2010-12-04T15:44:00
+2010-12-04T09:44:00
+2010-12-04T03:44:00
+2010-12-03T21:44:00
+2010-12-03T15:44:00
+2010-12-03T09:44:00
+2010-12-03T03:44:00
+2010-12-02T21:44:00
+2010-12-02T15:44:00
+2010-12-02T09:44:00
+2010-12-02T03:44:00
+2010-12-01T21:44:00
+2010-12-01T15:44:00
+2010-12-01T09:44:00
+2010-12-01T03:44:00
+2010-11-30T21:44:00
+2010-11-30T15:44:00
+2010-11-30T09:44:00
+2010-11-30T03:44:00
+2010-11-29T21:44:00
+2010-11-29T15:44:00
+2010-11-29T09:44:00
+2010-11-29T03:44:00
+2010-11-28T21:44:00
+2010-11-28T15:44:00
+2010-11-28T09:44:00
+2010-11-28T03:44:00
+2010-11-27T21:44:00
+2010-11-27T15:44:00
+2010-11-27T09:44:00
+2010-11-27T03:44:00
+2010-11-26T21:44:00
+2010-11-26T15:44:00
+2010-11-26T09:44:00
+2010-11-26T03:44:00
+2010-11-25T21:44:00
+2010-11-25T15:44:00
+2010-11-25T09:44:00
+2010-11-25T03:44:00
+2010-11-24T21:44:00
+2010-11-24T15:44:00
+2010-11-24T09:44:00
+2010-11-24T03:44:00
+2010-11-23T21:44:00
+2010-11-23T15:44:00
+2010-11-23T09:44:00
+2010-11-23T03:44:00
+2010-11-22T21:44:00
+2010-11-22T15:44:00
+2010-11-22T09:44:00
+2010-11-22T03:44:00
+2010-11-21T21:44:00
+2010-11-21T15:44:00
+2010-11-21T09:44:00
+2010-11-21T03:44:00
+2010-11-20T21:44:00
+2010-11-20T15:44:00
+2010-11-20T09:44:00
+2010-11-20T03:44:00
+2010-11-19T21:44:00
+2010-11-19T15:44:00
+2010-11-19T09:44:00
+2010-11-19T03:44:00
+2010-11-18T21:44:00
+2010-11-18T15:44:00
+2010-11-18T09:44:00
+2010-11-18T03:44:00
+2010-11-17T21:44:00
+2010-11-17T15:44:00
+2010-11-17T09:44:00
+2010-11-17T03:44:00
+2010-11-16T21:44:00
+2010-11-16T15:44:00
+2010-11-16T09:44:00
+2010-11-16T03:44:00
+2010-11-15T21:44:00
+2010-11-15T15:44:00
+2010-11-15T09:44:00
+2010-11-15T03:44:00
+2010-11-14T21:44:00
+2010-11-14T15:44:00
+2010-11-14T09:44:00
+2010-11-14T03:44:00
+2010-11-13T21:44:00
+2010-11-13T15:44:00
+2010-11-13T09:44:00
+2010-11-13T03:44:00
+2010-11-12T21:44:00
+2010-11-12T15:44:00
+2010-11-12T09:44:00
+2010-11-12T03:44:00
+2010-11-11T21:44:00
+2010-11-11T15:44:00
+2010-11-11T09:44:00
+2010-11-11T03:44:00
+2010-11-10T21:44:00
+2010-11-10T15:44:00
+2010-11-10T09:44:00
+2010-11-10T03:44:00
+2010-11-09T21:44:00
+2010-11-09T15:44:00
+2010-11-09T09:44:00
+2010-11-09T03:44:00
+2010-11-08T21:44:00
+2010-11-08T15:44:00
+2010-11-08T09:44:00
+2010-11-08T03:44:00
+2010-11-07T21:44:00
+2010-11-07T15:44:00
+2010-11-07T09:44:00
+2010-11-07T03:44:00
+2010-11-06T21:44:00
+2010-11-06T15:44:00
+2010-11-06T09:44:00
+2010-11-06T03:44:00
+2010-11-05T21:44:00
+2010-11-05T15:44:00
+2010-11-05T09:44:00
+2010-11-05T03:44:00
+2010-11-04T21:44:00
+2010-11-04T15:44:00
+2010-11-04T09:44:00
+2010-11-04T03:44:00
+2010-11-03T21:44:00
+2010-11-03T15:44:00
+2010-11-03T09:44:00
+2010-11-03T03:44:00
+2010-11-02T21:44:00
+2010-11-02T15:44:00
+2010-11-02T09:44:00
+2010-11-02T03:44:00
+2010-11-01T21:44:00
+2010-11-01T15:44:00
+2010-11-01T09:44:00
+2010-11-01T03:44:00
+2010-10-31T21:44:00
+2010-10-31T15:44:00
+2010-10-31T09:44:00
+2010-10-31T03:44:00
+2010-10-30T21:44:00
+2010-10-30T15:44:00
+2010-10-30T09:44:00
+2010-10-30T03:44:00
+2010-10-29T21:44:00
+2010-10-29T15:44:00
+2010-10-29T09:44:00
+2010-10-29T03:44:00
+2010-10-28T21:44:00
+2010-10-28T15:44:00
+2010-10-28T09:44:00
+2010-10-28T03:44:00
+2010-10-27T21:44:00
+2010-10-27T15:44:00
+2010-10-27T09:44:00
+2010-10-27T03:44:00
+2010-10-26T21:44:00
+2010-10-26T15:44:00
+2010-10-26T09:44:00
+2010-10-26T03:44:00
+2010-10-25T21:44:00
+2010-10-25T15:44:00
+2010-10-25T09:44:00
+2010-10-25T03:44:00
+2010-10-24T21:44:00
+2010-10-24T15:44:00
+2010-10-24T09:44:00
+2010-10-24T03:44:00
+2010-10-23T21:44:00
+2010-10-23T15:44:00
+2010-10-23T09:44:00
+2010-10-23T03:44:00
+2010-10-22T21:44:00
+2010-10-22T15:44:00
+2010-10-22T09:44:00
+2010-10-22T03:44:00
+2010-10-21T21:44:00
+2010-10-21T15:44:00
+2010-10-21T09:44:00
+2010-10-21T03:44:00
+2010-10-20T21:44:00
+2010-10-20T15:44:00
+2010-10-20T09:44:00
+2010-10-20T03:44:00
+2010-10-19T21:44:00
+2010-10-19T15:44:00
+2010-10-19T09:44:00
+2010-10-19T03:44:00
+2010-10-18T21:44:00
+2010-10-18T15:44:00
+2010-10-18T09:44:00
+2010-10-18T03:44:00
+2010-10-17T21:44:00
+2010-10-17T15:44:00
+2010-10-17T09:44:00
+2010-10-17T03:44:00
+2010-10-16T21:44:00
+2010-10-16T15:44:00
+2010-10-16T09:44:00
+2010-10-16T03:44:00
+2010-10-15T21:44:00
+2010-10-15T15:44:00
+2010-10-15T09:44:00
+2010-10-15T03:44:00
+2010-10-14T21:44:00
+2010-10-14T15:44:00
+2010-10-14T09:44:00
+2010-10-14T03:44:00
+2010-10-13T21:44:00
+2010-10-13T15:44:00
+2010-10-13T09:44:00
+2010-10-13T03:44:00
+2010-10-12T21:44:00
+2010-10-12T15:44:00
+2010-10-12T09:44:00
+2010-10-12T03:44:00
+2010-10-11T21:44:00
+2010-10-11T15:44:00
+2010-10-11T09:44:00
+2010-10-11T03:44:00
+2010-10-10T21:44:00
+2010-10-10T15:44:00
+2010-10-10T09:44:00
+2010-10-10T03:44:00
+2010-10-09T21:44:00
+2010-10-09T15:44:00
+2010-10-09T09:44:00
+2010-10-09T03:44:00
+2010-10-08T21:44:00
+2010-10-08T15:44:00
+2010-10-08T09:44:00
+2010-10-08T03:44:00
+2010-10-07T21:44:00
+2010-10-07T15:44:00
+2010-10-07T09:44:00
+2010-10-07T03:44:00
+2010-10-06T21:44:00
+2010-10-06T15:44:00
+2010-10-06T09:44:00
+2010-10-06T03:44:00
+2010-10-05T21:44:00
+2010-10-05T15:44:00
+2010-10-05T09:44:00
+2010-10-05T03:44:00
+2010-10-04T21:44:00
+2010-10-04T15:44:00
+2010-10-04T09:44:00
+2010-10-04T03:44:00
+2010-10-03T21:44:00
+2010-10-03T15:44:00
+2010-10-03T09:44:00
+2010-10-03T03:44:00
+2010-10-02T21:44:00
+2010-10-02T15:44:00
+2010-10-02T09:44:00
+2010-10-02T03:44:00
+2010-10-01T21:44:00
+2010-10-01T15:44:00
+2010-10-01T09:44:00
+2010-10-01T03:44:00
+2010-09-30T21:44:00
+2010-09-30T15:44:00
+2010-09-30T09:44:00
+2010-09-30T03:44:00
+2010-09-29T21:44:00
+2010-09-29T15:44:00
+2010-09-29T09:44:00
+2010-09-29T03:44:00
+2010-09-28T21:44:00
+2010-09-28T15:44:00
+2010-09-28T09:44:00
+2010-09-28T03:44:00
+2010-09-27T21:44:00
+2010-09-27T15:44:00
+2010-09-27T09:44:00
+2010-09-27T03:44:00
+2010-09-26T21:44:00
+2010-09-26T15:44:00
+2010-09-26T09:44:00
+2010-09-26T03:44:00
+2010-09-25T21:44:00
+2010-09-25T15:44:00
+2010-09-25T09:44:00
+2010-09-25T03:44:00
+2010-09-24T21:44:00
+2010-09-24T15:44:00
+2010-09-24T09:44:00
+2010-09-24T03:44:00
+2010-09-23T21:44:00
+2010-09-23T15:44:00
+2010-09-23T09:44:00
+2010-09-23T03:44:00
+2010-09-22T21:44:00
+2010-09-22T15:44:00
+2010-09-22T09:44:00
+2010-09-22T03:44:00
+2010-09-21T21:44:00
+2010-09-21T15:44:00
+2010-09-21T09:44:00
+2010-09-21T03:44:00
+2010-09-20T21:44:00
+2010-09-20T15:44:00
+2010-09-20T09:44:00
+2010-09-20T03:44:00
+2010-09-19T21:44:00
+2010-09-19T15:44:00
+2010-09-19T09:44:00
+2010-09-19T03:44:00
+2010-09-18T21:44:00
+2010-09-18T15:44:00
+2010-09-18T09:44:00
+2010-09-18T03:44:00
+2010-09-17T21:44:00
+2010-09-17T15:44:00
+2010-09-17T09:44:00
+2010-09-17T03:44:00
+2010-09-16T21:44:00
+2010-09-16T15:44:00
+2010-09-16T09:44:00
+2010-09-16T03:44:00
+2010-09-15T21:44:00
+2010-09-15T15:44:00
+2010-09-15T09:44:00
+2010-09-15T03:44:00
+2010-09-14T21:44:00
+2010-09-14T15:44:00
+2010-09-14T09:44:00
+2010-09-14T03:44:00
+2010-09-13T21:44:00
+2010-09-13T15:44:00
+2010-09-13T09:44:00
+2010-09-13T03:44:00
+2010-09-12T21:44:00
+2010-09-12T15:44:00
+2010-09-12T09:44:00
+2010-09-12T03:44:00
+2010-09-11T21:44:00
+2010-09-11T15:44:00
+2010-09-11T09:44:00
+2010-09-11T03:44:00
+2010-09-10T21:44:00
+2010-09-10T15:44:00
+2010-09-10T09:44:00
+2010-09-10T03:44:00
+2010-09-09T21:44:00
+2010-09-09T15:44:00
+2010-09-09T09:44:00
+2010-09-09T03:44:00
+2010-09-08T21:44:00
+2010-09-08T15:44:00
+2010-09-08T09:44:00
+2010-09-08T03:44:00
+2010-09-07T21:44:00
+2010-09-07T15:44:00
+2010-09-07T09:44:00
+2010-09-07T03:44:00
+2010-09-06T21:44:00
+2010-09-06T15:44:00
+2010-09-06T09:44:00
+2010-09-06T03:44:00
+2010-09-05T21:44:00
+2010-09-05T15:44:00
+2010-09-05T09:44:00
+2010-09-05T03:44:00
+2010-09-04T21:44:00
+2010-09-04T15:44:00
+2010-09-04T09:44:00
+2010-09-04T03:44:00
+2010-09-03T21:44:00
+2010-09-03T15:44:00
+2010-09-03T09:44:00
+2010-09-03T03:44:00
+2010-09-02T21:44:00
+2010-09-02T15:44:00
+2010-09-02T09:44:00
+2010-09-02T03:44:00
+2010-09-01T21:44:00
+2010-09-01T15:44:00
+2010-09-01T09:44:00
+2010-09-01T03:44:00
+2010-08-31T21:44:00
+2010-08-31T15:44:00
+2010-08-31T09:44:00
+2010-08-31T03:44:00
+2010-08-30T21:44:00
+2010-08-30T15:44:00
+2010-08-30T09:44:00
+2010-08-30T03:44:00
+2010-08-29T21:44:00
+2010-08-29T15:44:00
+2010-08-29T09:44:00
+2010-08-29T03:44:00
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/hourly.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/unsorted/hourly.ics.recurson.ref
new file mode 100644
index 00000000..0d80c06f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/hourly.ics.recurson.ref
@@ -0,0 +1,2060 @@
+2005-05-12
+2005-05-13
+2005-05-14
+2005-05-15
+2005-05-16
+2005-05-17
+2005-05-18
+2005-05-19
+2005-05-20
+2005-05-21
+2005-05-22
+2005-05-23
+2005-05-24
+2005-05-25
+2005-05-26
+2005-05-27
+2005-05-28
+2005-05-29
+2005-05-30
+2005-05-31
+2005-06-01
+2005-06-02
+2005-06-03
+2005-06-04
+2005-06-05
+2005-06-06
+2005-06-07
+2005-06-08
+2005-06-09
+2005-06-10
+2005-06-11
+2005-06-12
+2005-06-13
+2005-06-14
+2005-06-15
+2005-06-16
+2005-06-17
+2005-06-18
+2005-06-19
+2005-06-20
+2005-06-21
+2005-06-22
+2005-06-23
+2005-06-24
+2005-06-25
+2005-06-26
+2005-06-27
+2005-06-28
+2005-06-29
+2005-06-30
+2005-07-01
+2005-07-02
+2005-07-03
+2005-07-04
+2005-07-05
+2005-07-06
+2005-07-07
+2005-07-08
+2005-07-09
+2005-07-10
+2005-07-11
+2005-07-12
+2005-07-13
+2005-07-14
+2005-07-15
+2005-07-16
+2005-07-17
+2005-07-18
+2005-07-19
+2005-07-20
+2005-07-21
+2005-07-22
+2005-07-23
+2005-07-24
+2005-07-25
+2005-07-26
+2005-07-27
+2005-07-28
+2005-07-29
+2005-07-30
+2005-07-31
+2005-08-01
+2005-08-02
+2005-08-03
+2005-08-04
+2005-08-05
+2005-08-06
+2005-08-07
+2005-08-08
+2005-08-09
+2005-08-10
+2005-08-11
+2005-08-12
+2005-08-13
+2005-08-14
+2005-08-15
+2005-08-16
+2005-08-17
+2005-08-18
+2005-08-19
+2005-08-20
+2005-08-21
+2005-08-22
+2005-08-23
+2005-08-24
+2005-08-25
+2005-08-26
+2005-08-27
+2005-08-28
+2005-08-29
+2005-08-30
+2005-08-31
+2005-09-01
+2005-09-02
+2005-09-03
+2005-09-04
+2005-09-05
+2005-09-06
+2005-09-07
+2005-09-08
+2005-09-09
+2005-09-10
+2005-09-11
+2005-09-12
+2005-09-13
+2005-09-14
+2005-09-15
+2005-09-16
+2005-09-17
+2005-09-18
+2005-09-19
+2005-09-20
+2005-09-21
+2005-09-22
+2005-09-23
+2005-09-24
+2005-09-25
+2005-09-26
+2005-09-27
+2005-09-28
+2005-09-29
+2005-09-30
+2005-10-01
+2005-10-02
+2005-10-03
+2005-10-04
+2005-10-05
+2005-10-06
+2005-10-07
+2005-10-08
+2005-10-09
+2005-10-10
+2005-10-11
+2005-10-12
+2005-10-13
+2005-10-14
+2005-10-15
+2005-10-16
+2005-10-17
+2005-10-18
+2005-10-19
+2005-10-20
+2005-10-21
+2005-10-22
+2005-10-23
+2005-10-24
+2005-10-25
+2005-10-26
+2005-10-27
+2005-10-28
+2005-10-29
+2005-10-30
+2005-10-31
+2005-11-01
+2005-11-02
+2005-11-03
+2005-11-04
+2005-11-05
+2005-11-06
+2005-11-07
+2005-11-08
+2005-11-09
+2005-11-10
+2005-11-11
+2005-11-12
+2005-11-13
+2005-11-14
+2005-11-15
+2005-11-16
+2005-11-17
+2005-11-18
+2005-11-19
+2005-11-20
+2005-11-21
+2005-11-22
+2005-11-23
+2005-11-24
+2005-11-25
+2005-11-26
+2005-11-27
+2005-11-28
+2005-11-29
+2005-11-30
+2005-12-01
+2005-12-02
+2005-12-03
+2005-12-04
+2005-12-05
+2005-12-06
+2005-12-07
+2005-12-08
+2005-12-09
+2005-12-10
+2005-12-11
+2005-12-12
+2005-12-13
+2005-12-14
+2005-12-15
+2005-12-16
+2005-12-17
+2005-12-18
+2005-12-19
+2005-12-20
+2005-12-21
+2005-12-22
+2005-12-23
+2005-12-24
+2005-12-25
+2005-12-26
+2005-12-27
+2005-12-28
+2005-12-29
+2005-12-30
+2005-12-31
+2006-01-01
+2006-01-02
+2006-01-03
+2006-01-04
+2006-01-05
+2006-01-06
+2006-01-07
+2006-01-08
+2006-01-09
+2006-01-10
+2006-01-11
+2006-01-12
+2006-01-13
+2006-01-14
+2006-01-15
+2006-01-16
+2006-01-17
+2006-01-18
+2006-01-19
+2006-01-20
+2006-01-21
+2006-01-22
+2006-01-23
+2006-01-24
+2006-01-25
+2006-01-26
+2006-01-27
+2006-01-28
+2006-01-29
+2006-01-30
+2006-01-31
+2006-02-01
+2006-02-02
+2006-02-03
+2006-02-04
+2006-02-05
+2006-02-06
+2006-02-07
+2006-02-08
+2006-02-09
+2006-02-10
+2006-02-11
+2006-02-12
+2006-02-13
+2006-02-14
+2006-02-15
+2006-02-16
+2006-02-17
+2006-02-18
+2006-02-19
+2006-02-20
+2006-02-21
+2006-02-22
+2006-02-23
+2006-02-24
+2006-02-25
+2006-02-26
+2006-02-27
+2006-02-28
+2006-03-01
+2006-03-02
+2006-03-03
+2006-03-04
+2006-03-05
+2006-03-06
+2006-03-07
+2006-03-08
+2006-03-09
+2006-03-10
+2006-03-11
+2006-03-12
+2006-03-13
+2006-03-14
+2006-03-15
+2006-03-16
+2006-03-17
+2006-03-18
+2006-03-19
+2006-03-20
+2006-03-21
+2006-03-22
+2006-03-23
+2006-03-24
+2006-03-25
+2006-03-26
+2006-03-27
+2006-03-28
+2006-03-29
+2006-03-30
+2006-03-31
+2006-04-01
+2006-04-02
+2006-04-03
+2006-04-04
+2006-04-05
+2006-04-06
+2006-04-07
+2006-04-08
+2006-04-09
+2006-04-10
+2006-04-11
+2006-04-12
+2006-04-13
+2006-04-14
+2006-04-15
+2006-04-16
+2006-04-17
+2006-04-18
+2006-04-19
+2006-04-20
+2006-04-21
+2006-04-22
+2006-04-23
+2006-04-24
+2006-04-25
+2006-04-26
+2006-04-27
+2006-04-28
+2006-04-29
+2006-04-30
+2006-05-01
+2006-05-02
+2006-05-03
+2006-05-04
+2006-05-05
+2006-05-06
+2006-05-07
+2006-05-08
+2006-05-09
+2006-05-10
+2006-05-11
+2006-05-12
+2006-05-13
+2006-05-14
+2006-05-15
+2006-05-16
+2006-05-17
+2006-05-18
+2006-05-19
+2006-05-20
+2006-05-21
+2006-05-22
+2006-05-23
+2006-05-24
+2006-05-25
+2006-05-26
+2006-05-27
+2006-05-28
+2006-05-29
+2006-05-30
+2006-05-31
+2006-06-01
+2006-06-02
+2006-06-03
+2006-06-04
+2006-06-05
+2006-06-06
+2006-06-07
+2006-06-08
+2006-06-09
+2006-06-10
+2006-06-11
+2006-06-12
+2006-06-13
+2006-06-14
+2006-06-15
+2006-06-16
+2006-06-17
+2006-06-18
+2006-06-19
+2006-06-20
+2006-06-21
+2006-06-22
+2006-06-23
+2006-06-24
+2006-06-25
+2006-06-26
+2006-06-27
+2006-06-28
+2006-06-29
+2006-06-30
+2006-07-01
+2006-07-02
+2006-07-03
+2006-07-04
+2006-07-05
+2006-07-06
+2006-07-07
+2006-07-08
+2006-07-09
+2006-07-10
+2006-07-11
+2006-07-12
+2006-07-13
+2006-07-14
+2006-07-15
+2006-07-16
+2006-07-17
+2006-07-18
+2006-07-19
+2006-07-20
+2006-07-21
+2006-07-22
+2006-07-23
+2006-07-24
+2006-07-25
+2006-07-26
+2006-07-27
+2006-07-28
+2006-07-29
+2006-07-30
+2006-07-31
+2006-08-01
+2006-08-02
+2006-08-03
+2006-08-04
+2006-08-05
+2006-08-06
+2006-08-07
+2006-08-08
+2006-08-09
+2006-08-10
+2006-08-11
+2006-08-12
+2006-08-13
+2006-08-14
+2006-08-15
+2006-08-16
+2006-08-17
+2006-08-18
+2006-08-19
+2006-08-20
+2006-08-21
+2006-08-22
+2006-08-23
+2006-08-24
+2006-08-25
+2006-08-26
+2006-08-27
+2006-08-28
+2006-08-29
+2006-08-30
+2006-08-31
+2006-09-01
+2006-09-02
+2006-09-03
+2006-09-04
+2006-09-05
+2006-09-06
+2006-09-07
+2006-09-08
+2006-09-09
+2006-09-10
+2006-09-11
+2006-09-12
+2006-09-13
+2006-09-14
+2006-09-15
+2006-09-16
+2006-09-17
+2006-09-18
+2006-09-19
+2006-09-20
+2006-09-21
+2006-09-22
+2006-09-23
+2006-09-24
+2006-09-25
+2006-09-26
+2006-09-27
+2006-09-28
+2006-09-29
+2006-09-30
+2006-10-01
+2006-10-02
+2006-10-03
+2006-10-04
+2006-10-05
+2006-10-06
+2006-10-07
+2006-10-08
+2006-10-09
+2006-10-10
+2006-10-11
+2006-10-12
+2006-10-13
+2006-10-14
+2006-10-15
+2006-10-16
+2006-10-17
+2006-10-18
+2006-10-19
+2006-10-20
+2006-10-21
+2006-10-22
+2006-10-23
+2006-10-24
+2006-10-25
+2006-10-26
+2006-10-27
+2006-10-28
+2006-10-29
+2006-10-30
+2006-10-31
+2006-11-01
+2006-11-02
+2006-11-03
+2006-11-04
+2006-11-05
+2006-11-06
+2006-11-07
+2006-11-08
+2006-11-09
+2006-11-10
+2006-11-11
+2006-11-12
+2006-11-13
+2006-11-14
+2006-11-15
+2006-11-16
+2006-11-17
+2006-11-18
+2006-11-19
+2006-11-20
+2006-11-21
+2006-11-22
+2006-11-23
+2006-11-24
+2006-11-25
+2006-11-26
+2006-11-27
+2006-11-28
+2006-11-29
+2006-11-30
+2006-12-01
+2006-12-02
+2006-12-03
+2006-12-04
+2006-12-05
+2006-12-06
+2006-12-07
+2006-12-08
+2006-12-09
+2006-12-10
+2006-12-11
+2006-12-12
+2006-12-13
+2006-12-14
+2006-12-15
+2006-12-16
+2006-12-17
+2006-12-18
+2006-12-19
+2006-12-20
+2006-12-21
+2006-12-22
+2006-12-23
+2006-12-24
+2006-12-25
+2006-12-26
+2006-12-27
+2006-12-28
+2006-12-29
+2006-12-30
+2006-12-31
+2007-01-01
+2007-01-02
+2007-01-03
+2007-01-04
+2007-01-05
+2007-01-06
+2007-01-07
+2007-01-08
+2007-01-09
+2007-01-10
+2007-01-11
+2007-01-12
+2007-01-13
+2007-01-14
+2007-01-15
+2007-01-16
+2007-01-17
+2007-01-18
+2007-01-19
+2007-01-20
+2007-01-21
+2007-01-22
+2007-01-23
+2007-01-24
+2007-01-25
+2007-01-26
+2007-01-27
+2007-01-28
+2007-01-29
+2007-01-30
+2007-01-31
+2007-02-01
+2007-02-02
+2007-02-03
+2007-02-04
+2007-02-05
+2007-02-06
+2007-02-07
+2007-02-08
+2007-02-09
+2007-02-10
+2007-02-11
+2007-02-12
+2007-02-13
+2007-02-14
+2007-02-15
+2007-02-16
+2007-02-17
+2007-02-18
+2007-02-19
+2007-02-20
+2007-02-21
+2007-02-22
+2007-02-23
+2007-02-24
+2007-02-25
+2007-02-26
+2007-02-27
+2007-02-28
+2007-03-01
+2007-03-02
+2007-03-03
+2007-03-04
+2007-03-05
+2007-03-06
+2007-03-07
+2007-03-08
+2007-03-09
+2007-03-10
+2007-03-11
+2007-03-12
+2007-03-13
+2007-03-14
+2007-03-15
+2007-03-16
+2007-03-17
+2007-03-18
+2007-03-19
+2007-03-20
+2007-03-21
+2007-03-22
+2007-03-23
+2007-03-24
+2007-03-25
+2007-03-26
+2007-03-27
+2007-03-28
+2007-03-29
+2007-03-30
+2007-03-31
+2007-04-01
+2007-04-02
+2007-04-03
+2007-04-04
+2007-04-05
+2007-04-06
+2007-04-07
+2007-04-08
+2007-04-09
+2007-04-10
+2007-04-11
+2007-04-12
+2007-04-13
+2007-04-14
+2007-04-15
+2007-04-16
+2007-04-17
+2007-04-18
+2007-04-19
+2007-04-20
+2007-04-21
+2007-04-22
+2007-04-23
+2007-04-24
+2007-04-25
+2007-04-26
+2007-04-27
+2007-04-28
+2007-04-29
+2007-04-30
+2007-05-01
+2007-05-02
+2007-05-03
+2007-05-04
+2007-05-05
+2007-05-06
+2007-05-07
+2007-05-08
+2007-05-09
+2007-05-10
+2007-05-11
+2007-05-12
+2007-05-13
+2007-05-14
+2007-05-15
+2007-05-16
+2007-05-17
+2007-05-18
+2007-05-19
+2007-05-20
+2007-05-21
+2007-05-22
+2007-05-23
+2007-05-24
+2007-05-25
+2007-05-26
+2007-05-27
+2007-05-28
+2007-05-29
+2007-05-30
+2007-05-31
+2007-06-01
+2007-06-02
+2007-06-03
+2007-06-04
+2007-06-05
+2007-06-06
+2007-06-07
+2007-06-08
+2007-06-09
+2007-06-10
+2007-06-11
+2007-06-12
+2007-06-13
+2007-06-14
+2007-06-15
+2007-06-16
+2007-06-17
+2007-06-18
+2007-06-19
+2007-06-20
+2007-06-21
+2007-06-22
+2007-06-23
+2007-06-24
+2007-06-25
+2007-06-26
+2007-06-27
+2007-06-28
+2007-06-29
+2007-06-30
+2007-07-01
+2007-07-02
+2007-07-03
+2007-07-04
+2007-07-05
+2007-07-06
+2007-07-07
+2007-07-08
+2007-07-09
+2007-07-10
+2007-07-11
+2007-07-12
+2007-07-13
+2007-07-14
+2007-07-15
+2007-07-16
+2007-07-17
+2007-07-18
+2007-07-19
+2007-07-20
+2007-07-21
+2007-07-22
+2007-07-23
+2007-07-24
+2007-07-25
+2007-07-26
+2007-07-27
+2007-07-28
+2007-07-29
+2007-07-30
+2007-07-31
+2007-08-01
+2007-08-02
+2007-08-03
+2007-08-04
+2007-08-05
+2007-08-06
+2007-08-07
+2007-08-08
+2007-08-09
+2007-08-10
+2007-08-11
+2007-08-12
+2007-08-13
+2007-08-14
+2007-08-15
+2007-08-16
+2007-08-17
+2007-08-18
+2007-08-19
+2007-08-20
+2007-08-21
+2007-08-22
+2007-08-23
+2007-08-24
+2007-08-25
+2007-08-26
+2007-08-27
+2007-08-28
+2007-08-29
+2007-08-30
+2007-08-31
+2007-09-01
+2007-09-02
+2007-09-03
+2007-09-04
+2007-09-05
+2007-09-06
+2007-09-07
+2007-09-08
+2007-09-09
+2007-09-10
+2007-09-11
+2007-09-12
+2007-09-13
+2007-09-14
+2007-09-15
+2007-09-16
+2007-09-17
+2007-09-18
+2007-09-19
+2007-09-20
+2007-09-21
+2007-09-22
+2007-09-23
+2007-09-24
+2007-09-25
+2007-09-26
+2007-09-27
+2007-09-28
+2007-09-29
+2007-09-30
+2007-10-01
+2007-10-02
+2007-10-03
+2007-10-04
+2007-10-05
+2007-10-06
+2007-10-07
+2007-10-08
+2007-10-09
+2007-10-10
+2007-10-11
+2007-10-12
+2007-10-13
+2007-10-14
+2007-10-15
+2007-10-16
+2007-10-17
+2007-10-18
+2007-10-19
+2007-10-20
+2007-10-21
+2007-10-22
+2007-10-23
+2007-10-24
+2007-10-25
+2007-10-26
+2007-10-27
+2007-10-28
+2007-10-29
+2007-10-30
+2007-10-31
+2007-11-01
+2007-11-02
+2007-11-03
+2007-11-04
+2007-11-05
+2007-11-06
+2007-11-07
+2007-11-08
+2007-11-09
+2007-11-10
+2007-11-11
+2007-11-12
+2007-11-13
+2007-11-14
+2007-11-15
+2007-11-16
+2007-11-17
+2007-11-18
+2007-11-19
+2007-11-20
+2007-11-21
+2007-11-22
+2007-11-23
+2007-11-24
+2007-11-25
+2007-11-26
+2007-11-27
+2007-11-28
+2007-11-29
+2007-11-30
+2007-12-01
+2007-12-02
+2007-12-03
+2007-12-04
+2007-12-05
+2007-12-06
+2007-12-07
+2007-12-08
+2007-12-09
+2007-12-10
+2007-12-11
+2007-12-12
+2007-12-13
+2007-12-14
+2007-12-15
+2007-12-16
+2007-12-17
+2007-12-18
+2007-12-19
+2007-12-20
+2007-12-21
+2007-12-22
+2007-12-23
+2007-12-24
+2007-12-25
+2007-12-26
+2007-12-27
+2007-12-28
+2007-12-29
+2007-12-30
+2007-12-31
+2008-01-01
+2008-01-02
+2008-01-03
+2008-01-04
+2008-01-05
+2008-01-06
+2008-01-07
+2008-01-08
+2008-01-09
+2008-01-10
+2008-01-11
+2008-01-12
+2008-01-13
+2008-01-14
+2008-01-15
+2008-01-16
+2008-01-17
+2008-01-18
+2008-01-19
+2008-01-20
+2008-01-21
+2008-01-22
+2008-01-23
+2008-01-24
+2008-01-25
+2008-01-26
+2008-01-27
+2008-01-28
+2008-01-29
+2008-01-30
+2008-01-31
+2008-02-01
+2008-02-02
+2008-02-03
+2008-02-04
+2008-02-05
+2008-02-06
+2008-02-07
+2008-02-08
+2008-02-09
+2008-02-10
+2008-02-11
+2008-02-12
+2008-02-13
+2008-02-14
+2008-02-15
+2008-02-16
+2008-02-17
+2008-02-18
+2008-02-19
+2008-02-20
+2008-02-21
+2008-02-22
+2008-02-23
+2008-02-24
+2008-02-25
+2008-02-26
+2008-02-27
+2008-02-28
+2008-02-29
+2008-03-01
+2008-03-02
+2008-03-03
+2008-03-04
+2008-03-05
+2008-03-06
+2008-03-07
+2008-03-08
+2008-03-09
+2008-03-10
+2008-03-11
+2008-03-12
+2008-03-13
+2008-03-14
+2008-03-15
+2008-03-16
+2008-03-17
+2008-03-18
+2008-03-19
+2008-03-20
+2008-03-21
+2008-03-22
+2008-03-23
+2008-03-24
+2008-03-25
+2008-03-26
+2008-03-27
+2008-03-28
+2008-03-29
+2008-03-30
+2008-03-31
+2008-04-01
+2008-04-02
+2008-04-03
+2008-04-04
+2008-04-05
+2008-04-06
+2008-04-07
+2008-04-08
+2008-04-09
+2008-04-10
+2008-04-11
+2008-04-12
+2008-04-13
+2008-04-14
+2008-04-15
+2008-04-16
+2008-04-17
+2008-04-18
+2008-04-19
+2008-04-20
+2008-04-21
+2008-04-22
+2008-04-23
+2008-04-24
+2008-04-25
+2008-04-26
+2008-04-27
+2008-04-28
+2008-04-29
+2008-04-30
+2008-05-01
+2008-05-02
+2008-05-03
+2008-05-04
+2008-05-05
+2008-05-06
+2008-05-07
+2008-05-08
+2008-05-09
+2008-05-10
+2008-05-11
+2008-05-12
+2008-05-13
+2008-05-14
+2008-05-15
+2008-05-16
+2008-05-17
+2008-05-18
+2008-05-19
+2008-05-20
+2008-05-21
+2008-05-22
+2008-05-23
+2008-05-24
+2008-05-25
+2008-05-26
+2008-05-27
+2008-05-28
+2008-05-29
+2008-05-30
+2008-05-31
+2008-06-01
+2008-06-02
+2008-06-03
+2008-06-04
+2008-06-05
+2008-06-06
+2008-06-07
+2008-06-08
+2008-06-09
+2008-06-10
+2008-06-11
+2008-06-12
+2008-06-13
+2008-06-14
+2008-06-15
+2008-06-16
+2008-06-17
+2008-06-18
+2008-06-19
+2008-06-20
+2008-06-21
+2008-06-22
+2008-06-23
+2008-06-24
+2008-06-25
+2008-06-26
+2008-06-27
+2008-06-28
+2008-06-29
+2008-06-30
+2008-07-01
+2008-07-02
+2008-07-03
+2008-07-04
+2008-07-05
+2008-07-06
+2008-07-07
+2008-07-08
+2008-07-09
+2008-07-10
+2008-07-11
+2008-07-12
+2008-07-13
+2008-07-14
+2008-07-15
+2008-07-16
+2008-07-17
+2008-07-18
+2008-07-19
+2008-07-20
+2008-07-21
+2008-07-22
+2008-07-23
+2008-07-24
+2008-07-25
+2008-07-26
+2008-07-27
+2008-07-28
+2008-07-29
+2008-07-30
+2008-07-31
+2008-08-01
+2008-08-02
+2008-08-03
+2008-08-04
+2008-08-05
+2008-08-06
+2008-08-07
+2008-08-08
+2008-08-09
+2008-08-10
+2008-08-11
+2008-08-12
+2008-08-13
+2008-08-14
+2008-08-15
+2008-08-16
+2008-08-17
+2008-08-18
+2008-08-19
+2008-08-20
+2008-08-21
+2008-08-22
+2008-08-23
+2008-08-24
+2008-08-25
+2008-08-26
+2008-08-27
+2008-08-28
+2008-08-29
+2008-08-30
+2008-08-31
+2008-09-01
+2008-09-02
+2008-09-03
+2008-09-04
+2008-09-05
+2008-09-06
+2008-09-07
+2008-09-08
+2008-09-09
+2008-09-10
+2008-09-11
+2008-09-12
+2008-09-13
+2008-09-14
+2008-09-15
+2008-09-16
+2008-09-17
+2008-09-18
+2008-09-19
+2008-09-20
+2008-09-21
+2008-09-22
+2008-09-23
+2008-09-24
+2008-09-25
+2008-09-26
+2008-09-27
+2008-09-28
+2008-09-29
+2008-09-30
+2008-10-01
+2008-10-02
+2008-10-03
+2008-10-04
+2008-10-05
+2008-10-06
+2008-10-07
+2008-10-08
+2008-10-09
+2008-10-10
+2008-10-11
+2008-10-12
+2008-10-13
+2008-10-14
+2008-10-15
+2008-10-16
+2008-10-17
+2008-10-18
+2008-10-19
+2008-10-20
+2008-10-21
+2008-10-22
+2008-10-23
+2008-10-24
+2008-10-25
+2008-10-26
+2008-10-27
+2008-10-28
+2008-10-29
+2008-10-30
+2008-10-31
+2008-11-01
+2008-11-02
+2008-11-03
+2008-11-04
+2008-11-05
+2008-11-06
+2008-11-07
+2008-11-08
+2008-11-09
+2008-11-10
+2008-11-11
+2008-11-12
+2008-11-13
+2008-11-14
+2008-11-15
+2008-11-16
+2008-11-17
+2008-11-18
+2008-11-19
+2008-11-20
+2008-11-21
+2008-11-22
+2008-11-23
+2008-11-24
+2008-11-25
+2008-11-26
+2008-11-27
+2008-11-28
+2008-11-29
+2008-11-30
+2008-12-01
+2008-12-02
+2008-12-03
+2008-12-04
+2008-12-05
+2008-12-06
+2008-12-07
+2008-12-08
+2008-12-09
+2008-12-10
+2008-12-11
+2008-12-12
+2008-12-13
+2008-12-14
+2008-12-15
+2008-12-16
+2008-12-17
+2008-12-18
+2008-12-19
+2008-12-20
+2008-12-21
+2008-12-22
+2008-12-23
+2008-12-24
+2008-12-25
+2008-12-26
+2008-12-27
+2008-12-28
+2008-12-29
+2008-12-30
+2008-12-31
+2009-01-01
+2009-01-02
+2009-01-03
+2009-01-04
+2009-01-05
+2009-01-06
+2009-01-07
+2009-01-08
+2009-01-09
+2009-01-10
+2009-01-11
+2009-01-12
+2009-01-13
+2009-01-14
+2009-01-15
+2009-01-16
+2009-01-17
+2009-01-18
+2009-01-19
+2009-01-20
+2009-01-21
+2009-01-22
+2009-01-23
+2009-01-24
+2009-01-25
+2009-01-26
+2009-01-27
+2009-01-28
+2009-01-29
+2009-01-30
+2009-01-31
+2009-02-01
+2009-02-02
+2009-02-03
+2009-02-04
+2009-02-05
+2009-02-06
+2009-02-07
+2009-02-08
+2009-02-09
+2009-02-10
+2009-02-11
+2009-02-12
+2009-02-13
+2009-02-14
+2009-02-15
+2009-02-16
+2009-02-17
+2009-02-18
+2009-02-19
+2009-02-20
+2009-02-21
+2009-02-22
+2009-02-23
+2009-02-24
+2009-02-25
+2009-02-26
+2009-02-27
+2009-02-28
+2009-03-01
+2009-03-02
+2009-03-03
+2009-03-04
+2009-03-05
+2009-03-06
+2009-03-07
+2009-03-08
+2009-03-09
+2009-03-10
+2009-03-11
+2009-03-12
+2009-03-13
+2009-03-14
+2009-03-15
+2009-03-16
+2009-03-17
+2009-03-18
+2009-03-19
+2009-03-20
+2009-03-21
+2009-03-22
+2009-03-23
+2009-03-24
+2009-03-25
+2009-03-26
+2009-03-27
+2009-03-28
+2009-03-29
+2009-03-30
+2009-03-31
+2009-04-01
+2009-04-02
+2009-04-03
+2009-04-04
+2009-04-05
+2009-04-06
+2009-04-07
+2009-04-08
+2009-04-09
+2009-04-10
+2009-04-11
+2009-04-12
+2009-04-13
+2009-04-14
+2009-04-15
+2009-04-16
+2009-04-17
+2009-04-18
+2009-04-19
+2009-04-20
+2009-04-21
+2009-04-22
+2009-04-23
+2009-04-24
+2009-04-25
+2009-04-26
+2009-04-27
+2009-04-28
+2009-04-29
+2009-04-30
+2009-05-01
+2009-05-02
+2009-05-03
+2009-05-04
+2009-05-05
+2009-05-06
+2009-05-07
+2009-05-08
+2009-05-09
+2009-05-10
+2009-05-11
+2009-05-12
+2009-05-13
+2009-05-14
+2009-05-15
+2009-05-16
+2009-05-17
+2009-05-18
+2009-05-19
+2009-05-20
+2009-05-21
+2009-05-22
+2009-05-23
+2009-05-24
+2009-05-25
+2009-05-26
+2009-05-27
+2009-05-28
+2009-05-29
+2009-05-30
+2009-05-31
+2009-06-01
+2009-06-02
+2009-06-03
+2009-06-04
+2009-06-05
+2009-06-06
+2009-06-07
+2009-06-08
+2009-06-09
+2009-06-10
+2009-06-11
+2009-06-12
+2009-06-13
+2009-06-14
+2009-06-15
+2009-06-16
+2009-06-17
+2009-06-18
+2009-06-19
+2009-06-20
+2009-06-21
+2009-06-22
+2009-06-23
+2009-06-24
+2009-06-25
+2009-06-26
+2009-06-27
+2009-06-28
+2009-06-29
+2009-06-30
+2009-07-01
+2009-07-02
+2009-07-03
+2009-07-04
+2009-07-05
+2009-07-06
+2009-07-07
+2009-07-08
+2009-07-09
+2009-07-10
+2009-07-11
+2009-07-12
+2009-07-13
+2009-07-14
+2009-07-15
+2009-07-16
+2009-07-17
+2009-07-18
+2009-07-19
+2009-07-20
+2009-07-21
+2009-07-22
+2009-07-23
+2009-07-24
+2009-07-25
+2009-07-26
+2009-07-27
+2009-07-28
+2009-07-29
+2009-07-30
+2009-07-31
+2009-08-01
+2009-08-02
+2009-08-03
+2009-08-04
+2009-08-05
+2009-08-06
+2009-08-07
+2009-08-08
+2009-08-09
+2009-08-10
+2009-08-11
+2009-08-12
+2009-08-13
+2009-08-14
+2009-08-15
+2009-08-16
+2009-08-17
+2009-08-18
+2009-08-19
+2009-08-20
+2009-08-21
+2009-08-22
+2009-08-23
+2009-08-24
+2009-08-25
+2009-08-26
+2009-08-27
+2009-08-28
+2009-08-29
+2009-08-30
+2009-08-31
+2009-09-01
+2009-09-02
+2009-09-03
+2009-09-04
+2009-09-05
+2009-09-06
+2009-09-07
+2009-09-08
+2009-09-09
+2009-09-10
+2009-09-11
+2009-09-12
+2009-09-13
+2009-09-14
+2009-09-15
+2009-09-16
+2009-09-17
+2009-09-18
+2009-09-19
+2009-09-20
+2009-09-21
+2009-09-22
+2009-09-23
+2009-09-24
+2009-09-25
+2009-09-26
+2009-09-27
+2009-09-28
+2009-09-29
+2009-09-30
+2009-10-01
+2009-10-02
+2009-10-03
+2009-10-04
+2009-10-05
+2009-10-06
+2009-10-07
+2009-10-08
+2009-10-09
+2009-10-10
+2009-10-11
+2009-10-12
+2009-10-13
+2009-10-14
+2009-10-15
+2009-10-16
+2009-10-17
+2009-10-18
+2009-10-19
+2009-10-20
+2009-10-21
+2009-10-22
+2009-10-23
+2009-10-24
+2009-10-25
+2009-10-26
+2009-10-27
+2009-10-28
+2009-10-29
+2009-10-30
+2009-10-31
+2009-11-01
+2009-11-02
+2009-11-03
+2009-11-04
+2009-11-05
+2009-11-06
+2009-11-07
+2009-11-08
+2009-11-09
+2009-11-10
+2009-11-11
+2009-11-12
+2009-11-13
+2009-11-14
+2009-11-15
+2009-11-16
+2009-11-17
+2009-11-18
+2009-11-19
+2009-11-20
+2009-11-21
+2009-11-22
+2009-11-23
+2009-11-24
+2009-11-25
+2009-11-26
+2009-11-27
+2009-11-28
+2009-11-29
+2009-11-30
+2009-12-01
+2009-12-02
+2009-12-03
+2009-12-04
+2009-12-05
+2009-12-06
+2009-12-07
+2009-12-08
+2009-12-09
+2009-12-10
+2009-12-11
+2009-12-12
+2009-12-13
+2009-12-14
+2009-12-15
+2009-12-16
+2009-12-17
+2009-12-18
+2009-12-19
+2009-12-20
+2009-12-21
+2009-12-22
+2009-12-23
+2009-12-24
+2009-12-25
+2009-12-26
+2009-12-27
+2009-12-28
+2009-12-29
+2009-12-30
+2009-12-31
+2010-01-01
+2010-01-02
+2010-01-03
+2010-01-04
+2010-01-05
+2010-01-06
+2010-01-07
+2010-01-08
+2010-01-09
+2010-01-10
+2010-01-11
+2010-01-12
+2010-01-13
+2010-01-14
+2010-01-15
+2010-01-16
+2010-01-17
+2010-01-18
+2010-01-19
+2010-01-20
+2010-01-21
+2010-01-22
+2010-01-23
+2010-01-24
+2010-01-25
+2010-01-26
+2010-01-27
+2010-01-28
+2010-01-29
+2010-01-30
+2010-01-31
+2010-02-01
+2010-02-02
+2010-02-03
+2010-02-04
+2010-02-05
+2010-02-06
+2010-02-07
+2010-02-08
+2010-02-09
+2010-02-10
+2010-02-11
+2010-02-12
+2010-02-13
+2010-02-14
+2010-02-15
+2010-02-16
+2010-02-17
+2010-02-18
+2010-02-19
+2010-02-20
+2010-02-21
+2010-02-22
+2010-02-23
+2010-02-24
+2010-02-25
+2010-02-26
+2010-02-27
+2010-02-28
+2010-03-01
+2010-03-02
+2010-03-03
+2010-03-04
+2010-03-05
+2010-03-06
+2010-03-07
+2010-03-08
+2010-03-09
+2010-03-10
+2010-03-11
+2010-03-12
+2010-03-13
+2010-03-14
+2010-03-15
+2010-03-16
+2010-03-17
+2010-03-18
+2010-03-19
+2010-03-20
+2010-03-21
+2010-03-22
+2010-03-23
+2010-03-24
+2010-03-25
+2010-03-26
+2010-03-27
+2010-03-28
+2010-03-29
+2010-03-30
+2010-03-31
+2010-04-01
+2010-04-02
+2010-04-03
+2010-04-04
+2010-04-05
+2010-04-06
+2010-04-07
+2010-04-08
+2010-04-09
+2010-04-10
+2010-04-11
+2010-04-12
+2010-04-13
+2010-04-14
+2010-04-15
+2010-04-16
+2010-04-17
+2010-04-18
+2010-04-19
+2010-04-20
+2010-04-21
+2010-04-22
+2010-04-23
+2010-04-24
+2010-04-25
+2010-04-26
+2010-04-27
+2010-04-28
+2010-04-29
+2010-04-30
+2010-05-01
+2010-05-02
+2010-05-03
+2010-05-04
+2010-05-05
+2010-05-06
+2010-05-07
+2010-05-08
+2010-05-09
+2010-05-10
+2010-05-11
+2010-05-12
+2010-05-13
+2010-05-14
+2010-05-15
+2010-05-16
+2010-05-17
+2010-05-18
+2010-05-19
+2010-05-20
+2010-05-21
+2010-05-22
+2010-05-23
+2010-05-24
+2010-05-25
+2010-05-26
+2010-05-27
+2010-05-28
+2010-05-29
+2010-05-30
+2010-05-31
+2010-06-01
+2010-06-02
+2010-06-03
+2010-06-04
+2010-06-05
+2010-06-06
+2010-06-07
+2010-06-08
+2010-06-09
+2010-06-10
+2010-06-11
+2010-06-12
+2010-06-13
+2010-06-14
+2010-06-15
+2010-06-16
+2010-06-17
+2010-06-18
+2010-06-19
+2010-06-20
+2010-06-21
+2010-06-22
+2010-06-23
+2010-06-24
+2010-06-25
+2010-06-26
+2010-06-27
+2010-06-28
+2010-06-29
+2010-06-30
+2010-07-01
+2010-07-02
+2010-07-03
+2010-07-04
+2010-07-05
+2010-07-06
+2010-07-07
+2010-07-08
+2010-07-09
+2010-07-10
+2010-07-11
+2010-07-12
+2010-07-13
+2010-07-14
+2010-07-15
+2010-07-16
+2010-07-17
+2010-07-18
+2010-07-19
+2010-07-20
+2010-07-21
+2010-07-22
+2010-07-23
+2010-07-24
+2010-07-25
+2010-07-26
+2010-07-27
+2010-07-28
+2010-07-29
+2010-07-30
+2010-07-31
+2010-08-01
+2010-08-02
+2010-08-03
+2010-08-04
+2010-08-05
+2010-08-06
+2010-08-07
+2010-08-08
+2010-08-09
+2010-08-10
+2010-08-11
+2010-08-12
+2010-08-13
+2010-08-14
+2010-08-15
+2010-08-16
+2010-08-17
+2010-08-18
+2010-08-19
+2010-08-20
+2010-08-21
+2010-08-22
+2010-08-23
+2010-08-24
+2010-08-25
+2010-08-26
+2010-08-27
+2010-08-28
+2010-08-29
+2010-08-30
+2010-08-31
+2010-09-01
+2010-09-02
+2010-09-03
+2010-09-04
+2010-09-05
+2010-09-06
+2010-09-07
+2010-09-08
+2010-09-09
+2010-09-10
+2010-09-11
+2010-09-12
+2010-09-13
+2010-09-14
+2010-09-15
+2010-09-16
+2010-09-17
+2010-09-18
+2010-09-19
+2010-09-20
+2010-09-21
+2010-09-22
+2010-09-23
+2010-09-24
+2010-09-25
+2010-09-26
+2010-09-27
+2010-09-28
+2010-09-29
+2010-09-30
+2010-10-01
+2010-10-02
+2010-10-03
+2010-10-04
+2010-10-05
+2010-10-06
+2010-10-07
+2010-10-08
+2010-10-09
+2010-10-10
+2010-10-11
+2010-10-12
+2010-10-13
+2010-10-14
+2010-10-15
+2010-10-16
+2010-10-17
+2010-10-18
+2010-10-19
+2010-10-20
+2010-10-21
+2010-10-22
+2010-10-23
+2010-10-24
+2010-10-25
+2010-10-26
+2010-10-27
+2010-10-28
+2010-10-29
+2010-10-30
+2010-10-31
+2010-11-01
+2010-11-02
+2010-11-03
+2010-11-04
+2010-11-05
+2010-11-06
+2010-11-07
+2010-11-08
+2010-11-09
+2010-11-10
+2010-11-11
+2010-11-12
+2010-11-13
+2010-11-14
+2010-11-15
+2010-11-16
+2010-11-17
+2010-11-18
+2010-11-19
+2010-11-20
+2010-11-21
+2010-11-22
+2010-11-23
+2010-11-24
+2010-11-25
+2010-11-26
+2010-11-27
+2010-11-28
+2010-11-29
+2010-11-30
+2010-12-01
+2010-12-02
+2010-12-03
+2010-12-04
+2010-12-05
+2010-12-06
+2010-12-07
+2010-12-08
+2010-12-09
+2010-12-10
+2010-12-11
+2010-12-12
+2010-12-13
+2010-12-14
+2010-12-15
+2010-12-16
+2010-12-17
+2010-12-18
+2010-12-19
+2010-12-20
+2010-12-21
+2010-12-22
+2010-12-23
+2010-12-24
+2010-12-25
+2010-12-26
+2010-12-27
+2010-12-28
+2010-12-29
+2010-12-30
+2010-12-31
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/lastworkday.ics b/libkcal/tests/data/RecurrenceRule/unsorted/lastworkday.ics
new file mode 100644
index 00000000..bc346f29
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/lastworkday.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+VERSION:2.0
+PRODID:-//MH Software Inc//Connect Daily - 3.0.7//EN
+X-LibKCal-Testsuite-OutTZ:UTC
+
+BEGIN:VEVENT
+UID:1214@67.154.139.115
+SUMMARY:Last work day of the month
+DTSTART:20050512T031500Z
+RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1
+DURATION:PT5H
+END:VEVENT
+
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/lastworkday.ics.next.ref b/libkcal/tests/data/RecurrenceRule/unsorted/lastworkday.ics.next.ref
new file mode 100644
index 00000000..386502de
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/lastworkday.ics.next.ref
@@ -0,0 +1,500 @@
+2005-05-12T03:15:00
+2005-05-31T03:15:00
+2005-06-30T03:15:00
+2005-07-29T03:15:00
+2005-08-31T03:15:00
+2005-09-30T03:15:00
+2005-10-31T03:15:00
+2005-11-30T03:15:00
+2005-12-30T03:15:00
+2006-01-31T03:15:00
+2006-02-28T03:15:00
+2006-03-31T03:15:00
+2006-04-28T03:15:00
+2006-05-31T03:15:00
+2006-06-30T03:15:00
+2006-07-31T03:15:00
+2006-08-31T03:15:00
+2006-09-29T03:15:00
+2006-10-31T03:15:00
+2006-11-30T03:15:00
+2006-12-29T03:15:00
+2007-01-31T03:15:00
+2007-02-28T03:15:00
+2007-03-30T03:15:00
+2007-04-30T03:15:00
+2007-05-31T03:15:00
+2007-06-29T03:15:00
+2007-07-31T03:15:00
+2007-08-31T03:15:00
+2007-09-28T03:15:00
+2007-10-31T03:15:00
+2007-11-30T03:15:00
+2007-12-31T03:15:00
+2008-01-31T03:15:00
+2008-02-29T03:15:00
+2008-03-31T03:15:00
+2008-04-30T03:15:00
+2008-05-30T03:15:00
+2008-06-30T03:15:00
+2008-07-31T03:15:00
+2008-08-29T03:15:00
+2008-09-30T03:15:00
+2008-10-31T03:15:00
+2008-11-28T03:15:00
+2008-12-31T03:15:00
+2009-01-30T03:15:00
+2009-02-27T03:15:00
+2009-03-31T03:15:00
+2009-04-30T03:15:00
+2009-05-29T03:15:00
+2009-06-30T03:15:00
+2009-07-31T03:15:00
+2009-08-31T03:15:00
+2009-09-30T03:15:00
+2009-10-30T03:15:00
+2009-11-30T03:15:00
+2009-12-31T03:15:00
+2010-01-29T03:15:00
+2010-02-26T03:15:00
+2010-03-31T03:15:00
+2010-04-30T03:15:00
+2010-05-31T03:15:00
+2010-06-30T03:15:00
+2010-07-30T03:15:00
+2010-08-31T03:15:00
+2010-09-30T03:15:00
+2010-10-29T03:15:00
+2010-11-30T03:15:00
+2010-12-31T03:15:00
+2011-01-31T03:15:00
+2011-02-28T03:15:00
+2011-03-31T03:15:00
+2011-04-29T03:15:00
+2011-05-31T03:15:00
+2011-06-30T03:15:00
+2011-07-29T03:15:00
+2011-08-31T03:15:00
+2011-09-30T03:15:00
+2011-10-31T03:15:00
+2011-11-30T03:15:00
+2011-12-30T03:15:00
+2012-01-31T03:15:00
+2012-02-29T03:15:00
+2012-03-30T03:15:00
+2012-04-30T03:15:00
+2012-05-31T03:15:00
+2012-06-29T03:15:00
+2012-07-31T03:15:00
+2012-08-31T03:15:00
+2012-09-28T03:15:00
+2012-10-31T03:15:00
+2012-11-30T03:15:00
+2012-12-31T03:15:00
+2013-01-31T03:15:00
+2013-02-28T03:15:00
+2013-03-29T03:15:00
+2013-04-30T03:15:00
+2013-05-31T03:15:00
+2013-06-28T03:15:00
+2013-07-31T03:15:00
+2013-08-30T03:15:00
+2013-09-30T03:15:00
+2013-10-31T03:15:00
+2013-11-29T03:15:00
+2013-12-31T03:15:00
+2014-01-31T03:15:00
+2014-02-28T03:15:00
+2014-03-31T03:15:00
+2014-04-30T03:15:00
+2014-05-30T03:15:00
+2014-06-30T03:15:00
+2014-07-31T03:15:00
+2014-08-29T03:15:00
+2014-09-30T03:15:00
+2014-10-31T03:15:00
+2014-11-28T03:15:00
+2014-12-31T03:15:00
+2015-01-30T03:15:00
+2015-02-27T03:15:00
+2015-03-31T03:15:00
+2015-04-30T03:15:00
+2015-05-29T03:15:00
+2015-06-30T03:15:00
+2015-07-31T03:15:00
+2015-08-31T03:15:00
+2015-09-30T03:15:00
+2015-10-30T03:15:00
+2015-11-30T03:15:00
+2015-12-31T03:15:00
+2016-01-29T03:15:00
+2016-02-29T03:15:00
+2016-03-31T03:15:00
+2016-04-29T03:15:00
+2016-05-31T03:15:00
+2016-06-30T03:15:00
+2016-07-29T03:15:00
+2016-08-31T03:15:00
+2016-09-30T03:15:00
+2016-10-31T03:15:00
+2016-11-30T03:15:00
+2016-12-30T03:15:00
+2017-01-31T03:15:00
+2017-02-28T03:15:00
+2017-03-31T03:15:00
+2017-04-28T03:15:00
+2017-05-31T03:15:00
+2017-06-30T03:15:00
+2017-07-31T03:15:00
+2017-08-31T03:15:00
+2017-09-29T03:15:00
+2017-10-31T03:15:00
+2017-11-30T03:15:00
+2017-12-29T03:15:00
+2018-01-31T03:15:00
+2018-02-28T03:15:00
+2018-03-30T03:15:00
+2018-04-30T03:15:00
+2018-05-31T03:15:00
+2018-06-29T03:15:00
+2018-07-31T03:15:00
+2018-08-31T03:15:00
+2018-09-28T03:15:00
+2018-10-31T03:15:00
+2018-11-30T03:15:00
+2018-12-31T03:15:00
+2019-01-31T03:15:00
+2019-02-28T03:15:00
+2019-03-29T03:15:00
+2019-04-30T03:15:00
+2019-05-31T03:15:00
+2019-06-28T03:15:00
+2019-07-31T03:15:00
+2019-08-30T03:15:00
+2019-09-30T03:15:00
+2019-10-31T03:15:00
+2019-11-29T03:15:00
+2019-12-31T03:15:00
+2020-01-31T03:15:00
+2020-02-28T03:15:00
+2020-03-31T03:15:00
+2020-04-30T03:15:00
+2020-05-29T03:15:00
+2020-06-30T03:15:00
+2020-07-31T03:15:00
+2020-08-31T03:15:00
+2020-09-30T03:15:00
+2020-10-30T03:15:00
+2020-11-30T03:15:00
+2020-12-31T03:15:00
+2021-01-29T03:15:00
+2021-02-26T03:15:00
+2021-03-31T03:15:00
+2021-04-30T03:15:00
+2021-05-31T03:15:00
+2021-06-30T03:15:00
+2021-07-30T03:15:00
+2021-08-31T03:15:00
+2021-09-30T03:15:00
+2021-10-29T03:15:00
+2021-11-30T03:15:00
+2021-12-31T03:15:00
+2022-01-31T03:15:00
+2022-02-28T03:15:00
+2022-03-31T03:15:00
+2022-04-29T03:15:00
+2022-05-31T03:15:00
+2022-06-30T03:15:00
+2022-07-29T03:15:00
+2022-08-31T03:15:00
+2022-09-30T03:15:00
+2022-10-31T03:15:00
+2022-11-30T03:15:00
+2022-12-30T03:15:00
+2023-01-31T03:15:00
+2023-02-28T03:15:00
+2023-03-31T03:15:00
+2023-04-28T03:15:00
+2023-05-31T03:15:00
+2023-06-30T03:15:00
+2023-07-31T03:15:00
+2023-08-31T03:15:00
+2023-09-29T03:15:00
+2023-10-31T03:15:00
+2023-11-30T03:15:00
+2023-12-29T03:15:00
+2024-01-31T03:15:00
+2024-02-29T03:15:00
+2024-03-29T03:15:00
+2024-04-30T03:15:00
+2024-05-31T03:15:00
+2024-06-28T03:15:00
+2024-07-31T03:15:00
+2024-08-30T03:15:00
+2024-09-30T03:15:00
+2024-10-31T03:15:00
+2024-11-29T03:15:00
+2024-12-31T03:15:00
+2025-01-31T03:15:00
+2025-02-28T03:15:00
+2025-03-31T03:15:00
+2025-04-30T03:15:00
+2025-05-30T03:15:00
+2025-06-30T03:15:00
+2025-07-31T03:15:00
+2025-08-29T03:15:00
+2025-09-30T03:15:00
+2025-10-31T03:15:00
+2025-11-28T03:15:00
+2025-12-31T03:15:00
+2026-01-30T03:15:00
+2026-02-27T03:15:00
+2026-03-31T03:15:00
+2026-04-30T03:15:00
+2026-05-29T03:15:00
+2026-06-30T03:15:00
+2026-07-31T03:15:00
+2026-08-31T03:15:00
+2026-09-30T03:15:00
+2026-10-30T03:15:00
+2026-11-30T03:15:00
+2026-12-31T03:15:00
+2027-01-29T03:15:00
+2027-02-26T03:15:00
+2027-03-31T03:15:00
+2027-04-30T03:15:00
+2027-05-31T03:15:00
+2027-06-30T03:15:00
+2027-07-30T03:15:00
+2027-08-31T03:15:00
+2027-09-30T03:15:00
+2027-10-29T03:15:00
+2027-11-30T03:15:00
+2027-12-31T03:15:00
+2028-01-31T03:15:00
+2028-02-29T03:15:00
+2028-03-31T03:15:00
+2028-04-28T03:15:00
+2028-05-31T03:15:00
+2028-06-30T03:15:00
+2028-07-31T03:15:00
+2028-08-31T03:15:00
+2028-09-29T03:15:00
+2028-10-31T03:15:00
+2028-11-30T03:15:00
+2028-12-29T03:15:00
+2029-01-31T03:15:00
+2029-02-28T03:15:00
+2029-03-30T03:15:00
+2029-04-30T03:15:00
+2029-05-31T03:15:00
+2029-06-29T03:15:00
+2029-07-31T03:15:00
+2029-08-31T03:15:00
+2029-09-28T03:15:00
+2029-10-31T03:15:00
+2029-11-30T03:15:00
+2029-12-31T03:15:00
+2030-01-31T03:15:00
+2030-02-28T03:15:00
+2030-03-29T03:15:00
+2030-04-30T03:15:00
+2030-05-31T03:15:00
+2030-06-28T03:15:00
+2030-07-31T03:15:00
+2030-08-30T03:15:00
+2030-09-30T03:15:00
+2030-10-31T03:15:00
+2030-11-29T03:15:00
+2030-12-31T03:15:00
+2031-01-31T03:15:00
+2031-02-28T03:15:00
+2031-03-31T03:15:00
+2031-04-30T03:15:00
+2031-05-30T03:15:00
+2031-06-30T03:15:00
+2031-07-31T03:15:00
+2031-08-29T03:15:00
+2031-09-30T03:15:00
+2031-10-31T03:15:00
+2031-11-28T03:15:00
+2031-12-31T03:15:00
+2032-01-30T03:15:00
+2032-02-27T03:15:00
+2032-03-31T03:15:00
+2032-04-30T03:15:00
+2032-05-31T03:15:00
+2032-06-30T03:15:00
+2032-07-30T03:15:00
+2032-08-31T03:15:00
+2032-09-30T03:15:00
+2032-10-29T03:15:00
+2032-11-30T03:15:00
+2032-12-31T03:15:00
+2033-01-31T03:15:00
+2033-02-28T03:15:00
+2033-03-31T03:15:00
+2033-04-29T03:15:00
+2033-05-31T03:15:00
+2033-06-30T03:15:00
+2033-07-29T03:15:00
+2033-08-31T03:15:00
+2033-09-30T03:15:00
+2033-10-31T03:15:00
+2033-11-30T03:15:00
+2033-12-30T03:15:00
+2034-01-31T03:15:00
+2034-02-28T03:15:00
+2034-03-31T03:15:00
+2034-04-28T03:15:00
+2034-05-31T03:15:00
+2034-06-30T03:15:00
+2034-07-31T03:15:00
+2034-08-31T03:15:00
+2034-09-29T03:15:00
+2034-10-31T03:15:00
+2034-11-30T03:15:00
+2034-12-29T03:15:00
+2035-01-31T03:15:00
+2035-02-28T03:15:00
+2035-03-30T03:15:00
+2035-04-30T03:15:00
+2035-05-31T03:15:00
+2035-06-29T03:15:00
+2035-07-31T03:15:00
+2035-08-31T03:15:00
+2035-09-28T03:15:00
+2035-10-31T03:15:00
+2035-11-30T03:15:00
+2035-12-31T03:15:00
+2036-01-31T03:15:00
+2036-02-29T03:15:00
+2036-03-31T03:15:00
+2036-04-30T03:15:00
+2036-05-30T03:15:00
+2036-06-30T03:15:00
+2036-07-31T03:15:00
+2036-08-29T03:15:00
+2036-09-30T03:15:00
+2036-10-31T03:15:00
+2036-11-28T03:15:00
+2036-12-31T03:15:00
+2037-01-30T03:15:00
+2037-02-27T03:15:00
+2037-03-31T03:15:00
+2037-04-30T03:15:00
+2037-05-29T03:15:00
+2037-06-30T03:15:00
+2037-07-31T03:15:00
+2037-08-31T03:15:00
+2037-09-30T03:15:00
+2037-10-30T03:15:00
+2037-11-30T03:15:00
+2037-12-31T03:15:00
+2038-01-29T03:15:00
+2038-02-26T03:15:00
+2038-03-31T03:15:00
+2038-04-30T03:15:00
+2038-05-31T03:15:00
+2038-06-30T03:15:00
+2038-07-30T03:15:00
+2038-08-31T03:15:00
+2038-09-30T03:15:00
+2038-10-29T03:15:00
+2038-11-30T03:15:00
+2038-12-31T03:15:00
+2039-01-31T03:15:00
+2039-02-28T03:15:00
+2039-03-31T03:15:00
+2039-04-29T03:15:00
+2039-05-31T03:15:00
+2039-06-30T03:15:00
+2039-07-29T03:15:00
+2039-08-31T03:15:00
+2039-09-30T03:15:00
+2039-10-31T03:15:00
+2039-11-30T03:15:00
+2039-12-30T03:15:00
+2040-01-31T03:15:00
+2040-02-29T03:15:00
+2040-03-30T03:15:00
+2040-04-30T03:15:00
+2040-05-31T03:15:00
+2040-06-29T03:15:00
+2040-07-31T03:15:00
+2040-08-31T03:15:00
+2040-09-28T03:15:00
+2040-10-31T03:15:00
+2040-11-30T03:15:00
+2040-12-31T03:15:00
+2041-01-31T03:15:00
+2041-02-28T03:15:00
+2041-03-29T03:15:00
+2041-04-30T03:15:00
+2041-05-31T03:15:00
+2041-06-28T03:15:00
+2041-07-31T03:15:00
+2041-08-30T03:15:00
+2041-09-30T03:15:00
+2041-10-31T03:15:00
+2041-11-29T03:15:00
+2041-12-31T03:15:00
+2042-01-31T03:15:00
+2042-02-28T03:15:00
+2042-03-31T03:15:00
+2042-04-30T03:15:00
+2042-05-30T03:15:00
+2042-06-30T03:15:00
+2042-07-31T03:15:00
+2042-08-29T03:15:00
+2042-09-30T03:15:00
+2042-10-31T03:15:00
+2042-11-28T03:15:00
+2042-12-31T03:15:00
+2043-01-30T03:15:00
+2043-02-27T03:15:00
+2043-03-31T03:15:00
+2043-04-30T03:15:00
+2043-05-29T03:15:00
+2043-06-30T03:15:00
+2043-07-31T03:15:00
+2043-08-31T03:15:00
+2043-09-30T03:15:00
+2043-10-30T03:15:00
+2043-11-30T03:15:00
+2043-12-31T03:15:00
+2044-01-29T03:15:00
+2044-02-29T03:15:00
+2044-03-31T03:15:00
+2044-04-29T03:15:00
+2044-05-31T03:15:00
+2044-06-30T03:15:00
+2044-07-29T03:15:00
+2044-08-31T03:15:00
+2044-09-30T03:15:00
+2044-10-31T03:15:00
+2044-11-30T03:15:00
+2044-12-30T03:15:00
+2045-01-31T03:15:00
+2045-02-28T03:15:00
+2045-03-31T03:15:00
+2045-04-28T03:15:00
+2045-05-31T03:15:00
+2045-06-30T03:15:00
+2045-07-31T03:15:00
+2045-08-31T03:15:00
+2045-09-29T03:15:00
+2045-10-31T03:15:00
+2045-11-30T03:15:00
+2045-12-29T03:15:00
+2046-01-31T03:15:00
+2046-02-28T03:15:00
+2046-03-30T03:15:00
+2046-04-30T03:15:00
+2046-05-31T03:15:00
+2046-06-29T03:15:00
+2046-07-31T03:15:00
+2046-08-31T03:15:00
+2046-09-28T03:15:00
+2046-10-31T03:15:00
+2046-11-30T03:15:00
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/lastworkday.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/unsorted/lastworkday.ics.prev.ref
new file mode 100644
index 00000000..e5140ad5
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/lastworkday.ics.prev.ref
@@ -0,0 +1,70 @@
+2010-12-31T03:15:00
+2010-11-30T03:15:00
+2010-10-29T03:15:00
+2010-09-30T03:15:00
+2010-08-31T03:15:00
+2010-07-30T03:15:00
+2010-06-30T03:15:00
+2010-05-31T03:15:00
+2010-04-30T03:15:00
+2010-03-31T03:15:00
+2010-02-26T03:15:00
+2010-01-29T03:15:00
+2009-12-31T03:15:00
+2009-11-30T03:15:00
+2009-10-30T03:15:00
+2009-09-30T03:15:00
+2009-08-31T03:15:00
+2009-07-31T03:15:00
+2009-06-30T03:15:00
+2009-05-29T03:15:00
+2009-04-30T03:15:00
+2009-03-31T03:15:00
+2009-02-27T03:15:00
+2009-01-30T03:15:00
+2008-12-31T03:15:00
+2008-11-28T03:15:00
+2008-10-31T03:15:00
+2008-09-30T03:15:00
+2008-08-29T03:15:00
+2008-07-31T03:15:00
+2008-06-30T03:15:00
+2008-05-30T03:15:00
+2008-04-30T03:15:00
+2008-03-31T03:15:00
+2008-02-29T03:15:00
+2008-01-31T03:15:00
+2007-12-31T03:15:00
+2007-11-30T03:15:00
+2007-10-31T03:15:00
+2007-09-28T03:15:00
+2007-08-31T03:15:00
+2007-07-31T03:15:00
+2007-06-29T03:15:00
+2007-05-31T03:15:00
+2007-04-30T03:15:00
+2007-03-30T03:15:00
+2007-02-28T03:15:00
+2007-01-31T03:15:00
+2006-12-29T03:15:00
+2006-11-30T03:15:00
+2006-10-31T03:15:00
+2006-09-29T03:15:00
+2006-08-31T03:15:00
+2006-07-31T03:15:00
+2006-06-30T03:15:00
+2006-05-31T03:15:00
+2006-04-28T03:15:00
+2006-03-31T03:15:00
+2006-02-28T03:15:00
+2006-01-31T03:15:00
+2005-12-30T03:15:00
+2005-11-30T03:15:00
+2005-10-31T03:15:00
+2005-09-30T03:15:00
+2005-08-31T03:15:00
+2005-07-29T03:15:00
+2005-06-30T03:15:00
+2005-05-31T03:15:00
+2005-05-12T03:15:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/lastworkday.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/unsorted/lastworkday.ics.recurson.ref
new file mode 100644
index 00000000..05df6b37
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/lastworkday.ics.recurson.ref
@@ -0,0 +1,69 @@
+2005-05-12
+2005-05-31
+2005-06-30
+2005-07-29
+2005-08-31
+2005-09-30
+2005-10-31
+2005-11-30
+2005-12-30
+2006-01-31
+2006-02-28
+2006-03-31
+2006-04-28
+2006-05-31
+2006-06-30
+2006-07-31
+2006-08-31
+2006-09-29
+2006-10-31
+2006-11-30
+2006-12-29
+2007-01-31
+2007-02-28
+2007-03-30
+2007-04-30
+2007-05-31
+2007-06-29
+2007-07-31
+2007-08-31
+2007-09-28
+2007-10-31
+2007-11-30
+2007-12-31
+2008-01-31
+2008-02-29
+2008-03-31
+2008-04-30
+2008-05-30
+2008-06-30
+2008-07-31
+2008-08-29
+2008-09-30
+2008-10-31
+2008-11-28
+2008-12-31
+2009-01-30
+2009-02-27
+2009-03-31
+2009-04-30
+2009-05-29
+2009-06-30
+2009-07-31
+2009-08-31
+2009-09-30
+2009-10-30
+2009-11-30
+2009-12-31
+2010-01-29
+2010-02-26
+2010-03-31
+2010-04-30
+2010-05-31
+2010-06-30
+2010-07-30
+2010-08-31
+2010-09-30
+2010-10-29
+2010-11-30
+2010-12-31
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/monthly.ics b/libkcal/tests/data/RecurrenceRule/unsorted/monthly.ics
new file mode 100644
index 00000000..8a09044f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/monthly.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+VERSION:2.0
+PRODID:-//MH Software Inc//Connect Daily - 3.0.7//EN
+X-LibKCal-Testsuite-OutTZ:UTC
+
+BEGIN:VEVENT
+UID:1214@67.154.139.115
+SUMMARY:every month, 4. Tu and 3. We, starting 12.5.2005, 03:15Z
+DTSTART:20050512T031500Z
+RRULE:FREQ=MONTHLY;INTERVAL=1;BYDAY=4TU,3WE
+DURATION:PT5H
+END:VEVENT
+
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/monthly.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/unsorted/monthly.ics.comp34.ref
new file mode 100644
index 00000000..a46b2400
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/monthly.ics.comp34.ref
@@ -0,0 +1,500 @@
+2005-05-12T03:15:00
+2005-05-18T03:15:00
+2005-05-24T03:15:00
+2005-06-15T03:15:00
+2005-06-28T03:15:00
+2005-07-20T03:15:00
+2005-07-26T03:15:00
+2005-08-17T03:15:00
+2005-08-23T03:15:00
+2005-09-21T03:15:00
+2005-09-27T03:15:00
+2005-10-19T03:15:00
+2005-10-25T03:15:00
+2005-11-16T03:15:00
+2005-11-22T03:15:00
+2005-12-21T03:15:00
+2005-12-27T03:15:00
+2006-01-18T03:15:00
+2006-01-24T03:15:00
+2006-02-15T03:15:00
+2006-02-28T03:15:00
+2006-03-15T03:15:00
+2006-03-28T03:15:00
+2006-04-19T03:15:00
+2006-04-25T03:15:00
+2006-05-17T03:15:00
+2006-05-23T03:15:00
+2006-06-21T03:15:00
+2006-06-27T03:15:00
+2006-07-19T03:15:00
+2006-07-25T03:15:00
+2006-08-16T03:15:00
+2006-08-22T03:15:00
+2006-09-20T03:15:00
+2006-09-26T03:15:00
+2006-10-18T03:15:00
+2006-10-24T03:15:00
+2006-11-15T03:15:00
+2006-11-28T03:15:00
+2006-12-20T03:15:00
+2006-12-26T03:15:00
+2007-01-17T03:15:00
+2007-01-23T03:15:00
+2007-02-21T03:15:00
+2007-02-27T03:15:00
+2007-03-21T03:15:00
+2007-03-27T03:15:00
+2007-04-18T03:15:00
+2007-04-24T03:15:00
+2007-05-16T03:15:00
+2007-05-22T03:15:00
+2007-06-20T03:15:00
+2007-06-26T03:15:00
+2007-07-18T03:15:00
+2007-07-24T03:15:00
+2007-08-15T03:15:00
+2007-08-28T03:15:00
+2007-09-19T03:15:00
+2007-09-25T03:15:00
+2007-10-17T03:15:00
+2007-10-23T03:15:00
+2007-11-21T03:15:00
+2007-11-27T03:15:00
+2007-12-19T03:15:00
+2007-12-25T03:15:00
+2008-01-16T03:15:00
+2008-01-22T03:15:00
+2008-02-20T03:15:00
+2008-02-26T03:15:00
+2008-03-19T03:15:00
+2008-03-25T03:15:00
+2008-04-16T03:15:00
+2008-04-22T03:15:00
+2008-05-21T03:15:00
+2008-05-27T03:15:00
+2008-06-18T03:15:00
+2008-06-24T03:15:00
+2008-07-16T03:15:00
+2008-07-22T03:15:00
+2008-08-20T03:15:00
+2008-08-26T03:15:00
+2008-09-17T03:15:00
+2008-09-23T03:15:00
+2008-10-15T03:15:00
+2008-10-28T03:15:00
+2008-11-19T03:15:00
+2008-11-25T03:15:00
+2008-12-17T03:15:00
+2008-12-23T03:15:00
+2009-01-21T03:15:00
+2009-01-27T03:15:00
+2009-02-18T03:15:00
+2009-02-24T03:15:00
+2009-03-18T03:15:00
+2009-03-24T03:15:00
+2009-04-15T03:15:00
+2009-04-28T03:15:00
+2009-05-20T03:15:00
+2009-05-26T03:15:00
+2009-06-17T03:15:00
+2009-06-23T03:15:00
+2009-07-15T03:15:00
+2009-07-28T03:15:00
+2009-08-19T03:15:00
+2009-08-25T03:15:00
+2009-09-16T03:15:00
+2009-09-22T03:15:00
+2009-10-21T03:15:00
+2009-10-27T03:15:00
+2009-11-18T03:15:00
+2009-11-24T03:15:00
+2009-12-16T03:15:00
+2009-12-22T03:15:00
+2010-01-20T03:15:00
+2010-01-26T03:15:00
+2010-02-17T03:15:00
+2010-02-23T03:15:00
+2010-03-17T03:15:00
+2010-03-23T03:15:00
+2010-04-21T03:15:00
+2010-04-27T03:15:00
+2010-05-19T03:15:00
+2010-05-25T03:15:00
+2010-06-16T03:15:00
+2010-06-22T03:15:00
+2010-07-21T03:15:00
+2010-07-27T03:15:00
+2010-08-18T03:15:00
+2010-08-24T03:15:00
+2010-09-15T03:15:00
+2010-09-28T03:15:00
+2010-10-20T03:15:00
+2010-10-26T03:15:00
+2010-11-17T03:15:00
+2010-11-23T03:15:00
+2010-12-15T03:15:00
+2010-12-28T03:15:00
+2011-01-19T03:15:00
+2011-01-25T03:15:00
+2011-02-16T03:15:00
+2011-02-22T03:15:00
+2011-03-16T03:15:00
+2011-03-22T03:15:00
+2011-04-20T03:15:00
+2011-04-26T03:15:00
+2011-05-18T03:15:00
+2011-05-24T03:15:00
+2011-06-15T03:15:00
+2011-06-28T03:15:00
+2011-07-20T03:15:00
+2011-07-26T03:15:00
+2011-08-17T03:15:00
+2011-08-23T03:15:00
+2011-09-21T03:15:00
+2011-09-27T03:15:00
+2011-10-19T03:15:00
+2011-10-25T03:15:00
+2011-11-16T03:15:00
+2011-11-22T03:15:00
+2011-12-21T03:15:00
+2011-12-27T03:15:00
+2012-01-18T03:15:00
+2012-01-24T03:15:00
+2012-02-15T03:15:00
+2012-02-28T03:15:00
+2012-03-21T03:15:00
+2012-03-27T03:15:00
+2012-04-18T03:15:00
+2012-04-24T03:15:00
+2012-05-16T03:15:00
+2012-05-22T03:15:00
+2012-06-20T03:15:00
+2012-06-26T03:15:00
+2012-07-18T03:15:00
+2012-07-24T03:15:00
+2012-08-15T03:15:00
+2012-08-28T03:15:00
+2012-09-19T03:15:00
+2012-09-25T03:15:00
+2012-10-17T03:15:00
+2012-10-23T03:15:00
+2012-11-21T03:15:00
+2012-11-27T03:15:00
+2012-12-19T03:15:00
+2012-12-25T03:15:00
+2013-01-16T03:15:00
+2013-01-22T03:15:00
+2013-02-20T03:15:00
+2013-02-26T03:15:00
+2013-03-20T03:15:00
+2013-03-26T03:15:00
+2013-04-17T03:15:00
+2013-04-23T03:15:00
+2013-05-15T03:15:00
+2013-05-28T03:15:00
+2013-06-19T03:15:00
+2013-06-25T03:15:00
+2013-07-17T03:15:00
+2013-07-23T03:15:00
+2013-08-21T03:15:00
+2013-08-27T03:15:00
+2013-09-18T03:15:00
+2013-09-24T03:15:00
+2013-10-16T03:15:00
+2013-10-22T03:15:00
+2013-11-20T03:15:00
+2013-11-26T03:15:00
+2013-12-18T03:15:00
+2013-12-24T03:15:00
+2014-01-15T03:15:00
+2014-01-28T03:15:00
+2014-02-19T03:15:00
+2014-02-25T03:15:00
+2014-03-19T03:15:00
+2014-03-25T03:15:00
+2014-04-16T03:15:00
+2014-04-22T03:15:00
+2014-05-21T03:15:00
+2014-05-27T03:15:00
+2014-06-18T03:15:00
+2014-06-24T03:15:00
+2014-07-16T03:15:00
+2014-07-22T03:15:00
+2014-08-20T03:15:00
+2014-08-26T03:15:00
+2014-09-17T03:15:00
+2014-09-23T03:15:00
+2014-10-15T03:15:00
+2014-10-28T03:15:00
+2014-11-19T03:15:00
+2014-11-25T03:15:00
+2014-12-17T03:15:00
+2014-12-23T03:15:00
+2015-01-21T03:15:00
+2015-01-27T03:15:00
+2015-02-18T03:15:00
+2015-02-24T03:15:00
+2015-03-18T03:15:00
+2015-03-24T03:15:00
+2015-04-15T03:15:00
+2015-04-28T03:15:00
+2015-05-20T03:15:00
+2015-05-26T03:15:00
+2015-06-17T03:15:00
+2015-06-23T03:15:00
+2015-07-15T03:15:00
+2015-07-28T03:15:00
+2015-08-19T03:15:00
+2015-08-25T03:15:00
+2015-09-16T03:15:00
+2015-09-22T03:15:00
+2015-10-21T03:15:00
+2015-10-27T03:15:00
+2015-11-18T03:15:00
+2015-11-24T03:15:00
+2015-12-16T03:15:00
+2015-12-22T03:15:00
+2016-01-20T03:15:00
+2016-01-26T03:15:00
+2016-02-17T03:15:00
+2016-02-23T03:15:00
+2016-03-16T03:15:00
+2016-03-22T03:15:00
+2016-04-20T03:15:00
+2016-04-26T03:15:00
+2016-05-18T03:15:00
+2016-05-24T03:15:00
+2016-06-15T03:15:00
+2016-06-28T03:15:00
+2016-07-20T03:15:00
+2016-07-26T03:15:00
+2016-08-17T03:15:00
+2016-08-23T03:15:00
+2016-09-21T03:15:00
+2016-09-27T03:15:00
+2016-10-19T03:15:00
+2016-10-25T03:15:00
+2016-11-16T03:15:00
+2016-11-22T03:15:00
+2016-12-21T03:15:00
+2016-12-27T03:15:00
+2017-01-18T03:15:00
+2017-01-24T03:15:00
+2017-02-15T03:15:00
+2017-02-28T03:15:00
+2017-03-15T03:15:00
+2017-03-28T03:15:00
+2017-04-19T03:15:00
+2017-04-25T03:15:00
+2017-05-17T03:15:00
+2017-05-23T03:15:00
+2017-06-21T03:15:00
+2017-06-27T03:15:00
+2017-07-19T03:15:00
+2017-07-25T03:15:00
+2017-08-16T03:15:00
+2017-08-22T03:15:00
+2017-09-20T03:15:00
+2017-09-26T03:15:00
+2017-10-18T03:15:00
+2017-10-24T03:15:00
+2017-11-15T03:15:00
+2017-11-28T03:15:00
+2017-12-20T03:15:00
+2017-12-26T03:15:00
+2018-01-17T03:15:00
+2018-01-23T03:15:00
+2018-02-21T03:15:00
+2018-02-27T03:15:00
+2018-03-21T03:15:00
+2018-03-27T03:15:00
+2018-04-18T03:15:00
+2018-04-24T03:15:00
+2018-05-16T03:15:00
+2018-05-22T03:15:00
+2018-06-20T03:15:00
+2018-06-26T03:15:00
+2018-07-18T03:15:00
+2018-07-24T03:15:00
+2018-08-15T03:15:00
+2018-08-28T03:15:00
+2018-09-19T03:15:00
+2018-09-25T03:15:00
+2018-10-17T03:15:00
+2018-10-23T03:15:00
+2018-11-21T03:15:00
+2018-11-27T03:15:00
+2018-12-19T03:15:00
+2018-12-25T03:15:00
+2019-01-16T03:15:00
+2019-01-22T03:15:00
+2019-02-20T03:15:00
+2019-02-26T03:15:00
+2019-03-20T03:15:00
+2019-03-26T03:15:00
+2019-04-17T03:15:00
+2019-04-23T03:15:00
+2019-05-15T03:15:00
+2019-05-28T03:15:00
+2019-06-19T03:15:00
+2019-06-25T03:15:00
+2019-07-17T03:15:00
+2019-07-23T03:15:00
+2019-08-21T03:15:00
+2019-08-27T03:15:00
+2019-09-18T03:15:00
+2019-09-24T03:15:00
+2019-10-16T03:15:00
+2019-10-22T03:15:00
+2019-11-20T03:15:00
+2019-11-26T03:15:00
+2019-12-18T03:15:00
+2019-12-24T03:15:00
+2020-01-15T03:15:00
+2020-01-28T03:15:00
+2020-02-19T03:15:00
+2020-02-25T03:15:00
+2020-03-18T03:15:00
+2020-03-24T03:15:00
+2020-04-15T03:15:00
+2020-04-28T03:15:00
+2020-05-20T03:15:00
+2020-05-26T03:15:00
+2020-06-17T03:15:00
+2020-06-23T03:15:00
+2020-07-15T03:15:00
+2020-07-28T03:15:00
+2020-08-19T03:15:00
+2020-08-25T03:15:00
+2020-09-16T03:15:00
+2020-09-22T03:15:00
+2020-10-21T03:15:00
+2020-10-27T03:15:00
+2020-11-18T03:15:00
+2020-11-24T03:15:00
+2020-12-16T03:15:00
+2020-12-22T03:15:00
+2021-01-20T03:15:00
+2021-01-26T03:15:00
+2021-02-17T03:15:00
+2021-02-23T03:15:00
+2021-03-17T03:15:00
+2021-03-23T03:15:00
+2021-04-21T03:15:00
+2021-04-27T03:15:00
+2021-05-19T03:15:00
+2021-05-25T03:15:00
+2021-06-16T03:15:00
+2021-06-22T03:15:00
+2021-07-21T03:15:00
+2021-07-27T03:15:00
+2021-08-18T03:15:00
+2021-08-24T03:15:00
+2021-09-15T03:15:00
+2021-09-28T03:15:00
+2021-10-20T03:15:00
+2021-10-26T03:15:00
+2021-11-17T03:15:00
+2021-11-23T03:15:00
+2021-12-15T03:15:00
+2021-12-28T03:15:00
+2022-01-19T03:15:00
+2022-01-25T03:15:00
+2022-02-16T03:15:00
+2022-02-22T03:15:00
+2022-03-16T03:15:00
+2022-03-22T03:15:00
+2022-04-20T03:15:00
+2022-04-26T03:15:00
+2022-05-18T03:15:00
+2022-05-24T03:15:00
+2022-06-15T03:15:00
+2022-06-28T03:15:00
+2022-07-20T03:15:00
+2022-07-26T03:15:00
+2022-08-17T03:15:00
+2022-08-23T03:15:00
+2022-09-21T03:15:00
+2022-09-27T03:15:00
+2022-10-19T03:15:00
+2022-10-25T03:15:00
+2022-11-16T03:15:00
+2022-11-22T03:15:00
+2022-12-21T03:15:00
+2022-12-27T03:15:00
+2023-01-18T03:15:00
+2023-01-24T03:15:00
+2023-02-15T03:15:00
+2023-02-28T03:15:00
+2023-03-15T03:15:00
+2023-03-28T03:15:00
+2023-04-19T03:15:00
+2023-04-25T03:15:00
+2023-05-17T03:15:00
+2023-05-23T03:15:00
+2023-06-21T03:15:00
+2023-06-27T03:15:00
+2023-07-19T03:15:00
+2023-07-25T03:15:00
+2023-08-16T03:15:00
+2023-08-22T03:15:00
+2023-09-20T03:15:00
+2023-09-26T03:15:00
+2023-10-18T03:15:00
+2023-10-24T03:15:00
+2023-11-15T03:15:00
+2023-11-28T03:15:00
+2023-12-20T03:15:00
+2023-12-26T03:15:00
+2024-01-17T03:15:00
+2024-01-23T03:15:00
+2024-02-21T03:15:00
+2024-02-27T03:15:00
+2024-03-20T03:15:00
+2024-03-26T03:15:00
+2024-04-17T03:15:00
+2024-04-23T03:15:00
+2024-05-15T03:15:00
+2024-05-28T03:15:00
+2024-06-19T03:15:00
+2024-06-25T03:15:00
+2024-07-17T03:15:00
+2024-07-23T03:15:00
+2024-08-21T03:15:00
+2024-08-27T03:15:00
+2024-09-18T03:15:00
+2024-09-24T03:15:00
+2024-10-16T03:15:00
+2024-10-22T03:15:00
+2024-11-20T03:15:00
+2024-11-26T03:15:00
+2024-12-18T03:15:00
+2024-12-24T03:15:00
+2025-01-15T03:15:00
+2025-01-28T03:15:00
+2025-02-19T03:15:00
+2025-02-25T03:15:00
+2025-03-19T03:15:00
+2025-03-25T03:15:00
+2025-04-16T03:15:00
+2025-04-22T03:15:00
+2025-05-21T03:15:00
+2025-05-27T03:15:00
+2025-06-18T03:15:00
+2025-06-24T03:15:00
+2025-07-16T03:15:00
+2025-07-22T03:15:00
+2025-08-20T03:15:00
+2025-08-26T03:15:00
+2025-09-17T03:15:00
+2025-09-23T03:15:00
+2025-10-15T03:15:00
+2025-10-28T03:15:00
+2025-11-19T03:15:00
+2025-11-25T03:15:00
+2025-12-17T03:15:00
+2025-12-23T03:15:00
+2026-01-21T03:15:00
+2026-01-27T03:15:00
+2026-02-18T03:15:00
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/monthly.ics.next.ref b/libkcal/tests/data/RecurrenceRule/unsorted/monthly.ics.next.ref
new file mode 100644
index 00000000..a46b2400
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/monthly.ics.next.ref
@@ -0,0 +1,500 @@
+2005-05-12T03:15:00
+2005-05-18T03:15:00
+2005-05-24T03:15:00
+2005-06-15T03:15:00
+2005-06-28T03:15:00
+2005-07-20T03:15:00
+2005-07-26T03:15:00
+2005-08-17T03:15:00
+2005-08-23T03:15:00
+2005-09-21T03:15:00
+2005-09-27T03:15:00
+2005-10-19T03:15:00
+2005-10-25T03:15:00
+2005-11-16T03:15:00
+2005-11-22T03:15:00
+2005-12-21T03:15:00
+2005-12-27T03:15:00
+2006-01-18T03:15:00
+2006-01-24T03:15:00
+2006-02-15T03:15:00
+2006-02-28T03:15:00
+2006-03-15T03:15:00
+2006-03-28T03:15:00
+2006-04-19T03:15:00
+2006-04-25T03:15:00
+2006-05-17T03:15:00
+2006-05-23T03:15:00
+2006-06-21T03:15:00
+2006-06-27T03:15:00
+2006-07-19T03:15:00
+2006-07-25T03:15:00
+2006-08-16T03:15:00
+2006-08-22T03:15:00
+2006-09-20T03:15:00
+2006-09-26T03:15:00
+2006-10-18T03:15:00
+2006-10-24T03:15:00
+2006-11-15T03:15:00
+2006-11-28T03:15:00
+2006-12-20T03:15:00
+2006-12-26T03:15:00
+2007-01-17T03:15:00
+2007-01-23T03:15:00
+2007-02-21T03:15:00
+2007-02-27T03:15:00
+2007-03-21T03:15:00
+2007-03-27T03:15:00
+2007-04-18T03:15:00
+2007-04-24T03:15:00
+2007-05-16T03:15:00
+2007-05-22T03:15:00
+2007-06-20T03:15:00
+2007-06-26T03:15:00
+2007-07-18T03:15:00
+2007-07-24T03:15:00
+2007-08-15T03:15:00
+2007-08-28T03:15:00
+2007-09-19T03:15:00
+2007-09-25T03:15:00
+2007-10-17T03:15:00
+2007-10-23T03:15:00
+2007-11-21T03:15:00
+2007-11-27T03:15:00
+2007-12-19T03:15:00
+2007-12-25T03:15:00
+2008-01-16T03:15:00
+2008-01-22T03:15:00
+2008-02-20T03:15:00
+2008-02-26T03:15:00
+2008-03-19T03:15:00
+2008-03-25T03:15:00
+2008-04-16T03:15:00
+2008-04-22T03:15:00
+2008-05-21T03:15:00
+2008-05-27T03:15:00
+2008-06-18T03:15:00
+2008-06-24T03:15:00
+2008-07-16T03:15:00
+2008-07-22T03:15:00
+2008-08-20T03:15:00
+2008-08-26T03:15:00
+2008-09-17T03:15:00
+2008-09-23T03:15:00
+2008-10-15T03:15:00
+2008-10-28T03:15:00
+2008-11-19T03:15:00
+2008-11-25T03:15:00
+2008-12-17T03:15:00
+2008-12-23T03:15:00
+2009-01-21T03:15:00
+2009-01-27T03:15:00
+2009-02-18T03:15:00
+2009-02-24T03:15:00
+2009-03-18T03:15:00
+2009-03-24T03:15:00
+2009-04-15T03:15:00
+2009-04-28T03:15:00
+2009-05-20T03:15:00
+2009-05-26T03:15:00
+2009-06-17T03:15:00
+2009-06-23T03:15:00
+2009-07-15T03:15:00
+2009-07-28T03:15:00
+2009-08-19T03:15:00
+2009-08-25T03:15:00
+2009-09-16T03:15:00
+2009-09-22T03:15:00
+2009-10-21T03:15:00
+2009-10-27T03:15:00
+2009-11-18T03:15:00
+2009-11-24T03:15:00
+2009-12-16T03:15:00
+2009-12-22T03:15:00
+2010-01-20T03:15:00
+2010-01-26T03:15:00
+2010-02-17T03:15:00
+2010-02-23T03:15:00
+2010-03-17T03:15:00
+2010-03-23T03:15:00
+2010-04-21T03:15:00
+2010-04-27T03:15:00
+2010-05-19T03:15:00
+2010-05-25T03:15:00
+2010-06-16T03:15:00
+2010-06-22T03:15:00
+2010-07-21T03:15:00
+2010-07-27T03:15:00
+2010-08-18T03:15:00
+2010-08-24T03:15:00
+2010-09-15T03:15:00
+2010-09-28T03:15:00
+2010-10-20T03:15:00
+2010-10-26T03:15:00
+2010-11-17T03:15:00
+2010-11-23T03:15:00
+2010-12-15T03:15:00
+2010-12-28T03:15:00
+2011-01-19T03:15:00
+2011-01-25T03:15:00
+2011-02-16T03:15:00
+2011-02-22T03:15:00
+2011-03-16T03:15:00
+2011-03-22T03:15:00
+2011-04-20T03:15:00
+2011-04-26T03:15:00
+2011-05-18T03:15:00
+2011-05-24T03:15:00
+2011-06-15T03:15:00
+2011-06-28T03:15:00
+2011-07-20T03:15:00
+2011-07-26T03:15:00
+2011-08-17T03:15:00
+2011-08-23T03:15:00
+2011-09-21T03:15:00
+2011-09-27T03:15:00
+2011-10-19T03:15:00
+2011-10-25T03:15:00
+2011-11-16T03:15:00
+2011-11-22T03:15:00
+2011-12-21T03:15:00
+2011-12-27T03:15:00
+2012-01-18T03:15:00
+2012-01-24T03:15:00
+2012-02-15T03:15:00
+2012-02-28T03:15:00
+2012-03-21T03:15:00
+2012-03-27T03:15:00
+2012-04-18T03:15:00
+2012-04-24T03:15:00
+2012-05-16T03:15:00
+2012-05-22T03:15:00
+2012-06-20T03:15:00
+2012-06-26T03:15:00
+2012-07-18T03:15:00
+2012-07-24T03:15:00
+2012-08-15T03:15:00
+2012-08-28T03:15:00
+2012-09-19T03:15:00
+2012-09-25T03:15:00
+2012-10-17T03:15:00
+2012-10-23T03:15:00
+2012-11-21T03:15:00
+2012-11-27T03:15:00
+2012-12-19T03:15:00
+2012-12-25T03:15:00
+2013-01-16T03:15:00
+2013-01-22T03:15:00
+2013-02-20T03:15:00
+2013-02-26T03:15:00
+2013-03-20T03:15:00
+2013-03-26T03:15:00
+2013-04-17T03:15:00
+2013-04-23T03:15:00
+2013-05-15T03:15:00
+2013-05-28T03:15:00
+2013-06-19T03:15:00
+2013-06-25T03:15:00
+2013-07-17T03:15:00
+2013-07-23T03:15:00
+2013-08-21T03:15:00
+2013-08-27T03:15:00
+2013-09-18T03:15:00
+2013-09-24T03:15:00
+2013-10-16T03:15:00
+2013-10-22T03:15:00
+2013-11-20T03:15:00
+2013-11-26T03:15:00
+2013-12-18T03:15:00
+2013-12-24T03:15:00
+2014-01-15T03:15:00
+2014-01-28T03:15:00
+2014-02-19T03:15:00
+2014-02-25T03:15:00
+2014-03-19T03:15:00
+2014-03-25T03:15:00
+2014-04-16T03:15:00
+2014-04-22T03:15:00
+2014-05-21T03:15:00
+2014-05-27T03:15:00
+2014-06-18T03:15:00
+2014-06-24T03:15:00
+2014-07-16T03:15:00
+2014-07-22T03:15:00
+2014-08-20T03:15:00
+2014-08-26T03:15:00
+2014-09-17T03:15:00
+2014-09-23T03:15:00
+2014-10-15T03:15:00
+2014-10-28T03:15:00
+2014-11-19T03:15:00
+2014-11-25T03:15:00
+2014-12-17T03:15:00
+2014-12-23T03:15:00
+2015-01-21T03:15:00
+2015-01-27T03:15:00
+2015-02-18T03:15:00
+2015-02-24T03:15:00
+2015-03-18T03:15:00
+2015-03-24T03:15:00
+2015-04-15T03:15:00
+2015-04-28T03:15:00
+2015-05-20T03:15:00
+2015-05-26T03:15:00
+2015-06-17T03:15:00
+2015-06-23T03:15:00
+2015-07-15T03:15:00
+2015-07-28T03:15:00
+2015-08-19T03:15:00
+2015-08-25T03:15:00
+2015-09-16T03:15:00
+2015-09-22T03:15:00
+2015-10-21T03:15:00
+2015-10-27T03:15:00
+2015-11-18T03:15:00
+2015-11-24T03:15:00
+2015-12-16T03:15:00
+2015-12-22T03:15:00
+2016-01-20T03:15:00
+2016-01-26T03:15:00
+2016-02-17T03:15:00
+2016-02-23T03:15:00
+2016-03-16T03:15:00
+2016-03-22T03:15:00
+2016-04-20T03:15:00
+2016-04-26T03:15:00
+2016-05-18T03:15:00
+2016-05-24T03:15:00
+2016-06-15T03:15:00
+2016-06-28T03:15:00
+2016-07-20T03:15:00
+2016-07-26T03:15:00
+2016-08-17T03:15:00
+2016-08-23T03:15:00
+2016-09-21T03:15:00
+2016-09-27T03:15:00
+2016-10-19T03:15:00
+2016-10-25T03:15:00
+2016-11-16T03:15:00
+2016-11-22T03:15:00
+2016-12-21T03:15:00
+2016-12-27T03:15:00
+2017-01-18T03:15:00
+2017-01-24T03:15:00
+2017-02-15T03:15:00
+2017-02-28T03:15:00
+2017-03-15T03:15:00
+2017-03-28T03:15:00
+2017-04-19T03:15:00
+2017-04-25T03:15:00
+2017-05-17T03:15:00
+2017-05-23T03:15:00
+2017-06-21T03:15:00
+2017-06-27T03:15:00
+2017-07-19T03:15:00
+2017-07-25T03:15:00
+2017-08-16T03:15:00
+2017-08-22T03:15:00
+2017-09-20T03:15:00
+2017-09-26T03:15:00
+2017-10-18T03:15:00
+2017-10-24T03:15:00
+2017-11-15T03:15:00
+2017-11-28T03:15:00
+2017-12-20T03:15:00
+2017-12-26T03:15:00
+2018-01-17T03:15:00
+2018-01-23T03:15:00
+2018-02-21T03:15:00
+2018-02-27T03:15:00
+2018-03-21T03:15:00
+2018-03-27T03:15:00
+2018-04-18T03:15:00
+2018-04-24T03:15:00
+2018-05-16T03:15:00
+2018-05-22T03:15:00
+2018-06-20T03:15:00
+2018-06-26T03:15:00
+2018-07-18T03:15:00
+2018-07-24T03:15:00
+2018-08-15T03:15:00
+2018-08-28T03:15:00
+2018-09-19T03:15:00
+2018-09-25T03:15:00
+2018-10-17T03:15:00
+2018-10-23T03:15:00
+2018-11-21T03:15:00
+2018-11-27T03:15:00
+2018-12-19T03:15:00
+2018-12-25T03:15:00
+2019-01-16T03:15:00
+2019-01-22T03:15:00
+2019-02-20T03:15:00
+2019-02-26T03:15:00
+2019-03-20T03:15:00
+2019-03-26T03:15:00
+2019-04-17T03:15:00
+2019-04-23T03:15:00
+2019-05-15T03:15:00
+2019-05-28T03:15:00
+2019-06-19T03:15:00
+2019-06-25T03:15:00
+2019-07-17T03:15:00
+2019-07-23T03:15:00
+2019-08-21T03:15:00
+2019-08-27T03:15:00
+2019-09-18T03:15:00
+2019-09-24T03:15:00
+2019-10-16T03:15:00
+2019-10-22T03:15:00
+2019-11-20T03:15:00
+2019-11-26T03:15:00
+2019-12-18T03:15:00
+2019-12-24T03:15:00
+2020-01-15T03:15:00
+2020-01-28T03:15:00
+2020-02-19T03:15:00
+2020-02-25T03:15:00
+2020-03-18T03:15:00
+2020-03-24T03:15:00
+2020-04-15T03:15:00
+2020-04-28T03:15:00
+2020-05-20T03:15:00
+2020-05-26T03:15:00
+2020-06-17T03:15:00
+2020-06-23T03:15:00
+2020-07-15T03:15:00
+2020-07-28T03:15:00
+2020-08-19T03:15:00
+2020-08-25T03:15:00
+2020-09-16T03:15:00
+2020-09-22T03:15:00
+2020-10-21T03:15:00
+2020-10-27T03:15:00
+2020-11-18T03:15:00
+2020-11-24T03:15:00
+2020-12-16T03:15:00
+2020-12-22T03:15:00
+2021-01-20T03:15:00
+2021-01-26T03:15:00
+2021-02-17T03:15:00
+2021-02-23T03:15:00
+2021-03-17T03:15:00
+2021-03-23T03:15:00
+2021-04-21T03:15:00
+2021-04-27T03:15:00
+2021-05-19T03:15:00
+2021-05-25T03:15:00
+2021-06-16T03:15:00
+2021-06-22T03:15:00
+2021-07-21T03:15:00
+2021-07-27T03:15:00
+2021-08-18T03:15:00
+2021-08-24T03:15:00
+2021-09-15T03:15:00
+2021-09-28T03:15:00
+2021-10-20T03:15:00
+2021-10-26T03:15:00
+2021-11-17T03:15:00
+2021-11-23T03:15:00
+2021-12-15T03:15:00
+2021-12-28T03:15:00
+2022-01-19T03:15:00
+2022-01-25T03:15:00
+2022-02-16T03:15:00
+2022-02-22T03:15:00
+2022-03-16T03:15:00
+2022-03-22T03:15:00
+2022-04-20T03:15:00
+2022-04-26T03:15:00
+2022-05-18T03:15:00
+2022-05-24T03:15:00
+2022-06-15T03:15:00
+2022-06-28T03:15:00
+2022-07-20T03:15:00
+2022-07-26T03:15:00
+2022-08-17T03:15:00
+2022-08-23T03:15:00
+2022-09-21T03:15:00
+2022-09-27T03:15:00
+2022-10-19T03:15:00
+2022-10-25T03:15:00
+2022-11-16T03:15:00
+2022-11-22T03:15:00
+2022-12-21T03:15:00
+2022-12-27T03:15:00
+2023-01-18T03:15:00
+2023-01-24T03:15:00
+2023-02-15T03:15:00
+2023-02-28T03:15:00
+2023-03-15T03:15:00
+2023-03-28T03:15:00
+2023-04-19T03:15:00
+2023-04-25T03:15:00
+2023-05-17T03:15:00
+2023-05-23T03:15:00
+2023-06-21T03:15:00
+2023-06-27T03:15:00
+2023-07-19T03:15:00
+2023-07-25T03:15:00
+2023-08-16T03:15:00
+2023-08-22T03:15:00
+2023-09-20T03:15:00
+2023-09-26T03:15:00
+2023-10-18T03:15:00
+2023-10-24T03:15:00
+2023-11-15T03:15:00
+2023-11-28T03:15:00
+2023-12-20T03:15:00
+2023-12-26T03:15:00
+2024-01-17T03:15:00
+2024-01-23T03:15:00
+2024-02-21T03:15:00
+2024-02-27T03:15:00
+2024-03-20T03:15:00
+2024-03-26T03:15:00
+2024-04-17T03:15:00
+2024-04-23T03:15:00
+2024-05-15T03:15:00
+2024-05-28T03:15:00
+2024-06-19T03:15:00
+2024-06-25T03:15:00
+2024-07-17T03:15:00
+2024-07-23T03:15:00
+2024-08-21T03:15:00
+2024-08-27T03:15:00
+2024-09-18T03:15:00
+2024-09-24T03:15:00
+2024-10-16T03:15:00
+2024-10-22T03:15:00
+2024-11-20T03:15:00
+2024-11-26T03:15:00
+2024-12-18T03:15:00
+2024-12-24T03:15:00
+2025-01-15T03:15:00
+2025-01-28T03:15:00
+2025-02-19T03:15:00
+2025-02-25T03:15:00
+2025-03-19T03:15:00
+2025-03-25T03:15:00
+2025-04-16T03:15:00
+2025-04-22T03:15:00
+2025-05-21T03:15:00
+2025-05-27T03:15:00
+2025-06-18T03:15:00
+2025-06-24T03:15:00
+2025-07-16T03:15:00
+2025-07-22T03:15:00
+2025-08-20T03:15:00
+2025-08-26T03:15:00
+2025-09-17T03:15:00
+2025-09-23T03:15:00
+2025-10-15T03:15:00
+2025-10-28T03:15:00
+2025-11-19T03:15:00
+2025-11-25T03:15:00
+2025-12-17T03:15:00
+2025-12-23T03:15:00
+2026-01-21T03:15:00
+2026-01-27T03:15:00
+2026-02-18T03:15:00
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/monthly.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/unsorted/monthly.ics.prev.ref
new file mode 100644
index 00000000..ed6632b1
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/monthly.ics.prev.ref
@@ -0,0 +1,138 @@
+2010-12-28T03:15:00
+2010-12-15T03:15:00
+2010-11-23T03:15:00
+2010-11-17T03:15:00
+2010-10-26T03:15:00
+2010-10-20T03:15:00
+2010-09-28T03:15:00
+2010-09-15T03:15:00
+2010-08-24T03:15:00
+2010-08-18T03:15:00
+2010-07-27T03:15:00
+2010-07-21T03:15:00
+2010-06-22T03:15:00
+2010-06-16T03:15:00
+2010-05-25T03:15:00
+2010-05-19T03:15:00
+2010-04-27T03:15:00
+2010-04-21T03:15:00
+2010-03-23T03:15:00
+2010-03-17T03:15:00
+2010-02-23T03:15:00
+2010-02-17T03:15:00
+2010-01-26T03:15:00
+2010-01-20T03:15:00
+2009-12-22T03:15:00
+2009-12-16T03:15:00
+2009-11-24T03:15:00
+2009-11-18T03:15:00
+2009-10-27T03:15:00
+2009-10-21T03:15:00
+2009-09-22T03:15:00
+2009-09-16T03:15:00
+2009-08-25T03:15:00
+2009-08-19T03:15:00
+2009-07-28T03:15:00
+2009-07-15T03:15:00
+2009-06-23T03:15:00
+2009-06-17T03:15:00
+2009-05-26T03:15:00
+2009-05-20T03:15:00
+2009-04-28T03:15:00
+2009-04-15T03:15:00
+2009-03-24T03:15:00
+2009-03-18T03:15:00
+2009-02-24T03:15:00
+2009-02-18T03:15:00
+2009-01-27T03:15:00
+2009-01-21T03:15:00
+2008-12-23T03:15:00
+2008-12-17T03:15:00
+2008-11-25T03:15:00
+2008-11-19T03:15:00
+2008-10-28T03:15:00
+2008-10-15T03:15:00
+2008-09-23T03:15:00
+2008-09-17T03:15:00
+2008-08-26T03:15:00
+2008-08-20T03:15:00
+2008-07-22T03:15:00
+2008-07-16T03:15:00
+2008-06-24T03:15:00
+2008-06-18T03:15:00
+2008-05-27T03:15:00
+2008-05-21T03:15:00
+2008-04-22T03:15:00
+2008-04-16T03:15:00
+2008-03-25T03:15:00
+2008-03-19T03:15:00
+2008-02-26T03:15:00
+2008-02-20T03:15:00
+2008-01-22T03:15:00
+2008-01-16T03:15:00
+2007-12-25T03:15:00
+2007-12-19T03:15:00
+2007-11-27T03:15:00
+2007-11-21T03:15:00
+2007-10-23T03:15:00
+2007-10-17T03:15:00
+2007-09-25T03:15:00
+2007-09-19T03:15:00
+2007-08-28T03:15:00
+2007-08-15T03:15:00
+2007-07-24T03:15:00
+2007-07-18T03:15:00
+2007-06-26T03:15:00
+2007-06-20T03:15:00
+2007-05-22T03:15:00
+2007-05-16T03:15:00
+2007-04-24T03:15:00
+2007-04-18T03:15:00
+2007-03-27T03:15:00
+2007-03-21T03:15:00
+2007-02-27T03:15:00
+2007-02-21T03:15:00
+2007-01-23T03:15:00
+2007-01-17T03:15:00
+2006-12-26T03:15:00
+2006-12-20T03:15:00
+2006-11-28T03:15:00
+2006-11-15T03:15:00
+2006-10-24T03:15:00
+2006-10-18T03:15:00
+2006-09-26T03:15:00
+2006-09-20T03:15:00
+2006-08-22T03:15:00
+2006-08-16T03:15:00
+2006-07-25T03:15:00
+2006-07-19T03:15:00
+2006-06-27T03:15:00
+2006-06-21T03:15:00
+2006-05-23T03:15:00
+2006-05-17T03:15:00
+2006-04-25T03:15:00
+2006-04-19T03:15:00
+2006-03-28T03:15:00
+2006-03-15T03:15:00
+2006-02-28T03:15:00
+2006-02-15T03:15:00
+2006-01-24T03:15:00
+2006-01-18T03:15:00
+2005-12-27T03:15:00
+2005-12-21T03:15:00
+2005-11-22T03:15:00
+2005-11-16T03:15:00
+2005-10-25T03:15:00
+2005-10-19T03:15:00
+2005-09-27T03:15:00
+2005-09-21T03:15:00
+2005-08-23T03:15:00
+2005-08-17T03:15:00
+2005-07-26T03:15:00
+2005-07-20T03:15:00
+2005-06-28T03:15:00
+2005-06-15T03:15:00
+2005-05-24T03:15:00
+2005-05-18T03:15:00
+2005-05-12T03:15:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/monthly.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/unsorted/monthly.ics.recurson.ref
new file mode 100644
index 00000000..bbf1358c
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/monthly.ics.recurson.ref
@@ -0,0 +1,137 @@
+2005-05-12
+2005-05-18
+2005-05-24
+2005-06-15
+2005-06-28
+2005-07-20
+2005-07-26
+2005-08-17
+2005-08-23
+2005-09-21
+2005-09-27
+2005-10-19
+2005-10-25
+2005-11-16
+2005-11-22
+2005-12-21
+2005-12-27
+2006-01-18
+2006-01-24
+2006-02-15
+2006-02-28
+2006-03-15
+2006-03-28
+2006-04-19
+2006-04-25
+2006-05-17
+2006-05-23
+2006-06-21
+2006-06-27
+2006-07-19
+2006-07-25
+2006-08-16
+2006-08-22
+2006-09-20
+2006-09-26
+2006-10-18
+2006-10-24
+2006-11-15
+2006-11-28
+2006-12-20
+2006-12-26
+2007-01-17
+2007-01-23
+2007-02-21
+2007-02-27
+2007-03-21
+2007-03-27
+2007-04-18
+2007-04-24
+2007-05-16
+2007-05-22
+2007-06-20
+2007-06-26
+2007-07-18
+2007-07-24
+2007-08-15
+2007-08-28
+2007-09-19
+2007-09-25
+2007-10-17
+2007-10-23
+2007-11-21
+2007-11-27
+2007-12-19
+2007-12-25
+2008-01-16
+2008-01-22
+2008-02-20
+2008-02-26
+2008-03-19
+2008-03-25
+2008-04-16
+2008-04-22
+2008-05-21
+2008-05-27
+2008-06-18
+2008-06-24
+2008-07-16
+2008-07-22
+2008-08-20
+2008-08-26
+2008-09-17
+2008-09-23
+2008-10-15
+2008-10-28
+2008-11-19
+2008-11-25
+2008-12-17
+2008-12-23
+2009-01-21
+2009-01-27
+2009-02-18
+2009-02-24
+2009-03-18
+2009-03-24
+2009-04-15
+2009-04-28
+2009-05-20
+2009-05-26
+2009-06-17
+2009-06-23
+2009-07-15
+2009-07-28
+2009-08-19
+2009-08-25
+2009-09-16
+2009-09-22
+2009-10-21
+2009-10-27
+2009-11-18
+2009-11-24
+2009-12-16
+2009-12-22
+2010-01-20
+2010-01-26
+2010-02-17
+2010-02-23
+2010-03-17
+2010-03-23
+2010-04-21
+2010-04-27
+2010-05-19
+2010-05-25
+2010-06-16
+2010-06-22
+2010-07-21
+2010-07-27
+2010-08-18
+2010-08-24
+2010-09-15
+2010-09-28
+2010-10-20
+2010-10-26
+2010-11-17
+2010-11-23
+2010-12-15
+2010-12-28
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/rdate.ics b/libkcal/tests/data/RecurrenceRule/unsorted/rdate.ics
new file mode 100644
index 00000000..1f6d22b7
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/rdate.ics
@@ -0,0 +1,19 @@
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+VERSION:2.0
+PRODID:-//MH Software Inc//Connect Daily - 3.0.7//EN
+X-LibKCal-Testsuite-OutTZ:UTC
+
+BEGIN:VEVENT
+UID:1214@67.154.139.115
+SUMMARY:Every other week, Mo and We, starting 12.5.2005, 03:15:00Z
+DTSTART;VALUE=DATE:20050512
+RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=7;BYDAY=MO,WE
+DURATION:PT5H
+RDATE;VALUE=DATE-TIME:20050514T015800Z
+RDATE;VALUE=DATE-TIME:20050514T022214Z
+RDATE:20050516T022214Z,20050516T015800Z
+RDATE;VALUE=DATE:20050517
+END:VEVENT
+
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/rdate.ics.next.ref b/libkcal/tests/data/RecurrenceRule/unsorted/rdate.ics.next.ref
new file mode 100644
index 00000000..7fbeedb1
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/rdate.ics.next.ref
@@ -0,0 +1,14 @@
+2005-05-12T00:00:00
+2005-05-14T01:58:00
+2005-05-14T02:22:14
+2005-05-16T01:58:00
+2005-05-16T02:22:14
+2005-05-17T00:00:00
+2005-05-23T00:00:00
+2005-05-25T00:00:00
+2005-06-06T00:00:00
+2005-06-08T00:00:00
+2005-06-20T00:00:00
+2005-06-22T00:00:00
+2005-07-04T00:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/rdate.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/unsorted/rdate.ics.prev.ref
new file mode 100644
index 00000000..12748b68
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/rdate.ics.prev.ref
@@ -0,0 +1,14 @@
+2005-07-04T00:00:00
+2005-06-22T00:00:00
+2005-06-20T00:00:00
+2005-06-08T00:00:00
+2005-06-06T00:00:00
+2005-05-25T00:00:00
+2005-05-23T00:00:00
+2005-05-17T00:00:00
+2005-05-16T02:22:14
+2005-05-16T01:58:00
+2005-05-14T02:22:14
+2005-05-14T01:58:00
+2005-05-12T00:00:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/rdate.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/unsorted/rdate.ics.recurson.ref
new file mode 100644
index 00000000..4082c9c2
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/rdate.ics.recurson.ref
@@ -0,0 +1,11 @@
+2005-05-12
+2005-05-14
+2005-05-16
+2005-05-17
+2005-05-23
+2005-05-25
+2005-06-06
+2005-06-08
+2005-06-20
+2005-06-22
+2005-07-04
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/test1.ics b/libkcal/tests/data/RecurrenceRule/unsorted/test1.ics
new file mode 100644
index 00000000..cb7441a6
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/test1.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+VERSION:2.0
+PRODID:-//MH Software Inc//Connect Daily - 3.0.7//EN
+X-LibKCal-Testsuite-OutTZ:UTC
+
+BEGIN:VEVENT
+UID:1214@67.154.139.115
+SUMMARY:Every other year, every sunday in Jan, at 8:30 and 9:30
+DTSTART:20050512T031500Z
+RRULE:FREQ=YEARLY;INTERVAL=2;BYMONTH=1;BYDAY=SU;BYHOUR=8,9;BYMINUTE=30
+DURATION:PT5H
+END:VEVENT
+
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/test1.ics.next.ref b/libkcal/tests/data/RecurrenceRule/unsorted/test1.ics.next.ref
new file mode 100644
index 00000000..2abb6f4e
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/test1.ics.next.ref
@@ -0,0 +1,500 @@
+2005-05-12T03:15:00
+2007-01-07T08:30:00
+2007-01-07T09:30:00
+2007-01-14T08:30:00
+2007-01-14T09:30:00
+2007-01-21T08:30:00
+2007-01-21T09:30:00
+2007-01-28T08:30:00
+2007-01-28T09:30:00
+2009-01-04T08:30:00
+2009-01-04T09:30:00
+2009-01-11T08:30:00
+2009-01-11T09:30:00
+2009-01-18T08:30:00
+2009-01-18T09:30:00
+2009-01-25T08:30:00
+2009-01-25T09:30:00
+2011-01-02T08:30:00
+2011-01-02T09:30:00
+2011-01-09T08:30:00
+2011-01-09T09:30:00
+2011-01-16T08:30:00
+2011-01-16T09:30:00
+2011-01-23T08:30:00
+2011-01-23T09:30:00
+2011-01-30T08:30:00
+2011-01-30T09:30:00
+2013-01-06T08:30:00
+2013-01-06T09:30:00
+2013-01-13T08:30:00
+2013-01-13T09:30:00
+2013-01-20T08:30:00
+2013-01-20T09:30:00
+2013-01-27T08:30:00
+2013-01-27T09:30:00
+2015-01-04T08:30:00
+2015-01-04T09:30:00
+2015-01-11T08:30:00
+2015-01-11T09:30:00
+2015-01-18T08:30:00
+2015-01-18T09:30:00
+2015-01-25T08:30:00
+2015-01-25T09:30:00
+2017-01-01T08:30:00
+2017-01-01T09:30:00
+2017-01-08T08:30:00
+2017-01-08T09:30:00
+2017-01-15T08:30:00
+2017-01-15T09:30:00
+2017-01-22T08:30:00
+2017-01-22T09:30:00
+2017-01-29T08:30:00
+2017-01-29T09:30:00
+2019-01-06T08:30:00
+2019-01-06T09:30:00
+2019-01-13T08:30:00
+2019-01-13T09:30:00
+2019-01-20T08:30:00
+2019-01-20T09:30:00
+2019-01-27T08:30:00
+2019-01-27T09:30:00
+2021-01-03T08:30:00
+2021-01-03T09:30:00
+2021-01-10T08:30:00
+2021-01-10T09:30:00
+2021-01-17T08:30:00
+2021-01-17T09:30:00
+2021-01-24T08:30:00
+2021-01-24T09:30:00
+2021-01-31T08:30:00
+2021-01-31T09:30:00
+2023-01-01T08:30:00
+2023-01-01T09:30:00
+2023-01-08T08:30:00
+2023-01-08T09:30:00
+2023-01-15T08:30:00
+2023-01-15T09:30:00
+2023-01-22T08:30:00
+2023-01-22T09:30:00
+2023-01-29T08:30:00
+2023-01-29T09:30:00
+2025-01-05T08:30:00
+2025-01-05T09:30:00
+2025-01-12T08:30:00
+2025-01-12T09:30:00
+2025-01-19T08:30:00
+2025-01-19T09:30:00
+2025-01-26T08:30:00
+2025-01-26T09:30:00
+2027-01-03T08:30:00
+2027-01-03T09:30:00
+2027-01-10T08:30:00
+2027-01-10T09:30:00
+2027-01-17T08:30:00
+2027-01-17T09:30:00
+2027-01-24T08:30:00
+2027-01-24T09:30:00
+2027-01-31T08:30:00
+2027-01-31T09:30:00
+2029-01-07T08:30:00
+2029-01-07T09:30:00
+2029-01-14T08:30:00
+2029-01-14T09:30:00
+2029-01-21T08:30:00
+2029-01-21T09:30:00
+2029-01-28T08:30:00
+2029-01-28T09:30:00
+2031-01-05T08:30:00
+2031-01-05T09:30:00
+2031-01-12T08:30:00
+2031-01-12T09:30:00
+2031-01-19T08:30:00
+2031-01-19T09:30:00
+2031-01-26T08:30:00
+2031-01-26T09:30:00
+2033-01-02T08:30:00
+2033-01-02T09:30:00
+2033-01-09T08:30:00
+2033-01-09T09:30:00
+2033-01-16T08:30:00
+2033-01-16T09:30:00
+2033-01-23T08:30:00
+2033-01-23T09:30:00
+2033-01-30T08:30:00
+2033-01-30T09:30:00
+2035-01-07T08:30:00
+2035-01-07T09:30:00
+2035-01-14T08:30:00
+2035-01-14T09:30:00
+2035-01-21T08:30:00
+2035-01-21T09:30:00
+2035-01-28T08:30:00
+2035-01-28T09:30:00
+2037-01-04T08:30:00
+2037-01-04T09:30:00
+2037-01-11T08:30:00
+2037-01-11T09:30:00
+2037-01-18T08:30:00
+2037-01-18T09:30:00
+2037-01-25T08:30:00
+2037-01-25T09:30:00
+2039-01-02T08:30:00
+2039-01-02T09:30:00
+2039-01-09T08:30:00
+2039-01-09T09:30:00
+2039-01-16T08:30:00
+2039-01-16T09:30:00
+2039-01-23T08:30:00
+2039-01-23T09:30:00
+2039-01-30T08:30:00
+2039-01-30T09:30:00
+2041-01-06T08:30:00
+2041-01-06T09:30:00
+2041-01-13T08:30:00
+2041-01-13T09:30:00
+2041-01-20T08:30:00
+2041-01-20T09:30:00
+2041-01-27T08:30:00
+2041-01-27T09:30:00
+2043-01-04T08:30:00
+2043-01-04T09:30:00
+2043-01-11T08:30:00
+2043-01-11T09:30:00
+2043-01-18T08:30:00
+2043-01-18T09:30:00
+2043-01-25T08:30:00
+2043-01-25T09:30:00
+2045-01-01T08:30:00
+2045-01-01T09:30:00
+2045-01-08T08:30:00
+2045-01-08T09:30:00
+2045-01-15T08:30:00
+2045-01-15T09:30:00
+2045-01-22T08:30:00
+2045-01-22T09:30:00
+2045-01-29T08:30:00
+2045-01-29T09:30:00
+2047-01-06T08:30:00
+2047-01-06T09:30:00
+2047-01-13T08:30:00
+2047-01-13T09:30:00
+2047-01-20T08:30:00
+2047-01-20T09:30:00
+2047-01-27T08:30:00
+2047-01-27T09:30:00
+2049-01-03T08:30:00
+2049-01-03T09:30:00
+2049-01-10T08:30:00
+2049-01-10T09:30:00
+2049-01-17T08:30:00
+2049-01-17T09:30:00
+2049-01-24T08:30:00
+2049-01-24T09:30:00
+2049-01-31T08:30:00
+2049-01-31T09:30:00
+2051-01-01T08:30:00
+2051-01-01T09:30:00
+2051-01-08T08:30:00
+2051-01-08T09:30:00
+2051-01-15T08:30:00
+2051-01-15T09:30:00
+2051-01-22T08:30:00
+2051-01-22T09:30:00
+2051-01-29T08:30:00
+2051-01-29T09:30:00
+2053-01-05T08:30:00
+2053-01-05T09:30:00
+2053-01-12T08:30:00
+2053-01-12T09:30:00
+2053-01-19T08:30:00
+2053-01-19T09:30:00
+2053-01-26T08:30:00
+2053-01-26T09:30:00
+2055-01-03T08:30:00
+2055-01-03T09:30:00
+2055-01-10T08:30:00
+2055-01-10T09:30:00
+2055-01-17T08:30:00
+2055-01-17T09:30:00
+2055-01-24T08:30:00
+2055-01-24T09:30:00
+2055-01-31T08:30:00
+2055-01-31T09:30:00
+2057-01-07T08:30:00
+2057-01-07T09:30:00
+2057-01-14T08:30:00
+2057-01-14T09:30:00
+2057-01-21T08:30:00
+2057-01-21T09:30:00
+2057-01-28T08:30:00
+2057-01-28T09:30:00
+2059-01-05T08:30:00
+2059-01-05T09:30:00
+2059-01-12T08:30:00
+2059-01-12T09:30:00
+2059-01-19T08:30:00
+2059-01-19T09:30:00
+2059-01-26T08:30:00
+2059-01-26T09:30:00
+2061-01-02T08:30:00
+2061-01-02T09:30:00
+2061-01-09T08:30:00
+2061-01-09T09:30:00
+2061-01-16T08:30:00
+2061-01-16T09:30:00
+2061-01-23T08:30:00
+2061-01-23T09:30:00
+2061-01-30T08:30:00
+2061-01-30T09:30:00
+2063-01-07T08:30:00
+2063-01-07T09:30:00
+2063-01-14T08:30:00
+2063-01-14T09:30:00
+2063-01-21T08:30:00
+2063-01-21T09:30:00
+2063-01-28T08:30:00
+2063-01-28T09:30:00
+2065-01-04T08:30:00
+2065-01-04T09:30:00
+2065-01-11T08:30:00
+2065-01-11T09:30:00
+2065-01-18T08:30:00
+2065-01-18T09:30:00
+2065-01-25T08:30:00
+2065-01-25T09:30:00
+2067-01-02T08:30:00
+2067-01-02T09:30:00
+2067-01-09T08:30:00
+2067-01-09T09:30:00
+2067-01-16T08:30:00
+2067-01-16T09:30:00
+2067-01-23T08:30:00
+2067-01-23T09:30:00
+2067-01-30T08:30:00
+2067-01-30T09:30:00
+2069-01-06T08:30:00
+2069-01-06T09:30:00
+2069-01-13T08:30:00
+2069-01-13T09:30:00
+2069-01-20T08:30:00
+2069-01-20T09:30:00
+2069-01-27T08:30:00
+2069-01-27T09:30:00
+2071-01-04T08:30:00
+2071-01-04T09:30:00
+2071-01-11T08:30:00
+2071-01-11T09:30:00
+2071-01-18T08:30:00
+2071-01-18T09:30:00
+2071-01-25T08:30:00
+2071-01-25T09:30:00
+2073-01-01T08:30:00
+2073-01-01T09:30:00
+2073-01-08T08:30:00
+2073-01-08T09:30:00
+2073-01-15T08:30:00
+2073-01-15T09:30:00
+2073-01-22T08:30:00
+2073-01-22T09:30:00
+2073-01-29T08:30:00
+2073-01-29T09:30:00
+2075-01-06T08:30:00
+2075-01-06T09:30:00
+2075-01-13T08:30:00
+2075-01-13T09:30:00
+2075-01-20T08:30:00
+2075-01-20T09:30:00
+2075-01-27T08:30:00
+2075-01-27T09:30:00
+2077-01-03T08:30:00
+2077-01-03T09:30:00
+2077-01-10T08:30:00
+2077-01-10T09:30:00
+2077-01-17T08:30:00
+2077-01-17T09:30:00
+2077-01-24T08:30:00
+2077-01-24T09:30:00
+2077-01-31T08:30:00
+2077-01-31T09:30:00
+2079-01-01T08:30:00
+2079-01-01T09:30:00
+2079-01-08T08:30:00
+2079-01-08T09:30:00
+2079-01-15T08:30:00
+2079-01-15T09:30:00
+2079-01-22T08:30:00
+2079-01-22T09:30:00
+2079-01-29T08:30:00
+2079-01-29T09:30:00
+2081-01-05T08:30:00
+2081-01-05T09:30:00
+2081-01-12T08:30:00
+2081-01-12T09:30:00
+2081-01-19T08:30:00
+2081-01-19T09:30:00
+2081-01-26T08:30:00
+2081-01-26T09:30:00
+2083-01-03T08:30:00
+2083-01-03T09:30:00
+2083-01-10T08:30:00
+2083-01-10T09:30:00
+2083-01-17T08:30:00
+2083-01-17T09:30:00
+2083-01-24T08:30:00
+2083-01-24T09:30:00
+2083-01-31T08:30:00
+2083-01-31T09:30:00
+2085-01-07T08:30:00
+2085-01-07T09:30:00
+2085-01-14T08:30:00
+2085-01-14T09:30:00
+2085-01-21T08:30:00
+2085-01-21T09:30:00
+2085-01-28T08:30:00
+2085-01-28T09:30:00
+2087-01-05T08:30:00
+2087-01-05T09:30:00
+2087-01-12T08:30:00
+2087-01-12T09:30:00
+2087-01-19T08:30:00
+2087-01-19T09:30:00
+2087-01-26T08:30:00
+2087-01-26T09:30:00
+2089-01-02T08:30:00
+2089-01-02T09:30:00
+2089-01-09T08:30:00
+2089-01-09T09:30:00
+2089-01-16T08:30:00
+2089-01-16T09:30:00
+2089-01-23T08:30:00
+2089-01-23T09:30:00
+2089-01-30T08:30:00
+2089-01-30T09:30:00
+2091-01-07T08:30:00
+2091-01-07T09:30:00
+2091-01-14T08:30:00
+2091-01-14T09:30:00
+2091-01-21T08:30:00
+2091-01-21T09:30:00
+2091-01-28T08:30:00
+2091-01-28T09:30:00
+2093-01-04T08:30:00
+2093-01-04T09:30:00
+2093-01-11T08:30:00
+2093-01-11T09:30:00
+2093-01-18T08:30:00
+2093-01-18T09:30:00
+2093-01-25T08:30:00
+2093-01-25T09:30:00
+2095-01-02T08:30:00
+2095-01-02T09:30:00
+2095-01-09T08:30:00
+2095-01-09T09:30:00
+2095-01-16T08:30:00
+2095-01-16T09:30:00
+2095-01-23T08:30:00
+2095-01-23T09:30:00
+2095-01-30T08:30:00
+2095-01-30T09:30:00
+2097-01-06T08:30:00
+2097-01-06T09:30:00
+2097-01-13T08:30:00
+2097-01-13T09:30:00
+2097-01-20T08:30:00
+2097-01-20T09:30:00
+2097-01-27T08:30:00
+2097-01-27T09:30:00
+2099-01-04T08:30:00
+2099-01-04T09:30:00
+2099-01-11T08:30:00
+2099-01-11T09:30:00
+2099-01-18T08:30:00
+2099-01-18T09:30:00
+2099-01-25T08:30:00
+2099-01-25T09:30:00
+2101-01-02T08:30:00
+2101-01-02T09:30:00
+2101-01-09T08:30:00
+2101-01-09T09:30:00
+2101-01-16T08:30:00
+2101-01-16T09:30:00
+2101-01-23T08:30:00
+2101-01-23T09:30:00
+2101-01-30T08:30:00
+2101-01-30T09:30:00
+2103-01-07T08:30:00
+2103-01-07T09:30:00
+2103-01-14T08:30:00
+2103-01-14T09:30:00
+2103-01-21T08:30:00
+2103-01-21T09:30:00
+2103-01-28T08:30:00
+2103-01-28T09:30:00
+2105-01-04T08:30:00
+2105-01-04T09:30:00
+2105-01-11T08:30:00
+2105-01-11T09:30:00
+2105-01-18T08:30:00
+2105-01-18T09:30:00
+2105-01-25T08:30:00
+2105-01-25T09:30:00
+2107-01-02T08:30:00
+2107-01-02T09:30:00
+2107-01-09T08:30:00
+2107-01-09T09:30:00
+2107-01-16T08:30:00
+2107-01-16T09:30:00
+2107-01-23T08:30:00
+2107-01-23T09:30:00
+2107-01-30T08:30:00
+2107-01-30T09:30:00
+2109-01-06T08:30:00
+2109-01-06T09:30:00
+2109-01-13T08:30:00
+2109-01-13T09:30:00
+2109-01-20T08:30:00
+2109-01-20T09:30:00
+2109-01-27T08:30:00
+2109-01-27T09:30:00
+2111-01-04T08:30:00
+2111-01-04T09:30:00
+2111-01-11T08:30:00
+2111-01-11T09:30:00
+2111-01-18T08:30:00
+2111-01-18T09:30:00
+2111-01-25T08:30:00
+2111-01-25T09:30:00
+2113-01-01T08:30:00
+2113-01-01T09:30:00
+2113-01-08T08:30:00
+2113-01-08T09:30:00
+2113-01-15T08:30:00
+2113-01-15T09:30:00
+2113-01-22T08:30:00
+2113-01-22T09:30:00
+2113-01-29T08:30:00
+2113-01-29T09:30:00
+2115-01-06T08:30:00
+2115-01-06T09:30:00
+2115-01-13T08:30:00
+2115-01-13T09:30:00
+2115-01-20T08:30:00
+2115-01-20T09:30:00
+2115-01-27T08:30:00
+2115-01-27T09:30:00
+2117-01-03T08:30:00
+2117-01-03T09:30:00
+2117-01-10T08:30:00
+2117-01-10T09:30:00
+2117-01-17T08:30:00
+2117-01-17T09:30:00
+2117-01-24T08:30:00
+2117-01-24T09:30:00
+2117-01-31T08:30:00
+2117-01-31T09:30:00
+2119-01-01T08:30:00
+2119-01-01T09:30:00
+2119-01-08T08:30:00
+2119-01-08T09:30:00
+2119-01-15T08:30:00
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/test1.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/unsorted/test1.ics.prev.ref
new file mode 100644
index 00000000..eceaa95f
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/test1.ics.prev.ref
@@ -0,0 +1,18 @@
+2009-01-25T09:30:00
+2009-01-25T08:30:00
+2009-01-18T09:30:00
+2009-01-18T08:30:00
+2009-01-11T09:30:00
+2009-01-11T08:30:00
+2009-01-04T09:30:00
+2009-01-04T08:30:00
+2007-01-28T09:30:00
+2007-01-28T08:30:00
+2007-01-21T09:30:00
+2007-01-21T08:30:00
+2007-01-14T09:30:00
+2007-01-14T08:30:00
+2007-01-07T09:30:00
+2007-01-07T08:30:00
+2005-05-12T03:15:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/test1.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/unsorted/test1.ics.recurson.ref
new file mode 100644
index 00000000..71cfa3b6
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/test1.ics.recurson.ref
@@ -0,0 +1,9 @@
+2005-05-12
+2007-01-07
+2007-01-14
+2007-01-21
+2007-01-28
+2009-01-04
+2009-01-11
+2009-01-18
+2009-01-25
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/weekly.ics b/libkcal/tests/data/RecurrenceRule/unsorted/weekly.ics
new file mode 100644
index 00000000..3e4093b7
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/weekly.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+VERSION:2.0
+PRODID:-//MH Software Inc//Connect Daily - 3.0.7//EN
+X-LibKCal-Testsuite-OutTZ:UTC
+
+BEGIN:VEVENT
+UID:1214@67.154.139.115
+SUMMARY:Every other week, Mo and We, starting 12.5.2005, 03:15:00Z
+DTSTART:20050512T031500Z
+RRULE:FREQ=WEEKLY;INTERVAL=2;BYDAY=MO,WE
+DURATION:PT5H
+END:VEVENT
+
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/weekly.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/unsorted/weekly.ics.comp34.ref
new file mode 100644
index 00000000..2c99f999
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/weekly.ics.comp34.ref
@@ -0,0 +1,500 @@
+2005-05-12T03:15:00
+2005-05-23T03:15:00
+2005-05-25T03:15:00
+2005-06-06T03:15:00
+2005-06-08T03:15:00
+2005-06-20T03:15:00
+2005-06-22T03:15:00
+2005-07-04T03:15:00
+2005-07-06T03:15:00
+2005-07-18T03:15:00
+2005-07-20T03:15:00
+2005-08-01T03:15:00
+2005-08-03T03:15:00
+2005-08-15T03:15:00
+2005-08-17T03:15:00
+2005-08-29T03:15:00
+2005-08-31T03:15:00
+2005-09-12T03:15:00
+2005-09-14T03:15:00
+2005-09-26T03:15:00
+2005-09-28T03:15:00
+2005-10-10T03:15:00
+2005-10-12T03:15:00
+2005-10-24T03:15:00
+2005-10-26T03:15:00
+2005-11-07T03:15:00
+2005-11-09T03:15:00
+2005-11-21T03:15:00
+2005-11-23T03:15:00
+2005-12-05T03:15:00
+2005-12-07T03:15:00
+2005-12-19T03:15:00
+2005-12-21T03:15:00
+2006-01-02T03:15:00
+2006-01-04T03:15:00
+2006-01-16T03:15:00
+2006-01-18T03:15:00
+2006-01-30T03:15:00
+2006-02-01T03:15:00
+2006-02-13T03:15:00
+2006-02-15T03:15:00
+2006-02-27T03:15:00
+2006-03-01T03:15:00
+2006-03-13T03:15:00
+2006-03-15T03:15:00
+2006-03-27T03:15:00
+2006-03-29T03:15:00
+2006-04-10T03:15:00
+2006-04-12T03:15:00
+2006-04-24T03:15:00
+2006-04-26T03:15:00
+2006-05-08T03:15:00
+2006-05-10T03:15:00
+2006-05-22T03:15:00
+2006-05-24T03:15:00
+2006-06-05T03:15:00
+2006-06-07T03:15:00
+2006-06-19T03:15:00
+2006-06-21T03:15:00
+2006-07-03T03:15:00
+2006-07-05T03:15:00
+2006-07-17T03:15:00
+2006-07-19T03:15:00
+2006-07-31T03:15:00
+2006-08-02T03:15:00
+2006-08-14T03:15:00
+2006-08-16T03:15:00
+2006-08-28T03:15:00
+2006-08-30T03:15:00
+2006-09-11T03:15:00
+2006-09-13T03:15:00
+2006-09-25T03:15:00
+2006-09-27T03:15:00
+2006-10-09T03:15:00
+2006-10-11T03:15:00
+2006-10-23T03:15:00
+2006-10-25T03:15:00
+2006-11-06T03:15:00
+2006-11-08T03:15:00
+2006-11-20T03:15:00
+2006-11-22T03:15:00
+2006-12-04T03:15:00
+2006-12-06T03:15:00
+2006-12-18T03:15:00
+2006-12-20T03:15:00
+2007-01-01T03:15:00
+2007-01-03T03:15:00
+2007-01-15T03:15:00
+2007-01-17T03:15:00
+2007-01-29T03:15:00
+2007-01-31T03:15:00
+2007-02-12T03:15:00
+2007-02-14T03:15:00
+2007-02-26T03:15:00
+2007-02-28T03:15:00
+2007-03-12T03:15:00
+2007-03-14T03:15:00
+2007-03-26T03:15:00
+2007-03-28T03:15:00
+2007-04-09T03:15:00
+2007-04-11T03:15:00
+2007-04-23T03:15:00
+2007-04-25T03:15:00
+2007-05-07T03:15:00
+2007-05-09T03:15:00
+2007-05-21T03:15:00
+2007-05-23T03:15:00
+2007-06-04T03:15:00
+2007-06-06T03:15:00
+2007-06-18T03:15:00
+2007-06-20T03:15:00
+2007-07-02T03:15:00
+2007-07-04T03:15:00
+2007-07-16T03:15:00
+2007-07-18T03:15:00
+2007-07-30T03:15:00
+2007-08-01T03:15:00
+2007-08-13T03:15:00
+2007-08-15T03:15:00
+2007-08-27T03:15:00
+2007-08-29T03:15:00
+2007-09-10T03:15:00
+2007-09-12T03:15:00
+2007-09-24T03:15:00
+2007-09-26T03:15:00
+2007-10-08T03:15:00
+2007-10-10T03:15:00
+2007-10-22T03:15:00
+2007-10-24T03:15:00
+2007-11-05T03:15:00
+2007-11-07T03:15:00
+2007-11-19T03:15:00
+2007-11-21T03:15:00
+2007-12-03T03:15:00
+2007-12-05T03:15:00
+2007-12-17T03:15:00
+2007-12-19T03:15:00
+2007-12-31T03:15:00
+2008-01-02T03:15:00
+2008-01-14T03:15:00
+2008-01-16T03:15:00
+2008-01-28T03:15:00
+2008-01-30T03:15:00
+2008-02-11T03:15:00
+2008-02-13T03:15:00
+2008-02-25T03:15:00
+2008-02-27T03:15:00
+2008-03-10T03:15:00
+2008-03-12T03:15:00
+2008-03-24T03:15:00
+2008-03-26T03:15:00
+2008-04-07T03:15:00
+2008-04-09T03:15:00
+2008-04-21T03:15:00
+2008-04-23T03:15:00
+2008-05-05T03:15:00
+2008-05-07T03:15:00
+2008-05-19T03:15:00
+2008-05-21T03:15:00
+2008-06-02T03:15:00
+2008-06-04T03:15:00
+2008-06-16T03:15:00
+2008-06-18T03:15:00
+2008-06-30T03:15:00
+2008-07-02T03:15:00
+2008-07-14T03:15:00
+2008-07-16T03:15:00
+2008-07-28T03:15:00
+2008-07-30T03:15:00
+2008-08-11T03:15:00
+2008-08-13T03:15:00
+2008-08-25T03:15:00
+2008-08-27T03:15:00
+2008-09-08T03:15:00
+2008-09-10T03:15:00
+2008-09-22T03:15:00
+2008-09-24T03:15:00
+2008-10-06T03:15:00
+2008-10-08T03:15:00
+2008-10-20T03:15:00
+2008-10-22T03:15:00
+2008-11-03T03:15:00
+2008-11-05T03:15:00
+2008-11-17T03:15:00
+2008-11-19T03:15:00
+2008-12-01T03:15:00
+2008-12-03T03:15:00
+2008-12-15T03:15:00
+2008-12-17T03:15:00
+2008-12-29T03:15:00
+2008-12-31T03:15:00
+2009-01-12T03:15:00
+2009-01-14T03:15:00
+2009-01-26T03:15:00
+2009-01-28T03:15:00
+2009-02-09T03:15:00
+2009-02-11T03:15:00
+2009-02-23T03:15:00
+2009-02-25T03:15:00
+2009-03-09T03:15:00
+2009-03-11T03:15:00
+2009-03-23T03:15:00
+2009-03-25T03:15:00
+2009-04-06T03:15:00
+2009-04-08T03:15:00
+2009-04-20T03:15:00
+2009-04-22T03:15:00
+2009-05-04T03:15:00
+2009-05-06T03:15:00
+2009-05-18T03:15:00
+2009-05-20T03:15:00
+2009-06-01T03:15:00
+2009-06-03T03:15:00
+2009-06-15T03:15:00
+2009-06-17T03:15:00
+2009-06-29T03:15:00
+2009-07-01T03:15:00
+2009-07-13T03:15:00
+2009-07-15T03:15:00
+2009-07-27T03:15:00
+2009-07-29T03:15:00
+2009-08-10T03:15:00
+2009-08-12T03:15:00
+2009-08-24T03:15:00
+2009-08-26T03:15:00
+2009-09-07T03:15:00
+2009-09-09T03:15:00
+2009-09-21T03:15:00
+2009-09-23T03:15:00
+2009-10-05T03:15:00
+2009-10-07T03:15:00
+2009-10-19T03:15:00
+2009-10-21T03:15:00
+2009-11-02T03:15:00
+2009-11-04T03:15:00
+2009-11-16T03:15:00
+2009-11-18T03:15:00
+2009-11-30T03:15:00
+2009-12-02T03:15:00
+2009-12-14T03:15:00
+2009-12-16T03:15:00
+2009-12-28T03:15:00
+2009-12-30T03:15:00
+2010-01-11T03:15:00
+2010-01-13T03:15:00
+2010-01-25T03:15:00
+2010-01-27T03:15:00
+2010-02-08T03:15:00
+2010-02-10T03:15:00
+2010-02-22T03:15:00
+2010-02-24T03:15:00
+2010-03-08T03:15:00
+2010-03-10T03:15:00
+2010-03-22T03:15:00
+2010-03-24T03:15:00
+2010-04-05T03:15:00
+2010-04-07T03:15:00
+2010-04-19T03:15:00
+2010-04-21T03:15:00
+2010-05-03T03:15:00
+2010-05-05T03:15:00
+2010-05-17T03:15:00
+2010-05-19T03:15:00
+2010-05-31T03:15:00
+2010-06-02T03:15:00
+2010-06-14T03:15:00
+2010-06-16T03:15:00
+2010-06-28T03:15:00
+2010-06-30T03:15:00
+2010-07-12T03:15:00
+2010-07-14T03:15:00
+2010-07-26T03:15:00
+2010-07-28T03:15:00
+2010-08-09T03:15:00
+2010-08-11T03:15:00
+2010-08-23T03:15:00
+2010-08-25T03:15:00
+2010-09-06T03:15:00
+2010-09-08T03:15:00
+2010-09-20T03:15:00
+2010-09-22T03:15:00
+2010-10-04T03:15:00
+2010-10-06T03:15:00
+2010-10-18T03:15:00
+2010-10-20T03:15:00
+2010-11-01T03:15:00
+2010-11-03T03:15:00
+2010-11-15T03:15:00
+2010-11-17T03:15:00
+2010-11-29T03:15:00
+2010-12-01T03:15:00
+2010-12-13T03:15:00
+2010-12-15T03:15:00
+2010-12-27T03:15:00
+2010-12-29T03:15:00
+2011-01-10T03:15:00
+2011-01-12T03:15:00
+2011-01-24T03:15:00
+2011-01-26T03:15:00
+2011-02-07T03:15:00
+2011-02-09T03:15:00
+2011-02-21T03:15:00
+2011-02-23T03:15:00
+2011-03-07T03:15:00
+2011-03-09T03:15:00
+2011-03-21T03:15:00
+2011-03-23T03:15:00
+2011-04-04T03:15:00
+2011-04-06T03:15:00
+2011-04-18T03:15:00
+2011-04-20T03:15:00
+2011-05-02T03:15:00
+2011-05-04T03:15:00
+2011-05-16T03:15:00
+2011-05-18T03:15:00
+2011-05-30T03:15:00
+2011-06-01T03:15:00
+2011-06-13T03:15:00
+2011-06-15T03:15:00
+2011-06-27T03:15:00
+2011-06-29T03:15:00
+2011-07-11T03:15:00
+2011-07-13T03:15:00
+2011-07-25T03:15:00
+2011-07-27T03:15:00
+2011-08-08T03:15:00
+2011-08-10T03:15:00
+2011-08-22T03:15:00
+2011-08-24T03:15:00
+2011-09-05T03:15:00
+2011-09-07T03:15:00
+2011-09-19T03:15:00
+2011-09-21T03:15:00
+2011-10-03T03:15:00
+2011-10-05T03:15:00
+2011-10-17T03:15:00
+2011-10-19T03:15:00
+2011-10-31T03:15:00
+2011-11-02T03:15:00
+2011-11-14T03:15:00
+2011-11-16T03:15:00
+2011-11-28T03:15:00
+2011-11-30T03:15:00
+2011-12-12T03:15:00
+2011-12-14T03:15:00
+2011-12-26T03:15:00
+2011-12-28T03:15:00
+2012-01-09T03:15:00
+2012-01-11T03:15:00
+2012-01-23T03:15:00
+2012-01-25T03:15:00
+2012-02-06T03:15:00
+2012-02-08T03:15:00
+2012-02-20T03:15:00
+2012-02-22T03:15:00
+2012-03-05T03:15:00
+2012-03-07T03:15:00
+2012-03-19T03:15:00
+2012-03-21T03:15:00
+2012-04-02T03:15:00
+2012-04-04T03:15:00
+2012-04-16T03:15:00
+2012-04-18T03:15:00
+2012-04-30T03:15:00
+2012-05-02T03:15:00
+2012-05-14T03:15:00
+2012-05-16T03:15:00
+2012-05-28T03:15:00
+2012-05-30T03:15:00
+2012-06-11T03:15:00
+2012-06-13T03:15:00
+2012-06-25T03:15:00
+2012-06-27T03:15:00
+2012-07-09T03:15:00
+2012-07-11T03:15:00
+2012-07-23T03:15:00
+2012-07-25T03:15:00
+2012-08-06T03:15:00
+2012-08-08T03:15:00
+2012-08-20T03:15:00
+2012-08-22T03:15:00
+2012-09-03T03:15:00
+2012-09-05T03:15:00
+2012-09-17T03:15:00
+2012-09-19T03:15:00
+2012-10-01T03:15:00
+2012-10-03T03:15:00
+2012-10-15T03:15:00
+2012-10-17T03:15:00
+2012-10-29T03:15:00
+2012-10-31T03:15:00
+2012-11-12T03:15:00
+2012-11-14T03:15:00
+2012-11-26T03:15:00
+2012-11-28T03:15:00
+2012-12-10T03:15:00
+2012-12-12T03:15:00
+2012-12-24T03:15:00
+2012-12-26T03:15:00
+2013-01-07T03:15:00
+2013-01-09T03:15:00
+2013-01-21T03:15:00
+2013-01-23T03:15:00
+2013-02-04T03:15:00
+2013-02-06T03:15:00
+2013-02-18T03:15:00
+2013-02-20T03:15:00
+2013-03-04T03:15:00
+2013-03-06T03:15:00
+2013-03-18T03:15:00
+2013-03-20T03:15:00
+2013-04-01T03:15:00
+2013-04-03T03:15:00
+2013-04-15T03:15:00
+2013-04-17T03:15:00
+2013-04-29T03:15:00
+2013-05-01T03:15:00
+2013-05-13T03:15:00
+2013-05-15T03:15:00
+2013-05-27T03:15:00
+2013-05-29T03:15:00
+2013-06-10T03:15:00
+2013-06-12T03:15:00
+2013-06-24T03:15:00
+2013-06-26T03:15:00
+2013-07-08T03:15:00
+2013-07-10T03:15:00
+2013-07-22T03:15:00
+2013-07-24T03:15:00
+2013-08-05T03:15:00
+2013-08-07T03:15:00
+2013-08-19T03:15:00
+2013-08-21T03:15:00
+2013-09-02T03:15:00
+2013-09-04T03:15:00
+2013-09-16T03:15:00
+2013-09-18T03:15:00
+2013-09-30T03:15:00
+2013-10-02T03:15:00
+2013-10-14T03:15:00
+2013-10-16T03:15:00
+2013-10-28T03:15:00
+2013-10-30T03:15:00
+2013-11-11T03:15:00
+2013-11-13T03:15:00
+2013-11-25T03:15:00
+2013-11-27T03:15:00
+2013-12-09T03:15:00
+2013-12-11T03:15:00
+2013-12-23T03:15:00
+2013-12-25T03:15:00
+2014-01-06T03:15:00
+2014-01-08T03:15:00
+2014-01-20T03:15:00
+2014-01-22T03:15:00
+2014-02-03T03:15:00
+2014-02-05T03:15:00
+2014-02-17T03:15:00
+2014-02-19T03:15:00
+2014-03-03T03:15:00
+2014-03-05T03:15:00
+2014-03-17T03:15:00
+2014-03-19T03:15:00
+2014-03-31T03:15:00
+2014-04-02T03:15:00
+2014-04-14T03:15:00
+2014-04-16T03:15:00
+2014-04-28T03:15:00
+2014-04-30T03:15:00
+2014-05-12T03:15:00
+2014-05-14T03:15:00
+2014-05-26T03:15:00
+2014-05-28T03:15:00
+2014-06-09T03:15:00
+2014-06-11T03:15:00
+2014-06-23T03:15:00
+2014-06-25T03:15:00
+2014-07-07T03:15:00
+2014-07-09T03:15:00
+2014-07-21T03:15:00
+2014-07-23T03:15:00
+2014-08-04T03:15:00
+2014-08-06T03:15:00
+2014-08-18T03:15:00
+2014-08-20T03:15:00
+2014-09-01T03:15:00
+2014-09-03T03:15:00
+2014-09-15T03:15:00
+2014-09-17T03:15:00
+2014-09-29T03:15:00
+2014-10-01T03:15:00
+2014-10-13T03:15:00
+2014-10-15T03:15:00
+2014-10-27T03:15:00
+2014-10-29T03:15:00
+2014-11-10T03:15:00
+2014-11-12T03:15:00
+2014-11-24T03:15:00
+2014-11-26T03:15:00
+2014-12-08T03:15:00
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/weekly.ics.next.ref b/libkcal/tests/data/RecurrenceRule/unsorted/weekly.ics.next.ref
new file mode 100644
index 00000000..2c99f999
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/weekly.ics.next.ref
@@ -0,0 +1,500 @@
+2005-05-12T03:15:00
+2005-05-23T03:15:00
+2005-05-25T03:15:00
+2005-06-06T03:15:00
+2005-06-08T03:15:00
+2005-06-20T03:15:00
+2005-06-22T03:15:00
+2005-07-04T03:15:00
+2005-07-06T03:15:00
+2005-07-18T03:15:00
+2005-07-20T03:15:00
+2005-08-01T03:15:00
+2005-08-03T03:15:00
+2005-08-15T03:15:00
+2005-08-17T03:15:00
+2005-08-29T03:15:00
+2005-08-31T03:15:00
+2005-09-12T03:15:00
+2005-09-14T03:15:00
+2005-09-26T03:15:00
+2005-09-28T03:15:00
+2005-10-10T03:15:00
+2005-10-12T03:15:00
+2005-10-24T03:15:00
+2005-10-26T03:15:00
+2005-11-07T03:15:00
+2005-11-09T03:15:00
+2005-11-21T03:15:00
+2005-11-23T03:15:00
+2005-12-05T03:15:00
+2005-12-07T03:15:00
+2005-12-19T03:15:00
+2005-12-21T03:15:00
+2006-01-02T03:15:00
+2006-01-04T03:15:00
+2006-01-16T03:15:00
+2006-01-18T03:15:00
+2006-01-30T03:15:00
+2006-02-01T03:15:00
+2006-02-13T03:15:00
+2006-02-15T03:15:00
+2006-02-27T03:15:00
+2006-03-01T03:15:00
+2006-03-13T03:15:00
+2006-03-15T03:15:00
+2006-03-27T03:15:00
+2006-03-29T03:15:00
+2006-04-10T03:15:00
+2006-04-12T03:15:00
+2006-04-24T03:15:00
+2006-04-26T03:15:00
+2006-05-08T03:15:00
+2006-05-10T03:15:00
+2006-05-22T03:15:00
+2006-05-24T03:15:00
+2006-06-05T03:15:00
+2006-06-07T03:15:00
+2006-06-19T03:15:00
+2006-06-21T03:15:00
+2006-07-03T03:15:00
+2006-07-05T03:15:00
+2006-07-17T03:15:00
+2006-07-19T03:15:00
+2006-07-31T03:15:00
+2006-08-02T03:15:00
+2006-08-14T03:15:00
+2006-08-16T03:15:00
+2006-08-28T03:15:00
+2006-08-30T03:15:00
+2006-09-11T03:15:00
+2006-09-13T03:15:00
+2006-09-25T03:15:00
+2006-09-27T03:15:00
+2006-10-09T03:15:00
+2006-10-11T03:15:00
+2006-10-23T03:15:00
+2006-10-25T03:15:00
+2006-11-06T03:15:00
+2006-11-08T03:15:00
+2006-11-20T03:15:00
+2006-11-22T03:15:00
+2006-12-04T03:15:00
+2006-12-06T03:15:00
+2006-12-18T03:15:00
+2006-12-20T03:15:00
+2007-01-01T03:15:00
+2007-01-03T03:15:00
+2007-01-15T03:15:00
+2007-01-17T03:15:00
+2007-01-29T03:15:00
+2007-01-31T03:15:00
+2007-02-12T03:15:00
+2007-02-14T03:15:00
+2007-02-26T03:15:00
+2007-02-28T03:15:00
+2007-03-12T03:15:00
+2007-03-14T03:15:00
+2007-03-26T03:15:00
+2007-03-28T03:15:00
+2007-04-09T03:15:00
+2007-04-11T03:15:00
+2007-04-23T03:15:00
+2007-04-25T03:15:00
+2007-05-07T03:15:00
+2007-05-09T03:15:00
+2007-05-21T03:15:00
+2007-05-23T03:15:00
+2007-06-04T03:15:00
+2007-06-06T03:15:00
+2007-06-18T03:15:00
+2007-06-20T03:15:00
+2007-07-02T03:15:00
+2007-07-04T03:15:00
+2007-07-16T03:15:00
+2007-07-18T03:15:00
+2007-07-30T03:15:00
+2007-08-01T03:15:00
+2007-08-13T03:15:00
+2007-08-15T03:15:00
+2007-08-27T03:15:00
+2007-08-29T03:15:00
+2007-09-10T03:15:00
+2007-09-12T03:15:00
+2007-09-24T03:15:00
+2007-09-26T03:15:00
+2007-10-08T03:15:00
+2007-10-10T03:15:00
+2007-10-22T03:15:00
+2007-10-24T03:15:00
+2007-11-05T03:15:00
+2007-11-07T03:15:00
+2007-11-19T03:15:00
+2007-11-21T03:15:00
+2007-12-03T03:15:00
+2007-12-05T03:15:00
+2007-12-17T03:15:00
+2007-12-19T03:15:00
+2007-12-31T03:15:00
+2008-01-02T03:15:00
+2008-01-14T03:15:00
+2008-01-16T03:15:00
+2008-01-28T03:15:00
+2008-01-30T03:15:00
+2008-02-11T03:15:00
+2008-02-13T03:15:00
+2008-02-25T03:15:00
+2008-02-27T03:15:00
+2008-03-10T03:15:00
+2008-03-12T03:15:00
+2008-03-24T03:15:00
+2008-03-26T03:15:00
+2008-04-07T03:15:00
+2008-04-09T03:15:00
+2008-04-21T03:15:00
+2008-04-23T03:15:00
+2008-05-05T03:15:00
+2008-05-07T03:15:00
+2008-05-19T03:15:00
+2008-05-21T03:15:00
+2008-06-02T03:15:00
+2008-06-04T03:15:00
+2008-06-16T03:15:00
+2008-06-18T03:15:00
+2008-06-30T03:15:00
+2008-07-02T03:15:00
+2008-07-14T03:15:00
+2008-07-16T03:15:00
+2008-07-28T03:15:00
+2008-07-30T03:15:00
+2008-08-11T03:15:00
+2008-08-13T03:15:00
+2008-08-25T03:15:00
+2008-08-27T03:15:00
+2008-09-08T03:15:00
+2008-09-10T03:15:00
+2008-09-22T03:15:00
+2008-09-24T03:15:00
+2008-10-06T03:15:00
+2008-10-08T03:15:00
+2008-10-20T03:15:00
+2008-10-22T03:15:00
+2008-11-03T03:15:00
+2008-11-05T03:15:00
+2008-11-17T03:15:00
+2008-11-19T03:15:00
+2008-12-01T03:15:00
+2008-12-03T03:15:00
+2008-12-15T03:15:00
+2008-12-17T03:15:00
+2008-12-29T03:15:00
+2008-12-31T03:15:00
+2009-01-12T03:15:00
+2009-01-14T03:15:00
+2009-01-26T03:15:00
+2009-01-28T03:15:00
+2009-02-09T03:15:00
+2009-02-11T03:15:00
+2009-02-23T03:15:00
+2009-02-25T03:15:00
+2009-03-09T03:15:00
+2009-03-11T03:15:00
+2009-03-23T03:15:00
+2009-03-25T03:15:00
+2009-04-06T03:15:00
+2009-04-08T03:15:00
+2009-04-20T03:15:00
+2009-04-22T03:15:00
+2009-05-04T03:15:00
+2009-05-06T03:15:00
+2009-05-18T03:15:00
+2009-05-20T03:15:00
+2009-06-01T03:15:00
+2009-06-03T03:15:00
+2009-06-15T03:15:00
+2009-06-17T03:15:00
+2009-06-29T03:15:00
+2009-07-01T03:15:00
+2009-07-13T03:15:00
+2009-07-15T03:15:00
+2009-07-27T03:15:00
+2009-07-29T03:15:00
+2009-08-10T03:15:00
+2009-08-12T03:15:00
+2009-08-24T03:15:00
+2009-08-26T03:15:00
+2009-09-07T03:15:00
+2009-09-09T03:15:00
+2009-09-21T03:15:00
+2009-09-23T03:15:00
+2009-10-05T03:15:00
+2009-10-07T03:15:00
+2009-10-19T03:15:00
+2009-10-21T03:15:00
+2009-11-02T03:15:00
+2009-11-04T03:15:00
+2009-11-16T03:15:00
+2009-11-18T03:15:00
+2009-11-30T03:15:00
+2009-12-02T03:15:00
+2009-12-14T03:15:00
+2009-12-16T03:15:00
+2009-12-28T03:15:00
+2009-12-30T03:15:00
+2010-01-11T03:15:00
+2010-01-13T03:15:00
+2010-01-25T03:15:00
+2010-01-27T03:15:00
+2010-02-08T03:15:00
+2010-02-10T03:15:00
+2010-02-22T03:15:00
+2010-02-24T03:15:00
+2010-03-08T03:15:00
+2010-03-10T03:15:00
+2010-03-22T03:15:00
+2010-03-24T03:15:00
+2010-04-05T03:15:00
+2010-04-07T03:15:00
+2010-04-19T03:15:00
+2010-04-21T03:15:00
+2010-05-03T03:15:00
+2010-05-05T03:15:00
+2010-05-17T03:15:00
+2010-05-19T03:15:00
+2010-05-31T03:15:00
+2010-06-02T03:15:00
+2010-06-14T03:15:00
+2010-06-16T03:15:00
+2010-06-28T03:15:00
+2010-06-30T03:15:00
+2010-07-12T03:15:00
+2010-07-14T03:15:00
+2010-07-26T03:15:00
+2010-07-28T03:15:00
+2010-08-09T03:15:00
+2010-08-11T03:15:00
+2010-08-23T03:15:00
+2010-08-25T03:15:00
+2010-09-06T03:15:00
+2010-09-08T03:15:00
+2010-09-20T03:15:00
+2010-09-22T03:15:00
+2010-10-04T03:15:00
+2010-10-06T03:15:00
+2010-10-18T03:15:00
+2010-10-20T03:15:00
+2010-11-01T03:15:00
+2010-11-03T03:15:00
+2010-11-15T03:15:00
+2010-11-17T03:15:00
+2010-11-29T03:15:00
+2010-12-01T03:15:00
+2010-12-13T03:15:00
+2010-12-15T03:15:00
+2010-12-27T03:15:00
+2010-12-29T03:15:00
+2011-01-10T03:15:00
+2011-01-12T03:15:00
+2011-01-24T03:15:00
+2011-01-26T03:15:00
+2011-02-07T03:15:00
+2011-02-09T03:15:00
+2011-02-21T03:15:00
+2011-02-23T03:15:00
+2011-03-07T03:15:00
+2011-03-09T03:15:00
+2011-03-21T03:15:00
+2011-03-23T03:15:00
+2011-04-04T03:15:00
+2011-04-06T03:15:00
+2011-04-18T03:15:00
+2011-04-20T03:15:00
+2011-05-02T03:15:00
+2011-05-04T03:15:00
+2011-05-16T03:15:00
+2011-05-18T03:15:00
+2011-05-30T03:15:00
+2011-06-01T03:15:00
+2011-06-13T03:15:00
+2011-06-15T03:15:00
+2011-06-27T03:15:00
+2011-06-29T03:15:00
+2011-07-11T03:15:00
+2011-07-13T03:15:00
+2011-07-25T03:15:00
+2011-07-27T03:15:00
+2011-08-08T03:15:00
+2011-08-10T03:15:00
+2011-08-22T03:15:00
+2011-08-24T03:15:00
+2011-09-05T03:15:00
+2011-09-07T03:15:00
+2011-09-19T03:15:00
+2011-09-21T03:15:00
+2011-10-03T03:15:00
+2011-10-05T03:15:00
+2011-10-17T03:15:00
+2011-10-19T03:15:00
+2011-10-31T03:15:00
+2011-11-02T03:15:00
+2011-11-14T03:15:00
+2011-11-16T03:15:00
+2011-11-28T03:15:00
+2011-11-30T03:15:00
+2011-12-12T03:15:00
+2011-12-14T03:15:00
+2011-12-26T03:15:00
+2011-12-28T03:15:00
+2012-01-09T03:15:00
+2012-01-11T03:15:00
+2012-01-23T03:15:00
+2012-01-25T03:15:00
+2012-02-06T03:15:00
+2012-02-08T03:15:00
+2012-02-20T03:15:00
+2012-02-22T03:15:00
+2012-03-05T03:15:00
+2012-03-07T03:15:00
+2012-03-19T03:15:00
+2012-03-21T03:15:00
+2012-04-02T03:15:00
+2012-04-04T03:15:00
+2012-04-16T03:15:00
+2012-04-18T03:15:00
+2012-04-30T03:15:00
+2012-05-02T03:15:00
+2012-05-14T03:15:00
+2012-05-16T03:15:00
+2012-05-28T03:15:00
+2012-05-30T03:15:00
+2012-06-11T03:15:00
+2012-06-13T03:15:00
+2012-06-25T03:15:00
+2012-06-27T03:15:00
+2012-07-09T03:15:00
+2012-07-11T03:15:00
+2012-07-23T03:15:00
+2012-07-25T03:15:00
+2012-08-06T03:15:00
+2012-08-08T03:15:00
+2012-08-20T03:15:00
+2012-08-22T03:15:00
+2012-09-03T03:15:00
+2012-09-05T03:15:00
+2012-09-17T03:15:00
+2012-09-19T03:15:00
+2012-10-01T03:15:00
+2012-10-03T03:15:00
+2012-10-15T03:15:00
+2012-10-17T03:15:00
+2012-10-29T03:15:00
+2012-10-31T03:15:00
+2012-11-12T03:15:00
+2012-11-14T03:15:00
+2012-11-26T03:15:00
+2012-11-28T03:15:00
+2012-12-10T03:15:00
+2012-12-12T03:15:00
+2012-12-24T03:15:00
+2012-12-26T03:15:00
+2013-01-07T03:15:00
+2013-01-09T03:15:00
+2013-01-21T03:15:00
+2013-01-23T03:15:00
+2013-02-04T03:15:00
+2013-02-06T03:15:00
+2013-02-18T03:15:00
+2013-02-20T03:15:00
+2013-03-04T03:15:00
+2013-03-06T03:15:00
+2013-03-18T03:15:00
+2013-03-20T03:15:00
+2013-04-01T03:15:00
+2013-04-03T03:15:00
+2013-04-15T03:15:00
+2013-04-17T03:15:00
+2013-04-29T03:15:00
+2013-05-01T03:15:00
+2013-05-13T03:15:00
+2013-05-15T03:15:00
+2013-05-27T03:15:00
+2013-05-29T03:15:00
+2013-06-10T03:15:00
+2013-06-12T03:15:00
+2013-06-24T03:15:00
+2013-06-26T03:15:00
+2013-07-08T03:15:00
+2013-07-10T03:15:00
+2013-07-22T03:15:00
+2013-07-24T03:15:00
+2013-08-05T03:15:00
+2013-08-07T03:15:00
+2013-08-19T03:15:00
+2013-08-21T03:15:00
+2013-09-02T03:15:00
+2013-09-04T03:15:00
+2013-09-16T03:15:00
+2013-09-18T03:15:00
+2013-09-30T03:15:00
+2013-10-02T03:15:00
+2013-10-14T03:15:00
+2013-10-16T03:15:00
+2013-10-28T03:15:00
+2013-10-30T03:15:00
+2013-11-11T03:15:00
+2013-11-13T03:15:00
+2013-11-25T03:15:00
+2013-11-27T03:15:00
+2013-12-09T03:15:00
+2013-12-11T03:15:00
+2013-12-23T03:15:00
+2013-12-25T03:15:00
+2014-01-06T03:15:00
+2014-01-08T03:15:00
+2014-01-20T03:15:00
+2014-01-22T03:15:00
+2014-02-03T03:15:00
+2014-02-05T03:15:00
+2014-02-17T03:15:00
+2014-02-19T03:15:00
+2014-03-03T03:15:00
+2014-03-05T03:15:00
+2014-03-17T03:15:00
+2014-03-19T03:15:00
+2014-03-31T03:15:00
+2014-04-02T03:15:00
+2014-04-14T03:15:00
+2014-04-16T03:15:00
+2014-04-28T03:15:00
+2014-04-30T03:15:00
+2014-05-12T03:15:00
+2014-05-14T03:15:00
+2014-05-26T03:15:00
+2014-05-28T03:15:00
+2014-06-09T03:15:00
+2014-06-11T03:15:00
+2014-06-23T03:15:00
+2014-06-25T03:15:00
+2014-07-07T03:15:00
+2014-07-09T03:15:00
+2014-07-21T03:15:00
+2014-07-23T03:15:00
+2014-08-04T03:15:00
+2014-08-06T03:15:00
+2014-08-18T03:15:00
+2014-08-20T03:15:00
+2014-09-01T03:15:00
+2014-09-03T03:15:00
+2014-09-15T03:15:00
+2014-09-17T03:15:00
+2014-09-29T03:15:00
+2014-10-01T03:15:00
+2014-10-13T03:15:00
+2014-10-15T03:15:00
+2014-10-27T03:15:00
+2014-10-29T03:15:00
+2014-11-10T03:15:00
+2014-11-12T03:15:00
+2014-11-24T03:15:00
+2014-11-26T03:15:00
+2014-12-08T03:15:00
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/weekly.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/unsorted/weekly.ics.prev.ref
new file mode 100644
index 00000000..4fb9b82c
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/weekly.ics.prev.ref
@@ -0,0 +1,296 @@
+2010-12-29T03:15:00
+2010-12-27T03:15:00
+2010-12-15T03:15:00
+2010-12-13T03:15:00
+2010-12-01T03:15:00
+2010-11-29T03:15:00
+2010-11-17T03:15:00
+2010-11-15T03:15:00
+2010-11-03T03:15:00
+2010-11-01T03:15:00
+2010-10-20T03:15:00
+2010-10-18T03:15:00
+2010-10-06T03:15:00
+2010-10-04T03:15:00
+2010-09-22T03:15:00
+2010-09-20T03:15:00
+2010-09-08T03:15:00
+2010-09-06T03:15:00
+2010-08-25T03:15:00
+2010-08-23T03:15:00
+2010-08-11T03:15:00
+2010-08-09T03:15:00
+2010-07-28T03:15:00
+2010-07-26T03:15:00
+2010-07-14T03:15:00
+2010-07-12T03:15:00
+2010-06-30T03:15:00
+2010-06-28T03:15:00
+2010-06-16T03:15:00
+2010-06-14T03:15:00
+2010-06-02T03:15:00
+2010-05-31T03:15:00
+2010-05-19T03:15:00
+2010-05-17T03:15:00
+2010-05-05T03:15:00
+2010-05-03T03:15:00
+2010-04-21T03:15:00
+2010-04-19T03:15:00
+2010-04-07T03:15:00
+2010-04-05T03:15:00
+2010-03-24T03:15:00
+2010-03-22T03:15:00
+2010-03-10T03:15:00
+2010-03-08T03:15:00
+2010-02-24T03:15:00
+2010-02-22T03:15:00
+2010-02-10T03:15:00
+2010-02-08T03:15:00
+2010-01-27T03:15:00
+2010-01-25T03:15:00
+2010-01-13T03:15:00
+2010-01-11T03:15:00
+2009-12-30T03:15:00
+2009-12-28T03:15:00
+2009-12-16T03:15:00
+2009-12-14T03:15:00
+2009-12-02T03:15:00
+2009-11-30T03:15:00
+2009-11-18T03:15:00
+2009-11-16T03:15:00
+2009-11-04T03:15:00
+2009-11-02T03:15:00
+2009-10-21T03:15:00
+2009-10-19T03:15:00
+2009-10-07T03:15:00
+2009-10-05T03:15:00
+2009-09-23T03:15:00
+2009-09-21T03:15:00
+2009-09-09T03:15:00
+2009-09-07T03:15:00
+2009-08-26T03:15:00
+2009-08-24T03:15:00
+2009-08-12T03:15:00
+2009-08-10T03:15:00
+2009-07-29T03:15:00
+2009-07-27T03:15:00
+2009-07-15T03:15:00
+2009-07-13T03:15:00
+2009-07-01T03:15:00
+2009-06-29T03:15:00
+2009-06-17T03:15:00
+2009-06-15T03:15:00
+2009-06-03T03:15:00
+2009-06-01T03:15:00
+2009-05-20T03:15:00
+2009-05-18T03:15:00
+2009-05-06T03:15:00
+2009-05-04T03:15:00
+2009-04-22T03:15:00
+2009-04-20T03:15:00
+2009-04-08T03:15:00
+2009-04-06T03:15:00
+2009-03-25T03:15:00
+2009-03-23T03:15:00
+2009-03-11T03:15:00
+2009-03-09T03:15:00
+2009-02-25T03:15:00
+2009-02-23T03:15:00
+2009-02-11T03:15:00
+2009-02-09T03:15:00
+2009-01-28T03:15:00
+2009-01-26T03:15:00
+2009-01-14T03:15:00
+2009-01-12T03:15:00
+2008-12-31T03:15:00
+2008-12-29T03:15:00
+2008-12-17T03:15:00
+2008-12-15T03:15:00
+2008-12-03T03:15:00
+2008-12-01T03:15:00
+2008-11-19T03:15:00
+2008-11-17T03:15:00
+2008-11-05T03:15:00
+2008-11-03T03:15:00
+2008-10-22T03:15:00
+2008-10-20T03:15:00
+2008-10-08T03:15:00
+2008-10-06T03:15:00
+2008-09-24T03:15:00
+2008-09-22T03:15:00
+2008-09-10T03:15:00
+2008-09-08T03:15:00
+2008-08-27T03:15:00
+2008-08-25T03:15:00
+2008-08-13T03:15:00
+2008-08-11T03:15:00
+2008-07-30T03:15:00
+2008-07-28T03:15:00
+2008-07-16T03:15:00
+2008-07-14T03:15:00
+2008-07-02T03:15:00
+2008-06-30T03:15:00
+2008-06-18T03:15:00
+2008-06-16T03:15:00
+2008-06-04T03:15:00
+2008-06-02T03:15:00
+2008-05-21T03:15:00
+2008-05-19T03:15:00
+2008-05-07T03:15:00
+2008-05-05T03:15:00
+2008-04-23T03:15:00
+2008-04-21T03:15:00
+2008-04-09T03:15:00
+2008-04-07T03:15:00
+2008-03-26T03:15:00
+2008-03-24T03:15:00
+2008-03-12T03:15:00
+2008-03-10T03:15:00
+2008-02-27T03:15:00
+2008-02-25T03:15:00
+2008-02-13T03:15:00
+2008-02-11T03:15:00
+2008-01-30T03:15:00
+2008-01-28T03:15:00
+2008-01-16T03:15:00
+2008-01-14T03:15:00
+2008-01-02T03:15:00
+2007-12-31T03:15:00
+2007-12-19T03:15:00
+2007-12-17T03:15:00
+2007-12-05T03:15:00
+2007-12-03T03:15:00
+2007-11-21T03:15:00
+2007-11-19T03:15:00
+2007-11-07T03:15:00
+2007-11-05T03:15:00
+2007-10-24T03:15:00
+2007-10-22T03:15:00
+2007-10-10T03:15:00
+2007-10-08T03:15:00
+2007-09-26T03:15:00
+2007-09-24T03:15:00
+2007-09-12T03:15:00
+2007-09-10T03:15:00
+2007-08-29T03:15:00
+2007-08-27T03:15:00
+2007-08-15T03:15:00
+2007-08-13T03:15:00
+2007-08-01T03:15:00
+2007-07-30T03:15:00
+2007-07-18T03:15:00
+2007-07-16T03:15:00
+2007-07-04T03:15:00
+2007-07-02T03:15:00
+2007-06-20T03:15:00
+2007-06-18T03:15:00
+2007-06-06T03:15:00
+2007-06-04T03:15:00
+2007-05-23T03:15:00
+2007-05-21T03:15:00
+2007-05-09T03:15:00
+2007-05-07T03:15:00
+2007-04-25T03:15:00
+2007-04-23T03:15:00
+2007-04-11T03:15:00
+2007-04-09T03:15:00
+2007-03-28T03:15:00
+2007-03-26T03:15:00
+2007-03-14T03:15:00
+2007-03-12T03:15:00
+2007-02-28T03:15:00
+2007-02-26T03:15:00
+2007-02-14T03:15:00
+2007-02-12T03:15:00
+2007-01-31T03:15:00
+2007-01-29T03:15:00
+2007-01-17T03:15:00
+2007-01-15T03:15:00
+2007-01-03T03:15:00
+2007-01-01T03:15:00
+2006-12-20T03:15:00
+2006-12-18T03:15:00
+2006-12-06T03:15:00
+2006-12-04T03:15:00
+2006-11-22T03:15:00
+2006-11-20T03:15:00
+2006-11-08T03:15:00
+2006-11-06T03:15:00
+2006-10-25T03:15:00
+2006-10-23T03:15:00
+2006-10-11T03:15:00
+2006-10-09T03:15:00
+2006-09-27T03:15:00
+2006-09-25T03:15:00
+2006-09-13T03:15:00
+2006-09-11T03:15:00
+2006-08-30T03:15:00
+2006-08-28T03:15:00
+2006-08-16T03:15:00
+2006-08-14T03:15:00
+2006-08-02T03:15:00
+2006-07-31T03:15:00
+2006-07-19T03:15:00
+2006-07-17T03:15:00
+2006-07-05T03:15:00
+2006-07-03T03:15:00
+2006-06-21T03:15:00
+2006-06-19T03:15:00
+2006-06-07T03:15:00
+2006-06-05T03:15:00
+2006-05-24T03:15:00
+2006-05-22T03:15:00
+2006-05-10T03:15:00
+2006-05-08T03:15:00
+2006-04-26T03:15:00
+2006-04-24T03:15:00
+2006-04-12T03:15:00
+2006-04-10T03:15:00
+2006-03-29T03:15:00
+2006-03-27T03:15:00
+2006-03-15T03:15:00
+2006-03-13T03:15:00
+2006-03-01T03:15:00
+2006-02-27T03:15:00
+2006-02-15T03:15:00
+2006-02-13T03:15:00
+2006-02-01T03:15:00
+2006-01-30T03:15:00
+2006-01-18T03:15:00
+2006-01-16T03:15:00
+2006-01-04T03:15:00
+2006-01-02T03:15:00
+2005-12-21T03:15:00
+2005-12-19T03:15:00
+2005-12-07T03:15:00
+2005-12-05T03:15:00
+2005-11-23T03:15:00
+2005-11-21T03:15:00
+2005-11-09T03:15:00
+2005-11-07T03:15:00
+2005-10-26T03:15:00
+2005-10-24T03:15:00
+2005-10-12T03:15:00
+2005-10-10T03:15:00
+2005-09-28T03:15:00
+2005-09-26T03:15:00
+2005-09-14T03:15:00
+2005-09-12T03:15:00
+2005-08-31T03:15:00
+2005-08-29T03:15:00
+2005-08-17T03:15:00
+2005-08-15T03:15:00
+2005-08-03T03:15:00
+2005-08-01T03:15:00
+2005-07-20T03:15:00
+2005-07-18T03:15:00
+2005-07-06T03:15:00
+2005-07-04T03:15:00
+2005-06-22T03:15:00
+2005-06-20T03:15:00
+2005-06-08T03:15:00
+2005-06-06T03:15:00
+2005-05-25T03:15:00
+2005-05-23T03:15:00
+2005-05-12T03:15:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/weekly.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/unsorted/weekly.ics.recurson.ref
new file mode 100644
index 00000000..59d81cdc
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/weekly.ics.recurson.ref
@@ -0,0 +1,295 @@
+2005-05-12
+2005-05-23
+2005-05-25
+2005-06-06
+2005-06-08
+2005-06-20
+2005-06-22
+2005-07-04
+2005-07-06
+2005-07-18
+2005-07-20
+2005-08-01
+2005-08-03
+2005-08-15
+2005-08-17
+2005-08-29
+2005-08-31
+2005-09-12
+2005-09-14
+2005-09-26
+2005-09-28
+2005-10-10
+2005-10-12
+2005-10-24
+2005-10-26
+2005-11-07
+2005-11-09
+2005-11-21
+2005-11-23
+2005-12-05
+2005-12-07
+2005-12-19
+2005-12-21
+2006-01-02
+2006-01-04
+2006-01-16
+2006-01-18
+2006-01-30
+2006-02-01
+2006-02-13
+2006-02-15
+2006-02-27
+2006-03-01
+2006-03-13
+2006-03-15
+2006-03-27
+2006-03-29
+2006-04-10
+2006-04-12
+2006-04-24
+2006-04-26
+2006-05-08
+2006-05-10
+2006-05-22
+2006-05-24
+2006-06-05
+2006-06-07
+2006-06-19
+2006-06-21
+2006-07-03
+2006-07-05
+2006-07-17
+2006-07-19
+2006-07-31
+2006-08-02
+2006-08-14
+2006-08-16
+2006-08-28
+2006-08-30
+2006-09-11
+2006-09-13
+2006-09-25
+2006-09-27
+2006-10-09
+2006-10-11
+2006-10-23
+2006-10-25
+2006-11-06
+2006-11-08
+2006-11-20
+2006-11-22
+2006-12-04
+2006-12-06
+2006-12-18
+2006-12-20
+2007-01-01
+2007-01-03
+2007-01-15
+2007-01-17
+2007-01-29
+2007-01-31
+2007-02-12
+2007-02-14
+2007-02-26
+2007-02-28
+2007-03-12
+2007-03-14
+2007-03-26
+2007-03-28
+2007-04-09
+2007-04-11
+2007-04-23
+2007-04-25
+2007-05-07
+2007-05-09
+2007-05-21
+2007-05-23
+2007-06-04
+2007-06-06
+2007-06-18
+2007-06-20
+2007-07-02
+2007-07-04
+2007-07-16
+2007-07-18
+2007-07-30
+2007-08-01
+2007-08-13
+2007-08-15
+2007-08-27
+2007-08-29
+2007-09-10
+2007-09-12
+2007-09-24
+2007-09-26
+2007-10-08
+2007-10-10
+2007-10-22
+2007-10-24
+2007-11-05
+2007-11-07
+2007-11-19
+2007-11-21
+2007-12-03
+2007-12-05
+2007-12-17
+2007-12-19
+2007-12-31
+2008-01-02
+2008-01-14
+2008-01-16
+2008-01-28
+2008-01-30
+2008-02-11
+2008-02-13
+2008-02-25
+2008-02-27
+2008-03-10
+2008-03-12
+2008-03-24
+2008-03-26
+2008-04-07
+2008-04-09
+2008-04-21
+2008-04-23
+2008-05-05
+2008-05-07
+2008-05-19
+2008-05-21
+2008-06-02
+2008-06-04
+2008-06-16
+2008-06-18
+2008-06-30
+2008-07-02
+2008-07-14
+2008-07-16
+2008-07-28
+2008-07-30
+2008-08-11
+2008-08-13
+2008-08-25
+2008-08-27
+2008-09-08
+2008-09-10
+2008-09-22
+2008-09-24
+2008-10-06
+2008-10-08
+2008-10-20
+2008-10-22
+2008-11-03
+2008-11-05
+2008-11-17
+2008-11-19
+2008-12-01
+2008-12-03
+2008-12-15
+2008-12-17
+2008-12-29
+2008-12-31
+2009-01-12
+2009-01-14
+2009-01-26
+2009-01-28
+2009-02-09
+2009-02-11
+2009-02-23
+2009-02-25
+2009-03-09
+2009-03-11
+2009-03-23
+2009-03-25
+2009-04-06
+2009-04-08
+2009-04-20
+2009-04-22
+2009-05-04
+2009-05-06
+2009-05-18
+2009-05-20
+2009-06-01
+2009-06-03
+2009-06-15
+2009-06-17
+2009-06-29
+2009-07-01
+2009-07-13
+2009-07-15
+2009-07-27
+2009-07-29
+2009-08-10
+2009-08-12
+2009-08-24
+2009-08-26
+2009-09-07
+2009-09-09
+2009-09-21
+2009-09-23
+2009-10-05
+2009-10-07
+2009-10-19
+2009-10-21
+2009-11-02
+2009-11-04
+2009-11-16
+2009-11-18
+2009-11-30
+2009-12-02
+2009-12-14
+2009-12-16
+2009-12-28
+2009-12-30
+2010-01-11
+2010-01-13
+2010-01-25
+2010-01-27
+2010-02-08
+2010-02-10
+2010-02-22
+2010-02-24
+2010-03-08
+2010-03-10
+2010-03-22
+2010-03-24
+2010-04-05
+2010-04-07
+2010-04-19
+2010-04-21
+2010-05-03
+2010-05-05
+2010-05-17
+2010-05-19
+2010-05-31
+2010-06-02
+2010-06-14
+2010-06-16
+2010-06-28
+2010-06-30
+2010-07-12
+2010-07-14
+2010-07-26
+2010-07-28
+2010-08-09
+2010-08-11
+2010-08-23
+2010-08-25
+2010-09-06
+2010-09-08
+2010-09-20
+2010-09-22
+2010-10-04
+2010-10-06
+2010-10-18
+2010-10-20
+2010-11-01
+2010-11-03
+2010-11-15
+2010-11-17
+2010-11-29
+2010-12-01
+2010-12-13
+2010-12-15
+2010-12-27
+2010-12-29
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/yearly.ics b/libkcal/tests/data/RecurrenceRule/unsorted/yearly.ics
new file mode 100644
index 00000000..51be6e5e
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/yearly.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+VERSION:2.0
+PRODID:-//MH Software Inc//Connect Daily - 3.0.7//EN
+X-LibKCal-Testsuite-OutTZ:UTC
+
+BEGIN:VEVENT
+UID:1214@67.154.139.115
+SUMMARY:Yearly, every 2 y, in May, starting 12.5.2005, 03:15:00Z
+DTSTART:20050512T031500Z
+RRULE:FREQ=YEARLY;INTERVAL=2;BYMONTH=5
+DURATION:PT5H
+END:VEVENT
+
+END:VCALENDAR
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/yearly.ics.comp34.ref b/libkcal/tests/data/RecurrenceRule/unsorted/yearly.ics.comp34.ref
new file mode 100644
index 00000000..ccfb6b42
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/yearly.ics.comp34.ref
@@ -0,0 +1,499 @@
+2005-05-12T03:15:00
+2007-05-12T03:15:00
+2009-05-12T03:15:00
+2011-05-12T03:15:00
+2013-05-12T03:15:00
+2015-05-12T03:15:00
+2017-05-12T03:15:00
+2019-05-12T03:15:00
+2021-05-12T03:15:00
+2023-05-12T03:15:00
+2025-05-12T03:15:00
+2027-05-12T03:15:00
+2029-05-12T03:15:00
+2031-05-12T03:15:00
+2033-05-12T03:15:00
+2035-05-12T03:15:00
+2037-05-12T03:15:00
+2039-05-12T03:15:00
+2041-05-12T03:15:00
+2043-05-12T03:15:00
+2045-05-12T03:15:00
+2047-05-12T03:15:00
+2049-05-12T03:15:00
+2051-05-12T03:15:00
+2053-05-12T03:15:00
+2055-05-12T03:15:00
+2057-05-12T03:15:00
+2059-05-12T03:15:00
+2061-05-12T03:15:00
+2063-05-12T03:15:00
+2065-05-12T03:15:00
+2067-05-12T03:15:00
+2069-05-12T03:15:00
+2071-05-12T03:15:00
+2073-05-12T03:15:00
+2075-05-12T03:15:00
+2077-05-12T03:15:00
+2079-05-12T03:15:00
+2081-05-12T03:15:00
+2083-05-12T03:15:00
+2085-05-12T03:15:00
+2087-05-12T03:15:00
+2089-05-12T03:15:00
+2091-05-12T03:15:00
+2093-05-12T03:15:00
+2095-05-12T03:15:00
+2097-05-12T03:15:00
+2099-05-12T03:15:00
+2101-05-12T03:15:00
+2103-05-12T03:15:00
+2105-05-12T03:15:00
+2107-05-12T03:15:00
+2109-05-12T03:15:00
+2111-05-12T03:15:00
+2113-05-12T03:15:00
+2115-05-12T03:15:00
+2117-05-12T03:15:00
+2119-05-12T03:15:00
+2121-05-12T03:15:00
+2123-05-12T03:15:00
+2125-05-12T03:15:00
+2127-05-12T03:15:00
+2129-05-12T03:15:00
+2131-05-12T03:15:00
+2133-05-12T03:15:00
+2135-05-12T03:15:00
+2137-05-12T03:15:00
+2139-05-12T03:15:00
+2141-05-12T03:15:00
+2143-05-12T03:15:00
+2145-05-12T03:15:00
+2147-05-12T03:15:00
+2149-05-12T03:15:00
+2151-05-12T03:15:00
+2153-05-12T03:15:00
+2155-05-12T03:15:00
+2157-05-12T03:15:00
+2159-05-12T03:15:00
+2161-05-12T03:15:00
+2163-05-12T03:15:00
+2165-05-12T03:15:00
+2167-05-12T03:15:00
+2169-05-12T03:15:00
+2171-05-12T03:15:00
+2173-05-12T03:15:00
+2175-05-12T03:15:00
+2177-05-12T03:15:00
+2179-05-12T03:15:00
+2181-05-12T03:15:00
+2183-05-12T03:15:00
+2185-05-12T03:15:00
+2187-05-12T03:15:00
+2189-05-12T03:15:00
+2191-05-12T03:15:00
+2193-05-12T03:15:00
+2195-05-12T03:15:00
+2197-05-12T03:15:00
+2199-05-12T03:15:00
+2201-05-12T03:15:00
+2203-05-12T03:15:00
+2205-05-12T03:15:00
+2207-05-12T03:15:00
+2209-05-12T03:15:00
+2211-05-12T03:15:00
+2213-05-12T03:15:00
+2215-05-12T03:15:00
+2217-05-12T03:15:00
+2219-05-12T03:15:00
+2221-05-12T03:15:00
+2223-05-12T03:15:00
+2225-05-12T03:15:00
+2227-05-12T03:15:00
+2229-05-12T03:15:00
+2231-05-12T03:15:00
+2233-05-12T03:15:00
+2235-05-12T03:15:00
+2237-05-12T03:15:00
+2239-05-12T03:15:00
+2241-05-12T03:15:00
+2243-05-12T03:15:00
+2245-05-12T03:15:00
+2247-05-12T03:15:00
+2249-05-12T03:15:00
+2251-05-12T03:15:00
+2253-05-12T03:15:00
+2255-05-12T03:15:00
+2257-05-12T03:15:00
+2259-05-12T03:15:00
+2261-05-12T03:15:00
+2263-05-12T03:15:00
+2265-05-12T03:15:00
+2267-05-12T03:15:00
+2269-05-12T03:15:00
+2271-05-12T03:15:00
+2273-05-12T03:15:00
+2275-05-12T03:15:00
+2277-05-12T03:15:00
+2279-05-12T03:15:00
+2281-05-12T03:15:00
+2283-05-12T03:15:00
+2285-05-12T03:15:00
+2287-05-12T03:15:00
+2289-05-12T03:15:00
+2291-05-12T03:15:00
+2293-05-12T03:15:00
+2295-05-12T03:15:00
+2297-05-12T03:15:00
+2299-05-12T03:15:00
+2301-05-12T03:15:00
+2303-05-12T03:15:00
+2305-05-12T03:15:00
+2307-05-12T03:15:00
+2309-05-12T03:15:00
+2311-05-12T03:15:00
+2313-05-12T03:15:00
+2315-05-12T03:15:00
+2317-05-12T03:15:00
+2319-05-12T03:15:00
+2321-05-12T03:15:00
+2323-05-12T03:15:00
+2325-05-12T03:15:00
+2327-05-12T03:15:00
+2329-05-12T03:15:00
+2331-05-12T03:15:00
+2333-05-12T03:15:00
+2335-05-12T03:15:00
+2337-05-12T03:15:00
+2339-05-12T03:15:00
+2341-05-12T03:15:00
+2343-05-12T03:15:00
+2345-05-12T03:15:00
+2347-05-12T03:15:00
+2349-05-12T03:15:00
+2351-05-12T03:15:00
+2353-05-12T03:15:00
+2355-05-12T03:15:00
+2357-05-12T03:15:00
+2359-05-12T03:15:00
+2361-05-12T03:15:00
+2363-05-12T03:15:00
+2365-05-12T03:15:00
+2367-05-12T03:15:00
+2369-05-12T03:15:00
+2371-05-12T03:15:00
+2373-05-12T03:15:00
+2375-05-12T03:15:00
+2377-05-12T03:15:00
+2379-05-12T03:15:00
+2381-05-12T03:15:00
+2383-05-12T03:15:00
+2385-05-12T03:15:00
+2387-05-12T03:15:00
+2389-05-12T03:15:00
+2391-05-12T03:15:00
+2393-05-12T03:15:00
+2395-05-12T03:15:00
+2397-05-12T03:15:00
+2399-05-12T03:15:00
+2401-05-12T03:15:00
+2403-05-12T03:15:00
+2405-05-12T03:15:00
+2407-05-12T03:15:00
+2409-05-12T03:15:00
+2411-05-12T03:15:00
+2413-05-12T03:15:00
+2415-05-12T03:15:00
+2417-05-12T03:15:00
+2419-05-12T03:15:00
+2421-05-12T03:15:00
+2423-05-12T03:15:00
+2425-05-12T03:15:00
+2427-05-12T03:15:00
+2429-05-12T03:15:00
+2431-05-12T03:15:00
+2433-05-12T03:15:00
+2435-05-12T03:15:00
+2437-05-12T03:15:00
+2439-05-12T03:15:00
+2441-05-12T03:15:00
+2443-05-12T03:15:00
+2445-05-12T03:15:00
+2447-05-12T03:15:00
+2449-05-12T03:15:00
+2451-05-12T03:15:00
+2453-05-12T03:15:00
+2455-05-12T03:15:00
+2457-05-12T03:15:00
+2459-05-12T03:15:00
+2461-05-12T03:15:00
+2463-05-12T03:15:00
+2465-05-12T03:15:00
+2467-05-12T03:15:00
+2469-05-12T03:15:00
+2471-05-12T03:15:00
+2473-05-12T03:15:00
+2475-05-12T03:15:00
+2477-05-12T03:15:00
+2479-05-12T03:15:00
+2481-05-12T03:15:00
+2483-05-12T03:15:00
+2485-05-12T03:15:00
+2487-05-12T03:15:00
+2489-05-12T03:15:00
+2491-05-12T03:15:00
+2493-05-12T03:15:00
+2495-05-12T03:15:00
+2497-05-12T03:15:00
+2499-05-12T03:15:00
+2501-05-12T03:15:00
+2503-05-12T03:15:00
+2505-05-12T03:15:00
+2507-05-12T03:15:00
+2509-05-12T03:15:00
+2511-05-12T03:15:00
+2513-05-12T03:15:00
+2515-05-12T03:15:00
+2517-05-12T03:15:00
+2519-05-12T03:15:00
+2521-05-12T03:15:00
+2523-05-12T03:15:00
+2525-05-12T03:15:00
+2527-05-12T03:15:00
+2529-05-12T03:15:00
+2531-05-12T03:15:00
+2533-05-12T03:15:00
+2535-05-12T03:15:00
+2537-05-12T03:15:00
+2539-05-12T03:15:00
+2541-05-12T03:15:00
+2543-05-12T03:15:00
+2545-05-12T03:15:00
+2547-05-12T03:15:00
+2549-05-12T03:15:00
+2551-05-12T03:15:00
+2553-05-12T03:15:00
+2555-05-12T03:15:00
+2557-05-12T03:15:00
+2559-05-12T03:15:00
+2561-05-12T03:15:00
+2563-05-12T03:15:00
+2565-05-12T03:15:00
+2567-05-12T03:15:00
+2569-05-12T03:15:00
+2571-05-12T03:15:00
+2573-05-12T03:15:00
+2575-05-12T03:15:00
+2577-05-12T03:15:00
+2579-05-12T03:15:00
+2581-05-12T03:15:00
+2583-05-12T03:15:00
+2585-05-12T03:15:00
+2587-05-12T03:15:00
+2589-05-12T03:15:00
+2591-05-12T03:15:00
+2593-05-12T03:15:00
+2595-05-12T03:15:00
+2597-05-12T03:15:00
+2599-05-12T03:15:00
+2601-05-12T03:15:00
+2603-05-12T03:15:00
+2605-05-12T03:15:00
+2607-05-12T03:15:00
+2609-05-12T03:15:00
+2611-05-12T03:15:00
+2613-05-12T03:15:00
+2615-05-12T03:15:00
+2617-05-12T03:15:00
+2619-05-12T03:15:00
+2621-05-12T03:15:00
+2623-05-12T03:15:00
+2625-05-12T03:15:00
+2627-05-12T03:15:00
+2629-05-12T03:15:00
+2631-05-12T03:15:00
+2633-05-12T03:15:00
+2635-05-12T03:15:00
+2637-05-12T03:15:00
+2639-05-12T03:15:00
+2641-05-12T03:15:00
+2643-05-12T03:15:00
+2645-05-12T03:15:00
+2647-05-12T03:15:00
+2649-05-12T03:15:00
+2651-05-12T03:15:00
+2653-05-12T03:15:00
+2655-05-12T03:15:00
+2657-05-12T03:15:00
+2659-05-12T03:15:00
+2661-05-12T03:15:00
+2663-05-12T03:15:00
+2665-05-12T03:15:00
+2667-05-12T03:15:00
+2669-05-12T03:15:00
+2671-05-12T03:15:00
+2673-05-12T03:15:00
+2675-05-12T03:15:00
+2677-05-12T03:15:00
+2679-05-12T03:15:00
+2681-05-12T03:15:00
+2683-05-12T03:15:00
+2685-05-12T03:15:00
+2687-05-12T03:15:00
+2689-05-12T03:15:00
+2691-05-12T03:15:00
+2693-05-12T03:15:00
+2695-05-12T03:15:00
+2697-05-12T03:15:00
+2699-05-12T03:15:00
+2701-05-12T03:15:00
+2703-05-12T03:15:00
+2705-05-12T03:15:00
+2707-05-12T03:15:00
+2709-05-12T03:15:00
+2711-05-12T03:15:00
+2713-05-12T03:15:00
+2715-05-12T03:15:00
+2717-05-12T03:15:00
+2719-05-12T03:15:00
+2721-05-12T03:15:00
+2723-05-12T03:15:00
+2725-05-12T03:15:00
+2727-05-12T03:15:00
+2729-05-12T03:15:00
+2731-05-12T03:15:00
+2733-05-12T03:15:00
+2735-05-12T03:15:00
+2737-05-12T03:15:00
+2739-05-12T03:15:00
+2741-05-12T03:15:00
+2743-05-12T03:15:00
+2745-05-12T03:15:00
+2747-05-12T03:15:00
+2749-05-12T03:15:00
+2751-05-12T03:15:00
+2753-05-12T03:15:00
+2755-05-12T03:15:00
+2757-05-12T03:15:00
+2759-05-12T03:15:00
+2761-05-12T03:15:00
+2763-05-12T03:15:00
+2765-05-12T03:15:00
+2767-05-12T03:15:00
+2769-05-12T03:15:00
+2771-05-12T03:15:00
+2773-05-12T03:15:00
+2775-05-12T03:15:00
+2777-05-12T03:15:00
+2779-05-12T03:15:00
+2781-05-12T03:15:00
+2783-05-12T03:15:00
+2785-05-12T03:15:00
+2787-05-12T03:15:00
+2789-05-12T03:15:00
+2791-05-12T03:15:00
+2793-05-12T03:15:00
+2795-05-12T03:15:00
+2797-05-12T03:15:00
+2799-05-12T03:15:00
+2801-05-12T03:15:00
+2803-05-12T03:15:00
+2805-05-12T03:15:00
+2807-05-12T03:15:00
+2809-05-12T03:15:00
+2811-05-12T03:15:00
+2813-05-12T03:15:00
+2815-05-12T03:15:00
+2817-05-12T03:15:00
+2819-05-12T03:15:00
+2821-05-12T03:15:00
+2823-05-12T03:15:00
+2825-05-12T03:15:00
+2827-05-12T03:15:00
+2829-05-12T03:15:00
+2831-05-12T03:15:00
+2833-05-12T03:15:00
+2835-05-12T03:15:00
+2837-05-12T03:15:00
+2839-05-12T03:15:00
+2841-05-12T03:15:00
+2843-05-12T03:15:00
+2845-05-12T03:15:00
+2847-05-12T03:15:00
+2849-05-12T03:15:00
+2851-05-12T03:15:00
+2853-05-12T03:15:00
+2855-05-12T03:15:00
+2857-05-12T03:15:00
+2859-05-12T03:15:00
+2861-05-12T03:15:00
+2863-05-12T03:15:00
+2865-05-12T03:15:00
+2867-05-12T03:15:00
+2869-05-12T03:15:00
+2871-05-12T03:15:00
+2873-05-12T03:15:00
+2875-05-12T03:15:00
+2877-05-12T03:15:00
+2879-05-12T03:15:00
+2881-05-12T03:15:00
+2883-05-12T03:15:00
+2885-05-12T03:15:00
+2887-05-12T03:15:00
+2889-05-12T03:15:00
+2891-05-12T03:15:00
+2893-05-12T03:15:00
+2895-05-12T03:15:00
+2897-05-12T03:15:00
+2899-05-12T03:15:00
+2901-05-12T03:15:00
+2903-05-12T03:15:00
+2905-05-12T03:15:00
+2907-05-12T03:15:00
+2909-05-12T03:15:00
+2911-05-12T03:15:00
+2913-05-12T03:15:00
+2915-05-12T03:15:00
+2917-05-12T03:15:00
+2919-05-12T03:15:00
+2921-05-12T03:15:00
+2923-05-12T03:15:00
+2925-05-12T03:15:00
+2927-05-12T03:15:00
+2929-05-12T03:15:00
+2931-05-12T03:15:00
+2933-05-12T03:15:00
+2935-05-12T03:15:00
+2937-05-12T03:15:00
+2939-05-12T03:15:00
+2941-05-12T03:15:00
+2943-05-12T03:15:00
+2945-05-12T03:15:00
+2947-05-12T03:15:00
+2949-05-12T03:15:00
+2951-05-12T03:15:00
+2953-05-12T03:15:00
+2955-05-12T03:15:00
+2957-05-12T03:15:00
+2959-05-12T03:15:00
+2961-05-12T03:15:00
+2963-05-12T03:15:00
+2965-05-12T03:15:00
+2967-05-12T03:15:00
+2969-05-12T03:15:00
+2971-05-12T03:15:00
+2973-05-12T03:15:00
+2975-05-12T03:15:00
+2977-05-12T03:15:00
+2979-05-12T03:15:00
+2981-05-12T03:15:00
+2983-05-12T03:15:00
+2985-05-12T03:15:00
+2987-05-12T03:15:00
+2989-05-12T03:15:00
+2991-05-12T03:15:00
+2993-05-12T03:15:00
+2995-05-12T03:15:00
+2997-05-12T03:15:00
+2999-05-12T03:15:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/yearly.ics.next.ref b/libkcal/tests/data/RecurrenceRule/unsorted/yearly.ics.next.ref
new file mode 100644
index 00000000..fbcdab1a
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/yearly.ics.next.ref
@@ -0,0 +1,500 @@
+2005-05-12T03:15:00
+2007-05-12T03:15:00
+2009-05-12T03:15:00
+2011-05-12T03:15:00
+2013-05-12T03:15:00
+2015-05-12T03:15:00
+2017-05-12T03:15:00
+2019-05-12T03:15:00
+2021-05-12T03:15:00
+2023-05-12T03:15:00
+2025-05-12T03:15:00
+2027-05-12T03:15:00
+2029-05-12T03:15:00
+2031-05-12T03:15:00
+2033-05-12T03:15:00
+2035-05-12T03:15:00
+2037-05-12T03:15:00
+2039-05-12T03:15:00
+2041-05-12T03:15:00
+2043-05-12T03:15:00
+2045-05-12T03:15:00
+2047-05-12T03:15:00
+2049-05-12T03:15:00
+2051-05-12T03:15:00
+2053-05-12T03:15:00
+2055-05-12T03:15:00
+2057-05-12T03:15:00
+2059-05-12T03:15:00
+2061-05-12T03:15:00
+2063-05-12T03:15:00
+2065-05-12T03:15:00
+2067-05-12T03:15:00
+2069-05-12T03:15:00
+2071-05-12T03:15:00
+2073-05-12T03:15:00
+2075-05-12T03:15:00
+2077-05-12T03:15:00
+2079-05-12T03:15:00
+2081-05-12T03:15:00
+2083-05-12T03:15:00
+2085-05-12T03:15:00
+2087-05-12T03:15:00
+2089-05-12T03:15:00
+2091-05-12T03:15:00
+2093-05-12T03:15:00
+2095-05-12T03:15:00
+2097-05-12T03:15:00
+2099-05-12T03:15:00
+2101-05-12T03:15:00
+2103-05-12T03:15:00
+2105-05-12T03:15:00
+2107-05-12T03:15:00
+2109-05-12T03:15:00
+2111-05-12T03:15:00
+2113-05-12T03:15:00
+2115-05-12T03:15:00
+2117-05-12T03:15:00
+2119-05-12T03:15:00
+2121-05-12T03:15:00
+2123-05-12T03:15:00
+2125-05-12T03:15:00
+2127-05-12T03:15:00
+2129-05-12T03:15:00
+2131-05-12T03:15:00
+2133-05-12T03:15:00
+2135-05-12T03:15:00
+2137-05-12T03:15:00
+2139-05-12T03:15:00
+2141-05-12T03:15:00
+2143-05-12T03:15:00
+2145-05-12T03:15:00
+2147-05-12T03:15:00
+2149-05-12T03:15:00
+2151-05-12T03:15:00
+2153-05-12T03:15:00
+2155-05-12T03:15:00
+2157-05-12T03:15:00
+2159-05-12T03:15:00
+2161-05-12T03:15:00
+2163-05-12T03:15:00
+2165-05-12T03:15:00
+2167-05-12T03:15:00
+2169-05-12T03:15:00
+2171-05-12T03:15:00
+2173-05-12T03:15:00
+2175-05-12T03:15:00
+2177-05-12T03:15:00
+2179-05-12T03:15:00
+2181-05-12T03:15:00
+2183-05-12T03:15:00
+2185-05-12T03:15:00
+2187-05-12T03:15:00
+2189-05-12T03:15:00
+2191-05-12T03:15:00
+2193-05-12T03:15:00
+2195-05-12T03:15:00
+2197-05-12T03:15:00
+2199-05-12T03:15:00
+2201-05-12T03:15:00
+2203-05-12T03:15:00
+2205-05-12T03:15:00
+2207-05-12T03:15:00
+2209-05-12T03:15:00
+2211-05-12T03:15:00
+2213-05-12T03:15:00
+2215-05-12T03:15:00
+2217-05-12T03:15:00
+2219-05-12T03:15:00
+2221-05-12T03:15:00
+2223-05-12T03:15:00
+2225-05-12T03:15:00
+2227-05-12T03:15:00
+2229-05-12T03:15:00
+2231-05-12T03:15:00
+2233-05-12T03:15:00
+2235-05-12T03:15:00
+2237-05-12T03:15:00
+2239-05-12T03:15:00
+2241-05-12T03:15:00
+2243-05-12T03:15:00
+2245-05-12T03:15:00
+2247-05-12T03:15:00
+2249-05-12T03:15:00
+2251-05-12T03:15:00
+2253-05-12T03:15:00
+2255-05-12T03:15:00
+2257-05-12T03:15:00
+2259-05-12T03:15:00
+2261-05-12T03:15:00
+2263-05-12T03:15:00
+2265-05-12T03:15:00
+2267-05-12T03:15:00
+2269-05-12T03:15:00
+2271-05-12T03:15:00
+2273-05-12T03:15:00
+2275-05-12T03:15:00
+2277-05-12T03:15:00
+2279-05-12T03:15:00
+2281-05-12T03:15:00
+2283-05-12T03:15:00
+2285-05-12T03:15:00
+2287-05-12T03:15:00
+2289-05-12T03:15:00
+2291-05-12T03:15:00
+2293-05-12T03:15:00
+2295-05-12T03:15:00
+2297-05-12T03:15:00
+2299-05-12T03:15:00
+2301-05-12T03:15:00
+2303-05-12T03:15:00
+2305-05-12T03:15:00
+2307-05-12T03:15:00
+2309-05-12T03:15:00
+2311-05-12T03:15:00
+2313-05-12T03:15:00
+2315-05-12T03:15:00
+2317-05-12T03:15:00
+2319-05-12T03:15:00
+2321-05-12T03:15:00
+2323-05-12T03:15:00
+2325-05-12T03:15:00
+2327-05-12T03:15:00
+2329-05-12T03:15:00
+2331-05-12T03:15:00
+2333-05-12T03:15:00
+2335-05-12T03:15:00
+2337-05-12T03:15:00
+2339-05-12T03:15:00
+2341-05-12T03:15:00
+2343-05-12T03:15:00
+2345-05-12T03:15:00
+2347-05-12T03:15:00
+2349-05-12T03:15:00
+2351-05-12T03:15:00
+2353-05-12T03:15:00
+2355-05-12T03:15:00
+2357-05-12T03:15:00
+2359-05-12T03:15:00
+2361-05-12T03:15:00
+2363-05-12T03:15:00
+2365-05-12T03:15:00
+2367-05-12T03:15:00
+2369-05-12T03:15:00
+2371-05-12T03:15:00
+2373-05-12T03:15:00
+2375-05-12T03:15:00
+2377-05-12T03:15:00
+2379-05-12T03:15:00
+2381-05-12T03:15:00
+2383-05-12T03:15:00
+2385-05-12T03:15:00
+2387-05-12T03:15:00
+2389-05-12T03:15:00
+2391-05-12T03:15:00
+2393-05-12T03:15:00
+2395-05-12T03:15:00
+2397-05-12T03:15:00
+2399-05-12T03:15:00
+2401-05-12T03:15:00
+2403-05-12T03:15:00
+2405-05-12T03:15:00
+2407-05-12T03:15:00
+2409-05-12T03:15:00
+2411-05-12T03:15:00
+2413-05-12T03:15:00
+2415-05-12T03:15:00
+2417-05-12T03:15:00
+2419-05-12T03:15:00
+2421-05-12T03:15:00
+2423-05-12T03:15:00
+2425-05-12T03:15:00
+2427-05-12T03:15:00
+2429-05-12T03:15:00
+2431-05-12T03:15:00
+2433-05-12T03:15:00
+2435-05-12T03:15:00
+2437-05-12T03:15:00
+2439-05-12T03:15:00
+2441-05-12T03:15:00
+2443-05-12T03:15:00
+2445-05-12T03:15:00
+2447-05-12T03:15:00
+2449-05-12T03:15:00
+2451-05-12T03:15:00
+2453-05-12T03:15:00
+2455-05-12T03:15:00
+2457-05-12T03:15:00
+2459-05-12T03:15:00
+2461-05-12T03:15:00
+2463-05-12T03:15:00
+2465-05-12T03:15:00
+2467-05-12T03:15:00
+2469-05-12T03:15:00
+2471-05-12T03:15:00
+2473-05-12T03:15:00
+2475-05-12T03:15:00
+2477-05-12T03:15:00
+2479-05-12T03:15:00
+2481-05-12T03:15:00
+2483-05-12T03:15:00
+2485-05-12T03:15:00
+2487-05-12T03:15:00
+2489-05-12T03:15:00
+2491-05-12T03:15:00
+2493-05-12T03:15:00
+2495-05-12T03:15:00
+2497-05-12T03:15:00
+2499-05-12T03:15:00
+2501-05-12T03:15:00
+2503-05-12T03:15:00
+2505-05-12T03:15:00
+2507-05-12T03:15:00
+2509-05-12T03:15:00
+2511-05-12T03:15:00
+2513-05-12T03:15:00
+2515-05-12T03:15:00
+2517-05-12T03:15:00
+2519-05-12T03:15:00
+2521-05-12T03:15:00
+2523-05-12T03:15:00
+2525-05-12T03:15:00
+2527-05-12T03:15:00
+2529-05-12T03:15:00
+2531-05-12T03:15:00
+2533-05-12T03:15:00
+2535-05-12T03:15:00
+2537-05-12T03:15:00
+2539-05-12T03:15:00
+2541-05-12T03:15:00
+2543-05-12T03:15:00
+2545-05-12T03:15:00
+2547-05-12T03:15:00
+2549-05-12T03:15:00
+2551-05-12T03:15:00
+2553-05-12T03:15:00
+2555-05-12T03:15:00
+2557-05-12T03:15:00
+2559-05-12T03:15:00
+2561-05-12T03:15:00
+2563-05-12T03:15:00
+2565-05-12T03:15:00
+2567-05-12T03:15:00
+2569-05-12T03:15:00
+2571-05-12T03:15:00
+2573-05-12T03:15:00
+2575-05-12T03:15:00
+2577-05-12T03:15:00
+2579-05-12T03:15:00
+2581-05-12T03:15:00
+2583-05-12T03:15:00
+2585-05-12T03:15:00
+2587-05-12T03:15:00
+2589-05-12T03:15:00
+2591-05-12T03:15:00
+2593-05-12T03:15:00
+2595-05-12T03:15:00
+2597-05-12T03:15:00
+2599-05-12T03:15:00
+2601-05-12T03:15:00
+2603-05-12T03:15:00
+2605-05-12T03:15:00
+2607-05-12T03:15:00
+2609-05-12T03:15:00
+2611-05-12T03:15:00
+2613-05-12T03:15:00
+2615-05-12T03:15:00
+2617-05-12T03:15:00
+2619-05-12T03:15:00
+2621-05-12T03:15:00
+2623-05-12T03:15:00
+2625-05-12T03:15:00
+2627-05-12T03:15:00
+2629-05-12T03:15:00
+2631-05-12T03:15:00
+2633-05-12T03:15:00
+2635-05-12T03:15:00
+2637-05-12T03:15:00
+2639-05-12T03:15:00
+2641-05-12T03:15:00
+2643-05-12T03:15:00
+2645-05-12T03:15:00
+2647-05-12T03:15:00
+2649-05-12T03:15:00
+2651-05-12T03:15:00
+2653-05-12T03:15:00
+2655-05-12T03:15:00
+2657-05-12T03:15:00
+2659-05-12T03:15:00
+2661-05-12T03:15:00
+2663-05-12T03:15:00
+2665-05-12T03:15:00
+2667-05-12T03:15:00
+2669-05-12T03:15:00
+2671-05-12T03:15:00
+2673-05-12T03:15:00
+2675-05-12T03:15:00
+2677-05-12T03:15:00
+2679-05-12T03:15:00
+2681-05-12T03:15:00
+2683-05-12T03:15:00
+2685-05-12T03:15:00
+2687-05-12T03:15:00
+2689-05-12T03:15:00
+2691-05-12T03:15:00
+2693-05-12T03:15:00
+2695-05-12T03:15:00
+2697-05-12T03:15:00
+2699-05-12T03:15:00
+2701-05-12T03:15:00
+2703-05-12T03:15:00
+2705-05-12T03:15:00
+2707-05-12T03:15:00
+2709-05-12T03:15:00
+2711-05-12T03:15:00
+2713-05-12T03:15:00
+2715-05-12T03:15:00
+2717-05-12T03:15:00
+2719-05-12T03:15:00
+2721-05-12T03:15:00
+2723-05-12T03:15:00
+2725-05-12T03:15:00
+2727-05-12T03:15:00
+2729-05-12T03:15:00
+2731-05-12T03:15:00
+2733-05-12T03:15:00
+2735-05-12T03:15:00
+2737-05-12T03:15:00
+2739-05-12T03:15:00
+2741-05-12T03:15:00
+2743-05-12T03:15:00
+2745-05-12T03:15:00
+2747-05-12T03:15:00
+2749-05-12T03:15:00
+2751-05-12T03:15:00
+2753-05-12T03:15:00
+2755-05-12T03:15:00
+2757-05-12T03:15:00
+2759-05-12T03:15:00
+2761-05-12T03:15:00
+2763-05-12T03:15:00
+2765-05-12T03:15:00
+2767-05-12T03:15:00
+2769-05-12T03:15:00
+2771-05-12T03:15:00
+2773-05-12T03:15:00
+2775-05-12T03:15:00
+2777-05-12T03:15:00
+2779-05-12T03:15:00
+2781-05-12T03:15:00
+2783-05-12T03:15:00
+2785-05-12T03:15:00
+2787-05-12T03:15:00
+2789-05-12T03:15:00
+2791-05-12T03:15:00
+2793-05-12T03:15:00
+2795-05-12T03:15:00
+2797-05-12T03:15:00
+2799-05-12T03:15:00
+2801-05-12T03:15:00
+2803-05-12T03:15:00
+2805-05-12T03:15:00
+2807-05-12T03:15:00
+2809-05-12T03:15:00
+2811-05-12T03:15:00
+2813-05-12T03:15:00
+2815-05-12T03:15:00
+2817-05-12T03:15:00
+2819-05-12T03:15:00
+2821-05-12T03:15:00
+2823-05-12T03:15:00
+2825-05-12T03:15:00
+2827-05-12T03:15:00
+2829-05-12T03:15:00
+2831-05-12T03:15:00
+2833-05-12T03:15:00
+2835-05-12T03:15:00
+2837-05-12T03:15:00
+2839-05-12T03:15:00
+2841-05-12T03:15:00
+2843-05-12T03:15:00
+2845-05-12T03:15:00
+2847-05-12T03:15:00
+2849-05-12T03:15:00
+2851-05-12T03:15:00
+2853-05-12T03:15:00
+2855-05-12T03:15:00
+2857-05-12T03:15:00
+2859-05-12T03:15:00
+2861-05-12T03:15:00
+2863-05-12T03:15:00
+2865-05-12T03:15:00
+2867-05-12T03:15:00
+2869-05-12T03:15:00
+2871-05-12T03:15:00
+2873-05-12T03:15:00
+2875-05-12T03:15:00
+2877-05-12T03:15:00
+2879-05-12T03:15:00
+2881-05-12T03:15:00
+2883-05-12T03:15:00
+2885-05-12T03:15:00
+2887-05-12T03:15:00
+2889-05-12T03:15:00
+2891-05-12T03:15:00
+2893-05-12T03:15:00
+2895-05-12T03:15:00
+2897-05-12T03:15:00
+2899-05-12T03:15:00
+2901-05-12T03:15:00
+2903-05-12T03:15:00
+2905-05-12T03:15:00
+2907-05-12T03:15:00
+2909-05-12T03:15:00
+2911-05-12T03:15:00
+2913-05-12T03:15:00
+2915-05-12T03:15:00
+2917-05-12T03:15:00
+2919-05-12T03:15:00
+2921-05-12T03:15:00
+2923-05-12T03:15:00
+2925-05-12T03:15:00
+2927-05-12T03:15:00
+2929-05-12T03:15:00
+2931-05-12T03:15:00
+2933-05-12T03:15:00
+2935-05-12T03:15:00
+2937-05-12T03:15:00
+2939-05-12T03:15:00
+2941-05-12T03:15:00
+2943-05-12T03:15:00
+2945-05-12T03:15:00
+2947-05-12T03:15:00
+2949-05-12T03:15:00
+2951-05-12T03:15:00
+2953-05-12T03:15:00
+2955-05-12T03:15:00
+2957-05-12T03:15:00
+2959-05-12T03:15:00
+2961-05-12T03:15:00
+2963-05-12T03:15:00
+2965-05-12T03:15:00
+2967-05-12T03:15:00
+2969-05-12T03:15:00
+2971-05-12T03:15:00
+2973-05-12T03:15:00
+2975-05-12T03:15:00
+2977-05-12T03:15:00
+2979-05-12T03:15:00
+2981-05-12T03:15:00
+2983-05-12T03:15:00
+2985-05-12T03:15:00
+2987-05-12T03:15:00
+2989-05-12T03:15:00
+2991-05-12T03:15:00
+2993-05-12T03:15:00
+2995-05-12T03:15:00
+2997-05-12T03:15:00
+2999-05-12T03:15:00
+3001-05-12T03:15:00
+3003-05-12T03:15:00
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/yearly.ics.prev.ref b/libkcal/tests/data/RecurrenceRule/unsorted/yearly.ics.prev.ref
new file mode 100644
index 00000000..bfbccef6
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/yearly.ics.prev.ref
@@ -0,0 +1,4 @@
+2009-05-12T03:15:00
+2007-05-12T03:15:00
+2005-05-12T03:15:00
+
diff --git a/libkcal/tests/data/RecurrenceRule/unsorted/yearly.ics.recurson.ref b/libkcal/tests/data/RecurrenceRule/unsorted/yearly.ics.recurson.ref
new file mode 100644
index 00000000..cbb304fc
--- /dev/null
+++ b/libkcal/tests/data/RecurrenceRule/unsorted/yearly.ics.recurson.ref
@@ -0,0 +1,3 @@
+2005-05-12
+2007-05-12
+2009-05-12
diff --git a/libkcal/tests/data/resource_test_config b/libkcal/tests/data/resource_test_config
new file mode 100644
index 00000000..67f766fa
--- /dev/null
+++ b/libkcal/tests/data/resource_test_config
@@ -0,0 +1,8 @@
+[Resource_test_ical]
+CalendarURL=file:$KDEHOME/test.ics
+Format=ical
+ResourceIdentifier=sUiQkXeIro
+ResourceIsActive=true
+ResourceIsReadOnly=false
+ResourceName=Test KOrganizer resource
+ResourceType=file
diff --git a/libkcal/tests/data/test_pilot.ics b/libkcal/tests/data/test_pilot.ics
new file mode 100644
index 00000000..6cbd92ae
--- /dev/null
+++ b/libkcal/tests/data/test_pilot.ics
@@ -0,0 +1,23 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+
+BEGIN:VEVENT
+DTSTAMP:20050511T171945Z
+ORGANIZER;CN=Adriaan de Groot:MAILTO:groot@kde.org
+CREATED:20050322T063629Z
+X-PILOTID:12345
+X-PILOTSTAT:1
+UID:KOrganizer-1345486115.965
+SEQUENCE:0
+LAST-MODIFIED:20050322T063629Z
+SUMMARY:Renske op de Koffie
+CLASS:PUBLIC
+PRIORITY:5
+DTSTART:20050324T050000Z
+DTEND:20050324T070000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_3.4.ics.all b/libkcal/tests/data/vCalendar/KOrganizer_3.4.ics.all
new file mode 100644
index 00000000..0ef782fd
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_3.4.ics.all
@@ -0,0 +1,220 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105219Z
+UID:KOrganizer-45214176.303
+SEQUENCE:2
+LAST-MODIFIED:20050520T105815Z
+SUMMARY:20. Mai 2005\, 19-20 Uhr\, alle 3 Monate am -2. Fr\, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=MONTHLY;COUNT=17;INTERVAL=3;BYDAY=-2FR
+DTSTART:20050520T170000Z
+DTEND:20050520T180000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105130Z
+UID:KOrganizer-1286451532.549
+SEQUENCE:2
+LAST-MODIFIED:20050520T105759Z
+SUMMARY:20. Mai 2005\, 17-18 Uhr\, alle 3 Monate am 20.\, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=MONTHLY;COUNT=17;INTERVAL=3;BYMONTHDAY=20
+DTSTART:20050520T150000Z
+DTEND:20050520T160000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T104909Z
+UID:KOrganizer-1943919749.348
+SEQUENCE:2
+LAST-MODIFIED:20050520T105735Z
+SUMMARY:20. Mai 2005\, 14-15 Uhr\, alle 2 Wochen am Di/Do\, 27 Mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=WEEKLY;COUNT=27;INTERVAL=2;BYDAY=TU,TH
+DTSTART:20050520T130000Z
+DTEND:20050520T140000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105002Z
+UID:KOrganizer-776556232.395
+SEQUENCE:4
+LAST-MODIFIED:20050520T105750Z
+SUMMARY:20. Mai 2005\, 16-17 Uhr\, alle 3 Monate am 20.\, bis 30. Juni
+ 2006
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=MONTHLY;UNTIL=20060630;INTERVAL=3;BYMONTHDAY=20
+DTSTART:20050520T140000Z
+DTEND:20050520T150000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T104822Z
+UID:KOrganizer-428202830.752
+SEQUENCE:2
+LAST-MODIFIED:20050520T105740Z
+SUMMARY:20. Mai 2005\, 14-15 Uhr\, alle 2 Wochen am Mo/Mi/Fr\, bis 30.
+ Juni 2005
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=WEEKLY;UNTIL=20050630;INTERVAL=2;BYDAY=MO,WE,FR
+DTSTART:20050520T120000Z
+DTEND:20050520T130000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T104755Z
+UID:KOrganizer-872504546.272
+SEQUENCE:0
+LAST-MODIFIED:20050520T104755Z
+SUMMARY:20. Mai 2005\, 12-13 Uhr\, alle 3 Tage\, 50 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=DAILY;COUNT=50;INTERVAL=3
+DTSTART:20050520T100000Z
+DTEND:20050520T110000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105402Z
+UID:KOrganizer-1016383107.562
+SEQUENCE:3
+LAST-MODIFIED:20050520T105836Z
+SUMMARY:20. Mai 2005\, 22-23 Uhr\, alle 3 Jahre am 3. Freitag im Mai\,
+ 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=YEARLY;COUNT=17;INTERVAL=3;BYDAY=3FR;BYMONTH=5
+DTSTART:20050520T200000Z
+DTEND:20050520T210000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105442Z
+UID:KOrganizer-1832470339.751
+SEQUENCE:1
+LAST-MODIFIED:20050520T105511Z
+SUMMARY:20. Mai 2005\, 23-24 Uhr\, alle 3 Jahre am vorletzten Freitag im
+ Mai\, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=YEARLY;COUNT=17;INTERVAL=3;BYDAY=-2FR;BYMONTH=5
+DTSTART:20050520T210000Z
+DTEND:20050520T215900Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105153Z
+UID:KOrganizer-712420734.1026
+SEQUENCE:3
+LAST-MODIFIED:20050520T105809Z
+SUMMARY:20. Mai 2005\, 18-19 Uhr\, alle 3 Monate am 3. Fr\, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=MONTHLY;COUNT=17;INTERVAL=3;BYDAY=3FR
+DTSTART:20050520T160000Z
+DTEND:20050520T170000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105331Z
+UID:KOrganizer-1059871846.769
+SEQUENCE:1
+LAST-MODIFIED:20050520T105400Z
+SUMMARY:20. Mai 2005\, 21-22 Uhr\, alle 2 Jahre am 24. Mai\, 13 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=YEARLY;COUNT=13;INTERVAL=2;BYMONTHDAY=24;BYMONTH=5
+DTSTART:20050520T190000Z
+DTEND:20050520T200000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105525Z
+UID:KOrganizer-881198156.528
+SEQUENCE:3
+LAST-MODIFIED:20050520T105853Z
+SUMMARY:21. Mai 2005\, 12-13 Uhr\, jedes Jahre am 141. Tag im Jahr\, 17
+ mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=YEARLY;COUNT=17;INTERVAL=1;BYYEARDAY=141
+DTSTART:20050521T100000Z
+DTEND:20050521T110000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T104758Z
+UID:KOrganizer-1078681338.495
+SEQUENCE:1
+LAST-MODIFIED:20050520T104819Z
+SUMMARY:20. Mai 2005\, 13-14 Uhr\, alle 3 Tage\, bis 30. Juni 2005
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=DAILY;UNTIL=20050630;INTERVAL=3
+DTSTART:20050520T110000Z
+DTEND:20050520T120000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105244Z
+UID:KOrganizer-1521406395.909
+SEQUENCE:1
+LAST-MODIFIED:20050520T105327Z
+SUMMARY:20. Mai 2005\, 20-21 Uhr\, alle 3 Monate am letzten Do\, bis 31.
+ 12. 2006
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=MONTHLY;UNTIL=20061231;INTERVAL=3;BYDAY=-1TH
+DTSTART:20050520T180000Z
+DTEND:20050520T190000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_3.4.vcs.all b/libkcal/tests/data/vCalendar/KOrganizer_3.4.vcs.all
new file mode 100644
index 00000000..79080b0b
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_3.4.vcs.all
@@ -0,0 +1,201 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:1.0
+
+BEGIN:VEVENT
+DTSTART:20050520T170000Z
+DTEND:20050520T180000Z
+DCREATED:20050520T105219Z
+UID:KOrganizer-45214176.303
+SEQUENCE:2
+LAST-MODIFIED:20050520T105815Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:MP3 2- FR #17
+SUMMARY:20. Mai 2005, 19-20 Uhr, alle 3 Monate am -2. Fr, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTART:20050520T150000Z
+DTEND:20050520T160000Z
+DCREATED:20050520T105130Z
+UID:KOrganizer-1286451532.549
+SEQUENCE:2
+LAST-MODIFIED:20050520T105759Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:MD3 20 #17
+SUMMARY:20. Mai 2005, 17-18 Uhr, alle 3 Monate am 20., 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTART:20050520T130000Z
+DTEND:20050520T140000Z
+DCREATED:20050520T104909Z
+UID:KOrganizer-1943919749.348
+SEQUENCE:2
+LAST-MODIFIED:20050520T105735Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:W2 TU TH #27
+SUMMARY:20. Mai 2005, 14-15 Uhr, alle 2 Wochen am Di/Do, 27 Mal
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTART:20050520T140000Z
+DTEND:20050520T150000Z
+DCREATED:20050520T105002Z
+UID:KOrganizer-776556232.395
+SEQUENCE:4
+LAST-MODIFIED:20050520T105750Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:MD3 20 20060630T000000
+SUMMARY:20. Mai 2005, 16-17 Uhr, alle 3 Monate am 20., bis 30. Juni 2006
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTART:20050520T120000Z
+DTEND:20050520T130000Z
+DCREATED:20050520T104822Z
+UID:KOrganizer-428202830.752
+SEQUENCE:2
+LAST-MODIFIED:20050520T105740Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:W2 MO WE FR 20050630T000000
+SUMMARY:20. Mai 2005, 14-15 Uhr, alle 2 Wochen am Mo/Mi/Fr, bis 30. Juni 2005
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTART:20050520T100000Z
+DTEND:20050520T110000Z
+DCREATED:20050520T104755Z
+UID:KOrganizer-872504546.272
+SEQUENCE:0
+LAST-MODIFIED:20050520T104755Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:D3 #50
+SUMMARY:20. Mai 2005, 12-13 Uhr, alle 3 Tage, 50 mal
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTART:20050520T200000Z
+DTEND:20050520T210000Z
+DCREATED:20050520T105402Z
+UID:KOrganizer-1016383107.562
+SEQUENCE:3
+LAST-MODIFIED:20050520T105836Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:MAILTO:reinhold@kainhofer.com#17
+SUMMARY:20. Mai 2005, 22-23 Uhr, alle 3 Jahre am 3. Freitag im Mai, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTART:20050520T210000Z
+DTEND:20050520T215900Z
+DCREATED:20050520T105442Z
+UID:KOrganizer-1832470339.751
+SEQUENCE:1
+LAST-MODIFIED:20050520T105511Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:MAILTO:reinhold@kainhofer.com#17
+SUMMARY:20. Mai 2005, 23-24 Uhr, alle 3 Jahre am vorletzten Freitag im Mai, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTART:20050520T160000Z
+DTEND:20050520T170000Z
+DCREATED:20050520T105153Z
+UID:KOrganizer-712420734.1026
+SEQUENCE:3
+LAST-MODIFIED:20050520T105809Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:MP3 3+ FR #17
+SUMMARY:20. Mai 2005, 18-19 Uhr, alle 3 Monate am 3. Fr, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTART:20050520T190000Z
+DTEND:20050520T200000Z
+DCREATED:20050520T105331Z
+UID:KOrganizer-1059871846.769
+SEQUENCE:1
+LAST-MODIFIED:20050520T105400Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:YM2 5 #13
+SUMMARY:20. Mai 2005, 21-22 Uhr, alle 2 Jahre am 24. Mai, 13 mal
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTART:20050521T100000Z
+DTEND:20050521T110000Z
+DCREATED:20050520T105525Z
+UID:KOrganizer-881198156.528
+SEQUENCE:3
+LAST-MODIFIED:20050520T105853Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:YD1 141 #17
+SUMMARY:21. Mai 2005, 12-13 Uhr, jedes Jahre am 141. Tag im Jahr, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTART:20050520T110000Z
+DTEND:20050520T120000Z
+DCREATED:20050520T104758Z
+UID:KOrganizer-1078681338.495
+SEQUENCE:1
+LAST-MODIFIED:20050520T104819Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:D3 20050630T000000
+SUMMARY:20. Mai 2005, 13-14 Uhr, alle 3 Tage, bis 30. Juni 2005
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTART:20050520T180000Z
+DTEND:20050520T190000Z
+DCREATED:20050520T105244Z
+UID:KOrganizer-1521406395.909
+SEQUENCE:1
+LAST-MODIFIED:20050520T105327Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:MP3 1- TH 20061231T000000
+SUMMARY:20. Mai 2005, 20-21 Uhr, alle 3 Monate am letzten Do, bis 31. 12. 2006
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase01.ics b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase01.ics
new file mode 100644
index 00000000..4ba587cb
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase01.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/Vienna
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105219Z
+UID:KOrganizer-45214176.303
+SEQUENCE:2
+LAST-MODIFIED:20050520T105815Z
+SUMMARY:20. Mai 2005\, 19-20 Uhr\, alle 3 Monate am -2. Fr\, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=MONTHLY;COUNT=17;INTERVAL=3;BYDAY=-2FR
+DTSTART:20050520T170000Z
+DTEND:20050520T180000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase01.ics.vcal.ref b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase01.ics.vcal.ref
new file mode 100644
index 00000000..5581055b
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase01.ics.vcal.ref
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:20050520T170000Z
+DTEND:20050520T180000Z
+DCREATED:20050520T105219Z
+UID:KOrganizer-45214176.303
+SEQUENCE:2
+LAST-MODIFIED:20050520T105815Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:MP3 2- FR #17
+SUMMARY:20. Mai 2005, 19-20 Uhr, alle 3 Monate am -2. Fr, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase01.vcs b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase01.vcs
new file mode 100644
index 00000000..2f4287d9
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase01.vcs
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:20050520T170000Z
+DTEND:20050520T180000Z
+DCREATED:20050520T105219Z
+UID:KOrganizer-45214176.303
+SEQUENCE:2
+LAST-MODIFIED:20050520T105815Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:MP3 2- FR #17
+SUMMARY:20. Mai 2005, 19-20 Uhr, alle 3 Monate am -2. Fr, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase01.vcs.ical.ref b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase01.vcs.ical.ref
new file mode 100644
index 00000000..b262920b
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase01.vcs.ical.ref
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20050604T165650Z
+ORGANIZER:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105219Z
+UID:KOrganizer-45214176.303
+SEQUENCE:2
+LAST-MODIFIED:20050520T105815Z
+SUMMARY:20. Mai 2005\, 19-20 Uhr\, alle 3 Monate am -2. Fr\, 17 mal
+PRIORITY:5
+RRULE:FREQ=MONTHLY;COUNT=17;INTERVAL=3;BYDAY=-2FR
+DTSTART:20050520T170000Z
+DTEND:20050520T180000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase02.ics b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase02.ics
new file mode 100644
index 00000000..ce4251e5
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase02.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/Vienna
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105130Z
+UID:KOrganizer-1286451532.549
+SEQUENCE:2
+LAST-MODIFIED:20050520T105759Z
+SUMMARY:20. Mai 2005\, 17-18 Uhr\, alle 3 Monate am 20.\, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=MONTHLY;COUNT=17;INTERVAL=3;BYMONTHDAY=20
+DTSTART:20050520T150000Z
+DTEND:20050520T160000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase02.ics.vcal.ref b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase02.ics.vcal.ref
new file mode 100644
index 00000000..632c9bd7
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase02.ics.vcal.ref
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:20050520T150000Z
+DTEND:20050520T160000Z
+DCREATED:20050520T105130Z
+UID:KOrganizer-1286451532.549
+SEQUENCE:2
+LAST-MODIFIED:20050520T105759Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:MD3 20 #17
+SUMMARY:20. Mai 2005, 17-18 Uhr, alle 3 Monate am 20., 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase02.vcs b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase02.vcs
new file mode 100644
index 00000000..72a8374c
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase02.vcs
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:20050520T150000Z
+DTEND:20050520T160000Z
+DCREATED:20050520T105130Z
+UID:KOrganizer-1286451532.549
+SEQUENCE:2
+LAST-MODIFIED:20050520T105759Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:MD3 20 #17
+SUMMARY:20. Mai 2005, 17-18 Uhr, alle 3 Monate am 20., 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase02.vcs.ical.ref b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase02.vcs.ical.ref
new file mode 100644
index 00000000..a7c6ca4e
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase02.vcs.ical.ref
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20050604T165700Z
+ORGANIZER:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105130Z
+UID:KOrganizer-1286451532.549
+SEQUENCE:2
+LAST-MODIFIED:20050520T105759Z
+SUMMARY:20. Mai 2005\, 17-18 Uhr\, alle 3 Monate am 20.\, 17 mal
+PRIORITY:5
+RRULE:FREQ=MONTHLY;COUNT=17;INTERVAL=3;BYMONTHDAY=20
+DTSTART:20050520T150000Z
+DTEND:20050520T160000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase03.ics b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase03.ics
new file mode 100644
index 00000000..c73e2658
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase03.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/Vienna
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T104909Z
+UID:KOrganizer-1943919749.348
+SEQUENCE:2
+LAST-MODIFIED:20050520T105735Z
+SUMMARY:20. Mai 2005\, 14-15 Uhr\, alle 2 Wochen am Di/Do\, 27 Mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=WEEKLY;COUNT=27;INTERVAL=2;BYDAY=TU,TH
+DTSTART:20050520T130000Z
+DTEND:20050520T140000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase03.ics.vcal.ref b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase03.ics.vcal.ref
new file mode 100644
index 00000000..63845d6b
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase03.ics.vcal.ref
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:20050520T130000Z
+DTEND:20050520T140000Z
+DCREATED:20050520T104909Z
+UID:KOrganizer-1943919749.348
+SEQUENCE:2
+LAST-MODIFIED:20050520T105735Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:W2 TU TH #27
+SUMMARY:20. Mai 2005, 14-15 Uhr, alle 2 Wochen am Di/Do, 27 Mal
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase03.vcs b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase03.vcs
new file mode 100644
index 00000000..2824d709
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase03.vcs
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:20050520T130000Z
+DTEND:20050520T140000Z
+DCREATED:20050520T104909Z
+UID:KOrganizer-1943919749.348
+SEQUENCE:2
+LAST-MODIFIED:20050520T105735Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:W2 TU TH #27
+SUMMARY:20. Mai 2005, 14-15 Uhr, alle 2 Wochen am Di/Do, 27 Mal
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase03.vcs.ical.ref b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase03.vcs.ical.ref
new file mode 100644
index 00000000..6bd0e169
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase03.vcs.ical.ref
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20050604T165651Z
+ORGANIZER:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T104909Z
+UID:KOrganizer-1943919749.348
+SEQUENCE:2
+LAST-MODIFIED:20050520T105735Z
+SUMMARY:20. Mai 2005\, 14-15 Uhr\, alle 2 Wochen am Di/Do\, 27 Mal
+PRIORITY:5
+RRULE:FREQ=WEEKLY;COUNT=27;INTERVAL=2;BYDAY=TU,TH
+DTSTART:20050520T130000Z
+DTEND:20050520T140000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase04.ics b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase04.ics
new file mode 100644
index 00000000..2b811e0b
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase04.ics
@@ -0,0 +1,23 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/Vienna
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105002Z
+UID:KOrganizer-776556232.395
+SEQUENCE:4
+LAST-MODIFIED:20050520T105750Z
+SUMMARY:20. Mai 2005\, 16-17 Uhr\, alle 3 Monate am 20.\, bis 30. Juni
+ 2006
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=MONTHLY;UNTIL=20060630;INTERVAL=3;BYMONTHDAY=20
+DTSTART:20050520T140000Z
+DTEND:20050520T150000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase04.ics.vcal.ref b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase04.ics.vcal.ref
new file mode 100644
index 00000000..d375bea2
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase04.ics.vcal.ref
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:20050520T140000Z
+DTEND:20050520T150000Z
+DCREATED:20050520T105002Z
+UID:KOrganizer-776556232.395
+SEQUENCE:4
+LAST-MODIFIED:20050520T105750Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:MD3 20 20060630T000000
+SUMMARY:20. Mai 2005, 16-17 Uhr, alle 3 Monate am 20., bis 30. Juni 2006
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase04.vcs b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase04.vcs
new file mode 100644
index 00000000..5d1974ef
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase04.vcs
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:20050520T140000Z
+DTEND:20050520T150000Z
+DCREATED:20050520T105002Z
+UID:KOrganizer-776556232.395
+SEQUENCE:4
+LAST-MODIFIED:20050520T105750Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:MD3 20 20060630T000000
+SUMMARY:20. Mai 2005, 16-17 Uhr, alle 3 Monate am 20., bis 30. Juni 2006
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase04.vcs.ical.ref b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase04.vcs.ical.ref
new file mode 100644
index 00000000..e8cd6d68
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase04.vcs.ical.ref
@@ -0,0 +1,21 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20050604T165651Z
+ORGANIZER:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105002Z
+UID:KOrganizer-776556232.395
+SEQUENCE:4
+LAST-MODIFIED:20050520T105750Z
+SUMMARY:20. Mai 2005\, 16-17 Uhr\, alle 3 Monate am 20.\, bis 30. Juni
+ 2006
+PRIORITY:5
+RRULE:FREQ=MONTHLY;UNTIL=20060630T000000Z;INTERVAL=3;BYMONTHDAY=20
+DTSTART:20050520T140000Z
+DTEND:20050520T150000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase05.ics b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase05.ics
new file mode 100644
index 00000000..e86de80e
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase05.ics
@@ -0,0 +1,23 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/Vienna
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T104822Z
+UID:KOrganizer-428202830.752
+SEQUENCE:2
+LAST-MODIFIED:20050520T105740Z
+SUMMARY:20. Mai 2005\, 14-15 Uhr\, alle 2 Wochen am Mo/Mi/Fr\, bis 30.
+ Juni 2005
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=WEEKLY;UNTIL=20050630;INTERVAL=2;BYDAY=MO,WE,FR
+DTSTART:20050520T120000Z
+DTEND:20050520T130000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase05.ics.vcal.ref b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase05.ics.vcal.ref
new file mode 100644
index 00000000..be427f1f
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase05.ics.vcal.ref
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:20050520T120000Z
+DTEND:20050520T130000Z
+DCREATED:20050520T104822Z
+UID:KOrganizer-428202830.752
+SEQUENCE:2
+LAST-MODIFIED:20050520T105740Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:W2 MO WE FR 20050630T000000
+SUMMARY:20. Mai 2005, 14-15 Uhr, alle 2 Wochen am Mo/Mi/Fr, bis 30. Juni 2005
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase05.vcs b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase05.vcs
new file mode 100644
index 00000000..51196fda
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase05.vcs
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:20050520T120000Z
+DTEND:20050520T130000Z
+DCREATED:20050520T104822Z
+UID:KOrganizer-428202830.752
+SEQUENCE:2
+LAST-MODIFIED:20050520T105740Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:W2 MO WE FR 20050630T000000
+SUMMARY:20. Mai 2005, 14-15 Uhr, alle 2 Wochen am Mo/Mi/Fr, bis 30. Juni 2005
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase05.vcs.ical.ref b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase05.vcs.ical.ref
new file mode 100644
index 00000000..0791171d
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase05.vcs.ical.ref
@@ -0,0 +1,21 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20050604T165652Z
+ORGANIZER:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T104822Z
+UID:KOrganizer-428202830.752
+SEQUENCE:2
+LAST-MODIFIED:20050520T105740Z
+SUMMARY:20. Mai 2005\, 14-15 Uhr\, alle 2 Wochen am Mo/Mi/Fr\, bis 30.
+ Juni 2005
+PRIORITY:5
+RRULE:FREQ=WEEKLY;UNTIL=20050630T000000Z;INTERVAL=2;BYDAY=MO,WE,FR
+DTSTART:20050520T120000Z
+DTEND:20050520T130000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase06.ics b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase06.ics
new file mode 100644
index 00000000..096e8003
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase06.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/Vienna
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T104755Z
+UID:KOrganizer-872504546.272
+SEQUENCE:0
+LAST-MODIFIED:20050520T104755Z
+SUMMARY:20. Mai 2005\, 12-13 Uhr\, alle 3 Tage\, 50 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=DAILY;COUNT=50;INTERVAL=3
+DTSTART:20050520T100000Z
+DTEND:20050520T110000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase06.ics.vcal.ref b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase06.ics.vcal.ref
new file mode 100644
index 00000000..1a05aeeb
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase06.ics.vcal.ref
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:20050520T100000Z
+DTEND:20050520T110000Z
+DCREATED:20050520T104755Z
+UID:KOrganizer-872504546.272
+SEQUENCE:0
+LAST-MODIFIED:20050520T104755Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:D3 #50
+SUMMARY:20. Mai 2005, 12-13 Uhr, alle 3 Tage, 50 mal
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase06.vcs b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase06.vcs
new file mode 100644
index 00000000..d744a5bb
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase06.vcs
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:20050520T100000Z
+DTEND:20050520T110000Z
+DCREATED:20050520T104755Z
+UID:KOrganizer-872504546.272
+SEQUENCE:0
+LAST-MODIFIED:20050520T104755Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:D3 #50
+SUMMARY:20. Mai 2005, 12-13 Uhr, alle 3 Tage, 50 mal
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase06.vcs.ical.ref b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase06.vcs.ical.ref
new file mode 100644
index 00000000..9c28e61d
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase06.vcs.ical.ref
@@ -0,0 +1,19 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20050604T165652Z
+ORGANIZER:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T104755Z
+UID:KOrganizer-872504546.272
+LAST-MODIFIED:20050520T104755Z
+SUMMARY:20. Mai 2005\, 12-13 Uhr\, alle 3 Tage\, 50 mal
+PRIORITY:5
+RRULE:FREQ=DAILY;COUNT=50;INTERVAL=3
+DTSTART:20050520T100000Z
+DTEND:20050520T110000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase07.ics b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase07.ics
new file mode 100644
index 00000000..8d41e3ef
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase07.ics
@@ -0,0 +1,23 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/Vienna
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105402Z
+UID:KOrganizer-1016383107.562
+SEQUENCE:3
+LAST-MODIFIED:20050520T105836Z
+SUMMARY:20. Mai 2005\, 22-23 Uhr\, alle 3 Jahre am 3. Freitag im Mai\,
+ 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=YEARLY;COUNT=17;INTERVAL=3;BYDAY=3FR;BYMONTH=5
+DTSTART:20050520T200000Z
+DTEND:20050520T210000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase07.ics.vcal.ref b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase07.ics.vcal.ref
new file mode 100644
index 00000000..81182c21
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase07.ics.vcal.ref
@@ -0,0 +1,19 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:20050520T200000Z
+DTEND:20050520T210000Z
+DCREATED:20050520T105402Z
+UID:KOrganizer-1016383107.562
+SEQUENCE:3
+LAST-MODIFIED:20050520T105836Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+SUMMARY:20. Mai 2005, 22-23 Uhr, alle 3 Jahre am 3. Freitag im Mai, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase07.vcs b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase07.vcs
new file mode 100644
index 00000000..7a5504f7
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase07.vcs
@@ -0,0 +1,19 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:20050520T200000Z
+DTEND:20050520T210000Z
+DCREATED:20050520T105402Z
+UID:KOrganizer-1016383107.562
+SEQUENCE:3
+LAST-MODIFIED:20050520T105836Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+SUMMARY:20. Mai 2005, 22-23 Uhr, alle 3 Jahre am 3. Freitag im Mai, 17 mal (not possible in vCalendar -> no RRULE)
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase07.vcs.ical.ref b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase07.vcs.ical.ref
new file mode 100644
index 00000000..fdf5640b
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase07.vcs.ical.ref
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20050604T165653Z
+ORGANIZER:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105402Z
+UID:KOrganizer-1016383107.562
+SEQUENCE:3
+LAST-MODIFIED:20050520T105836Z
+SUMMARY:20. Mai 2005\, 22-23 Uhr\, alle 3 Jahre am 3. Freitag im Mai\, 17
+ mal (not possible in vCalendar -> no RRULE)
+PRIORITY:5
+DTSTART:20050520T200000Z
+DTEND:20050520T210000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase08.ics b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase08.ics
new file mode 100644
index 00000000..066f7df6
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase08.ics
@@ -0,0 +1,23 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/Vienna
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105442Z
+UID:KOrganizer-1832470339.751
+SEQUENCE:1
+LAST-MODIFIED:20050520T105511Z
+SUMMARY:20. Mai 2005\, 23-24 Uhr\, alle 3 Jahre am vorletzten Freitag im
+ Mai\, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=YEARLY;COUNT=17;INTERVAL=3;BYDAY=-2FR;BYMONTH=5
+DTSTART:20050520T210000Z
+DTEND:20050520T215900Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase08.ics.vcal.ref b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase08.ics.vcal.ref
new file mode 100644
index 00000000..605cee6e
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase08.ics.vcal.ref
@@ -0,0 +1,19 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:20050520T210000Z
+DTEND:20050520T215900Z
+DCREATED:20050520T105442Z
+UID:KOrganizer-1832470339.751
+SEQUENCE:1
+LAST-MODIFIED:20050520T105511Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+SUMMARY:20. Mai 2005, 23-24 Uhr, alle 3 Jahre am vorletzten Freitag im Mai, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase08.vcs b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase08.vcs
new file mode 100644
index 00000000..6fc4cd09
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase08.vcs
@@ -0,0 +1,19 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:20050520T210000Z
+DTEND:20050520T215900Z
+DCREATED:20050520T105442Z
+UID:KOrganizer-1832470339.751
+SEQUENCE:1
+LAST-MODIFIED:20050520T105511Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+SUMMARY:20. Mai 2005, 23-24 Uhr, alle 3 Jahre am vorletzten Freitag im Mai, 17 mal (not possible in vCalendar -> no RRULE)
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase08.vcs.ical.ref b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase08.vcs.ical.ref
new file mode 100644
index 00000000..e6bb59d3
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase08.vcs.ical.ref
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20050604T165654Z
+ORGANIZER:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105442Z
+UID:KOrganizer-1832470339.751
+SEQUENCE:1
+LAST-MODIFIED:20050520T105511Z
+SUMMARY:20. Mai 2005\, 23-24 Uhr\, alle 3 Jahre am vorletzten Freitag im
+ Mai\, 17 mal (not possible in vCalendar -> no RRULE)
+PRIORITY:5
+DTSTART:20050520T210000Z
+DTEND:20050520T215900Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase09.ics b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase09.ics
new file mode 100644
index 00000000..30660f5a
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase09.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/Vienna
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105153Z
+UID:KOrganizer-712420734.1026
+SEQUENCE:3
+LAST-MODIFIED:20050520T105809Z
+SUMMARY:20. Mai 2005\, 18-19 Uhr\, alle 3 Monate am 3. Fr\, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=MONTHLY;COUNT=17;INTERVAL=3;BYDAY=3FR
+DTSTART:20050520T160000Z
+DTEND:20050520T170000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase09.ics.vcal.ref b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase09.ics.vcal.ref
new file mode 100644
index 00000000..ac1b8f6b
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase09.ics.vcal.ref
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:20050520T160000Z
+DTEND:20050520T170000Z
+DCREATED:20050520T105153Z
+UID:KOrganizer-712420734.1026
+SEQUENCE:3
+LAST-MODIFIED:20050520T105809Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:MP3 3+ FR #17
+SUMMARY:20. Mai 2005, 18-19 Uhr, alle 3 Monate am 3. Fr, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase09.vcs b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase09.vcs
new file mode 100644
index 00000000..103929b8
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase09.vcs
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:20050520T160000Z
+DTEND:20050520T170000Z
+DCREATED:20050520T105153Z
+UID:KOrganizer-712420734.1026
+SEQUENCE:3
+LAST-MODIFIED:20050520T105809Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:MP3 3+ FR #17
+SUMMARY:20. Mai 2005, 18-19 Uhr, alle 3 Monate am 3. Fr, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase09.vcs.ical.ref b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase09.vcs.ical.ref
new file mode 100644
index 00000000..3d67ed49
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase09.vcs.ical.ref
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20050604T165655Z
+ORGANIZER:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105153Z
+UID:KOrganizer-712420734.1026
+SEQUENCE:3
+LAST-MODIFIED:20050520T105809Z
+SUMMARY:20. Mai 2005\, 18-19 Uhr\, alle 3 Monate am 3. Fr\, 17 mal
+PRIORITY:5
+RRULE:FREQ=MONTHLY;COUNT=17;INTERVAL=3;BYDAY=3FR
+DTSTART:20050520T160000Z
+DTEND:20050520T170000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase10.ics b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase10.ics
new file mode 100644
index 00000000..b35cf6e5
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase10.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/Vienna
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105331Z
+UID:KOrganizer-1059871846.769
+SEQUENCE:1
+LAST-MODIFIED:20050520T105400Z
+SUMMARY:20. Mai 2005\, 21-22 Uhr\, alle 2 Jahre am 24. Mai\, 13 mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=YEARLY;COUNT=13;INTERVAL=2;BYMONTHDAY=24;BYMONTH=5
+DTSTART:20050520T190000Z
+DTEND:20050520T200000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase10.ics.vcal.ref b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase10.ics.vcal.ref
new file mode 100644
index 00000000..c40c9bbf
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase10.ics.vcal.ref
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:20050520T190000Z
+DTEND:20050520T200000Z
+DCREATED:20050520T105331Z
+UID:KOrganizer-1059871846.769
+SEQUENCE:1
+LAST-MODIFIED:20050520T105400Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:YM2 5 #13
+SUMMARY:20. Mai 2005, 21-22 Uhr, alle 2 Jahre am 24. Mai, 13 mal
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase10.vcs b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase10.vcs
new file mode 100644
index 00000000..07168ff9
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase10.vcs
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:20050520T190000Z
+DTEND:20050520T200000Z
+DCREATED:20050520T105331Z
+UID:KOrganizer-1059871846.769
+SEQUENCE:1
+LAST-MODIFIED:20050520T105400Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:YM2 5 #13
+SUMMARY:20. Mai 2005, 21-22 Uhr, alle 2 Jahre am 24. Mai, 13 mal
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase10.vcs.ical.ref b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase10.vcs.ical.ref
new file mode 100644
index 00000000..ad809a31
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase10.vcs.ical.ref
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20050604T165656Z
+ORGANIZER:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105331Z
+UID:KOrganizer-1059871846.769
+SEQUENCE:1
+LAST-MODIFIED:20050520T105400Z
+SUMMARY:20. Mai 2005\, 21-22 Uhr\, alle 2 Jahre am 24. Mai\, 13 mal
+PRIORITY:5
+RRULE:FREQ=YEARLY;COUNT=13;INTERVAL=2;BYMONTH=5
+DTSTART:20050520T190000Z
+DTEND:20050520T200000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase11.ics b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase11.ics
new file mode 100644
index 00000000..fc9aa9d3
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase11.ics
@@ -0,0 +1,23 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/Vienna
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105525Z
+UID:KOrganizer-881198156.528
+SEQUENCE:3
+LAST-MODIFIED:20050520T105853Z
+SUMMARY:21. Mai 2005\, 12-13 Uhr\, jedes Jahre am 141. Tag im Jahr\, 17
+ mal
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=YEARLY;COUNT=17;INTERVAL=1;BYYEARDAY=141
+DTSTART:20050521T100000Z
+DTEND:20050521T110000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase11.ics.vcal.ref b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase11.ics.vcal.ref
new file mode 100644
index 00000000..671ce556
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase11.ics.vcal.ref
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:20050521T100000Z
+DTEND:20050521T110000Z
+DCREATED:20050520T105525Z
+UID:KOrganizer-881198156.528
+SEQUENCE:3
+LAST-MODIFIED:20050520T105853Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:YD1 141 #17
+SUMMARY:21. Mai 2005, 12-13 Uhr, jedes Jahre am 141. Tag im Jahr, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase11.vcs b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase11.vcs
new file mode 100644
index 00000000..62b77f4e
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase11.vcs
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:20050521T100000Z
+DTEND:20050521T110000Z
+DCREATED:20050520T105525Z
+UID:KOrganizer-881198156.528
+SEQUENCE:3
+LAST-MODIFIED:20050520T105853Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:YD1 141 #17
+SUMMARY:21. Mai 2005, 12-13 Uhr, jedes Jahre am 141. Tag im Jahr, 17 mal
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase11.vcs.ical.ref b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase11.vcs.ical.ref
new file mode 100644
index 00000000..a4fed570
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase11.vcs.ical.ref
@@ -0,0 +1,21 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20050604T165658Z
+ORGANIZER:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105525Z
+UID:KOrganizer-881198156.528
+SEQUENCE:3
+LAST-MODIFIED:20050520T105853Z
+SUMMARY:21. Mai 2005\, 12-13 Uhr\, jedes Jahre am 141. Tag im Jahr\, 17
+ mal
+PRIORITY:5
+RRULE:FREQ=YEARLY;COUNT=17;BYYEARDAY=141
+DTSTART:20050521T100000Z
+DTEND:20050521T110000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase12.ics b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase12.ics
new file mode 100644
index 00000000..fb077232
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase12.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/Vienna
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T104758Z
+UID:KOrganizer-1078681338.495
+SEQUENCE:1
+LAST-MODIFIED:20050520T104819Z
+SUMMARY:20. Mai 2005\, 13-14 Uhr\, alle 3 Tage\, bis 30. Juni 2005
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=DAILY;UNTIL=20050630;INTERVAL=3
+DTSTART:20050520T110000Z
+DTEND:20050520T120000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase12.ics.vcal.ref b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase12.ics.vcal.ref
new file mode 100644
index 00000000..34f7c734
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase12.ics.vcal.ref
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:20050520T110000Z
+DTEND:20050520T120000Z
+DCREATED:20050520T104758Z
+UID:KOrganizer-1078681338.495
+SEQUENCE:1
+LAST-MODIFIED:20050520T104819Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:D3 20050630T000000
+SUMMARY:20. Mai 2005, 13-14 Uhr, alle 3 Tage, bis 30. Juni 2005
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase12.vcs b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase12.vcs
new file mode 100644
index 00000000..0986ec9c
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase12.vcs
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:20050520T110000Z
+DTEND:20050520T120000Z
+DCREATED:20050520T104758Z
+UID:KOrganizer-1078681338.495
+SEQUENCE:1
+LAST-MODIFIED:20050520T104819Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:D3 20050630T000000
+SUMMARY:20. Mai 2005, 13-14 Uhr, alle 3 Tage, bis 30. Juni 2005
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase12.vcs.ical.ref b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase12.vcs.ical.ref
new file mode 100644
index 00000000..8a1edced
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase12.vcs.ical.ref
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20050604T165659Z
+ORGANIZER:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T104758Z
+UID:KOrganizer-1078681338.495
+SEQUENCE:1
+LAST-MODIFIED:20050520T104819Z
+SUMMARY:20. Mai 2005\, 13-14 Uhr\, alle 3 Tage\, bis 30. Juni 2005
+PRIORITY:5
+RRULE:FREQ=DAILY;UNTIL=20050630T000000Z;INTERVAL=3
+DTSTART:20050520T110000Z
+DTEND:20050520T120000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase13.ics b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase13.ics
new file mode 100644
index 00000000..09906bef
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase13.ics
@@ -0,0 +1,23 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:2.0
+X-LibKCal-Testsuite-OutTZ:Europe/Vienna
+BEGIN:VEVENT
+DTSTAMP:20050520T105856Z
+ORGANIZER;CN=Reinhold Kainhofer:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105244Z
+UID:KOrganizer-1521406395.909
+SEQUENCE:1
+LAST-MODIFIED:20050520T105327Z
+SUMMARY:20. Mai 2005\, 20-21 Uhr\, alle 3 Monate am letzten Do\, bis 31.
+ 12. 2006
+CLASS:PUBLIC
+PRIORITY:5
+RRULE:FREQ=MONTHLY;UNTIL=20061231;INTERVAL=3;BYDAY=-1TH
+DTSTART:20050520T180000Z
+DTEND:20050520T190000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase13.ics.vcal.ref b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase13.ics.vcal.ref
new file mode 100644
index 00000000..50fa5fb1
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase13.ics.vcal.ref
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:20050520T180000Z
+DTEND:20050520T190000Z
+DCREATED:20050520T105244Z
+UID:KOrganizer-1521406395.909
+SEQUENCE:1
+LAST-MODIFIED:20050520T105327Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:MP3 1- TH 20061231T000000
+SUMMARY:20. Mai 2005, 20-21 Uhr, alle 3 Monate am letzten Do, bis 31. 12. 2006
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase13.vcs b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase13.vcs
new file mode 100644
index 00000000..ad67f570
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase13.vcs
@@ -0,0 +1,20 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML KOrganizer 3.4//EN
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:20050520T180000Z
+DTEND:20050520T190000Z
+DCREATED:20050520T105244Z
+UID:KOrganizer-1521406395.909
+SEQUENCE:1
+LAST-MODIFIED:20050520T105327Z
+X-ORGANIZER:MAILTO:reinhold@kainhofer.com
+RRULE:MP3 1- TH 20061231T000000
+SUMMARY:20. Mai 2005, 20-21 Uhr, alle 3 Monate am letzten Do, bis 31. 12. 2006
+CLASS:PUBLIC
+PRIORITY:5
+TRANSP:0
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase13.vcs.ical.ref b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase13.vcs.ical.ref
new file mode 100644
index 00000000..0f9c103b
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/KOrganizer_vCalTestCase13.vcs.ical.ref
@@ -0,0 +1,21 @@
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.5//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:20050604T165659Z
+ORGANIZER:MAILTO:reinhold@kainhofer.com
+CREATED:20050520T105244Z
+UID:KOrganizer-1521406395.909
+SEQUENCE:1
+LAST-MODIFIED:20050520T105327Z
+SUMMARY:20. Mai 2005\, 20-21 Uhr\, alle 3 Monate am letzten Do\, bis 31.
+ 12. 2006
+PRIORITY:5
+RRULE:FREQ=MONTHLY;UNTIL=20061231T000000Z;INTERVAL=3;BYDAY=-1TH
+DTSTART:20050520T180000Z
+DTEND:20050520T190000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
diff --git a/libkcal/tests/data/vCalendar/readme.txt b/libkcal/tests/data/vCalendar/readme.txt
new file mode 100644
index 00000000..f1be9b2c
--- /dev/null
+++ b/libkcal/tests/data/vCalendar/readme.txt
@@ -0,0 +1,5 @@
+Test files to check vCalendar export and import for correctness. They cover
+all cases of recurrence rules that were possible in KOrganizer from KDE 3.4.
+Each event (=file) exists as iCalendar and vCalendar file. The reference
+data is the corresponding event in the other format.
+
diff --git a/libkcal/tests/fbrecurring.cpp b/libkcal/tests/fbrecurring.cpp
new file mode 100644
index 00000000..3ea9a03a
--- /dev/null
+++ b/libkcal/tests/fbrecurring.cpp
@@ -0,0 +1,52 @@
+
+#include "icalformat.h"
+#include "event.h"
+#include "calendarlocal.h"
+
+#include <libkcal/freebusy.h>
+#include <iostream>
+
+using namespace KCal;
+using namespace std;
+
+int main()
+{
+ ICalFormat f;
+
+ CalendarLocal cal( QString::fromLatin1("UTC") );
+
+ Event *event1 = new Event;
+ event1->setSummary("A");
+ event1->setDtStart( QDateTime(QDate(2006,1,1), QTime(12,0,0)) );
+ //event1->setDuration(60*60);
+ event1->setDtEnd( QDateTime(QDate(2006,1,1), QTime(13,0,0)) );
+ event1->setFloats(FALSE);
+ event1->recurrence()->setDaily( 1 );
+ //event1->recurrence()->setDuration( 2 );
+ event1->recurrence()->setEndDateTime( QDateTime(QDate(2006,1,3), QTime(13,0,0)) );
+ cout << f.toICalString(event1).latin1() << endl;
+ cal.addEvent(event1);
+
+ Event *event2 = new Event;
+ event2->setSummary("B");
+ event2->setDtStart( QDateTime(QDate(2006,1,1), QTime(13,0,0)) );
+ //event2->setDuration(60*60);
+ event2->setDtEnd( QDateTime(QDate(2006,1,1), QTime(14,0,0)) );
+ event2->setFloats(FALSE);
+ event2->recurrence()->setDaily( 1 );
+ //event2->recurrence()->setDuration( 3 );
+ event2->recurrence()->setEndDateTime( QDateTime(QDate(2006,1,4), QTime(13,0,0)) );
+ cout << f.toICalString(event2).latin1() << endl;
+ cal.addEvent(event2);
+
+ Calendar *c = &cal;
+
+ QDateTime start = QDateTime(QDate(2006,1,2), QTime(0,0,0));
+ QDateTime end = QDateTime(QDate(2006,1,3), QTime(0,0,0));
+
+ FreeBusy *freebusy = new FreeBusy( c, start, end );
+ QString result = f.createScheduleMessage( freebusy, Scheduler::Publish );
+ cout << result.latin1() << endl;
+
+ return 0;
+}
diff --git a/libkcal/tests/readandwrite.cpp b/libkcal/tests/readandwrite.cpp
new file mode 100644
index 00000000..8922080a
--- /dev/null
+++ b/libkcal/tests/readandwrite.cpp
@@ -0,0 +1,84 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "calendarlocal.h"
+
+extern "C" {
+#include "icaltimezone.h"
+}
+
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kcmdlineargs.h>
+
+#include <qfile.h>
+#include <qfileinfo.h>
+
+using namespace KCal;
+
+static const KCmdLineOptions options[] =
+{
+ { "verbose", "Verbose output", 0 },
+ { "+input", "Name of input file", 0 },
+ { "+output", "Name of output file", 0 },
+ KCmdLineLastOption
+};
+
+int main( int argc, char **argv )
+{
+ KAboutData aboutData( "readandwrite", "Read and Write Calendar", "0.1" );
+ KCmdLineArgs::init( argc, argv, &aboutData );
+ KCmdLineArgs::addCmdLineOptions( options );
+
+ KApplication app( false, false );
+
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ if ( args->count() != 2 ) {
+ args->usage( "Wrong number of arguments." );
+ }
+
+ // use zoneinfo data from source dir
+ set_zone_directory( KDETOPSRCDIR "/libkcal/libical/zoneinfo" );
+
+ QString input = QFile::decodeName( args->arg( 0 ) );
+ QString output = QFile::decodeName( args->arg( 1 ) );
+
+ QFileInfo outputFileInfo( output );
+ output = outputFileInfo.absFilePath();
+
+ kdDebug(5800) << "Input file: " << input << endl;
+ kdDebug(5800) << "Output file: " << output << endl;
+
+
+ CalendarLocal cal( QString::fromLatin1("UTC") );
+
+ if ( !cal.load( input ) ) return 1;
+ QString tz = cal.nonKDECustomProperty( "X-LibKCal-Testsuite-OutTZ" );
+ if ( !tz.isEmpty() ) {
+ cal.setTimeZoneIdViewOnly( tz );
+ }
+ if ( !cal.save( output ) ) return 1;
+
+ return 0;
+}
diff --git a/libkcal/tests/runtestcase.pl b/libkcal/tests/runtestcase.pl
new file mode 100755
index 00000000..52e6ead1
--- /dev/null
+++ b/libkcal/tests/runtestcase.pl
@@ -0,0 +1,162 @@
+#!/usr/bin/perl
+
+# This file is part of libkcal.
+#
+# Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
+# Copyright (C) 2005 Reinhold Kainhofer <reinhold@kainhofer.com>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public License
+# along with this library; see the file COPYING.LIB. If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+# Boston, MA 02110-1301, USA.
+
+# This little script runs a test program on a given (calendar) file and
+# compares the output to a reference file. All discrepancies are shown
+# to the user. Usage:
+# runtestcase.pl appname identifier testfile.ics
+# 'identifier' is used as a suffix to allow multiple tests on the same input
+# file during a test run.
+#
+# The application/script appname is required to take two arguments:
+# appname inputfile outputfile
+# where inputfile is the file to be used as input data, and the output of the
+# program will go to outputfile (=testfile.ics.identifier.out if called through
+# runtestcase.pl). That outputfile is then compared to the reference file
+# testfile.ics.ref.
+
+
+if ( @ARGV != 3 ) {
+ print STDERR "Missing arg! Arguments: testapp identifier filename \n";
+ exit 1;
+}
+
+$app = $ARGV[0];
+$id = $ARGV[1];
+$file = $ARGV[2];
+
+$MAXERRLINES=25;
+
+$file =~ /^(.*)\.[^\.]*$/;
+
+my $outfile = $file;
+$outfile =~ /\/([^\/]*)$/;
+$outfile = "$file.$id.out";
+
+$cmd = "./$app $file $outfile 2> /dev/null";
+
+#print "CMD $cmd\n";
+
+if ( system( $cmd ) != 0 ) {
+ print STDERR "Error running $app\n";
+ exit 1;
+}
+
+checkfile( $file, $outfile );
+
+exit 0;
+
+sub checkfile()
+{
+ my $file = shift;
+ my $outfile = shift;
+
+ my $logentry = "Checking '$outfile':\n";
+
+ my @ref;
+ if ( !open( REF, "$file.$id.ref" ) ) {
+ print STDERR "Unable to open $file.$id.ref\n";
+ exit 1;
+ }
+ while( <REF> ) {
+ push @ref, $_;
+ }
+ close REF;
+
+ if ( !open( READ, $outfile ) ) {
+ print STDERR "Unable to open $outfile\n";
+ exit 1;
+ }
+
+ $error = 0;
+ $i = 0;
+ $line = 0;
+ my $errorlines = 0;
+ while( <READ> ) {
+ $out = $_;
+ $ref = @ref[$i++];
+ $line++;
+
+ # DTSTAMP, LAST-MODIFIED and CREATED might be different to the reference...
+ if ( $out =~ /^DTSTAMP:[0-9ZT]+\r?$/ && $ref =~ /^DTSTAMP:[0-9ZT]+\r?$/ ) {
+ next;
+ }
+
+ if ( $out =~ /^LAST-MODIFIED:[0-9ZT]+\r?$/ && $ref =~ /^LAST-MODIFIED:[0-9ZT]+\r?$/ ) {
+ next;
+ }
+
+ if ( $out =~ /^CREATED:[0-9ZT]+\r?$/ && $ref =~ /^CREATED:[0-9ZT]+\r?$/ ) {
+ next;
+ }
+
+ if ( $out ne $ref ) {
+ if ( $errorlines == 0 ) {
+ print $logentry;
+ }
+ $errorlines++;
+ $error++;
+ if ( $errorlines < $MAXERRLINES ) {
+ print " Line $line: Expected : $ref";
+ print " Line $line: Actual output : $out";
+ } elsif ( $errorlines == $MAXERRLINES ) {
+ print " <Remaining error suppressed>\n";
+ }
+ }
+
+ }
+
+ close READ;
+
+ if ( $error > 0 ) {
+ if ( -e "$file.$id.fixme" ) {
+ if ( !open( FIXME, "$file.$id.fixme" ) ) {
+ print STDERR "Unable to open $file.fixme\n";
+ exit 1;
+ }
+ my $firstline = <FIXME>;
+ $firstline =~ /^(\d+) known errors/;
+ my $expected = $1;
+ if ( $expected == $error ) {
+ print "\n EXPECTED FAIL: $error errors found.\n";
+ print " Fixme:\n";
+ while( <FIXME> ) {
+ print " ";
+ print;
+ }
+ } else {
+ print "\n UNEXPECTED FAIL: $error errors found, $expected expected.\n";
+ exit 1;
+ }
+ } else {
+ print "\n FAILED: $error errors found.\n";
+ if ( $error > 5 ) {
+ system( "diff -u $file.$id.ref $outfile" );
+ }
+ system( "touch FAILED" );
+ exit 1;
+ }
+ } else {
+ unlink($outfile);
+# print " OK\n";
+ }
+}
diff --git a/libkcal/tests/testcalendar.cpp b/libkcal/tests/testcalendar.cpp
new file mode 100644
index 00000000..fe3c0d66
--- /dev/null
+++ b/libkcal/tests/testcalendar.cpp
@@ -0,0 +1,54 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kcmdlineargs.h>
+
+#include "calendarlocal.h"
+
+using namespace KCal;
+
+static const KCmdLineOptions options[] =
+{
+ {"verbose", "Verbose output", 0},
+ KCmdLineLastOption
+};
+
+int main(int argc,char **argv)
+{
+ KAboutData aboutData("testcalendar","Test Calendar","0.1");
+ KCmdLineArgs::init(argc,argv,&aboutData);
+ KCmdLineArgs::addCmdLineOptions( options );
+
+// KApplication app( false, false );
+ KApplication app;
+
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ Q_UNUSED( args );
+
+ CalendarLocal cal( QString::fromLatin1("UTC") );
+
+ cal.save("mycal");
+}
diff --git a/libkcal/tests/testfb.cpp b/libkcal/tests/testfb.cpp
new file mode 100644
index 00000000..9b44ebb7
--- /dev/null
+++ b/libkcal/tests/testfb.cpp
@@ -0,0 +1,64 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <iostream>
+#include <kdebug.h>
+
+#include "event.h"
+#include "icalformat.h"
+#include "freebusy.h"
+
+using namespace KCal;
+
+int main( int, char ** )
+{
+ const QString fbString =
+ "BEGIN:VCALENDAR\n"
+ "PRODID:-//proko2//freebusy 1.0//EN\n"
+ "METHOD:PUBLISH\n"
+ "VERSION:2.0\n"
+ "BEGIN:VFREEBUSY\n"
+ "ORGANIZER:MAILTO:test3@kdab.net\n"
+ "X-KDE-Foo:bla\n"
+ "DTSTAMP:20071202T152453Z\n"
+ "URL:http://mail.kdab.net/freebusy/test3%40kdab.net.ifb\n"
+ "DTSTART:19700101T000000Z\n"
+ "DTEND:200700101T000000Z\n"
+ "COMMENT:This is a dummy vfreebusy that indicates an empty calendar\n"
+ "FREEBUSY:19700101T000000Z/19700101T000000Z\n"
+ "FREEBUSY;X-UID=bGlia2NhbC0xODk4MjgxNTcuMTAxMA==;X-\n"
+ " SUMMARY=RW1wbG95ZWUgbWVldGluZw==;X-LOCATION=Um9vb\n"
+ " SAyMTM=:20080131T170000Z/20080131T174500Z\n"
+ "END:VFREEBUSY\n"
+ "END:VCALENDAR\n";
+
+ ICalFormat format;
+ FreeBusy *fb = format.parseFreeBusy( fbString );
+ kdDebug() << fb->busyPeriods().count() << " " << fb->dtStart() << endl;
+ const PeriodList l = fb->busyPeriods();
+ for ( PeriodList::ConstIterator it = l.begin(); it != l.end(); ++it )
+ kdDebug() << (*it).start() << " " << (*it).end() << "+ " << (*it).summary() << ":" << (*it).location() << endl;
+
+ typedef QMap<QCString, QString> FooMap;
+ const FooMap props = fb->customProperties();
+ for ( FooMap::ConstIterator it = props.begin(); it != props.end(); ++it )
+ kdDebug() << it.key() << ": " << it.data() << endl;
+}
diff --git a/libkcal/tests/testfields.cpp b/libkcal/tests/testfields.cpp
new file mode 100644
index 00000000..d0bcf0be
--- /dev/null
+++ b/libkcal/tests/testfields.cpp
@@ -0,0 +1,169 @@
+/*
+ This file is part of the testing framework for libkcal.
+
+ Copyright (c) 2005 Adriaan de Groot <groot@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kcmdlineargs.h>
+
+#include "calendarlocal.h"
+
+#include <qfile.h>
+
+using namespace KCal;
+
+static const KCmdLineOptions options[] =
+{
+ {"verbose", "Verbose output", 0},
+ KCmdLineLastOption
+};
+
+int main(int argc,char **argv)
+{
+ KAboutData aboutData("testfields","Test calendar fields read/write","0.1");
+ KCmdLineArgs::init(argc,argv,&aboutData);
+ KCmdLineArgs::addCmdLineOptions( options );
+
+// KApplication app( false, false );
+ KApplication app;
+
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ Q_UNUSED(args)
+
+ CalendarLocal cal( QString::fromLatin1("UTC") );
+
+ QString file = QString::fromLatin1( INPUT );
+ if (!cal.load( file ) ) {
+ kdError() << "Can't load " << file << endl;
+ return 1;
+ }
+
+ // 2 tests... first uid should result in a syncStatus of 0. second uid
+ // should have a new summary and a 1 for syncStatus.
+ QString uid1 = QString::fromLatin1("KOrganizer-1345486115.965");
+ QString uid2 = QString::fromLatin1("KOrganizer-1345486115.967");
+
+ Event *e = cal.event( uid1 );
+ if (!e) {
+ kdError() << "No event " << uid1 << endl;
+ return 1;
+ }
+
+ kdDebug() << "Event description " << e->summary() << endl;
+
+ if (e->hasEndDate()) {
+ QDateTime d = e->dtEnd();
+ kdDebug() << "Event ends " << d << endl;
+ }
+
+ if (e->pilotId()) {
+ kdDebug() << "Pilot ID = " << e->pilotId() << endl;
+ kdDebug() << "Pilot Sync Status = " << e->syncStatus() << endl;
+ } else {
+ kdError() << "No Pilot ID" << endl;
+ return 1;
+ }
+
+ kdDebug() << "First test passed. Able to read fields." << endl;
+
+ e->setSyncStatus(KCal::Incidence::SYNCNONE);
+
+ QString newSummary = QString::fromLatin1("Mooo summary");
+
+ Event *f = new Event(*e);
+
+
+ f->setUid(uid2);
+ // add event so we trigger updated()
+ cal.addEvent(f);
+
+ f->setPilotId(34567);
+ f->setSummary(newSummary);
+
+
+
+ QString filew = file +".out";
+ // weird, yes, I know, but we have a bug right now with saving the file
+ // twice which is corrupting X-PILOTSTAT
+ if ( !cal.save( filew ) || !cal.save( filew ) ) {
+ kdError() << "Can't save " << filew << endl;
+ return 1;
+ }
+
+
+ // now try to read the file back in and see if our changes made it
+ CalendarLocal cal2( QString::fromLatin1("UTC") );
+ if (!cal2.load( filew ) ) {
+ kdError() << "Can't load " << filew << endl;
+ return 1;
+ }
+
+ QFile::remove( filew );
+
+ // check for uid1--should have syncStatus of 0
+ e = cal2.event( uid1 );
+ if (!e) {
+ kdError() << "No event for first read test" << uid1 << endl;
+ return 1;
+ }
+
+ kdDebug() << "Event 1 description " << e->summary() << endl;
+
+ if (e->pilotId()) {
+ kdDebug() << "First Pilot ID = " << e->pilotId() << endl;
+ kdDebug() << "First Pilot Sync Status = " << e->syncStatus() << endl;
+ } else {
+ kdError() << "No Pilot ID for first test" << endl;
+ return 1;
+ }
+
+ if (e->syncStatus() != KCal::Incidence::SYNCNONE) {
+ kdError() << "Wrong Pilot sync status." << endl;
+ return 1;
+ }
+
+ // now check our second event for correctness
+ f = cal2.event( uid2 );
+
+ kdDebug() << "Event 2 description " << f->summary() << endl;
+
+ if (f->summary() != newSummary) {
+ kdError() << "Wrong summary for second read test." << endl;
+ return 1;
+ }
+
+ if (f->pilotId()) {
+ kdDebug() << "Second Pilot ID = " << f->pilotId() << endl;
+ kdDebug() << "Second Pilot Sync Status = " << f->syncStatus() << endl;
+ } else {
+ kdError() << "No Pilot ID for second read test" << endl;
+ return 1;
+ }
+
+ if (f->syncStatus() != KCal::Incidence::SYNCMOD) {
+ kdError() << "Wrong Pilot sync status for second read test." << endl;
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/libkcal/tests/testincidence.cpp b/libkcal/tests/testincidence.cpp
new file mode 100644
index 00000000..1dd8c737
--- /dev/null
+++ b/libkcal/tests/testincidence.cpp
@@ -0,0 +1,92 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kcmdlineargs.h>
+
+#include "icalformat.h"
+#include "event.h"
+#include "todo.h"
+
+using namespace KCal;
+
+static const KCmdLineOptions options[] =
+{
+ {"verbose", "Verbose output", 0},
+ KCmdLineLastOption
+};
+
+int main(int argc,char **argv)
+{
+ KAboutData aboutData("testincidence","Test Incidence","0.1");
+ KCmdLineArgs::init(argc,argv,&aboutData);
+ KCmdLineArgs::addCmdLineOptions( options );
+
+ KApplication app( false, false );
+
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ bool verbose = false;
+ if ( args->isSet( "verbose" ) ) verbose = true;
+
+ ICalFormat f;
+
+ Event *event1 = new Event;
+ event1->setSummary("Test Event");
+ event1->recurrence()->setDaily( 2 );
+ event1->recurrence()->setDuration( 3 );
+
+ QString eventString1 = f.toString( event1 );
+ if ( verbose )
+ kdDebug(5800) << "EVENT1 START:" << eventString1 << "EVENT1 END" << endl;
+
+ Incidence *event2 = event1->clone();
+
+ QString eventString2 = f.toString( event2 );
+ if( verbose )
+ kdDebug(5800) << "EVENT2 START:" << eventString2 << "EVENT2 END" << endl;
+
+ if ( eventString1 != eventString2 ) {
+ kdDebug(5800) << "Clone Event FAILED." << endl;
+ } else {
+ kdDebug(5800) << "Clone Event SUCCEEDED." << endl;
+ }
+
+ Todo *todo1 = new Todo;
+ todo1->setSummary("Test todo");
+ QString todoString1 = f.toString( todo1 );
+ if( verbose )
+ kdDebug(5800) << "todo1 START:" << todoString1 << "todo1 END" << endl;
+
+ Incidence *todo2 = todo1->clone();
+ QString todoString2 = f.toString( todo2 );
+ if( verbose )
+ kdDebug(5800) << "todo2 START:" << todoString2 << "todo2 END" << endl;
+
+ if ( todoString1 != todoString2 ) {
+ kdDebug(5800) << "Clone Todo FAILED." << endl;
+ } else {
+ kdDebug(5800) << "Clone Todo SUCCEEDED." << endl;
+ }
+}
diff --git a/libkcal/tests/testincidencegenerator.h b/libkcal/tests/testincidencegenerator.h
new file mode 100644
index 00000000..5f253828
--- /dev/null
+++ b/libkcal/tests/testincidencegenerator.h
@@ -0,0 +1,34 @@
+#ifndef TESTINCIDENCEGENERATOR
+#define TESTINCIDENCEGENERATOR
+
+#include "event.h"
+#include "todo.h"
+#include "journal.h"
+using namespace KCal;
+
+static Event* makeTestEvent()
+{
+ Event *event = new Event();
+ event->setSummary("Test Event");
+ event->recurrence()->setDaily( 2 );
+ event->recurrence()->setDuration( 3 );
+ return event;
+}
+
+static Todo* makeTestTodo()
+{
+ Todo *todo = new Todo();
+ todo->setSummary("Test Todo");
+ todo->setPriority( 5 );
+ return todo;
+}
+
+static Journal* makeTestJournal()
+{
+ Journal *journal = new Journal();
+ journal->setSummary("Test Journal");
+ return journal;
+}
+
+
+#endif
diff --git a/libkcal/tests/testrecurprevious.cpp b/libkcal/tests/testrecurprevious.cpp
new file mode 100644
index 00000000..c0a90b8b
--- /dev/null
+++ b/libkcal/tests/testrecurprevious.cpp
@@ -0,0 +1,134 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2005 Reinhold Kainhofer <reinhold@kainhofe.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "calendarlocal.h"
+
+extern "C" {
+#include "icaltimezone.h"
+}
+
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kcmdlineargs.h>
+
+#include <qfile.h>
+
+
+
+using namespace KCal;
+
+
+static const KCmdLineOptions options[] =
+{
+ { "verbose", "Verbose output", 0 },
+ { "+input", "Name of input file", 0 },
+ { "[+output]", "optional name of output file for the recurrence dates", 0 },
+ KCmdLineLastOption
+};
+
+
+int main( int argc, char **argv )
+{
+ KAboutData aboutData( "testrecurrencenew", "Load recurrence rules with the new class and print out debug messages", "0.1" );
+ KCmdLineArgs::init( argc, argv, &aboutData );
+ KCmdLineArgs::addCmdLineOptions( options );
+
+ KApplication app( false, false );
+
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ if ( args->count() < 1 ) {
+ args->usage( "Wrong number of arguments." );
+ }
+
+ // use zoneinfo data from source dir
+ set_zone_directory( KDETOPSRCDIR "/libkcal/libical/zoneinfo" );
+
+ QString input = QFile::decodeName( args->arg( 0 ) );
+ kdDebug(5800) << "Input file: " << input << endl;
+
+ QTextStream *outstream;
+ outstream = 0;
+ QString fn("");
+ if ( args->count() > 1 ) {
+ fn = args->arg( 1 );
+ kdDebug() << "We have a file name given: " << fn << endl;
+ }
+ QFile outfile( fn );
+ if ( !fn.isEmpty() && outfile.open( IO_WriteOnly ) ) {
+ kdDebug() << "Opened output file!!!" << endl;
+ outstream = new QTextStream( &outfile );
+ }
+
+ CalendarLocal cal( QString::fromLatin1("UTC") );
+
+ if ( !cal.load( input ) ) return 1;
+ QString tz = cal.nonKDECustomProperty( "X-LibKCal-Testsuite-OutTZ" );
+ if ( !tz.isEmpty() ) {
+ cal.setTimeZoneIdViewOnly( tz );
+ }
+
+ Incidence::List inc = cal.incidences();
+
+ for ( Incidence::List::Iterator it = inc.begin(); it != inc.end(); ++it ) {
+ Incidence *incidence = *it;
+ kdDebug(5800) << "*+*+*+*+*+*+*+*+*+*" << endl;
+ kdDebug(5800) << " -> " << incidence->summary() << " <- " << endl;
+
+ incidence->recurrence()->dump();
+
+ QDateTime dt( incidence->recurrence()->endDateTime() );
+ int i=0;
+ if ( outstream ) {
+ if ( !dt.isValid() ) dt = QDateTime( QDate( 2011, 1, 1 ), QTime( 0, 0, 1 ) );
+ else dt = dt.addYears( 2 );
+ kdDebug(5800) << "-------------------------------------------" << endl;
+ kdDebug(5800) << " *~*~*~*~ Starting with date: " << dt << endl;
+ // Output to file for testing purposes
+ while (dt.isValid() && i<500 ) {
+ dt = dt.addSecs( -1 );
+ ++i;
+ dt = incidence->recurrence()->getPreviousDateTime( dt );
+ (*outstream) << dt.toString( Qt::ISODate ) << endl;
+ }
+ } else {
+ if ( !dt.isValid() ) dt = QDateTime( QDate( 2005, 7, 31 ), QTime( 23, 59, 59 ) );
+ else dt = dt.addYears( 2 );
+ incidence->recurrence()->dump();
+ kdDebug(5800) << "-------------------------------------------" << endl;
+ kdDebug(5800) << " *~*~*~*~ Starting with date: " << dt << endl;
+ // Output to konsole
+ while ( dt.isValid() && i<50 ) {
+ dt = dt.addSecs( -1 );
+ ++i;
+ kdDebug(5800) << "-------------------------------------------" << endl;
+ dt = incidence->recurrence()->getPreviousDateTime( dt );
+ kdDebug(5800) << " *~*~*~*~ Previous date is: " << dt << endl;
+ }
+ }
+ }
+
+ delete outstream;
+ outfile.close();
+ return 0;
+}
diff --git a/libkcal/tests/testrecurrence.cpp b/libkcal/tests/testrecurrence.cpp
new file mode 100644
index 00000000..c997e9a6
--- /dev/null
+++ b/libkcal/tests/testrecurrence.cpp
@@ -0,0 +1,126 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2005 Reinhold Kainhofer <reinhold@kainhofe.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "calendarlocal.h"
+
+extern "C" {
+#include "icaltimezone.h"
+}
+
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kcmdlineargs.h>
+
+#include <qfile.h>
+
+
+
+using namespace KCal;
+
+
+static const KCmdLineOptions options[] =
+{
+ { "verbose", "Verbose output", 0 },
+ { "+input", "Name of input file", 0 },
+ { "[+output]", "optional name of output file for the recurrence dates", 0 },
+ KCmdLineLastOption
+};
+
+
+int main( int argc, char **argv )
+{
+ KAboutData aboutData( "testrecurrencenew", "Load recurrence rules with the new class and print out debug messages", "0.1" );
+ KCmdLineArgs::init( argc, argv, &aboutData );
+ KCmdLineArgs::addCmdLineOptions( options );
+
+ KApplication app( false, false );
+
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ if ( args->count() < 1 ) {
+ args->usage( "Wrong number of arguments." );
+ }
+
+ // use zoneinfo data from source dir
+ set_zone_directory( KDETOPSRCDIR "/libkcal/libical/zoneinfo" );
+
+ QString input = QFile::decodeName( args->arg( 0 ) );
+ kdDebug(5800) << "Input file: " << input << endl;
+
+ QTextStream *outstream;
+ outstream = 0;
+ QString fn("");
+ if ( args->count() > 1 ) {
+ fn = args->arg( 1 );
+ kdDebug() << "We have a file name given: " << fn << endl;
+ }
+ QFile outfile( fn );
+ if ( !fn.isEmpty() && outfile.open( IO_WriteOnly ) ) {
+ kdDebug() << "Opened output file!!!" << endl;
+ outstream = new QTextStream( &outfile );
+ }
+
+ CalendarLocal cal( QString::fromLatin1("UTC") );
+
+ if ( !cal.load( input ) ) return 1;
+ QString tz = cal.nonKDECustomProperty( "X-LibKCal-Testsuite-OutTZ" );
+ if ( !tz.isEmpty() ) {
+ cal.setTimeZoneIdViewOnly( tz );
+ }
+
+ Incidence::List inc = cal.incidences();
+
+ for ( Incidence::List::Iterator it = inc.begin(); it != inc.end(); ++it ) {
+ Incidence *incidence = *it;
+ kdDebug(5800) << "*+*+*+*+*+*+*+*+*+*" << endl;
+ kdDebug(5800) << " -> " << incidence->summary() << " <- " << endl;
+
+ incidence->recurrence()->dump();
+
+ QDateTime dt( incidence->dtStart().addSecs(-2) );
+ int i=0;
+ if ( outstream ) {
+ // Output to file for testing purposes
+ while (dt.isValid() && i<500 ) {
+ ++i;
+ dt = dt.addSecs( 1 );
+ dt = incidence->recurrence()->getNextDateTime( dt );
+ (*outstream) << dt.toString( Qt::ISODate ) << endl;
+ }
+ } else {
+ incidence->recurrence()->dump();
+ // Output to konsole
+ while ( dt.isValid() && i<10 ) {
+ ++i;
+ kdDebug(5800) << "-------------------------------------------" << endl;
+ dt = incidence->recurrence()->getNextDateTime( dt );
+ kdDebug(5800) << " *~*~*~*~ Next date is: " << dt << endl;
+ dt = dt.addSecs( 1 );
+ }
+ }
+ }
+
+ delete outstream;
+ outfile.close();
+ return 0;
+}
diff --git a/libkcal/tests/testrecurrencetype.cpp b/libkcal/tests/testrecurrencetype.cpp
new file mode 100644
index 00000000..c997e9a6
--- /dev/null
+++ b/libkcal/tests/testrecurrencetype.cpp
@@ -0,0 +1,126 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2005 Reinhold Kainhofer <reinhold@kainhofe.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "calendarlocal.h"
+
+extern "C" {
+#include "icaltimezone.h"
+}
+
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kcmdlineargs.h>
+
+#include <qfile.h>
+
+
+
+using namespace KCal;
+
+
+static const KCmdLineOptions options[] =
+{
+ { "verbose", "Verbose output", 0 },
+ { "+input", "Name of input file", 0 },
+ { "[+output]", "optional name of output file for the recurrence dates", 0 },
+ KCmdLineLastOption
+};
+
+
+int main( int argc, char **argv )
+{
+ KAboutData aboutData( "testrecurrencenew", "Load recurrence rules with the new class and print out debug messages", "0.1" );
+ KCmdLineArgs::init( argc, argv, &aboutData );
+ KCmdLineArgs::addCmdLineOptions( options );
+
+ KApplication app( false, false );
+
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ if ( args->count() < 1 ) {
+ args->usage( "Wrong number of arguments." );
+ }
+
+ // use zoneinfo data from source dir
+ set_zone_directory( KDETOPSRCDIR "/libkcal/libical/zoneinfo" );
+
+ QString input = QFile::decodeName( args->arg( 0 ) );
+ kdDebug(5800) << "Input file: " << input << endl;
+
+ QTextStream *outstream;
+ outstream = 0;
+ QString fn("");
+ if ( args->count() > 1 ) {
+ fn = args->arg( 1 );
+ kdDebug() << "We have a file name given: " << fn << endl;
+ }
+ QFile outfile( fn );
+ if ( !fn.isEmpty() && outfile.open( IO_WriteOnly ) ) {
+ kdDebug() << "Opened output file!!!" << endl;
+ outstream = new QTextStream( &outfile );
+ }
+
+ CalendarLocal cal( QString::fromLatin1("UTC") );
+
+ if ( !cal.load( input ) ) return 1;
+ QString tz = cal.nonKDECustomProperty( "X-LibKCal-Testsuite-OutTZ" );
+ if ( !tz.isEmpty() ) {
+ cal.setTimeZoneIdViewOnly( tz );
+ }
+
+ Incidence::List inc = cal.incidences();
+
+ for ( Incidence::List::Iterator it = inc.begin(); it != inc.end(); ++it ) {
+ Incidence *incidence = *it;
+ kdDebug(5800) << "*+*+*+*+*+*+*+*+*+*" << endl;
+ kdDebug(5800) << " -> " << incidence->summary() << " <- " << endl;
+
+ incidence->recurrence()->dump();
+
+ QDateTime dt( incidence->dtStart().addSecs(-2) );
+ int i=0;
+ if ( outstream ) {
+ // Output to file for testing purposes
+ while (dt.isValid() && i<500 ) {
+ ++i;
+ dt = dt.addSecs( 1 );
+ dt = incidence->recurrence()->getNextDateTime( dt );
+ (*outstream) << dt.toString( Qt::ISODate ) << endl;
+ }
+ } else {
+ incidence->recurrence()->dump();
+ // Output to konsole
+ while ( dt.isValid() && i<10 ) {
+ ++i;
+ kdDebug(5800) << "-------------------------------------------" << endl;
+ dt = incidence->recurrence()->getNextDateTime( dt );
+ kdDebug(5800) << " *~*~*~*~ Next date is: " << dt << endl;
+ dt = dt.addSecs( 1 );
+ }
+ }
+ }
+
+ delete outstream;
+ outfile.close();
+ return 0;
+}
diff --git a/libkcal/tests/testrecurson.cpp b/libkcal/tests/testrecurson.cpp
new file mode 100644
index 00000000..154cbe67
--- /dev/null
+++ b/libkcal/tests/testrecurson.cpp
@@ -0,0 +1,121 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2005 Reinhold Kainhofer <reinhold@kainhofe.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "calendarlocal.h"
+
+extern "C" {
+#include "icaltimezone.h"
+}
+
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kcmdlineargs.h>
+
+#include <qfile.h>
+
+
+
+using namespace KCal;
+
+
+static const KCmdLineOptions options[] =
+{
+ { "verbose", "Verbose output", 0 },
+ { "+input", "Name of input file", 0 },
+ { "[+output]", "optional name of output file for the recurrence dates", 0 },
+ KCmdLineLastOption
+};
+
+
+int main( int argc, char **argv )
+{
+ KAboutData aboutData( "testrecurson", "Tests all dates from 2002 to 2010 to test if the event recurs on each individual date. This is meant to test the Recurrence::recursOn method for errors.", "0.1" );
+ KCmdLineArgs::init( argc, argv, &aboutData );
+ KCmdLineArgs::addCmdLineOptions( options );
+
+ KApplication app( false, false );
+
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ if ( args->count() < 1 ) {
+ args->usage( "Wrong number of arguments." );
+ }
+
+ // use zoneinfo data from source dir
+ set_zone_directory( KDETOPSRCDIR "/libkcal/libical/zoneinfo" );
+
+ QString input = QFile::decodeName( args->arg( 0 ) );
+ kdDebug(5800) << "Input file: " << input << endl;
+
+ QTextStream *outstream;
+ outstream = 0;
+ QString fn("");
+ if ( args->count() > 1 ) {
+ fn = args->arg( 1 );
+ kdDebug() << "We have a file name given: " << fn << endl;
+ }
+ QFile outfile( fn );
+ if ( !fn.isEmpty() && outfile.open( IO_WriteOnly ) ) {
+ kdDebug() << "Opened output file!!!" << endl;
+ outstream = new QTextStream( &outfile );
+ }
+
+ CalendarLocal cal( QString::fromLatin1("UTC") );
+
+ if ( !cal.load( input ) ) return 1;
+ QString tz = cal.nonKDECustomProperty( "X-LibKCal-Testsuite-OutTZ" );
+ if ( !tz.isEmpty() ) {
+ cal.setTimeZoneIdViewOnly( tz );
+ }
+
+ Incidence::List inc = cal.incidences();
+
+ for ( Incidence::List::Iterator it = inc.begin(); it != inc.end(); ++it ) {
+ Incidence *incidence = *it;
+ kdDebug(5800) << "*+*+*+*+*+*+*+*+*+*" << endl;
+ kdDebug(5800) << " -> " << incidence->summary() << " <- " << endl;
+
+ incidence->recurrence()->dump();
+
+ QDate dt( 1996, 7, 1 );
+ if ( outstream ) {
+ // Output to file for testing purposes
+ while ( dt.year() <= 2010 ) {
+ if ( incidence->recursOn( dt ) )
+ (*outstream) << dt.toString( Qt::ISODate ) << endl;
+ dt = dt.addDays( 1 );
+ }
+ } else {
+ dt = QDate( 2005, 1, 1 );
+ while ( dt.year() < 2007 ) {
+ if ( incidence->recursOn( dt ) )
+ kdDebug(5800) << dt.toString( Qt::ISODate ) << endl;
+ dt = dt.addDays( 1 );
+ }
+ }
+ }
+
+ delete outstream;
+ outfile.close();
+ return 0;
+}
diff --git a/libkcal/tests/testresource.cpp b/libkcal/tests/testresource.cpp
new file mode 100644
index 00000000..25f6539d
--- /dev/null
+++ b/libkcal/tests/testresource.cpp
@@ -0,0 +1,253 @@
+/* This file is part of the KDE project
+ Copyright (C) 2004 Till Adam <adam@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "testresource.h"
+#include "testincidencegenerator.h"
+
+#include <config.h>
+
+#include <kabc/stdaddressbook.h>
+#include <kurl.h>
+#include <kapplication.h>
+#include <kio/netaccess.h>
+#include <kio/job.h>
+#include <kdebug.h>
+#include <kcmdlineargs.h>
+#include <kinputdialog.h>
+#include <kresources/factory.h>
+
+#include <qdir.h>
+#include <qfileinfo.h>
+#include <qstringlist.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <assert.h>
+
+#include "calendarresources.h"
+#include "resourcecalendar.h"
+#include "icalformat.h"
+#include "event.h"
+
+static const KCmdLineOptions options[] =
+{
+ { "resource <type>", "The resource to test", 0 },
+ { "configfile <file>", "Location of a config file for the resource", 0 },
+ KCmdLineLastOption // End of options
+};
+
+int main(int argc, char *argv[])
+{
+ // Use another directory than the real one, just to keep things clean
+ // KDEHOME needs to be writable though, for a ksycoca database
+ setenv( "KDEHOME", QFile::encodeName( QDir::homeDirPath() + "/.kde-testresource" ), true );
+ setenv( "KDE_FORK_SLAVES", "yes", true ); // simpler, for the final cleanup
+
+ KApplication::disableAutoDcopRegistration();
+ KCmdLineArgs::init(argc,argv,"testresource", 0, 0, 0, 0);
+ KCmdLineArgs::addCmdLineOptions( options );
+
+ KApplication app;
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+ QString type = QString::null;
+ if ( args->getOption( "resource" ) )
+ type = QString::fromLocal8Bit( args->getOption( "resource" ) );
+ KConfig *config = 0;
+ if ( args->getOption( "configfile" ) )
+ config = new KConfig( KURL( args->getOption( "configfile" ) ).url() );
+ kdDebug() << KURL( args->getOption( "configfile" ) ).url() << endl;
+ KCal::TestResource test( type, config );
+ test.setup();
+ test.runAll();
+ test.cleanup();
+ kdDebug() << "All tests OK." << endl;
+ return 0;
+}
+
+namespace KCal {
+
+TestResource::TestResource( const QString &type, KConfig *config )
+ :m_resource_type( type ), m_config( config ), m_res( 0 )
+{}
+
+void TestResource::setup()
+{
+ CalendarResourceManager *manager = new CalendarResourceManager( "calendar" );
+ manager->readConfig();
+
+ QStringList resources = manager->resourceTypeNames();
+
+ if ( m_resource_type.isNull() ) {
+
+ const QString & chosen = KInputDialog::getItem( "Select Resource",
+ "Select the resource you wish to test. Test data will be used.",
+ resources );
+
+ kdDebug() << "Selected Resource: " << chosen << endl;
+ if ( !chosen.isNull() )
+ m_resource_type = chosen;
+ }
+ assert( !m_resource_type.isNull() );
+ /* Either read one from the config file, or create a default one. */
+ if ( m_config ) {
+ kdDebug() << "Reading config from file" << endl;
+ KRES::Factory *factory = KRES::Factory::self( "calendar" );
+ m_res = dynamic_cast<ResourceCalendar*>( factory->resource( m_resource_type, m_config ) );
+ } else {
+ kdDebug() << "Creating blank resource" << endl;
+ m_res = manager->createResource( m_resource_type );
+ }
+ assert( m_res );
+}
+
+
+void TestResource::runAll()
+{
+ testOpenAndClose();
+ /* now we can trust it to open correctly */
+ m_res->open();
+ testResourceAttributes();
+ testResourceCalendarAttributes();
+ testEventAddRemove();
+ testTodoAddRemove();
+ testJournalAddRemove();
+ m_res->close();
+}
+
+bool TestResource::check(const QString& txt, QString a, QString b)
+{
+ if (a.isEmpty())
+ a = QString::null;
+ if (b.isEmpty())
+ b = QString::null;
+ if (a == b) {
+ kdDebug() << txt << " : checking '" << a << "' against expected value '" << b << "'... " << "ok" << endl;
+ }
+ else {
+ kdDebug() << txt << " : checking '" << a << "' against expected value '" << b << "'... " << "KO !" << endl;
+ cleanup();
+ exit(1);
+ }
+ return true;
+}
+
+void TestResource::testOpenAndClose()
+{
+ kdDebug() << k_funcinfo << endl;
+ assert( m_res->open() );
+ assert( m_res->isOpen() );
+ m_res->close();
+ assert( !m_res->isOpen() );
+}
+
+void TestResource::testResourceAttributes()
+{
+ kdDebug() << k_funcinfo << endl;
+
+ check( "type", m_res->type(), m_resource_type );
+
+ m_res->setReadOnly( true );
+ assert( m_res->readOnly() );
+ m_res->setReadOnly( false );
+ assert( !m_res->readOnly() );
+
+ m_res->setResourceName( "Margarete" );
+ check( "name", m_res->resourceName(), "Margarete" );
+
+ m_res->setActive( false );
+ assert( !m_res->isActive() );
+ m_res->setActive( true );
+ assert( m_res->isActive() );
+ m_res->dump();
+}
+
+void TestResource::testResourceCalendarAttributes()
+{
+ kdDebug() << k_funcinfo << endl;
+}
+
+
+void TestResource::testEventAddRemove()
+{
+ ICalFormat f;
+ kdDebug() << k_funcinfo << endl;
+
+ int oldcount = m_res->rawIncidences().count();
+ Event *event = makeTestEvent();
+ const QString origString = f.toString( event );
+ m_res->addEvent( event );
+ Event *fromRes = m_res->event( event->uid() );
+ assert( fromRes == event );
+ const QString fromResString = f.toString( fromRes );
+ check( "add", origString, fromResString );
+ m_res->deleteEvent( event );
+ assert( !m_res->event( event->uid() ) );
+ int newcount = m_res->rawIncidences().count();
+ assert( oldcount == newcount );
+ delete event;
+}
+
+void TestResource::testTodoAddRemove()
+{
+ ICalFormat f;
+ kdDebug() << k_funcinfo << endl;
+
+ int oldcount = m_res->rawIncidences().count();
+ Todo *todo = makeTestTodo();
+ const QString origString = f.toString( todo );
+ m_res->addTodo( todo );
+ Todo *fromRes = m_res->todo( todo->uid() );
+ assert( fromRes == todo );
+ const QString fromResString = f.toString( fromRes );
+ check( "add", origString, fromResString );
+ m_res->deleteTodo( todo );
+ assert( !m_res->todo( todo->uid() ) );
+ int newcount = m_res->rawIncidences().count();
+ assert( oldcount == newcount );
+ delete todo;
+}
+
+void TestResource::testJournalAddRemove()
+{
+ ICalFormat f;
+ kdDebug() << k_funcinfo << endl;
+
+ int oldcount = m_res->rawIncidences().count();
+ Journal *journal = makeTestJournal();
+ const QString origString = f.toString( journal );
+ m_res->addJournal( journal );
+ Journal *fromRes = m_res->journal( journal->uid() );
+ assert( fromRes == journal );
+ const QString fromResString = f.toString( fromRes );
+ check( "add", origString, fromResString );
+ m_res->deleteJournal( journal );
+ assert( !m_res->journal( journal->uid() ) );
+ int newcount = m_res->rawIncidences().count();
+ assert( oldcount == newcount );
+ delete journal;
+}
+
+void TestResource::cleanup()
+{
+ kdDebug() << k_funcinfo << endl;
+}
+
+}
+
+#include "testresource.moc"
diff --git a/libkcal/tests/testresource.h b/libkcal/tests/testresource.h
new file mode 100644
index 00000000..ae452dd2
--- /dev/null
+++ b/libkcal/tests/testresource.h
@@ -0,0 +1,55 @@
+/* This file is part of the KDE project
+ Copyright (C) 2004 Till Adam <adam@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef TESTRESOURCE_H
+#define TESTRESOURCE_H
+
+#include <qobject.h>
+class KConfig;
+
+namespace KCal {
+
+ class ResourceCalendar;
+
+class TestResource : public QObject
+{
+ Q_OBJECT
+
+public:
+ TestResource( const QString& type, KConfig *config );
+ void setup();
+ void runAll();
+ void cleanup();
+
+ // tests
+ void testOpenAndClose();
+ void testResourceAttributes();
+ void testResourceCalendarAttributes();
+
+ void testEventAddRemove();
+ void testTodoAddRemove();
+ void testJournalAddRemove();
+
+private:
+ bool check(const QString& txt, QString a, QString b);
+ QString m_resource_type;
+ KConfig *m_config;
+ ResourceCalendar *m_res;
+};
+}
+#endif
diff --git a/libkcal/tests/testtostring.cpp b/libkcal/tests/testtostring.cpp
new file mode 100644
index 00000000..673b487a
--- /dev/null
+++ b/libkcal/tests/testtostring.cpp
@@ -0,0 +1,46 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <iostream>
+#include <kdebug.h>
+
+#include "event.h"
+#include "icalformat.h"
+
+using namespace KCal;
+
+int main( int, char ** )
+{
+
+ // std::cout << "Hello World!" << std::endl;
+ Event *ev = new Event;
+ ev->setSummary("Griazi");
+ ICalFormat iformat;
+ QString icalstr = iformat.toICalString(ev);
+ kdDebug(5800) << icalstr << endl;
+ Incidence *ev2 = iformat.fromString(icalstr);
+ kdDebug(5800) << "Event reread!" << endl ;
+
+ if (ev2)
+ kdDebug(5800) << iformat.toICalString(ev2) << endl;
+ else
+ kdDebug(5800) << "Could not read incidence" << endl;
+}
diff --git a/libkcal/tests/testvcalexport.cpp b/libkcal/tests/testvcalexport.cpp
new file mode 100644
index 00000000..a6ca1cfd
--- /dev/null
+++ b/libkcal/tests/testvcalexport.cpp
@@ -0,0 +1,90 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2005 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "calendarlocal.h"
+#include "vcalformat.h"
+#include "filestorage.h"
+
+extern "C" {
+#include "icaltimezone.h"
+}
+
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kcmdlineargs.h>
+
+#include <qfile.h>
+#include <qfileinfo.h>
+
+using namespace KCal;
+
+static const KCmdLineOptions options[] =
+{
+ { "verbose", "Verbose output", 0 },
+ { "+input", "Name of input file", 0 },
+ { "+output", "Name of output file", 0 },
+ KCmdLineLastOption
+};
+
+int main( int argc, char **argv )
+{
+ KAboutData aboutData("testvcalexport", "Part of LibKCal's test suite. Checks if export to vCalendar still works correctly.", "0.1");
+ KCmdLineArgs::init( argc, argv, &aboutData );
+ KCmdLineArgs::addCmdLineOptions( options );
+
+ KApplication app( false, false );
+
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ if ( args->count() != 2 ) {
+ args->usage( "Wrong number of arguments." );
+ }
+
+ // use zoneinfo data from source dir
+ set_zone_directory( KDETOPSRCDIR "/libkcal/libical/zoneinfo" );
+
+ QString input = QFile::decodeName( args->arg( 0 ) );
+ QString output = QFile::decodeName( args->arg( 1 ) );
+
+ QFileInfo outputFileInfo( output );
+ output = outputFileInfo.absFilePath();
+
+ kdDebug(5800) << "Input file: " << input << endl;
+ kdDebug(5800) << "Output file: " << output << endl;
+
+
+ CalendarLocal cal( QString::fromLatin1("UTC") );
+
+ if ( !cal.load( input ) ) return 1;
+ QString tz = cal.nonKDECustomProperty( "X-LibKCal-Testsuite-OutTZ" );
+ if ( !tz.isEmpty() ) {
+ cal.setTimeZoneIdViewOnly( tz );
+ }
+ FileStorage storage( &cal, output, new VCalFormat );
+ if ( !storage.save() ) return 1;
+
+ return 0;
+}
+
diff --git a/libkcal/todo.cpp b/libkcal/todo.cpp
new file mode 100644
index 00000000..87d34c4b
--- /dev/null
+++ b/libkcal/todo.cpp
@@ -0,0 +1,318 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001-2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kglobal.h>
+#include <klocale.h>
+#include <kdebug.h>
+
+#include "todo.h"
+
+using namespace KCal;
+
+Todo::Todo()
+{
+ mHasDueDate = false;
+ mHasStartDate = false;
+
+ mHasCompletedDate = false;
+ mPercentComplete = 0;
+}
+
+Todo::Todo(const Todo &t) : Incidence(t)
+{
+ mDtDue = t.mDtDue;
+ mHasDueDate = t.mHasDueDate;
+ mHasStartDate = t.mHasStartDate;
+ mCompleted = t.mCompleted;
+ mHasCompletedDate = t.mHasCompletedDate;
+ mPercentComplete = t.mPercentComplete;
+ mDtRecurrence = t.mDtRecurrence;
+}
+
+Todo::~Todo()
+{
+}
+
+Todo *Todo::clone()
+{
+ return new Todo( *this );
+}
+
+
+Todo& Todo::operator=( const Todo &t )
+{
+ Incidence::operator=( t );
+ mDtDue = t.mDtDue;
+ mHasDueDate = t.mHasDueDate;
+ mHasStartDate = t.mHasStartDate;
+ mCompleted = t.mCompleted;
+ mHasCompletedDate = t.mHasCompletedDate;
+ mPercentComplete = t.mPercentComplete;
+ mDtRecurrence = t.mDtRecurrence;
+ return *this;
+}
+
+bool Todo::operator==( const Todo& t2 ) const
+{
+ return
+ static_cast<const Incidence&>(*this) == static_cast<const Incidence&>(t2) &&
+ dtDue() == t2.dtDue() &&
+ hasDueDate() == t2.hasDueDate() &&
+ hasStartDate() == t2.hasStartDate() &&
+ completed() == t2.completed() &&
+ hasCompletedDate() == t2.hasCompletedDate() &&
+ percentComplete() == t2.percentComplete();
+}
+
+void Todo::setDtDue(const QDateTime &dtDue, bool first )
+{
+ //int diffsecs = mDtDue.secsTo(dtDue);
+
+ /*if (mReadOnly) return;
+ const Alarm::List& alarms = alarms();
+ for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next()) {
+ if (alarm->enabled()) {
+ alarm->setTime(alarm->time().addSecs(diffsecs));
+ }
+ }*/
+ if( doesRecur() && !first ) {
+ mDtRecurrence = dtDue;
+ } else {
+ mDtDue = dtDue;
+ // TODO: This doesn't seem right...
+ recurrence()->setStartDateTime( dtDue );
+ recurrence()->setFloats( doesFloat() );
+ }
+
+ if ( doesRecur() && dtDue < recurrence()->startDateTime() )
+ setDtStart( dtDue );
+
+ //kdDebug(5800) << "setDtDue says date is " << mDtDue.toString() << endl;
+
+ /*const Alarm::List& alarms = alarms();
+ for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next())
+ alarm->setAlarmStart(mDtDue);*/
+
+ updated();
+}
+
+QDateTime Todo::dtDue( bool first ) const
+{
+ if ( doesRecur() && !first && mDtRecurrence.isValid() )
+ return mDtRecurrence;
+
+ return mDtDue;
+}
+
+QString Todo::dtDueTimeStr() const
+{
+ return KGlobal::locale()->formatTime( dtDue(!doesRecur()).time() );
+}
+
+QString Todo::dtDueDateStr(bool shortfmt) const
+{
+ return KGlobal::locale()->formatDate(dtDue( !doesRecur() ).date(),shortfmt);
+}
+
+// TODO: Add shortfmt param!!!
+QString Todo::dtDueStr() const
+{
+ return KGlobal::locale()->formatDateTime( dtDue( !doesRecur() ) );
+}
+
+bool Todo::hasDueDate() const
+{
+ return mHasDueDate;
+}
+
+void Todo::setHasDueDate(bool f)
+{
+ if (mReadOnly) return;
+ mHasDueDate = f;
+ updated();
+}
+
+
+bool Todo::hasStartDate() const
+{
+ return mHasStartDate;
+}
+
+void Todo::setHasStartDate(bool f)
+{
+ if (mReadOnly) return;
+
+ if ( doesRecur() && !f ) {
+ if ( !comments().grep("NoStartDate").count() )
+ addComment("NoStartDate"); //TODO: --> custom flag?
+ } else {
+ QString s("NoStartDate");
+ removeComment(s);
+ }
+ mHasStartDate = f;
+ updated();
+}
+
+QDateTime Todo::dtStart( bool first ) const
+{
+ if ( doesRecur() && !first )
+ return mDtRecurrence.addDays( dtDue( first ).daysTo( IncidenceBase::dtStart() ) );
+ else
+ return IncidenceBase::dtStart();
+}
+
+void Todo::setDtStart( const QDateTime &dtStart )
+{
+ // TODO: This doesn't seem right (rfc 2445/6 says, recurrence is calculated from the dtstart...)
+ if ( doesRecur() ) {
+ recurrence()->setStartDateTime( mDtDue );
+ recurrence()->setFloats( doesFloat() );
+ }
+ IncidenceBase::setDtStart( dtStart );
+}
+
+QString Todo::dtStartTimeStr( bool first ) const
+{
+ return KGlobal::locale()->formatTime(dtStart(first).time());
+}
+
+QString Todo::dtStartDateStr(bool shortfmt, bool first) const
+{
+ return KGlobal::locale()->formatDate(dtStart(first).date(),shortfmt);
+}
+
+QString Todo::dtStartStr(bool first) const
+{
+ return KGlobal::locale()->formatDateTime(dtStart(first));
+}
+
+bool Todo::isCompleted() const
+{
+ if (mPercentComplete == 100) return true;
+ else return false;
+}
+
+void Todo::setCompleted(bool completed)
+{
+ if (completed)
+ mPercentComplete = 100;
+ else {
+ mPercentComplete = 0;
+ mHasCompletedDate = false;
+ mCompleted = QDateTime();
+ }
+ updated();
+}
+
+QDateTime Todo::completed() const
+{
+ if ( hasCompletedDate() )
+ return mCompleted;
+ else
+ return QDateTime();
+}
+
+QString Todo::completedStr() const
+{
+ return KGlobal::locale()->formatDateTime(mCompleted);
+}
+
+void Todo::setCompleted(const QDateTime &completed)
+{
+ if( !recurTodo() ) {
+ mHasCompletedDate = true;
+ mPercentComplete = 100;
+ mCompleted = completed;
+ }
+ updated();
+}
+
+bool Todo::hasCompletedDate() const
+{
+ return mHasCompletedDate;
+}
+
+int Todo::percentComplete() const
+{
+ return mPercentComplete;
+}
+
+void Todo::setPercentComplete(int v)
+{
+ mPercentComplete = v;
+ if ( v != 100 ) mHasCompletedDate = false;
+ updated();
+}
+
+void Todo::setDtRecurrence( const QDateTime &dt )
+{
+ mDtRecurrence = dt;
+}
+
+QDateTime Todo::dtRecurrence() const
+{
+ return mDtRecurrence.isValid() ? mDtRecurrence : mDtDue;
+}
+
+bool Todo::recursOn( const QDate &date ) const
+{
+ QDate today = QDate::currentDate();
+ return ( Incidence::recursOn(date) &&
+ !( date < today && mDtRecurrence.date() < today &&
+ mDtRecurrence > recurrence()->startDateTime() ) );
+}
+
+bool Todo::recurTodo()
+{
+ if ( doesRecur() ) {
+ Recurrence *r = recurrence();
+ QDateTime endDateTime = r->endDateTime();
+ QDateTime nextDate = r->getNextDateTime( dtDue() );
+
+ if ( ( r->duration() == -1 || ( nextDate.isValid() && endDateTime.isValid()
+ && nextDate <= endDateTime ) ) ) {
+
+ while ( !recursAt( nextDate ) || nextDate <= QDateTime::currentDateTime() ) {
+
+ if ( !nextDate.isValid() || nextDate > endDateTime ) {
+ return false;
+ }
+
+ nextDate = r->getNextDateTime( nextDate );
+ }
+
+ setDtDue( nextDate );
+ setCompleted( false );
+ setRevision( revision() + 1 );
+
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool Todo::isOverdue() const
+{
+ bool inPast = doesFloat() ? dtDue().date() < QDate::currentDate()
+ : dtDue() < QDateTime::currentDateTime();
+ return ( inPast && !isCompleted() );
+}
diff --git a/libkcal/todo.h b/libkcal/todo.h
new file mode 100644
index 00000000..d81576d5
--- /dev/null
+++ b/libkcal/todo.h
@@ -0,0 +1,242 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 2001-2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_TODO_H
+#define KCAL_TODO_H
+
+#include "incidence.h"
+
+namespace KCal {
+
+/**
+ This class provides a Todo in the sense of RFC2445.
+*/
+class LIBKCAL_EXPORT Todo : public Incidence
+{
+ public:
+ typedef ListBase<Todo> List;
+
+ Todo();
+ Todo( const Todo & );
+ ~Todo();
+ Todo& operator=( const Todo& );
+ bool operator==( const Todo& ) const;
+
+ QCString type() const { return "Todo"; }
+
+ /**
+ Returns an exact copy of this todo. The returned object is owned by the
+ caller.
+ */
+ Todo *clone();
+
+ /**
+ Sets due date and time.
+
+ @param dtDue The due date/time.
+ @param first Set the date of the first occurrence (if the todo is recurrent).
+ */
+ void setDtDue(const QDateTime &dtDue, bool first = false);
+ /**
+ Returns due date and time.
+
+ @param first If true and the todo recurs, the due date of the first
+ occurrence will be returned.If false and recurrent, the date of the
+ current occurrence will be returned. If non-recurrent, the normal due date
+ will be returned.
+ */
+ QDateTime dtDue( bool first = false ) const;
+ /**
+ Returns due time as string formatted according to the users locale
+ settings.
+ */
+ QString dtDueTimeStr() const;
+ /**
+ Returns due date as string formatted according to the users locale
+ settings.
+
+ @param shortfmt If set to true, use short date format, if set to false use
+ long format.
+ */
+ QString dtDueDateStr( bool shortfmt = true ) const;
+ /**
+ Returns due date and time as string formatted according to the users locale
+ settings.
+ */
+ QString dtDueStr() const;
+
+ /**
+ Returns true if the todo has a due date, otherwise return false.
+ */
+ bool hasDueDate() const;
+ /**
+ Set if the todo has a due date.
+
+ @param hasDueDate true if todo has a due date, otherwise false
+ */
+ void setHasDueDate( bool hasDueDate );
+
+ /**
+ Returns true if the todo has a start date, otherwise return false.
+ */
+ bool hasStartDate() const;
+ /**
+ Set if the todo has a start date.
+
+ @param hasStartDate true if todo has a start date, otherwise false
+ */
+ void setHasStartDate( bool hasStartDate );
+
+ /**
+ Returns the startdate of the todo.
+ @param first If true, the startdate of the todo will be returned. If the
+ todo recurs, the startdate of the first occurrence will be returned.
+ If false and the todo recurs, the relative startdate will be returned,
+ based on the date returned by dtRecurrence().
+ */
+ QDateTime dtStart( bool first = false ) const;
+
+ /**
+ Sets the startdate of the todo.
+ */
+ void setDtStart( const QDateTime &dtStart );
+
+ /** Returns an todo's starting time as a string formatted according to the
+ users locale settings.
+ @param first If true, the startdate of the todo will be returned. If the
+ todo recurs, the startdate of the first occurrence will be returned.
+ If false and the todo recurs, the relative startdate will be returned,
+ based on the date returned by dtRecurrence().
+ */
+ QString dtStartTimeStr( bool first = false ) const;
+ /** Returns an todo's starting date as a string formatted according to the
+ users locale settings.
+ @param shortfmt If true, use short date format, if set to false use
+ long format.
+ @param first If true, the startdate of the todo will be returned. If the
+ todo recurs, the startdate of the first occurrence will be returned.
+ If false and the todo recurs, the relative startdate will be returned,
+ based on the date returned by dtRecurrence().
+ */
+ QString dtStartDateStr( bool shortfmt = true, bool first = false ) const;
+ /** Returns an todo's starting date and time as a string formatted according
+ to the users locale settings.
+ @param first If true, the startdate of the todo will be returned. If the
+ todo recurs, the startdate of the first occurrence will be returned.
+ If false and the todo recurs, the relative startdate will be returned,
+ based on the date returned by dtRecurrence().
+ */
+ QString dtStartStr( bool first = false ) const;
+
+ /**
+ Returns true if the todo is 100% completed, otherwise return false.
+ */
+ bool isCompleted() const;
+ /**
+ Set completed state.
+
+ @param completed If true set completed state to 100%, if false set
+ completed state to 0%.
+ */
+ void setCompleted( bool completed );
+
+ /**
+ Returns how many percent of the task are completed. Returns a value
+ between 0 and 100.
+ */
+ int percentComplete() const;
+ /**
+ Set how many percent of the task are completed. Valid values are in the
+ range from 0 to 100.
+ */
+ void setPercentComplete( int );
+
+ /**
+ Returns date and time when todo was completed.
+ */
+ QDateTime completed() const;
+ /**
+ Returns string contaiting date and time when the todo was completed
+ formatted according to the users locale settings.
+ */
+ QString completedStr() const;
+ /**
+ Set date and time of completion.
+ */
+ void setCompleted( const QDateTime &completed );
+
+ /**
+ Returns true, if todo has a date associated with completion, otherwise
+ return false.
+ */
+ bool hasCompletedDate() const;
+
+ /**
+ Sets the due date/time of the current occurrence if recurrent.
+ */
+ void setDtRecurrence( const QDateTime &dt );
+
+ /**
+ Returns the due date/time of the current occurrence if recurrent.
+ */
+ QDateTime dtRecurrence() const;
+
+ /**
+ Returns true if the date specified is one on which the todo will
+ recur. Todo's are a special case, hence the overload. It adds an extra
+ check, which make it return false if there's an occurrence between
+ the recurstart and today.
+ */
+ virtual bool recursOn( const QDate &date ) const;
+
+ /**
+ Returns true if this todo is overdue (e.g. due date is lower than today
+ and not completed), else false.
+ */
+ bool isOverdue() const;
+
+ protected:
+ /** Return the end date/time of the base incidence. */
+ virtual QDateTime endDateRecurrenceBase() const { return dtDue(); }
+
+ private:
+ bool accept(Visitor &v) { return v.visit( this ); }
+ /** Returns true if the todo got a new date, else false will be returned. */
+ bool recurTodo();
+
+ QDateTime mDtDue; // due date of todo
+ // (first occurrence if recurrent)
+ QDateTime mDtRecurrence; // due date of recurrence
+
+ bool mHasDueDate; // if todo has associated due date
+ bool mHasStartDate; // if todo has associated start date
+
+ QDateTime mCompleted;
+ bool mHasCompletedDate;
+
+ int mPercentComplete;
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/vcaldrag.cpp b/libkcal/vcaldrag.cpp
new file mode 100644
index 00000000..bbcc2447
--- /dev/null
+++ b/libkcal/vcaldrag.cpp
@@ -0,0 +1,55 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 1998 Preston Brown <pbrown@kde.org>
+ Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "vcaldrag.h"
+
+#include "vcalformat.h"
+
+using namespace KCal;
+
+VCalDrag::VCalDrag( Calendar *cal, QWidget *parent, const char *name )
+ : QStoredDrag( "text/x-vCalendar", parent, name )
+{
+ VCalFormat format;
+ setEncodedData( format.toString( cal ).utf8() );
+}
+
+bool VCalDrag::canDecode( QMimeSource *me )
+{
+ return me->provides( "text/x-vCalendar" );
+}
+
+bool VCalDrag::decode( QMimeSource *de, Calendar *cal )
+{
+ bool success = false;
+
+ QByteArray payload = de->encodedData( "text/x-vCalendar" );
+ if ( payload.size() ) {
+ QString txt = QString::fromUtf8( payload.data() );
+
+ VCalFormat format;
+ success = format.fromString( cal, txt );
+ }
+
+ return success;
+}
+
diff --git a/libkcal/vcaldrag.h b/libkcal/vcaldrag.h
new file mode 100644
index 00000000..4cb5f88a
--- /dev/null
+++ b/libkcal/vcaldrag.h
@@ -0,0 +1,60 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 1998 Preston Brown <pbrown@kde.org>
+ Copyright (c) 2001-2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_VCALDRAG_H
+#define KCAL_VCALDRAG_H
+
+#include <qdragobject.h>
+#include "libkcal_export.h"
+
+namespace KCal {
+
+class Calendar;
+
+/**
+ vCalendar drag&drop class.
+*/
+class KDE_EXPORT VCalDrag : public QStoredDrag
+{
+ public:
+ /**
+ Create a drag&drop object for vCalendar component \a vcal.
+ */
+ VCalDrag( Calendar *vcal, QWidget *parent = 0, const char *name = 0 );
+ ~VCalDrag() {}
+
+ /**
+ Return, if drag&drop object can be decode to vCalendar.
+ */
+ static bool canDecode( QMimeSource * );
+ /**
+ Decode drag&drop object to vCalendar component \a vcal.
+ */
+ static bool decode( QMimeSource *e, Calendar *cal );
+
+ private:
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/vcalformat.cpp b/libkcal/vcalformat.cpp
new file mode 100644
index 00000000..153efa31
--- /dev/null
+++ b/libkcal/vcalformat.cpp
@@ -0,0 +1,1626 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 1998 Preston Brown <pbrown@kde.org>
+ Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qapplication.h>
+#include <qdatetime.h>
+#include <qstring.h>
+#include <qptrlist.h>
+#include <qregexp.h>
+#include <qclipboard.h>
+#include <qdialog.h>
+#include <qfile.h>
+
+#include <kdebug.h>
+#include <kmessagebox.h>
+#include <kiconloader.h>
+#include <klocale.h>
+
+#include "vcc.h"
+#include "vobject.h"
+extern "C" {
+#include "icaltime.h"
+#include "icaltimezone.h"
+}
+#include "vcaldrag.h"
+#include "calendar.h"
+
+#include "vcalformat.h"
+
+using namespace KCal;
+
+VCalFormat::VCalFormat()
+{
+}
+
+VCalFormat::~VCalFormat()
+{
+}
+
+bool VCalFormat::load(Calendar *calendar, const QString &fileName)
+{
+ mCalendar = calendar;
+
+ clearException();
+
+ kdDebug(5800) << "VCalFormat::load() " << fileName << endl;
+
+ VObject *vcal = 0;
+
+ // this is not necessarily only 1 vcal. Could be many vcals, or include
+ // a vcard...
+ vcal = Parse_MIME_FromFileName(const_cast<char *>(QFile::encodeName(fileName).data()));
+
+ if (!vcal) {
+ setException(new ErrorFormat(ErrorFormat::CalVersionUnknown));
+ return FALSE;
+ }
+
+ // any other top-level calendar stuff should be added/initialized here
+
+ // put all vobjects into their proper places
+ populate(vcal);
+
+ // clean up from vcal API stuff
+ cleanVObjects(vcal);
+ cleanStrTbl();
+
+ return true;
+}
+
+
+bool VCalFormat::save(Calendar *calendar, const QString &fileName)
+{
+ mCalendar = calendar;
+
+ QString tmpStr;
+ VObject *vcal, *vo;
+
+ kdDebug(5800) << "VCalFormat::save(): " << fileName << endl;
+
+ vcal = newVObject(VCCalProp);
+
+ // addPropValue(vcal,VCLocationProp, "0.0");
+ addPropValue(vcal,VCProdIdProp, productId().latin1());
+ addPropValue(vcal,VCVersionProp, _VCAL_VERSION);
+
+ // TODO STUFF
+ Todo::List todoList = mCalendar->rawTodos();
+ Todo::List::ConstIterator it;
+ for ( it = todoList.begin(); it != todoList.end(); ++it ) {
+ vo = eventToVTodo( *it );
+ addVObjectProp( vcal, vo );
+ }
+
+ // EVENT STUFF
+ Event::List events = mCalendar->rawEvents();
+ Event::List::ConstIterator it2;
+ for( it2 = events.begin(); it2 != events.end(); ++it2 ) {
+ vo = eventToVEvent( *it2 );
+ addVObjectProp( vcal, vo );
+ }
+
+ writeVObjectToFile(QFile::encodeName(fileName).data() ,vcal);
+ cleanVObjects(vcal);
+ cleanStrTbl();
+
+ if (QFile::exists(fileName)) {
+ kdDebug(5800) << "No error" << endl;
+ return true;
+ } else {
+ kdDebug(5800) << "Error" << endl;
+ return false; // error
+ }
+
+ return false;
+}
+
+bool VCalFormat::fromString( Calendar *calendar, const QString &text )
+{
+ // TODO: Factor out VCalFormat::fromString()
+ mCalendar = calendar;
+
+ QCString data = text.utf8();
+
+ if ( !data.size() ) return false;
+
+ VObject *vcal = Parse_MIME( data.data(), data.size());
+ if ( !vcal ) return false;
+
+ VObjectIterator i;
+ VObject *curvo;
+ initPropIterator( &i, vcal );
+
+ // we only take the first object. TODO: parse all incidences.
+ do {
+ curvo = nextVObject( &i );
+ } while ( strcmp( vObjectName( curvo ), VCEventProp ) &&
+ strcmp( vObjectName( curvo ), VCTodoProp ) );
+
+ if ( strcmp( vObjectName( curvo ), VCEventProp ) == 0 ) {
+ Event *event = VEventToEvent( curvo );
+ calendar->addEvent( event );
+ } else {
+ kdDebug(5800) << "VCalFormat::fromString(): Unknown object type." << endl;
+ deleteVObject( vcal );
+ return false;
+ }
+
+ deleteVObject( vcal );
+
+ return true;
+}
+
+QString VCalFormat::toString( Calendar *calendar )
+{
+ // TODO: Factor out VCalFormat::asString()
+ mCalendar = calendar;
+
+ VObject *vcal = newVObject(VCCalProp);
+
+ addPropValue( vcal, VCProdIdProp, CalFormat::productId().latin1() );
+ addPropValue( vcal, VCVersionProp, _VCAL_VERSION );
+
+ // TODO: Use all data.
+ Event::List events = calendar->events();
+ Event *event = events.first();
+ if ( !event ) {
+ cleanVObject( vcal );
+ return QString::null;
+ }
+
+ VObject *vevent = eventToVEvent( event );
+
+ addVObjectProp( vcal, vevent );
+
+ char *buf = writeMemVObject( 0, 0, vcal );
+
+ QString result( buf );
+
+ cleanVObject( vcal );
+
+ return result;
+}
+
+VObject *VCalFormat::eventToVTodo(const Todo *anEvent)
+{
+ VObject *vtodo;
+ QString tmpStr;
+
+ vtodo = newVObject(VCTodoProp);
+
+ // due date
+ if (anEvent->hasDueDate()) {
+ tmpStr = qDateTimeToISO(anEvent->dtDue(),
+ !anEvent->doesFloat());
+ addPropValue(vtodo, VCDueProp, tmpStr.local8Bit());
+ }
+
+ // start date
+ if (anEvent->hasStartDate()) {
+ tmpStr = qDateTimeToISO(anEvent->dtStart(),
+ !anEvent->doesFloat());
+ addPropValue(vtodo, VCDTstartProp, tmpStr.local8Bit());
+ }
+
+ // creation date
+ tmpStr = qDateTimeToISO(anEvent->created());
+ addPropValue(vtodo, VCDCreatedProp, tmpStr.local8Bit());
+
+ // unique id
+ addPropValue(vtodo, VCUniqueStringProp,
+ anEvent->uid().local8Bit());
+
+ // revision
+ tmpStr.sprintf("%i", anEvent->revision());
+ addPropValue(vtodo, VCSequenceProp, tmpStr.local8Bit());
+
+ // last modification date
+ tmpStr = qDateTimeToISO(anEvent->lastModified());
+ addPropValue(vtodo, VCLastModifiedProp, tmpStr.local8Bit());
+
+ // organizer stuff
+ // @TODO: How about the common name?
+ tmpStr = "MAILTO:" + anEvent->organizer().email();
+ addPropValue(vtodo, ICOrganizerProp, tmpStr.local8Bit());
+
+ // attendees
+ if ( anEvent->attendeeCount() > 0 ) {
+ Attendee::List::ConstIterator it;
+ Attendee *curAttendee;
+ for ( it = anEvent->attendees().begin(); it != anEvent->attendees().end();
+ ++it ) {
+ curAttendee = *it;
+ if (!curAttendee->email().isEmpty() &&
+ !curAttendee->name().isEmpty())
+ tmpStr = "MAILTO:" + curAttendee->name() + " <" +
+ curAttendee->email() + ">";
+ else if (curAttendee->name().isEmpty())
+ tmpStr = "MAILTO: " + curAttendee->email();
+ else if (curAttendee->email().isEmpty())
+ tmpStr = "MAILTO: " + curAttendee->name();
+ else if (curAttendee->name().isEmpty() &&
+ curAttendee->email().isEmpty())
+ kdDebug(5800) << "warning! this Event has an attendee w/o name or email!" << endl;
+ VObject *aProp = addPropValue(vtodo, VCAttendeeProp, tmpStr.local8Bit());
+ addPropValue(aProp, VCRSVPProp, curAttendee->RSVP() ? "TRUE" : "FALSE");
+ addPropValue(aProp, VCStatusProp, writeStatus(curAttendee->status()));
+ }
+ }
+
+ // description BL:
+ if (!anEvent->description().isEmpty()) {
+ VObject *d = addPropValue(vtodo, VCDescriptionProp,
+ anEvent->description().local8Bit());
+ if (anEvent->description().find('\n') != -1)
+ addPropValue(d, VCEncodingProp, VCQuotedPrintableProp);
+ }
+
+ // summary
+ if (!anEvent->summary().isEmpty())
+ addPropValue(vtodo, VCSummaryProp, anEvent->summary().local8Bit());
+
+ // location
+ if (!anEvent->location().isEmpty())
+ addPropValue(vtodo, VCLocationProp, anEvent->location().local8Bit());
+
+ // completed
+ // status
+ // backward compatibility, KOrganizer used to interpret only these two values
+ addPropValue(vtodo, VCStatusProp, anEvent->isCompleted() ? "COMPLETED" :
+ "NEEDS_ACTION");
+ // completion date
+ if (anEvent->hasCompletedDate()) {
+ tmpStr = qDateTimeToISO(anEvent->completed());
+ addPropValue(vtodo, VCCompletedProp, tmpStr.local8Bit());
+ }
+
+ // priority
+ tmpStr.sprintf("%i",anEvent->priority());
+ addPropValue(vtodo, VCPriorityProp, tmpStr.local8Bit());
+
+ // related event
+ if (anEvent->relatedTo()) {
+ addPropValue(vtodo, VCRelatedToProp,
+ anEvent->relatedTo()->uid().local8Bit());
+ }
+
+ // categories
+ QStringList tmpStrList = anEvent->categories();
+ tmpStr = "";
+ QString catStr;
+ for ( QStringList::Iterator it = tmpStrList.begin();
+ it != tmpStrList.end();
+ ++it ) {
+ catStr = *it;
+ if (catStr[0] == ' ')
+ tmpStr += catStr.mid(1);
+ else
+ tmpStr += catStr;
+ // this must be a ';' character as the vCalendar specification requires!
+ // vcc.y has been hacked to translate the ';' to a ',' when the vcal is
+ // read in.
+ tmpStr += ";";
+ }
+ if (!tmpStr.isEmpty()) {
+ tmpStr.truncate(tmpStr.length()-1);
+ addPropValue(vtodo, VCCategoriesProp, tmpStr.local8Bit());
+ }
+
+ // alarm stuff
+ kdDebug(5800) << "vcalformat::eventToVTodo was called" << endl;
+ Alarm::List::ConstIterator it;
+ for ( it = anEvent->alarms().begin(); it != anEvent->alarms().end(); ++it ) {
+ Alarm *alarm = *it;
+ if (alarm->enabled()) {
+ VObject *a = addProp(vtodo, VCDAlarmProp);
+ tmpStr = qDateTimeToISO(alarm->time());
+ addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
+ addPropValue(a, VCRepeatCountProp, "1");
+ addPropValue(a, VCDisplayStringProp, "beep!");
+ if (alarm->type() == Alarm::Audio) {
+ a = addProp(vtodo, VCAAlarmProp);
+ addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
+ addPropValue(a, VCRepeatCountProp, "1");
+ addPropValue(a, VCAudioContentProp, QFile::encodeName(alarm->audioFile()));
+ }
+ else if (alarm->type() == Alarm::Procedure) {
+ a = addProp(vtodo, VCPAlarmProp);
+ addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
+ addPropValue(a, VCRepeatCountProp, "1");
+ addPropValue(a, VCProcedureNameProp, QFile::encodeName(alarm->programFile()));
+ }
+ }
+ }
+
+ if (anEvent->pilotId()) {
+ // pilot sync stuff
+ tmpStr.sprintf("%lu",anEvent->pilotId());
+ addPropValue(vtodo, KPilotIdProp, tmpStr.local8Bit());
+ tmpStr.sprintf("%i",anEvent->syncStatus());
+ addPropValue(vtodo, KPilotStatusProp, tmpStr.local8Bit());
+ }
+
+ return vtodo;
+}
+
+VObject* VCalFormat::eventToVEvent(const Event *anEvent)
+{
+ VObject *vevent;
+ QString tmpStr;
+
+ vevent = newVObject(VCEventProp);
+
+ // start and end time
+ tmpStr = qDateTimeToISO(anEvent->dtStart(),
+ !anEvent->doesFloat());
+ addPropValue(vevent, VCDTstartProp, tmpStr.local8Bit());
+
+ // events that have time associated but take up no time should
+ // not have both DTSTART and DTEND.
+ if (anEvent->dtStart() != anEvent->dtEnd()) {
+ tmpStr = qDateTimeToISO(anEvent->dtEnd(),
+ !anEvent->doesFloat());
+ addPropValue(vevent, VCDTendProp, tmpStr.local8Bit());
+ }
+
+ // creation date
+ tmpStr = qDateTimeToISO(anEvent->created());
+ addPropValue(vevent, VCDCreatedProp, tmpStr.local8Bit());
+
+ // unique id
+ addPropValue(vevent, VCUniqueStringProp,
+ anEvent->uid().local8Bit());
+
+ // revision
+ tmpStr.sprintf("%i", anEvent->revision());
+ addPropValue(vevent, VCSequenceProp, tmpStr.local8Bit());
+
+ // last modification date
+ tmpStr = qDateTimeToISO(anEvent->lastModified());
+ addPropValue(vevent, VCLastModifiedProp, tmpStr.local8Bit());
+
+ // attendee and organizer stuff
+ // TODO: What to do with the common name?
+ tmpStr = "MAILTO:" + anEvent->organizer().email();
+ addPropValue(vevent, ICOrganizerProp, tmpStr.local8Bit());
+
+ // TODO: Put this functionality into Attendee class
+ if ( anEvent->attendeeCount() > 0 ) {
+ Attendee::List::ConstIterator it;
+ for ( it = anEvent->attendees().begin(); it != anEvent->attendees().end();
+ ++it ) {
+ Attendee *curAttendee = *it;
+ if (!curAttendee->email().isEmpty() &&
+ !curAttendee->name().isEmpty())
+ tmpStr = "MAILTO:" + curAttendee->name() + " <" +
+ curAttendee->email() + ">";
+ else if (curAttendee->name().isEmpty())
+ tmpStr = "MAILTO: " + curAttendee->email();
+ else if (curAttendee->email().isEmpty())
+ tmpStr = "MAILTO: " + curAttendee->name();
+ else if (curAttendee->name().isEmpty() &&
+ curAttendee->email().isEmpty())
+ kdDebug(5800) << "warning! this Event has an attendee w/o name or email!" << endl;
+ VObject *aProp = addPropValue(vevent, VCAttendeeProp, tmpStr.local8Bit());
+ addPropValue(aProp, VCRSVPProp, curAttendee->RSVP() ? "TRUE" : "FALSE");
+ addPropValue(aProp, VCStatusProp, writeStatus(curAttendee->status()));
+ }
+ }
+
+ // recurrence rule stuff
+ const Recurrence *recur = anEvent->recurrence();
+ if ( recur->doesRecur() ) {
+ bool validRecur = true;
+ QString tmpStr2;
+ switch ( recur->recurrenceType() ) {
+ case Recurrence::rDaily:
+ tmpStr.sprintf("D%i ",recur->frequency());
+ break;
+ case Recurrence::rWeekly:
+ tmpStr.sprintf("W%i ",recur->frequency());
+ for (int i = 0; i < 7; i++ ) {
+ QBitArray days ( recur->days() );
+ if ( days.testBit(i) )
+ tmpStr += dayFromNum(i);
+ }
+ break;
+ case Recurrence::rMonthlyPos: {
+ tmpStr.sprintf("MP%i ", recur->frequency());
+ // write out all rMonthPos's
+ QValueList<RecurrenceRule::WDayPos> tmpPositions = recur->monthPositions();
+ for ( QValueListConstIterator<RecurrenceRule::WDayPos> posit = tmpPositions.begin();
+ posit != tmpPositions.end(); ++posit ) {
+ int pos = (*posit).pos();
+ tmpStr2.sprintf("%i", (pos>0) ? pos : (-pos) );
+ if ( pos < 0)
+ tmpStr2 += "- ";
+ else
+ tmpStr2 += "+ ";
+ tmpStr += tmpStr2;
+ tmpStr += dayFromNum( (*posit).day() - 1 );
+ }
+ break; }
+ case Recurrence::rMonthlyDay: {
+ tmpStr.sprintf("MD%i ", recur->frequency());
+ // write out all rMonthDays;
+ QValueList<int> tmpDays = recur->monthDays();
+ for ( QValueListIterator<int> tmpDay = tmpDays.begin();
+ tmpDay != tmpDays.end(); ++tmpDay ) {
+ tmpStr2.sprintf( "%i ", *tmpDay );
+ tmpStr += tmpStr2;
+ }
+ break; }
+ case Recurrence::rYearlyMonth: {
+ tmpStr.sprintf("YM%i ", recur->frequency());
+ // write out all the months;'
+ // TODO: Any way to write out the day within the month???
+ QValueList<int> months = recur->yearMonths();
+ for ( QValueListIterator<int> mit = months.begin();
+ mit != months.end(); ++mit ) {
+ tmpStr2.sprintf( "%i ", *mit );
+ tmpStr += tmpStr2;
+ }
+ break; }
+ case Recurrence::rYearlyDay: {
+ tmpStr.sprintf("YD%i ", recur->frequency());
+ // write out all the rYearNums;
+ QValueList<int> tmpDays = recur->yearDays();
+ for ( QValueListIterator<int> tmpDay = tmpDays.begin();
+ tmpDay != tmpDays.end(); ++tmpDay ) {
+ tmpStr2.sprintf( "%i ", *tmpDay );
+ tmpStr += tmpStr2;
+ }
+ break; }
+ default:
+ // TODO: Write rYearlyPos and arbitrary rules!
+ kdDebug(5800) << "ERROR, it should never get here in eventToVEvent!" << endl;
+ validRecur = false;
+ break;
+ } // switch
+
+ if (recur->duration() > 0) {
+ tmpStr2.sprintf("#%i",recur->duration());
+ tmpStr += tmpStr2;
+ } else if (recur->duration() == -1) {
+ tmpStr += "#0"; // defined as repeat forever
+ } else {
+ tmpStr += qDateTimeToISO(recur->endDateTime(), FALSE);
+ }
+ // Only write out the rrule if we have a valid recurrence (i.e. a known
+ // type in thee switch above)
+ if ( validRecur )
+ addPropValue(vevent,VCRRuleProp, tmpStr.local8Bit());
+
+ } // event repeats
+
+ // exceptions to recurrence
+ DateList dateList = recur->exDates();
+ DateList::ConstIterator it;
+ QString tmpStr2;
+
+ for (it = dateList.begin(); it != dateList.end(); ++it) {
+ tmpStr = qDateToISO(*it) + ";";
+ tmpStr2 += tmpStr;
+ }
+ if (!tmpStr2.isEmpty()) {
+ tmpStr2.truncate(tmpStr2.length()-1);
+ addPropValue(vevent, VCExDateProp, tmpStr2.local8Bit());
+ }
+
+ // description
+ if (!anEvent->description().isEmpty()) {
+ VObject *d = addPropValue(vevent, VCDescriptionProp,
+ anEvent->description().local8Bit());
+ if (anEvent->description().find('\n') != -1)
+ addPropValue(d, VCEncodingProp, VCQuotedPrintableProp);
+ }
+
+ // summary
+ if (!anEvent->summary().isEmpty())
+ addPropValue(vevent, VCSummaryProp, anEvent->summary().local8Bit());
+
+ // location
+ if (!anEvent->location().isEmpty())
+ addPropValue(vevent, VCLocationProp, anEvent->location().local8Bit());
+
+ // status
+// TODO: define Event status
+// addPropValue(vevent, VCStatusProp, anEvent->statusStr().local8Bit());
+
+ // secrecy
+ const char *text = 0;
+ switch (anEvent->secrecy()) {
+ case Incidence::SecrecyPublic:
+ text = "PUBLIC";
+ break;
+ case Incidence::SecrecyPrivate:
+ text = "PRIVATE";
+ break;
+ case Incidence::SecrecyConfidential:
+ text = "CONFIDENTIAL";
+ break;
+ }
+ if (text) {
+ addPropValue(vevent, VCClassProp, text);
+ }
+
+ // categories
+ QStringList tmpStrList = anEvent->categories();
+ tmpStr = "";
+ QString catStr;
+ for ( QStringList::Iterator it = tmpStrList.begin();
+ it != tmpStrList.end();
+ ++it ) {
+ catStr = *it;
+ if (catStr[0] == ' ')
+ tmpStr += catStr.mid(1);
+ else
+ tmpStr += catStr;
+ // this must be a ';' character as the vCalendar specification requires!
+ // vcc.y has been hacked to translate the ';' to a ',' when the vcal is
+ // read in.
+ tmpStr += ";";
+ }
+ if (!tmpStr.isEmpty()) {
+ tmpStr.truncate(tmpStr.length()-1);
+ addPropValue(vevent, VCCategoriesProp, tmpStr.local8Bit());
+ }
+
+ // attachments
+ // TODO: handle binary attachments!
+ Attachment::List attachments = anEvent->attachments();
+ Attachment::List::ConstIterator atIt;
+ for ( atIt = attachments.begin(); atIt != attachments.end(); ++atIt )
+ addPropValue( vevent, VCAttachProp, (*atIt)->uri().local8Bit() );
+
+ // resources
+ tmpStrList = anEvent->resources();
+ tmpStr = tmpStrList.join(";");
+ if (!tmpStr.isEmpty())
+ addPropValue(vevent, VCResourcesProp, tmpStr.local8Bit());
+
+ // alarm stuff
+ Alarm::List::ConstIterator it2;
+ for ( it2 = anEvent->alarms().begin(); it2 != anEvent->alarms().end(); ++it2 ) {
+ Alarm *alarm = *it2;
+ if (alarm->enabled()) {
+ VObject *a = addProp(vevent, VCDAlarmProp);
+ tmpStr = qDateTimeToISO(alarm->time());
+ addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
+ addPropValue(a, VCRepeatCountProp, "1");
+ addPropValue(a, VCDisplayStringProp, "beep!");
+ if (alarm->type() == Alarm::Audio) {
+ a = addProp(vevent, VCAAlarmProp);
+ addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
+ addPropValue(a, VCRepeatCountProp, "1");
+ addPropValue(a, VCAudioContentProp, QFile::encodeName(alarm->audioFile()));
+ }
+ if (alarm->type() == Alarm::Procedure) {
+ a = addProp(vevent, VCPAlarmProp);
+ addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
+ addPropValue(a, VCRepeatCountProp, "1");
+ addPropValue(a, VCProcedureNameProp, QFile::encodeName(alarm->programFile()));
+ }
+ }
+ }
+
+ // priority
+ tmpStr.sprintf("%i",anEvent->priority());
+ addPropValue(vevent, VCPriorityProp, tmpStr.local8Bit());
+
+ // transparency
+ tmpStr.sprintf("%i",anEvent->transparency());
+ addPropValue(vevent, VCTranspProp, tmpStr.local8Bit());
+
+ // related event
+ if (anEvent->relatedTo()) {
+ addPropValue(vevent, VCRelatedToProp,
+ anEvent->relatedTo()->uid().local8Bit());
+ }
+
+ if (anEvent->pilotId()) {
+ // pilot sync stuff
+ tmpStr.sprintf("%lu",anEvent->pilotId());
+ addPropValue(vevent, KPilotIdProp, tmpStr.local8Bit());
+ tmpStr.sprintf("%i",anEvent->syncStatus());
+ addPropValue(vevent, KPilotStatusProp, tmpStr.local8Bit());
+ }
+
+ return vevent;
+}
+
+Todo *VCalFormat::VTodoToEvent(VObject *vtodo)
+{
+ VObject *vo;
+ VObjectIterator voi;
+ char *s;
+
+ Todo *anEvent = new Todo;
+
+ // creation date
+ if ((vo = isAPropertyOf(vtodo, VCDCreatedProp)) != 0) {
+ anEvent->setCreated(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
+ deleteStr(s);
+ }
+
+ // unique id
+ vo = isAPropertyOf(vtodo, VCUniqueStringProp);
+ // while the UID property is preferred, it is not required. We'll use the
+ // default Event UID if none is given.
+ if (vo) {
+ anEvent->setUid(s = fakeCString(vObjectUStringZValue(vo)));
+ deleteStr(s);
+ }
+
+ // last modification date
+ if ((vo = isAPropertyOf(vtodo, VCLastModifiedProp)) != 0) {
+ anEvent->setLastModified(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
+ deleteStr(s);
+ }
+ else
+ anEvent->setLastModified(QDateTime(QDate::currentDate(),
+ QTime::currentTime()));
+
+ // organizer
+ // if our extension property for the event's ORGANIZER exists, add it.
+ if ((vo = isAPropertyOf(vtodo, ICOrganizerProp)) != 0) {
+ anEvent->setOrganizer( s = fakeCString(vObjectUStringZValue(vo) ) );
+ deleteStr(s);
+ } else {
+ anEvent->setOrganizer( mCalendar->getOwner() );
+ }
+
+ // attendees.
+ initPropIterator(&voi, vtodo);
+ while (moreIteration(&voi)) {
+ vo = nextVObject(&voi);
+ if (strcmp(vObjectName(vo), VCAttendeeProp) == 0) {
+ Attendee *a;
+ VObject *vp;
+ s = fakeCString(vObjectUStringZValue(vo));
+ QString tmpStr = QString::fromLocal8Bit(s);
+ deleteStr(s);
+ tmpStr = tmpStr.simplifyWhiteSpace();
+ int emailPos1, emailPos2;
+ if ((emailPos1 = tmpStr.find('<')) > 0) {
+ // both email address and name
+ emailPos2 = tmpStr.findRev('>');
+ a = new Attendee(tmpStr.left(emailPos1 - 1),
+ tmpStr.mid(emailPos1 + 1,
+ emailPos2 - (emailPos1 + 1)));
+ } else if (tmpStr.find('@') > 0) {
+ // just an email address
+ a = new Attendee(0, tmpStr);
+ } else {
+ // just a name
+ // WTF??? Replacing the spaces of a name and using this as email?
+ QString email = tmpStr.replace( ' ', '.' );
+ a = new Attendee(tmpStr,email);
+ }
+
+ // is there an RSVP property?
+ if ((vp = isAPropertyOf(vo, VCRSVPProp)) != 0)
+ a->setRSVP(vObjectStringZValue(vp));
+ // is there a status property?
+ if ((vp = isAPropertyOf(vo, VCStatusProp)) != 0)
+ a->setStatus(readStatus(vObjectStringZValue(vp)));
+ // add the attendee
+ anEvent->addAttendee(a);
+ }
+ }
+
+ // description for todo
+ if ((vo = isAPropertyOf(vtodo, VCDescriptionProp)) != 0) {
+ s = fakeCString(vObjectUStringZValue(vo));
+ anEvent->setDescription(QString::fromLocal8Bit(s));
+ deleteStr(s);
+ }
+
+ // summary
+ if ((vo = isAPropertyOf(vtodo, VCSummaryProp))) {
+ s = fakeCString(vObjectUStringZValue(vo));
+ anEvent->setSummary(QString::fromLocal8Bit(s));
+ deleteStr(s);
+ }
+
+
+ // location
+ if ((vo = isAPropertyOf(vtodo, VCLocationProp)) != 0) {
+ s = fakeCString(vObjectUStringZValue(vo));
+ anEvent->setLocation( QString::fromLocal8Bit(s) );
+ deleteStr(s);
+ }
+ // completed
+ // was: status
+ if ((vo = isAPropertyOf(vtodo, VCStatusProp)) != 0) {
+ s = fakeCString(vObjectUStringZValue(vo));
+ if (strcmp(s,"COMPLETED") == 0) {
+ anEvent->setCompleted(true);
+ } else {
+ anEvent->setCompleted(false);
+ }
+ deleteStr(s);
+ }
+ else
+ anEvent->setCompleted(false);
+
+ // completion date
+ if ((vo = isAPropertyOf(vtodo, VCCompletedProp)) != 0) {
+ anEvent->setCompleted(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
+ deleteStr(s);
+ }
+
+ // priority
+ if ((vo = isAPropertyOf(vtodo, VCPriorityProp))) {
+ anEvent->setPriority(atoi(s = fakeCString(vObjectUStringZValue(vo))));
+ deleteStr(s);
+ }
+
+ // due date
+ if ((vo = isAPropertyOf(vtodo, VCDueProp)) != 0) {
+ anEvent->setDtDue(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
+ deleteStr(s);
+ anEvent->setHasDueDate(true);
+ } else {
+ anEvent->setHasDueDate(false);
+ }
+
+ // start time
+ if ((vo = isAPropertyOf(vtodo, VCDTstartProp)) != 0) {
+ anEvent->setDtStart(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
+ // kdDebug(5800) << "s is " << // s << ", ISO is " << ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))).toString() << endl;
+ deleteStr(s);
+ anEvent->setHasStartDate(true);
+ } else {
+ anEvent->setHasStartDate(false);
+ }
+
+ /* alarm stuff */
+ //kdDebug(5800) << "vcalformat::VTodoToEvent called" << endl;
+ if ((vo = isAPropertyOf(vtodo, VCDAlarmProp))) {
+ Alarm* alarm = anEvent->newAlarm();
+ VObject *a;
+ if ((a = isAPropertyOf(vo, VCRunTimeProp))) {
+ alarm->setTime(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(a))));
+ deleteStr(s);
+ }
+ alarm->setEnabled(true);
+ if ((vo = isAPropertyOf(vtodo, VCPAlarmProp))) {
+ if ((a = isAPropertyOf(vo, VCProcedureNameProp))) {
+ s = fakeCString(vObjectUStringZValue(a));
+ alarm->setProcedureAlarm(QFile::decodeName(s));
+ deleteStr(s);
+ }
+ }
+ if ((vo = isAPropertyOf(vtodo, VCAAlarmProp))) {
+ if ((a = isAPropertyOf(vo, VCAudioContentProp))) {
+ s = fakeCString(vObjectUStringZValue(a));
+ alarm->setAudioAlarm(QFile::decodeName(s));
+ deleteStr(s);
+ }
+ }
+ }
+
+ // related todo
+ if ((vo = isAPropertyOf(vtodo, VCRelatedToProp)) != 0) {
+ anEvent->setRelatedToUid(s = fakeCString(vObjectUStringZValue(vo)));
+ deleteStr(s);
+ mTodosRelate.append(anEvent);
+ }
+
+ // categories
+ if ((vo = isAPropertyOf(vtodo, VCCategoriesProp)) != 0) {
+ s = fakeCString(vObjectUStringZValue(vo));
+ QString categories = QString::fromLocal8Bit(s);
+ deleteStr(s);
+ QStringList tmpStrList = QStringList::split( ';', categories );
+ anEvent->setCategories(tmpStrList);
+ }
+
+ /* PILOT SYNC STUFF */
+ if ((vo = isAPropertyOf(vtodo, KPilotIdProp))) {
+ anEvent->setPilotId(atoi(s = fakeCString(vObjectUStringZValue(vo))));
+ deleteStr(s);
+ }
+ else
+ anEvent->setPilotId(0);
+
+ if ((vo = isAPropertyOf(vtodo, KPilotStatusProp))) {
+ anEvent->setSyncStatus(atoi(s = fakeCString(vObjectUStringZValue(vo))));
+ deleteStr(s);
+ }
+ else
+ anEvent->setSyncStatus(Event::SYNCMOD);
+
+ return anEvent;
+}
+
+Event* VCalFormat::VEventToEvent(VObject *vevent)
+{
+ VObject *vo;
+ VObjectIterator voi;
+ char *s;
+
+ Event *anEvent = new Event;
+
+ // creation date
+ if ((vo = isAPropertyOf(vevent, VCDCreatedProp)) != 0) {
+ anEvent->setCreated(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
+ deleteStr(s);
+ }
+
+ // unique id
+ vo = isAPropertyOf(vevent, VCUniqueStringProp);
+ // while the UID property is preferred, it is not required. We'll use the
+ // default Event UID if none is given.
+ if (vo) {
+ anEvent->setUid(s = fakeCString(vObjectUStringZValue(vo)));
+ deleteStr(s);
+ }
+
+ // revision
+ // again NSCAL doesn't give us much to work with, so we improvise...
+ if ((vo = isAPropertyOf(vevent, VCSequenceProp)) != 0) {
+ anEvent->setRevision(atoi(s = fakeCString(vObjectUStringZValue(vo))));
+ deleteStr(s);
+ }
+ else
+ anEvent->setRevision(0);
+
+ // last modification date
+ if ((vo = isAPropertyOf(vevent, VCLastModifiedProp)) != 0) {
+ anEvent->setLastModified(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
+ deleteStr(s);
+ }
+ else
+ anEvent->setLastModified(QDateTime(QDate::currentDate(),
+ QTime::currentTime()));
+
+ // organizer
+ // if our extension property for the event's ORGANIZER exists, add it.
+ if ((vo = isAPropertyOf(vevent, ICOrganizerProp)) != 0) {
+ // FIXME: Also use the full name, not just the email address
+ anEvent->setOrganizer( s = fakeCString(vObjectUStringZValue(vo) ) );
+ deleteStr(s);
+ } else {
+ anEvent->setOrganizer( mCalendar->getOwner() );
+ }
+
+ // deal with attendees.
+ initPropIterator(&voi, vevent);
+ while (moreIteration(&voi)) {
+ vo = nextVObject(&voi);
+ if (strcmp(vObjectName(vo), VCAttendeeProp) == 0) {
+ Attendee *a;
+ VObject *vp;
+ s = fakeCString(vObjectUStringZValue(vo));
+ QString tmpStr = QString::fromLocal8Bit(s);
+ deleteStr(s);
+ tmpStr = tmpStr.simplifyWhiteSpace();
+ int emailPos1, emailPos2;
+ if ((emailPos1 = tmpStr.find('<')) > 0) {
+ // both email address and name
+ emailPos2 = tmpStr.findRev('>');
+ a = new Attendee(tmpStr.left(emailPos1 - 1),
+ tmpStr.mid(emailPos1 + 1,
+ emailPos2 - (emailPos1 + 1)));
+ } else if (tmpStr.find('@') > 0) {
+ // just an email address
+ a = new Attendee(0, tmpStr);
+ } else {
+ // just a name
+ QString email = tmpStr.replace( ' ', '.' );
+ a = new Attendee(tmpStr,email);
+ }
+
+ // is there an RSVP property?
+ if ((vp = isAPropertyOf(vo, VCRSVPProp)) != 0)
+ a->setRSVP(vObjectStringZValue(vp));
+ // is there a status property?
+ if ((vp = isAPropertyOf(vo, VCStatusProp)) != 0)
+ a->setStatus(readStatus(vObjectStringZValue(vp)));
+ // add the attendee
+ anEvent->addAttendee(a);
+ }
+ }
+
+ // This isn't strictly true. An event that doesn't have a start time
+ // or an end time doesn't "float", it has an anchor in time but it doesn't
+ // "take up" any time.
+ /*if ((isAPropertyOf(vevent, VCDTstartProp) == 0) ||
+ (isAPropertyOf(vevent, VCDTendProp) == 0)) {
+ anEvent->setFloats(TRUE);
+ } else {
+ }*/
+
+ anEvent->setFloats(FALSE);
+
+ // start time
+ if ((vo = isAPropertyOf(vevent, VCDTstartProp)) != 0) {
+ anEvent->setDtStart(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
+ // kdDebug(5800) << "s is " << // s << ", ISO is " << ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))).toString() << endl;
+ deleteStr(s);
+ if (anEvent->dtStart().time().isNull())
+ anEvent->setFloats(TRUE);
+ }
+
+ // stop time
+ if ((vo = isAPropertyOf(vevent, VCDTendProp)) != 0) {
+ anEvent->setDtEnd(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
+ deleteStr(s);
+ if (anEvent->dtEnd().time().isNull())
+ anEvent->setFloats(TRUE);
+ }
+
+ // at this point, there should be at least a start or end time.
+ // fix up for events that take up no time but have a time associated
+ if (!(vo = isAPropertyOf(vevent, VCDTstartProp)))
+ anEvent->setDtStart(anEvent->dtEnd());
+ if (!(vo = isAPropertyOf(vevent, VCDTendProp)))
+ anEvent->setDtEnd(anEvent->dtStart());
+
+ ///////////////////////////////////////////////////////////////////////////
+
+ // repeat stuff
+ if ((vo = isAPropertyOf(vevent, VCRRuleProp)) != 0) {
+ QString tmpStr = (s = fakeCString(vObjectUStringZValue(vo)));
+ deleteStr(s);
+ tmpStr.simplifyWhiteSpace();
+ tmpStr = tmpStr.upper();
+// kdDebug() <<" We have a recurrence rule: " << tmpStr<< endl;
+
+ // first, read the type of the recurrence
+ int typelen = 1;
+ uint type = Recurrence::rNone;
+ if ( tmpStr.left(1) == "D") {
+ type = Recurrence::rDaily;
+ } else if ( tmpStr.left(1) == "W") {
+ type = Recurrence::rWeekly;
+ } else {
+ typelen = 2;
+ if ( tmpStr.left(2) == "MP") {
+ type = Recurrence::rMonthlyPos;
+ } else if ( tmpStr.left(2) == "MD" ) {
+ type = Recurrence::rMonthlyDay;
+ } else if ( tmpStr.left(2) == "YM" ) {
+ type = Recurrence::rYearlyMonth;
+ } else if ( tmpStr.left(2) == "YD" ) {
+ type = Recurrence::rYearlyDay;
+ }
+ }
+
+ if ( type != Recurrence::rNone ) {
+// kdDebug() << " It's a supported type " << endl;
+
+ // Immediately after the type is the frequency
+ int index = tmpStr.find(' ');
+ int last = tmpStr.findRev(' ') + 1; // find last entry
+ int rFreq = tmpStr.mid(typelen, (index-1)).toInt();
+ ++index; // advance to beginning of stuff after freq
+
+ // Read the type-specific settings
+ switch ( type ) {
+ case Recurrence::rDaily:
+ anEvent->recurrence()->setDaily(rFreq);
+ break;
+
+ case Recurrence::rWeekly: {
+ QBitArray qba(7);
+ QString dayStr;
+ if( index == last ) {
+ // e.g. W1 #0
+ qba.setBit(anEvent->dtStart().date().dayOfWeek() - 1);
+ }
+ else {
+ // e.g. W1 SU #0
+ while (index < last) {
+ dayStr = tmpStr.mid(index, 3);
+ int dayNum = numFromDay(dayStr);
+ qba.setBit(dayNum);
+ index += 3; // advance to next day, or possibly "#"
+ }
+ }
+ anEvent->recurrence()->setWeekly( rFreq, qba );
+ break; }
+
+ case Recurrence::rMonthlyPos: {
+ anEvent->recurrence()->setMonthly( rFreq );
+
+ QBitArray qba(7);
+ short tmpPos;
+ if( index == last ) {
+ // e.g. MP1 #0
+ tmpPos = anEvent->dtStart().date().day()/7 + 1;
+ if( tmpPos == 5 )
+ tmpPos = -1;
+ qba.setBit(anEvent->dtStart().date().dayOfWeek() - 1);
+ anEvent->recurrence()->addMonthlyPos( tmpPos, qba );
+ }
+ else {
+ // e.g. MP1 1+ SU #0
+ while (index < last) {
+ tmpPos = tmpStr.mid(index,1).toShort();
+ index += 1;
+ if (tmpStr.mid(index,1) == "-")
+ // convert tmpPos to negative
+ tmpPos = 0 - tmpPos;
+ index += 2; // advance to day(s)
+ while (numFromDay(tmpStr.mid(index,3)) >= 0) {
+ int dayNum = numFromDay(tmpStr.mid(index,3));
+ qba.setBit(dayNum);
+ index += 3; // advance to next day, or possibly pos or "#"
+ }
+ anEvent->recurrence()->addMonthlyPos( tmpPos, qba );
+ qba.detach();
+ qba.fill(FALSE); // clear out
+ } // while != "#"
+ }
+ break;}
+
+ case Recurrence::rMonthlyDay:
+ anEvent->recurrence()->setMonthly( rFreq );
+ if( index == last ) {
+ // e.g. MD1 #0
+ short tmpDay = anEvent->dtStart().date().day();
+ anEvent->recurrence()->addMonthlyDate( tmpDay );
+ }
+ else {
+ // e.g. MD1 3 #0
+ while (index < last) {
+ int index2 = tmpStr.find(' ', index);
+ short tmpDay = tmpStr.mid(index, (index2-index)).toShort();
+ index = index2-1;
+ if (tmpStr.mid(index, 1) == "-")
+ tmpDay = 0 - tmpDay;
+ index += 2; // advance the index;
+ anEvent->recurrence()->addMonthlyDate( tmpDay );
+ } // while != #
+ }
+ break;
+
+ case Recurrence::rYearlyMonth:
+ anEvent->recurrence()->setYearly( rFreq );
+
+ if( index == last ) {
+ // e.g. YM1 #0
+ short tmpMonth = anEvent->dtStart().date().month();
+ anEvent->recurrence()->addYearlyMonth( tmpMonth );
+ }
+ else {
+ // e.g. YM1 3 #0
+ while (index < last) {
+ int index2 = tmpStr.find(' ', index);
+ short tmpMonth = tmpStr.mid(index, (index2-index)).toShort();
+ index = index2 + 1;
+ anEvent->recurrence()->addYearlyMonth( tmpMonth );
+ } // while != #
+ }
+ break;
+
+ case Recurrence::rYearlyDay:
+ anEvent->recurrence()->setYearly( rFreq );
+
+ if( index == last ) {
+ // e.g. YD1 #0
+ short tmpDay = anEvent->dtStart().date().dayOfYear();
+ anEvent->recurrence()->addYearlyDay( tmpDay );
+ }
+ else {
+ // e.g. YD1 123 #0
+ while (index < last) {
+ int index2 = tmpStr.find(' ', index);
+ short tmpDay = tmpStr.mid(index, (index2-index)).toShort();
+ index = index2+1;
+ anEvent->recurrence()->addYearlyDay( tmpDay );
+ } // while != #
+ }
+ break;
+
+ default: break;
+ }
+
+ // find the last field, which is either the duration or the end date
+ index = last;
+ if ( tmpStr.mid(index,1) == "#") {
+ // Nr of occurrences
+ index++;
+ int rDuration = tmpStr.mid(index, tmpStr.length()-index).toInt();
+ if ( rDuration > 0 )
+ anEvent->recurrence()->setDuration( rDuration );
+ } else if ( tmpStr.find('T', index) != -1 ) {
+ QDate rEndDate = (ISOToQDateTime(tmpStr.mid(index, tmpStr.length()-index))).date();
+ anEvent->recurrence()->setEndDateTime( rEndDate );
+ }
+// anEvent->recurrence()->dump();
+
+ } else {
+ kdDebug(5800) << "we don't understand this type of recurrence!" << endl;
+ } // if known recurrence type
+ } // repeats
+
+
+ // recurrence exceptions
+ if ((vo = isAPropertyOf(vevent, VCExDateProp)) != 0) {
+ s = fakeCString(vObjectUStringZValue(vo));
+ QStringList exDates = QStringList::split(",",s);
+ QStringList::ConstIterator it;
+ for(it = exDates.begin(); it != exDates.end(); ++it ) {
+ anEvent->recurrence()->addExDate(ISOToQDate(*it));
+ }
+ deleteStr(s);
+ }
+
+ // summary
+ if ((vo = isAPropertyOf(vevent, VCSummaryProp))) {
+ s = fakeCString(vObjectUStringZValue(vo));
+ anEvent->setSummary(QString::fromLocal8Bit(s));
+ deleteStr(s);
+ }
+
+ // description
+ if ((vo = isAPropertyOf(vevent, VCDescriptionProp)) != 0) {
+ s = fakeCString(vObjectUStringZValue(vo));
+ if (!anEvent->description().isEmpty()) {
+ anEvent->setDescription(anEvent->description() + "\n" +
+ QString::fromLocal8Bit(s));
+ } else {
+ anEvent->setDescription(QString::fromLocal8Bit(s));
+ }
+ deleteStr(s);
+ }
+
+ // location
+ if ((vo = isAPropertyOf(vevent, VCLocationProp)) != 0) {
+ s = fakeCString(vObjectUStringZValue(vo));
+ anEvent->setLocation( QString::fromLocal8Bit(s) );
+ deleteStr(s);
+ }
+
+ // some stupid vCal exporters ignore the standard and use Description
+ // instead of Summary for the default field. Correct for this.
+ if (anEvent->summary().isEmpty() &&
+ !(anEvent->description().isEmpty())) {
+ QString tmpStr = anEvent->description().simplifyWhiteSpace();
+ anEvent->setDescription("");
+ anEvent->setSummary(tmpStr);
+ }
+
+#if 0
+ // status
+ if ((vo = isAPropertyOf(vevent, VCStatusProp)) != 0) {
+ QString tmpStr(s = fakeCString(vObjectUStringZValue(vo)));
+ deleteStr(s);
+// TODO: Define Event status
+// anEvent->setStatus(tmpStr);
+ }
+ else
+// anEvent->setStatus("NEEDS ACTION");
+#endif
+
+ // secrecy
+ int secrecy = Incidence::SecrecyPublic;
+ if ((vo = isAPropertyOf(vevent, VCClassProp)) != 0) {
+ s = fakeCString(vObjectUStringZValue(vo));
+ if (strcmp(s,"PRIVATE") == 0) {
+ secrecy = Incidence::SecrecyPrivate;
+ } else if (strcmp(s,"CONFIDENTIAL") == 0) {
+ secrecy = Incidence::SecrecyConfidential;
+ }
+ deleteStr(s);
+ }
+ anEvent->setSecrecy(secrecy);
+
+ // categories
+ if ((vo = isAPropertyOf(vevent, VCCategoriesProp)) != 0) {
+ s = fakeCString(vObjectUStringZValue(vo));
+ QString categories = QString::fromLocal8Bit(s);
+ deleteStr(s);
+ QStringList tmpStrList = QStringList::split( ',', categories );
+ anEvent->setCategories(tmpStrList);
+ }
+
+ // attachments
+ initPropIterator(&voi, vevent);
+ while (moreIteration(&voi)) {
+ vo = nextVObject(&voi);
+ if (strcmp(vObjectName(vo), VCAttachProp) == 0) {
+ s = fakeCString(vObjectUStringZValue(vo));
+ anEvent->addAttachment(new Attachment(QString(s)));
+ deleteStr(s);
+ }
+ }
+
+ // resources
+ if ((vo = isAPropertyOf(vevent, VCResourcesProp)) != 0) {
+ QString resources = (s = fakeCString(vObjectUStringZValue(vo)));
+ deleteStr(s);
+ QStringList tmpStrList = QStringList::split( ';', resources );
+ anEvent->setResources(tmpStrList);
+ }
+
+ /* alarm stuff */
+ if ((vo = isAPropertyOf(vevent, VCDAlarmProp))) {
+ Alarm* alarm = anEvent->newAlarm();
+ VObject *a;
+ if ((a = isAPropertyOf(vo, VCRunTimeProp))) {
+ alarm->setTime(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(a))));
+ deleteStr(s);
+ }
+ alarm->setEnabled(true);
+ if ((vo = isAPropertyOf(vevent, VCPAlarmProp))) {
+ if ((a = isAPropertyOf(vo, VCProcedureNameProp))) {
+ s = fakeCString(vObjectUStringZValue(a));
+ alarm->setProcedureAlarm(QFile::decodeName(s));
+ deleteStr(s);
+ }
+ }
+ if ((vo = isAPropertyOf(vevent, VCAAlarmProp))) {
+ if ((a = isAPropertyOf(vo, VCAudioContentProp))) {
+ s = fakeCString(vObjectUStringZValue(a));
+ alarm->setAudioAlarm(QFile::decodeName(s));
+ deleteStr(s);
+ }
+ }
+ }
+
+ // priority
+ if ((vo = isAPropertyOf(vevent, VCPriorityProp))) {
+ anEvent->setPriority(atoi(s = fakeCString(vObjectUStringZValue(vo))));
+ deleteStr(s);
+ }
+
+ // transparency
+ if ((vo = isAPropertyOf(vevent, VCTranspProp)) != 0) {
+ int i = atoi(s = fakeCString(vObjectUStringZValue(vo)));
+ anEvent->setTransparency( i == 1 ? Event::Transparent : Event::Opaque );
+ deleteStr(s);
+ }
+
+ // related event
+ if ((vo = isAPropertyOf(vevent, VCRelatedToProp)) != 0) {
+ anEvent->setRelatedToUid(s = fakeCString(vObjectUStringZValue(vo)));
+ deleteStr(s);
+ mEventsRelate.append(anEvent);
+ }
+
+ /* PILOT SYNC STUFF */
+ if ((vo = isAPropertyOf(vevent, KPilotIdProp))) {
+ anEvent->setPilotId(atoi(s = fakeCString(vObjectUStringZValue(vo))));
+ deleteStr(s);
+ }
+ else
+ anEvent->setPilotId(0);
+
+ if ((vo = isAPropertyOf(vevent, KPilotStatusProp))) {
+ anEvent->setSyncStatus(atoi(s = fakeCString(vObjectUStringZValue(vo))));
+ deleteStr(s);
+ }
+ else
+ anEvent->setSyncStatus(Event::SYNCMOD);
+
+ return anEvent;
+}
+
+
+QString VCalFormat::qDateToISO(const QDate &qd)
+{
+ QString tmpStr;
+
+ Q_ASSERT(qd.isValid());
+
+ tmpStr.sprintf("%.2d%.2d%.2d",
+ qd.year(), qd.month(), qd.day());
+ return tmpStr;
+
+}
+
+/* Return the offset of the named zone as seconds. tt is a time
+ indicating the date for which you want the offset */
+int vcaltime_utc_offset( QDateTime ictt, QString tzid )
+{
+ // libical-0.23 stuff:
+ // struct icaltimetype tt = icaltime_from_timet( ictt.toTime_t(), false );
+ // return icaltime_utc_offset( tt, tzid.latin1() );
+ int daylight;
+ struct icaltimetype tt = icaltime_from_timet( ictt.toTime_t(), false );
+ //source says this is DEPRECATED, but it doesn't say what to use instead
+ //how to handle failure from icaltimezone_get_builtin_timezone_from_tzid()?
+ return icaltimezone_get_utc_offset(
+ icaltimezone_get_builtin_timezone( tzid.latin1() ),
+ &tt, &daylight );
+}
+
+QString VCalFormat::qDateTimeToISO(const QDateTime &qdt, bool zulu)
+{
+ QString tmpStr;
+
+ Q_ASSERT(qdt.date().isValid());
+ Q_ASSERT(qdt.time().isValid());
+ if (zulu) {
+ QDateTime tmpDT(qdt);
+ // correct to GMT:
+ tmpDT = tmpDT.addSecs(-vcaltime_utc_offset( tmpDT, mCalendar->timeZoneId()));
+ tmpStr.sprintf( "%.2d%.2d%.2dT%.2d%.2d%.2dZ",
+ tmpDT.date().year(), tmpDT.date().month(),
+ tmpDT.date().day(), tmpDT.time().hour(),
+ tmpDT.time().minute(), tmpDT.time().second());
+ } else {
+ tmpStr.sprintf( "%.2d%.2d%.2dT%.2d%.2d%.2d",
+ qdt.date().year(), qdt.date().month(),
+ qdt.date().day(), qdt.time().hour(),
+ qdt.time().minute(), qdt.time().second());
+ }
+ return tmpStr;
+}
+
+QDateTime VCalFormat::ISOToQDateTime(const QString & dtStr)
+{
+ QDate tmpDate;
+ QTime tmpTime;
+ QString tmpStr;
+ int year, month, day, hour, minute, second;
+
+ tmpStr = dtStr;
+ year = tmpStr.left(4).toInt();
+ month = tmpStr.mid(4,2).toInt();
+ day = tmpStr.mid(6,2).toInt();
+ hour = tmpStr.mid(9,2).toInt();
+ minute = tmpStr.mid(11,2).toInt();
+ second = tmpStr.mid(13,2).toInt();
+ tmpDate.setYMD(year, month, day);
+ tmpTime.setHMS(hour, minute, second);
+
+ Q_ASSERT(tmpDate.isValid());
+ Q_ASSERT(tmpTime.isValid());
+ QDateTime tmpDT(tmpDate, tmpTime);
+ // correct for GMT if string is in Zulu format
+ if (dtStr.at(dtStr.length()-1) == 'Z') {
+ tmpDT = tmpDT.addSecs(vcaltime_utc_offset( tmpDT, mCalendar->timeZoneId()));
+ }
+ return tmpDT;
+}
+
+QDate VCalFormat::ISOToQDate(const QString &dateStr)
+{
+ int year, month, day;
+
+ year = dateStr.left(4).toInt();
+ month = dateStr.mid(4,2).toInt();
+ day = dateStr.mid(6,2).toInt();
+
+ return(QDate(year, month, day));
+}
+
+// take a raw vcalendar (i.e. from a file on disk, clipboard, etc. etc.
+// and break it down from it's tree-like format into the dictionary format
+// that is used internally in the VCalFormat.
+void VCalFormat::populate(VObject *vcal)
+{
+ // this function will populate the caldict dictionary and other event
+ // lists. It turns vevents into Events and then inserts them.
+
+ VObjectIterator i;
+ VObject *curVO, *curVOProp;
+ Event *anEvent;
+
+ if ((curVO = isAPropertyOf(vcal, ICMethodProp)) != 0) {
+ char *methodType = 0;
+ methodType = fakeCString(vObjectUStringZValue(curVO));
+ kdDebug(5800) << "This calendar is an iTIP transaction of type '"
+ << methodType << "'" << endl;
+ deleteStr(methodType);
+ }
+
+ // warn the user that we might have trouble reading non-known calendar.
+ if ((curVO = isAPropertyOf(vcal, VCProdIdProp)) != 0) {
+ char *s = fakeCString(vObjectUStringZValue(curVO));
+ if (strcmp(productId().local8Bit(), s) != 0)
+ kdDebug(5800) << "This vCalendar file was not created by KOrganizer "
+ "or any other product we support. Loading anyway..." << endl;
+ mLoadedProductId = s;
+ deleteStr(s);
+ }
+
+ // warn the user we might have trouble reading this unknown version.
+ if ((curVO = isAPropertyOf(vcal, VCVersionProp)) != 0) {
+ char *s = fakeCString(vObjectUStringZValue(curVO));
+ if (strcmp(_VCAL_VERSION, s) != 0)
+ kdDebug(5800) << "This vCalendar file has version " << s
+ << "We only support " << _VCAL_VERSION << endl;
+ deleteStr(s);
+ }
+
+#if 0
+ // set the time zone (this is a property of the view, so just discard!)
+ if ((curVO = isAPropertyOf(vcal, VCTimeZoneProp)) != 0) {
+ char *s = fakeCString(vObjectUStringZValue(curVO));
+ mCalendar->setTimeZone(s);
+ deleteStr(s);
+ }
+#endif
+
+ // Store all events with a relatedTo property in a list for post-processing
+ mEventsRelate.clear();
+ mTodosRelate.clear();
+
+ initPropIterator(&i, vcal);
+
+ // go through all the vobjects in the vcal
+ while (moreIteration(&i)) {
+ curVO = nextVObject(&i);
+
+ /************************************************************************/
+
+ // now, check to see that the object is an event or todo.
+ if (strcmp(vObjectName(curVO), VCEventProp) == 0) {
+
+ if ((curVOProp = isAPropertyOf(curVO, KPilotStatusProp)) != 0) {
+ char *s;
+ s = fakeCString(vObjectUStringZValue(curVOProp));
+ // check to see if event was deleted by the kpilot conduit
+ if (atoi(s) == Event::SYNCDEL) {
+ deleteStr(s);
+ kdDebug(5800) << "skipping pilot-deleted event" << endl;
+ goto SKIP;
+ }
+ deleteStr(s);
+ }
+
+ // this code checks to see if we are trying to read in an event
+ // that we already find to be in the calendar. If we find this
+ // to be the case, we skip the event.
+ if ((curVOProp = isAPropertyOf(curVO, VCUniqueStringProp)) != 0) {
+ char *s = fakeCString(vObjectUStringZValue(curVOProp));
+ QString tmpStr(s);
+ deleteStr(s);
+
+ if (mCalendar->incidence(tmpStr)) {
+ goto SKIP;
+ }
+ }
+
+ if ((!(curVOProp = isAPropertyOf(curVO, VCDTstartProp))) &&
+ (!(curVOProp = isAPropertyOf(curVO, VCDTendProp)))) {
+ kdDebug(5800) << "found a VEvent with no DTSTART and no DTEND! Skipping..." << endl;
+ goto SKIP;
+ }
+
+ anEvent = VEventToEvent(curVO);
+ // we now use addEvent instead of insertEvent so that the
+ // signal/slot get connected.
+ if (anEvent) {
+ if ( !anEvent->dtStart().isValid() || !anEvent->dtEnd().isValid() ) {
+ kdDebug(5800) << "VCalFormat::populate(): Event has invalid dates."
+ << endl;
+ } else {
+ mCalendar->addEvent(anEvent);
+ }
+ } else {
+ // some sort of error must have occurred while in translation.
+ goto SKIP;
+ }
+ } else if (strcmp(vObjectName(curVO), VCTodoProp) == 0) {
+ Todo *aTodo = VTodoToEvent(curVO);
+ mCalendar->addTodo(aTodo);
+ } else if ((strcmp(vObjectName(curVO), VCVersionProp) == 0) ||
+ (strcmp(vObjectName(curVO), VCProdIdProp) == 0) ||
+ (strcmp(vObjectName(curVO), VCTimeZoneProp) == 0)) {
+ // do nothing, we know these properties and we want to skip them.
+ // we have either already processed them or are ignoring them.
+ ;
+ } else {
+ kdDebug(5800) << "Ignoring unknown vObject \"" << vObjectName(curVO) << "\"" << endl;
+ }
+ SKIP:
+ ;
+ } // while
+
+ // Post-Process list of events with relations, put Event objects in relation
+ Event::List::ConstIterator eIt;
+ for ( eIt = mEventsRelate.begin(); eIt != mEventsRelate.end(); ++eIt ) {
+ (*eIt)->setRelatedTo( mCalendar->incidence( (*eIt)->relatedToUid() ) );
+ }
+ Todo::List::ConstIterator tIt;
+ for ( tIt = mTodosRelate.begin(); tIt != mTodosRelate.end(); ++tIt ) {
+ (*tIt)->setRelatedTo( mCalendar->incidence( (*tIt)->relatedToUid() ) );
+ }
+}
+
+const char *VCalFormat::dayFromNum(int day)
+{
+ const char *days[7] = { "MO ", "TU ", "WE ", "TH ", "FR ", "SA ", "SU " };
+
+ return days[day];
+}
+
+int VCalFormat::numFromDay(const QString &day)
+{
+ if (day == "MO ") return 0;
+ if (day == "TU ") return 1;
+ if (day == "WE ") return 2;
+ if (day == "TH ") return 3;
+ if (day == "FR ") return 4;
+ if (day == "SA ") return 5;
+ if (day == "SU ") return 6;
+
+ return -1; // something bad happened. :)
+}
+
+Attendee::PartStat VCalFormat::readStatus(const char *s) const
+{
+ QString statStr = s;
+ statStr = statStr.upper();
+ Attendee::PartStat status;
+
+ if (statStr == "X-ACTION")
+ status = Attendee::NeedsAction;
+ else if (statStr == "NEEDS ACTION")
+ status = Attendee::NeedsAction;
+ else if (statStr== "ACCEPTED")
+ status = Attendee::Accepted;
+ else if (statStr== "SENT")
+ status = Attendee::NeedsAction;
+ else if (statStr== "TENTATIVE")
+ status = Attendee::Tentative;
+ else if (statStr== "CONFIRMED")
+ status = Attendee::Accepted;
+ else if (statStr== "DECLINED")
+ status = Attendee::Declined;
+ else if (statStr== "COMPLETED")
+ status = Attendee::Completed;
+ else if (statStr== "DELEGATED")
+ status = Attendee::Delegated;
+ else {
+ kdDebug(5800) << "error setting attendee mStatus, unknown mStatus!" << endl;
+ status = Attendee::NeedsAction;
+ }
+
+ return status;
+}
+
+QCString VCalFormat::writeStatus(Attendee::PartStat status) const
+{
+ switch(status) {
+ default:
+ case Attendee::NeedsAction:
+ return "NEEDS ACTION";
+ break;
+ case Attendee::Accepted:
+ return "ACCEPTED";
+ break;
+ case Attendee::Declined:
+ return "DECLINED";
+ break;
+ case Attendee::Tentative:
+ return "TENTATIVE";
+ break;
+ case Attendee::Delegated:
+ return "DELEGATED";
+ break;
+ case Attendee::Completed:
+ return "COMPLETED";
+ break;
+ case Attendee::InProcess:
+ return "NEEDS ACTION";
+ break;
+ }
+}
diff --git a/libkcal/vcalformat.h b/libkcal/vcalformat.h
new file mode 100644
index 00000000..039ecfc2
--- /dev/null
+++ b/libkcal/vcalformat.h
@@ -0,0 +1,121 @@
+/*
+ This file is part of libkcal.
+
+ Copyright (c) 1998 Preston Brown <pbrown@kde.org>
+ Copyright (c) 2001-2003 Cornelius Schumacher <schumacher@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KCAL_VCALFORMAT_H
+#define KCAL_VCALFORMAT_H
+
+#include "calformat.h"
+
+#include "todo.h"
+#include "event.h"
+#include "libkcal_export.h"
+
+#define _VCAL_VERSION "1.0"
+
+class VObject;
+
+namespace KCal {
+
+/**
+ This class implements the vCalendar format. It provides methods for
+ loading/saving/converting vCalendar format data into the internal KOrganizer
+ representation as Calendar and Events.
+
+ @short vCalendar format implementation
+*/
+class LIBKCAL_EXPORT VCalFormat : public CalFormat
+{
+ public:
+ VCalFormat();
+ virtual ~VCalFormat();
+
+ /**
+ Loads a calendar on disk in vCalendar format into the given calendar.
+
+ @param calendar Calendar object the loaded data is stored into.
+ @param fileName Name of the vCalendar file on disk.
+ @return true on success, otherwise false
+ */
+ bool load( Calendar *calendar, const QString &fileName );
+ /**
+ Writes out the given calendar to disk in vCalendar format.
+
+ @param calendar Calendar object holding data to be written
+ @param fileName the name of the file
+ @return true on success, otherwise false
+ */
+ bool save(Calendar *calendar, const QString &fileName);
+
+ /**
+ Parse string and populate calendar with that information.
+ */
+ bool fromString( Calendar *, const QString & );
+ /**
+ Return calendar information as string.
+ */
+ QString toString( Calendar * );
+
+ protected:
+ /** translates a VObject of the TODO type into a Event */
+ Todo *VTodoToEvent(VObject *vtodo);
+ /** translates a VObject into a Event and returns a pointer to it. */
+ Event *VEventToEvent(VObject *vevent);
+ /** translate a Event into a VTodo-type VObject and return pointer */
+ VObject *eventToVTodo(const Todo *anEvent);
+ /** translate a Event into a VObject and returns a pointer to it. */
+ VObject* eventToVEvent(const Event *anEvent);
+
+ /** takes a QDate and returns a string in the format YYYYMMDDTHHMMSS */
+ QString qDateToISO(const QDate &);
+ /** takes a QDateTime and returns a string in format YYYYMMDDTHHMMSS */
+ QString qDateTimeToISO(const QDateTime &, bool zulu=TRUE);
+ /** takes a string in the format YYYYMMDDTHHMMSS and returns a
+ * valid QDateTime. */
+ QDateTime ISOToQDateTime(const QString & dtStr);
+ /** takes a string in the format YYYYMMDD and returns a
+ * valid QDate. */
+ QDate ISOToQDate(const QString & dtStr);
+ /** takes a vCalendar tree of VObjects, and puts all of them that have
+ * the "event" property into the dictionary, todos in the todo-list, etc. */
+ void populate(VObject *vcal);
+
+ /** takes a number 0 - 6 and returns the two letter string of that day,
+ * i.e. MO, TU, WE, etc. */
+ const char *dayFromNum(int day);
+ /** the reverse of the above function. */
+ int numFromDay(const QString &day);
+
+ Attendee::PartStat readStatus(const char *s) const;
+ QCString writeStatus(Attendee::PartStat status) const;
+
+ private:
+ Calendar *mCalendar;
+
+ Event::List mEventsRelate; // events with relations
+ Todo::List mTodosRelate; // todos with relations
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff --git a/libkcal/versit/Makefile.am b/libkcal/versit/Makefile.am
new file mode 100644
index 00000000..0f283ede
--- /dev/null
+++ b/libkcal/versit/Makefile.am
@@ -0,0 +1,6 @@
+# $Id$
+
+noinst_LTLIBRARIES = libversit.la
+
+libversit_la_SOURCES = vcc.c vobject.c
+
diff --git a/libkcal/versit/port.h b/libkcal/versit/port.h
new file mode 100644
index 00000000..afc16dd4
--- /dev/null
+++ b/libkcal/versit/port.h
@@ -0,0 +1,75 @@
+/***************************************************************************
+(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International
+Business Machines Corporation and Siemens Rolm Communications Inc.
+
+For purposes of this license notice, the term Licensors shall mean,
+collectively, Apple Computer, Inc., AT&T Corp., International
+Business Machines Corporation and Siemens Rolm Communications Inc.
+The term Licensor shall mean any of the Licensors.
+
+Subject to acceptance of the following conditions, permission is hereby
+granted by Licensors without the need for written agreement and without
+license or royalty fees, to use, copy, modify and distribute this
+software for any purpose.
+
+The above copyright notice and the following four paragraphs must be
+reproduced in all copies of this software and any software including
+this software.
+
+THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE
+ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR
+MODIFICATIONS.
+
+IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT,
+INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
+OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
+
+EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.
+
+The software is provided with RESTRICTED RIGHTS. Use, duplication, or
+disclosure by the government are subject to restrictions set forth in
+DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
+
+***************************************************************************/
+
+#ifndef __PORT_H__
+#define __PORT_H__ 1
+
+#if defined(__CPLUSPLUS__) || defined(__cplusplus)
+extern "C" {
+#endif
+
+#define vCardClipboardFormat "+//ISBN 1-887687-00-9::versit::PDI//vCard"
+#define vCalendarClipboardFormat "+//ISBN 1-887687-00-9::versit::PDI//vCalendar"
+
+/* The above strings vCardClipboardFormat and vCalendarClipboardFormat
+are globally unique IDs which can be used to generate clipboard format
+ID's as per the requirements of a specific platform. For example, in
+Windows they are used as the parameter in a call to RegisterClipboardFormat.
+For example:
+
+ CLIPFORMAT foo = RegisterClipboardFormat(vCardClipboardFormat);
+
+*/
+
+#define vCardMimeType "text/x-vCard"
+#define vCalendarMimeType "text/x-vCalendar"
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#define Parse_Debug(t)
+
+#if defined(__CPLUSPLUS__) || defined(__cplusplus)
+}
+#endif
+
+#endif /* __PORT_H__ */
diff --git a/libkcal/versit/readme.txt b/libkcal/versit/readme.txt
new file mode 100644
index 00000000..5f38fe00
--- /dev/null
+++ b/libkcal/versit/readme.txt
@@ -0,0 +1,944 @@
+The vCard/vCalendar C interface is implemented in the set
+of files as follows:
+
+vcc.y, yacc source, and vcc.c, the yacc output you will use
+implements the core parser
+
+vobject.c implements an API that insulates the caller from
+the parser and changes in the vCard/vCalendar BNF
+
+port.h defines compilation environment dependent stuff
+
+vcc.h and vobject.h are header files for their .c counterparts
+
+vcaltmp.h and vcaltmp.c implement vCalendar "macro" functions
+which you may find useful.
+
+test.c is a standalone test driver that exercises some of
+the features of the APIs provided. Invoke test.exe on a
+VCARD/VCALENDAR input text file and you will see the pretty
+print output of the internal representation (this pretty print
+output should give you a good idea of how the internal
+representation looks like -- there is one such output in the
+following too). Also, a file with the .out suffix is generated
+to show that the internal representation can be written back
+in the original text format.
+
+-----------------------------------------------------------------
+
+
+ VObject for VCard/VCalendar
+
+Table of Contents
+=================
+1. VObject
+2. Internal Representations of VCard/VCalendar
+3. Iterating Through VObject's Properties or Values
+4. Pretty Printing a VObject Tree
+5. Building A VObject Representation of A VCard/VCalendar
+6. Converting A VObject Representation Into Its Textual Representation
+7. Miscellaneous Notes On VObject APIs usages
+8. Brief descriptions of each APIs
+9. Additional Programming Notes.
+
+This document is mainly about the VObject and its APIs. The main
+use of a VObject is to represent a VCard or a VCalendar inside
+a program. However, its use is not limited to aforemention as it
+can represent an arbitrary information that makes up of a tree or
+forest of properties/values.
+
+1. VObject
+ =======
+A VObject can have a name (id) and a list of associated properties and
+a value. Each property is itself a VObject.
+
+2. Internal Representations of VCard/VCalendar
+ ===========================================
+A list of VCard or a VCalendar is represented by a list of VObjects.
+The name (id) of the VObjects in the list is either VCCardProp or
+VCCalProp. Each of these VObjects can have a list of properties.
+Since a property is represented as a VObject, each of these properties
+can have a name, a list of properties, and a value.
+
+For example, the input file "vobject.vcf":
+
+BEGIN:VCARD
+N:Alden;Roland
+FN:Roland H. Alden
+ORG:AT&T;Versit Project Office
+TITLE:Consultant
+EMAIL;WORK;PREF;INTERNET:sf!rincon!ralden@alden.attmail.com
+EMAIL;INTERNET:ralden@sfgate.com
+EMAIL;MCIMail:242-2200
+LABEL;DOM;POSTAL;PARCEL;HOME;WORK;QUOTED-PRINTABLE:Roland H. Alden=0A=
+Suite 2208=0A=
+One Pine Street=0A=
+San Francisco, CA 94111
+LABEL;POSTAL;PARCEL;HOME;WORK;QUOTED-PRINTABLE:Roland H. Alden=0A=
+Suite 2208=0A=
+One Pine Street=0A=
+San Francisco, CA 94111=0A=
+U.S.A.
+TEL;WORK;PREF;MSG:+1 415 296 9106
+TEL;WORK;FAX:+1 415 296 9016
+TEL;MSG;CELL:+1 415 608 5981
+ADR:;Suite 2208;One Pine Street;San Francisco;CA;94111;U.S.A.
+SOUND:ROW-LAND H ALL-DIN
+LOGO;GIF;BASE64:
+ R0lGODdhpgBOAMQAAP///+/v797e3s7Ozr29va2trZycnIyMjHt7e2NjY1JSUkJC
+ QjExMSEhIRAQEO///87v9973/73n95zW71K13jGl1nvG50Kt3iGc1gCMzq3e94zO
+ 7xCU1nO952O15wAAACwAAAAApgBOAAAF/yAgjmRpnmiqrmzrvnAsz3Rt33iu73zv
+ /8CgcEj8QTaeywWTyWCUno2kSK0KI5tLc8vtNi+WiHVMlj0mFK96nalsxOW4fPSw
+ cNj4tQc+7xcjGh4WExJTJYUTFkp3eU0eEH6RkpOUlTARhRoWm5ydFpCWoS0QEqAu
+ ARKaHRcVjV0borEoFl0cSre4Sq67FA+yvwAeTU8XHZ7HmxS6u2wVfMCVpAE3pJoW
+ ylrMptDcOqSF4OHg3eQ5pInInb7lcc86mNbLzBXsZbRfUOn6ucyNHvVWJHCpQFDf
+ MWwEEzLqx2YCQCqF3OnItClJNmYcJD7cSAKTuI/gtnEcOQKkyVIk6/+ds5CkFcMM
+ 61LiENikwi1jBnNyuvUSjwWZOS5uIZarqNFcNl32XMMB6I06GgoJ+bZp1ZKeDl8E
+ +MC1K1cBIhZ4HUu2LAsCZdOWRQDt20lxIlccSHsgrNq7Xc/ixcsWmNu34WKyYJCW
+ gQjCe9XqTZy2L4pv04gg2sSKSc8OLgTcBSuWsdkVaD2TdXyiQxebFyjo1Gnx6tJm
+ LuaqrdtZtNfFtruSNmF5IKujwIsmJbjwtRqNJhrcNVw79wcRAgogmE4ArIjQzj/s
+ JvHAGCFDQR4UqigPK4sBe62XwO51OwADiMcqUG+iOdcFAL+hW20BfAoEexlwAnu6
+ mZDAXQ1EVh//WfhxJB5gIbHgwFgOTOiVAgOuVQKAfKFg3weGwSBYFZMp4hpDGKyA
+ 3lgJKECWgiMQyBVpW+0V4oJjNfhCNkR1IgWEb21QlRK9GdfFCgeOZYBsXgm4noYj
+ GEBhAQHYh0J8XenoQnFGdrkUciJY6FUAK15ogozakcBhliKsyZWHDMZQ0wWC/Aim
+ DB6h01KRr/lXQgFxAqDcWDACgCZpUnrVQJtjwTnWjS6MWAYqqfDnSaEkJOlVXQBo
+ 2pWTMUJ53WgAuPncCR9q6VQMAYjZlXWJmknCoSUM2p4BC+SaKwG88hoZlvfFMM4f
+ hQh5TXkv+RklWYtC91mopJIAKFkJlDAW/wF25ShnLbeo5gmQ+1FGkJdrKCuCi2OR
+ BuwHBcwqKgABrMtVAgpem61XkLbAJ7n8uiIpvGVhO4KpH1QLbbpqLheZvQCkGoNL
+ thSzSTg2UGVBBzbtaxwKsYrmgLvRAlCmWgwMAADD66rKAgR3XlGspcdkZYK8ibU7
+ asgEl+XAyB8I7PCqMWiWncGGimpfAgO4ypXSPpOVLwsRCDJxRD2AoyeRRv5kApO5
+ fXwzwvfOKLKtaTWtbQxccmGLTZy8xYlVSvXbhbk0M2YzrYfJJ0K8m+V9NgxpyC04
+ UycI/aiuiH9Y8NftDUwWp1Wm5UABnAUKwwRsPFGBt4Oc9PZvGvNLwf8JOZt8Arpe
+ eY23yDovwIDiBX74NAsPVLDJj3Hh4JEExsKcjrlKf9DsCVx3ZfLqAKBuG1s/A90C
+ z2KjYHjjyPOdG1spz6BBUr+BcUxUb1nDCTa/VZD2Uv+YkLPAKJC9dNEh7628WgqI
+ ybzlaA+ufxMa6bxC6ciLUQLcx5UGIAAsAkDA6wQkOxrcY39yo4cQMNWCAPTKV1R4
+ wPkgaBxzOc8FtMiF1NoGoXBRJjgoPApmPsjCFlbMdzCM4TFy50IXxI2DPcHAv2rY
+ gghsEIeu8CAPW6ABIPYEFkOsAeaMyIz0JfGJUExBBGRIRX0IMYovWCIT1eBELNpA
+ i1vcgta8iANPCIQOghzQABl30J0tXqBla4wjFLFQxZzAUY42CIAd5OYBCuKxB2c4
+ I0b28EcrQKADgmSKB9RYyDhA4BqCxIBqrtjIMTwoFeCjYSU3KZMQAAA7
+
+BEGIN:VCALENDAR
+DCREATED:19960523T100522
+PRODID:-//Alden Roland/Hand Crafted In North Carolina//NONSGML Made By Hand//EN
+VERSION:0.3
+BEGIN:VEVENT
+START:19960523T120000
+END:19960523T130000
+SUBTYPE:PHONE CALL
+SUMMARY:VERSIT PDI PR Teleconference/Interview
+DESCRIPTION:VERSIT PDI PR Teleconference/Interview With Tom Streeter and Alden Roland
+END:VEVENT
+BEGIN:VEVENT
+START:19960523T113000
+END:19960523T115500
+SUBTYPE:LUNCH
+SUMMARY:Eat in the cafeteria today
+END:VEVENT
+END:VCALENDAR
+
+END:VCARD
+
+
+will conceptually be be represented as
+ vcard
+ VCNameProp
+ VCFamilyNameProp=Alden
+ VCGivenNameProp=Roland
+ VCFullNameProp=Roland H.Alden
+ ....
+
+note that
+ EMAIL;WORK;PREF;INTERNET:sf!rincon!ralden@alden.attmail.com
+will be represented as:
+ VCEmailAddress=sf!rincon!ralden@alden.attmail.com
+ VCWork
+ VCPreferred
+ VCInternet
+where the lower level properties are properties of the property
+VCEmailAddress.
+
+Groupings are flattened out in the VObject representation such
+that:
+ a.b:blah
+ a.c:blahblah
+are represented as:
+ b=blah
+ VCGrouping=a
+ c=blahblah
+ VCGrouping=a
+i.e. one can read the above as:
+ the property "b" has value "blah" and property "VCGrouping"
+ with the value "a".
+ the property "c" has value "blahblah" and property "VCGrouping"
+ with the value "a".
+likewise, multi-level groupings are flatten similarly. e.g.
+ a.b.c:blah
+ a.b.e:blahblah
+-->
+ c=blah
+ VCGrouping=b
+ VCGrouping=a
+ e=blahblah
+ VCGrouping=b
+ VCGrouping=a
+which read:
+ the property "c" has value "blah" and property "VCGrouping"
+ with the value "b" which has property "VCGrouping"
+ with value "a".
+ the property "e" has value "blahblah" and property "VCGrouping"
+ with the value "b" which has property "VCGrouping"
+ with value "a".
+
+3. Iterating Through VObject's Properties or Values
+ ================================================
+The following is a skeletal form of iterating through
+all properties of a vobject, o:
+
+ // assume the object of interest, o, is of type VObject
+ VObjectIterator i;
+ initPropIterator(&i,o);
+ while (moreIteration(&i)) {
+ VObject *each = nextVObject(&i);
+ // ... do something with "each" property
+ }
+
+Use the API vObjectName() to access a VObject's name.
+Use the API vObjectValueType() to determine if a VObject has
+ a value. For VCard/VCalendar application, you
+ should not need this function as practically
+ all values are either of type VCVT_USTRINGZ or
+ VCVT_RAW (i.e set by setVObjectUStringZValue and
+ setVObjectAnyValue APIs respectively), and the
+ value returned by calls to vObjectUStringZValue
+ and vObjectAnyValue are 0 if a VObject has no
+ value. (There is a minor exception where VObject with
+ VCDataSizeProp has value that is set by
+ setVObjectLongValue).
+Use the APIs vObject???Value() to access a VObject's value.
+ where ??? is the expected type.
+Use the APIs setvObject???Value() to set or modify a VObject's value.
+ where ??? is the expected type.
+Use the API isAPropertyOf() to query if a name match the name of
+ a property of a VObject. Since isAPropertyOf() return
+ the matching property, we can use that to retrieve
+ a property and subsequently the value of the property.
+
+4. Pretty Printing a VObject Tree
+ ==============================
+VObject tree can be pretty printed with the printVObject() function.
+The output of pretty printing a VObject representation of the input
+test file "vobject.vcf" is shown below. Note that the indentation
+indicates the tree hirerarchy where the immediate children nodes
+of a parent node is all at the same indentation level and the
+immediate children nodes are the immediate properties of the
+associated parent nodes. In the following, {N,FN,ORG,TITLE,...}
+are immediate properties of VCARD. {F and G} are properties of N
+with value {"Alden" and "Roland"} respectively; FN has no property
+but has the value "Roland H. Alden"; EMAIL has value and
+the properties WORK, PREF, and INTERNET.
+
+
+VCARD
+ N
+ F="Alden"
+ G="Roland"
+ FN="Roland H. Alden"
+ ORG
+ ORGNAME="AT&T"
+ OUN="Versit Project Office"
+ TITLE="Consultant"
+ EMAIL="sf!rincon!ralden@alden.attmail.com"
+ WORK
+ PREF
+ INTERNET
+ EMAIL="ralden@sfgate.com"
+ INTERNET
+ EMAIL="242-2200"
+ MCIMail
+ LABEL="Roland H. Alden
+ Suite 2208
+ One Pine Street
+ San Francisco, CA 94111"
+ DOM
+ POSTAL
+ PARCEL
+ HOME
+ WORK
+ QP
+ LABEL="Roland H. Alden
+ Suite 2208
+ One Pine Street
+ San Francisco, CA 94111
+ U.S.A."
+ POSTAL
+ PARCEL
+ HOME
+ WORK
+ QP
+ TEL="+1 415 296 9106"
+ WORK
+ PREF
+ MSG
+ TEL="+1 415 296 9016"
+ WORK
+ FAX
+ TEL="+1 415 608 5981"
+ MSG
+ CELL
+ ADR
+ EXT ADD="Suite 2208"
+ STREET="One Pine Street"
+ L="San Francisco"
+ R="CA"
+ PC="94111"
+ C="U.S.A."
+ SOUND="ROW-LAND H ALL-DIN"
+ LOGO=[raw data]
+ GIF
+ BASE64
+ DataSize=1482
+VCALENDAR
+ DCREATED="19960523T100522"
+ PRODID="-//Alden Roland/Hand Crafted In North Carolina//NONSGML Made By Hand//EN"
+ VERSION="0.3"
+ VEVENT
+ START="19960523T120000"
+ END="19960523T130000"
+ SUBTYPE="PHONE CALL"
+ SUMMARY="VERSIT PDI PR Teleconference/Interview"
+ DESCRIPTION="VERSIT PDI PR Teleconference/Interview With Tom Streeter and Alden Roland"
+ VEVENT
+ START="19960523T113000"
+ END="19960523T115500"
+ SUBTYPE="LUNCH"
+ SUMMARY="Eat in the cafeteria today"
+
+5. Building A VObject Representation of A VCard/VCalendar
+ ======================================================
+The parser in vcc.y converts an input file with one or more
+VCard/VCalendar that is in their textual representation
+into their corresponding VObject representation.
+
+VObject representation of a VCard/VCalendar can also be built
+directly with calls to the VObject building APIs. e.g.
+
+ VObject *prop;
+ VObject *vcard = newVObject(VCCardProp);
+ prop = addProp(vcard,VCNameProp);
+ addPropValue(prop,VCFamilyNameProp,"Alden");
+ addPropValue(prop,VCGivenNameProp,"Roland");
+ addPropValue(vcard,VCFullNameProp,"Roland H. Alden");
+ ....
+
+6. Converting A VObject Representation Into Its Textual Representation
+ ===================================================================
+The VObject representation can be converted back to its textual
+representation via the call to writeVObject() or writeMemVObject()
+API. e.g.
+ a. to write to a file:
+ // assume vcard is of type VObject
+ FILE *fp = fopen("alden.vcf","w");
+ writeVObject(fp,vcard);
+ a. to write to memory, and let the API allocate the required memory.
+ char* clipboard = writeVObject(0,0,vcard);
+ ... do something to clipboard
+ free(clipboard);
+ b. to write to a user allocated buffer:
+ char clipboard[16384];
+ int len = 16384;
+ char *buf = writeVObject(clipboard,&len,vcard);
+ ... buf will be equal to clipboard if the write
+ is successful otherwise 0.
+
+In the case of writing to memory, the memory buffer can be either
+allocated by the API or the user. If the user allocate the
+memory for the buffer, then the length of the buffer needs to be
+communicated to the API via a variable. The variable passed as
+the length argument will be overwritten with the actual size
+of the text output. A 0 return value from writeMemVObject()
+indicates an error which could be caused by overflowing the
+size of the buffer or lack of heap memory.
+
+7. Miscellaneous Notes On VObject APIs usages
+ ==========================================
+a. vcc.h -- contains basic interfaces to the parser:
+ VObject* Parse_MIME(const char *input, unsigned long len);
+ VObject* Parse_MIME_FromFile(FILE *file);
+ -- both of this return a null-terminated list of
+ VObject that is either a VCARD or VCALENDAR.
+ To iterate through this list, do
+ VObject *t, *v;
+ v = Parse_Mime_FromFile(fp);
+ while (v) {
+ // ... do something to v.
+ t = v;
+ v = nextVObjectInList(v);
+ cleanVObject(t);
+ }
+ note that call to cleanVObject will release
+ resource used to represent the VObject.
+
+b. vobject.h -- contains basic interfaces to the VObject APIs.
+ see the header for more details.
+ The structure of VObject is purposely (hiddened) not exposed
+ to the user. Every access has to be done via
+ the APIs. This way, if we need to change the
+ structure or implementation, the client need not
+ recompile as long as the interfaces remain the
+ same.
+
+c. values of a property is determined by the property definition
+ itself. The vobject APIs does not attempt to enforce
+ any of such definition. It is the consumer responsibility
+ to know what value is expected from a property. e.g
+ most properties have unicode string value, so to access
+ the value of these type of properties, you will use
+ the vObjectUStringZValue() to read the value and
+ setVObjectUStringZValue() to set or modify the value.
+ Refer to the VCard and VCalendar specifications for
+ the definition of each property.
+
+d. properties name (id) are case incensitive.
+
+8. Brief descriptions of each APIs
+ ===============================
+ * the predefined properties' names (id) are listed under vobject.h
+ each is of the form VC*Prop. e.g.
+ #define VC7bitProp "7BIT"
+ #define VCAAlarmProp "AALARM"
+ ....
+
+ * consumer of a VObject can only define pointers to VObject.
+
+ * a variable of type VObjectIterator, say "i", can be used to iterate
+ through a VObject's properties, say "o". The APIs related to
+ VObjectIterator are:
+ void initPropIterator(VObjectIterator *i, VObject *o);
+ -- e.g. usage
+ initPropIterator(&i,o);
+ int moreIteration(VObjectIterator *i);
+ -- e.g. usage
+ while (moreIteration(&i)) { ... }
+ VObject* nextVObject(VObjectIterator *i);
+ -- e.g. usage
+ while (moreIteration(&i)) {
+ VObject *each = nextVObject(&i);
+ }
+
+ * VObject can be chained together to form a list. e.g. of such
+ use is in the parser where the return value of the parser is
+ a link list of VObject. A link list of VObject can be
+ built by:
+ void addList(VObject **o, VObject *p);
+ and iterated by
+ VObject* nextVObjectInList(VObject *o);
+ -- next VObjectInList return 0 if the list
+ is exhausted.
+
+ * the following APIs are mainly used to construct a VObject tree:
+ VObject* newVObject(const char *id);
+ -- used extensively internally by VObject APIs but when
+ used externally, its use is mainly limited to the
+ construction of top level object (e.g. an object
+ with VCCardProp or VCCalendarProp id).
+
+ void deleteVObject(VObject *p);
+ -- to deallocate single VObject, for most user, use
+ cleanVObject(VObject *o) instead for freeing all
+ resources associated with the VObject.
+
+ char* dupStr(const char *s, unsigned int size);
+ -- duplicate a string s. If size is 0, the string is
+ assume to be a null-terminated.
+
+ void deleteStr(const char *p);
+ -- used to deallocate a string allocated by dupStr();
+
+ void setVObjectName(VObject *o, const char* id);
+ -- set the id of VObject o. This function is not
+ normally used by the user. The setting of id
+ is normally done as part of other APIs (e.g.
+ addProp()).
+
+ void setVObjectStringZValue(VObject *o, const char *s);
+ -- set a string value of a VObject.
+
+ void setVObjectUStringZValue(VObject *o, const wchar_t *s);
+ -- set a Unicode string value of a VObject.
+
+ void setVObjectIntegerValue(VObject *o, unsigned int i);
+ -- set an integer value of a VObject.
+
+ void setVObjectLongValue(VObject *o, unsigned long l);
+ -- set an long integer value of a VObject.
+
+ void setVObjectAnyValue(VObject *o, void *t);
+ -- set any value of a VObject. The value type is
+ unspecified.
+
+ VObject* setValueWithSize(VObject *prop, void *val, unsigned int size);
+ -- set a raw data (stream of bytes) value of a VObject
+ whose size is size. The internal VObject representation
+ is
+ this object = val
+ VCDataSizeProp=size
+ i.e. the value val will be attached to the VObject prop
+ and a property of VCDataSize whose value is size
+ is also added to the object.
+
+ void setVObjectVObjectValue(VObject *o, VObject *p);
+ -- set a VObject as the value of another VObject.
+
+ const char* vObjectName(VObject *o);
+ -- retrieve the VObject's Name (i.e. id).
+
+ const char* vObjectStringZValue(VObject *o);
+ -- retrieve the VObject's value interpreted as
+ null-terminated string.
+
+ const wchar_t* vObjectUStringZValue(VObject *o);
+ -- retrieve the VObject's value interpreted as
+ null-terminated unicode string.
+
+ unsigned int vObjectIntegerValue(VObject *o);
+ -- retrieve the VObject's value interpreted as
+ integer.
+
+ unsigned long vObjectLongValue(VObject *o);
+ -- retrieve the VObject's value interpreted as
+ long integer.
+
+ void* vObjectAnyValue(VObject *o);
+ -- retrieve the VObject's value interpreted as
+ any value.
+
+ VObject* vObjectVObjectValue(VObject *o);
+ -- retrieve the VObject's value interpreted as
+ a VObject.
+
+ VObject* addVObjectProp(VObject *o, VObject *p);
+ -- add a VObject p as a property of VObject o.
+ (not normally used externally for building a
+ VObject).
+
+ VObject* addProp(VObject *o, const char *id);
+ -- add a property whose name is id to VObject o.
+
+ VObject* addPropValue(VObject *o, const char *id, const char *v);
+ -- add a property whose name is id and whose value
+ is a null-terminated string to VObject o.
+
+ VObject* addPropSizedValue(VObject *o, const char *id,
+ const char *v, unsigned int size);
+ -- add a property whose name is id and whose value
+ is a stream of bytes of size size, to VObject o.
+
+ VObject* addGroup(VObject *o, const char *g);
+ -- add a group g to VObject o.
+ e.g. if g is a.b.c, you will have
+ o
+ c
+ VCGroupingProp=b
+ VCGroupingProp=a
+ and the object c is returned.
+
+ VObject* isAPropertyOf(VObject *o, const char *id);
+ -- query if a property by the name id is in o and
+ return the VObject that represent that property.
+
+ void printVObject(VObject *o);
+ -- pretty print VObject o to stdout (for debugging use).
+
+ void writeVObject(FILE *fp, VObject *o);
+ -- convert VObject o to its textual representation and
+ write it to file.
+
+ char* writeMemVObject(char *s, int *len, VObject *o);
+ -- convert VObject o to its textual representation and
+ write it to memory. If s is 0, then memory required
+ to hold the textual representation will be allocated
+ by this API. If a variable len is passed, len will
+ be overwriten with the byte size of the textual
+ representation. If s is non-zero, then s has to
+ be a user allocated buffer whose size has be passed
+ in len as a variable. Memory allocated by the API
+ has to be freed with call to free. The return value
+ of this API is either the user supplied buffer,
+ the memory allocated by the API, or 0 (in case of
+ failure).
+
+ void cleanStrTbl();
+ -- this function has to be called when all
+ VObject has been destroyed.
+
+ void cleanVObject(VObject *o);
+ -- release all resources used by VObject o.
+
+ wchar_t* fakeUnicode(const char *ps, int *bytes);
+ -- convert char* to wchar_t*.
+
+ extern int uStrLen(const wchar_t *u);
+ -- length of unicode u.
+
+ char *fakeCString(const wchar_t *u);
+ -- convert wchar_t to CString (blindly assumes that
+ this could be done).
+
+9. Additional Programming Notes
+ ============================
+In the following notes, please refers to the listing
+of Example.vcf and its VObject Representation
+(shown at the end of this section).
+
+* Handling the Return Value of the VCard/VCalendar Parser
+ The example input text file contains two root VObjects
+ (a VCalendar and a VCard). The output of the VCard/VCalendar
+ parser is a null-terminated list of VObjects. For this
+ particular input file, the list will have two VObjects.
+ The following shows a template for iterating through the
+ output of the Parser:
+
+ VObject *t, *v;
+ v = Parse_Mime_fromFileName("example.vcf");
+ while (v) {
+ // currently, v will either be a VCard or a VCalendar
+ // do whatever your application need to do to
+ // v here ...
+ t = v;
+ v = nextVObjectInList(v);
+ cleanVObject(t);
+ }
+
+* Iterating Through a VCard/VCalendar VObject
+ From the VObject APIs point of view, a VCard VObject
+ is the same as a VCalendar VObject. However, the application
+ needs to know what are in a VCard or a VCalendar.
+ For example, A VCalendar VObject can have VCDCreatedProp,
+ a VCGEOLocationProp, etc, and one or more VCEventProp and
+ or VCTodoProp. The VCEventProp and VCTodoProp can have
+ many properties of their own, which in turn could have
+ more properties (e.g. VCDAlarmProp can be a VCEventProp
+ VObject's property, and VCRunTimeProp can be a
+ VCDAlarmProp VObject's property. Because a VObject tree
+ can be arbitrarily complex, in general, to process all
+ properties and values of a VObject tree, a recursive walk
+ is desirable. An example recursive VObject tree walk
+ can be found in the vobject.c source lines for printVObject*
+ and writeVObject* APIs. Depending on what the application need
+ to do with a VCard or a VCalendar, a recursive walk
+ of the VObject tree may or may not be desirable. An example
+ template of a non-recursive walk is shown below:
+
+ void processVCardVCalendar(char *inputFile)
+ {
+ VObject *t, *v;
+ v = Parse_Mime_fromFileName(inputFile);
+ while (v) {
+ char *n = vObjectName(v);
+ if (strcmp(n,VCCardProp) == 0) {
+ do_VCard(v);
+ }
+ else if (strcmp(n,VCCalendarProp) == 0) {
+ do_VCalendar(v);
+ }
+ else {
+ // don't know how to handle anything else!
+ }
+ t = v;
+ v = nextVObjectInList(v);
+ cleanVObject(t);
+ }
+ }
+
+ void do_VCard(VObject *vcard)
+ {
+ VObjectIterator t;
+ initPropIterator(&t,vcard);
+ while (moreIteration(&t)) {
+ VObject *eachProp = nextVObject(&t);
+ // The primarly purpose of this example is to
+ // show how to iterate through a VCard VObject,
+ // it is not meant to be efficient at all.
+ char *n = vObjectName(eachProp);
+ if (strcmp(n,VCNameProp)==0) {
+ do_name(eachProp);
+ }
+ else if (strcmp(n,VCEmailProp)==0) {
+ do_email(eachProp);
+ }
+ else if (strcmp(n,VCLabelProp)==0) {
+ do_label(eachProp);
+ }
+ else if ....
+ }
+ }
+
+ void do_VCalendar(VObject *vcal)
+ {
+ VObjectIterator t;
+ initPropIterator(&t,vcard);
+ while (moreIteration(&t)) {
+ VObject *eachProp = nextVObject(&t);
+ // The primarly purpose of this example is to
+ // show how to iterate through a VCalendar VObject,
+ // it is not meant to be efficient at all.
+ char *n = vObjectName(eachProp);
+ if (strcmp(n,VCDCreatedProp)==0) {
+ do_DCreated(eachProp);
+ }
+ else if (strcmp(n,VCVersionProp)==0) {
+ do_Version(eachProp);
+ }
+ else if (strcmp(n,VCTodoProp)==0) {
+ do_Todo(eachProp);
+ }
+ else if (strcmp(n,VCEventProp)==0) {
+ do_Event(eachProp);
+ }
+ else if ....
+ }
+ }
+
+ void do_Todo(VObject *vtodo) { ... }
+
+ void do_Event(VObject *vevent) { ... }
+
+ ...
+
+* Property's Values and Properties
+ The VObject APIs do not attempt to check for the
+ correctness of the values of a property. Nor do they
+ will prevent the user from attaching a non-VCard/VCalendar
+ standard property to a VCard/VCalendar property. Take
+ the example of line [11] of the example, "O.K" is not
+ a valid value of VCStatusProp. It is up to the application
+ to accept or reject the value of a property.
+
+* Output of printVObject
+ PrintVObject pretty prints a VObject tree in human
+ readable form. See the listing at the end of the file
+ for an example output of printVObject on the example
+ input file "Example.vcf".
+
+ Note that binary data are not shown in the output of
+ printVObject. Instead, a note is made ([raw data]) to
+ indicate that there exists such a binary data.
+
+* Note on Binary Data
+ When the value of a property is a binary data, it is only
+ useful to know the size of the binary data.
+
+ In the case of the VCard/VCalendar parser, it chooses
+ to represent the size information as a separate property
+ called VCDataSizeProp whose value is the size of the binary
+ data. The APIs sequence to construct the VObject subtree
+ of line [44] of Example.vcf is
+
+ // VObject *vcard;
+ VObject *p1 = addProp(vcard,VCLogoProp);
+ (void) addProp(p1,VCGIFProp);
+ (void) addProp(p1,VCBASE64Prop);
+ VObject *p2 = addProp(p1,VCDataSizeProp);
+ (void) setVObjectLongValue(p2,1482);
+ setVObjectAnyValue(vcard,...pointer to binary data);
+
+ Note the presence of VCBase64Prop will cause the
+ writeVObject API to output the binary data as BASE64 text.
+ For VCard/VCalendar application, having the VCBase64Prop
+ property is pratically always necessary for property with
+ binary data as its value.
+
+* Note on Quoted-Printable String
+ String value with embedded newline are written out as
+ quoted-prinatable string. It is therefore important
+ to mark a property with a string value that has
+ one or more embedded newlines, with the VCQutedPrintableProp
+ property. e.g.
+
+ // VObject *root;
+ char *msg="To be\nor\nnot to be";
+ VObject *p = addPropValue(root,VCDescriptionProp,msg);
+ // the following is how you mark a property with
+ // a property. In this case, the marker is
+ // VCQuotedPrintableProp
+ addProp(p,VCQuotedPrintableProp);
+
+* Note on Unicode
+ Although, the current parser takes ASCII text file only,
+ string values are all stored as Unicode in the VObject tree.
+ For now, when using the VObject APIs to construct a
+ VObject tree, one should always convert ASCII string value
+ to a Unicode string value:
+
+ // VObject *root;
+ VObject *p = addProp(root,VCSomeProp);
+ setVObjectUStringZValue(p,fakeUnicode(someASCIIStringZvalue));
+
+ An API is provided to simplify the above process:
+
+ addPropValue(root,VCSomeProp,someASCIIStringZValue);
+
+ Note that someASCIISTringZValue is automatically converted to
+ Unicode by addPropValue API, where as, the former code
+ sequence do an explicit call to fakeUnicode.
+
+ To read back the value, one should use the vObjectUStringZValue
+ API not vObjectStringZValue API. The value returned by the
+ vObjectUStringZValue API is a Unicode string. If the application
+ do not know how to handle Unicode string, it can use the
+ fakeCString API to convert it back to ASCII string (as long
+ as the conversion is meaningful).
+
+ Note that fakeCString return a heap allocated memory. It is
+ important to call deleteStr on fakeCString return value if
+ it is not longer required (or there will be memory leak).
+
+ NOTE: Unfortunately, at the point when this document is written,
+ there is still no consensus on how Unicode is to be handled
+ in the textual representation of VCard/VCalendar. So, there
+ is no version of writeVObject and the parser to output and
+ input Unicode textual representation of VCard/VCalendar.
+
+
+Example.vcf
+-----------
+line
+number Input Text (example.vcf)
+------ ----------
+1 BEGIN:VCALENDAR
+2 DCREATED:19961102T100522
+3 GEO:0,0
+4 VERSION:1.0
+5 BEGIN:VEVENT
+6 DTSTART:19961103T000000
+7 DTEND:20000101T000000
+8 DESCRIPTION;QUOTED-PRINTABLE:To be =0A=
+9 or =0A=
+10 not to be
+11 STATUS:O.K.
+12 X-ACTION:No action required
+13 DALARM:19961103T114500;5;3;Enjoy
+14 MALARM:19970101T120000;;;johny@nowhere.com;Call Mom.
+15 END:VEVENT
+16
+17 BEGIN:VTODO
+18 DUE:19960614T0173000
+19 DESCRIPTION:Relex.
+20 END:VTODO
+21
+22 END:VCALENDAR
+23
+24 BEGIN:VCARD
+25 N:Alden;Roland
+26 FN:Roland H. Alden
+27 ORG:AT&T;Versit Project Office
+28 TITLE:Consultant
+29 EMAIL;WORK;PREF;INTERNET:ralden@ralden.com
+30 LABEL;DOM;POSTAL;PARCEL;HOME;WORK;QUOTED-PRINTABLE:Roland H. Alden=0A=
+31 Suite 2208=0A=
+32 One Pine Street=0A=
+33 San Francisco, CA 94111
+34 LABEL;POSTAL;PARCEL;HOME;WORK;QUOTED-PRINTABLE:Roland H. Alden=0A=
+35 Suite 2208=0A=
+36 One Pine Street=0A=
+37 San Francisco, CA 94111=0A=
+38 U.S.A.
+39 TEL;WORK;PREF;MSG:+1 415 296 9106
+40 TEL;WORK;FAX:+1 415 296 9016
+41 TEL;MSG;CELL:+1 415 608 5981
+42 ADR:;Suite 2208;One Pine Street;San Francisco;CA;94111;U.S.A.
+43 SOUND:ROW-LAND H ALL-DIN
+44 LOGO;GIF;BASE64:
+45 R0lGODdhpgBOAMQAAP///+/v797e3s7Ozr29va2trZycnIyMjHt7e2NjY1JSUkJC
+ ... 30 lines of BASE64 data not shown here.
+76 END:VCARD
+
+
+VObject Representation of Example.vcf:
+-------------------------------------
+line
+in
+text
+file VObject Tree as Printed by printVObject API
+---- -------------------------------------------
+1 VCALENDAR
+2 DCREATED="19961102T100522"
+3 GEO="0,0"
+4 VERSION="1.0"
+5 VEVENT
+6 DTSTART="19961103T000000"
+7 DTEND="20000101T000000"
+8 DESCRIPTION="To be
+9 or
+10 not to be"
+8 QUOTED-PRINTABLE
+11 STATUS="O.K."
+12 X-ACTION="No action required"
+13 DALARM
+13 RUNTIME="19961103T114500"
+13 SNOOZETIME="5"
+13 REPEATCOUNT="3"
+13 DISPLAYSTRING="Enjoy"
+14 MALARM
+14 RUNTIME="19970101T120000"
+14 EMAIL="johny@nowhere.com"
+14 NOTE="Call Mom"
+17 VTODO
+18 DUE="19960614T0173000"
+19 DESCRIPTION="Relex."
+24 VCARD
+25 N
+25 F="Alden"
+25 G="Roland"
+26 FN="Roland H. Alden"
+27 ORG
+27 ORGNAME="AT&T"
+27 OUN="Versit Project Office"
+28 TITLE="Consultant"
+29 EMAIL="ralden@alden.com"
+29 WORK
+29 PREF
+29 INTERNET
+30 LABEL="Roland H. Alden
+31 Suite 2208
+32 One Pine Street
+33 San Francisco, CA 94111"
+30 DOM
+30 POSTAL
+30 PARCEL
+30 HOME
+30 WORK
+30 QUOTED-PRINTABLE
+34 LABEL="Roland H. Alden
+35 Suite 2208
+36 One Pine Street
+37 San Francisco, CA 94111
+38 U.S.A."
+34 POSTAL
+34 PARCEL
+34 HOME
+34 WORK
+34 QUOTED-PRINTABLE
+39 TEL="+1 415 296 9106"
+39 WORK
+39 PREF
+39 MSG
+40 TEL="+1 415 296 9016"
+40 WORK
+40 FAX
+41 TEL="+1 415 608 5981"
+41 MSG
+41 CELL
+42 ADR
+42 EXT ADD="Suite 2208"
+42 STREET="One Pine Street"
+42 L="San Francisco"
+42 R="CA"
+42 PC="94111"
+42 C="U.S.A."
+43 SOUND="ROW-LAND H ALL-DIN"
+44 LOGO=[raw data]
+44 GIF
+44 BASE64
+44 DATASIZE=1482
+
diff --git a/libkcal/versit/vcc.c b/libkcal/versit/vcc.c
new file mode 100644
index 00000000..0dfc6bff
--- /dev/null
+++ b/libkcal/versit/vcc.c
@@ -0,0 +1,2498 @@
+/* A Bison parser, made by GNU Bison 1.875. */
+
+/* Skeleton parser for Yacc-like parsing with Bison,
+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA. */
+
+/* As a special exception, when this file is copied by Bison into a
+ Bison output file, you may use that output file without restriction.
+ This special exception was added by the Free Software Foundation
+ in version 1.24 of Bison. */
+
+/* Written by Richard Stallman by simplifying the original so called
+ ``semantic'' parser. */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+ infringing on user name space. This should be done even for local
+ variables, as they might otherwise be expanded by user macros.
+ There are some unavoidable exceptions within include files to
+ define necessary library symbols; they are noted "INFRINGES ON
+ USER NAME SPACE" below. */
+
+/* Identify Bison output. */
+#define YYBISON 1
+
+/* Skeleton name. */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers. */
+#define YYPURE 0
+
+/* Using locations. */
+#define YYLSP_NEEDED 0
+
+
+
+/* Tokens. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ /* Put the tokens into the symbol table, so that GDB and other debuggers
+ know about them. */
+ enum yytokentype {
+ EQ = 258,
+ COLON = 259,
+ DOT = 260,
+ SEMICOLON = 261,
+ SPACE = 262,
+ HTAB = 263,
+ LINESEP = 264,
+ NEWLINE = 265,
+ BEGIN_VCARD = 266,
+ END_VCARD = 267,
+ BEGIN_VCAL = 268,
+ END_VCAL = 269,
+ BEGIN_VEVENT = 270,
+ END_VEVENT = 271,
+ BEGIN_VTODO = 272,
+ END_VTODO = 273,
+ ID = 274,
+ STRING = 275
+ };
+#endif
+#define EQ 258
+#define COLON 259
+#define DOT 260
+#define SEMICOLON 261
+#define SPACE 262
+#define HTAB 263
+#define LINESEP 264
+#define NEWLINE 265
+#define BEGIN_VCARD 266
+#define END_VCARD 267
+#define BEGIN_VCAL 268
+#define END_VCAL 269
+#define BEGIN_VEVENT 270
+#define END_VEVENT 271
+#define BEGIN_VTODO 272
+#define END_VTODO 273
+#define ID 274
+#define STRING 275
+
+
+
+
+/* Copy the first part of user declarations. */
+#line 1 "vcc.y"
+
+
+/***************************************************************************
+(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International
+Business Machines Corporation and Siemens Rolm Communications Inc.
+
+For purposes of this license notice, the term Licensors shall mean,
+collectively, Apple Computer, Inc., AT&T Corp., International
+Business Machines Corporation and Siemens Rolm Communications Inc.
+The term Licensor shall mean any of the Licensors.
+
+Subject to acceptance of the following conditions, permission is hereby
+granted by Licensors without the need for written agreement and without
+license or royalty fees, to use, copy, modify and distribute this
+software for any purpose.
+
+The above copyright notice and the following four paragraphs must be
+reproduced in all copies of this software and any software including
+this software.
+
+THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE
+ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR
+MODIFICATIONS.
+
+IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT,
+INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
+OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
+
+EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.
+
+The software is provided with RESTRICTED RIGHTS. Use, duplication, or
+disclosure by the government are subject to restrictions set forth in
+DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
+
+***************************************************************************/
+
+/*
+ * src: vcc.c
+ * doc: Parser for vCard and vCalendar. Note that this code is
+ * generated by a yacc parser generator. Generally it should not
+ * be edited by hand. The real source is vcc.y. The #line directives
+ * can be commented out here to make it easier to trace through
+ * in a debugger. However, if a bug is found it should
+ * be fixed in vcc.y and this file regenerated.
+ */
+
+
+/* debugging utilities */
+#if __DEBUG
+#define DBG_(x) printf x
+#else
+#define DBG_(x)
+#endif
+
+/**** External Functions ****/
+
+/* assign local name to parser variables and functions so that
+ we can use more than one yacc based parser.
+*/
+
+#define yyparse mime_parse
+#define yylex mime_lex
+#define yyerror mime_error
+#define yychar mime_char
+/* #define p_yyval p_mime_val */
+#undef yyval
+#define yyval mime_yyval
+/* #define p_yylval p_mime_lval */
+#undef yylval
+#define yylval mime_yylval
+#define yydebug mime_debug
+#define yynerrs mime_nerrs
+#define yyerrflag mime_errflag
+#define yyss mime_ss
+#define yyssp mime_ssp
+#define yyvs mime_vs
+#define yyvsp mime_vsp
+#define yylhs mime_lhs
+#define yylen mime_len
+#define yydefred mime_defred
+#define yydgoto mime_dgoto
+#define yysindex mime_sindex
+#define yyrindex mime_rindex
+#define yygindex mime_gindex
+#define yytable mime_table
+#define yycheck mime_check
+#define yyname mime_name
+#define yyrule mime_rule
+#undef YYPREFIX
+#define YYPREFIX "mime_"
+
+
+#ifndef _NO_LINE_FOLDING
+#define _SUPPORT_LINE_FOLDING 1
+#endif
+
+#include <string.h>
+#if !defined(__FreeBSD__) && !defined(__APPLE__)
+#include <malloc.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include "vcc.h"
+
+/* The following is a hack that I hope will get things compiling
+ * on SunOS 4.1.x systems
+ */
+#ifndef SEEK_SET
+#define SEEK_SET 0 /* Seek from beginning of file. */
+#define SEEK_CUR 1 /* Seek from current position. */
+#define SEEK_END 2 /* Seek from end of file. */
+#endif
+
+/**** Types, Constants ****/
+
+#define YYDEBUG 0 /* 1 to compile in some debugging code */
+#define MAXTOKEN 256 /* maximum token (line) length */
+#define YYSTACKSIZE 1000 /* ~unref ? */
+#define MAXLEVEL 10 /* max # of nested objects parseable */
+ /* (includes outermost) */
+
+
+/**** Global Variables ****/
+int mime_lineNum, mime_numErrors; /* yyerror() can use these */
+static VObject* vObjList;
+static VObject *curProp;
+static VObject *curObj;
+static VObject* ObjStack[MAXLEVEL];
+static int ObjStackTop;
+
+
+/* A helpful utility for the rest of the app. */
+#if __CPLUSPLUS__
+extern "C" {
+#endif
+
+ /* static void Parse_Debug(const char *s);*/
+ static void yyerror(char *s);
+
+#if __CPLUSPLUS__
+ };
+#endif
+
+int yyparse();
+static int yylex();
+
+static VObject* popVObject();
+
+
+enum LexMode {
+ L_NORMAL,
+ L_VCARD,
+ L_VCAL,
+ L_VEVENT,
+ L_VTODO,
+ L_VALUES,
+ L_BASE64,
+ L_QUOTED_PRINTABLE
+ };
+
+/**** Private Forward Declarations ****/
+static int pushVObject(const char *prop);
+static VObject* popVObject();
+char* lexDataFromBase64();
+static void lexPopMode(int top);
+static int lexWithinMode(enum LexMode mode);
+static void lexPushMode(enum LexMode mode);
+static void enterProps(const char *s);
+static void enterAttr(const char *s1, const char *s2);
+/* static void enterValues(const char *value); */
+static void appendValue(const char *value);
+static void mime_error_(char *s);
+
+
+
+/* Enabling traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+/* Enabling verbose error messages. */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+#line 185 "vcc.y"
+typedef union YYSTYPE {
+ char *str;
+ VObject *vobj;
+ } YYSTYPE;
+/* Line 191 of yacc.c. */
+#line 300 "vcc.tab.c"
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+
+
+
+/* Copy the second part of user declarations. */
+
+
+/* Line 214 of yacc.c. */
+#line 312 "vcc.tab.c"
+
+#if ! defined (yyoverflow) || YYERROR_VERBOSE
+
+/* The parser invokes alloca or malloc; define the necessary symbols. */
+
+# if YYSTACK_USE_ALLOCA
+# define YYSTACK_ALLOC alloca
+# else
+# ifndef YYSTACK_USE_ALLOCA
+# if defined (alloca) || defined (_ALLOCA_H)
+# define YYSTACK_ALLOC alloca
+# else
+# ifdef __GNUC__
+# define YYSTACK_ALLOC __builtin_alloca
+# endif
+# endif
+# endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+ /* Pacify GCC's `empty if-body' warning. */
+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# else
+# if defined (__STDC__) || defined (__cplusplus)
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# endif
+# define YYSTACK_ALLOC malloc
+# define YYSTACK_FREE free
+# endif
+#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
+
+
+#if (! defined (yyoverflow) \
+ && (! defined (__cplusplus) \
+ || (YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member. */
+union yyalloc
+{
+ short yyss;
+ YYSTYPE yyvs;
+ };
+
+/* The size of the maximum gap between one aligned stack and the next. */
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+ N elements. */
+# define YYSTACK_BYTES(N) \
+ ((N) * (sizeof (short) + sizeof (YYSTYPE)) \
+ + YYSTACK_GAP_MAXIMUM)
+
+/* Copy COUNT objects from FROM to TO. The source and destination do
+ not overlap. */
+# ifndef YYCOPY
+# if 1 < __GNUC__
+# define YYCOPY(To, From, Count) \
+ __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+# else
+# define YYCOPY(To, From, Count) \
+ do \
+ { \
+ register YYSIZE_T yyi; \
+ for (yyi = 0; yyi < (Count); yyi++) \
+ (To)[yyi] = (From)[yyi]; \
+ } \
+ while (0)
+# endif
+# endif
+
+/* Relocate STACK from its old location to the new one. The
+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
+ elements in the stack, and YYPTR gives the new location of the
+ stack. Advance YYPTR to a properly aligned location for the next
+ stack. */
+# define YYSTACK_RELOCATE(Stack) \
+ do \
+ { \
+ YYSIZE_T yynewbytes; \
+ YYCOPY (&yyptr->Stack, Stack, yysize); \
+ Stack = &yyptr->Stack; \
+ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+ yyptr += yynewbytes / sizeof (*yyptr); \
+ } \
+ while (0)
+
+#endif
+
+#if defined (__STDC__) || defined (__cplusplus)
+ typedef signed char yysigned_char;
+#else
+ typedef short yysigned_char;
+#endif
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL 12
+/* YYLAST -- Last index in YYTABLE. */
+#define YYLAST 56
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS 21
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS 31
+/* YYNRULES -- Number of rules. */
+#define YYNRULES 47
+/* YYNRULES -- Number of states. */
+#define YYNSTATES 62
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
+#define YYUNDEFTOK 2
+#define YYMAXUTOK 275
+
+#define YYTRANSLATE(YYX) \
+ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
+static const unsigned char yytranslate[] =
+{
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+ YYRHS. */
+static const unsigned char yyprhs[] =
+{
+ 0, 0, 3, 5, 6, 10, 12, 14, 16, 17,
+ 22, 23, 27, 30, 32, 33, 39, 41, 42, 46,
+ 48, 51, 53, 56, 58, 62, 64, 65, 70, 72,
+ 74, 75, 76, 81, 82, 86, 89, 91, 93, 95,
+ 97, 98, 103, 104, 108, 109, 114, 115
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+static const yysigned_char yyrhs[] =
+{
+ 22, 0, -1, 23, -1, -1, 25, 24, 23, -1,
+ 25, -1, 26, -1, 41, -1, -1, 11, 27, 29,
+ 12, -1, -1, 11, 28, 12, -1, 30, 29, -1,
+ 30, -1, -1, 32, 4, 31, 38, 9, -1, 1,
+ -1, -1, 37, 33, 34, -1, 37, -1, 35, 34,
+ -1, 35, -1, 6, 36, -1, 37, -1, 37, 3,
+ 37, -1, 19, -1, -1, 40, 6, 39, 38, -1,
+ 40, -1, 20, -1, -1, -1, 13, 42, 44, 14,
+ -1, -1, 13, 43, 14, -1, 45, 44, -1, 45,
+ -1, 46, -1, 49, -1, 29, -1, -1, 15, 47,
+ 29, 16, -1, -1, 15, 48, 16, -1, -1, 17,
+ 50, 29, 18, -1, -1, 17, 51, 18, -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
+static const unsigned short yyrline[] =
+{
+ 0, 213, 213, 217, 216, 219, 223, 224, 229, 228,
+ 239, 238, 250, 251, 255, 254, 264, 268, 267, 272,
+ 278, 279, 282, 285, 289, 296, 299, 299, 300, 304,
+ 306, 311, 310, 316, 315, 321, 322, 326, 327, 328,
+ 333, 332, 344, 343, 357, 356, 368, 367
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE
+/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+ "$end", "error", "$undefined", "EQ", "COLON", "DOT", "SEMICOLON", "SPACE",
+ "HTAB", "LINESEP", "NEWLINE", "BEGIN_VCARD", "END_VCARD", "BEGIN_VCAL",
+ "END_VCAL", "BEGIN_VEVENT", "END_VEVENT", "BEGIN_VTODO", "END_VTODO",
+ "ID", "STRING", "$accept", "mime", "vobjects", "@1", "vobject", "vcard",
+ "@2", "@3", "items", "item", "@4", "prop", "@5", "attr_params",
+ "attr_param", "attr", "name", "values", "@6", "value", "vcal", "@7",
+ "@8", "calitems", "calitem", "eventitem", "@9", "@10", "todoitem",
+ "@11", "@12", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+ token YYLEX-NUM. */
+static const unsigned short yytoknum[] =
+{
+ 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
+ 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
+ 275
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+static const unsigned char yyr1[] =
+{
+ 0, 21, 22, 24, 23, 23, 25, 25, 27, 26,
+ 28, 26, 29, 29, 31, 30, 30, 33, 32, 32,
+ 34, 34, 35, 36, 36, 37, 39, 38, 38, 40,
+ 40, 42, 41, 43, 41, 44, 44, 45, 45, 45,
+ 47, 46, 48, 46, 50, 49, 51, 49
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
+static const unsigned char yyr2[] =
+{
+ 0, 2, 1, 0, 3, 1, 1, 1, 0, 4,
+ 0, 3, 2, 1, 0, 5, 1, 0, 3, 1,
+ 2, 1, 2, 1, 3, 1, 0, 4, 1, 1,
+ 0, 0, 4, 0, 3, 2, 1, 1, 1, 1,
+ 0, 4, 0, 3, 0, 4, 0, 3
+};
+
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+ STATE-NUM when YYTABLE doesn't specify something else to do. Zero
+ means the default is an error. */
+static const unsigned char yydefact[] =
+{
+ 0, 8, 31, 0, 2, 3, 6, 7, 0, 0,
+ 0, 0, 1, 0, 16, 25, 0, 0, 0, 17,
+ 11, 40, 44, 39, 0, 0, 37, 38, 34, 4,
+ 9, 12, 14, 0, 0, 0, 0, 0, 32, 35,
+ 30, 0, 18, 21, 0, 43, 0, 47, 29, 0,
+ 28, 22, 23, 20, 41, 45, 15, 26, 0, 30,
+ 24, 27
+};
+
+/* YYDEFGOTO[NTERM-NUM]. */
+static const yysigned_char yydefgoto[] =
+{
+ -1, 3, 4, 13, 5, 6, 8, 9, 23, 17,
+ 40, 18, 33, 42, 43, 51, 19, 49, 59, 50,
+ 7, 10, 11, 24, 25, 26, 34, 35, 27, 36,
+ 37
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+ STATE-NUM. */
+#define YYPACT_NINF -18
+static const yysigned_char yypact[] =
+{
+ -5, -10, -11, 5, -18, 10, -18, -18, 3, -1,
+ 12, 16, -18, -5, -18, -18, 20, 0, 29, 30,
+ -18, 19, 18, -18, 23, 6, -18, -18, -18, -18,
+ -18, -18, -18, 32, 3, 24, 3, 21, -18, -18,
+ 22, 25, -18, 32, 27, -18, 28, -18, -18, 36,
+ 41, -18, 45, -18, -18, -18, -18, -18, 25, 22,
+ -18, -18
+};
+
+/* YYPGOTO[NTERM-NUM]. */
+static const yysigned_char yypgoto[] =
+{
+ -18, -18, 37, -18, -18, -18, -18, -18, -8, -18,
+ -18, -18, -18, 8, -18, -18, -17, -7, -18, -18,
+ -18, -18, -18, 31, -18, -18, -18, -18, -18, -18,
+ -18
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
+ positive, shift that token. If negative, reduce the rule which
+ number is the opposite. If zero, do what YYDEFACT says.
+ If YYTABLE_NINF, syntax error. */
+#define YYTABLE_NINF -47
+static const yysigned_char yytable[] =
+{
+ 16, 14, -10, -33, 14, 12, 1, 14, 2, 31,
+ -5, 20, -13, 14, -13, -13, -13, -13, -13, 15,
+ -36, 21, 15, 22, 52, 15, 44, 21, 46, 22,
+ 28, 15, 30, 32, -19, -42, -46, 38, 41, 47,
+ 45, 60, 48, 54, 15, 56, 55, 57, 58, 0,
+ 29, 53, 61, 0, 0, 0, 39
+};
+
+static const yysigned_char yycheck[] =
+{
+ 8, 1, 12, 14, 1, 0, 11, 1, 13, 17,
+ 0, 12, 12, 1, 14, 15, 16, 17, 18, 19,
+ 14, 15, 19, 17, 41, 19, 34, 15, 36, 17,
+ 14, 19, 12, 4, 4, 16, 18, 14, 6, 18,
+ 16, 58, 20, 16, 19, 9, 18, 6, 3, -1,
+ 13, 43, 59, -1, -1, -1, 25
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+ symbol of state STATE-NUM. */
+static const unsigned char yystos[] =
+{
+ 0, 11, 13, 22, 23, 25, 26, 41, 27, 28,
+ 42, 43, 0, 24, 1, 19, 29, 30, 32, 37,
+ 12, 15, 17, 29, 44, 45, 46, 49, 14, 23,
+ 12, 29, 4, 33, 47, 48, 50, 51, 14, 44,
+ 31, 6, 34, 35, 29, 16, 29, 18, 20, 38,
+ 40, 36, 37, 34, 16, 18, 9, 6, 3, 39,
+ 37, 38
+};
+
+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
+# define YYSIZE_T __SIZE_TYPE__
+#endif
+#if ! defined (YYSIZE_T) && defined (size_t)
+# define YYSIZE_T size_t
+#endif
+#if ! defined (YYSIZE_T)
+# if defined (__STDC__) || defined (__cplusplus)
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# endif
+#endif
+#if ! defined (YYSIZE_T)
+# define YYSIZE_T unsigned int
+#endif
+
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+#define YYEMPTY (-2)
+#define YYEOF 0
+
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrlab1
+
+/* Like YYERROR except do call yyerror. This remains here temporarily
+ to ease the transition to the new meaning of YYERROR, for GCC.
+ Once GCC version 2 has supplanted version 1, this can go. */
+
+#define YYFAIL goto yyerrlab
+
+#define YYRECOVERING() (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value) \
+do \
+ if (yychar == YYEMPTY && yylen == 1) \
+ { \
+ yychar = (Token); \
+ yylval = (Value); \
+ yytoken = YYTRANSLATE (yychar); \
+ YYPOPSTACK; \
+ goto yybackup; \
+ } \
+ else \
+ { \
+ yyerror ("syntax error: cannot back up");\
+ YYERROR; \
+ } \
+while (0)
+
+#define YYTERROR 1
+#define YYERRCODE 256
+
+/* YYLLOC_DEFAULT -- Compute the default location (before the actions
+ are run). */
+
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N) \
+ Current.first_line = Rhs[1].first_line; \
+ Current.first_column = Rhs[1].first_column; \
+ Current.last_line = Rhs[N].last_line; \
+ Current.last_column = Rhs[N].last_column;
+#endif
+
+/* YYLEX -- calling `yylex' with the right arguments. */
+
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (YYLEX_PARAM)
+#else
+# define YYLEX yylex ()
+#endif
+
+/* Enable debugging if requested. */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+# define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args) \
+do { \
+ if (yydebug) \
+ YYFPRINTF Args; \
+} while (0)
+
+# define YYDSYMPRINT(Args) \
+do { \
+ if (yydebug) \
+ yysymprint Args; \
+} while (0)
+
+# define YYDSYMPRINTF(Title, Token, Value, Location) \
+do { \
+ if (yydebug) \
+ { \
+ YYFPRINTF (stderr, "%s ", Title); \
+ yysymprint (stderr, \
+ Token, Value); \
+ YYFPRINTF (stderr, "\n"); \
+ } \
+} while (0)
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (cinluded). |
+`------------------------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_stack_print (short *bottom, short *top)
+#else
+static void
+yy_stack_print (bottom, top)
+ short *bottom;
+ short *top;
+#endif
+{
+ YYFPRINTF (stderr, "Stack now");
+ for (/* Nothing. */; bottom <= top; ++bottom)
+ YYFPRINTF (stderr, " %d", *bottom);
+ YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top) \
+do { \
+ if (yydebug) \
+ yy_stack_print ((Bottom), (Top)); \
+} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced. |
+`------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_reduce_print (int yyrule)
+#else
+static void
+yy_reduce_print (yyrule)
+ int yyrule;
+#endif
+{
+ int yyi;
+ unsigned int yylineno = yyrline[yyrule];
+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ",
+ yyrule - 1, yylineno);
+ /* Print the symbols being reduced, and their result. */
+ for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
+ YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]);
+ YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]);
+}
+
+# define YY_REDUCE_PRINT(Rule) \
+do { \
+ if (yydebug) \
+ yy_reduce_print (Rule); \
+} while (0)
+
+/* Nonzero means print parse trace. It is left uninitialized so that
+ multiple parsers can coexist. */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YYDSYMPRINT(Args)
+# define YYDSYMPRINTF(Title, Token, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks. */
+#ifndef YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+ if the built-in stack extension method is used).
+
+ Do not make this value too large; the results are undefined if
+ SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
+ evaluated with infinite-precision integer arithmetic. */
+
+#if YYMAXDEPTH == 0
+# undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+# if defined (__GLIBC__) && defined (_STRING_H)
+# define yystrlen strlen
+# else
+/* Return the length of YYSTR. */
+static YYSIZE_T
+# if defined (__STDC__) || defined (__cplusplus)
+yystrlen (const char *yystr)
+# else
+yystrlen (yystr)
+ const char *yystr;
+# endif
+{
+ register const char *yys = yystr;
+
+ while (*yys++ != '\0')
+ continue;
+
+ return yys - yystr - 1;
+}
+# endif
+# endif
+
+# ifndef yystpcpy
+# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+# define yystpcpy stpcpy
+# else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+ YYDEST. */
+static char *
+# if defined (__STDC__) || defined (__cplusplus)
+yystpcpy (char *yydest, const char *yysrc)
+# else
+yystpcpy (yydest, yysrc)
+ char *yydest;
+ const char *yysrc;
+# endif
+{
+ register char *yyd = yydest;
+ register const char *yys = yysrc;
+
+ while ((*yyd++ = *yys++) != '\0')
+ continue;
+
+ return yyd - 1;
+}
+# endif
+# endif
+
+#endif /* !YYERROR_VERBOSE */
+
+
+
+#if YYDEBUG
+/*--------------------------------.
+| Print this symbol on YYOUTPUT. |
+`--------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yysymprint (yyoutput, yytype, yyvaluep)
+ FILE *yyoutput;
+ int yytype;
+ YYSTYPE *yyvaluep;
+#endif
+{
+ /* Pacify ``unused variable'' warnings. */
+ (void) yyvaluep;
+
+ if (yytype < YYNTOKENS)
+ {
+ YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+# ifdef YYPRINT
+ YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# endif
+ }
+ else
+ YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+ switch (yytype)
+ {
+ default:
+ break;
+ }
+ YYFPRINTF (yyoutput, ")");
+}
+
+#endif /* ! YYDEBUG */
+/*-----------------------------------------------.
+| Release the memory associated to this symbol. |
+`-----------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yydestruct (int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yydestruct (yytype, yyvaluep)
+ int yytype;
+ YYSTYPE *yyvaluep;
+#endif
+{
+ /* Pacify ``unused variable'' warnings. */
+ (void) yyvaluep;
+
+ switch (yytype)
+ {
+
+ default:
+ break;
+ }
+}
+
+
+/* Prevent warnings from -Wmissing-prototypes. */
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void *YYPARSE_PARAM);
+# else
+int yyparse ();
+# endif
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void);
+#else
+int yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
+
+
+
+/* The lookahead symbol. */
+int yychar;
+
+/* The semantic value of the lookahead symbol. */
+YYSTYPE yylval;
+
+/* Number of syntax errors so far. */
+int yynerrs;
+
+
+
+/*----------.
+| yyparse. |
+`----------*/
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void *YYPARSE_PARAM)
+# else
+int yyparse (YYPARSE_PARAM)
+ void *YYPARSE_PARAM;
+# endif
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
+int
+yyparse (void)
+#else
+int
+yyparse ()
+
+#endif
+#endif
+{
+
+ register int yystate;
+ register int yyn;
+ int yyresult;
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus;
+ /* Lookahead token as an internal (translated) token number. */
+ int yytoken = 0;
+
+ /* Three stacks and their tools:
+ `yyss': related to states,
+ `yyvs': related to semantic values,
+ `yyls': related to locations.
+
+ Refer to the stacks thru separate pointers, to allow yyoverflow
+ to reallocate them elsewhere. */
+
+ /* The state stack. */
+ short yyssa[YYINITDEPTH];
+ short *yyss = yyssa;
+ register short *yyssp;
+
+ /* The semantic value stack. */
+ YYSTYPE yyvsa[YYINITDEPTH];
+ YYSTYPE *yyvs = yyvsa;
+ register YYSTYPE *yyvsp;
+
+
+
+#define YYPOPSTACK (yyvsp--, yyssp--)
+
+ YYSIZE_T yystacksize = YYINITDEPTH;
+
+ /* The variables used to return semantic value and location from the
+ action routines. */
+ YYSTYPE yyval;
+
+
+ /* When reducing, the number of symbols on the RHS of the reduced
+ rule. */
+ int yylen;
+
+ YYDPRINTF ((stderr, "Starting parse\n"));
+
+ yystate = 0;
+ yyerrstatus = 0;
+ yynerrs = 0;
+ yychar = YYEMPTY; /* Cause a token to be read. */
+
+ /* Initialize stack pointers.
+ Waste one element of value and location stack
+ so that they stay on the same level as the state stack.
+ The wasted elements are never initialized. */
+
+ yyssp = yyss;
+ yyvsp = yyvs;
+
+ goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate. |
+`------------------------------------------------------------*/
+ yynewstate:
+ /* In all cases, when you get here, the value and location stacks
+ have just been pushed. so pushing a state here evens the stacks.
+ */
+ yyssp++;
+
+ yysetstate:
+ *yyssp = yystate;
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ {
+ /* Get the current used size of the three stacks, in elements. */
+ YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+ {
+ /* Give user a chance to reallocate the stack. Use copies of
+ these so that the &'s don't force the real ones into
+ memory. */
+ YYSTYPE *yyvs1 = yyvs;
+ short *yyss1 = yyss;
+
+
+ /* Each stack pointer address is followed by the size of the
+ data in use in that stack, in bytes. This used to be a
+ conditional around just the two extra args, but that might
+ be undefined if yyoverflow is a macro. */
+ yyoverflow ("parser stack overflow",
+ &yyss1, yysize * sizeof (*yyssp),
+ &yyvs1, yysize * sizeof (*yyvsp),
+
+ &yystacksize);
+
+ yyss = yyss1;
+ yyvs = yyvs1;
+ }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+ goto yyoverflowlab;
+# else
+ /* Extend the stack our own way. */
+ if (YYMAXDEPTH <= yystacksize)
+ goto yyoverflowlab;
+ yystacksize *= 2;
+ if (YYMAXDEPTH < yystacksize)
+ yystacksize = YYMAXDEPTH;
+
+ {
+ short *yyss1 = yyss;
+ union yyalloc *yyptr =
+ (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+ if (! yyptr)
+ goto yyoverflowlab;
+ YYSTACK_RELOCATE (yyss);
+ YYSTACK_RELOCATE (yyvs);
+
+# undef YYSTACK_RELOCATE
+ if (yyss1 != yyssa)
+ YYSTACK_FREE (yyss1);
+ }
+# endif
+#endif /* no yyoverflow */
+
+ yyssp = yyss + yysize - 1;
+ yyvsp = yyvs + yysize - 1;
+
+
+ YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+ (unsigned long int) yystacksize));
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ YYABORT;
+ }
+
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+ goto yybackup;
+
+/*-----------.
+| yybackup. |
+`-----------*/
+yybackup:
+
+/* Do appropriate processing given the current state. */
+/* Read a lookahead token if we need one and don't already have one. */
+/* yyresume: */
+
+ /* First try to decide what to do without reference to lookahead token. */
+
+ yyn = yypact[yystate];
+ if (yyn == YYPACT_NINF)
+ goto yydefault;
+
+ /* Not known => get a lookahead token if don't already have one. */
+
+ /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */
+ if (yychar == YYEMPTY)
+ {
+ YYDPRINTF ((stderr, "Reading a token: "));
+ yychar = YYLEX;
+ }
+
+ if (yychar <= YYEOF)
+ {
+ yychar = yytoken = YYEOF;
+ YYDPRINTF ((stderr, "Now at end of input.\n"));
+ }
+ else
+ {
+ yytoken = YYTRANSLATE (yychar);
+ YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc);
+ }
+
+ /* If the proper action on seeing token YYTOKEN is to reduce or to
+ detect an error, take that action. */
+ yyn += yytoken;
+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+ goto yydefault;
+ yyn = yytable[yyn];
+ if (yyn <= 0)
+ {
+ if (yyn == 0 || yyn == YYTABLE_NINF)
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+ /* Shift the lookahead token. */
+ YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken]));
+
+ /* Discard the token being shifted unless it is eof. */
+ if (yychar != YYEOF)
+ yychar = YYEMPTY;
+
+ *++yyvsp = yylval;
+
+
+ /* Count tokens shifted since error; after three, turn off error
+ status. */
+ if (yyerrstatus)
+ yyerrstatus--;
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state. |
+`-----------------------------------------------------------*/
+yydefault:
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+ goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction. |
+`-----------------------------*/
+yyreduce:
+ /* yyn is the number of a rule to reduce with. */
+ yylen = yyr2[yyn];
+
+ /* If YYLEN is nonzero, implement the default value of the action:
+ `$$ = $1'.
+
+ Otherwise, the following line sets YYVAL to garbage.
+ This behavior is undocumented and Bison
+ users should not rely upon it. Assigning to YYVAL
+ unconditionally makes the parser a bit smaller, and it avoids a
+ GCC warning that YYVAL may be used uninitialized. */
+ yyval = yyvsp[1-yylen];
+
+
+ YY_REDUCE_PRINT (yyn);
+ switch (yyn)
+ {
+ case 3:
+#line 217 "vcc.y"
+ { addList(&vObjList, yyvsp[0].vobj); curObj = 0; ;}
+ break;
+
+ case 5:
+#line 220 "vcc.y"
+ { addList(&vObjList, yyvsp[0].vobj); curObj = 0; ;}
+ break;
+
+ case 8:
+#line 229 "vcc.y"
+ {
+ lexPushMode(L_VCARD);
+ if (!pushVObject(VCCardProp)) YYERROR;
+ ;}
+ break;
+
+ case 9:
+#line 234 "vcc.y"
+ {
+ lexPopMode(0);
+ yyval.vobj = popVObject();
+ ;}
+ break;
+
+ case 10:
+#line 239 "vcc.y"
+ {
+ lexPushMode(L_VCARD);
+ if (!pushVObject(VCCardProp)) YYERROR;
+ ;}
+ break;
+
+ case 11:
+#line 244 "vcc.y"
+ {
+ lexPopMode(0);
+ yyval.vobj = popVObject();
+ ;}
+ break;
+
+ case 14:
+#line 255 "vcc.y"
+ {
+ lexPushMode(L_VALUES);
+ ;}
+ break;
+
+ case 15:
+#line 259 "vcc.y"
+ {
+ if (lexWithinMode(L_BASE64) || lexWithinMode(L_QUOTED_PRINTABLE))
+ lexPopMode(0);
+ lexPopMode(0);
+ ;}
+ break;
+
+ case 17:
+#line 268 "vcc.y"
+ {
+ enterProps(yyvsp[0].str);
+ ;}
+ break;
+
+ case 19:
+#line 273 "vcc.y"
+ {
+ enterProps(yyvsp[0].str);
+ ;}
+ break;
+
+ case 23:
+#line 286 "vcc.y"
+ {
+ enterAttr(yyvsp[0].str,0);
+ ;}
+ break;
+
+ case 24:
+#line 290 "vcc.y"
+ {
+ enterAttr(yyvsp[-2].str,yyvsp[0].str);
+
+ ;}
+ break;
+
+ case 26:
+#line 299 "vcc.y"
+ { appendValue(yyvsp[-1].str); ;}
+ break;
+
+ case 28:
+#line 301 "vcc.y"
+ { appendValue(yyvsp[0].str); ;}
+ break;
+
+ case 30:
+#line 306 "vcc.y"
+ { yyval.str = 0; ;}
+ break;
+
+ case 31:
+#line 311 "vcc.y"
+ { if (!pushVObject(VCCalProp)) YYERROR; ;}
+ break;
+
+ case 32:
+#line 314 "vcc.y"
+ { yyval.vobj = popVObject(); ;}
+ break;
+
+ case 33:
+#line 316 "vcc.y"
+ { if (!pushVObject(VCCalProp)) YYERROR; ;}
+ break;
+
+ case 34:
+#line 318 "vcc.y"
+ { yyval.vobj = popVObject(); ;}
+ break;
+
+ case 40:
+#line 333 "vcc.y"
+ {
+ lexPushMode(L_VEVENT);
+ if (!pushVObject(VCEventProp)) YYERROR;
+ ;}
+ break;
+
+ case 41:
+#line 339 "vcc.y"
+ {
+ lexPopMode(0);
+ popVObject();
+ ;}
+ break;
+
+ case 42:
+#line 344 "vcc.y"
+ {
+ lexPushMode(L_VEVENT);
+ if (!pushVObject(VCEventProp)) YYERROR;
+ ;}
+ break;
+
+ case 43:
+#line 349 "vcc.y"
+ {
+ lexPopMode(0);
+ popVObject();
+ ;}
+ break;
+
+ case 44:
+#line 357 "vcc.y"
+ {
+ lexPushMode(L_VTODO);
+ if (!pushVObject(VCTodoProp)) YYERROR;
+ ;}
+ break;
+
+ case 45:
+#line 363 "vcc.y"
+ {
+ lexPopMode(0);
+ popVObject();
+ ;}
+ break;
+
+ case 46:
+#line 368 "vcc.y"
+ {
+ lexPushMode(L_VTODO);
+ if (!pushVObject(VCTodoProp)) YYERROR;
+ ;}
+ break;
+
+ case 47:
+#line 373 "vcc.y"
+ {
+ lexPopMode(0);
+ popVObject();
+ ;}
+ break;
+
+
+ }
+
+/* Line 991 of yacc.c. */
+#line 1429 "vcc.tab.c"
+
+ yyvsp -= yylen;
+ yyssp -= yylen;
+
+
+ YY_STACK_PRINT (yyss, yyssp);
+
+ *++yyvsp = yyval;
+
+
+ /* Now `shift' the result of the reduction. Determine what state
+ that goes to, based on the state we popped back to and the rule
+ number reduced by. */
+
+ yyn = yyr1[yyn];
+
+ yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+ if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+ yystate = yytable[yystate];
+ else
+ yystate = yydefgoto[yyn - YYNTOKENS];
+
+ goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+ /* If not already recovering from an error, report this error. */
+ if (!yyerrstatus)
+ {
+ ++yynerrs;
+#if YYERROR_VERBOSE
+ yyn = yypact[yystate];
+
+ if (YYPACT_NINF < yyn && yyn < YYLAST)
+ {
+ YYSIZE_T yysize = 0;
+ int yytype = YYTRANSLATE (yychar);
+ char *yymsg;
+ int yyx, yycount;
+
+ yycount = 0;
+ /* Start YYX at -YYN if negative to avoid negative indexes in
+ YYCHECK. */
+ for (yyx = yyn < 0 ? -yyn : 0;
+ yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+ yysize += yystrlen (yytname[yyx]) + 15, yycount++;
+ yysize += yystrlen ("syntax error, unexpected ") + 1;
+ yysize += yystrlen (yytname[yytype]);
+ yymsg = (char *) YYSTACK_ALLOC (yysize);
+ if (yymsg != 0)
+ {
+ char *yyp = yystpcpy (yymsg, "syntax error, unexpected ");
+ yyp = yystpcpy (yyp, yytname[yytype]);
+
+ if (yycount < 5)
+ {
+ yycount = 0;
+ for (yyx = yyn < 0 ? -yyn : 0;
+ yyx < (int) (sizeof (yytname) / sizeof (char *));
+ yyx++)
+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+ {
+ const char *yyq = ! yycount ? ", expecting " : " or ";
+ yyp = yystpcpy (yyp, yyq);
+ yyp = yystpcpy (yyp, yytname[yyx]);
+ yycount++;
+ }
+ }
+ yyerror (yymsg);
+ YYSTACK_FREE (yymsg);
+ }
+ else
+ yyerror ("syntax error; also virtual memory exhausted");
+ }
+ else
+#endif /* YYERROR_VERBOSE */
+ yyerror ("syntax error");
+ }
+
+
+
+ if (yyerrstatus == 3)
+ {
+ /* If just tried and failed to reuse lookahead token after an
+ error, discard it. */
+
+ /* Return failure if at end of input. */
+ if (yychar == YYEOF)
+ {
+ /* Pop the error token. */
+ YYPOPSTACK;
+ /* Pop the rest of the stack. */
+ while (yyss < yyssp)
+ {
+ YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
+ yydestruct (yystos[*yyssp], yyvsp);
+ YYPOPSTACK;
+ }
+ YYABORT;
+ }
+
+ YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc);
+ yydestruct (yytoken, &yylval);
+ yychar = YYEMPTY;
+
+ }
+
+ /* Else will try to reuse lookahead token after shifting the error
+ token. */
+ goto yyerrlab2;
+
+
+/*----------------------------------------------------.
+| yyerrlab1 -- error raised explicitly by an action. |
+`----------------------------------------------------*/
+yyerrlab1:
+
+ /* Suppress GCC warning that yyerrlab1 is unused when no action
+ invokes YYERROR. */
+#if defined (__GNUC_MINOR__) && 2093 <= (__GNUC__ * 1000 + __GNUC_MINOR__) \
+ && !defined __cplusplus
+ __attribute__ ((__unused__))
+#endif
+
+
+ goto yyerrlab2;
+
+
+/*---------------------------------------------------------------.
+| yyerrlab2 -- pop states until the error token can be shifted. |
+`---------------------------------------------------------------*/
+yyerrlab2:
+ yyerrstatus = 3; /* Each real token shifted decrements this. */
+
+ for (;;)
+ {
+ yyn = yypact[yystate];
+ if (yyn != YYPACT_NINF)
+ {
+ yyn += YYTERROR;
+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+ {
+ yyn = yytable[yyn];
+ if (0 < yyn)
+ break;
+ }
+ }
+
+ /* Pop the current state because it cannot handle the error token. */
+ if (yyssp == yyss)
+ YYABORT;
+
+ YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
+ yydestruct (yystos[yystate], yyvsp);
+ yyvsp--;
+ yystate = *--yyssp;
+
+ YY_STACK_PRINT (yyss, yyssp);
+ }
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+ YYDPRINTF ((stderr, "Shifting error token, "));
+
+ *++yyvsp = yylval;
+
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here. |
+`-------------------------------------*/
+yyacceptlab:
+ yyresult = 0;
+ goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here. |
+`-----------------------------------*/
+yyabortlab:
+ yyresult = 1;
+ goto yyreturn;
+
+#ifndef yyoverflow
+/*----------------------------------------------.
+| yyoverflowlab -- parser overflow comes here. |
+`----------------------------------------------*/
+yyoverflowlab:
+ yyerror ("parser stack overflow");
+ yyresult = 2;
+ /* Fall through. */
+#endif
+
+yyreturn:
+#ifndef yyoverflow
+ if (yyss != yyssa)
+ YYSTACK_FREE (yyss);
+#endif
+ return yyresult;
+}
+
+
+#line 379 "vcc.y"
+
+/****************************************************************************/
+static int pushVObject(const char *prop)
+ {
+ VObject *newObj;
+ if (ObjStackTop == MAXLEVEL)
+ return FALSE;
+
+ ObjStack[++ObjStackTop] = curObj;
+
+ if (curObj) {
+ newObj = addProp(curObj,prop);
+ curObj = newObj;
+ }
+ else
+ curObj = newVObject(prop);
+
+ return TRUE;
+ }
+
+
+/****************************************************************************/
+/* This pops the recently built vCard off the stack and returns it. */
+static VObject* popVObject()
+ {
+ VObject *oldObj;
+ if (ObjStackTop < 0) {
+ yyerror("pop on empty Object Stack\n");
+ return 0;
+ }
+ oldObj = curObj;
+ curObj = ObjStack[ObjStackTop--];
+
+ return oldObj;
+ }
+
+
+/* static void enterValues(const char *value) */
+/* { */
+/* if (fieldedProp && *fieldedProp) { */
+/* if (value) { */
+/* addPropValue(curProp,*fieldedProp,value); */
+/* } */
+ /* else this field is empty, advance to next field */
+/* fieldedProp++; */
+/* } */
+/* else { */
+/* if (value) { */
+/* setVObjectUStringZValue_(curProp,fakeUnicode(value,0)); */
+/* } */
+/* } */
+/* deleteStr(value); */
+/* } */
+
+static void appendValue(const char *value)
+{
+ char *p1, *p2;
+ wchar_t *p3;
+ int i;
+
+ if (fieldedProp && *fieldedProp) {
+ if (value) {
+ addPropValue(curProp, *fieldedProp, value);
+ }
+ /* else this field is empty, advance to next field */
+ fieldedProp++;
+ } else {
+ if (value) {
+ if (vObjectUStringZValue(curProp)) {
+ p1 = fakeCString(vObjectUStringZValue(curProp));
+ p2 = malloc(sizeof(char *) * (strlen(p1)+strlen(value)+1));
+ strcpy(p2, p1);
+ deleteStr(p1);
+
+ i = strlen(p2);
+ p2[i] = ',';
+ p2[i+1] = '\0';
+ p2 = strcat(p2, value);
+ p3 = (wchar_t *) vObjectUStringZValue(curProp);
+ free(p3);
+ setVObjectUStringZValue_(curProp,fakeUnicode(p2,0));
+ deleteStr(p2);
+ } else {
+ setVObjectUStringZValue_(curProp,fakeUnicode(value,0));
+ }
+ }
+ }
+ deleteStr(value);
+}
+
+
+static void enterProps(const char *s)
+ {
+ curProp = addGroup(curObj,s);
+ deleteStr(s);
+ }
+
+static void enterAttr(const char *s1, const char *s2)
+ {
+ const char *p1=0L, *p2=0L;
+ p1 = lookupProp_(s1);
+ if (s2) {
+ VObject *a;
+ p2 = lookupProp_(s2);
+ a = addProp(curProp,p1);
+ setVObjectStringZValue(a,p2);
+ }
+ else
+ addProp(curProp,p1);
+ if (strcasecmp(p1,VCBase64Prop) == 0 || (s2 && strcasecmp(p2,VCBase64Prop)==0))
+ lexPushMode(L_BASE64);
+ else if (strcasecmp(p1,VCQuotedPrintableProp) == 0
+ || (s2 && strcasecmp(p2,VCQuotedPrintableProp)==0))
+ lexPushMode(L_QUOTED_PRINTABLE);
+ deleteStr(s1); deleteStr(s2);
+ }
+
+
+#define MAX_LEX_LOOKAHEAD_0 32
+#define MAX_LEX_LOOKAHEAD 64
+#define MAX_LEX_MODE_STACK_SIZE 10
+#define LEXMODE() (lexBuf.lexModeStack[lexBuf.lexModeStackTop])
+
+struct LexBuf {
+ /* input */
+ FILE *inputFile;
+ char *inputString;
+ unsigned long curPos;
+ unsigned long inputLen;
+ /* lookahead buffer */
+ /* -- lookahead buffer is short instead of char so that EOF
+ / can be represented correctly.
+ */
+ unsigned long len;
+ short buf[MAX_LEX_LOOKAHEAD];
+ unsigned long getPtr;
+ /* context stack */
+ unsigned long lexModeStackTop;
+ enum LexMode lexModeStack[MAX_LEX_MODE_STACK_SIZE];
+ /* token buffer */
+ unsigned long maxToken;
+ char *strs;
+ unsigned long strsLen;
+ } lexBuf;
+
+static void lexPushMode(enum LexMode mode)
+ {
+ if (lexBuf.lexModeStackTop == (MAX_LEX_MODE_STACK_SIZE-1))
+ yyerror("lexical context stack overflow");
+ else {
+ lexBuf.lexModeStack[++lexBuf.lexModeStackTop] = mode;
+ }
+ }
+
+static void lexPopMode(int top)
+ {
+ /* special case of pop for ease of error recovery -- this
+ version will never underflow */
+ if (top)
+ lexBuf.lexModeStackTop = 0;
+ else
+ if (lexBuf.lexModeStackTop > 0) lexBuf.lexModeStackTop--;
+ }
+
+static int lexWithinMode(enum LexMode mode) {
+ unsigned long i;
+ for (i=0;i<lexBuf.lexModeStackTop;i++)
+ if (mode == lexBuf.lexModeStack[i]) return 1;
+ return 0;
+ }
+
+static int lexGetc_()
+ {
+ /* get next char from input, no buffering. */
+ if (lexBuf.curPos == lexBuf.inputLen)
+ return EOF;
+ else if (lexBuf.inputString)
+ return *(lexBuf.inputString + lexBuf.curPos++);
+ else {
+ if (!feof(lexBuf.inputFile))
+ return fgetc(lexBuf.inputFile);
+ else
+ return EOF;
+ }
+ }
+
+static int lexGeta()
+ {
+ ++lexBuf.len;
+ return (lexBuf.buf[lexBuf.getPtr] = lexGetc_());
+ }
+
+static int lexGeta_(int i)
+ {
+ ++lexBuf.len;
+ return (lexBuf.buf[(lexBuf.getPtr+i)%MAX_LEX_LOOKAHEAD] = lexGetc_());
+ }
+
+static void lexSkipLookahead() {
+ if (lexBuf.len > 0 && lexBuf.buf[lexBuf.getPtr]!=EOF) {
+ /* don't skip EOF. */
+ lexBuf.getPtr = (lexBuf.getPtr + 1) % MAX_LEX_LOOKAHEAD;
+ lexBuf.len--;
+ }
+ }
+
+static int lexLookahead() {
+ int c = (lexBuf.len)?
+ lexBuf.buf[lexBuf.getPtr]:
+ lexGeta();
+ /* do the \r\n -> \n or \r -> \n translation here */
+ if (c == '\r') {
+ int a = (lexBuf.len>1)?
+ lexBuf.buf[(lexBuf.getPtr+1)%MAX_LEX_LOOKAHEAD]:
+ lexGeta_(1);
+ if (a == '\n') {
+ lexSkipLookahead();
+ }
+ lexBuf.buf[lexBuf.getPtr] = c = '\n';
+ }
+ else if (c == '\n') {
+ int a;
+ if (lexBuf.len > 1)
+ a = lexBuf.buf[lexBuf.getPtr];
+ else
+ a = lexGeta_(1);
+ if (a == '\r') {
+ lexSkipLookahead();
+ }
+ lexBuf.buf[lexBuf.getPtr] = '\n';
+ }
+ return c;
+ }
+
+static int lexGetc() {
+ int c = lexLookahead();
+ if (lexBuf.len > 0 && lexBuf.buf[lexBuf.getPtr]!=EOF) {
+ /* EOF will remain in lookahead buffer */
+ lexBuf.getPtr = (lexBuf.getPtr + 1) % MAX_LEX_LOOKAHEAD;
+ lexBuf.len--;
+ }
+ return c;
+ }
+
+static void lexSkipLookaheadWord() {
+ if (lexBuf.strsLen <= lexBuf.len) {
+ lexBuf.len -= lexBuf.strsLen;
+ lexBuf.getPtr = (lexBuf.getPtr + lexBuf.strsLen) % MAX_LEX_LOOKAHEAD;
+ }
+ }
+
+static void lexClearToken()
+ {
+ lexBuf.strsLen = 0;
+ }
+
+static void lexAppendc(int c)
+ {
+ /* not sure if I am doing this right to fix purify report -- PGB */
+ lexBuf.strs = (char *) realloc(lexBuf.strs, (size_t) lexBuf.strsLen + 1);
+ lexBuf.strs[lexBuf.strsLen] = c;
+ /* append up to zero termination */
+ if (c == 0) return;
+ lexBuf.strsLen++;
+ if (lexBuf.strsLen > lexBuf.maxToken) {
+ /* double the token string size */
+ lexBuf.maxToken <<= 1;
+ lexBuf.strs = (char*) realloc(lexBuf.strs,(size_t)lexBuf.maxToken);
+ }
+ }
+
+static char* lexStr() {
+ return dupStr(lexBuf.strs,(size_t)lexBuf.strsLen+1);
+ }
+
+static void lexSkipWhite() {
+ int c = lexLookahead();
+ while (c == ' ' || c == '\t') {
+ lexSkipLookahead();
+ c = lexLookahead();
+ }
+ }
+
+static char* lexGetWord() {
+ int c;
+ lexSkipWhite();
+ lexClearToken();
+ c = lexLookahead();
+ /* some "words" have a space in them, like "NEEDS ACTION".
+ this may be an oversight of the spec, but it is true nevertheless.
+ while (c != EOF && !strchr("\t\n ;:=",c)) { */
+ while (c != EOF && !strchr("\n;:=",c)) {
+ lexAppendc(c);
+ lexSkipLookahead();
+ c = lexLookahead();
+ }
+ lexAppendc(0);
+ return lexStr();
+ }
+
+void lexPushLookahead(char *s, int len) {
+ int putptr;
+ if (len == 0) len = strlen(s);
+ putptr = (int)lexBuf.getPtr - len;
+ /* this function assumes that length of word to push back
+ / is not greater than MAX_LEX_LOOKAHEAD.
+ */
+ if (putptr < 0) putptr += MAX_LEX_LOOKAHEAD;
+ lexBuf.getPtr = putptr;
+ while (*s) {
+ lexBuf.buf[putptr] = *s++;
+ putptr = (putptr + 1) % MAX_LEX_LOOKAHEAD;
+ }
+ lexBuf.len += len;
+ }
+
+static void lexPushLookaheadc(int c) {
+ int putptr;
+ /* can't putback EOF, because it never leaves lookahead buffer */
+ if (c == EOF) return;
+ putptr = (int)lexBuf.getPtr - 1;
+ if (putptr < 0) putptr += MAX_LEX_LOOKAHEAD;
+ lexBuf.getPtr = putptr;
+ lexBuf.buf[putptr] = c;
+ lexBuf.len += 1;
+ }
+
+static char* lexLookaheadWord() {
+ /* this function can lookahead word with max size of MAX_LEX_LOOKAHEAD_0
+ / and thing bigger than that will stop the lookahead and return 0;
+ / leading white spaces are not recoverable.
+ */
+ int c;
+ int len = 0;
+ int curgetptr = 0;
+ lexSkipWhite();
+ lexClearToken();
+ curgetptr = (int)lexBuf.getPtr; /* remember! */
+ while (len < (MAX_LEX_LOOKAHEAD_0)) {
+ c = lexGetc();
+ len++;
+ if (c == EOF || strchr("\t\n ;:=", c)) {
+ lexAppendc(0);
+ /* restore lookahead buf. */
+ lexBuf.len += len;
+ lexBuf.getPtr = curgetptr;
+ return lexStr();
+ }
+ else
+ lexAppendc(c);
+ }
+ lexBuf.len += len; /* char that has been moved to lookahead buffer */
+ lexBuf.getPtr = curgetptr;
+ return 0;
+ }
+
+#ifdef _SUPPORT_LINE_FOLDING
+static void handleMoreRFC822LineBreak(int c) {
+ /* suport RFC 822 line break in cases like
+ * ADR: foo;
+ * morefoo;
+ * more foo;
+ */
+ if (c == ';') {
+ int a;
+ lexSkipLookahead();
+ /* skip white spaces */
+ a = lexLookahead();
+ while (a == ' ' || a == '\t') {
+ lexSkipLookahead();
+ a = lexLookahead();
+ }
+ if (a == '\n') {
+ lexSkipLookahead();
+ a = lexLookahead();
+ if (a == ' ' || a == '\t') {
+ /* continuation, throw away all the \n and spaces read so
+ * far
+ */
+ lexSkipWhite();
+ lexPushLookaheadc(';');
+ }
+ else {
+ lexPushLookaheadc('\n');
+ lexPushLookaheadc(';');
+ }
+ }
+ else {
+ lexPushLookaheadc(';');
+ }
+ }
+ }
+
+static char* lexGet1Value() {
+ int c;
+ lexSkipWhite();
+ c = lexLookahead();
+ lexClearToken();
+ while (c != EOF && c != ';') {
+ if (c == '\n') {
+ int a;
+ lexSkipLookahead();
+ a = lexLookahead();
+ if (a == ' ' || a == '\t') {
+ lexAppendc(' ');
+ lexSkipLookahead();
+ }
+ else {
+ lexPushLookaheadc('\n');
+ break;
+ }
+ }
+ else {
+ lexAppendc(c);
+ lexSkipLookahead();
+ }
+ c = lexLookahead();
+ }
+ lexAppendc(0);
+ handleMoreRFC822LineBreak(c);
+ return c==EOF?0:lexStr();
+ }
+#endif
+
+char* lexGetStrUntil(char *termset) {
+ int c = lexLookahead();
+ lexClearToken();
+ while (c != EOF && !strchr(termset,c)) {
+ lexAppendc(c);
+ lexSkipLookahead();
+ c = lexLookahead();
+ }
+ lexAppendc(0);
+ return c==EOF?0:lexStr();
+ }
+
+static int match_begin_name(int end) {
+ char *n = lexLookaheadWord();
+ int token = ID;
+ if (n) {
+ if (!strcasecmp(n,"vcard")) token = end?END_VCARD:BEGIN_VCARD;
+ else if (!strcasecmp(n,"vcalendar")) token = end?END_VCAL:BEGIN_VCAL;
+ else if (!strcasecmp(n,"vevent")) token = end?END_VEVENT:BEGIN_VEVENT;
+ else if (!strcasecmp(n,"vtodo")) token = end?END_VTODO:BEGIN_VTODO;
+ deleteStr(n);
+ return token;
+ }
+ return 0;
+ }
+
+
+void initLex(const char *inputstring, unsigned long inputlen, FILE *inputfile)
+ {
+ /* initialize lex mode stack */
+ lexBuf.lexModeStack[lexBuf.lexModeStackTop=0] = L_NORMAL;
+
+ /* iniatialize lex buffer. */
+ lexBuf.inputString = (char*) inputstring;
+ lexBuf.inputLen = inputlen;
+ lexBuf.curPos = 0;
+ lexBuf.inputFile = inputfile;
+
+ lexBuf.len = 0;
+ lexBuf.getPtr = 0;
+
+ lexBuf.maxToken = MAXTOKEN;
+ lexBuf.strs = (char*)malloc(MAXTOKEN);
+ lexBuf.strsLen = 0;
+
+ }
+
+static void finiLex() {
+ free(lexBuf.strs);
+ }
+
+
+/****************************************************************************/
+/* This parses and converts the base64 format for binary encoding into
+ * a decoded buffer (allocated with new). See RFC 1521.
+ */
+static char * lexGetDataFromBase64()
+ {
+ unsigned long bytesLen = 0, bytesMax = 0;
+ int quadIx = 0, pad = 0;
+ unsigned long trip = 0;
+ unsigned char b;
+ int c;
+ unsigned char *bytes = NULL;
+ unsigned char *oldBytes = NULL;
+
+ DBG_(("db: lexGetDataFromBase64\n"));
+ while (1) {
+ c = lexGetc();
+ if (c == '\n') {
+ ++mime_lineNum;
+ if (lexLookahead() == '\n') {
+ /* a '\n' character by itself means end of data */
+ break;
+ }
+ else continue; /* ignore '\n' */
+ }
+ else {
+ if ((c >= 'A') && (c <= 'Z'))
+ b = (unsigned char)(c - 'A');
+ else if ((c >= 'a') && (c <= 'z'))
+ b = (unsigned char)(c - 'a') + 26;
+ else if ((c >= '0') && (c <= '9'))
+ b = (unsigned char)(c - '0') + 52;
+ else if (c == '+')
+ b = 62;
+ else if (c == '/')
+ b = 63;
+ else if (c == '=') {
+ b = 0;
+ pad++;
+ } else if ((c == ' ') || (c == '\t')) {
+ continue;
+ } else { /* error condition */
+ if (bytes) free(bytes);
+ else if (oldBytes) free(oldBytes);
+ /* error recovery: skip until 2 adjacent newlines. */
+ DBG_(("db: invalid character 0x%x '%c'\n", c,c));
+ if (c != EOF) {
+ c = lexGetc();
+ while (c != EOF) {
+ if (c == '\n' && lexLookahead() == '\n') {
+ ++mime_lineNum;
+ break;
+ }
+ c = lexGetc();
+ }
+ }
+ return NULL;
+ }
+ trip = (trip << 6) | b;
+ if (++quadIx == 4) {
+ unsigned char outBytes[3];
+ int numOut;
+ int i;
+ for (i = 0; i < 3; i++) {
+ outBytes[2-i] = (unsigned char)(trip & 0xFF);
+ trip >>= 8;
+ }
+ numOut = 3 - pad;
+ if (bytesLen + numOut > bytesMax) {
+ if (!bytes) {
+ bytesMax = 1024;
+ bytes = (unsigned char*)malloc((size_t)bytesMax);
+ }
+ else {
+ bytesMax <<= 2;
+ oldBytes = bytes;
+ bytes = (unsigned char*)realloc(bytes,(size_t)bytesMax);
+ }
+ if (bytes == 0) {
+ mime_error("out of memory while processing BASE64 data\n");
+ }
+ }
+ if (bytes) {
+ memcpy(bytes + bytesLen, outBytes, numOut);
+ bytesLen += numOut;
+ }
+ trip = 0;
+ quadIx = 0;
+ }
+ }
+ } /* while */
+ DBG_(("db: bytesLen = %d\n", bytesLen));
+ /* kludge: all this won't be necessary if we have tree form
+ representation */
+ if (bytes) {
+ setValueWithSize(curProp,bytes,(unsigned int)bytesLen);
+ free(bytes);
+ }
+ else if (oldBytes) {
+ setValueWithSize(curProp,oldBytes,(unsigned int)bytesLen);
+ free(oldBytes);
+ }
+ return 0;
+ }
+
+static int match_begin_end_name(int end) {
+ int token;
+ lexSkipWhite();
+ if (lexLookahead() != ':') return ID;
+ lexSkipLookahead();
+ lexSkipWhite();
+ token = match_begin_name(end);
+ if (token == ID) {
+ lexPushLookaheadc(':');
+ DBG_(("db: ID '%s'\n", yylval.str));
+ return ID;
+ }
+ else if (token != 0) {
+ lexSkipLookaheadWord();
+ deleteStr(yylval.str);
+ DBG_(("db: begin/end %d\n", token));
+ return token;
+ }
+ return 0;
+ }
+
+static char* lexGetQuotedPrintable()
+ {
+ char cur;
+
+ lexClearToken();
+ do {
+ cur = lexGetc();
+ switch (cur) {
+ case '=': {
+ int c = 0;
+ int next[2];
+ int i;
+ for (i = 0; i < 2; i++) {
+ next[i] = lexGetc();
+ if (next[i] >= '0' && next[i] <= '9')
+ c = c * 16 + next[i] - '0';
+ else if (next[i] >= 'A' && next[i] <= 'F')
+ c = c * 16 + next[i] - 'A' + 10;
+ else
+ break;
+ }
+ if (i == 0) {
+ /* single '=' follow by LINESEP is continuation sign? */
+ if (next[0] == '\n') {
+ ++mime_lineNum;
+ }
+ else {
+ lexPushLookaheadc('=');
+ goto EndString;
+ }
+ }
+ else if (i == 1) {
+ lexPushLookaheadc(next[1]);
+ lexPushLookaheadc(next[0]);
+ lexAppendc('=');
+ } else {
+ lexAppendc(c);
+ }
+ break;
+ } /* '=' */
+ case '\n': {
+ lexPushLookaheadc('\n');
+ goto EndString;
+ }
+ case (char)EOF:
+ break;
+ default:
+ lexAppendc(cur);
+ break;
+ } /* switch */
+ } while (cur != (char)EOF);
+
+EndString:
+ lexAppendc(0);
+ return lexStr();
+ } /* LexQuotedPrintable */
+
+static int yylex() {
+
+ int lexmode = LEXMODE();
+ if (lexmode == L_VALUES) {
+ int c = lexGetc();
+ if (c == ';') {
+ DBG_(("db: SEMICOLON\n"));
+ lexPushLookaheadc(c);
+ handleMoreRFC822LineBreak(c);
+ lexSkipLookahead();
+ return SEMICOLON;
+ }
+ else if (strchr("\n",c)) {
+ ++mime_lineNum;
+ /* consume all line separator(s) adjacent to each other */
+ c = lexLookahead();
+ while (strchr("\n",c)) {
+ lexSkipLookahead();
+ c = lexLookahead();
+ ++mime_lineNum;
+ }
+ DBG_(("db: LINESEP\n"));
+ return LINESEP;
+ }
+ else {
+ char *p = 0;
+ lexPushLookaheadc(c);
+ if (lexWithinMode(L_BASE64)) {
+ /* get each char and convert to bin on the fly... */
+ p = lexGetDataFromBase64();
+ yylval.str = p;
+ return STRING;
+ }
+ else if (lexWithinMode(L_QUOTED_PRINTABLE)) {
+ p = lexGetQuotedPrintable();
+ }
+ else {
+#ifdef _SUPPORT_LINE_FOLDING
+ p = lexGet1Value();
+#else
+ p = lexGetStrUntil(";\n");
+#endif
+ }
+ if (p) {
+ DBG_(("db: STRING: '%s'\n", p));
+ yylval.str = p;
+ return STRING;
+ }
+ else return 0;
+ }
+ }
+ else {
+ /* normal mode */
+ while (1) {
+ int c = lexGetc();
+ switch(c) {
+ case ':': {
+ /* consume all line separator(s) adjacent to each other */
+ /* ignoring linesep immediately after colon. */
+ c = lexLookahead();
+ while (strchr("\n",c)) {
+ lexSkipLookahead();
+ c = lexLookahead();
+ ++mime_lineNum;
+ }
+ DBG_(("db: COLON\n"));
+ return COLON;
+ }
+ case ';':
+ DBG_(("db: SEMICOLON\n"));
+ return SEMICOLON;
+ case '=':
+ DBG_(("db: EQ\n"));
+ return EQ;
+ /* ignore tabs/newlines in this mode. We can't ignore
+ * spaces, because values like NEEDS ACTION have a space. */
+ case '\t': continue;
+ case '\n': {
+ ++mime_lineNum;
+ continue;
+ }
+ case EOF: return 0;
+ break;
+ default: {
+ lexPushLookaheadc(c);
+ if (isalpha(c) || c == ' ') {
+ char *t = lexGetWord();
+ yylval.str = t;
+ if (!strcasecmp(t, "begin")) {
+ return match_begin_end_name(0);
+ }
+ else if (!strcasecmp(t,"end")) {
+ return match_begin_end_name(1);
+ }
+ else {
+ DBG_(("db: ID '%s'\n", t));
+ return ID;
+ }
+ }
+ else {
+ /* unknown token */
+ return 0;
+ }
+ break;
+ }
+ }
+ }
+ }
+ return 0;
+ }
+
+
+/***************************************************************************/
+/*** Public Functions ****/
+/***************************************************************************/
+
+static VObject* Parse_MIMEHelper()
+ {
+ ObjStackTop = -1;
+ mime_numErrors = 0;
+ mime_lineNum = 1;
+ vObjList = 0;
+ curObj = 0;
+
+ if (yyparse() != 0)
+ return 0;
+
+ finiLex();
+ return vObjList;
+ }
+
+/****************************************************************************/
+VObject* Parse_MIME(const char *input, unsigned long len)
+ {
+ initLex(input, len, 0);
+ return Parse_MIMEHelper();
+ }
+
+
+VObject* Parse_MIME_FromFile(FILE *file)
+ {
+ VObject *result;
+ long startPos;
+
+ initLex(0,(unsigned long)-1,file);
+ startPos = ftell(file);
+ if (!(result = Parse_MIMEHelper())) {
+ fseek(file,startPos,SEEK_SET);
+ }
+ return result;
+ }
+
+VObject* Parse_MIME_FromFileName(const char *fname)
+ {
+ FILE *fp = fopen(fname,"r");
+ if (fp) {
+ VObject* o = Parse_MIME_FromFile(fp);
+ fclose(fp);
+ return o;
+ }
+ else {
+ char msg[255];
+ snprintf(msg, sizeof(msg), "can't open file '%s' for reading\n", fname);
+ mime_error_(msg);
+ return 0;
+ }
+ }
+
+/****************************************************************************/
+void YYDebug(const char *s)
+{
+ Parse_Debug(s);
+}
+
+
+static MimeErrorHandler mimeErrorHandler;
+
+void registerMimeErrorHandler(MimeErrorHandler me)
+ {
+ mimeErrorHandler = me;
+ }
+
+static void mime_error(char *s)
+ {
+ char msg[256];
+ if (mimeErrorHandler) {
+ snprintf(msg, sizeof(msg), "%s at line %d", s, mime_lineNum);
+ mimeErrorHandler(msg);
+ }
+ }
+
+static void mime_error_(char *s)
+ {
+ if (mimeErrorHandler) {
+ mimeErrorHandler(s);
+ }
+ }
+
+
+
diff --git a/libkcal/versit/vcc.h b/libkcal/versit/vcc.h
new file mode 100644
index 00000000..03886d16
--- /dev/null
+++ b/libkcal/versit/vcc.h
@@ -0,0 +1,76 @@
+/***************************************************************************
+(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International
+Business Machines Corporation and Siemens Rolm Communications Inc.
+
+For purposes of this license notice, the term Licensors shall mean,
+collectively, Apple Computer, Inc., AT&T Corp., International
+Business Machines Corporation and Siemens Rolm Communications Inc.
+The term Licensor shall mean any of the Licensors.
+
+Subject to acceptance of the following conditions, permission is hereby
+granted by Licensors without the need for written agreement and without
+license or royalty fees, to use, copy, modify and distribute this
+software for any purpose.
+
+The above copyright notice and the following four paragraphs must be
+reproduced in all copies of this software and any software including
+this software.
+
+THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE
+ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR
+MODIFICATIONS.
+
+IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT,
+INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
+OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
+
+EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.
+
+The software is provided with RESTRICTED RIGHTS. Use, duplication, or
+disclosure by the government are subject to restrictions set forth in
+DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
+
+***************************************************************************/
+
+#ifndef __VCC_H__
+#define __VCC_H__ 1
+
+#include "vobject.h"
+
+
+#if defined(__CPLUSPLUS__) || defined(__cplusplus)
+extern "C" {
+#endif
+
+typedef void (*MimeErrorHandler)(char *);
+
+extern void registerMimeErrorHandler(MimeErrorHandler);
+
+extern VObject* Parse_MIME(const char *input, unsigned long len);
+extern VObject* Parse_MIME_FromFileName(const char* fname);
+
+
+/* NOTE regarding Parse_MIME_FromFile
+The function below, Parse_MIME_FromFile, come in two flavors,
+neither of which is exported from the DLL. Each version takes
+a CFile or FILE* as a parameter, neither of which can be
+passed across a DLL interface (at least that is my experience).
+If you are linking this code into your build directly then
+you may find them a more convenient API that the other flavors
+that take a file name. If you use them with the DLL LIB you
+will get a link error.
+*/
+
+
+extern VObject* Parse_MIME_FromFile(FILE *file);
+
+#if defined(__CPLUSPLUS__) || defined(__cplusplus)
+}
+#endif
+
+#endif /* __VCC_H__ */
+
diff --git a/libkcal/versit/vcc.y b/libkcal/versit/vcc.y
new file mode 100644
index 00000000..fbfee0f6
--- /dev/null
+++ b/libkcal/versit/vcc.y
@@ -0,0 +1,1232 @@
+%{
+
+/***************************************************************************
+(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International
+Business Machines Corporation and Siemens Rolm Communications Inc.
+
+For purposes of this license notice, the term Licensors shall mean,
+collectively, Apple Computer, Inc., AT&T Corp., International
+Business Machines Corporation and Siemens Rolm Communications Inc.
+The term Licensor shall mean any of the Licensors.
+
+Subject to acceptance of the following conditions, permission is hereby
+granted by Licensors without the need for written agreement and without
+license or royalty fees, to use, copy, modify and distribute this
+software for any purpose.
+
+The above copyright notice and the following four paragraphs must be
+reproduced in all copies of this software and any software including
+this software.
+
+THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE
+ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR
+MODIFICATIONS.
+
+IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT,
+INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
+OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
+
+EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.
+
+The software is provided with RESTRICTED RIGHTS. Use, duplication, or
+disclosure by the government are subject to restrictions set forth in
+DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
+
+***************************************************************************/
+
+/*
+ * src: vcc.c
+ * doc: Parser for vCard and vCalendar. Note that this code is
+ * generated by a yacc parser generator. Generally it should not
+ * be edited by hand. The real source is vcc.y. The #line directives
+ * can be commented out here to make it easier to trace through
+ * in a debugger. However, if a bug is found it should
+ * be fixed in vcc.y and this file regenerated.
+ */
+
+
+/* debugging utilities */
+#if __DEBUG
+#define DBG_(x) printf x
+#else
+#define DBG_(x)
+#endif
+
+/**** External Functions ****/
+
+/* assign local name to parser variables and functions so that
+ we can use more than one yacc based parser.
+*/
+
+#define yyparse mime_parse
+#define yylex mime_lex
+#define yyerror mime_error
+#define yychar mime_char
+/* #define p_yyval p_mime_val */
+#undef yyval
+#define yyval mime_yyval
+/* #define p_yylval p_mime_lval */
+#undef yylval
+#define yylval mime_yylval
+#define yydebug mime_debug
+#define yynerrs mime_nerrs
+#define yyerrflag mime_errflag
+#define yyss mime_ss
+#define yyssp mime_ssp
+#define yyvs mime_vs
+#define yyvsp mime_vsp
+#define yylhs mime_lhs
+#define yylen mime_len
+#define yydefred mime_defred
+#define yydgoto mime_dgoto
+#define yysindex mime_sindex
+#define yyrindex mime_rindex
+#define yygindex mime_gindex
+#define yytable mime_table
+#define yycheck mime_check
+#define yyname mime_name
+#define yyrule mime_rule
+#undef YYPREFIX
+#define YYPREFIX "mime_"
+
+
+#ifndef _NO_LINE_FOLDING
+#define _SUPPORT_LINE_FOLDING 1
+#endif
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include "vcc.h"
+
+/* The following is a hack that I hope will get things compiling
+ * on SunOS 4.1.x systems
+ */
+#ifndef SEEK_SET
+#define SEEK_SET 0 /* Seek from beginning of file. */
+#define SEEK_CUR 1 /* Seek from current position. */
+#define SEEK_END 2 /* Seek from end of file. */
+#endif
+
+/**** Types, Constants ****/
+
+#define YYDEBUG 0 /* 1 to compile in some debugging code */
+#define MAXTOKEN 256 /* maximum token (line) length */
+#define YYSTACKSIZE 1000 /* ~unref ? */
+#define MAXLEVEL 10 /* max # of nested objects parseable */
+ /* (includes outermost) */
+
+
+/**** Global Variables ****/
+int mime_lineNum, mime_numErrors; /* yyerror() can use these */
+static VObject* vObjList;
+static VObject *curProp;
+static VObject *curObj;
+static VObject* ObjStack[MAXLEVEL];
+static int ObjStackTop;
+
+
+/* A helpful utility for the rest of the app. */
+#if __CPLUSPLUS__
+extern "C" {
+#endif
+
+ /* static void Parse_Debug(const char *s);*/
+ static void yyerror(char *s);
+
+#if __CPLUSPLUS__
+ };
+#endif
+
+int yyparse();
+static int yylex();
+
+static VObject* popVObject();
+
+
+enum LexMode {
+ L_NORMAL,
+ L_VCARD,
+ L_VCAL,
+ L_VEVENT,
+ L_VTODO,
+ L_VALUES,
+ L_BASE64,
+ L_QUOTED_PRINTABLE
+ };
+
+/**** Private Forward Declarations ****/
+static int pushVObject(const char *prop);
+static VObject* popVObject();
+char* lexDataFromBase64();
+static void lexPopMode(int top);
+static int lexWithinMode(enum LexMode mode);
+static void lexPushMode(enum LexMode mode);
+static void enterProps(const char *s);
+static void enterAttr(const char *s1, const char *s2);
+/* static void enterValues(const char *value); */
+static void appendValue(const char *value);
+static void mime_error_(char *s);
+
+%}
+
+/***************************************************************************/
+/*** The grammar ****/
+/***************************************************************************/
+
+%union {
+ char *str;
+ VObject *vobj;
+ }
+
+%token
+ EQ COLON DOT SEMICOLON SPACE HTAB LINESEP NEWLINE
+ BEGIN_VCARD END_VCARD BEGIN_VCAL END_VCAL
+ BEGIN_VEVENT END_VEVENT BEGIN_VTODO END_VTODO
+ ID
+
+/*
+ * NEWLINE is the token that would occur outside a vCard,
+ * while LINESEP is the token that would occur inside a vCard.
+ */
+
+%token <str>
+ STRING ID
+
+%type <str> name value
+
+%type <vobj> vcard vcal vobject
+
+%start mime
+
+%%
+
+
+mime: vobjects
+ ;
+
+vobjects: vobject
+ { addList(&vObjList, $1); curObj = 0; }
+ vobjects
+ | vobject
+ { addList(&vObjList, $1); curObj = 0; }
+ ;
+
+vobject: vcard
+ | vcal
+ ;
+
+vcard:
+ BEGIN_VCARD
+ {
+ lexPushMode(L_VCARD);
+ if (!pushVObject(VCCardProp)) YYERROR;
+ }
+ items END_VCARD
+ {
+ lexPopMode(0);
+ $$ = popVObject();
+ }
+ | BEGIN_VCARD
+ {
+ lexPushMode(L_VCARD);
+ if (!pushVObject(VCCardProp)) YYERROR;
+ }
+ END_VCARD
+ {
+ lexPopMode(0);
+ $$ = popVObject();
+ }
+ ;
+
+items: item items
+ | item
+ ;
+
+item: prop COLON
+ {
+ lexPushMode(L_VALUES);
+ }
+ values LINESEP
+ {
+ if (lexWithinMode(L_BASE64) || lexWithinMode(L_QUOTED_PRINTABLE))
+ lexPopMode(0);
+ lexPopMode(0);
+ }
+ | error
+ ;
+
+prop: name
+ {
+ enterProps($1);
+ }
+ attr_params
+ | name
+ {
+ enterProps($1);
+ }
+ ;
+
+attr_params: attr_param attr_params
+ | attr_param
+ ;
+
+attr_param: SEMICOLON attr
+ ;
+
+attr: name
+ {
+ enterAttr($1,0);
+ }
+ | name EQ name
+ {
+ enterAttr($1,$3);
+
+ }
+ ;
+
+name: ID
+ ;
+
+values: value SEMICOLON { appendValue($1); } values
+ | value
+ { appendValue($1); }
+ ;
+
+value: STRING
+ |
+ { $$ = 0; }
+ ;
+
+vcal:
+ BEGIN_VCAL
+ { if (!pushVObject(VCCalProp)) YYERROR; }
+ calitems
+ END_VCAL
+ { $$ = popVObject(); }
+ | BEGIN_VCAL
+ { if (!pushVObject(VCCalProp)) YYERROR; }
+ END_VCAL
+ { $$ = popVObject(); }
+ ;
+
+calitems: calitem calitems
+ | calitem
+ ;
+
+calitem:
+ eventitem
+ | todoitem
+ | items
+ ;
+
+eventitem:
+ BEGIN_VEVENT
+ {
+ lexPushMode(L_VEVENT);
+ if (!pushVObject(VCEventProp)) YYERROR;
+ }
+ items
+ END_VEVENT
+ {
+ lexPopMode(0);
+ popVObject();
+ }
+ | BEGIN_VEVENT
+ {
+ lexPushMode(L_VEVENT);
+ if (!pushVObject(VCEventProp)) YYERROR;
+ }
+ END_VEVENT
+ {
+ lexPopMode(0);
+ popVObject();
+ }
+ ;
+
+todoitem:
+ BEGIN_VTODO
+ {
+ lexPushMode(L_VTODO);
+ if (!pushVObject(VCTodoProp)) YYERROR;
+ }
+ items
+ END_VTODO
+ {
+ lexPopMode(0);
+ popVObject();
+ }
+ | BEGIN_VTODO
+ {
+ lexPushMode(L_VTODO);
+ if (!pushVObject(VCTodoProp)) YYERROR;
+ }
+ END_VTODO
+ {
+ lexPopMode(0);
+ popVObject();
+ }
+ ;
+
+%%
+/****************************************************************************/
+static int pushVObject(const char *prop)
+ {
+ VObject *newObj;
+ if (ObjStackTop == MAXLEVEL)
+ return FALSE;
+
+ ObjStack[++ObjStackTop] = curObj;
+
+ if (curObj) {
+ newObj = addProp(curObj,prop);
+ curObj = newObj;
+ }
+ else
+ curObj = newVObject(prop);
+
+ return TRUE;
+ }
+
+
+/****************************************************************************/
+/* This pops the recently built vCard off the stack and returns it. */
+static VObject* popVObject()
+ {
+ VObject *oldObj;
+ if (ObjStackTop < 0) {
+ yyerror("pop on empty Object Stack\n");
+ return 0;
+ }
+ oldObj = curObj;
+ curObj = ObjStack[ObjStackTop--];
+
+ return oldObj;
+ }
+
+
+/* static void enterValues(const char *value) */
+/* { */
+/* if (fieldedProp && *fieldedProp) { */
+/* if (value) { */
+/* addPropValue(curProp,*fieldedProp,value); */
+/* } */
+ /* else this field is empty, advance to next field */
+/* fieldedProp++; */
+/* } */
+/* else { */
+/* if (value) { */
+/* setVObjectUStringZValue_(curProp,fakeUnicode(value,0)); */
+/* } */
+/* } */
+/* deleteStr(value); */
+/* } */
+
+static void appendValue(const char *value)
+{
+ char *p1, *p2;
+ wchar_t *p3;
+ int i;
+
+ if (fieldedProp && *fieldedProp) {
+ if (value) {
+ addPropValue(curProp, *fieldedProp, value);
+ }
+ /* else this field is empty, advance to next field */
+ fieldedProp++;
+ } else {
+ if (value) {
+ if (vObjectUStringZValue(curProp)) {
+ p1 = fakeCString(vObjectUStringZValue(curProp));
+ p2 = malloc(sizeof(char *) * (strlen(p1)+strlen(value)+1));
+ strcpy(p2, p1);
+ deleteStr(p1);
+
+ i = strlen(p2);
+ p2[i] = ',';
+ p2[i+1] = '\0';
+ p2 = strcat(p2, value);
+ p3 = (wchar_t *) vObjectUStringZValue(curProp);
+ free(p3);
+ setVObjectUStringZValue_(curProp,fakeUnicode(p2,0));
+ deleteStr(p2);
+ } else {
+ setVObjectUStringZValue_(curProp,fakeUnicode(value,0));
+ }
+ }
+ }
+ deleteStr(value);
+}
+
+
+static void enterProps(const char *s)
+ {
+ curProp = addGroup(curObj,s);
+ deleteStr(s);
+ }
+
+static void enterAttr(const char *s1, const char *s2)
+ {
+ const char *p1=0L, *p2=0L;
+ p1 = lookupProp_(s1);
+ if (s2) {
+ VObject *a;
+ p2 = lookupProp_(s2);
+ a = addProp(curProp,p1);
+ setVObjectStringZValue(a,p2);
+ }
+ else
+ addProp(curProp,p1);
+ if (strcasecmp(p1,VCBase64Prop) == 0 || (s2 && strcasecmp(p2,VCBase64Prop)==0))
+ lexPushMode(L_BASE64);
+ else if (strcasecmp(p1,VCQuotedPrintableProp) == 0
+ || (s2 && strcasecmp(p2,VCQuotedPrintableProp)==0))
+ lexPushMode(L_QUOTED_PRINTABLE);
+ deleteStr(s1); deleteStr(s2);
+ }
+
+
+#define MAX_LEX_LOOKAHEAD_0 32
+#define MAX_LEX_LOOKAHEAD 64
+#define MAX_LEX_MODE_STACK_SIZE 10
+#define LEXMODE() (lexBuf.lexModeStack[lexBuf.lexModeStackTop])
+
+struct LexBuf {
+ /* input */
+ FILE *inputFile;
+ char *inputString;
+ unsigned long curPos;
+ unsigned long inputLen;
+ /* lookahead buffer */
+ /* -- lookahead buffer is short instead of char so that EOF
+ / can be represented correctly.
+ */
+ unsigned long len;
+ short buf[MAX_LEX_LOOKAHEAD];
+ unsigned long getPtr;
+ /* context stack */
+ unsigned long lexModeStackTop;
+ enum LexMode lexModeStack[MAX_LEX_MODE_STACK_SIZE];
+ /* token buffer */
+ unsigned long maxToken;
+ char *strs;
+ unsigned long strsLen;
+ } lexBuf;
+
+static void lexPushMode(enum LexMode mode)
+ {
+ if (lexBuf.lexModeStackTop == (MAX_LEX_MODE_STACK_SIZE-1))
+ yyerror("lexical context stack overflow");
+ else {
+ lexBuf.lexModeStack[++lexBuf.lexModeStackTop] = mode;
+ }
+ }
+
+static void lexPopMode(int top)
+ {
+ /* special case of pop for ease of error recovery -- this
+ version will never underflow */
+ if (top)
+ lexBuf.lexModeStackTop = 0;
+ else
+ if (lexBuf.lexModeStackTop > 0) lexBuf.lexModeStackTop--;
+ }
+
+static int lexWithinMode(enum LexMode mode) {
+ unsigned long i;
+ for (i=0;i<lexBuf.lexModeStackTop;i++)
+ if (mode == lexBuf.lexModeStack[i]) return 1;
+ return 0;
+ }
+
+static int lexGetc_()
+ {
+ /* get next char from input, no buffering. */
+ if (lexBuf.curPos == lexBuf.inputLen)
+ return EOF;
+ else if (lexBuf.inputString)
+ return *(lexBuf.inputString + lexBuf.curPos++);
+ else {
+ if (!feof(lexBuf.inputFile))
+ return fgetc(lexBuf.inputFile);
+ else
+ return EOF;
+ }
+ }
+
+static int lexGeta()
+ {
+ ++lexBuf.len;
+ return (lexBuf.buf[lexBuf.getPtr] = lexGetc_());
+ }
+
+static int lexGeta_(int i)
+ {
+ ++lexBuf.len;
+ return (lexBuf.buf[(lexBuf.getPtr+i)%MAX_LEX_LOOKAHEAD] = lexGetc_());
+ }
+
+static void lexSkipLookahead() {
+ if (lexBuf.len > 0 && lexBuf.buf[lexBuf.getPtr]!=EOF) {
+ /* don't skip EOF. */
+ lexBuf.getPtr = (lexBuf.getPtr + 1) % MAX_LEX_LOOKAHEAD;
+ lexBuf.len--;
+ }
+ }
+
+static int lexLookahead() {
+ int c = (lexBuf.len)?
+ lexBuf.buf[lexBuf.getPtr]:
+ lexGeta();
+ /* do the \r\n -> \n or \r -> \n translation here */
+ if (c == '\r') {
+ int a = (lexBuf.len>1)?
+ lexBuf.buf[(lexBuf.getPtr+1)%MAX_LEX_LOOKAHEAD]:
+ lexGeta_(1);
+ if (a == '\n') {
+ lexSkipLookahead();
+ }
+ lexBuf.buf[lexBuf.getPtr] = c = '\n';
+ }
+ else if (c == '\n') {
+ int a;
+ if (lexBuf.len > 1)
+ a = lexBuf.buf[lexBuf.getPtr];
+ else
+ a = lexGeta_(1);
+ if (a == '\r') {
+ lexSkipLookahead();
+ }
+ lexBuf.buf[lexBuf.getPtr] = '\n';
+ }
+ return c;
+ }
+
+static int lexGetc() {
+ int c = lexLookahead();
+ if (lexBuf.len > 0 && lexBuf.buf[lexBuf.getPtr]!=EOF) {
+ /* EOF will remain in lookahead buffer */
+ lexBuf.getPtr = (lexBuf.getPtr + 1) % MAX_LEX_LOOKAHEAD;
+ lexBuf.len--;
+ }
+ return c;
+ }
+
+static void lexSkipLookaheadWord() {
+ if (lexBuf.strsLen <= lexBuf.len) {
+ lexBuf.len -= lexBuf.strsLen;
+ lexBuf.getPtr = (lexBuf.getPtr + lexBuf.strsLen) % MAX_LEX_LOOKAHEAD;
+ }
+ }
+
+static void lexClearToken()
+ {
+ lexBuf.strsLen = 0;
+ }
+
+static void lexAppendc(int c)
+ {
+ /* not sure if I am doing this right to fix purify report -- PGB */
+ lexBuf.strs = (char *) realloc(lexBuf.strs, (size_t) lexBuf.strsLen + 1);
+ lexBuf.strs[lexBuf.strsLen] = c;
+ /* append up to zero termination */
+ if (c == 0) return;
+ lexBuf.strsLen++;
+ if (lexBuf.strsLen > lexBuf.maxToken) {
+ /* double the token string size */
+ lexBuf.maxToken <<= 1;
+ lexBuf.strs = (char*) realloc(lexBuf.strs,(size_t)lexBuf.maxToken);
+ }
+ }
+
+static char* lexStr() {
+ return dupStr(lexBuf.strs,(size_t)lexBuf.strsLen+1);
+ }
+
+static void lexSkipWhite() {
+ int c = lexLookahead();
+ while (c == ' ' || c == '\t') {
+ lexSkipLookahead();
+ c = lexLookahead();
+ }
+ }
+
+static char* lexGetWord() {
+ int c;
+ lexSkipWhite();
+ lexClearToken();
+ c = lexLookahead();
+ /* some "words" have a space in them, like "NEEDS ACTION".
+ this may be an oversight of the spec, but it is true nevertheless.
+ while (c != EOF && !strchr("\t\n ;:=",c)) { */
+ while (c != EOF && !strchr("\n;:=",c)) {
+ lexAppendc(c);
+ lexSkipLookahead();
+ c = lexLookahead();
+ }
+ lexAppendc(0);
+ return lexStr();
+ }
+
+void lexPushLookahead(char *s, int len) {
+ int putptr;
+ if (len == 0) len = strlen(s);
+ putptr = (int)lexBuf.getPtr - len;
+ /* this function assumes that length of word to push back
+ / is not greater than MAX_LEX_LOOKAHEAD.
+ */
+ if (putptr < 0) putptr += MAX_LEX_LOOKAHEAD;
+ lexBuf.getPtr = putptr;
+ while (*s) {
+ lexBuf.buf[putptr] = *s++;
+ putptr = (putptr + 1) % MAX_LEX_LOOKAHEAD;
+ }
+ lexBuf.len += len;
+ }
+
+static void lexPushLookaheadc(int c) {
+ int putptr;
+ /* can't putback EOF, because it never leaves lookahead buffer */
+ if (c == EOF) return;
+ putptr = (int)lexBuf.getPtr - 1;
+ if (putptr < 0) putptr += MAX_LEX_LOOKAHEAD;
+ lexBuf.getPtr = putptr;
+ lexBuf.buf[putptr] = c;
+ lexBuf.len += 1;
+ }
+
+static char* lexLookaheadWord() {
+ /* this function can lookahead word with max size of MAX_LEX_LOOKAHEAD_0
+ / and thing bigger than that will stop the lookahead and return 0;
+ / leading white spaces are not recoverable.
+ */
+ int c;
+ int len = 0;
+ int curgetptr = 0;
+ lexSkipWhite();
+ lexClearToken();
+ curgetptr = (int)lexBuf.getPtr; /* remember! */
+ while (len < (MAX_LEX_LOOKAHEAD_0)) {
+ c = lexGetc();
+ len++;
+ if (c == EOF || strchr("\t\n ;:=", c)) {
+ lexAppendc(0);
+ /* restore lookahead buf. */
+ lexBuf.len += len;
+ lexBuf.getPtr = curgetptr;
+ return lexStr();
+ }
+ else
+ lexAppendc(c);
+ }
+ lexBuf.len += len; /* char that has been moved to lookahead buffer */
+ lexBuf.getPtr = curgetptr;
+ return 0;
+ }
+
+#ifdef _SUPPORT_LINE_FOLDING
+static void handleMoreRFC822LineBreak(int c) {
+ /* suport RFC 822 line break in cases like
+ * ADR: foo;
+ * morefoo;
+ * more foo;
+ */
+ if (c == ';') {
+ int a;
+ lexSkipLookahead();
+ /* skip white spaces */
+ a = lexLookahead();
+ while (a == ' ' || a == '\t') {
+ lexSkipLookahead();
+ a = lexLookahead();
+ }
+ if (a == '\n') {
+ lexSkipLookahead();
+ a = lexLookahead();
+ if (a == ' ' || a == '\t') {
+ /* continuation, throw away all the \n and spaces read so
+ * far
+ */
+ lexSkipWhite();
+ lexPushLookaheadc(';');
+ }
+ else {
+ lexPushLookaheadc('\n');
+ lexPushLookaheadc(';');
+ }
+ }
+ else {
+ lexPushLookaheadc(';');
+ }
+ }
+ }
+
+static char* lexGet1Value() {
+ int c;
+ lexSkipWhite();
+ c = lexLookahead();
+ lexClearToken();
+ while (c != EOF && c != ';') {
+ if (c == '\n') {
+ int a;
+ lexSkipLookahead();
+ a = lexLookahead();
+ if (a == ' ' || a == '\t') {
+ lexAppendc(' ');
+ lexSkipLookahead();
+ }
+ else {
+ lexPushLookaheadc('\n');
+ break;
+ }
+ }
+ else {
+ lexAppendc(c);
+ lexSkipLookahead();
+ }
+ c = lexLookahead();
+ }
+ lexAppendc(0);
+ handleMoreRFC822LineBreak(c);
+ return c==EOF?0:lexStr();
+ }
+#endif
+
+char* lexGetStrUntil(char *termset) {
+ int c = lexLookahead();
+ lexClearToken();
+ while (c != EOF && !strchr(termset,c)) {
+ lexAppendc(c);
+ lexSkipLookahead();
+ c = lexLookahead();
+ }
+ lexAppendc(0);
+ return c==EOF?0:lexStr();
+ }
+
+static int match_begin_name(int end) {
+ char *n = lexLookaheadWord();
+ int token = ID;
+ if (n) {
+ if (!strcasecmp(n,"vcard")) token = end?END_VCARD:BEGIN_VCARD;
+ else if (!strcasecmp(n,"vcalendar")) token = end?END_VCAL:BEGIN_VCAL;
+ else if (!strcasecmp(n,"vevent")) token = end?END_VEVENT:BEGIN_VEVENT;
+ else if (!strcasecmp(n,"vtodo")) token = end?END_VTODO:BEGIN_VTODO;
+ deleteStr(n);
+ return token;
+ }
+ return 0;
+ }
+
+
+void initLex(const char *inputstring, unsigned long inputlen, FILE *inputfile)
+ {
+ /* initialize lex mode stack */
+ lexBuf.lexModeStack[lexBuf.lexModeStackTop=0] = L_NORMAL;
+
+ /* iniatialize lex buffer. */
+ lexBuf.inputString = (char*) inputstring;
+ lexBuf.inputLen = inputlen;
+ lexBuf.curPos = 0;
+ lexBuf.inputFile = inputfile;
+
+ lexBuf.len = 0;
+ lexBuf.getPtr = 0;
+
+ lexBuf.maxToken = MAXTOKEN;
+ lexBuf.strs = (char*)malloc(MAXTOKEN);
+ lexBuf.strsLen = 0;
+
+ }
+
+static void finiLex() {
+ free(lexBuf.strs);
+ }
+
+
+/****************************************************************************/
+/* This parses and converts the base64 format for binary encoding into
+ * a decoded buffer (allocated with new). See RFC 1521.
+ */
+static char * lexGetDataFromBase64()
+ {
+ unsigned long bytesLen = 0, bytesMax = 0;
+ int quadIx = 0, pad = 0;
+ unsigned long trip = 0;
+ unsigned char b;
+ int c;
+ unsigned char *bytes = NULL;
+ unsigned char *oldBytes = NULL;
+
+ DBG_(("db: lexGetDataFromBase64\n"));
+ while (1) {
+ c = lexGetc();
+ if (c == '\n') {
+ ++mime_lineNum;
+ if (lexLookahead() == '\n') {
+ /* a '\n' character by itself means end of data */
+ break;
+ }
+ else continue; /* ignore '\n' */
+ }
+ else {
+ if ((c >= 'A') && (c <= 'Z'))
+ b = (unsigned char)(c - 'A');
+ else if ((c >= 'a') && (c <= 'z'))
+ b = (unsigned char)(c - 'a') + 26;
+ else if ((c >= '0') && (c <= '9'))
+ b = (unsigned char)(c - '0') + 52;
+ else if (c == '+')
+ b = 62;
+ else if (c == '/')
+ b = 63;
+ else if (c == '=') {
+ b = 0;
+ pad++;
+ } else if ((c == ' ') || (c == '\t')) {
+ continue;
+ } else { /* error condition */
+ if (bytes) free(bytes);
+ else if (oldBytes) free(oldBytes);
+ /* error recovery: skip until 2 adjacent newlines. */
+ DBG_(("db: invalid character 0x%x '%c'\n", c,c));
+ if (c != EOF) {
+ c = lexGetc();
+ while (c != EOF) {
+ if (c == '\n' && lexLookahead() == '\n') {
+ ++mime_lineNum;
+ break;
+ }
+ c = lexGetc();
+ }
+ }
+ return NULL;
+ }
+ trip = (trip << 6) | b;
+ if (++quadIx == 4) {
+ unsigned char outBytes[3];
+ int numOut;
+ int i;
+ for (i = 0; i < 3; i++) {
+ outBytes[2-i] = (unsigned char)(trip & 0xFF);
+ trip >>= 8;
+ }
+ numOut = 3 - pad;
+ if (bytesLen + numOut > bytesMax) {
+ if (!bytes) {
+ bytesMax = 1024;
+ bytes = (unsigned char*)malloc((size_t)bytesMax);
+ }
+ else {
+ bytesMax <<= 2;
+ oldBytes = bytes;
+ bytes = (unsigned char*)realloc(bytes,(size_t)bytesMax);
+ }
+ if (bytes == 0) {
+ mime_error("out of memory while processing BASE64 data\n");
+ }
+ }
+ if (bytes) {
+ memcpy(bytes + bytesLen, outBytes, numOut);
+ bytesLen += numOut;
+ }
+ trip = 0;
+ quadIx = 0;
+ }
+ }
+ } /* while */
+ DBG_(("db: bytesLen = %d\n", bytesLen));
+ /* kludge: all this won't be necessary if we have tree form
+ representation */
+ if (bytes) {
+ setValueWithSize(curProp,bytes,(unsigned int)bytesLen);
+ free(bytes);
+ }
+ else if (oldBytes) {
+ setValueWithSize(curProp,oldBytes,(unsigned int)bytesLen);
+ free(oldBytes);
+ }
+ return 0;
+ }
+
+static int match_begin_end_name(int end) {
+ int token;
+ lexSkipWhite();
+ if (lexLookahead() != ':') return ID;
+ lexSkipLookahead();
+ lexSkipWhite();
+ token = match_begin_name(end);
+ if (token == ID) {
+ lexPushLookaheadc(':');
+ DBG_(("db: ID '%s'\n", yylval.str));
+ return ID;
+ }
+ else if (token != 0) {
+ lexSkipLookaheadWord();
+ deleteStr(yylval.str);
+ DBG_(("db: begin/end %d\n", token));
+ return token;
+ }
+ return 0;
+ }
+
+static char* lexGetQuotedPrintable()
+ {
+ char cur;
+
+ lexClearToken();
+ do {
+ cur = lexGetc();
+ switch (cur) {
+ case '=': {
+ int c = 0;
+ int next[2];
+ int i;
+ for (i = 0; i < 2; i++) {
+ next[i] = lexGetc();
+ if (next[i] >= '0' && next[i] <= '9')
+ c = c * 16 + next[i] - '0';
+ else if (next[i] >= 'A' && next[i] <= 'F')
+ c = c * 16 + next[i] - 'A' + 10;
+ else
+ break;
+ }
+ if (i == 0) {
+ /* single '=' follow by LINESEP is continuation sign? */
+ if (next[0] == '\n') {
+ ++mime_lineNum;
+ }
+ else {
+ lexPushLookaheadc('=');
+ goto EndString;
+ }
+ }
+ else if (i == 1) {
+ lexPushLookaheadc(next[1]);
+ lexPushLookaheadc(next[0]);
+ lexAppendc('=');
+ } else {
+ lexAppendc(c);
+ }
+ break;
+ } /* '=' */
+ case '\n': {
+ lexPushLookaheadc('\n');
+ goto EndString;
+ }
+ case (char)EOF:
+ break;
+ default:
+ lexAppendc(cur);
+ break;
+ } /* switch */
+ } while (cur != (char)EOF);
+
+EndString:
+ lexAppendc(0);
+ return lexStr();
+ } /* LexQuotedPrintable */
+
+static int yylex() {
+
+ int lexmode = LEXMODE();
+ if (lexmode == L_VALUES) {
+ int c = lexGetc();
+ if (c == ';') {
+ DBG_(("db: SEMICOLON\n"));
+ lexPushLookaheadc(c);
+ handleMoreRFC822LineBreak(c);
+ lexSkipLookahead();
+ return SEMICOLON;
+ }
+ else if (strchr("\n",c)) {
+ ++mime_lineNum;
+ /* consume all line separator(s) adjacent to each other */
+ c = lexLookahead();
+ while (strchr("\n",c)) {
+ lexSkipLookahead();
+ c = lexLookahead();
+ ++mime_lineNum;
+ }
+ DBG_(("db: LINESEP\n"));
+ return LINESEP;
+ }
+ else {
+ char *p = 0;
+ lexPushLookaheadc(c);
+ if (lexWithinMode(L_BASE64)) {
+ /* get each char and convert to bin on the fly... */
+ p = lexGetDataFromBase64();
+ yylval.str = p;
+ return STRING;
+ }
+ else if (lexWithinMode(L_QUOTED_PRINTABLE)) {
+ p = lexGetQuotedPrintable();
+ }
+ else {
+#ifdef _SUPPORT_LINE_FOLDING
+ p = lexGet1Value();
+#else
+ p = lexGetStrUntil(";\n");
+#endif
+ }
+ if (p) {
+ DBG_(("db: STRING: '%s'\n", p));
+ yylval.str = p;
+ return STRING;
+ }
+ else return 0;
+ }
+ }
+ else {
+ /* normal mode */
+ while (1) {
+ int c = lexGetc();
+ switch(c) {
+ case ':': {
+ /* consume all line separator(s) adjacent to each other */
+ /* ignoring linesep immediately after colon. */
+ c = lexLookahead();
+ while (strchr("\n",c)) {
+ lexSkipLookahead();
+ c = lexLookahead();
+ ++mime_lineNum;
+ }
+ DBG_(("db: COLON\n"));
+ return COLON;
+ }
+ case ';':
+ DBG_(("db: SEMICOLON\n"));
+ return SEMICOLON;
+ case '=':
+ DBG_(("db: EQ\n"));
+ return EQ;
+ /* ignore tabs/newlines in this mode. We can't ignore
+ * spaces, because values like NEEDS ACTION have a space. */
+ case '\t': continue;
+ case '\n': {
+ ++mime_lineNum;
+ continue;
+ }
+ case EOF: return 0;
+ break;
+ default: {
+ lexPushLookaheadc(c);
+ if (isalpha(c) || c == ' ') {
+ char *t = lexGetWord();
+ yylval.str = t;
+ if (!strcasecmp(t, "begin")) {
+ return match_begin_end_name(0);
+ }
+ else if (!strcasecmp(t,"end")) {
+ return match_begin_end_name(1);
+ }
+ else {
+ DBG_(("db: ID '%s'\n", t));
+ return ID;
+ }
+ }
+ else {
+ /* unknown token */
+ return 0;
+ }
+ break;
+ }
+ }
+ }
+ }
+ return 0;
+ }
+
+
+/***************************************************************************/
+/*** Public Functions ****/
+/***************************************************************************/
+
+static VObject* Parse_MIMEHelper()
+ {
+ ObjStackTop = -1;
+ mime_numErrors = 0;
+ mime_lineNum = 1;
+ vObjList = 0;
+ curObj = 0;
+
+ if (yyparse() != 0)
+ return 0;
+
+ finiLex();
+ return vObjList;
+ }
+
+/****************************************************************************/
+VObject* Parse_MIME(const char *input, unsigned long len)
+ {
+ initLex(input, len, 0);
+ return Parse_MIMEHelper();
+ }
+
+
+VObject* Parse_MIME_FromFile(FILE *file)
+ {
+ VObject *result;
+ long startPos;
+
+ initLex(0,(unsigned long)-1,file);
+ startPos = ftell(file);
+ if (!(result = Parse_MIMEHelper())) {
+ fseek(file,startPos,SEEK_SET);
+ }
+ return result;
+ }
+
+VObject* Parse_MIME_FromFileName(const char *fname)
+ {
+ FILE *fp = fopen(fname,"r");
+ if (fp) {
+ VObject* o = Parse_MIME_FromFile(fp);
+ fclose(fp);
+ return o;
+ }
+ else {
+ char msg[255];
+ sprintf(msg, "can't open file '%s' for reading\n", fname);
+ mime_error_(msg);
+ return 0;
+ }
+ }
+
+/****************************************************************************/
+void YYDebug(const char *s)
+{
+ Parse_Debug(s);
+}
+
+
+static MimeErrorHandler mimeErrorHandler;
+
+void registerMimeErrorHandler(MimeErrorHandler me)
+ {
+ mimeErrorHandler = me;
+ }
+
+static void mime_error(char *s)
+ {
+ char msg[256];
+ if (mimeErrorHandler) {
+ sprintf(msg,"%s at line %d", s, mime_lineNum);
+ mimeErrorHandler(msg);
+ }
+ }
+
+static void mime_error_(char *s)
+ {
+ if (mimeErrorHandler) {
+ mimeErrorHandler(s);
+ }
+ }
+
diff --git a/libkcal/versit/vobject.c b/libkcal/versit/vobject.c
new file mode 100644
index 00000000..e6a19472
--- /dev/null
+++ b/libkcal/versit/vobject.c
@@ -0,0 +1,1429 @@
+/***************************************************************************
+(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International
+Business Machines Corporation and Siemens Rolm Communications Inc.
+
+For purposes of this license notice, the term Licensors shall mean,
+collectively, Apple Computer, Inc., AT&T Corp., International
+Business Machines Corporation and Siemens Rolm Communications Inc.
+The term Licensor shall mean any of the Licensors.
+
+Subject to acceptance of the following conditions, permission is hereby
+granted by Licensors without the need for written agreement and without
+license or royalty fees, to use, copy, modify and distribute this
+software for any purpose.
+
+The above copyright notice and the following four paragraphs must be
+reproduced in all copies of this software and any software including
+this software.
+
+THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE
+ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR
+MODIFICATIONS.
+
+IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT,
+INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
+OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
+
+EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.
+
+The software is provided with RESTRICTED RIGHTS. Use, duplication, or
+disclosure by the government are subject to restrictions set forth in
+DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
+
+***************************************************************************/
+
+/*
+ * src: vobject.c
+ * doc: vobject and APIs to construct vobject, APIs pretty print
+ * vobject, and convert a vobject into its textual representation.
+ */
+
+#include <stdlib.h>
+
+#include "vobject.h"
+#include <string.h>
+#include <stdio.h>
+
+
+#define NAME_OF(o) o->id
+#define VALUE_TYPE(o) o->valType
+#define STRINGZ_VALUE_OF(o) o->val.strs
+#define USTRINGZ_VALUE_OF(o) o->val.ustrs
+#define INTEGER_VALUE_OF(o) o->val.i
+#define LONG_VALUE_OF(o) o->val.l
+#define ANY_VALUE_OF(o) o->val.any
+#define VOBJECT_VALUE_OF(o) o->val.vobj
+
+const char** fieldedProp;
+
+
+
+/*----------------------------------------------------------------------
+ The following functions involve with memory allocation:
+ newVObject
+ deleteVObject
+ dupStr
+ deleteStr
+ newStrItem
+ deleteStrItem
+ ----------------------------------------------------------------------*/
+
+VObject* newVObject_(const char *id)
+{
+ VObject *p = (VObject*)malloc(sizeof(VObject));
+ p->next = 0;
+ p->id = id;
+ p->prop = 0;
+ VALUE_TYPE(p) = 0;
+ ANY_VALUE_OF(p) = 0;
+ return p;
+}
+
+VObject* newVObject(const char *id)
+{
+ return newVObject_(lookupStr(id));
+}
+
+void deleteVObject(VObject *p)
+{
+ if (p->id)
+ unUseStr(p->id);
+ if (p)
+ free(p);
+ p = NULL;
+}
+
+char* dupStr(const char *s, unsigned int size)
+{
+ char *t;
+ if (size == 0) {
+ size = strlen(s);
+ }
+ t = (char*)malloc(size+1);
+ if (t) {
+ memcpy(t,s,size);
+ t[size] = 0;
+ return t;
+ }
+ else {
+ return (char*)0;
+ }
+}
+
+void deleteStr(const char *p)
+{
+ if (p)
+ free((void*)p);
+ p = NULL;
+}
+
+
+static StrItem* newStrItem(const char *s, StrItem *next)
+{
+ StrItem *p = (StrItem*)malloc(sizeof(StrItem));
+ p->next = next;
+ p->s = s;
+ p->refCnt = 1;
+ return p;
+}
+
+static void deleteStrItem(StrItem *p)
+{
+ if (p)
+ free((void*)p);
+ p = NULL;
+}
+
+
+/*----------------------------------------------------------------------
+ The following function provide accesses to VObject's value.
+ ----------------------------------------------------------------------*/
+
+const char* vObjectName(VObject *o)
+{
+ return NAME_OF(o);
+}
+
+void setVObjectName(VObject *o, const char* id)
+{
+ NAME_OF(o) = id;
+}
+
+const char* vObjectStringZValue(VObject *o)
+{
+ return STRINGZ_VALUE_OF(o);
+}
+
+void setVObjectStringZValue(VObject *o, const char *s)
+{
+ STRINGZ_VALUE_OF(o) = dupStr(s,0);
+ VALUE_TYPE(o) = VCVT_STRINGZ;
+}
+
+void setVObjectStringZValue_(VObject *o, const char *s)
+{
+ STRINGZ_VALUE_OF(o) = s;
+ VALUE_TYPE(o) = VCVT_STRINGZ;
+}
+
+const wchar_t* vObjectUStringZValue(VObject *o)
+{
+ return USTRINGZ_VALUE_OF(o);
+}
+
+void setVObjectUStringZValue(VObject *o, const wchar_t *s)
+{
+ USTRINGZ_VALUE_OF(o) = (wchar_t*) dupStr((char*)s,(uStrLen(s)+1)*2);
+ VALUE_TYPE(o) = VCVT_USTRINGZ;
+}
+
+void setVObjectUStringZValue_(VObject *o, const wchar_t *s)
+{
+ USTRINGZ_VALUE_OF(o) = s;
+ VALUE_TYPE(o) = VCVT_USTRINGZ;
+}
+
+unsigned int vObjectIntegerValue(VObject *o)
+{
+ return INTEGER_VALUE_OF(o);
+}
+
+void setVObjectIntegerValue(VObject *o, unsigned int i)
+{
+ INTEGER_VALUE_OF(o) = i;
+ VALUE_TYPE(o) = VCVT_UINT;
+}
+
+unsigned long vObjectLongValue(VObject *o)
+{
+ return LONG_VALUE_OF(o);
+}
+
+void setVObjectLongValue(VObject *o, unsigned long l)
+{
+ LONG_VALUE_OF(o) = l;
+ VALUE_TYPE(o) = VCVT_ULONG;
+}
+
+void* vObjectAnyValue(VObject *o)
+{
+ return ANY_VALUE_OF(o);
+}
+
+void setVObjectAnyValue(VObject *o, void *t)
+{
+ ANY_VALUE_OF(o) = t;
+ VALUE_TYPE(o) = VCVT_RAW;
+}
+
+VObject* vObjectVObjectValue(VObject *o)
+{
+ return VOBJECT_VALUE_OF(o);
+}
+
+void setVObjectVObjectValue(VObject *o, VObject *p)
+{
+ VOBJECT_VALUE_OF(o) = p;
+ VALUE_TYPE(o) = VCVT_VOBJECT;
+}
+
+int vObjectValueType(VObject *o)
+{
+ return VALUE_TYPE(o);
+}
+
+
+/*----------------------------------------------------------------------
+ The following functions can be used to build VObject.
+ ----------------------------------------------------------------------*/
+
+VObject* addVObjectProp(VObject *o, VObject *p)
+{
+ /* circular link list pointed to tail */
+ /*
+ o {next,id,prop,val}
+ V
+ pn {next,id,prop,val}
+ V
+ ...
+ p1 {next,id,prop,val}
+ V
+ pn
+ -->
+ o {next,id,prop,val}
+ V
+ pn {next,id,prop,val}
+ V
+ p {next,id,prop,val}
+ ...
+ p1 {next,id,prop,val}
+ V
+ pn
+ */
+
+ VObject *tail = o->prop;
+ if (tail) {
+ p->next = tail->next;
+ o->prop = tail->next = p;
+ }
+ else {
+ o->prop = p->next = p;
+ }
+ return p;
+}
+
+VObject* addProp(VObject *o, const char *id)
+{
+ return addVObjectProp(o,newVObject(id));
+}
+
+VObject* addProp_(VObject *o, const char *id)
+{
+ return addVObjectProp(o,newVObject_(id));
+}
+
+void addList(VObject **o, VObject *p)
+{
+ p->next = 0;
+ if (*o == 0) {
+ *o = p;
+ }
+ else {
+ VObject *t = *o;
+ while (t->next) {
+ t = t->next;
+ }
+ t->next = p;
+ }
+}
+
+VObject* nextVObjectInList(VObject *o)
+{
+ return o->next;
+}
+
+VObject* setValueWithSize_(VObject *prop, void *val, unsigned int size)
+{
+ VObject *sizeProp;
+ setVObjectAnyValue(prop, val);
+ sizeProp = addProp(prop,VCDataSizeProp);
+ setVObjectLongValue(sizeProp, size);
+ return prop;
+}
+
+VObject* setValueWithSize(VObject *prop, void *val, unsigned int size)
+{
+ void *p = dupStr(val,size);
+ return setValueWithSize_(prop,p,p?size:0);
+}
+
+void initPropIterator(VObjectIterator *i, VObject *o)
+{
+ i->start = o->prop;
+ i->next = 0;
+}
+
+void initVObjectIterator(VObjectIterator *i, VObject *o)
+{
+ i->start = o->next;
+ i->next = 0;
+}
+
+int moreIteration(VObjectIterator *i)
+{
+ return (i->start && (i->next==0 || i->next!=i->start));
+}
+
+VObject* nextVObject(VObjectIterator *i)
+{
+ if (i->start && i->next != i->start) {
+ if (i->next == 0) {
+ i->next = i->start->next;
+ return i->next;
+ }
+ else {
+ i->next = i->next->next;
+ return i->next;
+ }
+ }
+ else return (VObject*)0;
+}
+
+VObject* isAPropertyOf(VObject *o, const char *id)
+{
+ VObjectIterator i;
+ initPropIterator(&i,o);
+ while (moreIteration(&i)) {
+ VObject *each = nextVObject(&i);
+ if (!strcasecmp(id,each->id))
+ return each;
+ }
+ return (VObject*)0;
+}
+
+VObject* addGroup(VObject *o, const char *g)
+{
+ /*
+ a.b.c
+ -->
+ prop(c)
+ prop(VCGrouping=b)
+ prop(VCGrouping=a)
+ */
+ char *dot = strrchr(g,'.');
+ if (dot) {
+ VObject *p, *t;
+ char *gs, *n = dot+1;
+ gs = dupStr(g,0); /* so we can write to it. */
+ /* used to be
+ * t = p = addProp_(o,lookupProp_(n));
+ */
+ t = p = addProp_(o,lookupProp(n));
+ dot = strrchr(gs,'.');
+ *dot = 0;
+ do {
+ dot = strrchr(gs,'.');
+ if (dot) {
+ n = dot+1;
+ *dot=0;
+ }
+ else
+ n = gs;
+ /* property(VCGroupingProp=n);
+ * and the value may have VCGrouping property
+ */
+ t = addProp(t,VCGroupingProp);
+ setVObjectStringZValue(t,lookupProp_(n));
+ } while (n != gs);
+ deleteStr(gs);
+ return p;
+ }
+ else
+ return addProp_(o,lookupProp(g));
+}
+
+VObject* addPropValue(VObject *o, const char *p, const char *v)
+{
+ VObject *prop;
+ prop = addProp(o,p);
+ setVObjectUStringZValue_(prop, fakeUnicode(v,0));
+ return prop;
+}
+
+VObject* addPropSizedValue_(VObject *o, const char *p, const char *v,
+ unsigned int size)
+{
+ VObject *prop;
+ prop = addProp(o,p);
+ setValueWithSize_(prop, (void*)v, size);
+ return prop;
+}
+
+VObject* addPropSizedValue(VObject *o, const char *p, const char *v,
+ unsigned int size)
+{
+ return addPropSizedValue_(o,p,dupStr(v,size),size);
+}
+
+
+
+/*----------------------------------------------------------------------
+ The following pretty print a VObject
+ ----------------------------------------------------------------------*/
+
+static void printVObject_(FILE *fp, VObject *o, int level);
+
+static void indent(FILE *fp, int level)
+{
+ int i;
+ for (i=0;i<level*4;i++) {
+ fputc(' ', fp);
+ }
+}
+
+static void printValue(FILE *fp, VObject *o, int level)
+{
+ switch (VALUE_TYPE(o)) {
+ case VCVT_USTRINGZ: {
+ char c;
+ char *t,*s;
+ s = t = fakeCString(USTRINGZ_VALUE_OF(o));
+ fputc('"',fp);
+ while (c=*t,c) {
+ fputc(c,fp);
+ if (c == '\n') indent(fp,level+2);
+ t++;
+ }
+ fputc('"',fp);
+ deleteStr(s);
+ break;
+ }
+ case VCVT_STRINGZ: {
+ char c;
+ const char *s = STRINGZ_VALUE_OF(o);
+ fputc('"',fp);
+ while (c=*s,c) {
+ fputc(c,fp);
+ if (c == '\n') indent(fp,level+2);
+ s++;
+ }
+ fputc('"',fp);
+ break;
+ }
+ case VCVT_UINT:
+ fprintf(fp,"%d", INTEGER_VALUE_OF(o)); break;
+ case VCVT_ULONG:
+ fprintf(fp,"%ld", LONG_VALUE_OF(o)); break;
+ case VCVT_RAW:
+ fprintf(fp,"[raw data]"); break;
+ case VCVT_VOBJECT:
+ fprintf(fp,"[vobject]\n");
+ printVObject_(fp,VOBJECT_VALUE_OF(o),level+1);
+ break;
+ case 0:
+ fprintf(fp,"[none]"); break;
+ default:
+ fprintf(fp,"[unknown]"); break;
+ }
+}
+
+static void printNameValue(FILE *fp,VObject *o, int level)
+{
+ indent(fp,level);
+ if (NAME_OF(o)) {
+ fprintf(fp,"%s", NAME_OF(o));
+ }
+ if (VALUE_TYPE(o)) {
+ fputc('=',fp);
+ printValue(fp,o, level);
+ }
+ fprintf(fp,"\n");
+}
+
+static void printVObject_(FILE *fp, VObject *o, int level)
+ {
+ VObjectIterator t;
+ if (o == 0) {
+ fprintf(fp,"[NULL]\n");
+ return;
+ }
+ printNameValue(fp,o,level);
+ initPropIterator(&t,o);
+ while (moreIteration(&t)) {
+ VObject *eachProp = nextVObject(&t);
+ printVObject_(fp,eachProp,level+1);
+ }
+ }
+
+void printVObject(FILE *fp,VObject *o)
+{
+ printVObject_(fp,o,0);
+}
+
+void printVObjectToFile(char *fname,VObject *o)
+{
+ FILE *fp = fopen(fname,"w");
+ if (fp) {
+ printVObject(fp,o);
+ fclose(fp);
+ }
+}
+
+void printVObjectsToFile(char *fname,VObject *list)
+{
+ FILE *fp = fopen(fname,"w");
+ if (fp) {
+ while (list) {
+ printVObject(fp,list);
+ list = nextVObjectInList(list);
+ }
+ fclose(fp);
+ }
+}
+
+void cleanVObject(VObject *o)
+{
+ if (o == 0) return;
+ if (o->prop) {
+ /* destroy time: cannot use the iterator here.
+ Have to break the cycle in the circular link
+ list and turns it into regular NULL-terminated
+ list -- since at some point of destruction,
+ the reference entry for the iterator to work
+ will not longer be valid.
+ */
+ VObject *p;
+ p = o->prop->next;
+ o->prop->next = 0;
+ do {
+ VObject *t = p->next;
+ cleanVObject(p);
+ p = t;
+ } while (p);
+ }
+ switch (VALUE_TYPE(o)) {
+ case VCVT_USTRINGZ:
+ case VCVT_STRINGZ:
+ case VCVT_RAW:
+ /* assume they are all allocated by malloc. */
+ free((char*)STRINGZ_VALUE_OF(o));
+ break;
+ case VCVT_VOBJECT:
+ cleanVObject(VOBJECT_VALUE_OF(o));
+ break;
+ }
+ deleteVObject(o);
+}
+
+void cleanVObjects(VObject *list)
+{
+ while (list) {
+ VObject *t = list;
+ list = nextVObjectInList(list);
+ cleanVObject(t);
+ }
+}
+
+/*----------------------------------------------------------------------
+ The following is a String Table Facilities.
+ ----------------------------------------------------------------------*/
+
+#define STRTBLSIZE 255
+
+static StrItem *strTbl[STRTBLSIZE];
+
+static unsigned int hashStr(const char *s)
+{
+ unsigned int h = 0;
+ int i;
+ for (i=0;s[i];i++) {
+ h += s[i]*i;
+ }
+ return h % STRTBLSIZE;
+}
+
+const char* lookupStr(const char *s)
+{
+ char *newS;
+
+ StrItem *t;
+ unsigned int h = hashStr(s);
+ if ((t = strTbl[h]) != 0) {
+ do {
+ if (strcasecmp(t->s,s) == 0) {
+ t->refCnt++;
+ return t->s;
+ }
+ t = t->next;
+ } while (t);
+ }
+ newS = dupStr(s,0);
+ strTbl[h] = newStrItem(newS,strTbl[h]);
+ return newS;
+}
+
+void unUseStr(const char *s)
+{
+ StrItem *cur, *prev;
+
+ unsigned int h = hashStr(s);
+ cur = strTbl[h];
+ prev = cur;
+ while (cur != 0) {
+ if (strcasecmp(cur->s,s) == 0) {
+ cur->refCnt--;
+ /* if that was the last reference to this string, kill it. */
+ if (cur->refCnt == 0) {
+ if (cur == strTbl[h]) {
+ strTbl[h] = cur->next;
+ deleteStr(prev->s);
+ deleteStrItem(prev);
+ } else {
+ prev->next = cur->next;
+ deleteStr(cur->s);
+ deleteStrItem(cur);
+ }
+ return;
+ }
+ }
+ prev = cur;
+ cur = cur->next;
+ }
+}
+
+void cleanStrTbl()
+{
+ int i;
+ for (i=0; i<STRTBLSIZE;i++) {
+ StrItem *t = strTbl[i];
+ while (t) {
+ StrItem *p;
+ deleteStr(t->s);
+ p = t;
+ t = t->next;
+ deleteStrItem(p);
+ }
+ strTbl[i] = 0;
+ }
+}
+
+
+struct PreDefProp {
+ const char *name;
+ const char *alias;
+ const char** fields;
+ unsigned int flags;
+ };
+
+/* flags in PreDefProp */
+#define PD_BEGIN 0x1
+#define PD_INTERNAL 0x2
+
+static const char *adrFields[] = {
+ VCPostalBoxProp,
+ VCExtAddressProp,
+ VCStreetAddressProp,
+ VCCityProp,
+ VCRegionProp,
+ VCPostalCodeProp,
+ VCCountryNameProp,
+ 0
+};
+
+static const char *nameFields[] = {
+ VCFamilyNameProp,
+ VCGivenNameProp,
+ VCAdditionalNamesProp,
+ VCNamePrefixesProp,
+ VCNameSuffixesProp,
+ NULL
+ };
+
+static const char *orgFields[] = {
+ VCOrgNameProp,
+ VCOrgUnitProp,
+ VCOrgUnit2Prop,
+ VCOrgUnit3Prop,
+ VCOrgUnit4Prop,
+ NULL
+ };
+
+static const char *AAlarmFields[] = {
+ VCRunTimeProp,
+ VCSnoozeTimeProp,
+ VCRepeatCountProp,
+ VCAudioContentProp,
+ 0
+ };
+
+/* ExDate -- has unamed fields */
+/* RDate -- has unamed fields */
+
+static const char *DAlarmFields[] = {
+ VCRunTimeProp,
+ VCSnoozeTimeProp,
+ VCRepeatCountProp,
+ VCDisplayStringProp,
+ 0
+ };
+
+static const char *MAlarmFields[] = {
+ VCRunTimeProp,
+ VCSnoozeTimeProp,
+ VCRepeatCountProp,
+ VCEmailAddressProp,
+ VCNoteProp,
+ 0
+ };
+
+static const char *PAlarmFields[] = {
+ VCRunTimeProp,
+ VCSnoozeTimeProp,
+ VCRepeatCountProp,
+ VCProcedureNameProp,
+ 0
+ };
+
+static struct PreDefProp propNames[] = {
+ { VC7bitProp, 0, 0, 0 },
+ { VC8bitProp, 0, 0, 0 },
+ { VCAAlarmProp, 0, AAlarmFields, 0 },
+ { VCAdditionalNamesProp, 0, 0, 0 },
+ { VCAdrProp, 0, adrFields, 0 },
+ { VCAgentProp, 0, 0, 0 },
+ { VCAIFFProp, 0, 0, 0 },
+ { VCAOLProp, 0, 0, 0 },
+ { VCAppleLinkProp, 0, 0, 0 },
+ { VCAttachProp, 0, 0, 0 },
+ { VCAttendeeProp, 0, 0, 0 },
+ { VCATTMailProp, 0, 0, 0 },
+ { VCAudioContentProp, 0, 0, 0 },
+ { VCAVIProp, 0, 0, 0 },
+ { VCBase64Prop, 0, 0, 0 },
+ { VCBBSProp, 0, 0, 0 },
+ { VCBirthDateProp, 0, 0, 0 },
+ { VCBMPProp, 0, 0, 0 },
+ { VCBodyProp, 0, 0, 0 },
+ { VCBusinessRoleProp, 0, 0, 0 },
+ { VCCalProp, 0, 0, PD_BEGIN },
+ { VCCaptionProp, 0, 0, 0 },
+ { VCCardProp, 0, 0, PD_BEGIN },
+ { VCCarProp, 0, 0, 0 },
+ { VCCategoriesProp, 0, 0, 0 },
+ { VCCellularProp, 0, 0, 0 },
+ { VCCGMProp, 0, 0, 0 },
+ { VCCharSetProp, 0, 0, 0 },
+ { VCCIDProp, VCContentIDProp, 0, 0 },
+ { VCCISProp, 0, 0, 0 },
+ { VCCityProp, 0, 0, 0 },
+ { VCClassProp, 0, 0, 0 },
+ { VCCommentProp, 0, 0, 0 },
+ { VCCompletedProp, 0, 0, 0 },
+ { VCContentIDProp, 0, 0, 0 },
+ { VCCountryNameProp, 0, 0, 0 },
+ { VCDAlarmProp, 0, DAlarmFields, 0 },
+ { VCDataSizeProp, 0, 0, PD_INTERNAL },
+ { VCDayLightProp, 0, 0, 0 },
+ { VCDCreatedProp, 0, 0, 0 },
+ { VCDeliveryLabelProp, 0, 0, 0 },
+ { VCDescriptionProp, 0, 0, 0 },
+ { VCDIBProp, 0, 0, 0 },
+ { VCDisplayStringProp, 0, 0, 0 },
+ { VCDomesticProp, 0, 0, 0 },
+ { VCDTendProp, 0, 0, 0 },
+ { VCDTstartProp, 0, 0, 0 },
+ { VCDueProp, 0, 0, 0 },
+ { VCEmailAddressProp, 0, 0, 0 },
+ { VCEncodingProp, 0, 0, 0 },
+ { VCEndProp, 0, 0, 0 },
+ { VCEventProp, 0, 0, PD_BEGIN },
+ { VCEWorldProp, 0, 0, 0 },
+ { VCExNumProp, 0, 0, 0 },
+ { VCExDateProp, 0, 0, 0 },
+ { VCExpectProp, 0, 0, 0 },
+ { VCExtAddressProp, 0, 0, 0 },
+ { VCFamilyNameProp, 0, 0, 0 },
+ { VCFaxProp, 0, 0, 0 },
+ { VCFullNameProp, 0, 0, 0 },
+ { VCGeoLocationProp, 0, 0, 0 },
+ { VCGeoProp, 0, 0, 0 },
+ { VCGIFProp, 0, 0, 0 },
+ { VCGivenNameProp, 0, 0, 0 },
+ { VCGroupingProp, 0, 0, 0 },
+ { VCHomeProp, 0, 0, 0 },
+ { VCIBMMailProp, 0, 0, 0 },
+ { VCInlineProp, 0, 0, 0 },
+ { VCInternationalProp, 0, 0, 0 },
+ { VCInternetProp, 0, 0, 0 },
+ { VCISDNProp, 0, 0, 0 },
+ { VCJPEGProp, 0, 0, 0 },
+ { VCLanguageProp, 0, 0, 0 },
+ { VCLastModifiedProp, 0, 0, 0 },
+ { VCLastRevisedProp, 0, 0, 0 },
+ { VCLocationProp, 0, 0, 0 },
+ { VCLogoProp, 0, 0, 0 },
+ { VCMailerProp, 0, 0, 0 },
+ { VCMAlarmProp, 0, MAlarmFields, 0 },
+ { VCMCIMailProp, 0, 0, 0 },
+ { VCMessageProp, 0, 0, 0 },
+ { VCMETProp, 0, 0, 0 },
+ { VCModemProp, 0, 0, 0 },
+ { VCMPEG2Prop, 0, 0, 0 },
+ { VCMPEGProp, 0, 0, 0 },
+ { VCMSNProp, 0, 0, 0 },
+ { VCNamePrefixesProp, 0, 0, 0 },
+ { VCNameProp, 0, nameFields, 0 },
+ { VCNameSuffixesProp, 0, 0, 0 },
+ { VCNoteProp, 0, 0, 0 },
+ { VCOrgNameProp, 0, 0, 0 },
+ { VCOrgProp, 0, orgFields, 0 },
+ { VCOrgUnit2Prop, 0, 0, 0 },
+ { VCOrgUnit3Prop, 0, 0, 0 },
+ { VCOrgUnit4Prop, 0, 0, 0 },
+ { VCOrgUnitProp, 0, 0, 0 },
+ { VCPagerProp, 0, 0, 0 },
+ { VCPAlarmProp, 0, PAlarmFields, 0 },
+ { VCParcelProp, 0, 0, 0 },
+ { VCPartProp, 0, 0, 0 },
+ { VCPCMProp, 0, 0, 0 },
+ { VCPDFProp, 0, 0, 0 },
+ { VCPGPProp, 0, 0, 0 },
+ { VCPhotoProp, 0, 0, 0 },
+ { VCPICTProp, 0, 0, 0 },
+ { VCPMBProp, 0, 0, 0 },
+ { VCPostalBoxProp, 0, 0, 0 },
+ { VCPostalCodeProp, 0, 0, 0 },
+ { VCPostalProp, 0, 0, 0 },
+ { VCPowerShareProp, 0, 0, 0 },
+ { VCPreferredProp, 0, 0, 0 },
+ { VCPriorityProp, 0, 0, 0 },
+ { VCProcedureNameProp, 0, 0, 0 },
+ { VCProdIdProp, 0, 0, 0 },
+ { VCProdigyProp, 0, 0, 0 },
+ { VCPronunciationProp, 0, 0, 0 },
+ { VCPSProp, 0, 0, 0 },
+ { VCPublicKeyProp, 0, 0, 0 },
+ { VCQPProp, VCQuotedPrintableProp, 0, 0 },
+ { VCQuickTimeProp, 0, 0, 0 },
+ { VCQuotedPrintableProp, 0, 0, 0 },
+ { VCRDateProp, 0, 0, 0 },
+ { VCRegionProp, 0, 0, 0 },
+ { VCRelatedToProp, 0, 0, 0 },
+ { VCRepeatCountProp, 0, 0, 0 },
+ { VCResourcesProp, 0, 0, 0 },
+ { VCRNumProp, 0, 0, 0 },
+ { VCRoleProp, 0, 0, 0 },
+ { VCRRuleProp, 0, 0, 0 },
+ { VCRSVPProp, 0, 0, 0 },
+ { VCRunTimeProp, 0, 0, 0 },
+ { VCSequenceProp, 0, 0, 0 },
+ { VCSnoozeTimeProp, 0, 0, 0 },
+ { VCStartProp, 0, 0, 0 },
+ { VCStatusProp, 0, 0, 0 },
+ { VCStreetAddressProp, 0, 0, 0 },
+ { VCSubTypeProp, 0, 0, 0 },
+ { VCSummaryProp, 0, 0, 0 },
+ { VCTelephoneProp, 0, 0, 0 },
+ { VCTIFFProp, 0, 0, 0 },
+ { VCTimeZoneProp, 0, 0, 0 },
+ { VCTitleProp, 0, 0, 0 },
+ { VCTLXProp, 0, 0, 0 },
+ { VCTodoProp, 0, 0, PD_BEGIN },
+ { VCTranspProp, 0, 0, 0 },
+ { VCUniqueStringProp, 0, 0, 0 },
+ { VCURLProp, 0, 0, 0 },
+ { VCURLValueProp, 0, 0, 0 },
+ { VCValueProp, 0, 0, 0 },
+ { VCVersionProp, 0, 0, 0 },
+ { VCVideoProp, 0, 0, 0 },
+ { VCVoiceProp, 0, 0, 0 },
+ { VCWAVEProp, 0, 0, 0 },
+ { VCWMFProp, 0, 0, 0 },
+ { VCWorkProp, 0, 0, 0 },
+ { VCX400Prop, 0, 0, 0 },
+ { VCX509Prop, 0, 0, 0 },
+ { VCXRuleProp, 0, 0, 0 },
+ { 0,0,0,0 }
+ };
+
+
+static struct PreDefProp* lookupPropInfo(const char* str)
+{
+ /* brute force for now, could use a hash table here. */
+ int i;
+
+ for (i = 0; propNames[i].name; i++)
+ if (strcasecmp(str, propNames[i].name) == 0) {
+ return &propNames[i];
+ }
+
+ return 0;
+}
+
+
+const char* lookupProp_(const char* str)
+{
+ int i;
+
+ for (i = 0; propNames[i].name; i++)
+ if (strcasecmp(str, propNames[i].name) == 0) {
+ const char* s;
+ s = propNames[i].alias?propNames[i].alias:propNames[i].name;
+ return lookupStr(s);
+ }
+ return lookupStr(str);
+}
+
+
+const char* lookupProp(const char* str)
+{
+ int i;
+
+ for (i = 0; propNames[i].name; i++)
+ if (strcasecmp(str, propNames[i].name) == 0) {
+ const char *s;
+ fieldedProp = propNames[i].fields;
+ s = propNames[i].alias?propNames[i].alias:propNames[i].name;
+ return lookupStr(s);
+ }
+ fieldedProp = 0;
+ return lookupStr(str);
+}
+
+
+/*----------------------------------------------------------------------
+ APIs to Output text form.
+ ----------------------------------------------------------------------*/
+#define OFILE_REALLOC_SIZE 256
+typedef struct OFile {
+ FILE *fp;
+ char *s;
+ int len;
+ int limit;
+ int alloc:1;
+ int fail:1;
+ } OFile;
+
+
+/* vCalendar files need crlf linebreaks. The disabled functions didn't provide
+ that. */
+#if 0
+
+static void appendsOFile(OFile *fp, const char *s)
+{
+ int slen;
+ if (fp->fail) return;
+ slen = strlen(s);
+ if (fp->fp) {
+ fwrite(s,1,slen,fp->fp);
+ }
+ else {
+stuff:
+ if (fp->len + slen < fp->limit) {
+ memcpy(fp->s+fp->len,s,slen);
+ fp->len += slen;
+ return;
+ }
+ else if (fp->alloc) {
+ fp->limit = fp->limit + OFILE_REALLOC_SIZE;
+ if (OFILE_REALLOC_SIZE <= slen) fp->limit += slen;
+ if (fp->s)
+ fp->s = realloc(fp->s,fp->limit);
+ else
+ fp->s = malloc(fp->limit);
+ if (fp->s) goto stuff;
+ }
+ if (fp->alloc)
+ free(fp->s);
+ fp->s = 0;
+ fp->fail = 1;
+ }
+}
+
+static void appendcOFile(OFile *fp, char c)
+{
+ if (fp->fail) return;
+ if (fp->fp) {
+ fputc(c,fp->fp);
+ }
+ else {
+stuff:
+ if (fp->len+1 < fp->limit) {
+ fp->s[fp->len] = c;
+ fp->len++;
+ return;
+ }
+ else if (fp->alloc) {
+ fp->limit = fp->limit + OFILE_REALLOC_SIZE;
+ fp->s = realloc(fp->s,fp->limit);
+ if (fp->s) goto stuff;
+ }
+ if (fp->alloc)
+ free(fp->s);
+ fp->s = 0;
+ fp->fail = 1;
+ }
+}
+
+#else
+
+static void appendcOFile_(OFile *fp, char c)
+{
+ if (fp->fail) return;
+ if (fp->fp) {
+ fputc(c,fp->fp);
+ }
+ else {
+stuff:
+ if (fp->len+1 < fp->limit) {
+ fp->s[fp->len] = c;
+ fp->len++;
+ return;
+ }
+ else if (fp->alloc) {
+ fp->limit = fp->limit + OFILE_REALLOC_SIZE;
+ fp->s = realloc(fp->s,fp->limit);
+ if (fp->s) goto stuff;
+ }
+ if (fp->alloc)
+ free(fp->s);
+ fp->s = 0;
+ fp->fail = 1;
+ }
+}
+
+static void appendcOFile(OFile *fp, char c)
+{
+ if (c == '\n') {
+ /* write out as <CR><LF> */
+ appendcOFile_(fp,0xd);
+ appendcOFile_(fp,0xa);
+ }
+ else
+ appendcOFile_(fp,c);
+}
+
+static void appendsOFile(OFile *fp, const char *s)
+{
+ int i, slen;
+ slen = strlen(s);
+ for (i=0; i<slen; i++) {
+ appendcOFile(fp,s[i]);
+ }
+}
+
+#endif
+
+static void initOFile(OFile *fp, FILE *ofp)
+{
+ fp->fp = ofp;
+ fp->s = 0;
+ fp->len = 0;
+ fp->limit = 0;
+ fp->alloc = 0;
+ fp->fail = 0;
+}
+
+static void initMemOFile(OFile *fp, char *s, int len)
+{
+ fp->fp = 0;
+ fp->s = s;
+ fp->len = 0;
+ fp->limit = s?len:0;
+ fp->alloc = s?0:1;
+ fp->fail = 0;
+}
+
+
+static int writeBase64(OFile *fp, unsigned char *s, long len)
+{
+ long cur = 0;
+ int i, numQuads = 0;
+ unsigned long trip;
+ unsigned char b;
+ char quad[5];
+#define MAXQUADS 16
+
+ quad[4] = 0;
+
+ while (cur < len) {
+ /* collect the triplet of bytes into 'trip' */
+ trip = 0;
+ for (i = 0; i < 3; i++) {
+ b = (cur < len) ? *(s + cur) : 0;
+ cur++;
+ trip = trip << 8 | b;
+ }
+ /* fill in 'quad' with the appropriate four characters */
+ for (i = 3; i >= 0; i--) {
+ b = (unsigned char)(trip & 0x3F);
+ trip = trip >> 6;
+ if ((3 - i) < (cur - len))
+ quad[i] = '='; /* pad char */
+ else if (b < 26) quad[i] = (char)b + 'A';
+ else if (b < 52) quad[i] = (char)(b - 26) + 'a';
+ else if (b < 62) quad[i] = (char)(b - 52) + '0';
+ else if (b == 62) quad[i] = '+';
+ else quad[i] = '/';
+ }
+ /* now output 'quad' with appropriate whitespace and line ending */
+ appendsOFile(fp, (numQuads == 0 ? " " : ""));
+ appendsOFile(fp, quad);
+ appendsOFile(fp, ((cur >= len)?"\n" :(numQuads==MAXQUADS-1?"\n" : "")));
+ numQuads = (numQuads + 1) % MAXQUADS;
+ }
+ appendcOFile(fp,'\n');
+
+ return 1;
+}
+
+/* this function really sucks. Too basic. */
+static void writeQPString(OFile *fp, const char *s, int qp)
+{
+ const char *p = s;
+ while (*p) {
+ if (*p == '\n') {
+ if (p[1]) appendsOFile(fp,"=0A=");
+ }
+ if (*p == '=' && qp)
+ appendsOFile(fp,"=3D");
+ else
+ appendcOFile(fp,*p);
+ p++;
+ }
+}
+
+static void writeVObject_(OFile *fp, VObject *o);
+
+static void writeValue(OFile *fp, VObject *o, unsigned long size)
+{
+ if (o == 0) return;
+ switch (VALUE_TYPE(o)) {
+ case VCVT_USTRINGZ: {
+ char *s = fakeCString(USTRINGZ_VALUE_OF(o));
+ if (isAPropertyOf(o, VCQuotedPrintableProp))
+ writeQPString(fp, s, 1);
+ else
+ writeQPString(fp, s, 0);
+ deleteStr(s);
+ break;
+ }
+ case VCVT_STRINGZ: {
+ if (isAPropertyOf(o, VCQuotedPrintableProp))
+ writeQPString(fp, STRINGZ_VALUE_OF(o), 1);
+ else
+ writeQPString(fp, STRINGZ_VALUE_OF(o), 0);
+ break;
+ }
+ case VCVT_UINT: {
+ char buf[16];
+ snprintf(buf,sizeof(buf),"%u", INTEGER_VALUE_OF(o));
+ appendsOFile(fp,buf);
+ break;
+ }
+ case VCVT_ULONG: {
+ char buf[16];
+ snprintf(buf,sizeof(buf),"%lu", LONG_VALUE_OF(o));
+ appendsOFile(fp,buf);
+ break;
+ }
+ case VCVT_RAW: {
+ appendcOFile(fp,'\n');
+ writeBase64(fp,(unsigned char*)(ANY_VALUE_OF(o)),size);
+ break;
+ }
+ case VCVT_VOBJECT:
+ appendcOFile(fp,'\n');
+ writeVObject_(fp,VOBJECT_VALUE_OF(o));
+ break;
+ }
+}
+
+static void writeAttrValue(OFile *fp, VObject *o)
+{
+ if (NAME_OF(o)) {
+ struct PreDefProp *pi;
+ pi = lookupPropInfo(NAME_OF(o));
+ if (pi && ((pi->flags & PD_INTERNAL) != 0)) return;
+ appendcOFile(fp,';');
+ appendsOFile(fp,NAME_OF(o));
+ }
+ else
+ appendcOFile(fp,';');
+ if (VALUE_TYPE(o)) {
+ appendcOFile(fp,'=');
+ writeValue(fp,o,0);
+ }
+}
+
+static void writeGroup(OFile *fp, VObject *o)
+{
+ char buf1[256];
+ char buf2[256];
+ strcpy(buf1,NAME_OF(o));
+ while ((o=isAPropertyOf(o,VCGroupingProp)) != 0) {
+ strncpy(buf2,STRINGZ_VALUE_OF(o),sizeof(buf2));
+ buf2[sizeof(buf2)-1] = '\0';
+ strncat(buf2,".",sizeof(buf2)-strlen(buf2)-1);
+ strncat(buf2,buf1,sizeof(buf2)-strlen(buf2)-1);
+ strcpy(buf1,buf2);
+ }
+ appendsOFile(fp,buf1);
+}
+
+static int inList(const char **list, const char *s)
+{
+ if (list == 0) return 0;
+ while (*list) {
+ if (strcasecmp(*list,s) == 0) return 1;
+ list++;
+ }
+ return 0;
+}
+
+static void writeProp(OFile *fp, VObject *o)
+{
+ if (NAME_OF(o)) {
+ struct PreDefProp *pi;
+ VObjectIterator t;
+ const char **fields_ = 0;
+ pi = lookupPropInfo(NAME_OF(o));
+ if (pi && ((pi->flags & PD_BEGIN) != 0)) {
+ writeVObject_(fp,o);
+ return;
+ }
+ if (isAPropertyOf(o,VCGroupingProp))
+ writeGroup(fp,o);
+ else
+ appendsOFile(fp,NAME_OF(o));
+ if (pi) fields_ = pi->fields;
+ initPropIterator(&t,o);
+ while (moreIteration(&t)) {
+ const char *s;
+ VObject *eachProp = nextVObject(&t);
+ s = NAME_OF(eachProp);
+ if (strcasecmp(VCGroupingProp,s) && !inList(fields_,s))
+ writeAttrValue(fp,eachProp);
+ }
+ if (fields_) {
+ int i = 0, n = 0;
+ const char** fields = fields_;
+ /* output prop as fields */
+ appendcOFile(fp,':');
+ while (*fields) {
+ VObject *tl = isAPropertyOf(o,*fields);
+ i++;
+ if (tl) n = i;
+ fields++;
+ }
+ fields = fields_;
+ for (i=0;i<n;i++) {
+ writeValue(fp,isAPropertyOf(o,*fields),0);
+ fields++;
+ if (i<(n-1)) appendcOFile(fp,';');
+ }
+ }
+ }
+
+ if (VALUE_TYPE(o)) {
+ unsigned long size = 0;
+ VObject *p = isAPropertyOf(o,VCDataSizeProp);
+ if (p) size = LONG_VALUE_OF(p);
+ appendcOFile(fp,':');
+ writeValue(fp,o,size);
+ }
+
+ appendcOFile(fp,'\n');
+}
+
+static void writeVObject_(OFile *fp, VObject *o)
+{
+ if (NAME_OF(o)) {
+ struct PreDefProp *pi;
+ pi = lookupPropInfo(NAME_OF(o));
+
+ if (pi && ((pi->flags & PD_BEGIN) != 0)) {
+ VObjectIterator t;
+ const char *begin = NAME_OF(o);
+ appendsOFile(fp,"BEGIN:");
+ appendsOFile(fp,begin);
+ appendcOFile(fp,'\n');
+ initPropIterator(&t,o);
+ while (moreIteration(&t)) {
+ VObject *eachProp = nextVObject(&t);
+ writeProp(fp, eachProp);
+ }
+ appendsOFile(fp,"END:");
+ appendsOFile(fp,begin);
+ appendsOFile(fp,"\n\n");
+ }
+ }
+}
+
+void writeVObject(FILE *fp, VObject *o)
+{
+ OFile ofp;
+ initOFile(&ofp,fp);
+ writeVObject_(&ofp,o);
+}
+
+void writeVObjectToFile(char *fname, VObject *o)
+{
+ FILE *fp = fopen(fname,"w");
+ if (fp) {
+ writeVObject(fp,o);
+ fclose(fp);
+ }
+}
+
+void writeVObjectsToFile(char *fname, VObject *list)
+{
+ FILE *fp = fopen(fname,"w");
+ if (fp) {
+ while (list) {
+ writeVObject(fp,list);
+ list = nextVObjectInList(list);
+ }
+ fclose(fp);
+ }
+}
+
+char* writeMemVObject(char *s, int *len, VObject *o)
+{
+ OFile ofp;
+ initMemOFile(&ofp,s,len?*len:0);
+ writeVObject_(&ofp,o);
+ if (len) *len = ofp.len;
+ appendcOFile(&ofp,0);
+ return ofp.s;
+}
+
+char* writeMemVObjects(char *s, int *len, VObject *list)
+{
+ OFile ofp;
+ initMemOFile(&ofp,s,len?*len:0);
+ while (list) {
+ writeVObject_(&ofp,list);
+ list = nextVObjectInList(list);
+ }
+ if (len) *len = ofp.len;
+ appendcOFile(&ofp,0);
+ return ofp.s;
+}
+
+/*----------------------------------------------------------------------
+ APIs to do fake Unicode stuff.
+ ----------------------------------------------------------------------*/
+wchar_t* fakeUnicode(const char *ps, int *bytes)
+{
+ wchar_t *r, *pw;
+ int len = strlen(ps)+1;
+
+ pw = r = (wchar_t*)malloc(sizeof(wchar_t)*len);
+ if (bytes)
+ *bytes = len * sizeof(wchar_t);
+
+ while (*ps) {
+ if (*ps == '\n')
+ *pw = (wchar_t)0x2028;
+ else if (*ps == '\r')
+ *pw = (wchar_t)0x2029;
+ else
+ *pw = (wchar_t)(unsigned char)*ps;
+ ps++; pw++;
+ }
+ *pw = (wchar_t)0;
+
+ return r;
+}
+
+int uStrLen(const wchar_t *u)
+{
+ int i = 0;
+ while (*u != (wchar_t)0) { u++; i++; }
+ return i;
+}
+
+char* fakeCString(const wchar_t *u)
+{
+ char *s, *t;
+ int len = uStrLen(u) + 1;
+ t = s = (char*)malloc(len+1);
+ while (*u) {
+ if (*u == (wchar_t)0x2028)
+ *t = '\n';
+ else if (*u == (wchar_t)0x2029)
+ *t = '\r';
+ else
+ *t = (char)*u;
+ u++; t++;
+ }
+ *t = 0;
+ return s;
+}
+
+/* end of source file vobject.c */
diff --git a/libkcal/versit/vobject.h b/libkcal/versit/vobject.h
new file mode 100644
index 00000000..0ec8b317
--- /dev/null
+++ b/libkcal/versit/vobject.h
@@ -0,0 +1,384 @@
+/***************************************************************************
+(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International
+Business Machines Corporation and Siemens Rolm Communications Inc.
+
+For purposes of this license notice, the term Licensors shall mean,
+collectively, Apple Computer, Inc., AT&T Corp., International
+Business Machines Corporation and Siemens Rolm Communications Inc.
+The term Licensor shall mean any of the Licensors.
+
+Subject to acceptance of the following conditions, permission is hereby
+granted by Licensors without the need for written agreement and without
+license or royalty fees, to use, copy, modify and distribute this
+software for any purpose.
+
+The above copyright notice and the following four paragraphs must be
+reproduced in all copies of this software and any software including
+this software.
+
+THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE
+ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR
+MODIFICATIONS.
+
+IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT,
+INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
+OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
+
+EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.
+
+The software is provided with RESTRICTED RIGHTS. Use, duplication, or
+disclosure by the government are subject to restrictions set forth in
+DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
+
+***************************************************************************/
+
+/*
+
+The vCard/vCalendar C interface is implemented in the set
+of files as follows:
+
+vcc.y, yacc source, and vcc.c, the yacc output you will use
+implements the core parser
+
+vobject.c implements an API that insulates the caller from
+the parser and changes in the vCard/vCalendar BNF
+
+port.h defines compilation environment dependent stuff
+
+vcc.h and vobject.h are header files for their .c counterparts
+
+vcaltmp.h and vcaltmp.c implement vCalendar "macro" functions
+which you may find useful.
+
+test.c is a standalone test driver that exercises some of
+the features of the APIs provided. Invoke test.exe on a
+VCARD/VCALENDAR input text file and you will see the pretty
+print output of the internal representation (this pretty print
+output should give you a good idea of how the internal
+representation looks like -- there is one such output in the
+following too). Also, a file with the .out suffix is generated
+to show that the internal representation can be written back
+in the original text format.
+
+For more information on this API see the readme.txt file
+which accompanied this distribution.
+
+ Also visit:
+
+ http://www.versit.com
+ http://www.ralden.com
+
+*/
+
+
+#ifndef __VOBJECT_H__
+#define __VOBJECT_H__ 1
+
+
+#include "port.h"
+#include <stdlib.h>
+#include <stdio.h>
+
+#if defined(__CPLUSPLUS__) || defined(__cplusplus)
+extern "C" {
+#endif
+
+
+#define VC7bitProp "7BIT"
+#define VC8bitProp "8BIT"
+#define VCAAlarmProp "AALARM"
+#define VCAdditionalNamesProp "ADDN"
+#define VCAdrProp "ADR"
+#define VCAgentProp "AGENT"
+#define VCAIFFProp "AIFF"
+#define VCAOLProp "AOL"
+#define VCAppleLinkProp "APPLELINK"
+#define VCAttachProp "ATTACH"
+#define VCAttendeeProp "ATTENDEE"
+#define VCATTMailProp "ATTMAIL"
+#define VCAudioContentProp "AUDIOCONTENT"
+#define VCAVIProp "AVI"
+#define VCBase64Prop "BASE64"
+#define VCBBSProp "BBS"
+#define VCBirthDateProp "BDAY"
+#define VCBMPProp "BMP"
+#define VCBodyProp "BODY"
+#define VCBusinessRoleProp "ROLE"
+#define VCCalProp "VCALENDAR"
+#define VCCaptionProp "CAP"
+#define VCCardProp "VCARD"
+#define VCCarProp "CAR"
+#define VCCategoriesProp "CATEGORIES"
+#define VCCellularProp "CELL"
+#define VCCGMProp "CGM"
+#define VCCharSetProp "CS"
+#define VCCIDProp "CID"
+#define VCCISProp "CIS"
+#define VCCityProp "L"
+#define VCClassProp "CLASS"
+#define VCCommentProp "NOTE"
+#define VCCompletedProp "COMPLETED"
+#define VCContentIDProp "CONTENT-ID"
+#define VCCountryNameProp "C"
+#define VCDAlarmProp "DALARM"
+#define VCDataSizeProp "DATASIZE"
+#define VCDayLightProp "DAYLIGHT"
+#define VCDCreatedProp "DCREATED"
+#define VCDeliveryLabelProp "LABEL"
+#define VCDescriptionProp "DESCRIPTION"
+#define VCDIBProp "DIB"
+#define VCDisplayStringProp "DISPLAYSTRING"
+#define VCDomesticProp "DOM"
+#define VCDTendProp "DTEND"
+#define VCDTstartProp "DTSTART"
+#define VCDueProp "DUE"
+#define VCEmailAddressProp "EMAIL"
+#define VCEncodingProp "ENCODING"
+#define VCEndProp "END"
+#define VCEventProp "VEVENT"
+#define VCEWorldProp "EWORLD"
+#define VCExNumProp "EXNUM"
+#define VCExDateProp "EXDATE"
+#define VCExpectProp "EXPECT"
+#define VCExtAddressProp "EXT ADD"
+#define VCFamilyNameProp "F"
+#define VCFaxProp "FAX"
+#define VCFullNameProp "FN"
+#define VCGeoProp "GEO"
+#define VCGeoLocationProp "GEO"
+#define VCGIFProp "GIF"
+#define VCGivenNameProp "G"
+#define VCGroupingProp "Grouping"
+#define VCHomeProp "HOME"
+#define VCIBMMailProp "IBMMail"
+#define VCInlineProp "INLINE"
+#define VCInternationalProp "INTL"
+#define VCInternetProp "INTERNET"
+#define VCISDNProp "ISDN"
+#define VCJPEGProp "JPEG"
+#define VCLanguageProp "LANG"
+#define VCLastModifiedProp "LAST-MODIFIED"
+#define VCLastRevisedProp "REV"
+#define VCLocationProp "LOCATION"
+#define VCLogoProp "LOGO"
+#define VCMailerProp "MAILER"
+#define VCMAlarmProp "MALARM"
+#define VCMCIMailProp "MCIMAIL"
+#define VCMessageProp "MSG"
+#define VCMETProp "MET"
+#define VCModemProp "MODEM"
+#define VCMPEG2Prop "MPEG2"
+#define VCMPEGProp "MPEG"
+#define VCMSNProp "MSN"
+#define VCNamePrefixesProp "NPRE"
+#define VCNameProp "N"
+#define VCNameSuffixesProp "NSUF"
+#define VCNoteProp "NOTE"
+#define VCOrgNameProp "ORGNAME"
+#define VCOrgProp "ORG"
+#define VCOrgUnit2Prop "OUN2"
+#define VCOrgUnit3Prop "OUN3"
+#define VCOrgUnit4Prop "OUN4"
+#define VCOrgUnitProp "OUN"
+#define VCPagerProp "PAGER"
+#define VCPAlarmProp "PALARM"
+#define VCParcelProp "PARCEL"
+#define VCPartProp "PART"
+#define VCPCMProp "PCM"
+#define VCPDFProp "PDF"
+#define VCPGPProp "PGP"
+#define VCPhotoProp "PHOTO"
+#define VCPICTProp "PICT"
+#define VCPMBProp "PMB"
+#define VCPostalBoxProp "BOX"
+#define VCPostalCodeProp "PC"
+#define VCPostalProp "POSTAL"
+#define VCPowerShareProp "POWERSHARE"
+#define VCPreferredProp "PREF"
+#define VCPriorityProp "PRIORITY"
+#define VCProcedureNameProp "PROCEDURENAME"
+#define VCProdIdProp "PRODID"
+#define VCProdigyProp "PRODIGY"
+#define VCPronunciationProp "SOUND"
+#define VCPSProp "PS"
+#define VCPublicKeyProp "KEY"
+#define VCQPProp "QP"
+#define VCQuickTimeProp "QTIME"
+#define VCQuotedPrintableProp "QUOTED-PRINTABLE"
+#define VCRDateProp "RDATE"
+#define VCRegionProp "R"
+#define VCRelatedToProp "RELATED-TO"
+#define VCRepeatCountProp "REPEATCOUNT"
+#define VCResourcesProp "RESOURCES"
+#define VCRNumProp "RNUM"
+#define VCRoleProp "ROLE"
+#define VCRRuleProp "RRULE"
+#define VCRSVPProp "RSVP"
+#define VCRunTimeProp "RUNTIME"
+#define VCSequenceProp "SEQUENCE"
+#define VCSnoozeTimeProp "SNOOZETIME"
+#define VCStartProp "START"
+#define VCStatusProp "STATUS"
+#define VCStreetAddressProp "STREET"
+#define VCSubTypeProp "SUBTYPE"
+#define VCSummaryProp "SUMMARY"
+#define VCTelephoneProp "TEL"
+#define VCTIFFProp "TIFF"
+#define VCTimeZoneProp "TZ"
+#define VCTitleProp "TITLE"
+#define VCTLXProp "TLX"
+#define VCTodoProp "VTODO"
+#define VCTranspProp "TRANSP"
+#define VCUniqueStringProp "UID"
+#define VCURLProp "URL"
+#define VCURLValueProp "URLVAL"
+#define VCValueProp "VALUE"
+#define VCVersionProp "VERSION"
+#define VCVideoProp "VIDEO"
+#define VCVoiceProp "VOICE"
+#define VCWAVEProp "WAVE"
+#define VCWMFProp "WMF"
+#define VCWorkProp "WORK"
+#define VCX400Prop "X400"
+#define VCX509Prop "X509"
+#define VCXRuleProp "XRULE"
+
+/* extensions for KOrganizer / KPilot */
+#define KPilotIdProp "X-PILOTID"
+#define KPilotStatusProp "X-PILOTSTAT"
+
+/* extensions for iMIP / iTIP */
+#define ICOrganizerProp "X-ORGANIZER"
+#define ICMethodProp "X-METHOD"
+#define ICRequestStatusProp "X-REQUEST-STATUS"
+
+typedef struct VObject VObject;
+
+typedef union ValueItem {
+ const char *strs;
+ const wchar_t *ustrs;
+ unsigned int i;
+ unsigned long l;
+ void *any;
+ VObject *vobj;
+ } ValueItem;
+
+struct VObject {
+ VObject *next;
+ const char *id;
+ VObject *prop;
+ unsigned short valType;
+ ValueItem val;
+ };
+
+typedef struct StrItem StrItem;
+
+struct StrItem {
+ StrItem *next;
+ const char *s;
+ unsigned int refCnt;
+ };
+
+typedef struct VObjectIterator {
+ VObject* start;
+ VObject* next;
+ } VObjectIterator;
+
+extern VObject* newVObject(const char *id);
+extern void deleteVObject(VObject *p);
+extern char* dupStr(const char *s, unsigned int size);
+extern void deleteStr(const char *p);
+extern void unUseStr(const char *s);
+
+extern void setVObjectName(VObject *o, const char* id);
+extern void setVObjectStringZValue(VObject *o, const char *s);
+extern void setVObjectStringZValue_(VObject *o, const char *s);
+extern void setVObjectUStringZValue(VObject *o, const wchar_t *s);
+extern void setVObjectUStringZValue_(VObject *o, const wchar_t *s);
+extern void setVObjectIntegerValue(VObject *o, unsigned int i);
+extern void setVObjectLongValue(VObject *o, unsigned long l);
+extern void setVObjectAnyValue(VObject *o, void *t);
+extern VObject* setValueWithSize(VObject *prop, void *val, unsigned int size);
+extern VObject* setValueWithSize_(VObject *prop, void *val, unsigned int size);
+
+extern const char* vObjectName(VObject *o);
+extern const char* vObjectStringZValue(VObject *o);
+extern const wchar_t* vObjectUStringZValue(VObject *o);
+extern unsigned int vObjectIntegerValue(VObject *o);
+extern unsigned long vObjectLongValue(VObject *o);
+extern void* vObjectAnyValue(VObject *o);
+extern VObject* vObjectVObjectValue(VObject *o);
+extern void setVObjectVObjectValue(VObject *o, VObject *p);
+
+extern VObject* addVObjectProp(VObject *o, VObject *p);
+extern VObject* addProp(VObject *o, const char *id);
+extern VObject* addProp_(VObject *o, const char *id);
+extern VObject* addPropValue(VObject *o, const char *p, const char *v);
+extern VObject* addPropSizedValue_(VObject *o, const char *p, const char *v, unsigned int size);
+extern VObject* addPropSizedValue(VObject *o, const char *p, const char *v, unsigned int size);
+extern VObject* addGroup(VObject *o, const char *g);
+extern void addList(VObject **o, VObject *p);
+
+extern VObject* isAPropertyOf(VObject *o, const char *id);
+
+extern VObject* nextVObjectInList(VObject *o);
+extern void initPropIterator(VObjectIterator *i, VObject *o);
+extern int moreIteration(VObjectIterator *i);
+extern VObject* nextVObject(VObjectIterator *i);
+
+extern char* writeMemVObject(char *s, int *len, VObject *o);
+extern char* writeMemVObjects(char *s, int *len, VObject *list);
+
+extern const char* lookupStr(const char *s);
+extern void cleanStrTbl();
+
+extern void cleanVObject(VObject *o);
+extern void cleanVObjects(VObject *list);
+
+extern const char* lookupProp(const char* str);
+extern const char* lookupProp_(const char* str);
+
+extern wchar_t* fakeUnicode(const char *ps, int *bytes);
+extern int uStrLen(const wchar_t *u);
+extern char* fakeCString(const wchar_t *u);
+
+extern void printVObjectToFile(char *fname,VObject *o);
+extern void printVObjectsToFile(char *fname,VObject *list);
+extern void writeVObjectToFile(char *fname, VObject *o);
+extern void writeVObjectsToFile(char *fname, VObject *list);
+
+extern int vObjectValueType(VObject *o);
+
+/* return type of vObjectValueType: */
+#define VCVT_NOVALUE 0
+ /* if the VObject has no value associated with it. */
+#define VCVT_STRINGZ 1
+ /* if the VObject has value set by setVObjectStringZValue. */
+#define VCVT_USTRINGZ 2
+ /* if the VObject has value set by setVObjectUStringZValue. */
+#define VCVT_UINT 3
+ /* if the VObject has value set by setVObjectIntegerValue. */
+#define VCVT_ULONG 4
+ /* if the VObject has value set by setVObjectLongValue. */
+#define VCVT_RAW 5
+ /* if the VObject has value set by setVObjectAnyValue. */
+#define VCVT_VOBJECT 6
+ /* if the VObject has value set by setVObjectVObjectValue. */
+
+extern const char** fieldedProp;
+
+extern void printVObject(FILE *fp,VObject *o);
+extern void writeVObject(FILE *fp, VObject *o);
+
+
+#if defined(__CPLUSPLUS__) || defined(__cplusplus)
+}
+#endif
+
+#endif /* __VOBJECT_H__ */
+
+