summaryrefslogtreecommitdiffabout
path: root/libkcal/calendarlocal.cpp
Unidiff
Diffstat (limited to 'libkcal/calendarlocal.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--libkcal/calendarlocal.cpp3
1 files changed, 2 insertions, 1 deletions
diff --git a/libkcal/calendarlocal.cpp b/libkcal/calendarlocal.cpp
index 2a57724..c33581c 100644
--- a/libkcal/calendarlocal.cpp
+++ b/libkcal/calendarlocal.cpp
@@ -18,385 +18,386 @@
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( 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( 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 } 212 }
212 ev->unRegisterObserver( cal ); 213 ev->unRegisterObserver( cal );
213 ev->registerObserver( this ); 214 ev->registerObserver( this );
214 mEventList.append( ev ); 215 mEventList.append( ev );
215 ev = EventList.next(); 216 ev = EventList.next();
216 } 217 }
217 for ( ev = el.first(); ev; ev = el.next() ) { 218 for ( ev = el.first(); ev; ev = el.next() ) {
218 deleteIncidence ( ev ); 219 deleteIncidence ( ev );
219 } 220 }
220 } 221 }
221 { 222 {
222 223
223 QPtrList<Todo> TodoList = cal->rawTodos(); 224 QPtrList<Todo> TodoList = cal->rawTodos();
224 Todo * ev = TodoList.first(); 225 Todo * ev = TodoList.first();
225 while ( ev ) { 226 while ( ev ) {
226 QString rel = ev->relatedToUid(); 227 QString rel = ev->relatedToUid();
227 if ( !rel.isEmpty() ){ 228 if ( !rel.isEmpty() ){
228 ev->setRelatedTo ( 0 ); 229 ev->setRelatedTo ( 0 );
229 ev->setRelatedToUid( rel ); 230 ev->setRelatedToUid( rel );
230 } 231 }
231 ev = TodoList.next(); 232 ev = TodoList.next();
232 } 233 }
233 //TodoList = cal->rawTodos(); 234 //TodoList = cal->rawTodos();
234 ev = TodoList.first(); 235 ev = TodoList.first();
235 while ( ev ) { 236 while ( ev ) {
236 ev->unRegisterObserver( cal ); 237 ev->unRegisterObserver( cal );
237 ev->registerObserver( this ); 238 ev->registerObserver( this );
238 mTodoList.append( ev ); 239 mTodoList.append( ev );
239 setupRelations( ev ); 240 setupRelations( ev );
240 ev = TodoList.next(); 241 ev = TodoList.next();
241 } 242 }
242 } 243 }
243 { 244 {
244 QPtrList<Journal> JournalList = cal->journals(); 245 QPtrList<Journal> JournalList = cal->journals();
245 Journal * ev = JournalList.first(); 246 Journal * ev = JournalList.first();
246 while ( ev ) { 247 while ( ev ) {
247 ev->unRegisterObserver( cal ); 248 ev->unRegisterObserver( cal );
248 ev->registerObserver( this ); 249 ev->registerObserver( this );
249 mJournalList.append( ev ); 250 mJournalList.append( ev );
250 ev = JournalList.next(); 251 ev = JournalList.next();
251 } 252 }
252 } 253 }
253 setModified( true ); 254 setModified( true );
254} 255}
255bool CalendarLocal::load( const QString &fileName ) 256bool CalendarLocal::load( const QString &fileName )
256{ 257{
257 FileStorage storage( this, fileName ); 258 FileStorage storage( this, fileName );
258 return storage.load(); 259 return storage.load();
259} 260}
260 261
261bool CalendarLocal::save( const QString &fileName, CalFormat *format ) 262bool CalendarLocal::save( const QString &fileName, CalFormat *format )
262{ 263{
263 FileStorage storage( this, fileName, format ); 264 FileStorage storage( this, fileName, format );
264 return storage.save(); 265 return storage.save();
265} 266}
266 267
267void CalendarLocal::stopAllTodos() 268void CalendarLocal::stopAllTodos()
268{ 269{
269 for ( Todo *it = mTodoList.first(); it; it = mTodoList.next() ) 270 for ( Todo *it = mTodoList.first(); it; it = mTodoList.next() )
270 it->setRunning( false ); 271 it->setRunning( false );
271 272
272} 273}
273void CalendarLocal::close() 274void CalendarLocal::close()
274{ 275{
275 276
276 Todo * i; 277 Todo * i;
277 for( i = mTodoList.first(); i; i = mTodoList.next() ) i->setRunning(false); 278 for( i = mTodoList.first(); i; i = mTodoList.next() ) i->setRunning(false);
278 279
279 mEventList.setAutoDelete( true ); 280 mEventList.setAutoDelete( true );
280 mTodoList.setAutoDelete( true ); 281 mTodoList.setAutoDelete( true );
281 mJournalList.setAutoDelete( true ); 282 mJournalList.setAutoDelete( true );
282 283
283 mEventList.clear(); 284 mEventList.clear();
284 mTodoList.clear(); 285 mTodoList.clear();
285 mJournalList.clear(); 286 mJournalList.clear();
286 287
287 mEventList.setAutoDelete( false ); 288 mEventList.setAutoDelete( false );
288 mTodoList.setAutoDelete( false ); 289 mTodoList.setAutoDelete( false );
289 mJournalList.setAutoDelete( false ); 290 mJournalList.setAutoDelete( false );
290 291
291 setModified( false ); 292 setModified( false );
292} 293}
293 294
294bool CalendarLocal::addAnniversaryNoDup( Event *event ) 295bool CalendarLocal::addAnniversaryNoDup( Event *event )
295{ 296{
296 QString cat; 297 QString cat;
297 bool isBirthday = true; 298 bool isBirthday = true;
298 if( event->categoriesStr() == i18n( "Anniversary" ) ) { 299 if( event->categoriesStr() == i18n( "Anniversary" ) ) {
299 isBirthday = false; 300 isBirthday = false;
300 cat = i18n( "Anniversary" ); 301 cat = i18n( "Anniversary" );
301 } else if( event->categoriesStr() == i18n( "Birthday" ) ) { 302 } else if( event->categoriesStr() == i18n( "Birthday" ) ) {
302 isBirthday = true; 303 isBirthday = true;
303 cat = i18n( "Birthday" ); 304 cat = i18n( "Birthday" );
304 } else { 305 } else {
305 qDebug("addAnniversaryNoDup called without fitting category! "); 306 qDebug("addAnniversaryNoDup called without fitting category! ");
306 return false; 307 return false;
307 } 308 }
308 Event * eve; 309 Event * eve;
309 for ( eve = mEventList.first(); eve ; eve = mEventList.next() ) { 310 for ( eve = mEventList.first(); eve ; eve = mEventList.next() ) {
310 if ( !(eve->categories().contains( cat ) )) 311 if ( !(eve->categories().contains( cat ) ))
311 continue; 312 continue;
312 // now we have an event with fitting category 313 // now we have an event with fitting category
313 if ( eve->dtStart().date() != event->dtStart().date() ) 314 if ( eve->dtStart().date() != event->dtStart().date() )
314 continue; 315 continue;
315 // now we have an event with fitting category+date 316 // now we have an event with fitting category+date
316 if ( eve->summary() != event->summary() ) 317 if ( eve->summary() != event->summary() )
317 continue; 318 continue;
318 // now we have an event with fitting category+date+summary 319 // now we have an event with fitting category+date+summary
319 return false; 320 return false;
320 } 321 }
321 return addEvent( event ); 322 return addEvent( event );
322 323
323} 324}
324bool CalendarLocal::addEventNoDup( Event *event ) 325bool CalendarLocal::addEventNoDup( Event *event )
325{ 326{
326 Event * eve; 327 Event * eve;
327 for ( eve = mEventList.first(); eve ; eve = mEventList.next() ) { 328 for ( eve = mEventList.first(); eve ; eve = mEventList.next() ) {
328 if ( *eve == *event ) { 329 if ( *eve == *event ) {
329 //qDebug("CalendarLocal::Duplicate event found! Not inserted! "); 330 //qDebug("CalendarLocal::Duplicate event found! Not inserted! ");
330 return false; 331 return false;
331 } 332 }
332 } 333 }
333 return addEvent( event ); 334 return addEvent( event );
334} 335}
335 336
336bool CalendarLocal::addEvent( Event *event ) 337bool CalendarLocal::addEvent( Event *event )
337{ 338{
338 insertEvent( event ); 339 insertEvent( event );
339 340
340 event->registerObserver( this ); 341 event->registerObserver( this );
341 342
342 setModified( true ); 343 setModified( true );
343 if ( event->calID() == 0 ) 344 if ( event->calID() == 0 )
344 event->setCalID( mDefaultCalendar ); 345 event->setCalID( mDefaultCalendar );
345 event->setCalEnabled( true ); 346 event->setCalEnabled( true );
346 347
347 return true; 348 return true;
348} 349}
349 350
350void CalendarLocal::deleteEvent( Event *event ) 351void CalendarLocal::deleteEvent( Event *event )
351{ 352{
352 clearUndo(event); 353 clearUndo(event);
353 if ( mEventList.removeRef( event ) ) { 354 if ( mEventList.removeRef( event ) ) {
354 setModified( true ); 355 setModified( true );
355 } 356 }
356} 357}
357 358
358 359
359Event *CalendarLocal::event( const QString &uid ) 360Event *CalendarLocal::event( const QString &uid )
360{ 361{
361 Event *event; 362 Event *event;
362 Event *retVal = 0; 363 Event *retVal = 0;
363 for ( event = mEventList.first(); event; event = mEventList.next() ) { 364 for ( event = mEventList.first(); event; event = mEventList.next() ) {
364 if ( event->calEnabled() && event->uid() == uid ) { 365 if ( event->calEnabled() && event->uid() == uid ) {
365 if ( retVal ) { 366 if ( retVal ) {
366 if ( retVal->calID() > event->calID() ) { 367 if ( retVal->calID() > event->calID() ) {
367 retVal = event; 368 retVal = event;
368 } 369 }
369 } else { 370 } else {
370 retVal = event; 371 retVal = event;
371 } 372 }
372 } 373 }
373 } 374 }
374 return retVal; 375 return retVal;
375} 376}
376bool CalendarLocal::addTodoNoDup( Todo *todo ) 377bool CalendarLocal::addTodoNoDup( Todo *todo )
377{ 378{
378 Todo * eve; 379 Todo * eve;
379 for ( eve = mTodoList.first(); eve ; eve = mTodoList.next() ) { 380 for ( eve = mTodoList.first(); eve ; eve = mTodoList.next() ) {
380 if ( *eve == *todo ) { 381 if ( *eve == *todo ) {
381 //qDebug("duplicate todo found! not inserted! "); 382 //qDebug("duplicate todo found! not inserted! ");
382 return false; 383 return false;
383 } 384 }
384 } 385 }
385 return addTodo( todo ); 386 return addTodo( todo );
386} 387}
387bool CalendarLocal::addTodo( Todo *todo ) 388bool CalendarLocal::addTodo( Todo *todo )
388{ 389{
389 mTodoList.append( todo ); 390 mTodoList.append( todo );
390 391
391 todo->registerObserver( this ); 392 todo->registerObserver( this );
392 393
393 // Set up subtask relations 394 // Set up subtask relations
394 setupRelations( todo ); 395 setupRelations( todo );
395 396
396 setModified( true ); 397 setModified( true );
397 if ( todo->calID() == 0 ) 398 if ( todo->calID() == 0 )
398 todo->setCalID( mDefaultCalendar ); 399 todo->setCalID( mDefaultCalendar );
399 todo->setCalEnabled( true ); 400 todo->setCalEnabled( true );
400 return true; 401 return true;
401} 402}
402 403