summaryrefslogtreecommitdiffabout
path: root/libkcal
authorzautrix <zautrix>2004-08-09 18:02:44 (UTC)
committer zautrix <zautrix>2004-08-09 18:02:44 (UTC)
commit4f05a9fcbb9e54184aef93883886aaf865104463 (patch) (unidiff)
treef5e94f7694b74dca3b11e1e74a94058a4526dafe /libkcal
parente1909ade2188e53feee65089d5f2882563876c58 (diff)
downloadkdepimpi-4f05a9fcbb9e54184aef93883886aaf865104463.zip
kdepimpi-4f05a9fcbb9e54184aef93883886aaf865104463.tar.gz
kdepimpi-4f05a9fcbb9e54184aef93883886aaf865104463.tar.bz2
more syncing
Diffstat (limited to 'libkcal') (more/less context) (ignore whitespace changes)
-rw-r--r--libkcal/phoneformat.cpp60
-rw-r--r--libkcal/phoneformat.h2
-rw-r--r--libkcal/vcalformat.cpp19
-rw-r--r--libkcal/vcalformat.h2
4 files changed, 32 insertions, 51 deletions
diff --git a/libkcal/phoneformat.cpp b/libkcal/phoneformat.cpp
index 11c68c5..e6d4879 100644
--- a/libkcal/phoneformat.cpp
+++ b/libkcal/phoneformat.cpp
@@ -489,820 +489,778 @@ public:
489 m = dtp->Month; 489 m = dtp->Month;
490 t = dtp->Day; 490 t = dtp->Day;
491 h = dtp->Hour; 491 h = dtp->Hour;
492 min = dtp->Minute; 492 min = dtp->Minute;
493 sec = dtp->Second; 493 sec = dtp->Second;
494 dt = QDateTime(QDate(y,m,t), QTime(h,min,sec)); 494 dt = QDateTime(QDate(y,m,t), QTime(h,min,sec));
495 // dtp->Timezone: offset in hours 495 // dtp->Timezone: offset in hours
496 int offset = KGlobal::locale()->localTimeOffset( dt ); 496 int offset = KGlobal::locale()->localTimeOffset( dt );
497 if ( useTz ) 497 if ( useTz )
498 dt = dt.addSecs ( offset*60); 498 dt = dt.addSecs ( offset*60);
499 return dt; 499 return dt;
500 500
501 } 501 }
502 502
503 static QString dtToString( const QDateTime& dti, bool useTZ = false ) 503 static QString dtToString( const QDateTime& dti, bool useTZ = false )
504 { 504 {
505 QString datestr; 505 QString datestr;
506 QString timestr; 506 QString timestr;
507 int offset = KGlobal::locale()->localTimeOffset( dti ); 507 int offset = KGlobal::locale()->localTimeOffset( dti );
508 QDateTime dt; 508 QDateTime dt;
509 if (useTZ) 509 if (useTZ)
510 dt = dti.addSecs ( -(offset*60)); 510 dt = dti.addSecs ( -(offset*60));
511 else 511 else
512 dt = dti; 512 dt = dti;
513 if(dt.date().isValid()){ 513 if(dt.date().isValid()){
514 const QDate& date = dt.date(); 514 const QDate& date = dt.date();
515 datestr.sprintf("%04d%02d%02d", 515 datestr.sprintf("%04d%02d%02d",
516 date.year(), date.month(), date.day()); 516 date.year(), date.month(), date.day());
517 } 517 }
518 if(dt.time().isValid()){ 518 if(dt.time().isValid()){
519 const QTime& time = dt.time(); 519 const QTime& time = dt.time();
520 timestr.sprintf("T%02d%02d%02d", 520 timestr.sprintf("T%02d%02d%02d",
521 time.hour(), time.minute(), time.second()); 521 time.hour(), time.minute(), time.second());
522 } 522 }
523 return datestr + timestr; 523 return datestr + timestr;
524 } 524 }
525 QDate datefromGSM ( GSM_DateTime*dtp ) { 525 QDate datefromGSM ( GSM_DateTime*dtp ) {
526 return QDate ( dtp->Year, dtp->Month, dtp->Day ); 526 return QDate ( dtp->Year, dtp->Month, dtp->Day );
527 } 527 }
528 QString getCategory( GSM_CalendarEntry*Note) 528 QString getCategory( GSM_CalendarEntry*Note)
529 { 529 {
530 QString CATEGORY; 530 QString CATEGORY;
531 switch (Note->Type) { 531 switch (Note->Type) {
532 case GSM_CAL_REMINDER : CATEGORY = QString("Reminder"); break; 532 case GSM_CAL_REMINDER : CATEGORY = QString("Reminder"); break;
533 case GSM_CAL_CALL : CATEGORY = QString("Call"); break; 533 case GSM_CAL_CALL : CATEGORY = QString("Call"); break;
534 case GSM_CAL_MEETING : CATEGORY = QString("Meeting"); break; 534 case GSM_CAL_MEETING : CATEGORY = QString("Meeting"); break;
535 case GSM_CAL_BIRTHDAY : CATEGORY = QString("Birthday"); break; 535 case GSM_CAL_BIRTHDAY : CATEGORY = QString("Birthday"); break;
536 case GSM_CAL_MEMO : CATEGORY = QString("Memo"); break; 536 case GSM_CAL_MEMO : CATEGORY = QString("Memo"); break;
537 case GSM_CAL_TRAVEL : CATEGORY = QString("Travel"); break; 537 case GSM_CAL_TRAVEL : CATEGORY = QString("Travel"); break;
538 case GSM_CAL_VACATION : CATEGORY = QString("Vacation"); break; 538 case GSM_CAL_VACATION : CATEGORY = QString("Vacation"); break;
539 case GSM_CAL_ALARM : CATEGORY = QString("Alarm"); break; 539 case GSM_CAL_ALARM : CATEGORY = QString("Alarm"); break;
540 case GSM_CAL_DAILY_ALARM : CATEGORY = QString("Daily alarm"); break; 540 case GSM_CAL_DAILY_ALARM : CATEGORY = QString("Daily alarm"); break;
541 case GSM_CAL_T_ATHL : CATEGORY = QString("Training/Athletism"); break; 541 case GSM_CAL_T_ATHL : CATEGORY = QString("Training/Athletism"); break;
542 case GSM_CAL_T_BALL : CATEGORY = QString("Training/Ball Games"); break; 542 case GSM_CAL_T_BALL : CATEGORY = QString("Training/Ball Games"); break;
543 case GSM_CAL_T_CYCL : CATEGORY = QString("Training/Cycling"); break; 543 case GSM_CAL_T_CYCL : CATEGORY = QString("Training/Cycling"); break;
544 case GSM_CAL_T_BUDO : CATEGORY = QString("Training/Budo"); break; 544 case GSM_CAL_T_BUDO : CATEGORY = QString("Training/Budo"); break;
545 case GSM_CAL_T_DANC : CATEGORY = QString("Training/Dance"); break; 545 case GSM_CAL_T_DANC : CATEGORY = QString("Training/Dance"); break;
546 case GSM_CAL_T_EXTR : CATEGORY = QString("Training/Extreme Sports"); break; 546 case GSM_CAL_T_EXTR : CATEGORY = QString("Training/Extreme Sports"); break;
547 case GSM_CAL_T_FOOT : CATEGORY = QString("Training/Football"); break; 547 case GSM_CAL_T_FOOT : CATEGORY = QString("Training/Football"); break;
548 case GSM_CAL_T_GOLF : CATEGORY = QString("Training/Golf"); break; 548 case GSM_CAL_T_GOLF : CATEGORY = QString("Training/Golf"); break;
549 case GSM_CAL_T_GYM : CATEGORY = QString("Training/Gym"); break; 549 case GSM_CAL_T_GYM : CATEGORY = QString("Training/Gym"); break;
550 case GSM_CAL_T_HORS : CATEGORY = QString("Training/Horse Races"); break; 550 case GSM_CAL_T_HORS : CATEGORY = QString("Training/Horse Races"); break;
551 case GSM_CAL_T_HOCK : CATEGORY = QString("Training/Hockey"); break; 551 case GSM_CAL_T_HOCK : CATEGORY = QString("Training/Hockey"); break;
552 case GSM_CAL_T_RACE : CATEGORY = QString("Training/Races"); break; 552 case GSM_CAL_T_RACE : CATEGORY = QString("Training/Races"); break;
553 case GSM_CAL_T_RUGB : CATEGORY = QString("Training/Rugby"); break; 553 case GSM_CAL_T_RUGB : CATEGORY = QString("Training/Rugby"); break;
554 case GSM_CAL_T_SAIL : CATEGORY = QString("Training/Sailing"); break; 554 case GSM_CAL_T_SAIL : CATEGORY = QString("Training/Sailing"); break;
555 case GSM_CAL_T_STRE : CATEGORY = QString("Training/Street Games"); break; 555 case GSM_CAL_T_STRE : CATEGORY = QString("Training/Street Games"); break;
556 case GSM_CAL_T_SWIM : CATEGORY = QString("Training/Swimming"); break; 556 case GSM_CAL_T_SWIM : CATEGORY = QString("Training/Swimming"); break;
557 case GSM_CAL_T_TENN : CATEGORY = QString("Training/Tennis"); break; 557 case GSM_CAL_T_TENN : CATEGORY = QString("Training/Tennis"); break;
558 case GSM_CAL_T_TRAV : CATEGORY = QString("Training/Travels"); break; 558 case GSM_CAL_T_TRAV : CATEGORY = QString("Training/Travels"); break;
559 case GSM_CAL_T_WINT : CATEGORY = QString("Training/Winter Games"); break; 559 case GSM_CAL_T_WINT : CATEGORY = QString("Training/Winter Games"); break;
560 default : CATEGORY = QString(""); 560 default : CATEGORY = QString("");
561 } 561 }
562 562
563 return CATEGORY; 563 return CATEGORY;
564 } 564 }
565 565
566protected: 566protected:
567private: 567private:
568 Calendar *mCalendar; 568 Calendar *mCalendar;
569 QString mProfileName ; 569 QString mProfileName ;
570}; 570};
571 571
572 572
573PhoneFormat::PhoneFormat(QString profileName, QString device,QString connection, QString model ) 573PhoneFormat::PhoneFormat(QString profileName, QString device,QString connection, QString model )
574{ 574{
575 mProfileName = profileName; 575 mProfileName = profileName;
576 mDevice = device; 576 mDevice = device;
577 mConnection = connection; 577 mConnection = connection;
578 mModel = model; 578 mModel = model;
579} 579}
580 580
581PhoneFormat::~PhoneFormat() 581PhoneFormat::~PhoneFormat()
582{ 582{
583} 583}
584int PhoneFormat::initDevice(GSM_StateMachine *s) 584int PhoneFormat::initDevice(GSM_StateMachine *s)
585{ 585{
586 GSM_ReadConfig(NULL, &s->Config[0], 0); 586 GSM_ReadConfig(NULL, &s->Config[0], 0);
587 s->ConfigNum = 1; 587 s->ConfigNum = 1;
588 GSM_Config *cfg = &s->Config[0]; 588 GSM_Config *cfg = &s->Config[0];
589 if ( ! mConnection.isEmpty() ) { 589 if ( ! mConnection.isEmpty() ) {
590 cfg->Connection = strdup(mConnection.latin1()); 590 cfg->Connection = strdup(mConnection.latin1());
591 cfg->DefaultConnection = false; 591 cfg->DefaultConnection = false;
592 qDebug("Connection set %s ", cfg->Connection ); 592 qDebug("Connection set %s ", cfg->Connection );
593 593
594 } 594 }
595 if ( ! mDevice.isEmpty() ) { 595 if ( ! mDevice.isEmpty() ) {
596 cfg->Device = strdup(mDevice.latin1()); 596 cfg->Device = strdup(mDevice.latin1());
597 cfg->DefaultDevice = false; 597 cfg->DefaultDevice = false;
598 qDebug("Device set %s ", cfg->Device); 598 qDebug("Device set %s ", cfg->Device);
599 599
600 } 600 }
601 if ( ! mModel.isEmpty() ) { 601 if ( ! mModel.isEmpty() ) {
602 strcpy(cfg->Model,mModel.latin1() ); 602 strcpy(cfg->Model,mModel.latin1() );
603 cfg->DefaultModel = false; 603 cfg->DefaultModel = false;
604 qDebug("Model set %s ",cfg->Model ); 604 qDebug("Model set %s ",cfg->Model );
605 } 605 }
606 int error=GSM_InitConnection(s,3); 606 int error=GSM_InitConnection(s,3);
607 return error; 607 return error;
608} 608}
609ulong PhoneFormat::getCsumTodo( Todo* todo ) 609ulong PhoneFormat::getCsumTodo( Todo* todo )
610{ 610{
611 QStringList attList; 611 QStringList attList;
612 if ( todo->hasDueDate() ) 612 if ( todo->hasDueDate() )
613 attList << PhoneParser::dtToString ( todo->dtDue() ); 613 attList << PhoneParser::dtToString ( todo->dtDue() );
614 attList << todo->summary(); 614 attList << todo->summary();
615 QString completedString = "no"; 615 QString completedString = "no";
616 if ( todo->isCompleted() ) 616 if ( todo->isCompleted() )
617 completedString = "yes"; 617 completedString = "yes";
618 attList << completedString; 618 attList << completedString;
619 attList << QString::number( todo->priority() ); 619 attList << QString::number( todo->priority() );
620 QString alarmString = "na"; 620 QString alarmString = "na";
621 Alarm *alarm; 621 Alarm *alarm;
622 if ( todo->alarms().count() > 0 ) { 622 if ( todo->alarms().count() > 0 ) {
623 alarm = todo->alarms().first(); 623 alarm = todo->alarms().first();
624 if ( alarm->enabled() ) { 624 if ( alarm->enabled() ) {
625 alarmString = QString::number(alarm->startOffset().asSeconds() ); 625 alarmString = QString::number(alarm->startOffset().asSeconds() );
626 } 626 }
627 } 627 }
628 attList << alarmString; 628 attList << alarmString;
629 attList << todo->categoriesStr(); 629 attList << todo->categoriesStr();
630 attList << todo->secrecyStr(); 630 attList << todo->secrecyStr();
631 return PhoneFormat::getCsum(attList ); 631 return PhoneFormat::getCsum(attList );
632 632
633} 633}
634ulong PhoneFormat::getCsumEvent( Event* event ) 634ulong PhoneFormat::getCsumEvent( Event* event )
635{ 635{
636 QStringList attList; 636 QStringList attList;
637 attList << PhoneParser::dtToString ( event->dtStart() ); 637 attList << PhoneParser::dtToString ( event->dtStart() );
638 attList << PhoneParser::dtToString ( event->dtEnd() ); 638 attList << PhoneParser::dtToString ( event->dtEnd() );
639 attList << event->summary(); 639 attList << event->summary();
640 attList << event->location(); 640 attList << event->location();
641 QString alarmString = "na"; 641 QString alarmString = "na";
642 Alarm *alarm; 642 Alarm *alarm;
643 if ( event->alarms().count() > 0 ) { 643 if ( event->alarms().count() > 0 ) {
644 alarm = event->alarms().first(); 644 alarm = event->alarms().first();
645 if ( alarm->enabled() ) { 645 if ( alarm->enabled() ) {
646 alarmString = QString::number( alarm->startOffset().asSeconds() ); 646 alarmString = QString::number( alarm->startOffset().asSeconds() );
647 } 647 }
648 } 648 }
649 attList << alarmString; 649 attList << alarmString;
650 Recurrence* rec = event->recurrence(); 650 Recurrence* rec = event->recurrence();
651 QStringList list; 651 QStringList list;
652 bool writeEndDate = false; 652 bool writeEndDate = false;
653 switch ( rec->doesRecur() ) 653 switch ( rec->doesRecur() )
654 { 654 {
655 case Recurrence::rDaily: // 0 655 case Recurrence::rDaily: // 0
656 list.append( "0" ); 656 list.append( "0" );
657 list.append( QString::number( rec->frequency() ));//12 657 list.append( QString::number( rec->frequency() ));//12
658 list.append( "0" ); 658 list.append( "0" );
659 list.append( "0" ); 659 list.append( "0" );
660 writeEndDate = true; 660 writeEndDate = true;
661 break; 661 break;
662 case Recurrence::rWeekly:// 1 662 case Recurrence::rWeekly:// 1
663 list.append( "1" ); 663 list.append( "1" );
664 list.append( QString::number( rec->frequency()) );//12 664 list.append( QString::number( rec->frequency()) );//12
665 list.append( "0" ); 665 list.append( "0" );
666 { 666 {
667 int days = 0; 667 int days = 0;
668 QBitArray weekDays = rec->days(); 668 QBitArray weekDays = rec->days();
669 int i; 669 int i;
670 for( i = 1; i <= 7; ++i ) { 670 for( i = 1; i <= 7; ++i ) {
671 if ( weekDays[i-1] ) { 671 if ( weekDays[i-1] ) {
672 days += 1 << (i-1); 672 days += 1 << (i-1);
673 } 673 }
674 } 674 }
675 list.append( QString::number( days ) ); 675 list.append( QString::number( days ) );
676 } 676 }
677 //pending weekdays 677 //pending weekdays
678 writeEndDate = true; 678 writeEndDate = true;
679 679
680 break; 680 break;
681 case Recurrence::rMonthlyPos:// 2 681 case Recurrence::rMonthlyPos:// 2
682 list.append( "2" ); 682 list.append( "2" );
683 list.append( QString::number( rec->frequency()) );//12 683 list.append( QString::number( rec->frequency()) );//12
684 684
685 writeEndDate = true; 685 writeEndDate = true;
686 { 686 {
687 int count = 1; 687 int count = 1;
688 QPtrList<Recurrence::rMonthPos> rmp; 688 QPtrList<Recurrence::rMonthPos> rmp;
689 rmp = rec->monthPositions(); 689 rmp = rec->monthPositions();
690 if ( rmp.first()->negative ) 690 if ( rmp.first()->negative )
691 count = 5 - rmp.first()->rPos - 1; 691 count = 5 - rmp.first()->rPos - 1;
692 else 692 else
693 count = rmp.first()->rPos - 1; 693 count = rmp.first()->rPos - 1;
694 list.append( QString::number( count ) ); 694 list.append( QString::number( count ) );
695 695
696 } 696 }
697 697
698 list.append( "0" ); 698 list.append( "0" );
699 break; 699 break;
700 case Recurrence::rMonthlyDay:// 3 700 case Recurrence::rMonthlyDay:// 3
701 list.append( "3" ); 701 list.append( "3" );
702 list.append( QString::number( rec->frequency()) );//12 702 list.append( QString::number( rec->frequency()) );//12
703 list.append( "0" ); 703 list.append( "0" );
704 list.append( "0" ); 704 list.append( "0" );
705 writeEndDate = true; 705 writeEndDate = true;
706 break; 706 break;
707 case Recurrence::rYearlyMonth://4 707 case Recurrence::rYearlyMonth://4
708 list.append( "4" ); 708 list.append( "4" );
709 list.append( QString::number( rec->frequency()) );//12 709 list.append( QString::number( rec->frequency()) );//12
710 list.append( "0" ); 710 list.append( "0" );
711 list.append( "0" ); 711 list.append( "0" );
712 writeEndDate = true; 712 writeEndDate = true;
713 break; 713 break;
714 714
715 default: 715 default:
716 list.append( "255" ); 716 list.append( "255" );
717 list.append( QString() ); 717 list.append( QString() );
718 list.append( "0" ); 718 list.append( "0" );
719 list.append( QString() ); 719 list.append( QString() );
720 list.append( "0" ); 720 list.append( "0" );
721 list.append( "20991231T000000" ); 721 list.append( "20991231T000000" );
722 break; 722 break;
723 } 723 }
724 if ( writeEndDate ) { 724 if ( writeEndDate ) {
725 725
726 if ( rec->endDate().isValid() ) { // 15 + 16 726 if ( rec->endDate().isValid() ) { // 15 + 16
727 list.append( "1" ); 727 list.append( "1" );
728 list.append( PhoneParser::dtToString( rec->endDate()) ); 728 list.append( PhoneParser::dtToString( rec->endDate()) );
729 } else { 729 } else {
730 list.append( "0" ); 730 list.append( "0" );
731 list.append( "20991231T000000" ); 731 list.append( "20991231T000000" );
732 } 732 }
733 733
734 } 734 }
735 attList << list.join(""); 735 attList << list.join("");
736 attList << event->categoriesStr(); 736 attList << event->categoriesStr();
737 attList << event->secrecyStr(); 737 attList << event->secrecyStr();
738 return PhoneFormat::getCsum(attList ); 738 return PhoneFormat::getCsum(attList );
739} 739}
740ulong PhoneFormat::getCsum( const QStringList & attList) 740ulong PhoneFormat::getCsum( const QStringList & attList)
741{ 741{
742 int max = attList.count() -1; 742 int max = attList.count() -1;
743 ulong cSum = 0; 743 ulong cSum = 0;
744 int j,k,i; 744 int j,k,i;
745 int add; 745 int add;
746 for ( i = 1; i < max ; ++i ) { 746 for ( i = 1; i < max ; ++i ) {
747 QString s = attList[i]; 747 QString s = attList[i];
748 if ( ! s.isEmpty() ){ 748 if ( ! s.isEmpty() ){
749 j = s.length(); 749 j = s.length();
750 for ( k = 0; k < j; ++k ) { 750 for ( k = 0; k < j; ++k ) {
751 int mul = k +1; 751 int mul = k +1;
752 add = s[k].unicode (); 752 add = s[k].unicode ();
753 if ( k < 16 ) 753 if ( k < 16 )
754 mul = mul * mul; 754 mul = mul * mul;
755 add = add * mul *i*i*i; 755 add = add * mul *i*i*i;
756 cSum += add; 756 cSum += add;
757 } 757 }
758 } 758 }
759 } 759 }
760 return cSum; 760 return cSum;
761 761
762} 762}
763//extern "C" GSM_Error GSM_InitConnection(GSM_StateMachine *s, int ReplyNum); 763//extern "C" GSM_Error GSM_InitConnection(GSM_StateMachine *s, int ReplyNum);
764#include <stdlib.h> 764#include <stdlib.h>
765#define DEBUGMODE false 765#define DEBUGMODE false
766bool PhoneFormat::load( Calendar *calendar, Calendar *existingCal) 766bool PhoneFormat::load( Calendar *calendar, Calendar *existingCal)
767{ 767{
768 GSM_StateMachines; 768 GSM_StateMachines;
769 qDebug(" load "); 769 qDebug(" load ");
770 s.opened = false; 770 s.opened = false;
771 s.msg = NULL; 771 s.msg = NULL;
772 s.ConfigNum = 0; 772 s.ConfigNum = 0;
773 QLabel status ( i18n("Reading data. Opening device ..."), 0 ); 773 QLabel status ( i18n("Reading data. Opening device ..."), 0 );
774 int w = status.sizeHint().width()+20 ; 774 int w = status.sizeHint().width()+20 ;
775 if ( w < 200 ) w = 200; 775 if ( w < 200 ) w = 200;
776 int h = status.sizeHint().height()+20 ; 776 int h = status.sizeHint().height()+20 ;
777 int dw = QApplication::desktop()->width(); 777 int dw = QApplication::desktop()->width();
778 int dh = QApplication::desktop()->height(); 778 int dh = QApplication::desktop()->height();
779 status.setCaption(i18n("Reading Phone Data") ); 779 status.setCaption(i18n("Reading Phone Data") );
780 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 780 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
781 status.show(); 781 status.show();
782 status.raise(); 782 status.raise();
783 qApp->processEvents(); 783 qApp->processEvents();
784#if 0 784#if 0
785 static char*cp; 785 static char*cp;
786 static INI_Section *cfg = NULL; 786 static INI_Section *cfg = NULL;
787 cfg=GSM_FindGammuRC(); 787 cfg=GSM_FindGammuRC();
788 int i; 788 int i;
789 for (i = 0; i <= MAX_CONFIG_NUM; i++) { 789 for (i = 0; i <= MAX_CONFIG_NUM; i++) {
790 if (cfg!=NULL) { 790 if (cfg!=NULL) {
791 cp = (char *)INI_GetValue(cfg, (unsigned char*) "gammu", (unsigned char*)"gammucoding", false); 791 cp = (char *)INI_GetValue(cfg, (unsigned char*) "gammu", (unsigned char*)"gammucoding", false);
792 if (cp) di.coding = cp; 792 if (cp) di.coding = cp;
793 793
794 s.Config[i].Localize = (char *)INI_GetValue(cfg, (unsigned char*) "gammu", (unsigned char*) "gammuloc", false); 794 s.Config[i].Localize = (char *)INI_GetValue(cfg, (unsigned char*) "gammu", (unsigned char*) "gammuloc", false);
795 if (s.Config[i].Localize) { 795 if (s.Config[i].Localize) {
796 s.msg=INI_ReadFile(s.Config[i].Localize, true); 796 s.msg=INI_ReadFile(s.Config[i].Localize, true);
797 } else { 797 } else {
798#if !defined(WIN32) && defined(LOCALE_PATH) 798#if !defined(WIN32) && defined(LOCALE_PATH)
799 locale = setlocale(LC_MESSAGES, NULL); 799 locale = setlocale(LC_MESSAGES, NULL);
800 if (locale != NULL) { 800 if (locale != NULL) {
801 snprintf(locale_file, 200, "%s/gammu_%c%c.txt", 801 snprintf(locale_file, 200, "%s/gammu_%c%c.txt",
802 LOCALE_PATH, 802 LOCALE_PATH,
803 tolower(locale[0]), 803 tolower(locale[0]),
804 tolower(locale[1])); 804 tolower(locale[1]));
805 s.msg = INI_ReadFile(locale_file, true); 805 s.msg = INI_ReadFile(locale_file, true);
806 } 806 }
807#endif 807#endif
808 } 808 }
809 } 809 }
810 810
811 /* Wanted user specific configuration? */ 811 /* Wanted user specific configuration? */
812 812
813 if (!GSM_ReadConfig(cfg, &s.Config[i], i) && i != 0) break; 813 if (!GSM_ReadConfig(cfg, &s.Config[i], i) && i != 0) break;
814 814
815 s.ConfigNum++; 815 s.ConfigNum++;
816 816
817 /* We want to use only one file descriptor for global and state machine debug output */ 817 /* We want to use only one file descriptor for global and state machine debug output */
818 s.Config[i].UseGlobalDebugFile = true; 818 s.Config[i].UseGlobalDebugFile = true;
819 819
820 820
821 821
822 /* We wanted to read just user specified configuration. */ 822 /* We wanted to read just user specified configuration. */
823 {break;} 823 {break;}
824 } 824 }
825 825
826#endif 826#endif
827 int error=initDevice(&s); 827 int error=initDevice(&s);
828 qDebug("GSM Init %d (no error is %d)", error, ERR_NONE); 828 qDebug("GSM Init %d (no error is %d)", error, ERR_NONE);
829 if ( error != ERR_NONE ) 829 if ( error != ERR_NONE )
830 return false; 830 return false;
831 GSM_Phone_Functions*Phone; 831 GSM_Phone_Functions*Phone;
832 GSM_CalendarEntrynote; 832 GSM_CalendarEntrynote;
833 bool start = true; 833 bool start = true;
834 Phone=s.Phone.Functions; 834 Phone=s.Phone.Functions;
835 bool gshutdown = false; 835 bool gshutdown = false;
836 PhoneParser handler( calendar, mProfileName ); 836 PhoneParser handler( calendar, mProfileName );
837 int ccc = 0; 837 int ccc = 0;
838 QString message = i18n("Processing event # "); 838 QString message = i18n("Processing event # ");
839 int procCount = 0; 839 int procCount = 0;
840 qDebug("Debug: only 10 calender items are downloaded "); 840 qDebug("Debug: only 10 calender items are downloaded ");
841 while (!gshutdown && ccc++ < 10) { 841 while (!gshutdown && ccc++ < 10) {
842 status.setText ( message + QString::number ( ++procCount ) ); 842 status.setText ( message + QString::number ( ++procCount ) );
843 qApp->processEvents(); 843 qApp->processEvents();
844 qDebug("readEvent %d ", ccc); 844 qDebug("readEvent %d ", ccc);
845 error=Phone->GetNextCalendar(&s,&note,start); 845 error=Phone->GetNextCalendar(&s,&note,start);
846 if (error == ERR_EMPTY) break; 846 if (error == ERR_EMPTY) break;
847 start = false; 847 start = false;
848 handler.readEvent( existingCal, &note ); 848 handler.readEvent( existingCal, &note );
849 } 849 }
850 850
851 start = true; 851 start = true;
852 GSM_ToDoEntry ToDo; 852 GSM_ToDoEntry ToDo;
853 ccc = 0; 853 ccc = 0;
854 message = i18n("Processing todo # "); 854 message = i18n("Processing todo # ");
855 procCount = 0; 855 procCount = 0;
856 while (!gshutdown) { 856 while (!gshutdown) {
857 status.setText ( message + QString::number ( ++procCount ) ); 857 status.setText ( message + QString::number ( ++procCount ) );
858 qApp->processEvents(); 858 qApp->processEvents();
859 error = Phone->GetNextToDo(&s, &ToDo, start); 859 error = Phone->GetNextToDo(&s, &ToDo, start);
860 if (error == ERR_EMPTY) break; 860 if (error == ERR_EMPTY) break;
861 start = false; 861 start = false;
862 qDebug("ReadTodo %d ", ++ccc); 862 qDebug("ReadTodo %d ", ++ccc);
863 handler.readTodo( existingCal, &ToDo, &s); 863 handler.readTodo( existingCal, &ToDo, &s);
864 864
865 } 865 }
866 866
867 error=GSM_TerminateConnection(&s); 867 error=GSM_TerminateConnection(&s);
868 868
869 return true; 869 return true;
870} 870}
871void PhoneFormat::event2GSM( Event* ev, GSM_CalendarEntry*Note ) 871void PhoneFormat::event2GSM( Event* ev, GSM_CalendarEntry*Note )
872{ 872{
873 873 QString eText = vfconverter.eventToString( ev );
874 int pos = 0;
875 GSM_ToDoEntry dummy;
876 GSM_DecodeVCALENDAR_VTODO( (unsigned char*)eText.latin1(), &pos, Note , &dummy, Nokia_VCalendar, Nokia_VToDo );
874} 877}
875void PhoneFormat::todo2GSM( Todo* todo, GSM_ToDoEntry *gsm ) 878void PhoneFormat::todo2GSM( Todo* todo, GSM_ToDoEntry *gsmTodo )
876{ 879{
877#if 0 880 QString tText = vfconverter.todoToString( todo );
878 QStringList list; 881 int pos = 0;
879 list.append( QString::number( todo->zaurusId() ) ); 882 GSM_CalendarEntry dummy;
880 list.append( todo->categories().join(",") ); 883 GSM_DecodeVCALENDAR_VTODO( (unsigned char*)tText.latin1(), &pos, &dummy, gsmTodo, Nokia_VCalendar, Nokia_VToDo );
881
882 if ( todo->hasStartDate() ) {
883 list.append( dtToString( todo->dtStart()) );
884 } else
885 list.append( QString() );
886
887 if ( todo->hasDueDate() ) {
888 QTime tim;
889 if ( todo->doesFloat()) {
890 list.append( dtToString( QDateTime(todo->dtDue().date(),QTime( 0,0,0 )), false)) ;
891 } else {
892 list.append( dtToString(todo->dtDue() ) );
893 }
894 } else
895 list.append( QString() );
896
897 if ( todo->isCompleted() ) {
898 list.append( dtToString( todo->completed()) );
899 list.append( "0" ); // yes 0 == completed
900 } else {
901 list.append( dtToString( todo->completed()) );
902 list.append( "1" );
903 }
904 list.append( QString::number( todo->priority() ));
905 if( ! todo->summary().isEmpty() )
906 list.append( todo->summary() );
907 else
908 list.append( "" );
909 if (! todo->description().isEmpty() )
910 list.append( todo->description() );
911 else
912 list.append( "" );
913 for(QStringList::Iterator it=list.begin();
914 it!=list.end(); ++it){
915 QString& s = (*it);
916 s.replace(QRegExp("\""), "\"\"");
917 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){
918 s.prepend('\"');
919 s.append('\"');
920 } else if(s.isEmpty() && !s.isNull()){
921 s = "\"\"";
922 }
923 }
924 return list.join(",");
925#endif
926} 884}
927void PhoneFormat::afterSave( Incidence* inc) 885void PhoneFormat::afterSave( Incidence* inc)
928{ 886{
929 uint csum; 887 uint csum;
930 if ( inc->type() == "Event") 888 if ( inc->type() == "Event")
931 csum = PhoneFormat::getCsumEvent( (Event*) inc ); 889 csum = PhoneFormat::getCsumEvent( (Event*) inc );
932 else 890 else
933 csum = PhoneFormat::getCsumTodo( (Todo*) inc ); 891 csum = PhoneFormat::getCsumTodo( (Todo*) inc );
934 inc->setCsum( mProfileName, QString::number( csum )); 892 inc->setCsum( mProfileName, QString::number( csum ));
935 inc->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID ); 893 inc->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID );
936 894
937} 895}
938bool PhoneFormat::save( Calendar *calendar) 896bool PhoneFormat::save( Calendar *calendar)
939{ 897{
940 GSM_StateMachines; 898 GSM_StateMachines;
941 qDebug(" save "); 899 qDebug(" save ");
942 s.opened = false; 900 s.opened = false;
943 s.msg = NULL; 901 s.msg = NULL;
944 s.ConfigNum = 0; 902 s.ConfigNum = 0;
945 QLabel status ( i18n("Writing data. Opening device ..."), 0 ); 903 QLabel status ( i18n("Writing data. Opening device ..."), 0 );
946 int w = status.sizeHint().width()+20 ; 904 int w = status.sizeHint().width()+20 ;
947 if ( w < 200 ) w = 200; 905 if ( w < 200 ) w = 200;
948 int h = status.sizeHint().height()+20 ; 906 int h = status.sizeHint().height()+20 ;
949 int dw = QApplication::desktop()->width(); 907 int dw = QApplication::desktop()->width();
950 int dh = QApplication::desktop()->height(); 908 int dh = QApplication::desktop()->height();
951 status.setCaption(i18n("Writing Phone Data") ); 909 status.setCaption(i18n("Writing Phone Data") );
952 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 910 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
953 status.show(); 911 status.show();
954 status.raise(); 912 status.raise();
955 qApp->processEvents(); 913 qApp->processEvents();
956 914
957 int error=initDevice(&s); 915 int error=initDevice(&s);
958 qDebug("GSM Init %d (no error is %d)", error, ERR_NONE); 916 qDebug("GSM Init %d (no error is %d)", error, ERR_NONE);
959 if ( error != ERR_NONE ) 917 if ( error != ERR_NONE )
960 return false; 918 return false;
961 GSM_Phone_Functions*Phone; 919 GSM_Phone_Functions*Phone;
962 GSM_CalendarEntryNote; 920 GSM_CalendarEntryNote;
963 bool start = true; 921 bool start = true;
964 Phone=s.Phone.Functions; 922 Phone=s.Phone.Functions;
965 bool gshutdown = false; 923 bool gshutdown = false;
966 QPtrList<Event> er = calendar->rawEvents(); 924 QPtrList<Event> er = calendar->rawEvents();
967 Event* ev = er.first(); 925 Event* ev = er.first();
968 QString message = i18n("Processing event # "); 926 QString message = i18n("Processing event # ");
969 int procCount = 0; 927 int procCount = 0;
970 while ( ev ) { 928 while ( ev ) {
971 //qDebug("i %d ", ++i); 929 //qDebug("i %d ", ++i);
972 if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { // event was changed during sync or is a new one 930 if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { // event was changed during sync or is a new one
973 931
974 status.setText ( message + QString::number ( ++procCount ) ); 932 status.setText ( message + QString::number ( ++procCount ) );
975 qApp->processEvents(); 933 qApp->processEvents();
976 event2GSM( ev, &Note ); 934 event2GSM( ev, &Note );
977 if ( ev->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete 935 if ( ev->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete
978 error = Phone->DeleteCalendar(&s, &Note); 936 error = Phone->DeleteCalendar(&s, &Note);
979 } 937 }
980 else if ( ev->getID(mProfileName).isEmpty() ) { // add new 938 else if ( ev->getID(mProfileName).isEmpty() ) { // add new
981 // we have to do this later after deleting 939 // we have to do this later after deleting
982 940
983 } 941 }
984 else { // change existing 942 else { // change existing
985 error = Phone->SetCalendar(&s, &Note); 943 error = Phone->SetCalendar(&s, &Note);
986 } 944 }
987 } 945 }
988 ev = er.next(); 946 ev = er.next();
989 } 947 }
990 ev = er.first(); 948 ev = er.first();
991 // pending get empty slots 949 // pending get empty slots
992 while ( ev ) { 950 while ( ev ) {
993 if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL && ev->tempSyncStat() != SYNC_TEMPSTATE_DELETE) { 951 if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL && ev->tempSyncStat() != SYNC_TEMPSTATE_DELETE) {
994 if ( ev->getID(mProfileName).isEmpty() ) { 952 if ( ev->getID(mProfileName).isEmpty() ) {
995 status.setText ( message + QString::number ( ++procCount ) ); 953 status.setText ( message + QString::number ( ++procCount ) );
996 qApp->processEvents(); 954 qApp->processEvents();
997 //int newID ;//= pending 955 //int newID ;//= pending
998 //ev->setID(mProfileName, QString::number( newID )); 956 //ev->setID(mProfileName, QString::number( newID ));
999 event2GSM( ev, &Note ); 957 event2GSM( ev, &Note );
1000 Note.Location = 0; 958 Note.Location = 0;
1001 error = Phone->AddCalendar(&s, &Note); 959 error = Phone->AddCalendar(&s, &Note);
1002 ev->setID( mProfileName, QString::number( Note.Location ) ); 960 ev->setID( mProfileName, QString::number( Note.Location ) );
1003 qDebug("New Calendar. Location %d ",Note.Location ); 961 qDebug("New Calendar. Location %d ",Note.Location );
1004 afterSave( ev ); 962 afterSave( ev );
1005 } else { 963 } else {
1006 afterSave( ev ); // setting temp sync stat for changed items 964 afterSave( ev ); // setting temp sync stat for changed items
1007 } 965 }
1008 } 966 }
1009 ev = er.next(); 967 ev = er.next();
1010 } 968 }
1011 GSM_ToDoEntry ToDoEntry; 969 GSM_ToDoEntry ToDoEntry;
1012 QPtrList<Todo> tl = calendar->rawTodos(); 970 QPtrList<Todo> tl = calendar->rawTodos();
1013 Todo* to = tl.first(); 971 Todo* to = tl.first();
1014 972
1015 message = i18n("Processing todo # "); 973 message = i18n("Processing todo # ");
1016 procCount = 0; 974 procCount = 0;
1017 while ( to ) { 975 while ( to ) {
1018 if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { 976 if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) {
1019 status.setText ( message + QString::number ( ++procCount ) ); 977 status.setText ( message + QString::number ( ++procCount ) );
1020 qApp->processEvents(); 978 qApp->processEvents();
1021 todo2GSM( to, &ToDoEntry ); 979 todo2GSM( to, &ToDoEntry );
1022 if ( to->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete 980 if ( to->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete
1023 error=Phone->DeleteToDo(&s,&ToDoEntry); 981 error=Phone->DeleteToDo(&s,&ToDoEntry);
1024 } 982 }
1025 else if ( to->getID("Sharp_DTM").isEmpty() ) { // add new 983 else if ( to->getID("Sharp_DTM").isEmpty() ) { // add new
1026 ; 984 ;
1027 } 985 }
1028 else { // change existing 986 else { // change existing
1029 error=Phone->SetToDo(&s,&ToDoEntry); 987 error=Phone->SetToDo(&s,&ToDoEntry);
1030 } 988 }
1031 } 989 }
1032 to = tl.next(); 990 to = tl.next();
1033 } 991 }
1034 992
1035 // pending get empty slots 993 // pending get empty slots
1036 to = tl.first(); 994 to = tl.first();
1037 while ( to ) { 995 while ( to ) {
1038 if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL && to->tempSyncStat() != SYNC_TEMPSTATE_DELETE) { 996 if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL && to->tempSyncStat() != SYNC_TEMPSTATE_DELETE) {
1039 if ( to->getID(mProfileName).isEmpty() ) { 997 if ( to->getID(mProfileName).isEmpty() ) {
1040 status.setText ( message + QString::number ( ++procCount ) ); 998 status.setText ( message + QString::number ( ++procCount ) );
1041 qApp->processEvents(); 999 qApp->processEvents();
1042 //int newID ;//= pending 1000 //int newID ;//= pending
1043 //to->setID(mProfileName, QString::number( newID )); 1001 //to->setID(mProfileName, QString::number( newID ));
1044 todo2GSM( to, &ToDoEntry ); 1002 todo2GSM( to, &ToDoEntry );
1045 ToDoEntry.Location = 0; 1003 ToDoEntry.Location = 0;
1046 error=Phone->AddToDo(&s,&ToDoEntry); 1004 error=Phone->AddToDo(&s,&ToDoEntry);
1047 to->setID(mProfileName, QString::number( ToDoEntry.Location )); 1005 to->setID(mProfileName, QString::number( ToDoEntry.Location ));
1048 afterSave( to ); 1006 afterSave( to );
1049 qDebug("New Todo. Location %d ",ToDoEntry.Location ); 1007 qDebug("New Todo. Location %d ",ToDoEntry.Location );
1050 } else { 1008 } else {
1051 afterSave( to ); 1009 afterSave( to );
1052 } 1010 }
1053 } 1011 }
1054 to = tl.next(); 1012 to = tl.next();
1055 } 1013 }
1056 return true; 1014 return true;
1057} 1015}
1058QString PhoneFormat::dtToGSM( const QDateTime& dti, bool useTZ ) 1016QString PhoneFormat::dtToGSM( const QDateTime& dti, bool useTZ )
1059{ 1017{
1060 QString datestr; 1018 QString datestr;
1061 QString timestr; 1019 QString timestr;
1062 int offset = KGlobal::locale()->localTimeOffset( dti ); 1020 int offset = KGlobal::locale()->localTimeOffset( dti );
1063 QDateTime dt; 1021 QDateTime dt;
1064 if (useTZ) 1022 if (useTZ)
1065 dt = dti.addSecs ( -(offset*60)); 1023 dt = dti.addSecs ( -(offset*60));
1066 else 1024 else
1067 dt = dti; 1025 dt = dti;
1068 if(dt.date().isValid()){ 1026 if(dt.date().isValid()){
1069 const QDate& date = dt.date(); 1027 const QDate& date = dt.date();
1070 datestr.sprintf("%04d%02d%02d", 1028 datestr.sprintf("%04d%02d%02d",
1071 date.year(), date.month(), date.day()); 1029 date.year(), date.month(), date.day());
1072 } 1030 }
1073 if(dt.time().isValid()){ 1031 if(dt.time().isValid()){
1074 const QTime& time = dt.time(); 1032 const QTime& time = dt.time();
1075 timestr.sprintf("T%02d%02d%02d", 1033 timestr.sprintf("T%02d%02d%02d",
1076 time.hour(), time.minute(), time.second()); 1034 time.hour(), time.minute(), time.second());
1077 } 1035 }
1078 return datestr + timestr; 1036 return datestr + timestr;
1079} 1037}
1080QString PhoneFormat::getEventString( Event* event ) 1038QString PhoneFormat::getEventString( Event* event )
1081{ 1039{
1082#if 0 1040#if 0
1083 QStringList list; 1041 QStringList list;
1084 list.append( QString::number(event->zaurusId() ) ); 1042 list.append( QString::number(event->zaurusId() ) );
1085 list.append( event->categories().join(",") ); 1043 list.append( event->categories().join(",") );
1086 if ( !event->summary().isEmpty() ) 1044 if ( !event->summary().isEmpty() )
1087 list.append( event->summary() ); 1045 list.append( event->summary() );
1088 else 1046 else
1089 list.append("" ); 1047 list.append("" );
1090 if ( !event->location().isEmpty() ) 1048 if ( !event->location().isEmpty() )
1091 list.append( event->location() ); 1049 list.append( event->location() );
1092 else 1050 else
1093 list.append("" ); 1051 list.append("" );
1094 if ( !event->description().isEmpty() ) 1052 if ( !event->description().isEmpty() )
1095 list.append( event->description() ); 1053 list.append( event->description() );
1096 else 1054 else
1097 list.append( "" ); 1055 list.append( "" );
1098 if ( event->doesFloat () ) { 1056 if ( event->doesFloat () ) {
1099 list.append( dtToString( QDateTime(event->dtStart().date(), QTime(0,0,0)), false )); 1057 list.append( dtToString( QDateTime(event->dtStart().date(), QTime(0,0,0)), false ));
1100 list.append( dtToString( QDateTime(event->dtEnd().date(),QTime(23,59,59)), false )); //6 1058 list.append( dtToString( QDateTime(event->dtEnd().date(),QTime(23,59,59)), false )); //6
1101 list.append( "1" ); 1059 list.append( "1" );
1102 1060
1103 } 1061 }
1104 else { 1062 else {
1105 list.append( dtToString( event->dtStart()) ); 1063 list.append( dtToString( event->dtStart()) );
1106 list.append( dtToString( event->dtEnd()) ); //6 1064 list.append( dtToString( event->dtEnd()) ); //6
1107 list.append( "0" ); 1065 list.append( "0" );
1108 } 1066 }
1109 bool noAlarm = true; 1067 bool noAlarm = true;
1110 if ( event->alarms().count() > 0 ) { 1068 if ( event->alarms().count() > 0 ) {
1111 Alarm * al = event->alarms().first(); 1069 Alarm * al = event->alarms().first();
1112 if ( al->enabled() ) { 1070 if ( al->enabled() ) {
1113 noAlarm = false; 1071 noAlarm = false;
1114 list.append( "0" ); // yes, 0 == alarm 1072 list.append( "0" ); // yes, 0 == alarm
1115 list.append( QString::number( al->startOffset().asSeconds()/(-60) ) ); 1073 list.append( QString::number( al->startOffset().asSeconds()/(-60) ) );
1116 if ( al->type() == Alarm::Audio ) 1074 if ( al->type() == Alarm::Audio )
1117 list.append( "1" ); // type audio 1075 list.append( "1" ); // type audio
1118 else 1076 else
1119 list.append( "0" ); // type silent 1077 list.append( "0" ); // type silent
1120 } 1078 }
1121 } 1079 }
1122 if ( noAlarm ) { 1080 if ( noAlarm ) {
1123 list.append( "1" ); // yes, 1 == no alarm 1081 list.append( "1" ); // yes, 1 == no alarm
1124 list.append( "0" ); // no alarm offset 1082 list.append( "0" ); // no alarm offset
1125 list.append( "1" ); // type 1083 list.append( "1" ); // type
1126 } 1084 }
1127 // next is: 11 1085 // next is: 11
1128 // next is: 11-16 are recurrence 1086 // next is: 11-16 are recurrence
1129 Recurrence* rec = event->recurrence(); 1087 Recurrence* rec = event->recurrence();
1130 1088
1131 bool writeEndDate = false; 1089 bool writeEndDate = false;
1132 switch ( rec->doesRecur() ) 1090 switch ( rec->doesRecur() )
1133 { 1091 {
1134 case Recurrence::rDaily: // 0 1092 case Recurrence::rDaily: // 0
1135 list.append( "0" ); 1093 list.append( "0" );
1136 list.append( QString::number( rec->frequency() ));//12 1094 list.append( QString::number( rec->frequency() ));//12
1137 list.append( "0" ); 1095 list.append( "0" );
1138 list.append( "0" ); 1096 list.append( "0" );
1139 writeEndDate = true; 1097 writeEndDate = true;
1140 break; 1098 break;
1141 case Recurrence::rWeekly:// 1 1099 case Recurrence::rWeekly:// 1
1142 list.append( "1" ); 1100 list.append( "1" );
1143 list.append( QString::number( rec->frequency()) );//12 1101 list.append( QString::number( rec->frequency()) );//12
1144 list.append( "0" ); 1102 list.append( "0" );
1145 { 1103 {
1146 int days = 0; 1104 int days = 0;
1147 QBitArray weekDays = rec->days(); 1105 QBitArray weekDays = rec->days();
1148 int i; 1106 int i;
1149 for( i = 1; i <= 7; ++i ) { 1107 for( i = 1; i <= 7; ++i ) {
1150 if ( weekDays[i-1] ) { 1108 if ( weekDays[i-1] ) {
1151 days += 1 << (i-1); 1109 days += 1 << (i-1);
1152 } 1110 }
1153 } 1111 }
1154 list.append( QString::number( days ) ); 1112 list.append( QString::number( days ) );
1155 } 1113 }
1156 //pending weekdays 1114 //pending weekdays
1157 writeEndDate = true; 1115 writeEndDate = true;
1158 1116
1159 break; 1117 break;
1160 case Recurrence::rMonthlyPos:// 2 1118 case Recurrence::rMonthlyPos:// 2
1161 list.append( "2" ); 1119 list.append( "2" );
1162 list.append( QString::number( rec->frequency()) );//12 1120 list.append( QString::number( rec->frequency()) );//12
1163 1121
1164 writeEndDate = true; 1122 writeEndDate = true;
1165 { 1123 {
1166 int count = 1; 1124 int count = 1;
1167 QPtrList<Recurrence::rMonthPos> rmp; 1125 QPtrList<Recurrence::rMonthPos> rmp;
1168 rmp = rec->monthPositions(); 1126 rmp = rec->monthPositions();
1169 if ( rmp.first()->negative ) 1127 if ( rmp.first()->negative )
1170 count = 5 - rmp.first()->rPos - 1; 1128 count = 5 - rmp.first()->rPos - 1;
1171 else 1129 else
1172 count = rmp.first()->rPos - 1; 1130 count = rmp.first()->rPos - 1;
1173 list.append( QString::number( count ) ); 1131 list.append( QString::number( count ) );
1174 1132
1175 } 1133 }
1176 1134
1177 list.append( "0" ); 1135 list.append( "0" );
1178 break; 1136 break;
1179 case Recurrence::rMonthlyDay:// 3 1137 case Recurrence::rMonthlyDay:// 3
1180 list.append( "3" ); 1138 list.append( "3" );
1181 list.append( QString::number( rec->frequency()) );//12 1139 list.append( QString::number( rec->frequency()) );//12
1182 list.append( "0" ); 1140 list.append( "0" );
1183 list.append( "0" ); 1141 list.append( "0" );
1184 writeEndDate = true; 1142 writeEndDate = true;
1185 break; 1143 break;
1186 case Recurrence::rYearlyMonth://4 1144 case Recurrence::rYearlyMonth://4
1187 list.append( "4" ); 1145 list.append( "4" );
1188 list.append( QString::number( rec->frequency()) );//12 1146 list.append( QString::number( rec->frequency()) );//12
1189 list.append( "0" ); 1147 list.append( "0" );
1190 list.append( "0" ); 1148 list.append( "0" );
1191 writeEndDate = true; 1149 writeEndDate = true;
1192 break; 1150 break;
1193 1151
1194 default: 1152 default:
1195 list.append( "255" ); 1153 list.append( "255" );
1196 list.append( QString() ); 1154 list.append( QString() );
1197 list.append( "0" ); 1155 list.append( "0" );
1198 list.append( QString() ); 1156 list.append( QString() );
1199 list.append( "0" ); 1157 list.append( "0" );
1200 list.append( "20991231T000000" ); 1158 list.append( "20991231T000000" );
1201 break; 1159 break;
1202 } 1160 }
1203 if ( writeEndDate ) { 1161 if ( writeEndDate ) {
1204 1162
1205 if ( rec->endDate().isValid() ) { // 15 + 16 1163 if ( rec->endDate().isValid() ) { // 15 + 16
1206 list.append( "1" ); 1164 list.append( "1" );
1207 list.append( dtToString( rec->endDate()) ); 1165 list.append( dtToString( rec->endDate()) );
1208 } else { 1166 } else {
1209 list.append( "0" ); 1167 list.append( "0" );
1210 list.append( "20991231T000000" ); 1168 list.append( "20991231T000000" );
1211 } 1169 }
1212 1170
1213 } 1171 }
1214 if ( event->doesFloat () ) { 1172 if ( event->doesFloat () ) {
1215 list.append( dtToString( event->dtStart(), false ).left( 8 )); 1173 list.append( dtToString( event->dtStart(), false ).left( 8 ));
1216 list.append( dtToString( event->dtEnd(), false ).left( 8 )); //6 1174 list.append( dtToString( event->dtEnd(), false ).left( 8 )); //6
1217 1175
1218 } 1176 }
1219 else { 1177 else {
1220 list.append( QString() ); 1178 list.append( QString() );
1221 list.append( QString() ); 1179 list.append( QString() );
1222 1180
1223 } 1181 }
1224 if (event->dtStart().date() == event->dtEnd().date() ) 1182 if (event->dtStart().date() == event->dtEnd().date() )
1225 list.append( "0" ); 1183 list.append( "0" );
1226 else 1184 else
1227 list.append( "1" ); 1185 list.append( "1" );
1228 1186
1229 1187
1230 for(QStringList::Iterator it=list.begin(); 1188 for(QStringList::Iterator it=list.begin();
1231 it!=list.end(); ++it){ 1189 it!=list.end(); ++it){
1232 QString& s = (*it); 1190 QString& s = (*it);
1233 s.replace(QRegExp("\""), "\"\""); 1191 s.replace(QRegExp("\""), "\"\"");
1234 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){ 1192 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){
1235 s.prepend('\"'); 1193 s.prepend('\"');
1236 s.append('\"'); 1194 s.append('\"');
1237 } else if(s.isEmpty() && !s.isNull()){ 1195 } else if(s.isEmpty() && !s.isNull()){
1238 s = "\"\""; 1196 s = "\"\"";
1239 } 1197 }
1240 } 1198 }
1241 return list.join(","); 1199 return list.join(",");
1242#endif 1200#endif
1243 return QString(); 1201 return QString();
1244 1202
1245} 1203}
1246QString PhoneFormat::getTodoString( Todo* todo ) 1204QString PhoneFormat::getTodoString( Todo* todo )
1247{ 1205{
1248#if 0 1206#if 0
1249 QStringList list; 1207 QStringList list;
1250 list.append( QString::number( todo->zaurusId() ) ); 1208 list.append( QString::number( todo->zaurusId() ) );
1251 list.append( todo->categories().join(",") ); 1209 list.append( todo->categories().join(",") );
1252 1210
1253 if ( todo->hasStartDate() ) { 1211 if ( todo->hasStartDate() ) {
1254 list.append( dtToString( todo->dtStart()) ); 1212 list.append( dtToString( todo->dtStart()) );
1255 } else 1213 } else
1256 list.append( QString() ); 1214 list.append( QString() );
1257 1215
1258 if ( todo->hasDueDate() ) { 1216 if ( todo->hasDueDate() ) {
1259 QTime tim; 1217 QTime tim;
1260 if ( todo->doesFloat()) { 1218 if ( todo->doesFloat()) {
1261 list.append( dtToString( QDateTime(todo->dtDue().date(),QTime( 0,0,0 )), false)) ; 1219 list.append( dtToString( QDateTime(todo->dtDue().date(),QTime( 0,0,0 )), false)) ;
1262 } else { 1220 } else {
1263 list.append( dtToString(todo->dtDue() ) ); 1221 list.append( dtToString(todo->dtDue() ) );
1264 } 1222 }
1265 } else 1223 } else
1266 list.append( QString() ); 1224 list.append( QString() );
1267 1225
1268 if ( todo->isCompleted() ) { 1226 if ( todo->isCompleted() ) {
1269 list.append( dtToString( todo->completed()) ); 1227 list.append( dtToString( todo->completed()) );
1270 list.append( "0" ); // yes 0 == completed 1228 list.append( "0" ); // yes 0 == completed
1271 } else { 1229 } else {
1272 list.append( dtToString( todo->completed()) ); 1230 list.append( dtToString( todo->completed()) );
1273 list.append( "1" ); 1231 list.append( "1" );
1274 } 1232 }
1275 list.append( QString::number( todo->priority() )); 1233 list.append( QString::number( todo->priority() ));
1276 if( ! todo->summary().isEmpty() ) 1234 if( ! todo->summary().isEmpty() )
1277 list.append( todo->summary() ); 1235 list.append( todo->summary() );
1278 else 1236 else
1279 list.append( "" ); 1237 list.append( "" );
1280 if (! todo->description().isEmpty() ) 1238 if (! todo->description().isEmpty() )
1281 list.append( todo->description() ); 1239 list.append( todo->description() );
1282 else 1240 else
1283 list.append( "" ); 1241 list.append( "" );
1284 for(QStringList::Iterator it=list.begin(); 1242 for(QStringList::Iterator it=list.begin();
1285 it!=list.end(); ++it){ 1243 it!=list.end(); ++it){
1286 QString& s = (*it); 1244 QString& s = (*it);
1287 s.replace(QRegExp("\""), "\"\""); 1245 s.replace(QRegExp("\""), "\"\"");
1288 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){ 1246 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){
1289 s.prepend('\"'); 1247 s.prepend('\"');
1290 s.append('\"'); 1248 s.append('\"');
1291 } else if(s.isEmpty() && !s.isNull()){ 1249 } else if(s.isEmpty() && !s.isNull()){
1292 s = "\"\""; 1250 s = "\"\"";
1293 } 1251 }
1294 } 1252 }
1295 return list.join(","); 1253 return list.join(",");
1296#endif 1254#endif
1297 return QString(); 1255 return QString();
1298} 1256}
1299 1257
1300 1258
1301QString PhoneFormat::toString( Calendar * ) 1259QString PhoneFormat::toString( Calendar * )
1302{ 1260{
1303 return QString::null; 1261 return QString::null;
1304} 1262}
1305bool PhoneFormat::fromString( Calendar *calendar, const QString & text) 1263bool PhoneFormat::fromString( Calendar *calendar, const QString & text)
1306{ 1264{
1307 return false; 1265 return false;
1308} 1266}
diff --git a/libkcal/phoneformat.h b/libkcal/phoneformat.h
index 7b7dd04..33b2091 100644
--- a/libkcal/phoneformat.h
+++ b/libkcal/phoneformat.h
@@ -1,65 +1,67 @@
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#ifndef PHONEFORMAT_H 21#ifndef PHONEFORMAT_H
22#define PHONEFORMAT_H 22#define PHONEFORMAT_H
23 23
24#include <qstring.h> 24#include <qstring.h>
25 25
26#include "scheduler.h" 26#include "scheduler.h"
27 27
28#include "vcalformat.h"
28#include "calformat.h" 29#include "calformat.h"
29extern "C" { 30extern "C" {
30#include "../gammu/emb/common/gammu.h" 31#include "../gammu/emb/common/gammu.h"
31} 32}
32namespace KCal { 33namespace KCal {
33 34
34/** 35/**
35 This class implements the calendar format used by Phone. 36 This class implements the calendar format used by Phone.
36*/ 37*/
37 class Event; 38 class Event;
38 class Todo; 39 class Todo;
39class PhoneFormat : public QObject { 40class PhoneFormat : public QObject {
40 public: 41 public:
41 /** Create new iCalendar format. */ 42 /** Create new iCalendar format. */
42 PhoneFormat(QString profileName, QString device,QString connection, QString model); 43 PhoneFormat(QString profileName, QString device,QString connection, QString model);
43 virtual ~PhoneFormat(); 44 virtual ~PhoneFormat();
44 45
45 bool load( Calendar * ,Calendar * ); 46 bool load( Calendar * ,Calendar * );
46 bool save( Calendar * ); 47 bool save( Calendar * );
47 bool fromString( Calendar *, const QString & ); 48 bool fromString( Calendar *, const QString & );
48 QString toString( Calendar * ); 49 QString toString( Calendar * );
49 static ulong getCsum( const QStringList & ); 50 static ulong getCsum( const QStringList & );
50 static ulong getCsumTodo( Todo* to ); 51 static ulong getCsumTodo( Todo* to );
51 static ulong getCsumEvent( Event* ev ); 52 static ulong getCsumEvent( Event* ev );
52 private: 53 private:
54 VCalFormat vfconverter;
53 void event2GSM( Event* ev, GSM_CalendarEntry*Note ); 55 void event2GSM( Event* ev, GSM_CalendarEntry*Note );
54 void todo2GSM( Todo* ev, GSM_ToDoEntry *ToDo ); 56 void todo2GSM( Todo* ev, GSM_ToDoEntry *ToDo );
55 int initDevice(GSM_StateMachine *s); 57 int initDevice(GSM_StateMachine *s);
56 QString getEventString( Event* ); 58 QString getEventString( Event* );
57 QString getTodoString( Todo* ); 59 QString getTodoString( Todo* );
58 QString dtToGSM( const QDateTime& dt, bool useTZ = true ); 60 QString dtToGSM( const QDateTime& dt, bool useTZ = true );
59 QString mProfileName, mDevice, mConnection, mModel; 61 QString mProfileName, mDevice, mConnection, mModel;
60 void afterSave( Incidence* ); 62 void afterSave( Incidence* );
61}; 63};
62 64
63} 65}
64 66
65#endif 67#endif
diff --git a/libkcal/vcalformat.cpp b/libkcal/vcalformat.cpp
index 72a781a..1167e58 100644
--- a/libkcal/vcalformat.cpp
+++ b/libkcal/vcalformat.cpp
@@ -1,551 +1,570 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 1998 Preston Brwon 3 Copyright (c) 1998 Preston Brwon
4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
5 5
6 This library is free software; you can redistribute it and/or 6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public 7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either 8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version. 9 version 2 of the License, or (at your option) any later version.
10 10
11 This library is distributed in the hope that it will be useful, 11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details. 14 Library General Public License for more details.
15 15
16 You should have received a copy of the GNU Library General Public License 16 You should have received a copy of the GNU Library General Public License
17 along with this library; see the file COPYING.LIB. If not, write to 17 along with this library; see the file COPYING.LIB. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. 19 Boston, MA 02111-1307, USA.
20*/ 20*/
21 21
22#include <qapplication.h> 22#include <qapplication.h>
23#include <qdatetime.h> 23#include <qdatetime.h>
24#include <qstring.h> 24#include <qstring.h>
25#include <qptrlist.h> 25#include <qptrlist.h>
26#include <qregexp.h> 26#include <qregexp.h>
27#include <qclipboard.h> 27#include <qclipboard.h>
28#include <qdialog.h> 28#include <qdialog.h>
29#include <qfile.h> 29#include <qfile.h>
30 30
31#include <kdebug.h> 31#include <kdebug.h>
32#include <kmessagebox.h> 32#include <kmessagebox.h>
33#include <kiconloader.h> 33#include <kiconloader.h>
34#include <klocale.h> 34#include <klocale.h>
35 35
36#include "vcc.h" 36#include "vcc.h"
37#include "vobject.h" 37#include "vobject.h"
38 38
39#include "vcaldrag.h" 39#include "vcaldrag.h"
40#include "calendar.h" 40#include "calendar.h"
41 41
42#include "vcalformat.h" 42#include "vcalformat.h"
43 43
44using namespace KCal; 44using namespace KCal;
45 45
46VCalFormat::VCalFormat() 46VCalFormat::VCalFormat()
47{ 47{
48} 48}
49 49
50VCalFormat::~VCalFormat() 50VCalFormat::~VCalFormat()
51{ 51{
52} 52}
53 53
54bool VCalFormat::load(Calendar *calendar, const QString &fileName) 54bool VCalFormat::load(Calendar *calendar, const QString &fileName)
55{ 55{
56 mCalendar = calendar; 56 mCalendar = calendar;
57 57
58 clearException(); 58 clearException();
59 59
60 kdDebug(5800) << "VCalFormat::load() " << fileName << endl; 60 kdDebug(5800) << "VCalFormat::load() " << fileName << endl;
61 61
62 VObject *vcal = 0; 62 VObject *vcal = 0;
63 63
64 // this is not necessarily only 1 vcal. Could be many vcals, or include 64 // this is not necessarily only 1 vcal. Could be many vcals, or include
65 // a vcard... 65 // a vcard...
66 vcal = Parse_MIME_FromFileName(const_cast<char *>(QFile::encodeName(fileName).data())); 66 vcal = Parse_MIME_FromFileName(const_cast<char *>(QFile::encodeName(fileName).data()));
67 67
68 if (!vcal) { 68 if (!vcal) {
69 setException(new ErrorFormat(ErrorFormat::CalVersionUnknown)); 69 setException(new ErrorFormat(ErrorFormat::CalVersionUnknown));
70 return FALSE; 70 return FALSE;
71 } 71 }
72 72
73 // any other top-level calendar stuff should be added/initialized here 73 // any other top-level calendar stuff should be added/initialized here
74 74
75 // put all vobjects into their proper places 75 // put all vobjects into their proper places
76 populate(vcal); 76 populate(vcal);
77 77
78 // clean up from vcal API stuff 78 // clean up from vcal API stuff
79 cleanVObjects(vcal); 79 cleanVObjects(vcal);
80 cleanStrTbl(); 80 cleanStrTbl();
81 81
82 return true; 82 return true;
83} 83}
84 84
85 85
86bool VCalFormat::save(Calendar *calendar, const QString &fileName) 86bool VCalFormat::save(Calendar *calendar, const QString &fileName)
87{ 87{
88 mCalendar = calendar; 88 mCalendar = calendar;
89 89
90 QString tmpStr; 90 QString tmpStr;
91 VObject *vcal, *vo; 91 VObject *vcal, *vo;
92 92
93 kdDebug(5800) << "VCalFormat::save(): " << fileName << endl; 93 kdDebug(5800) << "VCalFormat::save(): " << fileName << endl;
94 94
95 vcal = newVObject(VCCalProp); 95 vcal = newVObject(VCCalProp);
96 96
97 // addPropValue(vcal,VCLocationProp, "0.0"); 97 // addPropValue(vcal,VCLocationProp, "0.0");
98 addPropValue(vcal,VCProdIdProp, productId()); 98 addPropValue(vcal,VCProdIdProp, productId());
99 tmpStr = mCalendar->getTimeZoneStr(); 99 tmpStr = mCalendar->getTimeZoneStr();
100 //qDebug("mCalendar->getTimeZoneStr() %s",tmpStr.latin1() ); 100 //qDebug("mCalendar->getTimeZoneStr() %s",tmpStr.latin1() );
101 addPropValue(vcal,VCTimeZoneProp, tmpStr.local8Bit()); 101 addPropValue(vcal,VCTimeZoneProp, tmpStr.local8Bit());
102 addPropValue(vcal,VCVersionProp, _VCAL_VERSION); 102 addPropValue(vcal,VCVersionProp, _VCAL_VERSION);
103 103
104 // TODO STUFF 104 // TODO STUFF
105 QPtrList<Todo> todoList = mCalendar->rawTodos(); 105 QPtrList<Todo> todoList = mCalendar->rawTodos();
106 QPtrListIterator<Todo> qlt(todoList); 106 QPtrListIterator<Todo> qlt(todoList);
107 for (; qlt.current(); ++qlt) { 107 for (; qlt.current(); ++qlt) {
108 vo = eventToVTodo(qlt.current()); 108 vo = eventToVTodo(qlt.current());
109 addVObjectProp(vcal, vo); 109 addVObjectProp(vcal, vo);
110 } 110 }
111 111
112 // EVENT STUFF 112 // EVENT STUFF
113 QPtrList<Event> events = mCalendar->rawEvents(); 113 QPtrList<Event> events = mCalendar->rawEvents();
114 Event *ev; 114 Event *ev;
115 for(ev=events.first();ev;ev=events.next()) { 115 for(ev=events.first();ev;ev=events.next()) {
116 vo = eventToVEvent(ev); 116 vo = eventToVEvent(ev);
117 addVObjectProp(vcal, vo); 117 addVObjectProp(vcal, vo);
118 } 118 }
119 119
120 writeVObjectToFile(QFile::encodeName(fileName).data() ,vcal); 120 writeVObjectToFile(QFile::encodeName(fileName).data() ,vcal);
121 cleanVObjects(vcal); 121 cleanVObjects(vcal);
122 cleanStrTbl(); 122 cleanStrTbl();
123 123
124 if (QFile::exists(fileName)) { 124 if (QFile::exists(fileName)) {
125 kdDebug(5800) << "No error" << endl; 125 kdDebug(5800) << "No error" << endl;
126 return true; 126 return true;
127 } else { 127 } else {
128 kdDebug(5800) << "Error" << endl; 128 kdDebug(5800) << "Error" << endl;
129 return false; // error 129 return false; // error
130 } 130 }
131} 131}
132 132
133bool VCalFormat::fromString( Calendar *calendar, const QString &text ) 133bool VCalFormat::fromString( Calendar *calendar, const QString &text )
134{ 134{
135 // TODO: Factor out VCalFormat::fromString() 135 // TODO: Factor out VCalFormat::fromString()
136 136
137 QCString data = text.utf8(); 137 QCString data = text.utf8();
138 138
139 if ( !data.size() ) return false; 139 if ( !data.size() ) return false;
140 140
141 VObject *vcal = Parse_MIME( data.data(), data.size()); 141 VObject *vcal = Parse_MIME( data.data(), data.size());
142 if ( !vcal ) return false; 142 if ( !vcal ) return false;
143 143
144 VObjectIterator i; 144 VObjectIterator i;
145 VObject *curvo; 145 VObject *curvo;
146 initPropIterator( &i, vcal ); 146 initPropIterator( &i, vcal );
147 147
148 // we only take the first object. TODO: parse all incidences. 148 // we only take the first object. TODO: parse all incidences.
149 do { 149 do {
150 curvo = nextVObject( &i ); 150 curvo = nextVObject( &i );
151 } while ( strcmp( vObjectName( curvo ), VCEventProp ) && 151 } while ( strcmp( vObjectName( curvo ), VCEventProp ) &&
152 strcmp( vObjectName( curvo ), VCTodoProp ) ); 152 strcmp( vObjectName( curvo ), VCTodoProp ) );
153 153
154 if ( strcmp( vObjectName( curvo ), VCEventProp ) == 0 ) { 154 if ( strcmp( vObjectName( curvo ), VCEventProp ) == 0 ) {
155 Event *event = VEventToEvent( curvo ); 155 Event *event = VEventToEvent( curvo );
156 calendar->addEvent( event ); 156 calendar->addEvent( event );
157 } else { 157 } else {
158 kdDebug(5800) << "VCalFormat::fromString(): Unknown object type." << endl; 158 kdDebug(5800) << "VCalFormat::fromString(): Unknown object type." << endl;
159 deleteVObject( vcal ); 159 deleteVObject( vcal );
160 return false; 160 return false;
161 } 161 }
162 162
163 deleteVObject( vcal ); 163 deleteVObject( vcal );
164 164
165 return true; 165 return true;
166} 166}
167 167
168QString VCalFormat::eventToString( Event * event)
169{
170 if ( !event ) return QString::null;
171 VObject *vevent = eventToVEvent( event );
172 char *buf = writeMemVObject( 0, 0, vevent );
173 QString result( buf );
174 cleanVObject( vevent );
175 return result;
176}
177QString VCalFormat::todoToString( Todo * todo )
178{
179 if ( !todo ) return QString::null;
180 VObject *vevent = eventToVTodo( todo );
181 char *buf = writeMemVObject( 0, 0, vevent );
182 QString result( buf );
183 cleanVObject( vevent );
184 return result;
185}
186
168QString VCalFormat::toString( Calendar *calendar ) 187QString VCalFormat::toString( Calendar *calendar )
169{ 188{
170 // TODO: Factor out VCalFormat::asString() 189 // TODO: Factor out VCalFormat::asString()
171 190
172 VObject *vcal = newVObject(VCCalProp); 191 VObject *vcal = newVObject(VCCalProp);
173 192
174 addPropValue( vcal, VCProdIdProp, CalFormat::productId() ); 193 addPropValue( vcal, VCProdIdProp, CalFormat::productId() );
175 QString tmpStr = mCalendar->getTimeZoneStr(); 194 QString tmpStr = mCalendar->getTimeZoneStr();
176 addPropValue( vcal, VCTimeZoneProp, tmpStr.local8Bit() ); 195 addPropValue( vcal, VCTimeZoneProp, tmpStr.local8Bit() );
177 addPropValue( vcal, VCVersionProp, _VCAL_VERSION ); 196 addPropValue( vcal, VCVersionProp, _VCAL_VERSION );
178 197
179 // TODO: Use all data. 198 // TODO: Use all data.
180 QPtrList<Event> events = calendar->events(); 199 QPtrList<Event> events = calendar->events();
181 Event *event = events.first(); 200 Event *event = events.first();
182 if ( !event ) return QString::null; 201 if ( !event ) return QString::null;
183 202
184 VObject *vevent = eventToVEvent( event ); 203 VObject *vevent = eventToVEvent( event );
185 204
186 addVObjectProp( vcal, vevent ); 205 addVObjectProp( vcal, vevent );
187 206
188 char *buf = writeMemVObject( 0, 0, vcal ); 207 char *buf = writeMemVObject( 0, 0, vcal );
189 208
190 QString result( buf ); 209 QString result( buf );
191 210
192 cleanVObject( vcal ); 211 cleanVObject( vcal );
193 212
194 return result; 213 return result;
195} 214}
196 215
197VObject *VCalFormat::eventToVTodo(const Todo *anEvent) 216VObject *VCalFormat::eventToVTodo(const Todo *anEvent)
198{ 217{
199 VObject *vtodo; 218 VObject *vtodo;
200 QString tmpStr; 219 QString tmpStr;
201 QStringList tmpStrList; 220 QStringList tmpStrList;
202 221
203 vtodo = newVObject(VCTodoProp); 222 vtodo = newVObject(VCTodoProp);
204 223
205 // due date 224 // due date
206 if (anEvent->hasDueDate()) { 225 if (anEvent->hasDueDate()) {
207 tmpStr = qDateTimeToISO(anEvent->dtDue(), 226 tmpStr = qDateTimeToISO(anEvent->dtDue(),
208 !anEvent->doesFloat()); 227 !anEvent->doesFloat());
209 addPropValue(vtodo, VCDueProp, tmpStr.local8Bit()); 228 addPropValue(vtodo, VCDueProp, tmpStr.local8Bit());
210 } 229 }
211 230
212 // start date 231 // start date
213 if (anEvent->hasStartDate()) { 232 if (anEvent->hasStartDate()) {
214 tmpStr = qDateTimeToISO(anEvent->dtStart(), 233 tmpStr = qDateTimeToISO(anEvent->dtStart(),
215 !anEvent->doesFloat()); 234 !anEvent->doesFloat());
216 addPropValue(vtodo, VCDTstartProp, tmpStr.local8Bit()); 235 addPropValue(vtodo, VCDTstartProp, tmpStr.local8Bit());
217 } 236 }
218 237
219 // creation date 238 // creation date
220 tmpStr = qDateTimeToISO(anEvent->created()); 239 tmpStr = qDateTimeToISO(anEvent->created());
221 addPropValue(vtodo, VCDCreatedProp, tmpStr.local8Bit()); 240 addPropValue(vtodo, VCDCreatedProp, tmpStr.local8Bit());
222 241
223 // unique id 242 // unique id
224 addPropValue(vtodo, VCUniqueStringProp, 243 addPropValue(vtodo, VCUniqueStringProp,
225 anEvent->uid().local8Bit()); 244 anEvent->uid().local8Bit());
226 245
227 // revision 246 // revision
228 tmpStr.sprintf("%i", anEvent->revision()); 247 tmpStr.sprintf("%i", anEvent->revision());
229 addPropValue(vtodo, VCSequenceProp, tmpStr.local8Bit()); 248 addPropValue(vtodo, VCSequenceProp, tmpStr.local8Bit());
230 249
231 // last modification date 250 // last modification date
232 tmpStr = qDateTimeToISO(anEvent->lastModified()); 251 tmpStr = qDateTimeToISO(anEvent->lastModified());
233 addPropValue(vtodo, VCLastModifiedProp, tmpStr.local8Bit()); 252 addPropValue(vtodo, VCLastModifiedProp, tmpStr.local8Bit());
234 253
235 // organizer stuff 254 // organizer stuff
236 tmpStr = "MAILTO:" + anEvent->organizer(); 255 tmpStr = "MAILTO:" + anEvent->organizer();
237 addPropValue(vtodo, ICOrganizerProp, tmpStr.local8Bit()); 256 addPropValue(vtodo, ICOrganizerProp, tmpStr.local8Bit());
238 257
239 // attendees 258 // attendees
240 if (anEvent->attendeeCount() != 0) { 259 if (anEvent->attendeeCount() != 0) {
241 QPtrList<Attendee> al = anEvent->attendees(); 260 QPtrList<Attendee> al = anEvent->attendees();
242 QPtrListIterator<Attendee> ai(al); 261 QPtrListIterator<Attendee> ai(al);
243 Attendee *curAttendee; 262 Attendee *curAttendee;
244 263
245 for (; ai.current(); ++ai) { 264 for (; ai.current(); ++ai) {
246 curAttendee = ai.current(); 265 curAttendee = ai.current();
247 if (!curAttendee->email().isEmpty() && 266 if (!curAttendee->email().isEmpty() &&
248 !curAttendee->name().isEmpty()) 267 !curAttendee->name().isEmpty())
249 tmpStr = "MAILTO:" + curAttendee->name() + " <" + 268 tmpStr = "MAILTO:" + curAttendee->name() + " <" +
250 curAttendee->email() + ">"; 269 curAttendee->email() + ">";
251 else if (curAttendee->name().isEmpty()) 270 else if (curAttendee->name().isEmpty())
252 tmpStr = "MAILTO: " + curAttendee->email(); 271 tmpStr = "MAILTO: " + curAttendee->email();
253 else if (curAttendee->email().isEmpty()) 272 else if (curAttendee->email().isEmpty())
254 tmpStr = "MAILTO: " + curAttendee->name(); 273 tmpStr = "MAILTO: " + curAttendee->name();
255 else if (curAttendee->name().isEmpty() && 274 else if (curAttendee->name().isEmpty() &&
256 curAttendee->email().isEmpty()) 275 curAttendee->email().isEmpty())
257 kdDebug(5800) << "warning! this Event has an attendee w/o name or email!" << endl; 276 kdDebug(5800) << "warning! this Event has an attendee w/o name or email!" << endl;
258 VObject *aProp = addPropValue(vtodo, VCAttendeeProp, tmpStr.local8Bit()); 277 VObject *aProp = addPropValue(vtodo, VCAttendeeProp, tmpStr.local8Bit());
259 addPropValue(aProp, VCRSVPProp, curAttendee->RSVP() ? "TRUE" : "FALSE"); 278 addPropValue(aProp, VCRSVPProp, curAttendee->RSVP() ? "TRUE" : "FALSE");
260 addPropValue(aProp, VCStatusProp, writeStatus(curAttendee->status())); 279 addPropValue(aProp, VCStatusProp, writeStatus(curAttendee->status()));
261 } 280 }
262 } 281 }
263 282
264 // description BL: 283 // description BL:
265 if (!anEvent->description().isEmpty()) { 284 if (!anEvent->description().isEmpty()) {
266 VObject *d = addPropValue(vtodo, VCDescriptionProp, 285 VObject *d = addPropValue(vtodo, VCDescriptionProp,
267 anEvent->description().local8Bit()); 286 anEvent->description().local8Bit());
268 if (anEvent->description().find('\n') != -1) 287 if (anEvent->description().find('\n') != -1)
269 addProp(d, VCQuotedPrintableProp); 288 addProp(d, VCQuotedPrintableProp);
270 } 289 }
271 290
272 // summary 291 // summary
273 if (!anEvent->summary().isEmpty()) 292 if (!anEvent->summary().isEmpty())
274 addPropValue(vtodo, VCSummaryProp, anEvent->summary().local8Bit()); 293 addPropValue(vtodo, VCSummaryProp, anEvent->summary().local8Bit());
275 294
276 if (!anEvent->location().isEmpty()) 295 if (!anEvent->location().isEmpty())
277 addPropValue(vtodo, VCLocationProp, anEvent->location().local8Bit()); 296 addPropValue(vtodo, VCLocationProp, anEvent->location().local8Bit());
278 297
279 // completed 298 // completed
280 // status 299 // status
281 // backward compatibility, KOrganizer used to interpret only these two values 300 // backward compatibility, KOrganizer used to interpret only these two values
282 addPropValue(vtodo, VCStatusProp, anEvent->isCompleted() ? "COMPLETED" : 301 addPropValue(vtodo, VCStatusProp, anEvent->isCompleted() ? "COMPLETED" :
283 "NEEDS_ACTION"); 302 "NEEDS_ACTION");
284 // completion date 303 // completion date
285 if (anEvent->hasCompletedDate()) { 304 if (anEvent->hasCompletedDate()) {
286 tmpStr = qDateTimeToISO(anEvent->completed()); 305 tmpStr = qDateTimeToISO(anEvent->completed());
287 addPropValue(vtodo, VCCompletedProp, tmpStr.local8Bit()); 306 addPropValue(vtodo, VCCompletedProp, tmpStr.local8Bit());
288 } 307 }
289 308
290 // priority 309 // priority
291 tmpStr.sprintf("%i",anEvent->priority()); 310 tmpStr.sprintf("%i",anEvent->priority());
292 addPropValue(vtodo, VCPriorityProp, tmpStr.local8Bit()); 311 addPropValue(vtodo, VCPriorityProp, tmpStr.local8Bit());
293 312
294 // related event 313 // related event
295 if (anEvent->relatedTo()) { 314 if (anEvent->relatedTo()) {
296 addPropValue(vtodo, VCRelatedToProp, 315 addPropValue(vtodo, VCRelatedToProp,
297 anEvent->relatedTo()->uid().local8Bit()); 316 anEvent->relatedTo()->uid().local8Bit());
298 } 317 }
299 318
300 // categories 319 // categories
301 tmpStrList = anEvent->categories(); 320 tmpStrList = anEvent->categories();
302 tmpStr = ""; 321 tmpStr = "";
303 QString catStr; 322 QString catStr;
304 for ( QStringList::Iterator it = tmpStrList.begin(); 323 for ( QStringList::Iterator it = tmpStrList.begin();
305 it != tmpStrList.end(); 324 it != tmpStrList.end();
306 ++it ) { 325 ++it ) {
307 catStr = *it; 326 catStr = *it;
308 if (catStr[0] == ' ') 327 if (catStr[0] == ' ')
309 tmpStr += catStr.mid(1); 328 tmpStr += catStr.mid(1);
310 else 329 else
311 tmpStr += catStr; 330 tmpStr += catStr;
312 // this must be a ';' character as the vCalendar specification requires! 331 // this must be a ';' character as the vCalendar specification requires!
313 // vcc.y has been hacked to translate the ';' to a ',' when the vcal is 332 // vcc.y has been hacked to translate the ';' to a ',' when the vcal is
314 // read in. 333 // read in.
315 tmpStr += ";"; 334 tmpStr += ";";
316 } 335 }
317 if (!tmpStr.isEmpty()) { 336 if (!tmpStr.isEmpty()) {
318 tmpStr.truncate(tmpStr.length()-1); 337 tmpStr.truncate(tmpStr.length()-1);
319 addPropValue(vtodo, VCCategoriesProp, tmpStr.local8Bit()); 338 addPropValue(vtodo, VCCategoriesProp, tmpStr.local8Bit());
320 } 339 }
321 340
322 // alarm stuff 341 // alarm stuff
323 kdDebug(5800) << "vcalformat::eventToVTodo was called" << endl; 342 kdDebug(5800) << "vcalformat::eventToVTodo was called" << endl;
324 QPtrList<Alarm> alarms = anEvent->alarms(); 343 QPtrList<Alarm> alarms = anEvent->alarms();
325 Alarm* alarm; 344 Alarm* alarm;
326 for (alarm = alarms.first(); alarm; alarm = alarms.next()) { 345 for (alarm = alarms.first(); alarm; alarm = alarms.next()) {
327 if (alarm->enabled()) { 346 if (alarm->enabled()) {
328 VObject *a = addProp(vtodo, VCDAlarmProp); 347 VObject *a = addProp(vtodo, VCDAlarmProp);
329 tmpStr = qDateTimeToISO(alarm->time()); 348 tmpStr = qDateTimeToISO(alarm->time());
330 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit()); 349 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
331 addPropValue(a, VCRepeatCountProp, "1"); 350 addPropValue(a, VCRepeatCountProp, "1");
332 addPropValue(a, VCDisplayStringProp, "beep!"); 351 addPropValue(a, VCDisplayStringProp, "beep!");
333 if (alarm->type() == Alarm::Audio) { 352 if (alarm->type() == Alarm::Audio) {
334 a = addProp(vtodo, VCAAlarmProp); 353 a = addProp(vtodo, VCAAlarmProp);
335 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit()); 354 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
336 addPropValue(a, VCRepeatCountProp, "1"); 355 addPropValue(a, VCRepeatCountProp, "1");
337 addPropValue(a, VCAudioContentProp, QFile::encodeName(alarm->audioFile())); 356 addPropValue(a, VCAudioContentProp, QFile::encodeName(alarm->audioFile()));
338 } 357 }
339 else if (alarm->type() == Alarm::Procedure) { 358 else if (alarm->type() == Alarm::Procedure) {
340 a = addProp(vtodo, VCPAlarmProp); 359 a = addProp(vtodo, VCPAlarmProp);
341 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit()); 360 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
342 addPropValue(a, VCRepeatCountProp, "1"); 361 addPropValue(a, VCRepeatCountProp, "1");
343 addPropValue(a, VCProcedureNameProp, QFile::encodeName(alarm->programFile())); 362 addPropValue(a, VCProcedureNameProp, QFile::encodeName(alarm->programFile()));
344 } 363 }
345 } 364 }
346 } 365 }
347 366
348 if (anEvent->pilotId()) { 367 if (anEvent->pilotId()) {
349 // pilot sync stuff 368 // pilot sync stuff
350 tmpStr.sprintf("%i",anEvent->pilotId()); 369 tmpStr.sprintf("%i",anEvent->pilotId());
351 addPropValue(vtodo, XPilotIdProp, tmpStr.local8Bit()); 370 addPropValue(vtodo, XPilotIdProp, tmpStr.local8Bit());
352 tmpStr.sprintf("%i",anEvent->syncStatus()); 371 tmpStr.sprintf("%i",anEvent->syncStatus());
353 addPropValue(vtodo, XPilotStatusProp, tmpStr.local8Bit()); 372 addPropValue(vtodo, XPilotStatusProp, tmpStr.local8Bit());
354 } 373 }
355 374
356 return vtodo; 375 return vtodo;
357} 376}
358 377
359VObject* VCalFormat::eventToVEvent(const Event *anEvent) 378VObject* VCalFormat::eventToVEvent(const Event *anEvent)
360{ 379{
361 VObject *vevent; 380 VObject *vevent;
362 QString tmpStr; 381 QString tmpStr;
363 QStringList tmpStrList; 382 QStringList tmpStrList;
364 383
365 vevent = newVObject(VCEventProp); 384 vevent = newVObject(VCEventProp);
366 385
367 // start and end time 386 // start and end time
368 tmpStr = qDateTimeToISO(anEvent->dtStart(), 387 tmpStr = qDateTimeToISO(anEvent->dtStart(),
369 !anEvent->doesFloat()); 388 !anEvent->doesFloat());
370 addPropValue(vevent, VCDTstartProp, tmpStr.local8Bit()); 389 addPropValue(vevent, VCDTstartProp, tmpStr.local8Bit());
371 390
372 // events that have time associated but take up no time should 391 // events that have time associated but take up no time should
373 // not have both DTSTART and DTEND. 392 // not have both DTSTART and DTEND.
374 if (anEvent->dtStart() != anEvent->dtEnd()) { 393 if (anEvent->dtStart() != anEvent->dtEnd()) {
375 tmpStr = qDateTimeToISO(anEvent->dtEnd(), 394 tmpStr = qDateTimeToISO(anEvent->dtEnd(),
376 !anEvent->doesFloat()); 395 !anEvent->doesFloat());
377 addPropValue(vevent, VCDTendProp, tmpStr.local8Bit()); 396 addPropValue(vevent, VCDTendProp, tmpStr.local8Bit());
378 } 397 }
379 398
380 // creation date 399 // creation date
381 tmpStr = qDateTimeToISO(anEvent->created()); 400 tmpStr = qDateTimeToISO(anEvent->created());
382 addPropValue(vevent, VCDCreatedProp, tmpStr.local8Bit()); 401 addPropValue(vevent, VCDCreatedProp, tmpStr.local8Bit());
383 402
384 // unique id 403 // unique id
385 addPropValue(vevent, VCUniqueStringProp, 404 addPropValue(vevent, VCUniqueStringProp,
386 anEvent->uid().local8Bit()); 405 anEvent->uid().local8Bit());
387 406
388 // revision 407 // revision
389 tmpStr.sprintf("%i", anEvent->revision()); 408 tmpStr.sprintf("%i", anEvent->revision());
390 addPropValue(vevent, VCSequenceProp, tmpStr.local8Bit()); 409 addPropValue(vevent, VCSequenceProp, tmpStr.local8Bit());
391 410
392 // last modification date 411 // last modification date
393 tmpStr = qDateTimeToISO(anEvent->lastModified()); 412 tmpStr = qDateTimeToISO(anEvent->lastModified());
394 addPropValue(vevent, VCLastModifiedProp, tmpStr.local8Bit()); 413 addPropValue(vevent, VCLastModifiedProp, tmpStr.local8Bit());
395 414
396 // attendee and organizer stuff 415 // attendee and organizer stuff
397 tmpStr = "MAILTO:" + anEvent->organizer(); 416 tmpStr = "MAILTO:" + anEvent->organizer();
398 addPropValue(vevent, ICOrganizerProp, tmpStr.local8Bit()); 417 addPropValue(vevent, ICOrganizerProp, tmpStr.local8Bit());
399 418
400 if (anEvent->attendeeCount() != 0) { 419 if (anEvent->attendeeCount() != 0) {
401 QPtrList<Attendee> al = anEvent->attendees(); 420 QPtrList<Attendee> al = anEvent->attendees();
402 QPtrListIterator<Attendee> ai(al); 421 QPtrListIterator<Attendee> ai(al);
403 Attendee *curAttendee; 422 Attendee *curAttendee;
404 423
405 // TODO: Put this functionality into Attendee class 424 // TODO: Put this functionality into Attendee class
406 for (; ai.current(); ++ai) { 425 for (; ai.current(); ++ai) {
407 curAttendee = ai.current(); 426 curAttendee = ai.current();
408 if (!curAttendee->email().isEmpty() && 427 if (!curAttendee->email().isEmpty() &&
409 !curAttendee->name().isEmpty()) 428 !curAttendee->name().isEmpty())
410 tmpStr = "MAILTO:" + curAttendee->name() + " <" + 429 tmpStr = "MAILTO:" + curAttendee->name() + " <" +
411 curAttendee->email() + ">"; 430 curAttendee->email() + ">";
412 else if (curAttendee->name().isEmpty()) 431 else if (curAttendee->name().isEmpty())
413 tmpStr = "MAILTO: " + curAttendee->email(); 432 tmpStr = "MAILTO: " + curAttendee->email();
414 else if (curAttendee->email().isEmpty()) 433 else if (curAttendee->email().isEmpty())
415 tmpStr = "MAILTO: " + curAttendee->name(); 434 tmpStr = "MAILTO: " + curAttendee->name();
416 else if (curAttendee->name().isEmpty() && 435 else if (curAttendee->name().isEmpty() &&
417 curAttendee->email().isEmpty()) 436 curAttendee->email().isEmpty())
418 kdDebug(5800) << "warning! this Event has an attendee w/o name or email!" << endl; 437 kdDebug(5800) << "warning! this Event has an attendee w/o name or email!" << endl;
419 VObject *aProp = addPropValue(vevent, VCAttendeeProp, tmpStr.local8Bit()); 438 VObject *aProp = addPropValue(vevent, VCAttendeeProp, tmpStr.local8Bit());
420 addPropValue(aProp, VCRSVPProp, curAttendee->RSVP() ? "TRUE" : "FALSE");; 439 addPropValue(aProp, VCRSVPProp, curAttendee->RSVP() ? "TRUE" : "FALSE");;
421 addPropValue(aProp, VCStatusProp, writeStatus(curAttendee->status())); 440 addPropValue(aProp, VCStatusProp, writeStatus(curAttendee->status()));
422 } 441 }
423 } 442 }
424 443
425 // recurrence rule stuff 444 // recurrence rule stuff
426 if (anEvent->recurrence()->doesRecur()) { 445 if (anEvent->recurrence()->doesRecur()) {
427 // some more variables 446 // some more variables
428 QPtrList<Recurrence::rMonthPos> tmpPositions; 447 QPtrList<Recurrence::rMonthPos> tmpPositions;
429 QPtrList<int> tmpDays; 448 QPtrList<int> tmpDays;
430 int *tmpDay; 449 int *tmpDay;
431 Recurrence::rMonthPos *tmpPos; 450 Recurrence::rMonthPos *tmpPos;
432 QString tmpStr2; 451 QString tmpStr2;
433 int i; 452 int i;
434 453
435 switch(anEvent->recurrence()->doesRecur()) { 454 switch(anEvent->recurrence()->doesRecur()) {
436 case Recurrence::rDaily: 455 case Recurrence::rDaily:
437 tmpStr.sprintf("D%i ",anEvent->recurrence()->frequency()); 456 tmpStr.sprintf("D%i ",anEvent->recurrence()->frequency());
438// if (anEvent->rDuration > 0) 457// if (anEvent->rDuration > 0)
439 //tmpStr += "#"; 458 //tmpStr += "#";
440 break; 459 break;
441 case Recurrence::rWeekly: 460 case Recurrence::rWeekly:
442 tmpStr.sprintf("W%i ",anEvent->recurrence()->frequency()); 461 tmpStr.sprintf("W%i ",anEvent->recurrence()->frequency());
443 for (i = 0; i < 7; i++) { 462 for (i = 0; i < 7; i++) {
444 if (anEvent->recurrence()->days().testBit(i)) 463 if (anEvent->recurrence()->days().testBit(i))
445 tmpStr += dayFromNum(i); 464 tmpStr += dayFromNum(i);
446 } 465 }
447 break; 466 break;
448 case Recurrence::rMonthlyPos: 467 case Recurrence::rMonthlyPos:
449 tmpStr.sprintf("MP%i ", anEvent->recurrence()->frequency()); 468 tmpStr.sprintf("MP%i ", anEvent->recurrence()->frequency());
450 // write out all rMonthPos's 469 // write out all rMonthPos's
451 tmpPositions = anEvent->recurrence()->monthPositions(); 470 tmpPositions = anEvent->recurrence()->monthPositions();
452 for (tmpPos = tmpPositions.first(); 471 for (tmpPos = tmpPositions.first();
453 tmpPos; 472 tmpPos;
454 tmpPos = tmpPositions.next()) { 473 tmpPos = tmpPositions.next()) {
455 474
456 tmpStr2.sprintf("%i", tmpPos->rPos); 475 tmpStr2.sprintf("%i", tmpPos->rPos);
457 if (tmpPos->negative) 476 if (tmpPos->negative)
458 tmpStr2 += "- "; 477 tmpStr2 += "- ";
459 else 478 else
460 tmpStr2 += "+ "; 479 tmpStr2 += "+ ";
461 tmpStr += tmpStr2; 480 tmpStr += tmpStr2;
462 for (i = 0; i < 7; i++) { 481 for (i = 0; i < 7; i++) {
463 if (tmpPos->rDays.testBit(i)) 482 if (tmpPos->rDays.testBit(i))
464 tmpStr += dayFromNum(i); 483 tmpStr += dayFromNum(i);
465 } 484 }
466 } // loop for all rMonthPos's 485 } // loop for all rMonthPos's
467 break; 486 break;
468 case Recurrence::rMonthlyDay: 487 case Recurrence::rMonthlyDay:
469 tmpStr.sprintf("MD%i ", anEvent->recurrence()->frequency()); 488 tmpStr.sprintf("MD%i ", anEvent->recurrence()->frequency());
470 // write out all rMonthDays; 489 // write out all rMonthDays;
471 tmpDays = anEvent->recurrence()->monthDays(); 490 tmpDays = anEvent->recurrence()->monthDays();
472 for (tmpDay = tmpDays.first(); 491 for (tmpDay = tmpDays.first();
473 tmpDay; 492 tmpDay;
474 tmpDay = tmpDays.next()) { 493 tmpDay = tmpDays.next()) {
475 tmpStr2.sprintf("%i ", *tmpDay); 494 tmpStr2.sprintf("%i ", *tmpDay);
476 tmpStr += tmpStr2; 495 tmpStr += tmpStr2;
477 } 496 }
478 break; 497 break;
479 case Recurrence::rYearlyMonth: 498 case Recurrence::rYearlyMonth:
480 tmpStr.sprintf("YM%i ", anEvent->recurrence()->frequency()); 499 tmpStr.sprintf("YM%i ", anEvent->recurrence()->frequency());
481 // write out all the rYearNums; 500 // write out all the rYearNums;
482 tmpDays = anEvent->recurrence()->yearNums(); 501 tmpDays = anEvent->recurrence()->yearNums();
483 for (tmpDay = tmpDays.first(); 502 for (tmpDay = tmpDays.first();
484 tmpDay; 503 tmpDay;
485 tmpDay = tmpDays.next()) { 504 tmpDay = tmpDays.next()) {
486 tmpStr2.sprintf("%i ", *tmpDay); 505 tmpStr2.sprintf("%i ", *tmpDay);
487 tmpStr += tmpStr2; 506 tmpStr += tmpStr2;
488 } 507 }
489 break; 508 break;
490 case Recurrence::rYearlyDay: 509 case Recurrence::rYearlyDay:
491 tmpStr.sprintf("YD%i ", anEvent->recurrence()->frequency()); 510 tmpStr.sprintf("YD%i ", anEvent->recurrence()->frequency());
492 // write out all the rYearNums; 511 // write out all the rYearNums;
493 tmpDays = anEvent->recurrence()->yearNums(); 512 tmpDays = anEvent->recurrence()->yearNums();
494 for (tmpDay = tmpDays.first(); 513 for (tmpDay = tmpDays.first();
495 tmpDay; 514 tmpDay;
496 tmpDay = tmpDays.next()) { 515 tmpDay = tmpDays.next()) {
497 tmpStr2.sprintf("%i ", *tmpDay); 516 tmpStr2.sprintf("%i ", *tmpDay);
498 tmpStr += tmpStr2; 517 tmpStr += tmpStr2;
499 } 518 }
500 break; 519 break;
501 default: 520 default:
502 kdDebug(5800) << "ERROR, it should never get here in eventToVEvent!" << endl; 521 kdDebug(5800) << "ERROR, it should never get here in eventToVEvent!" << endl;
503 break; 522 break;
504 } // switch 523 } // switch
505 524
506 if (anEvent->recurrence()->duration() > 0) { 525 if (anEvent->recurrence()->duration() > 0) {
507 tmpStr2.sprintf("#%i",anEvent->recurrence()->duration()); 526 tmpStr2.sprintf("#%i",anEvent->recurrence()->duration());
508 tmpStr += tmpStr2; 527 tmpStr += tmpStr2;
509 } else if (anEvent->recurrence()->duration() == -1) { 528 } else if (anEvent->recurrence()->duration() == -1) {
510 tmpStr += "#0"; // defined as repeat forever 529 tmpStr += "#0"; // defined as repeat forever
511 } else { 530 } else {
512 tmpStr += qDateTimeToISO(anEvent->recurrence()->endDate(), FALSE); 531 tmpStr += qDateTimeToISO(anEvent->recurrence()->endDate(), FALSE);
513 } 532 }
514 addPropValue(vevent,VCRRuleProp, tmpStr.local8Bit()); 533 addPropValue(vevent,VCRRuleProp, tmpStr.local8Bit());
515 534
516 } // event repeats 535 } // event repeats
517 536
518 // exceptions to recurrence 537 // exceptions to recurrence
519 DateList dateList = anEvent->exDates(); 538 DateList dateList = anEvent->exDates();
520 DateList::ConstIterator it; 539 DateList::ConstIterator it;
521 QString tmpStr2; 540 QString tmpStr2;
522 541
523 for (it = dateList.begin(); it != dateList.end(); ++it) { 542 for (it = dateList.begin(); it != dateList.end(); ++it) {
524 tmpStr = qDateToISO(*it) + ";"; 543 tmpStr = qDateToISO(*it) + ";";
525 tmpStr2 += tmpStr; 544 tmpStr2 += tmpStr;
526 } 545 }
527 if (!tmpStr2.isEmpty()) { 546 if (!tmpStr2.isEmpty()) {
528 tmpStr2.truncate(tmpStr2.length()-1); 547 tmpStr2.truncate(tmpStr2.length()-1);
529 addPropValue(vevent, VCExpDateProp, tmpStr2.local8Bit()); 548 addPropValue(vevent, VCExpDateProp, tmpStr2.local8Bit());
530 } 549 }
531 550
532 // description 551 // description
533 if (!anEvent->description().isEmpty()) { 552 if (!anEvent->description().isEmpty()) {
534 VObject *d = addPropValue(vevent, VCDescriptionProp, 553 VObject *d = addPropValue(vevent, VCDescriptionProp,
535 anEvent->description().local8Bit()); 554 anEvent->description().local8Bit());
536 if (anEvent->description().find('\n') != -1) 555 if (anEvent->description().find('\n') != -1)
537 addProp(d, VCQuotedPrintableProp); 556 addProp(d, VCQuotedPrintableProp);
538 } 557 }
539 558
540 // summary 559 // summary
541 if (!anEvent->summary().isEmpty()) 560 if (!anEvent->summary().isEmpty())
542 addPropValue(vevent, VCSummaryProp, anEvent->summary().local8Bit()); 561 addPropValue(vevent, VCSummaryProp, anEvent->summary().local8Bit());
543 562
544 if (!anEvent->location().isEmpty()) 563 if (!anEvent->location().isEmpty())
545 addPropValue(vevent, VCLocationProp, anEvent->location().local8Bit()); 564 addPropValue(vevent, VCLocationProp, anEvent->location().local8Bit());
546 565
547 // status 566 // status
548// TODO: define Event status 567// TODO: define Event status
549// addPropValue(vevent, VCStatusProp, anEvent->statusStr().local8Bit()); 568// addPropValue(vevent, VCStatusProp, anEvent->statusStr().local8Bit());
550 569
551 // secrecy 570 // secrecy
diff --git a/libkcal/vcalformat.h b/libkcal/vcalformat.h
index d4cecbc..8490125 100644
--- a/libkcal/vcalformat.h
+++ b/libkcal/vcalformat.h
@@ -1,108 +1,110 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 1998 Preston Brown 3 Copyright (c) 1998 Preston Brown
4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
5 5
6 This library is free software; you can redistribute it and/or 6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public 7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either 8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version. 9 version 2 of the License, or (at your option) any later version.
10 10
11 This library is distributed in the hope that it will be useful, 11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details. 14 Library General Public License for more details.
15 15
16 You should have received a copy of the GNU Library General Public License 16 You should have received a copy of the GNU Library General Public License
17 along with this library; see the file COPYING.LIB. If not, write to 17 along with this library; see the file COPYING.LIB. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. 19 Boston, MA 02111-1307, USA.
20*/ 20*/
21 21
22#ifndef _VCALFORMAT_H 22#ifndef _VCALFORMAT_H
23#define _VCALFORMAT_H 23#define _VCALFORMAT_H
24 24
25#include "calformat.h" 25#include "calformat.h"
26 26
27#define _VCAL_VERSION "1.0" 27#define _VCAL_VERSION "1.0"
28 28
29class VObject; 29class VObject;
30 30
31namespace KCal { 31namespace KCal {
32 32
33/** 33/**
34 This class implements the vCalendar format. It provides methods for 34 This class implements the vCalendar format. It provides methods for
35 loading/saving/converting vCalendar format data into the internal KOrganizer 35 loading/saving/converting vCalendar format data into the internal KOrganizer
36 representation as Calendar and Events. 36 representation as Calendar and Events.
37 37
38 @short vCalendar format implementation 38 @short vCalendar format implementation
39*/ 39*/
40class VCalFormat : public CalFormat { 40class VCalFormat : public CalFormat {
41 public: 41 public:
42 VCalFormat(); 42 VCalFormat();
43 virtual ~VCalFormat(); 43 virtual ~VCalFormat();
44 44
45 /** loads a calendar on disk in vCalendar format into the current calendar. 45 /** loads a calendar on disk in vCalendar format into the current calendar.
46 * any information already present is lost. Returns TRUE if successful, 46 * any information already present is lost. Returns TRUE if successful,
47 * else returns FALSE. 47 * else returns FALSE.
48 * @param fileName the name of the calendar on disk. 48 * @param fileName the name of the calendar on disk.
49 */ 49 */
50 bool load(Calendar *,const QString &fileName); 50 bool load(Calendar *,const QString &fileName);
51 /** writes out the calendar to disk in vCalendar format. Returns true if 51 /** writes out the calendar to disk in vCalendar format. Returns true if
52 * successful and false on error. 52 * successful and false on error.
53 * @param fileName the name of the file 53 * @param fileName the name of the file
54 */ 54 */
55 bool save(Calendar *,const QString &fileName); 55 bool save(Calendar *,const QString &fileName);
56 56
57 /** 57 /**
58 Parse string and populate calendar with that information. 58 Parse string and populate calendar with that information.
59 */ 59 */
60 bool fromString( Calendar *, const QString & ); 60 bool fromString( Calendar *, const QString & );
61 /** 61 /**
62 Return calendar information as string. 62 Return calendar information as string.
63 */ 63 */
64 QString toString( Calendar * ); 64 QString toString( Calendar * );
65 QString eventToString( Event * );
66 QString todoToString( Todo * );
65 67
66 protected: 68 protected:
67 /** translates a VObject of the TODO type into a Event */ 69 /** translates a VObject of the TODO type into a Event */
68 Todo *VTodoToEvent(VObject *vtodo); 70 Todo *VTodoToEvent(VObject *vtodo);
69 /** translates a VObject into a Event and returns a pointer to it. */ 71 /** translates a VObject into a Event and returns a pointer to it. */
70 Event *VEventToEvent(VObject *vevent); 72 Event *VEventToEvent(VObject *vevent);
71 /** translate a Event into a VTodo-type VObject and return pointer */ 73 /** translate a Event into a VTodo-type VObject and return pointer */
72 VObject *eventToVTodo(const Todo *anEvent); 74 VObject *eventToVTodo(const Todo *anEvent);
73 /** translate a Event into a VObject and returns a pointer to it. */ 75 /** translate a Event into a VObject and returns a pointer to it. */
74 VObject* eventToVEvent(const Event *anEvent); 76 VObject* eventToVEvent(const Event *anEvent);
75 77
76 /** takes a QDate and returns a string in the format YYYYMMDDTHHMMSS */ 78 /** takes a QDate and returns a string in the format YYYYMMDDTHHMMSS */
77 QString qDateToISO(const QDate &); 79 QString qDateToISO(const QDate &);
78 /** takes a QDateTime and returns a string in format YYYYMMDDTHHMMSS */ 80 /** takes a QDateTime and returns a string in format YYYYMMDDTHHMMSS */
79 QString qDateTimeToISO(const QDateTime &, bool zulu=TRUE); 81 QString qDateTimeToISO(const QDateTime &, bool zulu=TRUE);
80 /** takes a string in the format YYYYMMDDTHHMMSS and returns a 82 /** takes a string in the format YYYYMMDDTHHMMSS and returns a
81 * valid QDateTime. */ 83 * valid QDateTime. */
82 QDateTime ISOToQDateTime(const QString & dtStr); 84 QDateTime ISOToQDateTime(const QString & dtStr);
83 /** takes a string in the format YYYYMMDD and returns a 85 /** takes a string in the format YYYYMMDD and returns a
84 * valid QDate. */ 86 * valid QDate. */
85 QDate ISOToQDate(const QString & dtStr); 87 QDate ISOToQDate(const QString & dtStr);
86 /** takes a vCalendar tree of VObjects, and puts all of them that have 88 /** takes a vCalendar tree of VObjects, and puts all of them that have
87 * the "event" property into the dictionary, todos in the todo-list, etc. */ 89 * the "event" property into the dictionary, todos in the todo-list, etc. */
88 void populate(VObject *vcal); 90 void populate(VObject *vcal);
89 91
90 /** takes a number 0 - 6 and returns the two letter string of that day, 92 /** takes a number 0 - 6 and returns the two letter string of that day,
91 * i.e. MO, TU, WE, etc. */ 93 * i.e. MO, TU, WE, etc. */
92 const char *dayFromNum(int day); 94 const char *dayFromNum(int day);
93 /** the reverse of the above function. */ 95 /** the reverse of the above function. */
94 int numFromDay(const QString &day); 96 int numFromDay(const QString &day);
95 97
96 Attendee::PartStat readStatus(const char *s) const; 98 Attendee::PartStat readStatus(const char *s) const;
97 QCString writeStatus(Attendee::PartStat status) const; 99 QCString writeStatus(Attendee::PartStat status) const;
98 100
99 private: 101 private:
100 Calendar *mCalendar; 102 Calendar *mCalendar;
101 103
102 QPtrList<Event> mEventsRelate; // events with relations 104 QPtrList<Event> mEventsRelate; // events with relations
103 QPtrList<Todo> mTodosRelate; // todos with relations 105 QPtrList<Todo> mTodosRelate; // todos with relations
104}; 106};
105 107
106} 108}
107 109
108#endif 110#endif