summaryrefslogtreecommitdiffabout
path: root/libkcal
Unidiff
Diffstat (limited to 'libkcal') (more/less context) (ignore whitespace changes)
-rw-r--r--libkcal/calendar.h4
-rw-r--r--libkcal/calendarlocal.cpp4
-rw-r--r--libkcal/calendarlocal.h4
-rw-r--r--libkcal/sharpformat.cpp10
4 files changed, 11 insertions, 11 deletions
diff --git a/libkcal/calendar.h b/libkcal/calendar.h
index d59bca6..4a3223c 100644
--- a/libkcal/calendar.h
+++ b/libkcal/calendar.h
@@ -1,350 +1,350 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 1998 Preston Brown 3 Copyright (c) 1998 Preston Brown
4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
5 5
6 This library is free software; you can redistribute it and/or 6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public 7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either 8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version. 9 version 2 of the License, or (at your option) any later version.
10 10
11 This library is distributed in the hope that it will be useful, 11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details. 14 Library General Public License for more details.
15 15
16 You should have received a copy of the GNU Library General Public License 16 You should have received a copy of the GNU Library General Public License
17 along with this library; see the file COPYING.LIB. If not, write to 17 along with this library; see the file COPYING.LIB. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. 19 Boston, MA 02111-1307, USA.
20*/ 20*/
21 21
22#ifndef CALENDAR_H 22#ifndef CALENDAR_H
23#define CALENDAR_H 23#define CALENDAR_H
24 24
25#include <qobject.h> 25#include <qobject.h>
26#include <qstring.h> 26#include <qstring.h>
27#include <qdatetime.h> 27#include <qdatetime.h>
28#include <qptrlist.h> 28#include <qptrlist.h>
29#include <qdict.h> 29#include <qdict.h>
30 30
31#include "customproperties.h" 31#include "customproperties.h"
32#include "event.h" 32#include "event.h"
33#include "todo.h" 33#include "todo.h"
34#include "journal.h" 34#include "journal.h"
35 35
36#define _TIME_ZONE "-0500" /* hardcoded, overridden in config file. */ 36#define _TIME_ZONE "-0500" /* hardcoded, overridden in config file. */
37 37
38class KConfig; 38class KConfig;
39 39
40namespace KCal { 40namespace KCal {
41 41
42class CalFilter; 42class CalFilter;
43 43
44/** 44/**
45 This is the main "calendar" object class for KOrganizer. It holds 45 This is the main "calendar" object class for KOrganizer. It holds
46 information like all appointments/events, user information, etc. etc. 46 information like all appointments/events, user information, etc. etc.
47 one calendar is associated with each CalendarView (@see calendarview.h). 47 one calendar is associated with each CalendarView (@see calendarview.h).
48 This is an abstract base class defining the interface to a calendar. It is 48 This is an abstract base class defining the interface to a calendar. It is
49 implemented by subclasses like @see CalendarLocal, which use different 49 implemented by subclasses like @see CalendarLocal, which use different
50 methods to store and access the data. 50 methods to store and access the data.
51 51
52 Ownership of events etc. is handled by the following policy: As soon as an 52 Ownership of events etc. is handled by the following policy: As soon as an
53 event (or any other subclass of IncidenceBase) object is added to the 53 event (or any other subclass of IncidenceBase) object is added to the
54 Calendar by addEvent() it is owned by the Calendar object. The Calendar takes 54 Calendar by addEvent() it is owned by the Calendar object. The Calendar takes
55 care of deleting it. All Events returned by the query functions are returned 55 care of deleting it. All Events returned by the query functions are returned
56 as pointers, that means all changes to the returned events are immediately 56 as pointers, that means all changes to the returned events are immediately
57 visible in the Calendar. You shouldn't delete any Event object you get from 57 visible in the Calendar. You shouldn't delete any Event object you get from
58 Calendar. 58 Calendar.
59*/ 59*/
60class Calendar : public QObject, public CustomProperties, 60class Calendar : public QObject, public CustomProperties,
61 public IncidenceBase::Observer 61 public IncidenceBase::Observer
62{ 62{
63 Q_OBJECT 63 Q_OBJECT
64public: 64public:
65 Calendar(); 65 Calendar();
66 Calendar(const QString &timeZoneId); 66 Calendar(const QString &timeZoneId);
67 virtual ~Calendar(); 67 virtual ~Calendar();
68 void deleteIncidence(Incidence *in); 68 void deleteIncidence(Incidence *in);
69 /** 69 /**
70 Clears out the current calendar, freeing all used memory etc. 70 Clears out the current calendar, freeing all used memory etc.
71 */ 71 */
72 virtual void close() = 0; 72 virtual void close() = 0;
73 73
74 /** 74 /**
75 Sync changes in memory to persistant storage. 75 Sync changes in memory to persistant storage.
76 */ 76 */
77 virtual void save() = 0; 77 virtual void save() = 0;
78 virtual QPtrList<Event> getExternLastSyncEvents() = 0; 78 virtual QPtrList<Event> getExternLastSyncEvents() = 0;
79 virtual bool isSaving() { return false; } 79 virtual bool isSaving() { return false; }
80 80
81 /** 81 /**
82 Return the owner of the calendar's full name. 82 Return the owner of the calendar's full name.
83 */ 83 */
84 const QString &getOwner() const; 84 const QString &getOwner() const;
85 /** 85 /**
86 Set the owner of the calendar. Should be owner's full name. 86 Set the owner of the calendar. Should be owner's full name.
87 */ 87 */
88 void setOwner( const QString &os ); 88 void setOwner( const QString &os );
89 /** 89 /**
90 Return the email address of the calendar owner. 90 Return the email address of the calendar owner.
91 */ 91 */
92 const QString &getEmail(); 92 const QString &getEmail();
93 /** 93 /**
94 Set the email address of the calendar owner. 94 Set the email address of the calendar owner.
95 */ 95 */
96 void setEmail( const QString & ); 96 void setEmail( const QString & );
97 97
98 /** 98 /**
99 Set time zone from a timezone string (e.g. -2:00) 99 Set time zone from a timezone string (e.g. -2:00)
100 */ 100 */
101 void setTimeZone( const QString &tz ); 101 void setTimeZone( const QString &tz );
102 /** 102 /**
103 Set time zone from a minutes value (e.g. -60) 103 Set time zone from a minutes value (e.g. -60)
104 */ 104 */
105 void setTimeZone( int tz ); 105 void setTimeZone( int tz );
106 /** 106 /**
107 Return time zone as offest in minutes. 107 Return time zone as offest in minutes.
108 */ 108 */
109 int getTimeZone() const; 109 int getTimeZone() const;
110 /** 110 /**
111 Compute an ISO 8601 format string from the time zone. 111 Compute an ISO 8601 format string from the time zone.
112 */ 112 */
113 QString getTimeZoneStr() const; 113 QString getTimeZoneStr() const;
114 /** 114 /**
115 Set time zone id (see /usr/share/zoneinfo/zone.tab for list of legal 115 Set time zone id (see /usr/share/zoneinfo/zone.tab for list of legal
116 values). 116 values).
117 */ 117 */
118 void setTimeZoneId( const QString & ); 118 void setTimeZoneId( const QString & );
119 /** 119 /**
120 Return time zone id. 120 Return time zone id.
121 */ 121 */
122 QString timeZoneId() const; 122 QString timeZoneId() const;
123 /** 123 /**
124 Use local time, not UTC or a time zone. 124 Use local time, not UTC or a time zone.
125 */ 125 */
126 void setLocalTime(); 126 void setLocalTime();
127 /** 127 /**
128 Return whether local time is being used. 128 Return whether local time is being used.
129 */ 129 */
130 bool isLocalTime() const; 130 bool isLocalTime() const;
131 131
132 /** 132 /**
133 Add an incidence to calendar. 133 Add an incidence to calendar.
134 134
135 @return true on success, false on error. 135 @return true on success, false on error.
136 */ 136 */
137 virtual bool addIncidence( Incidence * ); 137 virtual bool addIncidence( Incidence * );
138 /** 138 /**
139 Return filtered list of all incidences of this calendar. 139 Return filtered list of all incidences of this calendar.
140 */ 140 */
141 virtual QPtrList<Incidence> incidences(); 141 virtual QPtrList<Incidence> incidences();
142 142
143 /** 143 /**
144 Return unfiltered list of all incidences of this calendar. 144 Return unfiltered list of all incidences of this calendar.
145 */ 145 */
146 virtual QPtrList<Incidence> rawIncidences(); 146 virtual QPtrList<Incidence> rawIncidences();
147 147
148 /** 148 /**
149 Adds a Event to this calendar object. 149 Adds a Event to this calendar object.
150 @param anEvent a pointer to the event to add 150 @param anEvent a pointer to the event to add
151 151
152 @return true on success, false on error. 152 @return true on success, false on error.
153 */ 153 */
154 virtual bool addEventNoDup( Event *event ) = 0; 154 virtual bool addEventNoDup( Event *event ) = 0;
155 virtual bool addAnniversaryNoDup( Event *event ) = 0; 155 virtual bool addAnniversaryNoDup( Event *event ) = 0;
156 virtual bool addEvent( Event *anEvent ) = 0; 156 virtual bool addEvent( Event *anEvent ) = 0;
157 /** 157 /**
158 Delete event from calendar. 158 Delete event from calendar.
159 */ 159 */
160 virtual void deleteEvent( Event * ) = 0; 160 virtual void deleteEvent( Event * ) = 0;
161 /** 161 /**
162 Retrieves an event on the basis of the unique string ID. 162 Retrieves an event on the basis of the unique string ID.
163 */ 163 */
164 virtual Event *event( const QString &UniqueStr ) = 0; 164 virtual Event *event( const QString &UniqueStr ) = 0;
165 virtual Event *event( QString, int ) = 0; 165 virtual Event *event( QString, QString ) = 0;
166 /** 166 /**
167 Builds and then returns a list of all events that match for the 167 Builds and then returns a list of all events that match for the
168 date specified. useful for dayView, etc. etc. 168 date specified. useful for dayView, etc. etc.
169 The calendar filter is applied. 169 The calendar filter is applied.
170 */ 170 */
171 QPtrList<Event> events( const QDate &date, bool sorted = false); 171 QPtrList<Event> events( const QDate &date, bool sorted = false);
172 /** 172 /**
173 Get events, which occur on the given date. 173 Get events, which occur on the given date.
174 The calendar filter is applied. 174 The calendar filter is applied.
175 */ 175 */
176 QPtrList<Event> events( const QDateTime &qdt ); 176 QPtrList<Event> events( const QDateTime &qdt );
177 /** 177 /**
178 Get events in a range of dates. If inclusive is set to true, only events 178 Get events in a range of dates. If inclusive is set to true, only events
179 are returned, which are completely included in the range. 179 are returned, which are completely included in the range.
180 The calendar filter is applied. 180 The calendar filter is applied.
181 */ 181 */
182 QPtrList<Event> events( const QDate &start, const QDate &end, 182 QPtrList<Event> events( const QDate &start, const QDate &end,
183 bool inclusive = false); 183 bool inclusive = false);
184 /** 184 /**
185 Return filtered list of all events in calendar. 185 Return filtered list of all events in calendar.
186 */ 186 */
187 virtual QPtrList<Event> events(); 187 virtual QPtrList<Event> events();
188 /** 188 /**
189 Return unfiltered list of all events in calendar. 189 Return unfiltered list of all events in calendar.
190 */ 190 */
191 virtual QPtrList<Event> rawEvents() = 0; 191 virtual QPtrList<Event> rawEvents() = 0;
192 192
193 /** 193 /**
194 Add a todo to the todolist. 194 Add a todo to the todolist.
195 195
196 @return true on success, false on error. 196 @return true on success, false on error.
197 */ 197 */
198 virtual bool addTodo( Todo *todo ) = 0; 198 virtual bool addTodo( Todo *todo ) = 0;
199 virtual bool addTodoNoDup( Todo *todo ) = 0; 199 virtual bool addTodoNoDup( Todo *todo ) = 0;
200 /** 200 /**
201 Remove a todo from the todolist. 201 Remove a todo from the todolist.
202 */ 202 */
203 virtual void deleteTodo( Todo * ) = 0; 203 virtual void deleteTodo( Todo * ) = 0;
204 virtual void deleteJournal( Journal * ) = 0; 204 virtual void deleteJournal( Journal * ) = 0;
205 /** 205 /**
206 Return filterd list of todos. 206 Return filterd list of todos.
207 */ 207 */
208 virtual QPtrList<Todo> todos(); 208 virtual QPtrList<Todo> todos();
209 /** 209 /**
210 Searches todolist for an event with this unique string identifier, 210 Searches todolist for an event with this unique string identifier,
211 returns a pointer or null. 211 returns a pointer or null.
212 */ 212 */
213 virtual Todo *todo( const QString &uid ) = 0; 213 virtual Todo *todo( const QString &uid ) = 0;
214 virtual Todo *todo( QString, int ) = 0; 214 virtual Todo *todo( QString, QString ) = 0;
215 /** 215 /**
216 Returns list of todos due on the specified date. 216 Returns list of todos due on the specified date.
217 */ 217 */
218 virtual QPtrList<Todo> todos( const QDate &date ) = 0; 218 virtual QPtrList<Todo> todos( const QDate &date ) = 0;
219 /** 219 /**
220 Return unfiltered list of todos. 220 Return unfiltered list of todos.
221 */ 221 */
222 virtual QPtrList<Todo> rawTodos() = 0; 222 virtual QPtrList<Todo> rawTodos() = 0;
223 223
224 /** 224 /**
225 Add a Journal entry to calendar. 225 Add a Journal entry to calendar.
226 226
227 @return true on success, false on error. 227 @return true on success, false on error.
228 */ 228 */
229 virtual bool addJournal( Journal * ) = 0; 229 virtual bool addJournal( Journal * ) = 0;
230 /** 230 /**
231 Return Journal for given date. 231 Return Journal for given date.
232 */ 232 */
233 virtual Journal *journal( const QDate & ) = 0; 233 virtual Journal *journal( const QDate & ) = 0;
234 /** 234 /**
235 Return Journal with given UID. 235 Return Journal with given UID.
236 */ 236 */
237 virtual Journal *journal( const QString &UID ) = 0; 237 virtual Journal *journal( const QString &UID ) = 0;
238 /** 238 /**
239 Return list of all Journal entries. 239 Return list of all Journal entries.
240 */ 240 */
241 virtual QPtrList<Journal> journals() = 0; 241 virtual QPtrList<Journal> journals() = 0;
242 242
243 /** 243 /**
244 Searches all incidence types for an incidence with this unique 244 Searches all incidence types for an incidence with this unique
245 string identifier, returns a pointer or null. 245 string identifier, returns a pointer or null.
246 */ 246 */
247 Incidence* incidence( const QString&UID ); 247 Incidence* incidence( const QString&UID );
248 248
249 /** 249 /**
250 Setup relations for an incidence. 250 Setup relations for an incidence.
251 */ 251 */
252 virtual void setupRelations( Incidence * ); 252 virtual void setupRelations( Incidence * );
253 /** 253 /**
254 Remove all relations to an incidence 254 Remove all relations to an incidence
255 */ 255 */
256 virtual void removeRelations( Incidence * ); 256 virtual void removeRelations( Incidence * );
257 257
258 /** 258 /**
259 Set calendar filter, which filters events for the events() functions. 259 Set calendar filter, which filters events for the events() functions.
260 The Filter object is owned by the caller. 260 The Filter object is owned by the caller.
261 */ 261 */
262 void setFilter( CalFilter * ); 262 void setFilter( CalFilter * );
263 /** 263 /**
264 Return calendar filter. 264 Return calendar filter.
265 */ 265 */
266 CalFilter *filter(); 266 CalFilter *filter();
267 virtual QDateTime nextAlarm( int daysTo ) = 0; 267 virtual QDateTime nextAlarm( int daysTo ) = 0;
268 virtual QString nextSummary( ) const = 0; 268 virtual QString nextSummary( ) const = 0;
269 virtual void reInitAlarmSettings() = 0; 269 virtual void reInitAlarmSettings() = 0;
270 virtual QDateTime nextAlarmEventDateTime() const = 0; 270 virtual QDateTime nextAlarmEventDateTime() const = 0;
271 virtual void checkAlarmForIncidence( Incidence *, bool ) = 0; 271 virtual void checkAlarmForIncidence( Incidence *, bool ) = 0;
272 /** 272 /**
273 Return all alarms, which ocur in the given time interval. 273 Return all alarms, which ocur in the given time interval.
274 */ 274 */
275 virtual Alarm::List alarms( const QDateTime &from, 275 virtual Alarm::List alarms( const QDateTime &from,
276 const QDateTime &to ) = 0; 276 const QDateTime &to ) = 0;
277 277
278 class Observer { 278 class Observer {
279 public: 279 public:
280 virtual void calendarModified( bool, Calendar * ) = 0; 280 virtual void calendarModified( bool, Calendar * ) = 0;
281 }; 281 };
282 282
283 void registerObserver( Observer * ); 283 void registerObserver( Observer * );
284 284
285 void setModified( bool ); 285 void setModified( bool );
286 286
287 /** 287 /**
288 Set product id returned by loadedProductId(). This function is only 288 Set product id returned by loadedProductId(). This function is only
289 useful for the calendar loading code. 289 useful for the calendar loading code.
290 */ 290 */
291 void setLoadedProductId( const QString & ); 291 void setLoadedProductId( const QString & );
292 /** 292 /**
293 Return product id taken from file that has been loaded. Returns 293 Return product id taken from file that has been loaded. Returns
294 QString::null, if no calendar has been loaded. 294 QString::null, if no calendar has been loaded.
295 */ 295 */
296 QString loadedProductId(); 296 QString loadedProductId();
297 297
298 signals: 298 signals:
299 void calendarChanged(); 299 void calendarChanged();
300 void calendarSaved(); 300 void calendarSaved();
301 void calendarLoaded(); 301 void calendarLoaded();
302 void addAlarm(const QDateTime &qdt, const QString &noti ); 302 void addAlarm(const QDateTime &qdt, const QString &noti );
303 void removeAlarm(const QDateTime &qdt, const QString &noti ); 303 void removeAlarm(const QDateTime &qdt, const QString &noti );
304 304
305 protected: 305 protected:
306 /** 306 /**
307 Get unfiltered events, which occur on the given date. 307 Get unfiltered events, which occur on the given date.
308 */ 308 */
309 virtual QPtrList<Event> rawEventsForDate( const QDateTime &qdt ) = 0; 309 virtual QPtrList<Event> rawEventsForDate( const QDateTime &qdt ) = 0;
310 /** 310 /**
311 Get unfiltered events, which occur on the given date. 311 Get unfiltered events, which occur on the given date.
312 */ 312 */
313 virtual QPtrList<Event> rawEventsForDate( const QDate &date, 313 virtual QPtrList<Event> rawEventsForDate( const QDate &date,
314 bool sorted = false ) = 0; 314 bool sorted = false ) = 0;
315 /** 315 /**
316 Get events in a range of dates. If inclusive is set to true, only events 316 Get events in a range of dates. If inclusive is set to true, only events
317 are returned, which are completely included in the range. 317 are returned, which are completely included in the range.
318 */ 318 */
319 virtual QPtrList<Event> rawEvents( const QDate &start, const QDate &end, 319 virtual QPtrList<Event> rawEvents( const QDate &start, const QDate &end,
320 bool inclusive = false ) = 0; 320 bool inclusive = false ) = 0;
321 Incidence *mNextAlarmIncidence; 321 Incidence *mNextAlarmIncidence;
322 322
323private: 323private:
324 void init(); 324 void init();
325 325
326 QString mOwner; // who the calendar belongs to 326 QString mOwner; // who the calendar belongs to
327 QString mOwnerEmail; // email address of the owner 327 QString mOwnerEmail; // email address of the owner
328 int mTimeZone; // timezone OFFSET from GMT (MINUTES) 328 int mTimeZone; // timezone OFFSET from GMT (MINUTES)
329 bool mLocalTime; // use local time, not UTC or a time zone 329 bool mLocalTime; // use local time, not UTC or a time zone
330 330
331 CalFilter *mFilter; 331 CalFilter *mFilter;
332 CalFilter *mDefaultFilter; 332 CalFilter *mDefaultFilter;
333 333
334 QString mTimeZoneId; 334 QString mTimeZoneId;
335 335
336 Observer *mObserver; 336 Observer *mObserver;
337 bool mNewObserver; 337 bool mNewObserver;
338 338
339 bool mModified; 339 bool mModified;
340 340
341 QString mLoadedProductId; 341 QString mLoadedProductId;
342 342
343 // This list is used to put together related todos 343 // This list is used to put together related todos
344 QDict<Incidence> mOrphans; 344 QDict<Incidence> mOrphans;
345 QDict<Incidence> mOrphanUids; 345 QDict<Incidence> mOrphanUids;
346}; 346};
347 347
348} 348}
349 349
350#endif 350#endif
diff --git a/libkcal/calendarlocal.cpp b/libkcal/calendarlocal.cpp
index e464a77..21b4aaf 100644
--- a/libkcal/calendarlocal.cpp
+++ b/libkcal/calendarlocal.cpp
@@ -1,698 +1,698 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 3
4 Copyright (c) 1998 Preston Brown 4 Copyright (c) 1998 Preston Brown
5 Copyright (c) 2001,2003 Cornelius Schumacher <schumacher@kde.org> 5 Copyright (c) 2001,2003 Cornelius Schumacher <schumacher@kde.org>
6 6
7 This library is free software; you can redistribute it and/or 7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Library General Public 8 modify it under the terms of the GNU Library General Public
9 License as published by the Free Software Foundation; either 9 License as published by the Free Software Foundation; either
10 version 2 of the License, or (at your option) any later version. 10 version 2 of the License, or (at your option) any later version.
11 11
12 This library is distributed in the hope that it will be useful, 12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Library General Public License for more details. 15 Library General Public License for more details.
16 16
17 You should have received a copy of the GNU Library General Public License 17 You should have received a copy of the GNU Library General Public License
18 along with this library; see the file COPYING.LIB. If not, write to 18 along with this library; see the file COPYING.LIB. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. 20 Boston, MA 02111-1307, USA.
21*/ 21*/
22 22
23#include <qdatetime.h> 23#include <qdatetime.h>
24#include <qstring.h> 24#include <qstring.h>
25#include <qptrlist.h> 25#include <qptrlist.h>
26 26
27#include <kdebug.h> 27#include <kdebug.h>
28#include <kconfig.h> 28#include <kconfig.h>
29#include <kglobal.h> 29#include <kglobal.h>
30#include <klocale.h> 30#include <klocale.h>
31 31
32#include "vcaldrag.h" 32#include "vcaldrag.h"
33#include "vcalformat.h" 33#include "vcalformat.h"
34#include "icalformat.h" 34#include "icalformat.h"
35#include "exceptions.h" 35#include "exceptions.h"
36#include "incidence.h" 36#include "incidence.h"
37#include "journal.h" 37#include "journal.h"
38#include "filestorage.h" 38#include "filestorage.h"
39#include "calfilter.h" 39#include "calfilter.h"
40 40
41#include "calendarlocal.h" 41#include "calendarlocal.h"
42 42
43// #ifndef DESKTOP_VERSION 43// #ifndef DESKTOP_VERSION
44// #include <qtopia/alarmserver.h> 44// #include <qtopia/alarmserver.h>
45// #endif 45// #endif
46using namespace KCal; 46using namespace KCal;
47 47
48CalendarLocal::CalendarLocal() 48CalendarLocal::CalendarLocal()
49 : Calendar() 49 : Calendar()
50{ 50{
51 init(); 51 init();
52} 52}
53 53
54CalendarLocal::CalendarLocal(const QString &timeZoneId) 54CalendarLocal::CalendarLocal(const QString &timeZoneId)
55 : Calendar(timeZoneId) 55 : Calendar(timeZoneId)
56{ 56{
57 init(); 57 init();
58} 58}
59 59
60void CalendarLocal::init() 60void CalendarLocal::init()
61{ 61{
62 mNextAlarmIncidence = 0; 62 mNextAlarmIncidence = 0;
63} 63}
64 64
65 65
66CalendarLocal::~CalendarLocal() 66CalendarLocal::~CalendarLocal()
67{ 67{
68 close(); 68 close();
69} 69}
70 70
71bool CalendarLocal::load( const QString &fileName ) 71bool CalendarLocal::load( const QString &fileName )
72{ 72{
73 FileStorage storage( this, fileName ); 73 FileStorage storage( this, fileName );
74 return storage.load(); 74 return storage.load();
75} 75}
76 76
77bool CalendarLocal::save( const QString &fileName, CalFormat *format ) 77bool CalendarLocal::save( const QString &fileName, CalFormat *format )
78{ 78{
79 FileStorage storage( this, fileName, format ); 79 FileStorage storage( this, fileName, format );
80 return storage.save(); 80 return storage.save();
81} 81}
82 82
83void CalendarLocal::close() 83void CalendarLocal::close()
84{ 84{
85 mEventList.setAutoDelete( true ); 85 mEventList.setAutoDelete( true );
86 mTodoList.setAutoDelete( true ); 86 mTodoList.setAutoDelete( true );
87 mJournalList.setAutoDelete( false ); 87 mJournalList.setAutoDelete( false );
88 88
89 mEventList.clear(); 89 mEventList.clear();
90 mTodoList.clear(); 90 mTodoList.clear();
91 mJournalList.clear(); 91 mJournalList.clear();
92 92
93 mEventList.setAutoDelete( false ); 93 mEventList.setAutoDelete( false );
94 mTodoList.setAutoDelete( false ); 94 mTodoList.setAutoDelete( false );
95 mJournalList.setAutoDelete( false ); 95 mJournalList.setAutoDelete( false );
96 96
97 setModified( false ); 97 setModified( false );
98} 98}
99 99
100bool CalendarLocal::addAnniversaryNoDup( Event *event ) 100bool CalendarLocal::addAnniversaryNoDup( Event *event )
101{ 101{
102 QString cat; 102 QString cat;
103 bool isBirthday = true; 103 bool isBirthday = true;
104 if( event->categoriesStr() == i18n( "Anniversary" ) ) { 104 if( event->categoriesStr() == i18n( "Anniversary" ) ) {
105 isBirthday = false; 105 isBirthday = false;
106 cat = i18n( "Anniversary" ); 106 cat = i18n( "Anniversary" );
107 } else if( event->categoriesStr() == i18n( "Birthday" ) ) { 107 } else if( event->categoriesStr() == i18n( "Birthday" ) ) {
108 isBirthday = true; 108 isBirthday = true;
109 cat = i18n( "Birthday" ); 109 cat = i18n( "Birthday" );
110 } else { 110 } else {
111 qDebug("addAnniversaryNoDup called without fitting category! "); 111 qDebug("addAnniversaryNoDup called without fitting category! ");
112 return false; 112 return false;
113 } 113 }
114 Event * eve; 114 Event * eve;
115 for ( eve = mEventList.first(); eve ; eve = mEventList.next() ) { 115 for ( eve = mEventList.first(); eve ; eve = mEventList.next() ) {
116 if ( !(eve->categories().contains( cat ) )) 116 if ( !(eve->categories().contains( cat ) ))
117 continue; 117 continue;
118 // now we have an event with fitting category 118 // now we have an event with fitting category
119 if ( eve->dtStart().date() != event->dtStart().date() ) 119 if ( eve->dtStart().date() != event->dtStart().date() )
120 continue; 120 continue;
121 // now we have an event with fitting category+date 121 // now we have an event with fitting category+date
122 if ( eve->summary() != event->summary() ) 122 if ( eve->summary() != event->summary() )
123 continue; 123 continue;
124 // now we have an event with fitting category+date+summary 124 // now we have an event with fitting category+date+summary
125 return false; 125 return false;
126 } 126 }
127 return addEvent( event ); 127 return addEvent( event );
128 128
129} 129}
130bool CalendarLocal::addEventNoDup( Event *event ) 130bool CalendarLocal::addEventNoDup( Event *event )
131{ 131{
132 Event * eve; 132 Event * eve;
133 for ( eve = mEventList.first(); eve ; eve = mEventList.next() ) { 133 for ( eve = mEventList.first(); eve ; eve = mEventList.next() ) {
134 if ( *eve == *event ) { 134 if ( *eve == *event ) {
135 //qDebug("CalendarLocal::Duplicate event found! Not inserted! "); 135 //qDebug("CalendarLocal::Duplicate event found! Not inserted! ");
136 return false; 136 return false;
137 } 137 }
138 } 138 }
139 return addEvent( event ); 139 return addEvent( event );
140} 140}
141 141
142bool CalendarLocal::addEvent( Event *event ) 142bool CalendarLocal::addEvent( Event *event )
143{ 143{
144 insertEvent( event ); 144 insertEvent( event );
145 145
146 event->registerObserver( this ); 146 event->registerObserver( this );
147 147
148 setModified( true ); 148 setModified( true );
149 149
150 return true; 150 return true;
151} 151}
152 152
153void CalendarLocal::deleteEvent( Event *event ) 153void CalendarLocal::deleteEvent( Event *event )
154{ 154{
155 155
156 156
157 if ( mEventList.removeRef( event ) ) { 157 if ( mEventList.removeRef( event ) ) {
158 setModified( true ); 158 setModified( true );
159 } 159 }
160} 160}
161 161
162 162
163Event *CalendarLocal::event( const QString &uid ) 163Event *CalendarLocal::event( const QString &uid )
164{ 164{
165 165
166 Event *event; 166 Event *event;
167 167
168 for ( event = mEventList.first(); event; event = mEventList.next() ) { 168 for ( event = mEventList.first(); event; event = mEventList.next() ) {
169 if ( event->uid() == uid ) { 169 if ( event->uid() == uid ) {
170 return event; 170 return event;
171 } 171 }
172 } 172 }
173 173
174 return 0; 174 return 0;
175} 175}
176bool CalendarLocal::addTodoNoDup( Todo *todo ) 176bool CalendarLocal::addTodoNoDup( Todo *todo )
177{ 177{
178 Todo * eve; 178 Todo * eve;
179 for ( eve = mTodoList.first(); eve ; eve = mTodoList.next() ) { 179 for ( eve = mTodoList.first(); eve ; eve = mTodoList.next() ) {
180 if ( *eve == *todo ) { 180 if ( *eve == *todo ) {
181 //qDebug("duplicate todo found! not inserted! "); 181 //qDebug("duplicate todo found! not inserted! ");
182 return false; 182 return false;
183 } 183 }
184 } 184 }
185 return addTodo( todo ); 185 return addTodo( todo );
186} 186}
187bool CalendarLocal::addTodo( Todo *todo ) 187bool CalendarLocal::addTodo( Todo *todo )
188{ 188{
189 mTodoList.append( todo ); 189 mTodoList.append( todo );
190 190
191 todo->registerObserver( this ); 191 todo->registerObserver( this );
192 192
193 // Set up subtask relations 193 // Set up subtask relations
194 setupRelations( todo ); 194 setupRelations( todo );
195 195
196 setModified( true ); 196 setModified( true );
197 197
198 return true; 198 return true;
199} 199}
200 200
201void CalendarLocal::deleteTodo( Todo *todo ) 201void CalendarLocal::deleteTodo( Todo *todo )
202{ 202{
203 // Handle orphaned children 203 // Handle orphaned children
204 removeRelations( todo ); 204 removeRelations( todo );
205 205
206 if ( mTodoList.removeRef( todo ) ) { 206 if ( mTodoList.removeRef( todo ) ) {
207 setModified( true ); 207 setModified( true );
208 } 208 }
209} 209}
210 210
211QPtrList<Todo> CalendarLocal::rawTodos() 211QPtrList<Todo> CalendarLocal::rawTodos()
212{ 212{
213 return mTodoList; 213 return mTodoList;
214} 214}
215Todo *CalendarLocal::todo( QString syncProf, int id ) 215Todo *CalendarLocal::todo( QString syncProf, QString id )
216{ 216{
217 Todo *todo; 217 Todo *todo;
218 for ( todo = mTodoList.first(); todo; todo = mTodoList.next() ) { 218 for ( todo = mTodoList.first(); todo; todo = mTodoList.next() ) {
219 if ( todo->getID( syncProf ) == id ) return todo; 219 if ( todo->getID( syncProf ) == id ) return todo;
220 } 220 }
221 221
222 return 0; 222 return 0;
223} 223}
224 224
225QPtrList<Event> CalendarLocal::getExternLastSyncEvents() 225QPtrList<Event> CalendarLocal::getExternLastSyncEvents()
226{ 226{
227 QPtrList<Event> el; 227 QPtrList<Event> el;
228 Event *todo; 228 Event *todo;
229 for ( todo = mEventList.first(); todo; todo = mEventList.next() ) { 229 for ( todo = mEventList.first(); todo; todo = mEventList.next() ) {
230 if ( todo->uid().left( 15 ) == QString("last-syncEvent-") ) 230 if ( todo->uid().left( 15 ) == QString("last-syncEvent-") )
231 if ( todo->summary().left(3) == "E: " ) 231 if ( todo->summary().left(3) == "E: " )
232 el.append( todo ); 232 el.append( todo );
233 } 233 }
234 234
235 return el; 235 return el;
236 236
237} 237}
238Event *CalendarLocal::event( QString syncProf, int id ) 238Event *CalendarLocal::event( QString syncProf, QString id )
239{ 239{
240 Event *todo; 240 Event *todo;
241 for ( todo = mEventList.first(); todo; todo = mEventList.next() ) { 241 for ( todo = mEventList.first(); todo; todo = mEventList.next() ) {
242 if ( todo->getID( syncProf ) == id ) return todo; 242 if ( todo->getID( syncProf ) == id ) return todo;
243 } 243 }
244 244
245 return 0; 245 return 0;
246} 246}
247Todo *CalendarLocal::todo( const QString &uid ) 247Todo *CalendarLocal::todo( const QString &uid )
248{ 248{
249 Todo *todo; 249 Todo *todo;
250 for ( todo = mTodoList.first(); todo; todo = mTodoList.next() ) { 250 for ( todo = mTodoList.first(); todo; todo = mTodoList.next() ) {
251 if ( todo->uid() == uid ) return todo; 251 if ( todo->uid() == uid ) return todo;
252 } 252 }
253 253
254 return 0; 254 return 0;
255} 255}
256QString CalendarLocal::nextSummary() const 256QString CalendarLocal::nextSummary() const
257{ 257{
258 return mNextSummary; 258 return mNextSummary;
259} 259}
260QDateTime CalendarLocal::nextAlarmEventDateTime() const 260QDateTime CalendarLocal::nextAlarmEventDateTime() const
261{ 261{
262 return mNextAlarmEventDateTime; 262 return mNextAlarmEventDateTime;
263} 263}
264void CalendarLocal::checkAlarmForIncidence( Incidence * incidence, bool deleted) 264void CalendarLocal::checkAlarmForIncidence( Incidence * incidence, bool deleted)
265{ 265{
266 //mNextAlarmIncidence 266 //mNextAlarmIncidence
267 //mNextAlarmDateTime 267 //mNextAlarmDateTime
268 //return mNextSummary; 268 //return mNextSummary;
269 //return mNextAlarmEventDateTime; 269 //return mNextAlarmEventDateTime;
270 bool newNextAlarm = false; 270 bool newNextAlarm = false;
271 bool computeNextAlarm = false; 271 bool computeNextAlarm = false;
272 bool ok; 272 bool ok;
273 int offset; 273 int offset;
274 QDateTime nextA; 274 QDateTime nextA;
275 // QString nextSum; 275 // QString nextSum;
276 //QDateTime nextEvent; 276 //QDateTime nextEvent;
277 if ( mNextAlarmIncidence == 0 || incidence == 0 ) { 277 if ( mNextAlarmIncidence == 0 || incidence == 0 ) {
278 computeNextAlarm = true; 278 computeNextAlarm = true;
279 } else { 279 } else {
280 if ( ! deleted ) { 280 if ( ! deleted ) {
281 nextA = incidence->getNextAlarmDateTime(& ok, &offset ) ; 281 nextA = incidence->getNextAlarmDateTime(& ok, &offset ) ;
282 if ( ok ) { 282 if ( ok ) {
283 if ( nextA < mNextAlarmDateTime ) { 283 if ( nextA < mNextAlarmDateTime ) {
284 deRegisterAlarm(); 284 deRegisterAlarm();
285 mNextAlarmDateTime = nextA; 285 mNextAlarmDateTime = nextA;
286 mNextSummary = incidence->summary(); 286 mNextSummary = incidence->summary();
287 mNextAlarmEventDateTime = nextA.addSecs(offset ) ; 287 mNextAlarmEventDateTime = nextA.addSecs(offset ) ;
288 mNextAlarmEventDateTimeString = KGlobal::locale()->formatDateTime(mNextAlarmEventDateTime); 288 mNextAlarmEventDateTimeString = KGlobal::locale()->formatDateTime(mNextAlarmEventDateTime);
289 newNextAlarm = true; 289 newNextAlarm = true;
290 mNextAlarmIncidence = incidence; 290 mNextAlarmIncidence = incidence;
291 } else { 291 } else {
292 if ( incidence == mNextAlarmIncidence ) { 292 if ( incidence == mNextAlarmIncidence ) {
293 computeNextAlarm = true; 293 computeNextAlarm = true;
294 } 294 }
295 } 295 }
296 } else { 296 } else {
297 if ( mNextAlarmIncidence == incidence ) { 297 if ( mNextAlarmIncidence == incidence ) {
298 computeNextAlarm = true; 298 computeNextAlarm = true;
299 } 299 }
300 } 300 }
301 } else { // deleted 301 } else { // deleted
302 if ( incidence == mNextAlarmIncidence ) { 302 if ( incidence == mNextAlarmIncidence ) {
303 computeNextAlarm = true; 303 computeNextAlarm = true;
304 } 304 }
305 } 305 }
306 } 306 }
307 if ( computeNextAlarm ) { 307 if ( computeNextAlarm ) {
308 deRegisterAlarm(); 308 deRegisterAlarm();
309 nextA = nextAlarm( 1000 ); 309 nextA = nextAlarm( 1000 );
310 if (! mNextAlarmIncidence ) { 310 if (! mNextAlarmIncidence ) {
311 return; 311 return;
312 } 312 }
313 newNextAlarm = true; 313 newNextAlarm = true;
314 } 314 }
315 if ( newNextAlarm ) 315 if ( newNextAlarm )
316 registerAlarm(); 316 registerAlarm();
317} 317}
318QString CalendarLocal:: getAlarmNotification() 318QString CalendarLocal:: getAlarmNotification()
319{ 319{
320 QString ret; 320 QString ret;
321 // this should not happen 321 // this should not happen
322 if (! mNextAlarmIncidence ) 322 if (! mNextAlarmIncidence )
323 return "cal_alarm"+ mNextSummary.left( 25 )+"\n"+mNextAlarmEventDateTimeString; 323 return "cal_alarm"+ mNextSummary.left( 25 )+"\n"+mNextAlarmEventDateTimeString;
324 Alarm* alarm = mNextAlarmIncidence->alarms().first(); 324 Alarm* alarm = mNextAlarmIncidence->alarms().first();
325 if ( alarm->type() == Alarm::Procedure ) { 325 if ( alarm->type() == Alarm::Procedure ) {
326 ret = "proc_alarm" + alarm->programFile()+"+++"; 326 ret = "proc_alarm" + alarm->programFile()+"+++";
327 } else { 327 } else {
328 ret = "audio_alarm" +alarm->audioFile() +"+++"; 328 ret = "audio_alarm" +alarm->audioFile() +"+++";
329 } 329 }
330 ret += "cal_alarm"+ mNextSummary.left( 25 ); 330 ret += "cal_alarm"+ mNextSummary.left( 25 );
331 if ( mNextSummary.length() > 25 ) 331 if ( mNextSummary.length() > 25 )
332 ret += "\n" + mNextSummary.mid(25, 25 ); 332 ret += "\n" + mNextSummary.mid(25, 25 );
333 ret+= "\n"+mNextAlarmEventDateTimeString; 333 ret+= "\n"+mNextAlarmEventDateTimeString;
334 return ret; 334 return ret;
335} 335}
336void CalendarLocal::registerAlarm() 336void CalendarLocal::registerAlarm()
337{ 337{
338 mLastAlarmNotificationString = getAlarmNotification(); 338 mLastAlarmNotificationString = getAlarmNotification();
339 // qDebug("++ register Alarm %s %s",mNextAlarmDateTime.toString().latin1(), mLastAlarmNotificationString.latin1() ); 339 // qDebug("++ register Alarm %s %s",mNextAlarmDateTime.toString().latin1(), mLastAlarmNotificationString.latin1() );
340 emit addAlarm ( mNextAlarmDateTime, mLastAlarmNotificationString ); 340 emit addAlarm ( mNextAlarmDateTime, mLastAlarmNotificationString );
341// #ifndef DESKTOP_VERSION 341// #ifndef DESKTOP_VERSION
342// AlarmServer::addAlarm ( mNextAlarmDateTime,"koalarm", mLastAlarmNotificationString.latin1() ); 342// AlarmServer::addAlarm ( mNextAlarmDateTime,"koalarm", mLastAlarmNotificationString.latin1() );
343// #endif 343// #endif
344} 344}
345void CalendarLocal::deRegisterAlarm() 345void CalendarLocal::deRegisterAlarm()
346{ 346{
347 if ( mLastAlarmNotificationString.isNull() ) 347 if ( mLastAlarmNotificationString.isNull() )
348 return; 348 return;
349 //qDebug("-- deregister Alarm %s ", mLastAlarmNotificationString.latin1() ); 349 //qDebug("-- deregister Alarm %s ", mLastAlarmNotificationString.latin1() );
350 350
351 emit removeAlarm ( mNextAlarmDateTime, mLastAlarmNotificationString ); 351 emit removeAlarm ( mNextAlarmDateTime, mLastAlarmNotificationString );
352// #ifndef DESKTOP_VERSION 352// #ifndef DESKTOP_VERSION
353// AlarmServer::deleteAlarm (mNextAlarmDateTime ,"koalarm" ,mLastAlarmNotificationString.latin1() ); 353// AlarmServer::deleteAlarm (mNextAlarmDateTime ,"koalarm" ,mLastAlarmNotificationString.latin1() );
354// #endif 354// #endif
355} 355}
356 356
357QPtrList<Todo> CalendarLocal::todos( const QDate &date ) 357QPtrList<Todo> CalendarLocal::todos( const QDate &date )
358{ 358{
359 QPtrList<Todo> todos; 359 QPtrList<Todo> todos;
360 360
361 Todo *todo; 361 Todo *todo;
362 for ( todo = mTodoList.first(); todo; todo = mTodoList.next() ) { 362 for ( todo = mTodoList.first(); todo; todo = mTodoList.next() ) {
363 if ( todo->hasDueDate() && todo->dtDue().date() == date ) { 363 if ( todo->hasDueDate() && todo->dtDue().date() == date ) {
364 todos.append( todo ); 364 todos.append( todo );
365 } 365 }
366 } 366 }
367 367
368 filter()->apply( &todos ); 368 filter()->apply( &todos );
369 return todos; 369 return todos;
370} 370}
371void CalendarLocal::reInitAlarmSettings() 371void CalendarLocal::reInitAlarmSettings()
372{ 372{
373 if ( !mNextAlarmIncidence ) { 373 if ( !mNextAlarmIncidence ) {
374 nextAlarm( 1000 ); 374 nextAlarm( 1000 );
375 } 375 }
376 deRegisterAlarm(); 376 deRegisterAlarm();
377 mNextAlarmIncidence = 0; 377 mNextAlarmIncidence = 0;
378 checkAlarmForIncidence( 0, false ); 378 checkAlarmForIncidence( 0, false );
379 379
380} 380}
381 381
382 382
383 383
384QDateTime CalendarLocal::nextAlarm( int daysTo ) 384QDateTime CalendarLocal::nextAlarm( int daysTo )
385{ 385{
386 QDateTime nextA = QDateTime::currentDateTime().addDays( daysTo ); 386 QDateTime nextA = QDateTime::currentDateTime().addDays( daysTo );
387 QDateTime start = QDateTime::currentDateTime().addSecs( 30 ); 387 QDateTime start = QDateTime::currentDateTime().addSecs( 30 );
388 QDateTime next; 388 QDateTime next;
389 Event *e; 389 Event *e;
390 bool ok; 390 bool ok;
391 bool found = false; 391 bool found = false;
392 int offset; 392 int offset;
393 mNextAlarmIncidence = 0; 393 mNextAlarmIncidence = 0;
394 for( e = mEventList.first(); e; e = mEventList.next() ) { 394 for( e = mEventList.first(); e; e = mEventList.next() ) {
395 next = e->getNextAlarmDateTime(& ok, &offset ) ; 395 next = e->getNextAlarmDateTime(& ok, &offset ) ;
396 if ( ok ) { 396 if ( ok ) {
397 if ( next < nextA ) { 397 if ( next < nextA ) {
398 nextA = next; 398 nextA = next;
399 found = true; 399 found = true;
400 mNextSummary = e->summary(); 400 mNextSummary = e->summary();
401 mNextAlarmEventDateTime = next.addSecs(offset ) ; 401 mNextAlarmEventDateTime = next.addSecs(offset ) ;
402 mNextAlarmIncidence = (Incidence *) e; 402 mNextAlarmIncidence = (Incidence *) e;
403 } 403 }
404 } 404 }
405 } 405 }
406 Todo *t; 406 Todo *t;
407 for( t = mTodoList.first(); t; t = mTodoList.next() ) { 407 for( t = mTodoList.first(); t; t = mTodoList.next() ) {
408 next = t->getNextAlarmDateTime(& ok, &offset ) ; 408 next = t->getNextAlarmDateTime(& ok, &offset ) ;
409 if ( ok ) { 409 if ( ok ) {
410 if ( next < nextA ) { 410 if ( next < nextA ) {
411 nextA = next; 411 nextA = next;
412 found = true; 412 found = true;
413 mNextSummary = t->summary(); 413 mNextSummary = t->summary();
414 mNextAlarmEventDateTime = next.addSecs(offset ); 414 mNextAlarmEventDateTime = next.addSecs(offset );
415 mNextAlarmIncidence = (Incidence *) t; 415 mNextAlarmIncidence = (Incidence *) t;
416 } 416 }
417 } 417 }
418 } 418 }
419 if ( mNextAlarmIncidence ) { 419 if ( mNextAlarmIncidence ) {
420 mNextAlarmEventDateTimeString = KGlobal::locale()->formatDateTime(mNextAlarmEventDateTime); 420 mNextAlarmEventDateTimeString = KGlobal::locale()->formatDateTime(mNextAlarmEventDateTime);
421 mNextAlarmDateTime = nextA; 421 mNextAlarmDateTime = nextA;
422 } 422 }
423 return nextA; 423 return nextA;
424} 424}
425Alarm::List CalendarLocal::alarmsTo( const QDateTime &to ) 425Alarm::List CalendarLocal::alarmsTo( const QDateTime &to )
426{ 426{
427 return alarms( QDateTime( QDate( 1900, 1, 1 ) ), to ); 427 return alarms( QDateTime( QDate( 1900, 1, 1 ) ), to );
428} 428}
429 429
430Alarm::List CalendarLocal::alarms( const QDateTime &from, const QDateTime &to ) 430Alarm::List CalendarLocal::alarms( const QDateTime &from, const QDateTime &to )
431{ 431{
432 kdDebug(5800) << "CalendarLocal::alarms(" << from.toString() << " - " 432 kdDebug(5800) << "CalendarLocal::alarms(" << from.toString() << " - "
433 << to.toString() << ")\n"; 433 << to.toString() << ")\n";
434 434
435 Alarm::List alarms; 435 Alarm::List alarms;
436 436
437 Event *e; 437 Event *e;
438 438
439 for( e = mEventList.first(); e; e = mEventList.next() ) { 439 for( e = mEventList.first(); e; e = mEventList.next() ) {
440 if ( e->doesRecur() ) appendRecurringAlarms( alarms, e, from, to ); 440 if ( e->doesRecur() ) appendRecurringAlarms( alarms, e, from, to );
441 else appendAlarms( alarms, e, from, to ); 441 else appendAlarms( alarms, e, from, to );
442 } 442 }
443 443
444 Todo *t; 444 Todo *t;
445 for( t = mTodoList.first(); t; t = mTodoList.next() ) { 445 for( t = mTodoList.first(); t; t = mTodoList.next() ) {
446 appendAlarms( alarms, t, from, to ); 446 appendAlarms( alarms, t, from, to );
447 } 447 }
448 448
449 return alarms; 449 return alarms;
450} 450}
451 451
452void CalendarLocal::appendAlarms( Alarm::List &alarms, Incidence *incidence, 452void CalendarLocal::appendAlarms( Alarm::List &alarms, Incidence *incidence,
453 const QDateTime &from, const QDateTime &to ) 453 const QDateTime &from, const QDateTime &to )
454{ 454{
455 QPtrList<Alarm> alarmList = incidence->alarms(); 455 QPtrList<Alarm> alarmList = incidence->alarms();
456 Alarm *alarm; 456 Alarm *alarm;
457 for( alarm = alarmList.first(); alarm; alarm = alarmList.next() ) { 457 for( alarm = alarmList.first(); alarm; alarm = alarmList.next() ) {
458// kdDebug(5800) << "CalendarLocal::appendAlarms() '" << alarm->text() 458// kdDebug(5800) << "CalendarLocal::appendAlarms() '" << alarm->text()
459// << "': " << alarm->time().toString() << " - " << alarm->enabled() << endl; 459// << "': " << alarm->time().toString() << " - " << alarm->enabled() << endl;
460 if ( alarm->enabled() ) { 460 if ( alarm->enabled() ) {
461 if ( alarm->time() >= from && alarm->time() <= to ) { 461 if ( alarm->time() >= from && alarm->time() <= to ) {
462 kdDebug(5800) << "CalendarLocal::appendAlarms() '" << incidence->summary() 462 kdDebug(5800) << "CalendarLocal::appendAlarms() '" << incidence->summary()
463 << "': " << alarm->time().toString() << endl; 463 << "': " << alarm->time().toString() << endl;
464 alarms.append( alarm ); 464 alarms.append( alarm );
465 } 465 }
466 } 466 }
467 } 467 }
468} 468}
469 469
470void CalendarLocal::appendRecurringAlarms( Alarm::List &alarms, 470void CalendarLocal::appendRecurringAlarms( Alarm::List &alarms,
471 Incidence *incidence, 471 Incidence *incidence,
472 const QDateTime &from, 472 const QDateTime &from,
473 const QDateTime &to ) 473 const QDateTime &to )
474{ 474{
475 475
476 QPtrList<Alarm> alarmList = incidence->alarms(); 476 QPtrList<Alarm> alarmList = incidence->alarms();
477 Alarm *alarm; 477 Alarm *alarm;
478 QDateTime qdt; 478 QDateTime qdt;
479 for( alarm = alarmList.first(); alarm; alarm = alarmList.next() ) { 479 for( alarm = alarmList.first(); alarm; alarm = alarmList.next() ) {
480 if (incidence->recursOn(from.date())) { 480 if (incidence->recursOn(from.date())) {
481 qdt.setTime(alarm->time().time()); 481 qdt.setTime(alarm->time().time());
482 qdt.setDate(from.date()); 482 qdt.setDate(from.date());
483 } 483 }
484 else qdt = alarm->time(); 484 else qdt = alarm->time();
485 // qDebug("1 %s %s %s", qdt.toString().latin1(), from.toString().latin1(), to.toString().latin1()); 485 // qDebug("1 %s %s %s", qdt.toString().latin1(), from.toString().latin1(), to.toString().latin1());
486 if ( alarm->enabled() ) { 486 if ( alarm->enabled() ) {
487 if ( qdt >= from && qdt <= to ) { 487 if ( qdt >= from && qdt <= to ) {
488 alarms.append( alarm ); 488 alarms.append( alarm );
489 } 489 }
490 } 490 }
491 } 491 }
492} 492}
493 493
494 494
495/****************************** PROTECTED METHODS ****************************/ 495/****************************** PROTECTED METHODS ****************************/
496 496
497// after changes are made to an event, this should be called. 497// after changes are made to an event, this should be called.
498void CalendarLocal::update( IncidenceBase *incidence ) 498void CalendarLocal::update( IncidenceBase *incidence )
499{ 499{
500 incidence->setSyncStatus( Event::SYNCMOD ); 500 incidence->setSyncStatus( Event::SYNCMOD );
501 incidence->setLastModified( QDateTime::currentDateTime() ); 501 incidence->setLastModified( QDateTime::currentDateTime() );
502 // we should probably update the revision number here, 502 // we should probably update the revision number here,
503 // or internally in the Event itself when certain things change. 503 // or internally in the Event itself when certain things change.
504 // need to verify with ical documentation. 504 // need to verify with ical documentation.
505 505
506 setModified( true ); 506 setModified( true );
507} 507}
508 508
509void CalendarLocal::insertEvent( Event *event ) 509void CalendarLocal::insertEvent( Event *event )
510{ 510{
511 if ( mEventList.findRef( event ) < 0 ) mEventList.append( event ); 511 if ( mEventList.findRef( event ) < 0 ) mEventList.append( event );
512} 512}
513 513
514 514
515QPtrList<Event> CalendarLocal::rawEventsForDate( const QDate &qd, bool sorted ) 515QPtrList<Event> CalendarLocal::rawEventsForDate( const QDate &qd, bool sorted )
516{ 516{
517 QPtrList<Event> eventList; 517 QPtrList<Event> eventList;
518 518
519 Event *event; 519 Event *event;
520 for( event = mEventList.first(); event; event = mEventList.next() ) { 520 for( event = mEventList.first(); event; event = mEventList.next() ) {
521 if ( event->doesRecur() ) { 521 if ( event->doesRecur() ) {
522 if ( event->isMultiDay() ) { 522 if ( event->isMultiDay() ) {
523 int extraDays = event->dtStart().date().daysTo( event->dtEnd().date() ); 523 int extraDays = event->dtStart().date().daysTo( event->dtEnd().date() );
524 int i; 524 int i;
525 for ( i = 0; i <= extraDays; i++ ) { 525 for ( i = 0; i <= extraDays; i++ ) {
526 if ( event->recursOn( qd.addDays( -i ) ) ) { 526 if ( event->recursOn( qd.addDays( -i ) ) ) {
527 eventList.append( event ); 527 eventList.append( event );
528 break; 528 break;
529 } 529 }
530 } 530 }
531 } else { 531 } else {
532 if ( event->recursOn( qd ) ) 532 if ( event->recursOn( qd ) )
533 eventList.append( event ); 533 eventList.append( event );
534 } 534 }
535 } else { 535 } else {
536 if ( event->dtStart().date() <= qd && event->dtEnd().date() >= qd ) { 536 if ( event->dtStart().date() <= qd && event->dtEnd().date() >= qd ) {
537 eventList.append( event ); 537 eventList.append( event );
538 } 538 }
539 } 539 }
540 } 540 }
541 541
542 if ( !sorted ) { 542 if ( !sorted ) {
543 return eventList; 543 return eventList;
544 } 544 }
545 545
546 // kdDebug(5800) << "Sorting events for date\n" << endl; 546 // kdDebug(5800) << "Sorting events for date\n" << endl;
547 // now, we have to sort it based on dtStart.time() 547 // now, we have to sort it based on dtStart.time()
548 QPtrList<Event> eventListSorted; 548 QPtrList<Event> eventListSorted;
549 Event *sortEvent; 549 Event *sortEvent;
550 for ( event = eventList.first(); event; event = eventList.next() ) { 550 for ( event = eventList.first(); event; event = eventList.next() ) {
551 sortEvent = eventListSorted.first(); 551 sortEvent = eventListSorted.first();
552 int i = 0; 552 int i = 0;
553 while ( sortEvent && event->dtStart().time()>=sortEvent->dtStart().time() ) 553 while ( sortEvent && event->dtStart().time()>=sortEvent->dtStart().time() )
554 { 554 {
555 i++; 555 i++;
556 sortEvent = eventListSorted.next(); 556 sortEvent = eventListSorted.next();
557 } 557 }
558 eventListSorted.insert( i, event ); 558 eventListSorted.insert( i, event );
559 } 559 }
560 return eventListSorted; 560 return eventListSorted;
561} 561}
562 562
563 563
564QPtrList<Event> CalendarLocal::rawEvents( const QDate &start, const QDate &end, 564QPtrList<Event> CalendarLocal::rawEvents( const QDate &start, const QDate &end,
565 bool inclusive ) 565 bool inclusive )
566{ 566{
567 Event *event = 0; 567 Event *event = 0;
568 568
569 QPtrList<Event> eventList; 569 QPtrList<Event> eventList;
570 570
571 // Get non-recurring events 571 // Get non-recurring events
572 for( event = mEventList.first(); event; event = mEventList.next() ) { 572 for( event = mEventList.first(); event; event = mEventList.next() ) {
573 if ( event->doesRecur() ) { 573 if ( event->doesRecur() ) {
574 QDate rStart = event->dtStart().date(); 574 QDate rStart = event->dtStart().date();
575 bool found = false; 575 bool found = false;
576 if ( inclusive ) { 576 if ( inclusive ) {
577 if ( rStart >= start && rStart <= end ) { 577 if ( rStart >= start && rStart <= end ) {
578 // Start date of event is in range. Now check for end date. 578 // Start date of event is in range. Now check for end date.
579 // if duration is negative, event recurs forever, so do not include it. 579 // if duration is negative, event recurs forever, so do not include it.
580 if ( event->recurrence()->duration() == 0 ) { // End date set 580 if ( event->recurrence()->duration() == 0 ) { // End date set
581 QDate rEnd = event->recurrence()->endDate(); 581 QDate rEnd = event->recurrence()->endDate();
582 if ( rEnd >= start && rEnd <= end ) { // End date within range 582 if ( rEnd >= start && rEnd <= end ) { // End date within range
583 found = true; 583 found = true;
584 } 584 }
585 } else if ( event->recurrence()->duration() > 0 ) { // Duration set 585 } else if ( event->recurrence()->duration() > 0 ) { // Duration set
586 // TODO: Calculate end date from duration. Should be done in Event 586 // TODO: Calculate end date from duration. Should be done in Event
587 // For now exclude all events with a duration. 587 // For now exclude all events with a duration.
588 } 588 }
589 } 589 }
590 } else { 590 } else {
591 bool founOne; 591 bool founOne;
592 QDate next = event->getNextOccurence( start, &founOne ).date(); 592 QDate next = event->getNextOccurence( start, &founOne ).date();
593 if ( founOne ) { 593 if ( founOne ) {
594 if ( next <= end ) { 594 if ( next <= end ) {
595 found = true; 595 found = true;
596 } 596 }
597 } 597 }
598 598
599 /* 599 /*
600 // crap !!! 600 // crap !!!
601 if ( rStart <= end ) { // Start date not after range 601 if ( rStart <= end ) { // Start date not after range
602 if ( rStart >= start ) { // Start date within range 602 if ( rStart >= start ) { // Start date within range
603 found = true; 603 found = true;
604 } else if ( event->recurrence()->duration() == -1 ) { // Recurs forever 604 } else if ( event->recurrence()->duration() == -1 ) { // Recurs forever
605 found = true; 605 found = true;
606 } else if ( event->recurrence()->duration() == 0 ) { // End date set 606 } else if ( event->recurrence()->duration() == 0 ) { // End date set
607 QDate rEnd = event->recurrence()->endDate(); 607 QDate rEnd = event->recurrence()->endDate();
608 if ( rEnd >= start && rEnd <= end ) { // End date within range 608 if ( rEnd >= start && rEnd <= end ) { // End date within range
609 found = true; 609 found = true;
610 } 610 }
611 } else { // Duration set 611 } else { // Duration set
612 // TODO: Calculate end date from duration. Should be done in Event 612 // TODO: Calculate end date from duration. Should be done in Event
613 // For now include all events with a duration. 613 // For now include all events with a duration.
614 found = true; 614 found = true;
615 } 615 }
616 } 616 }
617 */ 617 */
618 618
619 } 619 }
620 620
621 if ( found ) eventList.append( event ); 621 if ( found ) eventList.append( event );
622 } else { 622 } else {
623 QDate s = event->dtStart().date(); 623 QDate s = event->dtStart().date();
624 QDate e = event->dtEnd().date(); 624 QDate e = event->dtEnd().date();
625 625
626 if ( inclusive ) { 626 if ( inclusive ) {
627 if ( s >= start && e <= end ) { 627 if ( s >= start && e <= end ) {
628 eventList.append( event ); 628 eventList.append( event );
629 } 629 }
630 } else { 630 } else {
631 if ( ( s >= start && s <= end ) || ( e >= start && e <= end ) ) { 631 if ( ( s >= start && s <= end ) || ( e >= start && e <= end ) ) {
632 eventList.append( event ); 632 eventList.append( event );
633 } 633 }
634 } 634 }
635 } 635 }
636 } 636 }
637 637
638 return eventList; 638 return eventList;
639} 639}
640 640
641QPtrList<Event> CalendarLocal::rawEventsForDate( const QDateTime &qdt ) 641QPtrList<Event> CalendarLocal::rawEventsForDate( const QDateTime &qdt )
642{ 642{
643 return rawEventsForDate( qdt.date() ); 643 return rawEventsForDate( qdt.date() );
644} 644}
645 645
646QPtrList<Event> CalendarLocal::rawEvents() 646QPtrList<Event> CalendarLocal::rawEvents()
647{ 647{
648 return mEventList; 648 return mEventList;
649} 649}
650 650
651bool CalendarLocal::addJournal(Journal *journal) 651bool CalendarLocal::addJournal(Journal *journal)
652{ 652{
653 if ( journal->dtStart().isValid()) 653 if ( journal->dtStart().isValid())
654 kdDebug(5800) << "Adding Journal on " << journal->dtStart().toString() << endl; 654 kdDebug(5800) << "Adding Journal on " << journal->dtStart().toString() << endl;
655 else 655 else
656 kdDebug(5800) << "Adding Journal without a DTSTART" << endl; 656 kdDebug(5800) << "Adding Journal without a DTSTART" << endl;
657 657
658 mJournalList.append(journal); 658 mJournalList.append(journal);
659 659
660 journal->registerObserver( this ); 660 journal->registerObserver( this );
661 661
662 setModified( true ); 662 setModified( true );
663 663
664 return true; 664 return true;
665} 665}
666 666
667void CalendarLocal::deleteJournal( Journal *journal ) 667void CalendarLocal::deleteJournal( Journal *journal )
668{ 668{
669 if ( mJournalList.removeRef(journal) ) { 669 if ( mJournalList.removeRef(journal) ) {
670 setModified( true ); 670 setModified( true );
671 } 671 }
672} 672}
673 673
674Journal *CalendarLocal::journal( const QDate &date ) 674Journal *CalendarLocal::journal( const QDate &date )
675{ 675{
676// kdDebug(5800) << "CalendarLocal::journal() " << date.toString() << endl; 676// kdDebug(5800) << "CalendarLocal::journal() " << date.toString() << endl;
677 677
678 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() ) 678 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() )
679 if ( it->dtStart().date() == date ) 679 if ( it->dtStart().date() == date )
680 return it; 680 return it;
681 681
682 return 0; 682 return 0;
683} 683}
684 684
685Journal *CalendarLocal::journal( const QString &uid ) 685Journal *CalendarLocal::journal( const QString &uid )
686{ 686{
687 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() ) 687 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() )
688 if ( it->uid() == uid ) 688 if ( it->uid() == uid )
689 return it; 689 return it;
690 690
691 return 0; 691 return 0;
692} 692}
693 693
694QPtrList<Journal> CalendarLocal::journals() 694QPtrList<Journal> CalendarLocal::journals()
695{ 695{
696 return mJournalList; 696 return mJournalList;
697} 697}
698 698
diff --git a/libkcal/calendarlocal.h b/libkcal/calendarlocal.h
index 4728063..5b6c64c 100644
--- a/libkcal/calendarlocal.h
+++ b/libkcal/calendarlocal.h
@@ -1,217 +1,217 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 3
4 Copyright (c) 1998 Preston Brown 4 Copyright (c) 1998 Preston Brown
5 Copyright (c) 2001,2003 Cornelius Schumacher <schumacher@kde.org> 5 Copyright (c) 2001,2003 Cornelius Schumacher <schumacher@kde.org>
6 6
7 This library is free software; you can redistribute it and/or 7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Library General Public 8 modify it under the terms of the GNU Library General Public
9 License as published by the Free Software Foundation; either 9 License as published by the Free Software Foundation; either
10 version 2 of the License, or (at your option) any later version. 10 version 2 of the License, or (at your option) any later version.
11 11
12 This library is distributed in the hope that it will be useful, 12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Library General Public License for more details. 15 Library General Public License for more details.
16 16
17 You should have received a copy of the GNU Library General Public License 17 You should have received a copy of the GNU Library General Public License
18 along with this library; see the file COPYING.LIB. If not, write to 18 along with this library; see the file COPYING.LIB. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. 20 Boston, MA 02111-1307, USA.
21*/ 21*/
22#ifndef KCAL_CALENDARLOCAL_H 22#ifndef KCAL_CALENDARLOCAL_H
23#define KCAL_CALENDARLOCAL_H 23#define KCAL_CALENDARLOCAL_H
24 24
25#include "calendar.h" 25#include "calendar.h"
26 26
27namespace KCal { 27namespace KCal {
28 28
29class CalFormat; 29class CalFormat;
30 30
31/** 31/**
32 This class provides a calendar stored as a local file. 32 This class provides a calendar stored as a local file.
33*/ 33*/
34class CalendarLocal : public Calendar 34class CalendarLocal : public Calendar
35{ 35{
36 public: 36 public:
37 /** 37 /**
38 Constructs a new calendar, with variables initialized to sane values. 38 Constructs a new calendar, with variables initialized to sane values.
39 */ 39 */
40 CalendarLocal(); 40 CalendarLocal();
41 /** 41 /**
42 Constructs a new calendar, with variables initialized to sane values. 42 Constructs a new calendar, with variables initialized to sane values.
43 */ 43 */
44 CalendarLocal( const QString &timeZoneId ); 44 CalendarLocal( const QString &timeZoneId );
45 ~CalendarLocal(); 45 ~CalendarLocal();
46 46
47 /** 47 /**
48 Loads a calendar on disk in vCalendar or iCalendar format into the current 48 Loads a calendar on disk in vCalendar or iCalendar format into the current
49 calendar. Any information already present is lost. 49 calendar. Any information already present is lost.
50 @return true, if successfull, false on error. 50 @return true, if successfull, false on error.
51 @param fileName the name of the calendar on disk. 51 @param fileName the name of the calendar on disk.
52 */ 52 */
53 bool load( const QString &fileName ); 53 bool load( const QString &fileName );
54 /** 54 /**
55 Writes out the calendar to disk in the specified \a format. 55 Writes out the calendar to disk in the specified \a format.
56 CalendarLocal takes ownership of the CalFormat object. 56 CalendarLocal takes ownership of the CalFormat object.
57 @return true, if successfull, false on error. 57 @return true, if successfull, false on error.
58 @param fileName the name of the file 58 @param fileName the name of the file
59 */ 59 */
60 bool save( const QString &fileName, CalFormat *format = 0 ); 60 bool save( const QString &fileName, CalFormat *format = 0 );
61 61
62 /** 62 /**
63 Clears out the current calendar, freeing all used memory etc. etc. 63 Clears out the current calendar, freeing all used memory etc. etc.
64 */ 64 */
65 void close(); 65 void close();
66 66
67 void save() {} 67 void save() {}
68 68
69 /** 69 /**
70 Add Event to calendar. 70 Add Event to calendar.
71 */ 71 */
72 bool addAnniversaryNoDup( Event *event ); 72 bool addAnniversaryNoDup( Event *event );
73 bool addEventNoDup( Event *event ); 73 bool addEventNoDup( Event *event );
74 bool addEvent( Event *event ); 74 bool addEvent( Event *event );
75 /** 75 /**
76 Deletes an event from this calendar. 76 Deletes an event from this calendar.
77 */ 77 */
78 void deleteEvent( Event *event ); 78 void deleteEvent( Event *event );
79 79
80 /** 80 /**
81 Retrieves an event on the basis of the unique string ID. 81 Retrieves an event on the basis of the unique string ID.
82 */ 82 */
83 Event *event( const QString &uid ); 83 Event *event( const QString &uid );
84 /** 84 /**
85 Return unfiltered list of all events in calendar. 85 Return unfiltered list of all events in calendar.
86 */ 86 */
87 QPtrList<Event> rawEvents(); 87 QPtrList<Event> rawEvents();
88 QPtrList<Event> getExternLastSyncEvents(); 88 QPtrList<Event> getExternLastSyncEvents();
89 /** 89 /**
90 Add a todo to the todolist. 90 Add a todo to the todolist.
91 */ 91 */
92 bool addTodo( Todo *todo ); 92 bool addTodo( Todo *todo );
93 bool addTodoNoDup( Todo *todo ); 93 bool addTodoNoDup( Todo *todo );
94 /** 94 /**
95 Remove a todo from the todolist. 95 Remove a todo from the todolist.
96 */ 96 */
97 void deleteTodo( Todo * ); 97 void deleteTodo( Todo * );
98 /** 98 /**
99 Searches todolist for an event with this unique string identifier, 99 Searches todolist for an event with this unique string identifier,
100 returns a pointer or null. 100 returns a pointer or null.
101 */ 101 */
102 Todo *todo( const QString &uid ); 102 Todo *todo( const QString &uid );
103 /** 103 /**
104 Return list of all todos. 104 Return list of all todos.
105 */ 105 */
106 QPtrList<Todo> rawTodos(); 106 QPtrList<Todo> rawTodos();
107 /** 107 /**
108 Returns list of todos due on the specified date. 108 Returns list of todos due on the specified date.
109 */ 109 */
110 QPtrList<Todo> todos( const QDate &date ); 110 QPtrList<Todo> todos( const QDate &date );
111 /** 111 /**
112 Return list of all todos. 112 Return list of all todos.
113 113
114 Workaround because compiler does not recognize function of base class. 114 Workaround because compiler does not recognize function of base class.
115 */ 115 */
116 QPtrList<Todo> todos() { return Calendar::todos(); } 116 QPtrList<Todo> todos() { return Calendar::todos(); }
117 117
118 /** 118 /**
119 Add a Journal entry to calendar. 119 Add a Journal entry to calendar.
120 */ 120 */
121 bool addJournal( Journal * ); 121 bool addJournal( Journal * );
122 /** 122 /**
123 Remove a Journal from the calendar. 123 Remove a Journal from the calendar.
124 */ 124 */
125 void deleteJournal( Journal * ); 125 void deleteJournal( Journal * );
126 /** 126 /**
127 Return Journal for given date. 127 Return Journal for given date.
128 */ 128 */
129 Journal *journal( const QDate & ); 129 Journal *journal( const QDate & );
130 /** 130 /**
131 Return Journal with given UID. 131 Return Journal with given UID.
132 */ 132 */
133 Journal *journal( const QString &uid ); 133 Journal *journal( const QString &uid );
134 /** 134 /**
135 Return list of all Journals stored in calendar. 135 Return list of all Journals stored in calendar.
136 */ 136 */
137 QPtrList<Journal> journals(); 137 QPtrList<Journal> journals();
138 138
139 /** 139 /**
140 Return all alarms, which ocur in the given time interval. 140 Return all alarms, which ocur in the given time interval.
141 */ 141 */
142 Alarm::List alarms( const QDateTime &from, const QDateTime &to ); 142 Alarm::List alarms( const QDateTime &from, const QDateTime &to );
143 143
144 /** 144 /**
145 Return all alarms, which ocur before given date. 145 Return all alarms, which ocur before given date.
146 */ 146 */
147 Alarm::List alarmsTo( const QDateTime &to ); 147 Alarm::List alarmsTo( const QDateTime &to );
148 148
149 QDateTime nextAlarm( int daysTo ) ; 149 QDateTime nextAlarm( int daysTo ) ;
150 QDateTime nextAlarmEventDateTime() const; 150 QDateTime nextAlarmEventDateTime() const;
151 void checkAlarmForIncidence( Incidence *, bool deleted ) ; 151 void checkAlarmForIncidence( Incidence *, bool deleted ) ;
152 void registerAlarm(); 152 void registerAlarm();
153 void deRegisterAlarm(); 153 void deRegisterAlarm();
154 QString getAlarmNotification(); 154 QString getAlarmNotification();
155 QString nextSummary() const ; 155 QString nextSummary() const ;
156 /** 156 /**
157 This method should be called whenever a Event is modified directly 157 This method should be called whenever a Event is modified directly
158 via it's pointer. It makes sure that the calendar is internally 158 via it's pointer. It makes sure that the calendar is internally
159 consistent. 159 consistent.
160 */ 160 */
161 void update( IncidenceBase *incidence ); 161 void update( IncidenceBase *incidence );
162 162
163 /** 163 /**
164 Builds and then returns a list of all events that match for the 164 Builds and then returns a list of all events that match for the
165 date specified. useful for dayView, etc. etc. 165 date specified. useful for dayView, etc. etc.
166 */ 166 */
167 QPtrList<Event> rawEventsForDate( const QDate &date, bool sorted = false ); 167 QPtrList<Event> rawEventsForDate( const QDate &date, bool sorted = false );
168 /** 168 /**
169 Get unfiltered events for date \a qdt. 169 Get unfiltered events for date \a qdt.
170 */ 170 */
171 QPtrList<Event> rawEventsForDate( const QDateTime &qdt ); 171 QPtrList<Event> rawEventsForDate( const QDateTime &qdt );
172 /** 172 /**
173 Get unfiltered events in a range of dates. If inclusive is set to true, 173 Get unfiltered events in a range of dates. If inclusive is set to true,
174 only events are returned, which are completely included in the range. 174 only events are returned, which are completely included in the range.
175 */ 175 */
176 QPtrList<Event> rawEvents( const QDate &start, const QDate &end, 176 QPtrList<Event> rawEvents( const QDate &start, const QDate &end,
177 bool inclusive = false ); 177 bool inclusive = false );
178 Todo *todo( QString, int uid ); 178 Todo *todo( QString, QString );
179 Event *event( QString,int uid ); 179 Event *event( QString, QString );
180 180
181 181
182 182
183 protected: 183 protected:
184 184
185 // Event* mNextAlarmEvent; 185 // Event* mNextAlarmEvent;
186 QString mNextSummary; 186 QString mNextSummary;
187 QString mNextAlarmEventDateTimeString; 187 QString mNextAlarmEventDateTimeString;
188 QString mLastAlarmNotificationString; 188 QString mLastAlarmNotificationString;
189 QDateTime mNextAlarmEventDateTime; 189 QDateTime mNextAlarmEventDateTime;
190 QDateTime mNextAlarmDateTime; 190 QDateTime mNextAlarmDateTime;
191 void reInitAlarmSettings(); 191 void reInitAlarmSettings();
192 192
193 /** Notification function of IncidenceBase::Observer. */ 193 /** Notification function of IncidenceBase::Observer. */
194 void incidenceUpdated( IncidenceBase *i ) { update( i ); } 194 void incidenceUpdated( IncidenceBase *i ) { update( i ); }
195 195
196 /** inserts an event into its "proper place" in the calendar. */ 196 /** inserts an event into its "proper place" in the calendar. */
197 void insertEvent( Event *event ); 197 void insertEvent( Event *event );
198 198
199 /** Append alarms of incidence in interval to list of alarms. */ 199 /** Append alarms of incidence in interval to list of alarms. */
200 void appendAlarms( Alarm::List &alarms, Incidence *incidence, 200 void appendAlarms( Alarm::List &alarms, Incidence *incidence,
201 const QDateTime &from, const QDateTime &to ); 201 const QDateTime &from, const QDateTime &to );
202 202
203 /** Append alarms of recurring events in interval to list of alarms. */ 203 /** Append alarms of recurring events in interval to list of alarms. */
204 void appendRecurringAlarms( Alarm::List &alarms, Incidence *incidence, 204 void appendRecurringAlarms( Alarm::List &alarms, Incidence *incidence,
205 const QDateTime &from, const QDateTime &to ); 205 const QDateTime &from, const QDateTime &to );
206 206
207 private: 207 private:
208 void init(); 208 void init();
209 209
210 QPtrList<Event> mEventList; 210 QPtrList<Event> mEventList;
211 QPtrList<Todo> mTodoList; 211 QPtrList<Todo> mTodoList;
212 QPtrList<Journal> mJournalList; 212 QPtrList<Journal> mJournalList;
213}; 213};
214 214
215} 215}
216 216
217#endif 217#endif
diff --git a/libkcal/sharpformat.cpp b/libkcal/sharpformat.cpp
index e8934bf..ebfe164 100644
--- a/libkcal/sharpformat.cpp
+++ b/libkcal/sharpformat.cpp
@@ -1,1008 +1,1008 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 3
4 Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org> 4 Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
5 5
6 This library is free software; you can redistribute it and/or 6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public 7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either 8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version. 9 version 2 of the License, or (at your option) any later version.
10 10
11 This library is distributed in the hope that it will be useful, 11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details. 14 Library General Public License for more details.
15 15
16 You should have received a copy of the GNU Library General Public License 16 You should have received a copy of the GNU Library General Public License
17 along with this library; see the file COPYING.LIB. If not, write to 17 along with this library; see the file COPYING.LIB. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. 19 Boston, MA 02111-1307, USA.
20*/ 20*/
21 21
22#include <qdatetime.h> 22#include <qdatetime.h>
23#include <qstring.h> 23#include <qstring.h>
24#include <qapplication.h> 24#include <qapplication.h>
25#include <qptrlist.h> 25#include <qptrlist.h>
26#include <qregexp.h> 26#include <qregexp.h>
27#include <qmessagebox.h> 27#include <qmessagebox.h>
28#include <qclipboard.h> 28#include <qclipboard.h>
29#include <qfile.h> 29#include <qfile.h>
30#include <qtextstream.h> 30#include <qtextstream.h>
31#include <qtextcodec.h> 31#include <qtextcodec.h>
32#include <qxml.h> 32#include <qxml.h>
33#include <qlabel.h> 33#include <qlabel.h>
34 34
35#include <kdebug.h> 35#include <kdebug.h>
36#include <klocale.h> 36#include <klocale.h>
37#include <kglobal.h> 37#include <kglobal.h>
38 38
39#include "calendar.h" 39#include "calendar.h"
40#include "alarm.h" 40#include "alarm.h"
41#include "recurrence.h" 41#include "recurrence.h"
42#include "calendarlocal.h" 42#include "calendarlocal.h"
43 43
44#include "sharpformat.h" 44#include "sharpformat.h"
45#include "syncdefines.h" 45#include "syncdefines.h"
46 46
47using namespace KCal; 47using namespace KCal;
48 48
49//CARDID,CATEGORY,DSRP,PLCE,MEM1,TIM1,TIM2,ADAY,ARON,ARMN,ARSD,RTYP,RFRQ,RPOS,RDYS,REND,REDT,ALSD,ALED,MDAY 49//CARDID,CATEGORY,DSRP,PLCE,MEM1,TIM1,TIM2,ADAY,ARON,ARMN,ARSD,RTYP,RFRQ,RPOS,RDYS,REND,REDT,ALSD,ALED,MDAY
50// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 50// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
51 51
52//ARSD silentalarm = 0 52//ARSD silentalarm = 0
53// 11 RTYP 225 no /0 dialy/ 1 weekly/ 3 month by date/ 2 month by day(pos)/ yearly 53// 11 RTYP 225 no /0 dialy/ 1 weekly/ 3 month by date/ 2 month by day(pos)/ yearly
54// 12 RFRQ 54// 12 RFRQ
55// 13 RPOS pos = 4. monday in month 55// 13 RPOS pos = 4. monday in month
56// 14 RDYS days: 1 mon/ 2 tue .. 64 sun 56// 14 RDYS days: 1 mon/ 2 tue .. 64 sun
57// 15 REND 0 = no end/ 1 = end 57// 15 REND 0 = no end/ 1 = end
58// 16 REDT rec end dt 58// 16 REDT rec end dt
59//ALSD 59//ALSD
60//ALED 60//ALED
61//MDAY 61//MDAY
62 62
63class SharpParser : public QObject 63class SharpParser : public QObject
64{ 64{
65 public: 65 public:
66 SharpParser( Calendar *calendar ) : mCalendar( calendar ) { 66 SharpParser( Calendar *calendar ) : mCalendar( calendar ) {
67 oldCategories = 0; 67 oldCategories = 0;
68 } 68 }
69 69
70 bool startElement( Calendar *existingCalendar, const QStringList & attList, QString qName ) 70 bool startElement( Calendar *existingCalendar, const QStringList & attList, QString qName )
71 { 71 {
72 int i = 1; 72 int i = 1;
73 bool skip = true; 73 bool skip = true;
74 int max = attList.count() -2; 74 int max = attList.count() -2;
75 while ( i < max ) { 75 while ( i < max ) {
76 if ( !attList[i].isEmpty() ) { 76 if ( !attList[i].isEmpty() ) {
77 skip = false; 77 skip = false;
78 break; 78 break;
79 } 79 }
80 ++i ; 80 ++i ;
81 } 81 }
82 if ( skip ) 82 if ( skip )
83 return false; 83 return false;
84 ulong cSum = SharpFormat::getCsum(attList ); 84 ulong cSum = SharpFormat::getCsum(attList );
85 85
86 if ( qName == "Event" ) { 86 if ( qName == "Event" ) {
87 Event *event; 87 Event *event;
88 event = existingCalendar->event( "Sharp_DTM",attList[0].toInt() ); 88 event = existingCalendar->event( "Sharp_DTM",attList[0] );
89 if ( event ) 89 if ( event )
90 event = (Event*)event->clone(); 90 event = (Event*)event->clone();
91 else 91 else
92 event = new Event; 92 event = new Event;
93 event->setID("Sharp_DTM", attList[0] ); 93 event->setID("Sharp_DTM", attList[0] );
94 event->setCsum( "Sharp_DTM", QString::number( cSum )); 94 event->setCsum( "Sharp_DTM", QString::number( cSum ));
95 event->setTempSyncStat(SYNC_TEMPSTATE_NEW_EXTERNAL ); 95 event->setTempSyncStat(SYNC_TEMPSTATE_NEW_EXTERNAL );
96 96
97 event->setSummary( attList[2] ); 97 event->setSummary( attList[2] );
98 event->setLocation( attList[3] ); 98 event->setLocation( attList[3] );
99 event->setDescription( attList[4] ); 99 event->setDescription( attList[4] );
100 if ( attList[7] == "1" ) { 100 if ( attList[7] == "1" ) {
101 event->setDtStart( QDateTime(fromString( attList[17]+"000000", false ).date(),QTime(0,0,0 ) )); 101 event->setDtStart( QDateTime(fromString( attList[17]+"T000000", false ).date(),QTime(0,0,0 ) ));
102 event->setDtEnd( QDateTime(fromString( attList[18]+"000000", false ).date(),QTime(0,0,0 ))); 102 event->setDtEnd( QDateTime(fromString( attList[18]+"T000000", false ).date(),QTime(0,0,0 )));
103 event->setFloats( true ); 103 event->setFloats( true );
104 } else { 104 } else {
105 event->setFloats( false ); 105 event->setFloats( false );
106 event->setDtStart( fromString( attList[5] ) ); 106 event->setDtStart( fromString( attList[5] ) );
107 event->setDtEnd( fromString( attList[6] )); 107 event->setDtEnd( fromString( attList[6] ));
108 } 108 }
109 109
110 QString rtype = attList[11]; 110 QString rtype = attList[11];
111 if ( rtype != "255" ) { 111 if ( rtype != "255" ) {
112 // qDebug("recurs "); 112 // qDebug("recurs ");
113 QDate startDate = event->dtStart().date(); 113 QDate startDate = event->dtStart().date();
114 114
115 QString freqStr = attList[12]; 115 QString freqStr = attList[12];
116 int freq = freqStr.toInt(); 116 int freq = freqStr.toInt();
117 117
118 QString hasEndDateStr = attList[15] ; 118 QString hasEndDateStr = attList[15] ;
119 bool hasEndDate = hasEndDateStr == "1"; 119 bool hasEndDate = hasEndDateStr == "1";
120 120
121 QString endDateStr = attList[16]; 121 QString endDateStr = attList[16];
122 QDate endDate = fromString( endDateStr ).date(); 122 QDate endDate = fromString( endDateStr ).date();
123 123
124 QString weekDaysStr = attList[14]; 124 QString weekDaysStr = attList[14];
125 uint weekDaysNum = weekDaysStr.toInt(); 125 uint weekDaysNum = weekDaysStr.toInt();
126 126
127 QBitArray weekDays( 7 ); 127 QBitArray weekDays( 7 );
128 int i; 128 int i;
129 int bb = 1; 129 int bb = 1;
130 for( i = 1; i <= 7; ++i ) { 130 for( i = 1; i <= 7; ++i ) {
131 weekDays.setBit( i - 1, ( bb & weekDaysNum )); 131 weekDays.setBit( i - 1, ( bb & weekDaysNum ));
132 bb = 2 << (i-1); 132 bb = 2 << (i-1);
133 //qDebug(" %d bit %d ",i-1,weekDays.at(i-1) ); 133 //qDebug(" %d bit %d ",i-1,weekDays.at(i-1) );
134 } 134 }
135 // qDebug("next "); 135 // qDebug("next ");
136 QString posStr = attList[13]; 136 QString posStr = attList[13];
137 int pos = posStr.toInt(); 137 int pos = posStr.toInt();
138 Recurrence *r = event->recurrence(); 138 Recurrence *r = event->recurrence();
139 139
140 if ( rtype == "0" ) { 140 if ( rtype == "0" ) {
141 if ( hasEndDate ) r->setDaily( freq, endDate ); 141 if ( hasEndDate ) r->setDaily( freq, endDate );
142 else r->setDaily( freq, -1 ); 142 else r->setDaily( freq, -1 );
143 } else if ( rtype == "1" ) { 143 } else if ( rtype == "1" ) {
144 if ( hasEndDate ) r->setWeekly( freq, weekDays, endDate ); 144 if ( hasEndDate ) r->setWeekly( freq, weekDays, endDate );
145 else r->setWeekly( freq, weekDays, -1 ); 145 else r->setWeekly( freq, weekDays, -1 );
146 } else if ( rtype == "3" ) { 146 } else if ( rtype == "3" ) {
147 if ( hasEndDate ) 147 if ( hasEndDate )
148 r->setMonthly( Recurrence::rMonthlyDay, freq, endDate ); 148 r->setMonthly( Recurrence::rMonthlyDay, freq, endDate );
149 else 149 else
150 r->setMonthly( Recurrence::rMonthlyDay, freq, -1 ); 150 r->setMonthly( Recurrence::rMonthlyDay, freq, -1 );
151 r->addMonthlyDay( startDate.day() ); 151 r->addMonthlyDay( startDate.day() );
152 } else if ( rtype == "2" ) { 152 } else if ( rtype == "2" ) {
153 if ( hasEndDate ) 153 if ( hasEndDate )
154 r->setMonthly( Recurrence::rMonthlyPos, freq, endDate ); 154 r->setMonthly( Recurrence::rMonthlyPos, freq, endDate );
155 else 155 else
156 r->setMonthly( Recurrence::rMonthlyPos, freq, -1 ); 156 r->setMonthly( Recurrence::rMonthlyPos, freq, -1 );
157 QBitArray days( 7 ); 157 QBitArray days( 7 );
158 days.fill( false ); 158 days.fill( false );
159 days.setBit( startDate.dayOfWeek() - 1 ); 159 days.setBit( startDate.dayOfWeek() - 1 );
160 r->addMonthlyPos( pos, days ); 160 r->addMonthlyPos( pos, days );
161 } else if ( rtype == "4" ) { 161 } else if ( rtype == "4" ) {
162 if ( hasEndDate ) 162 if ( hasEndDate )
163 r->setYearly( Recurrence::rYearlyMonth, freq, endDate ); 163 r->setYearly( Recurrence::rYearlyMonth, freq, endDate );
164 else 164 else
165 r->setYearly( Recurrence::rYearlyMonth, freq, -1 ); 165 r->setYearly( Recurrence::rYearlyMonth, freq, -1 );
166 r->addYearlyNum( startDate.month() ); 166 r->addYearlyNum( startDate.month() );
167 } 167 }
168 } 168 }
169 169
170 QString categoryList = attList[1] ; 170 QString categoryList = attList[1] ;
171 event->setCategories( lookupCategories( categoryList ) ); 171 event->setCategories( lookupCategories( categoryList ) );
172 172
173 // strange 0 semms to mean: alarm enabled 173 // strange 0 semms to mean: alarm enabled
174 if ( attList[8] == "0" ) { 174 if ( attList[8] == "0" ) {
175 Alarm *alarm; 175 Alarm *alarm;
176 if ( event->alarms().count() > 0 ) 176 if ( event->alarms().count() > 0 )
177 alarm = event->alarms().first(); 177 alarm = event->alarms().first();
178 else { 178 else {
179 alarm = new Alarm( event ); 179 alarm = new Alarm( event );
180 event->addAlarm( alarm ); 180 event->addAlarm( alarm );
181 } 181 }
182 alarm->setType( Alarm::Audio ); 182 alarm->setType( Alarm::Audio );
183 alarm->setEnabled( true ); 183 alarm->setEnabled( true );
184 int alarmOffset = attList[9].toInt(); 184 int alarmOffset = attList[9].toInt();
185 alarm->setStartOffset( alarmOffset * -60 ); 185 alarm->setStartOffset( alarmOffset * -60 );
186 } 186 }
187 187
188 mCalendar->addEvent( event); 188 mCalendar->addEvent( event);
189 } else if ( qName == "Todo" ) { 189 } else if ( qName == "Todo" ) {
190 Todo *todo; 190 Todo *todo;
191 191
192 todo = existingCalendar->todo( "Sharp_DTM", attList[0].toInt() ); 192 todo = existingCalendar->todo( "Sharp_DTM", attList[0] );
193 if (todo ) 193 if (todo )
194 todo = (Todo*)todo->clone(); 194 todo = (Todo*)todo->clone();
195 else 195 else
196 todo = new Todo; 196 todo = new Todo;
197 197
198//CARDID,CATEGORY,ETDY,LTDY,FNDY,MARK,PRTY,TITL,MEM1 198//CARDID,CATEGORY,ETDY,LTDY,FNDY,MARK,PRTY,TITL,MEM1
199// 0 1 2 3 4 5 6 7 8 199// 0 1 2 3 4 5 6 7 8
200//1,,,,,1,4,Loch zumachen,"" 200//1,,,,,1,4,Loch zumachen,""
201//3,Privat,20040317T000000,20040318T000000,20040319T000000,0,5,Call bbb,"notes123 bbb gggg ""bb "" " 201//3,Privat,20040317T000000,20040318T000000,20040319T000000,0,5,Call bbb,"notes123 bbb gggg ""bb "" "
202//2,"Familie,Freunde,Holiday",20040318T000000,20040324T000000,20040317T000000,1,2,tod2,notes 202//2,"Familie,Freunde,Holiday",20040318T000000,20040324T000000,20040317T000000,1,2,tod2,notes
203 203
204 todo->setID( "Sharp_DTM", attList[0]); 204 todo->setID( "Sharp_DTM", attList[0]);
205 todo->setCsum( "Sharp_DTM", QString::number( cSum )); 205 todo->setCsum( "Sharp_DTM", QString::number( cSum ));
206 todo->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL ); 206 todo->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL );
207 207
208 todo->setSummary( attList[7] ); 208 todo->setSummary( attList[7] );
209 todo->setDescription( attList[8]); 209 todo->setDescription( attList[8]);
210 210
211 int priority = attList[6].toInt(); 211 int priority = attList[6].toInt();
212 if ( priority == 0 ) priority = 3; 212 if ( priority == 0 ) priority = 3;
213 todo->setPriority( priority ); 213 todo->setPriority( priority );
214 214
215 QString categoryList = attList[1]; 215 QString categoryList = attList[1];
216 todo->setCategories( lookupCategories( categoryList ) ); 216 todo->setCategories( lookupCategories( categoryList ) );
217 217
218 218
219 219
220 QString hasDateStr = attList[3]; // due 220 QString hasDateStr = attList[3]; // due
221 if ( !hasDateStr.isEmpty() ) { 221 if ( !hasDateStr.isEmpty() ) {
222 if ( hasDateStr.right(6) == "000000" ) { 222 if ( hasDateStr.right(6) == "000000" ) {
223 todo->setDtDue( QDateTime(fromString( hasDateStr, false ).date(), QTime(0,0,0 )) ); 223 todo->setDtDue( QDateTime(fromString( hasDateStr, false ).date(), QTime(0,0,0 )) );
224 todo->setFloats( true ); 224 todo->setFloats( true );
225 } 225 }
226 else { 226 else {
227 todo->setDtDue( fromString( hasDateStr ) ); 227 todo->setDtDue( fromString( hasDateStr ) );
228 todo->setFloats( false ); 228 todo->setFloats( false );
229 } 229 }
230 230
231 todo->setHasDueDate( true ); 231 todo->setHasDueDate( true );
232 } 232 }
233 hasDateStr = attList[2];//start 233 hasDateStr = attList[2];//start
234 if ( !hasDateStr.isEmpty() ) { 234 if ( !hasDateStr.isEmpty() ) {
235 235
236 todo->setDtStart( fromString( hasDateStr ) ); 236 todo->setDtStart( fromString( hasDateStr ) );
237 todo->setHasStartDate( true); 237 todo->setHasStartDate( true);
238 } else 238 } else
239 todo->setHasStartDate( false ); 239 todo->setHasStartDate( false );
240 hasDateStr = attList[4];//completed 240 hasDateStr = attList[4];//completed
241 if ( !hasDateStr.isEmpty() ) { 241 if ( !hasDateStr.isEmpty() ) {
242 todo->setCompleted(fromString( hasDateStr ) ); 242 todo->setCompleted(fromString( hasDateStr ) );
243 } 243 }
244 QString completedStr = attList[5]; 244 QString completedStr = attList[5];
245 if ( completedStr == "0" ) 245 if ( completedStr == "0" )
246 todo->setCompleted( true ); 246 todo->setCompleted( true );
247 else 247 else
248 todo->setCompleted( false ); 248 todo->setCompleted( false );
249 mCalendar->addTodo( todo ); 249 mCalendar->addTodo( todo );
250 250
251 } else if ( qName == "Category" ) { 251 } else if ( qName == "Category" ) {
252 /* 252 /*
253 QString id = attributes.value( "id" ); 253 QString id = attributes.value( "id" );
254 QString name = attributes.value( "name" ); 254 QString name = attributes.value( "name" );
255 setCategory( id, name ); 255 setCategory( id, name );
256 */ 256 */
257 } 257 }
258 //qDebug("end "); 258 //qDebug("end ");
259 return true; 259 return true;
260 } 260 }
261 261
262 262
263 void setCategoriesList ( QStringList * c ) 263 void setCategoriesList ( QStringList * c )
264 { 264 {
265 oldCategories = c; 265 oldCategories = c;
266 } 266 }
267 267
268 QDateTime fromString ( QString s, bool useTz = true ) { 268 QDateTime fromString ( QString s, bool useTz = true ) {
269 QDateTime dt; 269 QDateTime dt;
270 int y,m,t,h,min,sec; 270 int y,m,t,h,min,sec;
271 y = s.mid(0,4).toInt(); 271 y = s.mid(0,4).toInt();
272 m = s.mid(4,2).toInt(); 272 m = s.mid(4,2).toInt();
273 t = s.mid(6,2).toInt(); 273 t = s.mid(6,2).toInt();
274 h = s.mid(9,2).toInt(); 274 h = s.mid(9,2).toInt();
275 min = s.mid(11,2).toInt(); 275 min = s.mid(11,2).toInt();
276 sec = s.mid(13,2).toInt(); 276 sec = s.mid(13,2).toInt();
277 dt = QDateTime(QDate(y,m,t), QTime(h,min,sec)); 277 dt = QDateTime(QDate(y,m,t), QTime(h,min,sec));
278 int offset = KGlobal::locale()->localTimeOffset( dt ); 278 int offset = KGlobal::locale()->localTimeOffset( dt );
279 if ( useTz ) 279 if ( useTz )
280 dt = dt.addSecs ( offset*60); 280 dt = dt.addSecs ( offset*60);
281 return dt; 281 return dt;
282 282
283 } 283 }
284 protected: 284 protected:
285 QDateTime toDateTime( const QString &value ) 285 QDateTime toDateTime( const QString &value )
286 { 286 {
287 QDateTime dt; 287 QDateTime dt;
288 dt.setTime_t( value.toUInt() ); 288 dt.setTime_t( value.toUInt() );
289 289
290 return dt; 290 return dt;
291 } 291 }
292 292
293 QStringList lookupCategories( const QString &categoryList ) 293 QStringList lookupCategories( const QString &categoryList )
294 { 294 {
295 QStringList categoryIds = QStringList::split( ";", categoryList ); 295 QStringList categoryIds = QStringList::split( ";", categoryList );
296 QStringList categories; 296 QStringList categories;
297 QStringList::ConstIterator it; 297 QStringList::ConstIterator it;
298 for( it = categoryIds.begin(); it != categoryIds.end(); ++it ) { 298 for( it = categoryIds.begin(); it != categoryIds.end(); ++it ) {
299 QString cate = category( *it ); 299 QString cate = category( *it );
300 if ( oldCategories ) { 300 if ( oldCategories ) {
301 if ( ! oldCategories->contains( cate ) ) 301 if ( ! oldCategories->contains( cate ) )
302 oldCategories->append( cate ); 302 oldCategories->append( cate );
303 } 303 }
304 categories.append(cate ); 304 categories.append(cate );
305 } 305 }
306 return categories; 306 return categories;
307 } 307 }
308 308
309 private: 309 private:
310 Calendar *mCalendar; 310 Calendar *mCalendar;
311 QStringList * oldCategories; 311 QStringList * oldCategories;
312 static QString category( const QString &id ) 312 static QString category( const QString &id )
313 { 313 {
314 QMap<QString,QString>::ConstIterator it = mCategoriesMap.find( id ); 314 QMap<QString,QString>::ConstIterator it = mCategoriesMap.find( id );
315 if ( it == mCategoriesMap.end() ) return id; 315 if ( it == mCategoriesMap.end() ) return id;
316 else return *it; 316 else return *it;
317 } 317 }
318 318
319 static void setCategory( const QString &id, const QString &name ) 319 static void setCategory( const QString &id, const QString &name )
320 { 320 {
321 mCategoriesMap.insert( id, name ); 321 mCategoriesMap.insert( id, name );
322 } 322 }
323 323
324 static QMap<QString,QString> mCategoriesMap; 324 static QMap<QString,QString> mCategoriesMap;
325}; 325};
326 326
327QMap<QString,QString> SharpParser::mCategoriesMap; 327QMap<QString,QString> SharpParser::mCategoriesMap;
328 328
329SharpFormat::SharpFormat() 329SharpFormat::SharpFormat()
330{ 330{
331 mCategories = 0; 331 mCategories = 0;
332} 332}
333 333
334SharpFormat::~SharpFormat() 334SharpFormat::~SharpFormat()
335{ 335{
336} 336}
337ulong SharpFormat::getCsum( const QStringList & attList) 337ulong SharpFormat::getCsum( const QStringList & attList)
338{ 338{
339 int max = attList.count() -1; 339 int max = attList.count() -1;
340 ulong cSum = 0; 340 ulong cSum = 0;
341 int j,k,i; 341 int j,k,i;
342 int add; 342 int add;
343 for ( i = 1; i < max ; ++i ) { 343 for ( i = 1; i < max ; ++i ) {
344 QString s = attList[i]; 344 QString s = attList[i];
345 if ( ! s.isEmpty() ){ 345 if ( ! s.isEmpty() ){
346 j = s.length(); 346 j = s.length();
347 for ( k = 0; k < j; ++k ) { 347 for ( k = 0; k < j; ++k ) {
348 int mul = k +1; 348 int mul = k +1;
349 add = s[k].unicode (); 349 add = s[k].unicode ();
350 if ( k < 16 ) 350 if ( k < 16 )
351 mul = mul * mul; 351 mul = mul * mul;
352 add = add * mul *i*i*i; 352 add = add * mul *i*i*i;
353 cSum += add; 353 cSum += add;
354 } 354 }
355 } 355 }
356 } 356 }
357 return cSum; 357 return cSum;
358 358
359} 359}
360#include <stdlib.h> 360#include <stdlib.h>
361#define DEBUGMODE false 361#define DEBUGMODE true
362bool SharpFormat::load( Calendar *calendar, Calendar *existngCal ) 362bool SharpFormat::load( Calendar *calendar, Calendar *existngCal )
363{ 363{
364 364
365 365
366 bool debug = DEBUGMODE; 366 bool debug = DEBUGMODE;
367 //debug = true; 367 //debug = true;
368 QString text; 368 QString text;
369 QString codec = "utf8"; 369 QString codec = "utf8";
370 QLabel status ( i18n("Reading events ..."), 0 ); 370 QLabel status ( i18n("Reading events ..."), 0 );
371 371
372 int w = status.sizeHint().width()+20 ; 372 int w = status.sizeHint().width()+20 ;
373 if ( w < 200 ) w = 200; 373 if ( w < 200 ) w = 200;
374 int h = status.sizeHint().height()+20 ; 374 int h = status.sizeHint().height()+20 ;
375 int dw = QApplication::desktop()->width(); 375 int dw = QApplication::desktop()->width();
376 int dh = QApplication::desktop()->height(); 376 int dh = QApplication::desktop()->height();
377 status.setCaption(i18n("Reading DTM Data") ); 377 status.setCaption(i18n("Reading DTM Data") );
378 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 378 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
379 status.show(); 379 status.show();
380 status.raise(); 380 status.raise();
381 qApp->processEvents(); 381 qApp->processEvents();
382 QString fileName; 382 QString fileName;
383 if ( ! debug ) { 383 if ( ! debug ) {
384 fileName = "/tmp/kopitempout"; 384 fileName = "/tmp/kopitempout";
385 QString command ="db2file datebook -r -c "+ codec + " > " + fileName; 385 QString command ="db2file datebook -r -c "+ codec + " > " + fileName;
386 system ( command.latin1() ); 386 system ( command.latin1() );
387 } else { 387 } else {
388 fileName = "/tmp/events.txt"; 388 fileName = "/tmp/events.txt";
389 389
390 } 390 }
391 QFile file( fileName ); 391 QFile file( fileName );
392 if (!file.open( IO_ReadOnly ) ) { 392 if (!file.open( IO_ReadOnly ) ) {
393 return false; 393 return false;
394 394
395 } 395 }
396 QTextStream ts( &file ); 396 QTextStream ts( &file );
397 ts.setCodec( QTextCodec::codecForName("utf8") ); 397 ts.setCodec( QTextCodec::codecForName("utf8") );
398 text = ts.read(); 398 text = ts.read();
399 file.close(); 399 file.close();
400 status.setText( i18n("Processing events ...") ); 400 status.setText( i18n("Processing events ...") );
401 status.raise(); 401 status.raise();
402 qApp->processEvents(); 402 qApp->processEvents();
403 fromString2Cal( calendar, existngCal, text, "Event" ); 403 fromString2Cal( calendar, existngCal, text, "Event" );
404 status.setText( i18n("Reading todos ...") ); 404 status.setText( i18n("Reading todos ...") );
405 qApp->processEvents(); 405 qApp->processEvents();
406 if ( ! debug ) { 406 if ( ! debug ) {
407 fileName = "/tmp/kopitempout"; 407 fileName = "/tmp/kopitempout";
408 QString command = "db2file todo -r -c " + codec+ " > " + fileName; 408 QString command = "db2file todo -r -c " + codec+ " > " + fileName;
409 system ( command.latin1() ); 409 system ( command.latin1() );
410 } else { 410 } else {
411 fileName = "/tmp/todo.txt"; 411 fileName = "/tmp/todo.txt";
412 } 412 }
413 file.setName( fileName ); 413 file.setName( fileName );
414 if (!file.open( IO_ReadOnly ) ) { 414 if (!file.open( IO_ReadOnly ) ) {
415 return false; 415 return false;
416 416
417 } 417 }
418 ts.setDevice( &file ); 418 ts.setDevice( &file );
419 text = ts.read(); 419 text = ts.read();
420 file.close(); 420 file.close();
421 421
422 status.setText( i18n("Processing todos ...") ); 422 status.setText( i18n("Processing todos ...") );
423 status.raise(); 423 status.raise();
424 qApp->processEvents(); 424 qApp->processEvents();
425 fromString2Cal( calendar, existngCal, text, "Todo" ); 425 fromString2Cal( calendar, existngCal, text, "Todo" );
426 return true; 426 return true;
427} 427}
428int SharpFormat::getNumFromRecord( QString answer, Incidence* inc ) 428int SharpFormat::getNumFromRecord( QString answer, Incidence* inc )
429{ 429{
430 int retval = -1; 430 int retval = -1;
431 QStringList templist; 431 QStringList templist;
432 QString tempString; 432 QString tempString;
433 int start = 0; 433 int start = 0;
434 int len = answer.length(); 434 int len = answer.length();
435 int end = answer.find ("\n",start)+1; 435 int end = answer.find ("\n",start)+1;
436 bool ok = true; 436 bool ok = true;
437 start = end; 437 start = end;
438 int ccc = 0; 438 int ccc = 0;
439 while ( start > 0 ) { 439 while ( start > 0 ) {
440 templist.clear(); 440 templist.clear();
441 ok = true; 441 ok = true;
442 int loopCount = 0; 442 int loopCount = 0;
443 while ( ok ) { 443 while ( ok ) {
444 ++loopCount; 444 ++loopCount;
445 if ( loopCount > 25 ) { 445 if ( loopCount > 25 ) {
446 qDebug("KO: Error in while loop"); 446 qDebug("KO: Error in while loop");
447 ok = false; 447 ok = false;
448 start = 0; 448 start = 0;
449 break; 449 break;
450 } 450 }
451 if ( ok ) 451 if ( ok )
452 tempString = getPart( answer, ok, start ); 452 tempString = getPart( answer, ok, start );
453 if ( start >= len || start == 0 ) { 453 if ( start >= len || start == 0 ) {
454 start = 0; 454 start = 0;
455 ok = false; 455 ok = false;
456 } 456 }
457 if ( tempString.right(1) =="\n" ) 457 if ( tempString.right(1) =="\n" )
458 tempString = tempString.left( tempString.length()-1); 458 tempString = tempString.left( tempString.length()-1);
459 459
460 templist.append( tempString ); 460 templist.append( tempString );
461 } 461 }
462 ++ccc; 462 ++ccc;
463 if ( ccc == 2 && loopCount < 25 ) { 463 if ( ccc == 2 && loopCount < 25 ) {
464 start = 0; 464 start = 0;
465 bool ok; 465 bool ok;
466 int newnum = templist[0].toInt( &ok ); 466 int newnum = templist[0].toInt( &ok );
467 if ( ok && newnum > 0) { 467 if ( ok && newnum > 0) {
468 retval = newnum; 468 retval = newnum;
469 inc->setID( "Sharp_DTM",templist[0] ); 469 inc->setID( "Sharp_DTM",templist[0] );
470 inc->setCsum( "Sharp_DTM", QString::number( getCsum( templist ) )); 470 inc->setCsum( "Sharp_DTM", QString::number( getCsum( templist ) ));
471 inc->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID ); 471 inc->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID );
472 } 472 }
473 } 473 }
474 } 474 }
475 //qDebug("getNumFromRecord returning : %d ", retval); 475 //qDebug("getNumFromRecord returning : %d ", retval);
476 return retval; 476 return retval;
477} 477}
478bool SharpFormat::save( Calendar *calendar) 478bool SharpFormat::save( Calendar *calendar)
479{ 479{
480 480
481 QLabel status ( i18n("Processing/adding events ..."), 0 ); 481 QLabel status ( i18n("Processing/adding events ..."), 0 );
482 int w = status.sizeHint().width()+20 ; 482 int w = status.sizeHint().width()+20 ;
483 if ( w < 200 ) w = 200; 483 if ( w < 200 ) w = 200;
484 int h = status.sizeHint().height()+20 ; 484 int h = status.sizeHint().height()+20 ;
485 int dw = QApplication::desktop()->width(); 485 int dw = QApplication::desktop()->width();
486 int dh = QApplication::desktop()->height(); 486 int dh = QApplication::desktop()->height();
487 status.setCaption(i18n("Writing DTM Data") ); 487 status.setCaption(i18n("Writing DTM Data") );
488 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 488 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
489 status.show(); 489 status.show();
490 status.raise(); 490 status.raise();
491 qApp->processEvents(); 491 qApp->processEvents();
492 bool debug = DEBUGMODE; 492 bool debug = DEBUGMODE;
493 QString codec = "utf8"; 493 QString codec = "utf8";
494 QString answer; 494 QString answer;
495 QString ePrefix = "CARDID,CATEGORY,DSRP,PLCE,MEM1,TIM1,TIM2,ADAY,ARON,ARMN,ARSD,RTYP,RFRQ,RPOS,RDYS,REND,REDT,ALSD,ALED,MDAY\n"; 495 QString ePrefix = "CARDID,CATEGORY,DSRP,PLCE,MEM1,TIM1,TIM2,ADAY,ARON,ARMN,ARSD,RTYP,RFRQ,RPOS,RDYS,REND,REDT,ALSD,ALED,MDAY\n";
496 QString tPrefix = "CARDID,CATEGORY,ETDY,LTDY,FNDY,MARK,PRTY,TITL,MEM1\n"; 496 QString tPrefix = "CARDID,CATEGORY,ETDY,LTDY,FNDY,MARK,PRTY,TITL,MEM1\n";
497 QString command; 497 QString command;
498 QPtrList<Event> er = calendar->rawEvents(); 498 QPtrList<Event> er = calendar->rawEvents();
499 Event* ev = er.first(); 499 Event* ev = er.first();
500 QString fileName = "/tmp/kopitempout"; 500 QString fileName = "/tmp/kopitempout";
501 int i = 0; 501 int i = 0;
502 QString changeString = ePrefix; 502 QString changeString = ePrefix;
503 QString deleteString = ePrefix; 503 QString deleteString = ePrefix;
504 bool deleteEnt = false; 504 bool deleteEnt = false;
505 bool changeEnt = false; 505 bool changeEnt = false;
506 QString message = i18n("Processing event # "); 506 QString message = i18n("Processing event # ");
507 int procCount = 0; 507 int procCount = 0;
508 while ( ev ) { 508 while ( ev ) {
509 //qDebug("i %d ", ++i); 509 //qDebug("i %d ", ++i);
510 if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { 510 if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) {
511 status.setText ( message + QString::number ( ++procCount ) ); 511 status.setText ( message + QString::number ( ++procCount ) );
512 qApp->processEvents(); 512 qApp->processEvents();
513 QString eString = getEventString( ev ); 513 QString eString = getEventString( ev );
514 if ( ev->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete 514 if ( ev->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete
515 // deleting empty strings does not work. 515 // deleting empty strings does not work.
516 // we write first and x and then delete the record with the x 516 // we write first and x and then delete the record with the x
517 eString = eString.replace( QRegExp(",\"\""),",\"x\"" ); 517 eString = eString.replace( QRegExp(",\"\""),",\"x\"" );
518 changeString += eString + "\n"; 518 changeString += eString + "\n";
519 deleteString += eString + "\n"; 519 deleteString += eString + "\n";
520 deleteEnt = true; 520 deleteEnt = true;
521 changeEnt = true; 521 changeEnt = true;
522 } 522 }
523 else if ( ev->getID("Sharp_DTM").isEmpty() ) { // add new 523 else if ( ev->getID("Sharp_DTM").isEmpty() ) { // add new
524 command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName; 524 command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName;
525 system ( command.utf8() ); 525 system ( command.utf8() );
526 QFile file( fileName ); 526 QFile file( fileName );
527 if (!file.open( IO_ReadOnly ) ) { 527 if (!file.open( IO_ReadOnly ) ) {
528 return false; 528 return false;
529 529
530 } 530 }
531 QTextStream ts( &file ); 531 QTextStream ts( &file );
532 ts.setCodec( QTextCodec::codecForName("utf8") ); 532 ts.setCodec( QTextCodec::codecForName("utf8") );
533 answer = ts.read(); 533 answer = ts.read();
534 file.close(); 534 file.close();
535 //qDebug("answer \n%s ", answer.latin1()); 535 //qDebug("answer \n%s ", answer.latin1());
536 getNumFromRecord( answer, ev ) ; 536 getNumFromRecord( answer, ev ) ;
537 537
538 } 538 }
539 else { // change existing 539 else { // change existing
540 //qDebug("canging %d %d",ev->zaurusStat() ,ev->zaurusId() ); 540 //qDebug("canging %d %d",ev->zaurusStat() ,ev->zaurusId() );
541 //command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName; 541 //command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName;
542 changeString += eString + "\n"; 542 changeString += eString + "\n";
543 changeEnt = true; 543 changeEnt = true;
544 544
545 } 545 }
546 } 546 }
547 ev = er.next(); 547 ev = er.next();
548 } 548 }
549 status.setText ( i18n("Changing events ...") ); 549 status.setText ( i18n("Changing events ...") );
550 qApp->processEvents(); 550 qApp->processEvents();
551 //qDebug("changing... "); 551 //qDebug("changing... ");
552 if ( changeEnt ) { 552 if ( changeEnt ) {
553 QFile file( fileName ); 553 QFile file( fileName );
554 if (!file.open( IO_WriteOnly ) ) { 554 if (!file.open( IO_WriteOnly ) ) {
555 return false; 555 return false;
556 556
557 } 557 }
558 QTextStream ts( &file ); 558 QTextStream ts( &file );
559 ts.setCodec( QTextCodec::codecForName("utf8") ); 559 ts.setCodec( QTextCodec::codecForName("utf8") );
560 ts << changeString ; 560 ts << changeString ;
561 file.close(); 561 file.close();
562 command = "db2file datebook -w -g -c " + codec+ " < "+ fileName; 562 command = "db2file datebook -w -g -c " + codec+ " < "+ fileName;
563 system ( command.latin1() ); 563 system ( command.latin1() );
564 //qDebug("command %s file :\n%s ", command.latin1(), changeString.latin1()); 564 //qDebug("command %s file :\n%s ", command.latin1(), changeString.latin1());
565 565
566 } 566 }
567 status.setText ( i18n("Deleting events ...") ); 567 status.setText ( i18n("Deleting events ...") );
568 qApp->processEvents(); 568 qApp->processEvents();
569 //qDebug("deleting... "); 569 //qDebug("deleting... ");
570 if ( deleteEnt ) { 570 if ( deleteEnt ) {
571 QFile file( fileName ); 571 QFile file( fileName );
572 if (!file.open( IO_WriteOnly ) ) { 572 if (!file.open( IO_WriteOnly ) ) {
573 return false; 573 return false;
574 574
575 } 575 }
576 QTextStream ts( &file ); 576 QTextStream ts( &file );
577 ts.setCodec( QTextCodec::codecForName("utf8") ); 577 ts.setCodec( QTextCodec::codecForName("utf8") );
578 ts << deleteString; 578 ts << deleteString;
579 file.close(); 579 file.close();
580 command = "db2file datebook -d -c " + codec+ " < "+ fileName; 580 command = "db2file datebook -d -c " + codec+ " < "+ fileName;
581 system ( command.latin1() ); 581 system ( command.latin1() );
582 // qDebug("command %s file :\n%s ", command.latin1(), deleteString.latin1()); 582 // qDebug("command %s file :\n%s ", command.latin1(), deleteString.latin1());
583 } 583 }
584 584
585 585
586 changeString = tPrefix; 586 changeString = tPrefix;
587 deleteString = tPrefix; 587 deleteString = tPrefix;
588 status.setText ( i18n("Processing todos ...") ); 588 status.setText ( i18n("Processing todos ...") );
589 qApp->processEvents(); 589 qApp->processEvents();
590 QPtrList<Todo> tl = calendar->rawTodos(); 590 QPtrList<Todo> tl = calendar->rawTodos();
591 Todo* to = tl.first(); 591 Todo* to = tl.first();
592 i = 0; 592 i = 0;
593 message = i18n("Processing todo # "); 593 message = i18n("Processing todo # ");
594 procCount = 0; 594 procCount = 0;
595 while ( to ) { 595 while ( to ) {
596 if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { 596 if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) {
597 status.setText ( message + QString::number ( ++procCount ) ); 597 status.setText ( message + QString::number ( ++procCount ) );
598 qApp->processEvents(); 598 qApp->processEvents();
599 QString eString = getTodoString( to ); 599 QString eString = getTodoString( to );
600 if ( to->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete 600 if ( to->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete
601 // deleting empty strings does not work. 601 // deleting empty strings does not work.
602 // we write first and x and then delete the record with the x 602 // we write first and x and then delete the record with the x
603 eString = eString.replace( QRegExp(",\"\""),",\"x\"" ); 603 eString = eString.replace( QRegExp(",\"\""),",\"x\"" );
604 changeString += eString + "\n"; 604 changeString += eString + "\n";
605 deleteString += eString + "\n"; 605 deleteString += eString + "\n";
606 deleteEnt = true; 606 deleteEnt = true;
607 changeEnt = true; 607 changeEnt = true;
608 } 608 }
609 else if ( to->getID("Sharp_DTM").isEmpty() ) { // add new 609 else if ( to->getID("Sharp_DTM").isEmpty() ) { // add new
610 command = "(echo \"" + tPrefix + eString + "\" ) | db2file todo -w -g -c " + codec+ " > "+ fileName; 610 command = "(echo \"" + tPrefix + eString + "\" ) | db2file todo -w -g -c " + codec+ " > "+ fileName;
611 system ( command.utf8() ); 611 system ( command.utf8() );
612 QFile file( fileName ); 612 QFile file( fileName );
613 if (!file.open( IO_ReadOnly ) ) { 613 if (!file.open( IO_ReadOnly ) ) {
614 return false; 614 return false;
615 615
616 } 616 }
617 QTextStream ts( &file ); 617 QTextStream ts( &file );
618 ts.setCodec( QTextCodec::codecForName("utf8") ); 618 ts.setCodec( QTextCodec::codecForName("utf8") );
619 answer = ts.read(); 619 answer = ts.read();
620 file.close(); 620 file.close();
621 //qDebug("answer \n%s ", answer.latin1()); 621 //qDebug("answer \n%s ", answer.latin1());
622 getNumFromRecord( answer, to ) ; 622 getNumFromRecord( answer, to ) ;
623 623
624 } 624 }
625 else { // change existing 625 else { // change existing
626 //qDebug("canging %d %d",to->zaurusStat() ,to->zaurusId() ); 626 //qDebug("canging %d %d",to->zaurusStat() ,to->zaurusId() );
627 //command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName; 627 //command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName;
628 changeString += eString + "\n"; 628 changeString += eString + "\n";
629 changeEnt = true; 629 changeEnt = true;
630 630
631 } 631 }
632 } 632 }
633 633
634 to = tl.next(); 634 to = tl.next();
635 } 635 }
636 status.setText ( i18n("Changing todos ...") ); 636 status.setText ( i18n("Changing todos ...") );
637 qApp->processEvents(); 637 qApp->processEvents();
638 //qDebug("changing... "); 638 //qDebug("changing... ");
639 if ( changeEnt ) { 639 if ( changeEnt ) {
640 QFile file( fileName ); 640 QFile file( fileName );
641 if (!file.open( IO_WriteOnly ) ) { 641 if (!file.open( IO_WriteOnly ) ) {
642 return false; 642 return false;
643 643
644 } 644 }
645 QTextStream ts( &file ); 645 QTextStream ts( &file );
646 ts.setCodec( QTextCodec::codecForName("utf8") ); 646 ts.setCodec( QTextCodec::codecForName("utf8") );
647 ts << changeString ; 647 ts << changeString ;
648 file.close(); 648 file.close();
649 command = "db2file todo -w -g -c " + codec+ " < "+ fileName; 649 command = "db2file todo -w -g -c " + codec+ " < "+ fileName;
650 system ( command.latin1() ); 650 system ( command.latin1() );
651 //qDebug("command %s file :\n%s ", command.latin1(), changeString.latin1()); 651 //qDebug("command %s file :\n%s ", command.latin1(), changeString.latin1());
652 652
653 } 653 }
654 status.setText ( i18n("Deleting todos ...") ); 654 status.setText ( i18n("Deleting todos ...") );
655 qApp->processEvents(); 655 qApp->processEvents();
656 //qDebug("deleting... "); 656 //qDebug("deleting... ");
657 if ( deleteEnt ) { 657 if ( deleteEnt ) {
658 QFile file( fileName ); 658 QFile file( fileName );
659 if (!file.open( IO_WriteOnly ) ) { 659 if (!file.open( IO_WriteOnly ) ) {
660 return false; 660 return false;
661 661
662 } 662 }
663 QTextStream ts( &file ); 663 QTextStream ts( &file );
664 ts.setCodec( QTextCodec::codecForName("utf8") ); 664 ts.setCodec( QTextCodec::codecForName("utf8") );
665 ts << deleteString; 665 ts << deleteString;
666 file.close(); 666 file.close();
667 command = "db2file todo -d -c " + codec+ " < "+ fileName; 667 command = "db2file todo -d -c " + codec+ " < "+ fileName;
668 system ( command.latin1() ); 668 system ( command.latin1() );
669 // qDebug("command %s file :\n%s ", command.latin1(), deleteString.latin1()); 669 // qDebug("command %s file :\n%s ", command.latin1(), deleteString.latin1());
670 } 670 }
671 671
672 return true; 672 return true;
673} 673}
674QString SharpFormat::dtToString( const QDateTime& dti, bool useTZ ) 674QString SharpFormat::dtToString( const QDateTime& dti, bool useTZ )
675{ 675{
676 QString datestr; 676 QString datestr;
677 QString timestr; 677 QString timestr;
678 int offset = KGlobal::locale()->localTimeOffset( dti ); 678 int offset = KGlobal::locale()->localTimeOffset( dti );
679 QDateTime dt; 679 QDateTime dt;
680 if (useTZ) 680 if (useTZ)
681 dt = dti.addSecs ( -(offset*60)); 681 dt = dti.addSecs ( -(offset*60));
682 else 682 else
683 dt = dti; 683 dt = dti;
684 if(dt.date().isValid()){ 684 if(dt.date().isValid()){
685 const QDate& date = dt.date(); 685 const QDate& date = dt.date();
686 datestr.sprintf("%04d%02d%02d", 686 datestr.sprintf("%04d%02d%02d",
687 date.year(), date.month(), date.day()); 687 date.year(), date.month(), date.day());
688 } 688 }
689 if(dt.time().isValid()){ 689 if(dt.time().isValid()){
690 const QTime& time = dt.time(); 690 const QTime& time = dt.time();
691 timestr.sprintf("T%02d%02d%02d", 691 timestr.sprintf("T%02d%02d%02d",
692 time.hour(), time.minute(), time.second()); 692 time.hour(), time.minute(), time.second());
693 } 693 }
694 return datestr + timestr; 694 return datestr + timestr;
695} 695}
696QString SharpFormat::getEventString( Event* event ) 696QString SharpFormat::getEventString( Event* event )
697{ 697{
698 QStringList list; 698 QStringList list;
699 list.append( event->getID("Sharp_DTM") ); 699 list.append( event->getID("Sharp_DTM") );
700 list.append( event->categories().join(",") ); 700 list.append( event->categories().join(",") );
701 if ( !event->summary().isEmpty() ) 701 if ( !event->summary().isEmpty() )
702 list.append( event->summary() ); 702 list.append( event->summary() );
703 else 703 else
704 list.append("" ); 704 list.append("" );
705 if ( !event->location().isEmpty() ) 705 if ( !event->location().isEmpty() )
706 list.append( event->location() ); 706 list.append( event->location() );
707 else 707 else
708 list.append("" ); 708 list.append("" );
709 if ( !event->description().isEmpty() ) 709 if ( !event->description().isEmpty() )
710 list.append( event->description() ); 710 list.append( event->description() );
711 else 711 else
712 list.append( "" ); 712 list.append( "" );
713 if ( event->doesFloat () ) { 713 if ( event->doesFloat () ) {
714 list.append( dtToString( QDateTime(event->dtStart().date(), QTime(0,0,0)), false )); 714 list.append( dtToString( QDateTime(event->dtStart().date(), QTime(0,0,0)), false ));
715 list.append( dtToString( QDateTime(event->dtEnd().date(),QTime(23,59,59)), false )); //6 715 list.append( dtToString( QDateTime(event->dtEnd().date(),QTime(23,59,59)), false )); //6
716 list.append( "1" ); 716 list.append( "1" );
717 717
718 } 718 }
719 else { 719 else {
720 list.append( dtToString( event->dtStart()) ); 720 list.append( dtToString( event->dtStart()) );
721 list.append( dtToString( event->dtEnd()) ); //6 721 list.append( dtToString( event->dtEnd()) ); //6
722 list.append( "0" ); 722 list.append( "0" );
723 } 723 }
724 bool noAlarm = true; 724 bool noAlarm = true;
725 if ( event->alarms().count() > 0 ) { 725 if ( event->alarms().count() > 0 ) {
726 Alarm * al = event->alarms().first(); 726 Alarm * al = event->alarms().first();
727 if ( al->enabled() ) { 727 if ( al->enabled() ) {
728 noAlarm = false; 728 noAlarm = false;
729 list.append( "0" ); // yes, 0 == alarm 729 list.append( "0" ); // yes, 0 == alarm
730 list.append( QString::number( al->startOffset().asSeconds()/(-60) ) ); 730 list.append( QString::number( al->startOffset().asSeconds()/(-60) ) );
731 if ( al->type() == Alarm::Audio ) 731 if ( al->type() == Alarm::Audio )
732 list.append( "1" ); // type audio 732 list.append( "1" ); // type audio
733 else 733 else
734 list.append( "0" ); // type silent 734 list.append( "0" ); // type silent
735 } 735 }
736 } 736 }
737 if ( noAlarm ) { 737 if ( noAlarm ) {
738 list.append( "1" ); // yes, 1 == no alarm 738 list.append( "1" ); // yes, 1 == no alarm
739 list.append( "0" ); // no alarm offset 739 list.append( "0" ); // no alarm offset
740 list.append( "1" ); // type 740 list.append( "1" ); // type
741 } 741 }
742 // next is: 11 742 // next is: 11
743 // next is: 11-16 are recurrence 743 // next is: 11-16 are recurrence
744 Recurrence* rec = event->recurrence(); 744 Recurrence* rec = event->recurrence();
745 745
746 bool writeEndDate = false; 746 bool writeEndDate = false;
747 switch ( rec->doesRecur() ) 747 switch ( rec->doesRecur() )
748 { 748 {
749 case Recurrence::rDaily: // 0 749 case Recurrence::rDaily: // 0
750 list.append( "0" ); 750 list.append( "0" );
751 list.append( QString::number( rec->frequency() ));//12 751 list.append( QString::number( rec->frequency() ));//12
752 list.append( "0" ); 752 list.append( "0" );
753 list.append( "0" ); 753 list.append( "0" );
754 writeEndDate = true; 754 writeEndDate = true;
755 break; 755 break;
756 case Recurrence::rWeekly:// 1 756 case Recurrence::rWeekly:// 1
757 list.append( "1" ); 757 list.append( "1" );
758 list.append( QString::number( rec->frequency()) );//12 758 list.append( QString::number( rec->frequency()) );//12
759 list.append( "0" ); 759 list.append( "0" );
760 { 760 {
761 int days = 0; 761 int days = 0;
762 QBitArray weekDays = rec->days(); 762 QBitArray weekDays = rec->days();
763 int i; 763 int i;
764 for( i = 1; i <= 7; ++i ) { 764 for( i = 1; i <= 7; ++i ) {
765 if ( weekDays[i-1] ) { 765 if ( weekDays[i-1] ) {
766 days += 1 << (i-1); 766 days += 1 << (i-1);
767 } 767 }
768 } 768 }
769 list.append( QString::number( days ) ); 769 list.append( QString::number( days ) );
770 } 770 }
771 //pending weekdays 771 //pending weekdays
772 writeEndDate = true; 772 writeEndDate = true;
773 773
774 break; 774 break;
775 case Recurrence::rMonthlyPos:// 2 775 case Recurrence::rMonthlyPos:// 2
776 list.append( "2" ); 776 list.append( "2" );
777 list.append( QString::number( rec->frequency()) );//12 777 list.append( QString::number( rec->frequency()) );//12
778 778
779 writeEndDate = true; 779 writeEndDate = true;
780 { 780 {
781 int count = 1; 781 int count = 1;
782 QPtrList<Recurrence::rMonthPos> rmp; 782 QPtrList<Recurrence::rMonthPos> rmp;
783 rmp = rec->monthPositions(); 783 rmp = rec->monthPositions();
784 if ( rmp.first()->negative ) 784 if ( rmp.first()->negative )
785 count = 5 - rmp.first()->rPos - 1; 785 count = 5 - rmp.first()->rPos - 1;
786 else 786 else
787 count = rmp.first()->rPos - 1; 787 count = rmp.first()->rPos - 1;
788 list.append( QString::number( count ) ); 788 list.append( QString::number( count ) );
789 789
790 } 790 }
791 791
792 list.append( "0" ); 792 list.append( "0" );
793 break; 793 break;
794 case Recurrence::rMonthlyDay:// 3 794 case Recurrence::rMonthlyDay:// 3
795 list.append( "3" ); 795 list.append( "3" );
796 list.append( QString::number( rec->frequency()) );//12 796 list.append( QString::number( rec->frequency()) );//12
797 list.append( "0" ); 797 list.append( "0" );
798 list.append( "0" ); 798 list.append( "0" );
799 writeEndDate = true; 799 writeEndDate = true;
800 break; 800 break;
801 case Recurrence::rYearlyMonth://4 801 case Recurrence::rYearlyMonth://4
802 list.append( "4" ); 802 list.append( "4" );
803 list.append( QString::number( rec->frequency()) );//12 803 list.append( QString::number( rec->frequency()) );//12
804 list.append( "0" ); 804 list.append( "0" );
805 list.append( "0" ); 805 list.append( "0" );
806 writeEndDate = true; 806 writeEndDate = true;
807 break; 807 break;
808 808
809 default: 809 default:
810 list.append( "255" ); 810 list.append( "255" );
811 list.append( QString() ); 811 list.append( QString() );
812 list.append( "0" ); 812 list.append( "0" );
813 list.append( QString() ); 813 list.append( QString() );
814 list.append( "0" ); 814 list.append( "0" );
815 list.append( "20991231T000000" ); 815 list.append( "20991231T000000" );
816 break; 816 break;
817 } 817 }
818 if ( writeEndDate ) { 818 if ( writeEndDate ) {
819 819
820 if ( rec->endDate().isValid() ) { // 15 + 16 820 if ( rec->endDate().isValid() ) { // 15 + 16
821 list.append( "1" ); 821 list.append( "1" );
822 list.append( dtToString( rec->endDate()) ); 822 list.append( dtToString( rec->endDate()) );
823 } else { 823 } else {
824 list.append( "0" ); 824 list.append( "0" );
825 list.append( "20991231T000000" ); 825 list.append( "20991231T000000" );
826 } 826 }
827 827
828 } 828 }
829 if ( event->doesFloat () ) { 829 if ( event->doesFloat () ) {
830 list.append( dtToString( event->dtStart(), false ).left( 8 )); 830 list.append( dtToString( event->dtStart(), false ).left( 8 ));
831 list.append( dtToString( event->dtEnd(), false ).left( 8 )); //6 831 list.append( dtToString( event->dtEnd(), false ).left( 8 )); //6
832 832
833 } 833 }
834 else { 834 else {
835 list.append( QString() ); 835 list.append( QString() );
836 list.append( QString() ); 836 list.append( QString() );
837 837
838 } 838 }
839 if (event->dtStart().date() == event->dtEnd().date() ) 839 if (event->dtStart().date() == event->dtEnd().date() )
840 list.append( "0" ); 840 list.append( "0" );
841 else 841 else
842 list.append( "1" ); 842 list.append( "1" );
843 843
844 844
845 for(QStringList::Iterator it=list.begin(); 845 for(QStringList::Iterator it=list.begin();
846 it!=list.end(); ++it){ 846 it!=list.end(); ++it){
847 QString& s = (*it); 847 QString& s = (*it);
848 s.replace(QRegExp("\""), "\"\""); 848 s.replace(QRegExp("\""), "\"\"");
849 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){ 849 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){
850 s.prepend('\"'); 850 s.prepend('\"');
851 s.append('\"'); 851 s.append('\"');
852 } else if(s.isEmpty() && !s.isNull()){ 852 } else if(s.isEmpty() && !s.isNull()){
853 s = "\"\""; 853 s = "\"\"";
854 } 854 }
855 } 855 }
856 return list.join(","); 856 return list.join(",");
857 857
858 858
859} 859}
860QString SharpFormat::getTodoString( Todo* todo ) 860QString SharpFormat::getTodoString( Todo* todo )
861{ 861{
862 QStringList list; 862 QStringList list;
863 list.append( todo->getID("Sharp_DTM") ); 863 list.append( todo->getID("Sharp_DTM") );
864 list.append( todo->categories().join(",") ); 864 list.append( todo->categories().join(",") );
865 865
866 if ( todo->hasStartDate() ) { 866 if ( todo->hasStartDate() ) {
867 list.append( dtToString( todo->dtStart()) ); 867 list.append( dtToString( todo->dtStart()) );
868 } else 868 } else
869 list.append( QString() ); 869 list.append( QString() );
870 870
871 if ( todo->hasDueDate() ) { 871 if ( todo->hasDueDate() ) {
872 QTime tim; 872 QTime tim;
873 if ( todo->doesFloat()) { 873 if ( todo->doesFloat()) {
874 list.append( dtToString( QDateTime(todo->dtDue().date(),QTime( 0,0,0 )), false)) ; 874 list.append( dtToString( QDateTime(todo->dtDue().date(),QTime( 0,0,0 )), false)) ;
875 } else { 875 } else {
876 list.append( dtToString(todo->dtDue() ) ); 876 list.append( dtToString(todo->dtDue() ) );
877 } 877 }
878 } else 878 } else
879 list.append( QString() ); 879 list.append( QString() );
880 880
881 if ( todo->isCompleted() ) { 881 if ( todo->isCompleted() ) {
882 list.append( dtToString( todo->completed()) ); 882 list.append( dtToString( todo->completed()) );
883 list.append( "0" ); // yes 0 == completed 883 list.append( "0" ); // yes 0 == completed
884 } else { 884 } else {
885 list.append( dtToString( todo->completed()) ); 885 list.append( dtToString( todo->completed()) );
886 list.append( "1" ); 886 list.append( "1" );
887 } 887 }
888 list.append( QString::number( todo->priority() )); 888 list.append( QString::number( todo->priority() ));
889 if( ! todo->summary().isEmpty() ) 889 if( ! todo->summary().isEmpty() )
890 list.append( todo->summary() ); 890 list.append( todo->summary() );
891 else 891 else
892 list.append( "" ); 892 list.append( "" );
893 if (! todo->description().isEmpty() ) 893 if (! todo->description().isEmpty() )
894 list.append( todo->description() ); 894 list.append( todo->description() );
895 else 895 else
896 list.append( "" ); 896 list.append( "" );
897 for(QStringList::Iterator it=list.begin(); 897 for(QStringList::Iterator it=list.begin();
898 it!=list.end(); ++it){ 898 it!=list.end(); ++it){
899 QString& s = (*it); 899 QString& s = (*it);
900 s.replace(QRegExp("\""), "\"\""); 900 s.replace(QRegExp("\""), "\"\"");
901 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){ 901 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){
902 s.prepend('\"'); 902 s.prepend('\"');
903 s.append('\"'); 903 s.append('\"');
904 } else if(s.isEmpty() && !s.isNull()){ 904 } else if(s.isEmpty() && !s.isNull()){
905 s = "\"\""; 905 s = "\"\"";
906 } 906 }
907 } 907 }
908 return list.join(","); 908 return list.join(",");
909} 909}
910QString SharpFormat::getPart( const QString & text, bool &ok, int &start ) 910QString SharpFormat::getPart( const QString & text, bool &ok, int &start )
911{ 911{
912 //qDebug("start %d ", start); 912 //qDebug("start %d ", start);
913 913
914 QString retval =""; 914 QString retval ="";
915 if ( text.at(start) == '"' ) { 915 if ( text.at(start) == '"' ) {
916 if ( text.mid( start,2) == "\"\"" && !( text.mid( start+2,1) == "\"")) { 916 if ( text.mid( start,2) == "\"\"" && !( text.mid( start+2,1) == "\"")) {
917 start = start +2; 917 start = start +2;
918 if ( text.mid( start,1) == "," ) { 918 if ( text.mid( start,1) == "," ) {
919 start += 1; 919 start += 1;
920 } 920 }
921 retval = ""; 921 retval = "";
922 if ( text.mid( start,1) == "\n" ) { 922 if ( text.mid( start,1) == "\n" ) {
923 start += 1; 923 start += 1;
924 ok = false; 924 ok = false;
925 } 925 }
926 return retval; 926 return retval;
927 } 927 }
928 int hk = start+1; 928 int hk = start+1;
929 hk = text.find ('"',hk); 929 hk = text.find ('"',hk);
930 while ( text.at(hk+1) == '"' ) 930 while ( text.at(hk+1) == '"' )
931 hk = text.find ('"',hk+2); 931 hk = text.find ('"',hk+2);
932 retval = text.mid( start+1, hk-start-1); 932 retval = text.mid( start+1, hk-start-1);
933 start = hk+1; 933 start = hk+1;
934 retval.replace( QRegExp("\"\""), "\""); 934 retval.replace( QRegExp("\"\""), "\"");
935 if ( text.mid( start,1) == "," ) { 935 if ( text.mid( start,1) == "," ) {
936 start += 1; 936 start += 1;
937 } 937 }
938 if ( text.mid( start,1) == "\n" ) { 938 if ( text.mid( start,1) == "\n" ) {
939 start += 1; 939 start += 1;
940 ok = false; 940 ok = false;
941 } 941 }
942 //qDebug("retval***%s*** ",retval.latin1() ); 942 //qDebug("retval***%s*** ",retval.latin1() );
943 return retval; 943 return retval;
944 944
945 } else { 945 } else {
946 int nl = text.find ("\n",start); 946 int nl = text.find ("\n",start);
947 int kom = text.find (',',start); 947 int kom = text.find (',',start);
948 if ( kom < nl ) { 948 if ( kom < nl ) {
949 // qDebug("kom < nl %d ", kom); 949 // qDebug("kom < nl %d ", kom);
950 retval = text.mid(start, kom-start); 950 retval = text.mid(start, kom-start);
951 start = kom+1; 951 start = kom+1;
952 return retval; 952 return retval;
953 } else { 953 } else {
954 if ( nl == kom ) { 954 if ( nl == kom ) {
955 // qDebug(" nl == kom "); 955 // qDebug(" nl == kom ");
956 start = 0; 956 start = 0;
957 ok = false; 957 ok = false;
958 return "0"; 958 return "0";
959 } 959 }
960 // qDebug(" nl < kom ", nl); 960 // qDebug(" nl < kom ", nl);
961 retval = text.mid( start, nl-start); 961 retval = text.mid( start, nl-start);
962 ok = false; 962 ok = false;
963 start = nl+1; 963 start = nl+1;
964 return retval; 964 return retval;
965 } 965 }
966 } 966 }
967} 967}
968bool SharpFormat::fromString( Calendar *calendar, const QString & text) 968bool SharpFormat::fromString( Calendar *calendar, const QString & text)
969{ 969{
970 return false; 970 return false;
971} 971}
972bool SharpFormat::fromString2Cal( Calendar *calendar,Calendar *existingCalendar, const QString & text, const QString & type) 972bool SharpFormat::fromString2Cal( Calendar *calendar,Calendar *existingCalendar, const QString & text, const QString & type)
973{ 973{
974 // qDebug("test %s ", text.latin1()); 974 // qDebug("test %s ", text.latin1());
975 QStringList templist; 975 QStringList templist;
976 QString tempString; 976 QString tempString;
977 int start = 0; 977 int start = 0;
978 int len = text.length(); 978 int len = text.length();
979 int end = text.find ("\n",start)+1; 979 int end = text.find ("\n",start)+1;
980 bool ok = true; 980 bool ok = true;
981 start = end; 981 start = end;
982 SharpParser handler( calendar ); 982 SharpParser handler( calendar );
983 handler.setCategoriesList( mCategories ); 983 handler.setCategoriesList( mCategories );
984 while ( start > 0 ) { 984 while ( start > 0 ) {
985 templist.clear(); 985 templist.clear();
986 ok = true; 986 ok = true;
987 while ( ok ) { 987 while ( ok ) {
988 tempString = getPart( text, ok, start ); 988 tempString = getPart( text, ok, start );
989 if ( start >= len || start == 0 ) { 989 if ( start >= len || start == 0 ) {
990 start = 0; 990 start = 0;
991 ok = false; 991 ok = false;
992 } 992 }
993 if ( tempString.right(1) =="\n" ) 993 if ( tempString.right(1) =="\n" )
994 tempString = tempString.left( tempString.length()-1); 994 tempString = tempString.left( tempString.length()-1);
995 //if ( ok ) 995 //if ( ok )
996 templist.append( tempString ); 996 templist.append( tempString );
997 //qDebug("%d ---%s---", templist.count(),tempString.latin1() ); 997 //qDebug("%d ---%s---", templist.count(),tempString.latin1() );
998 } 998 }
999 handler.startElement( existingCalendar, templist, type ); 999 handler.startElement( existingCalendar, templist, type );
1000 } 1000 }
1001 1001
1002 return false; 1002 return false;
1003} 1003}
1004 1004
1005QString SharpFormat::toString( Calendar * ) 1005QString SharpFormat::toString( Calendar * )
1006{ 1006{
1007 return QString::null; 1007 return QString::null;
1008} 1008}