summaryrefslogtreecommitdiffabout
path: root/libkcal
authorzautrix <zautrix>2004-08-20 04:28:28 (UTC)
committer zautrix <zautrix>2004-08-20 04:28:28 (UTC)
commit93decd4185adc7197008e8397cf753a5ab674d99 (patch) (unidiff)
tree0d701d0a687c22cfe2894121f8540d60a5fbe7a9 /libkcal
parentf7a401f03c18ef96eb40dc5540b31cd10880e845 (diff)
downloadkdepimpi-93decd4185adc7197008e8397cf753a5ab674d99.zip
kdepimpi-93decd4185adc7197008e8397cf753a5ab674d99.tar.gz
kdepimpi-93decd4185adc7197008e8397cf753a5ab674d99.tar.bz2
Bugfixes for syncing
Diffstat (limited to 'libkcal') (more/less context) (ignore whitespace changes)
-rw-r--r--libkcal/phoneformat.cpp336
-rw-r--r--libkcal/sharpformat.cpp2
-rw-r--r--libkcal/vcalformat.cpp71
3 files changed, 323 insertions, 86 deletions
diff --git a/libkcal/phoneformat.cpp b/libkcal/phoneformat.cpp
index 6bbc0a3..6276498 100644
--- a/libkcal/phoneformat.cpp
+++ b/libkcal/phoneformat.cpp
@@ -102,1326 +102,1558 @@ public:
102 alarmDt = fromGSM ( dtp ); 102 alarmDt = fromGSM ( dtp );
103 break; 103 break;
104 case TODO_SILENT_ALARM_DATETIME: 104 case TODO_SILENT_ALARM_DATETIME:
105 dtp = &ToDo->Entries[j].Date ; 105 dtp = &ToDo->Entries[j].Date ;
106 alarm = true; 106 alarm = true;
107 alarmDt = fromGSM ( dtp ); 107 alarmDt = fromGSM ( dtp );
108 break; 108 break;
109 case TODO_TEXT: 109 case TODO_TEXT:
110 //qDebug(" text *%s* ", (const char*) DecodeUnicodeConsole(ToDo->Entries[j].Text )); 110 //qDebug(" text *%s* ", (const char*) DecodeUnicodeConsole(ToDo->Entries[j].Text ));
111 todo->setSummary( QString::fromUtf8 ( (const char*)DecodeUnicodeConsole(ToDo->Entries[j].Text ))); 111 todo->setSummary( QString::fromUtf8 ( (const char*)DecodeUnicodeConsole(ToDo->Entries[j].Text )));
112 break; 112 break;
113 case TODO_PRIVATE: 113 case TODO_PRIVATE:
114 if ( ToDo->Entries[j].Number == 1 ) 114 if ( ToDo->Entries[j].Number == 1 )
115 todo->setSecrecy( Incidence::SecrecyPrivate ); 115 todo->setSecrecy( Incidence::SecrecyPrivate );
116 else 116 else
117 todo->setSecrecy( Incidence::SecrecyPublic ); 117 todo->setSecrecy( Incidence::SecrecyPublic );
118 break; 118 break;
119 case TODO_CATEGORY: 119 case TODO_CATEGORY:
120 Category.Location = ToDo->Entries[j].Number; 120 Category.Location = ToDo->Entries[j].Number;
121 Category.Type = Category_ToDo; 121 Category.Type = Category_ToDo;
122 error=Phone->GetCategory(s, &Category); 122 error=Phone->GetCategory(s, &Category);
123 if (error == ERR_NONE) { 123 if (error == ERR_NONE) {
124 QStringList cat = todo->categories(); 124 QStringList cat = todo->categories();
125 QString nCat = QString ( (const char*)Category.Name ); 125 QString nCat = QString ( (const char*)Category.Name );
126 if ( !nCat.isEmpty() ) 126 if ( !nCat.isEmpty() )
127 if ( !cat.contains( nCat )) { 127 if ( !cat.contains( nCat )) {
128 cat << nCat; 128 cat << nCat;
129 todo->setCategories( cat ); 129 todo->setCategories( cat );
130 } 130 }
131 } 131 }
132 break; 132 break;
133 case TODO_CONTACTID: 133 case TODO_CONTACTID:
134#if 0 134#if 0
135 // not supported 135 // not supported
136 entry.Location = ToDo->Entries[j].Number; 136 entry.Location = ToDo->Entries[j].Number;
137 entry.MemoryType = MEM_ME; 137 entry.MemoryType = MEM_ME;
138 error=Phone->GetMemory(s, &entry); 138 error=Phone->GetMemory(s, &entry);
139 if (error == ERR_NONE) { 139 if (error == ERR_NONE) {
140 name = GSM_PhonebookGetEntryName(&entry); 140 name = GSM_PhonebookGetEntryName(&entry);
141 if (name != NULL) { 141 if (name != NULL) {
142 printmsg("Contact ID : \"%s\" (%d)\n", DecodeUnicodeConsole(name), ToDo->Entries[j].Number); 142 printmsg("Contact ID : \"%s\" (%d)\n", DecodeUnicodeConsole(name), ToDo->Entries[j].Number);
143 } else { 143 } else {
144 printmsg("Contact ID : %d\n",ToDo->Entries[j].Number); 144 printmsg("Contact ID : %d\n",ToDo->Entries[j].Number);
145 } 145 }
146 } else { 146 } else {
147 printmsg("Contact : %d\n",ToDo->Entries[j].Number); 147 printmsg("Contact : %d\n",ToDo->Entries[j].Number);
148 } 148 }
149#endif 149#endif
150 break; 150 break;
151 case TODO_PHONE: 151 case TODO_PHONE:
152#if 0 152#if 0
153 // not supported 153 // not supported
154 printmsg("Phone : \"%s\"\n",DecodeUnicodeConsole(ToDo->Entries[j].Text)); 154 printmsg("Phone : \"%s\"\n",DecodeUnicodeConsole(ToDo->Entries[j].Text));
155#endif 155#endif
156 break; 156 break;
157 } 157 }
158 } 158 }
159 QString alarmString = "na"; 159 QString alarmString = "na";
160 if ( alarm ) { 160 if ( alarm ) {
161 Alarm *alarm; 161 Alarm *alarm;
162 if ( todo->alarms().count() > 0 ) 162 if ( todo->alarms().count() > 0 )
163 alarm = todo->alarms().first(); 163 alarm = todo->alarms().first();
164 else { 164 else {
165 alarm = new Alarm( todo ); 165 alarm = new Alarm( todo );
166 todo->addAlarm( alarm ); 166 todo->addAlarm( alarm );
167 } 167 }
168 alarm->setType( Alarm::Audio ); 168 alarm->setType( Alarm::Audio );
169 alarm->setEnabled( true ); 169 alarm->setEnabled( true );
170 int alarmOffset = alarmDt.secsTo( todo->dtStart() ); 170 int alarmOffset = alarmDt.secsTo( todo->dtStart() );
171 alarm->setStartOffset( -alarmOffset ); 171 alarm->setStartOffset( -alarmOffset );
172 alarmString = QString::number( alarmOffset ); 172 alarmString = QString::number( alarmOffset );
173 } else { 173 } else {
174 Alarm *alarm; 174 Alarm *alarm;
175 if ( todo->alarms().count() > 0 ) { 175 if ( todo->alarms().count() > 0 ) {
176 alarm = todo->alarms().first(); 176 alarm = todo->alarms().first();
177 alarm->setType( Alarm::Audio ); 177 alarm->setType( Alarm::Audio );
178 alarm->setStartOffset( -60*15 ); 178 alarm->setStartOffset( -60*15 );
179 alarm->setEnabled( false ); 179 alarm->setEnabled( false );
180 } 180 }
181 } 181 }
182 // csum ***************************************** 182 // csum *****************************************
183 uint cSum; 183 uint cSum;
184 cSum = PhoneFormat::getCsumTodo( todo ); 184 cSum = PhoneFormat::getCsumTodo( todo );
185 todo->setCsum( mProfileName, QString::number( cSum )); 185 todo->setCsum( mProfileName, QString::number( cSum ));
186 todo->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL ); 186 todo->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL );
187 mCalendar->addTodo( todo); 187 mCalendar->addTodo( todo);
188 188
189 return true; 189 return true;
190 } 190 }
191 bool readEvent( Calendar *existingCalendar, GSM_CalendarEntry*Note) 191 bool readEvent( Calendar *existingCalendar, GSM_CalendarEntry*Note)
192 { 192 {
193 193
194 int id = Note->Location; 194 int id = Note->Location;
195 Event *event; 195 Event *event;
196 event = existingCalendar->event( mProfileName ,QString::number( id ) ); 196 event = existingCalendar->event( mProfileName ,QString::number( id ) );
197 if ( event ) 197 if ( event )
198 event = (Event*)event->clone(); 198 event = (Event*)event->clone();
199 else 199 else
200 event = new Event; 200 event = new Event;
201 event->setID( mProfileName,QString::number( id ) ); 201 event->setID( mProfileName,QString::number( id ) );
202 event->setTempSyncStat(SYNC_TEMPSTATE_NEW_EXTERNAL ); 202 event->setTempSyncStat(SYNC_TEMPSTATE_NEW_EXTERNAL );
203 203
204 204
205 int i = 0; 205 int i = 0;
206 bool repeating = false; 206 bool repeating = false;
207 int repeat_dayofweek = -1; 207 int repeat_dayofweek = -1;
208 int repeat_day = -1; 208 int repeat_day = -1;
209 int repeat_weekofmonth = -1; 209 int repeat_weekofmonth = -1;
210 int repeat_month = -1; 210 int repeat_month = -1;
211 int repeat_frequency = -1; 211 int repeat_frequency = -1;
212 int rec_type = -1; 212 int rec_type = -1;
213 GSM_DateTime repeat_startdate = {0,0,0,0,0,0,0}; 213 GSM_DateTime repeat_startdate = {0,0,0,0,0,0,0};
214 GSM_DateTime repeat_stopdate = {0,0,0,0,0,0,0}; 214 GSM_DateTime repeat_stopdate = {0,0,0,0,0,0,0};
215 GSM_DateTime* dtp; 215 GSM_DateTime* dtp;
216 bool alarm = false; 216 bool alarm = false;
217 QDateTime alarmDt; 217 QDateTime alarmDt;
218 repeat_startdate.Day= 0; 218 repeat_startdate.Day= 0;
219 repeat_stopdate.Day = 0; 219 repeat_stopdate.Day = 0;
220 for (i=0;i<Note->EntriesNum;i++) { 220 for (i=0;i<Note->EntriesNum;i++) {
221 221
222 //qDebug(" for ev"); 222 //qDebug(" for ev");
223 switch (Note->Entries[i].EntryType) { 223 switch (Note->Entries[i].EntryType) {
224 case CAL_START_DATETIME: 224 case CAL_START_DATETIME:
225 dtp = &Note->Entries[i].Date ; 225 dtp = &Note->Entries[i].Date ;
226 if ( dtp->Hour > 24 ) { 226 if ( dtp->Hour > 24 ) {
227 event->setFloats( true ); 227 event->setFloats( true );
228 event->setDtStart( QDateTime (datefromGSM ( dtp ), QTime(0,0,0 ))); 228 event->setDtStart( QDateTime (datefromGSM ( dtp ), QTime(0,0,0 )));
229 } else { 229 } else {
230 event->setDtStart (fromGSM ( dtp )); 230 event->setDtStart (fromGSM ( dtp ));
231 231
232 } 232 }
233 //Note->Entries[i].Date.Hour = 5; 233 //Note->Entries[i].Date.Hour = 5;
234 break; 234 break;
235 case CAL_END_DATETIME: 235 case CAL_END_DATETIME:
236 dtp = &Note->Entries[i].Date ; 236 dtp = &Note->Entries[i].Date ;
237 if ( dtp->Hour > 24 ) { 237 if ( dtp->Hour > 24 ) {
238 event->setFloats( true ); 238 event->setFloats( true );
239 event->setDtEnd( QDateTime (datefromGSM ( dtp ), QTime(0,0,0 ))); 239 event->setDtEnd( QDateTime (datefromGSM ( dtp ), QTime(0,0,0 )));
240 } else { 240 } else {
241 event->setDtEnd (fromGSM ( dtp )); 241 event->setDtEnd (fromGSM ( dtp ));
242 } 242 }
243 break; 243 break;
244 case CAL_ALARM_DATETIME: 244 case CAL_ALARM_DATETIME:
245 dtp = &Note->Entries[i].Date ; 245 dtp = &Note->Entries[i].Date ;
246 alarm = true; 246 alarm = true;
247 alarmDt = fromGSM ( dtp ); 247 alarmDt = fromGSM ( dtp );
248 break; 248 break;
249 case CAL_SILENT_ALARM_DATETIME: 249 case CAL_SILENT_ALARM_DATETIME:
250 dtp = &Note->Entries[i].Date ; 250 dtp = &Note->Entries[i].Date ;
251 alarm = true; 251 alarm = true;
252 alarmDt = fromGSM ( dtp ); 252 alarmDt = fromGSM ( dtp );
253 break; 253 break;
254 case CAL_RECURRANCE: 254 case CAL_RECURRANCE:
255 rec_type = Note->Entries[i].Number; 255 rec_type = Note->Entries[i].Number;
256 //printmsg("Repeat : %d day%s\n",Note->Entries[i].Number/24,((Note->Entries[i].Number/24)>1) ? "s":"" ); 256 //printmsg("Repeat : %d day%s\n",Note->Entries[i].Number/24,((Note->Entries[i].Number/24)>1) ? "s":"" );
257 break; 257 break;
258 case CAL_TEXT: 258 case CAL_TEXT:
259 //qDebug(" ev text %s", DecodeUnicodeConsole(Note->Entries[i].Text) ); 259 //qDebug(" ev text %s", DecodeUnicodeConsole(Note->Entries[i].Text) );
260 event->setSummary( QString::fromUtf8 ( (const char*)DecodeUnicodeConsole( Note->Entries[i].Text ))); 260 event->setSummary( QString::fromUtf8 ( (const char*)DecodeUnicodeConsole( Note->Entries[i].Text )));
261 break; 261 break;
262 case CAL_LOCATION: 262 case CAL_LOCATION:
263 event->setLocation(QString::fromUtf8 ((const char*) DecodeUnicodeConsole(Note->Entries[i].Text) )); 263 event->setLocation(QString::fromUtf8 ((const char*) DecodeUnicodeConsole(Note->Entries[i].Text) ));
264 break; 264 break;
265 case CAL_PHONE: 265 case CAL_PHONE:
266 //printmsg("Phone : \"%s\"\n",DecodeUnicodeConsole(Note->Entries[i].Text)); 266 //printmsg("Phone : \"%s\"\n",DecodeUnicodeConsole(Note->Entries[i].Text));
267 break; 267 break;
268 case CAL_PRIVATE: 268 case CAL_PRIVATE:
269 if ( Note->Entries[i].Number == 1 ) 269 if ( Note->Entries[i].Number == 1 )
270 event->setSecrecy( Incidence::SecrecyPrivate ); 270 event->setSecrecy( Incidence::SecrecyPrivate );
271 else 271 else
272 event->setSecrecy( Incidence::SecrecyPublic ); 272 event->setSecrecy( Incidence::SecrecyPublic );
273 273
274 break; 274 break;
275 case CAL_CONTACTID: 275 case CAL_CONTACTID:
276#if 0 276#if 0
277 entry.Location = Note->Entries[i].Number; 277 entry.Location = Note->Entries[i].Number;
278 entry.MemoryType = MEM_ME; 278 entry.MemoryType = MEM_ME;
279 error=Phone->GetMemory(&s, &entry); 279 error=Phone->GetMemory(&s, &entry);
280 if (error == ERR_NONE) { 280 if (error == ERR_NONE) {
281 name = GSM_PhonebookGetEntryName(&entry); 281 name = GSM_PhonebookGetEntryName(&entry);
282 if (name != NULL) { 282 if (name != NULL) {
283 //printmsg("Contact ID : \"%s\" (%d)\n", DecodeUnicodeConsole(name), Note->Entries[i].Number); 283 //printmsg("Contact ID : \"%s\" (%d)\n", DecodeUnicodeConsole(name), Note->Entries[i].Number);
284 } else { 284 } else {
285 //printmsg("Contact ID : %d\n",Note->Entries[i].Number); 285 //printmsg("Contact ID : %d\n",Note->Entries[i].Number);
286 } 286 }
287 } else { 287 } else {
288 //printmsg("Contact ID : %d\n",Note->Entries[i].Number); 288 //printmsg("Contact ID : %d\n",Note->Entries[i].Number);
289 } 289 }
290#endif 290#endif
291 break; 291 break;
292 case CAL_REPEAT_DAYOFWEEK: 292 case CAL_REPEAT_DAYOFWEEK:
293 repeat_dayofweek = Note->Entries[i].Number; 293 repeat_dayofweek = Note->Entries[i].Number;
294 repeating = true; 294 repeating = true;
295 break; 295 break;
296 case CAL_REPEAT_DAY: 296 case CAL_REPEAT_DAY:
297 repeat_day = Note->Entries[i].Number; 297 repeat_day = Note->Entries[i].Number;
298 repeating = true; 298 repeating = true;
299 break; 299 break;
300 case CAL_REPEAT_WEEKOFMONTH: 300 case CAL_REPEAT_WEEKOFMONTH:
301 repeat_weekofmonth = Note->Entries[i].Number; 301 repeat_weekofmonth = Note->Entries[i].Number;
302 repeating = true; 302 repeating = true;
303 break; 303 break;
304 case CAL_REPEAT_MONTH: 304 case CAL_REPEAT_MONTH:
305 repeat_month = Note->Entries[i].Number; 305 repeat_month = Note->Entries[i].Number;
306 repeating = true; 306 repeating = true;
307 break; 307 break;
308 case CAL_REPEAT_FREQUENCY: 308 case CAL_REPEAT_FREQUENCY:
309 repeat_frequency = Note->Entries[i].Number; 309 repeat_frequency = Note->Entries[i].Number;
310 repeating = true; 310 repeating = true;
311 break; 311 break;
312 case CAL_REPEAT_STARTDATE: 312 case CAL_REPEAT_STARTDATE:
313 repeat_startdate = Note->Entries[i].Date; 313 repeat_startdate = Note->Entries[i].Date;
314 repeating = true; 314 repeating = true;
315 break; 315 break;
316 case CAL_REPEAT_STOPDATE: 316 case CAL_REPEAT_STOPDATE:
317 repeat_stopdate = Note->Entries[i].Date; 317 repeat_stopdate = Note->Entries[i].Date;
318 repeating = true; 318 repeating = true;
319 break; 319 break;
320 } 320 }
321 } 321 }
322#if 0 322#if 0
323 event->setDescription( attList[4] ); 323 event->setDescription( attList[4] );
324 bool repeating = false; 324 bool repeating = false;
325 int repeat_dayofweek = -1; 325 int repeat_dayofweek = -1;
326 int repeat_day = -1; 326 int repeat_day = -1;
327 int repeat_weekofmonth = -1; 327 int repeat_weekofmonth = -1;
328 int repeat_month = -1; 328 int repeat_month = -1;
329 int repeat_frequency = -1; 329 int repeat_frequency = -1;
330 GSM_DateTime repeat_startdate = {0,0,0,0,0,0,0}; 330 GSM_DateTime repeat_startdate = {0,0,0,0,0,0,0};
331 GSM_DateTime repeat_stopdate = {0,0,0,0,0,0,0}; 331 GSM_DateTime repeat_stopdate = {0,0,0,0,0,0,0};
332 332
333#endif 333#endif
334 334
335 QString recurString = "no"; 335 QString recurString = "no";
336 if ( repeating && repeat_frequency != -1) { 336 if ( repeating && repeat_frequency != -1) {
337 recurString = "y"; 337 recurString = "y";
338 if ( repeat_dayofweek >= 0 ) 338 if ( repeat_dayofweek >= 0 )
339 recurString += "dow" + QString::number (repeat_dayofweek); 339 recurString += "dow" + QString::number (repeat_dayofweek);
340 if ( repeat_day >= 0 ) 340 if ( repeat_day >= 0 )
341 recurString += "d" + QString::number (repeat_day); 341 recurString += "d" + QString::number (repeat_day);
342 if ( repeat_weekofmonth >= 0 ) 342 if ( repeat_weekofmonth >= 0 )
343 recurString += "w" + QString::number (repeat_weekofmonth); 343 recurString += "w" + QString::number (repeat_weekofmonth);
344 if ( repeat_month >= 0 ) 344 if ( repeat_month >= 0 )
345 recurString += "m" + QString::number ( repeat_month ); 345 recurString += "m" + QString::number ( repeat_month );
346 if ( repeat_frequency >= 0 ) 346 if ( repeat_frequency >= 0 )
347 recurString += "f" + QString::number (repeat_frequency ); 347 recurString += "f" + QString::number (repeat_frequency );
348 348
349 int rtype = 0; 349 int rtype = 0;
350 // qDebug("recurs "); 350 // qDebug("recurs ");
351 QDate startDate, endDate; 351 QDate startDate, endDate;
352 if ( repeat_startdate.Day > 0 ) { 352 if ( repeat_startdate.Day > 0 ) {
353 startDate = datefromGSM ( &repeat_startdate ); 353 startDate = datefromGSM ( &repeat_startdate );
354 event->setDtStart(QDateTime ( startDate, event->dtStart().time())); 354 event->setDtStart(QDateTime ( startDate, event->dtStart().time()));
355 } else { 355 } else {
356 startDate = event->dtStart().date(); 356 startDate = event->dtStart().date();
357 } 357 }
358 int freq = repeat_frequency; 358 int freq = repeat_frequency;
359 bool hasEndDate = false; 359 bool hasEndDate = false;
360 if ( repeat_stopdate.Day > 0 ) { 360 if ( repeat_stopdate.Day > 0 ) {
361 endDate = datefromGSM ( &repeat_stopdate ); 361 endDate = datefromGSM ( &repeat_stopdate );
362 hasEndDate = true; 362 hasEndDate = true;
363 } 363 }
364 364
365 uint weekDaysNum = repeat_dayofweek ; 365 uint weekDaysNum = repeat_dayofweek ;
366 // 1 == monday, 7 == sunday 366 // 1 == monday, 7 == sunday
367 QBitArray weekDays( 7 ); 367 QBitArray weekDays( 7 );
368 int i; 368 int i;
369 int bb = 1; 369 int bb = 1;
370 for( i = 1; i <= 7; ++i ) { 370 for( i = 1; i <= 7; ++i ) {
371 weekDays.setBit( i - 1, ( bb & weekDaysNum )); 371 weekDays.setBit( i - 1, ( bb & weekDaysNum ));
372 bb = 2 << (i-1); 372 bb = 2 << (i-1);
373 //qDebug(" %d bit %d ",i-1,weekDays.at(i-1) ); 373 //qDebug(" %d bit %d ",i-1,weekDays.at(i-1) );
374 } 374 }
375 // qDebug("next "); 375 // qDebug("next ");
376 int pos = 0; 376 int pos = 0;
377 Recurrence *r = event->recurrence(); 377 Recurrence *r = event->recurrence();
378 /* 378 /*
379 0 daily; 379 0 daily;
380 1 weekly;x 380 1 weekly;x
381 2 monthpos;x 381 2 monthpos;x
382 3 monthlyday; 382 3 monthlyday;
383 4 rYearlyMont 383 4 rYearlyMont
384 bool repeating = false; 384 bool repeating = false;
385 int repeat_dayofweek = -1; 385 int repeat_dayofweek = -1;
386 int repeat_day = -1; 386 int repeat_day = -1;
387 int repeat_weekofmonth = -1; 387 int repeat_weekofmonth = -1;
388 int repeat_month = -1; 388 int repeat_month = -1;
389 int repeat_frequency = -1; 389 int repeat_frequency = -1;
390 */ 390 */
391 int dayOfWeek = startDate.dayOfWeek(); 391 int dayOfWeek = startDate.dayOfWeek();
392 if ( repeat_weekofmonth >= 0 ) { 392 if ( repeat_weekofmonth >= 0 ) {
393 rtype = 2; // ************************ 2 MonthlyPos 393 rtype = 2; // ************************ 2 MonthlyPos
394 pos = repeat_weekofmonth; 394 pos = repeat_weekofmonth;
395 if ( repeat_dayofweek >= 0 ) 395 if ( repeat_dayofweek >= 0 )
396 dayOfWeek = repeat_dayofweek; 396 dayOfWeek = repeat_dayofweek;
397 if (repeat_month > 0) { 397 if (repeat_month > 0) {
398 if ( repeat_month != event->dtStart().date().month() ) { 398 if ( repeat_month != event->dtStart().date().month() ) {
399 QDate date (event->dtStart().date().year(),repeat_month,event->dtStart().date().day() ); 399 QDate date (event->dtStart().date().year(),repeat_month,event->dtStart().date().day() );
400 event->setDtStart(QDateTime ( date , event->dtStart().time()) ); 400 event->setDtStart(QDateTime ( date , event->dtStart().time()) );
401 } 401 }
402 if ( freq == 1 ) 402 if ( freq == 1 )
403 freq = 12; 403 freq = 12;
404 } 404 }
405 } else if ( repeat_dayofweek >= 0 ) { 405 } else if ( repeat_dayofweek >= 0 ) {
406 rtype = 1;// ************************ 1 Weekly 406 rtype = 1;// ************************ 1 Weekly
407 } else if ( repeat_day >= 0 ) { 407 } else if ( repeat_day >= 0 ) {
408 if ( repeat_month > 0) { 408 if ( repeat_month > 0) {
409 rtype = 4; 409 rtype = 4;
410 } else { 410 } else {
411 rtype = 3; 411 rtype = 3;
412 } 412 }
413 } else { 413 } else {
414 rtype = 0 ; 414 rtype = 0 ;
415 } 415 }
416 416
417 if ( rtype == 0 ) { 417 if ( rtype == 0 ) {
418 if ( hasEndDate ) r->setDaily( freq, endDate ); 418 if ( hasEndDate ) r->setDaily( freq, endDate );
419 else r->setDaily( freq, -1 ); 419 else r->setDaily( freq, -1 );
420 } else if ( rtype == 1 ) { 420 } else if ( rtype == 1 ) {
421 if ( hasEndDate ) r->setWeekly( freq, weekDays, endDate ); 421 if ( hasEndDate ) r->setWeekly( freq, weekDays, endDate );
422 else r->setWeekly( freq, weekDays, -1 ); 422 else r->setWeekly( freq, weekDays, -1 );
423 } else if ( rtype == 3 ) { 423 } else if ( rtype == 3 ) {
424 if ( hasEndDate ) 424 if ( hasEndDate )
425 r->setMonthly( Recurrence::rMonthlyDay, freq, endDate ); 425 r->setMonthly( Recurrence::rMonthlyDay, freq, endDate );
426 else 426 else
427 r->setMonthly( Recurrence::rMonthlyDay, freq, -1 ); 427 r->setMonthly( Recurrence::rMonthlyDay, freq, -1 );
428 r->addMonthlyDay( startDate.day() ); 428 r->addMonthlyDay( startDate.day() );
429 } else if ( rtype == 2 ) { 429 } else if ( rtype == 2 ) {
430 if ( hasEndDate ) 430 if ( hasEndDate )
431 r->setMonthly( Recurrence::rMonthlyPos, freq, endDate ); 431 r->setMonthly( Recurrence::rMonthlyPos, freq, endDate );
432 else 432 else
433 r->setMonthly( Recurrence::rMonthlyPos, freq, -1 ); 433 r->setMonthly( Recurrence::rMonthlyPos, freq, -1 );
434 QBitArray days( 7 ); 434 QBitArray days( 7 );
435 days.fill( false ); 435 days.fill( false );
436 days.setBit( dayOfWeek - 1 ); 436 days.setBit( dayOfWeek - 1 );
437 r->addMonthlyPos( pos, days ); 437 r->addMonthlyPos( pos, days );
438 } else if ( rtype == 4 ) { 438 } else if ( rtype == 4 ) {
439 if ( hasEndDate ) 439 if ( hasEndDate )
440 r->setYearly( Recurrence::rYearlyMonth, freq, endDate ); 440 r->setYearly( Recurrence::rYearlyMonth, freq, endDate );
441 else 441 else
442 r->setYearly( Recurrence::rYearlyMonth, freq, -1 ); 442 r->setYearly( Recurrence::rYearlyMonth, freq, -1 );
443 r->addYearlyNum( startDate.month() ); 443 r->addYearlyNum( startDate.month() );
444 } 444 }
445 } else { 445 } else {
446 event->recurrence()->unsetRecurs(); 446 event->recurrence()->unsetRecurs();
447 } 447 }
448 448
449 QStringList categoryList; 449 QStringList categoryList;
450 categoryList << getCategory( Note ); 450 categoryList << getCategory( Note );
451 event->setCategories( categoryList ); 451 event->setCategories( categoryList );
452 // strange 0 semms to mean: alarm enabled 452 // strange 0 semms to mean: alarm enabled
453 if ( alarm ) { 453 if ( alarm ) {
454 Alarm *alarm; 454 Alarm *alarm;
455 if ( event->alarms().count() > 0 ) 455 if ( event->alarms().count() > 0 )
456 alarm = event->alarms().first(); 456 alarm = event->alarms().first();
457 else { 457 else {
458 alarm = new Alarm( event ); 458 alarm = new Alarm( event );
459 event->addAlarm( alarm ); 459 event->addAlarm( alarm );
460 } 460 }
461 alarm->setType( Alarm::Audio ); 461 alarm->setType( Alarm::Audio );
462 alarm->setEnabled( true ); 462 alarm->setEnabled( true );
463 int alarmOffset = alarmDt.secsTo( event->dtStart() ); 463 int alarmOffset = alarmDt.secsTo( event->dtStart() );
464 alarm->setStartOffset( -alarmOffset ); 464 alarm->setStartOffset( -alarmOffset );
465 } else { 465 } else {
466 Alarm *alarm; 466 Alarm *alarm;
467 if ( event->alarms().count() > 0 ) { 467 if ( event->alarms().count() > 0 ) {
468 alarm = event->alarms().first(); 468 alarm = event->alarms().first();
469 alarm->setType( Alarm::Audio ); 469 alarm->setType( Alarm::Audio );
470 alarm->setStartOffset( -60*15 ); 470 alarm->setStartOffset( -60*15 );
471 alarm->setEnabled( false ); 471 alarm->setEnabled( false );
472 } 472 }
473 } 473 }
474 // csum ***************************************** 474 // csum *****************************************
475 475
476 uint cSum; 476 uint cSum;
477 cSum = PhoneFormat::getCsumEvent( event ); 477 cSum = PhoneFormat::getCsumEvent( event );
478 event->setCsum( mProfileName, QString::number( cSum )); 478 event->setCsum( mProfileName, QString::number( cSum ));
479 event->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL ); 479 event->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL );
480 mCalendar->addEvent( event); 480 mCalendar->addEvent( event);
481 481
482 return true; 482 return true;
483 } 483 }
484 484
485 485
486 QDateTime fromGSM ( GSM_DateTime*dtp, bool useTz = true ) { 486 QDateTime fromGSM ( GSM_DateTime*dtp, bool useTz = false ) {
487 QDateTime dt; 487 QDateTime dt;
488 int y,m,t,h,min,sec; 488 int y,m,t,h,min,sec;
489 y = dtp->Year; 489 y = dtp->Year;
490 m = dtp->Month; 490 m = dtp->Month;
491 t = dtp->Day; 491 t = dtp->Day;
492 h = dtp->Hour; 492 h = dtp->Hour;
493 min = dtp->Minute; 493 min = dtp->Minute;
494 sec = dtp->Second; 494 sec = dtp->Second;
495 dt = QDateTime(QDate(y,m,t), QTime(h,min,sec)); 495 dt = QDateTime(QDate(y,m,t), QTime(h,min,sec));
496 // dtp->Timezone: offset in hours 496 // dtp->Timezone: offset in hours
497 int offset = KGlobal::locale()->localTimeOffset( dt ); 497 int offset = KGlobal::locale()->localTimeOffset( dt );
498 if ( useTz ) 498 if ( useTz )
499 dt = dt.addSecs ( offset*60); 499 dt = dt.addSecs ( offset*60);
500 return dt; 500 return dt;
501 501
502 } 502 }
503 503
504 static QString dtToString( const QDateTime& dti, bool useTZ = false ) 504 static QString dtToString( const QDateTime& dti, bool useTZ = false )
505 { 505 {
506 QString datestr; 506 QString datestr;
507 QString timestr; 507 QString timestr;
508 int offset = KGlobal::locale()->localTimeOffset( dti ); 508 int offset = KGlobal::locale()->localTimeOffset( dti );
509 QDateTime dt; 509 QDateTime dt;
510 if (useTZ) 510 if (useTZ)
511 dt = dti.addSecs ( -(offset*60)); 511 dt = dti.addSecs ( -(offset*60));
512 else 512 else
513 dt = dti; 513 dt = dti;
514 if(dt.date().isValid()){ 514 if(dt.date().isValid()){
515 const QDate& date = dt.date(); 515 const QDate& date = dt.date();
516 datestr.sprintf("%04d%02d%02d", 516 datestr.sprintf("%04d%02d%02d",
517 date.year(), date.month(), date.day()); 517 date.year(), date.month(), date.day());
518 } 518 }
519 if(dt.time().isValid()){ 519 if(dt.time().isValid()){
520 const QTime& time = dt.time(); 520 const QTime& time = dt.time();
521 timestr.sprintf("T%02d%02d%02d", 521 timestr.sprintf("T%02d%02d%02d",
522 time.hour(), time.minute(), time.second()); 522 time.hour(), time.minute(), time.second());
523 } 523 }
524 return datestr + timestr; 524 return datestr + timestr;
525 } 525 }
526 QDate datefromGSM ( GSM_DateTime*dtp ) { 526 QDate datefromGSM ( GSM_DateTime*dtp ) {
527 return QDate ( dtp->Year, dtp->Month, dtp->Day ); 527 return QDate ( dtp->Year, dtp->Month, dtp->Day );
528 } 528 }
529 QString getCategory( GSM_CalendarEntry*Note) 529 QString getCategory( GSM_CalendarEntry*Note)
530 { 530 {
531 QString CATEGORY; 531 QString CATEGORY;
532 switch (Note->Type) { 532 switch (Note->Type) {
533 case GSM_CAL_REMINDER : CATEGORY = QString("Reminder"); break; 533 case GSM_CAL_REMINDER : CATEGORY = QString("Reminder"); break;
534 case GSM_CAL_CALL : CATEGORY = QString("Call"); break; 534 case GSM_CAL_CALL : CATEGORY = QString("Call"); break;
535 case GSM_CAL_MEETING : CATEGORY = QString("Meeting"); break; 535 case GSM_CAL_MEETING : CATEGORY = QString("Meeting"); break;
536 case GSM_CAL_BIRTHDAY : CATEGORY = QString("Birthday"); break; 536 case GSM_CAL_BIRTHDAY : CATEGORY = QString("Birthday"); break;
537 case GSM_CAL_MEMO : CATEGORY = QString("Memo"); break; 537 case GSM_CAL_MEMO : CATEGORY = QString("Memo"); break;
538 case GSM_CAL_TRAVEL : CATEGORY = QString("Travel"); break; 538 case GSM_CAL_TRAVEL : CATEGORY = QString("Travel"); break;
539 case GSM_CAL_VACATION : CATEGORY = QString("Vacation"); break; 539 case GSM_CAL_VACATION : CATEGORY = QString("Vacation"); break;
540 case GSM_CAL_ALARM : CATEGORY = QString("Alarm"); break; 540 case GSM_CAL_ALARM : CATEGORY = QString("Alarm"); break;
541 case GSM_CAL_DAILY_ALARM : CATEGORY = QString("Daily alarm"); break; 541 case GSM_CAL_DAILY_ALARM : CATEGORY = QString("Daily alarm"); break;
542 case GSM_CAL_T_ATHL : CATEGORY = QString("Training/Athletism"); break; 542 case GSM_CAL_T_ATHL : CATEGORY = QString("Training/Athletism"); break;
543 case GSM_CAL_T_BALL : CATEGORY = QString("Training/Ball Games"); break; 543 case GSM_CAL_T_BALL : CATEGORY = QString("Training/Ball Games"); break;
544 case GSM_CAL_T_CYCL : CATEGORY = QString("Training/Cycling"); break; 544 case GSM_CAL_T_CYCL : CATEGORY = QString("Training/Cycling"); break;
545 case GSM_CAL_T_BUDO : CATEGORY = QString("Training/Budo"); break; 545 case GSM_CAL_T_BUDO : CATEGORY = QString("Training/Budo"); break;
546 case GSM_CAL_T_DANC : CATEGORY = QString("Training/Dance"); break; 546 case GSM_CAL_T_DANC : CATEGORY = QString("Training/Dance"); break;
547 case GSM_CAL_T_EXTR : CATEGORY = QString("Training/Extreme Sports"); break; 547 case GSM_CAL_T_EXTR : CATEGORY = QString("Training/Extreme Sports"); break;
548 case GSM_CAL_T_FOOT : CATEGORY = QString("Training/Football"); break; 548 case GSM_CAL_T_FOOT : CATEGORY = QString("Training/Football"); break;
549 case GSM_CAL_T_GOLF : CATEGORY = QString("Training/Golf"); break; 549 case GSM_CAL_T_GOLF : CATEGORY = QString("Training/Golf"); break;
550 case GSM_CAL_T_GYM : CATEGORY = QString("Training/Gym"); break; 550 case GSM_CAL_T_GYM : CATEGORY = QString("Training/Gym"); break;
551 case GSM_CAL_T_HORS : CATEGORY = QString("Training/Horse Races"); break; 551 case GSM_CAL_T_HORS : CATEGORY = QString("Training/Horse Races"); break;
552 case GSM_CAL_T_HOCK : CATEGORY = QString("Training/Hockey"); break; 552 case GSM_CAL_T_HOCK : CATEGORY = QString("Training/Hockey"); break;
553 case GSM_CAL_T_RACE : CATEGORY = QString("Training/Races"); break; 553 case GSM_CAL_T_RACE : CATEGORY = QString("Training/Races"); break;
554 case GSM_CAL_T_RUGB : CATEGORY = QString("Training/Rugby"); break; 554 case GSM_CAL_T_RUGB : CATEGORY = QString("Training/Rugby"); break;
555 case GSM_CAL_T_SAIL : CATEGORY = QString("Training/Sailing"); break; 555 case GSM_CAL_T_SAIL : CATEGORY = QString("Training/Sailing"); break;
556 case GSM_CAL_T_STRE : CATEGORY = QString("Training/Street Games"); break; 556 case GSM_CAL_T_STRE : CATEGORY = QString("Training/Street Games"); break;
557 case GSM_CAL_T_SWIM : CATEGORY = QString("Training/Swimming"); break; 557 case GSM_CAL_T_SWIM : CATEGORY = QString("Training/Swimming"); break;
558 case GSM_CAL_T_TENN : CATEGORY = QString("Training/Tennis"); break; 558 case GSM_CAL_T_TENN : CATEGORY = QString("Training/Tennis"); break;
559 case GSM_CAL_T_TRAV : CATEGORY = QString("Training/Travels"); break; 559 case GSM_CAL_T_TRAV : CATEGORY = QString("Training/Travels"); break;
560 case GSM_CAL_T_WINT : CATEGORY = QString("Training/Winter Games"); break; 560 case GSM_CAL_T_WINT : CATEGORY = QString("Training/Winter Games"); break;
561 default : CATEGORY = QString(""); 561 default : CATEGORY = QString("");
562 } 562 }
563 563
564 return CATEGORY; 564 return CATEGORY;
565 } 565 }
566 566
567protected: 567protected:
568private: 568private:
569 Calendar *mCalendar; 569 Calendar *mCalendar;
570 QString mProfileName ; 570 QString mProfileName ;
571}; 571};
572 572
573 573
574PhoneFormat::PhoneFormat(QString profileName, QString device,QString connection, QString model ) 574PhoneFormat::PhoneFormat(QString profileName, QString device,QString connection, QString model )
575{ 575{
576 mProfileName = profileName; 576 mProfileName = profileName;
577 mDevice = device; 577 mDevice = device;
578 mConnection = connection; 578 mConnection = connection;
579 mModel = model; 579 mModel = model;
580} 580}
581 581
582PhoneFormat::~PhoneFormat() 582PhoneFormat::~PhoneFormat()
583{ 583{
584} 584}
585int PhoneFormat::initDevice(GSM_StateMachine *s) 585int PhoneFormat::initDevice(GSM_StateMachine *s)
586{ 586{
587 GSM_ReadConfig(NULL, &s->Config[0], 0); 587 GSM_ReadConfig(NULL, &s->Config[0], 0);
588 s->ConfigNum = 1; 588 s->ConfigNum = 1;
589 GSM_Config *cfg = &s->Config[0]; 589 GSM_Config *cfg = &s->Config[0];
590 if ( ! mConnection.isEmpty() ) { 590 if ( ! mConnection.isEmpty() ) {
591 cfg->Connection = strdup(mConnection.latin1()); 591 cfg->Connection = strdup(mConnection.latin1());
592 cfg->DefaultConnection = false; 592 cfg->DefaultConnection = false;
593 qDebug("Connection set %s ", cfg->Connection ); 593 qDebug("Connection set %s ", cfg->Connection );
594 594
595 } 595 }
596 if ( ! mDevice.isEmpty() ) { 596 if ( ! mDevice.isEmpty() ) {
597 cfg->Device = strdup(mDevice.latin1()); 597 cfg->Device = strdup(mDevice.latin1());
598 cfg->DefaultDevice = false; 598 cfg->DefaultDevice = false;
599 qDebug("Device set %s ", cfg->Device); 599 qDebug("Device set %s ", cfg->Device);
600 600
601 } 601 }
602 if ( ! mModel.isEmpty() ) { 602 if ( ! mModel.isEmpty() ) {
603 strcpy(cfg->Model,mModel.latin1() ); 603 strcpy(cfg->Model,mModel.latin1() );
604 cfg->DefaultModel = false; 604 cfg->DefaultModel = false;
605 qDebug("Model set %s ",cfg->Model ); 605 qDebug("Model set %s ",cfg->Model );
606 } 606 }
607 int error=GSM_InitConnection(s,3); 607 int error=GSM_InitConnection(s,3);
608 return error; 608 return error;
609} 609}
610ulong PhoneFormat::getCsumTodo( Todo* todo ) 610ulong PhoneFormat::getCsumTodo( Todo* todo )
611{ 611{
612 QStringList attList; 612 QStringList attList;
613 if ( todo->hasDueDate() ) 613 if ( todo->hasDueDate() )
614 attList << PhoneParser::dtToString ( todo->dtDue() ); 614 attList << PhoneParser::dtToString ( todo->dtDue() );
615 attList << todo->summary(); 615 attList << todo->summary();
616 QString completedString = "no"; 616 QString completedString = "no";
617 if ( todo->isCompleted() ) 617 if ( todo->isCompleted() )
618 completedString = "yes"; 618 completedString = "yes";
619 attList << completedString; 619 attList << completedString;
620 attList << QString::number( todo->priority() ); 620 attList << QString::number( todo->priority() );
621 QString alarmString = "na"; 621 QString alarmString = "na";
622 Alarm *alarm; 622 Alarm *alarm;
623 if ( todo->alarms().count() > 0 ) { 623 if ( todo->alarms().count() > 0 ) {
624 alarm = todo->alarms().first(); 624 alarm = todo->alarms().first();
625 if ( alarm->enabled() ) { 625 if ( alarm->enabled() ) {
626 alarmString = QString::number(alarm->startOffset().asSeconds() ); 626 alarmString = QString::number(alarm->startOffset().asSeconds() );
627 } 627 }
628 } 628 }
629 attList << alarmString; 629 attList << alarmString;
630 attList << todo->categoriesStr(); 630 attList << todo->categoriesStr();
631 attList << todo->secrecyStr(); 631 attList << todo->secrecyStr();
632 return PhoneFormat::getCsum(attList ); 632 return PhoneFormat::getCsum(attList );
633 633
634} 634}
635ulong PhoneFormat::getCsumEvent( Event* event ) 635ulong PhoneFormat::getCsumEvent( Event* event )
636{ 636{
637 QStringList attList; 637 QStringList attList;
638 attList << PhoneParser::dtToString ( event->dtStart() ); 638 attList << PhoneParser::dtToString ( event->dtStart() );
639 attList << PhoneParser::dtToString ( event->dtEnd() ); 639 attList << PhoneParser::dtToString ( event->dtEnd() );
640 attList << event->summary(); 640 attList << event->summary();
641 attList << event->location(); 641 attList << event->location();
642 QString alarmString = "na"; 642 QString alarmString = "na";
643 Alarm *alarm; 643 Alarm *alarm;
644 if ( event->alarms().count() > 0 ) { 644 if ( event->alarms().count() > 0 ) {
645 alarm = event->alarms().first(); 645 alarm = event->alarms().first();
646 if ( alarm->enabled() ) { 646 if ( alarm->enabled() ) {
647 alarmString = QString::number( alarm->startOffset().asSeconds() ); 647 alarmString = QString::number( alarm->startOffset().asSeconds() );
648 } 648 }
649 } 649 }
650 attList << alarmString; 650 attList << alarmString;
651 Recurrence* rec = event->recurrence(); 651 Recurrence* rec = event->recurrence();
652 QStringList list; 652 QStringList list;
653 bool writeEndDate = false; 653 bool writeEndDate = false;
654 switch ( rec->doesRecur() ) 654 switch ( rec->doesRecur() )
655 { 655 {
656 case Recurrence::rDaily: // 0 656 case Recurrence::rDaily: // 0
657 list.append( "0" ); 657 list.append( "0" );
658 list.append( QString::number( rec->frequency() ));//12 658 list.append( QString::number( rec->frequency() ));//12
659 list.append( "0" ); 659 list.append( "0" );
660 list.append( "0" ); 660 list.append( "0" );
661 writeEndDate = true; 661 writeEndDate = true;
662 break; 662 break;
663 case Recurrence::rWeekly:// 1 663 case Recurrence::rWeekly:// 1
664 list.append( "1" ); 664 list.append( "1" );
665 list.append( QString::number( rec->frequency()) );//12 665 list.append( QString::number( rec->frequency()) );//12
666 list.append( "0" ); 666 list.append( "0" );
667 { 667 {
668 int days = 0; 668 int days = 0;
669 QBitArray weekDays = rec->days(); 669 QBitArray weekDays = rec->days();
670 int i; 670 int i;
671 for( i = 1; i <= 7; ++i ) { 671 for( i = 1; i <= 7; ++i ) {
672 if ( weekDays[i-1] ) { 672 if ( weekDays[i-1] ) {
673 days += 1 << (i-1); 673 days += 1 << (i-1);
674 } 674 }
675 } 675 }
676 list.append( QString::number( days ) ); 676 list.append( QString::number( days ) );
677 } 677 }
678 //pending weekdays 678 //pending weekdays
679 writeEndDate = true; 679 writeEndDate = true;
680 680
681 break; 681 break;
682 case Recurrence::rMonthlyPos:// 2 682 case Recurrence::rMonthlyPos:// 2
683 list.append( "2" ); 683 list.append( "2" );
684 list.append( QString::number( rec->frequency()) );//12 684 list.append( QString::number( rec->frequency()) );//12
685 685
686 writeEndDate = true; 686 writeEndDate = true;
687 { 687 {
688 int count = 1; 688 int count = 1;
689 QPtrList<Recurrence::rMonthPos> rmp; 689 QPtrList<Recurrence::rMonthPos> rmp;
690 rmp = rec->monthPositions(); 690 rmp = rec->monthPositions();
691 if ( rmp.first()->negative ) 691 if ( rmp.first()->negative )
692 count = 5 - rmp.first()->rPos - 1; 692 count = 5 - rmp.first()->rPos - 1;
693 else 693 else
694 count = rmp.first()->rPos - 1; 694 count = rmp.first()->rPos - 1;
695 list.append( QString::number( count ) ); 695 list.append( QString::number( count ) );
696 696
697 } 697 }
698 698
699 list.append( "0" ); 699 list.append( "0" );
700 break; 700 break;
701 case Recurrence::rMonthlyDay:// 3 701 case Recurrence::rMonthlyDay:// 3
702 list.append( "3" ); 702 list.append( "3" );
703 list.append( QString::number( rec->frequency()) );//12 703 list.append( QString::number( rec->frequency()) );//12
704 list.append( "0" ); 704 list.append( "0" );
705 list.append( "0" ); 705 list.append( "0" );
706 writeEndDate = true; 706 writeEndDate = true;
707 break; 707 break;
708 case Recurrence::rYearlyMonth://4 708 case Recurrence::rYearlyMonth://4
709 list.append( "4" ); 709 list.append( "4" );
710 list.append( QString::number( rec->frequency()) );//12 710 list.append( QString::number( rec->frequency()) );//12
711 list.append( "0" ); 711 list.append( "0" );
712 list.append( "0" ); 712 list.append( "0" );
713 writeEndDate = true; 713 writeEndDate = true;
714 break; 714 break;
715 715
716 default: 716 default:
717 list.append( "255" ); 717 list.append( "255" );
718 list.append( QString() ); 718 list.append( QString() );
719 list.append( "0" ); 719 list.append( "0" );
720 list.append( QString() ); 720 list.append( QString() );
721 list.append( "0" ); 721 list.append( "0" );
722 list.append( "20991231T000000" ); 722 list.append( "20991231T000000" );
723 break; 723 break;
724 } 724 }
725 if ( writeEndDate ) { 725 if ( writeEndDate ) {
726 726
727 if ( rec->endDate().isValid() ) { // 15 + 16 727 if ( rec->endDate().isValid() ) { // 15 + 16
728 list.append( "1" ); 728 list.append( "1" );
729 list.append( PhoneParser::dtToString( rec->endDate()) ); 729 list.append( PhoneParser::dtToString( rec->endDate()) );
730 } else { 730 } else {
731 list.append( "0" ); 731 list.append( "0" );
732 list.append( "20991231T000000" ); 732 list.append( "20991231T000000" );
733 } 733 }
734 734
735 } 735 }
736 attList << list.join(""); 736 attList << list.join("");
737 attList << event->categoriesStr(); 737 attList << event->categoriesStr();
738 attList << event->secrecyStr(); 738 attList << event->secrecyStr();
739 return PhoneFormat::getCsum(attList ); 739 return PhoneFormat::getCsum(attList );
740} 740}
741ulong PhoneFormat::getCsum( const QStringList & attList) 741ulong PhoneFormat::getCsum( const QStringList & attList)
742{ 742{
743 int max = attList.count() -1; 743 int max = attList.count() -1;
744 ulong cSum = 0; 744 ulong cSum = 0;
745 int j,k,i; 745 int j,k,i;
746 int add; 746 int add;
747 for ( i = 1; i < max ; ++i ) { 747 for ( i = 1; i < max ; ++i ) {
748 QString s = attList[i]; 748 QString s = attList[i];
749 if ( ! s.isEmpty() ){ 749 if ( ! s.isEmpty() ){
750 j = s.length(); 750 j = s.length();
751 for ( k = 0; k < j; ++k ) { 751 for ( k = 0; k < j; ++k ) {
752 int mul = k +1; 752 int mul = k +1;
753 add = s[k].unicode (); 753 add = s[k].unicode ();
754 if ( k < 16 ) 754 if ( k < 16 )
755 mul = mul * mul; 755 mul = mul * mul;
756 add = add * mul *i*i*i; 756 add = add * mul *i*i*i;
757 cSum += add; 757 cSum += add;
758 } 758 }
759 } 759 }
760 } 760 }
761 return cSum; 761 return cSum;
762 762
763} 763}
764//extern "C" GSM_Error GSM_InitConnection(GSM_StateMachine *s, int ReplyNum); 764//extern "C" GSM_Error GSM_InitConnection(GSM_StateMachine *s, int ReplyNum);
765#include <stdlib.h> 765#include <stdlib.h>
766#define DEBUGMODE false 766#define DEBUGMODE false
767bool PhoneFormat::load( Calendar *calendar, Calendar *existingCal) 767bool PhoneFormat::load( Calendar *calendar, Calendar *existingCal)
768{ 768{
769 GSM_StateMachines; 769 GSM_StateMachines;
770 qDebug(" load "); 770 qDebug(" load ");
771 s.opened = false; 771 s.opened = false;
772 s.msg = NULL; 772 s.msg = NULL;
773 s.ConfigNum = 0; 773 s.ConfigNum = 0;
774 QLabel status ( i18n("Opening device ..."), 0 ); 774 QLabel status ( i18n("Opening device ..."), 0 );
775 int w = status.sizeHint().width()+20 ; 775 int w = status.sizeHint().width()+20 ;
776 if ( w < 200 ) w = 230; 776 if ( w < 200 ) w = 230;
777 int h = status.sizeHint().height()+20 ; 777 int h = status.sizeHint().height()+20 ;
778 int dw = QApplication::desktop()->width(); 778 int dw = QApplication::desktop()->width();
779 int dh = QApplication::desktop()->height(); 779 int dh = QApplication::desktop()->height();
780 status.setCaption(i18n("Reading phone...") ); 780 status.setCaption(i18n("Reading phone...") );
781 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 781 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
782 status.show(); 782 status.show();
783 status.raise(); 783 status.raise();
784 qApp->processEvents(); 784 qApp->processEvents();
785#if 0
786 static char*cp;
787 static INI_Section *cfg = NULL;
788 cfg=GSM_FindGammuRC();
789 int i;
790 for (i = 0; i <= MAX_CONFIG_NUM; i++) {
791 if (cfg!=NULL) {
792 cp = (char *)INI_GetValue(cfg, (unsigned char*) "gammu", (unsigned char*)"gammucoding", false);
793 if (cp) di.coding = cp;
794
795 s.Config[i].Localize = (char *)INI_GetValue(cfg, (unsigned char*) "gammu", (unsigned char*) "gammuloc", false);
796 if (s.Config[i].Localize) {
797 s.msg=INI_ReadFile(s.Config[i].Localize, true);
798 } else {
799#if !defined(WIN32) && defined(LOCALE_PATH)
800 locale = setlocale(LC_MESSAGES, NULL);
801 if (locale != NULL) {
802 snprintf(locale_file, 200, "%s/gammu_%c%c.txt",
803 LOCALE_PATH,
804 tolower(locale[0]),
805 tolower(locale[1]));
806 s.msg = INI_ReadFile(locale_file, true);
807 }
808#endif
809 }
810 }
811
812 /* Wanted user specific configuration? */
813
814 if (!GSM_ReadConfig(cfg, &s.Config[i], i) && i != 0) break;
815
816 s.ConfigNum++;
817
818 /* We want to use only one file descriptor for global and state machine debug output */
819 s.Config[i].UseGlobalDebugFile = true;
820
821
822 785
823 /* We wanted to read just user specified configuration. */
824 {break;}
825 }
826
827#endif
828 int error=initDevice(&s); 786 int error=initDevice(&s);
829 qDebug("GSM Init %d (no error is %d)", error, ERR_NONE); 787 qDebug("GSM Init %d (no error is %d)", error, ERR_NONE);
830 if ( error != ERR_NONE ) 788 if ( error != ERR_NONE )
831 return false; 789 return false;
832 GSM_Phone_Functions*Phone; 790 GSM_Phone_Functions*Phone;
833 GSM_CalendarEntrynote; 791 GSM_CalendarEntrynote;
834 bool start = true; 792 bool start = true;
835 Phone=s.Phone.Functions; 793 Phone=s.Phone.Functions;
836 bool gshutdown = false; 794 bool gshutdown = false;
837 PhoneParser handler( calendar, mProfileName ); 795 PhoneParser handler( calendar, mProfileName );
838 int ccc = 0; 796 int ccc = 0;
839 QString message = i18n(" Reading event # "); 797 QString message = i18n(" Reading event # ");
840 int procCount = 0; 798 int procCount = 0;
841 qDebug("Debug: only 10 calender items are downloaded "); 799 qDebug("Debug: only 10 calender items are downloaded ");
842 while (!gshutdown && ccc++ < 10) { 800 while (!gshutdown && ccc++ < 10) {
843 status.setText ( message + QString::number ( ++procCount ) ); 801 status.setText ( message + QString::number ( ++procCount ) );
844 qApp->processEvents(); 802 qApp->processEvents();
845 qDebug("readEvent %d ", ccc); 803 qDebug("readEvent %d ", ccc);
846 error=Phone->GetNextCalendar(&s,&note,start); 804 error=Phone->GetNextCalendar(&s,&note,start);
847 if (error == ERR_EMPTY) break; 805 if (error == ERR_EMPTY) break;
848 start = false; 806 start = false;
849 handler.readEvent( existingCal, &note ); 807 handler.readEvent( existingCal, &note );
850 qDebug("Org loc %d ",note.Location); 808 qDebug("Org loc %d ",note.Location);
851 //note.Location = 0; 809 //note.Location = 0;
852 error=Phone->SetCalendar(&s,&note); 810 error=Phone->SetCalendar(&s,&note);
853 qDebug("new loc %d ",note.Location); 811 qDebug("new loc %d ",note.Location);
854 } 812 }
855 813
856 start = true; 814 start = true;
857 GSM_ToDoEntry ToDo; 815 GSM_ToDoEntry ToDo;
858 ccc = 0; 816 ccc = 0;
859 message = i18n(" Reading todo # "); 817 message = i18n(" Reading todo # ");
860 procCount = 0; 818 procCount = 0;
861 while (!gshutdown && ccc++ < 10) { 819 while (!gshutdown && ccc++ < 10) {
862 status.setText ( message + QString::number ( ++procCount ) ); 820 status.setText ( message + QString::number ( ++procCount ) );
863 qApp->processEvents(); 821 qApp->processEvents();
864 error = Phone->GetNextToDo(&s, &ToDo, start); 822 error = Phone->GetNextToDo(&s, &ToDo, start);
865 if (error == ERR_EMPTY) break; 823 if (error == ERR_EMPTY) break;
866 start = false; 824 start = false;
867 qDebug("ReadTodo %d ", ccc); 825 qDebug("ReadTodo %d ", ccc);
868 handler.readTodo( existingCal, &ToDo, &s); 826 handler.readTodo( existingCal, &ToDo, &s);
869 827
870 } 828 }
871 829
872 error=GSM_TerminateConnection(&s); 830 error=GSM_TerminateConnection(&s);
873 831
874 return true; 832 return true;
875} 833}
876#include <qcstring.h> 834#include <qcstring.h>
877void PhoneFormat::event2GSM( Calendar *cal,Event* ev, GSM_CalendarEntry*Note ) 835void PhoneFormat::event2GSM( Calendar *cal,Event* ev, GSM_CalendarEntry*Note )
878{ 836{
879 QString eText = vfconverter.eventToString( ev, cal ); 837 QString eText = vfconverter.eventToString( ev, cal );
880 int pos = 0; 838 int pos = 0;
881 GSM_ToDoEntry dummy; 839 GSM_ToDoEntry dummy;
882 qDebug( "Convert event"); 840 qDebug( "Convert event");
883 QByteArray ba; 841 QByteArray ba;
884 QDataStream s ( ba, IO_WriteOnly ); 842 QDataStream s ( ba, IO_WriteOnly );
885 s << eText.utf8(); 843 s << eText.utf8();
886 GSM_DecodeVCALENDAR_VTODO( (unsigned char*) ba.data(), &pos, Note , &dummy, Nokia_VCalendar, Nokia_VToDo ); 844 GSM_DecodeVCALENDAR_VTODO( (unsigned char*) ba.data(), &pos, Note , &dummy, Nokia_VCalendar, Nokia_VToDo );
887 qDebug( "Convert event done"); 845 qDebug( "Convert event done");
888 Note->Location = 0; 846 Note->Location = 0;
889 QString loc = ev->getID(mProfileName); 847 QString loc = ev->getID(mProfileName);
890 if ( !loc.isEmpty() ){ 848 if ( !loc.isEmpty() ){
891 Note->Location = loc.toInt(); 849 Note->Location = loc.toInt();
892 } 850 }
893 851
894} 852}
895void PhoneFormat::todo2GSM( Calendar *cal, Todo* todo, GSM_ToDoEntry *gsmTodo ) 853void PhoneFormat::todo2GSM( Calendar *cal, Todo* todo, GSM_ToDoEntry *gsmTodo )
896{ 854{
897 qDebug( "Convert todo1"); 855 qDebug( "Convert todo1");
898 QString tText = vfconverter.todoToString( todo, cal ); 856 QString tText = vfconverter.todoToString( todo, cal );
899 int pos = 0; 857 int pos = 0;
900 GSM_CalendarEntry dummy; 858 GSM_CalendarEntry dummy;
901 QByteArray ba; 859 QByteArray ba;
902 QDataStream s ( ba, IO_WriteOnly ); 860 QDataStream s ( ba, IO_WriteOnly );
903 s << tText.utf8(); 861 s << tText.utf8();
904 GSM_DecodeVCALENDAR_VTODO( (unsigned char*) ba.data(), &pos, &dummy, gsmTodo, Nokia_VCalendar, Nokia_VToDo ); 862 GSM_DecodeVCALENDAR_VTODO( (unsigned char*) ba.data(), &pos, &dummy, gsmTodo, Nokia_VCalendar, Nokia_VToDo );
905 qDebug( "Convert todo done "); 863 qDebug( "Convert todo done ");
906 gsmTodo->Location = 0; 864 gsmTodo->Location = 0;
907 QString loc = todo->getID(mProfileName); 865 QString loc = todo->getID(mProfileName);
908 if ( !loc.isEmpty() ){ 866 if ( !loc.isEmpty() ){
909 gsmTodo->Location = loc.toInt(); 867 gsmTodo->Location = loc.toInt();
910 } 868 }
911 869
912} 870}
913void PhoneFormat::afterSave( Incidence* inc) 871void PhoneFormat::afterSave( Incidence* inc)
914{ 872{
915 uint csum; 873 uint csum;
874 inc->removeID( mProfileName );
916 if ( inc->type() == "Event") 875 if ( inc->type() == "Event")
917 csum = PhoneFormat::getCsumEvent( (Event*) inc ); 876 csum = PhoneFormat::getCsumEvent( (Event*) inc );
918 else 877 else
919 csum = PhoneFormat::getCsumTodo( (Todo*) inc ); 878 csum = PhoneFormat::getCsumTodo( (Todo*) inc );
920 inc->setCsum( mProfileName, QString::number( csum )); 879 inc->setCsum( mProfileName, QString::number( csum ));
921 inc->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID ); 880 inc->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID );
922 881
923} 882}
924bool PhoneFormat::save( Calendar *calendar) 883bool PhoneFormat::save( Calendar *calendar)
925{ 884{
926 return true; 885
927 GSM_StateMachines; 886 GSM_StateMachines;
928 qDebug(" save "); 887 qDebug(" save ");
929 s.opened = false; 888 s.opened = false;
930 s.msg = NULL; 889 s.msg = NULL;
931 s.ConfigNum = 0; 890 s.ConfigNum = 0;
932 QLabel status ( i18n(" Opening device ..."), 0 ); 891 QLabel status ( i18n(" Opening device ..."), 0 );
933 int w = status.sizeHint().width()+20 ; 892 int w = status.sizeHint().width()+20 ;
934 if ( w < 200 ) w = 230; 893 if ( w < 200 ) w = 230;
935 int h = status.sizeHint().height()+20 ; 894 int h = status.sizeHint().height()+20 ;
936 int dw = QApplication::desktop()->width(); 895 int dw = QApplication::desktop()->width();
937 int dh = QApplication::desktop()->height(); 896 int dh = QApplication::desktop()->height();
938 status.setCaption(i18n("Writing to phone...") ); 897 status.setCaption(i18n("Writing to phone...") );
939 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 898 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
940 status.show(); 899 status.show();
941 status.raise(); 900 status.raise();
942 qApp->processEvents(); 901 qApp->processEvents();
943 902
944 int error=initDevice(&s); 903 int error=initDevice(&s);
945 qDebug("GSM Init %d (no error is %d)", error, ERR_NONE); 904 qDebug("GSM Init %d (no error is %d)", error, ERR_NONE);
946 if ( error != ERR_NONE ) 905 if ( error != ERR_NONE )
947 return false; 906 return false;
948 GSM_Phone_Functions*Phone; 907 GSM_Phone_Functions*Phone;
949 GSM_CalendarEntryNote; 908 GSM_CalendarEntryNote;
950 bool start = true; 909 bool start = true;
951 Phone=s.Phone.Functions; 910 Phone=s.Phone.Functions;
952 bool gshutdown = false; 911 bool gshutdown = false;
953 QPtrList<Event> er = calendar->rawEvents(); 912 QPtrList<Event> er = calendar->rawEvents();
954 Event* ev = er.first(); 913 Event* ev = er.first();
955 QString message = i18n(" Processing event # "); 914 QString message = i18n(" Deleting event # ");
956 int procCount = 0; 915 int procCount = 0;
957 bool planB = true;// false; 916 int diffProc = 0;
917 bool setPossible = true;
918#ifdef _WIN32_
919 QString fileName = locateLocal("data", "korganizer") + "\\tempfile.vcs";
920#else
921 QString fileName = "/tmp/kdepimtemp.vcs";
922#endif
923 //algo 1 delete event
924 while ( ev ) {
925 if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { // event was changed during sync or is a new one
926
927 status.setText ( message + QString::number ( ++procCount ) );
928 qApp->processEvents();
929 qDebug("del event1 %d ", procCount);
930 //event2GSM( calendar, ev, &Note );
931 if ( ev->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete
932
933 QString loc = ev->getID(mProfileName);
934 if ( !loc.isEmpty() ){
935 Note.Location = loc.toInt();
936 } else {
937 qDebug("error: loc is empty ");
938 }
939 error = Phone->DeleteCalendar(&s, &Note);
940 if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
941 qDebug(" e error delete1 planB %d ", error);
942 break;
943 }
944 }
945 else if ( ev->getID(mProfileName).isEmpty() ) { // add new
946 // we have to do this later after deleting
947
948 }
949 else { // change existing
950
951 QString loc = ev->getID(mProfileName);
952 if ( !loc.isEmpty() ){
953 Note.Location = loc.toInt();
954 } else {
955 qDebug("error3: loc is empty ");
956 }
957 error = Phone->DeleteCalendar(&s, &Note);
958 if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
959 qDebug(" e error delete2 planB %d ", error);
960 break;
961 }
962 ev->removeID( mProfileName );
963 }
964 }
965 ev = er.next();
966 }
967 //algo 1 delete todo
968 GSM_ToDoEntry ToDoEntry;
969 QPtrList<Todo> tl = calendar->rawTodos();
970 Todo* to = tl.first();
971 message = i18n(" Deleting todo # ");
972 procCount = 0;
973 while ( to ) {
974 if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) {
975 qDebug("todo3 %d ", procCount);
976 status.setText ( message + QString::number ( ++procCount ) );
977 qApp->processEvents();
978 qDebug("todo5 %d ", procCount);
979 // todo2GSM( calendar, to, &ToDoEntry );
980 QString loc = to->getID(mProfileName);
981 if ( !loc.isEmpty() ){
982 ToDoEntry.Location = loc.toInt();
983 } else {
984 qDebug("error2: loc is empty ");
985 }
986 if ( to->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete
987 error=Phone->DeleteToDo(&s,&ToDoEntry);
988 if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
989 qDebug("delete planB %d ", error);
990 }
991 }
992 else if ( to->getID(mProfileName).isEmpty() ) { // add new
993 ;
994 }
995 else { // change existing
996 error=Phone->DeleteToDo(&s,&ToDoEntry);
997 if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
998 qDebug("set planB %d ", error);
999 }
1000 to->removeID( mProfileName );
1001 }
1002 }
1003 to = tl.next();
1004 }
1005 //algo 2 add event
1006 ev = er.first();
1007 QString filec;
1008 message = i18n(" Preparing event # ");
1009 procCount = 0;
1010 while ( ev ) {
1011 if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL && ev->tempSyncStat() != SYNC_TEMPSTATE_DELETE) {
1012 if ( ev->getID(mProfileName).isEmpty() ) {
1013 status.setText ( message + QString::number ( ++procCount ) );
1014 qApp->processEvents();
1015 filec += vfconverter.eventToString( ev, calendar )+ "\n";
1016 afterSave ( ev );
1017
1018 }
1019 }
1020 ev = er.next();
1021 }
1022 //algo 2 add todo
1023 to = tl.first();
1024 procCount = 0;
1025 message = i18n(" Preparing todo # ");
1026 while ( to ) {
1027 qDebug("todo2 %d ", procCount);
1028 if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL && to->tempSyncStat() != SYNC_TEMPSTATE_DELETE) {
1029 qDebug("todo4 %d ", procCount);
1030 if ( to->getID(mProfileName).isEmpty() ) {
1031 status.setText ( message + QString::number ( ++procCount ) );
1032 qApp->processEvents();
1033 filec += vfconverter.todoToString( to, calendar )+ "\n";
1034 afterSave ( to );
1035 }
1036 }
1037 to = tl.next();
1038 }
1039 if ( filec.isEmpty() ) {
1040 qDebug("Nothing to write back.Finished. ");
1041 error=GSM_TerminateConnection(&s);
1042 return true;
1043 }
1044 //algo 3 saving file
1045 message = i18n(" Saving temp file ... ");
1046 status.setText ( message );
1047 qApp->processEvents();
1048 QFile file( fileName );
1049 if (!file.open( IO_WriteOnly ) ) {
1050 qDebug("error open file ");
1051 error=GSM_TerminateConnection(&s);
1052 return false;
1053 }
1054 QTextStream ts( &file );
1055 ts.setCodec( QTextCodec::codecForName("utf8") );
1056 ts << filec ;
1057 file.close();
1058
1059
1060 message = i18n(" Parsing temp file ... ");
1061 status.setText ( message );
1062 qApp->processEvents();
1063 GSM_Backup Backup;
1064 error=GSM_ReadBackupFile( (char*) fileName.latin1() ,&Backup);
1065 qDebug("Read file result %d ",error );
1066 //algo 4 writing event
1067 int max, i;
1068 procCount = 0;
1069 message = i18n(" Writing event # ");
1070 if (Backup.Calendar[0] != NULL) {
1071 max = 0;
1072 while (Backup.Calendar[max]!=NULL) max++;
1073 for (i=0;i<max;i++) {
1074 status.setText ( message + QString::number ( ++procCount ) );
1075 qApp->processEvents();
1076 Note = *Backup.Calendar[i];
1077 Note.Location = 0;
1078 error=Phone->AddCalendar(&s,&Note);
1079 qDebug("add event %d %d", error, Note.Location );
1080 }
1081 }
1082 //algo 4 writing todo
1083 procCount = 0;
1084 message = i18n(" Writing todo # ");
1085 if (Backup.ToDo[0] != NULL) {
1086 max = 0;
1087 while (Backup.ToDo[max]!=NULL) max++;
1088 for (i=0;i<max;i++) {
1089 status.setText ( message + QString::number ( ++procCount ) );
1090 qApp->processEvents();
1091 ToDoEntry = *Backup.ToDo[i];
1092 error = Phone->AddToDo(&s,&ToDoEntry);
1093 qDebug("add todo %d ", error);
1094 }
1095 }
1096 //algo 5 reread
1097 message = i18n(" Rereading all data ... ");
1098 status.setText ( message );
1099 qApp->processEvents();
1100 error=GSM_TerminateConnection(&s);
1101 CalendarLocal* calendarTemp = new CalendarLocal();
1102 calendarTemp->setTimeZoneId( calendar->timeZoneId());
1103 if ( ! load( calendarTemp,calendar) ){
1104 qDebug("error reloading calendar ");
1105 delete calendarTemp;
1106 return false;
1107 }
1108
1109
1110 //algo 6 compare event
1111 ev = er.first();
1112 message = i18n(" Comparing event # ");
1113 QPtrList<Event> er1 = calendarTemp->rawEvents();
1114 Event* ev1;
1115 procCount = 0;
1116 while ( ev ) {
1117 if ( ev->tempSyncStat() == SYNC_TEMPSTATE_NEW_ID) {
1118 qDebug("event new ID ");
1119 status.setText ( message + QString::number ( ++procCount ) );
1120 qApp->processEvents();
1121 QString cSum = ev->getCsum(mProfileName);
1122 ev1 = er1.first();
1123 while ( ev1 ) {
1124 if ( ev1->getCsum( mProfileName ) == cSum ) {
1125 er1.remove( ev1 );
1126 ev->setID(mProfileName, ev1->getID(mProfileName) );
1127 break;
1128 }
1129 ev1 = er1.next();
1130 }
1131 if ( ! ev1 ) {
1132 ev->removeID(mProfileName);
1133 qDebug("ERROR: No event found on phone for %s ", ev->summary().latin1());
1134 qDebug("Probably writing back of events not supported ");
1135 }
1136
1137 }
1138 ev = er.next();
1139 }
1140 //algo 6 compare todo
1141 to = tl.first();
1142 procCount = 0;
1143 QPtrList<Todo> tl1 = calendarTemp->rawTodos();
1144 Todo* to1 ;
1145 message = i18n(" Comparing todo # ");
1146 while ( to ) {
1147 qDebug("todo2 %d ", procCount);
1148 if ( to->tempSyncStat() == SYNC_TEMPSTATE_NEW_ID) {
1149 status.setText ( message + QString::number ( ++procCount ) );
1150 qApp->processEvents();
1151 QString cSum = to->getCsum(mProfileName);
1152 Todo* to1 = tl1.first();
1153 while ( to1 ) {
1154 if ( to1->getCsum( mProfileName ) == cSum ) {
1155 tl1.remove( to1 );
1156 to->setID(mProfileName, to1->getID(mProfileName) );
1157 break;
1158 }
1159 to1 = tl1.next();
1160 }
1161 if ( ! to1 ) {
1162 to->removeID(mProfileName);
1163 qDebug("ERROR: No todo found on phone for %s ", to->summary().latin1());
1164 qDebug("Probably writing back of todos not supported ");
1165 }
1166 }
1167 to = tl.next();
1168 }
1169 delete calendarTemp;
1170 return true;
1171 // *******************************************************************
1172 // *******************************************************************
1173 // *******************************************************************
1174#if 0
958 while ( ev && ! planB) { 1175 while ( ev && ! planB) {
959 if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { // event was changed during sync or is a new one 1176 if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { // event was changed during sync or is a new one
960 1177
961 status.setText ( message + QString::number ( ++procCount ) ); 1178 status.setText ( message + QString::number ( ++procCount ) );
962 qApp->processEvents(); 1179 qApp->processEvents();
963 qDebug("event1 %d ", procCount); 1180 qDebug("event1 %d ", procCount);
964 event2GSM( calendar, ev, &Note ); 1181 event2GSM( calendar, ev, &Note );
965 if ( ev->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete 1182 if ( ev->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete
966 error = Phone->DeleteCalendar(&s, &Note); 1183 error = Phone->DeleteCalendar(&s, &Note);
967 if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { 1184 if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
968 planB = true; 1185 planB = true;
969 qDebug(" e delete planB %d ", error); 1186 qDebug(" e delete1 planB %d ", error);
970 break; 1187 break;
971 } 1188 }
972 } 1189 }
973 else if ( ev->getID(mProfileName).isEmpty() ) { // add new 1190 else if ( ev->getID(mProfileName).isEmpty() ) { // add new
974 // we have to do this later after deleting 1191 // we have to do this later after deleting
975 1192
976 } 1193 }
977 else { // change existing 1194 else { // change existing
978 error = Phone->SetCalendar(&s, &Note); 1195 if ( setPossible ) {
979 if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { 1196 error = Phone->SetCalendar(&s, &Note);
980 planB = true; 1197 if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
981 qDebug(" e change planB %d ", error); 1198 setPossible = false;
982 break; 1199 ++diffProc;
1200 qDebug("Set cal not supported %d ", error);
1201 break;
1202 }
1203 }
1204 if ( ! setPossible) {
1205 ++diffProc;
1206 error = Phone->DeleteCalendar(&s, &Note);
1207 if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
1208 planB = true;
1209 qDebug(" e delete2 planB %d ", error);
1210 break;
1211 }
1212 ev->removeID( mProfileName );
983 } 1213 }
984 qDebug("Change Calendar. Location %d status: %d",Note.Location, error ); 1214 qDebug("Change Calendar. Location %d status: %d",Note.Location, error );
985 } 1215 }
986 } 1216 }
987 ev = er.next(); 1217 ev = er.next();
988 } 1218 }
989 ev = er.first(); 1219 ev = er.first();
990 // pending get empty slots 1220 // pending get empty slots
991 int loc = 0; 1221 int loc = 0;
1222 procCount -= diffProc;
992 while ( ev && ! planB) { 1223 while ( ev && ! planB) {
993 if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL && ev->tempSyncStat() != SYNC_TEMPSTATE_DELETE) { 1224 if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL && ev->tempSyncStat() != SYNC_TEMPSTATE_DELETE) {
994 qDebug("event2 %d ", procCount); 1225 qDebug("event2 %d ", procCount);
995 if ( ev->getID(mProfileName).isEmpty() ) { 1226 if ( ev->getID(mProfileName).isEmpty() ) {
996 status.setText ( message + QString::number ( ++procCount ) ); 1227 status.setText ( message + QString::number ( ++procCount ) );
997 qApp->processEvents(); 1228 qApp->processEvents();
998 //int newID ;//= pending 1229 //int newID ;//= pending
999 //ev->setID(mProfileName, QString::number( newID )); 1230 //ev->setID(mProfileName, QString::number( newID ));
1000 event2GSM( calendar, ev, &Note ); 1231 event2GSM( calendar, ev, &Note );
1001 ++loc; 1232 ++loc;
1002 Note.Location = loc; 1233 Note.Location = loc;
1003 error = Phone->AddCalendar(&s, &Note); 1234 error = Phone->AddCalendar(&s, &Note);
1004 if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { 1235 if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
1005 planB = true; 1236 planB = true;
1006 qDebug(" e add planB %d ", error); 1237 qDebug(" e add planB %d ", error);
1007 break; 1238 break;
1008 } 1239 }
1009 ev->setID( mProfileName, QString::number( Note.Location ) ); 1240 ev->setID( mProfileName, QString::number( Note.Location ) );
1010 qDebug("New Calendar. Location %d stat %d %d",Note.Location ,error, ERR_UNKNOWN); 1241 qDebug("New Calendar. Location %d stat %d %d",Note.Location ,error, ERR_UNKNOWN);
1011 afterSave( ev ); 1242 afterSave( ev );
1012 } else { 1243 } else {
1013 afterSave( ev ); // setting temp sync stat for changed items 1244 afterSave( ev ); // setting temp sync stat for changed items
1014 } 1245 }
1015 } 1246 }
1016 ev = er.next(); 1247 ev = er.next();
1017 } 1248 }
1018 1249
1019 1250
1020 if ( planB ) { 1251 if ( planB ) {
1021 qDebug("delete all calendar..."); 1252 qDebug("delete all calendar...");
1022 status.setText ( i18n("Deleting all calendar...")); 1253 status.setText ( i18n("Deleting all calendar..."));
1023 qApp->processEvents(); 1254 qApp->processEvents();
1024 error=Phone->DeleteAllCalendar(&s); 1255 error=Phone->DeleteAllCalendar(&s);
1025 if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { 1256 if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
1026 message = i18n(" Deleting event # "); 1257 message = i18n(" Deleting event # ");
1027 procCount = 0; 1258 procCount = 0;
1028 while (1) { 1259 while (1) {
1029 status.setText ( message + QString::number ( ++procCount ) ); 1260 status.setText ( message + QString::number ( ++procCount ) );
1030 qApp->processEvents(); 1261 qApp->processEvents();
1031 qDebug("deleting event ... %d", procCount); 1262 qDebug("deleting event ... %d", procCount);
1032 error = Phone->GetNextCalendar(&s,&Note,true); 1263 error = Phone->GetNextCalendar(&s,&Note,true);
1033 if (error != ERR_NONE) break; 1264 if (error != ERR_NONE) break;
1034 error = Phone->DeleteCalendar(&s,&Note); 1265 error = Phone->DeleteCalendar(&s,&Note);
1035 } 1266 }
1036 qDebug("deleting calendar ... finished"); 1267 qDebug("deleting calendar ... finished");
1037 } else { 1268 } else {
1038 status.setText ( i18n("All calendar deleted!")); 1269 status.setText ( i18n("All calendar deleted!"));
1039 qDebug("all cal deleted"); 1270 qDebug("all cal deleted");
1040 } 1271 }
1041 bool planC = false; 1272 bool planC = false;
1042 ev = er.first(); 1273 ev = er.first();
1043 procCount = 0; 1274 procCount = 0;
1044 message = i18n(" Writing event # "); 1275 message = i18n(" Writing event # ");
1045 while ( ev && ! planC) { 1276 while ( ev && ! planC) {
1046 status.setText ( message + QString::number ( ++procCount ) ); 1277 status.setText ( message + QString::number ( ++procCount ) );
1047 qApp->processEvents(); 1278 qApp->processEvents();
1048 event2GSM( calendar, ev, &Note ); 1279 event2GSM( calendar, ev, &Note );
1049 Note.Location = procCount; 1280 Note.Location = procCount;
1050 error=Phone->AddCalendar(&s,&Note); 1281 error=Phone->AddCalendar(&s,&Note);
1051 if (error != ERR_NONE ) { 1282 if (error != ERR_NONE ) {
1052 // we have currently no planC :-( 1283 // we have currently no planC :-(
1053 // planC = true; 1284 // planC = true;
1054 //qDebug("add planC %d ", error); 1285 //qDebug("add planC %d ", error);
1055 //break; 1286 //break;
1056 // we remove the ID such that this todo is not deleted after next sync 1287 // we remove the ID such that this todo is not deleted after next sync
1057 ev->removeID(mProfileName); 1288 ev->removeID(mProfileName);
1058 ev->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID ); 1289 ev->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID );
1059 qDebug("error :cal adding loc %d planB stat %d ", Note.Location ,error); 1290 qDebug("error :cal adding loc %d planB stat %d ", Note.Location ,error);
1060 } else { 1291 } else {
1061 qDebug("cal adding loc %d planB stat %d ", Note.Location ,error); 1292 qDebug("cal adding loc %d planB stat %d ", Note.Location ,error);
1062 ev->setID(mProfileName, QString::number( Note.Location )); 1293 ev->setID(mProfileName, QString::number( Note.Location ));
1063 afterSave( ev ); 1294 afterSave( ev );
1064 } 1295 }
1065 ev = er.next(); 1296 ev = er.next();
1066 } 1297 }
1067 if ( planC ) { 1298 if ( planC ) {
1068 qDebug("writing cal went wrong..."); 1299 qDebug("writing cal went wrong...");
1069 1300
1070 // we have currently no planC :-( 1301 // we have currently no planC :-(
1071 } 1302 }
1072 } 1303 }
1073 GSM_ToDoEntry ToDoEntry; 1304 GSM_ToDoEntry ToDoEntry;
1074 QPtrList<Todo> tl = calendar->rawTodos(); 1305 QPtrList<Todo> tl = calendar->rawTodos();
1075 Todo* to = tl.first(); 1306 Todo* to = tl.first();
1076 1307
1077 message = i18n(" Processing todo # "); 1308 message = i18n(" Processing todo # ");
1078 procCount = 0; 1309 procCount = 0;
1079 planB = false; 1310 planB = false;
1080 while ( to && ! planB ) { 1311 while ( to && ! planB ) {
1081 if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { 1312 if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) {
1082 qDebug("todo3 %d ", procCount); 1313 qDebug("todo3 %d ", procCount);
1083 status.setText ( message + QString::number ( ++procCount ) ); 1314 status.setText ( message + QString::number ( ++procCount ) );
1084 qApp->processEvents(); 1315 qApp->processEvents();
1085 qDebug("todo5 %d ", procCount); 1316 qDebug("todo5 %d ", procCount);
1086 todo2GSM( calendar, to, &ToDoEntry ); 1317 todo2GSM( calendar, to, &ToDoEntry );
1087 if ( to->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete 1318 if ( to->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete
1088 error=Phone->DeleteToDo(&s,&ToDoEntry); 1319 error=Phone->DeleteToDo(&s,&ToDoEntry);
1089 if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { 1320 if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
1090 planB = true; 1321 planB = true;
1091 qDebug("delete planB %d ", error); 1322 qDebug("delete planB %d ", error);
1092 } 1323 }
1093 } 1324 }
1094 else if ( to->getID(mProfileName).isEmpty() ) { // add new 1325 else if ( to->getID(mProfileName).isEmpty() ) { // add new
1095 ; 1326 ;
1096 } 1327 }
1097 else { // change existing 1328 else { // change existing
1098 error=Phone->SetToDo(&s,&ToDoEntry); 1329 error=Phone->SetToDo(&s,&ToDoEntry);
1099 if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { 1330 if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
1100 planB = true; 1331 planB = true;
1101 qDebug("set planB %d ", error); 1332 qDebug("set planB %d ", error);
1102 } 1333 }
1103 qDebug("Old Todo. Location %d %d",ToDoEntry.Location , error ); 1334 qDebug("Old Todo. Location %d %d",ToDoEntry.Location , error );
1104 } 1335 }
1105 } 1336 }
1106 to = tl.next(); 1337 to = tl.next();
1107 } 1338 }
1108 1339
1109 // pending get empty slots 1340 // pending get empty slots
1110 to = tl.first(); 1341 to = tl.first();
1111 while ( to && ! planB ) { 1342 while ( to && ! planB ) {
1112 qDebug("todo2 %d ", procCount); 1343 qDebug("todo2 %d ", procCount);
1113 if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL && to->tempSyncStat() != SYNC_TEMPSTATE_DELETE) { 1344 if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL && to->tempSyncStat() != SYNC_TEMPSTATE_DELETE) {
1114 qDebug("todo4 %d ", procCount); 1345 qDebug("todo4 %d ", procCount);
1115 if ( to->getID(mProfileName).isEmpty() ) { 1346 if ( to->getID(mProfileName).isEmpty() ) {
1116 status.setText ( message + QString::number ( ++procCount ) ); 1347 status.setText ( message + QString::number ( ++procCount ) );
1117 qApp->processEvents(); 1348 qApp->processEvents();
1118 //int newID ;//= pending 1349 //int newID ;//= pending
1119 //to->setID(mProfileName, QString::number( newID )); 1350 //to->setID(mProfileName, QString::number( newID ));
1120 todo2GSM( calendar,to, &ToDoEntry ); 1351 todo2GSM( calendar,to, &ToDoEntry );
1121 ToDoEntry.Location = 0; 1352 ToDoEntry.Location = 0;
1122 error=Phone->AddToDo(&s,&ToDoEntry); 1353 error=Phone->AddToDo(&s,&ToDoEntry);
1123 if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { 1354 if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
1124 planB = true; 1355 planB = true;
1125 qDebug("new planB %d ", error); 1356 qDebug("new planB %d ", error);
1126 } 1357 }
1127 to->setID(mProfileName, QString::number( ToDoEntry.Location )); 1358 to->setID(mProfileName, QString::number( ToDoEntry.Location ));
1128 afterSave( to ); 1359 afterSave( to );
1129 qDebug("New Todo. Location %d %d",ToDoEntry.Location, error ); 1360 qDebug("New Todo. Location %d %d",ToDoEntry.Location, error );
1130 } else { 1361 } else {
1131 afterSave( to ); 1362 afterSave( to );
1132 } 1363 }
1133 } 1364 }
1134 to = tl.next(); 1365 to = tl.next();
1135 } 1366 }
1136 if ( planB ) { 1367 if ( planB ) {
1137 qDebug("delete all ..."); 1368 qDebug("delete all ...");
1138 error=Phone->DeleteAllToDo(&s); 1369 error=Phone->DeleteAllToDo(&s);
1139 if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { 1370 if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
1140 while (1) { 1371 while (1) {
1141 qDebug("deleting todo ..."); 1372 qDebug("deleting todo ...");
1142 error = Phone->GetNextToDo(&s,&ToDoEntry,true); 1373 error = Phone->GetNextToDo(&s,&ToDoEntry,true);
1143 if (error != ERR_NONE) break; 1374 if (error != ERR_NONE) break;
1144 error = Phone->DeleteToDo(&s,&ToDoEntry); 1375 error = Phone->DeleteToDo(&s,&ToDoEntry);
1145 } 1376 }
1146 qDebug("deleting todo ... finished"); 1377 qDebug("deleting todo ... finished");
1147 } else { 1378 } else {
1148 qDebug("all todo deleted"); 1379 qDebug("all todo deleted");
1149 } 1380 }
1150 bool planC = false; 1381 bool planC = false;
1151 to = tl.first(); 1382 to = tl.first();
1152 while ( to && ! planC ) { 1383 while ( to && ! planC ) {
1153 todo2GSM( calendar,to, &ToDoEntry ); 1384 todo2GSM( calendar,to, &ToDoEntry );
1154 ToDoEntry.Location = 0; 1385 ToDoEntry.Location = 0;
1155 error=Phone->AddToDo(&s,&ToDoEntry); 1386 error=Phone->AddToDo(&s,&ToDoEntry);
1156 if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { 1387 if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
1157 // we have currently no planC :-( 1388 // we have currently no planC :-(
1158 // planC = true; 1389 // planC = true;
1159 //qDebug("add planC %d ", error); 1390 //qDebug("add planC %d ", error);
1160 //break; 1391 //break;
1161 // we remove the ID such that this todo is not deleted after next sync 1392 // we remove the ID such that this todo is not deleted after next sync
1162 to->removeID(mProfileName); 1393 to->removeID(mProfileName);
1163 to->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID ); 1394 to->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID );
1164 } else { 1395 } else {
1165 qDebug("adding %d planB %d ", ToDoEntry.Location ,error); 1396 qDebug("adding %d planB %d ", ToDoEntry.Location ,error);
1166 to->setID(mProfileName, QString::number( ToDoEntry.Location )); 1397 to->setID(mProfileName, QString::number( ToDoEntry.Location ));
1167 afterSave( to ); 1398 afterSave( to );
1168 } 1399 }
1169 to = tl.next(); 1400 to = tl.next();
1170 } 1401 }
1171 if ( planC ) { 1402 if ( planC ) {
1172 // we have currently no planC :-( 1403 // we have currently no planC :-(
1173 } 1404 }
1174 } 1405 }
1175 return true; 1406 return true;
1407#endif
1176} 1408}
1177QString PhoneFormat::dtToGSM( const QDateTime& dti, bool useTZ ) 1409QString PhoneFormat::dtToGSM( const QDateTime& dti, bool useTZ )
1178{ 1410{
1179 QString datestr; 1411 QString datestr;
1180 QString timestr; 1412 QString timestr;
1181 int offset = KGlobal::locale()->localTimeOffset( dti ); 1413 int offset = KGlobal::locale()->localTimeOffset( dti );
1182 QDateTime dt; 1414 QDateTime dt;
1183 if (useTZ) 1415 if (useTZ)
1184 dt = dti.addSecs ( -(offset*60)); 1416 dt = dti.addSecs ( -(offset*60));
1185 else 1417 else
1186 dt = dti; 1418 dt = dti;
1187 if(dt.date().isValid()){ 1419 if(dt.date().isValid()){
1188 const QDate& date = dt.date(); 1420 const QDate& date = dt.date();
1189 datestr.sprintf("%04d%02d%02d", 1421 datestr.sprintf("%04d%02d%02d",
1190 date.year(), date.month(), date.day()); 1422 date.year(), date.month(), date.day());
1191 } 1423 }
1192 if(dt.time().isValid()){ 1424 if(dt.time().isValid()){
1193 const QTime& time = dt.time(); 1425 const QTime& time = dt.time();
1194 timestr.sprintf("T%02d%02d%02d", 1426 timestr.sprintf("T%02d%02d%02d",
1195 time.hour(), time.minute(), time.second()); 1427 time.hour(), time.minute(), time.second());
1196 } 1428 }
1197 return datestr + timestr; 1429 return datestr + timestr;
1198} 1430}
1199QString PhoneFormat::getEventString( Event* event ) 1431QString PhoneFormat::getEventString( Event* event )
1200{ 1432{
1201#if 0 1433#if 0
1202 QStringList list; 1434 QStringList list;
1203 list.append( QString::number(event->zaurusId() ) ); 1435 list.append( QString::number(event->zaurusId() ) );
1204 list.append( event->categories().join(",") ); 1436 list.append( event->categories().join(",") );
1205 if ( !event->summary().isEmpty() ) 1437 if ( !event->summary().isEmpty() )
1206 list.append( event->summary() ); 1438 list.append( event->summary() );
1207 else 1439 else
1208 list.append("" ); 1440 list.append("" );
1209 if ( !event->location().isEmpty() ) 1441 if ( !event->location().isEmpty() )
1210 list.append( event->location() ); 1442 list.append( event->location() );
1211 else 1443 else
1212 list.append("" ); 1444 list.append("" );
1213 if ( !event->description().isEmpty() ) 1445 if ( !event->description().isEmpty() )
1214 list.append( event->description() ); 1446 list.append( event->description() );
1215 else 1447 else
1216 list.append( "" ); 1448 list.append( "" );
1217 if ( event->doesFloat () ) { 1449 if ( event->doesFloat () ) {
1218 list.append( dtToString( QDateTime(event->dtStart().date(), QTime(0,0,0)), false )); 1450 list.append( dtToString( QDateTime(event->dtStart().date(), QTime(0,0,0)), false ));
1219 list.append( dtToString( QDateTime(event->dtEnd().date(),QTime(23,59,59)), false )); //6 1451 list.append( dtToString( QDateTime(event->dtEnd().date(),QTime(23,59,59)), false )); //6
1220 list.append( "1" ); 1452 list.append( "1" );
1221 1453
1222 } 1454 }
1223 else { 1455 else {
1224 list.append( dtToString( event->dtStart()) ); 1456 list.append( dtToString( event->dtStart()) );
1225 list.append( dtToString( event->dtEnd()) ); //6 1457 list.append( dtToString( event->dtEnd()) ); //6
1226 list.append( "0" ); 1458 list.append( "0" );
1227 } 1459 }
1228 bool noAlarm = true; 1460 bool noAlarm = true;
1229 if ( event->alarms().count() > 0 ) { 1461 if ( event->alarms().count() > 0 ) {
1230 Alarm * al = event->alarms().first(); 1462 Alarm * al = event->alarms().first();
1231 if ( al->enabled() ) { 1463 if ( al->enabled() ) {
1232 noAlarm = false; 1464 noAlarm = false;
1233 list.append( "0" ); // yes, 0 == alarm 1465 list.append( "0" ); // yes, 0 == alarm
1234 list.append( QString::number( al->startOffset().asSeconds()/(-60) ) ); 1466 list.append( QString::number( al->startOffset().asSeconds()/(-60) ) );
1235 if ( al->type() == Alarm::Audio ) 1467 if ( al->type() == Alarm::Audio )
1236 list.append( "1" ); // type audio 1468 list.append( "1" ); // type audio
1237 else 1469 else
1238 list.append( "0" ); // type silent 1470 list.append( "0" ); // type silent
1239 } 1471 }
1240 } 1472 }
1241 if ( noAlarm ) { 1473 if ( noAlarm ) {
1242 list.append( "1" ); // yes, 1 == no alarm 1474 list.append( "1" ); // yes, 1 == no alarm
1243 list.append( "0" ); // no alarm offset 1475 list.append( "0" ); // no alarm offset
1244 list.append( "1" ); // type 1476 list.append( "1" ); // type
1245 } 1477 }
1246 // next is: 11 1478 // next is: 11
1247 // next is: 11-16 are recurrence 1479 // next is: 11-16 are recurrence
1248 Recurrence* rec = event->recurrence(); 1480 Recurrence* rec = event->recurrence();
1249 1481
1250 bool writeEndDate = false; 1482 bool writeEndDate = false;
1251 switch ( rec->doesRecur() ) 1483 switch ( rec->doesRecur() )
1252 { 1484 {
1253 case Recurrence::rDaily: // 0 1485 case Recurrence::rDaily: // 0
1254 list.append( "0" ); 1486 list.append( "0" );
1255 list.append( QString::number( rec->frequency() ));//12 1487 list.append( QString::number( rec->frequency() ));//12
1256 list.append( "0" ); 1488 list.append( "0" );
1257 list.append( "0" ); 1489 list.append( "0" );
1258 writeEndDate = true; 1490 writeEndDate = true;
1259 break; 1491 break;
1260 case Recurrence::rWeekly:// 1 1492 case Recurrence::rWeekly:// 1
1261 list.append( "1" ); 1493 list.append( "1" );
1262 list.append( QString::number( rec->frequency()) );//12 1494 list.append( QString::number( rec->frequency()) );//12
1263 list.append( "0" ); 1495 list.append( "0" );
1264 { 1496 {
1265 int days = 0; 1497 int days = 0;
1266 QBitArray weekDays = rec->days(); 1498 QBitArray weekDays = rec->days();
1267 int i; 1499 int i;
1268 for( i = 1; i <= 7; ++i ) { 1500 for( i = 1; i <= 7; ++i ) {
1269 if ( weekDays[i-1] ) { 1501 if ( weekDays[i-1] ) {
1270 days += 1 << (i-1); 1502 days += 1 << (i-1);
1271 } 1503 }
1272 } 1504 }
1273 list.append( QString::number( days ) ); 1505 list.append( QString::number( days ) );
1274 } 1506 }
1275 //pending weekdays 1507 //pending weekdays
1276 writeEndDate = true; 1508 writeEndDate = true;
1277 1509
1278 break; 1510 break;
1279 case Recurrence::rMonthlyPos:// 2 1511 case Recurrence::rMonthlyPos:// 2
1280 list.append( "2" ); 1512 list.append( "2" );
1281 list.append( QString::number( rec->frequency()) );//12 1513 list.append( QString::number( rec->frequency()) );//12
1282 1514
1283 writeEndDate = true; 1515 writeEndDate = true;
1284 { 1516 {
1285 int count = 1; 1517 int count = 1;
1286 QPtrList<Recurrence::rMonthPos> rmp; 1518 QPtrList<Recurrence::rMonthPos> rmp;
1287 rmp = rec->monthPositions(); 1519 rmp = rec->monthPositions();
1288 if ( rmp.first()->negative ) 1520 if ( rmp.first()->negative )
1289 count = 5 - rmp.first()->rPos - 1; 1521 count = 5 - rmp.first()->rPos - 1;
1290 else 1522 else
1291 count = rmp.first()->rPos - 1; 1523 count = rmp.first()->rPos - 1;
1292 list.append( QString::number( count ) ); 1524 list.append( QString::number( count ) );
1293 1525
1294 } 1526 }
1295 1527
1296 list.append( "0" ); 1528 list.append( "0" );
1297 break; 1529 break;
1298 case Recurrence::rMonthlyDay:// 3 1530 case Recurrence::rMonthlyDay:// 3
1299 list.append( "3" ); 1531 list.append( "3" );
1300 list.append( QString::number( rec->frequency()) );//12 1532 list.append( QString::number( rec->frequency()) );//12
1301 list.append( "0" ); 1533 list.append( "0" );
1302 list.append( "0" ); 1534 list.append( "0" );
1303 writeEndDate = true; 1535 writeEndDate = true;
1304 break; 1536 break;
1305 case Recurrence::rYearlyMonth://4 1537 case Recurrence::rYearlyMonth://4
1306 list.append( "4" ); 1538 list.append( "4" );
1307 list.append( QString::number( rec->frequency()) );//12 1539 list.append( QString::number( rec->frequency()) );//12
1308 list.append( "0" ); 1540 list.append( "0" );
1309 list.append( "0" ); 1541 list.append( "0" );
1310 writeEndDate = true; 1542 writeEndDate = true;
1311 break; 1543 break;
1312 1544
1313 default: 1545 default:
1314 list.append( "255" ); 1546 list.append( "255" );
1315 list.append( QString() ); 1547 list.append( QString() );
1316 list.append( "0" ); 1548 list.append( "0" );
1317 list.append( QString() ); 1549 list.append( QString() );
1318 list.append( "0" ); 1550 list.append( "0" );
1319 list.append( "20991231T000000" ); 1551 list.append( "20991231T000000" );
1320 break; 1552 break;
1321 } 1553 }
1322 if ( writeEndDate ) { 1554 if ( writeEndDate ) {
1323 1555
1324 if ( rec->endDate().isValid() ) { // 15 + 16 1556 if ( rec->endDate().isValid() ) { // 15 + 16
1325 list.append( "1" ); 1557 list.append( "1" );
1326 list.append( dtToString( rec->endDate()) ); 1558 list.append( dtToString( rec->endDate()) );
1327 } else { 1559 } else {
1328 list.append( "0" ); 1560 list.append( "0" );
1329 list.append( "20991231T000000" ); 1561 list.append( "20991231T000000" );
1330 } 1562 }
1331 1563
1332 } 1564 }
1333 if ( event->doesFloat () ) { 1565 if ( event->doesFloat () ) {
1334 list.append( dtToString( event->dtStart(), false ).left( 8 )); 1566 list.append( dtToString( event->dtStart(), false ).left( 8 ));
1335 list.append( dtToString( event->dtEnd(), false ).left( 8 )); //6 1567 list.append( dtToString( event->dtEnd(), false ).left( 8 )); //6
1336 1568
1337 } 1569 }
1338 else { 1570 else {
1339 list.append( QString() ); 1571 list.append( QString() );
1340 list.append( QString() ); 1572 list.append( QString() );
1341 1573
1342 } 1574 }
1343 if (event->dtStart().date() == event->dtEnd().date() ) 1575 if (event->dtStart().date() == event->dtEnd().date() )
1344 list.append( "0" ); 1576 list.append( "0" );
1345 else 1577 else
1346 list.append( "1" ); 1578 list.append( "1" );
1347 1579
1348 1580
1349 for(QStringList::Iterator it=list.begin(); 1581 for(QStringList::Iterator it=list.begin();
1350 it!=list.end(); ++it){ 1582 it!=list.end(); ++it){
1351 QString& s = (*it); 1583 QString& s = (*it);
1352 s.replace(QRegExp("\""), "\"\""); 1584 s.replace(QRegExp("\""), "\"\"");
1353 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){ 1585 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){
1354 s.prepend('\"'); 1586 s.prepend('\"');
1355 s.append('\"'); 1587 s.append('\"');
1356 } else if(s.isEmpty() && !s.isNull()){ 1588 } else if(s.isEmpty() && !s.isNull()){
1357 s = "\"\""; 1589 s = "\"\"";
1358 } 1590 }
1359 } 1591 }
1360 return list.join(","); 1592 return list.join(",");
1361#endif 1593#endif
1362 return QString(); 1594 return QString();
1363 1595
1364} 1596}
1365QString PhoneFormat::getTodoString( Todo* todo ) 1597QString PhoneFormat::getTodoString( Todo* todo )
1366{ 1598{
1367#if 0 1599#if 0
1368 QStringList list; 1600 QStringList list;
1369 list.append( QString::number( todo->zaurusId() ) ); 1601 list.append( QString::number( todo->zaurusId() ) );
1370 list.append( todo->categories().join(",") ); 1602 list.append( todo->categories().join(",") );
1371 1603
1372 if ( todo->hasStartDate() ) { 1604 if ( todo->hasStartDate() ) {
1373 list.append( dtToString( todo->dtStart()) ); 1605 list.append( dtToString( todo->dtStart()) );
1374 } else 1606 } else
1375 list.append( QString() ); 1607 list.append( QString() );
1376 1608
1377 if ( todo->hasDueDate() ) { 1609 if ( todo->hasDueDate() ) {
1378 QTime tim; 1610 QTime tim;
1379 if ( todo->doesFloat()) { 1611 if ( todo->doesFloat()) {
1380 list.append( dtToString( QDateTime(todo->dtDue().date(),QTime( 0,0,0 )), false)) ; 1612 list.append( dtToString( QDateTime(todo->dtDue().date(),QTime( 0,0,0 )), false)) ;
1381 } else { 1613 } else {
1382 list.append( dtToString(todo->dtDue() ) ); 1614 list.append( dtToString(todo->dtDue() ) );
1383 } 1615 }
1384 } else 1616 } else
1385 list.append( QString() ); 1617 list.append( QString() );
1386 1618
1387 if ( todo->isCompleted() ) { 1619 if ( todo->isCompleted() ) {
1388 list.append( dtToString( todo->completed()) ); 1620 list.append( dtToString( todo->completed()) );
1389 list.append( "0" ); // yes 0 == completed 1621 list.append( "0" ); // yes 0 == completed
1390 } else { 1622 } else {
1391 list.append( dtToString( todo->completed()) ); 1623 list.append( dtToString( todo->completed()) );
1392 list.append( "1" ); 1624 list.append( "1" );
1393 } 1625 }
1394 list.append( QString::number( todo->priority() )); 1626 list.append( QString::number( todo->priority() ));
1395 if( ! todo->summary().isEmpty() ) 1627 if( ! todo->summary().isEmpty() )
1396 list.append( todo->summary() ); 1628 list.append( todo->summary() );
1397 else 1629 else
1398 list.append( "" ); 1630 list.append( "" );
1399 if (! todo->description().isEmpty() ) 1631 if (! todo->description().isEmpty() )
1400 list.append( todo->description() ); 1632 list.append( todo->description() );
1401 else 1633 else
1402 list.append( "" ); 1634 list.append( "" );
1403 for(QStringList::Iterator it=list.begin(); 1635 for(QStringList::Iterator it=list.begin();
1404 it!=list.end(); ++it){ 1636 it!=list.end(); ++it){
1405 QString& s = (*it); 1637 QString& s = (*it);
1406 s.replace(QRegExp("\""), "\"\""); 1638 s.replace(QRegExp("\""), "\"\"");
1407 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){ 1639 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){
1408 s.prepend('\"'); 1640 s.prepend('\"');
1409 s.append('\"'); 1641 s.append('\"');
1410 } else if(s.isEmpty() && !s.isNull()){ 1642 } else if(s.isEmpty() && !s.isNull()){
1411 s = "\"\""; 1643 s = "\"\"";
1412 } 1644 }
1413 } 1645 }
1414 return list.join(","); 1646 return list.join(",");
1415#endif 1647#endif
1416 return QString(); 1648 return QString();
1417} 1649}
1418 1650
1419 1651
1420QString PhoneFormat::toString( Calendar * ) 1652QString PhoneFormat::toString( Calendar * )
1421{ 1653{
1422 return QString::null; 1654 return QString::null;
1423} 1655}
1424bool PhoneFormat::fromString( Calendar *calendar, const QString & text) 1656bool PhoneFormat::fromString( Calendar *calendar, const QString & text)
1425{ 1657{
1426 return false; 1658 return false;
1427} 1659}
diff --git a/libkcal/sharpformat.cpp b/libkcal/sharpformat.cpp
index defdb09..820d068 100644
--- a/libkcal/sharpformat.cpp
+++ b/libkcal/sharpformat.cpp
@@ -126,769 +126,769 @@ class SharpParser : public QObject
126 126
127 QBitArray weekDays( 7 ); 127 QBitArray weekDays( 7 );
128 int i; 128 int i;
129 int bb = 1; 129 int bb = 1;
130 for( i = 1; i <= 7; ++i ) { 130 for( i = 1; i <= 7; ++i ) {
131 weekDays.setBit( i - 1, ( bb & weekDaysNum )); 131 weekDays.setBit( i - 1, ( bb & weekDaysNum ));
132 bb = 2 << (i-1); 132 bb = 2 << (i-1);
133 //qDebug(" %d bit %d ",i-1,weekDays.at(i-1) ); 133 //qDebug(" %d bit %d ",i-1,weekDays.at(i-1) );
134 } 134 }
135 // qDebug("next "); 135 // qDebug("next ");
136 QString posStr = attList[13]; 136 QString posStr = attList[13];
137 int pos = posStr.toInt(); 137 int pos = posStr.toInt();
138 Recurrence *r = event->recurrence(); 138 Recurrence *r = event->recurrence();
139 139
140 if ( rtype == "0" ) { 140 if ( rtype == "0" ) {
141 if ( hasEndDate ) r->setDaily( freq, endDate ); 141 if ( hasEndDate ) r->setDaily( freq, endDate );
142 else r->setDaily( freq, -1 ); 142 else r->setDaily( freq, -1 );
143 } else if ( rtype == "1" ) { 143 } else if ( rtype == "1" ) {
144 if ( hasEndDate ) r->setWeekly( freq, weekDays, endDate ); 144 if ( hasEndDate ) r->setWeekly( freq, weekDays, endDate );
145 else r->setWeekly( freq, weekDays, -1 ); 145 else r->setWeekly( freq, weekDays, -1 );
146 } else if ( rtype == "3" ) { 146 } else if ( rtype == "3" ) {
147 if ( hasEndDate ) 147 if ( hasEndDate )
148 r->setMonthly( Recurrence::rMonthlyDay, freq, endDate ); 148 r->setMonthly( Recurrence::rMonthlyDay, freq, endDate );
149 else 149 else
150 r->setMonthly( Recurrence::rMonthlyDay, freq, -1 ); 150 r->setMonthly( Recurrence::rMonthlyDay, freq, -1 );
151 r->addMonthlyDay( startDate.day() ); 151 r->addMonthlyDay( startDate.day() );
152 } else if ( rtype == "2" ) { 152 } else if ( rtype == "2" ) {
153 if ( hasEndDate ) 153 if ( hasEndDate )
154 r->setMonthly( Recurrence::rMonthlyPos, freq, endDate ); 154 r->setMonthly( Recurrence::rMonthlyPos, freq, endDate );
155 else 155 else
156 r->setMonthly( Recurrence::rMonthlyPos, freq, -1 ); 156 r->setMonthly( Recurrence::rMonthlyPos, freq, -1 );
157 QBitArray days( 7 ); 157 QBitArray days( 7 );
158 days.fill( false ); 158 days.fill( false );
159 days.setBit( startDate.dayOfWeek() - 1 ); 159 days.setBit( startDate.dayOfWeek() - 1 );
160 r->addMonthlyPos( pos, days ); 160 r->addMonthlyPos( pos, days );
161 } else if ( rtype == "4" ) { 161 } else if ( rtype == "4" ) {
162 if ( hasEndDate ) 162 if ( hasEndDate )
163 r->setYearly( Recurrence::rYearlyMonth, freq, endDate ); 163 r->setYearly( Recurrence::rYearlyMonth, freq, endDate );
164 else 164 else
165 r->setYearly( Recurrence::rYearlyMonth, freq, -1 ); 165 r->setYearly( Recurrence::rYearlyMonth, freq, -1 );
166 r->addYearlyNum( startDate.month() ); 166 r->addYearlyNum( startDate.month() );
167 } 167 }
168 } else { 168 } else {
169 event->recurrence()->unsetRecurs(); 169 event->recurrence()->unsetRecurs();
170 } 170 }
171 171
172 QString categoryList = attList[1] ; 172 QString categoryList = attList[1] ;
173 event->setCategories( lookupCategories( categoryList ) ); 173 event->setCategories( lookupCategories( categoryList ) );
174 174
175 // strange 0 semms to mean: alarm enabled 175 // strange 0 semms to mean: alarm enabled
176 if ( attList[8] == "0" ) { 176 if ( attList[8] == "0" ) {
177 Alarm *alarm; 177 Alarm *alarm;
178 if ( event->alarms().count() > 0 ) 178 if ( event->alarms().count() > 0 )
179 alarm = event->alarms().first(); 179 alarm = event->alarms().first();
180 else { 180 else {
181 alarm = new Alarm( event ); 181 alarm = new Alarm( event );
182 event->addAlarm( alarm ); 182 event->addAlarm( alarm );
183 } 183 }
184 alarm->setType( Alarm::Audio ); 184 alarm->setType( Alarm::Audio );
185 alarm->setEnabled( true ); 185 alarm->setEnabled( true );
186 int alarmOffset = attList[9].toInt(); 186 int alarmOffset = attList[9].toInt();
187 alarm->setStartOffset( alarmOffset * -60 ); 187 alarm->setStartOffset( alarmOffset * -60 );
188 } else { 188 } else {
189 Alarm *alarm; 189 Alarm *alarm;
190 if ( event->alarms().count() > 0 ) { 190 if ( event->alarms().count() > 0 ) {
191 alarm = event->alarms().first(); 191 alarm = event->alarms().first();
192 alarm->setType( Alarm::Audio ); 192 alarm->setType( Alarm::Audio );
193 alarm->setStartOffset( -60*15 ); 193 alarm->setStartOffset( -60*15 );
194 alarm->setEnabled( false ); 194 alarm->setEnabled( false );
195 } 195 }
196 } 196 }
197 197
198 mCalendar->addEvent( event); 198 mCalendar->addEvent( event);
199 } else if ( qName == "Todo" ) { 199 } else if ( qName == "Todo" ) {
200 Todo *todo; 200 Todo *todo;
201 201
202 todo = existingCalendar->todo( "Sharp_DTM", attList[0] ); 202 todo = existingCalendar->todo( "Sharp_DTM", attList[0] );
203 if (todo ) 203 if (todo )
204 todo = (Todo*)todo->clone(); 204 todo = (Todo*)todo->clone();
205 else 205 else
206 todo = new Todo; 206 todo = new Todo;
207 207
208//CARDID,CATEGORY,ETDY,LTDY,FNDY,MARK,PRTY,TITL,MEM1 208//CARDID,CATEGORY,ETDY,LTDY,FNDY,MARK,PRTY,TITL,MEM1
209// 0 1 2 3 4 5 6 7 8 209// 0 1 2 3 4 5 6 7 8
210//1,,,,,1,4,Loch zumachen,"" 210//1,,,,,1,4,Loch zumachen,""
211//3,Privat,20040317T000000,20040318T000000,20040319T000000,0,5,Call bbb,"notes123 bbb gggg ""bb "" " 211//3,Privat,20040317T000000,20040318T000000,20040319T000000,0,5,Call bbb,"notes123 bbb gggg ""bb "" "
212//2,"Familie,Freunde,Holiday",20040318T000000,20040324T000000,20040317T000000,1,2,tod2,notes 212//2,"Familie,Freunde,Holiday",20040318T000000,20040324T000000,20040317T000000,1,2,tod2,notes
213 213
214 todo->setID( "Sharp_DTM", attList[0]); 214 todo->setID( "Sharp_DTM", attList[0]);
215 todo->setCsum( "Sharp_DTM", QString::number( cSum )); 215 todo->setCsum( "Sharp_DTM", QString::number( cSum ));
216 todo->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL ); 216 todo->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL );
217 217
218 todo->setSummary( attList[7] ); 218 todo->setSummary( attList[7] );
219 todo->setDescription( attList[8]); 219 todo->setDescription( attList[8]);
220 220
221 int priority = attList[6].toInt(); 221 int priority = attList[6].toInt();
222 if ( priority == 0 ) priority = 3; 222 if ( priority == 0 ) priority = 3;
223 todo->setPriority( priority ); 223 todo->setPriority( priority );
224 224
225 QString categoryList = attList[1]; 225 QString categoryList = attList[1];
226 todo->setCategories( lookupCategories( categoryList ) ); 226 todo->setCategories( lookupCategories( categoryList ) );
227 227
228 228
229 229
230 QString hasDateStr = attList[3]; // due 230 QString hasDateStr = attList[3]; // due
231 if ( !hasDateStr.isEmpty() ) { 231 if ( !hasDateStr.isEmpty() ) {
232 if ( hasDateStr.right(6) == "000000" ) { 232 if ( hasDateStr.right(6) == "000000" ) {
233 todo->setDtDue( QDateTime(fromString( hasDateStr, false ).date(), QTime(0,0,0 )) ); 233 todo->setDtDue( QDateTime(fromString( hasDateStr, false ).date(), QTime(0,0,0 )) );
234 todo->setFloats( true ); 234 todo->setFloats( true );
235 } 235 }
236 else { 236 else {
237 todo->setDtDue( fromString( hasDateStr ) ); 237 todo->setDtDue( fromString( hasDateStr ) );
238 todo->setFloats( false ); 238 todo->setFloats( false );
239 } 239 }
240 240
241 todo->setHasDueDate( true ); 241 todo->setHasDueDate( true );
242 } 242 }
243 hasDateStr = attList[2];//start 243 hasDateStr = attList[2];//start
244 if ( !hasDateStr.isEmpty() ) { 244 if ( !hasDateStr.isEmpty() ) {
245 245
246 todo->setDtStart( fromString( hasDateStr ) ); 246 todo->setDtStart( fromString( hasDateStr ) );
247 todo->setHasStartDate( true); 247 todo->setHasStartDate( true);
248 } else 248 } else
249 todo->setHasStartDate( false ); 249 todo->setHasStartDate( false );
250 hasDateStr = attList[4];//completed 250 hasDateStr = attList[4];//completed
251 if ( !hasDateStr.isEmpty() ) { 251 if ( !hasDateStr.isEmpty() ) {
252 todo->setCompleted(fromString( hasDateStr ) ); 252 todo->setCompleted(fromString( hasDateStr ) );
253 } 253 }
254 QString completedStr = attList[5]; 254 QString completedStr = attList[5];
255 if ( completedStr == "0" ) 255 if ( completedStr == "0" )
256 todo->setCompleted( true ); 256 todo->setCompleted( true );
257 else 257 else
258 todo->setCompleted( false ); 258 todo->setCompleted( false );
259 mCalendar->addTodo( todo ); 259 mCalendar->addTodo( todo );
260 260
261 } else if ( qName == "Category" ) { 261 } else if ( qName == "Category" ) {
262 /* 262 /*
263 QString id = attributes.value( "id" ); 263 QString id = attributes.value( "id" );
264 QString name = attributes.value( "name" ); 264 QString name = attributes.value( "name" );
265 setCategory( id, name ); 265 setCategory( id, name );
266 */ 266 */
267 } 267 }
268 //qDebug("end "); 268 //qDebug("end ");
269 return true; 269 return true;
270 } 270 }
271 271
272 272
273 void setCategoriesList ( QStringList * c ) 273 void setCategoriesList ( QStringList * c )
274 { 274 {
275 oldCategories = c; 275 oldCategories = c;
276 } 276 }
277 277
278 QDateTime fromString ( QString s, bool useTz = true ) { 278 QDateTime fromString ( QString s, bool useTz = true ) {
279 QDateTime dt; 279 QDateTime dt;
280 int y,m,t,h,min,sec; 280 int y,m,t,h,min,sec;
281 y = s.mid(0,4).toInt(); 281 y = s.mid(0,4).toInt();
282 m = s.mid(4,2).toInt(); 282 m = s.mid(4,2).toInt();
283 t = s.mid(6,2).toInt(); 283 t = s.mid(6,2).toInt();
284 h = s.mid(9,2).toInt(); 284 h = s.mid(9,2).toInt();
285 min = s.mid(11,2).toInt(); 285 min = s.mid(11,2).toInt();
286 sec = s.mid(13,2).toInt(); 286 sec = s.mid(13,2).toInt();
287 dt = QDateTime(QDate(y,m,t), QTime(h,min,sec)); 287 dt = QDateTime(QDate(y,m,t), QTime(h,min,sec));
288 int offset = KGlobal::locale()->localTimeOffset( dt ); 288 int offset = KGlobal::locale()->localTimeOffset( dt );
289 if ( useTz ) 289 if ( useTz )
290 dt = dt.addSecs ( offset*60); 290 dt = dt.addSecs ( offset*60);
291 return dt; 291 return dt;
292 292
293 } 293 }
294 protected: 294 protected:
295 QDateTime toDateTime( const QString &value ) 295 QDateTime toDateTime( const QString &value )
296 { 296 {
297 QDateTime dt; 297 QDateTime dt;
298 dt.setTime_t( value.toUInt() ); 298 dt.setTime_t( value.toUInt() );
299 299
300 return dt; 300 return dt;
301 } 301 }
302 302
303 QStringList lookupCategories( const QString &categoryList ) 303 QStringList lookupCategories( const QString &categoryList )
304 { 304 {
305 QStringList categoryIds = QStringList::split( ";", categoryList ); 305 QStringList categoryIds = QStringList::split( ";", categoryList );
306 QStringList categories; 306 QStringList categories;
307 QStringList::ConstIterator it; 307 QStringList::ConstIterator it;
308 for( it = categoryIds.begin(); it != categoryIds.end(); ++it ) { 308 for( it = categoryIds.begin(); it != categoryIds.end(); ++it ) {
309 QString cate = category( *it ); 309 QString cate = category( *it );
310 if ( oldCategories ) { 310 if ( oldCategories ) {
311 if ( ! oldCategories->contains( cate ) ) 311 if ( ! oldCategories->contains( cate ) )
312 oldCategories->append( cate ); 312 oldCategories->append( cate );
313 } 313 }
314 categories.append(cate ); 314 categories.append(cate );
315 } 315 }
316 return categories; 316 return categories;
317 } 317 }
318 318
319 private: 319 private:
320 Calendar *mCalendar; 320 Calendar *mCalendar;
321 QStringList * oldCategories; 321 QStringList * oldCategories;
322 static QString category( const QString &id ) 322 static QString category( const QString &id )
323 { 323 {
324 QMap<QString,QString>::ConstIterator it = mCategoriesMap.find( id ); 324 QMap<QString,QString>::ConstIterator it = mCategoriesMap.find( id );
325 if ( it == mCategoriesMap.end() ) return id; 325 if ( it == mCategoriesMap.end() ) return id;
326 else return *it; 326 else return *it;
327 } 327 }
328 328
329 static void setCategory( const QString &id, const QString &name ) 329 static void setCategory( const QString &id, const QString &name )
330 { 330 {
331 mCategoriesMap.insert( id, name ); 331 mCategoriesMap.insert( id, name );
332 } 332 }
333 333
334 static QMap<QString,QString> mCategoriesMap; 334 static QMap<QString,QString> mCategoriesMap;
335}; 335};
336 336
337QMap<QString,QString> SharpParser::mCategoriesMap; 337QMap<QString,QString> SharpParser::mCategoriesMap;
338 338
339SharpFormat::SharpFormat() 339SharpFormat::SharpFormat()
340{ 340{
341 mCategories = 0; 341 mCategories = 0;
342} 342}
343 343
344SharpFormat::~SharpFormat() 344SharpFormat::~SharpFormat()
345{ 345{
346} 346}
347ulong SharpFormat::getCsum( const QStringList & attList) 347ulong SharpFormat::getCsum( const QStringList & attList)
348{ 348{
349 int max = attList.count() -1; 349 int max = attList.count() -1;
350 ulong cSum = 0; 350 ulong cSum = 0;
351 int j,k,i; 351 int j,k,i;
352 int add; 352 int add;
353 for ( i = 1; i < max ; ++i ) { 353 for ( i = 1; i < max ; ++i ) {
354 QString s = attList[i]; 354 QString s = attList[i];
355 if ( ! s.isEmpty() ){ 355 if ( ! s.isEmpty() ){
356 j = s.length(); 356 j = s.length();
357 for ( k = 0; k < j; ++k ) { 357 for ( k = 0; k < j; ++k ) {
358 int mul = k +1; 358 int mul = k +1;
359 add = s[k].unicode (); 359 add = s[k].unicode ();
360 if ( k < 16 ) 360 if ( k < 16 )
361 mul = mul * mul; 361 mul = mul * mul;
362 add = add * mul *i*i*i; 362 add = add * mul *i*i*i;
363 cSum += add; 363 cSum += add;
364 } 364 }
365 } 365 }
366 } 366 }
367 return cSum; 367 return cSum;
368 368
369} 369}
370#include <stdlib.h> 370#include <stdlib.h>
371#define DEBUGMODE false 371#define DEBUGMODE false
372bool SharpFormat::load( Calendar *calendar, Calendar *existngCal ) 372bool SharpFormat::load( Calendar *calendar, Calendar *existngCal )
373{ 373{
374 374
375 375
376 bool debug = DEBUGMODE; 376 bool debug = DEBUGMODE;
377 //debug = true; 377 //debug = true;
378 QString text; 378 QString text;
379 QString codec = "utf8"; 379 QString codec = "utf8";
380 QLabel status ( i18n("Reading events ..."), 0 ); 380 QLabel status ( i18n("Reading events ..."), 0 );
381 381
382 int w = status.sizeHint().width()+20 ; 382 int w = status.sizeHint().width()+20 ;
383 if ( w < 200 ) w = 200; 383 if ( w < 200 ) w = 200;
384 int h = status.sizeHint().height()+20 ; 384 int h = status.sizeHint().height()+20 ;
385 int dw = QApplication::desktop()->width(); 385 int dw = QApplication::desktop()->width();
386 int dh = QApplication::desktop()->height(); 386 int dh = QApplication::desktop()->height();
387 status.setCaption(i18n("Reading DTM Data") ); 387 status.setCaption(i18n("Reading DTM Data") );
388 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 388 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
389 status.show(); 389 status.show();
390 status.raise(); 390 status.raise();
391 qApp->processEvents(); 391 qApp->processEvents();
392 QString fileName; 392 QString fileName;
393 if ( ! debug ) { 393 if ( ! debug ) {
394 fileName = "/tmp/kopitempout"; 394 fileName = "/tmp/kopitempout";
395 QString command ="db2file datebook -r -c "+ codec + " > " + fileName; 395 QString command ="db2file datebook -r -c "+ codec + " > " + fileName;
396 system ( command.latin1() ); 396 system ( command.latin1() );
397 } else { 397 } else {
398 fileName = "/tmp/events.txt"; 398 fileName = "/tmp/events.txt";
399 399
400 } 400 }
401 QFile file( fileName ); 401 QFile file( fileName );
402 if (!file.open( IO_ReadOnly ) ) { 402 if (!file.open( IO_ReadOnly ) ) {
403 return false; 403 return false;
404 404
405 } 405 }
406 QTextStream ts( &file ); 406 QTextStream ts( &file );
407 ts.setCodec( QTextCodec::codecForName("utf8") ); 407 ts.setCodec( QTextCodec::codecForName("utf8") );
408 text = ts.read(); 408 text = ts.read();
409 file.close(); 409 file.close();
410 status.setText( i18n("Processing events ...") ); 410 status.setText( i18n("Processing events ...") );
411 status.raise(); 411 status.raise();
412 qApp->processEvents(); 412 qApp->processEvents();
413 fromString2Cal( calendar, existngCal, text, "Event" ); 413 fromString2Cal( calendar, existngCal, text, "Event" );
414 status.setText( i18n("Reading todos ...") ); 414 status.setText( i18n("Reading todos ...") );
415 qApp->processEvents(); 415 qApp->processEvents();
416 if ( ! debug ) { 416 if ( ! debug ) {
417 fileName = "/tmp/kopitempout"; 417 fileName = "/tmp/kopitempout";
418 QString command = "db2file todo -r -c " + codec+ " > " + fileName; 418 QString command = "db2file todo -r -c " + codec+ " > " + fileName;
419 system ( command.latin1() ); 419 system ( command.latin1() );
420 } else { 420 } else {
421 fileName = "/tmp/todo.txt"; 421 fileName = "/tmp/todo.txt";
422 } 422 }
423 file.setName( fileName ); 423 file.setName( fileName );
424 if (!file.open( IO_ReadOnly ) ) { 424 if (!file.open( IO_ReadOnly ) ) {
425 return false; 425 return false;
426 426
427 } 427 }
428 ts.setDevice( &file ); 428 ts.setDevice( &file );
429 text = ts.read(); 429 text = ts.read();
430 file.close(); 430 file.close();
431 431
432 status.setText( i18n("Processing todos ...") ); 432 status.setText( i18n("Processing todos ...") );
433 status.raise(); 433 status.raise();
434 qApp->processEvents(); 434 qApp->processEvents();
435 fromString2Cal( calendar, existngCal, text, "Todo" ); 435 fromString2Cal( calendar, existngCal, text, "Todo" );
436 return true; 436 return true;
437} 437}
438int SharpFormat::getNumFromRecord( QString answer, Incidence* inc ) 438int SharpFormat::getNumFromRecord( QString answer, Incidence* inc )
439{ 439{
440 int retval = -1; 440 int retval = -1;
441 QStringList templist; 441 QStringList templist;
442 QString tempString; 442 QString tempString;
443 int start = 0; 443 int start = 0;
444 int len = answer.length(); 444 int len = answer.length();
445 int end = answer.find ("\n",start)+1; 445 int end = answer.find ("\n",start)+1;
446 bool ok = true; 446 bool ok = true;
447 start = end; 447 start = end;
448 int ccc = 0; 448 int ccc = 0;
449 while ( start > 0 ) { 449 while ( start > 0 ) {
450 templist.clear(); 450 templist.clear();
451 ok = true; 451 ok = true;
452 int loopCount = 0; 452 int loopCount = 0;
453 while ( ok ) { 453 while ( ok ) {
454 ++loopCount; 454 ++loopCount;
455 if ( loopCount > 25 ) { 455 if ( loopCount > 25 ) {
456 qDebug("KO: Error in while loop"); 456 qDebug("KO: Error in while loop");
457 ok = false; 457 ok = false;
458 start = 0; 458 start = 0;
459 break; 459 break;
460 } 460 }
461 if ( ok ) 461 if ( ok )
462 tempString = getPart( answer, ok, start ); 462 tempString = getPart( answer, ok, start );
463 if ( start >= len || start == 0 ) { 463 if ( start >= len || start == 0 ) {
464 start = 0; 464 start = 0;
465 ok = false; 465 ok = false;
466 } 466 }
467 if ( tempString.right(1) =="\n" ) 467 if ( tempString.right(1) =="\n" )
468 tempString = tempString.left( tempString.length()-1); 468 tempString = tempString.left( tempString.length()-1);
469 469
470 templist.append( tempString ); 470 templist.append( tempString );
471 } 471 }
472 ++ccc; 472 ++ccc;
473 if ( ccc == 2 && loopCount < 25 ) { 473 if ( ccc == 2 && loopCount < 25 ) {
474 start = 0; 474 start = 0;
475 bool ok; 475 bool ok;
476 int newnum = templist[0].toInt( &ok ); 476 int newnum = templist[0].toInt( &ok );
477 if ( ok && newnum > 0) { 477 if ( ok && newnum > 0) {
478 retval = newnum; 478 retval = newnum;
479 inc->setID( "Sharp_DTM",templist[0] ); 479 inc->setID( "Sharp_DTM",templist[0] );
480 inc->setCsum( "Sharp_DTM", QString::number( getCsum( templist ) )); 480 inc->setCsum( "Sharp_DTM", QString::number( getCsum( templist ) ));
481 inc->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID ); 481 inc->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID );
482 } 482 }
483 } 483 }
484 } 484 }
485 //qDebug("getNumFromRecord returning : %d ", retval); 485 //qDebug("getNumFromRecord returning : %d ", retval);
486 return retval; 486 return retval;
487} 487}
488bool SharpFormat::save( Calendar *calendar) 488bool SharpFormat::save( Calendar *calendar)
489{ 489{
490 490
491 QLabel status ( i18n("Processing/adding events ..."), 0 ); 491 QLabel status ( i18n("Processing/adding events ..."), 0 );
492 int w = status.sizeHint().width()+20 ; 492 int w = status.sizeHint().width()+20 ;
493 if ( w < 200 ) w = 200; 493 if ( w < 200 ) w = 200;
494 int h = status.sizeHint().height()+20 ; 494 int h = status.sizeHint().height()+20 ;
495 int dw = QApplication::desktop()->width(); 495 int dw = QApplication::desktop()->width();
496 int dh = QApplication::desktop()->height(); 496 int dh = QApplication::desktop()->height();
497 status.setCaption(i18n("Writing DTM Data") ); 497 status.setCaption(i18n("Writing DTM Data") );
498 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 498 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
499 status.show(); 499 status.show();
500 status.raise(); 500 status.raise();
501 qApp->processEvents(); 501 qApp->processEvents();
502 bool debug = DEBUGMODE; 502 bool debug = DEBUGMODE;
503 QString codec = "utf8"; 503 QString codec = "utf8";
504 QString answer; 504 QString answer;
505 QString ePrefix = "CARDID,CATEGORY,DSRP,PLCE,MEM1,TIM1,TIM2,ADAY,ARON,ARMN,ARSD,RTYP,RFRQ,RPOS,RDYS,REND,REDT,ALSD,ALED,MDAY\n"; 505 QString ePrefix = "CARDID,CATEGORY,DSRP,PLCE,MEM1,TIM1,TIM2,ADAY,ARON,ARMN,ARSD,RTYP,RFRQ,RPOS,RDYS,REND,REDT,ALSD,ALED,MDAY\n";
506 QString tPrefix = "CARDID,CATEGORY,ETDY,LTDY,FNDY,MARK,PRTY,TITL,MEM1\n"; 506 QString tPrefix = "CARDID,CATEGORY,ETDY,LTDY,FNDY,MARK,PRTY,TITL,MEM1\n";
507 QString command; 507 QString command;
508 QPtrList<Event> er = calendar->rawEvents(); 508 QPtrList<Event> er = calendar->rawEvents();
509 Event* ev = er.first(); 509 Event* ev = er.first();
510 QString fileName = "/tmp/kopitempout"; 510 QString fileName = "/tmp/kdepimtempfile";
511 int i = 0; 511 int i = 0;
512 QString changeString = ePrefix; 512 QString changeString = ePrefix;
513 QString deleteString = ePrefix; 513 QString deleteString = ePrefix;
514 bool deleteEnt = false; 514 bool deleteEnt = false;
515 bool changeEnt = false; 515 bool changeEnt = false;
516 QString message = i18n("Processing event # "); 516 QString message = i18n("Processing event # ");
517 int procCount = 0; 517 int procCount = 0;
518 while ( ev ) { 518 while ( ev ) {
519 //qDebug("i %d ", ++i); 519 //qDebug("i %d ", ++i);
520 if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { 520 if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) {
521 status.setText ( message + QString::number ( ++procCount ) ); 521 status.setText ( message + QString::number ( ++procCount ) );
522 qApp->processEvents(); 522 qApp->processEvents();
523 QString eString = getEventString( ev ); 523 QString eString = getEventString( ev );
524 if ( ev->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete 524 if ( ev->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete
525 // deleting empty strings does not work. 525 // deleting empty strings does not work.
526 // we write first and x and then delete the record with the x 526 // we write first and x and then delete the record with the x
527 eString = eString.replace( QRegExp(",\"\""),",\"x\"" ); 527 eString = eString.replace( QRegExp(",\"\""),",\"x\"" );
528 changeString += eString + "\n"; 528 changeString += eString + "\n";
529 deleteString += eString + "\n"; 529 deleteString += eString + "\n";
530 deleteEnt = true; 530 deleteEnt = true;
531 changeEnt = true; 531 changeEnt = true;
532 } 532 }
533 else if ( ev->getID("Sharp_DTM").isEmpty() ) { // add new 533 else if ( ev->getID("Sharp_DTM").isEmpty() ) { // add new
534 command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName; 534 command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName;
535 system ( command.utf8() ); 535 system ( command.utf8() );
536 QFile file( fileName ); 536 QFile file( fileName );
537 if (!file.open( IO_ReadOnly ) ) { 537 if (!file.open( IO_ReadOnly ) ) {
538 return false; 538 return false;
539 539
540 } 540 }
541 QTextStream ts( &file ); 541 QTextStream ts( &file );
542 ts.setCodec( QTextCodec::codecForName("utf8") ); 542 ts.setCodec( QTextCodec::codecForName("utf8") );
543 answer = ts.read(); 543 answer = ts.read();
544 file.close(); 544 file.close();
545 //qDebug("answer \n%s ", answer.latin1()); 545 //qDebug("answer \n%s ", answer.latin1());
546 getNumFromRecord( answer, ev ) ; 546 getNumFromRecord( answer, ev ) ;
547 547
548 } 548 }
549 else { // change existing 549 else { // change existing
550 //qDebug("canging %d %d",ev->zaurusStat() ,ev->zaurusId() ); 550 //qDebug("canging %d %d",ev->zaurusStat() ,ev->zaurusId() );
551 //command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName; 551 //command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName;
552 changeString += eString + "\n"; 552 changeString += eString + "\n";
553 changeEnt = true; 553 changeEnt = true;
554 554
555 } 555 }
556 } 556 }
557 ev = er.next(); 557 ev = er.next();
558 } 558 }
559 status.setText ( i18n("Changing events ...") ); 559 status.setText ( i18n("Changing events ...") );
560 qApp->processEvents(); 560 qApp->processEvents();
561 //qDebug("changing... "); 561 //qDebug("changing... ");
562 if ( changeEnt ) { 562 if ( changeEnt ) {
563 QFile file( fileName ); 563 QFile file( fileName );
564 if (!file.open( IO_WriteOnly ) ) { 564 if (!file.open( IO_WriteOnly ) ) {
565 return false; 565 return false;
566 566
567 } 567 }
568 QTextStream ts( &file ); 568 QTextStream ts( &file );
569 ts.setCodec( QTextCodec::codecForName("utf8") ); 569 ts.setCodec( QTextCodec::codecForName("utf8") );
570 ts << changeString ; 570 ts << changeString ;
571 file.close(); 571 file.close();
572 command = "db2file datebook -w -g -c " + codec+ " < "+ fileName; 572 command = "db2file datebook -w -g -c " + codec+ " < "+ fileName;
573 system ( command.latin1() ); 573 system ( command.latin1() );
574 //qDebug("command %s file :\n%s ", command.latin1(), changeString.latin1()); 574 //qDebug("command %s file :\n%s ", command.latin1(), changeString.latin1());
575 575
576 } 576 }
577 status.setText ( i18n("Deleting events ...") ); 577 status.setText ( i18n("Deleting events ...") );
578 qApp->processEvents(); 578 qApp->processEvents();
579 //qDebug("deleting... "); 579 //qDebug("deleting... ");
580 if ( deleteEnt ) { 580 if ( deleteEnt ) {
581 QFile file( fileName ); 581 QFile file( fileName );
582 if (!file.open( IO_WriteOnly ) ) { 582 if (!file.open( IO_WriteOnly ) ) {
583 return false; 583 return false;
584 584
585 } 585 }
586 QTextStream ts( &file ); 586 QTextStream ts( &file );
587 ts.setCodec( QTextCodec::codecForName("utf8") ); 587 ts.setCodec( QTextCodec::codecForName("utf8") );
588 ts << deleteString; 588 ts << deleteString;
589 file.close(); 589 file.close();
590 command = "db2file datebook -d -c " + codec+ " < "+ fileName; 590 command = "db2file datebook -d -c " + codec+ " < "+ fileName;
591 system ( command.latin1() ); 591 system ( command.latin1() );
592 // qDebug("command %s file :\n%s ", command.latin1(), deleteString.latin1()); 592 // qDebug("command %s file :\n%s ", command.latin1(), deleteString.latin1());
593 } 593 }
594 594
595 595
596 changeString = tPrefix; 596 changeString = tPrefix;
597 deleteString = tPrefix; 597 deleteString = tPrefix;
598 status.setText ( i18n("Processing todos ...") ); 598 status.setText ( i18n("Processing todos ...") );
599 qApp->processEvents(); 599 qApp->processEvents();
600 QPtrList<Todo> tl = calendar->rawTodos(); 600 QPtrList<Todo> tl = calendar->rawTodos();
601 Todo* to = tl.first(); 601 Todo* to = tl.first();
602 i = 0; 602 i = 0;
603 message = i18n("Processing todo # "); 603 message = i18n("Processing todo # ");
604 procCount = 0; 604 procCount = 0;
605 while ( to ) { 605 while ( to ) {
606 if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { 606 if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) {
607 status.setText ( message + QString::number ( ++procCount ) ); 607 status.setText ( message + QString::number ( ++procCount ) );
608 qApp->processEvents(); 608 qApp->processEvents();
609 QString eString = getTodoString( to ); 609 QString eString = getTodoString( to );
610 if ( to->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete 610 if ( to->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete
611 // deleting empty strings does not work. 611 // deleting empty strings does not work.
612 // we write first and x and then delete the record with the x 612 // we write first and x and then delete the record with the x
613 eString = eString.replace( QRegExp(",\"\""),",\"x\"" ); 613 eString = eString.replace( QRegExp(",\"\""),",\"x\"" );
614 changeString += eString + "\n"; 614 changeString += eString + "\n";
615 deleteString += eString + "\n"; 615 deleteString += eString + "\n";
616 deleteEnt = true; 616 deleteEnt = true;
617 changeEnt = true; 617 changeEnt = true;
618 } 618 }
619 else if ( to->getID("Sharp_DTM").isEmpty() ) { // add new 619 else if ( to->getID("Sharp_DTM").isEmpty() ) { // add new
620 command = "(echo \"" + tPrefix + eString + "\" ) | db2file todo -w -g -c " + codec+ " > "+ fileName; 620 command = "(echo \"" + tPrefix + eString + "\" ) | db2file todo -w -g -c " + codec+ " > "+ fileName;
621 system ( command.utf8() ); 621 system ( command.utf8() );
622 QFile file( fileName ); 622 QFile file( fileName );
623 if (!file.open( IO_ReadOnly ) ) { 623 if (!file.open( IO_ReadOnly ) ) {
624 return false; 624 return false;
625 625
626 } 626 }
627 QTextStream ts( &file ); 627 QTextStream ts( &file );
628 ts.setCodec( QTextCodec::codecForName("utf8") ); 628 ts.setCodec( QTextCodec::codecForName("utf8") );
629 answer = ts.read(); 629 answer = ts.read();
630 file.close(); 630 file.close();
631 //qDebug("answer \n%s ", answer.latin1()); 631 //qDebug("answer \n%s ", answer.latin1());
632 getNumFromRecord( answer, to ) ; 632 getNumFromRecord( answer, to ) ;
633 633
634 } 634 }
635 else { // change existing 635 else { // change existing
636 //qDebug("canging %d %d",to->zaurusStat() ,to->zaurusId() ); 636 //qDebug("canging %d %d",to->zaurusStat() ,to->zaurusId() );
637 //command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName; 637 //command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName;
638 changeString += eString + "\n"; 638 changeString += eString + "\n";
639 changeEnt = true; 639 changeEnt = true;
640 640
641 } 641 }
642 } 642 }
643 643
644 to = tl.next(); 644 to = tl.next();
645 } 645 }
646 status.setText ( i18n("Changing todos ...") ); 646 status.setText ( i18n("Changing todos ...") );
647 qApp->processEvents(); 647 qApp->processEvents();
648 //qDebug("changing... "); 648 //qDebug("changing... ");
649 if ( changeEnt ) { 649 if ( changeEnt ) {
650 QFile file( fileName ); 650 QFile file( fileName );
651 if (!file.open( IO_WriteOnly ) ) { 651 if (!file.open( IO_WriteOnly ) ) {
652 return false; 652 return false;
653 653
654 } 654 }
655 QTextStream ts( &file ); 655 QTextStream ts( &file );
656 ts.setCodec( QTextCodec::codecForName("utf8") ); 656 ts.setCodec( QTextCodec::codecForName("utf8") );
657 ts << changeString ; 657 ts << changeString ;
658 file.close(); 658 file.close();
659 command = "db2file todo -w -g -c " + codec+ " < "+ fileName; 659 command = "db2file todo -w -g -c " + codec+ " < "+ fileName;
660 system ( command.latin1() ); 660 system ( command.latin1() );
661 //qDebug("command %s file :\n%s ", command.latin1(), changeString.latin1()); 661 //qDebug("command %s file :\n%s ", command.latin1(), changeString.latin1());
662 662
663 } 663 }
664 status.setText ( i18n("Deleting todos ...") ); 664 status.setText ( i18n("Deleting todos ...") );
665 qApp->processEvents(); 665 qApp->processEvents();
666 //qDebug("deleting... "); 666 //qDebug("deleting... ");
667 if ( deleteEnt ) { 667 if ( deleteEnt ) {
668 QFile file( fileName ); 668 QFile file( fileName );
669 if (!file.open( IO_WriteOnly ) ) { 669 if (!file.open( IO_WriteOnly ) ) {
670 return false; 670 return false;
671 671
672 } 672 }
673 QTextStream ts( &file ); 673 QTextStream ts( &file );
674 ts.setCodec( QTextCodec::codecForName("utf8") ); 674 ts.setCodec( QTextCodec::codecForName("utf8") );
675 ts << deleteString; 675 ts << deleteString;
676 file.close(); 676 file.close();
677 command = "db2file todo -d -c " + codec+ " < "+ fileName; 677 command = "db2file todo -d -c " + codec+ " < "+ fileName;
678 system ( command.latin1() ); 678 system ( command.latin1() );
679 // qDebug("command %s file :\n%s ", command.latin1(), deleteString.latin1()); 679 // qDebug("command %s file :\n%s ", command.latin1(), deleteString.latin1());
680 } 680 }
681 681
682 return true; 682 return true;
683} 683}
684QString SharpFormat::dtToString( const QDateTime& dti, bool useTZ ) 684QString SharpFormat::dtToString( const QDateTime& dti, bool useTZ )
685{ 685{
686 QString datestr; 686 QString datestr;
687 QString timestr; 687 QString timestr;
688 int offset = KGlobal::locale()->localTimeOffset( dti ); 688 int offset = KGlobal::locale()->localTimeOffset( dti );
689 QDateTime dt; 689 QDateTime dt;
690 if (useTZ) 690 if (useTZ)
691 dt = dti.addSecs ( -(offset*60)); 691 dt = dti.addSecs ( -(offset*60));
692 else 692 else
693 dt = dti; 693 dt = dti;
694 if(dt.date().isValid()){ 694 if(dt.date().isValid()){
695 const QDate& date = dt.date(); 695 const QDate& date = dt.date();
696 datestr.sprintf("%04d%02d%02d", 696 datestr.sprintf("%04d%02d%02d",
697 date.year(), date.month(), date.day()); 697 date.year(), date.month(), date.day());
698 } 698 }
699 if(dt.time().isValid()){ 699 if(dt.time().isValid()){
700 const QTime& time = dt.time(); 700 const QTime& time = dt.time();
701 timestr.sprintf("T%02d%02d%02d", 701 timestr.sprintf("T%02d%02d%02d",
702 time.hour(), time.minute(), time.second()); 702 time.hour(), time.minute(), time.second());
703 } 703 }
704 return datestr + timestr; 704 return datestr + timestr;
705} 705}
706QString SharpFormat::getEventString( Event* event ) 706QString SharpFormat::getEventString( Event* event )
707{ 707{
708 QStringList list; 708 QStringList list;
709 list.append( event->getID("Sharp_DTM") ); 709 list.append( event->getID("Sharp_DTM") );
710 list.append( event->categories().join(",") ); 710 list.append( event->categories().join(",") );
711 if ( !event->summary().isEmpty() ) 711 if ( !event->summary().isEmpty() )
712 list.append( event->summary() ); 712 list.append( event->summary() );
713 else 713 else
714 list.append("" ); 714 list.append("" );
715 if ( !event->location().isEmpty() ) 715 if ( !event->location().isEmpty() )
716 list.append( event->location() ); 716 list.append( event->location() );
717 else 717 else
718 list.append("" ); 718 list.append("" );
719 if ( !event->description().isEmpty() ) 719 if ( !event->description().isEmpty() )
720 list.append( event->description() ); 720 list.append( event->description() );
721 else 721 else
722 list.append( "" ); 722 list.append( "" );
723 if ( event->doesFloat () ) { 723 if ( event->doesFloat () ) {
724 list.append( dtToString( QDateTime(event->dtStart().date(), QTime(0,0,0)), false )); 724 list.append( dtToString( QDateTime(event->dtStart().date(), QTime(0,0,0)), false ));
725 list.append( dtToString( QDateTime(event->dtEnd().date(),QTime(23,59,59)), false )); //6 725 list.append( dtToString( QDateTime(event->dtEnd().date(),QTime(23,59,59)), false )); //6
726 list.append( "1" ); 726 list.append( "1" );
727 727
728 } 728 }
729 else { 729 else {
730 list.append( dtToString( event->dtStart()) ); 730 list.append( dtToString( event->dtStart()) );
731 list.append( dtToString( event->dtEnd()) ); //6 731 list.append( dtToString( event->dtEnd()) ); //6
732 list.append( "0" ); 732 list.append( "0" );
733 } 733 }
734 bool noAlarm = true; 734 bool noAlarm = true;
735 if ( event->alarms().count() > 0 ) { 735 if ( event->alarms().count() > 0 ) {
736 Alarm * al = event->alarms().first(); 736 Alarm * al = event->alarms().first();
737 if ( al->enabled() ) { 737 if ( al->enabled() ) {
738 noAlarm = false; 738 noAlarm = false;
739 list.append( "0" ); // yes, 0 == alarm 739 list.append( "0" ); // yes, 0 == alarm
740 list.append( QString::number( al->startOffset().asSeconds()/(-60) ) ); 740 list.append( QString::number( al->startOffset().asSeconds()/(-60) ) );
741 if ( al->type() == Alarm::Audio ) 741 if ( al->type() == Alarm::Audio )
742 list.append( "1" ); // type audio 742 list.append( "1" ); // type audio
743 else 743 else
744 list.append( "0" ); // type silent 744 list.append( "0" ); // type silent
745 } 745 }
746 } 746 }
747 if ( noAlarm ) { 747 if ( noAlarm ) {
748 list.append( "1" ); // yes, 1 == no alarm 748 list.append( "1" ); // yes, 1 == no alarm
749 list.append( "0" ); // no alarm offset 749 list.append( "0" ); // no alarm offset
750 list.append( "1" ); // type 750 list.append( "1" ); // type
751 } 751 }
752 // next is: 11 752 // next is: 11
753 // next is: 11-16 are recurrence 753 // next is: 11-16 are recurrence
754 Recurrence* rec = event->recurrence(); 754 Recurrence* rec = event->recurrence();
755 755
756 bool writeEndDate = false; 756 bool writeEndDate = false;
757 switch ( rec->doesRecur() ) 757 switch ( rec->doesRecur() )
758 { 758 {
759 case Recurrence::rDaily: // 0 759 case Recurrence::rDaily: // 0
760 list.append( "0" ); 760 list.append( "0" );
761 list.append( QString::number( rec->frequency() ));//12 761 list.append( QString::number( rec->frequency() ));//12
762 list.append( "0" ); 762 list.append( "0" );
763 list.append( "0" ); 763 list.append( "0" );
764 writeEndDate = true; 764 writeEndDate = true;
765 break; 765 break;
766 case Recurrence::rWeekly:// 1 766 case Recurrence::rWeekly:// 1
767 list.append( "1" ); 767 list.append( "1" );
768 list.append( QString::number( rec->frequency()) );//12 768 list.append( QString::number( rec->frequency()) );//12
769 list.append( "0" ); 769 list.append( "0" );
770 { 770 {
771 int days = 0; 771 int days = 0;
772 QBitArray weekDays = rec->days(); 772 QBitArray weekDays = rec->days();
773 int i; 773 int i;
774 for( i = 1; i <= 7; ++i ) { 774 for( i = 1; i <= 7; ++i ) {
775 if ( weekDays[i-1] ) { 775 if ( weekDays[i-1] ) {
776 days += 1 << (i-1); 776 days += 1 << (i-1);
777 } 777 }
778 } 778 }
779 list.append( QString::number( days ) ); 779 list.append( QString::number( days ) );
780 } 780 }
781 //pending weekdays 781 //pending weekdays
782 writeEndDate = true; 782 writeEndDate = true;
783 783
784 break; 784 break;
785 case Recurrence::rMonthlyPos:// 2 785 case Recurrence::rMonthlyPos:// 2
786 list.append( "2" ); 786 list.append( "2" );
787 list.append( QString::number( rec->frequency()) );//12 787 list.append( QString::number( rec->frequency()) );//12
788 788
789 writeEndDate = true; 789 writeEndDate = true;
790 { 790 {
791 int count = 1; 791 int count = 1;
792 QPtrList<Recurrence::rMonthPos> rmp; 792 QPtrList<Recurrence::rMonthPos> rmp;
793 rmp = rec->monthPositions(); 793 rmp = rec->monthPositions();
794 if ( rmp.first()->negative ) 794 if ( rmp.first()->negative )
795 count = 5 - rmp.first()->rPos - 1; 795 count = 5 - rmp.first()->rPos - 1;
796 else 796 else
797 count = rmp.first()->rPos - 1; 797 count = rmp.first()->rPos - 1;
798 list.append( QString::number( count ) ); 798 list.append( QString::number( count ) );
799 799
800 } 800 }
801 801
802 list.append( "0" ); 802 list.append( "0" );
803 break; 803 break;
804 case Recurrence::rMonthlyDay:// 3 804 case Recurrence::rMonthlyDay:// 3
805 list.append( "3" ); 805 list.append( "3" );
806 list.append( QString::number( rec->frequency()) );//12 806 list.append( QString::number( rec->frequency()) );//12
807 list.append( "0" ); 807 list.append( "0" );
808 list.append( "0" ); 808 list.append( "0" );
809 writeEndDate = true; 809 writeEndDate = true;
810 break; 810 break;
811 case Recurrence::rYearlyMonth://4 811 case Recurrence::rYearlyMonth://4
812 list.append( "4" ); 812 list.append( "4" );
813 list.append( QString::number( rec->frequency()) );//12 813 list.append( QString::number( rec->frequency()) );//12
814 list.append( "0" ); 814 list.append( "0" );
815 list.append( "0" ); 815 list.append( "0" );
816 writeEndDate = true; 816 writeEndDate = true;
817 break; 817 break;
818 818
819 default: 819 default:
820 list.append( "255" ); 820 list.append( "255" );
821 list.append( QString() ); 821 list.append( QString() );
822 list.append( "0" ); 822 list.append( "0" );
823 list.append( QString() ); 823 list.append( QString() );
824 list.append( "0" ); 824 list.append( "0" );
825 list.append( "20991231T000000" ); 825 list.append( "20991231T000000" );
826 break; 826 break;
827 } 827 }
828 if ( writeEndDate ) { 828 if ( writeEndDate ) {
829 829
830 if ( rec->endDate().isValid() ) { // 15 + 16 830 if ( rec->endDate().isValid() ) { // 15 + 16
831 list.append( "1" ); 831 list.append( "1" );
832 list.append( dtToString( rec->endDate()) ); 832 list.append( dtToString( rec->endDate()) );
833 } else { 833 } else {
834 list.append( "0" ); 834 list.append( "0" );
835 list.append( "20991231T000000" ); 835 list.append( "20991231T000000" );
836 } 836 }
837 837
838 } 838 }
839 if ( event->doesFloat () ) { 839 if ( event->doesFloat () ) {
840 list.append( dtToString( event->dtStart(), false ).left( 8 )); 840 list.append( dtToString( event->dtStart(), false ).left( 8 ));
841 list.append( dtToString( event->dtEnd(), false ).left( 8 )); //6 841 list.append( dtToString( event->dtEnd(), false ).left( 8 )); //6
842 842
843 } 843 }
844 else { 844 else {
845 list.append( QString() ); 845 list.append( QString() );
846 list.append( QString() ); 846 list.append( QString() );
847 847
848 } 848 }
849 if (event->dtStart().date() == event->dtEnd().date() ) 849 if (event->dtStart().date() == event->dtEnd().date() )
850 list.append( "0" ); 850 list.append( "0" );
851 else 851 else
852 list.append( "1" ); 852 list.append( "1" );
853 853
854 854
855 for(QStringList::Iterator it=list.begin(); 855 for(QStringList::Iterator it=list.begin();
856 it!=list.end(); ++it){ 856 it!=list.end(); ++it){
857 QString& s = (*it); 857 QString& s = (*it);
858 s.replace(QRegExp("\""), "\"\""); 858 s.replace(QRegExp("\""), "\"\"");
859 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){ 859 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){
860 s.prepend('\"'); 860 s.prepend('\"');
861 s.append('\"'); 861 s.append('\"');
862 } else if(s.isEmpty() && !s.isNull()){ 862 } else if(s.isEmpty() && !s.isNull()){
863 s = "\"\""; 863 s = "\"\"";
864 } 864 }
865 } 865 }
866 return list.join(","); 866 return list.join(",");
867 867
868 868
869} 869}
870QString SharpFormat::getTodoString( Todo* todo ) 870QString SharpFormat::getTodoString( Todo* todo )
871{ 871{
872 QStringList list; 872 QStringList list;
873 list.append( todo->getID("Sharp_DTM") ); 873 list.append( todo->getID("Sharp_DTM") );
874 list.append( todo->categories().join(",") ); 874 list.append( todo->categories().join(",") );
875 875
876 if ( todo->hasStartDate() ) { 876 if ( todo->hasStartDate() ) {
877 list.append( dtToString( todo->dtStart()) ); 877 list.append( dtToString( todo->dtStart()) );
878 } else 878 } else
879 list.append( QString() ); 879 list.append( QString() );
880 880
881 if ( todo->hasDueDate() ) { 881 if ( todo->hasDueDate() ) {
882 QTime tim; 882 QTime tim;
883 if ( todo->doesFloat()) { 883 if ( todo->doesFloat()) {
884 list.append( dtToString( QDateTime(todo->dtDue().date(),QTime( 0,0,0 )), false)) ; 884 list.append( dtToString( QDateTime(todo->dtDue().date(),QTime( 0,0,0 )), false)) ;
885 } else { 885 } else {
886 list.append( dtToString(todo->dtDue() ) ); 886 list.append( dtToString(todo->dtDue() ) );
887 } 887 }
888 } else 888 } else
889 list.append( QString() ); 889 list.append( QString() );
890 890
891 if ( todo->isCompleted() ) { 891 if ( todo->isCompleted() ) {
892 list.append( dtToString( todo->completed()) ); 892 list.append( dtToString( todo->completed()) );
893 list.append( "0" ); // yes 0 == completed 893 list.append( "0" ); // yes 0 == completed
894 } else { 894 } else {
diff --git a/libkcal/vcalformat.cpp b/libkcal/vcalformat.cpp
index 076cd3f..9307f12 100644
--- a/libkcal/vcalformat.cpp
+++ b/libkcal/vcalformat.cpp
@@ -1,1028 +1,1033 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 1998 Preston Brwon 3 Copyright (c) 1998 Preston Brwon
4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
5 5
6 This library is free software; you can redistribute it and/or 6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public 7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either 8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version. 9 version 2 of the License, or (at your option) any later version.
10 10
11 This library is distributed in the hope that it will be useful, 11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details. 14 Library General Public License for more details.
15 15
16 You should have received a copy of the GNU Library General Public License 16 You should have received a copy of the GNU Library General Public License
17 along with this library; see the file COPYING.LIB. If not, write to 17 along with this library; see the file COPYING.LIB. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. 19 Boston, MA 02111-1307, USA.
20*/ 20*/
21 21
22#include <qapplication.h> 22#include <qapplication.h>
23#include <qdatetime.h> 23#include <qdatetime.h>
24#include <qstring.h> 24#include <qstring.h>
25#include <qptrlist.h> 25#include <qptrlist.h>
26#include <qregexp.h> 26#include <qregexp.h>
27#include <qclipboard.h> 27#include <qclipboard.h>
28#include <qdialog.h> 28#include <qdialog.h>
29#include <qfile.h> 29#include <qfile.h>
30 30
31#include <kdebug.h> 31#include <kdebug.h>
32#include <kmessagebox.h> 32#include <kmessagebox.h>
33#include <kiconloader.h> 33#include <kiconloader.h>
34#include <klocale.h> 34#include <klocale.h>
35 35
36#include "vcc.h" 36#include "vcc.h"
37#include "vobject.h" 37#include "vobject.h"
38 38
39#include "vcaldrag.h" 39#include "vcaldrag.h"
40#include "calendar.h" 40#include "calendar.h"
41 41
42#include "vcalformat.h" 42#include "vcalformat.h"
43 43
44using namespace KCal; 44using namespace KCal;
45 45
46VCalFormat::VCalFormat() 46VCalFormat::VCalFormat()
47{ 47{
48 mCalendar = 0; 48 mCalendar = 0;
49} 49}
50 50
51VCalFormat::~VCalFormat() 51VCalFormat::~VCalFormat()
52{ 52{
53} 53}
54 54
55bool VCalFormat::load(Calendar *calendar, const QString &fileName) 55bool VCalFormat::load(Calendar *calendar, const QString &fileName)
56{ 56{
57 mCalendar = calendar; 57 mCalendar = calendar;
58 58
59 clearException(); 59 clearException();
60 60
61 kdDebug(5800) << "VCalFormat::load() " << fileName << endl; 61 kdDebug(5800) << "VCalFormat::load() " << fileName << endl;
62 62
63 VObject *vcal = 0; 63 VObject *vcal = 0;
64 64
65 // this is not necessarily only 1 vcal. Could be many vcals, or include 65 // this is not necessarily only 1 vcal. Could be many vcals, or include
66 // a vcard... 66 // a vcard...
67 vcal = Parse_MIME_FromFileName(const_cast<char *>(QFile::encodeName(fileName).data())); 67 vcal = Parse_MIME_FromFileName(const_cast<char *>(QFile::encodeName(fileName).data()));
68 68
69 if (!vcal) { 69 if (!vcal) {
70 setException(new ErrorFormat(ErrorFormat::CalVersionUnknown)); 70 setException(new ErrorFormat(ErrorFormat::CalVersionUnknown));
71 return FALSE; 71 return FALSE;
72 } 72 }
73 73
74 // any other top-level calendar stuff should be added/initialized here 74 // any other top-level calendar stuff should be added/initialized here
75 75
76 // put all vobjects into their proper places 76 // put all vobjects into their proper places
77 populate(vcal); 77 populate(vcal);
78 78
79 // clean up from vcal API stuff 79 // clean up from vcal API stuff
80 cleanVObjects(vcal); 80 cleanVObjects(vcal);
81 cleanStrTbl(); 81 cleanStrTbl();
82 82
83 return true; 83 return true;
84} 84}
85 85
86 86
87bool VCalFormat::save(Calendar *calendar, const QString &fileName) 87bool VCalFormat::save(Calendar *calendar, const QString &fileName)
88{ 88{
89 mCalendar = calendar; 89 mCalendar = calendar;
90 90
91 QString tmpStr; 91 QString tmpStr;
92 VObject *vcal, *vo; 92 VObject *vcal, *vo;
93 93
94 kdDebug(5800) << "VCalFormat::save(): " << fileName << endl; 94 kdDebug(5800) << "VCalFormat::save(): " << fileName << endl;
95 95
96 vcal = newVObject(VCCalProp); 96 vcal = newVObject(VCCalProp);
97 97
98 // addPropValue(vcal,VCLocationProp, "0.0"); 98 // addPropValue(vcal,VCLocationProp, "0.0");
99 addPropValue(vcal,VCProdIdProp, productId()); 99 addPropValue(vcal,VCProdIdProp, productId());
100 tmpStr = mCalendar->getTimeZoneStr(); 100 tmpStr = mCalendar->getTimeZoneStr();
101 //qDebug("mCalendar->getTimeZoneStr() %s",tmpStr.latin1() ); 101 //qDebug("mCalendar->getTimeZoneStr() %s",tmpStr.latin1() );
102 addPropValue(vcal,VCTimeZoneProp, tmpStr.local8Bit()); 102 addPropValue(vcal,VCTimeZoneProp, tmpStr.local8Bit());
103 addPropValue(vcal,VCVersionProp, _VCAL_VERSION); 103 addPropValue(vcal,VCVersionProp, _VCAL_VERSION);
104 104
105 // TODO STUFF 105 // TODO STUFF
106 QPtrList<Todo> todoList = mCalendar->rawTodos(); 106 QPtrList<Todo> todoList = mCalendar->rawTodos();
107 QPtrListIterator<Todo> qlt(todoList); 107 QPtrListIterator<Todo> qlt(todoList);
108 for (; qlt.current(); ++qlt) { 108 for (; qlt.current(); ++qlt) {
109 vo = eventToVTodo(qlt.current()); 109 vo = eventToVTodo(qlt.current());
110 addVObjectProp(vcal, vo); 110 addVObjectProp(vcal, vo);
111 } 111 }
112 112
113 // EVENT STUFF 113 // EVENT STUFF
114 QPtrList<Event> events = mCalendar->rawEvents(); 114 QPtrList<Event> events = mCalendar->rawEvents();
115 Event *ev; 115 Event *ev;
116 for(ev=events.first();ev;ev=events.next()) { 116 for(ev=events.first();ev;ev=events.next()) {
117 vo = eventToVEvent(ev); 117 vo = eventToVEvent(ev);
118 addVObjectProp(vcal, vo); 118 addVObjectProp(vcal, vo);
119 } 119 }
120 120
121 writeVObjectToFile(QFile::encodeName(fileName).data() ,vcal); 121 writeVObjectToFile(QFile::encodeName(fileName).data() ,vcal);
122 cleanVObjects(vcal); 122 cleanVObjects(vcal);
123 cleanStrTbl(); 123 cleanStrTbl();
124 124
125 if (QFile::exists(fileName)) { 125 if (QFile::exists(fileName)) {
126 kdDebug(5800) << "No error" << endl; 126 kdDebug(5800) << "No error" << endl;
127 return true; 127 return true;
128 } else { 128 } else {
129 kdDebug(5800) << "Error" << endl; 129 kdDebug(5800) << "Error" << endl;
130 return false; // error 130 return false; // error
131 } 131 }
132} 132}
133 133
134bool VCalFormat::fromString( Calendar *calendar, const QString &text ) 134bool VCalFormat::fromString( Calendar *calendar, const QString &text )
135{ 135{
136 // TODO: Factor out VCalFormat::fromString() 136 // TODO: Factor out VCalFormat::fromString()
137 137
138 QCString data = text.utf8(); 138 QCString data = text.utf8();
139 139
140 if ( !data.size() ) return false; 140 if ( !data.size() ) return false;
141 141
142 VObject *vcal = Parse_MIME( data.data(), data.size()); 142 VObject *vcal = Parse_MIME( data.data(), data.size());
143 if ( !vcal ) return false; 143 if ( !vcal ) return false;
144 144
145 VObjectIterator i; 145 VObjectIterator i;
146 VObject *curvo; 146 VObject *curvo;
147 initPropIterator( &i, vcal ); 147 initPropIterator( &i, vcal );
148 148
149 // we only take the first object. TODO: parse all incidences. 149 // we only take the first object. TODO: parse all incidences.
150 do { 150 do {
151 curvo = nextVObject( &i ); 151 curvo = nextVObject( &i );
152 } while ( strcmp( vObjectName( curvo ), VCEventProp ) && 152 } while ( strcmp( vObjectName( curvo ), VCEventProp ) &&
153 strcmp( vObjectName( curvo ), VCTodoProp ) ); 153 strcmp( vObjectName( curvo ), VCTodoProp ) );
154 154
155 if ( strcmp( vObjectName( curvo ), VCEventProp ) == 0 ) { 155 if ( strcmp( vObjectName( curvo ), VCEventProp ) == 0 ) {
156 Event *event = VEventToEvent( curvo ); 156 Event *event = VEventToEvent( curvo );
157 calendar->addEvent( event ); 157 calendar->addEvent( event );
158 } else { 158 } else {
159 kdDebug(5800) << "VCalFormat::fromString(): Unknown object type." << endl; 159 kdDebug(5800) << "VCalFormat::fromString(): Unknown object type." << endl;
160 deleteVObject( vcal ); 160 deleteVObject( vcal );
161 return false; 161 return false;
162 } 162 }
163 163
164 deleteVObject( vcal ); 164 deleteVObject( vcal );
165 165
166 return true; 166 return true;
167} 167}
168 168
169QString VCalFormat::eventToString( Event * event, Calendar *calendar) 169QString VCalFormat::eventToString( Event * event, Calendar *calendar)
170{ 170{
171 if ( !event ) return QString::null; 171 if ( !event ) return QString::null;
172 mCalendar = calendar; 172 mCalendar = calendar;
173 VObject *vevent = eventToVEvent( event ); 173 VObject *vevent = eventToVEvent( event );
174 char *buf = writeMemVObject( 0, 0, vevent ); 174 char *buf = writeMemVObject( 0, 0, vevent );
175 QString result( buf ); 175 QString result( buf );
176 cleanVObject( vevent ); 176 cleanVObject( vevent );
177 return result; 177 return result;
178} 178}
179QString VCalFormat::todoToString( Todo * todo, Calendar *calendar ) 179QString VCalFormat::todoToString( Todo * todo, Calendar *calendar )
180{ 180{
181 if ( !todo ) return QString::null; 181 if ( !todo ) return QString::null;
182 mCalendar = calendar; 182 mCalendar = calendar;
183 VObject *vevent = eventToVTodo( todo ); 183 VObject *vevent = eventToVTodo( todo );
184 char *buf = writeMemVObject( 0, 0, vevent ); 184 char *buf = writeMemVObject( 0, 0, vevent );
185 QString result( buf ); 185 QString result( buf );
186 cleanVObject( vevent ); 186 cleanVObject( vevent );
187 return result; 187 return result;
188} 188}
189 189
190QString VCalFormat::toString( Calendar *calendar ) 190QString VCalFormat::toString( Calendar *calendar )
191{ 191{
192 // TODO: Factor out VCalFormat::asString() 192 // TODO: Factor out VCalFormat::asString()
193 193
194 VObject *vcal = newVObject(VCCalProp); 194 VObject *vcal = newVObject(VCCalProp);
195 195
196 addPropValue( vcal, VCProdIdProp, CalFormat::productId() ); 196 addPropValue( vcal, VCProdIdProp, CalFormat::productId() );
197 QString tmpStr = mCalendar->getTimeZoneStr(); 197 QString tmpStr = mCalendar->getTimeZoneStr();
198 addPropValue( vcal, VCTimeZoneProp, tmpStr.local8Bit() ); 198 addPropValue( vcal, VCTimeZoneProp, tmpStr.local8Bit() );
199 addPropValue( vcal, VCVersionProp, _VCAL_VERSION ); 199 addPropValue( vcal, VCVersionProp, _VCAL_VERSION );
200 200
201 // TODO: Use all data. 201 // TODO: Use all data.
202 QPtrList<Event> events = calendar->events(); 202 QPtrList<Event> events = calendar->events();
203 Event *event = events.first(); 203 Event *event = events.first();
204 if ( !event ) return QString::null; 204 if ( !event ) return QString::null;
205 205
206 VObject *vevent = eventToVEvent( event ); 206 VObject *vevent = eventToVEvent( event );
207 207
208 addVObjectProp( vcal, vevent ); 208 addVObjectProp( vcal, vevent );
209 209
210 char *buf = writeMemVObject( 0, 0, vcal ); 210 char *buf = writeMemVObject( 0, 0, vcal );
211 211
212 QString result( buf ); 212 QString result( buf );
213 213
214 cleanVObject( vcal ); 214 cleanVObject( vcal );
215 215
216 return result; 216 return result;
217} 217}
218 218
219VObject *VCalFormat::eventToVTodo(const Todo *anEvent) 219VObject *VCalFormat::eventToVTodo(const Todo *anEvent)
220{ 220{
221 VObject *vtodo; 221 VObject *vtodo;
222 QString tmpStr; 222 QString tmpStr;
223 QStringList tmpStrList; 223 QStringList tmpStrList;
224 224
225 vtodo = newVObject(VCTodoProp); 225 vtodo = newVObject(VCTodoProp);
226 226
227 // due date 227 // due date
228 if (anEvent->hasDueDate()) { 228 if (anEvent->hasDueDate()) {
229 tmpStr = qDateTimeToISO(anEvent->dtDue(), 229 tmpStr = qDateTimeToISO(anEvent->dtDue(),
230 !anEvent->doesFloat()); 230 !anEvent->doesFloat());
231 addPropValue(vtodo, VCDueProp, tmpStr.local8Bit()); 231 addPropValue(vtodo, VCDueProp, tmpStr.local8Bit());
232 } 232 }
233 233
234 // start date 234 // start date
235 if (anEvent->hasStartDate()) { 235 if (anEvent->hasStartDate()) {
236 tmpStr = qDateTimeToISO(anEvent->dtStart(), 236 tmpStr = qDateTimeToISO(anEvent->dtStart(),
237 !anEvent->doesFloat()); 237 !anEvent->doesFloat());
238 addPropValue(vtodo, VCDTstartProp, tmpStr.local8Bit()); 238 addPropValue(vtodo, VCDTstartProp, tmpStr.local8Bit());
239 } 239 }
240 240
241 // creation date 241 // creation date
242 tmpStr = qDateTimeToISO(anEvent->created()); 242 tmpStr = qDateTimeToISO(anEvent->created());
243 addPropValue(vtodo, VCDCreatedProp, tmpStr.local8Bit()); 243 addPropValue(vtodo, VCDCreatedProp, tmpStr.local8Bit());
244 244
245 // unique id 245 // unique id
246 addPropValue(vtodo, VCUniqueStringProp, 246 addPropValue(vtodo, VCUniqueStringProp,
247 anEvent->uid().local8Bit()); 247 anEvent->uid().local8Bit());
248 248
249 // revision 249 // revision
250 tmpStr.sprintf("%i", anEvent->revision()); 250 tmpStr.sprintf("%i", anEvent->revision());
251 addPropValue(vtodo, VCSequenceProp, tmpStr.local8Bit()); 251 addPropValue(vtodo, VCSequenceProp, tmpStr.local8Bit());
252 252
253 // last modification date 253 // last modification date
254 tmpStr = qDateTimeToISO(anEvent->lastModified()); 254 tmpStr = qDateTimeToISO(anEvent->lastModified());
255 addPropValue(vtodo, VCLastModifiedProp, tmpStr.local8Bit()); 255 addPropValue(vtodo, VCLastModifiedProp, tmpStr.local8Bit());
256 256
257 // organizer stuff 257 // organizer stuff
258 tmpStr = "MAILTO:" + anEvent->organizer(); 258 tmpStr = "MAILTO:" + anEvent->organizer();
259 addPropValue(vtodo, ICOrganizerProp, tmpStr.local8Bit()); 259 addPropValue(vtodo, ICOrganizerProp, tmpStr.local8Bit());
260 260
261 // attendees 261 // attendees
262 if (anEvent->attendeeCount() != 0) { 262 if (anEvent->attendeeCount() != 0) {
263 QPtrList<Attendee> al = anEvent->attendees(); 263 QPtrList<Attendee> al = anEvent->attendees();
264 QPtrListIterator<Attendee> ai(al); 264 QPtrListIterator<Attendee> ai(al);
265 Attendee *curAttendee; 265 Attendee *curAttendee;
266 266
267 for (; ai.current(); ++ai) { 267 for (; ai.current(); ++ai) {
268 curAttendee = ai.current(); 268 curAttendee = ai.current();
269 if (!curAttendee->email().isEmpty() && 269 if (!curAttendee->email().isEmpty() &&
270 !curAttendee->name().isEmpty()) 270 !curAttendee->name().isEmpty())
271 tmpStr = "MAILTO:" + curAttendee->name() + " <" + 271 tmpStr = "MAILTO:" + curAttendee->name() + " <" +
272 curAttendee->email() + ">"; 272 curAttendee->email() + ">";
273 else if (curAttendee->name().isEmpty()) 273 else if (curAttendee->name().isEmpty())
274 tmpStr = "MAILTO: " + curAttendee->email(); 274 tmpStr = "MAILTO: " + curAttendee->email();
275 else if (curAttendee->email().isEmpty()) 275 else if (curAttendee->email().isEmpty())
276 tmpStr = "MAILTO: " + curAttendee->name(); 276 tmpStr = "MAILTO: " + curAttendee->name();
277 else if (curAttendee->name().isEmpty() && 277 else if (curAttendee->name().isEmpty() &&
278 curAttendee->email().isEmpty()) 278 curAttendee->email().isEmpty())
279 kdDebug(5800) << "warning! this Event has an attendee w/o name or email!" << endl; 279 kdDebug(5800) << "warning! this Event has an attendee w/o name or email!" << endl;
280 VObject *aProp = addPropValue(vtodo, VCAttendeeProp, tmpStr.local8Bit()); 280 VObject *aProp = addPropValue(vtodo, VCAttendeeProp, tmpStr.local8Bit());
281 addPropValue(aProp, VCRSVPProp, curAttendee->RSVP() ? "TRUE" : "FALSE"); 281 addPropValue(aProp, VCRSVPProp, curAttendee->RSVP() ? "TRUE" : "FALSE");
282 addPropValue(aProp, VCStatusProp, writeStatus(curAttendee->status())); 282 addPropValue(aProp, VCStatusProp, writeStatus(curAttendee->status()));
283 } 283 }
284 } 284 }
285 285
286 // description BL: 286 // description BL:
287 if (!anEvent->description().isEmpty()) { 287 if (!anEvent->description().isEmpty()) {
288 VObject *d = addPropValue(vtodo, VCDescriptionProp, 288 VObject *d = addPropValue(vtodo, VCDescriptionProp,
289 anEvent->description().local8Bit()); 289 anEvent->description().local8Bit());
290 if (anEvent->description().find('\n') != -1) 290 if (anEvent->description().find('\n') != -1)
291 addProp(d, VCQuotedPrintableProp); 291 addProp(d, VCQuotedPrintableProp);
292 } 292 }
293 293
294 // summary 294 // summary
295 if (!anEvent->summary().isEmpty()) 295 if (!anEvent->summary().isEmpty())
296 addPropValue(vtodo, VCSummaryProp, anEvent->summary().local8Bit()); 296 addPropValue(vtodo, VCSummaryProp, anEvent->summary().local8Bit());
297 297
298 if (!anEvent->location().isEmpty()) 298 if (!anEvent->location().isEmpty())
299 addPropValue(vtodo, VCLocationProp, anEvent->location().local8Bit()); 299 addPropValue(vtodo, VCLocationProp, anEvent->location().local8Bit());
300 300
301 // completed 301 // completed
302 // status 302 // status
303 // backward compatibility, KOrganizer used to interpret only these two values 303 // backward compatibility, KOrganizer used to interpret only these two values
304 addPropValue(vtodo, VCStatusProp, anEvent->isCompleted() ? "COMPLETED" : 304 addPropValue(vtodo, VCStatusProp, anEvent->isCompleted() ? "COMPLETED" :
305 "NEEDS_ACTION"); 305 "NEEDS_ACTION");
306 // completion date 306 // completion date
307 if (anEvent->hasCompletedDate()) { 307 if (anEvent->hasCompletedDate()) {
308 tmpStr = qDateTimeToISO(anEvent->completed()); 308 tmpStr = qDateTimeToISO(anEvent->completed());
309 addPropValue(vtodo, VCCompletedProp, tmpStr.local8Bit()); 309 addPropValue(vtodo, VCCompletedProp, tmpStr.local8Bit());
310 } 310 }
311 311
312 // priority 312 // priority
313 tmpStr.sprintf("%i",anEvent->priority()); 313 tmpStr.sprintf("%i",anEvent->priority());
314 addPropValue(vtodo, VCPriorityProp, tmpStr.local8Bit()); 314 addPropValue(vtodo, VCPriorityProp, tmpStr.local8Bit());
315 315
316 // related event 316 // related event
317 if (anEvent->relatedTo()) { 317 if (anEvent->relatedTo()) {
318 addPropValue(vtodo, VCRelatedToProp, 318 addPropValue(vtodo, VCRelatedToProp,
319 anEvent->relatedTo()->uid().local8Bit()); 319 anEvent->relatedTo()->uid().local8Bit());
320 } 320 }
321 321
322 // categories 322 // categories
323 tmpStrList = anEvent->categories(); 323 tmpStrList = anEvent->categories();
324 tmpStr = ""; 324 tmpStr = "";
325 QString catStr; 325 QString catStr;
326 for ( QStringList::Iterator it = tmpStrList.begin(); 326 for ( QStringList::Iterator it = tmpStrList.begin();
327 it != tmpStrList.end(); 327 it != tmpStrList.end();
328 ++it ) { 328 ++it ) {
329 catStr = *it; 329 catStr = *it;
330 if (catStr[0] == ' ') 330 if (catStr[0] == ' ')
331 tmpStr += catStr.mid(1); 331 tmpStr += catStr.mid(1);
332 else 332 else
333 tmpStr += catStr; 333 tmpStr += catStr;
334 // this must be a ';' character as the vCalendar specification requires! 334 // this must be a ';' character as the vCalendar specification requires!
335 // vcc.y has been hacked to translate the ';' to a ',' when the vcal is 335 // vcc.y has been hacked to translate the ';' to a ',' when the vcal is
336 // read in. 336 // read in.
337 tmpStr += ";"; 337 tmpStr += ";";
338 } 338 }
339 if (!tmpStr.isEmpty()) { 339 if (!tmpStr.isEmpty()) {
340 tmpStr.truncate(tmpStr.length()-1); 340 tmpStr.truncate(tmpStr.length()-1);
341 addPropValue(vtodo, VCCategoriesProp, tmpStr.local8Bit()); 341 addPropValue(vtodo, VCCategoriesProp, tmpStr.local8Bit());
342 } 342 }
343 343
344 // alarm stuff 344 // alarm stuff
345 kdDebug(5800) << "vcalformat::eventToVTodo was called" << endl; 345 kdDebug(5800) << "vcalformat::eventToVTodo was called" << endl;
346 QPtrList<Alarm> alarms = anEvent->alarms(); 346 QPtrList<Alarm> alarms = anEvent->alarms();
347 Alarm* alarm; 347 Alarm* alarm;
348 for (alarm = alarms.first(); alarm; alarm = alarms.next()) { 348 for (alarm = alarms.first(); alarm; alarm = alarms.next()) {
349 if (alarm->enabled()) { 349 if (alarm->enabled()) {
350 VObject *a = addProp(vtodo, VCDAlarmProp); 350 VObject *a;
351 tmpStr = qDateTimeToISO(alarm->time()); 351 tmpStr = qDateTimeToISO(alarm->time());
352 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit()); 352 if (alarm->type() == Alarm::Audio) {
353 addPropValue(a, VCRepeatCountProp, "1"); 353 a = addProp(vtodo, VCAAlarmProp);
354 addPropValue(a, VCDisplayStringProp, "beep!"); 354 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
355 if (alarm->type() == Alarm::Audio) { 355 addPropValue(a, VCRepeatCountProp, "1");
356 a = addProp(vtodo, VCAAlarmProp); 356 addPropValue(a, VCAudioContentProp, QFile::encodeName(alarm->audioFile()));
357 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit()); 357 }
358 addPropValue(a, VCRepeatCountProp, "1"); 358 else if (alarm->type() == Alarm::Procedure) {
359 addPropValue(a, VCAudioContentProp, QFile::encodeName(alarm->audioFile())); 359 a = addProp(vtodo, VCPAlarmProp);
360 } 360 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
361 else if (alarm->type() == Alarm::Procedure) { 361 addPropValue(a, VCRepeatCountProp, "1");
362 a = addProp(vtodo, VCPAlarmProp); 362 addPropValue(a, VCProcedureNameProp, QFile::encodeName(alarm->programFile()));
363 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit()); 363 } else {
364 addPropValue(a, VCRepeatCountProp, "1"); 364 a = addProp(vtodo, VCDAlarmProp);
365 addPropValue(a, VCProcedureNameProp, QFile::encodeName(alarm->programFile())); 365 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
366 addPropValue(a, VCRepeatCountProp, "1");
367 addPropValue(a, VCDisplayStringProp, "beep!");
366 } 368 }
367 } 369 }
368 } 370 }
369 371
370 if (anEvent->pilotId()) { 372 if (anEvent->pilotId()) {
371 // pilot sync stuff 373 // pilot sync stuff
372 tmpStr.sprintf("%i",anEvent->pilotId()); 374 tmpStr.sprintf("%i",anEvent->pilotId());
373 addPropValue(vtodo, XPilotIdProp, tmpStr.local8Bit()); 375 addPropValue(vtodo, XPilotIdProp, tmpStr.local8Bit());
374 tmpStr.sprintf("%i",anEvent->syncStatus()); 376 tmpStr.sprintf("%i",anEvent->syncStatus());
375 addPropValue(vtodo, XPilotStatusProp, tmpStr.local8Bit()); 377 addPropValue(vtodo, XPilotStatusProp, tmpStr.local8Bit());
376 } 378 }
377 379
378 return vtodo; 380 return vtodo;
379} 381}
380 382
381VObject* VCalFormat::eventToVEvent(const Event *anEvent) 383VObject* VCalFormat::eventToVEvent(const Event *anEvent)
382{ 384{
383 VObject *vevent; 385 VObject *vevent;
384 QString tmpStr; 386 QString tmpStr;
385 QStringList tmpStrList; 387 QStringList tmpStrList;
386 388
387 vevent = newVObject(VCEventProp); 389 vevent = newVObject(VCEventProp);
388 390
389 // start and end time 391 // start and end time
390 tmpStr = qDateTimeToISO(anEvent->dtStart(), 392 tmpStr = qDateTimeToISO(anEvent->dtStart(),
391 !anEvent->doesFloat()); 393 !anEvent->doesFloat());
392 addPropValue(vevent, VCDTstartProp, tmpStr.local8Bit()); 394 addPropValue(vevent, VCDTstartProp, tmpStr.local8Bit());
393 395
394 // events that have time associated but take up no time should 396 // events that have time associated but take up no time should
395 // not have both DTSTART and DTEND. 397 // not have both DTSTART and DTEND.
396 if (anEvent->dtStart() != anEvent->dtEnd()) { 398 if (anEvent->dtStart() != anEvent->dtEnd()) {
397 tmpStr = qDateTimeToISO(anEvent->dtEnd(), 399 tmpStr = qDateTimeToISO(anEvent->dtEnd(),
398 !anEvent->doesFloat()); 400 !anEvent->doesFloat());
399 addPropValue(vevent, VCDTendProp, tmpStr.local8Bit()); 401 addPropValue(vevent, VCDTendProp, tmpStr.local8Bit());
400 } 402 }
401 403
402 // creation date 404 // creation date
403 tmpStr = qDateTimeToISO(anEvent->created()); 405 tmpStr = qDateTimeToISO(anEvent->created());
404 addPropValue(vevent, VCDCreatedProp, tmpStr.local8Bit()); 406 addPropValue(vevent, VCDCreatedProp, tmpStr.local8Bit());
405 407
406 // unique id 408 // unique id
407 addPropValue(vevent, VCUniqueStringProp, 409 addPropValue(vevent, VCUniqueStringProp,
408 anEvent->uid().local8Bit()); 410 anEvent->uid().local8Bit());
409 411
410 // revision 412 // revision
411 tmpStr.sprintf("%i", anEvent->revision()); 413 tmpStr.sprintf("%i", anEvent->revision());
412 addPropValue(vevent, VCSequenceProp, tmpStr.local8Bit()); 414 addPropValue(vevent, VCSequenceProp, tmpStr.local8Bit());
413 415
414 // last modification date 416 // last modification date
415 tmpStr = qDateTimeToISO(anEvent->lastModified()); 417 tmpStr = qDateTimeToISO(anEvent->lastModified());
416 addPropValue(vevent, VCLastModifiedProp, tmpStr.local8Bit()); 418 addPropValue(vevent, VCLastModifiedProp, tmpStr.local8Bit());
417 419
418 // attendee and organizer stuff 420 // attendee and organizer stuff
419 tmpStr = "MAILTO:" + anEvent->organizer(); 421 tmpStr = "MAILTO:" + anEvent->organizer();
420 addPropValue(vevent, ICOrganizerProp, tmpStr.local8Bit()); 422 addPropValue(vevent, ICOrganizerProp, tmpStr.local8Bit());
421 423
422 if (anEvent->attendeeCount() != 0) { 424 if (anEvent->attendeeCount() != 0) {
423 QPtrList<Attendee> al = anEvent->attendees(); 425 QPtrList<Attendee> al = anEvent->attendees();
424 QPtrListIterator<Attendee> ai(al); 426 QPtrListIterator<Attendee> ai(al);
425 Attendee *curAttendee; 427 Attendee *curAttendee;
426 428
427 // TODO: Put this functionality into Attendee class 429 // TODO: Put this functionality into Attendee class
428 for (; ai.current(); ++ai) { 430 for (; ai.current(); ++ai) {
429 curAttendee = ai.current(); 431 curAttendee = ai.current();
430 if (!curAttendee->email().isEmpty() && 432 if (!curAttendee->email().isEmpty() &&
431 !curAttendee->name().isEmpty()) 433 !curAttendee->name().isEmpty())
432 tmpStr = "MAILTO:" + curAttendee->name() + " <" + 434 tmpStr = "MAILTO:" + curAttendee->name() + " <" +
433 curAttendee->email() + ">"; 435 curAttendee->email() + ">";
434 else if (curAttendee->name().isEmpty()) 436 else if (curAttendee->name().isEmpty())
435 tmpStr = "MAILTO: " + curAttendee->email(); 437 tmpStr = "MAILTO: " + curAttendee->email();
436 else if (curAttendee->email().isEmpty()) 438 else if (curAttendee->email().isEmpty())
437 tmpStr = "MAILTO: " + curAttendee->name(); 439 tmpStr = "MAILTO: " + curAttendee->name();
438 else if (curAttendee->name().isEmpty() && 440 else if (curAttendee->name().isEmpty() &&
439 curAttendee->email().isEmpty()) 441 curAttendee->email().isEmpty())
440 kdDebug(5800) << "warning! this Event has an attendee w/o name or email!" << endl; 442 kdDebug(5800) << "warning! this Event has an attendee w/o name or email!" << endl;
441 VObject *aProp = addPropValue(vevent, VCAttendeeProp, tmpStr.local8Bit()); 443 VObject *aProp = addPropValue(vevent, VCAttendeeProp, tmpStr.local8Bit());
442 addPropValue(aProp, VCRSVPProp, curAttendee->RSVP() ? "TRUE" : "FALSE");; 444 addPropValue(aProp, VCRSVPProp, curAttendee->RSVP() ? "TRUE" : "FALSE");;
443 addPropValue(aProp, VCStatusProp, writeStatus(curAttendee->status())); 445 addPropValue(aProp, VCStatusProp, writeStatus(curAttendee->status()));
444 } 446 }
445 } 447 }
446 448
447 // recurrence rule stuff 449 // recurrence rule stuff
448 if (anEvent->recurrence()->doesRecur()) { 450 if (anEvent->recurrence()->doesRecur()) {
449 // some more variables 451 // some more variables
450 QPtrList<Recurrence::rMonthPos> tmpPositions; 452 QPtrList<Recurrence::rMonthPos> tmpPositions;
451 QPtrList<int> tmpDays; 453 QPtrList<int> tmpDays;
452 int *tmpDay; 454 int *tmpDay;
453 Recurrence::rMonthPos *tmpPos; 455 Recurrence::rMonthPos *tmpPos;
454 QString tmpStr2; 456 QString tmpStr2;
455 int i; 457 int i;
456 458
457 switch(anEvent->recurrence()->doesRecur()) { 459 switch(anEvent->recurrence()->doesRecur()) {
458 case Recurrence::rDaily: 460 case Recurrence::rDaily:
459 tmpStr.sprintf("D%i ",anEvent->recurrence()->frequency()); 461 tmpStr.sprintf("D%i ",anEvent->recurrence()->frequency());
460// if (anEvent->rDuration > 0) 462// if (anEvent->rDuration > 0)
461 //tmpStr += "#"; 463 //tmpStr += "#";
462 break; 464 break;
463 case Recurrence::rWeekly: 465 case Recurrence::rWeekly:
464 tmpStr.sprintf("W%i ",anEvent->recurrence()->frequency()); 466 tmpStr.sprintf("W%i ",anEvent->recurrence()->frequency());
465 for (i = 0; i < 7; i++) { 467 for (i = 0; i < 7; i++) {
466 if (anEvent->recurrence()->days().testBit(i)) 468 if (anEvent->recurrence()->days().testBit(i))
467 tmpStr += dayFromNum(i); 469 tmpStr += dayFromNum(i);
468 } 470 }
469 break; 471 break;
470 case Recurrence::rMonthlyPos: 472 case Recurrence::rMonthlyPos:
471 tmpStr.sprintf("MP%i ", anEvent->recurrence()->frequency()); 473 tmpStr.sprintf("MP%i ", anEvent->recurrence()->frequency());
472 // write out all rMonthPos's 474 // write out all rMonthPos's
473 tmpPositions = anEvent->recurrence()->monthPositions(); 475 tmpPositions = anEvent->recurrence()->monthPositions();
474 for (tmpPos = tmpPositions.first(); 476 for (tmpPos = tmpPositions.first();
475 tmpPos; 477 tmpPos;
476 tmpPos = tmpPositions.next()) { 478 tmpPos = tmpPositions.next()) {
477 479
478 tmpStr2.sprintf("%i", tmpPos->rPos); 480 tmpStr2.sprintf("%i", tmpPos->rPos);
479 if (tmpPos->negative) 481 if (tmpPos->negative)
480 tmpStr2 += "- "; 482 tmpStr2 += "- ";
481 else 483 else
482 tmpStr2 += "+ "; 484 tmpStr2 += "+ ";
483 tmpStr += tmpStr2; 485 tmpStr += tmpStr2;
484 for (i = 0; i < 7; i++) { 486 for (i = 0; i < 7; i++) {
485 if (tmpPos->rDays.testBit(i)) 487 if (tmpPos->rDays.testBit(i))
486 tmpStr += dayFromNum(i); 488 tmpStr += dayFromNum(i);
487 } 489 }
488 } // loop for all rMonthPos's 490 } // loop for all rMonthPos's
489 break; 491 break;
490 case Recurrence::rMonthlyDay: 492 case Recurrence::rMonthlyDay:
491 tmpStr.sprintf("MD%i ", anEvent->recurrence()->frequency()); 493 tmpStr.sprintf("MD%i ", anEvent->recurrence()->frequency());
492 // write out all rMonthDays; 494 // write out all rMonthDays;
493 tmpDays = anEvent->recurrence()->monthDays(); 495 tmpDays = anEvent->recurrence()->monthDays();
494 for (tmpDay = tmpDays.first(); 496 for (tmpDay = tmpDays.first();
495 tmpDay; 497 tmpDay;
496 tmpDay = tmpDays.next()) { 498 tmpDay = tmpDays.next()) {
497 tmpStr2.sprintf("%i ", *tmpDay); 499 tmpStr2.sprintf("%i ", *tmpDay);
498 tmpStr += tmpStr2; 500 tmpStr += tmpStr2;
499 } 501 }
500 break; 502 break;
501 case Recurrence::rYearlyMonth: 503 case Recurrence::rYearlyMonth:
502 tmpStr.sprintf("YM%i ", anEvent->recurrence()->frequency()); 504 tmpStr.sprintf("YM%i ", anEvent->recurrence()->frequency());
503 // write out all the rYearNums; 505 // write out all the rYearNums;
504 tmpDays = anEvent->recurrence()->yearNums(); 506 tmpDays = anEvent->recurrence()->yearNums();
505 for (tmpDay = tmpDays.first(); 507 for (tmpDay = tmpDays.first();
506 tmpDay; 508 tmpDay;
507 tmpDay = tmpDays.next()) { 509 tmpDay = tmpDays.next()) {
508 tmpStr2.sprintf("%i ", *tmpDay); 510 tmpStr2.sprintf("%i ", *tmpDay);
509 tmpStr += tmpStr2; 511 tmpStr += tmpStr2;
510 } 512 }
511 break; 513 break;
512 case Recurrence::rYearlyDay: 514 case Recurrence::rYearlyDay:
513 tmpStr.sprintf("YD%i ", anEvent->recurrence()->frequency()); 515 tmpStr.sprintf("YD%i ", anEvent->recurrence()->frequency());
514 // write out all the rYearNums; 516 // write out all the rYearNums;
515 tmpDays = anEvent->recurrence()->yearNums(); 517 tmpDays = anEvent->recurrence()->yearNums();
516 for (tmpDay = tmpDays.first(); 518 for (tmpDay = tmpDays.first();
517 tmpDay; 519 tmpDay;
518 tmpDay = tmpDays.next()) { 520 tmpDay = tmpDays.next()) {
519 tmpStr2.sprintf("%i ", *tmpDay); 521 tmpStr2.sprintf("%i ", *tmpDay);
520 tmpStr += tmpStr2; 522 tmpStr += tmpStr2;
521 } 523 }
522 break; 524 break;
523 default: 525 default:
524 kdDebug(5800) << "ERROR, it should never get here in eventToVEvent!" << endl; 526 kdDebug(5800) << "ERROR, it should never get here in eventToVEvent!" << endl;
525 break; 527 break;
526 } // switch 528 } // switch
527 529
528 if (anEvent->recurrence()->duration() > 0) { 530 if (anEvent->recurrence()->duration() > 0) {
529 tmpStr2.sprintf("#%i",anEvent->recurrence()->duration()); 531 tmpStr2.sprintf("#%i",anEvent->recurrence()->duration());
530 tmpStr += tmpStr2; 532 tmpStr += tmpStr2;
531 } else if (anEvent->recurrence()->duration() == -1) { 533 } else if (anEvent->recurrence()->duration() == -1) {
532 tmpStr += "#0"; // defined as repeat forever 534 tmpStr += "#0"; // defined as repeat forever
533 } else { 535 } else {
534 tmpStr += qDateTimeToISO(anEvent->recurrence()->endDate(), FALSE); 536 tmpStr += qDateTimeToISO(anEvent->recurrence()->endDate(), FALSE);
535 } 537 }
536 addPropValue(vevent,VCRRuleProp, tmpStr.local8Bit()); 538 addPropValue(vevent,VCRRuleProp, tmpStr.local8Bit());
537 539
538 } // event repeats 540 } // event repeats
539 541
540 // exceptions to recurrence 542 // exceptions to recurrence
541 DateList dateList = anEvent->exDates(); 543 DateList dateList = anEvent->exDates();
542 DateList::ConstIterator it; 544 DateList::ConstIterator it;
543 QString tmpStr2; 545 QString tmpStr2;
544 546
545 for (it = dateList.begin(); it != dateList.end(); ++it) { 547 for (it = dateList.begin(); it != dateList.end(); ++it) {
546 tmpStr = qDateToISO(*it) + ";"; 548 tmpStr = qDateToISO(*it) + ";";
547 tmpStr2 += tmpStr; 549 tmpStr2 += tmpStr;
548 } 550 }
549 if (!tmpStr2.isEmpty()) { 551 if (!tmpStr2.isEmpty()) {
550 tmpStr2.truncate(tmpStr2.length()-1); 552 tmpStr2.truncate(tmpStr2.length()-1);
551 addPropValue(vevent, VCExpDateProp, tmpStr2.local8Bit()); 553 addPropValue(vevent, VCExpDateProp, tmpStr2.local8Bit());
552 } 554 }
553 555
554 // description 556 // description
555 if (!anEvent->description().isEmpty()) { 557 if (!anEvent->description().isEmpty()) {
556 VObject *d = addPropValue(vevent, VCDescriptionProp, 558 VObject *d = addPropValue(vevent, VCDescriptionProp,
557 anEvent->description().local8Bit()); 559 anEvent->description().local8Bit());
558 if (anEvent->description().find('\n') != -1) 560 if (anEvent->description().find('\n') != -1)
559 addProp(d, VCQuotedPrintableProp); 561 addProp(d, VCQuotedPrintableProp);
560 } 562 }
561 563
562 // summary 564 // summary
563 if (!anEvent->summary().isEmpty()) 565 if (!anEvent->summary().isEmpty())
564 addPropValue(vevent, VCSummaryProp, anEvent->summary().local8Bit()); 566 addPropValue(vevent, VCSummaryProp, anEvent->summary().local8Bit());
565 567
566 if (!anEvent->location().isEmpty()) 568 if (!anEvent->location().isEmpty())
567 addPropValue(vevent, VCLocationProp, anEvent->location().local8Bit()); 569 addPropValue(vevent, VCLocationProp, anEvent->location().local8Bit());
568 570
569 // status 571 // status
570// TODO: define Event status 572// TODO: define Event status
571// addPropValue(vevent, VCStatusProp, anEvent->statusStr().local8Bit()); 573// addPropValue(vevent, VCStatusProp, anEvent->statusStr().local8Bit());
572 574
573 // secrecy 575 // secrecy
574 const char *text = 0; 576 const char *text = 0;
575 switch (anEvent->secrecy()) { 577 switch (anEvent->secrecy()) {
576 case Incidence::SecrecyPublic: 578 case Incidence::SecrecyPublic:
577 text = "PUBLIC"; 579 text = "PUBLIC";
578 break; 580 break;
579 case Incidence::SecrecyPrivate: 581 case Incidence::SecrecyPrivate:
580 text = "PRIVATE"; 582 text = "PRIVATE";
581 break; 583 break;
582 case Incidence::SecrecyConfidential: 584 case Incidence::SecrecyConfidential:
583 text = "CONFIDENTIAL"; 585 text = "CONFIDENTIAL";
584 break; 586 break;
585 } 587 }
586 if (text) { 588 if (text) {
587 addPropValue(vevent, VCClassProp, text); 589 addPropValue(vevent, VCClassProp, text);
588 } 590 }
589 591
590 // categories 592 // categories
591 tmpStrList = anEvent->categories(); 593 tmpStrList = anEvent->categories();
592 tmpStr = ""; 594 tmpStr = "";
593 QString catStr; 595 QString catStr;
594 for ( QStringList::Iterator it = tmpStrList.begin(); 596 for ( QStringList::Iterator it = tmpStrList.begin();
595 it != tmpStrList.end(); 597 it != tmpStrList.end();
596 ++it ) { 598 ++it ) {
597 catStr = *it; 599 catStr = *it;
598 if (catStr[0] == ' ') 600 if (catStr[0] == ' ')
599 tmpStr += catStr.mid(1); 601 tmpStr += catStr.mid(1);
600 else 602 else
601 tmpStr += catStr; 603 tmpStr += catStr;
602 // this must be a ';' character as the vCalendar specification requires! 604 // this must be a ';' character as the vCalendar specification requires!
603 // vcc.y has been hacked to translate the ';' to a ',' when the vcal is 605 // vcc.y has been hacked to translate the ';' to a ',' when the vcal is
604 // read in. 606 // read in.
605 tmpStr += ";"; 607 tmpStr += ";";
606 } 608 }
607 if (!tmpStr.isEmpty()) { 609 if (!tmpStr.isEmpty()) {
608 tmpStr.truncate(tmpStr.length()-1); 610 tmpStr.truncate(tmpStr.length()-1);
609 addPropValue(vevent, VCCategoriesProp, tmpStr.local8Bit()); 611 addPropValue(vevent, VCCategoriesProp, tmpStr.local8Bit());
610 } 612 }
611 613
612 // attachments 614 // attachments
613 // TODO: handle binary attachments! 615 // TODO: handle binary attachments!
614 QPtrList<Attachment> attachments = anEvent->attachments(); 616 QPtrList<Attachment> attachments = anEvent->attachments();
615 for ( Attachment *at = attachments.first(); at; at = attachments.next() ) 617 for ( Attachment *at = attachments.first(); at; at = attachments.next() )
616 addPropValue(vevent, VCAttachProp, at->uri().local8Bit()); 618 addPropValue(vevent, VCAttachProp, at->uri().local8Bit());
617 619
618 // resources 620 // resources
619 tmpStrList = anEvent->resources(); 621 tmpStrList = anEvent->resources();
620 tmpStr = tmpStrList.join(";"); 622 tmpStr = tmpStrList.join(";");
621 if (!tmpStr.isEmpty()) 623 if (!tmpStr.isEmpty())
622 addPropValue(vevent, VCResourcesProp, tmpStr.local8Bit()); 624 addPropValue(vevent, VCResourcesProp, tmpStr.local8Bit());
623 625
624 // alarm stuff 626 // alarm stuff
625 QPtrList<Alarm> alarms = anEvent->alarms(); 627 QPtrList<Alarm> alarms = anEvent->alarms();
626 Alarm* alarm; 628 Alarm* alarm;
627 for (alarm = alarms.first(); alarm; alarm = alarms.next()) { 629 for (alarm = alarms.first(); alarm; alarm = alarms.next()) {
628 if (alarm->enabled()) { 630 if (alarm->enabled()) {
629 VObject *a = addProp(vevent, VCDAlarmProp); 631 VObject *a ;
630 tmpStr = qDateTimeToISO(alarm->time()); 632 tmpStr = qDateTimeToISO(alarm->time());
631 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit()); 633 if (alarm->type() == Alarm::Audio) {
632 addPropValue(a, VCRepeatCountProp, "1"); 634 a = addProp(vevent, VCAAlarmProp);
633 addPropValue(a, VCDisplayStringProp, "beep!"); 635 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
634 if (alarm->type() == Alarm::Audio) { 636 addPropValue(a, VCRepeatCountProp, "1");
635 a = addProp(vevent, VCAAlarmProp); 637 addPropValue(a, VCAudioContentProp, QFile::encodeName(alarm->audioFile()));
636 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit()); 638 }
637 addPropValue(a, VCRepeatCountProp, "1"); 639 if (alarm->type() == Alarm::Procedure) {
638 addPropValue(a, VCAudioContentProp, QFile::encodeName(alarm->audioFile())); 640 a = addProp(vevent, VCPAlarmProp);
639 } 641 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
640 if (alarm->type() == Alarm::Procedure) { 642 addPropValue(a, VCRepeatCountProp, "1");
641 a = addProp(vevent, VCPAlarmProp); 643 addPropValue(a, VCProcedureNameProp, QFile::encodeName(alarm->programFile()));
642 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit()); 644 } else {
643 addPropValue(a, VCRepeatCountProp, "1"); 645 a = addProp(vevent, VCDAlarmProp);
644 addPropValue(a, VCProcedureNameProp, QFile::encodeName(alarm->programFile())); 646 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
647 addPropValue(a, VCRepeatCountProp, "1");
648 addPropValue(a, VCDisplayStringProp, "beep!");
649
645 } 650 }
646 } 651 }
647 } 652 }
648 653
649 // priority 654 // priority
650 tmpStr.sprintf("%i",anEvent->priority()); 655 tmpStr.sprintf("%i",anEvent->priority());
651 addPropValue(vevent, VCPriorityProp, tmpStr.local8Bit()); 656 addPropValue(vevent, VCPriorityProp, tmpStr.local8Bit());
652 657
653 // transparency 658 // transparency
654 tmpStr.sprintf("%i",anEvent->transparency()); 659 tmpStr.sprintf("%i",anEvent->transparency());
655 addPropValue(vevent, VCTranspProp, tmpStr.local8Bit()); 660 addPropValue(vevent, VCTranspProp, tmpStr.local8Bit());
656 661
657 // related event 662 // related event
658 if (anEvent->relatedTo()) { 663 if (anEvent->relatedTo()) {
659 addPropValue(vevent, VCRelatedToProp, 664 addPropValue(vevent, VCRelatedToProp,
660 anEvent->relatedTo()->uid().local8Bit()); 665 anEvent->relatedTo()->uid().local8Bit());
661 } 666 }
662 667
663 if (anEvent->pilotId()) { 668 if (anEvent->pilotId()) {
664 // pilot sync stuff 669 // pilot sync stuff
665 tmpStr.sprintf("%i",anEvent->pilotId()); 670 tmpStr.sprintf("%i",anEvent->pilotId());
666 addPropValue(vevent, XPilotIdProp, tmpStr.local8Bit()); 671 addPropValue(vevent, XPilotIdProp, tmpStr.local8Bit());
667 tmpStr.sprintf("%i",anEvent->syncStatus()); 672 tmpStr.sprintf("%i",anEvent->syncStatus());
668 addPropValue(vevent, XPilotStatusProp, tmpStr.local8Bit()); 673 addPropValue(vevent, XPilotStatusProp, tmpStr.local8Bit());
669 } 674 }
670 675
671 return vevent; 676 return vevent;
672} 677}
673 678
674Todo *VCalFormat::VTodoToEvent(VObject *vtodo) 679Todo *VCalFormat::VTodoToEvent(VObject *vtodo)
675{ 680{
676 VObject *vo; 681 VObject *vo;
677 VObjectIterator voi; 682 VObjectIterator voi;
678 char *s; 683 char *s;
679 684
680 Todo *anEvent = new Todo; 685 Todo *anEvent = new Todo;
681 686
682 // creation date 687 // creation date
683 if ((vo = isAPropertyOf(vtodo, VCDCreatedProp)) != 0) { 688 if ((vo = isAPropertyOf(vtodo, VCDCreatedProp)) != 0) {
684 anEvent->setCreated(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); 689 anEvent->setCreated(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
685 deleteStr(s); 690 deleteStr(s);
686 } 691 }
687 692
688 // unique id 693 // unique id
689 vo = isAPropertyOf(vtodo, VCUniqueStringProp); 694 vo = isAPropertyOf(vtodo, VCUniqueStringProp);
690 // while the UID property is preferred, it is not required. We'll use the 695 // while the UID property is preferred, it is not required. We'll use the
691 // default Event UID if none is given. 696 // default Event UID if none is given.
692 if (vo) { 697 if (vo) {
693 anEvent->setUid(s = fakeCString(vObjectUStringZValue(vo))); 698 anEvent->setUid(s = fakeCString(vObjectUStringZValue(vo)));
694 deleteStr(s); 699 deleteStr(s);
695 } 700 }
696 701
697 // last modification date 702 // last modification date
698 if ((vo = isAPropertyOf(vtodo, VCLastModifiedProp)) != 0) { 703 if ((vo = isAPropertyOf(vtodo, VCLastModifiedProp)) != 0) {
699 anEvent->setLastModified(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); 704 anEvent->setLastModified(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
700 deleteStr(s); 705 deleteStr(s);
701 } 706 }
702 else 707 else
703 anEvent->setLastModified(QDateTime(QDate::currentDate(), 708 anEvent->setLastModified(QDateTime(QDate::currentDate(),
704 QTime::currentTime())); 709 QTime::currentTime()));
705 710
706 // organizer 711 // organizer
707 // if our extension property for the event's ORGANIZER exists, add it. 712 // if our extension property for the event's ORGANIZER exists, add it.
708 if ((vo = isAPropertyOf(vtodo, ICOrganizerProp)) != 0) { 713 if ((vo = isAPropertyOf(vtodo, ICOrganizerProp)) != 0) {
709 anEvent->setOrganizer(s = fakeCString(vObjectUStringZValue(vo))); 714 anEvent->setOrganizer(s = fakeCString(vObjectUStringZValue(vo)));
710 deleteStr(s); 715 deleteStr(s);
711 } else { 716 } else {
712 anEvent->setOrganizer(mCalendar->getEmail()); 717 anEvent->setOrganizer(mCalendar->getEmail());
713 } 718 }
714 719
715 // attendees. 720 // attendees.
716 initPropIterator(&voi, vtodo); 721 initPropIterator(&voi, vtodo);
717 while (moreIteration(&voi)) { 722 while (moreIteration(&voi)) {
718 vo = nextVObject(&voi); 723 vo = nextVObject(&voi);
719 if (strcmp(vObjectName(vo), VCAttendeeProp) == 0) { 724 if (strcmp(vObjectName(vo), VCAttendeeProp) == 0) {
720 Attendee *a; 725 Attendee *a;
721 VObject *vp; 726 VObject *vp;
722 s = fakeCString(vObjectUStringZValue(vo)); 727 s = fakeCString(vObjectUStringZValue(vo));
723 QString tmpStr = QString::fromLocal8Bit(s); 728 QString tmpStr = QString::fromLocal8Bit(s);
724 deleteStr(s); 729 deleteStr(s);
725 tmpStr = tmpStr.simplifyWhiteSpace(); 730 tmpStr = tmpStr.simplifyWhiteSpace();
726 int emailPos1, emailPos2; 731 int emailPos1, emailPos2;
727 if ((emailPos1 = tmpStr.find('<')) > 0) { 732 if ((emailPos1 = tmpStr.find('<')) > 0) {
728 // both email address and name 733 // both email address and name
729 emailPos2 = tmpStr.findRev('>'); 734 emailPos2 = tmpStr.findRev('>');
730 a = new Attendee(tmpStr.left(emailPos1 - 1), 735 a = new Attendee(tmpStr.left(emailPos1 - 1),
731 tmpStr.mid(emailPos1 + 1, 736 tmpStr.mid(emailPos1 + 1,
732 emailPos2 - (emailPos1 + 1))); 737 emailPos2 - (emailPos1 + 1)));
733 } else if (tmpStr.find('@') > 0) { 738 } else if (tmpStr.find('@') > 0) {
734 // just an email address 739 // just an email address
735 a = new Attendee(0, tmpStr); 740 a = new Attendee(0, tmpStr);
736 } else { 741 } else {
737 // just a name 742 // just a name
738 QString email = tmpStr.replace( QRegExp(" "), "." ); 743 QString email = tmpStr.replace( QRegExp(" "), "." );
739 a = new Attendee(tmpStr,email); 744 a = new Attendee(tmpStr,email);
740 } 745 }
741 746
742 // is there an RSVP property? 747 // is there an RSVP property?
743 if ((vp = isAPropertyOf(vo, VCRSVPProp)) != 0) 748 if ((vp = isAPropertyOf(vo, VCRSVPProp)) != 0)
744 a->setRSVP(vObjectStringZValue(vp)); 749 a->setRSVP(vObjectStringZValue(vp));
745 // is there a status property? 750 // is there a status property?
746 if ((vp = isAPropertyOf(vo, VCStatusProp)) != 0) 751 if ((vp = isAPropertyOf(vo, VCStatusProp)) != 0)
747 a->setStatus(readStatus(vObjectStringZValue(vp))); 752 a->setStatus(readStatus(vObjectStringZValue(vp)));
748 // add the attendee 753 // add the attendee
749 anEvent->addAttendee(a); 754 anEvent->addAttendee(a);
750 } 755 }
751 } 756 }
752 757
753 // description for todo 758 // description for todo
754 if ((vo = isAPropertyOf(vtodo, VCDescriptionProp)) != 0) { 759 if ((vo = isAPropertyOf(vtodo, VCDescriptionProp)) != 0) {
755 s = fakeCString(vObjectUStringZValue(vo)); 760 s = fakeCString(vObjectUStringZValue(vo));
756 anEvent->setDescription(QString::fromLocal8Bit(s)); 761 anEvent->setDescription(QString::fromLocal8Bit(s));
757 deleteStr(s); 762 deleteStr(s);
758 } 763 }
759 764
760 // summary 765 // summary
761 if ((vo = isAPropertyOf(vtodo, VCSummaryProp))) { 766 if ((vo = isAPropertyOf(vtodo, VCSummaryProp))) {
762 s = fakeCString(vObjectUStringZValue(vo)); 767 s = fakeCString(vObjectUStringZValue(vo));
763 anEvent->setSummary(QString::fromLocal8Bit(s)); 768 anEvent->setSummary(QString::fromLocal8Bit(s));
764 deleteStr(s); 769 deleteStr(s);
765 } 770 }
766 if ((vo = isAPropertyOf(vtodo, VCLocationProp))) { 771 if ((vo = isAPropertyOf(vtodo, VCLocationProp))) {
767 s = fakeCString(vObjectUStringZValue(vo)); 772 s = fakeCString(vObjectUStringZValue(vo));
768 anEvent->setLocation(QString::fromLocal8Bit(s)); 773 anEvent->setLocation(QString::fromLocal8Bit(s));
769 deleteStr(s); 774 deleteStr(s);
770 } 775 }
771 776
772 777
773 // completed 778 // completed
774 // was: status 779 // was: status
775 if ((vo = isAPropertyOf(vtodo, VCStatusProp)) != 0) { 780 if ((vo = isAPropertyOf(vtodo, VCStatusProp)) != 0) {
776 s = fakeCString(vObjectUStringZValue(vo)); 781 s = fakeCString(vObjectUStringZValue(vo));
777 if (strcmp(s,"COMPLETED") == 0) { 782 if (strcmp(s,"COMPLETED") == 0) {
778 anEvent->setCompleted(true); 783 anEvent->setCompleted(true);
779 } else { 784 } else {
780 anEvent->setCompleted(false); 785 anEvent->setCompleted(false);
781 } 786 }
782 deleteStr(s); 787 deleteStr(s);
783 } 788 }
784 else 789 else
785 anEvent->setCompleted(false); 790 anEvent->setCompleted(false);
786 791
787 // completion date 792 // completion date
788 if ((vo = isAPropertyOf(vtodo, VCCompletedProp)) != 0) { 793 if ((vo = isAPropertyOf(vtodo, VCCompletedProp)) != 0) {
789 anEvent->setCompleted(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); 794 anEvent->setCompleted(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
790 deleteStr(s); 795 deleteStr(s);
791 } 796 }
792 797
793 // priority 798 // priority
794 if ((vo = isAPropertyOf(vtodo, VCPriorityProp))) { 799 if ((vo = isAPropertyOf(vtodo, VCPriorityProp))) {
795 anEvent->setPriority(atoi(s = fakeCString(vObjectUStringZValue(vo)))); 800 anEvent->setPriority(atoi(s = fakeCString(vObjectUStringZValue(vo))));
796 deleteStr(s); 801 deleteStr(s);
797 } 802 }
798 803
799 // due date 804 // due date
800 if ((vo = isAPropertyOf(vtodo, VCDueProp)) != 0) { 805 if ((vo = isAPropertyOf(vtodo, VCDueProp)) != 0) {
801 anEvent->setDtDue(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); 806 anEvent->setDtDue(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
802 deleteStr(s); 807 deleteStr(s);
803 anEvent->setHasDueDate(true); 808 anEvent->setHasDueDate(true);
804 } else { 809 } else {
805 anEvent->setHasDueDate(false); 810 anEvent->setHasDueDate(false);
806 } 811 }
807 812
808 // start time 813 // start time
809 if ((vo = isAPropertyOf(vtodo, VCDTstartProp)) != 0) { 814 if ((vo = isAPropertyOf(vtodo, VCDTstartProp)) != 0) {
810 anEvent->setDtStart(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); 815 anEvent->setDtStart(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
811 // kdDebug(5800) << "s is " << // s << ", ISO is " << ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))).toString() << endl; 816 // kdDebug(5800) << "s is " << // s << ", ISO is " << ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))).toString() << endl;
812 deleteStr(s); 817 deleteStr(s);
813 anEvent->setHasStartDate(true); 818 anEvent->setHasStartDate(true);
814 } else { 819 } else {
815 anEvent->setHasStartDate(false); 820 anEvent->setHasStartDate(false);
816 } 821 }
817 822
818 /* alarm stuff */ 823 /* alarm stuff */
819 //kdDebug(5800) << "vcalformat::VTodoToEvent called" << endl; 824 //kdDebug(5800) << "vcalformat::VTodoToEvent called" << endl;
820 if ((vo = isAPropertyOf(vtodo, VCDAlarmProp))) { 825 if ((vo = isAPropertyOf(vtodo, VCDAlarmProp))) {
821 Alarm* alarm = anEvent->newAlarm(); 826 Alarm* alarm = anEvent->newAlarm();
822 VObject *a; 827 VObject *a;
823 if ((a = isAPropertyOf(vo, VCRunTimeProp))) { 828 if ((a = isAPropertyOf(vo, VCRunTimeProp))) {
824 alarm->setTime(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(a)))); 829 alarm->setTime(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(a))));
825 deleteStr(s); 830 deleteStr(s);
826 } 831 }
827 alarm->setEnabled(true); 832 alarm->setEnabled(true);
828 if ((vo = isAPropertyOf(vtodo, VCPAlarmProp))) { 833 if ((vo = isAPropertyOf(vtodo, VCPAlarmProp))) {
829 if ((a = isAPropertyOf(vo, VCProcedureNameProp))) { 834 if ((a = isAPropertyOf(vo, VCProcedureNameProp))) {
830 s = fakeCString(vObjectUStringZValue(a)); 835 s = fakeCString(vObjectUStringZValue(a));
831 alarm->setProcedureAlarm(QFile::decodeName(s)); 836 alarm->setProcedureAlarm(QFile::decodeName(s));
832 deleteStr(s); 837 deleteStr(s);
833 } 838 }
834 } 839 }
835 if ((vo = isAPropertyOf(vtodo, VCAAlarmProp))) { 840 if ((vo = isAPropertyOf(vtodo, VCAAlarmProp))) {
836 if ((a = isAPropertyOf(vo, VCAudioContentProp))) { 841 if ((a = isAPropertyOf(vo, VCAudioContentProp))) {
837 s = fakeCString(vObjectUStringZValue(a)); 842 s = fakeCString(vObjectUStringZValue(a));
838 alarm->setAudioAlarm(QFile::decodeName(s)); 843 alarm->setAudioAlarm(QFile::decodeName(s));
839 deleteStr(s); 844 deleteStr(s);
840 } 845 }
841 } 846 }
842 } 847 }
843 848
844 // related todo 849 // related todo
845 if ((vo = isAPropertyOf(vtodo, VCRelatedToProp)) != 0) { 850 if ((vo = isAPropertyOf(vtodo, VCRelatedToProp)) != 0) {
846 anEvent->setRelatedToUid(s = fakeCString(vObjectUStringZValue(vo))); 851 anEvent->setRelatedToUid(s = fakeCString(vObjectUStringZValue(vo)));
847 deleteStr(s); 852 deleteStr(s);
848 mTodosRelate.append(anEvent); 853 mTodosRelate.append(anEvent);
849 } 854 }
850 855
851 // categories 856 // categories
852 QStringList tmpStrList; 857 QStringList tmpStrList;
853 int index1 = 0; 858 int index1 = 0;
854 int index2 = 0; 859 int index2 = 0;
855 if ((vo = isAPropertyOf(vtodo, VCCategoriesProp)) != 0) { 860 if ((vo = isAPropertyOf(vtodo, VCCategoriesProp)) != 0) {
856 s = fakeCString(vObjectUStringZValue(vo)); 861 s = fakeCString(vObjectUStringZValue(vo));
857 QString categories = QString::fromLocal8Bit(s); 862 QString categories = QString::fromLocal8Bit(s);
858 deleteStr(s); 863 deleteStr(s);
859 //const char* category; 864 //const char* category;
860 QString category; 865 QString category;
861 while ((index2 = categories.find(',', index1)) != -1) { 866 while ((index2 = categories.find(',', index1)) != -1) {
862 //category = (const char *) categories.mid(index1, (index2 - index1)); 867 //category = (const char *) categories.mid(index1, (index2 - index1));
863 category = categories.mid(index1, (index2 - index1)); 868 category = categories.mid(index1, (index2 - index1));
864 tmpStrList.append(category); 869 tmpStrList.append(category);
865 index1 = index2+1; 870 index1 = index2+1;
866 } 871 }
867 // get last category 872 // get last category
868 category = categories.mid(index1, (categories.length()-index1)); 873 category = categories.mid(index1, (categories.length()-index1));
869 tmpStrList.append(category); 874 tmpStrList.append(category);
870 anEvent->setCategories(tmpStrList); 875 anEvent->setCategories(tmpStrList);
871 } 876 }
872 877
873 /* PILOT SYNC STUFF */ 878 /* PILOT SYNC STUFF */
874 if ((vo = isAPropertyOf(vtodo, XPilotIdProp))) { 879 if ((vo = isAPropertyOf(vtodo, XPilotIdProp))) {
875 anEvent->setPilotId(atoi(s = fakeCString(vObjectUStringZValue(vo)))); 880 anEvent->setPilotId(atoi(s = fakeCString(vObjectUStringZValue(vo))));
876 deleteStr(s); 881 deleteStr(s);
877 } 882 }
878 else 883 else
879 anEvent->setPilotId(0); 884 anEvent->setPilotId(0);
880 885
881 if ((vo = isAPropertyOf(vtodo, XPilotStatusProp))) { 886 if ((vo = isAPropertyOf(vtodo, XPilotStatusProp))) {
882 anEvent->setSyncStatus(atoi(s = fakeCString(vObjectUStringZValue(vo)))); 887 anEvent->setSyncStatus(atoi(s = fakeCString(vObjectUStringZValue(vo))));
883 deleteStr(s); 888 deleteStr(s);
884 } 889 }
885 else 890 else
886 anEvent->setSyncStatus(Event::SYNCMOD); 891 anEvent->setSyncStatus(Event::SYNCMOD);
887 892
888 return anEvent; 893 return anEvent;
889} 894}
890 895
891Event* VCalFormat::VEventToEvent(VObject *vevent) 896Event* VCalFormat::VEventToEvent(VObject *vevent)
892{ 897{
893 VObject *vo; 898 VObject *vo;
894 VObjectIterator voi; 899 VObjectIterator voi;
895 char *s; 900 char *s;
896 901
897 Event *anEvent = new Event; 902 Event *anEvent = new Event;
898 903
899 // creation date 904 // creation date
900 if ((vo = isAPropertyOf(vevent, VCDCreatedProp)) != 0) { 905 if ((vo = isAPropertyOf(vevent, VCDCreatedProp)) != 0) {
901 anEvent->setCreated(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); 906 anEvent->setCreated(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
902 deleteStr(s); 907 deleteStr(s);
903 } 908 }
904 909
905 // unique id 910 // unique id
906 vo = isAPropertyOf(vevent, VCUniqueStringProp); 911 vo = isAPropertyOf(vevent, VCUniqueStringProp);
907 // while the UID property is preferred, it is not required. We'll use the 912 // while the UID property is preferred, it is not required. We'll use the
908 // default Event UID if none is given. 913 // default Event UID if none is given.
909 if (vo) { 914 if (vo) {
910 anEvent->setUid(s = fakeCString(vObjectUStringZValue(vo))); 915 anEvent->setUid(s = fakeCString(vObjectUStringZValue(vo)));
911 deleteStr(s); 916 deleteStr(s);
912 } 917 }
913 918
914 // revision 919 // revision
915 // again NSCAL doesn't give us much to work with, so we improvise... 920 // again NSCAL doesn't give us much to work with, so we improvise...
916 if ((vo = isAPropertyOf(vevent, VCSequenceProp)) != 0) { 921 if ((vo = isAPropertyOf(vevent, VCSequenceProp)) != 0) {
917 anEvent->setRevision(atoi(s = fakeCString(vObjectUStringZValue(vo)))); 922 anEvent->setRevision(atoi(s = fakeCString(vObjectUStringZValue(vo))));
918 deleteStr(s); 923 deleteStr(s);
919 } 924 }
920 else 925 else
921 anEvent->setRevision(0); 926 anEvent->setRevision(0);
922 927
923 // last modification date 928 // last modification date
924 if ((vo = isAPropertyOf(vevent, VCLastModifiedProp)) != 0) { 929 if ((vo = isAPropertyOf(vevent, VCLastModifiedProp)) != 0) {
925 anEvent->setLastModified(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); 930 anEvent->setLastModified(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
926 deleteStr(s); 931 deleteStr(s);
927 } 932 }
928 else 933 else
929 anEvent->setLastModified(QDateTime(QDate::currentDate(), 934 anEvent->setLastModified(QDateTime(QDate::currentDate(),
930 QTime::currentTime())); 935 QTime::currentTime()));
931 936
932 // organizer 937 // organizer
933 // if our extension property for the event's ORGANIZER exists, add it. 938 // if our extension property for the event's ORGANIZER exists, add it.
934 if ((vo = isAPropertyOf(vevent, ICOrganizerProp)) != 0) { 939 if ((vo = isAPropertyOf(vevent, ICOrganizerProp)) != 0) {
935 anEvent->setOrganizer(s = fakeCString(vObjectUStringZValue(vo))); 940 anEvent->setOrganizer(s = fakeCString(vObjectUStringZValue(vo)));
936 deleteStr(s); 941 deleteStr(s);
937 } else { 942 } else {
938 anEvent->setOrganizer(mCalendar->getEmail()); 943 anEvent->setOrganizer(mCalendar->getEmail());
939 } 944 }
940 945
941 // deal with attendees. 946 // deal with attendees.
942 initPropIterator(&voi, vevent); 947 initPropIterator(&voi, vevent);
943 while (moreIteration(&voi)) { 948 while (moreIteration(&voi)) {
944 vo = nextVObject(&voi); 949 vo = nextVObject(&voi);
945 if (strcmp(vObjectName(vo), VCAttendeeProp) == 0) { 950 if (strcmp(vObjectName(vo), VCAttendeeProp) == 0) {
946 Attendee *a; 951 Attendee *a;
947 VObject *vp; 952 VObject *vp;
948 s = fakeCString(vObjectUStringZValue(vo)); 953 s = fakeCString(vObjectUStringZValue(vo));
949 QString tmpStr = QString::fromLocal8Bit(s); 954 QString tmpStr = QString::fromLocal8Bit(s);
950 deleteStr(s); 955 deleteStr(s);
951 tmpStr = tmpStr.simplifyWhiteSpace(); 956 tmpStr = tmpStr.simplifyWhiteSpace();
952 int emailPos1, emailPos2; 957 int emailPos1, emailPos2;
953 if ((emailPos1 = tmpStr.find('<')) > 0) { 958 if ((emailPos1 = tmpStr.find('<')) > 0) {
954 // both email address and name 959 // both email address and name
955 emailPos2 = tmpStr.findRev('>'); 960 emailPos2 = tmpStr.findRev('>');
956 a = new Attendee(tmpStr.left(emailPos1 - 1), 961 a = new Attendee(tmpStr.left(emailPos1 - 1),
957 tmpStr.mid(emailPos1 + 1, 962 tmpStr.mid(emailPos1 + 1,
958 emailPos2 - (emailPos1 + 1))); 963 emailPos2 - (emailPos1 + 1)));
959 } else if (tmpStr.find('@') > 0) { 964 } else if (tmpStr.find('@') > 0) {
960 // just an email address 965 // just an email address
961 a = new Attendee(0, tmpStr); 966 a = new Attendee(0, tmpStr);
962 } else { 967 } else {
963 // just a name 968 // just a name
964 QString email = tmpStr.replace( QRegExp(" "), "." ); 969 QString email = tmpStr.replace( QRegExp(" "), "." );
965 a = new Attendee(tmpStr,email); 970 a = new Attendee(tmpStr,email);
966 } 971 }
967 972
968 // is there an RSVP property? 973 // is there an RSVP property?
969 if ((vp = isAPropertyOf(vo, VCRSVPProp)) != 0) 974 if ((vp = isAPropertyOf(vo, VCRSVPProp)) != 0)
970 a->setRSVP(vObjectStringZValue(vp)); 975 a->setRSVP(vObjectStringZValue(vp));
971 // is there a status property? 976 // is there a status property?
972 if ((vp = isAPropertyOf(vo, VCStatusProp)) != 0) 977 if ((vp = isAPropertyOf(vo, VCStatusProp)) != 0)
973 a->setStatus(readStatus(vObjectStringZValue(vp))); 978 a->setStatus(readStatus(vObjectStringZValue(vp)));
974 // add the attendee 979 // add the attendee
975 anEvent->addAttendee(a); 980 anEvent->addAttendee(a);
976 } 981 }
977 } 982 }
978 983
979 // This isn't strictly true. An event that doesn't have a start time 984 // This isn't strictly true. An event that doesn't have a start time
980 // or an end time doesn't "float", it has an anchor in time but it doesn't 985 // or an end time doesn't "float", it has an anchor in time but it doesn't
981 // "take up" any time. 986 // "take up" any time.
982 /*if ((isAPropertyOf(vevent, VCDTstartProp) == 0) || 987 /*if ((isAPropertyOf(vevent, VCDTstartProp) == 0) ||
983 (isAPropertyOf(vevent, VCDTendProp) == 0)) { 988 (isAPropertyOf(vevent, VCDTendProp) == 0)) {
984 anEvent->setFloats(TRUE); 989 anEvent->setFloats(TRUE);
985 } else { 990 } else {
986 }*/ 991 }*/
987 992
988 anEvent->setFloats(FALSE); 993 anEvent->setFloats(FALSE);
989 994
990 // start time 995 // start time
991 if ((vo = isAPropertyOf(vevent, VCDTstartProp)) != 0) { 996 if ((vo = isAPropertyOf(vevent, VCDTstartProp)) != 0) {
992 anEvent->setDtStart(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); 997 anEvent->setDtStart(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
993 // kdDebug(5800) << "s is " << // s << ", ISO is " << ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))).toString() << endl; 998 // kdDebug(5800) << "s is " << // s << ", ISO is " << ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))).toString() << endl;
994 deleteStr(s); 999 deleteStr(s);
995 if (anEvent->dtStart().time().isNull()) 1000 if (anEvent->dtStart().time().isNull())
996 anEvent->setFloats(TRUE); 1001 anEvent->setFloats(TRUE);
997 } 1002 }
998 1003
999 // stop time 1004 // stop time
1000 if ((vo = isAPropertyOf(vevent, VCDTendProp)) != 0) { 1005 if ((vo = isAPropertyOf(vevent, VCDTendProp)) != 0) {
1001 anEvent->setDtEnd(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); 1006 anEvent->setDtEnd(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
1002 deleteStr(s); 1007 deleteStr(s);
1003 if (anEvent->dtEnd().time().isNull()) 1008 if (anEvent->dtEnd().time().isNull())
1004 anEvent->setFloats(TRUE); 1009 anEvent->setFloats(TRUE);
1005 } 1010 }
1006 1011
1007 // at this point, there should be at least a start or end time. 1012 // at this point, there should be at least a start or end time.
1008 // fix up for events that take up no time but have a time associated 1013 // fix up for events that take up no time but have a time associated
1009 if (!(vo = isAPropertyOf(vevent, VCDTstartProp))) 1014 if (!(vo = isAPropertyOf(vevent, VCDTstartProp)))
1010 anEvent->setDtStart(anEvent->dtEnd()); 1015 anEvent->setDtStart(anEvent->dtEnd());
1011 if (!(vo = isAPropertyOf(vevent, VCDTendProp))) 1016 if (!(vo = isAPropertyOf(vevent, VCDTendProp)))
1012 anEvent->setDtEnd(anEvent->dtStart()); 1017 anEvent->setDtEnd(anEvent->dtStart());
1013 1018
1014 /////////////////////////////////////////////////////////////////////////// 1019 ///////////////////////////////////////////////////////////////////////////
1015 1020
1016 // repeat stuff 1021 // repeat stuff
1017 if ((vo = isAPropertyOf(vevent, VCRRuleProp)) != 0) { 1022 if ((vo = isAPropertyOf(vevent, VCRRuleProp)) != 0) {
1018 QString tmpStr = (s = fakeCString(vObjectUStringZValue(vo))); 1023 QString tmpStr = (s = fakeCString(vObjectUStringZValue(vo)));
1019 deleteStr(s); 1024 deleteStr(s);
1020 tmpStr.simplifyWhiteSpace(); 1025 tmpStr.simplifyWhiteSpace();
1021 tmpStr = tmpStr.upper(); 1026 tmpStr = tmpStr.upper();
1022 1027
1023 /********************************* DAILY ******************************/ 1028 /********************************* DAILY ******************************/
1024 if (tmpStr.left(1) == "D") { 1029 if (tmpStr.left(1) == "D") {
1025 int index = tmpStr.find(' '); 1030 int index = tmpStr.find(' ');
1026 int rFreq = tmpStr.mid(1, (index-1)).toInt(); 1031 int rFreq = tmpStr.mid(1, (index-1)).toInt();
1027 index = tmpStr.findRev(' ') + 1; // advance to last field 1032 index = tmpStr.findRev(' ') + 1; // advance to last field
1028 if (tmpStr.mid(index,1) == "#") index++; 1033 if (tmpStr.mid(index,1) == "#") index++;