summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libkcal/attachment.cpp38
-rw-r--r--libkcal/attachment.h71
-rw-r--r--libkcal/icalformatimpl.cpp4
-rw-r--r--libkcal/incidence.cpp12
4 files changed, 96 insertions, 29 deletions
diff --git a/libkcal/attachment.cpp b/libkcal/attachment.cpp
index 1ead923..520ac95 100644
--- a/libkcal/attachment.cpp
+++ b/libkcal/attachment.cpp
@@ -1,86 +1,120 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3
3 Copyright (c) 2002 Michael Brade <brade@kde.org> 4 Copyright (c) 2002 Michael Brade <brade@kde.org>
4 5
5 This library is free software; you can redistribute it and/or 6 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 7 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 8 License as published by the Free Software Foundation; either
8 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.
9 10
10 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,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 14 Library General Public License for more details.
14 15
15 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
16 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
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 19 Boston, MA 02111-1307, USA.
19*/ 20*/
20 21
21#include "attachment.h" 22#include "attachment.h"
22 23
23using namespace KCal; 24using namespace KCal;
24 25
26Attachment::Attachment( const Attachment &attachment)
27{
28 mMimeType = attachment.mMimeType;
29 mData = attachment.mData;
30 mBinary = attachment.mBinary;
31 mShowInline = attachment.mShowInline;
32 mLabel = attachment.mLabel;
33}
34
25Attachment::Attachment(const QString& uri, const QString& mime) 35Attachment::Attachment(const QString& uri, const QString& mime)
26{ 36{
27 mMimeType = mime; 37 mMimeType = mime;
28 mData = uri; 38 mData = uri;
29 mBinary = false; 39 mBinary = false;
40 mShowInline = false;
41 mLabel = QString::null;
30} 42}
31 43
32Attachment::Attachment(const char *base64, const QString& mime) 44Attachment::Attachment(const char *base64, const QString& mime)
33{ 45{
34 mMimeType = mime; 46 mMimeType = mime;
35 mData = QString::fromUtf8(base64); 47 mData = QString::fromUtf8(base64);
36 mBinary = true; 48 mBinary = true;
49 mShowInline = false;
50 mLabel = QString::null;
37} 51}
38 52
39bool Attachment::isURI() const 53bool Attachment::isUri() const
40{ 54{
41 return !mBinary; 55 return !mBinary;
42} 56}
43 57
44QString Attachment::uri() const 58QString Attachment::uri() const
45{ 59{
46 if (!mBinary) 60 if (!mBinary)
47 return mData; 61 return mData;
48 else 62 else
49 return QString::null; 63 return QString::null;
50} 64}
51 65
52void Attachment::setURI(const QString& uri) 66void Attachment::setUri(const QString& uri)
53{ 67{
54 mData = uri; 68 mData = uri;
55 mBinary = false; 69 mBinary = false;
56} 70}
57 71
58bool Attachment::isBinary() const 72bool Attachment::isBinary() const
59{ 73{
60 return mBinary; 74 return mBinary;
61} 75}
62 76
63char *Attachment::data() const 77char *Attachment::data() const
64{ 78{
65 if (mBinary) 79 if (mBinary)
66 return mData.utf8().data(); 80 return mData.utf8().data();
67 else 81 else
68 return 0; 82 return 0;
69} 83}
70 84
71void Attachment::setData(const char *base64) 85void Attachment::setData(const char *base64)
72{ 86{
73 mData = QString::fromUtf8(base64); 87 mData = QString::fromUtf8(base64);
74 mBinary = true; 88 mBinary = true;
75} 89}
76 90
77QString Attachment::mimeType() const 91QString Attachment::mimeType() const
78{ 92{
79 return mMimeType; 93 return mMimeType;
80} 94}
81 95
82void Attachment::setMimeType(const QString& mime) 96void Attachment::setMimeType(const QString& mime)
83{ 97{
84 mMimeType = mime; 98 mMimeType = mime;
85} 99}
86 100
101bool Attachment::showInline() const
102{
103 return mShowInline;
104}
105
106void Attachment::setShowInline( bool showinline )
107{
108 mShowInline = showinline;
109}
110
111QString Attachment::label() const
112{
113 return mLabel;
114}
115
116void Attachment::setLabel( const QString& label )
117{
118 mLabel = label;
119}
120
diff --git a/libkcal/attachment.h b/libkcal/attachment.h
index cdf2458..5301420 100644
--- a/libkcal/attachment.h
+++ b/libkcal/attachment.h
@@ -1,69 +1,94 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3
3 Copyright (c) 2002 Michael Brade <brade@kde.org> 4 Copyright (c) 2002 Michael Brade <brade@kde.org>
4 5
5 This library is free software; you can redistribute it and/or 6 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 7 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 8 License as published by the Free Software Foundation; either
8 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.
9 10
10 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,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 14 Library General Public License for more details.
14 15
15 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
16 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
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 19 Boston, MA 02111-1307, USA.
19*/ 20*/
21#ifndef KCAL_ATTACHMENT_H
22#define KCAL_ATTACHMENT_H
20 23
21#ifndef _ATTACHMENT_H
22#define _ATTACHMENT_H
23 24
24#include <qstring.h>
25 25
26#include <qstring.h>
26 27
27namespace KCal { 28namespace KCal {
28 29
29/** 30/**
30 * This class represents information related to an attachment. 31 This class represents information related to an attachment.
31 */ 32*/
32class Attachment 33class Attachment
33{ 34{
34public: 35 public:
36
35 /** 37 /**
36 * Create a Reference to some URI. 38 Create a Reference to some URI by copying an existing Attachment.
37 * @param uri the uri this attachment refers to 39
38 * @param mime the mime type of the resource being linked to 40 @param attachment the attachment to be duplicated
39 */ 41 */
40 Attachment(const QString& uri, const QString& mime = QString::null); 42 Attachment( const Attachment &attachment );
41 43
42 /** 44 /**
43 * Create a binary attachment. 45 Create a Reference to some URI.
44 * @param base64 the attachment in base64 format 46
45 * @param mime the mime type of the attachment 47 @param uri the uri this attachment refers to
46 */ 48 @param mime the mime type of the resource being linked to
47 Attachment(const char *base64, const QString& mime = QString::null); 49 */
48 50 Attachment( const QString &uri, const QString &mime = QString::null );
49 /* The VALUE parameter in Cal */ 51
50 bool isURI() const; 52 /**
53 Create a binary attachment.
54
55 @param base64 the attachment in base64 format
56 @param mime the mime type of the attachment
57 */
58 Attachment( const char *base64, const QString &mime = QString::null );
59
60 /* The VALUE parameter in iCal */
61 bool isUri() const;
51 QString uri() const; 62 QString uri() const;
52 void setURI(const QString& uri); 63 void setUri( const QString &uri );
53 64
54 bool isBinary() const; 65 bool isBinary() const;
55 char *data() const; 66 char *data() const;
56 void setData(const char *base64); 67 void setData( const char *base64 );
57 68
58 /* The optional FMTTYPE parameter in iCal */ 69 /* The optional FMTTYPE parameter in iCal */
59 QString mimeType() const; 70 QString mimeType() const;
60 void setMimeType(const QString& mime); 71 void setMimeType( const QString &mime );
61private: 72
73 /* The custom X-CONTENT-DISPOSITION parameter, used by OGo etc. */
74 bool showInline() const;
75 void setShowInline( bool showinline );
76
77 /* The custom X-LABEL parameter to show a human-readable title */
78 QString label() const;
79 void setLabel( const QString &label );
80
81 private:
62 QString mMimeType; 82 QString mMimeType;
63 QString mData; 83 QString mData;
64 bool mBinary; 84 bool mBinary;
85 bool mShowInline;
86 QString mLabel;
87
88 class Private;
89 Private *d;
65}; 90};
66 91
67} 92}
68 93
69#endif 94#endif
diff --git a/libkcal/icalformatimpl.cpp b/libkcal/icalformatimpl.cpp
index 53aa039..65eabc8 100644
--- a/libkcal/icalformatimpl.cpp
+++ b/libkcal/icalformatimpl.cpp
@@ -1,2059 +1,2059 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21#include <qdatetime.h> 21#include <qdatetime.h>
22#include <qstring.h> 22#include <qstring.h>
23#include <qptrlist.h> 23#include <qptrlist.h>
24#include <qfile.h> 24#include <qfile.h>
25 25
26#include <kdebug.h> 26#include <kdebug.h>
27#include <klocale.h> 27#include <klocale.h>
28#include <kglobal.h> 28#include <kglobal.h>
29 29
30extern "C" { 30extern "C" {
31 #include <ical.h> 31 #include <ical.h>
32 #include <icalss.h> 32 #include <icalss.h>
33 #include <icalparser.h> 33 #include <icalparser.h>
34 #include <icalrestriction.h> 34 #include <icalrestriction.h>
35} 35}
36 36
37#include "calendar.h" 37#include "calendar.h"
38#include "journal.h" 38#include "journal.h"
39#include "icalformat.h" 39#include "icalformat.h"
40#include "icalformatimpl.h" 40#include "icalformatimpl.h"
41#include "compat.h" 41#include "compat.h"
42 42
43#define _ICAL_VERSION "2.0" 43#define _ICAL_VERSION "2.0"
44 44
45using namespace KCal; 45using namespace KCal;
46 46
47const int gSecondsPerMinute = 60; 47const int gSecondsPerMinute = 60;
48const int gSecondsPerHour = gSecondsPerMinute * 60; 48const int gSecondsPerHour = gSecondsPerMinute * 60;
49const int gSecondsPerDay = gSecondsPerHour * 24; 49const int gSecondsPerDay = gSecondsPerHour * 24;
50const int gSecondsPerWeek = gSecondsPerDay * 7; 50const int gSecondsPerWeek = gSecondsPerDay * 7;
51 51
52ICalFormatImpl::ICalFormatImpl( ICalFormat *parent ) : 52ICalFormatImpl::ICalFormatImpl( ICalFormat *parent ) :
53 mParent( parent ), mCalendarVersion( 0 ) 53 mParent( parent ), mCalendarVersion( 0 )
54{ 54{
55 mCompat = new Compat; 55 mCompat = new Compat;
56} 56}
57 57
58ICalFormatImpl::~ICalFormatImpl() 58ICalFormatImpl::~ICalFormatImpl()
59{ 59{
60 delete mCompat; 60 delete mCompat;
61} 61}
62 62
63class ToStringVisitor : public Incidence::Visitor 63class ToStringVisitor : public Incidence::Visitor
64{ 64{
65 public: 65 public:
66 ToStringVisitor( ICalFormatImpl *impl ) : mImpl( impl ), mComponent( 0 ) {} 66 ToStringVisitor( ICalFormatImpl *impl ) : mImpl( impl ), mComponent( 0 ) {}
67 67
68 bool visit( Event *e ) { mComponent = mImpl->writeEvent( e ); return true; } 68 bool visit( Event *e ) { mComponent = mImpl->writeEvent( e ); return true; }
69 bool visit( Todo *e ) { mComponent = mImpl->writeTodo( e ); return true; } 69 bool visit( Todo *e ) { mComponent = mImpl->writeTodo( e ); return true; }
70 bool visit( Journal *e ) { mComponent = mImpl->writeJournal( e ); return true; } 70 bool visit( Journal *e ) { mComponent = mImpl->writeJournal( e ); return true; }
71 71
72 icalcomponent *component() { return mComponent; } 72 icalcomponent *component() { return mComponent; }
73 73
74 private: 74 private:
75 ICalFormatImpl *mImpl; 75 ICalFormatImpl *mImpl;
76 icalcomponent *mComponent; 76 icalcomponent *mComponent;
77}; 77};
78 78
79icalcomponent *ICalFormatImpl::writeIncidence(Incidence *incidence) 79icalcomponent *ICalFormatImpl::writeIncidence(Incidence *incidence)
80{ 80{
81 ToStringVisitor v( this ); 81 ToStringVisitor v( this );
82 incidence->accept(v); 82 incidence->accept(v);
83 return v.component(); 83 return v.component();
84} 84}
85 85
86icalcomponent *ICalFormatImpl::writeTodo(Todo *todo) 86icalcomponent *ICalFormatImpl::writeTodo(Todo *todo)
87{ 87{
88 QString tmpStr; 88 QString tmpStr;
89 QStringList tmpStrList; 89 QStringList tmpStrList;
90 90
91 icalcomponent *vtodo = icalcomponent_new(ICAL_VTODO_COMPONENT); 91 icalcomponent *vtodo = icalcomponent_new(ICAL_VTODO_COMPONENT);
92 92
93 writeIncidence(vtodo,todo); 93 writeIncidence(vtodo,todo);
94 94
95 // due date 95 // due date
96 if (todo->hasDueDate()) { 96 if (todo->hasDueDate()) {
97 icaltimetype due; 97 icaltimetype due;
98 if (todo->doesFloat()) { 98 if (todo->doesFloat()) {
99 due = writeICalDate(todo->dtDue().date()); 99 due = writeICalDate(todo->dtDue().date());
100 } else { 100 } else {
101 due = writeICalDateTime(todo->dtDue()); 101 due = writeICalDateTime(todo->dtDue());
102 } 102 }
103 icalcomponent_add_property(vtodo,icalproperty_new_due(due)); 103 icalcomponent_add_property(vtodo,icalproperty_new_due(due));
104 } 104 }
105 105
106 // start time 106 // start time
107 if (todo->hasStartDate()) { 107 if (todo->hasStartDate()) {
108 icaltimetype start; 108 icaltimetype start;
109 if (todo->doesFloat()) { 109 if (todo->doesFloat()) {
110// kdDebug(5800) << "§§ Incidence " << todo->summary() << " floats." << endl; 110// kdDebug(5800) << "§§ Incidence " << todo->summary() << " floats." << endl;
111 start = writeICalDate(todo->dtStart().date()); 111 start = writeICalDate(todo->dtStart().date());
112 } else { 112 } else {
113// kdDebug(5800) << "§§ incidence " << todo->summary() << " has time." << endl; 113// kdDebug(5800) << "§§ incidence " << todo->summary() << " has time." << endl;
114 start = writeICalDateTime(todo->dtStart()); 114 start = writeICalDateTime(todo->dtStart());
115 } 115 }
116 icalcomponent_add_property(vtodo,icalproperty_new_dtstart(start)); 116 icalcomponent_add_property(vtodo,icalproperty_new_dtstart(start));
117 } 117 }
118 118
119 // completion date 119 // completion date
120 if (todo->isCompleted()) { 120 if (todo->isCompleted()) {
121 if (!todo->hasCompletedDate()) { 121 if (!todo->hasCompletedDate()) {
122 // If todo was created by KOrganizer <2.2 it has no correct completion 122 // If todo was created by KOrganizer <2.2 it has no correct completion
123 // date. Set it to now. 123 // date. Set it to now.
124 todo->setCompleted(QDateTime::currentDateTime()); 124 todo->setCompleted(QDateTime::currentDateTime());
125 } 125 }
126 icaltimetype completed = writeICalDateTime(todo->completed()); 126 icaltimetype completed = writeICalDateTime(todo->completed());
127 icalcomponent_add_property(vtodo,icalproperty_new_completed(completed)); 127 icalcomponent_add_property(vtodo,icalproperty_new_completed(completed));
128 } 128 }
129 129
130 icalcomponent_add_property(vtodo, 130 icalcomponent_add_property(vtodo,
131 icalproperty_new_percentcomplete(todo->percentComplete())); 131 icalproperty_new_percentcomplete(todo->percentComplete()));
132 132
133 return vtodo; 133 return vtodo;
134} 134}
135 135
136icalcomponent *ICalFormatImpl::writeEvent(Event *event) 136icalcomponent *ICalFormatImpl::writeEvent(Event *event)
137{ 137{
138 kdDebug(5800) << "Write Event '" << event->summary() << "' (" << event->uid() 138 kdDebug(5800) << "Write Event '" << event->summary() << "' (" << event->uid()
139 << ")" << endl; 139 << ")" << endl;
140 140
141 QString tmpStr; 141 QString tmpStr;
142 QStringList tmpStrList; 142 QStringList tmpStrList;
143 143
144 icalcomponent *vevent = icalcomponent_new(ICAL_VEVENT_COMPONENT); 144 icalcomponent *vevent = icalcomponent_new(ICAL_VEVENT_COMPONENT);
145 145
146 writeIncidence(vevent,event); 146 writeIncidence(vevent,event);
147 147
148 // start time 148 // start time
149 icaltimetype start; 149 icaltimetype start;
150 if (event->doesFloat()) { 150 if (event->doesFloat()) {
151// kdDebug(5800) << "§§ Incidence " << event->summary() << " floats." << endl; 151// kdDebug(5800) << "§§ Incidence " << event->summary() << " floats." << endl;
152 start = writeICalDate(event->dtStart().date()); 152 start = writeICalDate(event->dtStart().date());
153 } else { 153 } else {
154// kdDebug(5800) << "§§ incidence " << event->summary() << " has time." << endl; 154// kdDebug(5800) << "§§ incidence " << event->summary() << " has time." << endl;
155 start = writeICalDateTime(event->dtStart()); 155 start = writeICalDateTime(event->dtStart());
156 } 156 }
157 icalcomponent_add_property(vevent,icalproperty_new_dtstart(start)); 157 icalcomponent_add_property(vevent,icalproperty_new_dtstart(start));
158 158
159 if (event->hasEndDate()) { 159 if (event->hasEndDate()) {
160 // end time 160 // end time
161 icaltimetype end; 161 icaltimetype end;
162 if (event->doesFloat()) { 162 if (event->doesFloat()) {
163// kdDebug(5800) << "§§ Event " << event->summary() << " floats." << endl; 163// kdDebug(5800) << "§§ Event " << event->summary() << " floats." << endl;
164 // +1 day because end date is non-inclusive. 164 // +1 day because end date is non-inclusive.
165 end = writeICalDate( event->dtEnd().date().addDays( 1 ) ); 165 end = writeICalDate( event->dtEnd().date().addDays( 1 ) );
166 } else { 166 } else {
167// kdDebug(5800) << "§§ Event " << event->summary() << " has time." << endl; 167// kdDebug(5800) << "§§ Event " << event->summary() << " has time." << endl;
168 end = writeICalDateTime(event->dtEnd()); 168 end = writeICalDateTime(event->dtEnd());
169 } 169 }
170 icalcomponent_add_property(vevent,icalproperty_new_dtend(end)); 170 icalcomponent_add_property(vevent,icalproperty_new_dtend(end));
171 } 171 }
172 172
173// TODO: attachments, resources 173// TODO: attachments, resources
174#if 0 174#if 0
175 // attachments 175 // attachments
176 tmpStrList = anEvent->attachments(); 176 tmpStrList = anEvent->attachments();
177 for ( QStringList::Iterator it = tmpStrList.begin(); 177 for ( QStringList::Iterator it = tmpStrList.begin();
178 it != tmpStrList.end(); 178 it != tmpStrList.end();
179 ++it ) 179 ++it )
180 addPropValue(vevent, VCAttachProp, (*it).utf8()); 180 addPropValue(vevent, VCAttachProp, (*it).utf8());
181 181
182 // resources 182 // resources
183 tmpStrList = anEvent->resources(); 183 tmpStrList = anEvent->resources();
184 tmpStr = tmpStrList.join(";"); 184 tmpStr = tmpStrList.join(";");
185 if (!tmpStr.isEmpty()) 185 if (!tmpStr.isEmpty())
186 addPropValue(vevent, VCResourcesProp, tmpStr.utf8()); 186 addPropValue(vevent, VCResourcesProp, tmpStr.utf8());
187 187
188#endif 188#endif
189 189
190 // Transparency 190 // Transparency
191 switch( event->transparency() ) { 191 switch( event->transparency() ) {
192 case Event::Transparent: 192 case Event::Transparent:
193 icalcomponent_add_property(vevent, icalproperty_new_transp(ICAL_TRANSP_TRANSPARENT)); 193 icalcomponent_add_property(vevent, icalproperty_new_transp(ICAL_TRANSP_TRANSPARENT));
194 break; 194 break;
195 case Event::Opaque: 195 case Event::Opaque:
196 icalcomponent_add_property(vevent, icalproperty_new_transp(ICAL_TRANSP_OPAQUE)); 196 icalcomponent_add_property(vevent, icalproperty_new_transp(ICAL_TRANSP_OPAQUE));
197 break; 197 break;
198 } 198 }
199 199
200 return vevent; 200 return vevent;
201} 201}
202 202
203icalcomponent *ICalFormatImpl::writeFreeBusy(FreeBusy *freebusy, 203icalcomponent *ICalFormatImpl::writeFreeBusy(FreeBusy *freebusy,
204 Scheduler::Method method) 204 Scheduler::Method method)
205{ 205{
206 206
207 207
208 icalcomponent *vfreebusy = icalcomponent_new(ICAL_VFREEBUSY_COMPONENT); 208 icalcomponent *vfreebusy = icalcomponent_new(ICAL_VFREEBUSY_COMPONENT);
209 209
210 writeIncidenceBase(vfreebusy,freebusy); 210 writeIncidenceBase(vfreebusy,freebusy);
211 211
212 icalcomponent_add_property(vfreebusy, icalproperty_new_dtstart( 212 icalcomponent_add_property(vfreebusy, icalproperty_new_dtstart(
213 writeICalDateTime(freebusy->dtStart()))); 213 writeICalDateTime(freebusy->dtStart())));
214 214
215 icalcomponent_add_property(vfreebusy, icalproperty_new_dtend( 215 icalcomponent_add_property(vfreebusy, icalproperty_new_dtend(
216 writeICalDateTime(freebusy->dtEnd()))); 216 writeICalDateTime(freebusy->dtEnd())));
217 217
218 if (method == Scheduler::Request) { 218 if (method == Scheduler::Request) {
219 icalcomponent_add_property(vfreebusy,icalproperty_new_uid( 219 icalcomponent_add_property(vfreebusy,icalproperty_new_uid(
220 freebusy->uid().utf8())); 220 freebusy->uid().utf8()));
221 } 221 }
222 222
223 //Loops through all the periods in the freebusy object 223 //Loops through all the periods in the freebusy object
224 QValueList<Period> list = freebusy->busyPeriods(); 224 QValueList<Period> list = freebusy->busyPeriods();
225 QValueList<Period>::Iterator it; 225 QValueList<Period>::Iterator it;
226 icalperiodtype period; 226 icalperiodtype period;
227 for (it = list.begin(); it!= list.end(); ++it) { 227 for (it = list.begin(); it!= list.end(); ++it) {
228 period.start = writeICalDateTime((*it).start()); 228 period.start = writeICalDateTime((*it).start());
229 period.end = writeICalDateTime((*it).end()); 229 period.end = writeICalDateTime((*it).end());
230 icalcomponent_add_property(vfreebusy, icalproperty_new_freebusy(period) ); 230 icalcomponent_add_property(vfreebusy, icalproperty_new_freebusy(period) );
231 } 231 }
232 232
233 return vfreebusy; 233 return vfreebusy;
234} 234}
235 235
236icalcomponent *ICalFormatImpl::writeJournal(Journal *journal) 236icalcomponent *ICalFormatImpl::writeJournal(Journal *journal)
237{ 237{
238 icalcomponent *vjournal = icalcomponent_new(ICAL_VJOURNAL_COMPONENT); 238 icalcomponent *vjournal = icalcomponent_new(ICAL_VJOURNAL_COMPONENT);
239 239
240 writeIncidence(vjournal,journal); 240 writeIncidence(vjournal,journal);
241 241
242 // start time 242 // start time
243 if (journal->dtStart().isValid()) { 243 if (journal->dtStart().isValid()) {
244 icaltimetype start; 244 icaltimetype start;
245 if (journal->doesFloat()) { 245 if (journal->doesFloat()) {
246// kdDebug(5800) << "§§ Incidence " << event->summary() << " floats." << endl; 246// kdDebug(5800) << "§§ Incidence " << event->summary() << " floats." << endl;
247 start = writeICalDate(journal->dtStart().date()); 247 start = writeICalDate(journal->dtStart().date());
248 } else { 248 } else {
249// kdDebug(5800) << "§§ incidence " << event->summary() << " has time." << endl; 249// kdDebug(5800) << "§§ incidence " << event->summary() << " has time." << endl;
250 start = writeICalDateTime(journal->dtStart()); 250 start = writeICalDateTime(journal->dtStart());
251 } 251 }
252 icalcomponent_add_property(vjournal,icalproperty_new_dtstart(start)); 252 icalcomponent_add_property(vjournal,icalproperty_new_dtstart(start));
253 } 253 }
254 254
255 return vjournal; 255 return vjournal;
256} 256}
257 257
258void ICalFormatImpl::writeIncidence(icalcomponent *parent,Incidence *incidence) 258void ICalFormatImpl::writeIncidence(icalcomponent *parent,Incidence *incidence)
259{ 259{
260 // pilot sync stuff 260 // pilot sync stuff
261// TODO: move this application-specific code to kpilot 261// TODO: move this application-specific code to kpilot
262 if (incidence->pilotId()) { 262 if (incidence->pilotId()) {
263 incidence->setNonKDECustomProperty("X-PILOTID", QString::number(incidence->pilotId())); 263 incidence->setNonKDECustomProperty("X-PILOTID", QString::number(incidence->pilotId()));
264 incidence->setNonKDECustomProperty("X-PILOTSTAT", QString::number(incidence->syncStatus())); 264 incidence->setNonKDECustomProperty("X-PILOTSTAT", QString::number(incidence->syncStatus()));
265 } 265 }
266 if ( !incidence->IDStr().isEmpty()) { 266 if ( !incidence->IDStr().isEmpty()) {
267 incidence->setNonKDECustomProperty("X-KOPIEXTID",incidence->IDStr() ); 267 incidence->setNonKDECustomProperty("X-KOPIEXTID",incidence->IDStr() );
268 } 268 }
269 269
270 270
271 writeIncidenceBase(parent,incidence); 271 writeIncidenceBase(parent,incidence);
272 if (incidence->cancelled()) { 272 if (incidence->cancelled()) {
273 icalcomponent_add_property(parent,icalproperty_new_status(ICAL_STATUS_CANCELLED)); 273 icalcomponent_add_property(parent,icalproperty_new_status(ICAL_STATUS_CANCELLED));
274 } 274 }
275 275
276 // creation date 276 // creation date
277 icalcomponent_add_property(parent,icalproperty_new_created( 277 icalcomponent_add_property(parent,icalproperty_new_created(
278 writeICalDateTime(incidence->created()))); 278 writeICalDateTime(incidence->created())));
279 279
280 // unique id 280 // unique id
281 icalcomponent_add_property(parent,icalproperty_new_uid( 281 icalcomponent_add_property(parent,icalproperty_new_uid(
282 incidence->uid().utf8())); 282 incidence->uid().utf8()));
283 283
284 // revision 284 // revision
285 icalcomponent_add_property(parent,icalproperty_new_sequence( 285 icalcomponent_add_property(parent,icalproperty_new_sequence(
286 incidence->revision())); 286 incidence->revision()));
287 287
288 // last modification date 288 // last modification date
289 icalcomponent_add_property(parent,icalproperty_new_lastmodified( 289 icalcomponent_add_property(parent,icalproperty_new_lastmodified(
290 writeICalDateTime(incidence->lastModified()))); 290 writeICalDateTime(incidence->lastModified())));
291 291
292 // description 292 // description
293 if (!incidence->description().isEmpty()) { 293 if (!incidence->description().isEmpty()) {
294 icalcomponent_add_property(parent,icalproperty_new_description( 294 icalcomponent_add_property(parent,icalproperty_new_description(
295 incidence->description().utf8())); 295 incidence->description().utf8()));
296 } 296 }
297 297
298 // summary 298 // summary
299 if (!incidence->summary().isEmpty()) { 299 if (!incidence->summary().isEmpty()) {
300 icalcomponent_add_property(parent,icalproperty_new_summary( 300 icalcomponent_add_property(parent,icalproperty_new_summary(
301 incidence->summary().utf8())); 301 incidence->summary().utf8()));
302 } 302 }
303 303
304 // location 304 // location
305 if (!incidence->location().isEmpty()) { 305 if (!incidence->location().isEmpty()) {
306 icalcomponent_add_property(parent,icalproperty_new_location( 306 icalcomponent_add_property(parent,icalproperty_new_location(
307 incidence->location().utf8())); 307 incidence->location().utf8()));
308 } 308 }
309 309
310// TODO: 310// TODO:
311 // status 311 // status
312// addPropValue(parent, VCStatusProp, incidence->getStatusStr().utf8()); 312// addPropValue(parent, VCStatusProp, incidence->getStatusStr().utf8());
313 313
314 // secrecy 314 // secrecy
315 enum icalproperty_class classInt; 315 enum icalproperty_class classInt;
316 switch (incidence->secrecy()) { 316 switch (incidence->secrecy()) {
317 case Incidence::SecrecyPublic: 317 case Incidence::SecrecyPublic:
318 classInt = ICAL_CLASS_PUBLIC; 318 classInt = ICAL_CLASS_PUBLIC;
319 break; 319 break;
320 case Incidence::SecrecyConfidential: 320 case Incidence::SecrecyConfidential:
321 classInt = ICAL_CLASS_CONFIDENTIAL; 321 classInt = ICAL_CLASS_CONFIDENTIAL;
322 break; 322 break;
323 case Incidence::SecrecyPrivate: 323 case Incidence::SecrecyPrivate:
324 classInt =ICAL_CLASS_PRIVATE ; 324 classInt =ICAL_CLASS_PRIVATE ;
325 default: 325 default:
326 classInt =ICAL_CLASS_PRIVATE ; 326 classInt =ICAL_CLASS_PRIVATE ;
327 break; 327 break;
328 } 328 }
329 icalcomponent_add_property(parent,icalproperty_new_class(classInt)); 329 icalcomponent_add_property(parent,icalproperty_new_class(classInt));
330 330
331 // priority 331 // priority
332 icalcomponent_add_property(parent,icalproperty_new_priority( 332 icalcomponent_add_property(parent,icalproperty_new_priority(
333 incidence->priority())); 333 incidence->priority()));
334 334
335 // categories 335 // categories
336 QStringList categories = incidence->categories(); 336 QStringList categories = incidence->categories();
337 QStringList::Iterator it; 337 QStringList::Iterator it;
338 for(it = categories.begin(); it != categories.end(); ++it ) { 338 for(it = categories.begin(); it != categories.end(); ++it ) {
339 icalcomponent_add_property(parent,icalproperty_new_categories((*it).utf8())); 339 icalcomponent_add_property(parent,icalproperty_new_categories((*it).utf8()));
340 } 340 }
341// TODO: Ensure correct concatenation of categories properties. 341// TODO: Ensure correct concatenation of categories properties.
342 342
343/* 343/*
344 // categories 344 // categories
345 tmpStrList = incidence->getCategories(); 345 tmpStrList = incidence->getCategories();
346 tmpStr = ""; 346 tmpStr = "";
347 QString catStr; 347 QString catStr;
348 for ( QStringList::Iterator it = tmpStrList.begin(); 348 for ( QStringList::Iterator it = tmpStrList.begin();
349 it != tmpStrList.end(); 349 it != tmpStrList.end();
350 ++it ) { 350 ++it ) {
351 catStr = *it; 351 catStr = *it;
352 if (catStr[0] == ' ') 352 if (catStr[0] == ' ')
353 tmpStr += catStr.mid(1); 353 tmpStr += catStr.mid(1);
354 else 354 else
355 tmpStr += catStr; 355 tmpStr += catStr;
356 // this must be a ';' character as the vCalendar specification requires! 356 // this must be a ';' character as the vCalendar specification requires!
357 // vcc.y has been hacked to translate the ';' to a ',' when the vcal is 357 // vcc.y has been hacked to translate the ';' to a ',' when the vcal is
358 // read in. 358 // read in.
359 tmpStr += ";"; 359 tmpStr += ";";
360 } 360 }
361 if (!tmpStr.isEmpty()) { 361 if (!tmpStr.isEmpty()) {
362 tmpStr.truncate(tmpStr.length()-1); 362 tmpStr.truncate(tmpStr.length()-1);
363 icalcomponent_add_property(parent,icalproperty_new_categories( 363 icalcomponent_add_property(parent,icalproperty_new_categories(
364 writeText(incidence->getCategories().join(";")))); 364 writeText(incidence->getCategories().join(";"))));
365 } 365 }
366*/ 366*/
367 367
368 // related event 368 // related event
369 if (!incidence->relatedToUid().isEmpty()) { 369 if (!incidence->relatedToUid().isEmpty()) {
370 icalcomponent_add_property(parent,icalproperty_new_relatedto( 370 icalcomponent_add_property(parent,icalproperty_new_relatedto(
371 incidence->relatedToUid().utf8())); 371 incidence->relatedToUid().utf8()));
372 } 372 }
373 373
374 // recurrence rule stuff 374 // recurrence rule stuff
375 if (incidence->doesRecur()) { 375 if (incidence->doesRecur()) {
376 icalcomponent_add_property(parent,writeRecurrenceRule(incidence->recurrence())); 376 icalcomponent_add_property(parent,writeRecurrenceRule(incidence->recurrence()));
377 // recurrence excpetion dates 377 // recurrence excpetion dates
378 DateList dateList = incidence->exDates(); 378 DateList dateList = incidence->exDates();
379 DateList::ConstIterator exIt; 379 DateList::ConstIterator exIt;
380 for(exIt = dateList.begin(); exIt != dateList.end(); ++exIt) { 380 for(exIt = dateList.begin(); exIt != dateList.end(); ++exIt) {
381 icalcomponent_add_property(parent,icalproperty_new_exdate( 381 icalcomponent_add_property(parent,icalproperty_new_exdate(
382 writeICalDate(*exIt))); 382 writeICalDate(*exIt)));
383 } 383 }
384 } 384 }
385 385
386 // attachments 386 // attachments
387 QPtrList<Attachment> attachments = incidence->attachments(); 387 QPtrList<Attachment> attachments = incidence->attachments();
388 for (Attachment *at = attachments.first(); at; at = attachments.next()) 388 for (Attachment *at = attachments.first(); at; at = attachments.next())
389 icalcomponent_add_property(parent,writeAttachment(at)); 389 icalcomponent_add_property(parent,writeAttachment(at));
390 390
391 // alarms 391 // alarms
392 QPtrList<Alarm> alarms = incidence->alarms(); 392 QPtrList<Alarm> alarms = incidence->alarms();
393 Alarm* alarm; 393 Alarm* alarm;
394 for (alarm = alarms.first(); alarm; alarm = alarms.next()) { 394 for (alarm = alarms.first(); alarm; alarm = alarms.next()) {
395 if (alarm->enabled()) { 395 if (alarm->enabled()) {
396 kdDebug(5800) << "Write alarm for " << incidence->summary() << endl; 396 kdDebug(5800) << "Write alarm for " << incidence->summary() << endl;
397 icalcomponent_add_component(parent,writeAlarm(alarm)); 397 icalcomponent_add_component(parent,writeAlarm(alarm));
398 } 398 }
399 } 399 }
400 if( incidence->hasRecurrenceID() ) { 400 if( incidence->hasRecurrenceID() ) {
401 icalcomponent_add_property(parent, 401 icalcomponent_add_property(parent,
402 icalproperty_new_recurrenceid( writeICalDateTime( incidence->recurrenceID()))); 402 icalproperty_new_recurrenceid( writeICalDateTime( incidence->recurrenceID())));
403 } 403 }
404 // duration 404 // duration
405 405
406// turned off as it always is set to PTS0 (and must not occur together with DTEND 406// turned off as it always is set to PTS0 (and must not occur together with DTEND
407 407
408 if (incidence->hasDuration()) { 408 if (incidence->hasDuration()) {
409 icaldurationtype duration; 409 icaldurationtype duration;
410 duration = writeICalDuration(incidence->duration()); 410 duration = writeICalDuration(incidence->duration());
411 icalcomponent_add_property(parent,icalproperty_new_duration(duration)); 411 icalcomponent_add_property(parent,icalproperty_new_duration(duration));
412 } 412 }
413} 413}
414 414
415void ICalFormatImpl::writeIncidenceBase(icalcomponent *parent,IncidenceBase *incidenceBase) 415void ICalFormatImpl::writeIncidenceBase(icalcomponent *parent,IncidenceBase *incidenceBase)
416{ 416{
417 icalcomponent_add_property(parent,icalproperty_new_dtstamp( 417 icalcomponent_add_property(parent,icalproperty_new_dtstamp(
418 writeICalDateTime(QDateTime::currentDateTime()))); 418 writeICalDateTime(QDateTime::currentDateTime())));
419 419
420 // organizer stuff 420 // organizer stuff
421 icalcomponent_add_property(parent,icalproperty_new_organizer( 421 icalcomponent_add_property(parent,icalproperty_new_organizer(
422 ("MAILTO:" + incidenceBase->organizer()).utf8())); 422 ("MAILTO:" + incidenceBase->organizer()).utf8()));
423 423
424 // attendees 424 // attendees
425 if (incidenceBase->attendeeCount() != 0) { 425 if (incidenceBase->attendeeCount() != 0) {
426 QPtrList<Attendee> al = incidenceBase->attendees(); 426 QPtrList<Attendee> al = incidenceBase->attendees();
427 QPtrListIterator<Attendee> ai(al); 427 QPtrListIterator<Attendee> ai(al);
428 for (; ai.current(); ++ai) { 428 for (; ai.current(); ++ai) {
429 icalcomponent_add_property(parent,writeAttendee(ai.current())); 429 icalcomponent_add_property(parent,writeAttendee(ai.current()));
430 } 430 }
431 } 431 }
432 432
433 // custom properties 433 // custom properties
434 writeCustomProperties(parent, incidenceBase); 434 writeCustomProperties(parent, incidenceBase);
435} 435}
436 436
437void ICalFormatImpl::writeCustomProperties(icalcomponent *parent,CustomProperties *properties) 437void ICalFormatImpl::writeCustomProperties(icalcomponent *parent,CustomProperties *properties)
438{ 438{
439 QMap<QCString, QString> custom = properties->customProperties(); 439 QMap<QCString, QString> custom = properties->customProperties();
440 for (QMap<QCString, QString>::Iterator c = custom.begin(); c != custom.end(); ++c) { 440 for (QMap<QCString, QString>::Iterator c = custom.begin(); c != custom.end(); ++c) {
441 icalproperty *p = icalproperty_new_x(c.data().utf8()); 441 icalproperty *p = icalproperty_new_x(c.data().utf8());
442 icalproperty_set_x_name(p,c.key()); 442 icalproperty_set_x_name(p,c.key());
443 icalcomponent_add_property(parent,p); 443 icalcomponent_add_property(parent,p);
444 } 444 }
445} 445}
446 446
447icalproperty *ICalFormatImpl::writeAttendee(Attendee *attendee) 447icalproperty *ICalFormatImpl::writeAttendee(Attendee *attendee)
448{ 448{
449 icalproperty *p = icalproperty_new_attendee("mailto:" + attendee->email().utf8()); 449 icalproperty *p = icalproperty_new_attendee("mailto:" + attendee->email().utf8());
450 450
451 if (!attendee->name().isEmpty()) { 451 if (!attendee->name().isEmpty()) {
452 icalproperty_add_parameter(p,icalparameter_new_cn(attendee->name().utf8())); 452 icalproperty_add_parameter(p,icalparameter_new_cn(attendee->name().utf8()));
453 } 453 }
454 454
455 455
456 icalproperty_add_parameter(p,icalparameter_new_rsvp( 456 icalproperty_add_parameter(p,icalparameter_new_rsvp(
457 attendee->RSVP() ? ICAL_RSVP_TRUE : ICAL_RSVP_FALSE )); 457 attendee->RSVP() ? ICAL_RSVP_TRUE : ICAL_RSVP_FALSE ));
458 458
459 icalparameter_partstat status = ICAL_PARTSTAT_NEEDSACTION; 459 icalparameter_partstat status = ICAL_PARTSTAT_NEEDSACTION;
460 switch (attendee->status()) { 460 switch (attendee->status()) {
461 default: 461 default:
462 case Attendee::NeedsAction: 462 case Attendee::NeedsAction:
463 status = ICAL_PARTSTAT_NEEDSACTION; 463 status = ICAL_PARTSTAT_NEEDSACTION;
464 break; 464 break;
465 case Attendee::Accepted: 465 case Attendee::Accepted:
466 status = ICAL_PARTSTAT_ACCEPTED; 466 status = ICAL_PARTSTAT_ACCEPTED;
467 break; 467 break;
468 case Attendee::Declined: 468 case Attendee::Declined:
469 status = ICAL_PARTSTAT_DECLINED; 469 status = ICAL_PARTSTAT_DECLINED;
470 break; 470 break;
471 case Attendee::Tentative: 471 case Attendee::Tentative:
472 status = ICAL_PARTSTAT_TENTATIVE; 472 status = ICAL_PARTSTAT_TENTATIVE;
473 break; 473 break;
474 case Attendee::Delegated: 474 case Attendee::Delegated:
475 status = ICAL_PARTSTAT_DELEGATED; 475 status = ICAL_PARTSTAT_DELEGATED;
476 break; 476 break;
477 case Attendee::Completed: 477 case Attendee::Completed:
478 status = ICAL_PARTSTAT_COMPLETED; 478 status = ICAL_PARTSTAT_COMPLETED;
479 break; 479 break;
480 case Attendee::InProcess: 480 case Attendee::InProcess:
481 status = ICAL_PARTSTAT_INPROCESS; 481 status = ICAL_PARTSTAT_INPROCESS;
482 break; 482 break;
483 } 483 }
484 icalproperty_add_parameter(p,icalparameter_new_partstat(status)); 484 icalproperty_add_parameter(p,icalparameter_new_partstat(status));
485 485
486 icalparameter_role role = ICAL_ROLE_REQPARTICIPANT; 486 icalparameter_role role = ICAL_ROLE_REQPARTICIPANT;
487 switch (attendee->role()) { 487 switch (attendee->role()) {
488 case Attendee::Chair: 488 case Attendee::Chair:
489 role = ICAL_ROLE_CHAIR; 489 role = ICAL_ROLE_CHAIR;
490 break; 490 break;
491 default: 491 default:
492 case Attendee::ReqParticipant: 492 case Attendee::ReqParticipant:
493 role = ICAL_ROLE_REQPARTICIPANT; 493 role = ICAL_ROLE_REQPARTICIPANT;
494 break; 494 break;
495 case Attendee::OptParticipant: 495 case Attendee::OptParticipant:
496 role = ICAL_ROLE_OPTPARTICIPANT; 496 role = ICAL_ROLE_OPTPARTICIPANT;
497 break; 497 break;
498 case Attendee::NonParticipant: 498 case Attendee::NonParticipant:
499 role = ICAL_ROLE_NONPARTICIPANT; 499 role = ICAL_ROLE_NONPARTICIPANT;
500 break; 500 break;
501 } 501 }
502 icalproperty_add_parameter(p,icalparameter_new_role(role)); 502 icalproperty_add_parameter(p,icalparameter_new_role(role));
503 503
504 if (!attendee->uid().isEmpty()) { 504 if (!attendee->uid().isEmpty()) {
505 icalparameter* icalparameter_uid = icalparameter_new_x(attendee->uid().utf8()); 505 icalparameter* icalparameter_uid = icalparameter_new_x(attendee->uid().utf8());
506 icalparameter_set_xname(icalparameter_uid,"X-UID"); 506 icalparameter_set_xname(icalparameter_uid,"X-UID");
507 icalproperty_add_parameter(p,icalparameter_uid); 507 icalproperty_add_parameter(p,icalparameter_uid);
508 } 508 }
509 509
510 return p; 510 return p;
511} 511}
512 512
513icalproperty *ICalFormatImpl::writeAttachment(Attachment *att) 513icalproperty *ICalFormatImpl::writeAttachment(Attachment *att)
514{ 514{
515#if 0 515#if 0
516 icalattachtype* attach = icalattachtype_new(); 516 icalattachtype* attach = icalattachtype_new();
517 if (att->isURI()) 517 if (att->isUri())
518 icalattachtype_set_url(attach, att->uri().utf8().data()); 518 icalattachtype_set_url(attach, att->uri().utf8().data());
519 else 519 else
520 icalattachtype_set_base64(attach, att->data(), 0); 520 icalattachtype_set_base64(attach, att->data(), 0);
521#endif 521#endif
522 icalattach *attach; 522 icalattach *attach;
523 if (att->isURI()) 523 if (att->isUri())
524 attach = icalattach_new_from_url( att->uri().utf8().data()); 524 attach = icalattach_new_from_url( att->uri().utf8().data());
525 else 525 else
526 attach = icalattach_new_from_data ( (unsigned char *)att->data(), 0, 0); 526 attach = icalattach_new_from_data ( (unsigned char *)att->data(), 0, 0);
527 icalproperty *p = icalproperty_new_attach(attach); 527 icalproperty *p = icalproperty_new_attach(attach);
528 if (!att->mimeType().isEmpty()) 528 if (!att->mimeType().isEmpty())
529 icalproperty_add_parameter(p,icalparameter_new_fmttype(att->mimeType().utf8().data())); 529 icalproperty_add_parameter(p,icalparameter_new_fmttype(att->mimeType().utf8().data()));
530 530
531 if (att->isBinary()) { 531 if (att->isBinary()) {
532 icalproperty_add_parameter(p,icalparameter_new_value(ICAL_VALUE_BINARY)); 532 icalproperty_add_parameter(p,icalparameter_new_value(ICAL_VALUE_BINARY));
533 icalproperty_add_parameter(p,icalparameter_new_encoding(ICAL_ENCODING_BASE64)); 533 icalproperty_add_parameter(p,icalparameter_new_encoding(ICAL_ENCODING_BASE64));
534 } 534 }
535 return p; 535 return p;
536} 536}
537 537
538icalproperty *ICalFormatImpl::writeRecurrenceRule(Recurrence *recur) 538icalproperty *ICalFormatImpl::writeRecurrenceRule(Recurrence *recur)
539{ 539{
540// kdDebug(5800) << "ICalFormatImpl::writeRecurrenceRule()" << endl; 540// kdDebug(5800) << "ICalFormatImpl::writeRecurrenceRule()" << endl;
541 541
542 icalrecurrencetype r; 542 icalrecurrencetype r;
543 543
544 icalrecurrencetype_clear(&r); 544 icalrecurrencetype_clear(&r);
545 545
546 int index = 0; 546 int index = 0;
547 int index2 = 0; 547 int index2 = 0;
548 548
549 QPtrList<Recurrence::rMonthPos> tmpPositions; 549 QPtrList<Recurrence::rMonthPos> tmpPositions;
550 QPtrList<int> tmpDays; 550 QPtrList<int> tmpDays;
551 int *tmpDay; 551 int *tmpDay;
552 Recurrence::rMonthPos *tmpPos; 552 Recurrence::rMonthPos *tmpPos;
553 bool datetime = false; 553 bool datetime = false;
554 int day; 554 int day;
555 int i; 555 int i;
556 556
557 switch(recur->doesRecur()) { 557 switch(recur->doesRecur()) {
558 case Recurrence::rMinutely: 558 case Recurrence::rMinutely:
559 r.freq = ICAL_MINUTELY_RECURRENCE; 559 r.freq = ICAL_MINUTELY_RECURRENCE;
560 datetime = true; 560 datetime = true;
561 break; 561 break;
562 case Recurrence::rHourly: 562 case Recurrence::rHourly:
563 r.freq = ICAL_HOURLY_RECURRENCE; 563 r.freq = ICAL_HOURLY_RECURRENCE;
564 datetime = true; 564 datetime = true;
565 break; 565 break;
566 case Recurrence::rDaily: 566 case Recurrence::rDaily:
567 r.freq = ICAL_DAILY_RECURRENCE; 567 r.freq = ICAL_DAILY_RECURRENCE;
568 break; 568 break;
569 case Recurrence::rWeekly: 569 case Recurrence::rWeekly:
570 r.freq = ICAL_WEEKLY_RECURRENCE; 570 r.freq = ICAL_WEEKLY_RECURRENCE;
571 r.week_start = static_cast<icalrecurrencetype_weekday>(recur->weekStart()%7 + 1); 571 r.week_start = static_cast<icalrecurrencetype_weekday>(recur->weekStart()%7 + 1);
572 for (i = 0; i < 7; i++) { 572 for (i = 0; i < 7; i++) {
573 if (recur->days().testBit(i)) { 573 if (recur->days().testBit(i)) {
574 day = (i + 1)%7 + 1; // convert from Monday=0 to Sunday=1 574 day = (i + 1)%7 + 1; // convert from Monday=0 to Sunday=1
575 r.by_day[index++] = icalrecurrencetype_day_day_of_week(day); 575 r.by_day[index++] = icalrecurrencetype_day_day_of_week(day);
576 } 576 }
577 } 577 }
578// r.by_day[index] = ICAL_RECURRENCE_ARRAY_MAX; 578// r.by_day[index] = ICAL_RECURRENCE_ARRAY_MAX;
579 break; 579 break;
580 case Recurrence::rMonthlyPos: 580 case Recurrence::rMonthlyPos:
581 r.freq = ICAL_MONTHLY_RECURRENCE; 581 r.freq = ICAL_MONTHLY_RECURRENCE;
582 582
583 tmpPositions = recur->monthPositions(); 583 tmpPositions = recur->monthPositions();
584 for (tmpPos = tmpPositions.first(); 584 for (tmpPos = tmpPositions.first();
585 tmpPos; 585 tmpPos;
586 tmpPos = tmpPositions.next()) { 586 tmpPos = tmpPositions.next()) {
587 for (i = 0; i < 7; i++) { 587 for (i = 0; i < 7; i++) {
588 if (tmpPos->rDays.testBit(i)) { 588 if (tmpPos->rDays.testBit(i)) {
589 day = (i + 1)%7 + 1; // convert from Monday=0 to Sunday=1 589 day = (i + 1)%7 + 1; // convert from Monday=0 to Sunday=1
590 day += tmpPos->rPos*8; 590 day += tmpPos->rPos*8;
591 if (tmpPos->negative) day = -day; 591 if (tmpPos->negative) day = -day;
592 r.by_day[index++] = day; 592 r.by_day[index++] = day;
593 } 593 }
594 } 594 }
595 } 595 }
596// r.by_day[index] = ICAL_RECURRENCE_ARRAY_MAX; 596// r.by_day[index] = ICAL_RECURRENCE_ARRAY_MAX;
597 break; 597 break;
598 case Recurrence::rMonthlyDay: 598 case Recurrence::rMonthlyDay:
599 r.freq = ICAL_MONTHLY_RECURRENCE; 599 r.freq = ICAL_MONTHLY_RECURRENCE;
600 600
601 tmpDays = recur->monthDays(); 601 tmpDays = recur->monthDays();
602 for (tmpDay = tmpDays.first(); 602 for (tmpDay = tmpDays.first();
603 tmpDay; 603 tmpDay;
604 tmpDay = tmpDays.next()) { 604 tmpDay = tmpDays.next()) {
605 r.by_month_day[index++] = icalrecurrencetype_day_position(*tmpDay*8);//*tmpDay); 605 r.by_month_day[index++] = icalrecurrencetype_day_position(*tmpDay*8);//*tmpDay);
606 } 606 }
607// r.by_day[index] = ICAL_RECURRENCE_ARRAY_MAX; 607// r.by_day[index] = ICAL_RECURRENCE_ARRAY_MAX;
608 break; 608 break;
609 case Recurrence::rYearlyMonth: 609 case Recurrence::rYearlyMonth:
610 case Recurrence::rYearlyPos: 610 case Recurrence::rYearlyPos:
611 r.freq = ICAL_YEARLY_RECURRENCE; 611 r.freq = ICAL_YEARLY_RECURRENCE;
612 612
613 tmpDays = recur->yearNums(); 613 tmpDays = recur->yearNums();
614 for (tmpDay = tmpDays.first(); 614 for (tmpDay = tmpDays.first();
615 tmpDay; 615 tmpDay;
616 tmpDay = tmpDays.next()) { 616 tmpDay = tmpDays.next()) {
617 r.by_month[index++] = *tmpDay; 617 r.by_month[index++] = *tmpDay;
618 } 618 }
619// r.by_set_pos[index] = ICAL_RECURRENCE_ARRAY_MAX; 619// r.by_set_pos[index] = ICAL_RECURRENCE_ARRAY_MAX;
620 if (recur->doesRecur() == Recurrence::rYearlyPos) { 620 if (recur->doesRecur() == Recurrence::rYearlyPos) {
621 tmpPositions = recur->monthPositions(); 621 tmpPositions = recur->monthPositions();
622 for (tmpPos = tmpPositions.first(); 622 for (tmpPos = tmpPositions.first();
623 tmpPos; 623 tmpPos;
624 tmpPos = tmpPositions.next()) { 624 tmpPos = tmpPositions.next()) {
625 for (i = 0; i < 7; i++) { 625 for (i = 0; i < 7; i++) {
626 if (tmpPos->rDays.testBit(i)) { 626 if (tmpPos->rDays.testBit(i)) {
627 day = (i + 1)%7 + 1; // convert from Monday=0 to Sunday=1 627 day = (i + 1)%7 + 1; // convert from Monday=0 to Sunday=1
628 day += tmpPos->rPos*8; 628 day += tmpPos->rPos*8;
629 if (tmpPos->negative) day = -day; 629 if (tmpPos->negative) day = -day;
630 r.by_day[index2++] = day; 630 r.by_day[index2++] = day;
631 } 631 }
632 } 632 }
633 } 633 }
634// r.by_day[index2] = ICAL_RECURRENCE_ARRAY_MAX; 634// r.by_day[index2] = ICAL_RECURRENCE_ARRAY_MAX;
635 } 635 }
636 break; 636 break;
637 case Recurrence::rYearlyDay: 637 case Recurrence::rYearlyDay:
638 r.freq = ICAL_YEARLY_RECURRENCE; 638 r.freq = ICAL_YEARLY_RECURRENCE;
639 639
640 tmpDays = recur->yearNums(); 640 tmpDays = recur->yearNums();
641 for (tmpDay = tmpDays.first(); 641 for (tmpDay = tmpDays.first();
642 tmpDay; 642 tmpDay;
643 tmpDay = tmpDays.next()) { 643 tmpDay = tmpDays.next()) {
644 r.by_year_day[index++] = *tmpDay; 644 r.by_year_day[index++] = *tmpDay;
645 } 645 }
646// r.by_year_day[index] = ICAL_RECURRENCE_ARRAY_MAX; 646// r.by_year_day[index] = ICAL_RECURRENCE_ARRAY_MAX;
647 break; 647 break;
648 default: 648 default:
649 r.freq = ICAL_NO_RECURRENCE; 649 r.freq = ICAL_NO_RECURRENCE;
650 kdDebug(5800) << "ICalFormatImpl::writeRecurrence(): no recurrence" << endl; 650 kdDebug(5800) << "ICalFormatImpl::writeRecurrence(): no recurrence" << endl;
651 break; 651 break;
652 } 652 }
653 653
654 r.interval = recur->frequency(); 654 r.interval = recur->frequency();
655 655
656 if (recur->duration() > 0) { 656 if (recur->duration() > 0) {
657 r.count = recur->duration(); 657 r.count = recur->duration();
658 } else if (recur->duration() == -1) { 658 } else if (recur->duration() == -1) {
659 r.count = 0; 659 r.count = 0;
660 } else { 660 } else {
661 if (datetime) 661 if (datetime)
662 r.until = writeICalDateTime(recur->endDateTime()); 662 r.until = writeICalDateTime(recur->endDateTime());
663 else 663 else
664 r.until = writeICalDate(recur->endDate()); 664 r.until = writeICalDate(recur->endDate());
665 } 665 }
666 666
667// Debug output 667// Debug output
668#if 0 668#if 0
669 const char *str = icalrecurrencetype_as_string(&r); 669 const char *str = icalrecurrencetype_as_string(&r);
670 if (str) { 670 if (str) {
671 kdDebug(5800) << " String: " << str << endl; 671 kdDebug(5800) << " String: " << str << endl;
672 } else { 672 } else {
673 kdDebug(5800) << " No String" << endl; 673 kdDebug(5800) << " No String" << endl;
674 } 674 }
675#endif 675#endif
676 676
677 return icalproperty_new_rrule(r); 677 return icalproperty_new_rrule(r);
678} 678}
679 679
680icalcomponent *ICalFormatImpl::writeAlarm(Alarm *alarm) 680icalcomponent *ICalFormatImpl::writeAlarm(Alarm *alarm)
681{ 681{
682 icalcomponent *a = icalcomponent_new(ICAL_VALARM_COMPONENT); 682 icalcomponent *a = icalcomponent_new(ICAL_VALARM_COMPONENT);
683 683
684 icalproperty_action action; 684 icalproperty_action action;
685 icalattach *attach = 0; 685 icalattach *attach = 0;
686 686
687 switch (alarm->type()) { 687 switch (alarm->type()) {
688 case Alarm::Procedure: 688 case Alarm::Procedure:
689 action = ICAL_ACTION_PROCEDURE; 689 action = ICAL_ACTION_PROCEDURE;
690 attach = icalattach_new_from_url( QFile::encodeName(alarm->programFile()).data() ); 690 attach = icalattach_new_from_url( QFile::encodeName(alarm->programFile()).data() );
691 icalcomponent_add_property(a,icalproperty_new_attach(attach)); 691 icalcomponent_add_property(a,icalproperty_new_attach(attach));
692 if (!alarm->programArguments().isEmpty()) { 692 if (!alarm->programArguments().isEmpty()) {
693 icalcomponent_add_property(a,icalproperty_new_description(alarm->programArguments().utf8())); 693 icalcomponent_add_property(a,icalproperty_new_description(alarm->programArguments().utf8()));
694 } 694 }
695 icalattach_unref( attach ); 695 icalattach_unref( attach );
696 break; 696 break;
697 case Alarm::Audio: 697 case Alarm::Audio:
698 action = ICAL_ACTION_AUDIO; 698 action = ICAL_ACTION_AUDIO;
699 if (!alarm->audioFile().isEmpty()) { 699 if (!alarm->audioFile().isEmpty()) {
700 attach = icalattach_new_from_url(QFile::encodeName( alarm->audioFile() ).data()); 700 attach = icalattach_new_from_url(QFile::encodeName( alarm->audioFile() ).data());
701 icalcomponent_add_property(a,icalproperty_new_attach(attach)); 701 icalcomponent_add_property(a,icalproperty_new_attach(attach));
702 icalattach_unref( attach ); 702 icalattach_unref( attach );
703 } 703 }
704 break; 704 break;
705 case Alarm::Email: { 705 case Alarm::Email: {
706 action = ICAL_ACTION_EMAIL; 706 action = ICAL_ACTION_EMAIL;
707 QValueList<Person> addresses = alarm->mailAddresses(); 707 QValueList<Person> addresses = alarm->mailAddresses();
708 for (QValueList<Person>::Iterator ad = addresses.begin(); ad != addresses.end(); ++ad) { 708 for (QValueList<Person>::Iterator ad = addresses.begin(); ad != addresses.end(); ++ad) {
709 icalproperty *p = icalproperty_new_attendee("MAILTO:" + (*ad).email().utf8()); 709 icalproperty *p = icalproperty_new_attendee("MAILTO:" + (*ad).email().utf8());
710 if (!(*ad).name().isEmpty()) { 710 if (!(*ad).name().isEmpty()) {
711 icalproperty_add_parameter(p,icalparameter_new_cn((*ad).name().utf8())); 711 icalproperty_add_parameter(p,icalparameter_new_cn((*ad).name().utf8()));
712 } 712 }
713 icalcomponent_add_property(a,p); 713 icalcomponent_add_property(a,p);
714 } 714 }
715 icalcomponent_add_property(a,icalproperty_new_summary(alarm->mailSubject().utf8())); 715 icalcomponent_add_property(a,icalproperty_new_summary(alarm->mailSubject().utf8()));
716 icalcomponent_add_property(a,icalproperty_new_description(alarm->text().utf8())); 716 icalcomponent_add_property(a,icalproperty_new_description(alarm->text().utf8()));
717 QStringList attachments = alarm->mailAttachments(); 717 QStringList attachments = alarm->mailAttachments();
718 if (attachments.count() > 0) { 718 if (attachments.count() > 0) {
719 for (QStringList::Iterator at = attachments.begin(); at != attachments.end(); ++at) { 719 for (QStringList::Iterator at = attachments.begin(); at != attachments.end(); ++at) {
720 attach = icalattach_new_from_url(QFile::encodeName( *at ).data()); 720 attach = icalattach_new_from_url(QFile::encodeName( *at ).data());
721 icalcomponent_add_property(a,icalproperty_new_attach(attach)); 721 icalcomponent_add_property(a,icalproperty_new_attach(attach));
722 icalattach_unref( attach ); 722 icalattach_unref( attach );
723 } 723 }
724 } 724 }
725 break; 725 break;
726 } 726 }
727 case Alarm::Display: 727 case Alarm::Display:
728 action = ICAL_ACTION_DISPLAY; 728 action = ICAL_ACTION_DISPLAY;
729 icalcomponent_add_property(a,icalproperty_new_description(alarm->text().utf8())); 729 icalcomponent_add_property(a,icalproperty_new_description(alarm->text().utf8()));
730 break; 730 break;
731 case Alarm::Invalid: 731 case Alarm::Invalid:
732 default: 732 default:
733 kdDebug(5800) << "Unknown type of alarm" << endl; 733 kdDebug(5800) << "Unknown type of alarm" << endl;
734 action = ICAL_ACTION_NONE; 734 action = ICAL_ACTION_NONE;
735 break; 735 break;
736 } 736 }
737 icalcomponent_add_property(a,icalproperty_new_action(action)); 737 icalcomponent_add_property(a,icalproperty_new_action(action));
738 738
739 // Trigger time 739 // Trigger time
740 icaltriggertype trigger; 740 icaltriggertype trigger;
741 if ( alarm->hasTime() ) { 741 if ( alarm->hasTime() ) {
742 trigger.time = writeICalDateTime(alarm->time()); 742 trigger.time = writeICalDateTime(alarm->time());
743 trigger.duration = icaldurationtype_null_duration(); 743 trigger.duration = icaldurationtype_null_duration();
744 } else { 744 } else {
745 trigger.time = icaltime_null_time(); 745 trigger.time = icaltime_null_time();
746 Duration offset; 746 Duration offset;
747 if ( alarm->hasStartOffset() ) 747 if ( alarm->hasStartOffset() )
748 offset = alarm->startOffset(); 748 offset = alarm->startOffset();
749 else 749 else
750 offset = alarm->endOffset(); 750 offset = alarm->endOffset();
751 trigger.duration = icaldurationtype_from_int( offset.asSeconds() ); 751 trigger.duration = icaldurationtype_from_int( offset.asSeconds() );
752 } 752 }
753 icalproperty *p = icalproperty_new_trigger(trigger); 753 icalproperty *p = icalproperty_new_trigger(trigger);
754 if ( alarm->hasEndOffset() ) 754 if ( alarm->hasEndOffset() )
755 icalproperty_add_parameter(p,icalparameter_new_related(ICAL_RELATED_END)); 755 icalproperty_add_parameter(p,icalparameter_new_related(ICAL_RELATED_END));
756 icalcomponent_add_property(a,p); 756 icalcomponent_add_property(a,p);
757 757
758 // Repeat count and duration 758 // Repeat count and duration
759 if (alarm->repeatCount()) { 759 if (alarm->repeatCount()) {
760 icalcomponent_add_property(a,icalproperty_new_repeat(alarm->repeatCount())); 760 icalcomponent_add_property(a,icalproperty_new_repeat(alarm->repeatCount()));
761 icalcomponent_add_property(a,icalproperty_new_duration( 761 icalcomponent_add_property(a,icalproperty_new_duration(
762 icaldurationtype_from_int(alarm->snoozeTime()*60))); 762 icaldurationtype_from_int(alarm->snoozeTime()*60)));
763 } 763 }
764 764
765 // Custom properties 765 // Custom properties
766 QMap<QCString, QString> custom = alarm->customProperties(); 766 QMap<QCString, QString> custom = alarm->customProperties();
767 for (QMap<QCString, QString>::Iterator c = custom.begin(); c != custom.end(); ++c) { 767 for (QMap<QCString, QString>::Iterator c = custom.begin(); c != custom.end(); ++c) {
768 icalproperty *p = icalproperty_new_x(c.data().utf8()); 768 icalproperty *p = icalproperty_new_x(c.data().utf8());
769 icalproperty_set_x_name(p,c.key()); 769 icalproperty_set_x_name(p,c.key());
770 icalcomponent_add_property(a,p); 770 icalcomponent_add_property(a,p);
771 } 771 }
772 772
773 return a; 773 return a;
774} 774}
775 775
776Todo *ICalFormatImpl::readTodo(icalcomponent *vtodo) 776Todo *ICalFormatImpl::readTodo(icalcomponent *vtodo)
777{ 777{
778 Todo *todo = new Todo; 778 Todo *todo = new Todo;
779 779
780 readIncidence(vtodo,todo); 780 readIncidence(vtodo,todo);
781 781
782 icalproperty *p = icalcomponent_get_first_property(vtodo,ICAL_ANY_PROPERTY); 782 icalproperty *p = icalcomponent_get_first_property(vtodo,ICAL_ANY_PROPERTY);
783 783
784// int intvalue; 784// int intvalue;
785 icaltimetype icaltime; 785 icaltimetype icaltime;
786 786
787 QStringList categories; 787 QStringList categories;
788 788
789 while (p) { 789 while (p) {
790 icalproperty_kind kind = icalproperty_isa(p); 790 icalproperty_kind kind = icalproperty_isa(p);
791 switch (kind) { 791 switch (kind) {
792 792
793 case ICAL_DUE_PROPERTY: // due date 793 case ICAL_DUE_PROPERTY: // due date
794 icaltime = icalproperty_get_due(p); 794 icaltime = icalproperty_get_due(p);
795 if (icaltime.is_date) { 795 if (icaltime.is_date) {
796 todo->setDtDue(QDateTime(readICalDate(icaltime),QTime(0,0,0))); 796 todo->setDtDue(QDateTime(readICalDate(icaltime),QTime(0,0,0)));
797 todo->setFloats(true); 797 todo->setFloats(true);
798 798
799 } else { 799 } else {
800 todo->setDtDue(readICalDateTime(icaltime)); 800 todo->setDtDue(readICalDateTime(icaltime));
801 todo->setFloats(false); 801 todo->setFloats(false);
802 } 802 }
803 todo->setHasDueDate(true); 803 todo->setHasDueDate(true);
804 break; 804 break;
805 805
806 case ICAL_COMPLETED_PROPERTY: // completion date 806 case ICAL_COMPLETED_PROPERTY: // completion date
807 icaltime = icalproperty_get_completed(p); 807 icaltime = icalproperty_get_completed(p);
808 todo->setCompleted(readICalDateTime(icaltime)); 808 todo->setCompleted(readICalDateTime(icaltime));
809 break; 809 break;
810 810
811 case ICAL_PERCENTCOMPLETE_PROPERTY: // Percent completed 811 case ICAL_PERCENTCOMPLETE_PROPERTY: // Percent completed
812 todo->setPercentComplete(icalproperty_get_percentcomplete(p)); 812 todo->setPercentComplete(icalproperty_get_percentcomplete(p));
813 break; 813 break;
814 814
815 case ICAL_RELATEDTO_PROPERTY: // related todo (parent) 815 case ICAL_RELATEDTO_PROPERTY: // related todo (parent)
816 todo->setRelatedToUid(QString::fromUtf8(icalproperty_get_relatedto(p))); 816 todo->setRelatedToUid(QString::fromUtf8(icalproperty_get_relatedto(p)));
817 mTodosRelate.append(todo); 817 mTodosRelate.append(todo);
818 break; 818 break;
819 819
820 case ICAL_DTSTART_PROPERTY: 820 case ICAL_DTSTART_PROPERTY:
821 // Flag that todo has start date. Value is read in by readIncidence(). 821 // Flag that todo has start date. Value is read in by readIncidence().
822 todo->setHasStartDate(true); 822 todo->setHasStartDate(true);
823 break; 823 break;
824 824
825 default: 825 default:
826// kdDebug(5800) << "ICALFormat::readTodo(): Unknown property: " << kind 826// kdDebug(5800) << "ICALFormat::readTodo(): Unknown property: " << kind
827// << endl; 827// << endl;
828 break; 828 break;
829 } 829 }
830 830
831 p = icalcomponent_get_next_property(vtodo,ICAL_ANY_PROPERTY); 831 p = icalcomponent_get_next_property(vtodo,ICAL_ANY_PROPERTY);
832 } 832 }
833 833
834 return todo; 834 return todo;
835} 835}
836 836
837Event *ICalFormatImpl::readEvent(icalcomponent *vevent) 837Event *ICalFormatImpl::readEvent(icalcomponent *vevent)
838{ 838{
839 Event *event = new Event; 839 Event *event = new Event;
840 event->setFloats(false); 840 event->setFloats(false);
841 841
842 readIncidence(vevent,event); 842 readIncidence(vevent,event);
843 843
844 icalproperty *p = icalcomponent_get_first_property(vevent,ICAL_ANY_PROPERTY); 844 icalproperty *p = icalcomponent_get_first_property(vevent,ICAL_ANY_PROPERTY);
845 845
846// int intvalue; 846// int intvalue;
847 icaltimetype icaltime; 847 icaltimetype icaltime;
848 848
849 QStringList categories; 849 QStringList categories;
850 QString transparency; 850 QString transparency;
851 851
852 while (p) { 852 while (p) {
853 icalproperty_kind kind = icalproperty_isa(p); 853 icalproperty_kind kind = icalproperty_isa(p);
854 switch (kind) { 854 switch (kind) {
855 855
856 case ICAL_DTEND_PROPERTY: // start date and time 856 case ICAL_DTEND_PROPERTY: // start date and time
857 icaltime = icalproperty_get_dtend(p); 857 icaltime = icalproperty_get_dtend(p);
858 if (icaltime.is_date) { 858 if (icaltime.is_date) {
859 event->setFloats( true ); 859 event->setFloats( true );
860 // End date is non-inclusive 860 // End date is non-inclusive
861 QDate endDate = readICalDate( icaltime ).addDays( -1 ); 861 QDate endDate = readICalDate( icaltime ).addDays( -1 );
862 mCompat->fixFloatingEnd( endDate ); 862 mCompat->fixFloatingEnd( endDate );
863 if ( endDate < event->dtStart().date() ) { 863 if ( endDate < event->dtStart().date() ) {
864 endDate = event->dtStart().date(); 864 endDate = event->dtStart().date();
865 } 865 }
866 event->setDtEnd( QDateTime( endDate, QTime( 0, 0, 0 ) ) ); 866 event->setDtEnd( QDateTime( endDate, QTime( 0, 0, 0 ) ) );
867 } else { 867 } else {
868 event->setDtEnd(readICalDateTime(icaltime)); 868 event->setDtEnd(readICalDateTime(icaltime));
869 } 869 }
870 break; 870 break;
871 871
872// TODO: 872// TODO:
873 // at this point, there should be at least a start or end time. 873 // at this point, there should be at least a start or end time.
874 // fix up for events that take up no time but have a time associated 874 // fix up for events that take up no time but have a time associated
875#if 0 875#if 0
876 if (!(vo = isAPropertyOf(vevent, VCDTstartProp))) 876 if (!(vo = isAPropertyOf(vevent, VCDTstartProp)))
877 anEvent->setDtStart(anEvent->dtEnd()); 877 anEvent->setDtStart(anEvent->dtEnd());
878 if (!(vo = isAPropertyOf(vevent, VCDTendProp))) 878 if (!(vo = isAPropertyOf(vevent, VCDTendProp)))
879 anEvent->setDtEnd(anEvent->dtStart()); 879 anEvent->setDtEnd(anEvent->dtStart());
880#endif 880#endif
881 881
882// TODO: exdates 882// TODO: exdates
883#if 0 883#if 0
884 // recurrence exceptions 884 // recurrence exceptions
885 if ((vo = isAPropertyOf(vevent, VCExDateProp)) != 0) { 885 if ((vo = isAPropertyOf(vevent, VCExDateProp)) != 0) {
886 anEvent->setExDates(s = fakeCString(vObjectUStringZValue(vo))); 886 anEvent->setExDates(s = fakeCString(vObjectUStringZValue(vo)));
887 deleteStr(s); 887 deleteStr(s);
888 } 888 }
889#endif 889#endif
890 890
891#if 0 891#if 0
892 // secrecy 892 // secrecy
893 if ((vo = isAPropertyOf(vevent, VCClassProp)) != 0) { 893 if ((vo = isAPropertyOf(vevent, VCClassProp)) != 0) {
894 anEvent->setSecrecy(s = fakeCString(vObjectUStringZValue(vo))); 894 anEvent->setSecrecy(s = fakeCString(vObjectUStringZValue(vo)));
895 deleteStr(s); 895 deleteStr(s);
896 } 896 }
897 else 897 else
898 anEvent->setSecrecy("PUBLIC"); 898 anEvent->setSecrecy("PUBLIC");
899 899
900 // attachments 900 // attachments
901 tmpStrList.clear(); 901 tmpStrList.clear();
902 initPropIterator(&voi, vevent); 902 initPropIterator(&voi, vevent);
903 while (moreIteration(&voi)) { 903 while (moreIteration(&voi)) {
904 vo = nextVObject(&voi); 904 vo = nextVObject(&voi);
905 if (strcmp(vObjectName(vo), VCAttachProp) == 0) { 905 if (strcmp(vObjectName(vo), VCAttachProp) == 0) {
906 tmpStrList.append(s = fakeCString(vObjectUStringZValue(vo))); 906 tmpStrList.append(s = fakeCString(vObjectUStringZValue(vo)));
907 deleteStr(s); 907 deleteStr(s);
908 } 908 }
909 } 909 }
910 anEvent->setAttachments(tmpStrList); 910 anEvent->setAttachments(tmpStrList);
911 911
912 // resources 912 // resources
913 if ((vo = isAPropertyOf(vevent, VCResourcesProp)) != 0) { 913 if ((vo = isAPropertyOf(vevent, VCResourcesProp)) != 0) {
914 QString resources = (s = fakeCString(vObjectUStringZValue(vo))); 914 QString resources = (s = fakeCString(vObjectUStringZValue(vo)));
915 deleteStr(s); 915 deleteStr(s);
916 tmpStrList.clear(); 916 tmpStrList.clear();
917 index1 = 0; 917 index1 = 0;
918 index2 = 0; 918 index2 = 0;
919 QString resource; 919 QString resource;
920 while ((index2 = resources.find(';', index1)) != -1) { 920 while ((index2 = resources.find(';', index1)) != -1) {
921 resource = resources.mid(index1, (index2 - index1)); 921 resource = resources.mid(index1, (index2 - index1));
922 tmpStrList.append(resource); 922 tmpStrList.append(resource);
923 index1 = index2; 923 index1 = index2;
924 } 924 }
925 anEvent->setResources(tmpStrList); 925 anEvent->setResources(tmpStrList);
926 } 926 }
927#endif 927#endif
928 928
929 case ICAL_RELATEDTO_PROPERTY: // releated event (parent) 929 case ICAL_RELATEDTO_PROPERTY: // releated event (parent)
930 event->setRelatedToUid(QString::fromUtf8(icalproperty_get_relatedto(p))); 930 event->setRelatedToUid(QString::fromUtf8(icalproperty_get_relatedto(p)));
931 mEventsRelate.append(event); 931 mEventsRelate.append(event);
932 break; 932 break;
933 933
934 case ICAL_TRANSP_PROPERTY: // Transparency 934 case ICAL_TRANSP_PROPERTY: // Transparency
935 if(icalproperty_get_transp(p) == ICAL_TRANSP_TRANSPARENT ) 935 if(icalproperty_get_transp(p) == ICAL_TRANSP_TRANSPARENT )
936 event->setTransparency( Event::Transparent ); 936 event->setTransparency( Event::Transparent );
937 else 937 else
938 event->setTransparency( Event::Opaque ); 938 event->setTransparency( Event::Opaque );
939 break; 939 break;
940 940
941 default: 941 default:
942// kdDebug(5800) << "ICALFormat::readEvent(): Unknown property: " << kind 942// kdDebug(5800) << "ICALFormat::readEvent(): Unknown property: " << kind
943// << endl; 943// << endl;
944 break; 944 break;
945 } 945 }
946 946
947 p = icalcomponent_get_next_property(vevent,ICAL_ANY_PROPERTY); 947 p = icalcomponent_get_next_property(vevent,ICAL_ANY_PROPERTY);
948 } 948 }
949 949
950 QString msade = event->nonKDECustomProperty("X-MICROSOFT-CDO-ALLDAYEVENT"); 950 QString msade = event->nonKDECustomProperty("X-MICROSOFT-CDO-ALLDAYEVENT");
951 if (!msade.isNull()) { 951 if (!msade.isNull()) {
952 bool floats = (msade == QString::fromLatin1("TRUE")); 952 bool floats = (msade == QString::fromLatin1("TRUE"));
953 kdDebug(5800) << "ICALFormat::readEvent(): all day event: " << floats << endl; 953 kdDebug(5800) << "ICALFormat::readEvent(): all day event: " << floats << endl;
954 event->setFloats(floats); 954 event->setFloats(floats);
955 if (floats) { 955 if (floats) {
956 QDateTime endDate = event->dtEnd(); 956 QDateTime endDate = event->dtEnd();
957 event->setDtEnd(endDate.addDays(-1)); 957 event->setDtEnd(endDate.addDays(-1));
958 } 958 }
959 } 959 }
960 960
961 // some stupid vCal exporters ignore the standard and use Description 961 // some stupid vCal exporters ignore the standard and use Description
962 // instead of Summary for the default field. Correct for this. 962 // instead of Summary for the default field. Correct for this.
963 if (event->summary().isEmpty() && 963 if (event->summary().isEmpty() &&
964 !(event->description().isEmpty())) { 964 !(event->description().isEmpty())) {
965 QString tmpStr = event->description().simplifyWhiteSpace(); 965 QString tmpStr = event->description().simplifyWhiteSpace();
966 event->setDescription(""); 966 event->setDescription("");
967 event->setSummary(tmpStr); 967 event->setSummary(tmpStr);
968 } 968 }
969 969
970 return event; 970 return event;
971} 971}
972 972
973FreeBusy *ICalFormatImpl::readFreeBusy(icalcomponent *vfreebusy) 973FreeBusy *ICalFormatImpl::readFreeBusy(icalcomponent *vfreebusy)
974{ 974{
975 FreeBusy *freebusy = new FreeBusy; 975 FreeBusy *freebusy = new FreeBusy;
976 976
977 readIncidenceBase(vfreebusy,freebusy); 977 readIncidenceBase(vfreebusy,freebusy);
978 978
979 icalproperty *p = icalcomponent_get_first_property(vfreebusy,ICAL_ANY_PROPERTY); 979 icalproperty *p = icalcomponent_get_first_property(vfreebusy,ICAL_ANY_PROPERTY);
980 980
981 icaltimetype icaltime; 981 icaltimetype icaltime;
982 icalperiodtype icalperiod; 982 icalperiodtype icalperiod;
983 QDateTime period_start, period_end; 983 QDateTime period_start, period_end;
984 984
985 while (p) { 985 while (p) {
986 icalproperty_kind kind = icalproperty_isa(p); 986 icalproperty_kind kind = icalproperty_isa(p);
987 switch (kind) { 987 switch (kind) {
988 988
989 case ICAL_DTSTART_PROPERTY: // start date and time 989 case ICAL_DTSTART_PROPERTY: // start date and time
990 icaltime = icalproperty_get_dtstart(p); 990 icaltime = icalproperty_get_dtstart(p);
991 freebusy->setDtStart(readICalDateTime(icaltime)); 991 freebusy->setDtStart(readICalDateTime(icaltime));
992 break; 992 break;
993 993
994 case ICAL_DTEND_PROPERTY: // start End Date and Time 994 case ICAL_DTEND_PROPERTY: // start End Date and Time
995 icaltime = icalproperty_get_dtend(p); 995 icaltime = icalproperty_get_dtend(p);
996 freebusy->setDtEnd(readICalDateTime(icaltime)); 996 freebusy->setDtEnd(readICalDateTime(icaltime));
997 break; 997 break;
998 998
999 case ICAL_FREEBUSY_PROPERTY: //Any FreeBusy Times 999 case ICAL_FREEBUSY_PROPERTY: //Any FreeBusy Times
1000 icalperiod = icalproperty_get_freebusy(p); 1000 icalperiod = icalproperty_get_freebusy(p);
1001 period_start = readICalDateTime(icalperiod.start); 1001 period_start = readICalDateTime(icalperiod.start);
1002 period_end = readICalDateTime(icalperiod.end); 1002 period_end = readICalDateTime(icalperiod.end);
1003 freebusy->addPeriod(period_start, period_end); 1003 freebusy->addPeriod(period_start, period_end);
1004 break; 1004 break;
1005 1005
1006 default: 1006 default:
1007 kdDebug(5800) << "ICALFormat::readIncidence(): Unknown property: " << kind 1007 kdDebug(5800) << "ICALFormat::readIncidence(): Unknown property: " << kind
1008 << endl; 1008 << endl;
1009 break; 1009 break;
1010 } 1010 }
1011 p = icalcomponent_get_next_property(vfreebusy,ICAL_ANY_PROPERTY); 1011 p = icalcomponent_get_next_property(vfreebusy,ICAL_ANY_PROPERTY);
1012 } 1012 }
1013 1013
1014 return freebusy; 1014 return freebusy;
1015} 1015}
1016 1016
1017Journal *ICalFormatImpl::readJournal(icalcomponent *vjournal) 1017Journal *ICalFormatImpl::readJournal(icalcomponent *vjournal)
1018{ 1018{
1019 Journal *journal = new Journal; 1019 Journal *journal = new Journal;
1020 1020
1021 readIncidence(vjournal,journal); 1021 readIncidence(vjournal,journal);
1022 1022
1023 if ( !journal->dtStart().isValid() && journal->created().isValid() ) { 1023 if ( !journal->dtStart().isValid() && journal->created().isValid() ) {
1024 journal->setDtStart( journal->created() ); 1024 journal->setDtStart( journal->created() );
1025 } 1025 }
1026 return journal; 1026 return journal;
1027} 1027}
1028 1028
1029Attendee *ICalFormatImpl::readAttendee(icalproperty *attendee) 1029Attendee *ICalFormatImpl::readAttendee(icalproperty *attendee)
1030{ 1030{
1031 icalparameter *p = 0; 1031 icalparameter *p = 0;
1032 1032
1033 QString email = QString::fromUtf8(icalproperty_get_attendee(attendee)); 1033 QString email = QString::fromUtf8(icalproperty_get_attendee(attendee));
1034 1034
1035 QString name; 1035 QString name;
1036 QString uid = QString::null; 1036 QString uid = QString::null;
1037 p = icalproperty_get_first_parameter(attendee,ICAL_CN_PARAMETER); 1037 p = icalproperty_get_first_parameter(attendee,ICAL_CN_PARAMETER);
1038 if (p) { 1038 if (p) {
1039 name = QString::fromUtf8(icalparameter_get_cn(p)); 1039 name = QString::fromUtf8(icalparameter_get_cn(p));
1040 } else { 1040 } else {
1041 } 1041 }
1042 1042
1043 bool rsvp=false; 1043 bool rsvp=false;
1044 p = icalproperty_get_first_parameter(attendee,ICAL_RSVP_PARAMETER); 1044 p = icalproperty_get_first_parameter(attendee,ICAL_RSVP_PARAMETER);
1045 if (p) { 1045 if (p) {
1046 icalparameter_rsvp rsvpParameter = icalparameter_get_rsvp(p); 1046 icalparameter_rsvp rsvpParameter = icalparameter_get_rsvp(p);
1047 if (rsvpParameter == ICAL_RSVP_TRUE) rsvp = true; 1047 if (rsvpParameter == ICAL_RSVP_TRUE) rsvp = true;
1048 } 1048 }
1049 1049
1050 Attendee::PartStat status = Attendee::NeedsAction; 1050 Attendee::PartStat status = Attendee::NeedsAction;
1051 p = icalproperty_get_first_parameter(attendee,ICAL_PARTSTAT_PARAMETER); 1051 p = icalproperty_get_first_parameter(attendee,ICAL_PARTSTAT_PARAMETER);
1052 if (p) { 1052 if (p) {
1053 icalparameter_partstat partStatParameter = icalparameter_get_partstat(p); 1053 icalparameter_partstat partStatParameter = icalparameter_get_partstat(p);
1054 switch(partStatParameter) { 1054 switch(partStatParameter) {
1055 default: 1055 default:
1056 case ICAL_PARTSTAT_NEEDSACTION: 1056 case ICAL_PARTSTAT_NEEDSACTION:
1057 status = Attendee::NeedsAction; 1057 status = Attendee::NeedsAction;
1058 break; 1058 break;
1059 case ICAL_PARTSTAT_ACCEPTED: 1059 case ICAL_PARTSTAT_ACCEPTED:
1060 status = Attendee::Accepted; 1060 status = Attendee::Accepted;
1061 break; 1061 break;
1062 case ICAL_PARTSTAT_DECLINED: 1062 case ICAL_PARTSTAT_DECLINED:
1063 status = Attendee::Declined; 1063 status = Attendee::Declined;
1064 break; 1064 break;
1065 case ICAL_PARTSTAT_TENTATIVE: 1065 case ICAL_PARTSTAT_TENTATIVE:
1066 status = Attendee::Tentative; 1066 status = Attendee::Tentative;
1067 break; 1067 break;
1068 case ICAL_PARTSTAT_DELEGATED: 1068 case ICAL_PARTSTAT_DELEGATED:
1069 status = Attendee::Delegated; 1069 status = Attendee::Delegated;
1070 break; 1070 break;
1071 case ICAL_PARTSTAT_COMPLETED: 1071 case ICAL_PARTSTAT_COMPLETED:
1072 status = Attendee::Completed; 1072 status = Attendee::Completed;
1073 break; 1073 break;
1074 case ICAL_PARTSTAT_INPROCESS: 1074 case ICAL_PARTSTAT_INPROCESS:
1075 status = Attendee::InProcess; 1075 status = Attendee::InProcess;
1076 break; 1076 break;
1077 } 1077 }
1078 } 1078 }
1079 1079
1080 Attendee::Role role = Attendee::ReqParticipant; 1080 Attendee::Role role = Attendee::ReqParticipant;
1081 p = icalproperty_get_first_parameter(attendee,ICAL_ROLE_PARAMETER); 1081 p = icalproperty_get_first_parameter(attendee,ICAL_ROLE_PARAMETER);
1082 if (p) { 1082 if (p) {
1083 icalparameter_role roleParameter = icalparameter_get_role(p); 1083 icalparameter_role roleParameter = icalparameter_get_role(p);
1084 switch(roleParameter) { 1084 switch(roleParameter) {
1085 case ICAL_ROLE_CHAIR: 1085 case ICAL_ROLE_CHAIR:
1086 role = Attendee::Chair; 1086 role = Attendee::Chair;
1087 break; 1087 break;
1088 default: 1088 default:
1089 case ICAL_ROLE_REQPARTICIPANT: 1089 case ICAL_ROLE_REQPARTICIPANT:
1090 role = Attendee::ReqParticipant; 1090 role = Attendee::ReqParticipant;
1091 break; 1091 break;
1092 case ICAL_ROLE_OPTPARTICIPANT: 1092 case ICAL_ROLE_OPTPARTICIPANT:
1093 role = Attendee::OptParticipant; 1093 role = Attendee::OptParticipant;
1094 break; 1094 break;
1095 case ICAL_ROLE_NONPARTICIPANT: 1095 case ICAL_ROLE_NONPARTICIPANT:
1096 role = Attendee::NonParticipant; 1096 role = Attendee::NonParticipant;
1097 break; 1097 break;
1098 } 1098 }
1099 } 1099 }
1100 1100
1101 p = icalproperty_get_first_parameter(attendee,ICAL_X_PARAMETER); 1101 p = icalproperty_get_first_parameter(attendee,ICAL_X_PARAMETER);
1102 uid = icalparameter_get_xvalue(p); 1102 uid = icalparameter_get_xvalue(p);
1103 // This should be added, but there seems to be a libical bug here. 1103 // This should be added, but there seems to be a libical bug here.
1104 /*while (p) { 1104 /*while (p) {
1105 // if (icalparameter_get_xname(p) == "X-UID") { 1105 // if (icalparameter_get_xname(p) == "X-UID") {
1106 uid = icalparameter_get_xvalue(p); 1106 uid = icalparameter_get_xvalue(p);
1107 p = icalproperty_get_next_parameter(attendee,ICAL_X_PARAMETER); 1107 p = icalproperty_get_next_parameter(attendee,ICAL_X_PARAMETER);
1108 } */ 1108 } */
1109 1109
1110 return new Attendee( name, email, rsvp, status, role, uid ); 1110 return new Attendee( name, email, rsvp, status, role, uid );
1111} 1111}
1112 1112
1113Attachment *ICalFormatImpl::readAttachment(icalproperty *attach) 1113Attachment *ICalFormatImpl::readAttachment(icalproperty *attach)
1114{ 1114{
1115 icalattach *a = icalproperty_get_attach(attach); 1115 icalattach *a = icalproperty_get_attach(attach);
1116 icalparameter_value v = ICAL_VALUE_NONE; 1116 icalparameter_value v = ICAL_VALUE_NONE;
1117 icalparameter_encoding e = ICAL_ENCODING_NONE; 1117 icalparameter_encoding e = ICAL_ENCODING_NONE;
1118 1118
1119 Attachment *attachment = 0; 1119 Attachment *attachment = 0;
1120 /* 1120 /*
1121 icalparameter *vp = icalproperty_get_first_parameter(attach, ICAL_VALUE_PARAMETER); 1121 icalparameter *vp = icalproperty_get_first_parameter(attach, ICAL_VALUE_PARAMETER);
1122 if (vp) 1122 if (vp)
1123 v = icalparameter_get_value(vp); 1123 v = icalparameter_get_value(vp);
1124 1124
1125 icalparameter *ep = icalproperty_get_first_parameter(attach, ICAL_ENCODING_PARAMETER); 1125 icalparameter *ep = icalproperty_get_first_parameter(attach, ICAL_ENCODING_PARAMETER);
1126 if (ep) 1126 if (ep)
1127 e = icalparameter_get_encoding(ep); 1127 e = icalparameter_get_encoding(ep);
1128 */ 1128 */
1129 int isurl = icalattach_get_is_url (a); 1129 int isurl = icalattach_get_is_url (a);
1130 if (isurl == 0) 1130 if (isurl == 0)
1131 attachment = new Attachment((const char*)icalattach_get_data(a)); 1131 attachment = new Attachment((const char*)icalattach_get_data(a));
1132 else { 1132 else {
1133 attachment = new Attachment(QString(icalattach_get_url(a))); 1133 attachment = new Attachment(QString(icalattach_get_url(a)));
1134 } 1134 }
1135 1135
1136 icalparameter *p = icalproperty_get_first_parameter(attach, ICAL_FMTTYPE_PARAMETER); 1136 icalparameter *p = icalproperty_get_first_parameter(attach, ICAL_FMTTYPE_PARAMETER);
1137 if (p) 1137 if (p)
1138 attachment->setMimeType(QString(icalparameter_get_fmttype(p))); 1138 attachment->setMimeType(QString(icalparameter_get_fmttype(p)));
1139 1139
1140 return attachment; 1140 return attachment;
1141} 1141}
1142#include <qtextcodec.h> 1142#include <qtextcodec.h>
1143void ICalFormatImpl::readIncidence(icalcomponent *parent,Incidence *incidence) 1143void ICalFormatImpl::readIncidence(icalcomponent *parent,Incidence *incidence)
1144{ 1144{
1145 readIncidenceBase(parent,incidence); 1145 readIncidenceBase(parent,incidence);
1146 1146
1147 icalproperty *p = icalcomponent_get_first_property(parent,ICAL_ANY_PROPERTY); 1147 icalproperty *p = icalcomponent_get_first_property(parent,ICAL_ANY_PROPERTY);
1148 bool readrec = false; 1148 bool readrec = false;
1149 const char *text; 1149 const char *text;
1150 int intvalue; 1150 int intvalue;
1151 icaltimetype icaltime; 1151 icaltimetype icaltime;
1152 icaldurationtype icalduration; 1152 icaldurationtype icalduration;
1153 struct icalrecurrencetype rectype; 1153 struct icalrecurrencetype rectype;
1154 QStringList categories; 1154 QStringList categories;
1155 1155
1156 while (p) { 1156 while (p) {
1157 icalproperty_kind kind = icalproperty_isa(p); 1157 icalproperty_kind kind = icalproperty_isa(p);
1158 switch (kind) { 1158 switch (kind) {
1159 1159
1160 case ICAL_CREATED_PROPERTY: 1160 case ICAL_CREATED_PROPERTY:
1161 icaltime = icalproperty_get_created(p); 1161 icaltime = icalproperty_get_created(p);
1162 incidence->setCreated(readICalDateTime(icaltime)); 1162 incidence->setCreated(readICalDateTime(icaltime));
1163 break; 1163 break;
1164 1164
1165 case ICAL_SEQUENCE_PROPERTY: // sequence 1165 case ICAL_SEQUENCE_PROPERTY: // sequence
1166 intvalue = icalproperty_get_sequence(p); 1166 intvalue = icalproperty_get_sequence(p);
1167 incidence->setRevision(intvalue); 1167 incidence->setRevision(intvalue);
1168 break; 1168 break;
1169 1169
1170 case ICAL_LASTMODIFIED_PROPERTY: // last modification date 1170 case ICAL_LASTMODIFIED_PROPERTY: // last modification date
1171 icaltime = icalproperty_get_lastmodified(p); 1171 icaltime = icalproperty_get_lastmodified(p);
1172 incidence->setLastModified(readICalDateTime(icaltime)); 1172 incidence->setLastModified(readICalDateTime(icaltime));
1173 break; 1173 break;
1174 1174
1175 case ICAL_DTSTART_PROPERTY: // start date and time 1175 case ICAL_DTSTART_PROPERTY: // start date and time
1176 icaltime = icalproperty_get_dtstart(p); 1176 icaltime = icalproperty_get_dtstart(p);
1177 if (icaltime.is_date) { 1177 if (icaltime.is_date) {
1178 incidence->setDtStart(QDateTime(readICalDate(icaltime),QTime(0,0,0))); 1178 incidence->setDtStart(QDateTime(readICalDate(icaltime),QTime(0,0,0)));
1179 incidence->setFloats(true); 1179 incidence->setFloats(true);
1180 } else { 1180 } else {
1181 incidence->setDtStart(readICalDateTime(icaltime)); 1181 incidence->setDtStart(readICalDateTime(icaltime));
1182 } 1182 }
1183 break; 1183 break;
1184 1184
1185 case ICAL_DURATION_PROPERTY: // start date and time 1185 case ICAL_DURATION_PROPERTY: // start date and time
1186 icalduration = icalproperty_get_duration(p); 1186 icalduration = icalproperty_get_duration(p);
1187 incidence->setDuration(readICalDuration(icalduration)); 1187 incidence->setDuration(readICalDuration(icalduration));
1188 break; 1188 break;
1189 1189
1190 case ICAL_DESCRIPTION_PROPERTY: // description 1190 case ICAL_DESCRIPTION_PROPERTY: // description
1191 text = icalproperty_get_description(p); 1191 text = icalproperty_get_description(p);
1192 incidence->setDescription(QString::fromUtf8(text)); 1192 incidence->setDescription(QString::fromUtf8(text));
1193 break; 1193 break;
1194 1194
1195 case ICAL_SUMMARY_PROPERTY: // summary 1195 case ICAL_SUMMARY_PROPERTY: // summary
1196 { 1196 {
1197 text = icalproperty_get_summary(p); 1197 text = icalproperty_get_summary(p);
1198 incidence->setSummary(QString::fromUtf8(text)); 1198 incidence->setSummary(QString::fromUtf8(text));
1199 } 1199 }
1200 break; 1200 break;
1201 case ICAL_STATUS_PROPERTY: // summary 1201 case ICAL_STATUS_PROPERTY: // summary
1202 { 1202 {
1203 if ( ICAL_STATUS_CANCELLED == icalproperty_get_status(p) ) 1203 if ( ICAL_STATUS_CANCELLED == icalproperty_get_status(p) )
1204 incidence->setCancelled( true ); 1204 incidence->setCancelled( true );
1205 } 1205 }
1206 break; 1206 break;
1207 1207
1208 case ICAL_LOCATION_PROPERTY: // location 1208 case ICAL_LOCATION_PROPERTY: // location
1209 text = icalproperty_get_location(p); 1209 text = icalproperty_get_location(p);
1210 incidence->setLocation(QString::fromUtf8(text)); 1210 incidence->setLocation(QString::fromUtf8(text));
1211 break; 1211 break;
1212 1212
1213 case ICAL_RECURRENCEID_PROPERTY: 1213 case ICAL_RECURRENCEID_PROPERTY:
1214 icaltime = icalproperty_get_recurrenceid(p); 1214 icaltime = icalproperty_get_recurrenceid(p);
1215 incidence->setRecurrenceID( readICalDateTime(icaltime) ); 1215 incidence->setRecurrenceID( readICalDateTime(icaltime) );
1216 //qDebug(" RecurrenceID %s",incidence->recurrenceID().toString().latin1() ); 1216 //qDebug(" RecurrenceID %s",incidence->recurrenceID().toString().latin1() );
1217 break; 1217 break;
1218#if 0 1218#if 0
1219 // status 1219 // status
1220 if ((vo = isAPropertyOf(vincidence, VCStatusProp)) != 0) { 1220 if ((vo = isAPropertyOf(vincidence, VCStatusProp)) != 0) {
1221 incidence->setStatus(s = fakeCString(vObjectUStringZValue(vo))); 1221 incidence->setStatus(s = fakeCString(vObjectUStringZValue(vo)));
1222 deleteStr(s); 1222 deleteStr(s);
1223 } 1223 }
1224 else 1224 else
1225 incidence->setStatus("NEEDS ACTION"); 1225 incidence->setStatus("NEEDS ACTION");
1226#endif 1226#endif
1227 1227
1228 case ICAL_PRIORITY_PROPERTY: // priority 1228 case ICAL_PRIORITY_PROPERTY: // priority
1229 intvalue = icalproperty_get_priority(p); 1229 intvalue = icalproperty_get_priority(p);
1230 incidence->setPriority(intvalue); 1230 incidence->setPriority(intvalue);
1231 break; 1231 break;
1232 1232
1233 case ICAL_CATEGORIES_PROPERTY: // categories 1233 case ICAL_CATEGORIES_PROPERTY: // categories
1234 text = icalproperty_get_categories(p); 1234 text = icalproperty_get_categories(p);
1235 categories.append(QString::fromUtf8(text)); 1235 categories.append(QString::fromUtf8(text));
1236 break; 1236 break;
1237 //******************************************* 1237 //*******************************************
1238 case ICAL_RRULE_PROPERTY: 1238 case ICAL_RRULE_PROPERTY:
1239 // we do need (maybe )start datetime of incidence for recurrence 1239 // we do need (maybe )start datetime of incidence for recurrence
1240 // such that we can read recurrence only after we read incidence completely 1240 // such that we can read recurrence only after we read incidence completely
1241 readrec = true; 1241 readrec = true;
1242 rectype = icalproperty_get_rrule(p); 1242 rectype = icalproperty_get_rrule(p);
1243 break; 1243 break;
1244 1244
1245 case ICAL_EXDATE_PROPERTY: 1245 case ICAL_EXDATE_PROPERTY:
1246 icaltime = icalproperty_get_exdate(p); 1246 icaltime = icalproperty_get_exdate(p);
1247 incidence->addExDate(readICalDate(icaltime)); 1247 incidence->addExDate(readICalDate(icaltime));
1248 break; 1248 break;
1249 1249
1250 case ICAL_CLASS_PROPERTY: { 1250 case ICAL_CLASS_PROPERTY: {
1251 int inttext = icalproperty_get_class(p); 1251 int inttext = icalproperty_get_class(p);
1252 if (inttext == ICAL_CLASS_PUBLIC ) { 1252 if (inttext == ICAL_CLASS_PUBLIC ) {
1253 incidence->setSecrecy(Incidence::SecrecyPublic); 1253 incidence->setSecrecy(Incidence::SecrecyPublic);
1254 } else if (inttext == ICAL_CLASS_CONFIDENTIAL ) { 1254 } else if (inttext == ICAL_CLASS_CONFIDENTIAL ) {
1255 incidence->setSecrecy(Incidence::SecrecyConfidential); 1255 incidence->setSecrecy(Incidence::SecrecyConfidential);
1256 } else { 1256 } else {
1257 incidence->setSecrecy(Incidence::SecrecyPrivate); 1257 incidence->setSecrecy(Incidence::SecrecyPrivate);
1258 } 1258 }
1259 } 1259 }
1260 break; 1260 break;
1261 1261
1262 case ICAL_ATTACH_PROPERTY: // attachments 1262 case ICAL_ATTACH_PROPERTY: // attachments
1263 incidence->addAttachment(readAttachment(p)); 1263 incidence->addAttachment(readAttachment(p));
1264 break; 1264 break;
1265 1265
1266 default: 1266 default:
1267// kdDebug(5800) << "ICALFormat::readIncidence(): Unknown property: " << kind 1267// kdDebug(5800) << "ICALFormat::readIncidence(): Unknown property: " << kind
1268// << endl; 1268// << endl;
1269 break; 1269 break;
1270 } 1270 }
1271 1271
1272 p = icalcomponent_get_next_property(parent,ICAL_ANY_PROPERTY); 1272 p = icalcomponent_get_next_property(parent,ICAL_ANY_PROPERTY);
1273 } 1273 }
1274 if ( readrec ) { 1274 if ( readrec ) {
1275 readRecurrenceRule(rectype,incidence); 1275 readRecurrenceRule(rectype,incidence);
1276 } 1276 }
1277 // kpilot stuff 1277 // kpilot stuff
1278// TODO: move this application-specific code to kpilot 1278// TODO: move this application-specific code to kpilot
1279 QString kp = incidence->nonKDECustomProperty("X-PILOTID"); 1279 QString kp = incidence->nonKDECustomProperty("X-PILOTID");
1280 if (!kp.isNull()) { 1280 if (!kp.isNull()) {
1281 incidence->setPilotId(kp.toInt()); 1281 incidence->setPilotId(kp.toInt());
1282 } 1282 }
1283 kp = incidence->nonKDECustomProperty("X-PILOTSTAT"); 1283 kp = incidence->nonKDECustomProperty("X-PILOTSTAT");
1284 if (!kp.isNull()) { 1284 if (!kp.isNull()) {
1285 incidence->setSyncStatus(kp.toInt()); 1285 incidence->setSyncStatus(kp.toInt());
1286 } 1286 }
1287 1287
1288 1288
1289 kp = incidence->nonKDECustomProperty("X-KOPIEXTID"); 1289 kp = incidence->nonKDECustomProperty("X-KOPIEXTID");
1290 if (!kp.isNull()) { 1290 if (!kp.isNull()) {
1291 incidence->setIDStr(kp); 1291 incidence->setIDStr(kp);
1292 } 1292 }
1293 1293
1294 // Cancel backwards compatibility mode for subsequent changes by the application 1294 // Cancel backwards compatibility mode for subsequent changes by the application
1295 if ( readrec ) 1295 if ( readrec )
1296 incidence->recurrence()->setCompatVersion(); 1296 incidence->recurrence()->setCompatVersion();
1297 1297
1298 // add categories 1298 // add categories
1299 incidence->setCategories(categories); 1299 incidence->setCategories(categories);
1300 1300
1301 // iterate through all alarms 1301 // iterate through all alarms
1302 for (icalcomponent *alarm = icalcomponent_get_first_component(parent,ICAL_VALARM_COMPONENT); 1302 for (icalcomponent *alarm = icalcomponent_get_first_component(parent,ICAL_VALARM_COMPONENT);
1303 alarm; 1303 alarm;
1304 alarm = icalcomponent_get_next_component(parent,ICAL_VALARM_COMPONENT)) { 1304 alarm = icalcomponent_get_next_component(parent,ICAL_VALARM_COMPONENT)) {
1305 readAlarm(alarm,incidence); 1305 readAlarm(alarm,incidence);
1306 } 1306 }
1307} 1307}
1308 1308
1309void ICalFormatImpl::readIncidenceBase(icalcomponent *parent,IncidenceBase *incidenceBase) 1309void ICalFormatImpl::readIncidenceBase(icalcomponent *parent,IncidenceBase *incidenceBase)
1310{ 1310{
1311 icalproperty *p = icalcomponent_get_first_property(parent,ICAL_ANY_PROPERTY); 1311 icalproperty *p = icalcomponent_get_first_property(parent,ICAL_ANY_PROPERTY);
1312 1312
1313 while (p) { 1313 while (p) {
1314 icalproperty_kind kind = icalproperty_isa(p); 1314 icalproperty_kind kind = icalproperty_isa(p);
1315 switch (kind) { 1315 switch (kind) {
1316 1316
1317 case ICAL_UID_PROPERTY: // unique id 1317 case ICAL_UID_PROPERTY: // unique id
1318 incidenceBase->setUid(QString::fromUtf8(icalproperty_get_uid(p))); 1318 incidenceBase->setUid(QString::fromUtf8(icalproperty_get_uid(p)));
1319 break; 1319 break;
1320 1320
1321 case ICAL_ORGANIZER_PROPERTY: // organizer 1321 case ICAL_ORGANIZER_PROPERTY: // organizer
1322 incidenceBase->setOrganizer(QString::fromUtf8(icalproperty_get_organizer(p))); 1322 incidenceBase->setOrganizer(QString::fromUtf8(icalproperty_get_organizer(p)));
1323 break; 1323 break;
1324 1324
1325 case ICAL_ATTENDEE_PROPERTY: // attendee 1325 case ICAL_ATTENDEE_PROPERTY: // attendee
1326 incidenceBase->addAttendee(readAttendee(p)); 1326 incidenceBase->addAttendee(readAttendee(p));
1327 break; 1327 break;
1328 1328
1329 default: 1329 default:
1330 break; 1330 break;
1331 } 1331 }
1332 1332
1333 p = icalcomponent_get_next_property(parent,ICAL_ANY_PROPERTY); 1333 p = icalcomponent_get_next_property(parent,ICAL_ANY_PROPERTY);
1334 } 1334 }
1335 1335
1336 // custom properties 1336 // custom properties
1337 readCustomProperties(parent, incidenceBase); 1337 readCustomProperties(parent, incidenceBase);
1338} 1338}
1339 1339
1340void ICalFormatImpl::readCustomProperties(icalcomponent *parent,CustomProperties *properties) 1340void ICalFormatImpl::readCustomProperties(icalcomponent *parent,CustomProperties *properties)
1341{ 1341{
1342 QMap<QCString, QString> customProperties; 1342 QMap<QCString, QString> customProperties;
1343 1343
1344 icalproperty *p = icalcomponent_get_first_property(parent,ICAL_X_PROPERTY); 1344 icalproperty *p = icalcomponent_get_first_property(parent,ICAL_X_PROPERTY);
1345 1345
1346 while (p) { 1346 while (p) {
1347 QString value = QString::fromUtf8(icalproperty_get_x(p)); 1347 QString value = QString::fromUtf8(icalproperty_get_x(p));
1348 customProperties[icalproperty_get_x_name(p)] = value; 1348 customProperties[icalproperty_get_x_name(p)] = value;
1349 //qDebug("ICalFormatImpl::readCustomProperties %s %s",value.latin1(), icalproperty_get_x_name(p) ); 1349 //qDebug("ICalFormatImpl::readCustomProperties %s %s",value.latin1(), icalproperty_get_x_name(p) );
1350 1350
1351 p = icalcomponent_get_next_property(parent,ICAL_X_PROPERTY); 1351 p = icalcomponent_get_next_property(parent,ICAL_X_PROPERTY);
1352 } 1352 }
1353 1353
1354 properties->setCustomProperties(customProperties); 1354 properties->setCustomProperties(customProperties);
1355} 1355}
1356 1356
1357void ICalFormatImpl::readRecurrenceRule(struct icalrecurrencetype rrule,Incidence *incidence) 1357void ICalFormatImpl::readRecurrenceRule(struct icalrecurrencetype rrule,Incidence *incidence)
1358{ 1358{
1359// kdDebug(5800) << "Read recurrence for " << incidence->summary() << endl; 1359// kdDebug(5800) << "Read recurrence for " << incidence->summary() << endl;
1360 1360
1361 Recurrence *recur = incidence->recurrence(); 1361 Recurrence *recur = incidence->recurrence();
1362 recur->setCompatVersion(mCalendarVersion); 1362 recur->setCompatVersion(mCalendarVersion);
1363 recur->unsetRecurs(); 1363 recur->unsetRecurs();
1364 1364
1365 struct icalrecurrencetype r = rrule; 1365 struct icalrecurrencetype r = rrule;
1366 1366
1367 dumpIcalRecurrence(r); 1367 dumpIcalRecurrence(r);
1368 readRecurrence( r, recur, incidence); 1368 readRecurrence( r, recur, incidence);
1369} 1369}
1370 1370
1371void ICalFormatImpl::readRecurrence( const struct icalrecurrencetype &r, Recurrence* recur, Incidence *incidence) 1371void ICalFormatImpl::readRecurrence( const struct icalrecurrencetype &r, Recurrence* recur, Incidence *incidence)
1372{ 1372{
1373 int wkst; 1373 int wkst;
1374 int index = 0; 1374 int index = 0;
1375 short day = 0; 1375 short day = 0;
1376 QBitArray qba(7); 1376 QBitArray qba(7);
1377 int frequ = r.freq; 1377 int frequ = r.freq;
1378 int interv = r.interval; 1378 int interv = r.interval;
1379 // preprocessing for odd recurrence definitions 1379 // preprocessing for odd recurrence definitions
1380 1380
1381 if ( r.freq == ICAL_MONTHLY_RECURRENCE ) { 1381 if ( r.freq == ICAL_MONTHLY_RECURRENCE ) {
1382 if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX) { 1382 if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX) {
1383 interv = 12; 1383 interv = 12;
1384 } 1384 }
1385 } 1385 }
1386 if ( r.freq == ICAL_YEARLY_RECURRENCE ) { 1386 if ( r.freq == ICAL_YEARLY_RECURRENCE ) {
1387 if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX && r.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX ) { 1387 if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX && r.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX ) {
1388 frequ = ICAL_MONTHLY_RECURRENCE; 1388 frequ = ICAL_MONTHLY_RECURRENCE;
1389 interv = 12* r.interval; 1389 interv = 12* r.interval;
1390 } 1390 }
1391 } 1391 }
1392 1392
1393 switch (frequ) { 1393 switch (frequ) {
1394 case ICAL_MINUTELY_RECURRENCE: 1394 case ICAL_MINUTELY_RECURRENCE:
1395 if (!icaltime_is_null_time(r.until)) { 1395 if (!icaltime_is_null_time(r.until)) {
1396 recur->setMinutely(interv,readICalDateTime(r.until)); 1396 recur->setMinutely(interv,readICalDateTime(r.until));
1397 } else { 1397 } else {
1398 if (r.count == 0) 1398 if (r.count == 0)
1399 recur->setMinutely(interv,-1); 1399 recur->setMinutely(interv,-1);
1400 else 1400 else
1401 recur->setMinutely(interv,r.count); 1401 recur->setMinutely(interv,r.count);
1402 } 1402 }
1403 break; 1403 break;
1404 case ICAL_HOURLY_RECURRENCE: 1404 case ICAL_HOURLY_RECURRENCE:
1405 if (!icaltime_is_null_time(r.until)) { 1405 if (!icaltime_is_null_time(r.until)) {
1406 recur->setHourly(interv,readICalDateTime(r.until)); 1406 recur->setHourly(interv,readICalDateTime(r.until));
1407 } else { 1407 } else {
1408 if (r.count == 0) 1408 if (r.count == 0)
1409 recur->setHourly(interv,-1); 1409 recur->setHourly(interv,-1);
1410 else 1410 else
1411 recur->setHourly(interv,r.count); 1411 recur->setHourly(interv,r.count);
1412 } 1412 }
1413 break; 1413 break;
1414 case ICAL_DAILY_RECURRENCE: 1414 case ICAL_DAILY_RECURRENCE:
1415 if (!icaltime_is_null_time(r.until)) { 1415 if (!icaltime_is_null_time(r.until)) {
1416 recur->setDaily(interv,readICalDate(r.until)); 1416 recur->setDaily(interv,readICalDate(r.until));
1417 } else { 1417 } else {
1418 if (r.count == 0) 1418 if (r.count == 0)
1419 recur->setDaily(interv,-1); 1419 recur->setDaily(interv,-1);
1420 else 1420 else
1421 recur->setDaily(interv,r.count); 1421 recur->setDaily(interv,r.count);
1422 } 1422 }
1423 break; 1423 break;
1424 case ICAL_WEEKLY_RECURRENCE: 1424 case ICAL_WEEKLY_RECURRENCE:
1425 // kdDebug(5800) << "WEEKLY_RECURRENCE" << endl; 1425 // kdDebug(5800) << "WEEKLY_RECURRENCE" << endl;
1426 wkst = (r.week_start + 5)%7 + 1; 1426 wkst = (r.week_start + 5)%7 + 1;
1427 if (!icaltime_is_null_time(r.until)) { 1427 if (!icaltime_is_null_time(r.until)) {
1428 recur->setWeekly(interv,qba,readICalDate(r.until),wkst); 1428 recur->setWeekly(interv,qba,readICalDate(r.until),wkst);
1429 } else { 1429 } else {
1430 if (r.count == 0) 1430 if (r.count == 0)
1431 recur->setWeekly(interv,qba,-1,wkst); 1431 recur->setWeekly(interv,qba,-1,wkst);
1432 else 1432 else
1433 recur->setWeekly(interv,qba,r.count,wkst); 1433 recur->setWeekly(interv,qba,r.count,wkst);
1434 } 1434 }
1435 if ( r.by_day[0] == ICAL_RECURRENCE_ARRAY_MAX) { 1435 if ( r.by_day[0] == ICAL_RECURRENCE_ARRAY_MAX) {
1436 int wday = incidence->dtStart().date().dayOfWeek ()-1; 1436 int wday = incidence->dtStart().date().dayOfWeek ()-1;
1437 //qDebug("weekly error found "); 1437 //qDebug("weekly error found ");
1438 qba.setBit(wday); 1438 qba.setBit(wday);
1439 } else { 1439 } else {
1440 while((day = r.by_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { 1440 while((day = r.by_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) {
1441 // kdDebug(5800) << " " << day << endl; 1441 // kdDebug(5800) << " " << day << endl;
1442 qba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0 1442 qba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0
1443 } 1443 }
1444 } 1444 }
1445 break; 1445 break;
1446 case ICAL_MONTHLY_RECURRENCE: 1446 case ICAL_MONTHLY_RECURRENCE:
1447 1447
1448 if (r.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX) { 1448 if (r.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX) {
1449 if (!icaltime_is_null_time(r.until)) { 1449 if (!icaltime_is_null_time(r.until)) {
1450 recur->setMonthly(Recurrence::rMonthlyPos,interv, 1450 recur->setMonthly(Recurrence::rMonthlyPos,interv,
1451 readICalDate(r.until)); 1451 readICalDate(r.until));
1452 } else { 1452 } else {
1453 if (r.count == 0) 1453 if (r.count == 0)
1454 recur->setMonthly(Recurrence::rMonthlyPos,interv,-1); 1454 recur->setMonthly(Recurrence::rMonthlyPos,interv,-1);
1455 else 1455 else
1456 recur->setMonthly(Recurrence::rMonthlyPos,interv,r.count); 1456 recur->setMonthly(Recurrence::rMonthlyPos,interv,r.count);
1457 } 1457 }
1458 bool useSetPos = false; 1458 bool useSetPos = false;
1459 short pos = 0; 1459 short pos = 0;
1460 while((day = r.by_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { 1460 while((day = r.by_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) {
1461 // kdDebug(5800) << "----a " << index << ": " << day << endl; 1461 // kdDebug(5800) << "----a " << index << ": " << day << endl;
1462 pos = icalrecurrencetype_day_position(day); 1462 pos = icalrecurrencetype_day_position(day);
1463 if (pos) { 1463 if (pos) {
1464 day = icalrecurrencetype_day_day_of_week(day); 1464 day = icalrecurrencetype_day_day_of_week(day);
1465 QBitArray ba(7); // don't wipe qba 1465 QBitArray ba(7); // don't wipe qba
1466 ba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0 1466 ba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0
1467 recur->addMonthlyPos(pos,ba); 1467 recur->addMonthlyPos(pos,ba);
1468 } else { 1468 } else {
1469 qba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0 1469 qba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0
1470 useSetPos = true; 1470 useSetPos = true;
1471 } 1471 }
1472 } 1472 }
1473 if (useSetPos) { 1473 if (useSetPos) {
1474 if (r.by_set_pos[0] != ICAL_RECURRENCE_ARRAY_MAX) { 1474 if (r.by_set_pos[0] != ICAL_RECURRENCE_ARRAY_MAX) {
1475 recur->addMonthlyPos(r.by_set_pos[0],qba); 1475 recur->addMonthlyPos(r.by_set_pos[0],qba);
1476 } 1476 }
1477 } 1477 }
1478 } else if (r.by_month_day[0] != ICAL_RECURRENCE_ARRAY_MAX) { 1478 } else if (r.by_month_day[0] != ICAL_RECURRENCE_ARRAY_MAX) {
1479 if (!icaltime_is_null_time(r.until)) { 1479 if (!icaltime_is_null_time(r.until)) {
1480 recur->setMonthly(Recurrence::rMonthlyDay,interv, 1480 recur->setMonthly(Recurrence::rMonthlyDay,interv,
1481 readICalDate(r.until)); 1481 readICalDate(r.until));
1482 } else { 1482 } else {
1483 if (r.count == 0) 1483 if (r.count == 0)
1484 recur->setMonthly(Recurrence::rMonthlyDay,interv,-1); 1484 recur->setMonthly(Recurrence::rMonthlyDay,interv,-1);
1485 else 1485 else
1486 recur->setMonthly(Recurrence::rMonthlyDay,interv,r.count); 1486 recur->setMonthly(Recurrence::rMonthlyDay,interv,r.count);
1487 } 1487 }
1488 while((day = r.by_month_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { 1488 while((day = r.by_month_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) {
1489 // kdDebug(5800) << "----b " << day << endl; 1489 // kdDebug(5800) << "----b " << day << endl;
1490 recur->addMonthlyDay(day); 1490 recur->addMonthlyDay(day);
1491 } 1491 }
1492 } 1492 }
1493 break; 1493 break;
1494 case ICAL_YEARLY_RECURRENCE: 1494 case ICAL_YEARLY_RECURRENCE:
1495 if (r.by_year_day[0] != ICAL_RECURRENCE_ARRAY_MAX) { 1495 if (r.by_year_day[0] != ICAL_RECURRENCE_ARRAY_MAX) {
1496 //qDebug(" YEARLY DAY OF YEAR"); 1496 //qDebug(" YEARLY DAY OF YEAR");
1497 if (!icaltime_is_null_time(r.until)) { 1497 if (!icaltime_is_null_time(r.until)) {
1498 recur->setYearly(Recurrence::rYearlyDay,interv, 1498 recur->setYearly(Recurrence::rYearlyDay,interv,
1499 readICalDate(r.until)); 1499 readICalDate(r.until));
1500 } else { 1500 } else {
1501 if (r.count == 0) 1501 if (r.count == 0)
1502 recur->setYearly(Recurrence::rYearlyDay,interv,-1); 1502 recur->setYearly(Recurrence::rYearlyDay,interv,-1);
1503 else 1503 else
1504 recur->setYearly(Recurrence::rYearlyDay,interv,r.count); 1504 recur->setYearly(Recurrence::rYearlyDay,interv,r.count);
1505 } 1505 }
1506 while((day = r.by_year_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { 1506 while((day = r.by_year_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) {
1507 recur->addYearlyNum(day); 1507 recur->addYearlyNum(day);
1508 } 1508 }
1509 } else if ( true /*r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX*/) { 1509 } else if ( true /*r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX*/) {
1510 if (r.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX) { 1510 if (r.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX) {
1511 qDebug("YEARLY POS NOT SUPPORTED BY GUI"); 1511 qDebug("YEARLY POS NOT SUPPORTED BY GUI");
1512 if (!icaltime_is_null_time(r.until)) { 1512 if (!icaltime_is_null_time(r.until)) {
1513 recur->setYearly(Recurrence::rYearlyPos,interv, 1513 recur->setYearly(Recurrence::rYearlyPos,interv,
1514 readICalDate(r.until)); 1514 readICalDate(r.until));
1515 } else { 1515 } else {
1516 if (r.count == 0) 1516 if (r.count == 0)
1517 recur->setYearly(Recurrence::rYearlyPos,interv,-1); 1517 recur->setYearly(Recurrence::rYearlyPos,interv,-1);
1518 else 1518 else
1519 recur->setYearly(Recurrence::rYearlyPos,interv,r.count); 1519 recur->setYearly(Recurrence::rYearlyPos,interv,r.count);
1520 } 1520 }
1521 bool useSetPos = false; 1521 bool useSetPos = false;
1522 short pos = 0; 1522 short pos = 0;
1523 while((day = r.by_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { 1523 while((day = r.by_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) {
1524 // kdDebug(5800) << "----a " << index << ": " << day << endl; 1524 // kdDebug(5800) << "----a " << index << ": " << day << endl;
1525 pos = icalrecurrencetype_day_position(day); 1525 pos = icalrecurrencetype_day_position(day);
1526 if (pos) { 1526 if (pos) {
1527 day = icalrecurrencetype_day_day_of_week(day); 1527 day = icalrecurrencetype_day_day_of_week(day);
1528 QBitArray ba(7); // don't wipe qba 1528 QBitArray ba(7); // don't wipe qba
1529 ba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0 1529 ba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0
1530 recur->addYearlyMonthPos(pos,ba); 1530 recur->addYearlyMonthPos(pos,ba);
1531 } else { 1531 } else {
1532 qba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0 1532 qba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0
1533 useSetPos = true; 1533 useSetPos = true;
1534 } 1534 }
1535 } 1535 }
1536 if (useSetPos) { 1536 if (useSetPos) {
1537 if (r.by_set_pos[0] != ICAL_RECURRENCE_ARRAY_MAX) { 1537 if (r.by_set_pos[0] != ICAL_RECURRENCE_ARRAY_MAX) {
1538 recur->addYearlyMonthPos(r.by_set_pos[0],qba); 1538 recur->addYearlyMonthPos(r.by_set_pos[0],qba);
1539 } 1539 }
1540 } 1540 }
1541 } else { 1541 } else {
1542 //qDebug("YEARLY MONTH "); 1542 //qDebug("YEARLY MONTH ");
1543 if (!icaltime_is_null_time(r.until)) { 1543 if (!icaltime_is_null_time(r.until)) {
1544 recur->setYearly(Recurrence::rYearlyMonth,interv, 1544 recur->setYearly(Recurrence::rYearlyMonth,interv,
1545 readICalDate(r.until)); 1545 readICalDate(r.until));
1546 } else { 1546 } else {
1547 if (r.count == 0) 1547 if (r.count == 0)
1548 recur->setYearly(Recurrence::rYearlyMonth,interv,-1); 1548 recur->setYearly(Recurrence::rYearlyMonth,interv,-1);
1549 else 1549 else
1550 recur->setYearly(Recurrence::rYearlyMonth,interv,r.count); 1550 recur->setYearly(Recurrence::rYearlyMonth,interv,r.count);
1551 } 1551 }
1552 if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX ) { 1552 if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX ) {
1553 index = 0; 1553 index = 0;
1554 while((day = r.by_month[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { 1554 while((day = r.by_month[index++]) != ICAL_RECURRENCE_ARRAY_MAX) {
1555 recur->addYearlyNum(day); 1555 recur->addYearlyNum(day);
1556 } 1556 }
1557 } else { 1557 } else {
1558 recur->addYearlyNum(incidence->dtStart().date().month()); 1558 recur->addYearlyNum(incidence->dtStart().date().month());
1559 } 1559 }
1560 } 1560 }
1561 1561
1562 } 1562 }
1563 break; 1563 break;
1564 default: 1564 default:
1565 ; 1565 ;
1566 break; 1566 break;
1567 } 1567 }
1568} 1568}
1569 1569
1570void ICalFormatImpl::readAlarm(icalcomponent *alarm,Incidence *incidence) 1570void ICalFormatImpl::readAlarm(icalcomponent *alarm,Incidence *incidence)
1571{ 1571{
1572 //kdDebug(5800) << "Read alarm for " << incidence->summary() << endl; 1572 //kdDebug(5800) << "Read alarm for " << incidence->summary() << endl;
1573 1573
1574 Alarm* ialarm = incidence->newAlarm(); 1574 Alarm* ialarm = incidence->newAlarm();
1575 ialarm->setRepeatCount(0); 1575 ialarm->setRepeatCount(0);
1576 ialarm->setEnabled(true); 1576 ialarm->setEnabled(true);
1577 1577
1578 // Determine the alarm's action type 1578 // Determine the alarm's action type
1579 icalproperty *p = icalcomponent_get_first_property(alarm,ICAL_ACTION_PROPERTY); 1579 icalproperty *p = icalcomponent_get_first_property(alarm,ICAL_ACTION_PROPERTY);
1580 if ( !p ) { 1580 if ( !p ) {
1581 return; 1581 return;
1582 } 1582 }
1583 1583
1584 icalproperty_action action = icalproperty_get_action(p); 1584 icalproperty_action action = icalproperty_get_action(p);
1585 Alarm::Type type = Alarm::Display; 1585 Alarm::Type type = Alarm::Display;
1586 switch ( action ) { 1586 switch ( action ) {
1587 case ICAL_ACTION_DISPLAY: type = Alarm::Display; break; 1587 case ICAL_ACTION_DISPLAY: type = Alarm::Display; break;
1588 case ICAL_ACTION_AUDIO: type = Alarm::Audio; break; 1588 case ICAL_ACTION_AUDIO: type = Alarm::Audio; break;
1589 case ICAL_ACTION_PROCEDURE: type = Alarm::Procedure; break; 1589 case ICAL_ACTION_PROCEDURE: type = Alarm::Procedure; break;
1590 case ICAL_ACTION_EMAIL: type = Alarm::Email; break; 1590 case ICAL_ACTION_EMAIL: type = Alarm::Email; break;
1591 default: 1591 default:
1592 ; 1592 ;
1593 return; 1593 return;
1594 } 1594 }
1595 ialarm->setType(type); 1595 ialarm->setType(type);
1596 1596
1597 p = icalcomponent_get_first_property(alarm,ICAL_ANY_PROPERTY); 1597 p = icalcomponent_get_first_property(alarm,ICAL_ANY_PROPERTY);
1598 while (p) { 1598 while (p) {
1599 icalproperty_kind kind = icalproperty_isa(p); 1599 icalproperty_kind kind = icalproperty_isa(p);
1600 1600
1601 switch (kind) { 1601 switch (kind) {
1602 case ICAL_TRIGGER_PROPERTY: { 1602 case ICAL_TRIGGER_PROPERTY: {
1603 icaltriggertype trigger = icalproperty_get_trigger(p); 1603 icaltriggertype trigger = icalproperty_get_trigger(p);
1604 if (icaltime_is_null_time(trigger.time)) { 1604 if (icaltime_is_null_time(trigger.time)) {
1605 if (icaldurationtype_is_null_duration(trigger.duration)) { 1605 if (icaldurationtype_is_null_duration(trigger.duration)) {
1606 kdDebug(5800) << "ICalFormatImpl::readAlarm(): Trigger has no time and no duration." << endl; 1606 kdDebug(5800) << "ICalFormatImpl::readAlarm(): Trigger has no time and no duration." << endl;
1607 } else { 1607 } else {
1608 Duration duration = icaldurationtype_as_int( trigger.duration ); 1608 Duration duration = icaldurationtype_as_int( trigger.duration );
1609 icalparameter *param = icalproperty_get_first_parameter(p,ICAL_RELATED_PARAMETER); 1609 icalparameter *param = icalproperty_get_first_parameter(p,ICAL_RELATED_PARAMETER);
1610 if (param && icalparameter_get_related(param) == ICAL_RELATED_END) 1610 if (param && icalparameter_get_related(param) == ICAL_RELATED_END)
1611 ialarm->setEndOffset(duration); 1611 ialarm->setEndOffset(duration);
1612 else 1612 else
1613 ialarm->setStartOffset(duration); 1613 ialarm->setStartOffset(duration);
1614 } 1614 }
1615 } else { 1615 } else {
1616 ialarm->setTime(readICalDateTime(trigger.time)); 1616 ialarm->setTime(readICalDateTime(trigger.time));
1617 } 1617 }
1618 break; 1618 break;
1619 } 1619 }
1620 case ICAL_DURATION_PROPERTY: { 1620 case ICAL_DURATION_PROPERTY: {
1621 icaldurationtype duration = icalproperty_get_duration(p); 1621 icaldurationtype duration = icalproperty_get_duration(p);
1622 ialarm->setSnoozeTime(icaldurationtype_as_int(duration)/60); 1622 ialarm->setSnoozeTime(icaldurationtype_as_int(duration)/60);
1623 break; 1623 break;
1624 } 1624 }
1625 case ICAL_REPEAT_PROPERTY: 1625 case ICAL_REPEAT_PROPERTY:
1626 ialarm->setRepeatCount(icalproperty_get_repeat(p)); 1626 ialarm->setRepeatCount(icalproperty_get_repeat(p));
1627 break; 1627 break;
1628 1628
1629 // Only in DISPLAY and EMAIL and PROCEDURE alarms 1629 // Only in DISPLAY and EMAIL and PROCEDURE alarms
1630 case ICAL_DESCRIPTION_PROPERTY: { 1630 case ICAL_DESCRIPTION_PROPERTY: {
1631 QString description = QString::fromUtf8(icalproperty_get_description(p)); 1631 QString description = QString::fromUtf8(icalproperty_get_description(p));
1632 switch ( action ) { 1632 switch ( action ) {
1633 case ICAL_ACTION_DISPLAY: 1633 case ICAL_ACTION_DISPLAY:
1634 ialarm->setText( description ); 1634 ialarm->setText( description );
1635 break; 1635 break;
1636 case ICAL_ACTION_PROCEDURE: 1636 case ICAL_ACTION_PROCEDURE:
1637 ialarm->setProgramArguments( description ); 1637 ialarm->setProgramArguments( description );
1638 break; 1638 break;
1639 case ICAL_ACTION_EMAIL: 1639 case ICAL_ACTION_EMAIL:
1640 ialarm->setMailText( description ); 1640 ialarm->setMailText( description );
1641 break; 1641 break;
1642 default: 1642 default:
1643 break; 1643 break;
1644 } 1644 }
1645 break; 1645 break;
1646 } 1646 }
1647 // Only in EMAIL alarm 1647 // Only in EMAIL alarm
1648 case ICAL_SUMMARY_PROPERTY: 1648 case ICAL_SUMMARY_PROPERTY:
1649 ialarm->setMailSubject(QString::fromUtf8(icalproperty_get_summary(p))); 1649 ialarm->setMailSubject(QString::fromUtf8(icalproperty_get_summary(p)));
1650 break; 1650 break;
1651 1651
1652 // Only in EMAIL alarm 1652 // Only in EMAIL alarm
1653 case ICAL_ATTENDEE_PROPERTY: { 1653 case ICAL_ATTENDEE_PROPERTY: {
1654 QString email = QString::fromUtf8(icalproperty_get_attendee(p)); 1654 QString email = QString::fromUtf8(icalproperty_get_attendee(p));
1655 QString name; 1655 QString name;
1656 icalparameter *param = icalproperty_get_first_parameter(p,ICAL_CN_PARAMETER); 1656 icalparameter *param = icalproperty_get_first_parameter(p,ICAL_CN_PARAMETER);
1657 if (param) { 1657 if (param) {
1658 name = QString::fromUtf8(icalparameter_get_cn(param)); 1658 name = QString::fromUtf8(icalparameter_get_cn(param));
1659 } 1659 }
1660 ialarm->addMailAddress(Person(name, email)); 1660 ialarm->addMailAddress(Person(name, email));
1661 break; 1661 break;
1662 } 1662 }
1663 // Only in AUDIO and EMAIL and PROCEDURE alarms 1663 // Only in AUDIO and EMAIL and PROCEDURE alarms
1664 case ICAL_ATTACH_PROPERTY: { 1664 case ICAL_ATTACH_PROPERTY: {
1665 icalattach *attach = icalproperty_get_attach(p); 1665 icalattach *attach = icalproperty_get_attach(p);
1666 QString url = QFile::decodeName(icalattach_get_url(attach)); 1666 QString url = QFile::decodeName(icalattach_get_url(attach));
1667 switch ( action ) { 1667 switch ( action ) {
1668 case ICAL_ACTION_AUDIO: 1668 case ICAL_ACTION_AUDIO:
1669 ialarm->setAudioFile( url ); 1669 ialarm->setAudioFile( url );
1670 break; 1670 break;
1671 case ICAL_ACTION_PROCEDURE: 1671 case ICAL_ACTION_PROCEDURE:
1672 ialarm->setProgramFile( url ); 1672 ialarm->setProgramFile( url );
1673 break; 1673 break;
1674 case ICAL_ACTION_EMAIL: 1674 case ICAL_ACTION_EMAIL:
1675 ialarm->addMailAttachment( url ); 1675 ialarm->addMailAttachment( url );
1676 break; 1676 break;
1677 default: 1677 default:
1678 break; 1678 break;
1679 } 1679 }
1680 break; 1680 break;
1681 } 1681 }
1682 default: 1682 default:
1683 break; 1683 break;
1684 } 1684 }
1685 1685
1686 p = icalcomponent_get_next_property(alarm,ICAL_ANY_PROPERTY); 1686 p = icalcomponent_get_next_property(alarm,ICAL_ANY_PROPERTY);
1687 } 1687 }
1688 1688
1689 // custom properties 1689 // custom properties
1690 readCustomProperties(alarm, ialarm); 1690 readCustomProperties(alarm, ialarm);
1691 1691
1692 // TODO: check for consistency of alarm properties 1692 // TODO: check for consistency of alarm properties
1693} 1693}
1694 1694
1695icaltimetype ICalFormatImpl::writeICalDate(const QDate &date) 1695icaltimetype ICalFormatImpl::writeICalDate(const QDate &date)
1696{ 1696{
1697 icaltimetype t; 1697 icaltimetype t;
1698 1698
1699 t.year = date.year(); 1699 t.year = date.year();
1700 t.month = date.month(); 1700 t.month = date.month();
1701 t.day = date.day(); 1701 t.day = date.day();
1702 1702
1703 t.hour = 0; 1703 t.hour = 0;
1704 t.minute = 0; 1704 t.minute = 0;
1705 t.second = 0; 1705 t.second = 0;
1706 1706
1707 t.is_date = 1; 1707 t.is_date = 1;
1708 1708
1709 t.is_utc = 0; 1709 t.is_utc = 0;
1710 1710
1711 t.zone = 0; 1711 t.zone = 0;
1712 1712
1713 return t; 1713 return t;
1714} 1714}
1715 1715
1716icaltimetype ICalFormatImpl::writeICalDateTime(const QDateTime &dt ) 1716icaltimetype ICalFormatImpl::writeICalDateTime(const QDateTime &dt )
1717{ 1717{
1718 icaltimetype t; 1718 icaltimetype t;
1719 t.is_date = 0; 1719 t.is_date = 0;
1720 t.zone = 0; 1720 t.zone = 0;
1721 QDateTime datetime; 1721 QDateTime datetime;
1722 if ( mParent->utc() ) { 1722 if ( mParent->utc() ) {
1723 int offset = KGlobal::locale()->localTimeOffset( dt ); 1723 int offset = KGlobal::locale()->localTimeOffset( dt );
1724 datetime = dt.addSecs ( -offset*60); 1724 datetime = dt.addSecs ( -offset*60);
1725 t.is_utc = 1; 1725 t.is_utc = 1;
1726 } 1726 }
1727 else { 1727 else {
1728 datetime = dt; 1728 datetime = dt;
1729 t.is_utc = 0; 1729 t.is_utc = 0;
1730 1730
1731 } 1731 }
1732 t.year = datetime.date().year(); 1732 t.year = datetime.date().year();
1733 t.month = datetime.date().month(); 1733 t.month = datetime.date().month();
1734 t.day = datetime.date().day(); 1734 t.day = datetime.date().day();
1735 1735
1736 t.hour = datetime.time().hour(); 1736 t.hour = datetime.time().hour();
1737 t.minute = datetime.time().minute(); 1737 t.minute = datetime.time().minute();
1738 t.second = datetime.time().second(); 1738 t.second = datetime.time().second();
1739 1739
1740 //qDebug("*** time %s localtime %s ",dt .toString().latin1() ,datetime .toString().latin1() ); 1740 //qDebug("*** time %s localtime %s ",dt .toString().latin1() ,datetime .toString().latin1() );
1741 1741
1742// if ( mParent->utc() ) { 1742// if ( mParent->utc() ) {
1743// datetime = KGlobal::locale()->localTime( dt ); 1743// datetime = KGlobal::locale()->localTime( dt );
1744// qDebug("*** time %s localtime %s ",dt .toString().latin1() ,datetime .toString().latin1() ); 1744// qDebug("*** time %s localtime %s ",dt .toString().latin1() ,datetime .toString().latin1() );
1745// if (mParent->timeZoneId().isEmpty()) 1745// if (mParent->timeZoneId().isEmpty())
1746// t = icaltime_as_utc(t, 0); 1746// t = icaltime_as_utc(t, 0);
1747// else 1747// else
1748// t = icaltime_as_utc(t,mParent->timeZoneId().local8Bit()); 1748// t = icaltime_as_utc(t,mParent->timeZoneId().local8Bit());
1749// } 1749// }
1750 1750
1751 return t; 1751 return t;
1752} 1752}
1753 1753
1754QDateTime ICalFormatImpl::readICalDateTime(icaltimetype t) 1754QDateTime ICalFormatImpl::readICalDateTime(icaltimetype t)
1755{ 1755{
1756 QDateTime dt (QDate(t.year,t.month,t.day), 1756 QDateTime dt (QDate(t.year,t.month,t.day),
1757 QTime(t.hour,t.minute,t.second) ); 1757 QTime(t.hour,t.minute,t.second) );
1758 1758
1759 if (t.is_utc) { 1759 if (t.is_utc) {
1760 int offset = KGlobal::locale()->localTimeOffset( dt ); 1760 int offset = KGlobal::locale()->localTimeOffset( dt );
1761 dt = dt.addSecs ( offset*60); 1761 dt = dt.addSecs ( offset*60);
1762 } 1762 }
1763 1763
1764 return dt; 1764 return dt;
1765} 1765}
1766 1766
1767QDate ICalFormatImpl::readICalDate(icaltimetype t) 1767QDate ICalFormatImpl::readICalDate(icaltimetype t)
1768{ 1768{
1769 return QDate(t.year,t.month,t.day); 1769 return QDate(t.year,t.month,t.day);
1770} 1770}
1771 1771
1772icaldurationtype ICalFormatImpl::writeICalDuration(int seconds) 1772icaldurationtype ICalFormatImpl::writeICalDuration(int seconds)
1773{ 1773{
1774 icaldurationtype d; 1774 icaldurationtype d;
1775 1775
1776 d.is_neg = (seconds<0)?1:0; 1776 d.is_neg = (seconds<0)?1:0;
1777 if (seconds<0) seconds = -seconds; 1777 if (seconds<0) seconds = -seconds;
1778 1778
1779 d.weeks = seconds / gSecondsPerWeek; 1779 d.weeks = seconds / gSecondsPerWeek;
1780 seconds %= gSecondsPerWeek; 1780 seconds %= gSecondsPerWeek;
1781 d.days = seconds / gSecondsPerDay; 1781 d.days = seconds / gSecondsPerDay;
1782 seconds %= gSecondsPerDay; 1782 seconds %= gSecondsPerDay;
1783 d.hours = seconds / gSecondsPerHour; 1783 d.hours = seconds / gSecondsPerHour;
1784 seconds %= gSecondsPerHour; 1784 seconds %= gSecondsPerHour;
1785 d.minutes = seconds / gSecondsPerMinute; 1785 d.minutes = seconds / gSecondsPerMinute;
1786 seconds %= gSecondsPerMinute; 1786 seconds %= gSecondsPerMinute;
1787 d.seconds = seconds; 1787 d.seconds = seconds;
1788 return d; 1788 return d;
1789} 1789}
1790 1790
1791int ICalFormatImpl::readICalDuration(icaldurationtype d) 1791int ICalFormatImpl::readICalDuration(icaldurationtype d)
1792{ 1792{
1793 int result = 0; 1793 int result = 0;
1794 1794
1795 result += d.weeks * gSecondsPerWeek; 1795 result += d.weeks * gSecondsPerWeek;
1796 result += d.days * gSecondsPerDay; 1796 result += d.days * gSecondsPerDay;
1797 result += d.hours * gSecondsPerHour; 1797 result += d.hours * gSecondsPerHour;
1798 result += d.minutes * gSecondsPerMinute; 1798 result += d.minutes * gSecondsPerMinute;
1799 result += d.seconds; 1799 result += d.seconds;
1800 1800
1801 if (d.is_neg) result *= -1; 1801 if (d.is_neg) result *= -1;
1802 1802
1803 return result; 1803 return result;
1804} 1804}
1805 1805
1806icalcomponent *ICalFormatImpl::createCalendarComponent(Calendar *cal) 1806icalcomponent *ICalFormatImpl::createCalendarComponent(Calendar *cal)
1807{ 1807{
1808 icalcomponent *calendar; 1808 icalcomponent *calendar;
1809 1809
1810 // Root component 1810 // Root component
1811 calendar = icalcomponent_new(ICAL_VCALENDAR_COMPONENT); 1811 calendar = icalcomponent_new(ICAL_VCALENDAR_COMPONENT);
1812 1812
1813 icalproperty *p; 1813 icalproperty *p;
1814 1814
1815 // Product Identifier 1815 // Product Identifier
1816 p = icalproperty_new_prodid(CalFormat::productId().utf8()); 1816 p = icalproperty_new_prodid(CalFormat::productId().utf8());
1817 icalcomponent_add_property(calendar,p); 1817 icalcomponent_add_property(calendar,p);
1818 1818
1819 // TODO: Add time zone 1819 // TODO: Add time zone
1820 1820
1821 // iCalendar version (2.0) 1821 // iCalendar version (2.0)
1822 p = icalproperty_new_version(const_cast<char *>(_ICAL_VERSION)); 1822 p = icalproperty_new_version(const_cast<char *>(_ICAL_VERSION));
1823 icalcomponent_add_property(calendar,p); 1823 icalcomponent_add_property(calendar,p);
1824 1824
1825 // Custom properties 1825 // Custom properties
1826 if( cal != 0 ) 1826 if( cal != 0 )
1827 writeCustomProperties(calendar, cal); 1827 writeCustomProperties(calendar, cal);
1828 1828
1829 return calendar; 1829 return calendar;
1830} 1830}
1831 1831
1832 1832
1833 1833
1834// take a raw vcalendar (i.e. from a file on disk, clipboard, etc. etc. 1834// take a raw vcalendar (i.e. from a file on disk, clipboard, etc. etc.
1835// and break it down from its tree-like format into the dictionary format 1835// and break it down from its tree-like format into the dictionary format
1836// that is used internally in the ICalFormatImpl. 1836// that is used internally in the ICalFormatImpl.
1837bool ICalFormatImpl::populate( Calendar *cal, icalcomponent *calendar) 1837bool ICalFormatImpl::populate( Calendar *cal, icalcomponent *calendar)
1838{ 1838{
1839 // this function will populate the caldict dictionary and other event 1839 // this function will populate the caldict dictionary and other event
1840 // lists. It turns vevents into Events and then inserts them. 1840 // lists. It turns vevents into Events and then inserts them.
1841 1841
1842 if (!calendar) return false; 1842 if (!calendar) return false;
1843 1843
1844// TODO: check for METHOD 1844// TODO: check for METHOD
1845#if 0 1845#if 0
1846 if ((curVO = isAPropertyOf(vcal, ICMethodProp)) != 0) { 1846 if ((curVO = isAPropertyOf(vcal, ICMethodProp)) != 0) {
1847 char *methodType = 0; 1847 char *methodType = 0;
1848 methodType = fakeCString(vObjectUStringZValue(curVO)); 1848 methodType = fakeCString(vObjectUStringZValue(curVO));
1849 if (mEnableDialogs) 1849 if (mEnableDialogs)
1850 KMessageBox::information(mTopWidget, 1850 KMessageBox::information(mTopWidget,
1851 i18n("This calendar is an iTIP transaction of type \"%1\".") 1851 i18n("This calendar is an iTIP transaction of type \"%1\".")
1852 .arg(methodType), 1852 .arg(methodType),
1853 i18n("%1: iTIP Transaction").arg(CalFormat::application())); 1853 i18n("%1: iTIP Transaction").arg(CalFormat::application()));
1854 delete methodType; 1854 delete methodType;
1855 } 1855 }
1856#endif 1856#endif
1857 1857
1858 icalproperty *p; 1858 icalproperty *p;
1859 1859
1860 p = icalcomponent_get_first_property(calendar,ICAL_PRODID_PROPERTY); 1860 p = icalcomponent_get_first_property(calendar,ICAL_PRODID_PROPERTY);
1861 if (!p) { 1861 if (!p) {
1862// TODO: does no PRODID really matter? 1862// TODO: does no PRODID really matter?
1863// mParent->setException(new ErrorFormat(ErrorFormat::CalVersionUnknown)); 1863// mParent->setException(new ErrorFormat(ErrorFormat::CalVersionUnknown));
1864// return false; 1864// return false;
1865 mLoadedProductId = ""; 1865 mLoadedProductId = "";
1866 mCalendarVersion = 0; 1866 mCalendarVersion = 0;
1867 } else { 1867 } else {
1868 mLoadedProductId = QString::fromUtf8(icalproperty_get_prodid(p)); 1868 mLoadedProductId = QString::fromUtf8(icalproperty_get_prodid(p));
1869 mCalendarVersion = CalFormat::calendarVersion(mLoadedProductId); 1869 mCalendarVersion = CalFormat::calendarVersion(mLoadedProductId);
1870 1870
1871 delete mCompat; 1871 delete mCompat;
1872 mCompat = CompatFactory::createCompat( mLoadedProductId ); 1872 mCompat = CompatFactory::createCompat( mLoadedProductId );
1873 } 1873 }
1874 1874
1875// TODO: check for unknown PRODID 1875// TODO: check for unknown PRODID
1876#if 0 1876#if 0
1877 if (!mCalendarVersion 1877 if (!mCalendarVersion
1878 && CalFormat::productId() != mLoadedProductId) { 1878 && CalFormat::productId() != mLoadedProductId) {
1879 // warn the user that we might have trouble reading non-known calendar. 1879 // warn the user that we might have trouble reading non-known calendar.
1880 if (mEnableDialogs) 1880 if (mEnableDialogs)
1881 KMessageBox::information(mTopWidget, 1881 KMessageBox::information(mTopWidget,
1882 i18n("This vCalendar file was not created by KOrganizer " 1882 i18n("This vCalendar file was not created by KOrganizer "
1883 "or any other product we support. Loading anyway..."), 1883 "or any other product we support. Loading anyway..."),
1884 i18n("%1: Unknown vCalendar Vendor").arg(CalFormat::application())); 1884 i18n("%1: Unknown vCalendar Vendor").arg(CalFormat::application()));
1885 } 1885 }
1886#endif 1886#endif
1887 1887
1888 p = icalcomponent_get_first_property(calendar,ICAL_VERSION_PROPERTY); 1888 p = icalcomponent_get_first_property(calendar,ICAL_VERSION_PROPERTY);
1889 if (!p) { 1889 if (!p) {
1890 mParent->setException(new ErrorFormat(ErrorFormat::CalVersionUnknown)); 1890 mParent->setException(new ErrorFormat(ErrorFormat::CalVersionUnknown));
1891 return false; 1891 return false;
1892 } else { 1892 } else {
1893 const char *version = icalproperty_get_version(p); 1893 const char *version = icalproperty_get_version(p);
1894 1894
1895 if (strcmp(version,"1.0") == 0) { 1895 if (strcmp(version,"1.0") == 0) {
1896 mParent->setException(new ErrorFormat(ErrorFormat::CalVersion1, 1896 mParent->setException(new ErrorFormat(ErrorFormat::CalVersion1,
1897 i18n("Expected iCalendar format"))); 1897 i18n("Expected iCalendar format")));
1898 return false; 1898 return false;
1899 } else if (strcmp(version,"2.0") != 0) { 1899 } else if (strcmp(version,"2.0") != 0) {
1900 mParent->setException(new ErrorFormat(ErrorFormat::CalVersionUnknown)); 1900 mParent->setException(new ErrorFormat(ErrorFormat::CalVersionUnknown));
1901 return false; 1901 return false;
1902 } 1902 }
1903 } 1903 }
1904 1904
1905 1905
1906// TODO: check for calendar format version 1906// TODO: check for calendar format version
1907#if 0 1907#if 0
1908 // warn the user we might have trouble reading this unknown version. 1908 // warn the user we might have trouble reading this unknown version.
1909 if ((curVO = isAPropertyOf(vcal, VCVersionProp)) != 0) { 1909 if ((curVO = isAPropertyOf(vcal, VCVersionProp)) != 0) {
1910 char *s = fakeCString(vObjectUStringZValue(curVO)); 1910 char *s = fakeCString(vObjectUStringZValue(curVO));
1911 if (strcmp(_VCAL_VERSION, s) != 0) 1911 if (strcmp(_VCAL_VERSION, s) != 0)
1912 if (mEnableDialogs) 1912 if (mEnableDialogs)
1913 KMessageBox::sorry(mTopWidget, 1913 KMessageBox::sorry(mTopWidget,
1914 i18n("This vCalendar file has version %1.\n" 1914 i18n("This vCalendar file has version %1.\n"
1915 "We only support %2.") 1915 "We only support %2.")
1916 .arg(s).arg(_VCAL_VERSION), 1916 .arg(s).arg(_VCAL_VERSION),
1917 i18n("%1: Unknown vCalendar Version").arg(CalFormat::application())); 1917 i18n("%1: Unknown vCalendar Version").arg(CalFormat::application()));
1918 deleteStr(s); 1918 deleteStr(s);
1919 } 1919 }
1920#endif 1920#endif
1921 1921
1922 // custom properties 1922 // custom properties
1923 readCustomProperties(calendar, cal); 1923 readCustomProperties(calendar, cal);
1924 1924
1925// TODO: set time zone 1925// TODO: set time zone
1926#if 0 1926#if 0
1927 // set the time zone 1927 // set the time zone
1928 if ((curVO = isAPropertyOf(vcal, VCTimeZoneProp)) != 0) { 1928 if ((curVO = isAPropertyOf(vcal, VCTimeZoneProp)) != 0) {
1929 char *s = fakeCString(vObjectUStringZValue(curVO)); 1929 char *s = fakeCString(vObjectUStringZValue(curVO));
1930 cal->setTimeZone(s); 1930 cal->setTimeZone(s);
1931 deleteStr(s); 1931 deleteStr(s);
1932 } 1932 }
1933#endif 1933#endif
1934 1934
1935 // Store all events with a relatedTo property in a list for post-processing 1935 // Store all events with a relatedTo property in a list for post-processing
1936 mEventsRelate.clear(); 1936 mEventsRelate.clear();
1937 mTodosRelate.clear(); 1937 mTodosRelate.clear();
1938 // TODO: make sure that only actually added ecvens go to this lists. 1938 // TODO: make sure that only actually added ecvens go to this lists.
1939 1939
1940 icalcomponent *c; 1940 icalcomponent *c;
1941 1941
1942 // Iterate through all todos 1942 // Iterate through all todos
1943 c = icalcomponent_get_first_component(calendar,ICAL_VTODO_COMPONENT); 1943 c = icalcomponent_get_first_component(calendar,ICAL_VTODO_COMPONENT);
1944 while (c) { 1944 while (c) {
1945// kdDebug(5800) << "----Todo found" << endl; 1945// kdDebug(5800) << "----Todo found" << endl;
1946 Todo *todo = readTodo(c); 1946 Todo *todo = readTodo(c);
1947 if (!cal->todo(todo->uid())) 1947 if (!cal->todo(todo->uid()))
1948 cal->addTodo(todo); 1948 cal->addTodo(todo);
1949 c = icalcomponent_get_next_component(calendar,ICAL_VTODO_COMPONENT); 1949 c = icalcomponent_get_next_component(calendar,ICAL_VTODO_COMPONENT);
1950 } 1950 }
1951 1951
1952 // Iterate through all events 1952 // Iterate through all events
1953 c = icalcomponent_get_first_component(calendar,ICAL_VEVENT_COMPONENT); 1953 c = icalcomponent_get_first_component(calendar,ICAL_VEVENT_COMPONENT);
1954 while (c) { 1954 while (c) {
1955// kdDebug(5800) << "----Event found" << endl; 1955// kdDebug(5800) << "----Event found" << endl;
1956 Event *event = readEvent(c); 1956 Event *event = readEvent(c);
1957 if (!cal->event(event->uid())) 1957 if (!cal->event(event->uid()))
1958 cal->addEvent(event); 1958 cal->addEvent(event);
1959 c = icalcomponent_get_next_component(calendar,ICAL_VEVENT_COMPONENT); 1959 c = icalcomponent_get_next_component(calendar,ICAL_VEVENT_COMPONENT);
1960 } 1960 }
1961 1961
1962 // Iterate through all journals 1962 // Iterate through all journals
1963 c = icalcomponent_get_first_component(calendar,ICAL_VJOURNAL_COMPONENT); 1963 c = icalcomponent_get_first_component(calendar,ICAL_VJOURNAL_COMPONENT);
1964 while (c) { 1964 while (c) {
1965// kdDebug(5800) << "----Journal found" << endl; 1965// kdDebug(5800) << "----Journal found" << endl;
1966 Journal *journal = readJournal(c); 1966 Journal *journal = readJournal(c);
1967 if (!cal->journal(journal->uid())) 1967 if (!cal->journal(journal->uid()))
1968 cal->addJournal(journal); 1968 cal->addJournal(journal);
1969 c = icalcomponent_get_next_component(calendar,ICAL_VJOURNAL_COMPONENT); 1969 c = icalcomponent_get_next_component(calendar,ICAL_VJOURNAL_COMPONENT);
1970 } 1970 }
1971 1971
1972#if 0 1972#if 0
1973 initPropIterator(&i, vcal); 1973 initPropIterator(&i, vcal);
1974 1974
1975 // go through all the vobjects in the vcal 1975 // go through all the vobjects in the vcal
1976 while (moreIteration(&i)) { 1976 while (moreIteration(&i)) {
1977 curVO = nextVObject(&i); 1977 curVO = nextVObject(&i);
1978 1978
1979 /************************************************************************/ 1979 /************************************************************************/
1980 1980
1981 // now, check to see that the object is an event or todo. 1981 // now, check to see that the object is an event or todo.
1982 if (strcmp(vObjectName(curVO), VCEventProp) == 0) { 1982 if (strcmp(vObjectName(curVO), VCEventProp) == 0) {
1983 1983
1984 if ((curVOProp = isAPropertyOf(curVO, KPilotStatusProp)) != 0) { 1984 if ((curVOProp = isAPropertyOf(curVO, KPilotStatusProp)) != 0) {
1985 char *s; 1985 char *s;
1986 s = fakeCString(vObjectUStringZValue(curVOProp)); 1986 s = fakeCString(vObjectUStringZValue(curVOProp));
1987 // check to see if event was deleted by the kpilot conduit 1987 // check to see if event was deleted by the kpilot conduit
1988 if (atoi(s) == Event::SYNCDEL) { 1988 if (atoi(s) == Event::SYNCDEL) {
1989 deleteStr(s); 1989 deleteStr(s);
1990 goto SKIP; 1990 goto SKIP;
1991 } 1991 }
1992 deleteStr(s); 1992 deleteStr(s);
1993 } 1993 }
1994 1994
1995 // this code checks to see if we are trying to read in an event 1995 // this code checks to see if we are trying to read in an event
1996 // that we already find to be in the calendar. If we find this 1996 // that we already find to be in the calendar. If we find this
1997 // to be the case, we skip the event. 1997 // to be the case, we skip the event.
1998 if ((curVOProp = isAPropertyOf(curVO, VCUniqueStringProp)) != 0) { 1998 if ((curVOProp = isAPropertyOf(curVO, VCUniqueStringProp)) != 0) {
1999 char *s = fakeCString(vObjectUStringZValue(curVOProp)); 1999 char *s = fakeCString(vObjectUStringZValue(curVOProp));
2000 QString tmpStr(s); 2000 QString tmpStr(s);
2001 deleteStr(s); 2001 deleteStr(s);
2002 2002
2003 if (cal->event(tmpStr)) { 2003 if (cal->event(tmpStr)) {
2004 goto SKIP; 2004 goto SKIP;
2005 } 2005 }
2006 if (cal->todo(tmpStr)) { 2006 if (cal->todo(tmpStr)) {
2007 goto SKIP; 2007 goto SKIP;
2008 } 2008 }
2009 } 2009 }
2010 2010
2011 if ((!(curVOProp = isAPropertyOf(curVO, VCDTstartProp))) && 2011 if ((!(curVOProp = isAPropertyOf(curVO, VCDTstartProp))) &&
2012 (!(curVOProp = isAPropertyOf(curVO, VCDTendProp)))) { 2012 (!(curVOProp = isAPropertyOf(curVO, VCDTendProp)))) {
2013 kdDebug(5800) << "found a VEvent with no DTSTART and no DTEND! Skipping..." << endl; 2013 kdDebug(5800) << "found a VEvent with no DTSTART and no DTEND! Skipping..." << endl;
2014 goto SKIP; 2014 goto SKIP;
2015 } 2015 }
2016 2016
2017 anEvent = VEventToEvent(curVO); 2017 anEvent = VEventToEvent(curVO);
2018 // we now use addEvent instead of insertEvent so that the 2018 // we now use addEvent instead of insertEvent so that the
2019 // signal/slot get connected. 2019 // signal/slot get connected.
2020 if (anEvent) 2020 if (anEvent)
2021 cal->addEvent(anEvent); 2021 cal->addEvent(anEvent);
2022 else { 2022 else {
2023 // some sort of error must have occurred while in translation. 2023 // some sort of error must have occurred while in translation.
2024 goto SKIP; 2024 goto SKIP;
2025 } 2025 }
2026 } else if (strcmp(vObjectName(curVO), VCTodoProp) == 0) { 2026 } else if (strcmp(vObjectName(curVO), VCTodoProp) == 0) {
2027 anEvent = VTodoToEvent(curVO); 2027 anEvent = VTodoToEvent(curVO);
2028 cal->addTodo(anEvent); 2028 cal->addTodo(anEvent);
2029 } else if ((strcmp(vObjectName(curVO), VCVersionProp) == 0) || 2029 } else if ((strcmp(vObjectName(curVO), VCVersionProp) == 0) ||
2030 (strcmp(vObjectName(curVO), VCProdIdProp) == 0) || 2030 (strcmp(vObjectName(curVO), VCProdIdProp) == 0) ||
2031 (strcmp(vObjectName(curVO), VCTimeZoneProp) == 0)) { 2031 (strcmp(vObjectName(curVO), VCTimeZoneProp) == 0)) {
2032 // do nothing, we know these properties and we want to skip them. 2032 // do nothing, we know these properties and we want to skip them.
2033 // we have either already processed them or are ignoring them. 2033 // we have either already processed them or are ignoring them.
2034 ; 2034 ;
2035 } else { 2035 } else {
2036 ; 2036 ;
2037 } 2037 }
2038 SKIP: 2038 SKIP:
2039 ; 2039 ;
2040 } // while 2040 } // while
2041#endif 2041#endif
2042 2042
2043 // Post-Process list of events with relations, put Event objects in relation 2043 // Post-Process list of events with relations, put Event objects in relation
2044 Event *ev; 2044 Event *ev;
2045 for ( ev=mEventsRelate.first(); ev != 0; ev=mEventsRelate.next() ) { 2045 for ( ev=mEventsRelate.first(); ev != 0; ev=mEventsRelate.next() ) {
2046 Incidence * inc = cal->event(ev->relatedToUid()); 2046 Incidence * inc = cal->event(ev->relatedToUid());
2047 if ( inc ) 2047 if ( inc )
2048 ev->setRelatedTo( inc ); 2048 ev->setRelatedTo( inc );
2049 } 2049 }
2050 Todo *todo; 2050 Todo *todo;
2051 for ( todo=mTodosRelate.first(); todo != 0; todo=mTodosRelate.next() ) { 2051 for ( todo=mTodosRelate.first(); todo != 0; todo=mTodosRelate.next() ) {
2052 Incidence * inc = cal->todo(todo->relatedToUid()); 2052 Incidence * inc = cal->todo(todo->relatedToUid());
2053 if ( inc ) 2053 if ( inc )
2054 todo->setRelatedTo( inc ); 2054 todo->setRelatedTo( inc );
2055 } 2055 }
2056 2056
2057 return true; 2057 return true;
2058} 2058}
2059 2059
diff --git a/libkcal/incidence.cpp b/libkcal/incidence.cpp
index 549014e..39c14f5 100644
--- a/libkcal/incidence.cpp
+++ b/libkcal/incidence.cpp
@@ -1,845 +1,853 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21#include <kglobal.h> 21#include <kglobal.h>
22#include <klocale.h> 22#include <klocale.h>
23#include <kdebug.h> 23#include <kdebug.h>
24 24
25#include "calformat.h" 25#include "calformat.h"
26 26
27#include "incidence.h" 27#include "incidence.h"
28#include "todo.h" 28#include "todo.h"
29 29
30using namespace KCal; 30using namespace KCal;
31 31
32Incidence::Incidence() : 32Incidence::Incidence() :
33 IncidenceBase(), 33 IncidenceBase(),
34 mRelatedTo(0), mSecrecy(SecrecyPublic), mPriority(3) 34 mRelatedTo(0), mSecrecy(SecrecyPublic), mPriority(3)
35{ 35{
36 mRecurrence = 0;//new Recurrence(this); 36 mRecurrence = 0;//new Recurrence(this);
37 mCancelled = false; 37 mCancelled = false;
38 recreate(); 38 recreate();
39 mHasStartDate = true; 39 mHasStartDate = true;
40 mAlarms.setAutoDelete(true); 40 mAlarms.setAutoDelete(true);
41 mAttachments.setAutoDelete(true); 41 mAttachments.setAutoDelete(true);
42 mHasRecurrenceID = false; 42 mHasRecurrenceID = false;
43 mHoliday = false; 43 mHoliday = false;
44 mBirthday = false; 44 mBirthday = false;
45 mAnniversary = false; 45 mAnniversary = false;
46 46
47} 47}
48 48
49Incidence::Incidence( const Incidence &i ) : IncidenceBase( i ) 49Incidence::Incidence( const Incidence &i ) : IncidenceBase( i )
50{ 50{
51// TODO: reenable attributes currently commented out. 51// TODO: reenable attributes currently commented out.
52 mRevision = i.mRevision; 52 mRevision = i.mRevision;
53 mCreated = i.mCreated; 53 mCreated = i.mCreated;
54 mDescription = i.mDescription; 54 mDescription = i.mDescription;
55 mSummary = i.mSummary; 55 mSummary = i.mSummary;
56 mCategories = i.mCategories; 56 mCategories = i.mCategories;
57// Incidence *mRelatedTo; Incidence *mRelatedTo; 57// Incidence *mRelatedTo; Incidence *mRelatedTo;
58 mRelatedTo = 0; 58 mRelatedTo = 0;
59 mRelatedToUid = i.mRelatedToUid; 59 mRelatedToUid = i.mRelatedToUid;
60// QPtrList<Incidence> mRelations; QPtrList<Incidence> mRelations; 60// QPtrList<Incidence> mRelations; QPtrList<Incidence> mRelations;
61 mExDates = i.mExDates; 61 mExDates = i.mExDates;
62 mAttachments = i.mAttachments; 62 QPtrListIterator<Attachment> itat( i.mAttachments );
63 Attachment *at;
64 while( (at = itat.current()) ) {
65 Attachment *a = new Attachment( *at );
66 mAttachments.append( a );
67 ++itat;
68 }
69 mAttachments.setAutoDelete( true );
63 mResources = i.mResources; 70 mResources = i.mResources;
64 mSecrecy = i.mSecrecy; 71 mSecrecy = i.mSecrecy;
65 mPriority = i.mPriority; 72 mPriority = i.mPriority;
66 mLocation = i.mLocation; 73 mLocation = i.mLocation;
67 mCancelled = i.mCancelled; 74 mCancelled = i.mCancelled;
68 mHasStartDate = i.mHasStartDate; 75 mHasStartDate = i.mHasStartDate;
69 QPtrListIterator<Alarm> it( i.mAlarms ); 76 QPtrListIterator<Alarm> it( i.mAlarms );
70 const Alarm *a; 77 const Alarm *a;
71 while( (a = it.current()) ) { 78 while( (a = it.current()) ) {
72 Alarm *b = new Alarm( *a ); 79 Alarm *b = new Alarm( *a );
73 b->setParent( this ); 80 b->setParent( this );
74 mAlarms.append( b ); 81 mAlarms.append( b );
75 82
76 ++it; 83 ++it;
77 } 84 }
78 mAlarms.setAutoDelete(true); 85 mAlarms.setAutoDelete(true);
79 mHasRecurrenceID = i.mHasRecurrenceID; 86 mHasRecurrenceID = i.mHasRecurrenceID;
80 mRecurrenceID = i.mRecurrenceID; 87 mRecurrenceID = i.mRecurrenceID;
81 if ( i.mRecurrence ) 88 if ( i.mRecurrence )
82 mRecurrence = new Recurrence( *(i.mRecurrence), this ); 89 mRecurrence = new Recurrence( *(i.mRecurrence), this );
83 else 90 else
84 mRecurrence = 0; 91 mRecurrence = 0;
85 mHoliday = i.mHoliday ; 92 mHoliday = i.mHoliday ;
86 mBirthday = i.mBirthday; 93 mBirthday = i.mBirthday;
87 mAnniversary = i.mAnniversary; 94 mAnniversary = i.mAnniversary;
88} 95}
89 96
90Incidence::~Incidence() 97Incidence::~Incidence()
91{ 98{
92 99
93 Incidence *ev; 100 Incidence *ev;
94 QPtrList<Incidence> Relations = relations(); 101 QPtrList<Incidence> Relations = relations();
95 for (ev=Relations.first();ev;ev=Relations.next()) { 102 for (ev=Relations.first();ev;ev=Relations.next()) {
96 if (ev->relatedTo() == this) ev->setRelatedTo(0); 103 if (ev->relatedTo() == this) ev->setRelatedTo(0);
97 } 104 }
98 if (relatedTo()) relatedTo()->removeRelation(this); 105 if (relatedTo()) relatedTo()->removeRelation(this);
99 if ( mRecurrence ) 106 if ( mRecurrence )
100 delete mRecurrence; 107 delete mRecurrence;
101 108
102} 109}
103QString Incidence::durationText() 110QString Incidence::durationText()
104{ 111{
105 return "---"; 112 return "---";
106} 113}
107QString Incidence::durationText4Time( int offset ) 114QString Incidence::durationText4Time( int offset )
108{ 115{
109 int min = offset/60; 116 int min = offset/60;
110 int hours = min /60; 117 int hours = min /60;
111 min = min % 60; 118 min = min % 60;
112 int days = hours /24; 119 int days = hours /24;
113 hours = hours % 24; 120 hours = hours % 24;
114 121
115 if ( doesFloat() || ( min == 0 && hours == 0 ) ) { 122 if ( doesFloat() || ( min == 0 && hours == 0 ) ) {
116 if ( days == 1 ) 123 if ( days == 1 )
117 return "1" + i18n(" day"); 124 return "1" + i18n(" day");
118 else 125 else
119 return QString::number( days )+ i18n(" days"); 126 return QString::number( days )+ i18n(" days");
120 127
121 } 128 }
122 QString message = QString::number ( hours ) +":"; 129 QString message = QString::number ( hours ) +":";
123 if ( min < 10 ) message += "0"; 130 if ( min < 10 ) message += "0";
124 message += QString::number ( min ); 131 message += QString::number ( min );
125 if ( days > 0 ) { 132 if ( days > 0 ) {
126 if ( days == 1 ) 133 if ( days == 1 )
127 message = "1" + i18n(" day") + " "+message; 134 message = "1" + i18n(" day") + " "+message;
128 else 135 else
129 message = QString::number( days )+ i18n(" days") + " "+message; 136 message = QString::number( days )+ i18n(" days") + " "+message;
130 } 137 }
131 return message; 138 return message;
132} 139}
133bool Incidence::isHoliday() const 140bool Incidence::isHoliday() const
134{ 141{
135 return mHoliday; 142 return mHoliday;
136} 143}
137bool Incidence::isBirthday() const 144bool Incidence::isBirthday() const
138{ 145{
139 146
140 return mBirthday ; 147 return mBirthday ;
141} 148}
142bool Incidence::isAnniversary() const 149bool Incidence::isAnniversary() const
143{ 150{
144 return mAnniversary ; 151 return mAnniversary ;
145 152
146} 153}
147 154
148bool Incidence::hasRecurrenceID() const 155bool Incidence::hasRecurrenceID() const
149{ 156{
150 return mHasRecurrenceID; 157 return mHasRecurrenceID;
151} 158}
152 159
153void Incidence::setHasRecurrenceID( bool b ) 160void Incidence::setHasRecurrenceID( bool b )
154{ 161{
155 mHasRecurrenceID = b; 162 mHasRecurrenceID = b;
156} 163}
157 164
158void Incidence::setRecurrenceID(QDateTime d) 165void Incidence::setRecurrenceID(QDateTime d)
159{ 166{
160 mRecurrenceID = d; 167 mRecurrenceID = d;
161 mHasRecurrenceID = true; 168 mHasRecurrenceID = true;
162 updated(); 169 updated();
163} 170}
164QDateTime Incidence::recurrenceID () const 171QDateTime Incidence::recurrenceID () const
165{ 172{
166 return mRecurrenceID; 173 return mRecurrenceID;
167} 174}
168 175
169bool Incidence::cancelled() const 176bool Incidence::cancelled() const
170{ 177{
171 return mCancelled; 178 return mCancelled;
172} 179}
173void Incidence::setCancelled( bool b ) 180void Incidence::setCancelled( bool b )
174{ 181{
175 mCancelled = b; 182 mCancelled = b;
176 updated(); 183 updated();
177} 184}
178bool Incidence::hasStartDate() const 185bool Incidence::hasStartDate() const
179{ 186{
180 return mHasStartDate; 187 return mHasStartDate;
181} 188}
182 189
183void Incidence::setHasStartDate(bool f) 190void Incidence::setHasStartDate(bool f)
184{ 191{
185 if (mReadOnly) return; 192 if (mReadOnly) return;
186 mHasStartDate = f; 193 mHasStartDate = f;
187 updated(); 194 updated();
188} 195}
189 196
190// A string comparison that considers that null and empty are the same 197// A string comparison that considers that null and empty are the same
191static bool stringCompare( const QString& s1, const QString& s2 ) 198static bool stringCompare( const QString& s1, const QString& s2 )
192{ 199{
193 if ( s1.isEmpty() && s2.isEmpty() ) 200 if ( s1.isEmpty() && s2.isEmpty() )
194 return true; 201 return true;
195 return s1 == s2; 202 return s1 == s2;
196} 203}
197 204
198bool KCal::operator==( const Incidence& i1, const Incidence& i2 ) 205bool KCal::operator==( const Incidence& i1, const Incidence& i2 )
199{ 206{
200 207
201 if( i1.alarms().count() != i2.alarms().count() ) { 208 if( i1.alarms().count() != i2.alarms().count() ) {
202 return false; // no need to check further 209 return false; // no need to check further
203 } 210 }
204 if ( i1.alarms().count() > 0 ) { 211 if ( i1.alarms().count() > 0 ) {
205 if ( !( *(i1.alarms().first()) == *(i2.alarms().first())) ) 212 if ( !( *(i1.alarms().first()) == *(i2.alarms().first())) )
206 { 213 {
207 qDebug("alarm not equal "); 214 qDebug("alarm not equal ");
208 return false; 215 return false;
209 } 216 }
210 } 217 }
211#if 0 218#if 0
212 QPtrListIterator<Alarm> a1( i1.alarms() ); 219 QPtrListIterator<Alarm> a1( i1.alarms() );
213 QPtrListIterator<Alarm> a2( i2.alarms() ); 220 QPtrListIterator<Alarm> a2( i2.alarms() );
214 for( ; a1.current() && a2.current(); ++a1, ++a2 ) { 221 for( ; a1.current() && a2.current(); ++a1, ++a2 ) {
215 if( *a1.current() == *a2.current() ) { 222 if( *a1.current() == *a2.current() ) {
216 continue; 223 continue;
217 } 224 }
218 else { 225 else {
219 return false; 226 return false;
220 } 227 }
221 } 228 }
222#endif 229#endif
223 230
224 if ( i1.hasRecurrenceID() == i2.hasRecurrenceID() ) { 231 if ( i1.hasRecurrenceID() == i2.hasRecurrenceID() ) {
225 if ( i1.hasRecurrenceID() ) { 232 if ( i1.hasRecurrenceID() ) {
226 if ( i1.recurrenceID() != i2.recurrenceID() ) 233 if ( i1.recurrenceID() != i2.recurrenceID() )
227 return false; 234 return false;
228 } 235 }
229 236
230 } else { 237 } else {
231 return false; 238 return false;
232 } 239 }
233 240
234 if ( ! operator==( (const IncidenceBase&)i1, (const IncidenceBase&)i2 ) ) 241 if ( ! operator==( (const IncidenceBase&)i1, (const IncidenceBase&)i2 ) )
235 return false; 242 return false;
236 if ( i1.hasStartDate() == i2.hasStartDate() ) { 243 if ( i1.hasStartDate() == i2.hasStartDate() ) {
237 if ( i1.hasStartDate() ) { 244 if ( i1.hasStartDate() ) {
238 if ( i1.dtStart() != i2.dtStart() ) 245 if ( i1.dtStart() != i2.dtStart() )
239 return false; 246 return false;
240 } 247 }
241 } else { 248 } else {
242 return false; 249 return false;
243 } 250 }
244 if ( i1.mRecurrence != 0 && i2.mRecurrence != 0 ) { 251 if ( i1.mRecurrence != 0 && i2.mRecurrence != 0 ) {
245 if (!( *i1.mRecurrence == *i2.mRecurrence) ) { 252 if (!( *i1.mRecurrence == *i2.mRecurrence) ) {
246 //qDebug("recurrence is NOT equal "); 253 //qDebug("recurrence is NOT equal ");
247 return false; 254 return false;
248 } 255 }
249 } else { 256 } else {
250 // one ( or both ) recurrence is 0 257 // one ( or both ) recurrence is 0
251 if ( i1.mRecurrence == 0 ) { 258 if ( i1.mRecurrence == 0 ) {
252 if ( i2.mRecurrence != 0 && i2.mRecurrence->doesRecur() != Recurrence::rNone ) 259 if ( i2.mRecurrence != 0 && i2.mRecurrence->doesRecur() != Recurrence::rNone )
253 return false; 260 return false;
254 } else { 261 } else {
255 // i1.mRecurrence != 0 262 // i1.mRecurrence != 0
256 // i2.mRecurrence == 0 263 // i2.mRecurrence == 0
257 if ( i1.mRecurrence->doesRecur() != Recurrence::rNone ) 264 if ( i1.mRecurrence->doesRecur() != Recurrence::rNone )
258 return false; 265 return false;
259 } 266 }
260 } 267 }
261 268
262 return 269 return
263 // i1.created() == i2.created() && 270 // i1.created() == i2.created() &&
264 stringCompare( i1.description(), i2.description() ) && 271 stringCompare( i1.description(), i2.description() ) &&
265 stringCompare( i1.summary(), i2.summary() ) && 272 stringCompare( i1.summary(), i2.summary() ) &&
266 i1.categories() == i2.categories() && 273 i1.categories() == i2.categories() &&
267 // no need to compare mRelatedTo 274 // no need to compare mRelatedTo
268 stringCompare( i1.relatedToUid(), i2.relatedToUid() ) && 275 stringCompare( i1.relatedToUid(), i2.relatedToUid() ) &&
269 // i1.relations() == i2.relations() && 276 // i1.relations() == i2.relations() &&
270 i1.exDates() == i2.exDates() && 277 i1.exDates() == i2.exDates() &&
271 i1.attachments() == i2.attachments() && 278 i1.attachments() == i2.attachments() &&
272 i1.resources() == i2.resources() && 279 i1.resources() == i2.resources() &&
273 i1.secrecy() == i2.secrecy() && 280 i1.secrecy() == i2.secrecy() &&
274 i1.priority() == i2.priority() && 281 i1.priority() == i2.priority() &&
275 i1.cancelled() == i2.cancelled() && 282 i1.cancelled() == i2.cancelled() &&
276 stringCompare( i1.location(), i2.location() ); 283 stringCompare( i1.location(), i2.location() );
277} 284}
278 285
279Incidence* Incidence::recreateCloneException( QDate d ) 286Incidence* Incidence::recreateCloneException( QDate d )
280{ 287{
281 Incidence* newInc = clone(); 288 Incidence* newInc = clone();
282 newInc->recreate(); 289 newInc->recreate();
283 if ( doesRecur() ) { 290 if ( doesRecur() ) {
284 addExDate( d ); 291 addExDate( d );
285 newInc->recurrence()->unsetRecurs(); 292 newInc->recurrence()->unsetRecurs();
286 if ( typeID() == eventID ) { 293 if ( typeID() == eventID ) {
287 int len = dtStart().secsTo( ((Event*)this)->dtEnd()); 294 int len = dtStart().secsTo( ((Event*)this)->dtEnd());
288 QTime tim = dtStart().time(); 295 QTime tim = dtStart().time();
289 newInc->setDtStart( QDateTime(d, tim) ); 296 newInc->setDtStart( QDateTime(d, tim) );
290 ((Event*)newInc)->setDtEnd( newInc->dtStart().addSecs( len ) ); 297 ((Event*)newInc)->setDtEnd( newInc->dtStart().addSecs( len ) );
291 } else { 298 } else {
292 int len = dtStart().secsTo( ((Todo*)this)->dtDue()); 299 int len = dtStart().secsTo( ((Todo*)this)->dtDue());
293 QTime tim = ((Todo*)this)->dtDue().time(); 300 QTime tim = ((Todo*)this)->dtDue().time();
294 ((Todo*)newInc)->setDtDue( QDateTime(d, tim) ); 301 ((Todo*)newInc)->setDtDue( QDateTime(d, tim) );
295 ((Todo*)newInc)->setDtStart( ((Todo*)newInc)->dtDue().addSecs( -len ) ); 302 ((Todo*)newInc)->setDtStart( ((Todo*)newInc)->dtDue().addSecs( -len ) );
296 ((Todo*)this)->setRecurDates(); 303 ((Todo*)this)->setRecurDates();
297 } 304 }
298 newInc->setExDates( DateList () ); 305 newInc->setExDates( DateList () );
299 } 306 }
300 return newInc; 307 return newInc;
301} 308}
302 309
303void Incidence::recreate() 310void Incidence::recreate()
304{ 311{
305 setCreated(QDateTime::currentDateTime()); 312 setCreated(QDateTime::currentDateTime());
306 313
307 setUid(CalFormat::createUniqueId()); 314 setUid(CalFormat::createUniqueId());
308 315
309 setRevision(0); 316 setRevision(0);
310 setIDStr( ":" ); 317 setIDStr( ":" );
311 setLastModified(QDateTime::currentDateTime()); 318 setLastModified(QDateTime::currentDateTime());
312} 319}
313void Incidence::cloneRelations( Incidence * newInc ) 320void Incidence::cloneRelations( Incidence * newInc )
314{ 321{
315 // newInc is already a clone of this incidence 322 // newInc is already a clone of this incidence
316 Incidence * inc; 323 Incidence * inc;
317 Incidence * cloneInc; 324 Incidence * cloneInc;
318 QPtrList<Incidence> Relations = relations(); 325 QPtrList<Incidence> Relations = relations();
319 for (inc=Relations.first();inc;inc=Relations.next()) { 326 for (inc=Relations.first();inc;inc=Relations.next()) {
320 cloneInc = inc->clone(); 327 cloneInc = inc->clone();
321 cloneInc->recreate(); 328 cloneInc->recreate();
322 cloneInc->setRelatedTo( newInc ); 329 cloneInc->setRelatedTo( newInc );
323 inc->cloneRelations( cloneInc ); 330 inc->cloneRelations( cloneInc );
324 } 331 }
325} 332}
326void Incidence::setReadOnly( bool readOnly ) 333void Incidence::setReadOnly( bool readOnly )
327{ 334{
328 IncidenceBase::setReadOnly( readOnly ); 335 IncidenceBase::setReadOnly( readOnly );
329 if ( mRecurrence ) 336 if ( mRecurrence )
330 mRecurrence->setRecurReadOnly( readOnly); 337 mRecurrence->setRecurReadOnly( readOnly);
331} 338}
332void Incidence::setLastModifiedSubInvalid() 339void Incidence::setLastModifiedSubInvalid()
333{ 340{
334 mLastModifiedSub = QDateTime(); 341 mLastModifiedSub = QDateTime();
335 if ( mRelatedTo ) 342 if ( mRelatedTo )
336 mRelatedTo->setLastModifiedSubInvalid(); 343 mRelatedTo->setLastModifiedSubInvalid();
337} 344}
338QDateTime Incidence::lastModifiedSub() 345QDateTime Incidence::lastModifiedSub()
339{ 346{
340 if ( !mRelations.count() ) 347 if ( !mRelations.count() )
341 return lastModified(); 348 return lastModified();
342 if ( mLastModifiedSub.isValid() ) 349 if ( mLastModifiedSub.isValid() )
343 return mLastModifiedSub; 350 return mLastModifiedSub;
344 mLastModifiedSub = lastModified(); 351 mLastModifiedSub = lastModified();
345 Incidence * inc; 352 Incidence * inc;
346 QPtrList<Incidence> Relations = relations(); 353 QPtrList<Incidence> Relations = relations();
347 for (inc=Relations.first();inc;inc=Relations.next()) { 354 for (inc=Relations.first();inc;inc=Relations.next()) {
348 if ( inc->lastModifiedSub() > mLastModifiedSub ) 355 if ( inc->lastModifiedSub() > mLastModifiedSub )
349 mLastModifiedSub = inc->lastModifiedSub(); 356 mLastModifiedSub = inc->lastModifiedSub();
350 } 357 }
351 return mLastModifiedSub; 358 return mLastModifiedSub;
352} 359}
353void Incidence::setCreated(QDateTime created) 360void Incidence::setCreated(QDateTime created)
354{ 361{
355 if (mReadOnly) return; 362 if (mReadOnly) return;
356 mCreated = getEvenTime(created); 363 mCreated = getEvenTime(created);
357} 364}
358 365
359QDateTime Incidence::created() const 366QDateTime Incidence::created() const
360{ 367{
361 return mCreated; 368 return mCreated;
362} 369}
363 370
364void Incidence::setRevision(int rev) 371void Incidence::setRevision(int rev)
365{ 372{
366 if (mReadOnly) return; 373 if (mReadOnly) return;
367 mRevision = rev; 374 mRevision = rev;
368 375
369 updated(); 376 updated();
370} 377}
371 378
372int Incidence::revision() const 379int Incidence::revision() const
373{ 380{
374 return mRevision; 381 return mRevision;
375} 382}
376 383
377void Incidence::setDtStart(const QDateTime &dtStart) 384void Incidence::setDtStart(const QDateTime &dtStart)
378{ 385{
379 386
380 QDateTime dt = getEvenTime(dtStart); 387 QDateTime dt = getEvenTime(dtStart);
381 388
382 if ( mRecurrence ) 389 if ( mRecurrence )
383 mRecurrence->setRecurStart( dt); 390 mRecurrence->setRecurStart( dt);
384 IncidenceBase::setDtStart( dt ); 391 IncidenceBase::setDtStart( dt );
385} 392}
386 393
387void Incidence::setDescription(const QString &description) 394void Incidence::setDescription(const QString &description)
388{ 395{
389 if (mReadOnly) return; 396 if (mReadOnly) return;
390 mDescription = description; 397 mDescription = description;
391 updated(); 398 updated();
392} 399}
393 400
394QString Incidence::description() const 401QString Incidence::description() const
395{ 402{
396 return mDescription; 403 return mDescription;
397} 404}
398 405
399 406
400void Incidence::setSummary(const QString &summary) 407void Incidence::setSummary(const QString &summary)
401{ 408{
402 if (mReadOnly) return; 409 if (mReadOnly) return;
403 mSummary = summary; 410 mSummary = summary;
404 updated(); 411 updated();
405} 412}
406 413
407QString Incidence::summary() const 414QString Incidence::summary() const
408{ 415{
409 return mSummary; 416 return mSummary;
410} 417}
411void Incidence::checkCategories() 418void Incidence::checkCategories()
412{ 419{
413 mHoliday = mCategories.contains("Holiday") || mCategories.contains(i18n("Holiday")); 420 mHoliday = mCategories.contains("Holiday") || mCategories.contains(i18n("Holiday"));
414 mBirthday = mCategories.contains("Birthday") || mCategories.contains(i18n("Birthday")); 421 mBirthday = mCategories.contains("Birthday") || mCategories.contains(i18n("Birthday"));
415 mAnniversary = mCategories.contains("Anniversary") || mCategories.contains(i18n("Anniversary")); 422 mAnniversary = mCategories.contains("Anniversary") || mCategories.contains(i18n("Anniversary"));
416} 423}
417 424
418void Incidence::addCategories(const QStringList &categories, bool addToRelations ) //addToRelations = false 425void Incidence::addCategories(const QStringList &categories, bool addToRelations ) //addToRelations = false
419{ 426{
420 if (mReadOnly) return; 427 if (mReadOnly) return;
421 int i; 428 int i;
422 for( i = 0; i < categories.count(); ++i ) { 429 for( i = 0; i < categories.count(); ++i ) {
423 if ( !mCategories.contains (categories[i])) 430 if ( !mCategories.contains (categories[i]))
424 mCategories.append( categories[i] ); 431 mCategories.append( categories[i] );
425 } 432 }
426 checkCategories(); 433 checkCategories();
427 updated(); 434 updated();
428 if ( addToRelations ) { 435 if ( addToRelations ) {
429 Incidence * inc; 436 Incidence * inc;
430 QPtrList<Incidence> Relations = relations(); 437 QPtrList<Incidence> Relations = relations();
431 for (inc=Relations.first();inc;inc=Relations.next()) { 438 for (inc=Relations.first();inc;inc=Relations.next()) {
432 inc->addCategories( categories, true ); 439 inc->addCategories( categories, true );
433 } 440 }
434 } 441 }
435} 442}
436 443
437void Incidence::setCategories(const QStringList &categories, bool setForRelations ) //setForRelations = false 444void Incidence::setCategories(const QStringList &categories, bool setForRelations ) //setForRelations = false
438{ 445{
439 if (mReadOnly) return; 446 if (mReadOnly) return;
440 mCategories = categories; 447 mCategories = categories;
441 checkCategories(); 448 checkCategories();
442 updated(); 449 updated();
443 if ( setForRelations ) { 450 if ( setForRelations ) {
444 Incidence * inc; 451 Incidence * inc;
445 QPtrList<Incidence> Relations = relations(); 452 QPtrList<Incidence> Relations = relations();
446 for (inc=Relations.first();inc;inc=Relations.next()) { 453 for (inc=Relations.first();inc;inc=Relations.next()) {
447 inc->setCategories( categories, true ); 454 inc->setCategories( categories, true );
448 } 455 }
449 } 456 }
450} 457}
451 458
452// TODO: remove setCategories(QString) function 459// TODO: remove setCategories(QString) function
453void Incidence::setCategories(const QString &catStr) 460void Incidence::setCategories(const QString &catStr)
454{ 461{
455 if (mReadOnly) return; 462 if (mReadOnly) return;
456 mCategories.clear(); 463 mCategories.clear();
457 464
458 if (catStr.isEmpty()) return; 465 if (catStr.isEmpty()) return;
459 466
460 mCategories = QStringList::split(",",catStr); 467 mCategories = QStringList::split(",",catStr);
461 468
462 QStringList::Iterator it; 469 QStringList::Iterator it;
463 for(it = mCategories.begin();it != mCategories.end(); ++it) { 470 for(it = mCategories.begin();it != mCategories.end(); ++it) {
464 *it = (*it).stripWhiteSpace(); 471 *it = (*it).stripWhiteSpace();
465 } 472 }
466 checkCategories(); 473 checkCategories();
467 updated(); 474 updated();
468} 475}
469// using this makes filtering 3 times faster 476// using this makes filtering 3 times faster
470QStringList* Incidence::categoriesP() 477QStringList* Incidence::categoriesP()
471{ 478{
472 return &mCategories; 479 return &mCategories;
473} 480}
474 481
475QStringList Incidence::categories() const 482QStringList Incidence::categories() const
476{ 483{
477 return mCategories; 484 return mCategories;
478} 485}
479 486
480QString Incidence::categoriesStr() 487QString Incidence::categoriesStr()
481{ 488{
482 return mCategories.join(","); 489 return mCategories.join(",");
483} 490}
484QString Incidence::categoriesStrWithSpace() 491QString Incidence::categoriesStrWithSpace()
485{ 492{
486 return mCategories.join(", "); 493 return mCategories.join(", ");
487} 494}
488 495
489void Incidence::setRelatedToUid(const QString &relatedToUid) 496void Incidence::setRelatedToUid(const QString &relatedToUid)
490{ 497{
491 if (mReadOnly) return; 498 if (mReadOnly) return;
492 mRelatedToUid = relatedToUid; 499 mRelatedToUid = relatedToUid;
493} 500}
494void Incidence::clearRelations() 501void Incidence::clearRelations()
495{ 502{
496 mRelatedTo = 0; 503 mRelatedTo = 0;
497 mRelations.clear(); 504 mRelations.clear();
498} 505}
499QString Incidence::relatedToUid() const 506QString Incidence::relatedToUid() const
500{ 507{
501 return mRelatedToUid; 508 return mRelatedToUid;
502} 509}
503 510
504void Incidence::setRelatedTo(Incidence *relatedTo) 511void Incidence::setRelatedTo(Incidence *relatedTo)
505{ 512{
506 //qDebug("Incidence::setRelatedTo %d ", relatedTo); 513 //qDebug("Incidence::setRelatedTo %d ", relatedTo);
507 //qDebug("setRelatedTo(Incidence *relatedTo) %s %s", summary().latin1(), relatedTo->summary().latin1() ); 514 //qDebug("setRelatedTo(Incidence *relatedTo) %s %s", summary().latin1(), relatedTo->summary().latin1() );
508 if (mReadOnly || mRelatedTo == relatedTo) return; 515 if (mReadOnly || mRelatedTo == relatedTo) return;
509 if(mRelatedTo) { 516 if(mRelatedTo) {
510 // updated(); 517 // updated();
511 mRelatedTo->removeRelation(this); 518 mRelatedTo->removeRelation(this);
512 } 519 }
513 mRelatedTo = relatedTo; 520 mRelatedTo = relatedTo;
514 if (mRelatedTo) { 521 if (mRelatedTo) {
515 mRelatedTo->addRelation(this); 522 mRelatedTo->addRelation(this);
516 mRelatedToUid = mRelatedTo->uid(); 523 mRelatedToUid = mRelatedTo->uid();
517 } else { 524 } else {
518 mRelatedToUid = ""; 525 mRelatedToUid = "";
519 } 526 }
520} 527}
521 528
522Incidence *Incidence::relatedTo() const 529Incidence *Incidence::relatedTo() const
523{ 530{
524 return mRelatedTo; 531 return mRelatedTo;
525} 532}
526 533
527QPtrList<Incidence> Incidence::relations() const 534QPtrList<Incidence> Incidence::relations() const
528{ 535{
529 return mRelations; 536 return mRelations;
530} 537}
531 538
532void Incidence::addRelationsToList(QPtrList<Incidence> *rel) 539void Incidence::addRelationsToList(QPtrList<Incidence> *rel)
533{ 540{
534 Incidence* inc; 541 Incidence* inc;
535 QPtrList<Incidence> Relations = relations(); 542 QPtrList<Incidence> Relations = relations();
536 for (inc=Relations.first();inc;inc=Relations.next()) { 543 for (inc=Relations.first();inc;inc=Relations.next()) {
537 inc->addRelationsToList( rel ); 544 inc->addRelationsToList( rel );
538 } 545 }
539 if ( rel->findRef( this ) == -1 ) 546 if ( rel->findRef( this ) == -1 )
540 rel->append( this ); 547 rel->append( this );
541} 548}
542 549
543void Incidence::addRelation(Incidence *event) 550void Incidence::addRelation(Incidence *event)
544{ 551{
545 setLastModifiedSubInvalid(); 552 setLastModifiedSubInvalid();
546 if( mRelations.findRef( event ) == -1 ) { 553 if( mRelations.findRef( event ) == -1 ) {
547 mRelations.append(event); 554 mRelations.append(event);
548 //updated(); 555 //updated();
549 } 556 }
550} 557}
551 558
552void Incidence::removeRelation(Incidence *event) 559void Incidence::removeRelation(Incidence *event)
553{ 560{
554 setLastModifiedSubInvalid(); 561 setLastModifiedSubInvalid();
555 mRelations.removeRef(event); 562 mRelations.removeRef(event);
556// if (event->getRelatedTo() == this) event->setRelatedTo(0); 563// if (event->getRelatedTo() == this) event->setRelatedTo(0);
557} 564}
558 565
559bool Incidence::recursOn(const QDate &qd) const 566bool Incidence::recursOn(const QDate &qd) const
560{ 567{
561 if (mRecurrence && mRecurrence->recursOnPure(qd) && !isException(qd)) return true; 568 if (mRecurrence && mRecurrence->recursOnPure(qd) && !isException(qd)) return true;
562 else return false; 569 else return false;
563} 570}
564 571
565void Incidence::setExDates(const DateList &exDates) 572void Incidence::setExDates(const DateList &exDates)
566{ 573{
567 if (mReadOnly) return; 574 if (mReadOnly) return;
568 mExDates = exDates; 575 mExDates = exDates;
569 recurrence()->setRecurExDatesCount(mExDates.count()); 576 recurrence()->setRecurExDatesCount(mExDates.count());
570 577
571 updated(); 578 updated();
572} 579}
573 580
574void Incidence::addExDate(const QDate &date) 581void Incidence::addExDate(const QDate &date)
575{ 582{
576 if (mReadOnly) return; 583 if (mReadOnly) return;
577 mExDates.append(date); 584 mExDates.append(date);
578 585
579 recurrence()->setRecurExDatesCount(mExDates.count()); 586 recurrence()->setRecurExDatesCount(mExDates.count());
580 587
581 updated(); 588 updated();
582} 589}
583 590
584DateList Incidence::exDates() const 591DateList Incidence::exDates() const
585{ 592{
586 return mExDates; 593 return mExDates;
587} 594}
588 595
589bool Incidence::isException(const QDate &date) const 596bool Incidence::isException(const QDate &date) const
590{ 597{
591 DateList::ConstIterator it; 598 DateList::ConstIterator it;
592 for( it = mExDates.begin(); it != mExDates.end(); ++it ) { 599 for( it = mExDates.begin(); it != mExDates.end(); ++it ) {
593 if ( (*it) == date ) { 600 if ( (*it) == date ) {
594 return true; 601 return true;
595 } 602 }
596 } 603 }
597 604
598 return false; 605 return false;
599} 606}
600 607
601void Incidence::addAttachment(Attachment *attachment) 608void Incidence::addAttachment(Attachment *attachment)
602{ 609{
603 if (mReadOnly || !attachment) return; 610 if (mReadOnly || !attachment) return;
604 mAttachments.append(attachment); 611 mAttachments.append(attachment);
605 updated(); 612 updated();
606} 613}
607 614
608void Incidence::deleteAttachment(Attachment *attachment) 615void Incidence::deleteAttachment(Attachment *attachment)
609{ 616{
610 mAttachments.removeRef(attachment); 617 mAttachments.removeRef(attachment);
611} 618}
612 619
613void Incidence::deleteAttachments(const QString& mime) 620void Incidence::deleteAttachments(const QString& mime)
614{ 621{
615 Attachment *at = mAttachments.first(); 622 Attachment *at = mAttachments.first();
616 while (at) { 623 while (at) {
617 if (at->mimeType() == mime) 624 if (at->mimeType() == mime)
618 mAttachments.remove(); 625 mAttachments.remove();
619 else 626 else
620 at = mAttachments.next(); 627 at = mAttachments.next();
621 } 628 }
622} 629}
623 630
624QPtrList<Attachment> Incidence::attachments() const 631QPtrList<Attachment> Incidence::attachments() const
625{ 632{
626 return mAttachments; 633 return mAttachments;
627} 634}
628 635
629QPtrList<Attachment> Incidence::attachments(const QString& mime) const 636QPtrList<Attachment> Incidence::attachments(const QString& mime) const
630{ 637{
631 QPtrList<Attachment> attachments; 638 QPtrList<Attachment> attachments;
632 QPtrListIterator<Attachment> it( mAttachments ); 639 QPtrListIterator<Attachment> it( mAttachments );
633 Attachment *at; 640 Attachment *at;
634 while ( (at = it.current()) ) { 641 while ( (at = it.current()) ) {
635 if (at->mimeType() == mime) 642 if (at->mimeType() == mime)
636 attachments.append(at); 643 attachments.append(at);
637 ++it; 644 ++it;
638 } 645 }
639 646
640 return attachments; 647 return attachments;
641} 648}
642 649
643void Incidence::setResources(const QStringList &resources) 650void Incidence::setResources(const QStringList &resources)
644{ 651{
645 if (mReadOnly) return; 652 if (mReadOnly) return;
646 mResources = resources; 653 mResources = resources;
647 updated(); 654 updated();
648} 655}
649 656
650QStringList Incidence::resources() const 657QStringList Incidence::resources() const
651{ 658{
652 return mResources; 659 return mResources;
653} 660}
654 661
655 662
656void Incidence::setPriority(int priority) 663void Incidence::setPriority(int priority)
657{ 664{
658 if (mReadOnly) return; 665 if (mReadOnly) return;
659 mPriority = priority; 666 mPriority = priority;
660 updated(); 667 updated();
661} 668}
662 669
663int Incidence::priority() const 670int Incidence::priority() const
664{ 671{
665 return mPriority; 672 return mPriority;
666} 673}
667 674
668void Incidence::setSecrecy(int sec) 675void Incidence::setSecrecy(int sec)
669{ 676{
670 if (mReadOnly) return; 677 if (mReadOnly) return;
671 mSecrecy = sec; 678 mSecrecy = sec;
672 updated(); 679 updated();
673} 680}
674 681
675int Incidence::secrecy() const 682int Incidence::secrecy() const
676{ 683{
677 return mSecrecy; 684 return mSecrecy;
678} 685}
679 686
680QString Incidence::secrecyStr() const 687QString Incidence::secrecyStr() const
681{ 688{
682 return secrecyName(mSecrecy); 689 return secrecyName(mSecrecy);
683} 690}
684 691
685QString Incidence::secrecyName(int secrecy) 692QString Incidence::secrecyName(int secrecy)
686{ 693{
687 switch (secrecy) { 694 switch (secrecy) {
688 case SecrecyPublic: 695 case SecrecyPublic:
689 return i18n("Public"); 696 return i18n("Public");
690 break; 697 break;
691 case SecrecyPrivate: 698 case SecrecyPrivate:
692 return i18n("Private"); 699 return i18n("Private");
693 break; 700 break;
694 case SecrecyConfidential: 701 case SecrecyConfidential:
695 return i18n("Confidential"); 702 return i18n("Confidential");
696 break; 703 break;
697 default: 704 default:
698 return i18n("Undefined"); 705 return i18n("Undefined");
699 break; 706 break;
700 } 707 }
701} 708}
702 709
703QStringList Incidence::secrecyList() 710QStringList Incidence::secrecyList()
704{ 711{
705 QStringList list; 712 QStringList list;
706 list << secrecyName(SecrecyPublic); 713 list << secrecyName(SecrecyPublic);
707 list << secrecyName(SecrecyPrivate); 714 list << secrecyName(SecrecyPrivate);
708 list << secrecyName(SecrecyConfidential); 715 list << secrecyName(SecrecyConfidential);
709 716
710 return list; 717 return list;
711} 718}
712 719
713 720
714QPtrList<Alarm> Incidence::alarms() const 721QPtrList<Alarm> Incidence::alarms() const
715{ 722{
716 return mAlarms; 723 return mAlarms;
717} 724}
718 725
719Alarm* Incidence::newAlarm() 726Alarm* Incidence::newAlarm()
720{ 727{
721 Alarm* alarm = new Alarm(this); 728 Alarm* alarm = new Alarm(this);
722 mAlarms.append(alarm); 729 mAlarms.append(alarm);
723// updated(); 730// updated();
724 return alarm; 731 return alarm;
725} 732}
726 733
727void Incidence::addAlarm(Alarm *alarm) 734void Incidence::addAlarm(Alarm *alarm)
728{ 735{
729 mAlarms.append(alarm); 736 mAlarms.append(alarm);
730 updated(); 737 updated();
731} 738}
732 739
733void Incidence::removeAlarm(Alarm *alarm) 740void Incidence::removeAlarm(Alarm *alarm)
734{ 741{
735 mAlarms.removeRef(alarm); 742 mAlarms.removeRef(alarm);
736 updated(); 743 updated();
737} 744}
738 745
739void Incidence::clearAlarms() 746void Incidence::clearAlarms()
740{ 747{
741 mAlarms.clear(); 748 mAlarms.clear();
742 updated(); 749 updated();
743} 750}
744 751
745bool Incidence::isAlarmEnabled() const 752bool Incidence::isAlarmEnabled() const
746{ 753{
747 Alarm* alarm; 754 Alarm* alarm;
748 for (QPtrListIterator<Alarm> it(mAlarms); (alarm = it.current()) != 0; ++it) { 755 for (QPtrListIterator<Alarm> it(mAlarms); (alarm = it.current()) != 0; ++it) {
749 if (alarm->enabled()) 756 if (alarm->enabled())
750 return true; 757 return true;
751 } 758 }
752 return false; 759 return false;
753} 760}
754#include <stdlib.h> 761#include <stdlib.h>
755Recurrence *Incidence::recurrence() 762Recurrence *Incidence::recurrence()
756{ 763{
757 if ( ! mRecurrence ) { 764 if ( ! mRecurrence ) {
758 mRecurrence = new Recurrence(this); 765 mRecurrence = new Recurrence(this);
759 mRecurrence->setRecurStart( dtStart() ); 766 mRecurrence->setRecurStart( dtStart() );
767 mRecurrence->setRecurReadOnly( isReadOnly());
760 //qDebug("creating new recurence "); 768 //qDebug("creating new recurence ");
761 //abort(); 769 //abort();
762 } 770 }
763 return mRecurrence; 771 return mRecurrence;
764} 772}
765void Incidence::setRecurrence( Recurrence * r) 773void Incidence::setRecurrence( Recurrence * r)
766{ 774{
767 if ( mRecurrence ) 775 if ( mRecurrence )
768 delete mRecurrence; 776 delete mRecurrence;
769 mRecurrence = r; 777 mRecurrence = r;
770} 778}
771 779
772void Incidence::setLocation(const QString &location) 780void Incidence::setLocation(const QString &location)
773{ 781{
774 if (mReadOnly) return; 782 if (mReadOnly) return;
775 mLocation = location; 783 mLocation = location;
776 updated(); 784 updated();
777} 785}
778 786
779QString Incidence::location() const 787QString Incidence::location() const
780{ 788{
781 return mLocation; 789 return mLocation;
782} 790}
783QString Incidence::recurrenceText() const 791QString Incidence::recurrenceText() const
784{ 792{
785 if ( mRecurrence ) return mRecurrence->recurrenceText(); 793 if ( mRecurrence ) return mRecurrence->recurrenceText();
786 return i18n("No"); 794 return i18n("No");
787} 795}
788 796
789ushort Incidence::doesRecur() const 797ushort Incidence::doesRecur() const
790{ 798{
791 if ( mRecurrence ) return mRecurrence->doesRecur(); 799 if ( mRecurrence ) return mRecurrence->doesRecur();
792 else return Recurrence::rNone; 800 else return Recurrence::rNone;
793} 801}
794 802
795QDateTime Incidence::getNextOccurence( const QDateTime& dt, bool* ok ) const 803QDateTime Incidence::getNextOccurence( const QDateTime& dt, bool* ok ) const
796{ 804{
797 QDateTime incidenceStart = dt; 805 QDateTime incidenceStart = dt;
798 *ok = false; 806 *ok = false;
799 if ( doesRecur() ) { 807 if ( doesRecur() ) {
800 bool last; 808 bool last;
801 mRecurrence->getPreviousDateTime( incidenceStart , &last ); 809 mRecurrence->getPreviousDateTime( incidenceStart , &last );
802 int count = 0; 810 int count = 0;
803 if ( !last ) { 811 if ( !last ) {
804 while ( !last ) { 812 while ( !last ) {
805 ++count; 813 ++count;
806 incidenceStart = mRecurrence->getNextDateTime( incidenceStart, &last ); 814 incidenceStart = mRecurrence->getNextDateTime( incidenceStart, &last );
807 if ( recursOn( incidenceStart.date() ) ) { 815 if ( recursOn( incidenceStart.date() ) ) {
808 last = true; // exit while llop 816 last = true; // exit while llop
809 } else { 817 } else {
810 if ( last ) { // no alarm on last recurrence 818 if ( last ) { // no alarm on last recurrence
811 return QDateTime (); 819 return QDateTime ();
812 } 820 }
813 int year = incidenceStart.date().year(); 821 int year = incidenceStart.date().year();
814 // workaround for bug in recurrence 822 // workaround for bug in recurrence
815 if ( count == 100 || year < 1000 || year > 5000 ) { 823 if ( count == 100 || year < 1000 || year > 5000 ) {
816 return QDateTime (); 824 return QDateTime ();
817 } 825 }
818 incidenceStart = incidenceStart.addSecs( 1 ); 826 incidenceStart = incidenceStart.addSecs( 1 );
819 } 827 }
820 } 828 }
821 } else { 829 } else {
822 return QDateTime (); 830 return QDateTime ();
823 } 831 }
824 } else { 832 } else {
825 if ( hasStartDate () ) { 833 if ( hasStartDate () ) {
826 incidenceStart = dtStart(); 834 incidenceStart = dtStart();
827 } 835 }
828 if ( typeID() == todoID ) { 836 if ( typeID() == todoID ) {
829 if ( ((Todo*)this)->hasDueDate() ) 837 if ( ((Todo*)this)->hasDueDate() )
830 incidenceStart = ((Todo*)this)->dtDue(); 838 incidenceStart = ((Todo*)this)->dtDue();
831 } 839 }
832 } 840 }
833 if ( incidenceStart > dt ) 841 if ( incidenceStart > dt )
834 *ok = true; 842 *ok = true;
835 return incidenceStart; 843 return incidenceStart;
836} 844}
837QDateTime Incidence::dtStart() const 845QDateTime Incidence::dtStart() const
838{ 846{
839 if ( doesRecur() ) { 847 if ( doesRecur() ) {
840 if ( typeID() == todoID ) { 848 if ( typeID() == todoID ) {
841 ((Todo*)this)->checkSetCompletedFalse(); 849 ((Todo*)this)->checkSetCompletedFalse();
842 } 850 }
843 } 851 }
844 return mDtStart; 852 return mDtStart;
845} 853}