diff --git a/app-pda/libopensync-plugin-google-calendar/files/recurrent_events.patch b/app-pda/libopensync-plugin-google-calendar/files/recurrent_events.patch new file mode 100644 --- /dev/null +++ b/app-pda/libopensync-plugin-google-calendar/files/recurrent_events.patch @@ -0,0 +1,80 @@ +--- libopensync-plugin-google-calendar-0.22/src/google-cal-helper.py 2007-03-27 12:18:21.000000000 -0400 ++++ libopensync-plugin-google-calendar-0.22-r1/src/google-cal-helper.py 2007-11-30 20:14:20.000000000 -0500 +@@ -138,6 +138,41 @@ + sys.stderr.write("xs to osync: %s => %s\n" % (s, r)) + return r + ++GDEND_RE = re.compile("DTEND;[^:]*:(\S+)") ++def gdRecurToEnd(recur): ++ m = GDEND_RE.search(recur) ++ if m is None: ++ raise DateConversionError("failed to find end in \"%s\"" % recur) ++ start = m.group(1) ++ year = start[0:4] ++ month = start[4:6] ++ day = start[6:8] ++ hour = start[9:11] ++ min = start[11:13] ++ sec = start[13:15] ++ return "%s-%2s-%2sT%2s:%2s:%2s" % (year, month, day, hour, min, sec) ++ ++GDSTART_RE = re.compile("DTSTART;[^:]*:(\S+)") ++def gdRecurToStart(recur): ++ m = GDSTART_RE.search(recur) ++ if m is None: ++ raise DateConversionError("failed to find start in \"%s\"" % recur) ++ start = m.group(1) ++ year = start[0:4] ++ month = start[4:6] ++ day = start[6:8] ++ hour = start[9:11] ++ min = start[11:13] ++ sec = start[13:15] ++ return "%s-%2s-%2sT%2s:%2s:%2s" % (year, month, day, hour, min, sec) ++ ++GDRECUR_RE = re.compile("RRULE:(\S+)") ++def gdRecurToORecur(recur): ++ m = GDRECUR_RE.search(recur) ++ if m is None: ++ raise DateConversionError("failed to find rule in \"%s\"" % recur) ++ return m.group(1) ++ + class GCalRequestError(Exception): + def __init__(self, response): + self.response = response +@@ -159,13 +194,19 @@ + self.id = self.elementValue('atom:id/text()') + self.editUri = self.elementValue('atom:link[@rel="edit"]/@href') + self.content = self.elementValue('atom:content[@type="text"]/text()') ++ self.dtrecur = self.elementValue('gd:recurrence/text()') ++ if self.dtrecur: ++ pass ++ self.dtstart = gdRecurToStart(self.dtrecur) ++ self.dtend = gdRecurToEnd(self.dtrecur) ++ self.dtrecur = gdRecurToORecur(self.dtrecur) ++ else: + self.dtstart = self.elementValue('gd:when/@startTime') + self.dtend = self.elementValue('gd:when/@endTime') + + self.eventStatus = self.elementValue('gd:eventStatus/@value') + self.whereString = self.elementValue('gd:where/@valueString') + +- #FIXME: Handle recurrency + #FIXME: Handle gd:eventStatus + + +@@ -199,9 +240,13 @@ + + self.addElementContent(doc, event, 'DateStarted', xsdateToOsync(self.dtstart)) + self.addElementContent(doc, event, 'DateEnd', xsdateToOsync(self.dtend)) ++ if self.dtrecur: ++ self.addElementContent(doc, event, 'RecurrenceRule', ++ self.dtrecur) ++ + self.addElementContent(doc, event, 'Location', self.whereString) + +- #TODO: UID, editUri, dtstart, dtend, recurrency, eventStatus ++ #TODO: UID, editUri, dtstart, dtend, eventStatus + return doc.toxml(encoding='utf-8') + + def dumpGdata(self):