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