author | zautrix <zautrix> | 2004-08-09 16:25:52 (UTC) |
---|---|---|
committer | zautrix <zautrix> | 2004-08-09 16:25:52 (UTC) |
commit | ecdcad49975976ff877ff506fae3b14934c01898 (patch) (side-by-side diff) | |
tree | 55d79a2b7d90c4c7ce097063449946f2b2504d6a | |
parent | ad99dd380750834b3ccc4dd6fdcdd446ca5ba7ee (diff) | |
download | kdepimpi-ecdcad49975976ff877ff506fae3b14934c01898.zip kdepimpi-ecdcad49975976ff877ff506fae3b14934c01898.tar.gz kdepimpi-ecdcad49975976ff877ff506fae3b14934c01898.tar.bz2 |
more phone sync
-rw-r--r-- | libkcal/phoneformat.cpp | 194 | ||||
-rw-r--r-- | libkcal/phoneformat.h | 4 |
2 files changed, 165 insertions, 33 deletions
diff --git a/libkcal/phoneformat.cpp b/libkcal/phoneformat.cpp index b8fed47..e43a507 100644 --- a/libkcal/phoneformat.cpp +++ b/libkcal/phoneformat.cpp @@ -75,29 +75,27 @@ public: GSM_Phone_Functions *Phone; Phone=s->Phone.Functions; int j; GSM_DateTime* dtp; bool alarm = false; QDateTime alarmDt; GSM_Category Category; int error; - QString completedString = "no"; for (j=0;j<ToDo->EntriesNum;j++) { //qDebug(" for todo %d",ToDo->Location ); switch (ToDo->Entries[j].EntryType) { case TODO_END_DATETIME: dtp = &ToDo->Entries[j].Date ; todo->setDtDue (fromGSM ( dtp )); break; case TODO_COMPLETED: if ( ToDo->Entries[j].Number == 1 ) { todo->setCompleted( true ); - completedString = "yes"; } else { todo->setCompleted( false ); } break; case TODO_ALARM_DATETIME: dtp = &ToDo->Entries[j].Date ; alarm = true; @@ -177,28 +175,18 @@ public: if ( todo->alarms().count() > 0 ) { alarm = todo->alarms().first(); alarm->setType( Alarm::Audio ); alarm->setStartOffset( -60*15 ); alarm->setEnabled( false ); } } // csum ***************************************** - QStringList attList; uint cSum; - if ( todo->hasDueDate() ) - attList << dtToString ( todo->dtDue() ); - attList << QString::number( id ); - attList << todo->summary(); - attList << completedString; - attList << QString::number( todo->priority() ); - attList << alarmString; - attList << todo->categoriesStr(); - attList << todo->secrecyStr(); - cSum = PhoneFormat::getCsum(attList ); + cSum = PhoneFormat::getCsumTodo( todo ); todo->setCsum( mProfileName, QString::number( cSum )); todo->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL ); mCalendar->addTodo( todo); return true; } bool readEvent( Calendar *existingCalendar, GSM_CalendarEntry* Note) { @@ -455,53 +443,42 @@ public: } } else { event->recurrence()->unsetRecurs(); } QStringList categoryList; categoryList << getCategory( Note ); event->setCategories( categoryList ); - QString alarmString = "na"; // strange 0 semms to mean: alarm enabled if ( alarm ) { Alarm *alarm; if ( event->alarms().count() > 0 ) alarm = event->alarms().first(); else { alarm = new Alarm( event ); event->addAlarm( alarm ); } alarm->setType( Alarm::Audio ); alarm->setEnabled( true ); int alarmOffset = alarmDt.secsTo( event->dtStart() ); alarm->setStartOffset( -alarmOffset ); - alarmString = QString::number( alarmOffset ); } else { Alarm *alarm; if ( event->alarms().count() > 0 ) { alarm = event->alarms().first(); alarm->setType( Alarm::Audio ); alarm->setStartOffset( -60*15 ); alarm->setEnabled( false ); } } // csum ***************************************** - QStringList attList; + uint cSum; - attList << dtToString ( event->dtStart() ); - attList << dtToString ( event->dtEnd() ); - attList << QString::number( id ); - attList << event->summary(); - attList << event->location(); - attList << alarmString; - attList << recurString; - attList << event->categoriesStr(); - attList << event->secrecyStr(); - cSum = PhoneFormat::getCsum(attList ); + cSum = PhoneFormat::getCsumEvent( event ); event->setCsum( mProfileName, QString::number( cSum )); event->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL ); mCalendar->addEvent( event); return true; } @@ -518,17 +495,17 @@ public: // dtp->Timezone: offset in hours int offset = KGlobal::locale()->localTimeOffset( dt ); if ( useTz ) dt = dt.addSecs ( offset*60); return dt; } - QString dtToString( const QDateTime& dti, bool useTZ = false ) + static QString dtToString( const QDateTime& dti, bool useTZ = false ) { QString datestr; QString timestr; int offset = KGlobal::locale()->localTimeOffset( dti ); QDateTime dt; if (useTZ) dt = dti.addSecs ( -(offset*60)); else @@ -624,16 +601,147 @@ int PhoneFormat::initDevice(GSM_StateMachine *s) if ( ! mModel.isEmpty() ) { strcpy(cfg->Model,mModel.latin1() ); cfg->DefaultModel = false; qDebug("Model set %s ",cfg->Model ); } int error=GSM_InitConnection(s,3); return error; } +ulong PhoneFormat::getCsumTodo( Todo* todo ) +{ + QStringList attList; + if ( todo->hasDueDate() ) + attList << PhoneParser::dtToString ( todo->dtDue() ); + attList << todo->summary(); + QString completedString = "no"; + if ( todo->isCompleted() ) + completedString = "yes"; + attList << completedString; + attList << QString::number( todo->priority() ); + QString alarmString = "na"; + Alarm *alarm; + if ( todo->alarms().count() > 0 ) { + alarm = todo->alarms().first(); + if ( alarm->enabled() ) { + alarmString = QString::number(alarm->startOffset().asSeconds() ); + } + } + attList << alarmString; + attList << todo->categoriesStr(); + attList << todo->secrecyStr(); + return PhoneFormat::getCsum(attList ); + +} +ulong PhoneFormat::getCsumEvent( Event* event ) +{ + QStringList attList; + attList << PhoneParser::dtToString ( event->dtStart() ); + attList << PhoneParser::dtToString ( event->dtEnd() ); + attList << event->summary(); + attList << event->location(); + QString alarmString = "na"; + Alarm *alarm; + if ( event->alarms().count() > 0 ) { + alarm = event->alarms().first(); + if ( alarm->enabled() ) { + alarmString = QString::number( alarm->startOffset().asSeconds() ); + } + } + attList << alarmString; + Recurrence* rec = event->recurrence(); + QStringList list; + bool writeEndDate = false; + switch ( rec->doesRecur() ) + { + case Recurrence::rDaily: // 0 + list.append( "0" ); + list.append( QString::number( rec->frequency() ));//12 + list.append( "0" ); + list.append( "0" ); + writeEndDate = true; + break; + case Recurrence::rWeekly:// 1 + list.append( "1" ); + list.append( QString::number( rec->frequency()) );//12 + list.append( "0" ); + { + int days = 0; + QBitArray weekDays = rec->days(); + int i; + for( i = 1; i <= 7; ++i ) { + if ( weekDays[i-1] ) { + days += 1 << (i-1); + } + } + list.append( QString::number( days ) ); + } + //pending weekdays + writeEndDate = true; + + break; + case Recurrence::rMonthlyPos:// 2 + list.append( "2" ); + list.append( QString::number( rec->frequency()) );//12 + + writeEndDate = true; + { + int count = 1; + QPtrList<Recurrence::rMonthPos> rmp; + rmp = rec->monthPositions(); + if ( rmp.first()->negative ) + count = 5 - rmp.first()->rPos - 1; + else + count = rmp.first()->rPos - 1; + list.append( QString::number( count ) ); + + } + + list.append( "0" ); + break; + case Recurrence::rMonthlyDay:// 3 + list.append( "3" ); + list.append( QString::number( rec->frequency()) );//12 + list.append( "0" ); + list.append( "0" ); + writeEndDate = true; + break; + case Recurrence::rYearlyMonth://4 + list.append( "4" ); + list.append( QString::number( rec->frequency()) );//12 + list.append( "0" ); + list.append( "0" ); + writeEndDate = true; + break; + + default: + list.append( "255" ); + list.append( QString() ); + list.append( "0" ); + list.append( QString() ); + list.append( "0" ); + list.append( "20991231T000000" ); + break; + } + if ( writeEndDate ) { + + if ( rec->endDate().isValid() ) { // 15 + 16 + list.append( "1" ); + list.append( PhoneParser::dtToString( rec->endDate()) ); + } else { + list.append( "0" ); + list.append( "20991231T000000" ); + } + + } + attList << list.join(""); + attList << event->categoriesStr(); + attList << event->secrecyStr(); + return PhoneFormat::getCsum(attList ); +} ulong PhoneFormat::getCsum( const QStringList & attList) { int max = attList.count() -1; ulong cSum = 0; int j,k,i; int add; for ( i = 1; i < max ; ++i ) { QString s = attList[i]; @@ -793,16 +901,27 @@ void PhoneFormat::todo2GSM( Todo* todo, GSM_ToDoEntry *gsm ) s.append('\"'); } else if(s.isEmpty() && !s.isNull()){ s = "\"\""; } } return list.join(","); #endif } +void PhoneFormat::afterSave( Incidence* inc) +{ + uint csum; + if ( inc->type() == "Event") + csum = PhoneFormat::getCsumEvent( (Event*) inc ); + else + csum = PhoneFormat::getCsumTodo( (Todo*) inc ); + inc->setCsum( mProfileName, QString::number( csum )); + inc->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID ); + +} bool PhoneFormat::save( Calendar *calendar) { GSM_StateMachine s; qDebug(" save "); s.opened = false; s.msg = NULL; s.ConfigNum = 0; QLabel status ( i18n("Writing data. Opening device ..."), 0 ); @@ -840,32 +959,37 @@ bool PhoneFormat::save( Calendar *calendar) if ( ev->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete error = Phone->DeleteCalendar(&s, &Note); } else if ( ev->getID(mProfileName).isEmpty() ) { // add new // we have to do this later after deleting } else { // change existing - error = Phone->AddCalendar(&s, &Note); + error = Phone->SetCalendar(&s, &Note); } } ev = er.next(); } ev = er.first(); // pending get empty slots while ( ev ) { if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL && ev->tempSyncStat() != SYNC_TEMPSTATE_DELETE) { if ( ev->getID(mProfileName).isEmpty() ) { status.setText ( message + QString::number ( ++procCount ) ); qApp->processEvents(); - int newID ;//= pending - ev->setID(mProfileName, QString::number( newID )); + //int newID ;//= pending + //ev->setID(mProfileName, QString::number( newID )); event2GSM( ev, &Note ); + Note.Location = 0; error = Phone->AddCalendar(&s, &Note); + ev->setID( mProfileName, QString::number( Note.Location ) ); + afterSave( ev ); + } else { + afterSave( ev ); // setting temp sync stat for changed items } } ev = er.next(); } GSM_ToDoEntry ToDoEntry; QPtrList<Todo> tl = calendar->rawTodos(); Todo* to = tl.first(); @@ -891,20 +1015,26 @@ bool PhoneFormat::save( Calendar *calendar) // pending get empty slots to = tl.first(); while ( to ) { if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL && to->tempSyncStat() != SYNC_TEMPSTATE_DELETE) { if ( to->getID(mProfileName).isEmpty() ) { status.setText ( message + QString::number ( ++procCount ) ); qApp->processEvents(); - int newID ;//= pending - to->setID(mProfileName, QString::number( newID )); + //int newID ;//= pending + //to->setID(mProfileName, QString::number( newID )); todo2GSM( to, &ToDoEntry ); + ToDoEntry.Location = 0; error=Phone->AddToDo(&s,&ToDoEntry); + to->setID(mProfileName, QString::number( ToDoEntry.Location )); + afterSave( to ); + qDebug("New Todo. Location %d ",ToDoEntry.Location ); + } else { + afterSave( to ); } } to = tl.next(); } return true; } QString PhoneFormat::dtToGSM( const QDateTime& dti, bool useTZ ) { diff --git a/libkcal/phoneformat.h b/libkcal/phoneformat.h index 1472880..7b7dd04 100644 --- a/libkcal/phoneformat.h +++ b/libkcal/phoneformat.h @@ -42,22 +42,24 @@ class PhoneFormat : public QObject { PhoneFormat(QString profileName, QString device,QString connection, QString model); virtual ~PhoneFormat(); bool load( Calendar * ,Calendar * ); bool save( Calendar * ); bool fromString( Calendar *, const QString & ); QString toString( Calendar * ); static ulong getCsum( const QStringList & ); - + static ulong getCsumTodo( Todo* to ); + static ulong getCsumEvent( Event* ev ); private: void event2GSM( Event* ev, GSM_CalendarEntry*Note ); void todo2GSM( Todo* ev, GSM_ToDoEntry *ToDo ); int initDevice(GSM_StateMachine *s); QString getEventString( Event* ); QString getTodoString( Todo* ); QString dtToGSM( const QDateTime& dt, bool useTZ = true ); QString mProfileName, mDevice, mConnection, mModel; + void afterSave( Incidence* ); }; } #endif |