summaryrefslogtreecommitdiffabout
path: root/libkcal
Unidiff
Diffstat (limited to 'libkcal') (more/less context) (ignore whitespace changes)
-rw-r--r--libkcal/phoneformat.cpp341
-rw-r--r--libkcal/phoneformat.h13
2 files changed, 165 insertions, 189 deletions
diff --git a/libkcal/phoneformat.cpp b/libkcal/phoneformat.cpp
index 596148e..b8fed47 100644
--- a/libkcal/phoneformat.cpp
+++ b/libkcal/phoneformat.cpp
@@ -174,48 +174,49 @@ public:
174 alarmString = QString::number( alarmOffset ); 174 alarmString = QString::number( alarmOffset );
175 } else { 175 } else {
176 Alarm *alarm; 176 Alarm *alarm;
177 if ( todo->alarms().count() > 0 ) { 177 if ( todo->alarms().count() > 0 ) {
178 alarm = todo->alarms().first(); 178 alarm = todo->alarms().first();
179 alarm->setType( Alarm::Audio ); 179 alarm->setType( Alarm::Audio );
180 alarm->setStartOffset( -60*15 ); 180 alarm->setStartOffset( -60*15 );
181 alarm->setEnabled( false ); 181 alarm->setEnabled( false );
182 } 182 }
183 } 183 }
184 // csum ***************************************** 184 // csum *****************************************
185 QStringList attList; 185 QStringList attList;
186 uint cSum; 186 uint cSum;
187 if ( todo->hasDueDate() ) 187 if ( todo->hasDueDate() )
188 attList << dtToString ( todo->dtDue() ); 188 attList << dtToString ( todo->dtDue() );
189 attList << QString::number( id ); 189 attList << QString::number( id );
190 attList << todo->summary(); 190 attList << todo->summary();
191 attList << completedString; 191 attList << completedString;
192 attList << QString::number( todo->priority() ); 192 attList << QString::number( todo->priority() );
193 attList << alarmString; 193 attList << alarmString;
194 attList << todo->categoriesStr(); 194 attList << todo->categoriesStr();
195 attList << todo->secrecyStr(); 195 attList << todo->secrecyStr();
196 cSum = PhoneFormat::getCsum(attList ); 196 cSum = PhoneFormat::getCsum(attList );
197 todo->setCsum( mProfileName, QString::number( cSum )); 197 todo->setCsum( mProfileName, QString::number( cSum ));
198 todo->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL );
198 mCalendar->addTodo( todo); 199 mCalendar->addTodo( todo);
199 200
200 return true; 201 return true;
201 } 202 }
202 bool readEvent( Calendar *existingCalendar, GSM_CalendarEntry*Note) 203 bool readEvent( Calendar *existingCalendar, GSM_CalendarEntry*Note)
203 { 204 {
204 205
205 int id = Note->Location; 206 int id = Note->Location;
206 Event *event; 207 Event *event;
207 event = existingCalendar->event( mProfileName ,QString::number( id ) ); 208 event = existingCalendar->event( mProfileName ,QString::number( id ) );
208 if ( event ) 209 if ( event )
209 event = (Event*)event->clone(); 210 event = (Event*)event->clone();
210 else 211 else
211 event = new Event; 212 event = new Event;
212 event->setID( mProfileName,QString::number( id ) ); 213 event->setID( mProfileName,QString::number( id ) );
213 event->setTempSyncStat(SYNC_TEMPSTATE_NEW_EXTERNAL ); 214 event->setTempSyncStat(SYNC_TEMPSTATE_NEW_EXTERNAL );
214 215
215 216
216 int i = 0; 217 int i = 0;
217 bool repeating = false; 218 bool repeating = false;
218 int repeat_dayofweek = -1; 219 int repeat_dayofweek = -1;
219 int repeat_day = -1; 220 int repeat_day = -1;
220 int repeat_weekofmonth = -1; 221 int repeat_weekofmonth = -1;
221 int repeat_month = -1; 222 int repeat_month = -1;
@@ -476,48 +477,49 @@ public:
476 alarmString = QString::number( alarmOffset ); 477 alarmString = QString::number( alarmOffset );
477 } else { 478 } else {
478 Alarm *alarm; 479 Alarm *alarm;
479 if ( event->alarms().count() > 0 ) { 480 if ( event->alarms().count() > 0 ) {
480 alarm = event->alarms().first(); 481 alarm = event->alarms().first();
481 alarm->setType( Alarm::Audio ); 482 alarm->setType( Alarm::Audio );
482 alarm->setStartOffset( -60*15 ); 483 alarm->setStartOffset( -60*15 );
483 alarm->setEnabled( false ); 484 alarm->setEnabled( false );
484 } 485 }
485 } 486 }
486 // csum ***************************************** 487 // csum *****************************************
487 QStringList attList; 488 QStringList attList;
488 uint cSum; 489 uint cSum;
489 attList << dtToString ( event->dtStart() ); 490 attList << dtToString ( event->dtStart() );
490 attList << dtToString ( event->dtEnd() ); 491 attList << dtToString ( event->dtEnd() );
491 attList << QString::number( id ); 492 attList << QString::number( id );
492 attList << event->summary(); 493 attList << event->summary();
493 attList << event->location(); 494 attList << event->location();
494 attList << alarmString; 495 attList << alarmString;
495 attList << recurString; 496 attList << recurString;
496 attList << event->categoriesStr(); 497 attList << event->categoriesStr();
497 attList << event->secrecyStr(); 498 attList << event->secrecyStr();
498 cSum = PhoneFormat::getCsum(attList ); 499 cSum = PhoneFormat::getCsum(attList );
499 event->setCsum( mProfileName, QString::number( cSum )); 500 event->setCsum( mProfileName, QString::number( cSum ));
501 event->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL );
500 mCalendar->addEvent( event); 502 mCalendar->addEvent( event);
501 503
502 return true; 504 return true;
503 } 505 }
504 506
505 507
506 QDateTime fromGSM ( GSM_DateTime*dtp, bool useTz = true ) { 508 QDateTime fromGSM ( GSM_DateTime*dtp, bool useTz = true ) {
507 QDateTime dt; 509 QDateTime dt;
508 int y,m,t,h,min,sec; 510 int y,m,t,h,min,sec;
509 y = dtp->Year; 511 y = dtp->Year;
510 m = dtp->Month; 512 m = dtp->Month;
511 t = dtp->Day; 513 t = dtp->Day;
512 h = dtp->Hour; 514 h = dtp->Hour;
513 min = dtp->Minute; 515 min = dtp->Minute;
514 sec = dtp->Second; 516 sec = dtp->Second;
515 dt = QDateTime(QDate(y,m,t), QTime(h,min,sec)); 517 dt = QDateTime(QDate(y,m,t), QTime(h,min,sec));
516 // dtp->Timezone: offset in hours 518 // dtp->Timezone: offset in hours
517 int offset = KGlobal::locale()->localTimeOffset( dt ); 519 int offset = KGlobal::locale()->localTimeOffset( dt );
518 if ( useTz ) 520 if ( useTz )
519 dt = dt.addSecs ( offset*60); 521 dt = dt.addSecs ( offset*60);
520 return dt; 522 return dt;
521 523
522 } 524 }
523 525
@@ -570,388 +572,359 @@ public:
570 case GSM_CAL_T_GYM : CATEGORY = QString("Training/Gym"); break; 572 case GSM_CAL_T_GYM : CATEGORY = QString("Training/Gym"); break;
571 case GSM_CAL_T_HORS : CATEGORY = QString("Training/Horse Races"); break; 573 case GSM_CAL_T_HORS : CATEGORY = QString("Training/Horse Races"); break;
572 case GSM_CAL_T_HOCK : CATEGORY = QString("Training/Hockey"); break; 574 case GSM_CAL_T_HOCK : CATEGORY = QString("Training/Hockey"); break;
573 case GSM_CAL_T_RACE : CATEGORY = QString("Training/Races"); break; 575 case GSM_CAL_T_RACE : CATEGORY = QString("Training/Races"); break;
574 case GSM_CAL_T_RUGB : CATEGORY = QString("Training/Rugby"); break; 576 case GSM_CAL_T_RUGB : CATEGORY = QString("Training/Rugby"); break;
575 case GSM_CAL_T_SAIL : CATEGORY = QString("Training/Sailing"); break; 577 case GSM_CAL_T_SAIL : CATEGORY = QString("Training/Sailing"); break;
576 case GSM_CAL_T_STRE : CATEGORY = QString("Training/Street Games"); break; 578 case GSM_CAL_T_STRE : CATEGORY = QString("Training/Street Games"); break;
577 case GSM_CAL_T_SWIM : CATEGORY = QString("Training/Swimming"); break; 579 case GSM_CAL_T_SWIM : CATEGORY = QString("Training/Swimming"); break;
578 case GSM_CAL_T_TENN : CATEGORY = QString("Training/Tennis"); break; 580 case GSM_CAL_T_TENN : CATEGORY = QString("Training/Tennis"); break;
579 case GSM_CAL_T_TRAV : CATEGORY = QString("Training/Travels"); break; 581 case GSM_CAL_T_TRAV : CATEGORY = QString("Training/Travels"); break;
580 case GSM_CAL_T_WINT : CATEGORY = QString("Training/Winter Games"); break; 582 case GSM_CAL_T_WINT : CATEGORY = QString("Training/Winter Games"); break;
581 default : CATEGORY = QString(""); 583 default : CATEGORY = QString("");
582 } 584 }
583 585
584 return CATEGORY; 586 return CATEGORY;
585 } 587 }
586 588
587protected: 589protected:
588private: 590private:
589 Calendar *mCalendar; 591 Calendar *mCalendar;
590 QString mProfileName ; 592 QString mProfileName ;
591}; 593};
592 594
593 595
594PhoneFormat::PhoneFormat() 596PhoneFormat::PhoneFormat(QString profileName, QString device,QString connection, QString model )
595{ 597{
596 ; 598 mProfileName = profileName;
599 mDevice = device;
600 mConnection = connection;
601 mModel = model;
597} 602}
598 603
599PhoneFormat::~PhoneFormat() 604PhoneFormat::~PhoneFormat()
600{ 605{
601} 606}
607int PhoneFormat::initDevice(GSM_StateMachine *s)
608{
609 GSM_ReadConfig(NULL, &s->Config[0], 0);
610 s->ConfigNum = 1;
611 GSM_Config *cfg = &s->Config[0];
612 if ( ! mConnection.isEmpty() ) {
613 cfg->Connection = strdup(mConnection.latin1());
614 cfg->DefaultConnection = false;
615 qDebug("Connection set %s ", cfg->Connection );
616
617 }
618 if ( ! mDevice.isEmpty() ) {
619 cfg->Device = strdup(mDevice.latin1());
620 cfg->DefaultDevice = false;
621 qDebug("Device set %s ", cfg->Device);
622
623 }
624 if ( ! mModel.isEmpty() ) {
625 strcpy(cfg->Model,mModel.latin1() );
626 cfg->DefaultModel = false;
627 qDebug("Model set %s ",cfg->Model );
628 }
629 int error=GSM_InitConnection(s,3);
630 return error;
631}
602ulong PhoneFormat::getCsum( const QStringList & attList) 632ulong PhoneFormat::getCsum( const QStringList & attList)
603{ 633{
604 int max = attList.count() -1; 634 int max = attList.count() -1;
605 ulong cSum = 0; 635 ulong cSum = 0;
606 int j,k,i; 636 int j,k,i;
607 int add; 637 int add;
608 for ( i = 1; i < max ; ++i ) { 638 for ( i = 1; i < max ; ++i ) {
609 QString s = attList[i]; 639 QString s = attList[i];
610 if ( ! s.isEmpty() ){ 640 if ( ! s.isEmpty() ){
611 j = s.length(); 641 j = s.length();
612 for ( k = 0; k < j; ++k ) { 642 for ( k = 0; k < j; ++k ) {
613 int mul = k +1; 643 int mul = k +1;
614 add = s[k].unicode (); 644 add = s[k].unicode ();
615 if ( k < 16 ) 645 if ( k < 16 )
616 mul = mul * mul; 646 mul = mul * mul;
617 add = add * mul *i*i*i; 647 add = add * mul *i*i*i;
618 cSum += add; 648 cSum += add;
619 } 649 }
620 } 650 }
621 } 651 }
622 return cSum; 652 return cSum;
623 653
624} 654}
625//extern "C" GSM_Error GSM_InitConnection(GSM_StateMachine *s, int ReplyNum); 655//extern "C" GSM_Error GSM_InitConnection(GSM_StateMachine *s, int ReplyNum);
626#include <stdlib.h> 656#include <stdlib.h>
627#define DEBUGMODE false 657#define DEBUGMODE false
628bool PhoneFormat::load( Calendar *calendar, Calendar *existingCal ,QString profileName, QString device,QString connection, QString model ) 658bool PhoneFormat::load( Calendar *calendar, Calendar *existingCal)
629{ 659{
630 mProfileName = profileName;
631 GSM_StateMachines; 660 GSM_StateMachines;
632 qDebug(" load "); 661 qDebug(" load ");
633 s.opened = false; 662 s.opened = false;
634 s.msg = NULL; 663 s.msg = NULL;
635 s.ConfigNum = 0; 664 s.ConfigNum = 0;
636#if 0 665#if 0
637 static char*cp; 666 static char*cp;
638 static INI_Section *cfg = NULL; 667 static INI_Section *cfg = NULL;
639 cfg=GSM_FindGammuRC(); 668 cfg=GSM_FindGammuRC();
640 int i; 669 int i;
641 for (i = 0; i <= MAX_CONFIG_NUM; i++) { 670 for (i = 0; i <= MAX_CONFIG_NUM; i++) {
642 if (cfg!=NULL) { 671 if (cfg!=NULL) {
643 cp = (char *)INI_GetValue(cfg, (unsigned char*) "gammu", (unsigned char*)"gammucoding", false); 672 cp = (char *)INI_GetValue(cfg, (unsigned char*) "gammu", (unsigned char*)"gammucoding", false);
644 if (cp) di.coding = cp; 673 if (cp) di.coding = cp;
645 674
646 s.Config[i].Localize = (char *)INI_GetValue(cfg, (unsigned char*) "gammu", (unsigned char*) "gammuloc", false); 675 s.Config[i].Localize = (char *)INI_GetValue(cfg, (unsigned char*) "gammu", (unsigned char*) "gammuloc", false);
647 if (s.Config[i].Localize) { 676 if (s.Config[i].Localize) {
648 s.msg=INI_ReadFile(s.Config[i].Localize, true); 677 s.msg=INI_ReadFile(s.Config[i].Localize, true);
649 } else { 678 } else {
650#if !defined(WIN32) && defined(LOCALE_PATH) 679#if !defined(WIN32) && defined(LOCALE_PATH)
651 locale = setlocale(LC_MESSAGES, NULL); 680 locale = setlocale(LC_MESSAGES, NULL);
652 if (locale != NULL) { 681 if (locale != NULL) {
653 snprintf(locale_file, 200, "%s/gammu_%c%c.txt", 682 snprintf(locale_file, 200, "%s/gammu_%c%c.txt",
654 LOCALE_PATH, 683 LOCALE_PATH,
655 tolower(locale[0]), 684 tolower(locale[0]),
656 tolower(locale[1])); 685 tolower(locale[1]));
657 s.msg = INI_ReadFile(locale_file, true); 686 s.msg = INI_ReadFile(locale_file, true);
658 } 687 }
659#endif 688#endif
660 } 689 }
661 } 690 }
662 691
663 /* Wanted user specific configuration? */ 692 /* Wanted user specific configuration? */
664 693
665 if (!GSM_ReadConfig(cfg, &s.Config[i], i) && i != 0) break; 694 if (!GSM_ReadConfig(cfg, &s.Config[i], i) && i != 0) break;
666 695
667 s.ConfigNum++; 696 s.ConfigNum++;
668 697
669 /* We want to use only one file descriptor for global and state machine debug output */ 698 /* We want to use only one file descriptor for global and state machine debug output */
670 s.Config[i].UseGlobalDebugFile = true; 699 s.Config[i].UseGlobalDebugFile = true;
671 700
672 701
673 702
674 /* We wanted to read just user specified configuration. */ 703 /* We wanted to read just user specified configuration. */
675 {break;} 704 {break;}
676 } 705 }
677 706
678#endif 707#endif
679 setlocale(LC_ALL, ""); 708 int error=initDevice(&s);
680 GSM_ReadConfig(NULL, &s.Config[0], 0);
681 s.ConfigNum = 1;
682 GSM_Config *cfg = &s.Config[0];
683 if ( ! connection.isEmpty() ) {
684 cfg->Connection = strdup(connection.latin1());
685 cfg->DefaultConnection = false;
686 qDebug("Connection set %s ", cfg->Connection );
687
688 }
689 if ( ! device.isEmpty() ) {
690 cfg->Device = strdup(device.latin1());
691 cfg->DefaultDevice = false;
692 qDebug("Device set %s ", cfg->Device);
693
694 }
695 if ( ! model.isEmpty() ) {
696 strcpy(cfg->Model,model.latin1() );
697 cfg->DefaultModel = false;
698 qDebug("Model set %s ",cfg->Model );
699
700
701 }
702 int error=GSM_InitConnection(&s,3);
703 qDebug("GSM Init %d (no error is %d)", error, ERR_NONE); 709 qDebug("GSM Init %d (no error is %d)", error, ERR_NONE);
704 if ( error != ERR_NONE ) 710 if ( error != ERR_NONE )
705 return false; 711 return false;
706 GSM_Phone_Functions*Phone; 712 GSM_Phone_Functions*Phone;
707 GSM_CalendarEntrynote; 713 GSM_CalendarEntrynote;
708 bool start = true; 714 bool start = true;
709 Phone=s.Phone.Functions; 715 Phone=s.Phone.Functions;
710 bool gshutdown = false; 716 bool gshutdown = false;
711 PhoneParser handler( calendar, profileName ); 717 PhoneParser handler( calendar, mProfileName );
712 int ccc = 0; 718 int ccc = 0;
713 qDebug("Debug: only 10 calender items are downloaded "); 719 qDebug("Debug: only 10 calender items are downloaded ");
714 while (!gshutdown && ccc++ < 10) { 720 while (!gshutdown && ccc++ < 10) {
715 721
716 qDebug("readEvent %d ", ccc); 722 qDebug("readEvent %d ", ccc);
717 error=Phone->GetNextCalendar(&s,&note,start); 723 error=Phone->GetNextCalendar(&s,&note,start);
718 if (error == ERR_EMPTY) break; 724 if (error == ERR_EMPTY) break;
719 start = false; 725 start = false;
720 handler.readEvent( existingCal, &note ); 726 handler.readEvent( existingCal, &note );
721 } 727 }
722 728
723 start = true; 729 start = true;
724 GSM_ToDoEntry ToDo; 730 GSM_ToDoEntry ToDo;
725 ccc = 0; 731 ccc = 0;
726 while (!gshutdown) { 732 while (!gshutdown) {
727 error = Phone->GetNextToDo(&s, &ToDo, start); 733 error = Phone->GetNextToDo(&s, &ToDo, start);
728 if (error == ERR_EMPTY) break; 734 if (error == ERR_EMPTY) break;
729 start = false; 735 start = false;
730 qDebug("ReadTodo %d ", ++ccc); 736 qDebug("ReadTodo %d ", ++ccc);
731 handler.readTodo( existingCal, &ToDo, &s); 737 handler.readTodo( existingCal, &ToDo, &s);
732 738
733 } 739 }
734 740
735 error=GSM_TerminateConnection(&s); 741 error=GSM_TerminateConnection(&s);
736 742
737 return true; 743 return true;
738} 744}
745void PhoneFormat::event2GSM( Event* ev, GSM_CalendarEntry*Note )
746{
739 747
740bool PhoneFormat::save( Calendar *calendar) 748}
749void PhoneFormat::todo2GSM( Todo* todo, GSM_ToDoEntry *gsm )
741{ 750{
742#if 0 751#if 0
743 QLabel status ( i18n("Processing/adding events ..."), 0 ); 752 QStringList list;
753 list.append( QString::number( todo->zaurusId() ) );
754 list.append( todo->categories().join(",") );
755
756 if ( todo->hasStartDate() ) {
757 list.append( dtToString( todo->dtStart()) );
758 } else
759 list.append( QString() );
760
761 if ( todo->hasDueDate() ) {
762 QTime tim;
763 if ( todo->doesFloat()) {
764 list.append( dtToString( QDateTime(todo->dtDue().date(),QTime( 0,0,0 )), false)) ;
765 } else {
766 list.append( dtToString(todo->dtDue() ) );
767 }
768 } else
769 list.append( QString() );
770
771 if ( todo->isCompleted() ) {
772 list.append( dtToString( todo->completed()) );
773 list.append( "0" ); // yes 0 == completed
774 } else {
775 list.append( dtToString( todo->completed()) );
776 list.append( "1" );
777 }
778 list.append( QString::number( todo->priority() ));
779 if( ! todo->summary().isEmpty() )
780 list.append( todo->summary() );
781 else
782 list.append( "" );
783 if (! todo->description().isEmpty() )
784 list.append( todo->description() );
785 else
786 list.append( "" );
787 for(QStringList::Iterator it=list.begin();
788 it!=list.end(); ++it){
789 QString& s = (*it);
790 s.replace(QRegExp("\""), "\"\"");
791 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){
792 s.prepend('\"');
793 s.append('\"');
794 } else if(s.isEmpty() && !s.isNull()){
795 s = "\"\"";
796 }
797 }
798 return list.join(",");
799#endif
800}
801bool PhoneFormat::save( Calendar *calendar)
802{
803 GSM_StateMachines;
804 qDebug(" save ");
805 s.opened = false;
806 s.msg = NULL;
807 s.ConfigNum = 0;
808 QLabel status ( i18n("Writing data. Opening device ..."), 0 );
744 int w = status.sizeHint().width()+20 ; 809 int w = status.sizeHint().width()+20 ;
745 if ( w < 200 ) w = 200; 810 if ( w < 200 ) w = 200;
746 int h = status.sizeHint().height()+20 ; 811 int h = status.sizeHint().height()+20 ;
747 int dw = QApplication::desktop()->width(); 812 int dw = QApplication::desktop()->width();
748 int dh = QApplication::desktop()->height(); 813 int dh = QApplication::desktop()->height();
749 status.setCaption(i18n("Writing DTM Data") ); 814 status.setCaption(i18n("Writing DTM Data") );
750 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 815 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
751 status.show(); 816 status.show();
752 status.raise(); 817 status.raise();
753 qApp->processEvents(); 818 qApp->processEvents();
754 bool debug = DEBUGMODE; 819
755 QString codec = "utf8"; 820 int error=initDevice(&s);
756 QString answer; 821 qDebug("GSM Init %d (no error is %d)", error, ERR_NONE);
757 QString ePrefix = "CARDID,CATEGORY,DSRP,PLCE,MEM1,TIM1,TIM2,ADAY,ARON,ARMN,ARSD,RTYP,RFRQ,RPOS,RDYS,REND,REDT,ALSD,ALED,MDAY\n"; 822 if ( error != ERR_NONE )
758 QString tPrefix = "CARDID,CATEGORY,ETDY,LTDY,FNDY,MARK,PRTY,TITL,MEM1\n"; 823 return false;
759 QString command; 824 GSM_Phone_Functions*Phone;
760 QPtrList<Event> er = calendar->rawEvents(); 825 GSM_CalendarEntryNote;
761 Event* ev = er.first(); 826 bool start = true;
762 QString fileName = "/tmp/kopitempout"; 827 Phone=s.Phone.Functions;
763 int i = 0; 828 bool gshutdown = false;
764 QString changeString = ePrefix; 829 QPtrList<Event> er = calendar->rawEvents();
765 QString deleteString = ePrefix; 830 Event* ev = er.first();
766 bool deleteEnt = false;
767 bool changeEnt = false;
768 QString message = i18n("Processing event # "); 831 QString message = i18n("Processing event # ");
769 int procCount = 0; 832 int procCount = 0;
770 while ( ev ) { 833 while ( ev ) {
771 //qDebug("i %d ", ++i); 834 //qDebug("i %d ", ++i);
772 if ( true /*ev->zaurusStat() != -2*/ ) { 835 if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { // event was changed during sync or is a new one
836
773 status.setText ( message + QString::number ( ++procCount ) ); 837 status.setText ( message + QString::number ( ++procCount ) );
774 qApp->processEvents(); 838 qApp->processEvents();
775 QString eString = getEventString( ev ); 839 event2GSM( ev, &Note );
776 if (/* ev->zaurusStat() == -3 */ true) { // delete 840 if ( ev->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete
777 // deleting empty strings does not work. 841 error = Phone->DeleteCalendar(&s, &Note);
778 // we write first and x and then delete the record with the x
779 eString = eString.replace( QRegExp(",\"\""),",\"x\"" );
780 changeString += eString + "\n";
781 deleteString += eString + "\n";
782 deleteEnt = true;
783 changeEnt = true;
784 } 842 }
785 else if ( /*ev->zaurusId() == -1*/true ) { // add new 843 else if ( ev->getID(mProfileName).isEmpty() ) { // add new
786 command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName; 844 // we have to do this later after deleting
787 system ( command.utf8() ); 845
788 QFile file( fileName );
789 if (!file.open( IO_ReadOnly ) ) {
790 return false;
791
792 }
793 QTextStream ts( &file );
794 ts.setCodec( QTextCodec::codecForName("utf8") );
795 answer = ts.read();
796 file.close();
797 //qDebug("answer \n%s ", answer.latin1());
798 getNumFromRecord( answer, ev ) ;
799
800 } 846 }
801 else { // change existing 847 else { // change existing
802 //qDebug("canging %d %d",ev->zaurusStat() ,ev->zaurusId() ); 848 error = Phone->AddCalendar(&s, &Note);
803 //command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName;
804 changeString += eString + "\n";
805 changeEnt = true;
806
807 } 849 }
808 } 850 }
809 ev = er.next(); 851 ev = er.next();
810 } 852 }
811 status.setText ( i18n("Changing events ...") ); 853 ev = er.first();
812 qApp->processEvents(); 854 // pending get empty slots
813 //qDebug("changing... "); 855 while ( ev ) {
814 if ( changeEnt ) { 856 if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL && ev->tempSyncStat() != SYNC_TEMPSTATE_DELETE) {
815 QFile file( fileName ); 857 if ( ev->getID(mProfileName).isEmpty() ) {
816 if (!file.open( IO_WriteOnly ) ) { 858 status.setText ( message + QString::number ( ++procCount ) );
817 return false; 859 qApp->processEvents();
818 860 int newID ;//= pending
819 } 861 ev->setID(mProfileName, QString::number( newID ));
820 QTextStream ts( &file ); 862 event2GSM( ev, &Note );
821 ts.setCodec( QTextCodec::codecForName("utf8") ); 863 error = Phone->AddCalendar(&s, &Note);
822 ts << changeString ; 864 }
823 file.close(); 865 }
824 command = "db2file datebook -w -g -c " + codec+ " < "+ fileName; 866 ev = er.next();
825 system ( command.latin1() );
826 //qDebug("command %s file :\n%s ", command.latin1(), changeString.latin1());
827
828 }
829 status.setText ( i18n("Deleting events ...") );
830 qApp->processEvents();
831 //qDebug("deleting... ");
832 if ( deleteEnt ) {
833 QFile file( fileName );
834 if (!file.open( IO_WriteOnly ) ) {
835 return false;
836
837 }
838 QTextStream ts( &file );
839 ts.setCodec( QTextCodec::codecForName("utf8") );
840 ts << deleteString;
841 file.close();
842 command = "db2file datebook -d -c " + codec+ " < "+ fileName;
843 system ( command.latin1() );
844 // qDebug("command %s file :\n%s ", command.latin1(), deleteString.latin1());
845 } 867 }
846 868 GSM_ToDoEntry ToDoEntry;
847
848 changeString = tPrefix;
849 deleteString = tPrefix;
850 status.setText ( i18n("Processing todos ...") );
851 qApp->processEvents();
852 QPtrList<Todo> tl = calendar->rawTodos(); 869 QPtrList<Todo> tl = calendar->rawTodos();
853 Todo* to = tl.first(); 870 Todo* to = tl.first();
854 i = 0; 871
855 message = i18n("Processing todo # "); 872 message = i18n("Processing todo # ");
856 procCount = 0; 873 procCount = 0;
857 while ( to ) { 874 while ( to ) {
858 if ( true /*to->zaurusStat() != -2 */) { 875 if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) {
859 status.setText ( message + QString::number ( ++procCount ) ); 876 status.setText ( message + QString::number ( ++procCount ) );
860 qApp->processEvents(); 877 qApp->processEvents();
861 QString eString = getTodoString( to ); 878 todo2GSM( to, &ToDoEntry );
862 if ( /*to->zaurusStat() == -3*/true ) { // delete 879 if ( to->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete
863 // deleting empty strings does not work. 880 error=Phone->DeleteToDo(&s,&ToDoEntry);
864 // we write first and x and then delete the record with the x
865 eString = eString.replace( QRegExp(",\"\""),",\"x\"" );
866 changeString += eString + "\n";
867 deleteString += eString + "\n";
868 deleteEnt = true;
869 changeEnt = true;
870 } 881 }
871 else if ( true /*to->zaurusId() == -1*/ ) { // add new 882 else if ( to->getID("Sharp_DTM").isEmpty() ) { // add new
872 command = "(echo \"" + tPrefix + eString + "\" ) | db2file todo -w -g -c " + codec+ " > "+ fileName; 883 ;
873 system ( command.utf8() );
874 QFile file( fileName );
875 if (!file.open( IO_ReadOnly ) ) {
876 return false;
877
878 }
879 QTextStream ts( &file );
880 ts.setCodec( QTextCodec::codecForName("utf8") );
881 answer = ts.read();
882 file.close();
883 //qDebug("answer \n%s ", answer.latin1());
884 getNumFromRecord( answer, to ) ;
885
886 } 884 }
887 else { // change existing 885 else { // change existing
888 //qDebug("canging %d %d",to->zaurusStat() ,to->zaurusId() ); 886 error=Phone->AddToDo(&s,&ToDoEntry);
889 //command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName;
890 changeString += eString + "\n";
891 changeEnt = true;
892
893 } 887 }
894 } 888 }
895
896 to = tl.next(); 889 to = tl.next();
897 } 890 }
898 status.setText ( i18n("Changing todos ...") ); 891
899 qApp->processEvents(); 892 // pending get empty slots
900 //qDebug("changing... "); 893 to = tl.first();
901 if ( changeEnt ) { 894 while ( to ) {
902 QFile file( fileName ); 895 if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL && to->tempSyncStat() != SYNC_TEMPSTATE_DELETE) {
903 if (!file.open( IO_WriteOnly ) ) { 896 if ( to->getID(mProfileName).isEmpty() ) {
904 return false; 897 status.setText ( message + QString::number ( ++procCount ) );
905 898 qApp->processEvents();
906 } 899 int newID ;//= pending
907 QTextStream ts( &file ); 900 to->setID(mProfileName, QString::number( newID ));
908 ts.setCodec( QTextCodec::codecForName("utf8") ); 901 todo2GSM( to, &ToDoEntry );
909 ts << changeString ; 902 error=Phone->AddToDo(&s,&ToDoEntry);
910 file.close(); 903 }
911 command = "db2file todo -w -g -c " + codec+ " < "+ fileName; 904 }
912 system ( command.latin1() ); 905 to = tl.next();
913 //qDebug("command %s file :\n%s ", command.latin1(), changeString.latin1());
914
915 }
916 status.setText ( i18n("Deleting todos ...") );
917 qApp->processEvents();
918 //qDebug("deleting... ");
919 if ( deleteEnt ) {
920 QFile file( fileName );
921 if (!file.open( IO_WriteOnly ) ) {
922 return false;
923
924 }
925 QTextStream ts( &file );
926 ts.setCodec( QTextCodec::codecForName("utf8") );
927 ts << deleteString;
928 file.close();
929 command = "db2file todo -d -c " + codec+ " < "+ fileName;
930 system ( command.latin1() );
931 // qDebug("command %s file :\n%s ", command.latin1(), deleteString.latin1());
932 } 906 }
933#endif
934 return true; 907 return true;
935} 908}
936QString PhoneFormat::dtToGSM( const QDateTime& dti, bool useTZ ) 909QString PhoneFormat::dtToGSM( const QDateTime& dti, bool useTZ )
937{ 910{
938 QString datestr; 911 QString datestr;
939 QString timestr; 912 QString timestr;
940 int offset = KGlobal::locale()->localTimeOffset( dti ); 913 int offset = KGlobal::locale()->localTimeOffset( dti );
941 QDateTime dt; 914 QDateTime dt;
942 if (useTZ) 915 if (useTZ)
943 dt = dti.addSecs ( -(offset*60)); 916 dt = dti.addSecs ( -(offset*60));
944 else 917 else
945 dt = dti; 918 dt = dti;
946 if(dt.date().isValid()){ 919 if(dt.date().isValid()){
947 const QDate& date = dt.date(); 920 const QDate& date = dt.date();
948 datestr.sprintf("%04d%02d%02d", 921 datestr.sprintf("%04d%02d%02d",
949 date.year(), date.month(), date.day()); 922 date.year(), date.month(), date.day());
950 } 923 }
951 if(dt.time().isValid()){ 924 if(dt.time().isValid()){
952 const QTime& time = dt.time(); 925 const QTime& time = dt.time();
953 timestr.sprintf("T%02d%02d%02d", 926 timestr.sprintf("T%02d%02d%02d",
954 time.hour(), time.minute(), time.second()); 927 time.hour(), time.minute(), time.second());
955 } 928 }
956 return datestr + timestr; 929 return datestr + timestr;
957} 930}
diff --git a/libkcal/phoneformat.h b/libkcal/phoneformat.h
index 8d4e200..1472880 100644
--- a/libkcal/phoneformat.h
+++ b/libkcal/phoneformat.h
@@ -8,53 +8,56 @@
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 "calformat.h" 28#include "calformat.h"
29extern "C" { 29extern "C" {
30#include "../gammu/emb/common/gammu.h" 30#include "../gammu/emb/common/gammu.h"
31} 31}
32
33namespace KCal { 32namespace KCal {
34 33
35/** 34/**
36 This class implements the calendar format used by Phone. 35 This class implements the calendar format used by Phone.
37*/ 36*/
38 37 class Event;
38 class Todo;
39class PhoneFormat : public QObject { 39class PhoneFormat : public QObject {
40 public: 40 public:
41 /** Create new iCalendar format. */ 41 /** Create new iCalendar format. */
42 PhoneFormat(); 42 PhoneFormat(QString profileName, QString device,QString connection, QString model);
43 virtual ~PhoneFormat(); 43 virtual ~PhoneFormat();
44 44
45 bool load( Calendar * ,Calendar *, QString profileName, QString device,QString connection, QString model ); 45 bool load( Calendar * ,Calendar * );
46 bool save( Calendar * ); 46 bool save( Calendar * );
47 bool fromString( Calendar *, const QString & ); 47 bool fromString( Calendar *, const QString & );
48 QString toString( Calendar * ); 48 QString toString( Calendar * );
49 static ulong getCsum( const QStringList & ); 49 static ulong getCsum( const QStringList & );
50 50
51 private: 51 private:
52 void event2GSM( Event* ev, GSM_CalendarEntry*Note );
53 void todo2GSM( Todo* ev, GSM_ToDoEntry *ToDo );
54 int initDevice(GSM_StateMachine *s);
52 QString getEventString( Event* ); 55 QString getEventString( Event* );
53 QString getTodoString( Todo* ); 56 QString getTodoString( Todo* );
54 QString dtToGSM( const QDateTime& dt, bool useTZ = true ); 57 QString dtToGSM( const QDateTime& dt, bool useTZ = true );
55 QString mProfileName; 58 QString mProfileName, mDevice, mConnection, mModel;
56}; 59};
57 60
58} 61}
59 62
60#endif 63#endif