From ad99dd380750834b3ccc4dd6fdcdd446ca5ba7ee Mon Sep 17 00:00:00 2001 From: zautrix Date: Mon, 09 Aug 2004 14:56:56 +0000 Subject: more phone sync --- diff --git a/korganizer/calendarview.cpp b/korganizer/calendarview.cpp index d6ead37..547d02b 100644 --- a/korganizer/calendarview.cpp +++ b/korganizer/calendarview.cpp @@ -1199,13 +1199,11 @@ void CalendarView::syncExternal( int mode ) } else #endif if ( mode == 1 ) { // phone - phoneFormat = new PhoneFormat (); - loadSuccess = phoneFormat->load( calendar, - mCalendar, - mCurrentSyncDevice, + phoneFormat = new PhoneFormat (mCurrentSyncDevice, KOPrefs::instance()->mPhoneDevice, KOPrefs::instance()->mPhoneConnection, - KOPrefs::instance()->mPhoneModel); + KOPrefs::instance()->mPhoneModel); + loadSuccess = phoneFormat->load( calendar,mCalendar); } else return; diff --git a/libkcal/phoneformat.cpp b/libkcal/phoneformat.cpp index 596148e..b8fed47 100644 --- a/libkcal/phoneformat.cpp +++ b/libkcal/phoneformat.cpp @@ -195,6 +195,7 @@ public: attList << todo->secrecyStr(); cSum = PhoneFormat::getCsum(attList ); todo->setCsum( mProfileName, QString::number( cSum )); + todo->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL ); mCalendar->addTodo( todo); return true; @@ -497,6 +498,7 @@ public: attList << event->secrecyStr(); cSum = PhoneFormat::getCsum(attList ); event->setCsum( mProfileName, QString::number( cSum )); + event->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL ); mCalendar->addEvent( event); return true; @@ -591,14 +593,42 @@ private: }; -PhoneFormat::PhoneFormat() +PhoneFormat::PhoneFormat(QString profileName, QString device,QString connection, QString model ) { - ; + mProfileName = profileName; + mDevice = device; + mConnection = connection; + mModel = model; } PhoneFormat::~PhoneFormat() { } +int PhoneFormat::initDevice(GSM_StateMachine *s) +{ + GSM_ReadConfig(NULL, &s->Config[0], 0); + s->ConfigNum = 1; + GSM_Config *cfg = &s->Config[0]; + if ( ! mConnection.isEmpty() ) { + cfg->Connection = strdup(mConnection.latin1()); + cfg->DefaultConnection = false; + qDebug("Connection set %s ", cfg->Connection ); + + } + 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::getCsum( const QStringList & attList) { int max = attList.count() -1; @@ -625,9 +655,8 @@ ulong PhoneFormat::getCsum( const QStringList & attList) //extern "C" GSM_Error GSM_InitConnection(GSM_StateMachine *s, int ReplyNum); #include #define DEBUGMODE false -bool PhoneFormat::load( Calendar *calendar, Calendar *existingCal ,QString profileName, QString device,QString connection, QString model ) +bool PhoneFormat::load( Calendar *calendar, Calendar *existingCal) { - mProfileName = profileName; GSM_StateMachine s; qDebug(" load "); s.opened = false; @@ -676,30 +705,7 @@ bool PhoneFormat::load( Calendar *calendar, Calendar *existingCal ,QString profi } #endif - setlocale(LC_ALL, ""); - GSM_ReadConfig(NULL, &s.Config[0], 0); - s.ConfigNum = 1; - GSM_Config *cfg = &s.Config[0]; - if ( ! connection.isEmpty() ) { - cfg->Connection = strdup(connection.latin1()); - cfg->DefaultConnection = false; - qDebug("Connection set %s ", cfg->Connection ); - - } - if ( ! device.isEmpty() ) { - cfg->Device = strdup(device.latin1()); - cfg->DefaultDevice = false; - qDebug("Device set %s ", cfg->Device); - - } - if ( ! model.isEmpty() ) { - strcpy(cfg->Model,model.latin1() ); - cfg->DefaultModel = false; - qDebug("Model set %s ",cfg->Model ); - - - } - int error=GSM_InitConnection(&s,3); + int error=initDevice(&s); qDebug("GSM Init %d (no error is %d)", error, ERR_NONE); if ( error != ERR_NONE ) return false; @@ -708,7 +714,7 @@ bool PhoneFormat::load( Calendar *calendar, Calendar *existingCal ,QString profi bool start = true; Phone=s.Phone.Functions; bool gshutdown = false; - PhoneParser handler( calendar, profileName ); + PhoneParser handler( calendar, mProfileName ); int ccc = 0; qDebug("Debug: only 10 calender items are downloaded "); while (!gshutdown && ccc++ < 10) { @@ -736,11 +742,70 @@ bool PhoneFormat::load( Calendar *calendar, Calendar *existingCal ,QString profi return true; } +void PhoneFormat::event2GSM( Event* ev, GSM_CalendarEntry*Note ) +{ -bool PhoneFormat::save( Calendar *calendar) +} +void PhoneFormat::todo2GSM( Todo* todo, GSM_ToDoEntry *gsm ) { #if 0 - QLabel status ( i18n("Processing/adding events ..."), 0 ); + QStringList list; + list.append( QString::number( todo->zaurusId() ) ); + list.append( todo->categories().join(",") ); + + if ( todo->hasStartDate() ) { + list.append( dtToString( todo->dtStart()) ); + } else + list.append( QString() ); + + if ( todo->hasDueDate() ) { + QTime tim; + if ( todo->doesFloat()) { + list.append( dtToString( QDateTime(todo->dtDue().date(),QTime( 0,0,0 )), false)) ; + } else { + list.append( dtToString(todo->dtDue() ) ); + } + } else + list.append( QString() ); + + if ( todo->isCompleted() ) { + list.append( dtToString( todo->completed()) ); + list.append( "0" ); // yes 0 == completed + } else { + list.append( dtToString( todo->completed()) ); + list.append( "1" ); + } + list.append( QString::number( todo->priority() )); + if( ! todo->summary().isEmpty() ) + list.append( todo->summary() ); + else + list.append( "" ); + if (! todo->description().isEmpty() ) + list.append( todo->description() ); + 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 +} +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 ; @@ -751,186 +816,94 @@ bool PhoneFormat::save( Calendar *calendar) status.show(); status.raise(); qApp->processEvents(); - bool debug = DEBUGMODE; - QString codec = "utf8"; - QString answer; - QString ePrefix = "CARDID,CATEGORY,DSRP,PLCE,MEM1,TIM1,TIM2,ADAY,ARON,ARMN,ARSD,RTYP,RFRQ,RPOS,RDYS,REND,REDT,ALSD,ALED,MDAY\n"; - QString tPrefix = "CARDID,CATEGORY,ETDY,LTDY,FNDY,MARK,PRTY,TITL,MEM1\n"; - QString command; - QPtrList er = calendar->rawEvents(); - Event* ev = er.first(); - QString fileName = "/tmp/kopitempout"; - int i = 0; - QString changeString = ePrefix; - QString deleteString = ePrefix; - bool deleteEnt = false; - bool changeEnt = false; + + int error=initDevice(&s); + qDebug("GSM Init %d (no error is %d)", error, ERR_NONE); + if ( error != ERR_NONE ) + return false; + GSM_Phone_Functions *Phone; + GSM_CalendarEntry Note; + bool start = true; + Phone=s.Phone.Functions; + bool gshutdown = false; + QPtrList er = calendar->rawEvents(); + Event* ev = er.first(); QString message = i18n("Processing event # "); int procCount = 0; while ( ev ) { //qDebug("i %d ", ++i); - if ( true /*ev->zaurusStat() != -2*/ ) { + 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(); - QString eString = getEventString( ev ); - if (/* ev->zaurusStat() == -3 */ true) { // delete - // deleting empty strings does not work. - // we write first and x and then delete the record with the x - eString = eString.replace( QRegExp(",\"\""),",\"x\"" ); - changeString += eString + "\n"; - deleteString += eString + "\n"; - deleteEnt = true; - changeEnt = true; + event2GSM( ev, &Note ); + if ( ev->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete + error = Phone->DeleteCalendar(&s, &Note); } - else if ( /*ev->zaurusId() == -1*/true ) { // add new - command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName; - system ( command.utf8() ); - QFile file( fileName ); - if (!file.open( IO_ReadOnly ) ) { - return false; - - } - QTextStream ts( &file ); - ts.setCodec( QTextCodec::codecForName("utf8") ); - answer = ts.read(); - file.close(); - //qDebug("answer \n%s ", answer.latin1()); - getNumFromRecord( answer, ev ) ; - + else if ( ev->getID(mProfileName).isEmpty() ) { // add new + // we have to do this later after deleting + } else { // change existing - //qDebug("canging %d %d",ev->zaurusStat() ,ev->zaurusId() ); - //command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName; - changeString += eString + "\n"; - changeEnt = true; - + error = Phone->AddCalendar(&s, &Note); } } ev = er.next(); } - status.setText ( i18n("Changing events ...") ); - qApp->processEvents(); - //qDebug("changing... "); - if ( changeEnt ) { - QFile file( fileName ); - if (!file.open( IO_WriteOnly ) ) { - return false; - - } - QTextStream ts( &file ); - ts.setCodec( QTextCodec::codecForName("utf8") ); - ts << changeString ; - file.close(); - command = "db2file datebook -w -g -c " + codec+ " < "+ fileName; - system ( command.latin1() ); - //qDebug("command %s file :\n%s ", command.latin1(), changeString.latin1()); - - } - status.setText ( i18n("Deleting events ...") ); - qApp->processEvents(); - //qDebug("deleting... "); - if ( deleteEnt ) { - QFile file( fileName ); - if (!file.open( IO_WriteOnly ) ) { - return false; - - } - QTextStream ts( &file ); - ts.setCodec( QTextCodec::codecForName("utf8") ); - ts << deleteString; - file.close(); - command = "db2file datebook -d -c " + codec+ " < "+ fileName; - system ( command.latin1() ); - // qDebug("command %s file :\n%s ", command.latin1(), deleteString.latin1()); + 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 )); + event2GSM( ev, &Note ); + error = Phone->AddCalendar(&s, &Note); + } + } + ev = er.next(); } - - - changeString = tPrefix; - deleteString = tPrefix; - status.setText ( i18n("Processing todos ...") ); - qApp->processEvents(); + GSM_ToDoEntry ToDoEntry; QPtrList tl = calendar->rawTodos(); Todo* to = tl.first(); - i = 0; + message = i18n("Processing todo # "); procCount = 0; while ( to ) { - if ( true /*to->zaurusStat() != -2 */) { - status.setText ( message + QString::number ( ++procCount ) ); - qApp->processEvents(); - QString eString = getTodoString( to ); - if ( /*to->zaurusStat() == -3*/true ) { // delete - // deleting empty strings does not work. - // we write first and x and then delete the record with the x - eString = eString.replace( QRegExp(",\"\""),",\"x\"" ); - changeString += eString + "\n"; - deleteString += eString + "\n"; - deleteEnt = true; - changeEnt = true; + 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 + error=Phone->DeleteToDo(&s,&ToDoEntry); } - else if ( true /*to->zaurusId() == -1*/ ) { // add new - command = "(echo \"" + tPrefix + eString + "\" ) | db2file todo -w -g -c " + codec+ " > "+ fileName; - system ( command.utf8() ); - QFile file( fileName ); - if (!file.open( IO_ReadOnly ) ) { - return false; - - } - QTextStream ts( &file ); - ts.setCodec( QTextCodec::codecForName("utf8") ); - answer = ts.read(); - file.close(); - //qDebug("answer \n%s ", answer.latin1()); - getNumFromRecord( answer, to ) ; - + else if ( to->getID("Sharp_DTM").isEmpty() ) { // add new + ; } else { // change existing - //qDebug("canging %d %d",to->zaurusStat() ,to->zaurusId() ); - //command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName; - changeString += eString + "\n"; - changeEnt = true; - + error=Phone->AddToDo(&s,&ToDoEntry); } } - to = tl.next(); } - status.setText ( i18n("Changing todos ...") ); - qApp->processEvents(); - //qDebug("changing... "); - if ( changeEnt ) { - QFile file( fileName ); - if (!file.open( IO_WriteOnly ) ) { - return false; - - } - QTextStream ts( &file ); - ts.setCodec( QTextCodec::codecForName("utf8") ); - ts << changeString ; - file.close(); - command = "db2file todo -w -g -c " + codec+ " < "+ fileName; - system ( command.latin1() ); - //qDebug("command %s file :\n%s ", command.latin1(), changeString.latin1()); - - } - status.setText ( i18n("Deleting todos ...") ); - qApp->processEvents(); - //qDebug("deleting... "); - if ( deleteEnt ) { - QFile file( fileName ); - if (!file.open( IO_WriteOnly ) ) { - return false; - - } - QTextStream ts( &file ); - ts.setCodec( QTextCodec::codecForName("utf8") ); - ts << deleteString; - file.close(); - command = "db2file todo -d -c " + codec+ " < "+ fileName; - system ( command.latin1() ); - // qDebug("command %s file :\n%s ", command.latin1(), deleteString.latin1()); + + // 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 )); + todo2GSM( to, &ToDoEntry ); + error=Phone->AddToDo(&s,&ToDoEntry); + } + } + to = tl.next(); } -#endif return true; } QString PhoneFormat::dtToGSM( const QDateTime& dti, bool useTZ ) diff --git a/libkcal/phoneformat.h b/libkcal/phoneformat.h index 8d4e200..1472880 100644 --- a/libkcal/phoneformat.h +++ b/libkcal/phoneformat.h @@ -29,30 +29,33 @@ extern "C" { #include "../gammu/emb/common/gammu.h" } - 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(); + PhoneFormat(QString profileName, QString device,QString connection, QString model); virtual ~PhoneFormat(); - bool load( Calendar * ,Calendar *, QString profileName, QString device,QString connection, QString model ); + bool load( Calendar * ,Calendar * ); bool save( Calendar * ); bool fromString( Calendar *, const QString & ); QString toString( Calendar * ); static ulong getCsum( const QStringList & ); 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; + QString mProfileName, mDevice, mConnection, mModel; }; } -- cgit v0.9.0.2