summaryrefslogtreecommitdiffabout
path: root/libkcal
authorzautrix <zautrix>2005-11-25 23:24:37 (UTC)
committer zautrix <zautrix>2005-11-25 23:24:37 (UTC)
commit3cd0013c04172b312ee21e80224a3b7734b4d413 (patch) (unidiff)
tree9c5557ecfe874a8a4901a674c5eddcc91f585b0c /libkcal
parent0e18027f386280bf427ef9d0ffec61a5516cebda (diff)
downloadkdepimpi-3cd0013c04172b312ee21e80224a3b7734b4d413.zip
kdepimpi-3cd0013c04172b312ee21e80224a3b7734b4d413.tar.gz
kdepimpi-3cd0013c04172b312ee21e80224a3b7734b4d413.tar.bz2
sync
Diffstat (limited to 'libkcal') (more/less context) (ignore whitespace changes)
-rw-r--r--libkcal/calendar.cpp2
-rw-r--r--libkcal/calendarlocal.cpp12
-rw-r--r--libkcal/incidencebase.cpp7
-rw-r--r--libkcal/incidencebase.h1
4 files changed, 15 insertions, 7 deletions
diff --git a/libkcal/calendar.cpp b/libkcal/calendar.cpp
index b1806ee..8535191 100644
--- a/libkcal/calendar.cpp
+++ b/libkcal/calendar.cpp
@@ -1,523 +1,523 @@
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) 2000,2001 Cornelius Schumacher <schumacher@kde.org> 4 Copyright (c) 2000,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 <stdlib.h> 22#include <stdlib.h>
23#include <time.h> 23#include <time.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 "exceptions.h" 29#include "exceptions.h"
30#include "calfilter.h" 30#include "calfilter.h"
31 31
32#include "calendar.h" 32#include "calendar.h"
33#include "syncdefines.h" 33#include "syncdefines.h"
34 34
35using namespace KCal; 35using namespace KCal;
36 36
37Calendar::Calendar() 37Calendar::Calendar()
38{ 38{
39 39
40 init(); 40 init();
41 setTimeZoneId( " 00:00 Europe/London(UTC)" ); 41 setTimeZoneId( " 00:00 Europe/London(UTC)" );
42} 42}
43 43
44Calendar::Calendar( const QString &timeZoneId ) 44Calendar::Calendar( const QString &timeZoneId )
45{ 45{
46 46
47 init(); 47 init();
48 setTimeZoneId(timeZoneId); 48 setTimeZoneId(timeZoneId);
49} 49}
50 50
51void Calendar::init() 51void Calendar::init()
52{ 52{
53 mObserver = 0; 53 mObserver = 0;
54 mNewObserver = false; 54 mNewObserver = false;
55 mUndoIncidence = 0; 55 mUndoIncidence = 0;
56 mDeleteIncidencesOnClose = true; 56 mDeleteIncidencesOnClose = true;
57 mModified = false; 57 mModified = false;
58 mDefaultCalendar = 1; 58 mDefaultCalendar = 1;
59 // Setup default filter, which does nothing 59 // Setup default filter, which does nothing
60 mDefaultFilter = new CalFilter; 60 mDefaultFilter = new CalFilter;
61 mFilter = mDefaultFilter; 61 mFilter = mDefaultFilter;
62 mFilter->setEnabled(false); 62 mFilter->setEnabled(false);
63 63
64 // initialize random numbers. This is a hack, and not 64 // initialize random numbers. This is a hack, and not
65 // even that good of one at that. 65 // even that good of one at that.
66// srandom(time(0)); 66// srandom(time(0));
67 67
68 // user information... 68 // user information...
69 setOwner(i18n("Unknown Name")); 69 setOwner(i18n("Unknown Name"));
70 setEmail(i18n("unknown@nowhere")); 70 setEmail(i18n("unknown@nowhere"));
71 71
72#if 0 72#if 0
73 tmpStr = KOPrefs::instance()->mTimeZone; 73 tmpStr = KOPrefs::instance()->mTimeZone;
74// kdDebug(5800) << "Calendar::Calendar(): TimeZone: " << tmpStr << endl; 74// kdDebug(5800) << "Calendar::Calendar(): TimeZone: " << tmpStr << endl;
75 int dstSetting = KOPrefs::instance()->mDaylightSavings; 75 int dstSetting = KOPrefs::instance()->mDaylightSavings;
76 extern long int timezone; 76 extern long int timezone;
77 struct tm *now; 77 struct tm *now;
78 time_t curtime; 78 time_t curtime;
79 curtime = time(0); 79 curtime = time(0);
80 now = localtime(&curtime); 80 now = localtime(&curtime);
81 int hourOff = - ((timezone / 60) / 60); 81 int hourOff = - ((timezone / 60) / 60);
82 if (now->tm_isdst) 82 if (now->tm_isdst)
83 hourOff += 1; 83 hourOff += 1;
84 QString tzStr; 84 QString tzStr;
85 tzStr.sprintf("%.2d%.2d", 85 tzStr.sprintf("%.2d%.2d",
86 hourOff, 86 hourOff,
87 abs((timezone / 60) % 60)); 87 abs((timezone / 60) % 60));
88 88
89 // if no time zone was in the config file, write what we just discovered. 89 // if no time zone was in the config file, write what we just discovered.
90 if (tmpStr.isEmpty()) { 90 if (tmpStr.isEmpty()) {
91// KOPrefs::instance()->mTimeZone = tzStr; 91// KOPrefs::instance()->mTimeZone = tzStr;
92 } else { 92 } else {
93 tzStr = tmpStr; 93 tzStr = tmpStr;
94 } 94 }
95 95
96 // if daylight savings has changed since last load time, we need 96 // if daylight savings has changed since last load time, we need
97 // to rewrite these settings to the config file. 97 // to rewrite these settings to the config file.
98 if ((now->tm_isdst && !dstSetting) || 98 if ((now->tm_isdst && !dstSetting) ||
99 (!now->tm_isdst && dstSetting)) { 99 (!now->tm_isdst && dstSetting)) {
100 KOPrefs::instance()->mTimeZone = tzStr; 100 KOPrefs::instance()->mTimeZone = tzStr;
101 KOPrefs::instance()->mDaylightSavings = now->tm_isdst; 101 KOPrefs::instance()->mDaylightSavings = now->tm_isdst;
102 } 102 }
103 103
104 setTimeZone(tzStr); 104 setTimeZone(tzStr);
105#endif 105#endif
106 106
107// KOPrefs::instance()->writeConfig(); 107// KOPrefs::instance()->writeConfig();
108} 108}
109 109
110Calendar::~Calendar() 110Calendar::~Calendar()
111{ 111{
112 delete mDefaultFilter; 112 delete mDefaultFilter;
113 clearUndo( 0 ); 113 clearUndo( 0 );
114} 114}
115void Calendar::clearUndo( Incidence * newUndo ) 115void Calendar::clearUndo( Incidence * newUndo )
116{ 116{
117 117
118 if ( mUndoIncidence ) { 118 if ( mUndoIncidence ) {
119 if ( mUndoIncidence->typeID() == eventID ) 119 if ( mUndoIncidence->typeID() == eventID )
120 delete ((Event*) mUndoIncidence) ; 120 delete ((Event*) mUndoIncidence) ;
121 else if ( mUndoIncidence->typeID() == todoID ) 121 else if ( mUndoIncidence->typeID() == todoID )
122 delete ( (Todo*) mUndoIncidence ); 122 delete ( (Todo*) mUndoIncidence );
123 else if ( mUndoIncidence->typeID() == journalID ) 123 else if ( mUndoIncidence->typeID() == journalID )
124 delete ( (Journal*) mUndoIncidence ); 124 delete ( (Journal*) mUndoIncidence );
125 else 125 else
126 delete mUndoIncidence; 126 delete mUndoIncidence;
127 } 127 }
128 mUndoIncidence = newUndo; 128 mUndoIncidence = newUndo;
129 if ( mUndoIncidence ) { 129 if ( mUndoIncidence ) {
130 mUndoIncidence->clearRelations(); 130 mUndoIncidence->clearRelations();
131 } 131 }
132 132
133} 133}
134 134
135void Calendar::setDontDeleteIncidencesOnClose () 135void Calendar::setDontDeleteIncidencesOnClose ()
136{ 136{
137 mDeleteIncidencesOnClose = false; 137 mDeleteIncidencesOnClose = false;
138} 138}
139void Calendar::setDefaultCalendar( int d ) 139void Calendar::setDefaultCalendar( int d )
140{ 140{
141 mDefaultCalendar = d; 141 mDefaultCalendar = d;
142} 142}
143int Calendar::defaultCalendar() 143int Calendar::defaultCalendar()
144{ 144{
145 return mDefaultCalendar; 145 return mDefaultCalendar;
146} 146}
147const QString &Calendar::getOwner() const 147const QString &Calendar::getOwner() const
148{ 148{
149 return mOwner; 149 return mOwner;
150} 150}
151 151
152bool Calendar::undoDeleteIncidence() 152bool Calendar::undoDeleteIncidence()
153{ 153{
154 if (!mUndoIncidence) 154 if (!mUndoIncidence)
155 return false; 155 return false;
156 addIncidence(mUndoIncidence); 156 addIncidence(mUndoIncidence);
157 mUndoIncidence = 0; 157 mUndoIncidence = 0;
158 return true; 158 return true;
159} 159}
160void Calendar::setOwner(const QString &os) 160void Calendar::setOwner(const QString &os)
161{ 161{
162 int i; 162 int i;
163 mOwner = os; 163 mOwner = os;
164 i = mOwner.find(','); 164 i = mOwner.find(',');
165 if (i != -1) 165 if (i != -1)
166 mOwner = mOwner.left(i); 166 mOwner = mOwner.left(i);
167 167
168 setModified( true ); 168 setModified( true );
169} 169}
170 170
171void Calendar::setTimeZone(const QString & tz) 171void Calendar::setTimeZone(const QString & tz)
172{ 172{
173 bool neg = FALSE; 173 bool neg = FALSE;
174 int hours, minutes; 174 int hours, minutes;
175 QString tmpStr(tz); 175 QString tmpStr(tz);
176 176
177 if (tmpStr.left(1) == "-") 177 if (tmpStr.left(1) == "-")
178 neg = TRUE; 178 neg = TRUE;
179 if (tmpStr.left(1) == "-" || tmpStr.left(1) == "+") 179 if (tmpStr.left(1) == "-" || tmpStr.left(1) == "+")
180 tmpStr.remove(0, 1); 180 tmpStr.remove(0, 1);
181 hours = tmpStr.left(2).toInt(); 181 hours = tmpStr.left(2).toInt();
182 if (tmpStr.length() > 2) 182 if (tmpStr.length() > 2)
183 minutes = tmpStr.right(2).toInt(); 183 minutes = tmpStr.right(2).toInt();
184 else 184 else
185 minutes = 0; 185 minutes = 0;
186 mTimeZone = (60*hours+minutes); 186 mTimeZone = (60*hours+minutes);
187 if (neg) 187 if (neg)
188 mTimeZone = -mTimeZone; 188 mTimeZone = -mTimeZone;
189 mLocalTime = false; 189 mLocalTime = false;
190 190
191 setModified( true ); 191 setModified( true );
192} 192}
193 193
194QString Calendar::getTimeZoneStr() const 194QString Calendar::getTimeZoneStr() const
195{ 195{
196 if (mLocalTime) 196 if (mLocalTime)
197 return ""; 197 return "";
198 QString tmpStr; 198 QString tmpStr;
199 int hours = abs(mTimeZone / 60); 199 int hours = abs(mTimeZone / 60);
200 int minutes = abs(mTimeZone % 60); 200 int minutes = abs(mTimeZone % 60);
201 bool neg = mTimeZone < 0; 201 bool neg = mTimeZone < 0;
202 202
203 tmpStr.sprintf("%c%.2d%.2d", 203 tmpStr.sprintf("%c%.2d%.2d",
204 (neg ? '-' : '+'), 204 (neg ? '-' : '+'),
205 hours, minutes); 205 hours, minutes);
206 return tmpStr; 206 return tmpStr;
207} 207}
208 208
209void Calendar::setTimeZone(int tz) 209void Calendar::setTimeZone(int tz)
210{ 210{
211 mTimeZone = tz; 211 mTimeZone = tz;
212 mLocalTime = false; 212 mLocalTime = false;
213 213
214 setModified( true ); 214 setModified( true );
215} 215}
216 216
217int Calendar::getTimeZone() const 217int Calendar::getTimeZone() const
218{ 218{
219 return mTimeZone; 219 return mTimeZone;
220} 220}
221 221
222void Calendar::setTimeZoneId(const QString &id) 222void Calendar::setTimeZoneId(const QString &id)
223{ 223{
224 mTimeZoneId = id; 224 mTimeZoneId = id;
225 mLocalTime = false; 225 mLocalTime = false;
226 mTimeZone = KGlobal::locale()->timezoneOffset(mTimeZoneId); 226 mTimeZone = KGlobal::locale()->timezoneOffset(mTimeZoneId);
227 if ( mTimeZone > 1000) 227 if ( mTimeZone > 1000)
228 setLocalTime(); 228 setLocalTime();
229 //qDebug("Calendar::setTimeZoneOffset %s %d ",mTimeZoneId.latin1(), mTimeZone); 229 //qDebug("Calendar::setTimeZoneOffset %s %d ",mTimeZoneId.latin1(), mTimeZone);
230 setModified( true ); 230 setModified( true );
231} 231}
232 232
233QString Calendar::timeZoneId() const 233QString Calendar::timeZoneId() const
234{ 234{
235 return mTimeZoneId; 235 return mTimeZoneId;
236} 236}
237 237
238void Calendar::setLocalTime() 238void Calendar::setLocalTime()
239{ 239{
240 //qDebug("Calendar::setLocalTime() "); 240 //qDebug("Calendar::setLocalTime() ");
241 mLocalTime = true; 241 mLocalTime = true;
242 mTimeZone = 0; 242 mTimeZone = 0;
243 mTimeZoneId = ""; 243 mTimeZoneId = "";
244 244
245 setModified( true ); 245 setModified( true );
246} 246}
247 247
248bool Calendar::isLocalTime() const 248bool Calendar::isLocalTime() const
249{ 249{
250 return mLocalTime; 250 return mLocalTime;
251} 251}
252 252
253const QString &Calendar::getEmail() 253const QString &Calendar::getEmail()
254{ 254{
255 return mOwnerEmail; 255 return mOwnerEmail;
256} 256}
257 257
258void Calendar::setEmail(const QString &e) 258void Calendar::setEmail(const QString &e)
259{ 259{
260 mOwnerEmail = e; 260 mOwnerEmail = e;
261 261
262 setModified( true ); 262 setModified( true );
263} 263}
264 264
265void Calendar::setFilter(CalFilter *filter) 265void Calendar::setFilter(CalFilter *filter)
266{ 266{
267 mFilter = filter; 267 mFilter = filter;
268} 268}
269 269
270CalFilter *Calendar::filter() 270CalFilter *Calendar::filter()
271{ 271{
272 return mFilter; 272 return mFilter;
273} 273}
274 274
275QPtrList<Incidence> Calendar::incidences() 275QPtrList<Incidence> Calendar::incidences()
276{ 276{
277 QPtrList<Incidence> incidences; 277 QPtrList<Incidence> incidences;
278 278
279 Incidence *i; 279 Incidence *i;
280 280
281 QPtrList<Event> e = events(); 281 QPtrList<Event> e = events();
282 for( i = e.first(); i; i = e.next() ) incidences.append( i ); 282 for( i = e.first(); i; i = e.next() ) incidences.append( i );
283 283
284 QPtrList<Todo> t = todos(); 284 QPtrList<Todo> t = todos();
285 for( i = t.first(); i; i = t.next() ) incidences.append( i ); 285 for( i = t.first(); i; i = t.next() ) incidences.append( i );
286 286
287 QPtrList<Journal> j = journals(); 287 QPtrList<Journal> j = journals();
288 for( i = j.first(); i; i = j.next() ) incidences.append( i ); 288 for( i = j.first(); i; i = j.next() ) incidences.append( i );
289 289
290 return incidences; 290 return incidences;
291} 291}
292 292
293void Calendar::resetPilotStat(int id ) 293void Calendar::resetPilotStat(int id )
294{ 294{
295 QPtrList<Incidence> incidences; 295 QPtrList<Incidence> incidences;
296 296
297 Incidence *i; 297 Incidence *i;
298 298
299 QPtrList<Event> e = rawEvents(); 299 QPtrList<Event> e = rawEvents();
300 for( i = e.first(); i; i = e.next() ) i->setPilotId( id ); 300 for( i = e.first(); i; i = e.next() ) i->setPilotId( id );
301 301
302 QPtrList<Todo> t = rawTodos(); 302 QPtrList<Todo> t = rawTodos();
303 for( i = t.first(); i; i = t.next() ) i->setPilotId( id ); 303 for( i = t.first(); i; i = t.next() ) i->setPilotId( id );
304 304
305 QPtrList<Journal> j = journals(); 305 QPtrList<Journal> j = journals();
306 for( i = j.first(); i; i = j.next() ) i->setPilotId( id ); 306 for( i = j.first(); i; i = j.next() ) i->setPilotId( id );
307} 307}
308void Calendar::resetTempSyncStat() 308void Calendar::resetTempSyncStat()
309{ 309{
310 QPtrList<Incidence> incidences; 310 QPtrList<Incidence> incidences;
311 311
312 Incidence *i; 312 Incidence *i;
313 313
314 QPtrList<Event> e = rawEvents(); 314 QPtrList<Event> e = rawEvents();
315 for( i = e.first(); i; i = e.next() ) i->setTempSyncStat( SYNC_TEMPSTATE_INITIAL ); 315 for( i = e.first(); i; i = e.next() ) i->setTempSyncStat( SYNC_TEMPSTATE_INITIAL );
316 316
317 QPtrList<Todo> t = rawTodos(); 317 QPtrList<Todo> t = rawTodos();
318 for( i = t.first(); i; i = t.next() ) i->setTempSyncStat( SYNC_TEMPSTATE_INITIAL ); 318 for( i = t.first(); i; i = t.next() ) i->setTempSyncStat( SYNC_TEMPSTATE_INITIAL );
319 319
320 QPtrList<Journal> j = journals(); 320 QPtrList<Journal> j = journals();
321 for( i = j.first(); i; i = j.next() ) i->setTempSyncStat( SYNC_TEMPSTATE_INITIAL ); 321 for( i = j.first(); i; i = j.next() ) i->setTempSyncStat( SYNC_TEMPSTATE_INITIAL );
322} 322}
323QPtrList<Incidence> Calendar::rawIncidences() 323QPtrList<Incidence> Calendar::rawIncidences()
324{ 324{
325 QPtrList<Incidence> incidences; 325 QPtrList<Incidence> incidences;
326 326
327 Incidence *i; 327 Incidence *i;
328 328
329 QPtrList<Event> e = rawEvents(); 329 QPtrList<Event> e = rawEvents();
330 for( i = e.first(); i; i = e.next() ) incidences.append( i ); 330 for( i = e.first(); i; i = e.next() ) incidences.append( i );
331 331
332 QPtrList<Todo> t = rawTodos(); 332 QPtrList<Todo> t = rawTodos();
333 for( i = t.first(); i; i = t.next() ) incidences.append( i ); 333 for( i = t.first(); i; i = t.next() ) incidences.append( i );
334 334
335 QPtrList<Journal> j = journals(); 335 QPtrList<Journal> j = journals();
336 for( i = j.first(); i; i = j.next() ) incidences.append( i ); 336 for( i = j.first(); i; i = j.next() ) incidences.append( i );
337 337
338 return incidences; 338 return incidences;
339} 339}
340 340
341QPtrList<Event> Calendar::events( const QDate &date, bool sorted ) 341QPtrList<Event> Calendar::events( const QDate &date, bool sorted )
342{ 342{
343 QPtrList<Event> el = rawEventsForDate(date,sorted); 343 QPtrList<Event> el = rawEventsForDate(date,sorted);
344 mFilter->apply(&el); 344 mFilter->apply(&el);
345 return el; 345 return el;
346} 346}
347 347
348QPtrList<Event> Calendar::events( const QDateTime &qdt ) 348QPtrList<Event> Calendar::events( const QDateTime &qdt )
349{ 349{
350 QPtrList<Event> el = rawEventsForDate(qdt); 350 QPtrList<Event> el = rawEventsForDate(qdt);
351 mFilter->apply(&el); 351 mFilter->apply(&el);
352 return el; 352 return el;
353} 353}
354 354
355QPtrList<Event> Calendar::events( const QDate &start, const QDate &end, 355QPtrList<Event> Calendar::events( const QDate &start, const QDate &end,
356 bool inclusive) 356 bool inclusive)
357{ 357{
358 QPtrList<Event> el = rawEvents(start,end,inclusive); 358 QPtrList<Event> el = rawEvents(start,end,inclusive);
359 mFilter->apply(&el); 359 mFilter->apply(&el);
360 return el; 360 return el;
361} 361}
362 362
363QPtrList<Event> Calendar::events() 363QPtrList<Event> Calendar::events()
364{ 364{
365 QPtrList<Event> el = rawEvents(); 365 QPtrList<Event> el = rawEvents();
366 mFilter->apply(&el); 366 mFilter->apply(&el);
367 return el; 367 return el;
368} 368}
369void Calendar::addIncidenceBranch(Incidence *i) 369void Calendar::addIncidenceBranch(Incidence *i)
370{ 370{
371 addIncidence( i ); 371 addIncidence( i );
372 Incidence * inc; 372 Incidence * inc;
373 QPtrList<Incidence> Relations = i->relations(); 373 QPtrList<Incidence> Relations = i->relations();
374 for (inc=Relations.first();inc;inc=Relations.next()) { 374 for (inc=Relations.first();inc;inc=Relations.next()) {
375 addIncidenceBranch( inc ); 375 addIncidenceBranch( inc );
376 } 376 }
377} 377}
378 378
379bool Calendar::addIncidence(Incidence *i) 379bool Calendar::addIncidence(Incidence *i)
380{ 380{
381 Incidence::AddVisitor<Calendar> v(this); 381 Incidence::AddVisitor<Calendar> v(this);
382 if ( i->calID() == 0 ) 382 if ( i->calID() == 0 )
383 i->setCalID( mDefaultCalendar ); 383 i->setCalID_block( mDefaultCalendar );
384 i->setCalEnabled( true ); 384 i->setCalEnabled( true );
385 return i->accept(v); 385 return i->accept(v);
386} 386}
387void Calendar::deleteIncidence(Incidence *in) 387void Calendar::deleteIncidence(Incidence *in)
388{ 388{
389 if ( in->typeID() == eventID ) 389 if ( in->typeID() == eventID )
390 deleteEvent( (Event*) in ); 390 deleteEvent( (Event*) in );
391 else if ( in->typeID() == todoID ) 391 else if ( in->typeID() == todoID )
392 deleteTodo( (Todo*) in); 392 deleteTodo( (Todo*) in);
393 else if ( in->typeID() == journalID ) 393 else if ( in->typeID() == journalID )
394 deleteJournal( (Journal*) in ); 394 deleteJournal( (Journal*) in );
395} 395}
396 396
397Incidence* Calendar::incidence( const QString& uid ) 397Incidence* Calendar::incidence( const QString& uid )
398{ 398{
399 Incidence* i; 399 Incidence* i;
400 400
401 if( (i = todo( uid )) != 0 ) 401 if( (i = todo( uid )) != 0 )
402 return i; 402 return i;
403 if( (i = event( uid )) != 0 ) 403 if( (i = event( uid )) != 0 )
404 return i; 404 return i;
405 if( (i = journal( uid )) != 0 ) 405 if( (i = journal( uid )) != 0 )
406 return i; 406 return i;
407 407
408 return 0; 408 return 0;
409} 409}
410 410
411QPtrList<Todo> Calendar::todos() 411QPtrList<Todo> Calendar::todos()
412{ 412{
413 QPtrList<Todo> tl = rawTodos(); 413 QPtrList<Todo> tl = rawTodos();
414 mFilter->apply( &tl ); 414 mFilter->apply( &tl );
415 return tl; 415 return tl;
416} 416}
417 417
418// When this is called, the todo have already been added to the calendar. 418// When this is called, the todo have already been added to the calendar.
419// This method is only about linking related todos 419// This method is only about linking related todos
420void Calendar::setupRelations( Incidence *incidence ) 420void Calendar::setupRelations( Incidence *incidence )
421{ 421{
422 QString uid = incidence->uid(); 422 QString uid = incidence->uid();
423 //qDebug("Calendar::setupRelations "); 423 //qDebug("Calendar::setupRelations ");
424 // First, go over the list of orphans and see if this is their parent 424 // First, go over the list of orphans and see if this is their parent
425 while( Incidence* i = mOrphans[ uid ] ) { 425 while( Incidence* i = mOrphans[ uid ] ) {
426 mOrphans.remove( uid ); 426 mOrphans.remove( uid );
427 i->setRelatedTo( incidence ); 427 i->setRelatedTo( incidence );
428 incidence->addRelation( i ); 428 incidence->addRelation( i );
429 mOrphanUids.remove( i->uid() ); 429 mOrphanUids.remove( i->uid() );
430 } 430 }
431 431
432 // Now see about this incidences parent 432 // Now see about this incidences parent
433 if( !incidence->relatedTo() && !incidence->relatedToUid().isEmpty() ) { 433 if( !incidence->relatedTo() && !incidence->relatedToUid().isEmpty() ) {
434 // This incidence has a uid it is related to, but is not registered to it yet 434 // This incidence has a uid it is related to, but is not registered to it yet
435 // Try to find it 435 // Try to find it
436 Incidence* parent = this->incidence( incidence->relatedToUid() ); 436 Incidence* parent = this->incidence( incidence->relatedToUid() );
437 if( parent ) { 437 if( parent ) {
438 // Found it 438 // Found it
439 incidence->setRelatedTo( parent ); 439 incidence->setRelatedTo( parent );
440 parent->addRelation( incidence ); 440 parent->addRelation( incidence );
441 } else { 441 } else {
442 // Not found, put this in the mOrphans list 442 // Not found, put this in the mOrphans list
443 mOrphans.insert( incidence->relatedToUid(), incidence ); 443 mOrphans.insert( incidence->relatedToUid(), incidence );
444 mOrphanUids.insert( incidence->uid(), incidence ); 444 mOrphanUids.insert( incidence->uid(), incidence );
445 } 445 }
446 } 446 }
447} 447}
448 448
449// If a task with subtasks is deleted, move it's subtasks to the orphans list 449// If a task with subtasks is deleted, move it's subtasks to the orphans list
450void Calendar::removeRelations( Incidence *incidence ) 450void Calendar::removeRelations( Incidence *incidence )
451{ 451{
452 // qDebug("Calendar::removeRelations "); 452 // qDebug("Calendar::removeRelations ");
453 QString uid = incidence->uid(); 453 QString uid = incidence->uid();
454 454
455 QPtrList<Incidence> relations = incidence->relations(); 455 QPtrList<Incidence> relations = incidence->relations();
456 for( Incidence* i = relations.first(); i; i = relations.next() ) 456 for( Incidence* i = relations.first(); i; i = relations.next() )
457 if( !mOrphanUids.find( i->uid() ) ) { 457 if( !mOrphanUids.find( i->uid() ) ) {
458 mOrphans.insert( uid, i ); 458 mOrphans.insert( uid, i );
459 mOrphanUids.insert( i->uid(), i ); 459 mOrphanUids.insert( i->uid(), i );
460 i->setRelatedTo( 0 ); 460 i->setRelatedTo( 0 );
461 i->setRelatedToUid( uid ); 461 i->setRelatedToUid( uid );
462 } 462 }
463 463
464 // If this incidence is related to something else, tell that about it 464 // If this incidence is related to something else, tell that about it
465 if( incidence->relatedTo() ) 465 if( incidence->relatedTo() )
466 incidence->relatedTo()->removeRelation( incidence ); 466 incidence->relatedTo()->removeRelation( incidence );
467 467
468 // Remove this one from the orphans list 468 // Remove this one from the orphans list
469 if( mOrphanUids.remove( uid ) ) { 469 if( mOrphanUids.remove( uid ) ) {
470 QString r2uid = incidence->relatedToUid(); 470 QString r2uid = incidence->relatedToUid();
471 QPtrList<Incidence> tempList; 471 QPtrList<Incidence> tempList;
472 while( Incidence* i = mOrphans[ r2uid ] ) { 472 while( Incidence* i = mOrphans[ r2uid ] ) {
473 mOrphans.remove( r2uid ); 473 mOrphans.remove( r2uid );
474 if ( i != incidence ) tempList.append( i ); 474 if ( i != incidence ) tempList.append( i );
475 } 475 }
476 Incidence* inc = tempList.first(); 476 Incidence* inc = tempList.first();
477 while ( inc ) { 477 while ( inc ) {
478 mOrphans.insert( r2uid, inc ); 478 mOrphans.insert( r2uid, inc );
479 inc = tempList.next(); 479 inc = tempList.next();
480 } 480 }
481 } 481 }
482 // LR: and another big bad bug found 482 // LR: and another big bad bug found
483#if 0 483#if 0
484 // This incidence is located in the orphans list - it should be removed 484 // This incidence is located in the orphans list - it should be removed
485 if( !( incidence->relatedTo() != 0 && mOrphans.remove( incidence->relatedTo()->uid() ) ) ) { 485 if( !( incidence->relatedTo() != 0 && mOrphans.remove( incidence->relatedTo()->uid() ) ) ) {
486 // Removing wasn't that easy 486 // Removing wasn't that easy
487 for( QDictIterator<Incidence> it( mOrphans ); it.current(); ++it ) { 487 for( QDictIterator<Incidence> it( mOrphans ); it.current(); ++it ) {
488 if( it.current()->uid() == uid ) { 488 if( it.current()->uid() == uid ) {
489 mOrphans.remove( it.currentKey() ); 489 mOrphans.remove( it.currentKey() );
490 break; 490 break;
491 } 491 }
492 } 492 }
493 } 493 }
494#endif 494#endif
495} 495}
496 496
497void Calendar::registerObserver( Observer *observer ) 497void Calendar::registerObserver( Observer *observer )
498{ 498{
499 mObserver = observer; 499 mObserver = observer;
500 mNewObserver = true; 500 mNewObserver = true;
501} 501}
502 502
503void Calendar::setModified( bool modified ) 503void Calendar::setModified( bool modified )
504{ 504{
505 if ( mObserver ) mObserver->calendarModified( modified, this ); 505 if ( mObserver ) mObserver->calendarModified( modified, this );
506 if ( modified != mModified || mNewObserver ) { 506 if ( modified != mModified || mNewObserver ) {
507 mNewObserver = false; 507 mNewObserver = false;
508 // if ( mObserver ) mObserver->calendarModified( modified, this ); 508 // if ( mObserver ) mObserver->calendarModified( modified, this );
509 mModified = modified; 509 mModified = modified;
510 } 510 }
511} 511}
512 512
513void Calendar::setLoadedProductId( const QString &id ) 513void Calendar::setLoadedProductId( const QString &id )
514{ 514{
515 mLoadedProductId = id; 515 mLoadedProductId = id;
516} 516}
517 517
518QString Calendar::loadedProductId() 518QString Calendar::loadedProductId()
519{ 519{
520 return mLoadedProductId; 520 return mLoadedProductId;
521} 521}
522 522
523//#include "calendar.moc" 523//#include "calendar.moc"
diff --git a/libkcal/calendarlocal.cpp b/libkcal/calendarlocal.cpp
index c82ea92..b02f706 100644
--- a/libkcal/calendarlocal.cpp
+++ b/libkcal/calendarlocal.cpp
@@ -1,1080 +1,1080 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 3
4 Copyright (c) 1998 Preston Brown 4 Copyright (c) 1998 Preston Brown
5 Copyright (c) 2001,2003 Cornelius Schumacher <schumacher@kde.org> 5 Copyright (c) 2001,2003 Cornelius Schumacher <schumacher@kde.org>
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 <qdatetime.h> 23#include <qdatetime.h>
24#include <qstring.h> 24#include <qstring.h>
25#include <qptrlist.h> 25#include <qptrlist.h>
26 26
27#include <kdebug.h> 27#include <kdebug.h>
28#include <kconfig.h> 28#include <kconfig.h>
29#include <kglobal.h> 29#include <kglobal.h>
30#include <klocale.h> 30#include <klocale.h>
31 31
32#include "vcaldrag.h" 32#include "vcaldrag.h"
33#include "vcalformat.h" 33#include "vcalformat.h"
34#include "icalformat.h" 34#include "icalformat.h"
35#include "exceptions.h" 35#include "exceptions.h"
36#include "incidence.h" 36#include "incidence.h"
37#include "journal.h" 37#include "journal.h"
38#include "filestorage.h" 38#include "filestorage.h"
39#include "calfilter.h" 39#include "calfilter.h"
40 40
41#include "calendarlocal.h" 41#include "calendarlocal.h"
42 42
43// #ifndef DESKTOP_VERSION 43// #ifndef DESKTOP_VERSION
44// #include <qtopia/alarmserver.h> 44// #include <qtopia/alarmserver.h>
45// #endif 45// #endif
46using namespace KCal; 46using namespace KCal;
47 47
48CalendarLocal::CalendarLocal() 48CalendarLocal::CalendarLocal()
49 : Calendar() 49 : Calendar()
50{ 50{
51 init(); 51 init();
52} 52}
53 53
54CalendarLocal::CalendarLocal(const QString &timeZoneId) 54CalendarLocal::CalendarLocal(const QString &timeZoneId)
55 : Calendar(timeZoneId) 55 : Calendar(timeZoneId)
56{ 56{
57 init(); 57 init();
58} 58}
59 59
60void CalendarLocal::init() 60void CalendarLocal::init()
61{ 61{
62 mNextAlarmIncidence = 0; 62 mNextAlarmIncidence = 0;
63} 63}
64 64
65 65
66CalendarLocal::~CalendarLocal() 66CalendarLocal::~CalendarLocal()
67{ 67{
68 registerObserver( 0 ); 68 registerObserver( 0 );
69 if ( mDeleteIncidencesOnClose ) 69 if ( mDeleteIncidencesOnClose )
70 close(); 70 close();
71} 71}
72bool CalendarLocal::mergeCalendarFile( QString name ) 72bool CalendarLocal::mergeCalendarFile( QString name )
73{ 73{
74 CalendarLocal calendar( timeZoneId() ); 74 CalendarLocal calendar( timeZoneId() );
75 calendar.setDefaultCalendar( 1 ); 75 calendar.setDefaultCalendar( 1 );
76 if ( calendar.load( name ) ) { 76 if ( calendar.load( name ) ) {
77 mergeCalendar( &calendar ); 77 mergeCalendar( &calendar );
78 return true; 78 return true;
79 } 79 }
80 return false; 80 return false;
81} 81}
82 82
83Incidence* CalendarLocal::incidenceForUid( const QString& uid , bool doNotCheckDuplicates) 83Incidence* CalendarLocal::incidenceForUid( const QString& uid , bool doNotCheckDuplicates)
84{ 84{
85 Todo *todo;; 85 Todo *todo;;
86 Incidence *retVal = 0; 86 Incidence *retVal = 0;
87 for ( todo = mTodoList.first(); todo; todo = mTodoList.next() ) { 87 for ( todo = mTodoList.first(); todo; todo = mTodoList.next() ) {
88 if ( todo->uid() == uid ) { 88 if ( todo->uid() == uid ) {
89 if ( doNotCheckDuplicates ) return todo; 89 if ( doNotCheckDuplicates ) return todo;
90 if ( retVal ) { 90 if ( retVal ) {
91 if ( retVal->calID() > todo->calID() ) { 91 if ( retVal->calID() > todo->calID() ) {
92 retVal = todo; 92 retVal = todo;
93 } 93 }
94 } else { 94 } else {
95 retVal = todo; 95 retVal = todo;
96 } 96 }
97 } 97 }
98 } 98 }
99 if ( retVal ) return retVal; 99 if ( retVal ) return retVal;
100 Event *event; 100 Event *event;
101 for ( event = mEventList.first(); event; event = mEventList.next() ) { 101 for ( event = mEventList.first(); event; event = mEventList.next() ) {
102 if ( event->uid() == uid ) { 102 if ( event->uid() == uid ) {
103 if ( doNotCheckDuplicates ) return event; 103 if ( doNotCheckDuplicates ) return event;
104 if ( retVal ) { 104 if ( retVal ) {
105 if ( retVal->calID() > event->calID() ) { 105 if ( retVal->calID() > event->calID() ) {
106 retVal = event; 106 retVal = event;
107 } 107 }
108 } else { 108 } else {
109 retVal = event; 109 retVal = event;
110 } 110 }
111 } 111 }
112 } 112 }
113 if ( retVal ) return retVal; 113 if ( retVal ) return retVal;
114 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() ) 114 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() )
115 if ( it->uid() == uid ) { 115 if ( it->uid() == uid ) {
116 if ( doNotCheckDuplicates ) return it; 116 if ( doNotCheckDuplicates ) return it;
117 if ( retVal ) { 117 if ( retVal ) {
118 if ( retVal->calID() > it->calID() ) { 118 if ( retVal->calID() > it->calID() ) {
119 retVal = it; 119 retVal = it;
120 } 120 }
121 } else { 121 } else {
122 retVal = it; 122 retVal = it;
123 } 123 }
124 } 124 }
125 return retVal; 125 return retVal;
126} 126}
127 127
128bool CalendarLocal::mergeCalendar( Calendar* remote ) 128bool CalendarLocal::mergeCalendar( Calendar* remote )
129{ 129{
130 // 1 look for raw inc in local 130 // 1 look for raw inc in local
131 // if inc not in remote, delete in local 131 // if inc not in remote, delete in local
132 // 2 look for raw inc in remote 132 // 2 look for raw inc in remote
133 // if inc in local, replace it 133 // if inc in local, replace it
134 // if not in local, add it to default calendar 134 // if not in local, add it to default calendar
135 QPtrList<Incidence> localInc = rawIncidences(); 135 QPtrList<Incidence> localInc = rawIncidences();
136 Incidence* inL = localInc.first(); 136 Incidence* inL = localInc.first();
137 while ( inL ) { 137 while ( inL ) {
138 if ( ! inL->isReadOnly () ) 138 if ( ! inL->isReadOnly () )
139 if ( !remote->incidenceForUid( inL->uid(), true )) 139 if ( !remote->incidenceForUid( inL->uid(), true ))
140 deleteIncidence( inL ); 140 deleteIncidence( inL );
141 inL = localInc.next(); 141 inL = localInc.next();
142 } 142 }
143 QPtrList<Incidence> er = remote->rawIncidences(); 143 QPtrList<Incidence> er = remote->rawIncidences();
144 Incidence* inR = er.first(); 144 Incidence* inR = er.first();
145 while ( inR ) { 145 while ( inR ) {
146 inL = incidenceForUid( inR->uid(),false ); 146 inL = incidenceForUid( inR->uid(),false );
147 if ( inL ) { 147 if ( inL ) {
148 if ( ! inL->isReadOnly () || inL->uid().left(15) == QString("last-syncEvent-") ) { 148 if ( ! inL->isReadOnly () || inL->uid().left(15) == QString("last-syncEvent-") ) {
149 int calID = inL->calID(); 149 int calID = inL->calID();
150 deleteIncidence( inL ); 150 deleteIncidence( inL );
151 inL = inR->clone(); 151 inL = inR->clone();
152 inL->setCalID( calID ); 152 inL->setCalID_block( calID );
153 addIncidence( inL ); 153 addIncidence( inL );
154 } 154 }
155 } else { 155 } else {
156 inL = inR->clone(); 156 inL = inR->clone();
157 inL->setCalID( 0 );// add to default cal 157 inL->setCalID_block( 0 );// add to default cal
158 addIncidence( inL ); 158 addIncidence( inL );
159 } 159 }
160 inR = er.next(); 160 inR = er.next();
161 } 161 }
162 return true; 162 return true;
163} 163}
164 164
165 165
166bool CalendarLocal::addCalendarFile( QString name, int id ) 166bool CalendarLocal::addCalendarFile( QString name, int id )
167{ 167{
168 CalendarLocal calendar( timeZoneId() ); 168 CalendarLocal calendar( timeZoneId() );
169 calendar.setDefaultCalendar( id ); 169 calendar.setDefaultCalendar( id );
170 if ( calendar.load( name ) ) { 170 if ( calendar.load( name ) ) {
171 addCalendar( &calendar ); 171 addCalendar( &calendar );
172 return true; 172 return true;
173 } 173 }
174 return false; 174 return false;
175} 175}
176void CalendarLocal::setSyncEventsEnabled() 176void CalendarLocal::setSyncEventsEnabled()
177{ 177{
178 Event * ev; 178 Event * ev;
179 ev = mEventList.first(); 179 ev = mEventList.first();
180 while ( ev ) { 180 while ( ev ) {
181 if ( ev->uid().left(15) == QString("last-syncEvent-") ) 181 if ( ev->uid().left(15) == QString("last-syncEvent-") )
182 ev->setCalEnabled( true ); 182 ev->setCalEnabled( true );
183 ev = mEventList.next(); 183 ev = mEventList.next();
184 } 184 }
185} 185}
186void CalendarLocal::setSyncEventsReadOnly() 186void CalendarLocal::setSyncEventsReadOnly()
187{ 187{
188 Event * ev; 188 Event * ev;
189 ev = mEventList.first(); 189 ev = mEventList.first();
190 while ( ev ) { 190 while ( ev ) {
191 if ( ev->uid().left(15) == QString("last-syncEvent-") ) { 191 if ( ev->uid().left(15) == QString("last-syncEvent-") ) {
192 ev->setReadOnly( true ); 192 ev->setReadOnly( true );
193 } 193 }
194 ev = mEventList.next(); 194 ev = mEventList.next();
195 } 195 }
196} 196}
197 197
198void CalendarLocal::addCalendar( Calendar* cal ) 198void CalendarLocal::addCalendar( Calendar* cal )
199{ 199{
200 cal->setDontDeleteIncidencesOnClose(); 200 cal->setDontDeleteIncidencesOnClose();
201 setSyncEventsEnabled(); 201 setSyncEventsEnabled();
202 { 202 {
203 QPtrList<Event> EventList = cal->rawEvents(); 203 QPtrList<Event> EventList = cal->rawEvents();
204 QPtrList<Event> el; 204 QPtrList<Event> el;
205 Event * ev = EventList.first(); 205 Event * ev = EventList.first();
206 while ( ev ) { 206 while ( ev ) {
207 if ( ev->uid().left( 15 ) == QString("last-syncEvent-") ) { 207 if ( ev->uid().left( 15 ) == QString("last-syncEvent-") ) {
208 Event * se = event( ev->uid() ); 208 Event * se = event( ev->uid() );
209 if ( se ) 209 if ( se )
210 el.append( se ); 210 el.append( se );
211 ev->setCalID( 1 ); 211 ev->setCalID_block( 1 );
212 } 212 }
213 ev->unRegisterObserver( cal ); 213 ev->unRegisterObserver( cal );
214 ev->registerObserver( this ); 214 ev->registerObserver( this );
215 mEventList.append( ev ); 215 mEventList.append( ev );
216 ev = EventList.next(); 216 ev = EventList.next();
217 } 217 }
218 for ( ev = el.first(); ev; ev = el.next() ) { 218 for ( ev = el.first(); ev; ev = el.next() ) {
219 deleteIncidence ( ev ); 219 deleteIncidence ( ev );
220 } 220 }
221 } 221 }
222 { 222 {
223 223
224 QPtrList<Todo> TodoList = cal->rawTodos(); 224 QPtrList<Todo> TodoList = cal->rawTodos();
225 Todo * ev = TodoList.first(); 225 Todo * ev = TodoList.first();
226 while ( ev ) { 226 while ( ev ) {
227 QString rel = ev->relatedToUid(); 227 QString rel = ev->relatedToUid();
228 if ( !rel.isEmpty() ){ 228 if ( !rel.isEmpty() ){
229 ev->setRelatedTo ( 0 ); 229 ev->setRelatedTo ( 0 );
230 ev->setRelatedToUid( rel ); 230 ev->setRelatedToUid( rel );
231 } 231 }
232 ev = TodoList.next(); 232 ev = TodoList.next();
233 } 233 }
234 //TodoList = cal->rawTodos(); 234 //TodoList = cal->rawTodos();
235 ev = TodoList.first(); 235 ev = TodoList.first();
236 while ( ev ) { 236 while ( ev ) {
237 ev->unRegisterObserver( cal ); 237 ev->unRegisterObserver( cal );
238 ev->registerObserver( this ); 238 ev->registerObserver( this );
239 mTodoList.append( ev ); 239 mTodoList.append( ev );
240 setupRelations( ev ); 240 setupRelations( ev );
241 ev = TodoList.next(); 241 ev = TodoList.next();
242 } 242 }
243 } 243 }
244 { 244 {
245 QPtrList<Journal> JournalList = cal->journals(); 245 QPtrList<Journal> JournalList = cal->journals();
246 Journal * ev = JournalList.first(); 246 Journal * ev = JournalList.first();
247 while ( ev ) { 247 while ( ev ) {
248 ev->unRegisterObserver( cal ); 248 ev->unRegisterObserver( cal );
249 ev->registerObserver( this ); 249 ev->registerObserver( this );
250 mJournalList.append( ev ); 250 mJournalList.append( ev );
251 ev = JournalList.next(); 251 ev = JournalList.next();
252 } 252 }
253 } 253 }
254 setModified( true ); 254 setModified( true );
255} 255}
256bool CalendarLocal::load( const QString &fileName ) 256bool CalendarLocal::load( const QString &fileName )
257{ 257{
258 FileStorage storage( this, fileName ); 258 FileStorage storage( this, fileName );
259 return storage.load(); 259 return storage.load();
260} 260}
261 261
262bool CalendarLocal::save( const QString &fileName, CalFormat *format ) 262bool CalendarLocal::save( const QString &fileName, CalFormat *format )
263{ 263{
264 FileStorage storage( this, fileName, format ); 264 FileStorage storage( this, fileName, format );
265 return storage.save(); 265 return storage.save();
266} 266}
267 267
268void CalendarLocal::stopAllTodos() 268void CalendarLocal::stopAllTodos()
269{ 269{
270 for ( Todo *it = mTodoList.first(); it; it = mTodoList.next() ) 270 for ( Todo *it = mTodoList.first(); it; it = mTodoList.next() )
271 it->setRunning( false ); 271 it->setRunning( false );
272 272
273} 273}
274void CalendarLocal::close() 274void CalendarLocal::close()
275{ 275{
276 276
277 Todo * i; 277 Todo * i;
278 for( i = mTodoList.first(); i; i = mTodoList.next() ) i->setRunning(false); 278 for( i = mTodoList.first(); i; i = mTodoList.next() ) i->setRunning(false);
279 279
280 mEventList.setAutoDelete( true ); 280 mEventList.setAutoDelete( true );
281 mTodoList.setAutoDelete( true ); 281 mTodoList.setAutoDelete( true );
282 mJournalList.setAutoDelete( true ); 282 mJournalList.setAutoDelete( true );
283 283
284 mEventList.clear(); 284 mEventList.clear();
285 mTodoList.clear(); 285 mTodoList.clear();
286 mJournalList.clear(); 286 mJournalList.clear();
287 287
288 mEventList.setAutoDelete( false ); 288 mEventList.setAutoDelete( false );
289 mTodoList.setAutoDelete( false ); 289 mTodoList.setAutoDelete( false );
290 mJournalList.setAutoDelete( false ); 290 mJournalList.setAutoDelete( false );
291 291
292 setModified( false ); 292 setModified( false );
293} 293}
294 294
295bool CalendarLocal::addAnniversaryNoDup( Event *event ) 295bool CalendarLocal::addAnniversaryNoDup( Event *event )
296{ 296{
297 QString cat; 297 QString cat;
298 bool isBirthday = true; 298 bool isBirthday = true;
299 if( event->categoriesStr() == i18n( "Anniversary" ) ) { 299 if( event->categoriesStr() == i18n( "Anniversary" ) ) {
300 isBirthday = false; 300 isBirthday = false;
301 cat = i18n( "Anniversary" ); 301 cat = i18n( "Anniversary" );
302 } else if( event->categoriesStr() == i18n( "Birthday" ) ) { 302 } else if( event->categoriesStr() == i18n( "Birthday" ) ) {
303 isBirthday = true; 303 isBirthday = true;
304 cat = i18n( "Birthday" ); 304 cat = i18n( "Birthday" );
305 } else { 305 } else {
306 qDebug("addAnniversaryNoDup called without fitting category! "); 306 qDebug("addAnniversaryNoDup called without fitting category! ");
307 return false; 307 return false;
308 } 308 }
309 Event * eve; 309 Event * eve;
310 for ( eve = mEventList.first(); eve ; eve = mEventList.next() ) { 310 for ( eve = mEventList.first(); eve ; eve = mEventList.next() ) {
311 if ( !(eve->categories().contains( cat ) )) 311 if ( !(eve->categories().contains( cat ) ))
312 continue; 312 continue;
313 // now we have an event with fitting category 313 // now we have an event with fitting category
314 if ( eve->dtStart().date() != event->dtStart().date() ) 314 if ( eve->dtStart().date() != event->dtStart().date() )
315 continue; 315 continue;
316 // now we have an event with fitting category+date 316 // now we have an event with fitting category+date
317 if ( eve->summary() != event->summary() ) 317 if ( eve->summary() != event->summary() )
318 continue; 318 continue;
319 // now we have an event with fitting category+date+summary 319 // now we have an event with fitting category+date+summary
320 return false; 320 return false;
321 } 321 }
322 return addEvent( event ); 322 return addEvent( event );
323 323
324} 324}
325bool CalendarLocal::addEventNoDup( Event *event ) 325bool CalendarLocal::addEventNoDup( Event *event )
326{ 326{
327 Event * eve; 327 Event * eve;
328 for ( eve = mEventList.first(); eve ; eve = mEventList.next() ) { 328 for ( eve = mEventList.first(); eve ; eve = mEventList.next() ) {
329 if ( *eve == *event ) { 329 if ( *eve == *event ) {
330 //qDebug("CalendarLocal::Duplicate event found! Not inserted! "); 330 //qDebug("CalendarLocal::Duplicate event found! Not inserted! ");
331 return false; 331 return false;
332 } 332 }
333 } 333 }
334 return addEvent( event ); 334 return addEvent( event );
335} 335}
336 336
337bool CalendarLocal::addEvent( Event *event ) 337bool CalendarLocal::addEvent( Event *event )
338{ 338{
339 insertEvent( event ); 339 insertEvent( event );
340 340
341 event->registerObserver( this ); 341 event->registerObserver( this );
342 342
343 setModified( true ); 343 setModified( true );
344 if ( event->calID() == 0 ) 344 if ( event->calID() == 0 )
345 event->setCalID( mDefaultCalendar ); 345 event->setCalID_block( mDefaultCalendar );
346 event->setCalEnabled( true ); 346 event->setCalEnabled( true );
347 347
348 return true; 348 return true;
349} 349}
350 350
351void CalendarLocal::deleteEvent( Event *event ) 351void CalendarLocal::deleteEvent( Event *event )
352{ 352{
353 clearUndo(event); 353 clearUndo(event);
354 if ( mEventList.removeRef( event ) ) { 354 if ( mEventList.removeRef( event ) ) {
355 setModified( true ); 355 setModified( true );
356 } 356 }
357} 357}
358 358
359 359
360Event *CalendarLocal::event( const QString &uid ) 360Event *CalendarLocal::event( const QString &uid )
361{ 361{
362 Event *event; 362 Event *event;
363 Event *retVal = 0; 363 Event *retVal = 0;
364 for ( event = mEventList.first(); event; event = mEventList.next() ) { 364 for ( event = mEventList.first(); event; event = mEventList.next() ) {
365 if ( event->calEnabled() && event->uid() == uid ) { 365 if ( event->calEnabled() && event->uid() == uid ) {
366 if ( retVal ) { 366 if ( retVal ) {
367 if ( retVal->calID() > event->calID() ) { 367 if ( retVal->calID() > event->calID() ) {
368 retVal = event; 368 retVal = event;
369 } 369 }
370 } else { 370 } else {
371 retVal = event; 371 retVal = event;
372 } 372 }
373 } 373 }
374 } 374 }
375 return retVal; 375 return retVal;
376} 376}
377bool CalendarLocal::addTodoNoDup( Todo *todo ) 377bool CalendarLocal::addTodoNoDup( Todo *todo )
378{ 378{
379 Todo * eve; 379 Todo * eve;
380 for ( eve = mTodoList.first(); eve ; eve = mTodoList.next() ) { 380 for ( eve = mTodoList.first(); eve ; eve = mTodoList.next() ) {
381 if ( *eve == *todo ) { 381 if ( *eve == *todo ) {
382 //qDebug("duplicate todo found! not inserted! "); 382 //qDebug("duplicate todo found! not inserted! ");
383 return false; 383 return false;
384 } 384 }
385 } 385 }
386 return addTodo( todo ); 386 return addTodo( todo );
387} 387}
388bool CalendarLocal::addTodo( Todo *todo ) 388bool CalendarLocal::addTodo( Todo *todo )
389{ 389{
390 mTodoList.append( todo ); 390 mTodoList.append( todo );
391 391
392 todo->registerObserver( this ); 392 todo->registerObserver( this );
393 393
394 // Set up subtask relations 394 // Set up subtask relations
395 setupRelations( todo ); 395 setupRelations( todo );
396 396
397 setModified( true ); 397 setModified( true );
398 if ( todo->calID() == 0 ) 398 if ( todo->calID() == 0 )
399 todo->setCalID( mDefaultCalendar ); 399 todo->setCalID_block( mDefaultCalendar );
400 todo->setCalEnabled( true ); 400 todo->setCalEnabled( true );
401 return true; 401 return true;
402} 402}
403 403
404void CalendarLocal::deleteTodo( Todo *todo ) 404void CalendarLocal::deleteTodo( Todo *todo )
405{ 405{
406 // Handle orphaned children 406 // Handle orphaned children
407 removeRelations( todo ); 407 removeRelations( todo );
408 clearUndo(todo); 408 clearUndo(todo);
409 409
410 if ( mTodoList.removeRef( todo ) ) { 410 if ( mTodoList.removeRef( todo ) ) {
411 setModified( true ); 411 setModified( true );
412 } 412 }
413} 413}
414 414
415QPtrList<Todo> CalendarLocal::rawTodos() 415QPtrList<Todo> CalendarLocal::rawTodos()
416{ 416{
417 QPtrList<Todo> el; 417 QPtrList<Todo> el;
418 for ( Todo *it = mTodoList.first(); it; it = mTodoList.next() ) 418 for ( Todo *it = mTodoList.first(); it; it = mTodoList.next() )
419 if ( it->calEnabled() ) el.append( it ); 419 if ( it->calEnabled() ) el.append( it );
420 return el; 420 return el;
421} 421}
422Todo *CalendarLocal::todo( QString syncProf, QString id ) 422Todo *CalendarLocal::todo( QString syncProf, QString id )
423{ 423{
424 Todo *todo; 424 Todo *todo;
425 for ( todo = mTodoList.first(); todo; todo = mTodoList.next() ) { 425 for ( todo = mTodoList.first(); todo; todo = mTodoList.next() ) {
426 if ( todo->calEnabled() && todo->getID( syncProf ) == id ) return todo; 426 if ( todo->calEnabled() && todo->getID( syncProf ) == id ) return todo;
427 } 427 }
428 428
429 return 0; 429 return 0;
430} 430}
431void CalendarLocal::removeSyncInfo( QString syncProfile) 431void CalendarLocal::removeSyncInfo( QString syncProfile)
432{ 432{
433 QPtrList<Incidence> all = rawIncidences() ; 433 QPtrList<Incidence> all = rawIncidences() ;
434 Incidence *inc; 434 Incidence *inc;
435 for ( inc = all.first(); inc; inc = all.next() ) { 435 for ( inc = all.first(); inc; inc = all.next() ) {
436 inc->removeID( syncProfile ); 436 inc->removeID( syncProfile );
437 } 437 }
438 if ( syncProfile.isEmpty() ) { 438 if ( syncProfile.isEmpty() ) {
439 QPtrList<Event> el; 439 QPtrList<Event> el;
440 Event *todo; 440 Event *todo;
441 for ( todo = mEventList.first(); todo; todo = mEventList.next() ) { 441 for ( todo = mEventList.first(); todo; todo = mEventList.next() ) {
442 if ( todo->uid().left( 15 ) == QString("last-syncEvent-") ) 442 if ( todo->uid().left( 15 ) == QString("last-syncEvent-") )
443 el.append( todo ); 443 el.append( todo );
444 } 444 }
445 for ( todo = el.first(); todo; todo = el.next() ) { 445 for ( todo = el.first(); todo; todo = el.next() ) {
446 deleteIncidence ( todo ); 446 deleteIncidence ( todo );
447 } 447 }
448 } else { 448 } else {
449 Event *lse = event( "last-syncEvent-"+ syncProfile); 449 Event *lse = event( "last-syncEvent-"+ syncProfile);
450 if ( lse ) 450 if ( lse )
451 deleteIncidence ( lse ); 451 deleteIncidence ( lse );
452 } 452 }
453} 453}
454QPtrList<Event> CalendarLocal::getExternLastSyncEvents() 454QPtrList<Event> CalendarLocal::getExternLastSyncEvents()
455{ 455{
456 QPtrList<Event> el; 456 QPtrList<Event> el;
457 Event *todo; 457 Event *todo;
458 for ( todo = mEventList.first(); todo; todo = mEventList.next() ) { 458 for ( todo = mEventList.first(); todo; todo = mEventList.next() ) {
459 if ( todo->uid().left( 15 ) == QString("last-syncEvent-") ) 459 if ( todo->uid().left( 15 ) == QString("last-syncEvent-") )
460 if ( todo->summary().left(3) == "E: " ) 460 if ( todo->summary().left(3) == "E: " )
461 el.append( todo ); 461 el.append( todo );
462 } 462 }
463 463
464 return el; 464 return el;
465 465
466} 466}
467Event *CalendarLocal::event( QString syncProf, QString id ) 467Event *CalendarLocal::event( QString syncProf, QString id )
468{ 468{
469 Event *todo; 469 Event *todo;
470 for ( todo = mEventList.first(); todo; todo = mEventList.next() ) { 470 for ( todo = mEventList.first(); todo; todo = mEventList.next() ) {
471 if ( todo->calEnabled() && todo->getID( syncProf ) == id ) return todo; 471 if ( todo->calEnabled() && todo->getID( syncProf ) == id ) return todo;
472 } 472 }
473 473
474 return 0; 474 return 0;
475} 475}
476Todo *CalendarLocal::todo( const QString &uid ) 476Todo *CalendarLocal::todo( const QString &uid )
477{ 477{
478 Todo *todo; 478 Todo *todo;
479 Todo *retVal = 0; 479 Todo *retVal = 0;
480 for ( todo = mTodoList.first(); todo; todo = mTodoList.next() ) { 480 for ( todo = mTodoList.first(); todo; todo = mTodoList.next() ) {
481 if ( todo->calEnabled() && todo->uid() == uid ) { 481 if ( todo->calEnabled() && todo->uid() == uid ) {
482 if ( retVal ) { 482 if ( retVal ) {
483 if ( retVal->calID() > todo->calID() ) { 483 if ( retVal->calID() > todo->calID() ) {
484 retVal = todo; 484 retVal = todo;
485 } 485 }
486 } else { 486 } else {
487 retVal = todo; 487 retVal = todo;
488 } 488 }
489 } 489 }
490 } 490 }
491 return retVal; 491 return retVal;
492} 492}
493void CalendarLocal::getIncidenceCount( int calId, int& events, int & todos, int & journals) 493void CalendarLocal::getIncidenceCount( int calId, int& events, int & todos, int & journals)
494{ 494{
495 events = 0; 495 events = 0;
496 todos = 0; 496 todos = 0;
497 journals = 0; 497 journals = 0;
498 { 498 {
499 Todo *todo; 499 Todo *todo;
500 for ( todo = mTodoList.first(); todo; todo = mTodoList.next() ) { 500 for ( todo = mTodoList.first(); todo; todo = mTodoList.next() ) {
501 if ( todo->calID() == calId ) 501 if ( todo->calID() == calId )
502 ++todos; 502 ++todos;
503 } 503 }
504 } 504 }
505 { 505 {
506 Event *todo; 506 Event *todo;
507 for ( todo = mEventList.first(); todo; todo = mEventList.next() ) { 507 for ( todo = mEventList.first(); todo; todo = mEventList.next() ) {
508 if ( todo->calID() == calId ) 508 if ( todo->calID() == calId )
509 ++events; 509 ++events;
510 510
511 } 511 }
512 } 512 }
513 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() ) 513 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() )
514 if ( it->calID() == calId ) ++journals; 514 if ( it->calID() == calId ) ++journals;
515 515
516} 516}
517QString CalendarLocal::nextSummary() const 517QString CalendarLocal::nextSummary() const
518{ 518{
519 return mNextSummary; 519 return mNextSummary;
520} 520}
521QDateTime CalendarLocal::nextAlarmEventDateTime() const 521QDateTime CalendarLocal::nextAlarmEventDateTime() const
522{ 522{
523 return mNextAlarmEventDateTime; 523 return mNextAlarmEventDateTime;
524} 524}
525void CalendarLocal::checkAlarmForIncidence( Incidence * incidence, bool deleted) 525void CalendarLocal::checkAlarmForIncidence( Incidence * incidence, bool deleted)
526{ 526{
527 //mNextAlarmIncidence 527 //mNextAlarmIncidence
528 //mNextAlarmDateTime 528 //mNextAlarmDateTime
529 //return mNextSummary; 529 //return mNextSummary;
530 //return mNextAlarmEventDateTime; 530 //return mNextAlarmEventDateTime;
531 bool newNextAlarm = false; 531 bool newNextAlarm = false;
532 bool computeNextAlarm = false; 532 bool computeNextAlarm = false;
533 bool ok; 533 bool ok;
534 int offset; 534 int offset;
535 QDateTime nextA; 535 QDateTime nextA;
536 // QString nextSum; 536 // QString nextSum;
537 //QDateTime nextEvent; 537 //QDateTime nextEvent;
538 if ( mNextAlarmIncidence == 0 || incidence == 0 ) { 538 if ( mNextAlarmIncidence == 0 || incidence == 0 ) {
539 computeNextAlarm = true; 539 computeNextAlarm = true;
540 } else { 540 } else {
541 if ( ! deleted ) { 541 if ( ! deleted ) {
542 nextA = incidence->getNextAlarmDateTime(& ok, &offset, QDateTime::currentDateTime() ) ; 542 nextA = incidence->getNextAlarmDateTime(& ok, &offset, QDateTime::currentDateTime() ) ;
543 if ( ok ) { 543 if ( ok ) {
544 if ( nextA < mNextAlarmDateTime ) { 544 if ( nextA < mNextAlarmDateTime ) {
545 deRegisterAlarm(); 545 deRegisterAlarm();
546 mNextAlarmDateTime = nextA; 546 mNextAlarmDateTime = nextA;
547 mNextSummary = incidence->summary(); 547 mNextSummary = incidence->summary();
548 mNextAlarmEventDateTime = nextA.addSecs(offset ) ; 548 mNextAlarmEventDateTime = nextA.addSecs(offset ) ;
549 mNextAlarmEventDateTimeString = KGlobal::locale()->formatDateTime(mNextAlarmEventDateTime); 549 mNextAlarmEventDateTimeString = KGlobal::locale()->formatDateTime(mNextAlarmEventDateTime);
550 newNextAlarm = true; 550 newNextAlarm = true;
551 mNextAlarmIncidence = incidence; 551 mNextAlarmIncidence = incidence;
552 } else { 552 } else {
553 if ( incidence == mNextAlarmIncidence ) { 553 if ( incidence == mNextAlarmIncidence ) {
554 computeNextAlarm = true; 554 computeNextAlarm = true;
555 } 555 }
556 } 556 }
557 } else { 557 } else {
558 if ( mNextAlarmIncidence == incidence ) { 558 if ( mNextAlarmIncidence == incidence ) {
559 computeNextAlarm = true; 559 computeNextAlarm = true;
560 } 560 }
561 } 561 }
562 } else { // deleted 562 } else { // deleted
563 if ( incidence == mNextAlarmIncidence ) { 563 if ( incidence == mNextAlarmIncidence ) {
564 computeNextAlarm = true; 564 computeNextAlarm = true;
565 } 565 }
566 } 566 }
567 } 567 }
568 if ( computeNextAlarm ) { 568 if ( computeNextAlarm ) {
569 deRegisterAlarm(); 569 deRegisterAlarm();
570 nextA = nextAlarm( 1000 ); 570 nextA = nextAlarm( 1000 );
571 if (! mNextAlarmIncidence ) { 571 if (! mNextAlarmIncidence ) {
572 return; 572 return;
573 } 573 }
574 newNextAlarm = true; 574 newNextAlarm = true;
575 } 575 }
576 if ( newNextAlarm ) 576 if ( newNextAlarm )
577 registerAlarm(); 577 registerAlarm();
578} 578}
579QString CalendarLocal:: getAlarmNotification() 579QString CalendarLocal:: getAlarmNotification()
580{ 580{
581 QString ret; 581 QString ret;
582 // this should not happen 582 // this should not happen
583 if (! mNextAlarmIncidence ) 583 if (! mNextAlarmIncidence )
584 return "cal_alarm"+ mNextSummary.left( 25 )+"\n"+mNextAlarmEventDateTimeString; 584 return "cal_alarm"+ mNextSummary.left( 25 )+"\n"+mNextAlarmEventDateTimeString;
585 Alarm* alarm = mNextAlarmIncidence->alarms().first(); 585 Alarm* alarm = mNextAlarmIncidence->alarms().first();
586 if ( alarm->type() == Alarm::Procedure ) { 586 if ( alarm->type() == Alarm::Procedure ) {
587 ret = "proc_alarm" + alarm->programFile()+"+++"; 587 ret = "proc_alarm" + alarm->programFile()+"+++";
588 } else { 588 } else {
589 ret = "audio_alarm" +alarm->audioFile() +"+++"; 589 ret = "audio_alarm" +alarm->audioFile() +"+++";
590 } 590 }
591 ret += "cal_alarm"+ mNextSummary.left( 25 ); 591 ret += "cal_alarm"+ mNextSummary.left( 25 );
592 if ( mNextSummary.length() > 25 ) 592 if ( mNextSummary.length() > 25 )
593 ret += "\n" + mNextSummary.mid(25, 25 ); 593 ret += "\n" + mNextSummary.mid(25, 25 );
594 ret+= "\n"+mNextAlarmEventDateTimeString; 594 ret+= "\n"+mNextAlarmEventDateTimeString;
595 return ret; 595 return ret;
596} 596}
597void CalendarLocal::registerAlarm() 597void CalendarLocal::registerAlarm()
598{ 598{
599 mLastAlarmNotificationString = getAlarmNotification(); 599 mLastAlarmNotificationString = getAlarmNotification();
600 // qDebug("++ register Alarm %s %s",mNextAlarmDateTime.toString().latin1(), mLastAlarmNotificationString.latin1() ); 600 // qDebug("++ register Alarm %s %s",mNextAlarmDateTime.toString().latin1(), mLastAlarmNotificationString.latin1() );
601 emit addAlarm ( mNextAlarmDateTime, mLastAlarmNotificationString ); 601 emit addAlarm ( mNextAlarmDateTime, mLastAlarmNotificationString );
602// #ifndef DESKTOP_VERSION 602// #ifndef DESKTOP_VERSION
603// AlarmServer::addAlarm ( mNextAlarmDateTime,"koalarm", mLastAlarmNotificationString.latin1() ); 603// AlarmServer::addAlarm ( mNextAlarmDateTime,"koalarm", mLastAlarmNotificationString.latin1() );
604// #endif 604// #endif
605} 605}
606void CalendarLocal::deRegisterAlarm() 606void CalendarLocal::deRegisterAlarm()
607{ 607{
608 if ( mLastAlarmNotificationString.isNull() ) 608 if ( mLastAlarmNotificationString.isNull() )
609 return; 609 return;
610 //qDebug("-- deregister Alarm %s ", mLastAlarmNotificationString.latin1() ); 610 //qDebug("-- deregister Alarm %s ", mLastAlarmNotificationString.latin1() );
611 611
612 emit removeAlarm ( mNextAlarmDateTime, mLastAlarmNotificationString ); 612 emit removeAlarm ( mNextAlarmDateTime, mLastAlarmNotificationString );
613 mNextAlarmEventDateTime = QDateTime(); 613 mNextAlarmEventDateTime = QDateTime();
614// #ifndef DESKTOP_VERSION 614// #ifndef DESKTOP_VERSION
615// AlarmServer::deleteAlarm (mNextAlarmDateTime ,"koalarm" ,mLastAlarmNotificationString.latin1() ); 615// AlarmServer::deleteAlarm (mNextAlarmDateTime ,"koalarm" ,mLastAlarmNotificationString.latin1() );
616// #endif 616// #endif
617} 617}
618 618
619QPtrList<Todo> CalendarLocal::todos( const QDate &date ) 619QPtrList<Todo> CalendarLocal::todos( const QDate &date )
620{ 620{
621 QPtrList<Todo> todos; 621 QPtrList<Todo> todos;
622 622
623 Todo *todo; 623 Todo *todo;
624 for ( todo = mTodoList.first(); todo; todo = mTodoList.next() ) { 624 for ( todo = mTodoList.first(); todo; todo = mTodoList.next() ) {
625 if ( !todo->calEnabled() ) continue; 625 if ( !todo->calEnabled() ) continue;
626 if ( todo->hasDueDate() && todo->dtDue().date() == date ) { 626 if ( todo->hasDueDate() && todo->dtDue().date() == date ) {
627 todos.append( todo ); 627 todos.append( todo );
628 } 628 }
629 } 629 }
630 630
631 filter()->apply( &todos ); 631 filter()->apply( &todos );
632 return todos; 632 return todos;
633} 633}
634void CalendarLocal::reInitAlarmSettings() 634void CalendarLocal::reInitAlarmSettings()
635{ 635{
636 if ( !mNextAlarmIncidence ) { 636 if ( !mNextAlarmIncidence ) {
637 nextAlarm( 1000 ); 637 nextAlarm( 1000 );
638 } 638 }
639 deRegisterAlarm(); 639 deRegisterAlarm();
640 mNextAlarmIncidence = 0; 640 mNextAlarmIncidence = 0;
641 checkAlarmForIncidence( 0, false ); 641 checkAlarmForIncidence( 0, false );
642 642
643} 643}
644 644
645 645
646 646
647QDateTime CalendarLocal::nextAlarm( int daysTo ) 647QDateTime CalendarLocal::nextAlarm( int daysTo )
648{ 648{
649 QDateTime nextA = QDateTime::currentDateTime().addDays( daysTo ); 649 QDateTime nextA = QDateTime::currentDateTime().addDays( daysTo );
650 QDateTime start = QDateTime::currentDateTime().addSecs( 30 ); 650 QDateTime start = QDateTime::currentDateTime().addSecs( 30 );
651 QDateTime next; 651 QDateTime next;
652 Event *e; 652 Event *e;
653 bool ok; 653 bool ok;
654 bool found = false; 654 bool found = false;
655 int offset; 655 int offset;
656 mNextAlarmIncidence = 0; 656 mNextAlarmIncidence = 0;
657 for( e = mEventList.first(); e; e = mEventList.next() ) { 657 for( e = mEventList.first(); e; e = mEventList.next() ) {
658 if ( !e->calEnabled() ) continue; 658 if ( !e->calEnabled() ) continue;
659 next = e->getNextAlarmDateTime(& ok, &offset, QDateTime::currentDateTime() ) ; 659 next = e->getNextAlarmDateTime(& ok, &offset, QDateTime::currentDateTime() ) ;
660 if ( ok ) { 660 if ( ok ) {
661 if ( next < nextA ) { 661 if ( next < nextA ) {
662 nextA = next; 662 nextA = next;
663 found = true; 663 found = true;
664 mNextSummary = e->summary(); 664 mNextSummary = e->summary();
665 mNextAlarmEventDateTime = next.addSecs(offset ) ; 665 mNextAlarmEventDateTime = next.addSecs(offset ) ;
666 mNextAlarmIncidence = (Incidence *) e; 666 mNextAlarmIncidence = (Incidence *) e;
667 } 667 }
668 } 668 }
669 } 669 }
670 Todo *t; 670 Todo *t;
671 for( t = mTodoList.first(); t; t = mTodoList.next() ) { 671 for( t = mTodoList.first(); t; t = mTodoList.next() ) {
672 if ( !t->calEnabled() ) continue; 672 if ( !t->calEnabled() ) continue;
673 next = t->getNextAlarmDateTime(& ok, &offset, QDateTime::currentDateTime() ) ; 673 next = t->getNextAlarmDateTime(& ok, &offset, QDateTime::currentDateTime() ) ;
674 if ( ok ) { 674 if ( ok ) {
675 if ( next < nextA ) { 675 if ( next < nextA ) {
676 nextA = next; 676 nextA = next;
677 found = true; 677 found = true;
678 mNextSummary = t->summary(); 678 mNextSummary = t->summary();
679 mNextAlarmEventDateTime = next.addSecs(offset ); 679 mNextAlarmEventDateTime = next.addSecs(offset );
680 mNextAlarmIncidence = (Incidence *) t; 680 mNextAlarmIncidence = (Incidence *) t;
681 } 681 }
682 } 682 }
683 } 683 }
684 if ( mNextAlarmIncidence ) { 684 if ( mNextAlarmIncidence ) {
685 mNextAlarmEventDateTimeString = KGlobal::locale()->formatDateTime(mNextAlarmEventDateTime); 685 mNextAlarmEventDateTimeString = KGlobal::locale()->formatDateTime(mNextAlarmEventDateTime);
686 mNextAlarmDateTime = nextA; 686 mNextAlarmDateTime = nextA;
687 } 687 }
688 return nextA; 688 return nextA;
689} 689}
690Alarm::List CalendarLocal::alarmsTo( const QDateTime &to ) 690Alarm::List CalendarLocal::alarmsTo( const QDateTime &to )
691{ 691{
692 return alarms( QDateTime( QDate( 1900, 1, 1 ) ), to ); 692 return alarms( QDateTime( QDate( 1900, 1, 1 ) ), to );
693} 693}
694 694
695Alarm::List CalendarLocal::alarms( const QDateTime &from, const QDateTime &to ) 695Alarm::List CalendarLocal::alarms( const QDateTime &from, const QDateTime &to )
696{ 696{
697 697
698 Alarm::List alarms; 698 Alarm::List alarms;
699 699
700 Event *e; 700 Event *e;
701 701
702 for( e = mEventList.first(); e; e = mEventList.next() ) { 702 for( e = mEventList.first(); e; e = mEventList.next() ) {
703 if ( !e->calEnabled() ) continue; 703 if ( !e->calEnabled() ) continue;
704 if ( e->doesRecur() ) appendRecurringAlarms( alarms, e, from, to ); 704 if ( e->doesRecur() ) appendRecurringAlarms( alarms, e, from, to );
705 else appendAlarms( alarms, e, from, to ); 705 else appendAlarms( alarms, e, from, to );
706 } 706 }
707 707
708 Todo *t; 708 Todo *t;
709 for( t = mTodoList.first(); t; t = mTodoList.next() ) { 709 for( t = mTodoList.first(); t; t = mTodoList.next() ) {
710 if ( !t->calEnabled() ) continue; 710 if ( !t->calEnabled() ) continue;
711 appendAlarms( alarms, t, from, to ); 711 appendAlarms( alarms, t, from, to );
712 } 712 }
713 713
714 return alarms; 714 return alarms;
715} 715}
716 716
717void CalendarLocal::appendAlarms( Alarm::List &alarms, Incidence *incidence, 717void CalendarLocal::appendAlarms( Alarm::List &alarms, Incidence *incidence,
718 const QDateTime &from, const QDateTime &to ) 718 const QDateTime &from, const QDateTime &to )
719{ 719{
720 QPtrList<Alarm> alarmList = incidence->alarms(); 720 QPtrList<Alarm> alarmList = incidence->alarms();
721 Alarm *alarm; 721 Alarm *alarm;
722 for( alarm = alarmList.first(); alarm; alarm = alarmList.next() ) { 722 for( alarm = alarmList.first(); alarm; alarm = alarmList.next() ) {
723// kdDebug(5800) << "CalendarLocal::appendAlarms() '" << alarm->text() 723// kdDebug(5800) << "CalendarLocal::appendAlarms() '" << alarm->text()
724// << "': " << alarm->time().toString() << " - " << alarm->enabled() << endl; 724// << "': " << alarm->time().toString() << " - " << alarm->enabled() << endl;
725 if ( alarm->enabled() ) { 725 if ( alarm->enabled() ) {
726 if ( alarm->time() >= from && alarm->time() <= to ) { 726 if ( alarm->time() >= from && alarm->time() <= to ) {
727 alarms.append( alarm ); 727 alarms.append( alarm );
728 } 728 }
729 } 729 }
730 } 730 }
731} 731}
732 732
733void CalendarLocal::appendRecurringAlarms( Alarm::List &alarms, 733void CalendarLocal::appendRecurringAlarms( Alarm::List &alarms,
734 Incidence *incidence, 734 Incidence *incidence,
735 const QDateTime &from, 735 const QDateTime &from,
736 const QDateTime &to ) 736 const QDateTime &to )
737{ 737{
738 738
739 QPtrList<Alarm> alarmList = incidence->alarms(); 739 QPtrList<Alarm> alarmList = incidence->alarms();
740 Alarm *alarm; 740 Alarm *alarm;
741 QDateTime qdt; 741 QDateTime qdt;
742 for( alarm = alarmList.first(); alarm; alarm = alarmList.next() ) { 742 for( alarm = alarmList.first(); alarm; alarm = alarmList.next() ) {
743 if (incidence->recursOn(from.date())) { 743 if (incidence->recursOn(from.date())) {
744 qdt.setTime(alarm->time().time()); 744 qdt.setTime(alarm->time().time());
745 qdt.setDate(from.date()); 745 qdt.setDate(from.date());
746 } 746 }
747 else qdt = alarm->time(); 747 else qdt = alarm->time();
748 // qDebug("1 %s %s %s", qdt.toString().latin1(), from.toString().latin1(), to.toString().latin1()); 748 // qDebug("1 %s %s %s", qdt.toString().latin1(), from.toString().latin1(), to.toString().latin1());
749 if ( alarm->enabled() ) { 749 if ( alarm->enabled() ) {
750 if ( qdt >= from && qdt <= to ) { 750 if ( qdt >= from && qdt <= to ) {
751 alarms.append( alarm ); 751 alarms.append( alarm );
752 } 752 }
753 } 753 }
754 } 754 }
755} 755}
756 756
757 757
758/****************************** PROTECTED METHODS ****************************/ 758/****************************** PROTECTED METHODS ****************************/
759 759
760// after changes are made to an event, this should be called. 760// after changes are made to an event, this should be called.
761void CalendarLocal::update( IncidenceBase *incidence ) 761void CalendarLocal::update( IncidenceBase *incidence )
762{ 762{
763 incidence->setSyncStatus( Event::SYNCMOD ); 763 incidence->setSyncStatus( Event::SYNCMOD );
764 incidence->setLastModified( QDateTime::currentDateTime() ); 764 incidence->setLastModified( QDateTime::currentDateTime() );
765 // we should probably update the revision number here, 765 // we should probably update the revision number here,
766 // or internally in the Event itself when certain things change. 766 // or internally in the Event itself when certain things change.
767 // need to verify with ical documentation. 767 // need to verify with ical documentation.
768 768
769 setModified( true ); 769 setModified( true );
770} 770}
771 771
772void CalendarLocal::insertEvent( Event *event ) 772void CalendarLocal::insertEvent( Event *event )
773{ 773{
774 if ( mEventList.findRef( event ) < 0 ) mEventList.append( event ); 774 if ( mEventList.findRef( event ) < 0 ) mEventList.append( event );
775} 775}
776 776
777 777
778QPtrList<Event> CalendarLocal::rawEventsForDate( const QDate &qd, bool sorted ) 778QPtrList<Event> CalendarLocal::rawEventsForDate( const QDate &qd, bool sorted )
779{ 779{
780 QPtrList<Event> eventList; 780 QPtrList<Event> eventList;
781 781
782 Event *event; 782 Event *event;
783 for( event = mEventList.first(); event; event = mEventList.next() ) { 783 for( event = mEventList.first(); event; event = mEventList.next() ) {
784 if ( !event->calEnabled() ) continue; 784 if ( !event->calEnabled() ) continue;
785 if ( event->doesRecur() ) { 785 if ( event->doesRecur() ) {
786 if ( event->isMultiDay() ) { 786 if ( event->isMultiDay() ) {
787 int extraDays = event->dtStart().date().daysTo( event->dtEnd().date() ); 787 int extraDays = event->dtStart().date().daysTo( event->dtEnd().date() );
788 int i; 788 int i;
789 for ( i = 0; i <= extraDays; i++ ) { 789 for ( i = 0; i <= extraDays; i++ ) {
790 if ( event->recursOn( qd.addDays( -i ) ) ) { 790 if ( event->recursOn( qd.addDays( -i ) ) ) {
791 eventList.append( event ); 791 eventList.append( event );
792 break; 792 break;
793 } 793 }
794 } 794 }
795 } else { 795 } else {
796 if ( event->recursOn( qd ) ) 796 if ( event->recursOn( qd ) )
797 eventList.append( event ); 797 eventList.append( event );
798 } 798 }
799 } else { 799 } else {
800 if ( event->dtStart().date() <= qd && event->dtEnd().date() >= qd ) { 800 if ( event->dtStart().date() <= qd && event->dtEnd().date() >= qd ) {
801 eventList.append( event ); 801 eventList.append( event );
802 } 802 }
803 } 803 }
804 } 804 }
805 805
806 if ( !sorted ) { 806 if ( !sorted ) {
807 return eventList; 807 return eventList;
808 } 808 }
809 809
810 // kdDebug(5800) << "Sorting events for date\n" << endl; 810 // kdDebug(5800) << "Sorting events for date\n" << endl;
811 // now, we have to sort it based on dtStart.time() 811 // now, we have to sort it based on dtStart.time()
812 QPtrList<Event> eventListSorted; 812 QPtrList<Event> eventListSorted;
813 Event *sortEvent; 813 Event *sortEvent;
814 for ( event = eventList.first(); event; event = eventList.next() ) { 814 for ( event = eventList.first(); event; event = eventList.next() ) {
815 sortEvent = eventListSorted.first(); 815 sortEvent = eventListSorted.first();
816 int i = 0; 816 int i = 0;
817 while ( sortEvent && event->dtStart().time()>=sortEvent->dtStart().time() ) 817 while ( sortEvent && event->dtStart().time()>=sortEvent->dtStart().time() )
818 { 818 {
819 i++; 819 i++;
820 sortEvent = eventListSorted.next(); 820 sortEvent = eventListSorted.next();
821 } 821 }
822 eventListSorted.insert( i, event ); 822 eventListSorted.insert( i, event );
823 } 823 }
824 return eventListSorted; 824 return eventListSorted;
825} 825}
826 826
827 827
828QPtrList<Event> CalendarLocal::rawEvents( const QDate &start, const QDate &end, 828QPtrList<Event> CalendarLocal::rawEvents( const QDate &start, const QDate &end,
829 bool inclusive ) 829 bool inclusive )
830{ 830{
831 Event *event = 0; 831 Event *event = 0;
832 832
833 QPtrList<Event> eventList; 833 QPtrList<Event> eventList;
834 834
835 // Get non-recurring events 835 // Get non-recurring events
836 for( event = mEventList.first(); event; event = mEventList.next() ) { 836 for( event = mEventList.first(); event; event = mEventList.next() ) {
837 if ( !event->calEnabled() ) continue; 837 if ( !event->calEnabled() ) continue;
838 if ( event->doesRecur() ) { 838 if ( event->doesRecur() ) {
839 QDate rStart = event->dtStart().date(); 839 QDate rStart = event->dtStart().date();
840 bool found = false; 840 bool found = false;
841 if ( inclusive ) { 841 if ( inclusive ) {
842 if ( rStart >= start && rStart <= end ) { 842 if ( rStart >= start && rStart <= end ) {
843 // Start date of event is in range. Now check for end date. 843 // Start date of event is in range. Now check for end date.
844 // if duration is negative, event recurs forever, so do not include it. 844 // if duration is negative, event recurs forever, so do not include it.
845 if ( event->recurrence()->duration() == 0 ) { // End date set 845 if ( event->recurrence()->duration() == 0 ) { // End date set
846 QDate rEnd = event->recurrence()->endDate(); 846 QDate rEnd = event->recurrence()->endDate();
847 if ( rEnd >= start && rEnd <= end ) { // End date within range 847 if ( rEnd >= start && rEnd <= end ) { // End date within range
848 found = true; 848 found = true;
849 } 849 }
850 } else if ( event->recurrence()->duration() > 0 ) { // Duration set 850 } else if ( event->recurrence()->duration() > 0 ) { // Duration set
851 // TODO: Calculate end date from duration. Should be done in Event 851 // TODO: Calculate end date from duration. Should be done in Event
852 // For now exclude all events with a duration. 852 // For now exclude all events with a duration.
853 } 853 }
854 } 854 }
855 } else { 855 } else {
856 bool founOne; 856 bool founOne;
857 QDate next = event->getNextOccurence( start, &founOne ).date(); 857 QDate next = event->getNextOccurence( start, &founOne ).date();
858 if ( founOne ) { 858 if ( founOne ) {
859 if ( next <= end ) { 859 if ( next <= end ) {
860 found = true; 860 found = true;
861 } 861 }
862 } 862 }
863 863
864 /* 864 /*
865 // crap !!! 865 // crap !!!
866 if ( rStart <= end ) { // Start date not after range 866 if ( rStart <= end ) { // Start date not after range
867 if ( rStart >= start ) { // Start date within range 867 if ( rStart >= start ) { // Start date within range
868 found = true; 868 found = true;
869 } else if ( event->recurrence()->duration() == -1 ) { // Recurs forever 869 } else if ( event->recurrence()->duration() == -1 ) { // Recurs forever
870 found = true; 870 found = true;
871 } else if ( event->recurrence()->duration() == 0 ) { // End date set 871 } else if ( event->recurrence()->duration() == 0 ) { // End date set
872 QDate rEnd = event->recurrence()->endDate(); 872 QDate rEnd = event->recurrence()->endDate();
873 if ( rEnd >= start && rEnd <= end ) { // End date within range 873 if ( rEnd >= start && rEnd <= end ) { // End date within range
874 found = true; 874 found = true;
875 } 875 }
876 } else { // Duration set 876 } else { // Duration set
877 // TODO: Calculate end date from duration. Should be done in Event 877 // TODO: Calculate end date from duration. Should be done in Event
878 // For now include all events with a duration. 878 // For now include all events with a duration.
879 found = true; 879 found = true;
880 } 880 }
881 } 881 }
882 */ 882 */
883 883
884 } 884 }
885 885
886 if ( found ) eventList.append( event ); 886 if ( found ) eventList.append( event );
887 } else { 887 } else {
888 QDate s = event->dtStart().date(); 888 QDate s = event->dtStart().date();
889 QDate e = event->dtEnd().date(); 889 QDate e = event->dtEnd().date();
890 890
891 if ( inclusive ) { 891 if ( inclusive ) {
892 if ( s >= start && e <= end ) { 892 if ( s >= start && e <= end ) {
893 eventList.append( event ); 893 eventList.append( event );
894 } 894 }
895 } else { 895 } else {
896 if ( ( e >= start && s <= end ) ) { 896 if ( ( e >= start && s <= end ) ) {
897 eventList.append( event ); 897 eventList.append( event );
898 } 898 }
899 } 899 }
900 } 900 }
901 } 901 }
902 902
903 return eventList; 903 return eventList;
904} 904}
905 905
906QPtrList<Event> CalendarLocal::rawEventsForDate( const QDateTime &qdt ) 906QPtrList<Event> CalendarLocal::rawEventsForDate( const QDateTime &qdt )
907{ 907{
908 return rawEventsForDate( qdt.date() ); 908 return rawEventsForDate( qdt.date() );
909} 909}
910 910
911QPtrList<Event> CalendarLocal::rawEvents() 911QPtrList<Event> CalendarLocal::rawEvents()
912{ 912{
913 QPtrList<Event> el; 913 QPtrList<Event> el;
914 for ( Event *it = mEventList.first(); it; it = mEventList.next() ) 914 for ( Event *it = mEventList.first(); it; it = mEventList.next() )
915 if ( it->calEnabled() ) el.append( it ); 915 if ( it->calEnabled() ) el.append( it );
916 return el; 916 return el;
917} 917}
918 918
919bool CalendarLocal::addJournal(Journal *journal) 919bool CalendarLocal::addJournal(Journal *journal)
920{ 920{
921 mJournalList.append(journal); 921 mJournalList.append(journal);
922 922
923 journal->registerObserver( this ); 923 journal->registerObserver( this );
924 924
925 setModified( true ); 925 setModified( true );
926 if ( journal->calID() == 0 ) 926 if ( journal->calID() == 0 )
927 journal->setCalID( mDefaultCalendar ); 927 journal->setCalID_block( mDefaultCalendar );
928 journal->setCalEnabled( true ); 928 journal->setCalEnabled( true );
929 return true; 929 return true;
930} 930}
931 931
932void CalendarLocal::deleteJournal( Journal *journal ) 932void CalendarLocal::deleteJournal( Journal *journal )
933{ 933{
934 clearUndo(journal); 934 clearUndo(journal);
935 if ( mJournalList.removeRef(journal) ) { 935 if ( mJournalList.removeRef(journal) ) {
936 setModified( true ); 936 setModified( true );
937 } 937 }
938} 938}
939 939
940QPtrList<Journal> CalendarLocal::journals4Date( const QDate & date ) 940QPtrList<Journal> CalendarLocal::journals4Date( const QDate & date )
941{ 941{
942 QPtrList<Journal> el; 942 QPtrList<Journal> el;
943 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() ) 943 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() )
944 if ( it->calEnabled() && it->dtStart().date() == date) el.append( it ); 944 if ( it->calEnabled() && it->dtStart().date() == date) el.append( it );
945 return el; 945 return el;
946} 946}
947Journal *CalendarLocal::journal( const QDate &date ) 947Journal *CalendarLocal::journal( const QDate &date )
948{ 948{
949// kdDebug(5800) << "CalendarLocal::journal() " << date.toString() << endl; 949// kdDebug(5800) << "CalendarLocal::journal() " << date.toString() << endl;
950 950
951 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() ) 951 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() )
952 if ( it->calEnabled() && it->dtStart().date() == date ) 952 if ( it->calEnabled() && it->dtStart().date() == date )
953 return it; 953 return it;
954 954
955 return 0; 955 return 0;
956} 956}
957 957
958Journal *CalendarLocal::journal( const QString &uid ) 958Journal *CalendarLocal::journal( const QString &uid )
959{ 959{
960 Journal * retVal = 0; 960 Journal * retVal = 0;
961 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() ) 961 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() )
962 if ( it->calEnabled() && it->uid() == uid ) { 962 if ( it->calEnabled() && it->uid() == uid ) {
963 if ( retVal ) { 963 if ( retVal ) {
964 if ( retVal->calID() > it->calID() ) { 964 if ( retVal->calID() > it->calID() ) {
965 retVal = it; 965 retVal = it;
966 } 966 }
967 } else { 967 } else {
968 retVal = it; 968 retVal = it;
969 } 969 }
970 } 970 }
971 return retVal; 971 return retVal;
972} 972}
973 973
974QPtrList<Journal> CalendarLocal::journals() 974QPtrList<Journal> CalendarLocal::journals()
975{ 975{
976 QPtrList<Journal> el; 976 QPtrList<Journal> el;
977 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() ) 977 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() )
978 if ( it->calEnabled() ) el.append( it ); 978 if ( it->calEnabled() ) el.append( it );
979 return el; 979 return el;
980} 980}
981void CalendarLocal::setCalendarRemove( int id ) 981void CalendarLocal::setCalendarRemove( int id )
982{ 982{
983 983
984 { 984 {
985 QPtrList<Event> EventList = mEventList; 985 QPtrList<Event> EventList = mEventList;
986 Event * ev = EventList.first(); 986 Event * ev = EventList.first();
987 while ( ev ) { 987 while ( ev ) {
988 if ( ev->calID() == id && ev->uid().left( 15 ) != QString("last-syncEvent-") ) 988 if ( ev->calID() == id && ev->uid().left( 15 ) != QString("last-syncEvent-") )
989 deleteEvent( ev ); 989 deleteEvent( ev );
990 ev = EventList.next(); 990 ev = EventList.next();
991 } 991 }
992 } 992 }
993 { 993 {
994 994
995 QPtrList<Todo> TodoList = mTodoList; 995 QPtrList<Todo> TodoList = mTodoList;
996 Todo * ev = TodoList.first(); 996 Todo * ev = TodoList.first();
997 while ( ev ) { 997 while ( ev ) {
998 if ( ev->calID() == id ) 998 if ( ev->calID() == id )
999 deleteTodo( ev ); 999 deleteTodo( ev );
1000 ev = TodoList.next(); 1000 ev = TodoList.next();
1001 } 1001 }
1002 } 1002 }
1003 { 1003 {
1004 QPtrList<Journal> JournalList = mJournalList; 1004 QPtrList<Journal> JournalList = mJournalList;
1005 Journal * ev = JournalList.first(); 1005 Journal * ev = JournalList.first();
1006 while ( ev ) { 1006 while ( ev ) {
1007 if ( ev->calID() == id ) 1007 if ( ev->calID() == id )
1008 deleteJournal( ev ); 1008 deleteJournal( ev );
1009 ev = JournalList.next(); 1009 ev = JournalList.next();
1010 } 1010 }
1011 } 1011 }
1012 1012
1013 clearUndo(0); 1013 clearUndo(0);
1014 1014
1015} 1015}
1016 1016
1017void CalendarLocal::setAllCalendarEnabled( bool enable ) 1017void CalendarLocal::setAllCalendarEnabled( bool enable )
1018{ 1018{
1019 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() ) 1019 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() )
1020 it->setCalEnabled( enable ); 1020 it->setCalEnabled( enable );
1021 1021
1022 for ( Event *it = mEventList.first(); it; it = mEventList.next() ) 1022 for ( Event *it = mEventList.first(); it; it = mEventList.next() )
1023 it->setCalEnabled( enable ); 1023 it->setCalEnabled( enable );
1024 1024
1025 for ( Todo *it = mTodoList.first(); it; it = mTodoList.next() ) 1025 for ( Todo *it = mTodoList.first(); it; it = mTodoList.next() )
1026 it->setCalEnabled( enable ); 1026 it->setCalEnabled( enable );
1027 1027
1028 1028
1029} 1029}
1030void CalendarLocal::setCalendarEnabled( int id, bool enable ) 1030void CalendarLocal::setCalendarEnabled( int id, bool enable )
1031{ 1031{
1032 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() ) 1032 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() )
1033 if ( it->calID() == id ) it->setCalEnabled( enable ); 1033 if ( it->calID() == id ) it->setCalEnabled( enable );
1034 1034
1035 for ( Event *it = mEventList.first(); it; it = mEventList.next() ) 1035 for ( Event *it = mEventList.first(); it; it = mEventList.next() )
1036 if ( it->calID() == id ) it->setCalEnabled( enable ); 1036 if ( it->calID() == id ) it->setCalEnabled( enable );
1037 1037
1038 for ( Todo *it = mTodoList.first(); it; it = mTodoList.next() ) 1038 for ( Todo *it = mTodoList.first(); it; it = mTodoList.next() )
1039 if ( it->calID() == id ) it->setCalEnabled( enable ); 1039 if ( it->calID() == id ) it->setCalEnabled( enable );
1040 1040
1041} 1041}
1042 1042
1043void CalendarLocal::setReadOnly( int id, bool enable ) 1043void CalendarLocal::setReadOnly( int id, bool enable )
1044{ 1044{
1045 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() ) 1045 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() )
1046 if ( it->calID() == id ) it->setReadOnly( enable ); 1046 if ( it->calID() == id ) it->setReadOnly( enable );
1047 1047
1048 for ( Event *it = mEventList.first(); it; it = mEventList.next() ) 1048 for ( Event *it = mEventList.first(); it; it = mEventList.next() )
1049 if ( it->calID() == id ) it->setReadOnly( enable ); 1049 if ( it->calID() == id ) it->setReadOnly( enable );
1050 1050
1051 for ( Todo *it = mTodoList.first(); it; it = mTodoList.next() ) 1051 for ( Todo *it = mTodoList.first(); it; it = mTodoList.next() )
1052 if ( it->calID() == id ) it->setReadOnly( enable ); 1052 if ( it->calID() == id ) it->setReadOnly( enable );
1053 1053
1054} 1054}
1055 1055
1056void CalendarLocal::setAlarmEnabled( int id, bool enable ) 1056void CalendarLocal::setAlarmEnabled( int id, bool enable )
1057{ 1057{
1058 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() ) 1058 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() )
1059 if ( it->calID() == id ) it->setAlarmEnabled( enable ); 1059 if ( it->calID() == id ) it->setAlarmEnabled( enable );
1060 1060
1061 for ( Event *it = mEventList.first(); it; it = mEventList.next() ) 1061 for ( Event *it = mEventList.first(); it; it = mEventList.next() )
1062 if ( it->calID() == id ) it->setAlarmEnabled( enable ); 1062 if ( it->calID() == id ) it->setAlarmEnabled( enable );
1063 1063
1064 for ( Todo *it = mTodoList.first(); it; it = mTodoList.next() ) 1064 for ( Todo *it = mTodoList.first(); it; it = mTodoList.next() )
1065 if ( it->calID() == id ) it->setAlarmEnabled( enable ); 1065 if ( it->calID() == id ) it->setAlarmEnabled( enable );
1066 reInitAlarmSettings(); 1066 reInitAlarmSettings();
1067 1067
1068} 1068}
1069void CalendarLocal::setDefaultCalendarEnabledOnly() 1069void CalendarLocal::setDefaultCalendarEnabledOnly()
1070{ 1070{
1071 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() ) 1071 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() )
1072 it->setCalEnabled( it->calID() == mDefaultCalendar ); 1072 it->setCalEnabled( it->calID() == mDefaultCalendar );
1073 1073
1074 for ( Event *it = mEventList.first(); it; it = mEventList.next() ) 1074 for ( Event *it = mEventList.first(); it; it = mEventList.next() )
1075 it->setCalEnabled( it->calID() == mDefaultCalendar); 1075 it->setCalEnabled( it->calID() == mDefaultCalendar);
1076 1076
1077 for ( Todo *it = mTodoList.first(); it; it = mTodoList.next() ) 1077 for ( Todo *it = mTodoList.first(); it; it = mTodoList.next() )
1078 it->setCalEnabled( it->calID() == mDefaultCalendar); 1078 it->setCalEnabled( it->calID() == mDefaultCalendar);
1079 1079
1080} 1080}
diff --git a/libkcal/incidencebase.cpp b/libkcal/incidencebase.cpp
index cfef973..56c0560 100644
--- a/libkcal/incidencebase.cpp
+++ b/libkcal/incidencebase.cpp
@@ -1,493 +1,500 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21#include <kglobal.h> 21#include <kglobal.h>
22#include <klocale.h> 22#include <klocale.h>
23#include <kdebug.h> 23#include <kdebug.h>
24#include <kidmanager.h> 24#include <kidmanager.h>
25 25
26#include "calformat.h" 26#include "calformat.h"
27#include "syncdefines.h" 27#include "syncdefines.h"
28 28
29#include "incidencebase.h" 29#include "incidencebase.h"
30 30
31using namespace KCal; 31using namespace KCal;
32 32
33IncidenceBase::IncidenceBase() : 33IncidenceBase::IncidenceBase() :
34 mReadOnly(false), mFloats(true), mDuration(0), mHasDuration(false), 34 mReadOnly(false), mFloats(true), mDuration(0), mHasDuration(false),
35 mPilotId(0), mSyncStatus(SYNCMOD) 35 mPilotId(0), mSyncStatus(SYNCMOD)
36{ 36{
37 blockLastModified = false; 37 blockLastModified = false;
38 setUid(CalFormat::createUniqueId()); 38 setUid(CalFormat::createUniqueId());
39 mOrganizer = ""; 39 mOrganizer = "";
40 mFloats = false; 40 mFloats = false;
41 mDuration = 0; 41 mDuration = 0;
42 mHasDuration = false; 42 mHasDuration = false;
43 mPilotId = 0; 43 mPilotId = 0;
44 mExternalId = ":"; 44 mExternalId = ":";
45 mTempSyncStat = SYNC_TEMPSTATE_INITIAL; 45 mTempSyncStat = SYNC_TEMPSTATE_INITIAL;
46 mSyncStatus = 0; 46 mSyncStatus = 0;
47 mAttendees.setAutoDelete( true ); 47 mAttendees.setAutoDelete( true );
48 mCalEnabled = true; 48 mCalEnabled = true;
49 mAlarmEnabled = true; 49 mAlarmEnabled = true;
50 mCalID = 0; 50 mCalID = 0;
51} 51}
52 52
53IncidenceBase::IncidenceBase(const IncidenceBase &i) : 53IncidenceBase::IncidenceBase(const IncidenceBase &i) :
54 CustomProperties( i ) 54 CustomProperties( i )
55{ 55{
56 56
57 blockLastModified = false; 57 blockLastModified = false;
58 mReadOnly = i.mReadOnly; 58 mReadOnly = i.mReadOnly;
59 mDtStart = i.mDtStart; 59 mDtStart = i.mDtStart;
60 mDuration = i.mDuration; 60 mDuration = i.mDuration;
61 mHasDuration = i.mHasDuration; 61 mHasDuration = i.mHasDuration;
62 mOrganizer = i.mOrganizer; 62 mOrganizer = i.mOrganizer;
63 mUid = i.mUid; 63 mUid = i.mUid;
64 mCalEnabled = i.mCalEnabled; 64 mCalEnabled = i.mCalEnabled;
65 mAlarmEnabled = i.mAlarmEnabled; 65 mAlarmEnabled = i.mAlarmEnabled;
66 mCalID = i.mCalID; 66 mCalID = i.mCalID;
67 QPtrList<Attendee> attendees = i.attendees(); 67 QPtrList<Attendee> attendees = i.attendees();
68 for( Attendee *a = attendees.first(); a; a = attendees.next() ) { 68 for( Attendee *a = attendees.first(); a; a = attendees.next() ) {
69 mAttendees.append( new Attendee( *a ) ); 69 mAttendees.append( new Attendee( *a ) );
70 } 70 }
71 mFloats = i.mFloats; 71 mFloats = i.mFloats;
72 mLastModified = i.mLastModified; 72 mLastModified = i.mLastModified;
73 mPilotId = i.mPilotId; 73 mPilotId = i.mPilotId;
74 mTempSyncStat = i.mTempSyncStat; 74 mTempSyncStat = i.mTempSyncStat;
75 mSyncStatus = i.mSyncStatus; 75 mSyncStatus = i.mSyncStatus;
76 mExternalId = i.mExternalId; 76 mExternalId = i.mExternalId;
77 // The copied object is a new one, so it isn't observed by the observer 77 // The copied object is a new one, so it isn't observed by the observer
78 // of the original object. 78 // of the original object.
79 mObservers.clear(); 79 mObservers.clear();
80 80
81 mAttendees.setAutoDelete( true ); 81 mAttendees.setAutoDelete( true );
82} 82}
83 83
84IncidenceBase::~IncidenceBase() 84IncidenceBase::~IncidenceBase()
85{ 85{
86} 86}
87 87
88 88
89bool KCal::operator==( const IncidenceBase& i1, const IncidenceBase& i2 ) 89bool KCal::operator==( const IncidenceBase& i1, const IncidenceBase& i2 )
90{ 90{
91 // do not compare mSyncStatus and mExternalId 91 // do not compare mSyncStatus and mExternalId
92 if( i1.attendees().count() != i2.attendees().count() ) { 92 if( i1.attendees().count() != i2.attendees().count() ) {
93 return false; // no need to check further 93 return false; // no need to check further
94 } 94 }
95 if ( i1.attendees().count() > 0 ) { 95 if ( i1.attendees().count() > 0 ) {
96 Attendee * a1 = i1.attendees().first(), *a2 =i2.attendees().first() ; 96 Attendee * a1 = i1.attendees().first(), *a2 =i2.attendees().first() ;
97 while ( a1 ) { 97 while ( a1 ) {
98 if ( !( (*a1) == (*a2)) ) 98 if ( !( (*a1) == (*a2)) )
99 { 99 {
100 //qDebug("Attendee not equal "); 100 //qDebug("Attendee not equal ");
101 return false; 101 return false;
102 } 102 }
103 a1 = i1.attendees().next(); 103 a1 = i1.attendees().next();
104 a2 = i2.attendees().next(); 104 a2 = i2.attendees().next();
105 } 105 }
106 } 106 }
107 //if ( i1.dtStart() != i2.dtStart() ) 107 //if ( i1.dtStart() != i2.dtStart() )
108 // return false; 108 // return false;
109#if 0 109#if 0
110 qDebug("1 %d ",i1.doesFloat() == i2.doesFloat() ); 110 qDebug("1 %d ",i1.doesFloat() == i2.doesFloat() );
111 qDebug("1 %d ",i1.duration() == i2.duration() ); 111 qDebug("1 %d ",i1.duration() == i2.duration() );
112 qDebug("3 %d ",i1.hasDuration() == i2.hasDuration() ); 112 qDebug("3 %d ",i1.hasDuration() == i2.hasDuration() );
113 qDebug("1 %d ",i1.pilotId() == i2.pilotId() ); 113 qDebug("1 %d ",i1.pilotId() == i2.pilotId() );
114 qDebug("1 %d %d %d",i1.syncStatus() == i2.syncStatus() , i1.syncStatus(),i2.syncStatus() ); 114 qDebug("1 %d %d %d",i1.syncStatus() == i2.syncStatus() , i1.syncStatus(),i2.syncStatus() );
115 qDebug("6 %d ",i1.organizer() == i2.organizer() ); 115 qDebug("6 %d ",i1.organizer() == i2.organizer() );
116 116
117#endif 117#endif
118 if ( i1.hasDuration() == i2.hasDuration() ) { 118 if ( i1.hasDuration() == i2.hasDuration() ) {
119 if ( i1.hasDuration() ) { 119 if ( i1.hasDuration() ) {
120 if ( i1.duration() != i2.duration() ) 120 if ( i1.duration() != i2.duration() )
121 return false; 121 return false;
122 } 122 }
123 } else { 123 } else {
124 return false; 124 return false;
125 } 125 }
126 126
127 return ( i1.organizer() == i2.organizer() && 127 return ( i1.organizer() == i2.organizer() &&
128 // i1.uid() == i2.uid() && 128 // i1.uid() == i2.uid() &&
129 // Don't compare lastModified, otherwise the operator is not 129 // Don't compare lastModified, otherwise the operator is not
130 // of much use. We are not comparing for identity, after all. 130 // of much use. We are not comparing for identity, after all.
131 i1.doesFloat() == i2.doesFloat() && 131 i1.doesFloat() == i2.doesFloat() &&
132 i1.pilotId() == i2.pilotId() );// && i1.syncStatus() == i2.syncStatus() ); 132 i1.pilotId() == i2.pilotId() );// && i1.syncStatus() == i2.syncStatus() );
133 // no need to compare mObserver 133 // no need to compare mObserver
134} 134}
135 135
136 136
137QDateTime IncidenceBase::getEvenTime( QDateTime dt ) 137QDateTime IncidenceBase::getEvenTime( QDateTime dt )
138{ 138{
139 QTime t = dt.time(); 139 QTime t = dt.time();
140 dt.setTime( QTime (t.hour (), t.minute (), t.second () ) ); 140 dt.setTime( QTime (t.hour (), t.minute (), t.second () ) );
141 return dt; 141 return dt;
142} 142}
143 143
144bool IncidenceBase::isTagged() const 144bool IncidenceBase::isTagged() const
145{ 145{
146 return mIsTagged; 146 return mIsTagged;
147} 147}
148void IncidenceBase::setTagged( bool b) 148void IncidenceBase::setTagged( bool b)
149{ 149{
150 mIsTagged = b; 150 mIsTagged = b;
151} 151}
152void IncidenceBase::setCalID( int id ) 152void IncidenceBase::setCalID( int id )
153{ 153{
154 if ( mCalID > 0 ) { 154 if ( mCalID > 0 ) {
155 updated();
156 }
157 mCalID = id;
158}
159void IncidenceBase::setCalID_block( int id )
160{
161 if ( mCalID > 0 ) {
155 blockLastModified = true; 162 blockLastModified = true;
156 updated(); 163 updated();
157 blockLastModified = false; 164 blockLastModified = false;
158 } 165 }
159 mCalID = id; 166 mCalID = id;
160} 167}
161int IncidenceBase::calID() const 168int IncidenceBase::calID() const
162{ 169{
163 return mCalID; 170 return mCalID;
164} 171}
165void IncidenceBase::setCalEnabled( bool b ) 172void IncidenceBase::setCalEnabled( bool b )
166{ 173{
167 mCalEnabled = b; 174 mCalEnabled = b;
168} 175}
169bool IncidenceBase::calEnabled() const 176bool IncidenceBase::calEnabled() const
170{ 177{
171 return mCalEnabled; 178 return mCalEnabled;
172} 179}
173 180
174void IncidenceBase::setAlarmEnabled( bool b ) 181void IncidenceBase::setAlarmEnabled( bool b )
175{ 182{
176 mAlarmEnabled = b; 183 mAlarmEnabled = b;
177} 184}
178bool IncidenceBase::alarmEnabled() const 185bool IncidenceBase::alarmEnabled() const
179{ 186{
180 return mAlarmEnabled; 187 return mAlarmEnabled;
181} 188}
182 189
183 190
184void IncidenceBase::setUid(const QString &uid) 191void IncidenceBase::setUid(const QString &uid)
185{ 192{
186 mUid = uid; 193 mUid = uid;
187 updated(); 194 updated();
188} 195}
189 196
190QString IncidenceBase::uid() const 197QString IncidenceBase::uid() const
191{ 198{
192 return mUid; 199 return mUid;
193} 200}
194void IncidenceBase::setLastModifiedSubInvalid() 201void IncidenceBase::setLastModifiedSubInvalid()
195{ 202{
196 // virtual method 203 // virtual method
197} 204}
198void IncidenceBase::setLastModified(const QDateTime &lm) 205void IncidenceBase::setLastModified(const QDateTime &lm)
199{ 206{
200 if ( blockLastModified ) return; 207 if ( blockLastModified ) return;
201 // DON'T! updated() because we call this from 208 // DON'T! updated() because we call this from
202 // Calendar::updateEvent(). 209 // Calendar::updateEvent().
203 mLastModified = getEvenTime(lm); 210 mLastModified = getEvenTime(lm);
204 mLastModifiedKey.sprintf("%04d%02d%02d%02d%02d%02d", 211 mLastModifiedKey.sprintf("%04d%02d%02d%02d%02d%02d",
205 mLastModified.date().year(), 212 mLastModified.date().year(),
206 mLastModified.date().month(), 213 mLastModified.date().month(),
207 mLastModified.date().day(), 214 mLastModified.date().day(),
208 mLastModified.time().hour(), 215 mLastModified.time().hour(),
209 mLastModified.time().minute(), 216 mLastModified.time().minute(),
210 mLastModified.time().second() ); 217 mLastModified.time().second() );
211 setLastModifiedSubInvalid(); 218 setLastModifiedSubInvalid();
212 //qDebug("IncidenceBase::setLastModified %s ",lm.toString().latin1()); 219 //qDebug("IncidenceBase::setLastModified %s ",lm.toString().latin1());
213} 220}
214QString IncidenceBase::lastModifiedSortKey() const 221QString IncidenceBase::lastModifiedSortKey() const
215{ 222{
216 return mLastModifiedKey; 223 return mLastModifiedKey;
217} 224}
218 225
219QDateTime IncidenceBase::lastModified() const 226QDateTime IncidenceBase::lastModified() const
220{ 227{
221 return mLastModified; 228 return mLastModified;
222} 229}
223 230
224void IncidenceBase::setOrganizer(const QString &o) 231void IncidenceBase::setOrganizer(const QString &o)
225{ 232{
226 // we don't check for readonly here, because it is 233 // we don't check for readonly here, because it is
227 // possible that by setting the organizer we are changing 234 // possible that by setting the organizer we are changing
228 // the event's readonly status... 235 // the event's readonly status...
229 mOrganizer = o; 236 mOrganizer = o;
230 if (mOrganizer.left(7).upper() == "MAILTO:") 237 if (mOrganizer.left(7).upper() == "MAILTO:")
231 mOrganizer = mOrganizer.remove(0,7); 238 mOrganizer = mOrganizer.remove(0,7);
232 239
233 updated(); 240 updated();
234} 241}
235 242
236QString IncidenceBase::organizer() const 243QString IncidenceBase::organizer() const
237{ 244{
238 return mOrganizer; 245 return mOrganizer;
239} 246}
240 247
241void IncidenceBase::setReadOnly( bool readOnly ) 248void IncidenceBase::setReadOnly( bool readOnly )
242{ 249{
243 mReadOnly = readOnly; 250 mReadOnly = readOnly;
244} 251}
245 252
246void IncidenceBase::setDtStart(const QDateTime &dtStart) 253void IncidenceBase::setDtStart(const QDateTime &dtStart)
247{ 254{
248// if (mReadOnly) return; 255// if (mReadOnly) return;
249 mDtStart = getEvenTime(dtStart); 256 mDtStart = getEvenTime(dtStart);
250 updated(); 257 updated();
251} 258}
252 259
253 260
254QDateTime IncidenceBase::dtStart() const 261QDateTime IncidenceBase::dtStart() const
255{ 262{
256 return mDtStart; 263 return mDtStart;
257} 264}
258 265
259QString IncidenceBase::dtStartTimeStr() const 266QString IncidenceBase::dtStartTimeStr() const
260{ 267{
261 return KGlobal::locale()->formatTime(dtStart().time()); 268 return KGlobal::locale()->formatTime(dtStart().time());
262} 269}
263 270
264QString IncidenceBase::dtStartDateStr(bool shortfmt) const 271QString IncidenceBase::dtStartDateStr(bool shortfmt) const
265{ 272{
266 return KGlobal::locale()->formatDate(dtStart().date(),shortfmt); 273 return KGlobal::locale()->formatDate(dtStart().date(),shortfmt);
267} 274}
268 275
269QString IncidenceBase::dtStartStr(bool shortfmt) const 276QString IncidenceBase::dtStartStr(bool shortfmt) const
270{ 277{
271 if ( doesFloat() ) 278 if ( doesFloat() )
272 return KGlobal::locale()->formatDate(dtStart().date(),shortfmt); 279 return KGlobal::locale()->formatDate(dtStart().date(),shortfmt);
273 return KGlobal::locale()->formatDateTime(dtStart(), shortfmt); 280 return KGlobal::locale()->formatDateTime(dtStart(), shortfmt);
274} 281}
275 282
276 283
277bool IncidenceBase::doesFloat() const 284bool IncidenceBase::doesFloat() const
278{ 285{
279 return mFloats; 286 return mFloats;
280} 287}
281 288
282void IncidenceBase::setFloats(bool f) 289void IncidenceBase::setFloats(bool f)
283{ 290{
284 if (mReadOnly) return; 291 if (mReadOnly) return;
285 mFloats = f; 292 mFloats = f;
286 updated(); 293 updated();
287} 294}
288 295
289 296
290bool IncidenceBase::addAttendee(Attendee *a, bool doupdate) 297bool IncidenceBase::addAttendee(Attendee *a, bool doupdate)
291{ 298{
292 if (mReadOnly) return false; 299 if (mReadOnly) return false;
293 if (a->name().left(7).upper() == "MAILTO:") 300 if (a->name().left(7).upper() == "MAILTO:")
294 a->setName(a->name().remove(0,7)); 301 a->setName(a->name().remove(0,7));
295 302
296 QPtrListIterator<Attendee> qli(mAttendees); 303 QPtrListIterator<Attendee> qli(mAttendees);
297 304
298 qli.toFirst(); 305 qli.toFirst();
299 while (qli) { 306 while (qli) {
300 if (*qli.current() == *a) 307 if (*qli.current() == *a)
301 return false; 308 return false;
302 ++qli; 309 ++qli;
303 } 310 }
304 mAttendees.append(a); 311 mAttendees.append(a);
305 if (doupdate) updated(); 312 if (doupdate) updated();
306 return true; 313 return true;
307} 314}
308 315
309#if 0 316#if 0
310void IncidenceBase::removeAttendee(Attendee *a) 317void IncidenceBase::removeAttendee(Attendee *a)
311{ 318{
312 if (mReadOnly) return; 319 if (mReadOnly) return;
313 mAttendees.removeRef(a); 320 mAttendees.removeRef(a);
314 updated(); 321 updated();
315} 322}
316 323
317void IncidenceBase::removeAttendee(const char *n) 324void IncidenceBase::removeAttendee(const char *n)
318{ 325{
319 Attendee *a; 326 Attendee *a;
320 327
321 if (mReadOnly) return; 328 if (mReadOnly) return;
322 for (a = mAttendees.first(); a; a = mAttendees.next()) 329 for (a = mAttendees.first(); a; a = mAttendees.next())
323 if (a->getName() == n) { 330 if (a->getName() == n) {
324 mAttendees.remove(); 331 mAttendees.remove();
325 break; 332 break;
326 } 333 }
327} 334}
328#endif 335#endif
329 336
330void IncidenceBase::clearAttendees() 337void IncidenceBase::clearAttendees()
331{ 338{
332 if (mReadOnly) return; 339 if (mReadOnly) return;
333 mAttendees.clear(); 340 mAttendees.clear();
334} 341}
335 342
336#if 0 343#if 0
337Attendee *IncidenceBase::getAttendee(const char *n) const 344Attendee *IncidenceBase::getAttendee(const char *n) const
338{ 345{
339 QPtrListIterator<Attendee> qli(mAttendees); 346 QPtrListIterator<Attendee> qli(mAttendees);
340 347
341 qli.toFirst(); 348 qli.toFirst();
342 while (qli) { 349 while (qli) {
343 if (qli.current()->getName() == n) 350 if (qli.current()->getName() == n)
344 return qli.current(); 351 return qli.current();
345 ++qli; 352 ++qli;
346 } 353 }
347 return 0L; 354 return 0L;
348} 355}
349#endif 356#endif
350 357
351Attendee *IncidenceBase::attendeeByMail(const QString &email) 358Attendee *IncidenceBase::attendeeByMail(const QString &email)
352{ 359{
353 QPtrListIterator<Attendee> qli(mAttendees); 360 QPtrListIterator<Attendee> qli(mAttendees);
354 361
355 qli.toFirst(); 362 qli.toFirst();
356 while (qli) { 363 while (qli) {
357 if (qli.current()->email().lower() == email.lower()) 364 if (qli.current()->email().lower() == email.lower())
358 return qli.current(); 365 return qli.current();
359 ++qli; 366 ++qli;
360 } 367 }
361 return 0L; 368 return 0L;
362} 369}
363 370
364Attendee *IncidenceBase::attendeeByMails(const QStringList &emails, const QString& email) 371Attendee *IncidenceBase::attendeeByMails(const QStringList &emails, const QString& email)
365{ 372{
366 QPtrListIterator<Attendee> qli(mAttendees); 373 QPtrListIterator<Attendee> qli(mAttendees);
367 374
368 QStringList mails = emails; 375 QStringList mails = emails;
369 if (!email.isEmpty()) { 376 if (!email.isEmpty()) {
370 mails.append(email); 377 mails.append(email);
371 } 378 }
372 qli.toFirst(); 379 qli.toFirst();
373 while (qli) { 380 while (qli) {
374 for ( QStringList::Iterator it = mails.begin(); it != mails.end(); ++it ) { 381 for ( QStringList::Iterator it = mails.begin(); it != mails.end(); ++it ) {
375 if (qli.current()->email().lower() == (*it).lower()) 382 if (qli.current()->email().lower() == (*it).lower())
376 return qli.current(); 383 return qli.current();
377 } 384 }
378 385
379 ++qli; 386 ++qli;
380 } 387 }
381 return 0L; 388 return 0L;
382} 389}
383 390
384void IncidenceBase::setDuration(int seconds) 391void IncidenceBase::setDuration(int seconds)
385{ 392{
386 mDuration = seconds; 393 mDuration = seconds;
387 setHasDuration(true); 394 setHasDuration(true);
388} 395}
389 396
390int IncidenceBase::duration() const 397int IncidenceBase::duration() const
391{ 398{
392 return mDuration; 399 return mDuration;
393} 400}
394 401
395void IncidenceBase::setHasDuration(bool b) 402void IncidenceBase::setHasDuration(bool b)
396{ 403{
397 mHasDuration = b; 404 mHasDuration = b;
398} 405}
399 406
400bool IncidenceBase::hasDuration() const 407bool IncidenceBase::hasDuration() const
401{ 408{
402 return mHasDuration; 409 return mHasDuration;
403} 410}
404 411
405void IncidenceBase::setSyncStatus(int stat) 412void IncidenceBase::setSyncStatus(int stat)
406{ 413{
407 if (mReadOnly) return; 414 if (mReadOnly) return;
408 mSyncStatus = stat; 415 mSyncStatus = stat;
409} 416}
410 417
411int IncidenceBase::syncStatus() const 418int IncidenceBase::syncStatus() const
412{ 419{
413 return mSyncStatus; 420 return mSyncStatus;
414} 421}
415 422
416void IncidenceBase::setPilotId( int id ) 423void IncidenceBase::setPilotId( int id )
417{ 424{
418 if (mReadOnly) return; 425 if (mReadOnly) return;
419 mPilotId = id; 426 mPilotId = id;
420} 427}
421 428
422int IncidenceBase::pilotId() const 429int IncidenceBase::pilotId() const
423{ 430{
424 return mPilotId; 431 return mPilotId;
425} 432}
426 433
427int IncidenceBase::tempSyncStat() const 434int IncidenceBase::tempSyncStat() const
428{ 435{
429 return mTempSyncStat; 436 return mTempSyncStat;
430} 437}
431void IncidenceBase::setTempSyncStat( int id ) 438void IncidenceBase::setTempSyncStat( int id )
432{ 439{
433 if (mReadOnly) return; 440 if (mReadOnly) return;
434 mTempSyncStat = id; 441 mTempSyncStat = id;
435} 442}
436 443
437void IncidenceBase::removeID(const QString &prof) 444void IncidenceBase::removeID(const QString &prof)
438{ 445{
439 if ( prof.isEmpty() ) 446 if ( prof.isEmpty() )
440 mExternalId = ":"; 447 mExternalId = ":";
441 else 448 else
442 mExternalId = KIdManager::removeId ( mExternalId, prof); 449 mExternalId = KIdManager::removeId ( mExternalId, prof);
443 450
444} 451}
445void IncidenceBase::setID( const QString & prof , const QString & id ) 452void IncidenceBase::setID( const QString & prof , const QString & id )
446{ 453{
447 mExternalId = KIdManager::setId ( mExternalId, prof, id ); 454 mExternalId = KIdManager::setId ( mExternalId, prof, id );
448} 455}
449QString IncidenceBase::getID( const QString & prof) 456QString IncidenceBase::getID( const QString & prof)
450{ 457{
451 return KIdManager::getId ( mExternalId, prof ); 458 return KIdManager::getId ( mExternalId, prof );
452} 459}
453 460
454// example :Sharp_DTM;22;23566:TP;-1;8654:TPP;18;0: 461// example :Sharp_DTM;22;23566:TP;-1;8654:TPP;18;0:
455// format name;III;JJJ: III >= 0, may be -1. JJJ always >= 0 462// format name;III;JJJ: III >= 0, may be -1. JJJ always >= 0
456void IncidenceBase::setCsum( const QString & prof , const QString & id ) 463void IncidenceBase::setCsum( const QString & prof , const QString & id )
457{ 464{
458 mExternalId = KIdManager::setCsum ( mExternalId, prof, id ); 465 mExternalId = KIdManager::setCsum ( mExternalId, prof, id );
459} 466}
460QString IncidenceBase::getCsum( const QString & prof) 467QString IncidenceBase::getCsum( const QString & prof)
461{ 468{
462 return KIdManager::getCsum ( mExternalId, prof ); 469 return KIdManager::getCsum ( mExternalId, prof );
463} 470}
464 471
465void IncidenceBase::setIDStr( const QString & s ) 472void IncidenceBase::setIDStr( const QString & s )
466{ 473{
467 if (mReadOnly) return; 474 if (mReadOnly) return;
468 mExternalId = s; 475 mExternalId = s;
469} 476}
470 477
471QString IncidenceBase::IDStr() const 478QString IncidenceBase::IDStr() const
472{ 479{
473 return mExternalId ; 480 return mExternalId ;
474} 481}
475void IncidenceBase::registerObserver( IncidenceBase::Observer *observer ) 482void IncidenceBase::registerObserver( IncidenceBase::Observer *observer )
476{ 483{
477 if( !mObservers.contains(observer) ) mObservers.append( observer ); 484 if( !mObservers.contains(observer) ) mObservers.append( observer );
478} 485}
479 486
480void IncidenceBase::unRegisterObserver( IncidenceBase::Observer *observer ) 487void IncidenceBase::unRegisterObserver( IncidenceBase::Observer *observer )
481{ 488{
482 mObservers.remove( observer ); 489 mObservers.remove( observer );
483} 490}
484 491
485void IncidenceBase::updated() 492void IncidenceBase::updated()
486{ 493{
487 QPtrListIterator<Observer> it(mObservers); 494 QPtrListIterator<Observer> it(mObservers);
488 while( it.current() ) { 495 while( it.current() ) {
489 Observer *o = it.current(); 496 Observer *o = it.current();
490 ++it; 497 ++it;
491 o->incidenceUpdated( this ); 498 o->incidenceUpdated( this );
492 } 499 }
493} 500}
diff --git a/libkcal/incidencebase.h b/libkcal/incidencebase.h
index 444d4c4..3edc03b 100644
--- a/libkcal/incidencebase.h
+++ b/libkcal/incidencebase.h
@@ -1,189 +1,190 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20#ifndef KCAL_INCIDENCEBASE_H 20#ifndef KCAL_INCIDENCEBASE_H
21#define KCAL_INCIDENCEBASE_H 21#define KCAL_INCIDENCEBASE_H
22// 22//
23// Incidence - base class of calendaring components 23// Incidence - base class of calendaring components
24// 24//
25 25
26#include <qdatetime.h> 26#include <qdatetime.h>
27#include <qstringlist.h> 27#include <qstringlist.h>
28#include <qvaluelist.h> 28#include <qvaluelist.h>
29#include <qptrlist.h> 29#include <qptrlist.h>
30 30
31#include "customproperties.h" 31#include "customproperties.h"
32#include "attendee.h" 32#include "attendee.h"
33 33
34namespace KCal { 34namespace KCal {
35 35
36typedef QValueList<QDate> DateList; 36typedef QValueList<QDate> DateList;
37 enum IncTypeID { eventID,todoID,journalID,freebusyID }; 37 enum IncTypeID { eventID,todoID,journalID,freebusyID };
38 38
39/** 39/**
40 This class provides the base class common to all calendar components. 40 This class provides the base class common to all calendar components.
41*/ 41*/
42class IncidenceBase : public CustomProperties 42class IncidenceBase : public CustomProperties
43{ 43{
44 public: 44 public:
45 class Observer { 45 class Observer {
46 public: 46 public:
47 virtual void incidenceUpdated( IncidenceBase * ) = 0; 47 virtual void incidenceUpdated( IncidenceBase * ) = 0;
48 }; 48 };
49 49
50 IncidenceBase(); 50 IncidenceBase();
51 IncidenceBase(const IncidenceBase &); 51 IncidenceBase(const IncidenceBase &);
52 virtual ~IncidenceBase(); 52 virtual ~IncidenceBase();
53 53
54 virtual QCString type() const = 0; 54 virtual QCString type() const = 0;
55 virtual IncTypeID typeID() const = 0; 55 virtual IncTypeID typeID() const = 0;
56 56
57 /** Set the unique id for the event */ 57 /** Set the unique id for the event */
58 void setUid(const QString &); 58 void setUid(const QString &);
59 /** Return the unique id for the event */ 59 /** Return the unique id for the event */
60 QString uid() const; 60 QString uid() const;
61 61
62 /** Sets the time the incidence was last modified. */ 62 /** Sets the time the incidence was last modified. */
63 void setLastModified(const QDateTime &lm); 63 void setLastModified(const QDateTime &lm);
64 /** Return the time the incidence was last modified. */ 64 /** Return the time the incidence was last modified. */
65 QDateTime lastModified() const; 65 QDateTime lastModified() const;
66 QString lastModifiedSortKey() const; 66 QString lastModifiedSortKey() const;
67 67
68 /** sets the organizer for the event */ 68 /** sets the organizer for the event */
69 void setOrganizer(const QString &o); 69 void setOrganizer(const QString &o);
70 QString organizer() const; 70 QString organizer() const;
71 71
72 /** Set readonly status. */ 72 /** Set readonly status. */
73 virtual void setReadOnly( bool ); 73 virtual void setReadOnly( bool );
74 /** Return if the object is read-only. */ 74 /** Return if the object is read-only. */
75 bool isReadOnly() const { return mReadOnly; } 75 bool isReadOnly() const { return mReadOnly; }
76 76
77 /** for setting the event's starting date/time with a QDateTime. */ 77 /** for setting the event's starting date/time with a QDateTime. */
78 virtual void setDtStart(const QDateTime &dtStart); 78 virtual void setDtStart(const QDateTime &dtStart);
79 /** returns an event's starting date/time as a QDateTime. */ 79 /** returns an event's starting date/time as a QDateTime. */
80 virtual QDateTime dtStart() const; 80 virtual QDateTime dtStart() const;
81 /** returns an event's starting time as a string formatted according to the 81 /** returns an event's starting time as a string formatted according to the
82 users locale settings */ 82 users locale settings */
83 QString dtStartTimeStr() const; 83 QString dtStartTimeStr() const;
84 /** returns an event's starting date as a string formatted according to the 84 /** returns an event's starting date as a string formatted according to the
85 users locale settings */ 85 users locale settings */
86 QString dtStartDateStr(bool shortfmt=true) const; 86 QString dtStartDateStr(bool shortfmt=true) const;
87 /** returns an event's starting date and time as a string formatted according 87 /** returns an event's starting date and time as a string formatted according
88 to the users locale settings */ 88 to the users locale settings */
89 QString dtStartStr(bool shortfmt=true) const; 89 QString dtStartStr(bool shortfmt=true) const;
90 90
91 virtual void setDuration(int seconds); 91 virtual void setDuration(int seconds);
92 int duration() const; 92 int duration() const;
93 void setHasDuration(bool); 93 void setHasDuration(bool);
94 bool hasDuration() const; 94 bool hasDuration() const;
95 95
96 /** Return true or false depending on whether the incidence "floats," 96 /** Return true or false depending on whether the incidence "floats,"
97 * i.e. has a date but no time attached to it. */ 97 * i.e. has a date but no time attached to it. */
98 bool doesFloat() const; 98 bool doesFloat() const;
99 /** Set whether the incidence floats, i.e. has a date but no time attached to it. */ 99 /** Set whether the incidence floats, i.e. has a date but no time attached to it. */
100 void setFloats(bool f); 100 void setFloats(bool f);
101 101
102 /** 102 /**
103 Add Attendee to this incidence. IncidenceBase takes ownership of the 103 Add Attendee to this incidence. IncidenceBase takes ownership of the
104 Attendee object. 104 Attendee object.
105 */ 105 */
106 bool addAttendee(Attendee *a, bool doupdate=true ); 106 bool addAttendee(Attendee *a, bool doupdate=true );
107// void removeAttendee(Attendee *a); 107// void removeAttendee(Attendee *a);
108// void removeAttendee(const char *n); 108// void removeAttendee(const char *n);
109 /** Remove all Attendees. */ 109 /** Remove all Attendees. */
110 void clearAttendees(); 110 void clearAttendees();
111 /** Return list of attendees. */ 111 /** Return list of attendees. */
112 QPtrList<Attendee> attendees() const { return mAttendees; }; 112 QPtrList<Attendee> attendees() const { return mAttendees; };
113 /** Return number of attendees. */ 113 /** Return number of attendees. */
114 int attendeeCount() const { return mAttendees.count(); }; 114 int attendeeCount() const { return mAttendees.count(); };
115 /** Return the Attendee with this email */ 115 /** Return the Attendee with this email */
116 Attendee* attendeeByMail(const QString &); 116 Attendee* attendeeByMail(const QString &);
117 /** Return first Attendee with one of this emails */ 117 /** Return first Attendee with one of this emails */
118 Attendee* attendeeByMails(const QStringList &, const QString& email = QString::null); 118 Attendee* attendeeByMails(const QStringList &, const QString& email = QString::null);
119 119
120 /** pilot syncronization states */ 120 /** pilot syncronization states */
121 enum { SYNCNONE = 0, SYNCMOD = 1, SYNCDEL = 3 }; 121 enum { SYNCNONE = 0, SYNCMOD = 1, SYNCDEL = 3 };
122 /** Set synchronisation satus. */ 122 /** Set synchronisation satus. */
123 void setSyncStatus(int stat); 123 void setSyncStatus(int stat);
124 /** Return synchronisation status. */ 124 /** Return synchronisation status. */
125 int syncStatus() const; 125 int syncStatus() const;
126 126
127 /** Set Pilot Id. */ 127 /** Set Pilot Id. */
128 void setPilotId(int id); 128 void setPilotId(int id);
129 /** Return Pilot Id. */ 129 /** Return Pilot Id. */
130 int pilotId() const; 130 int pilotId() const;
131 131
132 void setTempSyncStat(int id); 132 void setTempSyncStat(int id);
133 int tempSyncStat() const; 133 int tempSyncStat() const;
134 void setIDStr( const QString & ); 134 void setIDStr( const QString & );
135 QString IDStr() const; 135 QString IDStr() const;
136 void setID( const QString &, const QString & ); 136 void setID( const QString &, const QString & );
137 QString getID( const QString & ); 137 QString getID( const QString & );
138 void setCsum( const QString &, const QString & ); 138 void setCsum( const QString &, const QString & );
139 QString getCsum( const QString & ); 139 QString getCsum( const QString & );
140 void removeID(const QString &); 140 void removeID(const QString &);
141 141
142 void registerObserver( Observer * ); 142 void registerObserver( Observer * );
143 void unRegisterObserver( Observer * ); 143 void unRegisterObserver( Observer * );
144 void updated(); 144 void updated();
145 void setCalID( int id ); 145 void setCalID( int id );
146 void setCalID_block( int id );
146 int calID() const; 147 int calID() const;
147 void setCalEnabled( bool ); 148 void setCalEnabled( bool );
148 bool calEnabled() const; 149 bool calEnabled() const;
149 void setAlarmEnabled( bool ); 150 void setAlarmEnabled( bool );
150 bool alarmEnabled() const; 151 bool alarmEnabled() const;
151 bool isTagged() const; 152 bool isTagged() const;
152 void setTagged( bool ); 153 void setTagged( bool );
153 virtual void setLastModifiedSubInvalid(); 154 virtual void setLastModifiedSubInvalid();
154 protected: 155 protected:
155 bool blockLastModified; 156 bool blockLastModified;
156 bool mIsTagged; 157 bool mIsTagged;
157 QDateTime mDtStart; 158 QDateTime mDtStart;
158 bool mReadOnly; 159 bool mReadOnly;
159 QDateTime getEvenTime( QDateTime ); 160 QDateTime getEvenTime( QDateTime );
160 161
161 private: 162 private:
162 // base components 163 // base components
163 QString mOrganizer; 164 QString mOrganizer;
164 QString mLastModifiedKey; 165 QString mLastModifiedKey;
165 QString mUid; 166 QString mUid;
166 int mCalID; 167 int mCalID;
167 bool mCalEnabled; 168 bool mCalEnabled;
168 bool mAlarmEnabled; 169 bool mAlarmEnabled;
169 QDateTime mLastModified; 170 QDateTime mLastModified;
170 QPtrList<Attendee> mAttendees; 171 QPtrList<Attendee> mAttendees;
171 172
172 bool mFloats; 173 bool mFloats;
173 174
174 int mDuration; 175 int mDuration;
175 bool mHasDuration; 176 bool mHasDuration;
176 QString mExternalId; 177 QString mExternalId;
177 int mTempSyncStat; 178 int mTempSyncStat;
178 179
179 // PILOT SYNCHRONIZATION STUFF 180 // PILOT SYNCHRONIZATION STUFF
180 int mPilotId; // unique id for pilot sync 181 int mPilotId; // unique id for pilot sync
181 int mSyncStatus; // status (for sync) 182 int mSyncStatus; // status (for sync)
182 183
183 QPtrList<Observer> mObservers; 184 QPtrList<Observer> mObservers;
184}; 185};
185 186
186bool operator==( const IncidenceBase&, const IncidenceBase& ); 187bool operator==( const IncidenceBase&, const IncidenceBase& );
187} 188}
188 189
189#endif 190#endif