summaryrefslogtreecommitdiff
path: root/libopie/pim
Unidiff
Diffstat (limited to 'libopie/pim') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie/pim/odatebookaccessbackend_xml.cpp7
-rw-r--r--libopie/pim/opimmainwindow.h2
-rw-r--r--libopie/pim/test/oevent_test.cpp4
3 files changed, 10 insertions, 3 deletions
diff --git a/libopie/pim/odatebookaccessbackend_xml.cpp b/libopie/pim/odatebookaccessbackend_xml.cpp
index 24b69fe..4a6b7b8 100644
--- a/libopie/pim/odatebookaccessbackend_xml.cpp
+++ b/libopie/pim/odatebookaccessbackend_xml.cpp
@@ -1,223 +1,225 @@
1#include <errno.h> 1#include <errno.h>
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
25namespace { 25namespace {
26 // FROM TT again 26 // FROM TT again
27char *strstrlen(const char *haystack, int hLen, const char* needle, int nLen) 27char *strstrlen(const char *haystack, int hLen, const char* needle, int nLen)
28{ 28{
29 char needleChar; 29 char needleChar;
30 char haystackChar; 30 char haystackChar;
31 if (!needle || !haystack || !hLen || !nLen) 31 if (!needle || !haystack || !hLen || !nLen)
32 return 0; 32 return 0;
33 33
34 const char* hsearch = haystack; 34 const char* hsearch = haystack;
35 35
36 if ((needleChar = *needle++) != 0) { 36 if ((needleChar = *needle++) != 0) {
37 nLen--; //(to make up for needle++) 37 nLen--; //(to make up for needle++)
38 do { 38 do {
39 do { 39 do {
40 if ((haystackChar = *hsearch++) == 0) 40 if ((haystackChar = *hsearch++) == 0)
41 return (0); 41 return (0);
42 if (hsearch >= haystack + hLen) 42 if (hsearch >= haystack + hLen)
43 return (0); 43 return (0);
44 } while (haystackChar != needleChar); 44 } while (haystackChar != needleChar);
45 } while (strncmp(hsearch, needle, QMIN(hLen - (hsearch - haystack), nLen)) != 0); 45 } while (strncmp(hsearch, needle, QMIN(hLen - (hsearch - haystack), nLen)) != 0);
46 hsearch--; 46 hsearch--;
47 } 47 }
48 return ((char *)hsearch); 48 return ((char *)hsearch);
49} 49}
50} 50}
51 51
52namespace { 52namespace {
53 time_t start, end, created, rp_end; 53 time_t start, end, created, rp_end;
54 ORecur* rec; 54 ORecur* rec;
55 ORecur* recur() { 55 ORecur* recur() {
56 if (!rec) 56 if (!rec)
57 rec = new ORecur; 57 rec = new ORecur;
58 58
59 return rec; 59 return rec;
60 } 60 }
61 int alarmTime; 61 int alarmTime;
62 int snd; 62 int snd;
63 enum Attribute{ 63 enum Attribute{
64 FDescription = 0, 64 FDescription = 0,
65 FLocation, 65 FLocation,
66 FCategories, 66 FCategories,
67 FUid, 67 FUid,
68 FType, 68 FType,
69 FAlarm, 69 FAlarm,
70 FSound, 70 FSound,
71 FRType, 71 FRType,
72 FRWeekdays, 72 FRWeekdays,
73 FRPosition, 73 FRPosition,
74 FRFreq, 74 FRFreq,
75 FRHasEndDate, 75 FRHasEndDate,
76 FREndDate, 76 FREndDate,
77 FRStart, 77 FRStart,
78 FREnd, 78 FREnd,
79 FNote, 79 FNote,
80 FCreated, 80 FCreated,
81 FTimeZone, 81 FTimeZone,
82 FRecParent, 82 FRecParent,
83 FRecChildren, 83 FRecChildren,
84 FExceptions 84 FExceptions
85 }; 85 };
86 inline void save( const OEvent& ev, QString& buf ) { 86 inline void save( const OEvent& ev, QString& buf ) {
87 qWarning("Saving %d %s", ev.uid(), ev.description().latin1() );
87 buf += " description=\"" + Qtopia::escapeString(ev.description() ) + "\""; 88 buf += " description=\"" + Qtopia::escapeString(ev.description() ) + "\"";
88 if (!ev.location().isEmpty() ) 89 if (!ev.location().isEmpty() )
89 buf += " location=\"" + Qtopia::escapeString(ev.location() ) + "\""; 90 buf += " location=\"" + Qtopia::escapeString(ev.location() ) + "\"";
90 91
91 buf += " categories=\""+ Qtopia::escapeString( Qtopia::Record::idsToString( ev.categories() ) ) + "\""; 92 buf += " categories=\""+ Qtopia::escapeString( Qtopia::Record::idsToString( ev.categories() ) ) + "\"";
92 buf += " uid=\"" + QString::number( ev.uid() ) + "\""; 93 buf += " uid=\"" + QString::number( ev.uid() ) + "\"";
93 94
94 if (ev.isAllDay() ) 95 if (ev.isAllDay() )
95 buf += " type=\"AllDay\""; 96 buf += " type=\"AllDay\"";
96 97
97 if (ev.hasNotifiers() ) { 98 if (ev.hasNotifiers() ) {
98 OPimAlarm alarm = ev.notifiers().alarms()[0]; // take only the first 99 OPimAlarm alarm = ev.notifiers().alarms()[0]; // take only the first
99 int minutes = alarm.dateTime().secsTo( ev.startDateTime() ) / 60; 100 int minutes = alarm.dateTime().secsTo( ev.startDateTime() ) / 60;
100 buf += " alarm=\"" + QString::number(minutes) + "\" sound=\""; 101 buf += " alarm=\"" + QString::number(minutes) + "\" sound=\"";
101 if ( alarm.sound() == OPimAlarm::Loud ) 102 if ( alarm.sound() == OPimAlarm::Loud )
102 buf += "loud"; 103 buf += "loud";
103 else 104 else
104 buf += "silent"; 105 buf += "silent";
105 buf += "\""; 106 buf += "\"";
106 } 107 }
107 if ( ev.hasRecurrence() ) { 108 if ( ev.hasRecurrence() ) {
108 buf += ev.recurrence().toString(); 109 buf += ev.recurrence().toString();
109 } 110 }
110 111
111 /* 112 /*
112 * fscking timezones :) well, we'll first convert 113 * fscking timezones :) well, we'll first convert
113 * the QDateTime to a QDateTime in UTC time 114 * the QDateTime to a QDateTime in UTC time
114 * and then we'll create a nice time_t 115 * and then we'll create a nice time_t
115 */ 116 */
116 OTimeZone zone( ev.timeZone().isEmpty() ? OTimeZone::current() : ev.timeZone() ); 117 OTimeZone zone( ev.timeZone().isEmpty() ? OTimeZone::current() : ev.timeZone() );
117 buf += " start=\"" + QString::number( zone.fromUTCDateTime( zone.toDateTime( ev.startDateTime(), OTimeZone::utc() ) ) ) + "\""; 118 buf += " start=\"" + QString::number( zone.fromUTCDateTime( zone.toDateTime( ev.startDateTime(), OTimeZone::utc() ) ) ) + "\"";
118 buf += " end=\"" + QString::number( zone.fromUTCDateTime( zone.toDateTime( ev.endDateTime() , OTimeZone::utc() ) ) ) + "\""; 119 buf += " end=\"" + QString::number( zone.fromUTCDateTime( zone.toDateTime( ev.endDateTime() , OTimeZone::utc() ) ) ) + "\"";
119 if (!ev.note().isEmpty() ) { 120 if (!ev.note().isEmpty() ) {
120 buf += " note=\"" + Qtopia::escapeString( ev.note() ) + "\""; 121 buf += " note=\"" + Qtopia::escapeString( ev.note() ) + "\"";
121 } 122 }
122 123
123 buf += " timezone=\""; 124 buf += " timezone=\"";
124 if ( ev.timeZone().isEmpty() ) 125 if ( ev.timeZone().isEmpty() )
125 buf += "None"; 126 buf += "None";
126 else 127 else
127 buf += ev.timeZone(); 128 buf += ev.timeZone();
129 buf += "\"";
128 130
129 if (ev.parent() != 0 ) { 131 if (ev.parent() != 0 ) {
130 buf += " recparent=\""+QString::number(ev.parent() )+"\""; 132 buf += " recparent=\""+QString::number(ev.parent() )+"\"";
131 } 133 }
132 134
133 if (ev.children().count() != 0 ) { 135 if (ev.children().count() != 0 ) {
134 QArray<int> children = ev.children(); 136 QArray<int> children = ev.children();
135 buf += " recchildren=\""; 137 buf += " recchildren=\"";
136 for ( uint i = 0; i < children.count(); i++ ) { 138 for ( uint i = 0; i < children.count(); i++ ) {
137 if ( i != 0 ) buf += " "; 139 if ( i != 0 ) buf += " ";
138 buf += QString::number( children[i] ); 140 buf += QString::number( children[i] );
139 } 141 }
140 buf+= "\""; 142 buf+= "\"";
141 } 143 }
142 144
143 // skip custom writing 145 // skip custom writing
144 } 146 }
145 147
146 inline bool forAll( const QMap<int, OEvent>& list, QFile& file ) { 148 inline bool forAll( const QMap<int, OEvent>& list, QFile& file ) {
147 QMap<int, OEvent>::ConstIterator it; 149 QMap<int, OEvent>::ConstIterator it;
148 QString buf; 150 QString buf;
149 QCString str; 151 QCString str;
150 int total_written; 152 int total_written;
151 for ( it = list.begin(); it != list.end(); ++it ) { 153 for ( it = list.begin(); it != list.end(); ++it ) {
152 buf = "<event"; 154 buf = "<event";
153 save( it.data(), buf ); 155 save( it.data(), buf );
154 buf += " />\n"; 156 buf += " />\n";
155 str = buf.utf8(); 157 str = buf.utf8();
156 158
157 total_written = file.writeBlock(str.data(), str.length() ); 159 total_written = file.writeBlock(str.data(), str.length() );
158 if ( total_written != int(str.length() ) ) 160 if ( total_written != int(str.length() ) )
159 return false; 161 return false;
160 } 162 }
161 return true; 163 return true;
162 } 164 }
163} 165}
164 166
165ODateBookAccessBackend_XML::ODateBookAccessBackend_XML( const QString& , 167ODateBookAccessBackend_XML::ODateBookAccessBackend_XML( const QString& ,
166 const QString& fileName ) 168 const QString& fileName )
167 : ODateBookAccessBackend() { 169 : ODateBookAccessBackend() {
168 m_name = fileName.isEmpty() ? Global::applicationFileName( "datebook", "datebook.xml" ) : fileName; 170 m_name = fileName.isEmpty() ? Global::applicationFileName( "datebook", "datebook.xml" ) : fileName;
169 m_changed = false; 171 m_changed = false;
170} 172}
171ODateBookAccessBackend_XML::~ODateBookAccessBackend_XML() { 173ODateBookAccessBackend_XML::~ODateBookAccessBackend_XML() {
172} 174}
173bool ODateBookAccessBackend_XML::load() { 175bool ODateBookAccessBackend_XML::load() {
174 return loadFile(); 176 return loadFile();
175} 177}
176bool ODateBookAccessBackend_XML::reload() { 178bool ODateBookAccessBackend_XML::reload() {
177 clear(); 179 clear();
178 return load(); 180 return load();
179} 181}
180bool ODateBookAccessBackend_XML::save() { 182bool ODateBookAccessBackend_XML::save() {
181 if (!m_changed) return true; 183 if (!m_changed) return true;
182 184
183 int total_written; 185 int total_written;
184 QString strFileNew = m_name + ".new"; 186 QString strFileNew = m_name + ".new";
185 187
186 QFile f( strFileNew ); 188 QFile f( strFileNew );
187 if (!f.open( IO_WriteOnly | IO_Raw ) ) return false; 189 if (!f.open( IO_WriteOnly | IO_Raw ) ) return false;
188 190
189 QString buf( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" ); 191 QString buf( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" );
190 buf += "<!DOCTYPE DATEBOOK><DATEBOOK>\n"; 192 buf += "<!DOCTYPE DATEBOOK><DATEBOOK>\n";
191 buf += "<events>\n"; 193 buf += "<events>\n";
192 QCString str = buf.utf8(); 194 QCString str = buf.utf8();
193 total_written = f.writeBlock( str.data(), str.length() ); 195 total_written = f.writeBlock( str.data(), str.length() );
194 if ( total_written != int(str.length() ) ) { 196 if ( total_written != int(str.length() ) ) {
195 f.close(); 197 f.close();
196 QFile::remove( strFileNew ); 198 QFile::remove( strFileNew );
197 return false; 199 return false;
198 } 200 }
199 201
200 if (!forAll( m_raw, f ) ) { 202 if (!forAll( m_raw, f ) ) {
201 f.close(); 203 f.close();
202 QFile::remove( strFileNew ); 204 QFile::remove( strFileNew );
203 return false; 205 return false;
204 } 206 }
205 if (!forAll( m_rep, f ) ) { 207 if (!forAll( m_rep, f ) ) {
206 f.close(); 208 f.close();
207 QFile::remove( strFileNew ); 209 QFile::remove( strFileNew );
208 return false; 210 return false;
209 } 211 }
210 212
211 buf = "</events>\n</DATEBOOK>\n"; 213 buf = "</events>\n</DATEBOOK>\n";
212 str = buf.utf8(); 214 str = buf.utf8();
213 total_written = f.writeBlock( str.data(), str.length() ); 215 total_written = f.writeBlock( str.data(), str.length() );
214 if ( total_written != int(str.length() ) ) { 216 if ( total_written != int(str.length() ) ) {
215 f.close(); 217 f.close();
216 QFile::remove( strFileNew ); 218 QFile::remove( strFileNew );
217 return false; 219 return false;
218 } 220 }
219 f.close(); 221 f.close();
220 222
221 if ( ::rename( strFileNew, m_name ) < 0 ) { 223 if ( ::rename( strFileNew, m_name ) < 0 ) {
222 QFile::remove( strFileNew ); 224 QFile::remove( strFileNew );
223 return false; 225 return false;
@@ -341,233 +343,236 @@ bool ODateBookAccessBackend_XML::loadFile() {
341 QAsciiDict<int> dict(FExceptions+1); 343 QAsciiDict<int> dict(FExceptions+1);
342 dict.setAutoDelete( true ); 344 dict.setAutoDelete( true );
343 dict.insert( "description", new int(FDescription) ); 345 dict.insert( "description", new int(FDescription) );
344 dict.insert( "location", new int(FLocation) ); 346 dict.insert( "location", new int(FLocation) );
345 dict.insert( "categories", new int(FCategories) ); 347 dict.insert( "categories", new int(FCategories) );
346 dict.insert( "uid", new int(FUid) ); 348 dict.insert( "uid", new int(FUid) );
347 dict.insert( "type", new int(FType) ); 349 dict.insert( "type", new int(FType) );
348 dict.insert( "alarm", new int(FAlarm) ); 350 dict.insert( "alarm", new int(FAlarm) );
349 dict.insert( "sound", new int(FSound) ); 351 dict.insert( "sound", new int(FSound) );
350 dict.insert( "rtype", new int(FRType) ); 352 dict.insert( "rtype", new int(FRType) );
351 dict.insert( "rweekdays", new int(FRWeekdays) ); 353 dict.insert( "rweekdays", new int(FRWeekdays) );
352 dict.insert( "rposition", new int(FRPosition) ); 354 dict.insert( "rposition", new int(FRPosition) );
353 dict.insert( "rfreq", new int(FRFreq) ); 355 dict.insert( "rfreq", new int(FRFreq) );
354 dict.insert( "rhasenddate", new int(FRHasEndDate) ); 356 dict.insert( "rhasenddate", new int(FRHasEndDate) );
355 dict.insert( "enddt", new int(FREndDate) ); 357 dict.insert( "enddt", new int(FREndDate) );
356 dict.insert( "start", new int(FRStart) ); 358 dict.insert( "start", new int(FRStart) );
357 dict.insert( "end", new int(FREnd) ); 359 dict.insert( "end", new int(FREnd) );
358 dict.insert( "note", new int(FNote) ); 360 dict.insert( "note", new int(FNote) );
359 dict.insert( "created", new int(FCreated) ); 361 dict.insert( "created", new int(FCreated) );
360 dict.insert( "recparent", new int(FRecParent) ); 362 dict.insert( "recparent", new int(FRecParent) );
361 dict.insert( "recchildren", new int(FRecChildren) ); 363 dict.insert( "recchildren", new int(FRecChildren) );
362 dict.insert( "exceptions", new int(FExceptions) ); 364 dict.insert( "exceptions", new int(FExceptions) );
363 dict.insert( "timezone", new int(FTimeZone) ); 365 dict.insert( "timezone", new int(FTimeZone) );
364 366
365 char* dt = (char*)map_addr; 367 char* dt = (char*)map_addr;
366 int len = attribute.st_size; 368 int len = attribute.st_size;
367 int i = 0; 369 int i = 0;
368 char* point; 370 char* point;
369 const char* collectionString = "<event "; 371 const char* collectionString = "<event ";
370 int strLen = ::strlen(collectionString); 372 int strLen = ::strlen(collectionString);
371 int *find; 373 int *find;
372 while ( ( point = ::strstrlen( dt+i, len -i, collectionString, strLen ) ) != 0 ) { 374 while ( ( point = ::strstrlen( dt+i, len -i, collectionString, strLen ) ) != 0 ) {
373 i = point -dt; 375 i = point -dt;
374 i+= strLen; 376 i+= strLen;
375 377
376 alarmTime = -1; 378 alarmTime = -1;
377 snd = 0; // silent 379 snd = 0; // silent
378 380
379 OEvent ev; 381 OEvent ev;
380 rec = 0; 382 rec = 0;
381 383
382 while ( TRUE ) { 384 while ( TRUE ) {
383 while ( i < len && (dt[i] == ' ' || dt[i] == '\n' || dt[i] == '\r') ) 385 while ( i < len && (dt[i] == ' ' || dt[i] == '\n' || dt[i] == '\r') )
384 ++i; 386 ++i;
385 if ( i >= len-2 || (dt[i] == '/' && dt[i+1] == '>') ) 387 if ( i >= len-2 || (dt[i] == '/' && dt[i+1] == '>') )
386 break; 388 break;
387 389
388 390
389 // we have another attribute, read it. 391 // we have another attribute, read it.
390 int j = i; 392 int j = i;
391 while ( j < len && dt[j] != '=' ) 393 while ( j < len && dt[j] != '=' )
392 ++j; 394 ++j;
393 QCString attr( dt+i, j-i+1); 395 QCString attr( dt+i, j-i+1);
394 396
395 i = ++j; // skip = 397 i = ++j; // skip =
396 398
397 // find the start of quotes 399 // find the start of quotes
398 while ( i < len && dt[i] != '"' ) 400 while ( i < len && dt[i] != '"' )
399 ++i; 401 ++i;
400 j = ++i; 402 j = ++i;
401 403
402 bool haveUtf = FALSE; 404 bool haveUtf = FALSE;
403 bool haveEnt = FALSE; 405 bool haveEnt = FALSE;
404 while ( j < len && dt[j] != '"' ) { 406 while ( j < len && dt[j] != '"' ) {
405 if ( ((unsigned char)dt[j]) > 0x7f ) 407 if ( ((unsigned char)dt[j]) > 0x7f )
406 haveUtf = TRUE; 408 haveUtf = TRUE;
407 if ( dt[j] == '&' ) 409 if ( dt[j] == '&' )
408 haveEnt = TRUE; 410 haveEnt = TRUE;
409 ++j; 411 ++j;
410 } 412 }
411 if ( i == j ) { 413 if ( i == j ) {
412 // empty value 414 // empty value
413 i = j + 1; 415 i = j + 1;
414 continue; 416 continue;
415 } 417 }
416 418
417 QCString value( dt+i, j-i+1 ); 419 QCString value( dt+i, j-i+1 );
418 i = j + 1; 420 i = j + 1;
419 421
420 QString str = (haveUtf ? QString::fromUtf8( value ) 422 QString str = (haveUtf ? QString::fromUtf8( value )
421 : QString::fromLatin1( value ) ); 423 : QString::fromLatin1( value ) );
422 if ( haveEnt ) 424 if ( haveEnt )
423 str = Qtopia::plainString( str ); 425 str = Qtopia::plainString( str );
424 426
425 /* 427 /*
426 * add key + value 428 * add key + value
427 */ 429 */
428 find = dict[attr.data()]; 430 find = dict[attr.data()];
429 if (!find) 431 if (!find)
430 ev.setCustomField( attr, value ); 432 ev.setCustomField( attr, value );
431 else { 433 else {
432 setField( ev, *find, value ); 434 setField( ev, *find, value );
433 } 435 }
434 } 436 }
435 /* time to finalize */ 437 /* time to finalize */
436 finalizeRecord( ev ); 438 finalizeRecord( ev );
437 add( ev );
438 delete rec; 439 delete rec;
439 } 440 }
440 ::munmap(map_addr, attribute.st_size ); 441 ::munmap(map_addr, attribute.st_size );
441 m_changed = false; // changed during add 442 m_changed = false; // changed during add
442 443
443 return true; 444 return true;
444} 445}
445void ODateBookAccessBackend_XML::finalizeRecord( OEvent& ev ) { 446void ODateBookAccessBackend_XML::finalizeRecord( OEvent& ev ) {
446 /* AllDay is alway in UTC */ 447 /* AllDay is alway in UTC */
447 if ( ev.isAllDay() ) { 448 if ( ev.isAllDay() ) {
448 OTimeZone utc = OTimeZone::utc(); 449 OTimeZone utc = OTimeZone::utc();
449 ev.setStartDateTime( utc.fromUTCDateTime( start ) ); 450 ev.setStartDateTime( utc.fromUTCDateTime( start ) );
450 ev.setEndDateTime ( utc.fromUTCDateTime( end ) ); 451 ev.setEndDateTime ( utc.fromUTCDateTime( end ) );
451 ev.setTimeZone( "UTC"); // make sure it is really utc 452 ev.setTimeZone( "UTC"); // make sure it is really utc
452 }else { 453 }else {
453 /* to current date time */ 454 /* to current date time */
455 qWarning(" Start is %d", start );
454 OTimeZone zone( ev.timeZone().isEmpty() ? OTimeZone::current() : ev.timeZone() ); 456 OTimeZone zone( ev.timeZone().isEmpty() ? OTimeZone::current() : ev.timeZone() );
455 QDateTime date = zone.toDateTime( start ); 457 QDateTime date = zone.toDateTime( start );
458 qWarning(" Start is %s", date.toString().latin1() );
456 ev.setStartDateTime( zone.toDateTime( date, OTimeZone::current() ) ); 459 ev.setStartDateTime( zone.toDateTime( date, OTimeZone::current() ) );
457 460
458 date = zone.toDateTime( end ); 461 date = zone.toDateTime( end );
459 ev.setEndDateTime ( zone.toDateTime( date, OTimeZone::current() ) ); 462 ev.setEndDateTime ( zone.toDateTime( date, OTimeZone::current() ) );
460 } 463 }
461 if ( rec && rec->doesRecur() ) { 464 if ( rec && rec->doesRecur() ) {
462 OTimeZone utc = OTimeZone::utc(); 465 OTimeZone utc = OTimeZone::utc();
463 ORecur recu( *rec ); // call copy c'tor; 466 ORecur recu( *rec ); // call copy c'tor;
464 recu.setEndDate ( utc.fromUTCDateTime( rp_end ).date() ); 467 recu.setEndDate ( utc.fromUTCDateTime( rp_end ).date() );
465 recu.setCreatedDateTime( utc.fromUTCDateTime( created ) ); 468 recu.setCreatedDateTime( utc.fromUTCDateTime( created ) );
466 recu.setStart( ev.startDateTime().date() ); 469 recu.setStart( ev.startDateTime().date() );
467 ev.setRecurrence( recu ); 470 ev.setRecurrence( recu );
468 } 471 }
469 472
470 if (alarmTime != -1 ) { 473 if (alarmTime != -1 ) {
471 QDateTime dt = ev.startDateTime().addSecs( -1*alarmTime*60 ); 474 QDateTime dt = ev.startDateTime().addSecs( -1*alarmTime*60 );
472 OPimAlarm al( snd , dt ); 475 OPimAlarm al( snd , dt );
473 ev.notifiers().add( al ); 476 ev.notifiers().add( al );
474 } 477 }
475 if ( m_raw.contains( ev.uid() ) || m_rep.contains( ev.uid() ) ) { 478 if ( m_raw.contains( ev.uid() ) || m_rep.contains( ev.uid() ) ) {
479 qWarning("already contains assign uid");
476 ev.setUid( 1 ); 480 ev.setUid( 1 );
477 } 481 }
482 qWarning("addind %d %s", ev.uid(), ev.description().latin1() );
478 if ( ev.hasRecurrence() ) 483 if ( ev.hasRecurrence() )
479 m_rep.insert( ev.uid(), ev ); 484 m_rep.insert( ev.uid(), ev );
480 else 485 else
481 m_raw.insert( ev.uid(), ev ); 486 m_raw.insert( ev.uid(), ev );
482 487
483} 488}
484void ODateBookAccessBackend_XML::setField( OEvent& e, int id, const QString& value) { 489void ODateBookAccessBackend_XML::setField( OEvent& e, int id, const QString& value) {
485// qWarning(" setting %s", value.latin1() ); 490// qWarning(" setting %s", value.latin1() );
486 switch( id ) { 491 switch( id ) {
487 case FDescription: 492 case FDescription:
488 e.setDescription( value ); 493 e.setDescription( value );
489 break; 494 break;
490 case FLocation: 495 case FLocation:
491 e.setLocation( value ); 496 e.setLocation( value );
492 break; 497 break;
493 case FCategories: 498 case FCategories:
494 e.setCategories( e.idsFromString( value ) ); 499 e.setCategories( e.idsFromString( value ) );
495 break; 500 break;
496 case FUid: 501 case FUid:
497 e.setUid( value.toInt() ); 502 e.setUid( value.toInt() );
498 break; 503 break;
499 case FType: 504 case FType:
500 if ( value == "AllDay" ) { 505 if ( value == "AllDay" ) {
501 e.setAllDay( true ); 506 e.setAllDay( true );
502 e.setTimeZone( "UTC" ); 507 e.setTimeZone( "UTC" );
503 } 508 }
504 break; 509 break;
505 case FAlarm: 510 case FAlarm:
506 alarmTime = value.toInt(); 511 alarmTime = value.toInt();
507 break; 512 break;
508 case FSound: 513 case FSound:
509 snd = value == "loud" ? OPimAlarm::Loud : OPimAlarm::Silent; 514 snd = value == "loud" ? OPimAlarm::Loud : OPimAlarm::Silent;
510 break; 515 break;
511 // recurrence stuff 516 // recurrence stuff
512 case FRType: 517 case FRType:
513 if ( value == "Daily" ) 518 if ( value == "Daily" )
514 recur()->setType( ORecur::Daily ); 519 recur()->setType( ORecur::Daily );
515 else if ( value == "Weekly" ) 520 else if ( value == "Weekly" )
516 recur()->setType( ORecur::Weekly); 521 recur()->setType( ORecur::Weekly);
517 else if ( value == "MonthlyDay" ) 522 else if ( value == "MonthlyDay" )
518 recur()->setType( ORecur::MonthlyDay ); 523 recur()->setType( ORecur::MonthlyDay );
519 else if ( value == "MonthlyDate" ) 524 else if ( value == "MonthlyDate" )
520 recur()->setType( ORecur::MonthlyDate ); 525 recur()->setType( ORecur::MonthlyDate );
521 else if ( value == "Yearly" ) 526 else if ( value == "Yearly" )
522 recur()->setType( ORecur::Yearly ); 527 recur()->setType( ORecur::Yearly );
523 else 528 else
524 recur()->setType( ORecur::NoRepeat ); 529 recur()->setType( ORecur::NoRepeat );
525 break; 530 break;
526 case FRWeekdays: 531 case FRWeekdays:
527 recur()->setDays( value.toInt() ); 532 recur()->setDays( value.toInt() );
528 break; 533 break;
529 case FRPosition: 534 case FRPosition:
530 recur()->setPosition( value.toInt() ); 535 recur()->setPosition( value.toInt() );
531 break; 536 break;
532 case FRFreq: 537 case FRFreq:
533 recur()->setFrequency( value.toInt() ); 538 recur()->setFrequency( value.toInt() );
534 break; 539 break;
535 case FRHasEndDate: 540 case FRHasEndDate:
536 recur()->setHasEndDate( value.toInt() ); 541 recur()->setHasEndDate( value.toInt() );
537 break; 542 break;
538 case FREndDate: { 543 case FREndDate: {
539 rp_end = (time_t) value.toLong(); 544 rp_end = (time_t) value.toLong();
540 break; 545 break;
541 } 546 }
542 case FRStart: { 547 case FRStart: {
543 start = (time_t) value.toLong(); 548 start = (time_t) value.toLong();
544 break; 549 break;
545 } 550 }
546 case FREnd: { 551 case FREnd: {
547 end = ( (time_t) value.toLong() ); 552 end = ( (time_t) value.toLong() );
548 break; 553 break;
549 } 554 }
550 case FNote: 555 case FNote:
551 e.setNote( value ); 556 e.setNote( value );
552 break; 557 break;
553 case FCreated: 558 case FCreated:
554 created = value.toInt(); 559 created = value.toInt();
555 break; 560 break;
556 case FRecParent: 561 case FRecParent:
557 e.setParent( value.toInt() ); 562 e.setParent( value.toInt() );
558 break; 563 break;
559 case FRecChildren:{ 564 case FRecChildren:{
560 QStringList list = QStringList::split(' ', value ); 565 QStringList list = QStringList::split(' ', value );
561 for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) { 566 for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) {
562 e.addChild( (*it).toInt() ); 567 e.addChild( (*it).toInt() );
563 } 568 }
564 } 569 }
565 break; 570 break;
566 case FExceptions:{ 571 case FExceptions:{
567 QStringList list = QStringList::split(' ', value ); 572 QStringList list = QStringList::split(' ', value );
568 for (QStringList::Iterator it = list.begin(); it != list.end(); ++it ) { 573 for (QStringList::Iterator it = list.begin(); it != list.end(); ++it ) {
569 QDate date( (*it).left(4).toInt(), (*it).mid(4, 2).toInt(), (*it).right(2).toInt() ); 574 QDate date( (*it).left(4).toInt(), (*it).mid(4, 2).toInt(), (*it).right(2).toInt() );
570 qWarning("adding exception %s", date.toString().latin1() ); 575 qWarning("adding exception %s", date.toString().latin1() );
571 recur()->exceptions().append( date ); 576 recur()->exceptions().append( date );
572 } 577 }
573 } 578 }
diff --git a/libopie/pim/opimmainwindow.h b/libopie/pim/opimmainwindow.h
index 34b8a71..dca3c82 100644
--- a/libopie/pim/opimmainwindow.h
+++ b/libopie/pim/opimmainwindow.h
@@ -1,89 +1,89 @@
1#ifndef OPIE_PIM_MAINWINDOW_H 1#ifndef OPIE_PIM_MAINWINDOW_H
2#define OPIE_PIM_MAINWINDOW_H 2#define OPIE_PIM_MAINWINDOW_H
3 3
4#include <qmainwindow.h> 4#include <qmainwindow.h>
5 5
6#include <opie/opimrecord.h> 6#include <opie/opimrecord.h>
7 7
8/** 8/**
9 * This is a common Opie PIM MainWindow 9 * This is a common Opie PIM MainWindow
10 * it takes care of the QCOP internals 10 * it takes care of the QCOP internals
11 * and implements some functions 11 * and implements some functions
12 * for the URL scripting schema 12 * for the URL scripting schema
13 */ 13 */
14/* 14/*
15 * due Qt and Templates with signal and slots 15 * due Qt and Templates with signal and slots
16 * do not work that good :( 16 * do not work that good :(
17 * (Ok how to moc a template ;) ) 17 * (Ok how to moc a template ;) )
18 * We will have the mainwindow which calls a struct which 18 * We will have the mainwindow which calls a struct which
19 * is normally reimplemented as a template ;) 19 * is normally reimplemented as a template ;)
20 */ 20 */
21 21
22class QCopChannel; 22class QCopChannel;
23class OPimMainWindow : public QMainWindow { 23class OPimMainWindow : public QMainWindow {
24 Q_OBJECT 24 Q_OBJECT
25public: 25public:
26 enum TransPort { BlueTooth=0, 26 enum TransPort { BlueTooth=0,
27 IrDa }; 27 IrDa };
28 28
29 OPimMainWindow( const QString& service, QWidget *parent = 0, const char* name = 0, 29 OPimMainWindow( const QString& service, QWidget *parent = 0, const char* name = 0,
30 WFlags f = WType_TopLevel); 30 WFlags f = WType_TopLevel);
31 virtual ~OPimMainWindow(); 31 virtual ~OPimMainWindow();
32 32
33 33
34protected slots: 34protected slots:
35 /* 35 /*
36 * called when a setDocument 36 * called when a setDocument
37 * couldn't be handled by this window 37 * couldn't be handled by this window
38 */ 38 */
39 virtual void doSetDocument( const QString& ); 39 virtual void doSetDocument( const QString& );
40 /* for syncing */ 40 /* for syncing */
41 virtual void flush() = 0; 41 virtual void flush() = 0;
42 virtual void reload() = 0; 42 virtual void reload() = 0;
43 43
44 /** create a new Records and return the uid */ 44 /** create a new Records and return the uid */
45 virtual int create() = 0; 45 virtual int create() = 0;
46 /** remove a record with UID == uid */ 46 /** remove a record with UID == uid */
47 virtual bool remove( int uid ) = 0; 47 virtual bool remove( int uid ) = 0;
48 /** beam the record with UID = uid */ 48 /** beam the record with UID = uid */
49 virtual void beam( int uid , int transport = IrDa) = 0; 49 virtual void beam( int uid ) = 0;
50 50
51 /** show the record with UID == uid */ 51 /** show the record with UID == uid */
52 virtual void show( int uid ) = 0; 52 virtual void show( int uid ) = 0;
53 /** edit the record */ 53 /** edit the record */
54 virtual void edit( int uid ) = 0; 54 virtual void edit( int uid ) = 0;
55 55
56 /** make a copy of it! */ 56 /** make a copy of it! */
57 virtual void add( const OPimRecord& ) = 0; 57 virtual void add( const OPimRecord& ) = 0;
58 58
59 59
60 QCopChannel* channel(); 60 QCopChannel* channel();
61 61
62private slots: 62private slots:
63 void appMessage( const QCString&, const QByteArray& ); 63 void appMessage( const QCString&, const QByteArray& );
64 void setDocument( const QString& ); 64 void setDocument( const QString& );
65 65
66 66
67private: 67private:
68 class Private; 68 class Private;
69 Private* d; 69 Private* d;
70 70
71 int m_rtti; 71 int m_rtti;
72 QCopChannel* m_channel; 72 QCopChannel* m_channel;
73 QString m_service; 73 QString m_service;
74 QCString m_str; 74 QCString m_str;
75 OPimRecord* m_fallBack; 75 OPimRecord* m_fallBack;
76 76
77 /* I would love to do this as a template 77 /* I would love to do this as a template
78 * but can't think of a right way 78 * but can't think of a right way
79 * because I need signal and slots -zecke 79 * because I need signal and slots -zecke
80 */ 80 */
81 /* 81 /*
82 * the only pointer in the whole PIM API :( 82 * the only pointer in the whole PIM API :(
83 */ 83 */
84 virtual OPimRecord* record( int rtti, const QByteArray& ) ; 84 virtual OPimRecord* record( int rtti, const QByteArray& ) ;
85 int service(); 85 int service();
86}; 86};
87 87
88 88
89#endif 89#endif
diff --git a/libopie/pim/test/oevent_test.cpp b/libopie/pim/test/oevent_test.cpp
index d83ee0b..9f16911 100644
--- a/libopie/pim/test/oevent_test.cpp
+++ b/libopie/pim/test/oevent_test.cpp
@@ -1,33 +1,35 @@
1#include <qdatetime.h> 1#include <qdatetime.h>
2 2
3#include "../oevent.h" 3#include "../oevent.h"
4#include "../odatebookaccess.h" 4#include "../odatebookaccess.h"
5 5
6int main(int argc, char* argv ) { 6int main(int argc, char* argv ) {
7 ODateBookAccess acc; 7 ODateBookAccess acc;
8 if(!acc.load() ) qWarning("could not load"); 8 if(!acc.load() ) qWarning("could not load");
9 9
10 ODateBookAccess::List::Iterator it; 10 ODateBookAccess::List::Iterator it;
11 ODateBookAccess::List list = acc.allRecords(); 11 ODateBookAccess::List list = acc.allRecords();
12 12
13 for( it = list.begin(); it != list.end(); ++it ){ 13 for( it = list.begin(); it != list.end(); ++it ){
14 OEvent ev = (*it); 14 OEvent ev = (*it);
15 qWarning("Summary: %s",ev.description().latin1() ); 15 qWarning("Summary: %s",ev.description().latin1() );
16 qWarning("Start: %s End: %s",ev.startDateTime().toString().latin1(), ev.endDateTime().toString().latin1() ); 16 qWarning("Start: %s End: %s",ev.startDateTime().toString().latin1(), ev.endDateTime().toString().latin1() );
17 qWarning("All Day: %d",ev.isAllDay() ); 17 qWarning("All Day: %d Recurrence: %d",ev.isAllDay(), ev.hasRecurrence() );
18 qWarning("UID %d", ev.uid() );
18 19
19 } 20 }
20 QDate date1(2003,02,01 ); 21 QDate date1(2003,02,01 );
21 QDate date2(2003,03,01 ); 22 QDate date2(2003,03,01 );
22 23
23 OEffectiveEvent::ValueList effList = acc.effectiveEvents( date1,date2 ); 24 OEffectiveEvent::ValueList effList = acc.effectiveEvents( date1,date2 );
24 OEffectiveEvent::ValueList::Iterator effIt; 25 OEffectiveEvent::ValueList::Iterator effIt;
25 26
26 for( effIt = effList.begin(); effIt != effList.end(); ++effIt ){ 27 for( effIt = effList.begin(); effIt != effList.end(); ++effIt ){
27 OEffectiveEvent ef = (*effIt); 28 OEffectiveEvent ef = (*effIt);
28 qWarning("Summary: %s", ef.description().latin1() ); 29 qWarning("Summary: %s", ef.description().latin1() );
29 qWarning("Date: %s", ef.date().toString().latin1() ); 30 qWarning("Date: %s", ef.date().toString().latin1() );
30 } 31 }
32 acc.save();
31 33
32 return 0; 34 return 0;
33} 35}