summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--library/backend/event.cpp6
1 files changed, 3 insertions, 3 deletions
diff --git a/library/backend/event.cpp b/library/backend/event.cpp
index 4c24ab3..90860e8 100644
--- a/library/backend/event.cpp
+++ b/library/backend/event.cpp
@@ -1,1354 +1,1354 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. 2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of the Qtopia Environment. 4** This file is part of the Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20 20
21#include "event.h" 21#include "event.h"
22#include "qfiledirect_p.h" 22#include "qfiledirect_p.h"
23#include <qtopia/timeconversion.h> 23#include <qtopia/timeconversion.h>
24#include <qtopia/stringutil.h> 24#include <qtopia/stringutil.h>
25#include <qtopia/private/recordfields.h> 25#include <qtopia/private/recordfields.h>
26#include <qbuffer.h> 26#include <qbuffer.h>
27#include <time.h> 27#include <time.h>
28#include "vobject_p.h" 28#include "vobject_p.h"
29 29
30#include <stdio.h> 30#include <stdio.h>
31 31
32using namespace Qtopia; 32using namespace Qtopia;
33 33
34static void write( QString& buf, const Event::RepeatPattern &r ) 34static void write( QString& buf, const Event::RepeatPattern &r )
35{ 35{
36 buf += " rtype=\""; 36 buf += " rtype=\"";
37 switch ( r.type ) { 37 switch ( r.type ) {
38 case Event::Daily: 38 case Event::Daily:
39 buf += "Daily"; 39 buf += "Daily";
40 break; 40 break;
41 case Event::Weekly: 41 case Event::Weekly:
42 buf += "Weekly"; 42 buf += "Weekly";
43 break; 43 break;
44 case Event::MonthlyDay: 44 case Event::MonthlyDay:
45 buf += "MonthlyDay"; 45 buf += "MonthlyDay";
46 break; 46 break;
47 case Event::MonthlyDate: 47 case Event::MonthlyDate:
48 buf += "MonthlyDate"; 48 buf += "MonthlyDate";
49 break; 49 break;
50 case Event::Yearly: 50 case Event::Yearly:
51 buf += "Yearly"; 51 buf += "Yearly";
52 break; 52 break;
53 default: 53 default:
54 buf += "NoRepeat"; 54 buf += "NoRepeat";
55 break; 55 break;
56 } 56 }
57 buf += "\""; 57 buf += "\"";
58 if ( r.days > 0 ) 58 if ( r.days > 0 )
59 buf += " rweekdays=\"" + QString::number( static_cast<int>( r.days ) ) + "\""; 59 buf += " rweekdays=\"" + QString::number( static_cast<int>( r.days ) ) + "\"";
60 if ( r.position != 0 ) 60 if ( r.position != 0 )
61 buf += " rposition=\"" + QString::number( r.position ) + "\""; 61 buf += " rposition=\"" + QString::number( r.position ) + "\"";
62 62
63 buf += " rfreq=\"" + QString::number( r.frequency ) + "\""; 63 buf += " rfreq=\"" + QString::number( r.frequency ) + "\"";
64 buf += " rhasenddate=\"" + QString::number( static_cast<int>( r.hasEndDate ) ) + "\""; 64 buf += " rhasenddate=\"" + QString::number( static_cast<int>( r.hasEndDate ) ) + "\"";
65 if ( r.hasEndDate ) 65 if ( r.hasEndDate )
66 buf += " enddt=\"" 66 buf += " enddt=\""
67 + QString::number( r.endDateUTC ? r.endDateUTC : time( 0 ) ) 67 + QString::number( r.endDateUTC ? r.endDateUTC : time( 0 ) )
68 + "\""; 68 + "\"";
69 buf += " created=\"" + QString::number( r.createTime ) + "\""; 69 buf += " created=\"" + QString::number( r.createTime ) + "\"";
70} 70}
71 71
72Qtopia::UidGen Event::sUidGen( Qtopia::UidGen::Qtopia ); 72Qtopia::UidGen Event::sUidGen( Qtopia::UidGen::Qtopia );
73 73
74/*! 74/*!
75 \class Event event.h 75 \class Event event.h
76 \brief The Event class holds the data of a calendar event. 76 \brief The Event class holds the data of a calendar event.
77 77
78 This data includes descriptive data of the event and schedualing information. 78 This data includes descriptive data of the event and schedualing information.
79 79
80 \ingroup qtopiaemb 80 \ingroup qtopiaemb
81 \ingroup qtopiadesktop 81 \ingroup qtopiadesktop
82*/ 82*/
83 83
84/*! 84/*!
85 \class Event::RepeatPattern 85 \class Event::RepeatPattern
86 \class The Event::RepeatPattern class is internal. 86 \class The Event::RepeatPattern class is internal.
87 \internal 87 \internal
88*/ 88*/
89 89
90/*! 90/*!
91 \enum Event::Days 91 \enum Event::Days
92 \internal 92 \internal
93*/ 93*/
94 94
95/*! 95/*!
96 \enum Event::Type 96 \enum Event::Type
97 \internal 97 \internal
98*/ 98*/
99 99
100/*! 100/*!
101 \enum Event::SoundTypeChoice 101 \enum Event::SoundTypeChoice
102 102
103 This enum type defines what kind of sound is made when an alarm occurs 103 This enum type defines what kind of sound is made when an alarm occurs
104 for an event. The currently defined types are: 104 for an event. The currently defined types are:
105 105
106 <ul> 106 <ul>
107 <li>\c Silent - No sound is produced. 107 <li>\c Silent - No sound is produced.
108 <li>\c Loud - A loud sound is produced. 108 <li>\c Loud - A loud sound is produced.
109 </ul> 109 </ul>
110*/ 110*/
111 111
112/*! 112/*!
113 \fn bool Event::operator<( const Event & ) const 113 \fn bool Event::operator<( const Event & ) const
114 \internal 114 \internal
115*/ 115*/
116 116
117/*! 117/*!
118 \fn bool Event::operator<=( const Event & ) const 118 \fn bool Event::operator<=( const Event & ) const
119 \internal 119 \internal
120*/ 120*/
121 121
122/*! 122/*!
123 \fn bool Event::operator!=( const Event & ) const 123 \fn bool Event::operator!=( const Event & ) const
124 \internal 124 \internal
125*/ 125*/
126 126
127/*! 127/*!
128 \fn bool Event::operator>( const Event & ) const 128 \fn bool Event::operator>( const Event & ) const
129 \internal 129 \internal
130*/ 130*/
131 131
132/*! 132/*!
133 \fn bool Event::operator>=( const Event & ) const 133 \fn bool Event::operator>=( const Event & ) const
134 \internal 134 \internal
135*/ 135*/
136 136
137/*! 137/*!
138 \enum Event::RepeatType 138 \enum Event::RepeatType
139 139
140 This enum defines how a event will repeat, if at all. 140 This enum defines how a event will repeat, if at all.
141 141
142 <ul> 142 <ul>
143 <li>\c NoRepeat - Event does not repeat. 143 <li>\c NoRepeat - Event does not repeat.
144 <li>\c Daily - Event occurs every n days. 144 <li>\c Daily - Event occurs every n days.
145 <li>\c Weekly - Event occurs every n weeks. 145 <li>\c Weekly - Event occurs every n weeks.
146 <li>\c MonthlyDay - Event occurs every n months. Event will always occur in 146 <li>\c MonthlyDay - Event occurs every n months. Event will always occur in
147 the same week and same day of week as the first event. 147 the same week and same day of week as the first event.
148 <li>\c MonthlyDate - Event occurs every n months. Event will always occur 148 <li>\c MonthlyDate - Event occurs every n months. Event will always occur
149 on the same day of the month as the first event. 149 on the same day of the month as the first event.
150 <li>\c Yearly - Event occurs every n years. 150 <li>\c Yearly - Event occurs every n years.
151 </ul> 151 </ul>
152*/ 152*/
153 153
154/*! 154/*!
155 \fn bool Event::isAllDay() const 155 \fn bool Event::isAllDay() const
156 156
157 Returns TRUE if the event is an all day event. Otherwise returns FALSE. 157 Returns TRUE if the event is an all day event. Otherwise returns FALSE.
158*/ 158*/
159 159
160/*! 160/*!
161 \fn void Event::setAllDay(bool allday) 161 \fn void Event::setAllDay(bool allday)
162 162
163 If \a allday is TRUE, will set the event to be an all day event. 163 If \a allday is TRUE, will set the event to be an all day event.
164 Otherwise sets the event to not be an all day event. 164 Otherwise sets the event to not be an all day event.
165 165
166 \warning This function may affect the start and end times of the event. 166 \warning This function may affect the start and end times of the event.
167*/ 167*/
168 168
169/*! 169/*!
170 \fn QDateTime Event::start(bool) const 170 \fn QDateTime Event::start(bool) const
171 171
172 Returns the start date and time of the first occurance of the event. 172 Returns the start date and time of the first occurance of the event.
173*/ 173*/
174 174
175/*! 175/*!
176 \fn QDateTime Event::end(bool) const 176 \fn QDateTime Event::end(bool) const
177 177
178 Returns the end date and time of the first occurance of the event. 178 Returns the end date and time of the first occurance of the event.
179*/ 179*/
180 180
181/*! 181/*!
182 \fn time_t Event::startTime() const 182 \fn time_t Event::startTime() const
183 \internal 183 \internal
184*/ 184*/
185 185
186/*! 186/*!
187 \fn time_t Event::endTime() const 187 \fn time_t Event::endTime() const
188 \internal 188 \internal
189*/ 189*/
190 190
191/*! 191/*!
192 \fn void Event::setAlarm(int delay, SoundTypeChoice s) 192 \fn void Event::setAlarm(int delay, SoundTypeChoice s)
193 193
194 Sets the alarm delay of the event to \a delay and the sound type of the 194 Sets the alarm delay of the event to \a delay and the sound type of the
195 alarm to \a s. 195 alarm to \a s.
196*/ 196*/
197 197
198/*! 198/*!
199 \fn void Event::clearAlarm() 199 \fn void Event::clearAlarm()
200 200
201 Clears the alarm for the event. 201 Clears the alarm for the event.
202*/ 202*/
203 203
204/*! 204/*!
205 \fn int Event::alarmDelay() const 205 \fn int Event::alarmDelay() const
206 206
207 Returns the delay in minutes between the alarm for an event and the 207 Returns the delay in minutes between the alarm for an event and the
208 start of the event. 208 start of the event.
209*/ 209*/
210 210
211/*! 211/*!
212 \fn Event::RepeatType Event::repeatType() const 212 \fn Event::RepeatType Event::repeatType() const
213 213
214 Returns the repeat pattern type for the event. 214 Returns the repeat pattern type for the event.
215 215
216 \sa frequency() 216 \sa frequency()
217*/ 217*/
218 218
219/*! 219/*!
220 \fn int Event::weekOffset() const 220 \fn int Event::weekOffset() const
221 221
222 Returns the number of weeks from the start of the month that this event 222 Returns the number of weeks from the start of the month that this event
223 occurs. 223 occurs.
224*/ 224*/
225 225
226/*! 226/*!
227 \fn QDate Event::repeatTill() const 227 \fn QDate Event::repeatTill() const
228 228
229 Returns the date that the event will continue to repeat until. If the event 229 Returns the date that the event will continue to repeat until. If the event
230 repeats forever the value returned is undefined. 230 repeats forever the value returned is undefined.
231 231
232 \sa repeatForever() 232 \sa repeatForever()
233*/ 233*/
234 234
235/*! 235/*!
236 \fn bool Event::repeatForever() const 236 \fn bool Event::repeatForever() const
237 237
238 Returns FALSE if there is a date set for the event to continue until. 238 Returns FALSE if there is a date set for the event to continue until.
239 Otherwise returns TRUE. 239 Otherwise returns TRUE.
240*/ 240*/
241 241
242/*! 242/*!
243 \fn bool Event::doRepeat() const 243 \fn bool Event::doRepeat() const
244 \internal 244 \internal
245*/ 245*/
246 246
247/*! 247/*!
248 \fn bool Event::repeatOnWeekDay(int day) const 248 \fn bool Event::repeatOnWeekDay(int day) const
249 249
250 Returns TRUE if the event has a RepeatType of Weekly and is set to occur on 250 Returns TRUE if the event has a RepeatType of Weekly and is set to occur on
251 \a day each week. Otherwise returns FALSE. 251 \a day each week. Otherwise returns FALSE.
252 252
253 \sa QDate::dayName() 253 \sa QDate::dayName()
254*/ 254*/
255 255
256/*! 256/*!
257 \fn void Event::setRepeatOnWeekDay(int day, bool enable) 257 \fn void Event::setRepeatOnWeekDay(int day, bool enable)
258 258
259 If \a enable is TRUE then sets the event to occur on \a day each week. 259 If \a enable is TRUE then sets the event to occur on \a day each week.
260 Otherwise sets the event not to occur on \a day. 260 Otherwise sets the event not to occur on \a day.
261 261
262 \warning this function is only relavent for a event with RepeatType of 262 \warning this function is only relavent for a event with RepeatType of
263 Weekly. 263 Weekly.
264 264
265 \sa QDate::dayName() 265 \sa QDate::dayName()
266*/ 266*/
267 267
268/*! 268/*!
269 \fn int Event::frequency() const 269 \fn int Event::frequency() const
270 270
271 Returns how often the event repeats. 271 Returns how often the event repeats.
272 272
273 \sa repeatType() 273 \sa repeatType()
274*/ 274*/
275 275
276/*! 276/*!
277 \fn void Event::setRepeatType(RepeatType t) 277 \fn void Event::setRepeatType(RepeatType t)
278 278
279 Sets the repeat pattern type of the event to \a t. 279 Sets the repeat pattern type of the event to \a t.
280 280
281 \sa setFrequency() 281 \sa setFrequency()
282*/ 282*/
283 283
284/*! 284/*!
285 \fn void Event::setFrequency(int n) 285 \fn void Event::setFrequency(int n)
286 286
287 Sets how often the event occurs with in its repeat pattern. 287 Sets how often the event occurs with in its repeat pattern.
288 288
289 \sa setRepeatType() 289 \sa setRepeatType()
290*/ 290*/
291 291
292/*! 292/*!
293 \fn void Event::setRepeatTill(const QDate &d) 293 \fn void Event::setRepeatTill(const QDate &d)
294 294
295 Sets the event to repeat until \a d. 295 Sets the event to repeat until \a d.
296*/ 296*/
297 297
298/*! 298/*!
299 \fn void Event::setRepeatForever(bool enable) 299 \fn void Event::setRepeatForever(bool enable)
300 300
301 If \a enable is TRUE, sets the event to repeat forever. Otherwise 301 If \a enable is TRUE, sets the event to repeat forever. Otherwise
302 sets the event to stop repeating at some date. 302 sets the event to stop repeating at some date.
303 303
304 \warning This function may affect the specific date the event will repeat 304 \warning This function may affect the specific date the event will repeat
305 till. 305 till.
306*/ 306*/
307 307
308/*! 308/*!
309 \fn bool Event::match(const QRegExp &r) const 309 \fn bool Event::match(const QRegExp &r) const
310 310
311 Returns TRUE if the event matches the regular expression \a r. 311 Returns TRUE if the event matches the regular expression \a r.
312 Otherwise returns FALSE. 312 Otherwise returns FALSE.
313*/ 313*/
314 314
315/*! 315/*!
316 \fn char Event::day(int) 316 \fn char Event::day(int)
317 \internal 317 \internal
318*/ 318*/
319 319
320/*! 320/*!
321 Creates a new, empty event. 321 Creates a new, empty event.
322*/ 322*/
323Event::Event() : Record() 323Event::Event() : Record()
324{ 324{
325 startUTC = endUTC = time( 0 ); 325 startUTC = endUTC = time( 0 );
326 typ = Normal; 326 typ = Normal;
327 hAlarm = FALSE; 327 hAlarm = FALSE;
328 hRepeat = FALSE; 328 hRepeat = FALSE;
329 aMinutes = 0; 329 aMinutes = 0;
330 aSound = Silent; 330 aSound = Silent;
331 pattern.type = NoRepeat; 331 pattern.type = NoRepeat;
332 pattern.frequency = -1; 332 pattern.frequency = -1;
333} 333}
334 334
335/*! 335/*!
336 \internal 336 \internal
337*/ 337*/
338Event::Event( const QMap<int, QString> &map ) 338Event::Event( const QMap<int, QString> &map )
339{ 339{
340 setDescription( map[DatebookDescription] ); 340 setDescription( map[DatebookDescription] );
341 setLocation( map[Location] ); 341 setLocation( map[Location] );
342 setCategories( idsFromString( map[DatebookCategory] ) ); 342 setCategories( idsFromString( map[DatebookCategory] ) );
343 setTimeZone( map[TimeZone] ); 343 setTimeZone( map[TimeZone] );
344 setNotes( map[Note] ); 344 setNotes( map[Note] );
345 setStart( TimeConversion::fromUTC( map[StartDateTime].toUInt() ) ); 345 setStart( TimeConversion::fromUTC( map[StartDateTime].toUInt() ) );
346 setEnd( TimeConversion::fromUTC( map[EndDateTime].toUInt() ) ); 346 setEnd( TimeConversion::fromUTC( map[EndDateTime].toUInt() ) );
347 setType( (Event::Type) map[DatebookType].toInt() ); 347 setType( (Event::Type) map[DatebookType].toInt() );
348 setAlarm( ( map[HasAlarm] == "1" ? TRUE : FALSE ), map[AlarmTime].toInt(), (Event::SoundTypeChoice)map[SoundType].toInt() ); 348 setAlarm( ( map[HasAlarm] == "1" ? TRUE : FALSE ), map[AlarmTime].toInt(), (Event::SoundTypeChoice)map[SoundType].toInt() );
349 Event::RepeatPattern p; 349 Event::RepeatPattern p;
350 p.type = (Event::RepeatType) map[ RepeatPatternType ].toInt(); 350 p.type = (Event::RepeatType) map[ RepeatPatternType ].toInt();
351 p.frequency = map[ RepeatPatternFrequency ].toInt(); 351 p.frequency = map[ RepeatPatternFrequency ].toInt();
352 p.position = map[ RepeatPatternPosition ].toInt(); 352 p.position = map[ RepeatPatternPosition ].toInt();
353 p.days = map[ RepeatPatternDays ].toInt(); 353 p.days = map[ RepeatPatternDays ].toInt();
354 p.hasEndDate = map[ RepeatPatternHasEndDate ].toInt(); 354 p.hasEndDate = map[ RepeatPatternHasEndDate ].toInt();
355 p.endDateUTC = map[ RepeatPatternEndDate ].toUInt(); 355 p.endDateUTC = map[ RepeatPatternEndDate ].toUInt();
356 setRepeat( p ); 356 setRepeat( p );
357 357
358 setUid( map[ DatebookUid ].toInt() ); 358 setUid( map[ DatebookUid ].toInt() );
359} 359}
360 360
361/*! 361/*!
362 Destroys an event. 362 Destroys an event.
363*/ 363*/
364Event::~Event() 364Event::~Event()
365{ 365{
366} 366}
367 367
368/*! 368/*!
369 \internal 369 \internal
370*/ 370*/
371int Event::week( const QDate& date ) 371int Event::week( const QDate& date )
372{ 372{
373 // Calculates the week this date is in within that 373 // Calculates the week this date is in within that
374 // month. Equals the "row" is is in in the month view 374 // month. Equals the "row" is is in in the month view
375 int week = 1; 375 int week = 1;
376 QDate tmp( date.year(), date.month(), 1 ); 376 QDate tmp( date.year(), date.month(), 1 );
377 377
378 if ( date.dayOfWeek() < tmp.dayOfWeek() ) 378 if ( date.dayOfWeek() < tmp.dayOfWeek() )
379 ++week; 379 ++week;
380 380
381 week += ( date.day() - 1 ) / 7; 381 week += ( date.day() - 1 ) / 7;
382 return week; 382 return week;
383} 383}
384 384
385/*! 385/*!
386 \internal 386 \internal
387*/ 387*/
388int Event::occurrence( const QDate& date ) 388int Event::occurrence( const QDate& date )
389{ 389{
390 // calculates the number of occurrances of this day of the 390 // calculates the number of occurrances of this day of the
391 // week till the given date (e.g 3rd Wednesday of the month) 391 // week till the given date (e.g 3rd Wednesday of the month)
392 return ( date.day() - 1 ) / 7 + 1; 392 return ( date.day() - 1 ) / 7 + 1;
393} 393}
394 394
395/*! 395/*!
396 \internal 396 \internal
397*/ 397*/
398int Event::dayOfWeek( char day ) 398int Event::dayOfWeek( char day )
399{ 399{
400 int dayOfWeek = 1; 400 int dayOfWeek = 1;
401 char i = Event::MON; 401 char i = Event::MON;
402 while ( !( i & day ) && i <= Event::SUN ) { 402 while ( !( i & day ) && i <= Event::SUN ) {
403 i <<= 1; 403 i <<= 1;
404 ++dayOfWeek; 404 ++dayOfWeek;
405 } 405 }
406 return dayOfWeek; 406 return dayOfWeek;
407} 407}
408 408
409/*! 409/*!
410 \internal 410 \internal
411*/ 411*/
412int Event::monthDiff( const QDate& first, const QDate& second ) 412int Event::monthDiff( const QDate& first, const QDate& second )
413{ 413{
414 return ( second.year() - first.year() ) * 12 + 414 return ( second.year() - first.year() ) * 12 +
415 second.month() - first.month(); 415 second.month() - first.month();
416} 416}
417 417
418/*! 418/*!
419 \internal 419 \internal
420*/ 420*/
421QMap<int, QString> Event::toMap() const 421QMap<int, QString> Event::toMap() const
422{ 422{
423 QMap<int, QString> m; 423 QMap<int, QString> m;
424 424
425 if ( !description().isEmpty() ) 425 if ( !description().isEmpty() )
426 m.insert( DatebookDescription, description() ); 426 m.insert( DatebookDescription, description() );
427 if ( !location().isEmpty() ) 427 if ( !location().isEmpty() )
428 m.insert ( Location, location() ); 428 m.insert ( Location, location() );
429 if ( categories().count() ) 429 if ( categories().count() )
430 m.insert ( DatebookCategory, idsToString( categories() ) ); 430 m.insert ( DatebookCategory, idsToString( categories() ) );
431 if ( !timeZone().isEmpty() ) 431 if ( !timeZone().isEmpty() )
432 m.insert ( TimeZone, timeZone() ); 432 m.insert ( TimeZone, timeZone() );
433 if ( !notes().isEmpty() ) 433 if ( !notes().isEmpty() )
434 m.insert ( Note, notes() ); 434 m.insert ( Note, notes() );
435 435
436 m.insert ( StartDateTime, QString::number( TimeConversion::toUTC( start() ) ) ); 436 m.insert ( StartDateTime, QString::number( TimeConversion::toUTC( start() ) ) );
437 m.insert ( EndDateTime, QString::number( TimeConversion::toUTC( end() ) ) ); 437 m.insert ( EndDateTime, QString::number( TimeConversion::toUTC( end() ) ) );
438 m.insert ( DatebookType, QString::number( (int)type() ) ); 438 m.insert ( DatebookType, QString::number( (int)type() ) );
439 m.insert ( HasAlarm, ( hasAlarm() ? "1" : "0" ) ); 439 m.insert ( HasAlarm, ( hasAlarm() ? "1" : "0" ) );
440 m.insert ( SoundType, QString::number( (int)alarmSound() ) ); 440 m.insert ( SoundType, QString::number( (int)alarmSound() ) );
441 m.insert ( AlarmTime, QString::number( alarmTime() ) ); 441 m.insert ( AlarmTime, QString::number( alarmTime() ) );
442 m.insert ( RepeatPatternType, QString::number( static_cast<int>( repeatPattern().type ) ) ); 442 m.insert ( RepeatPatternType, QString::number( static_cast<int>( repeatPattern().type ) ) );
443 m.insert ( RepeatPatternFrequency, QString::number( repeatPattern().frequency ) ); 443 m.insert ( RepeatPatternFrequency, QString::number( repeatPattern().frequency ) );
444 m.insert ( RepeatPatternPosition, QString::number( repeatPattern().position ) ); 444 m.insert ( RepeatPatternPosition, QString::number( repeatPattern().position ) );
445 m.insert ( RepeatPatternDays, QString::number( repeatPattern().days ) ); 445 m.insert ( RepeatPatternDays, QString::number( repeatPattern().days ) );
446 m.insert ( RepeatPatternHasEndDate, QString::number( static_cast<int>( repeatPattern().hasEndDate ) ) ); 446 m.insert ( RepeatPatternHasEndDate, QString::number( static_cast<int>( repeatPattern().hasEndDate ) ) );
447 m.insert ( RepeatPatternEndDate, QString::number( repeatPattern().endDateUTC ) ); 447 m.insert ( RepeatPatternEndDate, QString::number( repeatPattern().endDateUTC ) );
448 448
449 m.insert( DatebookUid, QString::number( uid()) ); 449 m.insert( DatebookUid, QString::number( uid()) );
450 450
451 return m; 451 return m;
452} 452}
453 453
454/*! 454/*!
455 \internal 455 \internal
456*/ 456*/
457void Event::setRepeat( const RepeatPattern &p ) 457void Event::setRepeat( const RepeatPattern &p )
458{ 458{
459 setRepeat( p.type != NoRepeat, p ); 459 setRepeat( p.type != NoRepeat, p );
460} 460}
461 461
462/*! 462/*!
463 Sets the description of the event to \a s. 463 Sets the description of the event to \a s.
464*/ 464*/
465void Event::setDescription( const QString &s ) 465void Event::setDescription( const QString &s )
466{ 466{
467 descript = s; 467 descript = s;
468} 468}
469 469
470/*! 470/*!
471 Sets the location of the event to \a s. 471 Sets the location of the event to \a s.
472*/ 472*/
473void Event::setLocation( const QString &s ) 473void Event::setLocation( const QString &s )
474{ 474{
475 locat = s; 475 locat = s;
476} 476}
477 477
478// void Event::setCategory( const QString &s ) 478// void Event::setCategory( const QString &s )
479// { 479// {
480// categ = s; 480// categ = s;
481// } 481// }
482 482
483/*! 483/*!
484 \internal 484 \internal
485*/ 485*/
486void Event::setType( Type t ) 486void Event::setType( Type t )
487{ 487{
488 typ = t; 488 typ = t;
489} 489}
490 490
491/*! 491/*!
492 Sets the start date and time of the first or only occurance of this event 492 Sets the start date and time of the first or only occurance of this event
493 to the date and time \a d. \a d should be in local time. 493 to the date and time \a d. \a d should be in local time.
494*/ 494*/
495void Event::setStart( const QDateTime &d ) 495void Event::setStart( const QDateTime &d )
496{ 496{
497 startUTC = TimeConversion::toUTC( d ); 497 startUTC = TimeConversion::toUTC( d );
498} 498}
499 499
500/*! 500/*!
501 \internal 501 \internal
502*/ 502*/
503void Event::setStart( time_t time ) 503void Event::setStart( time_t time )
504{ 504{
505 startUTC = time; 505 startUTC = time;
506} 506}
507 507
508/*! 508/*!
509 Sets the end date and time of the first or only occurance of this event 509 Sets the end date and time of the first or only occurance of this event
510 to the date and time \a d. \a d should be in local time. 510 to the date and time \a d. \a d should be in local time.
511*/ 511*/
512void Event::setEnd( const QDateTime &d ) 512void Event::setEnd( const QDateTime &d )
513{ 513{
514 endUTC = TimeConversion::toUTC( d ); 514 endUTC = TimeConversion::toUTC( d );
515} 515}
516 516
517/*! 517/*!
518 \internal 518 \internal
519*/ 519*/
520void Event::setEnd( time_t time ) 520void Event::setEnd( time_t time )
521{ 521{
522 endUTC = time; 522 endUTC = time;
523} 523}
524 524
525/*! 525/*!
526 \internal 526 \internal
527*/ 527*/
528void Event::setTimeZone( const QString &z ) 528void Event::setTimeZone( const QString &z )
529{ 529{
530 tz = z; 530 tz = z;
531} 531}
532 532
533/*! 533/*!
534 \internal 534 \internal
535*/ 535*/
536void Event::setAlarm( bool b, int minutes, SoundTypeChoice s ) 536void Event::setAlarm( bool b, int minutes, SoundTypeChoice s )
537{ 537{
538 hAlarm = b; 538 hAlarm = b;
539 aMinutes = minutes; 539 aMinutes = minutes;
540 aSound = s; 540 aSound = s;
541} 541}
542 542
543/*! 543/*!
544 \internal 544 \internal
545*/ 545*/
546void Event::setRepeat( bool b, const RepeatPattern &p ) 546void Event::setRepeat( bool b, const RepeatPattern &p )
547{ 547{
548 hRepeat = b; 548 hRepeat = b;
549 pattern = p; 549 pattern = p;
550} 550}
551 551
552/*! 552/*!
553 Sets the notes for the event to \a n. 553 Sets the notes for the event to \a n.
554*/ 554*/
555void Event::setNotes( const QString &n ) 555void Event::setNotes( const QString &n )
556{ 556{
557 note = n; 557 note = n;
558} 558}
559 559
560/*! 560/*!
561 Returns the description of the event. 561 Returns the description of the event.
562*/ 562*/
563const QString &Event::description() const 563const QString &Event::description() const
564{ 564{
565 return descript; 565 return descript;
566} 566}
567 567
568/*! 568/*!
569 Returns the location of the event. 569 Returns the location of the event.
570*/ 570*/
571const QString &Event::location() const 571const QString &Event::location() const
572{ 572{
573 return locat; 573 return locat;
574} 574}
575 575
576// QString Event::category() const 576// QString Event::category() const
577// { 577// {
578// return categ; 578// return categ;
579// } 579// }
580 580
581/*! 581/*!
582 \internal 582 \internal
583*/ 583*/
584Event::Type Event::type() const 584Event::Type Event::type() const
585{ 585{
586 return typ; 586 return typ;
587} 587}
588/* 588/*
589QDateTime Event::start() const { 589QDateTime Event::start() const {
590 return start( TRUE ); 590 return start( TRUE );
591} 591}
592*/ 592*/
593/*! 593/*!
594 \internal 594 \internal
595*/ 595*/
596QDateTime Event::start( bool actual ) const 596QDateTime Event::start( bool actual ) const
597{ 597{
598 QDateTime dt = TimeConversion::fromUTC( startUTC ); 598 QDateTime dt = TimeConversion::fromUTC( startUTC );
599 599
600 if ( actual && typ == AllDay ) { 600 if ( actual && typ == AllDay ) {
601 QTime t = dt.time(); 601 QTime t = dt.time();
602 t.setHMS( 0, 0, 0 ); 602 t.setHMS( 0, 0, 0 );
603 dt.setTime( t ); 603 dt.setTime( t );
604 } 604 }
605 return dt; 605 return dt;
606} 606}
607/* 607/*
608QDateTime Event::end() const { 608QDateTime Event::end() const {
609 return end( TRUE ); 609 return end( TRUE );
610} 610}
611*/ 611*/
612/*! 612/*!
613 \internal 613 \internal
614*/ 614*/
615QDateTime Event::end( bool actual ) const 615QDateTime Event::end( bool actual ) const
616{ 616{
617 /* small work around... */ 617 QDateTime dt = TimeConversion::fromUTC( endUTC );
618 if ( actual && typ == AllDay ) { 618 if ( actual && typ == AllDay ) {
619 return QDateTime( TimeConversion::fromUTC( startUTC ).date(), QTime(23, 59, 59 ) ); 619 dt.setTime( QTime(23,59,59) );
620 } 620 }
621 return TimeConversion::fromUTC( endUTC ); 621 return dt;
622} 622}
623 623
624/*! 624/*!
625 \internal 625 \internal
626*/ 626*/
627const QString &Event::timeZone() const 627const QString &Event::timeZone() const
628{ 628{
629 return tz; 629 return tz;
630} 630}
631 631
632/*! 632/*!
633 \internal 633 \internal
634*/ 634*/
635bool Event::hasAlarm() const 635bool Event::hasAlarm() const
636{ 636{
637 return hAlarm; 637 return hAlarm;
638} 638}
639 639
640/*! 640/*!
641 \internal 641 \internal
642*/ 642*/
643int Event::alarmTime() const 643int Event::alarmTime() const
644{ 644{
645 return aMinutes; 645 return aMinutes;
646} 646}
647 647
648/*! 648/*!
649 Returns the sound type for the alarm of this event. 649 Returns the sound type for the alarm of this event.
650*/ 650*/
651Event::SoundTypeChoice Event::alarmSound() const 651Event::SoundTypeChoice Event::alarmSound() const
652{ 652{
653 return aSound; 653 return aSound;
654} 654}
655 655
656/*! 656/*!
657 \internal 657 \internal
658*/ 658*/
659bool Event::hasRepeat() const 659bool Event::hasRepeat() const
660{ 660{
661 return doRepeat(); 661 return doRepeat();
662} 662}
663 663
664/*! 664/*!
665 \internal 665 \internal
666*/ 666*/
667const Event::RepeatPattern &Event::repeatPattern() const 667const Event::RepeatPattern &Event::repeatPattern() const
668{ 668{
669 return pattern; 669 return pattern;
670} 670}
671 671
672/*! 672/*!
673 \internal 673 \internal
674*/ 674*/
675Event::RepeatPattern &Event::repeatPattern() 675Event::RepeatPattern &Event::repeatPattern()
676{ 676{
677 return pattern; 677 return pattern;
678} 678}
679 679
680/*! 680/*!
681 Returns the notes for the event. 681 Returns the notes for the event.
682*/ 682*/
683const QString &Event::notes() const 683const QString &Event::notes() const
684{ 684{
685 return note; 685 return note;
686} 686}
687 687
688/*! 688/*!
689 \internal 689 \internal
690*/ 690*/
691bool Event::operator==( const Event &e ) const 691bool Event::operator==( const Event &e ) const
692{ 692{
693 if ( uid() && e.uid() == uid() ) 693 if ( uid() && e.uid() == uid() )
694 return TRUE; 694 return TRUE;
695 return ( e.descript == descript && 695 return ( e.descript == descript &&
696 e.locat == locat && 696 e.locat == locat &&
697 e.categ == categ && 697 e.categ == categ &&
698 e.typ == typ && 698 e.typ == typ &&
699 e.startUTC == startUTC && 699 e.startUTC == startUTC &&
700 e.endUTC == endUTC && 700 e.endUTC == endUTC &&
701 e.tz == tz && 701 e.tz == tz &&
702 e.hAlarm == hAlarm && 702 e.hAlarm == hAlarm &&
703 e.aMinutes == aMinutes && 703 e.aMinutes == aMinutes &&
704 e.aSound == aSound && 704 e.aSound == aSound &&
705 e.hRepeat == hRepeat && 705 e.hRepeat == hRepeat &&
706 e.pattern == pattern && 706 e.pattern == pattern &&
707 e.note == note ); 707 e.note == note );
708} 708}
709 709
710/*! 710/*!
711 \internal 711 \internal
712 Appends the contact information to \a buf. 712 Appends the contact information to \a buf.
713*/ 713*/
714void Event::save( QString& buf ) 714void Event::save( QString& buf )
715{ 715{
716 buf += " description=\"" + Qtopia::escapeString(descript) + "\""; 716 buf += " description=\"" + Qtopia::escapeString(descript) + "\"";
717 if ( !locat.isEmpty() ) 717 if ( !locat.isEmpty() )
718 buf += " location=\"" + Qtopia::escapeString(locat) + "\""; 718 buf += " location=\"" + Qtopia::escapeString(locat) + "\"";
719 // save the categoies differently.... 719 // save the categoies differently....
720 QString strCats = idsToString( categories() ); 720 QString strCats = idsToString( categories() );
721 buf += " categories=\"" + Qtopia::escapeString(strCats) + "\""; 721 buf += " categories=\"" + Qtopia::escapeString(strCats) + "\"";
722 buf += " uid=\"" + QString::number( uid() ) + "\""; 722 buf += " uid=\"" + QString::number( uid() ) + "\"";
723 if ( (Type)typ != Normal ) 723 if ( (Type)typ != Normal )
724 buf += " type=\"AllDay\""; 724 buf += " type=\"AllDay\"";
725 if ( hAlarm ) { 725 if ( hAlarm ) {
726 buf += " alarm=\"" + QString::number( aMinutes ) + "\" sound=\""; 726 buf += " alarm=\"" + QString::number( aMinutes ) + "\" sound=\"";
727 if ( aSound == Event::Loud ) 727 if ( aSound == Event::Loud )
728 buf += "loud"; 728 buf += "loud";
729 else 729 else
730 buf += "silent"; 730 buf += "silent";
731 buf += "\""; 731 buf += "\"";
732 } 732 }
733 if ( hRepeat ) 733 if ( hRepeat )
734 write( buf, pattern ); 734 write( buf, pattern );
735 735
736 buf += " start=\"" 736 buf += " start=\""
737 + QString::number( startUTC ) 737 + QString::number( startUTC )
738 + "\""; 738 + "\"";
739 739
740 buf += " end=\"" 740 buf += " end=\""
741 + QString::number( endUTC ) 741 + QString::number( endUTC )
742 + "\""; 742 + "\"";
743 743
744 if ( !note.isEmpty() ) 744 if ( !note.isEmpty() )
745 buf += " note=\"" + Qtopia::escapeString( note ) + "\""; 745 buf += " note=\"" + Qtopia::escapeString( note ) + "\"";
746 buf += customToXml(); 746 buf += customToXml();
747} 747}
748 748
749/*! 749/*!
750 \internal 750 \internal
751*/ 751*/
752bool Event::RepeatPattern::operator==( const Event::RepeatPattern &right ) const 752bool Event::RepeatPattern::operator==( const Event::RepeatPattern &right ) const
753{ 753{
754 // *sigh* 754 // *sigh*
755 return ( type == right.type 755 return ( type == right.type
756 && frequency == right.frequency 756 && frequency == right.frequency
757 && position == right.position 757 && position == right.position
758 && days == right.days 758 && days == right.days
759 && hasEndDate == right.hasEndDate 759 && hasEndDate == right.hasEndDate
760 && endDateUTC == right.endDateUTC 760 && endDateUTC == right.endDateUTC
761 && createTime == right.createTime ); 761 && createTime == right.createTime );
762} 762}
763 763
764/*! 764/*!
765 \class EffectiveEvent 765 \class EffectiveEvent
766 \brief The EffectiveEvent class the data for a single occurance of an event. 766 \brief The EffectiveEvent class the data for a single occurance of an event.
767 767
768 This class describes the event for a single occurance of it. For example if 768 This class describes the event for a single occurance of it. For example if
769 an Event occurs every week, the effective event might represent the third 769 an Event occurs every week, the effective event might represent the third
770 occurance of this Event. 770 occurance of this Event.
771 771
772 \ingroup qtopiaemb 772 \ingroup qtopiaemb
773 \ingroup qtopiadesktop 773 \ingroup qtopiadesktop
774 \warning This class will be phased out in Qtopia 3.x 774 \warning This class will be phased out in Qtopia 3.x
775*/ 775*/
776 776
777/*! 777/*!
778 \enum EffectiveEvent::Position 778 \enum EffectiveEvent::Position
779 \internal 779 \internal
780*/ 780*/
781 781
782/*! 782/*!
783 \fn EffectiveEvent &EffectiveEvent::operator=(const EffectiveEvent &) 783 \fn EffectiveEvent &EffectiveEvent::operator=(const EffectiveEvent &)
784 \internal 784 \internal
785*/ 785*/
786 786
787class EffectiveEventPrivate 787class EffectiveEventPrivate
788{ 788{
789public: 789public:
790 //currently the existence of the d pointer means multi-day repeating, 790 //currently the existence of the d pointer means multi-day repeating,
791 //msut be changed if we use the d pointer for anything else. 791 //msut be changed if we use the d pointer for anything else.
792 QDate startDate; 792 QDate startDate;
793 QDate endDate; 793 QDate endDate;
794}; 794};
795 795
796/*! 796/*!
797 \internal 797 \internal
798*/ 798*/
799EffectiveEvent::EffectiveEvent() 799EffectiveEvent::EffectiveEvent()
800{ 800{
801 mDate = QDate::currentDate(); 801 mDate = QDate::currentDate();
802 mStart = mEnd = QTime::currentTime(); 802 mStart = mEnd = QTime::currentTime();
803 d = 0; 803 d = 0;
804} 804}
805 805
806/*! 806/*!
807 \internal 807 \internal
808*/ 808*/
809EffectiveEvent::EffectiveEvent( const Event &e, const QDate &date, Position pos ) 809EffectiveEvent::EffectiveEvent( const Event &e, const QDate &date, Position pos )
810{ 810{
811 mEvent = e; 811 mEvent = e;
812 mDate = date; 812 mDate = date;
813 if ( pos & Start ) 813 if ( pos & Start )
814 mStart = e.start( TRUE ).time(); 814 mStart = e.start( TRUE ).time();
815 else 815 else
816 mStart = QTime( 0, 0, 0 ); 816 mStart = QTime( 0, 0, 0 );
817 817
818 if ( pos & End ) 818 if ( pos & End )
819 mEnd = e.end( TRUE ).time(); 819 mEnd = e.end( TRUE ).time();
820 else 820 else
821 mEnd = QTime( 23, 59, 59 ); 821 mEnd = QTime( 23, 59, 59 );
822 d = 0; 822 d = 0;
823} 823}
824 824
825/*! 825/*!
826 \internal 826 \internal
827*/ 827*/
828EffectiveEvent::~EffectiveEvent() 828EffectiveEvent::~EffectiveEvent()
829{ 829{
830 delete d; 830 delete d;
831} 831}
832 832
833/*! 833/*!
834 \internal 834 \internal
835*/ 835*/
836EffectiveEvent::EffectiveEvent( const EffectiveEvent &e ) 836EffectiveEvent::EffectiveEvent( const EffectiveEvent &e )
837{ 837{
838 d = 0; 838 d = 0;
839 *this = e; 839 *this = e;
840} 840}
841 841
842EffectiveEvent& EffectiveEvent::operator=( const EffectiveEvent & e ) 842EffectiveEvent& EffectiveEvent::operator=( const EffectiveEvent & e )
843{ 843{
844 if ( &e == this ) 844 if ( &e == this )
845 return *this; 845 return *this;
846 delete d; 846 delete d;
847 if ( e.d ) { 847 if ( e.d ) {
848 d = new EffectiveEventPrivate; 848 d = new EffectiveEventPrivate;
849 d->startDate = e.d->startDate; 849 d->startDate = e.d->startDate;
850 d->endDate = e.d->endDate; 850 d->endDate = e.d->endDate;
851 } else { 851 } else {
852 d = 0; 852 d = 0;
853 } 853 }
854 mEvent = e.mEvent; 854 mEvent = e.mEvent;
855 mDate = e.mDate; 855 mDate = e.mDate;
856 mStart = e.mStart; 856 mStart = e.mStart;
857 mEnd = e.mEnd; 857 mEnd = e.mEnd;
858 858
859 return *this; 859 return *this;
860 860
861} 861}
862 862
863// QString EffectiveEvent::category() const 863// QString EffectiveEvent::category() const
864// { 864// {
865// return mEvent.category(); 865// return mEvent.category();
866// } 866// }
867 867
868/*! 868/*!
869 Returns the description of the event for this effective event. 869 Returns the description of the event for this effective event.
870*/ 870*/
871const QString &EffectiveEvent::description( ) const 871const QString &EffectiveEvent::description( ) const
872{ 872{
873 return mEvent.description(); 873 return mEvent.description();
874} 874}
875 875
876/*! 876/*!
877\internal 877\internal
878*/ 878*/
879const QString &EffectiveEvent::location( ) const 879const QString &EffectiveEvent::location( ) const
880{ 880{
881 return mEvent.location(); 881 return mEvent.location();
882} 882}
883 883
884/*! 884/*!
885\internal 885\internal
886*/ 886*/
887const QString &EffectiveEvent::notes() const 887const QString &EffectiveEvent::notes() const
888{ 888{
889 return mEvent.notes(); 889 return mEvent.notes();
890} 890}
891 891
892/*! 892/*!
893 Returns the event associated with this effective event. 893 Returns the event associated with this effective event.
894*/ 894*/
895const Event &EffectiveEvent::event() const 895const Event &EffectiveEvent::event() const
896{ 896{
897 return mEvent; 897 return mEvent;
898} 898}
899 899
900/*! 900/*!
901 \internal 901 \internal
902*/ 902*/
903const QTime &EffectiveEvent::end() const 903const QTime &EffectiveEvent::end() const
904{ 904{
905 return mEnd; 905 return mEnd;
906} 906}
907 907
908/*! 908/*!
909 \internal 909 \internal
910*/ 910*/
911const QTime &EffectiveEvent::start() const 911const QTime &EffectiveEvent::start() const
912{ 912{
913 return mStart; 913 return mStart;
914} 914}
915 915
916/*! 916/*!
917 Returns the date the effective event occurs on. 917 Returns the date the effective event occurs on.
918*/ 918*/
919const QDate &EffectiveEvent::date() const 919const QDate &EffectiveEvent::date() const
920{ 920{
921 return mDate; 921 return mDate;
922} 922}
923 923
924/*! 924/*!
925 \internal 925 \internal
926*/ 926*/
927int EffectiveEvent::length() const 927int EffectiveEvent::length() const
928{ 928{
929 return (mEnd.hour() * 60 - mStart.hour() * 60) 929 return (mEnd.hour() * 60 - mStart.hour() * 60)
930 + QABS(mStart.minute() - mEnd.minute() ); 930 + QABS(mStart.minute() - mEnd.minute() );
931} 931}
932 932
933/*! 933/*!
934 \internal 934 \internal
935*/ 935*/
936void EffectiveEvent::setDate( const QDate &dt ) 936void EffectiveEvent::setDate( const QDate &dt )
937{ 937{
938 mDate = dt; 938 mDate = dt;
939} 939}
940 940
941/*! 941/*!
942 \internal 942 \internal
943*/ 943*/
944void EffectiveEvent::setStart( const QTime &start ) 944void EffectiveEvent::setStart( const QTime &start )
945{ 945{
946 mStart = start; 946 mStart = start;
947} 947}
948 948
949/*! 949/*!
950 \internal 950 \internal
951*/ 951*/
952void EffectiveEvent::setEnd( const QTime &end ) 952void EffectiveEvent::setEnd( const QTime &end )
953{ 953{
954 mEnd = end; 954 mEnd = end;
955} 955}
956 956
957/*! 957/*!
958 \internal 958 \internal
959*/ 959*/
960void EffectiveEvent::setEvent( Event e ) 960void EffectiveEvent::setEvent( Event e )
961{ 961{
962 mEvent = e; 962 mEvent = e;
963} 963}
964 964
965/*! 965/*!
966 \internal 966 \internal
967*/ 967*/
968bool EffectiveEvent::operator<( const EffectiveEvent &e ) const 968bool EffectiveEvent::operator<( const EffectiveEvent &e ) const
969{ 969{
970 if ( mDate < e.date() ) 970 if ( mDate < e.date() )
971 return TRUE; 971 return TRUE;
972 if ( mDate == e.date() ) 972 if ( mDate == e.date() )
973 return ( mStart < e.start() ); 973 return ( mStart < e.start() );
974 else 974 else
975 return FALSE; 975 return FALSE;
976} 976}
977 977
978/*! 978/*!
979 \internal 979 \internal
980*/ 980*/
981bool EffectiveEvent::operator<=( const EffectiveEvent &e ) const 981bool EffectiveEvent::operator<=( const EffectiveEvent &e ) const
982{ 982{
983 return (mDate <= e.date() ); 983 return (mDate <= e.date() );
984} 984}
985 985
986/*! 986/*!
987 \internal 987 \internal
988*/ 988*/
989bool EffectiveEvent::operator==( const EffectiveEvent &e ) const 989bool EffectiveEvent::operator==( const EffectiveEvent &e ) const
990{ 990{
991 return ( mDate == e.date() 991 return ( mDate == e.date()
992 && mStart == e.start() 992 && mStart == e.start()
993 && mEnd == e.end() 993 && mEnd == e.end()
994 && mEvent == e.event() ); 994 && mEvent == e.event() );
995} 995}
996 996
997/*! 997/*!
998 \internal 998 \internal
999*/ 999*/
1000bool EffectiveEvent::operator!=( const EffectiveEvent &e ) const 1000bool EffectiveEvent::operator!=( const EffectiveEvent &e ) const
1001{ 1001{
1002 return !(*this == e); 1002 return !(*this == e);
1003} 1003}
1004 1004
1005/*! 1005/*!
1006 \internal 1006 \internal
1007*/ 1007*/
1008bool EffectiveEvent::operator>( const EffectiveEvent &e ) const 1008bool EffectiveEvent::operator>( const EffectiveEvent &e ) const
1009{ 1009{
1010 return !(*this <= e ); 1010 return !(*this <= e );
1011} 1011}
1012 1012
1013/*! 1013/*!
1014 \internal 1014 \internal
1015*/ 1015*/
1016bool EffectiveEvent::operator>=(const EffectiveEvent &e) const 1016bool EffectiveEvent::operator>=(const EffectiveEvent &e) const
1017{ 1017{
1018 return !(*this < e); 1018 return !(*this < e);
1019} 1019}
1020 1020
1021/*! 1021/*!
1022 \internal 1022 \internal
1023*/ 1023*/
1024void EffectiveEvent::setEffectiveDates( const QDate &from, const QDate &to ) 1024void EffectiveEvent::setEffectiveDates( const QDate &from, const QDate &to )
1025{ 1025{
1026 if ( !from.isValid() ) { 1026 if ( !from.isValid() ) {
1027 delete d; 1027 delete d;
1028 d = 0; 1028 d = 0;
1029 return; 1029 return;
1030 } 1030 }
1031 if ( !d ) 1031 if ( !d )
1032 d = new EffectiveEventPrivate; 1032 d = new EffectiveEventPrivate;
1033 d->startDate = from; 1033 d->startDate = from;
1034 d->endDate = to; 1034 d->endDate = to;
1035} 1035}
1036 1036
1037/*! 1037/*!
1038 \internal 1038 \internal
1039*/ 1039*/
1040QDate EffectiveEvent::startDate() const 1040QDate EffectiveEvent::startDate() const
1041{ 1041{
1042 if ( d ) 1042 if ( d )
1043 return d->startDate; 1043 return d->startDate;
1044 else if ( mEvent.hasRepeat() ) 1044 else if ( mEvent.hasRepeat() )
1045 return mDate; // single day, since multi-day should have a d pointer 1045 return mDate; // single day, since multi-day should have a d pointer
1046 else 1046 else
1047 return mEvent.start().date(); 1047 return mEvent.start().date();
1048} 1048}
1049 1049
1050/*! 1050/*!
1051 \internal 1051 \internal
1052*/ 1052*/
1053QDate EffectiveEvent::endDate() const 1053QDate EffectiveEvent::endDate() const
1054{ 1054{
1055 if ( d ) 1055 if ( d )
1056 return d->endDate; 1056 return d->endDate;
1057 else if ( mEvent.hasRepeat() ) 1057 else if ( mEvent.hasRepeat() )
1058 return mDate; // single day, since multi-day should have a d pointer 1058 return mDate; // single day, since multi-day should have a d pointer
1059 else 1059 else
1060 return mEvent.end().date(); 1060 return mEvent.end().date();
1061} 1061}
1062 1062
1063/*! 1063/*!
1064 \internal 1064 \internal
1065*/ 1065*/
1066int EffectiveEvent::size() const 1066int EffectiveEvent::size() const
1067{ 1067{
1068 return ( mEnd.hour() - mStart.hour() ) * 3600 1068 return ( mEnd.hour() - mStart.hour() ) * 3600
1069 + (mEnd.minute() - mStart.minute() * 60 1069 + (mEnd.minute() - mStart.minute() * 60
1070 + mEnd.second() - mStart.second() ); 1070 + mEnd.second() - mStart.second() );
1071} 1071}
1072 1072
1073 1073
1074// vcal conversion code 1074// vcal conversion code
1075static inline VObject *safeAddPropValue( VObject *o, const char *prop, const QString &value ) 1075static inline VObject *safeAddPropValue( VObject *o, const char *prop, const QString &value )
1076{ 1076{
1077 VObject *ret = 0; 1077 VObject *ret = 0;
1078 if ( o && !value.isEmpty() ) 1078 if ( o && !value.isEmpty() )
1079 ret = addPropValue( o, prop, value.latin1() ); 1079 ret = addPropValue( o, prop, value.latin1() );
1080 return ret; 1080 return ret;
1081} 1081}
1082 1082
1083static inline VObject *safeAddProp( VObject *o, const char *prop) 1083static inline VObject *safeAddProp( VObject *o, const char *prop)
1084{ 1084{
1085 VObject *ret = 0; 1085 VObject *ret = 0;
1086 if ( o ) 1086 if ( o )
1087 ret = addProp( o, prop ); 1087 ret = addProp( o, prop );
1088 return ret; 1088 return ret;
1089} 1089}
1090 1090
1091/* 1091/*
1092 * Until we support vCal/iCal right 1092 * Until we support vCal/iCal right
1093 * we will make DTSTART and other things 1093 * we will make DTSTART and other things
1094 * be floating in the sense of 1094 * be floating in the sense of
1095 * RFC 2445 1095 * RFC 2445
1096 */ 1096 */
1097namespace { 1097namespace {
1098/* 1098/*
1099 * Convert QDateTime to iso8601 but take 1099 * Convert QDateTime to iso8601 but take
1100 * local time and do not use the Z at the end 1100 * local time and do not use the Z at the end
1101 * 1101 *
1102 */ 1102 */
1103 QCString toISOLocal( const QDateTime& dt ) { 1103 QCString toISOLocal( const QDateTime& dt ) {
1104 QCString str; 1104 QCString str;
1105 /* 1105 /*
1106 * year month day T Hour Minute Second 1106 * year month day T Hour Minute Second
1107 * 4 2 2 2 2 2 digits 1107 * 4 2 2 2 2 2 digits
1108 */ 1108 */
1109 str.sprintf("%04d%02d%02dT%02d%02d%02d", 1109 str.sprintf("%04d%02d%02dT%02d%02d%02d",
1110 dt.date().year(), 1110 dt.date().year(),
1111 dt.date().month(), 1111 dt.date().month(),
1112 dt.date().day(), 1112 dt.date().day(),
1113 dt.time().hour(), 1113 dt.time().hour(),
1114 dt.time().minute(), 1114 dt.time().minute(),
1115 dt.time().second() ); 1115 dt.time().second() );
1116 1116
1117 qWarning("Str ist %s", str.data() ); 1117 qWarning("Str ist %s", str.data() );
1118 1118
1119 return str; 1119 return str;
1120 } 1120 }
1121 1121
1122 1122
1123}; 1123};
1124 1124
1125static VObject *createVObject( const Event &e ) 1125static VObject *createVObject( const Event &e )
1126{ 1126{
1127 VObject *vcal = newVObject( VCCalProp ); 1127 VObject *vcal = newVObject( VCCalProp );
1128 safeAddPropValue( vcal, VCVersionProp, "1.0" ); 1128 safeAddPropValue( vcal, VCVersionProp, "1.0" );
1129 VObject *event = safeAddProp( vcal, VCEventProp ); 1129 VObject *event = safeAddProp( vcal, VCEventProp );
1130 1130
1131 safeAddPropValue( event, VCDTstartProp, toISOLocal( e.start() ) ); 1131 safeAddPropValue( event, VCDTstartProp, toISOLocal( e.start() ) );
1132 safeAddPropValue( event, VCDTendProp, toISOLocal( e.end() ) ); 1132 safeAddPropValue( event, VCDTendProp, toISOLocal( e.end() ) );
1133 safeAddPropValue( event, "X-Qtopia-NOTES", e.description() ); 1133 safeAddPropValue( event, "X-Qtopia-NOTES", e.description() );
1134 safeAddPropValue( event, VCDescriptionProp, e.description() ); 1134 safeAddPropValue( event, VCDescriptionProp, e.description() );
1135 safeAddPropValue( event, VCLocationProp, e.location() ); 1135 safeAddPropValue( event, VCLocationProp, e.location() );
1136 1136
1137 if ( e.hasAlarm() ) { 1137 if ( e.hasAlarm() ) {
1138 VObject *alarm = safeAddProp( event, VCAAlarmProp ); 1138 VObject *alarm = safeAddProp( event, VCAAlarmProp );
1139 QDateTime dt = e.start(); 1139 QDateTime dt = e.start();
1140 dt = dt.addSecs( -e.alarmTime()*60 ); 1140 dt = dt.addSecs( -e.alarmTime()*60 );
1141 safeAddPropValue( alarm, VCRunTimeProp, toISOLocal( dt ) ); 1141 safeAddPropValue( alarm, VCRunTimeProp, toISOLocal( dt ) );
1142 safeAddPropValue( alarm, VCAudioContentProp, 1142 safeAddPropValue( alarm, VCAudioContentProp,
1143 (e.alarmSound() == Event::Silent ? "silent" : "alarm" ) ); 1143 (e.alarmSound() == Event::Silent ? "silent" : "alarm" ) );
1144 } 1144 }
1145 1145
1146 safeAddPropValue( event, "X-Qtopia-TIMEZONE", e.timeZone() ); 1146 safeAddPropValue( event, "X-Qtopia-TIMEZONE", e.timeZone() );
1147 1147
1148 if ( e.type() == Event::AllDay ) 1148 if ( e.type() == Event::AllDay )
1149 safeAddPropValue( event, "X-Qtopia-AllDay", e.timeZone() ); 1149 safeAddPropValue( event, "X-Qtopia-AllDay", e.timeZone() );
1150 1150
1151 // ### repeat missing 1151 // ### repeat missing
1152 1152
1153 // ### categories missing 1153 // ### categories missing
1154 1154
1155 return vcal; 1155 return vcal;
1156} 1156}
1157 1157
1158 1158
1159static Event parseVObject( VObject *obj ) 1159static Event parseVObject( VObject *obj )
1160{ 1160{
1161 Event e; 1161 Event e;
1162 1162
1163 bool haveAlarm = FALSE; 1163 bool haveAlarm = FALSE;
1164 bool haveStart = FALSE; 1164 bool haveStart = FALSE;
1165 bool haveEnd = FALSE; 1165 bool haveEnd = FALSE;
1166 QDateTime alarmTime; 1166 QDateTime alarmTime;
1167 Event::SoundTypeChoice soundType = Event::Silent; 1167 Event::SoundTypeChoice soundType = Event::Silent;
1168 1168
1169 VObjectIterator it; 1169 VObjectIterator it;
1170 initPropIterator( &it, obj ); 1170 initPropIterator( &it, obj );
1171 while( moreIteration( &it ) ) { 1171 while( moreIteration( &it ) ) {
1172 VObject *o = nextVObject( &it ); 1172 VObject *o = nextVObject( &it );
1173 QCString name = vObjectName( o ); 1173 QCString name = vObjectName( o );
1174 QCString value = vObjectStringZValue( o ); 1174 QCString value = vObjectStringZValue( o );
1175 if ( name == VCDTstartProp ) { 1175 if ( name == VCDTstartProp ) {
1176 e.setStart( TimeConversion::fromISO8601( value ) ); 1176 e.setStart( TimeConversion::fromISO8601( value ) );
1177 haveStart = TRUE; 1177 haveStart = TRUE;
1178 } 1178 }
1179 else if ( name == VCDTendProp ) { 1179 else if ( name == VCDTendProp ) {
1180 e.setEnd( TimeConversion::fromISO8601( value ) ); 1180 e.setEnd( TimeConversion::fromISO8601( value ) );
1181 haveEnd = TRUE; 1181 haveEnd = TRUE;
1182 } 1182 }
1183 else if ( name == "X-Qtopia-NOTES" ) { 1183 else if ( name == "X-Qtopia-NOTES" ) {
1184 e.setNotes( value ); 1184 e.setNotes( value );
1185 } 1185 }
1186 else if ( name == VCDescriptionProp ) { 1186 else if ( name == VCDescriptionProp ) {
1187 e.setDescription( value ); 1187 e.setDescription( value );
1188 } 1188 }
1189 else if ( name == VCLocationProp ) { 1189 else if ( name == VCLocationProp ) {
1190 e.setLocation( value ); 1190 e.setLocation( value );
1191 } 1191 }
1192 else if ( name == VCAudioContentProp ) { 1192 else if ( name == VCAudioContentProp ) {
1193 haveAlarm = TRUE; 1193 haveAlarm = TRUE;
1194 VObjectIterator nit; 1194 VObjectIterator nit;
1195 initPropIterator( &nit, o ); 1195 initPropIterator( &nit, o );
1196 while( moreIteration( &nit ) ) { 1196 while( moreIteration( &nit ) ) {
1197 VObject *o = nextVObject( &nit ); 1197 VObject *o = nextVObject( &nit );
1198 QCString name = vObjectName( o ); 1198 QCString name = vObjectName( o );
1199 QCString value = vObjectStringZValue( o ); 1199 QCString value = vObjectStringZValue( o );
1200 if ( name == VCRunTimeProp ) 1200 if ( name == VCRunTimeProp )
1201 alarmTime = TimeConversion::fromISO8601( value ); 1201 alarmTime = TimeConversion::fromISO8601( value );
1202 else if ( name == VCAudioContentProp ) { 1202 else if ( name == VCAudioContentProp ) {
1203 if ( value == "silent" ) 1203 if ( value == "silent" )
1204 soundType = Event::Silent; 1204 soundType = Event::Silent;
1205 else 1205 else
1206 soundType = Event::Loud; 1206 soundType = Event::Loud;
1207 } 1207 }
1208 } 1208 }
1209 } 1209 }
1210 else if ( name == "X-Qtopia-TIMEZONE") { 1210 else if ( name == "X-Qtopia-TIMEZONE") {
1211 e.setTimeZone( value ); 1211 e.setTimeZone( value );
1212 } 1212 }
1213 else if ( name == "X-Qtopia-AllDay" ) { 1213 else if ( name == "X-Qtopia-AllDay" ) {
1214 e.setType( Event::AllDay ); 1214 e.setType( Event::AllDay );
1215 } 1215 }
1216#if 0 1216#if 0
1217 else { 1217 else {
1218 printf("Name: %s, value=%s\n", name.data(), vObjectStringZValue( o ) ); 1218 printf("Name: %s, value=%s\n", name.data(), vObjectStringZValue( o ) );
1219 VObjectIterator nit; 1219 VObjectIterator nit;
1220 initPropIterator( &nit, o ); 1220 initPropIterator( &nit, o );
1221 while( moreIteration( &nit ) ) { 1221 while( moreIteration( &nit ) ) {
1222 VObject *o = nextVObject( &nit ); 1222 VObject *o = nextVObject( &nit );
1223 QCString name = vObjectName( o ); 1223 QCString name = vObjectName( o );
1224 QString value = vObjectStringZValue( o ); 1224 QString value = vObjectStringZValue( o );
1225 printf(" subprop: %s = %s\n", name.data(), value.latin1() ); 1225 printf(" subprop: %s = %s\n", name.data(), value.latin1() );
1226 } 1226 }
1227 } 1227 }
1228#endif 1228#endif
1229 } 1229 }
1230 1230
1231 if ( !haveStart && !haveEnd ) 1231 if ( !haveStart && !haveEnd )
1232 e.setStart( QDateTime::currentDateTime() ); 1232 e.setStart( QDateTime::currentDateTime() );
1233 1233
1234 if ( !haveEnd ) { 1234 if ( !haveEnd ) {
1235 e.setType( Event::AllDay ); 1235 e.setType( Event::AllDay );
1236 e.setEnd( e.start() ); 1236 e.setEnd( e.start() );
1237 } 1237 }
1238 1238
1239 if ( haveAlarm ) { 1239 if ( haveAlarm ) {
1240 int minutes = alarmTime.secsTo( e.start() ) / 60; 1240 int minutes = alarmTime.secsTo( e.start() ) / 60;
1241 e.setAlarm( TRUE, minutes, soundType ); 1241 e.setAlarm( TRUE, minutes, soundType );
1242 } 1242 }
1243 return e; 1243 return e;
1244} 1244}
1245 1245
1246 1246
1247/*! 1247/*!
1248 Writes the list of \a events as a set of VCards to the file \a filename. 1248 Writes the list of \a events as a set of VCards to the file \a filename.
1249*/ 1249*/
1250void Event::writeVCalendar( const QString &filename, const QValueList<Event> &events) 1250void Event::writeVCalendar( const QString &filename, const QValueList<Event> &events)
1251{ 1251{
1252 1252
1253 QFileDirect f( filename.utf8().data() ); 1253 QFileDirect f( filename.utf8().data() );
1254 1254
1255 if ( !f.open( IO_WriteOnly ) ) { 1255 if ( !f.open( IO_WriteOnly ) ) {
1256 1256
1257 qWarning("Unable to open vcard write"); 1257 qWarning("Unable to open vcard write");
1258 1258
1259 return; 1259 return;
1260 1260
1261 } 1261 }
1262 1262
1263 1263
1264 QValueList<Event>::ConstIterator it; 1264 QValueList<Event>::ConstIterator it;
1265 for( it = events.begin(); it != events.end(); ++it ) { 1265 for( it = events.begin(); it != events.end(); ++it ) {
1266 VObject *obj = createVObject( *it ); 1266 VObject *obj = createVObject( *it );
1267 writeVObject( f.directHandle() , obj ); 1267 writeVObject( f.directHandle() , obj );
1268 cleanVObject( obj ); 1268 cleanVObject( obj );
1269 } 1269 }
1270 1270
1271 1271
1272 cleanStrTbl(); 1272 cleanStrTbl();
1273} 1273}
1274 1274
1275/*! 1275/*!
1276 Writes \a event as a VCard to the file \a filename. 1276 Writes \a event as a VCard to the file \a filename.
1277*/ 1277*/
1278void Event::writeVCalendar( const QString &filename, const Event &event) 1278void Event::writeVCalendar( const QString &filename, const Event &event)
1279{ 1279{
1280 1280
1281 QFileDirect f( filename.utf8().data() ); 1281 QFileDirect f( filename.utf8().data() );
1282 1282
1283 if ( !f.open( IO_WriteOnly ) ) { 1283 if ( !f.open( IO_WriteOnly ) ) {
1284 1284
1285 qWarning("Unable to open vcard write"); 1285 qWarning("Unable to open vcard write");
1286 1286
1287 return; 1287 return;
1288 1288
1289 } 1289 }
1290 1290
1291 1291
1292 VObject *obj = createVObject( event ); 1292 VObject *obj = createVObject( event );
1293 writeVObject( f.directHandle() , obj ); 1293 writeVObject( f.directHandle() , obj );
1294 cleanVObject( obj ); 1294 cleanVObject( obj );
1295 1295
1296 cleanStrTbl(); 1296 cleanStrTbl();
1297} 1297}
1298 1298
1299/*! 1299/*!
1300 Returns the set of events read as VCards from the file \a filename. 1300 Returns the set of events read as VCards from the file \a filename.
1301*/ 1301*/
1302QValueList<Event> Event::readVCalendar( const QString &filename ) 1302QValueList<Event> Event::readVCalendar( const QString &filename )
1303{ 1303{
1304 VObject *obj = Parse_MIME_FromFileName( (char *)filename.utf8().data() ); 1304 VObject *obj = Parse_MIME_FromFileName( (char *)filename.utf8().data() );
1305 1305
1306 QValueList<Event> events; 1306 QValueList<Event> events;
1307 1307
1308 while ( obj ) { 1308 while ( obj ) {
1309 QCString name = vObjectName( obj ); 1309 QCString name = vObjectName( obj );
1310 if ( name == VCCalProp ) { 1310 if ( name == VCCalProp ) {
1311 VObjectIterator nit; 1311 VObjectIterator nit;
1312 initPropIterator( &nit, obj ); 1312 initPropIterator( &nit, obj );
1313 while( moreIteration( &nit ) ) { 1313 while( moreIteration( &nit ) ) {
1314 VObject *o = nextVObject( &nit ); 1314 VObject *o = nextVObject( &nit );
1315 QCString name = vObjectName( o ); 1315 QCString name = vObjectName( o );
1316 if ( name == VCEventProp ) 1316 if ( name == VCEventProp )
1317 events.append( parseVObject( o ) ); 1317 events.append( parseVObject( o ) );
1318 } 1318 }
1319 } else if ( name == VCEventProp ) { 1319 } else if ( name == VCEventProp ) {
1320 // shouldn't happen, but just to be sure 1320 // shouldn't happen, but just to be sure
1321 events.append( parseVObject( obj ) ); 1321 events.append( parseVObject( obj ) );
1322 } 1322 }
1323 VObject *t = obj; 1323 VObject *t = obj;
1324 obj = nextVObjectInList(obj); 1324 obj = nextVObjectInList(obj);
1325 cleanVObject( t ); 1325 cleanVObject( t );
1326 } 1326 }
1327 1327
1328 return events; 1328 return events;
1329} 1329}
1330 1330
1331bool Event::match( const QRegExp &r ) const 1331bool Event::match( const QRegExp &r ) const
1332{ 1332{
1333 bool returnMe; 1333 bool returnMe;
1334 returnMe = false; 1334 returnMe = false;
1335 1335
1336 if ( descript.find( r ) > -1 ) 1336 if ( descript.find( r ) > -1 )
1337 returnMe = true; 1337 returnMe = true;
1338 else if ( locat.find( r ) > -1 ) 1338 else if ( locat.find( r ) > -1 )
1339 returnMe = true; 1339 returnMe = true;
1340 else if ( TimeConversion::fromUTC( startUTC ).toString().find( r ) > -1 ) 1340 else if ( TimeConversion::fromUTC( startUTC ).toString().find( r ) > -1 )
1341 returnMe = true; 1341 returnMe = true;
1342 else if ( TimeConversion::fromUTC( endUTC ).toString().find( r ) > -1 ) 1342 else if ( TimeConversion::fromUTC( endUTC ).toString().find( r ) > -1 )
1343 returnMe = true; 1343 returnMe = true;
1344 else if ( tz.find( r ) > -1 ) 1344 else if ( tz.find( r ) > -1 )
1345 returnMe = true; 1345 returnMe = true;
1346 else if ( note.find( r ) > -1 ) 1346 else if ( note.find( r ) > -1 )
1347 returnMe = true; 1347 returnMe = true;
1348 else if ( doRepeat() ) { 1348 else if ( doRepeat() ) {
1349 if ( pattern.hasEndDate ) 1349 if ( pattern.hasEndDate )
1350 if ( TimeConversion::fromUTC( pattern.endDateUTC ).toString().find(r) > -1 ) 1350 if ( TimeConversion::fromUTC( pattern.endDateUTC ).toString().find(r) > -1 )
1351 returnMe = true; 1351 returnMe = true;
1352 } 1352 }
1353 return returnMe; 1353 return returnMe;
1354} 1354}