author | zecke <zecke> | 2003-02-22 16:33:34 (UTC) |
---|---|---|
committer | zecke <zecke> | 2003-02-22 16:33:34 (UTC) |
commit | 2424bcd292444b3a03c9b92dbc7f5b392c355755 (patch) (unidiff) | |
tree | 7f909f39bce8ba8501d07dc6ff238ae7918fc8de /libopie2/opiepim/backend/odatebookaccessbackend_xml.cpp | |
parent | 66b00525256255290dfcd9d48ebe1539f15b8dce (diff) | |
download | opie-2424bcd292444b3a03c9b92dbc7f5b392c355755.zip opie-2424bcd292444b3a03c9b92dbc7f5b392c355755.tar.gz opie-2424bcd292444b3a03c9b92dbc7f5b392c355755.tar.bz2 |
fixx off by one in reading
Diffstat (limited to 'libopie2/opiepim/backend/odatebookaccessbackend_xml.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | libopie2/opiepim/backend/odatebookaccessbackend_xml.cpp | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/libopie2/opiepim/backend/odatebookaccessbackend_xml.cpp b/libopie2/opiepim/backend/odatebookaccessbackend_xml.cpp index bc51996..24b69fe 100644 --- a/libopie2/opiepim/backend/odatebookaccessbackend_xml.cpp +++ b/libopie2/opiepim/backend/odatebookaccessbackend_xml.cpp | |||
@@ -2,48 +2,75 @@ | |||
2 | #include <fcntl.h> | 2 | #include <fcntl.h> |
3 | 3 | ||
4 | #include <stdio.h> | 4 | #include <stdio.h> |
5 | #include <stdlib.h> | 5 | #include <stdlib.h> |
6 | 6 | ||
7 | #include <sys/types.h> | 7 | #include <sys/types.h> |
8 | #include <sys/mman.h> | 8 | #include <sys/mman.h> |
9 | #include <sys/stat.h> | 9 | #include <sys/stat.h> |
10 | 10 | ||
11 | #include <unistd.h> | 11 | #include <unistd.h> |
12 | 12 | ||
13 | #include <qasciidict.h> | 13 | #include <qasciidict.h> |
14 | #include <qfile.h> | 14 | #include <qfile.h> |
15 | 15 | ||
16 | #include <qtopia/global.h> | 16 | #include <qtopia/global.h> |
17 | #include <qtopia/stringutil.h> | 17 | #include <qtopia/stringutil.h> |
18 | #include <qtopia/timeconversion.h> | 18 | #include <qtopia/timeconversion.h> |
19 | 19 | ||
20 | #include "opimnotifymanager.h" | 20 | #include "opimnotifymanager.h" |
21 | #include "orecur.h" | 21 | #include "orecur.h" |
22 | #include "otimezone.h" | 22 | #include "otimezone.h" |
23 | #include "odatebookaccessbackend_xml.h" | 23 | #include "odatebookaccessbackend_xml.h" |
24 | 24 | ||
25 | namespace { | 25 | namespace { |
26 | // FROM TT again | ||
27 | char *strstrlen(const char *haystack, int hLen, const char* needle, int nLen) | ||
28 | { | ||
29 | char needleChar; | ||
30 | char haystackChar; | ||
31 | if (!needle || !haystack || !hLen || !nLen) | ||
32 | return 0; | ||
33 | |||
34 | const char* hsearch = haystack; | ||
35 | |||
36 | if ((needleChar = *needle++) != 0) { | ||
37 | nLen--; //(to make up for needle++) | ||
38 | do { | ||
39 | do { | ||
40 | if ((haystackChar = *hsearch++) == 0) | ||
41 | return (0); | ||
42 | if (hsearch >= haystack + hLen) | ||
43 | return (0); | ||
44 | } while (haystackChar != needleChar); | ||
45 | } while (strncmp(hsearch, needle, QMIN(hLen - (hsearch - haystack), nLen)) != 0); | ||
46 | hsearch--; | ||
47 | } | ||
48 | return ((char *)hsearch); | ||
49 | } | ||
50 | } | ||
51 | |||
52 | namespace { | ||
26 | time_t start, end, created, rp_end; | 53 | time_t start, end, created, rp_end; |
27 | ORecur* rec; | 54 | ORecur* rec; |
28 | ORecur* recur() { | 55 | ORecur* recur() { |
29 | if (!rec) | 56 | if (!rec) |
30 | rec = new ORecur; | 57 | rec = new ORecur; |
31 | 58 | ||
32 | return rec; | 59 | return rec; |
33 | } | 60 | } |
34 | int alarmTime; | 61 | int alarmTime; |
35 | int snd; | 62 | int snd; |
36 | enum Attribute{ | 63 | enum Attribute{ |
37 | FDescription = 0, | 64 | FDescription = 0, |
38 | FLocation, | 65 | FLocation, |
39 | FCategories, | 66 | FCategories, |
40 | FUid, | 67 | FUid, |
41 | FType, | 68 | FType, |
42 | FAlarm, | 69 | FAlarm, |
43 | FSound, | 70 | FSound, |
44 | FRType, | 71 | FRType, |
45 | FRWeekdays, | 72 | FRWeekdays, |
46 | FRPosition, | 73 | FRPosition, |
47 | FRFreq, | 74 | FRFreq, |
48 | FRHasEndDate, | 75 | FRHasEndDate, |
49 | FREndDate, | 76 | FREndDate, |
@@ -321,49 +348,49 @@ bool ODateBookAccessBackend_XML::loadFile() { | |||
321 | dict.insert( "alarm", new int(FAlarm) ); | 348 | dict.insert( "alarm", new int(FAlarm) ); |
322 | dict.insert( "sound", new int(FSound) ); | 349 | dict.insert( "sound", new int(FSound) ); |
323 | dict.insert( "rtype", new int(FRType) ); | 350 | dict.insert( "rtype", new int(FRType) ); |
324 | dict.insert( "rweekdays", new int(FRWeekdays) ); | 351 | dict.insert( "rweekdays", new int(FRWeekdays) ); |
325 | dict.insert( "rposition", new int(FRPosition) ); | 352 | dict.insert( "rposition", new int(FRPosition) ); |
326 | dict.insert( "rfreq", new int(FRFreq) ); | 353 | dict.insert( "rfreq", new int(FRFreq) ); |
327 | dict.insert( "rhasenddate", new int(FRHasEndDate) ); | 354 | dict.insert( "rhasenddate", new int(FRHasEndDate) ); |
328 | dict.insert( "enddt", new int(FREndDate) ); | 355 | dict.insert( "enddt", new int(FREndDate) ); |
329 | dict.insert( "start", new int(FRStart) ); | 356 | dict.insert( "start", new int(FRStart) ); |
330 | dict.insert( "end", new int(FREnd) ); | 357 | dict.insert( "end", new int(FREnd) ); |
331 | dict.insert( "note", new int(FNote) ); | 358 | dict.insert( "note", new int(FNote) ); |
332 | dict.insert( "created", new int(FCreated) ); | 359 | dict.insert( "created", new int(FCreated) ); |
333 | dict.insert( "recparent", new int(FRecParent) ); | 360 | dict.insert( "recparent", new int(FRecParent) ); |
334 | dict.insert( "recchildren", new int(FRecChildren) ); | 361 | dict.insert( "recchildren", new int(FRecChildren) ); |
335 | dict.insert( "exceptions", new int(FExceptions) ); | 362 | dict.insert( "exceptions", new int(FExceptions) ); |
336 | dict.insert( "timezone", new int(FTimeZone) ); | 363 | dict.insert( "timezone", new int(FTimeZone) ); |
337 | 364 | ||
338 | char* dt = (char*)map_addr; | 365 | char* dt = (char*)map_addr; |
339 | int len = attribute.st_size; | 366 | int len = attribute.st_size; |
340 | int i = 0; | 367 | int i = 0; |
341 | char* point; | 368 | char* point; |
342 | const char* collectionString = "<event "; | 369 | const char* collectionString = "<event "; |
343 | int strLen = ::strlen(collectionString); | 370 | int strLen = ::strlen(collectionString); |
344 | int *find; | 371 | int *find; |
345 | while ( dt + 1 != 0 && (( point = ::strstr( dt+i, collectionString ) ) != 0 ) ) { | 372 | while ( ( point = ::strstrlen( dt+i, len -i, collectionString, strLen ) ) != 0 ) { |
346 | i = point -dt; | 373 | i = point -dt; |
347 | i+= strLen; | 374 | i+= strLen; |
348 | 375 | ||
349 | alarmTime = -1; | 376 | alarmTime = -1; |
350 | snd = 0; // silent | 377 | snd = 0; // silent |
351 | 378 | ||
352 | OEvent ev; | 379 | OEvent ev; |
353 | rec = 0; | 380 | rec = 0; |
354 | 381 | ||
355 | while ( TRUE ) { | 382 | while ( TRUE ) { |
356 | while ( i < len && (dt[i] == ' ' || dt[i] == '\n' || dt[i] == '\r') ) | 383 | while ( i < len && (dt[i] == ' ' || dt[i] == '\n' || dt[i] == '\r') ) |
357 | ++i; | 384 | ++i; |
358 | if ( i >= len-2 || (dt[i] == '/' && dt[i+1] == '>') ) | 385 | if ( i >= len-2 || (dt[i] == '/' && dt[i+1] == '>') ) |
359 | break; | 386 | break; |
360 | 387 | ||
361 | 388 | ||
362 | // we have another attribute, read it. | 389 | // we have another attribute, read it. |
363 | int j = i; | 390 | int j = i; |
364 | while ( j < len && dt[j] != '=' ) | 391 | while ( j < len && dt[j] != '=' ) |
365 | ++j; | 392 | ++j; |
366 | QCString attr( dt+i, j-i+1); | 393 | QCString attr( dt+i, j-i+1); |
367 | 394 | ||
368 | i = ++j; // skip = | 395 | i = ++j; // skip = |
369 | 396 | ||