-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 @@ -67,45 +67,43 @@ public: int priority; switch (ToDo->Priority) { case GSM_Priority_Low : priority = 1; break; case GSM_Priority_Medium : priority = 3; break; case GSM_Priority_High : priority = 5; break; default :priority = 3 ; break; } todo->setPriority( priority ); 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; alarmDt = fromGSM ( dtp ); break; case TODO_SILENT_ALARM_DATETIME: dtp = &ToDo->Entries[j].Date ; alarm = true; alarmDt = fromGSM ( dtp ); break; case TODO_TEXT: @@ -169,44 +167,34 @@ public: } alarm->setType( Alarm::Audio ); alarm->setEnabled( true ); int alarmOffset = alarmDt.secsTo( todo->dtStart() ); alarm->setStartOffset( -alarmOffset ); alarmString = QString::number( alarmOffset ); } else { Alarm *alarm; 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) { int id = Note->Location; Event *event; event = existingCalendar->event( mProfileName ,QString::number( id ) ); if ( event ) event = (Event*)event->clone(); else event = new Event; @@ -447,96 +435,85 @@ public: days.setBit( dayOfWeek - 1 ); r->addMonthlyPos( pos, days ); } else if ( rtype == 4 ) { if ( hasEndDate ) r->setYearly( Recurrence::rYearlyMonth, freq, endDate ); else r->setYearly( Recurrence::rYearlyMonth, freq, -1 ); r->addYearlyNum( startDate.month() ); } } 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; } QDateTime fromGSM ( GSM_DateTime* dtp, bool useTz = true ) { QDateTime dt; int y,m,t,h,min,sec; y = dtp->Year; m = dtp->Month; t = dtp->Day; h = dtp->Hour; min = dtp->Minute; sec = dtp->Second; dt = QDateTime(QDate(y,m,t), QTime(h,min,sec)); // 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 dt = dti; if(dt.date().isValid()){ const QDate& date = dt.date(); datestr.sprintf("%04d%02d%02d", date.year(), date.month(), date.day()); } if(dt.time().isValid()){ const QTime& time = dt.time(); @@ -616,32 +593,163 @@ int PhoneFormat::initDevice(GSM_StateMachine *s) } if ( ! mDevice.isEmpty() ) { cfg->Device = strdup(mDevice.latin1()); cfg->DefaultDevice = false; qDebug("Device set %s ", cfg->Device); } 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]; if ( ! s.isEmpty() ){ j = s.length(); for ( k = 0; k < j; ++k ) { int mul = k +1; add = s[k].unicode (); if ( k < 16 ) mul = mul * mul; add = add * mul *i*i*i; @@ -785,32 +893,43 @@ void PhoneFormat::todo2GSM( Todo* todo, GSM_ToDoEntry *gsm ) else list.append( "" ); for(QStringList::Iterator it=list.begin(); it!=list.end(); ++it){ QString& s = (*it); s.replace(QRegExp("\""), "\"\""); if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){ s.prepend('\"'); 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 ); int w = status.sizeHint().width()+20 ; if ( w < 200 ) w = 200; int h = status.sizeHint().height()+20 ; int dw = QApplication::desktop()->width(); int dh = QApplication::desktop()->height(); status.setCaption(i18n("Writing DTM Data") ); status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); status.show(); @@ -832,48 +951,53 @@ bool PhoneFormat::save( Calendar *calendar) int procCount = 0; while ( ev ) { //qDebug("i %d ", ++i); if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { // event was changed during sync or is a new one status.setText ( message + QString::number ( ++procCount ) ); qApp->processEvents(); event2GSM( ev, &Note ); 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(); message = i18n("Processing todo # "); procCount = 0; while ( to ) { if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { status.setText ( message + QString::number ( ++procCount ) ); qApp->processEvents(); todo2GSM( to, &ToDoEntry ); if ( to->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete @@ -883,36 +1007,42 @@ bool PhoneFormat::save( Calendar *calendar) ; } else { // change existing error=Phone->AddToDo(&s,&ToDoEntry); } } to = tl.next(); } // 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 ) { QString datestr; QString timestr; int offset = KGlobal::locale()->localTimeOffset( dti ); QDateTime dt; if (useTZ) dt = dti.addSecs ( -(offset*60)); else dt = dti; diff --git a/libkcal/phoneformat.h b/libkcal/phoneformat.h index 1472880..7b7dd04 100644 --- a/libkcal/phoneformat.h +++ b/libkcal/phoneformat.h @@ -34,30 +34,32 @@ namespace KCal { /** This class implements the calendar format used by Phone. */ class Event; class Todo; class PhoneFormat : public QObject { public: /** Create new iCalendar format. */ 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 |