summaryrefslogtreecommitdiffabout
authorzautrix <zautrix>2004-09-14 01:03:08 (UTC)
committer zautrix <zautrix>2004-09-14 01:03:08 (UTC)
commit30762fe125216362e1a6c1d5ec5d22d9525aa336 (patch) (unidiff)
tree4ff0fbf43efa921c86d64ff3f50baa9e59d207d9
parent8ce7eae438dcd20f9c79fc0a36dfef0a6d3931eb (diff)
downloadkdepimpi-30762fe125216362e1a6c1d5ec5d22d9525aa336.zip
kdepimpi-30762fe125216362e1a6c1d5ec5d22d9525aa336.tar.gz
kdepimpi-30762fe125216362e1a6c1d5ec5d22d9525aa336.tar.bz2
Many bugfixes
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--korganizer/calendarview.cpp16
-rw-r--r--libkcal/alarm.cpp36
-rw-r--r--libkcal/recurrence.cpp56
-rw-r--r--libkcal/sharpformat.cpp7
4 files changed, 94 insertions, 21 deletions
diff --git a/korganizer/calendarview.cpp b/korganizer/calendarview.cpp
index 258bd43..94cc97d 100644
--- a/korganizer/calendarview.cpp
+++ b/korganizer/calendarview.cpp
@@ -229,1391 +229,1397 @@ void CalendarView::init()
229{ 229{
230 beamDialog = new KOBeamPrefs(); 230 beamDialog = new KOBeamPrefs();
231 mDatePickerMode = 0; 231 mDatePickerMode = 0;
232 mCurrentSyncDevice = ""; 232 mCurrentSyncDevice = "";
233 writeLocale(); 233 writeLocale();
234 mViewManager = new KOViewManager( this ); 234 mViewManager = new KOViewManager( this );
235 mDialogManager = new KODialogManager( this ); 235 mDialogManager = new KODialogManager( this );
236 mEventViewerDialog = 0; 236 mEventViewerDialog = 0;
237 mModified = false; 237 mModified = false;
238 mReadOnly = false; 238 mReadOnly = false;
239 mSelectedIncidence = 0; 239 mSelectedIncidence = 0;
240 mCalPrinter = 0; 240 mCalPrinter = 0;
241 mFilters.setAutoDelete(true); 241 mFilters.setAutoDelete(true);
242 242
243 mCalendar->registerObserver( this ); 243 mCalendar->registerObserver( this );
244 // TODO: Make sure that view is updated, when calendar is changed. 244 // TODO: Make sure that view is updated, when calendar is changed.
245 245
246 mStorage = new FileStorage( mCalendar ); 246 mStorage = new FileStorage( mCalendar );
247 mNavigator = new DateNavigator( this, "datevav", mViewManager ); 247 mNavigator = new DateNavigator( this, "datevav", mViewManager );
248 248
249 QBoxLayout *topLayout = (QBoxLayout*)layout(); 249 QBoxLayout *topLayout = (QBoxLayout*)layout();
250#ifndef KORG_NOSPLITTER 250#ifndef KORG_NOSPLITTER
251 // create the main layout frames. 251 // create the main layout frames.
252 mPanner = new QSplitter(QSplitter::Horizontal,this,"CalendarView::Panner"); 252 mPanner = new QSplitter(QSplitter::Horizontal,this,"CalendarView::Panner");
253 topLayout->addWidget(mPanner); 253 topLayout->addWidget(mPanner);
254 254
255 mLeftSplitter = new QSplitter(QSplitter::Vertical,mPanner, 255 mLeftSplitter = new QSplitter(QSplitter::Vertical,mPanner,
256 "CalendarView::LeftFrame"); 256 "CalendarView::LeftFrame");
257 mPanner->setResizeMode(mLeftSplitter,QSplitter::KeepSize); 257 mPanner->setResizeMode(mLeftSplitter,QSplitter::KeepSize);
258 258
259 mDateNavigator = new KDateNavigator(mLeftSplitter, mCalendar, TRUE, 259 mDateNavigator = new KDateNavigator(mLeftSplitter, mCalendar, TRUE,
260 "CalendarView::DateNavigator", QDate::currentDate() ); 260 "CalendarView::DateNavigator", QDate::currentDate() );
261 mLeftSplitter->setResizeMode(mDateNavigator,QSplitter::KeepSize); 261 mLeftSplitter->setResizeMode(mDateNavigator,QSplitter::KeepSize);
262 mTodoList = new KOTodoView(mCalendar, mLeftSplitter, "todolist_small2"); 262 mTodoList = new KOTodoView(mCalendar, mLeftSplitter, "todolist_small2");
263 mFilterView = new KOFilterView(&mFilters,mLeftSplitter,"CalendarView::FilterView"); 263 mFilterView = new KOFilterView(&mFilters,mLeftSplitter,"CalendarView::FilterView");
264 264
265#ifdef KORG_NORESOURCEVIEW 265#ifdef KORG_NORESOURCEVIEW
266 mResourceView = 0; 266 mResourceView = 0;
267#else 267#else
268 if ( mResourceManager ) { 268 if ( mResourceManager ) {
269 mResourceView = new ResourceView( mResourceManager, mLeftSplitter ); 269 mResourceView = new ResourceView( mResourceManager, mLeftSplitter );
270 mResourceView->updateView(); 270 mResourceView->updateView();
271 connect( mResourceView, SIGNAL( resourcesChanged() ), 271 connect( mResourceView, SIGNAL( resourcesChanged() ),
272 SLOT( updateView() ) ); 272 SLOT( updateView() ) );
273 } else { 273 } else {
274 mResourceView = 0; 274 mResourceView = 0;
275 } 275 }
276#endif 276#endif
277 QWidget *rightBox = new QWidget( mPanner ); 277 QWidget *rightBox = new QWidget( mPanner );
278 QBoxLayout *rightLayout = new QVBoxLayout( rightBox ); 278 QBoxLayout *rightLayout = new QVBoxLayout( rightBox );
279 279
280 mNavigatorBar = new NavigatorBar( QDate::currentDate(), rightBox, "useBigPixmaps" ); 280 mNavigatorBar = new NavigatorBar( QDate::currentDate(), rightBox, "useBigPixmaps" );
281 rightLayout->addWidget( mNavigatorBar ); 281 rightLayout->addWidget( mNavigatorBar );
282 282
283 mRightFrame = new QWidgetStack( rightBox ); 283 mRightFrame = new QWidgetStack( rightBox );
284 rightLayout->addWidget( mRightFrame, 1 ); 284 rightLayout->addWidget( mRightFrame, 1 );
285 285
286 mLeftFrame = mLeftSplitter; 286 mLeftFrame = mLeftSplitter;
287#else 287#else
288 QWidget *mainBox = new QWidget( this ); 288 QWidget *mainBox = new QWidget( this );
289 QWidget *leftFrame = new QWidget( mainBox ); 289 QWidget *leftFrame = new QWidget( mainBox );
290 290
291 QBoxLayout * mainBoxLayout; 291 QBoxLayout * mainBoxLayout;
292 QBoxLayout * leftFrameLayout; 292 QBoxLayout * leftFrameLayout;
293 if ( KOPrefs::instance()->mVerticalScreen ) { 293 if ( KOPrefs::instance()->mVerticalScreen ) {
294 mainBoxLayout = new QVBoxLayout(mainBox); 294 mainBoxLayout = new QVBoxLayout(mainBox);
295 leftFrameLayout = new QHBoxLayout(leftFrame ); 295 leftFrameLayout = new QHBoxLayout(leftFrame );
296 } else { 296 } else {
297 mainBoxLayout = new QHBoxLayout(mainBox); 297 mainBoxLayout = new QHBoxLayout(mainBox);
298 leftFrameLayout = new QVBoxLayout(leftFrame ); 298 leftFrameLayout = new QVBoxLayout(leftFrame );
299 } 299 }
300 topLayout->addWidget( mainBox ); 300 topLayout->addWidget( mainBox );
301 mainBoxLayout->addWidget (leftFrame); 301 mainBoxLayout->addWidget (leftFrame);
302 mDateNavigator = new KDateNavigator(leftFrame, mCalendar, TRUE, 302 mDateNavigator = new KDateNavigator(leftFrame, mCalendar, TRUE,
303 "CalendarView::DateNavigator", QDate::currentDate()); 303 "CalendarView::DateNavigator", QDate::currentDate());
304 // mDateNavigator->blockSignals( true ); 304 // mDateNavigator->blockSignals( true );
305 leftFrameLayout->addWidget( mDateNavigator ); 305 leftFrameLayout->addWidget( mDateNavigator );
306 mFilterView = new KOFilterView(&mFilters,leftFrame,"CalendarView::FilterView"); 306 mFilterView = new KOFilterView(&mFilters,leftFrame,"CalendarView::FilterView");
307 mTodoList = new KOTodoView(mCalendar, leftFrame, "todolist"); 307 mTodoList = new KOTodoView(mCalendar, leftFrame, "todolist");
308 308
309 if ( QApplication::desktop()->width() < 480 ) { 309 if ( QApplication::desktop()->width() < 480 ) {
310 leftFrameLayout->addWidget(mFilterView); 310 leftFrameLayout->addWidget(mFilterView);
311 leftFrameLayout->addWidget(mTodoList, 2 ); 311 leftFrameLayout->addWidget(mTodoList, 2 );
312 312
313 } else { 313 } else {
314 leftFrameLayout->addWidget(mTodoList,2 ); 314 leftFrameLayout->addWidget(mTodoList,2 );
315 leftFrameLayout->addWidget(mFilterView ); 315 leftFrameLayout->addWidget(mFilterView );
316 } 316 }
317 mFilterView->hide(); 317 mFilterView->hide();
318 QWidget *rightBox = new QWidget( mainBox ); 318 QWidget *rightBox = new QWidget( mainBox );
319 mainBoxLayout->addWidget ( rightBox, 10 ); 319 mainBoxLayout->addWidget ( rightBox, 10 );
320 QBoxLayout *rightLayout = new QVBoxLayout( rightBox ); 320 QBoxLayout *rightLayout = new QVBoxLayout( rightBox );
321 mNavigatorBar = new NavigatorBar( QDate::currentDate(), rightBox, "useBigPixmaps" ); 321 mNavigatorBar = new NavigatorBar( QDate::currentDate(), rightBox, "useBigPixmaps" );
322 mRightFrame = new QWidgetStack( rightBox ); 322 mRightFrame = new QWidgetStack( rightBox );
323 rightLayout->addWidget( mNavigatorBar ); 323 rightLayout->addWidget( mNavigatorBar );
324 rightLayout->addWidget( mRightFrame, 10 ); 324 rightLayout->addWidget( mRightFrame, 10 );
325 325
326 mLeftFrame = leftFrame; 326 mLeftFrame = leftFrame;
327 if ( KOPrefs::instance()->mVerticalScreen ) { 327 if ( KOPrefs::instance()->mVerticalScreen ) {
328 mTodoList->setFixedHeight( mDateNavigator->sizeHint().height() ); 328 mTodoList->setFixedHeight( mDateNavigator->sizeHint().height() );
329 leftFrame->setFixedHeight( mDateNavigator->sizeHint().height() ); 329 leftFrame->setFixedHeight( mDateNavigator->sizeHint().height() );
330 } else { 330 } else {
331 mTodoList->setFixedWidth( mDateNavigator->sizeHint().width() ); 331 mTodoList->setFixedWidth( mDateNavigator->sizeHint().width() );
332 leftFrame->setFixedWidth( mDateNavigator->sizeHint().width() ); 332 leftFrame->setFixedWidth( mDateNavigator->sizeHint().width() );
333 } 333 }
334 334
335 //qDebug("Calendarview Size %d %d ", width(), height()); 335 //qDebug("Calendarview Size %d %d ", width(), height());
336#endif 336#endif
337 337
338 connect( mNavigator, SIGNAL( datesSelected( const KCal::DateList & ) ), 338 connect( mNavigator, SIGNAL( datesSelected( const KCal::DateList & ) ),
339 SLOT( showDates( const KCal::DateList & ) ) ); 339 SLOT( showDates( const KCal::DateList & ) ) );
340 connect( mNavigator, SIGNAL( datesSelected( const KCal::DateList & ) ), 340 connect( mNavigator, SIGNAL( datesSelected( const KCal::DateList & ) ),
341 mDateNavigator, SLOT( selectDates( const KCal::DateList & ) ) ); 341 mDateNavigator, SLOT( selectDates( const KCal::DateList & ) ) );
342 342
343 connect( mNavigatorBar, SIGNAL( goPrevYear() ), 343 connect( mNavigatorBar, SIGNAL( goPrevYear() ),
344 mNavigator, SLOT( selectPreviousYear() ) ); 344 mNavigator, SLOT( selectPreviousYear() ) );
345 connect( mNavigatorBar, SIGNAL( goNextYear() ), 345 connect( mNavigatorBar, SIGNAL( goNextYear() ),
346 mNavigator, SLOT( selectNextYear() ) ); 346 mNavigator, SLOT( selectNextYear() ) );
347 connect( mNavigatorBar, SIGNAL( goPrevMonth() ), 347 connect( mNavigatorBar, SIGNAL( goPrevMonth() ),
348 mNavigator, SLOT( selectPreviousMonth() ) ); 348 mNavigator, SLOT( selectPreviousMonth() ) );
349 connect( mNavigatorBar, SIGNAL( goNextMonth() ), 349 connect( mNavigatorBar, SIGNAL( goNextMonth() ),
350 mNavigator, SLOT( selectNextMonth() ) ); 350 mNavigator, SLOT( selectNextMonth() ) );
351 351
352 connect( mNavigator, SIGNAL( datesSelected( const KCal::DateList & ) ), 352 connect( mNavigator, SIGNAL( datesSelected( const KCal::DateList & ) ),
353 mNavigatorBar, SLOT( selectDates( const KCal::DateList & ) ) ); 353 mNavigatorBar, SLOT( selectDates( const KCal::DateList & ) ) );
354 354
355 connect( mDateNavigator, SIGNAL( weekClicked( const QDate & ) ), 355 connect( mDateNavigator, SIGNAL( weekClicked( const QDate & ) ),
356 mNavigator, SLOT( selectWeek( const QDate & ) ) ); 356 mNavigator, SLOT( selectWeek( const QDate & ) ) );
357 357
358 connect( mDateNavigator, SIGNAL( goPrevYear() ), 358 connect( mDateNavigator, SIGNAL( goPrevYear() ),
359 mNavigator, SLOT( selectPreviousYear() ) ); 359 mNavigator, SLOT( selectPreviousYear() ) );
360 connect( mDateNavigator, SIGNAL( goNextYear() ), 360 connect( mDateNavigator, SIGNAL( goNextYear() ),
361 mNavigator, SLOT( selectNextYear() ) ); 361 mNavigator, SLOT( selectNextYear() ) );
362 connect( mDateNavigator, SIGNAL( goPrevMonth() ), 362 connect( mDateNavigator, SIGNAL( goPrevMonth() ),
363 mNavigator, SLOT( selectPreviousMonth() ) ); 363 mNavigator, SLOT( selectPreviousMonth() ) );
364 connect( mDateNavigator, SIGNAL( goNextMonth() ), 364 connect( mDateNavigator, SIGNAL( goNextMonth() ),
365 mNavigator, SLOT( selectNextMonth() ) ); 365 mNavigator, SLOT( selectNextMonth() ) );
366 366
367 connect( mDateNavigator, SIGNAL( goPrevious() ), 367 connect( mDateNavigator, SIGNAL( goPrevious() ),
368 mNavigator, SLOT( selectPrevious() ) ); 368 mNavigator, SLOT( selectPrevious() ) );
369 connect( mDateNavigator, SIGNAL( goNext() ), 369 connect( mDateNavigator, SIGNAL( goNext() ),
370 mNavigator, SLOT( selectNext() ) ); 370 mNavigator, SLOT( selectNext() ) );
371 connect( mDateNavigator, SIGNAL( monthSelected ( int ) ), 371 connect( mDateNavigator, SIGNAL( monthSelected ( int ) ),
372 mNavigator, SLOT( slotMonthSelect( int ) ) ); 372 mNavigator, SLOT( slotMonthSelect( int ) ) );
373 connect( mNavigatorBar, SIGNAL( monthSelected ( int ) ), 373 connect( mNavigatorBar, SIGNAL( monthSelected ( int ) ),
374 mNavigator, SLOT( slotMonthSelect( int ) ) ); 374 mNavigator, SLOT( slotMonthSelect( int ) ) );
375 375
376 connect( mDateNavigator, SIGNAL( datesSelected( const KCal::DateList & ) ), 376 connect( mDateNavigator, SIGNAL( datesSelected( const KCal::DateList & ) ),
377 mNavigator, SLOT( selectDates( const KCal::DateList & ) ) ); 377 mNavigator, SLOT( selectDates( const KCal::DateList & ) ) );
378 378
379 connect( mDateNavigator, SIGNAL( eventDropped( Event * ) ), 379 connect( mDateNavigator, SIGNAL( eventDropped( Event * ) ),
380 SLOT( eventAdded( Event *) ) ); 380 SLOT( eventAdded( Event *) ) );
381 381
382 connect(mDateNavigator,SIGNAL(dayPassed(QDate)),SLOT(updateView())); 382 connect(mDateNavigator,SIGNAL(dayPassed(QDate)),SLOT(updateView()));
383 383
384 connect( this, SIGNAL( configChanged() ), 384 connect( this, SIGNAL( configChanged() ),
385 mDateNavigator, SLOT( updateConfig() ) ); 385 mDateNavigator, SLOT( updateConfig() ) );
386 386
387 connect( mTodoList, SIGNAL( newTodoSignal() ), 387 connect( mTodoList, SIGNAL( newTodoSignal() ),
388 SLOT( newTodo() ) ); 388 SLOT( newTodo() ) );
389 connect( mTodoList, SIGNAL( newSubTodoSignal( Todo *) ), 389 connect( mTodoList, SIGNAL( newSubTodoSignal( Todo *) ),
390 SLOT( newSubTodo( Todo * ) ) ); 390 SLOT( newSubTodo( Todo * ) ) );
391 connect( mTodoList, SIGNAL( editTodoSignal( Todo * ) ), 391 connect( mTodoList, SIGNAL( editTodoSignal( Todo * ) ),
392 SLOT( editTodo( Todo * ) ) ); 392 SLOT( editTodo( Todo * ) ) );
393 connect( mTodoList, SIGNAL( showTodoSignal( Todo * ) ), 393 connect( mTodoList, SIGNAL( showTodoSignal( Todo * ) ),
394 SLOT( showTodo( Todo *) ) ); 394 SLOT( showTodo( Todo *) ) );
395 connect( mTodoList, SIGNAL( deleteTodoSignal( Todo *) ), 395 connect( mTodoList, SIGNAL( deleteTodoSignal( Todo *) ),
396 SLOT( deleteTodo( Todo *) ) ); 396 SLOT( deleteTodo( Todo *) ) );
397 connect( this, SIGNAL( configChanged()), mTodoList, SLOT( updateConfig() ) ); 397 connect( this, SIGNAL( configChanged()), mTodoList, SLOT( updateConfig() ) );
398 connect( mTodoList, SIGNAL( purgeCompletedSignal() ), 398 connect( mTodoList, SIGNAL( purgeCompletedSignal() ),
399 SLOT( purgeCompleted() ) ); 399 SLOT( purgeCompleted() ) );
400 connect( mTodoList, SIGNAL( todoModifiedSignal( Todo *, int ) ), 400 connect( mTodoList, SIGNAL( todoModifiedSignal( Todo *, int ) ),
401 SIGNAL( todoModified( Todo *, int ) ) ); 401 SIGNAL( todoModified( Todo *, int ) ) );
402 402
403 connect( mTodoList, SIGNAL( cloneTodoSignal( Incidence * ) ), 403 connect( mTodoList, SIGNAL( cloneTodoSignal( Incidence * ) ),
404 this, SLOT ( cloneIncidence( Incidence * ) ) ); 404 this, SLOT ( cloneIncidence( Incidence * ) ) );
405 connect( mTodoList, SIGNAL( cancelTodoSignal( Incidence * ) ), 405 connect( mTodoList, SIGNAL( cancelTodoSignal( Incidence * ) ),
406 this, SLOT (cancelIncidence( Incidence * ) ) ); 406 this, SLOT (cancelIncidence( Incidence * ) ) );
407 407
408 connect( mTodoList, SIGNAL( moveTodoSignal( Incidence * ) ), 408 connect( mTodoList, SIGNAL( moveTodoSignal( Incidence * ) ),
409 this, SLOT ( moveIncidence( Incidence * ) ) ); 409 this, SLOT ( moveIncidence( Incidence * ) ) );
410 connect( mTodoList, SIGNAL( beamTodoSignal( Incidence * ) ), 410 connect( mTodoList, SIGNAL( beamTodoSignal( Incidence * ) ),
411 this, SLOT ( beamIncidence( Incidence * ) ) ); 411 this, SLOT ( beamIncidence( Incidence * ) ) );
412 412
413 connect( mTodoList, SIGNAL( unparentTodoSignal( Todo * ) ), 413 connect( mTodoList, SIGNAL( unparentTodoSignal( Todo * ) ),
414 this, SLOT ( todo_unsub( Todo * ) ) ); 414 this, SLOT ( todo_unsub( Todo * ) ) );
415 415
416 connect( this, SIGNAL( todoModified( Todo *, int )), mTodoList, 416 connect( this, SIGNAL( todoModified( Todo *, int )), mTodoList,
417 SLOT( updateTodo( Todo *, int ) ) ); 417 SLOT( updateTodo( Todo *, int ) ) );
418 connect( this, SIGNAL( todoModified( Todo *, int )), this, 418 connect( this, SIGNAL( todoModified( Todo *, int )), this,
419 SLOT( changeTodoDisplay( Todo *, int ) ) ); 419 SLOT( changeTodoDisplay( Todo *, int ) ) );
420 420
421 421
422 connect( mFilterView, SIGNAL( filterChanged() ), SLOT( updateFilter() ) ); 422 connect( mFilterView, SIGNAL( filterChanged() ), SLOT( updateFilter() ) );
423 connect( mFilterView, SIGNAL( editFilters() ), SLOT( editFilters() ) ); 423 connect( mFilterView, SIGNAL( editFilters() ), SLOT( editFilters() ) );
424 connect( mCalendar, SIGNAL( addAlarm(const QDateTime &, const QString & ) ), SLOT( addAlarm(const QDateTime &, const QString & ) ) ); 424 connect( mCalendar, SIGNAL( addAlarm(const QDateTime &, const QString & ) ), SLOT( addAlarm(const QDateTime &, const QString & ) ) );
425 connect( mCalendar, SIGNAL( removeAlarm(const QDateTime &, const QString & ) ), SLOT( removeAlarm(const QDateTime &, const QString & ) ) ); 425 connect( mCalendar, SIGNAL( removeAlarm(const QDateTime &, const QString & ) ), SLOT( removeAlarm(const QDateTime &, const QString & ) ) );
426 426
427 427
428 428
429 429
430 430
431 connect(QApplication::clipboard(),SIGNAL(dataChanged()), 431 connect(QApplication::clipboard(),SIGNAL(dataChanged()),
432 SLOT(checkClipboard())); 432 SLOT(checkClipboard()));
433 connect( mTodoList,SIGNAL( incidenceSelected( Incidence * ) ), 433 connect( mTodoList,SIGNAL( incidenceSelected( Incidence * ) ),
434 SLOT( processTodoListSelection( Incidence * ) ) ); 434 SLOT( processTodoListSelection( Incidence * ) ) );
435 connect(mTodoList,SIGNAL(isModified(bool)),SLOT(setModified(bool))); 435 connect(mTodoList,SIGNAL(isModified(bool)),SLOT(setModified(bool)));
436 436
437 // kdDebug() << "CalendarView::CalendarView() done" << endl; 437 // kdDebug() << "CalendarView::CalendarView() done" << endl;
438 438
439 mDateFrame = new QVBox(0,0,WType_Popup); 439 mDateFrame = new QVBox(0,0,WType_Popup);
440 //mDateFrame->setFrameStyle(QFrame::PopupPanel | QFrame::Raised); 440 //mDateFrame->setFrameStyle(QFrame::PopupPanel | QFrame::Raised);
441 mDateFrame->setFrameStyle( QFrame::WinPanel |QFrame::Raised ); 441 mDateFrame->setFrameStyle( QFrame::WinPanel |QFrame::Raised );
442 mDateFrame->setLineWidth(3); 442 mDateFrame->setLineWidth(3);
443 mDateFrame->hide(); 443 mDateFrame->hide();
444 mDateFrame->setCaption( i18n( "Pick a date to display")); 444 mDateFrame->setCaption( i18n( "Pick a date to display"));
445 mDatePicker = new KDatePicker ( mDateFrame , QDate::currentDate() ); 445 mDatePicker = new KDatePicker ( mDateFrame , QDate::currentDate() );
446 446
447 connect(mDatePicker,SIGNAL(dateSelected(QDate)),SLOT(slotSelectPickerDate(QDate))); 447 connect(mDatePicker,SIGNAL(dateSelected(QDate)),SLOT(slotSelectPickerDate(QDate)));
448 448
449 mEventEditor = mDialogManager->getEventEditor(); 449 mEventEditor = mDialogManager->getEventEditor();
450 mTodoEditor = mDialogManager->getTodoEditor(); 450 mTodoEditor = mDialogManager->getTodoEditor();
451 451
452 mFlagEditDescription = false; 452 mFlagEditDescription = false;
453 453
454 mSuspendTimer = new QTimer( this ); 454 mSuspendTimer = new QTimer( this );
455 mAlarmTimer = new QTimer( this ); 455 mAlarmTimer = new QTimer( this );
456 mRecheckAlarmTimer = new QTimer( this ); 456 mRecheckAlarmTimer = new QTimer( this );
457 connect( mRecheckAlarmTimer, SIGNAL( timeout () ), SLOT( recheckTimerAlarm() ) ); 457 connect( mRecheckAlarmTimer, SIGNAL( timeout () ), SLOT( recheckTimerAlarm() ) );
458 connect( mSuspendTimer, SIGNAL( timeout () ), SLOT( suspendAlarm() ) ); 458 connect( mSuspendTimer, SIGNAL( timeout () ), SLOT( suspendAlarm() ) );
459 connect( mAlarmTimer, SIGNAL( timeout () ), SLOT( timerAlarm() ) ); 459 connect( mAlarmTimer, SIGNAL( timeout () ), SLOT( timerAlarm() ) );
460 mAlarmDialog = new AlarmDialog( this ); 460 mAlarmDialog = new AlarmDialog( this );
461 connect( mAlarmDialog, SIGNAL( addAlarm(const QDateTime &, const QString & ) ), SLOT( addSuspendAlarm(const QDateTime &, const QString & ) ) ); 461 connect( mAlarmDialog, SIGNAL( addAlarm(const QDateTime &, const QString & ) ), SLOT( addSuspendAlarm(const QDateTime &, const QString & ) ) );
462 mAlarmDialog->setServerNotification( false ); 462 mAlarmDialog->setServerNotification( false );
463 mAlarmDialog->setSuspendTime( KOPrefs::instance()->mAlarmSuspendTime ); 463 mAlarmDialog->setSuspendTime( KOPrefs::instance()->mAlarmSuspendTime );
464} 464}
465 465
466 466
467CalendarView::~CalendarView() 467CalendarView::~CalendarView()
468{ 468{
469 // kdDebug() << "~CalendarView()" << endl; 469 // kdDebug() << "~CalendarView()" << endl;
470 //qDebug("CalendarView::~CalendarView() "); 470 //qDebug("CalendarView::~CalendarView() ");
471 delete mDialogManager; 471 delete mDialogManager;
472 delete mViewManager; 472 delete mViewManager;
473 delete mStorage; 473 delete mStorage;
474 delete mDateFrame ; 474 delete mDateFrame ;
475 delete beamDialog; 475 delete beamDialog;
476 //kdDebug() << "~CalendarView() done" << endl; 476 //kdDebug() << "~CalendarView() done" << endl;
477} 477}
478void CalendarView::timerAlarm() 478void CalendarView::timerAlarm()
479{ 479{
480 //qDebug("CalendarView::timerAlarm() "); 480 //qDebug("CalendarView::timerAlarm() ");
481 computeAlarm(mAlarmNotification ); 481 computeAlarm(mAlarmNotification );
482} 482}
483 483
484void CalendarView::suspendAlarm() 484void CalendarView::suspendAlarm()
485{ 485{
486 //qDebug(" CalendarView::suspendAlarm() "); 486 //qDebug(" CalendarView::suspendAlarm() ");
487 computeAlarm(mSuspendAlarmNotification ); 487 computeAlarm(mSuspendAlarmNotification );
488 488
489} 489}
490 490
491void CalendarView::startAlarm( QString mess , QString filename) 491void CalendarView::startAlarm( QString mess , QString filename)
492{ 492{
493 mAlarmDialog->eventNotification( mess, KOPrefs::instance()->mAlarmPlayBeeps, filename, true,KOPrefs::instance()->mAlarmBeepInterval ,KOPrefs::instance()->mAlarmSuspendCount ); 493 mAlarmDialog->eventNotification( mess, KOPrefs::instance()->mAlarmPlayBeeps, filename, true,KOPrefs::instance()->mAlarmBeepInterval ,KOPrefs::instance()->mAlarmSuspendCount );
494 QTimer::singleShot( 3000, this, SLOT( checkNextTimerAlarm() ) ); 494 QTimer::singleShot( 3000, this, SLOT( checkNextTimerAlarm() ) );
495 495
496} 496}
497 497
498void CalendarView::checkNextTimerAlarm() 498void CalendarView::checkNextTimerAlarm()
499{ 499{
500 mCalendar->checkAlarmForIncidence( 0, true ); 500 mCalendar->checkAlarmForIncidence( 0, true );
501} 501}
502 502
503void CalendarView::computeAlarm( QString msg ) 503void CalendarView::computeAlarm( QString msg )
504{ 504{
505 505
506 QString mess = msg; 506 QString mess = msg;
507 QString mAlarmMessage = mess.mid( 9 ); 507 QString mAlarmMessage = mess.mid( 9 );
508 QString filename = MainWindow::resourcePath(); 508 QString filename = MainWindow::resourcePath();
509 filename += "koalarm.wav"; 509 filename += "koalarm.wav";
510 QString tempfilename; 510 QString tempfilename;
511 if ( mess.left( 13 ) == "suspend_alarm") { 511 if ( mess.left( 13 ) == "suspend_alarm") {
512 bool error = false; 512 bool error = false;
513 int len = mess.mid( 13 ).find("+++"); 513 int len = mess.mid( 13 ).find("+++");
514 if ( len < 2 ) 514 if ( len < 2 )
515 error = true; 515 error = true;
516 else { 516 else {
517 tempfilename = mess.mid( 13, len ); 517 tempfilename = mess.mid( 13, len );
518 if ( !QFile::exists( tempfilename ) ) 518 if ( !QFile::exists( tempfilename ) )
519 error = true; 519 error = true;
520 } 520 }
521 if ( ! error ) { 521 if ( ! error ) {
522 filename = tempfilename; 522 filename = tempfilename;
523 } 523 }
524 mAlarmMessage = mess.mid( 13+len+3 ); 524 mAlarmMessage = mess.mid( 13+len+3 );
525 //qDebug("suspend file %s ",tempfilename.latin1() ); 525 //qDebug("suspend file %s ",tempfilename.latin1() );
526 startAlarm( mAlarmMessage, filename); 526 startAlarm( mAlarmMessage, filename);
527 return; 527 return;
528 } 528 }
529 if ( mess.left( 11 ) == "timer_alarm") { 529 if ( mess.left( 11 ) == "timer_alarm") {
530 //mTimerTime = 0; 530 //mTimerTime = 0;
531 startAlarm( mess.mid( 11 ), filename ); 531 startAlarm( mess.mid( 11 ), filename );
532 return; 532 return;
533 } 533 }
534 if ( mess.left( 10 ) == "proc_alarm") { 534 if ( mess.left( 10 ) == "proc_alarm") {
535 bool error = false; 535 bool error = false;
536 int len = mess.mid( 10 ).find("+++"); 536 int len = mess.mid( 10 ).find("+++");
537 if ( len < 2 ) 537 if ( len < 2 )
538 error = true; 538 error = true;
539 else { 539 else {
540 tempfilename = mess.mid( 10, len ); 540 tempfilename = mess.mid( 10, len );
541 if ( !QFile::exists( tempfilename ) ) 541 if ( !QFile::exists( tempfilename ) )
542 error = true; 542 error = true;
543 } 543 }
544 if ( error ) { 544 if ( error ) {
545 mAlarmMessage = "Procedure Alarm\nError - File not found\n"; 545 mAlarmMessage = "Procedure Alarm\nError - File not found\n";
546 mAlarmMessage += mess.mid( 10+len+3+9 ); 546 mAlarmMessage += mess.mid( 10+len+3+9 );
547 } else { 547 } else {
548 //QCopEnvelope e("QPE/Application/kopi", "-writeFileSilent"); 548 //QCopEnvelope e("QPE/Application/kopi", "-writeFileSilent");
549 //qDebug("-----system command %s ",tempfilename.latin1() ); 549 //qDebug("-----system command %s ",tempfilename.latin1() );
550#ifndef _WIN32_ 550#ifndef _WIN32_
551 if ( vfork () == 0 ) { 551 if ( vfork () == 0 ) {
552 execl ( tempfilename.latin1(), 0 ); 552 execl ( tempfilename.latin1(), 0 );
553 return; 553 return;
554 } 554 }
555#else 555#else
556 QProcess* p = new QProcess(); 556 QProcess* p = new QProcess();
557 p->addArgument( tempfilename.latin1() ); 557 p->addArgument( tempfilename.latin1() );
558 p->start(); 558 p->start();
559 return; 559 return;
560#endif 560#endif
561 561
562 return; 562 return;
563 } 563 }
564 564
565 //qDebug("+++++++system command %s ",tempfilename.latin1() ); 565 //qDebug("+++++++system command %s ",tempfilename.latin1() );
566 } 566 }
567 if ( mess.left( 11 ) == "audio_alarm") { 567 if ( mess.left( 11 ) == "audio_alarm") {
568 bool error = false; 568 bool error = false;
569 int len = mess.mid( 11 ).find("+++"); 569 int len = mess.mid( 11 ).find("+++");
570 if ( len < 2 ) 570 if ( len < 2 )
571 error = true; 571 error = true;
572 else { 572 else {
573 tempfilename = mess.mid( 11, len ); 573 tempfilename = mess.mid( 11, len );
574 if ( !QFile::exists( tempfilename ) ) 574 if ( !QFile::exists( tempfilename ) )
575 error = true; 575 error = true;
576 } 576 }
577 if ( ! error ) { 577 if ( ! error ) {
578 filename = tempfilename; 578 filename = tempfilename;
579 } 579 }
580 mAlarmMessage = mess.mid( 11+len+3+9 ); 580 mAlarmMessage = mess.mid( 11+len+3+9 );
581 //qDebug("audio file command %s ",tempfilename.latin1() ); 581 //qDebug("audio file command %s ",tempfilename.latin1() );
582 } 582 }
583 if ( mess.left( 9 ) == "cal_alarm") { 583 if ( mess.left( 9 ) == "cal_alarm") {
584 mAlarmMessage = mess.mid( 9 ) ; 584 mAlarmMessage = mess.mid( 9 ) ;
585 } 585 }
586 586
587 startAlarm( mAlarmMessage, filename ); 587 startAlarm( mAlarmMessage, filename );
588 588
589 589
590} 590}
591 591
592void CalendarView::addSuspendAlarm(const QDateTime &qdt, const QString &noti ) 592void CalendarView::addSuspendAlarm(const QDateTime &qdt, const QString &noti )
593{ 593{
594 //qDebug("+++++addSUSPENDAlarm %s %s ", qdt.toString().latin1() , noti.latin1() ); 594 //qDebug("+++++addSUSPENDAlarm %s %s ", qdt.toString().latin1() , noti.latin1() );
595 595
596 mSuspendAlarmNotification = noti; 596 mSuspendAlarmNotification = noti;
597 int ms = QDateTime::currentDateTime().secsTo( qdt )*1000; 597 int ms = QDateTime::currentDateTime().secsTo( qdt )*1000;
598 //qDebug("Suspend Alarm timer started with secs: %d ", ms/1000); 598 //qDebug("Suspend Alarm timer started with secs: %d ", ms/1000);
599 mSuspendTimer->start( ms , true ); 599 mSuspendTimer->start( ms , true );
600 600
601} 601}
602 602
603void CalendarView::addAlarm(const QDateTime &qdt, const QString &noti ) 603void CalendarView::addAlarm(const QDateTime &qdt, const QString &noti )
604{ 604{
605 //qDebug("+++++addAlarm %s %s ", qdt.toString().latin1() , noti.latin1() ); 605 //qDebug("+++++addAlarm %s %s ", qdt.toString().latin1() , noti.latin1() );
606 if ( ! KOPrefs::instance()->mUseInternalAlarmNotification ) { 606 if ( ! KOPrefs::instance()->mUseInternalAlarmNotification ) {
607#ifndef DESKTOP_VERSION 607#ifndef DESKTOP_VERSION
608 AlarmServer::addAlarm ( qdt,"koalarm", noti.latin1() ); 608 AlarmServer::addAlarm ( qdt,"koalarm", noti.latin1() );
609#endif 609#endif
610 return; 610 return;
611 } 611 }
612 int maxSec; 612 int maxSec;
613 //maxSec = 5; //testing only 613 //maxSec = 5; //testing only
614 maxSec = 86400+3600; // one day+1hour 614 maxSec = 86400+3600; // one day+1hour
615 mAlarmNotification = noti; 615 mAlarmNotification = noti;
616 int sec = QDateTime::currentDateTime().secsTo( qdt ); 616 int sec = QDateTime::currentDateTime().secsTo( qdt );
617 if ( sec > maxSec ) { 617 if ( sec > maxSec ) {
618 mRecheckAlarmTimer->start( maxSec * 1000 ); 618 mRecheckAlarmTimer->start( maxSec * 1000 );
619 // qDebug("recheck Alarm timer started with secs: %d next alarm in sec:%d", maxSec,sec ); 619 // qDebug("recheck Alarm timer started with secs: %d next alarm in sec:%d", maxSec,sec );
620 return; 620 return;
621 } else { 621 } else {
622 mRecheckAlarmTimer->stop(); 622 mRecheckAlarmTimer->stop();
623 } 623 }
624 //qDebug("Alarm timer started with secs: %d ", sec); 624 //qDebug("Alarm timer started with secs: %d ", sec);
625 mAlarmTimer->start( sec *1000 , true ); 625 mAlarmTimer->start( sec *1000 , true );
626 626
627} 627}
628// called by mRecheckAlarmTimer to get next alarm 628// called by mRecheckAlarmTimer to get next alarm
629// we need this, because a QTimer has only a max range of 25 days 629// we need this, because a QTimer has only a max range of 25 days
630void CalendarView::recheckTimerAlarm() 630void CalendarView::recheckTimerAlarm()
631{ 631{
632 mAlarmTimer->stop(); 632 mAlarmTimer->stop();
633 mRecheckAlarmTimer->stop(); 633 mRecheckAlarmTimer->stop();
634 mCalendar->checkAlarmForIncidence( 0, true ); 634 mCalendar->checkAlarmForIncidence( 0, true );
635} 635}
636void CalendarView::removeAlarm(const QDateTime &qdt, const QString &noti ) 636void CalendarView::removeAlarm(const QDateTime &qdt, const QString &noti )
637{ 637{
638 //qDebug("-----removeAlarm %s %s ", qdt.toString().latin1() , noti.latin1() ); 638 //qDebug("-----removeAlarm %s %s ", qdt.toString().latin1() , noti.latin1() );
639 if ( ! KOPrefs::instance()->mUseInternalAlarmNotification ) { 639 if ( ! KOPrefs::instance()->mUseInternalAlarmNotification ) {
640#ifndef DESKTOP_VERSION 640#ifndef DESKTOP_VERSION
641 AlarmServer::deleteAlarm (qdt ,"koalarm" ,noti.latin1() ); 641 AlarmServer::deleteAlarm (qdt ,"koalarm" ,noti.latin1() );
642#endif 642#endif
643 return; 643 return;
644 } 644 }
645 mAlarmTimer->stop(); 645 mAlarmTimer->stop();
646} 646}
647void CalendarView::selectWeekNum ( int num ) 647void CalendarView::selectWeekNum ( int num )
648{ 648{
649 dateNavigator()->selectWeek( num ); 649 dateNavigator()->selectWeek( num );
650 mViewManager->showWeekView(); 650 mViewManager->showWeekView();
651} 651}
652KOViewManager *CalendarView::viewManager() 652KOViewManager *CalendarView::viewManager()
653{ 653{
654 return mViewManager; 654 return mViewManager;
655} 655}
656 656
657KODialogManager *CalendarView::dialogManager() 657KODialogManager *CalendarView::dialogManager()
658{ 658{
659 return mDialogManager; 659 return mDialogManager;
660} 660}
661 661
662QDate CalendarView::startDate() 662QDate CalendarView::startDate()
663{ 663{
664 DateList dates = mNavigator->selectedDates(); 664 DateList dates = mNavigator->selectedDates();
665 665
666 return dates.first(); 666 return dates.first();
667} 667}
668 668
669QDate CalendarView::endDate() 669QDate CalendarView::endDate()
670{ 670{
671 DateList dates = mNavigator->selectedDates(); 671 DateList dates = mNavigator->selectedDates();
672 672
673 return dates.last(); 673 return dates.last();
674} 674}
675 675
676 676
677void CalendarView::createPrinter() 677void CalendarView::createPrinter()
678{ 678{
679#ifndef KORG_NOPRINTER 679#ifndef KORG_NOPRINTER
680 if (!mCalPrinter) { 680 if (!mCalPrinter) {
681 mCalPrinter = new CalPrinter(this, mCalendar); 681 mCalPrinter = new CalPrinter(this, mCalendar);
682 connect(this, SIGNAL(configChanged()), mCalPrinter, SLOT(updateConfig())); 682 connect(this, SIGNAL(configChanged()), mCalPrinter, SLOT(updateConfig()));
683 } 683 }
684#endif 684#endif
685} 685}
686 686
687void CalendarView::confSync() 687void CalendarView::confSync()
688{ 688{
689 static KSyncPrefsDialog* sp = 0; 689 static KSyncPrefsDialog* sp = 0;
690 if ( ! sp ) { 690 if ( ! sp ) {
691 sp = new KSyncPrefsDialog( this, "syncprefs", true ); 691 sp = new KSyncPrefsDialog( this, "syncprefs", true );
692 } 692 }
693 sp->usrReadConfig(); 693 sp->usrReadConfig();
694#ifndef DESKTOP_VERSION 694#ifndef DESKTOP_VERSION
695 sp->showMaximized(); 695 sp->showMaximized();
696#else 696#else
697 sp->show(); 697 sp->show();
698#endif 698#endif
699 sp->exec(); 699 sp->exec();
700 KOPrefs::instance()->mSyncProfileNames = sp->getSyncProfileNames(); 700 KOPrefs::instance()->mSyncProfileNames = sp->getSyncProfileNames();
701 KOPrefs::instance()->mLocalMachineName = sp->getLocalMachineName (); 701 KOPrefs::instance()->mLocalMachineName = sp->getLocalMachineName ();
702} 702}
703 703
704 704
705//KOPrefs::instance()->mWriteBackFile 705//KOPrefs::instance()->mWriteBackFile
706//KOPrefs::instance()->mWriteBackExistingOnly 706//KOPrefs::instance()->mWriteBackExistingOnly
707 707
708// 0 syncPrefsGroup->addRadio(i18n("Take local entry on conflict")); 708// 0 syncPrefsGroup->addRadio(i18n("Take local entry on conflict"));
709// 1 syncPrefsGroup->addRadio(i18n("Take remote entry on conflict")); 709// 1 syncPrefsGroup->addRadio(i18n("Take remote entry on conflict"));
710// 2 syncPrefsGroup->addRadio(i18n("Take newest entry on conflict")); 710// 2 syncPrefsGroup->addRadio(i18n("Take newest entry on conflict"));
711// 3 syncPrefsGroup->addRadio(i18n("Ask for every entry on conflict")); 711// 3 syncPrefsGroup->addRadio(i18n("Ask for every entry on conflict"));
712// 4 syncPrefsGroup->addRadio(i18n("Force take local entry always")); 712// 4 syncPrefsGroup->addRadio(i18n("Force take local entry always"));
713// 5 syncPrefsGroup->addRadio(i18n("Force take remote entry always")); 713// 5 syncPrefsGroup->addRadio(i18n("Force take remote entry always"));
714 714
715int CalendarView::takeEvent( Incidence* local, Incidence* remote, int mode , bool full ) 715int CalendarView::takeEvent( Incidence* local, Incidence* remote, int mode , bool full )
716{ 716{
717 717
718 //void setZaurusId(int id); 718 //void setZaurusId(int id);
719 // int zaurusId() const; 719 // int zaurusId() const;
720 // void setZaurusUid(int id); 720 // void setZaurusUid(int id);
721 // int zaurusUid() const; 721 // int zaurusUid() const;
722 // void setZaurusStat(int id); 722 // void setZaurusStat(int id);
723 // int zaurusStat() const; 723 // int zaurusStat() const;
724 // 0 equal 724 // 0 equal
725 // 1 take local 725 // 1 take local
726 // 2 take remote 726 // 2 take remote
727 // 3 cancel 727 // 3 cancel
728 QDateTime lastSync = mLastCalendarSync; 728 QDateTime lastSync = mLastCalendarSync;
729 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 729 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
730 bool remCh, locCh; 730 bool remCh, locCh;
731 remCh = ( remote->getCsum(mCurrentSyncDevice) != local->getCsum(mCurrentSyncDevice) ); 731 remCh = ( remote->getCsum(mCurrentSyncDevice) != local->getCsum(mCurrentSyncDevice) );
732 if ( remCh ) 732 if ( remCh )
733 qDebug("loc %s rem %s", local->getCsum(mCurrentSyncDevice).latin1(), remote->getCsum(mCurrentSyncDevice).latin1() ); 733 qDebug("loc %s rem %s", local->getCsum(mCurrentSyncDevice).latin1(), remote->getCsum(mCurrentSyncDevice).latin1() );
734 locCh = ( local->lastModified() > mLastCalendarSync ); 734 locCh = ( local->lastModified() > mLastCalendarSync );
735 //qDebug("locCh %d remCh %d locuid %d remuid %d", locCh, remCh,local->zaurusUid(), remote->zaurusUid() ); 735 //qDebug("locCh %d remCh %d locuid %d remuid %d", locCh, remCh,local->zaurusUid(), remote->zaurusUid() );
736 if ( !remCh && ! locCh ) { 736 if ( !remCh && ! locCh ) {
737 qDebug("both not changed "); 737 qDebug("both not changed ");
738 lastSync = local->lastModified().addDays(1); 738 lastSync = local->lastModified().addDays(1);
739 } else { 739 } else {
740 if ( locCh ) { 740 if ( locCh ) {
741 qDebug("loc changed %d", local->revision() ); 741 qDebug("loc changed %d %s %s", local->revision() , local->lastModified().toString().latin1(), mLastCalendarSync.toString().latin1());
742 lastSync = local->lastModified().addDays( -1 ); 742 lastSync = local->lastModified().addDays( -1 );
743 if ( !remCh ) 743 if ( !remCh )
744 remote->setLastModified( lastSync.addDays( -1 ) ); 744 remote->setLastModified( lastSync.addDays( -1 ) );
745 } else { 745 } else {
746 qDebug(" not loc changed "); 746 qDebug(" not loc changed ");
747 lastSync = local->lastModified().addDays( 1 ); 747 lastSync = local->lastModified().addDays( 1 );
748 if ( remCh ) 748 if ( remCh )
749 remote->setLastModified( lastSync.addDays( 1 ) ); 749 remote->setLastModified( lastSync.addDays( 1 ) );
750 750
751 } 751 }
752 } 752 }
753 full = true; 753 full = true;
754 if ( mode < SYNC_PREF_ASK ) 754 if ( mode < SYNC_PREF_ASK )
755 mode = SYNC_PREF_ASK; 755 mode = SYNC_PREF_ASK;
756 } else { 756 } else {
757 if ( local->lastModified() == remote->lastModified() ) 757 if ( local->lastModified() == remote->lastModified() )
758 if ( local->revision() == remote->revision() ) 758 if ( local->revision() == remote->revision() )
759 return 0; 759 return 0;
760 760
761 } 761 }
762 // qDebug(" %d %d conflict on %s %s ", mode, full, local->summary().latin1(), remote->summary().latin1() ); 762 // qDebug(" %d %d conflict on %s %s ", mode, full, local->summary().latin1(), remote->summary().latin1() );
763 763
764 //qDebug("%s %d %s %d", local->lastModified().toString().latin1() , local->revision(), remote->lastModified().toString().latin1(), remote->revision()); 764 //qDebug("%s %d %s %d", local->lastModified().toString().latin1() , local->revision(), remote->lastModified().toString().latin1(), remote->revision());
765 //qDebug("%d %d %d %d ", local->lastModified().time().second(), local->lastModified().time().msec(), remote->lastModified().time().second(), remote->lastModified().time().msec() ); 765 //qDebug("%d %d %d %d ", local->lastModified().time().second(), local->lastModified().time().msec(), remote->lastModified().time().second(), remote->lastModified().time().msec() );
766 //full = true; //debug only 766 //full = true; //debug only
767 if ( full ) { 767 if ( full ) {
768 bool equ = false; 768 bool equ = false;
769 if ( local->type() == "Event" ) { 769 if ( local->type() == "Event" ) {
770 equ = (*((Event*) local) == *((Event*) remote)); 770 equ = (*((Event*) local) == *((Event*) remote));
771 } 771 }
772 else if ( local->type() =="Todo" ) 772 else if ( local->type() =="Todo" )
773 equ = (*((Todo*) local) == (*(Todo*) remote)); 773 equ = (*((Todo*) local) == (*(Todo*) remote));
774 else if ( local->type() =="Journal" ) 774 else if ( local->type() =="Journal" )
775 equ = (*((Journal*) local) == *((Journal*) remote)); 775 equ = (*((Journal*) local) == *((Journal*) remote));
776 if ( equ ) { 776 if ( equ ) {
777 //qDebug("equal "); 777 //qDebug("equal ");
778 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 778 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
779 local->setCsum( mCurrentSyncDevice, remote->getCsum(mCurrentSyncDevice) ); 779 local->setCsum( mCurrentSyncDevice, remote->getCsum(mCurrentSyncDevice) );
780 } 780 }
781 if ( mode < SYNC_PREF_FORCE_LOCAL ) 781 if ( mode < SYNC_PREF_FORCE_LOCAL )
782 return 0; 782 return 0;
783 783
784 }//else //debug only 784 }//else //debug only
785 //qDebug("not equal %s %s ", local->summary().latin1(), remote->summary().latin1()); 785 //qDebug("not equal %s %s ", local->summary().latin1(), remote->summary().latin1());
786 } 786 }
787 int result; 787 int result;
788 bool localIsNew; 788 bool localIsNew;
789 qDebug("mLastCalendarSync %s lastsync %s --- local %s remote %s ",mLastCalendarSync.toString().latin1() ,lastSync.toString().latin1() , local->lastModified().toString().latin1() , remote->lastModified().toString().latin1() ); 789 //qDebug("%s -- %s mLastCalendarSync %s lastsync %s --- local %s remote %s ",local->summary().latin1(), remote->summary().latin1(),mLastCalendarSync.toString().latin1() ,lastSync.toString().latin1() , local->lastModified().toString().latin1() , remote->lastModified().toString().latin1() );
790 790
791 if ( full && mode < SYNC_PREF_NEWEST ) 791 if ( full && mode < SYNC_PREF_NEWEST )
792 mode = SYNC_PREF_ASK; 792 mode = SYNC_PREF_ASK;
793 793
794 switch( mode ) { 794 switch( mode ) {
795 case SYNC_PREF_LOCAL: 795 case SYNC_PREF_LOCAL:
796 if ( lastSync > remote->lastModified() ) 796 if ( lastSync > remote->lastModified() )
797 return 1; 797 return 1;
798 if ( lastSync > local->lastModified() ) 798 if ( lastSync > local->lastModified() )
799 return 2; 799 return 2;
800 return 1; 800 return 1;
801 break; 801 break;
802 case SYNC_PREF_REMOTE: 802 case SYNC_PREF_REMOTE:
803 if ( lastSync > remote->lastModified() ) 803 if ( lastSync > remote->lastModified() )
804 return 1; 804 return 1;
805 if ( lastSync > local->lastModified() ) 805 if ( lastSync > local->lastModified() )
806 return 2; 806 return 2;
807 return 2; 807 return 2;
808 break; 808 break;
809 case SYNC_PREF_NEWEST: 809 case SYNC_PREF_NEWEST:
810 if ( local->lastModified() > remote->lastModified() ) 810 if ( local->lastModified() > remote->lastModified() )
811 return 1; 811 return 1;
812 else 812 else
813 return 2; 813 return 2;
814 break; 814 break;
815 case SYNC_PREF_ASK: 815 case SYNC_PREF_ASK:
816 //qDebug("lsy %s --- lo %s --- re %s ", lastSync.toString().latin1(), local->lastModified().toString().latin1(), remote->lastModified().toString().latin1() ); 816 //qDebug("lsy %s --- lo %s --- re %s ", lastSync.toString().latin1(), local->lastModified().toString().latin1(), remote->lastModified().toString().latin1() );
817 if ( lastSync > remote->lastModified() ) 817 if ( lastSync > remote->lastModified() )
818 return 1; 818 return 1;
819 if ( lastSync > local->lastModified() ) 819 if ( lastSync > local->lastModified() )
820 return 2; 820 return 2;
821 //qDebug("lsy %s --- lo %s --- re %s ", lastSync.toString().latin1(), local->lastModified().toString().latin1(), remote->lastModified().toString().latin1() ); 821 //qDebug("lsy %s --- lo %s --- re %s ", lastSync.toString().latin1(), local->lastModified().toString().latin1(), remote->lastModified().toString().latin1() );
822 localIsNew = local->lastModified() >= remote->lastModified(); 822 localIsNew = local->lastModified() >= remote->lastModified();
823 if ( localIsNew ) 823 if ( localIsNew )
824 getEventViewerDialog()->setColorMode( 1 ); 824 getEventViewerDialog()->setColorMode( 1 );
825 else 825 else
826 getEventViewerDialog()->setColorMode( 2 ); 826 getEventViewerDialog()->setColorMode( 2 );
827 getEventViewerDialog()->setIncidence(local); 827 getEventViewerDialog()->setIncidence(local);
828 if ( localIsNew ) 828 if ( localIsNew )
829 getEventViewerDialog()->setColorMode( 2 ); 829 getEventViewerDialog()->setColorMode( 2 );
830 else 830 else
831 getEventViewerDialog()->setColorMode( 1 ); 831 getEventViewerDialog()->setColorMode( 1 );
832 getEventViewerDialog()->addIncidence(remote); 832 getEventViewerDialog()->addIncidence(remote);
833 getEventViewerDialog()->setColorMode( 0 ); 833 getEventViewerDialog()->setColorMode( 0 );
834 //qDebug("local %d remote %d ",local->relatedTo(),remote->relatedTo() ); 834 //qDebug("local %d remote %d ",local->relatedTo(),remote->relatedTo() );
835 getEventViewerDialog()->setCaption( mCurrentSyncDevice +i18n(" : Conflict! Please choose entry!")); 835 getEventViewerDialog()->setCaption( mCurrentSyncDevice +i18n(" : Conflict! Please choose entry!"));
836 getEventViewerDialog()->showMe(); 836 getEventViewerDialog()->showMe();
837 result = getEventViewerDialog()->executeS( localIsNew ); 837 result = getEventViewerDialog()->executeS( localIsNew );
838 return result; 838 return result;
839 839
840 break; 840 break;
841 case SYNC_PREF_FORCE_LOCAL: 841 case SYNC_PREF_FORCE_LOCAL:
842 return 1; 842 return 1;
843 break; 843 break;
844 case SYNC_PREF_FORCE_REMOTE: 844 case SYNC_PREF_FORCE_REMOTE:
845 return 2; 845 return 2;
846 break; 846 break;
847 847
848 default: 848 default:
849 // SYNC_PREF_TAKE_BOTH not implemented 849 // SYNC_PREF_TAKE_BOTH not implemented
850 break; 850 break;
851 } 851 }
852 return 0; 852 return 0;
853} 853}
854Event* CalendarView::getLastSyncEvent() 854Event* CalendarView::getLastSyncEvent()
855{ 855{
856 Event* lse; 856 Event* lse;
857 //qDebug("CurrentSyncDevice %s ",mCurrentSyncDevice .latin1() ); 857 //qDebug("CurrentSyncDevice %s ",mCurrentSyncDevice .latin1() );
858 lse = mCalendar->event( "last-syncEvent-"+mCurrentSyncDevice ); 858 lse = mCalendar->event( "last-syncEvent-"+mCurrentSyncDevice );
859 if (!lse) { 859 if (!lse) {
860 lse = new Event(); 860 lse = new Event();
861 lse->setUid( "last-syncEvent-"+mCurrentSyncDevice ); 861 lse->setUid( "last-syncEvent-"+mCurrentSyncDevice );
862 QString sum = ""; 862 QString sum = "";
863 if ( KOPrefs::instance()->mExternSyncProfiles.contains( mCurrentSyncDevice ) ) 863 if ( KOPrefs::instance()->mExternSyncProfiles.contains( mCurrentSyncDevice ) )
864 sum = "E: "; 864 sum = "E: ";
865 lse->setSummary(sum+mCurrentSyncDevice + i18n(" - sync event")); 865 lse->setSummary(sum+mCurrentSyncDevice + i18n(" - sync event"));
866 lse->setDtStart( mLastCalendarSync ); 866 lse->setDtStart( mLastCalendarSync );
867 lse->setDtEnd( mLastCalendarSync.addSecs( 7200 ) ); 867 lse->setDtEnd( mLastCalendarSync.addSecs( 7200 ) );
868 lse->setCategories( i18n("SyncEvent") ); 868 lse->setCategories( i18n("SyncEvent") );
869 lse->setReadOnly( true ); 869 lse->setReadOnly( true );
870 mCalendar->addEvent( lse ); 870 mCalendar->addEvent( lse );
871 } 871 }
872 872
873 return lse; 873 return lse;
874 874
875} 875}
876// probaly useless 876// probaly useless
877void CalendarView::setupExternSyncProfiles() 877void CalendarView::setupExternSyncProfiles()
878{ 878{
879 Event* lse; 879 Event* lse;
880 mExternLastSyncEvent.clear(); 880 mExternLastSyncEvent.clear();
881 int i; 881 int i;
882 for ( i = 0; i < KOPrefs::instance()->mExternSyncProfiles.count(); ++i ) { 882 for ( i = 0; i < KOPrefs::instance()->mExternSyncProfiles.count(); ++i ) {
883 lse = mCalendar->event( "last-syncEvent-"+ KOPrefs::instance()->mExternSyncProfiles[i] ); 883 lse = mCalendar->event( "last-syncEvent-"+ KOPrefs::instance()->mExternSyncProfiles[i] );
884 if ( lse ) 884 if ( lse )
885 mExternLastSyncEvent.append( lse ); 885 mExternLastSyncEvent.append( lse );
886 else 886 else
887 qDebug("Last Sync event not found for %s ", KOPrefs::instance()->mExternSyncProfiles[i].latin1()); 887 qDebug("Last Sync event not found for %s ", KOPrefs::instance()->mExternSyncProfiles[i].latin1());
888 } 888 }
889 889
890} 890}
891// we check, if the to delete event has a id for a profile 891// we check, if the to delete event has a id for a profile
892// if yes, we set this id in the profile to delete 892// if yes, we set this id in the profile to delete
893void CalendarView::checkExternSyncEvent( QPtrList<Event> lastSync , Incidence* toDelete ) 893void CalendarView::checkExternSyncEvent( QPtrList<Event> lastSync , Incidence* toDelete )
894{ 894{
895 if ( lastSync.count() == 0 ) { 895 if ( lastSync.count() == 0 ) {
896 //qDebug(" lastSync.count() == 0"); 896 //qDebug(" lastSync.count() == 0");
897 return; 897 return;
898 } 898 }
899 if ( toDelete->type() == "Journal" ) 899 if ( toDelete->type() == "Journal" )
900 return; 900 return;
901 901
902 Event* eve = lastSync.first(); 902 Event* eve = lastSync.first();
903 903
904 while ( eve ) { 904 while ( eve ) {
905 QString id = toDelete->getID( eve->uid().mid( 15 ) ); // this is the sync profile name 905 QString id = toDelete->getID( eve->uid().mid( 15 ) ); // this is the sync profile name
906 if ( !id.isEmpty() ) { 906 if ( !id.isEmpty() ) {
907 QString des = eve->description(); 907 QString des = eve->description();
908 QString pref = "e"; 908 QString pref = "e";
909 if ( toDelete->type() == "Todo" ) 909 if ( toDelete->type() == "Todo" )
910 pref = "t"; 910 pref = "t";
911 des += pref+ id + ","; 911 des += pref+ id + ",";
912 eve->setReadOnly( false ); 912 eve->setReadOnly( false );
913 eve->setDescription( des ); 913 eve->setDescription( des );
914 //qDebug("setdes %s ", des.latin1()); 914 //qDebug("setdes %s ", des.latin1());
915 eve->setReadOnly( true ); 915 eve->setReadOnly( true );
916 } 916 }
917 eve = lastSync.next(); 917 eve = lastSync.next();
918 } 918 }
919 919
920} 920}
921void CalendarView::checkExternalId( Incidence * inc ) 921void CalendarView::checkExternalId( Incidence * inc )
922{ 922{
923 QPtrList<Event> lastSync = mCalendar->getExternLastSyncEvents() ; 923 QPtrList<Event> lastSync = mCalendar->getExternLastSyncEvents() ;
924 checkExternSyncEvent( lastSync, inc ); 924 checkExternSyncEvent( lastSync, inc );
925 925
926} 926}
927bool CalendarView::synchronizeCalendar( Calendar* local, Calendar* remote, int mode ) 927bool CalendarView::synchronizeCalendar( Calendar* local, Calendar* remote, int mode )
928{ 928{
929 bool syncOK = true; 929 bool syncOK = true;
930 int addedEvent = 0; 930 int addedEvent = 0;
931 int addedEventR = 0; 931 int addedEventR = 0;
932 int deletedEventR = 0; 932 int deletedEventR = 0;
933 int deletedEventL = 0; 933 int deletedEventL = 0;
934 int changedLocal = 0; 934 int changedLocal = 0;
935 int changedRemote = 0; 935 int changedRemote = 0;
936 //QPtrList<Event> el = local->rawEvents(); 936 //QPtrList<Event> el = local->rawEvents();
937 Event* eventR; 937 Event* eventR;
938 QString uid; 938 QString uid;
939 int take; 939 int take;
940 Event* eventL; 940 Event* eventL;
941 Event* eventRSync; 941 Event* eventRSync;
942 Event* eventLSync; 942 Event* eventLSync;
943 QPtrList<Event> eventRSyncSharp = remote->getExternLastSyncEvents(); 943 QPtrList<Event> eventRSyncSharp = remote->getExternLastSyncEvents();
944 QPtrList<Event> eventLSyncSharp = local->getExternLastSyncEvents(); 944 QPtrList<Event> eventLSyncSharp = local->getExternLastSyncEvents();
945 bool fullDateRange = false; 945 bool fullDateRange = false;
946 local->resetTempSyncStat(); 946 local->resetTempSyncStat();
947 mLastCalendarSync = QDateTime::currentDateTime(); 947 mLastCalendarSync = QDateTime::currentDateTime();
948 QDateTime modifiedCalendar = mLastCalendarSync;; 948 QDateTime modifiedCalendar = mLastCalendarSync;;
949 eventLSync = getLastSyncEvent(); 949 eventLSync = getLastSyncEvent();
950 eventR = remote->event("last-syncEvent-"+mCurrentSyncName ); 950 eventR = remote->event("last-syncEvent-"+mCurrentSyncName );
951 if ( eventR ) { 951 if ( eventR ) {
952 eventRSync = (Event*) eventR->clone(); 952 eventRSync = (Event*) eventR->clone();
953 remote->deleteEvent(eventR ); 953 remote->deleteEvent(eventR );
954 954
955 } else { 955 } else {
956 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 956 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
957 eventRSync = (Event*)eventLSync->clone(); 957 eventRSync = (Event*)eventLSync->clone();
958 } else { 958 } else {
959 fullDateRange = true; 959 fullDateRange = true;
960 eventRSync = new Event(); 960 eventRSync = new Event();
961 eventRSync->setSummary(mCurrentSyncName + i18n(" - sync event")); 961 eventRSync->setSummary(mCurrentSyncName + i18n(" - sync event"));
962 eventRSync->setUid("last-syncEvent-"+mCurrentSyncName ); 962 eventRSync->setUid("last-syncEvent-"+mCurrentSyncName );
963 eventRSync->setDtStart( mLastCalendarSync ); 963 eventRSync->setDtStart( mLastCalendarSync );
964 eventRSync->setDtEnd( mLastCalendarSync.addSecs( 7200 ) ); 964 eventRSync->setDtEnd( mLastCalendarSync.addSecs( 7200 ) );
965 eventRSync->setCategories( i18n("SyncEvent") ); 965 eventRSync->setCategories( i18n("SyncEvent") );
966 } 966 }
967 } 967 }
968 if ( eventLSync->dtStart() == mLastCalendarSync ) 968 if ( eventLSync->dtStart() == mLastCalendarSync )
969 fullDateRange = true; 969 fullDateRange = true;
970 970
971 if ( ! fullDateRange ) { 971 if ( ! fullDateRange ) {
972 if ( eventLSync->dtStart() != eventRSync->dtStart() ) { 972 if ( eventLSync->dtStart() != eventRSync->dtStart() ) {
973 973
974 // qDebug("set fulldate to true %s %s" ,eventLSync->dtStart().toString().latin1(), eventRSync->dtStart().toString().latin1() ); 974 // qDebug("set fulldate to true %s %s" ,eventLSync->dtStart().toString().latin1(), eventRSync->dtStart().toString().latin1() );
975 //qDebug("%d %d %d %d ", eventLSync->dtStart().time().second(), eventLSync->dtStart().time().msec() , eventRSync->dtStart().time().second(), eventRSync->dtStart().time().msec()); 975 //qDebug("%d %d %d %d ", eventLSync->dtStart().time().second(), eventLSync->dtStart().time().msec() , eventRSync->dtStart().time().second(), eventRSync->dtStart().time().msec());
976 fullDateRange = true; 976 fullDateRange = true;
977 } 977 }
978 } 978 }
979 if ( fullDateRange ) 979 if ( fullDateRange )
980 mLastCalendarSync = QDateTime::currentDateTime().addDays( -100*365); 980 mLastCalendarSync = QDateTime::currentDateTime().addDays( -100*365);
981 else 981 else
982 mLastCalendarSync = eventLSync->dtStart(); 982 mLastCalendarSync = eventLSync->dtStart();
983 // for resyncing if own file has changed 983 // for resyncing if own file has changed
984 if ( mCurrentSyncDevice == "deleteaftersync" ) { 984 if ( mCurrentSyncDevice == "deleteaftersync" ) {
985 mLastCalendarSync = loadedFileVersion; 985 mLastCalendarSync = loadedFileVersion;
986 qDebug("setting mLastCalendarSync "); 986 qDebug("setting mLastCalendarSync ");
987 } 987 }
988 //qDebug("*************************** "); 988 //qDebug("*************************** ");
989 qDebug("mLastCalendarSync %s ",mLastCalendarSync.toString().latin1() ); 989 qDebug("mLastCalendarSync %s ",mLastCalendarSync.toString().latin1() );
990 QPtrList<Incidence> er = remote->rawIncidences(); 990 QPtrList<Incidence> er = remote->rawIncidences();
991 Incidence* inR = er.first(); 991 Incidence* inR = er.first();
992 Incidence* inL; 992 Incidence* inL;
993 QProgressBar bar( er.count(),0 ); 993 QProgressBar bar( er.count(),0 );
994 bar.setCaption (i18n("Syncing - close to abort!") ); 994 bar.setCaption (i18n("Syncing - close to abort!") );
995 995
996 int w = 300; 996 int w = 300;
997 if ( QApplication::desktop()->width() < 320 ) 997 if ( QApplication::desktop()->width() < 320 )
998 w = 220; 998 w = 220;
999 int h = bar.sizeHint().height() ; 999 int h = bar.sizeHint().height() ;
1000 int dw = QApplication::desktop()->width(); 1000 int dw = QApplication::desktop()->width();
1001 int dh = QApplication::desktop()->height(); 1001 int dh = QApplication::desktop()->height();
1002 bar.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 1002 bar.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
1003 bar.show(); 1003 bar.show();
1004 int modulo = (er.count()/10)+1; 1004 int modulo = (er.count()/10)+1;
1005 int incCounter = 0; 1005 int incCounter = 0;
1006 while ( inR ) { 1006 while ( inR ) {
1007 if ( ! bar.isVisible() ) 1007 if ( ! bar.isVisible() )
1008 return false; 1008 return false;
1009 if ( incCounter % modulo == 0 ) 1009 if ( incCounter % modulo == 0 )
1010 bar.setProgress( incCounter ); 1010 bar.setProgress( incCounter );
1011 ++incCounter; 1011 ++incCounter;
1012 uid = inR->uid(); 1012 uid = inR->uid();
1013 bool skipIncidence = false; 1013 bool skipIncidence = false;
1014 if ( uid.left(15) == QString("last-syncEvent-") ) 1014 if ( uid.left(15) == QString("last-syncEvent-") )
1015 skipIncidence = true; 1015 skipIncidence = true;
1016 1016
1017 qApp->processEvents(); 1017 qApp->processEvents();
1018 if ( !skipIncidence ) { 1018 if ( !skipIncidence ) {
1019 inL = local->incidence( uid ); 1019 inL = local->incidence( uid );
1020 if ( inL ) { // maybe conflict - same uid in both calendars 1020 if ( inL ) { // maybe conflict - same uid in both calendars
1021 int maxrev = inL->revision(); 1021 int maxrev = inL->revision();
1022 if ( maxrev < inR->revision() ) 1022 if ( maxrev < inR->revision() )
1023 maxrev = inR->revision(); 1023 maxrev = inR->revision();
1024 if ( (take = takeEvent( inL, inR, mode, fullDateRange )) > 0 ) { 1024 if ( (take = takeEvent( inL, inR, mode, fullDateRange )) > 0 ) {
1025 //qDebug("take %d %s ", take, inL->summary().latin1()); 1025 //qDebug("take %d %s ", take, inL->summary().latin1());
1026 if ( take == 3 ) 1026 if ( take == 3 )
1027 return false; 1027 return false;
1028 if ( take == 1 ) {// take local 1028 if ( take == 1 ) {// take local
1029 inL->setCsum( mCurrentSyncDevice, inR->getCsum(mCurrentSyncDevice) ); 1029 inL->setCsum( mCurrentSyncDevice, inR->getCsum(mCurrentSyncDevice) );
1030 remote->deleteIncidence( inR ); 1030 remote->deleteIncidence( inR );
1031 if ( inL->revision() < maxrev ) 1031 if ( inL->revision() < maxrev )
1032 inL->setRevision( maxrev ); 1032 inL->setRevision( maxrev );
1033 remote->addIncidence( inL->clone() ); 1033 inR = inL->clone();
1034 inR->setTempSyncStat( SYNC_TEMPSTATE_INITIAL );
1035 remote->addIncidence( inR );
1034 ++changedRemote; 1036 ++changedRemote;
1035 } else { 1037 } else {
1036 if ( inR->revision() < maxrev ) 1038 if ( inR->revision() < maxrev )
1037 inR->setRevision( maxrev ); 1039 inR->setRevision( maxrev );
1038 local->deleteIncidence( inL ); 1040 local->deleteIncidence( inL );
1039 local->addIncidence( inR->clone() ); 1041 local->addIncidence( inR->clone() );
1040 ++changedLocal; 1042 ++changedLocal;
1041 } 1043 }
1042 } 1044 }
1043 } else { // no conflict 1045 } else { // no conflict
1044 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 1046 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
1045 QString des = eventLSync->description(); 1047 QString des = eventLSync->description();
1046 QString pref = "e"; 1048 QString pref = "e";
1047 if ( inR->type() == "Todo" ) 1049 if ( inR->type() == "Todo" )
1048 pref = "t"; 1050 pref = "t";
1049 if ( des.find(pref+ inR->getID(mCurrentSyncDevice) +"," ) >= 0 && mode != 5) { // delete it 1051 if ( des.find(pref+ inR->getID(mCurrentSyncDevice) +"," ) >= 0 && mode != 5) { // delete it
1050 inR->setTempSyncStat( SYNC_TEMPSTATE_DELETE ); 1052 inR->setTempSyncStat( SYNC_TEMPSTATE_DELETE );
1051 //remote->deleteIncidence( inR ); 1053 //remote->deleteIncidence( inR );
1052 ++deletedEventR; 1054 ++deletedEventR;
1053 } else { 1055 } else {
1054 inR->setLastModified( modifiedCalendar ); 1056 inR->setLastModified( modifiedCalendar );
1055 local->addIncidence( inR->clone() ); 1057 inL = inR->clone();
1058 local->addIncidence( inL );
1056 ++addedEvent; 1059 ++addedEvent;
1057 } 1060 }
1058 } else { 1061 } else {
1059 if ( inR->lastModified() > mLastCalendarSync || mode == 5 ) { 1062 if ( inR->lastModified() > mLastCalendarSync || mode == 5 ) {
1060 inR->setLastModified( modifiedCalendar ); 1063 inR->setLastModified( modifiedCalendar );
1061 local->addIncidence( inR->clone() ); 1064 local->addIncidence( inR->clone() );
1062 ++addedEvent; 1065 ++addedEvent;
1063 } else { 1066 } else {
1064 checkExternSyncEvent(eventRSyncSharp, inR); 1067 checkExternSyncEvent(eventRSyncSharp, inR);
1065 remote->deleteIncidence( inR ); 1068 remote->deleteIncidence( inR );
1066 ++deletedEventR; 1069 ++deletedEventR;
1067 } 1070 }
1068 } 1071 }
1069 } 1072 }
1070 } 1073 }
1071 inR = er.next(); 1074 inR = er.next();
1072 } 1075 }
1073 QPtrList<Incidence> el = local->rawIncidences(); 1076 QPtrList<Incidence> el = local->rawIncidences();
1074 inL = el.first(); 1077 inL = el.first();
1075 modulo = (el.count()/10)+1; 1078 modulo = (el.count()/10)+1;
1076 bar.setCaption (i18n("Add / remove events") ); 1079 bar.setCaption (i18n("Add / remove events") );
1077 bar.setTotalSteps ( el.count() ) ; 1080 bar.setTotalSteps ( el.count() ) ;
1078 bar.show(); 1081 bar.show();
1079 incCounter = 0; 1082 incCounter = 0;
1080 1083
1081 while ( inL ) { 1084 while ( inL ) {
1082 1085
1083 qApp->processEvents(); 1086 qApp->processEvents();
1084 if ( ! bar.isVisible() ) 1087 if ( ! bar.isVisible() )
1085 return false; 1088 return false;
1086 if ( incCounter % modulo == 0 ) 1089 if ( incCounter % modulo == 0 )
1087 bar.setProgress( incCounter ); 1090 bar.setProgress( incCounter );
1088 ++incCounter; 1091 ++incCounter;
1089 uid = inL->uid(); 1092 uid = inL->uid();
1090 bool skipIncidence = false; 1093 bool skipIncidence = false;
1091 if ( uid.left(15) == QString("last-syncEvent-") ) 1094 if ( uid.left(15) == QString("last-syncEvent-") )
1092 skipIncidence = true; 1095 skipIncidence = true;
1093 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL && inL->type() == "Journal" ) 1096 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL && inL->type() == "Journal" )
1094 skipIncidence = true; 1097 skipIncidence = true;
1095 if ( !skipIncidence ) { 1098 if ( !skipIncidence ) {
1096 inR = remote->incidence( uid ); 1099 inR = remote->incidence( uid );
1097 if ( ! inR ) { 1100 if ( ! inR ) {
1098 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 1101 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
1099 if ( !inL->getID(mCurrentSyncDevice).isEmpty() && mode != 4 ) { 1102 if ( !inL->getID(mCurrentSyncDevice).isEmpty() && mode != 4 ) {
1100 local->deleteIncidence( inL ); 1103 local->deleteIncidence( inL );
1101 ++deletedEventL; 1104 ++deletedEventL;
1102 } else { 1105 } else {
1103 if ( ! KOPrefs::instance()->mWriteBackExistingOnly ) { 1106 if ( ! KOPrefs::instance()->mWriteBackExistingOnly ) {
1104 inL->removeID(mCurrentSyncDevice ); 1107 inL->removeID(mCurrentSyncDevice );
1105 ++addedEventR; 1108 ++addedEventR;
1109 qDebug("remote added Incidence %s ", inL->summary().latin1());
1106 inL->setLastModified( modifiedCalendar ); 1110 inL->setLastModified( modifiedCalendar );
1107 remote->addIncidence( inL->clone() ); 1111 inR = inL->clone();
1112 inR->setTempSyncStat( SYNC_TEMPSTATE_INITIAL );
1113 remote->addIncidence( inR );
1108 } 1114 }
1109 } 1115 }
1110 } else { 1116 } else {
1111 if ( inL->lastModified() < mLastCalendarSync && mode != 4 ) { 1117 if ( inL->lastModified() < mLastCalendarSync && mode != 4 ) {
1112 checkExternSyncEvent(eventLSyncSharp, inL); 1118 checkExternSyncEvent(eventLSyncSharp, inL);
1113 local->deleteIncidence( inL ); 1119 local->deleteIncidence( inL );
1114 ++deletedEventL; 1120 ++deletedEventL;
1115 } else { 1121 } else {
1116 if ( ! KOPrefs::instance()->mWriteBackExistingOnly ) { 1122 if ( ! KOPrefs::instance()->mWriteBackExistingOnly ) {
1117 ++addedEventR; 1123 ++addedEventR;
1118 inL->setLastModified( modifiedCalendar ); 1124 inL->setLastModified( modifiedCalendar );
1119 remote->addIncidence( inL->clone() ); 1125 remote->addIncidence( inL->clone() );
1120 } 1126 }
1121 } 1127 }
1122 } 1128 }
1123 } 1129 }
1124 } 1130 }
1125 inL = el.next(); 1131 inL = el.next();
1126 } 1132 }
1127 int delFut = 0; 1133 int delFut = 0;
1128 if ( KOPrefs::instance()->mWriteBackInFuture ) { 1134 if ( KOPrefs::instance()->mWriteBackInFuture ) {
1129 er = remote->rawIncidences(); 1135 er = remote->rawIncidences();
1130 inR = er.first(); 1136 inR = er.first();
1131 QDateTime dt; 1137 QDateTime dt;
1132 QDateTime cur = QDateTime::currentDateTime(); 1138 QDateTime cur = QDateTime::currentDateTime();
1133 QDateTime end = cur.addSecs( KOPrefs::instance()->mWriteBackInFuture * 3600 *24 *7 ); 1139 QDateTime end = cur.addSecs( KOPrefs::instance()->mWriteBackInFuture * 3600 *24 *7 );
1134 while ( inR ) { 1140 while ( inR ) {
1135 if ( inR->type() == "Todo" ) { 1141 if ( inR->type() == "Todo" ) {
1136 Todo * t = (Todo*)inR; 1142 Todo * t = (Todo*)inR;
1137 if ( t->hasDueDate() ) 1143 if ( t->hasDueDate() )
1138 dt = t->dtDue(); 1144 dt = t->dtDue();
1139 else 1145 else
1140 dt = cur.addSecs( 62 ); 1146 dt = cur.addSecs( 62 );
1141 } 1147 }
1142 else if (inR->type() == "Event" ) { 1148 else if (inR->type() == "Event" ) {
1143 bool ok; 1149 bool ok;
1144 dt = inR->getNextOccurence( cur, &ok ); 1150 dt = inR->getNextOccurence( cur, &ok );
1145 if ( !ok ) 1151 if ( !ok )
1146 dt = cur.addSecs( -62 ); 1152 dt = cur.addSecs( -62 );
1147 } 1153 }
1148 else 1154 else
1149 dt = inR->dtStart(); 1155 dt = inR->dtStart();
1150 if ( dt < cur || dt > end ) { 1156 if ( dt < cur || dt > end ) {
1151 remote->deleteIncidence( inR ); 1157 remote->deleteIncidence( inR );
1152 ++delFut; 1158 ++delFut;
1153 } 1159 }
1154 inR = er.next(); 1160 inR = er.next();
1155 } 1161 }
1156 } 1162 }
1157 bar.hide(); 1163 bar.hide();
1158 mLastCalendarSync = QDateTime::currentDateTime().addSecs( 1 ); 1164 mLastCalendarSync = QDateTime::currentDateTime().addSecs( 1 );
1159 eventLSync->setReadOnly( false ); 1165 eventLSync->setReadOnly( false );
1160 eventLSync->setDtStart( mLastCalendarSync ); 1166 eventLSync->setDtStart( mLastCalendarSync );
1161 eventRSync->setDtStart( mLastCalendarSync ); 1167 eventRSync->setDtStart( mLastCalendarSync );
1162 eventLSync->setDtEnd( mLastCalendarSync.addSecs( 3600 ) ); 1168 eventLSync->setDtEnd( mLastCalendarSync.addSecs( 3600 ) );
1163 eventRSync->setDtEnd( mLastCalendarSync.addSecs( 3600 ) ); 1169 eventRSync->setDtEnd( mLastCalendarSync.addSecs( 3600 ) );
1164 eventRSync->setLocation( i18n("Remote from: ")+mCurrentSyncName ) ; 1170 eventRSync->setLocation( i18n("Remote from: ")+mCurrentSyncName ) ;
1165 eventLSync->setLocation(i18n("Local from: ") + mCurrentSyncName ); 1171 eventLSync->setLocation(i18n("Local from: ") + mCurrentSyncName );
1166 eventLSync->setReadOnly( true ); 1172 eventLSync->setReadOnly( true );
1167 if ( mGlobalSyncMode == SYNC_MODE_NORMAL) 1173 if ( mGlobalSyncMode == SYNC_MODE_NORMAL)
1168 remote->addEvent( eventRSync ); 1174 remote->addEvent( eventRSync );
1169 QString mes; 1175 QString mes;
1170 mes .sprintf( i18n("Synchronization summary:\n\n %d items added to local\n %d items added to remote\n %d items updated on local\n %d items updated on remote\n %d items deleted on local\n %d items deleted on remote\n"),addedEvent, addedEventR, changedLocal, changedRemote, deletedEventL, deletedEventR ); 1176 mes .sprintf( i18n("Synchronization summary:\n\n %d items added to local\n %d items added to remote\n %d items updated on local\n %d items updated on remote\n %d items deleted on local\n %d items deleted on remote\n"),addedEvent, addedEventR, changedLocal, changedRemote, deletedEventL, deletedEventR );
1171 QString delmess; 1177 QString delmess;
1172 if ( delFut ) { 1178 if ( delFut ) {
1173 delmess.sprintf( i18n("%d items skipped on remote,\nbecause they are in the past or\nmore than %d weeks in the future.\n"),delFut, KOPrefs::instance()->mWriteBackInFuture ); 1179 delmess.sprintf( i18n("%d items skipped on remote,\nbecause they are in the past or\nmore than %d weeks in the future.\n"),delFut, KOPrefs::instance()->mWriteBackInFuture );
1174 mes += delmess; 1180 mes += delmess;
1175 } 1181 }
1176 if ( KOPrefs::instance()->mShowSyncSummary ) { 1182 if ( KOPrefs::instance()->mShowSyncSummary ) {
1177 KMessageBox::information(this, mes, i18n("KO/Pi Synchronization") ); 1183 KMessageBox::information(this, mes, i18n("KO/Pi Synchronization") );
1178 } 1184 }
1179 qDebug( mes ); 1185 qDebug( mes );
1180 mCalendar->checkAlarmForIncidence( 0, true ); 1186 mCalendar->checkAlarmForIncidence( 0, true );
1181 return syncOK; 1187 return syncOK;
1182} 1188}
1183 1189
1184void CalendarView::setSyncDevice( QString s ) 1190void CalendarView::setSyncDevice( QString s )
1185{ 1191{
1186 mCurrentSyncDevice= s; 1192 mCurrentSyncDevice= s;
1187} 1193}
1188void CalendarView::setSyncName( QString s ) 1194void CalendarView::setSyncName( QString s )
1189{ 1195{
1190 mCurrentSyncName= s; 1196 mCurrentSyncName= s;
1191} 1197}
1192bool CalendarView::syncCalendar(QString filename, int mode) 1198bool CalendarView::syncCalendar(QString filename, int mode)
1193{ 1199{
1194 mGlobalSyncMode = SYNC_MODE_NORMAL; 1200 mGlobalSyncMode = SYNC_MODE_NORMAL;
1195 CalendarLocal* calendar = new CalendarLocal(); 1201 CalendarLocal* calendar = new CalendarLocal();
1196 calendar->setTimeZoneId(KOPrefs::instance()->mTimeZoneId); 1202 calendar->setTimeZoneId(KOPrefs::instance()->mTimeZoneId);
1197 FileStorage* storage = new FileStorage( calendar ); 1203 FileStorage* storage = new FileStorage( calendar );
1198 bool syncOK = false; 1204 bool syncOK = false;
1199 storage->setFileName( filename ); 1205 storage->setFileName( filename );
1200 // qDebug("loading ... "); 1206 // qDebug("loading ... ");
1201 if ( storage->load(KOPrefs::instance()->mUseQuicksave) ) { 1207 if ( storage->load(KOPrefs::instance()->mUseQuicksave) ) {
1202 getEventViewerDialog()->setSyncMode( true ); 1208 getEventViewerDialog()->setSyncMode( true );
1203 syncOK = synchronizeCalendar( mCalendar, calendar, mode ); 1209 syncOK = synchronizeCalendar( mCalendar, calendar, mode );
1204 getEventViewerDialog()->setSyncMode( false ); 1210 getEventViewerDialog()->setSyncMode( false );
1205 if ( syncOK ) { 1211 if ( syncOK ) {
1206 if ( KOPrefs::instance()->mWriteBackFile ) 1212 if ( KOPrefs::instance()->mWriteBackFile )
1207 { 1213 {
1208 storage->setSaveFormat( new ICalFormat( KOPrefs::instance()->mUseQuicksave) ); 1214 storage->setSaveFormat( new ICalFormat( KOPrefs::instance()->mUseQuicksave) );
1209 storage->save(); 1215 storage->save();
1210 } 1216 }
1211 } 1217 }
1212 setModified( true ); 1218 setModified( true );
1213 } 1219 }
1214 delete storage; 1220 delete storage;
1215 delete calendar; 1221 delete calendar;
1216 if ( syncOK ) 1222 if ( syncOK )
1217 updateView(); 1223 updateView();
1218 return syncOK; 1224 return syncOK;
1219} 1225}
1220void CalendarView::syncPhone() 1226void CalendarView::syncPhone()
1221{ 1227{
1222 syncExternal( 1 ); 1228 syncExternal( 1 );
1223} 1229}
1224void CalendarView::syncExternal( int mode ) 1230void CalendarView::syncExternal( int mode )
1225{ 1231{
1226 mGlobalSyncMode = SYNC_MODE_EXTERNAL; 1232 mGlobalSyncMode = SYNC_MODE_EXTERNAL;
1227 //mCurrentSyncDevice = "sharp-DTM"; 1233 //mCurrentSyncDevice = "sharp-DTM";
1228 if ( KOPrefs::instance()->mAskForPreferences ) 1234 if ( KOPrefs::instance()->mAskForPreferences )
1229 edit_sync_options(); 1235 edit_sync_options();
1230 qApp->processEvents(); 1236 qApp->processEvents();
1231 CalendarLocal* calendar = new CalendarLocal(); 1237 CalendarLocal* calendar = new CalendarLocal();
1232 calendar->setTimeZoneId(KOPrefs::instance()->mTimeZoneId); 1238 calendar->setTimeZoneId(KOPrefs::instance()->mTimeZoneId);
1233 bool syncOK = false; 1239 bool syncOK = false;
1234 bool loadSuccess = false; 1240 bool loadSuccess = false;
1235 PhoneFormat* phoneFormat = 0; 1241 PhoneFormat* phoneFormat = 0;
1236#ifndef DESKTOP_VERSION 1242#ifndef DESKTOP_VERSION
1237 SharpFormat* sharpFormat = 0; 1243 SharpFormat* sharpFormat = 0;
1238 if ( mode == 0 ) { // sharp 1244 if ( mode == 0 ) { // sharp
1239 sharpFormat = new SharpFormat () ; 1245 sharpFormat = new SharpFormat () ;
1240 loadSuccess = sharpFormat->load( calendar, mCalendar ); 1246 loadSuccess = sharpFormat->load( calendar, mCalendar );
1241 1247
1242 } else 1248 } else
1243#endif 1249#endif
1244 if ( mode == 1 ) { // phone 1250 if ( mode == 1 ) { // phone
1245 phoneFormat = new PhoneFormat (mCurrentSyncDevice, 1251 phoneFormat = new PhoneFormat (mCurrentSyncDevice,
1246 KOPrefs::instance()->mPhoneDevice, 1252 KOPrefs::instance()->mPhoneDevice,
1247 KOPrefs::instance()->mPhoneConnection, 1253 KOPrefs::instance()->mPhoneConnection,
1248 KOPrefs::instance()->mPhoneModel); 1254 KOPrefs::instance()->mPhoneModel);
1249 loadSuccess = phoneFormat->load( calendar,mCalendar); 1255 loadSuccess = phoneFormat->load( calendar,mCalendar);
1250 1256
1251 } else 1257 } else
1252 return; 1258 return;
1253 if ( loadSuccess ) { 1259 if ( loadSuccess ) {
1254 getEventViewerDialog()->setSyncMode( true ); 1260 getEventViewerDialog()->setSyncMode( true );
1255 syncOK = synchronizeCalendar( mCalendar, calendar, KOPrefs::instance()->mSyncAlgoPrefs ); 1261 syncOK = synchronizeCalendar( mCalendar, calendar, KOPrefs::instance()->mSyncAlgoPrefs );
1256 getEventViewerDialog()->setSyncMode( false ); 1262 getEventViewerDialog()->setSyncMode( false );
1257 qApp->processEvents(); 1263 qApp->processEvents();
1258 if ( syncOK ) { 1264 if ( syncOK ) {
1259 if ( KOPrefs::instance()->mWriteBackFile ) 1265 if ( KOPrefs::instance()->mWriteBackFile )
1260 { 1266 {
1261 QPtrList<Incidence> iL = mCalendar->rawIncidences(); 1267 QPtrList<Incidence> iL = mCalendar->rawIncidences();
1262 Incidence* inc = iL.first(); 1268 Incidence* inc = iL.first();
1263 if ( phoneFormat ) { 1269 if ( phoneFormat ) {
1264 while ( inc ) { 1270 while ( inc ) {
1265 inc->removeID(mCurrentSyncDevice); 1271 inc->removeID(mCurrentSyncDevice);
1266 inc = iL.next(); 1272 inc = iL.next();
1267 } 1273 }
1268 } 1274 }
1269#ifndef DESKTOP_VERSION 1275#ifndef DESKTOP_VERSION
1270 if ( sharpFormat ) 1276 if ( sharpFormat )
1271 sharpFormat->save(calendar); 1277 sharpFormat->save(calendar);
1272#endif 1278#endif
1273 if ( phoneFormat ) 1279 if ( phoneFormat )
1274 phoneFormat->save(calendar); 1280 phoneFormat->save(calendar);
1275 iL = calendar->rawIncidences(); 1281 iL = calendar->rawIncidences();
1276 inc = iL.first(); 1282 inc = iL.first();
1277 Incidence* loc; 1283 Incidence* loc;
1278 while ( inc ) { 1284 while ( inc ) {
1279 if ( inc->tempSyncStat() == SYNC_TEMPSTATE_NEW_ID ) { 1285 if ( inc->tempSyncStat() == SYNC_TEMPSTATE_NEW_ID ) {
1280 loc = mCalendar->incidence(inc->uid() ); 1286 loc = mCalendar->incidence(inc->uid() );
1281 if ( loc ) { 1287 if ( loc ) {
1282 loc->setID(mCurrentSyncDevice, inc->getID(mCurrentSyncDevice) ); 1288 loc->setID(mCurrentSyncDevice, inc->getID(mCurrentSyncDevice) );
1283 loc->setCsum( mCurrentSyncDevice, inc->getCsum(mCurrentSyncDevice) ); 1289 loc->setCsum( mCurrentSyncDevice, inc->getCsum(mCurrentSyncDevice) );
1284 } 1290 }
1285 } 1291 }
1286 inc = iL.next(); 1292 inc = iL.next();
1287 } 1293 }
1288 Incidence* lse = getLastSyncEvent(); 1294 Incidence* lse = getLastSyncEvent();
1289 if ( lse ) { 1295 if ( lse ) {
1290 lse->setReadOnly( false ); 1296 lse->setReadOnly( false );
1291 lse->setDescription( "" ); 1297 lse->setDescription( "" );
1292 lse->setReadOnly( true ); 1298 lse->setReadOnly( true );
1293 } 1299 }
1294 } 1300 }
1295 } 1301 }
1296 setModified( true ); 1302 setModified( true );
1297 } else { 1303 } else {
1298 QString question = i18n("Sorry, the database access\ncommand failed!\n\nNothing synced!\n") ; 1304 QString question = i18n("Sorry, the database access\ncommand failed!\n\nNothing synced!\n") ;
1299 QMessageBox::information( 0, i18n("KO/Pi Import - ERROR"), 1305 QMessageBox::information( 0, i18n("KO/Pi Import - ERROR"),
1300 question, i18n("Ok")) ; 1306 question, i18n("Ok")) ;
1301 1307
1302 } 1308 }
1303 delete calendar; 1309 delete calendar;
1304 updateView(); 1310 updateView();
1305 return ;//syncOK; 1311 return ;//syncOK;
1306 1312
1307} 1313}
1308void CalendarView::syncSharp() 1314void CalendarView::syncSharp()
1309{ 1315{
1310 syncExternal( 0 ); 1316 syncExternal( 0 );
1311 1317
1312} 1318}
1313 1319
1314 1320
1315#include <kabc/stdaddressbook.h> 1321#include <kabc/stdaddressbook.h>
1316bool CalendarView::importBday() 1322bool CalendarView::importBday()
1317{ 1323{
1318 KABC::StdAddressBook* AddressBook = KABC::StdAddressBook::self( true ); 1324 KABC::StdAddressBook* AddressBook = KABC::StdAddressBook::self( true );
1319 KABC::AddressBook::Iterator it; 1325 KABC::AddressBook::Iterator it;
1320 int count = 0; 1326 int count = 0;
1321 for( it = AddressBook->begin(); it != AddressBook->end(); ++it ) { 1327 for( it = AddressBook->begin(); it != AddressBook->end(); ++it ) {
1322 ++count; 1328 ++count;
1323 } 1329 }
1324 QProgressBar bar(count,0 ); 1330 QProgressBar bar(count,0 );
1325 int w = 300; 1331 int w = 300;
1326 if ( QApplication::desktop()->width() < 320 ) 1332 if ( QApplication::desktop()->width() < 320 )
1327 w = 220; 1333 w = 220;
1328 int h = bar.sizeHint().height() ; 1334 int h = bar.sizeHint().height() ;
1329 int dw = QApplication::desktop()->width(); 1335 int dw = QApplication::desktop()->width();
1330 int dh = QApplication::desktop()->height(); 1336 int dh = QApplication::desktop()->height();
1331 bar.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 1337 bar.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
1332 bar.show(); 1338 bar.show();
1333 bar.setCaption (i18n("Reading addressbook - close to abort!") ); 1339 bar.setCaption (i18n("Reading addressbook - close to abort!") );
1334 qApp->processEvents(); 1340 qApp->processEvents();
1335 count = 0; 1341 count = 0;
1336 int addCount = 0; 1342 int addCount = 0;
1337 KCal::Attendee* a = 0; 1343 KCal::Attendee* a = 0;
1338 for( it = AddressBook->begin(); it != AddressBook->end(); ++it ) { 1344 for( it = AddressBook->begin(); it != AddressBook->end(); ++it ) {
1339 if ( ! bar.isVisible() ) 1345 if ( ! bar.isVisible() )
1340 return false; 1346 return false;
1341 bar.setProgress( count++ ); 1347 bar.setProgress( count++ );
1342 qApp->processEvents(); 1348 qApp->processEvents();
1343 //qDebug("add BDay %s %s", (*it).realName().latin1(),(*it).birthday().date().toString().latin1() ); 1349 //qDebug("add BDay %s %s", (*it).realName().latin1(),(*it).birthday().date().toString().latin1() );
1344 if ( (*it).birthday().date().isValid() ){ 1350 if ( (*it).birthday().date().isValid() ){
1345 a = new KCal::Attendee( (*it).realName(), (*it).preferredEmail(),false,KCal::Attendee::NeedsAction,KCal::Attendee::ReqParticipant,(*it).uid()) ; 1351 a = new KCal::Attendee( (*it).realName(), (*it).preferredEmail(),false,KCal::Attendee::NeedsAction,KCal::Attendee::ReqParticipant,(*it).uid()) ;
1346 if ( addAnniversary( (*it).birthday().date(), (*it).assembledName(), a, true ) ) 1352 if ( addAnniversary( (*it).birthday().date(), (*it).assembledName(), a, true ) )
1347 ++addCount; 1353 ++addCount;
1348 } 1354 }
1349 QDate anni = KGlobal::locale()->readDate( (*it).custom("KADDRESSBOOK", "X-Anniversary" ), "%Y-%m-%d"); 1355 QDate anni = KGlobal::locale()->readDate( (*it).custom("KADDRESSBOOK", "X-Anniversary" ), "%Y-%m-%d");
1350 if ( anni.isValid() ){ 1356 if ( anni.isValid() ){
1351 a = new KCal::Attendee( (*it).realName(), (*it).preferredEmail(),false,KCal::Attendee::NeedsAction,KCal::Attendee::ReqParticipant,(*it).uid()) ; 1357 a = new KCal::Attendee( (*it).realName(), (*it).preferredEmail(),false,KCal::Attendee::NeedsAction,KCal::Attendee::ReqParticipant,(*it).uid()) ;
1352 if ( addAnniversary( anni, (*it).assembledName(), a, false ) ) 1358 if ( addAnniversary( anni, (*it).assembledName(), a, false ) )
1353 ++addCount; 1359 ++addCount;
1354 } 1360 }
1355 } 1361 }
1356 updateView(); 1362 updateView();
1357 topLevelWidget()->setCaption(QString::number( addCount )+ i18n(" birthdays/anniversaries added!")); 1363 topLevelWidget()->setCaption(QString::number( addCount )+ i18n(" birthdays/anniversaries added!"));
1358 return true; 1364 return true;
1359} 1365}
1360 1366
1361bool CalendarView::addAnniversary( QDate date, QString name, KCal::Attendee* a, bool birthday) 1367bool CalendarView::addAnniversary( QDate date, QString name, KCal::Attendee* a, bool birthday)
1362{ 1368{
1363 //qDebug("addAnni "); 1369 //qDebug("addAnni ");
1364 Event * ev = new Event(); 1370 Event * ev = new Event();
1365 if ( a ) { 1371 if ( a ) {
1366 ev->addAttendee( a ); 1372 ev->addAttendee( a );
1367 } 1373 }
1368 QString kind; 1374 QString kind;
1369 if ( birthday ) 1375 if ( birthday )
1370 kind = i18n( "Birthday" ); 1376 kind = i18n( "Birthday" );
1371 else 1377 else
1372 kind = i18n( "Anniversary" ); 1378 kind = i18n( "Anniversary" );
1373 ev->setSummary( name + " - " + kind ); 1379 ev->setSummary( name + " - " + kind );
1374 ev->setOrganizer( "nobody@nowhere" ); 1380 ev->setOrganizer( "nobody@nowhere" );
1375 ev->setCategories( kind ); 1381 ev->setCategories( kind );
1376 ev->setDtStart( QDateTime(date) ); 1382 ev->setDtStart( QDateTime(date) );
1377 ev->setDtEnd( QDateTime(date) ); 1383 ev->setDtEnd( QDateTime(date) );
1378 ev->setFloats( true ); 1384 ev->setFloats( true );
1379 Recurrence * rec = ev->recurrence(); 1385 Recurrence * rec = ev->recurrence();
1380 rec->setYearly(Recurrence::rYearlyMonth,1,-1); 1386 rec->setYearly(Recurrence::rYearlyMonth,1,-1);
1381 rec->addYearlyNum( date.month() ); 1387 rec->addYearlyNum( date.month() );
1382 if ( !mCalendar->addAnniversaryNoDup( ev ) ) { 1388 if ( !mCalendar->addAnniversaryNoDup( ev ) ) {
1383 delete ev; 1389 delete ev;
1384 return false; 1390 return false;
1385 } 1391 }
1386 return true; 1392 return true;
1387 1393
1388} 1394}
1389bool CalendarView::importQtopia( const QString &categories, 1395bool CalendarView::importQtopia( const QString &categories,
1390 const QString &datebook, 1396 const QString &datebook,
1391 const QString &todolist ) 1397 const QString &todolist )
1392{ 1398{
1393 1399
1394 QtopiaFormat qtopiaFormat; 1400 QtopiaFormat qtopiaFormat;
1395 qtopiaFormat.setCategoriesList ( &(KOPrefs::instance()->mCustomCategories)); 1401 qtopiaFormat.setCategoriesList ( &(KOPrefs::instance()->mCustomCategories));
1396 if ( !categories.isEmpty() ) qtopiaFormat.load( mCalendar, categories ); 1402 if ( !categories.isEmpty() ) qtopiaFormat.load( mCalendar, categories );
1397 if ( !datebook.isEmpty() ) qtopiaFormat.load( mCalendar, datebook ); 1403 if ( !datebook.isEmpty() ) qtopiaFormat.load( mCalendar, datebook );
1398 if ( !todolist.isEmpty() ) qtopiaFormat.load( mCalendar, todolist ); 1404 if ( !todolist.isEmpty() ) qtopiaFormat.load( mCalendar, todolist );
1399 1405
1400 updateView(); 1406 updateView();
1401 return true; 1407 return true;
1402 1408
1403#if 0 1409#if 0
1404 mGlobalSyncMode = SYNC_MODE_QTOPIA; 1410 mGlobalSyncMode = SYNC_MODE_QTOPIA;
1405 mCurrentSyncDevice = "qtopia-XML"; 1411 mCurrentSyncDevice = "qtopia-XML";
1406 if ( KOPrefs::instance()->mAskForPreferences ) 1412 if ( KOPrefs::instance()->mAskForPreferences )
1407 edit_sync_options(); 1413 edit_sync_options();
1408 qApp->processEvents(); 1414 qApp->processEvents();
1409 CalendarLocal* calendar = new CalendarLocal(); 1415 CalendarLocal* calendar = new CalendarLocal();
1410 calendar->setTimeZoneId(KOPrefs::instance()->mTimeZoneId); 1416 calendar->setTimeZoneId(KOPrefs::instance()->mTimeZoneId);
1411 bool syncOK = false; 1417 bool syncOK = false;
1412 QtopiaFormat qtopiaFormat; 1418 QtopiaFormat qtopiaFormat;
1413 qtopiaFormat.setCategoriesList ( &(KOPrefs::instance()->mCustomCategories)); 1419 qtopiaFormat.setCategoriesList ( &(KOPrefs::instance()->mCustomCategories));
1414 bool loadOk = true; 1420 bool loadOk = true;
1415 if ( !categories.isEmpty() ) 1421 if ( !categories.isEmpty() )
1416 loadOk = qtopiaFormat.load( calendar, categories ); 1422 loadOk = qtopiaFormat.load( calendar, categories );
1417 if ( loadOk && !datebook.isEmpty() ) 1423 if ( loadOk && !datebook.isEmpty() )
1418 loadOk = qtopiaFormat.load( calendar, datebook ); 1424 loadOk = qtopiaFormat.load( calendar, datebook );
1419 if ( loadOk && !todolist.isEmpty() ) 1425 if ( loadOk && !todolist.isEmpty() )
1420 loadOk = qtopiaFormat.load( calendar, todolist ); 1426 loadOk = qtopiaFormat.load( calendar, todolist );
1421 1427
1422 if ( loadOk ) { 1428 if ( loadOk ) {
1423 getEventViewerDialog()->setSyncMode( true ); 1429 getEventViewerDialog()->setSyncMode( true );
1424 syncOK = synchronizeCalendar( mCalendar, calendar, KOPrefs::instance()->mSyncAlgoPrefs ); 1430 syncOK = synchronizeCalendar( mCalendar, calendar, KOPrefs::instance()->mSyncAlgoPrefs );
1425 getEventViewerDialog()->setSyncMode( false ); 1431 getEventViewerDialog()->setSyncMode( false );
1426 qApp->processEvents(); 1432 qApp->processEvents();
1427 if ( syncOK ) { 1433 if ( syncOK ) {
1428 if ( KOPrefs::instance()->mWriteBackFile ) 1434 if ( KOPrefs::instance()->mWriteBackFile )
1429 { 1435 {
1430 // write back XML file 1436 // write back XML file
1431 1437
1432 } 1438 }
1433 setModified( true ); 1439 setModified( true );
1434 } 1440 }
1435 } else { 1441 } else {
1436 QString question = i18n("Sorry, the file loading\ncommand failed!\n\nNothing synced!\n") ; 1442 QString question = i18n("Sorry, the file loading\ncommand failed!\n\nNothing synced!\n") ;
1437 QMessageBox::information( 0, i18n("KO/Pi Sync - ERROR"), 1443 QMessageBox::information( 0, i18n("KO/Pi Sync - ERROR"),
1438 question, i18n("Ok")) ; 1444 question, i18n("Ok")) ;
1439 } 1445 }
1440 delete calendar; 1446 delete calendar;
1441 updateView(); 1447 updateView();
1442 return syncOK; 1448 return syncOK;
1443 1449
1444 1450
1445#endif 1451#endif
1446 1452
1447} 1453}
1448 1454
1449void CalendarView::setSyncEventsReadOnly() 1455void CalendarView::setSyncEventsReadOnly()
1450{ 1456{
1451 Event * ev; 1457 Event * ev;
1452 QPtrList<Event> eL = mCalendar->rawEvents(); 1458 QPtrList<Event> eL = mCalendar->rawEvents();
1453 ev = eL.first(); 1459 ev = eL.first();
1454 while ( ev ) { 1460 while ( ev ) {
1455 if ( ev->uid().left(15) == QString("last-syncEvent-") ) 1461 if ( ev->uid().left(15) == QString("last-syncEvent-") )
1456 ev->setReadOnly( true ); 1462 ev->setReadOnly( true );
1457 ev = eL.next(); 1463 ev = eL.next();
1458 } 1464 }
1459} 1465}
1460bool CalendarView::openCalendar(QString filename, bool merge) 1466bool CalendarView::openCalendar(QString filename, bool merge)
1461{ 1467{
1462 1468
1463 if (filename.isEmpty()) { 1469 if (filename.isEmpty()) {
1464 return false; 1470 return false;
1465 } 1471 }
1466 1472
1467 if (!QFile::exists(filename)) { 1473 if (!QFile::exists(filename)) {
1468 KMessageBox::error(this,i18n("File does not exist:\n '%1'.").arg(filename)); 1474 KMessageBox::error(this,i18n("File does not exist:\n '%1'.").arg(filename));
1469 return false; 1475 return false;
1470 } 1476 }
1471 1477
1472 globalFlagBlockAgenda = 1; 1478 globalFlagBlockAgenda = 1;
1473 if (!merge) mCalendar->close(); 1479 if (!merge) mCalendar->close();
1474 1480
1475 mStorage->setFileName( filename ); 1481 mStorage->setFileName( filename );
1476 1482
1477 if ( mStorage->load(KOPrefs::instance()->mUseQuicksave) ) { 1483 if ( mStorage->load(KOPrefs::instance()->mUseQuicksave) ) {
1478 if ( merge ) ;//setModified( true ); 1484 if ( merge ) ;//setModified( true );
1479 else { 1485 else {
1480 //setModified( true ); 1486 //setModified( true );
1481 mViewManager->setDocumentId( filename ); 1487 mViewManager->setDocumentId( filename );
1482 mDialogManager->setDocumentId( filename ); 1488 mDialogManager->setDocumentId( filename );
1483 mTodoList->setDocumentId( filename ); 1489 mTodoList->setDocumentId( filename );
1484 } 1490 }
1485 globalFlagBlockAgenda = 2; 1491 globalFlagBlockAgenda = 2;
1486 // if ( getLastSyncEvent() ) 1492 // if ( getLastSyncEvent() )
1487 // getLastSyncEvent()->setReadOnly( true ); 1493 // getLastSyncEvent()->setReadOnly( true );
1488 mCalendar->reInitAlarmSettings(); 1494 mCalendar->reInitAlarmSettings();
1489 setSyncEventsReadOnly(); 1495 setSyncEventsReadOnly();
1490 updateUnmanagedViews(); 1496 updateUnmanagedViews();
1491 updateView(); 1497 updateView();
1492 if ( filename != MainWindow::defaultFileName() ) 1498 if ( filename != MainWindow::defaultFileName() )
1493 saveCalendar( MainWindow::defaultFileName() ); 1499 saveCalendar( MainWindow::defaultFileName() );
1494 loadedFileVersion = QDateTime::currentDateTime(); 1500 loadedFileVersion = QDateTime::currentDateTime();
1495 return true; 1501 return true;
1496 } else { 1502 } else {
1497 // while failing to load, the calendar object could 1503 // while failing to load, the calendar object could
1498 // have become partially populated. Clear it out. 1504 // have become partially populated. Clear it out.
1499 if ( !merge ) mCalendar->close(); 1505 if ( !merge ) mCalendar->close();
1500 1506
1501 KMessageBox::error(this,i18n("Couldn't load calendar\n '%1'.").arg(filename)); 1507 KMessageBox::error(this,i18n("Couldn't load calendar\n '%1'.").arg(filename));
1502 1508
1503 globalFlagBlockAgenda = 2; 1509 globalFlagBlockAgenda = 2;
1504 updateView(); 1510 updateView();
1505 } 1511 }
1506 return false; 1512 return false;
1507} 1513}
1508void CalendarView::setLoadedFileVersion(QDateTime dt) 1514void CalendarView::setLoadedFileVersion(QDateTime dt)
1509{ 1515{
1510 loadedFileVersion = dt; 1516 loadedFileVersion = dt;
1511} 1517}
1512bool CalendarView::checkFileChanged(QString fn) 1518bool CalendarView::checkFileChanged(QString fn)
1513{ 1519{
1514 QFileInfo finf ( fn ); 1520 QFileInfo finf ( fn );
1515 if ( !finf.exists() ) 1521 if ( !finf.exists() )
1516 return true; 1522 return true;
1517 QDateTime dt = finf.lastModified (); 1523 QDateTime dt = finf.lastModified ();
1518 if ( dt <= loadedFileVersion ) 1524 if ( dt <= loadedFileVersion )
1519 return false; 1525 return false;
1520 return true; 1526 return true;
1521 1527
1522} 1528}
1523bool CalendarView::checkFileVersion(QString fn) 1529bool CalendarView::checkFileVersion(QString fn)
1524{ 1530{
1525 QFileInfo finf ( fn ); 1531 QFileInfo finf ( fn );
1526 if ( !finf.exists() ) 1532 if ( !finf.exists() )
1527 return true; 1533 return true;
1528 QDateTime dt = finf.lastModified (); 1534 QDateTime dt = finf.lastModified ();
1529 //qDebug("loaded file version %s",loadedFileVersion.toString().latin1()); 1535 //qDebug("loaded file version %s",loadedFileVersion.toString().latin1());
1530 //qDebug("file on disk version %s",dt.toString().latin1()); 1536 //qDebug("file on disk version %s",dt.toString().latin1());
1531 if ( dt <= loadedFileVersion ) 1537 if ( dt <= loadedFileVersion )
1532 return true; 1538 return true;
1533 int km = KMessageBox::warningYesNoCancel(this, i18n("\nThe file on disk has changed!\nFile size: %1 bytes.\nLast modified: %2\nDo you want to:\n\n - Save and overwrite file?\n - Sync with file, then save?\n - Cancel without saving? \n").arg( QString::number( finf.size())).arg( KGlobal::locale()->formatDateTime(finf.lastModified (), true, false)) , 1539 int km = KMessageBox::warningYesNoCancel(this, i18n("\nThe file on disk has changed!\nFile size: %1 bytes.\nLast modified: %2\nDo you want to:\n\n - Save and overwrite file?\n - Sync with file, then save?\n - Cancel without saving? \n").arg( QString::number( finf.size())).arg( KGlobal::locale()->formatDateTime(finf.lastModified (), true, false)) ,
1534 i18n("KO/Pi Warning"),i18n("Overwrite"), 1540 i18n("KO/Pi Warning"),i18n("Overwrite"),
1535 i18n("Sync+save")); 1541 i18n("Sync+save"));
1536 1542
1537 if ( km == KMessageBox::Cancel ) 1543 if ( km == KMessageBox::Cancel )
1538 return false; 1544 return false;
1539 if ( km == KMessageBox::Yes ) 1545 if ( km == KMessageBox::Yes )
1540 return true; 1546 return true;
1541 1547
1542 setSyncDevice("deleteaftersync" ); 1548 setSyncDevice("deleteaftersync" );
1543 KOPrefs::instance()->mAskForPreferences = true; 1549 KOPrefs::instance()->mAskForPreferences = true;
1544 KOPrefs::instance()->mSyncAlgoPrefs = 3; 1550 KOPrefs::instance()->mSyncAlgoPrefs = 3;
1545 KOPrefs::instance()->mWriteBackFile = false; 1551 KOPrefs::instance()->mWriteBackFile = false;
1546 KOPrefs::instance()->mWriteBackExistingOnly = false; 1552 KOPrefs::instance()->mWriteBackExistingOnly = false;
1547 KOPrefs::instance()->mShowSyncSummary = false; 1553 KOPrefs::instance()->mShowSyncSummary = false;
1548 syncCalendar( fn, 3 ); 1554 syncCalendar( fn, 3 );
1549 Event * e = getLastSyncEvent(); 1555 Event * e = getLastSyncEvent();
1550 mCalendar->deleteEvent ( e ); 1556 mCalendar->deleteEvent ( e );
1551 updateView(); 1557 updateView();
1552 return true; 1558 return true;
1553} 1559}
1554 1560
1555bool CalendarView::saveCalendar( QString filename ) 1561bool CalendarView::saveCalendar( QString filename )
1556{ 1562{
1557 1563
1558 // Store back all unsaved data into calendar object 1564 // Store back all unsaved data into calendar object
1559 // qDebug("file %s %d ", filename.latin1() , mViewManager->currentView() ); 1565 // qDebug("file %s %d ", filename.latin1() , mViewManager->currentView() );
1560 if ( mViewManager->currentView() ) 1566 if ( mViewManager->currentView() )
1561 mViewManager->currentView()->flushView(); 1567 mViewManager->currentView()->flushView();
1562 1568
1563 //mStorage->setFileName( filename ); 1569 //mStorage->setFileName( filename );
1564 1570
1565 mStorage->setSaveFormat( new ICalFormat( KOPrefs::instance()->mUseQuicksave) ); 1571 mStorage->setSaveFormat( new ICalFormat( KOPrefs::instance()->mUseQuicksave) );
1566 mStorage->setFileName( filename ); 1572 mStorage->setFileName( filename );
1567 bool success; 1573 bool success;
1568 success = mStorage->save(); 1574 success = mStorage->save();
1569 if ( !success ) { 1575 if ( !success ) {
1570 return false; 1576 return false;
1571 } 1577 }
1572 1578
1573 return true; 1579 return true;
1574} 1580}
1575 1581
1576void CalendarView::closeCalendar() 1582void CalendarView::closeCalendar()
1577{ 1583{
1578 1584
1579 // child windows no longer valid 1585 // child windows no longer valid
1580 emit closingDown(); 1586 emit closingDown();
1581 1587
1582 mCalendar->close(); 1588 mCalendar->close();
1583 setModified(false); 1589 setModified(false);
1584 updateView(); 1590 updateView();
1585} 1591}
1586 1592
1587void CalendarView::archiveCalendar() 1593void CalendarView::archiveCalendar()
1588{ 1594{
1589 mDialogManager->showArchiveDialog(); 1595 mDialogManager->showArchiveDialog();
1590} 1596}
1591 1597
1592 1598
1593void CalendarView::readSettings() 1599void CalendarView::readSettings()
1594{ 1600{
1595 1601
1596 1602
1597 // mViewManager->showAgendaView(); 1603 // mViewManager->showAgendaView();
1598 QString str; 1604 QString str;
1599 //qDebug("CalendarView::readSettings() "); 1605 //qDebug("CalendarView::readSettings() ");
1600 // read settings from the KConfig, supplying reasonable 1606 // read settings from the KConfig, supplying reasonable
1601 // defaults where none are to be found 1607 // defaults where none are to be found
1602 KConfig *config = KOGlobals::config(); 1608 KConfig *config = KOGlobals::config();
1603#ifndef KORG_NOSPLITTER 1609#ifndef KORG_NOSPLITTER
1604 config->setGroup("KOrganizer Geometry"); 1610 config->setGroup("KOrganizer Geometry");
1605 1611
1606 QValueList<int> sizes = config->readIntListEntry("Separator1"); 1612 QValueList<int> sizes = config->readIntListEntry("Separator1");
1607 if (sizes.count() != 2) { 1613 if (sizes.count() != 2) {
1608 sizes << mDateNavigator->minimumSizeHint().width(); 1614 sizes << mDateNavigator->minimumSizeHint().width();
1609 sizes << 300; 1615 sizes << 300;
1610 } 1616 }
1611 mPanner->setSizes(sizes); 1617 mPanner->setSizes(sizes);
1612 1618
1613 sizes = config->readIntListEntry("Separator2"); 1619 sizes = config->readIntListEntry("Separator2");
1614 if ( ( mResourceView && sizes.count() == 4 ) || 1620 if ( ( mResourceView && sizes.count() == 4 ) ||
1615 ( !mResourceView && sizes.count() == 3 ) ) { 1621 ( !mResourceView && sizes.count() == 3 ) ) {
1616 mLeftSplitter->setSizes(sizes); 1622 mLeftSplitter->setSizes(sizes);
1617 } 1623 }
1618#endif 1624#endif
1619 globalFlagBlockAgenda = 1; 1625 globalFlagBlockAgenda = 1;
diff --git a/libkcal/alarm.cpp b/libkcal/alarm.cpp
index 29e6205..1fc7169 100644
--- a/libkcal/alarm.cpp
+++ b/libkcal/alarm.cpp
@@ -1,423 +1,457 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 1998 Preston Brown 3 Copyright (c) 1998 Preston Brown
4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 4 Copyright (c) 2001 Cornelius Schumacher <schumacher@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 <kdebug.h> 22#include <kdebug.h>
23 23
24#include "incidence.h" 24#include "incidence.h"
25#include "todo.h" 25#include "todo.h"
26 26
27#include "alarm.h" 27#include "alarm.h"
28 28
29using namespace KCal; 29using namespace KCal;
30#include <qwidget.h> 30#include <qwidget.h>
31Alarm::Alarm(Incidence *parent) 31Alarm::Alarm(Incidence *parent)
32 : mParent(parent), 32 : mParent(parent),
33 mType(Audio), 33 mType(Audio),
34 mDescription(""), // to make operator==() not fail 34 mDescription(""), // to make operator==() not fail
35 mFile(""), // to make operator==() not fail 35 mFile(""), // to make operator==() not fail
36 mMailSubject(""), // to make operator==() not fail 36 mMailSubject(""), // to make operator==() not fail
37 mAlarmSnoozeTime(5), 37 mAlarmSnoozeTime(5),
38 mAlarmRepeatCount(0), 38 mAlarmRepeatCount(0),
39 mEndOffset(false), 39 mEndOffset(false),
40 mHasTime(false), 40 mHasTime(false),
41 mAlarmEnabled(false) 41 mAlarmEnabled(false)
42{ 42{
43 43
44} 44}
45 45
46Alarm::~Alarm() 46Alarm::~Alarm()
47{ 47{
48} 48}
49 49
50bool Alarm::operator==( const Alarm& rhs ) const 50bool Alarm::operator==( const Alarm& rhs ) const
51{ 51{
52
52 if ( mType != rhs.mType || 53 if ( mType != rhs.mType ||
53 mAlarmSnoozeTime != rhs.mAlarmSnoozeTime || 54 mAlarmSnoozeTime != rhs.mAlarmSnoozeTime ||
54 mAlarmRepeatCount != rhs.mAlarmRepeatCount || 55 mAlarmRepeatCount != rhs.mAlarmRepeatCount ||
55 mAlarmEnabled != rhs.mAlarmEnabled || 56 mAlarmEnabled != rhs.mAlarmEnabled ||
56 mHasTime != rhs.mHasTime) 57 mHasTime != rhs.mHasTime)
57 return false; 58 return false;
58 59
60#if 0
61 if ( mType != rhs.mType ) {
62
63 qDebug("aaa1 ");
64 return false;
65 }
66
67 if ( mAlarmSnoozeTime != rhs.mAlarmSnoozeTime ) {
68
69 qDebug("aaa2 ");
70 return false;
71 }
72
73
74 if ( mAlarmRepeatCount != rhs.mAlarmRepeatCount ) {
75
76 qDebug("aaa3 ");
77 return false;
78 }
79
80 if ( mAlarmEnabled != rhs.mAlarmEnabled ) {
81
82 qDebug("aaa4 ");
83 return false;
84 }
85
86 if ( mHasTime != rhs.mHasTime ) {
87
88 qDebug("aaa5 ");
89 return false;
90 }
91#endif
92
93
59 if (mHasTime) { 94 if (mHasTime) {
60 if (mAlarmTime != rhs.mAlarmTime) 95 if (mAlarmTime != rhs.mAlarmTime)
61 return false; 96 return false;
62 } else { 97 } else {
63 if (mOffset != rhs.mOffset || 98 if (mOffset != rhs.mOffset ||
64 mEndOffset != rhs.mEndOffset) 99 mEndOffset != rhs.mEndOffset)
65 return false; 100 return false;
66 } 101 }
67
68 switch (mType) { 102 switch (mType) {
69 case Display: 103 case Display:
70 return mDescription == rhs.mDescription; 104 return mDescription == rhs.mDescription;
71 105
72 case Email: 106 case Email:
73 return mDescription == rhs.mDescription && 107 return mDescription == rhs.mDescription &&
74 mMailAttachFiles == rhs.mMailAttachFiles && 108 mMailAttachFiles == rhs.mMailAttachFiles &&
75 mMailAddresses == rhs.mMailAddresses && 109 mMailAddresses == rhs.mMailAddresses &&
76 mMailSubject == rhs.mMailSubject; 110 mMailSubject == rhs.mMailSubject;
77 111
78 case Procedure: 112 case Procedure:
79 return mFile == rhs.mFile && 113 return mFile == rhs.mFile &&
80 mDescription == rhs.mDescription; 114 mDescription == rhs.mDescription;
81 115
82 case Audio: 116 case Audio:
83 return mFile == rhs.mFile; 117 return mFile == rhs.mFile;
84 118
85 case Invalid: 119 case Invalid:
86 break; 120 break;
87 } 121 }
88 return false; 122 return false;
89} 123}
90 124
91void Alarm::setType(Alarm::Type type) 125void Alarm::setType(Alarm::Type type)
92{ 126{
93 if (type == mType) 127 if (type == mType)
94 return; 128 return;
95 129
96 switch (type) { 130 switch (type) {
97 case Display: 131 case Display:
98 mDescription = ""; 132 mDescription = "";
99 break; 133 break;
100 case Procedure: 134 case Procedure:
101 mFile = mDescription = ""; 135 mFile = mDescription = "";
102 break; 136 break;
103 case Audio: 137 case Audio:
104 mFile = ""; 138 mFile = "";
105 break; 139 break;
106 case Email: 140 case Email:
107 mMailSubject = mDescription = ""; 141 mMailSubject = mDescription = "";
108 mMailAddresses.clear(); 142 mMailAddresses.clear();
109 mMailAttachFiles.clear(); 143 mMailAttachFiles.clear();
110 break; 144 break;
111 case Invalid: 145 case Invalid:
112 break; 146 break;
113 default: 147 default:
114 return; 148 return;
115 } 149 }
116 mType = type; 150 mType = type;
117 mParent->updated(); 151 mParent->updated();
118} 152}
119 153
120Alarm::Type Alarm::type() const 154Alarm::Type Alarm::type() const
121{ 155{
122 return mType; 156 return mType;
123} 157}
124 158
125void Alarm::setAudioAlarm(const QString &audioFile) 159void Alarm::setAudioAlarm(const QString &audioFile)
126{ 160{
127 mType = Audio; 161 mType = Audio;
128 mFile = audioFile; 162 mFile = audioFile;
129 mParent->updated(); 163 mParent->updated();
130} 164}
131 165
132void Alarm::setAudioFile(const QString &audioFile) 166void Alarm::setAudioFile(const QString &audioFile)
133{ 167{
134 if (mType == Audio) { 168 if (mType == Audio) {
135 mFile = audioFile; 169 mFile = audioFile;
136 mParent->updated(); 170 mParent->updated();
137 } 171 }
138} 172}
139 173
140QString Alarm::audioFile() const 174QString Alarm::audioFile() const
141{ 175{
142 return (mType == Audio) ? mFile : QString::null; 176 return (mType == Audio) ? mFile : QString::null;
143} 177}
144 178
145void Alarm::setProcedureAlarm(const QString &programFile, const QString &arguments) 179void Alarm::setProcedureAlarm(const QString &programFile, const QString &arguments)
146{ 180{
147 mType = Procedure; 181 mType = Procedure;
148 mFile = programFile; 182 mFile = programFile;
149 mDescription = arguments; 183 mDescription = arguments;
150 mParent->updated(); 184 mParent->updated();
151} 185}
152 186
153void Alarm::setProgramFile(const QString &programFile) 187void Alarm::setProgramFile(const QString &programFile)
154{ 188{
155 if (mType == Procedure) { 189 if (mType == Procedure) {
156 mFile = programFile; 190 mFile = programFile;
157 mParent->updated(); 191 mParent->updated();
158 } 192 }
159} 193}
160 194
161QString Alarm::programFile() const 195QString Alarm::programFile() const
162{ 196{
163 return (mType == Procedure) ? mFile : QString::null; 197 return (mType == Procedure) ? mFile : QString::null;
164} 198}
165 199
166void Alarm::setProgramArguments(const QString &arguments) 200void Alarm::setProgramArguments(const QString &arguments)
167{ 201{
168 if (mType == Procedure) { 202 if (mType == Procedure) {
169 mDescription = arguments; 203 mDescription = arguments;
170 mParent->updated(); 204 mParent->updated();
171 } 205 }
172} 206}
173 207
174QString Alarm::programArguments() const 208QString Alarm::programArguments() const
175{ 209{
176 return (mType == Procedure) ? mDescription : QString::null; 210 return (mType == Procedure) ? mDescription : QString::null;
177} 211}
178 212
179void Alarm::setEmailAlarm(const QString &subject, const QString &text, 213void Alarm::setEmailAlarm(const QString &subject, const QString &text,
180 const QValueList<Person> &addressees, const QStringList &attachments) 214 const QValueList<Person> &addressees, const QStringList &attachments)
181{ 215{
182 mType = Email; 216 mType = Email;
183 mMailSubject = subject; 217 mMailSubject = subject;
184 mDescription = text; 218 mDescription = text;
185 mMailAddresses = addressees; 219 mMailAddresses = addressees;
186 mMailAttachFiles = attachments; 220 mMailAttachFiles = attachments;
187 mParent->updated(); 221 mParent->updated();
188} 222}
189 223
190void Alarm::setMailAddress(const Person &mailAddress) 224void Alarm::setMailAddress(const Person &mailAddress)
191{ 225{
192 if (mType == Email) { 226 if (mType == Email) {
193 mMailAddresses.clear(); 227 mMailAddresses.clear();
194 mMailAddresses += mailAddress; 228 mMailAddresses += mailAddress;
195 mParent->updated(); 229 mParent->updated();
196 } 230 }
197} 231}
198 232
199void Alarm::setMailAddresses(const QValueList<Person> &mailAddresses) 233void Alarm::setMailAddresses(const QValueList<Person> &mailAddresses)
200{ 234{
201 if (mType == Email) { 235 if (mType == Email) {
202 mMailAddresses = mailAddresses; 236 mMailAddresses = mailAddresses;
203 mParent->updated(); 237 mParent->updated();
204 } 238 }
205} 239}
206 240
207void Alarm::addMailAddress(const Person &mailAddress) 241void Alarm::addMailAddress(const Person &mailAddress)
208{ 242{
209 if (mType == Email) { 243 if (mType == Email) {
210 mMailAddresses += mailAddress; 244 mMailAddresses += mailAddress;
211 mParent->updated(); 245 mParent->updated();
212 } 246 }
213} 247}
214 248
215QValueList<Person> Alarm::mailAddresses() const 249QValueList<Person> Alarm::mailAddresses() const
216{ 250{
217 return (mType == Email) ? mMailAddresses : QValueList<Person>(); 251 return (mType == Email) ? mMailAddresses : QValueList<Person>();
218} 252}
219 253
220void Alarm::setMailSubject(const QString &mailAlarmSubject) 254void Alarm::setMailSubject(const QString &mailAlarmSubject)
221{ 255{
222 if (mType == Email) { 256 if (mType == Email) {
223 mMailSubject = mailAlarmSubject; 257 mMailSubject = mailAlarmSubject;
224 mParent->updated(); 258 mParent->updated();
225 } 259 }
226} 260}
227 261
228QString Alarm::mailSubject() const 262QString Alarm::mailSubject() const
229{ 263{
230 return (mType == Email) ? mMailSubject : QString::null; 264 return (mType == Email) ? mMailSubject : QString::null;
231} 265}
232 266
233void Alarm::setMailAttachment(const QString &mailAttachFile) 267void Alarm::setMailAttachment(const QString &mailAttachFile)
234{ 268{
235 if (mType == Email) { 269 if (mType == Email) {
236 mMailAttachFiles.clear(); 270 mMailAttachFiles.clear();
237 mMailAttachFiles += mailAttachFile; 271 mMailAttachFiles += mailAttachFile;
238 mParent->updated(); 272 mParent->updated();
239 } 273 }
240} 274}
241 275
242void Alarm::setMailAttachments(const QStringList &mailAttachFiles) 276void Alarm::setMailAttachments(const QStringList &mailAttachFiles)
243{ 277{
244 if (mType == Email) { 278 if (mType == Email) {
245 mMailAttachFiles = mailAttachFiles; 279 mMailAttachFiles = mailAttachFiles;
246 mParent->updated(); 280 mParent->updated();
247 } 281 }
248} 282}
249 283
250void Alarm::addMailAttachment(const QString &mailAttachFile) 284void Alarm::addMailAttachment(const QString &mailAttachFile)
251{ 285{
252 if (mType == Email) { 286 if (mType == Email) {
253 mMailAttachFiles += mailAttachFile; 287 mMailAttachFiles += mailAttachFile;
254 mParent->updated(); 288 mParent->updated();
255 } 289 }
256} 290}
257 291
258QStringList Alarm::mailAttachments() const 292QStringList Alarm::mailAttachments() const
259{ 293{
260 return (mType == Email) ? mMailAttachFiles : QStringList(); 294 return (mType == Email) ? mMailAttachFiles : QStringList();
261} 295}
262 296
263void Alarm::setMailText(const QString &text) 297void Alarm::setMailText(const QString &text)
264{ 298{
265 if (mType == Email) { 299 if (mType == Email) {
266 mDescription = text; 300 mDescription = text;
267 mParent->updated(); 301 mParent->updated();
268 } 302 }
269} 303}
270 304
271QString Alarm::mailText() const 305QString Alarm::mailText() const
272{ 306{
273 return (mType == Email) ? mDescription : QString::null; 307 return (mType == Email) ? mDescription : QString::null;
274} 308}
275 309
276void Alarm::setDisplayAlarm(const QString &text) 310void Alarm::setDisplayAlarm(const QString &text)
277{ 311{
278 mType = Display; 312 mType = Display;
279 mDescription = text; 313 mDescription = text;
280 mParent->updated(); 314 mParent->updated();
281} 315}
282 316
283void Alarm::setText(const QString &text) 317void Alarm::setText(const QString &text)
284{ 318{
285 if (mType == Display) { 319 if (mType == Display) {
286 mDescription = text; 320 mDescription = text;
287 mParent->updated(); 321 mParent->updated();
288 } 322 }
289} 323}
290 324
291QString Alarm::text() const 325QString Alarm::text() const
292{ 326{
293 return (mType == Display) ? mDescription : QString::null; 327 return (mType == Display) ? mDescription : QString::null;
294} 328}
295 329
296void Alarm::setTime(const QDateTime &alarmTime) 330void Alarm::setTime(const QDateTime &alarmTime)
297{ 331{
298 mAlarmTime = alarmTime; 332 mAlarmTime = alarmTime;
299 mHasTime = true; 333 mHasTime = true;
300 334
301 mParent->updated(); 335 mParent->updated();
302} 336}
303int Alarm::offset() 337int Alarm::offset()
304{ 338{
305 if ( hasTime() ) { 339 if ( hasTime() ) {
306 if (mParent->type()=="Todo") { 340 if (mParent->type()=="Todo") {
307 Todo *t = static_cast<Todo*>(mParent); 341 Todo *t = static_cast<Todo*>(mParent);
308 return t->dtDue().secsTo( mAlarmTime ) ; 342 return t->dtDue().secsTo( mAlarmTime ) ;
309 } else 343 } else
310 return mParent->dtStart().secsTo( mAlarmTime ) ; 344 return mParent->dtStart().secsTo( mAlarmTime ) ;
311 } 345 }
312 else 346 else
313 { 347 {
314 return mOffset.asSeconds(); 348 return mOffset.asSeconds();
315 } 349 }
316 350
317} 351}
318 352
319 353
320QDateTime Alarm::time() const 354QDateTime Alarm::time() const
321{ 355{
322 if ( hasTime() ) 356 if ( hasTime() )
323 return mAlarmTime; 357 return mAlarmTime;
324 else 358 else
325 { 359 {
326 if (mParent->type()=="Todo") { 360 if (mParent->type()=="Todo") {
327 Todo *t = static_cast<Todo*>(mParent); 361 Todo *t = static_cast<Todo*>(mParent);
328 return mOffset.end( t->dtDue() ); 362 return mOffset.end( t->dtDue() );
329 } else if (mEndOffset) { 363 } else if (mEndOffset) {
330 return mOffset.end( mParent->dtEnd() ); 364 return mOffset.end( mParent->dtEnd() );
331 } else { 365 } else {
332 return mOffset.end( mParent->dtStart() ); 366 return mOffset.end( mParent->dtStart() );
333 } 367 }
334 } 368 }
335} 369}
336 370
337bool Alarm::hasTime() const 371bool Alarm::hasTime() const
338{ 372{
339 return mHasTime; 373 return mHasTime;
340} 374}
341 375
342void Alarm::setSnoozeTime(int alarmSnoozeTime) 376void Alarm::setSnoozeTime(int alarmSnoozeTime)
343{ 377{
344 mAlarmSnoozeTime = alarmSnoozeTime; 378 mAlarmSnoozeTime = alarmSnoozeTime;
345 mParent->updated(); 379 mParent->updated();
346} 380}
347 381
348int Alarm::snoozeTime() const 382int Alarm::snoozeTime() const
349{ 383{
350 return mAlarmSnoozeTime; 384 return mAlarmSnoozeTime;
351} 385}
352 386
353void Alarm::setRepeatCount(int alarmRepeatCount) 387void Alarm::setRepeatCount(int alarmRepeatCount)
354{ 388{
355 kdDebug(5800) << "Alarm::setRepeatCount(): " << alarmRepeatCount << endl; 389 kdDebug(5800) << "Alarm::setRepeatCount(): " << alarmRepeatCount << endl;
356 390
357 mAlarmRepeatCount = alarmRepeatCount; 391 mAlarmRepeatCount = alarmRepeatCount;
358 mParent->updated(); 392 mParent->updated();
359} 393}
360 394
361int Alarm::repeatCount() const 395int Alarm::repeatCount() const
362{ 396{
363 kdDebug(5800) << "Alarm::repeatCount(): " << mAlarmRepeatCount << endl; 397 kdDebug(5800) << "Alarm::repeatCount(): " << mAlarmRepeatCount << endl;
364 return mAlarmRepeatCount; 398 return mAlarmRepeatCount;
365} 399}
366 400
367void Alarm::toggleAlarm() 401void Alarm::toggleAlarm()
368{ 402{
369 mAlarmEnabled = !mAlarmEnabled; 403 mAlarmEnabled = !mAlarmEnabled;
370 mParent->updated(); 404 mParent->updated();
371} 405}
372 406
373void Alarm::setEnabled(bool enable) 407void Alarm::setEnabled(bool enable)
374{ 408{
375 mAlarmEnabled = enable; 409 mAlarmEnabled = enable;
376 mParent->updated(); 410 mParent->updated();
377} 411}
378 412
379bool Alarm::enabled() const 413bool Alarm::enabled() const
380{ 414{
381 return mAlarmEnabled; 415 return mAlarmEnabled;
382} 416}
383 417
384void Alarm::setStartOffset( const Duration &offset ) 418void Alarm::setStartOffset( const Duration &offset )
385{ 419{
386 mOffset = offset; 420 mOffset = offset;
387 mEndOffset = false; 421 mEndOffset = false;
388 mHasTime = false; 422 mHasTime = false;
389 mParent->updated(); 423 mParent->updated();
390} 424}
391 425
392Duration Alarm::startOffset() const 426Duration Alarm::startOffset() const
393{ 427{
394 return (mHasTime || mEndOffset) ? 0 : mOffset; 428 return (mHasTime || mEndOffset) ? 0 : mOffset;
395} 429}
396 430
397bool Alarm::hasStartOffset() const 431bool Alarm::hasStartOffset() const
398{ 432{
399 return !mHasTime && !mEndOffset; 433 return !mHasTime && !mEndOffset;
400} 434}
401 435
402bool Alarm::hasEndOffset() const 436bool Alarm::hasEndOffset() const
403{ 437{
404 return !mHasTime && mEndOffset; 438 return !mHasTime && mEndOffset;
405} 439}
406 440
407void Alarm::setEndOffset( const Duration &offset ) 441void Alarm::setEndOffset( const Duration &offset )
408{ 442{
409 mOffset = offset; 443 mOffset = offset;
410 mEndOffset = true; 444 mEndOffset = true;
411 mHasTime = false; 445 mHasTime = false;
412 mParent->updated(); 446 mParent->updated();
413} 447}
414 448
415Duration Alarm::endOffset() const 449Duration Alarm::endOffset() const
416{ 450{
417 return (mHasTime || !mEndOffset) ? 0 : mOffset; 451 return (mHasTime || !mEndOffset) ? 0 : mOffset;
418} 452}
419 453
420void Alarm::setParent( Incidence *parent ) 454void Alarm::setParent( Incidence *parent )
421{ 455{
422 mParent = parent; 456 mParent = parent;
423} 457}
diff --git a/libkcal/recurrence.cpp b/libkcal/recurrence.cpp
index dd74e10..e84f672 100644
--- a/libkcal/recurrence.cpp
+++ b/libkcal/recurrence.cpp
@@ -1,648 +1,680 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 1998 Preston Brown 3 Copyright (c) 1998 Preston Brown
4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
5 Copyright (c) 2002 David Jarvie <software@astrojar.org.uk> 5 Copyright (c) 2002 David Jarvie <software@astrojar.org.uk>
6 6
7 This library is free software; you can redistribute it and/or 7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Library General Public 8 modify it under the terms of the GNU Library General Public
9 License as published by the Free Software Foundation; either 9 License as published by the Free Software Foundation; either
10 version 2 of the License, or (at your option) any later version. 10 version 2 of the License, or (at your option) any later version.
11 11
12 This library is distributed in the hope that it will be useful, 12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Library General Public License for more details. 15 Library General Public License for more details.
16 16
17 You should have received a copy of the GNU Library General Public License 17 You should have received a copy of the GNU Library General Public License
18 along with this library; see the file COPYING.LIB. If not, write to 18 along with this library; see the file COPYING.LIB. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. 20 Boston, MA 02111-1307, USA.
21*/ 21*/
22 22
23#include <limits.h> 23#include <limits.h>
24 24
25#include <kdebug.h> 25#include <kdebug.h>
26#include <kglobal.h> 26#include <kglobal.h>
27#include <klocale.h> 27#include <klocale.h>
28 28
29#include "incidence.h" 29#include "incidence.h"
30 30
31#include "recurrence.h" 31#include "recurrence.h"
32 32
33using namespace KCal; 33using namespace KCal;
34 34
35Recurrence::Feb29Type Recurrence::mFeb29YearlyDefaultType = Recurrence::rMar1; 35Recurrence::Feb29Type Recurrence::mFeb29YearlyDefaultType = Recurrence::rMar1;
36 36
37 37
38Recurrence::Recurrence(Incidence *parent, int compatVersion) 38Recurrence::Recurrence(Incidence *parent, int compatVersion)
39: recurs(rNone), // by default, it's not a recurring event 39: recurs(rNone), // by default, it's not a recurring event
40 rWeekStart(1), // default is Monday 40 rWeekStart(1), // default is Monday
41 rDays(7), 41 rDays(7),
42 mFloats(parent ? parent->doesFloat() : false), 42 mFloats(parent ? parent->doesFloat() : false),
43 mRecurReadOnly(false), 43 mRecurReadOnly(false),
44 mRecurExDatesCount(0), 44 mRecurExDatesCount(0),
45 mFeb29YearlyType(mFeb29YearlyDefaultType), 45 mFeb29YearlyType(mFeb29YearlyDefaultType),
46 mCompatVersion(compatVersion ? compatVersion : INT_MAX), 46 mCompatVersion(compatVersion ? compatVersion : INT_MAX),
47 mCompatRecurs(rNone), 47 mCompatRecurs(rNone),
48 mCompatDuration(0), 48 mCompatDuration(0),
49 mParent(parent) 49 mParent(parent)
50{ 50{
51 rMonthDays.setAutoDelete( true ); 51 rMonthDays.setAutoDelete( true );
52 rMonthPositions.setAutoDelete( true ); 52 rMonthPositions.setAutoDelete( true );
53 rYearNums.setAutoDelete( true ); 53 rYearNums.setAutoDelete( true );
54} 54}
55 55
56Recurrence::Recurrence(const Recurrence &r, Incidence *parent) 56Recurrence::Recurrence(const Recurrence &r, Incidence *parent)
57: recurs(r.recurs), 57: recurs(r.recurs),
58 rWeekStart(r.rWeekStart), 58 rWeekStart(r.rWeekStart),
59 rDays(r.rDays.copy()), 59 rDays(r.rDays.copy()),
60 rFreq(r.rFreq), 60 rFreq(r.rFreq),
61 rDuration(r.rDuration), 61 rDuration(r.rDuration),
62 rEndDateTime(r.rEndDateTime), 62 rEndDateTime(r.rEndDateTime),
63 mRecurStart(r.mRecurStart), 63 mRecurStart(r.mRecurStart),
64 mFloats(r.mFloats), 64 mFloats(r.mFloats),
65 mRecurReadOnly(r.mRecurReadOnly), 65 mRecurReadOnly(r.mRecurReadOnly),
66 mRecurExDatesCount(r.mRecurExDatesCount), 66 mRecurExDatesCount(r.mRecurExDatesCount),
67 mFeb29YearlyType(r.mFeb29YearlyType), 67 mFeb29YearlyType(r.mFeb29YearlyType),
68 mCompatVersion(r.mCompatVersion), 68 mCompatVersion(r.mCompatVersion),
69 mCompatRecurs(r.mCompatRecurs), 69 mCompatRecurs(r.mCompatRecurs),
70 mCompatDuration(r.mCompatDuration), 70 mCompatDuration(r.mCompatDuration),
71 mParent(parent) 71 mParent(parent)
72{ 72{
73 for (QPtrListIterator<rMonthPos> mp(r.rMonthPositions); mp.current(); ++mp) { 73 for (QPtrListIterator<rMonthPos> mp(r.rMonthPositions); mp.current(); ++mp) {
74 rMonthPos *tmp = new rMonthPos; 74 rMonthPos *tmp = new rMonthPos;
75 tmp->rPos = mp.current()->rPos; 75 tmp->rPos = mp.current()->rPos;
76 tmp->negative = mp.current()->negative; 76 tmp->negative = mp.current()->negative;
77 tmp->rDays = mp.current()->rDays.copy(); 77 tmp->rDays = mp.current()->rDays.copy();
78 rMonthPositions.append(tmp); 78 rMonthPositions.append(tmp);
79 } 79 }
80 for (QPtrListIterator<int> md(r.rMonthDays); md.current(); ++md) { 80 for (QPtrListIterator<int> md(r.rMonthDays); md.current(); ++md) {
81 int *tmp = new int; 81 int *tmp = new int;
82 *tmp = *md.current(); 82 *tmp = *md.current();
83 rMonthDays.append(tmp); 83 rMonthDays.append(tmp);
84 } 84 }
85 for (QPtrListIterator<int> yn(r.rYearNums); yn.current(); ++yn) { 85 for (QPtrListIterator<int> yn(r.rYearNums); yn.current(); ++yn) {
86 int *tmp = new int; 86 int *tmp = new int;
87 *tmp = *yn.current(); 87 *tmp = *yn.current();
88 rYearNums.append(tmp); 88 rYearNums.append(tmp);
89 } 89 }
90 rMonthDays.setAutoDelete( true ); 90 rMonthDays.setAutoDelete( true );
91 rMonthPositions.setAutoDelete( true ); 91 rMonthPositions.setAutoDelete( true );
92 rYearNums.setAutoDelete( true ); 92 rYearNums.setAutoDelete( true );
93} 93}
94 94
95Recurrence::~Recurrence() 95Recurrence::~Recurrence()
96{ 96{
97} 97}
98 98
99 99
100bool Recurrence::operator==( const Recurrence& r2 ) const 100bool Recurrence::operator==( const Recurrence& r2 ) const
101{ 101{
102 102
103 // the following line is obvious 103 // the following line is obvious
104 if ( recurs == rNone && r2.recurs == rNone ) 104 if ( recurs == rNone && r2.recurs == rNone )
105 return true; 105 return true;
106 // we need the above line, because two non recurring events may 106 // we need the above line, because two non recurring events may
107 // differ in the other settings, because one (or both) 107 // differ in the other settings, because one (or both)
108 // may be not initialized properly 108 // may be not initialized properly
109
109 if ( recurs != r2.recurs 110 if ( recurs != r2.recurs
110 || rFreq != r2.rFreq 111 || rFreq != r2.rFreq
111 || rDuration != r2.rDuration 112 || rDuration != r2.rDuration
112 || !rDuration && rEndDateTime != r2.rEndDateTime 113 || !rDuration && rEndDateTime != r2.rEndDateTime
113 || mRecurStart != r2.mRecurStart 114 || mRecurStart != r2.mRecurStart
114 || mFloats != r2.mFloats 115 || mFloats != r2.mFloats
115 || mRecurReadOnly != r2.mRecurReadOnly 116 || mRecurReadOnly != r2.mRecurReadOnly
116 || mRecurExDatesCount != r2.mRecurExDatesCount ) 117 || mRecurExDatesCount != r2.mRecurExDatesCount )
117 return false; 118 return false;
118 // no need to compare mCompat* and mParent 119 // no need to compare mCompat* and mParent
119 // OK to compare the pointers 120 // OK to compare the pointers
120 switch ( recurs ) 121 switch ( recurs )
121 { 122 {
122 case rWeekly: 123 case rWeekly:
123 return rDays == r2.rDays 124 return rDays == r2.rDays
124 && rWeekStart == r2.rWeekStart; 125 && rWeekStart == r2.rWeekStart;
125 case rMonthlyPos: 126 case rMonthlyPos: {
126 return rMonthPositions.count() == r2.rMonthPositions.count(); 127 QPtrList<rMonthPos> MonthPositions = rMonthPositions;
127 case rMonthlyDay: 128 QPtrList<rMonthPos> MonthPositions2 = r2.rMonthPositions;
128 return rMonthDays.count() == r2.rMonthDays.count(); 129 if ( !MonthPositions.count() )
129 case rYearlyPos: 130 return false;
130 return rYearNums.count() == r2.rYearNums.count() 131 if ( !MonthPositions2.count() )
131 && rMonthPositions.count() == r2.rMonthPositions.count(); 132 return false;
132 case rYearlyMonth: 133 return MonthPositions.first()->rPos == MonthPositions2.first()->rPos;
133 return rYearNums.count() == r2.rYearNums.count() 134 }
134 && mFeb29YearlyType == r2.mFeb29YearlyType; 135 case rMonthlyDay: {
135 case rYearlyDay: 136 QPtrList<int> MonthDays = rMonthDays ;
136 return rYearNums == r2.rYearNums; 137 QPtrList<int> MonthDays2 = r2.rMonthDays ;
138 if ( !MonthDays.count() )
139 return false;
140 if ( !MonthDays2.count() )
141 return false;
142 return *MonthDays.first() == *MonthDays2.first() ;
143 }
144 case rYearlyPos: {
145
146 QPtrList<int> YearNums = rYearNums;
147 QPtrList<int> YearNums2 = r2.rYearNums;
148 if ( *YearNums.first() != *YearNums2.first() )
149 return false;
150 QPtrList<rMonthPos> MonthPositions = rMonthPositions;
151 QPtrList<rMonthPos> MonthPositions2 = r2.rMonthPositions;
152 if ( !MonthPositions.count() )
153 return false;
154 if ( !MonthPositions2.count() )
155 return false;
156 return MonthPositions.first()->rPos == MonthPositions2.first()->rPos;
157
158 }
159 case rYearlyMonth: {
160 QPtrList<int> YearNums = rYearNums;
161 QPtrList<int> YearNums2 = r2.rYearNums;
162 return ( *YearNums.first() == *YearNums2.first() && mFeb29YearlyType == r2.mFeb29YearlyType);
163 }
164 case rYearlyDay: {
165 QPtrList<int> YearNums = rYearNums;
166 QPtrList<int> YearNums2 = r2.rYearNums;
167 return ( *YearNums.first() == *YearNums2.first() );
168 }
137 case rNone: 169 case rNone:
138 case rMinutely: 170 case rMinutely:
139 case rHourly: 171 case rHourly:
140 case rDaily: 172 case rDaily:
141 default: 173 default:
142 return true; 174 return true;
143 } 175 }
144} 176}
145/* 177/*
146bool Recurrence::compareLists( const QPtrList<int> &l1 ,const QPtrList<int> &l2) 178bool Recurrence::compareLists( const QPtrList<int> &l1 ,const QPtrList<int> &l2)
147{ 179{
148 if ( l1.count() != l2.count() ) 180 if ( l1.count() != l2.count() )
149 return false; 181 return false;
150 int count = l1.count(); 182 int count = l1.count();
151 int i; 183 int i;
152 for ( i = 0; i < count ; ++i ) { 184 for ( i = 0; i < count ; ++i ) {
153 // if ( l1.at(i) != l2.at(i) ) 185 // if ( l1.at(i) != l2.at(i) )
154 return false; 186 return false;
155 qDebug("compüare "); 187 qDebug("compüare ");
156 } 188 }
157 return true; 189 return true;
158} 190}
159*/ 191*/
160QString Recurrence::recurrenceText() const 192QString Recurrence::recurrenceText() const
161{ 193{
162 QString recurText = i18n("No"); 194 QString recurText = i18n("No");
163 if ( recurs == Recurrence::rMinutely ) 195 if ( recurs == Recurrence::rMinutely )
164 recurText = i18n("minutely"); 196 recurText = i18n("minutely");
165 else if ( recurs == Recurrence::rHourly ) 197 else if ( recurs == Recurrence::rHourly )
166 recurText = i18n("hourly"); 198 recurText = i18n("hourly");
167 else if ( recurs == Recurrence::rDaily ) 199 else if ( recurs == Recurrence::rDaily )
168 recurText = i18n("daily"); 200 recurText = i18n("daily");
169 else if ( recurs == Recurrence::rWeekly ) 201 else if ( recurs == Recurrence::rWeekly )
170 recurText = i18n("weekly"); 202 recurText = i18n("weekly");
171 else if ( recurs == Recurrence::rMonthlyPos ) 203 else if ( recurs == Recurrence::rMonthlyPos )
172 recurText = i18n("monthly"); 204 recurText = i18n("monthly");
173 else if ( recurs == Recurrence::rMonthlyDay ) 205 else if ( recurs == Recurrence::rMonthlyDay )
174 recurText = i18n("day-monthly"); 206 recurText = i18n("day-monthly");
175 else if ( recurs == Recurrence::rYearlyMonth ) 207 else if ( recurs == Recurrence::rYearlyMonth )
176 recurText = i18n("month-yearly"); 208 recurText = i18n("month-yearly");
177 else if ( recurs == Recurrence::rYearlyDay ) 209 else if ( recurs == Recurrence::rYearlyDay )
178 recurText = i18n("day-yearly"); 210 recurText = i18n("day-yearly");
179 else if ( recurs == Recurrence::rYearlyPos ) 211 else if ( recurs == Recurrence::rYearlyPos )
180 recurText = i18n("position-yearly"); 212 recurText = i18n("position-yearly");
181 return recurText; 213 return recurText;
182} 214}
183 215
184void Recurrence::setCompatVersion(int version) 216void Recurrence::setCompatVersion(int version)
185{ 217{
186 mCompatVersion = version ? version : INT_MAX; 218 mCompatVersion = version ? version : INT_MAX;
187} 219}
188 220
189ushort Recurrence::doesRecur() const 221ushort Recurrence::doesRecur() const
190{ 222{
191 return recurs; 223 return recurs;
192} 224}
193 225
194bool Recurrence::recursOnPure(const QDate &qd) const 226bool Recurrence::recursOnPure(const QDate &qd) const
195{ 227{
196 switch(recurs) { 228 switch(recurs) {
197 case rMinutely: 229 case rMinutely:
198 return recursSecondly(qd, rFreq*60); 230 return recursSecondly(qd, rFreq*60);
199 case rHourly: 231 case rHourly:
200 return recursSecondly(qd, rFreq*3600); 232 return recursSecondly(qd, rFreq*3600);
201 case rDaily: 233 case rDaily:
202 return recursDaily(qd); 234 return recursDaily(qd);
203 case rWeekly: 235 case rWeekly:
204 return recursWeekly(qd); 236 return recursWeekly(qd);
205 case rMonthlyPos: 237 case rMonthlyPos:
206 case rMonthlyDay: 238 case rMonthlyDay:
207 return recursMonthly(qd); 239 return recursMonthly(qd);
208 case rYearlyMonth: 240 case rYearlyMonth:
209 return recursYearlyByMonth(qd); 241 return recursYearlyByMonth(qd);
210 case rYearlyDay: 242 case rYearlyDay:
211 return recursYearlyByDay(qd); 243 return recursYearlyByDay(qd);
212 case rYearlyPos: 244 case rYearlyPos:
213 return recursYearlyByPos(qd); 245 return recursYearlyByPos(qd);
214 default: 246 default:
215 return false; 247 return false;
216 case rNone: 248 case rNone:
217 return false; 249 return false;
218 } // case 250 } // case
219 return false; 251 return false;
220} 252}
221 253
222bool Recurrence::recursAtPure(const QDateTime &dt) const 254bool Recurrence::recursAtPure(const QDateTime &dt) const
223{ 255{
224 switch(recurs) { 256 switch(recurs) {
225 case rMinutely: 257 case rMinutely:
226 return recursMinutelyAt(dt, rFreq); 258 return recursMinutelyAt(dt, rFreq);
227 case rHourly: 259 case rHourly:
228 return recursMinutelyAt(dt, rFreq*60); 260 return recursMinutelyAt(dt, rFreq*60);
229 default: 261 default:
230 if (dt.time() != mRecurStart.time()) 262 if (dt.time() != mRecurStart.time())
231 return false; 263 return false;
232 switch(recurs) { 264 switch(recurs) {
233 case rDaily: 265 case rDaily:
234 return recursDaily(dt.date()); 266 return recursDaily(dt.date());
235 case rWeekly: 267 case rWeekly:
236 return recursWeekly(dt.date()); 268 return recursWeekly(dt.date());
237 case rMonthlyPos: 269 case rMonthlyPos:
238 case rMonthlyDay: 270 case rMonthlyDay:
239 return recursMonthly(dt.date()); 271 return recursMonthly(dt.date());
240 case rYearlyMonth: 272 case rYearlyMonth:
241 return recursYearlyByMonth(dt.date()); 273 return recursYearlyByMonth(dt.date());
242 case rYearlyDay: 274 case rYearlyDay:
243 return recursYearlyByDay(dt.date()); 275 return recursYearlyByDay(dt.date());
244 case rYearlyPos: 276 case rYearlyPos:
245 return recursYearlyByPos(dt.date()); 277 return recursYearlyByPos(dt.date());
246 default: 278 default:
247 return false; 279 return false;
248 case rNone: 280 case rNone:
249 return false; 281 return false;
250 } 282 }
251 } // case 283 } // case
252 return false; 284 return false;
253} 285}
254 286
255QDate Recurrence::endDate() const 287QDate Recurrence::endDate() const
256{ 288{
257 int count = 0; 289 int count = 0;
258 QDate end; 290 QDate end;
259 if (recurs != rNone) { 291 if (recurs != rNone) {
260 if (rDuration < 0) 292 if (rDuration < 0)
261 return QDate(); // infinite recurrence 293 return QDate(); // infinite recurrence
262 if (rDuration == 0) 294 if (rDuration == 0)
263 return rEndDateTime.date(); 295 return rEndDateTime.date();
264 296
265 // The end date is determined by the recurrence count 297 // The end date is determined by the recurrence count
266 QDate dStart = mRecurStart.date(); 298 QDate dStart = mRecurStart.date();
267 switch (recurs) 299 switch (recurs)
268 { 300 {
269 case rMinutely: 301 case rMinutely:
270 return mRecurStart.addSecs((rDuration-1+mRecurExDatesCount)*rFreq*60).date(); 302 return mRecurStart.addSecs((rDuration-1+mRecurExDatesCount)*rFreq*60).date();
271 case rHourly: 303 case rHourly:
272 return mRecurStart.addSecs((rDuration-1+mRecurExDatesCount)*rFreq*3600).date(); 304 return mRecurStart.addSecs((rDuration-1+mRecurExDatesCount)*rFreq*3600).date();
273 case rDaily: 305 case rDaily:
274 return dStart.addDays((rDuration-1+mRecurExDatesCount)*rFreq); 306 return dStart.addDays((rDuration-1+mRecurExDatesCount)*rFreq);
275 307
276 case rWeekly: 308 case rWeekly:
277 count = weeklyCalc(END_DATE_AND_COUNT, end); 309 count = weeklyCalc(END_DATE_AND_COUNT, end);
278 break; 310 break;
279 case rMonthlyPos: 311 case rMonthlyPos:
280 case rMonthlyDay: 312 case rMonthlyDay:
281 count = monthlyCalc(END_DATE_AND_COUNT, end); 313 count = monthlyCalc(END_DATE_AND_COUNT, end);
282 break; 314 break;
283 case rYearlyMonth: 315 case rYearlyMonth:
284 count = yearlyMonthCalc(END_DATE_AND_COUNT, end); 316 count = yearlyMonthCalc(END_DATE_AND_COUNT, end);
285 break; 317 break;
286 case rYearlyDay: 318 case rYearlyDay:
287 count = yearlyDayCalc(END_DATE_AND_COUNT, end); 319 count = yearlyDayCalc(END_DATE_AND_COUNT, end);
288 break; 320 break;
289 case rYearlyPos: 321 case rYearlyPos:
290 count = yearlyPosCalc(END_DATE_AND_COUNT, end); 322 count = yearlyPosCalc(END_DATE_AND_COUNT, end);
291 break; 323 break;
292 default: 324 default:
293 // catch-all. Should never get here. 325 // catch-all. Should never get here.
294 kdDebug(5800) << "Control should never reach here in endDate()!" << endl; 326 kdDebug(5800) << "Control should never reach here in endDate()!" << endl;
295 break; 327 break;
296 } 328 }
297 } 329 }
298 if (!count) 330 if (!count)
299 return QDate(); // error - there is no recurrence 331 return QDate(); // error - there is no recurrence
300 return end; 332 return end;
301} 333}
302 334
303QDateTime Recurrence::endDateTime() const 335QDateTime Recurrence::endDateTime() const
304{ 336{
305 int count = 0; 337 int count = 0;
306 QDate end; 338 QDate end;
307 if (recurs != rNone) { 339 if (recurs != rNone) {
308 if (rDuration < 0) 340 if (rDuration < 0)
309 return QDateTime(); // infinite recurrence 341 return QDateTime(); // infinite recurrence
310 if (rDuration == 0) 342 if (rDuration == 0)
311 return rEndDateTime; 343 return rEndDateTime;
312 344
313 // The end date is determined by the recurrence count 345 // The end date is determined by the recurrence count
314 QDate dStart = mRecurStart.date(); 346 QDate dStart = mRecurStart.date();
315 switch (recurs) 347 switch (recurs)
316 { 348 {
317 case rMinutely: 349 case rMinutely:
318 return mRecurStart.addSecs((rDuration-1+mRecurExDatesCount)*rFreq*60); 350 return mRecurStart.addSecs((rDuration-1+mRecurExDatesCount)*rFreq*60);
319 case rHourly: 351 case rHourly:
320 return mRecurStart.addSecs((rDuration-1+mRecurExDatesCount)*rFreq*3600); 352 return mRecurStart.addSecs((rDuration-1+mRecurExDatesCount)*rFreq*3600);
321 case rDaily: 353 case rDaily:
322 return dStart.addDays((rDuration-1+mRecurExDatesCount)*rFreq); 354 return dStart.addDays((rDuration-1+mRecurExDatesCount)*rFreq);
323 355
324 case rWeekly: 356 case rWeekly:
325 count = weeklyCalc(END_DATE_AND_COUNT, end); 357 count = weeklyCalc(END_DATE_AND_COUNT, end);
326 break; 358 break;
327 case rMonthlyPos: 359 case rMonthlyPos:
328 case rMonthlyDay: 360 case rMonthlyDay:
329 count = monthlyCalc(END_DATE_AND_COUNT, end); 361 count = monthlyCalc(END_DATE_AND_COUNT, end);
330 break; 362 break;
331 case rYearlyMonth: 363 case rYearlyMonth:
332 count = yearlyMonthCalc(END_DATE_AND_COUNT, end); 364 count = yearlyMonthCalc(END_DATE_AND_COUNT, end);
333 break; 365 break;
334 case rYearlyDay: 366 case rYearlyDay:
335 count = yearlyDayCalc(END_DATE_AND_COUNT, end); 367 count = yearlyDayCalc(END_DATE_AND_COUNT, end);
336 break; 368 break;
337 case rYearlyPos: 369 case rYearlyPos:
338 count = yearlyPosCalc(END_DATE_AND_COUNT, end); 370 count = yearlyPosCalc(END_DATE_AND_COUNT, end);
339 break; 371 break;
340 default: 372 default:
341 // catch-all. Should never get here. 373 // catch-all. Should never get here.
342 kdDebug(5800) << "Control should never reach here in endDate()!" << endl; 374 kdDebug(5800) << "Control should never reach here in endDate()!" << endl;
343 break; 375 break;
344 } 376 }
345 } 377 }
346 if (!count) 378 if (!count)
347 return QDateTime(); // error - there is no recurrence 379 return QDateTime(); // error - there is no recurrence
348 return QDateTime(end, mRecurStart.time()); 380 return QDateTime(end, mRecurStart.time());
349} 381}
350 382
351int Recurrence::durationTo(const QDate &date) const 383int Recurrence::durationTo(const QDate &date) const
352{ 384{
353 QDate d = date; 385 QDate d = date;
354 return recurCalc(COUNT_TO_DATE, d); 386 return recurCalc(COUNT_TO_DATE, d);
355} 387}
356 388
357int Recurrence::durationTo(const QDateTime &datetime) const 389int Recurrence::durationTo(const QDateTime &datetime) const
358{ 390{
359 QDateTime dt = datetime; 391 QDateTime dt = datetime;
360 return recurCalc(COUNT_TO_DATE, dt); 392 return recurCalc(COUNT_TO_DATE, dt);
361} 393}
362 394
363void Recurrence::unsetRecurs() 395void Recurrence::unsetRecurs()
364{ 396{
365 if (mRecurReadOnly) return; 397 if (mRecurReadOnly) return;
366 recurs = rNone; 398 recurs = rNone;
367 rMonthPositions.clear(); 399 rMonthPositions.clear();
368 rMonthDays.clear(); 400 rMonthDays.clear();
369 rYearNums.clear(); 401 rYearNums.clear();
370} 402}
371 403
372void Recurrence::setRecurStart(const QDateTime &start) 404void Recurrence::setRecurStart(const QDateTime &start)
373{ 405{
374 mRecurStart = start; 406 mRecurStart = start;
375 mFloats = false; 407 mFloats = false;
376 switch (recurs) 408 switch (recurs)
377 { 409 {
378 case rMinutely: 410 case rMinutely:
379 case rHourly: 411 case rHourly:
380 break; 412 break;
381 case rDaily: 413 case rDaily:
382 case rWeekly: 414 case rWeekly:
383 case rMonthlyPos: 415 case rMonthlyPos:
384 case rMonthlyDay: 416 case rMonthlyDay:
385 case rYearlyMonth: 417 case rYearlyMonth:
386 case rYearlyDay: 418 case rYearlyDay:
387 case rYearlyPos: 419 case rYearlyPos:
388 default: 420 default:
389 rEndDateTime.setTime(start.time()); 421 rEndDateTime.setTime(start.time());
390 break; 422 break;
391 } 423 }
392} 424}
393 425
394void Recurrence::setRecurStart(const QDate &start) 426void Recurrence::setRecurStart(const QDate &start)
395{ 427{
396 mRecurStart.setDate(start); 428 mRecurStart.setDate(start);
397 mRecurStart.setTime(QTime(0,0,0)); 429 mRecurStart.setTime(QTime(0,0,0));
398 switch (recurs) 430 switch (recurs)
399 { 431 {
400 case rMinutely: 432 case rMinutely:
401 case rHourly: 433 case rHourly:
402 break; 434 break;
403 case rDaily: 435 case rDaily:
404 case rWeekly: 436 case rWeekly:
405 case rMonthlyPos: 437 case rMonthlyPos:
406 case rMonthlyDay: 438 case rMonthlyDay:
407 case rYearlyMonth: 439 case rYearlyMonth:
408 case rYearlyDay: 440 case rYearlyDay:
409 case rYearlyPos: 441 case rYearlyPos:
410 default: 442 default:
411 mFloats = true; 443 mFloats = true;
412 break; 444 break;
413 } 445 }
414} 446}
415 447
416void Recurrence::setFloats(bool f) 448void Recurrence::setFloats(bool f)
417{ 449{
418 switch (recurs) 450 switch (recurs)
419 { 451 {
420 case rDaily: 452 case rDaily:
421 case rWeekly: 453 case rWeekly:
422 case rMonthlyPos: 454 case rMonthlyPos:
423 case rMonthlyDay: 455 case rMonthlyDay:
424 case rYearlyMonth: 456 case rYearlyMonth:
425 case rYearlyDay: 457 case rYearlyDay:
426 case rYearlyPos: 458 case rYearlyPos:
427 break; 459 break;
428 case rMinutely: 460 case rMinutely:
429 case rHourly: 461 case rHourly:
430 default: 462 default:
431 return; // can't set sub-daily to floating 463 return; // can't set sub-daily to floating
432 } 464 }
433 mFloats = f; 465 mFloats = f;
434 if (f) { 466 if (f) {
435 mRecurStart.setTime(QTime(0,0,0)); 467 mRecurStart.setTime(QTime(0,0,0));
436 rEndDateTime.setTime(QTime(0,0,0)); 468 rEndDateTime.setTime(QTime(0,0,0));
437 } 469 }
438} 470}
439 471
440int Recurrence::frequency() const 472int Recurrence::frequency() const
441{ 473{
442 return rFreq; 474 return rFreq;
443} 475}
444 476
445int Recurrence::duration() const 477int Recurrence::duration() const
446{ 478{
447 return rDuration; 479 return rDuration;
448} 480}
449 481
450void Recurrence::setDuration(int _rDuration) 482void Recurrence::setDuration(int _rDuration)
451{ 483{
452 if (mRecurReadOnly) return; 484 if (mRecurReadOnly) return;
453 if (_rDuration > 0) { 485 if (_rDuration > 0) {
454 rDuration = _rDuration; 486 rDuration = _rDuration;
455 // Compatibility mode is only needed when reading the calendar in ICalFormatImpl, 487 // Compatibility mode is only needed when reading the calendar in ICalFormatImpl,
456 // so explicitly setting the duration means no backwards compatibility is needed. 488 // so explicitly setting the duration means no backwards compatibility is needed.
457 mCompatDuration = 0; 489 mCompatDuration = 0;
458 } 490 }
459} 491}
460 492
461QString Recurrence::endDateStr(bool shortfmt) const 493QString Recurrence::endDateStr(bool shortfmt) const
462{ 494{
463 return KGlobal::locale()->formatDate(rEndDateTime.date(),shortfmt); 495 return KGlobal::locale()->formatDate(rEndDateTime.date(),shortfmt);
464} 496}
465 497
466const QBitArray &Recurrence::days() const 498const QBitArray &Recurrence::days() const
467{ 499{
468 return rDays; 500 return rDays;
469} 501}
470 502
471const QPtrList<Recurrence::rMonthPos> &Recurrence::monthPositions() const 503const QPtrList<Recurrence::rMonthPos> &Recurrence::monthPositions() const
472{ 504{
473 return rMonthPositions; 505 return rMonthPositions;
474} 506}
475 507
476const QPtrList<Recurrence::rMonthPos> &Recurrence::yearMonthPositions() const 508const QPtrList<Recurrence::rMonthPos> &Recurrence::yearMonthPositions() const
477{ 509{
478 return rMonthPositions; 510 return rMonthPositions;
479} 511}
480 512
481const QPtrList<int> &Recurrence::monthDays() const 513const QPtrList<int> &Recurrence::monthDays() const
482{ 514{
483 return rMonthDays; 515 return rMonthDays;
484} 516}
485 517
486void Recurrence::setMinutely(int _rFreq, int _rDuration) 518void Recurrence::setMinutely(int _rFreq, int _rDuration)
487{ 519{
488 if (mRecurReadOnly || _rDuration == 0 || _rDuration < -1) 520 if (mRecurReadOnly || _rDuration == 0 || _rDuration < -1)
489 return; 521 return;
490 setDailySub(rMinutely, _rFreq, _rDuration); 522 setDailySub(rMinutely, _rFreq, _rDuration);
491} 523}
492 524
493void Recurrence::setMinutely(int _rFreq, const QDateTime &_rEndDateTime) 525void Recurrence::setMinutely(int _rFreq, const QDateTime &_rEndDateTime)
494{ 526{
495 if (mRecurReadOnly) return; 527 if (mRecurReadOnly) return;
496 rEndDateTime = _rEndDateTime; 528 rEndDateTime = _rEndDateTime;
497 setDailySub(rMinutely, _rFreq, 0); 529 setDailySub(rMinutely, _rFreq, 0);
498} 530}
499 531
500void Recurrence::setHourly(int _rFreq, int _rDuration) 532void Recurrence::setHourly(int _rFreq, int _rDuration)
501{ 533{
502 if (mRecurReadOnly || _rDuration == 0 || _rDuration < -1) 534 if (mRecurReadOnly || _rDuration == 0 || _rDuration < -1)
503 return; 535 return;
504 setDailySub(rHourly, _rFreq, _rDuration); 536 setDailySub(rHourly, _rFreq, _rDuration);
505} 537}
506 538
507void Recurrence::setHourly(int _rFreq, const QDateTime &_rEndDateTime) 539void Recurrence::setHourly(int _rFreq, const QDateTime &_rEndDateTime)
508{ 540{
509 if (mRecurReadOnly) return; 541 if (mRecurReadOnly) return;
510 rEndDateTime = _rEndDateTime; 542 rEndDateTime = _rEndDateTime;
511 setDailySub(rHourly, _rFreq, 0); 543 setDailySub(rHourly, _rFreq, 0);
512} 544}
513 545
514void Recurrence::setDaily(int _rFreq, int _rDuration) 546void Recurrence::setDaily(int _rFreq, int _rDuration)
515{ 547{
516 if (mRecurReadOnly || _rDuration == 0 || _rDuration < -1) 548 if (mRecurReadOnly || _rDuration == 0 || _rDuration < -1)
517 return; 549 return;
518 setDailySub(rDaily, _rFreq, _rDuration); 550 setDailySub(rDaily, _rFreq, _rDuration);
519} 551}
520 552
521void Recurrence::setDaily(int _rFreq, const QDate &_rEndDate) 553void Recurrence::setDaily(int _rFreq, const QDate &_rEndDate)
522{ 554{
523 if (mRecurReadOnly) return; 555 if (mRecurReadOnly) return;
524 rEndDateTime.setDate(_rEndDate); 556 rEndDateTime.setDate(_rEndDate);
525 rEndDateTime.setTime(mRecurStart.time()); 557 rEndDateTime.setTime(mRecurStart.time());
526 setDailySub(rDaily, _rFreq, 0); 558 setDailySub(rDaily, _rFreq, 0);
527} 559}
528 560
529void Recurrence::setWeekly(int _rFreq, const QBitArray &_rDays, 561void Recurrence::setWeekly(int _rFreq, const QBitArray &_rDays,
530 int _rDuration, int _rWeekStart) 562 int _rDuration, int _rWeekStart)
531{ 563{
532 if (mRecurReadOnly || _rDuration == 0 || _rDuration < -1) 564 if (mRecurReadOnly || _rDuration == 0 || _rDuration < -1)
533 return; 565 return;
534 recurs = rWeekly; 566 recurs = rWeekly;
535 567
536 rFreq = _rFreq; 568 rFreq = _rFreq;
537 rDays = _rDays; 569 rDays = _rDays;
538 rWeekStart = _rWeekStart; 570 rWeekStart = _rWeekStart;
539 rDuration = _rDuration; 571 rDuration = _rDuration;
540 if (mCompatVersion < 310 && _rDuration > 0) { 572 if (mCompatVersion < 310 && _rDuration > 0) {
541 // Backwards compatibility for KDE < 3.1. 573 // Backwards compatibility for KDE < 3.1.
542 // rDuration was set to the number of time periods to recur, 574 // rDuration was set to the number of time periods to recur,
543 // with week start always on a Monday. 575 // with week start always on a Monday.
544 // Convert this to the number of occurrences. 576 // Convert this to the number of occurrences.
545 mCompatDuration = _rDuration; 577 mCompatDuration = _rDuration;
546 int weeks = ((mCompatDuration-1+mRecurExDatesCount)*7) + (7 - mRecurStart.date().dayOfWeek()); 578 int weeks = ((mCompatDuration-1+mRecurExDatesCount)*7) + (7 - mRecurStart.date().dayOfWeek());
547 QDate end(mRecurStart.date().addDays(weeks * rFreq)); 579 QDate end(mRecurStart.date().addDays(weeks * rFreq));
548 rDuration = INT_MAX; // ensure that weeklyCalc() does its job correctly 580 rDuration = INT_MAX; // ensure that weeklyCalc() does its job correctly
549 rDuration = weeklyCalc(COUNT_TO_DATE, end); 581 rDuration = weeklyCalc(COUNT_TO_DATE, end);
550 } else { 582 } else {
551 mCompatDuration = 0; 583 mCompatDuration = 0;
552 } 584 }
553 rMonthPositions.clear(); 585 rMonthPositions.clear();
554 rMonthDays.clear(); 586 rMonthDays.clear();
555 if (mParent) mParent->updated(); 587 if (mParent) mParent->updated();
556} 588}
557 589
558void Recurrence::setWeekly(int _rFreq, const QBitArray &_rDays, 590void Recurrence::setWeekly(int _rFreq, const QBitArray &_rDays,
559 const QDate &_rEndDate, int _rWeekStart) 591 const QDate &_rEndDate, int _rWeekStart)
560{ 592{
561 if (mRecurReadOnly) return; 593 if (mRecurReadOnly) return;
562 recurs = rWeekly; 594 recurs = rWeekly;
563 595
564 rFreq = _rFreq; 596 rFreq = _rFreq;
565 rDays = _rDays; 597 rDays = _rDays;
566 rWeekStart = _rWeekStart; 598 rWeekStart = _rWeekStart;
567 rEndDateTime.setDate(_rEndDate); 599 rEndDateTime.setDate(_rEndDate);
568 rEndDateTime.setTime(mRecurStart.time()); 600 rEndDateTime.setTime(mRecurStart.time());
569 rDuration = 0; // set to 0 because there is an end date 601 rDuration = 0; // set to 0 because there is an end date
570 mCompatDuration = 0; 602 mCompatDuration = 0;
571 rMonthPositions.clear(); 603 rMonthPositions.clear();
572 rMonthDays.clear(); 604 rMonthDays.clear();
573 rYearNums.clear(); 605 rYearNums.clear();
574 if (mParent) mParent->updated(); 606 if (mParent) mParent->updated();
575} 607}
576 608
577void Recurrence::setMonthly(short type, int _rFreq, int _rDuration) 609void Recurrence::setMonthly(short type, int _rFreq, int _rDuration)
578{ 610{
579 if (mRecurReadOnly || _rDuration == 0 || _rDuration < -1) 611 if (mRecurReadOnly || _rDuration == 0 || _rDuration < -1)
580 return; 612 return;
581 recurs = type; 613 recurs = type;
582 614
583 rFreq = _rFreq; 615 rFreq = _rFreq;
584 rDuration = _rDuration; 616 rDuration = _rDuration;
585 if (mCompatVersion < 310) 617 if (mCompatVersion < 310)
586 mCompatDuration = (_rDuration > 0) ? _rDuration : 0; 618 mCompatDuration = (_rDuration > 0) ? _rDuration : 0;
587 rYearNums.clear(); 619 rYearNums.clear();
588 if (mParent) mParent->updated(); 620 if (mParent) mParent->updated();
589} 621}
590 622
591void Recurrence::setMonthly(short type, int _rFreq, 623void Recurrence::setMonthly(short type, int _rFreq,
592 const QDate &_rEndDate) 624 const QDate &_rEndDate)
593{ 625{
594 if (mRecurReadOnly) return; 626 if (mRecurReadOnly) return;
595 recurs = type; 627 recurs = type;
596 628
597 rFreq = _rFreq; 629 rFreq = _rFreq;
598 rEndDateTime.setDate(_rEndDate); 630 rEndDateTime.setDate(_rEndDate);
599 rEndDateTime.setTime(mRecurStart.time()); 631 rEndDateTime.setTime(mRecurStart.time());
600 rDuration = 0; // set to 0 because there is an end date 632 rDuration = 0; // set to 0 because there is an end date
601 mCompatDuration = 0; 633 mCompatDuration = 0;
602 rYearNums.clear(); 634 rYearNums.clear();
603 if (mParent) mParent->updated(); 635 if (mParent) mParent->updated();
604} 636}
605 637
606void Recurrence::addMonthlyPos(short _rPos, const QBitArray &_rDays) 638void Recurrence::addMonthlyPos(short _rPos, const QBitArray &_rDays)
607{ 639{
608 if (recurs == rMonthlyPos) 640 if (recurs == rMonthlyPos)
609 addMonthlyPos_(_rPos, _rDays); 641 addMonthlyPos_(_rPos, _rDays);
610} 642}
611 643
612void Recurrence::addMonthlyPos_(short _rPos, const QBitArray &_rDays) 644void Recurrence::addMonthlyPos_(short _rPos, const QBitArray &_rDays)
613{ 645{
614 if (mRecurReadOnly 646 if (mRecurReadOnly
615 || _rPos == 0 || _rPos > 5 || _rPos < -5) // invalid week number 647 || _rPos == 0 || _rPos > 5 || _rPos < -5) // invalid week number
616 return; 648 return;
617 649
618 for (rMonthPos* it = rMonthPositions.first(); it; it = rMonthPositions.next()) { 650 for (rMonthPos* it = rMonthPositions.first(); it; it = rMonthPositions.next()) {
619 int itPos = it->negative ? -it->rPos : it->rPos; 651 int itPos = it->negative ? -it->rPos : it->rPos;
620 if (_rPos == itPos) { 652 if (_rPos == itPos) {
621 // This week is already in the list. 653 // This week is already in the list.
622 // Combine the specified days with those in the list. 654 // Combine the specified days with those in the list.
623 it->rDays |= _rDays; 655 it->rDays |= _rDays;
624 if (mParent) mParent->updated(); 656 if (mParent) mParent->updated();
625 return; 657 return;
626 } 658 }
627 } 659 }
628 // Add the new position to the list 660 // Add the new position to the list
629 rMonthPos *tmpPos = new rMonthPos; 661 rMonthPos *tmpPos = new rMonthPos;
630 if (_rPos > 0) { 662 if (_rPos > 0) {
631 tmpPos->rPos = _rPos; 663 tmpPos->rPos = _rPos;
632 tmpPos->negative = false; 664 tmpPos->negative = false;
633 } else { 665 } else {
634 tmpPos->rPos = -_rPos; // take abs() 666 tmpPos->rPos = -_rPos; // take abs()
635 tmpPos->negative = true; 667 tmpPos->negative = true;
636 } 668 }
637 tmpPos->rDays = _rDays; 669 tmpPos->rDays = _rDays;
638 tmpPos->rDays.detach(); 670 tmpPos->rDays.detach();
639 rMonthPositions.append(tmpPos); 671 rMonthPositions.append(tmpPos);
640 672
641 if (mCompatVersion < 310 && mCompatDuration > 0) { 673 if (mCompatVersion < 310 && mCompatDuration > 0) {
642 // Backwards compatibility for KDE < 3.1. 674 // Backwards compatibility for KDE < 3.1.
643 // rDuration was set to the number of time periods to recur. 675 // rDuration was set to the number of time periods to recur.
644 // Convert this to the number of occurrences. 676 // Convert this to the number of occurrences.
645 int monthsAhead = (mCompatDuration-1+mRecurExDatesCount) * rFreq; 677 int monthsAhead = (mCompatDuration-1+mRecurExDatesCount) * rFreq;
646 int month = mRecurStart.date().month() - 1 + monthsAhead; 678 int month = mRecurStart.date().month() - 1 + monthsAhead;
647 QDate end(mRecurStart.date().year() + month/12, month%12 + 1, 31); 679 QDate end(mRecurStart.date().year() + month/12, month%12 + 1, 31);
648 rDuration = INT_MAX; // ensure that recurCalc() does its job correctly 680 rDuration = INT_MAX; // ensure that recurCalc() does its job correctly
diff --git a/libkcal/sharpformat.cpp b/libkcal/sharpformat.cpp
index defdb09..89eb72f 100644
--- a/libkcal/sharpformat.cpp
+++ b/libkcal/sharpformat.cpp
@@ -1,889 +1,890 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 3
4 Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org> 4 Copyright (c) 2003 Cornelius Schumacher <schumacher@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 38
39#include "calendar.h" 39#include "calendar.h"
40#include "alarm.h" 40#include "alarm.h"
41#include "recurrence.h" 41#include "recurrence.h"
42#include "calendarlocal.h" 42#include "calendarlocal.h"
43 43
44#include "sharpformat.h" 44#include "sharpformat.h"
45#include "syncdefines.h" 45#include "syncdefines.h"
46 46
47using namespace KCal; 47using namespace KCal;
48 48
49//CARDID,CATEGORY,DSRP,PLCE,MEM1,TIM1,TIM2,ADAY,ARON,ARMN,ARSD,RTYP,RFRQ,RPOS,RDYS,REND,REDT,ALSD,ALED,MDAY 49//CARDID,CATEGORY,DSRP,PLCE,MEM1,TIM1,TIM2,ADAY,ARON,ARMN,ARSD,RTYP,RFRQ,RPOS,RDYS,REND,REDT,ALSD,ALED,MDAY
50// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 50// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
51 51
52//ARSD silentalarm = 0 52//ARSD silentalarm = 0
53// 11 RTYP 225 no /0 dialy/ 1 weekly/ 3 month by date/ 2 month by day(pos)/ yearly 53// 11 RTYP 225 no /0 dialy/ 1 weekly/ 3 month by date/ 2 month by day(pos)/ yearly
54// 12 RFRQ 54// 12 RFRQ
55// 13 RPOS pos = 4. monday in month 55// 13 RPOS pos = 4. monday in month
56// 14 RDYS days: 1 mon/ 2 tue .. 64 sun 56// 14 RDYS days: 1 mon/ 2 tue .. 64 sun
57// 15 REND 0 = no end/ 1 = end 57// 15 REND 0 = no end/ 1 = end
58// 16 REDT rec end dt 58// 16 REDT rec end dt
59//ALSD 59//ALSD
60//ALED 60//ALED
61//MDAY 61//MDAY
62 62
63class SharpParser : public QObject 63class SharpParser : public QObject
64{ 64{
65 public: 65 public:
66 SharpParser( Calendar *calendar ) : mCalendar( calendar ) { 66 SharpParser( Calendar *calendar ) : mCalendar( calendar ) {
67 oldCategories = 0; 67 oldCategories = 0;
68 } 68 }
69 69
70 bool startElement( Calendar *existingCalendar, const QStringList & attList, QString qName ) 70 bool startElement( Calendar *existingCalendar, const QStringList & attList, QString qName )
71 { 71 {
72 int i = 1; 72 int i = 1;
73 bool skip = true; 73 bool skip = true;
74 int max = attList.count() -2; 74 int max = attList.count() -2;
75 while ( i < max ) { 75 while ( i < max ) {
76 if ( !attList[i].isEmpty() ) { 76 if ( !attList[i].isEmpty() ) {
77 skip = false; 77 skip = false;
78 break; 78 break;
79 } 79 }
80 ++i ; 80 ++i ;
81 } 81 }
82 if ( skip ) 82 if ( skip )
83 return false; 83 return false;
84 ulong cSum = SharpFormat::getCsum(attList ); 84 ulong cSum = SharpFormat::getCsum(attList );
85 85
86 if ( qName == "Event" ) { 86 if ( qName == "Event" ) {
87 Event *event; 87 Event *event;
88 event = existingCalendar->event( "Sharp_DTM",attList[0] ); 88 event = existingCalendar->event( "Sharp_DTM",attList[0] );
89 if ( event ) 89 if ( event )
90 event = (Event*)event->clone(); 90 event = (Event*)event->clone();
91 else 91 else
92 event = new Event; 92 event = new Event;
93 event->setID("Sharp_DTM", attList[0] ); 93 event->setID("Sharp_DTM", attList[0] );
94 event->setCsum( "Sharp_DTM", QString::number( cSum )); 94 event->setCsum( "Sharp_DTM", QString::number( cSum ));
95 event->setTempSyncStat(SYNC_TEMPSTATE_NEW_EXTERNAL ); 95 event->setTempSyncStat(SYNC_TEMPSTATE_NEW_EXTERNAL );
96 96
97 event->setSummary( attList[2] ); 97 event->setSummary( attList[2] );
98 event->setLocation( attList[3] ); 98 event->setLocation( attList[3] );
99 event->setDescription( attList[4] ); 99 event->setDescription( attList[4] );
100 if ( attList[7] == "1" ) { 100 if ( attList[7] == "1" ) {
101 event->setDtStart( QDateTime(fromString( attList[17]+"T000000", false ).date(),QTime(0,0,0 ) )); 101 event->setDtStart( QDateTime(fromString( attList[17]+"T000000", false ).date(),QTime(0,0,0 ) ));
102 event->setDtEnd( QDateTime(fromString( attList[18]+"T000000", false ).date(),QTime(0,0,0 ))); 102 event->setDtEnd( QDateTime(fromString( attList[18]+"T000000", false ).date(),QTime(0,0,0 )));
103 event->setFloats( true ); 103 event->setFloats( true );
104 } else { 104 } else {
105 event->setFloats( false ); 105 event->setFloats( false );
106 event->setDtStart( fromString( attList[5] ) ); 106 event->setDtStart( fromString( attList[5] ) );
107 event->setDtEnd( fromString( attList[6] )); 107 event->setDtEnd( fromString( attList[6] ));
108 } 108 }
109 109
110 QString rtype = attList[11]; 110 QString rtype = attList[11];
111 if ( rtype != "255" ) { 111 if ( rtype != "255" ) {
112 // qDebug("recurs "); 112 // qDebug("recurs ");
113 QDate startDate = event->dtStart().date(); 113 QDate startDate = event->dtStart().date();
114 114
115 QString freqStr = attList[12]; 115 QString freqStr = attList[12];
116 int freq = freqStr.toInt(); 116 int freq = freqStr.toInt();
117 117
118 QString hasEndDateStr = attList[15] ; 118 QString hasEndDateStr = attList[15] ;
119 bool hasEndDate = hasEndDateStr == "1"; 119 bool hasEndDate = hasEndDateStr == "1";
120 120
121 QString endDateStr = attList[16]; 121 QString endDateStr = attList[16];
122 QDate endDate = fromString( endDateStr ).date(); 122 QDate endDate = fromString( endDateStr ).date();
123 123
124 QString weekDaysStr = attList[14]; 124 QString weekDaysStr = attList[14];
125 uint weekDaysNum = weekDaysStr.toInt(); 125 uint weekDaysNum = weekDaysStr.toInt();
126 126
127 QBitArray weekDays( 7 ); 127 QBitArray weekDays( 7 );
128 int i; 128 int i;
129 int bb = 1; 129 int bb = 1;
130 for( i = 1; i <= 7; ++i ) { 130 for( i = 1; i <= 7; ++i ) {
131 weekDays.setBit( i - 1, ( bb & weekDaysNum )); 131 weekDays.setBit( i - 1, ( bb & weekDaysNum ));
132 bb = 2 << (i-1); 132 bb = 2 << (i-1);
133 //qDebug(" %d bit %d ",i-1,weekDays.at(i-1) ); 133 //qDebug(" %d bit %d ",i-1,weekDays.at(i-1) );
134 } 134 }
135 // qDebug("next "); 135 // qDebug("next ");
136 QString posStr = attList[13]; 136 QString posStr = attList[13];
137 int pos = posStr.toInt(); 137 int pos = posStr.toInt();
138 Recurrence *r = event->recurrence(); 138 Recurrence *r = event->recurrence();
139 139
140 if ( rtype == "0" ) { 140 if ( rtype == "0" ) {
141 if ( hasEndDate ) r->setDaily( freq, endDate ); 141 if ( hasEndDate ) r->setDaily( freq, endDate );
142 else r->setDaily( freq, -1 ); 142 else r->setDaily( freq, -1 );
143 } else if ( rtype == "1" ) { 143 } else if ( rtype == "1" ) {
144 if ( hasEndDate ) r->setWeekly( freq, weekDays, endDate ); 144 if ( hasEndDate ) r->setWeekly( freq, weekDays, endDate );
145 else r->setWeekly( freq, weekDays, -1 ); 145 else r->setWeekly( freq, weekDays, -1 );
146 } else if ( rtype == "3" ) { 146 } else if ( rtype == "3" ) {
147 if ( hasEndDate ) 147 if ( hasEndDate )
148 r->setMonthly( Recurrence::rMonthlyDay, freq, endDate ); 148 r->setMonthly( Recurrence::rMonthlyDay, freq, endDate );
149 else 149 else
150 r->setMonthly( Recurrence::rMonthlyDay, freq, -1 ); 150 r->setMonthly( Recurrence::rMonthlyDay, freq, -1 );
151 r->addMonthlyDay( startDate.day() ); 151 r->addMonthlyDay( startDate.day() );
152 } else if ( rtype == "2" ) { 152 } else if ( rtype == "2" ) {
153 if ( hasEndDate ) 153 if ( hasEndDate )
154 r->setMonthly( Recurrence::rMonthlyPos, freq, endDate ); 154 r->setMonthly( Recurrence::rMonthlyPos, freq, endDate );
155 else 155 else
156 r->setMonthly( Recurrence::rMonthlyPos, freq, -1 ); 156 r->setMonthly( Recurrence::rMonthlyPos, freq, -1 );
157 QBitArray days( 7 ); 157 QBitArray days( 7 );
158 days.fill( false ); 158 days.fill( false );
159 days.setBit( startDate.dayOfWeek() - 1 ); 159 days.setBit( startDate.dayOfWeek() - 1 );
160 r->addMonthlyPos( pos, days ); 160 r->addMonthlyPos( pos, days );
161 } else if ( rtype == "4" ) { 161 } else if ( rtype == "4" ) {
162 if ( hasEndDate ) 162 if ( hasEndDate )
163 r->setYearly( Recurrence::rYearlyMonth, freq, endDate ); 163 r->setYearly( Recurrence::rYearlyMonth, freq, endDate );
164 else 164 else
165 r->setYearly( Recurrence::rYearlyMonth, freq, -1 ); 165 r->setYearly( Recurrence::rYearlyMonth, freq, -1 );
166 r->addYearlyNum( startDate.month() ); 166 r->addYearlyNum( startDate.month() );
167 } 167 }
168 } else { 168 } else {
169 event->recurrence()->unsetRecurs(); 169 event->recurrence()->unsetRecurs();
170 } 170 }
171 171
172 QString categoryList = attList[1] ; 172 QString categoryList = attList[1] ;
173 event->setCategories( lookupCategories( categoryList ) ); 173 event->setCategories( lookupCategories( categoryList ) );
174 174
175 // strange 0 semms to mean: alarm enabled 175 // strange 0 semms to mean: alarm enabled
176 if ( attList[8] == "0" ) { 176 if ( attList[8] == "0" ) {
177 Alarm *alarm; 177 Alarm *alarm;
178 if ( event->alarms().count() > 0 ) 178 if ( event->alarms().count() > 0 )
179 alarm = event->alarms().first(); 179 alarm = event->alarms().first();
180 else { 180 else {
181 alarm = new Alarm( event ); 181 alarm = new Alarm( event );
182 event->addAlarm( alarm ); 182 event->addAlarm( alarm );
183 alarm->setType( Alarm::Audio );
183 } 184 }
184 alarm->setType( Alarm::Audio ); 185 //alarm->setType( Alarm::Audio );
185 alarm->setEnabled( true ); 186 alarm->setEnabled( true );
186 int alarmOffset = attList[9].toInt(); 187 int alarmOffset = attList[9].toInt();
187 alarm->setStartOffset( alarmOffset * -60 ); 188 alarm->setStartOffset( alarmOffset * -60 );
188 } else { 189 } else {
189 Alarm *alarm; 190 Alarm *alarm;
190 if ( event->alarms().count() > 0 ) { 191 if ( event->alarms().count() > 0 ) {
191 alarm = event->alarms().first(); 192 alarm = event->alarms().first();
192 alarm->setType( Alarm::Audio ); 193 alarm->setType( Alarm::Audio );
193 alarm->setStartOffset( -60*15 ); 194 alarm->setStartOffset( -60*15 );
194 alarm->setEnabled( false ); 195 alarm->setEnabled( false );
195 } 196 }
196 } 197 }
197 198
198 mCalendar->addEvent( event); 199 mCalendar->addEvent( event);
199 } else if ( qName == "Todo" ) { 200 } else if ( qName == "Todo" ) {
200 Todo *todo; 201 Todo *todo;
201 202
202 todo = existingCalendar->todo( "Sharp_DTM", attList[0] ); 203 todo = existingCalendar->todo( "Sharp_DTM", attList[0] );
203 if (todo ) 204 if (todo )
204 todo = (Todo*)todo->clone(); 205 todo = (Todo*)todo->clone();
205 else 206 else
206 todo = new Todo; 207 todo = new Todo;
207 208
208//CARDID,CATEGORY,ETDY,LTDY,FNDY,MARK,PRTY,TITL,MEM1 209//CARDID,CATEGORY,ETDY,LTDY,FNDY,MARK,PRTY,TITL,MEM1
209// 0 1 2 3 4 5 6 7 8 210// 0 1 2 3 4 5 6 7 8
210//1,,,,,1,4,Loch zumachen,"" 211//1,,,,,1,4,Loch zumachen,""
211//3,Privat,20040317T000000,20040318T000000,20040319T000000,0,5,Call bbb,"notes123 bbb gggg ""bb "" " 212//3,Privat,20040317T000000,20040318T000000,20040319T000000,0,5,Call bbb,"notes123 bbb gggg ""bb "" "
212//2,"Familie,Freunde,Holiday",20040318T000000,20040324T000000,20040317T000000,1,2,tod2,notes 213//2,"Familie,Freunde,Holiday",20040318T000000,20040324T000000,20040317T000000,1,2,tod2,notes
213 214
214 todo->setID( "Sharp_DTM", attList[0]); 215 todo->setID( "Sharp_DTM", attList[0]);
215 todo->setCsum( "Sharp_DTM", QString::number( cSum )); 216 todo->setCsum( "Sharp_DTM", QString::number( cSum ));
216 todo->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL ); 217 todo->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL );
217 218
218 todo->setSummary( attList[7] ); 219 todo->setSummary( attList[7] );
219 todo->setDescription( attList[8]); 220 todo->setDescription( attList[8]);
220 221
221 int priority = attList[6].toInt(); 222 int priority = attList[6].toInt();
222 if ( priority == 0 ) priority = 3; 223 if ( priority == 0 ) priority = 3;
223 todo->setPriority( priority ); 224 todo->setPriority( priority );
224 225
225 QString categoryList = attList[1]; 226 QString categoryList = attList[1];
226 todo->setCategories( lookupCategories( categoryList ) ); 227 todo->setCategories( lookupCategories( categoryList ) );
227 228
228 229
229 230
230 QString hasDateStr = attList[3]; // due 231 QString hasDateStr = attList[3]; // due
231 if ( !hasDateStr.isEmpty() ) { 232 if ( !hasDateStr.isEmpty() ) {
232 if ( hasDateStr.right(6) == "000000" ) { 233 if ( hasDateStr.right(6) == "000000" ) {
233 todo->setDtDue( QDateTime(fromString( hasDateStr, false ).date(), QTime(0,0,0 )) ); 234 todo->setDtDue( QDateTime(fromString( hasDateStr, false ).date(), QTime(0,0,0 )) );
234 todo->setFloats( true ); 235 todo->setFloats( true );
235 } 236 }
236 else { 237 else {
237 todo->setDtDue( fromString( hasDateStr ) ); 238 todo->setDtDue( fromString( hasDateStr ) );
238 todo->setFloats( false ); 239 todo->setFloats( false );
239 } 240 }
240 241
241 todo->setHasDueDate( true ); 242 todo->setHasDueDate( true );
242 } 243 }
243 hasDateStr = attList[2];//start 244 hasDateStr = attList[2];//start
244 if ( !hasDateStr.isEmpty() ) { 245 if ( !hasDateStr.isEmpty() ) {
245 246
246 todo->setDtStart( fromString( hasDateStr ) ); 247 todo->setDtStart( fromString( hasDateStr ) );
247 todo->setHasStartDate( true); 248 todo->setHasStartDate( true);
248 } else 249 } else
249 todo->setHasStartDate( false ); 250 todo->setHasStartDate( false );
250 hasDateStr = attList[4];//completed 251 hasDateStr = attList[4];//completed
251 if ( !hasDateStr.isEmpty() ) { 252 if ( !hasDateStr.isEmpty() ) {
252 todo->setCompleted(fromString( hasDateStr ) ); 253 todo->setCompleted(fromString( hasDateStr ) );
253 } 254 }
254 QString completedStr = attList[5]; 255 QString completedStr = attList[5];
255 if ( completedStr == "0" ) 256 if ( completedStr == "0" )
256 todo->setCompleted( true ); 257 todo->setCompleted( true );
257 else 258 else
258 todo->setCompleted( false ); 259 todo->setCompleted( false );
259 mCalendar->addTodo( todo ); 260 mCalendar->addTodo( todo );
260 261
261 } else if ( qName == "Category" ) { 262 } else if ( qName == "Category" ) {
262 /* 263 /*
263 QString id = attributes.value( "id" ); 264 QString id = attributes.value( "id" );
264 QString name = attributes.value( "name" ); 265 QString name = attributes.value( "name" );
265 setCategory( id, name ); 266 setCategory( id, name );
266 */ 267 */
267 } 268 }
268 //qDebug("end "); 269 //qDebug("end ");
269 return true; 270 return true;
270 } 271 }
271 272
272 273
273 void setCategoriesList ( QStringList * c ) 274 void setCategoriesList ( QStringList * c )
274 { 275 {
275 oldCategories = c; 276 oldCategories = c;
276 } 277 }
277 278
278 QDateTime fromString ( QString s, bool useTz = true ) { 279 QDateTime fromString ( QString s, bool useTz = true ) {
279 QDateTime dt; 280 QDateTime dt;
280 int y,m,t,h,min,sec; 281 int y,m,t,h,min,sec;
281 y = s.mid(0,4).toInt(); 282 y = s.mid(0,4).toInt();
282 m = s.mid(4,2).toInt(); 283 m = s.mid(4,2).toInt();
283 t = s.mid(6,2).toInt(); 284 t = s.mid(6,2).toInt();
284 h = s.mid(9,2).toInt(); 285 h = s.mid(9,2).toInt();
285 min = s.mid(11,2).toInt(); 286 min = s.mid(11,2).toInt();
286 sec = s.mid(13,2).toInt(); 287 sec = s.mid(13,2).toInt();
287 dt = QDateTime(QDate(y,m,t), QTime(h,min,sec)); 288 dt = QDateTime(QDate(y,m,t), QTime(h,min,sec));
288 int offset = KGlobal::locale()->localTimeOffset( dt ); 289 int offset = KGlobal::locale()->localTimeOffset( dt );
289 if ( useTz ) 290 if ( useTz )
290 dt = dt.addSecs ( offset*60); 291 dt = dt.addSecs ( offset*60);
291 return dt; 292 return dt;
292 293
293 } 294 }
294 protected: 295 protected:
295 QDateTime toDateTime( const QString &value ) 296 QDateTime toDateTime( const QString &value )
296 { 297 {
297 QDateTime dt; 298 QDateTime dt;
298 dt.setTime_t( value.toUInt() ); 299 dt.setTime_t( value.toUInt() );
299 300
300 return dt; 301 return dt;
301 } 302 }
302 303
303 QStringList lookupCategories( const QString &categoryList ) 304 QStringList lookupCategories( const QString &categoryList )
304 { 305 {
305 QStringList categoryIds = QStringList::split( ";", categoryList ); 306 QStringList categoryIds = QStringList::split( ";", categoryList );
306 QStringList categories; 307 QStringList categories;
307 QStringList::ConstIterator it; 308 QStringList::ConstIterator it;
308 for( it = categoryIds.begin(); it != categoryIds.end(); ++it ) { 309 for( it = categoryIds.begin(); it != categoryIds.end(); ++it ) {
309 QString cate = category( *it ); 310 QString cate = category( *it );
310 if ( oldCategories ) { 311 if ( oldCategories ) {
311 if ( ! oldCategories->contains( cate ) ) 312 if ( ! oldCategories->contains( cate ) )
312 oldCategories->append( cate ); 313 oldCategories->append( cate );
313 } 314 }
314 categories.append(cate ); 315 categories.append(cate );
315 } 316 }
316 return categories; 317 return categories;
317 } 318 }
318 319
319 private: 320 private:
320 Calendar *mCalendar; 321 Calendar *mCalendar;
321 QStringList * oldCategories; 322 QStringList * oldCategories;
322 static QString category( const QString &id ) 323 static QString category( const QString &id )
323 { 324 {
324 QMap<QString,QString>::ConstIterator it = mCategoriesMap.find( id ); 325 QMap<QString,QString>::ConstIterator it = mCategoriesMap.find( id );
325 if ( it == mCategoriesMap.end() ) return id; 326 if ( it == mCategoriesMap.end() ) return id;
326 else return *it; 327 else return *it;
327 } 328 }
328 329
329 static void setCategory( const QString &id, const QString &name ) 330 static void setCategory( const QString &id, const QString &name )
330 { 331 {
331 mCategoriesMap.insert( id, name ); 332 mCategoriesMap.insert( id, name );
332 } 333 }
333 334
334 static QMap<QString,QString> mCategoriesMap; 335 static QMap<QString,QString> mCategoriesMap;
335}; 336};
336 337
337QMap<QString,QString> SharpParser::mCategoriesMap; 338QMap<QString,QString> SharpParser::mCategoriesMap;
338 339
339SharpFormat::SharpFormat() 340SharpFormat::SharpFormat()
340{ 341{
341 mCategories = 0; 342 mCategories = 0;
342} 343}
343 344
344SharpFormat::~SharpFormat() 345SharpFormat::~SharpFormat()
345{ 346{
346} 347}
347ulong SharpFormat::getCsum( const QStringList & attList) 348ulong SharpFormat::getCsum( const QStringList & attList)
348{ 349{
349 int max = attList.count() -1; 350 int max = attList.count() -1;
350 ulong cSum = 0; 351 ulong cSum = 0;
351 int j,k,i; 352 int j,k,i;
352 int add; 353 int add;
353 for ( i = 1; i < max ; ++i ) { 354 for ( i = 1; i < max ; ++i ) {
354 QString s = attList[i]; 355 QString s = attList[i];
355 if ( ! s.isEmpty() ){ 356 if ( ! s.isEmpty() ){
356 j = s.length(); 357 j = s.length();
357 for ( k = 0; k < j; ++k ) { 358 for ( k = 0; k < j; ++k ) {
358 int mul = k +1; 359 int mul = k +1;
359 add = s[k].unicode (); 360 add = s[k].unicode ();
360 if ( k < 16 ) 361 if ( k < 16 )
361 mul = mul * mul; 362 mul = mul * mul;
362 add = add * mul *i*i*i; 363 add = add * mul *i*i*i;
363 cSum += add; 364 cSum += add;
364 } 365 }
365 } 366 }
366 } 367 }
367 return cSum; 368 return cSum;
368 369
369} 370}
370#include <stdlib.h> 371#include <stdlib.h>
371#define DEBUGMODE false 372//#define DEBUGMODE false
373#define DEBUGMODE true
372bool SharpFormat::load( Calendar *calendar, Calendar *existngCal ) 374bool SharpFormat::load( Calendar *calendar, Calendar *existngCal )
373{ 375{
374 376
375 377
376 bool debug = DEBUGMODE; 378 bool debug = DEBUGMODE;
377 //debug = true;
378 QString text; 379 QString text;
379 QString codec = "utf8"; 380 QString codec = "utf8";
380 QLabel status ( i18n("Reading events ..."), 0 ); 381 QLabel status ( i18n("Reading events ..."), 0 );
381 382
382 int w = status.sizeHint().width()+20 ; 383 int w = status.sizeHint().width()+20 ;
383 if ( w < 200 ) w = 200; 384 if ( w < 200 ) w = 200;
384 int h = status.sizeHint().height()+20 ; 385 int h = status.sizeHint().height()+20 ;
385 int dw = QApplication::desktop()->width(); 386 int dw = QApplication::desktop()->width();
386 int dh = QApplication::desktop()->height(); 387 int dh = QApplication::desktop()->height();
387 status.setCaption(i18n("Reading DTM Data") ); 388 status.setCaption(i18n("Reading DTM Data") );
388 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 389 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
389 status.show(); 390 status.show();
390 status.raise(); 391 status.raise();
391 qApp->processEvents(); 392 qApp->processEvents();
392 QString fileName; 393 QString fileName;
393 if ( ! debug ) { 394 if ( ! debug ) {
394 fileName = "/tmp/kopitempout"; 395 fileName = "/tmp/kopitempout";
395 QString command ="db2file datebook -r -c "+ codec + " > " + fileName; 396 QString command ="db2file datebook -r -c "+ codec + " > " + fileName;
396 system ( command.latin1() ); 397 system ( command.latin1() );
397 } else { 398 } else {
398 fileName = "/tmp/events.txt"; 399 fileName = "/tmp/events.txt";
399 400
400 } 401 }
401 QFile file( fileName ); 402 QFile file( fileName );
402 if (!file.open( IO_ReadOnly ) ) { 403 if (!file.open( IO_ReadOnly ) ) {
403 return false; 404 return false;
404 405
405 } 406 }
406 QTextStream ts( &file ); 407 QTextStream ts( &file );
407 ts.setCodec( QTextCodec::codecForName("utf8") ); 408 ts.setCodec( QTextCodec::codecForName("utf8") );
408 text = ts.read(); 409 text = ts.read();
409 file.close(); 410 file.close();
410 status.setText( i18n("Processing events ...") ); 411 status.setText( i18n("Processing events ...") );
411 status.raise(); 412 status.raise();
412 qApp->processEvents(); 413 qApp->processEvents();
413 fromString2Cal( calendar, existngCal, text, "Event" ); 414 fromString2Cal( calendar, existngCal, text, "Event" );
414 status.setText( i18n("Reading todos ...") ); 415 status.setText( i18n("Reading todos ...") );
415 qApp->processEvents(); 416 qApp->processEvents();
416 if ( ! debug ) { 417 if ( ! debug ) {
417 fileName = "/tmp/kopitempout"; 418 fileName = "/tmp/kopitempout";
418 QString command = "db2file todo -r -c " + codec+ " > " + fileName; 419 QString command = "db2file todo -r -c " + codec+ " > " + fileName;
419 system ( command.latin1() ); 420 system ( command.latin1() );
420 } else { 421 } else {
421 fileName = "/tmp/todo.txt"; 422 fileName = "/tmp/todo.txt";
422 } 423 }
423 file.setName( fileName ); 424 file.setName( fileName );
424 if (!file.open( IO_ReadOnly ) ) { 425 if (!file.open( IO_ReadOnly ) ) {
425 return false; 426 return false;
426 427
427 } 428 }
428 ts.setDevice( &file ); 429 ts.setDevice( &file );
429 text = ts.read(); 430 text = ts.read();
430 file.close(); 431 file.close();
431 432
432 status.setText( i18n("Processing todos ...") ); 433 status.setText( i18n("Processing todos ...") );
433 status.raise(); 434 status.raise();
434 qApp->processEvents(); 435 qApp->processEvents();
435 fromString2Cal( calendar, existngCal, text, "Todo" ); 436 fromString2Cal( calendar, existngCal, text, "Todo" );
436 return true; 437 return true;
437} 438}
438int SharpFormat::getNumFromRecord( QString answer, Incidence* inc ) 439int SharpFormat::getNumFromRecord( QString answer, Incidence* inc )
439{ 440{
440 int retval = -1; 441 int retval = -1;
441 QStringList templist; 442 QStringList templist;
442 QString tempString; 443 QString tempString;
443 int start = 0; 444 int start = 0;
444 int len = answer.length(); 445 int len = answer.length();
445 int end = answer.find ("\n",start)+1; 446 int end = answer.find ("\n",start)+1;
446 bool ok = true; 447 bool ok = true;
447 start = end; 448 start = end;
448 int ccc = 0; 449 int ccc = 0;
449 while ( start > 0 ) { 450 while ( start > 0 ) {
450 templist.clear(); 451 templist.clear();
451 ok = true; 452 ok = true;
452 int loopCount = 0; 453 int loopCount = 0;
453 while ( ok ) { 454 while ( ok ) {
454 ++loopCount; 455 ++loopCount;
455 if ( loopCount > 25 ) { 456 if ( loopCount > 25 ) {
456 qDebug("KO: Error in while loop"); 457 qDebug("KO: Error in while loop");
457 ok = false; 458 ok = false;
458 start = 0; 459 start = 0;
459 break; 460 break;
460 } 461 }
461 if ( ok ) 462 if ( ok )
462 tempString = getPart( answer, ok, start ); 463 tempString = getPart( answer, ok, start );
463 if ( start >= len || start == 0 ) { 464 if ( start >= len || start == 0 ) {
464 start = 0; 465 start = 0;
465 ok = false; 466 ok = false;
466 } 467 }
467 if ( tempString.right(1) =="\n" ) 468 if ( tempString.right(1) =="\n" )
468 tempString = tempString.left( tempString.length()-1); 469 tempString = tempString.left( tempString.length()-1);
469 470
470 templist.append( tempString ); 471 templist.append( tempString );
471 } 472 }
472 ++ccc; 473 ++ccc;
473 if ( ccc == 2 && loopCount < 25 ) { 474 if ( ccc == 2 && loopCount < 25 ) {
474 start = 0; 475 start = 0;
475 bool ok; 476 bool ok;
476 int newnum = templist[0].toInt( &ok ); 477 int newnum = templist[0].toInt( &ok );
477 if ( ok && newnum > 0) { 478 if ( ok && newnum > 0) {
478 retval = newnum; 479 retval = newnum;
479 inc->setID( "Sharp_DTM",templist[0] ); 480 inc->setID( "Sharp_DTM",templist[0] );
480 inc->setCsum( "Sharp_DTM", QString::number( getCsum( templist ) )); 481 inc->setCsum( "Sharp_DTM", QString::number( getCsum( templist ) ));
481 inc->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID ); 482 inc->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID );
482 } 483 }
483 } 484 }
484 } 485 }
485 //qDebug("getNumFromRecord returning : %d ", retval); 486 //qDebug("getNumFromRecord returning : %d ", retval);
486 return retval; 487 return retval;
487} 488}
488bool SharpFormat::save( Calendar *calendar) 489bool SharpFormat::save( Calendar *calendar)
489{ 490{
490 491
491 QLabel status ( i18n("Processing/adding events ..."), 0 ); 492 QLabel status ( i18n("Processing/adding events ..."), 0 );
492 int w = status.sizeHint().width()+20 ; 493 int w = status.sizeHint().width()+20 ;
493 if ( w < 200 ) w = 200; 494 if ( w < 200 ) w = 200;
494 int h = status.sizeHint().height()+20 ; 495 int h = status.sizeHint().height()+20 ;
495 int dw = QApplication::desktop()->width(); 496 int dw = QApplication::desktop()->width();
496 int dh = QApplication::desktop()->height(); 497 int dh = QApplication::desktop()->height();
497 status.setCaption(i18n("Writing DTM Data") ); 498 status.setCaption(i18n("Writing DTM Data") );
498 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 499 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
499 status.show(); 500 status.show();
500 status.raise(); 501 status.raise();
501 qApp->processEvents(); 502 qApp->processEvents();
502 bool debug = DEBUGMODE; 503 bool debug = DEBUGMODE;
503 QString codec = "utf8"; 504 QString codec = "utf8";
504 QString answer; 505 QString answer;
505 QString ePrefix = "CARDID,CATEGORY,DSRP,PLCE,MEM1,TIM1,TIM2,ADAY,ARON,ARMN,ARSD,RTYP,RFRQ,RPOS,RDYS,REND,REDT,ALSD,ALED,MDAY\n"; 506 QString ePrefix = "CARDID,CATEGORY,DSRP,PLCE,MEM1,TIM1,TIM2,ADAY,ARON,ARMN,ARSD,RTYP,RFRQ,RPOS,RDYS,REND,REDT,ALSD,ALED,MDAY\n";
506 QString tPrefix = "CARDID,CATEGORY,ETDY,LTDY,FNDY,MARK,PRTY,TITL,MEM1\n"; 507 QString tPrefix = "CARDID,CATEGORY,ETDY,LTDY,FNDY,MARK,PRTY,TITL,MEM1\n";
507 QString command; 508 QString command;
508 QPtrList<Event> er = calendar->rawEvents(); 509 QPtrList<Event> er = calendar->rawEvents();
509 Event* ev = er.first(); 510 Event* ev = er.first();
510 QString fileName = "/tmp/kopitempout"; 511 QString fileName = "/tmp/kopitempout";
511 int i = 0; 512 int i = 0;
512 QString changeString = ePrefix; 513 QString changeString = ePrefix;
513 QString deleteString = ePrefix; 514 QString deleteString = ePrefix;
514 bool deleteEnt = false; 515 bool deleteEnt = false;
515 bool changeEnt = false; 516 bool changeEnt = false;
516 QString message = i18n("Processing event # "); 517 QString message = i18n("Processing event # ");
517 int procCount = 0; 518 int procCount = 0;
518 while ( ev ) { 519 while ( ev ) {
519 //qDebug("i %d ", ++i); 520 //qDebug("i %d ", ++i);
520 if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { 521 if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) {
521 status.setText ( message + QString::number ( ++procCount ) ); 522 status.setText ( message + QString::number ( ++procCount ) );
522 qApp->processEvents(); 523 qApp->processEvents();
523 QString eString = getEventString( ev ); 524 QString eString = getEventString( ev );
524 if ( ev->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete 525 if ( ev->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete
525 // deleting empty strings does not work. 526 // deleting empty strings does not work.
526 // we write first and x and then delete the record with the x 527 // we write first and x and then delete the record with the x
527 eString = eString.replace( QRegExp(",\"\""),",\"x\"" ); 528 eString = eString.replace( QRegExp(",\"\""),",\"x\"" );
528 changeString += eString + "\n"; 529 changeString += eString + "\n";
529 deleteString += eString + "\n"; 530 deleteString += eString + "\n";
530 deleteEnt = true; 531 deleteEnt = true;
531 changeEnt = true; 532 changeEnt = true;
532 } 533 }
533 else if ( ev->getID("Sharp_DTM").isEmpty() ) { // add new 534 else if ( ev->getID("Sharp_DTM").isEmpty() ) { // add new
534 command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName; 535 command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName;
535 system ( command.utf8() ); 536 system ( command.utf8() );
536 QFile file( fileName ); 537 QFile file( fileName );
537 if (!file.open( IO_ReadOnly ) ) { 538 if (!file.open( IO_ReadOnly ) ) {
538 return false; 539 return false;
539 540
540 } 541 }
541 QTextStream ts( &file ); 542 QTextStream ts( &file );
542 ts.setCodec( QTextCodec::codecForName("utf8") ); 543 ts.setCodec( QTextCodec::codecForName("utf8") );
543 answer = ts.read(); 544 answer = ts.read();
544 file.close(); 545 file.close();
545 //qDebug("answer \n%s ", answer.latin1()); 546 //qDebug("answer \n%s ", answer.latin1());
546 getNumFromRecord( answer, ev ) ; 547 getNumFromRecord( answer, ev ) ;
547 548
548 } 549 }
549 else { // change existing 550 else { // change existing
550 //qDebug("canging %d %d",ev->zaurusStat() ,ev->zaurusId() ); 551 //qDebug("canging %d %d",ev->zaurusStat() ,ev->zaurusId() );
551 //command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName; 552 //command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName;
552 changeString += eString + "\n"; 553 changeString += eString + "\n";
553 changeEnt = true; 554 changeEnt = true;
554 555
555 } 556 }
556 } 557 }
557 ev = er.next(); 558 ev = er.next();
558 } 559 }
559 status.setText ( i18n("Changing events ...") ); 560 status.setText ( i18n("Changing events ...") );
560 qApp->processEvents(); 561 qApp->processEvents();
561 //qDebug("changing... "); 562 //qDebug("changing... ");
562 if ( changeEnt ) { 563 if ( changeEnt ) {
563 QFile file( fileName ); 564 QFile file( fileName );
564 if (!file.open( IO_WriteOnly ) ) { 565 if (!file.open( IO_WriteOnly ) ) {
565 return false; 566 return false;
566 567
567 } 568 }
568 QTextStream ts( &file ); 569 QTextStream ts( &file );
569 ts.setCodec( QTextCodec::codecForName("utf8") ); 570 ts.setCodec( QTextCodec::codecForName("utf8") );
570 ts << changeString ; 571 ts << changeString ;
571 file.close(); 572 file.close();
572 command = "db2file datebook -w -g -c " + codec+ " < "+ fileName; 573 command = "db2file datebook -w -g -c " + codec+ " < "+ fileName;
573 system ( command.latin1() ); 574 system ( command.latin1() );
574 //qDebug("command %s file :\n%s ", command.latin1(), changeString.latin1()); 575 //qDebug("command %s file :\n%s ", command.latin1(), changeString.latin1());
575 576
576 } 577 }
577 status.setText ( i18n("Deleting events ...") ); 578 status.setText ( i18n("Deleting events ...") );
578 qApp->processEvents(); 579 qApp->processEvents();
579 //qDebug("deleting... "); 580 //qDebug("deleting... ");
580 if ( deleteEnt ) { 581 if ( deleteEnt ) {
581 QFile file( fileName ); 582 QFile file( fileName );
582 if (!file.open( IO_WriteOnly ) ) { 583 if (!file.open( IO_WriteOnly ) ) {
583 return false; 584 return false;
584 585
585 } 586 }
586 QTextStream ts( &file ); 587 QTextStream ts( &file );
587 ts.setCodec( QTextCodec::codecForName("utf8") ); 588 ts.setCodec( QTextCodec::codecForName("utf8") );
588 ts << deleteString; 589 ts << deleteString;
589 file.close(); 590 file.close();
590 command = "db2file datebook -d -c " + codec+ " < "+ fileName; 591 command = "db2file datebook -d -c " + codec+ " < "+ fileName;
591 system ( command.latin1() ); 592 system ( command.latin1() );
592 // qDebug("command %s file :\n%s ", command.latin1(), deleteString.latin1()); 593 // qDebug("command %s file :\n%s ", command.latin1(), deleteString.latin1());
593 } 594 }
594 595
595 596
596 changeString = tPrefix; 597 changeString = tPrefix;
597 deleteString = tPrefix; 598 deleteString = tPrefix;
598 status.setText ( i18n("Processing todos ...") ); 599 status.setText ( i18n("Processing todos ...") );
599 qApp->processEvents(); 600 qApp->processEvents();
600 QPtrList<Todo> tl = calendar->rawTodos(); 601 QPtrList<Todo> tl = calendar->rawTodos();
601 Todo* to = tl.first(); 602 Todo* to = tl.first();
602 i = 0; 603 i = 0;
603 message = i18n("Processing todo # "); 604 message = i18n("Processing todo # ");
604 procCount = 0; 605 procCount = 0;
605 while ( to ) { 606 while ( to ) {
606 if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { 607 if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) {
607 status.setText ( message + QString::number ( ++procCount ) ); 608 status.setText ( message + QString::number ( ++procCount ) );
608 qApp->processEvents(); 609 qApp->processEvents();
609 QString eString = getTodoString( to ); 610 QString eString = getTodoString( to );
610 if ( to->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete 611 if ( to->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete
611 // deleting empty strings does not work. 612 // deleting empty strings does not work.
612 // we write first and x and then delete the record with the x 613 // we write first and x and then delete the record with the x
613 eString = eString.replace( QRegExp(",\"\""),",\"x\"" ); 614 eString = eString.replace( QRegExp(",\"\""),",\"x\"" );
614 changeString += eString + "\n"; 615 changeString += eString + "\n";
615 deleteString += eString + "\n"; 616 deleteString += eString + "\n";
616 deleteEnt = true; 617 deleteEnt = true;
617 changeEnt = true; 618 changeEnt = true;
618 } 619 }
619 else if ( to->getID("Sharp_DTM").isEmpty() ) { // add new 620 else if ( to->getID("Sharp_DTM").isEmpty() ) { // add new
620 command = "(echo \"" + tPrefix + eString + "\" ) | db2file todo -w -g -c " + codec+ " > "+ fileName; 621 command = "(echo \"" + tPrefix + eString + "\" ) | db2file todo -w -g -c " + codec+ " > "+ fileName;
621 system ( command.utf8() ); 622 system ( command.utf8() );
622 QFile file( fileName ); 623 QFile file( fileName );
623 if (!file.open( IO_ReadOnly ) ) { 624 if (!file.open( IO_ReadOnly ) ) {
624 return false; 625 return false;
625 626
626 } 627 }
627 QTextStream ts( &file ); 628 QTextStream ts( &file );
628 ts.setCodec( QTextCodec::codecForName("utf8") ); 629 ts.setCodec( QTextCodec::codecForName("utf8") );
629 answer = ts.read(); 630 answer = ts.read();
630 file.close(); 631 file.close();
631 //qDebug("answer \n%s ", answer.latin1()); 632 //qDebug("answer \n%s ", answer.latin1());
632 getNumFromRecord( answer, to ) ; 633 getNumFromRecord( answer, to ) ;
633 634
634 } 635 }
635 else { // change existing 636 else { // change existing
636 //qDebug("canging %d %d",to->zaurusStat() ,to->zaurusId() ); 637 //qDebug("canging %d %d",to->zaurusStat() ,to->zaurusId() );
637 //command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName; 638 //command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName;
638 changeString += eString + "\n"; 639 changeString += eString + "\n";
639 changeEnt = true; 640 changeEnt = true;
640 641
641 } 642 }
642 } 643 }
643 644
644 to = tl.next(); 645 to = tl.next();
645 } 646 }
646 status.setText ( i18n("Changing todos ...") ); 647 status.setText ( i18n("Changing todos ...") );
647 qApp->processEvents(); 648 qApp->processEvents();
648 //qDebug("changing... "); 649 //qDebug("changing... ");
649 if ( changeEnt ) { 650 if ( changeEnt ) {
650 QFile file( fileName ); 651 QFile file( fileName );
651 if (!file.open( IO_WriteOnly ) ) { 652 if (!file.open( IO_WriteOnly ) ) {
652 return false; 653 return false;
653 654
654 } 655 }
655 QTextStream ts( &file ); 656 QTextStream ts( &file );
656 ts.setCodec( QTextCodec::codecForName("utf8") ); 657 ts.setCodec( QTextCodec::codecForName("utf8") );
657 ts << changeString ; 658 ts << changeString ;
658 file.close(); 659 file.close();
659 command = "db2file todo -w -g -c " + codec+ " < "+ fileName; 660 command = "db2file todo -w -g -c " + codec+ " < "+ fileName;
660 system ( command.latin1() ); 661 system ( command.latin1() );
661 //qDebug("command %s file :\n%s ", command.latin1(), changeString.latin1()); 662 //qDebug("command %s file :\n%s ", command.latin1(), changeString.latin1());
662 663
663 } 664 }
664 status.setText ( i18n("Deleting todos ...") ); 665 status.setText ( i18n("Deleting todos ...") );
665 qApp->processEvents(); 666 qApp->processEvents();
666 //qDebug("deleting... "); 667 //qDebug("deleting... ");
667 if ( deleteEnt ) { 668 if ( deleteEnt ) {
668 QFile file( fileName ); 669 QFile file( fileName );
669 if (!file.open( IO_WriteOnly ) ) { 670 if (!file.open( IO_WriteOnly ) ) {
670 return false; 671 return false;
671 672
672 } 673 }
673 QTextStream ts( &file ); 674 QTextStream ts( &file );
674 ts.setCodec( QTextCodec::codecForName("utf8") ); 675 ts.setCodec( QTextCodec::codecForName("utf8") );
675 ts << deleteString; 676 ts << deleteString;
676 file.close(); 677 file.close();
677 command = "db2file todo -d -c " + codec+ " < "+ fileName; 678 command = "db2file todo -d -c " + codec+ " < "+ fileName;
678 system ( command.latin1() ); 679 system ( command.latin1() );
679 // qDebug("command %s file :\n%s ", command.latin1(), deleteString.latin1()); 680 // qDebug("command %s file :\n%s ", command.latin1(), deleteString.latin1());
680 } 681 }
681 682
682 return true; 683 return true;
683} 684}
684QString SharpFormat::dtToString( const QDateTime& dti, bool useTZ ) 685QString SharpFormat::dtToString( const QDateTime& dti, bool useTZ )
685{ 686{
686 QString datestr; 687 QString datestr;
687 QString timestr; 688 QString timestr;
688 int offset = KGlobal::locale()->localTimeOffset( dti ); 689 int offset = KGlobal::locale()->localTimeOffset( dti );
689 QDateTime dt; 690 QDateTime dt;
690 if (useTZ) 691 if (useTZ)
691 dt = dti.addSecs ( -(offset*60)); 692 dt = dti.addSecs ( -(offset*60));
692 else 693 else
693 dt = dti; 694 dt = dti;
694 if(dt.date().isValid()){ 695 if(dt.date().isValid()){
695 const QDate& date = dt.date(); 696 const QDate& date = dt.date();
696 datestr.sprintf("%04d%02d%02d", 697 datestr.sprintf("%04d%02d%02d",
697 date.year(), date.month(), date.day()); 698 date.year(), date.month(), date.day());
698 } 699 }
699 if(dt.time().isValid()){ 700 if(dt.time().isValid()){
700 const QTime& time = dt.time(); 701 const QTime& time = dt.time();
701 timestr.sprintf("T%02d%02d%02d", 702 timestr.sprintf("T%02d%02d%02d",
702 time.hour(), time.minute(), time.second()); 703 time.hour(), time.minute(), time.second());
703 } 704 }
704 return datestr + timestr; 705 return datestr + timestr;
705} 706}
706QString SharpFormat::getEventString( Event* event ) 707QString SharpFormat::getEventString( Event* event )
707{ 708{
708 QStringList list; 709 QStringList list;
709 list.append( event->getID("Sharp_DTM") ); 710 list.append( event->getID("Sharp_DTM") );
710 list.append( event->categories().join(",") ); 711 list.append( event->categories().join(",") );
711 if ( !event->summary().isEmpty() ) 712 if ( !event->summary().isEmpty() )
712 list.append( event->summary() ); 713 list.append( event->summary() );
713 else 714 else
714 list.append("" ); 715 list.append("" );
715 if ( !event->location().isEmpty() ) 716 if ( !event->location().isEmpty() )
716 list.append( event->location() ); 717 list.append( event->location() );
717 else 718 else
718 list.append("" ); 719 list.append("" );
719 if ( !event->description().isEmpty() ) 720 if ( !event->description().isEmpty() )
720 list.append( event->description() ); 721 list.append( event->description() );
721 else 722 else
722 list.append( "" ); 723 list.append( "" );
723 if ( event->doesFloat () ) { 724 if ( event->doesFloat () ) {
724 list.append( dtToString( QDateTime(event->dtStart().date(), QTime(0,0,0)), false )); 725 list.append( dtToString( QDateTime(event->dtStart().date(), QTime(0,0,0)), false ));
725 list.append( dtToString( QDateTime(event->dtEnd().date(),QTime(23,59,59)), false )); //6 726 list.append( dtToString( QDateTime(event->dtEnd().date(),QTime(23,59,59)), false )); //6
726 list.append( "1" ); 727 list.append( "1" );
727 728
728 } 729 }
729 else { 730 else {
730 list.append( dtToString( event->dtStart()) ); 731 list.append( dtToString( event->dtStart()) );
731 list.append( dtToString( event->dtEnd()) ); //6 732 list.append( dtToString( event->dtEnd()) ); //6
732 list.append( "0" ); 733 list.append( "0" );
733 } 734 }
734 bool noAlarm = true; 735 bool noAlarm = true;
735 if ( event->alarms().count() > 0 ) { 736 if ( event->alarms().count() > 0 ) {
736 Alarm * al = event->alarms().first(); 737 Alarm * al = event->alarms().first();
737 if ( al->enabled() ) { 738 if ( al->enabled() ) {
738 noAlarm = false; 739 noAlarm = false;
739 list.append( "0" ); // yes, 0 == alarm 740 list.append( "0" ); // yes, 0 == alarm
740 list.append( QString::number( al->startOffset().asSeconds()/(-60) ) ); 741 list.append( QString::number( al->startOffset().asSeconds()/(-60) ) );
741 if ( al->type() == Alarm::Audio ) 742 if ( al->type() == Alarm::Audio )
742 list.append( "1" ); // type audio 743 list.append( "1" ); // type audio
743 else 744 else
744 list.append( "0" ); // type silent 745 list.append( "0" ); // type silent
745 } 746 }
746 } 747 }
747 if ( noAlarm ) { 748 if ( noAlarm ) {
748 list.append( "1" ); // yes, 1 == no alarm 749 list.append( "1" ); // yes, 1 == no alarm
749 list.append( "0" ); // no alarm offset 750 list.append( "0" ); // no alarm offset
750 list.append( "1" ); // type 751 list.append( "1" ); // type
751 } 752 }
752 // next is: 11 753 // next is: 11
753 // next is: 11-16 are recurrence 754 // next is: 11-16 are recurrence
754 Recurrence* rec = event->recurrence(); 755 Recurrence* rec = event->recurrence();
755 756
756 bool writeEndDate = false; 757 bool writeEndDate = false;
757 switch ( rec->doesRecur() ) 758 switch ( rec->doesRecur() )
758 { 759 {
759 case Recurrence::rDaily: // 0 760 case Recurrence::rDaily: // 0
760 list.append( "0" ); 761 list.append( "0" );
761 list.append( QString::number( rec->frequency() ));//12 762 list.append( QString::number( rec->frequency() ));//12
762 list.append( "0" ); 763 list.append( "0" );
763 list.append( "0" ); 764 list.append( "0" );
764 writeEndDate = true; 765 writeEndDate = true;
765 break; 766 break;
766 case Recurrence::rWeekly:// 1 767 case Recurrence::rWeekly:// 1
767 list.append( "1" ); 768 list.append( "1" );
768 list.append( QString::number( rec->frequency()) );//12 769 list.append( QString::number( rec->frequency()) );//12
769 list.append( "0" ); 770 list.append( "0" );
770 { 771 {
771 int days = 0; 772 int days = 0;
772 QBitArray weekDays = rec->days(); 773 QBitArray weekDays = rec->days();
773 int i; 774 int i;
774 for( i = 1; i <= 7; ++i ) { 775 for( i = 1; i <= 7; ++i ) {
775 if ( weekDays[i-1] ) { 776 if ( weekDays[i-1] ) {
776 days += 1 << (i-1); 777 days += 1 << (i-1);
777 } 778 }
778 } 779 }
779 list.append( QString::number( days ) ); 780 list.append( QString::number( days ) );
780 } 781 }
781 //pending weekdays 782 //pending weekdays
782 writeEndDate = true; 783 writeEndDate = true;
783 784
784 break; 785 break;
785 case Recurrence::rMonthlyPos:// 2 786 case Recurrence::rMonthlyPos:// 2
786 list.append( "2" ); 787 list.append( "2" );
787 list.append( QString::number( rec->frequency()) );//12 788 list.append( QString::number( rec->frequency()) );//12
788 789
789 writeEndDate = true; 790 writeEndDate = true;
790 { 791 {
791 int count = 1; 792 int count = 1;
792 QPtrList<Recurrence::rMonthPos> rmp; 793 QPtrList<Recurrence::rMonthPos> rmp;
793 rmp = rec->monthPositions(); 794 rmp = rec->monthPositions();
794 if ( rmp.first()->negative ) 795 if ( rmp.first()->negative )
795 count = 5 - rmp.first()->rPos - 1; 796 count = 5 - rmp.first()->rPos - 1;
796 else 797 else
797 count = rmp.first()->rPos - 1; 798 count = rmp.first()->rPos - 1;
798 list.append( QString::number( count ) ); 799 list.append( QString::number( count ) );
799 800
800 } 801 }
801 802
802 list.append( "0" ); 803 list.append( "0" );
803 break; 804 break;
804 case Recurrence::rMonthlyDay:// 3 805 case Recurrence::rMonthlyDay:// 3
805 list.append( "3" ); 806 list.append( "3" );
806 list.append( QString::number( rec->frequency()) );//12 807 list.append( QString::number( rec->frequency()) );//12
807 list.append( "0" ); 808 list.append( "0" );
808 list.append( "0" ); 809 list.append( "0" );
809 writeEndDate = true; 810 writeEndDate = true;
810 break; 811 break;
811 case Recurrence::rYearlyMonth://4 812 case Recurrence::rYearlyMonth://4
812 list.append( "4" ); 813 list.append( "4" );
813 list.append( QString::number( rec->frequency()) );//12 814 list.append( QString::number( rec->frequency()) );//12
814 list.append( "0" ); 815 list.append( "0" );
815 list.append( "0" ); 816 list.append( "0" );
816 writeEndDate = true; 817 writeEndDate = true;
817 break; 818 break;
818 819
819 default: 820 default:
820 list.append( "255" ); 821 list.append( "255" );
821 list.append( QString() ); 822 list.append( QString() );
822 list.append( "0" ); 823 list.append( "0" );
823 list.append( QString() ); 824 list.append( QString() );
824 list.append( "0" ); 825 list.append( "0" );
825 list.append( "20991231T000000" ); 826 list.append( "20991231T000000" );
826 break; 827 break;
827 } 828 }
828 if ( writeEndDate ) { 829 if ( writeEndDate ) {
829 830
830 if ( rec->endDate().isValid() ) { // 15 + 16 831 if ( rec->endDate().isValid() ) { // 15 + 16
831 list.append( "1" ); 832 list.append( "1" );
832 list.append( dtToString( rec->endDate()) ); 833 list.append( dtToString( rec->endDate()) );
833 } else { 834 } else {
834 list.append( "0" ); 835 list.append( "0" );
835 list.append( "20991231T000000" ); 836 list.append( "20991231T000000" );
836 } 837 }
837 838
838 } 839 }
839 if ( event->doesFloat () ) { 840 if ( event->doesFloat () ) {
840 list.append( dtToString( event->dtStart(), false ).left( 8 )); 841 list.append( dtToString( event->dtStart(), false ).left( 8 ));
841 list.append( dtToString( event->dtEnd(), false ).left( 8 )); //6 842 list.append( dtToString( event->dtEnd(), false ).left( 8 )); //6
842 843
843 } 844 }
844 else { 845 else {
845 list.append( QString() ); 846 list.append( QString() );
846 list.append( QString() ); 847 list.append( QString() );
847 848
848 } 849 }
849 if (event->dtStart().date() == event->dtEnd().date() ) 850 if (event->dtStart().date() == event->dtEnd().date() )
850 list.append( "0" ); 851 list.append( "0" );
851 else 852 else
852 list.append( "1" ); 853 list.append( "1" );
853 854
854 855
855 for(QStringList::Iterator it=list.begin(); 856 for(QStringList::Iterator it=list.begin();
856 it!=list.end(); ++it){ 857 it!=list.end(); ++it){
857 QString& s = (*it); 858 QString& s = (*it);
858 s.replace(QRegExp("\""), "\"\""); 859 s.replace(QRegExp("\""), "\"\"");
859 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){ 860 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){
860 s.prepend('\"'); 861 s.prepend('\"');
861 s.append('\"'); 862 s.append('\"');
862 } else if(s.isEmpty() && !s.isNull()){ 863 } else if(s.isEmpty() && !s.isNull()){
863 s = "\"\""; 864 s = "\"\"";
864 } 865 }
865 } 866 }
866 return list.join(","); 867 return list.join(",");
867 868
868 869
869} 870}
870QString SharpFormat::getTodoString( Todo* todo ) 871QString SharpFormat::getTodoString( Todo* todo )
871{ 872{
872 QStringList list; 873 QStringList list;
873 list.append( todo->getID("Sharp_DTM") ); 874 list.append( todo->getID("Sharp_DTM") );
874 list.append( todo->categories().join(",") ); 875 list.append( todo->categories().join(",") );
875 876
876 if ( todo->hasStartDate() ) { 877 if ( todo->hasStartDate() ) {
877 list.append( dtToString( todo->dtStart()) ); 878 list.append( dtToString( todo->dtStart()) );
878 } else 879 } else
879 list.append( QString() ); 880 list.append( QString() );
880 881
881 if ( todo->hasDueDate() ) { 882 if ( todo->hasDueDate() ) {
882 QTime tim; 883 QTime tim;
883 if ( todo->doesFloat()) { 884 if ( todo->doesFloat()) {
884 list.append( dtToString( QDateTime(todo->dtDue().date(),QTime( 0,0,0 )), false)) ; 885 list.append( dtToString( QDateTime(todo->dtDue().date(),QTime( 0,0,0 )), false)) ;
885 } else { 886 } else {
886 list.append( dtToString(todo->dtDue() ) ); 887 list.append( dtToString(todo->dtDue() ) );
887 } 888 }
888 } else 889 } else
889 list.append( QString() ); 890 list.append( QString() );