-rw-r--r-- | libkcal/calendar.cpp | 15 | ||||
-rw-r--r-- | libkcal/calendar.h | 1 | ||||
-rw-r--r-- | libkcal/incidencebase.cpp | 3 | ||||
-rw-r--r-- | libkcal/phoneformat.cpp | 223 | ||||
-rw-r--r-- | libkcal/phoneformat.h | 4 | ||||
-rw-r--r-- | libkcal/vcalformat.cpp | 7 | ||||
-rw-r--r-- | libkcal/vcalformat.h | 4 |
7 files changed, 219 insertions, 38 deletions
diff --git a/libkcal/calendar.cpp b/libkcal/calendar.cpp index 32aac7a..a3977d7 100644 --- a/libkcal/calendar.cpp +++ b/libkcal/calendar.cpp @@ -27,12 +27,13 @@ #include <klocale.h> #include "exceptions.h" #include "calfilter.h" #include "calendar.h" +#include "syncdefines.h" using namespace KCal; Calendar::Calendar() { @@ -244,13 +245,27 @@ QPtrList<Incidence> Calendar::incidences() QPtrList<Journal> j = journals(); for( i = j.first(); i; i = j.next() ) incidences.append( i ); return incidences; } +void Calendar::resetTempSyncStat() +{ + QPtrList<Incidence> incidences; + + Incidence *i; + + QPtrList<Event> e = rawEvents(); + for( i = e.first(); i; i = e.next() ) i->setTempSyncStat( SYNC_TEMPSTATE_INITIAL ); + + QPtrList<Todo> t = rawTodos(); + for( i = t.first(); i; i = t.next() ) i->setTempSyncStat( SYNC_TEMPSTATE_INITIAL ); + QPtrList<Journal> j = journals(); + for( i = j.first(); i; i = j.next() ) i->setTempSyncStat( SYNC_TEMPSTATE_INITIAL ); +} QPtrList<Incidence> Calendar::rawIncidences() { QPtrList<Incidence> incidences; Incidence *i; diff --git a/libkcal/calendar.h b/libkcal/calendar.h index 4a3223c..06a911c 100644 --- a/libkcal/calendar.h +++ b/libkcal/calendar.h @@ -63,12 +63,13 @@ class Calendar : public QObject, public CustomProperties, Q_OBJECT public: Calendar(); Calendar(const QString &timeZoneId); virtual ~Calendar(); void deleteIncidence(Incidence *in); + void resetTempSyncStat(); /** Clears out the current calendar, freeing all used memory etc. */ virtual void close() = 0; /** diff --git a/libkcal/incidencebase.cpp b/libkcal/incidencebase.cpp index 15c4fa8..64a343c 100644 --- a/libkcal/incidencebase.cpp +++ b/libkcal/incidencebase.cpp @@ -21,12 +21,13 @@ #include <kglobal.h> #include <klocale.h> #include <kdebug.h> #include <kidmanager.h> #include "calformat.h" +#include "syncdefines.h" #include "incidencebase.h" using namespace KCal; IncidenceBase::IncidenceBase() : @@ -37,13 +38,13 @@ IncidenceBase::IncidenceBase() : mOrganizer = ""; mFloats = false; mDuration = 0; mHasDuration = false; mPilotId = 0; mExternalId = ":"; - mTempSyncStat = 0; + mTempSyncStat = SYNC_TEMPSTATE_INITIAL; mSyncStatus = 0; mAttendees.setAutoDelete( true ); } IncidenceBase::IncidenceBase(const IncidenceBase &i) : CustomProperties( i ) diff --git a/libkcal/phoneformat.cpp b/libkcal/phoneformat.cpp index e6d4879..6bbc0a3 100644 --- a/libkcal/phoneformat.cpp +++ b/libkcal/phoneformat.cpp @@ -63,15 +63,15 @@ public: else todo = new Todo; todo->setID( mProfileName,QString::number( id ) ); todo->setTempSyncStat(SYNC_TEMPSTATE_NEW_EXTERNAL ); int priority; switch (ToDo->Priority) { - case GSM_Priority_Low : priority = 1; break; + case GSM_Priority_Low : priority = 5; break; case GSM_Priority_Medium : priority = 3; break; - case GSM_Priority_High : priority = 5; break; + case GSM_Priority_High : priority = 1; break; default :priority = 3 ; break; } todo->setPriority( priority ); GSM_Phone_Functions *Phone; Phone=s->Phone.Functions; int j; @@ -227,12 +227,13 @@ public: event->setFloats( true ); event->setDtStart( QDateTime (datefromGSM ( dtp ), QTime(0,0,0 ))); } else { event->setDtStart (fromGSM ( dtp )); } + //Note->Entries[i].Date.Hour = 5; 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 ))); @@ -767,19 +768,19 @@ bool PhoneFormat::load( Calendar *calendar, Calendar *existingCal) { GSM_StateMachine s; qDebug(" load "); s.opened = false; s.msg = NULL; s.ConfigNum = 0; - QLabel status ( i18n("Reading data. Opening device ..."), 0 ); + QLabel status ( i18n("Opening device ..."), 0 ); int w = status.sizeHint().width()+20 ; - if ( w < 200 ) w = 200; + if ( w < 200 ) w = 230; int h = status.sizeHint().height()+20 ; int dw = QApplication::desktop()->width(); int dh = QApplication::desktop()->height(); - status.setCaption(i18n("Reading Phone Data") ); + status.setCaption(i18n("Reading phone...") ); status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); status.show(); status.raise(); qApp->processEvents(); #if 0 static char *cp; @@ -832,58 +833,85 @@ bool PhoneFormat::load( Calendar *calendar, Calendar *existingCal) GSM_CalendarEntry note; bool start = true; Phone=s.Phone.Functions; bool gshutdown = false; PhoneParser handler( calendar, mProfileName ); int ccc = 0; - QString message = i18n("Processing event # "); + QString message = i18n(" Reading event # "); int procCount = 0; qDebug("Debug: only 10 calender items are downloaded "); while (!gshutdown && ccc++ < 10) { status.setText ( message + QString::number ( ++procCount ) ); qApp->processEvents(); qDebug("readEvent %d ", ccc); error=Phone->GetNextCalendar(&s,¬e,start); if (error == ERR_EMPTY) break; start = false; handler.readEvent( existingCal, ¬e ); + qDebug("Org loc %d ",note.Location); + //note.Location = 0; + error=Phone->SetCalendar(&s,¬e); + qDebug("new loc %d ",note.Location); } start = true; GSM_ToDoEntry ToDo; ccc = 0; - message = i18n("Processing todo # "); + message = i18n(" Reading todo # "); procCount = 0; - while (!gshutdown) { + while (!gshutdown && ccc++ < 10) { status.setText ( message + QString::number ( ++procCount ) ); qApp->processEvents(); error = Phone->GetNextToDo(&s, &ToDo, start); if (error == ERR_EMPTY) break; start = false; - qDebug("ReadTodo %d ", ++ccc); + qDebug("ReadTodo %d ", ccc); handler.readTodo( existingCal, &ToDo, &s); } error=GSM_TerminateConnection(&s); return true; } -void PhoneFormat::event2GSM( Event* ev, GSM_CalendarEntry*Note ) +#include <qcstring.h> +void PhoneFormat::event2GSM( Calendar *cal,Event* ev, GSM_CalendarEntry*Note ) { - QString eText = vfconverter.eventToString( ev ); + QString eText = vfconverter.eventToString( ev, cal ); int pos = 0; GSM_ToDoEntry dummy; - GSM_DecodeVCALENDAR_VTODO( (unsigned char*)eText.latin1(), &pos, Note , &dummy, Nokia_VCalendar, Nokia_VToDo ); + qDebug( "Convert event"); + QByteArray ba; + QDataStream s ( ba, IO_WriteOnly ); + s << eText.utf8(); + GSM_DecodeVCALENDAR_VTODO( (unsigned char*) ba.data(), &pos, Note , &dummy, Nokia_VCalendar, Nokia_VToDo ); + qDebug( "Convert event done"); + Note->Location = 0; + QString loc = ev->getID(mProfileName); + if ( !loc.isEmpty() ){ + Note->Location = loc.toInt(); } -void PhoneFormat::todo2GSM( Todo* todo, GSM_ToDoEntry *gsmTodo ) + +} +void PhoneFormat::todo2GSM( Calendar *cal, Todo* todo, GSM_ToDoEntry *gsmTodo ) { - QString tText = vfconverter.todoToString( todo ); + qDebug( "Convert todo1"); + QString tText = vfconverter.todoToString( todo, cal ); int pos = 0; GSM_CalendarEntry dummy; - GSM_DecodeVCALENDAR_VTODO( (unsigned char*)tText.latin1(), &pos, &dummy, gsmTodo, Nokia_VCalendar, Nokia_VToDo ); + QByteArray ba; + QDataStream s ( ba, IO_WriteOnly ); + s << tText.utf8(); + GSM_DecodeVCALENDAR_VTODO( (unsigned char*) ba.data(), &pos, &dummy, gsmTodo, Nokia_VCalendar, Nokia_VToDo ); + qDebug( "Convert todo done "); + gsmTodo->Location = 0; + QString loc = todo->getID(mProfileName); + if ( !loc.isEmpty() ){ + gsmTodo->Location = loc.toInt(); + } + } void PhoneFormat::afterSave( Incidence* inc) { uint csum; if ( inc->type() == "Event") csum = PhoneFormat::getCsumEvent( (Event*) inc ); @@ -892,24 +920,25 @@ void PhoneFormat::afterSave( Incidence* inc) inc->setCsum( mProfileName, QString::number( csum )); inc->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID ); } bool PhoneFormat::save( Calendar *calendar) { + return true; GSM_StateMachine s; qDebug(" save "); s.opened = false; s.msg = NULL; s.ConfigNum = 0; - QLabel status ( i18n("Writing data. Opening device ..."), 0 ); + QLabel status ( i18n(" Opening device ..."), 0 ); int w = status.sizeHint().width()+20 ; - if ( w < 200 ) w = 200; + if ( w < 200 ) w = 230; int h = status.sizeHint().height()+20 ; int dw = QApplication::desktop()->width(); int dh = QApplication::desktop()->height(); - status.setCaption(i18n("Writing Phone Data") ); + status.setCaption(i18n("Writing to phone...") ); status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); status.show(); status.raise(); qApp->processEvents(); int error=initDevice(&s); @@ -922,98 +951,230 @@ bool PhoneFormat::save( Calendar *calendar) Phone=s.Phone.Functions; bool gshutdown = false; QPtrList<Event> er = calendar->rawEvents(); Event* ev = er.first(); QString message = i18n("Processing event # "); int procCount = 0; - while ( ev ) { - //qDebug("i %d ", ++i); + bool planB = true;// false; + while ( ev && ! planB) { 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 ); + qDebug("event1 %d ", procCount); + event2GSM( calendar, ev, &Note ); if ( ev->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete error = Phone->DeleteCalendar(&s, &Note); + if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { + planB = true; + qDebug(" e delete planB %d ", error); + break; + } } else if ( ev->getID(mProfileName).isEmpty() ) { // add new // we have to do this later after deleting } else { // change existing error = Phone->SetCalendar(&s, &Note); + if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { + planB = true; + qDebug(" e change planB %d ", error); + break; + } + qDebug("Change Calendar. Location %d status: %d",Note.Location, error ); } } ev = er.next(); } ev = er.first(); // pending get empty slots - while ( ev ) { + int loc = 0; + while ( ev && ! planB) { if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL && ev->tempSyncStat() != SYNC_TEMPSTATE_DELETE) { + qDebug("event2 %d ", procCount); 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 ); - Note.Location = 0; + event2GSM( calendar, ev, &Note ); + ++loc; + Note.Location = loc; error = Phone->AddCalendar(&s, &Note); + if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { + planB = true; + qDebug(" e add planB %d ", error); + break; + } ev->setID( mProfileName, QString::number( Note.Location ) ); - qDebug("New Calendar. Location %d ",Note.Location ); + qDebug("New Calendar. Location %d stat %d %d",Note.Location ,error, ERR_UNKNOWN); afterSave( ev ); } else { afterSave( ev ); // setting temp sync stat for changed items } } ev = er.next(); } + + + if ( planB ) { + qDebug("delete all calendar..."); + status.setText ( i18n("Deleting all calendar...")); + qApp->processEvents(); + error=Phone->DeleteAllCalendar(&s); + if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { + message = i18n(" Deleting event # "); + procCount = 0; + while (1) { + status.setText ( message + QString::number ( ++procCount ) ); + qApp->processEvents(); + qDebug("deleting event ... %d", procCount); + error = Phone->GetNextCalendar(&s,&Note,true); + if (error != ERR_NONE) break; + error = Phone->DeleteCalendar(&s,&Note); + } + qDebug("deleting calendar ... finished"); + } else { + status.setText ( i18n("All calendar deleted!")); + qDebug("all cal deleted"); + } + bool planC = false; + ev = er.first(); + procCount = 0; + message = i18n(" Writing event # "); + while ( ev && ! planC) { + status.setText ( message + QString::number ( ++procCount ) ); + qApp->processEvents(); + event2GSM( calendar, ev, &Note ); + Note.Location = procCount; + error=Phone->AddCalendar(&s,&Note); + if (error != ERR_NONE ) { + // we have currently no planC :-( + // planC = true; + //qDebug("add planC %d ", error); + //break; + // we remove the ID such that this todo is not deleted after next sync + ev->removeID(mProfileName); + ev->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID ); + qDebug("error :cal adding loc %d planB stat %d ", Note.Location ,error); + } else { + qDebug("cal adding loc %d planB stat %d ", Note.Location ,error); + ev->setID(mProfileName, QString::number( Note.Location )); + afterSave( ev ); + } + ev = er.next(); + } + if ( planC ) { + qDebug("writing cal went wrong..."); + + // we have currently no planC :-( + } + } GSM_ToDoEntry ToDoEntry; QPtrList<Todo> tl = calendar->rawTodos(); Todo* to = tl.first(); message = i18n("Processing todo # "); procCount = 0; - while ( to ) { + planB = false; + while ( to && ! planB ) { if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { + qDebug("todo3 %d ", procCount); status.setText ( message + QString::number ( ++procCount ) ); qApp->processEvents(); - todo2GSM( to, &ToDoEntry ); + qDebug("todo5 %d ", procCount); + todo2GSM( calendar, to, &ToDoEntry ); if ( to->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete error=Phone->DeleteToDo(&s,&ToDoEntry); + if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { + planB = true; + qDebug("delete planB %d ", error); + } } - else if ( to->getID("Sharp_DTM").isEmpty() ) { // add new + else if ( to->getID(mProfileName).isEmpty() ) { // add new ; } else { // change existing error=Phone->SetToDo(&s,&ToDoEntry); + if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { + planB = true; + qDebug("set planB %d ", error); + } + qDebug("Old Todo. Location %d %d",ToDoEntry.Location , error ); } } to = tl.next(); } // pending get empty slots to = tl.first(); - while ( to ) { + while ( to && ! planB ) { + qDebug("todo2 %d ", procCount); if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL && to->tempSyncStat() != SYNC_TEMPSTATE_DELETE) { + qDebug("todo4 %d ", procCount); 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 ); + todo2GSM( calendar,to, &ToDoEntry ); ToDoEntry.Location = 0; error=Phone->AddToDo(&s,&ToDoEntry); + if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { + planB = true; + qDebug("new planB %d ", error); + } to->setID(mProfileName, QString::number( ToDoEntry.Location )); afterSave( to ); - qDebug("New Todo. Location %d ",ToDoEntry.Location ); + qDebug("New Todo. Location %d %d",ToDoEntry.Location, error ); } else { afterSave( to ); } } to = tl.next(); } + if ( planB ) { + qDebug("delete all ..."); + error=Phone->DeleteAllToDo(&s); + if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { + while (1) { + qDebug("deleting todo ..."); + error = Phone->GetNextToDo(&s,&ToDoEntry,true); + if (error != ERR_NONE) break; + error = Phone->DeleteToDo(&s,&ToDoEntry); + } + qDebug("deleting todo ... finished"); + } else { + qDebug("all todo deleted"); + } + bool planC = false; + to = tl.first(); + while ( to && ! planC ) { + todo2GSM( calendar,to, &ToDoEntry ); + ToDoEntry.Location = 0; + error=Phone->AddToDo(&s,&ToDoEntry); + if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { + // we have currently no planC :-( + // planC = true; + //qDebug("add planC %d ", error); + //break; + // we remove the ID such that this todo is not deleted after next sync + to->removeID(mProfileName); + to->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID ); + } else { + qDebug("adding %d planB %d ", ToDoEntry.Location ,error); + to->setID(mProfileName, QString::number( ToDoEntry.Location )); + afterSave( to ); + } + to = tl.next(); + } + if ( planC ) { + // we have currently no planC :-( + } + } return true; } QString PhoneFormat::dtToGSM( const QDateTime& dti, bool useTZ ) { QString datestr; QString timestr; diff --git a/libkcal/phoneformat.h b/libkcal/phoneformat.h index 33b2091..2c2e51c 100644 --- a/libkcal/phoneformat.h +++ b/libkcal/phoneformat.h @@ -49,14 +49,14 @@ class PhoneFormat : public QObject { QString toString( Calendar * ); static ulong getCsum( const QStringList & ); static ulong getCsumTodo( Todo* to ); static ulong getCsumEvent( Event* ev ); private: VCalFormat vfconverter; - void event2GSM( Event* ev, GSM_CalendarEntry*Note ); - void todo2GSM( Todo* ev, GSM_ToDoEntry *ToDo ); + void event2GSM( Calendar *, Event* ev, GSM_CalendarEntry*Note ); + void todo2GSM( Calendar *, 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* ); diff --git a/libkcal/vcalformat.cpp b/libkcal/vcalformat.cpp index 1167e58..076cd3f 100644 --- a/libkcal/vcalformat.cpp +++ b/libkcal/vcalformat.cpp @@ -42,12 +42,13 @@ #include "vcalformat.h" using namespace KCal; VCalFormat::VCalFormat() { + mCalendar = 0; } VCalFormat::~VCalFormat() { } @@ -162,24 +163,26 @@ bool VCalFormat::fromString( Calendar *calendar, const QString &text ) deleteVObject( vcal ); return true; } -QString VCalFormat::eventToString( Event * event) +QString VCalFormat::eventToString( Event * event, Calendar *calendar) { if ( !event ) return QString::null; + mCalendar = calendar; VObject *vevent = eventToVEvent( event ); char *buf = writeMemVObject( 0, 0, vevent ); QString result( buf ); cleanVObject( vevent ); return result; } -QString VCalFormat::todoToString( Todo * todo ) +QString VCalFormat::todoToString( Todo * todo, Calendar *calendar ) { if ( !todo ) return QString::null; + mCalendar = calendar; VObject *vevent = eventToVTodo( todo ); char *buf = writeMemVObject( 0, 0, vevent ); QString result( buf ); cleanVObject( vevent ); return result; } diff --git a/libkcal/vcalformat.h b/libkcal/vcalformat.h index 8490125..7b9ca26 100644 --- a/libkcal/vcalformat.h +++ b/libkcal/vcalformat.h @@ -59,14 +59,14 @@ class VCalFormat : public CalFormat { */ bool fromString( Calendar *, const QString & ); /** Return calendar information as string. */ QString toString( Calendar * ); - QString eventToString( Event * ); - QString todoToString( Todo * ); + QString eventToString( Event *, Calendar *calendar ); + QString todoToString( Todo * ,Calendar *calendar ); protected: /** translates a VObject of the TODO type into a Event */ Todo *VTodoToEvent(VObject *vtodo); /** translates a VObject into a Event and returns a pointer to it. */ Event *VEventToEvent(VObject *vevent); |