-rw-r--r-- | libkcal/phoneformat.cpp | 273 | ||||
-rw-r--r-- | libkcal/phoneformat.h | 3 |
2 files changed, 215 insertions, 61 deletions
diff --git a/libkcal/phoneformat.cpp b/libkcal/phoneformat.cpp index fa18683..fd6b6af 100644 --- a/libkcal/phoneformat.cpp +++ b/libkcal/phoneformat.cpp @@ -37,16 +37,17 @@ #include <kglobal.h> #include "calendar.h" #include "alarm.h" #include "recurrence.h" #include "calendarlocal.h" #include "phoneformat.h" +#include "syncdefines.h" using namespace KCal; //CARDID,CATEGORY,DSRP,PLCE,MEM1,TIM1,TIM2,ADAY,ARON,ARMN,ARSD,RTYP,RFRQ,RPOS,RDYS,REND,REDT,ALSD,ALED,MDAY // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 //ARSD silentalarm = 0 // 11 RTYP 225 no /0 dialy/ 1 weekly/ 3 month by date/ 2 month by day(pos)/ yearly @@ -57,140 +58,274 @@ using namespace KCal; // 16 REDT rec end dt //ALSD //ALED //MDAY 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; int max = attList.count() -2; while ( i < max ) { if ( !attList[i].isEmpty() ) { skip = false; break; } ++i ; } if ( skip ) 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 ); + + + 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->setDtStart (fromGSM ( dtp )); - 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 ))); - event->setFloats( true ); - } else { - event->setFloats( false ); - event->setDtStart( fromString( attList[5] ) ); - event->setDtEnd( fromString( attList[6] )); + } + 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(); - - QString weekDaysStr = attList[14]; - uint weekDaysNum = weekDaysStr.toInt(); + 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; + } + + uint weekDaysNum = repeat_dayofweek ; QBitArray weekDays( 7 ); int i; int bb = 1; for( i = 1; i <= 7; ++i ) { weekDays.setBit( i - 1, ( bb & weekDaysNum )); bb = 2 << (i-1); //qDebug(" %d bit %d ",i-1,weekDays.at(i-1) ); } // qDebug("next "); - QString posStr = attList[13]; - int pos = posStr.toInt(); + int pos = 0; Recurrence *r = event->recurrence(); + /* + 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 ( 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 ); else 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 ); else r->setMonthly( Recurrence::rMonthlyPos, freq, -1 ); 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 ); else r->setYearly( Recurrence::rYearlyMonth, freq, -1 ); r->addYearlyNum( startDate.month() ); } + } else { + event->recurrence()->unsetRecurs(); } QString categoryList = attList[1] ; event->setCategories( lookupCategories( categoryList ) ); // strange 0 semms to mean: alarm enabled - if ( attList[8] == "0" ) { + 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 = 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; todo = existingCalendar->todo( attList[0] ); if (todo ) todo = (Todo*)todo->clone(); else todo = new Todo; @@ -241,16 +376,17 @@ class PhoneParser : public QObject todo->setCompleted(fromString( hasDateStr ) ); } QString completedStr = attList[5]; if ( completedStr == "0" ) todo->setCompleted( true ); else todo->setCompleted( false ); mCalendar->addTodo( todo ); +#endif } else if ( qName == "Category" ) { /* QString id = attributes.value( "id" ); QString name = attributes.value( "name" ); setCategory( id, name ); */ } @@ -259,32 +395,36 @@ class PhoneParser : public QObject } void setCategoriesList ( QStringList * c ) { oldCategories = c; } - 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 ) dt = dt.addSecs ( offset*60); return dt; } + QDate datefromGSM ( GSM_DateTime* dtp ) { + return QDate ( dtp->Year, dtp->Month, dtp->Day ); + } protected: QDateTime toDateTime( const QString &value ) { QDateTime dt; dt.setTime_t( value.toUInt() ); return dt; } @@ -300,17 +440,18 @@ class PhoneParser : public QObject if ( ! oldCategories->contains( cate ) ) oldCategories->append( cate ); } categories.append(cate ); } return categories; } - private: + private: + QString mProfileName ; Calendar *mCalendar; QStringList * oldCategories; static QString category( const QString &id ) { QMap<QString,QString>::ConstIterator it = mCategoriesMap.find( id ); if ( it == mCategoriesMap.end() ) return id; else return *it; } @@ -354,19 +495,19 @@ ulong PhoneFormat::getCsum( const QStringList & attList) } } return cSum; } //extern "C" GSM_Error GSM_InitConnection(GSM_StateMachine *s, int ReplyNum); #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 "); s.opened = false; s.msg = NULL; s.ConfigNum = 0; static char *cp; static INI_Section *cfg = NULL; cfg=GSM_FindGammuRC(); @@ -412,22 +553,33 @@ static char *cp; int error=GSM_InitConnection(&s,3); qDebug(" init %d %d", error, ERR_NONE); 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 bool debug = DEBUGMODE; //debug = true; QString text; QString codec = "utf8"; QLabel status ( i18n("Reading events ..."), 0 ); @@ -1034,16 +1186,17 @@ QString PhoneFormat::getPart( const QString & text, bool &ok, int &start ) } } bool PhoneFormat::fromString( Calendar *calendar, const QString & text) { return false; } bool PhoneFormat::fromString2Cal( Calendar *calendar,Calendar *existingCalendar, GSM_StateMachine* s, const QString & type) { +#if 0 GSM_Phone_Functions *Phone; GSM_CalendarEntry note; GSM_CalendarEntry* Note; bool refresh = true; Phone=s->Phone.Functions; bool gshutdown = false; @@ -1320,17 +1473,17 @@ typedef struct { } templist.clear(); templist << CARDID << CATEGORY << DSRP << PLCE << MEM1 << TIM1 << TIM2 << ADAY << ARON << ARMN << ARSD << RTYP << RFRQ << RPOS << RDYS << REND << REDT << ALSD << ALED << MDAY; handler.startElement( existingCalendar, templist, type ); } - +#endif #if 0 // qDebug("test %s ", text.latin1()); QStringList templist; QString tempString; int start = 0; int len = text.length(); int end = text.find ("\n",start)+1; bool ok = true; diff --git a/libkcal/phoneformat.h b/libkcal/phoneformat.h index 4ddf6f0..4da38c8 100644 --- a/libkcal/phoneformat.h +++ b/libkcal/phoneformat.h @@ -37,29 +37,30 @@ namespace KCal { */ class PhoneFormat : public QObject { public: /** Create new iCalendar format. */ PhoneFormat(); 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; } bool fromString2Cal( Calendar *, Calendar *, GSM_StateMachine* s , const QString & ); bool fromString( Calendar *, const QString & ); QString toString( Calendar * ); static ulong getCsum( const QStringList & ); private: QString getEventString( Event* ); QString getTodoString( Todo* ); QString dtToString( const QDateTime& dt, bool useTZ = true ); QStringList *mCategories; int getNumFromRecord( QString answer,Incidence* inc ) ; QString getPart( const QString & text, bool &ok, int &start ); + QString mProfileName; }; } #endif |