Hello Patrick, Thanks for the analysis. I changed the rrule parsing routine to allow returning a adjusted DTSTART so the engine now correctly detects this iCalendar's timezone as GMT. I just pushed these changes into the luz branch on synthesis indefero.
Best Regards, Lukas On May 4, 2010, at 22:40 , Patrick Ohly wrote: > On Mon, 2010-04-26 at 13:40 +0100, Patrick Ohly wrote: >> On Wed, 2010-04-21 at 09:39 +0200, Patrick Ohly wrote: >>> I have a meeting in my Evolution calendar which I synchronize with >>> SyncEvolution. I noticed that the outgoing VEVENT has start and end >>> time >>> converted to UTC times which are one hour off. >>> >>> Here's the stripped down event: >>> >>> BEGIN:VCALENDAR >>> PRODID:-//Ximian//NONSGML Evolution Calendar//EN >>> VERSION:2.0 >>> METHOD:PUBLISH >>> BEGIN:VTIMEZONE >>> TZID:GMT Standard Time >>> BEGIN:STANDARD >>> DTSTART:16010101T020000 >>> TZOFFSETFROM:+0100 >>> TZOFFSETTO:+0000 >>> RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 >>> END:STANDARD >>> BEGIN:DAYLIGHT >>> DTSTART:16010101T010000 >>> TZOFFSETFROM:+0000 >>> TZOFFSETTO:+0100 >>> RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3 >>> END:DAYLIGHT >>> END:VTIMEZONE >>> BEGIN:VEVENT >>> SUMMARY:test event >>> DTSTART;TZID=GMT Standard Time:20100421T150000 >>> DTEND;TZID=GMT Standard Time:20100421T160000 >>> UID:040000008200E00074C5B7101A82E0080000000000B5A586D0A4CA01000000000000000010 >>> CLASS:PUBLIC >>> PRIORITY:5 >>> DTSTAMP:20100415T035521Z >>> TRANSP:OPAQUE >>> STATUS:CONFIRMED >>> SEQUENCE:4 >>> END:VEVENT >>> END:VCALENDAR >> >> This fails because RRULE2toInternal() in rrule.cpp fails to convert the >> RRULE properties into the internal format. It bombs out here: >> >> switch (freq) >> { >> ... >> case 'Y' : >> if (byday == "" || >> (byday.length() == 2 && byday[0] == >> RRULE_weekdays[startwday][0] && >> byday[1] == >> RRULE_weekdays[startwday][1])) >> { >> ... >> } >> else >> { >> goto incompat; >> } >> >> It reaches the "goto incompat" because byday == "-1SU". >> >> Recurrence rules with "last day in month ..." are common for VTIMEZONEs. >> Beat, is that really something that is not handled by the Synthesis code >> at the moment? What would be necessary to add support for it? > > I'm still wondering about this. > > In the meantime I looked into VTIMEZONEs which parse successfully. What > I found is that FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 (as in the example > above) is supported, by converting it to the equivalent > FREQ=MONTHLY;INTERVAL=12;BYDAY=-1SU. > > However, there is a sanity check that compares the start month: > if (DayMonthCombi( freq, byday,bymonth,startmonth )) { > freq = 'M'; // a different model will be chosen for this case, > interval= 12*interval; // which is in fact aequivalent > bymonth = ""; > } // if > > In the example above, DTSTART=16010101T020000 and thus startmonth != > bymonth. DayMonthCombi() then returns false. > > Does the month in DTSTART really matter in this case? I would expect > that the first recurrence will be in the month specified in BYMONTH > which is >= than the month in DTSTART, so one could apply the conversion > to FREQ=MONTHLY;INTERVAL=12;BYDAY=-1SU by setting the month in DTSTART > to the value from BYMONTH. > > Does that make sense? > > -- > Best Regards, Patrick Ohly > > The content of this message is my personal opinion only and although > I am an employee of Intel, the statements I make here in no way > represent Intel's position on the issue, nor am I authorized to speak > on behalf of Intel on this matter. > > > > _______________________________________________ > os-libsynthesis mailing list > os-libsynthesis@synthesis.ch > http://lists.synthesis.ch/mailman/listinfo/os-libsynthesis Lukas Zeller (l...@synthesis.ch) - Synthesis AG, SyncML Solutions & Sustainable Software Concepts i...@synthesis.ch, http://www.synthesis.ch _______________________________________________ os-libsynthesis mailing list os-libsynthesis@synthesis.ch http://lists.synthesis.ch/mailman/listinfo/os-libsynthesis