00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <qapplication.h>
00024 #include <qdatetime.h>
00025 #include <qstring.h>
00026 #include <qptrlist.h>
00027 #include <qregexp.h>
00028 #include <qclipboard.h>
00029 #include <qdialog.h>
00030 #include <qfile.h>
00031
00032 #include <kdebug.h>
00033 #include <kmessagebox.h>
00034 #include <kiconloader.h>
00035 #include <klocale.h>
00036
00037 #include "vcc.h"
00038 #include "vobject.h"
00039 extern "C" {
00040 #include "icaltime.h"
00041 }
00042 #include "vcaldrag.h"
00043 #include "calendar.h"
00044
00045 #include "vcalformat.h"
00046
00047 using namespace KCal;
00048
00049 VCalFormat::VCalFormat()
00050 {
00051 }
00052
00053 VCalFormat::~VCalFormat()
00054 {
00055 }
00056
00057 bool VCalFormat::load(Calendar *calendar, const QString &fileName)
00058 {
00059 mCalendar = calendar;
00060
00061 clearException();
00062
00063 kdDebug(5800) << "VCalFormat::load() " << fileName << endl;
00064
00065 VObject *vcal = 0;
00066
00067
00068
00069 vcal = Parse_MIME_FromFileName(const_cast<char *>(QFile::encodeName(fileName).data()));
00070
00071 if (!vcal) {
00072 setException(new ErrorFormat(ErrorFormat::CalVersionUnknown));
00073 return FALSE;
00074 }
00075
00076
00077
00078
00079 populate(vcal);
00080
00081
00082 cleanVObjects(vcal);
00083 cleanStrTbl();
00084
00085 return true;
00086 }
00087
00088
00089 bool VCalFormat::save(Calendar *calendar, const QString &fileName)
00090 {
00091 mCalendar = calendar;
00092
00093 QString tmpStr;
00094 VObject *vcal, *vo;
00095
00096 kdDebug(5800) << "VCalFormat::save(): " << fileName << endl;
00097
00098 vcal = newVObject(VCCalProp);
00099
00100
00101 addPropValue(vcal,VCProdIdProp, productId().latin1());
00102 addPropValue(vcal,VCVersionProp, _VCAL_VERSION);
00103
00104
00105 Todo::List todoList = mCalendar->rawTodos();
00106 Todo::List::ConstIterator it;
00107 for ( it = todoList.begin(); it != todoList.end(); ++it ) {
00108 vo = eventToVTodo( *it );
00109 addVObjectProp( vcal, vo );
00110 }
00111
00112
00113 Event::List events = mCalendar->rawEvents();
00114 Event::List::ConstIterator it2;
00115 for( it2 = events.begin(); it2 != events.end(); ++it2 ) {
00116 vo = eventToVEvent( *it2 );
00117 addVObjectProp( vcal, vo );
00118 }
00119
00120 writeVObjectToFile(QFile::encodeName(fileName).data() ,vcal);
00121 cleanVObjects(vcal);
00122 cleanStrTbl();
00123
00124 if (QFile::exists(fileName)) {
00125 kdDebug(5800) << "No error" << endl;
00126 return true;
00127 } else {
00128 kdDebug(5800) << "Error" << endl;
00129 return false;
00130 }
00131
00132 return false;
00133 }
00134
00135 bool VCalFormat::fromString( Calendar *calendar, const QString &text )
00136 {
00137
00138
00139 QCString data = text.utf8();
00140
00141 if ( !data.size() ) return false;
00142
00143 VObject *vcal = Parse_MIME( data.data(), data.size());
00144 if ( !vcal ) return false;
00145
00146 VObjectIterator i;
00147 VObject *curvo;
00148 initPropIterator( &i, vcal );
00149
00150
00151 do {
00152 curvo = nextVObject( &i );
00153 } while ( strcmp( vObjectName( curvo ), VCEventProp ) &&
00154 strcmp( vObjectName( curvo ), VCTodoProp ) );
00155
00156 if ( strcmp( vObjectName( curvo ), VCEventProp ) == 0 ) {
00157 Event *event = VEventToEvent( curvo );
00158 calendar->addEvent( event );
00159 } else {
00160 kdDebug(5800) << "VCalFormat::fromString(): Unknown object type." << endl;
00161 deleteVObject( vcal );
00162 return false;
00163 }
00164
00165 deleteVObject( vcal );
00166
00167 return true;
00168 }
00169
00170 QString VCalFormat::toString( Calendar *calendar )
00171 {
00172
00173
00174 VObject *vcal = newVObject(VCCalProp);
00175
00176 addPropValue( vcal, VCProdIdProp, CalFormat::productId().latin1() );
00177 addPropValue( vcal, VCVersionProp, _VCAL_VERSION );
00178
00179
00180 Event::List events = calendar->events();
00181 Event *event = events.first();
00182 if ( !event ) return QString::null;
00183
00184 VObject *vevent = eventToVEvent( event );
00185
00186 addVObjectProp( vcal, vevent );
00187
00188 char *buf = writeMemVObject( 0, 0, vcal );
00189
00190 QString result( buf );
00191
00192 cleanVObject( vcal );
00193
00194 return result;
00195 }
00196
00197 VObject *VCalFormat::eventToVTodo(const Todo *anEvent)
00198 {
00199 VObject *vtodo;
00200 QString tmpStr;
00201 QStringList tmpStrList;
00202
00203 vtodo = newVObject(VCTodoProp);
00204
00205
00206 if (anEvent->hasDueDate()) {
00207 tmpStr = qDateTimeToISO(anEvent->dtDue(),
00208 !anEvent->doesFloat());
00209 addPropValue(vtodo, VCDueProp, tmpStr.local8Bit());
00210 }
00211
00212
00213 if (anEvent->hasStartDate()) {
00214 tmpStr = qDateTimeToISO(anEvent->dtStart(),
00215 !anEvent->doesFloat());
00216 addPropValue(vtodo, VCDTstartProp, tmpStr.local8Bit());
00217 }
00218
00219
00220 tmpStr = qDateTimeToISO(anEvent->created());
00221 addPropValue(vtodo, VCDCreatedProp, tmpStr.local8Bit());
00222
00223
00224 addPropValue(vtodo, VCUniqueStringProp,
00225 anEvent->uid().local8Bit());
00226
00227
00228 tmpStr.sprintf("%i", anEvent->revision());
00229 addPropValue(vtodo, VCSequenceProp, tmpStr.local8Bit());
00230
00231
00232 tmpStr = qDateTimeToISO(anEvent->lastModified());
00233 addPropValue(vtodo, VCLastModifiedProp, tmpStr.local8Bit());
00234
00235
00236 tmpStr = "MAILTO:" + anEvent->organizer();
00237 addPropValue(vtodo, ICOrganizerProp, tmpStr.local8Bit());
00238
00239
00240 if ( anEvent->attendeeCount() > 0 ) {
00241 Attendee::List::ConstIterator it;
00242 Attendee *curAttendee;
00243 for ( it = anEvent->attendees().begin(); it != anEvent->attendees().end();
00244 ++it ) {
00245 curAttendee = *it;
00246 if (!curAttendee->email().isEmpty() &&
00247 !curAttendee->name().isEmpty())
00248 tmpStr = "MAILTO:" + curAttendee->name() + " <" +
00249 curAttendee->email() + ">";
00250 else if (curAttendee->name().isEmpty())
00251 tmpStr = "MAILTO: " + curAttendee->email();
00252 else if (curAttendee->email().isEmpty())
00253 tmpStr = "MAILTO: " + curAttendee->name();
00254 else if (curAttendee->name().isEmpty() &&
00255 curAttendee->email().isEmpty())
00256 kdDebug(5800) << "warning! this Event has an attendee w/o name or email!" << endl;
00257 VObject *aProp = addPropValue(vtodo, VCAttendeeProp, tmpStr.local8Bit());
00258 addPropValue(aProp, VCRSVPProp, curAttendee->RSVP() ? "TRUE" : "FALSE");
00259 addPropValue(aProp, VCStatusProp, writeStatus(curAttendee->status()));
00260 }
00261 }
00262
00263
00264 if (!anEvent->description().isEmpty()) {
00265 VObject *d = addPropValue(vtodo, VCDescriptionProp,
00266 anEvent->description().local8Bit());
00267 if (anEvent->description().find('\n') != -1)
00268 addProp(d, VCQuotedPrintableProp);
00269 }
00270
00271
00272 if (!anEvent->summary().isEmpty())
00273 addPropValue(vtodo, VCSummaryProp, anEvent->summary().local8Bit());
00274
00275
00276 if (!anEvent->location().isEmpty())
00277 addPropValue(vtodo, VCLocationProp, anEvent->location().local8Bit());
00278
00279
00280
00281
00282 addPropValue(vtodo, VCStatusProp, anEvent->isCompleted() ? "COMPLETED" :
00283 "NEEDS_ACTION");
00284
00285 if (anEvent->hasCompletedDate()) {
00286 tmpStr = qDateTimeToISO(anEvent->completed());
00287 addPropValue(vtodo, VCCompletedProp, tmpStr.local8Bit());
00288 }
00289
00290
00291 tmpStr.sprintf("%i",anEvent->priority());
00292 addPropValue(vtodo, VCPriorityProp, tmpStr.local8Bit());
00293
00294
00295 if (anEvent->relatedTo()) {
00296 addPropValue(vtodo, VCRelatedToProp,
00297 anEvent->relatedTo()->uid().local8Bit());
00298 }
00299
00300
00301 tmpStrList = anEvent->categories();
00302 tmpStr = "";
00303 QString catStr;
00304 for ( QStringList::Iterator it = tmpStrList.begin();
00305 it != tmpStrList.end();
00306 ++it ) {
00307 catStr = *it;
00308 if (catStr[0] == ' ')
00309 tmpStr += catStr.mid(1);
00310 else
00311 tmpStr += catStr;
00312
00313
00314
00315 tmpStr += ";";
00316 }
00317 if (!tmpStr.isEmpty()) {
00318 tmpStr.truncate(tmpStr.length()-1);
00319 addPropValue(vtodo, VCCategoriesProp, tmpStr.local8Bit());
00320 }
00321
00322
00323 kdDebug(5800) << "vcalformat::eventToVTodo was called" << endl;
00324 Alarm::List::ConstIterator it;
00325 for ( it = anEvent->alarms().begin(); it != anEvent->alarms().end(); ++it ) {
00326 Alarm *alarm = *it;
00327 if (alarm->enabled()) {
00328 VObject *a = addProp(vtodo, VCDAlarmProp);
00329 tmpStr = qDateTimeToISO(alarm->time());
00330 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
00331 addPropValue(a, VCRepeatCountProp, "1");
00332 addPropValue(a, VCDisplayStringProp, "beep!");
00333 if (alarm->type() == Alarm::Audio) {
00334 a = addProp(vtodo, VCAAlarmProp);
00335 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
00336 addPropValue(a, VCRepeatCountProp, "1");
00337 addPropValue(a, VCAudioContentProp, QFile::encodeName(alarm->audioFile()));
00338 }
00339 else if (alarm->type() == Alarm::Procedure) {
00340 a = addProp(vtodo, VCPAlarmProp);
00341 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
00342 addPropValue(a, VCRepeatCountProp, "1");
00343 addPropValue(a, VCProcedureNameProp, QFile::encodeName(alarm->programFile()));
00344 }
00345 }
00346 }
00347
00348 if (anEvent->pilotId()) {
00349
00350 tmpStr.sprintf("%i",anEvent->pilotId());
00351 addPropValue(vtodo, KPilotIdProp, tmpStr.local8Bit());
00352 tmpStr.sprintf("%i",anEvent->syncStatus());
00353 addPropValue(vtodo, KPilotStatusProp, tmpStr.local8Bit());
00354 }
00355
00356 return vtodo;
00357 }
00358
00359 VObject* VCalFormat::eventToVEvent(const Event *anEvent)
00360 {
00361 VObject *vevent;
00362 QString tmpStr;
00363 QStringList tmpStrList;
00364
00365 vevent = newVObject(VCEventProp);
00366
00367
00368 tmpStr = qDateTimeToISO(anEvent->dtStart(),
00369 !anEvent->doesFloat());
00370 addPropValue(vevent, VCDTstartProp, tmpStr.local8Bit());
00371
00372
00373
00374 if (anEvent->dtStart() != anEvent->dtEnd()) {
00375 tmpStr = qDateTimeToISO(anEvent->dtEnd(),
00376 !anEvent->doesFloat());
00377 addPropValue(vevent, VCDTendProp, tmpStr.local8Bit());
00378 }
00379
00380
00381 tmpStr = qDateTimeToISO(anEvent->created());
00382 addPropValue(vevent, VCDCreatedProp, tmpStr.local8Bit());
00383
00384
00385 addPropValue(vevent, VCUniqueStringProp,
00386 anEvent->uid().local8Bit());
00387
00388
00389 tmpStr.sprintf("%i", anEvent->revision());
00390 addPropValue(vevent, VCSequenceProp, tmpStr.local8Bit());
00391
00392
00393 tmpStr = qDateTimeToISO(anEvent->lastModified());
00394 addPropValue(vevent, VCLastModifiedProp, tmpStr.local8Bit());
00395
00396
00397 tmpStr = "MAILTO:" + anEvent->organizer();
00398 addPropValue(vevent, ICOrganizerProp, tmpStr.local8Bit());
00399
00400
00401 if ( anEvent->attendeeCount() > 0 ) {
00402 Attendee::List::ConstIterator it;
00403 for ( it = anEvent->attendees().begin(); it != anEvent->attendees().end();
00404 ++it ) {
00405 Attendee *curAttendee = *it;
00406 if (!curAttendee->email().isEmpty() &&
00407 !curAttendee->name().isEmpty())
00408 tmpStr = "MAILTO:" + curAttendee->name() + " <" +
00409 curAttendee->email() + ">";
00410 else if (curAttendee->name().isEmpty())
00411 tmpStr = "MAILTO: " + curAttendee->email();
00412 else if (curAttendee->email().isEmpty())
00413 tmpStr = "MAILTO: " + curAttendee->name();
00414 else if (curAttendee->name().isEmpty() &&
00415 curAttendee->email().isEmpty())
00416 kdDebug(5800) << "warning! this Event has an attendee w/o name or email!" << endl;
00417 VObject *aProp = addPropValue(vevent, VCAttendeeProp, tmpStr.local8Bit());
00418 addPropValue(aProp, VCRSVPProp, curAttendee->RSVP() ? "TRUE" : "FALSE");
00419 addPropValue(aProp, VCStatusProp, writeStatus(curAttendee->status()));
00420 }
00421 }
00422
00423
00424 if (anEvent->recurrence()->doesRecur()) {
00425
00426 QPtrList<Recurrence::rMonthPos> tmpPositions;
00427 QPtrList<int> tmpDays;
00428 int *tmpDay;
00429 Recurrence::rMonthPos *tmpPos;
00430 QString tmpStr2;
00431 int i;
00432
00433 switch(anEvent->recurrence()->doesRecur()) {
00434 case Recurrence::rDaily:
00435 tmpStr.sprintf("D%i ",anEvent->recurrence()->frequency());
00436
00437
00438 break;
00439 case Recurrence::rWeekly:
00440 tmpStr.sprintf("W%i ",anEvent->recurrence()->frequency());
00441 for (i = 0; i < 7; i++) {
00442 if (anEvent->recurrence()->days().testBit(i))
00443 tmpStr += dayFromNum(i);
00444 }
00445 break;
00446 case Recurrence::rMonthlyPos:
00447 tmpStr.sprintf("MP%i ", anEvent->recurrence()->frequency());
00448
00449 tmpPositions = anEvent->recurrence()->monthPositions();
00450 for (tmpPos = tmpPositions.first();
00451 tmpPos;
00452 tmpPos = tmpPositions.next()) {
00453
00454 tmpStr2.sprintf("%i", tmpPos->rPos);
00455 if (tmpPos->negative)
00456 tmpStr2 += "- ";
00457 else
00458 tmpStr2 += "+ ";
00459 tmpStr += tmpStr2;
00460 for (i = 0; i < 7; i++) {
00461 if (tmpPos->rDays.testBit(i))
00462 tmpStr += dayFromNum(i);
00463 }
00464 }
00465 break;
00466 case Recurrence::rMonthlyDay:
00467 tmpStr.sprintf("MD%i ", anEvent->recurrence()->frequency());
00468
00469 tmpDays = anEvent->recurrence()->monthDays();
00470 for (tmpDay = tmpDays.first();
00471 tmpDay;
00472 tmpDay = tmpDays.next()) {
00473 tmpStr2.sprintf("%i ", *tmpDay);
00474 tmpStr += tmpStr2;
00475 }
00476 break;
00477 case Recurrence::rYearlyMonth:
00478 tmpStr.sprintf("YM%i ", anEvent->recurrence()->frequency());
00479
00480 tmpDays = anEvent->recurrence()->yearNums();
00481 for (tmpDay = tmpDays.first();
00482 tmpDay;
00483 tmpDay = tmpDays.next()) {
00484 tmpStr2.sprintf("%i ", *tmpDay);
00485 tmpStr += tmpStr2;
00486 }
00487 break;
00488 case Recurrence::rYearlyDay:
00489 tmpStr.sprintf("YD%i ", anEvent->recurrence()->frequency());
00490
00491 tmpDays = anEvent->recurrence()->yearNums();
00492 for (tmpDay = tmpDays.first();
00493 tmpDay;
00494 tmpDay = tmpDays.next()) {
00495 tmpStr2.sprintf("%i ", *tmpDay);
00496 tmpStr += tmpStr2;
00497 }
00498 break;
00499 default:
00500 kdDebug(5800) << "ERROR, it should never get here in eventToVEvent!" << endl;
00501 break;
00502 }
00503
00504 if (anEvent->recurrence()->duration() > 0) {
00505 tmpStr2.sprintf("#%i",anEvent->recurrence()->duration());
00506 tmpStr += tmpStr2;
00507 } else if (anEvent->recurrence()->duration() == -1) {
00508 tmpStr += "#0";
00509 } else {
00510 tmpStr += qDateTimeToISO(anEvent->recurrence()->endDate(), FALSE);
00511 }
00512 addPropValue(vevent,VCRRuleProp, tmpStr.local8Bit());
00513
00514 }
00515
00516
00517 DateList dateList = anEvent->exDates();
00518 DateList::ConstIterator it;
00519 QString tmpStr2;
00520
00521 for (it = dateList.begin(); it != dateList.end(); ++it) {
00522 tmpStr = qDateToISO(*it) + ";";
00523 tmpStr2 += tmpStr;
00524 }
00525 if (!tmpStr2.isEmpty()) {
00526 tmpStr2.truncate(tmpStr2.length()-1);
00527 addPropValue(vevent, VCExDateProp, tmpStr2.local8Bit());
00528 }
00529
00530
00531 if (!anEvent->description().isEmpty()) {
00532 VObject *d = addPropValue(vevent, VCDescriptionProp,
00533 anEvent->description().local8Bit());
00534 if (anEvent->description().find('\n') != -1)
00535 addProp(d, VCQuotedPrintableProp);
00536 }
00537
00538
00539 if (!anEvent->summary().isEmpty())
00540 addPropValue(vevent, VCSummaryProp, anEvent->summary().local8Bit());
00541
00542
00543 if (!anEvent->location().isEmpty())
00544 addPropValue(vevent, VCLocationProp, anEvent->location().local8Bit());
00545
00546
00547
00548
00549
00550
00551 const char *text = 0;
00552 switch (anEvent->secrecy()) {
00553 case Incidence::SecrecyPublic:
00554 text = "PUBLIC";
00555 break;
00556 case Incidence::SecrecyPrivate:
00557 text = "PRIVATE";
00558 break;
00559 case Incidence::SecrecyConfidential:
00560 text = "CONFIDENTIAL";
00561 break;
00562 }
00563 if (text) {
00564 addPropValue(vevent, VCClassProp, text);
00565 }
00566
00567
00568 tmpStrList = anEvent->categories();
00569 tmpStr = "";
00570 QString catStr;
00571 for ( QStringList::Iterator it = tmpStrList.begin();
00572 it != tmpStrList.end();
00573 ++it ) {
00574 catStr = *it;
00575 if (catStr[0] == ' ')
00576 tmpStr += catStr.mid(1);
00577 else
00578 tmpStr += catStr;
00579
00580
00581
00582 tmpStr += ";";
00583 }
00584 if (!tmpStr.isEmpty()) {
00585 tmpStr.truncate(tmpStr.length()-1);
00586 addPropValue(vevent, VCCategoriesProp, tmpStr.local8Bit());
00587 }
00588
00589
00590
00591 Attachment::List attachments = anEvent->attachments();
00592 Attachment::List::ConstIterator atIt;
00593 for ( atIt = attachments.begin(); atIt != attachments.end(); ++atIt )
00594 addPropValue( vevent, VCAttachProp, (*atIt)->uri().local8Bit() );
00595
00596
00597 tmpStrList = anEvent->resources();
00598 tmpStr = tmpStrList.join(";");
00599 if (!tmpStr.isEmpty())
00600 addPropValue(vevent, VCResourcesProp, tmpStr.local8Bit());
00601
00602
00603 Alarm::List::ConstIterator it2;
00604 for ( it2 = anEvent->alarms().begin(); it2 != anEvent->alarms().end(); ++it2 ) {
00605 Alarm *alarm = *it2;
00606 if (alarm->enabled()) {
00607 VObject *a = addProp(vevent, VCDAlarmProp);
00608 tmpStr = qDateTimeToISO(alarm->time());
00609 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
00610 addPropValue(a, VCRepeatCountProp, "1");
00611 addPropValue(a, VCDisplayStringProp, "beep!");
00612 if (alarm->type() == Alarm::Audio) {
00613 a = addProp(vevent, VCAAlarmProp);
00614 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
00615 addPropValue(a, VCRepeatCountProp, "1");
00616 addPropValue(a, VCAudioContentProp, QFile::encodeName(alarm->audioFile()));
00617 }
00618 if (alarm->type() == Alarm::Procedure) {
00619 a = addProp(vevent, VCPAlarmProp);
00620 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
00621 addPropValue(a, VCRepeatCountProp, "1");
00622 addPropValue(a, VCProcedureNameProp, QFile::encodeName(alarm->programFile()));
00623 }
00624 }
00625 }
00626
00627
00628 tmpStr.sprintf("%i",anEvent->priority());
00629 addPropValue(vevent, VCPriorityProp, tmpStr.local8Bit());
00630
00631
00632 tmpStr.sprintf("%i",anEvent->transparency());
00633 addPropValue(vevent, VCTranspProp, tmpStr.local8Bit());
00634
00635
00636 if (anEvent->relatedTo()) {
00637 addPropValue(vevent, VCRelatedToProp,
00638 anEvent->relatedTo()->uid().local8Bit());
00639 }
00640
00641 if (anEvent->pilotId()) {
00642
00643 tmpStr.sprintf("%i",anEvent->pilotId());
00644 addPropValue(vevent, KPilotIdProp, tmpStr.local8Bit());
00645 tmpStr.sprintf("%i",anEvent->syncStatus());
00646 addPropValue(vevent, KPilotStatusProp, tmpStr.local8Bit());
00647 }
00648
00649 return vevent;
00650 }
00651
00652 Todo *VCalFormat::VTodoToEvent(VObject *vtodo)
00653 {
00654 VObject *vo;
00655 VObjectIterator voi;
00656 char *s;
00657
00658 Todo *anEvent = new Todo;
00659
00660
00661 if ((vo = isAPropertyOf(vtodo, VCDCreatedProp)) != 0) {
00662 anEvent->setCreated(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
00663 deleteStr(s);
00664 }
00665
00666
00667 vo = isAPropertyOf(vtodo, VCUniqueStringProp);
00668
00669
00670 if (vo) {
00671 anEvent->setUid(s = fakeCString(vObjectUStringZValue(vo)));
00672 deleteStr(s);
00673 }
00674
00675
00676 if ((vo = isAPropertyOf(vtodo, VCLastModifiedProp)) != 0) {
00677 anEvent->setLastModified(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
00678 deleteStr(s);
00679 }
00680 else
00681 anEvent->setLastModified(QDateTime(QDate::currentDate(),
00682 QTime::currentTime()));
00683
00684
00685
00686 if ((vo = isAPropertyOf(vtodo, ICOrganizerProp)) != 0) {
00687 anEvent->setOrganizer(s = fakeCString(vObjectUStringZValue(vo)));
00688 deleteStr(s);
00689 } else {
00690 anEvent->setOrganizer(mCalendar->getEmail());
00691 }
00692
00693
00694 initPropIterator(&voi, vtodo);
00695 while (moreIteration(&voi)) {
00696 vo = nextVObject(&voi);
00697 if (strcmp(vObjectName(vo), VCAttendeeProp) == 0) {
00698 Attendee *a;
00699 VObject *vp;
00700 s = fakeCString(vObjectUStringZValue(vo));
00701 QString tmpStr = QString::fromLocal8Bit(s);
00702 deleteStr(s);
00703 tmpStr = tmpStr.simplifyWhiteSpace();
00704 int emailPos1, emailPos2;
00705 if ((emailPos1 = tmpStr.find('<')) > 0) {
00706
00707 emailPos2 = tmpStr.findRev('>');
00708 a = new Attendee(tmpStr.left(emailPos1 - 1),
00709 tmpStr.mid(emailPos1 + 1,
00710 emailPos2 - (emailPos1 + 1)));
00711 } else if (tmpStr.find('@') > 0) {
00712
00713 a = new Attendee(0, tmpStr);
00714 } else {
00715
00716 QString email = tmpStr.replace( QRegExp(" "), "." );
00717 a = new Attendee(tmpStr,email);
00718 }
00719
00720
00721 if ((vp = isAPropertyOf(vo, VCRSVPProp)) != 0)
00722 a->setRSVP(vObjectStringZValue(vp));
00723
00724 if ((vp = isAPropertyOf(vo, VCStatusProp)) != 0)
00725 a->setStatus(readStatus(vObjectStringZValue(vp)));
00726
00727 anEvent->addAttendee(a);
00728 }
00729 }
00730
00731
00732 if ((vo = isAPropertyOf(vtodo, VCDescriptionProp)) != 0) {
00733 s = fakeCString(vObjectUStringZValue(vo));
00734 anEvent->setDescription(QString::fromLocal8Bit(s));
00735 deleteStr(s);
00736 }
00737
00738
00739 if ((vo = isAPropertyOf(vtodo, VCSummaryProp))) {
00740 s = fakeCString(vObjectUStringZValue(vo));
00741 anEvent->setSummary(QString::fromLocal8Bit(s));
00742 deleteStr(s);
00743 }
00744
00745
00746
00747 if ((vo = isAPropertyOf(vtodo, VCLocationProp)) != 0) {
00748 s = fakeCString(vObjectUStringZValue(vo));
00749 anEvent->setLocation( QString::fromLocal8Bit(s) );
00750 deleteStr(s);
00751 }
00752
00753
00754 if ((vo = isAPropertyOf(vtodo, VCStatusProp)) != 0) {
00755 s = fakeCString(vObjectUStringZValue(vo));
00756 if (strcmp(s,"COMPLETED") == 0) {
00757 anEvent->setCompleted(true);
00758 } else {
00759 anEvent->setCompleted(false);
00760 }
00761 deleteStr(s);
00762 }
00763 else
00764 anEvent->setCompleted(false);
00765
00766
00767 if ((vo = isAPropertyOf(vtodo, VCCompletedProp)) != 0) {
00768 anEvent->setCompleted(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
00769 deleteStr(s);
00770 }
00771
00772
00773 if ((vo = isAPropertyOf(vtodo, VCPriorityProp))) {
00774 anEvent->setPriority(atoi(s = fakeCString(vObjectUStringZValue(vo))));
00775 deleteStr(s);
00776 }
00777
00778
00779 if ((vo = isAPropertyOf(vtodo, VCDueProp)) != 0) {
00780 anEvent->setDtDue(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
00781 deleteStr(s);
00782 anEvent->setHasDueDate(true);
00783 } else {
00784 anEvent->setHasDueDate(false);
00785 }
00786
00787
00788 if ((vo = isAPropertyOf(vtodo, VCDTstartProp)) != 0) {
00789 anEvent->setDtStart(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
00790
00791 deleteStr(s);
00792 anEvent->setHasStartDate(true);
00793 } else {
00794 anEvent->setHasStartDate(false);
00795 }
00796
00797
00798
00799 if ((vo = isAPropertyOf(vtodo, VCDAlarmProp))) {
00800 Alarm* alarm = anEvent->newAlarm();
00801 VObject *a;
00802 if ((a = isAPropertyOf(vo, VCRunTimeProp))) {
00803 alarm->setTime(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(a))));
00804 deleteStr(s);
00805 }
00806 alarm->setEnabled(true);
00807 if ((vo = isAPropertyOf(vtodo, VCPAlarmProp))) {
00808 if ((a = isAPropertyOf(vo, VCProcedureNameProp))) {
00809 s = fakeCString(vObjectUStringZValue(a));
00810 alarm->setProcedureAlarm(QFile::decodeName(s));
00811 deleteStr(s);
00812 }
00813 }
00814 if ((vo = isAPropertyOf(vtodo, VCAAlarmProp))) {
00815 if ((a = isAPropertyOf(vo, VCAudioContentProp))) {
00816 s = fakeCString(vObjectUStringZValue(a));
00817 alarm->setAudioAlarm(QFile::decodeName(s));
00818 deleteStr(s);
00819 }
00820 }
00821 }
00822
00823
00824 if ((vo = isAPropertyOf(vtodo, VCRelatedToProp)) != 0) {
00825 anEvent->setRelatedToUid(s = fakeCString(vObjectUStringZValue(vo)));
00826 deleteStr(s);
00827 mTodosRelate.append(anEvent);
00828 }
00829
00830
00831 QStringList tmpStrList;
00832 int index1 = 0;
00833 int index2 = 0;
00834 if ((vo = isAPropertyOf(vtodo, VCCategoriesProp)) != 0) {
00835 s = fakeCString(vObjectUStringZValue(vo));
00836 QString categories = QString::fromLocal8Bit(s);
00837 deleteStr(s);
00838
00839 QString category;
00840 while ((index2 = categories.find(',', index1)) != -1) {
00841
00842 category = categories.mid(index1, (index2 - index1));
00843 tmpStrList.append(category);
00844 index1 = index2+1;
00845 }
00846
00847 category = categories.mid(index1, (categories.length()-index1));
00848 tmpStrList.append(category);
00849 anEvent->setCategories(tmpStrList);
00850 }
00851
00852
00853 if ((vo = isAPropertyOf(vtodo, KPilotIdProp))) {
00854 anEvent->setPilotId(atoi(s = fakeCString(vObjectUStringZValue(vo))));
00855 deleteStr(s);
00856 }
00857 else
00858 anEvent->setPilotId(0);
00859
00860 if ((vo = isAPropertyOf(vtodo, KPilotStatusProp))) {
00861 anEvent->setSyncStatus(atoi(s = fakeCString(vObjectUStringZValue(vo))));
00862 deleteStr(s);
00863 }
00864 else
00865 anEvent->setSyncStatus(Event::SYNCMOD);
00866
00867 return anEvent;
00868 }
00869
00870 Event* VCalFormat::VEventToEvent(VObject *vevent)
00871 {
00872 VObject *vo;
00873 VObjectIterator voi;
00874 char *s;
00875
00876 Event *anEvent = new Event;
00877
00878
00879 if ((vo = isAPropertyOf(vevent, VCDCreatedProp)) != 0) {
00880 anEvent->setCreated(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
00881 deleteStr(s);
00882 }
00883
00884
00885 vo = isAPropertyOf(vevent, VCUniqueStringProp);
00886
00887
00888 if (vo) {
00889 anEvent->setUid(s = fakeCString(vObjectUStringZValue(vo)));
00890 deleteStr(s);
00891 }
00892
00893
00894
00895 if ((vo = isAPropertyOf(vevent, VCSequenceProp)) != 0) {
00896 anEvent->setRevision(atoi(s = fakeCString(vObjectUStringZValue(vo))));
00897 deleteStr(s);
00898 }
00899 else
00900 anEvent->setRevision(0);
00901
00902
00903 if ((vo = isAPropertyOf(vevent, VCLastModifiedProp)) != 0) {
00904 anEvent->setLastModified(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
00905 deleteStr(s);
00906 }
00907 else
00908 anEvent->setLastModified(QDateTime(QDate::currentDate(),
00909 QTime::currentTime()));
00910
00911
00912
00913 if ((vo = isAPropertyOf(vevent, ICOrganizerProp)) != 0) {
00914 anEvent->setOrganizer(s = fakeCString(vObjectUStringZValue(vo)));
00915 deleteStr(s);
00916 } else {
00917 anEvent->setOrganizer(mCalendar->getEmail());
00918 }
00919
00920
00921 initPropIterator(&voi, vevent);
00922 while (moreIteration(&voi)) {
00923 vo = nextVObject(&voi);
00924 if (strcmp(vObjectName(vo), VCAttendeeProp) == 0) {
00925 Attendee *a;
00926 VObject *vp;
00927 s = fakeCString(vObjectUStringZValue(vo));
00928 QString tmpStr = QString::fromLocal8Bit(s);
00929 deleteStr(s);
00930 tmpStr = tmpStr.simplifyWhiteSpace();
00931 int emailPos1, emailPos2;
00932 if ((emailPos1 = tmpStr.find('<')) > 0) {
00933
00934 emailPos2 = tmpStr.findRev('>');
00935 a = new Attendee(tmpStr.left(emailPos1 - 1),
00936 tmpStr.mid(emailPos1 + 1,
00937 emailPos2 - (emailPos1 + 1)));
00938 } else if (tmpStr.find('@') > 0) {
00939
00940 a = new Attendee(0, tmpStr);
00941 } else {
00942
00943 QString email = tmpStr.replace( QRegExp(" "), "." );
00944 a = new Attendee(tmpStr,email);
00945 }
00946
00947
00948 if ((vp = isAPropertyOf(vo, VCRSVPProp)) != 0)
00949 a->setRSVP(vObjectStringZValue(vp));
00950
00951 if ((vp = isAPropertyOf(vo, VCStatusProp)) != 0)
00952 a->setStatus(readStatus(vObjectStringZValue(vp)));
00953
00954 anEvent->addAttendee(a);
00955 }
00956 }
00957
00958
00959
00960
00961
00962
00963
00964
00965
00966
00967 anEvent->setFloats(FALSE);
00968
00969
00970 if ((vo = isAPropertyOf(vevent, VCDTstartProp)) != 0) {
00971 anEvent->setDtStart(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
00972
00973 deleteStr(s);
00974 if (anEvent->dtStart().time().isNull())
00975 anEvent->setFloats(TRUE);
00976 }
00977
00978
00979 if ((vo = isAPropertyOf(vevent, VCDTendProp)) != 0) {
00980 anEvent->setDtEnd(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
00981 deleteStr(s);
00982 if (anEvent->dtEnd().time().isNull())
00983 anEvent->setFloats(TRUE);
00984 }
00985
00986
00987
00988 if (!(vo = isAPropertyOf(vevent, VCDTstartProp)))
00989 anEvent->setDtStart(anEvent->dtEnd());
00990 if (!(vo = isAPropertyOf(vevent, VCDTendProp)))
00991 anEvent->setDtEnd(anEvent->dtStart());
00992
00994
00995
00996 if ((vo = isAPropertyOf(vevent, VCRRuleProp)) != 0) {
00997 QString tmpStr = (s = fakeCString(vObjectUStringZValue(vo)));
00998 deleteStr(s);
00999 tmpStr.simplifyWhiteSpace();
01000 tmpStr = tmpStr.upper();
01001
01002
01003 if (tmpStr.left(1) == "D") {
01004 int index = tmpStr.find(' ');
01005 int rFreq = tmpStr.mid(1, (index-1)).toInt();
01006 index = tmpStr.findRev(' ') + 1;
01007 if (tmpStr.mid(index,1) == "#") index++;
01008 if (tmpStr.find('T', index) != -1) {
01009 QDate rEndDate = (ISOToQDateTime(tmpStr.mid(index, tmpStr.length()-index))).date();
01010 anEvent->recurrence()->setDaily(rFreq, rEndDate);
01011 } else {
01012 int rDuration = tmpStr.mid(index, tmpStr.length()-index).toInt();
01013 if (rDuration == 0)
01014 anEvent->recurrence()->setDaily(rFreq, -1);
01015 else
01016 anEvent->recurrence()->setDaily(rFreq, rDuration);
01017 }
01018 }
01019
01020 else if (tmpStr.left(1) == "W") {
01021 int index = tmpStr.find(' ');
01022 int last = tmpStr.findRev(' ') + 1;
01023 int rFreq = tmpStr.mid(1, (index-1)).toInt();
01024 index += 1;
01025 QBitArray qba(7);
01026 QString dayStr;
01027 if( index == last ) {
01028
01029 qba.setBit(anEvent->dtStart().date().dayOfWeek() - 1);
01030 }
01031 else {
01032
01033 while (index < last) {
01034 dayStr = tmpStr.mid(index, 3);
01035 int dayNum = numFromDay(dayStr);
01036 qba.setBit(dayNum);
01037 index += 3;
01038 }
01039 }
01040 index = last; if (tmpStr.mid(index,1) == "#") index++;
01041 if (tmpStr.find('T', index) != -1) {
01042 QDate rEndDate = (ISOToQDateTime(tmpStr.mid(index, tmpStr.length()-index))).date();
01043 anEvent->recurrence()->setWeekly(rFreq, qba, rEndDate);
01044 } else {
01045 int rDuration = tmpStr.mid(index, tmpStr.length()-index).toInt();
01046 if (rDuration == 0)
01047 anEvent->recurrence()->setWeekly(rFreq, qba, -1);
01048 else
01049 anEvent->recurrence()->setWeekly(rFreq, qba, rDuration);
01050 }
01051 }
01052
01053 else if (tmpStr.left(2) == "MP") {
01054 int index = tmpStr.find(' ');
01055 int last = tmpStr.findRev(' ') + 1;
01056 int rFreq = tmpStr.mid(2, (index-1)).toInt();
01057 index += 1;
01058 QBitArray qba(7);
01059 short tmpPos;
01060 if( index == last ) {
01061
01062 tmpPos = anEvent->dtStart().date().day()/7 + 1;
01063 if( tmpPos == 5 )
01064 tmpPos = -1;
01065 qba.setBit(anEvent->dtStart().date().dayOfWeek() - 1);
01066 anEvent->recurrence()->addMonthlyPos(tmpPos, qba);
01067 }
01068 else {
01069
01070 while (index < last) {
01071 tmpPos = tmpStr.mid(index,1).toShort();
01072 index += 1;
01073 if (tmpStr.mid(index,1) == "-")
01074
01075 tmpPos = 0 - tmpPos;
01076 index += 2;
01077 while (numFromDay(tmpStr.mid(index,3)) >= 0) {
01078 int dayNum = numFromDay(tmpStr.mid(index,3));
01079 qba.setBit(dayNum);
01080 index += 3;
01081 }
01082 anEvent->recurrence()->addMonthlyPos(tmpPos, qba);
01083 qba.detach();
01084 qba.fill(FALSE);
01085 }
01086 }
01087 index = last; if (tmpStr.mid(index,1) == "#") index++;
01088 if (tmpStr.find('T', index) != -1) {
01089 QDate rEndDate = (ISOToQDateTime(tmpStr.mid(index, tmpStr.length() -
01090 index))).date();
01091 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyPos, rFreq, rEndDate);
01092 } else {
01093 int rDuration = tmpStr.mid(index, tmpStr.length()-index).toInt();
01094 if (rDuration == 0)
01095 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyPos, rFreq, -1);
01096 else
01097 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyPos, rFreq, rDuration);
01098 }
01099 }
01100
01101
01102 else if (tmpStr.left(2) == "MD") {
01103 int index = tmpStr.find(' ');
01104 int last = tmpStr.findRev(' ') + 1;
01105 int rFreq = tmpStr.mid(2, (index-1)).toInt();
01106 index += 1;
01107 short tmpDay;
01108
01109
01110
01111 anEvent->recurrence()->setMonthly( Recurrence::rMonthlyDay, rFreq, -1 );
01112 if( index == last ) {
01113
01114 tmpDay = anEvent->dtStart().date().day();
01115 anEvent->recurrence()->addMonthlyDay(tmpDay);
01116 }
01117 else {
01118
01119 while (index < last) {
01120 int index2 = tmpStr.find(' ', index);
01121 tmpDay = tmpStr.mid(index, (index2-index)).toShort();
01122 index = index2-1;
01123 if (tmpStr.mid(index, 1) == "-")
01124 tmpDay = 0 - tmpDay;
01125 index += 2;
01126 anEvent->recurrence()->addMonthlyDay(tmpDay);
01127 }
01128 }
01129 index = last; if (tmpStr.mid(index,1) == "#") index++;
01130 if (tmpStr.find('T', index) != -1) {
01131 QDate rEndDate = (ISOToQDateTime(tmpStr.mid(index, tmpStr.length()-index))).date();
01132 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyDay, rFreq, rEndDate);
01133 } else {
01134 int rDuration = tmpStr.mid(index, tmpStr.length()-index).toInt();
01135 if (rDuration == 0)
01136 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyDay, rFreq, -1);
01137 else
01138 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyDay, rFreq, rDuration);
01139 }
01140 }
01141
01142
01143 else if (tmpStr.left(2) == "YM") {
01144 int index = tmpStr.find(' ');
01145 int last = tmpStr.findRev(' ') + 1;
01146 int rFreq = tmpStr.mid(2, (index-1)).toInt();
01147 index += 1;
01148 short tmpMonth;
01149 if( index == last ) {
01150
01151 tmpMonth = anEvent->dtStart().date().month();
01152 anEvent->recurrence()->addYearlyNum(tmpMonth);
01153 }
01154 else {
01155
01156 while (index < last) {
01157 int index2 = tmpStr.find(' ', index);
01158 tmpMonth = tmpStr.mid(index, (index2-index)).toShort();
01159 index = index2+1;
01160 anEvent->recurrence()->addYearlyNum(tmpMonth);
01161 }
01162 }
01163 index = last; if (tmpStr.mid(index,1) == "#") index++;
01164 if (tmpStr.find('T', index) != -1) {
01165 QDate rEndDate = (ISOToQDateTime(tmpStr.mid(index, tmpStr.length()-index))).date();
01166 anEvent->recurrence()->setYearly(Recurrence::rYearlyMonth, rFreq, rEndDate);
01167 } else {
01168 int rDuration = tmpStr.mid(index, tmpStr.length()-index).toInt();
01169 if (rDuration == 0)
01170 anEvent->recurrence()->setYearly(Recurrence::rYearlyMonth, rFreq, -1);
01171 else
01172 anEvent->recurrence()->setYearly(Recurrence::rYearlyMonth, rFreq, rDuration);
01173 }
01174 }
01175
01176
01177 else if (tmpStr.left(2) == "YD") {
01178 int index = tmpStr.find(' ');
01179 int last = tmpStr.findRev(' ') + 1;
01180 int rFreq = tmpStr.mid(2, (index-1)).toInt();
01181 index += 1;
01182 short tmpDay;
01183 if( index == last ) {
01184
01185 tmpDay = anEvent->dtStart().date().dayOfYear();
01186 anEvent->recurrence()->addYearlyNum(tmpDay);
01187 }
01188 else {
01189
01190 while (index < last) {
01191 int index2 = tmpStr.find(' ', index);
01192 tmpDay = tmpStr.mid(index, (index2-index)).toShort();
01193 index = index2+1;
01194 anEvent->recurrence()->addYearlyNum(tmpDay);
01195 }
01196 }
01197 index = last; if (tmpStr.mid(index,1) == "#") index++;
01198 if (tmpStr.find('T', index) != -1) {
01199 QDate rEndDate = (ISOToQDateTime(tmpStr.mid(index, tmpStr.length()-index))).date();
01200 anEvent->recurrence()->setYearly(Recurrence::rYearlyDay, rFreq, rEndDate);
01201 } else {
01202 int rDuration = tmpStr.mid(index, tmpStr.length()-index).toInt();
01203 if (rDuration == 0)
01204 anEvent->recurrence()->setYearly(Recurrence::rYearlyDay, rFreq, -1);
01205 else
01206 anEvent->recurrence()->setYearly(Recurrence::rYearlyDay, rFreq, rDuration);
01207 }
01208 } else {
01209 kdDebug(5800) << "we don't understand this type of recurrence!" << endl;
01210 }
01211 }
01212
01213
01214
01215 if ((vo = isAPropertyOf(vevent, VCExDateProp)) != 0) {
01216 s = fakeCString(vObjectUStringZValue(vo));
01217 QStringList exDates = QStringList::split(",",s);
01218 QStringList::ConstIterator it;
01219 for(it = exDates.begin(); it != exDates.end(); ++it ) {
01220 anEvent->addExDate(ISOToQDate(*it));
01221 }
01222 deleteStr(s);
01223 }
01224
01225
01226 if ((vo = isAPropertyOf(vevent, VCSummaryProp))) {
01227 s = fakeCString(vObjectUStringZValue(vo));
01228 anEvent->setSummary(QString::fromLocal8Bit(s));
01229 deleteStr(s);
01230 }
01231
01232
01233 if ((vo = isAPropertyOf(vevent, VCDescriptionProp)) != 0) {
01234 s = fakeCString(vObjectUStringZValue(vo));
01235 if (!anEvent->description().isEmpty()) {
01236 anEvent->setDescription(anEvent->description() + "\n" +
01237 QString::fromLocal8Bit(s));
01238 } else {
01239 anEvent->setDescription(QString::fromLocal8Bit(s));
01240 }
01241 deleteStr(s);
01242 }
01243
01244
01245 if ((vo = isAPropertyOf(vevent, VCLocationProp)) != 0) {
01246 s = fakeCString(vObjectUStringZValue(vo));
01247 anEvent->setLocation( QString::fromLocal8Bit(s) );
01248 deleteStr(s);
01249 }
01250
01251
01252
01253 if (anEvent->summary().isEmpty() &&
01254 !(anEvent->description().isEmpty())) {
01255 QString tmpStr = anEvent->description().simplifyWhiteSpace();
01256 anEvent->setDescription("");
01257 anEvent->setSummary(tmpStr);
01258 }
01259
01260 #if 0
01261
01262 if ((vo = isAPropertyOf(vevent, VCStatusProp)) != 0) {
01263 QString tmpStr(s = fakeCString(vObjectUStringZValue(vo)));
01264 deleteStr(s);
01265
01266
01267 }
01268 else
01269
01270 #endif
01271
01272
01273 int secrecy = Incidence::SecrecyPublic;
01274 if ((vo = isAPropertyOf(vevent, VCClassProp)) != 0) {
01275 s = fakeCString(vObjectUStringZValue(vo));
01276 if (strcmp(s,"PRIVATE") == 0) {
01277 secrecy = Incidence::SecrecyPrivate;
01278 } else if (strcmp(s,"CONFIDENTIAL") == 0) {
01279 secrecy = Incidence::SecrecyConfidential;
01280 }
01281 deleteStr(s);
01282 }
01283 anEvent->setSecrecy(secrecy);
01284
01285
01286 QStringList tmpStrList;
01287 int index1 = 0;
01288 int index2 = 0;
01289 if ((vo = isAPropertyOf(vevent, VCCategoriesProp)) != 0) {
01290 s = fakeCString(vObjectUStringZValue(vo));
01291 QString categories = QString::fromLocal8Bit(s);
01292 deleteStr(s);
01293
01294 QString category;
01295 while ((index2 = categories.find(',', index1)) != -1) {
01296
01297 category = categories.mid(index1, (index2 - index1));
01298 tmpStrList.append(category);
01299 index1 = index2+1;
01300 }
01301
01302 category = categories.mid(index1, (categories.length()-index1));
01303 tmpStrList.append(category);
01304 anEvent->setCategories(tmpStrList);
01305 }
01306
01307
01308 tmpStrList.clear();
01309 initPropIterator(&voi, vevent);
01310 while (moreIteration(&voi)) {
01311 vo = nextVObject(&voi);
01312 if (strcmp(vObjectName(vo), VCAttachProp) == 0) {
01313 s = fakeCString(vObjectUStringZValue(vo));
01314 anEvent->addAttachment(new Attachment(QString(s)));
01315 deleteStr(s);
01316 }
01317 }
01318
01319
01320 if ((vo = isAPropertyOf(vevent, VCResourcesProp)) != 0) {
01321 QString resources = (s = fakeCString(vObjectUStringZValue(vo)));
01322 deleteStr(s);
01323 tmpStrList.clear();
01324 index1 = 0;
01325 index2 = 0;
01326 QString resource;
01327 while ((index2 = resources.find(';', index1)) != -1) {
01328 resource = resources.mid(index1, (index2 - index1));
01329 tmpStrList.append(resource);
01330 index1 = index2;
01331 }
01332 anEvent->setResources(tmpStrList);
01333 }
01334
01335
01336 if ((vo = isAPropertyOf(vevent, VCDAlarmProp))) {
01337 Alarm* alarm = anEvent->newAlarm();
01338 VObject *a;
01339 if ((a = isAPropertyOf(vo, VCRunTimeProp))) {
01340 alarm->setTime(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(a))));
01341 deleteStr(s);
01342 }
01343 alarm->setEnabled(true);
01344 if ((vo = isAPropertyOf(vevent, VCPAlarmProp))) {
01345 if ((a = isAPropertyOf(vo, VCProcedureNameProp))) {
01346 s = fakeCString(vObjectUStringZValue(a));
01347 alarm->setProcedureAlarm(QFile::decodeName(s));
01348 deleteStr(s);
01349 }
01350 }
01351 if ((vo = isAPropertyOf(vevent, VCAAlarmProp))) {
01352 if ((a = isAPropertyOf(vo, VCAudioContentProp))) {
01353 s = fakeCString(vObjectUStringZValue(a));
01354 alarm->setAudioAlarm(QFile::decodeName(s));
01355 deleteStr(s);
01356 }
01357 }
01358 }
01359
01360
01361 if ((vo = isAPropertyOf(vevent, VCPriorityProp))) {
01362 anEvent->setPriority(atoi(s = fakeCString(vObjectUStringZValue(vo))));
01363 deleteStr(s);
01364 }
01365
01366
01367 if ((vo = isAPropertyOf(vevent, VCTranspProp)) != 0) {
01368 int i = atoi(s = fakeCString(vObjectUStringZValue(vo)));
01369 anEvent->setTransparency( i == 1 ? Event::Transparent : Event::Opaque );
01370 deleteStr(s);
01371 }
01372
01373
01374 if ((vo = isAPropertyOf(vevent, VCRelatedToProp)) != 0) {
01375 anEvent->setRelatedToUid(s = fakeCString(vObjectUStringZValue(vo)));
01376 deleteStr(s);
01377 mEventsRelate.append(anEvent);
01378 }
01379
01380
01381 if ((vo = isAPropertyOf(vevent, KPilotIdProp))) {
01382 anEvent->setPilotId(atoi(s = fakeCString(vObjectUStringZValue(vo))));
01383 deleteStr(s);
01384 }
01385 else
01386 anEvent->setPilotId(0);
01387
01388 if ((vo = isAPropertyOf(vevent, KPilotStatusProp))) {
01389 anEvent->setSyncStatus(atoi(s = fakeCString(vObjectUStringZValue(vo))));
01390 deleteStr(s);
01391 }
01392 else
01393 anEvent->setSyncStatus(Event::SYNCMOD);
01394
01395 return anEvent;
01396 }
01397
01398
01399 QString VCalFormat::qDateToISO(const QDate &qd)
01400 {
01401 QString tmpStr;
01402
01403 Q_ASSERT(qd.isValid());
01404
01405 tmpStr.sprintf("%.2d%.2d%.2d",
01406 qd.year(), qd.month(), qd.day());
01407 return tmpStr;
01408
01409 }
01410
01411
01412
01413 int vcaltime_utc_offset( QDateTime ictt, QString tzid )
01414 {
01415 struct icaltimetype tt = icaltime_from_timet( ictt.toTime_t(), false );
01416 return icaltime_utc_offset( tt, tzid.latin1() );
01417 }
01418
01419 QString VCalFormat::qDateTimeToISO(const QDateTime &qdt, bool zulu)
01420 {
01421 QString tmpStr;
01422
01423 Q_ASSERT(qdt.date().isValid());
01424 Q_ASSERT(qdt.time().isValid());
01425 if (zulu) {
01426 QDateTime tmpDT(qdt);
01427
01428 tmpDT = tmpDT.addSecs(-vcaltime_utc_offset( tmpDT, mCalendar->timeZoneId()));
01429 tmpStr.sprintf( "%.2d%.2d%.2dT%.2d%.2d%.2dZ",
01430 tmpDT.date().year(), tmpDT.date().month(),
01431 tmpDT.date().day(), tmpDT.time().hour(),
01432 tmpDT.time().minute(), tmpDT.time().second());
01433 } else {
01434 tmpStr.sprintf( "%.2d%.2d%.2dT%.2d%.2d%.2d",
01435 qdt.date().year(), qdt.date().month(),
01436 qdt.date().day(), qdt.time().hour(),
01437 qdt.time().minute(), qdt.time().second());
01438 }
01439 return tmpStr;
01440 }
01441
01442 QDateTime VCalFormat::ISOToQDateTime(const QString & dtStr)
01443 {
01444 QDate tmpDate;
01445 QTime tmpTime;
01446 QString tmpStr;
01447 int year, month, day, hour, minute, second;
01448
01449 tmpStr = dtStr;
01450 year = tmpStr.left(4).toInt();
01451 month = tmpStr.mid(4,2).toInt();
01452 day = tmpStr.mid(6,2).toInt();
01453 hour = tmpStr.mid(9,2).toInt();
01454 minute = tmpStr.mid(11,2).toInt();
01455 second = tmpStr.mid(13,2).toInt();
01456 tmpDate.setYMD(year, month, day);
01457 tmpTime.setHMS(hour, minute, second);
01458
01459 Q_ASSERT(tmpDate.isValid());
01460 Q_ASSERT(tmpTime.isValid());
01461 QDateTime tmpDT(tmpDate, tmpTime);
01462
01463 if (dtStr.at(dtStr.length()-1) == 'Z') {
01464 tmpDT = tmpDT.addSecs(vcaltime_utc_offset( tmpDT, mCalendar->timeZoneId()));
01465 }
01466 return tmpDT;
01467 }
01468
01469 QDate VCalFormat::ISOToQDate(const QString &dateStr)
01470 {
01471 int year, month, day;
01472
01473 year = dateStr.left(4).toInt();
01474 month = dateStr.mid(4,2).toInt();
01475 day = dateStr.mid(6,2).toInt();
01476
01477 return(QDate(year, month, day));
01478 }
01479
01480
01481
01482
01483 void VCalFormat::populate(VObject *vcal)
01484 {
01485
01486
01487
01488 VObjectIterator i;
01489 VObject *curVO, *curVOProp;
01490 Event *anEvent;
01491
01492 if ((curVO = isAPropertyOf(vcal, ICMethodProp)) != 0) {
01493 char *methodType = 0;
01494 methodType = fakeCString(vObjectUStringZValue(curVO));
01495 kdDebug() << "This calendar is an iTIP transaction of type '"
01496 << methodType << "'" << endl;
01497 delete methodType;
01498 }
01499
01500
01501 if ((curVO = isAPropertyOf(vcal, VCProdIdProp)) != 0) {
01502 char *s = fakeCString(vObjectUStringZValue(curVO));
01503 if (strcmp(productId().local8Bit(), s) != 0)
01504 kdDebug() << "This vCalendar file was not created by KOrganizer "
01505 "or any other product we support. Loading anyway..." << endl;
01506 mLoadedProductId = s;
01507 deleteStr(s);
01508 }
01509
01510
01511 if ((curVO = isAPropertyOf(vcal, VCVersionProp)) != 0) {
01512 char *s = fakeCString(vObjectUStringZValue(curVO));
01513 if (strcmp(_VCAL_VERSION, s) != 0)
01514 kdDebug() << "This vCalendar file has version " << s
01515 << "We only support " << _VCAL_VERSION << endl;
01516 deleteStr(s);
01517 }
01518
01519 #if 0
01520
01521 if ((curVO = isAPropertyOf(vcal, VCTimeZoneProp)) != 0) {
01522 char *s = fakeCString(vObjectUStringZValue(curVO));
01523 mCalendar->setTimeZone(s);
01524 deleteStr(s);
01525 }
01526 #endif
01527
01528
01529 mEventsRelate.clear();
01530 mTodosRelate.clear();
01531
01532 initPropIterator(&i, vcal);
01533
01534
01535 while (moreIteration(&i)) {
01536 curVO = nextVObject(&i);
01537
01538
01539
01540
01541 if (strcmp(vObjectName(curVO), VCEventProp) == 0) {
01542
01543 if ((curVOProp = isAPropertyOf(curVO, KPilotStatusProp)) != 0) {
01544 char *s;
01545 s = fakeCString(vObjectUStringZValue(curVOProp));
01546
01547 if (atoi(s) == Event::SYNCDEL) {
01548 deleteStr(s);
01549 kdDebug(5800) << "skipping pilot-deleted event" << endl;
01550 goto SKIP;
01551 }
01552 deleteStr(s);
01553 }
01554
01555
01556
01557
01558 if ((curVOProp = isAPropertyOf(curVO, VCUniqueStringProp)) != 0) {
01559 char *s = fakeCString(vObjectUStringZValue(curVOProp));
01560 QString tmpStr(s);
01561 deleteStr(s);
01562
01563 if (mCalendar->event(tmpStr)) {
01564 goto SKIP;
01565 }
01566 if (mCalendar->todo(tmpStr)) {
01567 goto SKIP;
01568 }
01569 }
01570
01571 if ((!(curVOProp = isAPropertyOf(curVO, VCDTstartProp))) &&
01572 (!(curVOProp = isAPropertyOf(curVO, VCDTendProp)))) {
01573 kdDebug(5800) << "found a VEvent with no DTSTART and no DTEND! Skipping..." << endl;
01574 goto SKIP;
01575 }
01576
01577 anEvent = VEventToEvent(curVO);
01578
01579
01580 if (anEvent) {
01581 if ( !anEvent->dtStart().isValid() || !anEvent->dtEnd().isValid() ) {
01582 kdDebug() << "VCalFormat::populate(): Event has invalid dates."
01583 << endl;
01584 } else {
01585 mCalendar->addEvent(anEvent);
01586 }
01587 } else {
01588
01589 goto SKIP;
01590 }
01591 } else if (strcmp(vObjectName(curVO), VCTodoProp) == 0) {
01592 Todo *aTodo = VTodoToEvent(curVO);
01593 mCalendar->addTodo(aTodo);
01594 } else if ((strcmp(vObjectName(curVO), VCVersionProp) == 0) ||
01595 (strcmp(vObjectName(curVO), VCProdIdProp) == 0) ||
01596 (strcmp(vObjectName(curVO), VCTimeZoneProp) == 0)) {
01597
01598
01599 ;
01600 } else {
01601 kdDebug(5800) << "Ignoring unknown vObject \"" << vObjectName(curVO) << "\"" << endl;
01602 }
01603 SKIP:
01604 ;
01605 }
01606
01607
01608 Event::List::ConstIterator eIt;
01609 for ( eIt = mEventsRelate.begin(); eIt != mEventsRelate.end(); ++eIt ) {
01610 (*eIt)->setRelatedTo( mCalendar->event( (*eIt)->relatedToUid() ) );
01611 }
01612 Todo::List::ConstIterator tIt;
01613 for ( tIt = mTodosRelate.begin(); tIt != mTodosRelate.end(); ++tIt ) {
01614 (*tIt)->setRelatedTo( mCalendar->todo( (*tIt)->relatedToUid() ) );
01615 }
01616 }
01617
01618 const char *VCalFormat::dayFromNum(int day)
01619 {
01620 const char *days[7] = { "MO ", "TU ", "WE ", "TH ", "FR ", "SA ", "SU " };
01621
01622 return days[day];
01623 }
01624
01625 int VCalFormat::numFromDay(const QString &day)
01626 {
01627 if (day == "MO ") return 0;
01628 if (day == "TU ") return 1;
01629 if (day == "WE ") return 2;
01630 if (day == "TH ") return 3;
01631 if (day == "FR ") return 4;
01632 if (day == "SA ") return 5;
01633 if (day == "SU ") return 6;
01634
01635 return -1;
01636 }
01637
01638 Attendee::PartStat VCalFormat::readStatus(const char *s) const
01639 {
01640 QString statStr = s;
01641 statStr = statStr.upper();
01642 Attendee::PartStat status;
01643
01644 if (statStr == "X-ACTION")
01645 status = Attendee::NeedsAction;
01646 else if (statStr == "NEEDS ACTION")
01647 status = Attendee::NeedsAction;
01648 else if (statStr== "ACCEPTED")
01649 status = Attendee::Accepted;
01650 else if (statStr== "SENT")
01651 status = Attendee::NeedsAction;
01652 else if (statStr== "TENTATIVE")
01653 status = Attendee::Tentative;
01654 else if (statStr== "CONFIRMED")
01655 status = Attendee::Accepted;
01656 else if (statStr== "DECLINED")
01657 status = Attendee::Declined;
01658 else if (statStr== "COMPLETED")
01659 status = Attendee::Completed;
01660 else if (statStr== "DELEGATED")
01661 status = Attendee::Delegated;
01662 else {
01663 kdDebug(5800) << "error setting attendee mStatus, unknown mStatus!" << endl;
01664 status = Attendee::NeedsAction;
01665 }
01666
01667 return status;
01668 }
01669
01670 QCString VCalFormat::writeStatus(Attendee::PartStat status) const
01671 {
01672 switch(status) {
01673 default:
01674 case Attendee::NeedsAction:
01675 return "NEEDS ACTION";
01676 break;
01677 case Attendee::Accepted:
01678 return "ACCEPTED";
01679 break;
01680 case Attendee::Declined:
01681 return "DECLINED";
01682 break;
01683 case Attendee::Tentative:
01684 return "TENTATIVE";
01685 break;
01686 case Attendee::Delegated:
01687 return "DELEGATED";
01688 break;
01689 case Attendee::Completed:
01690 return "COMPLETED";
01691 break;
01692 case Attendee::InProcess:
01693 return "NEEDS ACTION";
01694 break;
01695 }
01696 }