summaryrefslogtreecommitdiffabout
path: root/libkcal
authorzautrix <zautrix>2004-09-12 13:11:10 (UTC)
committer zautrix <zautrix>2004-09-12 13:11:10 (UTC)
commitb2dede5d5735e2b4ab5afd51cf6a2c46d9be9b26 (patch) (unidiff)
treea25dbba0cac09b7a7892405b11eb08c7d02e6b6b /libkcal
parent3c954091cb8d90c185403c68a8bbbb2a961f67fe (diff)
downloadkdepimpi-b2dede5d5735e2b4ab5afd51cf6a2c46d9be9b26.zip
kdepimpi-b2dede5d5735e2b4ab5afd51cf6a2c46d9be9b26.tar.gz
kdepimpi-b2dede5d5735e2b4ab5afd51cf6a2c46d9be9b26.tar.bz2
many phonesync fixes
Diffstat (limited to 'libkcal') (more/less context) (ignore whitespace changes)
-rw-r--r--libkcal/phoneformat.cpp53
1 files changed, 45 insertions, 8 deletions
diff --git a/libkcal/phoneformat.cpp b/libkcal/phoneformat.cpp
index 2ad1b5a..6df639f 100644
--- a/libkcal/phoneformat.cpp
+++ b/libkcal/phoneformat.cpp
@@ -1,583 +1,620 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 3
4 Copyright (c) 2004 Lutz Rogowski <rogowski@kde.org> 4 Copyright (c) 2004 Lutz Rogowski <rogowski@kde.org>
5 5
6 This library is free software; you can redistribute it and/or 6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public 7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either 8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version. 9 version 2 of the License, or (at your option) any later version.
10 10
11 This library is distributed in the hope that it will be useful, 11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details. 14 Library General Public License for more details.
15 15
16 You should have received a copy of the GNU Library General Public License 16 You should have received a copy of the GNU Library General Public License
17 along with this library; see the file COPYING.LIB. If not, write to 17 along with this library; see the file COPYING.LIB. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. 19 Boston, MA 02111-1307, USA.
20*/ 20*/
21 21
22#include <qdatetime.h> 22#include <qdatetime.h>
23#include <qstring.h> 23#include <qstring.h>
24#include <qapplication.h> 24#include <qapplication.h>
25#include <qptrlist.h> 25#include <qptrlist.h>
26#include <qregexp.h> 26#include <qregexp.h>
27#include <qmessagebox.h> 27#include <qmessagebox.h>
28#include <qclipboard.h> 28#include <qclipboard.h>
29#include <qfile.h> 29#include <qfile.h>
30#include <qtextstream.h> 30#include <qtextstream.h>
31#include <qtextcodec.h> 31#include <qtextcodec.h>
32#include <qxml.h> 32#include <qxml.h>
33#include <qlabel.h> 33#include <qlabel.h>
34 34
35#include <kdebug.h> 35#include <kdebug.h>
36#include <klocale.h> 36#include <klocale.h>
37#include <kglobal.h> 37#include <kglobal.h>
38#include <kmessagebox.h>
38 39
39#include "calendar.h" 40#include "calendar.h"
40#include "alarm.h" 41#include "alarm.h"
41#include "recurrence.h" 42#include "recurrence.h"
42#include "calendarlocal.h" 43#include "calendarlocal.h"
43 44
44#include "phoneformat.h" 45#include "phoneformat.h"
45#include "syncdefines.h" 46#include "syncdefines.h"
46 47
47using namespace KCal; 48using namespace KCal;
48class PhoneParser : public QObject 49class PhoneParser : public QObject
49{ 50{
50public: 51public:
51 PhoneParser( ) { 52 PhoneParser( ) {
52 ; 53 ;
53 } 54 }
54 55
55 static QString dtToString( const QDateTime& dti, bool useTZ = false ) 56 static QString dtToString( const QDateTime& dti, bool useTZ = false )
56 { 57 {
57 QString datestr; 58 QString datestr;
58 QString timestr; 59 QString timestr;
59 int offset = KGlobal::locale()->localTimeOffset( dti ); 60 int offset = KGlobal::locale()->localTimeOffset( dti );
60 QDateTime dt; 61 QDateTime dt;
61 if (useTZ) 62 if (useTZ)
62 dt = dti.addSecs ( -(offset*60)); 63 dt = dti.addSecs ( -(offset*60));
63 else 64 else
64 dt = dti; 65 dt = dti;
65 if(dt.date().isValid()){ 66 if(dt.date().isValid()){
66 const QDate& date = dt.date(); 67 const QDate& date = dt.date();
67 datestr.sprintf("%04d%02d%02d", 68 datestr.sprintf("%04d%02d%02d",
68 date.year(), date.month(), date.day()); 69 date.year(), date.month(), date.day());
69 } 70 }
70 if(dt.time().isValid()){ 71 if(dt.time().isValid()){
71 const QTime& time = dt.time(); 72 const QTime& time = dt.time();
72 timestr.sprintf("T%02d%02d%02d", 73 timestr.sprintf("T%02d%02d%02d",
73 time.hour(), time.minute(), time.second()); 74 time.hour(), time.minute(), time.second());
74 } 75 }
75 return datestr + timestr; 76 return datestr + timestr;
76 } 77 }
77 78
78 79
79}; 80};
80 81
81 82
82 83
83PhoneFormat::PhoneFormat(QString profileName, QString device,QString connection, QString model ) 84PhoneFormat::PhoneFormat(QString profileName, QString device,QString connection, QString model )
84{ 85{
85 mProfileName = profileName; 86 mProfileName = profileName;
86 mDevice = device; 87 mDevice = device;
87 mConnection = connection; 88 mConnection = connection;
88 mModel = model; 89 mModel = model;
89} 90}
90 91
91PhoneFormat::~PhoneFormat() 92PhoneFormat::~PhoneFormat()
92{ 93{
93} 94}
94#if 0 95#if 0
95int PhoneFormat::initDevice(GSM_StateMachine *s) 96int PhoneFormat::initDevice(GSM_StateMachine *s)
96{ 97{
97 GSM_ReadConfig(NULL, &s->Config[0], 0); 98 GSM_ReadConfig(NULL, &s->Config[0], 0);
98 s->ConfigNum = 1; 99 s->ConfigNum = 1;
99 GSM_Config *cfg = &s->Config[0]; 100 GSM_Config *cfg = &s->Config[0];
100 if ( ! mConnection.isEmpty() ) { 101 if ( ! mConnection.isEmpty() ) {
101 cfg->Connection = strdup(mConnection.latin1()); 102 cfg->Connection = strdup(mConnection.latin1());
102 cfg->DefaultConnection = false; 103 cfg->DefaultConnection = false;
103 qDebug("Connection set %s ", cfg->Connection ); 104 qDebug("Connection set %s ", cfg->Connection );
104 105
105 } 106 }
106 if ( ! mDevice.isEmpty() ) { 107 if ( ! mDevice.isEmpty() ) {
107 cfg->Device = strdup(mDevice.latin1()); 108 cfg->Device = strdup(mDevice.latin1());
108 cfg->DefaultDevice = false; 109 cfg->DefaultDevice = false;
109 qDebug("Device set %s ", cfg->Device); 110 qDebug("Device set %s ", cfg->Device);
110 111
111 } 112 }
112 if ( ! mModel.isEmpty() ) { 113 if ( ! mModel.isEmpty() ) {
113 strcpy(cfg->Model,mModel.latin1() ); 114 strcpy(cfg->Model,mModel.latin1() );
114 cfg->DefaultModel = false; 115 cfg->DefaultModel = false;
115 qDebug("Model set %s ",cfg->Model ); 116 qDebug("Model set %s ",cfg->Model );
116 } 117 }
117 int error=GSM_InitConnection(s,3); 118 int error=GSM_InitConnection(s,3);
118 return error; 119 return error;
119} 120}
120#endif 121#endif
121ulong PhoneFormat::getCsumTodo( Todo* todo ) 122ulong PhoneFormat::getCsumTodo( Todo* todo )
122{ 123{
123 QStringList attList; 124 QStringList attList;
124 if ( todo->hasDueDate() ) 125 if ( todo->hasDueDate() )
125 attList << PhoneParser::dtToString ( todo->dtDue() ); 126 attList << PhoneParser::dtToString ( todo->dtDue() );
126 attList << todo->summary(); 127 attList << todo->summary();
127 QString completedString = "no"; 128 QString completedString = "no";
128 if ( todo->isCompleted() ) 129 if ( todo->isCompleted() )
129 completedString = "yes"; 130 completedString = "yes";
130 attList << completedString; 131 attList << completedString;
131 attList << QString::number( todo->priority() ); 132 attList << QString::number( todo->priority() );
132 QString alarmString = "na"; 133 QString alarmString = "na";
133 Alarm *alarm; 134 Alarm *alarm;
134 if ( todo->alarms().count() > 0 ) { 135 if ( todo->alarms().count() > 0 ) {
135 alarm = todo->alarms().first(); 136 alarm = todo->alarms().first();
136 if ( alarm->enabled() ) { 137 if ( alarm->enabled() ) {
137 alarmString = QString::number(alarm->startOffset().asSeconds() ); 138 alarmString = QString::number(alarm->startOffset().asSeconds() );
138 } 139 }
139 } 140 }
140 attList << alarmString; 141 attList << alarmString;
141 attList << todo->categoriesStr(); 142 attList << todo->categoriesStr();
142 attList << todo->secrecyStr(); 143 attList << todo->secrecyStr();
143 return PhoneFormat::getCsum(attList ); 144 return PhoneFormat::getCsum(attList );
144 145
145} 146}
146ulong PhoneFormat::getCsumEvent( Event* event ) 147ulong PhoneFormat::getCsumEvent( Event* event )
147{ 148{
148 QStringList attList; 149 QStringList attList;
149 attList << PhoneParser::dtToString ( event->dtStart() ); 150 attList << PhoneParser::dtToString ( event->dtStart() );
150 attList << PhoneParser::dtToString ( event->dtEnd() ); 151 attList << PhoneParser::dtToString ( event->dtEnd() );
151 attList << event->summary(); 152 attList << event->summary();
152 attList << event->location(); 153 attList << event->location();
153 QString alarmString = "na"; 154 QString alarmString = "na";
154 Alarm *alarm; 155 Alarm *alarm;
155 if ( event->alarms().count() > 0 ) { 156 if ( event->alarms().count() > 0 ) {
156 alarm = event->alarms().first(); 157 alarm = event->alarms().first();
157 if ( alarm->enabled() ) { 158 if ( alarm->enabled() ) {
158 alarmString = QString::number( alarm->startOffset().asSeconds() ); 159 alarmString = QString::number( alarm->startOffset().asSeconds() );
159 } 160 }
160 } 161 }
161 attList << alarmString; 162 attList << alarmString;
162 Recurrence* rec = event->recurrence(); 163 Recurrence* rec = event->recurrence();
163 QStringList list; 164 QStringList list;
164 bool writeEndDate = false; 165 bool writeEndDate = false;
165 switch ( rec->doesRecur() ) 166 switch ( rec->doesRecur() )
166 { 167 {
167 case Recurrence::rDaily: // 0 168 case Recurrence::rDaily: // 0
168 list.append( "0" ); 169 list.append( "0" );
169 list.append( QString::number( rec->frequency() ));//12 170 list.append( QString::number( rec->frequency() ));//12
170 list.append( "0" ); 171 list.append( "0" );
171 list.append( "0" ); 172 list.append( "0" );
172 writeEndDate = true; 173 writeEndDate = true;
173 break; 174 break;
174 case Recurrence::rWeekly:// 1 175 case Recurrence::rWeekly:// 1
175 list.append( "1" ); 176 list.append( "1" );
176 list.append( QString::number( rec->frequency()) );//12 177 list.append( QString::number( rec->frequency()) );//12
177 list.append( "0" ); 178 list.append( "0" );
178 { 179 {
179 int days = 0; 180 int days = 0;
180 QBitArray weekDays = rec->days(); 181 QBitArray weekDays = rec->days();
181 int i; 182 int i;
182 for( i = 1; i <= 7; ++i ) { 183 for( i = 1; i <= 7; ++i ) {
183 if ( weekDays[i-1] ) { 184 if ( weekDays[i-1] ) {
184 days += 1 << (i-1); 185 days += 1 << (i-1);
185 } 186 }
186 } 187 }
187 list.append( QString::number( days ) ); 188 list.append( QString::number( days ) );
188 } 189 }
189 //pending weekdays 190 //pending weekdays
190 writeEndDate = true; 191 writeEndDate = true;
191 192
192 break; 193 break;
193 case Recurrence::rMonthlyPos:// 2 194 case Recurrence::rMonthlyPos:// 2
194 list.append( "2" ); 195 list.append( "2" );
195 list.append( QString::number( rec->frequency()) );//12 196 list.append( QString::number( rec->frequency()) );//12
196 197
197 writeEndDate = true; 198 writeEndDate = true;
198 { 199 {
199 int count = 1; 200 int count = 1;
200 QPtrList<Recurrence::rMonthPos> rmp; 201 QPtrList<Recurrence::rMonthPos> rmp;
201 rmp = rec->monthPositions(); 202 rmp = rec->monthPositions();
202 if ( rmp.first()->negative ) 203 if ( rmp.first()->negative )
203 count = 5 - rmp.first()->rPos - 1; 204 count = 5 - rmp.first()->rPos - 1;
204 else 205 else
205 count = rmp.first()->rPos - 1; 206 count = rmp.first()->rPos - 1;
206 list.append( QString::number( count ) ); 207 list.append( QString::number( count ) );
207 208
208 } 209 }
209 210
210 list.append( "0" ); 211 list.append( "0" );
211 break; 212 break;
212 case Recurrence::rMonthlyDay:// 3 213 case Recurrence::rMonthlyDay:// 3
213 list.append( "3" ); 214 list.append( "3" );
214 list.append( QString::number( rec->frequency()) );//12 215 list.append( QString::number( rec->frequency()) );//12
215 list.append( "0" ); 216 list.append( "0" );
216 list.append( "0" ); 217 list.append( "0" );
217 writeEndDate = true; 218 writeEndDate = true;
218 break; 219 break;
219 case Recurrence::rYearlyMonth://4 220 case Recurrence::rYearlyMonth://4
220 list.append( "4" ); 221 list.append( "4" );
221 list.append( QString::number( rec->frequency()) );//12 222 list.append( QString::number( rec->frequency()) );//12
222 list.append( "0" ); 223 list.append( "0" );
223 list.append( "0" ); 224 list.append( "0" );
224 writeEndDate = true; 225 writeEndDate = true;
225 break; 226 break;
226 227
227 default: 228 default:
228 list.append( "255" ); 229 list.append( "255" );
229 list.append( QString() ); 230 list.append( QString() );
230 list.append( "0" ); 231 list.append( "0" );
231 list.append( QString() ); 232 list.append( QString() );
232 list.append( "0" ); 233 list.append( "0" );
233 list.append( "20991231T000000" ); 234 list.append( "20991231T000000" );
234 break; 235 break;
235 } 236 }
236 if ( writeEndDate ) { 237 if ( writeEndDate ) {
237 238
238 if ( rec->endDate().isValid() ) { // 15 + 16 239 if ( rec->endDate().isValid() ) { // 15 + 16
239 list.append( "1" ); 240 list.append( "1" );
240 list.append( PhoneParser::dtToString( rec->endDate()) ); 241 list.append( PhoneParser::dtToString( rec->endDate()) );
241 } else { 242 } else {
242 list.append( "0" ); 243 list.append( "0" );
243 list.append( "20991231T000000" ); 244 list.append( "20991231T000000" );
244 } 245 }
245 246
246 } 247 }
247 attList << list.join(""); 248 attList << list.join("");
248 attList << event->categoriesStr(); 249 attList << event->categoriesStr();
250 //qDebug("csum cat %s", event->categoriesStr().latin1());
251
249 attList << event->secrecyStr(); 252 attList << event->secrecyStr();
250 return PhoneFormat::getCsum(attList ); 253 return PhoneFormat::getCsum(attList );
251} 254}
252ulong PhoneFormat::getCsum( const QStringList & attList) 255ulong PhoneFormat::getCsum( const QStringList & attList)
253{ 256{
254 int max = attList.count() -1; 257 int max = attList.count() -1;
255 ulong cSum = 0; 258 ulong cSum = 0;
256 int j,k,i; 259 int j,k,i;
257 int add; 260 int add;
258 for ( i = 1; i < max ; ++i ) { 261 for ( i = 1; i < max ; ++i ) {
259 QString s = attList[i]; 262 QString s = attList[i];
260 if ( ! s.isEmpty() ){ 263 if ( ! s.isEmpty() ){
261 j = s.length(); 264 j = s.length();
262 for ( k = 0; k < j; ++k ) { 265 for ( k = 0; k < j; ++k ) {
263 int mul = k +1; 266 int mul = k +1;
264 add = s[k].unicode (); 267 add = s[k].unicode ();
265 if ( k < 16 ) 268 if ( k < 16 )
266 mul = mul * mul; 269 mul = mul * mul;
267 add = add * mul *i*i*i; 270 add = add * mul *i*i*i;
268 cSum += add; 271 cSum += add;
269 } 272 }
270 } 273 }
271 } 274 }
275 //QString dump = attList.join(",");
276 //qDebug("csum: %s", dump.latin1());
277
272 return cSum; 278 return cSum;
273 279
274} 280}
275//extern "C" GSM_Error GSM_InitConnection(GSM_StateMachine *s, int ReplyNum); 281//extern "C" GSM_Error GSM_InitConnection(GSM_StateMachine *s, int ReplyNum);
276#include <stdlib.h> 282#include <stdlib.h>
277#define DEBUGMODE false 283#define DEBUGMODE false
278bool PhoneFormat::load( Calendar *calendar, Calendar *existingCal) 284bool PhoneFormat::load( Calendar *calendar, Calendar *existingCal)
279{ 285{
280 286
281 QString fileName; 287 QString fileName;
282#ifdef _WIN32_ 288#ifdef _WIN32_
283 fileName = locateLocal("data", "korganizer") + "\\tempfile.vcs"; 289 fileName = locateLocal("data", "korganizer") + "\\tempfile.vcs";
284#else 290#else
285 fileName = "/tmp/kdepimtemp.vcs"; 291 fileName = "/tmp/kdepimtemp.vcs";
286#endif 292#endif
287 QString command ="./kammu --backup " + fileName + " -yes -C" + 293 QString command ="./kammu --backup " + fileName + " -yes -C" +
288 mConnection +" -D" + mDevice +" -M" + mModel; 294 mConnection +" -D" + mDevice +" -M" + mModel;
289 int ret = system ( command.latin1() ); 295 int ret = system ( command.latin1() );
290 if ( ret != 0 ) 296 if ( ret != 0 ) {
297 qDebug("Error::command returned %d", ret);
291 return false; 298 return false;
299 }
300 qDebug("Command returned %d", ret);
292 VCalFormat vfload; 301 VCalFormat vfload;
293 vfload.setLocalTime ( true ); 302 vfload.setLocalTime ( true );
303 qDebug("loading file ...");
304
294 if ( ! vfload.load( calendar, fileName ) ) 305 if ( ! vfload.load( calendar, fileName ) )
295 return false; 306 return false;
296 QPtrList<Event> er = calendar->rawEvents(); 307 QPtrList<Event> er = calendar->rawEvents();
297 Event* ev = er.first(); 308 Event* ev = er.first();
309 qDebug("reading events... ");
298 while ( ev ) { 310 while ( ev ) {
311 QStringList cat = ev->categories();
312 if ( cat.contains( "MeetingDEF" )) {
313 ev->setCategories( QStringList() );
314 }
299 int id = ev->pilotId(); 315 int id = ev->pilotId();
300 Event *event; 316 Event *event;
301 event = existingCal->event( mProfileName ,QString::number( id ) ); 317 event = existingCal->event( mProfileName ,QString::number( id ) );
302 if ( event ) { 318 if ( event ) {
303 event = (Event*)event->clone(); 319 event = (Event*)event->clone();
304 copyEvent( event, ev ); 320 copyEvent( event, ev );
305 calendar->deleteEvent( ev ); 321 calendar->deleteEvent( ev );
306 calendar->addEvent( event); 322 calendar->addEvent( event);
307 } 323 }
308 else 324 else
309 event = ev; 325 event = ev;
310 uint cSum; 326 uint cSum;
311 cSum = PhoneFormat::getCsumEvent( event ); 327 cSum = PhoneFormat::getCsumEvent( event );
312 event->setCsum( mProfileName, QString::number( cSum )); 328 event->setCsum( mProfileName, QString::number( cSum ));
313 event->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL ); 329 event->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL );
314 event->setID( mProfileName,QString::number( id ) ); 330 event->setID( mProfileName,QString::number( id ) );
315 ev = er.next(); 331 ev = er.next();
316 } 332 }
317 { 333 {
334 qDebug("reading todos... ");
318 QPtrList<Todo> tr = calendar->rawTodos(); 335 QPtrList<Todo> tr = calendar->rawTodos();
319 Todo* ev = tr.first(); 336 Todo* ev = tr.first();
320 while ( ev ) { 337 while ( ev ) {
321 338
322 QStringList cat = ev->categories(); 339 QStringList cat = ev->categories();
323 if ( cat.contains( "MeetingDEF" )) { 340 if ( cat.contains( "MeetingDEF" )) {
324 ev->setCategories( QStringList() ); 341 ev->setCategories( QStringList() );
325 } 342 }
326 int id = ev->pilotId(); 343 int id = ev->pilotId();
327 Todo *event; 344 Todo *event;
328 event = existingCal->todo( mProfileName ,QString::number( id ) ); 345 event = existingCal->todo( mProfileName ,QString::number( id ) );
329 if ( event ) { 346 if ( event ) {
330 event = (Todo*)event->clone(); 347 event = (Todo*)event->clone();
331 copyTodo( event, ev ); 348 copyTodo( event, ev );
332 calendar->deleteTodo( ev ); 349 calendar->deleteTodo( ev );
333 calendar->addTodo( event); 350 calendar->addTodo( event);
334 } 351 }
335 else 352 else
336 event = ev; 353 event = ev;
337 uint cSum; 354 uint cSum;
338 cSum = PhoneFormat::getCsumTodo( event ); 355 cSum = PhoneFormat::getCsumTodo( event );
339 event->setCsum( mProfileName, QString::number( cSum )); 356 event->setCsum( mProfileName, QString::number( cSum ));
340 event->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL ); 357 event->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL );
341 event->setID( mProfileName,QString::number( id ) ); 358 event->setID( mProfileName,QString::number( id ) );
342 ev = tr.next(); 359 ev = tr.next();
343 } 360 }
344 } 361 }
345 return true; 362 return true;
346} 363}
347void PhoneFormat::copyEvent( Event* to, Event* from ) 364void PhoneFormat::copyEvent( Event* to, Event* from )
348{ 365{
349 if ( from->dtStart().isValid() ) 366 if ( from->dtStart().isValid() )
350 to->setDtStart( from->dtStart() ); 367 to->setDtStart( from->dtStart() );
351 if ( from->dtEnd().isValid() ) 368 if ( from->dtEnd().isValid() )
352 to->setDtEnd( from->dtEnd() ); 369 to->setDtEnd( from->dtEnd() );
353 if ( !from->location().isEmpty() ) 370 if ( !from->location().isEmpty() )
354 to->setLocation( from->location() ); 371 to->setLocation( from->location() );
355 if ( !from->description().isEmpty() ) 372 if ( !from->description().isEmpty() )
356 to->setDescription( from->description() ); 373 to->setDescription( from->description() );
357 if ( !from->summary().isEmpty() ) 374 if ( !from->summary().isEmpty() )
358 to->setSummary( from->summary() ); 375 to->setSummary( from->summary() );
359 376
360 QPtrListIterator<Alarm> it( from->alarms() ); 377 QPtrListIterator<Alarm> it( from->alarms() );
361 to->clearAlarms(); 378 to->clearAlarms();
362 const Alarm *a; 379 const Alarm *a;
363 while( (a = it.current()) ) { 380 while( (a = it.current()) ) {
364 Alarm *b = new Alarm( *a ); 381 Alarm *b = new Alarm( *a );
365 b->setParent( to ); 382 b->setParent( to );
366 to->addAlarm( b ); 383 to->addAlarm( b );
367 ++it; 384 ++it;
368 } 385 }
369 QStringList cat = to->categories(); 386 QStringList cat = to->categories();
370 QStringList catFrom = from->categories(); 387 QStringList catFrom = from->categories();
371 QString nCat; 388 QString nCat;
372 int iii; 389 int iii;
373 for ( iii = 0; iii < catFrom.count();++iii ) { 390 for ( iii = 0; iii < catFrom.count();++iii ) {
374 nCat = catFrom[iii]; 391 nCat = catFrom[iii];
375 if ( !nCat.isEmpty() ) 392 if ( !nCat.isEmpty() )
376 if ( !cat.contains( nCat )) { 393 if ( !cat.contains( nCat )) {
377 cat << nCat; 394 cat << nCat;
378 } 395 }
379 } 396 }
380 to->setCategories( cat ); 397 to->setCategories( cat );
381 Recurrence * r = new Recurrence( *from->recurrence(),to); 398 Recurrence * r = new Recurrence( *from->recurrence(),to);
382 to->setRecurrence( r ) ; 399 to->setRecurrence( r ) ;
383 400
384 401
385} 402}
386void PhoneFormat::copyTodo( Todo* to, Todo* from ) 403void PhoneFormat::copyTodo( Todo* to, Todo* from )
387{ 404{
388 if ( from->dtStart().isValid() ) 405 if ( from->dtStart().isValid() )
389 to->setDtStart( from->dtStart() ); 406 to->setDtStart( from->dtStart() );
390 if ( from->dtDue().isValid() ) 407 if ( from->dtDue().isValid() )
391 to->setDtDue( from->dtDue() ); 408 to->setDtDue( from->dtDue() );
392 if ( !from->location().isEmpty() ) 409 if ( !from->location().isEmpty() )
393 to->setLocation( from->location() ); 410 to->setLocation( from->location() );
394 if ( !from->description().isEmpty() ) 411 if ( !from->description().isEmpty() )
395 to->setDescription( from->description() ); 412 to->setDescription( from->description() );
396 if ( !from->summary().isEmpty() ) 413 if ( !from->summary().isEmpty() )
397 to->setSummary( from->summary() ); 414 to->setSummary( from->summary() );
398 415
399 QPtrListIterator<Alarm> it( from->alarms() ); 416 QPtrListIterator<Alarm> it( from->alarms() );
400 to->clearAlarms(); 417 to->clearAlarms();
401 const Alarm *a; 418 const Alarm *a;
402 while( (a = it.current()) ) { 419 while( (a = it.current()) ) {
403 Alarm *b = new Alarm( *a ); 420 Alarm *b = new Alarm( *a );
404 b->setParent( to ); 421 b->setParent( to );
405 to->addAlarm( b ); 422 to->addAlarm( b );
406 ++it; 423 ++it;
407 } 424 }
408 QStringList cat = to->categories(); 425 QStringList cat = to->categories();
409 QStringList catFrom = from->categories(); 426 QStringList catFrom = from->categories();
410 QString nCat; 427 QString nCat;
411 int iii; 428 int iii;
412 for ( iii = 0; iii < catFrom.count();++iii ) { 429 for ( iii = 0; iii < catFrom.count();++iii ) {
413 nCat = catFrom[iii]; 430 nCat = catFrom[iii];
414 if ( !nCat.isEmpty() ) 431 if ( !nCat.isEmpty() )
415 if ( !cat.contains( nCat )) { 432 if ( !cat.contains( nCat )) {
416 cat << nCat; 433 cat << nCat;
417 } 434 }
418 } 435 }
419 to->setCategories( cat ); 436 to->setCategories( cat );
420 if ( from->isCompleted() ) { 437 if ( from->isCompleted() ) {
421 to->setCompleted( true ); 438 to->setCompleted( true );
422 if( from->completed().isValid() ) 439 if( from->completed().isValid() )
423 to->setCompleted( from->completed() ); 440 to->setCompleted( from->completed() );
424 } else { 441 } else {
425 // set percentcomplete only, if to->isCompleted() 442 // set percentcomplete only, if to->isCompleted()
426 if ( to->isCompleted() ) 443 if ( to->isCompleted() )
427 to->setPercentComplete(from->percentComplete()); 444 to->setPercentComplete(from->percentComplete());
428 } 445 }
429 to->setPriority(from->priority()); 446 to->setPriority(from->priority());
430 447
431} 448}
432#include <qcstring.h> 449#include <qcstring.h>
433 450
434void PhoneFormat::afterSave( Incidence* inc) 451void PhoneFormat::afterSave( Incidence* inc)
435{ 452{
436 uint csum; 453 uint csum;
437 inc->removeID( mProfileName ); 454 inc->removeID( mProfileName );
438 if ( inc->type() == "Event") 455 if ( inc->type() == "Event")
439 csum = PhoneFormat::getCsumEvent( (Event*) inc ); 456 csum = PhoneFormat::getCsumEvent( (Event*) inc );
440 else 457 else
441 csum = PhoneFormat::getCsumTodo( (Todo*) inc ); 458 csum = PhoneFormat::getCsumTodo( (Todo*) inc );
442 inc->setCsum( mProfileName, QString::number( csum )); 459 inc->setCsum( mProfileName, QString::number( csum ));
443 inc->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID ); 460 inc->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID );
444 461
445} 462}
446bool PhoneFormat::save( Calendar *calendar) 463bool PhoneFormat::save( Calendar *calendar)
447{ 464{
448 QLabel status ( i18n(" Opening device ..."), 0 ); 465 QLabel status ( i18n(" Opening device ..."), 0 );
449 int w = status.sizeHint().width()+20 ; 466 int w = status.sizeHint().width()+20 ;
450 if ( w < 200 ) w = 230; 467 if ( w < 200 ) w = 230;
451 int h = status.sizeHint().height()+20 ; 468 int h = status.sizeHint().height()+20 ;
452 int dw = QApplication::desktop()->width(); 469 int dw = QApplication::desktop()->width();
453 int dh = QApplication::desktop()->height(); 470 int dh = QApplication::desktop()->height();
454 status.setCaption(i18n("Writing to phone...") ); 471 status.setCaption(i18n("Writing to phone...") );
455 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 472 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
456 status.show(); 473 status.show();
457 status.raise(); 474 status.raise();
458 qApp->processEvents(); 475 qApp->processEvents();
459 QString message; 476 QString message;
460#ifdef _WIN32_ 477#ifdef _WIN32_
461 QString fileName = locateLocal("data", "korganizer") + "\\tempfile.vcs"; 478 QString fileName = locateLocal("data", "korganizer") + "\\tempfile.vcs";
462#else 479#else
463 QString fileName = "/tmp/kdepimtemp.vcs"; 480 QString fileName = "/tmp/kdepimtemp.vcs";
464#endif 481#endif
465 482
466 // 1 remove events which should be deleted 483 // 1 remove events which should be deleted
467 QPtrList<Event> er = calendar->rawEvents(); 484 QPtrList<Event> er = calendar->rawEvents();
468 Event* ev = er.first(); 485 Event* ev = er.first();
469 while ( ev ) { 486 while ( ev ) {
470 if ( ev->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { 487 if ( ev->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) {
471 calendar->deleteEvent( ev ); 488 calendar->deleteEvent( ev );
472 } else { 489 } else {
473 490
474 } 491 }
475 ev = er.next(); 492 ev = er.next();
476 } 493 }
477 // 2 remove todos which should be deleted 494 // 2 remove todos which should be deleted
478 QPtrList<Todo> tl = calendar->rawTodos(); 495 QPtrList<Todo> tl = calendar->rawTodos();
479 Todo* to = tl.first(); 496 Todo* to = tl.first();
480 while ( to ) { 497 while ( to ) {
481 if ( to->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { 498 if ( to->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) {
482 calendar->deleteTodo( to ); 499 calendar->deleteTodo( to );
483 } 500 }
484 to = tl.next(); 501 to = tl.next();
485 } 502 }
486 // 3 save file 503 // 3 save file
487 VCalFormat vfsave; 504 VCalFormat vfsave;
488 vfsave.setLocalTime ( true ); 505 vfsave.setLocalTime ( true );
489 if ( ! vfsave.save( calendar, fileName ) ) 506 if ( ! vfsave.save( calendar, fileName ) )
490 return false; 507 return false;
491 // 4 call kammu 508 // 4 call kammu
492 QString command ="./kammu --restore " + fileName + " -C" + 509 QString command ="./kammu --restore " + fileName + " -C" +
493 mConnection +" -D" + mDevice +" -M" + mModel;; 510 mConnection +" -D" + mDevice +" -M" + mModel;
494 int ret = system ( command.latin1() ); 511 int ret;
495 if ( ret != 0 ) 512 while ( (ret = system ( command.latin1())) != 0 ) {
513 qDebug("Error S::command returned %d. asking users", ret);
514 int retval = KMessageBox::warningContinueCancel(0,
515 i18n("Error accessing device!\nPlease turn on connection\nand retry!"),i18n("KO/Pi phone sync"),i18n("Retry"),i18n("Cancel"));
516 if ( retval != KMessageBox::Continue )
517 return false;
518 }
519 if ( ret != 0 ) {
520 qDebug("Error S::command returned %d", ret);
496 return false; 521 return false;
522 }
497 // 5 reread data 523 // 5 reread data
498 message = i18n(" Rereading all data ... "); 524 message = i18n(" Rereading all data ... ");
499 status.setText ( message ); 525 status.setText ( message );
500 qApp->processEvents(); 526 qApp->processEvents();
501 CalendarLocal* calendarTemp = new CalendarLocal(); 527 CalendarLocal* calendarTemp = new CalendarLocal();
502 calendarTemp->setTimeZoneId( calendar->timeZoneId()); 528 calendarTemp->setTimeZoneId( calendar->timeZoneId());
503 if ( ! load( calendarTemp,calendar) ){ 529 if ( ! load( calendarTemp,calendar) ){
504 qDebug("error reloading calendar "); 530 qDebug("error reloading calendar ");
505 delete calendarTemp; 531 delete calendarTemp;
506 return false; 532 return false;
507 } 533 }
508 // 6 compare data 534 // 6 compare data
509 535
510//algo 6 compare event 536//algo 6 compare event
511 er = calendar->rawEvents(); 537 er = calendar->rawEvents();
512 ev = er.first(); 538 ev = er.first();
513 message = i18n(" Comparing event # "); 539 message = i18n(" Comparing event # ");
514 QPtrList<Event> er1 = calendarTemp->rawEvents(); 540 QPtrList<Event> er1 = calendarTemp->rawEvents();
515 Event* ev1; 541 Event* ev1;
516 int procCount = 0; 542 int procCount = 0;
517 while ( ev ) { 543 while ( ev ) {
518 qDebug("event new ID "); 544 //qDebug("event new ID %s",ev->summary().latin1());
519 status.setText ( message + QString::number ( ++procCount ) ); 545 status.setText ( message + QString::number ( ++procCount ) );
520 qApp->processEvents(); 546 qApp->processEvents();
521 QString cSum = ev->getCsum(mProfileName); 547 uint csum;
548 csum = PhoneFormat::getCsumEvent( ev );
549 QString cSum = QString::number( csum );
550 ev->setCsum( mProfileName, cSum );
551 //qDebug("Event cSum %s ", cSum.latin1());
522 ev1 = er1.first(); 552 ev1 = er1.first();
523 while ( ev1 ) { 553 while ( ev1 ) {
524 if ( ev1->getCsum( mProfileName ) == cSum ) { 554 if ( ev1->getCsum( mProfileName ) == cSum ) {
525 er1.remove( ev1 ); 555 er1.remove( ev1 );
526 afterSave( ev ); 556 afterSave( ev );
527 ev->setID(mProfileName, ev1->getID(mProfileName) ); 557 ev->setID(mProfileName, ev1->getID(mProfileName) );
558 //qDebug("Event found on phone for %s ", ev->summary().latin1());
559
528 break; 560 break;
529 } 561 }
530 ev1 = er1.next(); 562 ev1 = er1.next();
531 } 563 }
532 if ( ! ev1 ) { 564 if ( ! ev1 ) {
533 ev->removeID(mProfileName); 565 ev->removeID(mProfileName);
534 qDebug("ERROR: No event found on phone for %s ", ev->summary().latin1()); 566 qDebug("ERROR: No event found on phone for %s ", ev->summary().latin1());
535 } 567 }
536 568
537 569
538 ev = er.next(); 570 ev = er.next();
539 } 571 }
540 //algo 6 compare todo 572 //algo 6 compare todo
573 tl = calendar->rawTodos();
541 to = tl.first(); 574 to = tl.first();
542 procCount = 0; 575 procCount = 0;
543 QPtrList<Todo> tl1 = calendarTemp->rawTodos(); 576 QPtrList<Todo> tl1 = calendarTemp->rawTodos();
544 Todo* to1 ; 577 Todo* to1 ;
545 message = i18n(" Comparing todo # "); 578 message = i18n(" Comparing todo # ");
546 while ( to ) { 579 while ( to ) {
547 qDebug("todo2 %d ", procCount); 580 qDebug("todo2 %d ", procCount);
548 status.setText ( message + QString::number ( ++procCount ) ); 581 status.setText ( message + QString::number ( ++procCount ) );
549 qApp->processEvents(); 582 qApp->processEvents();
550 QString cSum = to->getCsum(mProfileName); 583 uint csum;
584 csum = PhoneFormat::getCsumTodo( to );
585 QString cSum = QString::number( csum );
586 to->setCsum( mProfileName, cSum );
587 qDebug("Todo cSum %s ", cSum.latin1());
551 Todo* to1 = tl1.first(); 588 Todo* to1 = tl1.first();
552 while ( to1 ) { 589 while ( to1 ) {
553 if ( to1->getCsum( mProfileName ) == cSum ) { 590 if ( to1->getCsum( mProfileName ) == cSum ) {
554 tl1.remove( to1 ); 591 tl1.remove( to1 );
555 afterSave( to ); 592 afterSave( to );
556 to->setID(mProfileName, to1->getID(mProfileName) ); 593 to->setID(mProfileName, to1->getID(mProfileName) );
557 break; 594 break;
558 } 595 }
559 to1 = tl1.next(); 596 to1 = tl1.next();
560 } 597 }
561 if ( ! to1 ) { 598 if ( ! to1 ) {
562 to->removeID(mProfileName); 599 to->removeID(mProfileName);
563 qDebug("ERROR: No todo found on phone for %s ", to->summary().latin1()); 600 qDebug("ERROR: No todo found on phone for %s ", to->summary().latin1());
564 } 601 }
565 602
566 to = tl.next(); 603 to = tl.next();
567 } 604 }
568 delete calendarTemp; 605 delete calendarTemp;
569 return true; 606 return true;
570 607
571 608
572 609
573} 610}
574 611
575 612
576QString PhoneFormat::toString( Calendar * ) 613QString PhoneFormat::toString( Calendar * )
577{ 614{
578 return QString::null; 615 return QString::null;
579} 616}
580bool PhoneFormat::fromString( Calendar *calendar, const QString & text) 617bool PhoneFormat::fromString( Calendar *calendar, const QString & text)
581{ 618{
582 return false; 619 return false;
583} 620}