summaryrefslogtreecommitdiffabout
path: root/libkcal
authorzautrix <zautrix>2004-08-10 19:41:31 (UTC)
committer zautrix <zautrix>2004-08-10 19:41:31 (UTC)
commit2f1b58e344b882578977dd3786f7a94495096d22 (patch) (side-by-side diff)
tree6658bef546b6feac1688aa465ca94344e15704d7 /libkcal
parent467e50111dfd6d66aca205501b6bf369b7f0a166 (diff)
downloadkdepimpi-2f1b58e344b882578977dd3786f7a94495096d22.zip
kdepimpi-2f1b58e344b882578977dd3786f7a94495096d22.tar.gz
kdepimpi-2f1b58e344b882578977dd3786f7a94495096d22.tar.bz2
More syncing stuff
Diffstat (limited to 'libkcal') (more/less context) (ignore whitespace changes)
-rw-r--r--libkcal/calendar.cpp15
-rw-r--r--libkcal/calendar.h1
-rw-r--r--libkcal/incidencebase.cpp3
-rw-r--r--libkcal/phoneformat.cpp227
-rw-r--r--libkcal/phoneformat.h4
-rw-r--r--libkcal/vcalformat.cpp7
-rw-r--r--libkcal/vcalformat.h4
7 files changed, 221 insertions, 40 deletions
diff --git a/libkcal/calendar.cpp b/libkcal/calendar.cpp
index 32aac7a..a3977d7 100644
--- a/libkcal/calendar.cpp
+++ b/libkcal/calendar.cpp
@@ -17,32 +17,33 @@
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#include <stdlib.h>
#include <time.h>
#include <kdebug.h>
#include <kglobal.h>
#include <klocale.h>
#include "exceptions.h"
#include "calfilter.h"
#include "calendar.h"
+#include "syncdefines.h"
using namespace KCal;
Calendar::Calendar()
{
init();
setTimeZoneId( i18n (" 00:00 Europe/London(UTC)") );
}
Calendar::Calendar( const QString &timeZoneId )
{
init();
setTimeZoneId(timeZoneId);
}
@@ -234,33 +235,47 @@ QPtrList<Incidence> Calendar::incidences()
{
QPtrList<Incidence> incidences;
Incidence *i;
QPtrList<Event> e = events();
for( i = e.first(); i; i = e.next() ) incidences.append( i );
QPtrList<Todo> t = todos();
for( i = t.first(); i; i = t.next() ) incidences.append( i );
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;
QPtrList<Event> e = rawEvents();
for( i = e.first(); i; i = e.next() ) incidences.append( i );
QPtrList<Todo> t = rawTodos();
for( i = t.first(); i; i = t.next() ) incidences.append( i );
QPtrList<Journal> j = journals();
for( i = j.first(); i; i = j.next() ) incidences.append( i );
return incidences;
diff --git a/libkcal/calendar.h b/libkcal/calendar.h
index 4a3223c..06a911c 100644
--- a/libkcal/calendar.h
+++ b/libkcal/calendar.h
@@ -53,32 +53,33 @@ class CalFilter;
event (or any other subclass of IncidenceBase) object is added to the
Calendar by addEvent() it is owned by the Calendar object. The Calendar takes
care of deleting it. All Events returned by the query functions are returned
as pointers, that means all changes to the returned events are immediately
visible in the Calendar. You shouldn't delete any Event object you get from
Calendar.
*/
class Calendar : public QObject, public CustomProperties,
public IncidenceBase::Observer
{
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;
/**
Sync changes in memory to persistant storage.
*/
virtual void save() = 0;
virtual QPtrList<Event> getExternLastSyncEvents() = 0;
virtual bool isSaving() { return false; }
/**
Return the owner of the calendar's full name.
*/
const QString &getOwner() const;
diff --git a/libkcal/incidencebase.cpp b/libkcal/incidencebase.cpp
index 15c4fa8..64a343c 100644
--- a/libkcal/incidencebase.cpp
+++ b/libkcal/incidencebase.cpp
@@ -11,49 +11,50 @@
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#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() :
mReadOnly(false), mFloats(true), mDuration(0), mHasDuration(false),
mPilotId(0), mSyncStatus(SYNCMOD)
{
setUid(CalFormat::createUniqueId());
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 )
{
mReadOnly = i.mReadOnly;
mDtStart = i.mDtStart;
mDuration = i.mDuration;
mHasDuration = i.mHasDuration;
mOrganizer = i.mOrganizer;
mUid = i.mUid;
QPtrList<Attendee> attendees = i.attendees();
for( Attendee *a = attendees.first(); a; a = attendees.next() ) {
mAttendees.append( new Attendee( *a ) );
diff --git a/libkcal/phoneformat.cpp b/libkcal/phoneformat.cpp
index e6d4879..6bbc0a3 100644
--- a/libkcal/phoneformat.cpp
+++ b/libkcal/phoneformat.cpp
@@ -53,35 +53,35 @@ public:
;
}
bool readTodo( Calendar *existingCalendar,GSM_ToDoEntry *ToDo, GSM_StateMachine* s)
{
int id = ToDo->Location;
Todo *todo;
todo = existingCalendar->todo( mProfileName ,QString::number( id ) );
if (todo )
todo = (Todo *)todo->clone();
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;
GSM_DateTime* dtp;
bool alarm = false;
QDateTime alarmDt;
GSM_Category Category;
int error;
for (j=0;j<ToDo->EntriesNum;j++) {
//qDebug(" for todo %d",ToDo->Location );
switch (ToDo->Entries[j].EntryType) {
case TODO_END_DATETIME:
@@ -217,32 +217,33 @@ public:
QDateTime alarmDt;
repeat_startdate.Day = 0;
repeat_stopdate.Day = 0;
for (i=0;i<Note->EntriesNum;i++) {
//qDebug(" for ev");
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 ));
}
+ //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 )));
} 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:
@@ -757,39 +758,39 @@ 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 *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;
static INI_Section *cfg = NULL;
cfg=GSM_FindGammuRC();
int i;
for (i = 0; i <= MAX_CONFIG_NUM; i++) {
if (cfg!=NULL) {
cp = (char *)INI_GetValue(cfg, (unsigned char*) "gammu", (unsigned char*)"gammucoding", false);
if (cp) di.coding = cp;
s.Config[i].Localize = (char *)INI_GetValue(cfg, (unsigned char*) "gammu", (unsigned char*) "gammuloc", false);
if (s.Config[i].Localize) {
@@ -822,208 +823,368 @@ bool PhoneFormat::load( Calendar *calendar, Calendar *existingCal)
/* We wanted to read just user specified configuration. */
{break;}
}
#endif
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;
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,&note,start);
if (error == ERR_EMPTY) break;
start = false;
handler.readEvent( existingCal, &note );
+ qDebug("Org loc %d ",note.Location);
+ //note.Location = 0;
+ error=Phone->SetCalendar(&s,&note);
+ 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 );
else
csum = PhoneFormat::getCsumTodo( (Todo*) 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);
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<Event> er = calendar->rawEvents();
Event* ev = er.first();
- QString message = i18n("Processing event # ");
+ 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 # ");
+ 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;
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());
diff --git a/libkcal/phoneformat.h b/libkcal/phoneformat.h
index 33b2091..2c2e51c 100644
--- a/libkcal/phoneformat.h
+++ b/libkcal/phoneformat.h
@@ -39,29 +39,29 @@ namespace KCal {
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:
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* );
};
}
#endif
diff --git a/libkcal/vcalformat.cpp b/libkcal/vcalformat.cpp
index 1167e58..076cd3f 100644
--- a/libkcal/vcalformat.cpp
+++ b/libkcal/vcalformat.cpp
@@ -32,32 +32,33 @@
#include <kmessagebox.h>
#include <kiconloader.h>
#include <klocale.h>
#include "vcc.h"
#include "vobject.h"
#include "vcaldrag.h"
#include "calendar.h"
#include "vcalformat.h"
using namespace KCal;
VCalFormat::VCalFormat()
{
+ mCalendar = 0;
}
VCalFormat::~VCalFormat()
{
}
bool VCalFormat::load(Calendar *calendar, const QString &fileName)
{
mCalendar = calendar;
clearException();
kdDebug(5800) << "VCalFormat::load() " << fileName << endl;
VObject *vcal = 0;
@@ -152,44 +153,46 @@ bool VCalFormat::fromString( Calendar *calendar, const QString &text )
strcmp( vObjectName( curvo ), VCTodoProp ) );
if ( strcmp( vObjectName( curvo ), VCEventProp ) == 0 ) {
Event *event = VEventToEvent( curvo );
calendar->addEvent( event );
} else {
kdDebug(5800) << "VCalFormat::fromString(): Unknown object type." << endl;
deleteVObject( vcal );
return false;
}
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;
}
QString VCalFormat::toString( Calendar *calendar )
{
// TODO: Factor out VCalFormat::asString()
VObject *vcal = newVObject(VCCalProp);
addPropValue( vcal, VCProdIdProp, CalFormat::productId() );
QString tmpStr = mCalendar->getTimeZoneStr();
addPropValue( vcal, VCTimeZoneProp, tmpStr.local8Bit() );
diff --git a/libkcal/vcalformat.h b/libkcal/vcalformat.h
index 8490125..7b9ca26 100644
--- a/libkcal/vcalformat.h
+++ b/libkcal/vcalformat.h
@@ -49,34 +49,34 @@ class VCalFormat : public CalFormat {
*/
bool load(Calendar *,const QString &fileName);
/** writes out the calendar to disk in vCalendar format. Returns true if
* successful and false on error.
* @param fileName the name of the file
*/
bool save(Calendar *,const QString &fileName);
/**
Parse string and populate calendar with that information.
*/
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);
/** translate a Event into a VTodo-type VObject and return pointer */
VObject *eventToVTodo(const Todo *anEvent);
/** translate a Event into a VObject and returns a pointer to it. */
VObject* eventToVEvent(const Event *anEvent);
/** takes a QDate and returns a string in the format YYYYMMDDTHHMMSS */
QString qDateToISO(const QDate &);
/** takes a QDateTime and returns a string in format YYYYMMDDTHHMMSS */
QString qDateTimeToISO(const QDateTime &, bool zulu=TRUE);
/** takes a string in the format YYYYMMDDTHHMMSS and returns a