-rw-r--r-- | korganizer/calendarview.cpp | 7 | ||||
-rw-r--r-- | libkcal/phoneformat.cpp | 265 | ||||
-rw-r--r-- | libkcal/phoneformat.h | 3 |
3 files changed, 217 insertions, 58 deletions
diff --git a/korganizer/calendarview.cpp b/korganizer/calendarview.cpp index b307649..d6ead37 100644 --- a/korganizer/calendarview.cpp +++ b/korganizer/calendarview.cpp @@ -1201,5 +1201,10 @@ void CalendarView::syncExternal( int mode ) if ( mode == 1 ) { // phone phoneFormat = new PhoneFormat (); - loadSuccess = phoneFormat->load( calendar, mCalendar ); + loadSuccess = phoneFormat->load( calendar, + mCalendar, + mCurrentSyncDevice, + KOPrefs::instance()->mPhoneDevice, + KOPrefs::instance()->mPhoneConnection, + KOPrefs::instance()->mPhoneModel); } else diff --git a/libkcal/phoneformat.cpp b/libkcal/phoneformat.cpp index fa18683..fd6b6af 100644 --- a/libkcal/phoneformat.cpp +++ b/libkcal/phoneformat.cpp @@ -43,4 +43,5 @@ #include "phoneformat.h" +#include "syncdefines.h" using namespace KCal; @@ -63,10 +64,13 @@ class PhoneParser : public QObject { public: - PhoneParser( Calendar *calendar ) : mCalendar( calendar ) { + PhoneParser( Calendar *calendar, QString profileName ) : mCalendar( calendar ), mProfileName ( profileName ) { oldCategories = 0; } - bool startElement( Calendar *existingCalendar, const QStringList & attList, QString qName ) + bool startElement( Calendar *existingCalendar, GSM_CalendarEntry* Note, QString qName ) { + QStringList attList; + /* +// pending csum int i = 1; bool skip = true; @@ -82,45 +86,157 @@ class PhoneParser : public QObject return false; ulong cSum = PhoneFormat::getCsum(attList ); - + */ if ( qName == "Event" ) { + int id = Note->Location; Event *event; - event = existingCalendar->event( attList[0] ); + event = existingCalendar->event( mProfileName ,QString::number( id ) ); if ( event ) event = (Event*)event->clone(); else event = new Event; - // event->setZaurusId( attList[0].toInt() ); - //event->setZaurusUid( cSum ); - //event->setZaurusStat( -2 ); + event->setID( mProfileName, attList[0] ); + // pending event->setCsum( "Sharp_DTM", QString::number( cSum )); + event->setTempSyncStat(SYNC_TEMPSTATE_NEW_EXTERNAL ); - event->setSummary( attList[2] ); - event->setLocation( attList[3] ); - event->setDescription( attList[4] ); - if ( attList[7] == "1" ) { - event->setDtStart( QDateTime(fromString( attList[17]+"T000000", false ).date(),QTime(0,0,0 ) )); - event->setDtEnd( QDateTime(fromString( attList[18]+"T000000", false ).date(),QTime(0,0,0 ))); + + int i = 0; + bool repeating = false; + int repeat_dayofweek = -1; + int repeat_day = -1; + int repeat_weekofmonth = -1; + int repeat_month = -1; + int repeat_frequency = -1; + GSM_DateTime repeat_startdate = {0,0,0,0,0,0,0}; + GSM_DateTime repeat_stopdate = {0,0,0,0,0,0,0}; + GSM_DateTime* dtp; + bool alarm = false; + QDateTime alarmDt; + repeat_startdate.Day = 0; + repeat_stopdate.Day = 0; + for (i=0;i<Note->EntriesNum;i++) { + + qDebug(" for "); + switch (Note->Entries[i].EntryType) { + case CAL_START_DATETIME: + dtp = &Note->Entries[i].Date ; + if ( dtp->Hour > 24 ) { event->setFloats( true ); + event->setDtStart( QDateTime (datefromGSM ( dtp ), QTime(0,0,0 ))); } else { - event->setFloats( false ); - event->setDtStart( fromString( attList[5] ) ); - event->setDtEnd( fromString( attList[6] )); + event->setDtStart (fromGSM ( dtp )); + + } + break; + case CAL_END_DATETIME: + dtp = &Note->Entries[i].Date ; + if ( dtp->Hour > 24 ) { + event->setFloats( true ); + event->setDtEnd( QDateTime (datefromGSM ( dtp ), QTime(0,0,0 ))); + } else { + event->setDtEnd (fromGSM ( dtp )); + } + break; + case CAL_ALARM_DATETIME: + dtp = &Note->Entries[i].Date ; + alarm = true; + alarmDt = fromGSM ( dtp ); + break; + case CAL_SILENT_ALARM_DATETIME: + dtp = &Note->Entries[i].Date ; + alarm = true; + alarmDt = fromGSM ( dtp ); + break; + case CAL_RECURRANCE: + //printmsg("Repeat : %d day%s\n",Note->Entries[i].Number/24,((Note->Entries[i].Number/24)>1) ? "s":"" ); + break; + case CAL_TEXT: + event->setSummary( QString ( (const char*) Note->Entries[i].Text )); + break; + case CAL_LOCATION: + event->setLocation(QString ((const char*) Note->Entries[i].Text )); + break; + case CAL_PHONE: + //printmsg("Phone : \"%s\"\n",DecodeUnicodeConsole(Note->Entries[i].Text)); + break; + case CAL_PRIVATE: + //printmsg("Private : %s\n",Note->Entries[i].Number == 1 ? "Yes" : "No"); + break; + case CAL_CONTACTID: +#if 0 + entry.Location = Note->Entries[i].Number; + entry.MemoryType = MEM_ME; + error=Phone->GetMemory(&s, &entry); + if (error == ERR_NONE) { + name = GSM_PhonebookGetEntryName(&entry); + if (name != NULL) { + //printmsg("Contact ID : \"%s\" (%d)\n", DecodeUnicodeConsole(name), Note->Entries[i].Number); + } else { + //printmsg("Contact ID : %d\n",Note->Entries[i].Number); } + } else { + //printmsg("Contact ID : %d\n",Note->Entries[i].Number); + } +#endif + break; + case CAL_REPEAT_DAYOFWEEK: + repeat_dayofweek = Note->Entries[i].Number; + repeating = true; + break; + case CAL_REPEAT_DAY: + repeat_day = Note->Entries[i].Number; + repeating = true; + break; + case CAL_REPEAT_WEEKOFMONTH: + repeat_weekofmonth = Note->Entries[i].Number; + repeating = true; + break; + case CAL_REPEAT_MONTH: + repeat_month = Note->Entries[i].Number; + repeating = true; + break; + case CAL_REPEAT_FREQUENCY: + repeat_frequency = Note->Entries[i].Number; + repeating = true; + break; + case CAL_REPEAT_STARTDATE: + repeat_startdate = Note->Entries[i].Date; + repeating = true; + break; + case CAL_REPEAT_STOPDATE: + repeat_stopdate = Note->Entries[i].Date; + repeating = true; + break; + } + } +#if 0 + event->setDescription( attList[4] ); + bool repeating = false; + int repeat_dayofweek = -1; + int repeat_day = -1; + int repeat_weekofmonth = -1; + int repeat_month = -1; + int repeat_frequency = -1; + GSM_DateTime repeat_startdate = {0,0,0,0,0,0,0}; + GSM_DateTime repeat_stopdate = {0,0,0,0,0,0,0}; + +#endif QString rtype = attList[11]; - if ( rtype != "255" ) { + if ( repeating ) { + int rtype = 0; // qDebug("recurs "); - QDate startDate = event->dtStart().date(); - - QString freqStr = attList[12]; - int freq = freqStr.toInt(); - - QString hasEndDateStr = attList[15] ; - bool hasEndDate = hasEndDateStr == "1"; - - QString endDateStr = attList[16]; - QDate endDate = fromString( endDateStr ).date(); + QDate startDate, endDate; + if ( repeat_startdate.Day > 0 ) + startDate = datefromGSM ( &repeat_startdate ); + else + startDate = event->dtStart().date(); + int freq = repeat_frequency; + bool hasEndDate = false; + if ( repeat_stopdate.Day > 0 ) { + endDate = datefromGSM ( &repeat_stopdate ); + hasEndDate = true; + } - QString weekDaysStr = attList[14]; - uint weekDaysNum = weekDaysStr.toInt(); + uint weekDaysNum = repeat_dayofweek ; QBitArray weekDays( 7 ); @@ -133,15 +249,32 @@ class PhoneParser : public QObject } // qDebug("next "); - QString posStr = attList[13]; - int pos = posStr.toInt(); + int pos = 0; Recurrence *r = event->recurrence(); - - if ( rtype == "0" ) { + /* + 0 daily; + 1 weekly;x + 2 monthpos;x + 3 monthlyday; + 4 rYearlyMont + */ + int dayOfWeek = startDate.dayOfWeek(); + if ( repeat_weekofmonth >= 0 ) { + rtype = 2; + pos = repeat_weekofmonth; + if ( repeat_dayofweek >= 0 ) + dayOfWeek = repeat_dayofweek; + } else if ( repeat_dayofweek >= 0 ) { + rtype = 1; + } if ( repeat_dayofweek >= 0 ) { + rtype = 1; + } + + if ( rtype == 0 ) { if ( hasEndDate ) r->setDaily( freq, endDate ); else r->setDaily( freq, -1 ); - } else if ( rtype == "1" ) { + } else if ( rtype == 1 ) { if ( hasEndDate ) r->setWeekly( freq, weekDays, endDate ); else r->setWeekly( freq, weekDays, -1 ); - } else if ( rtype == "3" ) { + } else if ( rtype == 3 ) { if ( hasEndDate ) r->setMonthly( Recurrence::rMonthlyDay, freq, endDate ); @@ -149,5 +282,5 @@ class PhoneParser : public QObject r->setMonthly( Recurrence::rMonthlyDay, freq, -1 ); r->addMonthlyDay( startDate.day() ); - } else if ( rtype == "2" ) { + } else if ( rtype == 2 ) { if ( hasEndDate ) r->setMonthly( Recurrence::rMonthlyPos, freq, endDate ); @@ -156,7 +289,7 @@ class PhoneParser : public QObject QBitArray days( 7 ); days.fill( false ); - days.setBit( startDate.dayOfWeek() - 1 ); + days.setBit( dayOfWeek - 1 ); r->addMonthlyPos( pos, days ); - } else if ( rtype == "4" ) { + } else if ( rtype == 4 ) { if ( hasEndDate ) r->setYearly( Recurrence::rYearlyMonth, freq, endDate ); @@ -165,4 +298,6 @@ class PhoneParser : public QObject r->addYearlyNum( startDate.month() ); } + } else { + event->recurrence()->unsetRecurs(); } @@ -171,5 +306,5 @@ class PhoneParser : public QObject // strange 0 semms to mean: alarm enabled - if ( attList[8] == "0" ) { + if ( alarm ) { Alarm *alarm; if ( event->alarms().count() > 0 ) @@ -181,10 +316,10 @@ class PhoneParser : public QObject alarm->setType( Alarm::Audio ); alarm->setEnabled( true ); - int alarmOffset = attList[9].toInt(); - alarm->setStartOffset( alarmOffset * -60 ); + int alarmOffset = alarmDt.secsTo( event->dtStart() ); + alarm->setStartOffset( alarmOffset ); } - mCalendar->addEvent( event); } else if ( qName == "Todo" ) { +#if 0 Todo *todo; @@ -247,4 +382,5 @@ class PhoneParser : public QObject todo->setCompleted( false ); mCalendar->addTodo( todo ); +#endif } else if ( qName == "Category" ) { @@ -265,14 +401,15 @@ class PhoneParser : public QObject } - QDateTime fromString ( QString s, bool useTz = true ) { + QDateTime fromGSM ( GSM_DateTime* dtp, bool useTz = true ) { QDateTime dt; int y,m,t,h,min,sec; - y = s.mid(0,4).toInt(); - m = s.mid(4,2).toInt(); - t = s.mid(6,2).toInt(); - h = s.mid(9,2).toInt(); - min = s.mid(11,2).toInt(); - sec = s.mid(13,2).toInt(); + 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 ) @@ -281,4 +418,7 @@ class PhoneParser : public QObject } + QDate datefromGSM ( GSM_DateTime* dtp ) { + return QDate ( dtp->Year, dtp->Month, dtp->Day ); + } protected: QDateTime toDateTime( const QString &value ) @@ -307,4 +447,5 @@ class PhoneParser : public QObject private: + QString mProfileName ; Calendar *mCalendar; QStringList * oldCategories; @@ -360,7 +501,7 @@ ulong PhoneFormat::getCsum( const QStringList & attList) #include <stdlib.h> #define DEBUGMODE false -bool PhoneFormat::load( Calendar *calendar, Calendar *existngCal ) +bool PhoneFormat::load( Calendar *calendar, Calendar *existingCal ,QString profileName, QString device,QString connection, QString model ) { - + mProfileName = profileName; GSM_StateMachine s; qDebug(" load "); @@ -418,10 +559,21 @@ static char *cp; if ( error != ERR_NONE ) return false; - fromString2Cal( calendar, existngCal, &s, "Event" ); - + // fromString2Cal( calendar, existngCal, &s, "Event" ); + GSM_Phone_Functions *Phone; + GSM_CalendarEntry note; + bool refresh = true; + Phone=s.Phone.Functions; + bool gshutdown = false; + PhoneParser handler( calendar, profileName ); + //handler.setCategoriesList( mCategories ); + int ccc = 0; + while (!gshutdown && ccc++ < 10 ) { + qDebug("count %d ", ccc); + error=Phone->GetNextCalendar(&s,¬e,refresh); + if (error == ERR_EMPTY) break; + handler.startElement( existingCal, ¬e, "Event" ); + } error=GSM_TerminateConnection(&s); - - #if 0 @@ -1040,4 +1192,5 @@ bool PhoneFormat::fromString( Calendar *calendar, const QString & text) bool PhoneFormat::fromString2Cal( Calendar *calendar,Calendar *existingCalendar, GSM_StateMachine* s, const QString & type) { +#if 0 GSM_Phone_Functions *Phone; @@ -1326,5 +1479,5 @@ typedef struct { - +#endif #if 0 // qDebug("test %s ", text.latin1()); diff --git a/libkcal/phoneformat.h b/libkcal/phoneformat.h index 4ddf6f0..4da38c8 100644 --- a/libkcal/phoneformat.h +++ b/libkcal/phoneformat.h @@ -43,5 +43,5 @@ class PhoneFormat : public QObject { virtual ~PhoneFormat(); - bool load( Calendar * ,Calendar *); + bool load( Calendar * ,Calendar *, QString profileName, QString device,QString connection, QString model ); bool save( Calendar * ); void setCategoriesList ( QStringList * cat ){ mCategories = cat; } @@ -59,4 +59,5 @@ class PhoneFormat : public QObject { int getNumFromRecord( QString answer,Incidence* inc ) ; QString getPart( const QString & text, bool &ok, int &start ); + QString mProfileName; }; |