author | zecke <zecke> | 2003-02-21 11:35:52 (UTC) |
---|---|---|
committer | zecke <zecke> | 2003-02-21 11:35:52 (UTC) |
commit | 6917879c47d406b6f4ee234f84b89e17265dd0a5 (patch) (unidiff) | |
tree | 8d30ebd64d302cf3e7237154dff7939f2f2aa425 /library/backend | |
parent | 2d77abb5ff37abf61e04657431d7e0e1f5138d94 (diff) | |
download | opie-6917879c47d406b6f4ee234f84b89e17265dd0a5.zip opie-6917879c47d406b6f4ee234f84b89e17265dd0a5.tar.gz opie-6917879c47d406b6f4ee234f84b89e17265dd0a5.tar.bz2 |
make allday events all bit less fscked up...
Basicly an AllDay Event should be pinned to a day
but Qtopia suffers from a problem when changing
timezones an AllDay event can span two days...
This patch make it at least not span two days..
-rw-r--r-- | library/backend/event.cpp | 9 |
1 files changed, 3 insertions, 6 deletions
diff --git a/library/backend/event.cpp b/library/backend/event.cpp index 0003fe9..d906f19 100644 --- a/library/backend/event.cpp +++ b/library/backend/event.cpp | |||
@@ -1,1357 +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 | ||
32 | using namespace Qtopia; | 32 | using namespace Qtopia; |
33 | 33 | ||
34 | static void write( QString& buf, const Event::RepeatPattern &r ) | 34 | static 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 | ||
72 | Qtopia::UidGen Event::sUidGen( Qtopia::UidGen::Qtopia ); | 72 | Qtopia::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() const | 170 | \fn QDateTime Event::start() 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() const | 176 | \fn QDateTime Event::end() 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 | */ |
323 | Event::Event() : Record() | 323 | Event::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 | */ |
338 | Event::Event( const QMap<int, QString> &map ) | 338 | Event::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 | */ |
364 | Event::~Event() | 364 | Event::~Event() |
365 | { | 365 | { |
366 | } | 366 | } |
367 | 367 | ||
368 | /*! | 368 | /*! |
369 | \internal | 369 | \internal |
370 | */ | 370 | */ |
371 | int Event::week( const QDate& date ) | 371 | int 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 | */ |
388 | int Event::occurrence( const QDate& date ) | 388 | int 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 | */ |
398 | int Event::dayOfWeek( char day ) | 398 | int 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 | */ |
412 | int Event::monthDiff( const QDate& first, const QDate& second ) | 412 | int 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 | */ |
421 | QMap<int, QString> Event::toMap() const | 421 | QMap<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 | */ |
457 | void Event::setRepeat( const RepeatPattern &p ) | 457 | void 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 | */ |
465 | void Event::setDescription( const QString &s ) | 465 | void 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 | */ |
473 | void Event::setLocation( const QString &s ) | 473 | void 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 | */ |
486 | void Event::setType( Type t ) | 486 | void 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 | */ |
495 | void Event::setStart( const QDateTime &d ) | 495 | void 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 | */ |
503 | void Event::setStart( time_t time ) | 503 | void 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 | */ |
512 | void Event::setEnd( const QDateTime &d ) | 512 | void 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 | */ |
520 | void Event::setEnd( time_t time ) | 520 | void 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 | */ |
528 | void Event::setTimeZone( const QString &z ) | 528 | void 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 | */ |
536 | void Event::setAlarm( bool b, int minutes, SoundTypeChoice s ) | 536 | void 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 | */ |
546 | void Event::setRepeat( bool b, const RepeatPattern &p ) | 546 | void 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 | */ |
555 | void Event::setNotes( const QString &n ) | 555 | void 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 | */ |
563 | const QString &Event::description() const | 563 | const 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 | */ |
571 | const QString &Event::location() const | 571 | const 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 | */ |
584 | Event::Type Event::type() const | 584 | Event::Type Event::type() const |
585 | { | 585 | { |
586 | return typ; | 586 | return typ; |
587 | } | 587 | } |
588 | /* | 588 | /* |
589 | QDateTime Event::start() const { | 589 | QDateTime Event::start() const { |
590 | return start( TRUE ); | 590 | return start( TRUE ); |
591 | } | 591 | } |
592 | */ | 592 | */ |
593 | /*! | 593 | /*! |
594 | \internal | 594 | \internal |
595 | */ | 595 | */ |
596 | QDateTime Event::start( bool actual ) const | 596 | QDateTime 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 | /* |
608 | QDateTime Event::end() const { | 608 | QDateTime Event::end() const { |
609 | return end( TRUE ); | 609 | return end( TRUE ); |
610 | } | 610 | } |
611 | */ | 611 | */ |
612 | /*! | 612 | /*! |
613 | \internal | 613 | \internal |
614 | */ | 614 | */ |
615 | QDateTime Event::end( bool actual ) const | 615 | QDateTime Event::end( bool actual ) const |
616 | { | 616 | { |
617 | QDateTime dt = TimeConversion::fromUTC( endUTC ); | 617 | /* small work around... */ |
618 | |||
619 | if ( actual && typ == AllDay ) { | 618 | if ( actual && typ == AllDay ) { |
620 | QTime t = dt.time(); | 619 | return QDateTime( TimeConversion::fromUTC( startUTC ).date(), QTime(23, 59, 59 ) ); |
621 | t.setHMS( 23, 59, 59 ); | ||
622 | dt.setTime( t ); | ||
623 | } | 620 | } |
624 | return dt; | 621 | return TimeConversion::fromUTC( endUTC ); |
625 | } | 622 | } |
626 | 623 | ||
627 | /*! | 624 | /*! |
628 | \internal | 625 | \internal |
629 | */ | 626 | */ |
630 | const QString &Event::timeZone() const | 627 | const QString &Event::timeZone() const |
631 | { | 628 | { |
632 | return tz; | 629 | return tz; |
633 | } | 630 | } |
634 | 631 | ||
635 | /*! | 632 | /*! |
636 | \internal | 633 | \internal |
637 | */ | 634 | */ |
638 | bool Event::hasAlarm() const | 635 | bool Event::hasAlarm() const |
639 | { | 636 | { |
640 | return hAlarm; | 637 | return hAlarm; |
641 | } | 638 | } |
642 | 639 | ||
643 | /*! | 640 | /*! |
644 | \internal | 641 | \internal |
645 | */ | 642 | */ |
646 | int Event::alarmTime() const | 643 | int Event::alarmTime() const |
647 | { | 644 | { |
648 | return aMinutes; | 645 | return aMinutes; |
649 | } | 646 | } |
650 | 647 | ||
651 | /*! | 648 | /*! |
652 | Returns the sound type for the alarm of this event. | 649 | Returns the sound type for the alarm of this event. |
653 | */ | 650 | */ |
654 | Event::SoundTypeChoice Event::alarmSound() const | 651 | Event::SoundTypeChoice Event::alarmSound() const |
655 | { | 652 | { |
656 | return aSound; | 653 | return aSound; |
657 | } | 654 | } |
658 | 655 | ||
659 | /*! | 656 | /*! |
660 | \internal | 657 | \internal |
661 | */ | 658 | */ |
662 | bool Event::hasRepeat() const | 659 | bool Event::hasRepeat() const |
663 | { | 660 | { |
664 | return doRepeat(); | 661 | return doRepeat(); |
665 | } | 662 | } |
666 | 663 | ||
667 | /*! | 664 | /*! |
668 | \internal | 665 | \internal |
669 | */ | 666 | */ |
670 | const Event::RepeatPattern &Event::repeatPattern() const | 667 | const Event::RepeatPattern &Event::repeatPattern() const |
671 | { | 668 | { |
672 | return pattern; | 669 | return pattern; |
673 | } | 670 | } |
674 | 671 | ||
675 | /*! | 672 | /*! |
676 | \internal | 673 | \internal |
677 | */ | 674 | */ |
678 | Event::RepeatPattern &Event::repeatPattern() | 675 | Event::RepeatPattern &Event::repeatPattern() |
679 | { | 676 | { |
680 | return pattern; | 677 | return pattern; |
681 | } | 678 | } |
682 | 679 | ||
683 | /*! | 680 | /*! |
684 | Returns the notes for the event. | 681 | Returns the notes for the event. |
685 | */ | 682 | */ |
686 | const QString &Event::notes() const | 683 | const QString &Event::notes() const |
687 | { | 684 | { |
688 | return note; | 685 | return note; |
689 | } | 686 | } |
690 | 687 | ||
691 | /*! | 688 | /*! |
692 | \internal | 689 | \internal |
693 | */ | 690 | */ |
694 | bool Event::operator==( const Event &e ) const | 691 | bool Event::operator==( const Event &e ) const |
695 | { | 692 | { |
696 | if ( uid() && e.uid() == uid() ) | 693 | if ( uid() && e.uid() == uid() ) |
697 | return TRUE; | 694 | return TRUE; |
698 | return ( e.descript == descript && | 695 | return ( e.descript == descript && |
699 | e.locat == locat && | 696 | e.locat == locat && |
700 | e.categ == categ && | 697 | e.categ == categ && |
701 | e.typ == typ && | 698 | e.typ == typ && |
702 | e.startUTC == startUTC && | 699 | e.startUTC == startUTC && |
703 | e.endUTC == endUTC && | 700 | e.endUTC == endUTC && |
704 | e.tz == tz && | 701 | e.tz == tz && |
705 | e.hAlarm == hAlarm && | 702 | e.hAlarm == hAlarm && |
706 | e.aMinutes == aMinutes && | 703 | e.aMinutes == aMinutes && |
707 | e.aSound == aSound && | 704 | e.aSound == aSound && |
708 | e.hRepeat == hRepeat && | 705 | e.hRepeat == hRepeat && |
709 | e.pattern == pattern && | 706 | e.pattern == pattern && |
710 | e.note == note ); | 707 | e.note == note ); |
711 | } | 708 | } |
712 | 709 | ||
713 | /*! | 710 | /*! |
714 | \internal | 711 | \internal |
715 | Appends the contact information to \a buf. | 712 | Appends the contact information to \a buf. |
716 | */ | 713 | */ |
717 | void Event::save( QString& buf ) | 714 | void Event::save( QString& buf ) |
718 | { | 715 | { |
719 | buf += " description=\"" + Qtopia::escapeString(descript) + "\""; | 716 | buf += " description=\"" + Qtopia::escapeString(descript) + "\""; |
720 | if ( !locat.isEmpty() ) | 717 | if ( !locat.isEmpty() ) |
721 | buf += " location=\"" + Qtopia::escapeString(locat) + "\""; | 718 | buf += " location=\"" + Qtopia::escapeString(locat) + "\""; |
722 | // save the categoies differently.... | 719 | // save the categoies differently.... |
723 | QString strCats = idsToString( categories() ); | 720 | QString strCats = idsToString( categories() ); |
724 | buf += " categories=\"" + Qtopia::escapeString(strCats) + "\""; | 721 | buf += " categories=\"" + Qtopia::escapeString(strCats) + "\""; |
725 | buf += " uid=\"" + QString::number( uid() ) + "\""; | 722 | buf += " uid=\"" + QString::number( uid() ) + "\""; |
726 | if ( (Type)typ != Normal ) | 723 | if ( (Type)typ != Normal ) |
727 | buf += " type=\"AllDay\""; | 724 | buf += " type=\"AllDay\""; |
728 | if ( hAlarm ) { | 725 | if ( hAlarm ) { |
729 | buf += " alarm=\"" + QString::number( aMinutes ) + "\" sound=\""; | 726 | buf += " alarm=\"" + QString::number( aMinutes ) + "\" sound=\""; |
730 | if ( aSound == Event::Loud ) | 727 | if ( aSound == Event::Loud ) |
731 | buf += "loud"; | 728 | buf += "loud"; |
732 | else | 729 | else |
733 | buf += "silent"; | 730 | buf += "silent"; |
734 | buf += "\""; | 731 | buf += "\""; |
735 | } | 732 | } |
736 | if ( hRepeat ) | 733 | if ( hRepeat ) |
737 | write( buf, pattern ); | 734 | write( buf, pattern ); |
738 | 735 | ||
739 | buf += " start=\"" | 736 | buf += " start=\"" |
740 | + QString::number( startUTC ) | 737 | + QString::number( startUTC ) |
741 | + "\""; | 738 | + "\""; |
742 | 739 | ||
743 | buf += " end=\"" | 740 | buf += " end=\"" |
744 | + QString::number( endUTC ) | 741 | + QString::number( endUTC ) |
745 | + "\""; | 742 | + "\""; |
746 | 743 | ||
747 | if ( !note.isEmpty() ) | 744 | if ( !note.isEmpty() ) |
748 | buf += " note=\"" + Qtopia::escapeString( note ) + "\""; | 745 | buf += " note=\"" + Qtopia::escapeString( note ) + "\""; |
749 | buf += customToXml(); | 746 | buf += customToXml(); |
750 | } | 747 | } |
751 | 748 | ||
752 | /*! | 749 | /*! |
753 | \internal | 750 | \internal |
754 | */ | 751 | */ |
755 | bool Event::RepeatPattern::operator==( const Event::RepeatPattern &right ) const | 752 | bool Event::RepeatPattern::operator==( const Event::RepeatPattern &right ) const |
756 | { | 753 | { |
757 | // *sigh* | 754 | // *sigh* |
758 | return ( type == right.type | 755 | return ( type == right.type |
759 | && frequency == right.frequency | 756 | && frequency == right.frequency |
760 | && position == right.position | 757 | && position == right.position |
761 | && days == right.days | 758 | && days == right.days |
762 | && hasEndDate == right.hasEndDate | 759 | && hasEndDate == right.hasEndDate |
763 | && endDateUTC == right.endDateUTC | 760 | && endDateUTC == right.endDateUTC |
764 | && createTime == right.createTime ); | 761 | && createTime == right.createTime ); |
765 | } | 762 | } |
766 | 763 | ||
767 | /*! | 764 | /*! |
768 | \class EffectiveEvent | 765 | \class EffectiveEvent |
769 | \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. |
770 | 767 | ||
771 | 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 |
772 | 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 |
773 | occurance of this Event. | 770 | occurance of this Event. |
774 | 771 | ||
775 | \ingroup qtopiaemb | 772 | \ingroup qtopiaemb |
776 | \ingroup qtopiadesktop | 773 | \ingroup qtopiadesktop |
777 | \warning This class will be phased out in Qtopia 3.x | 774 | \warning This class will be phased out in Qtopia 3.x |
778 | */ | 775 | */ |
779 | 776 | ||
780 | /*! | 777 | /*! |
781 | \enum EffectiveEvent::Position | 778 | \enum EffectiveEvent::Position |
782 | \internal | 779 | \internal |
783 | */ | 780 | */ |
784 | 781 | ||
785 | /*! | 782 | /*! |
786 | \fn EffectiveEvent &EffectiveEvent::operator=(const EffectiveEvent &) | 783 | \fn EffectiveEvent &EffectiveEvent::operator=(const EffectiveEvent &) |
787 | \internal | 784 | \internal |
788 | */ | 785 | */ |
789 | 786 | ||
790 | class EffectiveEventPrivate | 787 | class EffectiveEventPrivate |
791 | { | 788 | { |
792 | public: | 789 | public: |
793 | //currently the existence of the d pointer means multi-day repeating, | 790 | //currently the existence of the d pointer means multi-day repeating, |
794 | //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. |
795 | QDate startDate; | 792 | QDate startDate; |
796 | QDate endDate; | 793 | QDate endDate; |
797 | }; | 794 | }; |
798 | 795 | ||
799 | /*! | 796 | /*! |
800 | \internal | 797 | \internal |
801 | */ | 798 | */ |
802 | EffectiveEvent::EffectiveEvent() | 799 | EffectiveEvent::EffectiveEvent() |
803 | { | 800 | { |
804 | mDate = QDate::currentDate(); | 801 | mDate = QDate::currentDate(); |
805 | mStart = mEnd = QTime::currentTime(); | 802 | mStart = mEnd = QTime::currentTime(); |
806 | d = 0; | 803 | d = 0; |
807 | } | 804 | } |
808 | 805 | ||
809 | /*! | 806 | /*! |
810 | \internal | 807 | \internal |
811 | */ | 808 | */ |
812 | EffectiveEvent::EffectiveEvent( const Event &e, const QDate &date, Position pos ) | 809 | EffectiveEvent::EffectiveEvent( const Event &e, const QDate &date, Position pos ) |
813 | { | 810 | { |
814 | mEvent = e; | 811 | mEvent = e; |
815 | mDate = date; | 812 | mDate = date; |
816 | if ( pos & Start ) | 813 | if ( pos & Start ) |
817 | mStart = e.start( TRUE ).time(); | 814 | mStart = e.start( TRUE ).time(); |
818 | else | 815 | else |
819 | mStart = QTime( 0, 0, 0 ); | 816 | mStart = QTime( 0, 0, 0 ); |
820 | 817 | ||
821 | if ( pos & End ) | 818 | if ( pos & End ) |
822 | mEnd = e.end( TRUE ).time(); | 819 | mEnd = e.end( TRUE ).time(); |
823 | else | 820 | else |
824 | mEnd = QTime( 23, 59, 59 ); | 821 | mEnd = QTime( 23, 59, 59 ); |
825 | d = 0; | 822 | d = 0; |
826 | } | 823 | } |
827 | 824 | ||
828 | /*! | 825 | /*! |
829 | \internal | 826 | \internal |
830 | */ | 827 | */ |
831 | EffectiveEvent::~EffectiveEvent() | 828 | EffectiveEvent::~EffectiveEvent() |
832 | { | 829 | { |
833 | delete d; | 830 | delete d; |
834 | } | 831 | } |
835 | 832 | ||
836 | /*! | 833 | /*! |
837 | \internal | 834 | \internal |
838 | */ | 835 | */ |
839 | EffectiveEvent::EffectiveEvent( const EffectiveEvent &e ) | 836 | EffectiveEvent::EffectiveEvent( const EffectiveEvent &e ) |
840 | { | 837 | { |
841 | d = 0; | 838 | d = 0; |
842 | *this = e; | 839 | *this = e; |
843 | } | 840 | } |
844 | 841 | ||
845 | EffectiveEvent& EffectiveEvent::operator=( const EffectiveEvent & e ) | 842 | EffectiveEvent& EffectiveEvent::operator=( const EffectiveEvent & e ) |
846 | { | 843 | { |
847 | if ( &e == this ) | 844 | if ( &e == this ) |
848 | return *this; | 845 | return *this; |
849 | delete d; | 846 | delete d; |
850 | if ( e.d ) { | 847 | if ( e.d ) { |
851 | d = new EffectiveEventPrivate; | 848 | d = new EffectiveEventPrivate; |
852 | d->startDate = e.d->startDate; | 849 | d->startDate = e.d->startDate; |
853 | d->endDate = e.d->endDate; | 850 | d->endDate = e.d->endDate; |
854 | } else { | 851 | } else { |
855 | d = 0; | 852 | d = 0; |
856 | } | 853 | } |
857 | mEvent = e.mEvent; | 854 | mEvent = e.mEvent; |
858 | mDate = e.mDate; | 855 | mDate = e.mDate; |
859 | mStart = e.mStart; | 856 | mStart = e.mStart; |
860 | mEnd = e.mEnd; | 857 | mEnd = e.mEnd; |
861 | 858 | ||
862 | return *this; | 859 | return *this; |
863 | 860 | ||
864 | } | 861 | } |
865 | 862 | ||
866 | // QString EffectiveEvent::category() const | 863 | // QString EffectiveEvent::category() const |
867 | // { | 864 | // { |
868 | // return mEvent.category(); | 865 | // return mEvent.category(); |
869 | // } | 866 | // } |
870 | 867 | ||
871 | /*! | 868 | /*! |
872 | Returns the description of the event for this effective event. | 869 | Returns the description of the event for this effective event. |
873 | */ | 870 | */ |
874 | const QString &EffectiveEvent::description( ) const | 871 | const QString &EffectiveEvent::description( ) const |
875 | { | 872 | { |
876 | return mEvent.description(); | 873 | return mEvent.description(); |
877 | } | 874 | } |
878 | 875 | ||
879 | /*! | 876 | /*! |
880 | \internal | 877 | \internal |
881 | */ | 878 | */ |
882 | const QString &EffectiveEvent::location( ) const | 879 | const QString &EffectiveEvent::location( ) const |
883 | { | 880 | { |
884 | return mEvent.location(); | 881 | return mEvent.location(); |
885 | } | 882 | } |
886 | 883 | ||
887 | /*! | 884 | /*! |
888 | \internal | 885 | \internal |
889 | */ | 886 | */ |
890 | const QString &EffectiveEvent::notes() const | 887 | const QString &EffectiveEvent::notes() const |
891 | { | 888 | { |
892 | return mEvent.notes(); | 889 | return mEvent.notes(); |
893 | } | 890 | } |
894 | 891 | ||
895 | /*! | 892 | /*! |
896 | Returns the event associated with this effective event. | 893 | Returns the event associated with this effective event. |
897 | */ | 894 | */ |
898 | const Event &EffectiveEvent::event() const | 895 | const Event &EffectiveEvent::event() const |
899 | { | 896 | { |
900 | return mEvent; | 897 | return mEvent; |
901 | } | 898 | } |
902 | 899 | ||
903 | /*! | 900 | /*! |
904 | \internal | 901 | \internal |
905 | */ | 902 | */ |
906 | const QTime &EffectiveEvent::end() const | 903 | const QTime &EffectiveEvent::end() const |
907 | { | 904 | { |
908 | return mEnd; | 905 | return mEnd; |
909 | } | 906 | } |
910 | 907 | ||
911 | /*! | 908 | /*! |
912 | \internal | 909 | \internal |
913 | */ | 910 | */ |
914 | const QTime &EffectiveEvent::start() const | 911 | const QTime &EffectiveEvent::start() const |
915 | { | 912 | { |
916 | return mStart; | 913 | return mStart; |
917 | } | 914 | } |
918 | 915 | ||
919 | /*! | 916 | /*! |
920 | Returns the date the effective event occurs on. | 917 | Returns the date the effective event occurs on. |
921 | */ | 918 | */ |
922 | const QDate &EffectiveEvent::date() const | 919 | const QDate &EffectiveEvent::date() const |
923 | { | 920 | { |
924 | return mDate; | 921 | return mDate; |
925 | } | 922 | } |
926 | 923 | ||
927 | /*! | 924 | /*! |
928 | \internal | 925 | \internal |
929 | */ | 926 | */ |
930 | int EffectiveEvent::length() const | 927 | int EffectiveEvent::length() const |
931 | { | 928 | { |
932 | return (mEnd.hour() * 60 - mStart.hour() * 60) | 929 | return (mEnd.hour() * 60 - mStart.hour() * 60) |
933 | + QABS(mStart.minute() - mEnd.minute() ); | 930 | + QABS(mStart.minute() - mEnd.minute() ); |
934 | } | 931 | } |
935 | 932 | ||
936 | /*! | 933 | /*! |
937 | \internal | 934 | \internal |
938 | */ | 935 | */ |
939 | void EffectiveEvent::setDate( const QDate &dt ) | 936 | void EffectiveEvent::setDate( const QDate &dt ) |
940 | { | 937 | { |
941 | mDate = dt; | 938 | mDate = dt; |
942 | } | 939 | } |
943 | 940 | ||
944 | /*! | 941 | /*! |
945 | \internal | 942 | \internal |
946 | */ | 943 | */ |
947 | void EffectiveEvent::setStart( const QTime &start ) | 944 | void EffectiveEvent::setStart( const QTime &start ) |
948 | { | 945 | { |
949 | mStart = start; | 946 | mStart = start; |
950 | } | 947 | } |
951 | 948 | ||
952 | /*! | 949 | /*! |
953 | \internal | 950 | \internal |
954 | */ | 951 | */ |
955 | void EffectiveEvent::setEnd( const QTime &end ) | 952 | void EffectiveEvent::setEnd( const QTime &end ) |
956 | { | 953 | { |
957 | mEnd = end; | 954 | mEnd = end; |
958 | } | 955 | } |
959 | 956 | ||
960 | /*! | 957 | /*! |
961 | \internal | 958 | \internal |
962 | */ | 959 | */ |
963 | void EffectiveEvent::setEvent( Event e ) | 960 | void EffectiveEvent::setEvent( Event e ) |
964 | { | 961 | { |
965 | mEvent = e; | 962 | mEvent = e; |
966 | } | 963 | } |
967 | 964 | ||
968 | /*! | 965 | /*! |
969 | \internal | 966 | \internal |
970 | */ | 967 | */ |
971 | bool EffectiveEvent::operator<( const EffectiveEvent &e ) const | 968 | bool EffectiveEvent::operator<( const EffectiveEvent &e ) const |
972 | { | 969 | { |
973 | if ( mDate < e.date() ) | 970 | if ( mDate < e.date() ) |
974 | return TRUE; | 971 | return TRUE; |
975 | if ( mDate == e.date() ) | 972 | if ( mDate == e.date() ) |
976 | return ( mStart < e.start() ); | 973 | return ( mStart < e.start() ); |
977 | else | 974 | else |
978 | return FALSE; | 975 | return FALSE; |
979 | } | 976 | } |
980 | 977 | ||
981 | /*! | 978 | /*! |
982 | \internal | 979 | \internal |
983 | */ | 980 | */ |
984 | bool EffectiveEvent::operator<=( const EffectiveEvent &e ) const | 981 | bool EffectiveEvent::operator<=( const EffectiveEvent &e ) const |
985 | { | 982 | { |
986 | return (mDate <= e.date() ); | 983 | return (mDate <= e.date() ); |
987 | } | 984 | } |
988 | 985 | ||
989 | /*! | 986 | /*! |
990 | \internal | 987 | \internal |
991 | */ | 988 | */ |
992 | bool EffectiveEvent::operator==( const EffectiveEvent &e ) const | 989 | bool EffectiveEvent::operator==( const EffectiveEvent &e ) const |
993 | { | 990 | { |
994 | return ( mDate == e.date() | 991 | return ( mDate == e.date() |
995 | && mStart == e.start() | 992 | && mStart == e.start() |
996 | && mEnd == e.end() | 993 | && mEnd == e.end() |
997 | && mEvent == e.event() ); | 994 | && mEvent == e.event() ); |
998 | } | 995 | } |
999 | 996 | ||
1000 | /*! | 997 | /*! |
1001 | \internal | 998 | \internal |
1002 | */ | 999 | */ |
1003 | bool EffectiveEvent::operator!=( const EffectiveEvent &e ) const | 1000 | bool EffectiveEvent::operator!=( const EffectiveEvent &e ) const |
1004 | { | 1001 | { |
1005 | return !(*this == e); | 1002 | return !(*this == e); |
1006 | } | 1003 | } |
1007 | 1004 | ||
1008 | /*! | 1005 | /*! |
1009 | \internal | 1006 | \internal |
1010 | */ | 1007 | */ |
1011 | bool EffectiveEvent::operator>( const EffectiveEvent &e ) const | 1008 | bool EffectiveEvent::operator>( const EffectiveEvent &e ) const |
1012 | { | 1009 | { |
1013 | return !(*this <= e ); | 1010 | return !(*this <= e ); |
1014 | } | 1011 | } |
1015 | 1012 | ||
1016 | /*! | 1013 | /*! |
1017 | \internal | 1014 | \internal |
1018 | */ | 1015 | */ |
1019 | bool EffectiveEvent::operator>=(const EffectiveEvent &e) const | 1016 | bool EffectiveEvent::operator>=(const EffectiveEvent &e) const |
1020 | { | 1017 | { |
1021 | return !(*this < e); | 1018 | return !(*this < e); |
1022 | } | 1019 | } |
1023 | 1020 | ||
1024 | /*! | 1021 | /*! |
1025 | \internal | 1022 | \internal |
1026 | */ | 1023 | */ |
1027 | void EffectiveEvent::setEffectiveDates( const QDate &from, const QDate &to ) | 1024 | void EffectiveEvent::setEffectiveDates( const QDate &from, const QDate &to ) |
1028 | { | 1025 | { |
1029 | if ( !from.isValid() ) { | 1026 | if ( !from.isValid() ) { |
1030 | delete d; | 1027 | delete d; |
1031 | d = 0; | 1028 | d = 0; |
1032 | return; | 1029 | return; |
1033 | } | 1030 | } |
1034 | if ( !d ) | 1031 | if ( !d ) |
1035 | d = new EffectiveEventPrivate; | 1032 | d = new EffectiveEventPrivate; |
1036 | d->startDate = from; | 1033 | d->startDate = from; |
1037 | d->endDate = to; | 1034 | d->endDate = to; |
1038 | } | 1035 | } |
1039 | 1036 | ||
1040 | /*! | 1037 | /*! |
1041 | \internal | 1038 | \internal |
1042 | */ | 1039 | */ |
1043 | QDate EffectiveEvent::startDate() const | 1040 | QDate EffectiveEvent::startDate() const |
1044 | { | 1041 | { |
1045 | if ( d ) | 1042 | if ( d ) |
1046 | return d->startDate; | 1043 | return d->startDate; |
1047 | else if ( mEvent.hasRepeat() ) | 1044 | else if ( mEvent.hasRepeat() ) |
1048 | 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 |
1049 | else | 1046 | else |
1050 | return mEvent.start().date(); | 1047 | return mEvent.start().date(); |
1051 | } | 1048 | } |
1052 | 1049 | ||
1053 | /*! | 1050 | /*! |
1054 | \internal | 1051 | \internal |
1055 | */ | 1052 | */ |
1056 | QDate EffectiveEvent::endDate() const | 1053 | QDate EffectiveEvent::endDate() const |
1057 | { | 1054 | { |
1058 | if ( d ) | 1055 | if ( d ) |
1059 | return d->endDate; | 1056 | return d->endDate; |
1060 | else if ( mEvent.hasRepeat() ) | 1057 | else if ( mEvent.hasRepeat() ) |
1061 | 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 |
1062 | else | 1059 | else |
1063 | return mEvent.end().date(); | 1060 | return mEvent.end().date(); |
1064 | } | 1061 | } |
1065 | 1062 | ||
1066 | /*! | 1063 | /*! |
1067 | \internal | 1064 | \internal |
1068 | */ | 1065 | */ |
1069 | int EffectiveEvent::size() const | 1066 | int EffectiveEvent::size() const |
1070 | { | 1067 | { |
1071 | return ( mEnd.hour() - mStart.hour() ) * 3600 | 1068 | return ( mEnd.hour() - mStart.hour() ) * 3600 |
1072 | + (mEnd.minute() - mStart.minute() * 60 | 1069 | + (mEnd.minute() - mStart.minute() * 60 |
1073 | + mEnd.second() - mStart.second() ); | 1070 | + mEnd.second() - mStart.second() ); |
1074 | } | 1071 | } |
1075 | 1072 | ||
1076 | 1073 | ||
1077 | // vcal conversion code | 1074 | // vcal conversion code |
1078 | static inline VObject *safeAddPropValue( VObject *o, const char *prop, const QString &value ) | 1075 | static inline VObject *safeAddPropValue( VObject *o, const char *prop, const QString &value ) |
1079 | { | 1076 | { |
1080 | VObject *ret = 0; | 1077 | VObject *ret = 0; |
1081 | if ( o && !value.isEmpty() ) | 1078 | if ( o && !value.isEmpty() ) |
1082 | ret = addPropValue( o, prop, value.latin1() ); | 1079 | ret = addPropValue( o, prop, value.latin1() ); |
1083 | return ret; | 1080 | return ret; |
1084 | } | 1081 | } |
1085 | 1082 | ||
1086 | static inline VObject *safeAddProp( VObject *o, const char *prop) | 1083 | static inline VObject *safeAddProp( VObject *o, const char *prop) |
1087 | { | 1084 | { |
1088 | VObject *ret = 0; | 1085 | VObject *ret = 0; |
1089 | if ( o ) | 1086 | if ( o ) |
1090 | ret = addProp( o, prop ); | 1087 | ret = addProp( o, prop ); |
1091 | return ret; | 1088 | return ret; |
1092 | } | 1089 | } |
1093 | 1090 | ||
1094 | /* | 1091 | /* |
1095 | * Until we support vCal/iCal right | 1092 | * Until we support vCal/iCal right |
1096 | * we will make DTSTART and other things | 1093 | * we will make DTSTART and other things |
1097 | * be floating in the sense of | 1094 | * be floating in the sense of |
1098 | * RFC 2445 | 1095 | * RFC 2445 |
1099 | */ | 1096 | */ |
1100 | namespace { | 1097 | namespace { |
1101 | /* | 1098 | /* |
1102 | * Convert QDateTime to iso8601 but take | 1099 | * Convert QDateTime to iso8601 but take |
1103 | * local time and do not use the Z at the end | 1100 | * local time and do not use the Z at the end |
1104 | * | 1101 | * |
1105 | */ | 1102 | */ |
1106 | QCString toISOLocal( const QDateTime& dt ) { | 1103 | QCString toISOLocal( const QDateTime& dt ) { |
1107 | QCString str; | 1104 | QCString str; |
1108 | /* | 1105 | /* |
1109 | * year month day T Hour Minute Second | 1106 | * year month day T Hour Minute Second |
1110 | * 4 2 2 2 2 2 digits | 1107 | * 4 2 2 2 2 2 digits |
1111 | */ | 1108 | */ |
1112 | str.sprintf("%04d%02d%02dT%02d%02d%02d", | 1109 | str.sprintf("%04d%02d%02dT%02d%02d%02d", |
1113 | dt.date().year(), | 1110 | dt.date().year(), |
1114 | dt.date().month(), | 1111 | dt.date().month(), |
1115 | dt.date().day(), | 1112 | dt.date().day(), |
1116 | dt.time().hour(), | 1113 | dt.time().hour(), |
1117 | dt.time().minute(), | 1114 | dt.time().minute(), |
1118 | dt.time().second() ); | 1115 | dt.time().second() ); |
1119 | 1116 | ||
1120 | qWarning("Str ist %s", str.data() ); | 1117 | qWarning("Str ist %s", str.data() ); |
1121 | 1118 | ||
1122 | return str; | 1119 | return str; |
1123 | } | 1120 | } |
1124 | 1121 | ||
1125 | 1122 | ||
1126 | }; | 1123 | }; |
1127 | 1124 | ||
1128 | static VObject *createVObject( const Event &e ) | 1125 | static VObject *createVObject( const Event &e ) |
1129 | { | 1126 | { |
1130 | VObject *vcal = newVObject( VCCalProp ); | 1127 | VObject *vcal = newVObject( VCCalProp ); |
1131 | safeAddPropValue( vcal, VCVersionProp, "1.0" ); | 1128 | safeAddPropValue( vcal, VCVersionProp, "1.0" ); |
1132 | VObject *event = safeAddProp( vcal, VCEventProp ); | 1129 | VObject *event = safeAddProp( vcal, VCEventProp ); |
1133 | 1130 | ||
1134 | safeAddPropValue( event, VCDTstartProp, toISOLocal( e.start() ) ); | 1131 | safeAddPropValue( event, VCDTstartProp, toISOLocal( e.start() ) ); |
1135 | safeAddPropValue( event, VCDTendProp, toISOLocal( e.end() ) ); | 1132 | safeAddPropValue( event, VCDTendProp, toISOLocal( e.end() ) ); |
1136 | safeAddPropValue( event, "X-Qtopia-NOTES", e.description() ); | 1133 | safeAddPropValue( event, "X-Qtopia-NOTES", e.description() ); |
1137 | safeAddPropValue( event, VCDescriptionProp, e.description() ); | 1134 | safeAddPropValue( event, VCDescriptionProp, e.description() ); |
1138 | safeAddPropValue( event, VCLocationProp, e.location() ); | 1135 | safeAddPropValue( event, VCLocationProp, e.location() ); |
1139 | 1136 | ||
1140 | if ( e.hasAlarm() ) { | 1137 | if ( e.hasAlarm() ) { |
1141 | VObject *alarm = safeAddProp( event, VCAAlarmProp ); | 1138 | VObject *alarm = safeAddProp( event, VCAAlarmProp ); |
1142 | QDateTime dt = e.start(); | 1139 | QDateTime dt = e.start(); |
1143 | dt = dt.addSecs( -e.alarmTime()*60 ); | 1140 | dt = dt.addSecs( -e.alarmTime()*60 ); |
1144 | safeAddPropValue( alarm, VCRunTimeProp, toISOLocal( dt ) ); | 1141 | safeAddPropValue( alarm, VCRunTimeProp, toISOLocal( dt ) ); |
1145 | safeAddPropValue( alarm, VCAudioContentProp, | 1142 | safeAddPropValue( alarm, VCAudioContentProp, |
1146 | (e.alarmSound() == Event::Silent ? "silent" : "alarm" ) ); | 1143 | (e.alarmSound() == Event::Silent ? "silent" : "alarm" ) ); |
1147 | } | 1144 | } |
1148 | 1145 | ||
1149 | safeAddPropValue( event, "X-Qtopia-TIMEZONE", e.timeZone() ); | 1146 | safeAddPropValue( event, "X-Qtopia-TIMEZONE", e.timeZone() ); |
1150 | 1147 | ||
1151 | if ( e.type() == Event::AllDay ) | 1148 | if ( e.type() == Event::AllDay ) |
1152 | safeAddPropValue( event, "X-Qtopia-AllDay", e.timeZone() ); | 1149 | safeAddPropValue( event, "X-Qtopia-AllDay", e.timeZone() ); |
1153 | 1150 | ||
1154 | // ### repeat missing | 1151 | // ### repeat missing |
1155 | 1152 | ||
1156 | // ### categories missing | 1153 | // ### categories missing |
1157 | 1154 | ||
1158 | return vcal; | 1155 | return vcal; |
1159 | } | 1156 | } |
1160 | 1157 | ||
1161 | 1158 | ||
1162 | static Event parseVObject( VObject *obj ) | 1159 | static Event parseVObject( VObject *obj ) |
1163 | { | 1160 | { |
1164 | Event e; | 1161 | Event e; |
1165 | 1162 | ||
1166 | bool haveAlarm = FALSE; | 1163 | bool haveAlarm = FALSE; |
1167 | bool haveStart = FALSE; | 1164 | bool haveStart = FALSE; |
1168 | bool haveEnd = FALSE; | 1165 | bool haveEnd = FALSE; |
1169 | QDateTime alarmTime; | 1166 | QDateTime alarmTime; |
1170 | Event::SoundTypeChoice soundType = Event::Silent; | 1167 | Event::SoundTypeChoice soundType = Event::Silent; |
1171 | 1168 | ||
1172 | VObjectIterator it; | 1169 | VObjectIterator it; |
1173 | initPropIterator( &it, obj ); | 1170 | initPropIterator( &it, obj ); |
1174 | while( moreIteration( &it ) ) { | 1171 | while( moreIteration( &it ) ) { |
1175 | VObject *o = nextVObject( &it ); | 1172 | VObject *o = nextVObject( &it ); |
1176 | QCString name = vObjectName( o ); | 1173 | QCString name = vObjectName( o ); |
1177 | QCString value = vObjectStringZValue( o ); | 1174 | QCString value = vObjectStringZValue( o ); |
1178 | if ( name == VCDTstartProp ) { | 1175 | if ( name == VCDTstartProp ) { |
1179 | e.setStart( TimeConversion::fromISO8601( value ) ); | 1176 | e.setStart( TimeConversion::fromISO8601( value ) ); |
1180 | haveStart = TRUE; | 1177 | haveStart = TRUE; |
1181 | } | 1178 | } |
1182 | else if ( name == VCDTendProp ) { | 1179 | else if ( name == VCDTendProp ) { |
1183 | e.setEnd( TimeConversion::fromISO8601( value ) ); | 1180 | e.setEnd( TimeConversion::fromISO8601( value ) ); |
1184 | haveEnd = TRUE; | 1181 | haveEnd = TRUE; |
1185 | } | 1182 | } |
1186 | else if ( name == "X-Qtopia-NOTES" ) { | 1183 | else if ( name == "X-Qtopia-NOTES" ) { |
1187 | e.setNotes( value ); | 1184 | e.setNotes( value ); |
1188 | } | 1185 | } |
1189 | else if ( name == VCDescriptionProp ) { | 1186 | else if ( name == VCDescriptionProp ) { |
1190 | e.setDescription( value ); | 1187 | e.setDescription( value ); |
1191 | } | 1188 | } |
1192 | else if ( name == VCLocationProp ) { | 1189 | else if ( name == VCLocationProp ) { |
1193 | e.setLocation( value ); | 1190 | e.setLocation( value ); |
1194 | } | 1191 | } |
1195 | else if ( name == VCAudioContentProp ) { | 1192 | else if ( name == VCAudioContentProp ) { |
1196 | haveAlarm = TRUE; | 1193 | haveAlarm = TRUE; |
1197 | VObjectIterator nit; | 1194 | VObjectIterator nit; |
1198 | initPropIterator( &nit, o ); | 1195 | initPropIterator( &nit, o ); |
1199 | while( moreIteration( &nit ) ) { | 1196 | while( moreIteration( &nit ) ) { |
1200 | VObject *o = nextVObject( &nit ); | 1197 | VObject *o = nextVObject( &nit ); |
1201 | QCString name = vObjectName( o ); | 1198 | QCString name = vObjectName( o ); |
1202 | QCString value = vObjectStringZValue( o ); | 1199 | QCString value = vObjectStringZValue( o ); |
1203 | if ( name == VCRunTimeProp ) | 1200 | if ( name == VCRunTimeProp ) |
1204 | alarmTime = TimeConversion::fromISO8601( value ); | 1201 | alarmTime = TimeConversion::fromISO8601( value ); |
1205 | else if ( name == VCAudioContentProp ) { | 1202 | else if ( name == VCAudioContentProp ) { |
1206 | if ( value == "silent" ) | 1203 | if ( value == "silent" ) |
1207 | soundType = Event::Silent; | 1204 | soundType = Event::Silent; |
1208 | else | 1205 | else |
1209 | soundType = Event::Loud; | 1206 | soundType = Event::Loud; |
1210 | } | 1207 | } |
1211 | } | 1208 | } |
1212 | } | 1209 | } |
1213 | else if ( name == "X-Qtopia-TIMEZONE") { | 1210 | else if ( name == "X-Qtopia-TIMEZONE") { |
1214 | e.setTimeZone( value ); | 1211 | e.setTimeZone( value ); |
1215 | } | 1212 | } |
1216 | else if ( name == "X-Qtopia-AllDay" ) { | 1213 | else if ( name == "X-Qtopia-AllDay" ) { |
1217 | e.setType( Event::AllDay ); | 1214 | e.setType( Event::AllDay ); |
1218 | } | 1215 | } |
1219 | #if 0 | 1216 | #if 0 |
1220 | else { | 1217 | else { |
1221 | printf("Name: %s, value=%s\n", name.data(), vObjectStringZValue( o ) ); | 1218 | printf("Name: %s, value=%s\n", name.data(), vObjectStringZValue( o ) ); |
1222 | VObjectIterator nit; | 1219 | VObjectIterator nit; |
1223 | initPropIterator( &nit, o ); | 1220 | initPropIterator( &nit, o ); |
1224 | while( moreIteration( &nit ) ) { | 1221 | while( moreIteration( &nit ) ) { |
1225 | VObject *o = nextVObject( &nit ); | 1222 | VObject *o = nextVObject( &nit ); |
1226 | QCString name = vObjectName( o ); | 1223 | QCString name = vObjectName( o ); |
1227 | QString value = vObjectStringZValue( o ); | 1224 | QString value = vObjectStringZValue( o ); |
1228 | printf(" subprop: %s = %s\n", name.data(), value.latin1() ); | 1225 | printf(" subprop: %s = %s\n", name.data(), value.latin1() ); |
1229 | } | 1226 | } |
1230 | } | 1227 | } |
1231 | #endif | 1228 | #endif |
1232 | } | 1229 | } |
1233 | 1230 | ||
1234 | if ( !haveStart && !haveEnd ) | 1231 | if ( !haveStart && !haveEnd ) |
1235 | e.setStart( QDateTime::currentDateTime() ); | 1232 | e.setStart( QDateTime::currentDateTime() ); |
1236 | 1233 | ||
1237 | if ( !haveEnd ) { | 1234 | if ( !haveEnd ) { |
1238 | e.setType( Event::AllDay ); | 1235 | e.setType( Event::AllDay ); |
1239 | e.setEnd( e.start() ); | 1236 | e.setEnd( e.start() ); |
1240 | } | 1237 | } |
1241 | 1238 | ||
1242 | if ( haveAlarm ) { | 1239 | if ( haveAlarm ) { |
1243 | int minutes = alarmTime.secsTo( e.start() ) / 60; | 1240 | int minutes = alarmTime.secsTo( e.start() ) / 60; |
1244 | e.setAlarm( TRUE, minutes, soundType ); | 1241 | e.setAlarm( TRUE, minutes, soundType ); |
1245 | } | 1242 | } |
1246 | return e; | 1243 | return e; |
1247 | } | 1244 | } |
1248 | 1245 | ||
1249 | 1246 | ||
1250 | /*! | 1247 | /*! |
1251 | 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. |
1252 | */ | 1249 | */ |
1253 | void Event::writeVCalendar( const QString &filename, const QValueList<Event> &events) | 1250 | void Event::writeVCalendar( const QString &filename, const QValueList<Event> &events) |
1254 | { | 1251 | { |
1255 | 1252 | ||
1256 | QFileDirect f( filename.utf8().data() ); | 1253 | QFileDirect f( filename.utf8().data() ); |
1257 | 1254 | ||
1258 | if ( !f.open( IO_WriteOnly ) ) { | 1255 | if ( !f.open( IO_WriteOnly ) ) { |
1259 | 1256 | ||
1260 | qWarning("Unable to open vcard write"); | 1257 | qWarning("Unable to open vcard write"); |
1261 | 1258 | ||
1262 | return; | 1259 | return; |
1263 | 1260 | ||
1264 | } | 1261 | } |
1265 | 1262 | ||
1266 | 1263 | ||
1267 | QValueList<Event>::ConstIterator it; | 1264 | QValueList<Event>::ConstIterator it; |
1268 | for( it = events.begin(); it != events.end(); ++it ) { | 1265 | for( it = events.begin(); it != events.end(); ++it ) { |
1269 | VObject *obj = createVObject( *it ); | 1266 | VObject *obj = createVObject( *it ); |
1270 | writeVObject( f.directHandle() , obj ); | 1267 | writeVObject( f.directHandle() , obj ); |
1271 | cleanVObject( obj ); | 1268 | cleanVObject( obj ); |
1272 | } | 1269 | } |
1273 | 1270 | ||
1274 | 1271 | ||
1275 | cleanStrTbl(); | 1272 | cleanStrTbl(); |
1276 | } | 1273 | } |
1277 | 1274 | ||
1278 | /*! | 1275 | /*! |
1279 | Writes \a event as a VCard to the file \a filename. | 1276 | Writes \a event as a VCard to the file \a filename. |
1280 | */ | 1277 | */ |
1281 | void Event::writeVCalendar( const QString &filename, const Event &event) | 1278 | void Event::writeVCalendar( const QString &filename, const Event &event) |
1282 | { | 1279 | { |
1283 | 1280 | ||
1284 | QFileDirect f( filename.utf8().data() ); | 1281 | QFileDirect f( filename.utf8().data() ); |
1285 | 1282 | ||
1286 | if ( !f.open( IO_WriteOnly ) ) { | 1283 | if ( !f.open( IO_WriteOnly ) ) { |
1287 | 1284 | ||
1288 | qWarning("Unable to open vcard write"); | 1285 | qWarning("Unable to open vcard write"); |
1289 | 1286 | ||
1290 | return; | 1287 | return; |
1291 | 1288 | ||
1292 | } | 1289 | } |
1293 | 1290 | ||
1294 | 1291 | ||
1295 | VObject *obj = createVObject( event ); | 1292 | VObject *obj = createVObject( event ); |
1296 | writeVObject( f.directHandle() , obj ); | 1293 | writeVObject( f.directHandle() , obj ); |
1297 | cleanVObject( obj ); | 1294 | cleanVObject( obj ); |
1298 | 1295 | ||
1299 | cleanStrTbl(); | 1296 | cleanStrTbl(); |
1300 | } | 1297 | } |
1301 | 1298 | ||
1302 | /*! | 1299 | /*! |
1303 | 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. |
1304 | */ | 1301 | */ |
1305 | QValueList<Event> Event::readVCalendar( const QString &filename ) | 1302 | QValueList<Event> Event::readVCalendar( const QString &filename ) |
1306 | { | 1303 | { |
1307 | VObject *obj = Parse_MIME_FromFileName( (char *)filename.utf8().data() ); | 1304 | VObject *obj = Parse_MIME_FromFileName( (char *)filename.utf8().data() ); |
1308 | 1305 | ||
1309 | QValueList<Event> events; | 1306 | QValueList<Event> events; |
1310 | 1307 | ||
1311 | while ( obj ) { | 1308 | while ( obj ) { |
1312 | QCString name = vObjectName( obj ); | 1309 | QCString name = vObjectName( obj ); |
1313 | if ( name == VCCalProp ) { | 1310 | if ( name == VCCalProp ) { |
1314 | VObjectIterator nit; | 1311 | VObjectIterator nit; |
1315 | initPropIterator( &nit, obj ); | 1312 | initPropIterator( &nit, obj ); |
1316 | while( moreIteration( &nit ) ) { | 1313 | while( moreIteration( &nit ) ) { |
1317 | VObject *o = nextVObject( &nit ); | 1314 | VObject *o = nextVObject( &nit ); |
1318 | QCString name = vObjectName( o ); | 1315 | QCString name = vObjectName( o ); |
1319 | if ( name == VCEventProp ) | 1316 | if ( name == VCEventProp ) |
1320 | events.append( parseVObject( o ) ); | 1317 | events.append( parseVObject( o ) ); |
1321 | } | 1318 | } |
1322 | } else if ( name == VCEventProp ) { | 1319 | } else if ( name == VCEventProp ) { |
1323 | // shouldn't happen, but just to be sure | 1320 | // shouldn't happen, but just to be sure |
1324 | events.append( parseVObject( obj ) ); | 1321 | events.append( parseVObject( obj ) ); |
1325 | } | 1322 | } |
1326 | VObject *t = obj; | 1323 | VObject *t = obj; |
1327 | obj = nextVObjectInList(obj); | 1324 | obj = nextVObjectInList(obj); |
1328 | cleanVObject( t ); | 1325 | cleanVObject( t ); |
1329 | } | 1326 | } |
1330 | 1327 | ||
1331 | return events; | 1328 | return events; |
1332 | } | 1329 | } |
1333 | 1330 | ||
1334 | bool Event::match( const QRegExp &r ) const | 1331 | bool Event::match( const QRegExp &r ) const |
1335 | { | 1332 | { |
1336 | bool returnMe; | 1333 | bool returnMe; |
1337 | returnMe = false; | 1334 | returnMe = false; |
1338 | 1335 | ||
1339 | if ( descript.find( r ) > -1 ) | 1336 | if ( descript.find( r ) > -1 ) |
1340 | returnMe = true; | 1337 | returnMe = true; |
1341 | else if ( locat.find( r ) > -1 ) | 1338 | else if ( locat.find( r ) > -1 ) |
1342 | returnMe = true; | 1339 | returnMe = true; |
1343 | else if ( TimeConversion::fromUTC( startUTC ).toString().find( r ) > -1 ) | 1340 | else if ( TimeConversion::fromUTC( startUTC ).toString().find( r ) > -1 ) |
1344 | returnMe = true; | 1341 | returnMe = true; |
1345 | else if ( TimeConversion::fromUTC( endUTC ).toString().find( r ) > -1 ) | 1342 | else if ( TimeConversion::fromUTC( endUTC ).toString().find( r ) > -1 ) |
1346 | returnMe = true; | 1343 | returnMe = true; |
1347 | else if ( tz.find( r ) > -1 ) | 1344 | else if ( tz.find( r ) > -1 ) |
1348 | returnMe = true; | 1345 | returnMe = true; |
1349 | else if ( note.find( r ) > -1 ) | 1346 | else if ( note.find( r ) > -1 ) |
1350 | returnMe = true; | 1347 | returnMe = true; |
1351 | else if ( doRepeat() ) { | 1348 | else if ( doRepeat() ) { |
1352 | if ( pattern.hasEndDate ) | 1349 | if ( pattern.hasEndDate ) |
1353 | if ( TimeConversion::fromUTC( pattern.endDateUTC ).toString().find(r) > -1 ) | 1350 | if ( TimeConversion::fromUTC( pattern.endDateUTC ).toString().find(r) > -1 ) |
1354 | returnMe = true; | 1351 | returnMe = true; |
1355 | } | 1352 | } |
1356 | return returnMe; | 1353 | return returnMe; |
1357 | } | 1354 | } |