-rw-r--r-- | libkcal/vcalformat.cpp | 39 |
1 files changed, 33 insertions, 6 deletions
diff --git a/libkcal/vcalformat.cpp b/libkcal/vcalformat.cpp index df93209..223aa5a 100644 --- a/libkcal/vcalformat.cpp +++ b/libkcal/vcalformat.cpp | |||
@@ -244,96 +244,97 @@ VObject *VCalFormat::eventToVTodo(const Todo *anEvent) | |||
244 | 244 | ||
245 | // start date | 245 | // start date |
246 | if (anEvent->hasStartDate()) { | 246 | if (anEvent->hasStartDate()) { |
247 | tmpStr = qDateTimeToISO(anEvent->dtStart(), | 247 | tmpStr = qDateTimeToISO(anEvent->dtStart(), |
248 | !anEvent->doesFloat()); | 248 | !anEvent->doesFloat()); |
249 | addPropValue(vtodo, VCDTstartProp, tmpStr.local8Bit()); | 249 | addPropValue(vtodo, VCDTstartProp, tmpStr.local8Bit()); |
250 | } | 250 | } |
251 | 251 | ||
252 | // creation date | 252 | // creation date |
253 | tmpStr = qDateTimeToISO(anEvent->created()); | 253 | tmpStr = qDateTimeToISO(anEvent->created()); |
254 | addPropValue(vtodo, VCDCreatedProp, tmpStr.local8Bit()); | 254 | addPropValue(vtodo, VCDCreatedProp, tmpStr.local8Bit()); |
255 | 255 | ||
256 | // unique id | 256 | // unique id |
257 | addPropValue(vtodo, VCUniqueStringProp, | 257 | addPropValue(vtodo, VCUniqueStringProp, |
258 | anEvent->uid().local8Bit()); | 258 | anEvent->uid().local8Bit()); |
259 | 259 | ||
260 | // revision | 260 | // revision |
261 | tmpStr.sprintf("%i", anEvent->revision()); | 261 | tmpStr.sprintf("%i", anEvent->revision()); |
262 | addPropValue(vtodo, VCSequenceProp, tmpStr.local8Bit()); | 262 | addPropValue(vtodo, VCSequenceProp, tmpStr.local8Bit()); |
263 | 263 | ||
264 | // last modification date | 264 | // last modification date |
265 | tmpStr = qDateTimeToISO(anEvent->lastModified()); | 265 | tmpStr = qDateTimeToISO(anEvent->lastModified()); |
266 | addPropValue(vtodo, VCLastModifiedProp, tmpStr.local8Bit()); | 266 | addPropValue(vtodo, VCLastModifiedProp, tmpStr.local8Bit()); |
267 | 267 | ||
268 | // organizer stuff | 268 | // organizer stuff |
269 | tmpStr = "MAILTO:" + anEvent->organizer(); | 269 | tmpStr = "MAILTO:" + anEvent->organizer(); |
270 | addPropValue(vtodo, ICOrganizerProp, tmpStr.local8Bit()); | 270 | addPropValue(vtodo, ICOrganizerProp, tmpStr.local8Bit()); |
271 | 271 | ||
272 | // attendees | 272 | // attendees |
273 | if (anEvent->attendeeCount() != 0) { | 273 | if (anEvent->attendeeCount() != 0) { |
274 | QPtrList<Attendee> al = anEvent->attendees(); | 274 | QPtrList<Attendee> al = anEvent->attendees(); |
275 | QPtrListIterator<Attendee> ai(al); | 275 | QPtrListIterator<Attendee> ai(al); |
276 | Attendee *curAttendee; | 276 | Attendee *curAttendee; |
277 | 277 | ||
278 | for (; ai.current(); ++ai) { | 278 | for (; ai.current(); ++ai) { |
279 | curAttendee = ai.current(); | 279 | curAttendee = ai.current(); |
280 | if (!curAttendee->email().isEmpty() && | 280 | if (!curAttendee->email().isEmpty() && |
281 | !curAttendee->name().isEmpty()) | 281 | !curAttendee->name().isEmpty()) |
282 | tmpStr = "MAILTO:" + curAttendee->name() + " <" + | 282 | tmpStr = "MAILTO:" + curAttendee->name() + " <" + |
283 | curAttendee->email() + ">"; | 283 | curAttendee->email() + ">"; |
284 | else if (curAttendee->name().isEmpty()) | 284 | else if (curAttendee->name().isEmpty()) |
285 | tmpStr = "MAILTO: " + curAttendee->email(); | 285 | tmpStr = "MAILTO: " + curAttendee->email(); |
286 | else if (curAttendee->email().isEmpty()) | 286 | else if (curAttendee->email().isEmpty()) |
287 | tmpStr = "MAILTO: " + curAttendee->name(); | 287 | tmpStr = "MAILTO: " + curAttendee->name(); |
288 | else if (curAttendee->name().isEmpty() && | 288 | else if (curAttendee->name().isEmpty() && |
289 | curAttendee->email().isEmpty()) | 289 | curAttendee->email().isEmpty()) |
290 | kdDebug(5800) << "warning! this Event has an attendee w/o name or email!" << endl; | 290 | kdDebug(5800) << "warning! this Event has an attendee w/o name or email!" << endl; |
291 | VObject *aProp = addPropValue(vtodo, VCAttendeeProp, tmpStr.local8Bit()); | 291 | VObject *aProp = addPropValue(vtodo, VCAttendeeProp, tmpStr.local8Bit()); |
292 | addPropValue(aProp, VCRoleProp, writeRole(curAttendee->role())); | ||
292 | addPropValue(aProp, VCRSVPProp, curAttendee->RSVP() ? "TRUE" : "FALSE"); | 293 | addPropValue(aProp, VCRSVPProp, curAttendee->RSVP() ? "TRUE" : "FALSE"); |
293 | addPropValue(aProp, VCStatusProp, writeStatus(curAttendee->status())); | 294 | addPropValue(aProp, VCStatusProp, writeStatus(curAttendee->status())); |
294 | } | 295 | } |
295 | } | 296 | } |
296 | 297 | ||
297 | // description BL: | 298 | // description BL: |
298 | if (!anEvent->description().isEmpty()) { | 299 | if (!anEvent->description().isEmpty()) { |
299 | VObject *d = addPropValue(vtodo, VCDescriptionProp, | 300 | VObject *d = addPropValue(vtodo, VCDescriptionProp, |
300 | anEvent->description().local8Bit()); | 301 | anEvent->description().local8Bit()); |
301 | if (anEvent->description().find('\n') != -1) | 302 | if (anEvent->description().find('\n') != -1) |
302 | addProp(d, VCQuotedPrintableProp); | 303 | addProp(d, VCQuotedPrintableProp); |
303 | } | 304 | } |
304 | 305 | ||
305 | // summary | 306 | // summary |
306 | if (!anEvent->summary().isEmpty()) | 307 | if (!anEvent->summary().isEmpty()) |
307 | addPropValue(vtodo, VCSummaryProp, anEvent->summary().local8Bit()); | 308 | addPropValue(vtodo, VCSummaryProp, anEvent->summary().local8Bit()); |
308 | 309 | ||
309 | if (!anEvent->location().isEmpty()) | 310 | if (!anEvent->location().isEmpty()) |
310 | addPropValue(vtodo, VCLocationProp, anEvent->location().local8Bit()); | 311 | addPropValue(vtodo, VCLocationProp, anEvent->location().local8Bit()); |
311 | 312 | ||
312 | // completed | 313 | // completed |
313 | // status | 314 | // status |
314 | // backward compatibility, KOrganizer used to interpret only these two values | 315 | // backward compatibility, KOrganizer used to interpret only these two values |
315 | addPropValue(vtodo, VCStatusProp, anEvent->isCompleted() ? "COMPLETED" : | 316 | addPropValue(vtodo, VCStatusProp, anEvent->isCompleted() ? "COMPLETED" : |
316 | "NEEDS_ACTION"); | 317 | "NEEDS_ACTION"); |
317 | // completion date | 318 | // completion date |
318 | if (anEvent->hasCompletedDate()) { | 319 | if (anEvent->hasCompletedDate()) { |
319 | tmpStr = qDateTimeToISO(anEvent->completed()); | 320 | tmpStr = qDateTimeToISO(anEvent->completed()); |
320 | addPropValue(vtodo, VCCompletedProp, tmpStr.local8Bit()); | 321 | addPropValue(vtodo, VCCompletedProp, tmpStr.local8Bit()); |
321 | } | 322 | } |
322 | 323 | ||
323 | // priority | 324 | // priority |
324 | tmpStr.sprintf("%i",anEvent->priority()); | 325 | tmpStr.sprintf("%i",anEvent->priority()); |
325 | addPropValue(vtodo, VCPriorityProp, tmpStr.local8Bit()); | 326 | addPropValue(vtodo, VCPriorityProp, tmpStr.local8Bit()); |
326 | 327 | ||
327 | // related event | 328 | // related event |
328 | if (anEvent->relatedTo()) { | 329 | if (anEvent->relatedTo()) { |
329 | addPropValue(vtodo, VCRelatedToProp, | 330 | addPropValue(vtodo, VCRelatedToProp, |
330 | anEvent->relatedTo()->uid().local8Bit()); | 331 | anEvent->relatedTo()->uid().local8Bit()); |
331 | } | 332 | } |
332 | 333 | ||
333 | // categories | 334 | // categories |
334 | tmpStrList = anEvent->categories(); | 335 | tmpStrList = anEvent->categories(); |
335 | tmpStr = ""; | 336 | tmpStr = ""; |
336 | QString catStr; | 337 | QString catStr; |
337 | for ( QStringList::Iterator it = tmpStrList.begin(); | 338 | for ( QStringList::Iterator it = tmpStrList.begin(); |
338 | it != tmpStrList.end(); | 339 | it != tmpStrList.end(); |
339 | ++it ) { | 340 | ++it ) { |
@@ -407,97 +408,98 @@ VObject* VCalFormat::eventToVEvent(const Event *anEvent) | |||
407 | // events that have time associated but take up no time should | 408 | // events that have time associated but take up no time should |
408 | // not have both DTSTART and DTEND. | 409 | // not have both DTSTART and DTEND. |
409 | if (anEvent->dtStart() != anEvent->dtEnd()) { | 410 | if (anEvent->dtStart() != anEvent->dtEnd()) { |
410 | tmpStr = qDateTimeToISO(anEvent->dtEnd(), | 411 | tmpStr = qDateTimeToISO(anEvent->dtEnd(), |
411 | !anEvent->doesFloat()); | 412 | !anEvent->doesFloat()); |
412 | addPropValue(vevent, VCDTendProp, tmpStr.local8Bit()); | 413 | addPropValue(vevent, VCDTendProp, tmpStr.local8Bit()); |
413 | } | 414 | } |
414 | 415 | ||
415 | // creation date | 416 | // creation date |
416 | tmpStr = qDateTimeToISO(anEvent->created()); | 417 | tmpStr = qDateTimeToISO(anEvent->created()); |
417 | addPropValue(vevent, VCDCreatedProp, tmpStr.local8Bit()); | 418 | addPropValue(vevent, VCDCreatedProp, tmpStr.local8Bit()); |
418 | 419 | ||
419 | // unique id | 420 | // unique id |
420 | addPropValue(vevent, VCUniqueStringProp, | 421 | addPropValue(vevent, VCUniqueStringProp, |
421 | anEvent->uid().local8Bit()); | 422 | anEvent->uid().local8Bit()); |
422 | 423 | ||
423 | // revision | 424 | // revision |
424 | tmpStr.sprintf("%i", anEvent->revision()); | 425 | tmpStr.sprintf("%i", anEvent->revision()); |
425 | addPropValue(vevent, VCSequenceProp, tmpStr.local8Bit()); | 426 | addPropValue(vevent, VCSequenceProp, tmpStr.local8Bit()); |
426 | 427 | ||
427 | // last modification date | 428 | // last modification date |
428 | tmpStr = qDateTimeToISO(anEvent->lastModified()); | 429 | tmpStr = qDateTimeToISO(anEvent->lastModified()); |
429 | addPropValue(vevent, VCLastModifiedProp, tmpStr.local8Bit()); | 430 | addPropValue(vevent, VCLastModifiedProp, tmpStr.local8Bit()); |
430 | 431 | ||
431 | // attendee and organizer stuff | 432 | // attendee and organizer stuff |
432 | tmpStr = "MAILTO:" + anEvent->organizer(); | 433 | tmpStr = "MAILTO:" + anEvent->organizer(); |
433 | addPropValue(vevent, ICOrganizerProp, tmpStr.local8Bit()); | 434 | addPropValue(vevent, ICOrganizerProp, tmpStr.local8Bit()); |
434 | 435 | ||
435 | if (anEvent->attendeeCount() != 0) { | 436 | if (anEvent->attendeeCount() != 0) { |
436 | QPtrList<Attendee> al = anEvent->attendees(); | 437 | QPtrList<Attendee> al = anEvent->attendees(); |
437 | QPtrListIterator<Attendee> ai(al); | 438 | QPtrListIterator<Attendee> ai(al); |
438 | Attendee *curAttendee; | 439 | Attendee *curAttendee; |
439 | 440 | ||
440 | // TODO: Put this functionality into Attendee class | 441 | // TODO: Put this functionality into Attendee class |
441 | for (; ai.current(); ++ai) { | 442 | for (; ai.current(); ++ai) { |
442 | curAttendee = ai.current(); | 443 | curAttendee = ai.current(); |
443 | if (!curAttendee->email().isEmpty() && | 444 | if (!curAttendee->email().isEmpty() && |
444 | !curAttendee->name().isEmpty()) | 445 | !curAttendee->name().isEmpty()) |
445 | tmpStr = "MAILTO:" + curAttendee->name() + " <" + | 446 | tmpStr = "MAILTO:" + curAttendee->name() + " <" + |
446 | curAttendee->email() + ">"; | 447 | curAttendee->email() + ">"; |
447 | else if (curAttendee->name().isEmpty()) | 448 | else if (curAttendee->name().isEmpty()) |
448 | tmpStr = "MAILTO: " + curAttendee->email(); | 449 | tmpStr = "MAILTO: " + curAttendee->email(); |
449 | else if (curAttendee->email().isEmpty()) | 450 | else if (curAttendee->email().isEmpty()) |
450 | tmpStr = "MAILTO: " + curAttendee->name(); | 451 | tmpStr = "MAILTO: " + curAttendee->name(); |
451 | else if (curAttendee->name().isEmpty() && | 452 | else if (curAttendee->name().isEmpty() && |
452 | curAttendee->email().isEmpty()) | 453 | curAttendee->email().isEmpty()) |
453 | kdDebug(5800) << "warning! this Event has an attendee w/o name or email!" << endl; | 454 | kdDebug(5800) << "warning! this Event has an attendee w/o name or email!" << endl; |
454 | VObject *aProp = addPropValue(vevent, VCAttendeeProp, tmpStr.local8Bit()); | 455 | VObject *aProp = addPropValue(vevent, VCAttendeeProp, tmpStr.local8Bit()); |
455 | addPropValue(aProp, VCRSVPProp, curAttendee->RSVP() ? "TRUE" : "FALSE");; | 456 | addPropValue(aProp, VCRoleProp, writeRole(curAttendee->role())); |
457 | addPropValue(aProp, VCRSVPProp, curAttendee->RSVP() ? "TRUE" : "FALSE"); | ||
456 | addPropValue(aProp, VCStatusProp, writeStatus(curAttendee->status())); | 458 | addPropValue(aProp, VCStatusProp, writeStatus(curAttendee->status())); |
457 | } | 459 | } |
458 | } | 460 | } |
459 | 461 | ||
460 | // recurrence rule stuff | 462 | // recurrence rule stuff |
461 | if (anEvent->recurrence()->doesRecur()) { | 463 | if (anEvent->recurrence()->doesRecur()) { |
462 | // some more variables | 464 | // some more variables |
463 | QPtrList<Recurrence::rMonthPos> tmpPositions; | 465 | QPtrList<Recurrence::rMonthPos> tmpPositions; |
464 | QPtrList<int> tmpDays; | 466 | QPtrList<int> tmpDays; |
465 | int *tmpDay; | 467 | int *tmpDay; |
466 | Recurrence::rMonthPos *tmpPos; | 468 | Recurrence::rMonthPos *tmpPos; |
467 | QString tmpStr2; | 469 | QString tmpStr2; |
468 | int i; | 470 | int i; |
469 | 471 | ||
470 | switch(anEvent->recurrence()->doesRecur()) { | 472 | switch(anEvent->recurrence()->doesRecur()) { |
471 | case Recurrence::rDaily: | 473 | case Recurrence::rDaily: |
472 | tmpStr.sprintf("D%i ",anEvent->recurrence()->frequency()); | 474 | tmpStr.sprintf("D%i ",anEvent->recurrence()->frequency()); |
473 | // if (anEvent->rDuration > 0) | 475 | // if (anEvent->rDuration > 0) |
474 | //tmpStr += "#"; | 476 | //tmpStr += "#"; |
475 | break; | 477 | break; |
476 | case Recurrence::rWeekly: | 478 | case Recurrence::rWeekly: |
477 | tmpStr.sprintf("W%i ",anEvent->recurrence()->frequency()); | 479 | tmpStr.sprintf("W%i ",anEvent->recurrence()->frequency()); |
478 | for (i = 0; i < 7; i++) { | 480 | for (i = 0; i < 7; i++) { |
479 | if (anEvent->recurrence()->days().testBit(i)) | 481 | if (anEvent->recurrence()->days().testBit(i)) |
480 | tmpStr += dayFromNum(i); | 482 | tmpStr += dayFromNum(i); |
481 | } | 483 | } |
482 | break; | 484 | break; |
483 | case Recurrence::rMonthlyPos: | 485 | case Recurrence::rMonthlyPos: |
484 | tmpStr.sprintf("MP%i ", anEvent->recurrence()->frequency()); | 486 | tmpStr.sprintf("MP%i ", anEvent->recurrence()->frequency()); |
485 | // write out all rMonthPos's | 487 | // write out all rMonthPos's |
486 | tmpPositions = anEvent->recurrence()->monthPositions(); | 488 | tmpPositions = anEvent->recurrence()->monthPositions(); |
487 | for (tmpPos = tmpPositions.first(); | 489 | for (tmpPos = tmpPositions.first(); |
488 | tmpPos; | 490 | tmpPos; |
489 | tmpPos = tmpPositions.next()) { | 491 | tmpPos = tmpPositions.next()) { |
490 | 492 | ||
491 | tmpStr2.sprintf("%i", tmpPos->rPos); | 493 | tmpStr2.sprintf("%i", tmpPos->rPos); |
492 | if (tmpPos->negative) | 494 | if (tmpPos->negative) |
493 | tmpStr2 += "- "; | 495 | tmpStr2 += "- "; |
494 | else | 496 | else |
495 | tmpStr2 += "+ "; | 497 | tmpStr2 += "+ "; |
496 | tmpStr += tmpStr2; | 498 | tmpStr += tmpStr2; |
497 | for (i = 0; i < 7; i++) { | 499 | for (i = 0; i < 7; i++) { |
498 | if (tmpPos->rDays.testBit(i)) | 500 | if (tmpPos->rDays.testBit(i)) |
499 | tmpStr += dayFromNum(i); | 501 | tmpStr += dayFromNum(i); |
500 | } | 502 | } |
501 | } // loop for all rMonthPos's | 503 | } // loop for all rMonthPos's |
502 | break; | 504 | break; |
503 | case Recurrence::rMonthlyDay: | 505 | case Recurrence::rMonthlyDay: |
@@ -706,100 +708,102 @@ Todo *VCalFormat::VTodoToEvent(VObject *vtodo) | |||
706 | // while the UID property is preferred, it is not required. We'll use the | 708 | // while the UID property is preferred, it is not required. We'll use the |
707 | // default Event UID if none is given. | 709 | // default Event UID if none is given. |
708 | if (vo) { | 710 | if (vo) { |
709 | anEvent->setUid(s = fakeCString(vObjectUStringZValue(vo))); | 711 | anEvent->setUid(s = fakeCString(vObjectUStringZValue(vo))); |
710 | deleteStr(s); | 712 | deleteStr(s); |
711 | } | 713 | } |
712 | 714 | ||
713 | // last modification date | 715 | // last modification date |
714 | if ((vo = isAPropertyOf(vtodo, VCLastModifiedProp)) != 0) { | 716 | if ((vo = isAPropertyOf(vtodo, VCLastModifiedProp)) != 0) { |
715 | anEvent->setLastModified(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); | 717 | anEvent->setLastModified(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); |
716 | deleteStr(s); | 718 | deleteStr(s); |
717 | } | 719 | } |
718 | else | 720 | else |
719 | anEvent->setLastModified(QDateTime(QDate::currentDate(), | 721 | anEvent->setLastModified(QDateTime(QDate::currentDate(), |
720 | QTime::currentTime())); | 722 | QTime::currentTime())); |
721 | 723 | ||
722 | // organizer | 724 | // organizer |
723 | // if our extension property for the event's ORGANIZER exists, add it. | 725 | // if our extension property for the event's ORGANIZER exists, add it. |
724 | if ((vo = isAPropertyOf(vtodo, ICOrganizerProp)) != 0) { | 726 | if ((vo = isAPropertyOf(vtodo, ICOrganizerProp)) != 0) { |
725 | anEvent->setOrganizer(s = fakeCString(vObjectUStringZValue(vo))); | 727 | anEvent->setOrganizer(s = fakeCString(vObjectUStringZValue(vo))); |
726 | deleteStr(s); | 728 | deleteStr(s); |
727 | } else { | 729 | } else { |
728 | anEvent->setOrganizer(mCalendar->getEmail()); | 730 | anEvent->setOrganizer(mCalendar->getEmail()); |
729 | } | 731 | } |
730 | 732 | ||
731 | // attendees. | 733 | // attendees. |
732 | initPropIterator(&voi, vtodo); | 734 | initPropIterator(&voi, vtodo); |
733 | while (moreIteration(&voi)) { | 735 | while (moreIteration(&voi)) { |
734 | vo = nextVObject(&voi); | 736 | vo = nextVObject(&voi); |
735 | if (strcmp(vObjectName(vo), VCAttendeeProp) == 0) { | 737 | if (strcmp(vObjectName(vo), VCAttendeeProp) == 0) { |
736 | Attendee *a; | 738 | Attendee *a; |
737 | VObject *vp; | 739 | VObject *vp; |
738 | s = fakeCString(vObjectUStringZValue(vo)); | 740 | s = fakeCString(vObjectUStringZValue(vo)); |
739 | QString tmpStr = QString::fromLocal8Bit(s); | 741 | QString tmpStr = QString::fromLocal8Bit(s); |
740 | deleteStr(s); | 742 | deleteStr(s); |
741 | tmpStr = tmpStr.simplifyWhiteSpace(); | 743 | tmpStr = tmpStr.simplifyWhiteSpace(); |
742 | int emailPos1, emailPos2; | 744 | int emailPos1, emailPos2; |
743 | if ((emailPos1 = tmpStr.find('<')) > 0) { | 745 | if ((emailPos1 = tmpStr.find('<')) > 0) { |
744 | // both email address and name | 746 | // both email address and name |
745 | emailPos2 = tmpStr.findRev('>'); | 747 | emailPos2 = tmpStr.findRev('>'); |
746 | a = new Attendee(tmpStr.left(emailPos1 - 1), | 748 | a = new Attendee(tmpStr.left(emailPos1 - 1), |
747 | tmpStr.mid(emailPos1 + 1, | 749 | tmpStr.mid(emailPos1 + 1, |
748 | emailPos2 - (emailPos1 + 1))); | 750 | emailPos2 - (emailPos1 + 1))); |
749 | } else if (tmpStr.find('@') > 0) { | 751 | } else if (tmpStr.find('@') > 0) { |
750 | // just an email address | 752 | // just an email address |
751 | a = new Attendee(0, tmpStr); | 753 | a = new Attendee(0, tmpStr); |
752 | } else { | 754 | } else { |
753 | // just a name | 755 | // just a name |
754 | QString email = tmpStr.replace( QRegExp(" "), "." ); | 756 | // QString email = tmpStr.replace( QRegExp(" "), "." ); |
755 | a = new Attendee(tmpStr,email); | 757 | a = new Attendee(tmpStr,0); |
756 | } | 758 | } |
757 | 759 | // is there a Role property? | |
760 | if ((vp = isAPropertyOf(vo, VCRoleProp)) != 0) | ||
761 | a->setRole(readRole(vObjectStringZValue(vp))); | ||
758 | // is there an RSVP property? | 762 | // is there an RSVP property? |
759 | if ((vp = isAPropertyOf(vo, VCRSVPProp)) != 0) | 763 | if ((vp = isAPropertyOf(vo, VCRSVPProp)) != 0) |
760 | a->setRSVP(vObjectStringZValue(vp)); | 764 | a->setRSVP(vObjectStringZValue(vp)); |
761 | // is there a status property? | 765 | // is there a status property? |
762 | if ((vp = isAPropertyOf(vo, VCStatusProp)) != 0) | 766 | if ((vp = isAPropertyOf(vo, VCStatusProp)) != 0) |
763 | a->setStatus(readStatus(vObjectStringZValue(vp))); | 767 | a->setStatus(readStatus(vObjectStringZValue(vp))); |
764 | // add the attendee | 768 | // add the attendee |
765 | anEvent->addAttendee(a); | 769 | anEvent->addAttendee(a); |
766 | } | 770 | } |
767 | } | 771 | } |
768 | 772 | ||
769 | // description for todo | 773 | // description for todo |
770 | if ((vo = isAPropertyOf(vtodo, VCDescriptionProp)) != 0) { | 774 | if ((vo = isAPropertyOf(vtodo, VCDescriptionProp)) != 0) { |
771 | s = fakeCString(vObjectUStringZValue(vo)); | 775 | s = fakeCString(vObjectUStringZValue(vo)); |
772 | anEvent->setDescription(QString::fromLocal8Bit(s)); | 776 | anEvent->setDescription(QString::fromLocal8Bit(s)); |
773 | deleteStr(s); | 777 | deleteStr(s); |
774 | } | 778 | } |
775 | 779 | ||
776 | // summary | 780 | // summary |
777 | if ((vo = isAPropertyOf(vtodo, VCSummaryProp))) { | 781 | if ((vo = isAPropertyOf(vtodo, VCSummaryProp))) { |
778 | s = fakeCString(vObjectUStringZValue(vo)); | 782 | s = fakeCString(vObjectUStringZValue(vo)); |
779 | anEvent->setSummary(QString::fromLocal8Bit(s)); | 783 | anEvent->setSummary(QString::fromLocal8Bit(s)); |
780 | deleteStr(s); | 784 | deleteStr(s); |
781 | } | 785 | } |
782 | if ((vo = isAPropertyOf(vtodo, VCLocationProp))) { | 786 | if ((vo = isAPropertyOf(vtodo, VCLocationProp))) { |
783 | s = fakeCString(vObjectUStringZValue(vo)); | 787 | s = fakeCString(vObjectUStringZValue(vo)); |
784 | anEvent->setLocation(QString::fromLocal8Bit(s)); | 788 | anEvent->setLocation(QString::fromLocal8Bit(s)); |
785 | deleteStr(s); | 789 | deleteStr(s); |
786 | } | 790 | } |
787 | 791 | ||
788 | 792 | ||
789 | // completed | 793 | // completed |
790 | // was: status | 794 | // was: status |
791 | if ((vo = isAPropertyOf(vtodo, VCStatusProp)) != 0) { | 795 | if ((vo = isAPropertyOf(vtodo, VCStatusProp)) != 0) { |
792 | s = fakeCString(vObjectUStringZValue(vo)); | 796 | s = fakeCString(vObjectUStringZValue(vo)); |
793 | if (strcmp(s,"COMPLETED") == 0) { | 797 | if (strcmp(s,"COMPLETED") == 0) { |
794 | anEvent->setCompleted(true); | 798 | anEvent->setCompleted(true); |
795 | } else { | 799 | } else { |
796 | anEvent->setCompleted(false); | 800 | anEvent->setCompleted(false); |
797 | } | 801 | } |
798 | deleteStr(s); | 802 | deleteStr(s); |
799 | } | 803 | } |
800 | else | 804 | else |
801 | anEvent->setCompleted(false); | 805 | anEvent->setCompleted(false); |
802 | 806 | ||
803 | // completion date | 807 | // completion date |
804 | if ((vo = isAPropertyOf(vtodo, VCCompletedProp)) != 0) { | 808 | if ((vo = isAPropertyOf(vtodo, VCCompletedProp)) != 0) { |
805 | anEvent->setCompleted(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); | 809 | anEvent->setCompleted(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); |
@@ -932,100 +936,105 @@ Event* VCalFormat::VEventToEvent(VObject *vevent) | |||
932 | if ((vo = isAPropertyOf(vevent, VCSequenceProp)) != 0) { | 936 | if ((vo = isAPropertyOf(vevent, VCSequenceProp)) != 0) { |
933 | anEvent->setRevision(atoi(s = fakeCString(vObjectUStringZValue(vo)))); | 937 | anEvent->setRevision(atoi(s = fakeCString(vObjectUStringZValue(vo)))); |
934 | deleteStr(s); | 938 | deleteStr(s); |
935 | } | 939 | } |
936 | else | 940 | else |
937 | anEvent->setRevision(0); | 941 | anEvent->setRevision(0); |
938 | 942 | ||
939 | // last modification date | 943 | // last modification date |
940 | if ((vo = isAPropertyOf(vevent, VCLastModifiedProp)) != 0) { | 944 | if ((vo = isAPropertyOf(vevent, VCLastModifiedProp)) != 0) { |
941 | anEvent->setLastModified(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); | 945 | anEvent->setLastModified(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); |
942 | deleteStr(s); | 946 | deleteStr(s); |
943 | } | 947 | } |
944 | else | 948 | else |
945 | anEvent->setLastModified(QDateTime(QDate::currentDate(), | 949 | anEvent->setLastModified(QDateTime(QDate::currentDate(), |
946 | QTime::currentTime())); | 950 | QTime::currentTime())); |
947 | 951 | ||
948 | // organizer | 952 | // organizer |
949 | // if our extension property for the event's ORGANIZER exists, add it. | 953 | // if our extension property for the event's ORGANIZER exists, add it. |
950 | if ((vo = isAPropertyOf(vevent, ICOrganizerProp)) != 0) { | 954 | if ((vo = isAPropertyOf(vevent, ICOrganizerProp)) != 0) { |
951 | anEvent->setOrganizer(s = fakeCString(vObjectUStringZValue(vo))); | 955 | anEvent->setOrganizer(s = fakeCString(vObjectUStringZValue(vo))); |
952 | deleteStr(s); | 956 | deleteStr(s); |
953 | } else { | 957 | } else { |
954 | anEvent->setOrganizer(mCalendar->getEmail()); | 958 | anEvent->setOrganizer(mCalendar->getEmail()); |
955 | } | 959 | } |
956 | 960 | ||
957 | // deal with attendees. | 961 | // deal with attendees. |
958 | initPropIterator(&voi, vevent); | 962 | initPropIterator(&voi, vevent); |
959 | while (moreIteration(&voi)) { | 963 | while (moreIteration(&voi)) { |
960 | vo = nextVObject(&voi); | 964 | vo = nextVObject(&voi); |
961 | if (strcmp(vObjectName(vo), VCAttendeeProp) == 0) { | 965 | if (strcmp(vObjectName(vo), VCAttendeeProp) == 0) { |
962 | Attendee *a; | 966 | Attendee *a; |
963 | VObject *vp; | 967 | VObject *vp; |
964 | s = fakeCString(vObjectUStringZValue(vo)); | 968 | s = fakeCString(vObjectUStringZValue(vo)); |
965 | QString tmpStr = QString::fromLocal8Bit(s); | 969 | QString tmpStr = QString::fromLocal8Bit(s); |
966 | deleteStr(s); | 970 | deleteStr(s); |
967 | tmpStr = tmpStr.simplifyWhiteSpace(); | 971 | tmpStr = tmpStr.simplifyWhiteSpace(); |
968 | int emailPos1, emailPos2; | 972 | int emailPos1, emailPos2; |
969 | if ((emailPos1 = tmpStr.find('<')) > 0) { | 973 | if ((emailPos1 = tmpStr.find('<')) > 0) { |
970 | // both email address and name | 974 | // both email address and name |
971 | emailPos2 = tmpStr.findRev('>'); | 975 | emailPos2 = tmpStr.findRev('>'); |
972 | a = new Attendee(tmpStr.left(emailPos1 - 1), | 976 | a = new Attendee(tmpStr.left(emailPos1 - 1), |
973 | tmpStr.mid(emailPos1 + 1, | 977 | tmpStr.mid(emailPos1 + 1, |
974 | emailPos2 - (emailPos1 + 1))); | 978 | emailPos2 - (emailPos1 + 1))); |
975 | } else if (tmpStr.find('@') > 0) { | 979 | } else if (tmpStr.find('@') > 0) { |
976 | // just an email address | 980 | // just an email address |
977 | a = new Attendee(0, tmpStr); | 981 | a = new Attendee(0, tmpStr); |
978 | } else { | 982 | } else { |
979 | // just a name | 983 | // just a name |
980 | QString email = tmpStr.replace( QRegExp(" "), "." ); | 984 | //QString email = tmpStr.replace( QRegExp(" "), "." ); |
981 | a = new Attendee(tmpStr,email); | 985 | a = new Attendee(tmpStr,0); |
982 | } | 986 | } |
983 | 987 | ||
988 | |||
989 | // is there a Role property? | ||
990 | if ((vp = isAPropertyOf(vo, VCRoleProp)) != 0) | ||
991 | a->setRole(readRole(vObjectStringZValue(vp))); | ||
992 | |||
984 | // is there an RSVP property? | 993 | // is there an RSVP property? |
985 | if ((vp = isAPropertyOf(vo, VCRSVPProp)) != 0) | 994 | if ((vp = isAPropertyOf(vo, VCRSVPProp)) != 0) |
986 | a->setRSVP(vObjectStringZValue(vp)); | 995 | a->setRSVP(vObjectStringZValue(vp)); |
987 | // is there a status property? | 996 | // is there a status property? |
988 | if ((vp = isAPropertyOf(vo, VCStatusProp)) != 0) | 997 | if ((vp = isAPropertyOf(vo, VCStatusProp)) != 0) |
989 | a->setStatus(readStatus(vObjectStringZValue(vp))); | 998 | a->setStatus(readStatus(vObjectStringZValue(vp))); |
990 | // add the attendee | 999 | // add the attendee |
991 | anEvent->addAttendee(a); | 1000 | anEvent->addAttendee(a); |
992 | } | 1001 | } |
993 | } | 1002 | } |
994 | 1003 | ||
995 | // This isn't strictly true. An event that doesn't have a start time | 1004 | // This isn't strictly true. An event that doesn't have a start time |
996 | // or an end time doesn't "float", it has an anchor in time but it doesn't | 1005 | // or an end time doesn't "float", it has an anchor in time but it doesn't |
997 | // "take up" any time. | 1006 | // "take up" any time. |
998 | /*if ((isAPropertyOf(vevent, VCDTstartProp) == 0) || | 1007 | /*if ((isAPropertyOf(vevent, VCDTstartProp) == 0) || |
999 | (isAPropertyOf(vevent, VCDTendProp) == 0)) { | 1008 | (isAPropertyOf(vevent, VCDTendProp) == 0)) { |
1000 | anEvent->setFloats(TRUE); | 1009 | anEvent->setFloats(TRUE); |
1001 | } else { | 1010 | } else { |
1002 | }*/ | 1011 | }*/ |
1003 | 1012 | ||
1004 | anEvent->setFloats(FALSE); | 1013 | anEvent->setFloats(FALSE); |
1005 | 1014 | ||
1006 | // start time | 1015 | // start time |
1007 | if ((vo = isAPropertyOf(vevent, VCDTstartProp)) != 0) { | 1016 | if ((vo = isAPropertyOf(vevent, VCDTstartProp)) != 0) { |
1008 | anEvent->setDtStart(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); | 1017 | anEvent->setDtStart(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); |
1009 | // kdDebug(5800) << "s is " << // s << ", ISO is " << ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))).toString() << endl; | 1018 | // kdDebug(5800) << "s is " << // s << ", ISO is " << ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))).toString() << endl; |
1010 | deleteStr(s); | 1019 | deleteStr(s); |
1011 | if (anEvent->dtStart().time().isNull()) | 1020 | if (anEvent->dtStart().time().isNull()) |
1012 | anEvent->setFloats(TRUE); | 1021 | anEvent->setFloats(TRUE); |
1013 | } | 1022 | } |
1014 | 1023 | ||
1015 | // stop time | 1024 | // stop time |
1016 | if ((vo = isAPropertyOf(vevent, VCDTendProp)) != 0) { | 1025 | if ((vo = isAPropertyOf(vevent, VCDTendProp)) != 0) { |
1017 | anEvent->setDtEnd(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); | 1026 | anEvent->setDtEnd(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); |
1018 | deleteStr(s); | 1027 | deleteStr(s); |
1019 | if (anEvent->dtEnd().time().isNull()) | 1028 | if (anEvent->dtEnd().time().isNull()) |
1020 | anEvent->setFloats(TRUE); | 1029 | anEvent->setFloats(TRUE); |
1021 | } | 1030 | } |
1022 | 1031 | ||
1023 | // at this point, there should be at least a start or end time. | 1032 | // at this point, there should be at least a start or end time. |
1024 | // fix up for events that take up no time but have a time associated | 1033 | // fix up for events that take up no time but have a time associated |
1025 | if (!(vo = isAPropertyOf(vevent, VCDTstartProp))) | 1034 | if (!(vo = isAPropertyOf(vevent, VCDTstartProp))) |
1026 | anEvent->setDtStart(anEvent->dtEnd()); | 1035 | anEvent->setDtStart(anEvent->dtEnd()); |
1027 | if (!(vo = isAPropertyOf(vevent, VCDTendProp))) | 1036 | if (!(vo = isAPropertyOf(vevent, VCDTendProp))) |
1028 | anEvent->setDtEnd(anEvent->dtStart()); | 1037 | anEvent->setDtEnd(anEvent->dtStart()); |
1029 | 1038 | ||
1030 | /////////////////////////////////////////////////////////////////////////// | 1039 | /////////////////////////////////////////////////////////////////////////// |
1031 | 1040 | ||
@@ -1613,97 +1622,115 @@ void VCalFormat::populate(VObject *vcal) | |||
1613 | goto SKIP; | 1622 | goto SKIP; |
1614 | } | 1623 | } |
1615 | } else if (strcmp(vObjectName(curVO), VCTodoProp) == 0) { | 1624 | } else if (strcmp(vObjectName(curVO), VCTodoProp) == 0) { |
1616 | Todo *aTodo = VTodoToEvent(curVO); | 1625 | Todo *aTodo = VTodoToEvent(curVO); |
1617 | mCalendar->addTodo(aTodo); | 1626 | mCalendar->addTodo(aTodo); |
1618 | } else if ((strcmp(vObjectName(curVO), VCVersionProp) == 0) || | 1627 | } else if ((strcmp(vObjectName(curVO), VCVersionProp) == 0) || |
1619 | (strcmp(vObjectName(curVO), VCProdIdProp) == 0) || | 1628 | (strcmp(vObjectName(curVO), VCProdIdProp) == 0) || |
1620 | (strcmp(vObjectName(curVO), VCTimeZoneProp) == 0)) { | 1629 | (strcmp(vObjectName(curVO), VCTimeZoneProp) == 0)) { |
1621 | // do nothing, we know these properties and we want to skip them. | 1630 | // do nothing, we know these properties and we want to skip them. |
1622 | // we have either already processed them or are ignoring them. | 1631 | // we have either already processed them or are ignoring them. |
1623 | ; | 1632 | ; |
1624 | } else { | 1633 | } else { |
1625 | kdDebug(5800) << "Ignoring unknown vObject \"" << vObjectName(curVO) << "\"" << endl; | 1634 | kdDebug(5800) << "Ignoring unknown vObject \"" << vObjectName(curVO) << "\"" << endl; |
1626 | } | 1635 | } |
1627 | SKIP: | 1636 | SKIP: |
1628 | ; | 1637 | ; |
1629 | } // while | 1638 | } // while |
1630 | 1639 | ||
1631 | // Post-Process list of events with relations, put Event objects in relation | 1640 | // Post-Process list of events with relations, put Event objects in relation |
1632 | Event *ev; | 1641 | Event *ev; |
1633 | for ( ev=mEventsRelate.first(); ev != 0; ev=mEventsRelate.next() ) { | 1642 | for ( ev=mEventsRelate.first(); ev != 0; ev=mEventsRelate.next() ) { |
1634 | ev->setRelatedTo(mCalendar->event(ev->relatedToUid())); | 1643 | ev->setRelatedTo(mCalendar->event(ev->relatedToUid())); |
1635 | } | 1644 | } |
1636 | Todo *todo; | 1645 | Todo *todo; |
1637 | for ( todo=mTodosRelate.first(); todo != 0; todo=mTodosRelate.next() ) { | 1646 | for ( todo=mTodosRelate.first(); todo != 0; todo=mTodosRelate.next() ) { |
1638 | todo->setRelatedTo(mCalendar->todo(todo->relatedToUid())); | 1647 | todo->setRelatedTo(mCalendar->todo(todo->relatedToUid())); |
1639 | } | 1648 | } |
1640 | } | 1649 | } |
1641 | 1650 | ||
1642 | const char *VCalFormat::dayFromNum(int day) | 1651 | const char *VCalFormat::dayFromNum(int day) |
1643 | { | 1652 | { |
1644 | const char *days[7] = { "MO ", "TU ", "WE ", "TH ", "FR ", "SA ", "SU " }; | 1653 | const char *days[7] = { "MO ", "TU ", "WE ", "TH ", "FR ", "SA ", "SU " }; |
1645 | 1654 | ||
1646 | return days[day]; | 1655 | return days[day]; |
1647 | } | 1656 | } |
1648 | 1657 | ||
1649 | int VCalFormat::numFromDay(const QString &day) | 1658 | int VCalFormat::numFromDay(const QString &day) |
1650 | { | 1659 | { |
1651 | if (day == "MO ") return 0; | 1660 | if (day == "MO ") return 0; |
1652 | if (day == "TU ") return 1; | 1661 | if (day == "TU ") return 1; |
1653 | if (day == "WE ") return 2; | 1662 | if (day == "WE ") return 2; |
1654 | if (day == "TH ") return 3; | 1663 | if (day == "TH ") return 3; |
1655 | if (day == "FR ") return 4; | 1664 | if (day == "FR ") return 4; |
1656 | if (day == "SA ") return 5; | 1665 | if (day == "SA ") return 5; |
1657 | if (day == "SU ") return 6; | 1666 | if (day == "SU ") return 6; |
1658 | 1667 | ||
1659 | return -1; // something bad happened. :) | 1668 | return -1; // something bad happened. :) |
1660 | } | 1669 | } |
1670 | Attendee::Role VCalFormat::readRole(const char *s) const | ||
1671 | { | ||
1672 | QString statStr = s; | ||
1673 | statStr = statStr.upper(); | ||
1674 | Attendee::Role role = Attendee::ReqParticipant; | ||
1675 | |||
1676 | if ( statStr == "OWNER") | ||
1677 | role = Attendee::Chair; | ||
1678 | // enum Role { ReqParticipant, OptParticipant, NonParticipant, Chair }; | ||
1679 | |||
1680 | return role; | ||
1681 | } | ||
1661 | 1682 | ||
1683 | QCString VCalFormat::writeRole(Attendee::Role role) const | ||
1684 | { | ||
1685 | if ( role == Attendee::Chair ) | ||
1686 | return "OWNER"; | ||
1687 | return "ATTENDEE"; | ||
1688 | } | ||
1662 | Attendee::PartStat VCalFormat::readStatus(const char *s) const | 1689 | Attendee::PartStat VCalFormat::readStatus(const char *s) const |
1663 | { | 1690 | { |
1664 | QString statStr = s; | 1691 | QString statStr = s; |
1665 | statStr = statStr.upper(); | 1692 | statStr = statStr.upper(); |
1666 | Attendee::PartStat status; | 1693 | Attendee::PartStat status; |
1667 | 1694 | ||
1668 | if (statStr == "X-ACTION") | 1695 | if (statStr == "X-ACTION") |
1669 | status = Attendee::NeedsAction; | 1696 | status = Attendee::NeedsAction; |
1670 | else if (statStr == "NEEDS ACTION") | 1697 | else if (statStr == "NEEDS ACTION") |
1671 | status = Attendee::NeedsAction; | 1698 | status = Attendee::NeedsAction; |
1672 | else if (statStr== "ACCEPTED") | 1699 | else if (statStr== "ACCEPTED") |
1673 | status = Attendee::Accepted; | 1700 | status = Attendee::Accepted; |
1674 | else if (statStr== "SENT") | 1701 | else if (statStr== "SENT") |
1675 | status = Attendee::NeedsAction; | 1702 | status = Attendee::NeedsAction; |
1676 | else if (statStr== "TENTATIVE") | 1703 | else if (statStr== "TENTATIVE") |
1677 | status = Attendee::Tentative; | 1704 | status = Attendee::Tentative; |
1678 | else if (statStr== "CONFIRMED") | 1705 | else if (statStr== "CONFIRMED") |
1679 | status = Attendee::Accepted; | 1706 | status = Attendee::Accepted; |
1680 | else if (statStr== "DECLINED") | 1707 | else if (statStr== "DECLINED") |
1681 | status = Attendee::Declined; | 1708 | status = Attendee::Declined; |
1682 | else if (statStr== "COMPLETED") | 1709 | else if (statStr== "COMPLETED") |
1683 | status = Attendee::Completed; | 1710 | status = Attendee::Completed; |
1684 | else if (statStr== "DELEGATED") | 1711 | else if (statStr== "DELEGATED") |
1685 | status = Attendee::Delegated; | 1712 | status = Attendee::Delegated; |
1686 | else { | 1713 | else { |
1687 | kdDebug(5800) << "error setting attendee mStatus, unknown mStatus!" << endl; | 1714 | kdDebug(5800) << "error setting attendee mStatus, unknown mStatus!" << endl; |
1688 | status = Attendee::NeedsAction; | 1715 | status = Attendee::NeedsAction; |
1689 | } | 1716 | } |
1690 | 1717 | ||
1691 | return status; | 1718 | return status; |
1692 | } | 1719 | } |
1693 | 1720 | ||
1694 | QCString VCalFormat::writeStatus(Attendee::PartStat status) const | 1721 | QCString VCalFormat::writeStatus(Attendee::PartStat status) const |
1695 | { | 1722 | { |
1696 | switch(status) { | 1723 | switch(status) { |
1697 | default: | 1724 | default: |
1698 | case Attendee::NeedsAction: | 1725 | case Attendee::NeedsAction: |
1699 | return "NEEDS ACTION"; | 1726 | return "NEEDS ACTION"; |
1700 | break; | 1727 | break; |
1701 | case Attendee::Accepted: | 1728 | case Attendee::Accepted: |
1702 | return "ACCEPTED"; | 1729 | return "ACCEPTED"; |
1703 | break; | 1730 | break; |
1704 | case Attendee::Declined: | 1731 | case Attendee::Declined: |
1705 | return "DECLINED"; | 1732 | return "DECLINED"; |
1706 | break; | 1733 | break; |
1707 | case Attendee::Tentative: | 1734 | case Attendee::Tentative: |
1708 | return "TENTATIVE"; | 1735 | return "TENTATIVE"; |
1709 | break; | 1736 | break; |