an iCal processing library

Committer:
WiredHome
Date:
Thu Jul 10 11:01:49 2014 +0000
Revision:
7:dc132d8bcbfd
Parent:
6:4d1fc1cb38ad
Child:
8:87549cc99d5e
Starting the framework to parse the DST fields

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