an iCal processing library

Committer:
WiredHome
Date:
Mon Feb 27 02:17:06 2017 +0000
Revision:
11:fe5586155a42
Parent:
10:deeaec151283
Some incomplete work on making it less memory intensive. Far from complete.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WiredHome 2:1f5dbc624b95 1 //
WiredHome 2:1f5dbc624b95 2 // TODO
WiredHome 2:1f5dbc624b95 3 // Repeat parsing is quite weak right now. It handles repeating days w/in a week
WiredHome 2:1f5dbc624b95 4 // (e.g. repeat weekly, on Mon, Tue, Thu)
WiredHome 2:1f5dbc624b95 5 //
WiredHome 4:a1c25d936346 6 //#include "stdafx.h"
WiredHome 4:a1c25d936346 7 //#pragma warning (disable: 4996)
WiredHome 0:49245357cd1b 8
WiredHome 0:49245357cd1b 9 #include "iCal.h"
WiredHome 0:49245357cd1b 10 #include <algorithm>
WiredHome 0:49245357cd1b 11
WiredHome 5:69577415c16e 12 //#ifdef _DEBUG
WiredHome 11:fe5586155a42 13 #define DEBUG "iCal"
WiredHome 5:69577415c16e 14 //#endif
WiredHome 4:a1c25d936346 15 #ifdef WIN32
WiredHome 4:a1c25d936346 16 #define LF "\n"
WiredHome 5:69577415c16e 17 #else // mbed
WiredHome 4:a1c25d936346 18 #define LF "\r\n"
WiredHome 5:69577415c16e 19 #endif // WIN32
WiredHome 0:49245357cd1b 20 #include <cstdio>
WiredHome 0:49245357cd1b 21 #if (defined(DEBUG) && !defined(TARGET_LPC11U24))
WiredHome 4:a1c25d936346 22 #define DBG(x, ...) std::printf("[DBG %s %3d] " x LF, DEBUG, __LINE__, ##__VA_ARGS__)
WiredHome 4:a1c25d936346 23 #define WARN(x, ...) std::printf("[WRN %s %3d] " x LF, DEBUG, __LINE__, ##__VA_ARGS__)
WiredHome 4:a1c25d936346 24 #define ERR(x, ...) std::printf("[ERR %s %3d] " x LF, DEBUG, __LINE__, ##__VA_ARGS__)
WiredHome 4:a1c25d936346 25 #define INFO(x, ...) std::printf("[INF %s %3d] " x LF, DEBUG, __LINE__, ##__VA_ARGS__)
WiredHome 0:49245357cd1b 26 #else
WiredHome 0:49245357cd1b 27 #define DBG(x, ...)
WiredHome 0:49245357cd1b 28 #define WARN(x, ...)
WiredHome 0:49245357cd1b 29 #define ERR(x, ...)
WiredHome 0:49245357cd1b 30 #define INFO(x, ...)
WiredHome 0:49245357cd1b 31 #endif
WiredHome 0:49245357cd1b 32
WiredHome 0:49245357cd1b 33 Event_T EventList[EVENT_COUNT];
WiredHome 0:49245357cd1b 34 int EventCount = 0;
WiredHome 4:a1c25d936346 35 int32_t tzoTZIDSec = 0;
WiredHome 0:49245357cd1b 36
WiredHome 11:fe5586155a42 37 bool tzAdjusted = false; // used during parsing of an iCal resource
WiredHome 11:fe5586155a42 38 typedef enum {
WiredHome 11:fe5586155a42 39 idle,
WiredHome 11:fe5586155a42 40 inTimeZone,
WiredHome 11:fe5586155a42 41 inEvent
WiredHome 11:fe5586155a42 42 } seekstate_t;
WiredHome 11:fe5586155a42 43 seekstate_t seeking = idle;
WiredHome 11:fe5586155a42 44 Event_T Event;
WiredHome 11:fe5586155a42 45
WiredHome 11:fe5586155a42 46
WiredHome 0:49245357cd1b 47 const char * RPT_DAYS[] = { "SU", "MO", "TU", "WE", "TH", "FR", "SA", "" };
WiredHome 0:49245357cd1b 48
WiredHome 0:49245357cd1b 49 int GetNumEvents(void)
WiredHome 0:49245357cd1b 50 {
WiredHome 0:49245357cd1b 51 return EventCount;
WiredHome 0:49245357cd1b 52 }
WiredHome 0:49245357cd1b 53
WiredHome 0:49245357cd1b 54 const char * RepeatDayAbbrev(int i)
WiredHome 0:49245357cd1b 55 {
WiredHome 0:49245357cd1b 56 if (i < 7)
WiredHome 0:49245357cd1b 57 return RPT_DAYS[i];
WiredHome 0:49245357cd1b 58 else
WiredHome 0:49245357cd1b 59 return RPT_DAYS[7];
WiredHome 0:49245357cd1b 60 }
WiredHome 0:49245357cd1b 61
WiredHome 0:49245357cd1b 62 void SortEvents()
WiredHome 0:49245357cd1b 63 {
WiredHome 0:49245357cd1b 64 bool swapped;
WiredHome 0:49245357cd1b 65 int e;
WiredHome 0:49245357cd1b 66 Event_T Event;
WiredHome 0:49245357cd1b 67
WiredHome 0:49245357cd1b 68 do {
WiredHome 0:49245357cd1b 69 swapped = false;
WiredHome 0:49245357cd1b 70 for (e=0; e<EventCount-1; e++) {
WiredHome 0:49245357cd1b 71 if (EventList[e].Start > EventList[e+1].Start) {
WiredHome 0:49245357cd1b 72 Event = EventList[e];
WiredHome 0:49245357cd1b 73 EventList[e] = EventList[e+1];
WiredHome 0:49245357cd1b 74 EventList[e+1] = Event;
WiredHome 0:49245357cd1b 75 swapped = true;
WiredHome 0:49245357cd1b 76 }
WiredHome 0:49245357cd1b 77 }
WiredHome 0:49245357cd1b 78 } while (swapped);
WiredHome 0:49245357cd1b 79 }
WiredHome 0:49245357cd1b 80
WiredHome 0:49245357cd1b 81 uint16_t AtoIxN(char * p, int n)
WiredHome 0:49245357cd1b 82 {
WiredHome 0:49245357cd1b 83 uint16_t res = 0;
WiredHome 0:49245357cd1b 84
WiredHome 0:49245357cd1b 85 while (n--) {
WiredHome 0:49245357cd1b 86 res = (res * 10) + (*p - '0');
WiredHome 0:49245357cd1b 87 p++;
WiredHome 0:49245357cd1b 88 }
WiredHome 0:49245357cd1b 89 return res;
WiredHome 0:49245357cd1b 90 }
WiredHome 0:49245357cd1b 91
WiredHome 4:a1c25d936346 92 // YYYYMMDD[THHMMSS[Z]]
WiredHome 5:69577415c16e 93 // VALUE=DATE:YYYYMMDD
WiredHome 5:69577415c16e 94 time_t ParseDateStamp(char * string, tz_sec_t tzoSec)
WiredHome 0:49245357cd1b 95 {
WiredHome 0:49245357cd1b 96 time_t tStamp;
WiredHome 0:49245357cd1b 97 struct tm t;
WiredHome 4:a1c25d936346 98 struct tm * tnow;
WiredHome 4:a1c25d936346 99
WiredHome 4:a1c25d936346 100 time(&tStamp);
WiredHome 4:a1c25d936346 101 tnow = localtime(&tStamp);
WiredHome 5:69577415c16e 102 if (strncmp(string, "VALUE=DATE:", 11) == 0) {
WiredHome 5:69577415c16e 103 string += 11;
WiredHome 5:69577415c16e 104 }
WiredHome 4:a1c25d936346 105 //INFO("ParseDateStamp(%s,%d)\n", string, tzoSec);
WiredHome 0:49245357cd1b 106 t.tm_year = AtoIxN(string, 4) - 1900;
WiredHome 0:49245357cd1b 107 t.tm_mon = AtoIxN(string+4, 2) - 1;
WiredHome 0:49245357cd1b 108 t.tm_mday = AtoIxN(string+6, 2);
WiredHome 4:a1c25d936346 109 if (strlen(string) > 8) {
WiredHome 4:a1c25d936346 110 t.tm_hour = AtoIxN(string+9, 2);
WiredHome 4:a1c25d936346 111 t.tm_min = AtoIxN(string+11, 2);
WiredHome 4:a1c25d936346 112 t.tm_sec = AtoIxN(string+13, 2);
WiredHome 4:a1c25d936346 113 t.tm_isdst = tnow->tm_isdst;
WiredHome 4:a1c25d936346 114 } else {
WiredHome 4:a1c25d936346 115 t.tm_hour = 0;
WiredHome 4:a1c25d936346 116 t.tm_min = 0;
WiredHome 4:a1c25d936346 117 t.tm_sec = 0;
WiredHome 4:a1c25d936346 118 t.tm_isdst = tnow->tm_isdst;
WiredHome 4:a1c25d936346 119 }
WiredHome 0:49245357cd1b 120 tStamp = mktime(&t);
WiredHome 2:1f5dbc624b95 121 if (string[strlen(string)-1] == 'Z') {
WiredHome 4:a1c25d936346 122 //INFO("Applying tzoSec %d", tzoSec);
WiredHome 4:a1c25d936346 123 tStamp = tStamp + tzoTZIDSec;
WiredHome 4:a1c25d936346 124 } else {
WiredHome 1:db274b9e40cc 125 tStamp = tStamp + tzoSec;
WiredHome 2:1f5dbc624b95 126 }
WiredHome 0:49245357cd1b 127 return tStamp;
WiredHome 0:49245357cd1b 128 }
WiredHome 0:49245357cd1b 129
WiredHome 0:49245357cd1b 130 char * FormatCTime(time_t t)
WiredHome 0:49245357cd1b 131 {
WiredHome 0:49245357cd1b 132 static char temp[4][80];
WiredHome 0:49245357cd1b 133 static int i = 0;
WiredHome 2:1f5dbc624b95 134
WiredHome 0:49245357cd1b 135 i &= 3;
WiredHome 0:49245357cd1b 136 strcpy(temp[i], ctime(&t));
WiredHome 0:49245357cd1b 137 temp[i][strlen(temp[i])-1] = '\0';
WiredHome 0:49245357cd1b 138 return temp[i++];
WiredHome 0:49245357cd1b 139 }
WiredHome 0:49245357cd1b 140
WiredHome 0:49245357cd1b 141
WiredHome 0:49245357cd1b 142 void ShowEventInfo(Event_T & Event)
WiredHome 0:49245357cd1b 143 {
WiredHome 4:a1c25d936346 144 char scratch[80];
WiredHome 2:1f5dbc624b95 145
WiredHome 4:a1c25d936346 146 printf("******* Summary: %s" LF, Event.Summary);
WiredHome 4:a1c25d936346 147 printf(" Location: %s" LF, Event.Location);
WiredHome 4:a1c25d936346 148 printf(" Category: %s" LF, Event.Category);
WiredHome 4:a1c25d936346 149 printf(" Priority: %d" LF, Event.Priority);
WiredHome 9:2c2c35511965 150 sprintf(scratch, "%lu ", Event.Start);
WiredHome 4:a1c25d936346 151 sprintf(scratch + strlen(scratch), "%s", (Event.Start == 0) ? "" : ctime(&Event.Start));
WiredHome 4:a1c25d936346 152 scratch[strlen(scratch)-1] = '\0';
WiredHome 4:a1c25d936346 153 printf(" Start: %s" LF, scratch);
WiredHome 9:2c2c35511965 154 sprintf(scratch, "%lu ", Event.End);
WiredHome 4:a1c25d936346 155 sprintf(scratch + strlen(scratch), "%s", (Event.End == 0) ? "" : ctime(&Event.End));
WiredHome 4:a1c25d936346 156 scratch[strlen(scratch)-1] = '\0';
WiredHome 4:a1c25d936346 157 printf(" End: %s" LF, scratch);
WiredHome 4:a1c25d936346 158 printf(" Count: %d" LF, Event.Count);
WiredHome 4:a1c25d936346 159 printf(" Interval: %d" LF, Event.Interval);
WiredHome 4:a1c25d936346 160 printf(" RepeatFrq: %d" LF, Event.RepeatFreq);
WiredHome 4:a1c25d936346 161 printf(" RepeatDay: %02X" LF, Event.RepeatDays);
WiredHome 4:a1c25d936346 162 printf(" RepeatMonthDay: %08X" LF, Event.RepeatMonthDay);
WiredHome 4:a1c25d936346 163 printf(" RepeatMonthDayRev: %08X" LF, Event.RepeatMonthDayRev);
WiredHome 4:a1c25d936346 164 printf(" RepeatMonth: %04X" LF, Event.RepeatMonths);
WiredHome 9:2c2c35511965 165 sprintf(scratch, "%lu ", Event.Until);
WiredHome 4:a1c25d936346 166 sprintf(scratch + strlen(scratch), "%s", (Event.Until == 0) ? "" : ctime(&Event.Until));
WiredHome 4:a1c25d936346 167 scratch[strlen(scratch)-1] = '\0';
WiredHome 4:a1c25d936346 168 printf(" Until: %s" LF, scratch);
WiredHome 4:a1c25d936346 169 printf("" LF);
WiredHome 0:49245357cd1b 170 }
WiredHome 0:49245357cd1b 171
WiredHome 0:49245357cd1b 172
WiredHome 0:49245357cd1b 173 /// Computes the intersection of time1 and time2 ranges, and modifies time1
WiredHome 0:49245357cd1b 174 /// range to represent the intersection.
WiredHome 0:49245357cd1b 175 ///
WiredHome 8:87549cc99d5e 176 /// start1 is input as the start of the time1 range, and is written
WiredHome 0:49245357cd1b 177 /// to represent the intersection of the two ranges.
WiredHome 8:87549cc99d5e 178 /// end1 is input as the end of the time1 range and is written to
WiredHome 0:49245357cd1b 179 /// represent the intersection of the two ranges.
WiredHome 8:87549cc99d5e 180 /// start2 is the start of the time2 range.
WiredHome 8:87549cc99d5e 181 /// end2 is the end of the time2 range.
WiredHome 8:87549cc99d5e 182 /// returns true if the ranges have an intersection, and the time1 range
WiredHome 0:49245357cd1b 183 /// values have been modified.
WiredHome 0:49245357cd1b 184 ///
WiredHome 0:49245357cd1b 185 bool TimeIntersects(time_t * start1, time_t * end1, time_t * start2, time_t * end2)
WiredHome 0:49245357cd1b 186 {
WiredHome 0:49245357cd1b 187 // |----Time1----|
WiredHome 0:49245357cd1b 188 // |--Time2--| false
WiredHome 0:49245357cd1b 189 //
WiredHome 0:49245357cd1b 190 // |----Time1----|
WiredHome 0:49245357cd1b 191 // |--Time2--| false
WiredHome 0:49245357cd1b 192 //
WiredHome 0:49245357cd1b 193 // |----Time1----|
WiredHome 0:49245357cd1b 194 // |----Time2----|
WiredHome 0:49245357cd1b 195 // |-Time1-| true
WiredHome 0:49245357cd1b 196 //
WiredHome 0:49245357cd1b 197 // |----Time1----|
WiredHome 0:49245357cd1b 198 // |----Time2----|
WiredHome 0:49245357cd1b 199 // |-Time1-| true
WiredHome 0:49245357cd1b 200 //
WiredHome 0:49245357cd1b 201 // |----Time1-------|
WiredHome 0:49245357cd1b 202 // |-Time2-|
WiredHome 0:49245357cd1b 203 // |-Time1-| true
WiredHome 0:49245357cd1b 204 //
WiredHome 4:a1c25d936346 205 // | Time1 (end1 == 0)
WiredHome 4:a1c25d936346 206 // | Time2 (end2 == 0) true
WiredHome 4:a1c25d936346 207 //
WiredHome 4:a1c25d936346 208 if (*start1 == *start2 && *end1 == 0 && *end2 == 0)
WiredHome 4:a1c25d936346 209 return true;
WiredHome 0:49245357cd1b 210 if (*end1 < *start2 || *end2 < *start1)
WiredHome 0:49245357cd1b 211 return false;
WiredHome 0:49245357cd1b 212 if (max(*start1,*start2) < min(*end1,*end2)) {
WiredHome 0:49245357cd1b 213 *start1 = max(*start1,*start2);
WiredHome 0:49245357cd1b 214 *end1 = min(*end1,*end2);
WiredHome 0:49245357cd1b 215 return true;
WiredHome 0:49245357cd1b 216 } else {
WiredHome 0:49245357cd1b 217 return false;
WiredHome 0:49245357cd1b 218 }
WiredHome 0:49245357cd1b 219 }
WiredHome 0:49245357cd1b 220
WiredHome 4:a1c25d936346 221 bool isLeapYear(time_t t)
WiredHome 4:a1c25d936346 222 {
WiredHome 4:a1c25d936346 223 int year;
WiredHome 4:a1c25d936346 224 struct tm * ts;
WiredHome 4:a1c25d936346 225 ts = localtime(&t);
WiredHome 4:a1c25d936346 226
WiredHome 4:a1c25d936346 227 year = 1900 + ts->tm_year + 1;
WiredHome 4:a1c25d936346 228 if ((((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0))
WiredHome 4:a1c25d936346 229 return true;
WiredHome 4:a1c25d936346 230 else
WiredHome 4:a1c25d936346 231 return false;
WiredHome 4:a1c25d936346 232 }
WiredHome 4:a1c25d936346 233
WiredHome 4:a1c25d936346 234 time_t NextInterval(time_t curTime, int repeatFreq, int interval)
WiredHome 0:49245357cd1b 235 {
WiredHome 2:1f5dbc624b95 236 const time_t secperday = 60*60*24;
WiredHome 2:1f5dbc624b95 237 const int repeatFactor[] = {0, 1, 7, 30, 365};
WiredHome 4:a1c25d936346 238 int delta = repeatFactor[repeatFreq];
WiredHome 4:a1c25d936346 239 if (repeatFreq == 4 && isLeapYear(curTime))
WiredHome 4:a1c25d936346 240 delta += 1;
WiredHome 5:69577415c16e 241 //INFO("freq %d, interval %d, delta %d", repeatFreq, interval, delta);
WiredHome 4:a1c25d936346 242 return delta * interval * secperday;
WiredHome 0:49245357cd1b 243 }
WiredHome 0:49245357cd1b 244
WiredHome 2:1f5dbc624b95 245
WiredHome 2:1f5dbc624b95 246 // start1,end1 is the time range representing the visible grid
WiredHome 2:1f5dbc624b95 247 // start2,end2 is the time range of the event being tested
WiredHome 2:1f5dbc624b95 248 // Event is also the event being tested and permits testing the repeat information.
WiredHome 2:1f5dbc624b95 249 //
WiredHome 2:1f5dbc624b95 250 // If the event repeat pattern intersects with the display pattern, indicate this as "true"
WiredHome 2:1f5dbc624b95 251 //
WiredHome 4:a1c25d936346 252 bool RepeatMaskIntersects(time_t * start1, time_t * end1, time_t * start2, time_t * end2, Event_T * Event)
WiredHome 2:1f5dbc624b95 253 {
WiredHome 2:1f5dbc624b95 254 bool intersects = false;
WiredHome 2:1f5dbc624b95 255
WiredHome 5:69577415c16e 256 //INFO("RepeatFreq: %d", Event->RepeatFreq);
WiredHome 4:a1c25d936346 257 if (Event->RepeatFreq == rptfDaily) {
WiredHome 5:69577415c16e 258 //INFO("rptfDaily is not handled");
WiredHome 4:a1c25d936346 259 } else if (Event->RepeatFreq == rptfWeekly) {
WiredHome 2:1f5dbc624b95 260 struct tm * timeinfo;
WiredHome 2:1f5dbc624b95 261 timeinfo = localtime(start1);
WiredHome 4:a1c25d936346 262 uint8_t daymask = Event->RepeatDays;
WiredHome 2:1f5dbc624b95 263 // now, check the tm_wday (0=Sunday, 1=Monday, ...) and see if we intersect with the event time
WiredHome 2:1f5dbc624b95 264 uint8_t testmask = 1 << timeinfo->tm_wday;
WiredHome 2:1f5dbc624b95 265 //INFO("Mask: Event mask: %02X, test mask: %02X", daymask, testmask);
WiredHome 2:1f5dbc624b95 266 if (daymask & testmask)
WiredHome 2:1f5dbc624b95 267 intersects = true;
WiredHome 2:1f5dbc624b95 268 else
WiredHome 2:1f5dbc624b95 269 intersects = false;
WiredHome 2:1f5dbc624b95 270 //INFO(" intersects: %02X", daymask & testmask);
WiredHome 2:1f5dbc624b95 271 return intersects;
WiredHome 4:a1c25d936346 272 } else if (Event->RepeatFreq == rptfYearly) {
WiredHome 4:a1c25d936346 273 //struct tm * timeinfo;
WiredHome 4:a1c25d936346 274 //timeinfo = localtime(start1);
WiredHome 5:69577415c16e 275 //INFO("rptfYearly is not handled well yet");
WiredHome 2:1f5dbc624b95 276 }
WiredHome 2:1f5dbc624b95 277 //INFO("Mask: no handler, returning true");
WiredHome 2:1f5dbc624b95 278 return true;
WiredHome 2:1f5dbc624b95 279 }
WiredHome 2:1f5dbc624b95 280
WiredHome 4:a1c25d936346 281 bool RepeatIntersects(time_t * start1, time_t * end1, time_t * start2, time_t * end2, Event_T * Event)
WiredHome 0:49245357cd1b 282 {
WiredHome 4:a1c25d936346 283
WiredHome 5:69577415c16e 284 //INFO("** 1: (%s, %s)", FormatCTime(*start1), *end1 ? FormatCTime(*end1) : "");
WiredHome 5:69577415c16e 285 //INFO(" 2: (%s, %s)", FormatCTime(*start2), *end2 ? FormatCTime(*end2) : "");
WiredHome 4:a1c25d936346 286 if (TimeIntersects(start1, end1, start2, end2))
WiredHome 4:a1c25d936346 287 return true;
WiredHome 4:a1c25d936346 288 if (Event && Event->RepeatFreq) {
WiredHome 5:69577415c16e 289 //INFO("Summary: %s", Event->Summary);
WiredHome 4:a1c25d936346 290 if (Event->Start < *start2 && Event->Until > *start2 ) { // Until=....
WiredHome 0:49245357cd1b 291 do {
WiredHome 4:a1c25d936346 292 time_t interval = NextInterval(*start1, Event->RepeatFreq, (Event->Interval == 0) ? 1 : Event->Interval);
WiredHome 0:49245357cd1b 293 *start1 = *start1 + interval;
WiredHome 4:a1c25d936346 294 if (*end1)
WiredHome 4:a1c25d936346 295 *end1 = *end1 + interval;
WiredHome 5:69577415c16e 296 //INFO("** 1: (%s, %s)", FormatCTime(*start1), *end1 ? FormatCTime(*end1) : "");
WiredHome 5:69577415c16e 297 //INFO("until (%24s, %s)", " ", FormatCTime(Event->Until));
WiredHome 5:69577415c16e 298 //INFO(" 2: (%s, %s)", FormatCTime(*start2), *end2 ? FormatCTime(*end2) : "");
WiredHome 2:1f5dbc624b95 299 if (!RepeatMaskIntersects(start1, end1, start2, end2, Event)) {
WiredHome 2:1f5dbc624b95 300 continue; // we're not on a repeat cycle (e.g. wrong day of the week)
WiredHome 2:1f5dbc624b95 301 }
WiredHome 0:49245357cd1b 302 if (TimeIntersects(start1, end1, start2, end2)) {
WiredHome 0:49245357cd1b 303 return true;
WiredHome 0:49245357cd1b 304 }
WiredHome 4:a1c25d936346 305 } while ((*end2 == 0 || *start1 < *end2) && *start1 < Event->Until);
WiredHome 4:a1c25d936346 306 } else if (Event->Start < *start2 && Event->Count) { // Count=
WiredHome 4:a1c25d936346 307 int count = Event->Count - 1;
WiredHome 0:49245357cd1b 308 do {
WiredHome 4:a1c25d936346 309 time_t interval = NextInterval(*start1, Event->RepeatFreq, (Event->Interval == 0) ? 1 : Event->Interval);
WiredHome 0:49245357cd1b 310 *start1 = *start1 + interval;
WiredHome 4:a1c25d936346 311 if (*end1)
WiredHome 4:a1c25d936346 312 *end1 = *end1 + interval;
WiredHome 5:69577415c16e 313 //INFO("** 1: (%s, %s) - %d", FormatCTime(*start1), *end1 ? FormatCTime(*end1) : "", count);
WiredHome 5:69577415c16e 314 //INFO(" 2: (%s, %s)", FormatCTime(*start2), *end2 ? FormatCTime(*end2) : "");
WiredHome 2:1f5dbc624b95 315 if (!RepeatMaskIntersects(start1, end1, start2, end2, Event)) {
WiredHome 2:1f5dbc624b95 316 continue; // we're not on a repeat cycle (e.g. wrong day of the week)
WiredHome 2:1f5dbc624b95 317 }
WiredHome 0:49245357cd1b 318 if (TimeIntersects(start1, end1, start2, end2)) {
WiredHome 0:49245357cd1b 319 return true;
WiredHome 0:49245357cd1b 320 }
WiredHome 2:1f5dbc624b95 321 } while (--count);
WiredHome 4:a1c25d936346 322 } else if (Event->Start < *start2) { // no Count= and no Until=
WiredHome 0:49245357cd1b 323 do {
WiredHome 4:a1c25d936346 324 int rptFreq = Event->RepeatFreq;
WiredHome 4:a1c25d936346 325 if (Event->RepeatFreq == 2 && Event->RepeatDays != 0)
WiredHome 4:a1c25d936346 326 rptFreq--;
WiredHome 4:a1c25d936346 327 time_t interval = NextInterval(*start1, rptFreq, (Event->Interval == 0) ? 1 : Event->Interval);
WiredHome 0:49245357cd1b 328 *start1 = *start1 + interval;
WiredHome 4:a1c25d936346 329 if (*end1)
WiredHome 4:a1c25d936346 330 *end1 = *end1 + interval;
WiredHome 5:69577415c16e 331 //INFO("== 1: (%s, %s)", FormatCTime(*start1), *end1 ? FormatCTime(*end1) : "");
WiredHome 5:69577415c16e 332 //INFO(" 2: (%s, %s)", FormatCTime(*start2), *end2 ? FormatCTime(*end2) : "");
WiredHome 2:1f5dbc624b95 333 if (!RepeatMaskIntersects(start1, end1, start2, end2, Event)) {
WiredHome 2:1f5dbc624b95 334 continue; // we're not on a repeat cycle (e.g. wrong day of the week)
WiredHome 2:1f5dbc624b95 335 }
WiredHome 0:49245357cd1b 336 if (TimeIntersects(start1, end1, start2, end2)) {
WiredHome 0:49245357cd1b 337 return true;
WiredHome 0:49245357cd1b 338 }
WiredHome 4:a1c25d936346 339 } while (*start1 < *end2 || (*end2 == 0 && *start1 < *start2));
WiredHome 0:49245357cd1b 340 }
WiredHome 0:49245357cd1b 341 }
WiredHome 2:1f5dbc624b95 342 //INFO(" no intersection");
WiredHome 0:49245357cd1b 343 return false;
WiredHome 0:49245357cd1b 344 }
WiredHome 0:49245357cd1b 345
WiredHome 2:1f5dbc624b95 346 // All the stuff between
WiredHome 2:1f5dbc624b95 347 // BEGIN:VEVENT
WiredHome 2:1f5dbc624b95 348 // ...
WiredHome 2:1f5dbc624b95 349 // END:VEVENT
WiredHome 2:1f5dbc624b95 350 //
WiredHome 5:69577415c16e 351 void ParseEvent(Event_T * Event, char * pStart, tz_sec_t tzoSec)
WiredHome 2:1f5dbc624b95 352 {
WiredHome 5:69577415c16e 353 INFO("ParseEvent(...,'%s',%d)", pStart, tzoSec);
WiredHome 2:1f5dbc624b95 354 if (strncmp(pStart, "DTSTART:", 8) == 0) {
WiredHome 2:1f5dbc624b95 355 Event->Start = ParseDateStamp(pStart+8, tzoSec);
WiredHome 10:deeaec151283 356 INFO(" Start: %s\n", ctime(&Event->Start));
WiredHome 2:1f5dbc624b95 357 } else if (strncmp(pStart, "DTSTART;", 8) == 0) {
WiredHome 4:a1c25d936346 358 char * p = pStart + 8;
WiredHome 4:a1c25d936346 359 tzoSec = ParseTZID(p);
WiredHome 4:a1c25d936346 360 p = strrchr(pStart, ':');
WiredHome 2:1f5dbc624b95 361 if (p) {
WiredHome 2:1f5dbc624b95 362 Event->Start = ParseDateStamp(p+1, tzoSec);
WiredHome 5:69577415c16e 363 INFO(" Start: %s\n", ctime(&Event->Start));
WiredHome 2:1f5dbc624b95 364 }
WiredHome 2:1f5dbc624b95 365 } else if (strncmp(pStart, "DTEND:", 6) == 0) {
WiredHome 2:1f5dbc624b95 366 Event->End = ParseDateStamp(pStart+6, tzoSec);
WiredHome 4:a1c25d936346 367 //INFO(" End: %d\n", mktime(&Event->eventEnd));
WiredHome 2:1f5dbc624b95 368 } else if (strncmp(pStart, "DTEND;", 6) == 0) {
WiredHome 4:a1c25d936346 369 char * p = pStart + 8;
WiredHome 4:a1c25d936346 370 tzoSec = ParseTZID(p);
WiredHome 4:a1c25d936346 371 p = strrchr(pStart, ':');
WiredHome 2:1f5dbc624b95 372 if (p) {
WiredHome 2:1f5dbc624b95 373 Event->End = ParseDateStamp(p+1, tzoSec);
WiredHome 5:69577415c16e 374 INFO(" End: %s\n", ctime(&Event->End));
WiredHome 2:1f5dbc624b95 375 }
WiredHome 2:1f5dbc624b95 376 } else if (strncmp(pStart, "SUMMARY:", 8) == 0) {
WiredHome 2:1f5dbc624b95 377 strncpy(Event->Summary, pStart+8, SUMMARY_CHARS-1);
WiredHome 2:1f5dbc624b95 378 Event->Summary[SUMMARY_CHARS-1] = '\0';
WiredHome 4:a1c25d936346 379 //INFO(" Summary: %s\n", Event->Summary);
WiredHome 2:1f5dbc624b95 380 } else if (strncmp(pStart, "LOCATION:", 9) == 0) {
WiredHome 2:1f5dbc624b95 381 strncpy(Event->Location, pStart+9, LOCATION_CHARS-1);
WiredHome 2:1f5dbc624b95 382 Event->Location[LOCATION_CHARS-1] = '\0';
WiredHome 4:a1c25d936346 383 //INFO(" Location: %s\n", Event->Location);
WiredHome 2:1f5dbc624b95 384 } else if (strncmp(pStart, "PRIORITY:", 9) == 0) {
WiredHome 2:1f5dbc624b95 385 Event->Priority = *(pStart+9) - '0';
WiredHome 4:a1c25d936346 386 //INFO(" Priority: %d\n", Event->Priority);
WiredHome 2:1f5dbc624b95 387 } else if (strncmp(pStart, "CATEGORIES:", 11) == 0) {
WiredHome 2:1f5dbc624b95 388 strncpy(Event->Category, pStart+11, CATEGORY_CHARS-1);
WiredHome 2:1f5dbc624b95 389 Event->Category[CATEGORY_CHARS-1] = '\0';
WiredHome 4:a1c25d936346 390 //INFO(" Category: %s\n", Event->Category);
WiredHome 2:1f5dbc624b95 391 } else if (strncmp(pStart, "RRULE:", 6) == 0) {
WiredHome 2:1f5dbc624b95 392 //RRULE:FREQ=WEEKLY;UNTIL=20140502T180000;BYDAY=MO,TU,WE,TH,FR
WiredHome 2:1f5dbc624b95 393 char * p1, *p2;
WiredHome 2:1f5dbc624b95 394 //INFO("%s", pStart);
WiredHome 2:1f5dbc624b95 395 p1 = pStart + 6; // p1 = FREQ=WEEKLY;UNTIL=20140502T180000;BYDAY=MO,TU,WE,TH,FR
WiredHome 2:1f5dbc624b95 396 p2 = strchr(p1, ';');
WiredHome 2:1f5dbc624b95 397 if (p2)
WiredHome 2:1f5dbc624b95 398 *p2++ = '\0';
WiredHome 2:1f5dbc624b95 399 while (*p1) {
WiredHome 2:1f5dbc624b95 400 //INFO("%s", p1);
WiredHome 2:1f5dbc624b95 401 if (strncmp(p1, "FREQ=", 5) == 0) {
WiredHome 2:1f5dbc624b95 402 //INFO("%s", p1);
WiredHome 2:1f5dbc624b95 403 p1 += 5; // p1 = WEEKLY;UNTIL=20140502T180000;BYDAY=MO,TU,WE,TH,FR
WiredHome 2:1f5dbc624b95 404 if (strncmp(p1, "WEEKLY", 6) == 0) {
WiredHome 2:1f5dbc624b95 405 //INFO(" %s", p1);
WiredHome 2:1f5dbc624b95 406 Event->RepeatFreq = rptfWeekly;
WiredHome 2:1f5dbc624b95 407 p1 += 6;
WiredHome 2:1f5dbc624b95 408 } else if (strncmp(p1, "DAILY", 5) == 0) {
WiredHome 2:1f5dbc624b95 409 //INFO(" %s", p1);
WiredHome 2:1f5dbc624b95 410 Event->RepeatFreq = rptfDaily;
WiredHome 2:1f5dbc624b95 411 p1 += 5;
WiredHome 2:1f5dbc624b95 412 } else if (strncmp(p1, "MONTHLY", 7) == 0) {
WiredHome 2:1f5dbc624b95 413 //INFO(" %s", p1);
WiredHome 2:1f5dbc624b95 414 Event->RepeatFreq = rptfMonthly;
WiredHome 2:1f5dbc624b95 415 p1 += 7;
WiredHome 2:1f5dbc624b95 416 } else if (strncmp(p1, "YEARLY", 6) == 0) {
WiredHome 2:1f5dbc624b95 417 //INFO(" %s", p1);
WiredHome 2:1f5dbc624b95 418 Event->RepeatFreq = rptfYearly;
WiredHome 4:a1c25d936346 419 p1 += 6;
WiredHome 2:1f5dbc624b95 420 }
WiredHome 2:1f5dbc624b95 421 } else if (strncmp(p1, "INTERVAL=", 9) == 0) { // INTERVAL=2
WiredHome 2:1f5dbc624b95 422 //INFO("%s", p1);
WiredHome 2:1f5dbc624b95 423 p1 += 9;
WiredHome 2:1f5dbc624b95 424 Event->Interval = atoi(p1);
WiredHome 2:1f5dbc624b95 425 } else if (strncmp(p1, "COUNT=", 6) == 0) { // COUNT=12;
WiredHome 2:1f5dbc624b95 426 //INFO("%s", p1);
WiredHome 2:1f5dbc624b95 427 p1 += 6; // p1 =
WiredHome 2:1f5dbc624b95 428 Event->Count = atoi(p1);
WiredHome 2:1f5dbc624b95 429 } else if (strncmp(p1, "UNTIL=", 6) == 0) {
WiredHome 2:1f5dbc624b95 430 //INFO("%s", p1);
WiredHome 2:1f5dbc624b95 431 p1 += 6; // p1 = 20140502T180000;BYDAY=MO,TU,WE,TH,FR
WiredHome 4:a1c25d936346 432 //printf("UNTIL= {%s}\n", p1);
WiredHome 2:1f5dbc624b95 433 Event->Until = ParseDateStamp(p1, tzoSec);
WiredHome 4:a1c25d936346 434 //printf("UNTIL:: %d: %d\n", Event->Until, tzoSec);
WiredHome 2:1f5dbc624b95 435 } else if (strncmp(p1, "BYDAY=", 6) == 0) {
WiredHome 2:1f5dbc624b95 436 //INFO("%s", p1);
WiredHome 2:1f5dbc624b95 437 p1 += 6; // p1 = MO,TU,WE,TH,FR
WiredHome 2:1f5dbc624b95 438 while (*p1 >= ' ') {
WiredHome 2:1f5dbc624b95 439 //INFO(" %s", p1);
WiredHome 2:1f5dbc624b95 440 for (int d=0; d<7; d++) {
WiredHome 2:1f5dbc624b95 441 if (strncmp(p1,RepeatDayAbbrev(d),2) == 0) {
WiredHome 2:1f5dbc624b95 442 Event->RepeatDays |= (1 << d);
WiredHome 2:1f5dbc624b95 443 //INFO(" %s %02X", RepeatDayAbbrev(d), Event->RepeatDays);
WiredHome 2:1f5dbc624b95 444 break;
WiredHome 2:1f5dbc624b95 445 }
WiredHome 2:1f5dbc624b95 446 }
WiredHome 2:1f5dbc624b95 447 p1 += 3;
WiredHome 2:1f5dbc624b95 448 }
WiredHome 2:1f5dbc624b95 449 //INFO(" RepeatDay: %02X", Event->RepeatDays);
WiredHome 4:a1c25d936346 450 } else if (strncmp(p1, "BYMONTHDAY=", 11) == 0) {
WiredHome 4:a1c25d936346 451 // RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=2,15
WiredHome 4:a1c25d936346 452 p1 += 11;
WiredHome 4:a1c25d936346 453 while (*p1 >= ' ') {
WiredHome 4:a1c25d936346 454 char * px = p1;
WiredHome 4:a1c25d936346 455 while (*px >= ' ' && *px != ',') { // find , or ; or <nul>
WiredHome 4:a1c25d936346 456 px++;
WiredHome 4:a1c25d936346 457 }
WiredHome 4:a1c25d936346 458 if (*px)
WiredHome 4:a1c25d936346 459 *px++ = '\0';
WiredHome 4:a1c25d936346 460 int num = atoi(p1);
WiredHome 4:a1c25d936346 461 if (num >= 0)
WiredHome 4:a1c25d936346 462 Event->RepeatMonthDay |= (1 << num);
WiredHome 4:a1c25d936346 463 else
WiredHome 4:a1c25d936346 464 Event->RepeatMonthDayRev |= (1 << -num);
WiredHome 4:a1c25d936346 465 p1 = px;
WiredHome 4:a1c25d936346 466 }
WiredHome 4:a1c25d936346 467 INFO(" RepeatMonthDay: %08X", Event->RepeatMonthDay);
WiredHome 4:a1c25d936346 468 } else if (strncmp(p1, "BYMONTH=", 8) == 0) {
WiredHome 4:a1c25d936346 469 // RRULE:FREQ=YEARLY;INTERVAL=2;COUNT=10;BYMONTH=1,2,3
WiredHome 4:a1c25d936346 470 p1 += 8;
WiredHome 4:a1c25d936346 471 while (*p1 >= ' ') {
WiredHome 4:a1c25d936346 472 char * px = p1;
WiredHome 4:a1c25d936346 473 while (*px >= ' ' && *px != ',') { // find , or ; or <nul>
WiredHome 4:a1c25d936346 474 px++;
WiredHome 4:a1c25d936346 475 }
WiredHome 4:a1c25d936346 476 if (*px)
WiredHome 4:a1c25d936346 477 *px++ = '\0';
WiredHome 4:a1c25d936346 478 int num = atoi(p1);
WiredHome 4:a1c25d936346 479 if (num >= 0)
WiredHome 4:a1c25d936346 480 Event->RepeatMonths |= (1 << num);
WiredHome 9:2c2c35511965 481 //else
WiredHome 9:2c2c35511965 482 // ; // Event->RepeatMonthsRev |= (1 << -num);
WiredHome 4:a1c25d936346 483 p1 = px;
WiredHome 4:a1c25d936346 484 }
WiredHome 4:a1c25d936346 485 INFO(" RepeatMonths: %04X", Event->RepeatMonths);
WiredHome 2:1f5dbc624b95 486 }
WiredHome 2:1f5dbc624b95 487 if (!p2)
WiredHome 2:1f5dbc624b95 488 break;
WiredHome 2:1f5dbc624b95 489 p1 = p2;
WiredHome 2:1f5dbc624b95 490 p2 = strchr(p1, ';');
WiredHome 2:1f5dbc624b95 491 if (p2)
WiredHome 2:1f5dbc624b95 492 *p2++ = '\0';
WiredHome 2:1f5dbc624b95 493 }
WiredHome 2:1f5dbc624b95 494 }
WiredHome 2:1f5dbc624b95 495 }
WiredHome 0:49245357cd1b 496
WiredHome 4:a1c25d936346 497
WiredHome 4:a1c25d936346 498 // TZID="(GMT -06:00)":20140519T063000
WiredHome 4:a1c25d936346 499 // TZID:(UTC-06:00) Central Time (US & Canada)
WiredHome 4:a1c25d936346 500 // TZID:(GMT -06:00)
WiredHome 5:69577415c16e 501 tz_sec_t ParseTZID(char * string)
WiredHome 4:a1c25d936346 502 {
WiredHome 5:69577415c16e 503 tz_sec_t tzo = 0;
WiredHome 4:a1c25d936346 504 bool sign = false;
WiredHome 4:a1c25d936346 505
WiredHome 5:69577415c16e 506 INFO("ParseTZID(%s)", string);
WiredHome 4:a1c25d936346 507 if (*string == '"') // TZID="(GMT -06:00)":20140519T063000
WiredHome 4:a1c25d936346 508 string++;
WiredHome 4:a1c25d936346 509 if ((strncmp(string, "(UTC", 4) == 0)
WiredHome 4:a1c25d936346 510 || (strncmp(string, "(GMT", 4) == 0) ){
WiredHome 4:a1c25d936346 511 string += 4;
WiredHome 4:a1c25d936346 512 if (*string == ' ')
WiredHome 4:a1c25d936346 513 string++;
WiredHome 4:a1c25d936346 514 if (*string == '-') {
WiredHome 4:a1c25d936346 515 sign = true;
WiredHome 4:a1c25d936346 516 string++;
WiredHome 4:a1c25d936346 517 }
WiredHome 4:a1c25d936346 518 tzo = atoi(string) * 3600;
WiredHome 4:a1c25d936346 519 string = strchr(string, ':');
WiredHome 4:a1c25d936346 520 if (string) {
WiredHome 4:a1c25d936346 521 string++;
WiredHome 4:a1c25d936346 522 tzo += atoi(string) * 60;
WiredHome 4:a1c25d936346 523 }
WiredHome 4:a1c25d936346 524 if (sign)
WiredHome 4:a1c25d936346 525 tzo = -tzo;
WiredHome 5:69577415c16e 526 INFO(" tzo = %d", tzo);
WiredHome 4:a1c25d936346 527 } else {
WiredHome 4:a1c25d936346 528 ERR("Unhandled TZID(%s)", string);
WiredHome 4:a1c25d936346 529 }
WiredHome 4:a1c25d936346 530 return tzo;
WiredHome 4:a1c25d936346 531 }
WiredHome 4:a1c25d936346 532
WiredHome 11:fe5586155a42 533 void ParseICalStart(void) {
WiredHome 11:fe5586155a42 534 tzAdjusted = false;
WiredHome 11:fe5586155a42 535 seeking = idle;
WiredHome 11:fe5586155a42 536 EventCount = 0;
WiredHome 11:fe5586155a42 537
WiredHome 11:fe5586155a42 538 }
WiredHome 11:fe5586155a42 539
WiredHome 11:fe5586155a42 540 int ParseICalClose(void) {
WiredHome 11:fe5586155a42 541 if (EventCount > 0)
WiredHome 11:fe5586155a42 542 SortEvents();
WiredHome 11:fe5586155a42 543 return GetNumEvents();
WiredHome 11:fe5586155a42 544 }
WiredHome 11:fe5586155a42 545
WiredHome 5:69577415c16e 546 int ParseICalStream(char * pStart, time_t gridStartTime, time_t gridEndTime, tz_min_t tzoMin, bool showEvents)
WiredHome 0:49245357cd1b 547 {
WiredHome 0:49245357cd1b 548 char * pEnd;
WiredHome 4:a1c25d936346 549
WiredHome 4:a1c25d936346 550 if (gridEndTime == gridStartTime)
WiredHome 4:a1c25d936346 551 gridEndTime++; // advance so they are not equal
WiredHome 0:49245357cd1b 552 while (pStart && EventCount < EVENT_COUNT) {
WiredHome 0:49245357cd1b 553 pEnd = strchr(pStart, '\n');
WiredHome 0:49245357cd1b 554 if (pEnd) {
WiredHome 0:49245357cd1b 555 if (*(pEnd-1) == '\r')
WiredHome 0:49245357cd1b 556 pEnd--;
WiredHome 0:49245357cd1b 557 *pEnd++ = '\0';
WiredHome 0:49245357cd1b 558 while (*pEnd && *pEnd < ' ') {
WiredHome 0:49245357cd1b 559 pEnd++;
WiredHome 0:49245357cd1b 560 }
WiredHome 0:49245357cd1b 561 // pStart now has a single null terminated line of text.
WiredHome 0:49245357cd1b 562 switch (seeking) {
WiredHome 0:49245357cd1b 563 case idle:
WiredHome 0:49245357cd1b 564 if (strcmp(pStart, "BEGIN:VTIMEZONE") == 0)
WiredHome 0:49245357cd1b 565 seeking = inTimeZone;
WiredHome 0:49245357cd1b 566 else if (strcmp(pStart, "BEGIN:VEVENT") == 0) {
WiredHome 0:49245357cd1b 567 seeking = inEvent;
WiredHome 0:49245357cd1b 568 Event.Start = 0;
WiredHome 0:49245357cd1b 569 Event.End = 0;
WiredHome 0:49245357cd1b 570 Event.Until = 0;
WiredHome 0:49245357cd1b 571 Event.Summary[0] = '\0';
WiredHome 0:49245357cd1b 572 Event.Location[0] = '\0';
WiredHome 0:49245357cd1b 573 Event.Category[0] = '\0';
WiredHome 0:49245357cd1b 574 Event.Count = 0;
WiredHome 0:49245357cd1b 575 Event.Interval = 0;
WiredHome 0:49245357cd1b 576 Event.RepeatFreq = rptfNone;
WiredHome 0:49245357cd1b 577 Event.RepeatDays = 0;
WiredHome 4:a1c25d936346 578 Event.RepeatMonthDay = 0;
WiredHome 4:a1c25d936346 579 Event.RepeatMonthDayRev = 0;
WiredHome 4:a1c25d936346 580 Event.RepeatMonths = 0;
WiredHome 0:49245357cd1b 581 Event.Priority = 5; // 5 is Normal
WiredHome 0:49245357cd1b 582 }
WiredHome 0:49245357cd1b 583 break;
WiredHome 0:49245357cd1b 584 case inTimeZone:
WiredHome 0:49245357cd1b 585 // Can also pick up daylight savings time
WiredHome 7:dc132d8bcbfd 586 if (strcmp(pStart, "END:VTIMEZONE") == 0) {
WiredHome 0:49245357cd1b 587 seeking = idle;
WiredHome 7:dc132d8bcbfd 588 } else if ((strncmp(pStart, "TZID:", 5) == 0)
WiredHome 4:a1c25d936346 589 || (strncmp(pStart, "TZID=", 5) == 0) ) {
WiredHome 4:a1c25d936346 590 tzoTZIDSec = ParseTZID(pStart + 5);
WiredHome 0:49245357cd1b 591 tzAdjusted = true;
WiredHome 7:dc132d8bcbfd 592 } else if (strncmp(pStart, "BEGIN:STANDARD", 14) == 0) {
WiredHome 7:dc132d8bcbfd 593
WiredHome 7:dc132d8bcbfd 594 } else if (strncmp(pStart, "BEGIN:DAYLIGHT", 14) == 0) {
WiredHome 7:dc132d8bcbfd 595
WiredHome 4:a1c25d936346 596 }
WiredHome 0:49245357cd1b 597 break;
WiredHome 0:49245357cd1b 598 case inEvent:
WiredHome 0:49245357cd1b 599 // inEvent
WiredHome 0:49245357cd1b 600 if (strcmp(pStart, "END:VEVENT") == 0) {
WiredHome 0:49245357cd1b 601 // Timezone offset
WiredHome 0:49245357cd1b 602 if (!tzAdjusted) {
WiredHome 5:69577415c16e 603 Event.Start += (60 * tzoMin);
WiredHome 4:a1c25d936346 604 if (Event.End)
WiredHome 5:69577415c16e 605 Event.End += (60 * tzoMin);
WiredHome 0:49245357cd1b 606 }
WiredHome 0:49245357cd1b 607 // Process it
WiredHome 4:a1c25d936346 608 if (showEvents)
WiredHome 4:a1c25d936346 609 ShowEventInfo(Event);
WiredHome 9:2c2c35511965 610 // Force to ALWAYS
WiredHome 9:2c2c35511965 611 if (1 || (Event.Start >= gridStartTime && Event.Start < gridEndTime)
WiredHome 9:2c2c35511965 612 || (Event.End >= gridStartTime && Event.End < gridEndTime)) {
WiredHome 0:49245357cd1b 613 EventList[EventCount++] = Event;
WiredHome 9:2c2c35511965 614 if (showEvents) {
WiredHome 4:a1c25d936346 615 INFO(" +++++ Added Event %d: %s", EventCount, Event.Summary);
WiredHome 9:2c2c35511965 616 }
WiredHome 0:49245357cd1b 617 }
WiredHome 0:49245357cd1b 618 seeking = idle;
WiredHome 2:1f5dbc624b95 619 } else {
WiredHome 5:69577415c16e 620 ParseEvent(&Event, pStart, 60 * tzoMin);
WiredHome 2:1f5dbc624b95 621 }
WiredHome 0:49245357cd1b 622 // End of inEvent
WiredHome 0:49245357cd1b 623 break;
WiredHome 0:49245357cd1b 624 default:
WiredHome 0:49245357cd1b 625 seeking = idle;
WiredHome 0:49245357cd1b 626 break;
WiredHome 0:49245357cd1b 627 }
WiredHome 0:49245357cd1b 628 pStart = pEnd;
WiredHome 0:49245357cd1b 629 } else {
WiredHome 0:49245357cd1b 630 pStart = NULL;
WiredHome 0:49245357cd1b 631 }
WiredHome 0:49245357cd1b 632 } // while
WiredHome 4:a1c25d936346 633 }