summaryrefslogtreecommitdiffabout
authorzautrix <zautrix>2004-08-01 12:02:39 (UTC)
committer zautrix <zautrix>2004-08-01 12:02:39 (UTC)
commitc31e99f265dbe8762efca20667f8ccd973840f8f (patch) (unidiff)
tree29e7fd6845d187f41f9d80e756611dc8bc182bdc
parente954cc1e29b129982e4d07c4f490d7e881597374 (diff)
downloadkdepimpi-c31e99f265dbe8762efca20667f8ccd973840f8f.zip
kdepimpi-c31e99f265dbe8762efca20667f8ccd973840f8f.tar.gz
kdepimpi-c31e99f265dbe8762efca20667f8ccd973840f8f.tar.bz2
Changed zaurusstat to tempsyncstat
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--korganizer/calendarview.cpp4
-rw-r--r--libkcal/icalformatimpl.cpp8
-rw-r--r--libkcal/incidencebase.cpp12
-rw-r--r--libkcal/incidencebase.h6
-rw-r--r--libkcal/sharpformat.cpp14
5 files changed, 18 insertions, 26 deletions
diff --git a/korganizer/calendarview.cpp b/korganizer/calendarview.cpp
index fd68dc4..b543eca 100644
--- a/korganizer/calendarview.cpp
+++ b/korganizer/calendarview.cpp
@@ -492,1195 +492,1195 @@ void CalendarView::startAlarm( QString mess , QString filename)
492{ 492{
493 mAlarmDialog->eventNotification( mess, KOPrefs::instance()->mAlarmPlayBeeps, filename, true,KOPrefs::instance()->mAlarmBeepInterval ,KOPrefs::instance()->mAlarmSuspendCount ); 493 mAlarmDialog->eventNotification( mess, KOPrefs::instance()->mAlarmPlayBeeps, filename, true,KOPrefs::instance()->mAlarmBeepInterval ,KOPrefs::instance()->mAlarmSuspendCount );
494 QTimer::singleShot( 3000, this, SLOT( checkNextTimerAlarm() ) ); 494 QTimer::singleShot( 3000, this, SLOT( checkNextTimerAlarm() ) );
495 495
496} 496}
497 497
498void CalendarView::checkNextTimerAlarm() 498void CalendarView::checkNextTimerAlarm()
499{ 499{
500 mCalendar->checkAlarmForIncidence( 0, true ); 500 mCalendar->checkAlarmForIncidence( 0, true );
501} 501}
502 502
503void CalendarView::computeAlarm( QString msg ) 503void CalendarView::computeAlarm( QString msg )
504{ 504{
505 505
506 QString mess = msg; 506 QString mess = msg;
507 QString mAlarmMessage = mess.mid( 9 ); 507 QString mAlarmMessage = mess.mid( 9 );
508 QString filename = MainWindow::resourcePath(); 508 QString filename = MainWindow::resourcePath();
509 filename += "koalarm.wav"; 509 filename += "koalarm.wav";
510 QString tempfilename; 510 QString tempfilename;
511 if ( mess.left( 13 ) == "suspend_alarm") { 511 if ( mess.left( 13 ) == "suspend_alarm") {
512 bool error = false; 512 bool error = false;
513 int len = mess.mid( 13 ).find("+++"); 513 int len = mess.mid( 13 ).find("+++");
514 if ( len < 2 ) 514 if ( len < 2 )
515 error = true; 515 error = true;
516 else { 516 else {
517 tempfilename = mess.mid( 13, len ); 517 tempfilename = mess.mid( 13, len );
518 if ( !QFile::exists( tempfilename ) ) 518 if ( !QFile::exists( tempfilename ) )
519 error = true; 519 error = true;
520 } 520 }
521 if ( ! error ) { 521 if ( ! error ) {
522 filename = tempfilename; 522 filename = tempfilename;
523 } 523 }
524 mAlarmMessage = mess.mid( 13+len+3 ); 524 mAlarmMessage = mess.mid( 13+len+3 );
525 //qDebug("suspend file %s ",tempfilename.latin1() ); 525 //qDebug("suspend file %s ",tempfilename.latin1() );
526 startAlarm( mAlarmMessage, filename); 526 startAlarm( mAlarmMessage, filename);
527 return; 527 return;
528 } 528 }
529 if ( mess.left( 11 ) == "timer_alarm") { 529 if ( mess.left( 11 ) == "timer_alarm") {
530 //mTimerTime = 0; 530 //mTimerTime = 0;
531 startAlarm( mess.mid( 11 ), filename ); 531 startAlarm( mess.mid( 11 ), filename );
532 return; 532 return;
533 } 533 }
534 if ( mess.left( 10 ) == "proc_alarm") { 534 if ( mess.left( 10 ) == "proc_alarm") {
535 bool error = false; 535 bool error = false;
536 int len = mess.mid( 10 ).find("+++"); 536 int len = mess.mid( 10 ).find("+++");
537 if ( len < 2 ) 537 if ( len < 2 )
538 error = true; 538 error = true;
539 else { 539 else {
540 tempfilename = mess.mid( 10, len ); 540 tempfilename = mess.mid( 10, len );
541 if ( !QFile::exists( tempfilename ) ) 541 if ( !QFile::exists( tempfilename ) )
542 error = true; 542 error = true;
543 } 543 }
544 if ( error ) { 544 if ( error ) {
545 mAlarmMessage = "Procedure Alarm\nError - File not found\n"; 545 mAlarmMessage = "Procedure Alarm\nError - File not found\n";
546 mAlarmMessage += mess.mid( 10+len+3+9 ); 546 mAlarmMessage += mess.mid( 10+len+3+9 );
547 } else { 547 } else {
548 //QCopEnvelope e("QPE/Application/kopi", "-writeFileSilent"); 548 //QCopEnvelope e("QPE/Application/kopi", "-writeFileSilent");
549 //qDebug("-----system command %s ",tempfilename.latin1() ); 549 //qDebug("-----system command %s ",tempfilename.latin1() );
550#ifndef _WIN32_ 550#ifndef _WIN32_
551 if ( vfork () == 0 ) { 551 if ( vfork () == 0 ) {
552 execl ( tempfilename.latin1(), 0 ); 552 execl ( tempfilename.latin1(), 0 );
553 return; 553 return;
554 } 554 }
555#else 555#else
556 QProcess* p = new QProcess(); 556 QProcess* p = new QProcess();
557 p->addArgument( tempfilename.latin1() ); 557 p->addArgument( tempfilename.latin1() );
558 p->start(); 558 p->start();
559 return; 559 return;
560#endif 560#endif
561 561
562 return; 562 return;
563 } 563 }
564 564
565 //qDebug("+++++++system command %s ",tempfilename.latin1() ); 565 //qDebug("+++++++system command %s ",tempfilename.latin1() );
566 } 566 }
567 if ( mess.left( 11 ) == "audio_alarm") { 567 if ( mess.left( 11 ) == "audio_alarm") {
568 bool error = false; 568 bool error = false;
569 int len = mess.mid( 11 ).find("+++"); 569 int len = mess.mid( 11 ).find("+++");
570 if ( len < 2 ) 570 if ( len < 2 )
571 error = true; 571 error = true;
572 else { 572 else {
573 tempfilename = mess.mid( 11, len ); 573 tempfilename = mess.mid( 11, len );
574 if ( !QFile::exists( tempfilename ) ) 574 if ( !QFile::exists( tempfilename ) )
575 error = true; 575 error = true;
576 } 576 }
577 if ( ! error ) { 577 if ( ! error ) {
578 filename = tempfilename; 578 filename = tempfilename;
579 } 579 }
580 mAlarmMessage = mess.mid( 11+len+3+9 ); 580 mAlarmMessage = mess.mid( 11+len+3+9 );
581 //qDebug("audio file command %s ",tempfilename.latin1() ); 581 //qDebug("audio file command %s ",tempfilename.latin1() );
582 } 582 }
583 if ( mess.left( 9 ) == "cal_alarm") { 583 if ( mess.left( 9 ) == "cal_alarm") {
584 mAlarmMessage = mess.mid( 9 ) ; 584 mAlarmMessage = mess.mid( 9 ) ;
585 } 585 }
586 586
587 startAlarm( mAlarmMessage, filename ); 587 startAlarm( mAlarmMessage, filename );
588 588
589 589
590} 590}
591 591
592void CalendarView::addSuspendAlarm(const QDateTime &qdt, const QString &noti ) 592void CalendarView::addSuspendAlarm(const QDateTime &qdt, const QString &noti )
593{ 593{
594 //qDebug("+++++addSUSPENDAlarm %s %s ", qdt.toString().latin1() , noti.latin1() ); 594 //qDebug("+++++addSUSPENDAlarm %s %s ", qdt.toString().latin1() , noti.latin1() );
595 595
596 mSuspendAlarmNotification = noti; 596 mSuspendAlarmNotification = noti;
597 int ms = QDateTime::currentDateTime().secsTo( qdt )*1000; 597 int ms = QDateTime::currentDateTime().secsTo( qdt )*1000;
598 //qDebug("Suspend Alarm timer started with secs: %d ", ms/1000); 598 //qDebug("Suspend Alarm timer started with secs: %d ", ms/1000);
599 mSuspendTimer->start( ms , true ); 599 mSuspendTimer->start( ms , true );
600 600
601} 601}
602 602
603void CalendarView::addAlarm(const QDateTime &qdt, const QString &noti ) 603void CalendarView::addAlarm(const QDateTime &qdt, const QString &noti )
604{ 604{
605 //qDebug("+++++addAlarm %s %s ", qdt.toString().latin1() , noti.latin1() ); 605 //qDebug("+++++addAlarm %s %s ", qdt.toString().latin1() , noti.latin1() );
606 if ( ! KOPrefs::instance()->mUseInternalAlarmNotification ) { 606 if ( ! KOPrefs::instance()->mUseInternalAlarmNotification ) {
607#ifndef DESKTOP_VERSION 607#ifndef DESKTOP_VERSION
608 AlarmServer::addAlarm ( qdt,"koalarm", noti.latin1() ); 608 AlarmServer::addAlarm ( qdt,"koalarm", noti.latin1() );
609#endif 609#endif
610 return; 610 return;
611 } 611 }
612 int maxSec; 612 int maxSec;
613 //maxSec = 5; //testing only 613 //maxSec = 5; //testing only
614 maxSec = 86400+3600; // one day+1hour 614 maxSec = 86400+3600; // one day+1hour
615 mAlarmNotification = noti; 615 mAlarmNotification = noti;
616 int sec = QDateTime::currentDateTime().secsTo( qdt ); 616 int sec = QDateTime::currentDateTime().secsTo( qdt );
617 if ( sec > maxSec ) { 617 if ( sec > maxSec ) {
618 mRecheckAlarmTimer->start( maxSec * 1000 ); 618 mRecheckAlarmTimer->start( maxSec * 1000 );
619 // qDebug("recheck Alarm timer started with secs: %d next alarm in sec:%d", maxSec,sec ); 619 // qDebug("recheck Alarm timer started with secs: %d next alarm in sec:%d", maxSec,sec );
620 return; 620 return;
621 } else { 621 } else {
622 mRecheckAlarmTimer->stop(); 622 mRecheckAlarmTimer->stop();
623 } 623 }
624 //qDebug("Alarm timer started with secs: %d ", sec); 624 //qDebug("Alarm timer started with secs: %d ", sec);
625 mAlarmTimer->start( sec *1000 , true ); 625 mAlarmTimer->start( sec *1000 , true );
626 626
627} 627}
628// called by mRecheckAlarmTimer to get next alarm 628// called by mRecheckAlarmTimer to get next alarm
629// we need this, because a QTimer has only a max range of 25 days 629// we need this, because a QTimer has only a max range of 25 days
630void CalendarView::recheckTimerAlarm() 630void CalendarView::recheckTimerAlarm()
631{ 631{
632 mAlarmTimer->stop(); 632 mAlarmTimer->stop();
633 mRecheckAlarmTimer->stop(); 633 mRecheckAlarmTimer->stop();
634 mCalendar->checkAlarmForIncidence( 0, true ); 634 mCalendar->checkAlarmForIncidence( 0, true );
635} 635}
636void CalendarView::removeAlarm(const QDateTime &qdt, const QString &noti ) 636void CalendarView::removeAlarm(const QDateTime &qdt, const QString &noti )
637{ 637{
638 //qDebug("-----removeAlarm %s %s ", qdt.toString().latin1() , noti.latin1() ); 638 //qDebug("-----removeAlarm %s %s ", qdt.toString().latin1() , noti.latin1() );
639 if ( ! KOPrefs::instance()->mUseInternalAlarmNotification ) { 639 if ( ! KOPrefs::instance()->mUseInternalAlarmNotification ) {
640#ifndef DESKTOP_VERSION 640#ifndef DESKTOP_VERSION
641 AlarmServer::deleteAlarm (qdt ,"koalarm" ,noti.latin1() ); 641 AlarmServer::deleteAlarm (qdt ,"koalarm" ,noti.latin1() );
642#endif 642#endif
643 return; 643 return;
644 } 644 }
645 mAlarmTimer->stop(); 645 mAlarmTimer->stop();
646} 646}
647void CalendarView::selectWeekNum ( int num ) 647void CalendarView::selectWeekNum ( int num )
648{ 648{
649 dateNavigator()->selectWeek( num ); 649 dateNavigator()->selectWeek( num );
650 mViewManager->showWeekView(); 650 mViewManager->showWeekView();
651} 651}
652KOViewManager *CalendarView::viewManager() 652KOViewManager *CalendarView::viewManager()
653{ 653{
654 return mViewManager; 654 return mViewManager;
655} 655}
656 656
657KODialogManager *CalendarView::dialogManager() 657KODialogManager *CalendarView::dialogManager()
658{ 658{
659 return mDialogManager; 659 return mDialogManager;
660} 660}
661 661
662QDate CalendarView::startDate() 662QDate CalendarView::startDate()
663{ 663{
664 DateList dates = mNavigator->selectedDates(); 664 DateList dates = mNavigator->selectedDates();
665 665
666 return dates.first(); 666 return dates.first();
667} 667}
668 668
669QDate CalendarView::endDate() 669QDate CalendarView::endDate()
670{ 670{
671 DateList dates = mNavigator->selectedDates(); 671 DateList dates = mNavigator->selectedDates();
672 672
673 return dates.last(); 673 return dates.last();
674} 674}
675 675
676 676
677void CalendarView::createPrinter() 677void CalendarView::createPrinter()
678{ 678{
679#ifndef KORG_NOPRINTER 679#ifndef KORG_NOPRINTER
680 if (!mCalPrinter) { 680 if (!mCalPrinter) {
681 mCalPrinter = new CalPrinter(this, mCalendar); 681 mCalPrinter = new CalPrinter(this, mCalendar);
682 connect(this, SIGNAL(configChanged()), mCalPrinter, SLOT(updateConfig())); 682 connect(this, SIGNAL(configChanged()), mCalPrinter, SLOT(updateConfig()));
683 } 683 }
684#endif 684#endif
685} 685}
686 686
687void CalendarView::confSync() 687void CalendarView::confSync()
688{ 688{
689 static KOSyncPrefsDialog* sp = 0; 689 static KOSyncPrefsDialog* sp = 0;
690 if ( ! sp ) { 690 if ( ! sp ) {
691 sp = new KOSyncPrefsDialog( this, "syncprefs", true ); 691 sp = new KOSyncPrefsDialog( this, "syncprefs", true );
692 } 692 }
693 sp->usrReadConfig(); 693 sp->usrReadConfig();
694#ifndef DESKTOP_VERSION 694#ifndef DESKTOP_VERSION
695 sp->showMaximized(); 695 sp->showMaximized();
696#else 696#else
697 sp->show(); 697 sp->show();
698#endif 698#endif
699 sp->exec(); 699 sp->exec();
700 700
701} 701}
702 702
703 703
704//KOPrefs::instance()->mWriteBackFile 704//KOPrefs::instance()->mWriteBackFile
705//KOPrefs::instance()->mWriteBackExistingOnly 705//KOPrefs::instance()->mWriteBackExistingOnly
706 706
707// 0 syncPrefsGroup->addRadio(i18n("Take local entry on conflict")); 707// 0 syncPrefsGroup->addRadio(i18n("Take local entry on conflict"));
708// 1 syncPrefsGroup->addRadio(i18n("Take remote entry on conflict")); 708// 1 syncPrefsGroup->addRadio(i18n("Take remote entry on conflict"));
709// 2 syncPrefsGroup->addRadio(i18n("Take newest entry on conflict")); 709// 2 syncPrefsGroup->addRadio(i18n("Take newest entry on conflict"));
710// 3 syncPrefsGroup->addRadio(i18n("Ask for every entry on conflict")); 710// 3 syncPrefsGroup->addRadio(i18n("Ask for every entry on conflict"));
711// 4 syncPrefsGroup->addRadio(i18n("Force take local entry always")); 711// 4 syncPrefsGroup->addRadio(i18n("Force take local entry always"));
712// 5 syncPrefsGroup->addRadio(i18n("Force take remote entry always")); 712// 5 syncPrefsGroup->addRadio(i18n("Force take remote entry always"));
713 713
714int CalendarView::takeEvent( Incidence* local, Incidence* remote, int mode , bool full ) 714int CalendarView::takeEvent( Incidence* local, Incidence* remote, int mode , bool full )
715{ 715{
716 716
717 //void setZaurusId(int id); 717 //void setZaurusId(int id);
718 // int zaurusId() const; 718 // int zaurusId() const;
719 // void setZaurusUid(int id); 719 // void setZaurusUid(int id);
720 // int zaurusUid() const; 720 // int zaurusUid() const;
721 // void setZaurusStat(int id); 721 // void setZaurusStat(int id);
722 // int zaurusStat() const; 722 // int zaurusStat() const;
723 // 0 equal 723 // 0 equal
724 // 1 take local 724 // 1 take local
725 // 2 take remote 725 // 2 take remote
726 // 3 cancel 726 // 3 cancel
727 QDateTime lastSync = mLastCalendarSync; 727 QDateTime lastSync = mLastCalendarSync;
728 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 728 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
729 bool remCh, locCh; 729 bool remCh, locCh;
730 remCh = ( remote->zaurusUid() != local->zaurusUid() ); 730 remCh = ( remote->zaurusUid() != local->zaurusUid() );
731 locCh = ( local->lastModified() > mLastCalendarSync ); 731 locCh = ( local->lastModified() > mLastCalendarSync );
732 //qDebug("locCh %d remCh %d locuid %d remuid %d", locCh, remCh,local->zaurusUid(), remote->zaurusUid() ); 732 //qDebug("locCh %d remCh %d locuid %d remuid %d", locCh, remCh,local->zaurusUid(), remote->zaurusUid() );
733 if ( !remCh && ! locCh ) { 733 if ( !remCh && ! locCh ) {
734 //qDebug("both not changed "); 734 //qDebug("both not changed ");
735 lastSync = local->lastModified().addDays(1); 735 lastSync = local->lastModified().addDays(1);
736 } else { 736 } else {
737 if ( locCh ) { 737 if ( locCh ) {
738 //qDebug("loc changed %d %d", local->zaurusStat(), local->revision() ); 738 //qDebug("loc changed %d %d", local->zaurusStat(), local->revision() );
739 lastSync = local->lastModified().addDays( -1 ); 739 lastSync = local->lastModified().addDays( -1 );
740 if ( !remCh ) 740 if ( !remCh )
741 remote->setLastModified( lastSync.addDays( -1 ) ); 741 remote->setLastModified( lastSync.addDays( -1 ) );
742 } else { 742 } else {
743 //qDebug(" not loc changed "); 743 //qDebug(" not loc changed ");
744 lastSync = local->lastModified().addDays( 1 ); 744 lastSync = local->lastModified().addDays( 1 );
745 if ( remCh ) 745 if ( remCh )
746 remote->setLastModified( lastSync.addDays( 1 ) ); 746 remote->setLastModified( lastSync.addDays( 1 ) );
747 747
748 } 748 }
749 } 749 }
750 full = true; 750 full = true;
751 if ( mode < SYNC_PREF_ASK ) 751 if ( mode < SYNC_PREF_ASK )
752 mode = SYNC_PREF_ASK; 752 mode = SYNC_PREF_ASK;
753 } else { 753 } else {
754 if ( local->lastModified() == remote->lastModified() ) 754 if ( local->lastModified() == remote->lastModified() )
755 if ( local->revision() == remote->revision() ) 755 if ( local->revision() == remote->revision() )
756 return 0; 756 return 0;
757 757
758 } 758 }
759 // qDebug(" %d %d conflict on %s %s ", mode, full, local->summary().latin1(), remote->summary().latin1() ); 759 // qDebug(" %d %d conflict on %s %s ", mode, full, local->summary().latin1(), remote->summary().latin1() );
760 760
761 //qDebug("%s %d %s %d", local->lastModified().toString().latin1() , local->revision(), remote->lastModified().toString().latin1(), remote->revision()); 761 //qDebug("%s %d %s %d", local->lastModified().toString().latin1() , local->revision(), remote->lastModified().toString().latin1(), remote->revision());
762 //qDebug("%d %d %d %d ", local->lastModified().time().second(), local->lastModified().time().msec(), remote->lastModified().time().second(), remote->lastModified().time().msec() ); 762 //qDebug("%d %d %d %d ", local->lastModified().time().second(), local->lastModified().time().msec(), remote->lastModified().time().second(), remote->lastModified().time().msec() );
763 //full = true; //debug only 763 //full = true; //debug only
764 if ( full ) { 764 if ( full ) {
765 bool equ = false; 765 bool equ = false;
766 if ( local->type() == "Event" ) { 766 if ( local->type() == "Event" ) {
767 equ = (*((Event*) local) == *((Event*) remote)); 767 equ = (*((Event*) local) == *((Event*) remote));
768 } 768 }
769 else if ( local->type() =="Todo" ) 769 else if ( local->type() =="Todo" )
770 equ = (*((Todo*) local) == (*(Todo*) remote)); 770 equ = (*((Todo*) local) == (*(Todo*) remote));
771 else if ( local->type() =="Journal" ) 771 else if ( local->type() =="Journal" )
772 equ = (*((Journal*) local) == *((Journal*) remote)); 772 equ = (*((Journal*) local) == *((Journal*) remote));
773 if ( equ ) { 773 if ( equ ) {
774 //qDebug("equal "); 774 //qDebug("equal ");
775 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 775 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
776 local->setZaurusUid( remote->zaurusUid() ); 776 local->setZaurusUid( remote->zaurusUid() );
777 } 777 }
778 if ( mode < SYNC_PREF_FORCE_LOCAL ) 778 if ( mode < SYNC_PREF_FORCE_LOCAL )
779 return 0; 779 return 0;
780 780
781 }//else //debug only 781 }//else //debug only
782 //qDebug("not equal %s %s ", local->summary().latin1(), remote->summary().latin1()); 782 //qDebug("not equal %s %s ", local->summary().latin1(), remote->summary().latin1());
783 } 783 }
784 int result; 784 int result;
785 bool localIsNew; 785 bool localIsNew;
786 if ( full && mode < SYNC_PREF_NEWEST ) 786 if ( full && mode < SYNC_PREF_NEWEST )
787 mode = SYNC_PREF_ASK; 787 mode = SYNC_PREF_ASK;
788 788
789 switch( mode ) { 789 switch( mode ) {
790 case SYNC_PREF_LOCAL: 790 case SYNC_PREF_LOCAL:
791 if ( lastSync > remote->lastModified() ) 791 if ( lastSync > remote->lastModified() )
792 return 1; 792 return 1;
793 if ( lastSync > local->lastModified() ) 793 if ( lastSync > local->lastModified() )
794 return 2; 794 return 2;
795 return 1; 795 return 1;
796 break; 796 break;
797 case SYNC_PREF_REMOTE: 797 case SYNC_PREF_REMOTE:
798 if ( lastSync > remote->lastModified() ) 798 if ( lastSync > remote->lastModified() )
799 return 1; 799 return 1;
800 if ( lastSync > local->lastModified() ) 800 if ( lastSync > local->lastModified() )
801 return 2; 801 return 2;
802 return 2; 802 return 2;
803 break; 803 break;
804 case SYNC_PREF_NEWEST: 804 case SYNC_PREF_NEWEST:
805 if ( local->lastModified() > remote->lastModified() ) 805 if ( local->lastModified() > remote->lastModified() )
806 return 1; 806 return 1;
807 else 807 else
808 return 2; 808 return 2;
809 break; 809 break;
810 case SYNC_PREF_ASK: 810 case SYNC_PREF_ASK:
811 //qDebug("lsy %s --- lo %s --- re %s ", lastSync.toString().latin1(), local->lastModified().toString().latin1(), remote->lastModified().toString().latin1() ); 811 //qDebug("lsy %s --- lo %s --- re %s ", lastSync.toString().latin1(), local->lastModified().toString().latin1(), remote->lastModified().toString().latin1() );
812 if ( lastSync > remote->lastModified() ) 812 if ( lastSync > remote->lastModified() )
813 return 1; 813 return 1;
814 if ( lastSync > local->lastModified() ) 814 if ( lastSync > local->lastModified() )
815 return 2; 815 return 2;
816 //qDebug("lsy %s --- lo %s --- re %s ", lastSync.toString().latin1(), local->lastModified().toString().latin1(), remote->lastModified().toString().latin1() ); 816 //qDebug("lsy %s --- lo %s --- re %s ", lastSync.toString().latin1(), local->lastModified().toString().latin1(), remote->lastModified().toString().latin1() );
817 localIsNew = local->lastModified() > remote->lastModified(); 817 localIsNew = local->lastModified() > remote->lastModified();
818 if ( localIsNew ) 818 if ( localIsNew )
819 getEventViewerDialog()->setColorMode( 1 ); 819 getEventViewerDialog()->setColorMode( 1 );
820 else 820 else
821 getEventViewerDialog()->setColorMode( 2 ); 821 getEventViewerDialog()->setColorMode( 2 );
822 getEventViewerDialog()->setIncidence(local); 822 getEventViewerDialog()->setIncidence(local);
823 if ( localIsNew ) 823 if ( localIsNew )
824 getEventViewerDialog()->setColorMode( 2 ); 824 getEventViewerDialog()->setColorMode( 2 );
825 else 825 else
826 getEventViewerDialog()->setColorMode( 1 ); 826 getEventViewerDialog()->setColorMode( 1 );
827 getEventViewerDialog()->addIncidence(remote); 827 getEventViewerDialog()->addIncidence(remote);
828 getEventViewerDialog()->setColorMode( 0 ); 828 getEventViewerDialog()->setColorMode( 0 );
829 //qDebug("local %d remote %d ",local->relatedTo(),remote->relatedTo() ); 829 //qDebug("local %d remote %d ",local->relatedTo(),remote->relatedTo() );
830 getEventViewerDialog()->setCaption( mCurrentSyncDevice +i18n(" : Conflict! Please choose entry!")); 830 getEventViewerDialog()->setCaption( mCurrentSyncDevice +i18n(" : Conflict! Please choose entry!"));
831 getEventViewerDialog()->showMe(); 831 getEventViewerDialog()->showMe();
832 result = getEventViewerDialog()->executeS( localIsNew ); 832 result = getEventViewerDialog()->executeS( localIsNew );
833 return result; 833 return result;
834 834
835 break; 835 break;
836 case SYNC_PREF_FORCE_LOCAL: 836 case SYNC_PREF_FORCE_LOCAL:
837 return 1; 837 return 1;
838 break; 838 break;
839 case SYNC_PREF_FORCE_REMOTE: 839 case SYNC_PREF_FORCE_REMOTE:
840 return 2; 840 return 2;
841 break; 841 break;
842 842
843 default: 843 default:
844 // SYNC_PREF_TAKE_BOTH not implemented 844 // SYNC_PREF_TAKE_BOTH not implemented
845 break; 845 break;
846 } 846 }
847 return 0; 847 return 0;
848} 848}
849Event* CalendarView::getLastSyncEvent() 849Event* CalendarView::getLastSyncEvent()
850{ 850{
851 Event* lse; 851 Event* lse;
852 //qDebug("CurrentSyncDevice %s ",mCurrentSyncDevice .latin1() ); 852 //qDebug("CurrentSyncDevice %s ",mCurrentSyncDevice .latin1() );
853 lse = mCalendar->event( "last-syncEvent-device-"+mCurrentSyncDevice ); 853 lse = mCalendar->event( "last-syncEvent-device-"+mCurrentSyncDevice );
854 if (!lse) { 854 if (!lse) {
855 lse = new Event(); 855 lse = new Event();
856 lse->setUid( "last-syncEvent-device-"+mCurrentSyncDevice ); 856 lse->setUid( "last-syncEvent-device-"+mCurrentSyncDevice );
857 lse->setSummary(mCurrentSyncDevice + i18n(" - sync event")); 857 lse->setSummary(mCurrentSyncDevice + i18n(" - sync event"));
858 lse->setDtStart( mLastCalendarSync ); 858 lse->setDtStart( mLastCalendarSync );
859 lse->setDtEnd( mLastCalendarSync.addSecs( 7200 ) ); 859 lse->setDtEnd( mLastCalendarSync.addSecs( 7200 ) );
860 lse->setCategories( i18n("SyncEvent") ); 860 lse->setCategories( i18n("SyncEvent") );
861 lse->setReadOnly( true ); 861 lse->setReadOnly( true );
862 mCalendar->addEvent( lse ); 862 mCalendar->addEvent( lse );
863 } 863 }
864 864
865 return lse; 865 return lse;
866 866
867} 867}
868void CalendarView::checkSharpEvent( Event* lastSync, Incidence* toDelete ) 868void CalendarView::checkSharpEvent( Event* lastSync, Incidence* toDelete )
869{ 869{
870 if ( ! lastSync ) 870 if ( ! lastSync )
871 return; 871 return;
872 if ( toDelete->zaurusId() < 0 ) 872 if ( toDelete->zaurusId() < 0 )
873 return; 873 return;
874 if ( toDelete->type() == "Journal" ) 874 if ( toDelete->type() == "Journal" )
875 return; 875 return;
876 QString des = lastSync->description(); 876 QString des = lastSync->description();
877 QString pref = "e"; 877 QString pref = "e";
878 if ( toDelete->type() == "Todo" ) 878 if ( toDelete->type() == "Todo" )
879 pref = "t"; 879 pref = "t";
880 des += pref+ QString::number ( toDelete->zaurusId() ) + ","; 880 des += pref+ QString::number ( toDelete->zaurusId() ) + ",";
881 lastSync->setReadOnly( false ); 881 lastSync->setReadOnly( false );
882 lastSync->setDescription( des ); 882 lastSync->setDescription( des );
883 lastSync->setReadOnly( true ); 883 lastSync->setReadOnly( true );
884 884
885} 885}
886bool CalendarView::synchronizeCalendar( Calendar* local, Calendar* remote, int mode ) 886bool CalendarView::synchronizeCalendar( Calendar* local, Calendar* remote, int mode )
887{ 887{
888 bool syncOK = true; 888 bool syncOK = true;
889 int addedEvent = 0; 889 int addedEvent = 0;
890 int addedEventR = 0; 890 int addedEventR = 0;
891 int deletedEventR = 0; 891 int deletedEventR = 0;
892 int deletedEventL = 0; 892 int deletedEventL = 0;
893 int changedLocal = 0; 893 int changedLocal = 0;
894 int changedRemote = 0; 894 int changedRemote = 0;
895 //QPtrList<Event> el = local->rawEvents(); 895 //QPtrList<Event> el = local->rawEvents();
896 Event* eventR; 896 Event* eventR;
897 QString uid; 897 QString uid;
898 int take; 898 int take;
899 Event* eventL; 899 Event* eventL;
900 Event* eventRSync; 900 Event* eventRSync;
901 Event* eventLSync; 901 Event* eventLSync;
902 Event* eventRSyncSharp = remote->event( "last-syncEvent-device-Sharp-DTM"); 902 Event* eventRSyncSharp = remote->event( "last-syncEvent-device-Sharp-DTM");
903 Event* eventLSyncSharp = local->event( "last-syncEvent-device-Sharp-DTM"); 903 Event* eventLSyncSharp = local->event( "last-syncEvent-device-Sharp-DTM");
904 bool fullDateRange = false; 904 bool fullDateRange = false;
905 mLastCalendarSync = QDateTime::currentDateTime(); 905 mLastCalendarSync = QDateTime::currentDateTime();
906 QDateTime modifiedCalendar = mLastCalendarSync;; 906 QDateTime modifiedCalendar = mLastCalendarSync;;
907 eventR = remote->event("last-syncEvent-device-"+mCurrentSyncName ); 907 eventR = remote->event("last-syncEvent-device-"+mCurrentSyncName );
908 if ( eventR ) { 908 if ( eventR ) {
909 eventRSync = (Event*) eventR->clone(); 909 eventRSync = (Event*) eventR->clone();
910 remote->deleteEvent(eventR ); 910 remote->deleteEvent(eventR );
911 911
912 } else { 912 } else {
913 fullDateRange = true; 913 fullDateRange = true;
914 eventRSync = new Event(); 914 eventRSync = new Event();
915 eventRSync->setSummary(mCurrentSyncName + i18n(" - sync event")); 915 eventRSync->setSummary(mCurrentSyncName + i18n(" - sync event"));
916 eventRSync->setUid("last-syncEvent-device-"+mCurrentSyncName ); 916 eventRSync->setUid("last-syncEvent-device-"+mCurrentSyncName );
917 eventRSync->setDtStart( mLastCalendarSync ); 917 eventRSync->setDtStart( mLastCalendarSync );
918 eventRSync->setDtEnd( mLastCalendarSync.addSecs( 7200 ) ); 918 eventRSync->setDtEnd( mLastCalendarSync.addSecs( 7200 ) );
919 eventRSync->setCategories( i18n("SyncEvent") ); 919 eventRSync->setCategories( i18n("SyncEvent") );
920 } 920 }
921 eventLSync = getLastSyncEvent(); 921 eventLSync = getLastSyncEvent();
922 if ( eventLSync->dtStart() == mLastCalendarSync ) 922 if ( eventLSync->dtStart() == mLastCalendarSync )
923 fullDateRange = true; 923 fullDateRange = true;
924 924
925 if ( ! fullDateRange ) { 925 if ( ! fullDateRange ) {
926 if ( eventLSync->dtStart() != eventRSync->dtStart() ) { 926 if ( eventLSync->dtStart() != eventRSync->dtStart() ) {
927 927
928 // qDebug("set fulldate to true %s %s" ,eventLSync->dtStart().toString().latin1(), eventRSync->dtStart().toString().latin1() ); 928 // qDebug("set fulldate to true %s %s" ,eventLSync->dtStart().toString().latin1(), eventRSync->dtStart().toString().latin1() );
929 //qDebug("%d %d %d %d ", eventLSync->dtStart().time().second(), eventLSync->dtStart().time().msec() , eventRSync->dtStart().time().second(), eventRSync->dtStart().time().msec()); 929 //qDebug("%d %d %d %d ", eventLSync->dtStart().time().second(), eventLSync->dtStart().time().msec() , eventRSync->dtStart().time().second(), eventRSync->dtStart().time().msec());
930 fullDateRange = true; 930 fullDateRange = true;
931 } 931 }
932 } 932 }
933 if ( fullDateRange ) 933 if ( fullDateRange )
934 mLastCalendarSync = QDateTime::currentDateTime().addDays( -100*365); 934 mLastCalendarSync = QDateTime::currentDateTime().addDays( -100*365);
935 else 935 else
936 mLastCalendarSync = eventLSync->dtStart(); 936 mLastCalendarSync = eventLSync->dtStart();
937 // for resyncing if own file has changed 937 // for resyncing if own file has changed
938 if ( mCurrentSyncDevice == "deleteaftersync" ) { 938 if ( mCurrentSyncDevice == "deleteaftersync" ) {
939 mLastCalendarSync = loadedFileVersion; 939 mLastCalendarSync = loadedFileVersion;
940 qDebug("setting mLastCalendarSync "); 940 qDebug("setting mLastCalendarSync ");
941 } 941 }
942 //qDebug("*************************** "); 942 //qDebug("*************************** ");
943 qDebug("mLastCalendarSync %s ",mLastCalendarSync.toString().latin1() ); 943 qDebug("mLastCalendarSync %s ",mLastCalendarSync.toString().latin1() );
944 QPtrList<Incidence> er = remote->rawIncidences(); 944 QPtrList<Incidence> er = remote->rawIncidences();
945 Incidence* inR = er.first(); 945 Incidence* inR = er.first();
946 Incidence* inL; 946 Incidence* inL;
947 QProgressBar bar( er.count(),0 ); 947 QProgressBar bar( er.count(),0 );
948 bar.setCaption (i18n("Syncing - close to abort!") ); 948 bar.setCaption (i18n("Syncing - close to abort!") );
949 949
950 int w = 300; 950 int w = 300;
951 if ( QApplication::desktop()->width() < 320 ) 951 if ( QApplication::desktop()->width() < 320 )
952 w = 220; 952 w = 220;
953 int h = bar.sizeHint().height() ; 953 int h = bar.sizeHint().height() ;
954 int dw = QApplication::desktop()->width(); 954 int dw = QApplication::desktop()->width();
955 int dh = QApplication::desktop()->height(); 955 int dh = QApplication::desktop()->height();
956 bar.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 956 bar.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
957 bar.show(); 957 bar.show();
958 int modulo = (er.count()/10)+1; 958 int modulo = (er.count()/10)+1;
959 int incCounter = 0; 959 int incCounter = 0;
960 while ( inR ) { 960 while ( inR ) {
961 if ( ! bar.isVisible() ) 961 if ( ! bar.isVisible() )
962 return false; 962 return false;
963 if ( incCounter % modulo == 0 ) 963 if ( incCounter % modulo == 0 )
964 bar.setProgress( incCounter ); 964 bar.setProgress( incCounter );
965 ++incCounter; 965 ++incCounter;
966 uid = inR->uid(); 966 uid = inR->uid();
967 bool skipIncidence = false; 967 bool skipIncidence = false;
968 if ( uid.left(21) == QString("last-syncEvent-device") ) 968 if ( uid.left(21) == QString("last-syncEvent-device") )
969 skipIncidence = true; 969 skipIncidence = true;
970 970
971 qApp->processEvents(); 971 qApp->processEvents();
972 if ( !skipIncidence ) { 972 if ( !skipIncidence ) {
973 inL = local->incidence( uid ); 973 inL = local->incidence( uid );
974 if ( inL ) { // maybe conflict - same uid in both calendars 974 if ( inL ) { // maybe conflict - same uid in both calendars
975 int maxrev = inL->revision(); 975 int maxrev = inL->revision();
976 if ( maxrev < inR->revision() ) 976 if ( maxrev < inR->revision() )
977 maxrev = inR->revision(); 977 maxrev = inR->revision();
978 if ( (take = takeEvent( inL, inR, mode, fullDateRange )) > 0 ) { 978 if ( (take = takeEvent( inL, inR, mode, fullDateRange )) > 0 ) {
979 //qDebug("take %d %s ", take, inL->summary().latin1()); 979 //qDebug("take %d %s ", take, inL->summary().latin1());
980 if ( take == 3 ) 980 if ( take == 3 )
981 return false; 981 return false;
982 if ( take == 1 ) {// take local 982 if ( take == 1 ) {// take local
983 inL->setZaurusUid( inR->zaurusUid() ); 983 inL->setZaurusUid( inR->zaurusUid() );
984 remote->deleteIncidence( inR ); 984 remote->deleteIncidence( inR );
985 if ( inL->revision() < maxrev ) 985 if ( inL->revision() < maxrev )
986 inL->setRevision( maxrev ); 986 inL->setRevision( maxrev );
987 remote->addIncidence( inL->clone() ); 987 remote->addIncidence( inL->clone() );
988 ++changedRemote; 988 ++changedRemote;
989 } else { 989 } else {
990 if ( inR->revision() < maxrev ) 990 if ( inR->revision() < maxrev )
991 inR->setRevision( maxrev ); 991 inR->setRevision( maxrev );
992 local->deleteIncidence( inL ); 992 local->deleteIncidence( inL );
993 local->addIncidence( inR->clone() ); 993 local->addIncidence( inR->clone() );
994 ++changedLocal; 994 ++changedLocal;
995 } 995 }
996 } 996 }
997 } else { // no conflict 997 } else { // no conflict
998 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 998 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
999 QString des = eventLSync->description(); 999 QString des = eventLSync->description();
1000 QString pref = "e"; 1000 QString pref = "e";
1001 if ( inR->type() == "Todo" ) 1001 if ( inR->type() == "Todo" )
1002 pref = "t"; 1002 pref = "t";
1003 if ( des.find(pref+QString::number( inR->zaurusId() ) +"," ) >= 0 && mode != 5) { // delete it 1003 if ( des.find(pref+QString::number( inR->zaurusId() ) +"," ) >= 0 && mode != 5) { // delete it
1004 inR->setZaurusStat( SYNC_TEMPSTATE_DELETE ); 1004 inR->setTempSyncStat( SYNC_TEMPSTATE_DELETE );
1005 //remote->deleteIncidence( inR ); 1005 //remote->deleteIncidence( inR );
1006 ++deletedEventR; 1006 ++deletedEventR;
1007 } else { 1007 } else {
1008 inR->setLastModified( modifiedCalendar ); 1008 inR->setLastModified( modifiedCalendar );
1009 local->addIncidence( inR->clone() ); 1009 local->addIncidence( inR->clone() );
1010 ++addedEvent; 1010 ++addedEvent;
1011 } 1011 }
1012 } else { 1012 } else {
1013 if ( inR->lastModified() > mLastCalendarSync || mode == 5 ) { 1013 if ( inR->lastModified() > mLastCalendarSync || mode == 5 ) {
1014 inR->setLastModified( modifiedCalendar ); 1014 inR->setLastModified( modifiedCalendar );
1015 local->addIncidence( inR->clone() ); 1015 local->addIncidence( inR->clone() );
1016 ++addedEvent; 1016 ++addedEvent;
1017 } else { 1017 } else {
1018 checkSharpEvent(eventRSyncSharp, inR); 1018 checkSharpEvent(eventRSyncSharp, inR);
1019 remote->deleteIncidence( inR ); 1019 remote->deleteIncidence( inR );
1020 ++deletedEventR; 1020 ++deletedEventR;
1021 } 1021 }
1022 } 1022 }
1023 } 1023 }
1024 } 1024 }
1025 inR = er.next(); 1025 inR = er.next();
1026 } 1026 }
1027 QPtrList<Incidence> el = local->rawIncidences(); 1027 QPtrList<Incidence> el = local->rawIncidences();
1028 inL = el.first(); 1028 inL = el.first();
1029 modulo = (el.count()/10)+1; 1029 modulo = (el.count()/10)+1;
1030 bar.setCaption (i18n("Add / remove events") ); 1030 bar.setCaption (i18n("Add / remove events") );
1031 bar.setTotalSteps ( el.count() ) ; 1031 bar.setTotalSteps ( el.count() ) ;
1032 bar.show(); 1032 bar.show();
1033 incCounter = 0; 1033 incCounter = 0;
1034 1034
1035 while ( inL ) { 1035 while ( inL ) {
1036 1036
1037 qApp->processEvents(); 1037 qApp->processEvents();
1038 if ( ! bar.isVisible() ) 1038 if ( ! bar.isVisible() )
1039 return false; 1039 return false;
1040 if ( incCounter % modulo == 0 ) 1040 if ( incCounter % modulo == 0 )
1041 bar.setProgress( incCounter ); 1041 bar.setProgress( incCounter );
1042 ++incCounter; 1042 ++incCounter;
1043 uid = inL->uid(); 1043 uid = inL->uid();
1044 bool skipIncidence = false; 1044 bool skipIncidence = false;
1045 if ( uid.left(21) == QString("last-syncEvent-device") ) 1045 if ( uid.left(21) == QString("last-syncEvent-device") )
1046 skipIncidence = true; 1046 skipIncidence = true;
1047 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL && inL->type() == "Journal" ) 1047 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL && inL->type() == "Journal" )
1048 skipIncidence = true; 1048 skipIncidence = true;
1049 if ( !skipIncidence ) { 1049 if ( !skipIncidence ) {
1050 inR = remote->incidence( uid ); 1050 inR = remote->incidence( uid );
1051 if ( ! inR ) { 1051 if ( ! inR ) {
1052 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 1052 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
1053 if ( inL->zaurusId() >= 0 && mode != 4 ) { 1053 if ( inL->zaurusId() >= 0 && mode != 4 ) {
1054 local->deleteIncidence( inL ); 1054 local->deleteIncidence( inL );
1055 ++deletedEventL; 1055 ++deletedEventL;
1056 } else { 1056 } else {
1057 if ( ! KOPrefs::instance()->mWriteBackExistingOnly ) { 1057 if ( ! KOPrefs::instance()->mWriteBackExistingOnly ) {
1058 inL->setZaurusId( -1 ); 1058 inL->setZaurusId( -1 );
1059 ++addedEventR; 1059 ++addedEventR;
1060 inL->setLastModified( modifiedCalendar ); 1060 inL->setLastModified( modifiedCalendar );
1061 remote->addIncidence( inL->clone() ); 1061 remote->addIncidence( inL->clone() );
1062 } 1062 }
1063 } 1063 }
1064 } else { 1064 } else {
1065 if ( inL->lastModified() < mLastCalendarSync && mode != 4 ) { 1065 if ( inL->lastModified() < mLastCalendarSync && mode != 4 ) {
1066 checkSharpEvent(eventLSyncSharp, inL); 1066 checkSharpEvent(eventLSyncSharp, inL);
1067 local->deleteIncidence( inL ); 1067 local->deleteIncidence( inL );
1068 ++deletedEventL; 1068 ++deletedEventL;
1069 } else { 1069 } else {
1070 if ( ! KOPrefs::instance()->mWriteBackExistingOnly ) { 1070 if ( ! KOPrefs::instance()->mWriteBackExistingOnly ) {
1071 ++addedEventR; 1071 ++addedEventR;
1072 inL->setLastModified( modifiedCalendar ); 1072 inL->setLastModified( modifiedCalendar );
1073 remote->addIncidence( inL->clone() ); 1073 remote->addIncidence( inL->clone() );
1074 } 1074 }
1075 } 1075 }
1076 } 1076 }
1077 } 1077 }
1078 } 1078 }
1079 inL = el.next(); 1079 inL = el.next();
1080 } 1080 }
1081 1081
1082 bar.hide(); 1082 bar.hide();
1083 mLastCalendarSync = QDateTime::currentDateTime().addSecs( 1 ); 1083 mLastCalendarSync = QDateTime::currentDateTime().addSecs( 1 );
1084 eventLSync->setReadOnly( false ); 1084 eventLSync->setReadOnly( false );
1085 eventLSync->setDtStart( mLastCalendarSync ); 1085 eventLSync->setDtStart( mLastCalendarSync );
1086 eventRSync->setDtStart( mLastCalendarSync ); 1086 eventRSync->setDtStart( mLastCalendarSync );
1087 eventLSync->setDtEnd( mLastCalendarSync.addSecs( 3600 ) ); 1087 eventLSync->setDtEnd( mLastCalendarSync.addSecs( 3600 ) );
1088 eventRSync->setDtEnd( mLastCalendarSync.addSecs( 3600 ) ); 1088 eventRSync->setDtEnd( mLastCalendarSync.addSecs( 3600 ) );
1089 eventRSync->setLocation( i18n("Remote from: ")+mCurrentSyncName ) ; 1089 eventRSync->setLocation( i18n("Remote from: ")+mCurrentSyncName ) ;
1090 eventLSync->setLocation(i18n("Local from: ") + mCurrentSyncName ); 1090 eventLSync->setLocation(i18n("Local from: ") + mCurrentSyncName );
1091 eventLSync->setReadOnly( true ); 1091 eventLSync->setReadOnly( true );
1092 if ( mGlobalSyncMode == SYNC_MODE_NORMAL) 1092 if ( mGlobalSyncMode == SYNC_MODE_NORMAL)
1093 remote->addEvent( eventRSync ); 1093 remote->addEvent( eventRSync );
1094 QString mes; 1094 QString mes;
1095 mes .sprintf( i18n("Synchronization summary:\n\n %d items added to local\n %d items added to remote\n %d items updated on local\n %d items updated on remote\n %d items deleted on local\n %d items deleted on remote\n"),addedEvent, addedEventR, changedLocal, changedRemote, deletedEventL, deletedEventR ); 1095 mes .sprintf( i18n("Synchronization summary:\n\n %d items added to local\n %d items added to remote\n %d items updated on local\n %d items updated on remote\n %d items deleted on local\n %d items deleted on remote\n"),addedEvent, addedEventR, changedLocal, changedRemote, deletedEventL, deletedEventR );
1096 if ( KOPrefs::instance()->mShowSyncSummary ) { 1096 if ( KOPrefs::instance()->mShowSyncSummary ) {
1097 KMessageBox::information(this, mes, i18n("KO/Pi Synchronization") ); 1097 KMessageBox::information(this, mes, i18n("KO/Pi Synchronization") );
1098 } 1098 }
1099 qDebug( mes ); 1099 qDebug( mes );
1100 mCalendar->checkAlarmForIncidence( 0, true ); 1100 mCalendar->checkAlarmForIncidence( 0, true );
1101 return syncOK; 1101 return syncOK;
1102} 1102}
1103 1103
1104void CalendarView::setSyncDevice( QString s ) 1104void CalendarView::setSyncDevice( QString s )
1105{ 1105{
1106 mCurrentSyncDevice= s; 1106 mCurrentSyncDevice= s;
1107} 1107}
1108void CalendarView::setSyncName( QString s ) 1108void CalendarView::setSyncName( QString s )
1109{ 1109{
1110 mCurrentSyncName= s; 1110 mCurrentSyncName= s;
1111} 1111}
1112bool CalendarView::syncCalendar(QString filename, int mode) 1112bool CalendarView::syncCalendar(QString filename, int mode)
1113{ 1113{
1114 mGlobalSyncMode = SYNC_MODE_NORMAL; 1114 mGlobalSyncMode = SYNC_MODE_NORMAL;
1115 CalendarLocal* calendar = new CalendarLocal(); 1115 CalendarLocal* calendar = new CalendarLocal();
1116 calendar->setTimeZoneId(KOPrefs::instance()->mTimeZoneId); 1116 calendar->setTimeZoneId(KOPrefs::instance()->mTimeZoneId);
1117 FileStorage* storage = new FileStorage( calendar ); 1117 FileStorage* storage = new FileStorage( calendar );
1118 bool syncOK = false; 1118 bool syncOK = false;
1119 storage->setFileName( filename ); 1119 storage->setFileName( filename );
1120 // qDebug("loading ... "); 1120 // qDebug("loading ... ");
1121 if ( storage->load(KOPrefs::instance()->mUseQuicksave) ) { 1121 if ( storage->load(KOPrefs::instance()->mUseQuicksave) ) {
1122 getEventViewerDialog()->setSyncMode( true ); 1122 getEventViewerDialog()->setSyncMode( true );
1123 syncOK = synchronizeCalendar( mCalendar, calendar, mode ); 1123 syncOK = synchronizeCalendar( mCalendar, calendar, mode );
1124 getEventViewerDialog()->setSyncMode( false ); 1124 getEventViewerDialog()->setSyncMode( false );
1125 if ( syncOK ) { 1125 if ( syncOK ) {
1126 if ( KOPrefs::instance()->mWriteBackFile ) 1126 if ( KOPrefs::instance()->mWriteBackFile )
1127 { 1127 {
1128 storage->setSaveFormat( new ICalFormat( KOPrefs::instance()->mUseQuicksave) ); 1128 storage->setSaveFormat( new ICalFormat( KOPrefs::instance()->mUseQuicksave) );
1129 storage->save(); 1129 storage->save();
1130 } 1130 }
1131 } 1131 }
1132 setModified( true ); 1132 setModified( true );
1133 } 1133 }
1134 delete storage; 1134 delete storage;
1135 delete calendar; 1135 delete calendar;
1136 if ( syncOK ) 1136 if ( syncOK )
1137 updateView(); 1137 updateView();
1138 return syncOK; 1138 return syncOK;
1139} 1139}
1140void CalendarView::syncSharp() 1140void CalendarView::syncSharp()
1141{ 1141{
1142#ifndef DESKTOP_VERSION 1142#ifndef DESKTOP_VERSION
1143 mGlobalSyncMode = SYNC_MODE_EXTERNAL; 1143 mGlobalSyncMode = SYNC_MODE_EXTERNAL;
1144 //mCurrentSyncDevice = "sharp-DTM"; 1144 //mCurrentSyncDevice = "sharp-DTM";
1145 if ( KOPrefs::instance()->mAskForPreferences ) 1145 if ( KOPrefs::instance()->mAskForPreferences )
1146 edit_sync_options(); 1146 edit_sync_options();
1147 qApp->processEvents(); 1147 qApp->processEvents();
1148 CalendarLocal* calendar = new CalendarLocal(); 1148 CalendarLocal* calendar = new CalendarLocal();
1149 calendar->setTimeZoneId(KOPrefs::instance()->mTimeZoneId); 1149 calendar->setTimeZoneId(KOPrefs::instance()->mTimeZoneId);
1150 bool syncOK = false; 1150 bool syncOK = false;
1151 SharpFormat sharpFormat; 1151 SharpFormat sharpFormat;
1152 if ( sharpFormat.load( calendar, mCalendar ) ) { 1152 if ( sharpFormat.load( calendar, mCalendar ) ) {
1153 getEventViewerDialog()->setSyncMode( true ); 1153 getEventViewerDialog()->setSyncMode( true );
1154 syncOK = synchronizeCalendar( mCalendar, calendar, KOPrefs::instance()->mSyncAlgoPrefs ); 1154 syncOK = synchronizeCalendar( mCalendar, calendar, KOPrefs::instance()->mSyncAlgoPrefs );
1155 getEventViewerDialog()->setSyncMode( false ); 1155 getEventViewerDialog()->setSyncMode( false );
1156 qApp->processEvents(); 1156 qApp->processEvents();
1157 if ( syncOK ) { 1157 if ( syncOK ) {
1158 if ( KOPrefs::instance()->mWriteBackFile ) 1158 if ( KOPrefs::instance()->mWriteBackFile )
1159 { 1159 {
1160 QPtrList<Incidence> iL = mCalendar->rawIncidences(); 1160 QPtrList<Incidence> iL = mCalendar->rawIncidences();
1161 Incidence* inc = iL.first(); 1161 Incidence* inc = iL.first();
1162 /* obsolete 1162 /* obsolete
1163 while ( inc ) { 1163 while ( inc ) {
1164 inc->setZaurusStat( inc->revision () ); 1164 inc->setZaurusStat( inc->revision () );
1165 inc = iL.next(); 1165 inc = iL.next();
1166 } 1166 }
1167 */ 1167 */
1168 // pending: clean last sync event description 1168 // pending: clean last sync event description
1169 sharpFormat.save(calendar); 1169 sharpFormat.save(calendar);
1170 iL = calendar->rawIncidences(); 1170 iL = calendar->rawIncidences();
1171 inc = iL.first(); 1171 inc = iL.first();
1172 Incidence* loc; 1172 Incidence* loc;
1173 while ( inc ) { 1173 while ( inc ) {
1174 if ( inc->zaurusStat() == SYNC_TEMPSTATE_NEW_ID ) { 1174 if ( inc->tempSyncStat() == SYNC_TEMPSTATE_NEW_ID ) {
1175 loc = mCalendar->incidence(inc->uid() ); 1175 loc = mCalendar->incidence(inc->uid() );
1176 if ( loc ) { 1176 if ( loc ) {
1177 loc->setZaurusId( inc->zaurusId() ); 1177 loc->setZaurusId( inc->zaurusId() );
1178 loc->setZaurusUid( inc->zaurusUid() ); 1178 loc->setZaurusUid( inc->zaurusUid() );
1179 } 1179 }
1180 } 1180 }
1181 inc = iL.next(); 1181 inc = iL.next();
1182 } 1182 }
1183 Incidence* lse = getLastSyncEvent(); 1183 Incidence* lse = getLastSyncEvent();
1184 if ( lse ) { 1184 if ( lse ) {
1185 lse->setReadOnly( false ); 1185 lse->setReadOnly( false );
1186 lse->setDescription( "" ); 1186 lse->setDescription( "" );
1187 lse->setReadOnly( true ); 1187 lse->setReadOnly( true );
1188 } 1188 }
1189 } 1189 }
1190 } 1190 }
1191 setModified( true ); 1191 setModified( true );
1192 } else { 1192 } else {
1193 QString question = i18n("Sorry, the database access\ncommand failed!\n\nNothing synced!\n") ; 1193 QString question = i18n("Sorry, the database access\ncommand failed!\n\nNothing synced!\n") ;
1194 QMessageBox::information( 0, i18n("KO/Pi Import - ERROR"), 1194 QMessageBox::information( 0, i18n("KO/Pi Import - ERROR"),
1195 question, i18n("Ok")) ; 1195 question, i18n("Ok")) ;
1196 1196
1197 } 1197 }
1198 delete calendar; 1198 delete calendar;
1199 updateView(); 1199 updateView();
1200 return ;//syncOK; 1200 return ;//syncOK;
1201#endif 1201#endif
1202} 1202}
1203 1203
1204 1204
1205#include <kabc/stdaddressbook.h> 1205#include <kabc/stdaddressbook.h>
1206bool CalendarView::importBday() 1206bool CalendarView::importBday()
1207{ 1207{
1208 KABC::StdAddressBook* AddressBook = KABC::StdAddressBook::self( true ); 1208 KABC::StdAddressBook* AddressBook = KABC::StdAddressBook::self( true );
1209 KABC::AddressBook::Iterator it; 1209 KABC::AddressBook::Iterator it;
1210 int count = 0; 1210 int count = 0;
1211 for( it = AddressBook->begin(); it != AddressBook->end(); ++it ) { 1211 for( it = AddressBook->begin(); it != AddressBook->end(); ++it ) {
1212 ++count; 1212 ++count;
1213 } 1213 }
1214 QProgressBar bar(count,0 ); 1214 QProgressBar bar(count,0 );
1215 int w = 300; 1215 int w = 300;
1216 if ( QApplication::desktop()->width() < 320 ) 1216 if ( QApplication::desktop()->width() < 320 )
1217 w = 220; 1217 w = 220;
1218 int h = bar.sizeHint().height() ; 1218 int h = bar.sizeHint().height() ;
1219 int dw = QApplication::desktop()->width(); 1219 int dw = QApplication::desktop()->width();
1220 int dh = QApplication::desktop()->height(); 1220 int dh = QApplication::desktop()->height();
1221 bar.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 1221 bar.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
1222 bar.show(); 1222 bar.show();
1223 bar.setCaption (i18n("Reading addressbook - close to abort!") ); 1223 bar.setCaption (i18n("Reading addressbook - close to abort!") );
1224 qApp->processEvents(); 1224 qApp->processEvents();
1225 count = 0; 1225 count = 0;
1226 int addCount = 0; 1226 int addCount = 0;
1227 KCal::Attendee* a = 0; 1227 KCal::Attendee* a = 0;
1228 for( it = AddressBook->begin(); it != AddressBook->end(); ++it ) { 1228 for( it = AddressBook->begin(); it != AddressBook->end(); ++it ) {
1229 if ( ! bar.isVisible() ) 1229 if ( ! bar.isVisible() )
1230 return false; 1230 return false;
1231 bar.setProgress( count++ ); 1231 bar.setProgress( count++ );
1232 qApp->processEvents(); 1232 qApp->processEvents();
1233 //qDebug("add BDay %s %s", (*it).realName().latin1(),(*it).birthday().date().toString().latin1() ); 1233 //qDebug("add BDay %s %s", (*it).realName().latin1(),(*it).birthday().date().toString().latin1() );
1234 if ( (*it).birthday().date().isValid() ){ 1234 if ( (*it).birthday().date().isValid() ){
1235 a = new KCal::Attendee( (*it).realName(), (*it).preferredEmail(),false,KCal::Attendee::NeedsAction,KCal::Attendee::ReqParticipant,(*it).uid()) ; 1235 a = new KCal::Attendee( (*it).realName(), (*it).preferredEmail(),false,KCal::Attendee::NeedsAction,KCal::Attendee::ReqParticipant,(*it).uid()) ;
1236 if ( addAnniversary( (*it).birthday().date(), (*it).assembledName(), a, true ) ) 1236 if ( addAnniversary( (*it).birthday().date(), (*it).assembledName(), a, true ) )
1237 ++addCount; 1237 ++addCount;
1238 } 1238 }
1239 QDate anni = KGlobal::locale()->readDate( (*it).custom("KADDRESSBOOK", "X-Anniversary" ), "%Y-%m-%d"); 1239 QDate anni = KGlobal::locale()->readDate( (*it).custom("KADDRESSBOOK", "X-Anniversary" ), "%Y-%m-%d");
1240 if ( anni.isValid() ){ 1240 if ( anni.isValid() ){
1241 a = new KCal::Attendee( (*it).realName(), (*it).preferredEmail(),false,KCal::Attendee::NeedsAction,KCal::Attendee::ReqParticipant,(*it).uid()) ; 1241 a = new KCal::Attendee( (*it).realName(), (*it).preferredEmail(),false,KCal::Attendee::NeedsAction,KCal::Attendee::ReqParticipant,(*it).uid()) ;
1242 if ( addAnniversary( anni, (*it).assembledName(), a, false ) ) 1242 if ( addAnniversary( anni, (*it).assembledName(), a, false ) )
1243 ++addCount; 1243 ++addCount;
1244 } 1244 }
1245 } 1245 }
1246 updateView(); 1246 updateView();
1247 topLevelWidget()->setCaption(QString::number( addCount )+ i18n(" birthdays/anniversaries added!")); 1247 topLevelWidget()->setCaption(QString::number( addCount )+ i18n(" birthdays/anniversaries added!"));
1248 return true; 1248 return true;
1249} 1249}
1250 1250
1251bool CalendarView::addAnniversary( QDate date, QString name, KCal::Attendee* a, bool birthday) 1251bool CalendarView::addAnniversary( QDate date, QString name, KCal::Attendee* a, bool birthday)
1252{ 1252{
1253 //qDebug("addAnni "); 1253 //qDebug("addAnni ");
1254 Event * ev = new Event(); 1254 Event * ev = new Event();
1255 if ( a ) { 1255 if ( a ) {
1256 ev->addAttendee( a ); 1256 ev->addAttendee( a );
1257 } 1257 }
1258 QString kind; 1258 QString kind;
1259 if ( birthday ) 1259 if ( birthday )
1260 kind = i18n( "Birthday" ); 1260 kind = i18n( "Birthday" );
1261 else 1261 else
1262 kind = i18n( "Anniversary" ); 1262 kind = i18n( "Anniversary" );
1263 ev->setSummary( name + " - " + kind ); 1263 ev->setSummary( name + " - " + kind );
1264 ev->setOrganizer( "nobody@nowhere" ); 1264 ev->setOrganizer( "nobody@nowhere" );
1265 ev->setCategories( kind ); 1265 ev->setCategories( kind );
1266 ev->setDtStart( QDateTime(date) ); 1266 ev->setDtStart( QDateTime(date) );
1267 ev->setDtEnd( QDateTime(date) ); 1267 ev->setDtEnd( QDateTime(date) );
1268 ev->setFloats( true ); 1268 ev->setFloats( true );
1269 Recurrence * rec = ev->recurrence(); 1269 Recurrence * rec = ev->recurrence();
1270 rec->setYearly(Recurrence::rYearlyMonth,1,-1); 1270 rec->setYearly(Recurrence::rYearlyMonth,1,-1);
1271 rec->addYearlyNum( date.month() ); 1271 rec->addYearlyNum( date.month() );
1272 if ( !mCalendar->addAnniversaryNoDup( ev ) ) { 1272 if ( !mCalendar->addAnniversaryNoDup( ev ) ) {
1273 delete ev; 1273 delete ev;
1274 return false; 1274 return false;
1275 } 1275 }
1276 return true; 1276 return true;
1277 1277
1278} 1278}
1279bool CalendarView::importQtopia( const QString &categories, 1279bool CalendarView::importQtopia( const QString &categories,
1280 const QString &datebook, 1280 const QString &datebook,
1281 const QString &todolist ) 1281 const QString &todolist )
1282{ 1282{
1283 1283
1284 QtopiaFormat qtopiaFormat; 1284 QtopiaFormat qtopiaFormat;
1285 qtopiaFormat.setCategoriesList ( &(KOPrefs::instance()->mCustomCategories)); 1285 qtopiaFormat.setCategoriesList ( &(KOPrefs::instance()->mCustomCategories));
1286 if ( !categories.isEmpty() ) qtopiaFormat.load( mCalendar, categories ); 1286 if ( !categories.isEmpty() ) qtopiaFormat.load( mCalendar, categories );
1287 if ( !datebook.isEmpty() ) qtopiaFormat.load( mCalendar, datebook ); 1287 if ( !datebook.isEmpty() ) qtopiaFormat.load( mCalendar, datebook );
1288 if ( !todolist.isEmpty() ) qtopiaFormat.load( mCalendar, todolist ); 1288 if ( !todolist.isEmpty() ) qtopiaFormat.load( mCalendar, todolist );
1289 1289
1290 updateView(); 1290 updateView();
1291 return true; 1291 return true;
1292 1292
1293#if 0 1293#if 0
1294 mGlobalSyncMode = SYNC_MODE_QTOPIA; 1294 mGlobalSyncMode = SYNC_MODE_QTOPIA;
1295 mCurrentSyncDevice = "qtopia-XML"; 1295 mCurrentSyncDevice = "qtopia-XML";
1296 if ( KOPrefs::instance()->mAskForPreferences ) 1296 if ( KOPrefs::instance()->mAskForPreferences )
1297 edit_sync_options(); 1297 edit_sync_options();
1298 qApp->processEvents(); 1298 qApp->processEvents();
1299 CalendarLocal* calendar = new CalendarLocal(); 1299 CalendarLocal* calendar = new CalendarLocal();
1300 calendar->setTimeZoneId(KOPrefs::instance()->mTimeZoneId); 1300 calendar->setTimeZoneId(KOPrefs::instance()->mTimeZoneId);
1301 bool syncOK = false; 1301 bool syncOK = false;
1302 QtopiaFormat qtopiaFormat; 1302 QtopiaFormat qtopiaFormat;
1303 qtopiaFormat.setCategoriesList ( &(KOPrefs::instance()->mCustomCategories)); 1303 qtopiaFormat.setCategoriesList ( &(KOPrefs::instance()->mCustomCategories));
1304 bool loadOk = true; 1304 bool loadOk = true;
1305 if ( !categories.isEmpty() ) 1305 if ( !categories.isEmpty() )
1306 loadOk = qtopiaFormat.load( calendar, categories ); 1306 loadOk = qtopiaFormat.load( calendar, categories );
1307 if ( loadOk && !datebook.isEmpty() ) 1307 if ( loadOk && !datebook.isEmpty() )
1308 loadOk = qtopiaFormat.load( calendar, datebook ); 1308 loadOk = qtopiaFormat.load( calendar, datebook );
1309 if ( loadOk && !todolist.isEmpty() ) 1309 if ( loadOk && !todolist.isEmpty() )
1310 loadOk = qtopiaFormat.load( calendar, todolist ); 1310 loadOk = qtopiaFormat.load( calendar, todolist );
1311 1311
1312 if ( loadOk ) { 1312 if ( loadOk ) {
1313 getEventViewerDialog()->setSyncMode( true ); 1313 getEventViewerDialog()->setSyncMode( true );
1314 syncOK = synchronizeCalendar( mCalendar, calendar, KOPrefs::instance()->mSyncAlgoPrefs ); 1314 syncOK = synchronizeCalendar( mCalendar, calendar, KOPrefs::instance()->mSyncAlgoPrefs );
1315 getEventViewerDialog()->setSyncMode( false ); 1315 getEventViewerDialog()->setSyncMode( false );
1316 qApp->processEvents(); 1316 qApp->processEvents();
1317 if ( syncOK ) { 1317 if ( syncOK ) {
1318 if ( KOPrefs::instance()->mWriteBackFile ) 1318 if ( KOPrefs::instance()->mWriteBackFile )
1319 { 1319 {
1320 // write back XML file 1320 // write back XML file
1321 1321
1322 } 1322 }
1323 setModified( true ); 1323 setModified( true );
1324 } 1324 }
1325 } else { 1325 } else {
1326 QString question = i18n("Sorry, the file loading\ncommand failed!\n\nNothing synced!\n") ; 1326 QString question = i18n("Sorry, the file loading\ncommand failed!\n\nNothing synced!\n") ;
1327 QMessageBox::information( 0, i18n("KO/Pi Sync - ERROR"), 1327 QMessageBox::information( 0, i18n("KO/Pi Sync - ERROR"),
1328 question, i18n("Ok")) ; 1328 question, i18n("Ok")) ;
1329 } 1329 }
1330 delete calendar; 1330 delete calendar;
1331 updateView(); 1331 updateView();
1332 return syncOK; 1332 return syncOK;
1333 1333
1334 1334
1335#endif 1335#endif
1336 1336
1337} 1337}
1338 1338
1339void CalendarView::setSyncEventsReadOnly() 1339void CalendarView::setSyncEventsReadOnly()
1340{ 1340{
1341 Event * ev; 1341 Event * ev;
1342 QPtrList<Event> eL = mCalendar->rawEvents(); 1342 QPtrList<Event> eL = mCalendar->rawEvents();
1343 ev = eL.first(); 1343 ev = eL.first();
1344 while ( ev ) { 1344 while ( ev ) {
1345 if ( ev->uid().left(21) == QString("last-syncEvent-device") ) 1345 if ( ev->uid().left(21) == QString("last-syncEvent-device") )
1346 ev->setReadOnly( true ); 1346 ev->setReadOnly( true );
1347 ev = eL.next(); 1347 ev = eL.next();
1348 } 1348 }
1349} 1349}
1350bool CalendarView::openCalendar(QString filename, bool merge) 1350bool CalendarView::openCalendar(QString filename, bool merge)
1351{ 1351{
1352 1352
1353 if (filename.isEmpty()) { 1353 if (filename.isEmpty()) {
1354 return false; 1354 return false;
1355 } 1355 }
1356 1356
1357 if (!QFile::exists(filename)) { 1357 if (!QFile::exists(filename)) {
1358 KMessageBox::error(this,i18n("File does not exist:\n '%1'.").arg(filename)); 1358 KMessageBox::error(this,i18n("File does not exist:\n '%1'.").arg(filename));
1359 return false; 1359 return false;
1360 } 1360 }
1361 1361
1362 globalFlagBlockAgenda = 1; 1362 globalFlagBlockAgenda = 1;
1363 if (!merge) mCalendar->close(); 1363 if (!merge) mCalendar->close();
1364 1364
1365 mStorage->setFileName( filename ); 1365 mStorage->setFileName( filename );
1366 1366
1367 if ( mStorage->load(KOPrefs::instance()->mUseQuicksave) ) { 1367 if ( mStorage->load(KOPrefs::instance()->mUseQuicksave) ) {
1368 if ( merge ) ;//setModified( true ); 1368 if ( merge ) ;//setModified( true );
1369 else { 1369 else {
1370 //setModified( true ); 1370 //setModified( true );
1371 mViewManager->setDocumentId( filename ); 1371 mViewManager->setDocumentId( filename );
1372 mDialogManager->setDocumentId( filename ); 1372 mDialogManager->setDocumentId( filename );
1373 mTodoList->setDocumentId( filename ); 1373 mTodoList->setDocumentId( filename );
1374 } 1374 }
1375 globalFlagBlockAgenda = 2; 1375 globalFlagBlockAgenda = 2;
1376 // if ( getLastSyncEvent() ) 1376 // if ( getLastSyncEvent() )
1377 // getLastSyncEvent()->setReadOnly( true ); 1377 // getLastSyncEvent()->setReadOnly( true );
1378 mCalendar->reInitAlarmSettings(); 1378 mCalendar->reInitAlarmSettings();
1379 setSyncEventsReadOnly(); 1379 setSyncEventsReadOnly();
1380 updateUnmanagedViews(); 1380 updateUnmanagedViews();
1381 updateView(); 1381 updateView();
1382 if ( filename != MainWindow::defaultFileName() ) 1382 if ( filename != MainWindow::defaultFileName() )
1383 saveCalendar( MainWindow::defaultFileName() ); 1383 saveCalendar( MainWindow::defaultFileName() );
1384 loadedFileVersion = QDateTime::currentDateTime(); 1384 loadedFileVersion = QDateTime::currentDateTime();
1385 return true; 1385 return true;
1386 } else { 1386 } else {
1387 // while failing to load, the calendar object could 1387 // while failing to load, the calendar object could
1388 // have become partially populated. Clear it out. 1388 // have become partially populated. Clear it out.
1389 if ( !merge ) mCalendar->close(); 1389 if ( !merge ) mCalendar->close();
1390 1390
1391 KMessageBox::error(this,i18n("Couldn't load calendar\n '%1'.").arg(filename)); 1391 KMessageBox::error(this,i18n("Couldn't load calendar\n '%1'.").arg(filename));
1392 1392
1393 globalFlagBlockAgenda = 2; 1393 globalFlagBlockAgenda = 2;
1394 updateView(); 1394 updateView();
1395 } 1395 }
1396 return false; 1396 return false;
1397} 1397}
1398void CalendarView::setLoadedFileVersion(QDateTime dt) 1398void CalendarView::setLoadedFileVersion(QDateTime dt)
1399{ 1399{
1400 loadedFileVersion = dt; 1400 loadedFileVersion = dt;
1401} 1401}
1402bool CalendarView::checkFileChanged(QString fn) 1402bool CalendarView::checkFileChanged(QString fn)
1403{ 1403{
1404 QFileInfo finf ( fn ); 1404 QFileInfo finf ( fn );
1405 if ( !finf.exists() ) 1405 if ( !finf.exists() )
1406 return true; 1406 return true;
1407 QDateTime dt = finf.lastModified (); 1407 QDateTime dt = finf.lastModified ();
1408 if ( dt <= loadedFileVersion ) 1408 if ( dt <= loadedFileVersion )
1409 return false; 1409 return false;
1410 return true; 1410 return true;
1411 1411
1412} 1412}
1413bool CalendarView::checkFileVersion(QString fn) 1413bool CalendarView::checkFileVersion(QString fn)
1414{ 1414{
1415 QFileInfo finf ( fn ); 1415 QFileInfo finf ( fn );
1416 if ( !finf.exists() ) 1416 if ( !finf.exists() )
1417 return true; 1417 return true;
1418 QDateTime dt = finf.lastModified (); 1418 QDateTime dt = finf.lastModified ();
1419 //qDebug("loaded file version %s",loadedFileVersion.toString().latin1()); 1419 //qDebug("loaded file version %s",loadedFileVersion.toString().latin1());
1420 //qDebug("file on disk version %s",dt.toString().latin1()); 1420 //qDebug("file on disk version %s",dt.toString().latin1());
1421 if ( dt <= loadedFileVersion ) 1421 if ( dt <= loadedFileVersion )
1422 return true; 1422 return true;
1423 int km = KMessageBox::warningYesNoCancel(this, i18n("\nThe file on disk has changed!\nFile size: %1 bytes.\nLast modified: %2\nDo you want to:\n\n - Save and overwrite file?\n - Sync with file, then save?\n - Cancel without saving? \n").arg( QString::number( finf.size())).arg( KGlobal::locale()->formatDateTime(finf.lastModified (), true, false)) , 1423 int km = KMessageBox::warningYesNoCancel(this, i18n("\nThe file on disk has changed!\nFile size: %1 bytes.\nLast modified: %2\nDo you want to:\n\n - Save and overwrite file?\n - Sync with file, then save?\n - Cancel without saving? \n").arg( QString::number( finf.size())).arg( KGlobal::locale()->formatDateTime(finf.lastModified (), true, false)) ,
1424 i18n("KO/Pi Warning"),i18n("Overwrite"), 1424 i18n("KO/Pi Warning"),i18n("Overwrite"),
1425 i18n("Sync+save")); 1425 i18n("Sync+save"));
1426 1426
1427 if ( km == KMessageBox::Cancel ) 1427 if ( km == KMessageBox::Cancel )
1428 return false; 1428 return false;
1429 if ( km == KMessageBox::Yes ) 1429 if ( km == KMessageBox::Yes )
1430 return true; 1430 return true;
1431 1431
1432 setSyncDevice("deleteaftersync" ); 1432 setSyncDevice("deleteaftersync" );
1433 KOPrefs::instance()->mAskForPreferences = true; 1433 KOPrefs::instance()->mAskForPreferences = true;
1434 KOPrefs::instance()->mSyncAlgoPrefs = 3; 1434 KOPrefs::instance()->mSyncAlgoPrefs = 3;
1435 KOPrefs::instance()->mWriteBackFile = false; 1435 KOPrefs::instance()->mWriteBackFile = false;
1436 KOPrefs::instance()->mWriteBackExistingOnly = false; 1436 KOPrefs::instance()->mWriteBackExistingOnly = false;
1437 KOPrefs::instance()->mShowSyncSummary = false; 1437 KOPrefs::instance()->mShowSyncSummary = false;
1438 syncCalendar( fn, 3 ); 1438 syncCalendar( fn, 3 );
1439 Event * e = getLastSyncEvent(); 1439 Event * e = getLastSyncEvent();
1440 mCalendar->deleteEvent ( e ); 1440 mCalendar->deleteEvent ( e );
1441 updateView(); 1441 updateView();
1442 return true; 1442 return true;
1443} 1443}
1444 1444
1445bool CalendarView::saveCalendar( QString filename ) 1445bool CalendarView::saveCalendar( QString filename )
1446{ 1446{
1447 1447
1448 // Store back all unsaved data into calendar object 1448 // Store back all unsaved data into calendar object
1449 // qDebug("file %s %d ", filename.latin1() , mViewManager->currentView() ); 1449 // qDebug("file %s %d ", filename.latin1() , mViewManager->currentView() );
1450 if ( mViewManager->currentView() ) 1450 if ( mViewManager->currentView() )
1451 mViewManager->currentView()->flushView(); 1451 mViewManager->currentView()->flushView();
1452 1452
1453 //mStorage->setFileName( filename ); 1453 //mStorage->setFileName( filename );
1454 1454
1455 mStorage->setSaveFormat( new ICalFormat( KOPrefs::instance()->mUseQuicksave) ); 1455 mStorage->setSaveFormat( new ICalFormat( KOPrefs::instance()->mUseQuicksave) );
1456 mStorage->setFileName( filename ); 1456 mStorage->setFileName( filename );
1457 bool success; 1457 bool success;
1458 success = mStorage->save(); 1458 success = mStorage->save();
1459 if ( !success ) { 1459 if ( !success ) {
1460 return false; 1460 return false;
1461 } 1461 }
1462 1462
1463 return true; 1463 return true;
1464} 1464}
1465 1465
1466void CalendarView::closeCalendar() 1466void CalendarView::closeCalendar()
1467{ 1467{
1468 1468
1469 // child windows no longer valid 1469 // child windows no longer valid
1470 emit closingDown(); 1470 emit closingDown();
1471 1471
1472 mCalendar->close(); 1472 mCalendar->close();
1473 setModified(false); 1473 setModified(false);
1474 updateView(); 1474 updateView();
1475} 1475}
1476 1476
1477void CalendarView::archiveCalendar() 1477void CalendarView::archiveCalendar()
1478{ 1478{
1479 mDialogManager->showArchiveDialog(); 1479 mDialogManager->showArchiveDialog();
1480} 1480}
1481 1481
1482 1482
1483void CalendarView::readSettings() 1483void CalendarView::readSettings()
1484{ 1484{
1485 1485
1486 1486
1487 // mViewManager->showAgendaView(); 1487 // mViewManager->showAgendaView();
1488 QString str; 1488 QString str;
1489 //qDebug("CalendarView::readSettings() "); 1489 //qDebug("CalendarView::readSettings() ");
1490 // read settings from the KConfig, supplying reasonable 1490 // read settings from the KConfig, supplying reasonable
1491 // defaults where none are to be found 1491 // defaults where none are to be found
1492 KConfig *config = KOGlobals::config(); 1492 KConfig *config = KOGlobals::config();
1493#ifndef KORG_NOSPLITTER 1493#ifndef KORG_NOSPLITTER
1494 config->setGroup("KOrganizer Geometry"); 1494 config->setGroup("KOrganizer Geometry");
1495 1495
1496 QValueList<int> sizes = config->readIntListEntry("Separator1"); 1496 QValueList<int> sizes = config->readIntListEntry("Separator1");
1497 if (sizes.count() != 2) { 1497 if (sizes.count() != 2) {
1498 sizes << mDateNavigator->minimumSizeHint().width(); 1498 sizes << mDateNavigator->minimumSizeHint().width();
1499 sizes << 300; 1499 sizes << 300;
1500 } 1500 }
1501 mPanner->setSizes(sizes); 1501 mPanner->setSizes(sizes);
1502 1502
1503 sizes = config->readIntListEntry("Separator2"); 1503 sizes = config->readIntListEntry("Separator2");
1504 if ( ( mResourceView && sizes.count() == 4 ) || 1504 if ( ( mResourceView && sizes.count() == 4 ) ||
1505 ( !mResourceView && sizes.count() == 3 ) ) { 1505 ( !mResourceView && sizes.count() == 3 ) ) {
1506 mLeftSplitter->setSizes(sizes); 1506 mLeftSplitter->setSizes(sizes);
1507 } 1507 }
1508#endif 1508#endif
1509 globalFlagBlockAgenda = 1; 1509 globalFlagBlockAgenda = 1;
1510 mViewManager->showAgendaView(); 1510 mViewManager->showAgendaView();
1511 //mViewManager->readSettings( config ); 1511 //mViewManager->readSettings( config );
1512 mTodoList->restoreLayout(config,QString("Todo Layout")); 1512 mTodoList->restoreLayout(config,QString("Todo Layout"));
1513 readFilterSettings(config); 1513 readFilterSettings(config);
1514 config->setGroup( "Views" ); 1514 config->setGroup( "Views" );
1515 int dateCount = config->readNumEntry( "ShownDatesCount", 7 ); 1515 int dateCount = config->readNumEntry( "ShownDatesCount", 7 );
1516 if ( dateCount == 5 ) mNavigator->selectWorkWeek(); 1516 if ( dateCount == 5 ) mNavigator->selectWorkWeek();
1517 else if ( dateCount == 7 ) mNavigator->selectWeek(); 1517 else if ( dateCount == 7 ) mNavigator->selectWeek();
1518 else mNavigator->selectDates( dateCount ); 1518 else mNavigator->selectDates( dateCount );
1519 // mViewManager->readSettings( config ); 1519 // mViewManager->readSettings( config );
1520 updateConfig(); 1520 updateConfig();
1521 globalFlagBlockAgenda = 2; 1521 globalFlagBlockAgenda = 2;
1522 mViewManager->readSettings( config ); 1522 mViewManager->readSettings( config );
1523#ifdef DESKTOP_VERSION 1523#ifdef DESKTOP_VERSION
1524 config->setGroup("WidgetLayout"); 1524 config->setGroup("WidgetLayout");
1525 QStringList list; 1525 QStringList list;
1526 list = config->readListEntry("MainLayout"); 1526 list = config->readListEntry("MainLayout");
1527 int x,y,w,h; 1527 int x,y,w,h;
1528 if ( ! list.isEmpty() ) { 1528 if ( ! list.isEmpty() ) {
1529 x = list[0].toInt(); 1529 x = list[0].toInt();
1530 y = list[1].toInt(); 1530 y = list[1].toInt();
1531 w = list[2].toInt(); 1531 w = list[2].toInt();
1532 h = list[3].toInt(); 1532 h = list[3].toInt();
1533 topLevelWidget()->setGeometry(x,y,w,h); 1533 topLevelWidget()->setGeometry(x,y,w,h);
1534 1534
1535 } else { 1535 } else {
1536 topLevelWidget()->setGeometry( 40 ,40 , 640, 440); 1536 topLevelWidget()->setGeometry( 40 ,40 , 640, 440);
1537 } 1537 }
1538 list = config->readListEntry("EditEventLayout"); 1538 list = config->readListEntry("EditEventLayout");
1539 if ( ! list.isEmpty() ) { 1539 if ( ! list.isEmpty() ) {
1540 x = list[0].toInt(); 1540 x = list[0].toInt();
1541 y = list[1].toInt(); 1541 y = list[1].toInt();
1542 w = list[2].toInt(); 1542 w = list[2].toInt();
1543 h = list[3].toInt(); 1543 h = list[3].toInt();
1544 mEventEditor->setGeometry(x,y,w,h); 1544 mEventEditor->setGeometry(x,y,w,h);
1545 1545
1546 } 1546 }
1547 list = config->readListEntry("EditTodoLayout"); 1547 list = config->readListEntry("EditTodoLayout");
1548 if ( ! list.isEmpty() ) { 1548 if ( ! list.isEmpty() ) {
1549 x = list[0].toInt(); 1549 x = list[0].toInt();
1550 y = list[1].toInt(); 1550 y = list[1].toInt();
1551 w = list[2].toInt(); 1551 w = list[2].toInt();
1552 h = list[3].toInt(); 1552 h = list[3].toInt();
1553 mTodoEditor->setGeometry(x,y,w,h); 1553 mTodoEditor->setGeometry(x,y,w,h);
1554 1554
1555 } 1555 }
1556 list = config->readListEntry("ViewerLayout"); 1556 list = config->readListEntry("ViewerLayout");
1557 if ( ! list.isEmpty() ) { 1557 if ( ! list.isEmpty() ) {
1558 x = list[0].toInt(); 1558 x = list[0].toInt();
1559 y = list[1].toInt(); 1559 y = list[1].toInt();
1560 w = list[2].toInt(); 1560 w = list[2].toInt();
1561 h = list[3].toInt(); 1561 h = list[3].toInt();
1562 getEventViewerDialog()->setGeometry(x,y,w,h); 1562 getEventViewerDialog()->setGeometry(x,y,w,h);
1563 } 1563 }
1564#endif 1564#endif
1565 1565
1566 1566
1567 // pending read sync settings; 1567 // pending read sync settings;
1568 mSyncProfileNames.clear(); 1568 mSyncProfileNames.clear();
1569 mSyncProfileNames << "Profile_1"; 1569 mSyncProfileNames << "Profile_1";
1570 mSyncProfileNames << "Profile_2"; 1570 mSyncProfileNames << "Profile_2";
1571 mSyncProfileNames << "Profile_3"; 1571 mSyncProfileNames << "Profile_3";
1572 mSyncProfileNames << "Profile_4"; 1572 mSyncProfileNames << "Profile_4";
1573 mSyncProfileNames << "Profile_5"; 1573 mSyncProfileNames << "Profile_5";
1574 KSyncProfile* temp = new KSyncProfile (); 1574 KSyncProfile* temp = new KSyncProfile ();
1575 temp->setName("Profile_1" ); 1575 temp->setName("Profile_1" );
1576 mSyncProfiles.append( temp ); 1576 mSyncProfiles.append( temp );
1577 temp = new KSyncProfile (); 1577 temp = new KSyncProfile ();
1578 temp->setName("Profile_2" ); 1578 temp->setName("Profile_2" );
1579 mSyncProfiles.append( temp ); 1579 mSyncProfiles.append( temp );
1580 temp = new KSyncProfile (); 1580 temp = new KSyncProfile ();
1581 temp->setName("Profile_3" ); 1581 temp->setName("Profile_3" );
1582 mSyncProfiles.append( temp ); 1582 mSyncProfiles.append( temp );
1583 temp = new KSyncProfile (); 1583 temp = new KSyncProfile ();
1584 temp->setName("Profile_4" ); 1584 temp->setName("Profile_4" );
1585 mSyncProfiles.append( temp ); 1585 mSyncProfiles.append( temp );
1586 temp = new KSyncProfile (); 1586 temp = new KSyncProfile ();
1587 temp->setName("Profile_5" ); 1587 temp->setName("Profile_5" );
1588 mSyncProfiles.append( temp ); 1588 mSyncProfiles.append( temp );
1589} 1589}
1590 1590
1591 1591
1592void CalendarView::writeSettings() 1592void CalendarView::writeSettings()
1593{ 1593{
1594 // kdDebug() << "CalendarView::writeSettings" << endl; 1594 // kdDebug() << "CalendarView::writeSettings" << endl;
1595 1595
1596 KConfig *config = KOGlobals::config(); 1596 KConfig *config = KOGlobals::config();
1597 1597
1598#ifndef KORG_NOSPLITTER 1598#ifndef KORG_NOSPLITTER
1599 config->setGroup("KOrganizer Geometry"); 1599 config->setGroup("KOrganizer Geometry");
1600 1600
1601 QValueList<int> list = mPanner->sizes(); 1601 QValueList<int> list = mPanner->sizes();
1602 config->writeEntry("Separator1",list); 1602 config->writeEntry("Separator1",list);
1603 1603
1604 list = mLeftSplitter->sizes(); 1604 list = mLeftSplitter->sizes();
1605 config->writeEntry("Separator2",list); 1605 config->writeEntry("Separator2",list);
1606#endif 1606#endif
1607 1607
1608 mViewManager->writeSettings( config ); 1608 mViewManager->writeSettings( config );
1609 mTodoList->saveLayout(config,QString("Todo Layout")); 1609 mTodoList->saveLayout(config,QString("Todo Layout"));
1610 mDialogManager->writeSettings( config ); 1610 mDialogManager->writeSettings( config );
1611 //KOPrefs::instance()->usrWriteConfig(); 1611 //KOPrefs::instance()->usrWriteConfig();
1612 KOPrefs::instance()->writeConfig(); 1612 KOPrefs::instance()->writeConfig();
1613 1613
1614 writeFilterSettings(config); 1614 writeFilterSettings(config);
1615 1615
1616 config->setGroup( "Views" ); 1616 config->setGroup( "Views" );
1617 config->writeEntry( "ShownDatesCount", mNavigator->selectedDates().count() ); 1617 config->writeEntry( "ShownDatesCount", mNavigator->selectedDates().count() );
1618 1618
1619#ifdef DESKTOP_VERSION 1619#ifdef DESKTOP_VERSION
1620 config->setGroup("WidgetLayout"); 1620 config->setGroup("WidgetLayout");
1621 QStringList list ;//= config->readListEntry("MainLayout"); 1621 QStringList list ;//= config->readListEntry("MainLayout");
1622 int x,y,w,h; 1622 int x,y,w,h;
1623 QWidget* wid; 1623 QWidget* wid;
1624 wid = topLevelWidget(); 1624 wid = topLevelWidget();
1625 x = wid->geometry().x(); 1625 x = wid->geometry().x();
1626 y = wid->geometry().y(); 1626 y = wid->geometry().y();
1627 w = wid->width(); 1627 w = wid->width();
1628 h = wid->height(); 1628 h = wid->height();
1629 list.clear(); 1629 list.clear();
1630 list << QString::number( x ); 1630 list << QString::number( x );
1631 list << QString::number( y ); 1631 list << QString::number( y );
1632 list << QString::number( w ); 1632 list << QString::number( w );
1633 list << QString::number( h ); 1633 list << QString::number( h );
1634 config->writeEntry("MainLayout",list ); 1634 config->writeEntry("MainLayout",list );
1635 1635
1636 wid = mEventEditor; 1636 wid = mEventEditor;
1637 x = wid->geometry().x(); 1637 x = wid->geometry().x();
1638 y = wid->geometry().y(); 1638 y = wid->geometry().y();
1639 w = wid->width(); 1639 w = wid->width();
1640 h = wid->height(); 1640 h = wid->height();
1641 list.clear(); 1641 list.clear();
1642 list << QString::number( x ); 1642 list << QString::number( x );
1643 list << QString::number( y ); 1643 list << QString::number( y );
1644 list << QString::number( w ); 1644 list << QString::number( w );
1645 list << QString::number( h ); 1645 list << QString::number( h );
1646 config->writeEntry("EditEventLayout",list ); 1646 config->writeEntry("EditEventLayout",list );
1647 1647
1648 wid = mTodoEditor; 1648 wid = mTodoEditor;
1649 x = wid->geometry().x(); 1649 x = wid->geometry().x();
1650 y = wid->geometry().y(); 1650 y = wid->geometry().y();
1651 w = wid->width(); 1651 w = wid->width();
1652 h = wid->height(); 1652 h = wid->height();
1653 list.clear(); 1653 list.clear();
1654 list << QString::number( x ); 1654 list << QString::number( x );
1655 list << QString::number( y ); 1655 list << QString::number( y );
1656 list << QString::number( w ); 1656 list << QString::number( w );
1657 list << QString::number( h ); 1657 list << QString::number( h );
1658 config->writeEntry("EditTodoLayout",list ); 1658 config->writeEntry("EditTodoLayout",list );
1659 wid = getEventViewerDialog(); 1659 wid = getEventViewerDialog();
1660 x = wid->geometry().x(); 1660 x = wid->geometry().x();
1661 y = wid->geometry().y(); 1661 y = wid->geometry().y();
1662 w = wid->width(); 1662 w = wid->width();
1663 h = wid->height(); 1663 h = wid->height();
1664 list.clear(); 1664 list.clear();
1665 list << QString::number( x ); 1665 list << QString::number( x );
1666 list << QString::number( y ); 1666 list << QString::number( y );
1667 list << QString::number( w ); 1667 list << QString::number( w );
1668 list << QString::number( h ); 1668 list << QString::number( h );
1669 config->writeEntry("ViewerLayout",list ); 1669 config->writeEntry("ViewerLayout",list );
1670 wid = mDialogManager->getSearchDialog(); 1670 wid = mDialogManager->getSearchDialog();
1671 if ( wid ) { 1671 if ( wid ) {
1672 x = wid->geometry().x(); 1672 x = wid->geometry().x();
1673 y = wid->geometry().y(); 1673 y = wid->geometry().y();
1674 w = wid->width(); 1674 w = wid->width();
1675 h = wid->height(); 1675 h = wid->height();
1676 list.clear(); 1676 list.clear();
1677 list << QString::number( x ); 1677 list << QString::number( x );
1678 list << QString::number( y ); 1678 list << QString::number( y );
1679 list << QString::number( w ); 1679 list << QString::number( w );
1680 list << QString::number( h ); 1680 list << QString::number( h );
1681 config->writeEntry("SearchLayout",list ); 1681 config->writeEntry("SearchLayout",list );
1682 } 1682 }
1683#endif 1683#endif
1684 1684
1685 1685
1686 config->sync(); 1686 config->sync();
diff --git a/libkcal/icalformatimpl.cpp b/libkcal/icalformatimpl.cpp
index 3437f45..df05ab3 100644
--- a/libkcal/icalformatimpl.cpp
+++ b/libkcal/icalformatimpl.cpp
@@ -1,1812 +1,1804 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21#include <qdatetime.h> 21#include <qdatetime.h>
22#include <qstring.h> 22#include <qstring.h>
23#include <qptrlist.h> 23#include <qptrlist.h>
24#include <qfile.h> 24#include <qfile.h>
25 25
26#include <kdebug.h> 26#include <kdebug.h>
27#include <klocale.h> 27#include <klocale.h>
28#include <kglobal.h> 28#include <kglobal.h>
29 29
30extern "C" { 30extern "C" {
31 #include <ical.h> 31 #include <ical.h>
32 #include <icalss.h> 32 #include <icalss.h>
33 #include <icalparser.h> 33 #include <icalparser.h>
34 #include <icalrestriction.h> 34 #include <icalrestriction.h>
35} 35}
36 36
37#include "calendar.h" 37#include "calendar.h"
38#include "journal.h" 38#include "journal.h"
39#include "icalformat.h" 39#include "icalformat.h"
40#include "icalformatimpl.h" 40#include "icalformatimpl.h"
41#include "compat.h" 41#include "compat.h"
42 42
43#define _ICAL_VERSION "2.0" 43#define _ICAL_VERSION "2.0"
44 44
45using namespace KCal; 45using namespace KCal;
46 46
47const int gSecondsPerMinute = 60; 47const int gSecondsPerMinute = 60;
48const int gSecondsPerHour = gSecondsPerMinute * 60; 48const int gSecondsPerHour = gSecondsPerMinute * 60;
49const int gSecondsPerDay = gSecondsPerHour * 24; 49const int gSecondsPerDay = gSecondsPerHour * 24;
50const int gSecondsPerWeek = gSecondsPerDay * 7; 50const int gSecondsPerWeek = gSecondsPerDay * 7;
51 51
52ICalFormatImpl::ICalFormatImpl( ICalFormat *parent ) : 52ICalFormatImpl::ICalFormatImpl( ICalFormat *parent ) :
53 mParent( parent ), mCalendarVersion( 0 ) 53 mParent( parent ), mCalendarVersion( 0 )
54{ 54{
55 mCompat = new Compat; 55 mCompat = new Compat;
56} 56}
57 57
58ICalFormatImpl::~ICalFormatImpl() 58ICalFormatImpl::~ICalFormatImpl()
59{ 59{
60 delete mCompat; 60 delete mCompat;
61} 61}
62 62
63class ToStringVisitor : public Incidence::Visitor 63class ToStringVisitor : public Incidence::Visitor
64{ 64{
65 public: 65 public:
66 ToStringVisitor( ICalFormatImpl *impl ) : mImpl( impl ), mComponent( 0 ) {} 66 ToStringVisitor( ICalFormatImpl *impl ) : mImpl( impl ), mComponent( 0 ) {}
67 67
68 bool visit( Event *e ) { mComponent = mImpl->writeEvent( e ); return true; } 68 bool visit( Event *e ) { mComponent = mImpl->writeEvent( e ); return true; }
69 bool visit( Todo *e ) { mComponent = mImpl->writeTodo( e ); return true; } 69 bool visit( Todo *e ) { mComponent = mImpl->writeTodo( e ); return true; }
70 bool visit( Journal *e ) { mComponent = mImpl->writeJournal( e ); return true; } 70 bool visit( Journal *e ) { mComponent = mImpl->writeJournal( e ); return true; }
71 71
72 icalcomponent *component() { return mComponent; } 72 icalcomponent *component() { return mComponent; }
73 73
74 private: 74 private:
75 ICalFormatImpl *mImpl; 75 ICalFormatImpl *mImpl;
76 icalcomponent *mComponent; 76 icalcomponent *mComponent;
77}; 77};
78 78
79icalcomponent *ICalFormatImpl::writeIncidence(Incidence *incidence) 79icalcomponent *ICalFormatImpl::writeIncidence(Incidence *incidence)
80{ 80{
81 ToStringVisitor v( this ); 81 ToStringVisitor v( this );
82 incidence->accept(v); 82 incidence->accept(v);
83 return v.component(); 83 return v.component();
84} 84}
85 85
86icalcomponent *ICalFormatImpl::writeTodo(Todo *todo) 86icalcomponent *ICalFormatImpl::writeTodo(Todo *todo)
87{ 87{
88 QString tmpStr; 88 QString tmpStr;
89 QStringList tmpStrList; 89 QStringList tmpStrList;
90 90
91 icalcomponent *vtodo = icalcomponent_new(ICAL_VTODO_COMPONENT); 91 icalcomponent *vtodo = icalcomponent_new(ICAL_VTODO_COMPONENT);
92 92
93 writeIncidence(vtodo,todo); 93 writeIncidence(vtodo,todo);
94 94
95 // due date 95 // due date
96 if (todo->hasDueDate()) { 96 if (todo->hasDueDate()) {
97 icaltimetype due; 97 icaltimetype due;
98 if (todo->doesFloat()) { 98 if (todo->doesFloat()) {
99 due = writeICalDate(todo->dtDue().date()); 99 due = writeICalDate(todo->dtDue().date());
100 } else { 100 } else {
101 due = writeICalDateTime(todo->dtDue()); 101 due = writeICalDateTime(todo->dtDue());
102 } 102 }
103 icalcomponent_add_property(vtodo,icalproperty_new_due(due)); 103 icalcomponent_add_property(vtodo,icalproperty_new_due(due));
104 } 104 }
105 105
106 // start time 106 // start time
107 if (todo->hasStartDate()) { 107 if (todo->hasStartDate()) {
108 icaltimetype start; 108 icaltimetype start;
109 if (todo->doesFloat()) { 109 if (todo->doesFloat()) {
110// kdDebug(5800) << "§§ Incidence " << todo->summary() << " floats." << endl; 110// kdDebug(5800) << "§§ Incidence " << todo->summary() << " floats." << endl;
111 start = writeICalDate(todo->dtStart().date()); 111 start = writeICalDate(todo->dtStart().date());
112 } else { 112 } else {
113// kdDebug(5800) << "§§ incidence " << todo->summary() << " has time." << endl; 113// kdDebug(5800) << "§§ incidence " << todo->summary() << " has time." << endl;
114 start = writeICalDateTime(todo->dtStart()); 114 start = writeICalDateTime(todo->dtStart());
115 } 115 }
116 icalcomponent_add_property(vtodo,icalproperty_new_dtstart(start)); 116 icalcomponent_add_property(vtodo,icalproperty_new_dtstart(start));
117 } 117 }
118 118
119 // completion date 119 // completion date
120 if (todo->isCompleted()) { 120 if (todo->isCompleted()) {
121 if (!todo->hasCompletedDate()) { 121 if (!todo->hasCompletedDate()) {
122 // If todo was created by KOrganizer <2.2 it has no correct completion 122 // If todo was created by KOrganizer <2.2 it has no correct completion
123 // date. Set it to now. 123 // date. Set it to now.
124 todo->setCompleted(QDateTime::currentDateTime()); 124 todo->setCompleted(QDateTime::currentDateTime());
125 } 125 }
126 icaltimetype completed = writeICalDateTime(todo->completed()); 126 icaltimetype completed = writeICalDateTime(todo->completed());
127 icalcomponent_add_property(vtodo,icalproperty_new_completed(completed)); 127 icalcomponent_add_property(vtodo,icalproperty_new_completed(completed));
128 } 128 }
129 129
130 icalcomponent_add_property(vtodo, 130 icalcomponent_add_property(vtodo,
131 icalproperty_new_percentcomplete(todo->percentComplete())); 131 icalproperty_new_percentcomplete(todo->percentComplete()));
132 132
133 return vtodo; 133 return vtodo;
134} 134}
135 135
136icalcomponent *ICalFormatImpl::writeEvent(Event *event) 136icalcomponent *ICalFormatImpl::writeEvent(Event *event)
137{ 137{
138 kdDebug(5800) << "Write Event '" << event->summary() << "' (" << event->uid() 138 kdDebug(5800) << "Write Event '" << event->summary() << "' (" << event->uid()
139 << ")" << endl; 139 << ")" << endl;
140 140
141 QString tmpStr; 141 QString tmpStr;
142 QStringList tmpStrList; 142 QStringList tmpStrList;
143 143
144 icalcomponent *vevent = icalcomponent_new(ICAL_VEVENT_COMPONENT); 144 icalcomponent *vevent = icalcomponent_new(ICAL_VEVENT_COMPONENT);
145 145
146 writeIncidence(vevent,event); 146 writeIncidence(vevent,event);
147 147
148 // start time 148 // start time
149 icaltimetype start; 149 icaltimetype start;
150 if (event->doesFloat()) { 150 if (event->doesFloat()) {
151// kdDebug(5800) << "§§ Incidence " << event->summary() << " floats." << endl; 151// kdDebug(5800) << "§§ Incidence " << event->summary() << " floats." << endl;
152 start = writeICalDate(event->dtStart().date()); 152 start = writeICalDate(event->dtStart().date());
153 } else { 153 } else {
154// kdDebug(5800) << "§§ incidence " << event->summary() << " has time." << endl; 154// kdDebug(5800) << "§§ incidence " << event->summary() << " has time." << endl;
155 start = writeICalDateTime(event->dtStart()); 155 start = writeICalDateTime(event->dtStart());
156 } 156 }
157 icalcomponent_add_property(vevent,icalproperty_new_dtstart(start)); 157 icalcomponent_add_property(vevent,icalproperty_new_dtstart(start));
158 158
159 if (event->hasEndDate()) { 159 if (event->hasEndDate()) {
160 // end time 160 // end time
161 icaltimetype end; 161 icaltimetype end;
162 if (event->doesFloat()) { 162 if (event->doesFloat()) {
163// kdDebug(5800) << "§§ Event " << event->summary() << " floats." << endl; 163// kdDebug(5800) << "§§ Event " << event->summary() << " floats." << endl;
164 // +1 day because end date is non-inclusive. 164 // +1 day because end date is non-inclusive.
165 end = writeICalDate( event->dtEnd().date().addDays( 1 ) ); 165 end = writeICalDate( event->dtEnd().date().addDays( 1 ) );
166 } else { 166 } else {
167// kdDebug(5800) << "§§ Event " << event->summary() << " has time." << endl; 167// kdDebug(5800) << "§§ Event " << event->summary() << " has time." << endl;
168 end = writeICalDateTime(event->dtEnd()); 168 end = writeICalDateTime(event->dtEnd());
169 } 169 }
170 icalcomponent_add_property(vevent,icalproperty_new_dtend(end)); 170 icalcomponent_add_property(vevent,icalproperty_new_dtend(end));
171 } 171 }
172 172
173// TODO: attachments, resources 173// TODO: attachments, resources
174#if 0 174#if 0
175 // attachments 175 // attachments
176 tmpStrList = anEvent->attachments(); 176 tmpStrList = anEvent->attachments();
177 for ( QStringList::Iterator it = tmpStrList.begin(); 177 for ( QStringList::Iterator it = tmpStrList.begin();
178 it != tmpStrList.end(); 178 it != tmpStrList.end();
179 ++it ) 179 ++it )
180 addPropValue(vevent, VCAttachProp, (*it).utf8()); 180 addPropValue(vevent, VCAttachProp, (*it).utf8());
181 181
182 // resources 182 // resources
183 tmpStrList = anEvent->resources(); 183 tmpStrList = anEvent->resources();
184 tmpStr = tmpStrList.join(";"); 184 tmpStr = tmpStrList.join(";");
185 if (!tmpStr.isEmpty()) 185 if (!tmpStr.isEmpty())
186 addPropValue(vevent, VCResourcesProp, tmpStr.utf8()); 186 addPropValue(vevent, VCResourcesProp, tmpStr.utf8());
187 187
188#endif 188#endif
189 189
190 // Transparency 190 // Transparency
191 switch( event->transparency() ) { 191 switch( event->transparency() ) {
192 case Event::Transparent: 192 case Event::Transparent:
193 icalcomponent_add_property(vevent, icalproperty_new_transp(ICAL_TRANSP_TRANSPARENT)); 193 icalcomponent_add_property(vevent, icalproperty_new_transp(ICAL_TRANSP_TRANSPARENT));
194 break; 194 break;
195 case Event::Opaque: 195 case Event::Opaque:
196 icalcomponent_add_property(vevent, icalproperty_new_transp(ICAL_TRANSP_OPAQUE)); 196 icalcomponent_add_property(vevent, icalproperty_new_transp(ICAL_TRANSP_OPAQUE));
197 break; 197 break;
198 } 198 }
199 199
200 return vevent; 200 return vevent;
201} 201}
202 202
203icalcomponent *ICalFormatImpl::writeFreeBusy(FreeBusy *freebusy, 203icalcomponent *ICalFormatImpl::writeFreeBusy(FreeBusy *freebusy,
204 Scheduler::Method method) 204 Scheduler::Method method)
205{ 205{
206#if QT_VERSION >= 300 206#if QT_VERSION >= 300
207 kdDebug(5800) << "icalformatimpl: writeFreeBusy: startDate: " 207 kdDebug(5800) << "icalformatimpl: writeFreeBusy: startDate: "
208 << freebusy->dtStart().toString("ddd MMMM d yyyy: h:m:s ap") << " End Date: " 208 << freebusy->dtStart().toString("ddd MMMM d yyyy: h:m:s ap") << " End Date: "
209 << freebusy->dtEnd().toString("ddd MMMM d yyyy: h:m:s ap") << endl; 209 << freebusy->dtEnd().toString("ddd MMMM d yyyy: h:m:s ap") << endl;
210#endif 210#endif
211 211
212 icalcomponent *vfreebusy = icalcomponent_new(ICAL_VFREEBUSY_COMPONENT); 212 icalcomponent *vfreebusy = icalcomponent_new(ICAL_VFREEBUSY_COMPONENT);
213 213
214 writeIncidenceBase(vfreebusy,freebusy); 214 writeIncidenceBase(vfreebusy,freebusy);
215 215
216 icalcomponent_add_property(vfreebusy, icalproperty_new_dtstart( 216 icalcomponent_add_property(vfreebusy, icalproperty_new_dtstart(
217 writeICalDateTime(freebusy->dtStart()))); 217 writeICalDateTime(freebusy->dtStart())));
218 218
219 icalcomponent_add_property(vfreebusy, icalproperty_new_dtend( 219 icalcomponent_add_property(vfreebusy, icalproperty_new_dtend(
220 writeICalDateTime(freebusy->dtEnd()))); 220 writeICalDateTime(freebusy->dtEnd())));
221 221
222 if (method == Scheduler::Request) { 222 if (method == Scheduler::Request) {
223 icalcomponent_add_property(vfreebusy,icalproperty_new_uid( 223 icalcomponent_add_property(vfreebusy,icalproperty_new_uid(
224 freebusy->uid().utf8())); 224 freebusy->uid().utf8()));
225 } 225 }
226 226
227 //Loops through all the periods in the freebusy object 227 //Loops through all the periods in the freebusy object
228 QValueList<Period> list = freebusy->busyPeriods(); 228 QValueList<Period> list = freebusy->busyPeriods();
229 QValueList<Period>::Iterator it; 229 QValueList<Period>::Iterator it;
230 icalperiodtype period; 230 icalperiodtype period;
231 for (it = list.begin(); it!= list.end(); ++it) { 231 for (it = list.begin(); it!= list.end(); ++it) {
232 period.start = writeICalDateTime((*it).start()); 232 period.start = writeICalDateTime((*it).start());
233 period.end = writeICalDateTime((*it).end()); 233 period.end = writeICalDateTime((*it).end());
234 icalcomponent_add_property(vfreebusy, icalproperty_new_freebusy(period) ); 234 icalcomponent_add_property(vfreebusy, icalproperty_new_freebusy(period) );
235 } 235 }
236 236
237 return vfreebusy; 237 return vfreebusy;
238} 238}
239 239
240icalcomponent *ICalFormatImpl::writeJournal(Journal *journal) 240icalcomponent *ICalFormatImpl::writeJournal(Journal *journal)
241{ 241{
242 icalcomponent *vjournal = icalcomponent_new(ICAL_VJOURNAL_COMPONENT); 242 icalcomponent *vjournal = icalcomponent_new(ICAL_VJOURNAL_COMPONENT);
243 243
244 writeIncidence(vjournal,journal); 244 writeIncidence(vjournal,journal);
245 245
246 // start time 246 // start time
247 if (journal->dtStart().isValid()) { 247 if (journal->dtStart().isValid()) {
248 icaltimetype start; 248 icaltimetype start;
249 if (journal->doesFloat()) { 249 if (journal->doesFloat()) {
250// kdDebug(5800) << "§§ Incidence " << event->summary() << " floats." << endl; 250// kdDebug(5800) << "§§ Incidence " << event->summary() << " floats." << endl;
251 start = writeICalDate(journal->dtStart().date()); 251 start = writeICalDate(journal->dtStart().date());
252 } else { 252 } else {
253// kdDebug(5800) << "§§ incidence " << event->summary() << " has time." << endl; 253// kdDebug(5800) << "§§ incidence " << event->summary() << " has time." << endl;
254 start = writeICalDateTime(journal->dtStart()); 254 start = writeICalDateTime(journal->dtStart());
255 } 255 }
256 icalcomponent_add_property(vjournal,icalproperty_new_dtstart(start)); 256 icalcomponent_add_property(vjournal,icalproperty_new_dtstart(start));
257 } 257 }
258 258
259 return vjournal; 259 return vjournal;
260} 260}
261 261
262void ICalFormatImpl::writeIncidence(icalcomponent *parent,Incidence *incidence) 262void ICalFormatImpl::writeIncidence(icalcomponent *parent,Incidence *incidence)
263{ 263{
264 // pilot sync stuff 264 // pilot sync stuff
265// TODO: move this application-specific code to kpilot 265// TODO: move this application-specific code to kpilot
266 if (incidence->pilotId()) { 266 if (incidence->pilotId()) {
267 incidence->setNonKDECustomProperty("X-PILOTID", QString::number(incidence->pilotId())); 267 incidence->setNonKDECustomProperty("X-PILOTID", QString::number(incidence->pilotId()));
268 incidence->setNonKDECustomProperty("X-PILOTSTAT", QString::number(incidence->syncStatus())); 268 incidence->setNonKDECustomProperty("X-PILOTSTAT", QString::number(incidence->syncStatus()));
269 } 269 }
270 if (incidence->zaurusId() >= 0) { 270 if (incidence->zaurusId() >= 0) {
271 incidence->setNonKDECustomProperty("X-ZAURUSID", QString::number(incidence->zaurusId())); 271 incidence->setNonKDECustomProperty("X-ZAURUSID", QString::number(incidence->zaurusId()));
272 } 272 }
273 273
274 if (incidence->zaurusUid() > 0) { 274 if (incidence->zaurusUid() > 0) {
275 incidence->setNonKDECustomProperty("X-ZAURUSUID", QString::number(incidence->zaurusUid())); 275 incidence->setNonKDECustomProperty("X-ZAURUSUID", QString::number(incidence->zaurusUid()));
276 } 276 }
277 if (incidence->zaurusStat() > 0) {
278 incidence->setNonKDECustomProperty("X-ZAURUSSTAT", QString::number(incidence->zaurusStat()));
279 }
280 277
281 writeIncidenceBase(parent,incidence); 278 writeIncidenceBase(parent,incidence);
282 if (incidence->cancelled()) { 279 if (incidence->cancelled()) {
283 icalcomponent_add_property(parent,icalproperty_new_status(ICAL_STATUS_CANCELLED)); 280 icalcomponent_add_property(parent,icalproperty_new_status(ICAL_STATUS_CANCELLED));
284 } 281 }
285 282
286 // creation date 283 // creation date
287 icalcomponent_add_property(parent,icalproperty_new_created( 284 icalcomponent_add_property(parent,icalproperty_new_created(
288 writeICalDateTime(incidence->created()))); 285 writeICalDateTime(incidence->created())));
289 286
290 // unique id 287 // unique id
291 icalcomponent_add_property(parent,icalproperty_new_uid( 288 icalcomponent_add_property(parent,icalproperty_new_uid(
292 incidence->uid().utf8())); 289 incidence->uid().utf8()));
293 290
294 // revision 291 // revision
295 icalcomponent_add_property(parent,icalproperty_new_sequence( 292 icalcomponent_add_property(parent,icalproperty_new_sequence(
296 incidence->revision())); 293 incidence->revision()));
297 294
298 // last modification date 295 // last modification date
299 icalcomponent_add_property(parent,icalproperty_new_lastmodified( 296 icalcomponent_add_property(parent,icalproperty_new_lastmodified(
300 writeICalDateTime(incidence->lastModified()))); 297 writeICalDateTime(incidence->lastModified())));
301 298
302 // description 299 // description
303 if (!incidence->description().isEmpty()) { 300 if (!incidence->description().isEmpty()) {
304 icalcomponent_add_property(parent,icalproperty_new_description( 301 icalcomponent_add_property(parent,icalproperty_new_description(
305 incidence->description().utf8())); 302 incidence->description().utf8()));
306 } 303 }
307 304
308 // summary 305 // summary
309 if (!incidence->summary().isEmpty()) { 306 if (!incidence->summary().isEmpty()) {
310 icalcomponent_add_property(parent,icalproperty_new_summary( 307 icalcomponent_add_property(parent,icalproperty_new_summary(
311 incidence->summary().utf8())); 308 incidence->summary().utf8()));
312 } 309 }
313 310
314 // location 311 // location
315 if (!incidence->location().isEmpty()) { 312 if (!incidence->location().isEmpty()) {
316 icalcomponent_add_property(parent,icalproperty_new_location( 313 icalcomponent_add_property(parent,icalproperty_new_location(
317 incidence->location().utf8())); 314 incidence->location().utf8()));
318 } 315 }
319 316
320// TODO: 317// TODO:
321 // status 318 // status
322// addPropValue(parent, VCStatusProp, incidence->getStatusStr().utf8()); 319// addPropValue(parent, VCStatusProp, incidence->getStatusStr().utf8());
323 320
324 // secrecy 321 // secrecy
325 enum icalproperty_class classInt; 322 enum icalproperty_class classInt;
326 switch (incidence->secrecy()) { 323 switch (incidence->secrecy()) {
327 case Incidence::SecrecyPublic: 324 case Incidence::SecrecyPublic:
328 classInt = ICAL_CLASS_PUBLIC; 325 classInt = ICAL_CLASS_PUBLIC;
329 break; 326 break;
330 case Incidence::SecrecyConfidential: 327 case Incidence::SecrecyConfidential:
331 classInt = ICAL_CLASS_CONFIDENTIAL; 328 classInt = ICAL_CLASS_CONFIDENTIAL;
332 break; 329 break;
333 case Incidence::SecrecyPrivate: 330 case Incidence::SecrecyPrivate:
334 classInt =ICAL_CLASS_PRIVATE ; 331 classInt =ICAL_CLASS_PRIVATE ;
335 default: 332 default:
336 classInt =ICAL_CLASS_PRIVATE ; 333 classInt =ICAL_CLASS_PRIVATE ;
337 break; 334 break;
338 } 335 }
339 icalcomponent_add_property(parent,icalproperty_new_class(classInt)); 336 icalcomponent_add_property(parent,icalproperty_new_class(classInt));
340 337
341 // priority 338 // priority
342 icalcomponent_add_property(parent,icalproperty_new_priority( 339 icalcomponent_add_property(parent,icalproperty_new_priority(
343 incidence->priority())); 340 incidence->priority()));
344 341
345 // categories 342 // categories
346 QStringList categories = incidence->categories(); 343 QStringList categories = incidence->categories();
347 QStringList::Iterator it; 344 QStringList::Iterator it;
348 for(it = categories.begin(); it != categories.end(); ++it ) { 345 for(it = categories.begin(); it != categories.end(); ++it ) {
349 icalcomponent_add_property(parent,icalproperty_new_categories((*it).utf8())); 346 icalcomponent_add_property(parent,icalproperty_new_categories((*it).utf8()));
350 } 347 }
351// TODO: Ensure correct concatenation of categories properties. 348// TODO: Ensure correct concatenation of categories properties.
352 349
353/* 350/*
354 // categories 351 // categories
355 tmpStrList = incidence->getCategories(); 352 tmpStrList = incidence->getCategories();
356 tmpStr = ""; 353 tmpStr = "";
357 QString catStr; 354 QString catStr;
358 for ( QStringList::Iterator it = tmpStrList.begin(); 355 for ( QStringList::Iterator it = tmpStrList.begin();
359 it != tmpStrList.end(); 356 it != tmpStrList.end();
360 ++it ) { 357 ++it ) {
361 catStr = *it; 358 catStr = *it;
362 if (catStr[0] == ' ') 359 if (catStr[0] == ' ')
363 tmpStr += catStr.mid(1); 360 tmpStr += catStr.mid(1);
364 else 361 else
365 tmpStr += catStr; 362 tmpStr += catStr;
366 // this must be a ';' character as the vCalendar specification requires! 363 // this must be a ';' character as the vCalendar specification requires!
367 // vcc.y has been hacked to translate the ';' to a ',' when the vcal is 364 // vcc.y has been hacked to translate the ';' to a ',' when the vcal is
368 // read in. 365 // read in.
369 tmpStr += ";"; 366 tmpStr += ";";
370 } 367 }
371 if (!tmpStr.isEmpty()) { 368 if (!tmpStr.isEmpty()) {
372 tmpStr.truncate(tmpStr.length()-1); 369 tmpStr.truncate(tmpStr.length()-1);
373 icalcomponent_add_property(parent,icalproperty_new_categories( 370 icalcomponent_add_property(parent,icalproperty_new_categories(
374 writeText(incidence->getCategories().join(";")))); 371 writeText(incidence->getCategories().join(";"))));
375 } 372 }
376*/ 373*/
377 374
378 // related event 375 // related event
379 if (incidence->relatedTo()) { 376 if (incidence->relatedTo()) {
380 icalcomponent_add_property(parent,icalproperty_new_relatedto( 377 icalcomponent_add_property(parent,icalproperty_new_relatedto(
381 incidence->relatedTo()->uid().utf8())); 378 incidence->relatedTo()->uid().utf8()));
382 } 379 }
383 380
384 // recurrence rule stuff 381 // recurrence rule stuff
385 Recurrence *recur = incidence->recurrence(); 382 Recurrence *recur = incidence->recurrence();
386 if (recur->doesRecur()) { 383 if (recur->doesRecur()) {
387 384
388 icalcomponent_add_property(parent,writeRecurrenceRule(recur)); 385 icalcomponent_add_property(parent,writeRecurrenceRule(recur));
389 } 386 }
390 387
391 // recurrence excpetion dates 388 // recurrence excpetion dates
392 DateList dateList = incidence->exDates(); 389 DateList dateList = incidence->exDates();
393 DateList::ConstIterator exIt; 390 DateList::ConstIterator exIt;
394 for(exIt = dateList.begin(); exIt != dateList.end(); ++exIt) { 391 for(exIt = dateList.begin(); exIt != dateList.end(); ++exIt) {
395 icalcomponent_add_property(parent,icalproperty_new_exdate( 392 icalcomponent_add_property(parent,icalproperty_new_exdate(
396 writeICalDate(*exIt))); 393 writeICalDate(*exIt)));
397 } 394 }
398 395
399 // attachments 396 // attachments
400 QPtrList<Attachment> attachments = incidence->attachments(); 397 QPtrList<Attachment> attachments = incidence->attachments();
401 for (Attachment *at = attachments.first(); at; at = attachments.next()) 398 for (Attachment *at = attachments.first(); at; at = attachments.next())
402 icalcomponent_add_property(parent,writeAttachment(at)); 399 icalcomponent_add_property(parent,writeAttachment(at));
403 400
404 // alarms 401 // alarms
405 QPtrList<Alarm> alarms = incidence->alarms(); 402 QPtrList<Alarm> alarms = incidence->alarms();
406 Alarm* alarm; 403 Alarm* alarm;
407 for (alarm = alarms.first(); alarm; alarm = alarms.next()) { 404 for (alarm = alarms.first(); alarm; alarm = alarms.next()) {
408 if (alarm->enabled()) { 405 if (alarm->enabled()) {
409 kdDebug(5800) << "Write alarm for " << incidence->summary() << endl; 406 kdDebug(5800) << "Write alarm for " << incidence->summary() << endl;
410 icalcomponent_add_component(parent,writeAlarm(alarm)); 407 icalcomponent_add_component(parent,writeAlarm(alarm));
411 } 408 }
412 } 409 }
413 410
414 // duration 411 // duration
415 412
416// turned off as it always is set to PTS0 (and must not occur together with DTEND 413// turned off as it always is set to PTS0 (and must not occur together with DTEND
417 414
418// if (incidence->hasDuration()) { 415// if (incidence->hasDuration()) {
419// icaldurationtype duration; 416// icaldurationtype duration;
420// duration = writeICalDuration(incidence->duration()); 417// duration = writeICalDuration(incidence->duration());
421// icalcomponent_add_property(parent,icalproperty_new_duration(duration)); 418// icalcomponent_add_property(parent,icalproperty_new_duration(duration));
422// } 419// }
423} 420}
424 421
425void ICalFormatImpl::writeIncidenceBase(icalcomponent *parent,IncidenceBase *incidenceBase) 422void ICalFormatImpl::writeIncidenceBase(icalcomponent *parent,IncidenceBase *incidenceBase)
426{ 423{
427 icalcomponent_add_property(parent,icalproperty_new_dtstamp( 424 icalcomponent_add_property(parent,icalproperty_new_dtstamp(
428 writeICalDateTime(QDateTime::currentDateTime()))); 425 writeICalDateTime(QDateTime::currentDateTime())));
429 426
430 // organizer stuff 427 // organizer stuff
431 icalcomponent_add_property(parent,icalproperty_new_organizer( 428 icalcomponent_add_property(parent,icalproperty_new_organizer(
432 ("MAILTO:" + incidenceBase->organizer()).utf8())); 429 ("MAILTO:" + incidenceBase->organizer()).utf8()));
433 430
434 // attendees 431 // attendees
435 if (incidenceBase->attendeeCount() != 0) { 432 if (incidenceBase->attendeeCount() != 0) {
436 QPtrList<Attendee> al = incidenceBase->attendees(); 433 QPtrList<Attendee> al = incidenceBase->attendees();
437 QPtrListIterator<Attendee> ai(al); 434 QPtrListIterator<Attendee> ai(al);
438 for (; ai.current(); ++ai) { 435 for (; ai.current(); ++ai) {
439 icalcomponent_add_property(parent,writeAttendee(ai.current())); 436 icalcomponent_add_property(parent,writeAttendee(ai.current()));
440 } 437 }
441 } 438 }
442 439
443 // custom properties 440 // custom properties
444 writeCustomProperties(parent, incidenceBase); 441 writeCustomProperties(parent, incidenceBase);
445} 442}
446 443
447void ICalFormatImpl::writeCustomProperties(icalcomponent *parent,CustomProperties *properties) 444void ICalFormatImpl::writeCustomProperties(icalcomponent *parent,CustomProperties *properties)
448{ 445{
449 QMap<QCString, QString> custom = properties->customProperties(); 446 QMap<QCString, QString> custom = properties->customProperties();
450 for (QMap<QCString, QString>::Iterator c = custom.begin(); c != custom.end(); ++c) { 447 for (QMap<QCString, QString>::Iterator c = custom.begin(); c != custom.end(); ++c) {
451 icalproperty *p = icalproperty_new_x(c.data().utf8()); 448 icalproperty *p = icalproperty_new_x(c.data().utf8());
452 icalproperty_set_x_name(p,c.key()); 449 icalproperty_set_x_name(p,c.key());
453 icalcomponent_add_property(parent,p); 450 icalcomponent_add_property(parent,p);
454 } 451 }
455} 452}
456 453
457icalproperty *ICalFormatImpl::writeAttendee(Attendee *attendee) 454icalproperty *ICalFormatImpl::writeAttendee(Attendee *attendee)
458{ 455{
459 icalproperty *p = icalproperty_new_attendee("mailto:" + attendee->email().utf8()); 456 icalproperty *p = icalproperty_new_attendee("mailto:" + attendee->email().utf8());
460 457
461 if (!attendee->name().isEmpty()) { 458 if (!attendee->name().isEmpty()) {
462 icalproperty_add_parameter(p,icalparameter_new_cn(attendee->name().utf8())); 459 icalproperty_add_parameter(p,icalparameter_new_cn(attendee->name().utf8()));
463 } 460 }
464 461
465 462
466 icalproperty_add_parameter(p,icalparameter_new_rsvp( 463 icalproperty_add_parameter(p,icalparameter_new_rsvp(
467 attendee->RSVP() ? ICAL_RSVP_TRUE : ICAL_RSVP_FALSE )); 464 attendee->RSVP() ? ICAL_RSVP_TRUE : ICAL_RSVP_FALSE ));
468 465
469 icalparameter_partstat status = ICAL_PARTSTAT_NEEDSACTION; 466 icalparameter_partstat status = ICAL_PARTSTAT_NEEDSACTION;
470 switch (attendee->status()) { 467 switch (attendee->status()) {
471 default: 468 default:
472 case Attendee::NeedsAction: 469 case Attendee::NeedsAction:
473 status = ICAL_PARTSTAT_NEEDSACTION; 470 status = ICAL_PARTSTAT_NEEDSACTION;
474 break; 471 break;
475 case Attendee::Accepted: 472 case Attendee::Accepted:
476 status = ICAL_PARTSTAT_ACCEPTED; 473 status = ICAL_PARTSTAT_ACCEPTED;
477 break; 474 break;
478 case Attendee::Declined: 475 case Attendee::Declined:
479 status = ICAL_PARTSTAT_DECLINED; 476 status = ICAL_PARTSTAT_DECLINED;
480 break; 477 break;
481 case Attendee::Tentative: 478 case Attendee::Tentative:
482 status = ICAL_PARTSTAT_TENTATIVE; 479 status = ICAL_PARTSTAT_TENTATIVE;
483 break; 480 break;
484 case Attendee::Delegated: 481 case Attendee::Delegated:
485 status = ICAL_PARTSTAT_DELEGATED; 482 status = ICAL_PARTSTAT_DELEGATED;
486 break; 483 break;
487 case Attendee::Completed: 484 case Attendee::Completed:
488 status = ICAL_PARTSTAT_COMPLETED; 485 status = ICAL_PARTSTAT_COMPLETED;
489 break; 486 break;
490 case Attendee::InProcess: 487 case Attendee::InProcess:
491 status = ICAL_PARTSTAT_INPROCESS; 488 status = ICAL_PARTSTAT_INPROCESS;
492 break; 489 break;
493 } 490 }
494 icalproperty_add_parameter(p,icalparameter_new_partstat(status)); 491 icalproperty_add_parameter(p,icalparameter_new_partstat(status));
495 492
496 icalparameter_role role = ICAL_ROLE_REQPARTICIPANT; 493 icalparameter_role role = ICAL_ROLE_REQPARTICIPANT;
497 switch (attendee->role()) { 494 switch (attendee->role()) {
498 case Attendee::Chair: 495 case Attendee::Chair:
499 role = ICAL_ROLE_CHAIR; 496 role = ICAL_ROLE_CHAIR;
500 break; 497 break;
501 default: 498 default:
502 case Attendee::ReqParticipant: 499 case Attendee::ReqParticipant:
503 role = ICAL_ROLE_REQPARTICIPANT; 500 role = ICAL_ROLE_REQPARTICIPANT;
504 break; 501 break;
505 case Attendee::OptParticipant: 502 case Attendee::OptParticipant:
506 role = ICAL_ROLE_OPTPARTICIPANT; 503 role = ICAL_ROLE_OPTPARTICIPANT;
507 break; 504 break;
508 case Attendee::NonParticipant: 505 case Attendee::NonParticipant:
509 role = ICAL_ROLE_NONPARTICIPANT; 506 role = ICAL_ROLE_NONPARTICIPANT;
510 break; 507 break;
511 } 508 }
512 icalproperty_add_parameter(p,icalparameter_new_role(role)); 509 icalproperty_add_parameter(p,icalparameter_new_role(role));
513 510
514 if (!attendee->uid().isEmpty()) { 511 if (!attendee->uid().isEmpty()) {
515 icalparameter* icalparameter_uid = icalparameter_new_x(attendee->uid().utf8()); 512 icalparameter* icalparameter_uid = icalparameter_new_x(attendee->uid().utf8());
516 icalparameter_set_xname(icalparameter_uid,"X-UID"); 513 icalparameter_set_xname(icalparameter_uid,"X-UID");
517 icalproperty_add_parameter(p,icalparameter_uid); 514 icalproperty_add_parameter(p,icalparameter_uid);
518 } 515 }
519 516
520 return p; 517 return p;
521} 518}
522 519
523icalproperty *ICalFormatImpl::writeAttachment(Attachment *att) 520icalproperty *ICalFormatImpl::writeAttachment(Attachment *att)
524{ 521{
525#if 0 522#if 0
526 icalattachtype* attach = icalattachtype_new(); 523 icalattachtype* attach = icalattachtype_new();
527 if (att->isURI()) 524 if (att->isURI())
528 icalattachtype_set_url(attach, att->uri().utf8().data()); 525 icalattachtype_set_url(attach, att->uri().utf8().data());
529 else 526 else
530 icalattachtype_set_base64(attach, att->data(), 0); 527 icalattachtype_set_base64(attach, att->data(), 0);
531#endif 528#endif
532 icalattach *attach; 529 icalattach *attach;
533 if (att->isURI()) 530 if (att->isURI())
534 attach = icalattach_new_from_url( att->uri().utf8().data()); 531 attach = icalattach_new_from_url( att->uri().utf8().data());
535 else 532 else
536 attach = icalattach_new_from_data ( (unsigned char *)att->data(), 0, 0); 533 attach = icalattach_new_from_data ( (unsigned char *)att->data(), 0, 0);
537 icalproperty *p = icalproperty_new_attach(attach); 534 icalproperty *p = icalproperty_new_attach(attach);
538 if (!att->mimeType().isEmpty()) 535 if (!att->mimeType().isEmpty())
539 icalproperty_add_parameter(p,icalparameter_new_fmttype(att->mimeType().utf8().data())); 536 icalproperty_add_parameter(p,icalparameter_new_fmttype(att->mimeType().utf8().data()));
540 537
541 if (att->isBinary()) { 538 if (att->isBinary()) {
542 icalproperty_add_parameter(p,icalparameter_new_value(ICAL_VALUE_BINARY)); 539 icalproperty_add_parameter(p,icalparameter_new_value(ICAL_VALUE_BINARY));
543 icalproperty_add_parameter(p,icalparameter_new_encoding(ICAL_ENCODING_BASE64)); 540 icalproperty_add_parameter(p,icalparameter_new_encoding(ICAL_ENCODING_BASE64));
544 } 541 }
545 return p; 542 return p;
546} 543}
547 544
548icalproperty *ICalFormatImpl::writeRecurrenceRule(Recurrence *recur) 545icalproperty *ICalFormatImpl::writeRecurrenceRule(Recurrence *recur)
549{ 546{
550// kdDebug(5800) << "ICalFormatImpl::writeRecurrenceRule()" << endl; 547// kdDebug(5800) << "ICalFormatImpl::writeRecurrenceRule()" << endl;
551 548
552 icalrecurrencetype r; 549 icalrecurrencetype r;
553 550
554 icalrecurrencetype_clear(&r); 551 icalrecurrencetype_clear(&r);
555 552
556 int index = 0; 553 int index = 0;
557 int index2 = 0; 554 int index2 = 0;
558 555
559 QPtrList<Recurrence::rMonthPos> tmpPositions; 556 QPtrList<Recurrence::rMonthPos> tmpPositions;
560 QPtrList<int> tmpDays; 557 QPtrList<int> tmpDays;
561 int *tmpDay; 558 int *tmpDay;
562 Recurrence::rMonthPos *tmpPos; 559 Recurrence::rMonthPos *tmpPos;
563 bool datetime = false; 560 bool datetime = false;
564 int day; 561 int day;
565 int i; 562 int i;
566 563
567 switch(recur->doesRecur()) { 564 switch(recur->doesRecur()) {
568 case Recurrence::rMinutely: 565 case Recurrence::rMinutely:
569 r.freq = ICAL_MINUTELY_RECURRENCE; 566 r.freq = ICAL_MINUTELY_RECURRENCE;
570 datetime = true; 567 datetime = true;
571 break; 568 break;
572 case Recurrence::rHourly: 569 case Recurrence::rHourly:
573 r.freq = ICAL_HOURLY_RECURRENCE; 570 r.freq = ICAL_HOURLY_RECURRENCE;
574 datetime = true; 571 datetime = true;
575 break; 572 break;
576 case Recurrence::rDaily: 573 case Recurrence::rDaily:
577 r.freq = ICAL_DAILY_RECURRENCE; 574 r.freq = ICAL_DAILY_RECURRENCE;
578 break; 575 break;
579 case Recurrence::rWeekly: 576 case Recurrence::rWeekly:
580 r.freq = ICAL_WEEKLY_RECURRENCE; 577 r.freq = ICAL_WEEKLY_RECURRENCE;
581 r.week_start = static_cast<icalrecurrencetype_weekday>(recur->weekStart()%7 + 1); 578 r.week_start = static_cast<icalrecurrencetype_weekday>(recur->weekStart()%7 + 1);
582 for (i = 0; i < 7; i++) { 579 for (i = 0; i < 7; i++) {
583 if (recur->days().testBit(i)) { 580 if (recur->days().testBit(i)) {
584 day = (i + 1)%7 + 1; // convert from Monday=0 to Sunday=1 581 day = (i + 1)%7 + 1; // convert from Monday=0 to Sunday=1
585 r.by_day[index++] = icalrecurrencetype_day_day_of_week(day); 582 r.by_day[index++] = icalrecurrencetype_day_day_of_week(day);
586 } 583 }
587 } 584 }
588// r.by_day[index] = ICAL_RECURRENCE_ARRAY_MAX; 585// r.by_day[index] = ICAL_RECURRENCE_ARRAY_MAX;
589 break; 586 break;
590 case Recurrence::rMonthlyPos: 587 case Recurrence::rMonthlyPos:
591 r.freq = ICAL_MONTHLY_RECURRENCE; 588 r.freq = ICAL_MONTHLY_RECURRENCE;
592 589
593 tmpPositions = recur->monthPositions(); 590 tmpPositions = recur->monthPositions();
594 for (tmpPos = tmpPositions.first(); 591 for (tmpPos = tmpPositions.first();
595 tmpPos; 592 tmpPos;
596 tmpPos = tmpPositions.next()) { 593 tmpPos = tmpPositions.next()) {
597 for (i = 0; i < 7; i++) { 594 for (i = 0; i < 7; i++) {
598 if (tmpPos->rDays.testBit(i)) { 595 if (tmpPos->rDays.testBit(i)) {
599 day = (i + 1)%7 + 1; // convert from Monday=0 to Sunday=1 596 day = (i + 1)%7 + 1; // convert from Monday=0 to Sunday=1
600 day += tmpPos->rPos*8; 597 day += tmpPos->rPos*8;
601 if (tmpPos->negative) day = -day; 598 if (tmpPos->negative) day = -day;
602 r.by_day[index++] = day; 599 r.by_day[index++] = day;
603 } 600 }
604 } 601 }
605 } 602 }
606// r.by_day[index] = ICAL_RECURRENCE_ARRAY_MAX; 603// r.by_day[index] = ICAL_RECURRENCE_ARRAY_MAX;
607 break; 604 break;
608 case Recurrence::rMonthlyDay: 605 case Recurrence::rMonthlyDay:
609 r.freq = ICAL_MONTHLY_RECURRENCE; 606 r.freq = ICAL_MONTHLY_RECURRENCE;
610 607
611 tmpDays = recur->monthDays(); 608 tmpDays = recur->monthDays();
612 for (tmpDay = tmpDays.first(); 609 for (tmpDay = tmpDays.first();
613 tmpDay; 610 tmpDay;
614 tmpDay = tmpDays.next()) { 611 tmpDay = tmpDays.next()) {
615 r.by_month_day[index++] = icalrecurrencetype_day_position(*tmpDay*8);//*tmpDay); 612 r.by_month_day[index++] = icalrecurrencetype_day_position(*tmpDay*8);//*tmpDay);
616 } 613 }
617// r.by_day[index] = ICAL_RECURRENCE_ARRAY_MAX; 614// r.by_day[index] = ICAL_RECURRENCE_ARRAY_MAX;
618 break; 615 break;
619 case Recurrence::rYearlyMonth: 616 case Recurrence::rYearlyMonth:
620 case Recurrence::rYearlyPos: 617 case Recurrence::rYearlyPos:
621 r.freq = ICAL_YEARLY_RECURRENCE; 618 r.freq = ICAL_YEARLY_RECURRENCE;
622 619
623 tmpDays = recur->yearNums(); 620 tmpDays = recur->yearNums();
624 for (tmpDay = tmpDays.first(); 621 for (tmpDay = tmpDays.first();
625 tmpDay; 622 tmpDay;
626 tmpDay = tmpDays.next()) { 623 tmpDay = tmpDays.next()) {
627 r.by_month[index++] = *tmpDay; 624 r.by_month[index++] = *tmpDay;
628 } 625 }
629// r.by_set_pos[index] = ICAL_RECURRENCE_ARRAY_MAX; 626// r.by_set_pos[index] = ICAL_RECURRENCE_ARRAY_MAX;
630 if (recur->doesRecur() == Recurrence::rYearlyPos) { 627 if (recur->doesRecur() == Recurrence::rYearlyPos) {
631 tmpPositions = recur->monthPositions(); 628 tmpPositions = recur->monthPositions();
632 for (tmpPos = tmpPositions.first(); 629 for (tmpPos = tmpPositions.first();
633 tmpPos; 630 tmpPos;
634 tmpPos = tmpPositions.next()) { 631 tmpPos = tmpPositions.next()) {
635 for (i = 0; i < 7; i++) { 632 for (i = 0; i < 7; i++) {
636 if (tmpPos->rDays.testBit(i)) { 633 if (tmpPos->rDays.testBit(i)) {
637 day = (i + 1)%7 + 1; // convert from Monday=0 to Sunday=1 634 day = (i + 1)%7 + 1; // convert from Monday=0 to Sunday=1
638 day += tmpPos->rPos*8; 635 day += tmpPos->rPos*8;
639 if (tmpPos->negative) day = -day; 636 if (tmpPos->negative) day = -day;
640 r.by_day[index2++] = day; 637 r.by_day[index2++] = day;
641 } 638 }
642 } 639 }
643 } 640 }
644// r.by_day[index2] = ICAL_RECURRENCE_ARRAY_MAX; 641// r.by_day[index2] = ICAL_RECURRENCE_ARRAY_MAX;
645 } 642 }
646 break; 643 break;
647 case Recurrence::rYearlyDay: 644 case Recurrence::rYearlyDay:
648 r.freq = ICAL_YEARLY_RECURRENCE; 645 r.freq = ICAL_YEARLY_RECURRENCE;
649 646
650 tmpDays = recur->yearNums(); 647 tmpDays = recur->yearNums();
651 for (tmpDay = tmpDays.first(); 648 for (tmpDay = tmpDays.first();
652 tmpDay; 649 tmpDay;
653 tmpDay = tmpDays.next()) { 650 tmpDay = tmpDays.next()) {
654 r.by_year_day[index++] = *tmpDay; 651 r.by_year_day[index++] = *tmpDay;
655 } 652 }
656// r.by_year_day[index] = ICAL_RECURRENCE_ARRAY_MAX; 653// r.by_year_day[index] = ICAL_RECURRENCE_ARRAY_MAX;
657 break; 654 break;
658 default: 655 default:
659 r.freq = ICAL_NO_RECURRENCE; 656 r.freq = ICAL_NO_RECURRENCE;
660 kdDebug(5800) << "ICalFormatImpl::writeRecurrence(): no recurrence" << endl; 657 kdDebug(5800) << "ICalFormatImpl::writeRecurrence(): no recurrence" << endl;
661 break; 658 break;
662 } 659 }
663 660
664 r.interval = recur->frequency(); 661 r.interval = recur->frequency();
665 662
666 if (recur->duration() > 0) { 663 if (recur->duration() > 0) {
667 r.count = recur->duration(); 664 r.count = recur->duration();
668 } else if (recur->duration() == -1) { 665 } else if (recur->duration() == -1) {
669 r.count = 0; 666 r.count = 0;
670 } else { 667 } else {
671 if (datetime) 668 if (datetime)
672 r.until = writeICalDateTime(recur->endDateTime()); 669 r.until = writeICalDateTime(recur->endDateTime());
673 else 670 else
674 r.until = writeICalDate(recur->endDate()); 671 r.until = writeICalDate(recur->endDate());
675 } 672 }
676 673
677// Debug output 674// Debug output
678#if 0 675#if 0
679 const char *str = icalrecurrencetype_as_string(&r); 676 const char *str = icalrecurrencetype_as_string(&r);
680 if (str) { 677 if (str) {
681 kdDebug(5800) << " String: " << str << endl; 678 kdDebug(5800) << " String: " << str << endl;
682 } else { 679 } else {
683 kdDebug(5800) << " No String" << endl; 680 kdDebug(5800) << " No String" << endl;
684 } 681 }
685#endif 682#endif
686 683
687 return icalproperty_new_rrule(r); 684 return icalproperty_new_rrule(r);
688} 685}
689 686
690icalcomponent *ICalFormatImpl::writeAlarm(Alarm *alarm) 687icalcomponent *ICalFormatImpl::writeAlarm(Alarm *alarm)
691{ 688{
692 icalcomponent *a = icalcomponent_new(ICAL_VALARM_COMPONENT); 689 icalcomponent *a = icalcomponent_new(ICAL_VALARM_COMPONENT);
693 690
694 icalproperty_action action; 691 icalproperty_action action;
695 icalattach *attach = 0; 692 icalattach *attach = 0;
696 693
697 switch (alarm->type()) { 694 switch (alarm->type()) {
698 case Alarm::Procedure: 695 case Alarm::Procedure:
699 action = ICAL_ACTION_PROCEDURE; 696 action = ICAL_ACTION_PROCEDURE;
700 attach = icalattach_new_from_url( QFile::encodeName(alarm->programFile()).data() ); 697 attach = icalattach_new_from_url( QFile::encodeName(alarm->programFile()).data() );
701 icalcomponent_add_property(a,icalproperty_new_attach(attach)); 698 icalcomponent_add_property(a,icalproperty_new_attach(attach));
702 if (!alarm->programArguments().isEmpty()) { 699 if (!alarm->programArguments().isEmpty()) {
703 icalcomponent_add_property(a,icalproperty_new_description(alarm->programArguments().utf8())); 700 icalcomponent_add_property(a,icalproperty_new_description(alarm->programArguments().utf8()));
704 } 701 }
705 break; 702 break;
706 case Alarm::Audio: 703 case Alarm::Audio:
707 action = ICAL_ACTION_AUDIO; 704 action = ICAL_ACTION_AUDIO;
708 if (!alarm->audioFile().isEmpty()) { 705 if (!alarm->audioFile().isEmpty()) {
709 attach = icalattach_new_from_url(QFile::encodeName( alarm->audioFile() ).data()); 706 attach = icalattach_new_from_url(QFile::encodeName( alarm->audioFile() ).data());
710 icalcomponent_add_property(a,icalproperty_new_attach(attach)); 707 icalcomponent_add_property(a,icalproperty_new_attach(attach));
711 } 708 }
712 break; 709 break;
713 case Alarm::Email: { 710 case Alarm::Email: {
714 action = ICAL_ACTION_EMAIL; 711 action = ICAL_ACTION_EMAIL;
715 QValueList<Person> addresses = alarm->mailAddresses(); 712 QValueList<Person> addresses = alarm->mailAddresses();
716 for (QValueList<Person>::Iterator ad = addresses.begin(); ad != addresses.end(); ++ad) { 713 for (QValueList<Person>::Iterator ad = addresses.begin(); ad != addresses.end(); ++ad) {
717 icalproperty *p = icalproperty_new_attendee("MAILTO:" + (*ad).email().utf8()); 714 icalproperty *p = icalproperty_new_attendee("MAILTO:" + (*ad).email().utf8());
718 if (!(*ad).name().isEmpty()) { 715 if (!(*ad).name().isEmpty()) {
719 icalproperty_add_parameter(p,icalparameter_new_cn((*ad).name().utf8())); 716 icalproperty_add_parameter(p,icalparameter_new_cn((*ad).name().utf8()));
720 } 717 }
721 icalcomponent_add_property(a,p); 718 icalcomponent_add_property(a,p);
722 } 719 }
723 icalcomponent_add_property(a,icalproperty_new_summary(alarm->mailSubject().utf8())); 720 icalcomponent_add_property(a,icalproperty_new_summary(alarm->mailSubject().utf8()));
724 icalcomponent_add_property(a,icalproperty_new_description(alarm->text().utf8())); 721 icalcomponent_add_property(a,icalproperty_new_description(alarm->text().utf8()));
725 QStringList attachments = alarm->mailAttachments(); 722 QStringList attachments = alarm->mailAttachments();
726 if (attachments.count() > 0) { 723 if (attachments.count() > 0) {
727 for (QStringList::Iterator at = attachments.begin(); at != attachments.end(); ++at) { 724 for (QStringList::Iterator at = attachments.begin(); at != attachments.end(); ++at) {
728 attach = icalattach_new_from_url(QFile::encodeName( *at ).data()); 725 attach = icalattach_new_from_url(QFile::encodeName( *at ).data());
729 icalcomponent_add_property(a,icalproperty_new_attach(attach)); 726 icalcomponent_add_property(a,icalproperty_new_attach(attach));
730 } 727 }
731 } 728 }
732 break; 729 break;
733 } 730 }
734 case Alarm::Display: 731 case Alarm::Display:
735 action = ICAL_ACTION_DISPLAY; 732 action = ICAL_ACTION_DISPLAY;
736 icalcomponent_add_property(a,icalproperty_new_description(alarm->text().utf8())); 733 icalcomponent_add_property(a,icalproperty_new_description(alarm->text().utf8()));
737 break; 734 break;
738 case Alarm::Invalid: 735 case Alarm::Invalid:
739 default: 736 default:
740 kdDebug(5800) << "Unknown type of alarm" << endl; 737 kdDebug(5800) << "Unknown type of alarm" << endl;
741 action = ICAL_ACTION_NONE; 738 action = ICAL_ACTION_NONE;
742 break; 739 break;
743 } 740 }
744 icalcomponent_add_property(a,icalproperty_new_action(action)); 741 icalcomponent_add_property(a,icalproperty_new_action(action));
745 742
746 // Trigger time 743 // Trigger time
747 icaltriggertype trigger; 744 icaltriggertype trigger;
748 if ( alarm->hasTime() ) { 745 if ( alarm->hasTime() ) {
749 trigger.time = writeICalDateTime(alarm->time()); 746 trigger.time = writeICalDateTime(alarm->time());
750 trigger.duration = icaldurationtype_null_duration(); 747 trigger.duration = icaldurationtype_null_duration();
751 } else { 748 } else {
752 trigger.time = icaltime_null_time(); 749 trigger.time = icaltime_null_time();
753 Duration offset; 750 Duration offset;
754 if ( alarm->hasStartOffset() ) 751 if ( alarm->hasStartOffset() )
755 offset = alarm->startOffset(); 752 offset = alarm->startOffset();
756 else 753 else
757 offset = alarm->endOffset(); 754 offset = alarm->endOffset();
758 trigger.duration = icaldurationtype_from_int( offset.asSeconds() ); 755 trigger.duration = icaldurationtype_from_int( offset.asSeconds() );
759 } 756 }
760 icalproperty *p = icalproperty_new_trigger(trigger); 757 icalproperty *p = icalproperty_new_trigger(trigger);
761 if ( alarm->hasEndOffset() ) 758 if ( alarm->hasEndOffset() )
762 icalproperty_add_parameter(p,icalparameter_new_related(ICAL_RELATED_END)); 759 icalproperty_add_parameter(p,icalparameter_new_related(ICAL_RELATED_END));
763 icalcomponent_add_property(a,p); 760 icalcomponent_add_property(a,p);
764 761
765 // Repeat count and duration 762 // Repeat count and duration
766 if (alarm->repeatCount()) { 763 if (alarm->repeatCount()) {
767 icalcomponent_add_property(a,icalproperty_new_repeat(alarm->repeatCount())); 764 icalcomponent_add_property(a,icalproperty_new_repeat(alarm->repeatCount()));
768 icalcomponent_add_property(a,icalproperty_new_duration( 765 icalcomponent_add_property(a,icalproperty_new_duration(
769 icaldurationtype_from_int(alarm->snoozeTime()*60))); 766 icaldurationtype_from_int(alarm->snoozeTime()*60)));
770 } 767 }
771 768
772 // Custom properties 769 // Custom properties
773 QMap<QCString, QString> custom = alarm->customProperties(); 770 QMap<QCString, QString> custom = alarm->customProperties();
774 for (QMap<QCString, QString>::Iterator c = custom.begin(); c != custom.end(); ++c) { 771 for (QMap<QCString, QString>::Iterator c = custom.begin(); c != custom.end(); ++c) {
775 icalproperty *p = icalproperty_new_x(c.data().utf8()); 772 icalproperty *p = icalproperty_new_x(c.data().utf8());
776 icalproperty_set_x_name(p,c.key()); 773 icalproperty_set_x_name(p,c.key());
777 icalcomponent_add_property(a,p); 774 icalcomponent_add_property(a,p);
778 } 775 }
779 776
780 return a; 777 return a;
781} 778}
782 779
783Todo *ICalFormatImpl::readTodo(icalcomponent *vtodo) 780Todo *ICalFormatImpl::readTodo(icalcomponent *vtodo)
784{ 781{
785 Todo *todo = new Todo; 782 Todo *todo = new Todo;
786 783
787 readIncidence(vtodo,todo); 784 readIncidence(vtodo,todo);
788 785
789 icalproperty *p = icalcomponent_get_first_property(vtodo,ICAL_ANY_PROPERTY); 786 icalproperty *p = icalcomponent_get_first_property(vtodo,ICAL_ANY_PROPERTY);
790 787
791// int intvalue; 788// int intvalue;
792 icaltimetype icaltime; 789 icaltimetype icaltime;
793 790
794 QStringList categories; 791 QStringList categories;
795 792
796 while (p) { 793 while (p) {
797 icalproperty_kind kind = icalproperty_isa(p); 794 icalproperty_kind kind = icalproperty_isa(p);
798 switch (kind) { 795 switch (kind) {
799 796
800 case ICAL_DUE_PROPERTY: // due date 797 case ICAL_DUE_PROPERTY: // due date
801 icaltime = icalproperty_get_due(p); 798 icaltime = icalproperty_get_due(p);
802 if (icaltime.is_date) { 799 if (icaltime.is_date) {
803 todo->setDtDue(QDateTime(readICalDate(icaltime),QTime(0,0,0))); 800 todo->setDtDue(QDateTime(readICalDate(icaltime),QTime(0,0,0)));
804 todo->setFloats(true); 801 todo->setFloats(true);
805 802
806 } else { 803 } else {
807 todo->setDtDue(readICalDateTime(icaltime)); 804 todo->setDtDue(readICalDateTime(icaltime));
808 todo->setFloats(false); 805 todo->setFloats(false);
809 } 806 }
810 todo->setHasDueDate(true); 807 todo->setHasDueDate(true);
811 break; 808 break;
812 809
813 case ICAL_COMPLETED_PROPERTY: // completion date 810 case ICAL_COMPLETED_PROPERTY: // completion date
814 icaltime = icalproperty_get_completed(p); 811 icaltime = icalproperty_get_completed(p);
815 todo->setCompleted(readICalDateTime(icaltime)); 812 todo->setCompleted(readICalDateTime(icaltime));
816 break; 813 break;
817 814
818 case ICAL_PERCENTCOMPLETE_PROPERTY: // Percent completed 815 case ICAL_PERCENTCOMPLETE_PROPERTY: // Percent completed
819 todo->setPercentComplete(icalproperty_get_percentcomplete(p)); 816 todo->setPercentComplete(icalproperty_get_percentcomplete(p));
820 break; 817 break;
821 818
822 case ICAL_RELATEDTO_PROPERTY: // related todo (parent) 819 case ICAL_RELATEDTO_PROPERTY: // related todo (parent)
823 todo->setRelatedToUid(QString::fromUtf8(icalproperty_get_relatedto(p))); 820 todo->setRelatedToUid(QString::fromUtf8(icalproperty_get_relatedto(p)));
824 mTodosRelate.append(todo); 821 mTodosRelate.append(todo);
825 break; 822 break;
826 823
827 case ICAL_DTSTART_PROPERTY: 824 case ICAL_DTSTART_PROPERTY:
828 // Flag that todo has start date. Value is read in by readIncidence(). 825 // Flag that todo has start date. Value is read in by readIncidence().
829 todo->setHasStartDate(true); 826 todo->setHasStartDate(true);
830 break; 827 break;
831 828
832 default: 829 default:
833// kdDebug(5800) << "ICALFormat::readTodo(): Unknown property: " << kind 830// kdDebug(5800) << "ICALFormat::readTodo(): Unknown property: " << kind
834// << endl; 831// << endl;
835 break; 832 break;
836 } 833 }
837 834
838 p = icalcomponent_get_next_property(vtodo,ICAL_ANY_PROPERTY); 835 p = icalcomponent_get_next_property(vtodo,ICAL_ANY_PROPERTY);
839 } 836 }
840 837
841 return todo; 838 return todo;
842} 839}
843 840
844Event *ICalFormatImpl::readEvent(icalcomponent *vevent) 841Event *ICalFormatImpl::readEvent(icalcomponent *vevent)
845{ 842{
846 Event *event = new Event; 843 Event *event = new Event;
847 event->setFloats(false); 844 event->setFloats(false);
848 845
849 readIncidence(vevent,event); 846 readIncidence(vevent,event);
850 847
851 icalproperty *p = icalcomponent_get_first_property(vevent,ICAL_ANY_PROPERTY); 848 icalproperty *p = icalcomponent_get_first_property(vevent,ICAL_ANY_PROPERTY);
852 849
853// int intvalue; 850// int intvalue;
854 icaltimetype icaltime; 851 icaltimetype icaltime;
855 852
856 QStringList categories; 853 QStringList categories;
857 QString transparency; 854 QString transparency;
858 855
859 while (p) { 856 while (p) {
860 icalproperty_kind kind = icalproperty_isa(p); 857 icalproperty_kind kind = icalproperty_isa(p);
861 switch (kind) { 858 switch (kind) {
862 859
863 case ICAL_DTEND_PROPERTY: // start date and time 860 case ICAL_DTEND_PROPERTY: // start date and time
864 icaltime = icalproperty_get_dtend(p); 861 icaltime = icalproperty_get_dtend(p);
865 if (icaltime.is_date) { 862 if (icaltime.is_date) {
866 event->setFloats( true ); 863 event->setFloats( true );
867 // End date is non-inclusive 864 // End date is non-inclusive
868 QDate endDate = readICalDate( icaltime ).addDays( -1 ); 865 QDate endDate = readICalDate( icaltime ).addDays( -1 );
869 mCompat->fixFloatingEnd( endDate ); 866 mCompat->fixFloatingEnd( endDate );
870 if ( endDate < event->dtStart().date() ) { 867 if ( endDate < event->dtStart().date() ) {
871 endDate = event->dtStart().date(); 868 endDate = event->dtStart().date();
872 } 869 }
873 event->setDtEnd( QDateTime( endDate, QTime( 0, 0, 0 ) ) ); 870 event->setDtEnd( QDateTime( endDate, QTime( 0, 0, 0 ) ) );
874 } else { 871 } else {
875 event->setDtEnd(readICalDateTime(icaltime)); 872 event->setDtEnd(readICalDateTime(icaltime));
876 } 873 }
877 break; 874 break;
878 875
879// TODO: 876// TODO:
880 // at this point, there should be at least a start or end time. 877 // at this point, there should be at least a start or end time.
881 // fix up for events that take up no time but have a time associated 878 // fix up for events that take up no time but have a time associated
882#if 0 879#if 0
883 if (!(vo = isAPropertyOf(vevent, VCDTstartProp))) 880 if (!(vo = isAPropertyOf(vevent, VCDTstartProp)))
884 anEvent->setDtStart(anEvent->dtEnd()); 881 anEvent->setDtStart(anEvent->dtEnd());
885 if (!(vo = isAPropertyOf(vevent, VCDTendProp))) 882 if (!(vo = isAPropertyOf(vevent, VCDTendProp)))
886 anEvent->setDtEnd(anEvent->dtStart()); 883 anEvent->setDtEnd(anEvent->dtStart());
887#endif 884#endif
888 885
889// TODO: exdates 886// TODO: exdates
890#if 0 887#if 0
891 // recurrence exceptions 888 // recurrence exceptions
892 if ((vo = isAPropertyOf(vevent, VCExDateProp)) != 0) { 889 if ((vo = isAPropertyOf(vevent, VCExDateProp)) != 0) {
893 anEvent->setExDates(s = fakeCString(vObjectUStringZValue(vo))); 890 anEvent->setExDates(s = fakeCString(vObjectUStringZValue(vo)));
894 deleteStr(s); 891 deleteStr(s);
895 } 892 }
896#endif 893#endif
897 894
898#if 0 895#if 0
899 // secrecy 896 // secrecy
900 if ((vo = isAPropertyOf(vevent, VCClassProp)) != 0) { 897 if ((vo = isAPropertyOf(vevent, VCClassProp)) != 0) {
901 anEvent->setSecrecy(s = fakeCString(vObjectUStringZValue(vo))); 898 anEvent->setSecrecy(s = fakeCString(vObjectUStringZValue(vo)));
902 deleteStr(s); 899 deleteStr(s);
903 } 900 }
904 else 901 else
905 anEvent->setSecrecy("PUBLIC"); 902 anEvent->setSecrecy("PUBLIC");
906 903
907 // attachments 904 // attachments
908 tmpStrList.clear(); 905 tmpStrList.clear();
909 initPropIterator(&voi, vevent); 906 initPropIterator(&voi, vevent);
910 while (moreIteration(&voi)) { 907 while (moreIteration(&voi)) {
911 vo = nextVObject(&voi); 908 vo = nextVObject(&voi);
912 if (strcmp(vObjectName(vo), VCAttachProp) == 0) { 909 if (strcmp(vObjectName(vo), VCAttachProp) == 0) {
913 tmpStrList.append(s = fakeCString(vObjectUStringZValue(vo))); 910 tmpStrList.append(s = fakeCString(vObjectUStringZValue(vo)));
914 deleteStr(s); 911 deleteStr(s);
915 } 912 }
916 } 913 }
917 anEvent->setAttachments(tmpStrList); 914 anEvent->setAttachments(tmpStrList);
918 915
919 // resources 916 // resources
920 if ((vo = isAPropertyOf(vevent, VCResourcesProp)) != 0) { 917 if ((vo = isAPropertyOf(vevent, VCResourcesProp)) != 0) {
921 QString resources = (s = fakeCString(vObjectUStringZValue(vo))); 918 QString resources = (s = fakeCString(vObjectUStringZValue(vo)));
922 deleteStr(s); 919 deleteStr(s);
923 tmpStrList.clear(); 920 tmpStrList.clear();
924 index1 = 0; 921 index1 = 0;
925 index2 = 0; 922 index2 = 0;
926 QString resource; 923 QString resource;
927 while ((index2 = resources.find(';', index1)) != -1) { 924 while ((index2 = resources.find(';', index1)) != -1) {
928 resource = resources.mid(index1, (index2 - index1)); 925 resource = resources.mid(index1, (index2 - index1));
929 tmpStrList.append(resource); 926 tmpStrList.append(resource);
930 index1 = index2; 927 index1 = index2;
931 } 928 }
932 anEvent->setResources(tmpStrList); 929 anEvent->setResources(tmpStrList);
933 } 930 }
934#endif 931#endif
935 932
936 case ICAL_RELATEDTO_PROPERTY: // releated event (parent) 933 case ICAL_RELATEDTO_PROPERTY: // releated event (parent)
937 event->setRelatedToUid(QString::fromUtf8(icalproperty_get_relatedto(p))); 934 event->setRelatedToUid(QString::fromUtf8(icalproperty_get_relatedto(p)));
938 mEventsRelate.append(event); 935 mEventsRelate.append(event);
939 break; 936 break;
940 937
941 case ICAL_TRANSP_PROPERTY: // Transparency 938 case ICAL_TRANSP_PROPERTY: // Transparency
942 if(icalproperty_get_transp(p) == ICAL_TRANSP_TRANSPARENT ) 939 if(icalproperty_get_transp(p) == ICAL_TRANSP_TRANSPARENT )
943 event->setTransparency( Event::Transparent ); 940 event->setTransparency( Event::Transparent );
944 else 941 else
945 event->setTransparency( Event::Opaque ); 942 event->setTransparency( Event::Opaque );
946 break; 943 break;
947 944
948 default: 945 default:
949// kdDebug(5800) << "ICALFormat::readEvent(): Unknown property: " << kind 946// kdDebug(5800) << "ICALFormat::readEvent(): Unknown property: " << kind
950// << endl; 947// << endl;
951 break; 948 break;
952 } 949 }
953 950
954 p = icalcomponent_get_next_property(vevent,ICAL_ANY_PROPERTY); 951 p = icalcomponent_get_next_property(vevent,ICAL_ANY_PROPERTY);
955 } 952 }
956 953
957 QString msade = event->nonKDECustomProperty("X-MICROSOFT-CDO-ALLDAYEVENT"); 954 QString msade = event->nonKDECustomProperty("X-MICROSOFT-CDO-ALLDAYEVENT");
958 if (!msade.isNull()) { 955 if (!msade.isNull()) {
959 bool floats = (msade == QString::fromLatin1("TRUE")); 956 bool floats = (msade == QString::fromLatin1("TRUE"));
960 kdDebug(5800) << "ICALFormat::readEvent(): all day event: " << floats << endl; 957 kdDebug(5800) << "ICALFormat::readEvent(): all day event: " << floats << endl;
961 event->setFloats(floats); 958 event->setFloats(floats);
962 if (floats) { 959 if (floats) {
963 QDateTime endDate = event->dtEnd(); 960 QDateTime endDate = event->dtEnd();
964 event->setDtEnd(endDate.addDays(-1)); 961 event->setDtEnd(endDate.addDays(-1));
965 } 962 }
966 } 963 }
967 964
968 // some stupid vCal exporters ignore the standard and use Description 965 // some stupid vCal exporters ignore the standard and use Description
969 // instead of Summary for the default field. Correct for this. 966 // instead of Summary for the default field. Correct for this.
970 if (event->summary().isEmpty() && 967 if (event->summary().isEmpty() &&
971 !(event->description().isEmpty())) { 968 !(event->description().isEmpty())) {
972 QString tmpStr = event->description().simplifyWhiteSpace(); 969 QString tmpStr = event->description().simplifyWhiteSpace();
973 event->setDescription(""); 970 event->setDescription("");
974 event->setSummary(tmpStr); 971 event->setSummary(tmpStr);
975 } 972 }
976 973
977 return event; 974 return event;
978} 975}
979 976
980FreeBusy *ICalFormatImpl::readFreeBusy(icalcomponent *vfreebusy) 977FreeBusy *ICalFormatImpl::readFreeBusy(icalcomponent *vfreebusy)
981{ 978{
982 FreeBusy *freebusy = new FreeBusy; 979 FreeBusy *freebusy = new FreeBusy;
983 980
984 readIncidenceBase(vfreebusy,freebusy); 981 readIncidenceBase(vfreebusy,freebusy);
985 982
986 icalproperty *p = icalcomponent_get_first_property(vfreebusy,ICAL_ANY_PROPERTY); 983 icalproperty *p = icalcomponent_get_first_property(vfreebusy,ICAL_ANY_PROPERTY);
987 984
988 icaltimetype icaltime; 985 icaltimetype icaltime;
989 icalperiodtype icalperiod; 986 icalperiodtype icalperiod;
990 QDateTime period_start, period_end; 987 QDateTime period_start, period_end;
991 988
992 while (p) { 989 while (p) {
993 icalproperty_kind kind = icalproperty_isa(p); 990 icalproperty_kind kind = icalproperty_isa(p);
994 switch (kind) { 991 switch (kind) {
995 992
996 case ICAL_DTSTART_PROPERTY: // start date and time 993 case ICAL_DTSTART_PROPERTY: // start date and time
997 icaltime = icalproperty_get_dtstart(p); 994 icaltime = icalproperty_get_dtstart(p);
998 freebusy->setDtStart(readICalDateTime(icaltime)); 995 freebusy->setDtStart(readICalDateTime(icaltime));
999 break; 996 break;
1000 997
1001 case ICAL_DTEND_PROPERTY: // start End Date and Time 998 case ICAL_DTEND_PROPERTY: // start End Date and Time
1002 icaltime = icalproperty_get_dtend(p); 999 icaltime = icalproperty_get_dtend(p);
1003 freebusy->setDtEnd(readICalDateTime(icaltime)); 1000 freebusy->setDtEnd(readICalDateTime(icaltime));
1004 break; 1001 break;
1005 1002
1006 case ICAL_FREEBUSY_PROPERTY: //Any FreeBusy Times 1003 case ICAL_FREEBUSY_PROPERTY: //Any FreeBusy Times
1007 icalperiod = icalproperty_get_freebusy(p); 1004 icalperiod = icalproperty_get_freebusy(p);
1008 period_start = readICalDateTime(icalperiod.start); 1005 period_start = readICalDateTime(icalperiod.start);
1009 period_end = readICalDateTime(icalperiod.end); 1006 period_end = readICalDateTime(icalperiod.end);
1010 freebusy->addPeriod(period_start, period_end); 1007 freebusy->addPeriod(period_start, period_end);
1011 break; 1008 break;
1012 1009
1013 default: 1010 default:
1014 kdDebug(5800) << "ICALFormat::readIncidence(): Unknown property: " << kind 1011 kdDebug(5800) << "ICALFormat::readIncidence(): Unknown property: " << kind
1015 << endl; 1012 << endl;
1016 break; 1013 break;
1017 } 1014 }
1018 p = icalcomponent_get_next_property(vfreebusy,ICAL_ANY_PROPERTY); 1015 p = icalcomponent_get_next_property(vfreebusy,ICAL_ANY_PROPERTY);
1019 } 1016 }
1020 1017
1021 return freebusy; 1018 return freebusy;
1022} 1019}
1023 1020
1024Journal *ICalFormatImpl::readJournal(icalcomponent *vjournal) 1021Journal *ICalFormatImpl::readJournal(icalcomponent *vjournal)
1025{ 1022{
1026 Journal *journal = new Journal; 1023 Journal *journal = new Journal;
1027 1024
1028 readIncidence(vjournal,journal); 1025 readIncidence(vjournal,journal);
1029 1026
1030 return journal; 1027 return journal;
1031} 1028}
1032 1029
1033Attendee *ICalFormatImpl::readAttendee(icalproperty *attendee) 1030Attendee *ICalFormatImpl::readAttendee(icalproperty *attendee)
1034{ 1031{
1035 icalparameter *p = 0; 1032 icalparameter *p = 0;
1036 1033
1037 QString email = QString::fromUtf8(icalproperty_get_attendee(attendee)); 1034 QString email = QString::fromUtf8(icalproperty_get_attendee(attendee));
1038 1035
1039 QString name; 1036 QString name;
1040 QString uid = QString::null; 1037 QString uid = QString::null;
1041 p = icalproperty_get_first_parameter(attendee,ICAL_CN_PARAMETER); 1038 p = icalproperty_get_first_parameter(attendee,ICAL_CN_PARAMETER);
1042 if (p) { 1039 if (p) {
1043 name = QString::fromUtf8(icalparameter_get_cn(p)); 1040 name = QString::fromUtf8(icalparameter_get_cn(p));
1044 } else { 1041 } else {
1045 } 1042 }
1046 1043
1047 bool rsvp=false; 1044 bool rsvp=false;
1048 p = icalproperty_get_first_parameter(attendee,ICAL_RSVP_PARAMETER); 1045 p = icalproperty_get_first_parameter(attendee,ICAL_RSVP_PARAMETER);
1049 if (p) { 1046 if (p) {
1050 icalparameter_rsvp rsvpParameter = icalparameter_get_rsvp(p); 1047 icalparameter_rsvp rsvpParameter = icalparameter_get_rsvp(p);
1051 if (rsvpParameter == ICAL_RSVP_TRUE) rsvp = true; 1048 if (rsvpParameter == ICAL_RSVP_TRUE) rsvp = true;
1052 } 1049 }
1053 1050
1054 Attendee::PartStat status = Attendee::NeedsAction; 1051 Attendee::PartStat status = Attendee::NeedsAction;
1055 p = icalproperty_get_first_parameter(attendee,ICAL_PARTSTAT_PARAMETER); 1052 p = icalproperty_get_first_parameter(attendee,ICAL_PARTSTAT_PARAMETER);
1056 if (p) { 1053 if (p) {
1057 icalparameter_partstat partStatParameter = icalparameter_get_partstat(p); 1054 icalparameter_partstat partStatParameter = icalparameter_get_partstat(p);
1058 switch(partStatParameter) { 1055 switch(partStatParameter) {
1059 default: 1056 default:
1060 case ICAL_PARTSTAT_NEEDSACTION: 1057 case ICAL_PARTSTAT_NEEDSACTION:
1061 status = Attendee::NeedsAction; 1058 status = Attendee::NeedsAction;
1062 break; 1059 break;
1063 case ICAL_PARTSTAT_ACCEPTED: 1060 case ICAL_PARTSTAT_ACCEPTED:
1064 status = Attendee::Accepted; 1061 status = Attendee::Accepted;
1065 break; 1062 break;
1066 case ICAL_PARTSTAT_DECLINED: 1063 case ICAL_PARTSTAT_DECLINED:
1067 status = Attendee::Declined; 1064 status = Attendee::Declined;
1068 break; 1065 break;
1069 case ICAL_PARTSTAT_TENTATIVE: 1066 case ICAL_PARTSTAT_TENTATIVE:
1070 status = Attendee::Tentative; 1067 status = Attendee::Tentative;
1071 break; 1068 break;
1072 case ICAL_PARTSTAT_DELEGATED: 1069 case ICAL_PARTSTAT_DELEGATED:
1073 status = Attendee::Delegated; 1070 status = Attendee::Delegated;
1074 break; 1071 break;
1075 case ICAL_PARTSTAT_COMPLETED: 1072 case ICAL_PARTSTAT_COMPLETED:
1076 status = Attendee::Completed; 1073 status = Attendee::Completed;
1077 break; 1074 break;
1078 case ICAL_PARTSTAT_INPROCESS: 1075 case ICAL_PARTSTAT_INPROCESS:
1079 status = Attendee::InProcess; 1076 status = Attendee::InProcess;
1080 break; 1077 break;
1081 } 1078 }
1082 } 1079 }
1083 1080
1084 Attendee::Role role = Attendee::ReqParticipant; 1081 Attendee::Role role = Attendee::ReqParticipant;
1085 p = icalproperty_get_first_parameter(attendee,ICAL_ROLE_PARAMETER); 1082 p = icalproperty_get_first_parameter(attendee,ICAL_ROLE_PARAMETER);
1086 if (p) { 1083 if (p) {
1087 icalparameter_role roleParameter = icalparameter_get_role(p); 1084 icalparameter_role roleParameter = icalparameter_get_role(p);
1088 switch(roleParameter) { 1085 switch(roleParameter) {
1089 case ICAL_ROLE_CHAIR: 1086 case ICAL_ROLE_CHAIR:
1090 role = Attendee::Chair; 1087 role = Attendee::Chair;
1091 break; 1088 break;
1092 default: 1089 default:
1093 case ICAL_ROLE_REQPARTICIPANT: 1090 case ICAL_ROLE_REQPARTICIPANT:
1094 role = Attendee::ReqParticipant; 1091 role = Attendee::ReqParticipant;
1095 break; 1092 break;
1096 case ICAL_ROLE_OPTPARTICIPANT: 1093 case ICAL_ROLE_OPTPARTICIPANT:
1097 role = Attendee::OptParticipant; 1094 role = Attendee::OptParticipant;
1098 break; 1095 break;
1099 case ICAL_ROLE_NONPARTICIPANT: 1096 case ICAL_ROLE_NONPARTICIPANT:
1100 role = Attendee::NonParticipant; 1097 role = Attendee::NonParticipant;
1101 break; 1098 break;
1102 } 1099 }
1103 } 1100 }
1104 1101
1105 p = icalproperty_get_first_parameter(attendee,ICAL_X_PARAMETER); 1102 p = icalproperty_get_first_parameter(attendee,ICAL_X_PARAMETER);
1106 uid = icalparameter_get_xvalue(p); 1103 uid = icalparameter_get_xvalue(p);
1107 // This should be added, but there seems to be a libical bug here. 1104 // This should be added, but there seems to be a libical bug here.
1108 /*while (p) { 1105 /*while (p) {
1109 // if (icalparameter_get_xname(p) == "X-UID") { 1106 // if (icalparameter_get_xname(p) == "X-UID") {
1110 uid = icalparameter_get_xvalue(p); 1107 uid = icalparameter_get_xvalue(p);
1111 p = icalproperty_get_next_parameter(attendee,ICAL_X_PARAMETER); 1108 p = icalproperty_get_next_parameter(attendee,ICAL_X_PARAMETER);
1112 } */ 1109 } */
1113 1110
1114 return new Attendee( name, email, rsvp, status, role, uid ); 1111 return new Attendee( name, email, rsvp, status, role, uid );
1115} 1112}
1116 1113
1117Attachment *ICalFormatImpl::readAttachment(icalproperty *attach) 1114Attachment *ICalFormatImpl::readAttachment(icalproperty *attach)
1118{ 1115{
1119 icalattach *a = icalproperty_get_attach(attach); 1116 icalattach *a = icalproperty_get_attach(attach);
1120 icalparameter_value v = ICAL_VALUE_NONE; 1117 icalparameter_value v = ICAL_VALUE_NONE;
1121 icalparameter_encoding e = ICAL_ENCODING_NONE; 1118 icalparameter_encoding e = ICAL_ENCODING_NONE;
1122 1119
1123 Attachment *attachment = 0; 1120 Attachment *attachment = 0;
1124 /* 1121 /*
1125 icalparameter *vp = icalproperty_get_first_parameter(attach, ICAL_VALUE_PARAMETER); 1122 icalparameter *vp = icalproperty_get_first_parameter(attach, ICAL_VALUE_PARAMETER);
1126 if (vp) 1123 if (vp)
1127 v = icalparameter_get_value(vp); 1124 v = icalparameter_get_value(vp);
1128 1125
1129 icalparameter *ep = icalproperty_get_first_parameter(attach, ICAL_ENCODING_PARAMETER); 1126 icalparameter *ep = icalproperty_get_first_parameter(attach, ICAL_ENCODING_PARAMETER);
1130 if (ep) 1127 if (ep)
1131 e = icalparameter_get_encoding(ep); 1128 e = icalparameter_get_encoding(ep);
1132 */ 1129 */
1133 int isurl = icalattach_get_is_url (a); 1130 int isurl = icalattach_get_is_url (a);
1134 if (isurl == 0) 1131 if (isurl == 0)
1135 attachment = new Attachment((const char*)icalattach_get_data(a)); 1132 attachment = new Attachment((const char*)icalattach_get_data(a));
1136 else { 1133 else {
1137 attachment = new Attachment(QString(icalattach_get_url(a))); 1134 attachment = new Attachment(QString(icalattach_get_url(a)));
1138 } 1135 }
1139 1136
1140 icalparameter *p = icalproperty_get_first_parameter(attach, ICAL_FMTTYPE_PARAMETER); 1137 icalparameter *p = icalproperty_get_first_parameter(attach, ICAL_FMTTYPE_PARAMETER);
1141 if (p) 1138 if (p)
1142 attachment->setMimeType(QString(icalparameter_get_fmttype(p))); 1139 attachment->setMimeType(QString(icalparameter_get_fmttype(p)));
1143 1140
1144 return attachment; 1141 return attachment;
1145} 1142}
1146#include <qtextcodec.h> 1143#include <qtextcodec.h>
1147void ICalFormatImpl::readIncidence(icalcomponent *parent,Incidence *incidence) 1144void ICalFormatImpl::readIncidence(icalcomponent *parent,Incidence *incidence)
1148{ 1145{
1149 readIncidenceBase(parent,incidence); 1146 readIncidenceBase(parent,incidence);
1150 1147
1151 icalproperty *p = icalcomponent_get_first_property(parent,ICAL_ANY_PROPERTY); 1148 icalproperty *p = icalcomponent_get_first_property(parent,ICAL_ANY_PROPERTY);
1152 bool readrec = false; 1149 bool readrec = false;
1153 const char *text; 1150 const char *text;
1154 int intvalue; 1151 int intvalue;
1155 icaltimetype icaltime; 1152 icaltimetype icaltime;
1156 icaldurationtype icalduration; 1153 icaldurationtype icalduration;
1157 struct icalrecurrencetype rectype; 1154 struct icalrecurrencetype rectype;
1158 QStringList categories; 1155 QStringList categories;
1159 1156
1160 while (p) { 1157 while (p) {
1161 icalproperty_kind kind = icalproperty_isa(p); 1158 icalproperty_kind kind = icalproperty_isa(p);
1162 switch (kind) { 1159 switch (kind) {
1163 1160
1164 case ICAL_CREATED_PROPERTY: 1161 case ICAL_CREATED_PROPERTY:
1165 icaltime = icalproperty_get_created(p); 1162 icaltime = icalproperty_get_created(p);
1166 incidence->setCreated(readICalDateTime(icaltime)); 1163 incidence->setCreated(readICalDateTime(icaltime));
1167 break; 1164 break;
1168 1165
1169 case ICAL_SEQUENCE_PROPERTY: // sequence 1166 case ICAL_SEQUENCE_PROPERTY: // sequence
1170 intvalue = icalproperty_get_sequence(p); 1167 intvalue = icalproperty_get_sequence(p);
1171 incidence->setRevision(intvalue); 1168 incidence->setRevision(intvalue);
1172 break; 1169 break;
1173 1170
1174 case ICAL_LASTMODIFIED_PROPERTY: // last modification date 1171 case ICAL_LASTMODIFIED_PROPERTY: // last modification date
1175 icaltime = icalproperty_get_lastmodified(p); 1172 icaltime = icalproperty_get_lastmodified(p);
1176 incidence->setLastModified(readICalDateTime(icaltime)); 1173 incidence->setLastModified(readICalDateTime(icaltime));
1177 break; 1174 break;
1178 1175
1179 case ICAL_DTSTART_PROPERTY: // start date and time 1176 case ICAL_DTSTART_PROPERTY: // start date and time
1180 icaltime = icalproperty_get_dtstart(p); 1177 icaltime = icalproperty_get_dtstart(p);
1181 if (icaltime.is_date) { 1178 if (icaltime.is_date) {
1182 incidence->setDtStart(QDateTime(readICalDate(icaltime),QTime(0,0,0))); 1179 incidence->setDtStart(QDateTime(readICalDate(icaltime),QTime(0,0,0)));
1183 incidence->setFloats(true); 1180 incidence->setFloats(true);
1184 } else { 1181 } else {
1185 incidence->setDtStart(readICalDateTime(icaltime)); 1182 incidence->setDtStart(readICalDateTime(icaltime));
1186 } 1183 }
1187 break; 1184 break;
1188 1185
1189 case ICAL_DURATION_PROPERTY: // start date and time 1186 case ICAL_DURATION_PROPERTY: // start date and time
1190 icalduration = icalproperty_get_duration(p); 1187 icalduration = icalproperty_get_duration(p);
1191 incidence->setDuration(readICalDuration(icalduration)); 1188 incidence->setDuration(readICalDuration(icalduration));
1192 break; 1189 break;
1193 1190
1194 case ICAL_DESCRIPTION_PROPERTY: // description 1191 case ICAL_DESCRIPTION_PROPERTY: // description
1195 text = icalproperty_get_description(p); 1192 text = icalproperty_get_description(p);
1196 incidence->setDescription(QString::fromUtf8(text)); 1193 incidence->setDescription(QString::fromUtf8(text));
1197 break; 1194 break;
1198 1195
1199 case ICAL_SUMMARY_PROPERTY: // summary 1196 case ICAL_SUMMARY_PROPERTY: // summary
1200 { 1197 {
1201 text = icalproperty_get_summary(p); 1198 text = icalproperty_get_summary(p);
1202 incidence->setSummary(QString::fromUtf8(text)); 1199 incidence->setSummary(QString::fromUtf8(text));
1203 } 1200 }
1204 break; 1201 break;
1205 case ICAL_STATUS_PROPERTY: // summary 1202 case ICAL_STATUS_PROPERTY: // summary
1206 { 1203 {
1207 if ( ICAL_STATUS_CANCELLED == icalproperty_get_status(p) ) 1204 if ( ICAL_STATUS_CANCELLED == icalproperty_get_status(p) )
1208 incidence->setCancelled( true ); 1205 incidence->setCancelled( true );
1209 } 1206 }
1210 break; 1207 break;
1211 1208
1212 case ICAL_LOCATION_PROPERTY: // location 1209 case ICAL_LOCATION_PROPERTY: // location
1213 text = icalproperty_get_location(p); 1210 text = icalproperty_get_location(p);
1214 incidence->setLocation(QString::fromUtf8(text)); 1211 incidence->setLocation(QString::fromUtf8(text));
1215 break; 1212 break;
1216 1213
1217#if 0 1214#if 0
1218 // status 1215 // status
1219 if ((vo = isAPropertyOf(vincidence, VCStatusProp)) != 0) { 1216 if ((vo = isAPropertyOf(vincidence, VCStatusProp)) != 0) {
1220 incidence->setStatus(s = fakeCString(vObjectUStringZValue(vo))); 1217 incidence->setStatus(s = fakeCString(vObjectUStringZValue(vo)));
1221 deleteStr(s); 1218 deleteStr(s);
1222 } 1219 }
1223 else 1220 else
1224 incidence->setStatus("NEEDS ACTION"); 1221 incidence->setStatus("NEEDS ACTION");
1225#endif 1222#endif
1226 1223
1227 case ICAL_PRIORITY_PROPERTY: // priority 1224 case ICAL_PRIORITY_PROPERTY: // priority
1228 intvalue = icalproperty_get_priority(p); 1225 intvalue = icalproperty_get_priority(p);
1229 incidence->setPriority(intvalue); 1226 incidence->setPriority(intvalue);
1230 break; 1227 break;
1231 1228
1232 case ICAL_CATEGORIES_PROPERTY: // categories 1229 case ICAL_CATEGORIES_PROPERTY: // categories
1233 text = icalproperty_get_categories(p); 1230 text = icalproperty_get_categories(p);
1234 categories.append(QString::fromUtf8(text)); 1231 categories.append(QString::fromUtf8(text));
1235 break; 1232 break;
1236 //******************************************* 1233 //*******************************************
1237 case ICAL_RRULE_PROPERTY: 1234 case ICAL_RRULE_PROPERTY:
1238 // we do need (maybe )start datetime of incidence for recurrence 1235 // we do need (maybe )start datetime of incidence for recurrence
1239 // such that we can read recurrence only after we read incidence completely 1236 // such that we can read recurrence only after we read incidence completely
1240 readrec = true; 1237 readrec = true;
1241 rectype = icalproperty_get_rrule(p); 1238 rectype = icalproperty_get_rrule(p);
1242 break; 1239 break;
1243 1240
1244 case ICAL_EXDATE_PROPERTY: 1241 case ICAL_EXDATE_PROPERTY:
1245 icaltime = icalproperty_get_exdate(p); 1242 icaltime = icalproperty_get_exdate(p);
1246 incidence->addExDate(readICalDate(icaltime)); 1243 incidence->addExDate(readICalDate(icaltime));
1247 break; 1244 break;
1248 1245
1249 case ICAL_CLASS_PROPERTY: { 1246 case ICAL_CLASS_PROPERTY: {
1250 int inttext = icalproperty_get_class(p); 1247 int inttext = icalproperty_get_class(p);
1251 if (inttext == ICAL_CLASS_PUBLIC ) { 1248 if (inttext == ICAL_CLASS_PUBLIC ) {
1252 incidence->setSecrecy(Incidence::SecrecyPublic); 1249 incidence->setSecrecy(Incidence::SecrecyPublic);
1253 } else if (inttext == ICAL_CLASS_CONFIDENTIAL ) { 1250 } else if (inttext == ICAL_CLASS_CONFIDENTIAL ) {
1254 incidence->setSecrecy(Incidence::SecrecyConfidential); 1251 incidence->setSecrecy(Incidence::SecrecyConfidential);
1255 } else { 1252 } else {
1256 incidence->setSecrecy(Incidence::SecrecyPrivate); 1253 incidence->setSecrecy(Incidence::SecrecyPrivate);
1257 } 1254 }
1258 } 1255 }
1259 break; 1256 break;
1260 1257
1261 case ICAL_ATTACH_PROPERTY: // attachments 1258 case ICAL_ATTACH_PROPERTY: // attachments
1262 incidence->addAttachment(readAttachment(p)); 1259 incidence->addAttachment(readAttachment(p));
1263 break; 1260 break;
1264 1261
1265 default: 1262 default:
1266// kdDebug(5800) << "ICALFormat::readIncidence(): Unknown property: " << kind 1263// kdDebug(5800) << "ICALFormat::readIncidence(): Unknown property: " << kind
1267// << endl; 1264// << endl;
1268 break; 1265 break;
1269 } 1266 }
1270 1267
1271 p = icalcomponent_get_next_property(parent,ICAL_ANY_PROPERTY); 1268 p = icalcomponent_get_next_property(parent,ICAL_ANY_PROPERTY);
1272 } 1269 }
1273 if ( readrec ) { 1270 if ( readrec ) {
1274 readRecurrenceRule(rectype,incidence); 1271 readRecurrenceRule(rectype,incidence);
1275 } 1272 }
1276 // kpilot stuff 1273 // kpilot stuff
1277// TODO: move this application-specific code to kpilot 1274// TODO: move this application-specific code to kpilot
1278 QString kp = incidence->nonKDECustomProperty("X-PILOTID"); 1275 QString kp = incidence->nonKDECustomProperty("X-PILOTID");
1279 if (!kp.isNull()) { 1276 if (!kp.isNull()) {
1280 incidence->setPilotId(kp.toInt()); 1277 incidence->setPilotId(kp.toInt());
1281 } 1278 }
1282 kp = incidence->nonKDECustomProperty("X-PILOTSTAT"); 1279 kp = incidence->nonKDECustomProperty("X-PILOTSTAT");
1283 if (!kp.isNull()) { 1280 if (!kp.isNull()) {
1284 incidence->setSyncStatus(kp.toInt()); 1281 incidence->setSyncStatus(kp.toInt());
1285 } 1282 }
1286 kp = incidence->nonKDECustomProperty("X-ZAURUSID"); 1283 kp = incidence->nonKDECustomProperty("X-ZAURUSID");
1287 if (!kp.isNull()) { 1284 if (!kp.isNull()) {
1288 incidence->setZaurusId(kp.toInt()); 1285 incidence->setZaurusId(kp.toInt());
1289 } 1286 }
1290 1287
1291 kp = incidence->nonKDECustomProperty("X-ZAURUSUID"); 1288 kp = incidence->nonKDECustomProperty("X-ZAURUSUID");
1292 if (!kp.isNull()) { 1289 if (!kp.isNull()) {
1293 incidence->setZaurusUid(kp.toInt()); 1290 incidence->setZaurusUid(kp.toInt());
1294 } 1291 }
1295 1292
1296 kp = incidence->nonKDECustomProperty("X-ZAURUSSTAT");
1297 if (!kp.isNull()) {
1298 incidence->setZaurusStat(kp.toInt());
1299 }
1300
1301 // Cancel backwards compatibility mode for subsequent changes by the application 1293 // Cancel backwards compatibility mode for subsequent changes by the application
1302 incidence->recurrence()->setCompatVersion(); 1294 incidence->recurrence()->setCompatVersion();
1303 1295
1304 // add categories 1296 // add categories
1305 incidence->setCategories(categories); 1297 incidence->setCategories(categories);
1306 1298
1307 // iterate through all alarms 1299 // iterate through all alarms
1308 for (icalcomponent *alarm = icalcomponent_get_first_component(parent,ICAL_VALARM_COMPONENT); 1300 for (icalcomponent *alarm = icalcomponent_get_first_component(parent,ICAL_VALARM_COMPONENT);
1309 alarm; 1301 alarm;
1310 alarm = icalcomponent_get_next_component(parent,ICAL_VALARM_COMPONENT)) { 1302 alarm = icalcomponent_get_next_component(parent,ICAL_VALARM_COMPONENT)) {
1311 readAlarm(alarm,incidence); 1303 readAlarm(alarm,incidence);
1312 } 1304 }
1313} 1305}
1314 1306
1315void ICalFormatImpl::readIncidenceBase(icalcomponent *parent,IncidenceBase *incidenceBase) 1307void ICalFormatImpl::readIncidenceBase(icalcomponent *parent,IncidenceBase *incidenceBase)
1316{ 1308{
1317 icalproperty *p = icalcomponent_get_first_property(parent,ICAL_ANY_PROPERTY); 1309 icalproperty *p = icalcomponent_get_first_property(parent,ICAL_ANY_PROPERTY);
1318 1310
1319 while (p) { 1311 while (p) {
1320 icalproperty_kind kind = icalproperty_isa(p); 1312 icalproperty_kind kind = icalproperty_isa(p);
1321 switch (kind) { 1313 switch (kind) {
1322 1314
1323 case ICAL_UID_PROPERTY: // unique id 1315 case ICAL_UID_PROPERTY: // unique id
1324 incidenceBase->setUid(QString::fromUtf8(icalproperty_get_uid(p))); 1316 incidenceBase->setUid(QString::fromUtf8(icalproperty_get_uid(p)));
1325 break; 1317 break;
1326 1318
1327 case ICAL_ORGANIZER_PROPERTY: // organizer 1319 case ICAL_ORGANIZER_PROPERTY: // organizer
1328 incidenceBase->setOrganizer(QString::fromUtf8(icalproperty_get_organizer(p))); 1320 incidenceBase->setOrganizer(QString::fromUtf8(icalproperty_get_organizer(p)));
1329 break; 1321 break;
1330 1322
1331 case ICAL_ATTENDEE_PROPERTY: // attendee 1323 case ICAL_ATTENDEE_PROPERTY: // attendee
1332 incidenceBase->addAttendee(readAttendee(p)); 1324 incidenceBase->addAttendee(readAttendee(p));
1333 break; 1325 break;
1334 1326
1335 default: 1327 default:
1336 break; 1328 break;
1337 } 1329 }
1338 1330
1339 p = icalcomponent_get_next_property(parent,ICAL_ANY_PROPERTY); 1331 p = icalcomponent_get_next_property(parent,ICAL_ANY_PROPERTY);
1340 } 1332 }
1341 1333
1342 // custom properties 1334 // custom properties
1343 readCustomProperties(parent, incidenceBase); 1335 readCustomProperties(parent, incidenceBase);
1344} 1336}
1345 1337
1346void ICalFormatImpl::readCustomProperties(icalcomponent *parent,CustomProperties *properties) 1338void ICalFormatImpl::readCustomProperties(icalcomponent *parent,CustomProperties *properties)
1347{ 1339{
1348 QMap<QCString, QString> customProperties; 1340 QMap<QCString, QString> customProperties;
1349 1341
1350 icalproperty *p = icalcomponent_get_first_property(parent,ICAL_X_PROPERTY); 1342 icalproperty *p = icalcomponent_get_first_property(parent,ICAL_X_PROPERTY);
1351 1343
1352 while (p) { 1344 while (p) {
1353 QString value = QString::fromUtf8(icalproperty_get_x(p)); 1345 QString value = QString::fromUtf8(icalproperty_get_x(p));
1354 customProperties[icalproperty_get_x_name(p)] = value; 1346 customProperties[icalproperty_get_x_name(p)] = value;
1355 //qDebug("ICalFormatImpl::readCustomProperties %s %s",value.latin1(), icalproperty_get_x_name(p) ); 1347 //qDebug("ICalFormatImpl::readCustomProperties %s %s",value.latin1(), icalproperty_get_x_name(p) );
1356 1348
1357 p = icalcomponent_get_next_property(parent,ICAL_X_PROPERTY); 1349 p = icalcomponent_get_next_property(parent,ICAL_X_PROPERTY);
1358 } 1350 }
1359 1351
1360 properties->setCustomProperties(customProperties); 1352 properties->setCustomProperties(customProperties);
1361} 1353}
1362 1354
1363void ICalFormatImpl::readRecurrenceRule(struct icalrecurrencetype rrule,Incidence *incidence) 1355void ICalFormatImpl::readRecurrenceRule(struct icalrecurrencetype rrule,Incidence *incidence)
1364{ 1356{
1365// kdDebug(5800) << "Read recurrence for " << incidence->summary() << endl; 1357// kdDebug(5800) << "Read recurrence for " << incidence->summary() << endl;
1366 1358
1367 Recurrence *recur = incidence->recurrence(); 1359 Recurrence *recur = incidence->recurrence();
1368 recur->setCompatVersion(mCalendarVersion); 1360 recur->setCompatVersion(mCalendarVersion);
1369 recur->unsetRecurs(); 1361 recur->unsetRecurs();
1370 1362
1371 struct icalrecurrencetype r = rrule; 1363 struct icalrecurrencetype r = rrule;
1372 1364
1373 dumpIcalRecurrence(r); 1365 dumpIcalRecurrence(r);
1374 readRecurrence( r, recur, incidence); 1366 readRecurrence( r, recur, incidence);
1375} 1367}
1376 1368
1377void ICalFormatImpl::readRecurrence( const struct icalrecurrencetype &r, Recurrence* recur, Incidence *incidence) 1369void ICalFormatImpl::readRecurrence( const struct icalrecurrencetype &r, Recurrence* recur, Incidence *incidence)
1378{ 1370{
1379 int wkst; 1371 int wkst;
1380 int index = 0; 1372 int index = 0;
1381 short day = 0; 1373 short day = 0;
1382 QBitArray qba(7); 1374 QBitArray qba(7);
1383 int frequ = r.freq; 1375 int frequ = r.freq;
1384 int interv = r.interval; 1376 int interv = r.interval;
1385 // preprocessing for odd recurrence definitions 1377 // preprocessing for odd recurrence definitions
1386 1378
1387 if ( r.freq == ICAL_MONTHLY_RECURRENCE ) { 1379 if ( r.freq == ICAL_MONTHLY_RECURRENCE ) {
1388 if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX) { 1380 if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX) {
1389 interv = 12; 1381 interv = 12;
1390 } 1382 }
1391 } 1383 }
1392 if ( r.freq == ICAL_YEARLY_RECURRENCE ) { 1384 if ( r.freq == ICAL_YEARLY_RECURRENCE ) {
1393 if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX && r.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX ) { 1385 if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX && r.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX ) {
1394 frequ = ICAL_MONTHLY_RECURRENCE; 1386 frequ = ICAL_MONTHLY_RECURRENCE;
1395 interv = 12* r.interval; 1387 interv = 12* r.interval;
1396 } 1388 }
1397 } 1389 }
1398 1390
1399 switch (frequ) { 1391 switch (frequ) {
1400 case ICAL_MINUTELY_RECURRENCE: 1392 case ICAL_MINUTELY_RECURRENCE:
1401 if (!icaltime_is_null_time(r.until)) { 1393 if (!icaltime_is_null_time(r.until)) {
1402 recur->setMinutely(interv,readICalDateTime(r.until)); 1394 recur->setMinutely(interv,readICalDateTime(r.until));
1403 } else { 1395 } else {
1404 if (r.count == 0) 1396 if (r.count == 0)
1405 recur->setMinutely(interv,-1); 1397 recur->setMinutely(interv,-1);
1406 else 1398 else
1407 recur->setMinutely(interv,r.count); 1399 recur->setMinutely(interv,r.count);
1408 } 1400 }
1409 break; 1401 break;
1410 case ICAL_HOURLY_RECURRENCE: 1402 case ICAL_HOURLY_RECURRENCE:
1411 if (!icaltime_is_null_time(r.until)) { 1403 if (!icaltime_is_null_time(r.until)) {
1412 recur->setHourly(interv,readICalDateTime(r.until)); 1404 recur->setHourly(interv,readICalDateTime(r.until));
1413 } else { 1405 } else {
1414 if (r.count == 0) 1406 if (r.count == 0)
1415 recur->setHourly(interv,-1); 1407 recur->setHourly(interv,-1);
1416 else 1408 else
1417 recur->setHourly(interv,r.count); 1409 recur->setHourly(interv,r.count);
1418 } 1410 }
1419 break; 1411 break;
1420 case ICAL_DAILY_RECURRENCE: 1412 case ICAL_DAILY_RECURRENCE:
1421 if (!icaltime_is_null_time(r.until)) { 1413 if (!icaltime_is_null_time(r.until)) {
1422 recur->setDaily(interv,readICalDate(r.until)); 1414 recur->setDaily(interv,readICalDate(r.until));
1423 } else { 1415 } else {
1424 if (r.count == 0) 1416 if (r.count == 0)
1425 recur->setDaily(interv,-1); 1417 recur->setDaily(interv,-1);
1426 else 1418 else
1427 recur->setDaily(interv,r.count); 1419 recur->setDaily(interv,r.count);
1428 } 1420 }
1429 break; 1421 break;
1430 case ICAL_WEEKLY_RECURRENCE: 1422 case ICAL_WEEKLY_RECURRENCE:
1431 // kdDebug(5800) << "WEEKLY_RECURRENCE" << endl; 1423 // kdDebug(5800) << "WEEKLY_RECURRENCE" << endl;
1432 wkst = (r.week_start + 5)%7 + 1; 1424 wkst = (r.week_start + 5)%7 + 1;
1433 if (!icaltime_is_null_time(r.until)) { 1425 if (!icaltime_is_null_time(r.until)) {
1434 recur->setWeekly(interv,qba,readICalDate(r.until),wkst); 1426 recur->setWeekly(interv,qba,readICalDate(r.until),wkst);
1435 } else { 1427 } else {
1436 if (r.count == 0) 1428 if (r.count == 0)
1437 recur->setWeekly(interv,qba,-1,wkst); 1429 recur->setWeekly(interv,qba,-1,wkst);
1438 else 1430 else
1439 recur->setWeekly(interv,qba,r.count,wkst); 1431 recur->setWeekly(interv,qba,r.count,wkst);
1440 } 1432 }
1441 if ( r.by_day[0] == ICAL_RECURRENCE_ARRAY_MAX) { 1433 if ( r.by_day[0] == ICAL_RECURRENCE_ARRAY_MAX) {
1442 int wday = incidence->dtStart().date().dayOfWeek ()-1; 1434 int wday = incidence->dtStart().date().dayOfWeek ()-1;
1443 //qDebug("weekly error found "); 1435 //qDebug("weekly error found ");
1444 qba.setBit(wday); 1436 qba.setBit(wday);
1445 } else { 1437 } else {
1446 while((day = r.by_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { 1438 while((day = r.by_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) {
1447 // kdDebug(5800) << " " << day << endl; 1439 // kdDebug(5800) << " " << day << endl;
1448 qba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0 1440 qba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0
1449 } 1441 }
1450 } 1442 }
1451 break; 1443 break;
1452 case ICAL_MONTHLY_RECURRENCE: 1444 case ICAL_MONTHLY_RECURRENCE:
1453 1445
1454 if (r.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX) { 1446 if (r.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX) {
1455 if (!icaltime_is_null_time(r.until)) { 1447 if (!icaltime_is_null_time(r.until)) {
1456 recur->setMonthly(Recurrence::rMonthlyPos,interv, 1448 recur->setMonthly(Recurrence::rMonthlyPos,interv,
1457 readICalDate(r.until)); 1449 readICalDate(r.until));
1458 } else { 1450 } else {
1459 if (r.count == 0) 1451 if (r.count == 0)
1460 recur->setMonthly(Recurrence::rMonthlyPos,interv,-1); 1452 recur->setMonthly(Recurrence::rMonthlyPos,interv,-1);
1461 else 1453 else
1462 recur->setMonthly(Recurrence::rMonthlyPos,interv,r.count); 1454 recur->setMonthly(Recurrence::rMonthlyPos,interv,r.count);
1463 } 1455 }
1464 bool useSetPos = false; 1456 bool useSetPos = false;
1465 short pos = 0; 1457 short pos = 0;
1466 while((day = r.by_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { 1458 while((day = r.by_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) {
1467 // kdDebug(5800) << "----a " << index << ": " << day << endl; 1459 // kdDebug(5800) << "----a " << index << ": " << day << endl;
1468 pos = icalrecurrencetype_day_position(day); 1460 pos = icalrecurrencetype_day_position(day);
1469 if (pos) { 1461 if (pos) {
1470 day = icalrecurrencetype_day_day_of_week(day); 1462 day = icalrecurrencetype_day_day_of_week(day);
1471 QBitArray ba(7); // don't wipe qba 1463 QBitArray ba(7); // don't wipe qba
1472 ba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0 1464 ba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0
1473 recur->addMonthlyPos(pos,ba); 1465 recur->addMonthlyPos(pos,ba);
1474 } else { 1466 } else {
1475 qba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0 1467 qba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0
1476 useSetPos = true; 1468 useSetPos = true;
1477 } 1469 }
1478 } 1470 }
1479 if (useSetPos) { 1471 if (useSetPos) {
1480 if (r.by_set_pos[0] != ICAL_RECURRENCE_ARRAY_MAX) { 1472 if (r.by_set_pos[0] != ICAL_RECURRENCE_ARRAY_MAX) {
1481 recur->addMonthlyPos(r.by_set_pos[0],qba); 1473 recur->addMonthlyPos(r.by_set_pos[0],qba);
1482 } 1474 }
1483 } 1475 }
1484 } else if (r.by_month_day[0] != ICAL_RECURRENCE_ARRAY_MAX) { 1476 } else if (r.by_month_day[0] != ICAL_RECURRENCE_ARRAY_MAX) {
1485 if (!icaltime_is_null_time(r.until)) { 1477 if (!icaltime_is_null_time(r.until)) {
1486 recur->setMonthly(Recurrence::rMonthlyDay,interv, 1478 recur->setMonthly(Recurrence::rMonthlyDay,interv,
1487 readICalDate(r.until)); 1479 readICalDate(r.until));
1488 } else { 1480 } else {
1489 if (r.count == 0) 1481 if (r.count == 0)
1490 recur->setMonthly(Recurrence::rMonthlyDay,interv,-1); 1482 recur->setMonthly(Recurrence::rMonthlyDay,interv,-1);
1491 else 1483 else
1492 recur->setMonthly(Recurrence::rMonthlyDay,interv,r.count); 1484 recur->setMonthly(Recurrence::rMonthlyDay,interv,r.count);
1493 } 1485 }
1494 while((day = r.by_month_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { 1486 while((day = r.by_month_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) {
1495 // kdDebug(5800) << "----b " << day << endl; 1487 // kdDebug(5800) << "----b " << day << endl;
1496 recur->addMonthlyDay(day); 1488 recur->addMonthlyDay(day);
1497 } 1489 }
1498 } 1490 }
1499 break; 1491 break;
1500 case ICAL_YEARLY_RECURRENCE: 1492 case ICAL_YEARLY_RECURRENCE:
1501 if (r.by_year_day[0] != ICAL_RECURRENCE_ARRAY_MAX) { 1493 if (r.by_year_day[0] != ICAL_RECURRENCE_ARRAY_MAX) {
1502 //qDebug(" YEARLY DAY OF YEAR"); 1494 //qDebug(" YEARLY DAY OF YEAR");
1503 if (!icaltime_is_null_time(r.until)) { 1495 if (!icaltime_is_null_time(r.until)) {
1504 recur->setYearly(Recurrence::rYearlyDay,interv, 1496 recur->setYearly(Recurrence::rYearlyDay,interv,
1505 readICalDate(r.until)); 1497 readICalDate(r.until));
1506 } else { 1498 } else {
1507 if (r.count == 0) 1499 if (r.count == 0)
1508 recur->setYearly(Recurrence::rYearlyDay,interv,-1); 1500 recur->setYearly(Recurrence::rYearlyDay,interv,-1);
1509 else 1501 else
1510 recur->setYearly(Recurrence::rYearlyDay,interv,r.count); 1502 recur->setYearly(Recurrence::rYearlyDay,interv,r.count);
1511 } 1503 }
1512 while((day = r.by_year_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { 1504 while((day = r.by_year_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) {
1513 recur->addYearlyNum(day); 1505 recur->addYearlyNum(day);
1514 } 1506 }
1515 } else if ( true /*r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX*/) { 1507 } else if ( true /*r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX*/) {
1516 if (r.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX) { 1508 if (r.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX) {
1517 qDebug("YEARLY POS NOT SUPPORTED BY GUI"); 1509 qDebug("YEARLY POS NOT SUPPORTED BY GUI");
1518 if (!icaltime_is_null_time(r.until)) { 1510 if (!icaltime_is_null_time(r.until)) {
1519 recur->setYearly(Recurrence::rYearlyPos,interv, 1511 recur->setYearly(Recurrence::rYearlyPos,interv,
1520 readICalDate(r.until)); 1512 readICalDate(r.until));
1521 } else { 1513 } else {
1522 if (r.count == 0) 1514 if (r.count == 0)
1523 recur->setYearly(Recurrence::rYearlyPos,interv,-1); 1515 recur->setYearly(Recurrence::rYearlyPos,interv,-1);
1524 else 1516 else
1525 recur->setYearly(Recurrence::rYearlyPos,interv,r.count); 1517 recur->setYearly(Recurrence::rYearlyPos,interv,r.count);
1526 } 1518 }
1527 bool useSetPos = false; 1519 bool useSetPos = false;
1528 short pos = 0; 1520 short pos = 0;
1529 while((day = r.by_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { 1521 while((day = r.by_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) {
1530 // kdDebug(5800) << "----a " << index << ": " << day << endl; 1522 // kdDebug(5800) << "----a " << index << ": " << day << endl;
1531 pos = icalrecurrencetype_day_position(day); 1523 pos = icalrecurrencetype_day_position(day);
1532 if (pos) { 1524 if (pos) {
1533 day = icalrecurrencetype_day_day_of_week(day); 1525 day = icalrecurrencetype_day_day_of_week(day);
1534 QBitArray ba(7); // don't wipe qba 1526 QBitArray ba(7); // don't wipe qba
1535 ba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0 1527 ba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0
1536 recur->addYearlyMonthPos(pos,ba); 1528 recur->addYearlyMonthPos(pos,ba);
1537 } else { 1529 } else {
1538 qba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0 1530 qba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0
1539 useSetPos = true; 1531 useSetPos = true;
1540 } 1532 }
1541 } 1533 }
1542 if (useSetPos) { 1534 if (useSetPos) {
1543 if (r.by_set_pos[0] != ICAL_RECURRENCE_ARRAY_MAX) { 1535 if (r.by_set_pos[0] != ICAL_RECURRENCE_ARRAY_MAX) {
1544 recur->addYearlyMonthPos(r.by_set_pos[0],qba); 1536 recur->addYearlyMonthPos(r.by_set_pos[0],qba);
1545 } 1537 }
1546 } 1538 }
1547 } else { 1539 } else {
1548 //qDebug("YEARLY MONTH "); 1540 //qDebug("YEARLY MONTH ");
1549 if (!icaltime_is_null_time(r.until)) { 1541 if (!icaltime_is_null_time(r.until)) {
1550 recur->setYearly(Recurrence::rYearlyMonth,interv, 1542 recur->setYearly(Recurrence::rYearlyMonth,interv,
1551 readICalDate(r.until)); 1543 readICalDate(r.until));
1552 } else { 1544 } else {
1553 if (r.count == 0) 1545 if (r.count == 0)
1554 recur->setYearly(Recurrence::rYearlyMonth,interv,-1); 1546 recur->setYearly(Recurrence::rYearlyMonth,interv,-1);
1555 else 1547 else
1556 recur->setYearly(Recurrence::rYearlyMonth,interv,r.count); 1548 recur->setYearly(Recurrence::rYearlyMonth,interv,r.count);
1557 } 1549 }
1558 if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX ) { 1550 if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX ) {
1559 index = 0; 1551 index = 0;
1560 while((day = r.by_month[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { 1552 while((day = r.by_month[index++]) != ICAL_RECURRENCE_ARRAY_MAX) {
1561 recur->addYearlyNum(day); 1553 recur->addYearlyNum(day);
1562 } 1554 }
1563 } else { 1555 } else {
1564 recur->addYearlyNum(incidence->dtStart().date().month()); 1556 recur->addYearlyNum(incidence->dtStart().date().month());
1565 } 1557 }
1566 } 1558 }
1567 1559
1568 } 1560 }
1569 break; 1561 break;
1570 default: 1562 default:
1571 ; 1563 ;
1572 break; 1564 break;
1573 } 1565 }
1574} 1566}
1575 1567
1576void ICalFormatImpl::readAlarm(icalcomponent *alarm,Incidence *incidence) 1568void ICalFormatImpl::readAlarm(icalcomponent *alarm,Incidence *incidence)
1577{ 1569{
1578 //kdDebug(5800) << "Read alarm for " << incidence->summary() << endl; 1570 //kdDebug(5800) << "Read alarm for " << incidence->summary() << endl;
1579 1571
1580 Alarm* ialarm = incidence->newAlarm(); 1572 Alarm* ialarm = incidence->newAlarm();
1581 ialarm->setRepeatCount(0); 1573 ialarm->setRepeatCount(0);
1582 ialarm->setEnabled(true); 1574 ialarm->setEnabled(true);
1583 1575
1584 // Determine the alarm's action type 1576 // Determine the alarm's action type
1585 icalproperty *p = icalcomponent_get_first_property(alarm,ICAL_ACTION_PROPERTY); 1577 icalproperty *p = icalcomponent_get_first_property(alarm,ICAL_ACTION_PROPERTY);
1586 if ( !p ) { 1578 if ( !p ) {
1587 return; 1579 return;
1588 } 1580 }
1589 1581
1590 icalproperty_action action = icalproperty_get_action(p); 1582 icalproperty_action action = icalproperty_get_action(p);
1591 Alarm::Type type = Alarm::Display; 1583 Alarm::Type type = Alarm::Display;
1592 switch ( action ) { 1584 switch ( action ) {
1593 case ICAL_ACTION_DISPLAY: type = Alarm::Display; break; 1585 case ICAL_ACTION_DISPLAY: type = Alarm::Display; break;
1594 case ICAL_ACTION_AUDIO: type = Alarm::Audio; break; 1586 case ICAL_ACTION_AUDIO: type = Alarm::Audio; break;
1595 case ICAL_ACTION_PROCEDURE: type = Alarm::Procedure; break; 1587 case ICAL_ACTION_PROCEDURE: type = Alarm::Procedure; break;
1596 case ICAL_ACTION_EMAIL: type = Alarm::Email; break; 1588 case ICAL_ACTION_EMAIL: type = Alarm::Email; break;
1597 default: 1589 default:
1598 ; 1590 ;
1599 return; 1591 return;
1600 } 1592 }
1601 ialarm->setType(type); 1593 ialarm->setType(type);
1602 1594
1603 p = icalcomponent_get_first_property(alarm,ICAL_ANY_PROPERTY); 1595 p = icalcomponent_get_first_property(alarm,ICAL_ANY_PROPERTY);
1604 while (p) { 1596 while (p) {
1605 icalproperty_kind kind = icalproperty_isa(p); 1597 icalproperty_kind kind = icalproperty_isa(p);
1606 1598
1607 switch (kind) { 1599 switch (kind) {
1608 case ICAL_TRIGGER_PROPERTY: { 1600 case ICAL_TRIGGER_PROPERTY: {
1609 icaltriggertype trigger = icalproperty_get_trigger(p); 1601 icaltriggertype trigger = icalproperty_get_trigger(p);
1610 if (icaltime_is_null_time(trigger.time)) { 1602 if (icaltime_is_null_time(trigger.time)) {
1611 if (icaldurationtype_is_null_duration(trigger.duration)) { 1603 if (icaldurationtype_is_null_duration(trigger.duration)) {
1612 kdDebug(5800) << "ICalFormatImpl::readAlarm(): Trigger has no time and no duration." << endl; 1604 kdDebug(5800) << "ICalFormatImpl::readAlarm(): Trigger has no time and no duration." << endl;
1613 } else { 1605 } else {
1614 Duration duration = icaldurationtype_as_int( trigger.duration ); 1606 Duration duration = icaldurationtype_as_int( trigger.duration );
1615 icalparameter *param = icalproperty_get_first_parameter(p,ICAL_RELATED_PARAMETER); 1607 icalparameter *param = icalproperty_get_first_parameter(p,ICAL_RELATED_PARAMETER);
1616 if (param && icalparameter_get_related(param) == ICAL_RELATED_END) 1608 if (param && icalparameter_get_related(param) == ICAL_RELATED_END)
1617 ialarm->setEndOffset(duration); 1609 ialarm->setEndOffset(duration);
1618 else 1610 else
1619 ialarm->setStartOffset(duration); 1611 ialarm->setStartOffset(duration);
1620 } 1612 }
1621 } else { 1613 } else {
1622 ialarm->setTime(readICalDateTime(trigger.time)); 1614 ialarm->setTime(readICalDateTime(trigger.time));
1623 } 1615 }
1624 break; 1616 break;
1625 } 1617 }
1626 case ICAL_DURATION_PROPERTY: { 1618 case ICAL_DURATION_PROPERTY: {
1627 icaldurationtype duration = icalproperty_get_duration(p); 1619 icaldurationtype duration = icalproperty_get_duration(p);
1628 ialarm->setSnoozeTime(icaldurationtype_as_int(duration)/60); 1620 ialarm->setSnoozeTime(icaldurationtype_as_int(duration)/60);
1629 break; 1621 break;
1630 } 1622 }
1631 case ICAL_REPEAT_PROPERTY: 1623 case ICAL_REPEAT_PROPERTY:
1632 ialarm->setRepeatCount(icalproperty_get_repeat(p)); 1624 ialarm->setRepeatCount(icalproperty_get_repeat(p));
1633 break; 1625 break;
1634 1626
1635 // Only in DISPLAY and EMAIL and PROCEDURE alarms 1627 // Only in DISPLAY and EMAIL and PROCEDURE alarms
1636 case ICAL_DESCRIPTION_PROPERTY: { 1628 case ICAL_DESCRIPTION_PROPERTY: {
1637 QString description = QString::fromUtf8(icalproperty_get_description(p)); 1629 QString description = QString::fromUtf8(icalproperty_get_description(p));
1638 switch ( action ) { 1630 switch ( action ) {
1639 case ICAL_ACTION_DISPLAY: 1631 case ICAL_ACTION_DISPLAY:
1640 ialarm->setText( description ); 1632 ialarm->setText( description );
1641 break; 1633 break;
1642 case ICAL_ACTION_PROCEDURE: 1634 case ICAL_ACTION_PROCEDURE:
1643 ialarm->setProgramArguments( description ); 1635 ialarm->setProgramArguments( description );
1644 break; 1636 break;
1645 case ICAL_ACTION_EMAIL: 1637 case ICAL_ACTION_EMAIL:
1646 ialarm->setMailText( description ); 1638 ialarm->setMailText( description );
1647 break; 1639 break;
1648 default: 1640 default:
1649 break; 1641 break;
1650 } 1642 }
1651 break; 1643 break;
1652 } 1644 }
1653 // Only in EMAIL alarm 1645 // Only in EMAIL alarm
1654 case ICAL_SUMMARY_PROPERTY: 1646 case ICAL_SUMMARY_PROPERTY:
1655 ialarm->setMailSubject(QString::fromUtf8(icalproperty_get_summary(p))); 1647 ialarm->setMailSubject(QString::fromUtf8(icalproperty_get_summary(p)));
1656 break; 1648 break;
1657 1649
1658 // Only in EMAIL alarm 1650 // Only in EMAIL alarm
1659 case ICAL_ATTENDEE_PROPERTY: { 1651 case ICAL_ATTENDEE_PROPERTY: {
1660 QString email = QString::fromUtf8(icalproperty_get_attendee(p)); 1652 QString email = QString::fromUtf8(icalproperty_get_attendee(p));
1661 QString name; 1653 QString name;
1662 icalparameter *param = icalproperty_get_first_parameter(p,ICAL_CN_PARAMETER); 1654 icalparameter *param = icalproperty_get_first_parameter(p,ICAL_CN_PARAMETER);
1663 if (param) { 1655 if (param) {
1664 name = QString::fromUtf8(icalparameter_get_cn(param)); 1656 name = QString::fromUtf8(icalparameter_get_cn(param));
1665 } 1657 }
1666 ialarm->addMailAddress(Person(name, email)); 1658 ialarm->addMailAddress(Person(name, email));
1667 break; 1659 break;
1668 } 1660 }
1669 // Only in AUDIO and EMAIL and PROCEDURE alarms 1661 // Only in AUDIO and EMAIL and PROCEDURE alarms
1670 case ICAL_ATTACH_PROPERTY: { 1662 case ICAL_ATTACH_PROPERTY: {
1671 icalattach *attach = icalproperty_get_attach(p); 1663 icalattach *attach = icalproperty_get_attach(p);
1672 QString url = QFile::decodeName(icalattach_get_url(attach)); 1664 QString url = QFile::decodeName(icalattach_get_url(attach));
1673 switch ( action ) { 1665 switch ( action ) {
1674 case ICAL_ACTION_AUDIO: 1666 case ICAL_ACTION_AUDIO:
1675 ialarm->setAudioFile( url ); 1667 ialarm->setAudioFile( url );
1676 break; 1668 break;
1677 case ICAL_ACTION_PROCEDURE: 1669 case ICAL_ACTION_PROCEDURE:
1678 ialarm->setProgramFile( url ); 1670 ialarm->setProgramFile( url );
1679 break; 1671 break;
1680 case ICAL_ACTION_EMAIL: 1672 case ICAL_ACTION_EMAIL:
1681 ialarm->addMailAttachment( url ); 1673 ialarm->addMailAttachment( url );
1682 break; 1674 break;
1683 default: 1675 default:
1684 break; 1676 break;
1685 } 1677 }
1686 break; 1678 break;
1687 } 1679 }
1688 default: 1680 default:
1689 break; 1681 break;
1690 } 1682 }
1691 1683
1692 p = icalcomponent_get_next_property(alarm,ICAL_ANY_PROPERTY); 1684 p = icalcomponent_get_next_property(alarm,ICAL_ANY_PROPERTY);
1693 } 1685 }
1694 1686
1695 // custom properties 1687 // custom properties
1696 readCustomProperties(alarm, ialarm); 1688 readCustomProperties(alarm, ialarm);
1697 1689
1698 // TODO: check for consistency of alarm properties 1690 // TODO: check for consistency of alarm properties
1699} 1691}
1700 1692
1701icaltimetype ICalFormatImpl::writeICalDate(const QDate &date) 1693icaltimetype ICalFormatImpl::writeICalDate(const QDate &date)
1702{ 1694{
1703 icaltimetype t; 1695 icaltimetype t;
1704 1696
1705 t.year = date.year(); 1697 t.year = date.year();
1706 t.month = date.month(); 1698 t.month = date.month();
1707 t.day = date.day(); 1699 t.day = date.day();
1708 1700
1709 t.hour = 0; 1701 t.hour = 0;
1710 t.minute = 0; 1702 t.minute = 0;
1711 t.second = 0; 1703 t.second = 0;
1712 1704
1713 t.is_date = 1; 1705 t.is_date = 1;
1714 1706
1715 t.is_utc = 0; 1707 t.is_utc = 0;
1716 1708
1717 t.zone = 0; 1709 t.zone = 0;
1718 1710
1719 return t; 1711 return t;
1720} 1712}
1721 1713
1722icaltimetype ICalFormatImpl::writeICalDateTime(const QDateTime &dt ) 1714icaltimetype ICalFormatImpl::writeICalDateTime(const QDateTime &dt )
1723{ 1715{
1724 icaltimetype t; 1716 icaltimetype t;
1725 t.is_date = 0; 1717 t.is_date = 0;
1726 t.zone = 0; 1718 t.zone = 0;
1727 QDateTime datetime; 1719 QDateTime datetime;
1728 if ( mParent->utc() ) { 1720 if ( mParent->utc() ) {
1729 int offset = KGlobal::locale()->localTimeOffset( dt ); 1721 int offset = KGlobal::locale()->localTimeOffset( dt );
1730 datetime = dt.addSecs ( -offset*60); 1722 datetime = dt.addSecs ( -offset*60);
1731 t.is_utc = 1; 1723 t.is_utc = 1;
1732 } 1724 }
1733 else { 1725 else {
1734 datetime = dt; 1726 datetime = dt;
1735 t.is_utc = 0; 1727 t.is_utc = 0;
1736 1728
1737 } 1729 }
1738 t.year = datetime.date().year(); 1730 t.year = datetime.date().year();
1739 t.month = datetime.date().month(); 1731 t.month = datetime.date().month();
1740 t.day = datetime.date().day(); 1732 t.day = datetime.date().day();
1741 1733
1742 t.hour = datetime.time().hour(); 1734 t.hour = datetime.time().hour();
1743 t.minute = datetime.time().minute(); 1735 t.minute = datetime.time().minute();
1744 t.second = datetime.time().second(); 1736 t.second = datetime.time().second();
1745 1737
1746 //qDebug("*** time %s localtime %s ",dt .toString().latin1() ,datetime .toString().latin1() ); 1738 //qDebug("*** time %s localtime %s ",dt .toString().latin1() ,datetime .toString().latin1() );
1747 1739
1748// if ( mParent->utc() ) { 1740// if ( mParent->utc() ) {
1749// datetime = KGlobal::locale()->localTime( dt ); 1741// datetime = KGlobal::locale()->localTime( dt );
1750// qDebug("*** time %s localtime %s ",dt .toString().latin1() ,datetime .toString().latin1() ); 1742// qDebug("*** time %s localtime %s ",dt .toString().latin1() ,datetime .toString().latin1() );
1751// if (mParent->timeZoneId().isEmpty()) 1743// if (mParent->timeZoneId().isEmpty())
1752// t = icaltime_as_utc(t, 0); 1744// t = icaltime_as_utc(t, 0);
1753// else 1745// else
1754// t = icaltime_as_utc(t,mParent->timeZoneId().local8Bit()); 1746// t = icaltime_as_utc(t,mParent->timeZoneId().local8Bit());
1755// } 1747// }
1756 1748
1757 return t; 1749 return t;
1758} 1750}
1759 1751
1760QDateTime ICalFormatImpl::readICalDateTime(icaltimetype t) 1752QDateTime ICalFormatImpl::readICalDateTime(icaltimetype t)
1761{ 1753{
1762 QDateTime dt (QDate(t.year,t.month,t.day), 1754 QDateTime dt (QDate(t.year,t.month,t.day),
1763 QTime(t.hour,t.minute,t.second) ); 1755 QTime(t.hour,t.minute,t.second) );
1764 1756
1765 if (t.is_utc) { 1757 if (t.is_utc) {
1766 int offset = KGlobal::locale()->localTimeOffset( dt ); 1758 int offset = KGlobal::locale()->localTimeOffset( dt );
1767 dt = dt.addSecs ( offset*60); 1759 dt = dt.addSecs ( offset*60);
1768 } 1760 }
1769 1761
1770 return dt; 1762 return dt;
1771} 1763}
1772 1764
1773QDate ICalFormatImpl::readICalDate(icaltimetype t) 1765QDate ICalFormatImpl::readICalDate(icaltimetype t)
1774{ 1766{
1775 return QDate(t.year,t.month,t.day); 1767 return QDate(t.year,t.month,t.day);
1776} 1768}
1777 1769
1778icaldurationtype ICalFormatImpl::writeICalDuration(int seconds) 1770icaldurationtype ICalFormatImpl::writeICalDuration(int seconds)
1779{ 1771{
1780 icaldurationtype d; 1772 icaldurationtype d;
1781 1773
1782 d.weeks = seconds % gSecondsPerWeek; 1774 d.weeks = seconds % gSecondsPerWeek;
1783 seconds -= d.weeks * gSecondsPerWeek; 1775 seconds -= d.weeks * gSecondsPerWeek;
1784 d.days = seconds % gSecondsPerDay; 1776 d.days = seconds % gSecondsPerDay;
1785 seconds -= d.days * gSecondsPerDay; 1777 seconds -= d.days * gSecondsPerDay;
1786 d.hours = seconds % gSecondsPerHour; 1778 d.hours = seconds % gSecondsPerHour;
1787 seconds -= d.hours * gSecondsPerHour; 1779 seconds -= d.hours * gSecondsPerHour;
1788 d.minutes = seconds % gSecondsPerMinute; 1780 d.minutes = seconds % gSecondsPerMinute;
1789 seconds -= d.minutes * gSecondsPerMinute; 1781 seconds -= d.minutes * gSecondsPerMinute;
1790 d.seconds = seconds; 1782 d.seconds = seconds;
1791 d.is_neg = 0; 1783 d.is_neg = 0;
1792 1784
1793 return d; 1785 return d;
1794} 1786}
1795 1787
1796int ICalFormatImpl::readICalDuration(icaldurationtype d) 1788int ICalFormatImpl::readICalDuration(icaldurationtype d)
1797{ 1789{
1798 int result = 0; 1790 int result = 0;
1799 1791
1800 result += d.weeks * gSecondsPerWeek; 1792 result += d.weeks * gSecondsPerWeek;
1801 result += d.days * gSecondsPerDay; 1793 result += d.days * gSecondsPerDay;
1802 result += d.hours * gSecondsPerHour; 1794 result += d.hours * gSecondsPerHour;
1803 result += d.minutes * gSecondsPerMinute; 1795 result += d.minutes * gSecondsPerMinute;
1804 result += d.seconds; 1796 result += d.seconds;
1805 1797
1806 if (d.is_neg) result *= -1; 1798 if (d.is_neg) result *= -1;
1807 1799
1808 return result; 1800 return result;
1809} 1801}
1810 1802
1811icalcomponent *ICalFormatImpl::createCalendarComponent(Calendar *cal) 1803icalcomponent *ICalFormatImpl::createCalendarComponent(Calendar *cal)
1812{ 1804{
diff --git a/libkcal/incidencebase.cpp b/libkcal/incidencebase.cpp
index 9479048..707d666 100644
--- a/libkcal/incidencebase.cpp
+++ b/libkcal/incidencebase.cpp
@@ -1,393 +1,393 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21#include <kglobal.h> 21#include <kglobal.h>
22#include <klocale.h> 22#include <klocale.h>
23#include <kdebug.h> 23#include <kdebug.h>
24 24
25#include "calformat.h" 25#include "calformat.h"
26 26
27#include "incidencebase.h" 27#include "incidencebase.h"
28 28
29using namespace KCal; 29using namespace KCal;
30 30
31IncidenceBase::IncidenceBase() : 31IncidenceBase::IncidenceBase() :
32 mReadOnly(false), mFloats(true), mDuration(0), mHasDuration(false), 32 mReadOnly(false), mFloats(true), mDuration(0), mHasDuration(false),
33 mPilotId(0), mSyncStatus(SYNCMOD) 33 mPilotId(0), mSyncStatus(SYNCMOD)
34{ 34{
35 setUid(CalFormat::createUniqueId()); 35 setUid(CalFormat::createUniqueId());
36 mOrganizer = ""; 36 mOrganizer = "";
37 mFloats = false; 37 mFloats = false;
38 mDuration = 0; 38 mDuration = 0;
39 mHasDuration = false; 39 mHasDuration = false;
40 mPilotId = 0; 40 mPilotId = 0;
41 mZaurusId = -1; 41 mZaurusId = -1;
42 mZaurusUid = 0; 42 mZaurusUid = 0;
43 mZaurusStat = 0; 43 mTempSyncStat = 0;
44 mSyncStatus = 0; 44 mSyncStatus = 0;
45 mAttendees.setAutoDelete( true ); 45 mAttendees.setAutoDelete( true );
46} 46}
47 47
48IncidenceBase::IncidenceBase(const IncidenceBase &i) : 48IncidenceBase::IncidenceBase(const IncidenceBase &i) :
49 CustomProperties( i ) 49 CustomProperties( i )
50{ 50{
51 mReadOnly = i.mReadOnly; 51 mReadOnly = i.mReadOnly;
52 mDtStart = i.mDtStart; 52 mDtStart = i.mDtStart;
53 mDuration = i.mDuration; 53 mDuration = i.mDuration;
54 mHasDuration = i.mHasDuration; 54 mHasDuration = i.mHasDuration;
55 mOrganizer = i.mOrganizer; 55 mOrganizer = i.mOrganizer;
56 mUid = i.mUid; 56 mUid = i.mUid;
57 QPtrList<Attendee> attendees = i.attendees(); 57 QPtrList<Attendee> attendees = i.attendees();
58 for( Attendee *a = attendees.first(); a; a = attendees.next() ) { 58 for( Attendee *a = attendees.first(); a; a = attendees.next() ) {
59 mAttendees.append( new Attendee( *a ) ); 59 mAttendees.append( new Attendee( *a ) );
60 } 60 }
61 mFloats = i.mFloats; 61 mFloats = i.mFloats;
62 mLastModified = i.mLastModified; 62 mLastModified = i.mLastModified;
63 mPilotId = i.mPilotId; 63 mPilotId = i.mPilotId;
64 mZaurusId = i.mZaurusId; 64 mZaurusId = i.mZaurusId;
65 mZaurusUid = i.mZaurusUid; 65 mZaurusUid = i.mZaurusUid;
66 mZaurusStat = i.mZaurusStat; 66 mTempSyncStat = i.mTempSyncStat;
67 mSyncStatus = i.mSyncStatus; 67 mSyncStatus = i.mSyncStatus;
68 68
69 // The copied object is a new one, so it isn't observed by the observer 69 // The copied object is a new one, so it isn't observed by the observer
70 // of the original object. 70 // of the original object.
71 mObservers.clear(); 71 mObservers.clear();
72 72
73 mAttendees.setAutoDelete( true ); 73 mAttendees.setAutoDelete( true );
74} 74}
75 75
76IncidenceBase::~IncidenceBase() 76IncidenceBase::~IncidenceBase()
77{ 77{
78} 78}
79 79
80 80
81bool KCal::operator==( const IncidenceBase& i1, const IncidenceBase& i2 ) 81bool KCal::operator==( const IncidenceBase& i1, const IncidenceBase& i2 )
82{ 82{
83 83
84 if( i1.attendees().count() != i2.attendees().count() ) { 84 if( i1.attendees().count() != i2.attendees().count() ) {
85 return false; // no need to check further 85 return false; // no need to check further
86 } 86 }
87 if ( i1.attendees().count() > 0 ) { 87 if ( i1.attendees().count() > 0 ) {
88 Attendee * a1 = i1.attendees().first(), *a2 =i2.attendees().first() ; 88 Attendee * a1 = i1.attendees().first(), *a2 =i2.attendees().first() ;
89 while ( a1 ) { 89 while ( a1 ) {
90 if ( !( (*a1) == (*a2)) ) 90 if ( !( (*a1) == (*a2)) )
91 { 91 {
92 //qDebug("Attendee not equal "); 92 //qDebug("Attendee not equal ");
93 return false; 93 return false;
94 } 94 }
95 a1 = i1.attendees().next(); 95 a1 = i1.attendees().next();
96 a2 = i2.attendees().next(); 96 a2 = i2.attendees().next();
97 } 97 }
98 } 98 }
99 //if ( i1.dtStart() != i2.dtStart() ) 99 //if ( i1.dtStart() != i2.dtStart() )
100 // return false; 100 // return false;
101#if 0 101#if 0
102 qDebug("1 %d ",i1.doesFloat() == i2.doesFloat() ); 102 qDebug("1 %d ",i1.doesFloat() == i2.doesFloat() );
103 qDebug("1 %d ",i1.duration() == i2.duration() ); 103 qDebug("1 %d ",i1.duration() == i2.duration() );
104 qDebug("3 %d ",i1.hasDuration() == i2.hasDuration() ); 104 qDebug("3 %d ",i1.hasDuration() == i2.hasDuration() );
105 qDebug("1 %d ",i1.pilotId() == i2.pilotId() ); 105 qDebug("1 %d ",i1.pilotId() == i2.pilotId() );
106 qDebug("1 %d %d %d",i1.syncStatus() == i2.syncStatus() , i1.syncStatus(),i2.syncStatus() ); 106 qDebug("1 %d %d %d",i1.syncStatus() == i2.syncStatus() , i1.syncStatus(),i2.syncStatus() );
107 qDebug("6 %d ",i1.organizer() == i2.organizer() ); 107 qDebug("6 %d ",i1.organizer() == i2.organizer() );
108 108
109#endif 109#endif
110 return ( i1.organizer() == i2.organizer() && 110 return ( i1.organizer() == i2.organizer() &&
111 // i1.uid() == i2.uid() && 111 // i1.uid() == i2.uid() &&
112 // Don't compare lastModified, otherwise the operator is not 112 // Don't compare lastModified, otherwise the operator is not
113 // of much use. We are not comparing for identity, after all. 113 // of much use. We are not comparing for identity, after all.
114 i1.doesFloat() == i2.doesFloat() && 114 i1.doesFloat() == i2.doesFloat() &&
115 i1.duration() == i2.duration() && 115 i1.duration() == i2.duration() &&
116 i1.hasDuration() == i2.hasDuration() && 116 i1.hasDuration() == i2.hasDuration() &&
117 i1.pilotId() == i2.pilotId() );// && i1.syncStatus() == i2.syncStatus() ); 117 i1.pilotId() == i2.pilotId() );// && i1.syncStatus() == i2.syncStatus() );
118 // no need to compare mObserver 118 // no need to compare mObserver
119} 119}
120 120
121 121
122QDateTime IncidenceBase::getEvenTime( QDateTime dt ) 122QDateTime IncidenceBase::getEvenTime( QDateTime dt )
123{ 123{
124 QTime t = dt.time(); 124 QTime t = dt.time();
125 dt.setTime( QTime (t.hour (), t.minute (), t.second () ) ); 125 dt.setTime( QTime (t.hour (), t.minute (), t.second () ) );
126 return dt; 126 return dt;
127} 127}
128 128
129 129
130void IncidenceBase::setUid(const QString &uid) 130void IncidenceBase::setUid(const QString &uid)
131{ 131{
132 mUid = uid; 132 mUid = uid;
133 updated(); 133 updated();
134} 134}
135 135
136QString IncidenceBase::uid() const 136QString IncidenceBase::uid() const
137{ 137{
138 return mUid; 138 return mUid;
139} 139}
140 140
141void IncidenceBase::setLastModified(const QDateTime &lm) 141void IncidenceBase::setLastModified(const QDateTime &lm)
142{ 142{
143 // DON'T! updated() because we call this from 143 // DON'T! updated() because we call this from
144 // Calendar::updateEvent(). 144 // Calendar::updateEvent().
145 mLastModified = getEvenTime(lm); 145 mLastModified = getEvenTime(lm);
146 //qDebug("IncidenceBase::setLastModified %s ",lm.toString().latin1()); 146 //qDebug("IncidenceBase::setLastModified %s ",lm.toString().latin1());
147} 147}
148 148
149QDateTime IncidenceBase::lastModified() const 149QDateTime IncidenceBase::lastModified() const
150{ 150{
151 return mLastModified; 151 return mLastModified;
152} 152}
153 153
154void IncidenceBase::setOrganizer(const QString &o) 154void IncidenceBase::setOrganizer(const QString &o)
155{ 155{
156 // we don't check for readonly here, because it is 156 // we don't check for readonly here, because it is
157 // possible that by setting the organizer we are changing 157 // possible that by setting the organizer we are changing
158 // the event's readonly status... 158 // the event's readonly status...
159 mOrganizer = o; 159 mOrganizer = o;
160 if (mOrganizer.left(7).upper() == "MAILTO:") 160 if (mOrganizer.left(7).upper() == "MAILTO:")
161 mOrganizer = mOrganizer.remove(0,7); 161 mOrganizer = mOrganizer.remove(0,7);
162 162
163 updated(); 163 updated();
164} 164}
165 165
166QString IncidenceBase::organizer() const 166QString IncidenceBase::organizer() const
167{ 167{
168 return mOrganizer; 168 return mOrganizer;
169} 169}
170 170
171void IncidenceBase::setReadOnly( bool readOnly ) 171void IncidenceBase::setReadOnly( bool readOnly )
172{ 172{
173 mReadOnly = readOnly; 173 mReadOnly = readOnly;
174} 174}
175 175
176void IncidenceBase::setDtStart(const QDateTime &dtStart) 176void IncidenceBase::setDtStart(const QDateTime &dtStart)
177{ 177{
178// if (mReadOnly) return; 178// if (mReadOnly) return;
179 mDtStart = getEvenTime(dtStart); 179 mDtStart = getEvenTime(dtStart);
180 updated(); 180 updated();
181} 181}
182 182
183QDateTime IncidenceBase::dtStart() const 183QDateTime IncidenceBase::dtStart() const
184{ 184{
185 return mDtStart; 185 return mDtStart;
186} 186}
187 187
188QString IncidenceBase::dtStartTimeStr() const 188QString IncidenceBase::dtStartTimeStr() const
189{ 189{
190 return KGlobal::locale()->formatTime(dtStart().time()); 190 return KGlobal::locale()->formatTime(dtStart().time());
191} 191}
192 192
193QString IncidenceBase::dtStartDateStr(bool shortfmt) const 193QString IncidenceBase::dtStartDateStr(bool shortfmt) const
194{ 194{
195 return KGlobal::locale()->formatDate(dtStart().date(),shortfmt); 195 return KGlobal::locale()->formatDate(dtStart().date(),shortfmt);
196} 196}
197 197
198QString IncidenceBase::dtStartStr(bool shortfmt) const 198QString IncidenceBase::dtStartStr(bool shortfmt) const
199{ 199{
200 return KGlobal::locale()->formatDateTime(dtStart(), shortfmt); 200 return KGlobal::locale()->formatDateTime(dtStart(), shortfmt);
201} 201}
202 202
203 203
204bool IncidenceBase::doesFloat() const 204bool IncidenceBase::doesFloat() const
205{ 205{
206 return mFloats; 206 return mFloats;
207} 207}
208 208
209void IncidenceBase::setFloats(bool f) 209void IncidenceBase::setFloats(bool f)
210{ 210{
211 if (mReadOnly) return; 211 if (mReadOnly) return;
212 mFloats = f; 212 mFloats = f;
213 updated(); 213 updated();
214} 214}
215 215
216 216
217void IncidenceBase::addAttendee(Attendee *a, bool doupdate) 217void IncidenceBase::addAttendee(Attendee *a, bool doupdate)
218{ 218{
219 if (mReadOnly) return; 219 if (mReadOnly) return;
220 if (a->name().left(7).upper() == "MAILTO:") 220 if (a->name().left(7).upper() == "MAILTO:")
221 a->setName(a->name().remove(0,7)); 221 a->setName(a->name().remove(0,7));
222 222
223 mAttendees.append(a); 223 mAttendees.append(a);
224 if (doupdate) updated(); 224 if (doupdate) updated();
225} 225}
226 226
227#if 0 227#if 0
228void IncidenceBase::removeAttendee(Attendee *a) 228void IncidenceBase::removeAttendee(Attendee *a)
229{ 229{
230 if (mReadOnly) return; 230 if (mReadOnly) return;
231 mAttendees.removeRef(a); 231 mAttendees.removeRef(a);
232 updated(); 232 updated();
233} 233}
234 234
235void IncidenceBase::removeAttendee(const char *n) 235void IncidenceBase::removeAttendee(const char *n)
236{ 236{
237 Attendee *a; 237 Attendee *a;
238 238
239 if (mReadOnly) return; 239 if (mReadOnly) return;
240 for (a = mAttendees.first(); a; a = mAttendees.next()) 240 for (a = mAttendees.first(); a; a = mAttendees.next())
241 if (a->getName() == n) { 241 if (a->getName() == n) {
242 mAttendees.remove(); 242 mAttendees.remove();
243 break; 243 break;
244 } 244 }
245} 245}
246#endif 246#endif
247 247
248void IncidenceBase::clearAttendees() 248void IncidenceBase::clearAttendees()
249{ 249{
250 if (mReadOnly) return; 250 if (mReadOnly) return;
251 mAttendees.clear(); 251 mAttendees.clear();
252} 252}
253 253
254#if 0 254#if 0
255Attendee *IncidenceBase::getAttendee(const char *n) const 255Attendee *IncidenceBase::getAttendee(const char *n) const
256{ 256{
257 QPtrListIterator<Attendee> qli(mAttendees); 257 QPtrListIterator<Attendee> qli(mAttendees);
258 258
259 qli.toFirst(); 259 qli.toFirst();
260 while (qli) { 260 while (qli) {
261 if (qli.current()->getName() == n) 261 if (qli.current()->getName() == n)
262 return qli.current(); 262 return qli.current();
263 ++qli; 263 ++qli;
264 } 264 }
265 return 0L; 265 return 0L;
266} 266}
267#endif 267#endif
268 268
269Attendee *IncidenceBase::attendeeByMail(const QString &email) 269Attendee *IncidenceBase::attendeeByMail(const QString &email)
270{ 270{
271 QPtrListIterator<Attendee> qli(mAttendees); 271 QPtrListIterator<Attendee> qli(mAttendees);
272 272
273 qli.toFirst(); 273 qli.toFirst();
274 while (qli) { 274 while (qli) {
275 if (qli.current()->email() == email) 275 if (qli.current()->email() == email)
276 return qli.current(); 276 return qli.current();
277 ++qli; 277 ++qli;
278 } 278 }
279 return 0L; 279 return 0L;
280} 280}
281 281
282Attendee *IncidenceBase::attendeeByMails(const QStringList &emails, const QString& email) 282Attendee *IncidenceBase::attendeeByMails(const QStringList &emails, const QString& email)
283{ 283{
284 QPtrListIterator<Attendee> qli(mAttendees); 284 QPtrListIterator<Attendee> qli(mAttendees);
285 285
286 QStringList mails = emails; 286 QStringList mails = emails;
287 if (!email.isEmpty()) { 287 if (!email.isEmpty()) {
288 mails.append(email); 288 mails.append(email);
289 } 289 }
290 qli.toFirst(); 290 qli.toFirst();
291 while (qli) { 291 while (qli) {
292 for ( QStringList::Iterator it = mails.begin(); it != mails.end(); ++it ) { 292 for ( QStringList::Iterator it = mails.begin(); it != mails.end(); ++it ) {
293 if (qli.current()->email() == *it) 293 if (qli.current()->email() == *it)
294 return qli.current(); 294 return qli.current();
295 } 295 }
296 296
297 ++qli; 297 ++qli;
298 } 298 }
299 return 0L; 299 return 0L;
300} 300}
301 301
302void IncidenceBase::setDuration(int seconds) 302void IncidenceBase::setDuration(int seconds)
303{ 303{
304 mDuration = seconds; 304 mDuration = seconds;
305 setHasDuration(true); 305 setHasDuration(true);
306} 306}
307 307
308int IncidenceBase::duration() const 308int IncidenceBase::duration() const
309{ 309{
310 return mDuration; 310 return mDuration;
311} 311}
312 312
313void IncidenceBase::setHasDuration(bool b) 313void IncidenceBase::setHasDuration(bool b)
314{ 314{
315 mHasDuration = b; 315 mHasDuration = b;
316} 316}
317 317
318bool IncidenceBase::hasDuration() const 318bool IncidenceBase::hasDuration() const
319{ 319{
320 return mHasDuration; 320 return mHasDuration;
321} 321}
322 322
323void IncidenceBase::setSyncStatus(int stat) 323void IncidenceBase::setSyncStatus(int stat)
324{ 324{
325 if (mReadOnly) return; 325 if (mReadOnly) return;
326 mSyncStatus = stat; 326 mSyncStatus = stat;
327} 327}
328 328
329int IncidenceBase::syncStatus() const 329int IncidenceBase::syncStatus() const
330{ 330{
331 return mSyncStatus; 331 return mSyncStatus;
332} 332}
333 333
334void IncidenceBase::setPilotId( int id ) 334void IncidenceBase::setPilotId( int id )
335{ 335{
336 if (mReadOnly) return; 336 if (mReadOnly) return;
337 mPilotId = id; 337 mPilotId = id;
338} 338}
339 339
340int IncidenceBase::pilotId() const 340int IncidenceBase::pilotId() const
341{ 341{
342 return mPilotId; 342 return mPilotId;
343} 343}
344void IncidenceBase::setZaurusId( int id ) 344void IncidenceBase::setZaurusId( int id )
345{ 345{
346 if (mReadOnly) return; 346 if (mReadOnly) return;
347 mZaurusId = id; 347 mZaurusId = id;
348} 348}
349 349
350int IncidenceBase::zaurusId() const 350int IncidenceBase::zaurusId() const
351{ 351{
352 return mZaurusId; 352 return mZaurusId;
353} 353}
354 354
355int IncidenceBase::zaurusUid() const 355int IncidenceBase::zaurusUid() const
356{ 356{
357 return mZaurusUid; 357 return mZaurusUid;
358} 358}
359void IncidenceBase::setZaurusUid( int id ) 359void IncidenceBase::setZaurusUid( int id )
360{ 360{
361 if (mReadOnly) return; 361 if (mReadOnly) return;
362 mZaurusUid = id; 362 mZaurusUid = id;
363} 363}
364 364
365int IncidenceBase::zaurusStat() const 365int IncidenceBase::tempSyncStat() const
366{ 366{
367 return mZaurusStat; 367 return mTempSyncStat;
368} 368}
369void IncidenceBase::setZaurusStat( int id ) 369void IncidenceBase::setTempSyncStat( int id )
370{ 370{
371 if (mReadOnly) return; 371 if (mReadOnly) return;
372 mZaurusStat = id; 372 mTempSyncStat = id;
373} 373}
374 374
375void IncidenceBase::registerObserver( IncidenceBase::Observer *observer ) 375void IncidenceBase::registerObserver( IncidenceBase::Observer *observer )
376{ 376{
377 if( !mObservers.contains(observer) ) mObservers.append( observer ); 377 if( !mObservers.contains(observer) ) mObservers.append( observer );
378} 378}
379 379
380void IncidenceBase::unRegisterObserver( IncidenceBase::Observer *observer ) 380void IncidenceBase::unRegisterObserver( IncidenceBase::Observer *observer )
381{ 381{
382 mObservers.remove( observer ); 382 mObservers.remove( observer );
383} 383}
384 384
385void IncidenceBase::updated() 385void IncidenceBase::updated()
386{ 386{
387 QPtrListIterator<Observer> it(mObservers); 387 QPtrListIterator<Observer> it(mObservers);
388 while( it.current() ) { 388 while( it.current() ) {
389 Observer *o = it.current(); 389 Observer *o = it.current();
390 ++it; 390 ++it;
391 o->incidenceUpdated( this ); 391 o->incidenceUpdated( this );
392 } 392 }
393} 393}
diff --git a/libkcal/incidencebase.h b/libkcal/incidencebase.h
index 0ab7eef..ce6e254 100644
--- a/libkcal/incidencebase.h
+++ b/libkcal/incidencebase.h
@@ -1,170 +1,170 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20#ifndef KCAL_INCIDENCEBASE_H 20#ifndef KCAL_INCIDENCEBASE_H
21#define KCAL_INCIDENCEBASE_H 21#define KCAL_INCIDENCEBASE_H
22// 22//
23// Incidence - base class of calendaring components 23// Incidence - base class of calendaring components
24// 24//
25 25
26#include <qdatetime.h> 26#include <qdatetime.h>
27#include <qstringlist.h> 27#include <qstringlist.h>
28#include <qvaluelist.h> 28#include <qvaluelist.h>
29#include <qptrlist.h> 29#include <qptrlist.h>
30 30
31#include "customproperties.h" 31#include "customproperties.h"
32#include "attendee.h" 32#include "attendee.h"
33 33
34namespace KCal { 34namespace KCal {
35 35
36typedef QValueList<QDate> DateList; 36typedef QValueList<QDate> DateList;
37 37
38/** 38/**
39 This class provides the base class common to all calendar components. 39 This class provides the base class common to all calendar components.
40*/ 40*/
41class IncidenceBase : public CustomProperties 41class IncidenceBase : public CustomProperties
42{ 42{
43 public: 43 public:
44 class Observer { 44 class Observer {
45 public: 45 public:
46 virtual void incidenceUpdated( IncidenceBase * ) = 0; 46 virtual void incidenceUpdated( IncidenceBase * ) = 0;
47 }; 47 };
48 48
49 IncidenceBase(); 49 IncidenceBase();
50 IncidenceBase(const IncidenceBase &); 50 IncidenceBase(const IncidenceBase &);
51 virtual ~IncidenceBase(); 51 virtual ~IncidenceBase();
52 52
53 virtual QCString type() const = 0; 53 virtual QCString type() const = 0;
54 54
55 /** Set the unique id for the event */ 55 /** Set the unique id for the event */
56 void setUid(const QString &); 56 void setUid(const QString &);
57 /** Return the unique id for the event */ 57 /** Return the unique id for the event */
58 QString uid() const; 58 QString uid() const;
59 59
60 /** Sets the time the incidence was last modified. */ 60 /** Sets the time the incidence was last modified. */
61 void setLastModified(const QDateTime &lm); 61 void setLastModified(const QDateTime &lm);
62 /** Return the time the incidence was last modified. */ 62 /** Return the time the incidence was last modified. */
63 QDateTime lastModified() const; 63 QDateTime lastModified() const;
64 64
65 /** sets the organizer for the event */ 65 /** sets the organizer for the event */
66 void setOrganizer(const QString &o); 66 void setOrganizer(const QString &o);
67 QString organizer() const; 67 QString organizer() const;
68 68
69 /** Set readonly status. */ 69 /** Set readonly status. */
70 virtual void setReadOnly( bool ); 70 virtual void setReadOnly( bool );
71 /** Return if the object is read-only. */ 71 /** Return if the object is read-only. */
72 bool isReadOnly() const { return mReadOnly; } 72 bool isReadOnly() const { return mReadOnly; }
73 73
74 /** for setting the event's starting date/time with a QDateTime. */ 74 /** for setting the event's starting date/time with a QDateTime. */
75 virtual void setDtStart(const QDateTime &dtStart); 75 virtual void setDtStart(const QDateTime &dtStart);
76 /** returns an event's starting date/time as a QDateTime. */ 76 /** returns an event's starting date/time as a QDateTime. */
77 QDateTime dtStart() const; 77 QDateTime dtStart() const;
78 /** returns an event's starting time as a string formatted according to the 78 /** returns an event's starting time as a string formatted according to the
79 users locale settings */ 79 users locale settings */
80 QString dtStartTimeStr() const; 80 QString dtStartTimeStr() const;
81 /** returns an event's starting date as a string formatted according to the 81 /** returns an event's starting date as a string formatted according to the
82 users locale settings */ 82 users locale settings */
83 QString dtStartDateStr(bool shortfmt=true) const; 83 QString dtStartDateStr(bool shortfmt=true) const;
84 /** returns an event's starting date and time as a string formatted according 84 /** returns an event's starting date and time as a string formatted according
85 to the users locale settings */ 85 to the users locale settings */
86 QString dtStartStr(bool shortfmt=true) const; 86 QString dtStartStr(bool shortfmt=true) const;
87 87
88 virtual void setDuration(int seconds); 88 virtual void setDuration(int seconds);
89 int duration() const; 89 int duration() const;
90 void setHasDuration(bool); 90 void setHasDuration(bool);
91 bool hasDuration() const; 91 bool hasDuration() const;
92 92
93 /** Return true or false depending on whether the incidence "floats," 93 /** Return true or false depending on whether the incidence "floats,"
94 * i.e. has a date but no time attached to it. */ 94 * i.e. has a date but no time attached to it. */
95 bool doesFloat() const; 95 bool doesFloat() const;
96 /** Set whether the incidence floats, i.e. has a date but no time attached to it. */ 96 /** Set whether the incidence floats, i.e. has a date but no time attached to it. */
97 void setFloats(bool f); 97 void setFloats(bool f);
98 98
99 /** 99 /**
100 Add Attendee to this incidence. IncidenceBase takes ownership of the 100 Add Attendee to this incidence. IncidenceBase takes ownership of the
101 Attendee object. 101 Attendee object.
102 */ 102 */
103 void addAttendee(Attendee *a, bool doupdate=true ); 103 void addAttendee(Attendee *a, bool doupdate=true );
104// void removeAttendee(Attendee *a); 104// void removeAttendee(Attendee *a);
105// void removeAttendee(const char *n); 105// void removeAttendee(const char *n);
106 /** Remove all Attendees. */ 106 /** Remove all Attendees. */
107 void clearAttendees(); 107 void clearAttendees();
108 /** Return list of attendees. */ 108 /** Return list of attendees. */
109 QPtrList<Attendee> attendees() const { return mAttendees; }; 109 QPtrList<Attendee> attendees() const { return mAttendees; };
110 /** Return number of attendees. */ 110 /** Return number of attendees. */
111 int attendeeCount() const { return mAttendees.count(); }; 111 int attendeeCount() const { return mAttendees.count(); };
112 /** Return the Attendee with this email */ 112 /** Return the Attendee with this email */
113 Attendee* attendeeByMail(const QString &); 113 Attendee* attendeeByMail(const QString &);
114 /** Return first Attendee with one of this emails */ 114 /** Return first Attendee with one of this emails */
115 Attendee* attendeeByMails(const QStringList &, const QString& email = QString::null); 115 Attendee* attendeeByMails(const QStringList &, const QString& email = QString::null);
116 116
117 /** pilot syncronization states */ 117 /** pilot syncronization states */
118 enum { SYNCNONE = 0, SYNCMOD = 1, SYNCDEL = 3 }; 118 enum { SYNCNONE = 0, SYNCMOD = 1, SYNCDEL = 3 };
119 /** Set synchronisation satus. */ 119 /** Set synchronisation satus. */
120 void setSyncStatus(int stat); 120 void setSyncStatus(int stat);
121 /** Return synchronisation status. */ 121 /** Return synchronisation status. */
122 int syncStatus() const; 122 int syncStatus() const;
123 123
124 /** Set Pilot Id. */ 124 /** Set Pilot Id. */
125 void setPilotId(int id); 125 void setPilotId(int id);
126 /** Return Pilot Id. */ 126 /** Return Pilot Id. */
127 int pilotId() const; 127 int pilotId() const;
128 128
129 void setZaurusId(int id); 129 void setZaurusId(int id);
130 int zaurusId() const; 130 int zaurusId() const;
131 void setZaurusUid(int id); 131 void setZaurusUid(int id);
132 int zaurusUid() const; 132 int zaurusUid() const;
133 void setZaurusStat(int id); 133 void setTempSyncStat(int id);
134 int zaurusStat() const; 134 int tempSyncStat() const;
135 135
136 void registerObserver( Observer * ); 136 void registerObserver( Observer * );
137 void unRegisterObserver( Observer * ); 137 void unRegisterObserver( Observer * );
138 void updated(); 138 void updated();
139 139
140 protected: 140 protected:
141 bool mReadOnly; 141 bool mReadOnly;
142 QDateTime getEvenTime( QDateTime ); 142 QDateTime getEvenTime( QDateTime );
143 143
144 private: 144 private:
145 // base components 145 // base components
146 QDateTime mDtStart; 146 QDateTime mDtStart;
147 QString mOrganizer; 147 QString mOrganizer;
148 QString mUid; 148 QString mUid;
149 QDateTime mLastModified; 149 QDateTime mLastModified;
150 QPtrList<Attendee> mAttendees; 150 QPtrList<Attendee> mAttendees;
151 151
152 bool mFloats; 152 bool mFloats;
153 153
154 int mDuration; 154 int mDuration;
155 bool mHasDuration; 155 bool mHasDuration;
156 int mZaurusId; 156 int mZaurusId;
157 int mZaurusUid; 157 int mZaurusUid;
158 int mZaurusStat; 158 int mTempSyncStat;
159 159
160 // PILOT SYNCHRONIZATION STUFF 160 // PILOT SYNCHRONIZATION STUFF
161 int mPilotId; // unique id for pilot sync 161 int mPilotId; // unique id for pilot sync
162 int mSyncStatus; // status (for sync) 162 int mSyncStatus; // status (for sync)
163 163
164 QPtrList<Observer> mObservers; 164 QPtrList<Observer> mObservers;
165}; 165};
166 166
167bool operator==( const IncidenceBase&, const IncidenceBase& ); 167bool operator==( const IncidenceBase&, const IncidenceBase& );
168} 168}
169 169
170#endif 170#endif
diff --git a/libkcal/sharpformat.cpp b/libkcal/sharpformat.cpp
index 973f19d..d39d2dd 100644
--- a/libkcal/sharpformat.cpp
+++ b/libkcal/sharpformat.cpp
@@ -1,1008 +1,1008 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 3
4 Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org> 4 Copyright (c) 2003 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 <qdatetime.h> 22#include <qdatetime.h>
23#include <qstring.h> 23#include <qstring.h>
24#include <qapplication.h> 24#include <qapplication.h>
25#include <qptrlist.h> 25#include <qptrlist.h>
26#include <qregexp.h> 26#include <qregexp.h>
27#include <qmessagebox.h> 27#include <qmessagebox.h>
28#include <qclipboard.h> 28#include <qclipboard.h>
29#include <qfile.h> 29#include <qfile.h>
30#include <qtextstream.h> 30#include <qtextstream.h>
31#include <qtextcodec.h> 31#include <qtextcodec.h>
32#include <qxml.h> 32#include <qxml.h>
33#include <qlabel.h> 33#include <qlabel.h>
34 34
35#include <kdebug.h> 35#include <kdebug.h>
36#include <klocale.h> 36#include <klocale.h>
37#include <kglobal.h> 37#include <kglobal.h>
38 38
39#include "calendar.h" 39#include "calendar.h"
40#include "alarm.h" 40#include "alarm.h"
41#include "recurrence.h" 41#include "recurrence.h"
42#include "calendarlocal.h" 42#include "calendarlocal.h"
43 43
44#include "sharpformat.h" 44#include "sharpformat.h"
45#include "syncdefines.h" 45#include "syncdefines.h"
46 46
47using namespace KCal; 47using namespace KCal;
48 48
49//CARDID,CATEGORY,DSRP,PLCE,MEM1,TIM1,TIM2,ADAY,ARON,ARMN,ARSD,RTYP,RFRQ,RPOS,RDYS,REND,REDT,ALSD,ALED,MDAY 49//CARDID,CATEGORY,DSRP,PLCE,MEM1,TIM1,TIM2,ADAY,ARON,ARMN,ARSD,RTYP,RFRQ,RPOS,RDYS,REND,REDT,ALSD,ALED,MDAY
50// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 50// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
51 51
52//ARSD silentalarm = 0 52//ARSD silentalarm = 0
53// 11 RTYP 225 no /0 dialy/ 1 weekly/ 3 month by date/ 2 month by day(pos)/ yearly 53// 11 RTYP 225 no /0 dialy/ 1 weekly/ 3 month by date/ 2 month by day(pos)/ yearly
54// 12 RFRQ 54// 12 RFRQ
55// 13 RPOS pos = 4. monday in month 55// 13 RPOS pos = 4. monday in month
56// 14 RDYS days: 1 mon/ 2 tue .. 64 sun 56// 14 RDYS days: 1 mon/ 2 tue .. 64 sun
57// 15 REND 0 = no end/ 1 = end 57// 15 REND 0 = no end/ 1 = end
58// 16 REDT rec end dt 58// 16 REDT rec end dt
59//ALSD 59//ALSD
60//ALED 60//ALED
61//MDAY 61//MDAY
62 62
63class SharpParser : public QObject 63class SharpParser : public QObject
64{ 64{
65 public: 65 public:
66 SharpParser( Calendar *calendar ) : mCalendar( calendar ) { 66 SharpParser( Calendar *calendar ) : mCalendar( calendar ) {
67 oldCategories = 0; 67 oldCategories = 0;
68 } 68 }
69 69
70 bool startElement( Calendar *existingCalendar, const QStringList & attList, QString qName ) 70 bool startElement( Calendar *existingCalendar, const QStringList & attList, QString qName )
71 { 71 {
72 int i = 1; 72 int i = 1;
73 bool skip = true; 73 bool skip = true;
74 int max = attList.count() -2; 74 int max = attList.count() -2;
75 while ( i < max ) { 75 while ( i < max ) {
76 if ( !attList[i].isEmpty() ) { 76 if ( !attList[i].isEmpty() ) {
77 skip = false; 77 skip = false;
78 break; 78 break;
79 } 79 }
80 ++i ; 80 ++i ;
81 } 81 }
82 if ( skip ) 82 if ( skip )
83 return false; 83 return false;
84 ulong cSum = SharpFormat::getCsum(attList ); 84 ulong cSum = SharpFormat::getCsum(attList );
85 85
86 if ( qName == "Event" ) { 86 if ( qName == "Event" ) {
87 Event *event; 87 Event *event;
88 event = existingCalendar->event( attList[0].toInt() ); 88 event = existingCalendar->event( attList[0].toInt() );
89 if ( event ) 89 if ( event )
90 event = (Event*)event->clone(); 90 event = (Event*)event->clone();
91 else 91 else
92 event = new Event; 92 event = new Event;
93 event->setZaurusId( attList[0].toInt() ); 93 event->setZaurusId( attList[0].toInt() );
94 event->setZaurusUid( cSum ); 94 event->setZaurusUid( cSum );
95 event->setZaurusStat(SYNC_TEMPSTATE_NEW_EXTERNAL ); 95 event->setTempSyncStat(SYNC_TEMPSTATE_NEW_EXTERNAL );
96 96
97 event->setSummary( attList[2] ); 97 event->setSummary( attList[2] );
98 event->setLocation( attList[3] ); 98 event->setLocation( attList[3] );
99 event->setDescription( attList[4] ); 99 event->setDescription( attList[4] );
100 if ( attList[7] == "1" ) { 100 if ( attList[7] == "1" ) {
101 event->setDtStart( QDateTime(fromString( attList[17]+"000000", false ).date(),QTime(0,0,0 ) )); 101 event->setDtStart( QDateTime(fromString( attList[17]+"000000", false ).date(),QTime(0,0,0 ) ));
102 event->setDtEnd( QDateTime(fromString( attList[18]+"000000", false ).date(),QTime(0,0,0 ))); 102 event->setDtEnd( QDateTime(fromString( attList[18]+"000000", false ).date(),QTime(0,0,0 )));
103 event->setFloats( true ); 103 event->setFloats( true );
104 } else { 104 } else {
105 event->setFloats( false ); 105 event->setFloats( false );
106 event->setDtStart( fromString( attList[5] ) ); 106 event->setDtStart( fromString( attList[5] ) );
107 event->setDtEnd( fromString( attList[6] )); 107 event->setDtEnd( fromString( attList[6] ));
108 } 108 }
109 109
110 QString rtype = attList[11]; 110 QString rtype = attList[11];
111 if ( rtype != "255" ) { 111 if ( rtype != "255" ) {
112 // qDebug("recurs "); 112 // qDebug("recurs ");
113 QDate startDate = event->dtStart().date(); 113 QDate startDate = event->dtStart().date();
114 114
115 QString freqStr = attList[12]; 115 QString freqStr = attList[12];
116 int freq = freqStr.toInt(); 116 int freq = freqStr.toInt();
117 117
118 QString hasEndDateStr = attList[15] ; 118 QString hasEndDateStr = attList[15] ;
119 bool hasEndDate = hasEndDateStr == "1"; 119 bool hasEndDate = hasEndDateStr == "1";
120 120
121 QString endDateStr = attList[16]; 121 QString endDateStr = attList[16];
122 QDate endDate = fromString( endDateStr ).date(); 122 QDate endDate = fromString( endDateStr ).date();
123 123
124 QString weekDaysStr = attList[14]; 124 QString weekDaysStr = attList[14];
125 uint weekDaysNum = weekDaysStr.toInt(); 125 uint weekDaysNum = weekDaysStr.toInt();
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 } 168 }
169 169
170 QString categoryList = attList[1] ; 170 QString categoryList = attList[1] ;
171 event->setCategories( lookupCategories( categoryList ) ); 171 event->setCategories( lookupCategories( categoryList ) );
172 172
173 // strange 0 semms to mean: alarm enabled 173 // strange 0 semms to mean: alarm enabled
174 if ( attList[8] == "0" ) { 174 if ( attList[8] == "0" ) {
175 Alarm *alarm; 175 Alarm *alarm;
176 if ( event->alarms().count() > 0 ) 176 if ( event->alarms().count() > 0 )
177 alarm = event->alarms().first(); 177 alarm = event->alarms().first();
178 else { 178 else {
179 alarm = new Alarm( event ); 179 alarm = new Alarm( event );
180 event->addAlarm( alarm ); 180 event->addAlarm( alarm );
181 } 181 }
182 alarm->setType( Alarm::Audio ); 182 alarm->setType( Alarm::Audio );
183 alarm->setEnabled( true ); 183 alarm->setEnabled( true );
184 int alarmOffset = attList[9].toInt(); 184 int alarmOffset = attList[9].toInt();
185 alarm->setStartOffset( alarmOffset * -60 ); 185 alarm->setStartOffset( alarmOffset * -60 );
186 } 186 }
187 187
188 mCalendar->addEvent( event); 188 mCalendar->addEvent( event);
189 } else if ( qName == "Todo" ) { 189 } else if ( qName == "Todo" ) {
190 Todo *todo; 190 Todo *todo;
191 191
192 todo = existingCalendar->todo( attList[0].toInt() ); 192 todo = existingCalendar->todo( attList[0].toInt() );
193 if (todo ) 193 if (todo )
194 todo = (Todo*)todo->clone(); 194 todo = (Todo*)todo->clone();
195 else 195 else
196 todo = new Todo; 196 todo = new Todo;
197 197
198//CARDID,CATEGORY,ETDY,LTDY,FNDY,MARK,PRTY,TITL,MEM1 198//CARDID,CATEGORY,ETDY,LTDY,FNDY,MARK,PRTY,TITL,MEM1
199// 0 1 2 3 4 5 6 7 8 199// 0 1 2 3 4 5 6 7 8
200//1,,,,,1,4,Loch zumachen,"" 200//1,,,,,1,4,Loch zumachen,""
201//3,Privat,20040317T000000,20040318T000000,20040319T000000,0,5,Call bbb,"notes123 bbb gggg ""bb "" " 201//3,Privat,20040317T000000,20040318T000000,20040319T000000,0,5,Call bbb,"notes123 bbb gggg ""bb "" "
202//2,"Familie,Freunde,Holiday",20040318T000000,20040324T000000,20040317T000000,1,2,tod2,notes 202//2,"Familie,Freunde,Holiday",20040318T000000,20040324T000000,20040317T000000,1,2,tod2,notes
203 203
204 todo->setZaurusId( attList[0].toInt() ); 204 todo->setZaurusId( attList[0].toInt() );
205 todo->setZaurusUid( cSum ); 205 todo->setZaurusUid( cSum );
206 todo->setZaurusStat( SYNC_TEMPSTATE_NEW_EXTERNAL ); 206 todo->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL );
207 207
208 todo->setSummary( attList[7] ); 208 todo->setSummary( attList[7] );
209 todo->setDescription( attList[8]); 209 todo->setDescription( attList[8]);
210 210
211 int priority = attList[6].toInt(); 211 int priority = attList[6].toInt();
212 if ( priority == 0 ) priority = 3; 212 if ( priority == 0 ) priority = 3;
213 todo->setPriority( priority ); 213 todo->setPriority( priority );
214 214
215 QString categoryList = attList[1]; 215 QString categoryList = attList[1];
216 todo->setCategories( lookupCategories( categoryList ) ); 216 todo->setCategories( lookupCategories( categoryList ) );
217 217
218 218
219 219
220 QString hasDateStr = attList[3]; // due 220 QString hasDateStr = attList[3]; // due
221 if ( !hasDateStr.isEmpty() ) { 221 if ( !hasDateStr.isEmpty() ) {
222 if ( hasDateStr.right(6) == "000000" ) { 222 if ( hasDateStr.right(6) == "000000" ) {
223 todo->setDtDue( QDateTime(fromString( hasDateStr, false ).date(), QTime(0,0,0 )) ); 223 todo->setDtDue( QDateTime(fromString( hasDateStr, false ).date(), QTime(0,0,0 )) );
224 todo->setFloats( true ); 224 todo->setFloats( true );
225 } 225 }
226 else { 226 else {
227 todo->setDtDue( fromString( hasDateStr ) ); 227 todo->setDtDue( fromString( hasDateStr ) );
228 todo->setFloats( false ); 228 todo->setFloats( false );
229 } 229 }
230 230
231 todo->setHasDueDate( true ); 231 todo->setHasDueDate( true );
232 } 232 }
233 hasDateStr = attList[2];//start 233 hasDateStr = attList[2];//start
234 if ( !hasDateStr.isEmpty() ) { 234 if ( !hasDateStr.isEmpty() ) {
235 235
236 todo->setDtStart( fromString( hasDateStr ) ); 236 todo->setDtStart( fromString( hasDateStr ) );
237 todo->setHasStartDate( true); 237 todo->setHasStartDate( true);
238 } else 238 } else
239 todo->setHasStartDate( false ); 239 todo->setHasStartDate( false );
240 hasDateStr = attList[4];//completed 240 hasDateStr = attList[4];//completed
241 if ( !hasDateStr.isEmpty() ) { 241 if ( !hasDateStr.isEmpty() ) {
242 todo->setCompleted(fromString( hasDateStr ) ); 242 todo->setCompleted(fromString( hasDateStr ) );
243 } 243 }
244 QString completedStr = attList[5]; 244 QString completedStr = attList[5];
245 if ( completedStr == "0" ) 245 if ( completedStr == "0" )
246 todo->setCompleted( true ); 246 todo->setCompleted( true );
247 else 247 else
248 todo->setCompleted( false ); 248 todo->setCompleted( false );
249 mCalendar->addTodo( todo ); 249 mCalendar->addTodo( todo );
250 250
251 } else if ( qName == "Category" ) { 251 } else if ( qName == "Category" ) {
252 /* 252 /*
253 QString id = attributes.value( "id" ); 253 QString id = attributes.value( "id" );
254 QString name = attributes.value( "name" ); 254 QString name = attributes.value( "name" );
255 setCategory( id, name ); 255 setCategory( id, name );
256 */ 256 */
257 } 257 }
258 //qDebug("end "); 258 //qDebug("end ");
259 return true; 259 return true;
260 } 260 }
261 261
262 262
263 void setCategoriesList ( QStringList * c ) 263 void setCategoriesList ( QStringList * c )
264 { 264 {
265 oldCategories = c; 265 oldCategories = c;
266 } 266 }
267 267
268 QDateTime fromString ( QString s, bool useTz = true ) { 268 QDateTime fromString ( QString s, bool useTz = true ) {
269 QDateTime dt; 269 QDateTime dt;
270 int y,m,t,h,min,sec; 270 int y,m,t,h,min,sec;
271 y = s.mid(0,4).toInt(); 271 y = s.mid(0,4).toInt();
272 m = s.mid(4,2).toInt(); 272 m = s.mid(4,2).toInt();
273 t = s.mid(6,2).toInt(); 273 t = s.mid(6,2).toInt();
274 h = s.mid(9,2).toInt(); 274 h = s.mid(9,2).toInt();
275 min = s.mid(11,2).toInt(); 275 min = s.mid(11,2).toInt();
276 sec = s.mid(13,2).toInt(); 276 sec = s.mid(13,2).toInt();
277 dt = QDateTime(QDate(y,m,t), QTime(h,min,sec)); 277 dt = QDateTime(QDate(y,m,t), QTime(h,min,sec));
278 int offset = KGlobal::locale()->localTimeOffset( dt ); 278 int offset = KGlobal::locale()->localTimeOffset( dt );
279 if ( useTz ) 279 if ( useTz )
280 dt = dt.addSecs ( offset*60); 280 dt = dt.addSecs ( offset*60);
281 return dt; 281 return dt;
282 282
283 } 283 }
284 protected: 284 protected:
285 QDateTime toDateTime( const QString &value ) 285 QDateTime toDateTime( const QString &value )
286 { 286 {
287 QDateTime dt; 287 QDateTime dt;
288 dt.setTime_t( value.toUInt() ); 288 dt.setTime_t( value.toUInt() );
289 289
290 return dt; 290 return dt;
291 } 291 }
292 292
293 QStringList lookupCategories( const QString &categoryList ) 293 QStringList lookupCategories( const QString &categoryList )
294 { 294 {
295 QStringList categoryIds = QStringList::split( ";", categoryList ); 295 QStringList categoryIds = QStringList::split( ";", categoryList );
296 QStringList categories; 296 QStringList categories;
297 QStringList::ConstIterator it; 297 QStringList::ConstIterator it;
298 for( it = categoryIds.begin(); it != categoryIds.end(); ++it ) { 298 for( it = categoryIds.begin(); it != categoryIds.end(); ++it ) {
299 QString cate = category( *it ); 299 QString cate = category( *it );
300 if ( oldCategories ) { 300 if ( oldCategories ) {
301 if ( ! oldCategories->contains( cate ) ) 301 if ( ! oldCategories->contains( cate ) )
302 oldCategories->append( cate ); 302 oldCategories->append( cate );
303 } 303 }
304 categories.append(cate ); 304 categories.append(cate );
305 } 305 }
306 return categories; 306 return categories;
307 } 307 }
308 308
309 private: 309 private:
310 Calendar *mCalendar; 310 Calendar *mCalendar;
311 QStringList * oldCategories; 311 QStringList * oldCategories;
312 static QString category( const QString &id ) 312 static QString category( const QString &id )
313 { 313 {
314 QMap<QString,QString>::ConstIterator it = mCategoriesMap.find( id ); 314 QMap<QString,QString>::ConstIterator it = mCategoriesMap.find( id );
315 if ( it == mCategoriesMap.end() ) return id; 315 if ( it == mCategoriesMap.end() ) return id;
316 else return *it; 316 else return *it;
317 } 317 }
318 318
319 static void setCategory( const QString &id, const QString &name ) 319 static void setCategory( const QString &id, const QString &name )
320 { 320 {
321 mCategoriesMap.insert( id, name ); 321 mCategoriesMap.insert( id, name );
322 } 322 }
323 323
324 static QMap<QString,QString> mCategoriesMap; 324 static QMap<QString,QString> mCategoriesMap;
325}; 325};
326 326
327QMap<QString,QString> SharpParser::mCategoriesMap; 327QMap<QString,QString> SharpParser::mCategoriesMap;
328 328
329SharpFormat::SharpFormat() 329SharpFormat::SharpFormat()
330{ 330{
331 mCategories = 0; 331 mCategories = 0;
332} 332}
333 333
334SharpFormat::~SharpFormat() 334SharpFormat::~SharpFormat()
335{ 335{
336} 336}
337ulong SharpFormat::getCsum( const QStringList & attList) 337ulong SharpFormat::getCsum( const QStringList & attList)
338{ 338{
339 int max = attList.count() -1; 339 int max = attList.count() -1;
340 ulong cSum = 0; 340 ulong cSum = 0;
341 int j,k,i; 341 int j,k,i;
342 int add; 342 int add;
343 for ( i = 1; i < max ; ++i ) { 343 for ( i = 1; i < max ; ++i ) {
344 QString s = attList[i]; 344 QString s = attList[i];
345 if ( ! s.isEmpty() ){ 345 if ( ! s.isEmpty() ){
346 j = s.length(); 346 j = s.length();
347 for ( k = 0; k < j; ++k ) { 347 for ( k = 0; k < j; ++k ) {
348 int mul = k +1; 348 int mul = k +1;
349 add = s[k].unicode (); 349 add = s[k].unicode ();
350 if ( k < 16 ) 350 if ( k < 16 )
351 mul = mul * mul; 351 mul = mul * mul;
352 add = add * mul *i*i*i; 352 add = add * mul *i*i*i;
353 cSum += add; 353 cSum += add;
354 } 354 }
355 } 355 }
356 } 356 }
357 return cSum; 357 return cSum;
358 358
359} 359}
360#include <stdlib.h> 360#include <stdlib.h>
361#define DEBUGMODE false 361#define DEBUGMODE false
362bool SharpFormat::load( Calendar *calendar, Calendar *existngCal ) 362bool SharpFormat::load( Calendar *calendar, Calendar *existngCal )
363{ 363{
364 364
365 365
366 bool debug = DEBUGMODE; 366 bool debug = DEBUGMODE;
367 //debug = true; 367 //debug = true;
368 QString text; 368 QString text;
369 QString codec = "utf8"; 369 QString codec = "utf8";
370 QLabel status ( i18n("Reading events ..."), 0 ); 370 QLabel status ( i18n("Reading events ..."), 0 );
371 371
372 int w = status.sizeHint().width()+20 ; 372 int w = status.sizeHint().width()+20 ;
373 if ( w < 200 ) w = 200; 373 if ( w < 200 ) w = 200;
374 int h = status.sizeHint().height()+20 ; 374 int h = status.sizeHint().height()+20 ;
375 int dw = QApplication::desktop()->width(); 375 int dw = QApplication::desktop()->width();
376 int dh = QApplication::desktop()->height(); 376 int dh = QApplication::desktop()->height();
377 status.setCaption(i18n("Reading DTM Data") ); 377 status.setCaption(i18n("Reading DTM Data") );
378 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 378 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
379 status.show(); 379 status.show();
380 status.raise(); 380 status.raise();
381 qApp->processEvents(); 381 qApp->processEvents();
382 QString fileName; 382 QString fileName;
383 if ( ! debug ) { 383 if ( ! debug ) {
384 fileName = "/tmp/kopitempout"; 384 fileName = "/tmp/kopitempout";
385 QString command ="db2file datebook -r -c "+ codec + " > " + fileName; 385 QString command ="db2file datebook -r -c "+ codec + " > " + fileName;
386 system ( command.latin1() ); 386 system ( command.latin1() );
387 } else { 387 } else {
388 fileName = "/tmp/events.txt"; 388 fileName = "/tmp/events.txt";
389 389
390 } 390 }
391 QFile file( fileName ); 391 QFile file( fileName );
392 if (!file.open( IO_ReadOnly ) ) { 392 if (!file.open( IO_ReadOnly ) ) {
393 return false; 393 return false;
394 394
395 } 395 }
396 QTextStream ts( &file ); 396 QTextStream ts( &file );
397 ts.setCodec( QTextCodec::codecForName("utf8") ); 397 ts.setCodec( QTextCodec::codecForName("utf8") );
398 text = ts.read(); 398 text = ts.read();
399 file.close(); 399 file.close();
400 status.setText( i18n("Processing events ...") ); 400 status.setText( i18n("Processing events ...") );
401 status.raise(); 401 status.raise();
402 qApp->processEvents(); 402 qApp->processEvents();
403 fromString2Cal( calendar, existngCal, text, "Event" ); 403 fromString2Cal( calendar, existngCal, text, "Event" );
404 status.setText( i18n("Reading todos ...") ); 404 status.setText( i18n("Reading todos ...") );
405 qApp->processEvents(); 405 qApp->processEvents();
406 if ( ! debug ) { 406 if ( ! debug ) {
407 fileName = "/tmp/kopitempout"; 407 fileName = "/tmp/kopitempout";
408 QString command = "db2file todo -r -c " + codec+ " > " + fileName; 408 QString command = "db2file todo -r -c " + codec+ " > " + fileName;
409 system ( command.latin1() ); 409 system ( command.latin1() );
410 } else { 410 } else {
411 fileName = "/tmp/todo.txt"; 411 fileName = "/tmp/todo.txt";
412 } 412 }
413 file.setName( fileName ); 413 file.setName( fileName );
414 if (!file.open( IO_ReadOnly ) ) { 414 if (!file.open( IO_ReadOnly ) ) {
415 return false; 415 return false;
416 416
417 } 417 }
418 ts.setDevice( &file ); 418 ts.setDevice( &file );
419 text = ts.read(); 419 text = ts.read();
420 file.close(); 420 file.close();
421 421
422 status.setText( i18n("Processing todos ...") ); 422 status.setText( i18n("Processing todos ...") );
423 status.raise(); 423 status.raise();
424 qApp->processEvents(); 424 qApp->processEvents();
425 fromString2Cal( calendar, existngCal, text, "Todo" ); 425 fromString2Cal( calendar, existngCal, text, "Todo" );
426 return true; 426 return true;
427} 427}
428int SharpFormat::getNumFromRecord( QString answer, Incidence* inc ) 428int SharpFormat::getNumFromRecord( QString answer, Incidence* inc )
429{ 429{
430 int retval = -1; 430 int retval = -1;
431 QStringList templist; 431 QStringList templist;
432 QString tempString; 432 QString tempString;
433 int start = 0; 433 int start = 0;
434 int len = answer.length(); 434 int len = answer.length();
435 int end = answer.find ("\n",start)+1; 435 int end = answer.find ("\n",start)+1;
436 bool ok = true; 436 bool ok = true;
437 start = end; 437 start = end;
438 int ccc = 0; 438 int ccc = 0;
439 while ( start > 0 ) { 439 while ( start > 0 ) {
440 templist.clear(); 440 templist.clear();
441 ok = true; 441 ok = true;
442 int loopCount = 0; 442 int loopCount = 0;
443 while ( ok ) { 443 while ( ok ) {
444 ++loopCount; 444 ++loopCount;
445 if ( loopCount > 25 ) { 445 if ( loopCount > 25 ) {
446 qDebug("KO: Error in while loop"); 446 qDebug("KO: Error in while loop");
447 ok = false; 447 ok = false;
448 start = 0; 448 start = 0;
449 break; 449 break;
450 } 450 }
451 if ( ok ) 451 if ( ok )
452 tempString = getPart( answer, ok, start ); 452 tempString = getPart( answer, ok, start );
453 if ( start >= len || start == 0 ) { 453 if ( start >= len || start == 0 ) {
454 start = 0; 454 start = 0;
455 ok = false; 455 ok = false;
456 } 456 }
457 if ( tempString.right(1) =="\n" ) 457 if ( tempString.right(1) =="\n" )
458 tempString = tempString.left( tempString.length()-1); 458 tempString = tempString.left( tempString.length()-1);
459 459
460 templist.append( tempString ); 460 templist.append( tempString );
461 } 461 }
462 ++ccc; 462 ++ccc;
463 if ( ccc == 2 && loopCount < 25 ) { 463 if ( ccc == 2 && loopCount < 25 ) {
464 start = 0; 464 start = 0;
465 bool ok; 465 bool ok;
466 int newnum = templist[0].toInt( &ok ); 466 int newnum = templist[0].toInt( &ok );
467 if ( ok && newnum > 0) { 467 if ( ok && newnum > 0) {
468 retval = newnum; 468 retval = newnum;
469 inc->setZaurusId( newnum ); 469 inc->setZaurusId( newnum );
470 inc->setZaurusUid( getCsum( templist ) ); 470 inc->setZaurusUid( getCsum( templist ) );
471 inc->setZaurusStat( SYNC_TEMPSTATE_NEW_ID ); 471 inc->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID );
472 } 472 }
473 } 473 }
474 } 474 }
475 //qDebug("getNumFromRecord returning : %d ", retval); 475 //qDebug("getNumFromRecord returning : %d ", retval);
476 return retval; 476 return retval;
477} 477}
478bool SharpFormat::save( Calendar *calendar) 478bool SharpFormat::save( Calendar *calendar)
479{ 479{
480 480
481 QLabel status ( i18n("Processing/adding events ..."), 0 ); 481 QLabel status ( i18n("Processing/adding events ..."), 0 );
482 int w = status.sizeHint().width()+20 ; 482 int w = status.sizeHint().width()+20 ;
483 if ( w < 200 ) w = 200; 483 if ( w < 200 ) w = 200;
484 int h = status.sizeHint().height()+20 ; 484 int h = status.sizeHint().height()+20 ;
485 int dw = QApplication::desktop()->width(); 485 int dw = QApplication::desktop()->width();
486 int dh = QApplication::desktop()->height(); 486 int dh = QApplication::desktop()->height();
487 status.setCaption(i18n("Writing DTM Data") ); 487 status.setCaption(i18n("Writing DTM Data") );
488 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 488 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
489 status.show(); 489 status.show();
490 status.raise(); 490 status.raise();
491 qApp->processEvents(); 491 qApp->processEvents();
492 bool debug = DEBUGMODE; 492 bool debug = DEBUGMODE;
493 QString codec = "utf8"; 493 QString codec = "utf8";
494 QString answer; 494 QString answer;
495 QString ePrefix = "CARDID,CATEGORY,DSRP,PLCE,MEM1,TIM1,TIM2,ADAY,ARON,ARMN,ARSD,RTYP,RFRQ,RPOS,RDYS,REND,REDT,ALSD,ALED,MDAY\n"; 495 QString ePrefix = "CARDID,CATEGORY,DSRP,PLCE,MEM1,TIM1,TIM2,ADAY,ARON,ARMN,ARSD,RTYP,RFRQ,RPOS,RDYS,REND,REDT,ALSD,ALED,MDAY\n";
496 QString tPrefix = "CARDID,CATEGORY,ETDY,LTDY,FNDY,MARK,PRTY,TITL,MEM1\n"; 496 QString tPrefix = "CARDID,CATEGORY,ETDY,LTDY,FNDY,MARK,PRTY,TITL,MEM1\n";
497 QString command; 497 QString command;
498 QPtrList<Event> er = calendar->rawEvents(); 498 QPtrList<Event> er = calendar->rawEvents();
499 Event* ev = er.first(); 499 Event* ev = er.first();
500 QString fileName = "/tmp/kopitempout"; 500 QString fileName = "/tmp/kopitempout";
501 int i = 0; 501 int i = 0;
502 QString changeString = ePrefix; 502 QString changeString = ePrefix;
503 QString deleteString = ePrefix; 503 QString deleteString = ePrefix;
504 bool deleteEnt = false; 504 bool deleteEnt = false;
505 bool changeEnt = false; 505 bool changeEnt = false;
506 QString message = i18n("Processing event # "); 506 QString message = i18n("Processing event # ");
507 int procCount = 0; 507 int procCount = 0;
508 while ( ev ) { 508 while ( ev ) {
509 //qDebug("i %d ", ++i); 509 //qDebug("i %d ", ++i);
510 if ( ev->zaurusStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { 510 if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) {
511 status.setText ( message + QString::number ( ++procCount ) ); 511 status.setText ( message + QString::number ( ++procCount ) );
512 qApp->processEvents(); 512 qApp->processEvents();
513 QString eString = getEventString( ev ); 513 QString eString = getEventString( ev );
514 if ( ev->zaurusStat() == SYNC_TEMPSTATE_DELETE ) { // delete 514 if ( ev->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete
515 // deleting empty strings does not work. 515 // deleting empty strings does not work.
516 // we write first and x and then delete the record with the x 516 // we write first and x and then delete the record with the x
517 eString = eString.replace( QRegExp(",\"\""),",\"x\"" ); 517 eString = eString.replace( QRegExp(",\"\""),",\"x\"" );
518 changeString += eString + "\n"; 518 changeString += eString + "\n";
519 deleteString += eString + "\n"; 519 deleteString += eString + "\n";
520 deleteEnt = true; 520 deleteEnt = true;
521 changeEnt = true; 521 changeEnt = true;
522 } 522 }
523 else if ( ev->zaurusId() == -1 ) { // add new 523 else if ( ev->zaurusId() == -1 ) { // add new
524 command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName; 524 command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName;
525 system ( command.utf8() ); 525 system ( command.utf8() );
526 QFile file( fileName ); 526 QFile file( fileName );
527 if (!file.open( IO_ReadOnly ) ) { 527 if (!file.open( IO_ReadOnly ) ) {
528 return false; 528 return false;
529 529
530 } 530 }
531 QTextStream ts( &file ); 531 QTextStream ts( &file );
532 ts.setCodec( QTextCodec::codecForName("utf8") ); 532 ts.setCodec( QTextCodec::codecForName("utf8") );
533 answer = ts.read(); 533 answer = ts.read();
534 file.close(); 534 file.close();
535 //qDebug("answer \n%s ", answer.latin1()); 535 //qDebug("answer \n%s ", answer.latin1());
536 getNumFromRecord( answer, ev ) ; 536 getNumFromRecord( answer, ev ) ;
537 537
538 } 538 }
539 else { // change existing 539 else { // change existing
540 //qDebug("canging %d %d",ev->zaurusStat() ,ev->zaurusId() ); 540 //qDebug("canging %d %d",ev->zaurusStat() ,ev->zaurusId() );
541 //command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName; 541 //command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName;
542 changeString += eString + "\n"; 542 changeString += eString + "\n";
543 changeEnt = true; 543 changeEnt = true;
544 544
545 } 545 }
546 } 546 }
547 ev = er.next(); 547 ev = er.next();
548 } 548 }
549 status.setText ( i18n("Changing events ...") ); 549 status.setText ( i18n("Changing events ...") );
550 qApp->processEvents(); 550 qApp->processEvents();
551 //qDebug("changing... "); 551 //qDebug("changing... ");
552 if ( changeEnt ) { 552 if ( changeEnt ) {
553 QFile file( fileName ); 553 QFile file( fileName );
554 if (!file.open( IO_WriteOnly ) ) { 554 if (!file.open( IO_WriteOnly ) ) {
555 return false; 555 return false;
556 556
557 } 557 }
558 QTextStream ts( &file ); 558 QTextStream ts( &file );
559 ts.setCodec( QTextCodec::codecForName("utf8") ); 559 ts.setCodec( QTextCodec::codecForName("utf8") );
560 ts << changeString ; 560 ts << changeString ;
561 file.close(); 561 file.close();
562 command = "db2file datebook -w -g -c " + codec+ " < "+ fileName; 562 command = "db2file datebook -w -g -c " + codec+ " < "+ fileName;
563 system ( command.latin1() ); 563 system ( command.latin1() );
564 //qDebug("command %s file :\n%s ", command.latin1(), changeString.latin1()); 564 //qDebug("command %s file :\n%s ", command.latin1(), changeString.latin1());
565 565
566 } 566 }
567 status.setText ( i18n("Deleting events ...") ); 567 status.setText ( i18n("Deleting events ...") );
568 qApp->processEvents(); 568 qApp->processEvents();
569 //qDebug("deleting... "); 569 //qDebug("deleting... ");
570 if ( deleteEnt ) { 570 if ( deleteEnt ) {
571 QFile file( fileName ); 571 QFile file( fileName );
572 if (!file.open( IO_WriteOnly ) ) { 572 if (!file.open( IO_WriteOnly ) ) {
573 return false; 573 return false;
574 574
575 } 575 }
576 QTextStream ts( &file ); 576 QTextStream ts( &file );
577 ts.setCodec( QTextCodec::codecForName("utf8") ); 577 ts.setCodec( QTextCodec::codecForName("utf8") );
578 ts << deleteString; 578 ts << deleteString;
579 file.close(); 579 file.close();
580 command = "db2file datebook -d -c " + codec+ " < "+ fileName; 580 command = "db2file datebook -d -c " + codec+ " < "+ fileName;
581 system ( command.latin1() ); 581 system ( command.latin1() );
582 // qDebug("command %s file :\n%s ", command.latin1(), deleteString.latin1()); 582 // qDebug("command %s file :\n%s ", command.latin1(), deleteString.latin1());
583 } 583 }
584 584
585 585
586 changeString = tPrefix; 586 changeString = tPrefix;
587 deleteString = tPrefix; 587 deleteString = tPrefix;
588 status.setText ( i18n("Processing todos ...") ); 588 status.setText ( i18n("Processing todos ...") );
589 qApp->processEvents(); 589 qApp->processEvents();
590 QPtrList<Todo> tl = calendar->rawTodos(); 590 QPtrList<Todo> tl = calendar->rawTodos();
591 Todo* to = tl.first(); 591 Todo* to = tl.first();
592 i = 0; 592 i = 0;
593 message = i18n("Processing todo # "); 593 message = i18n("Processing todo # ");
594 procCount = 0; 594 procCount = 0;
595 while ( to ) { 595 while ( to ) {
596 if ( to->zaurusStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { 596 if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) {
597 status.setText ( message + QString::number ( ++procCount ) ); 597 status.setText ( message + QString::number ( ++procCount ) );
598 qApp->processEvents(); 598 qApp->processEvents();
599 QString eString = getTodoString( to ); 599 QString eString = getTodoString( to );
600 if ( to->zaurusStat() == SYNC_TEMPSTATE_DELETE ) { // delete 600 if ( to->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete
601 // deleting empty strings does not work. 601 // deleting empty strings does not work.
602 // we write first and x and then delete the record with the x 602 // we write first and x and then delete the record with the x
603 eString = eString.replace( QRegExp(",\"\""),",\"x\"" ); 603 eString = eString.replace( QRegExp(",\"\""),",\"x\"" );
604 changeString += eString + "\n"; 604 changeString += eString + "\n";
605 deleteString += eString + "\n"; 605 deleteString += eString + "\n";
606 deleteEnt = true; 606 deleteEnt = true;
607 changeEnt = true; 607 changeEnt = true;
608 } 608 }
609 else if ( to->zaurusId() == -1 ) { // add new 609 else if ( to->zaurusId() == -1 ) { // add new
610 command = "(echo \"" + tPrefix + eString + "\" ) | db2file todo -w -g -c " + codec+ " > "+ fileName; 610 command = "(echo \"" + tPrefix + eString + "\" ) | db2file todo -w -g -c " + codec+ " > "+ fileName;
611 system ( command.utf8() ); 611 system ( command.utf8() );
612 QFile file( fileName ); 612 QFile file( fileName );
613 if (!file.open( IO_ReadOnly ) ) { 613 if (!file.open( IO_ReadOnly ) ) {
614 return false; 614 return false;
615 615
616 } 616 }
617 QTextStream ts( &file ); 617 QTextStream ts( &file );
618 ts.setCodec( QTextCodec::codecForName("utf8") ); 618 ts.setCodec( QTextCodec::codecForName("utf8") );
619 answer = ts.read(); 619 answer = ts.read();
620 file.close(); 620 file.close();
621 //qDebug("answer \n%s ", answer.latin1()); 621 //qDebug("answer \n%s ", answer.latin1());
622 getNumFromRecord( answer, to ) ; 622 getNumFromRecord( answer, to ) ;
623 623
624 } 624 }
625 else { // change existing 625 else { // change existing
626 //qDebug("canging %d %d",to->zaurusStat() ,to->zaurusId() ); 626 //qDebug("canging %d %d",to->zaurusStat() ,to->zaurusId() );
627 //command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName; 627 //command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName;
628 changeString += eString + "\n"; 628 changeString += eString + "\n";
629 changeEnt = true; 629 changeEnt = true;
630 630
631 } 631 }
632 } 632 }
633 633
634 to = tl.next(); 634 to = tl.next();
635 } 635 }
636 status.setText ( i18n("Changing todos ...") ); 636 status.setText ( i18n("Changing todos ...") );
637 qApp->processEvents(); 637 qApp->processEvents();
638 //qDebug("changing... "); 638 //qDebug("changing... ");
639 if ( changeEnt ) { 639 if ( changeEnt ) {
640 QFile file( fileName ); 640 QFile file( fileName );
641 if (!file.open( IO_WriteOnly ) ) { 641 if (!file.open( IO_WriteOnly ) ) {
642 return false; 642 return false;
643 643
644 } 644 }
645 QTextStream ts( &file ); 645 QTextStream ts( &file );
646 ts.setCodec( QTextCodec::codecForName("utf8") ); 646 ts.setCodec( QTextCodec::codecForName("utf8") );
647 ts << changeString ; 647 ts << changeString ;
648 file.close(); 648 file.close();
649 command = "db2file todo -w -g -c " + codec+ " < "+ fileName; 649 command = "db2file todo -w -g -c " + codec+ " < "+ fileName;
650 system ( command.latin1() ); 650 system ( command.latin1() );
651 //qDebug("command %s file :\n%s ", command.latin1(), changeString.latin1()); 651 //qDebug("command %s file :\n%s ", command.latin1(), changeString.latin1());
652 652
653 } 653 }
654 status.setText ( i18n("Deleting todos ...") ); 654 status.setText ( i18n("Deleting todos ...") );
655 qApp->processEvents(); 655 qApp->processEvents();
656 //qDebug("deleting... "); 656 //qDebug("deleting... ");
657 if ( deleteEnt ) { 657 if ( deleteEnt ) {
658 QFile file( fileName ); 658 QFile file( fileName );
659 if (!file.open( IO_WriteOnly ) ) { 659 if (!file.open( IO_WriteOnly ) ) {
660 return false; 660 return false;
661 661
662 } 662 }
663 QTextStream ts( &file ); 663 QTextStream ts( &file );
664 ts.setCodec( QTextCodec::codecForName("utf8") ); 664 ts.setCodec( QTextCodec::codecForName("utf8") );
665 ts << deleteString; 665 ts << deleteString;
666 file.close(); 666 file.close();
667 command = "db2file todo -d -c " + codec+ " < "+ fileName; 667 command = "db2file todo -d -c " + codec+ " < "+ fileName;
668 system ( command.latin1() ); 668 system ( command.latin1() );
669 // qDebug("command %s file :\n%s ", command.latin1(), deleteString.latin1()); 669 // qDebug("command %s file :\n%s ", command.latin1(), deleteString.latin1());
670 } 670 }
671 671
672 return true; 672 return true;
673} 673}
674QString SharpFormat::dtToString( const QDateTime& dti, bool useTZ ) 674QString SharpFormat::dtToString( const QDateTime& dti, bool useTZ )
675{ 675{
676 QString datestr; 676 QString datestr;
677 QString timestr; 677 QString timestr;
678 int offset = KGlobal::locale()->localTimeOffset( dti ); 678 int offset = KGlobal::locale()->localTimeOffset( dti );
679 QDateTime dt; 679 QDateTime dt;
680 if (useTZ) 680 if (useTZ)
681 dt = dti.addSecs ( -(offset*60)); 681 dt = dti.addSecs ( -(offset*60));
682 else 682 else
683 dt = dti; 683 dt = dti;
684 if(dt.date().isValid()){ 684 if(dt.date().isValid()){
685 const QDate& date = dt.date(); 685 const QDate& date = dt.date();
686 datestr.sprintf("%04d%02d%02d", 686 datestr.sprintf("%04d%02d%02d",
687 date.year(), date.month(), date.day()); 687 date.year(), date.month(), date.day());
688 } 688 }
689 if(dt.time().isValid()){ 689 if(dt.time().isValid()){
690 const QTime& time = dt.time(); 690 const QTime& time = dt.time();
691 timestr.sprintf("T%02d%02d%02d", 691 timestr.sprintf("T%02d%02d%02d",
692 time.hour(), time.minute(), time.second()); 692 time.hour(), time.minute(), time.second());
693 } 693 }
694 return datestr + timestr; 694 return datestr + timestr;
695} 695}
696QString SharpFormat::getEventString( Event* event ) 696QString SharpFormat::getEventString( Event* event )
697{ 697{
698 QStringList list; 698 QStringList list;
699 list.append( QString::number(event->zaurusId() ) ); 699 list.append( QString::number(event->zaurusId() ) );
700 list.append( event->categories().join(",") ); 700 list.append( event->categories().join(",") );
701 if ( !event->summary().isEmpty() ) 701 if ( !event->summary().isEmpty() )
702 list.append( event->summary() ); 702 list.append( event->summary() );
703 else 703 else
704 list.append("" ); 704 list.append("" );
705 if ( !event->location().isEmpty() ) 705 if ( !event->location().isEmpty() )
706 list.append( event->location() ); 706 list.append( event->location() );
707 else 707 else
708 list.append("" ); 708 list.append("" );
709 if ( !event->description().isEmpty() ) 709 if ( !event->description().isEmpty() )
710 list.append( event->description() ); 710 list.append( event->description() );
711 else 711 else
712 list.append( "" ); 712 list.append( "" );
713 if ( event->doesFloat () ) { 713 if ( event->doesFloat () ) {
714 list.append( dtToString( QDateTime(event->dtStart().date(), QTime(0,0,0)), false )); 714 list.append( dtToString( QDateTime(event->dtStart().date(), QTime(0,0,0)), false ));
715 list.append( dtToString( QDateTime(event->dtEnd().date(),QTime(23,59,59)), false )); //6 715 list.append( dtToString( QDateTime(event->dtEnd().date(),QTime(23,59,59)), false )); //6
716 list.append( "1" ); 716 list.append( "1" );
717 717
718 } 718 }
719 else { 719 else {
720 list.append( dtToString( event->dtStart()) ); 720 list.append( dtToString( event->dtStart()) );
721 list.append( dtToString( event->dtEnd()) ); //6 721 list.append( dtToString( event->dtEnd()) ); //6
722 list.append( "0" ); 722 list.append( "0" );
723 } 723 }
724 bool noAlarm = true; 724 bool noAlarm = true;
725 if ( event->alarms().count() > 0 ) { 725 if ( event->alarms().count() > 0 ) {
726 Alarm * al = event->alarms().first(); 726 Alarm * al = event->alarms().first();
727 if ( al->enabled() ) { 727 if ( al->enabled() ) {
728 noAlarm = false; 728 noAlarm = false;
729 list.append( "0" ); // yes, 0 == alarm 729 list.append( "0" ); // yes, 0 == alarm
730 list.append( QString::number( al->startOffset().asSeconds()/(-60) ) ); 730 list.append( QString::number( al->startOffset().asSeconds()/(-60) ) );
731 if ( al->type() == Alarm::Audio ) 731 if ( al->type() == Alarm::Audio )
732 list.append( "1" ); // type audio 732 list.append( "1" ); // type audio
733 else 733 else
734 list.append( "0" ); // type silent 734 list.append( "0" ); // type silent
735 } 735 }
736 } 736 }
737 if ( noAlarm ) { 737 if ( noAlarm ) {
738 list.append( "1" ); // yes, 1 == no alarm 738 list.append( "1" ); // yes, 1 == no alarm
739 list.append( "0" ); // no alarm offset 739 list.append( "0" ); // no alarm offset
740 list.append( "1" ); // type 740 list.append( "1" ); // type
741 } 741 }
742 // next is: 11 742 // next is: 11
743 // next is: 11-16 are recurrence 743 // next is: 11-16 are recurrence
744 Recurrence* rec = event->recurrence(); 744 Recurrence* rec = event->recurrence();
745 745
746 bool writeEndDate = false; 746 bool writeEndDate = false;
747 switch ( rec->doesRecur() ) 747 switch ( rec->doesRecur() )
748 { 748 {
749 case Recurrence::rDaily: // 0 749 case Recurrence::rDaily: // 0
750 list.append( "0" ); 750 list.append( "0" );
751 list.append( QString::number( rec->frequency() ));//12 751 list.append( QString::number( rec->frequency() ));//12
752 list.append( "0" ); 752 list.append( "0" );
753 list.append( "0" ); 753 list.append( "0" );
754 writeEndDate = true; 754 writeEndDate = true;
755 break; 755 break;
756 case Recurrence::rWeekly:// 1 756 case Recurrence::rWeekly:// 1
757 list.append( "1" ); 757 list.append( "1" );
758 list.append( QString::number( rec->frequency()) );//12 758 list.append( QString::number( rec->frequency()) );//12
759 list.append( "0" ); 759 list.append( "0" );
760 { 760 {
761 int days = 0; 761 int days = 0;
762 QBitArray weekDays = rec->days(); 762 QBitArray weekDays = rec->days();
763 int i; 763 int i;
764 for( i = 1; i <= 7; ++i ) { 764 for( i = 1; i <= 7; ++i ) {
765 if ( weekDays[i-1] ) { 765 if ( weekDays[i-1] ) {
766 days += 1 << (i-1); 766 days += 1 << (i-1);
767 } 767 }
768 } 768 }
769 list.append( QString::number( days ) ); 769 list.append( QString::number( days ) );
770 } 770 }
771 //pending weekdays 771 //pending weekdays
772 writeEndDate = true; 772 writeEndDate = true;
773 773
774 break; 774 break;
775 case Recurrence::rMonthlyPos:// 2 775 case Recurrence::rMonthlyPos:// 2
776 list.append( "2" ); 776 list.append( "2" );
777 list.append( QString::number( rec->frequency()) );//12 777 list.append( QString::number( rec->frequency()) );//12
778 778
779 writeEndDate = true; 779 writeEndDate = true;
780 { 780 {
781 int count = 1; 781 int count = 1;
782 QPtrList<Recurrence::rMonthPos> rmp; 782 QPtrList<Recurrence::rMonthPos> rmp;
783 rmp = rec->monthPositions(); 783 rmp = rec->monthPositions();
784 if ( rmp.first()->negative ) 784 if ( rmp.first()->negative )
785 count = 5 - rmp.first()->rPos - 1; 785 count = 5 - rmp.first()->rPos - 1;
786 else 786 else
787 count = rmp.first()->rPos - 1; 787 count = rmp.first()->rPos - 1;
788 list.append( QString::number( count ) ); 788 list.append( QString::number( count ) );
789 789
790 } 790 }
791 791
792 list.append( "0" ); 792 list.append( "0" );
793 break; 793 break;
794 case Recurrence::rMonthlyDay:// 3 794 case Recurrence::rMonthlyDay:// 3
795 list.append( "3" ); 795 list.append( "3" );
796 list.append( QString::number( rec->frequency()) );//12 796 list.append( QString::number( rec->frequency()) );//12
797 list.append( "0" ); 797 list.append( "0" );
798 list.append( "0" ); 798 list.append( "0" );
799 writeEndDate = true; 799 writeEndDate = true;
800 break; 800 break;
801 case Recurrence::rYearlyMonth://4 801 case Recurrence::rYearlyMonth://4
802 list.append( "4" ); 802 list.append( "4" );
803 list.append( QString::number( rec->frequency()) );//12 803 list.append( QString::number( rec->frequency()) );//12
804 list.append( "0" ); 804 list.append( "0" );
805 list.append( "0" ); 805 list.append( "0" );
806 writeEndDate = true; 806 writeEndDate = true;
807 break; 807 break;
808 808
809 default: 809 default:
810 list.append( "255" ); 810 list.append( "255" );
811 list.append( QString() ); 811 list.append( QString() );
812 list.append( "0" ); 812 list.append( "0" );
813 list.append( QString() ); 813 list.append( QString() );
814 list.append( "0" ); 814 list.append( "0" );
815 list.append( "20991231T000000" ); 815 list.append( "20991231T000000" );
816 break; 816 break;
817 } 817 }
818 if ( writeEndDate ) { 818 if ( writeEndDate ) {
819 819
820 if ( rec->endDate().isValid() ) { // 15 + 16 820 if ( rec->endDate().isValid() ) { // 15 + 16
821 list.append( "1" ); 821 list.append( "1" );
822 list.append( dtToString( rec->endDate()) ); 822 list.append( dtToString( rec->endDate()) );
823 } else { 823 } else {
824 list.append( "0" ); 824 list.append( "0" );
825 list.append( "20991231T000000" ); 825 list.append( "20991231T000000" );
826 } 826 }
827 827
828 } 828 }
829 if ( event->doesFloat () ) { 829 if ( event->doesFloat () ) {
830 list.append( dtToString( event->dtStart(), false ).left( 8 )); 830 list.append( dtToString( event->dtStart(), false ).left( 8 ));
831 list.append( dtToString( event->dtEnd(), false ).left( 8 )); //6 831 list.append( dtToString( event->dtEnd(), false ).left( 8 )); //6
832 832
833 } 833 }
834 else { 834 else {
835 list.append( QString() ); 835 list.append( QString() );
836 list.append( QString() ); 836 list.append( QString() );
837 837
838 } 838 }
839 if (event->dtStart().date() == event->dtEnd().date() ) 839 if (event->dtStart().date() == event->dtEnd().date() )
840 list.append( "0" ); 840 list.append( "0" );
841 else 841 else
842 list.append( "1" ); 842 list.append( "1" );
843 843
844 844
845 for(QStringList::Iterator it=list.begin(); 845 for(QStringList::Iterator it=list.begin();
846 it!=list.end(); ++it){ 846 it!=list.end(); ++it){
847 QString& s = (*it); 847 QString& s = (*it);
848 s.replace(QRegExp("\""), "\"\""); 848 s.replace(QRegExp("\""), "\"\"");
849 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){ 849 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){
850 s.prepend('\"'); 850 s.prepend('\"');
851 s.append('\"'); 851 s.append('\"');
852 } else if(s.isEmpty() && !s.isNull()){ 852 } else if(s.isEmpty() && !s.isNull()){
853 s = "\"\""; 853 s = "\"\"";
854 } 854 }
855 } 855 }
856 return list.join(","); 856 return list.join(",");
857 857
858 858
859} 859}
860QString SharpFormat::getTodoString( Todo* todo ) 860QString SharpFormat::getTodoString( Todo* todo )
861{ 861{
862 QStringList list; 862 QStringList list;
863 list.append( QString::number( todo->zaurusId() ) ); 863 list.append( QString::number( todo->zaurusId() ) );
864 list.append( todo->categories().join(",") ); 864 list.append( todo->categories().join(",") );
865 865
866 if ( todo->hasStartDate() ) { 866 if ( todo->hasStartDate() ) {
867 list.append( dtToString( todo->dtStart()) ); 867 list.append( dtToString( todo->dtStart()) );
868 } else 868 } else
869 list.append( QString() ); 869 list.append( QString() );
870 870
871 if ( todo->hasDueDate() ) { 871 if ( todo->hasDueDate() ) {
872 QTime tim; 872 QTime tim;
873 if ( todo->doesFloat()) { 873 if ( todo->doesFloat()) {
874 list.append( dtToString( QDateTime(todo->dtDue().date(),QTime( 0,0,0 )), false)) ; 874 list.append( dtToString( QDateTime(todo->dtDue().date(),QTime( 0,0,0 )), false)) ;
875 } else { 875 } else {
876 list.append( dtToString(todo->dtDue() ) ); 876 list.append( dtToString(todo->dtDue() ) );
877 } 877 }
878 } else 878 } else
879 list.append( QString() ); 879 list.append( QString() );
880 880
881 if ( todo->isCompleted() ) { 881 if ( todo->isCompleted() ) {
882 list.append( dtToString( todo->completed()) ); 882 list.append( dtToString( todo->completed()) );
883 list.append( "0" ); // yes 0 == completed 883 list.append( "0" ); // yes 0 == completed
884 } else { 884 } else {
885 list.append( dtToString( todo->completed()) ); 885 list.append( dtToString( todo->completed()) );
886 list.append( "1" ); 886 list.append( "1" );
887 } 887 }
888 list.append( QString::number( todo->priority() )); 888 list.append( QString::number( todo->priority() ));
889 if( ! todo->summary().isEmpty() ) 889 if( ! todo->summary().isEmpty() )
890 list.append( todo->summary() ); 890 list.append( todo->summary() );
891 else 891 else
892 list.append( "" ); 892 list.append( "" );
893 if (! todo->description().isEmpty() ) 893 if (! todo->description().isEmpty() )
894 list.append( todo->description() ); 894 list.append( todo->description() );
895 else 895 else
896 list.append( "" ); 896 list.append( "" );
897 for(QStringList::Iterator it=list.begin(); 897 for(QStringList::Iterator it=list.begin();
898 it!=list.end(); ++it){ 898 it!=list.end(); ++it){
899 QString& s = (*it); 899 QString& s = (*it);
900 s.replace(QRegExp("\""), "\"\""); 900 s.replace(QRegExp("\""), "\"\"");
901 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){ 901 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){
902 s.prepend('\"'); 902 s.prepend('\"');
903 s.append('\"'); 903 s.append('\"');
904 } else if(s.isEmpty() && !s.isNull()){ 904 } else if(s.isEmpty() && !s.isNull()){
905 s = "\"\""; 905 s = "\"\"";
906 } 906 }
907 } 907 }
908 return list.join(","); 908 return list.join(",");
909} 909}
910QString SharpFormat::getPart( const QString & text, bool &ok, int &start ) 910QString SharpFormat::getPart( const QString & text, bool &ok, int &start )
911{ 911{
912 //qDebug("start %d ", start); 912 //qDebug("start %d ", start);
913 913
914 QString retval =""; 914 QString retval ="";
915 if ( text.at(start) == '"' ) { 915 if ( text.at(start) == '"' ) {
916 if ( text.mid( start,2) == "\"\"" && !( text.mid( start+2,1) == "\"")) { 916 if ( text.mid( start,2) == "\"\"" && !( text.mid( start+2,1) == "\"")) {
917 start = start +2; 917 start = start +2;
918 if ( text.mid( start,1) == "," ) { 918 if ( text.mid( start,1) == "," ) {
919 start += 1; 919 start += 1;
920 } 920 }
921 retval = ""; 921 retval = "";
922 if ( text.mid( start,1) == "\n" ) { 922 if ( text.mid( start,1) == "\n" ) {
923 start += 1; 923 start += 1;
924 ok = false; 924 ok = false;
925 } 925 }
926 return retval; 926 return retval;
927 } 927 }
928 int hk = start+1; 928 int hk = start+1;
929 hk = text.find ('"',hk); 929 hk = text.find ('"',hk);
930 while ( text.at(hk+1) == '"' ) 930 while ( text.at(hk+1) == '"' )
931 hk = text.find ('"',hk+2); 931 hk = text.find ('"',hk+2);
932 retval = text.mid( start+1, hk-start-1); 932 retval = text.mid( start+1, hk-start-1);
933 start = hk+1; 933 start = hk+1;
934 retval.replace( QRegExp("\"\""), "\""); 934 retval.replace( QRegExp("\"\""), "\"");
935 if ( text.mid( start,1) == "," ) { 935 if ( text.mid( start,1) == "," ) {
936 start += 1; 936 start += 1;
937 } 937 }
938 if ( text.mid( start,1) == "\n" ) { 938 if ( text.mid( start,1) == "\n" ) {
939 start += 1; 939 start += 1;
940 ok = false; 940 ok = false;
941 } 941 }
942 //qDebug("retval***%s*** ",retval.latin1() ); 942 //qDebug("retval***%s*** ",retval.latin1() );
943 return retval; 943 return retval;
944 944
945 } else { 945 } else {
946 int nl = text.find ("\n",start); 946 int nl = text.find ("\n",start);
947 int kom = text.find (',',start); 947 int kom = text.find (',',start);
948 if ( kom < nl ) { 948 if ( kom < nl ) {
949 // qDebug("kom < nl %d ", kom); 949 // qDebug("kom < nl %d ", kom);
950 retval = text.mid(start, kom-start); 950 retval = text.mid(start, kom-start);
951 start = kom+1; 951 start = kom+1;
952 return retval; 952 return retval;
953 } else { 953 } else {
954 if ( nl == kom ) { 954 if ( nl == kom ) {
955 // qDebug(" nl == kom "); 955 // qDebug(" nl == kom ");
956 start = 0; 956 start = 0;
957 ok = false; 957 ok = false;
958 return "0"; 958 return "0";
959 } 959 }
960 // qDebug(" nl < kom ", nl); 960 // qDebug(" nl < kom ", nl);
961 retval = text.mid( start, nl-start); 961 retval = text.mid( start, nl-start);
962 ok = false; 962 ok = false;
963 start = nl+1; 963 start = nl+1;
964 return retval; 964 return retval;
965 } 965 }
966 } 966 }
967} 967}
968bool SharpFormat::fromString( Calendar *calendar, const QString & text) 968bool SharpFormat::fromString( Calendar *calendar, const QString & text)
969{ 969{
970 return false; 970 return false;
971} 971}
972bool SharpFormat::fromString2Cal( Calendar *calendar,Calendar *existingCalendar, const QString & text, const QString & type) 972bool SharpFormat::fromString2Cal( Calendar *calendar,Calendar *existingCalendar, const QString & text, const QString & type)
973{ 973{
974 // qDebug("test %s ", text.latin1()); 974 // qDebug("test %s ", text.latin1());
975 QStringList templist; 975 QStringList templist;
976 QString tempString; 976 QString tempString;
977 int start = 0; 977 int start = 0;
978 int len = text.length(); 978 int len = text.length();
979 int end = text.find ("\n",start)+1; 979 int end = text.find ("\n",start)+1;
980 bool ok = true; 980 bool ok = true;
981 start = end; 981 start = end;
982 SharpParser handler( calendar ); 982 SharpParser handler( calendar );
983 handler.setCategoriesList( mCategories ); 983 handler.setCategoriesList( mCategories );
984 while ( start > 0 ) { 984 while ( start > 0 ) {
985 templist.clear(); 985 templist.clear();
986 ok = true; 986 ok = true;
987 while ( ok ) { 987 while ( ok ) {
988 tempString = getPart( text, ok, start ); 988 tempString = getPart( text, ok, start );
989 if ( start >= len || start == 0 ) { 989 if ( start >= len || start == 0 ) {
990 start = 0; 990 start = 0;
991 ok = false; 991 ok = false;
992 } 992 }
993 if ( tempString.right(1) =="\n" ) 993 if ( tempString.right(1) =="\n" )
994 tempString = tempString.left( tempString.length()-1); 994 tempString = tempString.left( tempString.length()-1);
995 //if ( ok ) 995 //if ( ok )
996 templist.append( tempString ); 996 templist.append( tempString );
997 //qDebug("%d ---%s---", templist.count(),tempString.latin1() ); 997 //qDebug("%d ---%s---", templist.count(),tempString.latin1() );
998 } 998 }
999 handler.startElement( existingCalendar, templist, type ); 999 handler.startElement( existingCalendar, templist, type );
1000 } 1000 }
1001 1001
1002 return false; 1002 return false;
1003} 1003}
1004 1004
1005QString SharpFormat::toString( Calendar * ) 1005QString SharpFormat::toString( Calendar * )
1006{ 1006{
1007 return QString::null; 1007 return QString::null;
1008} 1008}